Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@
| harry-shepherd | Harry Shepherd | Met Office | 2026-01-08 |
| DrTVockerodtMO | Terence Vockerodt | Met Office | 2026-01-08 |
| MetBenjaminWent | Benjamin Went | Met Office | 2026-01-15 |
| timgraham-Met | Tim Graham | Met Office | 2026-01-15 |
| timgraham-Met | Tim Graham | Met Office | 2026-01-15 |
| cjohnson-pi | Christine Johnson | Met Office | 2026-01-16 |
6 changes: 4 additions & 2 deletions applications/adjoint_tests/example/configuration.nml
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,10 @@ write_fluxes=.false.,
write_minmax_tseries=.false.,
/
&linear
fixed_ls=.false.
pert_option='analytic',
l_stabilise_bl=.false.,
transport_efficiency=.false.
/
&logging
run_log_level='info',
Expand Down Expand Up @@ -297,11 +299,11 @@ panel_edge_treatment='none'
profile_size=5,
reversible=5*.false.,
runge_kutta_method='ssp3',
scheme=5*1,
scheme=5*3,
si_outer_transport='none',
slice_order='parabola',
special_edges_monotone=0,0,0,1,1
splitting=5*1,
splitting=5*2,
substep_transport='off',
theta_dispersion_correction=.false.,
theta_variable='dry',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ module adjt_end_transport_step_alg_mod
use model_clock_mod, only : model_clock_type
use finite_element_config_mod, only : element_order_h, &
element_order_v
use fs_continuity_mod, only : W2
use fs_continuity_mod, only : W2, W2V
use function_space_collection_mod, only : function_space_collection
use setup_test_alg_mod, only : setup_test_tl_transport_controller
use init_from_controller_alg_mod, only : init_counter_fieldvals
Expand Down Expand Up @@ -78,6 +78,7 @@ module adjt_end_transport_step_alg_mod

! Variables for initialising fields
type(function_space_type), pointer :: vector_space_w2_ptr
type(function_space_type), pointer :: vector_space_w2v_ptr

! Inner products
real(kind=r_tran) :: inner1
Expand Down Expand Up @@ -108,13 +109,16 @@ module adjt_end_transport_step_alg_mod

vector_space_w2_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W2 &
)
)
vector_space_w2v_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W2V)

! Assume that the last split step is in W2V (for VHV splitting)
call sum_flux%initialise( vector_space = vector_space_w2_ptr )
call flux_last_step%initialise( vector_space = vector_space_w2_ptr )
call flux_last_step%initialise( vector_space = vector_space_w2v_ptr )

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you hardwiring the flux_last_step to always be W2V? Is it possible to put in a check based on the splitting used? If not is it worth commenting that this is only suitable for testing VHV splitting?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment added


call sum_flux_input%initialise( vector_space = vector_space_w2_ptr )
call flux_last_step_input%initialise( vector_space = vector_space_w2_ptr )
call flux_last_step_input%initialise( vector_space = vector_space_w2v_ptr )

sum_flux_inner_prod = 0.0_r_def
flux_last_step_inner_prod = 0.0_r_def
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ module atlt_end_transport_step_alg_mod
use model_clock_mod, only : model_clock_type
use finite_element_config_mod, only : element_order_h, &
element_order_v
use fs_continuity_mod, only : W2, W3
use fs_continuity_mod, only : W2, W3, W2V
use function_space_collection_mod, only : function_space_collection
use tl_transport_controller_mod, only : tl_transport_controller_type
use transport_controller_mod, only : transport_controller_type
use flux_precomputations_alg_mod, only : flux_precomputations_type
use transport_counter_mod, only : transport_counter_type
use split_transport_utils_mod, only : get_num_split_steps, &
get_direction_w2_fs
use setup_test_alg_mod, only : setup_test_tl_transport_controller
use transport_metadata_collection_mod, only : transport_metadata_collection
use transport_metadata_mod, only : transport_metadata_type
Expand Down Expand Up @@ -233,6 +235,9 @@ module atlt_end_transport_step_alg_mod
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_2_inp

! Variables for initialising fields
integer(kind=i_def) :: splitting
integer(kind=i_def) :: num_split_steps
integer(kind=i_def) :: fs_id
type(function_space_type), pointer :: vector_space_w2_ptr
type(function_space_type), pointer :: vector_space_w3_ptr

