MPI Fortran运营秩序(部门)

时间:2018-04-20 09:40:41

标签: fortran mpi

我有一个MPI代码,我必须循环遍历矩阵。 数据表示3D域,但它保存在一维数组中。分解以下列方式完成:

假设dims = (/2,2,1/)I,JK方向的数据点数量: NI = 10NJ=10NK=10。然后,分解将仅在IJ方向上平均分割域: 第一个域名:

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_PEK_P分别是K方向的起始和结束索引。 IJ以类似的方式完成。 如果我分解数据并执行此代码,则APU变量中将出现一个小错误,并且只会出现该错误。 这是怎么发生的?是否有一个舍入错误我不知道哪个因拆分do-loops而改变了?

我已经检查了'输入数组'的值,可以这么说(AEAW等等),无论是否有MPI,它们都完全相同。使用除法时,第一个也是唯一的差异开始存在:APU(INP)=1./(AP(INP)+SMALL)

变量都是real类型。

0 个答案:

没有答案