From 121d1dc9566f9cd56c846c147557fef13460dffe Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Fri, 9 Jan 2026 09:35:55 +0000
Subject: [PATCH 01/17] Use the lfric_core with new config api
---
dependencies.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dependencies.yaml b/dependencies.yaml
index 473a2c6ee..43552fbed 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -30,8 +30,8 @@ lfric_apps:
ref:
lfric_core:
- source: git@github.com:MetOffice/lfric_core.git
- ref: 5d4d72f0e35f00e71b1757df6beadec21ece97f0
+ source: git@github.com:mo-rickywong/lfric_core.git
+ ref: ConfigTypeAccess
moci:
source: git@github.com:MetOffice/moci.git
From 9521e1d2abc0ecb1f3f5ae6f140603578c131729 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Fri, 9 Jan 2026 23:05:44 +0000
Subject: [PATCH 02/17] Port as much across to new api without incurring a
linked ticket
---
.../adjoint_tests/source/adjoint_tests.f90 | 5 +-
.../source/algorithm/gravity_wave_alg_mod.x90 | 42 +++++---------
.../gravity_wave_infrastructure_mod.f90 | 38 +++---------
.../gravity_wave/source/gravity_wave.f90 | 4 +-
.../analytic_buoyancy_profiles_mod_test.pf | 2 +-
.../compute_q_operator_kernel_mod_test.pf | 2 +-
.../initial_buoyancy_kernel_mod_test.pf | 4 +-
.../gungho_model/source/gungho_model.f90 | 5 +-
.../algorithm/algorithm_test.f90 | 34 +++++------
.../jedi-interface/jedi_checksum_mod.f90 | 10 ++--
.../source/jedi-interface/jedi_run_mod.f90 | 23 +++++++-
.../source/jedi_lfric_tests.f90 | 5 +-
applications/jules/source/jules.f90 | 6 +-
.../source/driver/lfric2lfric_driver_mod.F90 | 22 +++----
.../lfric2lfric_infrastructure_mod.X90 | 44 ++++++--------
.../lfric2lfric/source/lfric2lfric.F90 | 6 +-
applications/lfric_atm/source/lfric_atm.f90 | 12 ++--
.../lfric_coupled/source/lfric_coupled.f90 | 5 +-
.../common/lfricinp_lfric_driver_mod.f90 | 37 ++++++------
.../linear_model/source/linear_model.f90 | 5 +-
.../driver/name_transport_driver_mod.f90 | 37 ++++--------
.../name_transport/source/name_transport.f90 | 5 +-
.../analytic_name_field_profiles_mod_test.pf | 2 +-
.../kernel/set_name_field_kernel_mod_test.pf | 4 +-
applications/ngarch/source/ngarch.f90 | 8 ++-
.../source/driver/shallow_water_model_mod.F90 | 26 ++-------
.../shallow_water/source/shallow_water.f90 | 6 +-
.../analytic_geopot_profiles_mod_test.pf | 2 +-
...analytic_swe_buoyancy_profiles_mod_test.pf | 2 +-
...ic_swe_streamfunction_profiles_mod_test.pf | 2 +-
.../analytic_swe_wind_profiles_mod_test.pf | 2 +-
.../galewsky_test_case_mod_test.pf | 2 +-
.../kernel/initial_geopot_kernel_mod_test.pf | 4 +-
.../initial_swe_buoyancy_kernel_mod_test.pf | 4 +-
.../initial_swe_tracer_kernel_mod_test.pf | 2 +-
.../kernel/initial_swe_u_kernel_mod_test.pf | 4 +-
...buoyancy_gradient_facet_kernel_mod_test.pf | 2 +-
applications/solver/source/solver.F90 | 37 +++++-------
.../source/driver/transport_driver_mod.f90 | 58 +++++--------------
applications/transport/source/transport.f90 | 7 ++-
...analytic_tracer_field_profiles_mod_test.pf | 2 +-
...ial_tracer_field_sample_kernel_mod_test.pf | 2 +-
.../set_tracer_field_kernel_mod_test.pf | 4 +-
.../jedi_lfric_linear_modeldb_driver_mod.f90 | 5 +-
.../nl/jedi_lfric_nl_modeldb_driver_mod.f90 | 5 +-
.../timestepping/atl_si_timestep_alg_mod.x90 | 9 +--
.../integration-test/cma_test/cma_test.f90 | 39 ++++++-------
.../limited_area/init_gungho_lbcs_alg_mod.x90 | 11 +---
.../semi_implicit_timestep_alg_mod.X90 | 32 ++++------
.../gungho/source/driver/gungho_model_mod.F90 | 44 ++++----------
.../iau_multifile_io/iau_firstfile_io_mod.F90 | 29 ++++------
.../runge_kutta/runge_kutta.f90 | 8 ++-
.../semi_implicit/semi_implicit.f90 | 8 ++-
.../timestepping/tl_si_timestep_alg_mod.x90 | 8 +--
.../source/driver/linear_driver_mod.f90 | 51 +++++-----------
55 files changed, 322 insertions(+), 462 deletions(-)
diff --git a/applications/adjoint_tests/source/adjoint_tests.f90 b/applications/adjoint_tests/source/adjoint_tests.f90
index 5fa5b2232..06e9ccf45 100644
--- a/applications/adjoint_tests/source/adjoint_tests.f90
+++ b/applications/adjoint_tests/source/adjoint_tests.f90
@@ -38,6 +38,7 @@ program adjoint_tests
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise('values', 5)
@@ -59,7 +60,9 @@ program adjoint_tests
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/gravity_wave/source/algorithm/gravity_wave_alg_mod.x90 b/applications/gravity_wave/source/algorithm/gravity_wave_alg_mod.x90
index f5a9bbd93..7a0fcd983 100644
--- a/applications/gravity_wave/source/algorithm/gravity_wave_alg_mod.x90
+++ b/applications/gravity_wave/source/algorithm/gravity_wave_alg_mod.x90
@@ -18,7 +18,6 @@ module gravity_wave_alg_mod
LOG_LEVEL_INFO, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_TRACE
- use namelist_mod, only: namelist_type
! Configuration options
use finite_element_config_mod, only: element_order_h, element_order_v
@@ -496,7 +495,6 @@ contains
use transpose_matrix_vector_kernel_mod, only: transpose_matrix_vector_kernel_type
use sci_enforce_bc_kernel_mod, only: enforce_bc_kernel_type
use fs_continuity_mod, only: W0, W2, W3, Wtheta
- use boundaries_config_mod, only: limited_area
implicit none
@@ -513,34 +511,23 @@ contains
type( field_type ) :: rhs_p
type(mesh_type), pointer :: mesh => null()
- ! Namelists
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: timestepping_nml
- type(namelist_type), pointer :: initial_temperature_nml
- type(namelist_type), pointer :: gravity_wave_constants_nml
- type(namelist_type), pointer :: io_nml
-
! Namelist parameters
- character(len=str_def) :: prime_mesh_name
- real(kind=r_second) :: dt
- real(kind=r_def) :: bvf_square
- integer(kind=i_def) :: b_space
- logical(kind=l_def) :: subroutine_timers
+ character(str_def) :: prime_mesh_name
+ real(r_second) :: dt
+ real(r_def) :: bvf_square
+ integer(i_def) :: b_space
+ logical(l_def) :: subroutine_timers
+ logical(l_def) :: limited_area
! Auxiliary constants to group invokes
real(kind=r_def) :: const1, const2
- if ( subroutine_timers ) call timer('gravity_wave_alg')
-
- ! Pointers to namelists
- timestepping_nml => modeldb%configuration%get_namelist('timestepping')
- initial_temperature_nml => modeldb%configuration%get_namelist('initial_temperature')
- io_nml => modeldb%configuration%get_namelist('io')
+ dt = modeldb%config%timestepping%dt()
+ bvf_square = modeldb%config%initial_temperature%bvf_square()
+ subroutine_timers = modeldb%config%io%subroutine_timers()
+ limited_area = modeldb%config%boundaries%limited_area()
- ! Obtain namelist parameters
- call timestepping_nml%get_value( 'dt', dt )
- call initial_temperature_nml%get_value( 'bvf_square', bvf_square )
- call io_nml%get_value( 'subroutine_timers', subroutine_timers )
+ if ( subroutine_timers ) call timer('gravity_wave_alg')
!=== Do a single timestep ==============================================!
mesh => wind%get_mesh()
@@ -548,10 +535,9 @@ contains
m3_inv => get_inverse_mass_matrix_fe(W3, mesh%get_id())
if ( limited_area ) then
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- gravity_wave_constants_nml => modeldb%configuration%get_namelist('gravity_wave_constants')
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call gravity_wave_constants_nml%get_value( 'b_space', b_space )
+
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ b_space = modeldb%config%gravity_wave_constants%b_space()
select case(b_space)
case(b_space_w0)
diff --git a/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90 b/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
index 46b88ddad..c19930b51 100644
--- a/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
+++ b/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
@@ -30,7 +30,6 @@ module gravity_wave_infrastructure_mod
LOG_LEVEL_ALWAYS, &
LOG_LEVEL_ERROR
use mesh_collection_mod, only : mesh_collection
- use namelist_mod, only : namelist_type
use field_mod, only : field_type
use driver_fem_mod, only : init_fem, init_function_space_chains
use driver_io_mod, only : init_io, final_io
@@ -89,43 +88,24 @@ subroutine initialise_infrastructure( program_name, &
real(r_def) :: domain_height
real(r_def) :: scaled_radius
- type(namelist_type), pointer :: base_mesh_nml => null()
- type(namelist_type), pointer :: formulation_nml => null()
- type(namelist_type), pointer :: extrusion_nml => null()
- type(namelist_type), pointer :: planet_nml => null()
- type(namelist_type), pointer :: multigrid_nml => null()
-
integer(i_def) :: i
integer(i_def), parameter :: one_layer = 1_i_def
!=======================================================================
! 0.0 Extract configuration variables
!=======================================================================
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- formulation_nml => modeldb%configuration%get_namelist('formulation')
- extrusion_nml => modeldb%configuration%get_namelist('extrusion')
- planet_nml => modeldb%configuration%get_namelist('planet')
-
- call formulation_nml%get_value( 'l_multigrid', l_multigrid )
-
+ l_multigrid = modeldb%config%formulation%l_multigrid()
if (l_multigrid) then
- multigrid_nml => modeldb%configuration%get_namelist('multigrid')
- call multigrid_nml%get_value( 'chain_mesh_tags', chain_mesh_tags )
- multigrid_nml => null()
+ chain_mesh_tags = modeldb%config%multigrid%chain_mesh_tags()
end if
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
-
- base_mesh_nml => null()
- extrusion_nml => null()
- formulation_nml => null()
- planet_nml => null()
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ geometry = modeldb%config%base_mesh%geometry()
+ prepartitioned = modeldb%config%base_mesh%prepartitioned()
+ method = modeldb%config%extrusion%method()
+ domain_height = modeldb%config%extrusion%domain_height()
+ number_of_layers = modeldb%config%extrusion%number_of_layers()
+ scaled_radius = modeldb%config%planet%scaled_radius()
!-------------------------------------------------------------------------
! Initialise infrastructure
diff --git a/applications/gravity_wave/source/gravity_wave.f90 b/applications/gravity_wave/source/gravity_wave.f90
index e1a988dd0..7fb067f84 100644
--- a/applications/gravity_wave/source/gravity_wave.f90
+++ b/applications/gravity_wave/source/gravity_wave.f90
@@ -35,11 +35,13 @@ program gravity_wave
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
modeldb%mpi => global_mpi
call init_comm( program_name, modeldb )
call init_config( filename, gravity_wave_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
deallocate( filename )
call init_logger( modeldb%mpi%get_comm(), program_name )
diff --git a/applications/gravity_wave/unit-test/initialisation/analytic_buoyancy_profiles_mod_test.pf b/applications/gravity_wave/unit-test/initialisation/analytic_buoyancy_profiles_mod_test.pf
index 743fdf381..5c7e44646 100644
--- a/applications/gravity_wave/unit-test/initialisation/analytic_buoyancy_profiles_mod_test.pf
+++ b/applications/gravity_wave/unit-test/initialisation/analytic_buoyancy_profiles_mod_test.pf
@@ -116,7 +116,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/gravity_wave/unit-test/kernel/compute_q_operator_kernel_mod_test.pf b/applications/gravity_wave/unit-test/kernel/compute_q_operator_kernel_mod_test.pf
index e4337c084..2b0edf682 100644
--- a/applications/gravity_wave/unit-test/kernel/compute_q_operator_kernel_mod_test.pf
+++ b/applications/gravity_wave/unit-test/kernel/compute_q_operator_kernel_mod_test.pf
@@ -52,7 +52,7 @@ contains
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine tearDown( this )
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf b/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf
index 8a3ca705d..8b18ba861 100644
--- a/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf
+++ b/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf
@@ -85,8 +85,8 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
- use sci_chi_transform_mod, only: final_chi_transforms
+ use config_loader_mod, only: final_configuration
+ use sci_chi_transform_mod, only: final_chi_transforms
implicit none
diff --git a/applications/gungho_model/source/gungho_model.f90 b/applications/gungho_model/source/gungho_model.f90
index da2050f69..50d4b2170 100644
--- a/applications/gungho_model/source/gungho_model.f90
+++ b/applications/gungho_model/source/gungho_model.f90
@@ -47,6 +47,7 @@ program gungho_model
call modeldb%configuration%initialise( application_name, &
table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -70,7 +71,9 @@ program gungho_model
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_timers( application_name )
call init_collections()
diff --git a/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90 b/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
index 9748e3f94..4b4614f1c 100644
--- a/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
+++ b/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
@@ -13,8 +13,9 @@
program algorithm_test
use add_mesh_map_mod, only: assign_mesh_maps
- use configuration_mod, only: final_configuration, &
+ use config_loader_mod, only: final_configuration, &
read_configuration
+ use config_mod, only: config_type
use constants_mod, only: i_def, r_def, str_def, l_def
use create_mesh_mod, only: create_extrusion, create_mesh
use test_algorithm_mod, only: test_algorithm_finalise, &
@@ -36,7 +37,6 @@ program algorithm_test
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO
use namelist_collection_mod, only: namelist_collection_type
- use namelist_mod, only: namelist_type
use base_mesh_config_mod, only: GEOMETRY_SPHERICAL, &
GEOMETRY_PLANAR
@@ -52,6 +52,7 @@ program algorithm_test
character(:), allocatable :: filename
type(namelist_collection_type), save :: configuration
+ type(config_type), save :: config
! Variables used for parsing command line arguments
integer :: length, status, nargs
@@ -76,10 +77,6 @@ program algorithm_test
real(r_def) :: domain_height
real(r_def) :: scaled_radius
- type(namelist_type), pointer :: base_mesh_nml => null()
- type(namelist_type), pointer :: planet_nml => null()
- type(namelist_type), pointer :: extrusion_nml => null()
-
integer(i_def) :: i
integer(i_def), parameter :: one_layer = 1_i_def
@@ -145,27 +142,22 @@ program algorithm_test
! Setup configuration, mesh, and fem
call configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, configuration )
+ call config%initialise( program_name )
+ call read_configuration( filename, &
+ configuration=configuration, &
+ config=config )
call init_collections()
!--------------------------------------
! 0.0 Extract namelist variables
!--------------------------------------
- base_mesh_nml => configuration%get_namelist('base_mesh')
- planet_nml => configuration%get_namelist('planet')
- extrusion_nml => configuration%get_namelist('extrusion')
-
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
-
- base_mesh_nml => null()
- planet_nml => null()
- extrusion_nml => null()
+ prime_mesh_name = config%base_mesh%prime_mesh_name()
+ geometry = config%base_mesh%geometry()
+ method = config%extrusion%method()
+ domain_height = config%extrusion%domain_height()
+ number_of_layers = config%extrusion%number_of_layers()
+ scaled_radius = config%planet%scaled_radius()
!--------------------------------------
! 1.0 Create the meshes
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_checksum_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_checksum_mod.f90
index b5c3faf9f..f383262a3 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_checksum_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_checksum_mod.f90
@@ -58,7 +58,6 @@ subroutine output_linear_checksum( program_name, modeldb )
use constants_mod, only: i_def
use formulation_config_mod, only: moisture_formulation_dry
- use namelist_mod, only: namelist_type
implicit none
@@ -73,11 +72,11 @@ subroutine output_linear_checksum( program_name, modeldb )
type(field_type), pointer :: theta
type(field_type), pointer :: u
type(field_type), pointer :: rho
- type(namelist_type), pointer :: formulation_nml
- integer(kind=i_def) :: moisture_formulation
+
+ integer(i_def) :: moisture_formulation
nullify(moisture_fields, prognostic_fields, mr_array)
- nullify(mr, theta, u, rho, formulation_nml)
+ nullify(mr, theta, u, rho)
! Get the fields to checksum
prognostic_fields => modeldb%fields%get_field_collection("prognostic_fields")
@@ -90,8 +89,7 @@ subroutine output_linear_checksum( program_name, modeldb )
mr => mr_array%bundle
! Get configuration to inform if moisture is output
- formulation_nml => modeldb%configuration%get_namelist('formulation')
- call formulation_nml%get_value( 'moisture_formulation', moisture_formulation )
+ moisture_formulation = modeldb%config%formulation%moisture_formulation()
! Write checksums to file
if (moisture_formulation /= moisture_formulation_dry) then
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
index 8e981a2e9..943b1d691 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
@@ -13,6 +13,8 @@ module jedi_run_mod
use constants_mod, only : i_def, l_def, str_def
use namelist_collection_mod, only : namelist_collection_type
+ use config_mod, only : config_type
+
implicit none
private
@@ -21,6 +23,7 @@ module jedi_run_mod
private
character(str_def) :: jedi_run_name
type(namelist_collection_type) :: configuration
+ type(config_type) :: config
logical(kind=l_def) :: timers_finalised
contains
@@ -34,6 +37,9 @@ module jedi_run_mod
!> Get a pointer to the stored configuration.
procedure, public :: get_configuration
+ !> Get a pointer to the stored config_type.
+ procedure, public :: get_config
+
!> Just finalise subroutine timing; to get useful timing statistics from failed adjoint tests
procedure, public :: finalise_timers
@@ -104,13 +110,15 @@ subroutine initialise_infrastructure( self, filename, model_communicator )
! Initialise the configuration
call self%configuration%initialise( self%jedi_run_name, table_len=10 )
+ call self%config%initialise( self%jedi_run_name )
! Initialise the model communicator to setup global_mpi
call init_internal_comm( model_communicator )
! Setup the config which is curently global
call init_config( filename, jedi_lfric_tests_required_namelists, &
- self%configuration )
+ configuration=self%configuration, &
+ config=self%config )
! Initialise the logger
call lfric_comm%set_comm_mpi_val(model_communicator)
@@ -137,6 +145,19 @@ function get_configuration(self) result(configuration)
end function get_configuration
+!> @brief Get pointer to the stored configuration (config_type)
+!>
+!> @return configuration A pointer to the configuration
+function get_config(self) result(config)
+
+ class( jedi_run_type ), target, intent(inout) :: self
+
+ type( config_type ), pointer :: config
+
+ config => self%config
+
+end function get_config
+
!> @brief Just finalise subroutine timing; to get useful timing statistics from failed adjoint tests
!>
subroutine finalise_timers(self)
diff --git a/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90 b/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
index 2937a18de..dad145aed 100644
--- a/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
+++ b/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
@@ -43,6 +43,7 @@ program jedi_lfric_tests
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise('values', 5)
@@ -64,7 +65,9 @@ program jedi_lfric_tests
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_timers( application_name )
call init_collections()
diff --git a/applications/jules/source/jules.f90 b/applications/jules/source/jules.f90
index 5b2ca853a..522930328 100644
--- a/applications/jules/source/jules.f90
+++ b/applications/jules/source/jules.f90
@@ -44,6 +44,7 @@ program jules
call modeldb%configuration%initialise( application_name, &
table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -65,8 +66,11 @@ program jules
call modeldb%io_contexts%initialise(application_name, 100)
call init_comm( application_name, modeldb )
+
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_timers( application_name )
call init_collections()
diff --git a/applications/lfric2lfric/source/driver/lfric2lfric_driver_mod.F90 b/applications/lfric2lfric/source/driver/lfric2lfric_driver_mod.F90
index c38f37b34..6dea31420 100644
--- a/applications/lfric2lfric/source/driver/lfric2lfric_driver_mod.F90
+++ b/applications/lfric2lfric/source/driver/lfric2lfric_driver_mod.F90
@@ -7,7 +7,8 @@
!>
module lfric2lfric_driver_mod
- use constants_mod, only: str_def, i_def, l_def, r_second
+ use constants_mod, only: str_def, str_max_filename, &
+ i_def, l_def, r_second
use driver_fem_mod, only: final_fem
use driver_io_mod, only: final_io
use driver_modeldb_mod, only: modeldb_type
@@ -25,7 +26,6 @@ module lfric2lfric_driver_mod
log_scratch_space
use mesh_collection_mod, only: mesh_collection
use mesh_mod, only: mesh_type
- use namelist_mod, only: namelist_type
use sci_checksum_alg_mod, only: checksum_alg
!------------------------------------
@@ -94,13 +94,11 @@ subroutine run( modeldb )
integer(kind=i_def), parameter :: start_timestep = 1_i_def
! Namelist variables
- character(len=str_def) :: start_dump_filename
- character(len=str_def) :: checkpoint_stem_name
- integer(kind=i_def) :: regrid_method
+ character(str_max_filename) :: start_dump_filename
+ character(str_max_filename) :: checkpoint_stem_name
+ integer(i_def) :: regrid_method
! Local parameters
- type(namelist_type), pointer :: files_nml
- type(namelist_type), pointer :: lfric2lfric_nml
type(field_collection_type), pointer :: source_fields
type(field_collection_type), pointer :: target_fields
@@ -117,14 +115,10 @@ subroutine run( modeldb )
real(r_second) :: checkpoint_times(1)
- ! Namelist pointers
- files_nml => modeldb%configuration%get_namelist('files')
- lfric2lfric_nml => modeldb%configuration%get_namelist('lfric2lfric')
-
! Extract configuration variables
- call files_nml%get_value( 'start_dump_filename', start_dump_filename )
- call files_nml%get_value( 'checkpoint_stem_name', checkpoint_stem_name )
- call lfric2lfric_nml%get_value( 'regrid_method', regrid_method )
+ start_dump_filename = modeldb%config%files%start_dump_filename()
+ checkpoint_stem_name = modeldb%config%files%checkpoint_stem_name()
+ regrid_method = modeldb%config%lfric2lfric%regrid_method()
! Point to source and target field collections
source_fields => modeldb%fields%get_field_collection(source_collection_name)
diff --git a/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90 b/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
index 108104c11..c4ec19867 100644
--- a/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
+++ b/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
@@ -14,7 +14,8 @@ module lfric2lfric_infrastructure_mod
use add_mesh_map_mod, only: assign_mesh_maps
use blend_orography_alg_mod, only: blend_orography
- use constants_mod, only: str_def, r_def, i_def, l_def, r_second
+ use constants_mod, only: str_def, str_max_filename, &
+ r_def, i_def, l_def, r_second
use create_mesh_mod, only: create_extrusion, &
create_mesh
use driver_modeldb_mod, only: modeldb_type
@@ -154,16 +155,12 @@ contains
type(uniform_extrusion_type), allocatable :: extrusion_2d
! Pointers for namelists
- type(namelist_type), pointer :: planet_nml
- type(namelist_type), pointer :: extrusion_nml
type(namelist_type), pointer :: lfric2lfric_nml
- type(namelist_type), pointer :: files_nml
- type(namelist_type), pointer :: finite_element_nml
! Namelist parameters
character(len=str_def) :: mesh_names(2)
character(len=str_def), allocatable :: twod_names(:)
- character(len=str_def) :: start_dump_filename
+ character(str_max_filename) :: start_dump_filename
! lfric2lfric namelist parameters
integer(kind=i_def) :: origin_domain
@@ -213,31 +210,24 @@ contains
! -------------------------------
! Extract namelist variables
! -------------------------------
- planet_nml => modeldb%configuration%get_namelist('planet')
- extrusion_nml => modeldb%configuration%get_namelist('extrusion')
- lfric2lfric_nml => modeldb%configuration%get_namelist('lfric2lfric')
- files_nml => modeldb%configuration%get_namelist('files')
- finite_element_nml => modeldb%configuration%get_namelist('finite_element')
-
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
- call extrusion_nml%get_value( 'method', extrusion_method )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call extrusion_nml%get_value( 'domain_height', domain_height )
! Check lfric2lfric configuration settings are allowed
+ lfric2lfric_nml => modeldb%configuration%get_namelist('lfric2lfric')
call lfric2lfric_check_configuration( lfric2lfric_nml )
- call lfric2lfric_nml%get_value( 'origin_domain', origin_domain )
- call lfric2lfric_nml%get_value( 'regrid_method', regrid_method )
- call lfric2lfric_nml%get_value( 'destination_mesh_name', &
- mesh_names(dst) )
- call lfric2lfric_nml%get_value( 'source_mesh_name', &
- mesh_names(src) )
- call lfric2lfric_nml%get_value( 'target_domain', target_domain )
- call lfric2lfric_nml%get_value( 'source_geometry', source_geometry )
- call files_nml%get_value( 'start_dump_filename', start_dump_filename )
- call finite_element_nml%get_value( 'element_order_h', element_order_h)
- call finite_element_nml%get_value( 'element_order_v', element_order_v)
+ scaled_radius = modeldb%config%planet%scaled_radius()
+ extrusion_method = modeldb%config%extrusion%method()
+ number_of_layers = modeldb%config%extrusion%number_of_layers()
+ domain_height = modeldb%config%extrusion%domain_height()
+ origin_domain = modeldb%config%lfric2lfric%origin_domain()
+ regrid_method = modeldb%config%lfric2lfric%regrid_method()
+ mesh_names(dst) = modeldb%config%lfric2lfric%destination_mesh_name()
+ mesh_names(src) = modeldb%config%lfric2lfric%source_mesh_name()
+ target_domain = modeldb%config%lfric2lfric%target_domain()
+ source_geometry = modeldb%config%lfric2lfric%source_geometry()
+ start_dump_filename = modeldb%config%files%start_dump_filename()
+ element_order_h = modeldb%config%finite_element%element_order_h()
+ element_order_v = modeldb%config%finite_element%element_order_v()
!=======================================================================
! Mesh
diff --git a/applications/lfric2lfric/source/lfric2lfric.F90 b/applications/lfric2lfric/source/lfric2lfric.F90
index c40c5cc3d..92d560706 100644
--- a/applications/lfric2lfric/source/lfric2lfric.F90
+++ b/applications/lfric2lfric/source/lfric2lfric.F90
@@ -49,6 +49,7 @@ program lfric2lfric
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
write(log_scratch_space,'(A)') &
'Application built with '// trim(precision_real) // &
@@ -67,8 +68,11 @@ program lfric2lfric
call modeldb%values%add_key_value('coupling_dst', coupler)
#endif
call init_comm( program_name, modeldb )
+
call init_config( filename, lfric2lfric_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), program_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/lfric_atm/source/lfric_atm.f90 b/applications/lfric_atm/source/lfric_atm.f90
index 8f314f64d..e6b39ad23 100644
--- a/applications/lfric_atm/source/lfric_atm.f90
+++ b/applications/lfric_atm/source/lfric_atm.f90
@@ -28,7 +28,6 @@ program lfric_atm
use driver_modeldb_mod, only: modeldb_type
use gungho_driver_mod, only: initialise, step, finalise
use lfric_mpi_mod, only: global_mpi
- use namelist_mod, only: namelist_type
use timing_mod, only: init_timing, start_timing, stop_timing, final_timing, tik, LPROF
@@ -40,7 +39,6 @@ program lfric_atm
character(*), parameter :: application_name = "lfric_atm"
character(:), allocatable :: filename
integer(tik) :: timing_handle_global
- type(namelist_type), pointer :: io_nml
logical :: lsubroutine_timers
call parse_command_line( filename )
@@ -49,6 +47,7 @@ program lfric_atm
call modeldb%configuration%initialise( application_name, &
table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -72,14 +71,15 @@ program lfric_atm
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_timers( application_name )
- io_nml => modeldb%configuration%get_namelist('io')
- call io_nml%get_value('subroutine_timers', lsubroutine_timers)
+ lsubroutine_timers = modeldb%config%io%subroutine_timers()
call init_timing( modeldb%mpi%get_comm(), lsubroutine_timers )
- nullify( io_nml )
+
if ( LPROF ) call start_timing( timing_handle_global, '__lfric_atm__ ')
call init_collections()
diff --git a/applications/lfric_coupled/source/lfric_coupled.f90 b/applications/lfric_coupled/source/lfric_coupled.f90
index 16b5d7375..41cde4cd5 100644
--- a/applications/lfric_coupled/source/lfric_coupled.f90
+++ b/applications/lfric_coupled/source/lfric_coupled.f90
@@ -43,6 +43,7 @@ program lfric_coupled
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
@@ -67,7 +68,9 @@ program lfric_coupled
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90 b/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
index a0630d7bf..e250353d9 100644
--- a/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
+++ b/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
@@ -13,6 +13,8 @@ module lfricinp_lfric_driver_mod
! LFRic Modules
use add_mesh_map_mod, only: assign_mesh_maps
use create_mesh_mod, only: create_mesh
+use config_mod, only: config_type
+
use driver_collections_mod, only: init_collections, final_collections
use driver_mesh_mod, only: init_mesh
use driver_fem_mod, only: init_fem
@@ -117,10 +119,7 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
type(namelist_collection_type), save :: configuration
-
-type(namelist_type), pointer :: base_mesh_nml
-type(namelist_type), pointer :: planet_nml
-type(namelist_type), pointer :: extrusion_nml
+type(config_type), save :: config
class(extrusion_type), allocatable :: extrusion
type(uniform_extrusion_type), allocatable :: extrusion_2d
@@ -164,8 +163,9 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
call initialise_halo_comms( comm )
call configuration%initialise( program_name_arg, table_len=10 )
+call config%initialise( program_name_arg )
call load_configuration( lfric_nl_fname, required_lfric_namelists, &
- configuration )
+ configuration, config )
! Initialise logging system
call init_logger( comm, program_name )
@@ -184,16 +184,12 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
! -------------------------------
! 0.0 Extract namelist variables
! -------------------------------
-base_mesh_nml => configuration%get_namelist('base_mesh')
-planet_nml => configuration%get_namelist('planet')
-extrusion_nml => configuration%get_namelist('extrusion')
-
-call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
-call base_mesh_nml%get_value( 'geometry', geometry )
-call planet_nml%get_value( 'scaled_radius', scaled_radius )
-call extrusion_nml%get_value( 'method', extrusion_method )
-call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
-call extrusion_nml%get_value( 'domain_height', domain_height )
+prime_mesh_name = config%base_mesh%prime_mesh_name()
+geometry = config%base_mesh%geometry()
+scaled_radius = config%planet%scaled_radius()
+extrusion_method = config%extrusion%method()
+number_of_layers = config%extrusion%number_of_layers()
+domain_height = config%extrusion%domain_height()
!-------------------------------------------------------------------------
! 1.0 Create the meshes
@@ -279,12 +275,12 @@ end subroutine lfricinp_initialise_lfric
!------------------------------------------------------------------
subroutine load_configuration( lfric_nl, required_lfric_namelists, &
- configuration )
+ configuration, config )
! Description:
! Reads lfric namelists and checks that all required namelists are present
-use configuration_mod, only: read_configuration, ensure_configuration
+use config_loader_mod, only: read_configuration, ensure_configuration
implicit none
@@ -292,7 +288,8 @@ subroutine load_configuration( lfric_nl, required_lfric_namelists, &
character(*), intent(in) :: required_lfric_namelists(:)
-type(namelist_collection_type), intent(INOUT) :: configuration
+type(namelist_collection_type), intent(inout) :: configuration
+type(config_type), intent(inout) :: config
logical :: okay
logical, allocatable :: success_map(:)
@@ -303,7 +300,9 @@ subroutine load_configuration( lfric_nl, required_lfric_namelists, &
call log_event('Loading '//trim(program_name)//' configuration ...', &
LOG_LEVEL_ALWAYS)
-call read_configuration( lfric_nl, configuration )
+call read_configuration( lfric_nl, &
+ configuration=configuration, &
+ config=config )
okay = ensure_configuration(required_lfric_namelists, success_map)
if (.not. okay) then
diff --git a/applications/linear_model/source/linear_model.f90 b/applications/linear_model/source/linear_model.f90
index e58099d46..d113c68d1 100644
--- a/applications/linear_model/source/linear_model.f90
+++ b/applications/linear_model/source/linear_model.f90
@@ -42,6 +42,7 @@ program linear_model
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise('values', 5)
@@ -63,7 +64,9 @@ program linear_model
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
call init_timers( application_name )
call init_collections()
diff --git a/applications/name_transport/source/driver/name_transport_driver_mod.f90 b/applications/name_transport/source/driver/name_transport_driver_mod.f90
index 94e8365c0..01964e2f9 100644
--- a/applications/name_transport/source/driver/name_transport_driver_mod.f90
+++ b/applications/name_transport/source/driver/name_transport_driver_mod.f90
@@ -39,7 +39,6 @@ module name_transport_driver_mod
use mesh_mod, only: mesh_type
use mesh_collection_mod, only: mesh_collection
use model_clock_mod, only: model_clock_type
- use namelist_mod, only: namelist_type
use runtime_constants_mod, only: create_runtime_constants
use sci_checksum_alg_mod, only: checksum_alg
use sci_geometric_constants_mod, only: get_chi_inventory, &
@@ -123,38 +122,22 @@ subroutine initialise_name_transport( program_name, modeldb )
logical(kind=l_def) :: write_diag
logical(kind=l_def) :: use_xios_io
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: extrusion_nml
- type(namelist_type), pointer :: planet_nml
- type(namelist_type), pointer :: io_nml
-
integer(i_def) :: i
integer(i_def), parameter :: one_layer = 1_i_def
!=======================================================================
! 0.0 Extract configuration variables
!=======================================================================
-
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- extrusion_nml => modeldb%configuration%get_namelist('extrusion')
- planet_nml => modeldb%configuration%get_namelist('planet')
- io_nml => modeldb%configuration%get_namelist('io')
-
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
- call io_nml%get_value( 'nodal_output_on_w3', nodal_output_on_w3 )
- call io_nml%get_value( 'write_diag', write_diag )
- call io_nml%get_value( 'use_xios_io', use_xios_io )
-
- base_mesh_nml => null()
- extrusion_nml => null()
- planet_nml => null()
- io_nml => null()
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ geometry = modeldb%config%base_mesh%geometry()
+ prepartitioned = modeldb%config%base_mesh%prepartitioned()
+ method = modeldb%config%extrusion%method()
+ domain_height = modeldb%config%extrusion%domain_height()
+ number_of_layers = modeldb%config%extrusion%number_of_layers()
+ scaled_radius = modeldb%config%planet%scaled_radius()
+ nodal_output_on_w3 = modeldb%config%io%nodal_output_on_w3()
+ write_diag = modeldb%config%io%write_diag()
+ use_xios_io = modeldb%config%io%use_xios_io()
!-----------------------------------------------------------------------
! Initialise infrastructure
diff --git a/applications/name_transport/source/name_transport.f90 b/applications/name_transport/source/name_transport.f90
index 7f8faab1d..baa29557d 100644
--- a/applications/name_transport/source/name_transport.f90
+++ b/applications/name_transport/source/name_transport.f90
@@ -40,10 +40,13 @@ program name_transport
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
+
modeldb%mpi => global_mpi
call init_comm( program_name, modeldb )
call init_config( filename, name_transport_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), program_name )
call log_event( 'Miniapp will run with default precision set as:', &
diff --git a/applications/name_transport/unit-test/initialisation/analytic_name_field_profiles_mod_test.pf b/applications/name_transport/unit-test/initialisation/analytic_name_field_profiles_mod_test.pf
index 9cd49a2b4..3882ca469 100644
--- a/applications/name_transport/unit-test/initialisation/analytic_name_field_profiles_mod_test.pf
+++ b/applications/name_transport/unit-test/initialisation/analytic_name_field_profiles_mod_test.pf
@@ -59,7 +59,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf b/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf
index 7ae24e5d4..1376cdc32 100644
--- a/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf
+++ b/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf
@@ -99,8 +99,8 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
- use sci_chi_transform_mod, only: final_chi_transforms
+ use config_loader_mod, only: final_configuration
+ use sci_chi_transform_mod, only: final_chi_transforms
implicit none
diff --git a/applications/ngarch/source/ngarch.f90 b/applications/ngarch/source/ngarch.f90
index 919eec564..a4d445918 100644
--- a/applications/ngarch/source/ngarch.f90
+++ b/applications/ngarch/source/ngarch.f90
@@ -35,6 +35,7 @@ program ngarch
call parse_command_line( filename )
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the field collections in modeldb
@@ -58,9 +59,10 @@ program ngarch
modeldb%mpi => global_mpi
call init_comm( application_name, modeldb )
- call init_config( filename, &
- ngarch_required_namelists, &
- modeldb%configuration )
+ call init_config( filename, ngarch_required_namelists, &
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
deallocate( filename )
call init_logger( modeldb%mpi%get_comm(), application_name )
diff --git a/applications/shallow_water/source/driver/shallow_water_model_mod.F90 b/applications/shallow_water/source/driver/shallow_water_model_mod.F90
index f2706ce97..35e0d4402 100644
--- a/applications/shallow_water/source/driver/shallow_water_model_mod.F90
+++ b/applications/shallow_water/source/driver/shallow_water_model_mod.F90
@@ -43,8 +43,6 @@ module shallow_water_model_mod
use minmax_tseries_mod, only: minmax_tseries, &
minmax_tseries_init, &
minmax_tseries_final
- use namelist_collection_mod, only: namelist_collection_type
- use namelist_mod, only: namelist_type
use runtime_constants_mod, only: create_runtime_constants
use shallow_water_setup_io_mod, only: init_shallow_water_files
use xios, only: xios_update_calendar
@@ -87,10 +85,6 @@ subroutine initialise_infrastructure( program_name, modeldb)
class(extrusion_type), allocatable :: extrusion
type(uniform_extrusion_type), allocatable :: extrusion_2d
- type(namelist_type), pointer :: base_mesh_nml => null()
- type(namelist_type), pointer :: planet_nml => null()
- type(namelist_type), pointer :: extrusion_nml => null()
-
character(str_def) :: prime_mesh_name
integer(i_def) :: stencil_depth
@@ -108,20 +102,12 @@ subroutine initialise_infrastructure( program_name, modeldb)
!=======================================================================
! 0.0 Extract configuration variables
!=======================================================================
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- planet_nml => modeldb%configuration%get_namelist('planet')
- extrusion_nml => modeldb%configuration%get_namelist('extrusion')
-
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
-
- base_mesh_nml => null()
- planet_nml => null()
- extrusion_nml => null()
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ geometry = modeldb%config%base_mesh%geometry()
+ method = modeldb%config%extrusion%method()
+ domain_height = modeldb%config%extrusion%domain_height()
+ number_of_layers = modeldb%config%extrusion%number_of_layers()
+ scaled_radius = modeldb%config%planet%scaled_radius()
!-------------------------------------------------------------------------
! Initialise aspects of the infrastructure
diff --git a/applications/shallow_water/source/shallow_water.f90 b/applications/shallow_water/source/shallow_water.f90
index c74a664b5..2b4fe2459 100644
--- a/applications/shallow_water/source/shallow_water.f90
+++ b/applications/shallow_water/source/shallow_water.f90
@@ -45,6 +45,7 @@ program shallow_water
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
! Create the depository and prognostics field collections
call modeldb%fields%add_empty_field_collection("depository", &
@@ -58,8 +59,11 @@ program shallow_water
call modeldb%io_contexts%initialise(program_name, 100)
call init_comm( program_name, modeldb )
+
call init_config( filename, shallow_water_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( global_mpi%get_comm(), program_name )
call init_timers( program_name )
call init_counters( program_name )
diff --git a/applications/shallow_water/unit-test/initialisation/analytic_geopot_profiles_mod_test.pf b/applications/shallow_water/unit-test/initialisation/analytic_geopot_profiles_mod_test.pf
index a985748e0..b6ef9f975 100644
--- a/applications/shallow_water/unit-test/initialisation/analytic_geopot_profiles_mod_test.pf
+++ b/applications/shallow_water/unit-test/initialisation/analytic_geopot_profiles_mod_test.pf
@@ -93,7 +93,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/initialisation/analytic_swe_buoyancy_profiles_mod_test.pf b/applications/shallow_water/unit-test/initialisation/analytic_swe_buoyancy_profiles_mod_test.pf
index 3fe39d2bb..ae0fc9ecb 100644
--- a/applications/shallow_water/unit-test/initialisation/analytic_swe_buoyancy_profiles_mod_test.pf
+++ b/applications/shallow_water/unit-test/initialisation/analytic_swe_buoyancy_profiles_mod_test.pf
@@ -94,7 +94,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/initialisation/analytic_swe_streamfunction_profiles_mod_test.pf b/applications/shallow_water/unit-test/initialisation/analytic_swe_streamfunction_profiles_mod_test.pf
index 3a773ccfd..be54919c6 100644
--- a/applications/shallow_water/unit-test/initialisation/analytic_swe_streamfunction_profiles_mod_test.pf
+++ b/applications/shallow_water/unit-test/initialisation/analytic_swe_streamfunction_profiles_mod_test.pf
@@ -95,7 +95,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/initialisation/analytic_swe_wind_profiles_mod_test.pf b/applications/shallow_water/unit-test/initialisation/analytic_swe_wind_profiles_mod_test.pf
index 5e1740da0..7bd513eeb 100644
--- a/applications/shallow_water/unit-test/initialisation/analytic_swe_wind_profiles_mod_test.pf
+++ b/applications/shallow_water/unit-test/initialisation/analytic_swe_wind_profiles_mod_test.pf
@@ -94,7 +94,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/initialisation/galewsky_test_case_mod_test.pf b/applications/shallow_water/unit-test/initialisation/galewsky_test_case_mod_test.pf
index 20365147d..3ee3b9185 100644
--- a/applications/shallow_water/unit-test/initialisation/galewsky_test_case_mod_test.pf
+++ b/applications/shallow_water/unit-test/initialisation/galewsky_test_case_mod_test.pf
@@ -93,7 +93,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf
index fe44262b4..3d1b1f697 100644
--- a/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf
@@ -104,8 +104,8 @@ contains
@after
subroutine tear_down()
- use sci_chi_transform_mod, only: final_chi_transforms
- use configuration_mod, only: final_configuration
+ use sci_chi_transform_mod, only: final_chi_transforms
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf
index 3c69d79cb..151ecd58b 100644
--- a/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf
@@ -105,8 +105,8 @@ contains
@after
subroutine tear_down()
- use sci_chi_transform_mod, only: final_chi_transforms
- use configuration_mod, only: final_configuration
+ use sci_chi_transform_mod, only: final_chi_transforms
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf
index 29103cf75..8a7da1b3a 100644
--- a/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf
@@ -105,7 +105,7 @@ contains
subroutine tear_down()
use sci_chi_transform_mod, only: final_chi_transforms
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf
index 846105876..439798b5d 100644
--- a/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf
@@ -103,8 +103,8 @@ contains
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine tearDown( this )
- use sci_chi_transform_mod, only: final_chi_transforms
- use configuration_mod, only: final_configuration
+ use sci_chi_transform_mod, only: final_chi_transforms
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/shallow_water/unit-test/kernel/swe_buoyancy_gradient_facet_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/swe_buoyancy_gradient_facet_kernel_mod_test.pf
index aa6e2d9fb..d848994a3 100644
--- a/applications/shallow_water/unit-test/kernel/swe_buoyancy_gradient_facet_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/swe_buoyancy_gradient_facet_kernel_mod_test.pf
@@ -52,7 +52,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/solver/source/solver.F90 b/applications/solver/source/solver.F90
index 9c06cb220..acac6298b 100644
--- a/applications/solver/source/solver.F90
+++ b/applications/solver/source/solver.F90
@@ -12,6 +12,8 @@
program solver
use add_mesh_map_mod, only: assign_mesh_maps
+ use config_mod, only: config_type
+ use config_loader_mod, only: final_configuration
use constants_mod, only: i_def, r_def, PRECISION_REAL, str_def
use convert_to_upper_mod, only: convert_to_upper
use cli_mod, only: parse_command_line
@@ -34,7 +36,6 @@ program solver
use field_mod, only: field_type
use sci_field_vector_mod, only: field_vector_type
use solver_miniapp_alg_mod, only: solver_miniapp_alg
- use configuration_mod, only: final_configuration
use solver_miniapp_mod, only: solver_required_namelists
use log_mod, only: log_event, &
log_scratch_space, &
@@ -44,10 +45,8 @@ program solver
use mesh_mod, only: mesh_type
use mesh_collection_mod, only: mesh_collection
use namelist_collection_mod, only: namelist_collection_type
- use namelist_mod, only: namelist_type
use sci_checksum_alg_mod, only: checksum_alg
-
!------------------------------------
! Configuration modules
!------------------------------------
@@ -60,6 +59,7 @@ program solver
character(:), allocatable :: filename
type(namelist_collection_type), SAVE :: configuration
+ type(config_type), SAVE :: config
integer(i_def) :: total_ranks, local_rank
type(lfric_comm_type) :: comm
@@ -80,10 +80,6 @@ program solver
class(extrusion_type), allocatable :: extrusion
type(uniform_extrusion_type), allocatable :: extrusion_2d
- type(namelist_type), pointer :: base_mesh_nml => null()
- type(namelist_type), pointer :: planet_nml => null()
- type(namelist_type), pointer :: extrusion_nml => null()
-
character(str_def) :: prime_mesh_name
integer(i_def) :: stencil_depth
@@ -117,8 +113,12 @@ program solver
local_rank = global_mpi%get_comm_rank()
call configuration%initialise( program_name, table_len=10 )
+ call config%initialise( program_name )
+
call init_config( filename, solver_required_namelists, &
- configuration )
+ configuration=configuration, &
+ config=config )
+
call init_logger( comm, program_name )
call init_collections()
@@ -132,24 +132,15 @@ program solver
!--------------------------------------
! 0.0 Extract namelist variables
!--------------------------------------
- base_mesh_nml => configuration%get_namelist('base_mesh')
- planet_nml => configuration%get_namelist('planet')
- extrusion_nml => configuration%get_namelist('extrusion')
-
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
-
- base_mesh_nml => null()
- planet_nml => null()
- extrusion_nml => null()
+ prime_mesh_name = config%base_mesh%prime_mesh_name()
+ geometry = config%base_mesh%geometry()
+ method = config%extrusion%method()
+ domain_height = config%extrusion%domain_height()
+ number_of_layers = config%extrusion%number_of_layers()
+ scaled_radius = config%planet%scaled_radius()
call log_event( 'Initialising '//program_name//' ...', LOG_LEVEL_ALWAYS )
-
!=======================================================================
! 1.0 Mesh
!=======================================================================
diff --git a/applications/transport/source/driver/transport_driver_mod.f90 b/applications/transport/source/driver/transport_driver_mod.f90
index 2f9d4361d..530b49009 100644
--- a/applications/transport/source/driver/transport_driver_mod.f90
+++ b/applications/transport/source/driver/transport_driver_mod.f90
@@ -11,7 +11,7 @@ module transport_driver_mod
use add_mesh_map_mod, only: assign_mesh_maps
use sci_checksum_alg_mod, only: checksum_alg
use check_configuration_mod, only: get_required_stencil_depth
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
use constants_mod, only: i_def, l_def, &
r_def, r_second, str_def
use create_mesh_mod, only: create_mesh, create_extrusion
@@ -49,7 +49,6 @@ module transport_driver_mod
use mesh_collection_mod, only: mesh_collection
use model_clock_mod, only: model_clock_type
use mr_indices_mod, only: nummr
- use namelist_mod, only: namelist_type
use runtime_constants_mod, only: create_runtime_constants
use timer_mod, only: timer
use transport_init_fields_alg_mod, only: transport_init_fields_alg
@@ -142,58 +141,33 @@ subroutine initialise_transport( program_name, modeldb )
logical(kind=l_def) :: write_diag
logical(kind=l_def) :: use_xios_io
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: formulation_nml
- type(namelist_type), pointer :: extrusion_nml
- type(namelist_type), pointer :: planet_nml
- type(namelist_type), pointer :: multigrid_nml
- type(namelist_type), pointer :: multires_coupling_nml
- type(namelist_type), pointer :: io_nml
-
integer(i_def) :: i
integer(i_def), parameter :: one_layer = 1_i_def
!=======================================================================
! 0.0 Extract configuration variables
!=======================================================================
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- formulation_nml => modeldb%configuration%get_namelist('formulation')
- extrusion_nml => modeldb%configuration%get_namelist('extrusion')
- planet_nml => modeldb%configuration%get_namelist('planet')
- io_nml => modeldb%configuration%get_namelist('io')
-
- call formulation_nml%get_value( 'l_multigrid', l_multigrid )
- call formulation_nml%get_value( 'use_multires_coupling', &
- use_multires_coupling )
+ l_multigrid = modeldb%config%formulation%l_multigrid()
+ use_multires_coupling = modeldb%config%formulation%use_multires_coupling()
+
if (use_multires_coupling) then
- multires_coupling_nml => modeldb%configuration%get_namelist('multires_coupling')
- call multires_coupling_nml%get_value( 'aerosol_mesh_name', &
- aerosol_mesh_name )
- multires_coupling_nml => null()
+ aerosol_mesh_name = modeldb%config%multires_coupling%aerosol_mesh_name()
end if
if (l_multigrid) then
- multigrid_nml => modeldb%configuration%get_namelist('multigrid')
- call multigrid_nml%get_value( 'chain_mesh_tags', chain_mesh_tags )
- multigrid_nml => null()
+ chain_mesh_tags = modeldb%config%multigrid%chain_mesh_tags()
end if
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
- call io_nml%get_value( 'nodal_output_on_w3', nodal_output_on_w3 )
- call io_nml%get_value( 'write_diag', write_diag )
- call io_nml%get_value( 'use_xios_io', use_xios_io )
-
- base_mesh_nml => null()
- extrusion_nml => null()
- formulation_nml => null()
- planet_nml => null()
- io_nml => null()
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ geometry = modeldb%config%base_mesh%geometry()
+ prepartitioned = modeldb%config%base_mesh%prepartitioned()
+ method = modeldb%config%extrusion%method()
+ domain_height = modeldb%config%extrusion%domain_height()
+ number_of_layers = modeldb%config%extrusion%number_of_layers()
+ scaled_radius = modeldb%config%planet%scaled_radius()
+ nodal_output_on_w3 = modeldb%config%io%nodal_output_on_w3()
+ write_diag = modeldb%config%io%write_diag()
+ use_xios_io = modeldb%config%io%use_xios_io()
!-----------------------------------------------------------------------
! Initialise infrastructure
diff --git a/applications/transport/source/transport.f90 b/applications/transport/source/transport.f90
index a4ea8347a..bcc454675 100644
--- a/applications/transport/source/transport.f90
+++ b/applications/transport/source/transport.f90
@@ -37,10 +37,15 @@ program transport
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
+
modeldb%mpi => global_mpi
call init_comm( program_name, modeldb )
+
call init_config( filename, transport_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), program_name )
call log_event( 'Miniapp will run with default precision set as:', &
diff --git a/applications/transport/unit-test/initialisation/analytic_tracer_field_profiles_mod_test.pf b/applications/transport/unit-test/initialisation/analytic_tracer_field_profiles_mod_test.pf
index 9628fa396..2b000cb90 100644
--- a/applications/transport/unit-test/initialisation/analytic_tracer_field_profiles_mod_test.pf
+++ b/applications/transport/unit-test/initialisation/analytic_tracer_field_profiles_mod_test.pf
@@ -60,7 +60,7 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf b/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf
index 7fcd8dc18..db903e964 100644
--- a/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf
+++ b/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf
@@ -90,7 +90,7 @@ contains
subroutine tearDown( this )
use sci_chi_transform_mod, only: final_chi_transforms
- use configuration_mod, only: final_configuration
+ use config_loader_mod, only: final_configuration
implicit none
diff --git a/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf b/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf
index 04e00da19..6d57a726b 100644
--- a/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf
+++ b/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf
@@ -111,8 +111,8 @@ contains
@after
subroutine tear_down()
- use configuration_mod, only: final_configuration
- use sci_chi_transform_mod, only: final_chi_transforms
+ use config_loader_mod, only: final_configuration
+ use sci_chi_transform_mod, only: final_chi_transforms
implicit none
diff --git a/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90 b/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
index c7d2bb148..4ddd50aae 100644
--- a/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
@@ -119,7 +119,7 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
! 1. Initialise modeldb field collections, configuration and mpi.
modeldb%mpi => mpi_obj
call modeldb%configuration%initialise( modeldb_name, table_len=10 )
-
+ call modeldb%config%initialise( modeldb_name )
call modeldb%values%initialise('values', 5)
! Create the depository, prognostics and diagnostics field collections
@@ -139,7 +139,8 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
call modeldb%io_contexts%initialise(modeldb_name, table_len=100)
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
! 2. Setup some model modeldb%values and initialise infrastructure
call modeldb%values%add_key_value( 'temperature_correction_rate', 0.0_r_def )
diff --git a/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90 b/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
index 6d1405ba6..37773a05e 100644
--- a/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
@@ -67,7 +67,7 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb )
! 1. Initialise modeldb field collections, configuration and mpi.
modeldb%mpi => mpi_obj
call modeldb%configuration%initialise( modeldb_name, table_len=10 )
-
+ call modeldb%config%initialise( modeldb_name )
call modeldb%values%initialise('values', table_len = 5)
! 2. Create the depository, prognostics and diagnostics field collections
@@ -89,7 +89,8 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb )
call modeldb%io_contexts%initialise(modeldb_name, table_len=100)
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
! 3. Initialise the clock and calendar
call init_time( modeldb )
diff --git a/science/adjoint/source/algorithm/timestepping/atl_si_timestep_alg_mod.x90 b/science/adjoint/source/algorithm/timestepping/atl_si_timestep_alg_mod.x90
index 04c466748..31d40ccd1 100644
--- a/science/adjoint/source/algorithm/timestepping/atl_si_timestep_alg_mod.x90
+++ b/science/adjoint/source/algorithm/timestepping/atl_si_timestep_alg_mod.x90
@@ -12,7 +12,6 @@ module atl_si_timestep_alg_mod
use log_mod, only: log_event, log_scratch_space, &
LOG_LEVEL_INFO, LOG_LEVEL_ERROR
use driver_modeldb_mod, only: modeldb_type
- use namelist_mod, only: namelist_type
use reference_element_mod, only: T
use formulation_config_mod, only: dlayer_on, exner_from_eos, si_momentum_equation, &
moisture_formulation, moisture_formulation_dry, &
@@ -314,8 +313,6 @@ contains
integer(kind=i_def) :: ls_outer, ls_inner
integer(kind=i_def) :: next_outer, next_inner
real(kind=r_def) :: varalpha, varbeta
- type(namelist_type), pointer :: mixed_solver_nml
- type(namelist_type), pointer :: base_mesh_nml
real(kind=r_def) :: mixed_solver_a_tol
type(field_type) :: rhs_n_igh_u
type(field_type) :: advected_u
@@ -329,8 +326,7 @@ contains
qr => get_qr_fe()
! Get mesh
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
mesh => mesh_collection%get_mesh(prime_mesh_name)
mm_wt => get_mass_matrix_fe( Wtheta, mesh%get_id() )
@@ -627,8 +623,7 @@ contains
! Solve adjoint of semi-implicit system: A * inc = rhs
!-----------------------------------------------------------------------
- mixed_solver_nml => modeldb%configuration%get_namelist('mixed_solver')
- call mixed_solver_nml%get_value( 'mixed_solver_a_tol', mixed_solver_a_tol )
+ mixed_solver_a_tol = modeldb%config%mixed_solver%mixed_solver_a_tol()
! If self%state is zero, there is no need to call the SI solver
if (.not. bundle_is_zero( mixed_solver_a_tol, self%state, bundle_size )) then
diff --git a/science/gungho/integration-test/cma_test/cma_test.f90 b/science/gungho/integration-test/cma_test/cma_test.f90
index 2797865da..31179bda1 100644
--- a/science/gungho/integration-test/cma_test/cma_test.f90
+++ b/science/gungho/integration-test/cma_test/cma_test.f90
@@ -29,8 +29,10 @@ program cma_test
test_cma_add, &
test_cma_apply_inv, &
test_cma_diag_DhMDhT
+ use config_mod, only : config_type
use constants_mod, only : i_def, r_def, i_def, l_def, &
- r_solver, pi, str_def
+ r_solver, pi, str_def, &
+ str_max_filename
use derived_config_mod, only : set_derived_config
use extrusion_mod, only : extrusion_type, &
uniform_extrusion_type, &
@@ -57,8 +59,6 @@ program cma_test
use mesh_mod, only : mesh_type
use mesh_collection_mod, only : mesh_collection
use namelist_collection_mod, only : namelist_collection_type
- use namelist_mod, only : namelist_type
-
use base_mesh_config_mod, only : GEOMETRY_SPHERICAL
use create_mesh_mod, only : create_mesh
use add_mesh_map_mod, only : assign_mesh_maps
@@ -125,13 +125,11 @@ program cma_test
! Namelist and configuration variables
type(namelist_collection_type), save :: configuration
+ type(config_type), save :: config
- type(namelist_type), pointer :: extrusion_nml
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: planet_nml
+ character(str_max_filename) :: file_prefix
integer(i_def) :: stencil_depth
- character(str_def) :: file_prefix
character(str_def) :: prime_mesh_name
real(r_def) :: radius
real(r_def) :: scaled_radius
@@ -232,6 +230,7 @@ program cma_test
end select
call configuration%initialise( program_name, table_len=10 )
+ call config%initialise( program_name )
deallocate(program_name)
deallocate(test_flag)
@@ -243,7 +242,9 @@ program cma_test
call log_event( log_scratch_space, LOG_LEVEL_INFO )
allocate( success_map(size(required_configuration)) )
- call read_configuration( filename, configuration )
+ call read_configuration( filename, &
+ configuration=configuration, &
+ config=config )
okay = ensure_configuration( required_configuration, success_map )
if (.not. okay) then
@@ -262,19 +263,15 @@ program cma_test
call init_collections()
- extrusion_nml => configuration%get_namelist('extrusion')
- base_mesh_nml => configuration%get_namelist('base_mesh')
- planet_nml => configuration%get_namelist('planet')
-
- call extrusion_nml%get_value( 'method', extrusion_method )
- call extrusion_nml%get_value( 'planet_radius', radius )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call base_mesh_nml%get_value( 'file_prefix', file_prefix )
- call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
+ extrusion_method = config%extrusion%method()
+ radius = config%extrusion%planet_radius()
+ number_of_layers = config%extrusion%number_of_layers()
+ domain_height = config%extrusion%domain_height()
+ file_prefix = config%base_mesh%file_prefix()
+ prepartitioned = config%base_mesh%prepartitioned()
+ geometry = config%base_mesh%geometry()
+ prime_mesh_name = config%base_mesh%prime_mesh_name()
+ scaled_radius = config%planet%scaled_radius()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Initialise
diff --git a/science/gungho/source/algorithm/limited_area/init_gungho_lbcs_alg_mod.x90 b/science/gungho/source/algorithm/limited_area/init_gungho_lbcs_alg_mod.x90
index 24391689a..d93de2056 100644
--- a/science/gungho/source/algorithm/limited_area/init_gungho_lbcs_alg_mod.x90
+++ b/science/gungho/source/algorithm/limited_area/init_gungho_lbcs_alg_mod.x90
@@ -91,18 +91,11 @@ module init_gungho_lbcs_alg_mod
integer(i_def) :: imr
type(mesh_type), pointer :: mesh
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: formulation_nml
-
character(len=str_def) :: prime_mesh_name
integer(i_def) :: moisture_formulation
-
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- formulation_nml => modeldb%configuration%get_namelist('formulation')
-
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call formulation_nml%get_value( 'moisture_formulation', moisture_formulation )
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ moisture_formulation = modeldb%config%formulation%moisture_formulation()
call prognostic_fields%get_field( 'theta', theta )
call prognostic_fields%get_field( 'u', u )
diff --git a/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90 b/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90
index 7aa360475..4f10820d6 100644
--- a/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90
+++ b/science/gungho/source/algorithm/timestepping/semi_implicit_timestep_alg_mod.X90
@@ -14,7 +14,6 @@ module semi_implicit_timestep_alg_mod
log_scratch_space, &
LOG_LEVEL_INFO
use extrusion_mod, only: TWOD
- use namelist_mod, only: namelist_type
use sci_fem_constants_mod, only: get_mass_matrix_fe, &
get_mass_matrix_fv
use sci_field_bundle_builtins_mod, &
@@ -651,40 +650,29 @@ contains
logical(kind=l_def) :: checkpoint_reference_fields
! Namelist parameters
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: initialization_nml
- type(namelist_type), pointer :: microphysics_nml
- type(namelist_type), pointer :: aerosol_nml
- type(namelist_type), pointer :: timestepping_nml
-
- character(str_def) :: prime_mesh_name
- integer(i_def) :: lbc_option
- logical(l_def) :: microphysics_casim
- logical(l_def) :: murk_lbc
- real(r_def) :: tau_r
+ character(str_def) :: prime_mesh_name
+ integer(i_def) :: lbc_option
+ logical(l_def) :: microphysics_casim
+ logical(l_def) :: murk_lbc
+ real(r_def) :: tau_r
if ( subroutine_timers ) call timer('semi_implicit_timestep_alg')
cast_dt = real(model_clock%get_seconds_per_step(), r_def)
if (limited_area .and. use_wavedynamics) then
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- initialization_nml => modeldb%configuration%get_namelist('initialization')
- timestepping_nml => modeldb%configuration%get_namelist('timestepping')
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call initialization_nml%get_value( 'lbc_option', lbc_option )
- call timestepping_nml%get_value( 'tau_r', tau_r )
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ lbc_option = modeldb%config%initialization%lbc_option()
+ tau_r = modeldb%config%timestepping%tau_r()
if (lbc_option == lbc_option_um2lfric_file) then
- aerosol_nml => modeldb%configuration%get_namelist('aerosol')
- call aerosol_nml%get_value( 'murk_lbc', murk_lbc )
+ murk_lbc = modeldb%config%aerosol%murk_lbc()
end if
end if
if (lbc_option == lbc_option_um2lfric_file .or. &
(use_physics .and. cloud == cloud_um)) then
- microphysics_nml => modeldb%configuration%get_namelist('microphysics')
- call microphysics_nml%get_value( 'microphysics_casim', microphysics_casim )
+ microphysics_casim = modeldb%config%microphysics%microphysics_casim()
end if
if (element_order_h == 0 .and. element_order_v == 0) then
diff --git a/science/gungho/source/driver/gungho_model_mod.F90 b/science/gungho/source/driver/gungho_model_mod.F90
index e91f0fbd6..8a885b432 100644
--- a/science/gungho/source/driver/gungho_model_mod.F90
+++ b/science/gungho/source/driver/gungho_model_mod.F90
@@ -73,8 +73,6 @@ module gungho_model_mod
use model_clock_mod, only : model_clock_type
use moisture_conservation_alg_mod, &
only : moisture_conservation_alg
- use namelist_collection_mod, only : namelist_collection_type
- use namelist_mod, only : namelist_type
use mr_indices_mod, only : nummr
use no_timestep_alg_mod, only : no_timestep_type
use remove_duplicates_mod, only : remove_duplicates
@@ -451,12 +449,6 @@ subroutine initialise_infrastructure( io_context_name, modeldb )
real(r_def) :: scaled_radius
integer(i_def) :: number_of_layers
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: formulation_nml
- type(namelist_type), pointer :: extrusion_nml
- type(namelist_type), pointer :: planet_nml
- type(namelist_type), pointer :: multigrid_nml
- type(namelist_type), pointer :: multires_coupling_nml
#ifdef UM_PHYSICS
real(r_def) :: dt
#endif
@@ -473,37 +465,25 @@ subroutine initialise_infrastructure( io_context_name, modeldb )
call check_configuration(modeldb)
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- formulation_nml => modeldb%configuration%get_namelist('formulation')
- extrusion_nml => modeldb%configuration%get_namelist('extrusion')
- planet_nml => modeldb%configuration%get_namelist('planet')
- multires_coupling_nml => null()
- multigrid_nml => null()
-
- call formulation_nml%get_value( 'l_multigrid', l_multigrid )
- call formulation_nml%get_value( 'use_multires_coupling', &
- use_multires_coupling )
+ l_multigrid = modeldb%config%formulation%l_multigrid()
+ use_multires_coupling = modeldb%config%formulation%use_multires_coupling()
if ( use_multires_coupling ) then
- multires_coupling_nml => modeldb%configuration%get_namelist('multires_coupling')
- call multires_coupling_nml%get_value( 'multires_coupling_mesh_tags', &
- multires_coupling_mesh_tags )
- call multires_coupling_nml%get_value( 'orography_mesh_name', &
- orography_mesh_name )
+ multires_coupling_mesh_tags = modeldb%config%multires_coupling%multires_coupling_mesh_tags()
+ orography_mesh_name = modeldb%config%multires_coupling%orography_mesh_name()
end if
if ( l_multigrid ) then
- multigrid_nml => modeldb%configuration%get_namelist('multigrid')
- call multigrid_nml%get_value( 'chain_mesh_tags', chain_mesh_tags )
+ chain_mesh_tags = modeldb%config%multigrid%chain_mesh_tags()
end if
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'method', extrusion_method )
- call extrusion_nml%get_value( 'number_of_layers', number_of_layers )
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ geometry = modeldb%config%base_mesh%geometry()
+ prepartitioned = modeldb%config%base_mesh%prepartitioned()
+ domain_height = modeldb%config%extrusion%domain_height()
+ extrusion_method = modeldb%config%extrusion%method()
+ number_of_layers = modeldb%config%extrusion%number_of_layers()
+ scaled_radius = modeldb%config%planet%scaled_radius()
!-------------------------------------------------------------------------
! Initialise infrastructure
diff --git a/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90 b/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90
index efca60c32..dfc166e87 100644
--- a/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90
+++ b/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90
@@ -9,7 +9,7 @@
module iau_firstfile_io_mod
use calendar_mod, only: calendar_type
- use constants_mod, only: str_def, l_def
+ use constants_mod, only: str_def, str_max_filename, l_def
use driver_modeldb_mod, only: modeldb_type
use field_collection_mod, only: field_collection_type
use field_mod, only: field_type
@@ -22,7 +22,6 @@ module iau_firstfile_io_mod
use linked_list_mod, only: linked_list_type
use mesh_collection_mod, only: mesh_collection
use mesh_mod, only: mesh_type
- use namelist_mod, only: namelist_type
use sci_geometric_constants_mod, only: get_chi_inventory, &
get_panel_id_inventory
use step_calendar_mod, only: step_calendar_type
@@ -58,10 +57,6 @@ subroutine iau_incs_firstfile_io ( io_context_name, modeldb, &
type(lfric_xios_context_type), pointer :: io_context
type(linked_list_type), pointer :: file_list
type(field_collection_type), pointer :: multifile_fields
- type(namelist_type), pointer :: time_nml
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: files_nml
- type(namelist_type), pointer :: io_nml
class(calendar_type), allocatable :: tmp_calendar
@@ -69,8 +64,9 @@ subroutine iau_incs_firstfile_io ( io_context_name, modeldb, &
character(str_def) :: time_start
character(str_def) :: prime_mesh_name
character(str_def) :: context_name
- character(str_def) :: iau_addinf_path
- character(str_def) :: iau_bcorr_path
+
+ character(str_max_filename) :: iau_addinf_path
+ character(str_max_filename) :: iau_bcorr_path
logical(l_def) :: use_xios_io
@@ -81,17 +77,12 @@ subroutine iau_incs_firstfile_io ( io_context_name, modeldb, &
chi_inventory => get_chi_inventory()
panel_id_inventory => get_panel_id_inventory()
- time_nml => modeldb%configuration%get_namelist('time')
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- files_nml => modeldb%configuration%get_namelist('files')
- io_nml => modeldb%configuration%get_namelist('io')
-
- call time_nml%get_value('calendar_origin', time_origin)
- call time_nml%get_value('calendar_start', time_start)
- call base_mesh_nml%get_value('prime_mesh_name', prime_mesh_name)
- call files_nml%get_value('iau_addinf_path', iau_addinf_path)
- call files_nml%get_value('iau_bcorr_path', iau_bcorr_path)
- call io_nml%get_value('use_xios_io', use_xios_io)
+ time_origin = modeldb%config%time%calendar_origin()
+ time_start = modeldb%config%time%calendar_start()
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+ iau_addinf_path = modeldb%config%files%iau_addinf_path()
+ iau_bcorr_path = modeldb%config%files%iau_bcorr_path()
+ use_xios_io = modeldb%config%io%use_xios_io()
! get filename and set up context name for this file
context_name = "multifile_context_" // trim(iau_incs_path)
diff --git a/science/linear/integration-test/runge_kutta/runge_kutta.f90 b/science/linear/integration-test/runge_kutta/runge_kutta.f90
index f460201ac..d49c8638f 100644
--- a/science/linear/integration-test/runge_kutta/runge_kutta.f90
+++ b/science/linear/integration-test/runge_kutta/runge_kutta.f90
@@ -10,7 +10,7 @@
!! corresponding nonlinear code.
program runge_kutta
- use configuration_mod, only: read_configuration, final_configuration
+ use config_loader_mod, only: read_configuration, final_configuration
use driver_collections_mod, only: init_collections, final_collections
use driver_time_mod, only: init_time, final_time
use driver_modeldb_mod, only: modeldb_type
@@ -146,7 +146,11 @@ program runge_kutta
end select
call modeldb%configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, modeldb%configuration )
+ call modeldb%config%initialise( program_name )
+ call read_configuration( filename, &
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
deallocate( filename )
call init_collections()
diff --git a/science/linear/integration-test/semi_implicit/semi_implicit.f90 b/science/linear/integration-test/semi_implicit/semi_implicit.f90
index af625729c..4ee8e4888 100644
--- a/science/linear/integration-test/semi_implicit/semi_implicit.f90
+++ b/science/linear/integration-test/semi_implicit/semi_implicit.f90
@@ -10,7 +10,7 @@
!! corresponding nonlinear code.
program semi_implicit
- use configuration_mod, only: read_configuration, final_configuration
+ use config_loader_mod, only: read_configuration, final_configuration
use driver_collections_mod, only: init_collections, final_collections
use driver_time_mod, only: init_time, final_time
use driver_modeldb_mod, only: modeldb_type
@@ -22,7 +22,6 @@ program semi_implicit
log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO
- use namelist_collection_mod, only: namelist_collection_type
use tl_test_driver_mod, only: initialise, &
finalise, &
run_timesteps, &
@@ -133,7 +132,10 @@ program semi_implicit
end select
call modeldb%configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, modeldb%configuration )
+ call modeldb%config%initialise( program_name )
+ call read_configuration( filename, &
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
deallocate( filename )
call init_collections()
diff --git a/science/linear/source/algorithm/timestepping/tl_si_timestep_alg_mod.x90 b/science/linear/source/algorithm/timestepping/tl_si_timestep_alg_mod.x90
index c4bfedbd2..97638f671 100644
--- a/science/linear/source/algorithm/timestepping/tl_si_timestep_alg_mod.x90
+++ b/science/linear/source/algorithm/timestepping/tl_si_timestep_alg_mod.x90
@@ -14,7 +14,6 @@ module tl_si_timestep_alg_mod
LOG_LEVEL_INFO, &
LOG_LEVEL_ERROR
use driver_modeldb_mod, only: modeldb_type
- use namelist_mod, only: namelist_type
use reference_element_mod, only: T
! Configuration options
@@ -394,8 +393,7 @@ contains
logical( kind=l_def ) :: write_moisture_diag = .false.
! Configuration
- type( namelist_type ), pointer :: mixed_solver_nml
- real( kind=r_def ) :: mixed_solver_a_tol
+ real( kind=r_def ) :: mixed_solver_a_tol
if ( subroutine_timers ) call timer('semi_implicit_timestep_alg')
@@ -803,9 +801,7 @@ contains
! Solve semi-implicit system: A*inc = rhs, and increment state by inc
!--------------------------------------------------------------------
- mixed_solver_nml => modeldb%configuration%get_namelist('mixed_solver')
- call mixed_solver_nml%get_value( 'mixed_solver_a_tol', &
- mixed_solver_a_tol )
+ mixed_solver_a_tol = modeldb%config%mixed_solver%mixed_solver_a_tol()
! If rhs_np1 is zero, there is no need to call the SI solver
if ( .not. &
diff --git a/science/linear/source/driver/linear_driver_mod.f90 b/science/linear/source/driver/linear_driver_mod.f90
index 662faea60..9b6d80282 100644
--- a/science/linear/source/driver/linear_driver_mod.f90
+++ b/science/linear/source/driver/linear_driver_mod.f90
@@ -49,7 +49,6 @@ module linear_driver_mod
use linear_data_algorithm_mod, only : update_ls_file_alg
use mesh_mod, only : mesh_type
use mesh_collection_mod, only : mesh_collection
- use namelist_mod, only : namelist_type
use create_tl_prognostics_mod, only : create_tl_prognostics
implicit none
@@ -79,11 +78,6 @@ subroutine initialise( program_name, modeldb )
type( mesh_type ), pointer :: aerosol_mesh
type( mesh_type ), pointer :: aerosol_twod_mesh
- type( namelist_type ), pointer :: base_mesh_nml
- type( namelist_type ), pointer :: multires_coupling_nml
- type( namelist_type ), pointer :: initialization_nml
- type( namelist_type ), pointer :: io_nml
-
character( len=str_def ) :: prime_mesh_name
character( len=str_def ) :: aerosol_mesh_name
logical( kind=l_def ) :: coarse_aerosol_ancil
@@ -101,7 +95,6 @@ subroutine initialise( program_name, modeldb )
real(r_def), allocatable :: real_array(:)
nullify( mesh, twod_mesh, aerosol_mesh, aerosol_twod_mesh, depository )
- nullify( base_mesh_nml, multires_coupling_nml, initialization_nml )
depository => modeldb%fields%get_field_collection("depository")
fd_fields => modeldb%fields%get_field_collection("fd_fields")
@@ -129,26 +122,21 @@ subroutine initialise( program_name, modeldb )
call modeldb%values%add_key_value('model_axes', model_axes)
! Get primary and 2D meshes for initialising model data
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
+
mesh => mesh_collection%get_mesh(prime_mesh_name)
twod_mesh => mesh_collection%get_mesh(mesh, TWOD)
! Get initialization configuration
- initialization_nml => modeldb%configuration%get_namelist('initialization')
- call initialization_nml%get_value( 'coarse_aerosol_ancil', &
- coarse_aerosol_ancil )
- call initialization_nml%get_value( 'coarse_ozone_ancil', &
- coarse_ozone_ancil )
- call initialization_nml%get_value( 'init_option', init_option )
+ coarse_aerosol_ancil = modeldb%config%initialization%coarse_aerosol_ancil()
+ coarse_ozone_ancil = modeldb%config%initialization%coarse_ozone_ancil()
+ init_option = modeldb%config%initialization%init_option()
! If aerosol data is on a different mesh, get this
if (coarse_aerosol_ancil .or. coarse_ozone_ancil) then
! For now use the coarsest mesh
- multires_coupling_nml => &
- modeldb%configuration%get_namelist('multires_coupling')
- call multires_coupling_nml%get_value( 'aerosol_mesh_name', &
- aerosol_mesh_name )
+ aerosol_mesh_name = modeldb%config%multires_coupling%aerosol_mesh_name()
+
aerosol_mesh => mesh_collection%get_mesh(aerosol_mesh_name)
aerosol_twod_mesh => mesh_collection%get_mesh(aerosol_mesh, TWOD)
write( log_scratch_space,'(A,A)' ) "aerosol mesh name:", aerosol_mesh%get_mesh_name()
@@ -196,8 +184,7 @@ subroutine initialise( program_name, modeldb )
modeldb )
! Get io configuration
- io_nml => modeldb%configuration%get_namelist('io')
- call io_nml%get_value( 'nodal_output_on_w3', nodal_output_on_w3 )
+ nodal_output_on_w3 = modeldb%config%io%nodal_output_on_w3()
! Initial output
call write_initial_output( modeldb, mesh, twod_mesh, &
@@ -227,16 +214,14 @@ subroutine step( modeldb )
type( gungho_time_axes_type ), pointer :: model_axes
type( mesh_type ), pointer :: mesh
type( mesh_type ), pointer :: twod_mesh
- type( namelist_type ), pointer :: base_mesh_nml
- type( namelist_type ), pointer :: initialization_nml
- type( namelist_type ), pointer :: io_nml
+
character( len=str_def ) :: prime_mesh_name
integer( kind=i_def ) :: ls_option
logical( kind=l_def ) :: write_diag
integer( kind=i_medium ) :: diagnostic_frequency
logical( kind=l_def ) :: nodal_output_on_w3
- nullify(mesh, twod_mesh, base_mesh_nml, initialization_nml, io_nml)
+ nullify(mesh, twod_mesh)
nullify(moisture_fields, ls_mr_array, ls_moist_dyn_array)
! Get model_axes out of modeldb
@@ -248,10 +233,7 @@ subroutine step( modeldb )
ls_fields => modeldb%fields%get_field_collection("ls_fields")
- ! Get initialization configuration
- initialization_nml => modeldb%configuration%get_namelist('initialization')
- call initialization_nml%get_value( 'ls_option', ls_option )
-
+ ls_option = modeldb%config%initialization%ls_option()
if ( ls_option == ls_option_file ) then
call update_ls_file_alg( model_axes%ls_times_list, &
modeldb%clock, &
@@ -261,19 +243,16 @@ subroutine step( modeldb )
end if
! Get Mesh
- base_mesh_nml => modeldb%configuration%get_namelist('base_mesh')
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
+ prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
mesh => mesh_collection%get_mesh(prime_mesh_name)
twod_mesh => mesh_collection%get_mesh(mesh, TWOD)
call linear_step( mesh, twod_mesh, &
modeldb, modeldb%clock )
- ! Get io configuration
- io_nml => modeldb%configuration%get_namelist('io')
- call io_nml%get_value( 'diagnostic_frequency', diagnostic_frequency )
- call io_nml%get_value( 'write_diag', write_diag )
- call io_nml%get_value( 'nodal_output_on_w3', nodal_output_on_w3 )
+ diagnostic_frequency = modeldb%config%io%diagnostic_frequency()
+ write_diag = modeldb%config%io%write_diag()
+ nodal_output_on_w3 = modeldb%config%io%nodal_output_on_w3()
if ( ( mod(modeldb%clock%get_step(), diagnostic_frequency) == 0 ) &
.and. ( write_diag ) ) then
From 577447858067be0774c63297b82fdb06f337019c Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Mon, 12 Jan 2026 07:25:01 +0000
Subject: [PATCH 03/17] Add some kinds
---
applications/lfric_atm/source/lfric_atm.f90 | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/applications/lfric_atm/source/lfric_atm.f90 b/applications/lfric_atm/source/lfric_atm.f90
index e6b39ad23..757f207b9 100644
--- a/applications/lfric_atm/source/lfric_atm.f90
+++ b/applications/lfric_atm/source/lfric_atm.f90
@@ -17,6 +17,7 @@
program lfric_atm
use cli_mod, only: parse_command_line
+ use constants_mod, only: l_def
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
use driver_config_mod, only: init_config, final_config
@@ -29,7 +30,8 @@ program lfric_atm
use gungho_driver_mod, only: initialise, step, finalise
use lfric_mpi_mod, only: global_mpi
- use timing_mod, only: init_timing, start_timing, stop_timing, final_timing, tik, LPROF
+ use timing_mod, only: init_timing, start_timing, &
+ stop_timing, final_timing, tik, LPROF
implicit none
@@ -39,7 +41,8 @@ program lfric_atm
character(*), parameter :: application_name = "lfric_atm"
character(:), allocatable :: filename
integer(tik) :: timing_handle_global
- logical :: lsubroutine_timers
+
+ logical(l_def) :: lsubroutine_timers
call parse_command_line( filename )
From 7867f00f179d3882f5048bb61bb97d5240ff63fe Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Mon, 12 Jan 2026 12:09:39 +0000
Subject: [PATCH 04/17] Remove configuration variables that weren't being used
---
.../source/driver/iau_multifile_io/iau_firstfile_io_mod.F90 | 5 -----
1 file changed, 5 deletions(-)
diff --git a/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90 b/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90
index dfc166e87..0dd45d4c0 100644
--- a/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90
+++ b/science/gungho/source/driver/iau_multifile_io/iau_firstfile_io_mod.F90
@@ -65,9 +65,6 @@ subroutine iau_incs_firstfile_io ( io_context_name, modeldb, &
character(str_def) :: prime_mesh_name
character(str_def) :: context_name
- character(str_max_filename) :: iau_addinf_path
- character(str_max_filename) :: iau_bcorr_path
-
logical(l_def) :: use_xios_io
procedure(callback_clock_arg), pointer :: before_close
@@ -80,8 +77,6 @@ subroutine iau_incs_firstfile_io ( io_context_name, modeldb, &
time_origin = modeldb%config%time%calendar_origin()
time_start = modeldb%config%time%calendar_start()
prime_mesh_name = modeldb%config%base_mesh%prime_mesh_name()
- iau_addinf_path = modeldb%config%files%iau_addinf_path()
- iau_bcorr_path = modeldb%config%files%iau_bcorr_path()
use_xios_io = modeldb%config%io%use_xios_io()
! get filename and set up context name for this file
From 438c54da661ddd083a46896090fefd94c923a2bd Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Mon, 26 Jan 2026 11:43:27 +0000
Subject: [PATCH 05/17] Only changes that allow Apps to work with the purge of
intermediate namelist api from core
---
.../adjoint_tests/source/adjoint_tests.f90 | 8 +-
.../gravity_wave_infrastructure_mod.f90 | 10 +-
.../gravity_wave/source/gravity_wave.f90 | 7 +-
.../gungho_model/source/gungho_model.f90 | 8 +-
.../algorithm/algorithm_test.f90 | 11 +-
.../jedi-interface/jedi_geometry_mod.f90 | 7 +-
.../source/jedi-interface/jedi_run_mod.f90 | 25 +-
.../jedi_lfric_tests/source/jedi_forecast.f90 | 5 +-
.../source/jedi_forecast_pseudo.f90 | 6 +-
.../source/jedi_id_tlm_tests.f90 | 6 +-
.../source/jedi_lfric_tests.f90 | 9 +-
.../source/jedi_tlm_forecast_tl.f90 | 6 +-
.../source/jedi_tlm_tests.f90 | 5 +-
applications/jules/source/jules.f90 | 9 +-
.../lfric2lfric_infrastructure_mod.X90 | 2 +-
.../initialisation/lfric2lfric_init_mesh.f90 | 42 +-
.../lfric2lfric/source/lfric2lfric.F90 | 7 +-
applications/lfric_atm/source/lfric_atm.f90 | 6 +-
.../lfric_coupled/source/lfric_coupled.f90 | 8 +-
.../common/lfricinp_lfric_driver_mod.f90 | 20 +-
.../linear_model/source/linear_model.f90 | 7 +-
.../driver/name_transport_driver_mod.f90 | 10 +-
.../name_transport/source/name_transport.f90 | 9 +-
applications/ngarch/source/ngarch.f90 | 12 +-
.../source/driver/shallow_water_model_mod.F90 | 3 +-
.../shallow_water/source/shallow_water.f90 | 8 +-
applications/solver/source/solver.F90 | 11 +-
.../source/driver/transport_driver_mod.f90 | 2 +-
applications/transport/source/transport.f90 | 12 +-
dependencies.yaml | 4 +-
.../time/jedi_lfric_time_test.f90 | 12 +-
.../jedi_lfric_linear_modeldb_driver_mod.f90 | 6 +-
.../nl/jedi_lfric_nl_modeldb_driver_mod.f90 | 7 +-
.../source/mesh/jedi_lfric_mesh_setup_mod.F90 | 7 +-
.../integration-test/cma_test/cma_test.f90 | 14 +-
.../gungho/source/driver/gungho_model_mod.F90 | 3 +-
.../runge_kutta/runge_kutta.f90 | 7 +-
.../semi_implicit/semi_implicit.f90 | 7 +-
.../source/utils/check_config_api_mod.f90 | 393 ++++++++++++++++++
39 files changed, 665 insertions(+), 76 deletions(-)
create mode 100644 science/shared/source/utils/check_config_api_mod.f90
diff --git a/applications/adjoint_tests/source/adjoint_tests.f90 b/applications/adjoint_tests/source/adjoint_tests.f90
index 5fa5b2232..6b507c26c 100644
--- a/applications/adjoint_tests/source/adjoint_tests.f90
+++ b/applications/adjoint_tests/source/adjoint_tests.f90
@@ -10,6 +10,7 @@
program adjoint_tests
+ use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use driver_collections_mod, only : init_collections, final_collections
use driver_comm_mod, only : init_comm, final_comm
@@ -38,6 +39,7 @@ program adjoint_tests
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise('values', 5)
@@ -59,8 +61,12 @@ program adjoint_tests
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), application_name )
+
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call init_collections()
call init_time( modeldb )
deallocate( filename )
diff --git a/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90 b/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
index 46b88ddad..5ecef8fd2 100644
--- a/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
+++ b/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
@@ -197,11 +197,11 @@ subroutine initialise_infrastructure( program_name, &
apply_partition_check = .true.
end if
- call init_mesh( modeldb%configuration, &
- modeldb%mpi%get_comm_rank(), &
- modeldb%mpi%get_comm_size(), &
- base_mesh_names, &
- extrusion, stencil_depth, &
+ call init_mesh( modeldb%config, &
+ modeldb%mpi%get_comm_rank(), &
+ modeldb%mpi%get_comm_size(), &
+ base_mesh_names, &
+ extrusion, stencil_depth, &
apply_partition_check )
allocate( twod_names, source=base_mesh_names )
diff --git a/applications/gravity_wave/source/gravity_wave.f90 b/applications/gravity_wave/source/gravity_wave.f90
index e1a988dd0..1492a7b68 100644
--- a/applications/gravity_wave/source/gravity_wave.f90
+++ b/applications/gravity_wave/source/gravity_wave.f90
@@ -11,6 +11,7 @@
program gravity_wave
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_modeldb_mod, only: modeldb_type
use driver_collections_mod, only: init_collections, final_collections
@@ -35,11 +36,15 @@ program gravity_wave
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
modeldb%mpi => global_mpi
call init_comm( program_name, modeldb )
call init_config( filename, gravity_wave_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+ call check_config_api( modeldb%configuration, modeldb%config )
+
deallocate( filename )
call init_logger( modeldb%mpi%get_comm(), program_name )
diff --git a/applications/gungho_model/source/gungho_model.f90 b/applications/gungho_model/source/gungho_model.f90
index da2050f69..6d9d5bdc5 100644
--- a/applications/gungho_model/source/gungho_model.f90
+++ b/applications/gungho_model/source/gungho_model.f90
@@ -15,6 +15,7 @@
program gungho_model
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use derived_config_mod, only: l_esm_couple
use driver_collections_mod, only: init_collections, final_collections
@@ -47,6 +48,7 @@ program gungho_model
call modeldb%configuration%initialise( application_name, &
table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -70,8 +72,12 @@ program gungho_model
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), application_name )
+
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call init_timers( application_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90 b/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
index 9748e3f94..093539b9b 100644
--- a/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
+++ b/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
@@ -13,8 +13,10 @@
program algorithm_test
use add_mesh_map_mod, only: assign_mesh_maps
+ use check_config_api_mod, only: check_config_api
use configuration_mod, only: final_configuration, &
read_configuration
+ use config_mod, only: config_type
use constants_mod, only: i_def, r_def, str_def, l_def
use create_mesh_mod, only: create_extrusion, create_mesh
use test_algorithm_mod, only: test_algorithm_finalise, &
@@ -52,6 +54,7 @@ program algorithm_test
character(:), allocatable :: filename
type(namelist_collection_type), save :: configuration
+ type(config_type), save :: config
! Variables used for parsing command line arguments
integer :: length, status, nargs
@@ -145,7 +148,11 @@ program algorithm_test
! Setup configuration, mesh, and fem
call configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, configuration )
+ call config%initialise( program_name )
+ call read_configuration( filename, &
+ configuration=configuration, &
+ config=config )
+ call check_config_api( configuration, config )
call init_collections()
@@ -199,7 +206,7 @@ program algorithm_test
!-------------------------------------------------------------------------
stencil_depth = 1
apply_partition_check = .false.
- call init_mesh( configuration, &
+ call init_mesh( config, &
local_rank, total_ranks, &
base_mesh_names, extrusion, &
stencil_depth, &
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_geometry_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_geometry_mod.f90
index 4fd1b473b..5e5dc3761 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_geometry_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_geometry_mod.f90
@@ -14,6 +14,7 @@ module jedi_geometry_mod
use, intrinsic :: iso_fortran_env, only : real64
use calendar_mod, only : calendar_type
+ use config_mod, only : config_type
use constants_mod, only : i_def, l_def, str_def, &
r_second, i_timestep
use extrusion_mod, only : extrusion_type, TWOD
@@ -92,9 +93,8 @@ module jedi_geometry_mod
!> @brief Initialiser for jedi_geometry_type
!>
-subroutine initialise( self, mpi_comm, configuration )
+subroutine initialise( self, mpi_comm, configuration, config )
! Access config directly until modeldb ready
- use driver_mesh_mod, only: init_mesh
use driver_config_mod, only: init_config
use jedi_lfric_mesh_setup_mod, only: initialise_mesh
use jedi_lfric_tests_mod, only: jedi_lfric_tests_required_namelists
@@ -104,6 +104,7 @@ subroutine initialise( self, mpi_comm, configuration )
class( jedi_geometry_type ), intent(inout) :: self
integer( kind=i_def ), intent(in) :: mpi_comm
type(namelist_collection_type), intent(in) :: configuration
+ type(config_type), intent(in) :: config
! Local
type(mesh_type), pointer :: mesh
@@ -121,7 +122,7 @@ subroutine initialise( self, mpi_comm, configuration )
! Setup mesh
mpi_obj = self%get_mpi_comm()
- call initialise_mesh( self%mesh_name, configuration, mpi_obj )
+ call initialise_mesh( self%mesh_name, configuration, config, mpi_obj )
geometry_configuration => configuration%get_namelist('jedi_geometry')
! Setup the IO
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
index 8e981a2e9..cf463dc68 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
@@ -10,6 +10,8 @@
!
module jedi_run_mod
+ use check_config_api_mod, only : check_config_api
+ use config_mod, only : config_type
use constants_mod, only : i_def, l_def, str_def
use namelist_collection_mod, only : namelist_collection_type
@@ -21,6 +23,7 @@ module jedi_run_mod
private
character(str_def) :: jedi_run_name
type(namelist_collection_type) :: configuration
+ type(config_type) :: config
logical(kind=l_def) :: timers_finalised
contains
@@ -34,6 +37,9 @@ module jedi_run_mod
!> Get a pointer to the stored configuration.
procedure, public :: get_configuration
+ !> Get a pointer to the stored config
+ procedure, public :: get_config
+
!> Just finalise subroutine timing; to get useful timing statistics from failed adjoint tests
procedure, public :: finalise_timers
@@ -104,18 +110,22 @@ subroutine initialise_infrastructure( self, filename, model_communicator )
! Initialise the configuration
call self%configuration%initialise( self%jedi_run_name, table_len=10 )
+ call self%config%initialise( self%jedi_run_name )
! Initialise the model communicator to setup global_mpi
call init_internal_comm( model_communicator )
! Setup the config which is curently global
call init_config( filename, jedi_lfric_tests_required_namelists, &
- self%configuration )
+ configuration=self%configuration, &
+ config=self%config )
! Initialise the logger
call lfric_comm%set_comm_mpi_val(model_communicator)
call init_logger( lfric_comm, self%jedi_run_name )
+ call check_config_api( self%configuration, self%config )
+
! Initialise subroutine timers
call init_timers( self%jedi_run_name )
self%timers_finalised = .false.
@@ -137,6 +147,19 @@ function get_configuration(self) result(configuration)
end function get_configuration
+!> @brief Get pointer to the stored configuration
+!>
+!> @return config A pointer to the configuration
+function get_config(self) result(config)
+
+ class( jedi_run_type ), target, intent(inout) :: self
+
+ type( config_type ), pointer :: config
+
+ config => self%config
+
+end function get_config
+
!> @brief Just finalise subroutine timing; to get useful timing statistics from failed adjoint tests
!>
subroutine finalise_timers(self)
diff --git a/applications/jedi_lfric_tests/source/jedi_forecast.f90 b/applications/jedi_lfric_tests/source/jedi_forecast.f90
index 00150b30d..fcf48de84 100644
--- a/applications/jedi_lfric_tests/source/jedi_forecast.f90
+++ b/applications/jedi_lfric_tests/source/jedi_forecast.f90
@@ -20,6 +20,7 @@
program jedi_forecast
use cli_mod, only : parse_command_line
+ use config_mod, only : config_type
use constants_mod, only : PRECISION_REAL, i_def, str_def
use field_collection_mod, only : field_collection_type
use log_mod, only : log_event, log_scratch_space, &
@@ -47,6 +48,7 @@ program jedi_forecast
! Local
type( namelist_collection_type ), pointer :: configuration
+ type( config_type ), pointer :: config
character(:), allocatable :: filename
integer( i_def ) :: model_communicator
type( jedi_duration_type ) :: forecast_length
@@ -76,6 +78,7 @@ program jedi_forecast
! Get the configuration
configuration => jedi_run%get_configuration()
+ config => jedi_run%get_config()
! Get the forecast length
jedi_lfric_settings_config => configuration%get_namelist('jedi_lfric_settings')
@@ -83,7 +86,7 @@ program jedi_forecast
call forecast_length%init(forecast_length_str)
! Create geometry
- call jedi_geometry%initialise( model_communicator, configuration )
+ call jedi_geometry%initialise( model_communicator, configuration, config )
! Create state (requires the configuration file name to setup the modeldb)
call jedi_state%initialise( jedi_geometry, configuration, filename )
diff --git a/applications/jedi_lfric_tests/source/jedi_forecast_pseudo.f90 b/applications/jedi_lfric_tests/source/jedi_forecast_pseudo.f90
index cec71e9d4..eb30c92c3 100644
--- a/applications/jedi_lfric_tests/source/jedi_forecast_pseudo.f90
+++ b/applications/jedi_lfric_tests/source/jedi_forecast_pseudo.f90
@@ -20,6 +20,7 @@
program jedi_forecast_pseudo
use cli_mod, only : parse_command_line
+ use config_mod, only : config_type
use constants_mod, only : PRECISION_REAL, i_def, str_def
use field_collection_mod, only : field_collection_type
use log_mod, only : log_event, log_scratch_space, &
@@ -47,6 +48,8 @@ program jedi_forecast_pseudo
! Local
type( namelist_collection_type ), pointer :: configuration
+ type( config_type ), pointer :: config
+
character(:), allocatable :: filename
integer(i_def) :: model_communicator
type( jedi_duration_type ) :: forecast_length
@@ -75,6 +78,7 @@ program jedi_forecast_pseudo
! Get the configuration
configuration => jedi_run%get_configuration()
+ config => jedi_run%get_config()
! Get the forecast length
jedi_lfric_settings_config => configuration%get_namelist('jedi_lfric_settings')
@@ -82,7 +86,7 @@ program jedi_forecast_pseudo
call forecast_length%init(forecast_length_str)
! Create geometry
- call jedi_geometry%initialise( model_communicator, configuration )
+ call jedi_geometry%initialise( model_communicator, configuration, config )
! Create state
call jedi_state%initialise( jedi_geometry, configuration )
diff --git a/applications/jedi_lfric_tests/source/jedi_id_tlm_tests.f90 b/applications/jedi_lfric_tests/source/jedi_id_tlm_tests.f90
index ed8b0db66..adfa8a2b3 100644
--- a/applications/jedi_lfric_tests/source/jedi_id_tlm_tests.f90
+++ b/applications/jedi_lfric_tests/source/jedi_id_tlm_tests.f90
@@ -47,6 +47,7 @@
program jedi_id_tlm_tests
use cli_mod, only : parse_command_line
+ use config_mod, only : config_type
use constants_mod, only : PRECISION_REAL, i_def, str_def, r_def
use field_collection_mod, only : field_collection_type
use log_mod, only : log_event, log_scratch_space, &
@@ -81,6 +82,8 @@ program jedi_id_tlm_tests
! Local
type( namelist_collection_type ), pointer :: configuration
+ type( config_type ), pointer :: config
+
character(:), allocatable :: filename
integer( kind=i_def ) :: model_communicator
type( jedi_duration_type ) :: forecast_length
@@ -115,6 +118,7 @@ program jedi_id_tlm_tests
! Get the configuration
configuration => run%get_configuration()
+ config => run%get_config()
! Get the forecast length
jedi_lfric_settings_config => configuration%get_namelist('jedi_lfric_settings')
@@ -122,7 +126,7 @@ program jedi_id_tlm_tests
call forecast_length%init(forecast_length_str)
! Create geometry
- call geometry%initialise( model_communicator, configuration )
+ call geometry%initialise( model_communicator, configuration, config )
! Create state
call state%initialise( geometry, configuration )
diff --git a/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90 b/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
index 2937a18de..dd9a75c29 100644
--- a/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
+++ b/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
@@ -15,6 +15,7 @@
!>
program jedi_lfric_tests
+ use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use driver_collections_mod, only : init_collections, final_collections
use driver_comm_mod, only : init_comm, final_comm
@@ -43,6 +44,7 @@ program jedi_lfric_tests
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise('values', 5)
@@ -64,8 +66,13 @@ program jedi_lfric_tests
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
+
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call init_timers( application_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/jedi_lfric_tests/source/jedi_tlm_forecast_tl.f90 b/applications/jedi_lfric_tests/source/jedi_tlm_forecast_tl.f90
index b3c2aa004..728b3e04f 100644
--- a/applications/jedi_lfric_tests/source/jedi_tlm_forecast_tl.f90
+++ b/applications/jedi_lfric_tests/source/jedi_tlm_forecast_tl.f90
@@ -22,6 +22,7 @@
program jedi_tlm_forecast_tl
use cli_mod, only : parse_command_line
+ use config_mod, only : config_type
use constants_mod, only : PRECISION_REAL, i_def, str_def
use field_collection_mod, only : field_collection_type
use log_mod, only : log_event, log_scratch_space, &
@@ -53,6 +54,8 @@ program jedi_tlm_forecast_tl
! Local
type( namelist_collection_type ), pointer :: configuration
+ type( config_type ), pointer :: config
+
character(:), allocatable :: filename
integer( kind=i_def ) :: model_communicator
type( jedi_duration_type ) :: forecast_length
@@ -81,6 +84,7 @@ program jedi_tlm_forecast_tl
! Get the configuration
configuration => jedi_run%get_configuration()
+ config => jedi_run%get_config()
! Get the forecast length
jedi_lfric_settings_config => configuration%get_namelist('jedi_lfric_settings')
@@ -88,7 +92,7 @@ program jedi_tlm_forecast_tl
call forecast_length%init(forecast_length_str)
! Create geometry
- call jedi_geometry%initialise( model_communicator, configuration )
+ call jedi_geometry%initialise( model_communicator, configuration, config )
! Create state
call jedi_state%initialise( jedi_geometry, configuration )
diff --git a/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90 b/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90
index da7f0342b..bfff68a72 100644
--- a/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90
+++ b/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90
@@ -35,6 +35,7 @@
program jedi_tlm_tests
use cli_mod, only : parse_command_line
+ use config_mod, only : config_type
use constants_mod, only : PRECISION_REAL, i_def, str_def, r_def
use field_collection_mod, only : field_collection_type
use log_mod, only : log_event, log_scratch_space, &
@@ -67,6 +68,7 @@ program jedi_tlm_tests
! Local
type( namelist_collection_type ), pointer :: configuration
+ type( config_type ), pointer :: config
character(:), allocatable :: filename
integer( kind=i_def ) :: model_communicator
type( jedi_duration_type ) :: forecast_length
@@ -101,6 +103,7 @@ program jedi_tlm_tests
! Get the configuration
configuration => run%get_configuration()
+ config => run%get_config()
! Get the forecast length
jedi_lfric_settings_config => configuration%get_namelist('jedi_lfric_settings')
@@ -108,7 +111,7 @@ program jedi_tlm_tests
call forecast_length%init(forecast_length_str)
! Create geometry
- call geometry%initialise( model_communicator, configuration )
+ call geometry%initialise( model_communicator, configuration, config )
! Create state
call state%initialise( geometry, configuration )
diff --git a/applications/jules/source/jules.f90 b/applications/jules/source/jules.f90
index 5b2ca853a..e772b358d 100644
--- a/applications/jules/source/jules.f90
+++ b/applications/jules/source/jules.f90
@@ -16,6 +16,7 @@
program jules
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
@@ -44,6 +45,7 @@ program jules
call modeldb%configuration%initialise( application_name, &
table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -66,8 +68,13 @@ program jules
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
+
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call init_timers( application_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90 b/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
index 108104c11..70f23cb84 100644
--- a/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
+++ b/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
@@ -316,7 +316,7 @@ contains
! Create the required meshes
!-----------------------------------------------------------------------
stencil_depth = get_required_stencil_depth()
- call init_mesh( modeldb%configuration, &
+ call init_mesh( modeldb%config, modeldb%configuration, &
modeldb%mpi%get_comm_rank(), &
modeldb%mpi%get_comm_size(), &
mesh_names, extrusion, &
diff --git a/applications/lfric2lfric/source/initialisation/lfric2lfric_init_mesh.f90 b/applications/lfric2lfric/source/initialisation/lfric2lfric_init_mesh.f90
index f1134fce5..b2b544282 100644
--- a/applications/lfric2lfric/source/initialisation/lfric2lfric_init_mesh.f90
+++ b/applications/lfric2lfric/source/initialisation/lfric2lfric_init_mesh.f90
@@ -25,6 +25,7 @@
module lfric2lfric_init_mesh_mod
use add_mesh_map_mod, only: assign_mesh_maps
+ use config_mod, only: config_type
use constants_mod, only: i_def, l_def, str_max_filename
use check_local_mesh_mod, only: check_local_mesh
use create_mesh_mod, only: create_mesh
@@ -81,17 +82,21 @@ module lfric2lfric_init_mesh_mod
!> regridding method is 'map'.
!> (unpartitioned mesh input only)
!===============================================================================
-subroutine init_mesh( configuration, &
+subroutine init_mesh( config, configuration, &
local_rank, total_ranks, &
mesh_names, &
extrusion, &
stencil_depth, &
regrid_method )
+ use partitioning_nml_iterator_mod, only: partitioning_nml_iterator_type
+ use partitioning_nml_mod, only: partitioning_nml_type
+
implicit none
! Arguments
- type(namelist_collection_type) :: configuration
+ type(namelist_collection_type), intent(in) :: configuration
+ type(config_type), intent(in) :: config
integer(kind=i_def), intent(in) :: local_rank
integer(kind=i_def), intent(in) :: total_ranks
@@ -108,8 +113,10 @@ subroutine init_mesh( configuration, &
! Namelist variables
type(namelist_type), pointer :: lfric2lfric_nml => null()
- type(namelist_type), pointer :: src_partitioning_nml => null()
- type(namelist_type), pointer :: dst_partitioning_nml => null()
+
+ type(partitioning_nml_type), pointer :: partitioning
+ type(partitioning_nml_type), pointer :: src_partitioning_nml
+ type(partitioning_nml_type), pointer :: dst_partitioning_nml
! partitioning namelist variables
logical(l_def) :: generate_inner_halos(2)
@@ -131,23 +138,28 @@ subroutine init_mesh( configuration, &
class(panel_decomposition_type), allocatable :: decomposition_src, &
decomposition_dst
+ type(partitioning_nml_iterator_type) :: iter
!============================================================================
! Extract and check configuration variables
!============================================================================
- ! Read partitioning namelist for source and destination meshes
- src_partitioning_nml => configuration%get_namelist('partitioning', &
- 'source')
- call src_partitioning_nml%get_value( 'generate_inner_halos', &
- generate_inner_halos(src) )
+ call iter%initialise(config%partitioning)
+ do while (iter%has_next())
+
+ partitioning => iter%next()
+
+ if (trim(partitioning%get_profile_name()) == 'source') then
+ src_partitioning_nml => partitioning
+ else if (trim(partitioning%get_profile_name()) == 'destination') then
+ dst_partitioning_nml => partitioning
+ end if
+ end do
- dst_partitioning_nml => configuration%get_namelist('partitioning', &
- 'destination')
- call dst_partitioning_nml%get_value( 'generate_inner_halos', &
- generate_inner_halos(dst) )
+ generate_inner_halos(src) = src_partitioning_nml%generate_inner_halos()
+ generate_inner_halos(dst) = dst_partitioning_nml%generate_inner_halos()
! Read lfric2lfric namelist
- lfric2lfric_nml => configuration%get_namelist('lfric2lfric')
+ lfric2lfric_nml => configuration%get_namelist('lfric2lfric')
call lfric2lfric_nml%get_value( 'prepartitioned_meshes', &
prepartitioned )
@@ -231,7 +243,7 @@ subroutine init_mesh( configuration, &
! meshes are suitable for the supplied application
! configuration.
!===========================================================
- call check_local_mesh( configuration, &
+ call check_local_mesh( config, &
stencil_depth, &
mesh_names )
diff --git a/applications/lfric2lfric/source/lfric2lfric.F90 b/applications/lfric2lfric/source/lfric2lfric.F90
index c40c5cc3d..8d119094c 100644
--- a/applications/lfric2lfric/source/lfric2lfric.F90
+++ b/applications/lfric2lfric/source/lfric2lfric.F90
@@ -15,6 +15,7 @@
program lfric2lfric
use cli_mod, only: parse_command_line
+ use check_config_api_mod, only: check_config_api
use constants_mod, only: precision_real
use driver_collections_mod, only: init_collections, final_collections
use driver_config_mod, only: init_config, final_config
@@ -49,6 +50,7 @@ program lfric2lfric
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
write(log_scratch_space,'(A)') &
'Application built with '// trim(precision_real) // &
@@ -68,8 +70,11 @@ program lfric2lfric
#endif
call init_comm( program_name, modeldb )
call init_config( filename, lfric2lfric_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), program_name )
+ call check_config_api( modeldb%configuration, modeldb%config )
call init_collections()
call init_time( modeldb )
deallocate( filename )
diff --git a/applications/lfric_atm/source/lfric_atm.f90 b/applications/lfric_atm/source/lfric_atm.f90
index 8f314f64d..e20bb167f 100644
--- a/applications/lfric_atm/source/lfric_atm.f90
+++ b/applications/lfric_atm/source/lfric_atm.f90
@@ -16,6 +16,7 @@
program lfric_atm
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
@@ -49,6 +50,7 @@ program lfric_atm
call modeldb%configuration%initialise( application_name, &
table_len=10 )
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -72,8 +74,10 @@ program lfric_atm
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), application_name )
+ call check_config_api( modeldb%configuration, modeldb%config )
call init_timers( application_name )
io_nml => modeldb%configuration%get_namelist('io')
diff --git a/applications/lfric_coupled/source/lfric_coupled.f90 b/applications/lfric_coupled/source/lfric_coupled.f90
index 16b5d7375..5b050a8db 100644
--- a/applications/lfric_coupled/source/lfric_coupled.f90
+++ b/applications/lfric_coupled/source/lfric_coupled.f90
@@ -16,6 +16,7 @@
program lfric_coupled
+ use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use coupler_mod, only : set_cpl_name
use driver_collections_mod, only : init_collections, final_collections
@@ -43,7 +44,7 @@ program lfric_coupled
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
-
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise( 'values', 5 )
! Create the depository, prognostics and diagnostics field collections
@@ -67,8 +68,11 @@ program lfric_coupled
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
+ call check_config_api( modeldb%configuration, modeldb%config )
call init_collections()
call init_time( modeldb )
deallocate(filename)
diff --git a/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90 b/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
index a0630d7bf..24bd883a6 100644
--- a/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
+++ b/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
@@ -5,6 +5,7 @@
! *****************************COPYRIGHT*******************************
module lfricinp_lfric_driver_mod
+use check_config_api_mod, only: check_config_api
use constants_mod, only: i_def, r_def, l_def, r_second, str_def
use log_mod, only: log_event, log_scratch_space, &
LOG_LEVEL_INFO, LOG_LEVEL_ERROR, &
@@ -12,6 +13,7 @@ module lfricinp_lfric_driver_mod
! LFRic Modules
use add_mesh_map_mod, only: assign_mesh_maps
+use config_mod, only: config_type
use create_mesh_mod, only: create_mesh
use driver_collections_mod, only: init_collections, final_collections
use driver_mesh_mod, only: init_mesh
@@ -117,6 +119,7 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
type(namelist_collection_type), save :: configuration
+type(config_type), save :: config
type(namelist_type), pointer :: base_mesh_nml
type(namelist_type), pointer :: planet_nml
@@ -164,12 +167,17 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
call initialise_halo_comms( comm )
call configuration%initialise( program_name_arg, table_len=10 )
+call config%initialise( program_name_arg )
+
call load_configuration( lfric_nl_fname, required_lfric_namelists, &
- configuration )
+ configuration=configuration, &
+ config=config )
! Initialise logging system
call init_logger( comm, program_name )
+call check_config_api( configuration, config )
+
call init_collections()
write(log_scratch_space, '(2(A,I0))') 'total ranks = ', total_ranks, &
@@ -234,7 +242,8 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
!-------------------------------------------------------------------------
stencil_depth = 2_i_def
check_partitions = .false.
-call init_mesh( configuration, &
+
+call init_mesh( config, &
local_rank, total_ranks, &
base_mesh_names, extrusion, &
stencil_depth, check_partitions )
@@ -279,7 +288,7 @@ end subroutine lfricinp_initialise_lfric
!------------------------------------------------------------------
subroutine load_configuration( lfric_nl, required_lfric_namelists, &
- configuration )
+ configuration, config )
! Description:
! Reads lfric namelists and checks that all required namelists are present
@@ -293,6 +302,7 @@ subroutine load_configuration( lfric_nl, required_lfric_namelists, &
character(*), intent(in) :: required_lfric_namelists(:)
type(namelist_collection_type), intent(INOUT) :: configuration
+type(config_type), intent(INOUT) :: config
logical :: okay
logical, allocatable :: success_map(:)
@@ -303,7 +313,9 @@ subroutine load_configuration( lfric_nl, required_lfric_namelists, &
call log_event('Loading '//trim(program_name)//' configuration ...', &
LOG_LEVEL_ALWAYS)
-call read_configuration( lfric_nl, configuration )
+call read_configuration( lfric_nl, &
+ configuration=configuration, &
+ config=config )
okay = ensure_configuration(required_lfric_namelists, success_map)
if (.not. okay) then
diff --git a/applications/linear_model/source/linear_model.f90 b/applications/linear_model/source/linear_model.f90
index e58099d46..780c3715d 100644
--- a/applications/linear_model/source/linear_model.f90
+++ b/applications/linear_model/source/linear_model.f90
@@ -42,7 +42,7 @@ program linear_model
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( application_name, table_len=10 )
-
+ call modeldb%config%initialise( application_name )
call modeldb%values%initialise('values', 5)
! Create the depository, prognostics and diagnostics field collections
@@ -63,8 +63,11 @@ program linear_model
call init_comm( application_name, modeldb )
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), application_name )
+
call init_timers( application_name )
call init_collections()
call init_time( modeldb )
diff --git a/applications/name_transport/source/driver/name_transport_driver_mod.f90 b/applications/name_transport/source/driver/name_transport_driver_mod.f90
index 94e8365c0..061dbc5e3 100644
--- a/applications/name_transport/source/driver/name_transport_driver_mod.f90
+++ b/applications/name_transport/source/driver/name_transport_driver_mod.f90
@@ -239,11 +239,11 @@ subroutine initialise_name_transport( program_name, modeldb )
stencil_depth = get_required_stencil_depth()
apply_partition_check = .false.
- call init_mesh( modeldb%configuration, &
- modeldb%mpi%get_comm_rank(), &
- modeldb%mpi%get_comm_size(), &
- base_mesh_names, &
- extrusion, stencil_depth, &
+ call init_mesh( modeldb%config, &
+ modeldb%mpi%get_comm_rank(), &
+ modeldb%mpi%get_comm_size(), &
+ base_mesh_names, &
+ extrusion, stencil_depth, &
apply_partition_check )
call create_mesh( base_mesh_names, extrusion_2d, &
diff --git a/applications/name_transport/source/name_transport.f90 b/applications/name_transport/source/name_transport.f90
index 7f8faab1d..4420440e7 100644
--- a/applications/name_transport/source/name_transport.f90
+++ b/applications/name_transport/source/name_transport.f90
@@ -9,6 +9,7 @@
program name_transport
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use constants_mod, only: i_def, r_def
use driver_collections_mod, only: init_collections, final_collections
@@ -40,12 +41,18 @@ program name_transport
call parse_command_line( filename )
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
+
modeldb%mpi => global_mpi
call init_comm( program_name, modeldb )
call init_config( filename, name_transport_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
call init_logger( modeldb%mpi%get_comm(), program_name )
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call log_event( 'Miniapp will run with default precision set as:', &
log_level_info )
write(log_scratch_space, '(" r_def kind = ", I0)') kind(1.0_r_def)
diff --git a/applications/ngarch/source/ngarch.f90 b/applications/ngarch/source/ngarch.f90
index 919eec564..68076a9a7 100644
--- a/applications/ngarch/source/ngarch.f90
+++ b/applications/ngarch/source/ngarch.f90
@@ -8,6 +8,7 @@
!> @details Runs a GungHo model with a custom step method
program ngarch
+ use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use driver_collections_mod, only : init_collections, final_collections
use constants_mod, only : precision_real
@@ -35,6 +36,8 @@ program ngarch
call parse_command_line( filename )
call modeldb%configuration%initialise( application_name, table_len=10 )
+ call modeldb%config%initialise( application_name )
+
call modeldb%values%initialise( 'values', 5 )
! Create the field collections in modeldb
@@ -58,9 +61,12 @@ program ngarch
modeldb%mpi => global_mpi
call init_comm( application_name, modeldb )
- call init_config( filename, &
- ngarch_required_namelists, &
- modeldb%configuration )
+ call init_config( filename, &
+ ngarch_required_namelists, &
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+ call check_config_api( modeldb%configuration, modeldb%config )
+
deallocate( filename )
call init_logger( modeldb%mpi%get_comm(), application_name )
diff --git a/applications/shallow_water/source/driver/shallow_water_model_mod.F90 b/applications/shallow_water/source/driver/shallow_water_model_mod.F90
index f2706ce97..40ac6cf93 100644
--- a/applications/shallow_water/source/driver/shallow_water_model_mod.F90
+++ b/applications/shallow_water/source/driver/shallow_water_model_mod.F90
@@ -181,7 +181,8 @@ subroutine initialise_infrastructure( program_name, modeldb)
! ---------------------------------------------------------
check_partitions = .false.
stencil_depth = get_required_stencil_depth()
- call init_mesh( modeldb%configuration, &
+
+ call init_mesh( modeldb%config, &
modeldb%mpi%get_comm_rank(), &
modeldb%mpi%get_comm_size(), &
base_mesh_names, extrusion, &
diff --git a/applications/shallow_water/source/shallow_water.f90 b/applications/shallow_water/source/shallow_water.f90
index c74a664b5..b164c1b48 100644
--- a/applications/shallow_water/source/shallow_water.f90
+++ b/applications/shallow_water/source/shallow_water.f90
@@ -14,6 +14,7 @@
program shallow_water
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
@@ -45,6 +46,7 @@ program shallow_water
modeldb%mpi => global_mpi
call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
! Create the depository and prognostics field collections
call modeldb%fields%add_empty_field_collection("depository", &
@@ -59,8 +61,12 @@ program shallow_water
call init_comm( program_name, modeldb )
call init_config( filename, shallow_water_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
call init_logger( global_mpi%get_comm(), program_name )
+
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call init_timers( program_name )
call init_counters( program_name )
call init_collections()
diff --git a/applications/solver/source/solver.F90 b/applications/solver/source/solver.F90
index 9c06cb220..65d816094 100644
--- a/applications/solver/source/solver.F90
+++ b/applications/solver/source/solver.F90
@@ -12,6 +12,7 @@
program solver
use add_mesh_map_mod, only: assign_mesh_maps
+ use config_mod, only: config_type
use constants_mod, only: i_def, r_def, PRECISION_REAL, str_def
use convert_to_upper_mod, only: convert_to_upper
use cli_mod, only: parse_command_line
@@ -47,7 +48,6 @@ program solver
use namelist_mod, only: namelist_type
use sci_checksum_alg_mod, only: checksum_alg
-
!------------------------------------
! Configuration modules
!------------------------------------
@@ -60,6 +60,7 @@ program solver
character(:), allocatable :: filename
type(namelist_collection_type), SAVE :: configuration
+ type(config_type), SAVE :: config
integer(i_def) :: total_ranks, local_rank
type(lfric_comm_type) :: comm
@@ -117,9 +118,13 @@ program solver
local_rank = global_mpi%get_comm_rank()
call configuration%initialise( program_name, table_len=10 )
+ call config%initialise( program_name )
+
call init_config( filename, solver_required_namelists, &
- configuration )
+ configuration=configuration, &
+ config=config )
call init_logger( comm, program_name )
+
call init_collections()
deallocate( filename )
@@ -185,7 +190,7 @@ program solver
!-----------------------------------------------------------------------
stencil_depth = 1
check_partitions = .false.
- call init_mesh( configuration, &
+ call init_mesh( config, &
local_rank, total_ranks, &
base_mesh_names, extrusion, &
stencil_depth, check_partitions )
diff --git a/applications/transport/source/driver/transport_driver_mod.f90 b/applications/transport/source/driver/transport_driver_mod.f90
index 2f9d4361d..666c0f1c1 100644
--- a/applications/transport/source/driver/transport_driver_mod.f90
+++ b/applications/transport/source/driver/transport_driver_mod.f90
@@ -290,7 +290,7 @@ subroutine initialise_transport( program_name, modeldb )
apply_partition_check = .true.
end if
- call init_mesh( modeldb%configuration, &
+ call init_mesh( modeldb%config, &
modeldb%mpi%get_comm_rank(), &
modeldb%mpi%get_comm_size(), &
base_mesh_names, &
diff --git a/applications/transport/source/transport.f90 b/applications/transport/source/transport.f90
index a4ea8347a..b027424ee 100644
--- a/applications/transport/source/transport.f90
+++ b/applications/transport/source/transport.f90
@@ -8,6 +8,7 @@
!> run_transport() and finalise_transport().
program transport
+ use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use constants_mod, only: i_def, r_def
use driver_collections_mod, only: init_collections, final_collections
@@ -36,13 +37,20 @@ program transport
call parse_command_line( filename )
- call modeldb%configuration%initialise( program_name, table_len=10 )
modeldb%mpi => global_mpi
+
call init_comm( program_name, modeldb )
+
+ call modeldb%configuration%initialise( program_name, table_len=10 )
+ call modeldb%config%initialise( program_name )
+
call init_config( filename, transport_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), program_name )
+ call check_config_api( modeldb%configuration, modeldb%config )
+
call log_event( 'Miniapp will run with default precision set as:', &
log_level_trace )
write(log_scratch_space, '(" r_def kind = ", I0)') kind(1.0_r_def)
diff --git a/dependencies.yaml b/dependencies.yaml
index 473a2c6ee..e6df37946 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -30,8 +30,8 @@ lfric_apps:
ref:
lfric_core:
- source: git@github.com:MetOffice/lfric_core.git
- ref: 5d4d72f0e35f00e71b1757df6beadec21ece97f0
+ source: cazld000020:/data/users/ricky.wong/GitHub/lfric_core
+ ref: IntermediateApiPurge
moci:
source: git@github.com:MetOffice/moci.git
diff --git a/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90 b/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90
index 3f75a4c82..4e073568f 100644
--- a/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90
+++ b/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90
@@ -10,6 +10,8 @@
!! jedi_lfric_time_test.py.
program jedi_lfric_time_test
+ use check_config_api_mod, only : check_config_api
+ use config_mod, only : config_type
use configuration_mod, only : final_configuration, &
read_configuration
use constants_mod, only : i_def, r_def, l_def
@@ -52,6 +54,7 @@ program jedi_lfric_time_test
character(:), allocatable :: filename
type(namelist_collection_type), save :: configuration
+ type(config_type), save :: config
! Variables used for parsing command line arguments
integer(i_def) :: length, status, nargs
@@ -172,7 +175,14 @@ program jedi_lfric_time_test
! Setup configuration, and initialise tests
call configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, configuration )
+ call config%initialise( program_name )
+
+ call read_configuration( filename, &
+ configuration=configuration, &
+ config=config )
+
+ call check_config_api( configuration, config )
+
call test_jedi_interface_init()
if ( do_test_init_string_err ) then
diff --git a/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90 b/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
index c7d2bb148..0c1192351 100644
--- a/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
@@ -43,6 +43,7 @@ module jedi_lfric_linear_modeldb_driver_mod
adjoint_step, &
finalise_adjoint_model
use atl_si_timestep_alg_mod, only : atl_si_timestep_type
+ use check_config_api_mod, only : check_config_api
use constants_mod, only : r_def, l_def, str_def
use driver_config_mod, only : init_config
use driver_time_mod, only : init_time, final_time
@@ -119,6 +120,7 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
! 1. Initialise modeldb field collections, configuration and mpi.
modeldb%mpi => mpi_obj
call modeldb%configuration%initialise( modeldb_name, table_len=10 )
+ call modeldb%config%initialise( modeldb_name )
call modeldb%values%initialise('values', 5)
@@ -139,7 +141,8 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
call modeldb%io_contexts%initialise(modeldb_name, table_len=100)
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
! 2. Setup some model modeldb%values and initialise infrastructure
call modeldb%values%add_key_value( 'temperature_correction_rate', 0.0_r_def )
@@ -149,6 +152,7 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
! Initialise infrastructure
call init_time( modeldb )
call initialise_infrastructure( io_context_name, modeldb )
+ call check_config_api( modeldb%configuration, modeldb%config )
! Add a place to store time axes in modeldb
call modeldb%values%add_key_value('model_axes', model_axes)
diff --git a/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90 b/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
index 6d1405ba6..8272ed2dd 100644
--- a/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
@@ -22,6 +22,7 @@
!>
module jedi_lfric_nl_modeldb_driver_mod
+ use check_config_api_mod, only : check_config_api
use constants_mod, only : l_def
use driver_config_mod, only : init_config
use driver_time_mod, only : init_time, final_time
@@ -67,6 +68,7 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb )
! 1. Initialise modeldb field collections, configuration and mpi.
modeldb%mpi => mpi_obj
call modeldb%configuration%initialise( modeldb_name, table_len=10 )
+ call modeldb%config%initialise( modeldb_name )
call modeldb%values%initialise('values', table_len = 5)
@@ -89,7 +91,8 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb )
call modeldb%io_contexts%initialise(modeldb_name, table_len=100)
call init_config( filename, gungho_required_namelists, &
- modeldb%configuration )
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
! 3. Initialise the clock and calendar
call init_time( modeldb )
@@ -97,6 +100,8 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb )
! 4. Call the gungho driver initialise
call gh_initialise(modeldb_name, modeldb)
+ call check_config_api( modeldb%configuration, modeldb%config )
+
end subroutine initialise_modeldb
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/interfaces/jedi_lfric_interface/source/mesh/jedi_lfric_mesh_setup_mod.F90 b/interfaces/jedi_lfric_interface/source/mesh/jedi_lfric_mesh_setup_mod.F90
index 24665d5b9..6857363e6 100644
--- a/interfaces/jedi_lfric_interface/source/mesh/jedi_lfric_mesh_setup_mod.F90
+++ b/interfaces/jedi_lfric_interface/source/mesh/jedi_lfric_mesh_setup_mod.F90
@@ -10,6 +10,7 @@ module jedi_lfric_mesh_setup_mod
use add_mesh_map_mod, only: assign_mesh_maps
use base_mesh_config_mod, only: GEOMETRY_SPHERICAL, &
GEOMETRY_PLANAR
+ use config_mod, only: config_type
use constants_mod, only: str_def, i_def, l_def, r_def
use create_mesh_mod, only: create_mesh
use driver_mesh_mod, only: init_mesh
@@ -36,14 +37,16 @@ module jedi_lfric_mesh_setup_mod
!>
!> @param [out] mesh_name The name of the mesh being setup
!> @param [in] configuration The geometry configuration
+ !> @param [in] config The geometry configuration
!> @param [inout] mpi_obj The mpi communicator
!> @param [in] alt_mesh_name The name of an alternative mesh_name to setup
- subroutine initialise_mesh( mesh_name, configuration, mpi_obj, alt_mesh_name )
+ subroutine initialise_mesh( mesh_name, configuration, config, mpi_obj, alt_mesh_name )
implicit none
character(len=*), intent(out) :: mesh_name
type(namelist_collection_type), intent(in) :: configuration
+ type(config_type), intent(in) :: config
!> @todo: This should be intent in but when calling the method I get
!> a compiler failure
class(lfric_mpi_type), intent(inout) :: mpi_obj
@@ -124,7 +127,7 @@ subroutine initialise_mesh( mesh_name, configuration, mpi_obj, alt_mesh_name )
!-------------------------------------------------------------------------
stencil_depth = 2
apply_partition_check = .false.
- call init_mesh( configuration, &
+ call init_mesh( config, &
mpi_obj%get_comm_rank(), &
mpi_obj%get_comm_size(), &
base_mesh_names, &
diff --git a/science/gungho/integration-test/cma_test/cma_test.f90 b/science/gungho/integration-test/cma_test/cma_test.f90
index 2797865da..743fca508 100644
--- a/science/gungho/integration-test/cma_test/cma_test.f90
+++ b/science/gungho/integration-test/cma_test/cma_test.f90
@@ -29,6 +29,7 @@ program cma_test
test_cma_add, &
test_cma_apply_inv, &
test_cma_diag_DhMDhT
+ use config_mod, only : config_type
use constants_mod, only : i_def, r_def, i_def, l_def, &
r_solver, pi, str_def
use derived_config_mod, only : set_derived_config
@@ -65,6 +66,8 @@ program cma_test
use sci_chi_transform_mod, only : init_chi_transforms, &
final_chi_transforms
+ use check_config_api_mod, only: check_config_api
+
implicit none
! MPI communicator
@@ -125,6 +128,7 @@ program cma_test
! Namelist and configuration variables
type(namelist_collection_type), save :: configuration
+ type(config_type), save :: config
type(namelist_type), pointer :: extrusion_nml
type(namelist_type), pointer :: base_mesh_nml
@@ -232,6 +236,9 @@ program cma_test
end select
call configuration%initialise( program_name, table_len=10 )
+ call config%initialise( program_name )
+
+ call check_config_api( configuration, config )
deallocate(program_name)
deallocate(test_flag)
@@ -243,7 +250,9 @@ program cma_test
call log_event( log_scratch_space, LOG_LEVEL_INFO )
allocate( success_map(size(required_configuration)) )
- call read_configuration( filename, configuration )
+ call read_configuration( filename, &
+ configuration=configuration, &
+ config=config )
okay = ensure_configuration( required_configuration, success_map )
if (.not. okay) then
@@ -291,7 +300,8 @@ program cma_test
stencil_depth = get_required_stencil_depth()
check_partitions = .false.
- call init_mesh( configuration, &
+
+ call init_mesh( config, &
local_rank, total_ranks, &
base_mesh_names, extrusion, &
stencil_depth, check_partitions )
diff --git a/science/gungho/source/driver/gungho_model_mod.F90 b/science/gungho/source/driver/gungho_model_mod.F90
index e91f0fbd6..ee30f64fd 100644
--- a/science/gungho/source/driver/gungho_model_mod.F90
+++ b/science/gungho/source/driver/gungho_model_mod.F90
@@ -673,7 +673,8 @@ subroutine initialise_infrastructure( io_context_name, modeldb )
end if
stencil_depth = get_required_stencil_depth()
- call init_mesh( modeldb%configuration, &
+
+ call init_mesh( modeldb%config, &
modeldb%mpi%get_comm_rank(), &
modeldb%mpi%get_comm_size(), &
base_mesh_names, &
diff --git a/science/linear/integration-test/runge_kutta/runge_kutta.f90 b/science/linear/integration-test/runge_kutta/runge_kutta.f90
index f460201ac..ac4fae76d 100644
--- a/science/linear/integration-test/runge_kutta/runge_kutta.f90
+++ b/science/linear/integration-test/runge_kutta/runge_kutta.f90
@@ -146,7 +146,12 @@ program runge_kutta
end select
call modeldb%configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, modeldb%configuration )
+ call modeldb%config%initialise( program_name )
+
+ call read_configuration( filename, &
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
deallocate( filename )
call init_collections()
diff --git a/science/linear/integration-test/semi_implicit/semi_implicit.f90 b/science/linear/integration-test/semi_implicit/semi_implicit.f90
index af625729c..572475e7f 100644
--- a/science/linear/integration-test/semi_implicit/semi_implicit.f90
+++ b/science/linear/integration-test/semi_implicit/semi_implicit.f90
@@ -133,7 +133,12 @@ program semi_implicit
end select
call modeldb%configuration%initialise( program_name, table_len=10 )
- call read_configuration( filename, modeldb%configuration )
+ call modeldb%config%initialise( program_name)
+
+ call read_configuration( filename, &
+ configuration=modeldb%configuration, &
+ config=modeldb%config )
+
deallocate( filename )
call init_collections()
diff --git a/science/shared/source/utils/check_config_api_mod.f90 b/science/shared/source/utils/check_config_api_mod.f90
new file mode 100644
index 000000000..ea0c61ce3
--- /dev/null
+++ b/science/shared/source/utils/check_config_api_mod.f90
@@ -0,0 +1,393 @@
+! ADD Licence?????
+!================================================================
+! Temporary code to check new and old confiuration objects return
+! the same configuration values. This is to manage the transition
+! of the codebase from using a namelist_collection_type to a
+! config_type
+!================================================================
+module check_config_api_mod
+
+ use constants_mod, only: l_def, i_def, r_def, &
+ str_def, str_max_filename, &
+ r_second, i_medium
+ use config_mod, only: config_type
+ use log_mod, only: log_event, log_level_warning, &
+ log_level_info
+ use namelist_collection_mod, only: namelist_collection_type
+ use namelist_mod, only: namelist_type
+
+ implicit none
+
+ private
+ public :: check_config_api
+
+contains
+
+subroutine check_config_api( configuration, config )
+
+ implicit none
+
+ type(namelist_collection_type), intent(in) :: configuration
+ type(config_type), intent(in) :: config
+
+ type(namelist_type), pointer :: aerosol_nml
+ type(namelist_type), pointer :: base_mesh_nml
+ type(namelist_type), pointer :: extrusion_nml
+ type(namelist_type), pointer :: files_nml
+
+ type(namelist_type), pointer :: planet_nml
+ type(namelist_type), pointer :: io_nml
+ type(namelist_type), pointer :: timestepping_nml
+ type(namelist_type), pointer :: time_nml
+ type(namelist_type), pointer :: mixed_solver_nml
+ type(namelist_type), pointer :: microphysics_nml
+ type(namelist_type), pointer :: multires_coupling_nml
+ type(namelist_type), pointer :: multigrid_nml
+ type(namelist_type), pointer :: formulation_nml
+ type(namelist_type), pointer :: initialization_nml
+ type(namelist_type), pointer :: boundaries_nml
+ type(namelist_type), pointer :: finite_element_nml
+
+! initial_temperature, bvf_square r_def
+! gravity_wave_constants b_space i_def
+ character(str_max_filename) :: start_dump_filename
+ character(str_max_filename) :: checkpoint_stem_name
+! lfric2lfric regrid_method i_def
+ character(str_def) :: prime_mesh_name
+ character(str_def) :: aerosol_mesh_name
+ character(str_def) :: orography_mesh_name
+ character(str_def) :: time_origin
+ character(str_def) :: time_start
+ character(str_max_filename) :: file_prefix
+
+ logical(l_def) :: prepartitioned
+ integer(i_def) :: geometry
+ integer(i_def) :: moisture_formulation
+ integer(i_def) :: lbc_option
+ integer(i_def) :: ls_option
+ integer(i_def) :: init_option
+ integer(i_def) :: lbc_eos_height
+ integer(i_def) :: model_eos_height
+
+ real(r_def) :: tau_r
+ real(r_def) :: atol
+ real(r_def) :: domain_height
+ real(r_def) :: planet_radius
+ real(r_def) :: scaled_radius
+ real(r_second) :: dt
+ integer(i_def) :: method
+ integer(i_def) :: nlayers
+ integer(i_def) :: element_order_h
+ integer(i_def) :: element_order_v
+ integer(i_medium) :: diag_freq
+ logical(l_def) :: nodal
+ logical(l_def) :: write_diag
+ logical(l_def) :: use_xios_io
+ logical(l_def) :: l_multigrid
+ logical(l_def) :: use_multires_coupling
+ logical(l_def) :: subroutine_timers
+ logical(l_def) :: ozone_ancil
+ logical(l_def) :: aero_ancil
+ logical(l_def) :: murk_lbc
+ logical(l_def) :: microphysics_casim
+ logical(l_def) :: read_w2h_wind
+
+! character(str_def), allocatable :: chain_mesh_tags(:)
+! character(str_def), allocatable :: multires_coupling_mesh_tags(:)
+
+ character(*), parameter :: message = 'Difference in config objects '
+
+ call log_event('Validating Config/Configuration object data.', &
+ log_level_info)
+
+ if (configuration%namelist_exists('base_mesh')) then
+ base_mesh_nml => configuration%get_namelist('base_mesh')
+
+ call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
+ call base_mesh_nml%get_value( 'file_prefix', file_prefix )
+ call base_mesh_nml%get_value( 'geometry', geometry )
+ call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
+
+ if (prime_mesh_name /= config%base_mesh%prime_mesh_name()) then
+ call log_event(message//'prime_mesh_name', log_level_warning)
+ end if
+
+ if (file_prefix /= config%base_mesh%file_prefix()) then
+ call log_event(message//'file_prefix', log_level_warning)
+ end if
+
+ if (geometry /= config%base_mesh%geometry()) then
+ call log_event(message//'geometry', log_level_warning)
+ end if
+
+ if (prepartitioned .neqv. config%base_mesh%prepartitioned()) then
+ call log_event(message//'prepartitioned', log_level_warning)
+ end if
+ end if
+
+ if (configuration%namelist_exists('extrusion')) then
+ extrusion_nml => configuration%get_namelist('extrusion')
+
+ call extrusion_nml%get_value( 'method', method )
+ call extrusion_nml%get_value( 'planet_radius', planet_radius )
+ call extrusion_nml%get_value( 'domain_height', domain_height )
+ call extrusion_nml%get_value( 'number_of_layers', nlayers )
+
+ if (method /= config%extrusion%method()) then
+ call log_event(message//'method', log_level_warning)
+ end if
+
+ if (planet_radius /= config%extrusion%planet_radius()) then
+ call log_event(message//'planet_radius', log_level_warning)
+ end if
+
+ if (domain_height /= config%extrusion%domain_height()) then
+ call log_event(message//'domain_height', log_level_warning)
+ end if
+
+ if (nlayers /= config%extrusion%number_of_layers()) then
+ call log_event(message//'number_of_layers', log_level_warning)
+ end if
+ end if
+
+ if (configuration%namelist_exists('io')) then
+ io_nml => configuration%get_namelist('io')
+
+ call io_nml%get_value( 'nodal_output_on_w3', nodal )
+ call io_nml%get_value( 'write_diag', write_diag )
+ call io_nml%get_value( 'use_xios_io', use_xios_io )
+ call io_nml%get_value( 'subroutine_timers', subroutine_timers )
+ call io_nml%get_value( 'diagnostic_frequency', diag_freq )
+
+ if (diag_freq /= config%io%diagnostic_frequency()) then
+ call log_event(message//'diagnostic_frequency', log_level_warning)
+ end if
+
+ if (nodal .neqv. config%io%nodal_output_on_w3()) then
+ call log_event(message//'nodal_output_on_w3', log_level_warning)
+ end if
+
+ if (write_diag .neqv. config%io%write_diag()) then
+ call log_event(message//'write_diag', log_level_warning)
+ end if
+
+ if (use_xios_io .neqv. config%io%use_xios_io()) then
+ call log_event(message//'use_xios_io', log_level_warning)
+ end if
+
+ if (subroutine_timers .neqv. config%io%subroutine_timers()) then
+ call log_event(message//'subroutine_timers', log_level_warning)
+ end if
+ end if
+
+ if (configuration%namelist_exists('finite_element')) then
+ finite_element_nml => configuration%get_namelist('finite_element')
+
+ call finite_element_nml%get_value('element_order_h', element_order_h)
+ call finite_element_nml%get_value('element_order_v', element_order_v)
+
+ if (element_order_h /= config%finite_element%element_order_h()) then
+ call log_event( message//'element_order_h', log_level_warning )
+ end if
+
+ if (element_order_v /= config%finite_element%element_order_v()) then
+ call log_event( message//'element_order_v', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('formulation')) then
+ formulation_nml => configuration%get_namelist('formulation')
+
+ call formulation_nml%get_value('l_multigrid', l_multigrid)
+ call formulation_nml%get_value('moisture_formulation', moisture_formulation)
+ call formulation_nml%get_value('use_multires_coupling', use_multires_coupling)
+
+ if (moisture_formulation /= config%formulation%moisture_formulation()) then
+ call log_event( message//'moisture_formulation', log_level_warning )
+ end if
+
+ if (l_multigrid .neqv. config%formulation%l_multigrid()) then
+ call log_event( message//'l_multigrid', log_level_warning )
+ end if
+
+ if (use_multires_coupling .neqv. config%formulation%use_multires_coupling()) then
+ call log_event( message//'use_multires_coupling', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('planet')) then
+ planet_nml => configuration%get_namelist('planet')
+
+ call planet_nml%get_value( 'scaled_radius', scaled_radius )
+
+ if (scaled_radius /= config%planet%scaled_radius()) then
+ call log_event( message//'scaled_radius', log_level_warning )
+ end if
+ end if
+
+
+ if (configuration%namelist_exists('timestepping')) then
+ timestepping_nml => configuration%get_namelist('timestepping')
+
+ call timestepping_nml%get_value( 'dt', dt )
+ call timestepping_nml%get_value( 'tau_r', tau_r )
+
+ if (dt /= config%timestepping%dt()) then
+ call log_event( message//'dt', log_level_warning )
+ end if
+
+ if (tau_r /= config%timestepping%tau_r()) then
+ call log_event( message//'tau_r', log_level_warning )
+ end if
+
+ end if
+
+
+ if (configuration%namelist_exists('mixed_solver')) then
+ mixed_solver_nml => configuration%get_namelist('mixed_solver')
+
+ call mixed_solver_nml%get_value('mixed_solver_a_tol', atol)
+
+ if (atol /= config%mixed_solver%mixed_solver_a_tol()) then
+ call log_event( message//'mixed_solver_a_tol', log_level_warning )
+ end if
+ end if
+
+
+ if (configuration%namelist_exists('initialization')) then
+ initialization_nml => configuration%get_namelist('initialization')
+
+ call initialization_nml%get_value('ls_option', ls_option)
+ call initialization_nml%get_value('lbc_option', lbc_option)
+ call initialization_nml%get_value('coarse_aerosol_ancil', aero_ancil)
+ call initialization_nml%get_value('coarse_ozone_ancil', ozone_ancil)
+ call initialization_nml%get_value('init_option', init_option)
+ call initialization_nml%get_value('model_eos_height', model_eos_height)
+ call initialization_nml%get_value('read_w2h_wind', read_w2h_wind)
+
+ if (ls_option /= config%initialization%ls_option()) then
+ call log_event( message//'ls_option', log_level_warning )
+ end if
+
+ if (lbc_option /= config%initialization%lbc_option()) then
+ call log_event( message//'lbc_option', log_level_warning )
+ end if
+
+ if (init_option /= config%initialization%init_option()) then
+ call log_event( message//'init_option', log_level_warning )
+ end if
+
+ if (aero_ancil .neqv. config%initialization%coarse_aerosol_ancil()) then
+ call log_event( message//'aerosol_ancil', log_level_warning )
+ end if
+
+ if (ozone_ancil .neqv. config%initialization%coarse_ozone_ancil()) then
+ call log_event( message//'ozone_ancil', log_level_warning )
+ end if
+
+ if (model_eos_height /= config%initialization%model_eos_height()) then
+ call log_event( message//'model_eos_height', log_level_warning )
+ end if
+
+ if (read_w2h_wind .neqv. config%initialization%read_w2h_wind()) then
+ call log_event( message//'read_w2h_wind', log_level_warning )
+ end if
+
+ end if
+
+
+ if (configuration%namelist_exists('boundaries')) then
+ boundaries_nml => configuration%get_namelist('boundaries')
+
+ call boundaries_nml%get_value('lbc_eos_height', lbc_eos_height)
+
+ if (lbc_eos_height /= config%boundaries%lbc_eos_height()) then
+ call log_event( message//'lbc_eos_height', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('multires_coupling')) then
+ multires_coupling_nml => configuration%get_namelist('multires_coupling')
+
+ call multires_coupling_nml%get_value('aerosol_mesh_name', aerosol_mesh_name)
+ call multires_coupling_nml%get_value('orography_mesh_name', orography_mesh_name)
+! call multires_coupling_nml%get_value('multires_coupling_mesh_tags', multires_coupling_mesh_tags)
+
+ if (orography_mesh_name /= config%multires_coupling%orography_mesh_name()) then
+ call log_event( message//'orography_mesh_name', log_level_warning )
+ end if
+
+!!$ if (multires_coupling_mesh_tags /= config%multires_coupling%multires_coupling_mesh_tags()) then
+!!$ call log_event( message//'multires_coupling_mesh_tags', log_level_warning )
+!!$ end if
+
+ if (aerosol_mesh_name /= config%multires_coupling%aerosol_mesh_name()) then
+ call log_event( message//'aerosol_mesh_name', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('aerosol')) then
+ aerosol_nml => configuration%get_namelist('aerosol')
+
+ call aerosol_nml%get_value('murk_lbc', murk_lbc)
+
+ if (murk_lbc .neqv. config%aerosol%murk_lbc()) then
+ call log_event( message//'murk_lbc', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('multigrid')) then
+ multigrid_nml => configuration%get_namelist('multigrid')
+
+!!$ call multigrid_nml%get_value('chain_mesh__tags', chain_mesh_tags)
+!!$ chain_mesh_tags_2 = config%multigrid%chain_mesh_tags()
+!!$ do i=1, size(chain_mesh_tags)
+!!$ if (chain_mesh_tags /= config%multigrid%chain_mesh_tags()) then
+!!$ call log_event( message//'chain_mesh_tags', log_level_warning )
+!!$ end if
+!!$ end do
+ end if
+
+ if (configuration%namelist_exists('microphysics')) then
+ microphysics_nml => configuration%get_namelist('microphysics')
+
+ call microphysics_nml%get_value('microphysics_casim', microphysics_casim)
+
+ if (microphysics_casim .neqv. config%microphysics%microphysics_casim()) then
+ call log_event( message//'microphysics_casim', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('time')) then
+ time_nml => configuration%get_namelist('time')
+
+ call time_nml%get_value('calendar_origin', time_origin)
+ call time_nml%get_value('calendar_start', time_start)
+
+ if (time_origin /= config%time%calendar_origin()) then
+ call log_event( message//'calendar_origin', log_level_warning )
+ end if
+
+ if (time_start /= config%time%calendar_start()) then
+ call log_event( message//'calendar_start', log_level_warning )
+ end if
+ end if
+
+ if (configuration%namelist_exists('files')) then
+ files_nml => configuration%get_namelist('files')
+
+ call files_nml%get_value('start_dump_filename', start_dump_filename)
+ call files_nml%get_value('checkpoint_stem_name', checkpoint_stem_name)
+
+ if (start_dump_filename /= config%files%start_dump_filename()) then
+ call log_event( message//'start_dump_filename', log_level_warning )
+ end if
+
+ if (checkpoint_stem_name /= config%files%checkpoint_stem_name()) then
+ call log_event( message//'checkpoint_stem_name', log_level_warning )
+ end if
+ end if
+
+end subroutine check_config_api
+
+end module check_config_api_mod
From f146829b2faa992560b769de9863c15c8fc3c516 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Mon, 26 Jan 2026 12:22:23 +0000
Subject: [PATCH 06/17] Link this branch to the LFRic Core Branch
---
dependencies.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dependencies.yaml b/dependencies.yaml
index 6bf41fd78..5b56a8aba 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -31,7 +31,7 @@ lfric_apps:
lfric_core:
source: git@github.com:MetOffice/lfric_core.git
- ref: aa328242675491338ddb888d4d747b5e02d3754c
+ ref: FloatJacobian
moci:
source: git@github.com:MetOffice/moci.git
From c763d41e56775cf7e4943914a93ecae0758ec6e8 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Mon, 26 Jan 2026 14:49:37 +0000
Subject: [PATCH 07/17] Add changes to argument lists
---
.../initial_buoyancy_kernel_mod_test.pf | 2 +-
.../kernel/set_name_field_kernel_mod.F90 | 8 ++++++-
.../kernel/set_name_field_kernel_mod_test.pf | 2 +-
.../initial_swe_streamfunc_kernel_mod.F90 | 15 ++++++++----
.../kernel/initial_swe_u_kernel_mod.F90 | 22 ++++++++++-------
.../initial_vorticity_v2_kernel_mod.F90 | 14 +++++++----
.../kernel/initial_geopot_kernel_mod_test.pf | 2 +-
.../initial_swe_buoyancy_kernel_mod_test.pf | 2 +-
.../initial_swe_tracer_kernel_mod_test.pf | 2 +-
.../kernel/initial_swe_u_kernel_mod_test.pf | 2 +-
.../kernel/set_tracer_field_kernel_mod.F90 | 10 ++++++--
...ial_tracer_field_sample_kernel_mod_test.pf | 2 +-
.../set_tracer_field_kernel_mod_test.pf | 2 +-
dependencies.yaml | 4 ++--
.../adj_sci_convert_hdiv_field_kernel_mod.F90 | 11 +++++++--
.../integration-test/cma_test/cma_test.f90 | 5 ++--
.../compute_coriolis_matrix_kernel_mod.F90 | 14 +++++++----
.../compute_dl_matrix_kernel_mod.F90 | 11 ++++++---
...ompute_vert_coriolis_matrix_kernel_mod.F90 | 14 +++++++----
.../kinetic_energy_gradient_kernel_mod.F90 | 7 +++++-
.../project_eos_pressure_kernel_mod.F90 | 7 +++++-
.../project_eos_rho_kernel_mod.F90 | 10 ++++++--
.../rhs_project_eos_kernel_mod.F90 | 7 +++++-
.../vorticity_rhs_kernel_mod.F90 | 7 +++++-
.../compute_energetics_kernel_mod.f90 | 7 +++++-
.../compute_entropy_kernel_mod.F90 | 7 +++++-
.../compute_moist_mass_kernel_mod.F90 | 7 +++++-
.../compute_total_aam_kernel_mod.F90 | 9 ++++++-
.../compute_total_pv_kernel_mod.F90 | 11 +++++----
.../initial_streamfunc_kernel_mod.F90 | 15 ++++++++----
.../initialisation/initial_u_kernel_mod.F90 | 19 ++++++++++-----
.../initialisation/set_exner_kernel_mod.F90 | 10 ++++++--
.../initialisation/set_rho_kernel_mod.F90 | 9 +++++--
.../eliminated_theta_q22_kernel_mod.F90 | 8 ++++++-
.../project_eos_operators_kernel_mod.F90 | 8 ++++++-
.../solver/w2_normalisation_kernel_mod.F90 | 24 ++++++++++++-------
.../kernel/solver/weighted_m3_kernel_mod.F90 | 7 +++++-
.../common/vorticity_advection_kernel_mod.F90 | 10 ++++++--
.../w2_vorticity_advection_kernel_mod.F90 | 7 +++++-
...compute_coriolis_matrix_kernel_mod_test.pf | 2 +-
.../compute_dl_matrix_kernel_mod_test.pf | 4 ++--
...te_vert_coriolis_matrix_kernel_mod_test.pf | 2 +-
...kinetic_energy_gradient_kernel_mod_test.pf | 4 ++--
.../project_eos_pressure_kernel_mod_test.pf | 2 +-
.../project_eos_rho_kernel_mod_test.pf | 2 +-
.../rhs_project_eos_kernel_mod_test.pf | 2 +-
.../vorticity_rhs_kernel_mod_test.pf | 4 ++--
.../compute_energetics_kernel_mod_test.pf | 5 ++--
.../compute_entropy_kernel_mod_test.pf | 4 ++--
.../compute_moist_mass_kernel_mod_test.pf | 4 ++--
.../compute_total_aam_kernel_mod_test.pf | 2 +-
.../compute_total_pv_kernel_mod_test.pf | 3 ++-
.../momentum_viscosity_kernel_mod_test.pf | 4 ++--
...tracer_smagorinsky_diff_kernel_mod_test.pf | 4 ++--
.../tracer_viscosity_kernel_mod_test.pf | 4 ++--
.../deep_hot_jupiter_kernel_mod_test.pf | 4 ++--
.../earth_like_kernel_mod_test.pf | 4 ++--
.../held_suarez_kernel_mod_test.pf | 6 ++---
.../shallow_hot_jupiter_kernel_mod_test.pf | 4 ++--
.../tidally_locked_earth_kernel_mod_test.pf | 14 ++++++-----
.../hydrostatic_exner_kernel_mod_test.pf | 2 +-
.../initial_rho_sample_kernel_mod_test.pf | 2 +-
.../initial_u_kernel_mod_test.pf | 2 +-
.../initialisation/set_rho_kernel_mod_test.pf | 2 +-
.../eliminated_theta_q22_kernel_mod_test.pf | 4 ++--
.../project_eos_operators_kernel_mod_test.pf | 2 +-
.../solver/weighted_m3_kernel_mod_test.pf | 4 ++--
.../panel_edge_coords_kernel_mod_test.pf | 2 +-
.../panel_edge_weights_kernel_mod_test.pf | 2 +-
.../vorticity_advection_kernel_mod_test.pf | 4 ++--
.../w2_vorticity_advection_kernel_mod_test.pf | 4 ++--
...poly1d_advective_coeffs_kernel_mod_test.pf | 2 +-
.../mol/poly1d_flux_coeffs_kernel_mod_test.pf | 2 +-
...poly2d_advective_coeffs_kernel_mod_test.pf | 2 +-
.../mol/poly2d_flux_coeffs_kernel_mod_test.pf | 3 ++-
...ytic_orography_field_spherical_mod_test.pf | 2 +-
.../tl_kinetic_energy_gradient_kernel_mod.F90 | 7 +++++-
.../tl_project_eos_pressure_kernel_mod.F90 | 7 +++++-
.../tl_rhs_project_eos_kernel_mod.F90 | 7 +++++-
.../tl_vorticity_advection_kernel_mod.F90 | 10 ++++++--
.../initial_theta_ref_kernel_mod_test.pf | 2 +-
...kinetic_energy_gradient_kernel_mod_test.pf | 4 ++--
...tl_project_eos_pressure_kernel_mod_test.pf | 2 +-
.../tl_rhs_project_eos_kernel_mod_test.pf | 2 +-
.../tl_sample_eos_pressure_kernel_mod_test.pf | 2 +-
.../tl_vorticity_advection_kernel_mod_test.pf | 4 ++--
86 files changed, 350 insertions(+), 162 deletions(-)
diff --git a/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf b/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf
index 8a3ca705d..be9f43f92 100644
--- a/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf
+++ b/applications/gravity_wave/unit-test/kernel/initial_buoyancy_kernel_mod_test.pf
@@ -77,7 +77,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/applications/name_transport/source/kernel/set_name_field_kernel_mod.F90 b/applications/name_transport/source/kernel/set_name_field_kernel_mod.F90
index b0a58ca5c..453a1cc18 100644
--- a/applications/name_transport/source/kernel/set_name_field_kernel_mod.F90
+++ b/applications/name_transport/source/kernel/set_name_field_kernel_mod.F90
@@ -21,6 +21,10 @@ module set_name_field_kernel_mod
use kernel_mod, only : kernel_type
use log_mod, only : log_event, LOG_LEVEL_ERROR
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -143,7 +147,9 @@ subroutine set_name_field_code(nlayers, tracer, &
chi_2_e(df1) = chi_2( map_chi(df1) + k )
chi_3_e(df1) = chi_3( map_chi(df1) + k )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, &
jac, dj)
diff --git a/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf b/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf
index 7ae24e5d4..554823758 100644
--- a/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf
+++ b/applications/name_transport/unit-test/kernel/set_name_field_kernel_mod_test.pf
@@ -91,7 +91,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/applications/shallow_water/source/kernel/initial_swe_streamfunc_kernel_mod.F90 b/applications/shallow_water/source/kernel/initial_swe_streamfunc_kernel_mod.F90
index 26df19f6e..b9221ca88 100644
--- a/applications/shallow_water/source/kernel/initial_swe_streamfunc_kernel_mod.F90
+++ b/applications/shallow_water/source/kernel/initial_swe_streamfunc_kernel_mod.F90
@@ -18,8 +18,13 @@ module initial_swe_streamfunc_kernel_mod
use constants_mod, only : r_def, i_def, PI
use fs_continuity_mod, only : W1
use kernel_mod, only : kernel_type
+
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
use shallow_water_settings_config_mod, &
- only : swe_test
+ only: swe_test
implicit none
@@ -86,8 +91,6 @@ subroutine initial_swe_streamfunc_code(nlayers, rhs, chi_1, chi_2, chi_3, panel_
use analytic_swe_streamfunction_profiles_mod, &
only: analytic_swe_streamfunction
- use base_mesh_config_mod, only: geometry, &
- geometry_spherical
use sci_coordinate_jacobian_mod, only: coordinate_jacobian, &
coordinate_jacobian_inverse
use coord_transform_mod, only: sphere2cart_vector
@@ -135,7 +138,11 @@ subroutine initial_swe_streamfunc_code(nlayers, rhs, chi_1, chi_2, chi_3, panel_
chi_3_cell(df) = chi_3( map_chi(df) )
end do
- call coordinate_jacobian( ndf_chi, &
+ call coordinate_jacobian( coord_system, &
+ geometry, &
+ topology, &
+ scaled_radius, &
+ ndf_chi, &
nqp_h, &
nqp_v, &
chi_1_cell, &
diff --git a/applications/shallow_water/source/kernel/initial_swe_u_kernel_mod.F90 b/applications/shallow_water/source/kernel/initial_swe_u_kernel_mod.F90
index fbad6cef9..6d93ab3d9 100644
--- a/applications/shallow_water/source/kernel/initial_swe_u_kernel_mod.F90
+++ b/applications/shallow_water/source/kernel/initial_swe_u_kernel_mod.F90
@@ -19,13 +19,17 @@ module initial_swe_u_kernel_mod
ANY_DISCONTINUOUS_SPACE_3
use constants_mod, only : r_def, PI, i_def
use fs_continuity_mod, only : W2
- use initial_wind_config_mod, only : profile_sin_uv, &
- profile, sbr_angle_lat, sbr_angle_lon, &
- u0, v0, shear, wavelength
-
use kernel_mod, only : kernel_type
+
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+ use finite_element_config_mod, only: coord_system
+ use initial_wind_config_mod, only: profile_sin_uv, &
+ profile, sbr_angle_lat, sbr_angle_lon, &
+ u0, v0, shear, wavelength
+ use planet_config_mod, only: scaled_radius
use shallow_water_settings_config_mod, &
- only : swe_test
+ only: swe_test
implicit none
@@ -94,8 +98,6 @@ subroutine initial_swe_u_code( nlayers, rhs, &
nqp_h, nqp_v, wqp_h, wqp_v )
use analytic_swe_wind_profiles_mod, only : analytic_swe_wind
- use base_mesh_config_mod, only : geometry, &
- geometry_spherical
use sci_coordinate_jacobian_mod, only : coordinate_jacobian
use coord_transform_mod, only : sphere2cart_vector
use sci_chi_transform_mod, only : chi2llr, chi2xyz
@@ -142,7 +144,11 @@ subroutine initial_swe_u_code( nlayers, rhs, &
chi_3_cell(df) = chi_3( map_chi(df) )
end do
- call coordinate_jacobian(ndf_chi, &
+ call coordinate_jacobian( coord_system, &
+ geometry, &
+ topology, &
+ scaled_radius, &
+ ndf_chi, &
nqp_h, &
nqp_v, &
chi_1_cell, &
diff --git a/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90 b/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90
index 4cb12608c..afb4b6f1c 100644
--- a/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90
+++ b/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90
@@ -25,12 +25,12 @@ module initial_vorticity_v2_kernel_mod
use kernel_mod, only: kernel_type
use sci_coordinate_jacobian_mod, only: coordinate_jacobian, &
coordinate_jacobian_inverse
- use base_mesh_config_mod, only: geometry, &
- geometry_spherical, &
- f_lat
use rotation_vector_mod, only: rotation_vector_fplane, &
rotation_vector_sphere
- use planet_config_mod, only: scaled_omega
+
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical, f_lat
+ use planet_config_mod, only: scaled_radius, scaled_omega
implicit none
@@ -165,7 +165,11 @@ subroutine initial_vorticity_v2_code(nlayers, r_q, curl_u, geopot, &
rotation_vector)
end if
- call coordinate_jacobian(ndf_chi, &
+ call coordinate_jacobian(coord_system, &
+ geometry, &
+ topology, &
+ scaled_radius, &
+ ndf_chi, &
nqp_h, &
nqp_v, &
chi_1_e, &
diff --git a/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf
index fe44262b4..75d5fe402 100644
--- a/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_geopot_kernel_mod_test.pf
@@ -96,7 +96,7 @@ contains
swe_test = swe_test_swe_geostr_balance, &
thermal_swe = .false. )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf
index 3c69d79cb..02ca8474e 100644
--- a/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_swe_buoyancy_kernel_mod_test.pf
@@ -97,7 +97,7 @@ contains
swe_test = swe_test_swe_gaussian_hill, &
thermal_swe = .false.)
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf
index 29103cf75..2e69572db 100644
--- a/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_swe_tracer_kernel_mod_test.pf
@@ -96,7 +96,7 @@ contains
swe_test = swe_test_swe_geostr_balance, &
thermal_swe = .false. )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf b/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf
index 846105876..df091a7f8 100644
--- a/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf
+++ b/applications/shallow_water/unit-test/kernel/initial_swe_u_kernel_mod_test.pf
@@ -96,7 +96,7 @@ contains
swe_test = swe_test_swe_gaussian_hill, &
ref_gp = 10000.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/applications/transport/source/kernel/set_tracer_field_kernel_mod.F90 b/applications/transport/source/kernel/set_tracer_field_kernel_mod.F90
index 7e06eaea4..e6cd86ab4 100644
--- a/applications/transport/source/kernel/set_tracer_field_kernel_mod.F90
+++ b/applications/transport/source/kernel/set_tracer_field_kernel_mod.F90
@@ -18,10 +18,14 @@ module set_tracer_field_kernel_mod
GH_QUADRATURE_XYoZ
use fs_continuity_mod, only : Wchi
use constants_mod, only : r_def, i_def
- use idealised_config_mod, only : test
use kernel_mod, only : kernel_type
use log_mod, only : log_event, LOG_LEVEL_ERROR
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use idealised_config_mod, only: test
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -148,7 +152,9 @@ subroutine set_tracer_field_code(nlayers, tracer, &
chi_2_e(df1) = chi_2( map_chi(df1) + k )
chi_3_e(df1) = chi_3( map_chi(df1) + k )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, &
jac, dj)
diff --git a/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf b/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf
index 7fcd8dc18..851d10191 100644
--- a/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf
+++ b/applications/transport/unit-test/kernel/initial_tracer_field_sample_kernel_mod_test.pf
@@ -82,7 +82,7 @@ contains
f_lon_deg=0.0_r_def, perturb_init=.false., &
perturb_magnitude=0, perturb_seed=0 )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf b/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf
index 04e00da19..12e83028f 100644
--- a/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf
+++ b/applications/transport/unit-test/kernel/set_tracer_field_kernel_mod_test.pf
@@ -103,7 +103,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/dependencies.yaml b/dependencies.yaml
index 5b56a8aba..73e82a168 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -30,8 +30,8 @@ lfric_apps:
ref:
lfric_core:
- source: git@github.com:MetOffice/lfric_core.git
- ref: FloatJacobian
+ source: cazld000020:/data/users/ricky.wong/GitHub/lfric_core
+ ref:
moci:
source: git@github.com:MetOffice/moci.git
diff --git a/science/adjoint/source/kernel/inter_function_space/adj_sci_convert_hdiv_field_kernel_mod.F90 b/science/adjoint/source/kernel/inter_function_space/adj_sci_convert_hdiv_field_kernel_mod.F90
index 86f1ffce1..190108550 100644
--- a/science/adjoint/source/kernel/inter_function_space/adj_sci_convert_hdiv_field_kernel_mod.F90
+++ b/science/adjoint/source/kernel/inter_function_space/adj_sci_convert_hdiv_field_kernel_mod.F90
@@ -17,6 +17,10 @@ module adj_sci_convert_hdiv_field_kernel_mod
CELL_COLUMN, GH_EVALUATOR
use constants_mod, only : i_def, r_def
+use base_mesh_config_mod, only: geometry, topology
+use finite_element_config_mod, only: coord_system
+use planet_config_mod, only: scaled_radius
+
!> NOTE: Kernel requires PSyKAl lite code to invoke. Kernel metadata commented out.
!> Please see PSyclone issue #2798 for further information.
implicit none
@@ -107,6 +111,7 @@ subroutine adj_convert_hdiv_field_code(nlayers, &
map_pid)
use sci_coordinate_jacobian_mod, only : coordinate_jacobian
+
implicit none
! Arguments
@@ -154,8 +159,10 @@ subroutine adj_convert_hdiv_field_code(nlayers, &
chi3_e(df) = chi3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, ndf1, chi1_e(:), chi2_e(:), chi3_e(:), &
- ipanel, basis_chi(:,:,:), diff_basis_chi(:,:,:), jacobian(:,:,:), dj(:))
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, ndf1, chi1_e(:), chi2_e(:), chi3_e(:), &
+ ipanel, basis_chi(:,:,:), diff_basis_chi(:,:,:), &
+ jacobian(:,:,:), dj(:))
do df = ndf1, 1, -1
vector_out(3) = vector_out(3) + physical_field3(map1(df) + k)
diff --git a/science/gungho/integration-test/cma_test/cma_test.f90 b/science/gungho/integration-test/cma_test/cma_test.f90
index 2797865da..e938bf99d 100644
--- a/science/gungho/integration-test/cma_test/cma_test.f90
+++ b/science/gungho/integration-test/cma_test/cma_test.f90
@@ -29,7 +29,7 @@ program cma_test
test_cma_add, &
test_cma_apply_inv, &
test_cma_diag_DhMDhT
- use constants_mod, only : i_def, r_def, i_def, l_def, &
+ use constants_mod, only : i_def, r_def, i_def, l_def, imdi, &
r_solver, pi, str_def
use derived_config_mod, only : set_derived_config
use extrusion_mod, only : extrusion_type, &
@@ -307,7 +307,8 @@ program cma_test
alt_name=twod_names )
call assign_mesh_maps(twod_names)
- call init_chi_transforms(mesh_collection)
+ call init_chi_transforms(geometry_spherical, imdi, &
+ mesh_collection=mesh_collection)
! Work out grid spacing, which should be of order 1
mesh => mesh_collection%get_mesh(prime_mesh_name)
diff --git a/science/gungho/source/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod.F90
index 9ca14d532..408a5ac63 100644
--- a/science/gungho/source/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod.F90
@@ -27,14 +27,16 @@ module compute_coriolis_matrix_kernel_mod
GH_BASIS, GH_DIFF_BASIS, &
CELL_COLUMN, GH_QUADRATURE_XYoZ
use fs_continuity_mod, only: W2
-
use sci_coordinate_jacobian_mod, only: coordinate_jacobian
-use base_mesh_config_mod, only: geometry, &
- geometry_spherical
use rotation_vector_mod, only: rotation_vector_fplane, &
rotation_vector_sphere
use cross_product_mod, only: cross_product
+use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+use finite_element_config_mod, only: coord_system
+use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -167,8 +169,10 @@ subroutine compute_coriolis_matrix_code(cell, nlayers, ncell_3d, &
end if
! Calculate the Jacobian and its determinant
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
- chi_1_e, chi_2_e, chi_3_e, ipanel, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
+ chi_1_e, chi_2_e, chi_3_e, ipanel, &
basis_chi, diff_basis_chi, jac, dj)
diff --git a/science/gungho/source/kernel/core_dynamics/compute_dl_matrix_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/compute_dl_matrix_kernel_mod.F90
index 74064b04e..e67efa12e 100644
--- a/science/gungho/source/kernel/core_dynamics/compute_dl_matrix_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/compute_dl_matrix_kernel_mod.F90
@@ -20,15 +20,19 @@ module compute_dl_matrix_kernel_mod
GH_BASIS, GH_DIFF_BASIS, &
GH_SCALAR, GH_INTEGER, &
CELL_COLUMN, GH_QUADRATURE_XYoZ
- use base_mesh_config_mod, only: geometry, geometry_spherical
use constants_mod, only: i_def, r_def, r_second, &
PI, degrees_to_radians
use sci_chi_transform_mod, only: chi2llr
- use damping_layer_config_mod, only: dl_type, dl_type_latitude
use fs_continuity_mod, only: W2
use kernel_mod, only: kernel_type
use sci_coordinate_jacobian_mod, only: coordinate_jacobian
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+ use damping_layer_config_mod, only: dl_type, dl_type_latitude
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -189,7 +193,8 @@ subroutine compute_dl_matrix_code(cell, nlayers, ncell_3d, &
chi2_e(df) = chi2(map_chi(df) + k - 1)
chi3_e(df) = chi3(map_chi(df) + k - 1)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, basis_chi, diff_basis_chi, jac, dj)
! Only use dofs corresponding to vertical part of basis function
diff --git a/science/gungho/source/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod.F90
index dff2de0b4..71785a9b0 100644
--- a/science/gungho/source/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod.F90
@@ -28,15 +28,17 @@ module compute_vert_coriolis_matrix_kernel_mod
GH_BASIS, GH_DIFF_BASIS, &
CELL_COLUMN, GH_QUADRATURE_XYoZ
use fs_continuity_mod, only: W2, Wtheta
-
use sci_coordinate_jacobian_mod, only: coordinate_jacobian
-use base_mesh_config_mod, only: geometry, &
- geometry_spherical
use rotation_vector_mod, only: rotation_vector_fplane, &
rotation_vector_sphere, &
vert_vector_sphere
use cross_product_mod, only: cross_product
+use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+use finite_element_config_mod, only: coord_system
+use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -180,8 +182,10 @@ subroutine compute_vert_coriolis_matrix_code(col_idx, nlayers, ncell_3d, &
end if
! Calculate the Jacobian
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
- chi_1_e, chi_2_e, chi_3_e, ipanel, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
+ chi_1_e, chi_2_e, chi_3_e, ipanel, &
basis_chi, diff_basis_chi, jac, dj)
! To convert from reference space to physical space:
diff --git a/science/gungho/source/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod.F90
index a692c28b5..8022dbe03 100644
--- a/science/gungho/source/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod.F90
@@ -32,6 +32,10 @@ module kinetic_energy_gradient_kernel_mod
use fs_continuity_mod, only : W2
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -152,7 +156,8 @@ subroutine kinetic_energy_gradient_code(nlayers, &
chi_2_e(df) = chi_2( loc )
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_w2
diff --git a/science/gungho/source/kernel/core_dynamics/project_eos_pressure_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/project_eos_pressure_kernel_mod.F90
index af05571eb..ffe8eb68a 100644
--- a/science/gungho/source/kernel/core_dynamics/project_eos_pressure_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/project_eos_pressure_kernel_mod.F90
@@ -19,6 +19,10 @@ module project_eos_pressure_kernel_mod
use fs_continuity_mod, only : W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -158,7 +162,8 @@ subroutine project_eos_pressure_code(cell, nlayers,
chi2_e(df) = chi2(map_chi(df) + k)
chi3_e(df) = chi3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_w3
diff --git a/science/gungho/source/kernel/core_dynamics/project_eos_rho_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/project_eos_rho_kernel_mod.F90
index 3c34582d0..b380f84fa 100644
--- a/science/gungho/source/kernel/core_dynamics/project_eos_rho_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/project_eos_rho_kernel_mod.F90
@@ -16,10 +16,14 @@ module project_eos_rho_kernel_mod
GH_BASIS, GH_DIFF_BASIS, GH_SCALAR, &
CELL_COLUMN, GH_QUADRATURE_XYoZ
use constants_mod, only : r_def, i_def
-use idealised_config_mod, only : test
use fs_continuity_mod, only : WTHETA, W3
use kernel_mod, only : kernel_type
+use base_mesh_config_mod, only: geometry, topology
+use finite_element_config_mod, only: coord_system
+use idealised_config_mod, only: test
+use planet_config_mod, only: scaled_radius
+
implicit none
!-------------------------------------------------------------------------------
@@ -159,7 +163,9 @@ subroutine project_eos_rho_code(nlayers, &
chi3_e(df) = chi3( map_chi(df) + k )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
chi1_e, chi2_e, chi3_e, &
ipanel, chi_basis, chi_diff_basis, &
jac, dj )
diff --git a/science/gungho/source/kernel/core_dynamics/rhs_project_eos_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/rhs_project_eos_kernel_mod.F90
index c0bcd137f..108a17051 100644
--- a/science/gungho/source/kernel/core_dynamics/rhs_project_eos_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/rhs_project_eos_kernel_mod.F90
@@ -22,6 +22,10 @@ module rhs_project_eos_kernel_mod
use fs_continuity_mod, only : W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -168,7 +172,8 @@ subroutine rhs_project_eos_code(nlayers, &
chi2_e(df) = chi2(map_chi(df) + k)
chi3_e(df) = chi3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_wt
theta_vd_e(df) = theta(map_wt(df) + k) * moist_dyn_gas(map_wt(df) + k)
diff --git a/science/gungho/source/kernel/core_dynamics/vorticity_rhs_kernel_mod.F90 b/science/gungho/source/kernel/core_dynamics/vorticity_rhs_kernel_mod.F90
index d70d25f2d..ab31b0f5e 100644
--- a/science/gungho/source/kernel/core_dynamics/vorticity_rhs_kernel_mod.F90
+++ b/science/gungho/source/kernel/core_dynamics/vorticity_rhs_kernel_mod.F90
@@ -21,6 +21,10 @@ module vorticity_rhs_kernel_mod
use fs_continuity_mod, only : W1, W2
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -148,7 +152,8 @@ subroutine vorticity_rhs_code(nlayers, &
chi_2_e(df) = chi_2( loc )
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, basis_chi, diff_basis_chi, jac, dj)
do df = 1, ndf_u
u_cell(df) = u( map_u(df) + k )
diff --git a/science/gungho/source/kernel/diagnostics/compute_energetics_kernel_mod.f90 b/science/gungho/source/kernel/diagnostics/compute_energetics_kernel_mod.f90
index 121490e96..a7d49fa39 100644
--- a/science/gungho/source/kernel/diagnostics/compute_energetics_kernel_mod.f90
+++ b/science/gungho/source/kernel/diagnostics/compute_energetics_kernel_mod.f90
@@ -30,6 +30,10 @@ module compute_energetics_kernel_mod
use fs_continuity_mod, only : W2, W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -219,7 +223,8 @@ subroutine compute_energetics_code( &
chi_2_e(df) = chi_2( loc )
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_w3
diff --git a/science/gungho/source/kernel/diagnostics/compute_entropy_kernel_mod.F90 b/science/gungho/source/kernel/diagnostics/compute_entropy_kernel_mod.F90
index 478eb4676..89a92b82b 100644
--- a/science/gungho/source/kernel/diagnostics/compute_entropy_kernel_mod.F90
+++ b/science/gungho/source/kernel/diagnostics/compute_entropy_kernel_mod.F90
@@ -22,6 +22,10 @@ module compute_entropy_kernel_mod
use fs_continuity_mod, only : W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -160,7 +164,8 @@ subroutine compute_entropy_code( nlayers, &
chi_2_e(df) = chi_2( loc )
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_wtheta
diff --git a/science/gungho/source/kernel/diagnostics/compute_moist_mass_kernel_mod.F90 b/science/gungho/source/kernel/diagnostics/compute_moist_mass_kernel_mod.F90
index 57da7183a..5327c8ce1 100644
--- a/science/gungho/source/kernel/diagnostics/compute_moist_mass_kernel_mod.F90
+++ b/science/gungho/source/kernel/diagnostics/compute_moist_mass_kernel_mod.F90
@@ -21,6 +21,10 @@ module compute_moist_mass_kernel_mod
use fs_continuity_mod, only : W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -153,7 +157,8 @@ subroutine compute_moist_mass_code(
chi_3_e(df) = chi_3(l)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
! Loop through dofs, grabbing the values for this cell for reference element
diff --git a/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90 b/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90
index cca143aaa..eb37a2328 100644
--- a/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90
+++ b/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90
@@ -25,6 +25,11 @@ module compute_total_aam_kernel_mod
use fs_continuity_mod, only : W2, W3
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
+
implicit none
private
@@ -168,7 +173,9 @@ subroutine compute_total_aam_code( &
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
chi_1_e, chi_2_e, chi_3_e, ipanel, &
chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_w3
diff --git a/science/gungho/source/kernel/diagnostics/compute_total_pv_kernel_mod.F90 b/science/gungho/source/kernel/diagnostics/compute_total_pv_kernel_mod.F90
index 781ce8115..56b5c9cc8 100644
--- a/science/gungho/source/kernel/diagnostics/compute_total_pv_kernel_mod.F90
+++ b/science/gungho/source/kernel/diagnostics/compute_total_pv_kernel_mod.F90
@@ -19,13 +19,15 @@ module compute_total_pv_kernel_mod
use constants_mod, only : r_def, i_def
use fs_continuity_mod, only : W0, W1, W3
use kernel_mod, only : kernel_type
- use base_mesh_config_mod, &
- only: geometry, &
- geometry_spherical
use rotation_vector_mod, &
only: rotation_vector_fplane, &
rotation_vector_sphere
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -180,7 +182,8 @@ subroutine compute_total_pv_code(
chi2_e(df) = chi2( map_chi(df) + k )
chi3_e(df) = chi3( map_chi(df) + k )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
call coordinate_jacobian_inverse(nqp_h, nqp_v, jac, dj, jac_inv)
diff --git a/science/gungho/source/kernel/initialisation/initial_streamfunc_kernel_mod.F90 b/science/gungho/source/kernel/initialisation/initial_streamfunc_kernel_mod.F90
index c44406bd0..e6f53573f 100644
--- a/science/gungho/source/kernel/initialisation/initial_streamfunc_kernel_mod.F90
+++ b/science/gungho/source/kernel/initialisation/initial_streamfunc_kernel_mod.F90
@@ -20,6 +20,12 @@ module initial_streamfunc_kernel_mod
use kernel_mod, only : kernel_type
use initial_wind_config_mod, only : profile
+use base_mesh_config_mod, only: geometry, topology, &
+ geometry_planar, &
+ geometry_spherical
+use finite_element_config_mod, only: coord_system
+use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -108,9 +114,6 @@ subroutine initial_streamfunc_code(nlayers, &
)
use analytic_streamfunction_profiles_mod, only: analytic_streamfunction
- use base_mesh_config_mod, only: geometry, &
- geometry_planar, &
- geometry_spherical
use sci_chi_transform_mod, only: chi2llr
use sci_coordinate_jacobian_mod, only: coordinate_jacobian, &
coordinate_jacobian_inverse
@@ -169,7 +172,11 @@ subroutine initial_streamfunc_code(nlayers, &
end do
- call coordinate_jacobian(ndf_chi, &
+ call coordinate_jacobian(coord_system, &
+ geometry, &
+ topology, &
+ scaled_radius, &
+ ndf_chi, &
nqp_h, &
nqp_v, &
chi_1_cell, &
diff --git a/science/gungho/source/kernel/initialisation/initial_u_kernel_mod.F90 b/science/gungho/source/kernel/initialisation/initial_u_kernel_mod.F90
index f154a0606..ca19b15bb 100644
--- a/science/gungho/source/kernel/initialisation/initial_u_kernel_mod.F90
+++ b/science/gungho/source/kernel/initialisation/initial_u_kernel_mod.F90
@@ -20,11 +20,16 @@ module initial_u_kernel_mod
CELL_COLUMN, GH_QUADRATURE_XYoZ
use constants_mod, only : r_def, i_def, PI
use fs_continuity_mod, only : W2
- use initial_wind_config_mod, only : profile_sin_uv, &
- profile, sbr_angle_lat, sbr_angle_lon, &
- u0, v0, shear, wavelength
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical
+ use finite_element_config_mod, only: coord_system
+ use initial_wind_config_mod, only: profile_sin_uv, profile, &
+ sbr_angle_lat, sbr_angle_lon, &
+ u0, v0, shear, wavelength
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -106,8 +111,6 @@ subroutine initial_u_code(nlayers, &
)
use analytic_wind_profiles_mod, only : analytic_wind
- use base_mesh_config_mod, only : geometry, &
- geometry_spherical
use sci_chi_transform_mod, only : chi2llr
use sci_coordinate_jacobian_mod, only : coordinate_jacobian
use coord_transform_mod, only : sphere2cart_vector
@@ -175,7 +178,11 @@ subroutine initial_u_code(nlayers, &
chi_3_cell(df) = chi_3( map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, &
+ call coordinate_jacobian(coord_system, &
+ geometry, &
+ topology, &
+ scaled_radius, &
+ ndf_chi, &
nqp_h, &
nqp_v, &
chi_1_cell, &
diff --git a/science/gungho/source/kernel/initialisation/set_exner_kernel_mod.F90 b/science/gungho/source/kernel/initialisation/set_exner_kernel_mod.F90
index ebbde1980..692fda7c8 100644
--- a/science/gungho/source/kernel/initialisation/set_exner_kernel_mod.F90
+++ b/science/gungho/source/kernel/initialisation/set_exner_kernel_mod.F90
@@ -16,9 +16,13 @@ module set_exner_kernel_mod
CELL_COLUMN, GH_QUADRATURE_XYoZ
use constants_mod, only : r_def, i_def
use fs_continuity_mod, only : W3
- use idealised_config_mod, only : test
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use idealised_config_mod, only: test
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -142,7 +146,9 @@ subroutine set_exner_code(nlayers, &
chi_2_e(df1) = chi_2(map_chi(df1) + k)
chi_3_e(df1) = chi_3(map_chi(df1) + k)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, &
jac, dj)
diff --git a/science/gungho/source/kernel/initialisation/set_rho_kernel_mod.F90 b/science/gungho/source/kernel/initialisation/set_rho_kernel_mod.F90
index bc6f1bf39..90ec2182b 100644
--- a/science/gungho/source/kernel/initialisation/set_rho_kernel_mod.F90
+++ b/science/gungho/source/kernel/initialisation/set_rho_kernel_mod.F90
@@ -17,9 +17,12 @@ module set_rho_kernel_mod
CELL_COLUMN, GH_QUADRATURE_XYoZ
use fs_continuity_mod, only : Wchi
use constants_mod, only : r_def, i_def
- use idealised_config_mod, only : test
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use idealised_config_mod, only: test
+ use planet_config_mod, only: scaled_radius
implicit none
private
@@ -142,7 +145,9 @@ subroutine set_rho_code(nlayers, rho, &
chi_2_e(df1) = chi_2( map_chi(df1) + k )
chi_3_e(df1) = chi_3( map_chi(df1) + k )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, &
+ call coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, &
chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, &
jac, dj)
diff --git a/science/gungho/source/kernel/solver/eliminated_theta_q22_kernel_mod.F90 b/science/gungho/source/kernel/solver/eliminated_theta_q22_kernel_mod.F90
index acabd2c24..442002ce4 100644
--- a/science/gungho/source/kernel/solver/eliminated_theta_q22_kernel_mod.F90
+++ b/science/gungho/source/kernel/solver/eliminated_theta_q22_kernel_mod.F90
@@ -30,6 +30,10 @@ module eliminated_theta_q22_kernel_mod
use fs_continuity_mod, only: W2, Wtheta, Wchi
use kernel_mod, only: kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -176,8 +180,10 @@ subroutine eliminated_theta_q22_code(cell, nlayers, ncell_3d, &
chi3_e(df) = chi3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, basis_chi, diff_basis_chi, jac, dj)
+
q22_op(ik, :, :) = 0.0_r_solver
do qp2 = 1, nqp_v
do qp1 = 1, nqp_h
diff --git a/science/gungho/source/kernel/solver/project_eos_operators_kernel_mod.F90 b/science/gungho/source/kernel/solver/project_eos_operators_kernel_mod.F90
index e9714db8c..474f6064b 100644
--- a/science/gungho/source/kernel/solver/project_eos_operators_kernel_mod.F90
+++ b/science/gungho/source/kernel/solver/project_eos_operators_kernel_mod.F90
@@ -28,6 +28,10 @@ module project_eos_operators_kernel_mod
use fs_continuity_mod, only: W3, Wtheta
use kernel_mod, only: kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -201,7 +205,9 @@ subroutine project_eos_operators_code(cell, nlayers, &
p3theta(ik,:,:) = 0.0_r_solver
do qp2 = 1, nqp_v
do qp1 = 1, nqp_h
- call pointwise_coordinate_jacobian(ndf_chi, chi1_e, chi2_e, chi3_e, &
+ call pointwise_coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, chi1_e, chi2_e, chi3_e, &
ipanel, rsol_basis_chi(:,:,qp1,qp2), &
rsol_diff_basis_chi(:,:,qp1,qp2), &
jac, dj )
diff --git a/science/gungho/source/kernel/solver/w2_normalisation_kernel_mod.F90 b/science/gungho/source/kernel/solver/w2_normalisation_kernel_mod.F90
index 7116bbdb7..29ae1b64e 100644
--- a/science/gungho/source/kernel/solver/w2_normalisation_kernel_mod.F90
+++ b/science/gungho/source/kernel/solver/w2_normalisation_kernel_mod.F90
@@ -25,6 +25,10 @@ module w2_normalisation_kernel_mod
use fs_continuity_mod, only : W2, Wchi
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -136,15 +140,19 @@ subroutine w2_normalisation_code(nlayers, &
chi_2_cell(df) = chi_2(map_chi(df) + k)
chi_3_cell(df) = chi_3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, &
- ndf, &
- chi_1_cell, &
- chi_2_cell, &
- chi_3_cell, &
- ipanel, &
- chi_basis, &
+ call coordinate_jacobian(coord_system, &
+ geometry, &
+ topology, &
+ scaled_radius, &
+ ndf_chi, &
+ ndf, &
+ chi_1_cell, &
+ chi_2_cell, &
+ chi_3_cell, &
+ ipanel, &
+ chi_basis, &
chi_diff_basis, &
- jacobian, &
+ jacobian, &
dj)
do df = 1,ndf
JTJ = matmul(transpose(jacobian(:,:,df)),jacobian(:,:,df))
diff --git a/science/gungho/source/kernel/solver/weighted_m3_kernel_mod.F90 b/science/gungho/source/kernel/solver/weighted_m3_kernel_mod.F90
index cb8728598..8242d80db 100644
--- a/science/gungho/source/kernel/solver/weighted_m3_kernel_mod.F90
+++ b/science/gungho/source/kernel/solver/weighted_m3_kernel_mod.F90
@@ -21,6 +21,10 @@ module weighted_m3_kernel_mod
use fs_continuity_mod, only: W3
use kernel_mod, only: kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -139,7 +143,8 @@ subroutine weighted_m3_code(cell, nlayers, ncell_3d, &
chi2_e(df) = chi2(loc)
chi3_e(df) = chi3(loc)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, basis_chi, diff_basis_chi, jac, dj)
ik = 1 + k + (cell-1)*nlayers
diff --git a/science/gungho/source/kernel/transport/common/vorticity_advection_kernel_mod.F90 b/science/gungho/source/kernel/transport/common/vorticity_advection_kernel_mod.F90
index cfb37ab12..6e882ff2b 100644
--- a/science/gungho/source/kernel/transport/common/vorticity_advection_kernel_mod.F90
+++ b/science/gungho/source/kernel/transport/common/vorticity_advection_kernel_mod.F90
@@ -34,6 +34,10 @@ module vorticity_advection_kernel_mod
use fs_continuity_mod, only: W1, W2
use cross_product_mod, only: cross_product
+use base_mesh_config_mod, only: geometry, topology
+use finite_element_config_mod, only: coord_system
+use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -177,8 +181,10 @@ subroutine vorticity_advection_code(nlayers, &
vorticity_at_quad(:) = vorticity_at_quad(:) &
+ vorticity( map_w1(df) + k )*w1_basis(:,df,qp1,qp2)
end do
- call pointwise_coordinate_jacobian(ndf_chi, chi_1_e, chi_2_e, chi_3_e, &
- ipanel, chi_basis(:,:,qp1,qp2), &
+ call pointwise_coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, chi_1_e, chi_2_e, chi_3_e, &
+ ipanel, chi_basis(:,:,qp1,qp2), &
chi_diff_basis(:,:,qp1,qp2), jac, dj)
jac_inv = pointwise_coordinate_jacobian_inverse(jac, dj)
jac = matmul(jac_inv,transpose(jac_inv))
diff --git a/science/gungho/source/kernel/transport/common/w2_vorticity_advection_kernel_mod.F90 b/science/gungho/source/kernel/transport/common/w2_vorticity_advection_kernel_mod.F90
index f9bfb5db2..01d08c0d8 100644
--- a/science/gungho/source/kernel/transport/common/w2_vorticity_advection_kernel_mod.F90
+++ b/science/gungho/source/kernel/transport/common/w2_vorticity_advection_kernel_mod.F90
@@ -32,6 +32,10 @@ module w2_vorticity_advection_kernel_mod
use fs_continuity_mod, only : W2
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -152,7 +156,8 @@ subroutine w2_vorticity_advection_code(nlayers, &
chi_2_e(df) = chi_2( loc )
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
do df = 1, ndf_w2
diff --git a/science/gungho/unit-test/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod_test.pf
index 658e676fd..5f714217c 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/compute_coriolis_matrix_kernel_mod_test.pf
@@ -95,7 +95,7 @@ contains
horizontal_transport_predictor=.false., &
vector_invariant=.true.)
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/core_dynamics/compute_dl_matrix_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/compute_dl_matrix_kernel_mod_test.pf
index 348fb1efa..2b28dfd31 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/compute_dl_matrix_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/compute_dl_matrix_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module compute_dl_matrix_kernel_mod_test
- use constants_mod, only : i_def, r_def, r_second
+ use constants_mod, only : i_def, r_def, r_second, imdi
use damping_layer_config_mod, only : dl_base, dl_str, dl_type, dl_type_standard
use get_unit_test_m3x3_dofmap_mod, &
only : get_w0_m3x3_dofmap, get_w3_m3x3_dofmap
@@ -67,7 +67,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod_test.pf
index dc3e55e0d..4077a2386 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/compute_vert_coriolis_matrix_kernel_mod_test.pf
@@ -121,7 +121,7 @@ contains
scaling_factor=1.0_r_def &
)
- call init_chi_transforms()
+ call init_chi_transforms(geometry_spherical, topology_non_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod_test.pf
index aa9b4b51b..a99a9cae9 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/kinetic_energy_gradient_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module kinetic_energy_gradient_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, imdi
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w0_m3x3_q3x3x3_size, &
get_w2_m3x3_q3x3x3_size, &
@@ -92,7 +92,7 @@ contains
horizontal_transport_predictor=.false., &
vector_invariant=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/core_dynamics/project_eos_pressure_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/project_eos_pressure_kernel_mod_test.pf
index 7dbe255e1..2f78ebc87 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/project_eos_pressure_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/project_eos_pressure_kernel_mod_test.pf
@@ -89,7 +89,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic )
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/core_dynamics/project_eos_rho_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/project_eos_rho_kernel_mod_test.pf
index f08a05fd7..2edd683f7 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/project_eos_rho_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/project_eos_rho_kernel_mod_test.pf
@@ -92,7 +92,7 @@ contains
profile_data=profile_data, &
profile_heights=profile_heights )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/core_dynamics/rhs_project_eos_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/rhs_project_eos_kernel_mod_test.pf
index 47193101b..6b83c0dc1 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/rhs_project_eos_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/rhs_project_eos_kernel_mod_test.pf
@@ -92,7 +92,7 @@ contains
profile_data=profile_data, &
profile_heights=profile_heights )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/core_dynamics/vorticity_rhs_kernel_mod_test.pf b/science/gungho/unit-test/kernel/core_dynamics/vorticity_rhs_kernel_mod_test.pf
index f5751b76d..3156c5223 100644
--- a/science/gungho/unit-test/kernel/core_dynamics/vorticity_rhs_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/core_dynamics/vorticity_rhs_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module vorticity_rhs_kernel_mod_test
- use constants_mod, only: i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
use funit
implicit none
@@ -48,7 +48,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/diagnostics/compute_energetics_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diagnostics/compute_energetics_kernel_mod_test.pf
index e9e92bf81..f8b18f065 100644
--- a/science/gungho/unit-test/kernel/diagnostics/compute_energetics_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diagnostics/compute_energetics_kernel_mod_test.pf
@@ -9,7 +9,8 @@
!>
module compute_energetics_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
+
use driver_water_constants_mod, only : Lv => latent_heat_h2o_condensation, &
Lf => latent_heat_h2o_fusion
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w0_m3x3_q3x3x3_size, &
@@ -74,7 +75,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/diagnostics/compute_entropy_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diagnostics/compute_entropy_kernel_mod_test.pf
index 6e4dd39b0..14fe4aaa5 100644
--- a/science/gungho/unit-test/kernel/diagnostics/compute_entropy_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diagnostics/compute_entropy_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module compute_entropy_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, imdi
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w0_m3x3_q3x3x3_size, &
get_wtheta_m3x3_q3x3x3_size, &
get_w3_m3x3_q3x3x3_size
@@ -63,7 +63,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi, imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/diagnostics/compute_moist_mass_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diagnostics/compute_moist_mass_kernel_mod_test.pf
index 63133246b..b19858479 100644
--- a/science/gungho/unit-test/kernel/diagnostics/compute_moist_mass_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diagnostics/compute_moist_mass_kernel_mod_test.pf
@@ -7,7 +7,7 @@
!>
module compute_moist_mass_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, imdi
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w0_m3x3_q3x3x3_size, &
get_w3_m3x3_q3x3x3_size, &
get_wtheta_m3x3_q3x3x3_size
@@ -67,7 +67,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/diagnostics/compute_total_aam_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diagnostics/compute_total_aam_kernel_mod_test.pf
index 851d06ebc..2ca6692f2 100644
--- a/science/gungho/unit-test/kernel/diagnostics/compute_total_aam_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diagnostics/compute_total_aam_kernel_mod_test.pf
@@ -82,7 +82,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_spherical,topology_fully_periodic)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/diagnostics/compute_total_pv_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diagnostics/compute_total_pv_kernel_mod_test.pf
index 4eae5a9be..6c6c69042 100644
--- a/science/gungho/unit-test/kernel/diagnostics/compute_total_pv_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diagnostics/compute_total_pv_kernel_mod_test.pf
@@ -86,7 +86,8 @@ contains
rd=300.0_r_def, cp=1000.0_r_def, &
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+
+ call init_chi_transforms(geometry_spherical, topology_fully_periodic)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/diffusion/momentum_viscosity_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diffusion/momentum_viscosity_kernel_mod_test.pf
index 31f0bb9cf..8f326b335 100644
--- a/science/gungho/unit-test/kernel/diffusion/momentum_viscosity_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diffusion/momentum_viscosity_kernel_mod_test.pf
@@ -6,7 +6,7 @@
module momentum_viscosity_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, imdi
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w2_m3x3_q3x3x3_size
use get_unit_test_m3x3_dofmap_mod, only : get_w2_m3x3_dofmap, &
@@ -51,7 +51,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/diffusion/tracer_smagorinsky_diff_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diffusion/tracer_smagorinsky_diff_kernel_mod_test.pf
index 604ca9319..776ae5fb7 100644
--- a/science/gungho/unit-test/kernel/diffusion/tracer_smagorinsky_diff_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diffusion/tracer_smagorinsky_diff_kernel_mod_test.pf
@@ -6,7 +6,7 @@
module tracer_smagorinsky_diff_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, imdi
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w2_m3x3_q3x3x3_size, &
get_wtheta_m3x3_q3x3x3_size
use get_unit_test_m3x3_dofmap_mod, only : get_w2_m3x3_dofmap, &
@@ -64,7 +64,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/diffusion/tracer_viscosity_kernel_mod_test.pf b/science/gungho/unit-test/kernel/diffusion/tracer_viscosity_kernel_mod_test.pf
index 495c48dff..8e27edc62 100644
--- a/science/gungho/unit-test/kernel/diffusion/tracer_viscosity_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/diffusion/tracer_viscosity_kernel_mod_test.pf
@@ -6,7 +6,7 @@
module tracer_viscosity_kernel_mod_test
- use constants_mod, only: i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
use funit
implicit none
@@ -47,7 +47,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/external_forcing/deep_hot_jupiter_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/deep_hot_jupiter_kernel_mod_test.pf
index 00640b1af..3f914a2a0 100644
--- a/science/gungho/unit-test/kernel/external_forcing/deep_hot_jupiter_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/deep_hot_jupiter_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module deep_hot_jupiter_kernel_mod_test
- use constants_mod, only : i_def, r_def, r_second, PI
+ use constants_mod, only : i_def, r_def, r_second, PI, imdi
use coord_transform_mod, only : llr2xyz
use funit
@@ -70,7 +70,7 @@ contains
runge_kutta_method=runge_kutta_method_ssp3, &
spinup_period=0.0_r_second, spinup_alpha=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi, imdi)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf
index 17e485b6b..d95f80afd 100644
--- a/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module earth_like_kernel_mod_test
- use constants_mod, only : i_def, r_def, r_second, PI
+ use constants_mod, only : i_def, r_def, r_second, PI, imdi
use coord_transform_mod, only : llr2xyz
use funit
@@ -76,7 +76,7 @@ contains
runge_kutta_method=runge_kutta_method_ssp3, &
spinup_period=0.0_r_second, spinup_alpha=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi, imdi)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/external_forcing/held_suarez_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/held_suarez_kernel_mod_test.pf
index d1e1f11e9..18f0dc4a9 100644
--- a/science/gungho/unit-test/kernel/external_forcing/held_suarez_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/held_suarez_kernel_mod_test.pf
@@ -8,8 +8,8 @@
!>
module held_suarez_kernel_mod_test
- use constants_mod, only : i_def, r_def, r_second, PI
- use coord_transform_mod, only : llr2xyz
+ use constants_mod, only: i_def, r_def, r_second, PI, imdi
+ use coord_transform_mod, only: llr2xyz
use funit
implicit none
@@ -72,7 +72,7 @@ contains
runge_kutta_method=runge_kutta_method_ssp3, &
spinup_period=0.0_r_second, spinup_alpha=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi, imdi)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/external_forcing/shallow_hot_jupiter_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/shallow_hot_jupiter_kernel_mod_test.pf
index 854255e9c..37975fbb5 100644
--- a/science/gungho/unit-test/kernel/external_forcing/shallow_hot_jupiter_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/shallow_hot_jupiter_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module shallow_hot_jupiter_kernel_mod_test
- use constants_mod, only : i_def, r_def, r_second, PI
+ use constants_mod, only : i_def, r_def, r_second, PI, imdi
use coord_transform_mod, only : llr2xyz
use funit
@@ -71,7 +71,7 @@ contains
runge_kutta_method=runge_kutta_method_ssp3, &
spinup_period=0.0_r_second, spinup_alpha=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf
index 5971150fe..e394ad44a 100644
--- a/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf
@@ -17,11 +17,13 @@ module tidally_locked_earth_kernel_mod_test
private
public :: set_up, tear_down, test_all
- real(kind=r_def), parameter :: rd = 287.05_r_def
- real(kind=r_def), parameter :: cp = 1005.0_r_def
- real(kind=r_def), parameter :: kappa = rd/cp
- real(kind=r_def), parameter :: dlat = 1.0_r_def, dlon = 1.0_r_def, dz = 10000.0_r_def
- real(kind=r_def), parameter :: dt = 1800.0_r_def
+ real(kind=r_def), parameter :: rd = 287.05_r_def
+ real(kind=r_def), parameter :: cp = 1005.0_r_def
+ real(kind=r_def), parameter :: kappa = rd/cp
+ real(kind=r_def), parameter :: dlat = 1.0_r_def
+ real(kind=r_def), parameter :: dlon = 1.0_r_def
+ real(kind=r_def), parameter :: dz = 10000.0_r_def
+ real(kind=r_def), parameter :: dt = 1800.0_r_def
contains
@@ -70,7 +72,7 @@ contains
runge_kutta_method=runge_kutta_method_ssp3, &
spinup_period=0.0_r_second, spinup_alpha=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/initialisation/hydrostatic_exner_kernel_mod_test.pf b/science/gungho/unit-test/kernel/initialisation/hydrostatic_exner_kernel_mod_test.pf
index e91b2770c..576816e6c 100644
--- a/science/gungho/unit-test/kernel/initialisation/hydrostatic_exner_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/initialisation/hydrostatic_exner_kernel_mod_test.pf
@@ -148,7 +148,7 @@ contains
perturb_init=.false., perturb_magnitude=0, &
perturb_seed=0 )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
nlayers=3
call get_w0_m3x3_q3x3x3_size( this%ndf_w0, this%undf_w0, ncells, &
diff --git a/science/gungho/unit-test/kernel/initialisation/initial_rho_sample_kernel_mod_test.pf b/science/gungho/unit-test/kernel/initialisation/initial_rho_sample_kernel_mod_test.pf
index 4c2b182e8..4dea345c7 100644
--- a/science/gungho/unit-test/kernel/initialisation/initial_rho_sample_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/initialisation/initial_rho_sample_kernel_mod_test.pf
@@ -82,7 +82,7 @@ contains
perturb_init=.false., perturb_magnitude=0, &
perturb_seed=0 )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/initialisation/initial_u_kernel_mod_test.pf b/science/gungho/unit-test/kernel/initialisation/initial_u_kernel_mod_test.pf
index 4ff877458..6c55d4496 100644
--- a/science/gungho/unit-test/kernel/initialisation/initial_u_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/initialisation/initial_u_kernel_mod_test.pf
@@ -114,7 +114,7 @@ contains
wavelength=wavelength, &
wind_time_period=wind_time_period )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/initialisation/set_rho_kernel_mod_test.pf b/science/gungho/unit-test/kernel/initialisation/set_rho_kernel_mod_test.pf
index dac91d1a6..83fdb7aff 100644
--- a/science/gungho/unit-test/kernel/initialisation/set_rho_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/initialisation/set_rho_kernel_mod_test.pf
@@ -132,7 +132,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/solver/eliminated_theta_q22_kernel_mod_test.pf b/science/gungho/unit-test/kernel/solver/eliminated_theta_q22_kernel_mod_test.pf
index 96a0b0d16..c9ab77fb0 100644
--- a/science/gungho/unit-test/kernel/solver/eliminated_theta_q22_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/solver/eliminated_theta_q22_kernel_mod_test.pf
@@ -8,7 +8,7 @@
module eliminated_theta_q22_kernel_mod_test
use, intrinsic :: iso_fortran_env, only : real64
- use constants_mod, only : i_def, r_def, r_solver
+ use constants_mod, only : i_def, r_def, r_solver, imdi
use funit
implicit none
@@ -48,7 +48,7 @@ contains
coord_system=coord_system_xyz, &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/solver/project_eos_operators_kernel_mod_test.pf b/science/gungho/unit-test/kernel/solver/project_eos_operators_kernel_mod_test.pf
index 4537740b9..38f8a35af 100644
--- a/science/gungho/unit-test/kernel/solver/project_eos_operators_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/solver/project_eos_operators_kernel_mod_test.pf
@@ -95,7 +95,7 @@ contains
rd=rd, cp=cp, p_zero=p_zero, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/science/gungho/unit-test/kernel/solver/weighted_m3_kernel_mod_test.pf b/science/gungho/unit-test/kernel/solver/weighted_m3_kernel_mod_test.pf
index e23ec3575..7c55ee6d3 100644
--- a/science/gungho/unit-test/kernel/solver/weighted_m3_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/solver/weighted_m3_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module weighted_m3_kernel_mod_test
- use constants_mod, only: i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
use funit
implicit none
@@ -48,7 +48,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/common/panel_edge_coords_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/common/panel_edge_coords_kernel_mod_test.pf
index e85a0bc8a..a2a9f90c0 100644
--- a/science/gungho/unit-test/kernel/transport/common/panel_edge_coords_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/common/panel_edge_coords_kernel_mod_test.pf
@@ -80,7 +80,7 @@ contains
vorticity_in_w1=.false. &
)
- call init_chi_transforms()
+ call init_chi_transforms(geometry_spherical,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/common/panel_edge_weights_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/common/panel_edge_weights_kernel_mod_test.pf
index bd34c90e1..d6cbc6f16 100644
--- a/science/gungho/unit-test/kernel/transport/common/panel_edge_weights_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/common/panel_edge_weights_kernel_mod_test.pf
@@ -80,7 +80,7 @@ contains
vorticity_in_w1=.false. &
)
- call init_chi_transforms()
+ call init_chi_transforms(geometry_spherical,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/common/vorticity_advection_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/common/vorticity_advection_kernel_mod_test.pf
index fd1051185..fd905afa2 100644
--- a/science/gungho/unit-test/kernel/transport/common/vorticity_advection_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/common/vorticity_advection_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module vorticity_advection_kernel_mod_test
- use constants_mod, only: i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
use funit
implicit none
@@ -48,7 +48,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/common/w2_vorticity_advection_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/common/w2_vorticity_advection_kernel_mod_test.pf
index 071d03792..bbc16acaa 100644
--- a/science/gungho/unit-test/kernel/transport/common/w2_vorticity_advection_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/common/w2_vorticity_advection_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module w2_vorticity_advection_kernel_mod_test
- use constants_mod, only: i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
use funit
implicit none
@@ -48,7 +48,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi,imdi)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/mol/poly1d_advective_coeffs_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/mol/poly1d_advective_coeffs_kernel_mod_test.pf
index d2e8ae4ee..76abb7490 100644
--- a/science/gungho/unit-test/kernel/transport/mol/poly1d_advective_coeffs_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/mol/poly1d_advective_coeffs_kernel_mod_test.pf
@@ -52,7 +52,7 @@ contains
rehabilitate = .true., &
vorticity_in_w1 = .true. )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/mol/poly1d_flux_coeffs_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/mol/poly1d_flux_coeffs_kernel_mod_test.pf
index 26c6a3be1..e347ae2f2 100644
--- a/science/gungho/unit-test/kernel/transport/mol/poly1d_flux_coeffs_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/mol/poly1d_flux_coeffs_kernel_mod_test.pf
@@ -52,7 +52,7 @@ contains
rehabilitate = .true., &
vorticity_in_w1 = .true. )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/mol/poly2d_advective_coeffs_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/mol/poly2d_advective_coeffs_kernel_mod_test.pf
index eec36089b..d37ccb7c5 100644
--- a/science/gungho/unit-test/kernel/transport/mol/poly2d_advective_coeffs_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/mol/poly2d_advective_coeffs_kernel_mod_test.pf
@@ -52,7 +52,7 @@ contains
rehabilitate = .true., &
vorticity_in_w1 = .true. )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/kernel/transport/mol/poly2d_flux_coeffs_kernel_mod_test.pf b/science/gungho/unit-test/kernel/transport/mol/poly2d_flux_coeffs_kernel_mod_test.pf
index bc2105654..aad312e79 100644
--- a/science/gungho/unit-test/kernel/transport/mol/poly2d_flux_coeffs_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/transport/mol/poly2d_flux_coeffs_kernel_mod_test.pf
@@ -50,7 +50,8 @@ contains
element_order_v = 0, &
rehabilitate = .true., &
vorticity_in_w1 = .true. )
- call init_chi_transforms()
+
+ call init_chi_transforms(geometry_planar,topology_fully_periodic)
end subroutine setUp
diff --git a/science/gungho/unit-test/orography/analytic_orography_field_spherical_mod_test.pf b/science/gungho/unit-test/orography/analytic_orography_field_spherical_mod_test.pf
index e45d1fd81..c56647382 100644
--- a/science/gungho/unit-test/orography/analytic_orography_field_spherical_mod_test.pf
+++ b/science/gungho/unit-test/orography/analytic_orography_field_spherical_mod_test.pf
@@ -134,7 +134,7 @@ contains
lambda_focus, &
phi_focus ) )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_spherical, topology_fully_periodic)
end subroutine setUp
diff --git a/science/linear/source/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod.F90 b/science/linear/source/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod.F90
index 87b4df84b..2763b7bd1 100644
--- a/science/linear/source/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod.F90
+++ b/science/linear/source/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod.F90
@@ -24,6 +24,10 @@ module tl_kinetic_energy_gradient_kernel_mod
use fs_continuity_mod, only : W2
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -161,7 +165,8 @@ subroutine tl_kinetic_energy_gradient_code(nlayers, &
chi_2_e(df) = chi_2( loc )
chi_3_e(df) = chi_3( loc )
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi_1_e, chi_2_e, chi_3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
! Linearisation state - values at dofs
diff --git a/science/linear/source/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod.F90 b/science/linear/source/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod.F90
index d2c9c8193..fd814e936 100644
--- a/science/linear/source/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod.F90
+++ b/science/linear/source/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod.F90
@@ -19,6 +19,10 @@ module tl_project_eos_pressure_kernel_mod
use fs_continuity_mod, only : W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -171,7 +175,8 @@ subroutine tl_project_eos_pressure_code(cell, nlayers,
chi2_e(df) = chi2(map_chi(df) + k)
chi3_e(df) = chi3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
! Linearisation state
diff --git a/science/linear/source/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod.F90 b/science/linear/source/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod.F90
index ad726c204..ddb5f7313 100644
--- a/science/linear/source/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod.F90
+++ b/science/linear/source/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod.F90
@@ -30,6 +30,10 @@ module tl_rhs_project_eos_kernel_mod
use fs_continuity_mod, only : W3, Wtheta
use kernel_mod, only : kernel_type
+ use base_mesh_config_mod, only: geometry, topology
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius
+
implicit none
private
@@ -194,7 +198,8 @@ subroutine tl_rhs_project_eos_code(nlayers,
chi2_e(df) = chi2(map_chi(df) + k)
chi3_e(df) = chi3(map_chi(df) + k)
end do
- call coordinate_jacobian(ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
+ call coordinate_jacobian(coord_system, geometry, topology, scaled_radius, &
+ ndf_chi, nqp_h, nqp_v, chi1_e, chi2_e, chi3_e, &
ipanel, chi_basis, chi_diff_basis, jac, dj)
! Linearisation state
diff --git a/science/linear/source/kernel/transport/common/tl_vorticity_advection_kernel_mod.F90 b/science/linear/source/kernel/transport/common/tl_vorticity_advection_kernel_mod.F90
index a2c4c1078..009dc5998 100644
--- a/science/linear/source/kernel/transport/common/tl_vorticity_advection_kernel_mod.F90
+++ b/science/linear/source/kernel/transport/common/tl_vorticity_advection_kernel_mod.F90
@@ -23,6 +23,10 @@ module tl_vorticity_advection_kernel_mod
use fs_continuity_mod, only: W1, W2
use cross_product_mod, only: cross_product
+use base_mesh_config_mod, only: geometry, topology
+use finite_element_config_mod, only: coord_system
+use planet_config_mod, only: scaled_radius
+
implicit none
!-------------------------------------------------------------------------------
@@ -183,8 +187,10 @@ subroutine tl_vorticity_advection_code(nlayers, &
do qp1 = 1, nqp_h
! Constants
- call pointwise_coordinate_jacobian(ndf_chi, chi_1_e, chi_2_e, chi_3_e, &
- ipanel, chi_basis(:,:,qp1,qp2), &
+ call pointwise_coordinate_jacobian(coord_system, geometry, &
+ topology, scaled_radius, &
+ ndf_chi, chi_1_e, chi_2_e, chi_3_e, &
+ ipanel, chi_basis(:,:,qp1,qp2), &
chi_diff_basis(:,:,qp1,qp2), jac, dj)
jac_inv = pointwise_coordinate_jacobian_inverse(jac, dj)
jac = matmul(jac_inv,transpose(jac_inv))
diff --git a/science/linear/unit-test/kernel/core_dynamics/initial_theta_ref_kernel_mod_test.pf b/science/linear/unit-test/kernel/core_dynamics/initial_theta_ref_kernel_mod_test.pf
index c3b98a7b0..45a8e1ae3 100644
--- a/science/linear/unit-test/kernel/core_dynamics/initial_theta_ref_kernel_mod_test.pf
+++ b/science/linear/unit-test/kernel/core_dynamics/initial_theta_ref_kernel_mod_test.pf
@@ -112,7 +112,7 @@ contains
profile_data=profile_data, &
profile_heights=profile_heights )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/science/linear/unit-test/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod_test.pf b/science/linear/unit-test/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod_test.pf
index 9a44a87ab..7fbc2b3a6 100644
--- a/science/linear/unit-test/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod_test.pf
+++ b/science/linear/unit-test/kernel/core_dynamics/tl_kinetic_energy_gradient_kernel_mod_test.pf
@@ -7,7 +7,7 @@
!>@brief Test the tangent linear gradient of the kinetic energy computation
module tl_kinetic_energy_gradient_kernel_mod_test
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, imdi
use get_unit_test_m3x3_q3x3x3_sizes_mod, only : get_w0_m3x3_q3x3x3_size, &
get_w2_m3x3_q3x3x3_size, &
@@ -91,7 +91,7 @@ contains
horizontal_transport_predictor=.false., &
vector_invariant=.false.)
- call init_chi_transforms()
+ call init_chi_transforms(imdi, imdi)
end subroutine setUp
diff --git a/science/linear/unit-test/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod_test.pf b/science/linear/unit-test/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod_test.pf
index e739d0615..a34f52bc8 100644
--- a/science/linear/unit-test/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod_test.pf
+++ b/science/linear/unit-test/kernel/core_dynamics/tl_project_eos_pressure_kernel_mod_test.pf
@@ -86,7 +86,7 @@ contains
profile_heights=profile_heights )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
call feign_planet_config( gravity=10.0_r_def, &
omega=8.0E-5_r_def, &
diff --git a/science/linear/unit-test/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod_test.pf b/science/linear/unit-test/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod_test.pf
index c80f072b3..f8cae079c 100644
--- a/science/linear/unit-test/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod_test.pf
+++ b/science/linear/unit-test/kernel/core_dynamics/tl_rhs_project_eos_kernel_mod_test.pf
@@ -91,7 +91,7 @@ contains
profile_data=profile_data, &
profile_heights=profile_heights )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine setUp
diff --git a/science/linear/unit-test/kernel/core_dynamics/tl_sample_eos_pressure_kernel_mod_test.pf b/science/linear/unit-test/kernel/core_dynamics/tl_sample_eos_pressure_kernel_mod_test.pf
index e1dc1c860..9617cb413 100644
--- a/science/linear/unit-test/kernel/core_dynamics/tl_sample_eos_pressure_kernel_mod_test.pf
+++ b/science/linear/unit-test/kernel/core_dynamics/tl_sample_eos_pressure_kernel_mod_test.pf
@@ -91,7 +91,7 @@ contains
p_zero=100000.0_r_def, &
scaling_factor=1.0_r_def )
- call init_chi_transforms()
+ call init_chi_transforms(geometry_planar, topology_fully_periodic)
end subroutine set_up
diff --git a/science/linear/unit-test/kernel/transport/common/tl_vorticity_advection_kernel_mod_test.pf b/science/linear/unit-test/kernel/transport/common/tl_vorticity_advection_kernel_mod_test.pf
index 9dea4bf34..32c184999 100644
--- a/science/linear/unit-test/kernel/transport/common/tl_vorticity_advection_kernel_mod_test.pf
+++ b/science/linear/unit-test/kernel/transport/common/tl_vorticity_advection_kernel_mod_test.pf
@@ -7,7 +7,7 @@
!>@brief Test the tangent linear of the vorticity advection.
module tl_vorticity_advection_kernel_mod_test
- use constants_mod, only: i_def, r_def
+ use constants_mod, only: i_def, r_def, imdi
use funit
use finite_element_config_mod, &
@@ -134,7 +134,7 @@ contains
rehabilitate=.true., &
vorticity_in_w1=.false. )
- call init_chi_transforms()
+ call init_chi_transforms(imdi, imdi)
! Get infrastructure support data
!=====================================
From 02f3f03231fd4260dd3f6e06f613aaacbecdccc5 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Tue, 27 Jan 2026 11:25:19 +0000
Subject: [PATCH 08/17] Update patche to help adjoint build
---
.../kernel/initial_vorticity_v2_kernel_mod.F90 | 7 ++++---
...atl_kinetic_energy_gradient_kernel_mod.patch | 13 +++++++------
.../atl_project_eos_pressure_kernel_mod.patch | 17 +++++++++++------
.../kernel/atl_rhs_project_eos_kernel_mod.patch | 13 +++++++------
.../atl_vorticity_advection_kernel_mod.patch | 9 ++++++---
.../earth_like_kernel_mod_test.pf | 1 -
.../tidally_locked_earth_kernel_mod_test.pf | 2 +-
7 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90 b/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90
index afb4b6f1c..f5a5b5c26 100644
--- a/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90
+++ b/applications/shallow_water/source/kernel/initial_vorticity_v2_kernel_mod.F90
@@ -28,9 +28,10 @@ module initial_vorticity_v2_kernel_mod
use rotation_vector_mod, only: rotation_vector_fplane, &
rotation_vector_sphere
- use base_mesh_config_mod, only: geometry, topology, &
- geometry_spherical, f_lat
- use planet_config_mod, only: scaled_radius, scaled_omega
+ use base_mesh_config_mod, only: geometry, topology, &
+ geometry_spherical, f_lat
+ use finite_element_config_mod, only: coord_system
+ use planet_config_mod, only: scaled_radius, scaled_omega
implicit none
diff --git a/science/adjoint/patches/kernel/atl_kinetic_energy_gradient_kernel_mod.patch b/science/adjoint/patches/kernel/atl_kinetic_energy_gradient_kernel_mod.patch
index c82ba1b0d..78961208c 100644
--- a/science/adjoint/patches/kernel/atl_kinetic_energy_gradient_kernel_mod.patch
+++ b/science/adjoint/patches/kernel/atl_kinetic_energy_gradient_kernel_mod.patch
@@ -1,18 +1,19 @@
-@@ -1,11 +1,11 @@
+@@ -1,4 +1,4 @@
-module adj_kinetic_energy_gradient_kernel_mod
+module atl_kinetic_energy_gradient_kernel_mod
use argument_mod, only : any_discontinuous_space_3, any_space_9, arg_type, cell_column, func_type, gh_basis, gh_diff_basis, &
&gh_field, gh_inc, gh_quadrature_xyoz, gh_read, gh_real
use constants_mod, only : i_def, r_def
- use fs_continuity_mod, only : w2
- use kernel_mod, only : kernel_type
+@@ -8,7 +8,7 @@
+ use finite_element_config_mod, only : coord_system
+ use planet_config_mod, only : scaled_radius
implicit none
- type, public, extends(kernel_type) :: adj_kinetic_energy_gradient_kernel_type
+ type, public, extends(kernel_type) :: atl_kinetic_energy_gradient_kernel_type
type(ARG_TYPE) :: META_ARGS(5) = (/ &
arg_type(gh_field, gh_real, gh_read, w2), &
arg_type(gh_field, gh_real, gh_inc, w2), &
-@@ -18,15 +18,15 @@
+@@ -21,15 +21,15 @@
INTEGER :: GH_SHAPE = gh_quadrature_xyoz
INTEGER :: OPERATES_ON = cell_column
CONTAINS
@@ -32,7 +33,7 @@
&w2_basis, w2_diff_basis, ndf_chi, undf_chi, map_chi, chi_basis, chi_diff_basis, ndf_pid, undf_pid, map_pid, nqp_h, nqp_v, wqp_h, &
&wqp_v)
use sci_coordinate_jacobian_mod, only : coordinate_jacobian
-@@ -75,7 +75,6 @@
+@@ -78,7 +78,6 @@
real(kind=r_def) :: dv
real(kind=r_def), dimension(3) :: mul1
real(kind=r_def), dimension(3) :: mul2
@@ -40,7 +41,7 @@
real(kind=r_def) :: res_dot_product
integer :: idx
integer :: idx_1
-@@ -153,6 +152,6 @@
+@@ -156,6 +155,6 @@
enddo
enddo
diff --git a/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch b/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch
index b4564ee1a..2e491bbdd 100644
--- a/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch
+++ b/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch
@@ -1,19 +1,24 @@
-@@ -1,11 +1,12 @@
+--- ./applications/adjoint_tests/working/build_adjoint_tests/kernel/core_dynamics/atl_project_eos_pressure_kernel_mod.F90.orig 2026-01-27 07:11:08.000000000 +0000
++++ ./applications/adjoint_tests/working/build_adjoint_tests/kernel/core_dynamics/atl_project_eos_pressure_kernel_mod.F90 2026-01-27 07:30:11.000000000 +0000
+@@ -1,4 +1,4 @@
-module adj_project_eos_pressure_kernel_mod
+module atl_project_eos_pressure_kernel_mod
use argument_mod, only : any_discontinuous_space_3, any_space_2, arg_type, cell_column, func_type, gh_basis, gh_diff_basis, &
&gh_field, gh_operator, gh_quadrature_xyoz, gh_read, gh_readwrite, gh_real, gh_write
use constants_mod, only : i_def, r_def
- use fs_continuity_mod, only : w3, wtheta
+@@ -6,9 +6,9 @@
use kernel_mod, only : kernel_type
-+ use planet_config_mod, only : kappa, rd, p_zero
+ use base_mesh_config_mod, only : geometry, topology
+ use finite_element_config_mod, only : coord_system
+- use planet_config_mod, only : scaled_radius
++ use planet_config_mod, only : scaled_radius, kappa, rd, p_zero
implicit none
- type, public, extends(kernel_type) :: adj_project_eos_pressure_kernel_type
+ type, public, extends(kernel_type) :: atl_project_eos_pressure_kernel_type
type(ARG_TYPE) :: META_ARGS(10) = (/ &
arg_type(gh_field, gh_real, gh_readwrite, w3), &
arg_type(gh_field, gh_real, gh_readwrite, w3), &
-@@ -24,15 +25,15 @@
+@@ -27,15 +27,15 @@
INTEGER :: GH_SHAPE = gh_quadrature_xyoz
INTEGER :: OPERATES_ON = cell_column
CONTAINS
@@ -33,7 +38,7 @@
&chi1, chi2, chi3, panel_id, ncell_3d, m3_inv, ndf_w3, undf_w3, map_w3, w3_basis, ndf_wt, undf_wt, map_wt, wt_basis, ndf_chi, &
&undf_chi, map_chi, chi_basis, chi_diff_basis, ndf_pid, undf_pid, map_pid, nqp_h, nqp_v, wqp_h, wqp_v)
use sci_coordinate_jacobian_mod, only : coordinate_jacobian
-@@ -96,9 +97,6 @@
+@@ -99,9 +99,6 @@
real(kind=r_def) :: ls_theta_vd_at_quad
real(kind=r_def) :: tmp_ls_exner
real(kind=r_def) :: tmp_exner
@@ -43,7 +48,7 @@
exner_e = 0.0_r_def
exner_at_quad = 0.0_r_def
-@@ -176,6 +174,6 @@
+@@ -179,6 +176,6 @@
enddo
enddo
diff --git a/science/adjoint/patches/kernel/atl_rhs_project_eos_kernel_mod.patch b/science/adjoint/patches/kernel/atl_rhs_project_eos_kernel_mod.patch
index 9707453f6..a8d455937 100644
--- a/science/adjoint/patches/kernel/atl_rhs_project_eos_kernel_mod.patch
+++ b/science/adjoint/patches/kernel/atl_rhs_project_eos_kernel_mod.patch
@@ -1,18 +1,19 @@
-@@ -1,11 +1,11 @@
+@@ -1,4 +1,4 @@
-module adj_rhs_project_eos_kernel_mod
+module atl_rhs_project_eos_kernel_mod
use argument_mod, only : any_discontinuous_space_3, any_space_9, arg_type, cell_column, func_type, gh_basis, gh_diff_basis, &
&gh_field, gh_quadrature_xyoz, gh_read, gh_readwrite, gh_real, gh_scalar, gh_write
use constants_mod, only : i_def, r_def
- use fs_continuity_mod, only : w3, wtheta
- use kernel_mod, only : kernel_type
+@@ -8,7 +8,7 @@
+ use finite_element_config_mod, only : coord_system
+ use planet_config_mod, only : scaled_radius
implicit none
- type, public, extends(kernel_type) :: adj_rhs_project_eos_kernel_type
+ type, public, extends(kernel_type) :: atl_rhs_project_eos_kernel_type
type(ARG_TYPE) :: META_ARGS(14) = (/ &
arg_type(gh_field, gh_real, gh_readwrite, w3), &
arg_type(gh_field, gh_real, gh_readwrite, w3), &
-@@ -28,15 +28,15 @@
+@@ -31,15 +31,15 @@
INTEGER :: GH_SHAPE = gh_quadrature_xyoz
INTEGER :: OPERATES_ON = cell_column
CONTAINS
@@ -31,8 +32,8 @@
+ subroutine atl_rhs_project_eos_code(nlayers, rhs_eos, exner, rho, theta, moist_dyn_gas, ls_exner, ls_rho, ls_theta, &
&ls_moist_dyn_gas, chi1, chi2, chi3, panel_id, kappa, rd, p_zero, ndf_w3, undf_w3, map_w3, w3_basis, ndf_wt, undf_wt, map_wt, &
&wt_basis, ndf_chi, undf_chi, map_chi, chi_basis, chi_diff_basis, ndf_pid, undf_pid, map_pid, nqp_h, nqp_v, wqp_h, wqp_v)
- use coordinate_jacobian_mod, only : coordinate_jacobian
-@@ -176,6 +176,6 @@
+ use sci_coordinate_jacobian_mod, only : coordinate_jacobian
+@@ -179,6 +179,6 @@
enddo
enddo
diff --git a/science/adjoint/patches/kernel/atl_vorticity_advection_kernel_mod.patch b/science/adjoint/patches/kernel/atl_vorticity_advection_kernel_mod.patch
index 2e526c9d8..20441d4ed 100644
--- a/science/adjoint/patches/kernel/atl_vorticity_advection_kernel_mod.patch
+++ b/science/adjoint/patches/kernel/atl_vorticity_advection_kernel_mod.patch
@@ -1,4 +1,4 @@
-@@ -1,34 +1,34 @@
+@@ -1,37 +1,37 @@
-module adj_vorticity_advection_kernel_mod
+module atl_vorticity_advection_kernel_mod
use kernel_mod, only : kernel_type
@@ -8,6 +8,9 @@
- use fs_continuity_mod, only : w1, w2, wchi
+ use fs_continuity_mod, only : w1, w2
use cross_product_mod, only : cross_product
+ use base_mesh_config_mod, only : geometry, topology
+ use finite_element_config_mod, only : coord_system
+ use planet_config_mod, only : scaled_radius
implicit none
- type, public, extends(kernel_type) :: adj_vorticity_advection_kernel_type
+ type, public, extends(kernel_type) :: atl_vorticity_advection_kernel_type
@@ -41,7 +44,7 @@
&ndf_w2, undf_w2, map_w2, w2_basis, ndf_w1, undf_w1, map_w1, w1_basis, ndf_chi, undf_chi, map_chi, chi_basis, chi_diff_basis, &
&ndf_pid, undf_pid, map_pid, nqp_h, nqp_v, wqp_h, wqp_v)
use sci_coordinate_jacobian_mod, only : pointwise_coordinate_jacobian, pointwise_coordinate_jacobian_inverse
-@@ -86,7 +86,6 @@
+@@ -89,7 +89,6 @@
real(kind=r_def), dimension(3) :: mul2
real(kind=r_def), dimension(3) :: cross_product1
real(kind=r_def), dimension(3) :: cross_product2
@@ -49,7 +52,7 @@
real(kind=r_def) :: res_dot_product
integer :: idx
integer :: idx_1
-@@ -207,6 +206,6 @@
+@@ -210,6 +209,6 @@
enddo
enddo
diff --git a/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf
index d95f80afd..27f8410de 100644
--- a/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/earth_like_kernel_mod_test.pf
@@ -99,7 +99,6 @@ contains
@test
subroutine test_all()
-use planet_config_mod, only : scaled_radius
use, intrinsic :: iso_fortran_env, only : real64
use earth_like_kernel_mod, only : earth_like_code
diff --git a/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf b/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf
index e394ad44a..0514ececc 100644
--- a/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf
+++ b/science/gungho/unit-test/kernel/external_forcing/tidally_locked_earth_kernel_mod_test.pf
@@ -8,7 +8,7 @@
!>
module tidally_locked_earth_kernel_mod_test
- use constants_mod, only : i_def, r_def, r_second, PI
+ use constants_mod, only : i_def, r_def, r_second, PI, imdi
use coord_transform_mod, only : llr2xyz
use funit
From b3edcf1cb0f3b769b89d93b899b7a2d172dde687 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Tue, 27 Jan 2026 15:58:43 +0000
Subject: [PATCH 09/17] Update file for linked PR
---
CONTRIBUTORS.md | 1 +
dependencies.yaml | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index d0daddc68..e156a79fe 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -6,6 +6,7 @@
| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 |
| mike-hobson | Mike Hobson | Met Office | 2025-12-17 |
| mo-marqh | mark Hedley | Met Office | 2025-12-11 |
+| mo-rickywong | Ricky Wong | Met Office | 2026-01-27 |
| yaswant | Yaswant Pradhan | Met Office | 2025-12-16 |
| oakleybrunt | Oakley Brunt | Met Office | 2025-12-19 |
| harry-shepherd | Harry Shepherd | Met Office | 2026-01-08 |
diff --git a/dependencies.yaml b/dependencies.yaml
index 73e82a168..146c3dd51 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -30,8 +30,8 @@ lfric_apps:
ref:
lfric_core:
- source: cazld000020:/data/users/ricky.wong/GitHub/lfric_core
- ref:
+ source: git@github.com:mo-rickywong/lfric_core.git
+ ref: FloatJacobian
moci:
source: git@github.com:MetOffice/moci.git
From 003f062f323eeaf86a4cd9d28444d9e0248d82f0 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Tue, 27 Jan 2026 16:16:20 +0000
Subject: [PATCH 10/17] remove comments out of patch files
---
.../patches/kernel/atl_project_eos_pressure_kernel_mod.patch | 2 --
.../source/kernel/diagnostics/compute_total_aam_kernel_mod.F90 | 1 -
2 files changed, 3 deletions(-)
diff --git a/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch b/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch
index 2e491bbdd..85bcc5536 100644
--- a/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch
+++ b/science/adjoint/patches/kernel/atl_project_eos_pressure_kernel_mod.patch
@@ -1,5 +1,3 @@
---- ./applications/adjoint_tests/working/build_adjoint_tests/kernel/core_dynamics/atl_project_eos_pressure_kernel_mod.F90.orig 2026-01-27 07:11:08.000000000 +0000
-+++ ./applications/adjoint_tests/working/build_adjoint_tests/kernel/core_dynamics/atl_project_eos_pressure_kernel_mod.F90 2026-01-27 07:30:11.000000000 +0000
@@ -1,4 +1,4 @@
-module adj_project_eos_pressure_kernel_mod
+module atl_project_eos_pressure_kernel_mod
diff --git a/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90 b/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90
index eb37a2328..786b4f2d8 100644
--- a/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90
+++ b/science/gungho/source/kernel/diagnostics/compute_total_aam_kernel_mod.F90
@@ -29,7 +29,6 @@ module compute_total_aam_kernel_mod
use finite_element_config_mod, only: coord_system
use planet_config_mod, only: scaled_radius
-
implicit none
private
From d7a8d8502668edd9f6d1eb529d2baf89a59558bc Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Tue, 3 Feb 2026 09:33:18 +0000
Subject: [PATCH 11/17] Update dependencies files to point to linked core
---
dependencies.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dependencies.yaml b/dependencies.yaml
index 90f5a82d0..3f68cf294 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -30,7 +30,7 @@ lfric_apps:
ref:
lfric_core:
- source: cazld000020:/data/users/ricky.wong/GitHub/lfric_core
+ source: git@github.com:mo-rickywong/lfric_core.git
ref: IntermediateApiPurge
moci:
From 9ad2fcdd55baeefcb164e2b49b09b37839264bff Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Tue, 3 Feb 2026 10:06:43 +0000
Subject: [PATCH 12/17] Tidy up the working repo
---
.../adjoint_tests/source/adjoint_tests.f90 | 1 -
.../gravity_wave/source/gravity_wave.f90 | 2 -
.../gungho_model/source/gungho_model.f90 | 1 -
.../algorithm/algorithm_test.f90 | 2 -
.../source/jedi-interface/jedi_run_mod.f90 | 1 -
.../source/jedi_lfric_tests.f90 | 1 -
applications/jules/source/jules.f90 | 1 -
.../lfric2lfric_infrastructure_mod.X90 | 3 +-
.../lfric2lfric/source/lfric2lfric.F90 | 2 -
applications/lfric_atm/source/lfric_atm.f90 | 1 -
.../lfric_coupled/source/lfric_coupled.f90 | 1 -
.../common/lfricinp_lfric_driver_mod.f90 | 3 -
.../name_transport/source/name_transport.f90 | 3 -
applications/ngarch/source/ngarch.f90 | 2 -
.../shallow_water/source/shallow_water.f90 | 1 -
applications/transport/source/transport.f90 | 3 -
.../time/jedi_lfric_time_test.f90 | 3 -
.../jedi_lfric_linear_modeldb_driver_mod.f90 | 2 -
.../nl/jedi_lfric_nl_modeldb_driver_mod.f90 | 3 -
.../integration-test/cma_test/cma_test.f90 | 4 -
.../source/utils/check_config_api_mod.f90 | 393 ------------------
21 files changed, 2 insertions(+), 431 deletions(-)
delete mode 100644 science/shared/source/utils/check_config_api_mod.f90
diff --git a/applications/adjoint_tests/source/adjoint_tests.f90 b/applications/adjoint_tests/source/adjoint_tests.f90
index 7ab159ef3..5a2448a99 100644
--- a/applications/adjoint_tests/source/adjoint_tests.f90
+++ b/applications/adjoint_tests/source/adjoint_tests.f90
@@ -10,7 +10,6 @@
program adjoint_tests
- use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use driver_collections_mod, only : init_collections, final_collections
use driver_comm_mod, only : init_comm, final_comm
diff --git a/applications/gravity_wave/source/gravity_wave.f90 b/applications/gravity_wave/source/gravity_wave.f90
index fa152f15a..596ef3579 100644
--- a/applications/gravity_wave/source/gravity_wave.f90
+++ b/applications/gravity_wave/source/gravity_wave.f90
@@ -11,7 +11,6 @@
program gravity_wave
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_modeldb_mod, only: modeldb_type
use driver_collections_mod, only: init_collections, final_collections
@@ -47,7 +46,6 @@ program gravity_wave
call init_config( filename, gravity_wave_required_namelists, &
configuration=modeldb%configuration, &
config=modeldb%config )
- call check_config_api( modeldb%configuration, modeldb%config )
deallocate( filename )
diff --git a/applications/gungho_model/source/gungho_model.f90 b/applications/gungho_model/source/gungho_model.f90
index 6da690e67..37bf9a6eb 100644
--- a/applications/gungho_model/source/gungho_model.f90
+++ b/applications/gungho_model/source/gungho_model.f90
@@ -15,7 +15,6 @@
program gungho_model
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use derived_config_mod, only: l_esm_couple
use driver_collections_mod, only: init_collections, final_collections
diff --git a/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90 b/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
index 093539b9b..0be6d7cd1 100644
--- a/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
+++ b/applications/jedi_lfric_tests/integration-test/algorithm/algorithm_test.f90
@@ -13,7 +13,6 @@
program algorithm_test
use add_mesh_map_mod, only: assign_mesh_maps
- use check_config_api_mod, only: check_config_api
use configuration_mod, only: final_configuration, &
read_configuration
use config_mod, only: config_type
@@ -152,7 +151,6 @@ program algorithm_test
call read_configuration( filename, &
configuration=configuration, &
config=config )
- call check_config_api( configuration, config )
call init_collections()
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
index c143f65c8..e5d8177d0 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_run_mod.f90
@@ -10,7 +10,6 @@
!
module jedi_run_mod
- use check_config_api_mod, only : check_config_api
use config_mod, only : config_type
use constants_mod, only : i_def, l_def, str_def
use namelist_collection_mod, only : namelist_collection_type
diff --git a/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90 b/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
index a3988cc8e..2da8faf95 100644
--- a/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
+++ b/applications/jedi_lfric_tests/source/jedi_lfric_tests.f90
@@ -15,7 +15,6 @@
!>
program jedi_lfric_tests
- use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use driver_collections_mod, only : init_collections, final_collections
use driver_comm_mod, only : init_comm, final_comm
diff --git a/applications/jules/source/jules.f90 b/applications/jules/source/jules.f90
index 7997e23d2..339328f54 100644
--- a/applications/jules/source/jules.f90
+++ b/applications/jules/source/jules.f90
@@ -16,7 +16,6 @@
program jules
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
diff --git a/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90 b/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
index 70f23cb84..faf7d2240 100644
--- a/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
+++ b/applications/lfric2lfric/source/initialisation/lfric2lfric_infrastructure_mod.X90
@@ -316,7 +316,8 @@ contains
! Create the required meshes
!-----------------------------------------------------------------------
stencil_depth = get_required_stencil_depth()
- call init_mesh( modeldb%config, modeldb%configuration, &
+ call init_mesh( modeldb%config, &
+ modeldb%configuration, &
modeldb%mpi%get_comm_rank(), &
modeldb%mpi%get_comm_size(), &
mesh_names, extrusion, &
diff --git a/applications/lfric2lfric/source/lfric2lfric.F90 b/applications/lfric2lfric/source/lfric2lfric.F90
index 8d119094c..6a877c0d3 100644
--- a/applications/lfric2lfric/source/lfric2lfric.F90
+++ b/applications/lfric2lfric/source/lfric2lfric.F90
@@ -15,7 +15,6 @@
program lfric2lfric
use cli_mod, only: parse_command_line
- use check_config_api_mod, only: check_config_api
use constants_mod, only: precision_real
use driver_collections_mod, only: init_collections, final_collections
use driver_config_mod, only: init_config, final_config
@@ -74,7 +73,6 @@ program lfric2lfric
config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), program_name )
- call check_config_api( modeldb%configuration, modeldb%config )
call init_collections()
call init_time( modeldb )
deallocate( filename )
diff --git a/applications/lfric_atm/source/lfric_atm.f90 b/applications/lfric_atm/source/lfric_atm.f90
index ab185238f..41c33aadb 100644
--- a/applications/lfric_atm/source/lfric_atm.f90
+++ b/applications/lfric_atm/source/lfric_atm.f90
@@ -16,7 +16,6 @@
program lfric_atm
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
diff --git a/applications/lfric_coupled/source/lfric_coupled.f90 b/applications/lfric_coupled/source/lfric_coupled.f90
index 5d377706a..8043826da 100644
--- a/applications/lfric_coupled/source/lfric_coupled.f90
+++ b/applications/lfric_coupled/source/lfric_coupled.f90
@@ -16,7 +16,6 @@
program lfric_coupled
- use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use coupler_mod, only : set_cpl_name
use driver_collections_mod, only : init_collections, final_collections
diff --git a/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90 b/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
index 24bd883a6..51e577a87 100644
--- a/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
+++ b/applications/lfricinputs/source/common/lfricinp_lfric_driver_mod.f90
@@ -5,7 +5,6 @@
! *****************************COPYRIGHT*******************************
module lfricinp_lfric_driver_mod
-use check_config_api_mod, only: check_config_api
use constants_mod, only: i_def, r_def, l_def, r_second, str_def
use log_mod, only: log_event, log_scratch_space, &
LOG_LEVEL_INFO, LOG_LEVEL_ERROR, &
@@ -176,8 +175,6 @@ subroutine lfricinp_initialise_lfric(program_name_arg, &
! Initialise logging system
call init_logger( comm, program_name )
-call check_config_api( configuration, config )
-
call init_collections()
write(log_scratch_space, '(2(A,I0))') 'total ranks = ', total_ranks, &
diff --git a/applications/name_transport/source/name_transport.f90 b/applications/name_transport/source/name_transport.f90
index e6ddab9ee..2f2f4f8b3 100644
--- a/applications/name_transport/source/name_transport.f90
+++ b/applications/name_transport/source/name_transport.f90
@@ -9,7 +9,6 @@
program name_transport
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use constants_mod, only: i_def, r_def
use driver_collections_mod, only: init_collections, final_collections
@@ -54,8 +53,6 @@ program name_transport
call init_logger( modeldb%mpi%get_comm(), program_name )
- call check_config_api( modeldb%configuration, modeldb%config )
-
call log_event( 'Miniapp will run with default precision set as:', &
log_level_info )
write(log_scratch_space, '(" r_def kind = ", I0)') kind(1.0_r_def)
diff --git a/applications/ngarch/source/ngarch.f90 b/applications/ngarch/source/ngarch.f90
index 1522b6fda..8e0c2fe46 100644
--- a/applications/ngarch/source/ngarch.f90
+++ b/applications/ngarch/source/ngarch.f90
@@ -8,7 +8,6 @@
!> @details Runs a GungHo model with a custom step method
program ngarch
- use check_config_api_mod, only : check_config_api
use cli_mod, only : parse_command_line
use driver_collections_mod, only : init_collections, final_collections
use constants_mod, only : precision_real
@@ -70,7 +69,6 @@ program ngarch
ngarch_required_namelists, &
configuration=modeldb%configuration, &
config=modeldb%config )
- call check_config_api( modeldb%configuration, modeldb%config )
deallocate( filename )
diff --git a/applications/shallow_water/source/shallow_water.f90 b/applications/shallow_water/source/shallow_water.f90
index 61cc4bc30..a58581a5f 100644
--- a/applications/shallow_water/source/shallow_water.f90
+++ b/applications/shallow_water/source/shallow_water.f90
@@ -14,7 +14,6 @@
program shallow_water
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use driver_collections_mod, only: init_collections, final_collections
use driver_comm_mod, only: init_comm, final_comm
diff --git a/applications/transport/source/transport.f90 b/applications/transport/source/transport.f90
index 02a9e34e6..5e2bbd560 100644
--- a/applications/transport/source/transport.f90
+++ b/applications/transport/source/transport.f90
@@ -8,7 +8,6 @@
!> run_transport() and finalise_transport().
program transport
- use check_config_api_mod, only: check_config_api
use cli_mod, only: parse_command_line
use constants_mod, only: i_def, r_def
use driver_collections_mod, only: init_collections, final_collections
@@ -52,8 +51,6 @@ program transport
config=modeldb%config )
call init_logger( modeldb%mpi%get_comm(), program_name )
- call check_config_api( modeldb%configuration, modeldb%config )
-
call log_event( 'Miniapp will run with default precision set as:', &
log_level_trace )
write(log_scratch_space, '(" r_def kind = ", I0)') kind(1.0_r_def)
diff --git a/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90 b/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90
index 4e073568f..75530e3f7 100644
--- a/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90
+++ b/interfaces/jedi_lfric_interface/integration-test/time/jedi_lfric_time_test.f90
@@ -10,7 +10,6 @@
!! jedi_lfric_time_test.py.
program jedi_lfric_time_test
- use check_config_api_mod, only : check_config_api
use config_mod, only : config_type
use configuration_mod, only : final_configuration, &
read_configuration
@@ -181,8 +180,6 @@ program jedi_lfric_time_test
configuration=configuration, &
config=config )
- call check_config_api( configuration, config )
-
call test_jedi_interface_init()
if ( do_test_init_string_err ) then
diff --git a/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90 b/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
index 0c1192351..4530bade2 100644
--- a/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/driver/linear/jedi_lfric_linear_modeldb_driver_mod.f90
@@ -43,7 +43,6 @@ module jedi_lfric_linear_modeldb_driver_mod
adjoint_step, &
finalise_adjoint_model
use atl_si_timestep_alg_mod, only : atl_si_timestep_type
- use check_config_api_mod, only : check_config_api
use constants_mod, only : r_def, l_def, str_def
use driver_config_mod, only : init_config
use driver_time_mod, only : init_time, final_time
@@ -152,7 +151,6 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
! Initialise infrastructure
call init_time( modeldb )
call initialise_infrastructure( io_context_name, modeldb )
- call check_config_api( modeldb%configuration, modeldb%config )
! Add a place to store time axes in modeldb
call modeldb%values%add_key_value('model_axes', model_axes)
diff --git a/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90 b/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
index 8272ed2dd..75152c9a4 100644
--- a/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/driver/nl/jedi_lfric_nl_modeldb_driver_mod.f90
@@ -22,7 +22,6 @@
!>
module jedi_lfric_nl_modeldb_driver_mod
- use check_config_api_mod, only : check_config_api
use constants_mod, only : l_def
use driver_config_mod, only : init_config
use driver_time_mod, only : init_time, final_time
@@ -100,8 +99,6 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb )
! 4. Call the gungho driver initialise
call gh_initialise(modeldb_name, modeldb)
- call check_config_api( modeldb%configuration, modeldb%config )
-
end subroutine initialise_modeldb
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/science/gungho/integration-test/cma_test/cma_test.f90 b/science/gungho/integration-test/cma_test/cma_test.f90
index 743fca508..6509e025e 100644
--- a/science/gungho/integration-test/cma_test/cma_test.f90
+++ b/science/gungho/integration-test/cma_test/cma_test.f90
@@ -66,8 +66,6 @@ program cma_test
use sci_chi_transform_mod, only : init_chi_transforms, &
final_chi_transforms
- use check_config_api_mod, only: check_config_api
-
implicit none
! MPI communicator
@@ -238,8 +236,6 @@ program cma_test
call configuration%initialise( program_name, table_len=10 )
call config%initialise( program_name )
- call check_config_api( configuration, config )
-
deallocate(program_name)
deallocate(test_flag)
diff --git a/science/shared/source/utils/check_config_api_mod.f90 b/science/shared/source/utils/check_config_api_mod.f90
deleted file mode 100644
index ea0c61ce3..000000000
--- a/science/shared/source/utils/check_config_api_mod.f90
+++ /dev/null
@@ -1,393 +0,0 @@
-! ADD Licence?????
-!================================================================
-! Temporary code to check new and old confiuration objects return
-! the same configuration values. This is to manage the transition
-! of the codebase from using a namelist_collection_type to a
-! config_type
-!================================================================
-module check_config_api_mod
-
- use constants_mod, only: l_def, i_def, r_def, &
- str_def, str_max_filename, &
- r_second, i_medium
- use config_mod, only: config_type
- use log_mod, only: log_event, log_level_warning, &
- log_level_info
- use namelist_collection_mod, only: namelist_collection_type
- use namelist_mod, only: namelist_type
-
- implicit none
-
- private
- public :: check_config_api
-
-contains
-
-subroutine check_config_api( configuration, config )
-
- implicit none
-
- type(namelist_collection_type), intent(in) :: configuration
- type(config_type), intent(in) :: config
-
- type(namelist_type), pointer :: aerosol_nml
- type(namelist_type), pointer :: base_mesh_nml
- type(namelist_type), pointer :: extrusion_nml
- type(namelist_type), pointer :: files_nml
-
- type(namelist_type), pointer :: planet_nml
- type(namelist_type), pointer :: io_nml
- type(namelist_type), pointer :: timestepping_nml
- type(namelist_type), pointer :: time_nml
- type(namelist_type), pointer :: mixed_solver_nml
- type(namelist_type), pointer :: microphysics_nml
- type(namelist_type), pointer :: multires_coupling_nml
- type(namelist_type), pointer :: multigrid_nml
- type(namelist_type), pointer :: formulation_nml
- type(namelist_type), pointer :: initialization_nml
- type(namelist_type), pointer :: boundaries_nml
- type(namelist_type), pointer :: finite_element_nml
-
-! initial_temperature, bvf_square r_def
-! gravity_wave_constants b_space i_def
- character(str_max_filename) :: start_dump_filename
- character(str_max_filename) :: checkpoint_stem_name
-! lfric2lfric regrid_method i_def
- character(str_def) :: prime_mesh_name
- character(str_def) :: aerosol_mesh_name
- character(str_def) :: orography_mesh_name
- character(str_def) :: time_origin
- character(str_def) :: time_start
- character(str_max_filename) :: file_prefix
-
- logical(l_def) :: prepartitioned
- integer(i_def) :: geometry
- integer(i_def) :: moisture_formulation
- integer(i_def) :: lbc_option
- integer(i_def) :: ls_option
- integer(i_def) :: init_option
- integer(i_def) :: lbc_eos_height
- integer(i_def) :: model_eos_height
-
- real(r_def) :: tau_r
- real(r_def) :: atol
- real(r_def) :: domain_height
- real(r_def) :: planet_radius
- real(r_def) :: scaled_radius
- real(r_second) :: dt
- integer(i_def) :: method
- integer(i_def) :: nlayers
- integer(i_def) :: element_order_h
- integer(i_def) :: element_order_v
- integer(i_medium) :: diag_freq
- logical(l_def) :: nodal
- logical(l_def) :: write_diag
- logical(l_def) :: use_xios_io
- logical(l_def) :: l_multigrid
- logical(l_def) :: use_multires_coupling
- logical(l_def) :: subroutine_timers
- logical(l_def) :: ozone_ancil
- logical(l_def) :: aero_ancil
- logical(l_def) :: murk_lbc
- logical(l_def) :: microphysics_casim
- logical(l_def) :: read_w2h_wind
-
-! character(str_def), allocatable :: chain_mesh_tags(:)
-! character(str_def), allocatable :: multires_coupling_mesh_tags(:)
-
- character(*), parameter :: message = 'Difference in config objects '
-
- call log_event('Validating Config/Configuration object data.', &
- log_level_info)
-
- if (configuration%namelist_exists('base_mesh')) then
- base_mesh_nml => configuration%get_namelist('base_mesh')
-
- call base_mesh_nml%get_value( 'prime_mesh_name', prime_mesh_name )
- call base_mesh_nml%get_value( 'file_prefix', file_prefix )
- call base_mesh_nml%get_value( 'geometry', geometry )
- call base_mesh_nml%get_value( 'prepartitioned', prepartitioned )
-
- if (prime_mesh_name /= config%base_mesh%prime_mesh_name()) then
- call log_event(message//'prime_mesh_name', log_level_warning)
- end if
-
- if (file_prefix /= config%base_mesh%file_prefix()) then
- call log_event(message//'file_prefix', log_level_warning)
- end if
-
- if (geometry /= config%base_mesh%geometry()) then
- call log_event(message//'geometry', log_level_warning)
- end if
-
- if (prepartitioned .neqv. config%base_mesh%prepartitioned()) then
- call log_event(message//'prepartitioned', log_level_warning)
- end if
- end if
-
- if (configuration%namelist_exists('extrusion')) then
- extrusion_nml => configuration%get_namelist('extrusion')
-
- call extrusion_nml%get_value( 'method', method )
- call extrusion_nml%get_value( 'planet_radius', planet_radius )
- call extrusion_nml%get_value( 'domain_height', domain_height )
- call extrusion_nml%get_value( 'number_of_layers', nlayers )
-
- if (method /= config%extrusion%method()) then
- call log_event(message//'method', log_level_warning)
- end if
-
- if (planet_radius /= config%extrusion%planet_radius()) then
- call log_event(message//'planet_radius', log_level_warning)
- end if
-
- if (domain_height /= config%extrusion%domain_height()) then
- call log_event(message//'domain_height', log_level_warning)
- end if
-
- if (nlayers /= config%extrusion%number_of_layers()) then
- call log_event(message//'number_of_layers', log_level_warning)
- end if
- end if
-
- if (configuration%namelist_exists('io')) then
- io_nml => configuration%get_namelist('io')
-
- call io_nml%get_value( 'nodal_output_on_w3', nodal )
- call io_nml%get_value( 'write_diag', write_diag )
- call io_nml%get_value( 'use_xios_io', use_xios_io )
- call io_nml%get_value( 'subroutine_timers', subroutine_timers )
- call io_nml%get_value( 'diagnostic_frequency', diag_freq )
-
- if (diag_freq /= config%io%diagnostic_frequency()) then
- call log_event(message//'diagnostic_frequency', log_level_warning)
- end if
-
- if (nodal .neqv. config%io%nodal_output_on_w3()) then
- call log_event(message//'nodal_output_on_w3', log_level_warning)
- end if
-
- if (write_diag .neqv. config%io%write_diag()) then
- call log_event(message//'write_diag', log_level_warning)
- end if
-
- if (use_xios_io .neqv. config%io%use_xios_io()) then
- call log_event(message//'use_xios_io', log_level_warning)
- end if
-
- if (subroutine_timers .neqv. config%io%subroutine_timers()) then
- call log_event(message//'subroutine_timers', log_level_warning)
- end if
- end if
-
- if (configuration%namelist_exists('finite_element')) then
- finite_element_nml => configuration%get_namelist('finite_element')
-
- call finite_element_nml%get_value('element_order_h', element_order_h)
- call finite_element_nml%get_value('element_order_v', element_order_v)
-
- if (element_order_h /= config%finite_element%element_order_h()) then
- call log_event( message//'element_order_h', log_level_warning )
- end if
-
- if (element_order_v /= config%finite_element%element_order_v()) then
- call log_event( message//'element_order_v', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('formulation')) then
- formulation_nml => configuration%get_namelist('formulation')
-
- call formulation_nml%get_value('l_multigrid', l_multigrid)
- call formulation_nml%get_value('moisture_formulation', moisture_formulation)
- call formulation_nml%get_value('use_multires_coupling', use_multires_coupling)
-
- if (moisture_formulation /= config%formulation%moisture_formulation()) then
- call log_event( message//'moisture_formulation', log_level_warning )
- end if
-
- if (l_multigrid .neqv. config%formulation%l_multigrid()) then
- call log_event( message//'l_multigrid', log_level_warning )
- end if
-
- if (use_multires_coupling .neqv. config%formulation%use_multires_coupling()) then
- call log_event( message//'use_multires_coupling', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('planet')) then
- planet_nml => configuration%get_namelist('planet')
-
- call planet_nml%get_value( 'scaled_radius', scaled_radius )
-
- if (scaled_radius /= config%planet%scaled_radius()) then
- call log_event( message//'scaled_radius', log_level_warning )
- end if
- end if
-
-
- if (configuration%namelist_exists('timestepping')) then
- timestepping_nml => configuration%get_namelist('timestepping')
-
- call timestepping_nml%get_value( 'dt', dt )
- call timestepping_nml%get_value( 'tau_r', tau_r )
-
- if (dt /= config%timestepping%dt()) then
- call log_event( message//'dt', log_level_warning )
- end if
-
- if (tau_r /= config%timestepping%tau_r()) then
- call log_event( message//'tau_r', log_level_warning )
- end if
-
- end if
-
-
- if (configuration%namelist_exists('mixed_solver')) then
- mixed_solver_nml => configuration%get_namelist('mixed_solver')
-
- call mixed_solver_nml%get_value('mixed_solver_a_tol', atol)
-
- if (atol /= config%mixed_solver%mixed_solver_a_tol()) then
- call log_event( message//'mixed_solver_a_tol', log_level_warning )
- end if
- end if
-
-
- if (configuration%namelist_exists('initialization')) then
- initialization_nml => configuration%get_namelist('initialization')
-
- call initialization_nml%get_value('ls_option', ls_option)
- call initialization_nml%get_value('lbc_option', lbc_option)
- call initialization_nml%get_value('coarse_aerosol_ancil', aero_ancil)
- call initialization_nml%get_value('coarse_ozone_ancil', ozone_ancil)
- call initialization_nml%get_value('init_option', init_option)
- call initialization_nml%get_value('model_eos_height', model_eos_height)
- call initialization_nml%get_value('read_w2h_wind', read_w2h_wind)
-
- if (ls_option /= config%initialization%ls_option()) then
- call log_event( message//'ls_option', log_level_warning )
- end if
-
- if (lbc_option /= config%initialization%lbc_option()) then
- call log_event( message//'lbc_option', log_level_warning )
- end if
-
- if (init_option /= config%initialization%init_option()) then
- call log_event( message//'init_option', log_level_warning )
- end if
-
- if (aero_ancil .neqv. config%initialization%coarse_aerosol_ancil()) then
- call log_event( message//'aerosol_ancil', log_level_warning )
- end if
-
- if (ozone_ancil .neqv. config%initialization%coarse_ozone_ancil()) then
- call log_event( message//'ozone_ancil', log_level_warning )
- end if
-
- if (model_eos_height /= config%initialization%model_eos_height()) then
- call log_event( message//'model_eos_height', log_level_warning )
- end if
-
- if (read_w2h_wind .neqv. config%initialization%read_w2h_wind()) then
- call log_event( message//'read_w2h_wind', log_level_warning )
- end if
-
- end if
-
-
- if (configuration%namelist_exists('boundaries')) then
- boundaries_nml => configuration%get_namelist('boundaries')
-
- call boundaries_nml%get_value('lbc_eos_height', lbc_eos_height)
-
- if (lbc_eos_height /= config%boundaries%lbc_eos_height()) then
- call log_event( message//'lbc_eos_height', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('multires_coupling')) then
- multires_coupling_nml => configuration%get_namelist('multires_coupling')
-
- call multires_coupling_nml%get_value('aerosol_mesh_name', aerosol_mesh_name)
- call multires_coupling_nml%get_value('orography_mesh_name', orography_mesh_name)
-! call multires_coupling_nml%get_value('multires_coupling_mesh_tags', multires_coupling_mesh_tags)
-
- if (orography_mesh_name /= config%multires_coupling%orography_mesh_name()) then
- call log_event( message//'orography_mesh_name', log_level_warning )
- end if
-
-!!$ if (multires_coupling_mesh_tags /= config%multires_coupling%multires_coupling_mesh_tags()) then
-!!$ call log_event( message//'multires_coupling_mesh_tags', log_level_warning )
-!!$ end if
-
- if (aerosol_mesh_name /= config%multires_coupling%aerosol_mesh_name()) then
- call log_event( message//'aerosol_mesh_name', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('aerosol')) then
- aerosol_nml => configuration%get_namelist('aerosol')
-
- call aerosol_nml%get_value('murk_lbc', murk_lbc)
-
- if (murk_lbc .neqv. config%aerosol%murk_lbc()) then
- call log_event( message//'murk_lbc', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('multigrid')) then
- multigrid_nml => configuration%get_namelist('multigrid')
-
-!!$ call multigrid_nml%get_value('chain_mesh__tags', chain_mesh_tags)
-!!$ chain_mesh_tags_2 = config%multigrid%chain_mesh_tags()
-!!$ do i=1, size(chain_mesh_tags)
-!!$ if (chain_mesh_tags /= config%multigrid%chain_mesh_tags()) then
-!!$ call log_event( message//'chain_mesh_tags', log_level_warning )
-!!$ end if
-!!$ end do
- end if
-
- if (configuration%namelist_exists('microphysics')) then
- microphysics_nml => configuration%get_namelist('microphysics')
-
- call microphysics_nml%get_value('microphysics_casim', microphysics_casim)
-
- if (microphysics_casim .neqv. config%microphysics%microphysics_casim()) then
- call log_event( message//'microphysics_casim', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('time')) then
- time_nml => configuration%get_namelist('time')
-
- call time_nml%get_value('calendar_origin', time_origin)
- call time_nml%get_value('calendar_start', time_start)
-
- if (time_origin /= config%time%calendar_origin()) then
- call log_event( message//'calendar_origin', log_level_warning )
- end if
-
- if (time_start /= config%time%calendar_start()) then
- call log_event( message//'calendar_start', log_level_warning )
- end if
- end if
-
- if (configuration%namelist_exists('files')) then
- files_nml => configuration%get_namelist('files')
-
- call files_nml%get_value('start_dump_filename', start_dump_filename)
- call files_nml%get_value('checkpoint_stem_name', checkpoint_stem_name)
-
- if (start_dump_filename /= config%files%start_dump_filename()) then
- call log_event( message//'start_dump_filename', log_level_warning )
- end if
-
- if (checkpoint_stem_name /= config%files%checkpoint_stem_name()) then
- call log_event( message//'checkpoint_stem_name', log_level_warning )
- end if
- end if
-
-end subroutine check_config_api
-
-end module check_config_api_mod
From 009b003631e96ca07ba4277a72f8b7a38ea29126 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Tue, 3 Feb 2026 11:24:17 +0000
Subject: [PATCH 13/17] Add name to CONTRIBUTORS.md file
---
CONTRIBUTORS.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index ed1318623..337cde25b 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -7,6 +7,7 @@
| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 |
| mike-hobson | Mike Hobson | Met Office | 2025-12-17 |
| mo-marqh | mark Hedley | Met Office | 2025-12-11 |
+| mo-rickywong | Ricky Wong | Met Office | 2026-02-03 |
| yaswant | Yaswant Pradhan | Met Office | 2025-12-16 |
| oakleybrunt | Oakley Brunt | Met Office | 2025-12-19 |
| harry-shepherd | Harry Shepherd | Met Office | 2026-01-08 |
From 2b19c6be199e4664fd9db72fe6aa3815151428cc Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Wed, 4 Feb 2026 14:02:25 +0000
Subject: [PATCH 14/17] Point repo to corresponing lfric_core
---
dependencies.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dependencies.yaml b/dependencies.yaml
index 0b903e639..e0fbfd8c5 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -30,7 +30,7 @@ lfric_apps:
ref:
lfric_core:
- source: cazld000020:/data/users/ricky.wong/GitHub/lfric_core
+ source: git@github.com:mo-rickywong/lfric_core.git
ref: IntermediateApiFullPurge
moci:
From af5ac1ecb863eaef8cdfb97e73f5258c4c8d17dc Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Wed, 4 Feb 2026 14:45:17 +0000
Subject: [PATCH 15/17] Revert any change to CONTRIBUTORS file
---
CONTRIBUTORS.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 9535a50b2..06d974b4f 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -7,7 +7,6 @@
| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 |
| mike-hobson | Mike Hobson | Met Office | 2025-12-17 |
| mo-marqh | mark Hedley | Met Office | 2025-12-11 |
-| mo-rickywong | Ricky Wong | Met Office | 2026-01-27 |
| yaswant | Yaswant Pradhan | Met Office | 2025-12-16 |
| oakleybrunt | Oakley Brunt | Met Office | 2025-12-19 |
| harry-shepherd | Harry Shepherd | Met Office | 2026-01-08 |
@@ -24,4 +23,5 @@
| mo-lottieturner | Lottie Turner | Met Office | 2026-01-27 |
| andrewcoughtrie | Andrew Coughtrie | Met Office | 2026-01-28 |
| tommbendall | Thomas Bendall | Met Office | 2026-01-13 |
+| mo-jmanners | James Manners | Met Office | 2026-01-14 |
| maggiehendry | Maggie Hendry | Met Office | 2026-01-29 |
From 710ff9acf35eaab0af104231da3289b931a92166 Mon Sep 17 00:00:00 2001
From: Ricky Wong <141156427+mo-rickywong@users.noreply.github.com>
Date: Fri, 27 Feb 2026 10:33:04 +0000
Subject: [PATCH 16/17] Merge on main
---
.github/CODEOWNERS | 80 +-
.github/pull_request_template.md | 2 +-
.../workflows/trigger-project-workflow.yaml | 2 +-
CONTRIBUTORS.md | 58 +-
CodeOwners.txt | 54 --
README.md | 2 +
.../adjoint_tests/example/configuration.nml | 30 +-
applications/adjoint_tests/example/iodef.xml | 10 +
.../rose-meta/lfric-adjoint_tests/versions.py | 120 +++
.../linear_physics/atlt_bdy_lyr_alg_mod.x90 | 192 ++++
.../linear_physics/atlt_bl_inc_alg_mod.x90 | 187 ++++
.../mol/adjt_poly1d_recon_lookup_alg_mod.x90 | 9 +-
.../mol/adjt_poly2d_recon_lookup_alg_mod.x90 | 7 +-
.../mol/adjt_poly_adv_upd_lookup_alg_mod.x90 | 7 +-
.../mol/adjt_w3h_adv_upd_lookup_alg_mod.x90 | 9 +-
.../solver/adjt_mixed_operator_alg_mod.x90 | 11 +-
...djt_mixed_schur_preconditioner_alg_mod.x90 | 31 +-
.../solver/adjt_mixed_solver_alg_mod.x90 | 31 +-
.../solver/adjt_pressure_precon_alg_mod.x90 | 27 +-
.../adjt_scaled_matrix_vector_alg_mod.x90 | 5 +-
...adjt_semi_implicit_solver_step_alg_mod.x90 | 42 +-
.../adjt_end_transport_step_alg_mod.x90 | 12 +-
.../atlt_end_transport_step_alg_mod.x90 | 20 +-
.../atlt_moist_mr_transport_alg_mod.x90 | 18 +-
.../control/atlt_theta_transport_alg_mod.x90 | 16 +-
.../atlt_transport_control_alg_mod.x90 | 23 +-
.../control/atlt_transport_field_alg_mod.x90 | 50 +-
.../control/atlt_wind_transport_alg_mod.x90 | 18 +-
.../init_from_controller_alg_mod.x90 | 4 +-
.../inner_from_controller_rdef_alg_mod.x90 | 32 +-
.../inner_from_controller_rtran_alg_mod.x90 | 24 +-
.../mol/adjt_reconstruct_w3_field_alg_mod.x90 | 24 +-
.../mol/adjt_wt_advective_update_alg_mod.x90 | 22 +-
.../mol/atlt_advective_and_flux_alg_mod.x90 | 29 +-
.../mol/atlt_mol_advective_alg_mod.x90 | 22 +-
.../mol/atlt_mol_conservative_alg_mod.x90 | 34 +-
.../mol/atlt_poly1d_vert_w3_recon_alg_mod.X90 | 9 +-
.../mol/atlt_poly_adv_update_alg_mod.X90 | 7 +-
.../mol/atlt_reconstruct_w3_field_alg_mod.x90 | 33 +-
.../mol/atlt_w3h_advective_update_alg_mod.X90 | 7 +-
.../mol/atlt_wt_advective_update_alg_mod.x90 | 41 +-
.../source/driver/adjoint_test_driver_mod.f90 | 44 +-
.../driver/adjoint_test_parameters_mod.F90 | 12 +-
.../rose-meta/lfric-gravity_wave/versions.py | 45 +
.../gravity_wave_infrastructure_mod.f90 | 9 +-
.../gungho_model/example/configuration.nml | 1 +
.../gungho_model/example/file_def_initial.xml | 2 +
.../lam_example/baroclinic/config_driver.nml | 1 +
.../lam_example/baroclinic/config_lam.nml | 1 +
.../lam_example/straka/config_driver.nml | 1 +
.../lam_example/straka/config_lam.nml | 1 +
.../rose-meta/lfric-gungho_model/versions.py | 45 +
.../example/configuration.nml | 145 ++-
.../jedi_lfric_tests/example/iodef.xml | 10 +
.../jedi_lfric_tests/example/mesh_C12.nc | Bin 85708 -> 0 bytes
.../C224_create_traj_file.sh | 19 +
.../example_forecast/configuration.nml | 1 +
.../example_forecast/iodef.xml | 2 +
.../example_id_tlm_tests/configuration.nml | 204 ++--
.../example_id_tlm_tests/iodef.xml | 18 +-
.../example_id_tlm_tests/mesh_C12.nc | Bin 85708 -> 0 bytes
.../example_tlm_forecast_tl/configuration.nml | 214 +++--
.../configuration_op.nml | 1 +
.../example_tlm_forecast_tl/iodef.xml | 10 +
.../example_tlm_forecast_tl/mesh_C12.nc | Bin 85708 -> 0 bytes
.../example_tlm_tests/configuration.nml | 211 +++--
.../example_tlm_tests/configuration_dry.nml | 404 --------
.../example_tlm_tests/iodef.xml | 18 +-
.../algorithm/algorithm_test.f90 | 2 +-
.../rose-meta/jedi_common/HEAD/rose-meta.conf | 8 +
.../rose-meta/jedi_common/versions.py | 138 ++-
.../rose-meta/jedi_forecast/versions.py | 137 +++
.../jedi_forecast_pseudo/versions.py | 137 +++
.../rose-meta/jedi_id_tlm_tests/versions.py | 137 +++
.../rose-meta/jedi_lfric_tests/versions.py | 137 +++
.../jedi_tlm_forecast_tl/versions.py | 137 +++
.../jedi_tlm_tests/HEAD/rose-meta.conf | 3 -
.../rose-meta/jedi_tlm_tests/versions.py | 137 +++
.../jedi_id_linear_model_mod.f90 | 5 +-
.../jedi-interface/jedi_linear_model_mod.f90 | 5 +-
.../jedi_setup_field_meta_data_mod.F90 | 3 +
.../source/jedi_id_tlm_tests.f90 | 4 +-
.../source/jedi_tlm_tests.f90 | 22 +-
applications/jules/build/compile_options.mk | 3 +-
.../build/psyclone_transmute_file_list.mk | 5 +
applications/jules/example/configuration.nml | 1 +
.../jules/rose-meta/lfric-jules/versions.py | 45 +
.../lfric2lfric/example/configuration.nml | 1 +
.../lfric-lfric2lfric/HEAD/rose-meta.conf | 48 +-
.../rose-meta/lfric-lfric2lfric/versions.py | 69 +-
.../lfric2lfric_oasis_regrid_mod.X90 | 11 +-
.../source/driver/lfric2lfric_driver_mod.F90 | 193 ++--
.../source/driver/lfric2lfric_init_mod.f90 | 64 +-
.../source/driver/lfric2lfric_regrid_mod.F90 | 112 +++
.../lfric2lfric_field_init_mod.f90 | 22 +-
.../lfric2lfric_file_init_mod.f90 | 127 ++-
.../lfric2lfric_infrastructure_mod.X90 | 101 +-
.../initialisation/lfric2lfric_init_mesh.f90 | 38 +-
.../lfric2lfric/source/lfric2lfric.F90 | 8 +-
applications/lfric_atm/Makefile | 2 +-
.../lfric_atm/build/compile_options.mk | 3 +-
.../build/psyclone_transmute_file_list.mk | 28 +-
.../lfric_atm/example/configuration.nml | 1 +
.../lfric_atm/metadata/field_def_diags.xml | 2 +
.../metadata/field_def_initial_diags.xml | 2 +
.../transmute/boundary_layer/bl_diags_mod.py | 33 +
.../boundary_layer/kmkhz_9c_wtrac.py | 80 ++
.../transmute/boundary_layer/local.py | 176 ++++
.../boundary_layer/script_options.py | 165 ++++
.../transmute/kernel/bm_tau_kernel_mod.py | 6 +-
.../transmute/kernel/jules_exp_kernel_mod.py | 17 +-
.../kernel/jules_extra_kernel_mod.py | 10 +-
.../transmute/kernel/jules_imp_kernel_mod.py | 21 +-
.../kernel/pc2_conv_coupling_kernel_mod.py | 6 +-
.../kernel/pc2_initiation_kernel_mod.py | 6 +-
.../kernel/sw_rad_tile_kernel_mod.py | 10 +-
.../meto-ex1a/transmute/script_options.py | 1 +
.../rose-meta/lfric-lfric_atm/versions.py | 45 +
applications/lfric_coupled/Makefile | 2 +-
.../lfric_coupled/build/compile_options.mk | 3 +-
.../lfric_coupled/example/configuration.nml | 1 +
.../rose-meta/lfric-lfric_coupled/versions.py | 45 +
.../common/lfricinp_lfric_driver_mod.f90 | 2 +-
.../linear_model/example/configuration.nml | 6 +-
applications/linear_model/example/iodef.xml | 10 +-
.../example_file/config_linear.nml | 1 +
.../example_file/config_nonlinear.nml | 1 +
.../plot_convergence/plot_convergence.sh | 83 --
.../rose-meta/lfric-linear_model/versions.py | 120 +++
.../name_transport/example/configuration.nml | 1 +
.../lfric-name_transport/versions.py | 45 +
.../driver/name_transport_driver_mod.f90 | 26 +-
applications/ngarch/Makefile | 2 +-
applications/ngarch/build/compile_options.mk | 3 +-
.../build/psyclone_transmute_file_list.mk | 18 +-
.../ngarch/example/configuration_bl.nml | 1 +
.../ngarch/example/configuration_casim.nml | 1 +
.../ngarch/rose-meta/lfric-ngarch/versions.py | 45 +
.../algorithm/boundary_layer_timestep_mod.x90 | 6 +-
.../shallow_water/example/configuration.nml | 1 +
.../rose-meta/lfric-shallow_water/versions.py | 45 +
.../source/driver/shallow_water_model_mod.F90 | 11 +-
applications/solver/source/solver.F90 | 2 +-
.../transport/example/configuration.nml | 1 +
.../rose-meta/lfric-transport/versions.py | 45 +
.../source/driver/transport_driver_mod.f90 | 27 +-
build/extract/extract_physics.mk | 5 +-
build/extract/extract_science.py | 130 +--
build/extract/get_git_sources.py | 402 ++++++++
build/local_build.py | 115 +--
.../source/developer_guide/local_builds.rst | 16 +
.../checkpointing/lfric_atm_checkpoint.rst | 20 +-
.../rose-meta/coupling/versions.py | 45 +
.../jedi_lfric_interface/versions.py | 120 +++
.../jedi_lfric_linear_modeldb_driver_mod.f90 | 2 +-
.../field/atlas_field_interface_mod.F90 | 8 +-
.../field/jedi_lfric_linear_fields_mod.f90 | 61 +-
.../source/mesh/jedi_lfric_mesh_setup_mod.F90 | 16 +-
interfaces/jules_interface/build/import.mk | 3 +-
.../source/algorithm/jules_exp_alg_mod.x90 | 7 +-
.../algorithm/jules_timestep_alg_mod.x90 | 4 +-
.../source/kernel/jules_exp_kernel_mod.F90 | 7 +-
.../build/psyclone_transmute.mk | 10 +-
.../build/psyclone_transmute_pass.mk | 8 +-
.../build/transmute_psytrans/tools.py | 50 +
.../transmute_psytrans/transmute_functions.py | 160 ++++
.../um-stochastic_physics/HEAD/rose-meta.conf | 31 +-
.../source/algorithm/bl_exp_alg_mod.x90 | 7 +-
.../algorithm/glomap_aerosol_alg_mod.x90 | 10 +-
.../source/algorithm/skeb_main_alg_mod.x90 | 12 +-
.../source/algorithm/spt_main_alg_mod.x90 | 12 +-
.../source/algorithm/stph_fp_main_alg_mod.x90 | 23 +-
.../source/kernel/bl_exp_kernel_mod.F90 | 15 +-
.../kernel/glomap_aerosol_kernel_mod.F90 | 10 +-
.../source/psy/psykal_lite_phys_mod.F90 | 10 +-
.../source/support/um_physics_init_mod.f90 | 10 +-
interfaces/socrates_interface/build/import.mk | 3 +-
.../socrates-radiation/HEAD/rose-meta.conf | 13 +-
.../rose-meta/socrates-radiation/versions.py | 17 +-
.../source/algorithm/cosp_alg_mod.x90 | 6 +-
.../source/algorithm/illuminate_alg_mod.x90 | 3 +
.../source/kernel/illuminate_kernel_mod.F90 | 45 +-
.../adjoint_tests/file/field_def_diags_ls.xml | 44 +
.../app/adjoint_tests/file/file_def_ancil.xml | 9 +
.../file/file_def_check_restart.xml | 15 +
.../app/adjoint_tests/file/file_def_diags.xml | 17 +
.../adjoint_tests/file/file_def_diags_ls.xml | 13 +
.../adjoint_tests/file/file_def_initial.xml | 17 +
.../app/adjoint_tests/file/file_def_ls.xml | 20 +
.../app/adjoint_tests/file/file_def_read.xml | 19 +
rose-stem/app/adjoint_tests/file/iodef.xml | 369 ++------
.../opt/rose-app-nwp_gal9_c12.conf | 4 +-
.../opt/rose-app-varying_ls.conf | 1 +
rose-stem/app/adjoint_tests/rose-app.conf | 39 +-
.../bin/generate_weights_lfric2lfric.py | 2 +-
rose-stem/app/gravity_wave/rose-app.conf | 16 +-
.../gungho_model/file/file_def_initial.xml | 2 +
.../opt/rose-app-suite_controlled.conf | 5 +
rose-stem/app/gungho_model/rose-app.conf | 16 +-
rose-stem/app/jedi_forecast/file/iodef.xml | 2 +
.../opt/rose-app-gh-si-for-linear.conf | 1 +
rose-stem/app/jedi_forecast/rose-app.conf | 30 +-
.../app/jedi_forecast_pseudo/rose-app.conf | 30 +-
.../app/jedi_id_tlm_tests/file/iodef.xml | 12 +
.../opt/rose-app-C12_MG.conf | 8 +
.../opt/rose-app-default.conf | 0
.../opt/rose-app-nwp_gal9_c12.conf | 26 +
rose-stem/app/jedi_id_tlm_tests/rose-app.conf | 290 +++---
rose-stem/app/jedi_lfric_tests/file/iodef.xml | 12 +-
.../jedi_lfric_tests/opt/rose-app-C12_MG.conf | 8 +
.../opt/rose-app-nwp_gal9.conf | 3 -
.../opt/rose-app-nwp_gal9_c12.conf | 20 +
.../opt/rose-app-runge-kutta.conf | 32 +-
rose-stem/app/jedi_lfric_tests/rose-app.conf | 227 +++--
.../app/jedi_tlm_forecast_tl/file/iodef.xml | 12 +
.../opt/rose-app-C12_MG.conf | 8 +
.../opt/rose-app-C12_MG_op.conf | 7 +
.../opt/rose-app-default.conf | 0
.../opt/rose-app-nwp_gal9_c12.conf | 26 +
.../opt/rose-app-rrt_equals_dt.conf | 2 +
.../opt/rose-app-semi_strict_solver.conf | 9 +
.../app/jedi_tlm_forecast_tl/rose-app.conf | 293 +++---
rose-stem/app/jedi_tlm_tests/file/iodef.xml | 12 +
.../jedi_tlm_tests/opt/rose-app-C12_MG.conf | 8 +
.../opt/rose-app-C12_MG_op.conf | 7 +
.../jedi_tlm_tests/opt/rose-app-C224_MG.conf | 8 +
.../jedi_tlm_tests/opt/rose-app-default.conf | 0
.../app/jedi_tlm_tests/opt/rose-app-dry.conf | 5 +
.../opt/rose-app-nwp_gal9_c12.conf | 28 +
.../opt/rose-app-nwp_gal9_c224.conf | 3 +
.../opt/rose-app-real_increment.conf | 5 +
.../opt/rose-app-relaxed_solver.conf | 15 -
.../opt/rose-app-rrt_equals_dt.conf | 2 +
.../opt/rose-app-semi_strict_solver.conf | 9 +
.../opt/rose-app-strict_solver.conf | 15 +
rose-stem/app/jedi_tlm_tests/rose-app.conf | 294 +++---
rose-stem/app/jules/rose-app.conf | 16 +-
.../app/lfric2lfric/file/axis_def_main.xml | 1 +
rose-stem/app/lfric2lfric/file/iodef_lbc.xml | 86 ++
.../app/lfric2lfric/opt/rose-app-lbc.conf | 21 +
rose-stem/app/lfric2lfric/rose-app.conf | 19 +-
.../file/file_def_diags_oper_nwp_gl.xml | 7 -
.../lfric_atm/file/file_def_initial_diags.xml | 2 +-
.../file/iodef_gal_nwp_oper_hres.xml | 1 +
.../opt/rose-app-camembert_case3_gj1214b.conf | 1 +
.../app/lfric_atm/opt/rose-app-climate.conf | 1 +
rose-stem/app/lfric_atm/opt/rose-app-da.conf | 4 +-
rose-stem/app/lfric_atm/opt/rose-app-eda.conf | 4 +-
.../app/lfric_atm/opt/rose-app-eda_jada.conf | 4 +-
.../app/lfric_atm/opt/rose-app-hd209458b.conf | 1 +
.../opt/rose-app-physics_segmentation.conf | 2 -
rose-stem/app/lfric_atm/rose-app.conf | 16 +-
.../lfric_coupled_atmosphere/rose-app.conf | 16 +-
.../linear_model/file/field_def_diags_ls.xml | 44 +
.../app/linear_model/file/file_def_ancil.xml | 9 +
.../file/file_def_check_restart.xml | 15 +
.../app/linear_model/file/file_def_diags.xml | 17 +
.../linear_model/file/file_def_diags_ls.xml | 13 +
.../linear_model/file/file_def_initial.xml | 17 +
.../app/linear_model/file/file_def_ls.xml | 20 +
.../app/linear_model/file/file_def_read.xml | 19 +
rose-stem/app/linear_model/file/iodef.xml | 378 ++------
.../linear_model/opt/rose-app-dcmip301.conf | 11 +
.../opt/rose-app-nwp_gal9_c12.conf | 4 +-
.../opt/rose-app-runge-kutta.conf | 13 +
.../opt/rose-app-semi-implicit.conf | 13 +
rose-stem/app/linear_model/rose-app.conf | 37 +-
.../app/mesh/opt/rose-app-C12_MG_op.conf | 18 +
.../app/mesh/opt/rose-app-C24_MG_op.conf | 1 +
.../app/mesh/opt/rose-app-ral3_seuk.conf | 199 ----
rose-stem/app/mesh/opt/rose-app-ral3_uk.conf | 194 ----
rose-stem/app/mesh/opt/rose-app-ral3_ukv.conf | 194 ----
rose-stem/app/mesh/opt/rose-app-seuk_MG.conf | 3 +
rose-stem/app/name_transport/rose-app.conf | 16 +-
rose-stem/app/ngarch/rose-app.conf | 16 +-
rose-stem/app/shallow_water/rose-app.conf | 16 +-
rose-stem/app/transport/rose-app.conf | 16 +-
.../gungho_model/tasks_gungho_model.cylc | 41 +
.../tasks_jedi_lfric_tests.cylc | 211 +++--
.../common/lfric2lfric/tasks_lfric2lfric.cylc | 16 +-
.../common/lfric_atm/tasks_lfric_atm.cylc | 55 +-
.../linear_model/tasks_linear_model.cylc | 9 +-
.../site/meto/common/suite_config_ex1a.cylc | 32 +-
.../meto/groups/groups_adjoint_tests.cylc | 6 +-
.../site/meto/groups/groups_gungho_model.cylc | 3 +
.../meto/groups/groups_jedi_lfric_tests.cylc | 74 +-
.../site/meto/groups/groups_lfric2lfric.cylc | 2 +
.../site/meto/groups/groups_lfric_atm.cylc | 12 +-
.../site/meto/groups/groups_linear_model.cylc | 16 +-
...2000x2000_azspice_gnu_fast-debug-64bit.txt | 6 +-
...ic-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...MG-2panel_azspice_gnu_fast-debug-64bit.txt | 3 +
...MG-3panel_azspice_gnu_fast-debug-64bit.txt | 3 +
...ic-C48_MG_azspice_gnu_fast-debug-64bit.txt | 3 +
...1-C24s_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...C24_MG_op_azspice_gnu_fast-debug-64bit.txt | 6 +-
...G_azspice_gnu_fast-debug-64bit-rtran32.txt | 6 +-
...rt-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...0-100x100_azspice_gnu_fast-debug-64bit.txt | 6 +-
...00-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...og-C48_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...01-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...er-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...ke-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...ez-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...in-C48_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...0x8-10x10_azspice_gnu_fast-debug-64bit.txt | 8 +-
...0x8-10x10_azspice_gnu_fast-debug-64bit.txt | 8 +-
...br-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...C24_MG_op_azspice_gnu_fast-debug-64bit.txt | 6 +-
...G_azspice_gnu_fast-debug-64bit-rtran32.txt | 6 +-
...96_MG_lam_azspice_gnu_fast-debug-64bit.txt | 6 +-
...am_rotate_azspice_gnu_fast-debug-64bit.txt | 6 +-
...8-500x500_azspice_gnu_fast-debug-64bit.txt | 6 +-
...1000x1000_azspice_gnu_fast-debug-64bit.txt | 6 +-
...inear-C12_azspice_gnu_fast-debug-64bit.txt | 2 +-
...er-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...1000x2000_azspice_gnu_fast-debug-64bit.txt | 6 +-
...8-200x200_azspice_gnu_fast-debug-64bit.txt | 6 +-
...4-200x200_azspice_gnu_fast-debug-64bit.txt | 6 +-
...200x50_op_azspice_gnu_fast-debug-64bit.txt | 6 +-
...0_azspice_gnu_fast-debug-64bit-rtran32.txt | 6 +-
...th-C24_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...4s_rot_MG_azspice_gnu_fast-debug-64bit.txt | 6 +-
...x8-2000x2000_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...linic-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...linic-C48_MG_ex1a_gnu_fast-debug-64bit.txt | 3 +
...alt1-C24s_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...t2-C24_MG_op_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...-alt3-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...-pert-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...0x10-100x100_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...ip200-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...lorog-C48_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...ip301-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...piter-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...-like-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...uarez-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...omain-C48_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...P100x8-10x10_ex1a_gnu_fast-debug-64bit.txt | 8 +-
...P100x8-10x10_ex1a_gnu_fast-debug-64bit.txt | 8 +-
...l_sbr-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...t2-C24_MG_op_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...4_MG_ex1a_gnu_fast-debug-64bit-rtran32.txt | 6 +-
...m-n96_MG_lam_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...G_lam_rotate_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...00x8-500x500_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...x4-1000x1000_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...r-linear-C12_ex1a_gnu_fast-debug-64bit.txt | 2 +-
...piter-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...x8-1000x2000_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...56x8-200x200_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...56x4-200x200_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...16-200x50_op_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...56x8-200x200_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...earth-C24_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...-C24s_rot_MG_ex1a_gnu_fast-debug-64bit.txt | 6 +-
...inear-C12_azspice_gnu_fast-debug-64bit.txt | 2 +-
...inear-C12_azspice_gnu_full-debug-64bit.txt | 2 +-
...l9-C12_MG_azspice_gnu_fast-debug-64bit.txt | 9 +
..._gal9-C12_azspice_gnu_fast-debug-64bit.txt | 14 +-
...kutta-C12_azspice_gnu_fast-debug-64bit.txt | 6 +-
...kutta-C12_azspice_gnu_full-debug-64bit.txt | 6 +-
...fault-C12_azspice_gnu_fast-debug-64bit.txt | 14 +-
...lt-C12_op_azspice_gnu_fast-debug-64bit.txt | 14 +-
...l9-C12_MG_azspice_gnu_fast-debug-64bit.txt | 9 +
...C12_MG_op_azspice_gnu_fast-debug-64bit.txt | 9 +
...r-linear-C12_ex1a_cce_fast-debug-64bit.txt | 2 +-
..._gal9-C12_MG_ex1a_cce_fast-debug-64bit.txt | 9 +
...nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt | 14 +-
...ge-kutta-C12_ex1a_cce_fast-debug-64bit.txt | 6 +-
..._default-C12_ex1a_cce_fast-debug-64bit.txt | 14 +-
...fault-C12_op_ex1a_cce_fast-debug-64bit.txt | 14 +-
..._gal9-C12_MG_ex1a_cce_fast-debug-64bit.txt | 9 +
...l9-C12_MG_op_ex1a_cce_fast-debug-64bit.txt | 9 +
...6_lam-lbc_azspice_gnu_fast-debug-64bit.txt | 6 +
...k_C16_lam_azspice_gnu_fast-debug-64bit.txt | 6 +-
..._C16_lam-lbc_ex1a_cce_fast-debug-64bit.txt | 6 +
...seuk_C16_lam_ex1a_cce_fast-debug-64bit.txt | 6 +-
...lanet-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...1214b-C12_azspice_gnu_fast-debug-32bit.txt | 4 +-
..._gal9-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
..._chem-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...9458b-C24_azspice_gnu_fast-debug-32bit.txt | 6 +-
...casim-C12_azspice_gnu_fast-debug-32bit.txt | 18 +-
...coma9-C12_azspice_gnu_fast-debug-32bit.txt | 16 +-
...h_dev-C12_azspice_gnu_fast-debug-32bit.txt | 9 -
..._gal9-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
..._gal9-C12_azspice_gnu_fast-debug-64bit.txt | 14 +-
...l9-C48_MG_azspice_gnu_fast-debug-32bit.txt | 14 +-
...-pert-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...ro-C48_MG_azspice_gnu_fast-debug-32bit.txt | 14 +-
...l9_da-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...debug-C12_azspice_gnu_full-debug-32bit.txt | 14 +-
...ug-C48_MG_azspice_gnu_full-debug-32bit.txt | 12 +-
...9_eda-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
..._jada-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...9_mol-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...short-C12_azspice_gnu_fast-debug-32bit.txt | 14 +-
...3-seuk_MG_azspice_gnu_fast-debug-32bit.txt | 16 +-
...s-seuk_MG_azspice_gnu_fast-debug-32bit.txt | 16 +-
...l-seuk_MG_azspice_gnu_fast-debug-32bit.txt | 14 +-
...0x1500_MG_azspice_gnu_fast-debug-32bit.txt | 12 +-
...n1-C48_MG_azspice_gnu_fast-debug-32bit.txt | 6 +-
...uaplanet-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._gj1214b-C12_ex1a_cce_fast-debug-32bit.txt | 4 +-
...lim_gal9-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._gal9_1T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 12 +-
..._gal9_2T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...al9_chem-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._chem_1T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._chem_2T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...1500x1500_MG_ex1a_cce_fast-debug-32bit.txt | 12 +-
...d209458b-C24_ex1a_cce_fast-debug-32bit.txt | 4 +-
...wp_casim-C12_ex1a_cce_fast-debug-32bit.txt | 18 +-
...wp_coma9-C12_ex1a_cce_fast-debug-32bit.txt | 16 +-
...orph_dev-C12_ex1a_cce_fast-debug-32bit.txt | 16 +-
...morph_tb-C12_ex1a_cce_fast-debug-32bit.txt | 16 +-
...nwp_gal9-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt | 14 +-
..._gal9-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...al9-pert-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._gal9_1T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._gal9_2T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_2T-C48_MG_ex1a_cce_full-debug-32bit.txt | 14 +-
...l9_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
..._aero-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...eaded-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...eaded-C48_MG_ex1a_gnu_fast-debug-32bit.txt | 14 +-
..._gal9_da-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_debug-C12_ex1a_cce_full-debug-32bit.txt | 12 +-
...debug-C48_MG_ex1a_cce_full-debug-32bit.txt | 12 +-
...gal9_eda-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...eda_jada-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...gal9_mol-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...oukca_1T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...ca_1T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...oukca_2T-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...ca_2T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 16 +-
...ca_2T-C48_MG_ex1a_cce_full-debug-32bit.txt | 15 +-
...ca_4T-C48_MG_ex1a_cce_fast-debug-32bit.txt | 14 +-
...l9_short-C12_ex1a_cce_fast-debug-32bit.txt | 14 +-
...ral3-seuk_MG_ex1a_cce_fast-debug-32bit.txt | 16 +-
..._ens-seuk_MG_ex1a_cce_fast-debug-32bit.txt | 16 +-
...xmol-seuk_MG_ex1a_cce_fast-debug-32bit.txt | 10 +-
...1500x1500_MG_ex1a_cce_fast-debug-32bit.txt | 12 +-
..._ben1-C48_MG_ex1a_cce_fast-debug-32bit.txt | 6 +-
...nwp_gal9-C48_ex1a_cce_fast-debug-64bit.txt | 14 +-
...ip301-C24_azspice_gnu_fast-debug-64bit.txt | 6 +-
...l9-C12_MG_azspice_gnu_fast-debug-64bit.txt | 14 +-
...l9-C12_MG_azspice_gnu_production-32bit.txt | 9 +
...om-C12_MG_azspice_gnu_fast-debug-64bit.txt | 14 +-
...licit-C12_azspice_gnu_fast-debug-64bit.txt | 6 +-
...dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt | 6 +-
..._gal9-C12_MG_ex1a_cce_fast-debug-32bit.txt | 9 +
..._gal9-C12_MG_ex1a_cce_fast-debug-64bit.txt | 9 +
..._gal9-C12_MG_ex1a_cce_production-32bit.txt | 9 +
..._gal9-C12_MG_ex1a_cce_production-64bit.txt | 9 +
..._gal9-C12_MG_ex1a_gnu_fast-debug-32bit.txt | 9 +
..._gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt | 14 +-
..._gal9-C12_MG_ex1a_gnu_full-debug-32bit.txt | 9 +
..._gal9-C12_MG_ex1a_gnu_full-debug-64bit.txt | 9 +
..._gal9-C12_MG_ex1a_gnu_production-32bit.txt | 9 +
..._gal9-C12_MG_ex1a_gnu_production-64bit.txt | 9 +
...andom-C12_MG_ex1a_gnu_fast-debug-64bit.txt | 14 +-
...implicit-C12_ex1a_gnu_fast-debug-64bit.txt | 6 +-
rose-stem/site/meto/macros/macros_ex1a.cylc | 10 +-
rose-stem/site/meto/suite_config.cylc | 4 +
rose-stem/site/meto/variables.cylc | 27 +-
.../runtime/generate_runtime_control.cylc | 10 +-
.../adj_dg_matrix_vector_kernel_mod.patch | 18 +
.../adj_horizontal_mass_flux_kernel_mod.patch | 11 +
...i_combine_multidata_field_kernel_mod.patch | 73 +-
.../adj_w3v_advective_update_kernel_mod.patch | 42 +
.../atl_horizontal_mass_flux_kernel_mod.patch | 15 +-
.../atl_w3v_advective_update_kernel_mod.patch | 19 +-
.../rose-meta/lfric-adjoint/versions.py | 120 +++
.../linear_physics/atl_bdy_lyr_alg.x90 | 141 +++
.../linear_physics/atl_physics_alg.x90 | 148 +++
.../algorithm/lookup/adj_lookup_table_mod.x90 | 22 -
.../solver/adj_solver_lookup_cache_mod.x90 | 46 +-
.../transport/adj_trans_lookup_cache_mod.x90 | 86 +-
.../solver/adj_pressure_operator_alg_mod.x90 | 30 +-
.../adj_semi_implicit_solver_alg_mod.x90 | 27 +-
.../timestepping/atl_si_timestep_alg_mod.x90 | 96 +-
.../common/adj_end_transport_step_alg_mod.x90 | 9 +
.../common/adj_flux_precomputations_mod.x90 | 2 +-
.../common/atl_end_transport_step_alg_mod.x90 | 9 +-
.../atl_moist_mr_transport_alg_mod.x90 | 29 +-
.../control/atl_split_transport_mod.x90 | 338 +++++++
.../control/atl_theta_transport_alg_mod.x90 | 38 +-
.../control/atl_transport_control_alg_mod.x90 | 64 +-
.../control/atl_transport_field_mod.f90 | 34 +-
.../control/atl_wind_transport_alg_mod.x90 | 34 +-
.../mol/adj_reconstruct_w3_field_alg_mod.x90 | 54 +-
.../mol/adj_wt_advective_update_alg_mod.x90 | 62 +-
.../mol/atl_advective_and_flux_alg_mod.x90 | 84 +-
.../mol/atl_mol_advective_alg_mod.x90 | 92 +-
.../mol/atl_mol_conservative_alg_mod.x90 | 92 +-
.../mol/atl_reconstruct_w3_field_alg_mod.x90 | 39 +-
.../mol/atl_wt_advective_update_alg_mod.x90 | 56 +-
.../linear_physics/atl_bl_inc_kernel_mod.F90 | 177 ++++
...ly1d_vert_w3_reconstruction_kernel_mod.F90 | 7 +-
.../mol/atl_poly_adv_update_kernel_mod.F90 | 19 +-
.../atl_w3h_advective_update_kernel_mod.F90 | 8 +-
.../integration-test/cma_test/cma_test.f90 | 5 +-
.../lfric-gungho/HEAD/rose-meta.conf | 19 +-
.../gungho/rose-meta/lfric-gungho/versions.py | 43 +-
.../physics/map_fd_to_prognostics_alg_mod.x90 | 81 +-
.../physics/slow_physics_alg_mod.X90 | 6 +-
.../solver/mixed_operator_alg_mod.x90 | 58 +-
.../mixed_schur_preconditioner_alg_mod.x90 | 5 +-
.../common/end_of_transport_step_alg_mod.x90 | 1 +
.../common/remap_on_extended_mesh_alg_mod.x90 | 3 +-
.../common/transport_counter_mod.x90 | 74 +-
.../common/transport_metadata_mod.F90 | 14 +-
.../control/transport_controller_mod.x90 | 51 +-
.../transport/ffsl/ffsl_hori_alg_mod.x90 | 9 +-
.../mol/reconstruct_w3_field_alg_mod.x90 | 3 +-
.../mol/wt_advective_update_alg_mod.x90 | 3 +-
.../configuration/check_configuration_mod.F90 | 116 ++-
.../source/diagnostics/diagnostics_io_mod.x90 | 57 +-
.../driver/create_physics_prognostics_mod.F90 | 64 +-
.../driver/gungho_diagnostics_driver_mod.F90 | 187 ++--
.../gungho/source/driver/gungho_model_mod.F90 | 9 +-
.../gungho/source/driver/gungho_step_mod.x90 | 12 +-
.../assemble_w2h_from_w2hb_kernel_mod.F90 | 95 ++
.../compute_dl_matrix_kernel_mod.F90 | 130 +--
.../apply_mixed_u_operator_kernel_mod.F90 | 157 ++++
.../apply_mixed_wp_operator_kernel_mod.F90 | 225 +++++
.../solver/schur_backsub_kernel_mod.F90 | 12 +-
.../assemble_w2h_from_w2hb_kernel_mod_test.pf | 86 ++
.../apply_mixed_u_operator_kernel_mod_test.pf | 101 ++
...apply_mixed_wp_operator_kernel_mod_test.pf | 160 ++++
.../solver/schur_backsub_kernel_mod_test.pf | 22 +-
.../transport_metadata_collection_test.pf | 1 +
.../poly1d_vert_adv_coeffs_kernel_mod_test.pf | 1 +
.../mol/polyv_wtheta_koren_kernel_mod_test.pf | 1 +
.../linear/integration-test/nwp_gal9/ReadMe | 1 +
.../integration-test/nwp_gal9/iodef.xml | 124 +++
.../integration-test/nwp_gal9/nwp_gal9.f90 | 146 +++
.../integration-test/nwp_gal9/nwp_gal9.py | 105 +++
.../nwp_gal9/resources/mesh_C12_MG.nc | Bin 85708 -> 128056 bytes
.../resources/nwp_gal9_configuration.nml | 222 +++--
.../resources/runge_kutta_configuration.nml | 8 +-
.../runge_kutta/runge_kutta.f90 | 56 +-
.../resources/semi_implicit_configuration.nml | 6 +-
.../semi_implicit/semi_implicit.f90 | 96 +-
.../semi_implicit/semi_implicit.py | 44 +-
.../tl_test_advect_density_field_mod.x90 | 1 -
.../tl_test_advect_theta_field_mod.x90 | 2 -
.../tl_test_convergence_rate_check.f90 | 142 ++-
.../tl_test/tl_test_driver_mod.f90 | 170 ++--
.../tl_test/tl_test_hydrostatic_mod.x90 | 2 -
.../tl_test_kinetic_energy_gradient_mod.x90 | 1 -
.../tl_test/tl_test_pressure_grad_bd_mod.x90 | 2 -
.../tl_test_project_eos_pressure_mod.x90 | 1 -
.../tl_test/tl_test_rhs_alg_mod.x90 | 107 ++-
.../tl_test/tl_test_rhs_project_eos_mod.x90 | 1 -
.../tl_test/tl_test_rhs_sample_eos_mod.x90 | 1 -
.../tl_test/tl_test_rk_alg_mod.x90 | 2 +-
.../tl_test_sample_eos_pressure_mod.x90 | 1 -
.../tl_test/tl_test_semi_imp_alg_mod.x90 | 96 +-
.../tl_test/tl_test_timesteps_alg_mod.x90 | 199 ++--
.../tl_test_timesteps_random_alg_mod.x90 | 597 ++++++++++++
.../tl_test/tl_test_transport_control_mod.x90 | 168 ++--
.../tl_test/tl_test_vorticity_mod.x90 | 2 -
.../plot_convergence/plot_convergence.py | 74 +-
.../plot_convergence/plot_convergence.sh | 118 +++
.../lfric-linear/HEAD/rose-meta.conf | 129 ++-
.../linear/rose-meta/lfric-linear/versions.py | 118 ++-
.../linear_physics/tl_bdy_lyr_alg.x90 | 144 +++
.../linear_physics/tl_physics_alg.x90 | 135 +++
.../timestepping/tl_si_timestep_alg_mod.x90 | 68 +-
.../control/tl_split_transport_mod.x90 | 333 +++++++
.../control/tl_transport_field_mod.f90 | 7 +-
.../mol/tl_mol_advective_alg_mod.x90 | 66 +-
.../mol/tl_mol_conservative_alg_mod.x90 | 64 +-
.../source/driver/linear_driver_mod.f90 | 2 +-
.../source/driver/linear_model_data_mod.f90 | 24 +-
.../linear_physics/tl_bl_inc_kernel_mod.F90 | 165 ++++
.../tl_compute_aubu_kernel_mod.F90 | 117 +++
.../tl_compute_qe_kernel_mod.F90 | 179 ++++
.../source/boundary_layer/bdy_expl2.F90 | 446 +++------
.../source/boundary_layer/bdy_impl3.F90 | 51 +-
.../source/boundary_layer/bdy_impl4.F90 | 15 +-
.../source/boundary_layer/bl_option_mod.F90 | 17 +-
.../source/boundary_layer/ex_coef.F90 | 886 ++++++------------
.../source/boundary_layer/excf_nl_9c.F90 | 39 +-
.../source/boundary_layer/imp_mix.F90 | 32 +-
.../source/boundary_layer/kmkhz_9c.F90 | 11 +-
596 files changed, 15447 insertions(+), 7100 deletions(-)
delete mode 100644 CodeOwners.txt
create mode 100644 applications/adjoint_tests/source/algorithm/linear_physics/atlt_bdy_lyr_alg_mod.x90
create mode 100644 applications/adjoint_tests/source/algorithm/linear_physics/atlt_bl_inc_alg_mod.x90
delete mode 100644 applications/jedi_lfric_tests/example/mesh_C12.nc
create mode 100755 applications/jedi_lfric_tests/example_create_traj/C224_create_traj_file.sh
delete mode 100644 applications/jedi_lfric_tests/example_id_tlm_tests/mesh_C12.nc
delete mode 100644 applications/jedi_lfric_tests/example_tlm_forecast_tl/mesh_C12.nc
delete mode 100644 applications/jedi_lfric_tests/example_tlm_tests/configuration_dry.nml
create mode 100644 applications/lfric2lfric/source/driver/lfric2lfric_regrid_mod.F90
create mode 100644 applications/lfric_atm/optimisation/meto-ex1a/transmute/boundary_layer/bl_diags_mod.py
create mode 100644 applications/lfric_atm/optimisation/meto-ex1a/transmute/boundary_layer/kmkhz_9c_wtrac.py
create mode 100644 applications/lfric_atm/optimisation/meto-ex1a/transmute/boundary_layer/local.py
create mode 100644 applications/lfric_atm/optimisation/meto-ex1a/transmute/boundary_layer/script_options.py
delete mode 100755 applications/linear_model/plot_convergence/plot_convergence.sh
create mode 100644 build/extract/get_git_sources.py
create mode 100644 interfaces/physics_schemes_interface/build/transmute_psytrans/tools.py
create mode 100644 rose-stem/app/adjoint_tests/file/field_def_diags_ls.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_ancil.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_check_restart.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_diags.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_diags_ls.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_initial.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_ls.xml
create mode 100644 rose-stem/app/adjoint_tests/file/file_def_read.xml
create mode 100644 rose-stem/app/jedi_id_tlm_tests/opt/rose-app-C12_MG.conf
delete mode 100644 rose-stem/app/jedi_id_tlm_tests/opt/rose-app-default.conf
create mode 100644 rose-stem/app/jedi_id_tlm_tests/opt/rose-app-nwp_gal9_c12.conf
create mode 100644 rose-stem/app/jedi_lfric_tests/opt/rose-app-C12_MG.conf
delete mode 100644 rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9.conf
create mode 100644 rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9_c12.conf
create mode 100644 rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-C12_MG.conf
create mode 100644 rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-C12_MG_op.conf
delete mode 100644 rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-default.conf
create mode 100644 rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-nwp_gal9_c12.conf
create mode 100644 rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-rrt_equals_dt.conf
create mode 100644 rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-semi_strict_solver.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-C12_MG.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-C12_MG_op.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-C224_MG.conf
delete mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-default.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c12.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c224.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-real_increment.conf
delete mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-relaxed_solver.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-rrt_equals_dt.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-semi_strict_solver.conf
create mode 100644 rose-stem/app/jedi_tlm_tests/opt/rose-app-strict_solver.conf
create mode 100644 rose-stem/app/lfric2lfric/file/iodef_lbc.xml
create mode 100644 rose-stem/app/lfric2lfric/opt/rose-app-lbc.conf
create mode 100644 rose-stem/app/linear_model/file/field_def_diags_ls.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_ancil.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_check_restart.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_diags.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_diags_ls.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_initial.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_ls.xml
create mode 100644 rose-stem/app/linear_model/file/file_def_read.xml
create mode 100644 rose-stem/app/mesh/opt/rose-app-C12_MG_op.conf
create mode 100644 rose-stem/site/meto/kgos/gungho_model/azspice/checksum_gungho_model_baroclinic-C48_MG-2panel_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/gungho_model/azspice/checksum_gungho_model_baroclinic-C48_MG-3panel_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/gungho_model/azspice/checksum_gungho_model_baroclinic-C48_MG_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/gungho_model/ex1a/checksum_gungho_model_baroclinic-C48_MG_ex1a_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_MG_op_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_MG_op_ex1a_cce_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/lfric2lfric/azspice/checksum_lfric2lfric_oasis_clim_gal9_C12-ral_seuk_C16_lam-lbc_azspice_gnu_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/lfric2lfric/ex1a/checksum_lfric2lfric_oasis_clim_gal9_C12-ral_seuk_C16_lam-lbc_ex1a_cce_fast-debug-64bit.txt
delete mode 100644 rose-stem/site/meto/kgos/lfric_atm/azspice/checksum_lfric_atm_nwp_comorph_dev-C12_azspice_gnu_fast-debug-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_production-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_cce_fast-debug-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_cce_production-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_cce_production-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_full-debug-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_full-debug-64bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_production-32bit.txt
create mode 100644 rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_production-64bit.txt
create mode 100644 science/adjoint/patches/kernel/adj_horizontal_mass_flux_kernel_mod.patch
create mode 100644 science/adjoint/patches/kernel/adj_w3v_advective_update_kernel_mod.patch
create mode 100644 science/adjoint/source/algorithm/linear_physics/atl_bdy_lyr_alg.x90
create mode 100644 science/adjoint/source/algorithm/linear_physics/atl_physics_alg.x90
create mode 100644 science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90
create mode 100644 science/adjoint/source/kernel/linear_physics/atl_bl_inc_kernel_mod.F90
create mode 100644 science/gungho/source/kernel/core_dynamics/assemble_w2h_from_w2hb_kernel_mod.F90
create mode 100644 science/gungho/source/kernel/solver/apply_mixed_u_operator_kernel_mod.F90
create mode 100644 science/gungho/source/kernel/solver/apply_mixed_wp_operator_kernel_mod.F90
create mode 100644 science/gungho/unit-test/kernel/core_dynamics/assemble_w2h_from_w2hb_kernel_mod_test.pf
create mode 100644 science/gungho/unit-test/kernel/solver/apply_mixed_u_operator_kernel_mod_test.pf
create mode 100644 science/gungho/unit-test/kernel/solver/apply_mixed_wp_operator_kernel_mod_test.pf
create mode 100644 science/linear/integration-test/nwp_gal9/ReadMe
create mode 100644 science/linear/integration-test/nwp_gal9/iodef.xml
create mode 100644 science/linear/integration-test/nwp_gal9/nwp_gal9.f90
create mode 100755 science/linear/integration-test/nwp_gal9/nwp_gal9.py
rename applications/jedi_lfric_tests/example_tlm_tests/mesh_C12.nc => science/linear/integration-test/nwp_gal9/resources/mesh_C12_MG.nc (64%)
rename applications/jedi_lfric_tests/example_tlm_tests/configuration_dry_relaxed.nml => science/linear/integration-test/nwp_gal9/resources/nwp_gal9_configuration.nml (68%)
create mode 100644 science/linear/integration-test/tl_test/tl_test_timesteps_random_alg_mod.x90
rename {applications/linear_model => science/linear}/plot_convergence/plot_convergence.py (54%)
create mode 100755 science/linear/plot_convergence/plot_convergence.sh
create mode 100644 science/linear/source/algorithm/linear_physics/tl_bdy_lyr_alg.x90
create mode 100644 science/linear/source/algorithm/linear_physics/tl_physics_alg.x90
create mode 100644 science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90
create mode 100644 science/linear/source/kernel/linear_physics/tl_bl_inc_kernel_mod.F90
create mode 100644 science/linear/source/kernel/linear_physics/tl_compute_aubu_kernel_mod.F90
create mode 100644 science/linear/source/kernel/linear_physics/tl_compute_qe_kernel_mod.F90
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index dbadb762f..c005bbe44 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,4 +1,78 @@
-**/jules_interface/rose-meta @maggiehendry
-**/jedi_lfric* @ss421 @matthewrmshin
-**/linear* @ss421 @matthewrmshin
+# This CODEOWNERS file includes a primary codeowner and a deputy for each section.
+# Codeowners who are not in a comment will be automatically notified of changes
+# to the listed files. All codeowners listed are valid points of contact
+# for discussing changes and seeking approval for work.
+# Applications
+**/adjoint_tests @DrTVockerodtMO # @mo-joshuacolclough
+**/gravity_wave @thomasmelvin # @cjohnson-pi
+**/gungho_model @thomasmelvin # @BShipway
+**/jedi_lfric_tests @ss421 @matthewrmshin # @DavidSimonin
+**/jules @iboutle # @MetOfficessdtesam
+**/lfricinputs @mo-lottieturner # @mike-hobson
+**/lfric_atm @iboutle # @BShipway
+**/lfric_coupled @HengistPodd # @BShipway
+**/lfricinputs @mo-lottieturner # @mike-hobson
+**/linear_model @cjohnson-pi @ss421 @matthewrmshin # @tommbendall # Also notifiy jedi team about linear changes.
+**/name_transport @jameskent-metoffice # @tommbendall
+**/ngarch @christophermaynard # @jcsmeto
+**/shallow_water @jameskent-metoffice # @atb1995
+**/solver @christophermaynard # @thomasmelvin
+**/transport @tommbendall # @jameskent-metoffice
+
+# Science
+**/adjoint @DrTVockerodtMO # @mo-joshuacolclough
+**/linear @cjohnson-pi @ss421 @matthewrmshin # @tommbendall # Also notifiy jedi team about linear changes.
+science/shared/source/constants/ @iboutle # @BShipway
+
+**/gungho @thomasmelvin # @iboutle
+science/gungho/**/configuration/ @jameskent-metoffice # @thomasmelvin
+science/gungho/**/core_dynamics/ @jameskent-metoffice # @thomasmelvin
+science/gungho/**/diagnostics/ @atb1995 # @iboutle
+science/gungho/**/diffusion/ @iboutle # @tommbendall
+science/gungho/**/driver/ @MetOffice/core-capability-development
+science/gungho/**/external_forcing/ @iboutle # @tommbendall
+science/gungho/**/initialisation/ @mo-cjsmith # @thomasmelvin
+science/gungho/**/limited_area/ @cjohnson-pi # @thomasmelvin
+science/gungho/**/orography/ @atb1995 # @tommbendall
+science/gungho/**/physics/ @iboutle # @tommbendall
+science/gungho/**/psy/ @thomasmelvin # @tommbendall
+science/gungho/**/runtime_constants/ @tommbendall # @atb1995
+science/gungho/**/solver/ @thomasmelvin # @tommbendall
+science/gungho/**/timestepping/ @thomasmelvin # @jameskent-metoffice
+science/gungho/**/transport/ @tommbendall # @jameskent-metoffice
+
+**/physics_schemes @iboutle # @MetOffice/ssdteam
+science/physics_schemes/**/boundary_layer @Adrian-Lock # @P-Burns
+science/physics_schemes/**/convection @MichaelWhitall
+science/physics_schemes/**/convection/comorph @MichaelWhitall
+science/physics_schemes/**/large_scale_cloud @paul-barrett # @CyrilMorcrette
+science/physics_schemes/**/large_scale_precipitation @paulfield2024 # @paul-barrett
+science/physics_schemes/**/radiation_control @mo-jmanners # @Petzi1
+science/physics_schemes/**/stochastic_physics @wjtmo # @annemccabe
+
+# Interfaces
+**/coupled_interface @mike-hobson # @harry-shepherd
+**/jedi_lfric_interface @ss421 @matthewrmshin # @DavidSimonin
+**/jules_interface @iboutle # @MetOfficessdteam
+**/jules_interface/rose-meta @maggiehendry
+**/physics_schemes_interface @iboutle # @MetOfficessdteam
+**/socrates_interface @mo-jmanners # @Petzi1
+
+# System Components
+rose-stem/templates/ @james-bruten-mo # @jennyhickson
+rose-stem/lib/ @james-bruten-mo # @jennyhickson
+rose-stem/bin/ @james-bruten-mo # @jennyhickson
+rose-stem/site/meto/common/ @james-bruten-mo # @jennyhickson
+rose-stem/site/meto/macros/ @james-bruten-mo # @jennyhickson
+rose-stem/apps # Mostly updated by macros, no codeowner
+**/versions.py @james-bruten-mo # @jennyhickson
+build/ @MetOffice/ssdteam @hiker
+**/*Makefile @MatthewHambley @hiker
+**/*.mk @MatthewHambley @hiker
+
+# Other areas
+documentation # @MetOffice/ssdteam
+.github/ @MetOffice/ssdteam
+LICENSE @yaswant
+README.md @MetOffice/ssdteam
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index bcfbc8fc0..240f53879 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -63,7 +63,7 @@ Code Reviewer:
## PSyclone Approval
-- [ ] If you have edited any PSyclone-related code (e.g. PSyKAl-lite, Kernel interface, optimisation scripts, LFRic data structure code) then please contact the [TCD Team](toolscollabdevteam@metoffice.gov.uk)
+- [ ] If you have edited any PSyclone-related code (e.g. PSyKAl-lite, Kernel interface, optimisation scripts, LFRic data structure code) then please contact the [TCD Team](mailto:ToolsCollabDevTeam@metoffice.gov.uk)
# Sci/Tech Review
diff --git a/.github/workflows/trigger-project-workflow.yaml b/.github/workflows/trigger-project-workflow.yaml
index 4d0a8f6e6..ccb7a55b0 100644
--- a/.github/workflows/trigger-project-workflow.yaml
+++ b/.github/workflows/trigger-project-workflow.yaml
@@ -2,7 +2,7 @@ name: Trigger Review Project
on:
pull_request_target:
- types: ["opened", "synchronize", "reopened", "edited", "review_requested", "review_request_removed"]
+ types: ["opened", "synchronize", "reopened", "edited", "review_requested", "review_request_removed", "closed"]
pull_request_review:
pull_request_review_comment:
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 337cde25b..507cd2799 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1,27 +1,33 @@
# Contributors
-
-| GitHub user | Real Name | Affiliation | Date |
-| --------------- | ------------------ | -------------------------------- | ---------- |
-| james-bruten-mo | James Bruten | Met Office | 2025-12-09 |
-| jedbakerMO | Jed Baker | Met Office | 2025-12-29 |
-| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 |
-| mike-hobson | Mike Hobson | Met Office | 2025-12-17 |
-| mo-marqh | mark Hedley | Met Office | 2025-12-11 |
-| mo-rickywong | Ricky Wong | Met Office | 2026-02-03 |
-| yaswant | Yaswant Pradhan | Met Office | 2025-12-16 |
-| oakleybrunt | Oakley Brunt | Met Office | 2025-12-19 |
-| harry-shepherd | Harry Shepherd | Met Office | 2026-01-08 |
-| DrTVockerodtMO | Terence Vockerodt | Met Office | 2026-01-08 |
-| ricky-lv426 | Ricky Olivier | University of Exeter | 2026-01-12 |
-| MetBenjaminWent | Benjamin Went | Met Office | 2026-01-15 |
-| timgraham-Met | Tim Graham | Met Office | 2026-01-15 |
-| mcdalvi | Mohit Dalvi | Met Office | 2026-01-15 |
-| mo-alistairp | Alistair Pirrie | Met Office | 2026-01-19 |
-| jasonjunweilyu | Junwei (Jason) Lyu | Bureau of Meteorology, Australia | 2025-12-17 |
-| EdHone | Ed Hone | Met Office | 2026-01-26 |
-| tom-j-h | Tom Hill | Met Office | 2026-01-27 |
-| alanjhewitt | Alan J Hewitt | Met Office | 2026-01-28 |
-| mo-lottieturner | Lottie Turner | Met Office | 2026-01-27 |
-| andrewcoughtrie | Andrew Coughtrie | Met Office | 2026-01-28 |
-| tommbendall | Thomas Bendall | Met Office | 2026-01-13 |
-| maggiehendry | Maggie Hendry | Met Office | 2026-01-29 |
+| GitHub user | Real Name | Affiliation | Date |
+| ------------------- | ------------------ | -------------------------------- | ---------- |
+| james-bruten-mo | James Bruten | Met Office | 2025-12-09 |
+| jedbakerMO | Jed Baker | Met Office | 2025-12-29 |
+| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 |
+| mike-hobson | Mike Hobson | Met Office | 2025-12-17 |
+| mo-marqh | mark Hedley | Met Office | 2025-12-11 |
+| yaswant | Yaswant Pradhan | Met Office | 2025-12-16 |
+| oakleybrunt | Oakley Brunt | Met Office | 2025-12-19 |
+| harry-shepherd | Harry Shepherd | Met Office | 2026-01-08 |
+| DrTVockerodtMO | Terence Vockerodt | Met Office | 2026-01-08 |
+| ricky-lv426 | Ricky Olivier | University of Exeter | 2026-01-12 |
+| MetBenjaminWent | Benjamin Went | Met Office | 2026-01-15 |
+| timgraham-Met | Tim Graham | Met Office | 2026-01-15 |
+| mcdalvi | Mohit Dalvi | Met Office | 2026-01-15 |
+| mo-alistairp | Alistair Pirrie | Met Office | 2026-01-19 |
+| jasonjunweilyu | Junwei (Jason) Lyu | Bureau of Meteorology, Australia | 2025-12-17 |
+| EdHone | Ed Hone | Met Office | 2026-01-26 |
+| tom-j-h | Tom Hill | Met Office | 2026-01-27 |
+| alanjhewitt | Alan J Hewitt | Met Office | 2026-01-28 |
+| mo-lottieturner | Lottie Turner | Met Office | 2026-01-27 |
+| andrewcoughtrie | Andrew Coughtrie | Met Office | 2026-01-28 |
+| tommbendall | Thomas Bendall | Met Office | 2026-01-13 |
+| mo-jmanners | James Manners | Met Office | 2026-01-14 |
+| maggiehendry | Maggie Hendry | Met Office | 2026-01-29 |
+| stevemullerworth | Steve Mullerworth | Met Office | 2026-01-28 |
+| jameskent-metoffice | James Kent | Met Office | 2026-01-21 |
+| cjohnson-pi | Christine Johnson | Met Office | 2026-01-19 |
+| t00sa | Sam Clarke-Green | Met Office | 2026-01-20 |
+| ukmo-juan-castillo | Juan M. Castillo | Met Office | 2026-01-23 |
+| Adrian-Lock | Adrian Lock | Met Office | 2026-01-09 |
+| thomasmelvin | Thomas Melvin | Met Office | 2026-01-15 |
diff --git a/CodeOwners.txt b/CodeOwners.txt
deleted file mode 100644
index 36b0e9873..000000000
--- a/CodeOwners.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-= Code Owners =
-
-This file lists ownership of the major components in the LFRic Apps codebase.
-
-* Ownership is not a commitment for the individual to undertake all work
- requested or all reviewing for the owned section.
-* Any planned changes to a section should be discussed with the code owner to
- ensure all plans are appropriate.
-* Code owners should be given the option to be a science/technical reviewer
- for any code that alters their sections.
-
-Contact details for code owners: https://code.metoffice.gov.uk/trac/home/wiki/UserList
-
-# Start of script readable lines
-
-= System Components =
-{{{
-Area First Contact Second Contact Team
-rose-stem jamesbruten jenniferhickson simulation_systems_and_deployment
-build umsysteam@metoffice.gov.uk -- simulation_systems_and_deployment
-Makefiles matthewhambley -- core_capability_development
-}}}
-
-= Applications =
-{{{
-Area First Contact Second Contact Team
-adjoint_tests terencevockerodt joshuacolclough data_assimilation
-gravity_wave thomasmelvin christinejohnson dynamics_research
-gungho_model thomasmelvin benshipway dynamics_research
-jedi_lfric_tests stevensandbach davidsimonin data_assimilation
-lfric_atm ianboutle benshipway dynamics_research
-lfric_coupled richardhill benshipway global_coupled_model_development
-lfricinputs charlotteturner mikehobson core_capability_development
-linear_model christinejohnson thomasbendall dynamics_research
-name_transport jameskent thomasbendall dynamics_research
-ngarch christophermaynard jamescunningham-smith ng-arch
-shallow_water jameskent alexbrown dynamics_research
-solver christophermaynard thomasmelvin ng-opt
-transport thomasbendall jameskent dynamics_research
-}}}
-
-= Science =
-{{{
-Area First Contact Second Contact Team
-adjoint terencevockerodt joshuacolclough data_assimilation
-constants ianboutle benshipway dynamics_research
-coupled_interface mikehobson jeanrioual --
-gungho thomasmelvin benshipway dynamics_research
-jedi_lfric_interface stevensandbach davidsimonin data_assimilation
-jules_interface ianboutle richardgilham atmospheric_processes_and_parametrizations
-linear christinejohnson thomasbendall dynamics_research
-socrates_interface jamesmanners stephanhavemann radiation
-physics_schemes_interface ianboutle https://code.metoffice.gov.uk/trac/um/browser/main/trunk/CodeOwners.txt simulation_systems_and_deployment
-}}}
diff --git a/README.md b/README.md
index 8bddc4cae..1b0ff9fe1 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,8 @@ Core](https://github.com/MetOffice/lfric_core) repository.
In development documentation for LFRic Apps is available at:
[https://metoffice.github.io/lfric_apps](https://metoffice.github.io/lfric_apps)
+The LFRic Apps release schedule and deadlines can be viewed in the [milestones](https://github.com/metoffice/lfric_apps/milestones).
+
Example standalone scientific suites for use with Met Office systems are
available at:
diff --git a/applications/adjoint_tests/example/configuration.nml b/applications/adjoint_tests/example/configuration.nml
index c3ff431f9..e19710cb8 100644
--- a/applications/adjoint_tests/example/configuration.nml
+++ b/applications/adjoint_tests/example/configuration.nml
@@ -68,8 +68,8 @@ stretching_method='smooth',
ancil_directory='/data/users/lfricadmin/data/ancils/basic-gal/yak/C12',
checkpoint_stem_name='',
diag_stem_name='diagGungho',
-ls_directory='/data/users/lfricadmin/data/tangent-linear/Ticket354',
-ls_filename='final_ls',
+ls_directory='/data/users/tim.payne/lfric_apps/files',
+ls_filename='final_ls_with_land',
orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog',
start_dump_directory='/data/users/lfricadmin/data/tangent-linear/Ticket354',
start_dump_filename='final_pert',
@@ -221,11 +221,23 @@ write_minmax_tseries=.false.,
/
&linear
fixed_ls=.true.,
-l_stabilise_bl=.true.,
+l_stabilise_bl=.false.,
ls_read_w2h=.false.,
max_bl_stabilisation=0.75,
n_bl_levels_to_stabilise=15,
pert_option='file',
+transport_efficiency=.true.,
+/
+&linear_physics
+blevs_m=15,
+e_folding_levs_m=10,
+l_0_m=80.0,
+l_boundary_layer=.true.,
+log_layer=2,
+u_land_m=0.4,
+u_sea_m=0.4,
+z_land_m=0.05,
+z_sea_m=0.0005,
/
&logging
log_to_rank_zero_only=.false.,
@@ -274,11 +286,16 @@ panel_yproc=1,
partitioner='cubedsphere',
/
&physics
-configure_segments=.false.,
+bl_segment=0,
+configure_segments=.true.,
+conv_gr_segment=16,
+gw_segment=0,
limit_drag_incs=.false.,
+ls_ppn_segment=0,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
sample_physics_winds_correction=.false.,
+ussp_segment=0,
/
&planet
cp=1005.0,
@@ -354,6 +371,7 @@ tau_u=0.55,
/
&transport
adjust_theta=.false.,
+adjust_tracer_equation=.false.,
adjust_vhv_wind=.false.,
ageofair_reset_level=10,
broken_w2_projection=.false.,
@@ -392,11 +410,11 @@ panel_edge_treatment='none',
profile_size=5,
reversible=.true.,.true.,.false.,.true.,.true.,
runge_kutta_method='ssp3',
-scheme=5*1,
+scheme=5*3,
si_outer_transport='none',
slice_order='parabola',
special_edges_monotone=5*1,
-splitting=5*1,
+splitting=5*2,
substep_transport='off',
theta_dispersion_correction=.false.,
theta_variable='dry',
diff --git a/applications/adjoint_tests/example/iodef.xml b/applications/adjoint_tests/example/iodef.xml
index 11c6939fa..4e14df122 100644
--- a/applications/adjoint_tests/example/iodef.xml
+++ b/applications/adjoint_tests/example/iodef.xml
@@ -50,6 +50,11 @@
+
+
+
+
+
@@ -133,6 +138,8 @@
+
+
@@ -179,6 +186,8 @@
+
+
@@ -318,6 +327,7 @@
+
diff --git a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py
index 8418438c1..2d3f6a52e 100644
--- a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py
+++ b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py
@@ -126,3 +126,123 @@ def upgrade(self, config, meta_config=None):
)
return config, self.reports
+
+
+class vn30_t135(MacroUpgrade):
+ """Upgrade macro for ticket #135 by James Manners."""
+
+ BEFORE_TAG = "vn3.0_t146"
+ AFTER_TAG = "vn3.0_t135"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/socrates-radiation
+ self.add_setting(config, ["namelist:cosp", "n_cosp_step"], "1")
+
+ return config, self.reports
+
+
+class vn30_t171(MacroUpgrade):
+ """Upgrade macro for ticket #171 by James Kent."""
+
+ BEFORE_TAG = "vn3.0_t135"
+ AFTER_TAG = "vn3.0_t171"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-gungho
+ # Add adjust_tracer_equation to transport namelist
+ self.add_setting(
+ config, ["namelist:transport", "adjust_tracer_equation"], ".false."
+ )
+
+ return config, self.reports
+
+
+class vn30_t214(MacroUpgrade):
+ """Upgrade macro for ticket #214 by mark Hedley."""
+
+ BEFORE_TAG = "vn3.0_t171"
+ AFTER_TAG = "vn3.0_t214"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-gungho
+ """Set segments configuration to true."""
+ self.change_setting_value(
+ config, ["namelist:physics", "configure_segments"], ".true."
+ )
+
+ return config, self.reports
+
+
+class vn30_t108(MacroUpgrade):
+ """Upgrade macro for ticket #108 by Christine Johnson."""
+
+ BEFORE_TAG = "vn3.0_t214"
+ AFTER_TAG = "vn3.0_t108"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-linear
+ fixed_ls = self.get_setting_value(
+ config, ["namelist:linear", "fixed_ls"]
+ )
+ if ".true." in fixed_ls:
+ self.add_setting(
+ config, ["namelist:linear", "transport_efficiency"], ".true."
+ )
+ else:
+ self.add_setting(
+ config, ["namelist:linear", "transport_efficiency"], ".false."
+ )
+
+ return config, self.reports
+
+
+class vn30_t182(MacroUpgrade):
+ """Upgrade macro for ticket #182 by Tom Hill."""
+
+ BEFORE_TAG = "vn3.0_t108"
+ AFTER_TAG = "vn3.0_t182"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-linear
+ """Add linear boundary layer physics scheme"""
+ scaling = self.get_setting_value(
+ config, ["namelist:planet", "scaling_factor"]
+ )
+ if "125.0" in scaling:
+ self.add_setting(
+ config,
+ ["namelist:linear_physics", "l_boundary_layer"],
+ ".false.",
+ )
+ else:
+ self.add_setting(
+ config,
+ ["namelist:linear_physics", "l_boundary_layer"],
+ ".true.",
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "Blevs_m"], "15"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "e_folding_levs_m"], "10"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "l_0_m"], "80.0"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "log_layer"], "2"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "u_land_m"], "0.4"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "u_sea_m"], "0.4"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "z_land_m"], "0.05"
+ )
+ self.add_setting(
+ config, ["namelist:linear_physics", "z_sea_m"], "0.0005"
+ )
+
+ return config, self.reports
diff --git a/applications/adjoint_tests/source/algorithm/linear_physics/atlt_bdy_lyr_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/linear_physics/atlt_bdy_lyr_alg_mod.x90
new file mode 100644
index 000000000..c1294aa55
--- /dev/null
+++ b/applications/adjoint_tests/source/algorithm/linear_physics/atlt_bdy_lyr_alg_mod.x90
@@ -0,0 +1,192 @@
+!-----------------------------------------------------------------------------
+! (c) Crown copyright 2026 Met Office. All rights reserved.
+! The file LICENCE, distributed with this code, contains details of the terms
+! under which the code may be brief.
+!-----------------------------------------------------------------------------
+!> @brief Module containing adjoint test for atl_bdy_lyr_alg
+module atlt_bdy_lyr_alg_mod
+
+ use sci_assign_field_random_range_alg_mod, &
+ only : assign_field_random_range
+ use field_mod, only : field_type
+ use function_space_mod, only : function_space_type
+ use constants_mod, only : r_def, i_def, l_def
+ use field_indices_mod, only : igh_u, igh_t, &
+ igh_d, igh_p
+ use log_mod, only : log_event, &
+ log_scratch_space, &
+ LOG_LEVEL_INFO, &
+ LOG_LEVEL_DEBUG, &
+ LOG_LEVEL_ERROR
+ use mesh_mod, only : mesh_type
+ use derived_config_mod, only : bundle_size
+ use driver_modeldb_mod, only : modeldb_type
+ use finite_element_config_mod, only : element_order_h, element_order_v
+ use fs_continuity_mod, only : W2, W3, Wtheta
+ use function_space_collection_mod, only : function_space_collection
+ use adjoint_test_parameters_mod, only : ls_u_range, ls_theta_range, &
+ ls_rho_range, ls_exner_range
+ use timing_mod, only : start_timing, stop_timing, tik, LPROF
+
+ implicit none
+
+ public
+
+ contains
+
+ !=============================================================================
+ !> @brief Adjoint test for atl_bdy_lyr_alg.
+ !> @details Passes if adjoint is transpose of tangent linear.
+ !> Determined by testing the equality of inner products and ,
+ !> where M is the tangent linear and A is the adjoint.
+ !> @param[in,out] modeldb Structure containing the model state
+ !> @param[in] mesh The model mesh
+ subroutine atlt_bdy_lyr_alg( modeldb, mesh )
+
+ use tl_bdy_lyr_alg_mod, only : tl_bdy_lyr_alg
+ use atl_bdy_lyr_alg_mod, only : atl_bdy_lyr_alg
+
+ implicit none
+
+ ! Arguments
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(mesh_type), pointer, intent(in) :: mesh
+
+ ! Arguments for tl and atl calls
+ ! Form of state is [u,theta,rho,exner]
+ type(field_type) :: state(bundle_size)
+ type(field_type) :: u_bl_inc
+ type(field_type) :: ls_state(bundle_size)
+
+ ! Copies of input fields used in inner products
+ type(field_type) :: state_input(bundle_size)
+ type(field_type) :: u_bl_inc_input
+
+ ! Pointers for initialising fields
+ type(function_space_type), pointer :: vector_space_wtheta_ptr
+ type(function_space_type), pointer :: vector_space_w2_ptr
+ type(function_space_type), pointer :: vector_space_w3_ptr
+
+ ! Inner products
+ real(kind=r_def) :: inner1
+ real(kind=r_def) :: inner2
+ real(kind=r_def) :: ip1(2),ip2(2)
+ real(kind=r_def) :: sf(2)
+
+ ! Test parameters and variables
+ real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
+ real(kind=r_def) :: machine_tol
+ real(kind=r_def) :: relative_diff
+ real(kind=r_def), parameter :: eps = 1e-30_r_def
+
+ ! Misc
+ real(kind=r_def) :: dt
+
+ integer(kind=tik) :: id
+
+ if ( LPROF ) call start_timing( id, 'atlt_bdy_lyr_alg' )
+
+ ! Determining time constants
+ dt = real(modeldb%clock%get_seconds_per_step(), r_def)
+ if ( dt <= 0.0_r_def ) then
+ write( log_scratch_space, * ) "dt cannot be leq 0, found dt = ", dt
+ call log_event( log_scratch_space, log_level_error )
+ end if
+
+ ! Initialising fields
+ vector_space_wtheta_ptr => function_space_collection % get_fs( mesh, element_order_h, element_order_v, Wtheta )
+ vector_space_w2_ptr => function_space_collection % get_fs( mesh, element_order_h, element_order_v, W2 )
+ vector_space_w3_ptr => function_space_collection % get_fs( mesh, element_order_h, element_order_v, W3 )
+
+ call state(igh_u) % initialise( vector_space = vector_space_w2_ptr )
+ call state(igh_t) % initialise( vector_space = vector_space_wtheta_ptr )
+ call state(igh_d) % initialise( vector_space = vector_space_w3_ptr )
+ call state(igh_p) % initialise( vector_space = vector_space_w3_ptr )
+ call u_bl_inc % initialise( vector_space = vector_space_w2_ptr )
+
+ call state(igh_u) % copy_field_properties( state_input(igh_u) )
+ call state(igh_t) % copy_field_properties( state_input(igh_t) )
+ call state(igh_d) % copy_field_properties( state_input(igh_d) )
+ call state(igh_p) % copy_field_properties( state_input(igh_p) )
+ call state(igh_u) % copy_field_properties( u_bl_inc_input )
+
+ call state(igh_u) % copy_field_properties( ls_state(igh_u) )
+ call state(igh_t) % copy_field_properties( ls_state(igh_t) )
+ call state(igh_d) % copy_field_properties( ls_state(igh_d) )
+ call state(igh_p) % copy_field_properties( ls_state(igh_p) )
+
+ ! Initialise values and call the tangent-linear alg.
+ call invoke( setval_random( u_bl_inc ), &
+ setval_x(u_bl_inc_input, u_bl_inc ), &
+ setval_random( state(igh_u) ), &
+ setval_x( state_input(igh_u), state(igh_u) ), &
+ setval_random( state(igh_t) ), &
+ setval_x( state_input(igh_t), state(igh_t) ), &
+ setval_random( state(igh_d) ), &
+ setval_x( state_input(igh_d), state(igh_d) ), &
+ setval_random( state(igh_p) ), &
+ setval_x( state_input(igh_p), state(igh_p) ) )
+
+ ! LS init
+ call assign_field_random_range( ls_state(igh_u), ls_u_range(1), ls_u_range(2) )
+ call assign_field_random_range( ls_state(igh_t), ls_theta_range(1), ls_theta_range(2) )
+ call invoke( setval_random( ls_state(igh_d) ), setval_random( ls_state(igh_p) ) )
+
+ ! Tangent linear
+ call tl_bdy_lyr_alg(modeldb, u_bl_inc, state(igh_u), ls_state, dt )
+
+ ! < Mx, Mx >
+ call invoke( x_innerproduct_x( ip1(1), state(igh_u) ), &
+ x_innerproduct_x( ip1(2), u_bl_inc ) )
+
+ sf(1) = 1.0_r_def / (ip1(1) + eps)
+ sf(2) = 1.0_r_def / (ip1(2) + eps)
+
+ inner1 = 0.0_r_def
+ inner1 = inner1 + ip1(1) * sf(1)
+ inner1 = inner1 + ip1(2) * sf(2)
+
+ ! Scaling fields
+ call invoke( inc_a_times_X( sf(1), state(igh_u) ), &
+ inc_a_times_X( sf(2), u_bl_inc ) )
+
+ ! Adjoint alg call and inner products
+
+ ! Adjoint
+ call atl_bdy_lyr_alg(modeldb, u_bl_inc, state(igh_u), ls_state, dt )
+
+ ! < AMx, x >
+ call invoke( x_innerproduct_y( ip2(1), &
+ state(igh_u), &
+ state_input(igh_u) ), &
+ x_innerproduct_y( ip2(2), &
+ u_bl_inc, &
+ u_bl_inc_input ) )
+
+ inner2 = 0.0_r_def
+ inner2 = inner2 + ip2(1)
+ inner2 = inner2 + ip2(2)
+
+ write( log_scratch_space, * ) 'atlt_bdy_lyr_alg: ad test for tl_bdy_lyr_alg: ip1=', ip1(1) * sf(1), ip1(2) * sf(2)
+ call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
+ write( log_scratch_space, * ) 'atlt_bdy_lyr_alg: ad test for tl_bdy_lyr_alg: ip2=', ip2
+ call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
+ write( log_scratch_space, * ) 'atlt_bdy_lyr_alg: ad test for tl_bdy_lyr_alg: s(ip1),s(ip2)=', inner1, inner2
+ call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
+
+ ! Test the inner-product values for equality, allowing for the precision of the active variables
+ machine_tol = spacing( max( abs( inner1 ), abs( inner2 ) ) )
+ relative_diff = abs( inner1 - inner2 ) / machine_tol
+ if ( relative_diff < overall_tolerance ) then
+ write( log_scratch_space, * ) "PASSED tl_bdy_lyr_alg:", inner1, inner2, relative_diff
+ call log_event( log_scratch_space, LOG_LEVEL_INFO )
+ else
+ write( log_scratch_space, * ) "FAILED tl_bdy_lyr_alg:", inner1, inner2, relative_diff
+ call log_event( log_scratch_space, LOG_LEVEL_ERROR )
+ end if
+
+ if ( LPROF ) call stop_timing( id, 'atlt_bdy_lyr_alg' )
+
+ end subroutine atlt_bdy_lyr_alg
+
+end module atlt_bdy_lyr_alg_mod
diff --git a/applications/adjoint_tests/source/algorithm/linear_physics/atlt_bl_inc_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/linear_physics/atlt_bl_inc_alg_mod.x90
new file mode 100644
index 000000000..c617ba147
--- /dev/null
+++ b/applications/adjoint_tests/source/algorithm/linear_physics/atlt_bl_inc_alg_mod.x90
@@ -0,0 +1,187 @@
+!-----------------------------------------------------------------------------
+! (c) Crown copyright 2026 Met Office. All rights reserved.
+! The file LICENCE, distributed with this code, contains details of the terms
+! under which the code may be brief.
+!-----------------------------------------------------------------------------
+!> @brief Module containing adjoint test for atl_bl_inc_kernel
+module atlt_bl_inc_alg_mod
+
+ use sci_assign_field_random_range_alg_mod, &
+ only : assign_field_random_range
+ use sci_geometric_constants_mod, only: get_face_selector_ew, &
+ get_face_selector_ns
+ use integer_field_mod, only: integer_field_type
+ use field_mod, only : field_type
+ use function_space_mod, only : function_space_type
+ use log_mod, only : log_event, &
+ log_scratch_space, &
+ LOG_LEVEL_ERROR, &
+ LOG_LEVEL_DEBUG, &
+ LOG_LEVEL_INFO
+ use mesh_mod, only : mesh_type
+ use function_space_collection_mod, only : function_space_collection
+ use finite_element_config_mod, only : element_order_h, element_order_v
+ use fs_continuity_mod, only : W2, W3, Wtheta
+ use constants_mod, only : i_def, r_def
+ use quadrature_face_mod, only : quadrature_face_type
+ use quadrature_rule_gaussian_mod, only : quadrature_rule_gaussian_type
+ use reference_element_mod, only : reference_element_type
+ use planet_config_mod, only : cp
+ use adjoint_test_parameters_mod, only : ls_theta_range, &
+ ls_exner_range, &
+ ls_md1_range, &
+ ls_md2_range, &
+ ls_md3_range
+ use timing_mod, only : start_timing, stop_timing, tik, LPROF
+
+ implicit none
+
+ public
+
+ contains
+
+ !=============================================================================
+ !> @brief Adjoint test for atl_bl_inc.
+ !> @details Passes if adjoint is transpose of tangent linear.
+ !> Determined by testing the equality of inner products and ,
+ !> where M is the tangent linear and A is the adjoint.
+ !> @param[in] mesh Mesh object
+ subroutine atlt_bl_inc_alg( mesh )
+
+ use tl_bl_inc_kernel_mod, only : tl_bl_inc_kernel_type
+ use atl_bl_inc_kernel_mod, only : atl_bl_inc_kernel_type
+ use linear_physics_config_mod, only : log_layer, &
+ Blevs_m, &
+ e_folding_levs_m, &
+ u_land_m, &
+ u_sea_m, &
+ z_land_m, &
+ z_sea_m, &
+ L_0_m
+
+ implicit none
+
+ ! Arguments
+ type(mesh_type), pointer, intent(in) :: mesh
+
+ ! Arguments for tl and adj calls
+ type( field_type) :: u_inc
+ type( field_type) :: u
+ type( field_type) :: auv
+ type( field_type) :: buv_inv
+ type(integer_field_type), pointer :: face_selector_ew => null()
+ type(integer_field_type), pointer :: face_selector_ns => null()
+
+ ! Copies of input fields used in inner products
+ type( field_type) :: u_inc_input
+ type( field_type) :: u_input
+
+ ! Pointers for initialising fields
+ type(function_space_type), pointer :: vector_space_wtheta_ptr
+ type(function_space_type), pointer :: vector_space_w2_ptr
+ type(function_space_type), pointer :: vector_space_w3_ptr
+
+ ! Inner products
+ real(kind=r_def) :: ip1(2)
+ real(kind=r_def) :: ip2(2)
+ real(kind=r_def) :: sf(2)
+ real(kind=r_def) :: inner1
+ real(kind=r_def) :: inner2
+
+ ! Test parameters and variables
+ real(kind=r_def), parameter :: overall_tolerance = 3000.0_r_def
+ real(kind=r_def) :: machine_tol
+ real(kind=r_def) :: relative_diff
+ real(kind=r_def), parameter :: eps = 1e-30_r_def
+
+ integer(kind=tik) :: id
+
+ if ( LPROF ) call start_timing( id, 'atlt_bl_inc_alg' )
+
+ vector_space_wtheta_ptr => function_space_collection % get_fs( mesh, element_order_h, element_order_v, Wtheta )
+ vector_space_w2_ptr => function_space_collection % get_fs( mesh, element_order_h, element_order_v, W2 )
+ vector_space_w3_ptr => function_space_collection % get_fs( mesh, element_order_h, element_order_v, W3 )
+
+ call auv % initialise( vector_space = vector_space_w2_ptr, name = 'auv' )
+ call buv_inv % initialise( vector_space = vector_space_w2_ptr, name = 'buv_inv' )
+
+ call u_inc % initialise( vector_space = vector_space_w2_ptr, name = 'u_inc' )
+ call u % initialise( vector_space = vector_space_w2_ptr, name = 'u' )
+
+ face_selector_ew => get_face_selector_ew(mesh%get_id())
+ face_selector_ns => get_face_selector_ns(mesh%get_id())
+
+ call u_inc % copy_field_properties( u_inc_input )
+ call u % copy_field_properties( u_input )
+
+ ! Initialise arguments and call the tangent-linear kernel.
+ call invoke( setval_random( u ), &
+ setval_x( u_input, u ), &
+ setval_random( u_inc ), &
+ setval_x( u_inc_input, u_inc ) )
+
+ ! LS init
+ call assign_field_random_range( auv, -1.0_r_def, 1.0_r_def )
+ call assign_field_random_range( buv_inv, 1.0_r_def, 2.0_r_def ) ! must avoid 0
+
+ ! < Mx, Mx >
+ call invoke ( tl_bl_inc_kernel_type( u_inc, &
+ u, &
+ auv,buv_inv, &
+ face_selector_ew, &
+ face_selector_ns, &
+ Blevs_m ) )
+ call invoke ( x_innerproduct_x( ip1(1), u_inc ), &
+ x_innerproduct_x( ip1(2), u ) )
+
+ sf(1) = 1.0_r_def / (ip1(1) + eps)
+ sf(2) = 1.0_r_def / (ip1(2) + eps)
+
+ inner1 = 0.0_r_def
+ inner1 = inner1 + ip1(1) * sf(1)
+ inner1 = inner1 + ip1(2) * sf(2)
+
+ ! Scaling fields
+ call invoke( inc_a_times_X( sf(1), u_inc ), &
+ inc_a_times_X( sf(2), u ) )
+
+ ! < AMx, x >
+ call invoke ( atl_bl_inc_kernel_type( u_inc, &
+ u, &
+ auv,buv_inv, &
+ face_selector_ew, &
+ face_selector_ns, &
+ Blevs_m ) )
+
+ call invoke ( x_innerproduct_y( ip2(1), u_inc, u_inc_input ), &
+ x_innerproduct_y( ip2(2), u, u_input ) )
+
+ inner2 = 0.0_r_def
+ inner2 = inner2 + ip2(1)
+ inner2 = inner2 + ip2(2)
+
+ write( log_scratch_space, * ) 'atlt_bl_inc_alg: ad test for atl_bl_inc_kernel_type: ip1=', &
+ ip1(1) * sf(1), ip1(2) * sf(2)
+ call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
+ write( log_scratch_space, * ) 'atlt_bl_inc_alg: ad test for atl_bl_inc_kernel_type: ip2=', ip2
+ call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
+ write( log_scratch_space, * ) 'atlt_bl_inc_alg: ad test for atl_bl_inc_kernel_type: s(ip1),s(ip2)=', &
+ inner1, inner2
+ call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
+
+ ! Test the inner-product values for equality, allowing for the precision of the active variables
+ machine_tol = spacing( max( abs(inner1), abs(inner2) ) )
+ relative_diff = abs(inner1 - inner2) / machine_tol
+ if (relative_diff < overall_tolerance) then
+ write(log_scratch_space, *) "PASSED tl_bl_inc:", inner1, inner2, relative_diff
+ call log_event(log_scratch_space, LOG_LEVEL_INFO)
+ else
+ write(log_scratch_space, *) "FAILED tl_bl_inc:", inner1, inner2, relative_diff
+ call log_event(log_scratch_space, LOG_LEVEL_ERROR)
+ end if
+
+ if ( LPROF ) call stop_timing( id, 'atlt_bl_inc_alg' )
+
+ end subroutine atlt_bl_inc_alg
+
+end module atlt_bl_inc_alg_mod
diff --git a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly1d_recon_lookup_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly1d_recon_lookup_alg_mod.x90
index 096545519..c8b3833f5 100644
--- a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly1d_recon_lookup_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly1d_recon_lookup_alg_mod.x90
@@ -17,7 +17,7 @@ module adjt_poly1d_recon_lookup_alg_mod
use r_tran_field_mod, only : r_tran_field_type
use mesh_mod, only : mesh_type
use fs_continuity_mod, only : Wtheta
- use constants_mod, only : i_def, r_def, r_tran
+ use constants_mod, only : i_def, r_def, r_tran, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -79,10 +79,9 @@ module adjt_poly1d_recon_lookup_alg_mod
real(kind=r_def) :: reconstruction_reconstruction_input_inner_prod
real(kind=r_def) :: tracer_tracer_input_inner_prod
real(kind=r_tran) :: inner2
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_def
! Test parameters and variables
- real(kind=r_tran), parameter :: overall_tolerance = 1500.0_r_tran
+ real(kind=r_tran), parameter :: overall_tolerance = 2500.0_r_tran
real(kind=r_tran) :: machine_tol
real(kind=r_tran) :: relative_diff
@@ -123,8 +122,8 @@ module adjt_poly1d_recon_lookup_alg_mod
x_innerproduct_x( tracer_inner_prod, tracer ) )
! Determining scale factors
- reconstruction_sf = 1.0_r_tran/( real( reconstruction_inner_prod, r_tran ) + eps )
- tracer_sf = 1.0_r_tran/( real( tracer_inner_prod, r_tran ) + eps )
+ reconstruction_sf = 1.0_r_tran/( real( reconstruction_inner_prod, r_tran ) + EPS )
+ tracer_sf = 1.0_r_tran/( real( tracer_inner_prod, r_tran ) + EPS )
inner1 = 0.0_r_tran
inner1 = inner1 + real( reconstruction_inner_prod, r_tran )*reconstruction_sf
diff --git a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly2d_recon_lookup_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly2d_recon_lookup_alg_mod.x90
index ed53392d1..8d9ff6466 100644
--- a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly2d_recon_lookup_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly2d_recon_lookup_alg_mod.x90
@@ -16,7 +16,7 @@ module adjt_poly2d_recon_lookup_alg_mod
use fs_continuity_mod, only : name_from_functionspace
use finite_element_config_mod, only : element_order_h, &
element_order_v
- use constants_mod, only : i_def, r_def, r_tran
+ use constants_mod, only : i_def, r_def, r_tran, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -84,7 +84,6 @@ module adjt_poly2d_recon_lookup_alg_mod
real(kind=r_def) :: reconstruction_reconstruction_input_inner_prod
real(kind=r_def) :: tracer_tracer_input_inner_prod
real(kind=r_tran) :: inner2
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_def
! Test parameters and variables
real(kind=r_tran), parameter :: overall_tolerance = 1500.0_r_tran
@@ -131,8 +130,8 @@ module adjt_poly2d_recon_lookup_alg_mod
x_innerproduct_x( tracer_inner_prod, tracer ) )
! Determining scale factors
- reconstruction_sf = 1.0_r_tran/( real( reconstruction_inner_prod, r_tran ) + eps )
- tracer_sf = 1.0_r_tran/( real( tracer_inner_prod, r_tran ) + eps )
+ reconstruction_sf = 1.0_r_tran/( real( reconstruction_inner_prod, r_tran ) + EPS )
+ tracer_sf = 1.0_r_tran/( real( tracer_inner_prod, r_tran ) + EPS )
inner1 = 0.0_r_tran
inner1 = inner1 + real( reconstruction_inner_prod, r_tran )*reconstruction_sf
diff --git a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly_adv_upd_lookup_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly_adv_upd_lookup_alg_mod.x90
index 501399468..311c89b38 100644
--- a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly_adv_upd_lookup_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_poly_adv_upd_lookup_alg_mod.x90
@@ -18,7 +18,7 @@ module adjt_poly_adv_upd_lookup_alg_mod
use integer_field_mod, only : integer_field_type, &
integer_field_proxy_type
use fs_continuity_mod, only : W2H, Wtheta
- use constants_mod, only : i_def, r_def, r_tran, l_def
+ use constants_mod, only : i_def, r_def, r_tran, l_def, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -81,7 +81,6 @@ module adjt_poly_adv_upd_lookup_alg_mod
real(kind=r_def) :: advective_advective_input_inner_prod
real(kind=r_def) :: reconstruction_reconstruction_input_inner_prod
real(kind=r_tran) :: inner2
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
! Test variables
real(kind=r_tran), parameter :: overall_tolerance = 1500.0_r_tran
@@ -125,8 +124,8 @@ module adjt_poly_adv_upd_lookup_alg_mod
x_innerproduct_x( reconstruction_inner_prod, reconstruction) )
! Determining scale factors
- advective_sf = 1.0_r_tran/( real( advective_inner_prod, r_tran ) + eps )
- reconstruction_sf = 1.0_r_tran/( real( reconstruction_inner_prod, r_tran ) + eps )
+ advective_sf = 1.0_r_tran/( real( advective_inner_prod, r_tran ) + EPS )
+ reconstruction_sf = 1.0_r_tran/( real( reconstruction_inner_prod, r_tran ) + EPS )
inner1 = 0.0_r_tran
inner1 = inner1 + real( advective_inner_prod, r_tran )*advective_sf
diff --git a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_w3h_adv_upd_lookup_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_w3h_adv_upd_lookup_alg_mod.x90
index 9a076295e..112891ecb 100644
--- a/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_w3h_adv_upd_lookup_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/lookup/transport/mol/adjt_w3h_adv_upd_lookup_alg_mod.x90
@@ -16,7 +16,7 @@ module adjt_w3h_adv_upd_lookup_alg_mod
use function_space_collection_mod, only : function_space_collection
use finite_element_config_mod, only : element_order_h, element_order_V
use operator_mod, only : operator_type
- use constants_mod, only : i_def, r_def, r_tran
+ use constants_mod, only : i_def, r_def, r_tran, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -78,7 +78,6 @@ module adjt_w3h_adv_upd_lookup_alg_mod
real(kind=r_def) :: adv_inc_adv_inc_inp_inner_prod
real(kind=r_def) :: tracer_tracer_input_inner_prod
real(kind=r_tran) :: inner2
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_def
! Test parameters and variables
real(kind=r_tran), parameter :: overall_tolerance = 1500.0_r_tran
@@ -125,8 +124,8 @@ module adjt_w3h_adv_upd_lookup_alg_mod
x_innerproduct_x(tracer_inner_prod, tracer) )
! Determining scale factors
- advective_increment_sf = 1.0_r_tran/( real( advective_increment_inner_prod, r_tran ) + eps )
- tracer_sf = 1.0_r_tran/( real( tracer_inner_prod, r_tran ) + eps )
+ advective_increment_sf = 1.0_r_tran/( real( advective_increment_inner_prod, r_tran ) + EPS )
+ tracer_sf = 1.0_r_tran/( real( tracer_inner_prod, r_tran ) + EPS )
inner1 = 0.0_r_tran
inner1 = inner1 + real( advective_increment_inner_prod, r_tran )*advective_increment_sf
@@ -146,7 +145,7 @@ module adjt_w3h_adv_upd_lookup_alg_mod
adv_inc_adv_inc_inp_inner_prod = 0.0_r_def
tracer_tracer_input_inner_prod = 0.0_r_def
- lookup_w3h_adv_upd => adj_lookup_table_cache%get_lookup_w3h_adv_upd()
+ lookup_w3h_adv_upd => adj_lookup_table_cache%get_lookup_w3h_adv_upd(wind%which_function_space())
lookup_w3h_adv_upd_field => lookup_w3h_adv_upd%get_lookup_field()
set_count_w3h_adv_upd_field => lookup_w3h_adv_upd%get_set_count_field()
nsets = lookup_w3h_adv_upd%get_nsets_max()
diff --git a/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_operator_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_operator_alg_mod.x90
index 36906bb77..ae617be40 100644
--- a/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_operator_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_operator_alg_mod.x90
@@ -7,7 +7,7 @@
module adjt_mixed_operator_alg_mod
- use constants_mod, only: i_def, r_def, l_def, r_solver
+ use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_DEBUG, &
@@ -82,8 +82,7 @@ contains
real(kind=r_def) :: inner1, inner2
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
- real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
- real(kind=r_def), parameter :: eps = 1e-30_r_def
+ real(kind=r_def), parameter :: overall_tolerance = 2000.0_r_def
integer(kind=tik) :: id
if ( LPROF ) call start_timing( id, 'adjt_mixed_operator_alg' )
@@ -167,9 +166,9 @@ contains
write(log_scratch_space, *) "w inner product = ", w_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
- p_sf = 1.0_r_def / (p_inner_prod + eps)
- uv_sf = 1.0_r_def / (uv_inner_prod + eps)
- w_sf = 1.0_r_def / (w_inner_prod + eps)
+ p_sf = 1.0_r_def / (p_inner_prod + EPS)
+ uv_sf = 1.0_r_def / (uv_inner_prod + EPS)
+ w_sf = 1.0_r_def / (w_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
diff --git a/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_schur_preconditioner_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_schur_preconditioner_alg_mod.x90
index 5972ce407..d29d53c46 100644
--- a/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_schur_preconditioner_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_schur_preconditioner_alg_mod.x90
@@ -7,7 +7,8 @@
module adjt_mixed_schur_preconditioner_alg_mod
- use constants_mod, only: i_def, r_def, l_def, r_solver
+ use adj_solver_lookup_cache_mod, only: adj_solver_lookup_cache_type
+ use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -59,16 +60,18 @@ contains
!! the result stored in the other, so we use three vectors to save on
!! variables. This differs from other adjoint tests as most adjoint
!! routines would increment one argument and set the other to zero.
- !> @param[in,out] modeldb Structure containing the model state
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine adjt_mixed_schur_preconditioner_alg( modeldb, mesh, model_clock )
+ !> @param[in,out] modeldb Structure containing the model state
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine adjt_mixed_schur_preconditioner_alg( modeldb, mesh, model_clock, adj_lookup_table_cache )
implicit none
- type(modeldb_type), target, intent(inout) :: modeldb
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_solver_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Prognostic fields
type(field_type), dimension(bundle_size) :: rhs
@@ -104,10 +107,9 @@ contains
real(kind=r_def) :: p_sf, uv_sf, w_sf
real(kind=r_def) :: p_p_inp_inner_prod, uv_uv_inp_inner_prod, w_w_inp_inner_prod
real(kind=r_def) :: inner1, inner2
- real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
+ real(kind=r_def), parameter :: overall_tolerance = 1100.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
- real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(kind=tik) :: id
if ( LPROF ) call start_timing( id, 'adjt_mixed_schur_preconditioner_alg' )
@@ -166,7 +168,8 @@ contains
call create_pressure_solver( pressure_operator, pressure_preconditioner, pressure_solver )
call create_mixed_preconditioner( rhs, pressure_solver, mixed_preconditioner )
- call create_adj_pressure_preconditioner( rhs, adj_pressure_operator, adj_pressure_preconditioner )
+ call create_adj_pressure_preconditioner( rhs, adj_lookup_table_cache, &
+ adj_pressure_operator, adj_pressure_preconditioner )
call create_adj_pressure_solver( adj_pressure_operator, adj_pressure_preconditioner, adj_pressure_solver )
call create_adj_mixed_preconditioner( rhs, adj_pressure_solver, adj_mixed_preconditioner )
@@ -200,9 +203,9 @@ contains
write(log_scratch_space, *) "w inner product = ", w_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
- p_sf = 1.0_r_def / (p_inner_prod + eps)
- uv_sf = 1.0_r_def / (uv_inner_prod + eps)
- w_sf = 1.0_r_def / (w_inner_prod + eps)
+ p_sf = 1.0_r_def / (p_inner_prod + EPS)
+ uv_sf = 1.0_r_def / (uv_inner_prod + EPS)
+ w_sf = 1.0_r_def / (w_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
diff --git a/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_solver_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_solver_alg_mod.x90
index bf8b9658d..51b712148 100644
--- a/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_solver_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/solver/adjt_mixed_solver_alg_mod.x90
@@ -7,7 +7,8 @@
module adjt_mixed_solver_alg_mod
- use constants_mod, only: i_def, r_def, l_def, r_solver
+ use adj_solver_lookup_cache_mod, only: adj_solver_lookup_cache_type
+ use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -70,16 +71,18 @@ contains
!! the result stored in the other, so we use three vectors to save on
!! variables. This differs from other adjoint tests as most adjoint
!! routines would increment one argument and set the other to zero.
- !> @param[in,out] modeldb Structure containing the model state
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine adjt_mixed_solver_alg( modeldb, mesh, model_clock )
+ !> @param[in,out] modeldb Structure containing the model state
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine adjt_mixed_solver_alg( modeldb, mesh, model_clock, adj_lookup_table_cache )
implicit none
- type(modeldb_type), target, intent(inout) :: modeldb
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_solver_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Prognostic fields
type(field_type) :: rhs(bundle_size)
@@ -121,10 +124,9 @@ contains
real(kind=r_def) :: p_sf, uv_sf, w_sf
real(kind=r_def) :: p_p_inp_inner_prod, uv_uv_inp_inner_prod, w_w_inp_inner_prod
real(kind=r_def) :: inner1, inner2
- real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
+ real(kind=r_def), parameter :: overall_tolerance = 1300.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
- real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(tik) :: id
if ( LPROF ) call start_timing( id, 'adjt_mixed_solver_alg' )
@@ -196,7 +198,8 @@ contains
call create_mixed_preconditioner( rhs, pressure_solver, mixed_preconditioner )
call create_mixed_solver( mixed_preconditioner, mixed_operator, mixed_solver )
- call create_adj_pressure_preconditioner( rhs, adj_pressure_operator, adj_pressure_preconditioner )
+ call create_adj_pressure_preconditioner( rhs, adj_lookup_table_cache, &
+ adj_pressure_operator, adj_pressure_preconditioner )
call create_adj_pressure_solver( adj_pressure_operator, adj_pressure_preconditioner, adj_pressure_solver )
call create_adj_mixed_preconditioner( rhs, adj_pressure_solver, adj_mixed_preconditioner )
call create_adj_mixed_solver( adj_mixed_preconditioner, adj_mixed_operator, adj_mixed_solver )
@@ -232,9 +235,9 @@ contains
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
! Scaling factors are scaled up a bit to avoid numerical issues
- p_sf = 1.0E4_r_def / (p_inner_prod + eps)
- uv_sf = 1.0E4_r_def / (uv_inner_prod + eps)
- w_sf = 1.0E4_r_def / (w_inner_prod + eps)
+ p_sf = 1.0E4_r_def / (p_inner_prod + EPS)
+ uv_sf = 1.0E4_r_def / (uv_inner_prod + EPS)
+ w_sf = 1.0E4_r_def / (w_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
diff --git a/applications/adjoint_tests/source/algorithm/solver/adjt_pressure_precon_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/solver/adjt_pressure_precon_alg_mod.x90
index 0e2ae0aa6..ea0c0eb80 100644
--- a/applications/adjoint_tests/source/algorithm/solver/adjt_pressure_precon_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/solver/adjt_pressure_precon_alg_mod.x90
@@ -7,7 +7,8 @@
module adjt_pressure_precon_alg_mod
- use constants_mod, only: i_def, r_def, l_def, r_solver
+ use adj_solver_lookup_cache_mod, only: adj_solver_lookup_cache_type
+ use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -53,16 +54,18 @@ contains
!! the result stored in the other, so we use three vectors to save on
!! variables. This differs from other adjoint tests as most adjoint
!! routines would increment one argument and set the other to zero.
- !> @param[in,out] modeldb Structure containing the model state
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine adjt_pressure_precon_alg( modeldb, mesh, model_clock )
+ !> @param[in,out] modeldb Structure containing the model state
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine adjt_pressure_precon_alg( modeldb, mesh, model_clock, adj_lookup_table_cache )
implicit none
- type(modeldb_type), target, intent(inout) :: modeldb
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_solver_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Prognostic fields
type(field_type), dimension(bundle_size) :: rhs
@@ -96,7 +99,6 @@ contains
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
- real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(tik) :: id
if ( LPROF ) call start_timing( id, 'adjt_pressure_precon_alg' )
@@ -153,7 +155,10 @@ contains
call create_pressure_preconditioner( rhs, pressure_operator, pressure_preconditioner )
- call create_adj_pressure_preconditioner( rhs, adj_pressure_operator, adj_pressure_preconditioner )
+ call create_adj_pressure_preconditioner( rhs, &
+ adj_lookup_table_cache, &
+ adj_pressure_operator, &
+ adj_pressure_preconditioner )
! Size = 1 as only P field needed
vector_x = r_solver_field_vector_type(1_i_def)
@@ -184,7 +189,7 @@ contains
write(log_scratch_space, *) "p inner product = ", p_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
- p_sf = 1.0_r_def / (p_inner_prod + eps)
+ p_sf = 1.0_r_def / (p_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
diff --git a/applications/adjoint_tests/source/algorithm/solver/adjt_scaled_matrix_vector_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/solver/adjt_scaled_matrix_vector_alg_mod.x90
index 81c23dd57..33a2a9f96 100644
--- a/applications/adjoint_tests/source/algorithm/solver/adjt_scaled_matrix_vector_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/solver/adjt_scaled_matrix_vector_alg_mod.x90
@@ -9,7 +9,7 @@
!> @brief Module containing adjoint test for scaled_matrix_vector_kernel
module adjt_scaled_matrix_vector_alg_mod
- use constants_mod, only: i_def, r_def, l_def, r_solver
+ use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use field_mod, only: field_type
use finite_element_config_mod, only: element_order_h, element_order_v
use fs_continuity_mod, only: W2, W3, Wtheta
@@ -77,7 +77,6 @@ module adjt_scaled_matrix_vector_alg_mod
real(kind=r_def) :: machine_tolerance
real(kind=r_def) :: relative_diff
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Setup
@@ -128,7 +127,7 @@ module adjt_scaled_matrix_vector_alg_mod
write(log_scratch_space, *) "vector inner product = ", vector_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )
- vector_sf = 1.0_r_def / (vector_inner_prod + eps)
+ vector_sf = 1.0_r_def / (vector_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + vector_inner_prod * vector_sf
diff --git a/applications/adjoint_tests/source/algorithm/solver/adjt_semi_implicit_solver_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/solver/adjt_semi_implicit_solver_step_alg_mod.x90
index 2492720a6..3e61588ff 100644
--- a/applications/adjoint_tests/source/algorithm/solver/adjt_semi_implicit_solver_step_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/solver/adjt_semi_implicit_solver_step_alg_mod.x90
@@ -7,7 +7,8 @@
module adjt_semi_implicit_solver_step_alg_mod
- use constants_mod, only: i_def, r_def, l_def, r_solver
+ use adj_solver_lookup_cache_mod, only: adj_solver_lookup_cache_type
+ use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -47,16 +48,18 @@ contains
!> @brief Adjoint test for semi_implicit_solver_alg_mod subroutine step
!> @details Does some setup, then calls the actual test via a private subroutine
!! twice with different flag values
- !> @param[in,out] modeldb Structure containing the model state
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine adjt_semi_implicit_solver_step_alg( modeldb, mesh, model_clock )
+ !> @param[in,out] modeldb Structure containing the model state
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine adjt_semi_implicit_solver_step_alg( modeldb, mesh, model_clock, adj_lookup_table_cache )
implicit none
- type(modeldb_type), target, intent(inout) :: modeldb
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_solver_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Prognostic fields
type(field_type), dimension(bundle_size) :: state
@@ -153,7 +156,7 @@ contains
call compute_si_operators( ls_theta, ls_rho, ls_exner, &
model_clock, ls_moist_dyn )
- call adj_semi_implicit_solver%initialise(rhs)
+ call adj_semi_implicit_solver%initialise(rhs, adj_lookup_table_cache)
! Set up moist_dyn_gas_law & mr
call moist_dyn_gas_law%initialise(vector_space=vector_space_wtheta_ptr)
@@ -255,7 +258,6 @@ contains
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
- real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(kind=i_def) :: i
@@ -311,17 +313,17 @@ contains
end do
! Scaling factors are scaled up a bit to avoid numerical issues
- state_sf(igh_u) = 1.0E4_r_def / (state_inner_prod(igh_u) + eps)
- state_sf(igh_t) = 1.0E4_r_def / (state_inner_prod(igh_t) + eps)
- state_sf(igh_d) = 1.0E4_r_def / (state_inner_prod(igh_d) + eps)
- state_sf(igh_p) = 1.0E4_r_def / (state_inner_prod(igh_p) + eps)
- rhs_sf(igh_u) = 1.0E4_r_def / (rhs_inner_prod(igh_u) + eps)
- rhs_sf(igh_t) = 1.0E4_r_def / (rhs_inner_prod(igh_t) + eps)
- rhs_sf(igh_d) = 1.0E4_r_def / (rhs_inner_prod(igh_d) + eps)
- rhs_sf(igh_p) = 1.0E4_r_def / (rhs_inner_prod(igh_p) + eps)
- moist_dyn_gas_law_sf = 1.0E4_r_def / (moist_dyn_gas_law_inner_prod + eps)
+ state_sf(igh_u) = 1.0E4_r_def / (state_inner_prod(igh_u) + EPS)
+ state_sf(igh_t) = 1.0E4_r_def / (state_inner_prod(igh_t) + EPS)
+ state_sf(igh_d) = 1.0E4_r_def / (state_inner_prod(igh_d) + EPS)
+ state_sf(igh_p) = 1.0E4_r_def / (state_inner_prod(igh_p) + EPS)
+ rhs_sf(igh_u) = 1.0E4_r_def / (rhs_inner_prod(igh_u) + EPS)
+ rhs_sf(igh_t) = 1.0E4_r_def / (rhs_inner_prod(igh_t) + EPS)
+ rhs_sf(igh_d) = 1.0E4_r_def / (rhs_inner_prod(igh_d) + EPS)
+ rhs_sf(igh_p) = 1.0E4_r_def / (rhs_inner_prod(igh_p) + EPS)
+ moist_dyn_gas_law_sf = 1.0E4_r_def / (moist_dyn_gas_law_inner_prod + EPS)
do i = 1, nummr
- mr_sf(i) = 1.0E4_r_def / (mr_inner_prod(i) + eps)
+ mr_sf(i) = 1.0E4_r_def / (mr_inner_prod(i) + EPS)
end do
inner1 = 0.0_r_def
diff --git a/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90
index 9342ce993..7fa6bf71e 100644
--- a/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90
@@ -21,7 +21,7 @@ module adjt_end_transport_step_alg_mod
use model_clock_mod, only : model_clock_type
use finite_element_config_mod, only : element_order_h, &
element_order_v
- use fs_continuity_mod, only : W2
+ use fs_continuity_mod, only : W2, W2V
use function_space_collection_mod, only : function_space_collection
use setup_test_alg_mod, only : setup_test_tl_transport_controller
use init_from_controller_alg_mod, only : init_counter_fieldvals
@@ -78,6 +78,7 @@ module adjt_end_transport_step_alg_mod
! Variables for initialising fields
type(function_space_type), pointer :: vector_space_w2_ptr
+ type(function_space_type), pointer :: vector_space_w2v_ptr
! Inner products
real(kind=r_tran) :: inner1
@@ -108,13 +109,16 @@ module adjt_end_transport_step_alg_mod
vector_space_w2_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W2 &
- )
+ )
+ vector_space_w2v_ptr => function_space_collection%get_fs( &
+ mesh, element_order_h, element_order_v, W2V)
+ ! Assume that the last split step is in W2V (for VHV splitting)
call sum_flux%initialise( vector_space = vector_space_w2_ptr )
- call flux_last_step%initialise( vector_space = vector_space_w2_ptr )
+ call flux_last_step%initialise( vector_space = vector_space_w2v_ptr )
call sum_flux_input%initialise( vector_space = vector_space_w2_ptr )
- call flux_last_step_input%initialise( vector_space = vector_space_w2_ptr )
+ call flux_last_step_input%initialise( vector_space = vector_space_w2v_ptr )
sum_flux_inner_prod = 0.0_r_def
flux_last_step_inner_prod = 0.0_r_def
diff --git a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90
index 08a3b7a2b..a4d64e064 100644
--- a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90
@@ -21,12 +21,14 @@ module atlt_end_transport_step_alg_mod
use model_clock_mod, only : model_clock_type
use finite_element_config_mod, only : element_order_h, &
element_order_v
- use fs_continuity_mod, only : W2, W3
+ use fs_continuity_mod, only : W2, W3, W2V
use function_space_collection_mod, only : function_space_collection
use tl_transport_controller_mod, only : tl_transport_controller_type
use transport_controller_mod, only : transport_controller_type
use flux_precomputations_alg_mod, only : flux_precomputations_type
use transport_counter_mod, only : transport_counter_type
+ use split_transport_utils_mod, only : get_num_split_steps, &
+ get_direction_w2_fs
use setup_test_alg_mod, only : setup_test_tl_transport_controller
use transport_metadata_collection_mod, only : transport_metadata_collection
use transport_metadata_mod, only : transport_metadata_type
@@ -233,6 +235,9 @@ module atlt_end_transport_step_alg_mod
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_2_inp
! Variables for initialising fields
+ integer(kind=i_def) :: splitting
+ integer(kind=i_def) :: num_split_steps
+ integer(kind=i_def) :: fs_id
type(function_space_type), pointer :: vector_space_w2_ptr
type(function_space_type), pointer :: vector_space_w3_ptr
@@ -284,11 +289,16 @@ module atlt_end_transport_step_alg_mod
dummy_ref_mass_2_inp, &
pert_transport_controller )
- vector_space_w2_ptr => function_space_collection%get_fs( &
- mesh, element_order_h, element_order_v, W2 &
+ ! W2 function space appropriate for splitting (fs on the last step)
+ splitting = transport_metadata%get_splitting()
+ num_split_steps = get_num_split_steps(splitting)
+ fs_id = get_direction_w2_fs(splitting, num_split_steps)
+ vector_space_w2_ptr => function_space_collection%get_fs( &
+ mesh, element_order_h, element_order_v, fs_id &
)
- vector_space_w3_ptr => function_space_collection%get_fs( &
- mesh, element_order_h, element_order_v, W3 &
+
+ vector_space_w3_ptr => function_space_collection%get_fs( &
+ mesh, element_order_h, element_order_v, W3 &
)
call field_np1%initialise( vector_space = vector_space_w3_ptr )
diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_moist_mr_transport_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_moist_mr_transport_alg_mod.x90
index fe4808112..0f706f161 100644
--- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_moist_mr_transport_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_moist_mr_transport_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing adjoint test for atl_moist_mr_transport_alg
module atlt_moist_mr_transport_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
@@ -49,9 +50,10 @@ module atlt_moist_mr_transport_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products < Mx, Mx > and < AMx, x >,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_moist_mr_transport_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_moist_mr_transport_alg( mesh, model_clock, adj_lookup_table_cache )
use tl_moist_mr_transport_alg_mod, only : tl_moist_mr_transport_alg
use atl_moist_mr_transport_alg_mod, only : atl_moist_mr_transport_alg
@@ -59,8 +61,9 @@ module atlt_moist_mr_transport_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type), dimension(:), allocatable :: mr_out
@@ -202,8 +205,9 @@ module atlt_moist_mr_transport_alg_mod
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_3d )
! Adjoint
- call atl_moist_mr_transport_alg( mr_out, mr_in, ls_mr_in, &
- nummr_to_transport, tl_transport_controller, transport_metadata )
+ call atl_moist_mr_transport_alg( mr_out, mr_in, ls_mr_in, nummr_to_transport, &
+ tl_transport_controller, transport_metadata, &
+ adj_lookup_table_cache )
! < AMx, x >
inner2 = 0.0_r_def
diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_theta_transport_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_theta_transport_alg_mod.x90
index 711799f0b..1b027ea72 100644
--- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_theta_transport_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_theta_transport_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing adjoint test for atl_theta_transport_alg
module atlt_theta_transport_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
@@ -48,9 +49,10 @@ module atlt_theta_transport_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_theta_transport_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_theta_transport_alg( mesh, model_clock, adj_lookup_table_cache )
use tl_theta_transport_alg_mod, only : tl_theta_transport_alg
use atl_theta_transport_alg_mod, only : atl_theta_transport_alg
@@ -58,8 +60,9 @@ module atlt_theta_transport_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: theta_out
@@ -212,7 +215,8 @@ module atlt_theta_transport_alg_mod
! Adjoint
call atl_theta_transport_alg( theta_out, theta_inc, theta_in, ls_theta_in, &
- tl_transport_controller, transport_metadata )
+ tl_transport_controller, transport_metadata, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( thout_thout_inp_inner_prod, &
diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_control_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_control_alg_mod.x90
index 93f7e94aa..3ac396cab 100644
--- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_control_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_control_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing adjoint test for atl_transport_control_alg
module atlt_transport_control_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
use constants_mod, only : r_def, i_def, l_def
@@ -34,16 +35,18 @@ module atlt_transport_control_alg_mod
!=============================================================================
!> @brief Adjoint test for atl_transport_control_alg
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
!>
- subroutine atlt_transport_control_alg( mesh, model_clock )
+ subroutine atlt_transport_control_alg( mesh, model_clock, adj_lookup_table_cache )
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Passive arguments for tl and adj calls
type(field_type) :: ls_advected_fields(bundle_size)
@@ -102,7 +105,8 @@ module atlt_transport_control_alg_mod
ls_wind_n, &
ls_mr_in, &
model_clock, &
- outer )
+ outer, &
+ adj_lookup_table_cache )
end do
@@ -119,6 +123,7 @@ module atlt_transport_control_alg_mod
!> @param[in] ls_mr_in Linearisation state mixing ratios
!> @param[in] model_clock The model clock
!> @param[in] outer The outer iteration variable
+ !> @param[in] adj_lookup_table_cache Lookup table cache
!>
subroutine run_atlt_transport_control_alg( vector_space_wtheta_ptr, &
vector_space_w2_ptr, &
@@ -128,7 +133,8 @@ module atlt_transport_control_alg_mod
ls_wind_n, &
ls_mr_in, &
model_clock, &
- outer )
+ outer, &
+ adj_lookup_table_cache )
use tl_transport_control_alg_mod, only : tl_transport_control_alg
use atl_transport_control_alg_mod, only : atl_transport_control_alg
@@ -145,6 +151,7 @@ module atlt_transport_control_alg_mod
type(field_type), dimension(:), intent(in) :: ls_mr_in
type(model_clock_type), intent(in) :: model_clock
integer(kind=i_def), intent(in) :: outer
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Active arguments for tl and adj calls
type(field_type) :: advection_inc(bundle_size)
@@ -367,7 +374,7 @@ module atlt_transport_control_alg_mod
wind_np1, wind_n, mr_out, mr_in, &
ls_advected_fields, &
ls_wind_np1, ls_wind_n, ls_mr_in, &
- model_clock, outer )
+ model_clock, outer, adj_lookup_table_cache )
! < AMx, x >
ai_ai_inp_inner_prod = 0.0_r_def
diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90
index d1120743d..182c70400 100644
--- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing adjoint test for atl_transport_field_alg
module atlt_transport_field_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
@@ -27,13 +28,19 @@ module atlt_transport_field_alg_mod
use setup_test_alg_mod, only : setup_test_tl_transport_controller
use inner_from_controller_rdef_alg_mod, only : flux_pc_ref_flux_prod_rdef, &
flux_pc_ref_flux_inp_prod_rdef, &
+ counter_flux_prod_rdef, &
+ counter_flux_inp_prod_rdef, &
+ counter_field_n_prod_rdef, &
+ counter_field_n_inp_prod_rdef, &
wind_pc_dir_prod_rdef, &
wind_pc_dir_inp_prod_rdef
use init_from_controller_alg_mod, only : init_flux_pc_fieldvals, &
- init_wind_pc_fieldvals
+ init_wind_pc_fieldvals, &
+ init_counter_fieldvals
use transport_enumerated_types_mod, only : direction_3d, &
direction_h, &
direction_v
+ use fs_continuity_mod, only : W3
implicit none
@@ -47,9 +54,10 @@ module atlt_transport_field_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_transport_field_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_transport_field_alg( mesh, model_clock, adj_lookup_table_cache )
use tl_transport_field_mod, only : tl_transport_field
use atl_transport_field_mod, only : atl_transport_field
@@ -57,8 +65,9 @@ module atlt_transport_field_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: field_np1
@@ -86,18 +95,25 @@ module atlt_transport_field_alg_mod
! Variables used to handle calculations for fields stored in tl_transport_controller
integer(kind=i_def) :: mesh_id
+ type(transport_controller_type), pointer :: transport_controller
type(transport_controller_type), pointer :: pert_transport_controller
type(transport_controller_type), pointer :: ls_transport_controller
type(transport_metadata_type), pointer :: transport_metadata
type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp
+ type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp2
type(r_tran_field_type), dimension(:), allocatable :: fpc_pert_wind_ref_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_2_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_2_inp
+ type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_3_inp
+ type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_3_inp
type(r_tran_field_type) :: wind_pc_h_inp
type(r_tran_field_type) :: wind_pc_v_inp
type(r_tran_field_type) :: wind_pc_3d_inp
+ type(r_tran_field_type) :: tctr_field_n_inp
+ type(r_tran_field_type), dimension(:), allocatable :: tctr_flux_inp
+ type(function_space_type), pointer :: vector_space_w3_ptr
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -106,11 +122,16 @@ module atlt_transport_field_alg_mod
mesh_id = mesh%get_id()
call setup_test_tl_transport_controller( mesh, model_clock, tl_transport_controller, field_n, field_n_fs )
+ transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller()
ls_transport_controller => tl_transport_controller%get_ls_wind_pert_rho_controller()
pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller()
transport_metadata => pert_transport_controller%get_transport_metadata()
! Initialising fields
+ call init_counter_fieldvals( mesh, &
+ tctr_field_n_inp, &
+ tctr_flux_inp, &
+ pert_transport_controller )
call init_flux_pc_fieldvals( mesh, &
1_i_def, &
fpc_ls_wind_ref_flux_inp, &
@@ -123,6 +144,12 @@ module atlt_transport_field_alg_mod
dummy_ref_field_2_inp, &
dummy_ref_mass_2_inp, &
pert_transport_controller )
+ call init_flux_pc_fieldvals( mesh, &
+ 1_i_def, &
+ fpc_ls_wind_ref_flux_inp2, &
+ dummy_ref_field_3_inp, &
+ dummy_ref_mass_3_inp, &
+ transport_controller )
call init_wind_pc_fieldvals( mesh, &
wind_pc_h_inp, &
direction_h, &
@@ -136,6 +163,11 @@ module atlt_transport_field_alg_mod
direction_3d, &
pert_transport_controller )
+ vector_space_w3_ptr => function_space_collection%get_fs( &
+ mesh, element_order_h, element_order_v, W3 &
+ )
+ call field_n%initialise(vector_space = vector_space_w3_ptr)
+
call field_n%copy_field_properties( field_np1 )
call field_n%copy_field_properties( ls_field_n )
@@ -147,6 +179,7 @@ module atlt_transport_field_alg_mod
! Initialise values and call the tangent-linear alg.
call invoke( setval_random( field_np1 ), &
+ setval_random( field_n ), &
setval_x( field_np1_input, field_np1 ), &
setval_x( field_n_input, field_n ), &
setval_random( ls_field_n ) )
@@ -179,6 +212,7 @@ module atlt_transport_field_alg_mod
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_h )
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_v )
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_3d )
+ call counter_flux_prod_rdef( inner1, pert_transport_controller )
! Scaling fields
call invoke( inc_a_times_X( field_np1_sf, field_np1 ), &
@@ -191,7 +225,8 @@ module atlt_transport_field_alg_mod
! Adjoint
call atl_transport_field( &
field_np1, field_n, ls_field_n, &
- tl_transport_controller, transport_metadata &
+ tl_transport_controller, transport_metadata, &
+ adj_lookup_table_cache &
)
! < AMx, x >
@@ -210,6 +245,7 @@ module atlt_transport_field_alg_mod
call wind_pc_dir_inp_prod_rdef( inner2, pert_transport_controller, mesh_id, direction_h, wind_pc_h_inp )
call wind_pc_dir_inp_prod_rdef( inner2, pert_transport_controller, mesh_id, direction_v, wind_pc_v_inp )
call wind_pc_dir_inp_prod_rdef( inner2, pert_transport_controller, mesh_id, direction_3d, wind_pc_3d_inp )
+ call counter_flux_inp_prod_rdef( inner2, pert_transport_controller, tctr_flux_inp )
call tl_transport_controller%finalise()
if ( allocated(fpc_ls_wind_ref_flux_inp) ) deallocate( fpc_ls_wind_ref_flux_inp )
diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_wind_transport_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_wind_transport_alg_mod.x90
index 8fd27ff48..480c73a96 100644
--- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_wind_transport_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_wind_transport_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing adjoint test for atl_wind_transport_alg
module atlt_wind_transport_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
@@ -48,9 +49,10 @@ module atlt_wind_transport_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_wind_transport_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_wind_transport_alg( mesh, model_clock, adj_lookup_table_cache )
use tl_wind_transport_alg_mod, only : tl_wind_transport_alg
use atl_wind_transport_alg_mod, only : atl_wind_transport_alg
@@ -58,8 +60,9 @@ module atlt_wind_transport_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: rhs_u
@@ -194,8 +197,9 @@ module atlt_wind_transport_alg_mod
wn_wn_inp_inner_prod = 0.0_r_def
! Adjoint
- call atl_wind_transport_alg( rhs_u, wind_n, ls_wind_n, &
- tl_transport_controller, transport_metadata )
+ call atl_wind_transport_alg( rhs_u, wind_n, ls_wind_n, &
+ tl_transport_controller, transport_metadata, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( ru_ru_inp_inner_prod, &
diff --git a/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90
index 17e300fa3..d33548660 100644
--- a/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90
@@ -222,7 +222,9 @@ module init_from_controller_alg_mod
if ( flux_ptr%is_initialised() ) then
call invoke( setval_X( counter_flux_inp(step), flux_ptr ) )
else
- call invoke( setval_c( counter_flux_inp(step), 0.0_r_tran ) )
+ call counter_flux_inp(step)%copy_field_properties(flux_ptr)
+ call invoke( setval_random( flux_ptr ), &
+ setval_X( counter_flux_inp(step), flux_ptr ) )
end if
end do
diff --git a/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rdef_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rdef_alg_mod.x90
index d98491647..bef3c3a70 100644
--- a/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rdef_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rdef_alg_mod.x90
@@ -8,7 +8,7 @@
module inner_from_controller_rdef_alg_mod
- use constants_mod, only : i_def, l_def, r_def
+ use constants_mod, only : i_def, l_def, r_def, EPS
use field_mod, only : field_type
use r_tran_field_mod, only : r_tran_field_type
use transport_controller_mod, only : transport_controller_type
@@ -72,7 +72,6 @@ module inner_from_controller_rdef_alg_mod
type(flux_precomputations_type), pointer :: flux_pc
type(r_tran_field_type), pointer :: ref_flux_ptr
real(kind=r_def) :: flux_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
integer(kind=i_def) :: mesh_id_from_idx
@@ -88,7 +87,7 @@ module inner_from_controller_rdef_alg_mod
flux_inner_prod = 0.0_r_def
if ( ref_flux_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( flux_inner_prod, ref_flux_ptr ) )
- flux_sf = 1.0_r_def/(flux_inner_prod + eps)
+ flux_sf = 1.0_r_def/(flux_inner_prod + EPS)
inner = inner + flux_inner_prod*flux_sf
write(log_scratch_space, *) "Flux precomputations ref_flux(step = ", step, ") inner prod = ", &
flux_inner_prod
@@ -164,7 +163,6 @@ module inner_from_controller_rdef_alg_mod
type(flux_precomputations_type), pointer :: flux_pc
type(r_tran_field_type), pointer :: ref_field_ptr
real(kind=r_def) :: field_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
integer(kind=i_def) :: mesh_id_from_idx
@@ -181,7 +179,7 @@ module inner_from_controller_rdef_alg_mod
field_inner_prod = 0.0_r_def
if ( ref_field_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( field_inner_prod, ref_field_ptr ) )
- field_sf = 1.0_r_def/(field_inner_prod + eps)
+ field_sf = 1.0_r_def/(field_inner_prod + EPS)
inner = inner + field_inner_prod*field_sf
write(log_scratch_space, *) "Flux precomputations ref_field(step = ", step, ") inner prod = ", &
field_inner_prod
@@ -256,7 +254,6 @@ module inner_from_controller_rdef_alg_mod
type(flux_precomputations_type), pointer :: flux_pc
type(r_tran_field_type), pointer :: ref_mass_ptr
real(kind=r_def) :: mass_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
integer(kind=i_def) :: mesh_id_from_idx
@@ -273,7 +270,7 @@ module inner_from_controller_rdef_alg_mod
mass_inner_prod = 0.0_r_def
if ( ref_mass_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( mass_inner_prod, ref_mass_ptr ) )
- mass_sf = 1.0_r_def/(mass_inner_prod + eps)
+ mass_sf = 1.0_r_def/(mass_inner_prod + EPS)
inner = inner + mass_inner_prod*mass_sf
write(log_scratch_space, *) "Flux precomputations ref_mass(step = ", step, ") inner prod = ", &
mass_inner_prod
@@ -345,7 +342,6 @@ module inner_from_controller_rdef_alg_mod
type(transport_counter_type), pointer :: transport_counter
type(r_tran_field_type), pointer :: flux_ptr
real(kind=r_def) :: flux_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
real(kind=r_def) :: flux_inner_prod
@@ -358,7 +354,7 @@ module inner_from_controller_rdef_alg_mod
flux_inner_prod = 0.0_r_def
if ( flux_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( flux_inner_prod, flux_ptr ) )
- flux_sf = 1.0_r_def/(flux_inner_prod + eps)
+ flux_sf = 1.0_r_def/(flux_inner_prod + EPS)
inner = inner + flux_inner_prod*flux_sf
write(log_scratch_space, *) "Transport counter flux(step = ", step, ") inner prod = ", &
flux_inner_prod
@@ -425,7 +421,6 @@ module inner_from_controller_rdef_alg_mod
type(transport_counter_type), pointer :: transport_counter
type(r_tran_field_type), pointer :: field_n_ptr
real(kind=r_def) :: field_n_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
real(kind=r_def) :: field_n_inner_prod
transport_counter => transport_controller%get_transport_counter()
@@ -434,7 +429,7 @@ module inner_from_controller_rdef_alg_mod
if ( field_n_ptr%is_initialised() ) then
field_n_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( field_n_inner_prod, field_n_ptr ) )
- field_n_sf = 1.0_r_def/(field_n_inner_prod + eps)
+ field_n_sf = 1.0_r_def/(field_n_inner_prod + EPS)
inner = inner + field_n_inner_prod*field_n_sf
write(log_scratch_space, *) "Transport counter field_n inner prod = ", &
field_n_inner_prod
@@ -499,7 +494,6 @@ module inner_from_controller_rdef_alg_mod
type(wind_precomputations_type), pointer :: wind_pc
type(r_tran_field_type), pointer :: wind_ptr
real(kind=r_def) :: wind_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
real(kind=r_def) :: wind_inner_prod
wind_pc => transport_controller%get_wind_precomputations()
@@ -508,7 +502,7 @@ module inner_from_controller_rdef_alg_mod
if ( wind_ptr%is_initialised() ) then
wind_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( wind_inner_prod, wind_ptr ) )
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner = inner + wind_inner_prod*wind_sf
write(log_scratch_space, *) "Wind precomputations(delta_t = ", delta_t, ") inner prod = ", &
wind_inner_prod
@@ -579,7 +573,6 @@ module inner_from_controller_rdef_alg_mod
type(wind_precomputations_type), pointer :: wind_pc
type(r_tran_field_type), pointer :: wind_ptr
real(kind=r_def) :: wind_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
real(kind=r_def) :: wind_inner_prod
wind_pc => transport_controller%get_wind_precomputations()
@@ -588,7 +581,7 @@ module inner_from_controller_rdef_alg_mod
if ( wind_ptr%is_initialised() ) then
wind_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( wind_inner_prod, wind_ptr ) )
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner = inner + wind_inner_prod*wind_sf
write(log_scratch_space, *) "Wind precomputations(direction = ", direction, ") inner prod = ", &
wind_inner_prod
@@ -652,7 +645,6 @@ module inner_from_controller_rdef_alg_mod
! Internal variables
type(r_tran_field_type), pointer :: ref_field_ptr
real(kind=r_def) :: ref_field_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
real(kind=r_def) :: ref_field_inner_prod
ref_field_ptr => transport_controller%get_ref_field()
@@ -660,7 +652,7 @@ module inner_from_controller_rdef_alg_mod
if ( ref_field_ptr%is_initialised() ) then
ref_field_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( ref_field_inner_prod, ref_field_ptr ) )
- ref_field_sf = 1.0_r_def/(ref_field_inner_prod + eps)
+ ref_field_sf = 1.0_r_def/(ref_field_inner_prod + EPS)
inner = inner + ref_field_inner_prod*ref_field_sf
write(log_scratch_space, *) "Transport controller ref_field inner prod = ", &
ref_field_inner_prod
@@ -719,7 +711,6 @@ module inner_from_controller_rdef_alg_mod
! Internal variables
type(r_tran_field_type), pointer :: wind_ptr
real(kind=r_def) :: wind_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
real(kind=r_def) :: wind_inner_prod
wind_ptr => transport_controller%get_wind_npdt( delta_t )
@@ -727,7 +718,7 @@ module inner_from_controller_rdef_alg_mod
if ( wind_ptr%is_initialised() ) then
wind_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( wind_inner_prod, wind_ptr ) )
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner = inner + wind_inner_prod*wind_sf
write(log_scratch_space, *) "Transport controller wind(delta_t = ", delta_t, ") inner prod = ", &
wind_inner_prod
@@ -786,7 +777,6 @@ module inner_from_controller_rdef_alg_mod
! Internal variables
type(r_tran_field_type), pointer :: wind_ptr
real(kind=r_def) :: wind_sf
- real(kind=r_def), parameter :: eps = 1.0e-30_r_def
real(kind=r_def) :: wind_inner_prod
wind_ptr => transport_controller%get_transporting_wind()
@@ -794,7 +784,7 @@ module inner_from_controller_rdef_alg_mod
if ( wind_ptr%is_initialised() ) then
wind_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( wind_inner_prod, wind_ptr ) )
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner = inner + wind_inner_prod*wind_sf
write(log_scratch_space, *) "Transport controller transporting_wind inner prod = ", &
wind_inner_prod
diff --git a/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rtran_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rtran_alg_mod.x90
index 4a56dd02e..2ee21745e 100644
--- a/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rtran_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/inner_from_controller_rtran_alg_mod.x90
@@ -8,7 +8,8 @@
module inner_from_controller_rtran_alg_mod
- use constants_mod, only : i_def, l_def, r_def, r_tran
+ use constants_mod, only : i_def, l_def, r_def, &
+ r_tran, EPS
use r_tran_field_mod, only : r_tran_field_type
use transport_controller_mod, only : transport_controller_type
use flux_precomputations_alg_mod, only : flux_precomputations_type
@@ -62,7 +63,6 @@ module inner_from_controller_rtran_alg_mod
type(flux_precomputations_type), pointer :: flux_pc
type(r_tran_field_type), pointer :: ref_flux_ptr
real(kind=r_tran) :: flux_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
integer(kind=i_def) :: mesh_id_from_idx
@@ -79,7 +79,7 @@ module inner_from_controller_rtran_alg_mod
flux_inner_prod = 0.0_r_def
if ( ref_flux_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( flux_inner_prod, ref_flux_ptr ) )
- flux_sf = 1.0_r_tran/( real(flux_inner_prod, r_tran) + eps )
+ flux_sf = 1.0_r_tran/( real(flux_inner_prod, r_tran) + EPS )
inner = inner + real( flux_inner_prod, r_tran )*flux_sf
write(log_scratch_space, *) "Flux precomputations ref_flux(step = ", step, ") inner prod = ", &
real( flux_inner_prod, r_tran )
@@ -154,7 +154,6 @@ module inner_from_controller_rtran_alg_mod
type(flux_precomputations_type), pointer :: flux_pc
type(r_tran_field_type), pointer :: ref_field_ptr
real(kind=r_tran) :: field_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
integer(kind=i_def) :: mesh_id_from_idx
@@ -171,7 +170,7 @@ module inner_from_controller_rtran_alg_mod
field_inner_prod = 0.0_r_def
if ( ref_field_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( field_inner_prod, ref_field_ptr ) )
- field_sf = 1.0_r_tran/( real( field_inner_prod, r_tran ) + eps )
+ field_sf = 1.0_r_tran/( real( field_inner_prod, r_tran ) + EPS )
inner = inner + real( field_inner_prod, r_tran )*field_sf
write(log_scratch_space, *) "Flux precomputations ref_field(step = ", step, ") inner prod = ", &
real( field_inner_prod, r_tran )
@@ -246,7 +245,6 @@ module inner_from_controller_rtran_alg_mod
type(flux_precomputations_type), pointer :: flux_pc
type(r_tran_field_type), pointer :: ref_mass_ptr
real(kind=r_tran) :: mass_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
integer(kind=i_def) :: mesh_id_from_idx
@@ -263,7 +261,7 @@ module inner_from_controller_rtran_alg_mod
mass_inner_prod = 0.0_r_def
if ( ref_mass_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( mass_inner_prod, ref_mass_ptr ) )
- mass_sf = 1.0_r_tran/( real( mass_inner_prod, r_tran ) + eps )
+ mass_sf = 1.0_r_tran/( real( mass_inner_prod, r_tran ) + EPS )
inner = inner + real( mass_inner_prod, r_tran )*mass_sf
write(log_scratch_space, *) "Flux precomputations ref_mass(step = ", step, ") inner prod = ", &
real( mass_inner_prod, r_tran )
@@ -335,7 +333,6 @@ module inner_from_controller_rtran_alg_mod
type(transport_counter_type), pointer :: transport_counter
type(r_tran_field_type), pointer :: flux_ptr
real(kind=r_tran) :: flux_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
integer(kind=i_def) :: step
integer(kind=i_def) :: num_steps
real(kind=r_def) :: flux_inner_prod
@@ -348,7 +345,7 @@ module inner_from_controller_rtran_alg_mod
flux_inner_prod = 0.0_r_def
if ( flux_ptr%is_initialised() ) then
call invoke( x_innerproduct_x( flux_inner_prod, flux_ptr ) )
- flux_sf = 1.0_r_tran/( real( flux_inner_prod, r_tran ) + eps )
+ flux_sf = 1.0_r_tran/( real( flux_inner_prod, r_tran ) + EPS )
inner = inner + real( flux_inner_prod, r_tran )*flux_sf
write(log_scratch_space, *) "Transport counter flux(step = ", step, ") inner prod = ", &
real( flux_inner_prod, r_tran )
@@ -413,7 +410,6 @@ module inner_from_controller_rtran_alg_mod
type(transport_counter_type), pointer :: transport_counter
type(r_tran_field_type), pointer :: field_n_ptr
real(kind=r_tran) :: field_n_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
real(kind=r_def) :: field_n_inner_prod
transport_counter => transport_controller%get_transport_counter()
@@ -422,7 +418,7 @@ module inner_from_controller_rtran_alg_mod
if ( field_n_ptr%is_initialised() ) then
field_n_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( field_n_inner_prod, field_n_ptr ) )
- field_n_sf = 1.0_r_tran/( real( field_n_inner_prod, r_tran ) + eps )
+ field_n_sf = 1.0_r_tran/( real( field_n_inner_prod, r_tran ) + EPS )
inner = inner + real( field_n_inner_prod, r_tran )*field_n_sf
write(log_scratch_space, *) "Transport counter field_n inner prod = ", &
real( field_n_inner_prod, r_tran )
@@ -487,7 +483,6 @@ module inner_from_controller_rtran_alg_mod
type(wind_precomputations_type), pointer :: wind_pc
type(r_tran_field_type), pointer :: wind_ptr
real(kind=r_tran) :: wind_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
real(kind=r_def) :: wind_inner_prod
wind_pc => transport_controller%get_wind_precomputations()
@@ -496,7 +491,7 @@ module inner_from_controller_rtran_alg_mod
if ( wind_ptr%is_initialised() ) then
wind_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( wind_inner_prod, wind_ptr ) )
- wind_sf = 1.0_r_tran/( real( wind_inner_prod, r_tran ) + eps )
+ wind_sf = 1.0_r_tran/( real( wind_inner_prod, r_tran ) + EPS )
inner = inner + real( wind_inner_prod, r_tran )*wind_sf
write(log_scratch_space, *) "Wind precomputations(delta_t = ", delta_t, ") inner prod = ", &
real( wind_inner_prod, r_tran )
@@ -567,7 +562,6 @@ module inner_from_controller_rtran_alg_mod
type(wind_precomputations_type), pointer :: wind_pc
type(r_tran_field_type), pointer :: wind_ptr
real(kind=r_tran) :: wind_sf
- real(kind=r_tran), parameter :: eps = 1.0e-30_r_tran
real(kind=r_def) :: wind_inner_prod
wind_pc => transport_controller%get_wind_precomputations()
@@ -576,7 +570,7 @@ module inner_from_controller_rtran_alg_mod
if ( wind_ptr%is_initialised() ) then
wind_inner_prod = 0.0_r_def
call invoke( x_innerproduct_x( wind_inner_prod, wind_ptr ) )
- wind_sf = 1.0_r_tran/( real( wind_inner_prod, r_tran ) + eps )
+ wind_sf = 1.0_r_tran/( real( wind_inner_prod, r_tran ) + EPS )
inner = inner + real( wind_inner_prod, r_tran )*wind_sf
write(log_scratch_space, *) "Wind precomputations(direction = ", direction, ") inner prod = ", &
real( wind_inner_prod, r_tran )
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/adjt_reconstruct_w3_field_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/adjt_reconstruct_w3_field_alg_mod.x90
index 0ccda5295..164b3d534 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/adjt_reconstruct_w3_field_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/adjt_reconstruct_w3_field_alg_mod.x90
@@ -6,9 +6,10 @@
!> @brief Module containing adjoint test for adj_reconstruct_w3_field_alg
module adjt_reconstruct_w3_field_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
- use constants_mod, only : r_def, i_def, l_def
+ use constants_mod, only : r_def, i_def, l_def, EPS
use log_mod, only : log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -22,7 +23,6 @@ module adjt_reconstruct_w3_field_alg_mod
use function_space_collection_mod, only : function_space_collection
use transport_metadata_collection_mod, only : transport_metadata_collection
use transport_metadata_mod, only : transport_metadata_type
- use check_configuration_mod, only : get_required_stencil_depth
implicit none
@@ -36,9 +36,10 @@ module adjt_reconstruct_w3_field_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine adjt_hori_w3_reconstruct_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine adjt_hori_w3_reconstruct_alg( mesh, model_clock, adj_lookup_table_cache )
use adj_reconstruct_w3_field_alg_mod, only : adj_hori_w3_reconstruct_alg
use reconstruct_w3_field_alg_mod, only : hori_w3_reconstruct_alg
@@ -46,8 +47,9 @@ module adjt_reconstruct_w3_field_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: field_new
@@ -72,7 +74,6 @@ module adjt_reconstruct_w3_field_alg_mod
real(kind=r_def) :: inner2
real(kind=r_def) :: field_new_field_new_input_inner_prod
real(kind=r_def) :: field_old_field_old_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -112,8 +113,8 @@ module adjt_reconstruct_w3_field_alg_mod
x_innerproduct_x( field_old_inner_prod, field_old ) )
! Determining scale factors
- field_new_sf = 1.0_r_def/(field_new_inner_prod + eps)
- field_old_sf = 1.0_r_def/(field_old_inner_prod + eps)
+ field_new_sf = 1.0_r_def/(field_new_inner_prod + EPS)
+ field_old_sf = 1.0_r_def/(field_old_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + field_new_inner_prod*field_new_sf
@@ -135,7 +136,8 @@ module adjt_reconstruct_w3_field_alg_mod
! Adjoint
call adj_hori_w3_reconstruct_alg( field_new, field_old, &
- transport_metadata )
+ transport_metadata, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( field_new_field_new_input_inner_prod, &
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/adjt_wt_advective_update_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/adjt_wt_advective_update_alg_mod.x90
index 6c20ece3d..0eb5cc146 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/adjt_wt_advective_update_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/adjt_wt_advective_update_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing adjoint test for adj_wt_advective_update_alg
module adjt_wt_advective_update_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
use mesh_mod, only : mesh_type
@@ -14,7 +15,7 @@ module adjt_wt_advective_update_alg_mod
use finite_element_config_mod, only : element_order_h, &
element_order_v
use fs_continuity_mod, only : W2h, W2v, Wtheta
- use constants_mod, only : i_def, r_def, l_def
+ use constants_mod, only : i_def, r_def, l_def, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -35,9 +36,10 @@ module adjt_wt_advective_update_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine adjt_hori_wt_update_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine adjt_hori_wt_update_alg( mesh, model_clock, adj_lookup_table_cache )
use wt_advective_update_alg_mod, only : hori_wt_update_alg
use adj_wt_advective_update_alg_mod, only : adj_hori_wt_update_alg
@@ -45,8 +47,9 @@ module adjt_wt_advective_update_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Internal arguments for forward and adjoint
type(field_type) :: u_grad_f
@@ -72,7 +75,6 @@ module adjt_wt_advective_update_alg_mod
real(kind=r_def) :: advective_advective_input_inner_prod
real(kind=r_def) :: field_field_input_inner_prod
real(kind=r_def) :: inner2
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -107,8 +109,8 @@ module adjt_wt_advective_update_alg_mod
x_innerproduct_x(field_inner_prod, field) )
! Determining scale factors
- advective_sf = 1.0_r_def/(advective_inner_prod + eps)
- field_sf = 1.0_r_def/(field_inner_prod + eps)
+ advective_sf = 1.0_r_def/(advective_inner_prod + EPS)
+ field_sf = 1.0_r_def/(field_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + advective_inner_prod*advective_sf
@@ -127,7 +129,7 @@ module adjt_wt_advective_update_alg_mod
advective_advective_input_inner_prod = 0.0_r_def
field_field_input_inner_prod = 0.0_r_def
- call adj_hori_wt_update_alg( u_grad_f, ls_wind, ls_wind, field, transport_metadata )
+ call adj_hori_wt_update_alg( u_grad_f, ls_wind, ls_wind, field, transport_metadata, adj_lookup_table_cache )
call invoke( x_innerproduct_y(advective_advective_input_inner_prod, u_grad_f, advective_input), &
x_innerproduct_y(field_field_input_inner_prod, field, field_input) )
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_advective_and_flux_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_advective_and_flux_alg_mod.x90
index e12aa59a9..6082fa336 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_advective_and_flux_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_advective_and_flux_alg_mod.x90
@@ -6,10 +6,11 @@
!> @brief Module containing adjoint test for atl_advective_and_flux_alg
module atlt_advective_and_flux_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
- use constants_mod, only : r_def, i_def, l_def
+ use constants_mod, only : r_def, i_def, l_def, EPS
use log_mod, only : log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -37,9 +38,10 @@ module atlt_advective_and_flux_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_advective_and_flux_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_advective_and_flux_alg( mesh, model_clock, adj_lookup_table_cache )
use atl_advective_and_flux_alg_mod, only : atl_advective_and_flux_alg
use tl_advective_and_flux_alg_mod, only : tl_advective_and_flux_alg
@@ -47,8 +49,9 @@ module atlt_advective_and_flux_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: mass_flux_1
@@ -94,7 +97,6 @@ module atlt_advective_and_flux_alg_mod
real(kind=r_def) :: adv_inc_adv_inc_input_inner_prod
real(kind=r_def) :: density_density_input_inner_prod
real(kind=r_def) :: wind_wind_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -173,11 +175,11 @@ module atlt_advective_and_flux_alg_mod
x_innerproduct_x( wind_inner_prod, wind ) )
! Determining scale factors
- mass_flux_1_sf = 1.0_r_def/(mass_flux_1_inner_prod + eps)
- mass_flux_2_sf = 1.0_r_def/(mass_flux_2_inner_prod + eps)
- adv_inc_sf = 1.0_r_def/(adv_inc_inner_prod + eps)
- density_sf = 1.0_r_def/(density_inner_prod + eps)
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ mass_flux_1_sf = 1.0_r_def/(mass_flux_1_inner_prod + EPS)
+ mass_flux_2_sf = 1.0_r_def/(mass_flux_2_inner_prod + EPS)
+ adv_inc_sf = 1.0_r_def/(adv_inc_inner_prod + EPS)
+ density_sf = 1.0_r_def/(density_inner_prod + EPS)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + mass_flux_1_inner_prod*mass_flux_1_sf
@@ -217,7 +219,8 @@ module atlt_advective_and_flux_alg_mod
density, wind, ls_density, ls_wind, &
direction, transport_metadata, &
final_rk_stage, dt, &
- do_flux, do_advective )
+ do_flux, do_advective, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( mass_flux_1_mass_flux_1_input_inner_prod, &
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_advective_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_advective_alg_mod.x90
index 92fd13b5a..020220d98 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_advective_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_advective_alg_mod.x90
@@ -6,10 +6,11 @@
!> @brief Module containing adjoint test for atl_mol_advective_alg
module atlt_mol_advective_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
- use constants_mod, only : r_def, i_def, l_def
+ use constants_mod, only : r_def, i_def, l_def, EPS
use log_mod, only : log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -46,9 +47,10 @@ module atlt_mol_advective_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_mol_advective_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_mol_advective_alg( mesh, model_clock, adj_lookup_table_cache )
use atl_mol_advective_alg_mod, only : atl_mol_advective_alg
use tl_mol_advective_alg_mod, only : tl_mol_advective_alg
@@ -56,8 +58,9 @@ module atlt_mol_advective_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: field_np1
@@ -81,7 +84,6 @@ module atlt_mol_advective_alg_mod
real(kind=r_def) :: inner2
real(kind=r_def) :: field_np1_field_np1_input_inner_prod
real(kind=r_def) :: field_field_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Variables used to handle calculations for fields stored in tl_transport_controller
integer(kind=i_def) :: mesh_id
@@ -144,8 +146,8 @@ module atlt_mol_advective_alg_mod
x_innerproduct_x( field_inner_prod, field ) )
! Determining scale factors
- field_np1_sf = 1.0_r_def/(field_np1_inner_prod + eps)
- field_sf = 1.0_r_def/(field_inner_prod + eps)
+ field_np1_sf = 1.0_r_def/(field_np1_inner_prod + EPS)
+ field_sf = 1.0_r_def/(field_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + field_np1_inner_prod*field_np1_sf
@@ -169,7 +171,7 @@ module atlt_mol_advective_alg_mod
field_field_input_inner_prod = 0.0_r_def
! Adjoint
- call atl_mol_advective_alg( field_np1, field, ls_field, tl_transport_controller )
+ call atl_mol_advective_alg( field_np1, field, ls_field, tl_transport_controller, adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( field_np1_field_np1_input_inner_prod, &
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90
index 6f2a2cabc..2b5d89620 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90
@@ -6,10 +6,11 @@
!> @brief Module containing adjoint test for atl_mol_conservative_alg
module atlt_mol_conservative_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
- use constants_mod, only : r_def, i_def, l_def
+ use constants_mod, only : r_def, i_def, l_def, EPS
use copy_field_alg_mod, only : copy_field
use log_mod, only : log_event, &
log_scratch_space, &
@@ -56,9 +57,10 @@ module atlt_mol_conservative_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_mol_conservative_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_mol_conservative_alg( mesh, model_clock, adj_lookup_table_cache )
use atl_mol_conservative_alg_mod, only : atl_mol_conservative_alg
use tl_mol_conservative_alg_mod, only : tl_mol_conservative_alg
@@ -66,8 +68,9 @@ module atlt_mol_conservative_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: field_np1
@@ -91,22 +94,25 @@ module atlt_mol_conservative_alg_mod
real(kind=r_def) :: inner2
real(kind=r_def) :: field_np1_field_np1_input_inner_prod
real(kind=r_def) :: field_field_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Variables used to handle calculations for fields stored in tl_transport_controller
integer(kind=i_def) :: mesh_id
type(transport_controller_type), pointer :: pert_transport_controller
type(transport_controller_type), pointer :: ls_transport_controller
+ type(transport_controller_type), pointer :: transport_controller
type(field_type) :: tctr_field_n
type(function_space_type), pointer :: tctr_field_n_vs
type(field_type) :: tctr_field_n_inp
type(r_tran_field_type), dimension(:), allocatable :: tctr_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: fpc_pert_wind_ref_flux_inp
+ type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp2
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_2_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_2_inp
+ type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_3_inp
+ type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_3_inp
type(r_tran_field_type) :: wind_pc_h_inp
type(r_tran_field_type) :: wind_pc_v_inp
type(r_tran_field_type) :: wind_pc_3d_inp
@@ -118,6 +124,7 @@ module atlt_mol_conservative_alg_mod
mesh_id = mesh%get_id()
call setup_test_tl_transport_controller( mesh, model_clock, tl_transport_controller, tctr_field_n, tctr_field_n_vs )
+ transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller()
ls_transport_controller => tl_transport_controller%get_ls_wind_pert_rho_controller()
pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller()
@@ -126,6 +133,12 @@ module atlt_mol_conservative_alg_mod
tctr_field_n_inp, &
tctr_flux_inp, &
pert_transport_controller )
+ call init_flux_pc_fieldvals( mesh, &
+ 1_i_def, &
+ fpc_ls_wind_ref_flux_inp2, &
+ dummy_ref_field_3_inp, &
+ dummy_ref_mass_3_inp, &
+ transport_controller )
call init_flux_pc_fieldvals( mesh, &
1_i_def, &
fpc_ls_wind_ref_flux_inp, &
@@ -182,8 +195,8 @@ module atlt_mol_conservative_alg_mod
x_innerproduct_x( field_inner_prod, field ) )
! Determining scale factors
- field_np1_sf = 1.0_r_def/(field_np1_inner_prod + eps)
- field_sf = 1.0_r_def/(field_inner_prod + eps)
+ field_np1_sf = 1.0_r_def/(field_np1_inner_prod + EPS)
+ field_sf = 1.0_r_def/(field_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + field_np1_inner_prod*field_np1_sf
@@ -212,7 +225,8 @@ module atlt_mol_conservative_alg_mod
! Adjoint
call atl_mol_conservative_alg( field_np1, field, ls_field, &
- tl_transport_controller )
+ tl_transport_controller, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( field_np1_field_np1_input_inner_prod, &
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly1d_vert_w3_recon_alg_mod.X90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly1d_vert_w3_recon_alg_mod.X90
index 374325a37..23e244285 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly1d_vert_w3_recon_alg_mod.X90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly1d_vert_w3_recon_alg_mod.X90
@@ -12,7 +12,7 @@ module atlt_poly1d_vert_w3_recon_alg_mod
use function_space_collection_mod, only : function_space_collection
use finite_element_config_mod, only : element_order_h, element_order_v
use fs_continuity_mod, only : W3
- use constants_mod, only : i_def, l_def, r_def
+ use constants_mod, only : i_def, l_def, r_def, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_DEBUG, &
@@ -78,10 +78,9 @@ module atlt_poly1d_vert_w3_recon_alg_mod
real(kind=r_def) :: reconstruction_reconstruction_input_inner_prod
real(kind=r_def) :: tracer_tracer_input_inner_prod
real(kind=r_def) :: inner2
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
- real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
+ real(kind=r_def), parameter :: overall_tolerance = 3100.0_r_def
real(kind=r_def) :: machine_tol
real(kind=r_def) :: relative_diff
@@ -141,8 +140,8 @@ module atlt_poly1d_vert_w3_recon_alg_mod
x_innerproduct_x( tracer_inner_prod, tracer ) )
! Determining scale factors
- reconstruction_sf = 1.0_r_def/(reconstruction_inner_prod + eps)
- tracer_sf = 1.0_r_def/(tracer_inner_prod + eps)
+ reconstruction_sf = 1.0_r_def/(reconstruction_inner_prod + EPS)
+ tracer_sf = 1.0_r_def/(tracer_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + reconstruction_inner_prod*reconstruction_sf
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly_adv_update_alg_mod.X90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly_adv_update_alg_mod.X90
index c579342e5..cafc398f0 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly_adv_update_alg_mod.X90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_poly_adv_update_alg_mod.X90
@@ -13,7 +13,7 @@ module atlt_poly_adv_update_alg_mod
use function_space_collection_mod, only : function_space_collection
use finite_element_config_mod, only : element_order_h, element_order_v
use fs_continuity_mod, only : W2H, Wtheta
- use constants_mod, only : i_def, r_def, r_tran
+ use constants_mod, only : i_def, r_def, r_tran, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -61,7 +61,6 @@ module atlt_poly_adv_update_alg_mod
real(kind=r_def) :: advective_advective_input_inner_prod
real(kind=r_def) :: wind_wind_input_inner_prod
real(kind=r_tran) :: inner2
- real(kind=r_tran), parameter :: eps = 1e-30_r_tran
! Test variables
real(kind=r_tran), parameter :: overall_tolerance = 1500.0_r_tran
@@ -103,8 +102,8 @@ module atlt_poly_adv_update_alg_mod
x_innerproduct_x( wind_inner_prod, wind ) )
! Determining scale factors
- advective_sf = 1.0_r_tran/( real( advective_inner_prod, r_tran ) + eps )
- wind_sf = 1.0_r_tran/( real( wind_inner_prod, r_tran ) + eps )
+ advective_sf = 1.0_r_tran/( real( advective_inner_prod, r_tran ) + EPS )
+ wind_sf = 1.0_r_tran/( real( wind_inner_prod, r_tran ) + EPS )
inner1 = 0.0_r_tran
inner1 = inner1 + real( advective_inner_prod, r_tran )*advective_sf
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_reconstruct_w3_field_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_reconstruct_w3_field_alg_mod.x90
index dc8b4c2c0..b1599e315 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_reconstruct_w3_field_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_reconstruct_w3_field_alg_mod.x90
@@ -6,9 +6,10 @@
!> @brief Module containing handwritten adjoint test for atl_reconstruct_w3_field_alg
module atlt_reconstruct_w3_field_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
- use constants_mod, only : r_def, i_def, l_def
+ use constants_mod, only : r_def, i_def, l_def, EPS
use log_mod, only : log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
@@ -37,9 +38,10 @@ module atlt_reconstruct_w3_field_alg_mod
!> @details Passes if adjoint is transpose of tangent linear.
!> Determined by testing the equality of inner products and ,
!> where M is the tangent linear and A is the adjoint.
- !> @param[in] mesh The model mesh
- !> @param[in] model_clock The model clock
- subroutine atlt_reconstruct_w3_field_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_reconstruct_w3_field_alg( mesh, model_clock, adj_lookup_table_cache )
use atl_reconstruct_w3_field_alg_mod, only : atl_reconstruct_w3_field_alg
use tl_reconstruct_w3_field_alg_mod, only : tl_reconstruct_w3_field_alg
@@ -47,8 +49,10 @@ module atlt_reconstruct_w3_field_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
+
! Arguments for tl and adj calls
type(field_type) :: field_new
@@ -76,10 +80,9 @@ module atlt_reconstruct_w3_field_alg_mod
real(kind=r_def) :: inner2
real(kind=r_def) :: field_new_field_new_input_inner_prod
real(kind=r_def) :: field_old_field_old_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
- real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
+ real(kind=r_def), parameter :: overall_tolerance = 3000.0_r_def
real(kind=r_def) :: machine_tol
real(kind=r_def) :: relative_diff
@@ -122,8 +125,8 @@ module atlt_reconstruct_w3_field_alg_mod
x_innerproduct_x( field_old_inner_prod, field_old ) )
! Determining scale factors
- field_new_sf = 1.0_r_def/(field_new_inner_prod + eps)
- field_old_sf = 1.0_r_def/(field_old_inner_prod + eps)
+ field_new_sf = 1.0_r_def/(field_new_inner_prod + EPS)
+ field_old_sf = 1.0_r_def/(field_old_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + field_new_inner_prod*field_new_sf
@@ -144,8 +147,9 @@ module atlt_reconstruct_w3_field_alg_mod
field_old_field_old_input_inner_prod = 0.0_r_def
! Adjoint
- call atl_reconstruct_w3_field_alg( field_new, field_old, ls_field_old, &
- direction, transport_metadata, final_rk_stage )
+ call atl_reconstruct_w3_field_alg( field_new, field_old, ls_field_old, &
+ direction, transport_metadata, final_rk_stage, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( field_new_field_new_input_inner_prod, &
@@ -215,7 +219,6 @@ module atlt_reconstruct_w3_field_alg_mod
real(kind=r_def) :: inner2
real(kind=r_def) :: field_new_field_new_input_inner_prod
real(kind=r_def) :: field_old_field_old_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -260,8 +263,8 @@ module atlt_reconstruct_w3_field_alg_mod
x_innerproduct_x( field_old_inner_prod, field_old ) )
! Determining scale factors
- field_new_sf = 1.0_r_def/(field_new_inner_prod + eps)
- field_old_sf = 1.0_r_def/(field_old_inner_prod + eps)
+ field_new_sf = 1.0_r_def/(field_new_inner_prod + EPS)
+ field_old_sf = 1.0_r_def/(field_old_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + field_new_inner_prod*field_new_sf
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_w3h_advective_update_alg_mod.X90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_w3h_advective_update_alg_mod.X90
index a66ed877c..1f942264d 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_w3h_advective_update_alg_mod.X90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_w3h_advective_update_alg_mod.X90
@@ -13,7 +13,7 @@ module atlt_w3h_advective_update_alg_mod
use finite_element_config_mod, only : element_order_h, element_order_v
use fs_continuity_mod, only : W2, W3
use operator_mod, only : operator_type
- use constants_mod, only : i_def, r_def
+ use constants_mod, only : i_def, r_def, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -67,7 +67,6 @@ module atlt_w3h_advective_update_alg_mod
real(kind=r_def) :: advective_increment_advective_increment_input_inner_prod
real(kind=r_def) :: wind_wind_input_inner_prod
real(kind=r_def) :: inner2
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -115,8 +114,8 @@ module atlt_w3h_advective_update_alg_mod
x_innerproduct_x(wind_inner_prod, wind) )
! Determining scale factors
- advective_increment_sf = 1.0_r_def/(advective_increment_inner_prod + eps)
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ advective_increment_sf = 1.0_r_def/(advective_increment_inner_prod + EPS)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + advective_increment_inner_prod*advective_increment_sf
diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_wt_advective_update_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_wt_advective_update_alg_mod.x90
index fc15d1db0..a00003edc 100644
--- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_wt_advective_update_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_wt_advective_update_alg_mod.x90
@@ -6,6 +6,7 @@
!> @brief Module containing handwritten adjoint test for atl_wt_advective_update_alg_mod routines
module atlt_wt_advective_update_alg_mod
+ use adj_trans_lookup_cache_mod, only : adj_trans_lookup_cache_type
use r_tran_field_mod, only : r_tran_field_type
use field_mod, only : field_type
use function_space_mod, only : function_space_type
@@ -15,7 +16,7 @@ module atlt_wt_advective_update_alg_mod
use finite_element_config_mod, only : element_order_h, &
element_order_v
use fs_continuity_mod, only : W2h, W2v, Wtheta, W2
- use constants_mod, only : i_def, r_def, l_def
+ use constants_mod, only : i_def, r_def, l_def, EPS
use log_mod, only : log_event, &
LOG_LEVEL_ERROR, &
LOG_LEVEL_INFO, &
@@ -43,7 +44,10 @@ module atlt_wt_advective_update_alg_mod
!> Determined by testing the equality of inner products
!> < Mx, Mx > and < AMx, x >, where M is the tangent linear
!> and A is the adjoint.
- subroutine atlt_wt_advective_update_alg( mesh, model_clock )
+ !> @param[in] mesh The model mesh
+ !> @param[in] model_clock The model clock
+ !> @param[in] adj_lookup_table_cache Lookup table cache
+ subroutine atlt_wt_advective_update_alg( mesh, model_clock, adj_lookup_table_cache )
use atl_wt_advective_update_alg_mod, only : atl_wt_advective_update_alg
use tl_wt_advective_update_alg_mod, only : tl_wt_advective_update_alg
@@ -51,8 +55,9 @@ module atlt_wt_advective_update_alg_mod
implicit none
! Arguments
- type(mesh_type), pointer, intent(in) :: mesh
- type(model_clock_type), intent(in) :: model_clock
+ type(mesh_type), pointer, intent(in) :: mesh
+ type(model_clock_type), intent(in) :: model_clock
+ type(adj_trans_lookup_cache_type), intent(in) :: adj_lookup_table_cache
! Arguments for tl and adj calls
type(field_type) :: rhs
@@ -87,7 +92,6 @@ module atlt_wt_advective_update_alg_mod
real(kind=r_def) :: rhs_rhs_input_inner_prod
real(kind=r_def) :: adv_field_adv_field_input_inner_prod
real(kind=r_def) :: wind_wind_input_inner_prod
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -150,9 +154,9 @@ module atlt_wt_advective_update_alg_mod
x_innerproduct_x( wind_inner_prod, wind ) )
! Determining scale factors
- rhs_sf = 1.0_r_def/(rhs_inner_prod + eps)
- adv_field_sf = 1.0_r_def/(adv_field_inner_prod + eps)
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ rhs_sf = 1.0_r_def/(rhs_inner_prod + EPS)
+ adv_field_sf = 1.0_r_def/(adv_field_inner_prod + EPS)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + rhs_inner_prod*rhs_sf
@@ -178,10 +182,11 @@ module atlt_wt_advective_update_alg_mod
wind_wind_input_inner_prod = 0.0_r_def
! Adjoint
- call atl_wt_advective_update_alg( rhs, adv_field, wind, &
- ls_adv_field, ls_wind, &
- dt, direction, &
- transport_metadata, final_rk_stage )
+ call atl_wt_advective_update_alg( rhs, adv_field, wind, &
+ ls_adv_field, ls_wind, &
+ dt, direction, &
+ transport_metadata, final_rk_stage, &
+ adj_lookup_table_cache )
! < AMx, x >
call invoke( x_innerproduct_y( rhs_rhs_input_inner_prod, &
@@ -253,7 +258,6 @@ module atlt_wt_advective_update_alg_mod
real(kind=r_def) :: advective_advective_input_inner_prod
real(kind=r_def) :: wind_wind_input_inner_prod
real(kind=r_def) :: inner2
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -288,8 +292,8 @@ module atlt_wt_advective_update_alg_mod
x_innerproduct_x(wind_inner_prod, wind) )
! Determining scale factors
- advective_sf = 1.0_r_def/(advective_inner_prod + eps)
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
+ advective_sf = 1.0_r_def/(advective_inner_prod + EPS)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + advective_inner_prod*advective_sf
@@ -376,7 +380,6 @@ module atlt_wt_advective_update_alg_mod
real(kind=r_def) :: wind_wind_input_inner_prod
real(kind=r_def) :: field_field_input_inner_prod
real(kind=r_def) :: inner2
- real(kind=r_def), parameter :: eps = 1e-30_r_def
! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
@@ -417,9 +420,9 @@ module atlt_wt_advective_update_alg_mod
x_innerproduct_x(field_inner_prod, field) )
! Determining scale factors
- advective_sf = 1.0_r_def/(advective_inner_prod + eps)
- wind_sf = 1.0_r_def/(wind_inner_prod + eps)
- field_sf = 1.0_r_def/(field_inner_prod + eps)
+ advective_sf = 1.0_r_def/(advective_inner_prod + EPS)
+ wind_sf = 1.0_r_def/(wind_inner_prod + EPS)
+ field_sf = 1.0_r_def/(field_inner_prod + EPS)
inner1 = 0.0_r_def
inner1 = inner1 + advective_inner_prod*advective_sf
diff --git a/applications/adjoint_tests/source/driver/adjoint_test_driver_mod.f90 b/applications/adjoint_tests/source/driver/adjoint_test_driver_mod.f90
index f9d458c4d..9f426f45d 100644
--- a/applications/adjoint_tests/source/driver/adjoint_test_driver_mod.f90
+++ b/applications/adjoint_tests/source/driver/adjoint_test_driver_mod.f90
@@ -56,6 +56,9 @@ subroutine run( modeldb )
use adjt_poly_adv_upd_lookup_alg_mod, only : adjt_poly_adv_upd_lookup_alg
use adjt_w3h_adv_upd_lookup_alg_mod, only : adjt_w3h_adv_upd_lookup_alg
+ ! ./linear_physics
+ use atlt_bl_inc_alg_mod, only : atlt_bl_inc_alg
+
! Handwritten algorithm tests
! ./interpolation
use adjt_interpolation_alg_mod, only : adjt_interp_w3wth_to_w2_alg, &
@@ -105,6 +108,9 @@ subroutine run( modeldb )
use adjt_mixed_solver_alg_mod, only : adjt_mixed_solver_alg
use adjt_semi_implicit_solver_step_alg_mod, only : adjt_semi_implicit_solver_step_alg
+ ! ./linear_physics
+ use atlt_bdy_lyr_alg_mod, only : atlt_bdy_lyr_alg
+
! ./timestepping
use atlt_si_timestep_alg_mod, only : atlt_si_timestep_alg
@@ -147,6 +153,9 @@ subroutine run( modeldb )
! ./core_dynamics
call atlt_pressure_gradient_bd_alg( mesh )
+ ! ./linear_physics
+ call atlt_bl_inc_alg( mesh )
+
! ./inter_function_space
call adjt_sci_convert_hdiv_field_alg( mesh, chi, panel_id )
@@ -168,26 +177,26 @@ subroutine run( modeldb )
call atlt_end_con_step_alg( mesh, modeldb%clock )
! ./transport/mol
- call adjt_hori_w3_reconstruct_alg( mesh, modeldb%clock )
+ call adjt_hori_w3_reconstruct_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
call atlt_vert_w3_reconstruct_alg( mesh, modeldb%clock )
- call atlt_reconstruct_w3_field_alg( mesh, modeldb%clock )
+ call atlt_reconstruct_w3_field_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
call atlt_hori_wt_update_alg( mesh, modeldb%clock )
call atlt_vert_wt_update_alg( mesh, modeldb%clock )
- call adjt_hori_wt_update_alg( mesh, modeldb%clock )
- call atlt_wt_advective_update_alg( mesh, modeldb%clock )
- call atlt_advective_and_flux_alg( mesh, modeldb%clock )
- call atlt_mol_conservative_alg( mesh, modeldb%clock )
- call atlt_mol_advective_alg( mesh, modeldb%clock )
+ call adjt_hori_wt_update_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_wt_advective_update_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_advective_and_flux_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_mol_conservative_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_mol_advective_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
! ./transport/control
- call atlt_transport_field_alg( mesh, modeldb%clock )
- call atlt_wind_transport_alg( mesh, modeldb%clock )
- call atlt_moist_mr_transport_alg( mesh, modeldb%clock )
- call atlt_theta_transport_alg( mesh, modeldb%clock )
+ call atlt_transport_field_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_wind_transport_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_moist_mr_transport_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
+ call atlt_theta_transport_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
call adjt_ls_wind_pert_rho_initialiser_alg( mesh, modeldb%clock )
call adjt_pert_wind_ls_rho_initialiser_alg( mesh, modeldb%clock )
call atlt_transport_controller_initialiser_alg( mesh, modeldb%clock )
- call atlt_transport_control_alg( mesh, modeldb%clock )
+ call atlt_transport_control_alg( mesh, modeldb%clock, adj_trans_lookup_cache )
! ./core_dynamics
call atlt_rhs_alg( mesh, modeldb%clock )
@@ -195,12 +204,15 @@ subroutine run( modeldb )
call atlt_derive_exner_from_eos_alg( mesh )
call atlt_moist_dyn_factors_alg( mesh )
+ ! ./linear_physics
+ call atlt_bdy_lyr_alg( modeldb, mesh )
+
! ./solver
- call adjt_pressure_precon_alg( modeldb, mesh, modeldb%clock )
+ call adjt_pressure_precon_alg( modeldb, mesh, modeldb%clock, adj_solver_lookup_cache )
call adjt_mixed_operator_alg( mesh, modeldb%clock )
- call adjt_mixed_schur_preconditioner_alg( modeldb, mesh, modeldb%clock )
- call adjt_mixed_solver_alg( modeldb, mesh, modeldb%clock )
- call adjt_semi_implicit_solver_step_alg( modeldb, mesh, modeldb%clock )
+ call adjt_mixed_schur_preconditioner_alg( modeldb, mesh, modeldb%clock, adj_solver_lookup_cache )
+ call adjt_mixed_solver_alg( modeldb, mesh, modeldb%clock, adj_solver_lookup_cache )
+ call adjt_semi_implicit_solver_step_alg( modeldb, mesh, modeldb%clock, adj_solver_lookup_cache )
! ./timestepping
call atlt_si_timestep_alg( modeldb, mesh, twod_mesh, 1 )
diff --git a/applications/adjoint_tests/source/driver/adjoint_test_parameters_mod.F90 b/applications/adjoint_tests/source/driver/adjoint_test_parameters_mod.F90
index 09f74b4c9..9db0ddb99 100644
--- a/applications/adjoint_tests/source/driver/adjoint_test_parameters_mod.F90
+++ b/applications/adjoint_tests/source/driver/adjoint_test_parameters_mod.F90
@@ -28,12 +28,12 @@ module adjoint_test_parameters_mod
! if the ls is not realistic. ls can still be
! randomly assigned, but in a sensible range
! to prevent these issues.
- real(r_def), dimension(2), parameter :: ls_u_range = (/ 0.0_r_def, 10.0_r_def /)
+ real(r_def), dimension(2), parameter :: ls_u_range = (/ 1.e2_r_def, 1.e3_r_def /)
real(r_def), dimension(2), parameter :: ls_theta_range = (/ 280.0_r_def, 340.0_r_def /)
- real(r_def), dimension(2), parameter :: ls_rho_range = (/ 0.0_r_def, 1.0_r_def /)
- real(r_def), dimension(2), parameter :: ls_exner_range = (/ 0.0_r_def, 1.0_r_def /)
- real(r_def), dimension(2), parameter :: ls_md1_range = (/ 0.0_r_def, 1.0_r_def /)
- real(r_def), dimension(2), parameter :: ls_md2_range = (/ 0.0_r_def, 1.0_r_def /)
- real(r_def), dimension(2), parameter :: ls_md3_range = (/ 0.0_r_def, 1.0_r_def /)
+ real(r_def), dimension(2), parameter :: ls_rho_range = (/ 0.1_r_def, 1.0_r_def /)
+ real(r_def), dimension(2), parameter :: ls_exner_range = (/ 0.1_r_def, 1.0_r_def /)
+ real(r_def), dimension(2), parameter :: ls_md1_range = (/ 0.1_r_def, 1.0_r_def /)
+ real(r_def), dimension(2), parameter :: ls_md2_range = (/ 0.1_r_def, 1.0_r_def /)
+ real(r_def), dimension(2), parameter :: ls_md3_range = (/ 0.1_r_def, 1.0_r_def /)
end module adjoint_test_parameters_mod
diff --git a/applications/gravity_wave/rose-meta/lfric-gravity_wave/versions.py b/applications/gravity_wave/rose-meta/lfric-gravity_wave/versions.py
index 8418438c1..8bab40a9e 100644
--- a/applications/gravity_wave/rose-meta/lfric-gravity_wave/versions.py
+++ b/applications/gravity_wave/rose-meta/lfric-gravity_wave/versions.py
@@ -126,3 +126,48 @@ def upgrade(self, config, meta_config=None):
)
return config, self.reports
+
+
+class vn30_t135(MacroUpgrade):
+ """Upgrade macro for ticket #135 by James Manners."""
+
+ BEFORE_TAG = "vn3.0_t146"
+ AFTER_TAG = "vn3.0_t135"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/socrates-radiation
+ self.add_setting(config, ["namelist:cosp", "n_cosp_step"], "1")
+
+ return config, self.reports
+
+
+class vn30_t171(MacroUpgrade):
+ """Upgrade macro for ticket #171 by James Kent."""
+
+ BEFORE_TAG = "vn3.0_t135"
+ AFTER_TAG = "vn3.0_t171"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-gungho
+ # Add adjust_tracer_equation to transport namelist
+ self.add_setting(
+ config, ["namelist:transport", "adjust_tracer_equation"], ".false."
+ )
+
+ return config, self.reports
+
+
+class vn30_t214(MacroUpgrade):
+ """Upgrade macro for ticket #214 by mark Hedley."""
+
+ BEFORE_TAG = "vn3.0_t171"
+ AFTER_TAG = "vn3.0_t214"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-gungho
+ """Set segments configuration to true."""
+ self.change_setting_value(
+ config, ["namelist:physics", "configure_segments"], ".true."
+ )
+
+ return config, self.reports
diff --git a/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90 b/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
index 5ecef8fd2..f5d8d9fe2 100644
--- a/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
+++ b/applications/gravity_wave/source/driver/gravity_wave_infrastructure_mod.f90
@@ -10,7 +10,6 @@ module gravity_wave_infrastructure_mod
use add_mesh_map_mod, only : assign_mesh_maps
use driver_modeldb_mod, only : modeldb_type
- use check_configuration_mod, only : get_required_stencil_depth
use constants_mod, only : i_def, &
PRECISION_REAL, &
r_def, r_second, &
@@ -81,7 +80,8 @@ subroutine initialise_infrastructure( program_name, &
logical(l_def) :: prepartitioned
logical :: apply_partition_check
- integer(i_def) :: stencil_depth
+ integer(i_def) :: stencil_depth(1)
+
integer(i_def) :: geometry
integer(i_def) :: method
integer(i_def) :: number_of_layers
@@ -191,7 +191,7 @@ subroutine initialise_infrastructure( program_name, &
!=======================================================================
! 1.3 Initialise mesh objects and assign InterGrid maps
!=======================================================================
- stencil_depth = get_required_stencil_depth()
+ stencil_depth = 2
apply_partition_check = .false.
if ( .not. prepartitioned .and. l_multigrid ) then
apply_partition_check = .true.
@@ -237,6 +237,9 @@ subroutine initialise_infrastructure( program_name, &
nullify(chi_inventory, panel_id_inventory)
deallocate(base_mesh_names)
+ deallocate(twod_names)
+ deallocate(extrusion)
+ deallocate(extrusion_2d)
end subroutine initialise_infrastructure
diff --git a/applications/gungho_model/example/configuration.nml b/applications/gungho_model/example/configuration.nml
index ea60b8aa1..aa74a254d 100644
--- a/applications/gungho_model/example/configuration.nml
+++ b/applications/gungho_model/example/configuration.nml
@@ -286,6 +286,7 @@ tau_u=0.55,
/
&transport
adjust_theta=.false.,
+adjust_tracer_equation=.false.
adjust_vhv_wind=.true.,
broken_w2_projection=.false.,
calculate_detj='upwind',
diff --git a/applications/gungho_model/example/file_def_initial.xml b/applications/gungho_model/example/file_def_initial.xml
index 2b1050253..42cf3bfec 100644
--- a/applications/gungho_model/example/file_def_initial.xml
+++ b/applications/gungho_model/example/file_def_initial.xml
@@ -13,6 +13,8 @@
+
+
diff --git a/applications/gungho_model/lam_example/baroclinic/config_driver.nml b/applications/gungho_model/lam_example/baroclinic/config_driver.nml
index 43d72b197..0aea85072 100644
--- a/applications/gungho_model/lam_example/baroclinic/config_driver.nml
+++ b/applications/gungho_model/lam_example/baroclinic/config_driver.nml
@@ -210,6 +210,7 @@ log_space = .true., .false., .false.
enforce_min_value=.false.,.false.,.false.
max_vert_cfl_calc='uniform'
min_value=0.0,0.0,-99999999.0,0.0
+adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
calculate_detj='upwind',
cap_density_predictor = 0.01
diff --git a/applications/gungho_model/lam_example/baroclinic/config_lam.nml b/applications/gungho_model/lam_example/baroclinic/config_lam.nml
index d63ada536..7187243e9 100644
--- a/applications/gungho_model/lam_example/baroclinic/config_lam.nml
+++ b/applications/gungho_model/lam_example/baroclinic/config_lam.nml
@@ -226,6 +226,7 @@ log_space = .true., .false., .false.
enforce_min_value=.false.,.false.,.false.
max_vert_cfl_calc='uniform'
min_value=0.0,0.0,-99999999.0,0.0
+adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
calculate_detj='upwind',
cap_density_predictor = 0.01
diff --git a/applications/gungho_model/lam_example/straka/config_driver.nml b/applications/gungho_model/lam_example/straka/config_driver.nml
index 82fd2d418..094790169 100644
--- a/applications/gungho_model/lam_example/straka/config_driver.nml
+++ b/applications/gungho_model/lam_example/straka/config_driver.nml
@@ -211,6 +211,7 @@ log_space = .true., .false., .false.
enforce_min_value=.false.,.false.,.false.
max_vert_cfl_calc='uniform'
min_value=0.0,0.0,-99999999.0,0.0
+adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
calculate_detj='upwind',
cap_density_predictor = 0.01
diff --git a/applications/gungho_model/lam_example/straka/config_lam.nml b/applications/gungho_model/lam_example/straka/config_lam.nml
index 636c9e6e0..30a4ea4b8 100644
--- a/applications/gungho_model/lam_example/straka/config_lam.nml
+++ b/applications/gungho_model/lam_example/straka/config_lam.nml
@@ -223,6 +223,7 @@ log_space = .true., .false., .false.
enforce_min_value=.false.,.false.,.false.
max_vert_cfl_calc='uniform'
min_value=0.0,0.0,-99999999.0,0.0
+adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
calculate_detj='upwind',
cap_density_predictor = 0.01
diff --git a/applications/gungho_model/rose-meta/lfric-gungho_model/versions.py b/applications/gungho_model/rose-meta/lfric-gungho_model/versions.py
index 8418438c1..8bab40a9e 100644
--- a/applications/gungho_model/rose-meta/lfric-gungho_model/versions.py
+++ b/applications/gungho_model/rose-meta/lfric-gungho_model/versions.py
@@ -126,3 +126,48 @@ def upgrade(self, config, meta_config=None):
)
return config, self.reports
+
+
+class vn30_t135(MacroUpgrade):
+ """Upgrade macro for ticket #135 by James Manners."""
+
+ BEFORE_TAG = "vn3.0_t146"
+ AFTER_TAG = "vn3.0_t135"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/socrates-radiation
+ self.add_setting(config, ["namelist:cosp", "n_cosp_step"], "1")
+
+ return config, self.reports
+
+
+class vn30_t171(MacroUpgrade):
+ """Upgrade macro for ticket #171 by James Kent."""
+
+ BEFORE_TAG = "vn3.0_t135"
+ AFTER_TAG = "vn3.0_t171"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-gungho
+ # Add adjust_tracer_equation to transport namelist
+ self.add_setting(
+ config, ["namelist:transport", "adjust_tracer_equation"], ".false."
+ )
+
+ return config, self.reports
+
+
+class vn30_t214(MacroUpgrade):
+ """Upgrade macro for ticket #214 by mark Hedley."""
+
+ BEFORE_TAG = "vn3.0_t171"
+ AFTER_TAG = "vn3.0_t214"
+
+ def upgrade(self, config, meta_config=None):
+ # Commands From: rose-meta/lfric-gungho
+ """Set segments configuration to true."""
+ self.change_setting_value(
+ config, ["namelist:physics", "configure_segments"], ".true."
+ )
+
+ return config, self.reports
diff --git a/applications/jedi_lfric_tests/example/configuration.nml b/applications/jedi_lfric_tests/example/configuration.nml
index b2d3c1ff0..3e1f564da 100644
--- a/applications/jedi_lfric_tests/example/configuration.nml
+++ b/applications/jedi_lfric_tests/example/configuration.nml
@@ -1,13 +1,13 @@
&base_mesh
-file_prefix='mesh_C12',
+file_prefix='mesh_C12_MG',
geometry='spherical',
prepartitioned=.false.,
-prime_mesh_name='C12',
+prime_mesh_name='dynamics',
topology='fully_periodic',
/
&boundaries
limited_area=.false.,
-transport_overwrite_freq='final'
+transport_overwrite_freq='final',
/
&checks
limit_cfl=.false.,
@@ -29,16 +29,25 @@ spectral_gwd='none',
stochastic_physics='none',
surface='none',
/
+&convection
+dx_ref=50000.0,
+l_cvdiag_ctop_qmax=.false.,
+qlmin=4.0e-4,
+resdep_precipramp=.false.,
+/
+&cosp
+l_cosp=.false.,
+/
&damping_layer
dl_base=40000.0,
dl_str=0.05,
-dl_type='latitude',
+dl_type='standard',
/
&departure_points
horizontal_limit='cap',
horizontal_method='ffsl',
n_dep_pt_iterations=1,
-share_stencil_extent=.true.
+share_stencil_extent=.true.,
vertical_limit='exponential',
vertical_method='timeaverage',
vertical_sorting=.false.,
@@ -56,13 +65,13 @@ stretching_height=17507.0,
stretching_method='smooth',
/
&files
-ancil_directory='/data/users/lfric/data/ancils/basic-gal/Quagga/C12/n96e_l70',
+ancil_directory='/data/users/lfricadmin/data/ancils/basic-gal/yak/C12',
checkpoint_stem_name='restart',
diag_stem_name='diagGungho',
-ls_directory='/data/users/lfric/data/tangent-linear/Ticket46',
-ls_filename='final_ls',
-orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid',
-start_dump_directory='/data/users/lfric/data/tangent-linear/Ticket3590',
+ls_directory='/data/users/tim.payne/lfric_apps/files',
+ls_filename='final_ls_with_land',
+orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog',
+start_dump_directory='/data/users/lfricadmin/data/tangent-linear/Ticket354',
start_dump_filename='final_pert',
/
&finite_element
@@ -79,10 +88,10 @@ dlayer_on=.true.,
dry_static_adjust=.true.,
eos_method='sampled',
exner_from_eos=.false.,
-horizontal_physics_predictor=.false.
-horizontal_transport_predictor=.false.
+horizontal_physics_predictor=.false.,
+horizontal_transport_predictor=.false.,
init_exner_bt=.true.,
-l_multigrid=.false.,
+l_multigrid=.true.,
lagged_orog=.true.,
moisture_formulation='traditional',
moisture_in_solver=.true.,
@@ -90,7 +99,7 @@ p2theta_vert=.true.,
rotating=.true.,
shallow=.true.,
si_momentum_equation=.false.,
-theta_moist_source=.false.
+theta_moist_source=.false.,
use_multires_coupling=.false.,
use_physics=.true.,
use_wavedynamics=.true.,
@@ -101,15 +110,27 @@ gcrk=8,
method='prec_only',
monitor_convergence=.false.,
normalise=.true.,
-preconditioner='tridiagonal',
+preconditioner='multigrid',
si_pressure_a_tol=1.0e-8,
si_pressure_maximum_iterations=400,
si_pressure_tolerance=1.0e-4,
/
+&iau_addinf_io
+/
+&iau_addinf_io
+/
+&iau_ainc_io
+/
+&iau_ainc_io
+/
+&iau_bcorr_io
+/
+&iau
+/
&idealised
f_lon_deg=0.0,
-perturb_init=.false.
-test='gravity_wave',
+perturb_init=.false.,
+test='none',
/
&ideal_surface
canopy_height=19.01,16.38,0.79,1.26,1.0,
@@ -144,10 +165,10 @@ zero_w2v_wind=.false.,
&initial_density
density_background=0.1,
density_max=2.0,
-r1=0.0,
-r2=0.0,
-x1=0.0,
-x2=0.0,
+r1=0.4,
+r2=0.4,
+x1=0.4,
+x2=-0.4,
y1=0.0,
y2=0.0,
z1=0.0,
@@ -159,7 +180,7 @@ surface_pressure=1000.0e2,
/
&initial_temperature
bvf_square=0.0001,
-pert_centre=120.0,
+pert_centre=60.0,
pert_width_scaling=1.0,
perturb='none',
theta_surf=300.0,
@@ -168,22 +189,25 @@ theta_surf=300.0,
/
&initial_wind
nl_constant=0.0,
-profile='none',
+profile='constant_uv',
sbr_angle_lat=0.0,
sbr_angle_lon=0.0,
-smp_init_wind=.false.,
-u0=0.0,
+smp_init_wind=.true.,
+u0=2.0,
v0=0.0,
wind_time_period=0.0,
/
&io
checkpoint_read=.false.,
+checkpoint_times=,
checkpoint_write=.false.,
counter_output_suffix='counter.txt',
diag_active_files='lfric_diag',
diag_always_on_sampling=.false.,
diagnostic_frequency=8,
+end_of_run_checkpoint=.true.,
file_convention='UGRID',
+multifile_io=.false.,
nodal_output_on_w3=.false.,
subroutine_counters=.false.,
subroutine_timers=.true.,
@@ -196,11 +220,27 @@ write_fluxes=.false.,
write_minmax_tseries=.false.,
/
&linear
-fixed_ls=.true.
+fixed_ls=.true.,
+l_stabilise_bl=.false.,
ls_read_w2h=.false.,
+max_bl_stabilisation=0.75,
+n_bl_levels_to_stabilise=15,
pert_option='file',
+transport_efficiency=.true.,
+/
+&linear_physics
+blevs_m=15,
+e_folding_levs_m=10,
+l_0_m=80.0,
+l_boundary_layer=.true.,
+log_layer=2,
+u_land_m=0.4,
+u_sea_m=0.4,
+z_land_m=0.05,
+z_sea_m=0.0005,
/
&logging
+log_to_rank_zero_only=.false.,
run_log_level='info',
/
&mixed_solver
@@ -211,7 +251,7 @@ guess_np1=.false.,
mixed_solver_a_tol=1.0e-3,
monitor_convergence=.true.,
normalise=.true.,
-reference_reset_time=3600.,
+reference_reset_time=3600.0,
si_maximum_iterations=10,
si_method='block_gcr',
si_preconditioner='pressure',
@@ -224,6 +264,14 @@ smagorinsky=.false.,
viscosity=.false.,
viscosity_mu=0.0,
/
+&multigrid
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2',
+multigrid_chain_nitems=3,
+n_coarsesmooth=4,
+n_postsmooth=2,
+n_presmooth=2,
+smooth_relaxation=0.8,
+/
&esm_couple
l_esm_couple_test=.false.,
/
@@ -231,16 +279,23 @@ l_esm_couple_test=.false.,
orog_init_option='ancil',
/
&partitioning
+generate_inner_halos=.false.,
panel_decomposition='auto',
-panel_xproc=6,
+panel_xproc=1,
panel_yproc=1,
partitioner='cubedsphere',
/
&physics
+bl_segment=0,
+configure_segments=.true.,
+conv_gr_segment=16,
+gw_segment=0,
limit_drag_incs=.false.,
+ls_ppn_segment=0,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
-configure_segments=.false.
+sample_physics_winds_correction=.false.,
+ussp_segment=0,
/
&planet
cp=1005.0,
@@ -252,10 +307,14 @@ scaling_factor=1.0,
/
&radiative_gases
cfc113_rad_opt='off',
-cfc11_rad_opt='off',
-cfc12_rad_opt='off',
-ch4_rad_opt='off',
-co2_rad_opt='off',
+cfc11_mix_ratio=1.110e-09,
+cfc11_rad_opt='constant',
+cfc12_mix_ratio=2.187e-09,
+cfc12_rad_opt='constant',
+ch4_mix_ratio=1.006e-06,
+ch4_rad_opt='constant',
+co2_mix_ratio=6.002e-04,
+co2_rad_opt='constant',
co_rad_opt='off',
cs_rad_opt='off',
h2_rad_opt='off',
@@ -268,11 +327,13 @@ k_rad_opt='off',
l_cts_fcg_rates=.false.,
li_rad_opt='off',
n2_rad_opt='off',
-n2o_rad_opt='off',
+n2o_mix_ratio=4.945e-07,
+n2o_rad_opt='constant',
na_rad_opt='off',
nh3_rad_opt='off',
-o2_rad_opt='off',
-o3_rad_opt='off',
+o2_mix_ratio=0.2314,
+o2_rad_opt='constant',
+o3_rad_opt='ancil',
rb_rad_opt='off',
so2_rad_opt='off',
tio_rad_opt='off',
@@ -286,6 +347,8 @@ monitor_convergence=.false.,
preconditioner='diagonal',
tolerance=1.0e-6,
/
+&specified_surface
+/
&time
calendar='timestep',
calendar_origin='2016-01-01 15:00:00',
@@ -297,7 +360,7 @@ timestep_start='1',
×tepping
alpha=0.55,
dt=1800,
-inner_iterations=2,
+inner_iterations=1,
method='semi_implicit',
outer_iterations=2,
runge_kutta_method='forward_euler',
@@ -308,6 +371,7 @@ tau_u=0.55,
/
&transport
adjust_theta=.false.,
+adjust_tracer_equation=.false.,
adjust_vhv_wind=.false.,
ageofair_reset_level=10,
broken_w2_projection=.false.,
@@ -341,8 +405,8 @@ min_val_method='iterative',
min_value=0.0,0.0,-99999999.0,0.0,0.0,
oned_reconstruction=.false.,
operators='fv',
-panel_edge_high_order=.false.,
-panel_edge_treatment='none'
+panel_edge_high_order=.true.,
+panel_edge_treatment='none',
profile_size=5,
reversible=.true.,.true.,.false.,.true.,.true.,
runge_kutta_method='ssp3',
@@ -360,8 +424,7 @@ vertical_method=5*1,
vertical_monotone=5*1,
vertical_monotone_order=5*3,
vertical_sl_order='cubic',
-wind_mono_top=.false.
-wind_mono_top_depth=5
+wind_mono_top=.false.,
/
&validity_test
number_gamma_values=2,
diff --git a/applications/jedi_lfric_tests/example/iodef.xml b/applications/jedi_lfric_tests/example/iodef.xml
index 92e9017c2..90edb87ac 100644
--- a/applications/jedi_lfric_tests/example/iodef.xml
+++ b/applications/jedi_lfric_tests/example/iodef.xml
@@ -50,6 +50,11 @@
+
+
+
+
+
@@ -140,6 +145,8 @@
+
+
@@ -186,6 +193,8 @@
+
+
@@ -327,6 +336,7 @@
+
diff --git a/applications/jedi_lfric_tests/example/mesh_C12.nc b/applications/jedi_lfric_tests/example/mesh_C12.nc
deleted file mode 100644
index f7ea6988e22a06194aac0d17b6e3be62cd539773..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 85708
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
Rwf*lmDjqBQ-|O@_{yzW$Qgi?S
diff --git a/applications/jedi_lfric_tests/example_create_traj/C224_create_traj_file.sh b/applications/jedi_lfric_tests/example_create_traj/C224_create_traj_file.sh
new file mode 100755
index 000000000..22ba50324
--- /dev/null
+++ b/applications/jedi_lfric_tests/example_create_traj/C224_create_traj_file.sh
@@ -0,0 +1,19 @@
+# This input file can be generated by running the lfric_atm nightly test suite
+# It is generated by the nwp_gal9_ls_and_jedi-C224_MG test
+INPUT=ls_and_jedi_trajectory_2021060200-2021060207.nc
+OUTPUT=C224_jedi_trajectory.nc
+
+TIMESTEP=$(ncks -d time,0 -v time ${INPUT} | grep "time =" | sed -e "s/.*= //;s/ .*//" | tr -d -c 0-9)
+
+echo Altering variable names to match JEDI/MONIO
+# Change the file so that the time starts at 0, not 3600
+ncrename -d time,time_counter ${INPUT} ${INPUT}_tmp
+ncrename -O -v time,time_instant ${INPUT}_tmp ${INPUT}_tmp
+ncrename -O -v time_bounds,time_instant_bounds ${INPUT}_tmp ${INPUT}_tmp
+
+echo Shifting time back by ${TIMESTEP}
+# Change the file so that the time starts at 0
+ncap2 -O -s time_instant-=${TIMESTEP} ${INPUT}_tmp ${INPUT}_tmp
+ncap2 -O -s time_instant_bounds-=${TIMESTEP} ${INPUT}_tmp ${OUTPUT}
+rm *tmp*
+echo Output ${OUTPUT}
diff --git a/applications/jedi_lfric_tests/example_forecast/configuration.nml b/applications/jedi_lfric_tests/example_forecast/configuration.nml
index 016e61fbc..17bb72453 100644
--- a/applications/jedi_lfric_tests/example_forecast/configuration.nml
+++ b/applications/jedi_lfric_tests/example_forecast/configuration.nml
@@ -309,6 +309,7 @@ tau_u=0.5,
/
&transport
adjust_theta=.false.,
+adjust_tracer_equation=.false.
adjust_vhv_wind=.false.,
ageofair_reset_level=10,
broken_w2_projection=.false.,
diff --git a/applications/jedi_lfric_tests/example_forecast/iodef.xml b/applications/jedi_lfric_tests/example_forecast/iodef.xml
index fb4ab30d6..7a100a000 100644
--- a/applications/jedi_lfric_tests/example_forecast/iodef.xml
+++ b/applications/jedi_lfric_tests/example_forecast/iodef.xml
@@ -66,6 +66,8 @@
+
+
diff --git a/applications/jedi_lfric_tests/example_id_tlm_tests/configuration.nml b/applications/jedi_lfric_tests/example_id_tlm_tests/configuration.nml
index 53acee0fc..d44020c0f 100644
--- a/applications/jedi_lfric_tests/example_id_tlm_tests/configuration.nml
+++ b/applications/jedi_lfric_tests/example_id_tlm_tests/configuration.nml
@@ -1,13 +1,10 @@
&jedi_lfric_tests
test_field='theta',
/
-
-#### Configure JEDI-LFRIC
-
&jedi_geometry
io_calender_start='2018-04-14T21:00:00',
-io_path_inc_read='/data/users/lfric/data/jedi-lfric/Ticket354/pert_fields/lfric_diag',
-io_path_state_read='/data/users/lfric/data/jedi-lfric/Ticket354/ls_fields/jedi_trajectory',
+io_path_inc_read='/data/users/lfricadmin/data/jedi-lfric/Ticket354/pert_fields/lfric_diag',
+io_path_state_read='/data/users/lfricadmin/data/jedi-lfric/Ticket354/ls_fields/jedi_trajectory',
io_path_state_write='write_file',
io_setup_increment=.false.,
io_time_step='P0DT1H0M0S',
@@ -15,8 +12,8 @@ io_time_step='P0DT1H0M0S',
&jedi_state
state_time='2018-04-14 21:00:00',
use_pseudo_model=.true.,
-variables='theta','rho','u10m','exner','u_in_w3','v_in_w3','w_in_wth',
-'m_v','m_cl','m_r','m_s',
+variables='theta','rho','exner','u_in_w3','v_in_w3','w_in_wth','m_v',
+'m_cl','m_r','m_s','land_fraction',
/
&jedi_increment
inc_time='2018-04-14 21:00:00',
@@ -36,19 +33,16 @@ time_step='P0DT1H0M0S',
&jedi_lfric_settings
forecast_length='P0DT6H0M0S',
/
-
-#### Configure LFRic
-
&base_mesh
-file_prefix='mesh_C12',
+file_prefix='mesh_C12_MG',
geometry='spherical',
prepartitioned=.false.,
-prime_mesh_name='C12',
+prime_mesh_name='dynamics',
topology='fully_periodic',
/
&boundaries
limited_area=.false.,
-transport_overwrite_freq='final'
+transport_overwrite_freq='final',
/
&checks
limit_cfl=.false.,
@@ -70,6 +64,15 @@ spectral_gwd='none',
stochastic_physics='none',
surface='none',
/
+&convection
+dx_ref=50000.0,
+l_cvdiag_ctop_qmax=.false.,
+qlmin=4.0e-4,
+resdep_precipramp=.false.,
+/
+&cosp
+l_cosp=.false.,
+/
&damping_layer
dl_base=40000.0,
dl_str=0.05,
@@ -79,6 +82,7 @@ dl_type='standard',
horizontal_limit='cap',
horizontal_method='ffsl',
n_dep_pt_iterations=1,
+share_stencil_extent=.true.,
vertical_limit='exponential',
vertical_method='timeaverage',
vertical_sorting=.false.,
@@ -96,7 +100,7 @@ stretching_height=17507.0,
stretching_method='smooth',
/
&files
-ancil_directory='/data/users/lfric/data/ancils/basic-gal/yak/C12',
+ancil_directory='/data/users/lfricadmin/data/ancils/basic-gal/yak/C12',
checkpoint_stem_name='',
diag_stem_name='',
orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog',
@@ -117,10 +121,10 @@ dlayer_on=.true.,
dry_static_adjust=.true.,
eos_method='sampled',
exner_from_eos=.false.,
-horizontal_physics_predictor=.false.
-horizontal_transport_predictor=.false.
+horizontal_physics_predictor=.false.,
+horizontal_transport_predictor=.false.,
init_exner_bt=.true.,
-l_multigrid=.false.,
+l_multigrid=.true.,
lagged_orog=.true.,
moisture_formulation='traditional',
moisture_in_solver=.true.,
@@ -130,27 +134,36 @@ shallow=.true.,
si_momentum_equation=.false.,
theta_moist_source=.false.,
use_multires_coupling=.false.,
-use_physics=.false.,
+use_physics=.true.,
use_wavedynamics=.true.,
vector_invariant=.false.,
/
&helmholtz_solver
-fail_on_non_converged=.false.,
-gcrk=18,
-method='bicgstab',
-monitor_convergence=.true.,
+gcrk=8,
+method='prec_only',
+monitor_convergence=.false.,
normalise=.true.,
-preconditioner='tridiagonal',
-si_pressure_a_tol=0,
-si_pressure_maximum_iterations=40,
-si_pressure_tolerance=1.0e-15,
+preconditioner='multigrid',
+si_pressure_a_tol=1.0e-8,
+si_pressure_maximum_iterations=400,
+si_pressure_tolerance=1.0e-4,
+/
+&iau_addinf_io
+/
+&iau_addinf_io
+/
+&iau_ainc_io
+/
+&iau_ainc_io
+/
+&iau_bcorr_io
+/
+&iau
/
&idealised
f_lon_deg=0.0,
-perturb_init=.false.
-perturb_magnitude=0
-perturb_seed=0
-test='gravity_wave',
+perturb_init=.false.,
+test='none',
/
&ideal_surface
canopy_height=19.01,16.38,0.79,1.26,1.0,
@@ -174,7 +187,6 @@ coarse_ozone_ancil=.false.,
init_option='analytic',
lbc_option='none',
ls_option='analytic',
-model_eos_height=100,
n_orog_smooth=0,
read_w2h_wind=.true.,
sea_ice_source='ancillary',
@@ -185,10 +197,10 @@ zero_w2v_wind=.false.,
&initial_density
density_background=0.1,
density_max=2.0,
-r1=0.0,
-r2=0.0,
-x1=0.0,
-x2=0.0,
+r1=0.4,
+r2=0.4,
+x1=0.4,
+x2=-0.4,
y1=0.0,
y2=0.0,
z1=0.0,
@@ -200,7 +212,7 @@ surface_pressure=1000.0e2,
/
&initial_temperature
bvf_square=0.0001,
-pert_centre=120.0,
+pert_centre=60.0,
pert_width_scaling=1.0,
perturb='none',
theta_surf=300.0,
@@ -209,22 +221,25 @@ theta_surf=300.0,
/
&initial_wind
nl_constant=0.0,
-profile='none',
+profile='constant_uv',
sbr_angle_lat=0.0,
sbr_angle_lon=0.0,
-smp_init_wind=.false.,
-u0=0.0,
+smp_init_wind=.true.,
+u0=2.0,
v0=0.0,
wind_time_period=0.0,
/
&io
checkpoint_read=.false.,
+checkpoint_times=,
checkpoint_write=.false.,
counter_output_suffix='counter.txt',
diag_active_files='lfric_diag',
diag_always_on_sampling=.false.,
diagnostic_frequency=8,
+end_of_run_checkpoint=.true.,
file_convention='UGRID',
+multifile_io=.false.,
nodal_output_on_w3=.false.,
subroutine_counters=.false.,
subroutine_timers=.true.,
@@ -237,26 +252,42 @@ write_fluxes=.false.,
write_minmax_tseries=.false.,
/
&linear
-fixed_ls=.true.
+fixed_ls=.true.,
+l_stabilise_bl=.false.,
ls_read_w2h=.false.,
-pert_option='analytic',
+max_bl_stabilisation=0.75,
+n_bl_levels_to_stabilise=15,
+pert_option='file',
+transport_efficiency=.true.,
+/
+&linear_physics
+blevs_m=15,
+e_folding_levs_m=10,
+l_0_m=80.0,
+l_boundary_layer=.true.,
+log_layer=2,
+u_land_m=0.4,
+u_sea_m=0.4,
+z_land_m=0.05,
+z_sea_m=0.0005,
/
&logging
+log_to_rank_zero_only=.false.,
run_log_level='info',
/
&mixed_solver
eliminate_variables='discrete',
-fail_on_non_converged=.false.,
-gcrk=10,
+fail_on_non_converged=.true.,
+gcrk=4,
guess_np1=.false.,
-mixed_solver_a_tol=1.0e-21,
+mixed_solver_a_tol=1.0e-3,
monitor_convergence=.true.,
normalise=.true.,
reference_reset_time=3600.0,
-si_maximum_iterations=7,
+si_maximum_iterations=10,
si_method='block_gcr',
si_preconditioner='pressure',
-si_tolerance=1.0e-21,
+si_tolerance=1.0e-1,
split_w=.true.,
/
&mixing
@@ -265,6 +296,14 @@ smagorinsky=.false.,
viscosity=.false.,
viscosity_mu=0.0,
/
+&multigrid
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2',
+multigrid_chain_nitems=3,
+n_coarsesmooth=4,
+n_postsmooth=2,
+n_presmooth=2,
+smooth_relaxation=0.8,
+/
&esm_couple
l_esm_couple_test=.false.,
/
@@ -272,15 +311,23 @@ l_esm_couple_test=.false.,
orog_init_option='ancil',
/
&partitioning
+generate_inner_halos=.false.,
panel_decomposition='auto',
panel_xproc=1,
panel_yproc=1,
partitioner='cubedsphere',
/
&physics
+bl_segment=0,
+configure_segments=.true.,
+conv_gr_segment=16,
+gw_segment=0,
limit_drag_incs=.false.,
+ls_ppn_segment=0,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
+sample_physics_winds_correction=.false.,
+ussp_segment=0,
/
&planet
cp=1005.0,
@@ -292,10 +339,14 @@ scaling_factor=1.0,
/
&radiative_gases
cfc113_rad_opt='off',
-cfc11_rad_opt='off',
-cfc12_rad_opt='off',
-ch4_rad_opt='off',
-co2_rad_opt='off',
+cfc11_mix_ratio=1.110e-09,
+cfc11_rad_opt='constant',
+cfc12_mix_ratio=2.187e-09,
+cfc12_rad_opt='constant',
+ch4_mix_ratio=1.006e-06,
+ch4_rad_opt='constant',
+co2_mix_ratio=6.002e-04,
+co2_rad_opt='constant',
co_rad_opt='off',
cs_rad_opt='off',
h2_rad_opt='off',
@@ -308,24 +359,27 @@ k_rad_opt='off',
l_cts_fcg_rates=.false.,
li_rad_opt='off',
n2_rad_opt='off',
-n2o_rad_opt='off',
+n2o_mix_ratio=4.945e-07,
+n2o_rad_opt='constant',
na_rad_opt='off',
nh3_rad_opt='off',
-o2_rad_opt='off',
-o3_rad_opt='off',
+o2_mix_ratio=0.2314,
+o2_rad_opt='constant',
+o3_rad_opt='ancil',
rb_rad_opt='off',
so2_rad_opt='off',
tio_rad_opt='off',
vo_rad_opt='off',
/
&solver
-fail_on_non_converged=.false.,
gcrk=18,
-maximum_iterations=50,
+maximum_iterations=7,
method='chebyshev',
monitor_convergence=.false.,
preconditioner='diagonal',
-tolerance=1.0e-18,
+tolerance=1.0e-6,
+/
+&specified_surface
/
&time
calendar='timestep',
@@ -337,8 +391,8 @@ timestep_start='1',
/
×tepping
alpha=0.55,
-dt=3600,
-inner_iterations=2,
+dt=1800,
+inner_iterations=1,
method='semi_implicit',
outer_iterations=2,
runge_kutta_method='forward_euler',
@@ -349,10 +403,12 @@ tau_u=0.55,
/
&transport
adjust_theta=.false.,
-adjust_vhv_wind=.false.
+adjust_tracer_equation=.false.,
+adjust_vhv_wind=.false.,
+ageofair_reset_level=10,
broken_w2_projection=.false.,
calculate_detj='upwind',
-cap_density_predictor=0.01,
+cap_density_predictor=0.5,
cfl_mol_1d_stab=1.0,
cfl_mol_2d_stab=1.0,
cfl_mol_3d_stab=1.0,
@@ -362,43 +418,45 @@ dep_pt_stencil_extent=3,
dry_field_name='density',
enforce_min_value=5*.false.,
equation_form=1,2,2,2,2,
-ffsl_inner_order=2,
-ffsl_outer_order=2,
+ffsl_inner_order=0,
+ffsl_outer_order=1,
ffsl_splitting=5*1,
-ffsl_unity_3d=.false.
-ffsl_vertical_order=5*2
-field_names='density','potential_temperature','wind','moisture','cloud',
+ffsl_unity_3d=.false.,
+ffsl_vertical_order=2,2,1,2,2,
+field_names='density','potential_temperature','wind','moisture',
+'con_tracer',
fv_horizontal_order=2,
fv_vertical_order=2,
horizontal_method=5*1,
horizontal_monotone=5*1,
-log_space=5*.false.,
-max_vert_cfl_calc='uniform',
+log_space=.true.,.true.,.false.,.false.,.false.,
+max_vert_cfl_calc='dep_point',
min_val_abs_tol=-1.0e-12,
min_val_max_iterations=10,
min_val_method='iterative',
min_value=0.0,0.0,-99999999.0,0.0,0.0,
oned_reconstruction=.false.,
operators='fv',
-panel_edge_high_order=.false.
-panel_edge_treatment='none'
+panel_edge_high_order=.true.,
+panel_edge_treatment='none',
profile_size=5,
-reversible=5*.false.,
+reversible=.true.,.true.,.false.,.true.,.true.,
runge_kutta_method='ssp3',
scheme=5*1,
si_outer_transport='none',
slice_order='parabola',
+special_edges_monotone=5*1,
splitting=5*1,
substep_transport='off',
theta_dispersion_correction=.false.,
theta_variable='dry',
+transport_ageofair=.false.,
use_density_predictor=.false.,
vertical_method=5*1,
vertical_monotone=5*1,
-vertical_monotone_order=5*1,
+vertical_monotone_order=5*3,
vertical_sl_order='cubic',
-wind_mono_top=.false.
-wind_mono_top_depth=5
+wind_mono_top=.false.,
/
&validity_test
number_gamma_values=2,
diff --git a/applications/jedi_lfric_tests/example_id_tlm_tests/iodef.xml b/applications/jedi_lfric_tests/example_id_tlm_tests/iodef.xml
index fade05b82..eaf53286a 100644
--- a/applications/jedi_lfric_tests/example_id_tlm_tests/iodef.xml
+++ b/applications/jedi_lfric_tests/example_id_tlm_tests/iodef.xml
@@ -47,7 +47,7 @@
-
+
@@ -61,7 +61,7 @@
-
+
@@ -74,7 +74,7 @@
-
+
@@ -144,6 +144,11 @@
+
+
+
+
+
@@ -234,6 +239,8 @@
+
+
@@ -280,6 +287,8 @@
+
+
@@ -396,7 +405,7 @@
-
+
@@ -421,6 +430,7 @@
+
diff --git a/applications/jedi_lfric_tests/example_id_tlm_tests/mesh_C12.nc b/applications/jedi_lfric_tests/example_id_tlm_tests/mesh_C12.nc
deleted file mode 100644
index f7ea6988e22a06194aac0d17b6e3be62cd539773..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 85708
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
Rwf*lmDjqBQ-|O@_{yzW$Qgi?S
diff --git a/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration.nml b/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration.nml
index f61e5aab0..3ea39dd10 100644
--- a/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration.nml
+++ b/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration.nml
@@ -1,30 +1,28 @@
&jedi_lfric_tests
test_field='theta',
/
-
-#### Configure JEDI-LFRIC
-
&jedi_geometry
io_calender_start='2018-04-14T21:00:00',
-io_path_inc_read='/data/users/lfric/data/jedi-lfric/Ticket354/pert_fields/lfric_diag',
-io_path_state_read='/data/users/lfric/data/jedi-lfric/Ticket354/ls_fields/jedi_trajectory',
+io_path_inc_read='/data/users/lfricadmin/data/jedi-lfric/Ticket354/pert_fields/lfric_diag',
+io_path_state_read='/data/users/lfricadmin/data/jedi-lfric/Ticket354/ls_fields/jedi_trajectory',
io_path_state_write='write_file',
-io_setup_increment=.true.,
+io_setup_increment=.false.,
io_time_step='P0DT1H0M0S',
/
&jedi_state
state_time='2018-04-14 21:00:00',
use_pseudo_model=.true.,
-variables='theta','rho','u10m','exner','u_in_w3','v_in_w3','w_in_wth',
-'m_v','m_cl','m_r','m_s',
+variables='theta','rho','exner','u_in_w3','v_in_w3','w_in_wth','m_v',
+'m_cl','m_r','m_s','land_fraction',
/
&jedi_increment
inc_time='2018-04-14 21:00:00',
-initialise_via_read=.true.,
+initialise_via_read=.false.,
variables='theta','rho','exner','u_in_w3','v_in_w3','w_in_wth','m_v',
'm_cl','m_r','m_s',
/
&jedi_linear_model
+incremental_wind_interpolation=.false.,
nl_time_step='P0DT1H0M0S',
/
&jedi_pseudo_model
@@ -33,21 +31,19 @@ number_of_steps=9,
time_step='P0DT1H0M0S',
/
&jedi_lfric_settings
+adjoint_test_tolerance=1.0e-3,
forecast_length='P0DT6H0M0S',
/
-
-#### Configure LFRic
-
&base_mesh
-file_prefix='mesh_C12',
+file_prefix='mesh_C12_MG',
geometry='spherical',
prepartitioned=.false.,
-prime_mesh_name='C12',
+prime_mesh_name='dynamics',
topology='fully_periodic',
/
&boundaries
limited_area=.false.,
-transport_overwrite_freq='final'
+transport_overwrite_freq='final',
/
&checks
limit_cfl=.false.,
@@ -69,6 +65,15 @@ spectral_gwd='none',
stochastic_physics='none',
surface='none',
/
+&convection
+dx_ref=50000.0,
+l_cvdiag_ctop_qmax=.false.,
+qlmin=4.0e-4,
+resdep_precipramp=.false.,
+/
+&cosp
+l_cosp=.false.,
+/
&damping_layer
dl_base=40000.0,
dl_str=0.05,
@@ -78,7 +83,7 @@ dl_type='standard',
horizontal_limit='cap',
horizontal_method='ffsl',
n_dep_pt_iterations=1,
-share_stencil_extent=.true.
+share_stencil_extent=.true.,
vertical_limit='exponential',
vertical_method='timeaverage',
vertical_sorting=.false.,
@@ -96,7 +101,7 @@ stretching_height=17507.0,
stretching_method='smooth',
/
&files
-ancil_directory='/data/users/lfric/data/ancils/basic-gal/yak/C12',
+ancil_directory='/data/users/lfricadmin/data/ancils/basic-gal/yak/C12',
checkpoint_stem_name='',
diag_stem_name='',
orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog',
@@ -117,10 +122,10 @@ dlayer_on=.true.,
dry_static_adjust=.true.,
eos_method='sampled',
exner_from_eos=.false.,
-horizontal_physics_predictor=.false.
-horizontal_transport_predictor=.false.
+horizontal_physics_predictor=.false.,
+horizontal_transport_predictor=.false.,
init_exner_bt=.true.,
-l_multigrid=.false.,
+l_multigrid=.true.,
lagged_orog=.true.,
moisture_formulation='traditional',
moisture_in_solver=.true.,
@@ -128,29 +133,38 @@ p2theta_vert=.true.,
rotating=.true.,
shallow=.true.,
si_momentum_equation=.false.,
-theta_moist_source=.false.
+theta_moist_source=.false.,
use_multires_coupling=.false.,
-use_physics=.false.,
+use_physics=.true.,
use_wavedynamics=.true.,
vector_invariant=.false.,
/
&helmholtz_solver
-fail_on_non_converged=.false.,
-gcrk=18,
-method='bicgstab',
-monitor_convergence=.true.,
+gcrk=8,
+method='prec_only',
+monitor_convergence=.false.,
normalise=.true.,
-preconditioner='tridiagonal',
-si_pressure_a_tol=0,
-si_pressure_maximum_iterations=40,
-si_pressure_tolerance=1.0e-15,
+preconditioner='multigrid',
+si_pressure_a_tol=1.0e-8,
+si_pressure_maximum_iterations=400,
+si_pressure_tolerance=1.0e-4,
+/
+&iau_addinf_io
+/
+&iau_addinf_io
+/
+&iau_ainc_io
+/
+&iau_ainc_io
+/
+&iau_bcorr_io
+/
+&iau
/
&idealised
f_lon_deg=0.0,
-perturb_init=.false.
-perturb_magnitude=0
-perturb_seed=0
-test='gravity_wave',
+perturb_init=.false.,
+test='none',
/
&ideal_surface
canopy_height=19.01,16.38,0.79,1.26,1.0,
@@ -174,7 +188,6 @@ coarse_ozone_ancil=.false.,
init_option='analytic',
lbc_option='none',
ls_option='analytic',
-model_eos_height=100,
n_orog_smooth=0,
read_w2h_wind=.true.,
sea_ice_source='ancillary',
@@ -185,10 +198,10 @@ zero_w2v_wind=.false.,
&initial_density
density_background=0.1,
density_max=2.0,
-r1=0.0,
-r2=0.0,
-x1=0.0,
-x2=0.0,
+r1=0.4,
+r2=0.4,
+x1=0.4,
+x2=-0.4,
y1=0.0,
y2=0.0,
z1=0.0,
@@ -200,7 +213,7 @@ surface_pressure=1000.0e2,
/
&initial_temperature
bvf_square=0.0001,
-pert_centre=120.0,
+pert_centre=60.0,
pert_width_scaling=1.0,
perturb='none',
theta_surf=300.0,
@@ -209,22 +222,25 @@ theta_surf=300.0,
/
&initial_wind
nl_constant=0.0,
-profile='none',
+profile='constant_uv',
sbr_angle_lat=0.0,
sbr_angle_lon=0.0,
-smp_init_wind=.false.,
-u0=0.0,
+smp_init_wind=.true.,
+u0=2.0,
v0=0.0,
wind_time_period=0.0,
/
&io
checkpoint_read=.false.,
+checkpoint_times=,
checkpoint_write=.false.,
counter_output_suffix='counter.txt',
diag_active_files='lfric_diag',
diag_always_on_sampling=.false.,
diagnostic_frequency=8,
+end_of_run_checkpoint=.true.,
file_convention='UGRID',
+multifile_io=.false.,
nodal_output_on_w3=.false.,
subroutine_counters=.false.,
subroutine_timers=.true.,
@@ -237,26 +253,42 @@ write_fluxes=.false.,
write_minmax_tseries=.false.,
/
&linear
-fixed_ls=.true.
+fixed_ls=.true.,
+l_stabilise_bl=.false.,
ls_read_w2h=.false.,
-pert_option='analytic',
+max_bl_stabilisation=0.75,
+n_bl_levels_to_stabilise=15,
+pert_option='file',
+transport_efficiency=.true.,
+/
+&linear_physics
+blevs_m=15,
+e_folding_levs_m=10,
+l_0_m=80.0,
+l_boundary_layer=.true.,
+log_layer=2,
+u_land_m=0.4,
+u_sea_m=0.4,
+z_land_m=0.05,
+z_sea_m=0.0005,
/
&logging
+log_to_rank_zero_only=.false.,
run_log_level='info',
/
&mixed_solver
eliminate_variables='discrete',
-fail_on_non_converged=.false.,
-gcrk=10,
+fail_on_non_converged=.true.,
+gcrk=4,
guess_np1=.false.,
mixed_solver_a_tol=1.0e-21,
monitor_convergence=.true.,
normalise=.true.,
-reference_reset_time=3600.0,
-si_maximum_iterations=7,
+reference_reset_time=1800,
+si_maximum_iterations=10,
si_method='block_gcr',
si_preconditioner='pressure',
-si_tolerance=1.0e-21,
+si_tolerance=1.0e-3,
split_w=.true.,
/
&mixing
@@ -265,6 +297,14 @@ smagorinsky=.false.,
viscosity=.false.,
viscosity_mu=0.0,
/
+&multigrid
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2',
+multigrid_chain_nitems=3,
+n_coarsesmooth=4,
+n_postsmooth=2,
+n_presmooth=2,
+smooth_relaxation=0.8,
+/
&esm_couple
l_esm_couple_test=.false.,
/
@@ -272,15 +312,23 @@ l_esm_couple_test=.false.,
orog_init_option='ancil',
/
&partitioning
+generate_inner_halos=.false.,
panel_decomposition='auto',
panel_xproc=1,
panel_yproc=1,
partitioner='cubedsphere',
/
&physics
+bl_segment=0,
+configure_segments=.true.,
+conv_gr_segment=16,
+gw_segment=0,
limit_drag_incs=.false.,
+ls_ppn_segment=0,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
+sample_physics_winds_correction=.false.,
+ussp_segment=0,
/
&planet
cp=1005.0,
@@ -292,10 +340,14 @@ scaling_factor=1.0,
/
&radiative_gases
cfc113_rad_opt='off',
-cfc11_rad_opt='off',
-cfc12_rad_opt='off',
-ch4_rad_opt='off',
-co2_rad_opt='off',
+cfc11_mix_ratio=1.110e-09,
+cfc11_rad_opt='constant',
+cfc12_mix_ratio=2.187e-09,
+cfc12_rad_opt='constant',
+ch4_mix_ratio=1.006e-06,
+ch4_rad_opt='constant',
+co2_mix_ratio=6.002e-04,
+co2_rad_opt='constant',
co_rad_opt='off',
cs_rad_opt='off',
h2_rad_opt='off',
@@ -308,24 +360,27 @@ k_rad_opt='off',
l_cts_fcg_rates=.false.,
li_rad_opt='off',
n2_rad_opt='off',
-n2o_rad_opt='off',
+n2o_mix_ratio=4.945e-07,
+n2o_rad_opt='constant',
na_rad_opt='off',
nh3_rad_opt='off',
-o2_rad_opt='off',
-o3_rad_opt='off',
+o2_mix_ratio=0.2314,
+o2_rad_opt='constant',
+o3_rad_opt='ancil',
rb_rad_opt='off',
so2_rad_opt='off',
tio_rad_opt='off',
vo_rad_opt='off',
/
&solver
-fail_on_non_converged=.false.,
gcrk=18,
-maximum_iterations=50,
+maximum_iterations=7,
method='chebyshev',
monitor_convergence=.false.,
preconditioner='diagonal',
-tolerance=1.0e-18,
+tolerance=1.0e-6,
+/
+&specified_surface
/
&time
calendar='timestep',
@@ -337,10 +392,10 @@ timestep_start='1',
/
×tepping
alpha=0.55,
-dt=3600,
-inner_iterations=2,
+dt=1800,
+inner_iterations=1,
method='semi_implicit',
-outer_iterations=2,
+outer_iterations=1,
runge_kutta_method='forward_euler',
spinup_alpha=.false.,
tau_r=1.0,
@@ -349,10 +404,12 @@ tau_u=0.55,
/
&transport
adjust_theta=.false.,
-adjust_vhv_wind=.false.
+adjust_tracer_equation=.false.,
+adjust_vhv_wind=.false.,
+ageofair_reset_level=10,
broken_w2_projection=.false.,
calculate_detj='upwind',
-cap_density_predictor=0.01,
+cap_density_predictor=0.5,
cfl_mol_1d_stab=1.0,
cfl_mol_2d_stab=1.0,
cfl_mol_3d_stab=1.0,
@@ -362,28 +419,29 @@ dep_pt_stencil_extent=3,
dry_field_name='density',
enforce_min_value=5*.false.,
equation_form=1,2,2,2,2,
-ffsl_inner_order=2,
-ffsl_outer_order=2,
+ffsl_inner_order=0,
+ffsl_outer_order=1,
ffsl_splitting=5*1,
-ffsl_unity_3d=.false.
-ffsl_vertical_order=5*2
-field_names='density','potential_temperature','wind','moisture','cloud',
+ffsl_unity_3d=.false.,
+ffsl_vertical_order=2,2,1,2,2,
+field_names='density','potential_temperature','wind','moisture',
+'con_tracer',
fv_horizontal_order=2,
fv_vertical_order=2,
horizontal_method=5*1,
horizontal_monotone=5*1,
-log_space=5*.false.,
-max_vert_cfl_calc='uniform',
+log_space=.true.,.true.,.false.,.false.,.false.,
+max_vert_cfl_calc='dep_point',
min_val_abs_tol=-1.0e-12,
min_val_max_iterations=10,
min_val_method='iterative',
min_value=0.0,0.0,-99999999.0,0.0,0.0,
oned_reconstruction=.false.,
operators='fv',
-panel_edge_high_order=.false.,
-panel_edge_treatment='none'
+panel_edge_high_order=.true.,
+panel_edge_treatment='none',
profile_size=5,
-reversible=5*.false.,
+reversible=.true.,.true.,.false.,.true.,.true.,
runge_kutta_method='ssp3',
scheme=5*1,
si_outer_transport='none',
@@ -393,13 +451,13 @@ splitting=5*1,
substep_transport='off',
theta_dispersion_correction=.false.,
theta_variable='dry',
+transport_ageofair=.false.,
use_density_predictor=.false.,
vertical_method=5*1,
vertical_monotone=5*1,
-vertical_monotone_order=5*1,
+vertical_monotone_order=5*3,
vertical_sl_order='cubic',
-wind_mono_top=.false.
-wind_mono_top_depth=5
+wind_mono_top=.false.,
/
&validity_test
number_gamma_values=2,
diff --git a/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration_op.nml b/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration_op.nml
index 7b9d54bf3..862b1278c 100644
--- a/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration_op.nml
+++ b/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration_op.nml
@@ -345,6 +345,7 @@ tau_u=0.55,
/
&transport
adjust_theta=.false.,
+adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
broken_w2_projection=.false.,
calculate_detj='upwind',
diff --git a/applications/jedi_lfric_tests/example_tlm_forecast_tl/iodef.xml b/applications/jedi_lfric_tests/example_tlm_forecast_tl/iodef.xml
index fade05b82..af380004b 100644
--- a/applications/jedi_lfric_tests/example_tlm_forecast_tl/iodef.xml
+++ b/applications/jedi_lfric_tests/example_tlm_forecast_tl/iodef.xml
@@ -144,6 +144,11 @@
+
+
+
+
+
@@ -234,6 +239,8 @@
+
+
@@ -280,6 +287,8 @@
+
+
@@ -421,6 +430,7 @@
+
diff --git a/applications/jedi_lfric_tests/example_tlm_forecast_tl/mesh_C12.nc b/applications/jedi_lfric_tests/example_tlm_forecast_tl/mesh_C12.nc
deleted file mode 100644
index f7ea6988e22a06194aac0d17b6e3be62cd539773..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 85708
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