Expand Down Expand Up @@ -284,11 +289,16 @@ module atlt_end_transport_step_alg_mod
dummy_ref_mass_2_inp, &
pert_transport_controller )

vector_space_w2_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W2 &
! W2 function space appropriate for splitting (fs on the last step)
splitting = transport_metadata%get_splitting()
num_split_steps = get_num_split_steps(splitting)
fs_id = get_direction_w2_fs(splitting, num_split_steps)
vector_space_w2_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, fs_id &
)
vector_space_w3_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W3 &

vector_space_w3_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W3 &
)

call field_np1%initialise( vector_space = vector_space_w3_ptr )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,19 @@ module atlt_transport_field_alg_mod
use setup_test_alg_mod, only : setup_test_tl_transport_controller
use inner_from_controller_rdef_alg_mod, only : flux_pc_ref_flux_prod_rdef, &
flux_pc_ref_flux_inp_prod_rdef, &
counter_flux_prod_rdef, &
counter_flux_inp_prod_rdef, &
counter_field_n_prod_rdef, &
counter_field_n_inp_prod_rdef, &
wind_pc_dir_prod_rdef, &
wind_pc_dir_inp_prod_rdef
use init_from_controller_alg_mod, only : init_flux_pc_fieldvals, &
init_wind_pc_fieldvals
init_wind_pc_fieldvals, &
init_counter_fieldvals
use transport_enumerated_types_mod, only : direction_3d, &
direction_h, &
direction_v
use fs_continuity_mod, only : W3

implicit none

Expand Down Expand Up @@ -86,18 +92,25 @@ module atlt_transport_field_alg_mod

! Variables used to handle calculations for fields stored in tl_transport_controller
integer(kind=i_def) :: mesh_id
type(transport_controller_type), pointer :: transport_controller
type(transport_controller_type), pointer :: pert_transport_controller
type(transport_controller_type), pointer :: ls_transport_controller
type(transport_metadata_type), pointer :: transport_metadata
type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp2
type(r_tran_field_type), dimension(:), allocatable :: fpc_pert_wind_ref_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_2_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_2_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_3_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_3_inp
type(r_tran_field_type) :: wind_pc_h_inp
type(r_tran_field_type) :: wind_pc_v_inp
type(r_tran_field_type) :: wind_pc_3d_inp
type(r_tran_field_type) :: tctr_field_n_inp
type(r_tran_field_type), dimension(:), allocatable :: tctr_flux_inp
type(function_space_type), pointer :: vector_space_w3_ptr

! Test parameters and variables
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
Expand All @@ -106,11 +119,16 @@ module atlt_transport_field_alg_mod

mesh_id = mesh%get_id()
call setup_test_tl_transport_controller( mesh, model_clock, tl_transport_controller, field_n, field_n_fs )
transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller()
ls_transport_controller => tl_transport_controller%get_ls_wind_pert_rho_controller()
pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller()
transport_metadata => pert_transport_controller%get_transport_metadata()

! Initialising fields
call init_counter_fieldvals( mesh, &
tctr_field_n_inp, &
tctr_flux_inp, &
pert_transport_controller )
call init_flux_pc_fieldvals( mesh, &
1_i_def, &
fpc_ls_wind_ref_flux_inp, &
Expand All @@ -123,6 +141,12 @@ module atlt_transport_field_alg_mod
dummy_ref_field_2_inp, &
dummy_ref_mass_2_inp, &
pert_transport_controller )
call init_flux_pc_fieldvals( mesh, &
1_i_def, &
fpc_ls_wind_ref_flux_inp2, &
dummy_ref_field_3_inp, &
dummy_ref_mass_3_inp, &
transport_controller )
call init_wind_pc_fieldvals( mesh, &
wind_pc_h_inp, &
direction_h, &
Expand All @@ -136,6 +160,11 @@ module atlt_transport_field_alg_mod
direction_3d, &
pert_transport_controller )

vector_space_w3_ptr => function_space_collection%get_fs( &
mesh, element_order_h, element_order_v, W3 &
)
call field_n%initialise(vector_space = vector_space_w3_ptr)

call field_n%copy_field_properties( field_np1 )
call field_n%copy_field_properties( ls_field_n )

Expand All @@ -147,6 +176,7 @@ module atlt_transport_field_alg_mod

