diff --git a/MNH/advec_4th_order_aux.f90 b/MNH/advec_4th_order_aux.f90 new file mode 100644 index 0000000000000000000000000000000000000000..96440f2cd550d0d47783d5092cb1c8f377e23db3 --- /dev/null +++ b/MNH/advec_4th_order_aux.f90 @@ -0,0 +1,639 @@ +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/advec_4th_order_aux.f90,v $ $Revision: 1.1.2.1.2.2 $ +! MASDEV4_7 adiab 2006/05/18 14:35:31 +!----------------------------------------------------------------- +! ############################### + MODULE MODI_ADVEC_4TH_ORDER_AUX +! ############################### +! +INTERFACE +! + SUBROUTINE ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PFIELDT, KGRID, & + PMEANX, PMEANY,TPHALO2 ) +! +USE MODE_ll +! +USE MODD_CONF +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PMEANX, PMEANY ! fluxes +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELDT ! variable at t +INTEGER, INTENT(IN) :: KGRID ! C grid localisation +! +TYPE(HALO2_ll), OPTIONAL, POINTER :: TPHALO2 ! halo2 for the field at t +! +END SUBROUTINE ADVEC_4TH_ORDER_ALGO +! +!------------------------------------------------------------------------------- +! + FUNCTION MZF4(PA) RESULT(PMZF4) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF4 ! result at mass + ! localization +! +END FUNCTION MZF4 +! +!------------------------------------------------------------------------------- +! + FUNCTION MZM4(PA) RESULT(PMZM4) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM4 ! result at flux + ! localization +END FUNCTION MZM4 +! +!------------------------------------------------------------------------------- +! +END INTERFACE +! +END MODULE MODI_ADVEC_4TH_ORDER_AUX +! +!------------------------------------------------------------------------------- +! +! ######################################################################## + SUBROUTINE ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PFIELDT, KGRID, & + PMEANX, PMEANY,TPHALO2 ) +! ######################################################################## +!! +!!**** *ADVEC_4TH_ORDER_ALGO * - routine used to compute 4th order horizontal +!! advection fluxes of 3D prognostic variables +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute 2sd or 4th order horizontal +!! advection fluxes of a prognostic variable. +!! +!!** METHOD +!! ------ +!! In case of cyclic LBCs, the routine returns the scalar component of the +!! advection fluxes by applying a 4th order horizontal averaging operator to +!! the prognostic variable on each grid level. In the case of open LBCs, the +!! averaging operator degenerates to a 2nd order one on the first ring +!! inside the computationnal domain. +!! The "halo2" (or the second layer of the halo) of the prognostic +!! variable is passed as argument. +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODULE MODD_ARGSLIST +!! HALO2LIST_ll : type for a list of "HALO2_lls" +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine ADVEC_4TH_ORDER ) +!! User Interface for the MesoNH Parallel Package +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 25/10/05 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODE_ll +! +USE MODD_LUNIT +USE MODD_CONF +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +USE MODE_IO_ll +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PMEANX, PMEANY ! fluxes +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELDT ! variable at t +INTEGER, INTENT(IN) :: KGRID ! C grid localisation +! +TYPE(HALO2_ll), OPTIONAL, POINTER :: TPHALO2 ! halo2 for the field at t +! +!* 0.2 Declarations of local variables : +! +INTEGER:: IW,IE,IS,IN,IT,IB,IWF,IEF,ISF,INF ! Coordinate of forth order diffusion area +! +INTEGER:: IIB,IJB ! Begining useful area in x,y directions +INTEGER:: IIE,IJE ! End useful area in x,y directions +! +INTEGER:: ILUOUT,IRESP ! for prints +! +!------------------------------------------------------------------------------- +! +!* 0.3. COMPUTES THE DOMAIN DIMENSIONS +! ------------------------------ +! +CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +! +!------------------------------------------------------------------------------- +! +!* 0.4. INITIALIZE THE FIELDS +! --------------------- +! +PMEANX(:,:,:) = 0.0 +PMEANY(:,:,:) = 0.0 +! +!------------------------------------------------------------------------------- +! +! +!* 1. CALCULATE THE NUMERICAL MEAN IN THE X DIRECTION +! ----------------------------------------------- +! +SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side +! +!* 1.1 CYCLIC CASE IN THE X DIRECTION: +! +CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) +! + IF(NHALO == 1) THEN + IW=IIB+1 + IE=IIE +! IE=IIE-1 + ELSE + CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT,IRESP) + WRITE(ILUOUT,*) 'ERROR : 4th order advection in CYCLic case ' + WRITE(ILUOUT,*) 'cannot be used with NHALO=2' + !callabortstop + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP +! IW=IIB +! IE=IIE + END IF +! + IF(KGRID == 2) THEN + IWF=IW-1 + IEF=IE-1 + ELSE + IWF=IW + IEF=IE + END IF +! +!* lateral boundary conditions + PMEANX(IWF-1,:,:) = (7.0*( PFIELDT(IW-1,:,:)+PFIELDT(IW-2,:,:) ) - & + ( PFIELDT(IW,:,:)+TPHALO2%WEST(:,:) ) )/12.0 +! + PMEANX(IEF+1,:,:) = (7.0*( PFIELDT(IE+1,:,:)+PFIELDT(IE,:,:) ) - & + ( TPHALO2%EAST(:,:)+PFIELDT(IE-1,:,:) ) )/12.0 +! +!* inner domain + PMEANX(IWF:IEF,:,:) = (7.0*( PFIELDT(IW:IE,:,:)+PFIELDT(IW-1:IE-1,:,:) ) - & + ( PFIELDT(IW+1:IE+1,:,:)+PFIELDT(IW-2:IE-2,:,:) ) )/12.0 +! +!!$! +!!$ +!!$ IF(NHALO == 1) THEN +!!$ PMEANX(IWF-1,:,:) = (7.0*( PFIELDT(IW-1,:,:)+PFIELDT(IW-2,:,:) ) - & +!!$ ( PFIELDT(IW,:,:)+TPHALO2%WEST(:,:) ) )/12.0 +!!$! +!!$ PMEANX(IEF+1,:,:) = (7.0*( PFIELDT(IE+1,:,:)+PFIELDT(IE,:,:) ) - & +!!$ ( TPHALO2%EAST(:,:)+PFIELDT(IE-1,:,:) ) )/12.0 +!!$ ENDIF +!!$! +!!$ PMEANX(IWF:IEF,:,:) = (7.0*( PFIELDT(IW:IE,:,:)+PFIELDT(IW-1:IE-1,:,:) ) - & +!!$ ( PFIELDT(IW+1:IE+1,:,:)+PFIELDT(IW-2:IE-2,:,:) ) )/12.0 +!!$! +!* 1.2 NON CYCLIC CASE IN THE X DIRECTION +! +CASE ('OPEN','WALL','NEST') +! + IF (LWEST_ll()) THEN + IF(KGRID == 2) THEN + IW=IIB+2 ! special case of C grid + ELSE + IW=IIB+1 + END IF + ELSE + IF(NHALO == 1) THEN + IW=IIB+1 + ELSE + IW=IIB + ENDIF + ENDIF + IF (LEAST_ll() .OR. NHALO == 1) THEN +! T. Maric +! IE=IIE-1 ! original + IE=IIE + ELSE + IE=IIE + END IF +! + IF(KGRID == 2) THEN + IWF=IW-1 + IEF=IE-1 + ELSE + IWF=IW + IEF=IE + END IF +! +! T. Maric. 16.1.2006. +! write(*,*)' IW, IE, IWF, IEF = ',IW, IE, IWF, IEF +! stop 'Stopping in advec_4th_order_aux.f90' +! +!* Use a second order scheme at the physical border +! + IF (LWEST_ll()) THEN + PMEANX(IWF-1,:,:) = 0.5*( PFIELDT(IW-1,:,:)+PFIELDT(IW-2,:,:) ) + ! T. Maric + ! PMEANX(1,:,:) = PMEANX(IWF-1,:,:) + ! extrapolate + !PMEANX(1,:,:) = 0.5*(3.0*PFIELDT(1,:,:) - PFIELDT(2,:,:)) + ELSEIF (NHALO == 1) THEN + PMEANX(IWF-1,:,:) = (7.0*( PFIELDT(IW-1,:,:)+PFIELDT(IW-2,:,:) ) - & + ( PFIELDT(IW,:,:)+TPHALO2%WEST(:,:) ) )/12.0 + ENDIF +! + IF (LEAST_ll()) THEN + PMEANX(IEF+1,:,:) = 0.5*( PFIELDT(IE+1,:,:)+PFIELDT(IE,:,:) ) + ELSEIF (NHALO == 1) THEN + PMEANX(IEF+1,:,:) = (7.0*( PFIELDT(IE+1,:,:)+PFIELDT(IE,:,:) ) - & + ( TPHALO2%EAST(:,:)+PFIELDT(IE-1,:,:) ) )/12.0 + ENDIF +! +!* Use a fourth order scheme elsewhere +! + PMEANX(IWF:IEF,:,:) = (7.0*( PFIELDT(IW:IE,:,:)+PFIELDT(IW-1:IE-1,:,:) ) - & + ( PFIELDT(IW+1:IE+1,:,:)+PFIELDT(IW-2:IE-2,:,:) ) )/12.0 +END SELECT +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTES THE 4TH ORDER MEAN IN THE Y DIRECTION +! ---------------------------------------------- +! +IF ( .NOT. L2D ) THEN + SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side +! +!* 2.1 CYCLIC CASE IN THE Y DIRECTION: +! + CASE ('CYCL') ! In that case one must have HLBCY(1) == HLBCY(2) +! +! + IF(NHALO == 1) THEN + IS=IJB+1 + IN=IJE +! IN=IJE-1 + ELSE + CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT,IRESP) + WRITE(ILUOUT,*) 'ERROR : 4th order advection in CYCLic case ' + WRITE(ILUOUT,*) 'cannot be used with NHALO=2' +!callabortstop + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP +! IS=IJB +! IN=IJE + END IF +! + IF(KGRID == 3) THEN + ISF=IS-1 + INF=IN-1 + ELSE + ISF=IS + INF=IN + END IF +! +!* lateral boundary conditions + PMEANY(:,ISF-1,:) = (7.0*( PFIELDT(:,IS-1,:)+PFIELDT(:,IS-2,:) ) - & + ( PFIELDT(:,IS,:)+TPHALO2%SOUTH(:,:) ) )/12.0 +! + PMEANY(:,INF+1,:) = (7.0*( PFIELDT(:,IN+1,:)+PFIELDT(:,IN,:) ) - & + ( TPHALO2%NORTH(:,:)+PFIELDT(:,IN-1,:) ) )/12.0 +! +!* inner domain + PMEANY(:,ISF:INF,:) = (7.0*( PFIELDT(:,IS:IN,:)+PFIELDT(:,IS-1:IN-1,:)) - & + ( PFIELDT(:,IS+1:IN+1,:)+PFIELDT(:,IS-2:IN-2,:) ))/12.0 +!!$! +!!$ IF(NHALO == 1) THEN +!!$ PMEANY(:,ISF-1,:) = (7.0*( PFIELDT(:,IS,:)+PFIELDT(:,IS-1,:) ) - & +!!$ ( PFIELDT(:,IS+1,:)+TPHALO2%SOUTH(:,:) ) )/12.0 +!!$! +!!$ PMEANY(:,ISF+1,:) = (7.0*( PFIELDT(:,IS,:)+PFIELDT(:,IS-1,:) ) - & +!!$ ( TPHALO2%NORTH(:,:)+PFIELDT(:,IS-2,:) ) )/12.0 +!!$ ENDIF +!!$! +!!$ PMEANY(:,ISF:INF,:) = (7.0*( PFIELDT(:,IS:IN,:)+PFIELDT(:,IS-1:IN-1,:)) - & +!!$ ( PFIELDT(:,IS+1:IN+1,:)+PFIELDT(:,IS-2:IN-2,:) ))/12.0 +!!$! +!* 2.2 NON CYCLIC CASE IN THE Y DIRECTION +! + CASE ('OPEN','WALL','NEST') +! + IF (LSOUTH_ll()) THEN + IF(KGRID == 3) THEN + IS=IJB+2 ! special case of C grid + ELSE + IS=IJB+1 + END IF + ELSE + IF(NHALO == 1) THEN + IS=IJB+1 + ELSE + IS=IJB + ENDIF + ENDIF + IF (LNORTH_ll() .OR. NHALO == 1) THEN +! T. Maric +! IN=IJE-1 ! original + IN=IJE + ELSE + IN=IJE + END IF +! + IF(KGRID == 3) THEN + ISF=IS-1 + INF=IN-1 + ELSE + ISF=IS + INF=IN + END IF +! +!* Use a second order scheme at the physical border +! + IF (LSOUTH_ll()) THEN + PMEANY(:,ISF-1,:) = 0.5*( PFIELDT(:,IS-1,:)+PFIELDT(:,IS-2,:) ) + ! T. Maric + ! PMEANY(:,1,:) = PMEANY(:,ISF-1,:) + ! extrapolate + !PMEANY(:,1,:) = 0.5*(3.0*PFIELDT(:,1,:) - PFIELDT(:,2,:)) + ELSEIF (NHALO == 1) THEN +!!$ PMEANY(:,ISF-1,:) = (7.0*( PFIELDT(:,IS,:)+PFIELDT(:,IS-1,:)) - & +!!$ ( PFIELDT(:,IS+1,:)+TPHALO2%SOUTH(:,:) ))/12.0 + PMEANY(:,ISF-1,:) = (7.0*( PFIELDT(:,IS-1,:)+PFIELDT(:,IS-2,:)) - & + ( PFIELDT(:,IS,:)+TPHALO2%SOUTH(:,:) ))/12.0 + ENDIF +! + IF (LNORTH_ll()) THEN + PMEANY(:,INF+1,:) = 0.5*( PFIELDT(:,IN+1,:)+PFIELDT(:,IN,:) ) + ELSEIF (NHALO == 1) THEN +!!$ PMEANY(:,INF+1,:) = (7.0*( PFIELDT(:,IN,:)+PFIELDT(:,IN-1,:)) - & +!!$ ( TPHALO2%NORTH(:,:)+PFIELDT(:,IN-2,:) ))/12.0 + PMEANY(:,INF+1,:) = (7.0*( PFIELDT(:,IN+1,:)+PFIELDT(:,IN,:)) - & + ( TPHALO2%NORTH(:,:)+PFIELDT(:,IN-1,:) ))/12.0 + ENDIF +! +!* Use a fourth order scheme elsewhere +! + PMEANY(:,ISF:INF,:) = (7.0*( PFIELDT(:,IS:IN,:)+PFIELDT(:,IS-1:IN-1,:)) - & + ( PFIELDT(:,IS+1:IN+1,:)+PFIELDT(:,IS-2:IN-2,:) ))/12.0 +! + END SELECT +ELSE + PMEANY(:,:,:) = 0.0 +ENDIF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE ADVEC_4TH_ORDER_ALGO +! +!------------------------------------------------------------------------------- +! +! ################################ + FUNCTION MZF4(PA) RESULT(PMZF4) +! ################################ +! +!!**** *MZF4* - 4th order Shuman operator : mean operator in z direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +!! The purpose of this function is to compute a 4th order mean value +!! 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 PMZF4(:,:,k) is defined by +!! PMZF4(:,:,k)=0.5*(PA(:,:,k)+PA(:,:,k+1)) at k=1 and size(PA,3)-1 +!! PMZF4(:,:,k)=-999. at k=size(PA,3) +!! PMZF4(:,:,k)=7/12*(PA(:,:,k)+PA(:,:,k+1)) +!! -1/12*(PA(:,:,k-1)+PA(:,:,k+2)) elsewhere +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Lab Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 25/10/05 +!! +!------------------------------------------------------------------------------- +! +!* 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)) :: PMZF4 ! 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,IIJU ! upper bounds in the x and y directions of PA +INTEGER :: JIJ,JIJK ! running loop indexes after linearisation +INTEGER :: JIJKOR1,JIJKEND1 ! loop boundaries +INTEGER :: JIJKOR2,JIJKEND2 ! loop boundaries +INTEGER :: JIJKOR3,JIJKEND3 ! loop boundaries +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZF4 +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +IIJU = IIU*IJU +! +JIJKOR1 = 1 + IIJU +JIJKEND1 = 2*IIJU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR1 , JIJKEND1 + PMZF4(JIJK-IIJU,1,1) = 0.5*( PA(JIJK-IIJU,1,1)+PA(JIJK,1,1) ) +END DO +! +JIJKOR2 = 1 + JIJKEND1 +JIJKEND2 = IIJU*IKU - IIJU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR2 , JIJKEND2 + PMZF4(JIJK-IIJU,1,1) = (7.0*( PA(JIJK,1,1)+PA(JIJK-IIJU,1,1) ) - & + ( PA(JIJK+IIJU,1,1)+PA(JIJK-2*IIJU,1,1) ) )/12.0 +END DO +! +JIJKOR3 = 1 + JIJKEND2 +JIJKEND3 = IIJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR3 , JIJKEND3 + PMZF4(JIJK-IIJU,1,1) = 0.5*( PA(JIJK-IIJU,1,1)+PA(JIJK,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIJU + PMZF4(JIJ,1,IKU) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZF4 +! +!------------------------------------------------------------------------------- +! +! ################################ + FUNCTION MZM4(PA) RESULT(PMZM4) +! ################################ +! +!!**** *MZM4* - 4th order Shuman operator : mean operator in z direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +!! The purpose of this function is to compute a 4th order mean value +!! 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 PMZM4(:,:,k) is defined by +!! PMZM4(:,:,k)=0.5*(PA(:,:,k)+PA(:,:,k+1)) at k=2 and size(PA,3) +!! PMZM4(:,:,k)=-999. at k=1 +!! PMZM4(:,:,k)=7/12*(PA(:,:,k)+PA(:,:,k+1)) +!! -1/12*(PA(:,:,k-1)+PA(:,:,k+2)) elsewhere +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Lab Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 25/10/05 +!! +!------------------------------------------------------------------------------- +! +!* 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)) :: PMZM4 ! 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,IIJU ! upper bounds in the x and y directions of PA +INTEGER :: JIJ,JIJK ! running loop indexes after linearisation +INTEGER :: JIJKOR1,JIJKEND1 ! loop boundaries +INTEGER :: JIJKOR2,JIJKEND2 ! loop boundaries +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZM4 +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +IIJU = IIU*IJU +! +JIJKOR1 = 1 + IIJU +JIJKEND1 = JIJKOR1 + IIJU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR1 , JIJKEND1 + PMZM4(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIJU,1,1) ) +END DO +! +JIJKOR2 = 1 + JIJKEND1 +JIJKEND2 = IIJU*IKU - IIJU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR2 , JIJKEND2 + PMZM4(JIJK,1,1) = (7.0*( PA(JIJK,1,1)+PA(JIJK-IIJU,1,1) ) - & + ( PA(JIJK+IIJU,1,1)+PA(JIJK-2*IIJU,1,1) ) )/12.0 +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIJU + PMZM4(JIJ,1,IKU) = 0.5*( PA(JIJ,1,IKU)+PA(JIJ-IIJU,1,IKU) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIJU + PMZM4(JIJ,1,1) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZM4 diff --git a/MNH/advecuvw_4th.f90 b/MNH/advecuvw_4th.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a8ef52ae1a10b42e79e4220d042ce1b93149bbcd --- /dev/null +++ b/MNH/advecuvw_4th.f90 @@ -0,0 +1,271 @@ +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/advecuvw_4th.f90,v $ $Revision: 1.1.4.1 $ +! MASDEV4_7 adiab 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_ADVECUVW_4TH +! ########################### +! +INTERFACE +! + SUBROUTINE ADVECUVW_4TH ( HLBCX, HLBCY, PRUCT, PRVCT, PRWCT, & + PUT, PVT, PWT, PRUS, PRVS, PRWS, TPHALO2LIST ) +! +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT, PWT ! U,V,W at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Source terms +! +TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion +! +END SUBROUTINE ADVECUVW_4TH +! +END INTERFACE +! +END MODULE MODI_ADVECUVW_4TH +! +! +! ###################################################################### + SUBROUTINE ADVECUVW_4TH ( HLBCX, HLBCY, PRUCT, PRVCT, PRWCT, & + PUT, PVT, PWT, PRUS, PRVS, PRWS, TPHALO2LIST ) +! ###################################################################### +! +!!**** *ADVECUVW_4TH * - routine to compute the 4th order centered +!! advection tendency of momentum (U,V,W) +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to call the ADVEC_4TH_ORDER_ALGO +!! routine for the horizontal advection and the MZM4 and MZF4 functions for +!! the vertical advection of momentum. The code is +!! parallelized and works for various boundary conditions. +!! +!!** METHOD +!! ------ +!! For each wind component the ADVECUVW_4TH routine calls +!! the ADVEC_4TH_ORDER_ALGO routine which computes the numerical advection +!! of any 3D field. +!! The following variables are passed as argument to ADVEC_4TH_ORDER_ALGO : +!! +!! -- The variable at t +!! -- The second layer of the halo of the field at t +!! -- The horizontal advection fluxes +!! -- The localisation on the model grid : +!! +!! IGRID = 1 for mass grid point +!! IGRID = 2 for U grid point +!! IGRID = 3 for V grid point +!! IGRID = 4 for W grid point +!! +!! EXTERNAL +!! -------- +!! BUDGET : Stores the different budget components +!! (not used in current version) +!! ADVEC_4TH_ORDER_ALGO : computes the horizontal advection fluxes +!! MZF4 and MZM4 : computes the vertical advection fluxes +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODULE MODD_BUDGET: +!! NBUMOD : model in which budget is calculated +!! CBUTYPE : type of desired budget +!! 'CART' for cartesian box configuration +!! 'MASK' for budget zone defined by a mask +!! 'NONE' ' for no budget +!! NBUPROCCTR : process counter used for each budget variable +!! Switches for budgets activations: +!! +!! LBU_RU : logical for budget of RU (wind component along x) +!! +!! LBU_RU : logical for budget of RU (wind component along x) +!! .TRUE. = budget of RU +!! .FALSE. = no budget of RU +!! LBU_RV : logical for budget of RV (wind component along y) +!! .TRUE. = budget of RV +!! .FALSE. = no budget of RV +!! LBU_RW : logical for budget of RW (wind component along z) +!! .TRUE. = budget of RW +!! .FALSE. = no budget of RW +!! LBU_RTH : logical for budget of RTH (potential temperature) +!! .TRUE. = budget of RTH +!! .FALSE. = no budget of RTH +!! LBU_RTKE : logical for budget of RTKE (turbulent kinetic energy) +!! .TRUE. = budget of RTKE +!! .FALSE. = no budget of RTKE +!! LBU_RRV : logical for budget of RRV (water vapor) +!! .TRUE. = budget of RRV +!! .FALSE. = no budget of RRV +!! LBU_RRC : logical for budget of RRC (cloud water) +!! .TRUE. = budget of RRC +!! .FALSE. = no budget of RRC +!! LBU_RRR : logical for budget of RRR (rain water) +!! .TRUE. = budget of RRR +!! .FALSE. = no budget of RRR +!! LBU_RRI : logical for budget of RRI (ice) +!! .TRUE. = budget of RRI +!! .FALSE. = no budget of RRI +!! LBU_RRS : logical for budget of RRS (snow) +!! .TRUE. = budget of RRS +!! .FALSE. = no budget of RRS +!! LBU_RRG : logical for budget of RRG (graupel) +!! .TRUE. = budget of RRG +!! .FALSE. = no budget of RRG +!! LBU_RRH : logical for budget of RRH (hail) +!! .TRUE. = budget of RRH +!! .FALSE. = no budget of RRH +!! LBU_RSV : logical for budget of RSVx (scalar variable) +!! .TRUE. = budget of RSVx +!! .FALSE. = no budget of RSVx +!! +!! MODULE MODD_ARGSLIST +!! HALO2LIST_ll : type for a list of "HALO2_lls" +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine ADVECUVW_4TH ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 25/10/05 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODE_ll +! +USE MODD_PARAMETERS +USE MODD_CONF +USE MODD_BUDGET +USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll +! +USE MODI_SHUMAN +USE MODI_BUDGET +! +USE MODI_ADVEC_4TH_ORDER_AUX +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUCT ! contravariant +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVCT ! components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWCT ! of momentum +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT, PWT ! Variables at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Source terms +! +TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion +! +!* 0.2 Declarations of local variables : +! +INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions +INTEGER:: IIE,IJE ! End useful area in x,y,z directions +! +TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST +! +INTEGER :: IGRID ! localisation on the model grid +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMEANX, ZMEANY ! fluxes +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTES THE DOMAIN DIMENSIONS +! ------------------------------ +! +CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +! +!------------------------------------------------------------------------------- +! +!* 2. CALL THE ADVEC_4TH_ORDER_ALGO ROUTINE FOR MOMENTUM +! -------------------------------------------------- +! +IGRID = 2 +IF(NHALO == 1) THEN + TZHALO2LIST => TPHALO2LIST + CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PUT, IGRID, ZMEANX, ZMEANY, & + TZHALO2LIST%HALO2 ) +ELSE + CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PUT, IGRID, ZMEANX, ZMEANY) +ENDIF +! +PRUS(:,:,:) = PRUS(:,:,:) & + -DXM( MXF(PRUCT(:,:,:))*ZMEANX(:,:,:) ) +IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVX_BU_RU') +! +PRUS(:,:,:) = PRUS(:,:,:) & + -DYF( MXM(PRVCT(:,:,:))*ZMEANY(:,:,:) ) +IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVY_BU_RU') +! +PRUS(:,:,:) = PRUS(:,:,:) & + -DZF( MXM(PRWCT(:,:,:))*MZM4(PUT(:,:,:)) ) +IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADVZ_BU_RU') +! +! +IGRID = 3 +IF(NHALO == 1) THEN + TZHALO2LIST => TZHALO2LIST%NEXT + CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PVT, IGRID, ZMEANX, ZMEANY, & + TZHALO2LIST%HALO2 ) +ELSE + CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PVT, IGRID, ZMEANX, ZMEANY) +ENDIF +! +PRVS(:,:,:) = PRVS(:,:,:) & + -DXF( MYM(PRUCT(:,:,:))*ZMEANX(:,:,:) ) +IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVX_BU_RV') +! +PRVS(:,:,:) = PRVS(:,:,:) & + -DYM( MYF(PRVCT(:,:,:))*ZMEANY(:,:,:) ) +IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVY_BU_RV') +! +PRVS(:,:,:) = PRVS(:,:,:) & + -DZF( MYM(PRWCT(:,:,:))*MZM4(PVT(:,:,:)) ) +IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADVZ_BU_RV') +! +! +IGRID = 4 +! +IF(NHALO == 1) THEN + TZHALO2LIST => TZHALO2LIST%NEXT + CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PWT, IGRID, ZMEANX, ZMEANY, & + TZHALO2LIST%HALO2 ) +ELSE + CALL ADVEC_4TH_ORDER_ALGO(HLBCX, HLBCY, PWT, IGRID, ZMEANX, ZMEANY) +ENDIF +! +PRWS(:,:,:) = PRWS(:,:,:) & + -DXF( MZM(PRUCT(:,:,:))*ZMEANX(:,:,:) ) +IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVX_BU_RW') +! +PRWS(:,:,:) = PRWS(:,:,:) & + -DYF( MZM(PRVCT(:,:,:))*ZMEANY(:,:,:) ) +IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVY_BU_RW') +! +PRWS(:,:,:) = PRWS(:,:,:) & + -DZM( MZF(PRWCT(:,:,:))*MZF4(PWT(:,:,:)) ) +IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADVZ_BU_RW') +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE ADVECUVW_4TH