我有一个MPI代码,我必须循环遍历矩阵。 数据表示3D域,但它保存在一维数组中。分解以下列方式完成:
假设dims = (/2,2,1/)
。
I
,,J
,K
方向的数据点数量:
NI = 10
,NJ=10
,NK=10
。然后,分解将仅在I
和J
方向上平均分割域:
第一个域名:
NI = 5 + 2
(来自邻居的2个额外单元格用于边界信息)
NJ = 5 + 2
(此处相同)
第二个域名:
NI = 2 + 5
(现在额外的边界单元格位于代表属于该域的数据的5个数据点之前)
NJ = 2 + 5
现在循环:
U_loop_K : DO K=SK_P,EK_P
LKK=LK_P(K)
U_loop_I : DO I=SI_P,EI_P
LIK=LKK+LI_P(I)
U_loop_J : DO J=SJ_P,EJ_P
INP=LIK+J
AP(INP)=AE(INP)+AW(INP)+AN(INP)+AS(INP)+AT(INP)+AB(INP)+AP(INP)
AP(INP)=AP(INP)*URFRS
SU(INP)=SU(INP)+URFMS*AP(INP)*U(INP)
APU(INP)=1./(AP(INP)+SMALL)
END DO U_loop_J
END DO U_loop_I
END DO U_loop_K
我正在进行多方向域分解。 SK_P
和EK_P
分别是K
方向的起始和结束索引。 I
和J
以类似的方式完成。
如果我分解数据并执行此代码,则APU
变量中将出现一个小错误,并且只会出现该错误。
这是怎么发生的?是否有一个舍入错误我不知道哪个因拆分do-loops而改变了?
我已经检查了'输入数组'的值,可以这么说(AE
,AW
等等),无论是否有MPI,它们都完全相同。使用除法时,第一个也是唯一的差异开始存在:APU(INP)=1./(AP(INP)+SMALL)
。
变量都是real
类型。