! Initialise values and call the tangent-linear alg.
call invoke( setval_random( field_np1 ), &
setval_random( field_n), &
setval_x( field_np1_input, field_np1 ), &
setval_x( field_n_input, field_n ), &
setval_random( ls_field_n ) )
Expand Down Expand Up @@ -179,6 +209,7 @@ module atlt_transport_field_alg_mod
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_h )
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_v )
call wind_pc_dir_prod_rdef( inner1, pert_transport_controller, mesh_id, direction_3d )
call counter_flux_prod_rdef( inner1, pert_transport_controller )

! Scaling fields
call invoke( inc_a_times_X( field_np1_sf, field_np1 ), &
Expand Down Expand Up @@ -210,6 +241,7 @@ module atlt_transport_field_alg_mod
call wind_pc_dir_inp_prod_rdef( inner2, pert_transport_controller, mesh_id, direction_h, wind_pc_h_inp )
call wind_pc_dir_inp_prod_rdef( inner2, pert_transport_controller, mesh_id, direction_v, wind_pc_v_inp )
call wind_pc_dir_inp_prod_rdef( inner2, pert_transport_controller, mesh_id, direction_3d, wind_pc_3d_inp )
call counter_flux_inp_prod_rdef( inner2, pert_transport_controller, tctr_flux_inp )

call tl_transport_controller%finalise()
if ( allocated(fpc_ls_wind_ref_flux_inp) ) deallocate( fpc_ls_wind_ref_flux_inp )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,9 @@ module init_from_controller_alg_mod
if ( flux_ptr%is_initialised() ) then
call invoke( setval_X( counter_flux_inp(step), flux_ptr ) )
else
call invoke( setval_c( counter_flux_inp(step), 0.0_r_tran ) )
call counter_flux_inp(step)%copy_field_properties(flux_ptr)
call invoke( setval_random( flux_ptr ), &
setval_X( counter_flux_inp(step), flux_ptr ) )
end if

end do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,16 +97,20 @@ module atlt_mol_conservative_alg_mod
integer(kind=i_def) :: mesh_id
type(transport_controller_type), pointer :: pert_transport_controller
type(transport_controller_type), pointer :: ls_transport_controller
type(transport_controller_type), pointer :: transport_controller
type(field_type) :: tctr_field_n
type(function_space_type), pointer :: tctr_field_n_vs
type(field_type) :: tctr_field_n_inp
type(r_tran_field_type), dimension(:), allocatable :: tctr_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: fpc_pert_wind_ref_flux_inp
type(r_tran_field_type), dimension(:), allocatable :: fpc_ls_wind_ref_flux_inp2
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_1_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_2_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_2_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_field_3_inp
type(r_tran_field_type), dimension(:), allocatable :: dummy_ref_mass_3_inp
type(r_tran_field_type) :: wind_pc_h_inp
type(r_tran_field_type) :: wind_pc_v_inp
type(r_tran_field_type) :: wind_pc_3d_inp
Expand All @@ -118,6 +122,7 @@ module atlt_mol_conservative_alg_mod

mesh_id = mesh%get_id()
call setup_test_tl_transport_controller( mesh, model_clock, tl_transport_controller, tctr_field_n, tctr_field_n_vs )
transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller()
ls_transport_controller => tl_transport_controller%get_ls_wind_pert_rho_controller()
pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller()

Expand All @@ -126,6 +131,12 @@ module atlt_mol_conservative_alg_mod
tctr_field_n_inp, &
tctr_flux_inp, &
pert_transport_controller )
call init_flux_pc_fieldvals( mesh, &
1_i_def, &
fpc_ls_wind_ref_flux_inp2, &
dummy_ref_field_3_inp, &
dummy_ref_mass_3_inp, &
transport_controller )
call init_flux_pc_fieldvals( mesh, &
1_i_def, &
fpc_ls_wind_ref_flux_inp, &
Expand Down
5 changes: 3 additions & 2 deletions applications/linear_model/example/configuration.nml
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ write_minmax_tseries=.false.,
fixed_ls=.false.
pert_option='analytic',
l_stabilise_bl=.false.,
transport_efficiency=.false.,
/
&logging
run_log_level='info',
Expand Down Expand Up @@ -262,11 +263,11 @@ panel_edge_high_order=.true.,
panel_edge_treatment='none'
reversible=.false.,.false.,.false.,.false.,.false.
runge_kutta_method='ssp3'
scheme=1,1,1,1,1
scheme=5*3
si_outer_transport='none',
slice_order='parabola'
special_edges_monotone=5*1
splitting=1,1,1,1,1
splitting=5*2
substep_transport='off'
theta_dispersion_correction=.false.
theta_variable='dry'
Expand Down
4 changes: 2 additions & 2 deletions rose-stem/app/adjoint_tests/rose-app.conf
Original file line number Diff line number Diff line change
Expand Up @@ -1333,11 +1333,11 @@ panel_edge_treatment='none'
profile_size=5
reversible=5*.false.
runge_kutta_method='ssp3'
scheme=5*1
scheme=5*3
si_outer_transport='none'
slice_order='parabola'
special_edges_monotone=5*1
splitting=5*1
splitting=5*2
substep_transport='off'
theta_dispersion_correction=.false.
theta_variable='dry'
Expand Down
2 changes: 2 additions & 0 deletions rose-stem/app/linear_model/opt/rose-app-runge-kutta.conf
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,6 @@ cfl_mol_2d_stab=2.0
cfl_mol_3d_stab=2.0
max_vert_cfl_calc='uniform'
runge_kutta_method='ssp4'
scheme=5*1
splitting=5*1
!!wind_mono_top_depth=0
2 changes: 2 additions & 0 deletions rose-stem/app/linear_model/opt/rose-app-semi-implicit.conf
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,5 @@ tau_u=0.5

[namelist:transport]
!!wind_mono_top_depth=0
scheme=5*1
splitting=5*1
5 changes: 3 additions & 2 deletions rose-stem/app/linear_model/rose-app.conf
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@ ls_read_w2h=.false.
max_bl_stabilisation=0.75
n_bl_levels_to_stabilise=15
pert_option='file'
transport_efficiency=.true.

[namelist:logging]
log_to_rank_zero_only=.false.
Expand Down Expand Up @@ -1376,11 +1377,11 @@ panel_edge_treatment='none'
profile_size=5
reversible=.true.,.true.,.false.,.true.,.true.
runge_kutta_method='ssp3'
scheme=5*1
scheme=5*3
si_outer_transport='none'
slice_order='parabola'
special_edges_monotone=5*1
splitting=5*1
splitting=5*2
substep_transport='off'
theta_dispersion_correction=.false.
theta_variable='dry'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Inner product checksum rho = 3FA7A1197E0CB9A0
Inner product checksum theta = 4161FFC69BF205C3
Inner product checksum u = 4569B9484E575B5E
Inner product checksum mr1 = 3F36C0A882D88E66
Inner product checksum mr2 = 3EEADFD85794EA13
Inner product checksum mr3 = 3EDFEC0C984D5704
Inner product checksum mr4 = 3EED3A950512EB1A
Inner product checksum rho = 3FA79A9D0614EEEE
Inner product checksum theta = 4162215D8ED8A125
Inner product checksum u = 456A083CF999EC55
Inner product checksum mr1 = 3F36D11B3C65CF3F
Inner product checksum mr2 = 3EEAE32B46C09D7B
Inner product checksum mr3 = 3EDFEC26C0DD3244
Inner product checksum mr4 = 3EED3B0E06CBD627
Inner product checksum mr5 = 0
Inner product checksum mr6 = 0
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Inner product checksum rho = 3F95A1DDD2EC7839
Inner product checksum theta = 414000E886CBFB32
Inner product checksum u = 452CCCFAA0BBF41E
Inner product checksum mr1 = 3F2D2183BE8E5C80
Inner product checksum mr2 = 3EDF53A45356ADEA
Inner product checksum mr3 = 3ED26AEF2D8453B5
Inner product checksum mr4 = 3EE009842E269AF6
Inner product checksum rho = 3F95ACC94441A964
Inner product checksum theta = 413FD47788AE2B0E
Inner product checksum u = 452CBAADFF659374
Inner product checksum mr1 = 3F2D499F1DCEDE0B
Inner product checksum mr2 = 3EDF578E9B65451B
Inner product checksum mr3 = 3ED26AFC441BB781
Inner product checksum mr4 = 3EE00986BD98837B
Inner product checksum mr5 = 0
Inner product checksum mr6 = 0
Loading