spcl / spcl/dace

F2DaCe Auto Inlining Failing

Open
#2,249 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
593
Forks
163
Avg merge
2d 23h
Merged PRs (30d)
60

Description

```

SUBROUTINE compute_saturation_values(KIDIA, KFDIA, KLON, KLEV, ZTP1, PAP, &
& ZFOEALFA, ZFOEEWMT, ZQSMIX, ZFOEEW, ZQSICE, ZFOEELIQT, ZQSLIQ, &
& RTT, RETV, R2ES, R3LES, R3IES, R4LES, R4IES, RTICE, RTWAT, RTWAT_RTICE_R) BIND(c)

use iso_c_binding, only: c_int, c_double
implicit none

! ===============================
! Integer arguments (by value)
! ===============================
integer(c_int), value :: KIDIA ! start column (1)
integer(c_int), value :: KFDIA ! end column (= KLON)
integer(c_int), value :: KLON ! horizontal size
integer(c_int), value :: KLEV ! vertical size

! ===============================
! Array arguments
! ===============================
real(c_double), intent(in) :: ZTP1 (KLON, KLEV)
real(c_double), intent(in) :: PAP (KLON, KLEV)
real(c_double), intent(out) :: ZFOEALFA (KLON, KLEV)
real(c_double), intent(out) :: ZFOEEWMT (KLON, KLEV)
real(c_double), intent(out) :: ZQSMIX (KLON, KLEV)
real(c_double), intent(out) :: ZFOEEW (KLON, KLEV)
real(c_double), intent(out) :: ZQSICE (KLON, KLEV)
real(c_double), intent(out) :: ZFOEELIQT(KLON, KLEV)
real(c_double), intent(out) :: ZQSLIQ (KLON, KLEV)

! ===============================
! Scalar arguments (by value)
! ===============================
real(c_double), value :: RTT
real(c_double), value :: RETV
real(c_double), value :: R2ES
real(c_double), value :: R3LES
real(c_double), value :: R3IES
real(c_double), value :: R4LES
real(c_double), value :: R4IES
real(c_double), value :: RTICE
real(c_double), value :: RTWAT
real(c_double), value :: RTWAT_RTICE_R

! Statement functions (inlined)
REAL(8) :: FOEALFA, FOEEWM, FOEDELTA, FOEELIQ, FOEEICE
REAL(8) :: PTARE

FOEDELTA(PTARE) = MAX(0.0D0, SIGN(1.0D0, PTARE-RTT))
FOEALFA(PTARE) = MIN(1.0D0, ((MAX(RTICE, MIN(RTWAT, PTARE)) - RTICE) * RTWAT_RTICE_R)**2)
FOEEWM(PTARE) = R2ES * (FOEALFA(PTARE) * EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES)) + &
(1.0D0 - FOEALFA(PTARE)) * EXP(R3IES*(PTARE-RTT)/(PTARE-R4IES)))

FOEELIQ(PTARE) = R2ES * EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES))
FOEEICE(PTARE) = R2ES * EXP(R3IES*(PTARE-RTT)/(PTARE-R4IES))

integer(c_int) :: JK, JL
real(c_double) :: ZALFA

! Main computation loop
DO JK = 1, KLEV
DO JL = 1, KLON
ZFOEALFA(JL,JK) = FOEALFA(ZTP1(JL,JK))
ZFOEEWMT(JL,JK) = MIN(FOEEWM(ZTP1(JL,JK)) / PAP(JL,JK), 0.5D0)
ZQSMIX(JL,JK) = ZFOEEWMT(JL,JK)
ZQSMIX(JL,JK) = ZQSMIX(JL,JK) / (1.0D0 - RETV * ZQSMIX(JL,JK))

ZALFA = FOEDELTA(ZTP1(JL,JK))
ZFOEEW(JL,JK) = MIN((ZALFA * FOEELIQ(ZTP1(JL,JK)) + &
(1.0D0 - ZALFA) * FOEEICE(ZTP1(JL,JK))) / PAP(JL,JK), 0.5D0)
ZFOEEW(JL,JK) = MIN(0.5D0, ZFOEEW(JL,JK))
ZQSICE(JL,JK) = ZFOEEW(JL,JK) / (1.0D0 - RETV * ZFOEEW(JL,JK))

ZFOEELIQT(JL,JK) = MIN(FOEELIQ(ZTP1(JL,JK)) / PAP(JL,JK), 0.5D0)
ZQSLIQ(JL,JK) = ZFOEELIQT(JL,JK)
ZQSLIQ(JL,JK) = ZQSLIQ(JL,JK) / (1.0D0 - RETV * ZQSLIQ(JL,JK))
ENDDO
ENDDO

END SUBROUTINE compute_saturation_values

```

The auto-inlining in this function fails:
To repro:
```
python -m dace.frontend.fortran.tools.create_preprocessed_ast \
-i ./saturation_calculation.f90 \
-o ./saturation_calculation_ast.f90 \
-k compute_saturation_values \
--noop mo_exception.finish \
--noop mo_real_timer.timer_start \
--noop mo_real_timer.timer_stop

```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.