diff --git a/schemes/musica/micm/musica_ccpp_micm.F90 b/schemes/musica/micm/musica_ccpp_micm.F90 index b34ab96..9d10f00 100644 --- a/schemes/musica/micm/musica_ccpp_micm.F90 +++ b/schemes/musica/micm/musica_ccpp_micm.F90 @@ -88,19 +88,19 @@ end subroutine micm_init !> Solve chemistry at the current time step subroutine micm_run(time_step, temperature, pressure, dry_air_density, & - user_defined_rate_parameters, constituents, errmsg, errcode) + user_defined_rate_parameters, constituents, errmsg, errcode) use musica_micm, only: solver_stats_t use musica_util, only: string_t, error_t use iso_c_binding, only: c_double - real(kind_phys), intent(in) :: time_step ! s - real(c_double), target, intent(in) :: temperature(:) ! K - real(c_double), target, intent(in) :: pressure(:) ! Pa - real(c_double), target, intent(in) :: dry_air_density(:) ! kg m-3 - real(c_double), target, intent(in) :: user_defined_rate_parameters(:) ! various units - real(c_double), target, intent(inout) :: constituents(:) ! mol m-3 - character(len=512), intent(out) :: errmsg - integer, intent(out) :: errcode + real(kind_phys), intent(in) :: time_step ! s + real(c_double), intent(in) :: temperature(:) ! K + real(c_double), intent(in) :: pressure(:) ! Pa + real(c_double), intent(in) :: dry_air_density(:) ! kg m-3 + real(c_double), intent(in) :: user_defined_rate_parameters(:) ! various units + real(c_double), intent(inout) :: constituents(:) ! mol m-3 + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errcode ! local variables type(string_t) :: solver_state @@ -132,6 +132,8 @@ subroutine micm_final(errmsg, errcode) errmsg = '' errcode = 0 + deallocate( micm ) + end subroutine micm_final end module musica_ccpp_micm diff --git a/schemes/musica/micm/musica_ccpp_micm_util.F90 b/schemes/musica/micm/musica_ccpp_micm_util.F90 index 1c912f3..47b92c8 100644 --- a/schemes/musica/micm/musica_ccpp_micm_util.F90 +++ b/schemes/musica/micm/musica_ccpp_micm_util.F90 @@ -8,19 +8,20 @@ module musica_ccpp_micm_util contains !> Reshape array (2D/3D -> 1D) and convert type (kind_phys -> c_double) - subroutine reshape_into_micm_arr(temperature, pressure, dry_air_density, constituents, & - micm_temperature, micm_pressure, micm_dry_air_density, micm_constituents) + subroutine reshape_into_micm_arr(temperature, pressure, dry_air_density, constituents, & + micm_temperature, micm_pressure, micm_dry_air_density, & + micm_constituents) use iso_c_binding, only: c_double use ccpp_kinds, only: kind_phys - real(kind_phys), target, intent(in) :: temperature(:,:) ! K - real(kind_phys), target, intent(in) :: pressure(:,:) ! Pa - real(kind_phys), target, intent(in) :: dry_air_density(:,:) ! kg m-3 - real(kind_phys), target, intent(in) :: constituents(:,:,:) ! kg kg-1 - real(c_double), target, intent(out) :: micm_temperature(:) ! K - real(c_double), target, intent(out) :: micm_pressure(:) ! Pa - real(c_double), target, intent(out) :: micm_dry_air_density(:) ! kg m-3 - real(c_double), target, intent(out) :: micm_constituents(:) ! kg kg-1 + real(kind_phys), intent(in) :: temperature(:,:) ! K + real(kind_phys), intent(in) :: pressure(:,:) ! Pa + real(kind_phys), intent(in) :: dry_air_density(:,:) ! kg m-3 + real(kind_phys), intent(in) :: constituents(:,:,:) ! kg kg-1 + real(c_double), intent(out) :: micm_temperature(:) ! K + real(c_double), intent(out) :: micm_pressure(:) ! Pa + real(c_double), intent(out) :: micm_dry_air_density(:) ! kg m-3 + real(c_double), intent(out) :: micm_constituents(:) ! kg kg-1 ! local variables integer :: num_columns, num_layers, num_constituents @@ -83,6 +84,7 @@ subroutine convert_to_mol_per_cubic_meter(dry_air_density, molar_mass_arr, const real(kind_phys), intent(in) :: molar_mass_arr(:) ! kg mol-1 real(kind_phys), intent(inout) :: constituents(:,:,:) ! in: kg kg-1 | out: mol m-3 + ! local variables integer :: num_columns, num_layers, num_constituents integer :: i_column, i_layer, i_elem real(kind_phys) :: val diff --git a/schemes/musica/musica_ccpp.F90 b/schemes/musica/musica_ccpp.F90 index 36890cd..c486bee 100644 --- a/schemes/musica/musica_ccpp.F90 +++ b/schemes/musica/musica_ccpp.F90 @@ -26,7 +26,7 @@ end subroutine musica_ccpp_register !> \section arg_table_musica_ccpp_init Argument Table !! \htmlinclude musica_ccpp_init.html subroutine musica_ccpp_init(vertical_layer_dimension, vertical_interface_dimension, & - errmsg, errcode) + errmsg, errcode) integer, intent(in) :: vertical_layer_dimension ! (count) integer, intent(in) :: vertical_interface_dimension ! (count) character(len=512), intent(out) :: errmsg @@ -45,48 +45,52 @@ end subroutine musica_ccpp_init subroutine musica_ccpp_run(time_step, temperature, pressure, dry_air_density, constituent_props, & constituents, geopotential_height_wrt_surface_at_midpoint, & geopotential_height_wrt_surface_at_interface, surface_geopotential, & - reciprocal_of_gravitational_acceleration, errmsg, errcode) + standard_gravitational_acceleration, errmsg, errcode) use musica_ccpp_micm_util, only: reshape_into_micm_arr, reshape_into_ccpp_arr use musica_ccpp_micm_util, only: convert_to_mol_per_cubic_meter, convert_to_mass_mixing_ratio use ccpp_constituent_prop_mod, only: ccpp_constituent_prop_ptr_t use ccpp_kinds, only: kind_phys use iso_c_binding, only: c_double - real(kind_phys), intent(in) :: time_step ! s - real(kind_phys), target, intent(in) :: temperature(:,:) ! K - real(kind_phys), target, intent(in) :: pressure(:,:) ! Pa - real(kind_phys), target, intent(in) :: dry_air_density(:,:) ! kg m-3 - type(ccpp_constituent_prop_ptr_t), intent(in) :: constituent_props(:) - real(kind_phys), target, intent(inout) :: constituents(:,:,:) ! kg kg-1 - real(kind_phys), target, intent(in) :: geopotential_height_wrt_surface_at_midpoint(:,:) ! m - real(kind_phys), target, intent(in) :: geopotential_height_wrt_surface_at_interface(:,:) ! m - real(kind_phys), target, intent(in) :: surface_geopotential(:) ! m2 s-2 - real(kind_phys), target, intent(in) :: reciprocal_of_gravitational_acceleration ! s2 m-1 - character(len=512), intent(out) :: errmsg - integer, intent(out) :: errcode + real(kind_phys), intent(in) :: time_step ! s + real(kind_phys), intent(in) :: temperature(:,:) ! K + real(kind_phys), intent(in) :: pressure(:,:) ! Pa + real(kind_phys), intent(in) :: dry_air_density(:,:) ! kg m-3 + type(ccpp_constituent_prop_ptr_t), & + intent(in) :: constituent_props(:) + real(kind_phys), intent(inout) :: constituents(:,:,:) ! kg kg-1 + real(kind_phys), intent(in) :: geopotential_height_wrt_surface_at_midpoint(:,:) ! m (column, layer) + real(kind_phys), intent(in) :: geopotential_height_wrt_surface_at_interface(:,:) ! m (column, interface) + real(kind_phys), intent(in) :: surface_geopotential(:) ! m2 s-2 + real(kind_phys), intent(in) :: standard_gravitational_acceleration ! m s-2 + character(len=512), intent(out) :: errmsg + integer, intent(out) :: errcode ! local variables - real(c_double), target, dimension(size(temperature, dim=1) & - * size(temperature, dim=2)) :: micm_temperature - real(c_double), target, dimension(size(pressure, dim=1) & - * size(pressure, dim=2)) :: micm_pressure - real(c_double), target, dimension(size(dry_air_density, dim=1) & - * size(dry_air_density, dim=2)) :: micm_dry_air_density - real(c_double), target, dimension(size(constituents, dim=1) & - * size(constituents, dim=2) & - * size(constituents, dim=3)) :: micm_constituents ! mol m-3 - real(kind_phys), target, dimension(size(constituents, dim=3)) :: molar_mass_arr ! kg mol-1 + real(c_double), dimension(size(temperature, dim=1) & + * size(temperature, dim=2)) :: micm_temperature + real(c_double), dimension(size(pressure, dim=1) & + * size(pressure, dim=2)) :: micm_pressure + real(c_double), dimension(size(dry_air_density, dim=1) & + * size(dry_air_density, dim=2)) :: micm_dry_air_density + real(c_double), dimension(size(constituents, dim=1) & + * size(constituents, dim=2) & + * size(constituents, dim=3)) :: micm_constituents ! mol m-3 + real(kind_phys), dimension(size(constituents, dim=3)) :: molar_mass_arr ! kg mol-1 ! temporarily dimensioned to Chapman mechanism until mapping between MICM and TUV-x is implemented - real(c_double), target, dimension(size(constituents, dim=1) & - * size(constituents, dim=2) & - * 3) :: photolysis_rate_constants ! s-1 + real(c_double), dimension(size(constituents, dim=1) & + * size(constituents, dim=2) & + * 3) :: photolysis_rate_constants ! s-1 integer :: i_elem - call tuvx_run(temperature, dry_air_density, geopotential_height_wrt_surface_at_midpoint, & + call tuvx_run(temperature, dry_air_density, & + geopotential_height_wrt_surface_at_midpoint, & geopotential_height_wrt_surface_at_interface, & - surface_geopotential, reciprocal_of_gravitational_acceleration, & - photolysis_rate_constants, errmsg, errcode) + surface_geopotential, & + standard_gravitational_acceleration, & + photolysis_rate_constants, & + errmsg, errcode) ! Get the molar mass that is set in the call to instantiate() do i_elem = 1, size(molar_mass_arr) @@ -115,8 +119,8 @@ subroutine musica_ccpp_run(time_step, temperature, pressure, dry_air_density, co micm_temperature, micm_pressure, micm_dry_air_density, micm_constituents) ! temporarily pass in unmapped photolysis rate constants until mapping between MICM and TUV-x is implemented - call micm_run(time_step, micm_temperature, micm_pressure, micm_dry_air_density, photolysis_rate_constants, & - micm_constituents, errmsg, errcode) + call micm_run(time_step, micm_temperature, micm_pressure, micm_dry_air_density, & + photolysis_rate_constants, micm_constituents, errmsg, errcode) ! Reshape array (1D -> 3D) and convert type (c_double -> kind_phys) call reshape_into_ccpp_arr(micm_constituents, constituents) diff --git a/schemes/musica/musica_ccpp.meta b/schemes/musica/musica_ccpp.meta index 8cca3ab..f62966f 100644 --- a/schemes/musica/musica_ccpp.meta +++ b/schemes/musica/musica_ccpp.meta @@ -73,15 +73,15 @@ intent = inout [ geopotential_height_wrt_surface_at_midpoint ] standard_name = geopotential_height_wrt_surface - units = km + units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent,vertical_layer_dimension) intent = in [ geopotential_height_wrt_surface_at_interface ] standard_name = geopotential_height_wrt_surface_at_interface - units = km + units = m type = real | kind = kind_phys - dimensions = (horizontal_loop_extent,vertical_layer_dimension) + dimensions = (horizontal_loop_extent,vertical_interface_dimension) intent = in [ surface_geopotential ] standard_name = surface_geopotential @@ -89,9 +89,9 @@ units = m2 s-2 dimensions = (horizontal_loop_extent) intent = in -[ reciprocal_of_gravitational_acceleration ] - standard_name = reciprocal_of_gravitational_acceleration - units = s2 m-1 +[ standard_gravitational_acceleration ] + standard_name = standard_gravitational_acceleration + units = m s-2 type = real | kind = kind_phys dimensions = () intent = in diff --git a/schemes/musica/musica_ccpp_namelist.xml b/schemes/musica/musica_ccpp_namelist.xml index 9ab6b13..a841787 100644 --- a/schemes/musica/musica_ccpp_namelist.xml +++ b/schemes/musica/musica_ccpp_namelist.xml @@ -97,7 +97,7 @@ filename_of_tuvx_configuration none - A configuration file for the TUVX photolysis rate calculator + A configuration file for the TUV-x photolysis rate calculator UNSET_PATH diff --git a/schemes/musica/tuvx/musica_ccpp_tuvx.F90 b/schemes/musica/tuvx/musica_ccpp_tuvx.F90 index 9161a03..48779c9 100644 --- a/schemes/musica/tuvx/musica_ccpp_tuvx.F90 +++ b/schemes/musica/tuvx/musica_ccpp_tuvx.F90 @@ -17,9 +17,9 @@ module musica_ccpp_tuvx contains - !> Intitialize TUVX - subroutine tuvx_init(vertical_layer_dimension, & - vertical_interface_dimension, errmsg, errcode) + !> Intitialize TUV-x + subroutine tuvx_init(vertical_layer_dimension, vertical_interface_dimension, & + errmsg, errcode) use musica_tuvx, only: grid_map_t, profile_map_t, radiator_map_t use musica_util, only: error_t use musica_ccpp_tuvx_height_grid, only: create_height_grid, & @@ -99,20 +99,21 @@ subroutine tuvx_init(vertical_layer_dimension, & end subroutine tuvx_init !> Calculates photolysis rate constants for the current model conditions - subroutine tuvx_run( temperature, dry_air_density, & - geopotential_height_wrt_surface_at_midpoint, & - geopotential_height_wrt_surface_at_interface, & - surface_geopotential, reciprocal_of_gravitational_acceleration, & - photolysis_rate_constants, errmsg, errcode ) + subroutine tuvx_run(temperature, dry_air_density, & + geopotential_height_wrt_surface_at_midpoint, & + geopotential_height_wrt_surface_at_interface, & + surface_geopotential, & + standard_gravitational_acceleration, & + photolysis_rate_constants, errmsg, errcode) use musica_util, only: error_t use musica_ccpp_tuvx_height_grid, only: set_height_grid_values, calculate_heights - real(kind_phys), intent(in) :: temperature(:,:) ! K (column, layer) - real(kind_phys), intent(in) :: dry_air_density(:,:) ! molecule cm-3 (column, layer) + real(kind_phys), intent(in) :: temperature(:,:) ! K (column, layer) + real(kind_phys), intent(in) :: dry_air_density(:,:) ! kg m-3 (column, layer) real(kind_phys), intent(in) :: geopotential_height_wrt_surface_at_midpoint(:,:) ! m (column, layer) real(kind_phys), intent(in) :: geopotential_height_wrt_surface_at_interface(:,:) ! m (column, interface) - real(kind_phys), intent(in) :: surface_geopotential(:) ! m2 s-2 - real(kind_phys), intent(in) :: reciprocal_of_gravitational_acceleration ! s2 m-1 + real(kind_phys), intent(in) :: surface_geopotential(:) ! m2 s-2 + real(kind_phys), intent(in) :: standard_gravitational_acceleration ! m s-2 ! temporarily set to Chapman mechanism and 1 dimension ! until mapping between MICM and TUV-x is implemented real(kind_phys), intent(out) :: photolysis_rate_constants(:) ! s-1 (column, reaction) @@ -128,7 +129,7 @@ subroutine tuvx_run( temperature, dry_air_density, & call calculate_heights( geopotential_height_wrt_surface_at_midpoint(i_col,:), & geopotential_height_wrt_surface_at_interface(i_col,:), & surface_geopotential(i_col), & - reciprocal_of_gravitational_acceleration, & + standard_gravitational_acceleration, & height_midpoints, height_interfaces ) call set_height_grid_values( height_grid, height_midpoints, height_interfaces, & errmsg, errcode ) @@ -148,6 +149,7 @@ subroutine tuvx_final(errmsg, errcode) errmsg = '' errcode = 0 deallocate( height_grid ) + deallocate( tuvx ) end subroutine tuvx_final diff --git a/schemes/musica/tuvx/musica_ccpp_tuvx_height_grid.F90 b/schemes/musica/tuvx/musica_ccpp_tuvx_height_grid.F90 index cb06524..a91e98d 100644 --- a/schemes/musica/tuvx/musica_ccpp_tuvx_height_grid.F90 +++ b/schemes/musica/tuvx/musica_ccpp_tuvx_height_grid.F90 @@ -5,10 +5,10 @@ module musica_ccpp_tuvx_height_grid private public :: create_height_grid, set_height_grid_values, calculate_heights - ! Conversions between the CAM-SIMA height grid and the TUVX height grid + ! Conversions between the CAM-SIMA height grid and the TUV-x height grid ! !----------------------------------------------------------------------- - ! Notes on the conversion between the host-model height grid and the TUVX + ! Notes on the conversion between the host-model height grid and the TUV-x ! ! TUV-x heights are "bottom-up" and require atmospheric constituent ! concentrations at interfaces. Therefore, CAM-SIMA mid-points are used @@ -50,9 +50,8 @@ module musica_ccpp_tuvx_height_grid contains !> Creates a TUV-x height grid - function create_height_grid( vertical_layer_dimension, & - vertical_interface_dimension, errmsg, errcode ) result( height_grid ) - + function create_height_grid(vertical_layer_dimension, vertical_interface_dimension, & + errmsg, errcode) result(height_grid) use musica_ccpp_util, only: has_error_occurred use musica_tuvx_grid, only: grid_t use musica_util, only: error_t @@ -84,9 +83,8 @@ function create_height_grid( vertical_layer_dimension, & end function create_height_grid !> Sets TUV-x height grid values from the host-model height grid - subroutine set_height_grid_values( height_grid, host_midpoints, & - host_interfaces, errmsg, errcode ) - + subroutine set_height_grid_values(height_grid, host_midpoints, & + host_interfaces, errmsg, errcode) use ccpp_kinds, only: kind_phys use musica_ccpp_util, only: has_error_occurred use musica_tuvx_grid, only: grid_t @@ -145,31 +143,30 @@ end subroutine set_height_grid_values !! !! The equation used is taked from CAMChem !! (see https://github.com/ESCOMP/CAM/blob/f0e489e9708ce7b91635f6d4997fbf1e390b0dbb/src/chemistry/mozart/mo_gas_phase_chemdr.F90#L514-L526) - subroutine calculate_heights( geopotential_height_wrt_surface_at_midpoint, & - geopotential_height_wrt_surface_at_interface, & - surface_geopotential, reciprocal_of_gravitational_acceleration, & - height_midpoints, height_interfaces ) - + subroutine calculate_heights(geopotential_height_wrt_surface_at_midpoint, & + geopotential_height_wrt_surface_at_interface, & + surface_geopotential, & + standard_gravitational_acceleration, & + height_midpoints, height_interfaces) use ccpp_kinds, only: kind_phys real(kind_phys), intent(in) :: geopotential_height_wrt_surface_at_midpoint(:) ! m real(kind_phys), intent(in) :: geopotential_height_wrt_surface_at_interface(:) ! m - real(kind_phys), intent(in) :: surface_geopotential ! m2 s-2 - real(kind_phys), intent(in) :: reciprocal_of_gravitational_acceleration ! s2 m-1 - real(kind_phys), intent(out) :: height_midpoints(:) ! km - real(kind_phys), intent(out) :: height_interfaces(:) ! km + real(kind_phys), intent(in) :: surface_geopotential ! m2 s-2 + real(kind_phys), intent(in) :: standard_gravitational_acceleration ! m s-2 + real(kind_phys), intent(out) :: height_midpoints(:) ! km + real(kind_phys), intent(out) :: height_interfaces(:) ! km ! local variable real(kind_phys) :: surface_height ! m - surface_height = surface_geopotential * reciprocal_of_gravitational_acceleration - height_midpoints(:) = 0.001_kind_phys * & - ( geopotential_height_wrt_surface_at_midpoint(:) & - + surface_height ) - height_interfaces(:) = 0.001_kind_phys * & - ( geopotential_height_wrt_surface_at_interface(:) & - + surface_height ) + surface_height = & + surface_geopotential * ( 1.0_kind_phys / standard_gravitational_acceleration ) + height_midpoints(:) = & + 0.001_kind_phys * ( geopotential_height_wrt_surface_at_midpoint(:) + surface_height ) + height_interfaces(:) = & + 0.001_kind_phys * ( geopotential_height_wrt_surface_at_interface(:) + surface_height ) end subroutine calculate_heights -end module musica_ccpp_tuvx_height_grid +end module musica_ccpp_tuvx_height_grid \ No newline at end of file diff --git a/test/docker/Dockerfile.musica b/test/docker/Dockerfile.musica index d323ac7..65940f1 100644 --- a/test/docker/Dockerfile.musica +++ b/test/docker/Dockerfile.musica @@ -1,3 +1,8 @@ +# This Dockerfile is designed for testing MUSICA CCPP functionality. +# It includes: +# - Unit tests for MUSICA utility functions +# - Integration tests for MUSICA CCPP APIs + FROM ubuntu:22.04 ARG MUSICA_GIT_TAG=dbbdb22f5f2807e27c2695db85291951ba178634 @@ -67,7 +72,7 @@ RUN sudo chown -R test_user:test_user atmospheric_physics RUN cd atmospheric_physics/test \ && mkdir lib \ && cd lib \ - && git clone -b add_const_interface --depth 1 https://github.com/peverwhee/ccpp-framework.git + && git clone -b develop --depth 1 https://github.com/NCAR/ccpp-framework.git ENV CCPP_SRC_PATH="lib/ccpp-framework/src" ENV CCPP_FORTRAN_TOOLS_PATH="lib/ccpp-framework/scripts/fortran_tools" diff --git a/test/docker/Dockerfile.musica.no_install b/test/docker/Dockerfile.musica.no_install index efae273..b59489a 100644 --- a/test/docker/Dockerfile.musica.no_install +++ b/test/docker/Dockerfile.musica.no_install @@ -1,3 +1,11 @@ +# This Dockerfile is designed for testing MUSICA CCPP functionality. +# It includes: +# - Unit tests for MUSICA utility functions +# - Integration tests for MUSICA CCPP APIs +# +# No MUSICA library installation is required, as the CMake FetchContent module +# retrieves the MUSICA library automatically. + FROM ubuntu:22.04 ARG MUSICA_GIT_TAG=dbbdb22f5f2807e27c2695db85291951ba178634 @@ -51,7 +59,7 @@ RUN sudo chown -R test_user:test_user atmospheric_physics RUN cd atmospheric_physics/test \ && mkdir lib \ && cd lib \ - && git clone -b add_const_interface --depth 1 https://github.com/peverwhee/ccpp-framework.git + && git clone -b develop --depth 1 https://github.com/NCAR/ccpp-framework.git ENV CCPP_SRC_PATH="lib/ccpp-framework/src" ENV CCPP_FORTRAN_TOOLS_PATH="lib/ccpp-framework/scripts/fortran_tools" diff --git a/test/musica/micm/test_micm_util.F90 b/test/musica/micm/test_micm_util.F90 index 3b5f80c..5581d5d 100644 --- a/test/musica/micm/test_micm_util.F90 +++ b/test/musica/micm/test_micm_util.F90 @@ -16,18 +16,18 @@ subroutine test_reshape() use iso_c_binding, only: c_double use ccpp_kinds, only: kind_phys - integer, parameter :: NUM_SPECIES = 4 - integer, parameter :: NUM_COLUMNS = 2 - integer, parameter :: NUM_LAYERS = 2 - integer, parameter :: NUM_GRID_CELLS = 4 - real(kind_phys), target :: temperature(NUM_COLUMNS,NUM_LAYERS) - real(kind_phys), target :: pressure(NUM_COLUMNS,NUM_LAYERS) - real(kind_phys), target :: dry_air_density(NUM_COLUMNS,NUM_LAYERS) - real(kind_phys), target :: constituents(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) - real(c_double), target :: micm_temperature(NUM_GRID_CELLS) - real(c_double), target :: micm_pressure(NUM_GRID_CELLS) - real(c_double), target :: micm_dry_air_density(NUM_GRID_CELLS) - real(c_double), target :: micm_constituents(NUM_GRID_CELLS*NUM_SPECIES) + integer, parameter :: NUM_SPECIES = 4 + integer, parameter :: NUM_COLUMNS = 2 + integer, parameter :: NUM_LAYERS = 2 + integer, parameter :: NUM_GRID_CELLS = 4 + real(kind_phys) :: temperature(NUM_COLUMNS,NUM_LAYERS) + real(kind_phys) :: pressure(NUM_COLUMNS,NUM_LAYERS) + real(kind_phys) :: dry_air_density(NUM_COLUMNS,NUM_LAYERS) + real(kind_phys) :: constituents(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) + real(c_double) :: micm_temperature(NUM_GRID_CELLS) + real(c_double) :: micm_pressure(NUM_GRID_CELLS) + real(c_double) :: micm_dry_air_density(NUM_GRID_CELLS) + real(c_double) :: micm_constituents(NUM_GRID_CELLS*NUM_SPECIES) ! local variables real(c_double), dimension(NUM_GRID_CELLS) :: arr_conditions @@ -45,7 +45,6 @@ subroutine test_reshape() constituents(1,2,:) = (/ 0.41_kind_phys, 0.42_kind_phys, 0.43_kind_phys, 0.44_kind_phys /) constituents(2,1,:) = (/ 0.21_kind_phys, 0.22_kind_phys, 0.23_kind_phys, 0.24_kind_phys /) constituents(2,2,:) = (/ 0.31_kind_phys, 0.32_kind_phys, 0.33_kind_phys, 0.34_kind_phys /) - arr_conditions = (/ 100.0, 200.0, 300.0, 400.0 /) arr_constituents = (/ 0.1, 0.2, 0.3, 0.4, 0.21, 0.22, 0.23, 0.24, 0.41, 0.42, 0.43, 0.44, 0.31, 0.32, 0.33, 0.34 /) @@ -79,16 +78,17 @@ end subroutine test_reshape subroutine test_unit_conversion() use ccpp_kinds, only: kind_phys - integer, parameter :: NUM_COLUMNS = 2 - integer, parameter :: NUM_LAYERS = 2 - integer, parameter :: NUM_SPECIES = 4 - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS) :: dry_air_density ! kg m-3 - real(kind_phys), target, dimension(NUM_SPECIES) :: molar_mass_arr - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: constituents - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: ccpp_constituents ! kg kg-1 - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: micm_constituents ! mol m-3 - integer :: i_column, i_layer, i_elem - real :: abs_error = 1e-3 + integer, parameter :: NUM_COLUMNS = 2 + integer, parameter :: NUM_LAYERS = 2 + integer, parameter :: NUM_SPECIES = 4 + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS) :: dry_air_density ! kg m-3 + real(kind_phys), dimension(NUM_SPECIES) :: molar_mass_arr + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: constituents + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: ccpp_constituents ! kg kg-1 + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: micm_constituents ! mol m-3 + integer :: i_column, i_layer, i_elem + real :: abs_error = 1e-3 + dry_air_density(:,1) = (/ 3.5_kind_phys, 4.5_kind_phys /) dry_air_density(:,2) = (/ 5.5_kind_phys, 6.5_kind_phys /) molar_mass_arr(:) = (/ 200._kind_phys, 200._kind_phys, 200._kind_phys, 200._kind_phys /) diff --git a/test/musica/musica_ccpp_namelist.F90 b/test/musica/musica_ccpp_namelist.F90 index a3e507c..69c803b 100644 --- a/test/musica/musica_ccpp_namelist.F90 +++ b/test/musica/musica_ccpp_namelist.F90 @@ -3,9 +3,9 @@ module musica_ccpp_namelist implicit none - public :: filename_of_micm_configuration, filename_of_tuvx_configuration private - + public :: filename_of_micm_configuration, filename_of_tuvx_configuration + character(len=*), parameter :: filename_of_micm_configuration = 'chapman' character(len=*), parameter :: filename_of_tuvx_configuration = 'configs/ts1_tsmlt.json' diff --git a/test/musica/test_musica_api.F90 b/test/musica/test_musica_api.F90 index 7b82e92..9fdcfd1 100644 --- a/test/musica/test_musica_api.F90 +++ b/test/musica/test_musica_api.F90 @@ -18,22 +18,22 @@ subroutine test_musica_ccpp_api() implicit none - integer, parameter :: NUM_SPECIES = 4 - integer, parameter :: NUM_COLUMNS = 2 - integer, parameter :: NUM_LAYERS = 2 - integer :: solver_type - integer :: errcode - character(len=512) :: errmsg - real(kind_phys) :: time_step ! s - real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS) :: geopotential_height_wrt_surface_at_midpoint ! m - real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS+1) :: geopotential_height_wrt_surface_at_interface ! m - real(kind_phys), dimension(NUM_COLUMNS) :: surface_geopotential ! m2 s-2 - real(kind_phys) :: reciprocal_of_gravitational_acceleration ! s2 m-1 - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS) :: temperature ! K - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS) :: pressure ! Pa - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS) :: dry_air_density ! kg m-3 - real(kind_phys), target, dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: constituents ! kg kg-1 - type(ccpp_constituent_prop_ptr_t), allocatable :: constituent_props_ptr(:) + integer, parameter :: NUM_SPECIES = 4 + integer, parameter :: NUM_COLUMNS = 2 + integer, parameter :: NUM_LAYERS = 2 + integer :: solver_type + integer :: errcode + character(len=512) :: errmsg + real(kind_phys) :: time_step ! s + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS) :: geopotential_height_wrt_surface_at_midpoint ! m + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS+1) :: geopotential_height_wrt_surface_at_interface ! m + real(kind_phys), dimension(NUM_COLUMNS) :: surface_geopotential ! m2 s-2 + real(kind_phys) :: standard_gravitational_acceleration ! s2 m-1 + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS) :: temperature ! K + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS) :: pressure ! Pa + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS) :: dry_air_density ! kg m-3 + real(kind_phys), dimension(NUM_COLUMNS,NUM_LAYERS,NUM_SPECIES) :: constituents ! kg kg-1 + type(ccpp_constituent_prop_ptr_t), allocatable :: constituent_props_ptr(:) ! local variables type(ccpp_constituent_properties_t), allocatable, target :: constituent_props(:) @@ -52,7 +52,7 @@ subroutine test_musica_ccpp_api() geopotential_height_wrt_surface_at_interface(1,:) = (/ 3000.0_kind_phys, 1000.0_kind_phys, 0.0_kind_phys /) geopotential_height_wrt_surface_at_interface(2,:) = (/ 3000.0_kind_phys, 500.0_kind_phys, -1500.0_kind_phys /) surface_geopotential = (/ 100.0_kind_phys, 200.0_kind_phys /) - reciprocal_of_gravitational_acceleration = 10.0_kind_phys + standard_gravitational_acceleration = 10.0_kind_phys temperature(:,1) = (/ 100._kind_phys, 200._kind_phys /) temperature(:,2) = (/ 300._kind_phys, 400._kind_phys /) pressure(:,1) = (/ 6000.04_kind_phys, 7000.04_kind_phys /) @@ -114,7 +114,7 @@ subroutine test_musica_ccpp_api() call musica_ccpp_run(time_step, temperature, pressure, dry_air_density, constituent_props_ptr, & constituents, geopotential_height_wrt_surface_at_midpoint, & geopotential_height_wrt_surface_at_interface, surface_geopotential, & - reciprocal_of_gravitational_acceleration, errmsg, errcode) + standard_gravitational_acceleration, errmsg, errcode) if (errcode /= 0) then write(*,*) trim(errmsg) stop 3 diff --git a/test/musica/tuvx/test_tuvx_height_grid.F90 b/test/musica/tuvx/test_tuvx_height_grid.F90 index c0f5c6e..a0ed0d8 100644 --- a/test/musica/tuvx/test_tuvx_height_grid.F90 +++ b/test/musica/tuvx/test_tuvx_height_grid.F90 @@ -78,18 +78,18 @@ subroutine test_calculate_height_grid_values() real(kind_phys), dimension(NUM_LAYERS) :: geopotential_height_wrt_surface_at_midpoint ! m real(kind_phys), dimension(NUM_LAYERS+1) :: geopotential_height_wrt_surface_at_interface ! m real(kind_phys) :: surface_geopotential ! m2 s-2 - real(kind_phys) :: reciprocal_of_gravitational_acceleration ! s2 m-1 + real(kind_phys) :: standard_gravitational_acceleration ! m s-2 real(kind_phys), dimension(NUM_LAYERS) :: height_midpoints ! km real(kind_phys), dimension(NUM_LAYERS+1) :: height_interfaces ! km geopotential_height_wrt_surface_at_midpoint(:) = (/ 2000.0_kind_phys, 500.0_kind_phys /) geopotential_height_wrt_surface_at_interface(:) = (/ 3000.0_kind_phys, 1000.0_kind_phys, 0.0_kind_phys /) surface_geopotential = 100.0_kind_phys - reciprocal_of_gravitational_acceleration = 10.0_kind_phys + standard_gravitational_acceleration = 0.1_kind_phys call calculate_heights(geopotential_height_wrt_surface_at_midpoint, & geopotential_height_wrt_surface_at_interface, & - surface_geopotential, reciprocal_of_gravitational_acceleration, & + surface_geopotential, standard_gravitational_acceleration, & height_midpoints, height_interfaces) ASSERT_NEAR(height_midpoints(1), 3.0, 1e-5)