以下は、入門的な研究作業のために今週末に作成した 1D ハイドロ コード (変数 p と q を展開するための Strang 分割によるハミルトニアン法を使用) からのものです。
do
if(num==1) then
p2 = p(i) - (dt/2.)*q(i)/abs(q(i)) ! half step in P
q(i) = q(i) + dt*p2 ! full step in Q
p(i) = p2 - (dt/2.)*q(i)/abs(q(i)) ! half step in P
num=2
elseif(num==2) then
q2 = q(i) + (dt/2.)*p(i) ! half step in Q
p(i) = p(i) - dt*q2/abs(q2) ! full step in P
q(i) = q(i) + (dt/2.)*p(i) ! half step in Q
num=1
endif
t = t+dt
if(t >= tend) exit
enddo
ここにあるものよりも、2 つのアルゴリズム (スプリアス データを減らすために必要) を切り替える効率的な方法はありますか? 重要な場合、p と q にはそれぞれ約 100,000 個のセルがあります (コードは並列化されています)。
編集:do
コードの部分だけではなく、ループ部分を追加しましたif-elseif
。の後にファイルへの書き込み部分もありますがendif
、潜在的な最適化には必要ないと思います。