diff --git a/.github/scripts/verify-targets.sh b/.github/scripts/verify-targets.sh index 24591797..2bce7fa9 100755 --- a/.github/scripts/verify-targets.sh +++ b/.github/scripts/verify-targets.sh @@ -18,10 +18,6 @@ if [[ "$build_flags" == *"--with-gpu"* ]] then targets+=(dwarf-cloudsc-gpu-scc dwarf-cloudsc-gpu-scc-hoist dwarf-cloudsc-gpu-scc-k-caching) targets+=(dwarf-cloudsc-gpu-omp-scc-hoist) - if [[ "$build_flags" == *"--with-claw"* ]] - then - targets+=(dwarf-cloudsc-gpu-claw) - fi if [[ "$build_flags" == *"--with-field"* ]] then targets+=(dwarf-cloudsc-gpu-scc-field) @@ -35,17 +31,12 @@ fi if [[ "$build_flags" == *"--with-loki"* ]] then - targets+=(dwarf-cloudsc-loki-idem dwarf-cloudsc-loki-sca) targets+=(dwarf-cloudsc-loki-scc dwarf-cloudsc-loki-scc-hoist) targets+=(dwarf-cloudsc-loki-idem-stack dwarf-cloudsc-loki-scc-stack) if [[ "$build_flags" != *"--single-precision"* ]] then targets+=(dwarf-cloudsc-loki-c) fi - if [[ "$build_flags" == *"--with-claw"* ]] - then - targets+=(dwarf-cloudsc-loki-claw-cpu dwarf-cloudsc-loki-claw-gpu) - fi if [[ "$build_flags" == *"--with-cuda"* ]] then targets+=(dwarf-cloudsc-loki-scc-cuf-hoist dwarf-cloudsc-loki-scc-cuf-parametrise) diff --git a/README.md b/README.md index ae5c80c8..6f7a5afc 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,6 @@ Balthasar Reuter (balthasar.reuter@ecmwf.int) - **dwarf-cloudsc-gpu-kernels**: GPU-enabled version of the CLOUDSC dwarf that uses OpenACC and relies on the `!$acc kernels` directive to offload the computational kernel. -- **dwarf-cloudsc-gpu-claw** (deprecated!): GPU-enabled and optimized version of - CLOUDSC that is based on an auto-generated version of CLOUDSC based on the CLAW - tool. The kernel in this demonstrator has been further optimized with gang-level - loop blocking to demonstrate potential performance gains. This variant is defunct - on current Nvidia GPUs and therefore deactivated by default, requiring explicit - `--with-claw` flag to build. - **dwarf-cloudsc-gpu-scc**: GPU-enabled and optimized version of CLOUDSC that utilises the native blocked IFS memory layout via a "single-column coalesced" (SCC) loop layout. Here the outer NPROMA @@ -191,7 +185,7 @@ device. This can be achieved using the `CUDA_VISIBLE_DEVICES` environment variable: ```sh -mpirun -np 2 bash -c "CUDA_VISIBLE_DEVICES=\${OMPI_COMM_WORLD_RANK} bin/dwarf-cloudsc-gpu-claw 1 163840 8192" +mpirun -np 2 bash -c "CUDA_VISIBLE_DEVICES=\${OMPI_COMM_WORLD_RANK} bin/dwarf-cloudsc-gpu-scc-stack 1 163840 128" ``` ### Choosing between HDF5 and Serialbox input file format @@ -349,8 +343,7 @@ source-to-source translation tool that allows us to create bespoke transformations for the IFS to target and experiment with emerging HPC architectures and programming models. We use the CLOUDSC dwarf as a demonstrator for targeted transformation capabilities of physics and grid point computations -kernels, including conversion to C and GPU, directly or via downstream tools -like CLAW. +kernels, including conversion to C and GPU. The following build flags enable the demonstrator build targets on the ECMWF Atos HPC facility's GPU partition: @@ -368,21 +361,10 @@ The following Loki modes are included in the dwarf, each with a bespoke demonstr - **cloudsc-loki-sca**: Pure single-column mode that strips all horizontal vector loops from the kernel and introduces an outer "column-loop" at the driver level. -- **cloudsc-loki-claw-cpu** (deprecated): Same as SCA, but also adds the - necessary CLAW annotations. The resulting cloudsc.claw.F90 file is then - processed by CLAW to re-insert vector loops for optimal CPU execution. -- **cloudsc-loki-claw-gpu** (deprecated): Creates the same CLAW-ready kernel - file, but triggers the GPU-specific optimizations in the CLAW compiler to insert - OpenACC-offload instructions in the driver and an OpenACC parallel loop inside - the kernel for each block. This needs to be run with large block sizes (eg. - NPROMA=1024-8192). - **cloudsc-loki-c**: A prototype C transpilation pipeline that converts the kernel to C and calls it via iso_c_bindings interfaces from the driver. -To enable the deprecated and, on GPU, defunct CLAW variants, the build-flag -`--with-claw` needs to be specified explicitly. - ## Python-driven CLOUDSC variants The following partly or fully Python-based CLOUDSC are available: - **cloudsc-python**: GT4PY based Python-only implementation. Refer to `src/cloudsc_python` @@ -402,10 +384,6 @@ Loki currently supports three frontends to parse the Fortran source code: - [FParser](https://github.com/stfc/fparser) (`loki-frontend=fp`): The preferred default; developed by STFC for PsyClone. - [OMNI](https://github.com/omni-compiler/omni-compiler) frontend (`loki-frontend=omni`): - Generates the same AST as used by CLAW. -- [OFP](https://github.com/OpenFortranProject/open-fortran-parser), - a Python wrapper around the ROSE frontend (`loki-frontend=ofp`): - Supported, but bugged in some places and slow; use with care. For completeness, all three frontends are tested in our CI, which means we require the `.xmod` module description files for utility diff --git a/bundle.yml b/bundle.yml index ee65ee91..6e62035b 100644 --- a/bundle.yml +++ b/bundle.yml @@ -156,18 +156,10 @@ options : ENABLE_CLOUDSC_LOKI=ON LOKI_ENABLE_NO_INSTALL=OFF - - with-claw : - help : Enable deprecated (and defunct) CLAW-generated variants - cmake : > - ENABLE_CLOUDSC_GPU_CLAW=ON - ENABLE_CLOUDSC_LOKI_CLAW=ON - LOKI_ENABLE_CLAW=ON - - without-loki-install : help : Skip installation of Loki (Requires Loki to be on the PATH) cmake : > LOKI_ENABLE_NO_INSTALL=ON - LOKI_ENABLE_CLAW=OFF - loki-frontend : help : Frontend parser to use for Loki transformations @@ -213,18 +205,10 @@ options : help : Build the C version of CLOUDSC [ON|OFF] cmake : ENABLE_CLOUDSC_C={{value}} - - cloudsc-gpu-claw : - help : Build the deprecated CLAW-based GPU version CLOUDSC [ON|OFF] - cmake : ENABLE_CLOUDSC_GPU_CLAW={{value}} - - cloudsc-loki : help : Build the optimized Loki-based GPU version CLOUDSC [ON|OFF] cmake : ENABLE_CLOUDSC_LOKI={{value}} - - cloudsc-loki-claw : - help : Build the deprecated Loki+CLAW-based GPU version CLOUDSC [ON|OFF] - cmake : ENABLE_CLOUDSC_LOKI_CLAW={{value}} - - cloudsc-python-f2py : help : Enable dedicated pure Python variant of CLOUDSC [ON|OFF] cmake : ENABLE_CLOUDSC_PYTHON_F2PY={{value}} diff --git a/src/cloudsc_gpu/CMakeLists.txt b/src/cloudsc_gpu/CMakeLists.txt index 36e6b71b..596c9fbf 100644 --- a/src/cloudsc_gpu/CMakeLists.txt +++ b/src/cloudsc_gpu/CMakeLists.txt @@ -12,11 +12,6 @@ ecbuild_add_option( FEATURE CLOUDSC_GPU_KERNELS CONDITION Serialbox_FOUND OR HDF5_FOUND ) -# Define the CLAW-based GPU dwarf variant as an ECBuild feature -ecbuild_add_option( FEATURE CLOUDSC_GPU_CLAW - DESCRIPTION "Build optimized GPU version of CLOUDSC derived from CLAW using OpenACC" DEFAULT OFF - CONDITION Serialbox_FOUND OR HDF5_FOUND -) ecbuild_add_option( FEATURE CLOUDSC_GPU_SCC DESCRIPTION "Build optimized GPU version of CLOUDSC using SCC layout and OpenACC" DEFAULT OFF @@ -74,29 +69,6 @@ ecbuild_add_option( FEATURE CLOUDSC_GPU_SCC_FIELD ) -if( HAVE_CLOUDSC_GPU_CLAW ) - ecbuild_add_executable( - TARGET dwarf-cloudsc-gpu-claw - SOURCES - dwarf_cloudsc_gpu.F90 - cloudsc_driver_gpu_claw_mod.F90 - cloudsc.claw.gpu.F90 - LIBS - cloudsc-common-lib - DEFINITIONS ${CLOUDSC_DEFINITIONS} CLOUDSC_GPU_CLAW - ) - - ecbuild_add_test( - TARGET dwarf-cloudsc-gpu-claw-serial - COMMAND bin/dwarf-cloudsc-gpu-claw - ARGS 1 1280 128 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - OMP 1 - ENABLED OFF # CLAW variant is currently broken - ) -endif() - - if( HAVE_CLOUDSC_GPU_SCC ) ecbuild_add_executable( TARGET dwarf-cloudsc-gpu-scc diff --git a/src/cloudsc_gpu/cloudsc.claw.gpu.F90 b/src/cloudsc_gpu/cloudsc.claw.gpu.F90 deleted file mode 100644 index 3ed11dac..00000000 --- a/src/cloudsc_gpu/cloudsc.claw.gpu.F90 +++ /dev/null @@ -1,1557 +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 cloudsc_claw_mod - -CONTAINS - SUBROUTINE cloudsc_claw ( klev , ptsphy , pt , pq , tendency_cml_t , tendency_cml_q , tendency_cml_cld , tendency_tmp_t ,& - tendency_tmp_q , tendency_tmp_a , tendency_tmp_cld , tendency_loc_t , tendency_loc_q , tendency_loc_a , tendency_loc_cld , pvfa& - , pvfl , pvfi , pdyna , pdynl , pdyni , phrsw , phrlw , pvervel , pap , paph , plsm , ldcum , ktype , plu , plude , psnde , pmfu& - , pmfd , pa , pclv , psupsat , plcrit_aer , picrit_aer , pre_ice , pccn , pnice , pcovptot , prainfrac_toprfz , pfsqlf , pfsqif& - , pfcqnng , pfcqlng , pfsqrf , pfsqsf , pfcqrng , pfcqsng , pfsqltur , pfsqitur , pfplsl , pfplsn , pfhpsl , pfhpsn ,& - kfldx , yrecldp , nproma ) - USE parkind1 , ONLY: jpim , jprb - 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 , rtwat_rtice_r , rtwat_rticecu_r , rkoop1 , rkoop2 - USE yoecldp , ONLY: tecldp , ncldqv , ncldql , ncldqr , ncldqi , ncldqs , nclv - USE yomphyder , ONLY: state_type - IMPLICIT NONE - INTEGER , INTENT(IN) :: nproma - INTERFACE - SUBROUTINE abor1 ( cdtext ) - - CHARACTER ( LEN= * ) :: cdtext - END SUBROUTINE abor1 - END INTERFACE - - REAL ( KIND=JPRB ) , INTENT(IN) :: plcrit_aer ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: picrit_aer ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pre_ice ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pccn ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pnice ( 1 : nproma , 1 : klev ) - INTEGER ( KIND= 4 ) , INTENT(IN) :: klev - REAL ( KIND=JPRB ) , INTENT(IN) :: ptsphy - REAL ( KIND=JPRB ) , INTENT(IN) :: pt ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pq ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_cml_t ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_cml_q ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_cml_cld ( 1 : nproma , 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_tmp_t ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_tmp_q ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_tmp_a ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: tendency_tmp_cld ( 1 : nproma , 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: tendency_loc_t ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: tendency_loc_q ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: tendency_loc_a ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: tendency_loc_cld ( 1 : nproma , 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pvfa ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pvfl ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pvfi ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pdyna ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pdynl ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pdyni ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: phrsw ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: phrlw ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pvervel ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pap ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: paph ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(IN) :: plsm ( 1 : nproma ) - LOGICAL , INTENT(IN) :: ldcum ( 1 : nproma ) - INTEGER ( KIND= 4 ) , INTENT(IN) :: ktype ( 1 : nproma ) - REAL ( KIND=JPRB ) , INTENT(IN) :: plu ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(INOUT) :: plude ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: psnde ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pmfu ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pmfd ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(IN) :: pa ( 1 : nproma , 1 : klev ) - INTEGER ( KIND= 4 ) , INTENT(IN) :: kfldx - REAL ( KIND=JPRB ) , INTENT(IN) :: pclv ( 1 : nproma , 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) , INTENT(IN) :: psupsat ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pcovptot ( 1 : nproma , 1 : klev ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: prainfrac_toprfz ( 1 : nproma ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfsqlf ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfsqif ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfcqlng ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfcqnng ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfsqrf ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfsqsf ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfcqrng ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfcqsng ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfsqltur ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfsqitur ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfplsl ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfplsn ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfhpsl ( 1 : nproma , 1 : klev + 1 ) - REAL ( KIND=JPRB ) , INTENT(OUT) :: pfhpsn ( 1 : nproma , 1 : klev + 1 ) - TYPE ( tecldp ) , INTENT(INOUT) :: yrecldp - REAL ( KIND=JPRB ) :: zlcond1 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zlcond2 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zlevap - REAL ( KIND=JPRB ) :: zleros - REAL ( KIND=JPRB ) :: zlevapl ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zlevapi ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zrainaut ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zsnowaut ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zliqcld ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zicecld ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zfokoop ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zfoealfa ( 1 : klev + 1 ) - REAL ( KIND=JPRB ) :: zicenuclei ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zlicld ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zacond - REAL ( KIND=JPRB ) :: zaeros - REAL ( KIND=JPRB ) :: zlfinalsum ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zdqs ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztold ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zqold ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zdtgdp ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zrdtgdp ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztrpaus ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zcovpclr ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zpreclr - REAL ( KIND=JPRB ) :: zcovptot ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zcovpmax ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zqpretot ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zdpevap - REAL ( KIND=JPRB ) :: zdtforc - REAL ( KIND=JPRB ) :: zdtdiab - REAL ( KIND=JPRB ) :: ztp1 ( 1 : klev ) - REAL ( KIND=JPRB ) :: zldefr ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zldifdt ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zdtgdpf ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zlcust ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zacust ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zmf ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zrho ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp1 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp2 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp3 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp4 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp5 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp6 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: ztmp7 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zalfawm ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zsolab ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zsolac ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zanew - REAL ( KIND=JPRB ) :: zanewm1 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zgdp ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zda ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zli ( 1 : klev ) - REAL ( KIND=JPRB ) :: za ( 1 : klev ) - REAL ( KIND=JPRB ) :: zaorig ( 1 : klev ) - LOGICAL :: llflag - LOGICAL :: llo1 - INTEGER ( KIND= 4 ) :: icall - INTEGER ( KIND= 4 ) :: ik - INTEGER ( KIND= 4 ) :: jk - INTEGER ( KIND= 4 ) :: jm - INTEGER ( KIND= 4 ) :: jn - INTEGER ( KIND= 4 ) :: jo - INTEGER ( KIND= 4 ) :: jlen - INTEGER ( KIND= 4 ) :: is - REAL ( KIND=JPRB ) :: zdp ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zpaphd ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zalfa - REAL ( KIND=JPRB ) :: zalfaw - REAL ( KIND=JPRB ) :: zbeta - REAL ( KIND=JPRB ) :: zbeta1 - REAL ( KIND=JPRB ) :: zcfpr - REAL ( KIND=JPRB ) :: zcor - REAL ( KIND=JPRB ) :: zcdmax - REAL ( KIND=JPRB ) :: zmin ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zlcondlim - REAL ( KIND=JPRB ) :: zdenom - REAL ( KIND=JPRB ) :: zdpmxdt - REAL ( KIND=JPRB ) :: zdpr - REAL ( KIND=JPRB ) :: zdtdp - REAL ( KIND=JPRB ) :: ze - REAL ( KIND=JPRB ) :: zepsec - REAL ( KIND=JPRB ) :: zfac - REAL ( KIND=JPRB ) :: zfaci - REAL ( KIND=JPRB ) :: zfacw - REAL ( KIND=JPRB ) :: zgdcp - REAL ( KIND=JPRB ) :: zinew - REAL ( KIND=JPRB ) :: zlcrit - REAL ( KIND=JPRB ) :: zmfdn - REAL ( KIND=JPRB ) :: zprecip - REAL ( KIND=JPRB ) :: zqe - REAL ( KIND=JPRB ) :: zqsat - REAL ( KIND=JPRB ) :: zqtmst - REAL ( KIND=JPRB ) :: zrdcp - REAL ( KIND=JPRB ) :: zrhc - REAL ( KIND=JPRB ) :: zsig - REAL ( KIND=JPRB ) :: zsigk - REAL ( KIND=JPRB ) :: zwtot - REAL ( KIND=JPRB ) :: zzco - REAL ( KIND=JPRB ) :: zzdl - REAL ( KIND=JPRB ) :: zzrh - REAL ( KIND=JPRB ) :: zzzdt - REAL ( KIND=JPRB ) :: zqadj - REAL ( KIND=JPRB ) :: zqnew - REAL ( KIND=JPRB ) :: ztnew - REAL ( KIND=JPRB ) :: zrg_r - REAL ( KIND=JPRB ) :: zgdph_r - REAL ( KIND=JPRB ) :: zcons1 - REAL ( KIND=JPRB ) :: zcond - REAL ( KIND=JPRB ) :: zcons1a - REAL ( KIND=JPRB ) :: zlfinal - REAL ( KIND=JPRB ) :: zmelt - REAL ( KIND=JPRB ) :: zevap - REAL ( KIND=JPRB ) :: zfrz - REAL ( KIND=JPRB ) :: zvpliq - REAL ( KIND=JPRB ) :: zvpice - REAL ( KIND=JPRB ) :: zadd - REAL ( KIND=JPRB ) :: zbdd - REAL ( KIND=JPRB ) :: zcvds - REAL ( KIND=JPRB ) :: zice0 - REAL ( KIND=JPRB ) :: zdepos - REAL ( KIND=JPRB ) :: zsupsat ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zfall - REAL ( KIND=JPRB ) :: zre_ice - REAL ( KIND=JPRB ) :: zrldcp - REAL ( KIND=JPRB ) :: zqp1env - INTEGER ( KIND= 4 ) :: iphase ( 1 : 5 ) - INTEGER ( KIND= 4 ) :: imelt ( 1 : 5 ) - LOGICAL :: llfall ( 1 : 5 ) - LOGICAL :: llindex1 ( 1 : 5 ) - LOGICAL :: llindex3 ( 1 : 5 , 1 : 5 ) - REAL ( KIND=JPRB ) :: zmax - REAL ( KIND=JPRB ) :: zrat - INTEGER ( KIND= 4 ) :: iorder ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zliqfrac ( 1 : klev ) - REAL ( KIND=JPRB ) :: zicefrac ( 1 : klev ) - REAL ( KIND=JPRB ) :: zqx ( 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) :: zqx0 ( 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) :: zqxn ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zqxfg ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zqxnm1 ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zfluxq ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zpfplsx ( 1 : klev + 1 , 1 : 5 ) - REAL ( KIND=JPRB ) :: zlneg ( 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) :: zmeltmax ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zfrzmax ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zicetot ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zqxn2d ( 1 : klev , 1 : 5 ) - REAL ( KIND=JPRB ) :: zqsmix ( 1 : klev ) - REAL ( KIND=JPRB ) :: zqsliq ( 1 : klev ) - REAL ( KIND=JPRB ) :: zqsice ( 1 : klev ) - REAL ( KIND=JPRB ) :: zfoeewmt ( 1 : klev ) - REAL ( KIND=JPRB ) :: zfoeew ( 1 : klev ) - REAL ( KIND=JPRB ) :: zfoeeliqt ( 1 : klev ) - REAL ( KIND=JPRB ) :: zdqsliqdt ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zdqsicedt ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zdqsmixdt ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zcorqsliq ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zcorqsice ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zcorqsmix ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zevaplimliq ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zevaplimice ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zevaplimmix ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zsolqa ( 1 : 5 , 1 : 5 ) - REAL ( KIND=JPRB ) :: zsolqb ( 1 : 5 , 1 : 5 ) - REAL ( KIND=JPRB ) :: zqlhs ( 1 : 5 , 1 : 5 ) - REAL ( KIND=JPRB ) :: zvqx ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zexplicit - REAL ( KIND=JPRB ) :: zratio ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zsinksum ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zfallsink ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zfallsrce ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zconvsrce ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zconvsink ( 1 : 5 ) - REAL ( KIND=JPRB ) :: zpsupsatsrce ( 1 : 5 ) - REAL ( KIND=JPRB ) , PARAMETER :: ztw1 = 1329.31000000000_jprb - REAL ( KIND=JPRB ) , PARAMETER :: ztw2 = 0.00746150000000000_jprb - REAL ( KIND=JPRB ) , PARAMETER :: ztw3 = 85000.0000000000_jprb - REAL ( KIND=JPRB ) , PARAMETER :: ztw4 = 40.6370000000000_jprb - REAL ( KIND=JPRB ) , PARAMETER :: ztw5 = 275.000000000000_jprb - REAL ( KIND=JPRB ) :: zsubsat - REAL ( KIND=JPRB ) :: ztdmtw0 - REAL ( KIND=JPRB ) :: ztcg - REAL ( KIND=JPRB ) :: zfacx1i - REAL ( KIND=JPRB ) :: zfacx1s - REAL ( KIND=JPRB ) :: zaplusb - REAL ( KIND=JPRB ) :: zcorrfac - REAL ( KIND=JPRB ) :: zcorrfac2 - REAL ( KIND=JPRB ) :: zpr02 - REAL ( KIND=JPRB ) :: zterm1 - REAL ( KIND=JPRB ) :: zterm2 - REAL ( KIND=JPRB ) :: zcldtopdist ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zinfactor - INTEGER ( KIND= 4 ) :: iwarmrain - INTEGER ( KIND= 4 ) :: ievaprain - INTEGER ( KIND= 4 ) :: ievapsnow - INTEGER ( KIND= 4 ) :: idepice - REAL ( KIND=JPRB ) :: zrainacc ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zraincld ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zsnowrime ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zsnowcld ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zesatliq - REAL ( KIND=JPRB ) :: zfallcorr - REAL ( KIND=JPRB ) :: zlambda - REAL ( KIND=JPRB ) :: zevap_denom - REAL ( KIND=JPRB ) :: zcorr2 - REAL ( KIND=JPRB ) :: zka - REAL ( KIND=JPRB ) :: zconst - REAL ( KIND=JPRB ) :: ztemp - REAL ( KIND=JPRB ) :: zsumq0 ( 1 : klev ) - REAL ( KIND=JPRB ) :: zsumq1 ( 1 : klev ) - REAL ( KIND=JPRB ) :: zerrorq ( 1 : klev ) - REAL ( KIND=JPRB ) :: zsumh0 ( 1 : klev ) - REAL ( KIND=JPRB ) :: zsumh1 ( 1 : klev ) - REAL ( KIND=JPRB ) :: zerrorh ( 1 : klev ) - REAL ( KIND=JPRB ) :: zrain - REAL ( KIND=JPRB ) :: z_tmp1 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: z_tmp2 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: z_tmp3 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: z_tmp4 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: z_tmp6 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: z_tmp7 ( 1 : nproma ) - REAL ( KIND=JPRB ) :: z_tmpk ( 1 : klev ) - REAL ( KIND=JPRB ) :: zhook_handle - REAL ( KIND=JPRB ) :: ztmpl - REAL ( KIND=JPRB ) :: ztmpi - REAL ( KIND=JPRB ) :: ztmpa - REAL ( KIND=JPRB ) :: zmm - REAL ( KIND=JPRB ) :: zrr - REAL ( KIND=JPRB ) :: zrg ( 1 : nproma ) - REAL ( KIND=JPRB ) :: zbudcc ( 1 : kfldx ) - REAL ( KIND=JPRB ) :: zbudl ( 1 : kfldx ) - REAL ( KIND=JPRB ) :: zbudi ( 1 : kfldx ) - REAL ( KIND=JPRB ) :: zzsum - REAL ( KIND=JPRB ) :: zzratio - REAL ( KIND=JPRB ) :: zepsilon - REAL ( KIND=JPRB ) :: zcond1 - REAL ( KIND=JPRB ) :: zqp - REAL ( KIND=JPRB ) :: psum_solqa ( 1 : nproma ) - INTEGER :: jl, j, i - LOGICAL :: llcldbudcc, llcldbudl, llcldbudi - -!$acc data & -!$acc present(plcrit_aer,picrit_aer,pre_ice,pccn,pnice,pt,pq,tendency_cml_t,tendency_cml_q,tendency_cml_cld,tendency_tmp_t & -!$acc ,tendency_tmp_q,tendency_tmp_a,tendency_tmp_cld,tendency_loc_t,tendency_loc_q,tendency_loc_a,tendency_loc_cld,pvfa,pvfl & -!$acc ,pvfi,pdyna,pdynl,pdyni,phrsw,phrlw,pvervel,pap,paph,plsm,ldcum,ktype,plu,plude,psnde,pmfu,pmfd,pa,pclv,psupsat & -!$acc ,pcovptot,prainfrac_toprfz,pfsqlf,pfsqif,pfcqlng,pfcqnng,pfsqrf,pfsqsf,pfcqrng,pfcqsng,pfsqltur,pfsqitur,pfplsl,pfplsn & -!$acc ,pfhpsl,pfhpsn) - -!$acc parallel -!$acc loop gang - - DO i = 1 , nproma / 64 - -!$acc loop worker vector & -!$acc private(zfoealfa,ztp1,zlcust,zli,za,zaorig,iphase,imelt,llfall,llindex1,llindex3,iorder,zliqfrac,zicefrac,zqx,zqx0,zqxn & -!$acc ,zqxfg,zqxnm1,zfluxq,zpfplsx,zlneg,zqxn2d,zqsmix,zqsliq,zqsice,zfoeewmt,zfoeew,zfoeeliqt,zsolqa,zsolqb,zqlhs,zvqx,zratio & -!$acc ,zsinksum,zfallsink,zfallsrce,zconvsrce,zconvsink,zpsupsatsrce,zsumq0,zsumq1,zerrorq,zsumh0,zsumh1,zerrorh,z_tmpk,zbudcc & -!$acc ,zbudl,zbudi) - - DO jl = (i-1)*64 +1 , i*64 - - ASSOCIATE ( laericeauto => yrecldp % laericeauto , laericesed => yrecldp % laericesed , laerliqautolsp => yrecldp %& - laerliqautolsp , laerliqcoll => yrecldp % laerliqcoll , lcldbudget => yrecldp % lcldbudget , ncldtop => yrecldp % ncldtop, & - nssopt => yrecldp % nssopt , ramid => yrecldp % ramid , ramin => yrecldp % ramin , rccn => yrecldp % rccn , rclcrit_land =>& - yrecldp % rclcrit_land , rclcrit_sea => yrecldp % rclcrit_sea , rcldiff => yrecldp % rcldiff , rcldiff_convi => yrecldp %& - rcldiff_convi , rcldtopcf => yrecldp % rcldtopcf , rcl_apb1 => yrecldp % rcl_apb1 , rcl_apb2 => yrecldp % rcl_apb2 , rcl_apb3& - => yrecldp % rcl_apb3 , rcl_cdenom1 => yrecldp % rcl_cdenom1 , rcl_cdenom2 => yrecldp % rcl_cdenom2 , rcl_cdenom3 => yrecldp& - % rcl_cdenom3 , rcl_const1i => yrecldp % rcl_const1i , rcl_const1r => yrecldp % rcl_const1r , rcl_const1s => yrecldp %& - rcl_const1s , rcl_const2i => yrecldp % rcl_const2i , rcl_const2r => yrecldp % rcl_const2r , rcl_const2s => yrecldp %& - rcl_const2s , rcl_const3i => yrecldp % rcl_const3i , rcl_const3r => yrecldp % rcl_const3r , rcl_const3s => yrecldp %& - rcl_const3s , rcl_const4i => yrecldp % rcl_const4i , rcl_const4r => yrecldp % rcl_const4r , rcl_const4s => yrecldp %& - rcl_const4s , rcl_const5i => yrecldp % rcl_const5i , rcl_const5r => yrecldp % rcl_const5r , rcl_const5s => yrecldp %& - rcl_const5s , rcl_const6i => yrecldp % rcl_const6i , rcl_const6r => yrecldp % rcl_const6r , rcl_const6s => yrecldp %& - rcl_const6s , rcl_const7s => yrecldp % rcl_const7s , rcl_const8s => yrecldp % rcl_const8s , rcl_fac1 => yrecldp % rcl_fac1 ,& - rcl_fac2 => yrecldp % rcl_fac2 , rcl_fzrab => yrecldp % rcl_fzrab , rcl_ka273 => yrecldp % rcl_ka273 , rcl_kkaac => yrecldp %& - rcl_kkaac , rcl_kkaau => yrecldp % rcl_kkaau , rcl_kkbac => yrecldp % rcl_kkbac , rcl_kkbaun => yrecldp % rcl_kkbaun ,& - rcl_kkbauq => yrecldp % rcl_kkbauq , rcl_kk_cloud_num_land => yrecldp % rcl_kk_cloud_num_land , rcl_kk_cloud_num_sea =>& - yrecldp % rcl_kk_cloud_num_sea , rcl_x3i => yrecldp % rcl_x3i , rcovpmin => yrecldp % rcovpmin , rdensref => yrecldp %& - rdensref , rdepliqrefdepth => yrecldp % rdepliqrefdepth , rdepliqrefrate => yrecldp % rdepliqrefrate , ricehi1 => yrecldp %& - ricehi1 , ricehi2 => yrecldp % ricehi2 , riceinit => yrecldp % riceinit , rkconv => yrecldp % rkconv , rkooptau => yrecldp %& - rkooptau , rlcritsnow => yrecldp % rlcritsnow , rlmin => yrecldp % rlmin , rnice => yrecldp % rnice , rpecons => yrecldp %& - rpecons , rprc1 => yrecldp % rprc1 , rprecrhmax => yrecldp % rprecrhmax , rsnowlin1 => yrecldp % rsnowlin1 , rsnowlin2 =>& - yrecldp % rsnowlin2 , rtaumel => yrecldp % rtaumel , rthomo => yrecldp % rthomo , rvice => yrecldp % rvice , rvrain =>& - yrecldp % rvrain , rvrfactor => yrecldp % rvrfactor , rvsnow => yrecldp % rvsnow ) - - zepsilon = 100.0_jprb * epsilon ( zepsilon ) - llcldbudcc = .FALSE. - llcldbudl = .FALSE. - llcldbudi = .FALSE. - iwarmrain = 2 - ievaprain = 2 - ievapsnow = 1 - idepice = 1 - zqtmst = 1.0_jprb / ptsphy - zgdcp = rg / rcpd - zrdcp = rd / rcpd - zcons1a = rcpd / ( rlmlt * rg * rtaumel ) - zepsec = 1.0e-14_jprb - zrg_r = 1.0_jprb / rg - zrldcp = 1.0_jprb / ( ralsdcp - ralvdcp ) - iphase ( 5 ) = 0 - iphase ( 1 ) = 1 - iphase ( 3 ) = 1 - iphase ( 2 ) = 2 - iphase ( 4 ) = 2 - imelt ( 5 ) = ( - 99 ) - imelt ( 1 ) = 2 - imelt ( 3 ) = 4 - imelt ( 2 ) = 3 - imelt ( 4 ) = 3 -!$acc loop seq - DO jk = 1 , klev , 1 - tendency_loc_t ( jl , jk ) = 0.0_jprb - tendency_loc_q ( jl , jk ) = 0.0_jprb - tendency_loc_a ( jl , jk ) = 0.0_jprb - END DO -!$acc loop seq - DO jm = 1 , 4 , 1 -!$acc loop seq - DO jk = 1 , klev , 1 - tendency_loc_cld ( jl , jk , jm ) = 0.0_jprb - END DO - END DO - zvqx ( 5 ) = 0.0_jprb - zvqx ( 1 ) = 0.0_jprb - zvqx ( 2 ) = rvice - zvqx ( 3 ) = rvrain - zvqx ( 4 ) = rvsnow - llfall ( : ) = .FALSE. -!$acc loop seq - DO jm = 1 , 5 , 1 - IF ( zvqx ( jm ) > 0.0_jprb ) THEN - llfall ( jm ) = .TRUE. - END IF - END DO - llfall ( 2 ) = .FALSE. -!$acc loop seq - DO jk = 1 , klev , 1 - ztp1 ( jk ) = pt ( jl , jk ) + ptsphy * tendency_tmp_t ( jl , jk ) - zqx ( jk , 5 ) = pq ( jl , jk ) + ptsphy * tendency_tmp_q ( jl , jk ) - zqx0 ( jk , 5 ) = pq ( jl , jk ) + ptsphy * tendency_tmp_q ( jl , jk ) - za ( jk ) = pa ( jl , jk ) + ptsphy * tendency_tmp_a ( jl , jk ) - zaorig ( jk ) = pa ( jl , jk ) + ptsphy * tendency_tmp_a ( jl , jk ) - END DO -!$acc loop seq - DO jm = 1 , 4 , 1 -!$acc loop seq - DO jk = 1 , klev , 1 - zqx ( jk , jm ) = pclv ( jl , jk , jm ) + ptsphy * tendency_tmp_cld ( jl , jk , jm ) - zqx0 ( jk , jm ) = pclv ( jl , jk , jm ) + ptsphy * tendency_tmp_cld ( jl , jk , jm ) - END DO - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 -!$acc loop seq - DO jk = 1 , klev + 1 , 1 - zpfplsx ( jk , jm ) = 0.0_jprb - END DO - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 -!$acc loop seq - DO jk = 1 , klev , 1 - zqxn2d ( jk , jm ) = 0.0_jprb - zlneg ( jk , jm ) = 0.0_jprb - END DO - END DO - prainfrac_toprfz ( jl ) = 0.0_jprb -!$acc loop seq - DO jk = 1 , klev , 1 - IF ( zqx ( jk , 1 ) + zqx ( jk , 2 ) < rlmin .OR. za ( jk ) < ramin ) THEN - zlneg ( jk , 1 ) = zlneg ( jk , 1 ) + zqx ( jk , 1 ) - zqadj = zqx ( jk , 1 ) * zqtmst - tendency_loc_q ( jl , jk ) = tendency_loc_q ( jl , jk ) + zqadj - tendency_loc_t ( jl , jk ) = tendency_loc_t ( jl , jk ) - ralvdcp * zqadj - zqx ( jk , 5 ) = zqx ( jk , 5 ) + zqx ( jk , 1 ) - zqx ( jk , 1 ) = 0.0_jprb - zlneg ( jk , 2 ) = zlneg ( jk , 2 ) + zqx ( jk , 2 ) - zqadj = zqx ( jk , 2 ) * zqtmst - tendency_loc_q ( jl , jk ) = tendency_loc_q ( jl , jk ) + zqadj - tendency_loc_t ( jl , jk ) = tendency_loc_t ( jl , jk ) - ralsdcp * zqadj - zqx ( jk , 5 ) = zqx ( jk , 5 ) + zqx ( jk , 2 ) - zqx ( jk , 2 ) = 0.0_jprb - za ( jk ) = 0.0_jprb - END IF - END DO -!$acc loop seq - DO jm = 1 , 4 , 1 -!$acc loop seq - DO jk = 1 , klev , 1 - IF ( zqx ( jk , jm ) < rlmin ) THEN - zlneg ( jk , jm ) = zlneg ( jk , jm ) + zqx ( jk , jm ) - zqadj = zqx ( jk , jm ) * zqtmst - tendency_loc_q ( jl , jk ) = tendency_loc_q ( jl , jk ) + zqadj - IF ( iphase ( jm ) == 1 ) THEN - tendency_loc_t ( jl , jk ) = tendency_loc_t ( jl , jk ) - ralvdcp * zqadj - END IF - IF ( iphase ( jm ) == 2 ) THEN - tendency_loc_t ( jl , jk ) = tendency_loc_t ( jl , jk ) - ralsdcp * zqadj - END IF - zqx ( jk , 5 ) = zqx ( jk , 5 ) + zqx ( jk , jm ) - zqx ( jk , jm ) = 0.0_jprb - END IF - END DO - END DO -!$acc loop seq - DO jk = 1 , klev , 1 - zfoealfa ( jk ) = real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2& - ) ) , kind =JPRB ) - zfoeewmt ( jk ) = min ( real ( r2es * ( real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) *& - rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk )& - - r4les ) ) + ( 1.0_jprb - real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r& - ) ** ( 2 ) ) , kind =JPRB ) ) * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4ies ) )& - ) , kind =JPRB ) / pap ( jl , jk ) , 0.5_jprb ) - zqsmix ( jk ) = zfoeewmt ( jk ) - zqsmix ( jk ) = zqsmix ( jk ) / ( 1.0_jprb - retv * zqsmix ( jk ) ) - zalfa = real ( max ( 0.0_jprb , sign ( 1.0_jprb , ztp1 ( jk ) - rtt ) ) , kind =JPRB ) - zfoeew ( jk ) = min ( ( zalfa * real ( r2es * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4les ) ) , kind =& - JPRB ) + ( 1.0_jprb - zalfa ) * real ( r2es * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk )& - - r4ies ) ) , kind =JPRB ) ) / pap ( jl , jk ) , 0.5_jprb ) - zfoeew ( jk ) = min ( 0.5_jprb , zfoeew ( jk ) ) - zqsice ( jk ) = zfoeew ( jk ) / ( 1.0_jprb - retv * zfoeew ( jk ) ) - zfoeeliqt ( jk ) = min ( real ( r2es * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4les ) ) , kind =& - JPRB ) / pap ( jl , jk ) , 0.5_jprb ) - zqsliq ( jk ) = zfoeeliqt ( jk ) - zqsliq ( jk ) = zqsliq ( jk ) / ( 1.0_jprb - retv * zqsliq ( jk ) ) - END DO -!$acc loop seq - DO jk = 1 , klev , 1 - za ( jk ) = max ( 0.0_jprb , min ( 1.0_jprb , za ( jk ) ) ) - zli ( jk ) = zqx ( jk , 1 ) + zqx ( jk , 2 ) - IF ( zli ( jk ) > rlmin ) THEN - zliqfrac ( jk ) = zqx ( jk , 1 ) / zli ( jk ) - zicefrac ( jk ) = 1.0_jprb - zliqfrac ( jk ) - ELSE - zliqfrac ( jk ) = 0.0_jprb - zicefrac ( jk ) = 0.0_jprb - END IF - END DO - ztrpaus ( jl ) = 0.1_jprb - zpaphd ( jl ) = 1.0_jprb / paph ( jl , klev + 1 ) -!$acc loop seq - DO jk = 1 , klev - 1 , 1 - zsig = pap ( jl , jk ) * zpaphd ( jl ) - IF ( zsig > 0.1_jprb .AND. ztp1 ( jk ) > ztp1 ( jk + 1 ) .AND. zsig < 0.4_jprb ) THEN - ztrpaus ( jl ) = zsig - END IF - END DO - zanewm1 ( jl ) = 0.0_jprb - zda ( jl ) = 0.0_jprb - zcovpclr ( jl ) = 0.0_jprb - zcovpmax ( jl ) = 0.0_jprb - zcovptot ( jl ) = 0.0_jprb - zcldtopdist ( jl ) = 0.0_jprb -!$acc loop seq - DO jk = ncldtop , klev , 1 -!$acc loop seq - DO jm = 1 , 5 , 1 - zqxfg ( jm ) = zqx ( jk , jm ) - END DO - zlicld ( jl ) = 0.0_jprb - zrainaut ( jl ) = 0.0_jprb - zrainacc ( jl ) = 0.0_jprb - zsnowaut ( jl ) = 0.0_jprb - zldefr ( jl ) = 0.0_jprb - zacust ( jl ) = 0.0_jprb - zqpretot ( jl ) = 0.0_jprb - zlfinalsum ( jl ) = 0.0_jprb - zlcond1 ( jl ) = 0.0_jprb - zlcond2 ( jl ) = 0.0_jprb - zsupsat ( jl ) = 0.0_jprb - zlevapl ( jl ) = 0.0_jprb - zlevapi ( jl ) = 0.0_jprb - zsolab ( jl ) = 0.0_jprb - zsolac ( jl ) = 0.0_jprb - zicetot ( jl ) = 0.0_jprb -!$acc loop seq - DO jm = 1 , 5 , 1 -!$acc loop seq - DO jn = 1 , 5 , 1 - zsolqb ( jn , jm ) = 0.0_jprb - zsolqa ( jn , jm ) = 0.0_jprb - END DO - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - zfallsrce ( jm ) = 0.0_jprb - zfallsink ( jm ) = 0.0_jprb - zconvsrce ( jm ) = 0.0_jprb - zconvsink ( jm ) = 0.0_jprb - zpsupsatsrce ( jm ) = 0.0_jprb - zratio ( jm ) = 0.0_jprb - END DO - IF ( llcldbudcc ) THEN - zbudcc ( : ) = 0.0_jprb - END IF - IF ( llcldbudl ) THEN - zbudl ( : ) = 0.0_jprb - END IF - IF ( llcldbudi ) THEN - zbudi ( : ) = 0.0_jprb - END IF - zdp ( jl ) = paph ( jl , jk + 1 ) - paph ( jl , jk ) - zgdp ( jl ) = rg / zdp ( jl ) - zrho ( jl ) = pap ( jl , jk ) / ( rd * ztp1 ( jk ) ) - zdtgdp ( jl ) = ptsphy * zgdp ( jl ) - zrdtgdp ( jl ) = zdp ( jl ) * ( 1.0_jprb / ( ptsphy * rg ) ) - IF ( jk > 1 ) THEN - zdtgdpf ( jl ) = ptsphy * rg / ( pap ( jl , jk ) - pap ( jl , jk - 1 ) ) - END IF - zfacw = r5les / ( ztp1 ( jk ) - r4les ) ** ( 2 ) - zcor = 1.0_jprb / ( 1.0_jprb - retv * zfoeeliqt ( jk ) ) - zdqsliqdt ( jl ) = zfacw * zcor * zqsliq ( jk ) - zcorqsliq ( jl ) = 1.0_jprb + ralvdcp * zdqsliqdt ( jl ) - zfaci = r5ies / ( ztp1 ( jk ) - r4ies ) ** ( 2 ) - zcor = 1.0_jprb / ( 1.0_jprb - retv * zfoeew ( jk ) ) - zdqsicedt ( jl ) = zfaci * zcor * zqsice ( jk ) - zcorqsice ( jl ) = 1.0_jprb + ralsdcp * zdqsicedt ( jl ) - zalfaw = zfoealfa ( jk ) - zalfawm ( jl ) = zalfaw - zfac = zalfaw * zfacw + ( 1.0_jprb - zalfaw ) * zfaci - zcor = 1.0_jprb / ( 1.0_jprb - retv * zfoeewmt ( jk ) ) - zdqsmixdt ( jl ) = zfac * zcor * zqsmix ( jk ) - zcorqsmix ( jl ) = 1.0_jprb + real ( real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) *& - rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) * ralvdcp + ( 1.0_jprb - real ( min ( 1.0_jprb , ( (& - max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind = JPRB & - ) ) * ralsdcp , kind =JPRB ) * zdqsmixdt ( jl ) - zevaplimmix ( jl ) = max ( ( zqsmix ( jk ) - zqx ( jk , 5 ) ) / zcorqsmix ( jl ) , 0.0_jprb ) - zevaplimliq ( jl ) = max ( ( zqsliq ( jk ) - zqx ( jk , 5 ) ) / zcorqsliq ( jl ) , 0.0_jprb ) - zevaplimice ( jl ) = max ( ( zqsice ( jk ) - zqx ( jk , 5 ) ) / zcorqsice ( jl ) , 0.0_jprb ) - ztmpa = 1.0_jprb * 1d0 / max ( za ( jk ) , zepsec ) - zliqcld ( jl ) = zqx ( jk , 1 ) * ztmpa - zicecld ( jl ) = zqx ( jk , 2 ) * ztmpa - zlicld ( jl ) = zliqcld ( jl ) + zicecld ( jl ) - IF ( zqx ( jk , 1 ) < rlmin ) THEN - zsolqa ( 5 , 1 ) = zqx ( jk , 1 ) - zsolqa ( 1 , 5 ) = ( - zqx ( jk , 1 ) ) - END IF - IF ( zqx ( jk , 2 ) < rlmin ) THEN - zsolqa ( 5 , 2 ) = zqx ( jk , 2 ) - zsolqa ( 2 , 5 ) = ( - zqx ( jk , 2 ) ) - END IF - zfokoop ( jl ) = real ( min ( rkoop1 - rkoop2 * ztp1 ( jk ) , real ( r2es * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk& - ) - r4les ) ) , kind =JPRB ) * 1_JPRB / real ( r2es * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1& - ( jk ) - r4ies ) ) , kind =JPRB ) ) , kind =JPRB ) - IF ( nssopt == 0 .OR. ztp1 ( jk ) >= rtt ) THEN - zfac = 1.0_jprb - zfaci = 1.0_jprb - ELSE - zfac = za ( jk ) + zfokoop ( jl ) * ( 1.0_jprb - za ( jk ) ) - zfaci = ptsphy / rkooptau - END IF - IF ( za ( jk ) > 1.0_jprb - ramin ) THEN - zsupsat ( jl ) = max ( ( zqx ( jk , 5 ) - zfac * zqsice ( jk ) ) / zcorqsice ( jl ) , 0.0_jprb ) - ELSE - zqp1env = ( zqx ( jk , 5 ) - za ( jk ) * zqsice ( jk ) ) * 1d0 / max ( 1.0_jprb - za ( jk ) , zepsilon ) - zsupsat ( jl ) = max ( ( 1.0_jprb - za ( jk ) ) * ( zqp1env - zfac * zqsice ( jk ) ) / zcorqsice ( jl ) , 0.0_jprb ) - END IF - IF ( zsupsat ( jl ) > zepsec ) THEN - IF ( ztp1 ( jk ) > rthomo ) THEN - zsolqa ( 1 , 5 ) = zsolqa ( 1 , 5 ) + zsupsat ( jl ) - zsolqa ( 5 , 1 ) = zsolqa ( 5 , 1 ) - zsupsat ( jl ) - zqxfg ( 1 ) = zqxfg ( 1 ) + zsupsat ( jl ) - ELSE - zsolqa ( 2 , 5 ) = zsolqa ( 2 , 5 ) + zsupsat ( jl ) - zsolqa ( 5 , 2 ) = zsolqa ( 5 , 2 ) - zsupsat ( jl ) - zqxfg ( 2 ) = zqxfg ( 2 ) + zsupsat ( jl ) - END IF - zsolac ( jl ) = ( 1.0_jprb - za ( jk ) ) * zfaci - IF ( llcldbudl .AND. ztp1 ( jk ) > rthomo ) THEN - zbudl ( 1 ) = zsupsat ( jl ) * zqtmst - END IF - IF ( llcldbudi .AND. ztp1 ( jk ) <= rthomo ) THEN - zbudi ( 1 ) = zsupsat ( jl ) * zqtmst - END IF - IF ( llcldbudcc ) THEN - zbudcc ( 1 ) = zsolac ( jl ) * zqtmst - END IF - END IF - IF ( psupsat ( jl , jk ) > zepsec ) THEN - IF ( ztp1 ( jk ) > rthomo ) THEN - zsolqa ( 1 , 1 ) = zsolqa ( 1 , 1 ) + psupsat ( jl , jk ) - zpsupsatsrce ( 1 ) = psupsat ( jl , jk ) - zqxfg ( 1 ) = zqxfg ( 1 ) + psupsat ( jl , jk ) - IF ( llcldbudl ) THEN - zbudl ( 2 ) = psupsat ( jl , jk ) * zqtmst - END IF - ELSE - zsolqa ( 2 , 2 ) = zsolqa ( 2 , 2 ) + psupsat ( jl , jk ) - zpsupsatsrce ( 2 ) = psupsat ( jl , jk ) - zqxfg ( 2 ) = zqxfg ( 2 ) + psupsat ( jl , jk ) - IF ( llcldbudi ) THEN - zbudi ( 2 ) = psupsat ( jl , jk ) * zqtmst - END IF - END IF - zsolac ( jl ) = ( 1.0_jprb - za ( jk ) ) * zfaci - IF ( llcldbudcc ) THEN - zbudcc ( 2 ) = zsolac ( jl ) * zqtmst - END IF - END IF - IF ( jk >= ncldtop .AND. jk < klev ) THEN - plude ( jl , jk ) = plude ( jl , jk ) * zdtgdp ( jl ) - IF ( ldcum ( jl ) .AND. plu ( jl , jk + 1 ) > zepsec .AND. plude ( jl , jk ) > rlmin ) THEN - zsolac ( jl ) = zsolac ( jl ) + plude ( jl , jk ) / plu ( jl , jk + 1 ) - zalfaw = zfoealfa ( jk ) - zconvsrce ( 1 ) = zalfaw * plude ( jl , jk ) - zconvsrce ( 2 ) = ( 1.0_jprb - zalfaw ) * plude ( jl , jk ) - zsolqa ( 1 , 1 ) = zsolqa ( 1 , 1 ) + zconvsrce ( 1 ) - zsolqa ( 2 , 2 ) = zsolqa ( 2 , 2 ) + zconvsrce ( 2 ) - IF ( llcldbudl ) THEN - zbudl ( 3 ) = zconvsrce ( 1 ) * zqtmst - END IF - IF ( llcldbudi ) THEN - zbudi ( 3 ) = zconvsrce ( 2 ) * zqtmst - END IF - IF ( llcldbudcc ) THEN - zbudcc ( 3 ) = zqtmst * plude ( jl , jk ) / plu ( jl , jk + 1 ) - END IF - ELSE - plude ( jl , jk ) = 0.0_jprb - END IF - IF ( ldcum ( jl ) ) THEN - zsolqa ( 4 , 4 ) = zsolqa ( 4 , 4 ) + psnde ( jl , jk ) * zdtgdp ( jl ) - END IF - END IF - IF ( jk > ncldtop ) THEN - zmf ( jl ) = max ( 0.0_jprb , ( pmfu ( jl , jk ) + pmfd ( jl , jk ) ) * zdtgdp ( jl ) ) - zacust ( jl ) = zmf ( jl ) * zanewm1 ( jl ) -!$acc loop seq - DO jm = 1 , 5 , 1 - IF ( ( .NOT. llfall ( jm ) ) .AND. iphase ( jm ) > 0 ) THEN - zlcust ( jm ) = zmf ( jl ) * zqxnm1 ( jm ) - zconvsrce ( jm ) = zconvsrce ( jm ) + zlcust ( jm ) - END IF - END DO - zdtdp = zrdcp * 0.5_jprb * ( ztp1 ( jk - 1 ) + ztp1 ( jk ) ) / paph ( jl , jk ) - zdtforc = zdtdp * ( pap ( jl , jk ) - pap ( jl , jk - 1 ) ) - zdqs ( jl ) = zanewm1 ( jl ) * zdtforc * zdqsmixdt ( jl ) -!$acc loop seq - DO jm = 1 , 5 , 1 - IF ( ( .NOT. llfall ( jm ) ) .AND. iphase ( jm ) > 0 ) THEN - zlfinal = max ( 0.0_jprb , zlcust ( jm ) - zdqs ( jl ) ) - zevap = min ( zlcust ( jm ) - zlfinal , zevaplimmix ( jl ) ) - zlfinal = zlcust ( jm ) - zevap - zlfinalsum ( jl ) = zlfinalsum ( jl ) + zlfinal - zsolqa ( jm , jm ) = zsolqa ( jm , jm ) + zlcust ( jm ) - zsolqa ( 5 , jm ) = zsolqa ( 5 , jm ) + zevap - zsolqa ( jm , 5 ) = zsolqa ( jm , 5 ) - zevap - IF ( llcldbudl .AND. jm == 1 ) THEN - zbudl ( 4 ) = zlcust ( jm ) * zqtmst - END IF - IF ( llcldbudi .AND. jm == 2 ) THEN - zbudi ( 4 ) = zlcust ( jm ) * zqtmst - END IF - IF ( llcldbudl .AND. jm == 1 ) THEN - zbudl ( 5 ) = ( - zevap * zqtmst ) - END IF - IF ( llcldbudi .AND. jm == 2 ) THEN - zbudi ( 5 ) = ( - zevap * zqtmst ) - END IF - END IF - END DO - IF ( zlfinalsum ( jl ) < zepsec ) THEN - zacust ( jl ) = 0.0_jprb - END IF - zsolac ( jl ) = zsolac ( jl ) + zacust ( jl ) - IF ( llcldbudcc ) THEN - zbudcc ( 4 ) = zacust ( jl ) * zqtmst - END IF - END IF - IF ( jk < klev ) THEN - zmfdn = max ( 0.0_jprb , ( pmfu ( jl , jk + 1 ) + pmfd ( jl , jk + 1 ) ) * zdtgdp ( jl ) ) - zsolab ( jl ) = zsolab ( jl ) + zmfdn - zsolqb ( 1 , 1 ) = zsolqb ( 1 , 1 ) + zmfdn - zsolqb ( 2 , 2 ) = zsolqb ( 2 , 2 ) + zmfdn - zconvsink ( 1 ) = zmfdn - zconvsink ( 2 ) = zmfdn - END IF - zldifdt ( jl ) = rcldiff * ptsphy - IF ( ktype ( jl ) > 0 .AND. plude ( jl , jk ) > zepsec ) THEN - zldifdt ( jl ) = rcldiff_convi * zldifdt ( jl ) - END IF - IF ( zli ( jk ) > zepsec ) THEN - ze = zldifdt ( jl ) * max ( zqsmix ( jk ) - zqx ( jk , 5 ) , 0.0_jprb ) - zleros = za ( jk ) * ze - zleros = min ( zleros , zevaplimmix ( jl ) ) - zleros = min ( zleros , zli ( jk ) ) - zaeros = zleros / zlicld ( jl ) - zsolac ( jl ) = zsolac ( jl ) - zaeros - zsolqa ( 5 , 1 ) = zsolqa ( 5 , 1 ) + zliqfrac ( jk ) * zleros - zsolqa ( 1 , 5 ) = zsolqa ( 1 , 5 ) - zliqfrac ( jk ) * zleros - zsolqa ( 5 , 2 ) = zsolqa ( 5 , 2 ) + zicefrac ( jk ) * zleros - zsolqa ( 2 , 5 ) = zsolqa ( 2 , 5 ) - zicefrac ( jk ) * zleros - IF ( llcldbudl ) THEN - zbudl ( 7 ) = ( - zliqfrac ( jk ) * zleros * zqtmst ) - END IF - IF ( llcldbudi ) THEN - zbudi ( 7 ) = ( - zicefrac ( jk ) * zleros * zqtmst ) - END IF - IF ( llcldbudcc ) THEN - zbudcc ( 7 ) = ( - zaeros * zqtmst ) - END IF - END IF - zdtdp = zrdcp * ztp1 ( jk ) / pap ( jl , jk ) - zdpmxdt = zdp ( jl ) * zqtmst - zmfdn = 0.0_jprb - IF ( jk < klev ) THEN - zmfdn = pmfu ( jl , jk + 1 ) + pmfd ( jl , jk + 1 ) - END IF - zwtot = pvervel ( jl , jk ) + 0.5_jprb * rg * ( pmfu ( jl , jk ) + pmfd ( jl , jk ) + zmfdn ) - zwtot = min ( zdpmxdt , max ( ( - zdpmxdt ) , zwtot ) ) - zzzdt = phrsw ( jl , jk ) + phrlw ( jl , jk ) - zdtdiab = min ( zdpmxdt * zdtdp , max ( ( - zdpmxdt * zdtdp ) , zzzdt ) ) * ptsphy + ralfdcp * zldefr ( jl ) - zdtforc = zdtdp * zwtot * ptsphy + zdtdiab - zqold ( jl ) = zqsmix ( jk ) - ztold ( jl ) = ztp1 ( jk ) - ztp1 ( jk ) = ztp1 ( jk ) + zdtforc - ztp1 ( jk ) = max ( ztp1 ( jk ) , 160.0_jprb ) - llflag = .TRUE. - zqp = 1.0_jprb / pap ( jl , jk ) - zqsat = real ( r2es * ( real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r )& - ** ( 2 ) ) , kind =JPRB ) * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4les ) ) + (& - 1.0_jprb - real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) ,& - kind =JPRB ) ) * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4ies ) ) ) , kind =& - JPRB ) * zqp - zqsat = min ( 0.5_jprb , zqsat ) - zcor = 1.0_jprb / ( 1.0_jprb - retv * zqsat ) - zqsat = zqsat * zcor - zcond = ( zqsmix ( jk ) - zqsat ) * 1d0 / ( 1.0_jprb + zqsat * zcor * real ( real ( min ( 1.0_jprb , ( ( max ( rtice , min (& - rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) * r5alvcp * (& - 1.0_jprb / ( ztp1 ( jk ) - r4les ) ** ( 2 ) ) + ( 1.0_jprb - real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 (& - jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) ) * r5alscp * ( 1.0_jprb / ( ztp1& - ( jk ) - r4ies ) ** ( 2 ) ) , kind =JPRB ) ) - ztp1 ( jk ) = ztp1 ( jk ) + real ( real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) *& - rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) * ralvdcp + ( 1.0_jprb - real ( min ( 1.0_jprb , ( (& - max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind = JPRB & - ) ) * ralsdcp , kind =JPRB ) * zcond - zqsmix ( jk ) = zqsmix ( jk ) - zcond - zqsat = real ( r2es * ( real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r )& - ** ( 2 ) ) , kind =JPRB ) * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4les ) ) + (& - 1.0_jprb - real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) ,& - kind =JPRB ) ) * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4ies ) ) ) , kind =& - JPRB ) * zqp - zqsat = min ( 0.5_jprb , zqsat ) - zcor = 1.0_jprb / ( 1.0_jprb - retv * zqsat ) - zqsat = zqsat * zcor - zcond1 = ( zqsmix ( jk ) - zqsat ) * 1d0 / ( 1.0_jprb + zqsat * zcor * real ( real ( min ( 1.0_jprb , ( ( max ( rtice , min (& - rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) * r5alvcp * (& - 1.0_jprb / ( ztp1 ( jk ) - r4les ) ** ( 2 ) ) + ( 1.0_jprb - real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 (& - jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) ) * r5alscp * ( 1.0_jprb / ( ztp1& - ( jk ) - r4ies ) ** ( 2 ) ) , kind =JPRB ) ) - ztp1 ( jk ) = ztp1 ( jk ) + real ( real ( min ( 1.0_jprb , ( ( max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) *& - rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) * ralvdcp + ( 1.0_jprb - real ( min ( 1.0_jprb , ( (& - max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind = JPRB & - ) ) * ralsdcp , kind =JPRB ) * zcond1 - zqsmix ( jk ) = zqsmix ( jk ) - zcond1 - zdqs ( jl ) = zqsmix ( jk ) - zqold ( jl ) - zqsmix ( jk ) = zqold ( jl ) - ztp1 ( jk ) = ztold ( jl ) - IF ( zdqs ( jl ) > 0.0_jprb ) THEN - zlevap = za ( jk ) * min ( zdqs ( jl ) , zlicld ( jl ) ) - zlevap = min ( zlevap , zevaplimmix ( jl ) ) - zlevap = min ( zlevap , max ( zqsmix ( jk ) - zqx ( jk , 5 ) , 0.0_jprb ) ) - zlevapl ( jl ) = zliqfrac ( jk ) * zlevap - zlevapi ( jl ) = zicefrac ( jk ) * zlevap - zsolqa ( 5 , 1 ) = zsolqa ( 5 , 1 ) + zliqfrac ( jk ) * zlevap - zsolqa ( 1 , 5 ) = zsolqa ( 1 , 5 ) - zliqfrac ( jk ) * zlevap - zsolqa ( 5 , 2 ) = zsolqa ( 5 , 2 ) + zicefrac ( jk ) * zlevap - zsolqa ( 2 , 5 ) = zsolqa ( 2 , 5 ) - zicefrac ( jk ) * zlevap - IF ( llcldbudl ) THEN - zbudl ( 8 ) = ( - zliqfrac ( jk ) * zlevap * zqtmst ) - END IF - IF ( llcldbudi ) THEN - zbudi ( 8 ) = ( - zicefrac ( jk ) * zlevap * zqtmst ) - END IF - END IF - IF ( zdqs ( jl ) <= ( - rlmin ) .AND. za ( jk ) > zepsec ) THEN - zlcond1 ( jl ) = max ( ( - zdqs ( jl ) ) , 0.0_jprb ) - IF ( za ( jk ) > 0.99_jprb ) THEN - zcor = 1.0_jprb / ( 1.0_jprb - retv * zqsmix ( jk ) ) - zcdmax = ( zqx ( jk , 5 ) - zqsmix ( jk ) ) * 1d0 / ( 1.0_jprb + zcor * zqsmix ( jk ) * real ( real ( min ( 1.0_jprb , ( (& - max ( rtice , min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind = JPRB & - ) * r5alvcp * ( 1.0_jprb / ( ztp1 ( jk ) - r4les ) ** ( 2 ) ) + ( 1.0_jprb - real ( min ( 1.0_jprb , ( ( max ( rtice ,& - min ( rtwat , ztp1 ( jk ) ) ) - rtice ) * rtwat_rtice_r ) ** ( 2 ) ) , kind =JPRB ) ) *& - r5alscp * ( 1.0_jprb / ( ztp1 ( jk ) - r4ies ) ** ( 2 ) ) , kind =JPRB ) ) - ELSE - zcdmax = ( zqx ( jk , 5 ) - za ( jk ) * zqsmix ( jk ) ) / za ( jk ) - END IF - zlcond1 ( jl ) = max ( min ( zlcond1 ( jl ) , zcdmax ) , 0.0_jprb ) - zlcond1 ( jl ) = za ( jk ) * zlcond1 ( jl ) - IF ( zlcond1 ( jl ) < rlmin ) THEN - zlcond1 ( jl ) = 0.0_jprb - END IF - IF ( ztp1 ( jk ) > rthomo ) THEN - zsolqa ( 1 , 5 ) = zsolqa ( 1 , 5 ) + zlcond1 ( jl ) - zsolqa ( 5 , 1 ) = zsolqa ( 5 , 1 ) - zlcond1 ( jl ) - zqxfg ( 1 ) = zqxfg ( 1 ) + zlcond1 ( jl ) - IF ( llcldbudl ) THEN - zbudl ( 9 ) = zlcond1 ( jl ) * zqtmst - END IF - ELSE - zsolqa ( 2 , 5 ) = zsolqa ( 2 , 5 ) + zlcond1 ( jl ) - zsolqa ( 5 , 2 ) = zsolqa ( 5 , 2 ) - zlcond1 ( jl ) - zqxfg ( 2 ) = zqxfg ( 2 ) + zlcond1 ( jl ) - IF ( llcldbudi ) THEN - zbudi ( 9 ) = zlcond1 ( jl ) * zqtmst - END IF - END IF - END IF - IF ( zdqs ( jl ) <= ( - rlmin ) .AND. za ( jk ) < 1.0_jprb - zepsec ) THEN - zrhc = ramid - zsigk = pap ( jl , jk ) / paph ( jl , klev + 1 ) - IF ( zsigk > 0.8_jprb ) THEN - zrhc = ramid + ( 1.0_jprb - ramid ) * ( ( zsigk - 0.8_jprb ) / 0.2_jprb ) ** ( 2 ) - END IF - IF ( nssopt == 0 ) THEN - zqe = ( zqx ( jk , 5 ) - za ( jk ) * zqsice ( jk ) ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zqe = max ( 0.0_jprb , zqe ) - ELSE - IF ( nssopt == 1 ) THEN - zqe = ( zqx ( jk , 5 ) - za ( jk ) * zqsice ( jk ) ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zqe = max ( 0.0_jprb , zqe ) - ELSE - IF ( nssopt == 2 ) THEN - zqe = zqx ( jk , 5 ) - ELSE - IF ( nssopt == 3 ) THEN - zqe = zqx ( jk , 5 ) + zli ( jk ) - END IF - END IF - END IF - END IF - IF ( nssopt == 0 .OR. ztp1 ( jk ) >= rtt ) THEN - zfac = 1.0_jprb - ELSE - zfac = zfokoop ( jl ) - END IF - IF ( zqe >= zrhc * zqsice ( jk ) * zfac .AND. zqe < zqsice ( jk ) * zfac ) THEN - zacond = ( - ( 1.0_jprb - za ( jk ) ) * zfac * zdqs ( jl ) * 1d0 / max ( 2.0_jprb * ( zfac * zqsice ( jk ) - zqe ) , zepsec& - ) ) - zacond = min ( zacond , 1.0_jprb - za ( jk ) ) - zlcond2 ( jl ) = ( - zfac * zdqs ( jl ) * 0.5_jprb * zacond ) - zzdl = 2.0_jprb * ( zfac * zqsice ( jk ) - zqe ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - IF ( zfac * zdqs ( jl ) < ( - zzdl ) ) THEN - zlcondlim = ( za ( jk ) - 1.0_jprb ) * zfac * zdqs ( jl ) - zfac * zqsice ( jk ) + zqx ( jk , 5 ) - zlcond2 ( jl ) = min ( zlcond2 ( jl ) , zlcondlim ) - END IF - zlcond2 ( jl ) = max ( zlcond2 ( jl ) , 0.0_jprb ) - IF ( zlcond2 ( jl ) < rlmin .OR. 1.0_jprb - za ( jk ) < zepsec ) THEN - zlcond2 ( jl ) = 0.0_jprb - zacond = 0.0_jprb - END IF - IF ( zlcond2 ( jl ) == 0.0_jprb ) THEN - zacond = 0.0_jprb - END IF - zsolac ( jl ) = zsolac ( jl ) + zacond - IF ( llcldbudcc ) THEN - zbudcc ( 10 ) = zacond * zqtmst - END IF - IF ( ztp1 ( jk ) > rthomo ) THEN - zsolqa ( 1 , 5 ) = zsolqa ( 1 , 5 ) + zlcond2 ( jl ) - zsolqa ( 5 , 1 ) = zsolqa ( 5 , 1 ) - zlcond2 ( jl ) - zqxfg ( 1 ) = zqxfg ( 1 ) + zlcond2 ( jl ) - IF ( llcldbudl ) THEN - zbudl ( 10 ) = zlcond2 ( jl ) * zqtmst - END IF - ELSE - zsolqa ( 2 , 5 ) = zsolqa ( 2 , 5 ) + zlcond2 ( jl ) - zsolqa ( 5 , 2 ) = zsolqa ( 5 , 2 ) - zlcond2 ( jl ) - zqxfg ( 2 ) = zqxfg ( 2 ) + zlcond2 ( jl ) - IF ( llcldbudi ) THEN - zbudi ( 10 ) = zlcond2 ( jl ) * zqtmst - END IF - END IF - END IF - END IF - IF ( idepice == 1 ) THEN - IF ( za ( jk ) >= rcldtopcf .AND. za ( jk - 1 ) < rcldtopcf ) THEN - zcldtopdist ( jl ) = 0.0_jprb - ELSE - zcldtopdist ( jl ) = zcldtopdist ( jl ) + zdp ( jl ) / ( zrho ( jl ) * rg ) - END IF - IF ( zqxfg ( 1 ) > rlmin .AND. ztp1 ( jk ) < rtt ) THEN - zvpice = real ( r2es * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4ies ) ) , kind = JPRB & - ) * rv / rd - zvpliq = zvpice * zfokoop ( jl ) - zicenuclei ( jl ) = 1000.0_jprb * exp ( 12.96_jprb * ( zvpliq - zvpice ) / zvpliq - 0.639_jprb ) - zadd = rlstt * ( rlstt / ( rv * ztp1 ( jk ) ) - 1.0_jprb ) / ( 0.024_jprb * ztp1 ( jk ) ) - zbdd = rv * ztp1 ( jk ) * pap ( jl , jk ) / ( 2.21_jprb * zvpice ) - zcvds = 7.8_jprb * ( zicenuclei ( jl ) / zrho ( jl ) ) ** ( 0.666_jprb ) * ( zvpliq - zvpice ) / ( 8.87_jprb * ( zadd +& - zbdd ) * zvpice ) - zice0 = max ( zicecld ( jl ) , zicenuclei ( jl ) * riceinit / zrho ( jl ) ) - zinew = ( 0.666_jprb * zcvds * ptsphy + zice0 ** ( 0.666_jprb ) ) ** ( 1.5_jprb ) - zdepos = max ( za ( jk ) * ( zinew - zice0 ) , 0.0_jprb ) - zdepos = min ( zdepos , zqxfg ( 1 ) ) - zinfactor = min ( zicenuclei ( jl ) / 15000.0_jprb , 1.0_jprb ) - zdepos = zdepos * min ( zinfactor + ( 1.0_jprb - zinfactor ) * ( rdepliqrefrate + zcldtopdist ( jl ) / rdepliqrefdepth ) ,& - 1.0_jprb ) - zsolqa ( 2 , 1 ) = zsolqa ( 2 , 1 ) + zdepos - zsolqa ( 1 , 2 ) = zsolqa ( 1 , 2 ) - zdepos - zqxfg ( 2 ) = zqxfg ( 2 ) + zdepos - zqxfg ( 1 ) = zqxfg ( 1 ) - zdepos - IF ( llcldbudl ) THEN - zbudl ( 11 ) = ( - zdepos * zqtmst ) - END IF - IF ( llcldbudi ) THEN - zbudi ( 11 ) = zdepos * zqtmst - END IF - END IF - ELSE - IF ( idepice == 2 ) THEN - IF ( za ( jk ) >= rcldtopcf .AND. za ( jk - 1 ) < rcldtopcf ) THEN - zcldtopdist ( jl ) = 0.0_jprb - ELSE - zcldtopdist ( jl ) = zcldtopdist ( jl ) + zdp ( jl ) / ( zrho ( jl ) * rg ) - END IF - IF ( zqxfg ( 1 ) > rlmin .AND. ztp1 ( jk ) < rtt ) THEN - zvpice = real ( r2es * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4ies ) ) , kind = JPRB & - ) * rv / rd - zvpliq = zvpice * zfokoop ( jl ) - zicenuclei ( jl ) = 1000.0_jprb * exp ( 12.96_jprb * ( zvpliq - zvpice ) / zvpliq - 0.639_jprb ) - zice0 = max ( zicecld ( jl ) , zicenuclei ( jl ) * riceinit / zrho ( jl ) ) - ztcg = 1.0_jprb - zfacx1i = 1.0_jprb - zaplusb = rcl_apb1 * zvpice - rcl_apb2 * zvpice * ztp1 ( jk ) + pap ( jl , jk ) * rcl_apb3 * ztp1 ( jk ) ** ( 3.0_jprb ) - zcorrfac = sqrt ( 1.0_jprb / zrho ( jl ) ) - zcorrfac2 = ( ztp1 ( jk ) / 273.0_jprb ) ** ( 1.5_jprb ) * ( 393.0_jprb / ( ztp1 ( jk ) + 120.0_jprb ) ) - zpr02 = zrho ( jl ) * zice0 * rcl_const1i / ( ztcg * zfacx1i ) - zterm1 = ( zvpliq - zvpice ) * ztp1 ( jk ) ** ( 2.0_jprb ) * zvpice * zcorrfac2 * ztcg * rcl_const2i * zfacx1i / ( zrho (& - jl ) * zaplusb * zvpice ) - zterm2 = 0.65_jprb * rcl_const6i * zpr02 ** ( rcl_const4i ) + rcl_const3i * sqrt ( zcorrfac ) * sqrt ( zrho ( jl ) ) *& - zpr02 ** ( rcl_const5i ) / sqrt ( zcorrfac2 ) - zdepos = max ( za ( jk ) * zterm1 * zterm2 * ptsphy , 0.0_jprb ) - zdepos = min ( zdepos , zqxfg ( 1 ) ) - zinfactor = min ( zicenuclei ( jl ) / 15000.0_jprb , 1.0_jprb ) - zdepos = zdepos * min ( zinfactor + ( 1.0_jprb - zinfactor ) * ( rdepliqrefrate + zcldtopdist ( jl ) / rdepliqrefdepth ) ,& - 1.0_jprb ) - zsolqa ( 2 , 1 ) = zsolqa ( 2 , 1 ) + zdepos - zsolqa ( 1 , 2 ) = zsolqa ( 1 , 2 ) - zdepos - zqxfg ( 2 ) = zqxfg ( 2 ) + zdepos - zqxfg ( 1 ) = zqxfg ( 1 ) - zdepos - IF ( llcldbudl ) THEN - zbudl ( 11 ) = ( - zdepos * zqtmst ) - END IF - IF ( llcldbudi ) THEN - zbudi ( 11 ) = zdepos * zqtmst - END IF - END IF - END IF - END IF - ztmpa = 1.0_jprb * 1d0 / max ( za ( jk ) , zepsec ) - zliqcld ( jl ) = zqxfg ( 1 ) * ztmpa - zicecld ( jl ) = zqxfg ( 2 ) * ztmpa - zlicld ( jl ) = zliqcld ( jl ) + zicecld ( jl ) -!$acc loop seq - DO jm = 1 , 5 , 1 - IF ( llfall ( jm ) .OR. jm == 2 ) THEN - IF ( jk > ncldtop ) THEN - zfallsrce ( jm ) = zpfplsx ( jk , jm ) * zdtgdp ( jl ) - zsolqa ( jm , jm ) = zsolqa ( jm , jm ) + zfallsrce ( jm ) - zqxfg ( jm ) = zqxfg ( jm ) + zfallsrce ( jm ) - zqpretot ( jl ) = zqpretot ( jl ) + zqxfg ( jm ) - IF ( llcldbudi .AND. jm == 2 ) THEN - zbudi ( 12 ) = zfallsrce ( jm ) * zqtmst - END IF - END IF - IF ( laericesed .AND. jm == 2 ) THEN - zre_ice = pre_ice ( jl , jk ) - zvqx ( 2 ) = 0.002_jprb * zre_ice ** ( 1.0_jprb ) - END IF - zfall = zvqx ( jm ) * zrho ( jl ) - zfallsink ( jm ) = zdtgdp ( jl ) * zfall - END IF - END DO - IF ( zqpretot ( jl ) > zepsec ) THEN - zcovptot ( jl ) = 1.0_jprb - ( 1.0_jprb - zcovptot ( jl ) ) * ( 1.0_jprb - max ( za ( jk ) , za ( jk - 1 ) ) ) * 1d0 / (& - 1.0_jprb - min ( za ( jk - 1 ) , 1.0_jprb - 1.0e-6_jprb ) ) - zcovptot ( jl ) = max ( zcovptot ( jl ) , rcovpmin ) - zcovpclr ( jl ) = max ( 0.0_jprb , zcovptot ( jl ) - za ( jk ) ) - zraincld ( jl ) = zqxfg ( 3 ) / zcovptot ( jl ) - zsnowcld ( jl ) = zqxfg ( 4 ) / zcovptot ( jl ) - zcovpmax ( jl ) = max ( zcovptot ( jl ) , zcovpmax ( jl ) ) - ELSE - zraincld ( jl ) = 0.0_jprb - zsnowcld ( jl ) = 0.0_jprb - zcovptot ( jl ) = 0.0_jprb - zcovpclr ( jl ) = 0.0_jprb - zcovpmax ( jl ) = 0.0_jprb - END IF - IF ( ztp1 ( jk ) <= rtt ) THEN - IF ( zicecld ( jl ) > zepsec ) THEN - zzco = ptsphy * rsnowlin1 * exp ( rsnowlin2 * ( ztp1 ( jk ) - rtt ) ) - IF ( laericeauto ) THEN - zlcrit = picrit_aer ( jl , jk ) - zzco = zzco * ( rnice / pnice ( jl , jk ) ) ** ( 0.333_jprb ) - ELSE - zlcrit = rlcritsnow - END IF - zsnowaut ( jl ) = zzco * ( 1.0_jprb - exp ( ( - ( zicecld ( jl ) / zlcrit ) ** ( 2 ) ) ) ) - zsolqb ( 4 , 2 ) = zsolqb ( 4 , 2 ) + zsnowaut ( jl ) - END IF - END IF - IF ( zliqcld ( jl ) > zepsec ) THEN - IF ( iwarmrain == 1 ) THEN - zzco = rkconv * ptsphy - IF ( laerliqautolsp ) THEN - zlcrit = plcrit_aer ( jl , jk ) - zzco = zzco * ( rccn / pccn ( jl , jk ) ) ** ( 0.333_jprb ) - ELSE - IF ( plsm ( jl ) > 0.5_jprb ) THEN - zlcrit = rclcrit_land - ELSE - zlcrit = rclcrit_sea - END IF - END IF - zprecip = ( zpfplsx ( jk , 4 ) + zpfplsx ( jk , 3 ) ) * 1d0 / max ( zepsec , zcovptot ( jl ) ) - zcfpr = 1.0_jprb + rprc1 * sqrt ( max ( zprecip , 0.0_jprb ) ) - IF ( laerliqcoll ) THEN - zcfpr = zcfpr * ( rccn / pccn ( jl , jk ) ) ** ( 0.333_jprb ) - END IF - zzco = zzco * zcfpr - zlcrit = zlcrit * 1d0 / max ( zcfpr , zepsec ) - IF ( zliqcld ( jl ) / zlcrit < 20.0_jprb ) THEN - zrainaut ( jl ) = zzco * ( 1.0_jprb - exp ( ( - ( zliqcld ( jl ) / zlcrit ) ** ( 2 ) ) ) ) - ELSE - zrainaut ( jl ) = zzco - END IF - IF ( ztp1 ( jk ) <= rtt ) THEN - zsolqb ( 4 , 1 ) = zsolqb ( 4 , 1 ) + zrainaut ( jl ) - ELSE - zsolqb ( 3 , 1 ) = zsolqb ( 3 , 1 ) + zrainaut ( jl ) - END IF - ELSE - IF ( iwarmrain == 2 ) THEN - IF ( plsm ( jl ) > 0.5_jprb ) THEN - zconst = rcl_kk_cloud_num_land - zlcrit = rclcrit_land - ELSE - zconst = rcl_kk_cloud_num_sea - zlcrit = rclcrit_sea - END IF - IF ( zliqcld ( jl ) > zlcrit ) THEN - zrainaut ( jl ) = 1.5_jprb * za ( jk ) * ptsphy * rcl_kkaau * zliqcld ( jl ) ** ( rcl_kkbauq ) * zconst ** ( rcl_kkbaun ) - zrainaut ( jl ) = min ( zrainaut ( jl ) , zqxfg ( 1 ) ) - IF ( zrainaut ( jl ) < zepsec ) THEN - zrainaut ( jl ) = 0.0_jprb - END IF - zrainacc ( jl ) = 2.0_jprb * za ( jk ) * ptsphy * rcl_kkaac * ( zliqcld ( jl ) * zraincld ( jl ) ) ** ( rcl_kkbac ) - zrainacc ( jl ) = min ( zrainacc ( jl ) , zqxfg ( 1 ) ) - IF ( zrainacc ( jl ) < zepsec ) THEN - zrainacc ( jl ) = 0.0_jprb - END IF - ELSE - zrainaut ( jl ) = 0.0_jprb - zrainacc ( jl ) = 0.0_jprb - END IF - IF ( ztp1 ( jk ) <= rtt ) THEN - zsolqa ( 4 , 1 ) = zsolqa ( 4 , 1 ) + zrainaut ( jl ) - zsolqa ( 4 , 1 ) = zsolqa ( 4 , 1 ) + zrainacc ( jl ) - zsolqa ( 1 , 4 ) = zsolqa ( 1 , 4 ) - zrainaut ( jl ) - zsolqa ( 1 , 4 ) = zsolqa ( 1 , 4 ) - zrainacc ( jl ) - ELSE - zsolqa ( 3 , 1 ) = zsolqa ( 3 , 1 ) + zrainaut ( jl ) - zsolqa ( 3 , 1 ) = zsolqa ( 3 , 1 ) + zrainacc ( jl ) - zsolqa ( 1 , 3 ) = zsolqa ( 1 , 3 ) - zrainaut ( jl ) - zsolqa ( 1 , 3 ) = zsolqa ( 1 , 3 ) - zrainacc ( jl ) - END IF - END IF - END IF - END IF - IF ( iwarmrain > 1 ) THEN - IF ( ztp1 ( jk ) <= rtt .AND. zliqcld ( jl ) > zepsec ) THEN - zfallcorr = ( rdensref / zrho ( jl ) ) ** ( 0.4_jprb ) - IF ( zcovptot ( jl ) > 0.01_jprb .AND. zsnowcld ( jl ) > zepsec ) THEN - zsnowrime ( jl ) = 0.3_jprb * zcovptot ( jl ) * ptsphy * rcl_const7s * zfallcorr * ( zrho ( jl ) * zsnowcld ( jl ) *& - rcl_const1s ) ** ( rcl_const8s ) - zsnowrime ( jl ) = min ( zsnowrime ( jl ) , 1.0_jprb ) - zsolqb ( 4 , 1 ) = zsolqb ( 4 , 1 ) + zsnowrime ( jl ) - END IF - END IF - END IF - zicetot ( jl ) = zqxfg ( 2 ) + zqxfg ( 4 ) - zmeltmax ( jl ) = 0.0_jprb - IF ( zicetot ( jl ) > zepsec .AND. ztp1 ( jk ) > rtt ) THEN - zsubsat = max ( zqsice ( jk ) - zqx ( jk , 5 ) , 0.0_jprb ) - ztdmtw0 = ztp1 ( jk ) - rtt - zsubsat * ( ztw1 + ztw2 * ( pap ( jl , jk ) - ztw3 ) - ztw4 * ( ztp1 ( jk ) - ztw5 ) ) - zcons1 = abs ( ptsphy * ( 1.0_jprb + 0.5_jprb * ztdmtw0 ) / rtaumel ) - zmeltmax ( jl ) = max ( ztdmtw0 * zcons1 * zrldcp , 0.0_jprb ) - END IF -!$acc loop seq - DO jm = 1 , 5 , 1 - IF ( iphase ( jm ) == 2 ) THEN - jn = imelt ( jm ) - IF ( zicetot ( jl ) > zepsec .AND. zmeltmax ( jl ) > zepsec ) THEN - zalfa = zqxfg ( jm ) / zicetot ( jl ) - zmelt = min ( zqxfg ( jm ) , zalfa * zmeltmax ( jl ) ) - zqxfg ( jm ) = zqxfg ( jm ) - zmelt - zqxfg ( jn ) = zqxfg ( jn ) + zmelt - zsolqa ( jn , jm ) = zsolqa ( jn , jm ) + zmelt - zsolqa ( jm , jn ) = zsolqa ( jm , jn ) - zmelt - IF ( llcldbudi .AND. jm == 2 ) THEN - zbudi ( 15 ) = ( - zmelt * zqtmst ) - END IF - IF ( llcldbudi .AND. jm == 4 ) THEN - zbudi ( 16 ) = ( - zmelt * zqtmst ) - END IF - IF ( llcldbudl .AND. jm == 2 ) THEN - zbudl ( 17 ) = zmelt * zqtmst - END IF - END IF - END IF - END DO - IF ( zqx ( jk , 3 ) > zepsec ) THEN - IF ( ztp1 ( jk ) <= rtt .AND. ztp1 ( jk - 1 ) > rtt ) THEN - zqpretot ( jl ) = max ( zqx ( jk , 4 ) + zqx ( jk , 3 ) , zepsec ) - prainfrac_toprfz ( jl ) = zqx ( jk , 3 ) / zqpretot ( jl ) - END IF - IF ( ztp1 ( jk ) < rtt ) THEN - IF ( prainfrac_toprfz ( jl ) > 0.8 ) THEN - zlambda = ( rcl_fac1 / ( zrho ( jl ) * zqx ( jk , 3 ) ) ) ** ( rcl_fac2 ) - ztemp = rcl_fzrab * ( ztp1 ( jk ) - rtt ) - zfrz = ptsphy * ( rcl_const5r / zrho ( jl ) ) * ( exp ( ztemp ) - 1.0_jprb ) * zlambda ** ( rcl_const6r ) - zfrzmax ( jl ) = max ( zfrz , 0.0_jprb ) - ELSE - zcons1 = abs ( ptsphy * ( 1.0_jprb + 0.5_jprb * ( rtt - ztp1 ( jk ) ) ) / rtaumel ) - zfrzmax ( jl ) = max ( ( rtt - ztp1 ( jk ) ) * zcons1 * zrldcp , 0.0_jprb ) - END IF - IF ( zfrzmax ( jl ) > zepsec ) THEN - zfrz = min ( zqx ( jk , 3 ) , zfrzmax ( jl ) ) - zsolqa ( 4 , 3 ) = zsolqa ( 4 , 3 ) + zfrz - zsolqa ( 3 , 4 ) = zsolqa ( 3 , 4 ) - zfrz - IF ( llcldbudl ) THEN - zbudl ( 18 ) = zfrz * zqtmst - END IF - END IF - END IF - END IF - zfrzmax ( jl ) = max ( ( rthomo - ztp1 ( jk ) ) * zrldcp , 0.0_jprb ) - jm = 1 - jn = imelt ( jm ) - IF ( zfrzmax ( jl ) > zepsec .AND. zqxfg ( jm ) > zepsec ) THEN - zfrz = min ( zqxfg ( jm ) , zfrzmax ( jl ) ) - zsolqa ( jn , jm ) = zsolqa ( jn , jm ) + zfrz - zsolqa ( jm , jn ) = zsolqa ( jm , jn ) - zfrz - IF ( llcldbudl ) THEN - zbudl ( 19 ) = zfrz * zqtmst - END IF - END IF - IF ( ievaprain == 1 ) THEN - zzrh = rprecrhmax + ( 1.0_jprb - rprecrhmax ) * zcovpmax ( jl ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zzrh = min ( max ( zzrh , rprecrhmax ) , 1.0_jprb ) - zqe = ( zqx ( jk , 5 ) - za ( jk ) * zqsliq ( jk ) ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zqe = max ( 0.0_jprb , min ( zqe , zqsliq ( jk ) ) ) - llo1 = zcovpclr ( jl ) > zepsec .AND. zqxfg ( 3 ) > zepsec .AND. zqe < zzrh * zqsliq ( jk ) - IF ( llo1 ) THEN - zpreclr = zqxfg ( 3 ) * zcovpclr ( jl ) * 1d0 / sign ( max ( abs ( zcovptot ( jl ) * zdtgdp ( jl ) ) , zepsilon ) ,& - zcovptot ( jl ) * zdtgdp ( jl ) ) - zbeta1 = sqrt ( pap ( jl , jk ) / paph ( jl , klev + 1 ) ) / rvrfactor * zpreclr * 1d0 / max ( zcovpclr ( jl ) , zepsec ) - zbeta = rg * rpecons * 0.5_jprb * zbeta1 ** ( 0.5777_jprb ) - zdenom = 1.0_jprb + zbeta * ptsphy * zcorqsliq ( jl ) - zdpr = zcovpclr ( jl ) * zbeta * ( zqsliq ( jk ) - zqe ) / zdenom * zdp ( jl ) * zrg_r - zdpevap = zdpr * zdtgdp ( jl ) - zevap = min ( zdpevap , zqxfg ( 3 ) ) - zsolqa ( 5 , 3 ) = zsolqa ( 5 , 3 ) + zevap - zsolqa ( 3 , 5 ) = zsolqa ( 3 , 5 ) - zevap - zcovptot ( jl ) = max ( rcovpmin , zcovptot ( jl ) - max ( 0.0_jprb , ( zcovptot ( jl ) - za ( jk ) ) * zevap / zqxfg ( 3 )& - ) ) - zqxfg ( 3 ) = zqxfg ( 3 ) - zevap - END IF - ELSE - IF ( ievaprain == 2 ) THEN - zzrh = rprecrhmax + ( 1.0_jprb - rprecrhmax ) * zcovpmax ( jl ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zzrh = min ( max ( zzrh , rprecrhmax ) , 1.0_jprb ) - zzrh = min ( 0.8_jprb , zzrh ) - zqe = max ( 0.0_jprb , min ( zqx ( jk , 5 ) , zqsliq ( jk ) ) ) - llo1 = zcovpclr ( jl ) > zepsec .AND. zqxfg ( 3 ) > zepsec .AND. zqe < zzrh * zqsliq ( jk ) - IF ( llo1 ) THEN - zpreclr = zqxfg ( 3 ) / zcovptot ( jl ) - zfallcorr = ( rdensref / zrho ( jl ) ) ** ( 0.4_jprb ) - zesatliq = rv / rd * real ( r2es * exp ( r3les * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4les ) ) , kind =& - JPRB ) - zlambda = ( rcl_fac1 / ( zrho ( jl ) * zpreclr ) ) ** ( rcl_fac2 ) - zevap_denom = rcl_cdenom1 * zesatliq - rcl_cdenom2 * ztp1 ( jk ) * zesatliq + rcl_cdenom3 * ztp1 ( jk ) ** ( 3.0_jprb ) *& - pap ( jl , jk ) - zcorr2 = ( ztp1 ( jk ) / 273.0_jprb ) ** ( 1.5_jprb ) * 393.0_jprb / ( ztp1 ( jk ) + 120.0_jprb ) - zka = rcl_ka273 * zcorr2 - zsubsat = max ( zzrh * zqsliq ( jk ) - zqe , 0.0_jprb ) - zbeta = 0.5_jprb / zqsliq ( jk ) * ztp1 ( jk ) ** ( 2.0_jprb ) * zesatliq * rcl_const1r * ( zcorr2 / zevap_denom ) * (& - 0.78_jprb / zlambda ** ( rcl_const4r ) + rcl_const2r * sqrt ( zrho ( jl ) * zfallcorr ) / ( sqrt ( zcorr2 ) * zlambda **& - ( rcl_const3r ) ) ) - zdenom = 1.0_jprb + zbeta * ptsphy - zdpevap = zcovpclr ( jl ) * zbeta * ptsphy * zsubsat / zdenom - zevap = min ( zdpevap , zqxfg ( 3 ) ) - zsolqa ( 5 , 3 ) = zsolqa ( 5 , 3 ) + zevap - zsolqa ( 3 , 5 ) = zsolqa ( 3 , 5 ) - zevap - zcovptot ( jl ) = max ( rcovpmin , zcovptot ( jl ) - max ( 0.0_jprb , ( zcovptot ( jl ) - za ( jk ) ) * zevap / zqxfg ( 3& - ) ) ) - zqxfg ( 3 ) = zqxfg ( 3 ) - zevap - END IF - END IF - END IF - IF ( ievapsnow == 1 ) THEN - zzrh = rprecrhmax + ( 1.0_jprb - rprecrhmax ) * zcovpmax ( jl ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zzrh = min ( max ( zzrh , rprecrhmax ) , 1.0_jprb ) - zqe = ( zqx ( jk , 5 ) - za ( jk ) * zqsice ( jk ) ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zqe = max ( 0.0_jprb , min ( zqe , zqsice ( jk ) ) ) - llo1 = zcovpclr ( jl ) > zepsec .AND. zqxfg ( 4 ) > zepsec .AND. zqe < zzrh * zqsice ( jk ) - IF ( llo1 ) THEN - zpreclr = zqxfg ( 4 ) * zcovpclr ( jl ) * 1d0 / sign ( max ( abs ( zcovptot ( jl ) * zdtgdp ( jl ) ) , zepsilon ) ,& - zcovptot ( jl ) * zdtgdp ( jl ) ) - zbeta1 = sqrt ( pap ( jl , jk ) / paph ( jl , klev + 1 ) ) / rvrfactor * zpreclr * 1d0 / max ( zcovpclr ( jl ) , zepsec ) - zbeta = rg * rpecons * zbeta1 ** ( 0.5777_jprb ) - zdenom = 1.0_jprb + zbeta * ptsphy * zcorqsice ( jl ) - zdpr = zcovpclr ( jl ) * zbeta * ( zqsice ( jk ) - zqe ) / zdenom * zdp ( jl ) * zrg_r - zdpevap = zdpr * zdtgdp ( jl ) - zevap = min ( zdpevap , zqxfg ( 4 ) ) - zsolqa ( 5 , 4 ) = zsolqa ( 5 , 4 ) + zevap - zsolqa ( 4 , 5 ) = zsolqa ( 4 , 5 ) - zevap - zcovptot ( jl ) = max ( rcovpmin , zcovptot ( jl ) - max ( 0.0_jprb , ( zcovptot ( jl ) - za ( jk ) ) * zevap / zqxfg ( 4 )& - ) ) - zqxfg ( 4 ) = zqxfg ( 4 ) - zevap - END IF - ELSE - IF ( ievapsnow == 2 ) THEN - zzrh = rprecrhmax + ( 1.0_jprb - rprecrhmax ) * zcovpmax ( jl ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zzrh = min ( max ( zzrh , rprecrhmax ) , 1.0_jprb ) - zqe = ( zqx ( jk , 5 ) - za ( jk ) * zqsice ( jk ) ) * 1d0 / max ( zepsec , 1.0_jprb - za ( jk ) ) - zqe = max ( 0.0_jprb , min ( zqe , zqsice ( jk ) ) ) - llo1 = zcovpclr ( jl ) > zepsec .AND. zqx ( jk , 4 ) > zepsec .AND. zqe < zzrh * zqsice ( jk ) - IF ( llo1 ) THEN - zpreclr = zqx ( jk , 4 ) / zcovptot ( jl ) - zvpice = real ( r2es * exp ( r3ies * ( ztp1 ( jk ) - rtt ) / ( ztp1 ( jk ) - r4ies ) ) , kind = JPRB & - ) * rv / rd - ztcg = 1.0_jprb - zfacx1s = 1.0_jprb - zaplusb = rcl_apb1 * zvpice - rcl_apb2 * zvpice * ztp1 ( jk ) + pap ( jl , jk ) * rcl_apb3 * ztp1 ( jk ) ** ( 3 ) - zcorrfac = sqrt ( 1.0_jprb / zrho ( jl ) ) - zcorrfac2 = ( ztp1 ( jk ) / 273.0_jprb ) ** ( 1.5_jprb ) * ( 393.0_jprb / ( ztp1 ( jk ) + 120.0_jprb ) ) - zpr02 = zrho ( jl ) * zpreclr * rcl_const1s / ( ztcg * zfacx1s ) - zterm1 = ( zqsice ( jk ) - zqe ) * ztp1 ( jk ) ** ( 2 ) * zvpice * zcorrfac2 * ztcg * rcl_const2s * zfacx1s / ( zrho ( jl& - ) * zaplusb * zqsice ( jk ) ) - zterm2 = 0.65 * rcl_const6s * zpr02 ** ( rcl_const4s ) + rcl_const3s * sqrt ( zcorrfac ) * sqrt ( zrho ( jl ) ) * zpr02 **& - ( rcl_const5s ) / sqrt ( zcorrfac2 ) - zdpevap = max ( zcovpclr ( jl ) * zterm1 * zterm2 * ptsphy , 0.0_jprb ) - zevap = min ( zdpevap , zevaplimice ( jl ) ) - zevap = min ( zevap , zqx ( jk , 4 ) ) - zsolqa ( 5 , 4 ) = zsolqa ( 5 , 4 ) + zevap - zsolqa ( 4 , 5 ) = zsolqa ( 4 , 5 ) - zevap - zcovptot ( jl ) = max ( rcovpmin , zcovptot ( jl ) - max ( 0.0_jprb , ( zcovptot ( jl ) - za ( jk ) ) * zevap / zqx ( jk ,& - 4 ) ) ) - zqxfg ( 4 ) = zqxfg ( 4 ) - zevap - END IF - END IF - END IF -!$acc loop seq - DO jm = 1 , 5 , 1 - IF ( llfall ( jm ) ) THEN - IF ( zqxfg ( jm ) < rlmin ) THEN - zsolqa ( 5 , jm ) = zsolqa ( 5 , jm ) + zqxfg ( jm ) - zsolqa ( jm , 5 ) = zsolqa ( jm , 5 ) - zqxfg ( jm ) - END IF - END IF - END DO - zanew = ( za ( jk ) + zsolac ( jl ) ) / ( 1.0_jprb + zsolab ( jl ) ) - zanew = min ( zanew , 1.0_jprb ) - IF ( zanew < ramin ) THEN - zanew = 0.0_jprb - END IF - zda ( jl ) = zanew - zaorig ( jk ) - zanewm1 ( jl ) = zanew -!$acc loop seq - DO jm = 1 , 5 , 1 - DO jn = 1 , 5 , 1 - llindex3 ( jn , jm ) = .FALSE. - END DO - zsinksum ( jm ) = 0.0_jprb - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 -!$acc loop seq - DO jn = 1 , 5 , 1 - zsinksum ( jm ) = zsinksum ( jm ) - zsolqa ( jm , jn ) - END DO - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - zmax = max ( zqx ( jk , jm ) , zepsec ) - zrat = max ( zsinksum ( jm ) , zmax ) - zratio ( jm ) = zmax / zrat - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - zsinksum ( jm ) = 0.0_jprb - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - psum_solqa ( jl ) = 0.0 -!$acc loop seq - DO jn = 1 , 5 , 1 - psum_solqa ( jl ) = psum_solqa ( jl ) + zsolqa ( jm , jn ) - END DO - zsinksum ( jm ) = zsinksum ( jm ) - psum_solqa ( jl ) - zmm = max ( zqx ( jk , jm ) , zepsec ) - zrr = max ( zsinksum ( jm ) , zmm ) - zratio ( jm ) = zmm / zrr - zzratio = zratio ( jm ) -!$acc loop seq - DO jn = 1 , 5 , 1 - IF ( zsolqa ( jm , jn ) < 0.0_jprb ) THEN - zsolqa ( jm , jn ) = zsolqa ( jm , jn ) * zzratio - zsolqa ( jn , jm ) = zsolqa ( jn , jm ) * zzratio - END IF - END DO - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 -!$acc loop seq - DO jn = 1 , 5 , 1 - IF ( jn == jm ) THEN - zqlhs ( jn , jm ) = 1.0_jprb + zfallsink ( jm ) -!$acc loop seq - DO jo = 1 , 5 , 1 - zqlhs ( jn , jm ) = zqlhs ( jn , jm ) + zsolqb ( jo , jn ) - END DO - ELSE - zqlhs ( jn , jm ) = ( - zsolqb ( jn , jm ) ) - END IF - END DO - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - zexplicit = 0.0_jprb -!$acc loop seq - DO jn = 1 , 5 , 1 - zexplicit = zexplicit + zsolqa ( jm , jn ) - END DO - zqxn ( jm ) = zqx ( jk , jm ) + zexplicit - END DO -!$acc loop seq - DO jn = 1 , 4 , 1 -!$acc loop seq - DO jm = jn + 1 , 5 , 1 - zqlhs ( jm , jn ) = zqlhs ( jm , jn ) / zqlhs ( jn , jn ) -!$acc loop seq - DO ik = jn + 1 , 5 , 1 - zqlhs ( jm , ik ) = zqlhs ( jm , ik ) - zqlhs ( jm , jn ) * zqlhs ( jn , ik ) - END DO - END DO - END DO -!$acc loop seq - DO jn = 2 , 5 , 1 -!$acc loop seq - DO jm = 1 , jn - 1 , 1 - zqxn ( jn ) = zqxn ( jn ) - zqlhs ( jn , jm ) * zqxn ( jm ) - END DO - END DO - zqxn ( 5 ) = zqxn ( 5 ) / zqlhs ( 5 , 5 ) -!$acc loop seq - DO jn = 4 , 1 , (-1) -!$acc loop seq - DO jm = jn + 1 , 5 , 1 - zqxn ( jn ) = zqxn ( jn ) - zqlhs ( jn , jm ) * zqxn ( jm ) - END DO - zqxn ( jn ) = zqxn ( jn ) / zqlhs ( jn , jn ) - END DO -!$acc loop seq - DO jn = 1 , 4 , 1 - IF ( zqxn ( jn ) < zepsec ) THEN - zqxn ( 5 ) = zqxn ( 5 ) + zqxn ( jn ) - zqxn ( jn ) = 0.0_jprb - END IF - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - zqxnm1 ( jm ) = zqxn ( jm ) - zqxn2d ( jk , jm ) = zqxn ( jm ) - END DO -!$acc loop seq - DO jm = 1 , 5 , 1 - zpfplsx ( jk + 1 , jm ) = zfallsink ( jm ) * zqxn ( jm ) * zrdtgdp ( jl ) - END DO - zqpretot ( jl ) = zpfplsx ( jk + 1 , 4 ) + zpfplsx ( jk + 1 , 3 ) - IF ( zqpretot ( jl ) < zepsec ) THEN - zcovptot ( jl ) = 0.0_jprb - END IF -!$acc loop seq - DO jm = 1 , 4 , 1 - zfluxq ( jm ) = zpsupsatsrce ( jm ) + zconvsrce ( jm ) + zfallsrce ( jm ) - ( zfallsink ( jm ) + zconvsink ( jm ) ) * zqxn (& - jm ) - IF ( iphase ( jm ) == 1 ) THEN - tendency_loc_t ( jl , jk ) = tendency_loc_t ( jl , jk ) + ralvdcp * ( zqxn ( jm ) - zqx ( jk , jm ) - zfluxq ( jm ) ) *& - zqtmst - END IF - IF ( iphase ( jm ) == 2 ) THEN - tendency_loc_t ( jl , jk ) = tendency_loc_t ( jl , jk ) + ralsdcp * ( zqxn ( jm ) - zqx ( jk , jm ) - zfluxq ( jm ) ) *& - zqtmst - END IF - tendency_loc_cld ( jl , jk , jm ) = tendency_loc_cld ( jl , jk , jm ) + ( zqxn ( jm ) - zqx0 ( jk , jm ) ) * zqtmst - END DO - tendency_loc_q ( jl , jk ) = tendency_loc_q ( jl , jk ) + ( zqxn ( 5 ) - zqx ( jk , 5 ) ) * zqtmst - tendency_loc_a ( jl , jk ) = tendency_loc_a ( jl , jk ) + zda ( jl ) * zqtmst - pcovptot ( jl , jk ) = zcovptot ( jl ) - END DO -!$acc loop seq - DO jk = 1 , klev + 1 , 1 - pfplsl ( jl , jk ) = zpfplsx ( jk , 3 ) + zpfplsx ( jk , 1 ) - pfplsn ( jl , jk ) = zpfplsx ( jk , 4 ) + zpfplsx ( jk , 2 ) - END DO - pfsqlf ( jl , 1 ) = 0.0_jprb - pfsqif ( jl , 1 ) = 0.0_jprb - pfsqrf ( jl , 1 ) = 0.0_jprb - pfsqsf ( jl , 1 ) = 0.0_jprb - pfcqlng ( jl , 1 ) = 0.0_jprb - pfcqnng ( jl , 1 ) = 0.0_jprb - pfcqrng ( jl , 1 ) = 0.0_jprb - pfcqsng ( jl , 1 ) = 0.0_jprb - pfsqltur ( jl , 1 ) = 0.0_jprb - pfsqitur ( jl , 1 ) = 0.0_jprb -!$acc loop seq - DO jk = 1 , klev , 1 - zgdph_r = ( - zrg_r * ( paph ( jl , jk + 1 ) - paph ( jl , jk ) ) * zqtmst ) - pfsqlf ( jl , jk + 1 ) = pfsqlf ( jl , jk ) - pfsqif ( jl , jk + 1 ) = pfsqif ( jl , jk ) - pfsqrf ( jl , jk + 1 ) = pfsqlf ( jl , jk ) - pfsqsf ( jl , jk + 1 ) = pfsqif ( jl , jk ) - pfcqlng ( jl , jk + 1 ) = pfcqlng ( jl , jk ) - pfcqnng ( jl , jk + 1 ) = pfcqnng ( jl , jk ) - pfcqrng ( jl , jk + 1 ) = pfcqlng ( jl , jk ) - pfcqsng ( jl , jk + 1 ) = pfcqnng ( jl , jk ) - pfsqltur ( jl , jk + 1 ) = pfsqltur ( jl , jk ) - pfsqitur ( jl , jk + 1 ) = pfsqitur ( jl , jk ) - zalfaw = zfoealfa ( jk ) - pfsqlf ( jl , jk + 1 ) = pfsqlf ( jl , jk + 1 ) + ( zqxn2d ( jk , 1 ) - zqx0 ( jk , 1 ) + pvfl ( jl , jk ) * ptsphy - zalfaw& - * plude ( jl , jk ) ) * zgdph_r - pfcqlng ( jl , jk + 1 ) = pfcqlng ( jl , jk + 1 ) + zlneg ( jk , 1 ) * zgdph_r - pfsqltur ( jl , jk + 1 ) = pfsqltur ( jl , jk + 1 ) + pvfl ( jl , jk ) * ptsphy * zgdph_r - pfsqrf ( jl , jk + 1 ) = pfsqrf ( jl , jk + 1 ) + ( zqxn2d ( jk , 3 ) - zqx0 ( jk , 3 ) ) * zgdph_r - pfcqrng ( jl , jk + 1 ) = pfcqrng ( jl , jk + 1 ) + zlneg ( jk , 3 ) * zgdph_r - pfsqif ( jl , jk + 1 ) = pfsqif ( jl , jk + 1 ) + ( zqxn2d ( jk , 2 ) - zqx0 ( jk , 2 ) + pvfi ( jl , jk ) * ptsphy - (& - 1.0_jprb - zalfaw ) * plude ( jl , jk ) ) * zgdph_r - pfcqnng ( jl , jk + 1 ) = pfcqnng ( jl , jk + 1 ) + zlneg ( jk , 2 ) * zgdph_r - pfsqitur ( jl , jk + 1 ) = pfsqitur ( jl , jk + 1 ) + pvfi ( jl , jk ) * ptsphy * zgdph_r - pfsqsf ( jl , jk + 1 ) = pfsqsf ( jl , jk + 1 ) + ( zqxn2d ( jk , 4 ) - zqx0 ( jk , 4 ) ) * zgdph_r - pfcqsng ( jl , jk + 1 ) = pfcqsng ( jl , jk + 1 ) + zlneg ( jk , 4 ) * zgdph_r - END DO -!$acc loop seq - DO jk = 1 , klev + 1 , 1 - pfhpsl ( jl , jk ) = ( - rlvtt * pfplsl ( jl , jk ) ) - pfhpsn ( jl , jk ) = ( - rlstt * pfplsn ( jl , jk ) ) - END DO - END ASSOCIATE - END DO - - end do - -!$acc end parallel -!$acc end data - - END SUBROUTINE cloudsc_claw - -END MODULE cloudsc_claw_mod - diff --git a/src/cloudsc_gpu/cloudsc_driver_gpu_claw_mod.F90 b/src/cloudsc_gpu/cloudsc_driver_gpu_claw_mod.F90 deleted file mode 100644 index 1d030815..00000000 --- a/src/cloudsc_gpu/cloudsc_driver_gpu_claw_mod.F90 +++ /dev/null @@ -1,184 +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 CLOUDSC_DRIVER_GPU_CLAW_MOD - - USE PARKIND1, ONLY: JPIM, JPRB - USE YOMPHYDER, ONLY: STATE_TYPE - USE YOECLDP, ONLY : NCLV, YRECLDP - USE CLOUDSC_MPI_MOD, ONLY: NUMPROC, IRANK - USE TIMER_MOD, ONLY : PERFORMANCE_TIMER, GET_THREAD_NUM - - USE CLOUDSC_CLAW_MOD, ONLY: CLOUDSC_CLAW - - IMPLICIT NONE - -CONTAINS - - SUBROUTINE CLOUDSC_DRIVER_GPU_CLAW( & - & NUMOMP, NPROMA, NLEV, NGPTOT, NGPTOTG, KFLDX, PTSPHY, & - & PT, PQ, TENDENCY_CML, TENDENCY_TMP, TENDENCY_LOC, & - & BUFFER_CML, BUFFER_TMP, BUFFER_LOC, & - & PVFA, PVFL, PVFI, PDYNA, PDYNL, PDYNI, & - & PHRSW, PHRLW, & - & PVERVEL, PAP, PAPH, & - & PLSM, LDCUM, KTYPE, & - & PLU, PLUDE, PSNDE, PMFU, PMFD, & - & LDSLPHY, LDMAINCALL, PA, & - & PCLV, PSUPSAT,& - & PLCRIT_AER,PICRIT_AER, PRE_ICE, & - & PCCN, PNICE,& - & PCOVPTOT, PRAINFRAC_TOPRFZ, & - & PFSQLF, PFSQIF , PFCQNNG, PFCQLNG, & - & PFSQRF, PFSQSF , PFCQRNG, PFCQSNG, & - & PFSQLTUR, PFSQITUR, & - & PFPLSL, PFPLSN, PFHPSL, PFHPSN, & - & PEXTRA ) - ! Driver routine that invokes the optimized CLAW-based CLOUDSC GPU kernel - - INTEGER(KIND=JPIM) :: NUMOMP, NPROMA, NLEV, NGPTOT, NGPTOTG - INTEGER(KIND=JPIM) :: KFLDX - REAL(KIND=JPRB) :: PTSPHY ! Physics timestep - REAL(KIND=JPRB), INTENT(IN) :: PT(:,:,:) ! T at start of callpar - REAL(KIND=JPRB), INTENT(IN) :: PQ(:,:,:) ! Q at start of callpar - TYPE(STATE_TYPE), INTENT(IN) :: TENDENCY_CML(:) ! cumulative tendency used for final output - TYPE(STATE_TYPE), INTENT(IN) :: TENDENCY_TMP(:) ! cumulative tendency used as input - TYPE(STATE_TYPE), INTENT(OUT) :: TENDENCY_LOC(:) ! local tendency from cloud scheme - REAL(KIND=JPRB), INTENT(INOUT) :: BUFFER_CML(:,:,:,:) ! Storage buffer for TENDENCY_CML - REAL(KIND=JPRB), INTENT(INOUT) :: BUFFER_TMP(:,:,:,:) ! Storage buffer for TENDENCY_TMP - REAL(KIND=JPRB), INTENT(INOUT) :: BUFFER_LOC(:,:,:,:) ! Storage buffer for TENDENCY_LOC - REAL(KIND=JPRB), INTENT(IN) :: PVFA(:,:,:) ! CC from VDF scheme - REAL(KIND=JPRB), INTENT(IN) :: PVFL(:,:,:) ! Liq from VDF scheme - REAL(KIND=JPRB), INTENT(IN) :: PVFI(:,:,:) ! Ice from VDF scheme - REAL(KIND=JPRB), INTENT(IN) :: PDYNA(:,:,:) ! CC from Dynamics - REAL(KIND=JPRB), INTENT(IN) :: PDYNL(:,:,:) ! Liq from Dynamics - REAL(KIND=JPRB), INTENT(IN) :: PDYNI(:,:,:) ! Liq from Dynamics - REAL(KIND=JPRB), INTENT(IN) :: PHRSW(:,:,:) ! Short-wave heating rate - REAL(KIND=JPRB), INTENT(IN) :: PHRLW(:,:,:) ! Long-wave heating rate - REAL(KIND=JPRB), INTENT(IN) :: PVERVEL(:,:,:) !Vertical velocity - REAL(KIND=JPRB), INTENT(IN) :: PAP(:,:,:) ! Pressure on full levels - REAL(KIND=JPRB), INTENT(IN) :: PAPH(:,:,:) ! Pressure on half levels - REAL(KIND=JPRB), INTENT(IN) :: PLSM(:,:) ! Land fraction (0-1) - LOGICAL , INTENT(IN) :: LDCUM(:,:) ! Convection active - INTEGER(KIND=JPIM), INTENT(IN) :: KTYPE(:,:) ! Convection type 0,1,2 - REAL(KIND=JPRB), INTENT(IN) :: PLU(:,:,:) ! Conv. condensate - REAL(KIND=JPRB), INTENT(INOUT) :: PLUDE(:,:,:) ! Conv. detrained water - REAL(KIND=JPRB), INTENT(IN) :: PSNDE(:,:,:) ! Conv. detrained snow - REAL(KIND=JPRB), INTENT(IN) :: PMFU(:,:,:) ! Conv. mass flux up - REAL(KIND=JPRB), INTENT(IN) :: PMFD(:,:,:) ! Conv. mass flux down - LOGICAL :: LDSLPHY - LOGICAL :: LDMAINCALL ! T if main call to cloudsc - REAL(KIND=JPRB), INTENT(IN) :: PA(:,:,:) ! Original Cloud fraction (t) - REAL(KIND=JPRB), INTENT(INOUT) :: PEXTRA(:,:,:,:) ! extra fields - REAL(KIND=JPRB), INTENT(IN) :: PCLV(:,:,:,:) - REAL(KIND=JPRB), INTENT(IN) :: PSUPSAT(:,:,:) - REAL(KIND=JPRB), INTENT(IN) :: PLCRIT_AER(:,:,:) - REAL(KIND=JPRB), INTENT(IN) :: PICRIT_AER(:,:,:) - REAL(KIND=JPRB), INTENT(IN) :: PRE_ICE(:,:,:) - REAL(KIND=JPRB), INTENT(IN) :: PCCN(:,:,:) ! liquid cloud condensation nuclei - REAL(KIND=JPRB), INTENT(IN) :: PNICE(:,:,:) ! ice number concentration (cf. CCN) - - REAL(KIND=JPRB), INTENT(OUT) :: PCOVPTOT(:,:,:) ! Precip fraction - REAL(KIND=JPRB), INTENT(OUT) :: PRAINFRAC_TOPRFZ(:,:) - ! Flux diagnostics for DDH budget - REAL(KIND=JPRB), INTENT(OUT) :: PFSQLF(:,:,:) ! Flux of liquid - REAL(KIND=JPRB), INTENT(OUT) :: PFSQIF(:,:,:) ! Flux of ice - REAL(KIND=JPRB), INTENT(OUT) :: PFCQLNG(:,:,:) ! -ve corr for liq - REAL(KIND=JPRB), INTENT(OUT) :: PFCQNNG(:,:,:) ! -ve corr for ice - REAL(KIND=JPRB), INTENT(OUT) :: PFSQRF(:,:,:) ! Flux diagnostics - REAL(KIND=JPRB), INTENT(OUT) :: PFSQSF(:,:,:) ! for DDH, generic - REAL(KIND=JPRB), INTENT(OUT) :: PFCQRNG(:,:,:) ! rain - REAL(KIND=JPRB), INTENT(OUT) :: PFCQSNG(:,:,:) ! snow - REAL(KIND=JPRB), INTENT(OUT) :: PFSQLTUR(:,:,:) ! liquid flux due to VDF - REAL(KIND=JPRB), INTENT(OUT) :: PFSQITUR(:,:,:) ! ice flux due to VDF - REAL(KIND=JPRB), INTENT(OUT) :: PFPLSL(:,:,:) ! liq+rain sedim flux - REAL(KIND=JPRB), INTENT(OUT) :: PFPLSN(:,:,:) ! ice+snow sedim flux - REAL(KIND=JPRB), INTENT(OUT) :: PFHPSL(:,:,:) ! Enthalpy flux for liq - REAL(KIND=JPRB), INTENT(OUT) :: PFHPSN(:,:,:) ! Enthalp flux for ice - - INTEGER(KIND=JPIM) :: JKGLO,IBL,ICEND,NGPBLKS - TYPE(PERFORMANCE_TIMER) :: TIMER - INTEGER(KIND=JPIM) :: TID ! thread id from 0 .. NUMOMP - 1 - - NGPBLKS = (NGPTOT / NPROMA) + MIN(MOD(NGPTOT,NPROMA), 1) -1003 format(5x,'NUMPROC=',i0,', NUMOMP=',i0,', NGPTOTG=',i0,', NPROMA=',i0,', NGPBLKS=',i0) - if (irank == 0) then - write(0,1003) NUMPROC,NUMOMP,NGPTOTG,NPROMA,NGPBLKS - end if - - ! Global timer for the parallel region - CALL TIMER%START(NUMOMP) - -!$acc data & -!$acc copyin( & -!$acc pt,pq,buffer_cml,buffer_tmp,pvfa, & -!$acc pvfl,pvfi,pdyna,pdynl,pdyni,phrsw,phrlw,pvervel, & -!$acc pap,paph,plsm,ldcum,ktype,plu,psnde, & -!$acc pmfu,pmfd,pa,pclv,psupsat,plcrit_aer,picrit_aer, & -!$acc pre_ice,pccn,pnice, yrecldp) & -!$acc copy( & -!$acc buffer_loc,plude,pcovptot,prainfrac_toprfz) & -!$acc copyout( & -!$acc pfsqlf,pfsqif,pfcqnng, & -!$acc pfcqlng ,pfsqrf,pfsqsf,pfcqrng,pfcqsng,pfsqltur, & -!$acc pfsqitur,pfplsl,pfplsn,pfhpsl,pfhpsn) - - ! Local timer for each thread - TID = GET_THREAD_NUM() - CALL TIMER%THREAD_START(TID) - - DO JKGLO=1,NGPTOT,NPROMA - IBL=(JKGLO-1)/NPROMA+1 - ICEND=MIN(NPROMA,NGPTOT-JKGLO+1) - - !-- These were uninitialized : meaningful only when we compare error differences - PCOVPTOT(:,:,IBL) = 0.0_JPRB - BUFFER_LOC(:,:,6+NCLV,IBL) = 0.0_JPRB - - CALL CLOUDSC_CLAW & - & (NLEV, PTSPHY,& - & PT(:,:,IBL), PQ(:,:,IBL), & - & BUFFER_CML(:,:,1,IBL), BUFFER_CML(:,:,3,IBL), BUFFER_CML(:,:,4:8,IBL), & - & BUFFER_TMP(:,:,1,IBL), BUFFER_TMP(:,:,3,IBL), BUFFER_TMP(:,:,2,IBL), BUFFER_TMP(:,:,4:8,IBL), & - & BUFFER_LOC(:,:,1,IBL), BUFFER_LOC(:,:,3,IBL), BUFFER_LOC(:,:,2,IBL), BUFFER_LOC(:,:,4:8,IBL), & - & PVFA(:,:,IBL), PVFL(:,:,IBL), PVFI(:,:,IBL), PDYNA(:,:,IBL), PDYNL(:,:,IBL), PDYNI(:,:,IBL), & - & PHRSW(:,:,IBL), PHRLW(:,:,IBL),& - & PVERVEL(:,:,IBL), PAP(:,:,IBL), PAPH(:,:,IBL),& - & PLSM(:,IBL), LDCUM(:,IBL), KTYPE(:,IBL), & - & PLU(:,:,IBL), PLUDE(:,:,IBL), PSNDE(:,:,IBL), PMFU(:,:,IBL), PMFD(:,:,IBL),& - !---prognostic fields - & PA(:,:,IBL), PCLV(:,:,:,IBL), PSUPSAT(:,:,IBL),& - !-- arrays for aerosol-cloud interactions - & PLCRIT_AER(:,:,IBL),PICRIT_AER(:,:,IBL),& - & PRE_ICE(:,:,IBL),& - & PCCN(:,:,IBL), PNICE(:,:,IBL),& - !---diagnostic output - & PCOVPTOT(:,:,IBL), PRAINFRAC_TOPRFZ(:,IBL),& - !---resulting fluxes - & PFSQLF(:,:,IBL), PFSQIF (:,:,IBL), PFCQNNG(:,:,IBL), PFCQLNG(:,:,IBL),& - & PFSQRF(:,:,IBL), PFSQSF (:,:,IBL), PFCQRNG(:,:,IBL), PFCQSNG(:,:,IBL),& - & PFSQLTUR(:,:,IBL), PFSQITUR (:,:,IBL), & - & PFPLSL(:,:,IBL), PFPLSN(:,:,IBL), PFHPSL(:,:,IBL), PFHPSN(:,:,IBL),& - & KFLDX, YRECLDP, NPROMA=NPROMA) - - ! Log number of columns processed by this thread - CALL TIMER%THREAD_LOG(TID, IGPC=ICEND) - ENDDO - - CALL TIMER%THREAD_END(TID) - -!$acc end data - - CALL TIMER%END() - - CALL TIMER%PRINT_PERFORMANCE(NPROMA, NGPBLKS, NGPTOT) - - END SUBROUTINE CLOUDSC_DRIVER_GPU_CLAW - -END MODULE CLOUDSC_DRIVER_GPU_CLAW_MOD diff --git a/src/cloudsc_loki/CMakeLists.txt b/src/cloudsc_loki/CMakeLists.txt index f42bca94..dab5ca58 100644 --- a/src/cloudsc_loki/CMakeLists.txt +++ b/src/cloudsc_loki/CMakeLists.txt @@ -12,12 +12,6 @@ ecbuild_add_option( FEATURE CLOUDSC_LOKI CONDITION Serialbox_FOUND OR HDF5_FOUND ) -# Define the CLAW-based Loki dwarf variants as an ECBuild feature -ecbuild_add_option( FEATURE CLOUDSC_LOKI_CLAW - DESCRIPTION "Build optimized CPU and GPU version of CLOUDSC derived from Loki+CLAW" DEFAULT OFF - CONDITION HAVE_CLOUDSC_LOKI -) - if( HAVE_CLOUDSC_LOKI ) #################################################### @@ -192,244 +186,6 @@ if( HAVE_CLOUDSC_LOKI ) ) - #################################################### - ## SCA mode (Single Column Abstraction): ## - ## * Extract de-vectorized SCA format code ## - #################################################### - - loki_transform( - COMMAND convert - OUTPUT - loki-sca/cloudsc.sca.F90 - loki-sca/cloudsc_driver_loki_mod.sca.F90 - BUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/loki-sca - DEPENDS - cloudsc.F90 - cloudsc_driver_loki_mod.F90 - ${_OMNI_DEPENDENCIES} - MODE sca - CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config - CPP - FRONTEND ${LOKI_FRONTEND} - SOURCES - ${CMAKE_CURRENT_SOURCE_DIR} - ${COMMON_MODULE} - INCLUDES - ${COMMON_INCLUDE} - XMOD - ${_TARGET_XMOD_DIR} - ${XMOD_DIR} - ) - - ecbuild_add_executable( TARGET dwarf-cloudsc-loki-sca - SOURCES - dwarf_cloudsc.F90 - loki-sca/cloudsc_driver_loki_mod.sca.F90 - loki-sca/cloudsc.sca.F90 - LIBS - cloudsc-common-lib - DEFINITIONS ${CLOUDSC_DEFINITIONS} - ) - # Set specific module directory to avoid aliasing of .mod files - set_target_properties( dwarf-cloudsc-loki-sca - PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/loki-sca - ) - - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-sca-serial - COMMAND bin/dwarf-cloudsc-loki-sca - ARGS 1 100 16 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - OMP 1 - ) - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-sca-mpi - COMMAND bin/dwarf-cloudsc-loki-sca - ARGS 1 100 16 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - MPI 2 - OMP 1 - CONDITION HAVE_MPI - ) - - #################################################### - ## CLAW-CPU mode: ## - ## * Generate SCA code with CLAW annotations ## - ## * Process with CLAW (CPU layout and OpenMP) ## - #################################################### - if( HAVE_CLOUDSC_LOKI_CLAW AND TARGET clawfc ) - - loki_transform( - COMMAND convert - OUTPUT - loki-claw-cpu/cloudsc.claw_cpu.F90 - loki-claw-cpu/cloudsc_driver_loki_mod.claw_cpu.F90 - BUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/loki-claw-cpu - DEPENDS - cloudsc.F90 - cloudsc_driver_loki_mod.F90 - ${_OMNI_DEPENDENCIES} - MODE claw-cpu - CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config - CPP - FRONTEND ${LOKI_FRONTEND} - SOURCES - ${CMAKE_CURRENT_SOURCE_DIR} - ${COMMON_MODULE} - INCLUDES - ${COMMON_INCLUDE} - XMOD - ${_TARGET_XMOD_DIR} - ${XMOD_DIR} - ) - - # We purposefully suppress CLAWs insertion of OpenMP loops, - # as they are already present in the outer driver. - claw_compile( - MODEL_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/claw_cloudsc.config - TARGET cpu DIRECTIVE none - INCLUDES ${COMMON_INCLUDE} - XMOD ${_TARGET_XMOD_DIR} ${XMOD_DIR} - SOURCE loki-claw-cpu/cloudsc.claw_cpu.F90 - OUTPUT loki-claw-cpu/cloudsc.claw_cpu.cpu.F90 - ) - claw_compile( - MODEL_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/claw_cloudsc.config - TARGET cpu DIRECTIVE none - INCLUDES ${COMMON_INCLUDE} - XMOD ${_TARGET_XMOD_DIR} ${XMOD_DIR} - SOURCE loki-claw-cpu/cloudsc_driver_loki_mod.claw_cpu.F90 - OUTPUT loki-claw-cpu/cloudsc_driver_loki_mod.claw_cpu.cpu.F90 - DEPENDS loki-claw-cpu/cloudsc.claw_cpu.cpu.F90 - ) - - ecbuild_add_executable( TARGET dwarf-cloudsc-loki-claw-cpu - SOURCES - dwarf_cloudsc.F90 - loki-claw-cpu/cloudsc_driver_loki_mod.claw_cpu.cpu.F90 - loki-claw-cpu/cloudsc.claw_cpu.cpu.F90 - LIBS - cloudsc-common-lib - DEFINITIONS ${CLOUDSC_DEFINITIONS} - ) - # Set specific module directory to avoid aliasing of .mod files - set_target_properties( dwarf-cloudsc-loki-claw-cpu - PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/loki-claw-cpu - ) - - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-claw-cpu-serial - COMMAND bin/dwarf-cloudsc-loki-claw-cpu - ARGS 1 100 16 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - OMP 1 - ) - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-claw-cpu-omp - COMMAND bin/dwarf-cloudsc-loki-claw-cpu - ARGS 4 100 16 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - OMP 4 - CONDITION HAVE_OMP - ) - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-claw-cpu-mpi - COMMAND bin/dwarf-cloudsc-loki-claw-cpu - ARGS 1 100 16 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - MPI 2 - OMP 1 - CONDITION HAVE_MPI - ) - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-claw-cpu-mpi-omp - COMMAND bin/dwarf-cloudsc-loki-claw-cpu - ARGS 4 100 16 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - MPI 2 - OMP 4 - CONDITION HAVE_OMP AND HAVE_MPI - ) - endif() - - #################################################### - ## CLAW-GPU mode: ## - ## * Generate SCA code with CLAW annotations ## - ## * Process with CLAW (GPU layout and OpenACC) ## - #################################################### - if( HAVE_CLOUDSC_LOKI_CLAW AND TARGET clawfc ) - - # Uses Loki-frontend CPP to switch to statement function variant again, - # but suppresses inlining of stmt funcs by omitting `--include` - - loki_transform( - COMMAND convert - OUTPUT - loki-claw-gpu/cloudsc.claw_gpu.F90 - loki-claw-gpu/cloudsc_driver_loki_mod.claw_gpu.F90 - BUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/loki-claw-gpu - DEPENDS - cloudsc.F90 - cloudsc_driver_loki_mod.F90 - ${_OMNI_DEPENDENCIES} - MODE claw-gpu - CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/cloudsc_loki.config - CPP - DEFINITIONS - CLOUDSC_GPU_TIMING - FRONTEND ${LOKI_FRONTEND} - SOURCES - ${CMAKE_CURRENT_SOURCE_DIR} - ${COMMON_MODULE} - INCLUDES - ${COMMON_INCLUDE} - XMOD - ${_TARGET_XMOD_DIR} - ${XMOD_DIR} - ) - - claw_compile( - MODEL_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/claw_cloudsc.config - TARGET gpu DIRECTIVE openacc - INCLUDES ${COMMON_INCLUDE} - XMOD ${_TARGET_XMOD_DIR} ${XMOD_DIR} - SOURCE loki-claw-gpu/cloudsc.claw_gpu.F90 - OUTPUT loki-claw-gpu/cloudsc.claw_gpu.gpu.F90 - ) - claw_compile( - MODEL_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/claw_cloudsc.config - TARGET gpu DIRECTIVE openacc - INCLUDES ${COMMON_INCLUDE} - XMOD ${_TARGET_XMOD_DIR} ${XMOD_DIR} - SOURCE loki-claw-gpu/cloudsc_driver_loki_mod.claw_gpu.F90 - OUTPUT loki-claw-gpu/cloudsc_driver_loki_mod.claw_gpu.gpu.F90 - DEPENDS loki-claw-gpu/cloudsc.claw_gpu.gpu.F90 - ) - - ecbuild_add_executable( TARGET dwarf-cloudsc-loki-claw-gpu - SOURCES - dwarf_cloudsc.F90 - loki-claw-gpu/cloudsc_driver_loki_mod.claw_gpu.gpu.F90 - loki-claw-gpu/cloudsc.claw_gpu.gpu.F90 - LIBS - cloudsc-common-lib - DEFINITIONS ${CLOUDSC_DEFINITIONS} - ) - # Set specific module directory to avoid aliasing of .mod files - set_target_properties( dwarf-cloudsc-loki-claw-gpu - PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/loki-claw-gpu - ) - - ecbuild_add_test( - TARGET dwarf-cloudsc-loki-claw-gpu-serial - COMMAND bin/dwarf-cloudsc-loki-claw-gpu - ARGS 1 1280 128 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../.. - OMP 1 - ) - endif() - - #################################################### ## "Single Column Coalesced" (SCC) mode ## ## * Removes horizontal vector loops ## @@ -824,7 +580,7 @@ endif() DEPENDS cloudsc.F90 cloudsc_driver_loki_mod.F90 ${_OMNI_DEPENDENCIES} ) - # Define the CLAW-CPU build target for this variant + # Define the build target for the Loki-C variant ecbuild_add_executable( TARGET dwarf-cloudsc-loki-c SOURCES dwarf_cloudsc.F90 diff --git a/src/cloudsc_loki/claw_cloudsc.config b/src/cloudsc_loki/claw_cloudsc.config deleted file mode 100644 index b99f1a72..00000000 --- a/src/cloudsc_loki/claw_cloudsc.config +++ /dev/null @@ -1,19 +0,0 @@ -# CLAW model SCA configuration file for CLOUDSC dwarf - -[model] # Definition of global model information - name = "CLOUDSC" - -[[dimensions]] # Definition of dimensions that can be used in layouts - id = "JL" - [dimensions.size] - lower = 1 # if not specified, 1 by default - upper = "KLON" # mandatory information - [dimensions.iteration] - lower = "KIDIA" # if not specified size.lower by default - upper = "KFDIA" # if not specified size.upper by default - step = 1 # if not specified, 1 by default - -[[layouts]] # Definition of layouts and default layout for specific target - id = "default" # mandatory layout, used if no specific target layout - # specified - position = [ "JL", ":" ] diff --git a/src/cloudsc_loki/cloudsc_loki.config b/src/cloudsc_loki/cloudsc_loki.config index a016da37..cec2253e 100644 --- a/src/cloudsc_loki/cloudsc_loki.config +++ b/src/cloudsc_loki/cloudsc_loki.config @@ -119,21 +119,6 @@ preprocess = true module = 'loki.transformations' -[transformations.SCA] - classname = 'ExtractSCATransformation' - module = 'loki.transformations.single_column' -[transformations.SCA.options] - horizontal = '%dimensions.horizontal%' - - -[transformations.CLAW] - classname = 'CLAWTransformation' - module = 'loki.transformations.single_column' -[transformations.CLAW.options] - horizontal = '%dimensions.horizontal%' - claw_data_offload = false - - [transformations.Stack] classname = 'TemporariesPoolAllocatorTransformation' module = 'loki.transformations' @@ -241,15 +226,6 @@ preprocess = true [pipelines.idem-stack] transformations = ['Idem', 'Sanitise', 'Stack', 'ModuleWrap', 'Dependency'] -[pipelines.sca] - transformations = ['SCA', 'ModuleWrap', 'Dependency'] - -[pipelines.claw-cpu] - transformations = ['CLAW', 'ModuleWrap', 'Dependency'] - -[pipelines.claw-gpu] - transformations = ['DataOffload', 'CLAW', 'ModuleWrap', 'Dependency'] - [pipelines.scc] transformations = ['DataOffload', 'SCCVector', 'ModuleWrap', 'Dependency']