私は何千もの倍精度実数を持つグリッドを持っています。効率的な収束チェック
小数点以下3桁まで収束したら中止する必要があります。
ターゲットは可能な限り高速に実行されますが、毎回同じ結果(毎回3 dp)を与える必要があります。私はIF、多くのステートメントは、パフォーマンスのためにあまりにも素晴らしいことではないことを考えています。この
REAL(KIND=DP) :: TOL = 0.001_DP
DO WHILE(.NOT. CONVERGED)
CONVERGED = .TRUE.
DO I = 1, NUM_POINTS
NEW POTENTIAL = !blah blah blah
IF (CONVERGED) THEN
IF (NEW_POTENTIAL < OLD_POTENTIAL - TOL .OR. NEW_POTENTIAL > OLD_POTENTIAL + TOL) THEN
CONVERGED = .FALSE.
END IF
END IF
OLD_POTENTIAL = NEW POTENTIAL
END DO
END DO
のようなものをやっている分で
。私は最後に収束を確認することを考えました。 (グリッド全体を合計し、num_pointsで割る)平均値を求め、それが上記と同じ方法で収束しているかどうかを確認しますが、これは常に正確であると確信していません。
これを行う最善の方法は何ですか?
より良いまあ、私はあなたのアドバイス#3に反対します。はい、場合によっては、リテラルがデフォルトの種類で正確に表現できる場合、リテラルの種類を指定することは冗長です。しかし、特定のリテラルが正確に表現可能かどうかを心配するのではなく、常にそれを必ず指定する方が簡単です。 – janneb
私は過去に_DPをやっていなかったので、今は習慣でやっています! –
私は私が少し間違っていると思うので、あなたが作る最初の点は実際には適用されません(実際には1つのグリッドしかありません、NEW_POTENTIALは1つの変数です、OLD_POTENTIALは配列です)。 OLD_POTENTIALの1つのポイントのみを更新する必要があります –