Skip to content

F2DaCe generates connector names colliding with array names #2248

@ThrudPrimrose

Description

@ThrudPrimrose

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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions