当我使用abaqus子程序读取多个处理器(cpus)的文件时,我遇到了一个错误,你能不能帮我处理这个错误。非常感谢
我想从文件中读取变量,当使用一个cpu时,一切正常, 但是当使用多个cpu时会出现错误,似乎每个cpu都重复相同的命令。
例如,以下是要读取的文件的内容,文件名是data.dat
* matID,2,1
131000.000,8880.000,8180.000
0.324, 0.324, 0.300
3990.000, 5320.000, 5320.000
1871.000, 59.700, 59.700
1291.000, 215.000, 215.000
90.000, 102.000, 102.000
我的子程序如下所示:
字符* 12 check1
整数check2,错误
OPEN(10,文件=' data.dat文件',状态='旧',的iostat =错误)
if(error.EQ.0)然后
读(10,*,iostat =错误)check1,Nm
结束如果
关闭(10)
打印*,' Nm =',nm,错误
打印*,' **'
当我使用2 cpus时,打印结果将是:
Nm = 2 0
Nm = 8880 0
**
**
答案 0 :(得分:1)
根据从文件中读取数据的原因,有几种方法可以避免此问题:
如果您只需要访问一次数据: 读入始终以串行方式调用的子例程中的数据。 UEXTERNALDB是一个很好的示例,可以使用,以便文件打开仅在分析开始时或根据需要开始增量时发生。然后,您可以将信息小心地存储在公共块中。并行读取公共块应该可以正常工作,但不要从并行子例程写入它们。
获取较少量数据的另一种方法是在输入文件中定义解决方案变量。
如果你真的需要在每个并行线程中本地打开这个文件(看不出原因但是可以打开更正),你可以使用GETNUMCPUS和GETRANK在每个文件中打开不同的文件副本线。 GETRANK返回一个整数,给出进程的等级/ ID。我会建议反对这种方法。如果您的问题足够大以保证使用并行,那么您应该避免使用文件读取减慢速度。
有关详细信息,请参阅Abaqus 6.14文档的1.1.31和2.1.4节。