diff --git a/applications/adjoint_tests/example/configuration.nml b/applications/adjoint_tests/example/configuration.nml
index ed1e5743..8e73a576 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,12 +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',
/
+&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='debug',
diff --git a/applications/adjoint_tests/example/iodef.xml b/applications/adjoint_tests/example/iodef.xml
index 11c6939f..05aca3e5 100644
--- a/applications/adjoint_tests/example/iodef.xml
+++ b/applications/adjoint_tests/example/iodef.xml
@@ -50,6 +50,11 @@
+
+
+
+
+
@@ -318,6 +323,7 @@
+
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 00000000..c1294aa5
--- /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 00000000..d20707fd
--- /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 = 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
+
+ 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/timestepping/atlt_si_timestep_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/timestepping/atlt_si_timestep_alg_mod.x90
index 73400355..6bf6e18f 100644
--- a/applications/adjoint_tests/source/algorithm/timestepping/atlt_si_timestep_alg_mod.x90
+++ b/applications/adjoint_tests/source/algorithm/timestepping/atlt_si_timestep_alg_mod.x90
@@ -95,7 +95,7 @@ contains
real(kind=r_def) :: u_u_inp_inner_prod, rho_rho_inp_inner_prod, theta_theta_inp_inner_prod, exner_exner_inp_inner_prod, &
mr_mr_inp_inner_prod(nummr), moist_dyn_moist_dyn_inp_inner_prod(num_moist_factors)
real(kind=r_def) :: inner1, inner2
- real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
+ real(kind=r_def), parameter :: overall_tolerance = 5000.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
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 f9d458c4..6590eed3 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 )
@@ -195,6 +204,9 @@ 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_mixed_operator_alg( mesh, modeldb%clock )
diff --git a/applications/jedi_lfric_tests/example/configuration.nml b/applications/jedi_lfric_tests/example/configuration.nml
index 4a16b6de..7237d117 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,26 @@ 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',
/
+&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 +250,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 +263,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 +278,18 @@ 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
+configure_segments=.false.,
limit_drag_incs=.false.,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
-configure_segments=.false.
+sample_physics_winds_correction=.false.,
/
&planet
cp=1005.0,
@@ -252,10 +301,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 +321,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 +341,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 +354,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',
@@ -342,8 +399,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',
@@ -361,8 +418,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/mesh_C12.nc b/applications/jedi_lfric_tests/example/mesh_C12.nc
deleted file mode 100644
index f7ea6988..00000000
Binary files a/applications/jedi_lfric_tests/example/mesh_C12.nc and /dev/null differ
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 00000000..22ba5032
--- /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_id_tlm_tests/configuration.nml b/applications/jedi_lfric_tests/example_id_tlm_tests/configuration.nml
index e1f89373..791328d5 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',
@@ -16,7 +13,7 @@ io_time_step='P0DT1H0M0S',
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',
+'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,41 @@ 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',
+/
+&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 +295,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 +310,18 @@ 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
+configure_segments=.false.,
limit_drag_incs=.false.,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
+sample_physics_winds_correction=.false.,
/
&planet
cp=1005.0,
@@ -292,10 +333,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 +353,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 +385,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',
@@ -350,10 +398,11 @@ tau_u=0.55,
&transport
adjust_theta=.false.,
adjust_tracer_equation=.false.
-adjust_vhv_wind=.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,
@@ -363,43 +412,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 fade05b8..808f8ef9 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 @@
-
+
@@ -396,7 +396,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 f7ea6988..00000000
Binary files a/applications/jedi_lfric_tests/example_id_tlm_tests/mesh_C12.nc and /dev/null differ
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 b4b1b293..1ee46fa1 100644
--- a/applications/jedi_lfric_tests/example_tlm_forecast_tl/configuration.nml
+++ b/applications/jedi_lfric_tests/example_tlm_forecast_tl/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=.true.,
io_time_step='P0DT1H0M0S',
@@ -16,7 +13,7 @@ io_time_step='P0DT1H0M0S',
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',
+'m_v','m_cl','m_r','m_s','land_fraction',
/
&jedi_increment
inc_time='2018-04-14 21:00:00',
@@ -25,6 +22,7 @@ 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,41 @@ 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',
+/
+&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 +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,18 @@ 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
+configure_segments=.false.,
limit_drag_incs=.false.,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
+sample_physics_winds_correction=.false.,
/
&planet
cp=1005.0,
@@ -292,10 +334,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 +354,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 +386,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,
@@ -350,10 +399,11 @@ tau_u=0.55,
&transport
adjust_theta=.false.,
adjust_tracer_equation=.false.
-adjust_vhv_wind=.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,
@@ -363,28 +413,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',
@@ -394,13 +445,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/mesh_C12.nc b/applications/jedi_lfric_tests/example_tlm_forecast_tl/mesh_C12.nc
deleted file mode 100644
index f7ea6988..00000000
Binary files a/applications/jedi_lfric_tests/example_tlm_forecast_tl/mesh_C12.nc and /dev/null differ
diff --git a/applications/jedi_lfric_tests/example_tlm_tests/configuration.nml b/applications/jedi_lfric_tests/example_tlm_tests/configuration.nml
index a8a55db8..f1246548 100644
--- a/applications/jedi_lfric_tests/example_tlm_tests/configuration.nml
+++ b/applications/jedi_lfric_tests/example_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',
@@ -16,7 +13,7 @@ io_time_step='P0DT1H0M0S',
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',
+'m_v','m_cl','m_r','m_s','land_fraction',
/
&jedi_increment
inc_time='2018-04-14 21:00:00',
@@ -25,7 +22,7 @@ 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=.true.,
+incremental_wind_interpolation=.false.,
nl_time_step='P0DT1H0M0S',
/
&jedi_pseudo_model
@@ -34,22 +31,19 @@ number_of_steps=9,
time_step='P0DT1H0M0S',
/
&jedi_lfric_settings
-adjoint_test_tolerance=1.0e-4,
+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.,
@@ -71,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,
@@ -80,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.,
@@ -98,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',
@@ -119,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.,
@@ -130,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,
@@ -176,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',
@@ -187,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,
@@ -202,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,
@@ -211,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.,
@@ -239,26 +253,41 @@ 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',
+/
+&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
@@ -267,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.,
/
@@ -274,15 +311,18 @@ 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
+configure_segments=.false.,
limit_drag_incs=.false.,
sample_physics_scalars=.true.,
sample_physics_winds=.true.,
+sample_physics_winds_correction=.false.,
/
&planet
cp=1005.0,
@@ -294,10 +334,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',
@@ -310,24 +354,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',
@@ -339,10 +386,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,
@@ -352,10 +399,11 @@ tau_u=0.55,
&transport
adjust_theta=.false.,
adjust_tracer_equation=.false.
-adjust_vhv_wind=.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,
@@ -365,28 +413,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',
@@ -396,13 +445,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_tests/configuration_dry.nml b/applications/jedi_lfric_tests/example_tlm_tests/configuration_dry.nml
deleted file mode 100644
index d4c95254..00000000
--- a/applications/jedi_lfric_tests/example_tlm_tests/configuration_dry.nml
+++ /dev/null
@@ -1,406 +0,0 @@
-&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_state_write='write_file',
-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',
-/
-&jedi_increment
-inc_time='2018-04-14 21:00:00',
-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=.true.,
-nl_time_step='P0DT1H0M0S',
-/
-&jedi_pseudo_model
-initial_time='2018-04-14T21:00:00',
-number_of_steps=9,
-time_step='P0DT1H0M0S',
-/
-&jedi_lfric_settings
-adjoint_test_tolerance=1.0e-4,
-forecast_length='P0DT6H0M0S',
-/
-
-#### Configure LFRic
-
-&base_mesh
-file_prefix='mesh_C12',
-geometry='spherical',
-prepartitioned=.false.,
-prime_mesh_name='C12',
-topology='fully_periodic',
-/
-&boundaries
-limited_area=.false.,
-transport_overwrite_freq='final'
-/
-&checks
-limit_cfl=.false.,
-/
-§ion_choice
-aerosol='none',
-boundary_layer='none',
-chemistry='none',
-cloud='none',
-dynamics='gungho',
-external_forcing=.false.,
-iau=.false.,
-iau_sst=.false.,
-iau_surf=.false.,
-methane_oxidation=.false.,
-orographic_drag='none',
-radiation='none',
-spectral_gwd='none',
-stochastic_physics='none',
-surface='none',
-/
-&damping_layer
-dl_base=40000.0,
-dl_str=0.05,
-dl_type='standard',
-/
-&departure_points
-horizontal_limit='cap',
-horizontal_method='ffsl',
-n_dep_pt_iterations=1,
-vertical_limit='exponential',
-vertical_method='timeaverage',
-vertical_sorting=.false.,
-/
-&energy_correction
-encorr_usage='none',
-integral_method='fd',
-/
-&extrusion
-domain_height=80000.0,
-method='um_L70_50t_20s_80km',
-number_of_layers=70,
-planet_radius=6371229.0,
-stretching_height=17507.0,
-stretching_method='smooth',
-/
-&files
-ancil_directory='/data/users/lfric/data/ancils/basic-gal/yak/C12',
-checkpoint_stem_name='',
-diag_stem_name='',
-orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog',
-start_dump_directory='',
-start_dump_filename='',
-/
-&finite_element
-cellshape='quadrilateral',
-coord_order=1,
-coord_system='native',
-element_order_h=0,
-element_order_v=0,
-rehabilitate=.true.,
-vorticity_in_w1=.false.,
-/
-&formulation
-dlayer_on=.true.,
-dry_static_adjust=.true.,
-eos_method='sampled',
-exner_from_eos=.false.,
-horizontal_physics_predictor=.false.
-horizontal_transport_predictor=.false.
-init_exner_bt=.true.,
-l_multigrid=.false.,
-lagged_orog=.true.,
-moisture_formulation='dry',
-moisture_in_solver=.false.,
-p2theta_vert=.true.,
-rotating=.true.,
-shallow=.true.,
-si_momentum_equation=.false.,
-use_multires_coupling=.false.,
-use_physics=.false.,
-use_wavedynamics=.true.,
-vector_invariant=.false.,
-/
-&helmholtz_solver
-fail_on_non_converged=.false.,
-gcrk=18,
-method='bicgstab',
-monitor_convergence=.true.,
-normalise=.true.,
-preconditioner='tridiagonal',
-si_pressure_a_tol=0,
-si_pressure_maximum_iterations=40,
-si_pressure_tolerance=1.0e-15,
-/
-&idealised
-f_lon_deg=0.0,
-perturb_init=.false.
-perturb_magnitude=0
-perturb_seed=0
-test='gravity_wave',
-/
-&ideal_surface
-canopy_height=19.01,16.38,0.79,1.26,1.0,
-leaf_area_index=5.0,4.0,1.5,1.5,1.5,
-n_snow_layers=11*0,
-snow_depth=11*0.0,
-snow_layer_ice_mass=27*0.0,
-snow_layer_temp=27*273.0,
-snow_layer_thickness=27*0.0,
-soil_moisture=15.86,98.861,274.35,862.27,
-soil_temperature=284.508,286.537,289.512,293.066,
-surf_tile_fracs=9*0.0,1.0,0.0,
-surf_tile_temps=9*295.0,300.0,265.0,
-tile_snow_mass=11*0.0,
-/
-&initialization
-ancil_option='none',
-coarse_aerosol_ancil=.false.,
-coarse_orography_ancil=.false.,
-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',
-snow_source='start_dump',
-w0_orography_mapping=.false.,
-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,
-y1=0.0,
-y2=0.0,
-z1=0.0,
-z2=0.0,
-/
-&initial_pressure
-method='balanced',
-surface_pressure=1000.0e2,
-/
-&initial_temperature
-bvf_square=0.0001,
-pert_centre=120.0,
-pert_width_scaling=1.0,
-perturb='none',
-theta_surf=300.0,
-/
-&initial_vapour
-/
-&initial_wind
-nl_constant=0.0,
-profile='none',
-sbr_angle_lat=0.0,
-sbr_angle_lon=0.0,
-smp_init_wind=.false.,
-u0=0.0,
-v0=0.0,
-wind_time_period=0.0,
-/
-&io
-checkpoint_read=.false.,
-checkpoint_write=.false.,
-counter_output_suffix='counter.txt',
-diag_active_files='lfric_diag',
-diag_always_on_sampling=.false.,
-diagnostic_frequency=8,
-file_convention='UGRID',
-nodal_output_on_w3=.false.,
-subroutine_counters=.false.,
-subroutine_timers=.true.,
-timer_output_path='timer.txt',
-use_xios_io=.true.,
-write_conservation_diag=.false.,
-write_diag=.true.,
-write_dump=.false.,
-write_fluxes=.false.,
-write_minmax_tseries=.false.,
-/
-&linear
-fixed_ls=.true.
-ls_read_w2h=.false.,
-pert_option='analytic',
-/
-&logging
-run_log_level='info',
-/
-&mixed_solver
-eliminate_variables='discrete',
-fail_on_non_converged=.false.,
-gcrk=10,
-guess_np1=.false.,
-mixed_solver_a_tol=1.0e-21,
-monitor_convergence=.true.,
-normalise=.true.,
-reference_reset_time=3600.0,
-si_maximum_iterations=7,
-si_method='block_gcr',
-si_preconditioner='pressure',
-si_tolerance=1.0e-21,
-split_w=.true.,
-/
-&mixing
-leonard_term=.false.,
-smagorinsky=.false.,
-viscosity=.false.,
-viscosity_mu=0.0,
-/
-&esm_couple
-l_esm_couple_test=.false.,
-/
-&orography
-orog_init_option='ancil',
-/
-&partitioning
-panel_decomposition='auto',
-panel_xproc=1,
-panel_yproc=1,
-partitioner='cubedsphere',
-/
-&physics
-limit_drag_incs=.false.,
-sample_physics_scalars=.true.,
-sample_physics_winds=.true.,
-/
-&planet
-cp=1005.0,
-gravity=9.80665,
-omega=7.292116E-5,
-p_zero=100000.0,
-rd=287.05,
-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',
-co_rad_opt='off',
-cs_rad_opt='off',
-h2_rad_opt='off',
-h2o_rad_opt='prognostic',
-hcfc22_rad_opt='off',
-hcn_rad_opt='off',
-he_rad_opt='off',
-hfc134a_rad_opt='off',
-k_rad_opt='off',
-l_cts_fcg_rates=.false.,
-li_rad_opt='off',
-n2_rad_opt='off',
-n2o_rad_opt='off',
-na_rad_opt='off',
-nh3_rad_opt='off',
-o2_rad_opt='off',
-o3_rad_opt='off',
-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,
-method='chebyshev',
-monitor_convergence=.false.,
-preconditioner='diagonal',
-tolerance=1.0e-18,
-/
-&time
-calendar='timestep',
-calendar_origin='2018-04-14 21:00:00',
-calendar_start='2018-04-14 21:00:00',
-calendar_type='gregorian',
-timestep_end='13',
-timestep_start='1',
-/
-×tepping
-alpha=0.55,
-dt=3600,
-inner_iterations=2,
-method='semi_implicit',
-outer_iterations=2,
-runge_kutta_method='forward_euler',
-spinup_alpha=.false.,
-tau_r=1.0,
-tau_t=1.0,
-tau_u=0.55,
-/
-&transport
-adjust_theta=.false.,
-adjust_tracer_equation=.false.
-adjust_vhv_wind=.false.
-broken_w2_projection=.false.,
-calculate_detj='upwind',
-cap_density_predictor=0.01,
-cfl_mol_1d_stab=1.0,
-cfl_mol_2d_stab=1.0,
-cfl_mol_3d_stab=1.0,
-cheap_update=.false.,
-consistent_metric=.false.,
-dep_pt_stencil_extent=3,
-dry_field_name='density',
-enforce_min_value=5*.false.,
-equation_form=1,2,2,2,2,
-extended_mesh=.false.,
-ffsl_inner_order=2,
-ffsl_outer_order=2,
-ffsl_splitting=5*1,
-ffsl_unity_3d=.false.
-ffsl_vertical_order=5*2
-field_names='density','potential_temperature','wind','moisture','cloud',
-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',
-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',
-profile_size=5,
-reversible=5*.false.,
-runge_kutta_method='ssp3',
-scheme=5*1,
-si_outer_transport='none',
-slice_order='parabola',
-splitting=5*1,
-substep_transport='off',
-theta_dispersion_correction=.false.,
-theta_variable='dry',
-use_density_predictor=.false.,
-vertical_method=5*1,
-vertical_monotone=5*1,
-vertical_monotone_order=5*1,
-vertical_sl_order='cubic',
-wind_mono_top=.false.
-wind_mono_top_depth=5
-/
-&validity_test
-number_gamma_values=2,
-update_ls_frequency=1,
-/
diff --git a/applications/jedi_lfric_tests/example_tlm_tests/configuration_dry_relaxed.nml b/applications/jedi_lfric_tests/example_tlm_tests/configuration_dry_relaxed.nml
deleted file mode 100644
index 3b26fe9d..00000000
--- a/applications/jedi_lfric_tests/example_tlm_tests/configuration_dry_relaxed.nml
+++ /dev/null
@@ -1,399 +0,0 @@
-&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_state_write='write_file',
-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',
-/
-&jedi_increment
-inc_time='2018-04-14 21:00:00',
-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
-nl_time_step='P0DT1H0M0S',
-/
-&jedi_pseudo_model
-initial_time='2018-04-14T21:00:00',
-number_of_steps=9,
-time_step='P0DT1H0M0S',
-/
-&jedi_lfric_settings
-adjoint_test_tolerance=1.0e-4,
-forecast_length='P0DT6H0M0S',
-/
-
-#### Configure LFRic
-
-&base_mesh
-file_prefix='mesh_C12',
-geometry='spherical',
-prepartitioned=.false.,
-prime_mesh_name='C12',
-topology='fully_periodic',
-/
-&boundaries
-limited_area=.false.,
-transport_overwrite_freq='final'
-/
-&checks
-limit_cfl=.false.,
-/
-§ion_choice
-aerosol='none',
-boundary_layer='none',
-chemistry='none',
-cloud='none',
-dynamics='gungho',
-external_forcing=.false.,
-iau=.false.,
-iau_surf=.false.,
-methane_oxidation=.false.,
-orographic_drag='none',
-radiation='none',
-spectral_gwd='none',
-stochastic_physics='none',
-surface='none',
-/
-&damping_layer
-dl_base=40000.0,
-dl_str=0.05,
-dl_type='standard',
-/
-&departure_points
-horizontal_limit='cap',
-horizontal_method='ffsl',
-n_dep_pt_iterations=1,
-vertical_limit='exponential',
-vertical_method='timeaverage',
-vertical_sorting=.false.,
-/
-&energy_correction
-encorr_usage='none',
-integral_method='fd',
-/
-&extrusion
-domain_height=80000.0,
-method='um_L70_50t_20s_80km',
-number_of_layers=70,
-planet_radius=6371229.0,
-stretching_height=17507.0,
-stretching_method='smooth',
-/
-&files
-ancil_directory='/data/users/lfric/data/ancils/basic-gal/yak/C12',
-checkpoint_stem_name='',
-diag_stem_name='',
-orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog',
-start_dump_directory='',
-start_dump_filename='',
-/
-&finite_element
-cellshape='quadrilateral',
-coord_order=1,
-coord_system='native',
-element_order_h=0,
-element_order_v=0,
-rehabilitate=.true.,
-vorticity_in_w1=.false.,
-/
-&formulation
-dlayer_on=.true.,
-dry_static_adjust=.true.,
-eos_method='sampled',
-exner_from_eos=.false.,
-init_exner_bt=.true.,
-l_multigrid=.false.,
-lagged_orog=.true.,
-moisture_formulation='dry',
-moisture_in_solver=.false.,
-p2theta_vert=.true.,
-rotating=.true.,
-shallow=.true.,
-si_momentum_equation=.false.,
-use_multires_coupling=.false.,
-use_physics=.false.,
-use_wavedynamics=.true.,
-vector_invariant=.false.,
-/
-&helmholtz_solver
-fail_on_non_converged=.false.,
-gcrk=8,
-method='bicgstab',
-monitor_convergence=.true.,
-normalise=.true.,
-preconditioner='tridiagonal',
-si_pressure_a_tol=1.0e-8,
-si_pressure_maximum_iterations=400,
-si_pressure_tolerance=1.0e-4,
-/
-&idealised
-f_lon_deg=0.0,
-perturb_init=.false.
-perturb_magnitude=0
-perturb_seed=0
-test='gravity_wave',
-/
-&ideal_surface
-canopy_height=19.01,16.38,0.79,1.26,1.0,
-leaf_area_index=5.0,4.0,1.5,1.5,1.5,
-n_snow_layers=11*0,
-snow_depth=11*0.0,
-snow_layer_ice_mass=27*0.0,
-snow_layer_temp=27*273.0,
-snow_layer_thickness=27*0.0,
-soil_moisture=15.86,98.861,274.35,862.27,
-soil_temperature=284.508,286.537,289.512,293.066,
-surf_tile_fracs=9*0.0,1.0,0.0,
-surf_tile_temps=9*295.0,300.0,265.0,
-tile_snow_mass=11*0.0,
-/
-&initialization
-ancil_option='none',
-coarse_aerosol_ancil=.false.,
-coarse_orography_ancil=.false.,
-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',
-snow_source='start_dump',
-w0_orography_mapping=.false.,
-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,
-y1=0.0,
-y2=0.0,
-z1=0.0,
-z2=0.0,
-/
-&initial_pressure
-method='balanced',
-surface_pressure=1000.0e2,
-/
-&initial_temperature
-bvf_square=0.0001,
-pert_centre=120.0,
-pert_width_scaling=1.0,
-perturb='none',
-theta_surf=300.0,
-/
-&initial_vapour
-/
-&initial_wind
-nl_constant=0.0,
-profile='none',
-sbr_angle_lat=0.0,
-sbr_angle_lon=0.0,
-smp_init_wind=.false.,
-u0=0.0,
-v0=0.0,
-wind_time_period=0.0,
-/
-&io
-checkpoint_read=.false.,
-checkpoint_write=.false.,
-counter_output_suffix='counter.txt',
-diag_active_files='lfric_diag',
-diag_always_on_sampling=.false.,
-diagnostic_frequency=8,
-file_convention='UGRID',
-nodal_output_on_w3=.false.,
-subroutine_counters=.false.,
-subroutine_timers=.true.,
-timer_output_path='timer.txt',
-use_xios_io=.true.,
-write_conservation_diag=.false.,
-write_diag=.true.,
-write_dump=.false.,
-write_fluxes=.false.,
-write_minmax_tseries=.false.,
-/
-&linear
-ls_read_w2h=.false.,
-pert_option='analytic',
-/
-&logging
-run_log_level='info',
-/
-&mixed_solver
-eliminate_variables='discrete',
-fail_on_non_converged=.false.,
-gcrk=6,
-guess_np1=.false.,
-mixed_solver_a_tol=0.0,
-monitor_convergence=.true.,
-normalise=.true.,
-reference_reset_time=3600.0,
-si_maximum_iterations=10,
-si_method='block_gcr',
-si_preconditioner='pressure',
-si_tolerance=1.0e-5,
-split_w=.true.,
-/
-&mixing
-leonard_term=.false.,
-smagorinsky=.false.,
-viscosity=.false.,
-viscosity_mu=0.0,
-/
-&esm_couple
-l_esm_couple_test=.false.,
-/
-&orography
-orog_init_option='ancil',
-/
-&partitioning
-panel_decomposition='auto',
-panel_xproc=1,
-panel_yproc=1,
-partitioner='cubedsphere',
-/
-&physics
-limit_drag_incs=.false.,
-sample_physics_scalars=.true.,
-sample_physics_winds=.true.,
-/
-&planet
-cp=1005.0,
-gravity=9.80665,
-omega=7.292116E-5,
-p_zero=100000.0,
-rd=287.05,
-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',
-co_rad_opt='off',
-cs_rad_opt='off',
-h2_rad_opt='off',
-h2o_rad_opt='prognostic',
-hcfc22_rad_opt='off',
-hcn_rad_opt='off',
-he_rad_opt='off',
-hfc134a_rad_opt='off',
-k_rad_opt='off',
-l_cts_fcg_rates=.false.,
-li_rad_opt='off',
-n2_rad_opt='off',
-n2o_rad_opt='off',
-na_rad_opt='off',
-nh3_rad_opt='off',
-o2_rad_opt='off',
-o3_rad_opt='off',
-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=7,
-method='chebyshev',
-monitor_convergence=.false.,
-preconditioner='diagonal',
-tolerance=1.0e-6,
-/
-&time
-calendar='timestep',
-calendar_origin='2018-04-14 21:00:00',
-calendar_start='2018-04-14 21:00:00',
-calendar_type='gregorian',
-timestep_end='13',
-timestep_start='1',
-/
-×tepping
-alpha=0.55,
-dt=3600,
-inner_iterations=2,
-method='semi_implicit',
-outer_iterations=2,
-runge_kutta_method='forward_euler',
-spinup_alpha=.false.,
-tau_r=1.0,
-tau_t=1.0,
-tau_u=0.55,
-/
-&transport
-adjust_theta=.false.,
-adjust_tracer_equation=.false.
-adjust_vhv_wind=.false.
-broken_w2_projection=.false.,
-calculate_detj='upwind',
-cap_density_predictor=0.01,
-cfl_mol_1d_stab=1.0,
-cfl_mol_2d_stab=1.0,
-cfl_mol_3d_stab=1.0,
-cheap_update=.false.,
-consistent_metric=.false.,
-dep_pt_stencil_extent=3,
-dry_field_name='density',
-enforce_min_value=5*.false.,
-equation_form=1,2,2,2,2,
-extended_mesh=.false.,
-ffsl_inner_order=2,
-ffsl_outer_order=2,
-ffsl_splitting=5*1,
-ffsl_unity_3d=.false.
-ffsl_vertical_order=5*2
-field_names='density','potential_temperature','wind','moisture','cloud',
-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',
-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',
-profile_size=5,
-reversible=5*.false.,
-runge_kutta_method='ssp3',
-scheme=5*1,
-si_outer_transport='none',
-slice_order='parabola',
-splitting=5*1,
-substep_transport='off',
-theta_dispersion_correction=.false.,
-theta_variable='dry',
-use_density_predictor=.false.,
-vertical_method=5*1,
-vertical_monotone=5*1,
-vertical_monotone_order=5*1,
-vertical_sl_order='cubic',
-/
-&validity_test
-number_gamma_values=2,
-update_ls_frequency=1,
-/
diff --git a/applications/jedi_lfric_tests/example_tlm_tests/iodef.xml b/applications/jedi_lfric_tests/example_tlm_tests/iodef.xml
index fade05b8..808f8ef9 100644
--- a/applications/jedi_lfric_tests/example_tlm_tests/iodef.xml
+++ b/applications/jedi_lfric_tests/example_tlm_tests/iodef.xml
@@ -47,7 +47,7 @@
-
+
@@ -61,7 +61,7 @@
-
+
@@ -74,7 +74,7 @@
-
+
@@ -396,7 +396,7 @@
-
+
diff --git a/applications/jedi_lfric_tests/example_tlm_tests/mesh_C12.nc b/applications/jedi_lfric_tests/example_tlm_tests/mesh_C12.nc
deleted file mode 100644
index f7ea6988..00000000
Binary files a/applications/jedi_lfric_tests/example_tlm_tests/mesh_C12.nc and /dev/null differ
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_id_linear_model_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_id_linear_model_mod.f90
index 4cf75379..2cc8af08 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_id_linear_model_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_id_linear_model_mod.f90
@@ -34,6 +34,7 @@ module jedi_id_linear_model_mod
use jedi_base_linear_model_mod, only : jedi_base_linear_model_type
use jedi_lfric_duration_mod, only : jedi_duration_type
use jedi_lfric_linear_fields_mod, only : variable_names, &
+ ls_variable_names, &
create_linear_fields
use jedi_lfric_wind_fields_mod, only : create_scalar_winds, &
setup_vector_wind
@@ -184,10 +185,10 @@ subroutine set_trajectory( self, jedi_state )
! Create field collection that contains the linear state fields
! without "ls_" prepended.
- call create_linear_fields(jedi_state%geometry%get_mesh(), next_linear_state)
+ call create_linear_fields(jedi_state%geometry%get_mesh(), jedi_state%geometry%get_twod_mesh(), next_linear_state)
! Copy data from the input state into next_linear_state
- call jedi_state%get_to_field_collection( variable_names, &
+ call jedi_state%get_to_field_collection( ls_variable_names, &
next_linear_state )
! Create W2 wind, interpolate from scaler winds (W3/Wtheta) then
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_linear_model_mod.f90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_linear_model_mod.f90
index 6be77032..79720112 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_linear_model_mod.f90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_linear_model_mod.f90
@@ -39,6 +39,7 @@ module jedi_linear_model_mod
zero_moist_fields
use jedi_lfric_duration_mod, only : jedi_duration_type
use jedi_lfric_linear_fields_mod, only : variable_names, &
+ ls_variable_names, &
create_linear_fields
use jedi_lfric_wind_fields_mod, only : create_scalar_winds, &
setup_vector_wind
@@ -182,10 +183,10 @@ subroutine set_trajectory( self, jedi_state )
! Create field collection that contains the linear state fields
! without "ls_" prepended.
- call create_linear_fields(jedi_state%geometry%get_mesh(), next_linear_state)
+ call create_linear_fields(jedi_state%geometry%get_mesh(), jedi_state%geometry%get_twod_mesh(), next_linear_state)
! Copy data from the input state into next_linear_state
- call jedi_state%get_to_field_collection( variable_names, &
+ call jedi_state%get_to_field_collection( ls_variable_names, &
next_linear_state )
! Create W2 wind, interpolate from scaler winds (W3/Wtheta) then
diff --git a/applications/jedi_lfric_tests/source/jedi-interface/jedi_setup_field_meta_data_mod.F90 b/applications/jedi_lfric_tests/source/jedi-interface/jedi_setup_field_meta_data_mod.F90
index c8d0c0f0..34dd084d 100644
--- a/applications/jedi_lfric_tests/source/jedi-interface/jedi_setup_field_meta_data_mod.F90
+++ b/applications/jedi_lfric_tests/source/jedi-interface/jedi_setup_field_meta_data_mod.F90
@@ -108,6 +108,9 @@ subroutine get_field_info(function_space, is_2d, variable_name)
case ( "u10m" )
function_space = W3
is_2d = .true.
+ case ( "land_fraction" )
+ function_space = W3
+ is_2d = .true.
case default
write ( log_scratch_space, '(4A)' ) &
"jedi_setup_field_meta_data_mod::get_field_info:: ", &
diff --git a/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90 b/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90
index bd1d338d..a5f452f7 100644
--- a/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90
+++ b/applications/jedi_lfric_tests/source/jedi_tlm_tests.f90
@@ -35,7 +35,7 @@
program jedi_tlm_tests
use cli_mod, only : parse_command_line
- use constants_mod, only : PRECISION_REAL, i_def, str_def, r_def
+ use constants_mod, only : PRECISION_REAL, i_def, str_def, r_def, l_def
use field_collection_mod, only : field_collection_type
use log_mod, only : log_event, log_scratch_space, &
LOG_LEVEL_ALWAYS, LOG_LEVEL_ERROR, &
@@ -71,6 +71,8 @@ program jedi_tlm_tests
integer( kind=i_def ) :: model_communicator
type( jedi_duration_type ) :: forecast_length
type( namelist_type ), pointer :: jedi_lfric_settings_config
+ type( namelist_type ), pointer :: jedi_increment_config
+ logical( kind=l_def ) :: real_increment
character( str_def ) :: forecast_length_str
real( kind=r_def ) :: dot_product_1
real( kind=r_def ) :: dot_product_2
@@ -110,6 +112,12 @@ program jedi_tlm_tests
! Create geometry
call geometry%initialise( model_communicator, configuration )
+ ! Create inc_initial, either from file or random
+ call inc_initial%initialise( geometry, configuration )
+ jedi_increment_config => configuration%get_namelist('jedi_increment')
+ call jedi_increment_config%get_value( 'initialise_via_read', real_increment )
+ if (.not. real_increment) call inc_initial%random()
+
! Create state
call state%initialise( geometry, configuration )
@@ -127,10 +135,6 @@ program jedi_tlm_tests
! ---- Perform the adjoint test
- ! Create inc_initial and randomise
- call inc_initial%initialise( geometry, configuration )
- call inc_initial%random()
-
! Check the norm is not zero
if (inc_initial%norm() <= 0.0_r_def) then
call log_event("inc_initial norm not > 0.0", LOG_LEVEL_ERROR)
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 c7d2bb14..5a665c30 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
@@ -191,7 +191,7 @@ subroutine initialise_modeldb( modeldb_name, filename, mpi_obj, modeldb, atl_si_
aerosol_twod_mesh )
! Instantiate the linearisation state
- call linear_create_ls_analytic( modeldb, mesh )
+ call linear_create_ls_analytic( modeldb, mesh, twod_mesh )
! 4. Initialise the model
diff --git a/interfaces/jedi_lfric_interface/source/field/jedi_lfric_linear_fields_mod.f90 b/interfaces/jedi_lfric_interface/source/field/jedi_lfric_linear_fields_mod.f90
index b1ab2359..9f7185cd 100644
--- a/interfaces/jedi_lfric_interface/source/field/jedi_lfric_linear_fields_mod.f90
+++ b/interfaces/jedi_lfric_interface/source/field/jedi_lfric_linear_fields_mod.f90
@@ -21,7 +21,7 @@
!> ii) all three "moist_dyn" fields.
!>
module jedi_lfric_linear_fields_mod
- use constants_mod, only : i_def, str_def, r_def
+ use constants_mod, only : i_def, str_def, r_def, l_def
use field_mod, only : field_type
use field_collection_mod, only : field_collection_type
use fs_continuity_mod, only : W3, Wtheta, W2
@@ -35,6 +35,7 @@ module jedi_lfric_linear_fields_mod
integer( kind=i_def ), parameter :: element_order_h = 0
integer( kind=i_def ), parameter :: element_order_v = 0
integer( kind=i_def ), parameter :: nvars = 10
+ integer( kind=i_def ), parameter :: ls_nvars = 11
character( len=str_def ), parameter, public :: &
variable_names(nvars) = (/'theta ', &
'exner ', &
@@ -46,6 +47,18 @@ module jedi_lfric_linear_fields_mod
'm_cl ', &
'm_r ', &
'm_s '/)
+ character( len=str_def ), parameter, public :: &
+ ls_variable_names(ls_nvars) = (/'theta ', &
+ 'exner ', &
+ 'rho ', &
+ 'u_in_w3 ', &
+ 'v_in_w3 ', &
+ 'w_in_wth ', &
+ 'm_v ', &
+ 'm_cl ', &
+ 'm_r ', &
+ 'm_s ', &
+ 'land_fraction'/)
integer( kind=i_def ), parameter, public :: &
variable_function_spaces(nvars) = (/Wtheta, &
@@ -58,6 +71,31 @@ module jedi_lfric_linear_fields_mod
Wtheta, &
Wtheta, &
Wtheta/)
+ integer( kind=i_def ), parameter, public :: &
+ ls_variable_function_spaces(ls_nvars) = (/Wtheta, &
+ W3, &
+ W3, &
+ W3, &
+ W3, &
+ Wtheta, &
+ Wtheta, &
+ Wtheta, &
+ Wtheta, &
+ Wtheta, &
+ W3/)
+
+ logical( kind=l_def ), parameter, public :: &
+ ls_variable_is_2d(ls_nvars) = (/.false., &
+ .false., &
+ .false., &
+ .false., &
+ .false., &
+ .false., &
+ .false., &
+ .false., &
+ .false., &
+ .false., &
+ .true./)
public :: create_linear_fields
@@ -69,33 +107,42 @@ module jedi_lfric_linear_fields_mod
!> @brief Create a field collection that includes the linear model variables
!>
!> @param [in] mesh Pointer to a mesh object
+!> @param [in] twod_mesh Pointer to a 2D mesh object
!> @param [out] linear_fields A field collection that includes the linear
!> fields
-subroutine create_linear_fields( mesh, linear_fields )
+subroutine create_linear_fields( mesh, twod_mesh, linear_fields )
implicit none
type( mesh_type ), pointer, intent(in) :: mesh
+ type( mesh_type ), pointer, intent(in) :: twod_mesh
type( field_collection_type ), intent(out) :: linear_fields
! Local
type( field_type ) :: field
+ type( mesh_type ), pointer :: mesh_for_field
character( len=str_def ) :: variable_name
integer :: i
! Setup the field_collection
- call linear_fields%initialise(name = 'linear_state_trajectory', table_len = nvars)
+ call linear_fields%initialise(name = 'linear_state_trajectory', table_len = ls_nvars)
! Create and add the fields defined in the list of variable names
- do i = 1, nvars
+ do i = 1, ls_nvars
+
+ variable_name = trim(ls_variable_names(i))
- variable_name = trim(variable_names(i))
+ if (ls_variable_is_2d(i)) then
+ mesh_for_field => twod_mesh
+ else
+ mesh_for_field => mesh
+ end if
call field%initialise( &
- vector_space = function_space_collection%get_fs(mesh, &
+ vector_space = function_space_collection%get_fs(mesh_for_field, &
element_order_h, &
element_order_v, &
- variable_function_spaces(i)), &
+ ls_variable_function_spaces(i)), &
name = variable_name )
call linear_fields%add_field( field )
diff --git a/rose-stem/app/adjoint_tests/file/iodef.xml b/rose-stem/app/adjoint_tests/file/iodef.xml
index 11c6939f..05aca3e5 100644
--- a/rose-stem/app/adjoint_tests/file/iodef.xml
+++ b/rose-stem/app/adjoint_tests/file/iodef.xml
@@ -50,6 +50,11 @@
+
+
+
+
+
@@ -318,6 +323,7 @@
+
diff --git a/rose-stem/app/adjoint_tests/opt/rose-app-nwp_gal9_c12.conf b/rose-stem/app/adjoint_tests/opt/rose-app-nwp_gal9_c12.conf
index 4b375741..6bc37fdb 100644
--- a/rose-stem/app/adjoint_tests/opt/rose-app-nwp_gal9_c12.conf
+++ b/rose-stem/app/adjoint_tests/opt/rose-app-nwp_gal9_c12.conf
@@ -3,8 +3,8 @@ mode=auto
source=$ROSE_SUITE_DIR/app/linear_model/file/iodef.xml
[namelist:files]
-ls_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
-ls_filename='final_ls'
+ls_directory='/data/users/tim.payne/lfric_apps/files'
+ls_filename='final_ls_with_land'
start_dump_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
start_dump_filename='final_pert'
diff --git a/rose-stem/app/adjoint_tests/rose-app.conf b/rose-stem/app/adjoint_tests/rose-app.conf
index 5fe4dd67..36f3b325 100644
--- a/rose-stem/app/adjoint_tests/rose-app.conf
+++ b/rose-stem/app/adjoint_tests/rose-app.conf
@@ -62,6 +62,7 @@ source=(namelist:aerosol)
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
= (namelist:microphysics)
= namelist:mixed_solver
@@ -378,7 +379,7 @@ diag_stem_name='diagGungho'
!!land_area_ancil_path=''
!!lbc_directory=''
!!lbc_filename=''
-ls_directory='$BIG_DATA_DIR/tangent-linear/Ticket735'
+ls_directory='/data/users/tim.payne/lfric_apps/files'
ls_filename='final_2021060200-2021060207'
!!no3_ancil_path=''
!!o3_ancil_path=''
@@ -744,12 +745,23 @@ l_spec_veg_z0=.true.
[namelist: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'
+[namelist: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
+
[namelist:logging]
log_to_rank_zero_only=.true.
run_log_level='info'
diff --git a/rose-stem/app/jedi_forecast/rose-app.conf b/rose-stem/app/jedi_forecast/rose-app.conf
index 07f26b8c..7e69925a 100644
--- a/rose-stem/app/jedi_forecast/rose-app.conf
+++ b/rose-stem/app/jedi_forecast/rose-app.conf
@@ -62,6 +62,7 @@ source=namelist:jedi_lfric_tests
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
= namelist:mixed_solver
= (namelist:mixing)
@@ -773,6 +774,17 @@ l_stabilise_bl=.false.
ls_read_w2h=.false.
pert_option='analytic'
+[namelist: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
+
[namelist:logging]
log_to_rank_zero_only=.true.
run_log_level='info'
diff --git a/rose-stem/app/jedi_forecast_pseudo/rose-app.conf b/rose-stem/app/jedi_forecast_pseudo/rose-app.conf
index fadda286..69575553 100644
--- a/rose-stem/app/jedi_forecast_pseudo/rose-app.conf
+++ b/rose-stem/app/jedi_forecast_pseudo/rose-app.conf
@@ -60,6 +60,7 @@ source=namelist:jedi_lfric_tests
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
= namelist:mixed_solver
= (namelist:mixing)
@@ -767,6 +768,17 @@ l_stabilise_bl=.false.
ls_read_w2h=.false.
pert_option='analytic'
+[namelist: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
+
[namelist:logging]
log_to_rank_zero_only=.true.
run_log_level='info'
diff --git a/rose-stem/app/jedi_id_tlm_tests/file/iodef.xml b/rose-stem/app/jedi_id_tlm_tests/file/iodef.xml
index 808f8ef9..e6fe117c 100644
--- a/rose-stem/app/jedi_id_tlm_tests/file/iodef.xml
+++ b/rose-stem/app/jedi_id_tlm_tests/file/iodef.xml
@@ -41,6 +41,7 @@
+
@@ -55,6 +56,7 @@
+
@@ -144,6 +146,11 @@
+
+
+
+
+
@@ -421,6 +428,7 @@
+
diff --git a/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-C12_MG.conf b/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-C12_MG.conf
new file mode 100644
index 00000000..125a4758
--- /dev/null
+++ b/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-C12_MG.conf
@@ -0,0 +1,8 @@
+[file:mesh_C12_MG.nc]
+mode=auto
+source=$MESH_DIR/mesh_C12_MG.nc
+
+[namelist:base_mesh]
+!!f_lat_deg=
+file_prefix='mesh_C12_MG'
+!!fplane=
diff --git a/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-default.conf b/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-default.conf
deleted file mode 100644
index e69de29b..00000000
diff --git a/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-nwp_gal9_c12.conf b/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-nwp_gal9_c12.conf
new file mode 100644
index 00000000..de473661
--- /dev/null
+++ b/rose-stem/app/jedi_id_tlm_tests/opt/rose-app-nwp_gal9_c12.conf
@@ -0,0 +1,28 @@
+[file:iodef_temp.xml]
+mode=auto
+source=$ROSE_SUITE_DIR/app/jedi_id_tlm_tests/file/iodef.xml
+
+[namelist:io]
+diagnostic_frequency=8
+
+[namelist:jedi_geometry]
+io_calender_start='2018-04-14T21:00:00'
+io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
+io_path_state_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/ls_fields/jedi_trajectory'
+
+[namelist:jedi_increment]
+inc_time='2018-04-14 21:00:00'
+
+[namelist:jedi_pseudo_model]
+initial_time='2018-04-14T21:00:00'
+
+[namelist:jedi_state]
+state_time='2018-04-14 21:00:00'
+
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2'
+multigrid_chain_nitems=3
+
+[namelist:time]
+calendar_origin='2018-04-14 21:00:00'
+calendar_start='2018-04-14 21:00:00'
diff --git a/rose-stem/app/jedi_id_tlm_tests/rose-app.conf b/rose-stem/app/jedi_id_tlm_tests/rose-app.conf
index 7d23de1e..0f342c6f 100644
--- a/rose-stem/app/jedi_id_tlm_tests/rose-app.conf
+++ b/rose-stem/app/jedi_id_tlm_tests/rose-app.conf
@@ -23,13 +23,19 @@ source=namelist:jedi_lfric_tests
= namelist:jedi_linear_model
= namelist:jedi_pseudo_model
= namelist:jedi_lfric_settings
+ = (namelist:aerosol)
= namelist:base_mesh
+ = (namelist:blayer)
= namelist:boundaries
= namelist:checks
= namelist:section_choice
+ = (namelist:cloud)
+ = (namelist:chemistry)
+ = (namelist:convection)
+ = (namelist:cosp)
= (namelist:damping_layer)
= (namelist:departure_points)
- = namelist:energy_correction
+ = (namelist:energy_correction)
= (namelist:external_forcing)
= namelist:extrusion
= (namelist:files)
@@ -40,6 +46,7 @@ source=namelist:jedi_lfric_tests
= (namelist:iau_addinf_io(:))
= (namelist:iau_ainc_io(:))
= (namelist:iau_bcorr_io(:))
+ = (namelist:iau)
= (namelist:idealised)
= (namelist:ideal_surface)
= namelist:initialization
@@ -62,30 +69,35 @@ source=namelist:jedi_lfric_tests
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
+ = (namelist:microphysics)
= namelist:mixed_solver
- = (namelist:mixing)
+ = namelist:mixing
= (namelist:multigrid)
= (namelist:multires_coupling)
= namelist:esm_couple
+ = (namelist:orbit)
= namelist:orography
= (namelist:orography_agnesi_cartesian)
= (namelist:orography_agnesi_spherical)
- = (namelist:orography_bell_cartesian)
- = (namelist:orography_bell_spherical)
= (namelist:orography_dcmip200_spherical)
= (namelist:orography_schar_cartesian)
= (namelist:orography_schar_spherical)
= namelist:partitioning
= (namelist:physics)
= namelist:planet
+ = (namelist:radiation)
= namelist:radiative_gases
+ = (namelist:spectral_gwd)
+ = (namelist:orographic_drag)
= namelist:solver
= (namelist:specified_surface)
+ = (namelist:star)
= (namelist:stochastic_physics)
+ = (namelist:surface)
= (namelist:temp_tend_data)
= (namelist:theta_relax)
- = (namelist:theta_relax)
= namelist:time
= namelist:timestepping
= namelist:transport
@@ -106,24 +118,24 @@ easyaerosol_cdnc=.false.
easyaerosol_lw=.false.
easyaerosol_sw=.false.
!!emissions='GC5'
-glomap_mode='off'
+glomap_mode='dust_and_clim'
!!horiz_d=2.25
-!!l_radaer=.false.
+!!l_radaer=.true.
murk=.false.
!!murk_lbc=.false.
!!murk_prognostic=.false.
!!murk_source_scaling=1.0
!!murk_visibility=.false.
!!n_radaer_step=1
-!!prec_file=''
-sulphuric_strat_climatology=.false.
+!!prec_file='precalc/RADAER_pcalc.ukca'
+sulphuric_strat_climatology=.true.
!!sulphuric_strat_column=1.86604e-6
ukca_mode_seg_size=4
!!us_am=1.45
[namelist:base_mesh]
!!f_lat_deg=45.0
-file_prefix='mesh.nc'
+file_prefix='mesh'
!!fplane=.false.
geometry='spherical'
prepartitioned=.false.
@@ -186,7 +198,7 @@ limited_area=.false.
!!rim_width_ns=1
!!solver_boundary_depth=1
!!transport_boundary_depth=6
-transport_overwrite_freq='split_step'
+transport_overwrite_freq='final'
[namelist:checks]
limit_cfl=.false.
@@ -206,14 +218,14 @@ chem_scheme='none'
!!fjx_spec_file='FJX_spec_Nov11.dat'
!!flexchem_opt='bs1999'
i_chem_timestep_halvings=0
-!!i_ukca_chem_version=0
+!!i_ukca_chem_version=111
!!l_ukca_asad_full=.false.
-!!l_ukca_linox_scaling=.false.
-!!l_ukca_quasinewton=.false.
+!!l_ukca_linox_scaling=
+!!l_ukca_quasinewton=
!!l_ukca_ro2_ntp=.false.
-!!lightnox_scale_fac=0
+!!lightnox_scale_fac=
!!photol_scheme='off'
-!!top_bdy_opt='no_overwrt'
+!!top_bdy_opt=''
[!!namelist:cloud]
!!cff_spread_rate=1.0e-5
@@ -319,7 +331,7 @@ stretching_method='smooth'
!!aerosols_ancil_path=''
!!albedo_nir_ancil_path=''
!!albedo_vis_ancil_path=''
-ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${ancil_resolution}'
+ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${RESOLUTION}'
checkpoint_stem_name=''
!!cloud_drop_no_conc_ancil_path=''
!!coarse_ancil_directory=''
@@ -380,7 +392,7 @@ diag_stem_name=''
!!o3_ancil_path=''
!!oh_ancil_path=''
orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog'
-!!orography_subgrid_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid'
+!!orography_subgrid_ancil_path=''
!!ozone_ancil_path=''
!!plant_func_ancil_path=''
!!sea_ancil_path=''
@@ -412,7 +424,7 @@ exner_from_eos=.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.
@@ -422,7 +434,7 @@ 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.
@@ -436,16 +448,16 @@ profile_data_v=0.0
times=0.0
[namelist:helmholtz_solver]
-fail_on_non_converged=.false.
-gcrk=18
+!!fail_on_non_converged=.false.
+gcrk=8
!!jacobi_relaxation=0.5
-method='bicgstab'
-monitor_convergence=.true.
+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
[namelist:iau]
!!iau_ainc_multifile=.false.
@@ -455,7 +467,7 @@ si_pressure_tolerance=1.0e-15
!!iau_tendency_ainc=.false.
!!iau_tendency_bcorr=.true.
!!iau_tendency_pertinc=.false.
-!!iau_ts_start=0
+!!iau_ts_start=1
!!iau_use_addinf=.false.
!!iau_use_bcorr=.false.
!!iau_use_level_one_temp=.false.
@@ -502,15 +514,15 @@ f_lon_deg=0.0
perturb_init=.false.
!!perturb_magnitude=0
!!perturb_seed=0
-test='gravity_wave'
+test='none'
[namelist: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
@@ -522,22 +534,22 @@ surface_pressure=1000.0e2
[namelist:initial_temperature]
bvf_square=0.0001
-pert_centre=120.0
+pert_centre=60.0
pert_width_scaling=1.0
perturb='none'
-!!profile_data=300.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=300.0,300.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
theta_surf=300.0
[namelist:initial_vapour]
-!!profile_data=0.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=0.0,0.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
[namelist:initial_wind]
nl_constant=0.0
-profile='none'
+profile='constant_uv'
!!profile_data_u=0.0
!!profile_data_v=0.0
!!profile_data_w=0.0
@@ -547,8 +559,8 @@ profile='none'
!!profile_size_w=1
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
@@ -576,7 +588,7 @@ checkpoint_write=.false.
counter_output_suffix='counter.txt'
diag_active_files='lfric_diag'
diag_always_on_sampling=.false.
-diagnostic_frequency=8
+diagnostic_frequency=12
!!end_of_run_checkpoint=.true.
file_convention='UGRID'
multifile_io=.false.
@@ -592,7 +604,7 @@ write_fluxes=.false.
write_minmax_tseries=.false.
[namelist:jedi_geometry]
-io_calender_start='2018-04-14T21:00:00'
+io_calender_start='2021-06-02T00:00:00'
io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
io_path_state_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/ls_fields/jedi_trajectory'
io_path_state_write='write_file'
@@ -600,7 +612,7 @@ io_setup_increment=.false.
io_time_step='P0DT1H0M0S'
[namelist:jedi_increment]
-inc_time='2018-04-14 21:00:00'
+inc_time='2021-06-02 00:00:00'
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'
@@ -617,15 +629,15 @@ incremental_wind_interpolation=.true.
nl_time_step='P0DT1H0M0S'
[namelist:jedi_pseudo_model]
-initial_time='2018-04-14T21:00:00'
+initial_time='2021-06-02 00:00:00'
number_of_steps=9
time_step='P0DT1H0M0S'
[namelist:jedi_state]
-state_time='2018-04-14 21:00:00'
+state_time='2021-06-02 00: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'
[!!namelist:jules_hydrology]
l_hydrology=.true.
@@ -659,7 +671,7 @@ kext_io=0.5,0.5,1.0,1.0,0.5
knl_io=5*0.2
omega_io=0.101,0.083,0.132,0.135,0.115
omnir_io=0.788,0.545,0.864,0.787,0.785
-z0hm_pft_io=1.65,1.65,0.1,0.1,0.1
+z0hm_pft_io=1.0,1.0,0.01,0.01,0.01
!!z0v_io=1.1,1.1,0.22,0.22,1.0
[!!namelist:jules_radiation]
@@ -698,8 +710,8 @@ l_use_dtstar_sea=.false.
nice=1
!!u_cdn_hw=55.0
!!u_cdn_max=33.0
-!!z0h_specified=0.01
-!!z0m_specified=0.1
+!!z0h_specified=0.0
+!!z0m_specified=0.0
[!!namelist:jules_snow]
can_clump=8.0,4.0,1.0,1.0,1.0
@@ -778,7 +790,20 @@ l_spec_veg_z0=.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'
+
+[namelist: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
[namelist:logging]
log_to_rank_zero_only=.true.
@@ -806,40 +831,40 @@ microphysics_casim=.false.
!!orog_block=.true.
!!orog_rain=.true.
!!orog_rime=.true.
-!!prog_tnuc=.false.
+!!prog_tnuc=.true.
!!qcl_rime=1.0e-4
-!!shape_rime=.false.
+!!shape_rime=.true.
turb_gen_mixph=.true.
!!z_surf=50.0
[namelist:mixed_solver]
eliminate_variables='discrete'
-fail_on_non_converged=.false.
-gcrk=10
+fail_on_non_converged=.true.
+gcrk=4
guess_np1=.false.
!!jacobi_relaxation=0.5
-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.
[namelist:mixing]
!!leonard_kl=2.0
leonard_term=.false.
-!!method='blending'
+!!method='blend_1dbl_fa'
!!mix_factor=0.2
!!smag_l_calc='UseDx'
smagorinsky=.false.
viscosity=.false.
viscosity_mu=0.0
-[!!namelist:multigrid]
-chain_mesh_tags='','','',''
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2','multigrid_l3'
multigrid_chain_nitems=4
n_coarsesmooth=4
n_postsmooth=2
@@ -847,9 +872,17 @@ n_presmooth=2
smooth_relaxation=0.8
[!!namelist:multires_coupling]
-aerosol_mesh_name='dynamics'
+aerosol_mesh_name='aerosol'
coarse_aerosol_transport=.false.
coarse_rad_aerosol=.false.
+dynamics_mesh_name='dynamics'
+!!lowest_order_aero_flag=.false.
+multires_coupling_mesh_tags='dynamics'
+multires_coupling_mode='test'
+negative_correction='none'
+physics_mesh_name='aerosol'
+reconstruction='simple'
+recovery_order='linear'
[!!namelist:orbit]
!!arg_periapsis=1.796767421
@@ -944,7 +977,7 @@ phi_centre_dec=0.0
wavelength=4000.0
[namelist:partitioning]
-generate_inner_halos=.true.
+generate_inner_halos=.false.
panel_decomposition='auto'
!!panel_xproc=1
!!panel_yproc=1
@@ -959,15 +992,15 @@ configure_segments=.false.
!!electric_placement='slow'
!!evap_condense_placement='fast'
!!gw_segment=0
-!!limit_drag_incs=.false.
+limit_drag_incs=.false.
!!lowest_level='gradient'
!!ls_ppn_segment=0
!!microphysics_placement='slow'
!!orographic_drag_placement='slow'
!!radiation_placement='slow'
-!!sample_physics_scalars=.true.
-!!sample_physics_winds=.true.
-!!sample_physics_winds_correction=.false.
+sample_physics_scalars=.true.
+sample_physics_winds=.true.
+sample_physics_winds_correction=.false.
!!smagorinsky_placement='end'
!!spectral_gwd_placement='slow'
!!stochastic_physics_placement='fast'
@@ -1010,12 +1043,12 @@ mcica_data_file='spec/mcica_data'
n_radstep=2
!!planet_albedo=0.06
!!planet_emissivity=0.985
-scatter_method_lw='full'
-!!scatter_method_lwinc='full'
+scatter_method_lw='hybrid'
+!!scatter_method_lwinc='approx'
spectral_file_lw='spec/sp_lw_ga9'
-!!spectral_file_lwinc='spec/sp_lw_cloud7'
+!!spectral_file_lwinc='spec/sp_lw_cloud9'
spectral_file_sw='spec/sp_sw_ga9'
-!!spectral_file_swinc='spec/sp_sw_cloud7'
+!!spectral_file_swinc='spec/sp_sw_cloud9'
topography='slope'
[namelist:radiative_gases]
@@ -1029,26 +1062,26 @@ cfc113_rad_opt='off'
!!cfc11_clim_fcg_nyears=0
!!cfc11_clim_fcg_rates=0
!!cfc11_clim_fcg_years=0
-!!cfc11_mix_ratio=1.110e-09
-cfc11_rad_opt='off'
+cfc11_mix_ratio=1.110e-09
+cfc11_rad_opt='constant'
!!cfc12_clim_fcg_levls=0
!!cfc12_clim_fcg_nyears=0
!!cfc12_clim_fcg_rates=0
!!cfc12_clim_fcg_years=0
-!!cfc12_mix_ratio=2.187e-09
-cfc12_rad_opt='off'
+cfc12_mix_ratio=2.187e-09
+cfc12_rad_opt='constant'
!!ch4_clim_fcg_levls=0
!!ch4_clim_fcg_nyears=0
!!ch4_clim_fcg_rates=0
!!ch4_clim_fcg_years=0
-!!ch4_mix_ratio=1.006e-06
-ch4_rad_opt='off'
+ch4_mix_ratio=1.006e-06
+ch4_rad_opt='constant'
!!co2_clim_fcg_levls=0
!!co2_clim_fcg_nyears=0
!!co2_clim_fcg_rates=0
!!co2_clim_fcg_years=0
-!!co2_mix_ratio=6.002e-04
-co2_rad_opt='off'
+co2_mix_ratio=6.002e-04
+co2_rad_opt='constant'
!!co_clim_fcg_levls=0
!!co_clim_fcg_nyears=0
!!co_clim_fcg_rates=0
@@ -1120,8 +1153,8 @@ n2_rad_opt='off'
!!n2o_clim_fcg_nyears=0
!!n2o_clim_fcg_rates=0
!!n2o_clim_fcg_years=0
-!!n2o_mix_ratio=4.945e-07
-n2o_rad_opt='off'
+n2o_mix_ratio=4.945e-07
+n2o_rad_opt='constant'
!!na_clim_fcg_levls=0
!!na_clim_fcg_nyears=0
!!na_clim_fcg_rates=0
@@ -1138,8 +1171,8 @@ nh3_rad_opt='off'
!!o2_clim_fcg_nyears=0
!!o2_clim_fcg_rates=0
!!o2_clim_fcg_years=0
-!!o2_mix_ratio=0.2314
-o2_rad_opt='off'
+o2_mix_ratio=0.2314
+o2_rad_opt='constant'
!!o3_clim_fcg_levls=0
!!o3_clim_fcg_nyears=0
!!o3_clim_fcg_rates=0
@@ -1148,7 +1181,7 @@ o2_rad_opt='off'
!!o3_profile_data=0
!!o3_profile_heights=0.0
!!o3_profile_size=0
-o3_rad_opt='off'
+o3_rad_opt='ancil'
!!rb_clim_fcg_levls=0
!!rb_clim_fcg_nyears=0
!!rb_clim_fcg_rates=0
@@ -1175,10 +1208,10 @@ tio_rad_opt='off'
vo_rad_opt='off'
[namelist:section_choice]
-!!aerosol='none'
-!!boundary_layer='none'
-!!chemistry='none'
-!!cloud='none'
+aerosol='none'
+boundary_layer='none'
+chemistry='none'
+cloud='none'
!!convection='none'
dynamics='gungho'
!!electric='none'
@@ -1186,23 +1219,23 @@ external_forcing=.false.
iau=.false.
iau_sst=.false.
iau_surf=.false.
-!!methane_oxidation=.false.
+methane_oxidation=.false.
!!microphysics='none'
-!!orographic_drag='none'
-!!radiation='none'
-!!spectral_gwd='none'
-!!stochastic_physics='none'
-!!surface='none'
+orographic_drag='none'
+radiation='none'
+spectral_gwd='none'
+stochastic_physics='none'
+surface='none'
[namelist:solver]
-fail_on_non_converged=.false.
+!!fail_on_non_converged=.false.
gcrk=18
!!jacobi_relaxation=0.5
-maximum_iterations=50
+maximum_iterations=7
method='chebyshev'
-monitor_convergence=.true.
+monitor_convergence=.false.
preconditioner='diagonal'
-tolerance=1.0e-18
+tolerance=1.0e-6
[namelist:specified_surface]
!!function_amplitude_e=200
@@ -1229,10 +1262,10 @@ tolerance=1.0e-18
!!time_units_sst='seconds'
[!!namelist:spectral_gwd]
-add_cgw=.false.
-!!cgw_scale_factor=1.0
+add_cgw=.true.
+!!cgw_scale_factor=0.86
ussp_heating=.true.
-ussp_launch_factor=1.3
+ussp_launch_factor=1.2
wavelstar=4300.0
[!!namelist:star]
@@ -1285,9 +1318,9 @@ ens_memb=${ENSEMBLE_MEMBER}
!!rp_lsfc_orog_drag_param=0.15,0.15,0.15
!!rp_lsfc_z0_soil=1.0e-3,1.0e-3,1.0e-3
!!rp_lsfc_z0_urban_mult=1.0,1.0,1.0
-!!rp_lsfc_z0hm_pft=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_max=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_min=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
+!!rp_lsfc_z0hm_pft=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_max=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_min=1.00,1.00,0.022,0.022,0.025
!!rp_lsfc_z0hm_soil=2.0e-1,2.0e-1,2.0e-1
!!rp_lsfc_z0v=
!!rp_lsfc_z0v_max=
@@ -1332,7 +1365,7 @@ ens_memb=${ENSEMBLE_MEMBER}
!!spt_use_convection=.true.
!!spt_use_microphysics=.true.
!!spt_use_radiation=.true.
-stph_n_max=22
+stph_n_max=60
stph_n_min=20
use_random_parameters=.false.
use_skeb=.false.
@@ -1363,8 +1396,8 @@ timescale=1.0
[namelist:time]
calendar='timestep'
-calendar_origin='2018-04-14 21:00:00'
-calendar_start='2018-04-14 21:00:00'
+calendar_origin='2021-06-02 00:00:00'
+calendar_start='2021-06-02 00:00:00'
calendar_type='gregorian'
timestep_end='$RESTART_STOP'
timestep_start='$RESTART_START'
@@ -1372,7 +1405,7 @@ timestep_start='$RESTART_START'
[namelist:timestepping]
alpha=0.55
dt=$DT
-inner_iterations=2
+inner_iterations=1
method='semi_implicit'
outer_iterations=2
runge_kutta_method='forward_euler'
@@ -1387,6 +1420,7 @@ adjust_theta=.false.
!!adjust_theta_above=30000.0
adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
+ageofair_reset_level=10
broken_w2_projection=.false.
calculate_detj='upwind'
cap_density_predictor=0.5
@@ -1403,14 +1437,15 @@ 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_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'
@@ -1420,7 +1455,7 @@ operators='fv'
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'
@@ -1430,10 +1465,11 @@ 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
diff --git a/rose-stem/app/jedi_lfric_tests/file/iodef.xml b/rose-stem/app/jedi_lfric_tests/file/iodef.xml
index be8ae024..d40165b7 100644
--- a/rose-stem/app/jedi_lfric_tests/file/iodef.xml
+++ b/rose-stem/app/jedi_lfric_tests/file/iodef.xml
@@ -50,6 +50,11 @@
+
+
+
+
+
@@ -302,7 +307,7 @@
-
+
@@ -327,6 +332,7 @@
+
diff --git a/rose-stem/app/jedi_lfric_tests/opt/rose-app-C12_MG.conf b/rose-stem/app/jedi_lfric_tests/opt/rose-app-C12_MG.conf
new file mode 100644
index 00000000..125a4758
--- /dev/null
+++ b/rose-stem/app/jedi_lfric_tests/opt/rose-app-C12_MG.conf
@@ -0,0 +1,8 @@
+[file:mesh_C12_MG.nc]
+mode=auto
+source=$MESH_DIR/mesh_C12_MG.nc
+
+[namelist:base_mesh]
+!!f_lat_deg=
+file_prefix='mesh_C12_MG'
+!!fplane=
diff --git a/rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9.conf b/rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9.conf
deleted file mode 100644
index 90d207a8..00000000
--- a/rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-[file:iodef_temp.xml]
-mode=auto
-source=$ROSE_SUITE_DIR/app/jedi_lfric_tests/file/iodef.xml
diff --git a/rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9_c12.conf b/rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9_c12.conf
new file mode 100644
index 00000000..657911fb
--- /dev/null
+++ b/rose-stem/app/jedi_lfric_tests/opt/rose-app-nwp_gal9_c12.conf
@@ -0,0 +1,20 @@
+[file:iodef_temp.xml]
+mode=auto
+source=$ROSE_SUITE_DIR/app/jedi_lfric_tests/file/iodef.xml
+
+[namelist:files]
+ls_directory='/data/users/tim.payne/lfric_apps/files'
+ls_filename='final_ls_with_land'
+start_dump_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
+start_dump_filename='final_pert'
+
+[namelist:io]
+diagnostic_frequency=8
+
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2'
+multigrid_chain_nitems=3
+
+[namelist:time]
+calendar_origin='2016-01-01 15:00:00'
+calendar_start='2016-01-01 15:00:00'
diff --git a/rose-stem/app/jedi_lfric_tests/opt/rose-app-runge-kutta.conf b/rose-stem/app/jedi_lfric_tests/opt/rose-app-runge-kutta.conf
index 6c3a2714..b90cd33b 100644
--- a/rose-stem/app/jedi_lfric_tests/opt/rose-app-runge-kutta.conf
+++ b/rose-stem/app/jedi_lfric_tests/opt/rose-app-runge-kutta.conf
@@ -20,7 +20,6 @@ start_dump_directory=''
start_dump_filename=''
[namelist:finite_element]
-coord_system='xyz'
vorticity_in_w1=.true.
[namelist:formulation]
@@ -28,12 +27,28 @@ dlayer_on=.false.
dry_static_adjust=.false.
eos_method='projected'
exner_from_eos=.true.
+l_multigrid=.false.
moisture_formulation='dry'
!!theta_moist_source=.false.
[namelist:helmholtz_solver]
-gcrk=18
-si_pressure_tolerance=1.0e-6
+preconditioner='tridiagonal'
+
+[namelist:idealised]
+test='gravity_wave'
+
+[namelist:initial_density]
+r1=0.0
+r2=0.0
+x1=0.0
+x2=0.0
+
+[namelist:initial_temperature]
+pert_centre=-60.0
+
+[namelist:initial_wind]
+smp_init_wind=.false.
+u0=0.0
[namelist:initialization]
init_option='analytic'
@@ -45,6 +60,7 @@ diagnostic_frequency=20
[namelist:linear]
fixed_ls=.false.
+l_stabilise_bl=.false.
pert_option='analytic'
[namelist:mixed_solver]
@@ -52,9 +68,15 @@ gcrk=6
mixed_solver_a_tol=1.0e-6
si_tolerance=1.0e-3
+[!!namelist:multigrid]
+chain_mesh_tags='','','',''
+
[namelist:orography]
orog_init_option='none'
+[namelist:partitioning]
+generate_inner_halos=.true.
+
[namelist:planet]
scaling_factor=125.0
@@ -74,9 +96,6 @@ method='rk'
cfl_mol_1d_stab=2.0
cfl_mol_2d_stab=2.0
cfl_mol_3d_stab=2.0
-log_space=5*.false.
max_vert_cfl_calc='uniform'
-reversible=.false.
runge_kutta_method='ssp4'
-slice_order='cubic'
!!wind_mono_top_depth=0
diff --git a/rose-stem/app/jedi_lfric_tests/rose-app.conf b/rose-stem/app/jedi_lfric_tests/rose-app.conf
index 3638e4a5..e8ad74b5 100644
--- a/rose-stem/app/jedi_lfric_tests/rose-app.conf
+++ b/rose-stem/app/jedi_lfric_tests/rose-app.conf
@@ -20,17 +20,22 @@ source=namelist:jedi_lfric_tests
= namelist:jedi_geometry
= namelist:jedi_state
= namelist:jedi_increment
- = namelist:jedi_pseudo_model
= namelist:jedi_linear_model
- = namelist:jedi_model
+ = namelist:jedi_pseudo_model
= namelist:jedi_lfric_settings
+ = (namelist:aerosol)
= namelist:base_mesh
+ = (namelist:blayer)
= namelist:boundaries
= namelist:checks
= namelist:section_choice
+ = (namelist:cloud)
+ = (namelist:chemistry)
+ = (namelist:convection)
+ = (namelist:cosp)
= (namelist:damping_layer)
= (namelist:departure_points)
- = namelist:energy_correction
+ = (namelist:energy_correction)
= (namelist:external_forcing)
= namelist:extrusion
= (namelist:files)
@@ -41,6 +46,7 @@ source=namelist:jedi_lfric_tests
= (namelist:iau_addinf_io(:))
= (namelist:iau_ainc_io(:))
= (namelist:iau_bcorr_io(:))
+ = (namelist:iau)
= (namelist:idealised)
= (namelist:ideal_surface)
= namelist:initialization
@@ -63,27 +69,33 @@ source=namelist:jedi_lfric_tests
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
+ = (namelist:microphysics)
= namelist:mixed_solver
- = (namelist:mixing)
+ = namelist:mixing
= (namelist:multigrid)
= (namelist:multires_coupling)
= namelist:esm_couple
+ = (namelist:orbit)
= namelist:orography
= (namelist:orography_agnesi_cartesian)
= (namelist:orography_agnesi_spherical)
- = (namelist:orography_bell_cartesian)
- = (namelist:orography_bell_spherical)
= (namelist:orography_dcmip200_spherical)
= (namelist:orography_schar_cartesian)
= (namelist:orography_schar_spherical)
= namelist:partitioning
= (namelist:physics)
= namelist:planet
+ = (namelist:radiation)
= namelist:radiative_gases
+ = (namelist:spectral_gwd)
+ = (namelist:orographic_drag)
= namelist:solver
= (namelist:specified_surface)
+ = (namelist:star)
= (namelist:stochastic_physics)
+ = (namelist:surface)
= (namelist:temp_tend_data)
= (namelist:theta_relax)
= namelist:time
@@ -106,17 +118,17 @@ easyaerosol_cdnc=.false.
easyaerosol_lw=.false.
easyaerosol_sw=.false.
!!emissions='GC5'
-glomap_mode='off'
+glomap_mode='dust_and_clim'
!!horiz_d=2.25
-!!l_radaer=.false.
+!!l_radaer=.true.
murk=.false.
!!murk_lbc=.false.
!!murk_prognostic=.false.
!!murk_source_scaling=1.0
!!murk_visibility=.false.
!!n_radaer_step=1
-!!prec_file=''
-sulphuric_strat_climatology=.false.
+!!prec_file='precalc/RADAER_pcalc.ukca'
+sulphuric_strat_climatology=.true.
!!sulphuric_strat_column=1.86604e-6
ukca_mode_seg_size=4
!!us_am=1.45
@@ -186,7 +198,7 @@ limited_area=.false.
!!rim_width_ns=1
!!solver_boundary_depth=1
!!transport_boundary_depth=6
-transport_overwrite_freq='split_step'
+transport_overwrite_freq='final'
[namelist:checks]
limit_cfl=.false.
@@ -206,14 +218,14 @@ chem_scheme='none'
!!fjx_spec_file='FJX_spec_Nov11.dat'
!!flexchem_opt='bs1999'
i_chem_timestep_halvings=0
-!!i_ukca_chem_version=0
+!!i_ukca_chem_version=111
!!l_ukca_asad_full=.false.
-!!l_ukca_linox_scaling=.false.
-!!l_ukca_quasinewton=.false.
+!!l_ukca_linox_scaling=
+!!l_ukca_quasinewton=
!!l_ukca_ro2_ntp=.false.
-!!lightnox_scale_fac=0
+!!lightnox_scale_fac=
!!photol_scheme='off'
-!!top_bdy_opt='no_overwrt'
+!!top_bdy_opt=''
[!!namelist:cloud]
!!cff_spread_rate=1.0e-5
@@ -274,7 +286,7 @@ l_cosp=.false.
[namelist:damping_layer]
dl_base=40000.0
dl_str=0.05
-dl_type='latitude'
+dl_type='standard'
[namelist:departure_points]
horizontal_limit='cap'
@@ -319,7 +331,7 @@ stretching_method='smooth'
!!aerosols_ancil_path=''
!!albedo_nir_ancil_path=''
!!albedo_vis_ancil_path=''
-ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/Quagga/${ancil_resolution}/n96e_l70'
+ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${RESOLUTION}'
checkpoint_stem_name='$CYLC_SUITE_SHARE_DIR/data/restartGungho_$ROSE_TASK_NAME'
!!cloud_drop_no_conc_ancil_path=''
!!coarse_ancil_directory=''
@@ -374,13 +386,13 @@ diag_stem_name='diagGungho'
!!land_area_ancil_path=''
!!lbc_directory=''
!!lbc_filename=''
-ls_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
-ls_filename='final_ls'
+ls_directory='/data/users/tim.payne/lfric_apps/files'
+ls_filename='final_2021060200-2021060207'
!!no3_ancil_path=''
!!o3_ancil_path=''
!!oh_ancil_path=''
-orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid'
-!!orography_subgrid_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid'
+orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog'
+!!orography_subgrid_ancil_path=''
!!ozone_ancil_path=''
!!plant_func_ancil_path=''
!!sea_ancil_path=''
@@ -390,8 +402,8 @@ orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid'
!!soil_dust_ancil_path=''
!!soil_rough_ancil_path=''
!!sst_ancil_path=''
-start_dump_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
-start_dump_filename='final_pert'
+start_dump_directory='$BIG_DATA_DIR/tangent-linear/Ticket735'
+start_dump_filename='final_2021060200-2021060207.pert'
!!surface_frac_ancil_path=''
!!urban_ancil_path=''
@@ -412,7 +424,7 @@ exner_from_eos=.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.
@@ -442,7 +454,7 @@ 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
@@ -455,7 +467,7 @@ si_pressure_tolerance=1.0e-4
!!iau_tendency_ainc=.false.
!!iau_tendency_bcorr=.true.
!!iau_tendency_pertinc=.false.
-!!iau_ts_start=0
+!!iau_ts_start=1
!!iau_use_addinf=.false.
!!iau_use_bcorr=.false.
!!iau_use_level_one_temp=.false.
@@ -502,15 +514,15 @@ f_lon_deg=0.0
perturb_init=.false.
!!perturb_magnitude=0
!!perturb_seed=0
-test='gravity_wave'
+test='none'
[namelist: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
@@ -522,22 +534,22 @@ surface_pressure=1000.0e2
[namelist:initial_temperature]
bvf_square=0.0001
-pert_centre=120.0
+pert_centre=60.0
pert_width_scaling=1.0
perturb='none'
-!!profile_data=300.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=300.0,300.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
theta_surf=300.0
[namelist:initial_vapour]
-!!profile_data=0.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=0.0,0.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
[namelist:initial_wind]
nl_constant=0.0
-profile='none'
+profile='constant_uv'
!!profile_data_u=0.0
!!profile_data_v=0.0
!!profile_data_w=0.0
@@ -547,8 +559,8 @@ profile='none'
!!profile_size_w=1
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
@@ -576,7 +588,7 @@ checkpoint_write=.false.
counter_output_suffix='counter.txt'
diag_active_files='lfric_diag'
diag_always_on_sampling=.false.
-diagnostic_frequency=8
+diagnostic_frequency=12
!!end_of_run_checkpoint=.true.
file_convention='UGRID'
multifile_io=.false.
@@ -592,15 +604,15 @@ write_fluxes=.false.
write_minmax_tseries=.false.
[namelist:jedi_geometry]
-io_calender_start='2018-04-14T21:00:00'
-io_path_inc_read=''
+io_calender_start='2021-06-02T00:00:00'
+io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
io_path_state_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/ls_fields/jedi_trajectory'
io_path_state_write='write_file'
io_setup_increment=.false.
io_time_step='P0DT1H0M0S'
[namelist:jedi_increment]
-inc_time='2018-04-14 21:00:00'
+inc_time='2021-06-02 00:00:00'
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'
@@ -613,22 +625,22 @@ forecast_length='P0DT6H0M0S'
test_field='theta'
[namelist:jedi_linear_model]
-incremental_wind_interpolation=.true.
+incremental_wind_interpolation=.false.
nl_time_step='P0DT1H0M0S'
[namelist:jedi_model]
time_step='P0DT1H0M0S'
[namelist:jedi_pseudo_model]
-initial_time='2018-04-14T21:00:00'
+initial_time='2021-06-02 00:00:00'
number_of_steps=9
time_step='P0DT1H0M0S'
[namelist:jedi_state]
-state_time='2018-04-14 21:00:00'
+state_time='2021-06-02 00: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'
+ ='m_v','m_cl','m_r','m_s','land_fraction'
[!!namelist:jules_hydrology]
l_hydrology=.true.
@@ -662,7 +674,7 @@ kext_io=0.5,0.5,1.0,1.0,0.5
knl_io=5*0.2
omega_io=0.101,0.083,0.132,0.135,0.115
omnir_io=0.788,0.545,0.864,0.787,0.785
-z0hm_pft_io=1.65,1.65,0.1,0.1,0.1
+z0hm_pft_io=1.0,1.0,0.01,0.01,0.01
!!z0v_io=1.1,1.1,0.22,0.22,1.0
[!!namelist:jules_radiation]
@@ -701,8 +713,8 @@ l_use_dtstar_sea=.false.
nice=1
!!u_cdn_hw=55.0
!!u_cdn_max=33.0
-!!z0h_specified=0.01
-!!z0m_specified=0.1
+!!z0h_specified=0.0
+!!z0m_specified=0.0
[!!namelist:jules_snow]
can_clump=8.0,4.0,1.0,1.0,1.0
@@ -781,8 +793,21 @@ l_spec_veg_z0=.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'
+[namelist: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
+
[namelist:logging]
log_to_rank_zero_only=.true.
run_log_level='info'
@@ -809,9 +834,9 @@ microphysics_casim=.false.
!!orog_block=.true.
!!orog_rain=.true.
!!orog_rime=.true.
-!!prog_tnuc=.false.
+!!prog_tnuc=.true.
!!qcl_rime=1.0e-4
-!!shape_rime=.false.
+!!shape_rime=.true.
turb_gen_mixph=.true.
!!z_surf=50.0
@@ -824,7 +849,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'
@@ -834,15 +859,15 @@ split_w=.true.
[namelist:mixing]
!!leonard_kl=2.0
leonard_term=.false.
-!!method='blending'
+!!method='blend_1dbl_fa'
!!mix_factor=0.2
!!smag_l_calc='UseDx'
smagorinsky=.false.
viscosity=.false.
viscosity_mu=0.0
-[!!namelist:multigrid]
-chain_mesh_tags='','','',''
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2','multigrid_l3'
multigrid_chain_nitems=4
n_coarsesmooth=4
n_postsmooth=2
@@ -850,9 +875,17 @@ n_presmooth=2
smooth_relaxation=0.8
[!!namelist:multires_coupling]
-aerosol_mesh_name='dynamics'
+aerosol_mesh_name='aerosol'
coarse_aerosol_transport=.false.
coarse_rad_aerosol=.false.
+dynamics_mesh_name='dynamics'
+!!lowest_order_aero_flag=.false.
+multires_coupling_mesh_tags='dynamics'
+multires_coupling_mode='test'
+negative_correction='none'
+physics_mesh_name='aerosol'
+reconstruction='simple'
+recovery_order='linear'
[!!namelist:orbit]
!!arg_periapsis=1.796767421
@@ -947,7 +980,7 @@ phi_centre_dec=0.0
wavelength=4000.0
[namelist:partitioning]
-generate_inner_halos=.true.
+generate_inner_halos=.false.
panel_decomposition='auto'
!!panel_xproc=1
!!panel_yproc=1
@@ -1013,12 +1046,12 @@ mcica_data_file='spec/mcica_data'
n_radstep=2
!!planet_albedo=0.06
!!planet_emissivity=0.985
-scatter_method_lw='full'
-!!scatter_method_lwinc='full'
+scatter_method_lw='hybrid'
+!!scatter_method_lwinc='approx'
spectral_file_lw='spec/sp_lw_ga9'
-!!spectral_file_lwinc='spec/sp_lw_cloud7'
+!!spectral_file_lwinc='spec/sp_lw_cloud9'
spectral_file_sw='spec/sp_sw_ga9'
-!!spectral_file_swinc='spec/sp_sw_cloud7'
+!!spectral_file_swinc='spec/sp_sw_cloud9'
topography='slope'
[namelist:radiative_gases]
@@ -1032,26 +1065,26 @@ cfc113_rad_opt='off'
!!cfc11_clim_fcg_nyears=0
!!cfc11_clim_fcg_rates=0
!!cfc11_clim_fcg_years=0
-!!cfc11_mix_ratio=1.110e-09
-cfc11_rad_opt='off'
+cfc11_mix_ratio=1.110e-09
+cfc11_rad_opt='constant'
!!cfc12_clim_fcg_levls=0
!!cfc12_clim_fcg_nyears=0
!!cfc12_clim_fcg_rates=0
!!cfc12_clim_fcg_years=0
-!!cfc12_mix_ratio=2.187e-09
-cfc12_rad_opt='off'
+cfc12_mix_ratio=2.187e-09
+cfc12_rad_opt='constant'
!!ch4_clim_fcg_levls=0
!!ch4_clim_fcg_nyears=0
!!ch4_clim_fcg_rates=0
!!ch4_clim_fcg_years=0
-!!ch4_mix_ratio=1.006e-06
-ch4_rad_opt='off'
+ch4_mix_ratio=1.006e-06
+ch4_rad_opt='constant'
!!co2_clim_fcg_levls=0
!!co2_clim_fcg_nyears=0
!!co2_clim_fcg_rates=0
!!co2_clim_fcg_years=0
-!!co2_mix_ratio=6.002e-04
-co2_rad_opt='off'
+co2_mix_ratio=6.002e-04
+co2_rad_opt='constant'
!!co_clim_fcg_levls=0
!!co_clim_fcg_nyears=0
!!co_clim_fcg_rates=0
@@ -1123,8 +1156,8 @@ n2_rad_opt='off'
!!n2o_clim_fcg_nyears=0
!!n2o_clim_fcg_rates=0
!!n2o_clim_fcg_years=0
-!!n2o_mix_ratio=4.945e-07
-n2o_rad_opt='off'
+n2o_mix_ratio=4.945e-07
+n2o_rad_opt='constant'
!!na_clim_fcg_levls=0
!!na_clim_fcg_nyears=0
!!na_clim_fcg_rates=0
@@ -1141,8 +1174,8 @@ nh3_rad_opt='off'
!!o2_clim_fcg_nyears=0
!!o2_clim_fcg_rates=0
!!o2_clim_fcg_years=0
-!!o2_mix_ratio=0.2314
-o2_rad_opt='off'
+o2_mix_ratio=0.2314
+o2_rad_opt='constant'
!!o3_clim_fcg_levls=0
!!o3_clim_fcg_nyears=0
!!o3_clim_fcg_rates=0
@@ -1151,7 +1184,7 @@ o2_rad_opt='off'
!!o3_profile_data=0
!!o3_profile_heights=0.0
!!o3_profile_size=0
-o3_rad_opt='off'
+o3_rad_opt='ancil'
!!rb_clim_fcg_levls=0
!!rb_clim_fcg_nyears=0
!!rb_clim_fcg_rates=0
@@ -1232,10 +1265,10 @@ tolerance=1.0e-6
!!time_units_sst='seconds'
[!!namelist:spectral_gwd]
-add_cgw=.false.
-!!cgw_scale_factor=1.0
+add_cgw=.true.
+!!cgw_scale_factor=0.86
ussp_heating=.true.
-ussp_launch_factor=1.3
+ussp_launch_factor=1.2
wavelstar=4300.0
[!!namelist:star]
@@ -1288,9 +1321,9 @@ ens_memb=${ENSEMBLE_MEMBER}
!!rp_lsfc_orog_drag_param=0.15,0.15,0.15
!!rp_lsfc_z0_soil=1.0e-3,1.0e-3,1.0e-3
!!rp_lsfc_z0_urban_mult=1.0,1.0,1.0
-!!rp_lsfc_z0hm_pft=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_max=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_min=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
+!!rp_lsfc_z0hm_pft=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_max=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_min=1.00,1.00,0.022,0.022,0.025
!!rp_lsfc_z0hm_soil=2.0e-1,2.0e-1,2.0e-1
!!rp_lsfc_z0v=
!!rp_lsfc_z0v_max=
@@ -1335,7 +1368,7 @@ ens_memb=${ENSEMBLE_MEMBER}
!!spt_use_convection=.true.
!!spt_use_microphysics=.true.
!!spt_use_radiation=.true.
-stph_n_max=22
+stph_n_max=60
stph_n_min=20
use_random_parameters=.false.
use_skeb=.false.
@@ -1366,8 +1399,8 @@ timescale=1.0
[namelist:time]
calendar='timestep'
-calendar_origin='2016-01-01 15:00:00'
-calendar_start='2016-01-01 15:00:00'
+calendar_origin='2021-06-02 00:00:00'
+calendar_start='2021-06-02 00:00:00'
calendar_type='gregorian'
timestep_end='$RESTART_STOP'
timestep_start='$RESTART_START'
@@ -1375,7 +1408,7 @@ timestep_start='$RESTART_START'
[namelist:timestepping]
alpha=0.55
dt=$DT
-inner_iterations=2
+inner_iterations=1
method='semi_implicit'
outer_iterations=2
runge_kutta_method='forward_euler'
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/file/iodef.xml b/rose-stem/app/jedi_tlm_forecast_tl/file/iodef.xml
index 808f8ef9..e6fe117c 100644
--- a/rose-stem/app/jedi_tlm_forecast_tl/file/iodef.xml
+++ b/rose-stem/app/jedi_tlm_forecast_tl/file/iodef.xml
@@ -41,6 +41,7 @@
+
@@ -55,6 +56,7 @@
+
@@ -144,6 +146,11 @@
+
+
+
+
+
@@ -421,6 +428,7 @@
+
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-C12_MG.conf b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-C12_MG.conf
new file mode 100644
index 00000000..125a4758
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-C12_MG.conf
@@ -0,0 +1,8 @@
+[file:mesh_C12_MG.nc]
+mode=auto
+source=$MESH_DIR/mesh_C12_MG.nc
+
+[namelist:base_mesh]
+!!f_lat_deg=
+file_prefix='mesh_C12_MG'
+!!fplane=
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-default.conf b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-default.conf
deleted file mode 100644
index e69de29b..00000000
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-nwp_gal9_c12.conf b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-nwp_gal9_c12.conf
new file mode 100644
index 00000000..a83200b7
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-nwp_gal9_c12.conf
@@ -0,0 +1,28 @@
+[file:iodef_temp.xml]
+mode=auto
+source=$ROSE_SUITE_DIR/app/jedi_tlm_forecast_tl/file/iodef.xml
+
+[namelist:io]
+diagnostic_frequency=8
+
+[namelist:jedi_geometry]
+io_calender_start='2018-04-14T21:00:00'
+io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
+io_path_state_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/ls_fields/jedi_trajectory'
+
+[namelist:jedi_increment]
+inc_time='2018-04-14 21:00:00'
+
+[namelist:jedi_pseudo_model]
+initial_time='2018-04-14T21:00:00'
+
+[namelist:jedi_state]
+state_time='2018-04-14 21:00:00'
+
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2'
+multigrid_chain_nitems=3
+
+[namelist:time]
+calendar_origin='2018-04-14 21:00:00'
+calendar_start='2018-04-14 21:00:00'
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-rrt_equals_dt.conf b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-rrt_equals_dt.conf
new file mode 100644
index 00000000..3d974564
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-rrt_equals_dt.conf
@@ -0,0 +1,2 @@
+[namelist:mixed_solver]
+reference_reset_time=$DT
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-semi_strict_solver.conf b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-semi_strict_solver.conf
new file mode 100644
index 00000000..d9c5499f
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_forecast_tl/opt/rose-app-semi_strict_solver.conf
@@ -0,0 +1,9 @@
+[namelist:jedi_lfric_settings]
+adjoint_test_tolerance=1.0e-3
+
+[namelist:mixed_solver]
+mixed_solver_a_tol=1.0e-21
+si_tolerance=1.0e-3
+
+[namelist:timestepping]
+outer_iterations=1
diff --git a/rose-stem/app/jedi_tlm_forecast_tl/rose-app.conf b/rose-stem/app/jedi_tlm_forecast_tl/rose-app.conf
index b74d09f2..d570a10b 100644
--- a/rose-stem/app/jedi_tlm_forecast_tl/rose-app.conf
+++ b/rose-stem/app/jedi_tlm_forecast_tl/rose-app.conf
@@ -23,13 +23,19 @@ source=namelist:jedi_lfric_tests
= namelist:jedi_linear_model
= namelist:jedi_pseudo_model
= namelist:jedi_lfric_settings
+ = (namelist:aerosol)
= namelist:base_mesh
+ = (namelist:blayer)
= namelist:boundaries
= namelist:checks
= namelist:section_choice
+ = (namelist:cloud)
+ = (namelist:chemistry)
+ = (namelist:convection)
+ = (namelist:cosp)
= (namelist:damping_layer)
= (namelist:departure_points)
- = namelist:energy_correction
+ = (namelist:energy_correction)
= (namelist:external_forcing)
= namelist:extrusion
= (namelist:files)
@@ -40,6 +46,7 @@ source=namelist:jedi_lfric_tests
= (namelist:iau_addinf_io(:))
= (namelist:iau_ainc_io(:))
= (namelist:iau_bcorr_io(:))
+ = (namelist:iau)
= (namelist:idealised)
= (namelist:ideal_surface)
= namelist:initialization
@@ -62,26 +69,33 @@ source=namelist:jedi_lfric_tests
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
+ = (namelist:microphysics)
= namelist:mixed_solver
- = (namelist:mixing)
+ = namelist:mixing
= (namelist:multigrid)
= (namelist:multires_coupling)
= namelist:esm_couple
+ = (namelist:orbit)
= namelist:orography
= (namelist:orography_agnesi_cartesian)
= (namelist:orography_agnesi_spherical)
- = (namelist:orography_bell_cartesian)
- = (namelist:orography_bell_spherical)
= (namelist:orography_dcmip200_spherical)
= (namelist:orography_schar_cartesian)
= (namelist:orography_schar_spherical)
= namelist:partitioning
= (namelist:physics)
= namelist:planet
+ = (namelist:radiation)
= namelist:radiative_gases
+ = (namelist:spectral_gwd)
+ = (namelist:orographic_drag)
= namelist:solver
= (namelist:specified_surface)
+ = (namelist:star)
+ = (namelist:stochastic_physics)
+ = (namelist:surface)
= (namelist:temp_tend_data)
= (namelist:theta_relax)
= namelist:time
@@ -104,24 +118,24 @@ easyaerosol_cdnc=.false.
easyaerosol_lw=.false.
easyaerosol_sw=.false.
!!emissions='GC5'
-glomap_mode='off'
+glomap_mode='dust_and_clim'
!!horiz_d=2.25
-!!l_radaer=.false.
+!!l_radaer=.true.
murk=.false.
!!murk_lbc=.false.
!!murk_prognostic=.false.
!!murk_source_scaling=1.0
!!murk_visibility=.false.
!!n_radaer_step=1
-!!prec_file=''
-sulphuric_strat_climatology=.false.
+!!prec_file='precalc/RADAER_pcalc.ukca'
+sulphuric_strat_climatology=.true.
!!sulphuric_strat_column=1.86604e-6
ukca_mode_seg_size=4
!!us_am=1.45
[namelist:base_mesh]
!!f_lat_deg=45.0
-file_prefix='mesh.nc'
+file_prefix='mesh'
!!fplane=.false.
geometry='spherical'
prepartitioned=.false.
@@ -184,7 +198,7 @@ limited_area=.false.
!!rim_width_ns=1
!!solver_boundary_depth=1
!!transport_boundary_depth=6
-transport_overwrite_freq='split_step'
+transport_overwrite_freq='final'
[namelist:checks]
limit_cfl=.false.
@@ -204,14 +218,14 @@ chem_scheme='none'
!!fjx_spec_file='FJX_spec_Nov11.dat'
!!flexchem_opt='bs1999'
i_chem_timestep_halvings=0
-!!i_ukca_chem_version=0
+!!i_ukca_chem_version=111
!!l_ukca_asad_full=.false.
-!!l_ukca_linox_scaling=.false.
-!!l_ukca_quasinewton=.false.
+!!l_ukca_linox_scaling=
+!!l_ukca_quasinewton=
!!l_ukca_ro2_ntp=.false.
-!!lightnox_scale_fac=0
+!!lightnox_scale_fac=
!!photol_scheme='off'
-!!top_bdy_opt='no_overwrt'
+!!top_bdy_opt=''
[!!namelist:cloud]
!!cff_spread_rate=1.0e-5
@@ -317,7 +331,7 @@ stretching_method='smooth'
!!aerosols_ancil_path=''
!!albedo_nir_ancil_path=''
!!albedo_vis_ancil_path=''
-ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${ancil_resolution}'
+ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${RESOLUTION}'
checkpoint_stem_name=''
!!cloud_drop_no_conc_ancil_path=''
!!coarse_ancil_directory=''
@@ -378,7 +392,7 @@ diag_stem_name=''
!!o3_ancil_path=''
!!oh_ancil_path=''
orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog'
-!!orography_subgrid_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid'
+!!orography_subgrid_ancil_path=''
!!ozone_ancil_path=''
!!plant_func_ancil_path=''
!!sea_ancil_path=''
@@ -410,7 +424,7 @@ exner_from_eos=.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.
@@ -420,7 +434,7 @@ 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.
@@ -434,16 +448,16 @@ profile_data_v=0.0
times=0.0
[namelist:helmholtz_solver]
-fail_on_non_converged=.false.
-gcrk=18
+!!fail_on_non_converged=.false.
+gcrk=8
!!jacobi_relaxation=0.5
-method='bicgstab'
-monitor_convergence=.true.
+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
[namelist:iau]
!!iau_ainc_multifile=.false.
@@ -453,7 +467,7 @@ si_pressure_tolerance=1.0e-15
!!iau_tendency_ainc=.false.
!!iau_tendency_bcorr=.true.
!!iau_tendency_pertinc=.false.
-!!iau_ts_start=0
+!!iau_ts_start=1
!!iau_use_addinf=.false.
!!iau_use_bcorr=.false.
!!iau_use_level_one_temp=.false.
@@ -500,15 +514,15 @@ f_lon_deg=0.0
perturb_init=.false.
!!perturb_magnitude=0
!!perturb_seed=0
-test='gravity_wave'
+test='none'
[namelist: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
@@ -520,22 +534,22 @@ surface_pressure=1000.0e2
[namelist:initial_temperature]
bvf_square=0.0001
-pert_centre=120.0
+pert_centre=60.0
pert_width_scaling=1.0
perturb='none'
-!!profile_data=300.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=300.0,300.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
theta_surf=300.0
[namelist:initial_vapour]
-!!profile_data=0.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=0.0,0.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
[namelist:initial_wind]
nl_constant=0.0
-profile='none'
+profile='constant_uv'
!!profile_data_u=0.0
!!profile_data_v=0.0
!!profile_data_w=0.0
@@ -545,8 +559,8 @@ profile='none'
!!profile_size_w=1
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
@@ -574,7 +588,7 @@ checkpoint_write=.false.
counter_output_suffix='counter.txt'
diag_active_files='lfric_diag'
diag_always_on_sampling=.false.
-diagnostic_frequency=8
+diagnostic_frequency=12
!!end_of_run_checkpoint=.true.
file_convention='UGRID'
multifile_io=.false.
@@ -590,16 +604,16 @@ write_fluxes=.false.
write_minmax_tseries=.false.
[namelist:jedi_geometry]
-io_calender_start='2018-04-14T21:00:00'
+io_calender_start='2021-06-02T00:00:00'
io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
io_path_state_read='$BIG_DATA_DIR/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'
[namelist:jedi_increment]
-inc_time='2018-04-14 21:00:00'
-initialise_via_read=.true.
+inc_time='2021-06-02 00:00:00'
+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'
@@ -611,18 +625,19 @@ forecast_length='P0DT6H0M0S'
test_field='theta'
[namelist:jedi_linear_model]
+incremental_wind_interpolation=.false.
nl_time_step='P0DT1H0M0S'
[namelist:jedi_pseudo_model]
-initial_time='2018-04-14T21:00:00'
+initial_time='2021-06-02 00:00:00'
number_of_steps=9
time_step='P0DT1H0M0S'
[namelist:jedi_state]
-state_time='2018-04-14 21:00:00'
+state_time='2021-06-02 00: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'
[!!namelist:jules_hydrology]
l_hydrology=.true.
@@ -656,7 +671,7 @@ kext_io=0.5,0.5,1.0,1.0,0.5
knl_io=5*0.2
omega_io=0.101,0.083,0.132,0.135,0.115
omnir_io=0.788,0.545,0.864,0.787,0.785
-z0hm_pft_io=1.65,1.65,0.1,0.1,0.1
+z0hm_pft_io=1.0,1.0,0.01,0.01,0.01
!!z0v_io=1.1,1.1,0.22,0.22,1.0
[!!namelist:jules_radiation]
@@ -695,8 +710,8 @@ l_use_dtstar_sea=.false.
nice=1
!!u_cdn_hw=55.0
!!u_cdn_max=33.0
-!!z0h_specified=0.01
-!!z0m_specified=0.1
+!!z0h_specified=0.0
+!!z0m_specified=0.0
[!!namelist:jules_snow]
can_clump=8.0,4.0,1.0,1.0,1.0
@@ -775,7 +790,20 @@ l_spec_veg_z0=.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'
+
+[namelist: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
[namelist:logging]
log_to_rank_zero_only=.true.
@@ -803,40 +831,40 @@ microphysics_casim=.false.
!!orog_block=.true.
!!orog_rain=.true.
!!orog_rime=.true.
-!!prog_tnuc=.false.
+!!prog_tnuc=.true.
!!qcl_rime=1.0e-4
-!!shape_rime=.false.
+!!shape_rime=.true.
turb_gen_mixph=.true.
!!z_surf=50.0
[namelist:mixed_solver]
eliminate_variables='discrete'
-fail_on_non_converged=.false.
-gcrk=10
+fail_on_non_converged=.true.
+gcrk=4
guess_np1=.false.
!!jacobi_relaxation=0.5
-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.
[namelist:mixing]
!!leonard_kl=2.0
leonard_term=.false.
-!!method='blending'
+!!method='blend_1dbl_fa'
!!mix_factor=0.2
!!smag_l_calc='UseDx'
smagorinsky=.false.
viscosity=.false.
viscosity_mu=0.0
-[!!namelist:multigrid]
-chain_mesh_tags='','','',''
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2','multigrid_l3'
multigrid_chain_nitems=4
n_coarsesmooth=4
n_postsmooth=2
@@ -844,9 +872,17 @@ n_presmooth=2
smooth_relaxation=0.8
[!!namelist:multires_coupling]
-aerosol_mesh_name='dynamics'
+aerosol_mesh_name='aerosol'
coarse_aerosol_transport=.false.
coarse_rad_aerosol=.false.
+dynamics_mesh_name='dynamics'
+!!lowest_order_aero_flag=.false.
+multires_coupling_mesh_tags='dynamics'
+multires_coupling_mode='test'
+negative_correction='none'
+physics_mesh_name='aerosol'
+reconstruction='simple'
+recovery_order='linear'
[!!namelist:orbit]
!!arg_periapsis=1.796767421
@@ -941,7 +977,7 @@ phi_centre_dec=0.0
wavelength=4000.0
[namelist:partitioning]
-generate_inner_halos=.true.
+generate_inner_halos=.false.
panel_decomposition='auto'
!!panel_xproc=1
!!panel_yproc=1
@@ -956,15 +992,15 @@ configure_segments=.false.
!!electric_placement='slow'
!!evap_condense_placement='fast'
!!gw_segment=0
-!!limit_drag_incs=.false.
+limit_drag_incs=.false.
!!lowest_level='gradient'
!!ls_ppn_segment=0
!!microphysics_placement='slow'
!!orographic_drag_placement='slow'
!!radiation_placement='slow'
-!!sample_physics_scalars=.true.
-!!sample_physics_winds=.true.
-!!sample_physics_winds_correction=.false.
+sample_physics_scalars=.true.
+sample_physics_winds=.true.
+sample_physics_winds_correction=.false.
!!smagorinsky_placement='end'
!!spectral_gwd_placement='slow'
!!stochastic_physics_placement='fast'
@@ -1007,12 +1043,12 @@ mcica_data_file='spec/mcica_data'
n_radstep=2
!!planet_albedo=0.06
!!planet_emissivity=0.985
-scatter_method_lw='full'
-!!scatter_method_lwinc='full'
+scatter_method_lw='hybrid'
+!!scatter_method_lwinc='approx'
spectral_file_lw='spec/sp_lw_ga9'
-!!spectral_file_lwinc='spec/sp_lw_cloud7'
+!!spectral_file_lwinc='spec/sp_lw_cloud9'
spectral_file_sw='spec/sp_sw_ga9'
-!!spectral_file_swinc='spec/sp_sw_cloud7'
+!!spectral_file_swinc='spec/sp_sw_cloud9'
topography='slope'
[namelist:radiative_gases]
@@ -1026,26 +1062,26 @@ cfc113_rad_opt='off'
!!cfc11_clim_fcg_nyears=0
!!cfc11_clim_fcg_rates=0
!!cfc11_clim_fcg_years=0
-!!cfc11_mix_ratio=1.110e-09
-cfc11_rad_opt='off'
+cfc11_mix_ratio=1.110e-09
+cfc11_rad_opt='constant'
!!cfc12_clim_fcg_levls=0
!!cfc12_clim_fcg_nyears=0
!!cfc12_clim_fcg_rates=0
!!cfc12_clim_fcg_years=0
-!!cfc12_mix_ratio=2.187e-09
-cfc12_rad_opt='off'
+cfc12_mix_ratio=2.187e-09
+cfc12_rad_opt='constant'
!!ch4_clim_fcg_levls=0
!!ch4_clim_fcg_nyears=0
!!ch4_clim_fcg_rates=0
!!ch4_clim_fcg_years=0
-!!ch4_mix_ratio=1.006e-06
-ch4_rad_opt='off'
+ch4_mix_ratio=1.006e-06
+ch4_rad_opt='constant'
!!co2_clim_fcg_levls=0
!!co2_clim_fcg_nyears=0
!!co2_clim_fcg_rates=0
!!co2_clim_fcg_years=0
-!!co2_mix_ratio=6.002e-04
-co2_rad_opt='off'
+co2_mix_ratio=6.002e-04
+co2_rad_opt='constant'
!!co_clim_fcg_levls=0
!!co_clim_fcg_nyears=0
!!co_clim_fcg_rates=0
@@ -1117,8 +1153,8 @@ n2_rad_opt='off'
!!n2o_clim_fcg_nyears=0
!!n2o_clim_fcg_rates=0
!!n2o_clim_fcg_years=0
-!!n2o_mix_ratio=4.945e-07
-n2o_rad_opt='off'
+n2o_mix_ratio=4.945e-07
+n2o_rad_opt='constant'
!!na_clim_fcg_levls=0
!!na_clim_fcg_nyears=0
!!na_clim_fcg_rates=0
@@ -1135,8 +1171,8 @@ nh3_rad_opt='off'
!!o2_clim_fcg_nyears=0
!!o2_clim_fcg_rates=0
!!o2_clim_fcg_years=0
-!!o2_mix_ratio=0.2314
-o2_rad_opt='off'
+o2_mix_ratio=0.2314
+o2_rad_opt='constant'
!!o3_clim_fcg_levls=0
!!o3_clim_fcg_nyears=0
!!o3_clim_fcg_rates=0
@@ -1145,7 +1181,7 @@ o2_rad_opt='off'
!!o3_profile_data=0
!!o3_profile_heights=0.0
!!o3_profile_size=0
-o3_rad_opt='off'
+o3_rad_opt='ancil'
!!rb_clim_fcg_levls=0
!!rb_clim_fcg_nyears=0
!!rb_clim_fcg_rates=0
@@ -1172,10 +1208,10 @@ tio_rad_opt='off'
vo_rad_opt='off'
[namelist:section_choice]
-!!aerosol='none'
-!!boundary_layer='none'
-!!chemistry='none'
-!!cloud='none'
+aerosol='none'
+boundary_layer='none'
+chemistry='none'
+cloud='none'
!!convection='none'
dynamics='gungho'
!!electric='none'
@@ -1183,23 +1219,23 @@ external_forcing=.false.
iau=.false.
iau_sst=.false.
iau_surf=.false.
-!!methane_oxidation=.false.
+methane_oxidation=.false.
!!microphysics='none'
-!!orographic_drag='none'
-!!radiation='none'
-!!spectral_gwd='none'
-!!stochastic_physics='none'
-!!surface='none'
+orographic_drag='none'
+radiation='none'
+spectral_gwd='none'
+stochastic_physics='none'
+surface='none'
[namelist:solver]
-fail_on_non_converged=.false.
+!!fail_on_non_converged=.false.
gcrk=18
!!jacobi_relaxation=0.5
-maximum_iterations=50
+maximum_iterations=7
method='chebyshev'
-monitor_convergence=.true.
+monitor_convergence=.false.
preconditioner='diagonal'
-tolerance=1.0e-18
+tolerance=1.0e-6
[namelist:specified_surface]
!!function_amplitude_e=200
@@ -1226,10 +1262,10 @@ tolerance=1.0e-18
!!time_units_sst='seconds'
[!!namelist:spectral_gwd]
-add_cgw=.false.
-!!cgw_scale_factor=1.0
+add_cgw=.true.
+!!cgw_scale_factor=0.86
ussp_heating=.true.
-ussp_launch_factor=1.3
+ussp_launch_factor=1.2
wavelstar=4300.0
[!!namelist:star]
@@ -1282,9 +1318,9 @@ ens_memb=${ENSEMBLE_MEMBER}
!!rp_lsfc_orog_drag_param=0.15,0.15,0.15
!!rp_lsfc_z0_soil=1.0e-3,1.0e-3,1.0e-3
!!rp_lsfc_z0_urban_mult=1.0,1.0,1.0
-!!rp_lsfc_z0hm_pft=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_max=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_min=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
+!!rp_lsfc_z0hm_pft=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_max=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_min=1.00,1.00,0.022,0.022,0.025
!!rp_lsfc_z0hm_soil=2.0e-1,2.0e-1,2.0e-1
!!rp_lsfc_z0v=
!!rp_lsfc_z0v_max=
@@ -1329,7 +1365,7 @@ ens_memb=${ENSEMBLE_MEMBER}
!!spt_use_convection=.true.
!!spt_use_microphysics=.true.
!!spt_use_radiation=.true.
-stph_n_max=22
+stph_n_max=60
stph_n_min=20
use_random_parameters=.false.
use_skeb=.false.
@@ -1360,8 +1396,8 @@ timescale=1.0
[namelist:time]
calendar='timestep'
-calendar_origin='2018-04-14 21:00:00'
-calendar_start='2018-04-14 21:00:00'
+calendar_origin='2021-06-02 00:00:00'
+calendar_start='2021-06-02 00:00:00'
calendar_type='gregorian'
timestep_end='$RESTART_STOP'
timestep_start='$RESTART_START'
@@ -1369,7 +1405,7 @@ timestep_start='$RESTART_START'
[namelist:timestepping]
alpha=0.55
dt=$DT
-inner_iterations=2
+inner_iterations=1
method='semi_implicit'
outer_iterations=2
runge_kutta_method='forward_euler'
@@ -1384,6 +1420,7 @@ adjust_theta=.false.
!!adjust_theta_above=30000.0
adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
+ageofair_reset_level=10
broken_w2_projection=.false.
calculate_detj='upwind'
cap_density_predictor=0.5
@@ -1400,14 +1437,15 @@ 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_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'
@@ -1417,7 +1455,7 @@ operators='fv'
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'
@@ -1427,10 +1465,11 @@ 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
diff --git a/rose-stem/app/jedi_tlm_tests/file/iodef.xml b/rose-stem/app/jedi_tlm_tests/file/iodef.xml
index 808f8ef9..e6fe117c 100644
--- a/rose-stem/app/jedi_tlm_tests/file/iodef.xml
+++ b/rose-stem/app/jedi_tlm_tests/file/iodef.xml
@@ -41,6 +41,7 @@
+
@@ -55,6 +56,7 @@
+
@@ -144,6 +146,11 @@
+
+
+
+
+
@@ -421,6 +428,7 @@
+
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-C12_MG.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-C12_MG.conf
new file mode 100644
index 00000000..125a4758
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-C12_MG.conf
@@ -0,0 +1,8 @@
+[file:mesh_C12_MG.nc]
+mode=auto
+source=$MESH_DIR/mesh_C12_MG.nc
+
+[namelist:base_mesh]
+!!f_lat_deg=
+file_prefix='mesh_C12_MG'
+!!fplane=
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-C224_MG.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-C224_MG.conf
new file mode 100644
index 00000000..1814a470
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-C224_MG.conf
@@ -0,0 +1,8 @@
+[file:mesh_C224_MG.nc]
+mode=auto
+source=$MESH_DIR/mesh_C224_MG.nc
+
+[namelist:base_mesh]
+!!f_lat_deg=
+file_prefix='mesh_C224_MG'
+!!fplane=
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-default.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-default.conf
deleted file mode 100644
index e69de29b..00000000
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-dry.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-dry.conf
index 3f2af7e5..ffd315be 100644
--- a/rose-stem/app/jedi_tlm_tests/opt/rose-app-dry.conf
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-dry.conf
@@ -2,3 +2,8 @@
moisture_formulation='dry'
moisture_in_solver=.false.
!!theta_moist_source=.false.
+
+[namelist:section_choice]
+!!aerosol='none'
+!!cloud='none'
+!!methane_oxidation=.false.
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c12.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c12.conf
new file mode 100644
index 00000000..ccd55de3
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c12.conf
@@ -0,0 +1,28 @@
+[file:iodef_temp.xml]
+mode=auto
+source=$ROSE_SUITE_DIR/app/jedi_tlm_tests/file/iodef.xml
+
+[namelist:io]
+diagnostic_frequency=8
+
+[namelist:jedi_geometry]
+io_calender_start='2018-04-14T21:00:00'
+io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
+io_path_state_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/ls_fields/jedi_trajectory'
+
+[namelist:jedi_increment]
+inc_time='2018-04-14 21:00:00'
+
+[namelist:jedi_pseudo_model]
+initial_time='2018-04-14T21:00:00'
+
+[namelist:jedi_state]
+state_time='2018-04-14 21:00:00'
+
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2'
+multigrid_chain_nitems=3
+
+[namelist:time]
+calendar_origin='2018-04-14 21:00:00'
+calendar_start='2018-04-14 21:00:00'
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c224.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c224.conf
new file mode 100644
index 00000000..dfe2b916
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-nwp_gal9_c224.conf
@@ -0,0 +1,3 @@
+[file:iodef_temp.xml]
+mode=auto
+source=$ROSE_SUITE_DIR/app/jedi_tlm_tests/file/iodef.xml
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-real_increment.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-real_increment.conf
new file mode 100644
index 00000000..aea74c8f
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-real_increment.conf
@@ -0,0 +1,5 @@
+[namelist:jedi_geometry]
+io_setup_increment=.true.
+
+[namelist:jedi_increment]
+initialise_via_read=.true.
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-relaxed_solver.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-relaxed_solver.conf
deleted file mode 100644
index b435c2bc..00000000
--- a/rose-stem/app/jedi_tlm_tests/opt/rose-app-relaxed_solver.conf
+++ /dev/null
@@ -1,15 +0,0 @@
-[namelist:helmholtz_solver]
-gcrk=8
-si_pressure_a_tol=1.0e-8
-si_pressure_maximum_iterations=400
-si_pressure_tolerance=1.0e-4
-
-[namelist:mixed_solver]
-gcrk=6
-mixed_solver_a_tol=0.0
-si_maximum_iterations=10
-si_tolerance=1.0e-5
-
-[namelist:solver]
-maximum_iterations=7
-tolerance=1.0e-6
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-rrt_equals_dt.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-rrt_equals_dt.conf
new file mode 100644
index 00000000..3d974564
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-rrt_equals_dt.conf
@@ -0,0 +1,2 @@
+[namelist:mixed_solver]
+reference_reset_time=$DT
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-semi_strict_solver.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-semi_strict_solver.conf
new file mode 100644
index 00000000..4af6d3cf
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-semi_strict_solver.conf
@@ -0,0 +1,9 @@
+[namelist:jedi_lfric_settings]
+adjoint_test_tolerance=1.0e-2
+
+[namelist:mixed_solver]
+mixed_solver_a_tol=1.0e-21
+si_tolerance=1.0e-3
+
+[namelist:timestepping]
+outer_iterations=1
diff --git a/rose-stem/app/jedi_tlm_tests/opt/rose-app-strict_solver.conf b/rose-stem/app/jedi_tlm_tests/opt/rose-app-strict_solver.conf
new file mode 100644
index 00000000..77270e0f
--- /dev/null
+++ b/rose-stem/app/jedi_tlm_tests/opt/rose-app-strict_solver.conf
@@ -0,0 +1,15 @@
+[namelist:helmholtz_solver]
+gcrk=18
+si_pressure_a_tol=0
+si_pressure_tolerance=1.0e-15
+
+[namelist:mixed_solver]
+fail_on_non_converged=.false.
+gcrk=10
+mixed_solver_a_tol=1.0e-21
+si_maximum_iterations=100
+si_tolerance=1.0e-21
+
+[namelist:solver]
+maximum_iterations=50
+tolerance=1.0e-18
diff --git a/rose-stem/app/jedi_tlm_tests/rose-app.conf b/rose-stem/app/jedi_tlm_tests/rose-app.conf
index c9d61c15..3175c101 100644
--- a/rose-stem/app/jedi_tlm_tests/rose-app.conf
+++ b/rose-stem/app/jedi_tlm_tests/rose-app.conf
@@ -23,13 +23,19 @@ source=namelist:jedi_lfric_tests
= namelist:jedi_linear_model
= namelist:jedi_pseudo_model
= namelist:jedi_lfric_settings
+ = (namelist:aerosol)
= namelist:base_mesh
+ = (namelist:blayer)
= namelist:boundaries
= namelist:checks
= namelist:section_choice
+ = (namelist:cloud)
+ = (namelist:chemistry)
+ = (namelist:convection)
+ = (namelist:cosp)
= (namelist:damping_layer)
= (namelist:departure_points)
- = namelist:energy_correction
+ = (namelist:energy_correction)
= (namelist:external_forcing)
= namelist:extrusion
= (namelist:files)
@@ -40,6 +46,7 @@ source=namelist:jedi_lfric_tests
= (namelist:iau_addinf_io(:))
= (namelist:iau_ainc_io(:))
= (namelist:iau_bcorr_io(:))
+ = (namelist:iau)
= (namelist:idealised)
= (namelist:ideal_surface)
= namelist:initialization
@@ -62,30 +69,35 @@ source=namelist:jedi_lfric_tests
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
+ = (namelist:microphysics)
= namelist:mixed_solver
- = (namelist:mixing)
+ = namelist:mixing
= (namelist:multigrid)
= (namelist:multires_coupling)
= namelist:esm_couple
+ = (namelist:orbit)
= namelist:orography
= (namelist:orography_agnesi_cartesian)
= (namelist:orography_agnesi_spherical)
- = (namelist:orography_bell_cartesian)
- = (namelist:orography_bell_spherical)
= (namelist:orography_dcmip200_spherical)
= (namelist:orography_schar_cartesian)
= (namelist:orography_schar_spherical)
= namelist:partitioning
= (namelist:physics)
= namelist:planet
+ = (namelist:radiation)
= namelist:radiative_gases
+ = (namelist:spectral_gwd)
+ = (namelist:orographic_drag)
= namelist:solver
= (namelist:specified_surface)
+ = (namelist:star)
= (namelist:stochastic_physics)
+ = (namelist:surface)
= (namelist:temp_tend_data)
= (namelist:theta_relax)
- = (namelist:theta_relax)
= namelist:time
= namelist:timestepping
= namelist:transport
@@ -106,24 +118,24 @@ easyaerosol_cdnc=.false.
easyaerosol_lw=.false.
easyaerosol_sw=.false.
!!emissions='GC5'
-glomap_mode='off'
+glomap_mode='dust_and_clim'
!!horiz_d=2.25
-!!l_radaer=.false.
+!!l_radaer=.true.
murk=.false.
!!murk_lbc=.false.
!!murk_prognostic=.false.
!!murk_source_scaling=1.0
!!murk_visibility=.false.
!!n_radaer_step=1
-!!prec_file=''
-sulphuric_strat_climatology=.false.
+!!prec_file='precalc/RADAER_pcalc.ukca'
+sulphuric_strat_climatology=.true.
!!sulphuric_strat_column=1.86604e-6
ukca_mode_seg_size=4
!!us_am=1.45
[namelist:base_mesh]
!!f_lat_deg=45.0
-file_prefix='mesh.nc'
+file_prefix='mesh'
!!fplane=.false.
geometry='spherical'
prepartitioned=.false.
@@ -186,7 +198,7 @@ limited_area=.false.
!!rim_width_ns=1
!!solver_boundary_depth=1
!!transport_boundary_depth=6
-transport_overwrite_freq='split_step'
+transport_overwrite_freq='final'
[namelist:checks]
limit_cfl=.false.
@@ -206,14 +218,14 @@ chem_scheme='none'
!!fjx_spec_file='FJX_spec_Nov11.dat'
!!flexchem_opt='bs1999'
i_chem_timestep_halvings=0
-!!i_ukca_chem_version=0
+!!i_ukca_chem_version=111
!!l_ukca_asad_full=.false.
-!!l_ukca_linox_scaling=.false.
-!!l_ukca_quasinewton=.false.
+!!l_ukca_linox_scaling=
+!!l_ukca_quasinewton=
!!l_ukca_ro2_ntp=.false.
-!!lightnox_scale_fac=0
+!!lightnox_scale_fac=
!!photol_scheme='off'
-!!top_bdy_opt='no_overwrt'
+!!top_bdy_opt=''
[!!namelist:cloud]
!!cff_spread_rate=1.0e-5
@@ -319,7 +331,7 @@ stretching_method='smooth'
!!aerosols_ancil_path=''
!!albedo_nir_ancil_path=''
!!albedo_vis_ancil_path=''
-ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${ancil_resolution}'
+ancil_directory='$BIG_DATA_DIR/ancils/basic-gal/yak/${RESOLUTION}'
checkpoint_stem_name=''
!!cloud_drop_no_conc_ancil_path=''
!!coarse_ancil_directory=''
@@ -380,7 +392,7 @@ diag_stem_name=''
!!o3_ancil_path=''
!!oh_ancil_path=''
orography_mean_ancil_path='orography/gmted_ramp2/qrparm.orog'
-!!orography_subgrid_ancil_path='orography/gmted_ramp2/qrparm.orog.ugrid'
+!!orography_subgrid_ancil_path=''
!!ozone_ancil_path=''
!!plant_func_ancil_path=''
!!sea_ancil_path=''
@@ -412,7 +424,7 @@ exner_from_eos=.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.
@@ -422,7 +434,7 @@ 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.
@@ -436,16 +448,16 @@ profile_data_v=0.0
times=0.0
[namelist:helmholtz_solver]
-fail_on_non_converged=.false.
-gcrk=18
+!!fail_on_non_converged=.false.
+gcrk=8
!!jacobi_relaxation=0.5
-method='bicgstab'
-monitor_convergence=.true.
+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
[namelist:iau]
!!iau_ainc_multifile=.false.
@@ -455,7 +467,7 @@ si_pressure_tolerance=1.0e-15
!!iau_tendency_ainc=.false.
!!iau_tendency_bcorr=.true.
!!iau_tendency_pertinc=.false.
-!!iau_ts_start=0
+!!iau_ts_start=1
!!iau_use_addinf=.false.
!!iau_use_bcorr=.false.
!!iau_use_level_one_temp=.false.
@@ -502,15 +514,15 @@ f_lon_deg=0.0
perturb_init=.false.
!!perturb_magnitude=0
!!perturb_seed=0
-test='gravity_wave'
+test='none'
[namelist: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
@@ -522,22 +534,22 @@ surface_pressure=1000.0e2
[namelist:initial_temperature]
bvf_square=0.0001
-pert_centre=120.0
+pert_centre=60.0
pert_width_scaling=1.0
perturb='none'
-!!profile_data=300.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=300.0,300.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
theta_surf=300.0
[namelist:initial_vapour]
-!!profile_data=0.0
-!!profile_heights=0.0
-!!profile_size=1
+!!profile_data=0.0,0.0
+!!profile_heights=0.0,10.0e3
+!!profile_size=2
[namelist:initial_wind]
nl_constant=0.0
-profile='none'
+profile='constant_uv'
!!profile_data_u=0.0
!!profile_data_v=0.0
!!profile_data_w=0.0
@@ -547,8 +559,8 @@ profile='none'
!!profile_size_w=1
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
@@ -576,7 +588,7 @@ checkpoint_write=.false.
counter_output_suffix='counter.txt'
diag_active_files='lfric_diag'
diag_always_on_sampling=.false.
-diagnostic_frequency=8
+diagnostic_frequency=12
!!end_of_run_checkpoint=.true.
file_convention='UGRID'
multifile_io=.false.
@@ -592,15 +604,15 @@ write_fluxes=.false.
write_minmax_tseries=.false.
[namelist:jedi_geometry]
-io_calender_start='2018-04-14T21:00:00'
-io_path_inc_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/pert_fields/lfric_diag'
-io_path_state_read='$BIG_DATA_DIR/jedi-lfric/Ticket354/ls_fields/jedi_trajectory'
+io_calender_start='2021-06-02T00:00:00'
+io_path_inc_read='/data/users/tom.hill/LFRic/jedi_tlm_tests/C224_lfric_diag'
+io_path_state_read='/data/users/tom.hill/LFRic/jedi_tlm_tests/C224_jedi_trajectory'
io_path_state_write='write_file'
io_setup_increment=.false.
io_time_step='P0DT1H0M0S'
[namelist:jedi_increment]
-inc_time='2018-04-14 21:00:00'
+inc_time='2021-06-02 00:00:00'
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'
@@ -613,19 +625,19 @@ forecast_length='P0DT6H0M0S'
test_field='theta'
[namelist:jedi_linear_model]
-incremental_wind_interpolation=.true.
+incremental_wind_interpolation=.false.
nl_time_step='P0DT1H0M0S'
[namelist:jedi_pseudo_model]
-initial_time='2018-04-14T21:00:00'
+initial_time='2021-06-02 00:00:00'
number_of_steps=9
time_step='P0DT1H0M0S'
[namelist:jedi_state]
-state_time='2018-04-14 21:00:00'
+state_time='2021-06-02 00: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'
[!!namelist:jules_hydrology]
l_hydrology=.true.
@@ -659,7 +671,7 @@ kext_io=0.5,0.5,1.0,1.0,0.5
knl_io=5*0.2
omega_io=0.101,0.083,0.132,0.135,0.115
omnir_io=0.788,0.545,0.864,0.787,0.785
-z0hm_pft_io=1.65,1.65,0.1,0.1,0.1
+z0hm_pft_io=1.0,1.0,0.01,0.01,0.01
!!z0v_io=1.1,1.1,0.22,0.22,1.0
[!!namelist:jules_radiation]
@@ -698,8 +710,8 @@ l_use_dtstar_sea=.false.
nice=1
!!u_cdn_hw=55.0
!!u_cdn_max=33.0
-!!z0h_specified=0.01
-!!z0m_specified=0.1
+!!z0h_specified=0.0
+!!z0m_specified=0.0
[!!namelist:jules_snow]
can_clump=8.0,4.0,1.0,1.0,1.0
@@ -742,8 +754,12 @@ l_land_ice_imp=.true.
l_mo_buoyancy_calc=.true.
!!l_point_data=.false.
l_urban2t=.false.
+<<<<<<< HEAD
+l_vary_z0m_soil=.true.
+=======
l_vary_z0m_soil=.false.
!!orog_drag_param=0.15
+>>>>>>> main
srf_ex_cnv_gust=.true.
[!!namelist:jules_surface_types]
@@ -778,7 +794,20 @@ l_spec_veg_z0=.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'
+
+[namelist: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
[namelist:logging]
log_to_rank_zero_only=.true.
@@ -806,40 +835,40 @@ microphysics_casim=.false.
!!orog_block=.true.
!!orog_rain=.true.
!!orog_rime=.true.
-!!prog_tnuc=.false.
+!!prog_tnuc=.true.
!!qcl_rime=1.0e-4
-!!shape_rime=.false.
+!!shape_rime=.true.
turb_gen_mixph=.true.
!!z_surf=50.0
[namelist:mixed_solver]
eliminate_variables='discrete'
-fail_on_non_converged=.false.
-gcrk=10
+fail_on_non_converged=.true.
+gcrk=4
guess_np1=.false.
!!jacobi_relaxation=0.5
-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.
[namelist:mixing]
!!leonard_kl=2.0
leonard_term=.false.
-!!method='blending'
+!!method='blend_1dbl_fa'
!!mix_factor=0.2
!!smag_l_calc='UseDx'
smagorinsky=.false.
viscosity=.false.
viscosity_mu=0.0
-[!!namelist:multigrid]
-chain_mesh_tags='','','',''
+[namelist:multigrid]
+chain_mesh_tags='dynamics','multigrid_l1','multigrid_l2','multigrid_l3'
multigrid_chain_nitems=4
n_coarsesmooth=4
n_postsmooth=2
@@ -847,9 +876,17 @@ n_presmooth=2
smooth_relaxation=0.8
[!!namelist:multires_coupling]
-aerosol_mesh_name='dynamics'
+aerosol_mesh_name='aerosol'
coarse_aerosol_transport=.false.
coarse_rad_aerosol=.false.
+dynamics_mesh_name='dynamics'
+!!lowest_order_aero_flag=.false.
+multires_coupling_mesh_tags='dynamics'
+multires_coupling_mode='test'
+negative_correction='none'
+physics_mesh_name='aerosol'
+reconstruction='simple'
+recovery_order='linear'
[!!namelist:orbit]
!!arg_periapsis=1.796767421
@@ -944,7 +981,7 @@ phi_centre_dec=0.0
wavelength=4000.0
[namelist:partitioning]
-generate_inner_halos=.true.
+generate_inner_halos=.false.
panel_decomposition='auto'
!!panel_xproc=1
!!panel_yproc=1
@@ -959,15 +996,15 @@ configure_segments=.false.
!!electric_placement='slow'
!!evap_condense_placement='fast'
!!gw_segment=0
-!!limit_drag_incs=.false.
+limit_drag_incs=.false.
!!lowest_level='gradient'
!!ls_ppn_segment=0
!!microphysics_placement='slow'
!!orographic_drag_placement='slow'
!!radiation_placement='slow'
-!!sample_physics_scalars=.true.
-!!sample_physics_winds=.true.
-!!sample_physics_winds_correction=.false.
+sample_physics_scalars=.true.
+sample_physics_winds=.true.
+sample_physics_winds_correction=.false.
!!smagorinsky_placement='end'
!!spectral_gwd_placement='slow'
!!stochastic_physics_placement='fast'
@@ -1010,12 +1047,12 @@ mcica_data_file='spec/mcica_data'
n_radstep=2
!!planet_albedo=0.06
!!planet_emissivity=0.985
-scatter_method_lw='full'
-!!scatter_method_lwinc='full'
+scatter_method_lw='hybrid'
+!!scatter_method_lwinc='approx'
spectral_file_lw='spec/sp_lw_ga9'
-!!spectral_file_lwinc='spec/sp_lw_cloud7'
+!!spectral_file_lwinc='spec/sp_lw_cloud9'
spectral_file_sw='spec/sp_sw_ga9'
-!!spectral_file_swinc='spec/sp_sw_cloud7'
+!!spectral_file_swinc='spec/sp_sw_cloud9'
topography='slope'
[namelist:radiative_gases]
@@ -1029,26 +1066,26 @@ cfc113_rad_opt='off'
!!cfc11_clim_fcg_nyears=0
!!cfc11_clim_fcg_rates=0
!!cfc11_clim_fcg_years=0
-!!cfc11_mix_ratio=1.110e-09
-cfc11_rad_opt='off'
+cfc11_mix_ratio=1.110e-09
+cfc11_rad_opt='constant'
!!cfc12_clim_fcg_levls=0
!!cfc12_clim_fcg_nyears=0
!!cfc12_clim_fcg_rates=0
!!cfc12_clim_fcg_years=0
-!!cfc12_mix_ratio=2.187e-09
-cfc12_rad_opt='off'
+cfc12_mix_ratio=2.187e-09
+cfc12_rad_opt='constant'
!!ch4_clim_fcg_levls=0
!!ch4_clim_fcg_nyears=0
!!ch4_clim_fcg_rates=0
!!ch4_clim_fcg_years=0
-!!ch4_mix_ratio=1.006e-06
-ch4_rad_opt='off'
+ch4_mix_ratio=1.006e-06
+ch4_rad_opt='constant'
!!co2_clim_fcg_levls=0
!!co2_clim_fcg_nyears=0
!!co2_clim_fcg_rates=0
!!co2_clim_fcg_years=0
-!!co2_mix_ratio=6.002e-04
-co2_rad_opt='off'
+co2_mix_ratio=6.002e-04
+co2_rad_opt='constant'
!!co_clim_fcg_levls=0
!!co_clim_fcg_nyears=0
!!co_clim_fcg_rates=0
@@ -1120,8 +1157,8 @@ n2_rad_opt='off'
!!n2o_clim_fcg_nyears=0
!!n2o_clim_fcg_rates=0
!!n2o_clim_fcg_years=0
-!!n2o_mix_ratio=4.945e-07
-n2o_rad_opt='off'
+n2o_mix_ratio=4.945e-07
+n2o_rad_opt='constant'
!!na_clim_fcg_levls=0
!!na_clim_fcg_nyears=0
!!na_clim_fcg_rates=0
@@ -1138,8 +1175,8 @@ nh3_rad_opt='off'
!!o2_clim_fcg_nyears=0
!!o2_clim_fcg_rates=0
!!o2_clim_fcg_years=0
-!!o2_mix_ratio=0.2314
-o2_rad_opt='off'
+o2_mix_ratio=0.2314
+o2_rad_opt='constant'
!!o3_clim_fcg_levls=0
!!o3_clim_fcg_nyears=0
!!o3_clim_fcg_rates=0
@@ -1148,7 +1185,7 @@ o2_rad_opt='off'
!!o3_profile_data=0
!!o3_profile_heights=0.0
!!o3_profile_size=0
-o3_rad_opt='off'
+o3_rad_opt='ancil'
!!rb_clim_fcg_levls=0
!!rb_clim_fcg_nyears=0
!!rb_clim_fcg_rates=0
@@ -1175,10 +1212,10 @@ tio_rad_opt='off'
vo_rad_opt='off'
[namelist:section_choice]
-!!aerosol='none'
-!!boundary_layer='none'
-!!chemistry='none'
-!!cloud='none'
+aerosol='none'
+boundary_layer='none'
+chemistry='none'
+cloud='none'
!!convection='none'
dynamics='gungho'
!!electric='none'
@@ -1186,23 +1223,23 @@ external_forcing=.false.
iau=.false.
iau_sst=.false.
iau_surf=.false.
-!!methane_oxidation=.false.
+methane_oxidation=.false.
!!microphysics='none'
-!!orographic_drag='none'
-!!radiation='none'
-!!spectral_gwd='none'
-!!stochastic_physics='none'
-!!surface='none'
+orographic_drag='none'
+radiation='none'
+spectral_gwd='none'
+stochastic_physics='none'
+surface='none'
[namelist:solver]
-fail_on_non_converged=.false.
+!!fail_on_non_converged=.false.
gcrk=18
!!jacobi_relaxation=0.5
-maximum_iterations=50
+maximum_iterations=7
method='chebyshev'
-monitor_convergence=.true.
+monitor_convergence=.false.
preconditioner='diagonal'
-tolerance=1.0e-18
+tolerance=1.0e-6
[namelist:specified_surface]
!!function_amplitude_e=200
@@ -1229,10 +1266,10 @@ tolerance=1.0e-18
!!time_units_sst='seconds'
[!!namelist:spectral_gwd]
-add_cgw=.false.
-!!cgw_scale_factor=1.0
+add_cgw=.true.
+!!cgw_scale_factor=0.86
ussp_heating=.true.
-ussp_launch_factor=1.3
+ussp_launch_factor=1.2
wavelstar=4300.0
[!!namelist:star]
@@ -1285,9 +1322,9 @@ ens_memb=${ENSEMBLE_MEMBER}
!!rp_lsfc_orog_drag_param=0.15,0.15,0.15
!!rp_lsfc_z0_soil=1.0e-3,1.0e-3,1.0e-3
!!rp_lsfc_z0_urban_mult=1.0,1.0,1.0
-!!rp_lsfc_z0hm_pft=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_max=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
-!!rp_lsfc_z0hm_pft_min=1.65000,1.65000,1.00000e-2,1.00000e-2,1.00000e-1
+!!rp_lsfc_z0hm_pft=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_max=1.00,1.00,0.022,0.022,0.025
+!!rp_lsfc_z0hm_pft_min=1.00,1.00,0.022,0.022,0.025
!!rp_lsfc_z0hm_soil=2.0e-1,2.0e-1,2.0e-1
!!rp_lsfc_z0v=
!!rp_lsfc_z0v_max=
@@ -1332,7 +1369,7 @@ ens_memb=${ENSEMBLE_MEMBER}
!!spt_use_convection=.true.
!!spt_use_microphysics=.true.
!!spt_use_radiation=.true.
-stph_n_max=22
+stph_n_max=60
stph_n_min=20
use_random_parameters=.false.
use_skeb=.false.
@@ -1363,8 +1400,8 @@ timescale=1.0
[namelist:time]
calendar='timestep'
-calendar_origin='2018-04-14 21:00:00'
-calendar_start='2018-04-14 21:00:00'
+calendar_origin='2021-06-02 00:00:00'
+calendar_start='2021-06-02 00:00:00'
calendar_type='gregorian'
timestep_end='$RESTART_STOP'
timestep_start='$RESTART_START'
@@ -1372,7 +1409,7 @@ timestep_start='$RESTART_START'
[namelist:timestepping]
alpha=0.55
dt=$DT
-inner_iterations=2
+inner_iterations=1
method='semi_implicit'
outer_iterations=2
runge_kutta_method='forward_euler'
@@ -1387,6 +1424,7 @@ adjust_theta=.false.
!!adjust_theta_above=30000.0
adjust_tracer_equation=.false.
adjust_vhv_wind=.false.
+ageofair_reset_level=10
broken_w2_projection=.false.
calculate_detj='upwind'
cap_density_predictor=0.5
@@ -1403,14 +1441,15 @@ 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_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'
@@ -1420,7 +1459,7 @@ operators='fv'
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'
@@ -1430,10 +1469,11 @@ 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
diff --git a/rose-stem/app/linear_model/file/iodef.xml b/rose-stem/app/linear_model/file/iodef.xml
index d9d6303a..d40165b7 100644
--- a/rose-stem/app/linear_model/file/iodef.xml
+++ b/rose-stem/app/linear_model/file/iodef.xml
@@ -50,6 +50,11 @@
+
+
+
+
+
@@ -327,6 +332,7 @@
+
diff --git a/rose-stem/app/linear_model/opt/rose-app-dcmip301.conf b/rose-stem/app/linear_model/opt/rose-app-dcmip301.conf
index 01576bf1..8bf78b63 100644
--- a/rose-stem/app/linear_model/opt/rose-app-dcmip301.conf
+++ b/rose-stem/app/linear_model/opt/rose-app-dcmip301.conf
@@ -62,6 +62,17 @@ fixed_ls=.false.
l_stabilise_bl=.false.
pert_option='analytic'
+[namelist:linear_physics]
+!!blevs_m=15
+!!e_folding_levs_m=10
+!!l_0_m=80.0
+l_boundary_layer=.false.
+!!log_layer=2
+!!u_land_m=0.4
+!!u_sea_m=0.4
+!!z_land_m=0.05
+!!z_sea_m=0.0005
+
[!!namelist:multigrid]
chain_mesh_tags='','','',''
diff --git a/rose-stem/app/linear_model/opt/rose-app-nwp_gal9_c12.conf b/rose-stem/app/linear_model/opt/rose-app-nwp_gal9_c12.conf
index 4b375741..6bc37fdb 100644
--- a/rose-stem/app/linear_model/opt/rose-app-nwp_gal9_c12.conf
+++ b/rose-stem/app/linear_model/opt/rose-app-nwp_gal9_c12.conf
@@ -3,8 +3,8 @@ mode=auto
source=$ROSE_SUITE_DIR/app/linear_model/file/iodef.xml
[namelist:files]
-ls_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
-ls_filename='final_ls'
+ls_directory='/data/users/tim.payne/lfric_apps/files'
+ls_filename='final_ls_with_land'
start_dump_directory='$BIG_DATA_DIR/tangent-linear/Ticket354'
start_dump_filename='final_pert'
diff --git a/rose-stem/app/linear_model/opt/rose-app-semi-implicit.conf b/rose-stem/app/linear_model/opt/rose-app-semi-implicit.conf
index be23c9c8..d770f11a 100644
--- a/rose-stem/app/linear_model/opt/rose-app-semi-implicit.conf
+++ b/rose-stem/app/linear_model/opt/rose-app-semi-implicit.conf
@@ -61,6 +61,17 @@ diagnostic_frequency=20
l_stabilise_bl=.false.
pert_option='analytic'
+[namelist:linear_physics]
+!!blevs_m=15
+!!e_folding_levs_m=10
+!!l_0_m=80.0
+l_boundary_layer=.false.
+!!log_layer=2
+!!u_land_m=0.4
+!!u_sea_m=0.4
+!!z_land_m=0.05
+!!z_sea_m=0.0005
+
[namelist:mixed_solver]
gcrk=6
mixed_solver_a_tol=1.0e-6
diff --git a/rose-stem/app/linear_model/rose-app.conf b/rose-stem/app/linear_model/rose-app.conf
index 1c63ba50..e1e01198 100644
--- a/rose-stem/app/linear_model/rose-app.conf
+++ b/rose-stem/app/linear_model/rose-app.conf
@@ -62,6 +62,7 @@ source=(namelist:aerosol)
= (namelist:jules_urban)
= (namelist:jules_vegetation)
= namelist:linear
+ = namelist:linear_physics
= namelist:logging
= (namelist:microphysics)
= namelist:mixed_solver
@@ -378,7 +379,7 @@ diag_stem_name='diagGungho'
!!land_area_ancil_path=''
!!lbc_directory=''
!!lbc_filename=''
-ls_directory='$BIG_DATA_DIR/tangent-linear/Ticket735'
+ls_directory='/data/users/tim.payne/lfric_apps/files'
ls_filename='final_2021060200-2021060207'
!!no3_ancil_path=''
!!o3_ancil_path=''
@@ -744,12 +745,23 @@ l_spec_veg_z0=.true.
[namelist: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'
+[namelist: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
+
[namelist:logging]
log_to_rank_zero_only=.true.
run_log_level='info'
diff --git a/rose-stem/site/common/jedi_lfric_tests/tasks_jedi_lfric_tests.cylc b/rose-stem/site/common/jedi_lfric_tests/tasks_jedi_lfric_tests.cylc
index 22c3c074..845afeff 100644
--- a/rose-stem/site/common/jedi_lfric_tests/tasks_jedi_lfric_tests.cylc
+++ b/rose-stem/site/common/jedi_lfric_tests/tasks_jedi_lfric_tests.cylc
@@ -5,12 +5,11 @@
{# ########################################################################### #}
{% do LOG.debug("Entered site/common/jedi_lfric_tests/tasks_jedi_lfric_tests.cylc") %}
-{% if task_ns.conf_name == "nwp_gal9-C12" %}
+{% if task_ns.conf_name == "nwp_gal9-C12_MG" %}
{% do task_dict.update({
- "opt_confs": ["nwp_gal9"],
- "resolution": "C12",
- "ancil_resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12"],
+ "resolution": "C12_MG",
"DT": 1800,
"tsteps": 12,
"mpi_parts": 6,
@@ -21,7 +20,7 @@
{% do task_dict.update({
"opt_confs": ["runge-kutta"],
"resolution": "C12",
- "ancil_resolution": "C12",
+ "DT": 1,
"tsteps": 20,
}) %}
@@ -61,181 +60,226 @@
"mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "tlm_forecast_tl_default-C12" %}
+{% elif task_ns.conf_name == "tlm_forecast_tl_nwp_gal9-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_forecast_tl",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
"DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "id_tlm_tests_default-C12" %}
+{% elif task_ns.conf_name == "id_tlm_tests_nwp_gal9-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_id_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "id_tlm_tests_default-1PE-C12" %}
+{% elif task_ns.conf_name == "id_tlm_tests_nwp_gal9-1PE-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_id_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 1,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-1PE-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-1PE-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 1,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-4OMP-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-4OMP-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
"threads": 4,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-1PE-4OMP-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-real_increment-4OMP-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver", "real_increment"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
+ "tsteps": 13,
+ "mpi_parts": 6,
+ "threads": 4,
+ }) %}
+
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-1PE-4OMP-C12_MG" %}
+
+ {% do task_dict.update({
+ "app_name": "jedi_tlm_tests",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_MG",
+ "ancil_resolution": "C12",
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 1,
"threads": 4,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-dry-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-dry-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default", "dry"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver", "dry"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-dry-1PE-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-dry-1PE-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default", "dry"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver", "dry"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 1,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-dry-4OMP-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-dry-4OMP-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default", "dry"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver", "dry"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
"threads": 4,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-dry-1PE-4OMP-C12" %}
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-dry-1PE-4OMP-C12_MG" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default", "dry"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver", "dry"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 1,
"threads": 4,
}) %}
-
-{% elif task_ns.conf_name == "tlm_tests_default-relaxed_solver-C12" %}
+{% elif task_ns.conf_name == "tlm_forecast_tl_nwp_gal9-C12_op" %}
{% do task_dict.update({
- "app_name": "jedi_tlm_tests",
- "opt_confs": ["default", "relaxed_solver"],
- "resolution": "C12",
+ "app_name": "jedi_tlm_forecast_tl",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_op",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-relaxed_solver-1PE-C12" %}
+
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-C12_op" %}
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default", "relaxed_solver"],
- "resolution": "C12",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C12_op",
"ancil_resolution": "C12",
- "DT": 3600,
+ "DT": 1800,
"tsteps": 13,
- "mpi_parts": 1,
+ "mpi_parts": 6,
}) %}
-{% elif task_ns.conf_name == "tlm_forecast_tl_default-C12_op" %}
+
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-strict_solver-4OMP-C12_MG" %}
+
{% do task_dict.update({
- "app_name": "jedi_tlm_forecast_tl",
- "opt_confs": ["default"],
- "resolution": "C12_op",
+ "app_name": "jedi_tlm_tests",
+ "opt_confs": ["nwp_gal9_c12", "rrt_equals_dt", "strict_solver"],
+ "resolution": "C12_MG",
"ancil_resolution": "C12",
"DT": 1800,
"tsteps": 13,
"mpi_parts": 6,
+ "threads": 4,
+ }) %}
+
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-4OMP-C224_MG" %}
+
+ {% do task_dict.update({
+ "app_name": "jedi_tlm_tests",
+ "opt_confs": ["nwp_gal9_c224", "rrt_equals_dt", "semi_strict_solver"],
+ "resolution": "C224_MG",
+ "ancil_resolution": "C224",
+ "DT": 1800,
+ "tsteps": 13,
+ "mpi_parts": 1176,
+ "threads": 4,
}) %}
-{% elif task_ns.conf_name == "tlm_tests_default-C12_op" %}
+
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-real_increment-4OMP-C224_MG" %}
+
{% do task_dict.update({
"app_name": "jedi_tlm_tests",
- "opt_confs": ["default"],
- "resolution": "C12_op",
- "ancil_resolution": "C12",
- "DT": 3600,
+ "opt_confs": ["nwp_gal9_c224", "rrt_equals_dt", "real_increment", "semi_strict_solver"],
+ "resolution": "C224_MG",
+ "ancil_resolution": "C224",
+ "DT": 1800,
"tsteps": 13,
- "mpi_parts": 6,
+ "mpi_parts": 1176,
+ "threads": 4,
+ }) %}
+
+{% elif task_ns.conf_name == "tlm_tests_nwp_gal9-strict_solver-4OMP-C224_MG" %}
+
+ {% do task_dict.update({
+ "app_name": "jedi_tlm_tests",
+ "opt_confs": ["nwp_gal9_c224", "rrt_equals_dt", "strict_solver"],
+ "resolution": "C224_MG",
+ "ancil_resolution": "C224",
+ "DT": 1800,
+ "tsteps": 13,
+ "mpi_parts": 1176,
+ "threads": 4,
}) %}
{% elif task_ns.conf_name == "integration_tests" %}
@@ -262,19 +306,22 @@
{# List of configuration names that have no kgo #}
{% set no_kgo = [
- "id_tlm_tests_default-C12",
- "id_tlm_tests_default-1PE-C12",
- "tlm_tests_default-C12",
- "tlm_tests_default-C12_op",
- "tlm_tests_default-1PE-C12",
- "tlm_tests_default-4OMP-C12",
- "tlm_tests_default-1PE-4OMP-C12",
- "tlm_tests_default-dry-C12",
- "tlm_tests_default-dry-4OMP-C12",
- "tlm_tests_default-dry-1PE-C12",
- "tlm_tests_default-dry-1PE-4OMP-C12",
- "tlm_tests_default-relaxed_solver-C12",
- "tlm_tests_default-relaxed_solver-1PE-C12"
+ "id_tlm_tests_nwp_gal9-C12_MG",
+ "id_tlm_tests_nwp_gal9-1PE-C12_MG",
+ "tlm_tests_nwp_gal9-C12_MG",
+ "tlm_tests_nwp_gal9-C12_op",
+ "tlm_tests_nwp_gal9-1PE-C12_MG",
+ "tlm_tests_nwp_gal9-4OMP-C12_MG",
+ "tlm_tests_nwp_gal9-real_increment-4OMP-C12_MG",
+ "tlm_tests_nwp_gal9-1PE-4OMP-C12_MG",
+ "tlm_tests_nwp_gal9-dry-C12_MG",
+ "tlm_tests_nwp_gal9-dry-4OMP-C12_MG",
+ "tlm_tests_nwp_gal9-dry-1PE-C12_MG",
+ "tlm_tests_nwp_gal9-dry-1PE-4OMP-C12_MG",
+ "tlm_tests_nwp_gal9-strict_solver-4OMP-C12_MG",
+ "tlm_tests_nwp_gal9-4OMP-C224_MG",
+ "tlm_tests_nwp_gal9-real_increment-4OMP-C224_MG",
+ "tlm_tests_nwp_gal9-strict_solver-4OMP-C224_MG"
] %}
{% if task_ns.conf_name not in no_kgo %}
diff --git a/rose-stem/site/common/lfric_atm/tasks_lfric_atm.cylc b/rose-stem/site/common/lfric_atm/tasks_lfric_atm.cylc
index d24f3d96..f051d49f 100644
--- a/rose-stem/site/common/lfric_atm/tasks_lfric_atm.cylc
+++ b/rose-stem/site/common/lfric_atm/tasks_lfric_atm.cylc
@@ -245,6 +245,19 @@
"log_level": "error",
}) %}
+{% elif task_ns.conf_name == "nwp_gal9_ls_and_jedi-C224_MG" %}
+
+ {% do task_dict.update({
+ "opt_confs": ["um_dump","ls_and_jedi","june_case"],
+ "resolution": "C224_MG",
+ "DT": 720,
+ "tsteps": 35,
+ "mpi_parts": 1176,
+ "wallclock": 10,
+ "xios_nodes": 4,
+ "mpi_parts_xios" : 16,
+ }) %}
+
{% elif task_ns.conf_name == "nwp_gal9-C896_MG" %}
{% do task_dict.update({
diff --git a/rose-stem/site/meto/groups/groups_jedi_lfric_tests.cylc b/rose-stem/site/meto/groups/groups_jedi_lfric_tests.cylc
index c5dbac60..d987b461 100644
--- a/rose-stem/site/meto/groups/groups_jedi_lfric_tests.cylc
+++ b/rose-stem/site/meto/groups/groups_jedi_lfric_tests.cylc
@@ -8,7 +8,7 @@
{# Azspice Groups #}
{% do site_groups.update({
"jedi_lfric_tests_azspice_developer": [
- "jedi_lfric_tests_nwp_gal9-C12_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit",
"jedi_lfric_tests_runge-kutta-C12_azspice_gnu_fast-debug-64bit",
"jedi_lfric_tests_runge-kutta-C12_azspice_gnu_full-debug-64bit",
"jedi_lfric_tests_forecast_gh-si-for-linear-C12_azspice_gnu_fast-debug-64bit",
@@ -16,24 +16,24 @@
"jedi_lfric_tests_forecast_pseudo_default-C12_azspice_gnu_fast-debug-64bit",
"jedi_lfric_tests_forecast_pseudo_pseudomodel-C12_azspice_gnu_fast-debug-64bit",
"jedi_lfric_tests_forecast_pseudo_pseudomodel-C12_azspice_gnu_full-debug-64bit",
- "jedi_lfric_tests_tlm_forecast_tl_default-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_id_tlm_tests_default-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_id_tlm_tests_default-1PE-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-1PE-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-4OMP-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-1PE-4OMP-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-1PE-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-4OMP-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-1PE-4OMP-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-relaxed_solver-C12_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-relaxed_solver-1PE-C12_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_id_tlm_tests_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_id_tlm_tests_nwp_gal9-1PE-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-1PE-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-4OMP-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-real_increment-4OMP-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-1PE-4OMP-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-1PE-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-4OMP-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-1PE-4OMP-C12_MG_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-strict_solver-4OMP-C12_MG_azspice_gnu_fast-debug-64bit-rsolver64",
"jedi_lfric_tests_azspice_integration_tests",
],
"jedi_lfric_tests_op_azspice_developer": [
- "jedi_lfric_tests_tlm_forecast_tl_default-C12_op_azspice_gnu_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-C12_op_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_op_azspice_gnu_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-C12_op_azspice_gnu_fast-debug-64bit",
],
"jedi_lfric_tests_azspice": [
"jedi_lfric_tests_azspice_developer",
@@ -44,6 +44,7 @@
],
"jedi_lfric_tests_azspice_build": [
"build_jedi_lfric_tests_azspice_gnu_fast-debug-64bit",
+ "build_jedi_lfric_tests_azspice_gnu_fast-debug-64bit-rsolver64",
"build_jedi_lfric_tests_azspice_gnu_full-debug-64bit",
],
}) %}
@@ -52,29 +53,32 @@
{# EX1A Groups #}
{% do site_groups.update({
"jedi_lfric_tests_ex1a_developer": [
- "jedi_lfric_tests_nwp_gal9-C12_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit",
"jedi_lfric_tests_runge-kutta-C12_ex1a_cce_fast-debug-64bit",
"jedi_lfric_tests_forecast_gh-si-for-linear-C12_ex1a_cce_fast-debug-64bit",
"jedi_lfric_tests_forecast_pseudo_default-C12_ex1a_cce_fast-debug-64bit",
"jedi_lfric_tests_forecast_pseudo_pseudomodel-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_forecast_tl_default-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_id_tlm_tests_default-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_id_tlm_tests_default-1PE-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-1PE-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-4OMP-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-1PE-4OMP-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-1PE-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-4OMP-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-dry-1PE-4OMP-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-relaxed_solver-C12_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-relaxed_solver-1PE-C12_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_id_tlm_tests_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_id_tlm_tests_nwp_gal9-1PE-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-1PE-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-4OMP-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-real_increment-4OMP-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-1PE-4OMP-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-1PE-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-4OMP-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-dry-1PE-4OMP-C12_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-strict_solver-4OMP-C12_MG_ex1a_cce_fast-debug-64bit-rsolver64",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-4OMP-C224_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-real_increment-4OMP-C224_MG_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-strict_solver-4OMP-C224_MG_ex1a_cce_fast-debug-64bit-rsolver64",
"jedi_lfric_tests_ex1a_integration_tests",
],
"jedi_lfric_tests_op_ex1a_developer": [
- "jedi_lfric_tests_tlm_forecast_tl_default-C12_op_ex1a_cce_fast-debug-64bit",
- "jedi_lfric_tests_tlm_tests_default-C12_op_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_forecast_tl_nwp_gal9-C12_op_ex1a_cce_fast-debug-64bit",
+ "jedi_lfric_tests_tlm_tests_nwp_gal9-C12_op_ex1a_cce_fast-debug-64bit",
],
"jedi_lfric_tests_ex1a": [
"jedi_lfric_tests_ex1a_developer",
@@ -85,6 +89,7 @@
],
"jedi_lfric_tests_ex1a_build": [
"build_jedi_lfric_tests_ex1a_cce_fast-debug-64bit",
+ "build_jedi_lfric_tests_ex1a_cce_fast-debug-64bit-rsolver64",
],
}) %}
diff --git a/rose-stem/site/meto/groups/groups_lfric_atm.cylc b/rose-stem/site/meto/groups/groups_lfric_atm.cylc
index 174b5698..e44b38cd 100644
--- a/rose-stem/site/meto/groups/groups_lfric_atm.cylc
+++ b/rose-stem/site/meto/groups/groups_lfric_atm.cylc
@@ -120,6 +120,7 @@
"lfric_atm_nwp_gal9_eda-C12_ex1a_cce_fast-debug-32bit",
"lfric_atm_nwp_gal9_eda_jada-C12_ex1a_cce_fast-debug-32bit",
"lfric_atm_nwp_gal9_ls_and_jedi-C12_ex1a_cce_fast-debug-32bit",
+ "lfric_atm_nwp_gal9_ls_and_jedi-C224_MG_ex1a_cce_fast-debug-32bit",
"lfric_atm_nwp_gal9-pert-C12_ex1a_cce_fast-debug-32bit",
"lfric_atm_nwp_casim-C12_ex1a_cce_fast-debug-32bit",
"lfric_atm_nwp_coma9-C12_ex1a_cce_fast-debug-32bit",
diff --git a/science/adjoint/source/algorithm/linear_physics/atl_bdy_lyr_alg.x90 b/science/adjoint/source/algorithm/linear_physics/atl_bdy_lyr_alg.x90
new file mode 100644
index 00000000..30665009
--- /dev/null
+++ b/science/adjoint/source/algorithm/linear_physics/atl_bdy_lyr_alg.x90
@@ -0,0 +1,143 @@
+!-----------------------------------------------------------------------------
+! (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 (Adjoint of) given TL state(igh_u) compute TLM boundary layer increment u_bl_inc
+module atl_bdy_lyr_alg_mod
+
+ use constants_mod, only: r_def
+ use field_collection_mod, only: field_collection_type
+ use integer_field_mod, only: integer_field_type
+ use driver_modeldb_mod, only: modeldb_type
+ use sci_geometric_constants_mod, only: get_height_fe, &
+ get_face_selector_ew, &
+ get_face_selector_ns
+ use sci_fem_constants_mod, only: get_rmultiplicity_fe
+ use field_mod, only: field_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
+ use derived_config_mod, only: bundle_size
+ use field_indices_mod, only: igh_d
+ use timing_mod, only: start_timing, stop_timing, tik, LPROF
+ use mesh_mod, only: mesh_type
+ use fs_continuity_mod, only: W2, W3, Wtheta
+ use tl_compute_qe_kernel_mod, only: tl_compute_qe_kernel_type
+ use tl_compute_aubu_kernel_mod, only: tl_compute_aubu_kernel_type
+ use atl_bl_inc_kernel_mod, only: atl_bl_inc_kernel_type
+
+ implicit none
+
+ private
+ public :: atl_bdy_lyr_alg
+
+contains
+
+!> @brief (Adjoint of) given TL state(igh_u) compute TLM boundary layer increment u_bl_inc
+!> @details The stages are:
+!> 1. Call tl_compute_qe_kernel_type: from LS, compute coefficients Q, E
+!> 2. Call tl_compute_aubu_kernel_type: from Q,E, compute coefficients Auv, Buv_inv
+!> 3. Call atl_bl_inc_kernel_type: (adjoint of) from state(igh_u) use coefficients Auv, Buv_inv to compute u_bl_inc
+!> The TLM BL scheme is described in Var Scientific Documentation Paper 55,
+!> https://wwwspice/~frva/VAR/view/var-2025.03.0/doc/VSDP55_1A.pdf
+!> The original code is at https://wwwspice/~frva/VAR/view/var-2022.12.2/doc/PF_bdy_lyr.html
+!> @param[in,out] modeldb Structure containing the model state
+!> @param[in,out] u_bl_inc TLM boundary layer increment
+!> @param[in,out] u The current TL model prognostic u field, state(igh_u)
+!> @param[in] ls_state Lin state for Prognostic model state
+!> @param[in] dt The TL model timestep length
+subroutine atl_bdy_lyr_alg(modeldb, u_bl_inc, u, ls_state, dt)
+
+ implicit none
+
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(field_type), intent(inout) :: u_bl_inc
+ type(field_type), intent(inout) :: u
+ type(field_type), target, intent(in) :: ls_state(bundle_size)
+ real(kind=r_def), intent(in) :: dt
+
+ type(mesh_type), pointer :: mesh
+ type(field_type), pointer :: height_w2
+ type(field_type), pointer :: height_w3
+ type(field_type), pointer :: height_wth
+ type(field_type), pointer :: w2_rmultiplicity
+ type(integer_field_type), pointer :: face_selector_ew
+ type(integer_field_type), pointer :: face_selector_ns
+
+ type(field_collection_type), pointer :: ls_fields
+ type(field_type), pointer :: ls_land_fraction
+
+ ! Coefficients computed from linearisation state
+ type(field_type) :: Q
+ type(field_type) :: E
+ type(field_type) :: auv
+ type(field_type) :: buv_inv
+
+ integer(kind=tik) :: id
+
+ if (LPROF) call start_timing(id, 'atl_bdy_lyr_alg')
+
+ ls_fields => modeldb%fields%get_field_collection('ls_fields')
+ call ls_fields%get_field('ls_land_fraction', ls_land_fraction)
+
+ mesh => u%get_mesh()
+ height_w2 => get_height_fe(W2, mesh%get_id())
+ height_w3 => get_height_fe(W3, mesh%get_id())
+ height_wth => get_height_fe(Wtheta, mesh%get_id())
+
+ w2_rmultiplicity => get_rmultiplicity_fe(W2, mesh%get_id())
+
+ face_selector_ew => get_face_selector_ew(mesh%get_id())
+ face_selector_ns => get_face_selector_ns(mesh%get_id())
+
+ call ls_state(igh_d)%copy_field_properties(Q)
+ call ls_state(igh_d)%copy_field_properties(E)
+ call invoke(setval_c(Q, 0.0_r_def), setval_c(E, 0.0_r_def))
+
+ call u%copy_field_properties(auv)
+ call u%copy_field_properties(buv_inv)
+ call invoke(setval_c(auv, 0.0_r_def), setval_c(buv_inv, 0.0_r_def))
+
+ call invoke(tl_compute_qe_kernel_type(Q, &
+ E, &
+ ls_state(igh_d), &
+ height_w3, &
+ height_wth, &
+ ls_land_fraction, &
+ log_layer, &
+ Blevs_m, &
+ e_folding_levs_m, &
+ u_land_m, &
+ u_sea_m, &
+ z_land_m, &
+ z_sea_m, &
+ L_0_m))
+
+ call invoke(tl_compute_aubu_kernel_type(auv, &
+ buv_inv, &
+ Q, &
+ E, &
+ height_w2, &
+ w2_rmultiplicity, &
+ dt, &
+ Blevs_m))
+
+ call invoke(atl_bl_inc_kernel_type(u_bl_inc, &
+ u, &
+ auv, &
+ buv_inv, &
+ face_selector_ew, &
+ face_selector_ns, &
+ Blevs_m))
+
+ if (LPROF) call stop_timing(id, 'atl_bdy_lyr_alg')
+
+end subroutine atl_bdy_lyr_alg
+
+end module atl_bdy_lyr_alg_mod
diff --git a/science/adjoint/source/algorithm/linear_physics/atl_physics_alg.x90 b/science/adjoint/source/algorithm/linear_physics/atl_physics_alg.x90
new file mode 100644
index 00000000..4738829c
--- /dev/null
+++ b/science/adjoint/source/algorithm/linear_physics/atl_physics_alg.x90
@@ -0,0 +1,155 @@
+!-----------------------------------------------------------------------------
+! (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 Wrapper for adjoint physics code
+module atl_physics_alg_mod
+
+ use constants_mod, only: r_def
+ use driver_modeldb_mod, only: modeldb_type
+ use field_mod, only: field_type
+ use derived_config_mod, only: bundle_size
+ use field_indices_mod, only: igh_u
+ use timing_mod, only: start_timing, stop_timing, tik, LPROF
+ use mesh_mod, only: mesh_type
+ use fs_continuity_mod, only: W2
+ use sci_geometric_constants_mod, only: get_da_at_w2
+ use sci_fem_constants_mod, only: get_mass_matrix_fe
+ use sci_enforce_bc_kernel_mod, only: enforce_bc_kernel_type
+ use adj_matrix_vector_kernel_mod, only: adj_matrix_vector_kernel_type
+ use atl_bdy_lyr_alg_mod, only: atl_bdy_lyr_alg
+ use sci_mass_matrix_solver_alg_mod, only: mass_matrix_solver_alg
+ use sci_field_bundle_builtins_mod, only: clone_bundle, copy_bundle, set_bundle_scalar
+ use operator_mod, only: operator_type
+
+ implicit none
+
+ private
+ public :: atl_physics_alg
+
+contains
+
+!> @brief Wrapper for adjoint physics code, currently just atl_bdy_lyr_alg
+!> @param[in,out] modeldb Structure containing the model state
+!> @param[in,out] u The TL model u field to be incremented
+!> @param[in,out] state_star TL model prognostic fields for physics calculations
+!> @param[in,out] rhs_phys Residuals
+!> @param[in] state The current TL model prognostic fields
+!> @param[in] rhs_n Residuals
+!> @param[in] rhs_np1 Residuals
+!> @param[in] rhs_adv Advective terms
+!> @param[in] ls_state Lin state for Prognostic model state
+!> @param[in] mesh The current mesh
+!> @param[in] dt The TL model timestep length
+subroutine atl_physics_alg(modeldb, &
+ u, &
+ state_star, &
+ rhs_phys, &
+ rhs_np1, &
+ rhs_n, &
+ state, &
+ rhs_adv, &
+ ls_state, &
+ mesh, &
+ dt)
+
+ implicit none
+
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(field_type), intent(inout) :: u
+ type(field_type), intent(inout) :: state_star(bundle_size)
+ type(field_type), intent(inout) :: rhs_phys(bundle_size)
+ type(field_type), intent(in) :: state(bundle_size)
+ type(field_type), intent(in) :: rhs_n(bundle_size)
+ type(field_type), intent(in) :: rhs_np1(bundle_size)
+ type(field_type), intent(in) :: rhs_adv(bundle_size)
+ type(field_type), intent(in) :: ls_state(bundle_size)
+ type(mesh_type), pointer, intent(in) :: mesh
+ real(kind=r_def), intent(in) :: dt
+
+ type(field_type) :: u_bl_inc
+ type(field_type) :: u_bl_inc_flux
+ type(field_type) :: du
+ type(field_type) :: u_star
+ type(field_type) :: u_star_physical
+ type(field_type) :: rhsu_np1
+
+ type(operator_type), pointer :: mm_vel
+ type(field_type), pointer :: dA
+
+ integer(kind=tik) :: id
+
+ if (LPROF) call start_timing(id, 'atl_physics_alg')
+
+ mm_vel => get_mass_matrix_fe(W2, mesh%get_id())
+
+ call u%copy_field_properties( u_bl_inc )
+ call u%copy_field_properties( u_bl_inc_flux )
+ call u%copy_field_properties( du )
+ call u%copy_field_properties( u_star )
+ call u%copy_field_properties( u_star_physical )
+ call rhs_adv(igh_u)%copy_field_properties( rhsu_np1 )
+
+ call du%initialise( rhs_adv(igh_u)%get_function_space() )
+ call rhsu_np1%initialise( rhs_adv(igh_u)%get_function_space() )
+
+ call clone_bundle( state, state_star, bundle_size )
+ call copy_bundle( state, state_star, bundle_size ) ! Only state_star(igh_u) is used
+ call set_bundle_scalar( 0.0_r_def, state_star, bundle_size )
+
+ dA => get_da_at_w2(mesh%get_id())
+
+ call invoke( setval_c( u_bl_inc_flux, 0.0_r_def ), &
+ setval_c( u_bl_inc, 0.0_r_def ), &
+ setval_c( u_star, 0.0_r_def ), &
+ setval_c( u_star_physical, 0.0_r_def ), &
+ setval_c( du, 0.0_r_def ), &
+ setval_c( rhsu_np1, 0.0_r_def ) )
+
+ call invoke( enforce_bc_kernel_type( rhs_phys(igh_u) ), &
+ adj_matrix_vector_kernel_type( rhs_phys(igh_u), u_bl_inc_flux, mm_vel ) )
+
+ call set_bundle_scalar( 0.0_r_def, rhs_phys, bundle_size )
+
+ ! Adj of u_bl_inc_flux = u_bl_inc * dA
+ call invoke( inc_x_times_y( u_bl_inc_flux, dA ), &
+ inc_x_plus_y( u_bl_inc, u_bl_inc_flux ), &
+ setval_c( u_bl_inc_flux, 0.0_r_def ) )
+
+ call atl_bdy_lyr_alg( modeldb, u_bl_inc, state_star(igh_u), &
+ ls_state, dt )
+
+ ! Adj of state_star(igh_u) <- u_star_physical
+ call invoke( inc_x_plus_y( u_star_physical, state_star(igh_u) ), &
+ setval_c( state_star(igh_u), 0.0_r_def ) )
+
+ ! Adj of u_star_physical = u_star / dA
+ call invoke( inc_x_divideby_y( u_star_physical, dA ), &
+ inc_x_plus_y( u_star, u_star_physical ), &
+ setval_c( u_star_physical, 0.0_r_def) )
+
+ ! Adj of u_star = du + state(igh_u)
+ call invoke( inc_X_plus_Y( du, u_star ), &
+ inc_X_plus_Y( state(igh_u), u_star ), &
+ setval_c( u_star, 0.0_r_def ) )
+
+ ! Adj of call mass_matrix_solver_alg(du, rhsu_np1)
+ call mass_matrix_solver_alg( rhsu_np1, du )
+
+ ! Adj of inc_X_plus_Y(rhsu_np1, rhs_adv(igh_u))
+ call invoke( inc_X_plus_Y( rhs_adv(igh_u), rhsu_np1 ) )
+
+ ! Adj of rhsu_np1 <- -rhs_np1(igh_u) + rhs_n(igh_u)
+ call invoke( inc_X_plus_bY( rhs_np1(igh_u), -1.0_r_def, rhsu_np1 ), &
+ inc_X_plus_Y( rhs_n(igh_u), rhsu_np1 ), &
+ setval_c( rhsu_np1, 0.0_r_def ) )
+
+ ! Adj of du <- 0
+ call invoke( setval_c( du, 0.0_r_def ) )
+
+ if (LPROF) call stop_timing(id, 'atl_physics_alg')
+
+end subroutine atl_physics_alg
+
+end module atl_physics_alg_mod
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 66f9894d..7172ede6 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
@@ -24,6 +24,7 @@ module atl_si_timestep_alg_mod
l_stabilise_bl, &
n_bl_levels_to_stabilise, &
max_bl_stabilisation
+ use linear_physics_config_mod, only: l_boundary_layer
use derived_config_mod, only: bundle_size
use boundaries_config_mod, only: limited_area
use sci_fem_constants_mod, only: get_mass_matrix_fe, get_qr_fe
@@ -51,6 +52,7 @@ module atl_si_timestep_alg_mod
use derive_exner_from_eos_alg_mod, only: derive_exner_from_eos
use atl_derive_exner_from_eos_alg_mod, only: atl_derive_exner_from_eos
use update_prognostic_scalars_alg_mod, only: update_prognostic_scalars_alg
+ use atl_physics_alg_mod, only: atl_physics_alg
use mr_indices_mod, only: nummr
use moist_dyn_mod, only: num_moist_factors, gas_law
use field_indices_mod, only: igh_u, igh_t, igh_d, igh_p
@@ -75,6 +77,7 @@ module atl_si_timestep_alg_mod
type(field_type), allocatable :: state2(:)
type(field_type), allocatable :: state_copy(:)
type(field_type), allocatable :: state_n(:)
+ type(field_type), allocatable :: state_star(:)
type(field_type), allocatable :: state_after_slow(:)
type(field_type), allocatable :: advected_state(:)
type(field_type), allocatable :: mr_n(:)
@@ -86,6 +89,7 @@ module atl_si_timestep_alg_mod
type(field_type), allocatable :: state_test(:)
type(field_type), allocatable :: rhs_np1_test(:)
type(field_type), allocatable :: rhs_np1_in(:)
+ type(field_type), allocatable :: rhs_phys(:)
! Linearisation state
type(field_type), allocatable :: ls_state(:)
@@ -173,6 +177,7 @@ contains
allocate(self%state_copy(bundle_size))
allocate(self%state_n(bundle_size))
allocate(self%state_after_slow(bundle_size))
+ allocate(self%state_star(bundle_size))
allocate(self%advected_state(bundle_size))
allocate(self%rhs_n(bundle_size))
allocate(self%rhs_np1(bundle_size))
@@ -183,6 +188,7 @@ contains
allocate(self%state_test(bundle_size))
allocate(self%rhs_np1_test(bundle_size))
allocate(self%rhs_np1_in(bundle_size))
+ allocate(self%rhs_phys(bundle_size))
allocate(self%ls_state(bundle_size))
allocate(self%ls_state_n(bundle_size))
@@ -225,6 +231,7 @@ contains
call clone_bundle( self%state, self%state_test, bundle_size )
call clone_bundle( self%state, self%rhs_np1_test, bundle_size )
call clone_bundle( self%state, self%rhs_np1_in, bundle_size )
+ call clone_bundle( self%state, self%rhs_phys, bundle_size )
call clone_bundle( self%state, self%ls_state, bundle_size )
call clone_bundle( self%state, self%ls_state_n, bundle_size )
@@ -555,6 +562,7 @@ contains
call set_bundle_scalar( 0.0_r_def, self%state_initial, bundle_size )
call set_bundle_scalar( 0.0_r_def, self%rhs_n, bundle_size )
call set_bundle_scalar( 0.0_r_def, self%rhs_np1, bundle_size )
+ call set_bundle_scalar( 0.0_r_def, self%rhs_phys, bundle_size )
call set_bundle_scalar( 0.0_r_def, self%mr_after_slow, nummr )
call set_bundle_scalar( 0.0_r_def, self%mr_n, nummr )
@@ -644,32 +652,73 @@ contains
setval_c( self%rhs_np1(igh_t), 0.0_r_def ) )
end if
+ if (l_boundary_layer) call add_bundle(self%rhs_phys,self%rhs_np1,self%rhs_phys, bundle_size)
call add_bundle( self%rhs_adv, self%rhs_np1, self%rhs_adv, bundle_size )
call add_bundle( self%rhs_n, self%rhs_np1, self%rhs_n, bundle_size )
call bundle_ax( -1.0_r_def, self%rhs_np1, self%rhs_np1, bundle_size )
- call set_bundle_scalar( 0.0_r_def,self%state1,bundle_size )
- call set_bundle_scalar( 0.0_r_def,self%state2,bundle_size )
+ if (inner > 1) then
+
+ if (use_wavedynamics) then
+
+ call set_bundle_scalar( 0.0_r_def, self%state1, bundle_size )
+ call set_bundle_scalar( 0.0_r_def, self%state2, bundle_size )
+
+ call atl_rhs_alg( self%rhs_np1, &
+ -varalpha*cast_dt, &
+ self%state1, &
+ self%state2, &
+ moist_dyn, &
+ self%ls_state_itns(:,ls_outer,ls_inner), &
+ self%ls_moist_dyn_itns(:,ls_outer,ls_inner), &
+ .true., &
+ dlayer_on, &
+ modeldb%clock )
- call atl_rhs_alg( self%rhs_np1, &
- -varalpha*cast_dt, &
- self%state1, &
- self%state2, &
- moist_dyn, &
- self%ls_state_itns(:,ls_outer,ls_inner), &
- self%ls_moist_dyn_itns(:,ls_outer,ls_inner), &
- .true., &
- dlayer_on, &
- modeldb%clock )
+ call add_bundle( self%state, self%state2, self%state, bundle_size )
+ call add_bundle( self%state, self%state1, self%state, bundle_size )
- call add_bundle( self%state,self%state2 ,self%state, bundle_size )
- call add_bundle( self%state,self%state1 ,self%state, bundle_size )
+ end if
+
+ end if
end do inner_dynamics_loop
!-------------------------------------------------------------------------
! End of inner (nonlinear, Coriolis) loop
!-------------------------------------------------------------------------
+ if (l_boundary_layer) then
+ ! Linear boundary layer scheme is currently the only linear physics scheme
+ call atl_physics_alg( modeldb, &
+ u, &
+ self%state_star, &
+ self%rhs_phys, &
+ self%rhs_np1, &
+ self%rhs_n, &
+ self%state, &
+ self%rhs_adv, &
+ self%ls_state_itns(:,ls_outer,1), &
+ mesh, &
+ cast_dt )
+ end if ! l_boundary_layer
+
+ call set_bundle_scalar( 0.0_r_def, self%state1, bundle_size )
+ call set_bundle_scalar( 0.0_r_def, self%state2, bundle_size )
+
+ call atl_rhs_alg( self%rhs_np1, &
+ -varalpha*cast_dt, &
+ self%state1, &
+ self%state2, &
+ moist_dyn, &
+ self%ls_state_itns(:,ls_outer,1), &
+ self%ls_moist_dyn_itns(:,ls_outer,1), &
+ .true., &
+ dlayer_on, &
+ modeldb%clock )
+
+ call add_bundle( self%state, self%state2, self%state, bundle_size )
+ call add_bundle( self%state, self%state1, self%state, bundle_size )
+
call invoke( setval_c( self%theta_fv_inc, 0.0_r_def ), &
adj_dg_inc_matrix_vector_kernel_type( self%rhs_adv(igh_t), &
self%theta_fv_inc, mm_wt ), &
@@ -759,6 +808,7 @@ contains
if (allocated(self%state_n)) deallocate(self%state_n)
if (allocated(self%state_initial)) deallocate(self%state_initial)
if (allocated(self%state_after_slow)) deallocate(self%state_after_slow)
+ if (allocated(self%state_star)) deallocate(self%state_star)
if (allocated(self%advected_state)) deallocate(self%advected_state)
if (allocated(self%rhs_n)) deallocate(self%rhs_n)
if (allocated(self%rhs_np1)) deallocate(self%rhs_np1)
@@ -769,6 +819,7 @@ contains
if (allocated(self%state_test)) deallocate(self%state_test)
if (allocated(self%rhs_np1_test)) deallocate(self%rhs_np1_test)
if (allocated(self%rhs_np1_in)) deallocate(self%rhs_np1_in)
+ if (allocated(self%rhs_phys)) deallocate(self%rhs_phys)
if (allocated(self%ls_state)) deallocate(self%ls_state)
if (allocated(self%ls_state_itns)) deallocate(self%ls_state_itns)
diff --git a/science/adjoint/source/kernel/linear_physics/atl_bl_inc_kernel_mod.F90 b/science/adjoint/source/kernel/linear_physics/atl_bl_inc_kernel_mod.F90
new file mode 100644
index 00000000..4685f594
--- /dev/null
+++ b/science/adjoint/source/kernel/linear_physics/atl_bl_inc_kernel_mod.F90
@@ -0,0 +1,194 @@
+!-----------------------------------------------------------------------------
+! (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 used.
+!-----------------------------------------------------------------------------
+!> @brief (Adjoint of) computes u_inc, the change in TLM velocity due to TLM boundary layer processes.
+module atl_bl_inc_kernel_mod
+
+ use argument_mod, only : arg_type, &
+ GH_FIELD, GH_OPERATOR, &
+ GH_SCALAR, GH_INTEGER, &
+ GH_READ, GH_INC, &
+ GH_REAL, CELL_COLUMN, &
+ ANY_DISCONTINUOUS_SPACE_1
+ use constants_mod, only : r_def, i_def, r_um
+ use fs_continuity_mod, only : W1, W2, W3
+ use kernel_mod, only : kernel_type
+ use reference_element_mod, only : N
+
+ implicit none
+
+ private
+
+ !---------------------------------------------------------------------------
+ ! Public types
+ !---------------------------------------------------------------------------
+
+ type, public, extends(kernel_type) :: atl_bl_inc_kernel_type
+ private
+ type(arg_type) :: meta_args(7) = (/ &
+ arg_type(GH_FIELD, GH_REAL, GH_INC, W2), & ! u_inc
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! u
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! Auv
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! Buv_inv
+ arg_type(GH_FIELD, GH_INTEGER, GH_READ, ANY_DISCONTINUOUS_SPACE_1), & ! face_selector_ew
+ arg_type(GH_FIELD, GH_INTEGER, GH_READ, ANY_DISCONTINUOUS_SPACE_1), & ! face_selector_ew
+ arg_type(GH_SCALAR, GH_INTEGER, GH_READ) & ! Blevs_m
+ /)
+ integer :: operates_on = CELL_COLUMN
+ contains
+ procedure, nopass :: atl_bl_inc_code
+ end type
+
+ !---------------------------------------------------------------------------
+ ! Contained functions/subroutines
+ !---------------------------------------------------------------------------
+ public :: atl_bl_inc_code
+
+contains
+
+!> @brief (Adjoint of) computes u_inc, the change in TLM velocity due to TLM boundary layer processes.
+!> @details The algorithm uses coefficients Auv and Buv_inv computed in tl_compute_aubu_kernel_mod.
+!> The TLM BL scheme is described in Var Scientific Documentation Paper 55,
+!> https://wwwspice/~frva/VAR/view/var-2025.03.0/doc/VSDP55_1A.pdf
+!! @param[in] nlayers Number of layers
+!! @param[in,out] u_inc Change in TLM velocity due to TLM boundary layer processes
+!! @param[in] u TLM velocity
+!! @param[in] nlayers Number of layers
+!! @param[in] Auv Coefficient for TLM boundary layer
+!! @param[in] Buv_inv Inverse of coefficient for TLM boundary layer
+!! @param[in] face_selector_ew 2D field indicating which W/E faces to loop over in this column
+!! @param[in] face_selector_ns 2D field indicating which N/S faces to loop over in this column
+!! @param[in] Blevs_m Number of levels in momentum boundary layer
+!! @param[in] ndf_w2 Number of degrees of freedom per cell for w2 space
+!! @param[in] undf_w2 Number of unique degrees of freedom for w2 space
+!! @param[in] map_w2 Dofmap for the cell at the base of the column for w2
+!! @param[in] ndf_w3_2d Number of DoFs for 2D W3 per cell
+!! @param[in] undf_w3_2d Number of DoFs for this partition for 2D W3
+!! @param[in] map_w3_2d Map for 2D W3
+subroutine atl_bl_inc_code( nlayers, &
+ u_inc, &
+ u, &
+ Auv, &
+ Buv_inv, &
+ face_selector_ew, &
+ face_selector_ns, &
+ Blevs_m, &
+ ndf_w2, undf_w2, map_w2, &
+ ndf_w3_2d, undf_w3_2d, map_w3_2d )
+
+ implicit none
+
+ ! Arguments
+ integer(kind=i_def), intent(in) :: nlayers
+ integer(kind=i_def), intent(in) :: undf_w2
+ real(kind=r_def), dimension(undf_w2), intent(inout) :: u_inc
+ real(kind=r_def), dimension(undf_w2), intent(inout) :: u
+ integer(kind=i_def), intent(in) :: ndf_w2
+ integer(kind=i_def), dimension(ndf_w2), intent(in) :: map_w2
+ real(kind=r_def), dimension(undf_w2), intent(in) :: auv
+ real(kind=r_def), dimension(undf_w2), intent(in) :: buv_inv
+ integer(kind=i_def), intent(in) :: ndf_w3_2d
+ integer(kind=i_def), intent(in) :: undf_w3_2d
+ integer(kind=i_def), dimension(ndf_w3_2d), intent(in) :: map_w3_2d
+ integer(kind=i_def), dimension(undf_w3_2d), intent(in) :: face_selector_ew
+ integer(kind=i_def), dimension(undf_w3_2d), intent(in) :: face_selector_ns
+ integer(kind=i_def), intent(in) :: blevs_m
+
+ ! Internal variables
+ integer(kind=i_def) :: df
+ integer(kind=i_def) :: k
+ integer(kind=i_def) :: j
+ real(kind=r_def), dimension(blevs_m) :: a0 ! Coefficient
+ real(kind=r_def), dimension(blevs_m) :: a1 ! Coefficient
+ real(kind=r_def), dimension(blevs_m) :: a2 ! Coefficient
+ real(kind=r_def), dimension(blevs_m) :: u_rhs ! Local perturbation velocity variable
+ real(kind=r_def), dimension(blevs_m) :: u_out ! Local perturbation velocity variable
+ real(kind=r_def), dimension(blevs_m) :: factor_u
+ integer :: idx
+ integer :: idx_1
+
+ do j = face_selector_ew(map_w3_2d(1)) + face_selector_ns(map_w3_2d(1)), 1, -1
+
+ df = j
+ if (j == 3 .and. face_selector_ns(map_w3_2d(1)) == 2 .and. face_selector_ew(map_w3_2d(1)) == 1) df = n
+
+ u_out = 0.0_r_def
+ u_rhs = 0.0_r_def
+ a0(:) = 0.0_r_def
+ a1(:) = 0.0_r_def
+ a2(:) = 0.0_r_def
+ factor_u(:) = 0.0_r_def
+
+ ! Set up coeffs a0, a1, a2, u_rhs
+ a0(1) = 1.0_r_def + (Auv(map_w2(df) + 1) + Auv(map_w2(df) + 0)) / Buv_inv(map_w2(df) + 1)
+ a1(1) = -Auv(map_w2(df) + 1) / Buv_inv(map_w2(df) + 1)
+
+ do k = 2, BLevs_m - 1
+ a0(k) = 1.0_r_def + (Auv(map_w2(df) + k) + Auv(map_w2(df) + k - 1)) / Buv_inv(map_w2(df) + k)
+ a2(k) = -Auv(map_w2(df) + k - 1) / Buv_inv(map_w2(df) + k)
+ a1(k) = -Auv(map_w2(df) + k) / Buv_inv(map_w2(df) + k)
+ end do
+
+ a0(BLevs_m) = 1.0_r_def + Auv(map_w2(df) + BLevs_m - 1) / Buv_inv(map_w2(df) + BLevs_m)
+ a2(BLevs_m) = -Auv(map_w2(df) + BLevs_m - 1) / Buv_inv(map_w2(df) + BLevs_m)
+
+ a0(1) = 1.0_r_def / a0(1)
+
+ do k = 2, BLevs_m
+ factor_u(k) = a2(k) * a0(k - 1)
+ a0(k) = 1.0_r_def / (a0(k) - factor_u(k) * a1(k - 1))
+ end do
+
+ ! (Adjoint of) solve for u_inc and transform to upper triangular form
+ do k = 1, blevs_m - 1
+ u_out(k) = u_out(k) + u_inc(map_w2(df) + k - 1)
+ u_inc(map_w2(df) + k - 1) = 0.0_r_def
+
+ u_out(k + 1) = u_out(k + 1) + (-a0(k) * a1(k) * u_out(k))
+ u_rhs(k) = u_rhs(k) + a0(k) * u_out(k)
+ u_out(k) = 0.0_r_def
+ end do
+
+ u_out(blevs_m) = u_out(blevs_m) + u_inc(map_w2(df) + blevs_m - 1)
+ u_inc(map_w2(df) + blevs_m - 1) = 0.0_r_def
+
+ u_rhs(blevs_m) = u_rhs(blevs_m) + a0(blevs_m) * u_out(blevs_m)
+ u_out(blevs_m) = 0.0_r_def
+
+ do k = blevs_m, 2, -1
+ u_rhs(k - 1) = u_rhs(k - 1) + (-factor_u(k) * u_rhs(k))
+ end do
+
+ u(blevs_m + map_w2(df) - 2) = u(blevs_m + map_w2(df) - 2) + &
+ auv(blevs_m + map_w2(df) - 1) * u_rhs(blevs_m) / buv_inv(blevs_m + map_w2(df))
+ u(blevs_m + map_w2(df) - 1) = u(blevs_m + map_w2(df) - 1) - &
+ auv(blevs_m + map_w2(df) - 1) * u_rhs(blevs_m) / buv_inv(blevs_m + map_w2(df))
+ u_rhs(blevs_m) = 0.0_r_def
+
+ do k = blevs_m - 1, 2, -1
+ u(k + map_w2(df)) = u(k + map_w2(df)) + auv(k + map_w2(df)) * u_rhs(k) / buv_inv(k + map_w2(df))
+ u(k + map_w2(df) - 1) = u(k + map_w2(df) - 1) - auv(k + map_w2(df)) * u_rhs(k) / buv_inv(k + map_w2(df))
+ u(k + map_w2(df) - 2) = u(k + map_w2(df) - 2) + auv(k + map_w2(df) - 1) * u_rhs(k) / buv_inv(k + map_w2(df))
+ u(k + map_w2(df) - 1) = u(k + map_w2(df) - 1) - auv(k + map_w2(df) - 1) * u_rhs(k) / buv_inv(k + map_w2(df))
+ u_rhs(k) = 0.0_r_def
+ end do
+
+ u(map_w2(df) + 1) = u(map_w2(df) + 1) + auv(map_w2(df) + 1) * u_rhs(1) / buv_inv(map_w2(df) + 1)
+ u(map_w2(df)) = u(map_w2(df)) - auv(map_w2(df) + 1) * u_rhs(1) / buv_inv(map_w2(df) + 1)
+ u(map_w2(df)) = u(map_w2(df)) - auv(map_w2(df)) * u_rhs(1) / buv_inv(map_w2(df) + 1)
+ u_rhs(1) = 0.0_r_def
+
+ do idx_1 = blevs_m, 1, -1
+ u_out(idx_1) = 0.0_r_def
+ end do
+ do idx = blevs_m, 1, -1
+ u_rhs(idx) = 0.0_r_def
+ end do
+
+ end do
+
+end subroutine atl_bl_inc_code
+
+end module atl_bl_inc_kernel_mod
diff --git a/science/linear/integration-test/tl_test/tl_test_driver_mod.f90 b/science/linear/integration-test/tl_test/tl_test_driver_mod.f90
index b93d850d..efdec0b8 100644
--- a/science/linear/integration-test/tl_test/tl_test_driver_mod.f90
+++ b/science/linear/integration-test/tl_test/tl_test_driver_mod.f90
@@ -142,7 +142,7 @@ subroutine initialise( program_name, modeldb, calendar )
aerosol_twod_mesh )
! Instantiate the linearisation state
- call linear_create_ls( modeldb, mesh )
+ call linear_create_ls( modeldb, mesh, twod_mesh )
! Initialise the fields stored in the model_data prognostics. This needs
! to be done before initialise_model.
diff --git a/science/linear/rose-meta/lfric-linear/HEAD/rose-meta.conf b/science/linear/rose-meta/lfric-linear/HEAD/rose-meta.conf
index 98a373e4..30ec1a9c 100644
--- a/science/linear/rose-meta/lfric-linear/HEAD/rose-meta.conf
+++ b/science/linear/rose-meta/lfric-linear/HEAD/rose-meta.conf
@@ -69,6 +69,110 @@ value-titles=analytic,
=zero
values='analytic', 'random', 'file', 'zero'
+[namelist:linear_physics]
+compulsory=true
+description=Settings for TLM physics schemes.
+ns=namelist/Linear/Physics
+sort-key=Section-A07
+title=Linear Physics
+
+[namelist:linear_physics=blevs_m]
+compulsory=true
+description=Number of momentum boundary layer levels in TLM boundary layer scheme.
+fail-if=this < 1 ;
+help=Determines levels from surface upwards over which tl_bdy_lyr_alg is applied.
+!kind=default
+ns=namelist/Linear/Physics
+range=1:
+type=integer
+
+[namelist:linear_physics=e_folding_levs_m]
+compulsory=true
+description=e-folding level in TLM boundary layer scheme.
+fail-if=this < 1 ;
+help=Number of e-folding levels in exchange coefficient for momentum.
+!kind=default
+ns=namelist/Linear/Physics
+range=1:
+type=integer
+
+[namelist:linear_physics=l_0_m]
+compulsory=true
+description=Height parameter for TLM boundary layer scheme.
+fail-if=this < 0.0
+help=Mixing length for momentum.
+!kind=default
+ns=namelist/Linear/Physics
+range=0.0:
+type=real
+
+[namelist:linear_physics=l_boundary_layer]
+compulsory=true
+description=Logical switch for TLM boundary layer scheme.
+help=If true then turn on boundary layer in linear model and adjoint.
+!kind=default
+ns=namelist/Linear/Physics
+sort-key=Panel-A00
+trigger=namelist:linear_physics=blevs_m: .true. ;
+ =namelist:linear_physics=l_0_m: .true. ;
+ =namelist:linear_physics=e_folding_levs_m: .true. ;
+ =namelist:linear_physics=log_layer: .true. ;
+ =namelist:linear_physics=u_land_m: .true. ;
+ =namelist:linear_physics=u_sea_m: .true. ;
+ =namelist:linear_physics=z_land_m: .true. ;
+ =namelist:linear_physics=z_sea_m: .true. ;
+type=logical
+
+[namelist:linear_physics=log_layer]
+compulsory=true
+description=Number of levels in log layer in TLM boundary layer scheme.
+fail-if=this < 1 ;
+help=Number of levels in log layer in TLM boundary layer scheme.
+!kind=default
+ns=namelist/Linear/Physics
+range=1:
+type=integer
+
+[namelist:linear_physics=u_land_m]
+compulsory=true
+description=Land friction velocity in TLM boundary layer scheme.
+fail-if=this < 0.0
+help=Friction velocity for momentum over land.
+!kind=default
+ns=namelist/Linear/Physics
+range=0.0:
+type=real
+
+[namelist:linear_physics=u_sea_m]
+compulsory=true
+description=Sea friction velocity in TLM boundary layer scheme.
+fail-if=this < 0.0
+help=Friction velocity for momentum over sea.
+!kind=default
+ns=namelist/Linear/Physics
+range=0.0:
+type=real
+
+[namelist:linear_physics=z_land_m]
+compulsory=true
+description=Friction height over land in TLM boundary layer scheme.
+fail-if=this < 0.0
+help=Effective roughness length for momentum over land.
+!kind=default
+ns=namelist/Linear/Physics
+range=0.0:
+type=real
+
+[namelist:linear_physics=z_sea_m]
+compulsory=true
+description=Friction height over sea in TLM boundary layer scheme.
+fail-if=this < 0.0
+help=Effective roughness length for momentum over sea.
+!kind=default
+ns=namelist/Linear/Physics
+range=0.0:
+type=real
+
[namelist:validity_test]
compulsory=true
description=Provides settings for the tangent linear validity tests.
diff --git a/science/linear/rose-meta/lfric-linear/versions.py b/science/linear/rose-meta/lfric-linear/versions.py
index a1c80155..f3bfaa6b 100644
--- a/science/linear/rose-meta/lfric-linear/versions.py
+++ b/science/linear/rose-meta/lfric-linear/versions.py
@@ -44,7 +44,32 @@ def upgrade(self, config, meta_config=None):
# Commands From: rose-meta/lfric-lfric_atm
"""Set segmentation size for Gregory-Rowntree convection kernel"""
self.add_setting(config, ["namelist:physics", "conv_gr_segment"], "16")
+ return config, self.reports
+
+
+class vn30_t182(MacroUpgrade):
+ # Upgrade macro for #182 by Tom Hill
+ BEFORE_TAG = "vn3.0_t99"
+ AFTER_TAG = "vn3.0_t182"
+
+ def upgrade(self, config, meta_config=None):
+ """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/science/linear/source/algorithm/linear_physics/tl_bdy_lyr_alg.x90 b/science/linear/source/algorithm/linear_physics/tl_bdy_lyr_alg.x90
new file mode 100644
index 00000000..8668de57
--- /dev/null
+++ b/science/linear/source/algorithm/linear_physics/tl_bdy_lyr_alg.x90
@@ -0,0 +1,146 @@
+!-----------------------------------------------------------------------------
+! (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 Given TL state(igh_u) compute TLM boundary layer increment u_bl_inc
+module tl_bdy_lyr_alg_mod
+
+ use constants_mod, only: r_def
+ use field_collection_mod, only: field_collection_type
+ use integer_field_mod, only: integer_field_type
+ use driver_modeldb_mod, only: modeldb_type
+ use sci_geometric_constants_mod, only: get_height_fe, &
+ get_face_selector_ew, &
+ get_face_selector_ns
+ use sci_fem_constants_mod, only: get_rmultiplicity_fe
+ use field_mod, only: field_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
+ use derived_config_mod, only: bundle_size
+ use field_indices_mod, only: igh_d
+ use timing_mod, only: start_timing, stop_timing, tik, LPROF
+ use mesh_mod, only: mesh_type
+ use fs_continuity_mod, only: W2, W3, Wtheta
+ use tl_compute_qe_kernel_mod, only: tl_compute_qe_kernel_type
+ use tl_compute_aubu_kernel_mod, only: tl_compute_aubu_kernel_type
+ use tl_bl_inc_kernel_mod, only: tl_bl_inc_kernel_type
+
+ implicit none
+
+ private
+ public :: tl_bdy_lyr_alg
+
+contains
+
+!> @brief Given TL state(igh_u) compute TLM boundary layer increment u_bl_inc
+!> @details The stages are:
+!> 1. Call tl_compute_qe_kernel_type: from LS, compute coefficients Q, E
+!> 2. Call tl_compute_aubu_kernel_type: from Q,E, compute coefficients Auv, Buv_inv
+!> 3. Call tl_bl_inc_kernel_type: from state(igh_u) use coefficients Auv, Buv_inv to compute u_bl_inc
+!> The TLM BL scheme is described in Var Scientific Documentation Paper 55,
+!> https://wwwspice/~frva/VAR/view/var-2025.03.0/doc/VSDP55_1A.pdf
+!> The original code is at https://wwwspice/~frva/VAR/view/var-2022.12.2/doc/PF_bdy_lyr.html
+!> @param[in,out] modeldb Structure containing the model state
+!> @param[in,out] u_bl_inc TLM boundary layer increment
+!> @param[in,out] u The current TL model prognostic u field, state(igh_u)
+!> @param[in] ls_state Lin state for Prognostic model state
+!> @param[in] dt The TL model timestep length
+subroutine tl_bdy_lyr_alg(modeldb, u_bl_inc, u, ls_state, dt)
+
+ implicit none
+
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(field_type), intent(inout) :: u_bl_inc
+ type(field_type), intent(inout) :: u
+ type(field_type), target, intent(in) :: ls_state(bundle_size)
+ real(kind=r_def), intent(in) :: dt
+
+ type(mesh_type), pointer :: mesh
+ type(field_type), pointer :: height_w2
+ type(field_type), pointer :: height_w3
+ type(field_type), pointer :: height_wth
+ type(field_type), pointer :: w2_rmultiplicity
+ type(integer_field_type), pointer :: face_selector_ew
+ type(integer_field_type), pointer :: face_selector_ns
+
+ type(field_collection_type), pointer :: ls_fields
+ type(field_type), pointer :: ls_land_fraction
+
+ ! Coefficients computed from linearisation state
+ type(field_type) :: Q
+ type(field_type) :: E
+ type(field_type) :: auv
+ type(field_type) :: buv_inv
+
+ integer(kind=tik) :: id
+
+ if (LPROF) call start_timing(id, 'tl_bdy_lyr_alg')
+
+ ls_fields => modeldb%fields%get_field_collection('ls_fields')
+ call ls_fields%get_field('ls_land_fraction', ls_land_fraction)
+
+ mesh => u%get_mesh()
+ height_w2 => get_height_fe(W2, mesh%get_id())
+ height_w3 => get_height_fe(W3, mesh%get_id())
+ height_wth => get_height_fe(Wtheta, mesh%get_id())
+
+ w2_rmultiplicity => get_rmultiplicity_fe(W2, mesh%get_id())
+
+ face_selector_ew => get_face_selector_ew(mesh%get_id())
+ face_selector_ns => get_face_selector_ns(mesh%get_id())
+
+ call u%copy_field_properties(u_bl_inc)
+ call invoke(setval_c(u_bl_inc, 0.0_r_def))
+
+ call ls_state(igh_d)%copy_field_properties(Q)
+ call ls_state(igh_d)%copy_field_properties(E)
+ call invoke(setval_c(Q, 0.0_r_def), setval_c(E, 0.0_r_def))
+
+ call u%copy_field_properties(auv)
+ call u%copy_field_properties(buv_inv)
+ call invoke(setval_c(auv, 0.0_r_def), setval_c(buv_inv, 0.0_r_def))
+
+ call invoke(tl_compute_qe_kernel_type(Q, &
+ E, &
+ ls_state(igh_d), &
+ height_w3, &
+ height_wth, &
+ ls_land_fraction, &
+ log_layer, &
+ Blevs_m, &
+ e_folding_levs_m, &
+ u_land_m, &
+ u_sea_m, &
+ z_land_m, &
+ z_sea_m, &
+ L_0_m))
+
+ call invoke(tl_compute_aubu_kernel_type(auv, &
+ buv_inv, &
+ Q, &
+ E, &
+ height_w2, &
+ w2_rmultiplicity, &
+ dt, &
+ Blevs_m))
+
+ call invoke(tl_bl_inc_kernel_type(u_bl_inc, &
+ u, &
+ auv, &
+ buv_inv, &
+ face_selector_ew, &
+ face_selector_ns, &
+ Blevs_m))
+
+ if (LPROF) call stop_timing(id, 'tl_bdy_lyr_alg')
+
+end subroutine tl_bdy_lyr_alg
+
+end module tl_bdy_lyr_alg_mod
diff --git a/science/linear/source/algorithm/linear_physics/tl_physics_alg.x90 b/science/linear/source/algorithm/linear_physics/tl_physics_alg.x90
new file mode 100644
index 00000000..5289776e
--- /dev/null
+++ b/science/linear/source/algorithm/linear_physics/tl_physics_alg.x90
@@ -0,0 +1,135 @@
+!-----------------------------------------------------------------------------
+! (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 Wrapper for tangent linear physics code
+module tl_physics_alg_mod
+
+ use constants_mod, only: r_def
+ use driver_modeldb_mod, only: modeldb_type
+ use field_mod, only: field_type
+ use derived_config_mod, only: bundle_size
+ use field_indices_mod, only: igh_u
+ use timing_mod, only: start_timing, stop_timing, tik, LPROF
+ use mesh_mod, only: mesh_type
+ use fs_continuity_mod, only: W2
+ use sci_geometric_constants_mod, only: get_da_at_w2
+ use sci_fem_constants_mod, only: get_mass_matrix_fe
+ use sci_enforce_bc_kernel_mod, only: enforce_bc_kernel_type
+ use matrix_vector_kernel_mod, only: matrix_vector_kernel_type
+ use tl_bdy_lyr_alg_mod, only: tl_bdy_lyr_alg
+ use sci_mass_matrix_solver_alg_mod, only: mass_matrix_solver_alg
+ use sci_field_bundle_builtins_mod, only: clone_bundle, copy_bundle, set_bundle_scalar
+ use operator_mod, only: operator_type
+
+ implicit none
+
+ private
+ public :: tl_physics_alg
+
+contains
+
+!> @brief Wrapper for tangent linear physics code, currently just tl_bdy_lyr_alg
+!> @param[in,out] modeldb Structure containing the model state
+!> @param[in,out] u The TL model u field to be incremented
+!> @param[in,out] state_star TL model prognostic fields for physics calculations
+!> @param[in,out] rhs_phys Residuals
+!> @param[in] state The current TL model prognostic fields
+!> @param[in] rhs_n Residuals
+!> @param[in] rhs_np1 Residuals
+!> @param[in] rhs_adv Advective terms
+!> @param[in] ls_state Lin state for Prognostic model state
+!> @param[in] mesh The current mesh
+!> @param[in] dt The TL model timestep length
+subroutine tl_physics_alg(modeldb, &
+ u, &
+ state_star, &
+ rhs_phys, &
+ rhs_np1, &
+ rhs_n, &
+ state, &
+ rhs_adv, &
+ ls_state, &
+ mesh, &
+ dt)
+
+ implicit none
+
+ type(modeldb_type), target, intent(inout) :: modeldb
+ type(field_type), intent(inout) :: u
+ type(field_type), intent(inout) :: state_star(bundle_size)
+ type(field_type), intent(inout) :: rhs_phys(bundle_size)
+ type(field_type), intent(in) :: state(bundle_size)
+ type(field_type), intent(in) :: rhs_n(bundle_size)
+ type(field_type), intent(in) :: rhs_np1(bundle_size)
+ type(field_type), intent(in) :: rhs_adv(bundle_size)
+ type(field_type), intent(in) :: ls_state(bundle_size)
+ type(mesh_type), pointer, intent(in) :: mesh
+ real(kind=r_def), intent(in) :: dt
+
+ type(field_type) :: u_bl_inc
+ type(field_type) :: u_bl_inc_flux
+ type(field_type) :: du
+ type(field_type) :: u_star
+ type(field_type) :: u_star_physical
+ type(field_type) :: rhsu_np1
+
+ type(operator_type), pointer :: mm_vel
+ type(field_type), pointer :: dA
+
+ integer(kind=tik) :: id
+
+ if (LPROF) call start_timing(id, 'tl_physics_alg')
+
+ mm_vel => get_mass_matrix_fe(W2, mesh%get_id())
+
+ ! Run linear boundary layer scheme to compute increment to u perturbation
+
+ call u%copy_field_properties( u_bl_inc )
+ call u%copy_field_properties( u_bl_inc_flux )
+ call u%copy_field_properties( du )
+ call u%copy_field_properties( u_star )
+ call u%copy_field_properties( u_star_physical )
+ call rhs_adv(igh_u)%copy_field_properties( rhsu_np1 )
+
+ ! Compute u_star = u_np1 + du
+ ! where du = M^-1(-rhs_np1 + rhs_n + rhs_a)
+ ! This mirrors the calc_phys_predictors_alg in gungho
+ call du%initialise( rhs_adv(igh_u)%get_function_space() )
+ call rhsu_np1%initialise( rhs_adv(igh_u)%get_function_space() )
+ call invoke( setval_c( du, 0.0_r_def ), &
+ aX_plus_Y( rhsu_np1, -1.0_r_def, rhs_np1(igh_u), rhs_n(igh_u) ), &
+ inc_X_plus_Y( rhsu_np1, rhs_adv(igh_u) ) )
+
+ call mass_matrix_solver_alg( du, rhsu_np1 )
+
+ call invoke( X_plus_Y( u_star, du, state(igh_u) ) )
+
+ ! u_star_physical = u_star / dA
+ ! i.e., divide u_star from boundary layer by dA to transform from flux to velocity
+ dA => get_da_at_w2(mesh%get_id())
+ call invoke( x_divideby_y ( u_star_physical, u_star, dA ) )
+
+ ! For convenience place u_star_physical as igh_u component of state_star
+ call clone_bundle( state,state_star, bundle_size )
+ call copy_bundle( state, state_star, bundle_size )
+ call invoke( setval_x( state_star(igh_u), u_star_physical ) )
+
+ ! u_bl_inc computed from state_star(igh_u)
+ call tl_bdy_lyr_alg( modeldb, u_bl_inc, state_star(igh_u), ls_state, dt )
+
+ ! u_bl_inc_flux = u_bl_inc * dA
+ ! i.e., multiply by cell face area dA to transform from velocity to flux
+ call invoke( x_times_y( u_bl_inc_flux, u_bl_inc, dA ) )
+
+ call set_bundle_scalar( 0.0_r_def, rhs_phys, bundle_size )
+ call invoke( name="update_rhs_phys_from_fast_physics", &
+ matrix_vector_kernel_type( rhs_phys(igh_u), u_bl_inc_flux, mm_vel ), &
+ enforce_bc_kernel_type( rhs_phys(igh_u) ) )
+
+ if (LPROF) call stop_timing(id, 'tl_physics_alg')
+
+end subroutine tl_physics_alg
+
+end module tl_physics_alg_mod
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 bfb52ec0..d912604f 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
@@ -30,6 +30,7 @@ module tl_si_timestep_alg_mod
l_stabilise_bl, &
n_bl_levels_to_stabilise, &
max_bl_stabilisation
+ use linear_physics_config_mod, only: l_boundary_layer
use mixed_solver_config_mod, only: guess_np1, &
reference_reset_time
use timestepping_config_mod, only: alpha, &
@@ -95,6 +96,8 @@ module tl_si_timestep_alg_mod
use map_physics_fields_alg_mod, only: map_physics_fields_alg
+ use tl_physics_alg_mod, only: tl_physics_alg
+
! Moisture species
use mr_indices_mod, only: nummr, imr_v, imr_cl
use moist_dyn_mod, only: num_moist_factors, gas_law
@@ -121,6 +124,7 @@ module tl_si_timestep_alg_mod
type( field_type ), allocatable :: state_initial(:)
type( field_type ), allocatable :: state_n(:)
type( field_type ), allocatable :: state_after_slow(:)
+ type( field_type ), allocatable :: state_star(:)
type( field_type ), allocatable :: advected_state(:)
type( field_type ), allocatable :: mr_n(:)
type( field_type ), allocatable :: mr_inc(:)
@@ -128,6 +132,7 @@ module tl_si_timestep_alg_mod
type( field_type ), allocatable :: rhs_n(:)
type( field_type ), allocatable :: rhs_np1(:)
type( field_type ), allocatable :: rhs_adv(:)
+ type( field_type ), allocatable :: rhs_phys(:)
! Linearisation state
type( field_type ), allocatable :: ls_state(:)
@@ -218,10 +223,12 @@ contains
allocate(state_initial(bundle_size))
allocate(state_n(bundle_size))
allocate(state_after_slow(bundle_size))
+ allocate(state_star(bundle_size))
allocate(advected_state(bundle_size))
allocate(rhs_n(bundle_size))
allocate(rhs_np1(bundle_size))
allocate(rhs_adv(bundle_size))
+ allocate(rhs_phys(bundle_size))
allocate(mr_n(nummr))
allocate(mr_after_slow(nummr))
allocate(mr_inc(nummr))
@@ -271,6 +278,7 @@ contains
call clone_bundle(state, rhs_n, bundle_size)
call clone_bundle(state, rhs_np1, bundle_size)
call clone_bundle(state, rhs_adv, bundle_size)
+ call clone_bundle(state, rhs_phys, bundle_size)
call clone_bundle(state, ls_state, bundle_size)
call clone_bundle(state, ls_state_n, bundle_size)
@@ -696,6 +704,8 @@ contains
moist_dyn, ls_state_n, ls_moist_dyn_itns(:, 1,1), &
.false., .false., model_clock=modeldb%clock )
+ call invoke(setval_c( rhs_np1(igh_u), 0.0_r_def ))
+
call copy_bundle(state_after_slow, advected_state, bundle_size)
if ( .not. si_momentum_equation ) then
! Predictor of the wind field (u-beta*dt*rhs) to be advected if using
@@ -738,6 +748,38 @@ contains
dg_inc_matrix_vector_kernel_type(rhs_adv(igh_t), &
theta_fv_inc, mm_wt) )
+ ! Previously tl_rhs_alg was called within each inner loop.
+ ! It still is called there for inner_iterations > 1.
+ ! For the first inner loop, it needs to be called before entering.
+ ! This is because rhs_np1 is used to calculate u_star in tl_bdy_lyr_alg.
+ if (use_wavedynamics) then
+ call tl_rhs_alg( rhs_np1, &
+ -varalpha*cast_dt, &
+ state, &
+ state, &
+ moist_dyn, &
+ ls_state_itns( :, ls_outer, 1 ), &
+ ls_moist_dyn_itns( :, ls_outer, 1 ), &
+ .true., &
+ dlayer_on, &
+ modeldb%clock )
+ end if
+
+ if (l_boundary_layer) then
+ ! Linear boundary layer scheme is currently the only linear physics scheme
+ call tl_physics_alg( modeldb, &
+ u, &
+ state_star, &
+ rhs_phys, &
+ rhs_np1, &
+ rhs_n, &
+ state, &
+ rhs_adv, &
+ ls_state_itns(:,ls_outer,1), &
+ mesh, &
+ cast_dt )
+ end if ! l_boundary_layer
+
if (use_wavedynamics) then
! Use advective update to guess n+1 level scalar fieldsgv .
@@ -761,16 +803,19 @@ contains
!--------------------------------------------------------------------
! Compute the time-level n+1 dynamics terms
!--------------------------------------------------------------------
- call tl_rhs_alg(rhs_np1, &
- -varalpha*cast_dt, &
- state, &
- state, &
- moist_dyn, &
- ls_state_itns(:, ls_outer, ls_inner), &
- ls_moist_dyn_itns(:, ls_outer, ls_inner), &
- .true., &
- dlayer_on, &
- modeldb%clock)
+ ! Only call tl_rhs_alg if inner > 1 as for inner===1 it is already called early (see comment above)
+ if (inner > 1) then
+ call tl_rhs_alg(rhs_np1, &
+ -varalpha*cast_dt, &
+ state, &
+ state, &
+ moist_dyn, &
+ ls_state_itns(:, ls_outer, ls_inner), &
+ ls_moist_dyn_itns(:, ls_outer, ls_inner), &
+ .true., &
+ dlayer_on, &
+ modeldb%clock)
+ end if
!--------------------------------------------------------------------
! Compute the LAM LBCs and RHS
@@ -787,6 +832,7 @@ contains
!--------------------------------------------------------------------
call bundle_axpy(-1.0_r_def, rhs_np1, rhs_n, rhs_np1, bundle_size)
call add_bundle(rhs_np1, rhs_adv, rhs_np1, bundle_size)
+ if (l_boundary_layer) call add_bundle(rhs_np1, rhs_phys, rhs_np1, bundle_size)
if ( limited_area ) then
call log_event( "No limited area for Tangent linear", LOG_LEVEL_ERROR )
@@ -909,10 +955,12 @@ contains
if (allocated(state_initial)) deallocate(state_initial)
if (allocated(state_n)) deallocate(state_n)
if (allocated(state_after_slow)) deallocate(state_after_slow)
+ if (allocated(state_star)) deallocate(state_star)
if (allocated(advected_state)) deallocate(advected_state)
if (allocated(rhs_n)) deallocate(rhs_n)
if (allocated(rhs_np1)) deallocate(rhs_np1)
if (allocated(rhs_adv)) deallocate(rhs_adv)
+ if (allocated(rhs_phys)) deallocate(rhs_phys)
if (allocated(mr_n)) deallocate(mr_n)
if (allocated(mr_after_slow)) deallocate(mr_after_slow)
if (allocated(mr_inc)) deallocate(mr_inc)
diff --git a/science/linear/source/driver/linear_driver_mod.f90 b/science/linear/source/driver/linear_driver_mod.f90
index 662faea6..c7ac5631 100644
--- a/science/linear/source/driver/linear_driver_mod.f90
+++ b/science/linear/source/driver/linear_driver_mod.f90
@@ -174,7 +174,7 @@ subroutine initialise( program_name, modeldb )
end if
! Instantiate the linearisation state
- call linear_create_ls( modeldb, mesh )
+ call linear_create_ls( modeldb, mesh, twod_mesh)
! Initialise the fields stored in the model_data
if ( init_option == init_option_fd_start_dump ) then
diff --git a/science/linear/source/driver/linear_model_data_mod.f90 b/science/linear/source/driver/linear_model_data_mod.f90
index 95befc39..11f80b13 100644
--- a/science/linear/source/driver/linear_model_data_mod.f90
+++ b/science/linear/source/driver/linear_model_data_mod.f90
@@ -71,23 +71,24 @@ module linear_model_data_mod
!> @param[inout] modeldb The working data set for a model run
!> @param[in] mesh The current 3d mesh
!>
- subroutine linear_create_ls( modeldb, mesh )
+ subroutine linear_create_ls( modeldb, mesh, twod_mesh )
implicit none
type( modeldb_type ), target, intent(inout) :: modeldb
type( mesh_type ), pointer, intent(in) :: mesh
+ type( mesh_type ), pointer, intent(in) :: twod_mesh
select case( ls_option )
case( ls_option_analytic )
- call linear_create_ls_analytic( modeldb, mesh )
+ call linear_create_ls_analytic( modeldb, mesh, twod_mesh )
case( ls_option_file )
- call linear_create_ls_file( modeldb, mesh )
+ call linear_create_ls_file( modeldb, mesh, twod_mesh )
case default
@@ -106,13 +107,14 @@ end subroutine linear_create_ls
!> @param[inout] modeldb The working data set for a model run
!> @param[in] mesh The current 3d mesh
!>
- subroutine linear_create_ls_analytic( modeldb, mesh )
+ subroutine linear_create_ls_analytic( modeldb, mesh, twod_mesh )
implicit none
type( modeldb_type ), target, intent(inout) :: modeldb
type( mesh_type ), pointer, intent(in) :: mesh
+ type( mesh_type ), pointer, intent(in) :: twod_mesh
type( field_collection_type ), pointer :: depository
type( field_collection_type ), pointer :: prognostics
@@ -170,6 +172,9 @@ subroutine linear_create_ls_analytic( modeldb, mesh )
imr=imr )
end do
+ call setup_field( ls_fields, depository, prognostics, "ls_land_fraction", W3, &
+ twod_mesh, checkpoint_restart_flag )
+
end subroutine linear_create_ls_analytic
!> @brief Create the fields in the ls fields field collection to be setup
@@ -180,13 +185,14 @@ end subroutine linear_create_ls_analytic
!> @param[inout] modeldb The working data set for a model run
!> @param[in] mesh The current 3d mesh
!>
- subroutine linear_create_ls_file( modeldb, mesh )
+ subroutine linear_create_ls_file( modeldb, mesh, twod_mesh )
implicit none
type( modeldb_type ), target, intent(inout) :: modeldb
type( mesh_type ), pointer, intent(in) :: mesh
+ type( mesh_type ), pointer, intent(in) :: twod_mesh
type( field_collection_type ), pointer :: depository
type( field_collection_type ), pointer :: prognostics
@@ -242,6 +248,8 @@ subroutine linear_create_ls_file( modeldb, mesh )
mesh, checkpoint_restart_flag, time_axis=ls_time_axis )
call setup_field( ls_fields, depository, prognostics, "ls_theta", Wtheta, &
mesh, checkpoint_restart_flag, time_axis=ls_time_axis )
+ call setup_field( ls_fields, depository, prognostics, "ls_land_fraction", W3, &
+ twod_mesh, checkpoint_restart_flag, time_axis=ls_time_axis )
if ( ls_read_w2h ) then
call setup_field( ls_fields, depository, prognostics, "ls_h_u", W2h, &
@@ -454,4 +462,4 @@ subroutine linear_init_pert( mesh, twod_mesh, modeldb )
end subroutine linear_init_pert
-end module linear_model_data_mod
\ No newline at end of file
+end module linear_model_data_mod
diff --git a/science/linear/source/kernel/linear_physics/tl_bl_inc_kernel_mod.F90 b/science/linear/source/kernel/linear_physics/tl_bl_inc_kernel_mod.F90
new file mode 100644
index 00000000..9141565c
--- /dev/null
+++ b/science/linear/source/kernel/linear_physics/tl_bl_inc_kernel_mod.F90
@@ -0,0 +1,165 @@
+!-----------------------------------------------------------------------------
+! (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 used.
+!-----------------------------------------------------------------------------
+!> @brief Computes u_inc, the change in TLM velocity due to TLM boundary layer processes.
+module tl_bl_inc_kernel_mod
+
+ use argument_mod, only : arg_type, &
+ GH_FIELD, GH_OPERATOR, &
+ GH_SCALAR, GH_INTEGER, &
+ GH_READ, GH_INC, &
+ GH_REAL, CELL_COLUMN, &
+ ANY_DISCONTINUOUS_SPACE_1
+ use constants_mod, only : r_def, i_def, r_um
+ use fs_continuity_mod, only : W1, W2, W3
+ use kernel_mod, only : kernel_type
+ use reference_element_mod, only : N
+
+ implicit none
+
+ private
+
+ !---------------------------------------------------------------------------
+ ! Public types
+ !---------------------------------------------------------------------------
+
+ type, public, extends(kernel_type) :: tl_bl_inc_kernel_type
+ private
+ type(arg_type) :: meta_args(7) = (/ &
+ arg_type(GH_FIELD, GH_REAL, GH_INC, W2), & ! u_inc
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! u
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! Auv
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! Buv_inv
+ arg_type(GH_FIELD, GH_INTEGER, GH_READ, ANY_DISCONTINUOUS_SPACE_1), & ! face_selector_ew
+ arg_type(GH_FIELD, GH_INTEGER, GH_READ, ANY_DISCONTINUOUS_SPACE_1), & ! face_selector_ns
+ arg_type(GH_SCALAR, GH_INTEGER, GH_READ ) & ! Blevs_m
+ /)
+ integer :: operates_on = CELL_COLUMN
+ contains
+ procedure, nopass :: tl_bl_inc_code
+ end type
+
+ !---------------------------------------------------------------------------
+ ! Contained functions/subroutines
+ !---------------------------------------------------------------------------
+ public :: tl_bl_inc_code
+
+contains
+
+!> @brief Computes u_inc, the change in TLM velocity due to TLM boundary layer processes.
+!> @details The algorithm uses coefficients Auv and Buv_inv computed in tl_compute_aubu_kernel_mod.
+!> The TLM BL scheme is described in Var Scientific Documentation Paper 55,
+!> https://wwwspice/~frva/VAR/view/var-2025.03.0/doc/VSDP55_1A.pdf
+!! @param[in] nlayers Number of layers
+!! @param[in,out] u_inc Change in TLM velocity due to TLM boundary layer processes
+!! @param[in] u TLM velocity
+!! @param[in] nlayers Number of layers
+!! @param[in] Auv Coefficient for TLM boundary layer
+!! @param[in] Buv_inv Inverse of coefficient for TLM boundary layer
+!! @param[in] face_selector_ew 2D field indicating which W/E faces to loop over in this column
+!! @param[in] face_selector_ns 2D field indicating which N/S faces to loop over in this column
+!! @param[in] Blevs_m Number of levels in momentum boundary layer
+!! @param[in] ndf_w2 Number of degrees of freedom per cell for w2 space
+!! @param[in] undf_w2 Number of unique degrees of freedom for w2 space
+!! @param[in] map_w2 Dofmap for the cell at the base of the column for w2
+!! @param[in] ndf_w3_2d Number of DoFs for 2D W3 per cell
+!! @param[in] undf_w3_2d Number of DoFs for this partition for 2D W3
+!! @param[in] map_w3_2d Map for 2D W3
+subroutine tl_bl_inc_code( nlayers, &
+ u_inc, &
+ u, &
+ Auv, &
+ Buv_inv, &
+ face_selector_ew, &
+ face_selector_ns, &
+ Blevs_m, &
+ ndf_w2, undf_w2, map_w2, &
+ ndf_w3_2d, undf_w3_2d, map_w3_2d )
+
+ implicit none
+
+ ! Arguments
+ integer(kind=i_def), intent(in) :: nlayers
+ integer(kind=i_def), intent(in) :: undf_w2, ndf_w2
+ real(kind=r_def), dimension(undf_w2), intent(inout) :: u_inc
+ integer(kind=i_def), dimension(ndf_w2), intent(in) :: map_w2
+ real(kind=r_def), dimension(undf_w2), intent(in) :: u
+ real(kind=r_def), dimension(undf_w2), intent(in) :: Auv
+ real(kind=r_def), dimension(undf_w2), intent(in) :: Buv_inv
+ integer(kind=i_def), intent(in) :: ndf_w3_2d, undf_w3_2d
+ integer(kind=i_def), dimension(ndf_w3_2d), intent(in) :: map_w3_2d
+ integer(kind=i_def), dimension(undf_w3_2d), intent(in) :: face_selector_ew
+ integer(kind=i_def), dimension(undf_w3_2d), intent(in) :: face_selector_ns
+ integer(kind=i_def), intent(in) :: Blevs_m
+
+ ! Internal variables
+ integer(kind=i_def) :: df, k, j
+ real(kind=r_def) :: a0(1:BLevs_m) ! Coefficient
+ real(kind=r_def) :: a1(1:BLevs_m) ! Coefficient
+ real(kind=r_def) :: a2(1:BLevs_m) ! Coefficient
+ real(kind=r_def) :: u_rhs(1:BLevs_m) ! Local perturbation velocity variable
+ real(kind=r_def) :: u_out(1:BLevs_m) ! Local perturbation velocity variable
+ real(kind=r_def) :: factor_u(1:BLevs_m)
+
+ ! Loop over horizontal W2 DoFs whilst minimising double counting.
+ ! (Looping over all dofs would mean that faces are visited twice – for the cells on both sides.
+ ! So here the loop is only for a specific selection of dofs.)
+ do j = 1, face_selector_ew(map_w3_2d(1)) + face_selector_ns(map_w3_2d(1))
+
+ df = j
+ if (j == 3 .and. face_selector_ns(map_w3_2d(1)) == 2 .and. face_selector_ew(map_w3_2d(1)) == 1) df = N
+
+ a0 = 0.0_r_def
+ a1 = 0.0_r_def
+ a2 = 0.0_r_def
+ u_rhs = 0.0_r_def
+ u_out = 0.0_r_def
+ factor_u = 0.0_r_def
+
+ ! Set up coeffs a0, a1, a2, u_rhs
+ do k = 1, BLevs_m
+ if (k == 1) then
+ a0(1) = 1.0_r_def + (Auv(map_w2(df) + 1) + Auv(map_w2(df) + 0)) / Buv_inv(map_w2(df) + 1)
+ a1(k) = -Auv(map_w2(df) + 1) / Buv_inv(map_w2(df) + 1)
+ u_rhs(1) = (Auv(map_w2(df) + 1) &
+ * (u(map_w2(df) + 1) - u(map_w2(df) + 0)) - Auv(map_w2(df) + 0) * u(map_w2(df) + 0)) / Buv_inv(map_w2(df) + 1)
+ else if (k > 1 .and. k < BLevs_m) then
+ a0(k) = 1.0_r_def + (Auv(map_w2(df) + k) + Auv(map_w2(df) + k - 1)) / Buv_inv(map_w2(df) + k)
+ a2(k) = -Auv(map_w2(df) + k - 1) / Buv_inv(map_w2(df) + k)
+ a1(k) = -Auv(map_w2(df) + k) / Buv_inv(map_w2(df) + k)
+ u_rhs(k) = (Auv(map_w2(df) + k) &
+ * (u(map_w2(df) + k) - u(map_w2(df) + k - 1)) &
+ - Auv(map_w2(df) + k - 1) * (u(map_w2(df) + k - 1) - u(map_w2(df) + k - 2))) / Buv_inv(map_w2(df) + k)
+ else
+ a0(k) = 1.0_r_def + Auv(map_w2(df) + k - 1) / Buv_inv(map_w2(df) + k)
+ a2(k) = -Auv(map_w2(df) + k - 1) / Buv_inv(map_w2(df) + k)
+ u_rhs(k) = -(Auv(map_w2(df) + k - 1) * (u(map_w2(df) + k - 1) - u(map_w2(df) + k - 2))) / Buv_inv(map_w2(df) + k)
+ end if
+ end do
+
+ ! Transform to upper triangular form
+ do k = 1, BLevs_m
+ if (k == 1) then
+ a0(1) = 1.0_r_def / a0(1)
+ else
+ factor_u(k) = a2(k) * a0(k - 1)
+ a0(k) = 1.0_r_def / (a0(k) - factor_u(k) * a1(k - 1))
+ u_rhs(k) = u_rhs(k) - factor_u(k) * u_rhs(k - 1)
+ end if
+ end do
+
+ ! Solve for u_inc
+ u_out(BLevs_m) = a0(BLevs_m) * u_rhs(BLevs_m)
+ u_inc(map_w2(df) + BLevs_m - 1) = u_out(BLevs_m)
+ do k = BLevs_m - 1, 1, -1
+ u_out(k) = a0(k) * (u_rhs(k) - a1(k) * u_out(k + 1))
+ u_inc(map_w2(df) + k - 1) = u_out(k)
+ end do
+
+ end do ! Loop over horizontal W2 DoFs
+
+end subroutine tl_bl_inc_code
+
+end module tl_bl_inc_kernel_mod
diff --git a/science/linear/source/kernel/linear_physics/tl_compute_aubu_kernel_mod.F90 b/science/linear/source/kernel/linear_physics/tl_compute_aubu_kernel_mod.F90
new file mode 100644
index 00000000..d4244fa1
--- /dev/null
+++ b/science/linear/source/kernel/linear_physics/tl_compute_aubu_kernel_mod.F90
@@ -0,0 +1,117 @@
+!-----------------------------------------------------------------------------
+! (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 used.
+!-----------------------------------------------------------------------------
+!> @brief Computes coefficients Auv and Buv_inv used in the TLM boundary layer scheme for momentum.
+module tl_compute_aubu_kernel_mod
+
+ use argument_mod, only : arg_type, func_type, &
+ GH_FIELD, GH_OPERATOR, &
+ GH_SCALAR, GH_INTEGER, &
+ GH_READ, GH_INC, GH_READWRITE, &
+ GH_REAL, CELL_COLUMN, GH_BASIS, GH_EVALUATOR, &
+ ANY_DISCONTINUOUS_SPACE_1
+ use constants_mod, only : r_def, i_def, r_um
+ use fs_continuity_mod, only : W1, W2, W3
+ use kernel_mod, only : kernel_type
+
+ implicit none
+
+ private
+
+ !---------------------------------------------------------------------------
+ ! Public types
+ !---------------------------------------------------------------------------
+ type, public, extends(kernel_type) :: tl_compute_aubu_kernel_type
+ private
+ type(arg_type) :: meta_args(8) = (/ &
+ arg_type(GH_FIELD, GH_REAL, GH_INC, W2), & ! Auv
+ arg_type(GH_FIELD, GH_REAL, GH_INC, W2), & ! Buv_inv
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W3), & ! Q
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W3), & ! E
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! height_w2
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W2), & ! w2_rmultiplicity
+ arg_type(GH_SCALAR, GH_REAL, GH_READ ), & ! dt
+ arg_type(GH_SCALAR, GH_INTEGER, GH_READ ) & ! Blevs_m
+ /)
+ integer :: operates_on = CELL_COLUMN
+ contains
+ procedure, nopass :: tl_compute_aubu_code
+ end type
+
+ !---------------------------------------------------------------------------
+ ! Contained functions/subroutines
+ !---------------------------------------------------------------------------
+ public :: tl_compute_aubu_code
+
+contains
+
+!> @brief Computes coefficients Auv and Buv_inv used in the TLM boundary layer scheme for momentum.
+!> @details Auv and Buv_inv are derived from coefficients Q and E which are computed in tl_compute_qe_kernel_mod.
+!> The TLM BL scheme is described in Var Scientific Documentation Paper 55,
+!> https://wwwspice/~frva/VAR/view/var-2025.03.0/doc/VSDP55_1A.pdf
+!! @param[in] nlayers Number of layers
+!! @param[in,out] Auv Coefficient for TLM boundary layer
+!! @param[in,out] Buv_inv Inverse of coefficient for TLM boundary layer
+!! @param[in] Q Coefficient for TLM boundary layer
+!! @param[in] E Coefficient for TLM boundary layer
+!! @param[in] height_w2 Height of w2 space levels above the surface
+!! @param[in] w2_rmultiplicity Reciprocal of multiplicity for W2
+!! @param[in] dt TLM time step
+!! @param[in] Blevs_m Number of levels in momentum boundary layer
+!! @param[in] ndf_w2 Number of degrees of freedom per cell for w2 space
+!! @param[in] undf_w2 Number of unique degrees of freedom for w2 space
+!! @param[in] map_w2 Dofmap for the cell at the base of the column for w2
+!! @param[in] ndf_w3 Number of degrees of freedom per cell for w3 space
+!! @param[in] undf_w3 Number of unique degrees of freedom for w3 space
+!! @param[in] map_w3 Dofmap for the cell at column base for w3
+subroutine tl_compute_aubu_code( nlayers, &
+ Auv, &
+ Buv_inv, &
+ Q, &
+ E, &
+ height_w2, &
+ w2_rmultiplicity, &
+ dt, &
+ Blevs_m, &
+ ndf_w2, undf_w2, map_w2, &
+ ndf_w3, undf_w3, map_w3)
+
+ implicit none
+
+ ! Arguments
+ integer(kind=i_def), intent(in) :: nlayers
+ integer(kind=i_def), intent(in) :: undf_w3, ndf_w3
+ integer(kind=i_def), dimension(ndf_w3), intent(in) :: map_w3
+ integer(kind=i_def), intent(in) :: undf_w2, ndf_w2
+ integer(kind=i_def), dimension(ndf_w2), intent(in) :: map_w2
+ real(kind=r_def), dimension(undf_w2), intent(in) :: w2_rmultiplicity
+ real(kind=r_def), dimension(undf_w2), intent(inout) :: Auv !(0:BLevs_m)
+ real(kind=r_def), dimension(undf_w2), intent(inout) :: Buv_inv ! Use inverse of Buv as this is what is averaged
+ real(kind=r_def), dimension(undf_w3), intent(in) :: Q ! (0:BLevs_m)
+ real(kind=r_def), dimension(undf_w3), intent(in) :: E ! (BLevs_m)
+ real(kind=r_def), dimension(undf_w2), intent(in) :: height_w2
+ real(kind=r_def), intent(in) :: dt
+ integer(kind=i_def), intent(in) :: Blevs_m
+
+ ! Internal variables
+ integer(kind=i_def) :: df, df3, k
+
+ df3 = 1
+
+ do df = 1, 4
+ do k = 0, BLevs_m
+ if (k == 0) then
+ Auv(map_w2(df) + k) = Auv(map_w2(df) + k) + w2_rmultiplicity(map_w2(df)) * Q(map_w3(df3))
+ else ! 1 <= k <= BLevs_m
+ Auv(map_w2(df) + k) = Auv(map_w2(df) + k) + &
+ w2_rmultiplicity(map_w2(df) + k) * Q(map_w3(df3) + k) / (height_w2(map_w2(df) + k) - height_w2(map_w2(df) + k - 1))
+ Buv_inv(map_w2(df) + k) = Buv_inv(map_w2(df) + k) + ( w2_rmultiplicity(map_w2(df) + k) * E(map_w3(df3) + k) ) / dt
+ end if
+ end do ! k = 0, BLevs_m
+ end do ! df = 1, 4
+
+end subroutine tl_compute_aubu_code
+
+end module tl_compute_aubu_kernel_mod
diff --git a/science/linear/source/kernel/linear_physics/tl_compute_qe_kernel_mod.F90 b/science/linear/source/kernel/linear_physics/tl_compute_qe_kernel_mod.F90
new file mode 100644
index 00000000..89c6a771
--- /dev/null
+++ b/science/linear/source/kernel/linear_physics/tl_compute_qe_kernel_mod.F90
@@ -0,0 +1,179 @@
+!-----------------------------------------------------------------------------
+! (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 used.
+!-----------------------------------------------------------------------------
+!> @brief Computes coefficients Q and E used in the TLM boundary layer scheme for momentum.
+module tl_compute_qe_kernel_mod
+
+ use argument_mod, only : arg_type, func_type, &
+ GH_FIELD, GH_OPERATOR, &
+ GH_SCALAR, GH_INTEGER, &
+ GH_READ, GH_INC, GH_READWRITE, &
+ GH_REAL, CELL_COLUMN, GH_BASIS, GH_EVALUATOR, &
+ ANY_DISCONTINUOUS_SPACE_1
+ use constants_mod, only : r_def, i_def, r_um
+ use fs_continuity_mod, only : W1, W2, W3, Wtheta
+ use kernel_mod, only : kernel_type
+
+ implicit none
+
+ private
+
+ !---------------------------------------------------------------------------
+ ! Public types
+ !---------------------------------------------------------------------------
+ type, public, extends(kernel_type) :: tl_compute_qe_kernel_type
+ private
+ type(arg_type) :: meta_args(14) = (/ &
+ arg_type(GH_FIELD, GH_REAL, GH_READWRITE, W3), & ! Q
+ arg_type(GH_FIELD, GH_REAL, GH_READWRITE, W3), & ! E
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W3), & ! ls_rho
+ arg_type(GH_FIELD, GH_REAL, GH_READ, W3), & ! height_w3
+ arg_type(GH_FIELD, GH_REAL, GH_READ, Wtheta), & ! height_wth
+ arg_type(GH_FIELD, GH_REAL, GH_READ, ANY_DISCONTINUOUS_SPACE_1 ), & ! ls_land_fraction
+ arg_type(GH_SCALAR, GH_INTEGER, GH_READ ), & ! log_layer
+ arg_type(GH_SCALAR, GH_INTEGER, GH_READ ), & ! Blevs_m
+ arg_type(GH_SCALAR, GH_INTEGER, GH_READ ), & ! e_folding_levs_m
+ arg_type(GH_SCALAR, GH_REAL, GH_READ ), & ! u_land_m
+ arg_type(GH_SCALAR, GH_REAL, GH_READ ), & ! u_sea_m
+ arg_type(GH_SCALAR, GH_REAL, GH_READ ), & ! z_land_m
+ arg_type(GH_SCALAR, GH_REAL, GH_READ ), & ! z_sea_m
+ arg_type(GH_SCALAR, GH_REAL, GH_READ ) & ! L_0_m
+ /)
+ integer :: operates_on = CELL_COLUMN
+ contains
+ procedure, nopass :: tl_compute_qe_code
+ end type
+
+ !---------------------------------------------------------------------------
+ ! Contained functions/subroutines
+ !---------------------------------------------------------------------------
+ public :: tl_compute_qe_code
+
+contains
+
+!> @brief Computes coefficients Q and E used in the TLM boundary layer scheme for momentum.
+!> @details The TLM BL scheme is described in Var Scientific Documentation Paper 55,
+!> https://wwwspice/~frva/VAR/view/var-2025.03.0/doc/VSDP55_1A.pdf
+!! @param[in] nlayers Number of layers
+!! @param[in,out] Q Coefficient for TLM boundary layer
+!! @param[in,out] E Coefficient for TLM boundary layer
+!! @param[in] ls_rho Linearisation state for density
+!! @param[in] height_w3 Height of w3 space levels above the surface
+!! @param[in] height_wth Height of wth space levels above surface
+!! @param[in] ls_land_fraction Land area fraction
+!! @param[in] log_layer Number of levels in log layer
+!! @param[in] Blevs_m Number of levels in momentum boundary layer
+!! @param[in] e_folding_levs_m e-folding level in exchange coefficient for momemtum
+!! @param[in] z_land_m Effective roughness length for momemtum over land
+!! @param[in] z_sea_m Effective roughness length for momemtum over sea
+!! @param[in] u_land_m Friction velocity for momemtum over land
+!! @param[in] u_sea_m Friction velocity for momemtum over sea
+!! @param[in] L_0_m Mixing length for momemtum
+!! @param[in] ndf_w3 Number of degrees of freedom per cell for w3 space
+!! @param[in] undf_w3 Number of unique degrees of freedom for w3 space
+!! @param[in] map_w3 Dofmap for the cell at column base for w3
+!! @param[in] ndf_wtheta Number of degrees of freedom per cell for wtheta space
+!! @param[in] undf_wtheta Number of unique degrees of freedom for wtheta space
+!! @param[in] map_wtheta Dofmap for the cell at the base of the column for wtheta
+!! @param[in] ndf_2d Number of degrees of freedom per cell for 2D field
+!! @param[in] undf_2d Number of unique degrees of freedom for 2D field
+!! @param[in] map_2d Dofmap for 2D field
+subroutine tl_compute_qe_code( nlayers, &
+ Q, &
+ E, &
+ ls_rho, &
+ height_w3, &
+ height_wth, &
+ ls_land_fraction, &
+ log_layer, &
+ Blevs_m, &
+ e_folding_levs_m, &
+ u_land_m, &
+ u_sea_m, &
+ z_land_m, &
+ z_sea_m, &
+ L_0_m, &
+ ndf_w3, undf_w3, map_w3, &
+ ndf_wtheta, undf_wtheta, map_wtheta, &
+ ndf_2d, undf_2d, map_2d )
+
+ implicit none
+
+ ! Arguments
+ integer(kind=i_def), intent(in) :: nlayers
+ integer(kind=i_def), intent(in) :: undf_w3, ndf_w3
+ integer(kind=i_def), dimension(ndf_w3), intent(in) :: map_w3
+ integer(kind=i_def), intent(in) :: undf_wtheta, ndf_wtheta
+ integer(kind=i_def), dimension(ndf_wtheta), intent(in) :: map_wtheta
+ integer(kind=i_def), intent(in) :: undf_2d, ndf_2d
+ integer(kind=i_def), dimension(ndf_2d), intent(in) :: map_2d
+ real(kind=r_def), dimension(undf_w3), intent(inout) :: Q ! (0:BLevs_m)
+ real(kind=r_def), dimension(undf_w3), intent(inout) :: E ! (BLevs_m)
+ real(kind=r_def), dimension(undf_w3), intent(in) :: ls_rho
+ real(kind=r_def), dimension(undf_w3), intent(in) :: height_w3
+ real(kind=r_def), dimension(undf_wtheta), intent(in) :: height_wth
+ real(kind=r_def), dimension(undf_2d), intent(in) :: ls_land_fraction
+ integer(kind=i_def), intent(in) :: log_layer,Blevs_m,e_folding_levs_m
+ real(kind=r_def), intent(in) :: u_land_m, u_sea_m, z_land_m, z_sea_m, L_0_m
+
+ ! Internal variables
+ integer(kind=i_def) :: df, k
+ real(kind=r_def) :: roughness_length_m
+ real(kind=r_def), parameter :: Von_Karman = 0.4_r_def
+ real(kind=r_def) :: L_diff_m(1:BLevs_m)
+ real(kind=r_def) :: u1
+ real(kind=r_def) :: num
+ real(kind=r_def) :: denom
+
+ df = 1 ! map_w3 only has range 1:1, map_wtheta has range 1:2 with 1 being lower face of cell
+ roughness_length_m = z_land_m * ls_land_fraction(map_2d(df)) + z_sea_m * (1.0_r_def - ls_land_fraction(map_2d(df)))
+
+ ! Define the mixing length, L_diff
+ ! L_diff is on centre of horizontal faces - for convenience indexed by centre of cell above.
+ ! Vertical numbering (k index) matches that in old Var schemePF_bdy_lyr.f90 (see link above),
+ ! in which centre of lowest cell is rho level 1 (allowing for the fact that the PF model is for New Dynamics,
+ ! which has an extra rho level which means that W3 k=0 in LFRic is equivalent to rho levels k=1 in VAR).
+ ! L_diff_m(k) defined for 1 <= k <= BLevs_m.
+ do k = 1, BLevs_m
+ if (k <= Log_layer) then
+ ! num and denom to take log of
+ num = height_w3(map_w3(df) + k) - height_wth(map_wtheta(df)) + roughness_length_m
+ denom = height_w3(map_w3(df) + k - 1) - height_wth(map_wtheta(df)) + roughness_length_m
+ ! num and denom of final expression
+ denom = log(num / denom) + Von_Karman * (height_w3(map_w3(df) + k) - height_w3(map_w3(df) + k - 1)) / L_0_m
+ num = (height_w3(map_w3(df) + k) - height_w3(map_w3(df) + k - 1))
+ else
+ num = height_wth(map_wtheta(df) + k) - height_wth(map_wtheta(df)) + roughness_length_m
+ denom = 1.0_r_def + (height_wth(map_wtheta(df) + k) - height_wth(map_wtheta(df)) + roughness_length_m) / L_0_m
+ end if
+ L_diff_m(k) = Von_Karman * num / denom
+ end do
+
+ ! Define Q and E
+ ! E is on cell centres
+ ! Q is on centre of horizontal faces - for convenience indexed by centre of cell above
+ ! Q(k) defined for 0 <= k <= BLevs_m
+ ! E(k) defined for 1 <= k <= BLevs_m
+ u1 = u_land_m * ls_land_fraction(map_2d(df)) + u_sea_m * (1.0_r_def - ls_land_fraction(map_2d(df)))
+ do k = 0, BLevs_m
+ if (k == 0) then
+ ! num and denom to take log of
+ num = height_w3(map_w3(df) + 0) - height_wth(map_wtheta(df) + 0) + roughness_length_m
+ denom = roughness_length_m
+ ! num and denom of final expression
+ denom = log(num / denom)
+ num = Von_Karman * u1
+ Q(map_w3(df) + k) = num / denom
+ else ! i.e., k >= 1
+ num = height_wth(map_wtheta(df)) - height_wth(map_wtheta(df) + k)
+ denom = height_wth(map_wtheta(df) + e_folding_levs_m) - height_wth(map_wtheta(df))
+ Q(map_w3(df) + k) = L_diff_m(k) * u1 * exp(num / denom)
+ E(map_w3(df) + k) = ls_rho(map_w3(df) + k - 1) * (height_wth(map_wtheta(df) + k) - height_wth(map_wtheta(df) + k - 1))
+ end if
+ end do
+
+end subroutine tl_compute_qe_code
+
+end module tl_compute_qe_kernel_mod