0

xyz データ ファイルから配列を作成しようとしています。データ ファイルは、各原子の x、y、z が新しい行になるように配置されており、配列にこれを反映させたいと考えています。次に、この配列を使用して、リスト内の各原子から他のすべての原子までの距離を見つけます。

これを行うために、atom1 と atom2 が入力ファイルと同一になるように配列がコピーされています。

長さは単にリスト内のアトムの数です。書き込みステートメント: WRITE(20,'(3F12.9)') atom1 は実際に必要な行列を提供しますが、個々の要素を見つけようとすると、それらはすべて間違っています!

どんな助けでも本当に感謝します! みんなありがとう。

DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::atom1,atom2'
ALLOCATE(atom1(length,3),atom2(length,3))       
READ(10,*)  ((atom1(i,j), i=1,length), j=1,3)       
atom2=atom1                 
distn=0
distc=0                         

DO n=1,length
        x1=atom1(n,1)
        y1=atom1(n,2)               !1st atom
        z1=atom1(n,3)
        DO m=1,length
          x2=atom2(m,1)
          y2=atom2(m,2)         !2nd atom
          z2=atom2(m,3)`
4

1 に答える 1

0

あなたの READ ステートメントは、多くのレコードからすべての原子のすべての x 座標を読み取り、次にすべての y 座標、次にすべての z 座標を読み取ります。これは、入力ファイルの説明と矛盾しています。間違った方法で READ ステートメントに io-implied-do のネストがあります-そうあるべきです((atom1(i,j),j=1,3),i=1,length)

同様に、コメントによると、診断の書き込みは誤解を招きます-すべての x 座標を出力し、その後にすべての y 座標などを出力していました。配列参照全体の配列要素の順序は、最初の (左端の) 次元を最も速く変化させます (通称、列メジャーとして知られています)。注文)。

(リスト指向の書式設定にはさまざまな落とし穴があり、プロダクション コードにはお勧めしません (または、これらの落とし穴の知識と防御を備えて具体的に書かれた入力にはおそらくお勧めしません)。フォーマットは、入力リストを満たすために必要な数のレコードを取り込みます.レコードごとのフィールド数を指定する明示的なフォーマットを使用していた場合、問題を早期に発見した可能性があります.)

于 2013-01-18T04:02:43.017 に答える