回 帖 发 新 帖 刷新版面

主题:do循环加上openmp语句后,收敛性变差了,怎么回事?

我将peric程序修改成并行OpenMP并行程序,在Calcuv,Calcp函数中加OpenMP语句并行,能够减少计算时间,在Calcsc函数中加OpenMP语句并行,结果发现多迭代了1000多次,计算时间大大增加了,怎么回事?将程序前前后后看了几遍,也没找出减弱收敛性的原因,望高手解答。代码如下:
C############################################################# 
 SUBROUTINE CALCSC(K,IFI,FI,FIO,FIOO)
C#############################################################
C     This routine discretizes and solves the scalar transport
C     equations (temperature, turbulent kinetic energy, diss.).
C=============================================================
      use global_field
      use global_public
      
      DIMENSION FI(NXYA),FIO(NXYA),FIOO(NXYA)
C
C.....CALCULATE GRADIENTS OF FI
C
      CALL SETIND(K)
      CALL GRADFI(K,FI,DPX,DPY)
C
C.....INITIALIZE ARRAYS, SET BLENDING AND UNDER_RELAXATION COEFF.
C
      IJST=IJGR(K)+1
      IJEN=IJGR(K)+NIJ
C
      DO IJ=IJST,IJEN
        SU(IJ)=0.
        AP(IJ)=0.
      END DO
C
      GFI=GDS(IFI)
      URFFI=1./URF(IFI)
C
C.....CALCULATE FLUXES THROUGH INNER CV-FACES (EAST & NORTH)
C
[color=808000][color=000000][b]C$omp parallel do private(I,IJ)
      DO I=2,NIM-1
      DO IJ=LI(I+IST)+2,LI(I+IST)+NJM
        CALL FLUXSC(IFI,IJ,IJ+NJ,IJ,IJ-1,F1(IJ),AW(IJ+NJ),AE(IJ),
     *              FX(IJ),GFI,FI)
      END DO
      END DO
C$omp end parallel do [/b][/color][/color]
C
      DO I=2,NIM
      DO IJ=LI(I+IST)+2,LI(I+IST)+NJM-1
        CALL FLUXSC(IFI,IJ,IJ+1,IJ-NJ,IJ,F2(IJ),AS(IJ+1),AN(IJ),
     *              FY(IJ),GFI,FI)
      END DO
      END DO
C
C.....CONTRIBUTION FROM O- AND C-GRID CUTS
C
      DO I=IOCS(K)+1,IOCS(K)+NOC(K)
        IJP=IJL(I)
        IJN=IJR(I)
        CALL FLUXSC(IFI,IJP,IJN,IJOC1(I),IJOC2(I),FMOC(I),
     *              AL(I),AR(I),FOC(I),GFI,FI)
        AP(IJP)=AP(IJP)-AR(I)
        AP(IJN)=AP(IJN)-AL(I)
      END DO
C
C.....UNSTEADY TERM CONTRIBUTION
C
      IF(LTIME) THEN
        DO I=2,NIM
        DO IJ=LI(I+IST)+2,LI(I+IST)+NJM
          APT=DEN(IJ)*VOL(IJ)*DTR
          SU(IJ)=SU(IJ)+APT*((1.+GAMT)*FIO(IJ)-0.5*GAMT*FIOO(IJ))
          AP(IJ)= AP(IJ) +APT*(1.+0.5*GAMT)
        END DO
        END DO
      ENDIF
C
C.....INLET BOUNDARIES
C
      
      DO II=IIS(K)+1,IIS(K)+NINL(K)
        IJP=IJPI(II)
        IJB=IJI(II)
        DPX(IJB)=DPX(IJP)
        DPY(IJB)=DPY(IJP)
        CALL FLUXSC(IFI,IJP,IJB,IJI1(II),IJI2(II),FMI(II),CP,CB,
     *              ONE,ZERO,FI)
        AP(IJP)=AP(IJP)-CB
        SU(IJP)=SU(IJP)-CB*FI(IJB)
      END DO
     
C
C.....OUTLET BOUNDARIES
C
      
      DO IO=IOS(K)+1,IOS(K)+NOUT(K)
        IJP=IJPO(IO)
        IJB=IJO(IO)
        DPX(IJB)=DPX(IJP)
        DPY(IJB)=DPY(IJP)
        CALL FLUXSC(IFI,IJP,IJB,IJO1(IO),IJO2(IO),FMO(IO),CP,CB,
     *              ONE,ZERO,FI)
        AP(IJP)=AP(IJP)-CB
        SU(IJP)=SU(IJP)-CB*FI(IJB)
      END DO
     
C
C.....WALL BOUNDARY CONDITIONS AND SOURCES FOR TEMPERATURE
C
      IF(IFI.EQ.IEN) CALL TEMP(K)
C
C.....WALL BOUNDARY CONDITIONS AND SOURCES FOR TURBULENT KINETIC ENERGY
C
      IF(IFI.EQ.ITE) CALL KINE(K)
