-
Notifications
You must be signed in to change notification settings - Fork 155
Open
Description
Fortran file:
SUBROUTINE rain_evaporation_abel_boutle( KIDIA, KFDIA, KLON, &
ZTP1, ZQX_NCLDQV, ZA, ZQSLIQ, ZQXFG_NCLDQR, &
ZCOVPTOT, ZCOVPCLR, ZCOVPMAX, ZRHO, PAP, &
ZSOLQA, ZEVAP_OUT, &
RTT, RV, RD, RPRECRHMAX, RCOVPMIN, RDENSREF, PTSPHY, ZEPSEC, &
RCL_FAC1, RCL_FAC2, RCL_CDENOM1, RCL_CDENOM2, RCL_CDENOM3, &
RCL_KA273, RCL_CONST1R, RCL_CONST2R, RCL_CONST3R, RCL_CONST4R, &
NCLDQV, NCLDQR, NCLV ) BIND(C, NAME="rain_evaporation_abel_boutle")
USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_int, c_double, c_bool
IMPLICIT NONE
! Dimensions
INTEGER(c_int), VALUE :: KIDIA, KFDIA, KLON
INTEGER(c_int), VALUE :: NCLV
INTEGER(c_int), VALUE :: NCLDQV, NCLDQR
! Input arrays (1D over JL = 1..KFDIA)
REAL(c_double), INTENT(IN) :: ZTP1(KLON)
REAL(c_double), INTENT(IN) :: ZQX_NCLDQV(KLON)
REAL(c_double), INTENT(IN) :: ZA(KLON)
REAL(c_double), INTENT(IN) :: ZQSLIQ(KLON)
REAL(c_double), INTENT(IN) :: ZRHO(KLON)
REAL(c_double), INTENT(IN) :: PAP(KLON)
! InOut arrays
REAL(c_double), INTENT(INOUT) :: ZQXFG_NCLDQR(KLON)
REAL(c_double), INTENT(INOUT) :: ZCOVPTOT(KLON)
REAL(c_double), INTENT(INOUT) :: ZCOVPCLR(KLON)
REAL(c_double), INTENT(IN) :: ZCOVPMAX(KLON)
! Output arrays
REAL(c_double), INTENT(INOUT) :: ZSOLQA(KLON, NCLV, NCLV)
REAL(c_double), INTENT(OUT) :: ZEVAP_OUT(KLON)
! Constants
REAL(c_double), VALUE :: RTT, RV, RD
REAL(c_double), VALUE :: RPRECRHMAX, RCOVPMIN, RDENSREF, PTSPHY, ZEPSEC
REAL(c_double), VALUE :: RCL_FAC1, RCL_FAC2
REAL(c_double), VALUE :: RCL_CDENOM1, RCL_CDENOM2, RCL_CDENOM3
REAL(c_double), VALUE :: RCL_KA273
REAL(c_double), VALUE :: RCL_CONST1R, RCL_CONST2R, RCL_CONST3R, RCL_CONST4R
! Local variables
INTEGER(c_int) :: JL
REAL(c_double) :: ZZRH, ZQE, ZPRECLR, ZFALLCORR, ZESATLIQ
REAL(c_double) :: ZLAMBDA, ZEVAP_DENOM, ZCORR2, ZKA, ZSUBSAT
REAL(c_double) :: ZBETA, ZDENOM, ZDPEVAP, ZEVAP
LOGICAL(c_bool) :: LLO1
! Local constants for saturation vapor pressure
REAL(c_double) :: R2ES_LOCAL, R3LES_LOCAL, R4LES_LOCAL
R2ES_LOCAL = 611.21D0
R3LES_LOCAL = 17.502D0
R4LES_LOCAL = 32.19D0
! Initialize output
ZEVAP_OUT(:) = 0.0D0
! Main computation loop
DO JL = 1, KLON
ZZRH = RPRECRHMAX + (1.0D0 - RPRECRHMAX) * ZCOVPMAX(JL) / &
MAX(ZEPSEC, 1.0D0 - ZA(JL))
ZZRH = MIN(MAX(ZZRH, RPRECRHMAX), 1.0D0)
ZZRH = MIN(0.8D0, ZZRH)
ZQE = MAX(0.0D0, MIN(ZQX_NCLDQV(JL), ZQSLIQ(JL)))
LLO1 = (ZCOVPCLR(JL) > ZEPSEC) .AND. &
(ZQXFG_NCLDQR(JL) > ZEPSEC) .AND. &
(ZQE < ZZRH * ZQSLIQ(JL))
IF (LLO1) THEN
ZPRECLR = ZQXFG_NCLDQR(JL) / ZCOVPTOT(JL)
ZFALLCORR = (RDENSREF / ZRHO(JL))**0.4D0
ZESATLIQ = RV / RD * R2ES_LOCAL * EXP(R3LES_LOCAL * (ZTP1(JL) - RTT) / &
(ZTP1(JL) - R4LES_LOCAL))
ZLAMBDA = (RCL_FAC1 / (ZRHO(JL) * ZPRECLR))**RCL_FAC2
ZEVAP_DENOM = RCL_CDENOM1 * ZESATLIQ - RCL_CDENOM2 * ZTP1(JL) * ZESATLIQ &
+ RCL_CDENOM3 * ZTP1(JL)**3 * PAP(JL)
ZCORR2 = (ZTP1(JL) / 273.0D0)**1.5D0 * 393.0D0 / (ZTP1(JL) + 120.0D0)
ZKA = RCL_KA273 * ZCORR2
ZSUBSAT = MAX(ZZRH * ZQSLIQ(JL) - ZQE, 0.0D0)
ZBETA = (0.5D0 / ZQSLIQ(JL)) * ZTP1(JL)**2 * ZESATLIQ * &
RCL_CONST1R * (ZCORR2 / ZEVAP_DENOM) * &
(0.78D0 / (ZLAMBDA**RCL_CONST4R) + &
RCL_CONST2R * (ZRHO(JL) * ZFALLCORR)**0.5D0 / &
(ZCORR2**0.5D0 * ZLAMBDA**RCL_CONST3R))
ZDENOM = 1.0D0 + ZBETA * PTSPHY
ZDPEVAP = ZCOVPCLR(JL) * ZBETA * PTSPHY * ZSUBSAT / ZDENOM
ZEVAP = MIN(ZDPEVAP, ZQXFG_NCLDQR(JL))
ZEVAP_OUT(JL) = ZEVAP
ZSOLQA(JL, NCLDQV, NCLDQR) = ZSOLQA(JL, NCLDQV, NCLDQR) + ZEVAP
ZSOLQA(JL, NCLDQR, NCLDQV) = ZSOLQA(JL, NCLDQR, NCLDQV) - ZEVAP
ZCOVPTOT(JL) = MAX(RCOVPMIN, ZCOVPTOT(JL) - MAX(0.0D0, &
(ZCOVPTOT(JL) - ZA(JL)) * ZEVAP / ZQXFG_NCLDQR(JL)))
ZQXFG_NCLDQR(JL) = ZQXFG_NCLDQR(JL) - ZEVAP
END IF
END DO
END SUBROUTINE rain_evaporation_abel_boutle
Commands to reproduce:
python -m dace.frontend.fortran.tools.create_preprocessed_ast \
-i ./rain_evaporation_abel_boutle.f90 \
-o ./rain_evaporation_abel_boutle_ast.f90 \
-k rain_evaporation_abel_boutle \
--noop mo_exception.finish \
--noop mo_real_timer.timer_start \
--noop mo_real_timer.timer_stop
python -m dace.frontend.fortran.tools.create_singular_sdfg_from_ast \
-i ./rain_evaporation_abel_boutle_ast.f90 \
-k rain_evaporation_abel_boutle \
-o ./rain_evaporation.sdfg
(On the same folder as the f90 file)
The resulting SDFG is invalid, check with .validate()
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels