From b6dd5b9be68b799bc629e06d1e52413258ff989a Mon Sep 17 00:00:00 2001 From: Juan Escobar <escj@aero.obs-mip.fr> Date: Thu, 22 Nov 2018 14:41:26 +0100 Subject: [PATCH] Juan 22/11/2018: add modif for full *_ZS array without average on Z , not really working yet ! --- anel_balancen.f90 | 23 ++++++- ini_dynamics.f90 | 23 +++++-- ini_modeln.f90 | 12 +++- ini_spectren.f90 | 4 +- modd_dynn.f90 | 24 ++++++++ modeln.f90 | 6 +- pressurez.f90 | 23 +++++-- tridz.f90 | 97 +++++++++++++++++++++-------- zconjgrad.f90 | 6 +- zsolver.f90 | 28 +++++++-- zsolver_inv.f90 | 153 +++++++++++++++++++++++++++++++++++++++------- 11 files changed, 328 insertions(+), 71 deletions(-) diff --git a/anel_balancen.f90 b/anel_balancen.f90 index 6c64978f6..2d39a7aab 100644 --- a/anel_balancen.f90 +++ b/anel_balancen.f90 @@ -179,7 +179,10 @@ INTEGER :: IMI ! model index !JUAN INTEGER :: IIU_B,IJU_B,IKU INTEGER :: IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZBFB,ZBF_SXP2_YP1_Z +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZBFB,ZBF_SXP2_YP1_Z +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZAF_ZS,ZBF_ZS,ZCF_ZS +REAL, DIMENSION(:,:) , ALLOCATABLE :: ZDXATH_ZS,ZDYATH_ZS +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_ZS !JUAN ! INTEGER :: IINFO_ll @@ -202,8 +205,17 @@ ALLOCATE(ZTRIGSY(3*(NJMAX_ll+2*JPHEXT))) IKU=SIZE(XRHODJ,3) CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B) ALLOCATE(ZBFB(IIU_B,IJU_B,IKU)) +! +ALLOCATE(ZAF_ZS(IIU_B,IJU_B,IKU)) +ALLOCATE(ZBF_ZS(IIU_B,IJU_B,IKU)) +ALLOCATE(ZCF_ZS(IIU_B,IJU_B,IKU)) +ALLOCATE(ZDXATH_ZS(IIU_B,IJU_B)) +ALLOCATE(ZDYATH_ZS(IIU_B,IJU_B)) +ALLOCATE(ZRHO_ZS(IIU_B,IJU_B,IKU)) +! CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll) ALLOCATE(ZBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)) +! !JUAN Z_SPLITING CALL MPPDB_CHECK3D(XRHODJ,"anel_balancen1-::XRHODJ",PRECISION) CALL MPPDB_CHECK3D(XUT,"anel_balancen1-::XUT",PRECISION) @@ -216,7 +228,9 @@ CALL MPPDB_CHECK3D(XUT,"anel_balancen1-::XUT",PRECISION) ! CALL TRIDZ(CLBCX,CLBCY,XMAP,XDXHAT,XDYHAT,ZDXHATM,ZDYHATM,ZRHOM, & ZAF,ZCF,ZTRIGSX,ZTRIGSY,IIFAXX,IIFAXY,XRHODJ,XTHVREF,XZZ,ZBFY,& - ZBFB,ZBF_SXP2_YP1_Z) + ZBFB,ZBF_SXP2_YP1_Z, & + ZAF_ZS,ZBF_ZS,ZCF_ZS, & + ZDXATH_ZS,ZDYATH_ZS,ZRHO_ZS) !JUAN FULL ZSOLVER CALL MPPDB_CHECK3D(XRHODJ,"anel_balancen1-after TRIDZ::XRHODJ",PRECISION) ! !------------------------------------------------------------------------------- @@ -280,7 +294,10 @@ CALL PRESSUREZ(CLBCX,CLBCY,CPRESOPT,NITR,LITRADJ,ITCOUNT,XRELAX,IMI, & IRR,IRRL,IRRI,ZDRYMASST,ZREFMASS,ZMASS_O_PHI0, & ZTH,ZRR,XRHODREF,XTHVREF,XRVREF,XEXNREF, XLINMASS, & ZRU,ZRV,ZRW,ZPABST, & - ZBFB,ZBF_SXP2_YP1_Z,PRESIDUAL ) + ZBFB,ZBF_SXP2_YP1_Z, & + XAF_ZS,XBF_ZS,XCF_ZS, & + XDXATH_ZS,XDYATH_ZS,XRHO_ZS, & + PRESIDUAL ) ! CALL MPPDB_CHECK3D(XRHODJ,"anel_balancen3.2-after pressurez halo::XRHODJ",PRECISION) CALL MPPDB_CHECK3D(ZRU,"anel_balancen3.2-after pressurez::ZRU",PRECISION) diff --git a/ini_dynamics.f90 b/ini_dynamics.f90 index e4d00f5bb..4e2d0ff8c 100644 --- a/ini_dynamics.f90 +++ b/ini_dynamics.f90 @@ -26,8 +26,10 @@ SUBROUTINE INI_DYNAMICS(PLON,PLAT,PRHODJ,PTHVREF,PMAP,PZZ, & PALK,PALKW,KALBOT,PALKBAS,PALKWBAS,KALBAS, & OMASK_RELAX,PKURELAX, PKVRELAX, PKWRELAX, & PDK2U,PDK4U,PDK2TH,PDK4TH,PDK2SV,PDK4SV,OZDIFFU,PZDIFFU_HALO2,& - PBFB,& - PBF_SXP2_YP1_Z) !JUAN Z_SPLITING + PBFB, & + PBF_SXP2_YP1_Z, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) !JUAN FULL ZSOLVER ! intent in arguments ! USE MODE_TYPE_ZDIFFU @@ -172,6 +174,10 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFB ! elements of the tri-diag matrix ! on an b-slice of global physical domain REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBF_SXP2_YP1_Z ! elements of the tri-diag. SXP2_YP1_Z-slide ! matrix in the pressure eq. +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(OUT) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHO_ZS + END SUBROUTINE INI_DYNAMICS ! END INTERFACE @@ -197,8 +203,10 @@ SUBROUTINE INI_DYNAMICS(PLON,PLAT,PRHODJ,PTHVREF,PMAP,PZZ, & PALK,PALKW,KALBOT,PALKBAS,PALKWBAS,KALBAS, & OMASK_RELAX,PKURELAX, PKVRELAX, PKWRELAX, & PDK2U,PDK4U,PDK2TH,PDK4TH,PDK2SV,PDK4SV,OZDIFFU,PZDIFFU_HALO2,& - PBFB,& - PBF_SXP2_YP1_Z) !JUAN Z_SPLITING + PBFB, & + PBF_SXP2_YP1_Z, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) !JUAN FULL ZSOLVER ! ###################################################################### ! !!**** *INI_DYNAMICS* - routine to initialize the parameters for the dynamics @@ -440,6 +448,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFB ! elements of the tri-diag matrix ! on an b-slice of global physical domain REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBF_SXP2_YP1_Z ! elements of the tri-diag. SXP2_YP1_Z-slide ! matrix in the pressure eq. +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(OUT) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHO_ZS ! !* 0.2 declarations of local variables ! @@ -495,7 +506,9 @@ IF (.NOT.L1D) THEN PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM,PAF, & PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & PRHODJ,PTHVREF,PZZ,PBFY,PBFB, & - PBF_SXP2_YP1_Z) + PBF_SXP2_YP1_Z, & + PAF_ZS,PBF_ZS,PCF_ZS,& + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) !JUAN FULL ZSOLVER END IF ! ! diff --git a/ini_modeln.f90 b/ini_modeln.f90 index c16588e4a..4697cf476 100644 --- a/ini_modeln.f90 +++ b/ini_modeln.f90 @@ -899,6 +899,14 @@ ELSE END IF CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B) ALLOCATE(XBFB(IIU_B,IJU_B,IKU)) + +ALLOCATE(XAF_ZS(IIU_B,IJU_B,IKU)) +ALLOCATE(XBF_ZS(IIU_B,IJU_B,IKU)) +ALLOCATE(XCF_ZS(IIU_B,IJU_B,IKU)) +ALLOCATE(XDXATH_ZS(IIU_B,IJU_B)) +ALLOCATE(XDYATH_ZS(IIU_B,IJU_B)) +ALLOCATE(XRHO_ZS(IIU_B,IJU_B,IKU)) + 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)) @@ -1967,7 +1975,9 @@ CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & LMASK_RELAX,XKURELAX,XKVRELAX,XKWRELAX, & XDK2U,XDK4U,XDK2TH,XDK4TH,XDK2SV,XDK4SV, & LZDIFFU,XZDIFFU_HALO2, & - XBFB,XBF_SXP2_YP1_Z ) + XBFB,XBF_SXP2_YP1_Z, & + XAF_ZS,XBF_ZS,XCF_ZS, & + XDXATH_ZS,XDYATH_ZS,XRHO_ZS ) ! ! !* 16.1 Initialize the XDRAG array diff --git a/ini_spectren.f90 b/ini_spectren.f90 index d2564f410..ee95c73f5 100644 --- a/ini_spectren.f90 +++ b/ini_spectren.f90 @@ -938,7 +938,9 @@ CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & LMASK_RELAX,XKURELAX,XKVRELAX,XKWRELAX, & XDK2U,XDK4U,XDK2TH,XDK4TH,XDK2SV,XDK4SV, & LZDIFFU,XZDIFFU_HALO2, & - XBFB,XBF_SXP2_YP1_Z ) + XBFB,XBF_SXP2_YP1_Z, & + XAF_ZS,XBF_ZS,XCF_ZS, & + XDXATH_ZS,XDYATH_ZS,XRHO_ZS) ! !------------------------------------------------------------------------------- ! diff --git a/modd_dynn.f90 b/modd_dynn.f90 index c3b64335c..251e8cbd6 100644 --- a/modd_dynn.f90 +++ b/modd_dynn.f90 @@ -65,6 +65,9 @@ TYPE DYN_t REAL, DIMENSION(:,:,:), POINTER :: XBF_SXP2_YP1_Z=>NULL() ! Vectors giving the non REAL, DIMENSION(:,:,:), POINTER :: XBF=>NULL() ! vanishing elements of the REAL, DIMENSION(:), POINTER :: XAF=>NULL(),XCF=>NULL() ! tri-diag matrix in the pressure equation + REAL, DIMENSION(:,:,:), POINTER :: XAF_ZS=>NULL(),XBF_ZS=>NULL(),XCF_ZS=>NULL() ! coef for Zsolver + REAL, DIMENSION(:,:) , POINTER :: XDXATH_ZS=>NULL(),XDYATH_ZS=>NULL() + REAL, DIMENSION(:,:,:), POINTER :: XRHO_ZS=>NULL() ! ! Arrays of sinus or cosinus ! values for the FFT @@ -186,6 +189,9 @@ REAL, DIMENSION(:,:,:), POINTER :: XBFB=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XBF_SXP2_YP1_Z=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XBF=>NULL() REAL, DIMENSION(:), POINTER :: XAF=>NULL(),XCF=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XAF_ZS=>NULL(),XBF_ZS=>NULL(),XCF_ZS=>NULL() +REAL, DIMENSION(:,:) , POINTER :: XDXATH_ZS=>NULL(),XDYATH_ZS=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XRHO_ZS=>NULL() REAL, DIMENSION(:), POINTER :: XTRIGSX=>NULL() REAL, DIMENSION(:), POINTER :: XTRIGSY=>NULL() INTEGER, DIMENSION(:), POINTER :: NIFAXX=>NULL() @@ -268,6 +274,15 @@ DYN_MODEL(KFROM)%XBF_SXP2_YP1_Z=>XBF_SXP2_YP1_Z DYN_MODEL(KFROM)%XBF=>XBF DYN_MODEL(KFROM)%XAF=>XAF DYN_MODEL(KFROM)%XCF=>XCF + +DYN_MODEL(KFROM)%XAF_ZS=>XAF_ZS +DYN_MODEL(KFROM)%XBF_ZS=>XBF_ZS +DYN_MODEL(KFROM)%XCF_ZS=>XCF_ZS + +DYN_MODEL(KFROM)%XDXATH_ZS=>XDXATH_ZS +DYN_MODEL(KFROM)%XDYATH_ZS=>XDYATH_ZS +DYN_MODEL(KFROM)%XRHO_ZS=>XRHO_ZS + DYN_MODEL(KFROM)%XTRIGSX=>XTRIGSX DYN_MODEL(KFROM)%XTRIGSY=>XTRIGSY DYN_MODEL(KFROM)%XRHOM=>XRHOM @@ -289,6 +304,15 @@ XBF_SXP2_YP1_Z=>DYN_MODEL(KTO)%XBF_SXP2_YP1_Z XBF=>DYN_MODEL(KTO)%XBF XAF=>DYN_MODEL(KTO)%XAF XCF=>DYN_MODEL(KTO)%XCF + +XAF_ZS=>DYN_MODEL(KTO)%XAF_ZS +XBF_ZS=>DYN_MODEL(KTO)%XBF_ZS +XCF_ZS=>DYN_MODEL(KTO)%XCF_ZS + +XDXATH_ZS=>DYN_MODEL(KFROM)%XDXATH_ZS +XDYATH_ZS=>DYN_MODEL(KFROM)%XDYATH_ZS +XRHO_ZS=>DYN_MODEL(KFROM)%XRHO_ZS + XTRIGSX=>DYN_MODEL(KTO)%XTRIGSX XTRIGSY=>DYN_MODEL(KTO)%XTRIGSY NIFAXX=>DYN_MODEL(KTO)%NIFAXX diff --git a/modeln.f90 b/modeln.f90 index 6836f74fa..823724640 100644 --- a/modeln.f90 +++ b/modeln.f90 @@ -1671,8 +1671,10 @@ CALL MPPDB_CHECK3DM("before pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) NRR,NRRL,NRRI,XDRYMASST,XREFMASS,XMASS_O_PHI0, & XTHT,XRT,XRHODREF,XTHVREF,XRVREF,XEXNREF, XLINMASS, & XRUS, XRVS, XRWS, XPABST, & - XBFB,& - XBF_SXP2_YP1_Z) !JUAN Z_SPLITING + XBFB, & + XBF_SXP2_YP1_Z, & + XAF_ZS,XBF_ZS,XCF_ZS, & + XDXATH_ZS,XDYATH_ZS,XRHO_ZS) !JUAN FULL ZSOLVER ! XRUS_PRES = XRUS - XRUS_PRES + ZRUS XRVS_PRES = XRVS - XRVS_PRES + ZRVS diff --git a/pressurez.f90 b/pressurez.f90 index 7ef9fb3e7..12071e18c 100644 --- a/pressurez.f90 +++ b/pressurez.f90 @@ -18,7 +18,9 @@ INTERFACE PRUS,PRVS,PRWS,PPABST, & PBFB, & PBF_SXP2_YP1_Z, & - PRESIDUAL ) !JUAN Z_SPLITING + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS, & + PRESIDUAL) !JUAN FULL ZSOLVER ! IMPLICIT NONE ! @@ -96,6 +98,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PBFB ! elements of the tri-diag b-sl ! matrix in the pressure eq. REAL, DIMENSION(:,:,:), INTENT(IN) :: PBF_SXP2_YP1_Z ! elements of the tri-diag. SXP2_YP1_Z-slide ! matrix in the pressure eq. + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(IN) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO_ZS + REAL, OPTIONAL :: PRESIDUAL !JUAN Z_SPLITING END SUBROUTINE PRESSUREZ @@ -113,7 +120,9 @@ END MODULE MODI_PRESSUREZ PRUS,PRVS,PRWS,PPABST, & PBFB, & PBF_SXP2_YP1_Z, & - PRESIDUAL ) !JUAN Z_SPLITING + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS, & + PRESIDUAL) !JUAN FULL ZSOLVER ! ###################################################################### ! !!**** *PRESSUREZ * - solve the pressure equation and add the pressure term @@ -330,6 +339,10 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PBFB ! elements of the tri-diag b-sl ! matrix in the pressure eq. REAL, DIMENSION(:,:,:), INTENT(IN) :: PBF_SXP2_YP1_Z ! elements of the tri-diag. SXP2_YP1_Z-slide ! matrix in the pressure eq. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(IN) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO_ZS + REAL, OPTIONAL :: PRESIDUAL !JUAN Z_SPLITING ! @@ -513,8 +526,10 @@ ELSE ! CASE('ZSOLV') ! Conjugate Residual method CALL ZSOLVER(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOT,PAF,PBFB,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,ZDV_SOURCE,ZPHIT) + PDXHATM,PDYHATM,PRHOT,PAF,PBFB,PCF,PTRIGSX,PTRIGSY, & + KIFAXX,KIFAXY,KITR,ZDV_SOURCE,ZPHIT, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) ! CASE('ZRESI') ! Conjugate Residual method CALL CONRESOLZ(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & diff --git a/tridz.f90 b/tridz.f90 index b5e0161d4..8c27aaf58 100644 --- a/tridz.f90 +++ b/tridz.f90 @@ -12,8 +12,10 @@ INTERFACE SUBROUTINE TRIDZ(HLBCX,HLBCY, & PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM, & PAF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - PRHODJ,PTHVREF,PZZ,PBFY,PBFB,& - PBF_SXP2_YP1_Z)!JUAN Z_SPLITING + PRHODJ,PTHVREF,PZZ,PBFY,PBFB, & + PBF_SXP2_YP1_Z, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) !JUAN FULL ZSOLVER ! IMPLICIT NONE ! @@ -48,6 +50,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFB ! elements (bsplit slide) of the ! matrix in the pressure eq. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBF_SXP2_YP1_Z ! elements of the tri-diag. SXP2_YP1_Z-slide ! matrix in the pressure eq +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(OUT) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHO_ZS !JUAN ! ! arrays of sin or cos values @@ -71,8 +76,10 @@ END MODULE MODI_TRIDZ SUBROUTINE TRIDZ(HLBCX,HLBCY, & PMAP,PDXHAT,PDYHAT,PDXHATM,PDYHATM,PRHOM, & PAF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - PRHODJ,PTHVREF,PZZ,PBFY,PBFB,& - PBF_SXP2_YP1_Z) !JUAN Z_SPLITING + PRHODJ,PTHVREF,PZZ,PBFY,PBFB, & + PBF_SXP2_YP1_Z, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) !JUAN FULL ZSOLVER ! #################################################################### ! !!**** *TRIDZ * - Compute coefficients for the flat operator @@ -229,6 +236,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBFB ! elements (bsplit slide) of the ! matrix in the pressure eq. REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBF_SXP2_YP1_Z ! elements of the tri-diag. SXP2_YP1_Z-slide ! matrix in the pressure eq. +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(OUT) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHO_ZS !JUAN ! ! arrays of sin or cos values @@ -292,6 +302,7 @@ INTEGER :: IXMODE_SXP2_YP1_Z_ll,IYMODE_SXP2_YP1_Z_ll ! number of modes in the x !JUAN16 !TYPE(DOUBLE_DOUBLE) , DIMENSION (SIZE(PZZ,3)) :: ZRHOM_ll , ZDZM_ll REAL, ALLOCATABLE, DIMENSION(:,:) :: ZRHOM_2D , ZDZM_2D +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZDZM_ZS !JUAN16 ! ! @@ -362,63 +373,59 @@ ZGWNY = XPI/REAL(IJMAX_ll) ! ZINVMEAN = 1./REAL(IIMAX_ll*IJMAX_ll) !JUAN16 -ALLOCATE(ZRHOM_2D(IIB:IIE, IJB:IJE)) +ALLOCATE(ZRHOM_2D(IIB:IIE, IJB:IJE)) +PRHO_ZS = 1.0 ! DO JK = 1,SIZE(PZZ,3) IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN DO JJ = IJB,IJE DO JI = IIB,IIE - ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*XCPD*PTHVREF(JI,JJ,JK)*ZINVMEAN + ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*XCPD*PTHVREF(JI,JJ,JK) + PRHO_ZS(JI,JJ,JK) = ZRHOM_2D(JI,JJ) END DO END DO ELSEIF ( CEQNSYS == 'LHE' ) THEN DO JJ = IJB,IJE DO JI = IIB,IIE - ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK)*ZINVMEAN + ZRHOM_2D(JI,JJ) = PRHODJ(JI,JJ,JK) + PRHO_ZS(JI,JJ,JK) = ZRHOM_2D(JI,JJ) END DO END DO END IF ! global sum - PRHOM(JK) = SUM_DD_R2_ll(ZRHOM_2D) + PRHOM(JK) = SUM_DD_R2_ll(ZRHOM_2D) * ZINVMEAN END DO -! -! global sum -!CALL REDUCESUM_ll(ZRHOM_ll,IINFO_ll) -!PRHOM = ZRHOM_ll -!JUAN16 ! !------------------------------------------------------------------------------ ! !* 3. COMPUTE THE MEAN INCREMENT BETWEEN Z LEVELS ! ------------------------------------------- ! -!JUAN16 -!ZDZM_ll = 0. ALLOCATE(ZDZM_2D(IIB:IIE, IJB:IJE)) +ALLOCATE(ZDZM_ZS(IIB:IIE, IJB:IJE,IKU)) +ZDZM_ZS = 1.0 ! DO JK = IKB-1,IKE DO JJ = IJB,IJE DO JI = IIB,IIE - ZDZM_2D(JI,JJ) = (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK))*ZINVMEAN + ZDZM_2D(JI,JJ) = (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) + ZDZM_ZS(JI,JJ,JK) = ZDZM_2D(JI,JJ) END DO END DO - ZDZM(JK) = SUM_DD_R2_ll(ZDZM_2D) + ZDZM(JK) = SUM_DD_R2_ll(ZDZM_2D) * ZINVMEAN END DO ZDZM(IKE+1) = ZDZM(IKE) -! -! global sum -!CALL REDUCESUM_ll(ZDZM_ll,IINFO_ll) -!ZDZM = ZDZM_ll -!JUAN16 -! +ZDZM_ZS(:,:,IKE+1) = ZDZM_ZS(:,:,IKE) ! ! vertical average to arrive at a w-level DO JK = IKE+1,IKB,-1 ZDZM(JK) = (ZDZM(JK) + ZDZM(JK-1))*0.5 + ZDZM_ZS(IIB:IIE,IJB:IJE,JK) = (ZDZM_ZS(IIB:IIE,IJB:IJE,JK) + ZDZM_ZS(IIB:IIE,IJB:IJE,JK-1)) * 0.5 END DO ! ZDZM(IKB-1) = -999. +ZDZM_ZS(IIB:IIE,IJB:IJE,IKB-1) = -999. ! !------------------------------------------------------------------------------ ! @@ -428,7 +435,10 @@ ZDZM(IKB-1) = -999. PDXHATM =0. ! . local sum IF (LCARTESIAN) THEN - PDXHATM = SUM_1DFIELD_ll ( PDXHAT,'X',IIB_ll,IIE_ll,IINFO_ll) + PDXHATM = SUM_1DFIELD_ll ( PDXHAT,'X',IIB_ll,IIE_ll,IINFO_ll) + DO JJ=1,SIZE(PDXATH_ZS,2) + PDXATH_ZS(:,JJ) = PDXHAT(:) + END DO ELSE ! Extraction of x-slice PMAP at j=(IJB_ll+IJE_ll)/2 CALL GET_SLICE_ll (PMAP,'X',(IJB_ll+IJE_ll)/2,ZXMAP(IIB:IIE) & @@ -436,6 +446,9 @@ ELSE ! initialize the work array = PDXHAT/ZXMAP ZWORKX(IIB:IIE) = PDXHAT(IIB:IIE)/ ZXMAP (IIB:IIE) PDXHATM = SUM_1DFIELD_ll ( ZWORKX,'X',IIB_ll,IIE_ll,IINFO_ll) + DO JJ=1,SIZE(PDXATH_ZS,2) + PDXATH_ZS(:,JJ) = PDXHAT(:) / PMAP(:,JJ) + END DO END IF ! . division to complete sum PDXHATM = PDXHATM / REAL(IIMAX_ll) @@ -448,6 +461,9 @@ PDXHATM = PDXHATM / REAL(IIMAX_ll) PDYHATM = 0. IF (LCARTESIAN) THEN PDYHATM = SUM_1DFIELD_ll ( PDYHAT,'Y',IJB_ll,IJE_ll,IINFO_ll) + DO JI=1,SIZE(PDYATH_ZS,1) + PDYATH_ZS(JI,:) = PDYHAT(:) + END DO ELSE ! Extraction of y-slice PMAP at i=IIB_ll+IIE_ll/2 CALL GET_SLICE_ll (PMAP,'Y',(IIB_ll+IIE_ll)/2,ZYMAP(IJB:IJE) & @@ -455,6 +471,9 @@ ELSE ! initialize the work array = PDYHAT / ZYMAP ZWORKY(IJB:IJE) = PDYHAT(IJB:IJE) / ZYMAP (IJB:IJE) PDYHATM = SUM_1DFIELD_ll ( ZWORKY,'Y',IJB_ll,IJE_ll,IINFO_ll) + DO JI=1,SIZE(PDYATH_ZS,1) + PDYATH_ZS(JI,:) = PDYHAT(:) / PMAP(JI,:) + END DO END IF ! . division to complete sum PDYHATM= PDYHATM / REAL(IJMAX_ll) @@ -464,9 +483,16 @@ PDYHATM= PDYHATM / REAL(IJMAX_ll) !* 6. COMPUTE THE OUT-DIAGONAL ELEMENTS A AND C OF THE MATRIX ! ------------------------------------------------------- ! +PAF_ZS = 1.0 +PCF_ZS = 1.0 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 + + PAF_ZS(IIB:IIE,IJB:IJE,JK) = 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,JK-1) + PRHO_ZS(IIB:IIE,IJB:IJE,JK) ) & + / ZDZM_ZS(IIB:IIE,IJB:IJE,JK) **2 + PCF_ZS(IIB:IIE,IJB:IJE,JK) = 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,JK) + PRHO_ZS(IIB:IIE,IJB:IJE,JK+1) ) & + / ZDZM_ZS(IIB:IIE,IJB:IJE,JK+1) **2 END DO ! ! at the upper and lower levels PAF and PCF are computed using the Neumann @@ -477,6 +503,14 @@ PCF(IKB-1) = 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 ! PAF(IKB-1) = 0.0 ! 0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / ZDZM(IKB) **2 PCF(IKE+1) = 0.0 ! 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / ZDZM(IKE+1) **2 + +PAF_ZS(IIB:IIE,IJB:IJE,IKE+1) = -0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,IKE) + PRHO_ZS(IIB:IIE,IJB:IJE,IKE+1) ) & + / ZDZM_ZS(IIB:IIE,IJB:IJE,IKE+1) **2 +PCF_ZS(IIB:IIE,IJB:IJE,IKB-1) = 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,IKB-1) + PRHO_ZS(IIB:IIE,IJB:IJE,IKB) ) & + / ZDZM_ZS(IIB:IIE,IJB:IJE,IKB) **2 + +PAF_ZS(IIB:IIE,IJB:IJE,IKB-1) = 0.0 +PCF_ZS(IIB:IIE,IJB:IJE,IKE+1) = 0.0 !------------------------------------------------------------------------------ !* 7. COMPUTE THE DIAGONAL ELEMENTS B OF THE MATRIX ! --------------------------------------------- @@ -619,15 +653,22 @@ ELSE !JUAN Z_SPLITTING !JUAN for Z splitting we need to do the vertical substitution !JUAN in Bsplitting slides so need PBFB +PBF_ZS = 1.0 DO JK= IKB,IKE !!$ DO JJ= IJB-1,IJE+1 !!$ DO JI= IIB-1,IIE+1 !!$ PBFB(JI,JJ,JK) = PRHOM(JK)* ZEIGEN_ll(JI+IORXB_ll-IIB_ll,JJ+IORYB_ll-IJB_ll) - 0.5 * & DO JJ= IJB,IJE DO JI= IIB,IIE + PBFB(JI,JJ,JK) = PRHOM(JK)* ( -2.0 / PDXHATM**2 -2.0 /PDYHATM**2 ) - 0.5 * & - ( ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 & + ( ( PRHOM(JK-1) + PRHOM(JK) ) / ZDZM(JK) **2 & +( PRHOM(JK) + PRHOM(JK+1) ) / ZDZM(JK+1)**2 ) + + PBF_ZS(JI,JJ,JK) = PRHO_ZS(JI,JJ,JK)* ( -2.0 / PDXATH_ZS(JI,JJ)**2 -2.0 /PDYATH_ZS(JI,JJ)**2 ) - 0.5 * & + ( ( PRHO_ZS(JI,JJ,JK-1) + PRHO_ZS(JI,JJ,JK) ) / ZDZM_ZS(JI,JJ,JK) **2 & + +( PRHO_ZS(JI,JJ,JK) + PRHO_ZS(JI,JJ,JK+1) ) / ZDZM_ZS(JI,JJ,JK+1)**2 ) + END DO END DO END DO @@ -640,6 +681,12 @@ ELSE PBFB(IIB:IIE,IJB:IJE,IKE+1) = 0.5 * ( PRHOM(IKE) + PRHOM(IKE+1) ) / & ZDZM(IKE+1) **2 + 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) ) & + / ZDZM_ZS(IIB:IIE,IJB:IJE,IKB)**2 + + PBF_ZS(IIB:IIE,IJB:IJE,IKE+1) = 0.5 * ( PRHO_ZS(IIB:IIE,IJB:IJE,IKE) + PRHO_ZS(IIB:IIE,IJB:IJE,IKE+1) ) & + / ZDZM_ZS(IIB:IIE,IJB:IJE,IKE+1)**2 + !!$ PBFB(IIB-1:IIE+1,IJB-1:IJE+1,IKB-1) = -0.5 * ( PRHOM(IKB-1) + PRHOM(IKB) ) / & !!$ ZDZM(IKB) **2 !!$ ! diff --git a/zconjgrad.f90 b/zconjgrad.f90 index c3e977aae..35d82862f 100644 --- a/zconjgrad.f90 +++ b/zconjgrad.f90 @@ -242,7 +242,7 @@ DO JM = 1,KITR ! ZWORK = PY - ZWORK ! Y - Q (PHI) ! - CALL ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, &! -1 + CALL FLAT_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, &! -1 PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZWORK,ZDELTA) ! F (Y - Q (PHI))) ! !* 2.3 compute the auxiliary field P @@ -255,7 +255,7 @@ DO JM = 1,KITR ELSE ZWORK = QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY, & PDZZ,PRHODJ,PTHETAV,ZDELTA) ! Q ( DELTA ) - CALL ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & ! -1 + CALL FLAT_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & ! -1 PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZWORK,ZWORKD) ! F * Q ( DELTA ) ! ZALPHA = - DOTPROD(ZWORKD,ZWORKP,HLBCX,HLBCY)/ZDOTPP ! ZWORKP,ZDOTPP come @@ -269,7 +269,7 @@ DO JM = 1,KITR ! ZWORK = QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,& PDZZ,PRHODJ,PTHETAV,ZP) ! Q ( P ) - CALL ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,& ! -1 + CALL FLAT_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,& ! -1 PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZWORK,ZWORKP) ! F * Q ( P ) ! ! store the scalar product to compute lambda and next P diff --git a/zsolver.f90 b/zsolver.f90 index f218af070..943eff22d 100644 --- a/zsolver.f90 +++ b/zsolver.f90 @@ -15,8 +15,10 @@ INTERFACE ! SUBROUTINE ZSOLVER(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - KITR,PY,PPHI) + PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & + KITR,PY,PPHI, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) !JUAN FULL ZSOLVER ! IMPLICIT NONE ! @@ -61,6 +63,10 @@ INTEGER, INTENT(IN) :: KITR ! number of iterations for the REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! RHS of the equation ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPHI ! solution of the equation + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(IN) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO_ZS ! END SUBROUTINE ZSOLVER ! @@ -72,8 +78,10 @@ END MODULE MODI_ZSOLVER ! ! ######################################################################### SUBROUTINE ZSOLVER(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & - KITR,PY,PPHI) + PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY, & + KITR,PY,PPHI, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) ! ######################################################################### ! !!**** *CONRESOL * - solve an elliptic equation by the conjugate residual @@ -188,6 +196,10 @@ INTEGER, INTENT(IN) :: KITR ! number of iterations for the REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! RHS of the equation ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPHI ! solution of the equation + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(IN) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO_ZS ! !* 0.2 declarations of local variables ! @@ -217,7 +229,9 @@ ZRESIDUE = QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PPHI) - PY !* 1.2 compute the vector: p^(0) = F^(-1)*( Q(PHI) - Y ) ! CALL ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & - PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZRESIDUE,ZP) + PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZRESIDUE,ZP, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) ! !* 1.3 compute the vector: delta^(0) = Q ( p^(0) ) ! @@ -250,7 +264,9 @@ DO JM = 1,KITR !* 2.4 compute the vector: q = F^(-1)*( Q(PHI) - Y ) ! CALL ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & - PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZRESIDUE,ZQ) + PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZRESIDUE,ZQ, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) ! !* 2.5 compute the auxiliary field: ksi = Q ( q ) ! diff --git a/zsolver_inv.f90 b/zsolver_inv.f90 index f736a409c..ad850b8e5 100644 --- a/zsolver_inv.f90 +++ b/zsolver_inv.f90 @@ -15,7 +15,9 @@ INTERFACE ! SUBROUTINE ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & - PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PY,PF_1_Y) + PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PY,PF_1_Y, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) ! ! IMPLICIT NONE @@ -49,14 +51,21 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! RHS of the equation ! REAL, DIMENSION(:,:,:), INTENT(OUT):: PF_1_Y ! solution of the equation ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(IN) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO_ZS +! +! END SUBROUTINE ZSOLVER_INV ! END INTERFACE ! END MODULE MODI_ZSOLVER_INV ! ###################################################################### - SUBROUTINE ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & - PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PY,PF_1_Y) + SUBROUTINE ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & + PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PY,PF_1_Y, & + PAF_ZS,PBF_ZS,PCF_ZS, & + PDXATH_ZS,PDYATH_ZS,PRHO_ZS) ! ###################################################################### ! !!**** *FLAT_INV * - Invert the flat quasi-laplacian operator @@ -168,6 +177,10 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! RHS of the equation ! REAL, DIMENSION(:,:,:), INTENT(OUT):: PF_1_Y ! solution of the equation ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAF_ZS,PBF_ZS,PCF_ZS +REAL, DIMENSION(:,:) , INTENT(IN) :: PDXATH_ZS,PDYATH_ZS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO_ZS +! !* 0.2 declaration of local variables ! REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: ZY ! work array to store @@ -229,6 +242,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZBAND_YRT ! array in Y slices distributio ! INTEGER :: IIU,IJU REAL :: ZMEAN +INTEGER :: IT , NT = 1 !------------------------------------------------------------------------------- ! !* 1. COMPUTE LOOP BOUNDS @@ -346,21 +360,16 @@ IF (L2D) THEN CALL FAST_SUBSTITUTION_2D(ZBAND_YR,ZBETX,PBF,ZGAM,PCF,ZAF & ,ZBAND_Y,IIY,IJY,IKU) ELSE + CALL FAST_SUBSTITUTION_3D(PF_1_Y,ZBETX,PBF,ZGAM,PCF,PAF & ,ZY,IIU,IJU,IKU) -END IF -! ZY = 0.0 DO JK=IKB,IKE ZY(IIB:IIE,IJB:IJE,JK) = PAF(JK) * PF_1_Y(IIB:IIE,IJB:IJE,JK-1) & + ( PBF(IIB:IIE,IJB:IJE,JK) ) * PF_1_Y(IIB:IIE,IJB:IJE,JK) & + PCF(JK ) * PF_1_Y(IIB:IIE,IJB:IJE,JK+1) & - - PY(IIB:IIE,IJB:IJE,JK) - -!!$ - ( PAF(JK) + PCF(JK) ) * PF_1_Y(IIB:IIE,IJB:IJE,JK) & - - + - PY(IIB:IIE,IJB:IJE,JK) END DO ZY(IIB:IIE,IJB:IJE,IKB-1) = - ( + PCF(IKB-1) ) * PF_1_Y(IIB:IIE,IJB:IJE,IKB-1) & + PCF(IKB-1) * PF_1_Y(IIB:IIE,IJB:IJE,IKB) & @@ -370,9 +379,81 @@ ZY(IIB:IIE,IJB:IJE,IKE+1) = PAF(IKE+1) * PF_1_Y(IIB:IIE,IJB - ( PAF(IKE+1) ) * PF_1_Y(IIB:IIE,IJB:IJE,IKE+1) & - PY(IIB:IIE,IJB:IJE,IKE+1) -!!$ZMEAN = SUM( PF_1_Y(IIB:IIE,IJB:IJE,IKE+1)) / FLOAT ( (IIE-IIB)*(IJE-IJB) ) -!!$PF_1_Y(:,:,:) = PF_1_Y(:,:,:) - ZMEAN +ZDXM2 = PDXHATM*PDXHATM +ZDYM2 = PDYHATM*PDYHATM +DO JK=IKB,IKE + PF_1_Y(IIB-1,IJB:IJE,JK) = PF_1_Y(IIB,IJB:IJE,JK) - PY(IIB-1,IJB:IJE,JK)*ZDXM2/PRHOM(JK) + PF_1_Y(IIE+1,IJB:IJE,JK) = PF_1_Y(IIE,IJB:IJE,JK) + PY(IIE+1,IJB:IJE,JK)*ZDXM2/PRHOM(JK) + PF_1_Y(IIB:IIE,IJB-1,JK) = PF_1_Y(IIB:IIE,IJB,JK) - PY(IIB:IIE,IJB-1,JK)*ZDYM2/PRHOM(JK) + PF_1_Y(IIB:IIE,IJE+1,JK) = PF_1_Y(IIB:IIE,IJE,JK) + PY(IIB:IIE,IJE+1,JK)*ZDYM2/PRHOM(JK) + +END DO +PF_1_Y(IIB-1,IJB:IJE,IKE+1) = PF_1_Y(IIB,IJB:IJE,IKE+1) +PF_1_Y(IIE+1,IJB:IJE,IKB-1) = PF_1_Y(IIE,IJB:IJE,IKB-1) +PF_1_Y(IIE+1,IJB:IJE,IKE+1) = PF_1_Y(IIE,IJB:IJE,IKE+1) +PF_1_Y(IIB-1,IJB:IJE,IKB-1) = PF_1_Y(IIB,IJB:IJE,IKB-1) + +PF_1_Y(IIB:IIE,IJB-1,IKB-1) = PF_1_Y(IIB:IIE,IJB,IKB-1) +PF_1_Y(IIB:IIE,IJB-1,IKE+1) = PF_1_Y(IIB:IIE,IJB,IKE+1) +PF_1_Y(IIB:IIE,IJE+1,IKB-1) = PF_1_Y(IIB:IIE,IJE,IKB-1) +PF_1_Y(IIB:IIE,IJE+1,IKE+1) = PF_1_Y(IIB:IIE,IJE,IKE+1) + +ZY = 0.0 +DO JK=IKB,IKE + DO JJ=IJB,IJE + DO JI=IIB,IIE + ZY(JI,JJ,JK) = & +!!$ PAF(JK) * PF_1_Y(JI,JJ,JK-1) & +!!$ + ( PBF(JI,JJ,JK) ) * PF_1_Y(JI,JJ,JK) & +!!$ + PCF(JK ) * PF_1_Y(JI,JJ,JK+1) + & + PRHOM(JK)* ( ( PF_1_Y(JI+1,JJ,JK) + PF_1_Y(JI-1,JJ,JK) ) / (PDXHATM*PDXHATM) & + + ( PF_1_Y(JI,JJ+1,JK) + PF_1_Y(JI,JJ-1,JK) ) / (PDYHATM*PDYHATM) ) +!!$ - PY(JI,JJ,JK) + END DO + END DO +END DO +DO IT=1,NT +ZY = 0.0 +DO JK=IKB,IKE + DO JJ=IJB,IJE + DO JI=IIB,IIE + ZY(JI,JJ,JK) = ( PY(JI,JJ,JK) & + - PAF(JK) * PF_1_Y(JI,JJ,JK-1) & + - PCF(JK) * PF_1_Y(JI,JJ,JK+1) & + - PRHOM(JK)* ( ( PF_1_Y(JI+1,JJ,JK) + PF_1_Y(JI-1,JJ,JK) ) / (PDXHATM*PDXHATM) & + + ( PF_1_Y(JI,JJ+1,JK) + PF_1_Y(JI,JJ-1,JK) ) / (PDYHATM*PDYHATM) ) ) & + / PBF(JI,JJ,JK) + END DO + END DO +END DO + +PF_1_Y = ZY + +END DO + +!!$ +!!$ CALL FAST_SUBSTITUTION_3D_ZS(PF_1_Y(IIB:IIE,IJB:IJE,:),ZBETX,PBF_ZS(IIB:IIE,IJB:IJE,:),& +!!$ ZGAM,PCF_ZS(IIB:IIE,IJB:IJE,:),PAF_ZS(IIB:IIE,IJB:IJE,:)& +!!$ ,ZY(IIB:IIE,IJB:IJE,:),(IIE-IIB+1),(IJE-IJB+1),IKU) +!!$ +!!$ZY = 0.0 +!!$DO JK=IKB,IKE +!!$ ZY(IIB:IIE,IJB:IJE,JK) = PAF_ZS(IIB:IIE,IJB:IJE,JK) * PF_1_Y(IIB:IIE,IJB:IJE,JK-1) & +!!$ + ( PBF_ZS(IIB:IIE,IJB:IJE,JK) ) * PF_1_Y(IIB:IIE,IJB:IJE,JK) & +!!$ + PCF_ZS(IIB:IIE,IJB:IJE,JK ) * PF_1_Y(IIB:IIE,IJB:IJE,JK+1) & +!!$ - PY(IIB:IIE,IJB:IJE,JK) +!!$END DO +!!$ZY(IIB:IIE,IJB:IJE,IKB-1) = - ( + PCF_ZS(IIB:IIE,IJB:IJE,IKB-1) ) * PF_1_Y(IIB:IIE,IJB:IJE,IKB-1) & +!!$ + PCF_ZS(IIB:IIE,IJB:IJE,IKB-1) * PF_1_Y(IIB:IIE,IJB:IJE,IKB) & +!!$ - PY(IIB:IIE,IJB:IJE,IKB-1) +!!$ +!!$ZY(IIB:IIE,IJB:IJE,IKE+1) = PAF_ZS(IIB:IIE,IJB:IJE,IKE+1) * PF_1_Y(IIB:IIE,IJB:IJE,IKE) & +!!$ - ( PAF_ZS(IIB:IIE,IJB:IJE,IKE+1) ) * PF_1_Y(IIB:IIE,IJB:IJE,IKE+1) & +!!$ - PY(IIB:IIE,IJB:IJE,IKE+1) + +END IF +! ! !------------------------------------------------------------------------------- ! @@ -513,6 +594,45 @@ CALL GET_HALO(PF_1_Y) ! CONTAINS +SUBROUTINE FAST_SUBSTITUTION_3D_ZS(PBAND_YR,PBETX,PPBF,PGAM,PPCF,PAF & + ,PBAND_Y,KIY,KJY,KKU) +INTEGER :: KIY,KJY,KKU +REAL, DIMENSION (KIY*KJY,KKU) :: PBAND_YR,PBAND_Y,PPBF,PGAM +REAL, DIMENSION (KIY*KJY) :: PBETX +REAL, DIMENSION (KIY*KJY,KKU) :: PPCF,PAF +INTEGER :: JK +! +! +! initialization +! +! +PBAND_YR = 0.0 +PBETX(:) = PPBF(:,IKB-1) + +PBAND_YR(:,IKB-1) = PBAND_Y(:,IKB-1) & + / PBETX(:) +! +! decomposition and forward substitution +! +DO JK = IKB,IKE+1 + + PGAM(:,JK) = PPCF(:,JK-1) / PBETX(:) +! + PBETX(:) = PPBF(:,JK) - PAF(:,JK)*PGAM(:,JK) +! + PBAND_YR(:,JK) = ( PBAND_Y(:,JK) - PAF(:,JK)*PBAND_YR(:,JK- 1) ) /PBETX(:) +! +END DO +! +! backsubstitution +! +DO JK = IKE,IKB-1,-1 + PBAND_YR(:,JK) = PBAND_YR(:,JK) - & + PGAM(:,JK+1)*PBAND_YR(:,JK+1) +END DO +! +! +END SUBROUTINE FAST_SUBSTITUTION_3D_ZS SUBROUTINE FAST_SUBSTITUTION_3D(PBAND_YR,PBETX,PPBF,PGAM,PPCF,PAF & ,PBAND_Y,KIY,KJY,KKU) @@ -527,11 +647,7 @@ INTEGER :: JK ! ! PBAND_YR = 0.0 -!PAF(IKB-1) = 0.0 ! - PAF(IKB) ! 0.0 -!PPCF(IKE+1) = - PPCF(IKE) ! - PPCF(IKE) - PBETX(:) = PPBF(:,IKB-1) -!!$PBETX(:) = - ( PPCF(IKB-1) + PAF(IKB-1) ) PBAND_YR(:,IKB-1) = PBAND_Y(:,IKB-1) & / PBETX(:) @@ -541,15 +657,10 @@ PBAND_YR(:,IKB-1) = PBAND_Y(:,IKB-1) & DO JK = IKB,IKE+1 PGAM(:,JK) = PPCF(JK-1) / PBETX(:) - ! - PBETX(:) = PPBF(:,JK) - PAF(JK)*PGAM(:,JK) -!!$ PBETX(:) = - ( PPCF(JK) + PAF(JK) ) - PAF(JK)*PGAM(:,JK) ! - PBAND_YR(:,JK) = ( PBAND_Y(:,JK) - PAF(JK)*PBAND_YR(:,JK- 1) ) /PBETX(:) - ! END DO ! -- GitLab