C
C.....WALL BOUNDARY CONDITIONS AND SOURCES FOR DISSIPATION RATE
C
      IF(IFI.EQ.IED) CALL DISE(K)
C      
C.....FINAL COEFFICIENT AND SOURCE MATRIX FOR FI-EQUATION
C
      DO I=2,NIM
      DO IJ=LI(I+IST)+2,LI(I+IST)+NJM
        AP(IJ)=(AP(IJ)-AE(IJ)-AW(IJ)-AN(IJ)-AS(IJ))*URFFI
        SU(IJ)=SU(IJ)+(1.-URF(IFI))*AP(IJ)*FI(IJ)
      END DO
      END DO
C
C.....SOLVING EQUATION SYSTEM FOR FI-EQUATION
C
      CALL SIPSOL(FI,IFI,K)
C
C.....SYMMETRY AND OUTLET BOUNDARIES
C
      DO IS=ISS(K)+1,ISS(K)+NSYM(K)
        FI(IJS(IS))=FI(IJPS(IS))
      END DO
C
      DO IO=IOS(K)+1,IOS(K)+NOUT(K)
        FI(IJO(IO))=FI(IJPO(IO))
      END DO
C
      RETURN
      END 
C
C

回复列表 (共5个回复)

沙发

你需要确认FLUXSC函数的在循环计算的前后没有依赖关系,不然,你把精度升到双精度试试

板凳

还是不行,我在64位的电脑上运行,发现竟然发散,不收敛了,不知何故?求解答

3 楼

如一楼所说, 你保证了FLUXSC的多次调用之间没有依赖关系? 如果有依赖关系不是调精度的问题,是本身就不能并行.

4 楼

问题已经解决,变量coef是一个common变量,是要设置为私有。以前一直没发现

5 楼


再在向你请教一个问题,强隐式迭代(SIP)的openmp流水线并行有什么特别吗?我做的时候前面几次(L=1~3)时,还和串行结果一致,后来就不一致了,偏差越来越大,以至于发散,请问什么原因?串并行结果不一致可以理解,导致最后并行发散就难以理解了。

      DO L=1,NSW(IFI)
        RESAB=0.
C      
C.....CALCULATE RESIDUAL VECTOR AND THE SUM OF ABSOLUTE VALUES
C
        DO I=2,NIM
        DO IJ=LI(I+IST)+2,LI(I+IST)+NJM
          RES(IJ)=SU(IJ)-AP(IJ)*FI(IJ)-AN(IJ)*FI(IJ+1)-
     *            AS(IJ)*FI(IJ-1)-AE(IJ)*FI(IJ+NJ)-AW(IJ)*FI(IJ-NJ)
        END DO
        END DO
C
        DO I=IOCS(K)+1,IOCS(K)+NOC(K)
          RES(IJL(I))=RES(IJL(I))-AR(I)*FI(IJR(I))
          RES(IJR(I))=RES(IJR(I))-AL(I)*FI(IJL(I))
        END DO
C
C.....FORWARD SUBSTITUTION
C
[color=FF0000]        omp_sync1=0
        omp_counter1=1  !用于第一个流水线
C$omp parallel private(omp_cur_thread)
        omp_cur_thread=omp_get_thread_num()
        omp_sync1(omp_cur_thread)=0
        
        if(omp_cur_thread>0)then
          do
C$omp flush(omp_sync1)
             if(omp_sync1(omp_cur_thread-1)>=omp_counter1)exit
          end do
C$omp flush(RES,omp_sync1)          
        end if     
        
        DO I=2,NIM
C$omp do private(IJ) reduction(+:RESAB)        
        DO IJ=LI(I+IST)+2,LI(I+IST)+NJM
          RESAB=RESAB+ABS(RES(IJ))
          RES(IJ)=(RES(IJ)-LS(IJ)*RES(IJ-1)-LW(IJ)*RES(IJ-NJ))*LPR(IJ)
        END DO
C$omp end do nowait
         omp_sync1(omp_cur_thread)=omp_sync1(omp_cur_thread)+1
C$omp flush(RES,omp_sync1)          
        END DO 
C$omp end parallel     
C [/color] 
        IF(L.EQ.1) RESOR(IFI)=RESAB
        RSM=RESAB/(RESOR(IFI)+SMALL)
C
C.....BACKWARD SUBSTITUTION AND CORRECTION OF VARIABLE
C
        DO I=NIM,2,-1
        DO IJ=LI(I+IST)+NJM,LI(I+IST)+2,-1
          RES(IJ)=RES(IJ)-UN(IJ)*RES(IJ+1)-UE(IJ)*RES(IJ+NJ)
          FI(IJ)=FI(IJ)+RES(IJ)
        END DO
        END DO
C
C.....CHECK CONVERGENCE OF INNER ITERATIONS
C
        IF(LTEST) WRITE(2,*)L,' INNER ITER, RESAB= ',RESAB
        IF(RSM.LT.SOR(IFI)) RETURN
C
      END DO

我来回复

您尚未登录,请登录后再回复。点此登录或注册