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

Quentin 02/10/2023: ice4_nucleation written as ELEMENTAL included file in...

Quentin 02/10/2023: ice4_nucleation written as ELEMENTAL included file in order to be called either on full arrays (in rain_ice) or packed arrays (in mode_ice4_tendencies)
parent 253c6aca
No related branches found
No related tags found
No related merge requests found
...@@ -3,10 +3,7 @@ ...@@ -3,10 +3,7 @@
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1. !MNH_LIC for details. version 1.
!----------------------------------------------------------------- !-----------------------------------------------------------------
MODULE MODE_ICE4_NUCLEATION ELEMENTAL SUBROUTINE ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, ODCOMPUTE, &
IMPLICIT NONE
CONTAINS
SUBROUTINE ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, KSIZE, ODCOMPUTE, &
PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, &
PRVT, & PRVT, &
PCIT, PRVHENI_MR) PCIT, PRVHENI_MR)
...@@ -32,7 +29,6 @@ USE MODD_CST, ONLY: CST_t ...@@ -32,7 +29,6 @@ USE MODD_CST, ONLY: CST_t
USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t
USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
! !
IMPLICIT NONE IMPLICIT NONE
! !
...@@ -42,114 +38,86 @@ TYPE(CST_t), INTENT(IN) :: CST ...@@ -42,114 +38,86 @@ TYPE(CST_t), INTENT(IN) :: CST
TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI
TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP
TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED
INTEGER, INTENT(IN) :: KSIZE LOGICAL, INTENT(IN) :: ODCOMPUTE
LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: ODCOMPUTE REAL, INTENT(IN) :: PTHT ! Theta at t
REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t REAL, INTENT(IN) :: PPABST ! absolute pressure at t
REAL, DIMENSION(KSIZE), INTENT(IN) :: PPABST ! absolute pressure at t REAL, INTENT(IN) :: PRHODREF! Reference density
REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF! Reference density REAL, INTENT(IN) :: PEXN ! Exner function
REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function REAL, INTENT(IN) :: PLSFACT
REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT REAL, INTENT(IN) :: PT ! Temperature at time t
REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature at time t REAL, INTENT(IN) :: PRVT ! Water vapor m.r. at t
REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t REAL, INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t
REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation
REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation
! !
!* 0.2 declaration of local variables !* 0.2 declaration of local variables
! !
REAL, DIMENSION(KSIZE) :: ZW ! work array REAL :: ZW ! work array
REAL(KIND=JPHOOK) :: ZHOOK_HANDLE LOGICAL :: GNEGT ! Test where to compute the HEN process
LOGICAL, DIMENSION(KSIZE) :: GNEGT ! Test where to compute the HEN process REAL :: ZZW, & ! Work array
REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array
ZUSW, & ! Undersaturation over water ZUSW, & ! Undersaturation over water
ZSSI ! Supersaturation over ice ZSSI ! Supersaturation over ice
INTEGER :: JL
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
! !
IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)!
! !
!$mnh_expand_where(JL=1:KSIZE) IF (ODCOMPUTE) THEN
WHERE(ODCOMPUTE(:)) GNEGT=PT<CST%XTT .AND. PRVT>ICED%XRTMIN(1)
GNEGT(:)=PT(:)<CST%XTT .AND. PRVT(:)>ICED%XRTMIN(1) ELSE
ELSEWHERE GNEGT=.FALSE.
GNEGT(:)=.FALSE. END IF
ENDWHERE
!$mnh_end_expand_where(JL=1:KSIZE)
ZUSW(:)=0. ZUSW=0.
ZZW(:)=0. ZZW=0.
!$mnh_expand_where(JL=1:KSIZE)
WHERE(GNEGT(:))
ZZW(:)=ALOG(PT(:))
ZUSW(:)=EXP(CST%XALPW - CST%XBETAW/PT(:) - CST%XGAMW*ZZW(:)) ! es_w
ZZW(:)=EXP(CST%XALPI - CST%XBETAI/PT(:) - CST%XGAMI*ZZW(:)) ! es_i
END WHERE
!$mnh_end_expand_where(JL=1:KSIZE)
ZSSI(:)=0. IF (GNEGT) THEN
!$mnh_expand_where(JL=1:KSIZE) ZZW=ALOG(PT)
WHERE(GNEGT(:)) ZUSW=EXP(CST%XALPW - CST%XBETAW/PT - CST%XGAMW*ZZW) ! es_w
ZZW(:)=MIN(PPABST(:)/2., ZZW(:)) ! safety limitation ZZW=EXP(CST%XALPI - CST%XBETAI/PT - CST%XGAMI*ZZW) ! es_i
ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (CST%XEPSILO*ZZW(:)) - 1.0 END IF
ZSSI=0.
IF (GNEGT) THEN
ZZW=MIN(PPABST/2., ZZW) ! safety limitation
ZSSI=PRVT*(PPABST-ZZW) / (CST%XEPSILO*ZZW) - 1.0
! Supersaturation over ice ! Supersaturation over ice
ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:)) ! safety limitation ZUSW=MIN(PPABST/2., ZUSW) ! safety limitation
ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0 ZUSW=(ZUSW/ZZW)*((PPABST-ZZW)/(PPABST-ZUSW)) - 1.0
! Supersaturation of saturated water vapor over ice ! Supersaturation of saturated water vapor over ice
! ZSSI=MIN(ZSSI, ZUSW) ! limitation of SSi according to SSw=0
!* 3.1 compute the heterogeneous nucleation source RVHENI END IF
!
!* 3.1.1 compute the cloud ice concentration ZZW=0.
!
ZSSI(:)=MIN(ZSSI(:), ZUSW(:)) ! limitation of SSi according to SSw=0
END WHERE
!$mnh_end_expand_where(JL=1:KSIZE)
ZZW(:)=0. IF(GNEGT) THEN
DO JL=1,KSIZE IF(PT<CST%XTT-5.0 .AND. ZSSI>0.0) THEN
IF(GNEGT(JL)) THEN ZZW=ICEP%XNU20*EXP(ICEP%XALPHA2*ZSSI-ICEP%XBETA2)
IF(PT(JL)<CST%XTT-5.0 .AND. ZSSI(JL)>0.0) THEN ELSEIF(PT<=CST%XTT-2.0 .AND. PT>=CST%XTT-5.0 .AND. ZSSI>0.0) THEN
ZZW(JL)=ICEP%XNU20*EXP(ICEP%XALPHA2*ZSSI(JL)-ICEP%XBETA2) ZZW=MAX(ICEP%XNU20*EXP(-ICEP%XBETA2 ), &
ELSEIF(PT(JL)<=CST%XTT-2.0 .AND. PT(JL)>=CST%XTT-5.0 .AND. ZSSI(JL)>0.0) THEN ICEP%XNU10*EXP(-ICEP%XBETA1*(PT-CST%XTT))*(ZSSI/ZUSW)**ICEP%XALPHA1)
ZZW(JL)=MAX(ICEP%XNU20*EXP(-ICEP%XBETA2 ), &
ICEP%XNU10*EXP(-ICEP%XBETA1*(PT(JL)-CST%XTT))*(ZSSI(JL)/ZUSW(JL))**ICEP%XALPHA1)
ENDIF
ENDIF ENDIF
ENDDO ENDIF
!$mnh_expand_where(JL=1:KSIZE) IF (GNEGT) THEN
WHERE(GNEGT(:)) ZZW=ZZW-PCIT
ZZW(:)=ZZW(:)-PCIT(:) ZZW=MIN(ZZW, 50.E3) ! limitation provisoire a 50 l^-1
ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 END IF
END WHERE
!$mnh_end_expand_where(JL=1:KSIZE)
PRVHENI_MR(:)=0. PRVHENI_MR=0.
!$mnh_expand_where(JL=1:KSIZE)
WHERE(GNEGT(:)) IF (GNEGT) THEN
! PRVHENI_MR=MAX(ZZW, 0.0)*ICEP%XMNU0/PRHODREF
!* 3.1.2 update the r_i and r_v mixing ratios PRVHENI_MR=MIN(PRVT, PRVHENI_MR)
! END IF
PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*ICEP%XMNU0/PRHODREF(:)
PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:))
END WHERE
!$mnh_end_expand_where(JL=1:KSIZE)
!Limitation due to 0 crossing of temperature !Limitation due to 0 crossing of temperature
IF(PARAMI%LFEEDBACKT) THEN IF(PARAMI%LFEEDBACKT) THEN
ZW(:)=0. ZW=0.
!$mnh_expand_where(JL=1:KSIZE) IF (GNEGT) THEN
WHERE(GNEGT(:)) ZW=MIN(PRVHENI_MR, &
ZW(:)=MIN(PRVHENI_MR(:), & MAX(0., (CST%XTT/PEXN-PTHT)/PLSFACT)) / &
MAX(0., (CST%XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / & MAX(PRVHENI_MR, 1.E-20)
MAX(PRVHENI_MR(:), 1.E-20) END IF
END WHERE PRVHENI_MR=PRVHENI_MR*ZW
PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) ZZW=ZZW*ZW
ZZW(:)=ZZW(:)*ZW(:)
!$mnh_end_expand_where(JL=1:KSIZE)
ENDIF ENDIF
!$mnh_expand_where(JL=1:KSIZE) IF (GNEGT) THEN
WHERE(GNEGT(:)) PCIT=MAX(ZZW+PCIT, PCIT)
PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) END IF
END WHERE
!$mnh_end_expand_where(JL=1:KSIZE)
!
IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE)
END SUBROUTINE ICE4_NUCLEATION END SUBROUTINE ICE4_NUCLEATION
END MODULE MODE_ICE4_NUCLEATION
...@@ -54,7 +54,6 @@ USE MODE_ICE4_FAST_RS, ONLY: ICE4_FAST_RS ...@@ -54,7 +54,6 @@ USE MODE_ICE4_FAST_RS, ONLY: ICE4_FAST_RS
USE MODE_ICE4_FAST_RG, ONLY: ICE4_FAST_RG USE MODE_ICE4_FAST_RG, ONLY: ICE4_FAST_RG
USE MODE_ICE4_FAST_RH, ONLY: ICE4_FAST_RH USE MODE_ICE4_FAST_RH, ONLY: ICE4_FAST_RH
USE MODE_ICE4_FAST_RI, ONLY: ICE4_FAST_RI USE MODE_ICE4_FAST_RI, ONLY: ICE4_FAST_RI
USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION
! !
USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
! !
...@@ -135,10 +134,10 @@ ELSE ...@@ -135,10 +134,10 @@ ELSE
! !
!* 2. COMPUTES THE SLOW COLD PROCESS SOURCES !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES
! -------------------------------------- ! --------------------------------------
CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, KSIZE, LDCOMPUTE(:), & CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, LDCOMPUTE(1:KSIZE), &
ZVART(:,ITH), PPRES(:), PRHODREF(:), PEXN(:), PLSFACT(:), ZT(:), & ZVART(1:KSIZE,ITH), PPRES(1:KSIZE), PRHODREF(1:KSIZE), PEXN(1:KSIZE), PLSFACT(1:KSIZE), ZT(1:KSIZE), &
ZVART(:,IRV), & ZVART(1:KSIZE,IRV), &
PCIT(:), PBU_INST(:, IRVHENI_MR)) PCIT(1:KSIZE), PBU_INST(1:KSIZE, IRVHENI_MR))
DO JL=1, KSIZE DO JL=1, KSIZE
ZVART(JL,ITH)=ZVART(JL,ITH) + PBU_INST(JL, IRVHENI_MR)*PLSFACT(JL) ZVART(JL,ITH)=ZVART(JL,ITH) + PBU_INST(JL, IRVHENI_MR)*PLSFACT(JL)
ZT(JL) = ZVART(JL,ITH) * PEXN(JL) ZT(JL) = ZVART(JL,ITH) * PEXN(JL)
...@@ -549,5 +548,7 @@ ENDDO ...@@ -549,5 +548,7 @@ ENDDO
! !
IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 1, ZHOOK_HANDLE) IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 1, ZHOOK_HANDLE)
! !
CONTAINS
INCLUDE "ice4_nucleation.func.h"
END SUBROUTINE ICE4_TENDENCIES END SUBROUTINE ICE4_TENDENCIES
END MODULE MODE_ICE4_TENDENCIES END MODULE MODE_ICE4_TENDENCIES
...@@ -203,7 +203,6 @@ USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT ...@@ -203,7 +203,6 @@ USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT
USE MODE_ICE4_COMPUTE_PDF, ONLY: ICE4_COMPUTE_PDF USE MODE_ICE4_COMPUTE_PDF, ONLY: ICE4_COMPUTE_PDF
USE MODE_ICE4_SEDIMENTATION, ONLY: ICE4_SEDIMENTATION USE MODE_ICE4_SEDIMENTATION, ONLY: ICE4_SEDIMENTATION
USE MODE_ICE4_PACK, ONLY: ICE4_PACK USE MODE_ICE4_PACK, ONLY: ICE4_PACK
USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION
USE MODE_ICE4_CORRECT_NEGATIVITIES, ONLY: ICE4_CORRECT_NEGATIVITIES USE MODE_ICE4_CORRECT_NEGATIVITIES, ONLY: ICE4_CORRECT_NEGATIVITIES
! !
IMPLICIT NONE IMPLICIT NONE
...@@ -418,7 +417,7 @@ DO JK=IKTB,IKTE ...@@ -418,7 +417,7 @@ DO JK=IKTB,IKTE
ENDIF ENDIF
ENDDO ENDDO
ENDDO ENDDO
CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, D%NIJT*D%NKT, LLW3D(:,:), & CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, LLW3D(:,:), &
PTHT(:, :), PPABST(:, :), PRHODREF(:, :), & PTHT(:, :), PPABST(:, :), PRHODREF(:, :), &
PEXN(:, :), ZW3D(:, :), ZT(:, :), & PEXN(:, :), ZW3D(:, :), ZT(:, :), &
PRVT(:, :), & PRVT(:, :), &
...@@ -669,4 +668,6 @@ ENDIF ...@@ -669,4 +668,6 @@ ENDIF
IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 1, ZHOOK_HANDLE) IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 1, ZHOOK_HANDLE)
! !
CONTAINS
INCLUDE "ice4_nucleation.func.h"
END SUBROUTINE RAIN_ICE END SUBROUTINE RAIN_ICE
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment