diff --git a/.github/workflows/ndsl-checks.yml b/.github/workflows/ndsl-checks.yml index ffc6705d2..7ba70f0bc 100644 --- a/.github/workflows/ndsl-checks.yml +++ b/.github/workflows/ndsl-checks.yml @@ -1,8 +1,10 @@ name: NDSL Lint & Translate Tests on: - push: - paths: "./GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/**" + pull_request: + paths: + - '.github/workflows/ndsl-checks.yml' + - 'GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/**' workflow_dispatch: # cancel running jobs if theres a newer push @@ -14,30 +16,29 @@ jobs: main: env: DATA_PATH: ./test_data/11.5.2/TBC_C24_L72/moist - DATA_URL: "https://portal.nccs.nasa.gov/datashare/astg/smt/geos-fp/translate/11.5.2/x86_GNU/Moist/TBC_C24L72.tar.gz" + DATA_URL: "https://portal.nccs.nasa.gov/datashare/astg/smt/geos-fp/translate/11.5.2/x86_GNU/Moist/TBC_C24L72_20251208.tar.gz" runs-on: ubuntu-latest steps: - - name: Step Python 3.11 + - name: Step Python 3.12 uses: actions/setup-python@v6 with: - python-version: '3.11' + python-version: '3.12' - name: Install MPI run: pip install mpich - name: Checkout repository uses: actions/checkout@v6 - with: - submodules: 'recursive' - name: Install Python packages run: | - pip install ./GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist[develop] + cd GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist + pip install . - name: Run lint via pre-commit run: | cd GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist - pre-commit run --all-files + pre-commit run --all-files --show-diff-on-failure - name: Build Documentation run: | @@ -45,18 +46,38 @@ jobs: mkdocs build - name: Download test_data + # TODO re-activate once we know which translate tests to run + if: false run: | cd GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist mkdir -p ${{ env.DATA_PATH }} && cd ${{ env.DATA_PATH }} - wget ${{ env.DATA_URL }} - tar -xzvf TBC_C24L72.tar.gz + wget --no-verbose ${{ env.DATA_URL }} + tar -xzf TBC_C24L72_20251208.tar.gz + # These don't have translate tests + rm Constants.MAPL-In.nc + rm Constants.ProcessLibrary-In.nc + rm GF2020_CumulusParameterization_TriggerFunctionConvection-In.nc + rm ComputeUwshcu-In.nc + rm AerActivation-In.nc + rm GF2020_CumulusParameterization_GetBuoyancy_1-In.nc + rm GF2020_CumulusParameterization_UpdraftCIN-In.nc + rm GF2020_CumulusParameterization_InCloudTemperature-In.nc + rm GF2020_CumulusParameterization_EnvironmentCloudLevels_1-In.nc + rm GF2020_CumulusParameterization_UpdraftInitialWorkfunctions-In.nc + rm GF2020_CumulusParameterization_MeltingProfile-In.nc - - name: Run regular unit tests + - name: Run numerical unit tests + env: + EXP_NAME: 'gcm-fp' run : | cd GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist - pytests ./tests/numerical + pytest ./tests/numerical - name: Run translate tests + # TODO: re-activate once we know which translate tests to run + if: false + env: + EXP_NAME: 'gcm-fp' run: | cd GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/ ./run_all.sh ../../${{ env.DATA_PATH }} st:dace:cpu:KIJ diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/GEOS_GFDL_1M_InterfaceMod.F90 b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/GEOS_GFDL_1M_InterfaceMod.F90 index 3c40fc35e..7420233f8 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/GEOS_GFDL_1M_InterfaceMod.F90 +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/GEOS_GFDL_1M_InterfaceMod.F90 @@ -387,6 +387,10 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC) call ESMF_TimeIntervalGet(TINT, S_R8=DT_R8,RC=STATUS); VERIFY_(STATUS) DT_MOIST = DT_R8 + ! Profiler marker for microphysics + call MAPL_ConfigSetAttribute(CF, 1, 'PYPROFILER_TASKID:', RC=STATUS); VERIFY_(STATUS) + call MAPL_pybridge_gcinit( "pyMoist.fortran.param_interfaces.debug.profiler", MAPL, IMPORT, EXPORT ) + if (USE_PYMOIST_GFDL1M) then call MAPL_pybridge_gcrun_with_internal( "pyMoist.fortran.param_interfaces.microphysics.GFDL1M_interface", MAPL, IMPORT, EXPORT, INTERNAL ) else @@ -982,6 +986,9 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC) endif ! USE_PYMOIST_GFDL1M + ! End profiler marker for Microphysics + call MAPL_pybridge_gcfinalize( "pyMoist.fortran.param_interfaces.debug.profiler", MAPL, IMPORT, EXPORT ) + call MAPL_TimerOff(MAPL,"--GFDL_1M",RC=STATUS) end subroutine GFDL_1M_Run diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/air_density.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/air_density.md index e895d9d6f..1e05133c1 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/air_density.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/air_density.md @@ -1,3 +1,3 @@ # air_density -::: pyMoist.convection.GF_2020.air_density +::: pyMoist.convection.GF_2020.cumulus_parameterization.air_density diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/buoyancy.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/buoyancy.md index 3fe368f41..329f90f5c 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/buoyancy.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/buoyancy.md @@ -1,3 +1,3 @@ # buoyancy -::: pyMoist.convection.GF_2020.buoyancy +::: pyMoist.convection.GF_2020.cumulus_parameterization.buoyancy diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/check_config.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/check_config.md index 3f2f8d014..9705bc0a7 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/check_config.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/check_config.md @@ -1,3 +1,3 @@ # check_config -::: pyMoist.convection.GF_2020.check_config +::: pyMoist.convection.GF_2020.cumulus_parameterization.check_config diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/config.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/config.md index 81280545b..2a6c6ab5b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/config.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/config.md @@ -1,3 +1,3 @@ # config -::: pyMoist.convection.GF_2020.config +::: pyMoist.convection.GF_2020.cumulus_parameterization.config diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/constants.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/constants.md index 9bcf55555..5c744ba64 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/constants.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/constants.md @@ -1,3 +1,3 @@ # constants -::: pyMoist.convection.GF_2020.constants +::: pyMoist.convection.GF_2020.cumulus_parameterization.constants diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/convective_tracers.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/convective_tracers.md index 2b4aeec16..51f0472a8 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/convective_tracers.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/convective_tracers.md @@ -1,3 +1,3 @@ # convective_tracers -::: pyMoist.convection.GF_2020.convective_tracers +::: pyMoist.convection.GF_2020.cumulus_parameterization.convective_tracers diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/cumulus_parameterization.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/cumulus_parameterization.md index a1441419f..1db70bd65 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/cumulus_parameterization.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/cumulus_parameterization.md @@ -1,3 +1,3 @@ # cumulus_parameterization -::: pyMoist.convection.GF_2020.cumulus_parameterization +::: pyMoist.convection.GF_2020.cumulus_parameterization.cumulus_parameterization diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/diurnal_cycle.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/diurnal_cycle.md index 4a382ba29..add9275ec 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/diurnal_cycle.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/diurnal_cycle.md @@ -1,3 +1,3 @@ # diurnal_cycle -::: pyMoist.convection.GF_2020.diurnal_cycle +::: pyMoist.convection.GF_2020.cumulus_parameterization.diurnal_cycle diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/downdraft.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/downdraft.md index 449dd714e..542bf8302 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/downdraft.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/downdraft.md @@ -1,3 +1,3 @@ # downdraft -::: pyMoist.convection.GF_2020.downdraft +::: pyMoist.convection.GF_2020.cumulus_parameterization.downdraft diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/entrainment.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/entrainment.md index 11a3b04bd..65b0a705e 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/entrainment.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/entrainment.md @@ -1,3 +1,3 @@ # entrainment -::: pyMoist.convection.GF_2020.entrainment +::: pyMoist.convection.GF_2020.cumulus_parameterization.entrainment diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/environment.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/environment.md index 86588d4cd..e773c394c 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/environment.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/environment.md @@ -1,3 +1,3 @@ # environment -::: pyMoist.convection.GF_2020.environment +::: pyMoist.convection.GF_2020.cumulus_parameterization.environment diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/field_types.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/field_types.md index 64215513d..5d865dbff 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/field_types.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/field_types.md @@ -1,3 +1,3 @@ # field_types -::: pyMoist.convection.GF_2020.field_types +::: pyMoist.convection.GF_2020.cumulus_parameterization.field_types diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/get_levels.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/get_levels.md index 7aaea3311..5f23b03dd 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/get_levels.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/get_levels.md @@ -1,3 +1,3 @@ # get_levels -::: pyMoist.convection.GF_2020.get_levels +::: pyMoist.convection.GF_2020.cumulus_parameterization.get_levels diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/kinetic_energy_to_heating.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/kinetic_energy_to_heating.md index 55d03d3af..9019a4937 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/kinetic_energy_to_heating.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/kinetic_energy_to_heating.md @@ -1,3 +1,3 @@ # kinetic_energy_to_heating -::: pyMoist.convection.GF_2020.kinetic_energy_to_heating +::: pyMoist.convection.GF_2020.cumulus_parameterization.kinetic_energy_to_heating diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/large_scale_forcing.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/large_scale_forcing.md index cb8b7c545..a2433ce23 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/large_scale_forcing.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/large_scale_forcing.md @@ -1,3 +1,3 @@ # large_scale_forcing -::: pyMoist.convection.GF_2020.large_scale_forcing +::: pyMoist.convection.GF_2020.cumulus_parameterization.large_scale_forcing diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/locals.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/locals.md index 6aaf1a474..19d152e97 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/locals.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/locals.md @@ -1,3 +1,3 @@ # locals -::: pyMoist.convection.GF_2020.locals +::: pyMoist.convection.GF_2020.cumulus_parameterization.locals diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/mass_conservation.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/mass_conservation.md index c33df53c2..f6b114aa5 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/mass_conservation.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/mass_conservation.md @@ -1,3 +1,3 @@ # mass_conservation -::: pyMoist.convection.GF_2020.mass_conservation +::: pyMoist.convection.GF_2020.cumulus_parameterization.mass_conservation diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/moist_static_energy.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/moist_static_energy.md index cad8fdea8..511003772 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/moist_static_energy.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/moist_static_energy.md @@ -1,3 +1,3 @@ # moist_static_energy -::: pyMoist.convection.GF_2020.moist_static_energy +::: pyMoist.convection.GF_2020.cumulus_parameterization.moist_static_energy diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/plume_dependent_constants.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/plume_dependent_constants.md index 980eebb0f..7c137f3da 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/plume_dependent_constants.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/plume_dependent_constants.md @@ -1,3 +1,3 @@ # plume_dependent_constants -::: pyMoist.convection.GF_2020.plume_dependent_constants +::: pyMoist.convection.GF_2020.cumulus_parameterization.plume_dependent_constants diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/precip.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/precip.md index eec2dd6fe..1cf4ee5e6 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/precip.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/precip.md @@ -1,3 +1,3 @@ # precip -::: pyMoist.convection.GF_2020.precip +::: pyMoist.convection.GF_2020.cumulus_parameterization.precip diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/prepare_output.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/prepare_output.md index c7e34b3db..5dbdc40f9 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/prepare_output.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/prepare_output.md @@ -1,3 +1,3 @@ # prepare_output -::: pyMoist.convection.GF_2020.prepare_output +::: pyMoist.convection.GF_2020.cumulus_parameterization.prepare_output diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/profiles.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/profiles.md index b32a863cc..caa10a093 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/profiles.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/profiles.md @@ -1,3 +1,3 @@ # profiles -::: pyMoist.convection.GF_2020.profiles +::: pyMoist.convection.GF_2020.cumulus_parameterization.profiles diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/set_constants.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/set_constants.md index de83087aa..d484189d5 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/set_constants.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/set_constants.md @@ -1,3 +1,3 @@ # set_constants -::: pyMoist.convection.GF_2020.set_constants +::: pyMoist.convection.GF_2020.cumulus_parameterization.setup.set_constants diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/setup.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/setup.md index b1d92385d..259b303f1 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/setup.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/setup/setup.md @@ -1,3 +1,3 @@ # setup -::: pyMoist.convection.GF_2020.setup +::: pyMoist.convection.GF_2020.cumulus_parameterization.setup.setup diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_functions.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_functions.md index 28470c005..862f4731b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_functions.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_functions.md @@ -1,3 +1,3 @@ # shared_functions -::: pyMoist.convection.GF_2020.shared_functions +::: pyMoist.convection.GF_2020.cumulus_parameterization.shared_functions diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_stencils.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_stencils.md index 6fe7239c8..8d804f888 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_stencils.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/shared_stencils.md @@ -1,3 +1,3 @@ # shared_stencils -::: pyMoist.convection.GF_2020.shared_stencils +::: pyMoist.convection.GF_2020.cumulus_parameterization.shared_stencils diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/smoothing.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/smoothing.md index 7596fc2eb..efa6ddf1f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/smoothing.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/smoothing.md @@ -1,3 +1,3 @@ # smoothing -::: pyMoist.convection.GF_2020.smoothing +::: pyMoist.convection.GF_2020.cumulus_parameterization.smoothing diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/sounding.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/sounding.md index 68de99831..7f70e59d6 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/sounding.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/sounding.md @@ -1,3 +1,3 @@ # sounding -::: pyMoist.convection.GF_2020.sounding +::: pyMoist.convection.GF_2020.cumulus_parameterization.sounding diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/state.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/state.md index 694a1f697..ce692e2e6 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/state.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/state.md @@ -1,3 +1,3 @@ # state -::: pyMoist.convection.GF_2020.state +::: pyMoist.convection.GF_2020.cumulus_parameterization.state diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/triggers.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/triggers.md index a77ef276c..48c061027 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/triggers.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/triggers.md @@ -1,3 +1,3 @@ # triggers -::: pyMoist.convection.GF_2020.triggers +::: pyMoist.convection.GF_2020.cumulus_parameterization.triggers diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/updraft.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/updraft.md index 8819f572e..95ed19212 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/updraft.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/updraft.md @@ -1,3 +1,3 @@ # updraft -::: pyMoist.convection.GF_2020.updraft +::: pyMoist.convection.GF_2020.cumulus_parameterization.updraft diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/vertical_discretization.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/vertical_discretization.md index 5cd289385..327e5b6f1 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/vertical_discretization.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/convection/GF_2020/cumulus_parameterization/vertical_discretization.md @@ -1,3 +1,3 @@ # vertical_discretization -::: pyMoist.convection.GF_2020.vertical_discretization +::: pyMoist.convection.GF_2020.cumulus_parameterization.vertical_discretization diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/cuda_profiler.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/cuda_profiler.md new file mode 100644 index 000000000..3e38da6da --- /dev/null +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/cuda_profiler.md @@ -0,0 +1,3 @@ +# profiler + +::: pyMoist.fortran.cuda_profiler diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/convection/GF_2020.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/convection/GF_2020.md index dbdf1be57..f133dd94f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/convection/GF_2020.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/convection/GF_2020.md @@ -1,3 +1,3 @@ # GF_2020 -::: pyMoist.fortran.param_interfaces.convection.GF_2020 +::: pyMoist.fortran.param_interfaces.convection.GF2020_interface diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/microphysics/GFDL_1M.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/microphysics/GFDL_1M.md index 538635b19..2aa2f467b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/microphysics/GFDL_1M.md +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/param_interfaces/microphysics/GFDL_1M.md @@ -1,3 +1,3 @@ # GFDL_1M -::: pyMoist.fortran.param_interfaces.microphysics.GFDL_1M +::: pyMoist.fortran.param_interfaces.microphysics.GFDL1M_interface diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/profiler.md b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/profiler.md deleted file mode 100644 index 454ea5c39..000000000 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/docs/fortran/profiler.md +++ /dev/null @@ -1,3 +0,0 @@ -# profiler - -::: pyMoist.fortran.profiler diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/mkdocs.yml b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/mkdocs.yml index 54dea304f..08816a8f3 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/mkdocs.yml +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/mkdocs.yml @@ -53,10 +53,12 @@ nav: - Home: index.md - Top Level: - "constants": top/constants.md + - "convective_tracers": top/convective_tracers.md - "field_types": top/field_types.md - Fortran interface: - "geos_pymoist": fortran/geos_pymoist.md - "Parametrization interfaces": + - "GF2020_interface": fortran/param_interfaces/convection/GF202_interface.md - "UW_interface": fortran/param_interfaces/convection/UW_interface.md - "GFDL_1M": fortran/param_interfaces/microphysics/GFDL1M_interface.md - "Internals": @@ -108,12 +110,19 @@ nav: - "setup": microphysics/GFDL_1M/setup.md - "state": microphysics/GFDL_1M/state.md - "shared_stencils": microphysics/GFDL_1M/shared_stencils.md - - Universtiy of Washington Shallow Convection (UW): + - University of Washington Shallow Convection (UW): - "compute_uwshcu": convection/UW/compute_uwshcu.md - "config": convection/UW/config.md - "locals": convection/UW/locals.md - "state": convection/UW/state.md - "uwshcu_functions": convection/UW/uwshcu_functions.md + - Grell-Freitas Deep Convection (GF 2020): + - "config": convection/GF_2020/config.md + - "finalize": convection/GF_2020/finalize.md + - "GF_2020": convection/GF_2020/GF_2020.md + - "locals": convection/GF_2020/locals.md + - "setup": convection/GF_2020/setup.md + - "state": convection/GF_2020/state.md - Shared: - "Interpolations": shared/interpolations.md - "Numerical Recipes": shared/numerical_recipes.md diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/GF_2020.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/GF_2020.py index ffe7ef870..90fd3e1c8 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/GF_2020.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/GF_2020.py @@ -49,7 +49,7 @@ def __init__( # make saturation tables visible at runtime if saturation_tables is None: - saturation_tables = SaturationVaporPressureTable(stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(stencil_factory) else: self.saturation_tables = saturation_tables diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/entrainment.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/entrainment.py index f1fe3406f..c1c9da7ed 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/entrainment.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/entrainment.py @@ -1,4 +1,4 @@ -from gt4py.cartesian.gtscript import FORWARD, PARALLEL, K, computation, interval +from ndsl.dsl.gt4py import FORWARD, PARALLEL, K, computation, interval from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, Int, IntFieldIJ from ndsl.stencils.column_operations import column_max_ddim diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/environment.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/environment.py index d7d4a19a6..57c120713 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/environment.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/environment.py @@ -1,5 +1,4 @@ -from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, computation, exp, interval -from ndsl.dsl.gt4py import function +from ndsl.dsl.gt4py import BACKWARD, FORWARD, PARALLEL, computation, exp, function, interval from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, Int import pyMoist.constants as constants diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/get_levels.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/get_levels.py index a4a978051..4e1c7b5c5 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/get_levels.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/get_levels.py @@ -136,13 +136,13 @@ def get_lcl(p_source, t_source, vapor_source): p00ki = 1.0 / p00k # convert to pascals - p_source = 100 * p_source + p_source = 100.0 * p_source # simpler, cheaper method dewpoint = compute_dewpoint(p_source, vapor_source) t_lcl = dewpoint - (0.001296 * dewpoint + 0.1963) * (t_source - dewpoint) p_lcl = p_source * (t_lcl / t_source) ** cpor - dz_lcl = 127 * (t_source - dewpoint) + dz_lcl = 127.0 * (t_source - dewpoint) if dz_lcl <= 0.0: dz_lcl = -999.0 diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/precip.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/precip.py index 515329a56..55e7bbc70 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/precip.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/precip.py @@ -84,7 +84,7 @@ def partition_liquid_ice( if cumulus_parameterization_constants.MELT_GLAC and plume == cumulus_parameterization_constants.DEEP: if error_code[0, 0][plume] == 0: # normalize vertical integral of melting_layer to 1 - melting_layer = melting_layer / (norm + 1.0e-6) * (100 * (p.at(K=0, ddim=[plume]) - p.at(K=k_end - 1, ddim=[plume])) / constants.MAPL_GRAV) + melting_layer = melting_layer / (norm + 1.0e-6) * (100.0 * (p.at(K=0, ddim=[plume]) - p.at(K=k_end - 1, ddim=[plume])) / constants.MAPL_GRAV) class PrecipFactor: diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/profiles.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/profiles.py index dce89f0f2..720ed1b84 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/profiles.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/profiles.py @@ -52,7 +52,7 @@ def melting_profile( if cumulus_parameterization_constants.MELT_GLAC and plume == cumulus_parameterization_constants.DEEP and error_code[0, 0][plume] == 0: melting = melting_layer * ( total_solid_phase_precipitable_water - / (100 * (p_cloud_levels_forced.at(K=0, ddim=[plume]) - p_cloud_levels_forced.at(K=k_end - 1, ddim=[plume])) / constants.MAPL_GRAV) + / (100.0 * (p_cloud_levels_forced.at(K=0, ddim=[plume]) - p_cloud_levels_forced.at(K=k_end - 1, ddim=[plume])) / constants.MAPL_GRAV) ) with computation(PARALLEL), interval(...): diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/setup/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/setup/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/shared_stencils.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/shared_stencils.py index 08755c0e0..900f7740e 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/shared_stencils.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/cumulus_parameterization/shared_stencils.py @@ -1,4 +1,4 @@ -from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, K, computation, interval, sqrt +from ndsl.dsl.gt4py import BACKWARD, FORWARD, PARALLEL, K, computation, interval, sqrt from ndsl.dsl.typing import BoolFieldIJ, FloatField, FloatFieldIJ, Int, IntFieldIJ from ndsl.stencils.column_operations import column_max diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/finalize.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/finalize.py index 52ebfffab..2473c810b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/finalize.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/finalize.py @@ -796,7 +796,6 @@ def update_state_with_tendencies( convective_cloud_fraction: FloatField, convective_rainwater_source: FloatField, convective_precipitation_RAS: FloatField, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, fraction_ice: FloatField, ): @@ -875,7 +874,7 @@ def update_state_with_tendencies( # fix convective cloud fraction if FIX_CONVECTIVE_CLOUD: - saturation_humidity, _ = saturation_specific_humidity(t, p, ese, esx) + saturation_humidity, _ = saturation_specific_humidity(t, p, esx) if convective_cloud_fraction < 1.0: modification = (vapor - saturation_humidity * convective_cloud_fraction) / (1.0 - convective_cloud_fraction) @@ -964,7 +963,6 @@ def __init__( # NOTE: this is an orchestration workaround. Direct call to # `self.tables.X` fails closure capture for # argument reconstruction at call time - self._ese = saturation_tables.ese self._esw = saturation_tables.esw self._esx = saturation_tables.esx self._estfrz = saturation_tables.frz @@ -1329,7 +1327,6 @@ def __call__( convective_cloud_fraction=state.convective_cloud_fraction, convective_rainwater_source=state.convective_rainwater_source, convective_precipitation_RAS=state.convective_precipitation_RAS, - ese=self._ese, esx=self._esx, fraction_ice=self.fraction_ice, ) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/setup.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/setup.py index 6f1b322e2..873c78d23 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/setup.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/GF_2020/setup.py @@ -42,7 +42,6 @@ def compute_extra_inputs_from_state( area: FloatFieldIJ, modified_area: FloatFieldIJ, convection_fraction: FloatFieldIJ, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, ): """ @@ -73,7 +72,6 @@ def compute_extra_inputs_from_state( area (FloatFieldIJ) modified_area (FloatFieldIJ) convection_fraction (FloatFieldIJ) - ese (GlobalTable_saturation_tables) esx (GlobalTable_saturation_tables) """ from __externals__ import GF_MIN_AREA, LHYDROSTATIC, STOCH_BOT, STOCH_TOP, STOCHASTIC_CONVECTION, k_end @@ -96,12 +94,12 @@ def compute_extra_inputs_from_state( with computation(FORWARD), interval(0, 1): tpwi = vapor * mass - qsat, _ = saturation_specific_humidity(t, p, ese, esx) + qsat, _ = saturation_specific_humidity(t, p, esx) tpwi_star = qsat * mass with computation(FORWARD), interval(1, -1): tpwi = tpwi + vapor * mass - qsat, _ = saturation_specific_humidity(t, p, ese, esx) + qsat, _ = saturation_specific_humidity(t, p, esx) tpwi_star = tpwi_star + qsat * mass with computation(FORWARD), interval(0, 1): @@ -1287,6 +1285,11 @@ def __init__( }, ) + # Dev NOTE: this is an orchestration workaround. Direct call to + # `self.saturation_tables.X` fails closure capture for + # argument reconstruction at call time + self._esx = self.saturation_tables.esx + def __call__( self, state: GF2020State, @@ -1327,8 +1330,7 @@ def __call__( area=state.area, modified_area=locals.derived_state.modified_area, convection_fraction=state.convection_fraction, - ese=self.saturation_tables.ese, - esx=self.saturation_tables.esx, + esx=self._esx, ) if state.seed_convection is not None: diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/compute_uwshcu.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/compute_uwshcu.py index 09bc9c105..d27597379 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/compute_uwshcu.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/compute_uwshcu.py @@ -354,8 +354,8 @@ def compute_thermodynamic_variables( qpert_out = 0.0 # Initialize variable that are calculated from inputs - zmid0 = zmid0_in - dp0 = dp0_in + zmid0 = zmid0_in # TODO: unused but set variable + dp0 = dp0_in # TODO: unused but set variable cush = cush cush_inout = cush tscaleh = cush_inout @@ -555,7 +555,6 @@ def compute_thv0_thvl0( Once condensation occurs, the UW shallow convection scheme is done computing at that column. - NOTE: Variables ending in '_o' indicate variables used in the second NOTE: Variables ending in '_o' indicate variables used in the second iteration of the implicit CIN calculation. @@ -694,7 +693,7 @@ def compute_thv0_thvl0( thl0bot: float32 = thl0 + ssthl0 * (pifc0 - pmid0) qt0bot: float32 = qt0 + ssqt0 * (pifc0 - pmid0) - thj, qvj, qlj, qij, qse, id_check = conden(pifc0, thl0bot, qt0bot, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0, thl0bot, qt0bot, esx) with computation(FORWARD), interval(...): if id_check == 1: @@ -735,7 +734,7 @@ def compute_thv0_thvl0( with computation(PARALLEL), interval(...): if not condensation: - thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thl0top, qt0top, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0_in[0, 0, 1], thl0top, qt0top, esx) with computation(FORWARD), interval(...): if not condensation: @@ -892,7 +891,6 @@ def compute_thv0_thvl0( def find_pbl_height( - iteration: int32, kpbl_in: IntFieldIJ, condensation: BoolFieldIJ, kinv: IntField, @@ -925,7 +923,6 @@ def find_pbl_height( layer index having PBLH as a lower interface. Arguments: - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) kpbl_in [IntFieldIJ]: Height of PBL [m] k0 [Int]: Number of levels condensation [BoolFieldIJ]: Mask that indicates if condensation has occurred @@ -974,8 +971,8 @@ def find_pbl_height( # It is not clear whether I should locate below two lines within or out # of the iterative cin loop. - cush = -1.0 - qtavg = 0.0 + cush = -1.0 # TODO why is this written again? + qtavg = 0.0 # TODO unused but set variable. Should this be passed in? # In the previous code, I set the lower limit of 'kinv' by 2 in order to # be consistent with the other parts of the code. However in the modified @@ -1077,7 +1074,6 @@ def find_pbl_averages( vavg: FloatField, thvlavg: FloatField, qtavg: FloatField, - iteration: int32, ): """ Stencil to find PBL averaged tke ('tkeavg') and minimum 'thvl' ('thvlmin') @@ -1105,7 +1101,6 @@ def find_pbl_averages( zmid0 [FloatField]: Environmental height at the layer mid-point [m] qtsrchgt [Float]: Interpolation height for total water source [m] qt0 [FloatField]: Mixing ratio [?] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) thvlmin [FloatField]: Minimum 'thvl' within PBL, obtained by comparing top & base interface values of 'thvl' in each layers within the PBL [K] tkeavg [FloatField]: Average tke over the PBL [m2/s2] @@ -1200,7 +1195,6 @@ def find_cumulus_characteristics( vsrc: FloatField, tpert_out: FloatFieldIJ, qpert_out: FloatFieldIJ, - iteration: int32, ): """ Stencil to find characteristics of cumulus source air: @@ -1234,7 +1228,6 @@ def find_cumulus_characteristics( pmid0 [FloatField]: Environmental pressure at the layer mid-point [Pa] dotransport [Int]: Transport tracers [1 true] tr0 [FloatField_NTracers]: Environmental tracers [#, kg/kg] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) trsrc [FloatFieldIJ_NTracers]: Tracers of cumulus source air [?] qtsrc [FloatField]: Mixing ratio of cumulus source air [?] thvlsrc [FloatField]: Temperature of cumulus source air [K] [?] @@ -1289,7 +1282,6 @@ def find_klcl( pifc0: FloatField, qtsrc: FloatField, thlsrc: FloatField, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, thl0: FloatField, ssthl0: FloatField, @@ -1301,7 +1293,6 @@ def find_klcl( thl0lcl: FloatField, qt0lcl: FloatField, thv0lcl: FloatField, - iteration: int32, cush: FloatFieldIJ, umf_out: FloatField, dcm_out: FloatField, @@ -1331,7 +1322,6 @@ def find_klcl( pifc0 [FloatField]: Environmental pressure at the interfaces [Pa] qtsrc [FloatField]: Mixing ratio of cumulus source air [?] thlsrc [FloatField]: Temperature of cumulus source air [K] [?] - ese [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] esx [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] k0 [Int]: Number of levels thl0 [FloatField]: Temperature [?] @@ -1376,7 +1366,7 @@ def find_klcl( with computation(FORWARD), interval(...): if not condensation: - if pifc0.at(K=0) < 70000 or pifc0.at(K=0) > 115000.0: + if pifc0.at(K=0) < 70000.0 or pifc0.at(K=0) > 115000.0: condensation = True umf_out = 0.0 umf_out[0, 0, 1] = 0.0 @@ -1404,81 +1394,78 @@ def find_klcl( fer_out = constants.MAPL_UNDEF fdr_out = constants.MAPL_UNDEF - if not condensation: - if qtsrc > 0.1 or qtsrc < 1e-8: - condensation = True - umf_out = 0.0 - umf_out[0, 0, 1] = 0.0 - dcm_out = 0.0 - qvten_out = 0.0 - qlten_out = 0.0 - qiten_out = 0.0 - sten_out = 0.0 - uten_out = 0.0 - vten_out = 0.0 - qrten_out = 0.0 - qsten_out = 0.0 - cufrc_out = 0.0 - cush_inout = -1.0 - qldet_out = 0.0 - qidet_out = 0.0 - qtflx_out = 0.0 - slflx_out = 0.0 - uflx_out = 0.0 - vflx_out = 0.0 - qtflx_out[0, 0, 1] = 0.0 - slflx_out[0, 0, 1] = 0.0 - uflx_out[0, 0, 1] = 0.0 - vflx_out[0, 0, 1] = 0.0 - fer_out = constants.MAPL_UNDEF - fdr_out = constants.MAPL_UNDEF + if not condensation: + if qtsrc > 0.1 or qtsrc < 1e-8: + condensation = True + umf_out = 0.0 + umf_out[0, 0, 1] = 0.0 + dcm_out = 0.0 + qvten_out = 0.0 + qlten_out = 0.0 + qiten_out = 0.0 + sten_out = 0.0 + uten_out = 0.0 + vten_out = 0.0 + qrten_out = 0.0 + qsten_out = 0.0 + cufrc_out = 0.0 + cush_inout = -1.0 + qldet_out = 0.0 + qidet_out = 0.0 + qtflx_out = 0.0 + slflx_out = 0.0 + uflx_out = 0.0 + vflx_out = 0.0 + qtflx_out[0, 0, 1] = 0.0 + slflx_out[0, 0, 1] = 0.0 + uflx_out[0, 0, 1] = 0.0 + vflx_out[0, 0, 1] = 0.0 + fer_out = constants.MAPL_UNDEF + fdr_out = constants.MAPL_UNDEF - if not condensation: - if thlsrc > 400.0 or thlsrc < 100.0: - condensation = True - umf_out = 0.0 - umf_out[0, 0, 1] = 0.0 - dcm_out = 0.0 - qvten_out = 0.0 - qlten_out = 0.0 - qiten_out = 0.0 - sten_out = 0.0 - uten_out = 0.0 - vten_out = 0.0 - qrten_out = 0.0 - qsten_out = 0.0 - cufrc_out = 0.0 - cush_inout = -1.0 - qldet_out = 0.0 - qidet_out = 0.0 - qtflx_out = 0.0 - slflx_out = 0.0 - uflx_out = 0.0 - vflx_out = 0.0 - qtflx_out[0, 0, 1] = 0.0 - slflx_out[0, 0, 1] = 0.0 - uflx_out[0, 0, 1] = 0.0 - vflx_out[0, 0, 1] = 0.0 - fer_out = constants.MAPL_UNDEF - fdr_out = constants.MAPL_UNDEF + if not condensation: + if thlsrc > 400.0 or thlsrc < 100.0: + condensation = True + umf_out = 0.0 + umf_out[0, 0, 1] = 0.0 + dcm_out = 0.0 + qvten_out = 0.0 + qlten_out = 0.0 + qiten_out = 0.0 + sten_out = 0.0 + uten_out = 0.0 + vten_out = 0.0 + qrten_out = 0.0 + qsten_out = 0.0 + cufrc_out = 0.0 + cush_inout = -1.0 + qldet_out = 0.0 + qidet_out = 0.0 + qtflx_out = 0.0 + slflx_out = 0.0 + uflx_out = 0.0 + vflx_out = 0.0 + qtflx_out[0, 0, 1] = 0.0 + slflx_out[0, 0, 1] = 0.0 + uflx_out[0, 0, 1] = 0.0 + vflx_out[0, 0, 1] = 0.0 + fer_out = constants.MAPL_UNDEF + fdr_out = constants.MAPL_UNDEF with computation(FORWARD), interval(...): if not condensation: - plcl = qsinvert(qtsrc, thlsrc, pifc0.at(K=0), ese, esx) + plcl = qsinvert(qtsrc, thlsrc, pifc0.at(K=0), esx) lev = 0 - klcl_flag = 0.0 - while lev < k0 + 1 and klcl_flag == 0.0: - kidx = lev - if pifc0.at(K=kidx) < plcl: - klcl = lev - klcl_flag = 1.0 - lev += 1 - - if klcl_flag == 0.0: - klcl = 0 + klcl_found = False + while lev < k0 + 1 and not klcl_found: + if pifc0.at(K=lev) < plcl: + klcl_found = True + # Don't increase the level further if we found the layer + else: + lev += 1 - klcl = max(0, klcl) - klcl = klcl - 1 # Adjust klcl by 1 + # Adjust level by -1 to account for python starting at 0 while Fortran starts at 1 + klcl = lev - 1 if klcl_found and lev > 0 else 0 with computation(FORWARD), interval(...): if not condensation: @@ -1510,43 +1497,43 @@ def find_klcl( fer_out = constants.MAPL_UNDEF fdr_out = constants.MAPL_UNDEF - if not condensation: - # Calculate environmental virtual potential temperature at LCL, - # 'thv0lcl' which is solely used in the 'cin' calculation. Note - # that 'thv0lcl' is calculated first by calculating 'thl0lcl' - # and 'qt0lcl' at the LCL, and performing 'conden' afterward, - # in fully consistent with the other parts of the code. - thl0lcl = thl0.at(K=klcl) + ssthl0.at(K=klcl) * (plcl - pmid0.at(K=klcl)) - qt0lcl = qt0.at(K=klcl) + ssqt0.at(K=klcl) * (plcl - pmid0.at(K=klcl)) - thj, qvj, qlj, qij, qse, id_check = conden(plcl, thl0lcl, qt0lcl, ese, esx) + if not condensation: + # Calculate environmental virtual potential temperature at LCL, + # 'thv0lcl' which is solely used in the 'cin' calculation. Note + # that 'thv0lcl' is calculated first by calculating 'thl0lcl' + # and 'qt0lcl' at the LCL, and performing 'conden' afterward, + # in fully consistent with the other parts of the code. + thl0lcl = thl0.at(K=klcl) + ssthl0.at(K=klcl) * (plcl - pmid0.at(K=klcl)) + qt0lcl = qt0.at(K=klcl) + ssqt0.at(K=klcl) * (plcl - pmid0.at(K=klcl)) + thj, qvj, qlj, qij, qse, id_check = conden(plcl, thl0lcl, qt0lcl, esx) - if id_check == 1: - condensation = True - umf_out = 0.0 - umf_out[0, 0, 1] = 0.0 - dcm_out = 0.0 - qvten_out = 0.0 - qlten_out = 0.0 - qiten_out = 0.0 - sten_out = 0.0 - uten_out = 0.0 - vten_out = 0.0 - qrten_out = 0.0 - qsten_out = 0.0 - cufrc_out = 0.0 - cush_inout = -1.0 - qldet_out = 0.0 - qidet_out = 0.0 - qtflx_out = 0.0 - slflx_out = 0.0 - uflx_out = 0.0 - vflx_out = 0.0 - qtflx_out[0, 0, 1] = 0.0 - slflx_out[0, 0, 1] = 0.0 - uflx_out[0, 0, 1] = 0.0 - vflx_out[0, 0, 1] = 0.0 - fer_out = constants.MAPL_UNDEF - fdr_out = constants.MAPL_UNDEF + if id_check == 1: + condensation = True + umf_out = 0.0 + umf_out[0, 0, 1] = 0.0 + dcm_out = 0.0 + qvten_out = 0.0 + qlten_out = 0.0 + qiten_out = 0.0 + sten_out = 0.0 + uten_out = 0.0 + vten_out = 0.0 + qrten_out = 0.0 + qsten_out = 0.0 + cufrc_out = 0.0 + cush_inout = -1.0 + qldet_out = 0.0 + qidet_out = 0.0 + qtflx_out = 0.0 + slflx_out = 0.0 + uflx_out = 0.0 + vflx_out = 0.0 + qtflx_out[0, 0, 1] = 0.0 + slflx_out[0, 0, 1] = 0.0 + uflx_out[0, 0, 1] = 0.0 + vflx_out[0, 0, 1] = 0.0 + fer_out = constants.MAPL_UNDEF + fdr_out = constants.MAPL_UNDEF with computation(FORWARD), interval(...): if not condensation: @@ -1702,13 +1689,7 @@ def compute_cin_cinlcl( qij, qse, id_check, - ) = conden( - pifc0[0, 0, 1], - thlsrc, - qtsrc, - ese, - esx, - ) + ) = conden(pifc0[0, 0, 1], thlsrc, qtsrc, esx) if id_check == 1: condensation = True @@ -1766,13 +1747,7 @@ def compute_cin_cinlcl( qij, qse, id_check, - ) = conden( - pifc0[0, 0, 1], - thlsrc, - qtsrc, - ese, - esx, - ) + ) = conden(pifc0[0, 0, 1], thlsrc, qtsrc, esx) if id_check == 1: condensation = True @@ -1829,13 +1804,7 @@ def compute_cin_cinlcl( qij, qse, id_check, - ) = conden( - pifc0, - thlsrc, - qtsrc, - ese, - esx, - ) + ) = conden(pifc0, thlsrc, qtsrc, esx) if id_check == 1 and not stop_cin: condensation = True @@ -1874,13 +1843,7 @@ def compute_cin_cinlcl( qij, qse, id_check, - ) = conden( - pifc0[0, 0, 1], - thlsrc, - qtsrc, - ese, - esx, - ) + ) = conden(pifc0[0, 0, 1], thlsrc, qtsrc, esx) if id_check == 1 and not stop_cin: condensation = True @@ -2367,6 +2330,7 @@ def avg_initial_and_final_cin3( qisub_s: FloatField, cush_inout: FloatFieldIJ, cush_s: FloatField, + cush: FloatFieldIJ, cufrc_out: FloatField, cufrc_s: FloatField, qtflx_out: FloatField, @@ -2661,7 +2625,6 @@ def calc_cumulus_base_mass_flux( def define_updraft_properties( condensation: BoolFieldIJ, - iteration: int32, winv: FloatField, cinlcl_IJ: FloatFieldIJ, cbmf: FloatField, @@ -2716,7 +2679,6 @@ def define_updraft_properties( this again in the below block. If 'ufrclcl < 0.1%', just exit. Arguments: - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) winv [FloatField]: Mean vertical velocity of cumulus updraft at PBL top interface [m/s] cinlcl_IJ [FloatFieldIJ]: Convective inhibition at LCL [J/kg] rbuoy [Float]: Non-hydro pressure effect on updraft @@ -2877,7 +2839,7 @@ def define_updraft_properties( thlu[0, 0, 1] = thlsrc qtu[0, 0, 1] = qtsrc - thj, qvj, qlj, qij, qse, id_check = conden(prel, thlsrc, qtsrc, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(prel, thlsrc, qtsrc, esx) if id_check == 1: condensation = True @@ -2914,7 +2876,6 @@ def define_updraft_properties( def define_env_properties( condensation: BoolFieldIJ, - iteration: int32, krel: IntField, kinv: IntField, ssu0: FloatField, @@ -2960,7 +2921,6 @@ def define_env_properties( Arguments: condensation [BoolFieldIJ]: Mask that indicates if condensation has occurred - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) krel [IntField]: Release layer where buoyancy sorting first occurs kinv [IntField]: Inversion layer with PBL top interface as lower interface PGFc [Float]: Pressure gradient force @@ -3281,7 +3241,7 @@ def buoyancy_sorting( # liquid water temperature instead of temperature as the argument # of "qsat". But note normal argument of "qsat" is temperature. - thj, qvj, qlj, qij, qse, id_check = conden(pe, thle, qte, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pe, thle, qte, esx) if id_check == 1: condensation = True @@ -3317,10 +3277,10 @@ def buoyancy_sorting( rhomid0j = pe / (constants.MAPL_RDRY * thv0j * exne) qsat_arg = thle * exne qsatpe_tmp = qsat_pe / 100.0 - qs, _ = saturation_specific_humidity(qsat_arg, qsatpe_tmp * 100.0, ese, esx) + qs, _ = saturation_specific_humidity(qsat_arg, qsatpe_tmp * 100.0, esx) excess0 = qte - qs - thj, qvj, qlj, qij, qse, id_check = conden(pe, thlue, qtue, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pe, thlue, qtue, esx) if id_check == 1: condensation = True @@ -3371,7 +3331,7 @@ def buoyancy_sorting( + ((constants.MAPL_LATENT_HEAT_SUBLIMATION / constants.MAPL_CP / exne) * exqi) ) - thj, qvj, qlj, qij, qse, id_check = conden(pe, thlue, qtue, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pe, thlue, qtue, esx) if id_check == 1: condensation = True @@ -3407,7 +3367,7 @@ def buoyancy_sorting( tj = thj * exne # This 'tj' is used for computing thermo. coeffs. below qsat_arg = thlue * exne pe_tmp = qsat_pe / 100.0 - qs, _ = saturation_specific_humidity(qsat_arg, pe_tmp * 100.0, ese, esx) + qs, _ = saturation_specific_humidity(qsat_arg, pe_tmp * 100.0, esx) excessu = qtue - qs # Calculate critical mixing fraction, 'xc'. Mixture with @@ -3461,7 +3421,7 @@ def buoyancy_sorting( thlxsat = thlue + xsat * (thle - thlue) qtxsat = qtue + xsat * (qte - qtue) - thj, qvj, qlj, qij, qse, id_check = conden(pe, thlxsat, qtxsat, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pe, thlxsat, qtxsat, esx) if id_check == 1: condensation = True @@ -3674,13 +3634,7 @@ def buoyancy_sorting( # significantly modify this cloud microphysics, # including precipitation-induced downdraft also. - thj, qvj, qlj, qij, qse, id_check = conden( - pifc0[0, 0, 1], - thlu[0, 0, 1], - qtu[0, 0, 1], - ese, - esx, - ) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], esx) if id_check == 1: condensation = True @@ -3753,13 +3707,7 @@ def buoyancy_sorting( # Update 'thvu(k)' after detraining condensate # from cumulus updraft. - thj, qvj, qlj, qij, qse, id_check = conden( - pifc0[0, 0, 1], - thlu[0, 0, 1], - qtu[0, 0, 1], - ese, - esx, - ) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], esx) if id_check == 1: condensation = True @@ -3972,7 +3920,6 @@ def calc_ppen( dp0: FloatField, wtwb: FloatFieldIJ, ppen: FloatFieldIJ, - iteration: int32, ): """ Calculate 'ppen( < 0 )', updraft penetrative distance from the lower @@ -4089,7 +4036,6 @@ def recalc_condensate( umf_temp: FloatField, fdr: FloatField, xco: FloatField, - iteration: int32, cush: FloatFieldIJ, umf_out: FloatField, dcm_out: FloatField, @@ -4143,7 +4089,6 @@ def recalc_condensate( umf_zint [FloatField]: Updraft mass flux at the interfaces [kg/m2/s] emf [FloatField]: [?] ufrc [FloatField]: Cumulus updraft fraction [fraction] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) condensation [BoolFieldIJ]: Mask that indicates if condensation has occurred umf_out [FloatField]: Updraft mass flux at the interfaces [kg/m2/s] qtflx_out [FloatField]: Mixing ratio flux [?] @@ -4201,7 +4146,7 @@ def recalc_condensate( with computation(FORWARD), interval(...): if not condensation: - thj, qvj, qlj, qij, qse, id_check = conden(pifc0.at(K=kpen) + ppen, thlu_top, qtu_top, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0.at(K=kpen) + ppen, thlu_top, qtu_top, esx) with computation(FORWARD), interval(...): if not condensation: @@ -4387,7 +4332,6 @@ def calc_entrainment_mass_flux( uu_emf: FloatField, vu_emf: FloatField, emf: FloatField, - iteration: int32, ): """ Calculate downward penetrative entrainment mass flux, 'emf(k) < 0', and @@ -4427,7 +4371,6 @@ def calc_entrainment_mass_flux( tr0 [FloatField_NTracers]: Environmental tracers [#, kg/kg] sstr0 [FloatField_NTracers]: Convective tracer [?] use_cumpenent [Int]: Cumulative penetrative entrainment - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) tru_emf [FloatField_NTracers]: Penetrative Downdraft tracers at entraining interfaces [#, kg/kg] thlu_emf [FloatField]: Penetrative downdraft liquid potential temperature at entraining interfaces [K] qtu_emf [FloatField]: Penetrative downdraft total water at entraining interfaces [kg/kg] @@ -4593,7 +4536,6 @@ def calc_pbl_fluxes( sstr0: FloatField_NTracers, trflx: FloatField_NTracers, xflx_ndim: FloatField_NTracers, - iteration: int32, ): """ Stencil to compute turbulent heat, moisture, momentum flux at all interfaces. @@ -4622,7 +4564,6 @@ def calc_pbl_fluxes( trsrc [FloatFieldIJ_NTracers]: Tracers of cumulus source air [?] tr0 [FloatField_NTracers]: Environmental tracers [#, kg/kg] sstr0 [FloatField_NTracers]: Convective tracer [?] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) xflx [FloatField]: PBL flux [?] qtflx [FloatField]: Mixing ratio flux [?] uflx [FloatField]: Zonal wind flux [m/s2] @@ -4917,7 +4858,6 @@ def non_buoyancy_sorting_fluxes( qtflx: FloatField, uplus: FloatFieldIJ, vplus: FloatFieldIJ, - iteration: int32, ): """ 2. Calculate non-buoyancy sorting fluxes : kinv <= k <= krel - 1 @@ -5010,7 +4950,6 @@ def buoyancy_sorting_fluxes( uflx: FloatField, vflx: FloatField, slflx: FloatField, - iteration: int32, ): """ 3. Calculate buoyancy sorting fluxes : krel <= k <= kbup - 1 @@ -5039,7 +4978,6 @@ def buoyancy_sorting_fluxes( ssu0 [FloatField]: [?] ssv0 [FloatField]: [?] dotransport [Int]: Transport tracers [1 true] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) tru [FloatField_NTracers]: Updraft tracers [#, kg/kg] tr0 [FloatField_NTracers]: Environmental tracers [#, kg/kg] sstr0 [FloatField_NTracers]: Convective tracer [?] @@ -5107,7 +5045,6 @@ def penetrative_entrainment_fluxes( esx: GlobalTable_saturation_tables, qlten_sink: FloatField, qiten_sink: FloatField, - iteration: int32, cush: FloatFieldIJ, umf_out: FloatField, dcm_out: FloatField, @@ -5190,7 +5127,6 @@ def penetrative_entrainment_fluxes( dt [Float]: Timestep [s] ese [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] esx [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) condensation [BoolFieldIJ]: Mask that indicates if condensation has occurred trflx [FloatField_NTracers]: Updraft/pen.entrainment tracer flux [#/m2/s, kg/kg/m2/s] uflx [FloatField]: Zonal wind flux [m/s2] @@ -5309,7 +5245,7 @@ def penetrative_entrainment_fluxes( if K <= kpen: thl_prog = thl0 + thlten_sub * dt qt_prog = max(qt0 + qtten_sub * dt, 1.0e-12) - thj, qvj, qlj, qij, qse, id_check = conden(pmid0, thl_prog, qt_prog, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pmid0, thl_prog, qt_prog, esx) if id_check == 1: condensation = True @@ -5357,7 +5293,6 @@ def calc_momentum_tendency( vf: FloatField, uten: FloatField, vten: FloatField, - iteration: int32, ): """ Stencil to calculate momentum tendency at each layer. @@ -5637,7 +5572,7 @@ def calc_thermodynamic_tendencies( qlj_2D = 0.0 qij_2D = 0.0 elif K == krel: - thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(prel, thlu, qtu, ese, esx) + thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(prel, thlu, qtu, esx) if id_check == 1: condensation = True @@ -5670,7 +5605,7 @@ def calc_thermodynamic_tendencies( if not condensation: qlubelow = qlj_2D qiubelow = qij_2D - thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], ese, esx) + thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], esx) if id_check == 1: condensation = True @@ -5707,7 +5642,7 @@ def calc_thermodynamic_tendencies( elif K == kpen: if not condensation: - thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(pifc0 + ppen, thlu_top, qtu_top, ese, esx) + thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(pifc0 + ppen, thlu_top, qtu_top, esx) if id_check == 1: condensation = True @@ -5746,7 +5681,7 @@ def calc_thermodynamic_tendencies( else: if not condensation: - thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], ese, esx) + thj, qvj, qlj_2D, qij_2D, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], esx) if id_check == 1: condensation = True @@ -5813,13 +5748,7 @@ def calc_thermodynamic_tendencies( # entrained airs in k = kbup layer. if K == kbup: - thj, qvj, ql_emf_kbup, qi_emf_kbup, qse, id_check = conden( - pmid0, - thlu_emf[0, 0, 1], - qtu_emf[0, 0, 1], - ese, - esx, - ) + thj, qvj, ql_emf_kbup, qi_emf_kbup, qse, id_check = conden(pmid0, thlu_emf[0, 0, 1], qtu_emf[0, 0, 1], esx) if id_check == 1: condensation = True @@ -5908,7 +5837,6 @@ def prevent_negative_condensate( dp0: FloatField, qiten: FloatField, qmin: FloatField, - iteration: int32, ): """ Stencil to prevent the onset-of negative condensate at the next time step. @@ -6007,7 +5935,6 @@ def calc_tracer_tendencies( tr0: FloatField_NTracers, trflx: FloatField_NTracers, trten: FloatField_NTracers, - iteration: int32, ): """ Stencil to compute tendencies of convective tracers. @@ -6019,7 +5946,6 @@ def calc_tracer_tendencies( dp0 [FloatField]: Environmental layer pressure thickness [Pa] > 0 tr0 [FloatField_NTracers]: Environmental tracers [#, kg/kg] trflx [FloatField_NTracers]: Updraft/pen.entrainment tracer flux [#/m2/s, kg/kg/m2/s] - iteration [int32]: Iteration of implicit CIN loop (i.e., 0 or 1) condensation [BoolFieldIJ]: Mask that indicates if condensation has occurred trflx_d [FloatField_NTracers]: Adjustive [?] trflx_u [FloatField_NTracers]: Adjustive [?] @@ -6163,7 +6089,7 @@ def compute_diagnostic_outputs( """ with computation(FORWARD), interval(...): if not condensation: - thj, qvj, qlj, qij, qse, id_check = conden(prel, thlu.at(K=krel), qtu.at(K=krel), ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(prel, thlu.at(K=krel), qtu.at(K=krel), esx) if id_check == 1: condensation = True @@ -6227,7 +6153,6 @@ def calc_cumulus_condensate_at_interface( rlwp: FloatFieldIJ, riwp: FloatFieldIJ, cufrc: FloatField, - iteration: int32, cush: FloatFieldIJ, umf_out: FloatField, dcm_out: FloatField, @@ -6310,9 +6235,9 @@ def calc_cumulus_condensate_at_interface( # Note 'ppen < 0' and at 'k=kpen' layer, I used 'thlu_top'&'qtu_top' # which explicitly considered zero or non-zero 'fer(kpen)'. if K == kpen: - thj, qvj, qlj, qij, qse, id_check = conden(pifc0 + ppen, thlu_top, qtu_top, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0 + ppen, thlu_top, qtu_top, esx) else: - thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thlu[0, 0, 1], qtu[0, 0, 1], esx) if id_check == 1: condensation = True @@ -6574,7 +6499,6 @@ def adjust_implicit_CIN_inputs2( cufrc_s: FloatField, fer_s: FloatField, fdr_s: FloatField, - iteration: int32, ): """ Part II of Adjust Implicit CIN Inputs @@ -6597,16 +6521,8 @@ def adjust_implicit_CIN_inputs2( qtflx_s[0, 0, 1] = qtflx[0, 0, 1] uflx_s[0, 0, 1] = uflx[0, 0, 1] vflx_s[0, 0, 1] = vflx[0, 0, 1] - qcu_s = qcu - qlu_s = qlu - qiu_s = qiu fer_s = fer fdr_s = fdr - xc_s = xco - cin_s = cin_IJ - cinlcl_s = cinlcl_IJ - cbmf_s = cbmf - qc_s = qc qldet_s = qlten_det qidet_s = qiten_det qlsub_s = qlten_sink @@ -6649,7 +6565,6 @@ def recalc_environmental_variables( s0: FloatField, t0: FloatField, tr0_temp: FloatField, - iteration: int32, cush: FloatFieldIJ, umf_out: FloatField, dcm_out: FloatField, @@ -6803,7 +6718,7 @@ def recalc_environmental_variables( if not condensation: thl0bot = thl0 + ssthl0 * (pifc0 - pmid0) qt0bot = qt0 + ssqt0 * (pifc0 - pmid0) - thj, qvj, qlj, qij, qse, id_check = conden(pifc0, thl0bot, qt0bot, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0, thl0bot, qt0bot, esx) if id_check == 1: condensation = True umf_out = 0.0 @@ -6838,7 +6753,7 @@ def recalc_environmental_variables( thl0top = thl0 + ssthl0 * (pifc0[0, 0, 1] - pmid0) qt0top = qt0 + ssqt0 * (pifc0[0, 0, 1] - pmid0) - thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thl0top, qt0top, ese, esx) + thj, qvj, qlj, qij, qse, id_check = conden(pifc0[0, 0, 1], thl0top, qt0top, esx) if id_check == 1: condensation = True @@ -6885,7 +6800,6 @@ def _reset_mask( def update_output_variables1( condensation: BoolFieldIJ, - del_CIN: FloatFieldIJ, umf_zint: FloatField, kinv: IntField, zifc0: FloatField, @@ -7000,8 +6914,8 @@ def update_output_variables1( if not condensation: umf_out = umf_zint - if K <= kinv: - umf_out = umf_zint.at(K=kinv) * zifc0 / zifc0.at(K=kinv) + if K < kinv: + umf_out = umf_zint.at(K=kinv - 1) * zifc0 / zifc0.at(K=kinv - 1) cufrc_out = cufrc dcm_out = dcm @@ -7015,24 +6929,6 @@ def update_output_variables1( qsten_out = qsten cush_inout = cush - with computation(FORWARD), interval(...): - if del_CIN <= 0.0: - umf_outvar = umf_out - cufrc_outvar = cufrc_out - dcm_outvar = dcm_out - qvten_outvar = qvten_out - qlten_outvar = qlten_out - qiten_outvar = qiten_out - sten_outvar = sten_out - uten_outvar = uten_out - vten_outvar = vten_out - qrten_outvar = qrten_out - qsten_outvar = qsten_out - cush_inoutvar = cush_inout - - if del_CIN > 0.0: - umf_outvar = umf_zint - def update_output_variables2( condensation: BoolFieldIJ, @@ -7145,7 +7041,6 @@ def compute_uwshcu_invert_after( qisub_inv: FloatField, CNV_Tracers: FloatField_NTracers, cush: FloatFieldIJ, - condensation: BoolFieldIJ, ): """ Stencil to revert k levels for all UW outputs. @@ -7870,11 +7765,11 @@ def __init__( # Create 4D tracer fields self.quantity_factory.update_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -7897,318 +7792,6 @@ def __init__( self.trflx_d = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM, "ntracers"], units="na") self.trflx_u = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM, "ntracers"], units="na") - def _reset_locals(self): - # Dev NOTE: this entire code should dissapear when implementation of `LocalState.fill()` - # is deployed in NDSL - self.trsrc.data[:] = 0 - self.trsrc_o.data[:] = 0 - self.tre.data[:] = 0 - self.trmin.data[:] = 0 - self.sstr0.data[:] = 0 - self.tr0.data[:] = 0 - self.tr0_o.data[:] = 0 - self.sstr0_o.data[:] = 0 - self.trten.data[:] = 0 - self.tr0_s.data[:] = 0 - self.tr0_inout.data[:] = 0 - self.trflx.data[:] = 0 - self.tru.data[:] = 0 - self.tru_emf.data[:] = 0 - self.xflx_ndim.data[:] = 0 - self.trflx_d.data[:] = 0 - self.trflx_u.data[:] = 0 - self.locals.PTR2D.data[:] = 0 - self.locals.MASS.data[:] = 0 - self.locals.ssthl0.data[:] = 0 - self.locals.ssqt0.data[:] = 0 - self.locals.ssu0.data[:] = 0 - self.locals.ssv0.data[:] = 0 - self.locals.thj.data[:] = 0 - self.locals.qlj.data[:] = 0 - self.locals.qvj.data[:] = 0 - self.locals.qse.data[:] = 0 - self.locals.qij.data[:] = 0 - self.locals.tr0_temp.data[:] = 0 - self.locals.thv0top.data[:] = 0 - self.locals.thv0bot.data[:] = 0 - self.locals.thvl0top.data[:] = 0 - self.locals.dcm_out.data[:] = 0 - self.locals.qvten_out.data[:] = 0 - self.locals.qlten_out.data[:] = 0 - self.locals.qiten_out.data[:] = 0 - self.locals.sten_out.data[:] = 0 - self.locals.uten_out.data[:] = 0 - self.locals.vten_out.data[:] = 0 - self.locals.qrten_out.data[:] = 0 - self.locals.qsten_out.data[:] = 0 - self.locals.cufrc_out.data[:] = 0 - self.locals.fer_out.data[:] = 0 - self.locals.fdr_out.data[:] = 0 - self.locals.thvlavg.data[:] = 0 - self.locals.tkeavg.data[:] = 0 - self.locals.uavg.data[:] = 0 - self.locals.vavg.data[:] = 0 - self.locals.thvlmin.data[:] = 0 - self.locals.qtavg.data[:] = 0 - self.locals.zmid0.data[:] = 0 - self.locals.qt0.data[:] = 0 - self.locals.thvl0.data[:] = 0 - self.locals.thvl0bot.data[:] = 0 - self.locals.t0.data[:] = 0 - self.locals.qv0.data[:] = 0 - self.locals.pmid0.data[:] = 0 - self.locals.pmid0_inv.data[:] = 0 - self.locals.thl0.data[:] = 0 - self.locals.thlsrc.data[:] = 0 - self.locals.usrc.data[:] = 0 - self.locals.vsrc.data[:] = 0 - self.locals.plcl.data[:] = 0 - self.locals.thl0lcl.data[:] = 0 - self.locals.qt0lcl.data[:] = 0 - self.locals.thv0lcl.data[:] = 0 - self.locals.plfc.data[:] = 0 - self.locals.fer_outvar.data[:] = 0 - self.locals.fdr_outvar.data[:] = 0 - self.locals.cin.data[:] = 0 - self.locals.thvubot.data[:] = 0 - self.locals.thvutop.data[:] = 0 - self.locals.thvlsrc.data[:] = 0 - self.locals.thl0top.data[:] = 0 - self.locals.qt0top.data[:] = 0 - self.locals.qldet_outvar.data[:] = 0 - self.locals.qidet_outvar.data[:] = 0 - self.locals.qlsub_outvar.data[:] = 0 - self.locals.qisub_outvar.data[:] = 0 - self.locals.dcm_outvar.data[:] = 0 - self.locals.qvten_outvar.data[:] = 0 - self.locals.qlten_outvar.data[:] = 0 - self.locals.qiten_outvar.data[:] = 0 - self.locals.sten_outvar.data[:] = 0 - self.locals.uten_outvar.data[:] = 0 - self.locals.vten_outvar.data[:] = 0 - self.locals.qrten_outvar.data[:] = 0 - self.locals.qsten_outvar.data[:] = 0 - self.locals.cufrc_outvar.data[:] = 0 - self.locals.usrc_o.data[:] = 0 - self.locals.vsrc_o.data[:] = 0 - self.locals.thv0lcl_o.data[:] = 0 - self.locals.ql0_o.data[:] = 0 - self.locals.qi0_o.data[:] = 0 - self.locals.t0_o.data[:] = 0 - self.locals.s0_o.data[:] = 0 - self.locals.u0_o.data[:] = 0 - self.locals.v0_o.data[:] = 0 - self.locals.qt0_o.data[:] = 0 - self.locals.thl0_o.data[:] = 0 - self.locals.thvl0_o.data[:] = 0 - self.locals.ssthl0_o.data[:] = 0 - self.locals.ssqt0_o.data[:] = 0 - self.locals.thv0bot_o.data[:] = 0 - self.locals.thv0top_o.data[:] = 0 - self.locals.thvl0bot_o.data[:] = 0 - self.locals.thvl0top_o.data[:] = 0 - self.locals.ssu0_o.data[:] = 0 - self.locals.ssv0_o.data[:] = 0 - self.locals.dcm_s.data[:] = 0 - self.locals.qvten_s.data[:] = 0 - self.locals.qlten_s.data[:] = 0 - self.locals.qiten_s.data[:] = 0 - self.locals.sten_s.data[:] = 0 - self.locals.uten_s.data[:] = 0 - self.locals.vten_s.data[:] = 0 - self.locals.qrten_s.data[:] = 0 - self.locals.qsten_s.data[:] = 0 - self.locals.qldet_s.data[:] = 0 - self.locals.qidet_s.data[:] = 0 - self.locals.qlsub_s.data[:] = 0 - self.locals.qisub_s.data[:] = 0 - self.locals.cush_s.data[:] = 0 - self.locals.cufrc_s.data[:] = 0 - self.locals.fer_s.data[:] = 0 - self.locals.fdr_s.data[:] = 0 - self.locals.qtsrc_o.data[:] = 0 - self.locals.thvlsrc_o.data[:] = 0 - self.locals.thlsrc_o.data[:] = 0 - self.locals.qldet_out.data[:] = 0 - self.locals.qidet_out.data[:] = 0 - self.locals.qlsub_out.data[:] = 0 - self.locals.qisub_out.data[:] = 0 - self.locals.ndrop_out.data[:] = 0 - self.locals.nice_out.data[:] = 0 - self.locals.dcm.data[:] = 0 - self.locals.xco.data[:] = 0 - self.locals.qc.data[:] = 0 - self.locals.qlten_det.data[:] = 0 - self.locals.qiten_det.data[:] = 0 - self.locals.qv0_s.data[:] = 0 - self.locals.ql0_s.data[:] = 0 - self.locals.qi0_s.data[:] = 0 - self.locals.s0_s.data[:] = 0 - self.locals.t0_s.data[:] = 0 - self.locals.u0_s.data[:] = 0 - self.locals.v0_s.data[:] = 0 - self.locals.slten.data[:] = 0 - self.locals.qv0_o.data[:] = 0 - self.locals.plcl_o.data[:] = 0 - self.locals.plfc_o.data[:] = 0 - self.locals.tkeavg_o.data[:] = 0 - self.locals.thvlmin_o.data[:] = 0 - self.locals.ufrclcl.data[:] = 0 - self.locals.qcu.data[:] = 0 - self.locals.qlu.data[:] = 0 - self.locals.qiu.data[:] = 0 - self.locals.cufrc.data[:] = 0 - self.locals.qtsrc.data[:] = 0 - self.locals.uplus_3D.data[:] = 0 - self.locals.vplus_3D.data[:] = 0 - self.locals.prel.data[:] = 0 - self.locals.thv0rel.data[:] = 0 - self.locals.winv.data[:] = 0 - self.locals.cbmf.data[:] = 0 - self.locals.rho0inv.data[:] = 0 - self.locals.ufrcinv.data[:] = 0 - self.locals.wlcl.data[:] = 0 - self.locals.qsat_pe.data[:] = 0 - self.locals.thlue.data[:] = 0 - self.locals.qtue.data[:] = 0 - self.locals.wue.data[:] = 0 - self.locals.rei.data[:] = 0 - self.locals.fer.data[:] = 0 - self.locals.dwten.data[:] = 0 - self.locals.diten.data[:] = 0 - self.locals.ql0.data[:] = 0 - self.locals.qi0.data[:] = 0 - self.locals.uten.data[:] = 0 - self.locals.vten.data[:] = 0 - self.locals.uf.data[:] = 0 - self.locals.vf.data[:] = 0 - self.locals.dwten_temp.data[:] = 0 - self.locals.diten_temp.data[:] = 0 - self.locals.fdr.data[:] = 0 - self.locals.qlten_sink.data[:] = 0 - self.locals.qiten_sink.data[:] = 0 - self.locals.qrten.data[:] = 0 - self.locals.qsten.data[:] = 0 - self.locals.s0.data[:] = 0 - self.locals.qvten.data[:] = 0 - self.locals.qlten.data[:] = 0 - self.locals.sten.data[:] = 0 - self.locals.qiten.data[:] = 0 - self.locals.qmin.data[:] = 0 - self.locals.pmid0_in.data[:] = 0 - self.locals.u0_in.data[:] = 0 - self.locals.v0_in.data[:] = 0 - self.locals.u0.data[:] = 0 - self.locals.v0.data[:] = 0 - self.locals.zmid0_in.data[:] = 0 - self.locals.zmid0_inv.data[:] = 0 - self.locals.exnmid0_in.data[:] = 0 - self.locals.exnmid0_inv.data[:] = 0 - self.locals.exnifc0_inv.data[:] = 0 - self.locals.dp0_in.data[:] = 0 - self.locals.dp0_inv.data[:] = 0 - self.locals.qv0_in.data[:] = 0 - self.locals.ql0_in.data[:] = 0 - self.locals.qi0_in.data[:] = 0 - self.locals.th0_in.data[:] = 0 - self.locals.cinlcl.data[:] = 0 - self.locals.cush_inout.data[:] = 0 - self.locals.dpi.data[:] = 0 - self.locals.thvlmin_IJ.data[:] = 0 - self.locals.wcrit.data[:] = 0 - self.locals.alpha.data[:] = 0 - self.locals.del_CIN.data[:] = 0 - self.locals.cin_IJ.data[:] = 0 - self.locals.plfc_IJ.data[:] = 0 - self.locals.cinlcl_IJ.data[:] = 0 - self.locals.pe.data[:] = 0 - self.locals.thle.data[:] = 0 - self.locals.qte.data[:] = 0 - self.locals.dpe.data[:] = 0 - self.locals.exne.data[:] = 0 - self.locals.thvebot.data[:] = 0 - self.locals.ue.data[:] = 0 - self.locals.ve.data[:] = 0 - self.locals.drage.data[:] = 0 - self.locals.bogbot.data[:] = 0 - self.locals.bogtop.data[:] = 0 - self.locals.rhomid0j.data[:] = 0 - self.locals.cush_inoutvar.data[:] = 0 - self.locals.uplus.data[:] = 0 - self.locals.vplus.data[:] = 0 - self.locals.cin_i.data[:] = 0 - self.locals.cinlcl_i.data[:] = 0 - self.locals.ke.data[:] = 0 - self.locals.thlu_top.data[:] = 0 - self.locals.qtu_top.data[:] = 0 - self.locals.cldhgt.data[:] = 0 - self.locals.qlubelow.data[:] = 0 - self.locals.qiubelow.data[:] = 0 - self.locals.qlj_2D.data[:] = 0 - self.locals.qij_2D.data[:] = 0 - self.locals.qcubelow.data[:] = 0 - self.locals.rcwp.data[:] = 0 - self.locals.rlwp.data[:] = 0 - self.locals.riwp.data[:] = 0 - self.locals.ppen.data[:] = 0 - self.locals.tscaleh.data[:] = 0 - self.locals.wtwb.data[:] = 0 - self.locals.cnvtrmax.data[:] = 0 - self.locals.qtu_emf.data[:] = 0 - self.locals.umf_out.data[:] = 0 - self.locals.qtflx_out.data[:] = 0 - self.locals.slflx_out.data[:] = 0 - self.locals.slflx.data[:] = 0 - self.locals.thlu_emf.data[:] = 0 - self.locals.uu_emf.data[:] = 0 - self.locals.vu_emf.data[:] = 0 - self.locals.uemf.data[:] = 0 - self.locals.uflx_out.data[:] = 0 - self.locals.vflx_out.data[:] = 0 - self.locals.ufrc.data[:] = 0 - self.locals.wu.data[:] = 0 - self.locals.emf.data[:] = 0 - self.locals.thlu.data[:] = 0 - self.locals.qtu.data[:] = 0 - self.locals.uu.data[:] = 0 - self.locals.vu.data[:] = 0 - self.locals.umf_zint.data[:] = 0 - self.locals.thvu.data[:] = 0 - self.locals.umf_outvar.data[:] = 0 - self.locals.qtflx_outvar.data[:] = 0 - self.locals.slflx_outvar.data[:] = 0 - self.locals.uflx_outvar.data[:] = 0 - self.locals.vflx_outvar.data[:] = 0 - self.locals.slflx_s.data[:] = 0 - self.locals.qtflx_s.data[:] = 0 - self.locals.uflx_s.data[:] = 0 - self.locals.vflx_s.data[:] = 0 - self.locals.qtflx.data[:] = 0 - self.locals.uflx.data[:] = 0 - self.locals.ufrc_s.data[:] = 0 - self.locals.xflx.data[:] = 0 - self.locals.vflx.data[:] = 0 - self.locals.umf_temp.data[:] = 0 - self.locals.umf_s.data[:] = 0 - self.locals.tke_in.data[:] = 0 - self.locals.pifc0_in.data[:] = 0 - self.locals.zifc0_in.data[:] = 0 - self.locals.zifc0_inv.data[:] = 0 - self.locals.exnifc0_in.data[:] = 0 - self.locals.kinv.data[:] = 0 - self.locals.klcl.data[:] = 0 - self.locals.klfc.data[:] = 0 - self.locals.kinv_o.data[:] = 0 - self.locals.klcl_o.data[:] = 0 - self.locals.klfc_o.data[:] = 0 - self.locals.kbup.data[:] = 0 - self.locals.krel.data[:] = 0 - self.locals.kpen.data[:] = 0 - self.locals.kbup_IJ.data[:] = 0 - self.locals.klfc_IJ.data[:] = 0 - self.locals.kpen_IJ.data[:] = 0 - self.locals.kpbl_in.data[:] = 0 - def __call__(self, state: UWState): """ University of Washington Shallow Convection Scheme @@ -8231,7 +7814,322 @@ def __call__(self, state: UWState): Arguments: state: UWState """ - self._reset_locals() + # Reset temporaries + # Dev NOTE: for orchestration to not segfault, we can't do this in a class method. + # reason is unknown - to be investigated once we are done with the push + # for the presentation. + self.trsrc[:] = 0 + self.trsrc_o[:] = 0 + self.tre[:] = 0 + self.trmin[:] = 0 + self.sstr0[:] = 0 + self.tr0[:] = 0 + self.tr0_o[:] = 0 + self.sstr0_o[:] = 0 + self.trten[:] = 0 + self.tr0_s[:] = 0 + self.tr0_inout[:] = 0 + self.trflx[:] = 0 + self.tru[:] = 0 + self.tru_emf[:] = 0 + self.xflx_ndim[:] = 0 + self.trflx_d[:] = 0 + self.trflx_u[:] = 0 + + # Reset locals + # Dev NOTE: this entire code should dissapear when implementation of `LocalState.fill()` + # is deployed in NDSL + self.locals.PTR2D[:] = 0 + self.locals.MASS[:] = 0 + self.locals.ssthl0[:] = 0 + self.locals.ssqt0[:] = 0 + self.locals.ssu0[:] = 0 + self.locals.ssv0[:] = 0 + self.locals.thj[:] = 0 + self.locals.qlj[:] = 0 + self.locals.qvj[:] = 0 + self.locals.qse[:] = 0 + self.locals.qij[:] = 0 + self.locals.tr0_temp[:] = 0 + self.locals.thv0top[:] = 0 + self.locals.thv0bot[:] = 0 + self.locals.thvl0top[:] = 0 + self.locals.dcm_out[:] = 0 + self.locals.qvten_out[:] = 0 + self.locals.qlten_out[:] = 0 + self.locals.qiten_out[:] = 0 + self.locals.sten_out[:] = 0 + self.locals.uten_out[:] = 0 + self.locals.vten_out[:] = 0 + self.locals.qrten_out[:] = 0 + self.locals.qsten_out[:] = 0 + self.locals.cufrc_out[:] = 0 + self.locals.fer_out[:] = 0 + self.locals.fdr_out[:] = 0 + self.locals.thvlavg[:] = 0 + self.locals.tkeavg[:] = 0 + self.locals.uavg[:] = 0 + self.locals.vavg[:] = 0 + self.locals.thvlmin[:] = 0 + self.locals.qtavg[:] = 0 + self.locals.zmid0[:] = 0 + self.locals.qt0[:] = 0 + self.locals.thvl0[:] = 0 + self.locals.thvl0bot[:] = 0 + self.locals.t0[:] = 0 + self.locals.qv0[:] = 0 + self.locals.pmid0[:] = 0 + self.locals.pmid0_inv[:] = 0 + self.locals.thl0[:] = 0 + self.locals.thlsrc[:] = 0 + self.locals.usrc[:] = 0 + self.locals.vsrc[:] = 0 + self.locals.plcl[:] = 0 + self.locals.thl0lcl[:] = 0 + self.locals.qt0lcl[:] = 0 + self.locals.thv0lcl[:] = 0 + self.locals.plfc[:] = 0 + self.locals.fer_outvar[:] = 0 + self.locals.fdr_outvar[:] = 0 + self.locals.cin[:] = 0 + self.locals.thvubot[:] = 0 + self.locals.thvutop[:] = 0 + self.locals.thvlsrc[:] = 0 + self.locals.thl0top[:] = 0 + self.locals.qt0top[:] = 0 + self.locals.qldet_outvar[:] = 0 + self.locals.qidet_outvar[:] = 0 + self.locals.qlsub_outvar[:] = 0 + self.locals.qisub_outvar[:] = 0 + self.locals.dcm_outvar[:] = 0 + self.locals.qvten_outvar[:] = 0 + self.locals.qlten_outvar[:] = 0 + self.locals.qiten_outvar[:] = 0 + self.locals.sten_outvar[:] = 0 + self.locals.uten_outvar[:] = 0 + self.locals.vten_outvar[:] = 0 + self.locals.qrten_outvar[:] = 0 + self.locals.qsten_outvar[:] = 0 + self.locals.cufrc_outvar[:] = 0 + self.locals.usrc_o[:] = 0 + self.locals.vsrc_o[:] = 0 + self.locals.thv0lcl_o[:] = 0 + self.locals.ql0_o[:] = 0 + self.locals.qi0_o[:] = 0 + self.locals.t0_o[:] = 0 + self.locals.s0_o[:] = 0 + self.locals.u0_o[:] = 0 + self.locals.v0_o[:] = 0 + self.locals.qt0_o[:] = 0 + self.locals.thl0_o[:] = 0 + self.locals.thvl0_o[:] = 0 + self.locals.ssthl0_o[:] = 0 + self.locals.ssqt0_o[:] = 0 + self.locals.thv0bot_o[:] = 0 + self.locals.thv0top_o[:] = 0 + self.locals.thvl0bot_o[:] = 0 + self.locals.thvl0top_o[:] = 0 + self.locals.ssu0_o[:] = 0 + self.locals.ssv0_o[:] = 0 + self.locals.dcm_s[:] = 0 + self.locals.qvten_s[:] = 0 + self.locals.qlten_s[:] = 0 + self.locals.qiten_s[:] = 0 + self.locals.sten_s[:] = 0 + self.locals.uten_s[:] = 0 + self.locals.vten_s[:] = 0 + self.locals.qrten_s[:] = 0 + self.locals.qsten_s[:] = 0 + self.locals.qldet_s[:] = 0 + self.locals.qidet_s[:] = 0 + self.locals.qlsub_s[:] = 0 + self.locals.qisub_s[:] = 0 + self.locals.cush_s[:] = 0 + self.locals.cufrc_s[:] = 0 + self.locals.fer_s[:] = 0 + self.locals.fdr_s[:] = 0 + self.locals.qtsrc_o[:] = 0 + self.locals.thvlsrc_o[:] = 0 + self.locals.thlsrc_o[:] = 0 + self.locals.qldet_out[:] = 0 + self.locals.qidet_out[:] = 0 + self.locals.qlsub_out[:] = 0 + self.locals.qisub_out[:] = 0 + self.locals.ndrop_out[:] = 0 + self.locals.nice_out[:] = 0 + self.locals.dcm[:] = 0 + self.locals.xco[:] = 0 + self.locals.qc[:] = 0 + self.locals.qlten_det[:] = 0 + self.locals.qiten_det[:] = 0 + self.locals.qv0_s[:] = 0 + self.locals.ql0_s[:] = 0 + self.locals.qi0_s[:] = 0 + self.locals.s0_s[:] = 0 + self.locals.t0_s[:] = 0 + self.locals.u0_s[:] = 0 + self.locals.v0_s[:] = 0 + self.locals.slten[:] = 0 + self.locals.qv0_o[:] = 0 + self.locals.plcl_o[:] = 0 + self.locals.plfc_o[:] = 0 + self.locals.tkeavg_o[:] = 0 + self.locals.thvlmin_o[:] = 0 + self.locals.ufrclcl[:] = 0 + self.locals.qcu[:] = 0 + self.locals.qlu[:] = 0 + self.locals.qiu[:] = 0 + self.locals.cufrc[:] = 0 + self.locals.qtsrc[:] = 0 + self.locals.uplus_3D[:] = 0 + self.locals.vplus_3D[:] = 0 + self.locals.prel[:] = 0 + self.locals.thv0rel[:] = 0 + self.locals.winv[:] = 0 + self.locals.cbmf[:] = 0 + self.locals.rho0inv[:] = 0 + self.locals.ufrcinv[:] = 0 + self.locals.wlcl[:] = 0 + self.locals.qsat_pe[:] = 0 + self.locals.thlue[:] = 0 + self.locals.qtue[:] = 0 + self.locals.wue[:] = 0 + self.locals.rei[:] = 0 + self.locals.fer[:] = 0 + self.locals.dwten[:] = 0 + self.locals.diten[:] = 0 + self.locals.ql0[:] = 0 + self.locals.qi0[:] = 0 + self.locals.uten[:] = 0 + self.locals.vten[:] = 0 + self.locals.uf[:] = 0 + self.locals.vf[:] = 0 + self.locals.dwten_temp[:] = 0 + self.locals.diten_temp[:] = 0 + self.locals.fdr[:] = 0 + self.locals.qlten_sink[:] = 0 + self.locals.qiten_sink[:] = 0 + self.locals.qrten[:] = 0 + self.locals.qsten[:] = 0 + self.locals.s0[:] = 0 + self.locals.qvten[:] = 0 + self.locals.qlten[:] = 0 + self.locals.sten[:] = 0 + self.locals.qiten[:] = 0 + self.locals.qmin[:] = 0 + self.locals.pmid0_in[:] = 0 + self.locals.u0_in[:] = 0 + self.locals.v0_in[:] = 0 + self.locals.u0[:] = 0 + self.locals.v0[:] = 0 + self.locals.zmid0_in[:] = 0 + self.locals.zmid0_inv[:] = 0 + self.locals.exnmid0_in[:] = 0 + self.locals.exnmid0_inv[:] = 0 + self.locals.exnifc0_inv[:] = 0 + self.locals.dp0_in[:] = 0 + self.locals.dp0_inv[:] = 0 + self.locals.qv0_in[:] = 0 + self.locals.ql0_in[:] = 0 + self.locals.qi0_in[:] = 0 + self.locals.th0_in[:] = 0 + self.locals.cinlcl[:] = 0 + self.locals.cush_inout[:] = 0 + self.locals.dpi[:] = 0 + self.locals.thvlmin_IJ[:] = 0 + self.locals.wcrit[:] = 0 + self.locals.alpha[:] = 0 + self.locals.del_CIN[:] = 0 + self.locals.cin_IJ[:] = 0 + self.locals.plfc_IJ[:] = 0 + self.locals.cinlcl_IJ[:] = 0 + self.locals.pe[:] = 0 + self.locals.thle[:] = 0 + self.locals.qte[:] = 0 + self.locals.dpe[:] = 0 + self.locals.exne[:] = 0 + self.locals.thvebot[:] = 0 + self.locals.ue[:] = 0 + self.locals.ve[:] = 0 + self.locals.drage[:] = 0 + self.locals.bogbot[:] = 0 + self.locals.bogtop[:] = 0 + self.locals.rhomid0j[:] = 0 + self.locals.cush_inoutvar[:] = 0 + self.locals.uplus[:] = 0 + self.locals.vplus[:] = 0 + self.locals.cin_i[:] = 0 + self.locals.cinlcl_i[:] = 0 + self.locals.ke[:] = 0 + self.locals.thlu_top[:] = 0 + self.locals.qtu_top[:] = 0 + self.locals.cldhgt[:] = 0 + self.locals.qlubelow[:] = 0 + self.locals.qiubelow[:] = 0 + self.locals.qlj_2D[:] = 0 + self.locals.qij_2D[:] = 0 + self.locals.qcubelow[:] = 0 + self.locals.rcwp[:] = 0 + self.locals.rlwp[:] = 0 + self.locals.riwp[:] = 0 + self.locals.ppen[:] = 0 + self.locals.tscaleh[:] = 0 + self.locals.wtwb[:] = 0 + self.locals.cnvtrmax[:] = 0 + self.locals.qtu_emf[:] = 0 + self.locals.umf_out[:] = 0 + self.locals.qtflx_out[:] = 0 + self.locals.slflx_out[:] = 0 + self.locals.slflx[:] = 0 + self.locals.thlu_emf[:] = 0 + self.locals.uu_emf[:] = 0 + self.locals.vu_emf[:] = 0 + self.locals.uemf[:] = 0 + self.locals.uflx_out[:] = 0 + self.locals.vflx_out[:] = 0 + self.locals.ufrc[:] = 0 + self.locals.wu[:] = 0 + self.locals.emf[:] = 0 + self.locals.thlu[:] = 0 + self.locals.qtu[:] = 0 + self.locals.uu[:] = 0 + self.locals.vu[:] = 0 + self.locals.umf_zint[:] = 0 + self.locals.thvu[:] = 0 + self.locals.umf_outvar[:] = 0 + self.locals.qtflx_outvar[:] = 0 + self.locals.slflx_outvar[:] = 0 + self.locals.uflx_outvar[:] = 0 + self.locals.vflx_outvar[:] = 0 + self.locals.slflx_s[:] = 0 + self.locals.qtflx_s[:] = 0 + self.locals.uflx_s[:] = 0 + self.locals.vflx_s[:] = 0 + self.locals.qtflx[:] = 0 + self.locals.uflx[:] = 0 + self.locals.ufrc_s[:] = 0 + self.locals.xflx[:] = 0 + self.locals.vflx[:] = 0 + self.locals.umf_temp[:] = 0 + self.locals.umf_s[:] = 0 + self.locals.tke_in[:] = 0 + self.locals.pifc0_in[:] = 0 + self.locals.zifc0_in[:] = 0 + self.locals.zifc0_inv[:] = 0 + self.locals.exnifc0_in[:] = 0 + self.locals.kinv[:] = 0 + self.locals.klcl[:] = 0 + self.locals.klfc[:] = 0 + self.locals.kinv_o[:] = 0 + self.locals.klcl_o[:] = 0 + self.locals.klfc_o[:] = 0 + self.locals.kbup[:] = 0 + self.locals.krel[:] = 0 + self.locals.kpen[:] = 0 + self.locals.kbup_IJ[:] = 0 + self.locals.klfc_IJ[:] = 0 + self.locals.kpen_IJ[:] = 0 + self.locals.kpbl_in[:] = 0 # Initialize masks, default for all masks is False. self._reset_mask(self.condensation, False) @@ -8270,7 +8168,6 @@ def __call__(self, state: UWState): qi0_inv=state.output.qi0_inv, t0_inv=state.input_output.t0_inv, tke_inv=state.input.tke_inv, - tke_flip=self.locals.tke_flip, pifc0_inv=state.input.PLE, zifc0_inv=self.locals.zifc0_inv, exnifc0_inv=self.locals.exnifc0_inv, @@ -8290,6 +8187,7 @@ def __call__(self, state: UWState): qi0_in=self.locals.qi0_in, th0_in=self.locals.th0_in, tke_in=self.locals.tke_in, + tke_flip=self.locals.tke_flip, pifc0_in=self.locals.pifc0_in, zifc0_in=self.locals.zifc0_in, exnifc0_in=self.locals.exnifc0_in, @@ -8314,6 +8212,14 @@ def __call__(self, state: UWState): cush_inout=self.locals.cush_inout, cush=state.input_output.cush, umf_out=self.locals.umf_out, + dcm_out=self.locals.dcm_out, + qldet_out=self.locals.qldet_out, + qidet_out=self.locals.qidet_out, + qlsub_out=self.locals.qlsub_out, + qisub_out=self.locals.qisub_out, + ndrop_out=self.locals.ndrop_out, + nice_out=self.locals.nice_out, + cufrc_out=self.locals.cufrc_out, shfx=state.input.shfx, evap=state.input.evap, qtflx_out=self.locals.qtflx_out, @@ -8328,9 +8234,9 @@ def __call__(self, state: UWState): tr0=self.tr0, tr0_temp=self.locals.tr0_temp, sstr0=self.sstr0, - thl0=self.locals.thl0, ssthl0=self.locals.ssthl0, ssqt0=self.locals.ssqt0, + thl0=self.locals.thl0, ssu0=self.locals.ssu0, ssv0=self.locals.ssv0, tscaleh=self.locals.tscaleh, @@ -8338,14 +8244,6 @@ def __call__(self, state: UWState): fdr_out=self.locals.fdr_out, tpert_out=state.output.tpert_out, qpert_out=state.output.qpert_out, - dcm_out=self.locals.dcm_out, - qldet_out=self.locals.qldet_out, - qidet_out=self.locals.qidet_out, - qlsub_out=self.locals.qlsub_out, - qisub_out=self.locals.qisub_out, - ndrop_out=self.locals.ndrop_out, - nice_out=self.locals.nice_out, - cufrc_out=self.locals.cufrc_out, ) self._compute_thv0_thvl0( @@ -8402,9 +8300,9 @@ def __call__(self, state: UWState): qt0=self.locals.qt0, t0=self.locals.t0, qv0=self.locals.qv0, + thl0=self.locals.thl0, ql0=self.locals.ql0, qi0=self.locals.qi0, - thl0=self.locals.thl0, thv0bot=self.locals.thv0bot, thv0top=self.locals.thv0top, uten=self.locals.uten, @@ -8487,13 +8385,11 @@ def __call__(self, state: UWState): iteration = int32(it_cin) self._find_pbl_height( - iteration=iteration, kpbl_in=self.locals.kpbl_in, condensation=self.condensation, kinv=self.locals.kinv, tscaleh=self.locals.tscaleh, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -8505,6 +8401,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -8533,7 +8430,6 @@ def __call__(self, state: UWState): vavg=self.locals.vavg, thvlavg=self.locals.thvlavg, qtavg=self.locals.qtavg, - iteration=iteration, ) self._find_cumulus_characteristics( @@ -8563,7 +8459,6 @@ def __call__(self, state: UWState): vsrc=self.locals.vsrc, tpert_out=state.output.tpert_out, qpert_out=state.output.qpert_out, - iteration=iteration, ) self._find_klcl( @@ -8571,7 +8466,6 @@ def __call__(self, state: UWState): pifc0=self.locals.pifc0_in, qtsrc=self.locals.qtsrc, thlsrc=self.locals.thlsrc, - ese=self.ese, esx=self.esx, thl0=self.locals.thl0, ssthl0=self.locals.ssthl0, @@ -8583,9 +8477,7 @@ def __call__(self, state: UWState): thl0lcl=self.locals.thl0lcl, qt0lcl=self.locals.qt0lcl, thv0lcl=self.locals.thv0lcl, - iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -8597,6 +8489,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -8657,7 +8550,6 @@ def __call__(self, state: UWState): thv0lcl_o=self.locals.thv0lcl_o, cinlcl=self.locals.cinlcl, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -8669,6 +8561,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -8850,6 +8743,7 @@ def __call__(self, state: UWState): qisub_s=self.locals.qisub_s, cush_inout=self.locals.cush_inout, cush_s=self.locals.cush_s, + cush=state.input_output.cush, cufrc_out=self.locals.cufrc_out, cufrc_s=self.locals.cufrc_s, qtflx_out=self.locals.qtflx_out, @@ -8898,7 +8792,6 @@ def __call__(self, state: UWState): ufrcinv=self.locals.ufrcinv, wcrit=self.locals.wcrit, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -8910,6 +8803,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -8922,7 +8816,6 @@ def __call__(self, state: UWState): self._define_updraft_properties( condensation=self.condensation, - iteration=iteration, winv=self.locals.winv, cinlcl_IJ=self.locals.cinlcl_IJ, cbmf=self.locals.cbmf, @@ -8945,7 +8838,6 @@ def __call__(self, state: UWState): wlcl=self.locals.wlcl, ufrclcl=self.locals.ufrclcl, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -8957,6 +8849,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -8969,7 +8862,6 @@ def __call__(self, state: UWState): self._define_env_properties( condensation=self.condensation, - iteration=iteration, krel=self.locals.krel, kinv=self.locals.kinv, ssu0=self.locals.ssu0, @@ -9046,9 +8938,9 @@ def __call__(self, state: UWState): thv0top=self.locals.thv0top, exnifc0=self.locals.exnifc0_in, tru=self.tru, - umf_zint=self.locals.umf_zint, emf=self.locals.emf, thvu=self.locals.thvu, + umf_zint=self.locals.umf_zint, rei=self.locals.rei, uu=self.locals.uu, vu=self.locals.vu, @@ -9065,18 +8957,17 @@ def __call__(self, state: UWState): bogbot=self.locals.bogbot, bogtop=self.locals.bogtop, kpen_IJ=self.locals.kpen_IJ, - rhomid0j=self.locals.rhomid0j, kbup_IJ=self.locals.kbup_IJ, + rhomid0j=self.locals.rhomid0j, fer=self.locals.fer, - fdr=self.locals.fdr, dwten=self.locals.dwten, diten=self.locals.diten, + fdr=self.locals.fdr, dcm=self.locals.dcm, xco=self.locals.xco, stop_buoyancy_sort=self.stop_buoyancy_sort, iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9088,6 +8979,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9111,7 +9003,6 @@ def __call__(self, state: UWState): dp0=self.locals.dp0_in, wtwb=self.locals.wtwb, ppen=self.locals.ppen, - iteration=iteration, ) self._recalc_condensate( @@ -9145,12 +9036,10 @@ def __call__(self, state: UWState): thlu_top=self.locals.thlu_top, qtu_top=self.locals.qtu_top, cldhgt=self.locals.cldhgt, - fdr=self.locals.fdr, umf_temp=self.locals.umf_temp, + fdr=self.locals.fdr, xco=self.locals.xco, - iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9162,6 +9051,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9206,7 +9096,6 @@ def __call__(self, state: UWState): uu_emf=self.locals.uu_emf, vu_emf=self.locals.vu_emf, emf=self.locals.emf, - iteration=iteration, ) self._calc_pbl_fluxes( @@ -9220,6 +9109,9 @@ def __call__(self, state: UWState): cbmf=self.locals.cbmf, xflx=self.locals.xflx, qtflx=self.locals.qtflx, + uflx=self.locals.uflx, + vflx=self.locals.vflx, + slflx=self.locals.slflx, thlsrc=self.locals.thlsrc, thl0=self.locals.thl0, ssthl0=self.locals.ssthl0, @@ -9234,10 +9126,6 @@ def __call__(self, state: UWState): tr0=self.tr0, sstr0=self.sstr0, trflx=self.trflx, - uflx=self.locals.uflx, - vflx=self.locals.vflx, - slflx=self.locals.slflx, - iteration=iteration, xflx_ndim=self.xflx_ndim, ) @@ -9271,7 +9159,6 @@ def __call__(self, state: UWState): qtflx=self.locals.qtflx, uplus=self.locals.uplus, vplus=self.locals.vplus, - iteration=iteration, ) self._buoyancy_sorting_fluxes( @@ -9299,10 +9186,9 @@ def __call__(self, state: UWState): tr0=self.tr0, sstr0=self.sstr0, qtflx=self.locals.qtflx, - vflx=self.locals.vflx, uflx=self.locals.uflx, + vflx=self.locals.vflx, slflx=self.locals.slflx, - iteration=iteration, ) self._penetrative_entrainment_fluxes( @@ -9329,13 +9215,13 @@ def __call__(self, state: UWState): tru_emf=self.tru_emf, tr0=self.tr0, sstr0=self.sstr0, + kinv=self.locals.kinv, cbmf=self.locals.cbmf, uflx=self.locals.uflx, vflx=self.locals.vflx, - qtflx=self.locals.qtflx, slflx=self.locals.slflx, + qtflx=self.locals.qtflx, uemf=self.locals.uemf, - kinv=self.locals.kinv, krel=self.locals.krel, umf_zint=self.locals.umf_zint, ql0=self.locals.ql0, @@ -9344,9 +9230,7 @@ def __call__(self, state: UWState): esx=self.esx, qlten_sink=self.locals.qlten_sink, qiten_sink=self.locals.qiten_sink, - iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9358,6 +9242,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9376,11 +9261,10 @@ def __call__(self, state: UWState): dp0=self.locals.dp0_in, u0=self.locals.u0_in, v0=self.locals.v0_in, - uten=self.locals.uten, - vten=self.locals.vten, uf=self.locals.uf, vf=self.locals.vf, - iteration=iteration, + uten=self.locals.uten, + vten=self.locals.vten, ) self._calc_thermodynamic_tendencies( @@ -9391,6 +9275,7 @@ def __call__(self, state: UWState): slflx=self.locals.slflx, uflx=self.locals.uflx, vflx=self.locals.vflx, + qtflx=self.locals.qtflx, u0=self.locals.u0_in, v0=self.locals.v0_in, uf=self.locals.uf, @@ -9398,7 +9283,6 @@ def __call__(self, state: UWState): dwten=self.locals.dwten, diten=self.locals.diten, umf_temp=self.locals.umf_temp, - qtflx=self.locals.qtflx, krel=self.locals.krel, prel=self.locals.prel, thlu=self.locals.thlu, @@ -9413,10 +9297,10 @@ def __call__(self, state: UWState): qiubelow=self.locals.qiubelow, qlj_2D=self.locals.qlj_2D, qij_2D=self.locals.qij_2D, + kbup=self.locals.kbup, fdr=self.locals.fdr, ql0=self.locals.ql0, qi0=self.locals.qi0, - kbup=self.locals.kbup, pmid0=self.locals.pmid0_in, thlu_emf=self.locals.thlu_emf, qtu_emf=self.locals.qtu_emf, @@ -9430,12 +9314,11 @@ def __call__(self, state: UWState): sten=self.locals.sten, qiten=self.locals.qiten, qc=self.locals.qc, - slten=self.locals.slten, qlten_det=self.locals.qlten_det, qiten_det=self.locals.qiten_det, + slten=self.locals.slten, iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9447,6 +9330,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9469,7 +9353,6 @@ def __call__(self, state: UWState): dp0=self.locals.dp0_in, qiten=self.locals.qiten, qmin=self.locals.qmin, - iteration=iteration, ) self._calc_tracer_tendencies( @@ -9481,7 +9364,6 @@ def __call__(self, state: UWState): tr0=self.tr0, trflx=self.trflx, trten=self.trten, - iteration=iteration, ) self._compute_diagnostic_outputs( @@ -9499,7 +9381,6 @@ def __call__(self, state: UWState): rlwp=self.locals.rlwp, riwp=self.locals.riwp, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9511,6 +9392,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9536,19 +9418,17 @@ def __call__(self, state: UWState): ufrc=self.locals.ufrc, ufrclcl=self.locals.ufrclcl, prel=self.locals.prel, - qcubelow=self.locals.qcubelow, - qlubelow=self.locals.qlubelow, - qiubelow=self.locals.qiubelow, qcu=self.locals.qcu, qlu=self.locals.qlu, qiu=self.locals.qiu, + qcubelow=self.locals.qcubelow, + qlubelow=self.locals.qlubelow, + qiubelow=self.locals.qiubelow, rcwp=self.locals.rcwp, rlwp=self.locals.rlwp, riwp=self.locals.riwp, cufrc=self.locals.cufrc, - iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9560,6 +9440,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9648,7 +9529,6 @@ def __call__(self, state: UWState): cufrc_s=self.locals.cufrc_s, fer_s=self.locals.fer_s, fdr_s=self.locals.fdr_s, - iteration=iteration, ) self._recalc_environmental_variables( @@ -9684,9 +9564,7 @@ def __call__(self, state: UWState): s0=self.locals.s0, t0=self.locals.t0, tr0_temp=self.locals.tr0_temp, - iteration=iteration, cush=state.input_output.cush, - cush_inout=self.locals.cush_inout, umf_out=self.locals.umf_out, dcm_out=self.locals.dcm_out, qvten_out=self.locals.qvten_out, @@ -9698,6 +9576,7 @@ def __call__(self, state: UWState): qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, cufrc_out=self.locals.cufrc_out, + cush_inout=self.locals.cush_inout, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qtflx_out=self.locals.qtflx_out, @@ -9710,7 +9589,6 @@ def __call__(self, state: UWState): self._update_output_variables1( condensation=self.condensation, - del_CIN=self.locals.del_CIN, umf_zint=self.locals.umf_zint, kinv=self.locals.kinv, zifc0=self.locals.zifc0_in, @@ -9775,7 +9653,6 @@ def __call__(self, state: UWState): slflx_out=self.locals.slflx_out, uflx_out=self.locals.uflx_out, vflx_out=self.locals.vflx_out, - cufrc_out=self.locals.cufrc_out, qvten_out=self.locals.qvten_out, qlten_out=self.locals.qlten_out, qiten_out=self.locals.qiten_out, @@ -9784,6 +9661,7 @@ def __call__(self, state: UWState): vten_out=self.locals.vten_out, qrten_out=self.locals.qrten_out, qsten_out=self.locals.qsten_out, + cufrc_out=self.locals.cufrc_out, qldet_out=self.locals.qldet_out, qidet_out=self.locals.qidet_out, qlsub_out=self.locals.qlsub_out, @@ -9794,7 +9672,6 @@ def __call__(self, state: UWState): nice_out=self.locals.nice_out, tr0=self.tr0, tr0_inout=self.tr0_inout, - CNV_Tracers=state.input_output.CNV_Tracers, cush_inout=self.locals.cush_inout, umf_inv=state.output.umf_inv, dcm_inv=state.output.dcm_inv, @@ -9819,8 +9696,8 @@ def __call__(self, state: UWState): qlsub_inv=state.output.qlsub_inv, qidet_inv=state.output.qidet_inv, qisub_inv=state.output.qisub_inv, + CNV_Tracers=state.input_output.CNV_Tracers, cush=state.input_output.cush, - condensation=self.condensation, ) self._setup_outputs( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/locals.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/locals.py index a4a6da427..d0361b6e6 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/locals.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/locals.py @@ -512,208 +512,7 @@ def make(cls, runtime: NDSLRuntime, quantity_factory: QuantityFactory): qi0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) th0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) cinlcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qc_l = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qc_i = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qtten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - PTR2D = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - QLCN = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - QICN = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - QLLS = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - QILS = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - MASS = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssthl0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssqt0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssu0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssv0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thj = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlj = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qvj = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qse = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qij = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - tr0_temp = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0top = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0bot = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvl0top = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dcm_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qvten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - sten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qrten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qsten_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cufrc_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fer_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fdr_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvlavg = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - tkeavg = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uavg = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vavg = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvlmin = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qtavg = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - zmid0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qt0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvl0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvl0bot = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - t0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qv0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - pmid0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - pmid0_inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thl0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thlsrc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - usrc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vsrc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - plcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thl0lcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qt0lcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0lcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - plfc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fer_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fdr_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cin = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvubot = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvutop = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvlsrc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thl0top = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qt0top = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qldet_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qidet_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlsub_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qisub_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dcm_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qvten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - sten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qrten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qsten_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cufrc_outvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - usrc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vsrc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0lcl_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ql0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qi0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - t0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - s0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - u0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - v0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qt0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thl0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvl0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssthl0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssqt0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0bot_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0top_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvl0bot_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvl0top_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssu0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ssv0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dcm_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qvten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - sten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qrten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qsten_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qldet_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qidet_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlsub_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qisub_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cush_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cufrc_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fer_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fdr_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qtsrc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvlsrc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thlsrc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qldet_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qidet_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlsub_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qisub_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ndrop_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - nice_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dcm = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - xco = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlten_det = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiten_det = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qv0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ql0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qi0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - s0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - t0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - u0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - v0_s = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - slten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qv0_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - plcl_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - plfc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - tkeavg_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thvlmin_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ufrclcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qcu = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlu = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiu = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cufrc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qtsrc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uplus_3D = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vplus_3D = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - prel = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thv0rel = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - winv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cbmf = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - rho0inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ufrcinv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - wlcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qsat_pe = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - thlue = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qtue = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - wue = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - rei = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fer = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dwten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - diten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ql0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qi0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - uf = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - vf = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dwten_temp = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - diten_temp = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - fdr = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlten_sink = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiten_sink = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qrten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qsten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - s0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qvten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qlten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - sten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qiten = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qmin = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - pmid0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - u0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - v0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - u0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - v0 = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - zmid0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - zmid0_inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - exnmid0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - exnmid0_inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - exnifc0_inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_INTERFACE_DIM]) - dp0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - dp0_inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qv0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - ql0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - qi0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - th0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) - cinlcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM]) + # FloatFieldIJs cush_inout = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) dpi = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) @@ -757,48 +556,7 @@ def make(cls, runtime: NDSLRuntime, quantity_factory: QuantityFactory): tscaleh = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) wtwb = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) cnvtrmax = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cush_inout = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - dpi = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - thvlmin_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - wcrit = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - alpha = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - del_CIN = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cin_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - plfc_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cinlcl_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - pe = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - thle = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qte = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - dpe = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - exne = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - thvebot = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - ue = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - ve = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - drage = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - bogbot = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - bogtop = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - rhomid0j = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cush_inoutvar = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - uplus = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - vplus = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cin_i = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cinlcl_i = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - ke = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - thlu_top = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qtu_top = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cldhgt = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qlubelow = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qiubelow = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qlj_2D = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qij_2D = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - qcubelow = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - rcwp = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - rlwp = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - riwp = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - ppen = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - tscaleh = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - wtwb = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) - cnvtrmax = runtime.make_local(quantity_factory, [I_DIM, J_DIM]) + # Interface FloatFields qtu_emf = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_INTERFACE_DIM]) umf_out = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_INTERFACE_DIM]) @@ -842,6 +600,7 @@ def make(cls, runtime: NDSLRuntime, quantity_factory: QuantityFactory): zifc0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_INTERFACE_DIM]) zifc0_inv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_INTERFACE_DIM]) exnifc0_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_INTERFACE_DIM]) + # IntFields kinv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) klcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) @@ -852,25 +611,12 @@ def make(cls, runtime: NDSLRuntime, quantity_factory: QuantityFactory): kbup = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) krel = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) kpen = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - kinv = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - klcl = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - klfc = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - kinv_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - klcl_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - klfc_o = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - kbup = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - krel = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) - kpen = runtime.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], dtype=Int) # IntFieldIJs kbup_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) klfc_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) kpen_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) kpbl_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) - kbup_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) - klfc_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) - kpen_IJ = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) - kpbl_in = runtime.make_local(quantity_factory, [I_DIM, J_DIM], dtype=Int) return cls( ssthl0=ssthl0, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/uwshcu_functions.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/uwshcu_functions.py index ef3a42e22..df5193fff 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/uwshcu_functions.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/convection/UW/uwshcu_functions.py @@ -133,7 +133,6 @@ def conden( p: Float, thl: Float, qt: Float, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, ): """ @@ -143,7 +142,6 @@ def conden( p [Float]: Pressure [Pa] thl [Float]: Liquid potential temperature [K] qt [Float]: Mixing ratio [kg/kg] - ese [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] esx [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] Returns: @@ -168,7 +166,7 @@ def conden( temps: float32 = tc ps: float32 = p ps_tmp = ps / 100.0 - qs, _ = saturation_specific_humidity(temps, ps_tmp * 100.0, ese, esx) + qs, _ = saturation_specific_humidity(temps, ps_tmp * 100.0, esx) rvls = qs if qs >= qt: # no condensation @@ -185,7 +183,7 @@ def conden( constants.MAPL_CP / leff + constants.EPSILON * leff * rvls / (constants.MAPL_RGAS * temps * temps) ) ps_tmp = ps / 100.0 - qs, _ = saturation_specific_humidity(temps, ps_tmp * 100.0, ese, esx) + qs, _ = saturation_specific_humidity(temps, ps_tmp * 100.0, esx) rvls = qs iteration += 1 qc = max(qt - qs, float64(0.0)) @@ -400,7 +398,6 @@ def qsinvert( qt: Float, thl: Float, ps_in: Float, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, ): """ @@ -413,7 +410,6 @@ def qsinvert( qt [Float]: Mixing ratio [kg/kg] thl [Float]: Liquid potential temperature [K] ps_in [Float]: Pressure [Pa] - ese [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] esx [GlobalTable_saturation_tables]: Used in QSat_Float [n/a] Returns: @@ -431,7 +427,7 @@ def qsinvert( Ti: float64 = thl * (ps_in / p00) ** rovcp Tgeos: float32 = Ti Pgeos: float32 = float32(ps_in) - qs, dqsdT = saturation_specific_humidity(Tgeos, Pgeos, ese, esx) + qs, dqsdT = saturation_specific_humidity(Tgeos, Pgeos, esx) es: float64 = ps_in * qs / (constants.EPSILON + (float64(1.0) - constants.EPSILON) * float64(qs)) rhi: float64 = qt / float64(qs) @@ -449,7 +445,7 @@ def qsinvert( Ts: float64 = thl * Pis Tgeos = Ts Pgeos = ps - qs, dqsdT = saturation_specific_humidity(Tgeos, Pgeos, ese, esx) + qs, dqsdT = saturation_specific_humidity(Tgeos, Pgeos, esx) gam: float64 = (constants.MAPL_LATENT_HEAT_VAPORIZATION / constants.MAPL_CP) * float64(dqsdT) err: float64 = qt - qs nu: float64 = ice_fraction(float32(Ts), 0.0, 0.0) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/build_helper.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/build_helper.py index 45caf6161..4984e0b37 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/build_helper.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/build_helper.py @@ -16,8 +16,9 @@ class MemorySpace(enum.Enum): class InterfaceTransferType(enum.Enum): CPU_COPY = enum.auto() # Copies because of layout mismatch - CPU_MAP = enum.auto() # No copy - memory map - same layout - CPU_TO_GPU_TO_CPU = enum.auto() + CPU_ZERO_COPY = enum.auto() # No copy - reuse the memory given (case of same layout) + GPU_TRANSFER = enum.auto() # Upload from central RAM to device, then download + GPU_MAPPING = enum.auto() # Paged memory mapped onto GPU memory space (HMM, ATS, ...) class StencilBackendCompilerOverride: @@ -47,7 +48,7 @@ def __init__(self, comm: MPI.Intracomm, config: DaceConfig | None): if not self.no_op: original_orchestrate = config._orchestrate config._orchestrate = DaCeOrchestration.Build - set_distributed_caches(config) + set_distributed_caches(config, force_build=True) config._orchestrate = original_orchestrate # We remove warnings from the stencils compiling when in critical and/or diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/profiler.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/cuda_profiler.py similarity index 90% rename from GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/profiler.py rename to GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/cuda_profiler.py index cbdffac0d..f0a7973e0 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/profiler.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/cuda_profiler.py @@ -27,11 +27,19 @@ def __init__(self, label: str) -> None: self.label = label def __enter__(self): + CUDAProfiler.range_push(self.label) + + def __exit__(self, _type, _val, _traceback): + CUDAProfiler.range_pop() + + @classmethod + def range_push(cls, name: str) -> None: if GPU_AVAILABLE: cp.cuda.runtime.deviceSynchronize() - cp.cuda.nvtx.RangePush(self.label) + cp.cuda.nvtx.RangePush(name) - def __exit__(self, _type, _val, _traceback): + @classmethod + def range_pop(cls) -> None: if GPU_AVAILABLE: cp.cuda.runtime.deviceSynchronize() cp.cuda.nvtx.RangePop() diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/geos_pymoist.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/geos_pymoist.py index e6106eef9..46ff86586 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/geos_pymoist.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/geos_pymoist.py @@ -25,12 +25,16 @@ ) from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.dsl.typing import get_precision +from ndsl.internal.hmm import is_hmm_available from ndsl.logging import ndsl_log_on_rank_0 from ndsl.optional_imports import cupy as cp from pyMoist.fortran.build_helper import InterfaceTransferType, MemorySpace +from gt4py.cartesian.config import GT4PY_COMPILE_OPT_LEVEL # isort: skip + + @dataclasses.dataclass class NDSLPhysicsConfiguration: # Grid layout @@ -109,15 +113,18 @@ def __init__( # Figure out the interface mode tmp_quantity = self.quantity_factory.empty([I_DIM, J_DIM, K_DIM], units="") - default_3D_memory_desc = (tmp_quantity.data.shape, tmp_quantity.data.strides) + default_3D_memory_desc = (tmp_quantity.shape, tmp_quantity._data.strides) if fortran_mem_space != MemorySpace.CPU: raise NotImplementedError("Interface cannot stream Fortran memory resident on GPU") if self.backend.is_gpu_backend(): - self._interface_type = InterfaceTransferType.CPU_TO_GPU_TO_CPU + if self.backend.is_fortran_aligned() and is_hmm_available(): + self._interface_type = InterfaceTransferType.GPU_MAPPING + else: + self._interface_type = InterfaceTransferType.GPU_TRANSFER else: if self.backend.is_fortran_aligned(): # This is Fortran layout - we can Map the memory - self._interface_type = InterfaceTransferType.CPU_MAP + self._interface_type = InterfaceTransferType.CPU_ZERO_COPY else: # All other layout have to copy the data in/out of Fortran layout self._interface_type = InterfaceTransferType.CPU_COPY @@ -126,20 +133,22 @@ def __init__( # Feedback information device_ordinal_info = "N/A" if cp is not None: - device_ordinal_info = f" Device PCI bus id: {cp.cuda.Device(0).pci_bus_id}" if self.backend.is_gpu_backend() else "N/A" + device_ordinal_info = f"Device PCI bus id: {cp.cuda.Device(0).pci_bus_id}" if self.backend.is_gpu_backend() else "N/A" MPS_pipe_directory = os.getenv("CUDA_MPS_PIPE_DIRECTORY", None) MPS_is_on = MPS_pipe_directory is not None and self.backend.is_gpu_backend() and os.path.exists(f"{MPS_pipe_directory}/log") ndsl_log_on_rank_0.info( "pyMoist <> GEOS wrapper initialized (Rank 0):\n" - f" Bridge : {self._interface_type.name}\n" - f" Backend : {self.backend}\n" - f" Precision : {get_precision()} bit\n" - f" Orchestration : {self._is_orchestrated}\n" - f" Sizer : {sizer.nx}x{sizer.ny}x{sizer.nz}" + f" Bridge : {self._interface_type.name}\n" + f" Backend : {self.backend}\n" + f" Precision : {get_precision()} bit\n" + f" Optimization : -O{GT4PY_COMPILE_OPT_LEVEL}\n" + f" Orchestration : {self._is_orchestrated}\n" + f" Local domain : {sizer.nx}x{sizer.ny}x{sizer.nz}" f"(halo: {sizer.n_halo})\n" - f" Strides for 3D : {default_3D_memory_desc[1]}\n" - f" Device ord : {device_ordinal_info}\n" - f" Nvidia MPS : {MPS_is_on}\n" + f" Layout : {partitioner.layout}\n" + f" Strides for 3D : {default_3D_memory_desc[1]}\n" + f" Device ord : {device_ordinal_info}\n" + f" Nvidia MPS : {MPS_is_on}\n" ) @property @@ -164,8 +173,8 @@ def _set_NDSL_physics(mapl_state) -> NDSLPhysicsStack: return NDSLPhysicsStack( NDSLPhysicsConfiguration( - grid_infos.im * grid_infos.nx, - grid_infos.jm * ny, + grid_infos.im, + grid_infos.jm, grid_infos.lm, grid_infos.nx, ny, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/managed_state.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/managed_state.py index 65adf1e75..c64af95a3 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/managed_state.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/managed_state.py @@ -5,7 +5,6 @@ from ndsl import State from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM, Float from ndsl.optional_imports import cupy as cp -from ndsl.utils import safe_assign_array from pyMoist.fortran.build_helper import InterfaceTransferType from pyMoist.fortran.memory_factory import MAPLMemoryRepository @@ -80,19 +79,17 @@ def _pull_from_fortran( getattr(ndsl_state_, inner_dataclass), ) else: - mapl_array = mapl_state_.get_from_fortran(mapl_field_) + mapl_array = mapl_state_.get_from_fortran(mapl_field_, allow_device_transfer=False) if mapl_array is None: setattr(ndsl_state_, ndsl_field_, None) - elif self._transfer_type == InterfaceTransferType.CPU_TO_GPU_TO_CPU: - safe_assign_array( - getattr(ndsl_state_, ndsl_field_).field[:], - mapl_array, - ) - cp.cuda.runtime.deviceSynchronize() + elif self._transfer_type == InterfaceTransferType.GPU_TRANSFER: + getattr(ndsl_state_, ndsl_field_).field[:] = cp.asarray(mapl_array)[:] elif self._transfer_type == InterfaceTransferType.CPU_COPY: getattr(ndsl_state_, ndsl_field_).field[:] = mapl_array[:] - elif self._transfer_type == InterfaceTransferType.CPU_MAP: - getattr(ndsl_state_, ndsl_field_).data = mapl_array + elif self._transfer_type == InterfaceTransferType.CPU_ZERO_COPY: + getattr(ndsl_state_, ndsl_field_).swap_buffer(mapl_array) + elif self._transfer_type == InterfaceTransferType.GPU_MAPPING: + getattr(ndsl_state_, ndsl_field_).swap_buffer(cp.asarray(mapl_array)) else: raise ValueError("Transfer type unknown for Fortran/NDSL") @@ -103,11 +100,14 @@ def _pull_from_fortran( e.add_note(f"Mapping {ndsl_field} to {mapl_field}") raise e + if self._transfer_type == InterfaceTransferType.GPU_TRANSFER: + cp.cuda.runtime.deviceSynchronize() + def ndsl_to_fortran(self) -> None: """Copy all Python memory back in Fortran""" # Skip sending back - we are mapped - if self._transfer_type == InterfaceTransferType.CPU_MAP: + if self._transfer_type in [InterfaceTransferType.CPU_ZERO_COPY, InterfaceTransferType.GPU_MAPPING]: return def _push_back_to_fortran( @@ -125,21 +125,18 @@ def _push_back_to_fortran( ndsl_state_.__getattribute__(inner_dataclass), ) else: - mapl_array = mapl_state_.get_from_fortran(mapl_field_) + mapl_array = mapl_state_.get_from_fortran(mapl_field_, allow_device_transfer=False) if mapl_array is None: pass - elif self._transfer_type == InterfaceTransferType.CPU_TO_GPU_TO_CPU: - safe_assign_array( - mapl_array, - getattr(ndsl_state_, ndsl_field_).field[:], - ) + elif self._transfer_type == InterfaceTransferType.GPU_TRANSFER: + ndsl_array = cp.asnumpy(getattr(ndsl_state_, ndsl_field_).field[:]) + mapl_array[:] = ndsl_array[:] mapl_state_.send_to_fortran(mapl_field_) - cp.cuda.runtime.deviceSynchronize() elif self._transfer_type == InterfaceTransferType.CPU_COPY: ndsl_array = getattr(ndsl_state_, ndsl_field_).field[:] mapl_array[:] = ndsl_array[:] mapl_state_.send_to_fortran(mapl_field_) - elif self._transfer_type == InterfaceTransferType.CPU_MAP: + elif self._transfer_type in [InterfaceTransferType.CPU_ZERO_COPY, InterfaceTransferType.GPU_MAPPING]: raise RuntimeError("Coding issue. We should never send back mapped data") else: raise ValueError("Transfer type unknown for NDSL/Fortran") @@ -147,6 +144,9 @@ def _push_back_to_fortran( for ndsl_field, (mapl_state, mapl_field) in self._state_to_mapl_mapping.items(): _push_back_to_fortran(mapl_field, mapl_state, ndsl_field, self._ndsl_state) + if self._transfer_type == InterfaceTransferType.GPU_TRANSFER: + cp.cuda.runtime.deviceSynchronize() + def record(self, key: str) -> None: if key not in self._recorded_state: self._recorded_state[key] = self._ndsl_state.to_xarray().copy(deep=True) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/GF2020_interface.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/GF2020_interface.py index ba8fd23bb..e4a13ae20 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/GF2020_interface.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/GF2020_interface.py @@ -12,10 +12,10 @@ from pyMoist.convection_tracers import ConvectionTracers from pyMoist.fortran import get_NDSL_physics from pyMoist.fortran.build_helper import StencilBackendCompilerOverride +from pyMoist.fortran.cuda_profiler import TimedCUDAProfiler from pyMoist.fortran.managed_state import MAPLManagedState from pyMoist.fortran.memory_factory import MAPLMemoryRepository from pyMoist.fortran.moist_workarounds import MOIST_WORKAROUNDS -from pyMoist.fortran.profiler import TimedCUDAProfiler from pyMoist.saturation_tables import SaturationVaporPressureTable @@ -225,7 +225,7 @@ def init(self, mapl_state: CVoidPointer, import_state: CVoidPointer, export_stat MAX_TEMP_VAPOR_TENDENCY=Float(maplpy.get_resource("MAX_TQ_TEND:", mapl_state, default=Float(100.0))), ) - saturation_tables = SaturationVaporPressureTable(ndsl_stack.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(ndsl_stack.stencil_factory) # Initialize the module with StencilBackendCompilerOverride( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/UW_interface.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/UW_interface.py index c23bced7c..1c3d0e208 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/UW_interface.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/convection/UW_interface.py @@ -8,10 +8,10 @@ from pyMoist.convection.UW import ComputeUwshcuInv, UWConfiguration, UWState from pyMoist.fortran import get_NDSL_physics from pyMoist.fortran.build_helper import StencilBackendCompilerOverride +from pyMoist.fortran.cuda_profiler import TimedCUDAProfiler from pyMoist.fortran.managed_state import MAPLManagedState from pyMoist.fortran.memory_factory import MAPLMemoryRepository from pyMoist.fortran.moist_workarounds import MOIST_WORKAROUNDS -from pyMoist.fortran.profiler import TimedCUDAProfiler class UWGEOSInterface(UserCode): @@ -162,44 +162,23 @@ def run_with_internal( # CNV_FRC = MAPLPy.get_pointer("CNV_FRC", export_state, dtype=np.float32, alloc=True) # SRF_TYPE = MAPLPy.get_pointer("SRF_TYPE", export_state, dtype=np.float32, alloc=True) - debug = False - - if not debug: - with TimedCUDAProfiler("UW", {}): - with TimedCUDAProfiler("UW - State copy", {}): - self._managed_state.fortran_to_ndsl() - safe_assign_array( - self._managed_state.ndsl_state.input_output.CNV_Tracers.data[:], - MOIST_WORKAROUNDS.CNV_Tracers().Q[:], - ) - - with TimedCUDAProfiler("UW Numerics", {}): - self._uw(self._managed_state.ndsl_state) - - with TimedCUDAProfiler("UW - State copy-back", {}): - safe_assign_array( - MOIST_WORKAROUNDS.CNV_Tracers().Q[:], - self._managed_state.ndsl_state.input_output.CNV_Tracers.data[:], - ) - self._managed_state.ndsl_to_fortran() - else: - with TimedCUDAProfiler("UW", {}): - with TimedCUDAProfiler("UW - State copy", {}): - self._managed_state.fortran_to_ndsl() - safe_assign_array( - self._managed_state.ndsl_state.input_output.CNV_Tracers.data[:], - MOIST_WORKAROUNDS.CNV_Tracers().Q[:], - ) - - with TimedCUDAProfiler("UW Numerics", {}): - self._uw(self._managed_state.ndsl_state) - - with TimedCUDAProfiler("UW - State copy-back", {}): - safe_assign_array( - MOIST_WORKAROUNDS.CNV_Tracers().Q[:], - self._managed_state.ndsl_state.input_output.CNV_Tracers.data[:], - ) - self._managed_state.ndsl_to_fortran() + with TimedCUDAProfiler("UW", {}): + with TimedCUDAProfiler("UW - State copy", {}): + self._managed_state.fortran_to_ndsl() + safe_assign_array( + self._managed_state.ndsl_state.input_output.CNV_Tracers.field[:], + MOIST_WORKAROUNDS.CNV_Tracers().Q, + ) + + with TimedCUDAProfiler("UW Numerics", {}): + self._uw(self._managed_state.ndsl_state) + + with TimedCUDAProfiler("UW - State copy-back", {}): + safe_assign_array( + MOIST_WORKAROUNDS.CNV_Tracers().Q, + self._managed_state.ndsl_state.input_output.CNV_Tracers.field[:], + ) + self._managed_state.ndsl_to_fortran() def finalize(self, mapl_state, import_state, export_state) -> None: self._managed_state.save_recorded() diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_In.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_In.py index 02c70377d..1c57dada6 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_In.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_In.py @@ -6,10 +6,10 @@ from pyMoist.constants import NCNST from pyMoist.convection.UW import UWConfiguration, UWState from pyMoist.fortran import get_NDSL_physics +from pyMoist.fortran.cuda_profiler import TimedCUDAProfiler from pyMoist.fortran.managed_state import MAPLManagedState from pyMoist.fortran.memory_factory import MAPLMemoryRepository from pyMoist.fortran.moist_workarounds import MOIST_WORKAROUNDS -from pyMoist.fortran.profiler import TimedCUDAProfiler class UWGEOSInterface_NOOP_IN(UserCode): diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_Out.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_Out.py index 48c49f480..d8fbf784f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_Out.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/UW_interface__NOOP_Out.py @@ -6,10 +6,10 @@ from pyMoist.constants import NCNST from pyMoist.convection.UW import UWConfiguration, UWState from pyMoist.fortran import get_NDSL_physics +from pyMoist.fortran.cuda_profiler import TimedCUDAProfiler from pyMoist.fortran.managed_state import MAPLManagedState from pyMoist.fortran.memory_factory import MAPLMemoryRepository from pyMoist.fortran.moist_workarounds import MOIST_WORKAROUNDS -from pyMoist.fortran.profiler import TimedCUDAProfiler class UWGEOSInterface_NOOP_OUT(UserCode): diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/profiler.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/profiler.py new file mode 100644 index 000000000..a29280ebf --- /dev/null +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/debug/profiler.py @@ -0,0 +1,75 @@ +import os + +import numpy as np +import yaml +from MAPL_PythonBridge import UserCode, get_MAPLPy +from MAPL_PythonBridge.types import CVoidPointer + +from pyMoist.fortran.cuda_profiler import CUDAProfiler + + +try: + import pyitt +except ModuleNotFoundError: + pyitt = None + + +class PyProfiler(UserCode): + def __init__(self, name: str) -> None: + config_filename = os.getenv("GEOS_PYPROFILER_CONFIG", "") + if os.path.exists(config_filename): + with open(config_filename) as file: + self._config = yaml.load(file.read(), Loader=yaml.SafeLoader) + else: + self._config = None + + if pyitt: + self._pyitt_domain = pyitt.domain("GEOS Numerics") + + def _get_task_name(self, mapl_state) -> str | None: + if not self._config: + return None + + maplpy = get_MAPLPy() + taskid = maplpy.get_resource("PYPROFILER_TASKID", mapl_state, default=np.int32(-1)) + + if taskid not in self._config: + print(f"pyProfiler TaskID {taskid} not found in config: {self._config}") + return None + + return self._config[taskid] + + def init(self, mapl_state, import_state, export_state) -> None: + taskname = self._get_task_name(mapl_state) + if taskname is None: + return + + if pyitt: + pyitt.task(taskname, self._pyitt_domain).begin() + + CUDAProfiler.range_push(taskname) + + def run(self, mapl_state, import_state, export_state) -> None: + raise RuntimeError("ITT Profiler needs to be called on .init/.finalize") + + def run_with_internal( + self, + mapl_state: CVoidPointer, + import_state: CVoidPointer, + export_state: CVoidPointer, + internal_state: CVoidPointer, + ) -> None: + raise RuntimeError("ITT Profiler needs to be called on ..init/.finalize") + + def finalize(self, mapl_state, import_state, export_state) -> None: + taskname = self._get_task_name(mapl_state) + if taskname is None: + return + + if pyitt: + pyitt.task(taskname, self._pyitt_domain).end() + + CUDAProfiler.range_pop() + + +CODE = PyProfiler("pyProfiler") diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/microphysics/GFDL1M_interface.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/microphysics/GFDL1M_interface.py index 9b142bb43..d27400200 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/microphysics/GFDL1M_interface.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/fortran/param_interfaces/microphysics/GFDL1M_interface.py @@ -10,9 +10,9 @@ from pyMoist.fortran import get_NDSL_physics from pyMoist.fortran.build_helper import StencilBackendCompilerOverride +from pyMoist.fortran.cuda_profiler import TimedCUDAProfiler from pyMoist.fortran.managed_state import MAPLManagedState from pyMoist.fortran.memory_factory import MAPLMemoryRepository -from pyMoist.fortran.profiler import TimedCUDAProfiler from pyMoist.microphysics.GFDL_1M import GFDL1M, GFDL1MConfig, GFDL1MState @@ -22,7 +22,7 @@ def _default_or_get_from_namelist(default, name_in_namelist: str, namelist: dict class GFDL1MInterface(UserCode): def __init__(self) -> None: - pass + self._gfdl_1m = None def init(self, mapl_state: CVoidPointer, import_state: CVoidPointer, export_state: CVoidPointer): maplpy = get_MAPLPy() @@ -164,21 +164,24 @@ def init(self, mapl_state: CVoidPointer, import_state: CVoidPointer, export_stat ndsl_stack.interface_type, ) - def run( - self, - mapl_state: CVoidPointer, - import_state: CVoidPointer, - export_state: CVoidPointer, - ): - pass + self._first_run = True - def run_with_internal( + def _get_code(self) -> GFDL1M: + if not self._gfdl_1m: + raise RuntimeError("GFDL1M Runtime called before initialization was finished. Abort.") + return self._gfdl_1m # type: ignore[unreachable] + + def _first_run_init( self, mapl_state: CVoidPointer, import_state: CVoidPointer, export_state: CVoidPointer, internal_state: CVoidPointer, ): + if not self._first_run: + return + self._first_run = False + ndsl_stack = get_NDSL_physics(mapl_state) import_repository = MAPLMemoryRepository(import_state, ndsl_stack.quantity_factory) internal_repository = MAPLMemoryRepository(internal_state, ndsl_stack.quantity_factory) @@ -345,15 +348,39 @@ def run_with_internal( self._managed_state.register("mass_fraction.suspended_graupel", "QGTOT", export_repository) self._managed_state.register("mass_fraction.suspended_snow", "QSTOT", export_repository) - if self._gfdl_1m is None: - raise RuntimeError("GFDL1M Runtime called before initialization was done. Abort.") + do_radar_diagnostic = ( + export_repository.associated("DBZ") + or export_repository.associated("DBZ_MAX") + or export_repository.associated("DBZ_1KM") + or export_repository.associated("DBZ_TOP") + or export_repository.associated("DBZ_M10C") + ) + + self._get_code().post_init(do_radar_diagnostic) + + def run( + self, + mapl_state: CVoidPointer, + import_state: CVoidPointer, + export_state: CVoidPointer, + ): + pass + + def run_with_internal( + self, + mapl_state: CVoidPointer, + import_state: CVoidPointer, + export_state: CVoidPointer, + internal_state: CVoidPointer, + ): + self._first_run_init(mapl_state, import_state, export_state, internal_state) with TimedCUDAProfiler("GFDL 1M", {}): with TimedCUDAProfiler("GFDL 1M - State copy", {}): self._managed_state.fortran_to_ndsl() with TimedCUDAProfiler("GFDL 1M Numerics", {}): - self._gfdl_1m(self._managed_state.ndsl_state) + self._get_code()(self._managed_state.ndsl_state) with TimedCUDAProfiler("GFDL 1M - State copy-back", {}): self._managed_state.ndsl_to_fortran() diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/GFDL_1M.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/GFDL_1M.py index ace7fd205..03527b157 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/GFDL_1M.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/GFDL_1M.py @@ -49,7 +49,7 @@ def __init__( super().__init__(stencil_factory) # Initialize saturation tables - saturation_tables = get_saturation_vapor_pressure_table(stencil_factory.backend) + saturation_tables = get_saturation_vapor_pressure_table(stencil_factory) # Locals self._locals = GFDL1MLocals.make_locals(quantity_factory) @@ -116,14 +116,24 @@ def __init__( quantity_factory=quantity_factory, config=config, saturation_tables=saturation_tables, - update_tendencies=self._update_tendencies, ) + self._post_init_done = False + + def post_init(self, do_radar_diagnostic: bool) -> None: + if self._post_init_done: + raise RuntimeError("pyMoist.GFDL_1M: post_init is called more than once.") + self._post_init_done = True + + self._finalize.post_init(do_radar_diagnostic=do_radar_diagnostic) def __call__( self, state: GFDL1MState, ): - # miscelaneous setup for GFDL1M microphysics + if not self._post_init_done: + raise RuntimeError("pyMoist.GFDL_1M: post_init wasn't called.") + + # miscellaneous setup for GFDL1M microphysics # compute additional inputs, prefill outputs, reset temporaries self._setup( p_interface=state.p_interface, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/evaporate.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/evaporate.py index 8a718494f..4188b419a 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/evaporate.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/evaporate.py @@ -34,8 +34,9 @@ def evaporate( from __externals__ import CCW_EVAP_EFF, DT_MOIST with computation(PARALLEL), interval(...): + rh_crit = 1.0 evaporation = mixing_ratio_vapor - rh_crit = 1 + # Evaporation of cloud water. DelGenio et al formulation # (Eq.s 15-17, 1996, J. Clim., 9, 270-303) es = ( @@ -62,4 +63,5 @@ def evaporate( mixing_ratio_vapor = mixing_ratio_vapor + evap mixing_ratio_convective_liquid = mixing_ratio_convective_liquid - evap t = t - (constants.MAPL_LATENT_HEAT_VAPORIZATION / constants.MAPL_CPDRY) * evap + evaporation = (mixing_ratio_vapor - evaporation) / DT_MOIST diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/hydrostatic_pdf.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/hydrostatic_pdf.py index f4a7b209e..c6623fffe 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/hydrostatic_pdf.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/hydrostatic_pdf.py @@ -67,7 +67,7 @@ def pdfcondensate( """ qtmean_64: float64 = qtmean sigmaqt1_64: float64 = sigmaqt1 - sigmaqt2_64: float64 = sigmaqt2 + sigmaqt2_64: float64 = sigmaqt2 # unused?! qstar_64: float64 = qstar condensate: float64 = 0.0 @@ -264,9 +264,9 @@ def hydrostatic_pdf( qa_x = 0.0 cf_n = large_scale_cloud_fraction * inv_clcn qc_n = (mixing_ratio_large_scale_liquid + mixing_ratio_large_scale_ice) * inv_clcn - qc_i = mixing_ratio_large_scale_ice * inv_clcn + qc_i = mixing_ratio_large_scale_ice * inv_clcn # never used?! t_n = t - qs_x, _ = saturation_specific_humidity(t=t, p=p_mb * 100, ese=ese, esx=esx) + qs_x, _ = saturation_specific_humidity(t=t, p=p_mb * 100.0, esx=esx) qv_n = (mixing_ratio_vapor - qs_x * convective_cloud_fraction) * inv_clcn qt = qc_n + qv_n # Total LS water after microphysics @@ -275,11 +275,11 @@ def hydrostatic_pdf( while count <= 20: qv_p = qv_n qc_p = qc_n - cf_p = cf_n + cf_p = cf_n # unused?! t_p = t_n - qs_n, dqs = saturation_specific_humidity(t=t_n, p=p_mb * 100, ese=ese, esx=esx) + qs_n, dqs = saturation_specific_humidity(t=t_n, p=p_mb * 100.0, esx=esx) - if PDF_SHAPE < 3: # 1 = top-hat 2 = triangulat + if PDF_SHAPE < 3: # 1 = top-hat 2 = triangular sigmaqt1 = alpha * qs_n sigmaqt2 = alpha * qs_n elif PDF_SHAPE == 4: # lognormal (sigma is dimensionless) @@ -417,5 +417,5 @@ def hydrostatic_pdf( mixing_ratio_convective_liquid = 0.0 convective_cloud_fraction = 0.0 - denom, _ = saturation_specific_humidity(t=t, p=p_mb * 100.0, ese=ese, esx=esx) + denom, _ = saturation_specific_humidity(t=t, p=p_mb * 100.0, esx=esx) relative_humidity = mixing_ratio_vapor / denom diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/phase_change.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/phase_change.py index c6d3a3113..5c614ddd5 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/phase_change.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/phase_change.py @@ -45,7 +45,7 @@ def __init__( self.config = config self.saturation_tables = saturation_tables - # innitalize locals + # initialize locals self._alpha: Local = self.make_local(quantity_factory, [I_DIM, J_DIM, K_DIM], Float) # construct stencils @@ -95,7 +95,7 @@ def __init__( compute_dims=[I_DIM, J_DIM, K_DIM], externals={ "DT_MOIST": config.DT_MOIST, - "CCI_EVAP_EFF": config.CCW_EVAP_EFF, + "CCI_EVAP_EFF": config.CCI_EVAP_EFF, }, ) self._fix_up_clouds = stencil_factory.from_dims_halo( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/rh_calculations.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/rh_calculations.py index c22664e8e..f8e73285f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/rh_calculations.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/rh_calculations.py @@ -1,4 +1,4 @@ -from ndsl.dsl.gt4py import FORWARD, PARALLEL, atan, computation, interval, sqrt, tan +from ndsl.dsl.gt4py import FORWARD, PARALLEL, K, atan, computation, interval, sqrt, tan from ndsl.dsl.typing import FloatField, FloatFieldIJ, IntFieldIJ import pyMoist.constants as constants @@ -32,35 +32,32 @@ def rh_calculations( with computation(PARALLEL), interval(...): # determine the turn pressure using the LCL - if TURNRHCRIT_PARAM <= 0: - turnrhcrit = p_mb.at(K=lcl_level) - 250 + if TURNRHCRIT_PARAM <= 0.0: + turn_rh_crit = p_mb.at(K=lcl_level) - 250.0 else: - turnrhcrit = TURNRHCRIT_PARAM + turn_rh_crit = TURNRHCRIT_PARAM - with computation(PARALLEL), interval(0, -1): - # Use Slingo-Ritter (1985) formulation for critical relative humidity - rh_crit = 1.0 + # Use Slingo-Ritter (1985) formulation for critical relative humidity + with computation(PARALLEL), interval(...): # lower turn from maxrhcrit=1.0 - if p_mb <= turnrhcrit: + if p_mb <= turn_rh_crit: rh_crit = min_rh_crit else: - rh_crit = min_rh_crit + (1.0 - min_rh_crit) / (19.0) * ( - ( - atan( - (2.0 * (p_mb - turnrhcrit) / (p_interface_mb.at(K=k_end + 1) - turnrhcrit) - 1.0) * tan(20.0 * constants.MAPL_PI / 21.0 - 0.5 * constants.MAPL_PI) + if K == k_end: + rh_crit = 1.0 + else: + rh_crit = min_rh_crit + (1.0 - min_rh_crit) / (19.0) * ( + ( + atan( + (2.0 * (p_mb - turn_rh_crit) / (p_interface_mb.at(K=k_end + 1) - turn_rh_crit) - 1.0) + * tan(20.0 * constants.MAPL_PI / 21.0 - 0.5 * constants.MAPL_PI) + ) + + 0.5 * constants.MAPL_PI ) - + 0.5 * constants.MAPL_PI + * 21.0 + / constants.MAPL_PI + - 1.0 ) - * 21.0 - / constants.MAPL_PI - - 1.0 - ) - with computation(PARALLEL), interval(-1, None): - # lower turn from maxrhcrit=1.0 - if p_mb <= turnrhcrit: - rh_crit = min_rh_crit - else: - rh_crit = 1.0 with computation(PARALLEL), interval(...): # include grid cell area scaling and limit RHcrit to > 70%\ diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/sublimate.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/sublimate.py index 3f15d0c03..98febbffc 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/sublimate.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/PhaseChange/sublimate.py @@ -35,7 +35,7 @@ def sublimate( with computation(PARALLEL), interval(...): sublimation = mixing_ratio_vapor - rh_crit = 1 + rh_crit = 1.0 # Sublimation of cloud water. DelGenio et al formulation # (Eq.s 15-17, 1996, J. Clim., 9, 270-303) es = ( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/driver.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/driver.py index 5b4af1c46..3f730827c 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/driver.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/driver.py @@ -67,10 +67,7 @@ def __init__( self._locals = GFDL1MDriverLocals.make_locals(quantity_factory) # pull saturation specific humidity tables, generate if first call - self.driver_saturation_tables = get_tables( - stencil_factory.backend, - stencil_factory.config.dace_config, - ) + self.driver_saturation_tables = get_tables(stencil_factory) # construct stencils self._setup = GFDL1MDriverSetup( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/ice_cloud.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/ice_cloud.py index 44b307acb..373aa8805 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/ice_cloud.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/ice_cloud.py @@ -1851,7 +1851,7 @@ def update_precip_total( driver_sublimation: FloatField, ): """ - ensure information is passed back to the rest of the model + Ensure information is passed back to the rest of the model. """ with computation(PARALLEL), interval(...): sublimation = sublimation + driver_sublimation @@ -1960,6 +1960,14 @@ def __init__( compute_dims=[I_DIM, J_DIM, K_DIM], ) + # Dev NOTE: this is an orchestration workaround. Direct call to + # `self.saturation_tables.X` fails closure capture for + # argument reconstruction at call time + self._table2 = self.saturation_tables.table2 + self._table3 = self.saturation_tables.table3 + self._des2 = self.saturation_tables.des2 + self._des3 = self.saturation_tables.des3 + def __call__( self, t: FloatField, @@ -2032,10 +2040,10 @@ def __call__( ccn, convection_fraction, surface_type, - self.saturation_tables.table2, - self.saturation_tables.table3, - self.saturation_tables.des2, - self.saturation_tables.des3, + self._table2, + self._table3, + self._des2, + self._des3, ) self._update_output( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/sat_tables.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/sat_tables.py index 5e333ab7b..a206532a1 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/sat_tables.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/sat_tables.py @@ -1,9 +1,8 @@ from mpi4py import MPI -from ndsl.boilerplate import get_factories_single_tile +from ndsl import QuantityFactory, StencilFactory, SubtileGridSizer from ndsl.constants import I_DIM, J_DIM, K_DIM -from ndsl.dsl.dace.dace_config import DaceConfig from ndsl.dsl.gt4py import FORWARD, PARALLEL, GlobalTable, K, computation, exp, interval, log, log10 -from ndsl.dsl.typing import Float, FloatField, Int +from ndsl.dsl.typing import Float, FloatField from pyMoist.microphysics.GFDL_1M.driver.constants import constants from pyMoist.shared.incloud_processes import ice_fraction @@ -13,7 +12,7 @@ GlobalTable_driver_qsat = GlobalTable[(Float, (int(constants.LENGTH)))] -def qs_table_1(length: Int, table1: FloatField, esupc: FloatField): +def qs_table_1(table1: FloatField, esupc: FloatField): """ Compute saturation water vapor pressure table 1 three phase table @@ -57,7 +56,7 @@ def qs_table_1(length: Int, table1: FloatField, esupc: FloatField): table1 = wice * table1 + wh2o * esupc[0, 0, -1200] -def qs_table_2(length: Int, table2: FloatField): +def qs_table_2(table2: FloatField): """ Compute saturation water vapor pressure table 2 one phase table @@ -72,7 +71,7 @@ def qs_table_2(length: Int, table2: FloatField): table2 = constants.E_00 * exp(fac2) -def qs_table_3(length: Int, table3: FloatField, table1: FloatField): +def qs_table_3(table3: FloatField, table1: FloatField): """ Compute saturation water vapor pressure table 3 two phase table @@ -112,7 +111,7 @@ def qs_table_3(length: Int, table3: FloatField, table1: FloatField): table3 = t1[0, 0, -1] # type: ignore -def qs_table_4(length: Int, table4: FloatField, table1: FloatField): +def qs_table_4(table4: FloatField, table1: FloatField): """ Compute saturation water vapor pressure table 4 two phase table with " - 2 c" as the transition point @@ -158,7 +157,6 @@ def qs_table_4(length: Int, table4: FloatField, table1: FloatField): def des_tables( - length: Int, des1: FloatField, des2: FloatField, des3: FloatField, @@ -190,16 +188,18 @@ class GFDL_driver_tables: Reference Fortran: gfdl_cloud_microphys.F90: qsmith_init.py """ - def __init__(self, backend, dace_config: DaceConfig): + def __init__(self, stencil_factory: StencilFactory) -> None: table_compute_domain = (1, 1, constants.LENGTH) - stencil_factory, quantity_factory = get_factories_single_tile( - table_compute_domain[0], - table_compute_domain[1], - table_compute_domain[2], - 0, - backend, + sizer = SubtileGridSizer( + nx=table_compute_domain[0], + ny=table_compute_domain[1], + nz=table_compute_domain[2], + n_halo=0, + data_dimensions={}, + backend=stencil_factory.backend, ) + quantity_factory = QuantityFactory(sizer, backend=stencil_factory.backend) self._table1 = quantity_factory.zeros([I_DIM, J_DIM, K_DIM], "n/a") self._table2 = quantity_factory.zeros([I_DIM, J_DIM, K_DIM], "n/a") @@ -214,7 +214,7 @@ def __init__(self, backend, dace_config: DaceConfig): # Cancel multi-node compile for tables # TODO: this should come for free with the rewrite of the gt:X stencils # compilation mode - if not dace_config.do_compile: + if not stencil_factory.config.dace_config.do_compile: MPI.COMM_WORLD.Barrier() compute_qs_table_1 = stencil_factory.from_origin_domain( @@ -243,12 +243,11 @@ def __init__(self, backend, dace_config: DaceConfig): domain=table_compute_domain, ) - compute_qs_table_1(constants.LENGTH, self._table1, self._esupc) - compute_qs_table_2(constants.LENGTH, self._table2) - compute_qs_table_3(constants.LENGTH, self._table3, self._table1) - compute_qs_table_4(constants.LENGTH, self._table4, self._table1) + compute_qs_table_1(self._table1, self._esupc) + compute_qs_table_2(self._table2) + compute_qs_table_3(self._table3, self._table1) + compute_qs_table_4(self._table4, self._table1) compute_des_tables( - constants.LENGTH, self._des1, self._des2, self._des3, @@ -259,7 +258,7 @@ def __init__(self, backend, dace_config: DaceConfig): self._table4, ) - if dace_config.do_compile: + if stencil_factory.config.dace_config.do_compile: MPI.COMM_WORLD.Barrier() self.table1 = self._table1.view[0, 0, :] @@ -273,13 +272,13 @@ def __init__(self, backend, dace_config: DaceConfig): # Table needs to be calculated only once -_cached_table = { +_cached_table: dict[str, GFDL_driver_tables | None] = { "driver_qsat": None, } -def get_tables(backend, dace_config): +def get_tables(stencil_factory: StencilFactory): if _cached_table["driver_qsat"] is None: - _cached_table["driver_qsat"] = GFDL_driver_tables(backend, dace_config) + _cached_table["driver_qsat"] = GFDL_driver_tables(stencil_factory) return _cached_table["driver_qsat"] diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/terminal_fall.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/terminal_fall.py index 22859a752..ada492949 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/terminal_fall.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/terminal_fall.py @@ -4,7 +4,6 @@ from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.gt4py import BACKWARD, FORWARD, PARALLEL, computation, exp, function, interval from ndsl.dsl.typing import Bool, BoolFieldIJ, Float, FloatField, FloatFieldIJ -from ndsl.stencils import set_IJ_mask_value, set_value, set_value_2D from pyMoist.microphysics.GFDL_1M.config import GFDL1MConfig from pyMoist.microphysics.GFDL_1M.driver.config_constants import GFDL1MDriverConfigDependentConstants @@ -387,6 +386,21 @@ def update_outputs( ice = ice + internal_ice +def _reset(field: FloatField): + with computation(PARALLEL), interval(...): + field = 0 + + +def _reset_IJ(field: FloatFieldIJ): + with computation(FORWARD), interval(0, 1): + field = 0 + + +def _reset_mask(field: BoolFieldIJ): + with computation(FORWARD), interval(0, 1): + field = False + + @dataclasses.dataclass class Locals(LocalState): lhi: Local = dataclasses.field( @@ -584,20 +598,20 @@ def __init__( compute_dims=[I_DIM, J_DIM, K_DIM], ) - self._set_value_IJ = stencil_factory.from_dims_halo( - func=set_value_2D, + self._reset_IJ = stencil_factory.from_dims_halo( + func=_reset_IJ, compute_dims=[I_DIM, J_DIM, K_DIM], ) - self._set_value = stencil_factory.from_dims_halo( - func=set_value, + self._reset_3D = stencil_factory.from_dims_halo( + func=_reset, compute_dims=[I_DIM, J_DIM, K_DIM], ) - self._set_value_K_interface = stencil_factory.from_dims_halo( - func=set_value, + self._reset_K_interface = stencil_factory.from_dims_halo( + func=_reset, compute_dims=[I_DIM, J_DIM, K_INTERFACE_DIM], ) - self._set_IJ_mask = stencil_factory.from_dims_halo( - func=set_IJ_mask_value, + self._reset_mask = stencil_factory.from_dims_halo( + func=_reset_mask, compute_dims=[I_DIM, J_DIM, K_DIM], ) @@ -647,18 +661,18 @@ def __call__( """ # Reset locals - self._set_value(self._locals.lhi, Float(0)) - self._set_value(self._locals.icpk, Float(0)) - self._set_value(self._locals.cvm, Float(0)) - self._set_value(self._locals.mass, Float(0)) - self._set_value(self._locals.dmass, Float(0)) - self._set_value_K_interface(self._locals.z_interface, Float(0)) - self._set_value_K_interface(self._locals.z_interface_modified, Float(0)) - self._set_value_IJ(self._locals.rain, Float(0)) - self._set_value_IJ(self._locals.graupel, Float(0)) - self._set_value_IJ(self._locals.snow, Float(0)) - self._set_value_IJ(self._locals.ice, Float(0)) - self._set_IJ_mask(self._locals.precip_fall, False) + self._reset_3D(self._locals.lhi) + self._reset_3D(self._locals.icpk) + self._reset_3D(self._locals.cvm) + self._reset_3D(self._locals.mass) + self._reset_3D(self._locals.dmass) + self._reset_K_interface(self._locals.z_interface) + self._reset_K_interface(self._locals.z_interface_modified) + self._reset_IJ(self._locals.rain) + self._reset_IJ(self._locals.graupel) + self._reset_IJ(self._locals.snow) + self._reset_IJ(self._locals.ice) + self._reset_mask(self._locals.precip_fall) self._setup( t=t, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/warm_rain.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/warm_rain.py index 80140baa8..1db83d292 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/warm_rain.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/driver/warm_rain.py @@ -800,6 +800,18 @@ def __init__( compute_dims=[I_DIM, J_DIM, K_DIM], ) + # Dev NOTE: this is an orchestration workaround. Direct call to + # `self.saturation_tables.X` fails closure capture for + # argument reconstruction at call time + self._table1 = self.saturation_tables.table1 + self._table2 = self.saturation_tables.table2 + self._table3 = self.saturation_tables.table3 + self._table4 = self.saturation_tables.table4 + self._des1 = self.saturation_tables.des1 + self._des2 = self.saturation_tables.des2 + self._des3 = self.saturation_tables.des3 + self._des4 = self.saturation_tables.des4 + def __call__( self, t: FloatField, @@ -898,14 +910,14 @@ def __call__( z_interface=self._locals.z_interface, dmass=self._locals.dmass, precip_fall=self._locals.precip_fall, - table1=self.saturation_tables.table1, - table2=self.saturation_tables.table2, - table3=self.saturation_tables.table3, - table4=self.saturation_tables.table4, - des1=self.saturation_tables.des1, - des2=self.saturation_tables.des2, - des3=self.saturation_tables.des3, - des4=self.saturation_tables.des4, + table1=self._table1, + table2=self._table2, + table3=self._table3, + table4=self._table4, + des1=self._des1, + des2=self._des2, + des3=self._des3, + des4=self._des4, ) if not self.config.USE_PPM: @@ -937,14 +949,14 @@ def __call__( w=w, rh_limited=rh_limited, dmass=self._locals.dmass, - table1=self.saturation_tables.table1, - table2=self.saturation_tables.table2, - table3=self.saturation_tables.table3, - table4=self.saturation_tables.table4, - des1=self.saturation_tables.des1, - des2=self.saturation_tables.des2, - des3=self.saturation_tables.des3, - des4=self.saturation_tables.des4, + table1=self._table1, + table2=self._table2, + table3=self._table3, + table4=self._table4, + des1=self._des1, + des2=self._des2, + des3=self._des3, + des4=self._des4, ) self._update_outputs( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/finalize.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/finalize.py index 73933ce68..0906e04c5 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/finalize.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/finalize.py @@ -7,14 +7,13 @@ from pyMoist.constants import MAPL_CP, MAPL_GRAV from pyMoist.microphysics.GFDL_1M.config import GFDL1MConfig from pyMoist.microphysics.GFDL_1M.radiation_coupling import GFDL1MRadiationCoupling +from pyMoist.microphysics.GFDL_1M.shared_stencils import update_tendencies from pyMoist.saturation_tables import GlobalTable_saturation_tables, SaturationVaporPressureTable, saturation_specific_humidity from pyMoist.shared.redistribute_clouds import redistribute_clouds @function -def fix_negative_precip( - precip: Float, -): +def fix_negative_precip(precip: Float): if precip < 1.0e-8: precip = 0.0 @@ -62,8 +61,14 @@ def finalize_precip( icefall = precipitated_ice + precipitated_graupel freezing_rainfall = 0.0 + # Convert precipitation fluxes from (Pa kg/kg) to (kg m-2 s-1) + # do lowest level first + large_scale_nonanvil_ice_flux = large_scale_nonanvil_ice_flux / (MAPL_GRAV * DT_MOIST) + large_scale_nonanvil_liquid_flux = large_scale_nonanvil_liquid_flux / (MAPL_GRAV * DT_MOIST) + with computation(FORWARD), interval(...): # Convert precipitation fluxes from (Pa kg/kg) to (kg m-2 s-1) + # all other levels (k_interface_dim) large_scale_nonanvil_ice_flux[0, 0, 1] = large_scale_nonanvil_ice_flux[0, 0, 1] / (MAPL_GRAV * DT_MOIST) large_scale_nonanvil_liquid_flux[0, 0, 1] = large_scale_nonanvil_liquid_flux[0, 0, 1] / (MAPL_GRAV * DT_MOIST) @@ -102,11 +107,10 @@ def fix_humidity( vapor: FloatField, t: FloatField, p_mb: FloatField, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, ): with computation(PARALLEL), interval(...): - qsat, _ = saturation_specific_humidity(t, p_mb * 100, ese, esx) + qsat, _ = saturation_specific_humidity(t, p_mb * 100.0, esx) relative_humidity = vapor / qsat @@ -223,14 +227,12 @@ def __init__( quantity_factory: QuantityFactory, config: GFDL1MConfig, saturation_tables: SaturationVaporPressureTable, - update_tendencies, ): # init NDSLRuntime super().__init__(stencil_factory) # make the config, pre-build stencil, and saturation tables visible at runtime self.config = config - self.update_tendencies = update_tendencies self.saturation_tables = saturation_tables # construct stencils @@ -271,6 +273,14 @@ def __init__( compute_dims=[I_DIM, J_DIM, K_DIM], ) + self._update_tendencies = stencil_factory.from_dims_halo( + func=update_tendencies, + compute_dims=[I_DIM, J_DIM, K_DIM], + externals={ + "DT_MOIST": config.DT_MOIST, + }, + ) + self._update_rainwater_source = stencil_factory.from_dims_halo( func=update_rainwater_source, compute_dims=[I_DIM, J_DIM, K_DIM], @@ -289,9 +299,13 @@ def __init__( # Dev NOTE: this is an orchestration workaround. Direct call to # `self.saturation_tables.X` fails closure capture for # argument reconstruction at call time - self._ese = self.saturation_tables.ese self._esx = self.saturation_tables.esx + def post_init(self, do_radar_diagnostic: bool): + self._do_radar_diagnostic = do_radar_diagnostic + if self._do_radar_diagnostic: + ndsl_log.warning("pyMoist.GFDL_1M: Radar diagnostic not implemented!") + def __call__( self, t, @@ -433,7 +447,6 @@ def __call__( vapor=mixing_ratio_vapor, t=t, p_mb=local_p_mb, - ese=self._ese, esx=self._esx, ) @@ -506,7 +519,7 @@ def __call__( liquid_radius=cloud_particle_effective_radius_liquid, ) - self.update_tendencies( + self._update_tendencies( u=u, v=v, t=t, @@ -551,14 +564,7 @@ def __call__( t_tendency=dtdt_friction_pressure_weighted, ) - if ( - simulated_reflectivity is not None - or maximum_composite_reflectivity is not None - or base_1km_agl_reflectivity is not None - or echo_top_reflectivity is not None - or minus_10c_reflectivity is not None - ): - ndsl_log.warning("Diagnostic radar output not implemented yet.") + # TODO: implement radar diagnostic here # new code from v11.8.1, is not tested (translate tests are based on data from v11.5.2) if mass_fraction_suspended_rain is not None: diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/radiation_coupling.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/radiation_coupling.py index 68cd1c40b..5dd0304f1 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/radiation_coupling.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/radiation_coupling.py @@ -14,7 +14,6 @@ def update_humidity( pressure: FloatField, vapor: FloatField, humidity: FloatField, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, ): """Update humidity with mixing ratios updated by driver output @@ -24,11 +23,10 @@ def update_humidity( pressure (FloatField) vapor (FloatField) humidity (FloatField) - ese (GlobalTable_saturation_tables) esx (GlobalTable_saturation_tables) """ with computation(PARALLEL), interval(...): - qsat, _ = saturation_specific_humidity(temperature, pressure * 100, ese, esx) + qsat, _ = saturation_specific_humidity(temperature, pressure * 100.0, esx) humidity = vapor * qsat @@ -79,6 +77,11 @@ def __init__( if config.DO_QA: ndsl_log.log("[Radiation Coupling] DO_QA option implemented, but untested. " "Running untested code... proceed with caution") + # Dev NOTE: this is an orchestration workaround. Direct call to + # `self.saturation_tables.X` fails closure capture for + # argument reconstruction at call time + self._esx = self.saturation_tables.esx + def __call__( self, t: Quantity, @@ -180,6 +183,5 @@ def __call__( pressure=local_p_mb, vapor=mixing_ratio_vapor, humidity=relative_humidity_after_pdf, - ese=self.saturation_tables.ese, - esx=self.saturation_tables.esx, + esx=self._esx, ) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/setup.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/setup.py index 8f50a2596..0912212e8 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/setup.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/microphysics/GFDL_1M/setup.py @@ -53,7 +53,6 @@ def calculate_derived_states( mass: FloatField, mass_inverse: FloatField, t: FloatField, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, sat: FloatField, dsat: FloatField, @@ -80,7 +79,6 @@ def calculate_derived_states( mass (FloatField) mass_inverse (FloatField) t (FloatField) - ese (GlobalTable_saturation_tables) esx (GlobalTable_saturation_tables) sat (FloatField) dsat (FloatField) @@ -103,7 +101,7 @@ def calculate_derived_states( dp = p_interface[0, 0, 1] - p_interface mass = dp / MAPL_GRAV mass_inverse = 1 / mass - sat, dsat = saturation_specific_humidity(t=t, p=p_mb * 100, ese=ese, esx=esx) + sat, dsat = saturation_specific_humidity(t=t, p=p_mb * 100.0, esx=esx) u_unmodified = u v_unmodified = v th = (100.0 * p_mb / MAPL_P00) ** (MAPL_KAPPA) @@ -136,7 +134,6 @@ def find_lcl_level( t: FloatField, p_mb: FloatField, vapor: FloatField, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, lcl_level: IntFieldIJ, ): @@ -147,7 +144,6 @@ def find_lcl_level( t (FloatField): (in) Atmospheric temperature (K) p_mb (FloatField): (in) pressure (mb) vapor (FloatField): (in) water vapor mixing radio (kg/kg) - ese (GlobalTable_saturation_tables): (in) saturation vapor pressure table, details unknown esx (GlobalTable_saturation_tables): (in) saturation vapor pressure table, details unknown lcl_level (IntFieldIJ): (out) LCL level """ @@ -159,10 +155,10 @@ def find_lcl_level( # get LCL pressure with computation(PARALLEL), interval(-1, None): - qsat, _ = saturation_specific_humidity(t=t, p=p_mb * 100, ese=ese, esx=esx) - rhsfc = 100 * vapor / qsat + qsat, _ = saturation_specific_humidity(t=t, p=p_mb * 100.0, esx=esx) + rhsfc = 100.0 * vapor / qsat tlcl = find_t_lcl(t=t, rh=rhsfc) - rm = (1 - vapor) * MAPL_RGAS + vapor * MAPL_RVAP + rm = (1.0 - vapor) * MAPL_RGAS + vapor * MAPL_RVAP cpm = (1.0 - vapor) * MAPL_CPDRY + vapor * MAPL_CPVAP plcl = p_mb * ((tlcl / t) ** (cpm / rm)) @@ -198,7 +194,6 @@ def compute_estimated_inversion_strength( th700: FloatFieldIJ, z700: FloatFieldIJ, lcl_level: IntFieldIJ, - ese: GlobalTable_saturation_tables, esx: GlobalTable_saturation_tables, lower_tropospheric_stability: FloatFieldIJ, estimated_inversion_strength: FloatFieldIJ, @@ -216,7 +211,6 @@ def compute_estimated_inversion_strength( th700 (FloatFieldIJ) z700 (FloatFieldIJ) lcl_level (IntFieldIJ) - ese (GlobalTable_saturation_tables) esx (GlobalTable_saturation_tables) lower_tropospheric_stability (FloatFieldIJ) estimated_inversion_strength (FloatFieldIJ) @@ -227,7 +221,7 @@ def compute_estimated_inversion_strength( # Simplified single adiabat eq4 of https://doi.org/10.1175/JCLI3988.1 t850 = 0.5 * (t + t700) - qs850, _ = saturation_specific_humidity(t=t850, p=100 * 850, ese=ese, esx=esx) + qs850, _ = saturation_specific_humidity(t=t850, p=100.0 * 850.0, esx=esx) gamma850 = (1.0 + (MAPL_ALHL * qs850 / (MAPL_RGAS * t850))) / (1.0 + (MAPL_ALHL * MAPL_ALHL * qs850 / (MAPL_CP * MAPL_RVAP * t850 * t850))) gamma850 = MAPL_GRAV / MAPL_CP * (1.0 - gamma850) estimated_inversion_strength = lower_tropospheric_stability - gamma850 * (z700 - lcl_height) @@ -374,7 +368,6 @@ def __init__( # Dev NOTE: this is an orchestration workaround. Direct call to # `self.saturation_tables.X` fails closure capture for # argument reconstruction at call time - self._ese = self.saturation_tables.ese self._esx = self.saturation_tables.esx def __call__( @@ -533,8 +526,7 @@ def __call__( mass=local_mass, mass_inverse=local_mass_inverse, t=t, - ese=self._ese, - esx=self.saturation_tables.esx, + esx=self._esx, sat=local_saturation_specific_humidity, dsat=local_dsaturation_specific_humidity, u=u, @@ -548,7 +540,6 @@ def __call__( t=t, p_mb=local_p_mb, vapor=mixing_ratio_vapor, - ese=self._ese, esx=self._esx, lcl_level=local_lcl_level, ) @@ -589,7 +580,6 @@ def __call__( th700=self._locals.th700, z700=self._locals.z700, lcl_level=local_lcl_level, - ese=self._ese, esx=self._esx, lower_tropospheric_stability=lower_tropospheric_stability, estimated_inversion_strength=estimated_inversion_strength, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/saturation_specific_humidity_functions.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/saturation_specific_humidity_functions.py index a3b85fb29..24781bd17 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/saturation_specific_humidity_functions.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/saturation_specific_humidity_functions.py @@ -1,6 +1,6 @@ from ndsl.dsl.gt4py import floor, function, int32 -from pyMoist.saturation_tables.constants import DEGSUBS, ERFAC, ESFAC, MAPL_TICE, MAX_MIXING_RATIO, TABLESIZE, TMAXTBL, TMINLQU, TMINTBL, TMIX +from pyMoist.saturation_tables.constants import DEGSUBS, ERFAC, ESFAC, MAPL_TICE, MAX_MIXING_RATIO, TABLESIZE, TMAXTBL, TMINLQU, TMINTBL @function @@ -33,7 +33,7 @@ def saturation_specific_humidity_frozen_surface( qsat = frz ddq = 0.0 else: - t = (t - TMINTBL) * DEGSUBS + 1 + t = (t - TMINTBL) * DEGSUBS + 1.0 t_integer = int(floor(t)) ddq = ese.A[t_integer] - ese.A[t_integer - 1] # type: ignore qsat = (t - t_integer) * ddq + ese.A[t_integer - 1] # type: ignore @@ -84,7 +84,7 @@ def saturation_specific_humidity_liquid_surface( qsat = esw.A[TABLESIZE_MINUS_1] # type: ignore ddq = 0.0 else: - t = (t - TMINTBL) * DEGSUBS + 1 + t = (t - TMINTBL) * DEGSUBS + 1.0 t_integer = int(floor(t)) ddq = esw.A[t_integer] - esw.A[t_integer - 1] # type: ignore qsat = (t - t_integer) * ddq + esw.A[t_integer - 1] # type: ignore @@ -105,14 +105,7 @@ def saturation_specific_humidity_liquid_surface( @function -def saturation_specific_humidity( - t, - p, - ese, - esx, - use_ramp=False, - ramp=-999.0, -): +def saturation_specific_humidity(t, p, esx): """Compute saturation specific humidity and derivative saturation specific humidity with respect to temperature from saturation pressure tables. @@ -121,35 +114,24 @@ def saturation_specific_humidity( Arguments: t (Float): temperature in Kelvin p (Float): pressure in Pascals - ese (Float): saturation pressure table in Pascals, specifics unknown esx (Float): saturation pressure table in Pascals, specifics unknown - use_ramp (Bool): trigger for "ramp" option. details unknown - ramp (Float): parameter used for "ramp" option. details unknown Returns: qsat (Float): saturation specific humidity dqsat (Float): derivative saturation specific humidity with respect to temperature """ - if use_ramp: - uramp = -abs(ramp) - else: - uramp = TMIX if t <= TMINTBL: t = TMINTBL elif t >= TMAXTBL - 0.001: t = TMAXTBL - 0.001 - t = (t - TMINTBL) * DEGSUBS + 1 + t = (t - TMINTBL) * DEGSUBS + 1.0 t_integer = int32(floor(t)) IT_MINUS_1 = t_integer - 1 - if uramp == TMIX: - dq = esx.A[t_integer] - esx.A[IT_MINUS_1] # type: ignore - qsat = (t - t_integer) * dq + esx.A[IT_MINUS_1] # type: ignore - else: - dq = ese.A[t_integer] - ese.A[IT_MINUS_1] # type: ignore - qsat = (t - t_integer) * dq + ese.A[IT_MINUS_1] # type: ignore + dq = esx.A[t_integer] - esx.A[IT_MINUS_1] # type: ignore + qsat = (t - t_integer) * dq + esx.A[IT_MINUS_1] # type: ignore if p <= qsat: qsat = MAX_MIXING_RATIO diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/tables/main.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/tables/main.py index 0d40f9f4a..9b810b6ba 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/tables/main.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/saturation_tables/tables/main.py @@ -1,6 +1,4 @@ -from typing import Dict, Optional - -from ndsl.boilerplate import get_factories_single_tile +from ndsl import QuantityFactory, StencilFactory, SubtileGridSizer from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.dsl.gt4py import PARALLEL, K, computation, interval from ndsl.dsl.typing import Float, FloatField, Int @@ -127,18 +125,20 @@ class SaturationVaporPressureTable: def __init__( self, - backend, + stencil_factory: StencilFactory, formulation: SaturationFormulation = SaturationFormulation.Staars, ) -> None: table_compute_domain = (1, 1, TABLESIZE) - stencil_factory, quantity_factory = get_factories_single_tile( - table_compute_domain[0], - table_compute_domain[1], - table_compute_domain[2], - 0, - backend, + sizer = SubtileGridSizer( + nx=table_compute_domain[0], + ny=table_compute_domain[1], + nz=table_compute_domain[2], + n_halo=0, + data_dimensions={}, + backend=stencil_factory.backend, ) + quantity_factory = QuantityFactory(sizer, backend=stencil_factory.backend) if formulation == SaturationFormulation.Staars: formulation_int = Int(1) @@ -162,6 +162,8 @@ def __init__( compute_tables = stencil_factory.from_dims_halo( func=_compute_tables, compute_dims=[I_DIM, J_DIM, K_DIM], + origin=(0, 0, 0), + domain=table_compute_domain, ) compute_tables( self._estimated_ese, @@ -213,7 +215,7 @@ def lqu(self): # Table needs to be calculated only once -_cached_estimated_saturation: Dict[SaturationFormulation, Optional[SaturationVaporPressureTable]] = { +_cached_estimated_saturation: dict[SaturationFormulation, SaturationVaporPressureTable | None] = { SaturationFormulation.MurphyAndKoop: None, SaturationFormulation.CAM: None, SaturationFormulation.Staars: None, @@ -221,9 +223,9 @@ def lqu(self): def get_saturation_vapor_pressure_table( - backend, + stencil_factory: StencilFactory, formulation: SaturationFormulation = SaturationFormulation.Staars, ) -> SaturationVaporPressureTable: if _cached_estimated_saturation[formulation] is None: - _cached_estimated_saturation[formulation] = SaturationVaporPressureTable(backend, formulation) + _cached_estimated_saturation[formulation] = SaturationVaporPressureTable(stencil_factory, formulation) return _cached_estimated_saturation[formulation] diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/incloud_processes.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/incloud_processes.py index 57b477bc4..9d055cee7 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/incloud_processes.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/incloud_processes.py @@ -163,9 +163,6 @@ def cloud_effective_radius_ice( bb = -2.0 else: bb = -2.0 + log10(wc / 50.0) * (1.0e-3 * (constants.MAPL_TICE - temperature) ** 1.5) - # NOTE: there is an issue in this line which causes differences between Fortran and Python - # the multiplication "-2.0 * log'd result" is performed differently (~60 ULP), despite the log - # being correct. Needs to be looked into at some point, but not critical for overall performance. bb = min(max(bb, -6.0), -2.0) radius = 377.4 + 203.3 * bb + 37.91 * bb**2 + 2.3696 * bb**3 radius = min(150.0e-6, max(5.0e-6, 1.0e-6 * radius)) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/interpolations.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/interpolations.py index 87ff8f740..64146ef1b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/interpolations.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/interpolations.py @@ -21,10 +21,10 @@ def vertical_interpolation_interface( """ with computation(FORWARD), interval(-1, None): - pb: FloatFieldIJ = log(p_interface_mb * 100) + pb: FloatFieldIJ = log(p_interface_mb * 100.0) with computation(BACKWARD), interval(0, -1): - pt: FloatFieldIJ = log(p_interface_mb * 100) + pt: FloatFieldIJ = log(p_interface_mb * 100.0) if log(target_pressure) > pt and log(target_pressure) <= pb: al = (pb - log(target_pressure)) / (pb - pt) interpolated_field = field * al + field[0, 0, 1] * (1.0 - al) @@ -53,13 +53,13 @@ def vertical_interpolation( track_points: BoolFieldIJ = False # with computation(PARALLEL), interval(...): - # p = log(p_interface_mb * 100) + # p = log(p_interface_mb * 100.0) with computation(FORWARD), interval(-1, None): - pb: FloatFieldIJ = 0.5 * (log(p_interface_mb * 100) + log(p_interface_mb[0, 0, 1] * 100)) + pb: FloatFieldIJ = 0.5 * (log(p_interface_mb * 100.0) + log(p_interface_mb[0, 0, 1] * 100.0)) with computation(BACKWARD), interval(1, None): - pt: FloatFieldIJ = 0.5 * (log(p_interface_mb[0, 0, -1] * 100) + log(p_interface_mb * 100)) + pt: FloatFieldIJ = 0.5 * (log(p_interface_mb[0, 0, -1] * 100.0) + log(p_interface_mb * 100.0)) if log(target_pressure) > pt and log(target_pressure) <= pb and not track_points: al = (pb - log(target_pressure)) / (pb - pt) interpolated_field = field[0, 0, -1] * al + field * (1.0 - al) @@ -67,8 +67,8 @@ def vertical_interpolation( pb = pt with computation(FORWARD), interval(-1, None): - pb2: FloatFieldIJ = 0.5 * (log(p_interface_mb * 100) + log(p_interface_mb[0, 0, 1] * 100)) - if log(target_pressure) > pb2 and log(target_pressure) <= log(p_interface_mb[0, 0, 1] * 100) and not track_points: + pb2: FloatFieldIJ = 0.5 * (log(p_interface_mb * 100.0) + log(p_interface_mb[0, 0, 1] * 100.0)) + if log(target_pressure) > pb2 and log(target_pressure) <= log(p_interface_mb[0, 0, 1] * 100.0) and not track_points: interpolated_field = field track_points = True diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/numerical_recipes.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/numerical_recipes.py index 6375d3af7..4f2d90bdd 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/numerical_recipes.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyMoist/shared/numerical_recipes.py @@ -1,8 +1,7 @@ -import gt4py.cartesian.gtscript as gtscript -from gt4py.cartesian.gtscript import exp, float64, log +from ndsl.dsl.gt4py import exp, float64, function, log -@gtscript.function +@function def GammLn(xx: float64) -> float64: """ See numerical recipes, w. press et al., 2nd edition. @@ -34,7 +33,7 @@ def GammLn(xx: float64) -> float64: return tmp + log(stp * ser / x) -@gtscript.function +@function def gser(a: float64, x: float64, gln: float64) -> float64: """ See numerical recipes, w. press et al., 2nd edition. @@ -76,7 +75,7 @@ def gser(a: float64, x: float64, gln: float64) -> float64: return gamser -@gtscript.function +@function def gcf_matrix(a: float64, x: float64, gln: float64) -> float64: """ See numerical recipes, w. press et al., 2nd edition. @@ -119,7 +118,7 @@ def gcf_matrix(a: float64, x: float64, gln: float64) -> float64: return exp(-x + a * log(x) - gln) * h -@gtscript.function +@function def GammP(a: float64, x: float64) -> float64: """ See numerical recipes, w. press et al., 2nd edition. @@ -145,7 +144,7 @@ def GammP(a: float64, x: float64) -> float64: return gammp -@gtscript.function +@function def Erf(x: float64) -> float64: """ See numerical recipes, w. press et al., 2nd edition. diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyproject.toml b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyproject.toml index e0b1c1d97..432fdda68 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyproject.toml +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/pyproject.toml @@ -10,17 +10,22 @@ classifiers = [ "Topic :: Scientific/Engineering :: Atmospheric Science", "Private :: Do Not Upload", "Natural Language :: English", - "Programming Language :: Python :: 3" + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13" ] dependencies = [ + "build", + "coverage", + "flake8-pyproject", + "ndsl @ git+https://github.com/romanc/NDSL.git@romanc/gfdl-1m-fixes", "mkdocs-material", "mkdocstrings[python]", "mkdocs-exclude", + "pre-commit", "pytest", - "pytest-subtests", - "coverage", - "flake8-pyproject", - "build" + "pytest-subtests" ] description = "pyMoist is the NDSL version of NASA GMAO's GEOS Moist physics. Please contact maintainer if used outside of GEOS." license = "Apache-2.0" diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/numerical/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/numerical/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/numerical/test_constants.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/numerical/test_constants.py index 5b3604f66..2aea86602 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/numerical/test_constants.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/numerical/test_constants.py @@ -1,4 +1,4 @@ -import os +from pathlib import Path from types import ModuleType import xarray as xr @@ -16,23 +16,19 @@ def _get_constant_from_module(my_module: ModuleType) -> list[str]: # All public module var module_var = [item for item in dir(my_module) if not item.startswith("_")] # Get rid of the imports - imports = ["np", "Float", "Int"] + imports = ["np", "os", "Float", "Int"] for i in imports: module_var.remove(i) # Remove non testable constants - non_testable_const = ["MAPL_UNDEF", "NCNST", "FLOAT_TINY"] + non_testable_const = ["MAPL_UNDEF", "NCNST", "FLOAT_TINY", "EXP_NAME", "NUMBER_OF_TRACERS", "EXPERIMENT_TRACERS"] for nc in non_testable_const: module_var.remove(nc) return module_var -def _load_refrence_nc() -> xr.Dataset: - this_dir_path = os.path.dirname(os.path.realpath(__file__)) - data_dir = os.path.abspath(os.path.join(this_dir_path, "./data")) - print(f"Looking in {data_dir}") - ds = xr.open_mfdataset(f"{data_dir}/Constants.*.nc") - - return ds +def _load_reference_nc() -> xr.Dataset: + data_dir = Path(__file__).parent / "data" + return xr.open_mfdataset(f"{data_dir}/Constants.*.nc") def _run_python_vs_fortran(fortran_value_as_dataset: xr.Dataset, my_module: ModuleType) -> None: @@ -70,7 +66,7 @@ def _run_python_vs_fortran(fortran_value_as_dataset: xr.Dataset, my_module: Modu def test_shared_constants() -> None: - ds = _load_refrence_nc() + ds = _load_reference_nc() _run_python_vs_fortran(ds, shared_const) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/overrides.yml b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/overrides.yml index bea0766d8..10e20609a 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/overrides.yml +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/overrides.yml @@ -1,15 +1,3 @@ -ComputeUwshcuInv: - - backend: st:python:cpu:IJK - multimodal: - absolute_epsilon: 1.00e-08 - relative_fraction: 1.00e-04 - ulp_threshold: 5000.0 - - backend: st:dace:cpu:IJK - multimodal: - absolute_epsilon: 1.00e-08 - ulp_threshold: 1000 - - GFDL_1M_PhaseChange: - backend: st:dace:cpu:KJI multimodal: diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_all.sh b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_all.sh index 94a9dc0e1..edec7527b 100755 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_all.sh +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_all.sh @@ -1,17 +1,19 @@ #!/bin/bash -# Usage: ./run_tests.sh [/path/to/data] [debug|dace:cpu_kfirst] +# Usage: ./run_all.sh [/path/to/data] [st:python:cpu:IJK|st:dace:cpu:IJK] +# NDSL configuration export NDSL_LITERAL_PRECISION=32 -export NDSL_TEST_N_THRESHOLD_SAMPLES=0 export GT4PY_COMPILE_OPT_LEVEL=0 -export FV3_DACEMODE=BuildAndRun -export NDSL_LOGLEVEL=Critical +export NDSL_LOGLEVEL=Info + +# pyMoist configuration +export EXP_NAME='gcm-fp' # UW specific export GT4PY_EXTRA_COMPILE_OPT_FLAGS='-fconstexpr-ops-limit=1000000000' -python -m pytest -s -v --disable-warnings --multimodal_metric \ +python -m pytest -s -v --multimodal_metric \ --data_path=$1 \ --backend=$2 \ --grid=default \ diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_tests.sh b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_tests.sh index 00eff69b6..e50c257a3 100755 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_tests.sh +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/scripts/run_tests.sh @@ -1,26 +1,29 @@ #!/bin/bash -# Usage: ./run_tests.sh [/path/to/data] [debug|dace:cpu_kfirst] [TranslateName] +# Usage: ./run_tests.sh [/path/to/data] [st:python:cpu:IJK|st:dace:cpu:IJK] [TranslateName] +# NDSL configuration export NDSL_LITERAL_PRECISION=32 -export NDSL_TEST_N_THRESHOLD_SAMPLES=0 export GT4PY_COMPILE_OPT_LEVEL=0 -export FV3_DACEMODE=BuildAndRun -# export OPENMP_CPPFLAGS=" " -# export OPENMP_LDFLAGS=" " +export NDSL_LOGLEVEL=Debug -# UW specific -#export GT4PY_EXTRA_COMPILE_OPT_FLAGS='-fconstexpr-ops-limit=1000000000' +# stree optimization +export NDSL_STREE_OPT=False +# verbose debugging flags +export NDSL_VERBOSE_ORCHESTRATION=False +export NDSL_VERBOSE_SCHEDULE_TREE_OPTIMIZATIONS=False + +# pyMoist configuration export EXP_NAME='gcm-fp' -python -m pytest -s -v --disable-warnings --multimodal_metric \ +python -m pytest -s -v --multimodal_metric \ --data_path=$1 \ --backend=$2\ --which_modules=$3 \ - --which_rank=0 \ --grid=default \ - --no_report \ --threshold_overrides_file=./overrides.yml \ --which_rank=0 \ ../translate_tests + +# --which_savepoint=0 \ diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/__init__.py index c0d8e1569..20a79b824 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/__init__.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/__init__.py @@ -330,6 +330,7 @@ from .convection.UW.UW_translate_tests.translate_setup_outputs import TranslateSetupOutputs from .convection.UW.UW_translate_tests.translate_tracer_tendencies import TranslateTracerTendencies from .convection.UW.UW_translate_tests.translate_update_output_variables1 import TranslateUpdateOutputVars1 +from .convection.UW.UW_translate_tests.translate_update_output_variables2 import TranslateUpdateOutputVars2 from .microphysics.GFDL_1M.driver.translate_GFDL_1M_Driver import TranslateGFDL_1M_Driver from .microphysics.GFDL_1M.driver.translate_GFDL_1M_DriverFinish import TranslateGFDL_1M_DriverFinish from .microphysics.GFDL_1M.driver.translate_GFDL_1M_DriverSetup import TranslateGFDL_1M_DriverSetup diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/air_density/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/air_density/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/buoyancy/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/buoyancy/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/convection_tracers/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/convection_tracers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/diurnal_cycle/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/diurnal_cycle/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/downdraft/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/downdraft/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/entrainment/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/entrainment/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/environment/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/environment/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/get_levels/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/get_levels/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/kinetic_energy_to_heating/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/kinetic_energy_to_heating/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/large_scale_forcing/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/large_scale_forcing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/moist_static_energy/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/moist_static_energy/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/precip/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/precip/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/prepare_output/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/prepare_output/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/profiles/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/profiles/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/setup/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/setup/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/smoothing/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/smoothing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/translate_GF2020_CumulusParameterization.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/translate_GF2020_CumulusParameterization.py index 364893f4e..7a661529f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/translate_GF2020_CumulusParameterization.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/translate_GF2020_CumulusParameterization.py @@ -167,7 +167,7 @@ def compute_func(self, **inputs): convection_tracers.is_wetdep.field[:] = self.convection_tracers_input["is_wetdep"] # initialize pyMoist saturation tables - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) # initialize state state = GF2020CumulusParameterizationState.zeros( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/triggers/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/triggers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/updraft/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/updraft/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/updraft/translate_GF2020_CumulusParameterization_UpdraftCIN.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/updraft/translate_GF2020_CumulusParameterization_UpdraftCIN.py index 3f02e4fd2..7149a6a8d 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/updraft/translate_GF2020_CumulusParameterization_UpdraftCIN.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/updraft/translate_GF2020_CumulusParameterization_UpdraftCIN.py @@ -74,22 +74,22 @@ def __call__(self, constants: dict, cu_param_constants: dict, plume: str, **inpu ) # fill relevant parts of dataclasses - state.output.error_code.data[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["error_code"] - state.output.updraft_origin_level.data[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["updraft_origin_level"] - 1 - state.output.updraft_lfc_level.data[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["updraft_lfc_level"] - 1 - state.output.cloud_top_level.data[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["cloud_top_level"] - 1 - locals.geopotential_height_cloud_levels.data[:] = inputs["local_geopotential_height_cloud_levels"] - locals.geopotential_height_cloud_levels_forced.data[:] = inputs["local_geopotential_height_cloud_levels_forced"] - locals.normalized_massflux_updraft.data[:] = inputs["local_normalized_massflux_updraft"] - state.output.normalized_massflux_updraft_forced.data[:, :, :, plume_dependent_constants.PLUME_INDEX] = inputs["normalized_massflux_updraft_forced"] - locals.d_buoyancy.data[:] = inputs["local_d_buoyancy"] - locals.d_buoyancy_forced.data[:] = inputs["local_d_buoyancy_forced"] - locals.gamma_cloud_levels.data[:] = inputs["local_gamma_cloud_levels"] - locals.gamma_cloud_levels_forced.data[:] = inputs["local_gamma_cloud_levels_forced"] - locals.t_cloud_levels.data[:] = inputs["local_t_cloud_levels"] - locals.t_cloud_levels_forced.data[:] = inputs["local_t_cloud_levels_forced"] - locals.cin_0.data[:] = inputs["local_cin_0"] - locals.cin_1.data[:] = inputs["local_cin_1"] + state.output.error_code.field[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["error_code"] + state.output.updraft_origin_level.field[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["updraft_origin_level"] - 1 + state.output.updraft_lfc_level.field[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["updraft_lfc_level"] - 1 + state.output.cloud_top_level.field[:, :, plume_dependent_constants.PLUME_INDEX] = inputs["cloud_top_level"] - 1 + locals.geopotential_height_cloud_levels.field[:] = inputs["local_geopotential_height_cloud_levels"] + locals.geopotential_height_cloud_levels_forced.field[:] = inputs["local_geopotential_height_cloud_levels_forced"] + locals.normalized_massflux_updraft.field[:] = inputs["local_normalized_massflux_updraft"] + state.output.normalized_massflux_updraft_forced.field[:, :, :, plume_dependent_constants.PLUME_INDEX] = inputs["normalized_massflux_updraft_forced"] + locals.d_buoyancy.field[:] = inputs["local_d_buoyancy"] + locals.d_buoyancy_forced.field[:] = inputs["local_d_buoyancy_forced"] + locals.gamma_cloud_levels.field[:] = inputs["local_gamma_cloud_levels"] + locals.gamma_cloud_levels_forced.field[:] = inputs["local_gamma_cloud_levels_forced"] + locals.t_cloud_levels.field[:] = inputs["local_t_cloud_levels"] + locals.t_cloud_levels_forced.field[:] = inputs["local_t_cloud_levels_forced"] + locals.cin_0.field[:] = inputs["local_cin_0"] + locals.cin_1.field[:] = inputs["local_cin_1"] # initialize test code code = UpdraftCIN( @@ -122,22 +122,22 @@ def __call__(self, constants: dict, cu_param_constants: dict, plume: str, **inpu # write output outputs = { - "error_code": state.output.error_code.data[:, :, plume_dependent_constants.PLUME_INDEX], - "updraft_origin_level": state.output.updraft_origin_level.data[:, :, plume_dependent_constants.PLUME_INDEX] + 1, - "updraft_lfc_level": state.output.updraft_lfc_level.data[:, :, plume_dependent_constants.PLUME_INDEX] + 1, - "cloud_top_level": state.output.cloud_top_level.data[:, :, plume_dependent_constants.PLUME_INDEX] + 1, - "local_geopotential_height_cloud_levels": locals.geopotential_height_cloud_levels.data[:], - "local_geopotential_height_cloud_levels_forced": locals.geopotential_height_cloud_levels_forced.data[:], - "local_normalized_massflux_updraft": locals.normalized_massflux_updraft.data[:], - "normalized_massflux_updraft_forced": state.output.normalized_massflux_updraft_forced.data[:, :, :, plume_dependent_constants.PLUME_INDEX], - "local_d_buoyancy": locals.d_buoyancy.data[:], - "local_d_buoyancy_forced": locals.d_buoyancy_forced.data[:], - "local_gamma_cloud_levels": locals.gamma_cloud_levels.data[:], - "local_gamma_cloud_levels_forced": locals.gamma_cloud_levels_forced.data[:], - "local_t_cloud_levels": locals.t_cloud_levels.data[:], - "local_t_cloud_levels_forced": locals.t_cloud_levels_forced.data[:], - "local_cin_0": locals.cin_0.data[:], - "local_cin_1": locals.cin_1.data[:], + "error_code": state.output.error_code.field[:, :, plume_dependent_constants.PLUME_INDEX], + "updraft_origin_level": state.output.updraft_origin_level.field[:, :, plume_dependent_constants.PLUME_INDEX] + 1, + "updraft_lfc_level": state.output.updraft_lfc_level.field[:, :, plume_dependent_constants.PLUME_INDEX] + 1, + "cloud_top_level": state.output.cloud_top_level.field[:, :, plume_dependent_constants.PLUME_INDEX] + 1, + "local_geopotential_height_cloud_levels": locals.geopotential_height_cloud_levels.field[:], + "local_geopotential_height_cloud_levels_forced": locals.geopotential_height_cloud_levels_forced.field[:], + "local_normalized_massflux_updraft": locals.normalized_massflux_updraft.field[:], + "normalized_massflux_updraft_forced": state.output.normalized_massflux_updraft_forced.field[:, :, :, plume_dependent_constants.PLUME_INDEX], + "local_d_buoyancy": locals.d_buoyancy.field[:], + "local_d_buoyancy_forced": locals.d_buoyancy_forced.field[:], + "local_gamma_cloud_levels": locals.gamma_cloud_levels.field[:], + "local_gamma_cloud_levels_forced": locals.gamma_cloud_levels_forced.field[:], + "local_t_cloud_levels": locals.t_cloud_levels.field[:], + "local_t_cloud_levels_forced": locals.t_cloud_levels_forced.field[:], + "local_cin_0": locals.cin_0.field[:], + "local_cin_1": locals.cin_1.field[:], } return outputs @@ -158,7 +158,7 @@ def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("GF2020-constants") self.cu_param_constants = data_loader.load("GF2020_CumulusParameterization-constants") - def compute_func(self, **inputs): + def compute(self, inputs): outputs = self.test_core(self.constants, self.cu_param_constants, "shallow", **inputs) return outputs @@ -179,7 +179,7 @@ def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("GF2020-constants") self.cu_param_constants = data_loader.load("GF2020_CumulusParameterization-constants") - def compute_func(self, **inputs): + def compute(self, inputs): outputs = self.test_core(self.constants, self.cu_param_constants, "mid", **inputs) return outputs @@ -200,7 +200,7 @@ def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("GF2020-constants") self.cu_param_constants = data_loader.load("GF2020_CumulusParameterization-constants") - def compute_func(self, **inputs): + def compute(self, inputs): outputs = self.test_core(self.constants, self.cu_param_constants, "deep", **inputs) return outputs diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/vertical_discretization/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/cumulus_parameterization/vertical_discretization/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020.py index 0a2a845c9..77f5f8443 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020.py @@ -130,7 +130,7 @@ def compute(self, inputs): cumulus_parameterization_config = GF2020CumulusParameterizationConfig(**self.cu_param_constants) # initialize saturation tables - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) # initialize convection tracers convection_tracers = ConvectionTracers.ones( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Finalize.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Finalize.py index 7730138a4..85c96ec71 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Finalize.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Finalize.py @@ -540,7 +540,7 @@ def compute(self, inputs): convection_tracers.use_gocart.field[:] = self.convection_tracers_input["use_gocart"] convection_tracers.is_wetdep.field[:] = self.convection_tracers_input["is_wetdep"] - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) code = GF2020Finalize( stencil_factory=self.stencil_factory, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Setup.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Setup.py index bf64ff5b1..9039fa500 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Setup.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/GF_2020/translate_GF2020_Setup.py @@ -1,7 +1,6 @@ import numpy as np from f90nml import Namelist from ndsl import StencilFactory -from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py @@ -375,7 +374,7 @@ def compute(self, inputs): convection_tracers.use_gocart.field[:] = self.convection_tracers_input["use_gocart"] convection_tracers.is_wetdep.field[:] = self.convection_tracers_input["is_wetdep"] - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) code = GF2020Setup( stencil_factory=self.stencil_factory, @@ -395,8 +394,8 @@ def compute(self, inputs): # collapse plume dim for chemistry_tracers_output # NOTE ideally this has no numpy dependency - chemistry_tracers_output_5d_reordered = cumulus_parameterization_state.input_output.chemistry_tracers_output.field[:, :, :, [2, 0, 1], :] - grid_size = self.stencil_factory.grid_indexing.get_shape([I_DIM, J_DIM, K_DIM]) + chemistry_tracers_output_5d_reordered = cumulus_parameterization_state.input_output.chemistry_tracers_output.field[:, :, :, [2, 0, 1], :].copy() + grid_size = self.stencil_factory.grid_indexing.domain chemistry_tracers_output_4d = np.full([grid_size[0], grid_size[1], grid_size[2], NUMBER_OF_PLUMES * NUMBER_OF_TRACERS], np.nan) for plume in range(NUMBER_OF_PLUMES): chemistry_tracers_output_4d[ diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs1.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs1.py index ba92dab5d..a03833d5b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs1.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs1.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import adjust_implicit_CIN_inputs1 from pyMoist.convection.UW.config import UWConfiguration @@ -63,13 +61,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -140,10 +139,7 @@ def compute(self, inputs): v0_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") vten_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._adjust_implicit_CIN_inputs1( condensation=condensation, qv0=qv0, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs2.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs2.py index 6a5c2f2b6..06d175c08 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs2.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_adjust_implicit_CIN_inputs2.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import adjust_implicit_CIN_inputs2 from pyMoist.convection.UW.config import UWConfiguration @@ -46,13 +44,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -124,10 +123,7 @@ def compute(self, inputs): fer_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") fdr_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._adjust_implicit_CIN_inputs2( condensation=condensation, umf_s=umf_s, @@ -172,7 +168,6 @@ def compute(self, inputs): cufrc_s=cufrc_s, fer_s=fer_s, fdr_s=fdr_s, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN1.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN1.py index 23ba307ef..02e9986c9 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN1.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN1.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import avg_initial_and_final_cin1 from pyMoist.convection.UW.config import UWConfiguration @@ -43,13 +41,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -154,10 +153,7 @@ def compute(self, inputs): ssv0 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") ssv0_o = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(1) - - # # Call stencils + # Call stencils self._avg_initial_and_final_cin1( condensation=condensation, del_CIN=del_CIN, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN3.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN3.py index eff07edec..387532a50 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN3.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_average_initial_and_final_CIN3.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import avg_initial_and_final_cin3 from pyMoist.convection.UW.config import UWConfiguration @@ -48,13 +46,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -118,6 +117,7 @@ def compute(self, inputs): qlsub_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") qisub_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") qisub_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") + cush = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") cush_inout = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") cush_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") @@ -131,10 +131,7 @@ def compute(self, inputs): fer_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") fdr_s = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(1) - - # # Call stencils + # Call stencils self._avg_initial_and_final_cin3( condensation=condensation, del_CIN=del_CIN, @@ -170,6 +167,7 @@ def compute(self, inputs): qisub_s=qisub_s, cush_inout=cush_inout, cush_s=cush_s, + cush=cush, cufrc_out=cufrc_out, cufrc_s=cufrc_s, qtflx_out=qtflx_out, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting.py index 640cdbeef..25043388f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting.py @@ -1,14 +1,13 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM +from ndsl.dsl.gt4py import int32 from ndsl.dsl.typing import Int from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import buoyancy_sorting from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -69,27 +68,18 @@ def __init__( "testvar3D_3": self.grid.compute_dict(), "testvar3D_4": self.grid.compute_dict(), "testvar3D_5": self.grid.compute_dict(), - # "testvar3D_6": self.grid.compute_dict(), - # "testvar3D_7": self.grid.compute_dict(), - # "testvar3D_8": self.grid.compute_dict(), - # "testvar3D_9": self.grid.compute_dict(), - # "testvar3D_10": self.grid.compute_dict(), - # "testvar3D_11": self.grid.compute_dict(), - # "testvar3D_12": self.grid.compute_dict(), - # "testvar3D_13": self.grid.compute_dict(), - # "testvar3D_14": self.grid.compute_dict(), - # "testvar3D_15": self.grid.compute_dict(), } def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -224,7 +214,7 @@ def compute(self, inputs): xco = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") stop_buoyancy_sort = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a", dtype=bool) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -255,21 +245,11 @@ def compute(self, inputs): testvar3D_3 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") testvar3D_4 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") testvar3D_5 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_6 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_7 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_8 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_9 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_10 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_11 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_12 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_13 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_14 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_15 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") # The iteration you want to test iter_test = int32(0) - # # Call stencils + # Call stencils self._buoyancy_sorting( condensation=condensation, tscaleh=tscaleh, @@ -358,11 +338,6 @@ def compute(self, inputs): vflx_out=vflx_out, fer_out=fer_out, fdr_out=fdr_out, - testvar3D_1=testvar3D_1, - testvar3D_2=testvar3D_2, - testvar3D_3=testvar3D_3, - testvar3D_4=testvar3D_4, - testvar3D_5=testvar3D_5, ) return { @@ -371,14 +346,4 @@ def compute(self, inputs): "testvar3D_3": testvar3D_3.view[:], "testvar3D_4": testvar3D_4.view[:], "testvar3D_5": testvar3D_5.view[:], - # "testvar3D_6": testvar3D_6.view[:], - # "testvar3D_7": testvar3D_7.view[:], - # "testvar3D_8": testvar3D_8.view[:], - # "testvar3D_9": testvar3D_9.view[:], - # "testvar3D_10": testvar3D_10.view[:], - # "testvar3D_11": testvar3D_11.view[:], - # "testvar3D_12": testvar3D_12.view[:], - # "testvar3D_13": testvar3D_13.view[:], - # "testvar3D_14": testvar3D_14.view[:], - # "testvar3D_15": testvar3D_15.view[:], } diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting_fluxes.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting_fluxes.py index 59d2f6a41..d0c7b4184 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting_fluxes.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_buoyancy_sorting_fluxes.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import buoyancy_sorting_fluxes from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -67,13 +65,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -148,14 +147,11 @@ def compute(self, inputs): vflx = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") safe_assign_array(vflx.view[:], inputs["vflx"]) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._buoyancy_sorting_fluxes( condensation=condensation, kbup=kbup, @@ -184,7 +180,6 @@ def compute(self, inputs): uflx=uflx, vflx=vflx, slflx=slflx, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_cumulus_condensate_at_interface.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_cumulus_condensate_at_interface.py index 1ee246769..203901007 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_cumulus_condensate_at_interface.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_cumulus_condensate_at_interface.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_cumulus_condensate_at_interface from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -55,20 +53,18 @@ def __init__( "rcwp": self.grid.compute_dict(), "riwp": self.grid.compute_dict(), "rlwp": self.grid.compute_dict(), - "testvar3D_1": self.grid.compute_dict(), - "testvar3D_2": self.grid.compute_dict(), - "testvar3D_3": self.grid.compute_dict(), } def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -144,7 +140,7 @@ def compute(self, inputs): rlwp = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") safe_assign_array(rlwp.view[:], inputs["rlwp"]) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -185,13 +181,7 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_1 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_2 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_3 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._calc_cumulus_condensate_at_interfaces( condensation=condensation, krel=krel, @@ -217,7 +207,6 @@ def compute(self, inputs): rlwp=rlwp, riwp=riwp, cufrc=cufrc, - iteration=iter_test, cush=cush, umf_out=umf_out, dcm_out=dcm_out, @@ -239,9 +228,6 @@ def compute(self, inputs): vflx_out=vflx_out, fer_out=fer_out, fdr_out=fdr_out, - testvar3D_1=testvar3D_1, - testvar3D_2=testvar3D_2, - testvar3D_3=testvar3D_3, ) return { @@ -251,7 +237,4 @@ def compute(self, inputs): "rcwp": rcwp.view[:], "riwp": riwp.view[:], "rlwp": rlwp.view[:], - "testvar3D_1": testvar3D_1.view[:], - "testvar3D_2": testvar3D_2.view[:], - "testvar3D_3": testvar3D_3.view[:], } diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_entrainment_mass_flux.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_entrainment_mass_flux.py index c87d92a19..15533601f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_entrainment_mass_flux.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_entrainment_mass_flux.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_entrainment_mass_flux from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -68,13 +66,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -161,7 +160,7 @@ def compute(self, inputs): vu_emf = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") emf = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -172,10 +171,7 @@ def compute(self, inputs): vflx_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") cush_inout = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._calc_entrainment_mass_flux( condensation=condensation, thlu=thlu, @@ -210,7 +206,6 @@ def compute(self, inputs): uu_emf=uu_emf, vu_emf=vu_emf, emf=emf, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_momentum_tendency.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_momentum_tendency.py index 47637e3ee..22467fa24 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_momentum_tendency.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_momentum_tendency.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_momentum_tendency from pyMoist.convection.UW.config import UWConfiguration @@ -47,17 +45,22 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) - self._calc_momentum_tendency = self.stencil_factory.from_dims_halo(func=calc_momentum_tendency, compute_dims=[I_DIM, J_DIM, K_DIM], externals={"dt": config.dt}) + self._calc_momentum_tendency = self.stencil_factory.from_dims_halo( + func=calc_momentum_tendency, + compute_dims=[I_DIM, J_DIM, K_DIM], + externals={"dt": config.dt}, + ) # Inputs condensation = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a", dtype=bool) @@ -90,10 +93,7 @@ def compute(self, inputs): uten = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") vten = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._calc_momentum_tendency( condensation=condensation, kpen=kpen, @@ -106,7 +106,6 @@ def compute(self, inputs): vf=vf, uten=uten, vten=vten, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_pbl_fluxes.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_pbl_fluxes.py index 4d5b32cac..ac2329632 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_pbl_fluxes.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_pbl_fluxes.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_pbl_fluxes from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -62,20 +60,25 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) self._calc_pbl_fluxes = self.stencil_factory.from_dims_halo( func=calc_pbl_fluxes, compute_dims=[I_DIM, J_DIM, K_DIM], - externals={"ncnst": config.NCNST, "dt": config.dt, "dotransport": config.dotransport}, + externals={ + "ncnst": config.NCNST, + "dt": config.dt, + "dotransport": config.dotransport, + }, ) # Inputs @@ -136,9 +139,9 @@ def compute(self, inputs): uflx = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") vflx = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") xflx = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") - xflx_ndim = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM, "ntracers"], units="n/a") + xflx_ndim = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM, "ntracers"], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -149,10 +152,7 @@ def compute(self, inputs): vflx_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") cush_inout = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._calc_pbl_fluxes( condensation=condensation, qtsrc=qtsrc, @@ -182,7 +182,6 @@ def compute(self, inputs): sstr0=sstr0, trflx=trflx, xflx_ndim=xflx_ndim, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_ppen.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_ppen.py index ea4cb7f5f..832a8760b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_ppen.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_ppen.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_ppen from pyMoist.convection.UW.config import UWConfiguration @@ -45,13 +43,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -93,10 +92,7 @@ def compute(self, inputs): ppen = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") kpen = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a", dtype=Int) - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._calc_ppen( condensation=condensation, drage=drage, @@ -110,7 +106,6 @@ def compute(self, inputs): dp0=dp0, wtwb=wtwb, ppen=ppen, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_thermodynamic_tendencies.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_thermodynamic_tendencies.py index 59a824520..b6afe74b6 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_thermodynamic_tendencies.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_calc_thermodynamic_tendencies.py @@ -1,14 +1,13 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM +from ndsl.dsl.gt4py import int32 from ndsl.dsl.typing import Int from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_thermodynamic_tendencies from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -71,21 +70,18 @@ def __init__( "qvten": self.grid.compute_dict(), "qrten": self.grid.compute_dict(), "qsten": self.grid.compute_dict(), - "testvar3D_1": self.grid.compute_dict(), - "testvar3D_2": self.grid.compute_dict(), - "testvar3D_3": self.grid.compute_dict(), - "testvar3D_4": self.grid.compute_dict(), } def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -146,7 +142,7 @@ def compute(self, inputs): qsten = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") slten = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -214,15 +210,10 @@ def compute(self, inputs): qlten_det = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") qiten_det = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_1 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_2 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_3 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_4 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test iter_test = int32(0) - # # Call stencils + # Call stencils self._calc_thermodynamic_tendencies( condensation=condensation, kpen=kpen, @@ -295,10 +286,6 @@ def compute(self, inputs): fer_out=fer_out, fdr_out=fdr_out, iteration=iter_test, - testvar3D_1=testvar3D_1, - testvar3D_2=testvar3D_2, - testvar3D_3=testvar3D_3, - testvar3D_4=testvar3D_4, ) return { @@ -310,8 +297,4 @@ def compute(self, inputs): "qvten": qvten.view[:], "qsten": qsten.view[:], "qrten": qrten.view[:], - "testvar3D_1": testvar3D_1.view[:], - "testvar3D_2": testvar3D_2.view[:], - "testvar3D_3": testvar3D_3.view[:], - "testvar3D_4": testvar3D_4.view[:], } diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_cin_cinlcl.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_cin_cinlcl.py index 1416b160b..92c42c899 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_cin_cinlcl.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_cin_cinlcl.py @@ -1,14 +1,13 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM +from ndsl.dsl.gt4py import int32 from ndsl.dsl.typing import Int from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import compute_cin_cinlcl from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -67,13 +66,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -183,7 +183,7 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -192,7 +192,7 @@ def compute(self, inputs): # The iteration you want to test iter_test = int32(0) - # # Call stencils + # Call stencils self._compute_cin_cinlcl( condensation=condensation, stop_cin=stop_cin, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_del_CIN.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_del_CIN.py index e59880300..5874bdac5 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_del_CIN.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_del_CIN.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import compute_del_CIN from pyMoist.convection.UW.config import UWConfiguration @@ -39,13 +37,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -77,10 +76,7 @@ def compute(self, inputs): # Outputs del_CIN = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(1) - - # # Call stencils + # Call stencils self._compute_del_CIN( condensation=condensation, cin_IJ=cin, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_diagnostic_outputs.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_diagnostic_outputs.py index 27cfc5263..4c7ad9478 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_diagnostic_outputs.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_diagnostic_outputs.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import compute_diagnostic_outputs from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -46,13 +44,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -88,7 +87,7 @@ def compute(self, inputs): riwp = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") rlwp = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -114,10 +113,7 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._compute_diagnostic_outputs( condensation=condensation, prel=prel, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_uwshcu_invert_after.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_uwshcu_invert_after.py index b21d90ec4..ca7e66063 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_uwshcu_invert_after.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_compute_uwshcu_invert_after.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import compute_uwshcu_invert_after from pyMoist.convection.UW.config import UWConfiguration @@ -62,7 +60,6 @@ def __init__( "cufrc_inv": self.grid.compute_dict(), "cush": self.grid.compute_dict(), "dcm_inv": self.grid.compute_dict(), - "dotransport": self.grid.compute_dict(), "fdr_inv": self.grid.compute_dict(), "fer_inv": self.grid.compute_dict(), "qidet_inv": self.grid.compute_dict(), @@ -88,6 +85,7 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) @@ -104,7 +102,7 @@ def compute(self, inputs): self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -187,37 +185,36 @@ def compute(self, inputs): cufrc_inv = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cnvtr = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM, "ntracers"], units="n/a") cush = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - # # Call stencils + # Call stencils self._compute_uwshcu_invert_after( - # umf_outvar=umf_out, - # qtflx_outvar=qtflx_out, - # slflx_outvar=slflx_out, - # uflx_outvar=uflx_out, - # vflx_outvar=vflx_out, + dcm_out=dcm_out, + umf_out=umf_out, + qtflx_out=qtflx_out, + slflx_out=slflx_out, + uflx_out=uflx_out, + vflx_out=vflx_out, # dcm_outvar=dcm_out, - # qvten_outvar=qvten_out, - # qlten_outvar=qlten_out, - # qiten_outvar=qiten_out, - # sten_outvar=sten_out, - # uten_outvar=uten_out, - # vten_outvar=vten_out, - # qrten_outvar=qrten_out, - # qsten_outvar=qsten_out, - # cufrc_outvar=cufrc_out, - # qldet_outvar=qldet_out, - # qidet_outvar=qidet_out, - # qlsub_outvar=qlsub_out, - # qisub_outvar=qisub_out, - # fer_outvar=fer_out, - # fdr_outvar=fdr_out, + qvten_out=qvten_out, + qlten_out=qlten_out, + qiten_out=qiten_out, + sten_out=sten_out, + uten_out=uten_out, + vten_out=vten_out, + qrten_out=qrten_out, + qsten_out=qsten_out, + cufrc_out=cufrc_out, + qldet_out=qldet_out, + qidet_out=qidet_out, + qlsub_out=qlsub_out, + qisub_out=qisub_out, + fer_out=fer_out, + fdr_out=fdr_out, ndrop_out=ndrop_out, nice_out=nice_out, tr0=tr0, - # tr0_inoutvar=tr0_inout, - # cush_inoutvar=cush_inout, + tr0_inout=tr0_inout, + cush_inout=cush_inout, # Outputs umf_inv=umf_inv, dcm_inv=dcm_inv, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_env_properties.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_env_properties.py index 0b4d58af7..60ff5f682 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_env_properties.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_env_properties.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import define_env_properties from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -72,13 +70,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -158,7 +157,7 @@ def compute(self, inputs): uplus_3D = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") vplus_3D = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -169,13 +168,9 @@ def compute(self, inputs): vflx_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") cush_inout = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._define_env_properties( condensation=condensation, - iteration=iter_test, krel=krel, kinv=kinv, ssu0=ssu0, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_prel_cbmf.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_prel_cbmf.py index 2b2261ce5..9eb030009 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_prel_cbmf.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_prel_cbmf.py @@ -1,14 +1,13 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM +from ndsl.dsl.gt4py import int32 from ndsl.dsl.typing import Int from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_cumulus_base_mass_flux, define_prel_krel from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -56,13 +55,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -152,16 +152,14 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx - stop_cin = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a", dtype=bool) - # The iteration you want to test iter_test = int32(0) - # # Call stencils + # Call stencils self._define_prel_krel( condensation=condensation, iteration=iter_test, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_updraft_properties.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_updraft_properties.py index a9c09b3b1..b267175e2 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_updraft_properties.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_define_updraft_properties.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import define_updraft_properties from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -49,13 +47,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -102,12 +101,10 @@ def compute(self, inputs): ufrc = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") ufrclcl = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx - stop_cin = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a", dtype=bool) - umf_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") qtflx_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") slflx_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") @@ -137,13 +134,9 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._define_updraft_properties( condensation=condensation, - iteration=iter_test, winv=winv, cinlcl_IJ=cinlcl, cbmf=cbmf, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_klcl.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_klcl.py index 290f6fb33..547ef6737 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_klcl.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_klcl.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import find_cumulus_characteristics, find_klcl from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -65,13 +63,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -156,10 +155,8 @@ def compute(self, inputs): qpert_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") shfx = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") evap = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - # # Call stencils + # Call stencils self._find_cumulus_characteristics( condensation=condensation, pifc0=pifc0, @@ -187,11 +184,9 @@ def compute(self, inputs): vsrc=vsrc, tpert_out=tpert_out, qpert_out=qpert_out, - iteration=iter_test, ) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) - self.ese = saturation_vapor_pressure_table.ese + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.esx = saturation_vapor_pressure_table.esx umf_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") @@ -218,11 +213,9 @@ def compute(self, inputs): self._find_klcl( condensation=condensation, - iteration=iter_test, pifc0=pifc0, qtsrc=qtsrc, thlsrc=thlsrc, - ese=self.ese, esx=self.esx, thl0=thl0, ssthl0=ssthl0, @@ -257,6 +250,15 @@ def compute(self, inputs): fdr_out=fdr_out, ) + # Adjust klcl level to match Fortran starting to count at 1 and python starting at 0. + # However, only add +1 if klcl is ever written. Both, Fortran and python, initialize + # their fields to 0, which means they are both 0 if klcl is never written (e.g. in the + # cases of where condensation is True). + for i in range(0, 24): + for j in range(0, 24): + if not condensation.view[i, j]: + klcl.view[i, j, :] += 1 + return { "qtsrc": qtsrc.view[:], "thlsrc": thlsrc.view[:], @@ -264,7 +266,7 @@ def compute(self, inputs): "usrc": usrc.view[:], "vsrc": vsrc.view[:], "trsrc": trsrc.view[:], - "klcl": klcl.view[:], # klcl should fail by 1 + "klcl": klcl.view[:], "plcl": plcl.view[:], "qt0lcl": qt0lcl.view[:], "thl0lcl": thl0lcl.view[:], diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_pbl.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_pbl.py index c055df96c..dfeafdabb 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_pbl.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_find_pbl.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import find_pbl_averages, find_pbl_height from pyMoist.convection.UW.config import UWConfiguration @@ -54,13 +52,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -145,12 +144,8 @@ def compute(self, inputs): fer_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") fdr_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._find_pbl_height( - iteration=iter_test, kpbl_in=kpbl_in, condensation=condensation, kinv=kinv, @@ -196,7 +191,6 @@ def compute(self, inputs): vavg=vavg, thvlavg=thvlavg, qtavg=qtavg, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_penetrative_entrainment_fluxes.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_penetrative_entrainment_fluxes.py index 077eb6227..fb610a26f 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_penetrative_entrainment_fluxes.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_penetrative_entrainment_fluxes.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import penetrative_entrainment_fluxes from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -76,13 +74,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -175,7 +174,7 @@ def compute(self, inputs): vflx = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") safe_assign_array(vflx.view[:], inputs["vflx"]) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -204,10 +203,8 @@ def compute(self, inputs): uemf = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") qlten_sink = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") qiten_sink = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - # # Call stencils + # Call stencils self._penetrative_entrainment_fluxes( condensation=condensation, kbup=kbup, @@ -247,7 +244,6 @@ def compute(self, inputs): esx=self.esx, qlten_sink=qlten_sink, qiten_sink=qiten_sink, - iteration=iter_test, cush=cush, umf_out=umf_out, dcm_out=dcm_out, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prepare_inputs.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prepare_inputs.py index 025834776..149547dcb 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prepare_inputs.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prepare_inputs.py @@ -7,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import _reset_mask, compute_thermodynamic_variables, compute_thv0_thvl0, compute_uwshcu_invert_before from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -101,6 +100,7 @@ def make_ij_field(self, data, dtype=FloatField) -> Quantity: def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): self.config = UWConfiguration(**self.constants) @@ -129,7 +129,7 @@ def compute(self, inputs): self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": self.config.NCNST, } ) @@ -222,7 +222,7 @@ def compute(self, inputs): kpbl_in = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], dtype=Int, units="n/a") cnvtrmax = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - # # Call stencils + # Call stencils self._compute_uwshcu_invert_before( # Inputs pmid0_inv=pmid0_inv, @@ -342,7 +342,7 @@ def compute(self, inputs): cufrc_out=cufrc_out, ) - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prevent_negative_condensate.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prevent_negative_condensate.py index 2c4b922ac..8c7766600 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prevent_negative_condensate.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_prevent_negative_condensate.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import prevent_negative_condensate from pyMoist.convection.UW.config import UWConfiguration @@ -48,13 +46,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -102,10 +101,8 @@ def compute(self, inputs): # Outputs qmin = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - # # Call stencils + # Call stencils self._prevent_negative_condensate( condensation=condensation, qv0=qv0, @@ -118,7 +115,6 @@ def compute(self, inputs): dp0=dp0, qiten=qiten, qmin=qmin, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_condensate.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_condensate.py index af9ac4795..51183638c 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_condensate.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_condensate.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.dsl.typing import Int @@ -8,7 +7,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import recalc_condensate from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -65,22 +63,18 @@ def __init__( "ufrc": self.grid.compute_dict(), "umf": self.grid.compute_dict(), "xco": self.grid.compute_dict(), - "testvar3D_1": self.grid.compute_dict(), - "testvar3D_2": self.grid.compute_dict(), - "testvar3D_3": self.grid.compute_dict(), - "testvar3D_4": self.grid.compute_dict(), - "testvar3D_5": self.grid.compute_dict(), } def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -158,7 +152,7 @@ def compute(self, inputs): umf_temp = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cush = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -184,16 +178,7 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_1 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_2 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_3 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_4 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - testvar3D_5 = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._recalc_condensate( condensation=condensation, fer=fer, @@ -228,7 +213,6 @@ def compute(self, inputs): umf_temp=umf_temp, fdr=fdr, xco=xco, - iteration=iter_test, cush=cush, umf_out=umf_out, dcm_out=dcm_out, @@ -250,11 +234,6 @@ def compute(self, inputs): vflx_out=vflx_out, fer_out=fer_out, fdr_out=fdr_out, - testvar3D_1=testvar3D_1, - testvar3D_2=testvar3D_2, - testvar3D_3=testvar3D_3, - testvar3D_4=testvar3D_4, - testvar3D_5=testvar3D_5, ) return { @@ -269,9 +248,4 @@ def compute(self, inputs): "umf": umf.view[:], "xco": xco.view[:], "fer": fer.view[:], - "testvar3D_1": testvar3D_1.view[:], - "testvar3D_2": testvar3D_2.view[:], - "testvar3D_3": testvar3D_3.view[:], - "testvar3D_4": testvar3D_4.view[:], - "testvar3D_5": testvar3D_5.view[:], } diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_environmental_variables.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_environmental_variables.py index 14874061b..c46f7e967 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_environmental_variables.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_recalc_environmental_variables.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import recalc_environmental_variables from pyMoist.convection.UW.config import UWConfiguration from pyMoist.saturation_tables import get_saturation_vapor_pressure_table @@ -62,13 +60,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -134,7 +133,7 @@ def compute(self, inputs): thvl0bot = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") tr0_temp = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.ese = saturation_vapor_pressure_table.ese self.esx = saturation_vapor_pressure_table.esx @@ -160,10 +159,7 @@ def compute(self, inputs): qsten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._recalc_environmental_variables( condensation=condensation, qv0_s=qv0_s, @@ -197,7 +193,6 @@ def compute(self, inputs): s0=s0, t0=t0, tr0_temp=tr0_temp, - iteration=iter_test, cush=cush, umf_out=umf_out, dcm_out=dcm_out, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_inputs.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_inputs.py index 7aa2fee98..4b035d6da 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_inputs.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_inputs.py @@ -47,6 +47,7 @@ def compute(self, inputs): _setup_inputs = self.stencil_factory.from_dims_halo( func=setup_inputs, compute_dims=[I_DIM, J_DIM, K_DIM], + externals={"JASON": True}, ) # Inputs @@ -65,6 +66,9 @@ def compute(self, inputs): ZLE = QuantityFactory.zeros(self.quantity_factory, dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") safe_assign_array(ZLE.view[:, :, :], inputs["ZLE"]) + # AREA is only used in case of JASON=False (which we never have here) + AREA = QuantityFactory.zeros(self.quantity_factory, dims=[I_DIM, J_DIM], units="n/a") + # Outputs PKE = QuantityFactory.zeros(self.quantity_factory, dims=[I_DIM, J_DIM, K_INTERFACE_DIM], units="n/a") PL = QuantityFactory.zeros(self.quantity_factory, dims=[I_DIM, J_DIM, K_DIM], units="n/a") @@ -94,6 +98,7 @@ def compute(self, inputs): RKFRE=RKFRE, QLTOT=QLTOT, QITOT=QITOT, + AREA=AREA, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_outputs.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_outputs.py index 6c9a3a0e2..cae62d509 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_outputs.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_setup_outputs.py @@ -70,6 +70,7 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) @@ -80,6 +81,7 @@ def compute(self, inputs): externals={ "dt": config.dt, "SCLM_SHALLOW": config.SCLM_SHALLOW, + "JASON": config.JASON, }, ) @@ -157,6 +159,7 @@ def compute(self, inputs): MFD_SC=MFD_SC, DETR_SC=DETR_SC, UMF_SC=UMF_SC, + DCM_SC=DCM_SC, DP=DP, DQADT_SC=DQADT_SC, MASS=MASS, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_tracer_tendencies.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_tracer_tendencies.py index d71789993..d97862f17 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_tracer_tendencies.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_tracer_tendencies.py @@ -1,5 +1,4 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM from ndsl.stencils.testing.grid import Grid @@ -7,7 +6,6 @@ from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import calc_tracer_tendencies from pyMoist.convection.UW.config import UWConfiguration @@ -38,13 +36,14 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": config.NCNST, } ) @@ -81,10 +80,7 @@ def compute(self, inputs): trflx_u = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_INTERFACE_DIM, "ntracers"], units="n/a") trmin = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, "ntracers"], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._calc_tracer_tendencies( condensation=condensation, dp0=dp0, @@ -94,7 +90,6 @@ def compute(self, inputs): tr0=tr0, trflx=trflx, trten=trten, - iteration=iter_test, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables1.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables1.py index 0bac8f570..3bdad124d 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables1.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables1.py @@ -1,13 +1,12 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM -from ndsl.dsl.typing import Float, Int +from ndsl.dsl.typing import Int from ndsl.stencils.testing.grid import Grid +from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import update_output_variables1 from pyMoist.convection.UW.config import UWConfiguration @@ -18,18 +17,10 @@ def __init__( grid: Grid, namelist: Namelist, stencil_factory: StencilFactory, - # UW_config: UWConfiguration, ): super().__init__(grid, stencil_factory) self.stencil_factory = stencil_factory self.quantity_factory = grid.quantity_factory - # self.UW_config = UW_config - - self._update_output_vars1 = self.stencil_factory.from_dims_halo( - func=update_output_variables1, - compute_dims=[I_DIM, J_DIM, K_DIM], - externals={"ncnst": 23}, - ) # FloatField Inputs self.in_vars["data_vars"] = { @@ -51,39 +42,7 @@ def __init__( } # Float/Int Inputs - self.in_vars["parameters"] = [ - "dotransport", - "ncnst", - "k0", - "tr0", - "windsrcavg", - "qtsrchgt", - "qtsrc_fac", - "thlsrc_fac", - "frc_rasn", - "rbuoy", - "epsvarw", - "use_CINcin", - "mumin1", - "rmaxfrac", - "PGFc", - "niter_xc", - "criqc", - "rle", - "cridist_opt", - "mixscale", - "rkm", - "dt", - "detrhgt", - "rdrag", - "use_self_detrain", - "detrhgt", - "use_cumpenent", - "rpen", - "use_momenflx", - "rdrop", - "iter_cin", - ] + self.in_vars["parameters"] = [] # FloatField Outputs self.out_vars = { @@ -101,44 +60,23 @@ def __init__( "vten_out": self.grid.compute_dict(), } + def extra_data_load(self, data_loader: DataLoader): + self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True + def compute(self, inputs): - self.UW_config = UWConfiguration(Int(inputs["ncnst"]), Int(inputs["k0"]), Int(inputs["windsrcavg"])) + self.UW_config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": self.UW_config.NCNST, } ) - # Float/Int Inputs - dotransport = Int(inputs["dotransport"]) - k0 = Int(inputs["k0"]) - windsrcavg = Int(inputs["windsrcavg"]) - qtsrchgt = Float(inputs["qtsrchgt"]) - qtsrc_fac = Float(inputs["qtsrc_fac"]) - thlsrc_fac = Float(inputs["thlsrc_fac"]) - frc_rasn = Float(inputs["frc_rasn"]) - rbuoy = Float(inputs["rbuoy"]) - epsvarw = Float(inputs["epsvarw"]) - use_CINcin = Int(inputs["use_CINcin"]) - mumin1 = Float(inputs["mumin1"]) - rmaxfrac = Float(inputs["rmaxfrac"]) - PGFc = Float(inputs["PGFc"]) - dt = Float(inputs["dt"]) - niter_xc = Int(inputs["niter_xc"]) - criqc = Float(inputs["criqc"]) - rle = Float(inputs["rle"]) - cridist_opt = Int(inputs["cridist_opt"]) - mixscale = Float(inputs["mixscale"]) - rdrag = Float(inputs["rdrag"]) - rkm = Float(inputs["rkm"]) - use_self_detrain = Int(inputs["use_self_detrain"]) - detrhgt = Float(inputs["detrhgt"]) - use_cumpenent = Int(inputs["use_cumpenent"]) - rpen = Float(inputs["rpen"]) - use_momenflx = Int(inputs["use_momenflx"]) - rdrop = Float(inputs["rdrop"]) - iter_cin = Int(inputs["iter_cin"]) + self._update_output_vars1 = self.stencil_factory.from_dims_halo( + func=update_output_variables1, + compute_dims=[I_DIM, J_DIM, K_DIM], + ) # Inputs condensation = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a", dtype=bool) @@ -181,7 +119,7 @@ def compute(self, inputs): # Outputs cufrc_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - cush_inout = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") + cush_inout = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a") dcm_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") qiten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") qlten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") @@ -193,10 +131,7 @@ def compute(self, inputs): uten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") vten_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._update_output_vars1( condensation=condensation, umf_zint=umf, @@ -227,9 +162,15 @@ def compute(self, inputs): cush_inout=cush_inout, ) + # For some reason, `cush_inout` is a 3d field in the translate test + # data. We thus just copy the lowest level into all other levels. + cush_inout_3d = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") + for k in range(self.grid.npz): + cush_inout_3d[:, :, k] = cush_inout[:, :] + return { "cufrc_out": cufrc_out.view[:], - "cush_inout": cush_inout.view[:], + "cush_inout": cush_inout_3d.view[:], "dcm_out": dcm_out.view[:], "qiten_out": qiten_out.view[:], "qlten_out": qlten_out.view[:], diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables2.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables2.py index f3d9e18d6..94434689c 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables2.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/UW_translate_tests/translate_update_output_variables2.py @@ -1,13 +1,12 @@ from f90nml import Namelist -from gt4py.cartesian.gtscript import int32 from ndsl import StencilFactory from ndsl.constants import I_DIM, J_DIM, K_DIM, K_INTERFACE_DIM -from ndsl.dsl.typing import Float, Int +from ndsl.dsl.typing import Int from ndsl.stencils.testing.grid import Grid +from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py from ndsl.utils import safe_assign_array -import pyMoist.constants as constants from pyMoist.convection.UW.compute_uwshcu import update_output_variables2 from pyMoist.convection.UW.config import UWConfiguration @@ -18,18 +17,10 @@ def __init__( grid: Grid, namelist: Namelist, stencil_factory: StencilFactory, - # UW_config: UWConfiguration, ): super().__init__(grid, stencil_factory) self.stencil_factory = stencil_factory self.quantity_factory = grid.quantity_factory - # self.UW_config = UW_config - - self._update_output_vars2 = self.stencil_factory.from_dims_halo( - func=update_output_variables2, - compute_dims=[I_DIM, J_DIM, K_DIM], - externals={"ncnst": 23}, - ) # FloatField Inputs self.in_vars["data_vars"] = { @@ -49,41 +40,6 @@ def __init__( "kpen": {}, } - # Float/Int Inputs - self.in_vars["parameters"] = [ - "dotransport", - "ncnst", - "k0", - "tr0", - "windsrcavg", - "qtsrchgt", - "qtsrc_fac", - "thlsrc_fac", - "frc_rasn", - "rbuoy", - "epsvarw", - "use_CINcin", - "mumin1", - "rmaxfrac", - "PGFc", - "niter_xc", - "criqc", - "rle", - "cridist_opt", - "mixscale", - "rkm", - "dt", - "detrhgt", - "rdrag", - "use_self_detrain", - "detrhgt", - "use_cumpenent", - "rpen", - "use_momenflx", - "rdrop", - "iter_cin", - ] - # FloatField Outputs self.out_vars = { "fdr_out": self.grid.compute_dict(), @@ -101,44 +57,29 @@ def __init__( "nice_out": self.grid.compute_dict(), } + def extra_data_load(self, data_loader: DataLoader): + self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True + def compute(self, inputs): - self.UW_config = UWConfiguration(Int(inputs["ncnst"]), Int(inputs["k0"]), Int(inputs["windsrcavg"])) + self.UW_config = UWConfiguration(**self.constants) self.quantity_factory.add_data_dimensions( { - "ntracers": constants.NCNST, + "ntracers": self.UW_config.NCNST, } ) - # Float/Int Inputs - dotransport = Int(inputs["dotransport"]) - k0 = Int(inputs["k0"]) - windsrcavg = Int(inputs["windsrcavg"]) - qtsrchgt = Float(inputs["qtsrchgt"]) - qtsrc_fac = Float(inputs["qtsrc_fac"]) - thlsrc_fac = Float(inputs["thlsrc_fac"]) - frc_rasn = Float(inputs["frc_rasn"]) - rbuoy = Float(inputs["rbuoy"]) - epsvarw = Float(inputs["epsvarw"]) - use_CINcin = Int(inputs["use_CINcin"]) - mumin1 = Float(inputs["mumin1"]) - rmaxfrac = Float(inputs["rmaxfrac"]) - PGFc = Float(inputs["PGFc"]) - dt = Float(inputs["dt"]) - niter_xc = Int(inputs["niter_xc"]) - criqc = Float(inputs["criqc"]) - rle = Float(inputs["rle"]) - cridist_opt = Int(inputs["cridist_opt"]) - mixscale = Float(inputs["mixscale"]) - rdrag = Float(inputs["rdrag"]) - rkm = Float(inputs["rkm"]) - use_self_detrain = Int(inputs["use_self_detrain"]) - detrhgt = Float(inputs["detrhgt"]) - use_cumpenent = Int(inputs["use_cumpenent"]) - rpen = Float(inputs["rpen"]) - use_momenflx = Int(inputs["use_momenflx"]) - rdrop = Float(inputs["rdrop"]) - iter_cin = Int(inputs["iter_cin"]) + self._update_output_vars2 = self.stencil_factory.from_dims_halo( + func=update_output_variables2, + compute_dims=[I_DIM, J_DIM, K_DIM], + externals={ + "dotransport": self.UW_config.dotransport, + "dt": self.UW_config.dt, + "ncnst": self.UW_config.NCNST, + "rdrop": self.UW_config.rdrop, + }, + ) # Inputs condensation = self.quantity_factory.zeros(dims=[I_DIM, J_DIM], units="n/a", dtype=bool) @@ -192,13 +133,10 @@ def compute(self, inputs): ndrop_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") nice_out = self.quantity_factory.zeros(dims=[I_DIM, J_DIM, K_DIM], units="n/a") - # The iteration you want to test - iter_test = int32(0) - - # # Call stencils + # Call stencils self._update_output_vars2( condensation=condensation, - dotransport=dotransport, + kpen=kpen, qldet_out=qldet_out, qidet_out=qidet_out, qlsub_out=qlsub_out, @@ -211,11 +149,8 @@ def compute(self, inputs): vflx_out=vflx_out, fer=fer, fdr=fdr, - kpen=kpen, fer_out=fer_out, fdr_out=fdr_out, - dt=dt, - rdrop=rdrop, qlten_det=qlten_det, qiten_det=qiten_det, qlten_sink=qlten_sink, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/translate_compute_uwshcu.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/translate_compute_uwshcu.py index 500357e43..93f73e9e2 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/translate_compute_uwshcu.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/UW/translate_compute_uwshcu.py @@ -99,10 +99,10 @@ def __init__( def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("ComputeUwshcuInv-constants") + self.constants["JASON"] = True def compute(self, inputs): - JASON_UW: bool = True - config = UWConfiguration(JASON_UW, **self.constants) + config = UWConfiguration(**self.constants) state = UWState.zeros( self.quantity_factory, @@ -140,9 +140,7 @@ def compute(self, inputs): state.input_output.cnvtr.field[:] = inputs["cnvtr"] state.input_output.CLCN.field[:] = inputs["CLCN"] - compute_uwshcu( - state, - ) + compute_uwshcu(state) return { "CNV_Tracers": state.input_output.CNV_Tracers.field[:], diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/convection/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Evaporate.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Evaporate.py index 83ee7215e..0f1317e4b 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Evaporate.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Evaporate.py @@ -45,7 +45,7 @@ def compute(self, inputs): locals_ = GFDL1MLocals.make_as_state(self.quantity_factory) # Initialize saturation tables - self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory) locals_.p_mb.field[:] = inputs["local_p_mb"] state.t.field[:] = inputs["t"] @@ -67,9 +67,9 @@ def compute(self, inputs): code( p_mb=locals_.p_mb, t=state.t, - vapor=state.mixing_ratio.vapor, - convective_liquid=state.mixing_ratio.convective_liquid, - convective_ice=state.mixing_ratio.convective_ice, + mixing_ratio_vapor=state.mixing_ratio.vapor, + mixing_ratio_convective_liquid=state.mixing_ratio.convective_liquid, + mixing_ratio_convective_ice=state.mixing_ratio.convective_ice, convective_cloud_fraction=state.cloud_fraction.convective, liquid_concentration=state.concentration.liquid, ice_concentration=state.concentration.ice, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_HydrostaticPDF.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_HydrostaticPDF.py index c4da5fac3..2029643ce 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_HydrostaticPDF.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_HydrostaticPDF.py @@ -61,7 +61,7 @@ def compute(self, inputs): alpha = self.quantity_factory.zeros([I_DIM, J_DIM, K_DIM], "n/a") # Initialize saturation tables - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) # fill relevant parts of dataclasses state.convection_fraction.field[:] = inputs["convection_fraction"] @@ -96,11 +96,11 @@ def compute(self, inputs): convection_fraction=state.convection_fraction, surface_type=state.surface_type, p_mb=locals_.p_mb, - vapor=state.mixing_ratio.vapor, - large_scale_liquid=state.mixing_ratio.large_scale_liquid, - convective_liquid=state.mixing_ratio.convective_liquid, - large_scale_ice=state.mixing_ratio.large_scale_ice, - convective_ice=state.mixing_ratio.convective_ice, + mixing_ratio_vapor=state.mixing_ratio.vapor, + mixing_ratio_large_scale_liquid=state.mixing_ratio.large_scale_liquid, + mixing_ratio_convective_liquid=state.mixing_ratio.convective_liquid, + mixing_ratio_large_scale_ice=state.mixing_ratio.large_scale_ice, + mixing_ratio_convective_ice=state.mixing_ratio.convective_ice, t=state.t, large_scale_cloud_fraction=state.cloud_fraction.large_scale, convective_cloud_fraction=state.cloud_fraction.convective, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_MeltFreeze.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_MeltFreeze.py index 294985e2a..8994701c2 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_MeltFreeze.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_MeltFreeze.py @@ -40,7 +40,7 @@ def compute(self, inputs): state = GFDL1MState.zeros(self.quantity_factory) # Initialize saturation tables - self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory) state.t.field[:] = inputs["t"] state.mixing_ratio.convective_liquid.field[:] = inputs["mixing_ratio_convective_liquid"] @@ -56,19 +56,20 @@ def compute(self, inputs): compute_dims=[I_DIM, J_DIM, K_DIM], externals={"DT_MOIST": config.DT_MOIST}, ) + code( convection_fraction=state.convection_fraction, surface_type=state.surface_type, t=state.t, - liquid=state.mixing_ratio.convective_liquid, - ice=state.mixing_ratio.convective_ice, + mixing_ratio_liquid=state.mixing_ratio.convective_liquid, + mixing_ratio_ice=state.mixing_ratio.convective_ice, ) code( convection_fraction=state.convection_fraction, surface_type=state.surface_type, t=state.t, - liquid=state.mixing_ratio.large_scale_liquid, - ice=state.mixing_ratio.large_scale_ice, + mixing_ratio_liquid=state.mixing_ratio.large_scale_liquid, + mixing_ratio_ice=state.mixing_ratio.large_scale_ice, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_PhaseChange.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_PhaseChange.py index dd3039d3d..863cd717a 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_PhaseChange.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_PhaseChange.py @@ -60,7 +60,7 @@ def compute(self, inputs): locals_ = GFDL1MLocals.make_as_state(self.quantity_factory) # Initialize saturation tables - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) state.estimated_inversion_strength.field[:] = inputs["estimated_inversion_strength"] state.convection_fraction.field[:] = inputs["convection_fraction"] diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Sublimate.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Sublimate.py index 65b63fae4..38ce2941d 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Sublimate.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/PhaseChange/translate_GFDL_1M_Sublimate.py @@ -45,7 +45,7 @@ def compute(self, inputs): locals_ = GFDL1MLocals.make_as_state(self.quantity_factory) # Initialize saturation tables - self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory) locals_.p_mb.field[:] = inputs["local_p_mb"] state.t.field[:] = inputs["t"] @@ -70,9 +70,9 @@ def compute(self, inputs): code( p_mb=locals_.p_mb, t=state.t, - vapor=state.mixing_ratio.vapor, - convective_liquid=state.mixing_ratio.convective_liquid, - convective_ice=state.mixing_ratio.convective_ice, + mixing_ratio_vapor=state.mixing_ratio.vapor, + mixing_ratio_convective_liquid=state.mixing_ratio.convective_liquid, + mixing_ratio_convective_ice=state.mixing_ratio.convective_ice, convective_cloud_fraction=state.cloud_fraction.convective, liquid_concentration=state.concentration.liquid, ice_concentration=state.concentration.ice, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_DriverTables.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_DriverTables.py index 076d9bdac..5c67ea0df 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_DriverTables.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_DriverTables.py @@ -26,7 +26,7 @@ def __init__(self, grid, namelist: Namelist, stencil_factory: StencilFactory): } def compute(self, inputs): - self.sat_tables = get_tables(self.stencil_factory.backend) + self.sat_tables = get_tables(self.stencil_factory) return { "table1_driver": self.sat_tables.table1, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_FallSpeed.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_FallSpeed.py index 8c2a29bc9..927255dc9 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_FallSpeed.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_FallSpeed.py @@ -100,10 +100,10 @@ def compute(self, inputs): state.convection_fraction.field[:] = inputs["convection_fraction_fallspeed"][:, :, 0] code( - liquid=driver_locals.dry_air_mixing_ratio.liquid, - ice=driver_locals.dry_air_mixing_ratio.ice, - snow=driver_locals.dry_air_mixing_ratio.snow, - graupel=driver_locals.dry_air_mixing_ratio.graupel, + mixing_ratio_liquid=driver_locals.dry_air_mixing_ratio.liquid, + mixing_ratio_ice=driver_locals.dry_air_mixing_ratio.ice, + mixing_ratio_snow=driver_locals.dry_air_mixing_ratio.snow, + mixing_ratio_graupel=driver_locals.dry_air_mixing_ratio.graupel, t_unmodified=state.t, t=driver_locals.t, dz_unmodified=gfdl1m_locals.layer_thickness_negative, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_IceCloud.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_IceCloud.py index 05e5d7324..958e54075 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_IceCloud.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_IceCloud.py @@ -57,10 +57,7 @@ def compute(self, inputs): config_dependent_constants = GFDL1MDriverConfigDependentConstants.make(config) # initialize saturation tables - saturation_tables = get_tables( - backend=self.stencil_factory.backend, - dace_config=self.stencil_factory.config.dace_config, - ) + saturation_tables = get_tables(self.stencil_factory) # get the shape of the field nx, ny, nz = inputs["driver_local_t_icecloud"].shape @@ -105,12 +102,12 @@ def compute(self, inputs): t=driver_locals.t, p_dry=driver_locals.p_dry, dp=driver_locals.dp, - vapor=driver_locals.dry_air_mixing_ratio.vapor, - liquid=driver_locals.dry_air_mixing_ratio.liquid, - rain=driver_locals.dry_air_mixing_ratio.rain, - ice=driver_locals.dry_air_mixing_ratio.ice, - snow=driver_locals.dry_air_mixing_ratio.snow, - graupel=driver_locals.dry_air_mixing_ratio.graupel, + mixing_ratio_vapor=driver_locals.dry_air_mixing_ratio.vapor, + mixing_ratio_liquid=driver_locals.dry_air_mixing_ratio.liquid, + mixing_ratio_rain=driver_locals.dry_air_mixing_ratio.rain, + mixing_ratio_ice=driver_locals.dry_air_mixing_ratio.ice, + mixing_ratio_snow=driver_locals.dry_air_mixing_ratio.snow, + mixing_ratio_graupel=driver_locals.dry_air_mixing_ratio.graupel, cloud_fraction=driver_locals.cloud_fraction, density=driver_locals.density, density_factor=driver_locals.density_factor, diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_WarmRain.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_WarmRain.py index 19944da96..dfa66bab7 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_WarmRain.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/driver/translate_GFDL_1M_WarmRain.py @@ -66,10 +66,7 @@ def compute(self, inputs): config_dependent_constants = GFDL1MDriverConfigDependentConstants.make(config) # initialize saturation tables - saturation_tables = get_tables( - backend=self.stencil_factory.backend, - dace_config=self.stencil_factory.config.dace_config, - ) + saturation_tables = get_tables(self.stencil_factory) nx, ny, nz = inputs["driver_local_dp_warmrain"].shape diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M.py index e43f7dd66..56ba9002e 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M.py @@ -1,13 +1,22 @@ +import copy +import time + from f90nml import Namelist -from ndsl import StencilFactory +from ndsl import StencilFactory, ndsl_log from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py +from ndsl.utils import safe_assign_array from pyMoist import GFDL1M, GFDL1MConfig, GFDL1MState from pyMoist.saturation_tables.tables.main import SaturationVaporPressureTable +# ⚠️ Careful those are _hot caches_ bench - do are NOT +# expect the same timings online in the model. +MICRO_BENCH = False + + class TranslateGFDL_1M(TranslateFortranData2Py): def __init__( self, @@ -18,6 +27,12 @@ def __init__( super().__init__(grid, stencil_factory) self.quantity_factory = grid.quantity_factory + if MICRO_BENCH: + self._ts = 10 + stencil_factory.config.dace_config.set_timer(stencil_factory.comm) + else: + self._ts = 0 + # NOTE not all fields are associated in v11.5.2. fields which are not associated are not serialized, # and not output by the parameterization, and have therefore been manually disabled within this test self.in_vars["data_vars"] = { @@ -127,7 +142,7 @@ def __init__( self.out_vars = self.in_vars["data_vars"].copy() # Initialize saturation tables - self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory) def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("GFDL_1M-constants") @@ -140,109 +155,110 @@ def compute(self, inputs): state = GFDL1MState.zeros(self.quantity_factory) # fill state with input data - state.precipitation_at_surface.deep_convective_precipitation.field[:] = inputs["precipitation_at_surface_deep_convective_precipitation"] - state.precipitation_at_surface.anvil_precipitation.field[:] = inputs["precipitation_at_surface_anvil_precipitation"] - state.precipitation_at_surface.shallow_convective_precipitation.field[:] = inputs["precipitation_at_surface_shallow_convective_precipitation"] - state.precipitation_at_surface.deep_convective_snow.field[:] = inputs["precipitation_at_surface_deep_convective_snow"] - state.precipitation_at_surface.anvil_snow.field[:] = inputs["precipitation_at_surface_anvil_snow"] - state.precipitation_at_surface.shallow_convective_snow.field[:] = inputs["precipitation_at_surface_shallow_convective_snow"] - # state.lcl_height.field[:] = inputs["lcl_height"] - state.shallow_convection_rain.field[:] = inputs["shallow_convection_rain"] - state.shallow_convection_snow.field[:] = inputs["shallow_convection_snow"] - # state.large_scale_rainwater_source.field[:] = inputs["large_scale_rainwater_source"] - state.tendencies.dtdt_friction_pressure_weighted.field[:] = inputs["tendencies_dtdt_friction_pressure_weighted"] - state.mixing_ratio.vapor.field[:] = inputs["mixing_ratio_vapor"] - state.mixing_ratio.rain.field[:] = inputs["mixing_ratio_rain"] - state.mixing_ratio.snow.field[:] = inputs["mixing_ratio_snow"] - state.mixing_ratio.graupel.field[:] = inputs["mixing_ratio_graupel"] - state.mixing_ratio.large_scale_liquid.field[:] = inputs["mixing_ratio_large_scale_liquid"] - state.mixing_ratio.large_scale_ice.field[:] = inputs["mixing_ratio_large_scale_ice"] - state.mixing_ratio.convective_liquid.field[:] = inputs["mixing_ratio_convective_liquid"] - state.mixing_ratio.convective_ice.field[:] = inputs["mixing_ratio_convective_ice"] - state.cloud_fraction.large_scale.field[:] = inputs["cloud_fraction_large_scale"] - state.cloud_fraction.convective.field[:] = inputs["cloud_fraction_convective"] - state.concentration.liquid.field[:] = inputs["concentration_liquid"] - state.concentration.ice.field[:] = inputs["concentration_ice"] - state.area.field[:] = inputs["area"] - state.p_interface.field[:] = inputs["p_interface"] - state.z_interface.field[:] = inputs["z_interface"] - state.t.field[:] = inputs["t"] - state.u.field[:] = inputs["u"] - state.v.field[:] = inputs["v"] - state.land_fraction.field[:] = inputs["land_fraction"] - state.covariance_liquid_water_static_energy_and_total_water_specific_humidity.field[:] = inputs[ - "covariance_liquid_water_static_energy_and_total_water_specific_humidity" - ] - state.omega.field[:] = inputs["omega"] - state.pdf_first_plume_fractional_area.field[:] = inputs["pdf_first_plume_fractional_area"] - state.vertical_motion.velocity.field[:] = inputs["vertical_motion_velocity"] - state.vertical_motion.variance.field[:] = inputs["vertical_motion_variance"] - state.vertical_motion.third_moment.field[:] = inputs["vertical_motion_third_moment"] - state.liquid_water_static_energy.flux.field[:] = inputs["liquid_water_static_energy_flux"] - state.liquid_water_static_energy.variance.field[:] = inputs["liquid_water_static_energy_variance"] - state.liquid_water_static_energy.third_moment.field[:] = inputs["liquid_water_static_energy_third_moment"] - state.total_water.flux.field[:] = inputs["total_water_flux"] - state.total_water.variance.field[:] = inputs["total_water_variance"] - state.total_water.third_moment.field[:] = inputs["total_water_third_moment"] - state.lower_tropospheric_stability.field[:] = inputs["lower_tropospheric_stability"] - state.estimated_inversion_strength.field[:] = inputs["estimated_inversion_strength"] - state.tendencies.dcloud_fractiondt_macro.field[:] = inputs["tendencies_dcloud_fractiondt_macro"] - state.tendencies.dvapordt_macro.field[:] = inputs["tendencies_dvapordt_macro"] - state.tendencies.dicedt_macro.field[:] = inputs["tendencies_dicedt_macro"] - state.tendencies.dliquiddt_macro.field[:] = inputs["tendencies_dliquiddt_macro"] - state.tendencies.draindt_macro.field[:] = inputs["tendencies_draindt_macro"] - state.tendencies.dgraupeldt_macro.field[:] = inputs["tendencies_dgraupeldt_macro"] - state.tendencies.dsnowdt_macro.field[:] = inputs["tendencies_dsnowdt_macro"] - state.tendencies.dudt_macro.field[:] = inputs["tendencies_dudt_macro"] - state.tendencies.dvdt_macro.field[:] = inputs["tendencies_dvdt_macro"] - state.tendencies.dtdt_macro.field[:] = inputs["tendencies_dtdt_macro"] - state.convection_fraction.field[:] = inputs["convection_fraction"] - state.surface_type.field[:] = inputs["surface_type"] - state.cloud_liquid_evaporation.field[:] = inputs["cloud_liquid_evaporation"] - state.cloud_ice_sublimation.field[:] = inputs["cloud_ice_sublimation"] - state.icefall.field[:] = inputs["icefall"] - state.freezing_rainfall.field[:] = inputs["freezing_rainfall"] - state.relative_humidity_after_pdf.field[:] = inputs["relative_humidity_after_pdf"] - state.buoyancy_flux.field[:] = inputs["buoyancy_flux"] - state.liquid_water_flux.field[:] = inputs["liquid_water_flux"] - state.hydrostatic_pdf_iterations.field[:] = inputs["hydrostatic_pdf_iterations"] - state.radiation_field.cloud_fraction.field[:] = inputs["radiation_field_cloud_fraction"] - state.radiation_field.vapor.field[:] = inputs["radiation_field_vapor"] - state.radiation_field.liquid.field[:] = inputs["radiation_field_liquid"] - state.radiation_field.ice.field[:] = inputs["radiation_field_ice"] - state.radiation_field.rain.field[:] = inputs["radiation_field_rain"] - state.radiation_field.snow.field[:] = inputs["radiation_field_snow"] - state.radiation_field.graupel.field[:] = inputs["radiation_field_graupel"] - state.cloud_particle_effective_radius.liquid.field[:] = inputs["cloud_particle_effective_radius_liquid"] - state.cloud_particle_effective_radius.ice.field[:] = inputs["cloud_particle_effective_radius_ice"] - state.precipitation_at_surface.rain.field[:] = inputs["precipitation_at_surface_rain"] - state.precipitation_at_surface.snow.field[:] = inputs["precipitation_at_surface_snow"] - state.precipitation_at_surface.ice.field[:] = inputs["precipitation_at_surface_ice"] - state.precipitation_at_surface.graupel.field[:] = inputs["precipitation_at_surface_graupel"] - state.non_anvil_large_scale.precip.field[:] = inputs["non_anvil_large_scale_precip"] - state.non_anvil_large_scale.snow.field[:] = inputs["non_anvil_large_scale_snow"] - state.non_anvil_large_scale.evaporation.field[:] = inputs["non_anvil_large_scale_evaporation"] - state.non_anvil_large_scale.sublimation.field[:] = inputs["non_anvil_large_scale_sublimation"] - state.non_anvil_large_scale.liquid_precip_flux.field[:] = inputs["non_anvil_large_scale_liquid_precip_flux"] - state.non_anvil_large_scale.ice_precip_flux.field[:] = inputs["non_anvil_large_scale_ice_precip_flux"] - state.anvil.liquid_precip_flux.field[:] = inputs["anvil_liquid_precip_flux"] - state.anvil.ice_precip_flux.field[:] = inputs["anvil_ice_precip_flux"] - state.critical_relative_humidity_for_pdf.field[:] = inputs["critical_relative_humidity_for_pdf"] - state.tendencies.dcloud_fractiondt_micro.field[:] = inputs["tendencies_dcloud_fractiondt_micro"] - state.tendencies.dvapordt_micro.field[:] = inputs["tendencies_dvapordt_micro"] - state.tendencies.dicedt_micro.field[:] = inputs["tendencies_dicedt_micro"] - state.tendencies.dliquiddt_micro.field[:] = inputs["tendencies_dliquiddt_micro"] - state.tendencies.draindt_micro.field[:] = inputs["tendencies_draindt_micro"] - state.tendencies.dgraupeldt_micro.field[:] = inputs["tendencies_dgraupeldt_micro"] - state.tendencies.dsnowdt_micro.field[:] = inputs["tendencies_dsnowdt_micro"] - state.tendencies.dudt_micro.field[:] = inputs["tendencies_dudt_micro"] - state.tendencies.dvdt_micro.field[:] = inputs["tendencies_dvdt_micro"] - state.tendencies.dtdt_micro.field[:] = inputs["tendencies_dtdt_micro"] - # state.radar.simulated_reflectivity.field[:] = inputs["radar_simulated_reflectivity"] - # state.radar.maximum_composite_reflectivity.field[:] = inputs["radar_maximum_composite_reflectivity"] - # state.radar.base_1km_agl_reflectivity.field[:] = inputs["radar_base_1km_agl_reflectivity"] - # state.radar.echo_top_reflectivity.field[:] = inputs["radar_echo_top_reflectivity"] - # state.radar.minus_10c_reflectivity.field[:] = inputs["radar_minus_10c_reflectivity"] + safe_assign_array(state.precipitation_at_surface.deep_convective_precipitation.field[:], inputs["precipitation_at_surface_deep_convective_precipitation"]) + safe_assign_array(state.precipitation_at_surface.anvil_precipitation.field[:], inputs["precipitation_at_surface_anvil_precipitation"]) + safe_assign_array(state.precipitation_at_surface.shallow_convective_precipitation.field[:], inputs["precipitation_at_surface_shallow_convective_precipitation"]) + safe_assign_array(state.precipitation_at_surface.deep_convective_snow.field[:], inputs["precipitation_at_surface_deep_convective_snow"]) + safe_assign_array(state.precipitation_at_surface.anvil_snow.field[:], inputs["precipitation_at_surface_anvil_snow"]) + safe_assign_array(state.precipitation_at_surface.shallow_convective_snow.field[:], inputs["precipitation_at_surface_shallow_convective_snow"]) + # safe_assign_array(state.lcl_height.field[:] , inputs["lcl_height"]) + safe_assign_array(state.shallow_convection_rain.field[:], inputs["shallow_convection_rain"]) + safe_assign_array(state.shallow_convection_snow.field[:], inputs["shallow_convection_snow"]) + # safe_assign_array(state.large_scale_rainwater_source.field[:] , inputs["large_scale_rainwater_source"]) + safe_assign_array(state.tendencies.dtdt_friction_pressure_weighted.field[:], inputs["tendencies_dtdt_friction_pressure_weighted"]) + safe_assign_array(state.mixing_ratio.vapor.field[:], inputs["mixing_ratio_vapor"]) + safe_assign_array(state.mixing_ratio.rain.field[:], inputs["mixing_ratio_rain"]) + safe_assign_array(state.mixing_ratio.snow.field[:], inputs["mixing_ratio_snow"]) + safe_assign_array(state.mixing_ratio.graupel.field[:], inputs["mixing_ratio_graupel"]) + safe_assign_array(state.mixing_ratio.large_scale_liquid.field[:], inputs["mixing_ratio_large_scale_liquid"]) + safe_assign_array(state.mixing_ratio.large_scale_ice.field[:], inputs["mixing_ratio_large_scale_ice"]) + safe_assign_array(state.mixing_ratio.convective_liquid.field[:], inputs["mixing_ratio_convective_liquid"]) + safe_assign_array(state.mixing_ratio.convective_ice.field[:], inputs["mixing_ratio_convective_ice"]) + safe_assign_array(state.cloud_fraction.large_scale.field[:], inputs["cloud_fraction_large_scale"]) + safe_assign_array(state.cloud_fraction.convective.field[:], inputs["cloud_fraction_convective"]) + safe_assign_array(state.concentration.liquid.field[:], inputs["concentration_liquid"]) + safe_assign_array(state.concentration.ice.field[:], inputs["concentration_ice"]) + safe_assign_array(state.area.field[:], inputs["area"]) + safe_assign_array(state.p_interface.field[:], inputs["p_interface"]) + safe_assign_array(state.z_interface.field[:], inputs["z_interface"]) + safe_assign_array(state.t.field[:], inputs["t"]) + safe_assign_array(state.u.field[:], inputs["u"]) + safe_assign_array(state.v.field[:], inputs["v"]) + safe_assign_array(state.land_fraction.field[:], inputs["land_fraction"]) + safe_assign_array( + state.covariance_liquid_water_static_energy_and_total_water_specific_humidity.field[:], + inputs["covariance_liquid_water_static_energy_and_total_water_specific_humidity"], + ) + safe_assign_array(state.omega.field[:], inputs["omega"]) + safe_assign_array(state.pdf_first_plume_fractional_area.field[:], inputs["pdf_first_plume_fractional_area"]) + safe_assign_array(state.vertical_motion.velocity.field[:], inputs["vertical_motion_velocity"]) + safe_assign_array(state.vertical_motion.variance.field[:], inputs["vertical_motion_variance"]) + safe_assign_array(state.vertical_motion.third_moment.field[:], inputs["vertical_motion_third_moment"]) + safe_assign_array(state.liquid_water_static_energy.flux.field[:], inputs["liquid_water_static_energy_flux"]) + safe_assign_array(state.liquid_water_static_energy.variance.field[:], inputs["liquid_water_static_energy_variance"]) + safe_assign_array(state.liquid_water_static_energy.third_moment.field[:], inputs["liquid_water_static_energy_third_moment"]) + safe_assign_array(state.total_water.flux.field[:], inputs["total_water_flux"]) + safe_assign_array(state.total_water.variance.field[:], inputs["total_water_variance"]) + safe_assign_array(state.total_water.third_moment.field[:], inputs["total_water_third_moment"]) + safe_assign_array(state.lower_tropospheric_stability.field[:], inputs["lower_tropospheric_stability"]) + safe_assign_array(state.estimated_inversion_strength.field[:], inputs["estimated_inversion_strength"]) + safe_assign_array(state.tendencies.dcloud_fractiondt_macro.field[:], inputs["tendencies_dcloud_fractiondt_macro"]) + safe_assign_array(state.tendencies.dvapordt_macro.field[:], inputs["tendencies_dvapordt_macro"]) + safe_assign_array(state.tendencies.dicedt_macro.field[:], inputs["tendencies_dicedt_macro"]) + safe_assign_array(state.tendencies.dliquiddt_macro.field[:], inputs["tendencies_dliquiddt_macro"]) + safe_assign_array(state.tendencies.draindt_macro.field[:], inputs["tendencies_draindt_macro"]) + safe_assign_array(state.tendencies.dgraupeldt_macro.field[:], inputs["tendencies_dgraupeldt_macro"]) + safe_assign_array(state.tendencies.dsnowdt_macro.field[:], inputs["tendencies_dsnowdt_macro"]) + safe_assign_array(state.tendencies.dudt_macro.field[:], inputs["tendencies_dudt_macro"]) + safe_assign_array(state.tendencies.dvdt_macro.field[:], inputs["tendencies_dvdt_macro"]) + safe_assign_array(state.tendencies.dtdt_macro.field[:], inputs["tendencies_dtdt_macro"]) + safe_assign_array(state.convection_fraction.field[:], inputs["convection_fraction"]) + safe_assign_array(state.surface_type.field[:], inputs["surface_type"]) + safe_assign_array(state.cloud_liquid_evaporation.field[:], inputs["cloud_liquid_evaporation"]) + safe_assign_array(state.cloud_ice_sublimation.field[:], inputs["cloud_ice_sublimation"]) + safe_assign_array(state.icefall.field[:], inputs["icefall"]) + safe_assign_array(state.freezing_rainfall.field[:], inputs["freezing_rainfall"]) + safe_assign_array(state.relative_humidity_after_pdf.field[:], inputs["relative_humidity_after_pdf"]) + safe_assign_array(state.buoyancy_flux.field[:], inputs["buoyancy_flux"]) + safe_assign_array(state.liquid_water_flux.field[:], inputs["liquid_water_flux"]) + safe_assign_array(state.hydrostatic_pdf_iterations.field[:], inputs["hydrostatic_pdf_iterations"]) + safe_assign_array(state.radiation_field.cloud_fraction.field[:], inputs["radiation_field_cloud_fraction"]) + safe_assign_array(state.radiation_field.vapor.field[:], inputs["radiation_field_vapor"]) + safe_assign_array(state.radiation_field.liquid.field[:], inputs["radiation_field_liquid"]) + safe_assign_array(state.radiation_field.ice.field[:], inputs["radiation_field_ice"]) + safe_assign_array(state.radiation_field.rain.field[:], inputs["radiation_field_rain"]) + safe_assign_array(state.radiation_field.snow.field[:], inputs["radiation_field_snow"]) + safe_assign_array(state.radiation_field.graupel.field[:], inputs["radiation_field_graupel"]) + safe_assign_array(state.cloud_particle_effective_radius.liquid.field[:], inputs["cloud_particle_effective_radius_liquid"]) + safe_assign_array(state.cloud_particle_effective_radius.ice.field[:], inputs["cloud_particle_effective_radius_ice"]) + safe_assign_array(state.precipitation_at_surface.rain.field[:], inputs["precipitation_at_surface_rain"]) + safe_assign_array(state.precipitation_at_surface.snow.field[:], inputs["precipitation_at_surface_snow"]) + safe_assign_array(state.precipitation_at_surface.ice.field[:], inputs["precipitation_at_surface_ice"]) + safe_assign_array(state.precipitation_at_surface.graupel.field[:], inputs["precipitation_at_surface_graupel"]) + safe_assign_array(state.non_anvil_large_scale.precip.field[:], inputs["non_anvil_large_scale_precip"]) + safe_assign_array(state.non_anvil_large_scale.snow.field[:], inputs["non_anvil_large_scale_snow"]) + safe_assign_array(state.non_anvil_large_scale.evaporation.field[:], inputs["non_anvil_large_scale_evaporation"]) + safe_assign_array(state.non_anvil_large_scale.sublimation.field[:], inputs["non_anvil_large_scale_sublimation"]) + safe_assign_array(state.non_anvil_large_scale.liquid_precip_flux.field[:], inputs["non_anvil_large_scale_liquid_precip_flux"]) + safe_assign_array(state.non_anvil_large_scale.ice_precip_flux.field[:], inputs["non_anvil_large_scale_ice_precip_flux"]) + safe_assign_array(state.anvil.liquid_precip_flux.field[:], inputs["anvil_liquid_precip_flux"]) + safe_assign_array(state.anvil.ice_precip_flux.field[:], inputs["anvil_ice_precip_flux"]) + safe_assign_array(state.critical_relative_humidity_for_pdf.field[:], inputs["critical_relative_humidity_for_pdf"]) + safe_assign_array(state.tendencies.dcloud_fractiondt_micro.field[:], inputs["tendencies_dcloud_fractiondt_micro"]) + safe_assign_array(state.tendencies.dvapordt_micro.field[:], inputs["tendencies_dvapordt_micro"]) + safe_assign_array(state.tendencies.dicedt_micro.field[:], inputs["tendencies_dicedt_micro"]) + safe_assign_array(state.tendencies.dliquiddt_micro.field[:], inputs["tendencies_dliquiddt_micro"]) + safe_assign_array(state.tendencies.draindt_micro.field[:], inputs["tendencies_draindt_micro"]) + safe_assign_array(state.tendencies.dgraupeldt_micro.field[:], inputs["tendencies_dgraupeldt_micro"]) + safe_assign_array(state.tendencies.dsnowdt_micro.field[:], inputs["tendencies_dsnowdt_micro"]) + safe_assign_array(state.tendencies.dudt_micro.field[:], inputs["tendencies_dudt_micro"]) + safe_assign_array(state.tendencies.dvdt_micro.field[:], inputs["tendencies_dvdt_micro"]) + safe_assign_array(state.tendencies.dtdt_micro.field[:], inputs["tendencies_dtdt_micro"]) + # safe_assign_array(state.radar.simulated_reflectivity.field[:] , inputs["radar_simulated_reflectivity"]) + # safe_assign_array(state.radar.maximum_composite_reflectivity.field[:] , inputs["radar_maximum_composite_reflectivity"]) + # safe_assign_array(state.radar.base_1km_agl_reflectivity.field[:] , inputs["radar_base_1km_agl_reflectivity"]) + # safe_assign_array(state.radar.echo_top_reflectivity.field[:] , inputs["radar_echo_top_reflectivity"]) + # safe_assign_array(state.radar.minus_10c_reflectivity.field[:] , inputs["radar_minus_10c_reflectivity"]) # initialize test class code = GFDL1M( @@ -254,7 +270,7 @@ def compute(self, inputs): # execute test code code(state=state) - return { + outputs = { "precipitation_at_surface_deep_convective_precipitation": state.precipitation_at_surface.deep_convective_precipitation.field[:], # noqa "precipitation_at_surface_anvil_precipitation": state.precipitation_at_surface.anvil_precipitation.field[:], # noqa "precipitation_at_surface_shallow_convective_precipitation": state.precipitation_at_surface.shallow_convective_precipitation.field[:], # noqa @@ -359,3 +375,15 @@ def compute(self, inputs): # inputs["radar_echo_top_reflectivity"]: state.radar.echo_top_reflectivity.field[:], # inputs["radar_minus_10c_reflectivity"]: state.radar.minus_10c_reflectivity.field[:], } + + validation_outputs = copy.deepcopy(outputs) + + if self._ts > 0: + s = time.perf_counter() + for _ in range(self._ts): + code(state=state) + e = time.perf_counter() + ndsl_log.info(f"GFDL1M Driver micro bench: {(e - s) / self._ts:.4f}s") + self.stencil_factory.config.dace_config.performance_collector.write_out_rank_0(self.stencil_factory.backend, float(config.DT_MOIST), "done") + + return validation_outputs diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Finalize.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Finalize.py index f5b68f5be..d3a7c0fb9 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Finalize.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Finalize.py @@ -1,6 +1,5 @@ from f90nml import Namelist from ndsl import StencilFactory -from ndsl.constants import I_DIM, J_DIM, K_DIM from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py @@ -8,7 +7,6 @@ from pyMoist.microphysics.GFDL_1M.config import GFDL1MConfig from pyMoist.microphysics.GFDL_1M.finalize import GFDL1MFinalize from pyMoist.microphysics.GFDL_1M.locals import GFDL1MLocals -from pyMoist.microphysics.GFDL_1M.shared_stencils import update_tendencies from pyMoist.microphysics.GFDL_1M.state import GFDL1MState from pyMoist.saturation_tables.tables.main import SaturationVaporPressureTable @@ -90,7 +88,7 @@ def compute(self, inputs): locals_ = GFDL1MLocals.make_as_state(self.quantity_factory) # Initialize saturation tables - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) state.t.field[:] = inputs["t"] state.u.field[:] = inputs["u"] @@ -146,19 +144,11 @@ def compute(self, inputs): state.tendencies.dvdt_micro.field[:] = inputs["dvdt_micro"] state.tendencies.dtdt_micro.field[:] = inputs["dtdt_micro"] - # construct test stencil - _update_tendencies = self.stencil_factory.from_dims_halo( - func=update_tendencies, - compute_dims=[I_DIM, J_DIM, K_DIM], - externals={"DT_MOIST": config.DT_MOIST}, - ) - code = GFDL1MFinalize( stencil_factory=self.stencil_factory, quantity_factory=self.quantity_factory, config=config, saturation_tables=saturation_tables, - update_tendencies=_update_tendencies, ) code( t=state.t, @@ -217,6 +207,14 @@ def compute(self, inputs): local_mass=locals_.mass, local_u_unmodified=locals_.u_unmodified, local_v_unmodified=locals_.v_unmodified, + simulated_reflectivity=None, + maximum_composite_reflectivity=None, + base_1km_agl_reflectivity=None, + echo_top_reflectivity=None, + minus_10c_reflectivity=None, + mass_fraction_suspended_rain=None, + mass_fraction_suspended_snow=None, + mass_fraction_suspended_graupel=None, ) return { diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_RadiationCoupling.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_RadiationCoupling.py index 53a7e1580..e906253dc 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_RadiationCoupling.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_RadiationCoupling.py @@ -60,7 +60,7 @@ def compute(self, inputs): locals_ = GFDL1MLocals.make_as_state(self.quantity_factory) # Initialize saturation tables - saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + saturation_tables = SaturationVaporPressureTable(self.stencil_factory) safe_assign_array(state.mixing_ratio.vapor.field[:], inputs["mixing_ratio_vapor"]) safe_assign_array(state.t.field[:], inputs["t"]) diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Setup.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Setup.py index 40a3b077b..0b0244162 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Setup.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/GFDL_1M/translate_GFDL_1M_Setup.py @@ -5,6 +5,7 @@ from ndsl.stencils.testing.grid import Grid from ndsl.stencils.testing.savepoint import DataLoader from ndsl.stencils.testing.translate import TranslateFortranData2Py +from ndsl.utils import safe_assign_array from pyMoist.microphysics.GFDL_1M.config import GFDL1MConfig from pyMoist.microphysics.GFDL_1M.locals import GFDL1MLocals @@ -73,7 +74,7 @@ def __init__( } # Initialize saturation tables - self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory.backend) + self.saturation_tables = SaturationVaporPressureTable(self.stencil_factory) def extra_data_load(self, data_loader: DataLoader): self.constants = data_loader.load("GFDL_1M-constants") @@ -87,21 +88,21 @@ def compute(self, inputs): locals_ = GFDL1MLocals.make_as_state(self.quantity_factory) # fill relevant parts of dataclasses - state.p_interface.field[:] = inputs["p_interface"] - state.z_interface.field[:] = inputs["z_interface"] - state.t.field[:] = inputs["t"] - state.u.field[:] = inputs["u"] - state.v.field[:] = inputs["v"] - state.mixing_ratio.vapor.field[:] = inputs["mixing_ratio_vapor"] - state.mixing_ratio.rain.field[:] = inputs["mixing_ratio_rain"] - state.mixing_ratio.snow.field[:] = inputs["mixing_ratio_snow"] - state.mixing_ratio.graupel.field[:] = inputs["mixing_ratio_graupel"] - state.mixing_ratio.large_scale_liquid.field[:] = inputs["mixing_ratio_large_scale_liquid"] - state.mixing_ratio.convective_liquid.field[:] = inputs["mixing_ratio_convective_liquid"] - state.cloud_fraction.convective.field[:] = inputs["cloud_fraction_convective"] - state.cloud_fraction.large_scale.field[:] = inputs["cloud_fraction_large_scale"] - state.mixing_ratio.large_scale_ice.field[:] = inputs["mixing_ratio_large_scale_ice"] - state.mixing_ratio.convective_ice.field[:] = inputs["mixing_ratio_convective_ice"] + safe_assign_array(state.p_interface.field[:], inputs["p_interface"]) + safe_assign_array(state.z_interface.field[:], inputs["z_interface"]) + safe_assign_array(state.t.field[:], inputs["t"]) + safe_assign_array(state.u.field[:], inputs["u"]) + safe_assign_array(state.v.field[:], inputs["v"]) + safe_assign_array(state.mixing_ratio.vapor.field[:], inputs["mixing_ratio_vapor"]) + safe_assign_array(state.mixing_ratio.rain.field[:], inputs["mixing_ratio_rain"]) + safe_assign_array(state.mixing_ratio.snow.field[:], inputs["mixing_ratio_snow"]) + safe_assign_array(state.mixing_ratio.graupel.field[:], inputs["mixing_ratio_graupel"]) + safe_assign_array(state.mixing_ratio.large_scale_liquid.field[:], inputs["mixing_ratio_large_scale_liquid"]) + safe_assign_array(state.mixing_ratio.convective_liquid.field[:], inputs["mixing_ratio_convective_liquid"]) + safe_assign_array(state.cloud_fraction.convective.field[:], inputs["cloud_fraction_convective"]) + safe_assign_array(state.cloud_fraction.large_scale.field[:], inputs["cloud_fraction_large_scale"]) + safe_assign_array(state.mixing_ratio.large_scale_ice.field[:], inputs["mixing_ratio_large_scale_ice"]) + safe_assign_array(state.mixing_ratio.convective_ice.field[:], inputs["mixing_ratio_convective_ice"]) # initialize test class code = GFDL1MSetup( diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/__init__.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/microphysics/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/translate_saturation_specific_humidity_functions.py b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/translate_saturation_specific_humidity_functions.py index 1761e163b..582e3f0f2 100644 --- a/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/translate_saturation_specific_humidity_functions.py +++ b/GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSmoist_GridComp/pyMoist/tests/translate_tests/translate_saturation_specific_humidity_functions.py @@ -41,9 +41,9 @@ def test_saturation_specific_humidity_functions( lqu: Float, ): with computation(FORWARD), interval(...): - sat_over_ice, dqsat_over_ice = saturation_specific_humidity_frozen_surface(ese=ese, frz=frz, t=t, p=p * 100) - sat_over_liquid, dqsat_over_liquid = saturation_specific_humidity_liquid_surface(esw=esw, lqu=lqu, t=t, p=p * 100) - sat, dqsat = saturation_specific_humidity(t=t, p=p * 100, ese=ese, esx=esx) + sat_over_ice, dqsat_over_ice = saturation_specific_humidity_frozen_surface(ese=ese, frz=frz, t=t, p=p * 100.0) + sat_over_liquid, dqsat_over_liquid = saturation_specific_humidity_liquid_surface(esw=esw, lqu=lqu, t=t, p=p * 100.0) + sat, dqsat = saturation_specific_humidity(t=t, p=p * 100.0, esx=esx) def test_saturation_specific_humidity_functions_2d( @@ -62,9 +62,9 @@ def test_saturation_specific_humidity_functions_2d( lqu: Float, ): with computation(FORWARD), interval(0, 1): - sat_over_ice, dqsat_over_ice = saturation_specific_humidity_frozen_surface(ese=ese, frz=frz, t=t, p=p * 100) - sat_over_liquid, dqsat_over_liquid = saturation_specific_humidity_liquid_surface(esw=esw, lqu=lqu, t=t, p=p * 100) - sat, dqsat = saturation_specific_humidity(t=t, p=p * 100, ese=ese, esx=esx) + sat_over_ice, dqsat_over_ice = saturation_specific_humidity_frozen_surface(ese=ese, frz=frz, t=t, p=p * 100.0) + sat_over_liquid, dqsat_over_liquid = saturation_specific_humidity_liquid_surface(esw=esw, lqu=lqu, t=t, p=p * 100.0) + sat, dqsat = saturation_specific_humidity(t=t, p=p * 100.0, esx=esx) class Translatesaturation_specific_humidity_functions(TranslateFortranData2Py): @@ -146,7 +146,7 @@ def compute(self, inputs): meshgrid_sat = meshgrid_quantity_factory.zeros([I_DIM, J_DIM], "n/a") meshgrid_dqsat = meshgrid_quantity_factory.zeros([I_DIM, J_DIM], "n/a") - saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory.backend) + saturation_vapor_pressure_table = get_saturation_vapor_pressure_table(self.stencil_factory) self.data_saturation_specific_humidity_functions( t=t,