diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index a7658c4880cc7b8c099d9381745ad75de9e7b266..e8c655bab463c4522edc4495cf1ec2c5178ca01f 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -805,8 +805,10 @@ IF (KRRL >=1) THEN !$acc data present( zamoist_ice, zatheta_ice ) CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & + PPABST, PRT, & ZLVOCPEXNM,ZAMOIST,ZATHETA) CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, & + PPABST, PRT, & ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE) ! !$acc kernels present_cr( zamoist, zatheta, zlocpexnm, zlvocpexnm, zlsocpexnm, zamoist_ice, zatheta_ice ) @@ -835,6 +837,7 @@ IF (KRRL >=1) THEN #endif ELSE CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & + PPABST, PRT, & ZLOCPEXNM,ZAMOIST,ZATHETA) END IF ! @@ -997,7 +1000,10 @@ IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE') THEN #ifdef MNH_OPENACC call Print_msg( NVERB_FATAL, 'GEN', 'TURB', 'OpenACC: CLOUD_MODIF_LM not yet implemented' ) #endif - CALL CLOUD_MODIF_LM + CALL CLOUD_MODIF_LM( TPFILE, OTURB_DIAG, & + KKA, KKU, KKL, KRR, KRRI, IKB, IKE, IKTB, IKTE, ORMC01, HTURBDIM, HTURBLEN, HTURBLEN_CL, & + PCEI, PCEI_MIN, PCEI_MAX, PCOEF_AMPL_SAT, PDXX, PDYY, PDZZ, PZZ, PTHVREF, ZTHLM, ZRM, & + PTKET, PDIRCOSZW, PTHLT, PSRCT, PRT, ZLOCPEXNM, ZATHETA, ZAMOIST, PLEM ) END IF ! @@ -1068,7 +1074,7 @@ ENDIF PDXX,PDYY,PDZZ, & ZUSLOPE,ZVSLOPE ) ! - CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) + CALL UPDATE_ROTATE_WIND( HLBCX, HLBCY, ZUSLOPE, ZVSLOPE ) ELSE !$acc kernels present_cr(ZUSLOPE,ZVSLOPE) ZUSLOPE=PUT(:,:,KKA) @@ -1686,14 +1692,13 @@ CALL MNH_MEM_RELEASE( 'TURB 1' ) !$acc end data +END SUBROUTINE TURB !---------------------------------------------------------------------------- -! -CONTAINS -! -! -! ############################################## - SUBROUTINE UPDATE_ROTATE_WIND(PUSLOPE,PVSLOPE) -! ############################################## + + +! ############################################################### + SUBROUTINE UPDATE_ROTATE_WIND( HLBCX, HLBCY, PUSLOPE, PVSLOPE ) +! ############################################################### !! !!**** *UPDATE_ROTATE_WIND* routine to set rotate wind values at the border ! @@ -1711,10 +1716,12 @@ CONTAINS ! !* 0. DECLARATIONS ! ------------ -USE MODE_ll USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODD_CONF +USE MODE_ll +USE MODE_MPPDB + #ifdef MNH_OPENACC USE MODI_GET_HALO #endif @@ -1723,12 +1730,13 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE +CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX, HLBCY ! X- and Y-direc LBC +REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE ! tangential surface fluxes in the axes following the orography ! !* 0.2 Declarations of local variables : ! -INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain +INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine logical :: gwest, geast, gnorth, gsouth @@ -1799,9 +1807,11 @@ end if !$acc end data END SUBROUTINE UPDATE_ROTATE_WIND -! + + ! ######################################################################## SUBROUTINE COMPUTE_FUNCTION_THERMO(PALP,PBETA,PGAM,PLTT,PC,PT,PEXN,PCP,& + PPABST, PRT, & PLOCPEXN,PAMOIST,PATHETA ) ! ######################################################################## !! @@ -1821,19 +1831,25 @@ END SUBROUTINE UPDATE_ROTATE_WIND !* 0. DECLARATIONS ! ------------ USE MODD_CST + +USE MODE_MPPDB ! IMPLICIT NONE ! -!* 0.1 Declarations of dummy arguments +!* 0.1 Declarations of dummy arguments ! REAL, INTENT(IN) :: PALP,PBETA,PGAM,PLTT,PC REAL, DIMENSION(:,:,:), INTENT(IN) :: PT,PEXN,PCP +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Pressure at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! water variables ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLOCPEXN REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA ! !* 0.2 Declarations of local variables ! +INTEGER :: JI, JJ, JK +INTEGER :: JIU,JJU,JKU REAL :: ZEPS ! XMV / XMD real, dimension(:,:,:), pointer , contiguous :: zrvsat real, dimension(:,:,:), pointer , contiguous :: zdrvsatdt @@ -1850,15 +1866,19 @@ end if !$acc data present( PT, PEXN, PCP, PLOCPEXN, PAMOIST, PATHETA, PPABST, PRT ) -#ifndef MNH_OPENACC - allocate( zrvsat ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) - allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) +JIU = SIZE( PEXN, 1 ) +JJU = SIZE( PEXN, 2 ) +JKU = SIZE( PEXN, 3 ) + +#ifndef MNH_OPENACC + allocate( zrvsat (jiu, jju, jku) ) + allocate( zdrvsatdt(jiu, jju, jku) ) #else !Pin positions in the pools of MNH memory CALL MNH_MEM_POSITION_PIN( 'COMPUTE_FUNCTION_THERMO' ) -CALL MNH_MEM_GET( zrvsat , size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) -CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) +CALL MNH_MEM_GET( zrvsat , jiu, jju, jku ) +CALL MNH_MEM_GET( zdrvsatdt, jiu, jju, jku ) #endif !$acc data present_cr( zrvsat, zdrvsatdt ) @@ -1957,11 +1977,14 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) !$acc end data END SUBROUTINE COMPUTE_FUNCTION_THERMO -! -! -! ######################### - SUBROUTINE CLOUD_MODIF_LM -! ######################### + + +! ##################################################################################################################### + SUBROUTINE CLOUD_MODIF_LM( TPFILE, OTURB_DIAG, & + KKA, KKU, KKL, KRR, KRRI, KKB, KKE, KKTB, KKTE, ORMC01, HTURBDIM, HTURBLEN, HTURBLEN_CL, & + PCEI, PCEI_MIN, PCEI_MAX, PCOEF_AMPL_SAT, PDXX, PDYY, PDZZ, PZZ, PTHVREF, PTHLM, PRM, & + PTKET, PDIRCOSZW, PTHLT, PSRCT, PRT, PLOCPEXNM, PATHETA, PAMOIST, PLEM ) +! ##################################################################################################################### !! !!*****CLOUD_MODIF_LM routine to: !! 1/ change the mixing length in the clouds @@ -2008,31 +2031,79 @@ END SUBROUTINE COMPUTE_FUNCTION_THERMO !* 0. DECLARATIONS ! ------------ ! +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA + +USE MODE_IO_FIELD_WRITE, only: IO_Field_write + +USE MODI_BL89 + IMPLICIT NONE ! +TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some diagnostic fields in the syncronous FM-file +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KKB, KKE ! index value for the bBeginning and the End of the physical domain for the mass points +INTEGER, INTENT(IN) :: KKTB, KKTE ! start, end of k loops in physical domain +LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(len=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCEI ! Cloud Entrainment instability index to emphasize localy turbulent fluxes +REAL, INTENT(IN) :: PCEI_MIN ! minimum threshold for the instability index CEI +REAL, INTENT(IN) :: PCEI_MAX ! maximum threshold for the instability index CEI +REAL, INTENT(IN) :: PCOEF_AMPL_SAT ! saturation of the amplification coefficient +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical distance between 2 succesive grid points along the K direction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temperature of the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! initial potential temp. +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! initial mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! TKE +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus along z direction at surface w-point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLT ! conservative pot. temp. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCT ! Second-order flux s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! water var. where +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv/Cp/EXNREF at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA, PAMOIST ! coefficients for s = f (Thetal,Rnp) +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEM ! Mixing length + +INTEGER :: JI, JJ, JK +INTEGER :: JIU,JJU,JKU REAL :: ZPENTE ! Slope of the amplification straight line REAL :: ZCOEF_AMPL_CEI_NUL! Ordonnate at the origin of the ! amplification straight line real, dimension(:,:,:), pointer , contiguous :: zcoef_ampl ! Amplification coefficient of the mixing length - ! when the instability criterium is verified + ! when the instability criterium is verified real, dimension(:,:,:), pointer , contiguous :: zlm_cloud ! Turbulent mixing length in the clouds +REAL, DIMENSION(:,:,:), pointer , contiguous :: ZSHEAR +TYPE(TFIELDDATA) :: TZFIELD ! !------------------------------------------------------------------------------- #ifdef MNH_OPENACC call Print_msg( NVERB_FATAL, 'GEN', 'TURB', 'OpenACC: CLOUD_MODIF_LM not yet implemented' ) #endif +JIU = SIZE( PLEM, 1 ) +JJU = SIZE( PLEM, 2 ) +JKU = SIZE( PLEM, 3 ) + #ifndef MNH_OPENACC -allocate( zcoef_ampl(size( put, 1 ), size( put, 2 ), size( put, 3) ) ) -allocate( zlm_cloud (size( put, 1 ), size( put, 2 ), size( put, 3) ) ) +allocate( zcoef_ampl( jiu, jju, jku ) ) +allocate( zlm_cloud ( jiu, jju, jku ) ) +allocate( zshear ( jiu, jju, jku ) ) #else !Pin positions in the pools of MNH memory CALL MNH_MEM_POSITION_PIN() -CALL MNH_MEM_GET( zcoef_ampl, size( put, 1 ), size( put, 2 ), size( put, 3) ) -CALL MNH_MEM_GET( zlm_cloud , size( put, 1 ), size( put, 2 ), size( put, 3) ) +CALL MNH_MEM_GET( zcoef_ampl, jiu, jju, jku ) +CALL MNH_MEM_GET( zlm_cloud , jiu, jju, jku ) +CALL MNH_MEM_GET( zshear , jiu, jju, jku ) #endif ! !* 1. INITIALISATION @@ -2074,19 +2145,19 @@ ELSE ZSHEAR(:, :, : ) = 0. !$mnh_end_expand_array() !$acc end kernels - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD) + CALL BL89( KKA, KKU, KKL, PZZ, PDZZ, PTHVREF, PTHLM, KRR, PRM, PTKET, ZSHEAR, ZLM_CLOUD ) ! !* 3.2 Delta mixing length ! ------------------- CASE ('DELT') - CALL DELT(KKA,KKU,KKL,IKB, IKE,IKTB, IKTE,ORMC01,HTURBDIM,PDXX, PDYY,PZZ,PDIRCOSZW,ZLM_CLOUD,ODZ=.TRUE.) + CALL DELT( KKA, KKU, KKL, KKB, KKE, KKTB, KKTE, ORMC01, HTURBDIM, PDXX, PDYY, PZZ, PDIRCOSZW, ZLM_CLOUD, ODZ=.TRUE. ) ! !* 3.3 Deardorff mixing length ! ----------------------- CASE ('DEAR') - CALL DEAR(KKA,KKU,KKL,KRR, KRRI, IKB, IKE,IKTB, IKTE, & - ORMC01,HTURBDIM,PDXX, PDYY, PDZZ,PZZ,PDIRCOSZW,PTHLT,PTHVREF,PTKET,PSRCT,PRT,& - ZLOCPEXNM,ZATHETA, ZAMOIST, ZLM_CLOUD) + CALL DEAR( KKA, KKU, KKL, KRR, KRRI, KKB, KKE, KKTB, KKTE, & + ORMC01, HTURBDIM, PDXX, PDYY, PDZZ, PZZ, PDIRCOSZW, PTHLT, PTHVREF, PTKET, PSRCT, PRT, & + PLOCPEXNM, PATHETA, PAMOIST, ZLM_CLOUD ) ! END SELECT ENDIF @@ -2155,9 +2226,6 @@ CALL MNH_MEM_RELEASE() #endif END SUBROUTINE CLOUD_MODIF_LM -! -END SUBROUTINE TURB - !###################