diff --git a/MNH/contrav.f90 b/MNH/contrav.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1a8dad3f09bae7332b8bf9b1dd796b9234f93917 --- /dev/null +++ b/MNH/contrav.f90 @@ -0,0 +1,183 @@ +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/contrav.f90,v $ $Revision: 1.1.10.1 $ +! MASDEV4_7 operators 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! #################### + MODULE MODI_CONTRAV +! #################### +! +INTERFACE +! + SUBROUTINE CONTRAV(PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & + PRUCT,PRVCT,PRWCT ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUT ! Cartesian comp along x +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Cartesian comp along y +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWT ! Cartesian comp along z +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRVCT ! Contrav comp along y-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWCT ! Contrav comp along z-bar +! +END SUBROUTINE CONTRAV +! +END INTERFACE +! +END MODULE MODI_CONTRAV +! +! +! +! ############################################################## + SUBROUTINE CONTRAV(PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & + PRUCT,PRVCT,PRWCT ) +! ############################################################## +! +!!**** *CONTRAV * - computes the contravariant components from the +!! cartesian components +!! +!! PURPOSE +!! ------- +! This routine computes the contravariant components of vector +! defined by its cartesian components (U,V,W) , using the following +! formulae: +! UC = U / DXX +! VC = V / DYY +! ( ----------x ----------y ) +! ( ---z ---z ) +! 1 ( U V ) +! WC = --- ( W - DZX * --- - DZY * --- ) +! DZZ ( DXX DYY ) +! +! +! In the no-topography case, WC = W / DZZ +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the averages. The metric +!! coefficients PDXX, PDYY, PDZX, PDZY, PDZZ are dummy arguments +!! +!! +!! EXTERNAL +!! -------- +!! MXF, MYF, MZM : Shuman functions (mean operators) +!! +!! Module MODI_SHUMAN : Interface for Shuman functions +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CONF : contains configuration variable +!! LFLAT : Logical for topography +!! = .TRUE. if Zs = 0 (Flat terrain) +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (subroutine CONTRAV) +!! +!! +!! AUTHOR +!! ------ +!! J.L. Redelsperger * CNRM * +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/07/94 +!! Corrections 3/08/94 (by J.P. Lafore) +!! Corrections 17/10/94 (by J.P. Lafore) WC modified for w-advection +!---------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CONF +USE MODD_PARAMETERS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUT ! Cartesian comp along x +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Cartesian comp along y +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWT ! Cartesian comp along z +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRVCT ! Contrav comp along y-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWCT ! Contrav comp along z-bar +! +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PDXX,1),SIZE(PDXX,2),SIZE(PDXX,3)):: Z1,Z2 +INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE +! +!----------------------------------------------------------------------- +! +!* 1. Compute the contravariant components +! ------------------------------------ +! +IIB=2 +IJB=2 +IIE=SIZE(PDXX,1)-1 +IJE=SIZE(PDXX,2)-1 +! +IKB=1+JPVEXT +IKE=SIZE(PDXX,3) - JPVEXT +! +!$acc data region copyin (pdxx,pdyy,pdzz,pdzx,pdzy,prut,prvt,prwt) local (z1,z2) +!$acc region copyout (PRUCT,PRVCT,prwct) +PRUCT(:,:,:) = PRUT(:,:,:) / PDXX(:,:,:) +PRVCT(:,:,:) = PRVT(:,:,:) / PDYY(:,:,:) + +IF (LFLAT) THEN + + PRWCT(:,:,:) = PRWT(:,:,:) / PDZZ(:,:,:) + +ELSE + + Z1(IIB:IIE,:,IKB:IKE+1)= & + (PRUCT(IIB:IIE,:,IKB:IKE+1)+PRUCT(IIB:IIE,:,IKB-1:IKE) ) & + *PDZX(IIB:IIE,:,IKB:IKE+1) *0.25 & + +(PRUCT(IIB+1:IIE+1,:,IKB:IKE+1)+PRUCT(IIB+1:IIE+1,:,IKB-1:IKE) ) & + *PDZX(IIB+1:IIE+1,:,IKB:IKE+1) *0.25 + + Z2(:,IJB:IJE,IKB:IKE+1)= & + (PRVCT(:,IJB:IJE,IKB:IKE+1)+PRVCT(:,IJB:IJE,IKB-1:IKE) ) & + *PDZY(:,IJB:IJE,IKB:IKE+1) *0.25 & + +(PRVCT(:,IJB+1:IJE+1,IKB:IKE+1)+PRVCT(:,IJB+1:IJE+1,IKB-1:IKE) ) & + *PDZY(:,IJB+1:IJE+1,IKB:IKE+1) *0.25 + + PRWCT=0. + PRWCT(IIB:IIE,IJB:IJE,IKB:IKE+1) = & + ( PRWT(IIB:IIE,IJB:IJE,IKB:IKE+1) & + - Z1(IIB:IIE,IJB:IJE,IKB:IKE+1) & + - Z2(IIB:IIE,IJB:IJE,IKB:IKE+1) & + ) / PDZZ(IIB:IIE,IJB:IJE,IKB:IKE+1) + +END IF +! + +PRWCT(:,:,1) = - PRWCT(:,:,3) ! Mirror hypothesis + +!$acc end region +!$acc end data region +! +!----------------------------------------------------------------------- +! +END SUBROUTINE CONTRAV diff --git a/MNH/get_halo.f90 b/MNH/get_halo.f90 index 2a2ccc43d7a0f7cfb2d1b530d2a7a57863f2c2db..31502d53a8b04e191ca0c79e5f6ddc5ade799b07 100644 --- a/MNH/get_halo.f90 +++ b/MNH/get_halo.f90 @@ -1,7 +1,7 @@ !----------------------------------------------------------------- !--------------- special set of characters for RCS information !----------------------------------------------------------------- -! $Source$ $Revision$ +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/Attic/get_halo.f90,v $ $Revision: 1.1.2.1.2.2 $ ! MASDEV4_7 newsrc 2007/03/01 13:18:33 !----------------------------------------------------------------- ! #################### @@ -87,9 +87,20 @@ INTEGER :: IERROR ! error return code ! NULLIFY( TZ_PSRC_ll) ! +! acc update host (PSRC( IIB:IIE , IJB :IJB+JPHEXT , : )) +! acc update host (PSRC( IIB:IIE , IJE-JPHEXT :IJE , : )) +! acc update host (PSRC( IIB:IIB+JPHEXT , IJB+JPHEXT+1:IJE-JPHEXT-1 , : )) +! acc update host (PSRC( IIE-JPHEXT:IIE , IJB+JPHEXT+1:IJE-JPHEXT-1 , : )) + CALL ADD3DFIELD_ll(TZ_PSRC_ll,PSRC) CALL UPDATE_HALO_ll(TZ_PSRC_ll,IERROR, HDIR=HDIR ) CALL CLEANLIST_ll(TZ_PSRC_ll) + +! acc update device (PSRC( IIB:IIE , : IJB-1 , : )) +! acc update device (PSRC( IIB:IIE , IJE+1: , : )) +! acc update device (PSRC( :IIB-1 , IJB :IJE , : )) +! acc update device (PSRC( IIE+1: , IJB :IJE , : )) + ! END SUBROUTINE GET_HALO !----------------------------------------------------------------------- diff --git a/MNH/gradient_m.f90 b/MNH/gradient_m.f90 new file mode 100644 index 0000000000000000000000000000000000000000..59c0b435b1f12b49783eecdda2e206a27266cec9 --- /dev/null +++ b/MNH/gradient_m.f90 @@ -0,0 +1,743 @@ +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/gradient_m.f90,v $ $Revision: 1.1.10.1 $ +! MASDEV4_7 operators 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ###################### + MODULE MODI_GRADIENT_M +! ###################### +! +INTERFACE +! +! +FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point +! +END FUNCTION GX_M_M +! +! +FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point +! +END FUNCTION GY_M_M +! +! +FUNCTION GZ_M_M(PA,PDZZ) RESULT(PGZ_M_M) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point +! +END FUNCTION GZ_M_M +! + FUNCTION GX_M_U(PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) +! +IMPLICIT NONE +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux + ! side +END FUNCTION GX_M_U +! +! + FUNCTION GY_M_V(PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) +! +IMPLICIT NONE +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY !d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY !d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux + ! side +END FUNCTION GY_M_V +! + FUNCTION GZ_M_W(PY,PDZZ) RESULT(PGZ_M_W) +! +IMPLICIT NONE +! + ! Metric coefficient: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W ! result at flux + ! side +! +END FUNCTION GZ_M_W +! +END INTERFACE +! +END MODULE MODI_GRADIENT_M +! +! +! +! ####################################################### + FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX) RESULT(PGX_M_M) +! ####################################################### +! +!!**** *GX_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___x ) ) +! 1 ( _x (d*zx dzm(PA) ) ) +! PGX_M_M = ---- (dxf(PA) - (------------)) ) +! ___x ( ( ) ) +! d*xx ( ( d*zz ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MXF,MZF : Shuman functions (mean operators) +!! DXF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!! 19/07/00 add the LFLAT switch (J. Stein) +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_M_M +! -------------------- +! +IF (.NOT. LFLAT) THEN + PGX_M_M(:,:,:)= (DXF(MXM(PA(:,:,:))) - & + MZF(MXF(PDZX)*DZM(PA(:,:,:))/PDZZ(:,:,:)) ) & + /MXF(PDXX(:,:,:)) +ELSE + PGX_M_M(:,:,:)=DXF(MXM(PA(:,:,:))) / MXF(PDXX(:,:,:)) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GX_M_M +! +! +! ####################################################### + FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY) RESULT(PGY_M_M) +! ####################################################### +! +!!**** *GY_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___y ) ) +! 1 ( _y (d*zy dzm(PA) ) ) +! PGY_M_M = ---- (dyf(PA) - (------------)) ) +! ___y ( ( ) ) +! d*yy ( ( d*zz ) ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM,MYF,MZF : Shuman functions (mean operators) +!! DYF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!! 19/07/00 add the LFLAT switch (J. Stein) +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODD_CONF +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_M_M +! -------------------- +! +! +IF (.NOT. LFLAT) THEN + PGY_M_M(:,:,:)= (DYF(MYM(PA)) - MZF(MYF(PDZY)*DZM(PA)/PDZZ) ) & + /MYF(PDYY) +ELSE + PGY_M_M(:,:,:)= DYF(MYM(PA))/MYF(PDYY) +ENDIF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GY_M_M + +! +! +! +! ####################################################### + FUNCTION GZ_M_M(PA,PDZZ) RESULT(PGZ_M_M) +! ####################################################### +! +!!**** *GZ_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! _________z +! (dzm(PA)) +! PGZ_M_M = (------ ) +! ( d*zz ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MZF : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_M_M +! -------------------- +! +PGZ_M_M(:,:,:)= MZF( DZM(PA(:,:,:))/PDZZ(:,:,:) ) +! +!---------------------------------------------------------------------------- +! +END FUNCTION GZ_M_M +! +! +! ################################################## + FUNCTION GX_M_U(PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) +! ################################################## +! +!!**** *GX_M_U * - Compute the gradient along x for a variable localized at +!! a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along x +! direction for a field PY localized at a mass point. The result PGX_M_U +! is localized at a x-flux point (u point). +! +! ( ____________z ) +! ( ________x ) +! 1 ( dzm(PY) ) +! PGX_M_U = ---- (dxm(PY) - d*zx -------- ) +! d*xx ( d*zz ) +! +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDXX,PDZX,PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DXM: compute a finite difference along the x direction for +!! a variable at a mass localization +!! FUNCTION DZM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION MXM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MZF: compute an average in the z direction for a variable +!! at a flux side +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GX_M_U) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 add the LFLAT switch + inlining(J. Stein) +!! 20/08/00 optimization (J. Escobar) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_CONF +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and result +! ------------------------------------ +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux + ! side +INTEGER IIU,IKU,JI,JK +! +INTEGER :: JJK,IJU +INTEGER :: JIJK,JIJKOR,JIJKEND +INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1 +! +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG X +! ----------------------------- +! +IIU=SIZE(PY,1) +IJU=SIZE(PY,2) +IKU=SIZE(PY,3) + +IF (.NOT. LFLAT) THEN +! PGX_M_U = ( DXM(PY) - MZF ( MXM( DZM(PY) /PDZZ ) * PDZX ) )/PDXX + +!$acc data region copyin (pdzz,pdzx,pdxx,py) +!$acc region + DO JK=1+JPVEXT,IKU-JPVEXT + DO JI=1+JPHEXT,IIU + PGX_M_U(JI,:,JK)= & + ( PY(JI,:,JK)-PY(JI-1,:,JK) & + -( (PY(JI,:,JK)-PY(JI,:,JK-1)) / PDZZ(JI,:,JK) & + +(PY(JI-1,:,JK)-PY(JI-1,:,JK-1)) / PDZZ(JI-1,:,JK) & + ) * PDZX(JI,:,JK)* 0.25 & + -( (PY(JI,:,JK+1)-PY(JI,:,JK)) / PDZZ(JI,:,JK+1) & + +(PY(JI-1,:,JK+1)-PY(JI-1,:,JK)) / PDZZ(JI-1,:,JK+1) & + ) * PDZX(JI,:,JK+1)* 0.25 & + ) / PDXX(JI,:,JK) + END DO + END DO +!$acc end region + +!!$ JIJKOR = 1 + JPHEXT + IIU*IJU*(JPVEXT+1 - 1) +!!$ JIJKEND = IIU*IJU*(IKU-JPVEXT) +!!$!CDIR NODEP +!!$!OCL NOVREC +!!$ DO JIJK=JIJKOR , JIJKEND +!!$! indexation +!!$ JI_1JK = JIJK - 1 +!!$ JIJK_1 = JIJK - IIU*IJU +!!$ JI_1JK_1 = JIJK - 1 - IIU*IJU +!!$ JIJKP1 = JIJK + IIU*IJU +!!$ JI_1JKP1 = JIJK - 1 + IIU*IJU +!!$! +!!$ PGX_M_U(JIJK,1,1)= & +!!$ ( PY(JIJK,1,1)-PY(JI_1JK,1,1) & +!!$ -( (PY(JIJK,1,1)-PY(JIJK_1,1,1)) / PDZZ(JIJK,1,1) & +!!$ +(PY(JI_1JK,1,1)-PY(JI_1JK_1,1,1)) / PDZZ(JI_1JK,1,1) & +!!$ ) * PDZX(JIJK,1,1)* 0.25 & +!!$ -( (PY(JIJKP1,1,1)-PY(JIJK,1,1)) / PDZZ(JIJKP1,1,1) & +!!$ +(PY(JI_1JKP1,1,1)-PY(JI_1JK,1,1)) / PDZZ(JI_1JKP1,1,1) & +!!$ ) * PDZX(JIJKP1,1,1)* 0.25 & +!!$ ) / PDXX(JIJK,1,1) +!!$ END DO + +! +!$acc region + DO JI=1+JPHEXT,IIU + PGX_M_U(JI,:,IKU)= ( PY(JI,:,IKU)-PY(JI-1,:,IKU) ) / PDXX(JI,:,IKU) + PGX_M_U(JI,:,1)= -999. + END DO +! + PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) +!$acc end region + +!$acc end data region +ELSE +! PGX_M_U = DXM(PY) / PDXX + PGX_M_U(1+JPHEXT:IIU,:,:) = ( PY(1+JPHEXT:IIU,:,:)-PY(JPHEXT:IIU-1,:,:) ) & + / PDXX(1+JPHEXT:IIU,:,:) +! + PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) +ENDIF +! +!------------------------------------------------------------------------------- +! +END FUNCTION GX_M_U +! +! +! ################################################## + FUNCTION GY_M_V(PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) +! ################################################## +! +!!**** *GY_M_V * - Compute the gradient along y for a variable localized at +!! a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along y +! direction for a field PY localized at a mass point. The result PGY_M_V +! is localized at a y-flux point (v point). +! +! ( ____________z ) +! ( ________y ) +! 1 ( dzm(PY) ) +! PGY_M_V = ---- (dym(PY) - d*zy -------- ) +! d*yy ( d*zz ) +! +! +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDYY,PDZY,PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DYM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION DZM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION MYM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MZF: compute an average in the z direction for a variable +!! at a flux side +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GY_M_V) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 add the LFLAT switch + inlining(J. Stein) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_CONF +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! ------------------------------------- +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY !d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY !d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux + ! side +INTEGER IJU,IKU,JJ,JK +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Y +! ---------------------------- +! +IJU=SIZE(PY,2) +IKU=SIZE(PY,3) +IF (.NOT. LFLAT) THEN +! PGY_M_V = ( DYM(PY) - MZF ( MYM( DZM(PY) /PDZZ ) * PDZY ) )/PDYY +!$acc region + DO JK=1+JPVEXT,IKU-JPVEXT + DO JJ=1+JPHEXT,IJU + PGY_M_V(:,JJ,JK)= & + ( PY(:,JJ,JK)-PY(:,JJ-1,JK) & + -( (PY(:,JJ,JK)-PY(:,JJ,JK-1)) / PDZZ(:,JJ,JK) & + +(PY(:,JJ-1,JK)-PY(:,JJ-1,JK-1)) / PDZZ(:,JJ-1,JK) & + ) * PDZY(:,JJ,JK)* 0.25 & + -( (PY(:,JJ,JK+1)-PY(:,JJ,JK)) / PDZZ(:,JJ,JK+1) & + +(PY(:,JJ-1,JK+1)-PY(:,JJ-1,JK)) / PDZZ(:,JJ-1,JK+1) & + ) * PDZY(:,JJ,JK+1)* 0.25 & + ) / PDYY(:,JJ,JK) + END DO + END DO +! + DO JJ=1+JPHEXT,IJU + PGY_M_V(:,JJ,IKU)= ( PY(:,JJ,IKU)-PY(:,JJ-1,IKU) ) / PDYY(:,JJ,IKU) + PGY_M_V(:,JJ,1)= -999. + END DO +! + PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) +!$acc end region +ELSE +! PGY_M_V = DYM(PY)/PDYY + PGY_M_V(:,1+JPHEXT:IJU,:) = ( PY(:,1+JPHEXT:IJU,:)-PY(:,JPHEXT:IJU-1,:) ) & + / PDYY(:,1+JPHEXT:IJU,:) +! + PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) +ENDIF +! +!------------------------------------------------------------------------------- +! +END FUNCTION GY_M_V +! +! +! ######################################### + FUNCTION GZ_M_W(PY,PDZZ) RESULT(PGZ_M_W) +! ######################################### +! +!!**** *GZ_M_W * - Compute the gradient along z direction for a +!! variable localized at a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along x,y,z +! directions for a field PY localized at a mass point. The result PGZ_M_W +! is localized at a z-flux point (w point) +! +! +! dzm(PY) +! PGZ_M_W = ------- +! d*zz +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DZM : compute a finite difference along the z +!! direction for a variable at a mass localization +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODI_SHUMAN : interface for the Shuman functions +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GZ_M_W) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 inlining(J. Stein) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! ------------------------------------- +! + ! Metric coefficient: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W ! result at flux + ! side +! +INTEGER IKU +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Z +! ----------------------------- +! +IKU=SIZE(PY,3) +PGZ_M_W(:,:,1+JPVEXT:IKU) = (PY(:,:,1+JPVEXT:IKU)-PY(:,:,JPVEXT:IKU-1)) & + / PDZZ(:,:,1+JPVEXT:IKU) +PGZ_M_W(:,:,1)=-999. +! +!------------------------------------------------------------------------------- +! +END FUNCTION GZ_M_W + diff --git a/MNH/metrics.f90 b/MNH/metrics.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b7685197bacefb8b73db3fb62be07126c9197b45 --- /dev/null +++ b/MNH/metrics.f90 @@ -0,0 +1,174 @@ +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/metrics.f90,v $ $Revision: 1.1.8.1.2.1 $ $Date: 2009/04/21 07:42:51 $ +!----------------------------------------------------------------- +!----------------------------------------------------------------- +!----------------------------------------------------------------- +! ################### + MODULE MODI_METRICS +! ################### +INTERFACE +! +SUBROUTINE METRICS(PMAP,PDXHAT,PDYHAT,PZZ, & + PDXX,PDYY,PDZX,PDZY,PDZZ) +REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! Map factor +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height in z direction +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDZX ! metric coefficient dzx +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDZY ! metric coefficient dzy +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDZZ ! metric coefficient dzz +! +END SUBROUTINE METRICS +! +END INTERFACE +! +END MODULE MODI_METRICS +! +! +! +! ################################################################# + SUBROUTINE METRICS(PMAP,PDXHAT,PDYHAT,PZZ, & + PDXX,PDYY,PDZX,PDZY,PDZZ) +! ################################################################# +! +!!**** *METRICS* - routine to compute metric coefficients +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the metric coefficients +! dxx,dyy,dzz,dzx,dzy +! +!!** METHOD +!! ------ +!! The horizontal coefficients dxx and dyy (PDXX and PDYY arrays) +!! are computed according to the thinshell or no thinshell approximation +!! and to the cartesian or spherical geometry. +!! +!! EXTERNAL +!! -------- +!! MXM,MYM,MZM : Shuman functions (mean operators) +!! DXM,DYM,DZM : Shuman functions (finite differences operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XRADIUS : earth radius +!! +!! Module MODD_CONF : contains configuration variables +!! +!! LTHINSHELL : Logical for thinshell approximation +!! .TRUE. = Thinshell approximation done +!! LCARTESIAN : Logical for cartesian geometry +!! .TRUE. = Cartesian geometry used +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (routine METRICS) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/94 +!! 14/02/01 (V. Masson and J. Stein) PDZZ initialized below the surface +!! (influences the 3D turbulence of W) and PDXX,PDYY,PDZZ at the top +!! 19/03/2008 (J.Escobar) remove spread !!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_CONF +USE MODD_CST +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! Map factor +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDZX ! metric coefficient dzx +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDZY ! metric coefficient dzy +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDZZ ! metric coefficient dzz +! +!* 0.2 declarations of local variables +! +INTEGER :: IIU ! Upper dimension in x direction +INTEGER :: IJU ! Upper dimension in y direction +INTEGER :: IKU ! Upper dimension in z direction +REAL :: ZD1 ! DELTA1 (switch 0/1) for thinshell + ! approximation +INTEGER :: JI,JJ,JK +REAL, DIMENSION(SIZE(PDXHAT),SIZE(PDYHAT),SIZE(PZZ,3)) :: ZDZZ +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE DIMENSIONS OF ARRAYS : +! ---------------------------- +IIU = SIZE(PDXHAT) +IJU = SIZE(PDYHAT) +IKU = SIZE(PZZ,3) +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE PDXX and PDYY : +! -------------------- +! +IF (LTHINSHELL) THEN + ZD1=0. +ELSE + ZD1=1. +END IF +IF (.NOT.LCARTESIAN) THEN + ZDZZ(:,:,:) = MZF( 1.+ ZD1*PZZ(:,:,:)/XRADIUS) + DO JK=1,IKU ; DO JJ=1,IJU ; DO JI=1,IIU + PDXX(JI,JJ,JK) = ZDZZ(JI,JJ,JK) * PDXHAT(JI) /PMAP(JI,JJ) + PDYY(JI,JJ,JK) = ZDZZ(JI,JJ,JK) * PDYHAT(JJ) /PMAP(JI,JJ) + ENDDO ; ENDDO ; ENDDO + PDXX(:,:,:)=MXM(PDXX(:,:,:)) + PDXX(:,:,IKU)=PDXX(:,:,IKU-1) + PDYY(:,:,:)=MYM(PDYY(:,:,:)) + PDYY(:,:,IKU)=PDYY(:,:,IKU-1) +ELSE + DO JK=1,IKU ; DO JJ=1,IJU ; DO JI=1,IIU + PDXX(JI,JJ,JK) = PDXHAT(JI) + PDYY(JI,JJ,JK) = PDYHAT(JJ) + ENDDO ; ENDDO ; ENDDO + PDXX(:,:,:)=MXM(PDXX(:,:,:)) + PDYY(:,:,:)=MYM(PDYY(:,:,:)) +END IF +! +!------------------------------------------------------------------------------- +! +!* 3. COMPUTE PDZX AND PDZY : +! ---------------------- +! +PDZX(:,:,:) = DXM(PZZ(:,:,:)) +! +PDZY(:,:,:) = DYM(PZZ(:,:,:)) +! +!------------------------------------------------------------------------------- +! +!* 4. COMPUTE PDZZ : +! ------------- +! +PDZZ(:,:,:) = DZM(MZF(PZZ(:,:,:))) +PDZZ(:,:,IKU) = PZZ(:,:,IKU) - PZZ(:,:,IKU-1) ! same delta z in IKU and IKU -1 +PDZZ(:,:,1) = PDZZ(:,:,2) ! same delta z in 1 and 2 +!----------------------------------------------------------------------------- +! +END SUBROUTINE METRICS diff --git a/MNH/ppm.f90 b/MNH/ppm.f90 index 7761f294fc2c64abba1187303fbb12d7e1ad3ae8..688423f7ffa5100f02bbfcff986ef0b0fd319ae9 100644 --- a/MNH/ppm.f90 +++ b/MNH/ppm.f90 @@ -1,7 +1,7 @@ !----------------------------------------------------------------- !--------------- special set of characters for RCS information !----------------------------------------------------------------- -! $Source$ $Revision$ +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/Attic/ppm.f90,v $ $Revision: 1.1.2.3.2.2 $ ! masdev4_7 BUG1 2007/06/15 17:47:18 !----------------------------------------------------------------- ! ############### @@ -198,6 +198,7 @@ USE MODD_CONF USE MODD_LUNIT !END JUAN PPM_LL USE MODE_MPPDB +USE MODD_PARAMETERS, ONLY : JPHEXT ! IMPLICIT NONE ! @@ -236,6 +237,16 @@ REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZFPOS, ZFNEG INTEGER :: ILUOUT,IRESP ! for prints INTEGER :: IJS,IJN !END JUAN PPM_LL +!JUAN ACC +INTEGER :: I,J,K ,IIU,IJU,IKU +LOGICAL :: GWEST , GEAST +! inline shuman with macro +#define dif2x(DQ,PQ) DQ(IIB:IIE,:,:)=0.5*(PQ(IIB+1:IIE+1,:,:)-PQ(IIB-1:IIE-1,:,:));\ +DQ(IIB-1,:,:)=0.5*(PQ(IIB,:,:)-PQ(IIE-1,:,:));\ +DQ(IIE+1,:,:)=0.5*(PQ(IIB+1,:,:)-PQ(IIE,:,:)) ! DIF2X(DQ,PQ) +#define dxf(PDXF,PA) PDXF(1:IIU-1,:,:) = PA(2:IIU,:,:) - PA(1:IIU-1,:,:) ; PDXF(IIU,:,:) = PDXF(2*JPHEXT,:,:) ! DXF(PDXF,PA) +#define mxm(PMXM,PA) PMXM(2:IIU,:,:) = 0.5*( PA(2:IIU,:,:)+PA(1:IIU-1,:,:) ) ; PMXM(1,:,:) = PMXM(IIU-2*JPHEXT+1,:,:) ! MXM(PMXM,PA) +!JUAN ACC !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS @@ -244,6 +255,14 @@ INTEGER :: IJS,IJN CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IJS=IJB IJN=IJE + +IIU=size(psrc,1) +IJU=size(psrc,2) +IKU=size(psrc,3) + +GWEST = LWEST_ll() +GEAST = LEAST_ll() + ! !BEG JUAN PPM_LL ! @@ -260,167 +279,166 @@ IF(NHALO /= 1) THEN ENDIF ! CALL GET_HALO(PSRC,HDIR="01_X") -! -PR=PSRC -ZQL=PSRC -ZQR=PSRC -ZDQ=PSRC -ZQ6=PSRC -ZDMQ=PSRC -ZQL0=PSRC -ZQR0=PSRC -ZQ60=PSRC -ZFPOS=PSRC -ZFNEG=PSRC -! -!------------------------------------------------------------------------------- -! -SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side -! -! 1.1 CYCLIC BOUNDARY CONDITIONS IN X DIRECTION -! ----------------------------------------- -! -CASE ('CYCL','WALL') ! In that case one must have HLBCX(1) == HLBCX(2) -! -! calculate dmq ZDMQ(i) = Fct[ PSRC(i-1),PSRC(i+1) ] - ZDMQ = DIF2X(PSRC) -! -! monotonize the difference followinq eq. 5 in Lin94 -! -!BEG JUAN PPM_LL01 -! -! ZDMQ(i) = Fct[ ZDMQ(i),PSRC(i),PSRC(i-1),PSRC(i+1) ] -! - ZDMQ(IIB:IIE,IJS:IJN,:) = & - SIGN( (MIN( ABS(ZDMQ(IIB:IIE,IJS:IJN,:)),2.0*(PSRC(IIB:IIE,IJS:IJN,:) - & - MIN(PSRC(IIB-1:IIE-1,IJS:IJN,:),PSRC(IIB:IIE,IJS:IJN,:),PSRC(IIB+1:IIE+1,IJS:IJN,:))), & - 2.0*(MAX(PSRC(IIB-1:IIE-1,IJS:IJN,:),PSRC(IIB:IIE,IJS:IJN,:),PSRC(IIB+1:IIE+1,IJS:IJN,:)) - & - PSRC(IIB:IIE,IJS:IJN,:)) )), ZDMQ(IIB:IIE,IJS:IJN,:) ) -! -! WEST BOUND -! -!!$ ZDMQ(IIB-1,:,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(IIB-1,:,:)), 2.0*(PSRC(IIB-1,:,:) - & -!!$ MIN(PSRC(IIE-1,:,:),PSRC(IIB-1,:,:),PSRC(IIB,:,:))), & -!!$ 2.0*(MAX(PSRC(IIE-1,:,:),PSRC(IIB-1,:,:),PSRC(IIB,:,:)) - & -!!$ PSRC(IIB-1,:,:)) )), ZDMQ(IIB-1,:,:) ) -! -! EAST BOUND -! -!!$ ZDMQ(IIE+1,:,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(IIE+1,:,:)), 2.0*(PSRC(IIE+1,:,:) - & -!!$ MIN(PSRC(IIE,:,:),PSRC(IIE+1,:,:),PSRC(IIB+1,:,:))), & -!!$ 2.0*(MAX(PSRC(IIE,:,:),PSRC(IIE+1,:,:),PSRC(IIB+1,:,:)) - & -!!$ PSRC(IIE+1,:,:)) )), ZDMQ(IIE+1,:,:) ) -! -! update ZDMQ HALO before next/further utilisation -! - CALL GET_HALO(ZDMQ,HDIR="01_X") ! PB AVEC HDIR="X1" - CALL MPPDB_CHECK3DM("PPM::PPM_01_X CYCL ::ZDMQ",PRECISION,ZDMQ) -! -! calculate qL and qR with the modified dmq -! -! ZQL0(i) = Fct[ PSRC(i),PSRC(i-1),ZDMQ(i),ZDMQ(i-1) ] -! - ZQL0(IIB:IIE+1,IJS:IJN,:) = 0.5*(PSRC(IIB:IIE+1,IJS:IJN,:) + PSRC(IIB-1:IIE,IJS:IJN,:)) - & - (ZDMQ(IIB:IIE+1,IJS:IJN,:) - ZDMQ(IIB-1:IIE,IJS:IJN,:))/6.0 -! - CALL GET_HALO(ZQL0,HDIR="01_X") -! -! WEST BOUND -! -!!$ ZQL0(IIB-1,:,:) = ZQL0(IIE,:,:) JUAN PPMLL01 -! - ZQR0(IIB-1:IIE,IJS:IJN,:) = ZQL0(IIB:IIE+1,IJS:IJN,:) -! - CALL GET_HALO(ZQR0,HDIR="01_X") -! -! EAST BOUND -! -!!$ ZQR0(IIE+1,:,:) = ZQR0(IIB,:,:) JUAN PPMLL01 -! -! determine initial coefficients of the parabolae -! - ZDQ = ZQR0 - ZQL0 - ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) -! -! initialize final parabolae parameters -! - ZQL = ZQL0 - ZQR = ZQR0 - ZQ6 = ZQ60 -! -! eliminate over and undershoots and create qL and qR as in Lin96 -! - WHERE ( ZDMQ == 0.0 ) - ZQL = PSRC - ZQR = PSRC - ZQ6 = 0.0 - ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) - ZQ6 = 3.0*(ZQL0 - PSRC) - ZQR = ZQL0 - ZQ6 - ZQL = ZQL0 - ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) - ZQ6 = 3.0*(ZQR0 - PSRC) - ZQL = ZQR0 - ZQ6 - ZQR = ZQR0 - END WHERE -! -! recalculate coefficients of the parabolae -! - ZDQ = ZQR - ZQL -! -! and finally calculate fluxes for the advection -! -! ZFPOS(i) = Fct[ ZQR(i-1),ZCR(i),ZDQ(i-1),ZQ6(i-1) ] -! - ZFPOS(IIB:IIE+1,IJS:IJN,:) = ZQR(IIB-1:IIE,IJS:IJN,:) - 0.5*ZCR(IIB:IIE+1,IJS:IJN,:) * & - (ZDQ(IIB-1:IIE,IJS:IJN,:) - (1.0 - 2.0*ZCR(IIB:IIE+1,IJS:IJN,:)/3.0) & - * ZQ6(IIB-1:IIE,IJS:IJN,:)) -! - CALL GET_HALO(ZFPOS,HDIR="Z1_X") -! -! WEST BOUND -! -! PPOSX(IIB-1,:,:) is not important for the calc of advection so -! we set it to 0 -!!$ ZFPOS(IIB-1,:,:) = 0.0 JUANPPMLL01 -! - ZFNEG(:,IJS:IJN,:) = ZQL(:,IJS:IJN,:) - 0.5*ZCR(:,IJS:IJN,:) * & - ( ZDQ(:,IJS:IJN,:) + (1.0 + 2.0*ZCR(:,IJS:IJN,:)/3.0) * ZQ6(:,IJS:IJN,:) ) -! - CALL GET_HALO(ZFNEG,HDIR="Z1_X") -! -! advect the actual field in X direction by U*dt -! - PR = DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) - CALL GET_HALO(PR,HDIR="01_X") - CALL MPPDB_CHECK3DM("PPM::PPM_01_X CYCL ::PR",PRECISION,PR) -! -! -!* 1.2 NON-CYCLIC BOUNDARY CONDITIONS IN THE X DIRECTION -! ------------------------------------------------- -! -CASE('OPEN') + +!$acc data region local (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) copyin (psrc,zcr,prho) copyout(pr) ! +!$acc region + DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU +PR(I,J,K)=PSRC(I,J,K) +ZQL(I,J,K)=PSRC(I,J,K) +ZQR(I,J,K)=PSRC(I,J,K) +ZDQ(I,J,K)=PSRC(I,J,K) +ZQ6(I,J,K)=PSRC(I,J,K) +ZDMQ(I,J,K)=PSRC(I,J,K) +ZQL0(I,J,K)=PSRC(I,J,K) +ZQR0(I,J,K)=PSRC(I,J,K) +ZQ60(I,J,K)=PSRC(I,J,K) +ZFPOS(I,J,K)=PSRC(I,J,K) +ZFNEG(I,J,K)=PSRC(I,J,K) +ENDDO ; ENDDO ; ENDDO +! acc end region +! +!------------------------------------------------------------------------------- +! +!!$SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side +!!$! +!!$! 1.1 CYCLIC BOUNDARY CONDITIONS IN X DIRECTION +!!$! ----------------------------------------- +!!$! +!!$CASE ('CYCL','WALL') ! In that case one must have HLBCX(1) == HLBCX(2) +!!$! +!!$! calculate dmq ZDMQ(i) = Fct[ PSRC(i-1),PSRC(i+1) ] +!!$ ZDMQ = DIF2X(PSRC) +!!$! +!!$! monotonize the difference followinq eq. 5 in Lin94 +!!$! +!!$!BEG JUAN PPM_LL01 +!!$! +!!$! ZDMQ(i) = Fct[ ZDMQ(i),PSRC(i),PSRC(i-1),PSRC(i+1) ] +!!$! +!!$ ZDMQ(IIB:IIE,IJS:IJN,:) = & +!!$ SIGN( (MIN( ABS(ZDMQ(IIB:IIE,IJS:IJN,:)),2.0*(PSRC(IIB:IIE,IJS:IJN,:) - & +!!$ MIN(PSRC(IIB-1:IIE-1,IJS:IJN,:),PSRC(IIB:IIE,IJS:IJN,:),PSRC(IIB+1:IIE+1,IJS:IJN,:))), & +!!$ 2.0*(MAX(PSRC(IIB-1:IIE-1,IJS:IJN,:),PSRC(IIB:IIE,IJS:IJN,:),PSRC(IIB+1:IIE+1,IJS:IJN,:)) - & +!!$ PSRC(IIB:IIE,IJS:IJN,:)) )), ZDMQ(IIB:IIE,IJS:IJN,:) ) +!!$! +!!$! WEST BOUND +!!$! +!!$! +!!$! EAST BOUND +!!$! +!!$! +!!$! update ZDMQ HALO before next/further utilisation +!!$! +!!$ CALL GET_HALO(ZDMQ,HDIR="01_X") ! PB AVEC HDIR="X1" +!!$ CALL MPPDB_CHECK3DM("PPM::PPM_01_X CYCL ::ZDMQ",PRECISION,ZDMQ) +!!$! +!!$! calculate qL and qR with the modified dmq +!!$! +!!$! ZQL0(i) = Fct[ PSRC(i),PSRC(i-1),ZDMQ(i),ZDMQ(i-1) ] +!!$! +!!$ ZQL0(IIB:IIE+1,IJS:IJN,:) = 0.5*(PSRC(IIB:IIE+1,IJS:IJN,:) + PSRC(IIB-1:IIE,IJS:IJN,:)) - & +!!$ (ZDMQ(IIB:IIE+1,IJS:IJN,:) - ZDMQ(IIB-1:IIE,IJS:IJN,:))/6.0 +!!$! +!!$ CALL GET_HALO(ZQL0,HDIR="01_X") +!!$! +!!$! WEST BOUND +!!$! +!!$! +!!$ ZQR0(IIB-1:IIE,IJS:IJN,:) = ZQL0(IIB:IIE+1,IJS:IJN,:) +!!$! +!!$ CALL GET_HALO(ZQR0,HDIR="01_X") +!!$! +!!$! EAST BOUND +!!$! +!!$! +!!$! determine initial coefficients of the parabolae +!!$! +!!$ ZDQ = ZQR0 - ZQL0 +!!$ ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) +!!$! +!!$! initialize final parabolae parameters +!!$! +!!$ ZQL = ZQL0 +!!$ ZQR = ZQR0 +!!$ ZQ6 = ZQ60 +!!$! +!!$! eliminate over and undershoots and create qL and qR as in Lin96 +!!$! +!!$ WHERE ( ZDMQ == 0.0 ) +!!$ ZQL = PSRC +!!$ ZQR = PSRC +!!$ ZQ6 = 0.0 +!!$ ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) +!!$ ZQ6 = 3.0*(ZQL0 - PSRC) +!!$ ZQR = ZQL0 - ZQ6 +!!$ ZQL = ZQL0 +!!$ ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) +!!$ ZQ6 = 3.0*(ZQR0 - PSRC) +!!$ ZQL = ZQR0 - ZQ6 +!!$ ZQR = ZQR0 +!!$ END WHERE +!!$! +!!$! recalculate coefficients of the parabolae +!!$! +!!$ ZDQ = ZQR - ZQL +!!$! +!!$! and finally calculate fluxes for the advection +!!$! +!!$! ZFPOS(i) = Fct[ ZQR(i-1),ZCR(i),ZDQ(i-1),ZQ6(i-1) ] +!!$! +!!$ ZFPOS(IIB:IIE+1,IJS:IJN,:) = ZQR(IIB-1:IIE,IJS:IJN,:) - 0.5*ZCR(IIB:IIE+1,IJS:IJN,:) * & +!!$ (ZDQ(IIB-1:IIE,IJS:IJN,:) - (1.0 - 2.0*ZCR(IIB:IIE+1,IJS:IJN,:)/3.0) & +!!$ * ZQ6(IIB-1:IIE,IJS:IJN,:)) +!!$! +!!$ CALL GET_HALO(ZFPOS,HDIR="Z1_X") +!!$! +!!$! WEST BOUND +!!$! +!!$! PPOSX(IIB-1,:,:) is not important for the calc of advection so +!!$! we set it to 0 +!!$! +!!$ ZFNEG(:,IJS:IJN,:) = ZQL(:,IJS:IJN,:) - 0.5*ZCR(:,IJS:IJN,:) * & +!!$ ( ZDQ(:,IJS:IJN,:) + (1.0 + 2.0*ZCR(:,IJS:IJN,:)/3.0) * ZQ6(:,IJS:IJN,:) ) +!!$! +!!$ CALL GET_HALO(ZFNEG,HDIR="Z1_X") +!!$! +!!$! advect the actual field in X direction by U*dt +!!$! +!!$ PR = DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +!!$ CALL GET_HALO(PR,HDIR="01_X") +!!$ CALL MPPDB_CHECK3DM("PPM::PPM_01_X CYCL ::PR",PRECISION,PR) +!!$! +!!$! +!!$!* 1.2 NON-CYCLIC BOUNDARY CONDITIONS IN THE X DIRECTION +!!$! ------------------------------------------------- +!!$! +!!$CASE('OPEN') ! ! calculate dmq ! - ZDMQ = DIF2X(PSRC) +!! ZDMQ = DIF2X(PSRC) + ! acc region + dif2x(ZDMQ,PSRC) + ! acc end region ! ! overwrite the values on the boundary to get second order difference ! for qL and qR at the boundary ! ! WEST BOUND ! - IF (LWEST_ll()) THEN + IF (GWEST) THEN + ! acc region ZDMQ(IIB-1,IJS:IJN,:) = -ZDMQ(IIB,IJS:IJN,:) + ! acc end region ENDIF ! ! EAST BOUND ! - IF (LEAST_ll()) THEN + IF (GEAST) THEN + ! acc region ZDMQ(IIE+1,IJS:IJN,:) = -ZDMQ(IIE,IJS:IJN,:) + ! acc end region ENDIF ! ! monotonize the difference followinq eq. 5 in Lin94 @@ -435,25 +453,15 @@ CASE('OPEN') ! ! WEST BOUND ! -!!$ ZDMQ(IIB-1,:,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(IIB-1,:,:)), 2.0*(PSRC(IIB-1,:,:) - & -!!$ MIN(PSRC(IIE-1,:,:),PSRC(IIB-1,:,:),PSRC(IIB,:,:))), & -!!$ 2.0*(MAX(PSRC(IIE-1,:,:),PSRC(IIB-1,:,:),PSRC(IIB,:,:)) - & -!!$ PSRC(IIB-1,:,:)) )), ZDMQ(IIB-1,:,:) ) ! ! EAST BOUND ! -!!$ ZDMQ(IIE+1,:,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(IIE+1,:,:)), 2.0*(PSRC(IIE+1,:,:) - & -!!$ MIN(PSRC(IIE,:,:),PSRC(IIE+1,:,:),PSRC(IIB+1,:,:))), & -!!$ 2.0*(MAX(PSRC(IIE,:,:),PSRC(IIE+1,:,:),PSRC(IIB+1,:,:)) - & -!!$ PSRC(IIE+1,:,:)) )), ZDMQ(IIE+1,:,:) ) ! ! ! update ZDMQ HALO before next/further utilisation ! - CALL GET_HALO(ZDMQ,HDIR="01_X") - CALL MPPDB_CHECK3DM("PPM::PPM_01_X OPEN ::ZDMQ",PRECISION,ZDMQ) +!TEMPO_JUAN CALL GET_HALO(ZDMQ,HDIR="01_X") +!TEMPO_JUAN CALL MPPDB_CHECK3DM("PPM::PPM_01_X OPEN ::ZDMQ",PRECISION,ZDMQ) ! ! calculate qL and qR ! @@ -462,162 +470,177 @@ CASE('OPEN') ZQL0(IIB:IIE+1,IJS:IJN,:) = 0.5*(PSRC(IIB:IIE+1,IJS:IJN,:) + PSRC(IIB-1:IIE,IJS:IJN,:)) - & (ZDMQ(IIB:IIE+1,IJS:IJN,:) - ZDMQ(IIB-1:IIE,IJS:IJN,:))/6.0 ! - CALL GET_HALO(ZQL0,HDIR="01_X") +!TEMPO_JUAN CALL GET_HALO(ZQL0,HDIR="01_X") ! ! WEST BOUND ! - IF (LWEST_ll()) THEN + ! acc region + IF (GWEST) THEN + ! acc region ZQL0(IIB-1,IJS:IJN,:) = ZQL0(IIB,IJS:IJN,:) + ! acc end region ENDIF ! ZQR0(IIB-1:IIE,IJS:IJN,:) = ZQL0(IIB:IIE+1,IJS:IJN,:) ! - CALL GET_HALO(ZQR0,HDIR="01_X") +!TEMPO_JUAN CALL GET_HALO(ZQR0,HDIR="01_X") ! ! EAST BOUND ! - IF (LEAST_ll()) THEN + IF (GEAST) THEN + ! acc region ZQR0(IIE+1,IJS:IJN,:) = ZQR0(IIE,IJS:IJN,:) + ! acc end region ENDIF + +DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU ! ! determine initial coefficients of the parabolae ! - ZDQ = ZQR0 - ZQL0 - ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) + ZDQ (I,J,K)= ZQR0(I,J,K) - ZQL0(I,J,K) + ZQ60(I,J,K) = 6.0*(PSRC(I,J,K) - 0.5*(ZQL0(I,J,K) + ZQR0(I,J,K))) ! ! initialize final parabolae parameters ! - ZQL = ZQL0 - ZQR = ZQR0 - ZQ6 = ZQ60 + ZQL(I,J,K) = ZQL0(I,J,K) + ZQR(I,J,K) = ZQR0(I,J,K) + ZQ6(I,J,K) = ZQ60(I,J,K) ! ! eliminate over and undershoots and create qL and qR as in Lin96 ! - WHERE ( ZDMQ == 0.0 ) - ZQL = PSRC - ZQR = PSRC - ZQ6 = 0.0 - ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) - ZQ6 = 3.0*(ZQL0 - PSRC) - ZQR = ZQL0 - ZQ6 - ZQL = ZQL0 - ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) - ZQ6 = 3.0*(ZQR0 - PSRC) - ZQL = ZQR0 - ZQ6 - ZQR = ZQR0 - END WHERE + IF ( ZDMQ(I,J,K) == 0.0 ) THEN + ZQL(I,J,K) = PSRC(I,J,K) + ZQR(I,J,K) = PSRC(I,J,K) + ZQ6(I,J,K) = 0.0 + ELSEIF ( ZQ60(I,J,K)*ZDQ(I,J,K) < -(ZDQ(I,J,K))**2 ) THEN + ZQ6(I,J,K) = 3.0*(ZQL0(I,J,K) - PSRC(I,J,K)) + ZQR(I,J,K) = ZQL0(I,J,K) - ZQ6(I,J,K) + ZQL(I,J,K) = ZQL0(I,J,K) + ELSEIF ( ZQ60(I,J,K)*ZDQ(I,J,K) > (ZDQ(I,J,K))**2 ) THEN + ZQ6(I,J,K) = 3.0*(ZQR0(I,J,K) - PSRC(I,J,K)) + ZQL(I,J,K) = ZQR0(I,J,K) - ZQ6(I,J,K) + ZQR(I,J,K) = ZQR0(I,J,K) + ENDIF ! ! recalculate coefficients of the parabolae ! - ZDQ = ZQR - ZQL + ZDQ(I,J,K) = ZQR(I,J,K) - ZQL(I,J,K) +ENDDO ; ENDDO ; ENDDO ! ! and finally calculate fluxes for the advection ! ! ! ZFPOS(i) = Fct[ ZQR(i-1),ZCR(i),ZDQ(i-1),ZQ6(i-1) ] ! -!!$ ZFPOS(IIB+1:IIE+1,:,:) = ZQR(IIB:IIE,:,:) - 0.5*ZCR(IIB+1:IIE+1,:,:) * & -!!$ (ZDQ(IIB:IIE,:,:) - (1.0 - 2.0*ZCR(IIB+1:IIE+1,:,:)/3.0) & -!!$ * ZQ6(IIB:IIE,:,:)) ZFPOS(IIB:IIE+1,IJS:IJN,:) = ZQR(IIB-1:IIE,IJS:IJN,:) - 0.5*ZCR(IIB:IIE+1,IJS:IJN,:) * & (ZDQ(IIB-1:IIE,IJS:IJN,:) - (1.0 - 2.0*ZCR(IIB:IIE+1,IJS:IJN,:)/3.0) & * ZQ6(IIB-1:IIE,IJS:IJN,:)) ! - CALL GET_HALO(ZFPOS,HDIR="01_X") +!TEMPO_JUAN CALL GET_HALO(ZFPOSS,HDIR="01_X") ! ! ! WEST BOUND ! ! advection flux at open boundary when u(IIB) > 0 ! - IF (LWEST_ll()) THEN + IF (GWEST) THEN + ! acc region ZFPOS(IIB,IJS:IJN,:) = (PSRC(IIB-1,IJS:IJN,:) - ZQR(IIB-1,IJS:IJN,:))*ZCR(IIB,IJS:IJN,:) + & ZQR(IIB-1,IJS:IJN,:) + ! acc end region ! PPOSX(IIB-1,:,:) is not important for the calc of advection so ! we set it to 0 -!!$ ZFPOS(IIB-1,:,:) = 0.0 ENDIF ! -!!$ ZFNEG(IIB-1:IIE,:,:) = ZQL(IIB-1:IIE,:,:) - 0.5*ZCR(IIB-1:IIE,:,:) * & -!!$ (ZDQ(IIB-1:IIE,:,:) + (1.0 + 2.0*ZCR(IIB-1:IIE,:,:)/3.0) & -!!$ * ZQ6(IIB-1:IIE,:,:)) ZFNEG(:,IJS:IJN,:) = ZQL(:,IJS:IJN,:) - 0.5*ZCR(:,IJS:IJN,:) * & ( ZDQ(:,IJS:IJN,:) + (1.0 + 2.0*ZCR(:,IJS:IJN,:)/3.0) * ZQ6(:,IJS:IJN,:) ) ! - CALL GET_HALO(ZFNEG,HDIR="01_X") +!TEMPO_JUAN CALL GET_HALO(ZFNEG,HDIR="01_X") ! ! EAST BOUND ! ! advection flux at open boundary when u(IIE+1) < 0 - IF (LEAST_ll()) THEN + IF (GEAST) THEN + ! acc region ZFNEG(IIE+1,IJS:IJN,:) = (ZQR(IIE,IJS:IJN,:)-PSRC(IIE+1,IJS:IJN,:))*ZCR(IIE+1,IJS:IJN,:) + & ZQR(IIE,IJS:IJN,:) + ! acc end region ENDIF ! ! advect the actual field in X direction by U*dt ! - PR = DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) + ! acc region + mxm(ZQL,PRHO) + ZQR = ZCR* ZQL*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + ZFNEG*(0.5-SIGN(0.5,ZCR)) ) + dxf(PR,ZQR) + +!!$ PR = DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) + + !$acc end region +! acc update host (pr) +!$acc end data region + CALL GET_HALO(PR,HDIR="01_X") ! +!!$END SELECT ! -END SELECT -! -CONTAINS -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -! ######################################################################## - FUNCTION DIF2X(PQ) RESULT(DQ) -! ######################################################################## -!! -!!**** DIF2X - leap-frog difference operator in X direction -!! -!! Calculates the difference assuming periodic BC (CYCL). -!! -!! DQ(I) = 0.5 * (PQ(I+1) - PQ(I-1)) -!! -!! MODIFICATIONS -!! ------------- -!! -!! 18.3.2006. T. Maric - original version -!! 07/2010 J.Escobar : Correction for reproducility -!------------------------------------------------------------------------------- -! -! -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ -REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IIB,IJB ! Begining useful area in x,y directions -INTEGER :: IIE,IJE ! End useful area in x,y directions -! -!------------------------------------------------------------------------------- -! -!* 1.0. COMPUTE THE DOMAIN DIMENSIONS -! ----------------------------- -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -! -!------------------------------------------------------------------------------- -! -!* 2.0. COMPUTE THE DIFFERENCE -! ---------------------- -! -DQ(IIB:IIE,:,:) = PQ(IIB+1:IIE+1,:,:) - PQ(IIB-1:IIE-1,:,:) -DQ(IIB-1,:,:) = PQ(IIB,:,:) - PQ(IIE-1,:,:) -DQ(IIE+1,:,:) = PQ(IIB+1,:,:) - PQ(IIE,:,:) -DQ = 0.5*DQ -! -END FUNCTION DIF2X +!!$CONTAINS +!!$! +!!$!------------------------------------------------------------------------------- +!!$!------------------------------------------------------------------------------- +!!$! +!!$! ######################################################################## +!!$ FUNCTION DIF2X(PQ) RESULT(DQ) +!!$! ######################################################################## +!!$!! +!!$!!**** DIF2X - leap-frog difference operator in X direction +!!$!! +!!$!! Calculates the difference assuming periodic BC (CYCL). +!!$!! +!!$!! DQ(I) = 0.5 * (PQ(I+1) - PQ(I-1)) +!!$!! +!!$!! MODIFICATIONS +!!$!! ------------- +!!$!! +!!$!! 18.3.2006. T. Maric - original version +!!$!! 07/2010 J.Escobar : Correction for reproducility +!!$!! +!!$!------------------------------------------------------------------------------- +!!$! +!!$! +!!$USE MODE_ll +!!$! +!!$IMPLICIT NONE +!!$! +!!$!* 0.1 Declarations of dummy arguments : +!!$! +!!$REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ +!!$REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ +!!$! +!!$!* 0.2 Declarations of local variables : +!!$! +!!$INTEGER :: IIB,IJB ! Begining useful area in x,y directions +!!$INTEGER :: IIE,IJE ! End useful area in x,y directions +!!$! +!!$!------------------------------------------------------------------------------- +!!$! +!!$!* 1.0. COMPUTE THE DOMAIN DIMENSIONS +!!$! ----------------------------- +!!$! +!!$CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +!!$! +!!$!------------------------------------------------------------------------------- +!!$! +!!$!* 2.0. COMPUTE THE DIFFERENCE +!!$! ---------------------- +!!$! +!!$DQ(IIB:IIE,:,:) = PQ(IIB+1:IIE+1,:,:) - PQ(IIB-1:IIE-1,:,:) +!!$DQ(IIB-1,:,:) = PQ(IIB,:,:) - PQ(IIE-1,:,:) +!!$DQ(IIE+1,:,:) = PQ(IIB+1,:,:) - PQ(IIE,:,:) +!!$DQ = 0.5*DQ +!!$! +!!$END FUNCTION DIF2X ! END FUNCTION PPM_01_X ! @@ -650,6 +673,7 @@ USE MODD_CONF !BEG JUAN PPM_LL USE MODD_LUNIT !END JUAN PPM_LL +USE MODD_PARAMETERS, ONLY : JPHEXT USE MODE_MPPDB ! IMPLICIT NONE @@ -689,6 +713,18 @@ REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZFPOS, ZFNEG INTEGER :: ILUOUT,IRESP ! for prints INTEGER :: IIW,IIA !END JUAN PPM_LL +! +!JUAN ACC +INTEGER :: I,J,K ,IIU,IJU,IKU +LOGICAL :: GSOUTH , GNORTH +! inline shuman with macro +#define dif2y(DQ,PQ) DQ(:,IJB:IJE,:) = 0.5*(PQ(:,IJB+1:IJE+1,:) - PQ(:,IJB-1:IJE-1,:)) ; \ +DQ(:,IJB-1,:) = 0.5*(PQ(:,IJB,:) - PQ(:,IJE-1,:)) ; \ +DQ(:,IJE+1,:) = 0.5*(PQ(:,IJB+1,:) - PQ(:,IJE,:)) ! DIF2Y(DQ,PQ) +#define dyf(PDYF,PA) PDYF(:,1:IJU-1,:) = PA(:,2:IJU,:) - PA(:,1:IJU-1,:); PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) ! DYF(PDYF,PA) +#define mym(PMYM,PA) PMYM(:,2:IJU,:) = 0.5*( PA(:,2:IJU,:)+PA(:,1:IJU-1,:) ) ; PMYM(:,1,:) = PMYM(:,IJU-2*JPHEXT+1,:) ! MYM(PMYM,PA) +!JUAN ACC +! !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS @@ -697,6 +733,14 @@ INTEGER :: IIW,IIA CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IIW=IIB IIA=IIE + +IIU=size(psrc,1) +IJU=size(psrc,2) +IKU=size(psrc,3) + +GSOUTH=LSOUTH_ll() +GNORTH=LNORTH_ll() + IF(NHALO /= 1) THEN CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT,IRESP) WRITE(ILUOUT,*) 'ERROR : PPM ppm_met.f90 --> Juan ' @@ -706,13 +750,14 @@ IF(NHALO /= 1) THEN CALL ABORT STOP ENDIF -! CALL GET_HALO(PSRC,HDIR="01_Y") -! + ! !------------------------------------------------------------------------------- ! ! +!$acc data region local (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) copyin (psrc,zcr,prho) copyout(pr) ! +!$acc region ! local (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) copyin (psrc,zcr,prho) copyout(pr) PR=PSRC ZQL=PSRC ZQR=PSRC @@ -724,193 +769,211 @@ ZQR0=PSRC ZQ60=PSRC ZFPOS=PSRC ZFNEG=PSRC +!#acc end region ! -SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side -! -!* 2.1 CYCLIC BOUNDARY CONDITIONS IN THE Y DIRECTION -! --------------------------------------------- -! -CASE ('CYCL','WALL') ! In that case one must have HLBCY(1) == HLBCY(2) -! -! calculate dmq - ZDMQ = DIF2Y(PSRC) -! -! monotonize the difference followinq eq. 5 in Lin94 -!BEG JUAN PPM_LL01 -! -! ZDMQ(j) = Fct[ ZDMQ(j),PSRC(j),PSRC(j-1),PSRC(j+1) ] -! - ZDMQ(IIW:IIA,IJB:IJE,:) = & - SIGN( (MIN( ABS(ZDMQ(IIW:IIA,IJB:IJE,:)),2.0*(PSRC(IIW:IIA,IJB:IJE,:) - & - MIN(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:))), & - 2.0*(MAX(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:)) - & - PSRC(IIW:IIA,IJB:IJE,:)) )), ZDMQ(IIW:IIA,IJB:IJE,:) ) -! -! SOUTH BOUND -! -!!$ ZDMQ(:,IJB-1,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(:,IJB-1,:)), 2.0*(PSRC(:,IJB-1,:) - & -!!$ MIN(PSRC(:,IJE-1,:),PSRC(:,IJB-1,:),PSRC(:,IJB,:))), & -!!$ 2.0*(MAX(PSRC(:,IJE-1,:),PSRC(:,IJB-1,:),PSRC(:,IJB,:)) - & -!!$ PSRC(:,IJB-1,:)) )), ZDMQ(:,IJB-1,:) ) -! -! NORTH BOUND -! -!!$ ZDMQ(:,IJE+1,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(:,IJE+1,:)), 2.0*(PSRC(:,IJE+1,:) - & -!!$ MIN(PSRC(:,IJE,:),PSRC(:,IJE+1,:),PSRC(:,IJB+1,:))), & -!!$ 2.0*(MAX(PSRC(:,IJE,:),PSRC(:,IJE+1,:),PSRC(:,IJB+1,:)) - & -!!$ PSRC(:,IJE+1,:)) )), ZDMQ(:,IJE+1,:) ) -! -! update ZDMQ HALO before next/further utilisation -! - CALL GET_HALO(ZDMQ,HDIR="01_Y") - CALL MPPDB_CHECK3DM("PPM::PPM_01_Y CYCL ::ZDMQ",PRECISION,ZDMQ) -! -! calculate qL and qR with the modified dmq -! - ZQL0(IIW:IIA,IJB:IJE+1,:) = 0.5*(PSRC(IIW:IIA,IJB:IJE+1,:) + PSRC(IIW:IIA,IJB-1:IJE,:)) - & - (ZDMQ(IIW:IIA,IJB:IJE+1,:) - ZDMQ(IIW:IIA,IJB-1:IJE,:))/6.0 -! - CALL GET_HALO(ZQL0,HDIR="01_Y") -! -! SOUTH BOUND -! -!!$ ZQL0(:,IJB-1,:) = ZQL0(:,IJE,:) JUAN PPMLL01 -! - ZQR0(IIW:IIA,IJB-1:IJE,:) = ZQL0(IIW:IIA,IJB:IJE+1,:) -! - CALL GET_HALO(ZQR0,HDIR="01_Y") -! -! NORTH BOUND -! -!!$ ZQR0(:,IJE+1,:) = ZQR0(:,IJB,:) JUAN PPMLL01 -! -! determine initial coefficients of the parabolae -! - ZDQ = ZQR0 - ZQL0 - ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) -! -! initialize final parabolae parameters -! - ZQL = ZQL0 - ZQR = ZQR0 - ZQ6 = ZQ60 -! -! eliminate over and undershoots and create qL and qR as in Lin96 -! - WHERE ( ZDMQ == 0.0 ) - ZQL = PSRC - ZQR = PSRC - ZQ6 = 0.0 - ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) - ZQ6 = 3.0*(ZQL0 - PSRC) - ZQR = ZQL0 - ZQ6 - ZQL = ZQL0 - ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) - ZQ6 = 3.0*(ZQR0 - PSRC) - ZQL = ZQR0 - ZQ6 - ZQR = ZQR0 - END WHERE -! -! recalculate coefficients of the parabolae -! - ZDQ = ZQR - ZQL -! -! and finally calculate fluxes for the advection -! -! ZFPOS(j) = Fct[ ZQR(j-1),ZCR(i),ZDQ(j-1),ZQ6(j-1) ] -! - ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZQR(IIW:IIA,IJB-1:IJE,:) - 0.5*ZCR(IIW:IIA,IJB:IJE+1,:) * & - (ZDQ(IIW:IIA,IJB-1:IJE,:) - (1.0 - 2.0*ZCR(IIW:IIA,IJB:IJE+1,:)/3.0) & - * ZQ6(IIW:IIA,IJB-1:IJE,:)) -! - CALL GET_HALO(ZFPOS,HDIR="01_Y") -! -! SOUTH BOUND -! -! PPOSX(:,IJB-1,:) is not important for the calc of advection so -! we set it to 0 -!!$ ZFPOS(:,IJB-1,:) = 0.0 JUANPPMLL01 -! - ZFNEG(IIW:IIA,:,:) = ZQL(IIW:IIA,:,:) - 0.5*ZCR(IIW:IIA,:,:) * & - ( ZDQ(IIW:IIA,:,:) + (1.0 + 2.0*ZCR(IIW:IIA,:,:)/3.0) * ZQ6(IIW:IIA,:,:) ) -! - CALL GET_HALO(ZFNEG,HDIR="01_Y") -! -! advect the actual field in Y direction by V*dt -! - PR = DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) - CALL GET_HALO(PR,HDIR="01_Y") - CALL MPPDB_CHECK3DM("PPM::PPM_01_Y CYCL ::PR",PRECISION,PR) -! -!* 2.2 NON-CYCLIC BOUNDARY CONDITIONS IN THE Y DIRECTION -! ------------------------------------------------- -! -CASE('OPEN') +!!$SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side +!!$! +!!$!* 2.1 CYCLIC BOUNDARY CONDITIONS IN THE Y DIRECTION +!!$! --------------------------------------------- +!!$! +!!$CASE ('CYCL') ! In that case one must have HLBCY(1) == HLBCY(2) +!!$! +!!$! calculate dmq +!!$!! ZDMQ = DIF2Y(PSRC) +!!$ dif2y(ZDMQ,PSRC) +!!$! +!!$! monotonize the difference followinq eq. 5 in Lin94 +!!$!BEG JUAN PPM_LL01 +!!$! +!!$! ZDMQ(j) = Fct[ ZDMQ(j),PSRC(j),PSRC(j-1),PSRC(j+1) ] +!!$! +!!$ ZDMQ(IIW:IIA,IJB:IJE,:) = & +!!$ SIGN( (MIN( ABS(ZDMQ(IIW:IIA,IJB:IJE,:)),2.0*(PSRC(IIW:IIA,IJB:IJE,:) - & +!!$ MIN(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:))), & +!!$ 2.0*(MAX(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:)) - & +!!$ PSRC(IIW:IIA,IJB:IJE,:)) )), ZDMQ(IIW:IIA,IJB:IJE,:) ) +!!$ +!!$! update ZDMQ HALO before next/further utilisation +!!$! +!!$ CALL GET_HALO(ZDMQ,HDIR="01_Y") +!!$ CALL MPPDB_CHECK3DM("PPM::PPM_01_Y CYCL ::ZDMQ",PRECISION,ZDMQ) +!!$! +!!$! calculate qL and qR with the modified dmq +!!$! +!!$ ZQL0(IIW:IIA,IJB:IJE+1,:) = 0.5*(PSRC(IIW:IIA,IJB:IJE+1,:) + PSRC(IIW:IIA,IJB-1:IJE,:)) - & +!!$ (ZDMQ(IIW:IIA,IJB:IJE+1,:) - ZDMQ(IIW:IIA,IJB-1:IJE,:))/6.0 +!!$! +!!$ CALL GET_HALO(ZQL0,HDIR="01_Y") +!!$! +!!$! SOUTH BOUND +!!$! +!!$ ZQR0(IIW:IIA,IJB-1:IJE,:) = ZQL0(IIW:IIA,IJB:IJE+1,:) +!!$! +!!$ CALL GET_HALO(ZQR0,HDIR="01_Y") +!!$! +!!$! determine initial coefficients of the parabolae +!!$! +!!$ ZDQ = ZQR0 - ZQL0 +!!$ ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) +!!$! +!!$! initialize final parabolae parameters +!!$! +!!$ ZQL = ZQL0 +!!$ ZQR = ZQR0 +!!$ ZQ6 = ZQ60 +!!$! +!!$! eliminate over and undershoots and create qL and qR as in Lin96 +!!$! +!!$ WHERE ( ZDMQ == 0.0 ) +!!$ ZQL = PSRC +!!$ ZQR = PSRC +!!$ ZQ6 = 0.0 +!!$ ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) +!!$ ZQ6 = 3.0*(ZQL0 - PSRC) +!!$ ZQR = ZQL0 - ZQ6 +!!$ ZQL = ZQL0 +!!$ ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) +!!$ ZQ6 = 3.0*(ZQR0 - PSRC) +!!$ ZQL = ZQR0 - ZQ6 +!!$ ZQR = ZQR0 +!!$ END WHERE +!!$! +!!$! recalculate coefficients of the parabolae +!!$! +!!$ ZDQ = ZQR - ZQL +!!$! +!!$! and finally calculate fluxes for the advection +!!$! +!!$! ZFPOS(j) = Fct[ ZQR(j-1),ZCR(i),ZDQ(j-1),ZQ6(j-1) ] +!!$! +!!$ ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZQR(IIW:IIA,IJB-1:IJE,:) - 0.5*ZCR(IIW:IIA,IJB:IJE+1,:) * & +!!$ (ZDQ(IIW:IIA,IJB-1:IJE,:) - (1.0 - 2.0*ZCR(IIW:IIA,IJB:IJE+1,:)/3.0) & +!!$ * ZQ6(IIW:IIA,IJB-1:IJE,:)) +!!$! +!!$ CALL GET_HALO(ZFPOS,HDIR="01_Y") +!!$! +!!$! SOUTH BOUND +!!$! +!!$! PPOSX(:,IJB-1,:) is not important for the calc of advection so +!!$! we set it to 0 +!!$! +!!$ ZFNEG(IIW:IIA,:,:) = ZQL(IIW:IIA,:,:) - 0.5*ZCR(IIW:IIA,:,:) * & +!!$ ( ZDQ(IIW:IIA,:,:) + (1.0 + 2.0*ZCR(IIW:IIA,:,:)/3.0) * ZQ6(IIW:IIA,:,:) ) +!!$! +!!$ CALL GET_HALO(ZFNEG,HDIR="01_Y") +!!$! +!!$! advect the actual field in Y direction by V*dt +!!$! +!!$ PR = DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +!!$ CALL GET_HALO(PR,HDIR="01_Y") +!!$ CALL MPPDB_CHECK3DM("PPM::PPM_01_Y CYCL ::PR",PRECISION,PR) + + +!!$! +!!$!* 2.2 NON-CYCLIC BOUNDARY CONDITIONS IN THE Y DIRECTION +!!$! ------------------------------------------------- +!!$! +!!$CASE('OPEN') ! ! calculate dmq - ZDMQ = DIF2Y(PSRC) +!! ZDMQ = DIF2Y(PSRC) + !#acc region + dif2y(ZDMQ,PSRC) + !#acc end region + ! overwrite the values on the boundary to get second order difference ! for qL and qR at the boundary ! ! SOUTH BOUND ! - IF (LSOUTH_ll()) THEN +!!$ IF (LSOUTH_ll()) THEN + IF (GSOUTH) THEN + !#acc region ZDMQ(IIW:IIA,IJB-1,:) = -ZDMQ(IIW:IIA,IJB,:) + !#acc end region ENDIF ! ! NORTH BOUND ! - IF (LNORTH_ll()) THEN + IF (GNORTH) THEN + !#acc region ZDMQ(IIW:IIA,IJE+1,:) = -ZDMQ(IIW:IIA,IJE,:) + !#acc end region ENDIF + ! ! monotonize the difference followinq eq. 5 in Lin94 + !#acc region ZDMQ(IIW:IIA,IJB:IJE,:) = & SIGN( (MIN( ABS(ZDMQ(IIW:IIA,IJB:IJE,:)),2.0*(PSRC(IIW:IIA,IJB:IJE,:) - & MIN(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:))), & 2.0*(MAX(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:)) - & PSRC(IIW:IIA,IJB:IJE,:)) )), ZDMQ(IIW:IIA,IJB:IJE,:) ) -!!$ ZDMQ(:,IJB-1,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(:,IJB-1,:)), 2.0*(PSRC(:,IJB-1,:) - & -!!$ MIN(PSRC(:,IJE-1,:),PSRC(:,IJB-1,:),PSRC(:,IJB,:))), & -!!$ 2.0*(MAX(PSRC(:,IJE-1,:),PSRC(:,IJB-1,:),PSRC(:,IJB,:)) - & -!!$ PSRC(:,IJB-1,:)) )), ZDMQ(:,IJB-1,:) ) -!!$ ZDMQ(:,IJE+1,:) = & -!!$ SIGN( (MIN( ABS(ZDMQ(:,IJE+1,:)), 2.0*(PSRC(:,IJE+1,:) - & -!!$ MIN(PSRC(:,IJE,:),PSRC(:,IJE+1,:),PSRC(:,IJB+1,:))), & -!!$ 2.0*(MAX(PSRC(:,IJE,:),PSRC(:,IJE+1,:),PSRC(:,IJB+1,:)) - & -!!$ PSRC(:,IJE+1,:)) )), ZDMQ(:,IJE+1,:) ) + !#acc end region + +!!$ !#acc region +!!$ DO K=1,IKU ; DO J=IJB,IJE +!!$ !#acc do independent +!!$ DO I=IIW,IIA ; ZDMQ(I,J,K) = SIGN( (MIN( ABS(ZDMQ(I,J,K)),2.0*(PSRC(I,J,K) - & +!!$ MIN(PSRC(I,J-1,K),PSRC(I,J,K),PSRC(I,J+1,K))), & +!!$ 2.0*(MAX(PSRC(I,J-1,K),PSRC(I,J,K),PSRC(I,J+1,K)) - & +!!$ PSRC(I,J,K)) )), ZDMQ(I,J,K) ) +!!$ ENDDO ; ENDDO ; ENDDO +!!$ !#acc end region + ! ! update ZDMQ HALO before next/further utilisation ! - CALL GET_HALO(ZDMQ,HDIR="01_Y") + !TEMPO_JUAN CALL GET_HALO(ZDMQ,HDIR="01_Y") ! ! calculate qL and qR with the modified dmq ! + !#acc region ZQL0(IIW:IIA,IJB:IJE+1,:) = 0.5*(PSRC(IIW:IIA,IJB:IJE+1,:) + PSRC(IIW:IIA,IJB-1:IJE,:)) - & (ZDMQ(IIW:IIA,IJB:IJE+1,:) - ZDMQ(IIW:IIA,IJB-1:IJE,:))/6.0 -! - CALL GET_HALO(ZQL0,HDIR="01_Y") + !#acc end region + +!!$ !#acc region +!!$ DO K=1,IKU ; DO J=IJB,IJE+1 +!!$ !#acc do independent +!!$ DO I=IIW,IIA ; ZQL0(I,J,K) = 0.5*(PSRC(I,J,K) + PSRC(I,J-1,K)) - (ZDMQ(I,J,K) - ZDMQ(I,J-1,K))/6.0 +!!$ ENDDO ; ENDDO ; ENDDO +!!$ !#acc end region +! + !TEMPO_JUAN CALL GET_HALO(ZQL0,HDIR="01_Y") ! ! SOUTH BOUND ! - IF (LSOUTH_ll()) THEN +!!$ IF (LSOUTH_ll()) THEN + IF (GSOUTH) THEN + !#acc region ZQL0(IIW:IIA,IJB-1,:) = ZQL0(IIW:IIA,IJB,:) + !#acc end region ENDIF ! + !#acc region ZQR0(IIW:IIA,IJB-1:IJE,:) = ZQL0(IIW:IIA,IJB:IJE+1,:) + !#acc end region + +!!$ !#acc region +!!$ DO K=1,IKU ; DO J=IJB-1,IJE +!!$ !#acc do independent +!!$ DO I=IIW,IIA ; ZQR0(I,J,K) = ZQL0(I,J+1,K) +!!$ ENDDO ; ENDDO ; ENDDO +!!$ !#acc end region ! ! NORTH BOUND ! - IF (LNORTH_ll()) THEN + IF (GNORTH) THEN + !#acc region ZQR0(IIW:IIA,IJE+1,:) = ZQR0(IIW:IIA,IJE,:) + !#acc end region ENDIF ! ! determine initial coefficients of the parabolae ! + !#acc region ZDQ = ZQR0 - ZQL0 ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) ! @@ -919,135 +982,176 @@ CASE('OPEN') ZQL = ZQL0 ZQR = ZQR0 ZQ6 = ZQ60 + !#acc end region ! ! eliminate over and undershoots and create qL and qR as in Lin96 ! + ! acc region WHERE ( ZDMQ == 0.0 ) ZQL = PSRC ZQR = PSRC ZQ6 = 0.0 - ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) + ENDWHERE + WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ < -(ZDQ)**2 ) ) ZQ6 = 3.0*(ZQL0 - PSRC) ZQR = ZQL0 - ZQ6 ZQL = ZQL0 - ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) + ENDWHERE + WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ > (ZDQ)**2 ) ) ZQ6 = 3.0*(ZQR0 - PSRC) ZQL = ZQR0 - ZQ6 ZQR = ZQR0 END WHERE + ! acc end region + ! ! recalculate coefficients of the parabolae ! + !#acc region ZDQ = ZQR - ZQL + !#acc end region ! -! and finally calculate fluxes for the advection -!!$ ZFPOS(:,IJB+1:IJE+1,:) = ZQR(:,IJB:IJE,:) - 0.5*ZCR(:,IJB+1:IJE+1,:) * & -!!$ (ZDQ(:,IJB:IJE,:) - (1.0 - 2.0*ZCR(:,IJB+1:IJE+1,:)/3.0) & -!!$ * ZQ6(:,IJB:IJE,:)) + ! and finally calculate fluxes for the advection + !#acc region ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZQR(IIW:IIA,IJB-1:IJE,:) - 0.5*ZCR(IIW:IIA,IJB:IJE+1,:) * & (ZDQ(IIW:IIA,IJB-1:IJE,:) - (1.0 - 2.0*ZCR(IIW:IIA,IJB:IJE+1,:)/3.0) & * ZQ6(IIW:IIA,IJB-1:IJE,:)) + !#acc end region + +!!$ !#acc region +!!$ DO K=1,IKU ; DO J=IJB,IJE+1 +!!$ !#acc do independent +!!$ DO I=IIW,IIA ; ZFPOS(I,J,K) = ZQR(I,J-1,K) - 0.5*ZCR(I,J,K) * & +!!$ (ZDQ(I,J-1,K) - (1.0 - 2.0*ZCR(I,J,K)/3.0) & +!!$ * ZQ6(I,J-1,K)) +!!$ ENDDO ; ENDDO ; ENDDO +!!$ !#acc end region ! - CALL GET_HALO(ZFPOS,HDIR="01_Y") + !TEMPO_JUAN CALL GET_HALO(ZFPOS,HDIR="01_Y") ! ! ! advection flux at open boundary when u(IJB) > 0 ! ! SOUTH BOUND ! - IF (LSOUTH_ll()) THEN +!!$ IF (LSOUTH_ll()) THEN + IF (GSOUTH) THEN + !#acc region ZFPOS(IIW:IIA,IJB,:) = (PSRC(IIW:IIA,IJB-1,:) - ZQR(IIW:IIA,IJB-1,:))*ZCR(IIW:IIA,IJB,:) + & ZQR(IIW:IIA,IJB-1,:) + !#acc end region ENDIF ! ! PPOSX(:,IJB-1,:) is not important for the calc of advection so ! we set it to 0 -!!$ ZFPOS(:,IJB-1,:) = 0.0 ! JUAN PPMLL01 -! -!!$ ZFNEG(:,IJB-1:IJE,:) = ZQL(:,IJB-1:IJE,:) - 0.5*ZCR(:,IJB-1:IJE,:) * & -!!$ ( ZDQ(:,IJB-1:IJE,:) + (1.0 + 2.0*ZCR(:,IJB-1:IJE,:)/3.0) * & -!!$ ZQ6(:,IJB-1:IJE,:) ) + !#acc region ZFNEG(IIW:IIA,:,:) = ZQL(IIW:IIA,:,:) - 0.5*ZCR(IIW:IIA,:,:) * & ( ZDQ(IIW:IIA,:,:) + (1.0 + 2.0*ZCR(IIW:IIA,:,:)/3.0) * ZQ6(IIW:IIA,:,:) ) + !#acc end region + +!!$ !#acc region +!!$ DO K=1,IKU ; DO J=1,IJU +!!$ !#acc do independent +!!$ DO I=IIW,IIA ; ZFNEG(I,J,K) = ZQL(I,J,K) - 0.5*ZCR(I,J,K) * & +!!$ ( ZDQ(I,J,K) + (1.0 + 2.0*ZCR(I,J,K)/3.0) * ZQ6(I,J,K) ) +!!$ ENDDO ; ENDDO ; ENDDO +!!$ !#acc end region ! - CALL GET_HALO(ZFNEG,HDIR="01_Y") -! -! advection flux at open boundary when u(IJE+1) < 0 -! -! NORTH BOUND -! - IF (LNORTH_ll()) THEN - ZFNEG(IIW:IIA,IJE+1,:) = (ZQR(IIW:IIA,IJE,:)-PSRC(IIW:IIA,IJE+1,:))*ZCR(IIW:IIA,IJE+1,:) + & - ZQR(IIW:IIA,IJE,:) - ENDIF -! -! advect the actual field in X direction by U*dt -! - PR = DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) -! - CALL GET_HALO(PR,HDIR="01_Y") -! -! -END SELECT -! -CONTAINS -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -! ######################################################################## - FUNCTION DIF2Y(PQ) RESULT(DQ) -! ######################################################################## -!! -!!**** DIF2Y - leap-frog difference operator in Y direction -!! -!! Calculates the difference assuming periodic BC (CYCL). -!! -!! DQ(J) = 0.5 * (PQ(J+1) - PQ(J-1)) -!! -!! -!! MODIFICATIONS -!! ------------- -!! -!! 18.3.2006. T. Maric - original version, works only for periodic boundary -!! conditions and on one domain -!! -!------------------------------------------------------------------------------- -! -! -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ -REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IIB,IJB ! Begining useful area in x,y directions -INTEGER :: IIE,IJE ! End useful area in x,y directions -! -!------------------------------------------------------------------------------- -! -!* 1.0. COMPUTE THE DOMAIN DIMENSIONS -! ----------------------------- + !TEMPO_JUAN CALL GET_HALO(ZFNEG,HDIR="01_Y") ! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +! advection flux at open boundary when u(IJE+1) < 0 ! -!------------------------------------------------------------------------------- +! NORTH BOUND ! -!* 2.0. COMPUTE THE DIFFERENCE -! ---------------------- + IF (GNORTH) THEN + !#acc region + ZFNEG(IIW:IIA,IJE+1,:) = (ZQR(IIW:IIA,IJE,:)-PSRC(IIW:IIA,IJE+1,:))*ZCR(IIW:IIA,IJE+1,:) + & + ZQR(IIW:IIA,IJE,:) + !#acc end region + ENDIF +!!$! +!!$! advect the actual field in X direction by U*dt +!!$! + !#acc region + mym(ZQL,PRHO) + ZQR = ZCR* ZQL*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + ZFNEG*(0.5-SIGN(0.5,ZCR)) ) + dyf(PR,ZQR) + !#acc end region + +!!$ PR = ZDMQ + ZQL0 + ZDQ + ZQ60 + ZQL + ZQR + ZQ6 + ZQR0 + ZFPOS + ZFNEG + +!!$ PR = DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +!!$! + +!$acc end region +! acc update host (pr) +!$acc end data region + + CALL GET_HALO(PR,HDIR="01_Y") + ! -DQ(:,IJB:IJE,:) = PQ(:,IJB+1:IJE+1,:) - PQ(:,IJB-1:IJE-1,:) -DQ(:,IJB-1,:) = PQ(:,IJB,:) - PQ(:,IJE-1,:) -DQ(:,IJE+1,:) = PQ(:,IJB+1,:) - PQ(:,IJE,:) -DQ = 0.5 * DQ +!!$END SELECT + + ! -END FUNCTION DIF2Y +!!$CONTAINS +!!$! +!!$!------------------------------------------------------------------------------- +!!$!------------------------------------------------------------------------------- +!!$! +!!$! ######################################################################## +!!$ FUNCTION DIF2Y(PQ) RESULT(DQ) +!!$! ######################################################################## +!!$!! +!!$!!**** DIF2Y - leap-frog difference operator in Y direction +!!$!! +!!$!! Calculates the difference assuming periodic BC (CYCL). +!!$!! +!!$!! DQ(J) = 0.5 * (PQ(J+1) - PQ(J-1)) +!!$!! +!!$!! +!!$!! MODIFICATIONS +!!$!! ------------- +!!$!! +!!$!! 18.3.2006. T. Maric - original version, works only for periodic boundary +!!$!! conditions and on one domain +!!$!! +!!$!------------------------------------------------------------------------------- +!!$! +!!$! +!!$USE MODE_ll +!!$! +!!$IMPLICIT NONE +!!$! +!!$!* 0.1 Declarations of dummy arguments : +!!$! +!!$REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ +!!$REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ +!!$! +!!$!* 0.2 Declarations of local variables : +!!$! +!!$INTEGER :: IIB,IJB ! Begining useful area in x,y directions +!!$INTEGER :: IIE,IJE ! End useful area in x,y directions +!!$! +!!$!------------------------------------------------------------------------------- +!!$! +!!$!* 1.0. COMPUTE THE DOMAIN DIMENSIONS +!!$! ----------------------------- +!!$! +!!$CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +!!$! +!!$!------------------------------------------------------------------------------- +!!$! +!!$!* 2.0. COMPUTE THE DIFFERENCE +!!$! ---------------------- +!!$! +!!$DQ(:,IJB:IJE,:) = PQ(:,IJB+1:IJE+1,:) - PQ(:,IJB-1:IJE-1,:) +!!$DQ(:,IJB-1,:) = PQ(:,IJB,:) - PQ(:,IJE-1,:) +!!$DQ(:,IJE+1,:) = PQ(:,IJB+1,:) - PQ(:,IJE,:) +!!$DQ = 0.5 * DQ +!!$! +!!$END FUNCTION DIF2Y ! END FUNCTION PPM_01_Y ! @@ -1109,6 +1213,17 @@ REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZQL0,ZQR0,ZQ60 ! advection fluxes REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZFPOS, ZFNEG ! +!JUAN ACC +INTEGER :: I,J,K ,IIU,IJU,IKU +LOGICAL :: GWEST , GEAST +! inline shuman with macro +#define dif2z(DQ,PQ) DQ(:,:,IKB:IKE) = 0.5*(PQ(:,:,IKB+1:IKE+1) - PQ(:,:,IKB-1:IKE-1)) ; \ +DQ(:,:,IKB-1) = -DQ(:,:,IKB) ;\ +DQ(:,:,IKE+1) = -DQ(:,:,IKE) ! DIF2Z(DQ,PQ) +#define dzf(PDZF,PA) PDZF(:,:,1:IKU-1) = PA(:,:,2:IKU) - PA(:,:,1:IKU-1) ; PDZF(:,:,IKU) = -999. ! DZF(PDZF,PA) +#define mzm(PMZM,PA) PMZM(:,:,2:IKU) = 0.5*( PA(:,:,2:IKU)+PA(:,:,1:IKU-1) ) ; PMZM(:,:,1) = -999. ! MZM(PMZM,PA) +!JUAN ACC +! !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS @@ -1116,6 +1231,14 @@ REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZFPOS, ZFNEG ! IKB = 1 + JPVEXT IKE = SIZE(PSRC,3) - JPVEXT + +IIU=size(psrc,1) +IJU=size(psrc,2) +IKU=size(psrc,3) + + +!$acc data region local (ZDMQ,ZQL0,ZQR0,ZDQ,ZQ60,ZQL,ZQR,ZQ6,ZFPOS,ZFNEG) copyin (psrc,zcr,prho) copyout(pr) +!$acc region ! !------------------------------------------------------------------------------- ! @@ -1123,7 +1246,8 @@ IKE = SIZE(PSRC,3) - JPVEXT ! -------------------------------- ! ! calculate dmq -ZDMQ = DIF2Z(PSRC) +!! ZDMQ = DIF2Z(PSRC) + dif2z(ZDMQ,PSRC) ! ! monotonize the difference followinq eq. 5 in Lin94 ! use the periodic BC here, it doesn't matter for vertical (hopefully) @@ -1166,19 +1290,21 @@ ZQ6 = ZQ60 ! ! eliminate over and undershoots and create qL and qR as in Lin96 ! -WHERE ( ZDMQ == 0.0 ) - ZQL = PSRC - ZQR = PSRC - ZQ6 = 0.0 -ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 ) - ZQ6 = 3.0*(ZQL0 - PSRC) - ZQR = ZQL0 - ZQ6 - ZQL = ZQL0 -ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) - ZQ6 = 3.0*(ZQR0 - PSRC) - ZQL = ZQR0 - ZQ6 - ZQR = ZQR0 -END WHERE + WHERE ( ZDMQ == 0.0 ) + ZQL = PSRC + ZQR = PSRC + ZQ6 = 0.0 + END WHERE + WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ < -(ZDQ)**2 ) ) + ZQ6 = 3.0*(ZQL0 - PSRC) + ZQR = ZQL0 - ZQ6 + ZQL = ZQL0 + END WHERE + WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ > (ZDQ)**2 ) ) + ZQ6 = 3.0*(ZQR0 - PSRC) + ZQL = ZQR0 - ZQ6 + ZQR = ZQR0 + END WHERE ! ! recalculate coefficients of the parabolae ! @@ -1208,71 +1334,82 @@ ZFNEG(:,:,IKE+1) = (ZQR(:,:,IKE)-PSRC(:,:,IKE+1))*ZCR(:,:,IKE+1) + & ! ! advect the actual field in Z direction by W*dt ! -PR = DZF( ZCR*MZM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) + + mzm(ZQL,PRHO) + ZQR = ZCR* ZQL*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + ZFNEG*(0.5-SIGN(0.5,ZCR)) ) + dzf(PR,ZQR) + +!!$PR = DZF( ZCR*MZM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) + + +!$acc end region +! acc update host (pr) +!$acc end data region + CALL GET_HALO(PR) CALL MPPDB_CHECK3DM("PPM::PPM_01_Z ::PR",PRECISION,PR) ! -CONTAINS -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -! ######################################################################## - FUNCTION DIF2Z(PQ) RESULT(DQ) -! ######################################################################## -!! -!!**** DIF2Z - leap-frog difference operator in Z direction -!! -!! Calculates the difference assuming periodic BC (CYCL). -!! -!! DQ(K) = 0.5 * (PQ(K+1) - PQ(K-1)) -!! -!! -!! MODIFICATIONS -!! ------------- -!! -!! 18.3.2006. T. Maric - original version -!! -!------------------------------------------------------------------------------- -! -! -USE MODE_ll -USE MODD_CONF -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ -REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IKB ! Begining useful area in z directions -INTEGER :: IKE ! End useful area in z directions -! -!------------------------------------------------------------------------------- -! -!* 1.0. COMPUTE THE DOMAIN DIMENSIONS -! ----------------------------- -! -!CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PQ,3) - JPVEXT -! -!------------------------------------------------------------------------------- -! -!* 2.0. COMPUTE THE DIFFERENCE -! ---------------------- -! -DQ(:,:,IKB:IKE) = PQ(:,:,IKB+1:IKE+1) - PQ(:,:,IKB-1:IKE-1) -DQ(:,:,IKB-1) = -DQ(:,:,IKB) -DQ(:,:,IKE+1) = -DQ(:,:,IKE) -DQ = 0.5 * DQ -! -END FUNCTION DIF2Z +!!$CONTAINS +!!$! +!!$!------------------------------------------------------------------------------- +!!$!------------------------------------------------------------------------------- +!!$! +!!$! ######################################################################## +!!$ FUNCTION DIF2Z(PQ) RESULT(DQ) +!!$! ######################################################################## +!!$!! +!!$!!**** DIF2Z - leap-frog difference operator in Z direction +!!$!! +!!$!! Calculates the difference assuming periodic BC (CYCL). +!!$!! +!!$!! DQ(K) = 0.5 * (PQ(K+1) - PQ(K-1)) +!!$!! +!!$!! +!!$!! MODIFICATIONS +!!$!! ------------- +!!$!! +!!$!! 18.3.2006. T. Maric - original version +!!$!! +!!$!------------------------------------------------------------------------------- +!!$! +!!$! +!!$USE MODE_ll +!!$USE MODD_CONF +!!$USE MODD_PARAMETERS +!!$! +!!$IMPLICIT NONE +!!$! +!!$!* 0.1 Declarations of dummy arguments : +!!$! +!!$REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ +!!$REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ +!!$! +!!$!* 0.2 Declarations of local variables : +!!$! +!!$INTEGER :: IKB ! Begining useful area in z directions +!!$INTEGER :: IKE ! End useful area in z directions +!!$! +!!$!------------------------------------------------------------------------------- +!!$! +!!$!* 1.0. COMPUTE THE DOMAIN DIMENSIONS +!!$! ----------------------------- +!!$! +!!$!CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +!!$IKB = 1 + JPVEXT +!!$IKE = SIZE(PQ,3) - JPVEXT +!!$! +!!$!------------------------------------------------------------------------------- +!!$! +!!$!* 2.0. COMPUTE THE DIFFERENCE +!!$! ---------------------- +!!$! +!!$DQ(:,:,IKB:IKE) = PQ(:,:,IKB+1:IKE+1) - PQ(:,:,IKB-1:IKE-1) +!!$DQ(:,:,IKB-1) = -DQ(:,:,IKB) +!!$DQ(:,:,IKE+1) = -DQ(:,:,IKE) +!!$DQ = 0.5 * DQ +!!$! +!!$END FUNCTION DIF2Z ! END FUNCTION PPM_01_Z ! @@ -1305,6 +1442,7 @@ USE MODD_CONF USE MODD_LUNIT USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll !END JUAN PPM_LL +USE MODD_PARAMETERS, ONLY : JPHEXT USE MODE_MPPDB ! IMPLICIT NONE @@ -1340,6 +1478,14 @@ TYPE(HALO2LIST_ll), POINTER :: TZ_PSRC_HALO2_ll ! halo2 for PSRC INTEGER :: ILUOUT,IRESP ! for prints INTEGER :: IJS,IJN !END JUAN PPM_LL +!JUAN ACC +REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZRHO_MXM , ZCR_MXM , ZCR_DXF +INTEGER :: I,J,K ,IIU,IJU,IKU +LOGICAL :: GWEST , GEAST +! inline shuman with macro +#define dxf(PDXF,PA) PDXF(1:IIU-1,:,:) = PA(2:IIU,:,:) - PA(1:IIU-1,:,:) ; PDXF(IIU,:,:) = PDXF(2*JPHEXT,:,:) ! DXF(PDXF,PA) +#define mxm(PMXM,PA) PMXM(2:IIU,:,:) = 0.5*( PA(2:IIU,:,:)+PA(1:IIU-1,:,:) ) ; PMXM(1,:,:) = PMXM(IIU-2*JPHEXT+1,:,:) ! MXM(PMXM,PA) +!JUAN ACC !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS @@ -1348,8 +1494,14 @@ INTEGER :: IJS,IJN CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IJS=IJB IJN=IJE -!!$IJS=IJB-1 -!!$IJN=IJE+1 + +IIU=size(psrc,1) +IJU=size(psrc,2) +IKU=size(psrc,3) + +GWEST = LWEST_ll() +GEAST = LEAST_ll() + ! !BEG JUAN PPM_LL ! @@ -1366,11 +1518,12 @@ IF(NHALO /= 1) THEN ENDIF ! CALL GET_HALO2(PSRC,TZ_PSRC_HALO2_ll) +!$acc data region local (PR,ZPHAT,ZFPOS,ZFNEG,ZRHO_MXM,ZCR_MXM,ZCR_DXF) copyin (psrc,zcr,prho) +!$acc region ZPHAT=PSRC ZFPOS=PSRC ZFNEG=PSRC PR=PSRC -!!$! ! !END JUAN PPM_LL !------------------------------------------------------------------------------- @@ -1389,132 +1542,98 @@ ZPHAT(IIB+1:IIE,IJS:IJN,:) = ( 7.0 * & ( PSRC(IIB+1:IIE ,IJS:IJN,:) + PSRC(IIB :IIE-1,IJS:IJN,:) ) - & ( PSRC(IIB+2:IIE+1,IJS:IJN,:) + PSRC(IIB-1:IIE-2,IJS:IJN,:) ) ) / 12.0 ! -SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side -CASE ('CYCL','WALL') ! In that case one must have HLBCX(1) == HLBCX(2) -! -!!$ ZPHAT(IIB,:,:) = (7.0 * & -!!$ (PSRC(IIB,:,:) + PSRC(IIB-1,:,:)) - & -!!$ (PSRC(IIB+1,:,:) + PSRC(IIE-1,:,:))) / 12.0 +!!$SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side +!!$CASE ('CYCL','WALL') ! In that case one must have HLBCX(1) == HLBCX(2) +!!$! +!!$! +!!$! WEST BOUND +!!$! WEST BOUND +!!$! i=IIB ( need halo2 psrc(iib-2) ) +!!$! ZPATH(IIB) = Fct[ PSRC(IIB),PSRC(IIB-1),PSRC(IIB+1),PSRC(IIB-2) ] +!!$! +!!$! +!!$ ZPHAT(IIB ,IJS:IJN,:) = ( 7.0 * & +!!$ ( PSRC(IIB ,IJS:IJN,:) + PSRC(IIB-1,IJS:IJN,:) ) - & +!!$ ( PSRC(IIB+1,IJS:IJN,:) + TZ_PSRC_HALO2_ll%HALO2%WEST(IJS:IJN,:) ) ) / 12.0 +!!$! <=> WEST BOUND ( PSRC(IIB+1,IJS:IJN,:) + PSRC(IIB-2,IJS:IJN,:) ) ) / 12.0 +!!$! +!!$! The ZPHAT(IIB-1,:,:) doesn't matter only define an realistic value +!!$! +!!$! +!!$! EAST BOUND +!!$! +!!$! The ZPHAT(IIE+1,:,:) doesn't matter only define an realistic value +!!$! +!!$! +!!$! update ZPHAT HALO before next/further utilisation +!!$! +!!$! /!\ not needed if ZPHAT(IIB-1) & ZPHAT(IIE+1) doen't matter ??? +!!$! +!!$CALL GET_HALO(ZPHAT,HDIR="Z0_X") !!$ +!!$ ZFPOS(IIB:IIE,IJS:IJN,:) = ZPHAT(IIB:IIE,IJS:IJN,:) - & +!!$ ZCR(IIB:IIE,IJS:IJN,:)*(ZPHAT(IIB:IIE,IJS:IJN,:) - PSRC(IIB-1:IIE-1,IJS:IJN,:)) - & +!!$ ZCR(IIB:IIE,IJS:IJN,:)*(1.0 - ZCR(IIB:IIE,IJS:IJN,:)) * & +!!$ (ZPHAT(IIB-1:IIE-1,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE-1,IJS:IJN,:) + ZPHAT(IIB:IIE,IJS:IJN,:)) !!$! -!!$ ZPHAT(IIE+1,:,:) = ZPHAT(IIB,:,:) -!!$ ZPHAT(IIB-1,:,:) = ZPHAT(IIE,:,:) -! -! WEST BOUND -! i=IIB ( need halo2 psrc(iib-2) ) -! ZPATH(IIB) = Fct[ PSRC(IIB),PSRC(IIB-1),PSRC(IIB+1),PSRC(IIB-2) ] -! - ZPHAT(IIB ,IJS:IJN,:) = ( 7.0 * & - ( PSRC(IIB ,IJS:IJN,:) + PSRC(IIB-1,IJS:IJN,:) ) - & - ( PSRC(IIB+1,IJS:IJN,:) + TZ_PSRC_HALO2_ll%HALO2%WEST(IJS:IJN,:) ) ) / 12.0 -! <=> WEST BOUND ( PSRC(IIB+1,IJS:IJN,:) + PSRC(IIB-2,IJS:IJN,:) ) ) / 12.0 -! -! The ZPHAT(IIB-1,:,:) doesn't matter only define an realistic value -! -!!$ ZPHAT(IIB-1,:,:) = ZPHAT(IIB,:,:) ! JUANTEST1 already done at init by ZPHAT = PSRC +!!$! +!!$CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN +!!$! +!!$ ZFNEG(IIB:IIE,IJS:IJN,:) = ZPHAT(IIB:IIE,IJS:IJN,:) + & +!!$ ZCR(IIB:IIE,IJS:IJN,:)*(ZPHAT(IIB:IIE,IJS:IJN,:) - PSRC(IIB:IIE,IJS:IJN,:)) + & +!!$ ZCR(IIB:IIE,IJS:IJN,:)*(1.0 + ZCR(IIB:IIE,IJS:IJN,:)) * & +!!$ (ZPHAT(IIB:IIE,IJS:IJN,:) - 2.0*PSRC(IIB:IIE,IJS:IJN,:) + ZPHAT(IIB+1:IIE+1,IJS:IJN,:)) +!!$! +!!$! define fluxes for CYCL BC outside physical domain +!!$! +!!$CALL GET_HALO(ZFNEG,HDIR="Z0_X") ! JUAN +!!$! +!!$! calculate the advection +!!$! +!!$ PR = PSRC * PRHO - & +!!$ DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +!!$ CALL GET_HALO(PR,HDIR="S0_X") ! JUAN +!!$ CALL MPPDB_CHECK3DM("PPM::PPM_S0_X CYCL ::PR",PRECISION,PR) +!!$! +!!$CASE ('OPEN') ! -! EAST BOUND ! -! The ZPHAT(IIE+1,:,:) doesn't matter only define an realistic value +! WEST BOUND ! -!!$ ZPHAT(IIE+1,:,:) = ZPHAT(IIE,:,:) ! JUANTEST1 +!TEMPO_JUAN IF (.NOT. GWEST) THEN +!TEMPO_JUAN ZPHAT(IIB ,IJS:IJN,:) = ( 7.0 * & +!TEMPO_JUAN ( PSRC(IIB ,IJS:IJN,:) + PSRC(IIB-1,IJS:IJN,:) ) - & +!TEMPO_JUAN ( PSRC(IIB+1,IJS:IJN,:) + TZ_PSRC_HALO2_ll%HALO2%WEST(IJS:IJN,:) ) ) / 12.0 +!TEMPO_JUAN! <=> WEST BOUND ( PSRC(IIB+1,IJS:IJN,:) + PSRC(IIB-2,IJS:IJN,:) ) ) / 12.0 +!TEMPO_JUAN ENDIF ! ! update ZPHAT HALO before next/further utilisation ! -! /!\ not needed if ZPHAT(IIB-1) & ZPHAT(IIE+1) doen't matter ??? -! -CALL GET_HALO(ZPHAT,HDIR="Z0_X") -! -!!$ ZFPOS(IIB:IIE+1,IJS:IJN,:) = ZPHAT(IIB:IIE+1,IJS:IJN,:) - & -!!$ ZCR(IIB:IIE+1,IJS:IJN,:)*(ZPHAT(IIB:IIE+1,IJS:IJN,:) - PSRC(IIB-1:IIE,IJS:IJN,:)) - & -!!$ ZCR(IIB:IIE+1,IJS:IJN,:)*(1.0 - ZCR(IIB:IIE+1,IJS:IJN,:)) * & -!!$ (ZPHAT(IIB-1:IIE,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE,IJS:IJN,:) + ZPHAT(IIB:IIE+1,IJS:IJN,:)) -! - ZFPOS(IIB:IIE,IJS:IJN,:) = ZPHAT(IIB:IIE,IJS:IJN,:) - & - ZCR(IIB:IIE,IJS:IJN,:)*(ZPHAT(IIB:IIE,IJS:IJN,:) - PSRC(IIB-1:IIE-1,IJS:IJN,:)) - & - ZCR(IIB:IIE,IJS:IJN,:)*(1.0 - ZCR(IIB:IIE,IJS:IJN,:)) * & - (ZPHAT(IIB-1:IIE-1,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE-1,IJS:IJN,:) + ZPHAT(IIB:IIE,IJS:IJN,:)) -! -!!$ ZFPOS(IIB-1,:,:) = ZFPOS(IIE,:,:) !JUAN -! -CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN -! -!!$ ZFNEG(IIB-1:IIE,IJS:IJN,:) = ZPHAT(IIB-1:IIE,IJS:IJN,:) + & -!!$ ZCR(IIB-1:IIE,IJS:IJN,:)*(ZPHAT(IIB-1:IIE,IJS:IJN,:) - PSRC(IIB-1:IIE,IJS:IJN,:)) + & -!!$ ZCR(IIB-1:IIE,IJS:IJN,:)*(1.0 + ZCR(IIB-1:IIE,IJS:IJN,:)) * & -!!$ (ZPHAT(IIB-1:IIE,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE,IJS:IJN,:) + ZPHAT(IIB:IIE+1,IJS:IJN,:)) -! - ZFNEG(IIB:IIE,IJS:IJN,:) = ZPHAT(IIB:IIE,IJS:IJN,:) + & - ZCR(IIB:IIE,IJS:IJN,:)*(ZPHAT(IIB:IIE,IJS:IJN,:) - PSRC(IIB:IIE,IJS:IJN,:)) + & - ZCR(IIB:IIE,IJS:IJN,:)*(1.0 + ZCR(IIB:IIE,IJS:IJN,:)) * & - (ZPHAT(IIB:IIE,IJS:IJN,:) - 2.0*PSRC(IIB:IIE,IJS:IJN,:) + ZPHAT(IIB+1:IIE+1,IJS:IJN,:)) -! -! -! define fluxes for CYCL BC outside physical domain -!!$ ZFNEG(IIE+1,:,:) = ZFNEG(IIB,:,:) !JUAN -! -CALL GET_HALO(ZFNEG,HDIR="Z0_X") ! JUAN -! -! calculate the advection -! - PR = PSRC * PRHO - & - DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) -! - CALL GET_HALO(PR,HDIR="S0_X") - CALL MPPDB_CHECK3DM("PPM::PPM_S0_X CYCL ::PR",PRECISION,PR) -! -CASE ('OPEN') -! -!!$ ZPHAT(IIB,:,:) = 0.5*(PSRC(IIB-1,:,:) + PSRC(IIB,:,:)) -!!$ ZPHAT(IIB-1,:,:) = ZPHAT(IIB,:,:) ! not used -!!$ ZPHAT(IIE+1,:,:) = 0.5*(PSRC(IIE,:,:) + PSRC(IIE+1,:,:)) -! -! WEST BOUND +!TEMPO_JUAN CALL GET_HALO(ZPHATT,HDIR="Z0_X") ! - IF (.NOT. LWEST_ll()) THEN - ZPHAT(IIB ,IJS:IJN,:) = ( 7.0 * & - ( PSRC(IIB ,IJS:IJN,:) + PSRC(IIB-1,IJS:IJN,:) ) - & - ( PSRC(IIB+1,IJS:IJN,:) + TZ_PSRC_HALO2_ll%HALO2%WEST(IJS:IJN,:) ) ) / 12.0 -! <=> WEST BOUND ( PSRC(IIB+1,IJS:IJN,:) + PSRC(IIB-2,IJS:IJN,:) ) ) / 12.0 - ENDIF -! -CALL GET_HALO(ZPHAT,HDIR="Z0_X") -! - IF (LWEST_ll()) THEN + IF (GWEST) THEN ZPHAT(IIB ,IJS:IJN,:) = 0.5*(PSRC(IIB-1,IJS:IJN,:) + PSRC(IIB,IJS:IJN,:)) ZPHAT(IIB-1,IJS:IJN,:) = ZPHAT(IIB,IJS:IJN,:) ENDIF ! ! EAST BOUND ! - IF (LEAST_ll()) THEN + IF (GEAST) THEN ZPHAT(IIE+1,IJS:IJN,:) = 0.5*(PSRC(IIE,IJS:IJN,:) + PSRC(IIE+1,IJS:IJN,:)) ENDIF ! -! update ZPHAT HALO before next/further utilisation -! -!!$CALL GET_HALO(ZPHAT) -! -!!$ ZFPOS(IIB+1:IIE+1,:,:) = ZPHAT(IIB+1:IIE+1,:,:) - & -!!$ ZCR(IIB+1:IIE+1,:,:)*(ZPHAT(IIB+1:IIE+1,:,:) - PSRC(IIB:IIE,:,:)) - & -!!$ ZCR(IIB+1:IIE+1,:,:)*(1.0 - ZCR(IIB+1:IIE+1,:,:)) * & -!!$ (ZPHAT(IIB:IIE,:,:) - 2.0*PSRC(IIB:IIE,:,:) + ZPHAT(IIB+1:IIE+1,:,:)) +! update ZPHAT HALO before next/further utilisation ! -!!$ ZFPOS(IIB:IIE+1,IJS:IJN,:) = ZPHAT(IIB:IIE+1,IJS:IJN,:) - & -!!$ ZCR(IIB:IIE+1,IJS:IJN,:)*(ZPHAT(IIB:IIE+1,IJS:IJN,:) - PSRC(IIB-1:IIE,IJS:IJN,:)) - & -!!$ ZCR(IIB:IIE+1,IJS:IJN,:)*(1.0 - ZCR(IIB:IIE+1,IJS:IJN,:)) * & -!!$ (ZPHAT(IIB-1:IIE,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE,IJS:IJN,:) + ZPHAT(IIB:IIE+1,IJS:IJN,:)) -!!$! ZFPOS(IIB:IIE,IJS:IJN,:) = ZPHAT(IIB:IIE,IJS:IJN,:) - & ZCR(IIB:IIE,IJS:IJN,:)*(ZPHAT(IIB:IIE,IJS:IJN,:) - PSRC(IIB-1:IIE-1,IJS:IJN,:)) - & ZCR(IIB:IIE,IJS:IJN,:)*(1.0 - ZCR(IIB:IIE,IJS:IJN,:)) * & (ZPHAT(IIB-1:IIE-1,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE-1,IJS:IJN,:) + ZPHAT(IIB:IIE,IJS:IJN,:)) ! -CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN +!TEMPO_JUAN CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN ! ! positive flux on the WEST boundary - IF (LWEST_ll()) THEN + IF (GWEST) THEN ZFPOS(IIB,IJS:IJN,:) = (PSRC(IIB-1,IJS:IJN,:) - ZPHAT(IIB,IJS:IJN,:))*ZCR(IIB,IJS:IJN,:) + & ZPHAT(IIB,IJS:IJN,:) ! this is not used @@ -1522,25 +1641,15 @@ CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN ENDIF ! ! negative fluxes -!!$ ZFNEG(IIB:IIE,:,:) = ZPHAT(IIB:IIE,:,:) + & -!!$ ZCR(IIB:IIE,:,:)*(ZPHAT(IIB:IIE,:,:) - PSRC(IIB:IIE,:,:)) + & -!!$ ZCR(IIB:IIE,:,:)*(1.0 + ZCR(IIB:IIE,:,:)) * & -!!$ (ZPHAT(IIB:IIE,:,:) - 2.0*PSRC(IIB:IIE,:,:) + ZPHAT(IIB+1:IIE+1,:,:)) -! -!!$ ZFNEG(IIB-1:IIE,IJS:IJN,:) = ZPHAT(IIB-1:IIE,IJS:IJN,:) + & -!!$ ZCR(IIB-1:IIE,IJS:IJN,:)*(ZPHAT(IIB-1:IIE,IJS:IJN,:) - PSRC(IIB-1:IIE,IJS:IJN,:)) + & -!!$ ZCR(IIB-1:IIE,IJS:IJN,:)*(1.0 + ZCR(IIB-1:IIE,IJS:IJN,:)) * & -!!$ (ZPHAT(IIB-1:IIE,IJS:IJN,:) - 2.0*PSRC(IIB-1:IIE,IJS:IJN,:) + ZPHAT(IIB:IIE+1,IJS:IJN,:)) -! + ZFNEG(IIB:IIE,IJS:IJN,:) = ZPHAT(IIB:IIE,IJS:IJN,:) + & ZCR(IIB:IIE,IJS:IJN,:)*(ZPHAT(IIB:IIE,IJS:IJN,:) - PSRC(IIB:IIE,IJS:IJN,:)) + & ZCR(IIB:IIE,IJS:IJN,:)*(1.0 + ZCR(IIB:IIE,IJS:IJN,:)) * & (ZPHAT(IIB:IIE,IJS:IJN,:) - 2.0*PSRC(IIB:IIE,IJS:IJN,:) + ZPHAT(IIB+1:IIE+1,IJS:IJN,:)) ! +!TEMPO_JUAN CALL GET_HALO(ZFNEG,HDIR="Z0_X") ! JUAN ! - CALL GET_HALO(ZFNEG,HDIR="Z0_X") ! JUAN -! - IF (LEAST_ll()) THEN + IF (GEAST) THEN ! ! in OPEN case ZCR(IIB-1) is not used, so we also set ZFNEG(IIB-1) = 0 ! @@ -1555,13 +1664,18 @@ CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN ! ! calculate the advection ! - PR = PSRC * PRHO - & - DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) + mxm(ZRHO_MXM,PRHO) + ZCR_MXM = ZCR* ZRHO_MXM*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + ZFNEG*(0.5-SIGN(0.5,ZCR)) ) + dxf(ZCR_DXF,ZCR_MXM) + PR = PSRC * PRHO - ZCR_DXF +!!$ PR = PSRC * PRHO - & +!!$ DXF( ZCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +! ! ! in OPEN case fix boundary conditions ! - IF (LWEST_ll()) THEN + IF (GWEST) THEN WHERE ( ZCR(IIB,IJS:IJN,:) <= 0. ) ! OUTFLOW condition PR(IIB-1,IJS:IJN,:) = 2.*PR(IIB,IJS:IJN,:) - PR(IIB+1,IJS:IJN,:) ELSEWHERE @@ -1569,18 +1683,22 @@ CALL GET_HALO(ZFPOS,HDIR="Z0_X") ! JUAN END WHERE ENDIF ! - IF (LEAST_ll()) THEN + IF (GEAST) THEN WHERE ( ZCR(IIE,IJS:IJN,:) >= 0. ) ! OUTFLOW condition PR(IIE+1,IJS:IJN,:) = 2.*PR(IIE,IJS:IJN,:) - PR(IIE-1,IJS:IJN,:) ELSEWHERE PR(IIE+1,IJS:IJN,:) = PR(IIE,IJS:IJN,:) END WHERE ENDIF + +!$acc end region +!$acc update host (pr) +!$acc end data region ! CALL GET_HALO(PR,HDIR="S0_X") CALL MPPDB_CHECK3DM("PPM::PPM_S0_X OPEN ::PR",PRECISION,PR) -! -END SELECT +!!$! +!!$END SELECT ! !------------------------------------------------------------------------------- CALL DEL_HALO2_ll(TZ_PSRC_HALO2_ll) @@ -1613,6 +1731,7 @@ USE MODI_GET_HALO USE MODD_LUNIT USE MODD_CONF !USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +USE MODD_PARAMETERS, ONLY : JPHEXT USE MODE_MPPDB ! IMPLICIT NONE @@ -1649,6 +1768,14 @@ TYPE(HALO2LIST_ll), POINTER :: TZ_PHAT_HALO2_ll ! halo2 for ZPHAT INTEGER :: ILUOUT,IRESP ! for prints INTEGER :: IIW,IIA !END JUAN PPM_LL +!JUAN ACC +REAL, DIMENSION(SIZE(ZCR,1),SIZE(ZCR,2),SIZE(ZCR,3)) :: ZRHO_MYM , ZCR_MYM , ZCR_DYF +INTEGER :: I,J,K ,IIU,IJU,IKU +LOGICAL :: GSOUTH , GNORTH +! inline shuman with macro +#define dyf(PDYF,PA) PDYF(:,1:IJU-1,:) = PA(:,2:IJU,:) - PA(:,1:IJU-1,:); PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) ! DYF(PDYF,PA) +#define mym(PMYM,PA) PMYM(:,2:IJU,:) = 0.5*( PA(:,2:IJU,:)+PA(:,1:IJU-1,:) ) ; PMYM(:,1,:) = PMYM(:,IJU-2*JPHEXT+1,:) ! MYM(PMYM,PA) +!JUAN ACC ! !------------------------------------------------------------------------------- ! @@ -1658,8 +1785,14 @@ INTEGER :: IIW,IIA CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IIW=IIB IIA=IIE -!!$IIW=IIB-1 -!!$IIA=IIE+1 + +IIU=size(psrc,1) +IJU=size(psrc,2) +IKU=size(psrc,3) + +GSOUTH=LSOUTH_ll() +GNORTH=LNORTH_ll() + ! !------------------------------------------------------------------------------- ! @@ -1672,10 +1805,15 @@ CALL GET_HALO2(PSRC,TZ_PSRC_HALO2_ll) ! ! Initialize with relalistic value all work array ! +!$acc data region local(PR,ZPHAT,ZFPOS,ZFNEG,ZRHO_MYM,ZCR_MYM,ZCR_DYF) copyin (psrc,zcr,prho) +!$acc region + ZPHAT=PSRC ZFPOS=PSRC ZFNEG=PSRC PR=PSRC +! acc end region +! acc end data region ! !------------------------------------------------------------------------------- ! @@ -1685,130 +1823,96 @@ ZPHAT(IIW:IIA,IJB+1:IJE,:) = (7.0 * & (PSRC(IIW:IIA,IJB+1:IJE,:) + PSRC(IIW:IIA,IJB:IJE-1,:)) - & (PSRC(IIW:IIA,IJB+2:IJE+1,:) + PSRC(IIW:IIA,IJB-1:IJE-2,:))) / 12.0 ! -SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side -CASE ('CYCL','WALL') ! In that case one must have HLBCY(1) == HLBCY(2) -! -!!$ ZPHAT(:,IJB,:) = (7.0 * & -!!$ (PSRC(:,IJB,:) + PSRC(:,IJB-1,:)) - & -!!$ (PSRC(:,IJB+1,:) + PSRC(:,IJE-1,:))) / 12.0 +!!$SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side +!!$CASE ('CYCL','WALL') ! In that case one must have HLBCY(1) == HLBCY(2) !!$! -!!$ ZPHAT(:,IJE+1,:) = ZPHAT(:,IJB,:) -!!$ ZPHAT(:,IJB-1,:) = ZPHAT(:,IJE,:) -! -! SOUTH BOUND -! - ZPHAT(IIW:IIA,IJB,:) = ( 7.0 * & - ( PSRC(IIW:IIA,IJB ,:) + PSRC(IIW:IIA,IJB-1,:) ) - & - ( PSRC(IIW:IIA,IJB+1,:) + TZ_PSRC_HALO2_ll%HALO2%SOUTH(IIW:IIA,:) ) ) / 12.0 -! <=> SOUTH B ( PSRC(IIW:IIA,IJB+1,:) + PSRC(IIW:IIA,IJB-2,:) ) ) / 12.0 -! -! The ZPHAT(:,IJB-1,:) doesn't matter only define an realistic value -! -!!$ ZPHAT(:,IJB-1,:) = ZPHAT(:,IJB,:) -! -! NORTH BOUND -! -! The ZPHAT(:IJE+1,:) doesn't matter only define an realistic value -! -!!$ ZPHAT(:,IJE+1,:) = ZPHAT(:,IJE,:) -! -! update ZPHAT HALO before next/further utilisation -! -CALL GET_HALO(ZPHAT,HDIR="Z0_Y") -! -! calculate the fluxes: -! -!!$ ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZPHAT(IIW:IIA,IJB:IJE+1,:) - & -!!$ ZCR(IIW:IIA,IJB:IJE+1,:)*(ZPHAT(IIW:IIA,IJB:IJE+1,:) - PSRC(IIW:IIA,IJB-1:IJE,:)) - & -!!$ ZCR(IIW:IIA,IJB:IJE+1,:)*(1.0 - ZCR(IIW:IIA,IJB:IJE+1,:)) * & -!!$ (ZPHAT(IIW:IIA,IJB-1:IJE,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE,:) + ZPHAT(IIW:IIA,IJB:IJE+1,:)) -! - ZFPOS(IIW:IIA,IJB:IJE,:) = ZPHAT(IIW:IIA,IJB:IJE,:) - & - ZCR(IIW:IIA,IJB:IJE,:)*(ZPHAT(IIW:IIA,IJB:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE-1,:)) - & - ZCR(IIW:IIA,IJB:IJE,:)*(1.0 - ZCR(IIW:IIA,IJB:IJE,:)) * & - (ZPHAT(IIW:IIA,IJB-1:IJE-1,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE-1,:) + ZPHAT(IIW:IIA,IJB:IJE,:)) -! -!!$ ZFPOS(:,IJB-1,:) = ZFPOS(:,IJE,:) -CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN -! -!!$ ZFNEG(IIW:IIA,IJB-1:IJE,:) = ZPHAT(IIW:IIA,IJB-1:IJE,:) + & -!!$ ZCR(IIW:IIA,IJB-1:IJE,:)*(ZPHAT(IIW:IIA,IJB-1:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE,:)) + & -!!$ ZCR(IIW:IIA,IJB-1:IJE,:)*(1.0 + ZCR(IIW:IIA,IJB-1:IJE,:)) * & -!!$ (ZPHAT(IIW:IIA,IJB-1:IJE,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE,:) +ZPHAT(IIW:IIA,IJB:IJE+1,:)) -! - ZFNEG(IIW:IIA,IJB:IJE,:) = ZPHAT(IIW:IIA,IJB:IJE,:) + & - ZCR(IIW:IIA,IJB:IJE,:)*(ZPHAT(IIW:IIA,IJB:IJE,:) - PSRC(IIW:IIA,IJB:IJE,:)) + & - ZCR(IIW:IIA,IJB:IJE,:)*(1.0 + ZCR(IIW:IIA,IJB:IJE,:)) * & - (ZPHAT(IIW:IIA,IJB:IJE,:) - 2.0*PSRC(IIW:IIA,IJB:IJE,:) +ZPHAT(IIW:IIA,IJB+1:IJE+1,:)) -! -! -! define fluxes for CYCL BC outside physical domain -!!$ ZFNEG(:,IJE+1,:) = ZFNEG(:,IJB,:) -CALL GET_HALO(ZFNEG,HDIR="Z0_Y") ! JUAN -! -! calculate the advection -! - PR = PSRC * PRHO - & - DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) - CALL GET_HALO(PR,HDIR="S0_Y") - CALL MPPDB_CHECK3DM("PPM::PPM_S0_Y CYCL ::PR",PRECISION,PR) -! -CASE ('OPEN') -! -!!$ ZPHAT(:,IJB,:) = 0.5*(PSRC(:,IJB-1,:) + PSRC(:,IJB,:)) -!!$ ZPHAT(:,IJB-1,:) = ZPHAT(:,IJB,:) ! not used -!!$ ZPHAT(:,IJE+1,:) = 0.5*(PSRC(:,IJE,:) + PSRC(:,IJE+1,:)) +!!$! +!!$! SOUTH BOUND +!!$! +!!$ ZPHAT(IIW:IIA,IJB,:) = ( 7.0 * & +!!$ ( PSRC(IIW:IIA,IJB ,:) + PSRC(IIW:IIA,IJB-1,:) ) - & +!!$ ( PSRC(IIW:IIA,IJB+1,:) + TZ_PSRC_HALO2_ll%HALO2%SOUTH(IIW:IIA,:) ) ) / 12.0 +!!$! <=> SOUTH B ( PSRC(IIW:IIA,IJB+1,:) + PSRC(IIW:IIA,IJB-2,:) ) ) / 12.0 +!!$! +!!$! The ZPHAT(:,IJB-1,:) doesn't matter only define an realistic value +!!$! +!!$! NORTH BOUND +!!$! +!!$! The ZPHAT(:IJE+1,:) doesn't matter only define an realistic value +!!$! +!!$! +!!$! update ZPHAT HALO before next/further utilisation +!!$! +!!$CALL GET_HALO(ZPHAT,HDIR="Z0_Y") +!!$! +!!$! calculate the fluxes: +!!$! +!!$ ZFPOS(IIW:IIA,IJB:IJE,:) = ZPHAT(IIW:IIA,IJB:IJE,:) - & +!!$ ZCR(IIW:IIA,IJB:IJE,:)*(ZPHAT(IIW:IIA,IJB:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE-1,:)) - & +!!$ ZCR(IIW:IIA,IJB:IJE,:)*(1.0 - ZCR(IIW:IIA,IJB:IJE,:)) * & +!!$ (ZPHAT(IIW:IIA,IJB-1:IJE-1,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE-1,:) + ZPHAT(IIW:IIA,IJB:IJE,:)) +!!$! +!!$! +!!$CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN +!!$! +!!$ ZFPOS(IIW:IIA,IJB:IJE,:) = ZPHAT(IIW:IIA,IJB:IJE,:) - & +!!$ ZCR(IIW:IIA,IJB:IJE,:)*(ZPHAT(IIW:IIA,IJB:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE-1,:)) - & +!!$ ZCR(IIW:IIA,IJB:IJE,:)*(1.0 - ZCR(IIW:IIA,IJB:IJE,:)) * & +!!$ (ZPHAT(IIW:IIA,IJB-1:IJE-1,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE-1,:) + ZPHAT(IIW:IIA,IJB:IJE,:)) +!!$! +!!$! +!!$! define fluxes for CYCL BC outside physical domain +!!$CALL GET_HALO(ZFNEG,HDIR="Z0_Y") ! JUAN +!!$! +!!$! calculate the advection +!!$! +!!$ PR = PSRC * PRHO - & +!!$ DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +!!$ CALL GET_HALO(PR,HDIR="S0_Y") ! JUAN +!!$ CALL MPPDB_CHECK3DM("PPM::PPM_S0_Y CYCL ::PR",PRECISION,PR +!!$! +!!$CASE ('OPEN') ! ! ! SOUTH BOUND ! - IF ( .NOT. LSOUTH_ll()) THEN - ZPHAT(IIW:IIA,IJB ,:) = (7.0 * & - (PSRC(IIW:IIA,IJB ,:) + PSRC(IIW:IIA,IJB-1,:)) - & - (PSRC(IIW:IIA,IJB+1,:) + TZ_PSRC_HALO2_ll%HALO2%SOUTH(IIW:IIA,:) )) / 12.0 -! <=> SOUTH BOUND (PSRC(IIW:IIA,IJB+1,:) + PSRC(IIW:IIA,IJB-2,:) )) / 12.0 - ENDIF +!TEMPO_JUAN IF ( .NOT. GSOUTH) THEN +!TEMPO_JUAN ZPHAT(IIW:IIA,IJB ,:) = (7.0 * & +!TEMPO_JUAN (PSRC(IIW:IIA,IJB ,:) + PSRC(IIW:IIA,IJB-1,:)) - & +!TEMPO_JUAN (PSRC(IIW:IIA,IJB+1,:) + TZ_PSRC_HALO2_ll%HALO2%SOUTH(IIW:IIA,:) )) / 12.0 +!TEMPO_JUAN! <=> SOUTH BOUND (PSRC(IIW:IIA,IJB+1,:) + PSRC(IIW:IIA,IJB-2,:) )) / 12.0 +!TEMPO_JUAN ENDIF ! -CALL GET_HALO(ZPHAT,HDIR="Z0_Y") +!JUAN_TEMP CALL GET_HALO(ZPHAT,HDIR="Z0_Y") ! - IF (LSOUTH_ll()) THEN + IF (GSOUTH) THEN ZPHAT(IIW:IIA,IJB ,:) = 0.5*(PSRC(IIW:IIA,IJB-1,:) + PSRC(IIW:IIA,IJB,:)) ZPHAT(IIW:IIA,IJB-1,:) = ZPHAT(IIW:IIA,IJB,:) ENDIF ! ! NORTH BOUND ! - IF (LNORTH_ll()) THEN + IF (GNORTH) THEN ZPHAT(IIW:IIA,IJE+1,:) = 0.5*(PSRC(IIW:IIA,IJE,:) + PSRC(IIW:IIA,IJE+1,:)) ENDIF ! ! ! update ZPHAT HALO before next/further utilisation ! -!!$CALL GET_HALO(ZPHAT,HDIR="Z0_Y") ! ! calculate the fluxes: ! positive fluxes -!!$ ZFPOS(:,IJB+1:IJE+1,:) = ZPHAT(:,IJB+1:IJE+1,:) - & -!!$ ZCR(:,IJB+1:IJE+1,:)*(ZPHAT(:,IJB+1:IJE+1,:) - PSRC(:,IJB:IJE,:)) - & -!!$ ZCR(:,IJB+1:IJE+1,:)*(1.0 - ZCR(:,IJB+1:IJE+1,:)) * & -!!$ (ZPHAT(:,IJB:IJE,:) - 2.0*PSRC(:,IJB:IJE,:) + ZPHAT(:,IJB+1:IJE+1,:)) -! -!!$ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZPHAT(IIW:IIA,IJB:IJE+1,:) - & -!!$ ZCR(IIW:IIA,IJB:IJE+1,:)*( ZPHAT(IIW:IIA,IJB:IJE+1,:) - PSRC(IIW:IIA,IJB-1:IJE ,:) ) - & -!!$ ZCR(IIW:IIA,IJB:IJE+1,:)*( 1.0 - ZCR(IIW:IIA,IJB :IJE+1,:) ) * & -!!$ (ZPHAT(IIW:IIA,IJB-1:IJE,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE,:) + ZPHAT(IIW:IIA,IJB:IJE+1,:)) ! ZFPOS(IIW:IIA,IJB:IJE,:) = ZPHAT(IIW:IIA,IJB:IJE,:) - & ZCR(IIW:IIA,IJB:IJE,:)*(ZPHAT(IIW:IIA,IJB:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE-1,:)) - & ZCR(IIW:IIA,IJB:IJE,:)*(1.0 - ZCR(IIW:IIA,IJB:IJE,:)) * & (ZPHAT(IIW:IIA,IJB-1:IJE-1,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE-1,:) + ZPHAT(IIW:IIA,IJB:IJE,:)) ! -CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN +!JUAN_TEMP CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN ! ! positive flux on the SOUTH boundary - IF (LSOUTH_ll()) THEN + IF (GSOUTH) THEN ZFPOS(IIW:IIA,IJB,:) = (PSRC(IIW:IIA,IJB-1,:) - ZPHAT(IIW:IIA,IJB,:))*ZCR(IIW:IIA,IJB,:) + & ZPHAT(IIW:IIA,IJB,:) ! @@ -1817,24 +1921,15 @@ CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN ENDIF ! ! negative fluxes -!!$ ZFNEG(:,IJB:IJE,:) = ZPHAT(:,IJB:IJE,:) + & -!!$ ZCR(:,IJB:IJE,:)*(ZPHAT(:,IJB:IJE,:) - PSRC(:,IJB:IJE,:)) + & -!!$ ZCR(:,IJB:IJE,:)*(1.0 + ZCR(:,IJB:IJE,:)) * & -!!$ (ZPHAT(:,IJB:IJE,:) - 2.0*PSRC(:,IJB:IJE,:) +ZPHAT(:,IJB+1:IJE+1,:)) -! -!!$ ZFNEG(IIW:IIA,IJB-1:IJE,:) = ZPHAT(IIW:IIA,IJB-1:IJE,:) + & -!!$ ZCR(IIW:IIA,IJB-1:IJE,:)*(ZPHAT(IIW:IIA,IJB-1:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE,:)) + & -!!$ ZCR(IIW:IIA,IJB-1:IJE,:)*(1.0 + ZCR(IIW:IIA,IJB-1:IJE,:)) * & -!!$ (ZPHAT(IIW:IIA,IJB-1:IJE,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE,:) +ZPHAT(IIW:IIA,IJB:IJE+1,:)) ! ZFNEG(IIW:IIA,IJB:IJE,:) = ZPHAT(IIW:IIA,IJB:IJE,:) + & ZCR(IIW:IIA,IJB:IJE,:)*(ZPHAT(IIW:IIA,IJB:IJE,:) - PSRC(IIW:IIA,IJB:IJE,:)) + & ZCR(IIW:IIA,IJB:IJE,:)*(1.0 + ZCR(IIW:IIA,IJB:IJE,:)) * & (ZPHAT(IIW:IIA,IJB:IJE,:) - 2.0*PSRC(IIW:IIA,IJB:IJE,:) +ZPHAT(IIW:IIA,IJB+1:IJE+1,:)) ! - CALL GET_HALO(ZFNEG,HDIR="Z0_Y") ! JUAN + !JUAN_TEMP CALL GET_HALO(ZFNEG,HDIR="Z0_Y") ! JUAN ! - IF (LNORTH_ll()) THEN + IF (GNORTH) THEN ! this is not used ZFNEG(IIW:IIA,IJB-1,:) = 0.0 ! @@ -1845,13 +1940,18 @@ CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN ! ! calculate the advection ! - PR = PSRC * PRHO - & - DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & - ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) + mym(ZRHO_MYM,PRHO) + ZCR_MYM = ZCR* ZRHO_MYM*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + ZFNEG*(0.5-SIGN(0.5,ZCR)) ) + dyf(ZCR_DYF,ZCR_MYM) + PR = PSRC * PRHO - ZCR_DYF +!!$ PR = PSRC * PRHO - & +!!$ DYF( ZCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,ZCR)) + & +!!$ ZFNEG*(0.5-SIGN(0.5,ZCR)) ) ) +! ! ! in OPEN case fix boundary conditions ! - IF (LSOUTH_ll()) THEN + IF (GSOUTH) THEN WHERE ( ZCR(IIW:IIA,IJB,:) <= 0. ) ! OUTFLOW condition PR(IIW:IIA,IJB-1,:) = 1.0 * 2.*PR(IIW:IIA,IJB,:) - PR(IIW:IIA,IJB+1,:) ELSEWHERE @@ -1859,21 +1959,23 @@ CALL GET_HALO(ZFPOS,HDIR="Z0_Y") ! JUAN END WHERE ENDIF ! - IF (LNORTH_ll()) THEN + IF (GNORTH) THEN WHERE ( ZCR(IIW:IIA,IJE,:) >= 0. ) ! OUTFLOW condition PR(IIW:IIA,IJE+1,:) = 1.0 * 2.*PR(IIW:IIA,IJE,:) - PR(IIW:IIA,IJE-1,:) ELSEWHERE PR(IIW:IIA,IJE+1,:) = PR(IIW:IIA,IJE,:) END WHERE ENDIF + +!$acc end region +!$acc update host (pr) +!$acc end data region ! CALL GET_HALO(PR,HDIR="S0_Y") CALL MPPDB_CHECK3DM("PPM::PPM_S0_Y OPEN ::PR",PRECISION,PR) ! -! -END SELECT -! -!!$CALL GET_HALO(PR) + +!!$END SELECT ! CALL DEL_HALO2_ll(TZ_PSRC_HALO2_ll) ! diff --git a/MNH/shuman.f90 b/MNH/shuman.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a9e8c285bf4ec46df14e29709c2c8a1106c5712a --- /dev/null +++ b/MNH/shuman.f90 @@ -0,0 +1,1249 @@ +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/shuman.f90,v $ $Revision: 1.1.10.1 $ +! MASDEV4_7 operators 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################## + MODULE MODI_SHUMAN +! ################## +! +INTERFACE +! +FUNCTION DXF(PA) RESULT(PDXF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXF ! result at mass + ! localization +END FUNCTION DXF +! +FUNCTION DXM(PA) RESULT(PDXM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXM ! result at flux + ! side +END FUNCTION DXM +! +FUNCTION DYF(PA) RESULT(PDYF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYF ! result at mass + ! localization +END FUNCTION DYF +! +FUNCTION DYM(PA) RESULT(PDYM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM ! result at flux + ! side +END FUNCTION DYM +! +FUNCTION DZF(PA) RESULT(PDZF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass + ! localization +END FUNCTION DZF +! +FUNCTION DZM(PA) RESULT(PDZM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux + ! side +END FUNCTION DZM +! +FUNCTION MXF(PA) RESULT(PMXF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXF ! result at mass + ! localization +END FUNCTION MXF +! +FUNCTION MXM(PA) RESULT(PMXM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXM ! result at flux localization +END FUNCTION MXM +! +FUNCTION MYF(PA) RESULT(PMYF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYF ! result at mass + ! localization +END FUNCTION MYF +! +FUNCTION MYM(PA) RESULT(PMYM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM ! result at flux localization +END FUNCTION MYM +! +FUNCTION MZF(PA) RESULT(PMZF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass + ! localization +END FUNCTION MZF +! +FUNCTION MZM(PA) RESULT(PMZM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization +END FUNCTION MZM +! +END INTERFACE +! +END MODULE MODI_SHUMAN +! +! +! ############################### + FUNCTION MXF(PA) RESULT(PMXF) +! ############################### +! +!!**** *MXF* - Shuman operator : mean operator in x direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the x direction (I index) for a field PA localized at a x-flux +! point (u point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMXF(i,:,:) is defined by 0.5*(PA(i,:,:)+PA(i+1,:,:)) +!! At i=size(PA,1), PMXF(i,:,:) are replaced by the values of PMXF, +!! which are the right values in the x-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! upper bound in x direction of PA +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MXF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + JPHEXT +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMXF(JIJK-1,1,1) = 0.5*( PA(JIJK-1,1,1)+PA(JIJK,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JJK=1,IJU*IKU + PMXF(IIU,JJK,1) = PMXF(2*JPHEXT,JJK,1) +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MXF +! ############################### + FUNCTION MXM(PA) RESULT(PMXM) +! ############################### +! +!!**** *MXM* - Shuman operator : mean operator in x direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the x direction (I index) for a field PA localized at a mass +! point. The result is localized at a x-flux point (u point). +! +!!** METHOD +!! ------ +!! The result PMXM(i,:,:) is defined by 0.5*(PA(i,:,:)+PA(i-1,:,:)) +!! At i=1, PMXM(1,:,:) are replaced by the values of PMXM, +!! which are the right values in the x-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXM ! result at flux localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! Size of the array in the x direction +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MXM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + JPHEXT +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMXM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-1,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JJK=1,IJU*IKU + PMXM(1,JJK,1) = PMXM(IIU-2*JPHEXT+1,JJK,1) +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MXM +! ############################### + FUNCTION MYF(PA) RESULT(PMYF) +! ############################### +! +!!**** *MYF* - Shuman operator : mean operator in y direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the y direction (J index) for a field PA localized at a y-flux +! point (v point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMYF(i,:,:) is defined by 0.5*(PA(:,j,:)+PA(:,j+1,:)) +!! At j=size(PA,2), PMYF(:,j,:) are replaced by the values of PMYF, +!! which are the right values in the y-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! upper bound in y direction of PA +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MYF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMYF(JIJK-IIU,1,1) = 0.5*( PA(JIJK-IIU,1,1)+PA(JIJK,1,1) ) +END DO +! +PMYF(:,IJU,:) = PMYF(:,2*JPHEXT,:) +! +! +!------------------------------------------------------------------------------- +! +END FUNCTION MYF +! ############################### + FUNCTION MYM(PA) RESULT(PMYM) +! ############################### +! +!!**** *MYM* - Shuman operator : mean operator in y direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the y direction (J index) for a field PA localized at a mass +! point. The result is localized at a y-flux point (v point). +! +!!** METHOD +!! ------ +!! The result PMYM(:,j,:) is defined by 0.5*(PA(:,j,:)+PA(:,j-1,:)) +!! At j=1, PMYM(:,j,:) are replaced by the values of PMYM, +!! which are the right values in the y-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM ! result at flux localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! Size of the array in the y direction +! +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MYM +! ------------------ +! +IIU=SIZE(PA,1) +IJU=SIZE(PA,2) +IKU=SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMYM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU,1,1) ) +END DO +! +PMYM(:,1,:) = PMYM(:,IJU-2*JPHEXT+1,:) +! +!------------------------------------------------------------------------------- +! +END FUNCTION MYM +! ############################### + FUNCTION MZF(PA) RESULT(PMZF) +! ############################### +! +!!**** *MZF* - Shuman operator : mean operator in z direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the z direction (K index) for a field PA localized at a z-flux +! point (w point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMZF(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k+1)) +!! At k=size(PA,3), PMZF(:,:,k) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +INTEGER :: IIU,IJU +INTEGER :: JIJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMZF(JIJK-IIU*IJU,1,1) = 0.5*( PA(JIJK-IIU*IJU,1,1)+PA(JIJK,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PMZF(JIJ,1,IKU) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZF +! ############################### + FUNCTION MZM(PA) RESULT(PMZM) +! ############################### +! +!!**** *MZM* - Shuman operator : mean operator in z direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the z direction (K index) for a field PA localized at a mass +! point. The result is localized at a z-flux point (w point). +! +!!** METHOD +!! ------ +!! The result PMZM(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k-1)) +!! At k=1, PMZM(:,:,1) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +INTEGER :: IIU,IJU +INTEGER :: JIJ,JI,JJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZM +! ------------------ +! +!!$IIU = SIZE(PA,1) +!!$IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +!!$! +!!$JIJKOR = 1 + IIU*IJU +!!$JIJKEND = IIU*IJU*IKU +!!$! +!!$!CDIR NODEP +!!$!OCL NOVREC +!!$DO JIJK=JIJKOR , JIJKEND +!!$ PMZM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU*IJU,1,1) ) +!!$END DO +!!$ +!!$! +!!$!CDIR NODEP +!!$!OCL NOVREC +!!$DO JIJ=1,IIU*IJU +!!$ PMZM(JIJ,1,1) = -999. +!!$END DO + + +!$acc region +PMZM(:,:,2:IKU) = 0.5*( PA(:,:,2:IKU)+PA(:,:,1:IKU-1) ) +PMZM(:,:,1) = -999. +!$acc end region +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZM +! ############################### + FUNCTION DXF(PA) RESULT(PDXF) +! ############################### +! +!!**** *DXF* - Shuman operator : finite difference operator in x direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the x direction (I index) for a field PA localized at a x-flux +! point (u point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDXF(i,:,:) is defined by (PA(i+1,:,:)-PA(i,:,:)) +!! At i=size(PA,1), PDXF(i,:,:) are replaced by the values of PDXF, +!! which are the right values in the x-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! upper bound in x direction of PA +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DXF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + JPHEXT +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDXF(JIJK-1,1,1) = PA(JIJK,1,1) - PA(JIJK-1,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JJK=1,IJU*IKU + PDXF(IIU,JJK,1) = PDXF(2*JPHEXT,JJK,1) +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DXF +! ############################### + FUNCTION DXM(PA) RESULT(PDXM) +! ############################### +! +!!**** *DXM* - Shuman operator : finite difference operator in x direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the x direction (I index) for a field PA localized at a mass +! point. The result is localized at a x-flux point (u point). +! +!!** METHOD +!! ------ +!! The result PDXM(i,:,:) is defined by (PA(i,:,:)-PA(i-1,:,:)) +!! At i=1, PDXM(1,:,:) are replaced by the values of PDXM, +!! which are the right values in the x-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXM ! result at flux + ! side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! Size of the array in the x direction +! +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DXM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + 1 +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDXM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-1,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JJK=1,IJU*IKU + PDXM(1,JJK,1) = PDXM(IIU-2*JPHEXT+1,JJK,1) +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DXM +! ############################### + FUNCTION DYF(PA) RESULT(PDYF) +! ############################### +! +!!**** *DYF* - Shuman operator : finite difference operator in y direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the y direction (J index) for a field PA localized at a y-flux +! point (v point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDYF(:,j,:) is defined by (PA(:,j+1,:)-PA(:,j,:)) +!! At j=size(PA,2), PDYF(:,j,:) are replaced by the values of PDYM, +!! which are the right values in the y-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! upper bound in y direction of PA +! +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DYF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDYF(JIJK-IIU,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) +END DO +! +PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) +! +!------------------------------------------------------------------------------- +! +END FUNCTION DYF +! ############################### + FUNCTION DYM(PA) RESULT(PDYM) +! ############################### +! +!!**** *DYM* - Shuman operator : finite difference operator in y direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the y direction (J index) for a field PA localized at a mass +! point. The result is localized at a y-flux point (v point). +! +!!** METHOD +!! ------ +!! The result PDYM(:,j,:) is defined by (PA(:,j,:)-PA(:,j-1,:)) +!! At j=1, PDYM(:,1,:) are replaced by the values of PDYM, +!! which are the right values in the y-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM ! result at flux + ! side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! Size of the array in the y direction +! +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DYM +! ------------------ +! +IIU=SIZE(PA,1) +IJU=SIZE(PA,2) +IKU=SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDYM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) +END DO +! +PDYM(:,1,:) = PDYM(:,IJU-2*JPHEXT+1,:) +! +! +!------------------------------------------------------------------------------- +! +END FUNCTION DYM +! ############################### + FUNCTION DZF(PA) RESULT(PDZF) +! ############################### +! +!!**** *DZF* - Shuman operator : finite difference operator in z direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the z direction (K index) for a field PA localized at a z-flux +! point (w point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDZF(:,:,k) is defined by (PA(:,:,k+1)-PA(:,:,k)) +!! At k=size(PA,3), PDZF(:,:,k) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +! +INTEGER :: IIU,IJU +INTEGER :: JIJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DZF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDZF(JIJK-IIU*IJU,1,1) = PA(JIJK,1,1)-PA(JIJK-IIU*IJU,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PDZF(JIJ,1,IKU) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DZF +! ############################### + FUNCTION DZM(PA) RESULT(PDZM) +! ############################### +! +!!**** *DZM* - Shuman operator : finite difference operator in z direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the z direction (K index) for a field PA localized at a mass +! point. The result is localized at a z-flux point (w point). +! +!!** METHOD +!! ------ +!! The result PDZM(:,j,:) is defined by (PA(:,:,k)-PA(:,:,k-1)) +!! At k=1, PDZM(:,:,k) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux + ! side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +! +INTEGER :: IIU,IJU +INTEGER :: JIJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DZM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDZM(JIJK,1,1) = PA(JIJK,1,1)-PA(JIJK-IIU*IJU,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PDZM(JIJ,1,1) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DZM