我是OpenMP的新手。我想使用并行do循环为一系列参数值解决一个僵硬的ODE系统。我在下面给出了Fortran中的以下代码。但是,我不知道是否允许在并行do循环中调用一个刚性求解器(作为子程序)?另外,我想在返回主程序之前在子程序中将时间序列数据写入文件名为“r_value_s__value.txt”的文件中。谁能帮忙。下面是代码和错误。我使用带有标记gfortran
的{{1}}进行编译。
-fopenmp
文件openmp_parallel_stiff.f90的第**行(单位= 3013) Fortran运行时错误:文件已在另一个单元中打开
答案 0 :(得分:0)
问题在于您选择的格式:f6.4
的{{1}}会因r
而溢出。然后,对于所有线程上的所有r>=10
值,输出将是六个星号******
(取决于编译器)。 r>=10
也是如此。
我建议限制/检查这些值的范围或扩展格式以兑现更多数字。
正如@francescalus所提到的,另一种可能性是s
和II
的组合,其中JJ
和r
是相同的。
只是为了它的乐趣 - 让我们做数学:
s
从r=(II-1)*dr
s=s0+JJ*ds
跟随
r=s
或
(II-1)*dr = s0+JJ*ds
使用常量II = 1 + s0/dr + JJ*ds/dr
得出
s0=0.450D0, dr=1.0D-4, ds=1.0D-2
因此,只要这个组合一次适用于两个(或更多)线程,就会遇到观察到的问题。
此案例的简单解决方案:将线程编号添加到文件名中。