diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index e9baccd68955ecb123621c5787b79c19106b88ed..956abcf442326b3bd84f202c1cb539661cc3c977 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1077,14 +1077,22 @@ END IF !* 3.5 Module MODD_DYN_n ! CALL GET_DIM_EXT_ll('Y',IIY,IJY) -IF (L2D) THEN - ALLOCATE(XBFY(IIY,IJY,IKU)) +IF ( CPRESOPT /= 'ZSOLV' ) THEN + IF (L2D) THEN + ALLOCATE(XBFY(IIY,IJY,IKU)) + ELSE + ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisation of the + ! FFT solver + END IF ELSE - ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisation of the - ! FFT solver + ALLOCATE(XBFY(0,0,0)) END IF + CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B) -ALLOCATE(XBFB(IIU_B,IJU_B,IKU)) +IF ( CPRESOPT == 'ZRESI' .OR. CPRESOPT == 'ZSOLV' ) THEN + ALLOCATE(XBFB(IIU_B,IJU_B,IKU)) +END IF + #ifdef MNH_MGSOLVER IF ( CPRESOPT == 'ZSOLV' ) THEN ALLOCATE(XAF_ZS(IIU_B,IJU_B,IKU)) @@ -1097,13 +1105,34 @@ IF ( CPRESOPT == 'ZSOLV' ) THEN ALLOCATE(XB_K(IKU)) ALLOCATE(XC_K(IKU)) ALLOCATE(XD_K(IKU)) +ELSE + ALLOCATE(XAF_ZS(0,0,0)) + ALLOCATE(XBF_ZS(0,0,0)) + ALLOCATE(XCF_ZS(0,0,0)) + ALLOCATE(XDXATH_ZS(0,0)) + ALLOCATE(XDYATH_ZS(0,0)) + ALLOCATE(XRHO_ZS(0,0,0)) + ALLOCATE(XA_K(0)) + ALLOCATE(XB_K(0)) + ALLOCATE(XC_K(0)) + ALLOCATE(XD_K(0)) END IF #endif -CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll) -ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)) -ALLOCATE(XAF(IKU),XCF(IKU)) -ALLOCATE(XTRIGSX(3*IIU_ll)) -ALLOCATE(XTRIGSY(3*IJU_ll)) +IF ( CPRESOPT == 'ZRESI' ) THEN + CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll) + ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)) +ELSE + ALLOCATE(XBF_SXP2_YP1_Z(0,0,0)) +END IF +IF ( CPRESOPT /= 'ZSOLV' ) THEN + ALLOCATE(XAF(IKU),XCF(IKU)) + ALLOCATE(XTRIGSX(3*IIU_ll)) + ALLOCATE(XTRIGSY(3*IJU_ll)) +ELSE + ALLOCATE(XAF(0),XCF(0)) + ALLOCATE(XTRIGSX(0)) + ALLOCATE(XTRIGSY(0)) +END IF ALLOCATE(XRHOM(IKU)) !$acc enter data create( XRHOM, XAF, XBFY, XCF, XTRIGSX, XTRIGSY, NIFAXX, NIFAXY, XBFB, XBF_SXP2_YP1_Z ) ALLOCATE(XALK(IKU)) @@ -2193,20 +2222,20 @@ IF ( KMI > 1) THEN DPTR_XLBXSVM=>XLBXSVM DPTR_XLBYSVM=>XLBYSVM IF (CCONF=='START') THEN - CALL INI_ONE_WAY_n(NDAD(KMI),KMI, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & - DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & - DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & - DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & - DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & - DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & - CCLOUD, LUSECHAQ, LUSECHIC, & - DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & - DPTR_XLBXTHM,DPTR_XLBYTHM, & - DPTR_XLBXTKEM,DPTR_XLBYTKEM, & - DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM ) + CALL INI_ONE_WAY_n(NDAD(KMI),KMI, & + DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & + DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & + NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & + DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & + DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & + DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & + DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & + DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & + CCLOUD, LUSECHAQ, LUSECHIC, & + DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & + DPTR_XLBXTHM,DPTR_XLBYTHM, & + DPTR_XLBXTKEM,DPTR_XLBYTKEM, & + DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM ) ENDIF END IF ! diff --git a/src/MNH/tridz.f90 b/src/MNH/tridz.f90 index 9125ca1c97a2b8578c38ca63ebb776fbc9bb93b6..93bf853351331290e8e11759d82db5d21abb16ba 100644 --- a/src/MNH/tridz.f90 +++ b/src/MNH/tridz.f90 @@ -552,10 +552,12 @@ IF ( HPRESOPT == 'ZSOLV' ) THEN C_K = 0.0 END IF #endif -DO JK = IKB,IKE - PAF(JK) = 0.5 * ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 - PCF(JK) = 0.5 * ( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1) **2 -END DO +IF ( HPRESOPT /= 'ZSOLV' ) THEN + DO JK = IKB,IKE + PAF(JK) = 0.5 * ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 + PCF(JK) = 0.5 * ( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1) **2 + END DO +END IF #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) THEN @@ -566,8 +568,8 @@ IF ( HPRESOPT == 'ZSOLV' ) THEN / ZDZM_ZS(IIB:IIE,IJB:IJE,JK+1) **2 D_K(JK) = PRHOM(JK) ! / ZDZM(JK) - B_K(JK) = PCF(JK) / D_K(JK) - C_K(JK) = PAF(JK) / D_K(JK) + B_K(JK) = ( 0.5 * ( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1) **2 ) / D_K(JK) + C_K(JK) = ( 0.5 * ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 ) / D_K(JK) END DO END IF #endif @@ -575,28 +577,32 @@ END IF ! at the upper and lower levels PAF and PCF are computed using the Neumann ! conditions applying on the vertical component of the gradient ! -PAF(IKE+1) = -0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 +IF ( HPRESOPT /= 'ZSOLV' ) THEN + PAF(IKE+1) = -0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1)**2 +END IF #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) THEN D_K(IKE+1) = PRHOM(IKE+1) ! / ZDZM(IKE+1) - C_K(IKE+1) = PAF(IKE+1) / D_K(IKE+1) + C_K(IKE+1) = ( -0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 ) / D_K(IKE+1) END IF #endif -PCF(IKB-1) = 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 +IF ( HPRESOPT /= 'ZSOLV' ) THEN + PCF(IKB-1) = 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB)**2 +END IF #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) THEN D_K(IKB-1) = PRHOM(IKB-1) ! / ZDZM(IKB-1) - B_K(IKB-1) = PCF(IKB-1) / D_K(IKB-1) + B_K(IKB-1) = ( 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB)**2 ) / D_K(IKB-1) END IF #endif ! -PAF(IKB-1) = 0.0 ! 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 +IF ( HPRESOPT /= 'ZSOLV' ) PAF(IKB-1) = 0.0 ! 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) C_K(IKB-1) = 0.0 #endif -PCF(IKE+1) = 0.0 ! 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 +IF ( HPRESOPT /= 'ZSOLV' ) PCF(IKE+1) = 0.0 ! 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) THEN B_K(IKE+1) = 0.0 @@ -715,11 +721,12 @@ DEALLOCATE(ZEIGENX_ll) !* 7.2 compute the matrix diagonal elements ! ! -PBFY = 1. -PBFB = 1. ! JUAN Z_SLIDE -PBF_SXP2_YP1_Z = 1. ! JUAN Z_SLIDE +IF ( HPRESOPT /= 'ZSOLV' ) PBFY = 1. +IF ( HPRESOPT == 'ZRESI' .OR. HPRESOPT == 'ZSOLV' ) PBFB = 1. ! JUAN Z_SLIDE +IF ( HPRESOPT == 'ZRESI' ) PBF_SXP2_YP1_Z = 1. ! JUAN Z_SLIDE ! IF (L2D) THEN + IF ( HPRESOPT /= 'ZSOLV' ) THEN DO JK= IKB,IKE DO JJ= 1, IYMODEY_ll DO JI= 1, IXMODEY_ll @@ -737,8 +744,10 @@ IF (L2D) THEN ! PBFY(1:IXMODEY_ll,1:IYMODEY_ll,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & ZDZM(IKE+1) **2 + END IF ! ELSE + IF ( HPRESOPT /= 'ZSOLV' ) THEN IF ( CSPLIT /= 'BSPLITTING' ) THEN !print*,"WARNING CSPLIT /= 'BSPLITTING =", CSPLIT DO JK= IKB,IKE @@ -759,6 +768,7 @@ ELSE PBFY(1:IYMODEY_ll,1:IXMODEY_ll,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & ZDZM(IKE+1) **2 END IF + END IF ! !JUAN Z_SPLITTING @@ -767,6 +777,7 @@ ELSE #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) PBF_ZS(:,:,:) = 1.0 #endif + IF ( HPRESOPT == 'ZRESI' .OR. HPRESOPT == 'ZSOLV' ) THEN DO JK= IKB,IKE DO JJ= IJB,IJE DO JI= IIB, IIE @@ -776,6 +787,7 @@ ELSE END DO END DO END DO + END IF #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) THEN DO JK= IKB,IKE @@ -792,9 +804,11 @@ ELSE ! at the upper and lower levels PBFB is computed using the Neumann ! condition ! + IF ( HPRESOPT == 'ZRESI' .OR. HPRESOPT == 'ZSOLV' ) THEN PBFB(IIB:IIE,IJB:IJE,IKB-1) = - 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 ! PBFB(IIB:IIE,IJB:IJE,IKE+1) = + 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 + END IF #ifdef MNH_MGSOLVER IF ( HPRESOPT == 'ZSOLV' ) THEN PBF_ZS(IIB:IIE,IJB:IJE,IKB-1) = - 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,IKB-1) + PRHO_ZS(IIB:IIE,IJB:IJE,IKB) ) & @@ -822,6 +836,7 @@ END IF !JUAN Z_SPLITTING !JUAN for Z splitting we need to do the vertical substitution !JUAN in _SXP2_YP1_Zsplitting slides so need PBF_SXP2_YP1_Z +IF ( HPRESOPT == 'ZRESI' ) THEN DO JK=IKB,IKE DO JJ= 1, IJU_SXP2_YP1_Z_ll DO JI= 1, IIU_SXP2_YP1_Z_ll @@ -842,12 +857,15 @@ END IF ! !JUAN Z_SPLITTING END IF +END IF ! ! second coefficent is meaningless in cyclic case +IF ( HPRESOPT /= 'ZSOLV' ) THEN IF (HLBCX(1) == 'CYCL' .AND. L2D .AND. SIZE(PBFY,1) .GE. 2 ) PBFY(2,:,:)=1. IF (HLBCX(1) == 'CYCL' .AND. .NOT.(L2D) .AND. LWEST_ll(HSPLITTING='Y') .AND. SIZE(PBFY,2) .GE.2 ) & PBFY(:,2,:)=1. IF (HLBCY(1) == 'CYCL' .AND. .NOT.(L2D) .AND. SIZE(PBFY,1) .GE. 2 ) PBFY(2,:,:)=1. +END IF !JUAN Z_SPLITTING ! second coefficent is meaningless in cyclic case !IF (HLBCX(1) == 'CYCL' .AND. L2D .AND. SIZE(PBFB,1) .GE. 2 ) PBFB(2,:,:)=1. @@ -862,6 +880,7 @@ DEALLOCATE(ZEIGEN_ll) !------------------------------------------------------------------------------ !* 8. INITIALIZATION OF THE TRIGS AND IFAX ARRAYS FOR THE FFT ! ------------------------------------------------------- +NOT_ZSOLV: IF ( HPRESOPT /= 'ZSOLV' ) THEN ! ! 8.1 x lateral boundary conditions ! @@ -936,6 +955,8 @@ IF (.NOT. L2D) THEN ENDIF ! ENDIF + +END IF NOT_ZSOLV ! !------------------------------------------------------------------------------ !