From fd180f8e08a1b92037ebce7cca4901411c8953cc Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 19 Dec 2024 05:40:36 +0000 Subject: [PATCH 1/4] Loki: Remove redundant import in Loki cloudsc.F90 kernel --- src/cloudsc_loki/cloudsc.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cloudsc_loki/cloudsc.F90 b/src/cloudsc_loki/cloudsc.F90 index d6a4c7d3..c5112f26 100644 --- a/src/cloudsc_loki/cloudsc.F90 +++ b/src/cloudsc_loki/cloudsc.F90 @@ -135,7 +135,6 @@ SUBROUTINE CLOUDSC & !=============================================================================== USE PARKIND1 , ONLY : JPIM, JPRB -USE YOMPHYDER ,ONLY : STATE_TYPE USE YOMCST , ONLY : RG, RD, RCPD, RETV, RLVTT, RLSTT, RLMLT, RTT, RV USE YOETHF , ONLY : R2ES, R3LES, R3IES, R4LES, R4IES, R5LES, R5IES, & & R5ALVCP, R5ALSCP, RALVDCP, RALSDCP, RALFDCP, RTWAT, RTICE, RTICECU, & From cbd0d199cd5db316ff853d5344bff2912a04bb9e Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 19 Dec 2024 05:46:56 +0000 Subject: [PATCH 2/4] Loki: Only use stmt functions via imported headers in Loki variants This removes a lot of the handholding needed for the C-specific transpile variant, where the utility functions where previously inlined from re-written elemental functions. Instead we now configure the Loki `InlineTransformation` to inline those, and force the CLOUDSC kernel to be preprocessed, so that we may find the comdeck functions. Note, I've left the source for the re-written elemental functions in the common directory for reference. If that becomes annoying, these can now be removed. --- src/cloudsc_loki/CMakeLists.txt | 20 -------------------- src/cloudsc_loki/cloudsc.F90 | 6 ------ src/cloudsc_loki/cloudsc_loki.config | 15 +++++++++++++++ 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/cloudsc_loki/CMakeLists.txt b/src/cloudsc_loki/CMakeLists.txt index a25cc7d0..ccb5fa70 100644 --- a/src/cloudsc_loki/CMakeLists.txt +++ b/src/cloudsc_loki/CMakeLists.txt @@ -30,12 +30,6 @@ if( HAVE_CLOUDSC_LOKI ) set( LOKI_FRONTEND "fp" CACHE STRING "Frontend parser for Loki transforms" ) - # OFP frontend cannot deal with statement functions, so we toggle them here - set( CLOUDSC_DEFINE_STMT_FUNC "" ) - if(NOT "${LOKI_FRONTEND}" STREQUAL "ofp") - set( CLOUDSC_DEFINE_STMT_FUNC CLOUDSC_STMT_FUNC ) - endif() - #################################################### ## Idempotence mode: ## ## * Internal "do-nothing" mode for Loki debug ## @@ -54,8 +48,6 @@ if( HAVE_CLOUDSC_LOKI ) MODE idem CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config CPP - DEFINITIONS - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -133,8 +125,6 @@ if( HAVE_CLOUDSC_LOKI ) MODE idem-stack CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config CPP - DEFINITIONS - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -220,8 +210,6 @@ if( HAVE_CLOUDSC_LOKI ) MODE sca CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config CPP - DEFINITIONS - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -284,8 +272,6 @@ if( HAVE_CLOUDSC_LOKI ) MODE claw-cpu CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config CPP - DEFINITIONS - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -391,7 +377,6 @@ if( HAVE_CLOUDSC_LOKI ) CPP DEFINITIONS CLOUDSC_GPU_TIMING - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -466,7 +451,6 @@ if( HAVE_CLOUDSC_LOKI ) CPP DEFINITIONS CLOUDSC_GPU_TIMING - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -524,7 +508,6 @@ if( HAVE_CLOUDSC_LOKI ) CPP DEFINITIONS CLOUDSC_GPU_TIMING - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -588,7 +571,6 @@ if( HAVE_CLOUDSC_LOKI ) CPP DEFINITIONS CLOUDSC_GPU_TIMING - ${CLOUDSC_DEFINE_STMT_FUNC} FRONTEND ${LOKI_FRONTEND} SOURCES ${CMAKE_CURRENT_SOURCE_DIR} @@ -835,8 +817,6 @@ endif() ${COMMON_MODULE}/yomcst.F90 ${COMMON_MODULE}/yoethf.F90 ${COMMON_MODULE}/yoecldp.F90 - ${COMMON_MODULE}/fcttre_mod.F90 - ${COMMON_MODULE}/fccld_mod.F90 INCLUDES ${COMMON_INCLUDE} XMOD ${_TARGET_XMOD_DIR} ${XMOD_DIR} BUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/loki-c diff --git a/src/cloudsc_loki/cloudsc.F90 b/src/cloudsc_loki/cloudsc.F90 index c5112f26..eb3988d6 100644 --- a/src/cloudsc_loki/cloudsc.F90 +++ b/src/cloudsc_loki/cloudsc.F90 @@ -140,10 +140,6 @@ SUBROUTINE CLOUDSC & & R5ALVCP, R5ALSCP, RALVDCP, RALSDCP, RALFDCP, RTWAT, RTICE, RTICECU, & & RTWAT_RTICE_R, RTWAT_RTICECU_R, RKOOP1, RKOOP2 USE YOECLDP , ONLY : TECLDP, NCLDQV, NCLDQL, NCLDQR, NCLDQI, NCLDQS, NCLV -#ifndef CLOUDSC_STMT_FUNC -USE FCTTRE_MOD, ONLY: FOEDELTA, FOEALFA, FOEEWM, FOEEICE, FOEELIQ, FOELDCP, FOELDCPM, FOEDEM -USE FCCLD_MOD, ONLY : FOKOOP -#endif IMPLICIT NONE @@ -493,10 +489,8 @@ SUBROUTINE CLOUDSC & REAL(KIND=JPRB) :: PSUM_SOLQA(KLON) -#ifdef CLOUDSC_STMT_FUNC #include "fcttre.func.h" #include "fccld.func.h" -#endif !=============================================================================== !IF (LHOOK) CALL DR_HOOK('CLOUDSC',0,ZHOOK_HANDLE) diff --git a/src/cloudsc_loki/cloudsc_loki.config b/src/cloudsc_loki/cloudsc_loki.config index 9901ca88..3a4b7c32 100644 --- a/src/cloudsc_loki/cloudsc_loki.config +++ b/src/cloudsc_loki/cloudsc_loki.config @@ -83,6 +83,9 @@ frontend = 'FP' [frontend_args."yoecldp.F90"] frontend = 'FP' +[frontend_args."cloudsc.F90"] +preprocess = true + # Define specific transformation settings # ------------------------------------------------------------------- @@ -122,6 +125,18 @@ frontend = 'FP' check_bounds = true +[transformations.InlineTransformation] + classname = 'InlineTransformation' + module = 'loki.transformations' +[transformations.InlineTransformation.options] + inline_internals = false + inline_marked = true + inline_stmt_funcs = true + remove_dead_code = true + allowed_aliases = 'JL' + resolve_sequence_association = false + + # Loki-SCC family of transformations # ------------------------------------------------------------------- # A set of transformation passes that transforms SIMD vectorisation From a0983f28524a0e5a429310f86623a91d155ac7fd Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 19 Dec 2024 05:50:16 +0000 Subject: [PATCH 3/4] Loki: Update to latest Loki version --- bundle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle.yml b/bundle.yml index 09bcbdc9..d8dbf529 100644 --- a/bundle.yml +++ b/bundle.yml @@ -36,7 +36,7 @@ projects : - loki : git : https://github.com/ecmwf-ifs/loki - version : v0.2.9 + version : main require : ecbuild cmake : > LOKI_ENABLE_TESTS=OFF From fa1391ba1676dec3e8ea10930a025bd5552f5ff0 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 19 Dec 2024 14:32:32 +0000 Subject: [PATCH 4/4] Common: Remove now obsolete fcttre_mod.F90 and fccld_mod.F90 --- src/common/CMakeLists.txt | 7 - src/common/module/fccld_mod.F90 | 41 ---- src/common/module/fcttre_mod.F90 | 324 ------------------------------- 3 files changed, 372 deletions(-) delete mode 100644 src/common/module/fccld_mod.F90 delete mode 100644 src/common/module/fcttre_mod.F90 diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index a89c1bcf..dc8d320c 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -28,13 +28,6 @@ list(APPEND CLOUDSC_COMMON_SOURCES module/cloudsc_mpi_mod.F90 ) -if(NOT ENABLE_USE_STMT_FUNC) - list(APPEND CLOUDSC_COMMON_SOURCES - module/fcttre_mod.F90 - module/fccld_mod.F90 - ) -endif() - list(APPEND CLOUDSC_CUDA_SOURCES module/fccld_mod.cuf.F90 module/fcttre_mod.cuf.F90 diff --git a/src/common/module/fccld_mod.F90 b/src/common/module/fccld_mod.F90 deleted file mode 100644 index f0b76d64..00000000 --- a/src/common/module/fccld_mod.F90 +++ /dev/null @@ -1,41 +0,0 @@ -! (C) Copyright 1988- ECMWF. -! -! This software is licensed under the terms of the Apache Licence Version 2.0 -! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -! -! In applying this licence, ECMWF does not waive the privileges and immunities -! granted to it by virtue of its status as an intergovernmental organisation -! nor does it submit to any jurisdiction. - -MODULE FCCLD_MOD - !* - ! ------------------------------------------------------------------ - ! This COMDECK defines functions to be used in the cloud scheme - ! other than the standard saturation vapour pressure - ! - ! FKOOP modifies the ice saturation mixing ratio for homogeneous - ! nucleation - ! - ! note: PTARE is temperature and is definited in frttre.h - ! which MUST be included before this function block - ! - ! ********************************************** - ! KOOP formula for homogeneous nucleation of ice - ! ********************************************** - ! - ! INPUT : PTARE = TEMPERATURE - USE PARKIND1, ONLY : JPIM, JPRB - USE YOETHF, ONLY : RKOOP1, RKOOP2 - USE FCTTRE_MOD, ONLY : FOEELIQ, FOEEICE - - IMPLICIT NONE - CONTAINS - - PURE ELEMENTAL FUNCTION FOKOOP(PTARE) - REAL(KIND=JPRB) :: FOKOOP - REAL(KIND=JPRB), VALUE :: PTARE - - FOKOOP = MIN(RKOOP1-RKOOP2*PTARE,FOEELIQ(PTARE)/FOEEICE(PTARE)) - END FUNCTION FOKOOP - -END MODULE FCCLD_MOD diff --git a/src/common/module/fcttre_mod.F90 b/src/common/module/fcttre_mod.F90 deleted file mode 100644 index 81c0c1cb..00000000 --- a/src/common/module/fcttre_mod.F90 +++ /dev/null @@ -1,324 +0,0 @@ -! (C) Copyright 1988- ECMWF. -! -! This software is licensed under the terms of the Apache Licence Version 2.0 -! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -! -! In applying this licence, ECMWF does not waive the privileges and immunities -! granted to it by virtue of its status as an intergovernmental organisation -! nor does it submit to any jurisdiction. - -MODULE FCTTRE_MOD -! This COMDECK includes the Thermodynamical functions for the cy39 -! ECMWF Physics package. -! Consistent with YOMCST Basic physics constants, assuming the -! partial pressure of water vapour is given by a first order -! Taylor expansion of Qs(T) w.r.t. to Temperature, using constants -! in YOETHF -! Two sets of functions are available. In the first set only the -! cases water or ice are distinguished by temperature. This set -! consists of the functions FOEDELTA,FOEEW,FOEDE and FOELH. -! The second set considers, besides the two cases water and ice -! also a mix of both for the temperature range RTICE < T < RTWAT. -! This set contains FOEALFA,FOEEWM,FOEDEM,FOELDCPM and FOELHM. -! FKOOP modifies the ice saturation mixing ratio for homogeneous -! nucleation. FOE_DEWM_DT provides an approximate first derivative -! of FOEEWM. - -! Depending on the consideration of mixed phases either the first -! set (e.g. surface, post-processing) or the second set -! (e.g. clouds, condensation, convection) should be used. - -! ------------------------------------------------------------------ - - USE PARKIND1, ONLY : JPIM, JPRB - - USE YOMCST, ONLY : RG, RD, RCPD, RETV, RLVTT, RLSTT, RLMLT, RTT, RV, RA, RPI - USE YOETHF, ONLY : R2ES, R3LES, R3IES, R4LES, R4IES, R5LES, R5IES, & - & R5ALVCP, R5ALSCP, RALVDCP, RALSDCP, RALFDCP, RTWAT, RTICE, RTICECU, & - & RTWAT_RTICE_R, RTWAT_RTICECU_R, RKOOP1, RKOOP2 - - IMPLICIT NONE - CONTAINS - - ! ***************************************************************** - - ! NO CONSIDERATION OF MIXED PHASES - - ! ***************************************************************** - - PURE ELEMENTAL FUNCTION FOEDELTA(PTARE) - REAL(KIND=JPRB) :: FOEDELTA - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEDELTA = MAX (0.0_JPRB,SIGN(1.0_JPRB,PTARE-RTT)) - END FUNCTION FOEDELTA - - PURE ELEMENTAL FUNCTION FOEEW(PTARE) - REAL(KIND=JPRB) :: FOEEW - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEEW = R2ES*EXP (& - &(R3LES*FOEDELTA(PTARE)+R3IES*(1.0_JPRB-FOEDELTA(PTARE)))*(PTARE-RTT)& - &/ (PTARE-(R4LES*FOEDELTA(PTARE)+R4IES*(1.0_JPRB-FOEDELTA(PTARE))))) - END FUNCTION FOEEW - - PURE ELEMENTAL FUNCTION FOEDE(PTARE) - REAL(KIND=JPRB) :: FOEDE - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEDE = (FOEDELTA(PTARE)*R5ALVCP+(1.0_JPRB-FOEDELTA(PTARE))*R5ALSCP)& - &/ (PTARE-(R4LES*FOEDELTA(PTARE)+R4IES*(1.0_JPRB-FOEDELTA(PTARE))))**2 - END FUNCTION FOEDE - - PURE ELEMENTAL FUNCTION FOEDESU(PTARE) - REAL(KIND=JPRB) :: FOEDESU - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEDESU = (FOEDELTA(PTARE)*R5LES+(1.0_JPRB-FOEDELTA(PTARE))*R5IES)& - &/ (PTARE-(R4LES*FOEDELTA(PTARE)+R4IES*(1.0_JPRB-FOEDELTA(PTARE))))**2 - END FUNCTION FOEDESU - - PURE ELEMENTAL FUNCTION FOELH(PTARE) - REAL(KIND=JPRB) :: FOELH - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELH = FOEDELTA(PTARE)*RLVTT + (1.0_JPRB-FOEDELTA(PTARE))*RLSTT - END FUNCTION FOELH - - PURE ELEMENTAL FUNCTION FOELDCP(PTARE) - REAL(KIND=JPRB) :: FOELDCP - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELDCP = FOEDELTA(PTARE)*RALVDCP + (1.0_JPRB-FOEDELTA(PTARE))*RALSDCP - END FUNCTION FOELDCP - - ! ***************************************************************** - - ! CONSIDERATION OF MIXED PHASES - - ! ***************************************************************** - - ! FOEALFA is calculated to distinguish the three cases: - - ! FOEALFA=1 water phase - ! FOEALFA=0 ice phase - ! 0 < FOEALFA < 1 mixed phase - - ! INPUT : PTARE = TEMPERATURE - PURE ELEMENTAL FUNCTION FOEALFA(PTARE) - REAL(KIND=JPRB) :: FOEALFA - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEALFA = MIN(1.0_JPRB,((MAX(RTICE,MIN(RTWAT,PTARE))-RTICE)& - &*RTWAT_RTICE_R)**2) - END FUNCTION FOEALFA - - ! Pressure of water vapour at saturation - ! INPUT : PTARE = TEMPERATURE - PURE ELEMENTAL FUNCTION FOEEWM(PTARE) - REAL(KIND=JPRB) :: FOEEWM - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEEWM = R2ES *& - &(FOEALFA(PTARE)*EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES))+& - &(1.0_JPRB-FOEALFA(PTARE))*EXP(R3IES*(PTARE-RTT)/(PTARE-R4IES))) - END FUNCTION FOEEWM - - PURE ELEMENTAL FUNCTION FOE_DEWM_DT(PTARE) - REAL(KIND=JPRB) :: FOE_DEWM_DT - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOE_DEWM_DT = R2ES * ( & - & R3LES*FOEALFA(PTARE)*EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES)) & - & *(RTT-R4LES)/(PTARE-R4LES)**2 + & - & R3IES*(1.0-FOEALFA(PTARE))*EXP(R3IES*(PTARE-RTT)/(PTARE-R4IES)) & - & *(RTT-R4IES)/(PTARE-R4IES)**2) - END FUNCTION FOE_DEWM_DT - - PURE ELEMENTAL FUNCTION FOEDEM(PTARE) - REAL(KIND=JPRB) :: FOEDEM - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEDEM = FOEALFA(PTARE)*R5ALVCP*(1.0_JPRB/(PTARE-R4LES)**2)+& - &(1.0_JPRB-FOEALFA(PTARE))*R5ALSCP*(1.0_JPRB/(PTARE-R4IES)**2) - END FUNCTION FOEDEM - - PURE ELEMENTAL FUNCTION FOELDCPM(PTARE) - REAL(KIND=JPRB) :: FOELDCPM - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELDCPM = FOEALFA(PTARE)*RALVDCP+(1.0_JPRB-FOEALFA(PTARE))*RALSDCP - END FUNCTION FOELDCPM - - PURE ELEMENTAL FUNCTION FOELHM(PTARE) - REAL(KIND=JPRB) :: FOELHM - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELHM = FOEALFA(PTARE)*RLVTT+(1.0_JPRB-FOEALFA(PTARE))*RLSTT - END FUNCTION FOELHM - - ! Temperature normalization for humidity background change of variable - ! INPUT : PTARE = TEMPERATURE - PURE ELEMENTAL FUNCTION FOETB(PTARE) - REAL(KIND=JPRB) :: FOETB - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOETB = FOEALFA(PTARE)*R3LES*(RTT-R4LES)*(1.0_JPRB/(PTARE-R4LES)**2)+& - &(1.0_JPRB-FOEALFA(PTARE))*R3IES*(RTT-R4IES)*(1.0_JPRB/(PTARE-R4IES)**2) - END FUNCTION FOETB - - ! ------------------------------------------------------------------ - ! ***************************************************************** - - ! CONSIDERATION OF DIFFERENT MIXED PHASE FOR CONV - - ! ***************************************************************** - - ! FOEALFCU is calculated to distinguish the three cases: - - ! FOEALFCU=1 water phase - ! FOEALFCU=0 ice phase - ! 0 < FOEALFCU < 1 mixed phase - - ! INPUT : PTARE = TEMPERATURE - PURE ELEMENTAL FUNCTION FOEALFCU(PTARE) - REAL(KIND=JPRB) :: FOEALFCU - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEALFCU = MIN(1.0_JPRB,((MAX(RTICECU,MIN(RTWAT,PTARE))& - &-RTICECU)*RTWAT_RTICECU_R)**2) - END FUNCTION FOEALFCU - - ! Pressure of water vapour at saturation - ! INPUT : PTARE = TEMPERATURE - PURE ELEMENTAL FUNCTION FOEEWMCU(PTARE) - REAL(KIND=JPRB) :: FOEEWMCU - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEEWMCU = R2ES *& - &(FOEALFCU(PTARE)*EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES))+& - &(1.0_JPRB-FOEALFCU(PTARE))*EXP(R3IES*(PTARE-RTT)/(PTARE-R4IES))) - END FUNCTION FOEEWMCU - - PURE ELEMENTAL FUNCTION FOEDEMCU(PTARE) - REAL(KIND=JPRB) :: FOEDEMCU - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEDEMCU = FOEALFCU(PTARE)*R5ALVCP*(1.0_JPRB/(PTARE-R4LES)**2)+& - &(1.0_JPRB-FOEALFCU(PTARE))*R5ALSCP*(1.0_JPRB/(PTARE-R4IES)**2) - END FUNCTION FOEDEMCU - - PURE ELEMENTAL FUNCTION FOELDCPMCU(PTARE) - REAL(KIND=JPRB) :: FOELDCPMCU - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELDCPMCU = FOEALFCU(PTARE)*RALVDCP+(1.0_JPRB-FOEALFCU(PTARE))*RALSDCP - END FUNCTION FOELDCPMCU - - PURE ELEMENTAL FUNCTION FOELHMCU(PTARE) - REAL(KIND=JPRB) :: FOELHMCU - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELHMCU = FOEALFCU(PTARE)*RLVTT+(1.0_JPRB-FOEALFCU(PTARE))*RLSTT - END FUNCTION FOELHMCU - - ! ------------------------------------------------------------------ - - ! Pressure of water vapour at saturation - ! This one is for the WMO definition of saturation, i.e. always - ! with respect to water. - ! - ! Duplicate to FOEELIQ and FOEEICE for separate ice variable - ! FOEELIQ always respect to water - ! FOEEICE always respect to ice - ! (could use FOEEW and FOEEWMO, but naming convention unclear) - ! FOELSON returns e wrt liquid water using D Sonntag (1994, Met. Zeit.) - ! - now recommended for use with radiosonde data (WMO CIMO guide, 2014) - ! unlike the FOEE functions does not include 1/(RETV+1.0_JPRB) factor - - PURE ELEMENTAL FUNCTION FOEEWMO(PTARE) - REAL(KIND=JPRB) :: FOEEWMO - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEEWMO = R2ES*EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES)) - END FUNCTION FOEEWMO - - PURE ELEMENTAL FUNCTION FOEELIQ(PTARE) - REAL(KIND=JPRB) :: FOEELIQ - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEELIQ = R2ES*EXP(R3LES*(PTARE-RTT)/(PTARE-R4LES)) - END FUNCTION FOEELIQ - - PURE ELEMENTAL FUNCTION FOEEICE(PTARE) - REAL(KIND=JPRB) :: FOEEICE - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEEICE = R2ES*EXP(R3IES*(PTARE-RTT)/(PTARE-R4IES)) - END FUNCTION FOEEICE - - PURE ELEMENTAL FUNCTION FOELSON(PTARE) - REAL(KIND=JPRB) :: FOELSON - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELSON = EXP( -6096.9385_JPRB/PTARE + 21.2409642_JPRB & - - 2.711193E-2_JPRB * PTARE & - + 1.673952E-5_JPRB * PTARE**2 & - + 2.433502_JPRB * LOG(PTARE)) - END FUNCTION FOELSON - - PURE ELEMENTAL FUNCTION FOELES_V(PTARE) - REAL(KIND=JPRB) :: FOELES_V - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOELES_V=R3LES*(PTARE-RTT)/(PTARE-R4LES) - END FUNCTION FOELES_V - - PURE ELEMENTAL FUNCTION FOEIES_V(PTARE) - REAL(KIND=JPRB) :: FOEIES_V - REAL(KIND=JPRB), VALUE :: PTARE - !$acc routine seq - - FOEIES_V=R3IES*(PTARE-RTT)/(PTARE-R4IES) - END FUNCTION FOEIES_V - - PURE ELEMENTAL FUNCTION FOEEWM_V(PTARE,EXP1,EXP2) - REAL(KIND=JPRB) :: FOEEWM_V - REAL(KIND=JPRB), VALUE :: PTARE, EXP1, EXP2 - !$acc routine seq - - FOEEWM_V=R2ES*(FOEALFA(PTARE)*EXP1+(1.0_JPRB-FOEALFA(PTARE))*EXP2) - END FUNCTION FOEEWM_V - - PURE ELEMENTAL FUNCTION FOEEWMCU_V(PTARE,EXP1,EXP2) - REAL(KIND=JPRB) :: FOEEWMCU_V - REAL(KIND=JPRB), VALUE :: PTARE, EXP1, EXP2 - !$acc routine seq - - FOEEWMCU_V = R2ES*(FOEALFCU(PTARE)*EXP1+(1.0_JPRB-FOEALFCU(PTARE))*EXP2) - END FUNCTION FOEEWMCU_V - -END MODULE