Skip to content
Snippets Groups Projects
Commit d1ce8008 authored by RODIER Quentin's avatar RODIER Quentin
Browse files

Quentin 29/03/2022: Expand Array mode_tke_eps_sources.F90

parent f7e86c47
No related branches found
No related tags found
No related merge requests found
...@@ -213,7 +213,10 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: & ...@@ -213,7 +213,10 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: &
ZFLX, & ! horizontal or vertical flux of the treated variable ZFLX, & ! horizontal or vertical flux of the treated variable
ZSOURCE, & ! source of evolution for the treated variable ZSOURCE, & ! source of evolution for the treated variable
ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE )
ZTR ! Transport term ZTR, & ! Transport term
ZMWORK1,ZMWORK2,& ! working var. for MZM/MZF operators (array syntax)
ZDWORK1,ZDWORK2 ! working var. for DZM/DZF operators (array syntax)
LOGICAL,DIMENSION(D%NIT,D%NJT,D%NKT) :: GTKENEG LOGICAL,DIMENSION(D%NIT,D%NJT,D%NKT) :: GTKENEG
! 3D mask .T. if TKE < CSTURB%XTKEMIN ! 3D mask .T. if TKE < CSTURB%XTKEMIN
INTEGER :: IKB ! Index values for the Beginning and End INTEGER :: IKB ! Index values for the Beginning and End
...@@ -223,6 +226,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange ...@@ -223,6 +226,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange
INTEGER :: IINFO_ll ! return code of parallel routine INTEGER :: IINFO_ll ! return code of parallel routine
TYPE(TFIELDDATA) :: TZFIELD TYPE(TFIELDDATA) :: TZFIELD
REAL(KIND=JPRB) :: ZHOOK_HANDLE REAL(KIND=JPRB) :: ZHOOK_HANDLE
INTEGER :: JI,JJ,JK
! !
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
NULLIFY(TZFIELDDISS_ll) NULLIFY(TZFIELDDISS_ll)
...@@ -235,7 +239,13 @@ IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE) ...@@ -235,7 +239,13 @@ IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE)
IKB=D%NKB IKB=D%NKB
! !
! compute the effective diffusion coefficient at the mass point ! compute the effective diffusion coefficient at the mass point
ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
ZKEFF(JI,JJ,JK) = PLM(JI,JJ,JK) * SQRT(PTKEM(JI,JJ,JK))
ENDDO
ENDDO
ENDDO
! !
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
! !
...@@ -258,14 +268,26 @@ END IF ...@@ -258,14 +268,26 @@ END IF
! !
! extrapolate the dynamic production with a 1/Z law from its value at the ! extrapolate the dynamic production with a 1/Z law from its value at the
! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB) ! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB)
PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+D%NKL)/PDZZ(:,:,IKB)) !
DO JJ=1,D%NJT
DO JI=1,D%NIT
PDP(JI,JJ,IKB) = PDP(JI,JJ,IKB) * (1. + PDZZ(JI,JJ,IKB+D%NKL)/PDZZ(JI,JJ,IKB))
ENDDO
ENDDO
! !
! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..) ! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..)
! + (Dynamical Production) + (Thermal Production) - (dissipation) ! + (Dynamical Production) + (Thermal Production) - (dissipation)
ZFLX(:,:,:) = CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) !
ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) & ZMWORK1 = MZM(ZKEFF, D%NKA, D%NKU, D%NKL)
- PTKEM(:,:,:) / PTSTEP & ZMWORK2 = MZM(PRHODJ, D%NKA, D%NKU, D%NKL)
+ PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) !
DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
ZFLX(JI,JJ,JK) = CSTURB%XCED * SQRT(PTKEM(JI,JJ,JK)) / PLEPS(JI,JJ,JK)
ZSOURCE(JI,JJ,JK) = ( PRTKES(JI,JJ,JK) + PRTKEMS(JI,JJ,JK) ) / PRHODJ(JI,JJ,JK) &
- PTKEM(JI,JJ,JK) / PTSTEP &
+ PDP(JI,JJ,JK) + PTP(JI,JJ,JK) + ZTR(JI,JJ,JK) - PEXPL * ZFLX(JI,JJ,JK) * PTKEM(JI,JJ,JK)
! !
!* 2.2 implicit vertical TKE transport !* 2.2 implicit vertical TKE transport
! !
...@@ -273,8 +295,10 @@ ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) & ...@@ -273,8 +295,10 @@ ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) &
! Compute the vector giving the elements just under the diagonal for the ! Compute the vector giving the elements just under the diagonal for the
! matrix inverted in TRIDIAG ! matrix inverted in TRIDIAG
! !
ZA(:,:,:) = - PTSTEP * CSTURB%XCET * & ZA(JI,JJ,JK) = - PTSTEP * CSTURB%XCET * ZMWORK1(JI,JJ,JK) * ZMWORK2(JI,JJ,JK) / PDZZ(JI,JJ,JK)**2
MZM(ZKEFF, D%NKA, D%NKU, D%NKL) * MZM(PRHODJ, D%NKA, D%NKU, D%NKL) / PDZZ**2 ENDDO
ENDDO
ENDDO
! !
! Compute TKE at time t+deltat: ( stored in ZRES ) ! Compute TKE at time t+deltat: ( stored in ZRES )
! !
...@@ -285,8 +309,15 @@ CALL GET_HALO(ZRES) ...@@ -285,8 +309,15 @@ CALL GET_HALO(ZRES)
!* diagnose the dissipation !* diagnose the dissipation
! !
IF (LDIAG_IN_RUN) THEN IF (LDIAG_IN_RUN) THEN
XCURRENT_TKE_DISS = ZFLX(:,:,:) * PTKEM(:,:,:) & DO JK=1,D%NKT
*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) DO JJ=1,D%NJT
DO JI=1,D%NIT
XCURRENT_TKE_DISS(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PTKEM(JI,JJ,JK) &
*(PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK))
ENDDO
ENDDO
ENDDO
!
CALL ADD3DFIELD_ll( TZFIELDDISS_ll, XCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::XCURRENT_TKE_DISS' ) CALL ADD3DFIELD_ll( TZFIELDDISS_ll, XCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::XCURRENT_TKE_DISS' )
CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll) CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll)
CALL CLEANLIST_ll(TZFIELDDISS_ll) CALL CLEANLIST_ll(TZFIELDDISS_ll)
...@@ -295,27 +326,54 @@ ENDIF ...@@ -295,27 +326,54 @@ ENDIF
! TKE must be greater than its minimum value ! TKE must be greater than its minimum value
! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH ! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH
IF(HPROGRAM/='MESONH') THEN IF(HPROGRAM/='MESONH') THEN
GTKENEG = ZRES <= CSTURB%XTKEMIN GTKENEG = ZRES <= CSTURB%XTKEMIN
WHERE ( GTKENEG ) DO JK=1,D%NKT
ZRES = CSTURB%XTKEMIN DO JJ=1,D%NJT
END WHERE DO JI=1,D%NIT
IF ( GTKENEG(JI,JJ,JK) ) THEN
ZRES(JI,JJ,JK) = CSTURB%XTKEMIN
ENDIF
ENDDO
ENDDO
ENDDO
END IF END IF
PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) !
DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
PTDISS(JI,JJ,JK) = - ZFLX(JI,JJ,JK)*(PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK))
ENDDO
ENDDO
ENDDO
! !
IF ( OLES_CALL .OR. & IF ( OLES_CALL .OR. &
(OTURB_DIAG .AND. TPFILE%LOPENED) ) THEN (OTURB_DIAG .AND. TPFILE%LOPENED) ) THEN
! !
! Compute the cartesian vertical flux of TKE in ZFLX ! Compute the cartesian vertical flux of TKE in ZFLX
! !
ZFLX(:,:,:) = - CSTURB%XCET * MZM(ZKEFF, D%NKA, D%NKU, D%NKL) * & ZMWORK1 = MZM(ZKEFF, D%NKA, D%NKU, D%NKL)
DZM(PIMPL * ZRES + PEXPL * PTKEM, D%NKA, D%NKU, D%NKL) / PDZZ ZDWORK1 = DZM(PIMPL * ZRES + PEXPL * PTKEM, D%NKA, D%NKU, D%NKL)
DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
ZFLX(JI,JJ,JK) = - CSTURB%XCET * ZMWORK1(JI,JJ,JK) * ZDWORK1(JI,JJ,JK) / PDZZ(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
! !
ZFLX(:,:,IKB) = 0. ZFLX(:,:,IKB) = 0.
ZFLX(:,:,D%NKA) = 0. ZFLX(:,:,D%NKA) = 0.
! !
! Compute the whole turbulent TRansport of TKE: ! Compute the whole turbulent TRansport of TKE:
! !
ZTR(:,:,:)= ZTR - DZF(MZM(PRHODJ, D%NKA, D%NKU, D%NKL) * ZFLX / PDZZ, D%NKA, D%NKU, D%NKL) /PRHODJ ZDWORK1 = DZF(MZM(PRHODJ, D%NKA, D%NKU, D%NKL) * ZFLX / PDZZ, D%NKA, D%NKU, D%NKL)
DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
ZTR(JI,JJ,JK)= ZTR(JI,JJ,JK) - ZDWORK1(JI,JJ,JK) /PRHODJ(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
! !
! Storage in the LES configuration ! Storage in the LES configuration
! !
...@@ -343,16 +401,28 @@ END IF ...@@ -343,16 +401,28 @@ END IF
!Store the previous source terms in prtkes before initializing the next one !Store the previous source terms in prtkes before initializing the next one
!Should be in IF LBUDGET_TKE only. Was removed out for a correct comput. of PTDIFF in case of LBUDGET_TKE=F in AROME !Should be in IF LBUDGET_TKE only. Was removed out for a correct comput. of PTDIFF in case of LBUDGET_TKE=F in AROME
PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) * & DO JK=1,D%NKT
( PDP(:,:,:) + PTP(:,:,:) & DO JJ=1,D%NJT
- CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) DO JI=1,D%NIT
PRTKES(JI,JJ,JK) = PRTKES(JI,JJ,JK) + PRHODJ(JI,JJ,JK) * &
( PDP(JI,JJ,JK) + PTP(JI,JJ,JK) &
- CSTURB%XCED * SQRT(PTKEM(JI,JJ,JK)) / PLEPS(JI,JJ,JK) * ( PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK) ) )
!
PTDIFF(JI,JJ,JK) = ZRES(JI,JJ,JK) / PTSTEP - PRTKES(JI,JJ,JK)/PRHODJ(JI,JJ,JK) &
& - PDP(JI,JJ,JK)- PTP(JI,JJ,JK) - PTDISS(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
! !
PTDIFF(:,:,:) = ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) &
& - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:)
IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) )
! !
PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - PRTKEMS(:,:,:) DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
PRTKES(JI,JJ,JK) = ZRES(JI,JJ,JK) * PRHODJ(JI,JJ,JK) / PTSTEP - PRTKEMS(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
! !
! stores the whole turbulent transport ! stores the whole turbulent transport
! !
...@@ -363,16 +433,39 @@ IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTK ...@@ -363,16 +433,39 @@ IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTK
!* 3. COMPUTE THE DISSIPATIVE HEATING !* 3. COMPUTE THE DISSIPATIVE HEATING
! ------------------------------- ! -------------------------------
! !
PRTHLS(:,:,:) = PRTHLS(:,:,:) + CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & DO JK=1,D%NKT
(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) DO JJ=1,D%NJT
DO JI=1,D%NIT
PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) + CSTURB%XCED * SQRT(PTKEM(JI,JJ,JK)) / PLEPS(JI,JJ,JK) * &
(PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK)) * PRHODJ(JI,JJ,JK) * PCOEF_DISS(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
!---------------------------------------------------------------------------- !----------------------------------------------------------------------------
! !
!* 4. STORES SOME DIAGNOSTICS !* 4. STORES SOME DIAGNOSTICS
! ----------------------- ! -----------------------
! !
IF(PRESENT(PDISS)) PDISS(:,:,:) = -CSTURB%XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:)
IF(PRESENT(PTR)) PTR=ZTR IF(PRESENT(PTR)) PTR=ZTR
IF(PRESENT(PEDR)) PEDR = CSTURB%XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) IF(PRESENT(PDISS)) THEN
DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
PDISS(JI,JJ,JK) = -CSTURB%XCED * (PTKEM(JI,JJ,JK)**1.5) / PLEPS(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
END IF
!
IF(PRESENT(PEDR)) THEN
DO JK=1,D%NKT
DO JJ=1,D%NJT
DO JI=1,D%NIT
PEDR(JI,JJ,JK) = CSTURB%XCED * (PTKEM(JI,JJ,JK)**1.5) / PLEPS(JI,JJ,JK)
ENDDO
ENDDO
ENDDO
END IF
! !
IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN
! !
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment