OpenMP参数扫描并行

时间:2017-07-14 16:46:30

标签: parallel-processing fortran openmp

我是OpenMP的新手。我想使用并行do循环为一系列参数值解决一个僵硬的ODE系统。我在下面给出了Fortran中的以下代码。但是,我不知道是否允许在并行do循环中调用一个刚性求解器(作为子程序)?另外,我想在返回主程序之前在子程序中将时间序列数据写入文件名为“r_value_s__value.txt”的文件中。谁能帮忙。下面是代码和错误。我使用带有标记gfortran的{​​{1}}进行编译。

-fopenmp
  

文件openmp_parallel_stiff.f90的第**行(单位= 3013)   Fortran运行时错误:文件已在另一个单元中打开

1 个答案:

答案 0 :(得分:0)

问题在于您选择的格式:f6.4的{​​{1}}会因r而溢出。然后,对于所有线程上的所有r>=10值,输出将是六个星号******(取决于编译器)。 r>=10也是如此。

我建议限制/检查这些值的范围或扩展格式以兑现更多数字。

正如@francescalus所提到的,另一种可能性是sII的组合,其中JJr是相同的。

只是为了它的乐趣 - 让我们做数学:

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

因此,只要这个组合一次适用于两个(或更多)线程,就会遇到观察到的问题。

此案例的简单解决方案:将线程编号添加到文件名中。