From 1e7bab935adb76edd22133d6bbef83f665eb373e Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:24:36 +0000 Subject: [PATCH 01/19] Changes from fcm - splitmol --- .../adjoint_tests/example/configuration.nml | 4 +- .../adjt_end_transport_step_alg_mod.x90 | 11 +- .../atlt_end_transport_step_alg_mod.x90 | 18 +- .../control/atlt_transport_field_alg_mod.x90 | 40 ++- .../init_from_controller_alg_mod.x90 | 4 +- .../mol/atlt_mol_conservative_alg_mod.x90 | 11 + .../linear_model/example/configuration.nml | 4 +- rose-stem/app/adjoint_tests/rose-app.conf | 4 +- rose-stem/app/linear_model/rose-app.conf | 4 +- .../common/adj_end_transport_step_alg_mod.x90 | 9 + .../common/adj_flux_precomputations_mod.x90 | 2 +- .../common/atl_end_transport_step_alg_mod.x90 | 9 +- .../control/atl_split_transport_mod.x90 | 336 ++++++++++++++++++ .../control/atl_transport_field_mod.f90 | 5 +- .../mol/atl_mol_advective_alg_mod.x90 | 19 +- .../mol/atl_mol_conservative_alg_mod.x90 | 17 +- .../common/end_of_transport_step_alg_mod.x90 | 1 + .../common/flux_precomputations_mod.x90 | 2 +- .../common/transport_counter_mod.x90 | 74 +++- .../control/tl_split_transport_mod.x90 | 334 +++++++++++++++++ .../control/tl_transport_field_mod.f90 | 7 +- .../mol/tl_mol_advective_alg_mod.x90 | 20 +- .../mol/tl_mol_conservative_alg_mod.x90 | 17 +- 23 files changed, 898 insertions(+), 54 deletions(-) create mode 100644 science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 create mode 100644 science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 diff --git a/applications/adjoint_tests/example/configuration.nml b/applications/adjoint_tests/example/configuration.nml index 84ce2a779..9dca2765c 100644 --- a/applications/adjoint_tests/example/configuration.nml +++ b/applications/adjoint_tests/example/configuration.nml @@ -297,11 +297,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', diff --git a/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 index 9342ce993..610292851 100644 --- a/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 @@ -21,7 +21,7 @@ module adjt_end_transport_step_alg_mod use model_clock_mod, only : model_clock_type use finite_element_config_mod, only : element_order_h, & element_order_v - use fs_continuity_mod, only : W2 + use fs_continuity_mod, only : W2, W2V use function_space_collection_mod, only : function_space_collection use setup_test_alg_mod, only : setup_test_tl_transport_controller use init_from_controller_alg_mod, only : init_counter_fieldvals @@ -78,6 +78,7 @@ module adjt_end_transport_step_alg_mod ! Variables for initialising fields type(function_space_type), pointer :: vector_space_w2_ptr + type(function_space_type), pointer :: vector_space_w2v_ptr ! Inner products real(kind=r_tran) :: inner1 @@ -108,13 +109,15 @@ 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) call sum_flux%initialise( vector_space = vector_space_w2_ptr ) - call flux_last_step%initialise( vector_space = vector_space_w2_ptr ) + call flux_last_step%initialise( vector_space = vector_space_w2v_ptr ) call sum_flux_input%initialise( vector_space = vector_space_w2_ptr ) - call flux_last_step_input%initialise( vector_space = vector_space_w2_ptr ) + call flux_last_step_input%initialise( vector_space = vector_space_w2v_ptr ) sum_flux_inner_prod = 0.0_r_def flux_last_step_inner_prod = 0.0_r_def diff --git a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 index 08a3b7a2b..c2b259cb4 100644 --- a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 @@ -21,12 +21,13 @@ 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 use setup_test_alg_mod, only : setup_test_tl_transport_controller use transport_metadata_collection_mod, only : transport_metadata_collection use transport_metadata_mod, only : transport_metadata_type @@ -233,6 +234,7 @@ 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) :: num_split_steps type(function_space_type), pointer :: vector_space_w2_ptr type(function_space_type), pointer :: vector_space_w3_ptr @@ -284,9 +286,17 @@ 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 & - ) + ! if split scheme, w2v else w2 + num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) + if (num_split_steps > 1) then + vector_space_w2_ptr => function_space_collection%get_fs( & + mesh, element_order_h, element_order_v, W2V & + ) + else + vector_space_w2_ptr => function_space_collection%get_fs( & + mesh, element_order_h, element_order_v, W2 & + ) + end if vector_space_w3_ptr => function_space_collection%get_fs( & mesh, element_order_h, element_order_v, W3 & ) diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 index d1120743d..379ca3838 100644 --- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 @@ -27,14 +27,20 @@ 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 private @@ -86,19 +92,26 @@ 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 real(kind=r_def) :: machine_tol @@ -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, & @@ -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, & @@ -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 ) @@ -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 ) ) @@ -179,7 +209,8 @@ 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 ), & inc_a_times_X( field_n_sf, field_n ) ) @@ -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 ) diff --git a/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90 index 17e300fa3..d33548660 100644 --- a/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/init_from_controller_alg_mod.x90 @@ -222,7 +222,9 @@ module init_from_controller_alg_mod if ( flux_ptr%is_initialised() ) then call invoke( setval_X( counter_flux_inp(step), flux_ptr ) ) else - call invoke( setval_c( counter_flux_inp(step), 0.0_r_tran ) ) + call counter_flux_inp(step)%copy_field_properties(flux_ptr) + call invoke( setval_random( flux_ptr ), & + setval_X( counter_flux_inp(step), flux_ptr ) ) end if end do diff --git a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90 index 6f2a2cabc..c33a61db0 100644 --- a/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/mol/atlt_mol_conservative_alg_mod.x90 @@ -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 @@ -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() @@ -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, & diff --git a/applications/linear_model/example/configuration.nml b/applications/linear_model/example/configuration.nml index 5ed21fc6c..9d52e8011 100644 --- a/applications/linear_model/example/configuration.nml +++ b/applications/linear_model/example/configuration.nml @@ -262,11 +262,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' diff --git a/rose-stem/app/adjoint_tests/rose-app.conf b/rose-stem/app/adjoint_tests/rose-app.conf index e1950c137..a59b1afd1 100644 --- a/rose-stem/app/adjoint_tests/rose-app.conf +++ b/rose-stem/app/adjoint_tests/rose-app.conf @@ -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' diff --git a/rose-stem/app/linear_model/rose-app.conf b/rose-stem/app/linear_model/rose-app.conf index f5ec84feb..51287246f 100644 --- a/rose-stem/app/linear_model/rose-app.conf +++ b/rose-stem/app/linear_model/rose-app.conf @@ -1376,11 +1376,11 @@ panel_edge_treatment='none' profile_size=5 reversible=.true.,.true.,.false.,.true.,.true. runge_kutta_method='ssp3' -scheme=5*1 +scheme=5*3 si_outer_transport='none' slice_order='parabola' special_edges_monotone=5*1 -splitting=5*1 +splitting=5*2 substep_transport='off' theta_dispersion_correction=.false. theta_variable='dry' diff --git a/science/adjoint/source/algorithm/transport/common/adj_end_transport_step_alg_mod.x90 b/science/adjoint/source/algorithm/transport/common/adj_end_transport_step_alg_mod.x90 index eb4c4e7ba..3a35463d6 100644 --- a/science/adjoint/source/algorithm/transport/common/adj_end_transport_step_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/common/adj_end_transport_step_alg_mod.x90 @@ -97,6 +97,14 @@ contains hori_flux => transport_counter%get_flux(2) call sum_vert_flux%initialise(w2v_fs) + if (.not. hori_flux%is_initialised() ) then + call hori_flux%initialise(w2h_fs) + call invoke( setval_c( hori_flux, 0.0_r_tran ) ) + end if + if (.not. old_flux%is_initialised() ) then + call old_flux%initialise(w2v_fs) + call invoke( setval_c( old_flux, 0.0_r_tran ) ) + end if call invoke( setval_c( sum_vert_flux, 0.0_r_tran ), & adj_combine_w2_field_kernel_type( sum_flux, hori_flux, & sum_vert_flux, & @@ -104,6 +112,7 @@ contains face_selector_ns ), & inc_X_plus_Y( old_flux, sum_vert_flux ), & inc_X_plus_Y( flux_last_step, sum_vert_flux ), & + setval_c( sum_flux, 0.0_r_tran ), & setval_c( sum_vert_flux, 0.0_r_tran ) ) ! General case for any splitting diff --git a/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 b/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 index f5c0dcb86..03b8376fd 100644 --- a/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 +++ b/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 @@ -141,7 +141,7 @@ module adj_flux_precomputations_mod class(flux_precomputations_type), intent(inout) :: flux_pc integer(kind=i_def), intent(in) :: step - type(r_tran_field_type), intent(in) :: ref_flux + type(r_tran_field_type), intent(inout) :: ref_flux ! Local variables integer(kind=i_def) :: splitting diff --git a/science/adjoint/source/algorithm/transport/common/atl_end_transport_step_alg_mod.x90 b/science/adjoint/source/algorithm/transport/common/atl_end_transport_step_alg_mod.x90 index 6f0cf3a45..ef1cfa971 100644 --- a/science/adjoint/source/algorithm/transport/common/atl_end_transport_step_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/common/atl_end_transport_step_alg_mod.x90 @@ -38,7 +38,6 @@ module atl_end_transport_step_alg_mod use transport_metadata_mod, only: transport_metadata_type use adj_flux_precomputations_mod, only: adj_initialise_step - implicit none private @@ -223,14 +222,18 @@ contains if (.not. final_split_step) then flux_ptr => transport_counter%get_flux( step ) - call invoke( inc_X_plus_Y( flux, flux_ptr ), & - setval_c( flux_ptr, 0.0_r_tran ) ) + call invoke( inc_X_plus_Y( flux, flux_ptr ) ) end if ! Combine fluxes from each part of the calculation call invoke( inc_X_plus_Y( flux_pert_wind, flux ), & inc_X_plus_Y( flux_ls_wind, flux ) ) + if (.not. final_split_step) then + flux_ptr => transport_counter%get_flux( step ) + call invoke( setval_c( flux_ptr, 0.0_r_tran ) ) + end if + end subroutine atl_end_conservative_step_alg end module atl_end_transport_step_alg_mod diff --git a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 new file mode 100644 index 000000000..6cf636048 --- /dev/null +++ b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 @@ -0,0 +1,336 @@ +!----------------------------------------------------------------------------- +! (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 the tangent linear version of split_transport + +module atl_split_transport_mod + + use constants_mod, only: i_def, r_tran + use r_tran_field_mod, only: r_tran_field_type + use log_mod, only: log_event, LOG_LEVEL_ERROR + use split_transport_utils_mod, only: get_splitting_direction, & + get_splitting_fraction, & + get_num_split_steps + use split_transport_mod, only: split_transport_field + + ! Transport control infrastructure + use transport_controller_mod, only: transport_controller_type + use tl_transport_controller_mod, only: tl_transport_controller_type + use transport_counter_mod, only: transport_counter_type + use transport_enumerated_types_mod, only: direction_h, & + direction_v, & + split_method_null, & + split_method_mol, & + split_method_ffsl, & + split_method_sl, & + equation_form_conservative, & + equation_form_advective, & + equation_form_consistent + use transport_metadata_mod, only: transport_metadata_type + + ! Algorithms + use end_of_transport_step_alg_mod, only: end_of_conservative_step_alg, & + end_of_consistent_step_alg, & + end_of_advective_step_alg + + implicit none + + private + + public :: atl_split_transport_control + public :: atl_split_transport_field + +contains + + !============================================================================= + !> @brief Controls vertical/horizontal split transport. + !> @details Manages the vertical/horizontal splitting of the split transport + !! scheme by choosing the splitting type and calling the individual + !! vertical and horizontal split components. + !> @param[in,out] field_np1 ACTIVE Field to return at end + !> @param[in,out] field_n ACTIVE Field at the start + !> @param[in] ls_field_n PASSIVE LS Field at the start + !> @param[in,out] tl_transport_controller + !! Encapsulating object containing the + !! transport counter and precomputations + subroutine atl_split_transport_control(field_np1, field_n, ls_field_n, & + tl_transport_controller) + + implicit none + + ! Arguments + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), target, intent(inout) :: field_n + type(r_tran_field_type), target, intent(in) :: ls_field_n + type(tl_transport_controller_type), intent(inout) :: tl_transport_controller + + ! Internal variables + integer(kind=i_def) :: num_split_steps + integer(kind=i_def) :: split_step_count + type(r_tran_field_type), allocatable :: ls_field_np1(:) + type(r_tran_field_type), target :: field_tmp + type(r_tran_field_type), pointer :: field_ptr + type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter + type(transport_metadata_type), pointer :: transport_metadata + type(transport_controller_type), pointer :: pert_transport_controller + type(transport_controller_type), pointer :: ls_transport_controller + logical :: efficiency + real(kind=r_tran) :: dt_substep + integer(kind=i_def) :: num_substeps + + efficiency = .false. + + ! ------------------------------------------------------------------------ ! + ! NONLINEAR (LS) + ! ------------------------------------------------------------------------ ! + + ls_transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller() + transport_metadata => ls_transport_controller%get_transport_metadata() + ls_transport_counter => ls_transport_controller%get_transport_counter() + + ! Initialise fields + num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) + allocate(ls_field_np1(num_split_steps + 1)) + do split_step_count = 1, num_split_steps + 1 + call field_n%copy_field_properties(ls_field_np1(split_step_count)) + end do + + if ( .not. efficiency ) then + + ! When we have multiple split steps, we need an intermediate field for the + ! field at the start of each substeps + ! field_ptr points to the field at the start of each split step + call invoke( setval_X(ls_field_np1(1), ls_field_n) ) + + if (num_split_steps > 1) then + call field_n%copy_field_properties(field_tmp) + call invoke( setval_X(field_tmp, ls_field_n) ) + field_ptr => field_tmp + else + field_ptr => ls_field_n + end if + + do split_step_count = 1, num_split_steps + call split_transport_field( ls_field_np1(split_step_count+1), & + field_ptr, & + ls_transport_controller & + ) + + if (split_step_count < num_split_steps) then + call invoke( setval_X(field_tmp, ls_field_np1(split_step_count+1) ) ) + + ! Increment split step counter + call ls_transport_counter%inc_split_step_counter() + end if + end do + else + do split_step_count = 1, num_split_steps + 1 + call invoke( setval_X(ls_field_np1(split_step_count), ls_field_n) ) + end do + end if + + ! ------------------------------------------------------------------------ ! + ! LINEAR + ! ------------------------------------------------------------------------ ! + pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() + transport_metadata => pert_transport_controller%get_transport_metadata() + transport_counter => pert_transport_controller%get_transport_counter() + + dt_substep = transport_counter%get_dt_substep() + num_substeps = transport_counter%get_num_substeps() + call transport_counter%adj_initialise(transport_metadata, dt_substep, num_substeps ) + call ls_transport_counter%adj_initialise(transport_metadata, dt_substep, num_substeps ) + + ! Initialise fields + num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) + + call field_n%copy_field_properties(field_tmp) + + ! Set fields to zero + call invoke( setval_C(field_tmp, 0.0_r_def ) ) + + ! Loop backwards + do split_step_count = num_split_steps, 1, -1 + + if (split_step_count < num_split_steps) then + + ! Increment split step counter + call transport_counter%dec_split_step_counter() + call ls_transport_counter%dec_split_step_counter() + + call invoke( inc_X_plus_Y(field_np1, field_tmp ) ) + call invoke( setval_C(field_tmp, 0.0_r_def ) ) + + end if + + call atl_split_transport_field( & + field_np1, field_tmp, ls_field_np1(split_step_count), & + tl_transport_controller & + ) + call invoke( setval_C(field_np1, 0.0_r_def ) ) + + end do + + call invoke( setval_C(field_np1, 0.0_r_def ) ) + call invoke( inc_X_plus_Y(field_n, field_tmp) ) + call invoke( setval_C(field_tmp, 0.0_r_def ) ) + + deallocate( ls_field_np1 ) + + end subroutine atl_split_transport_control + + !============================================================================= + !> @brief Does either vertical or horizontal transport of a field. + !> @details Performs a vertical or horizontal transport step, solving the + !! transport equation for a (multidata) field. + !> @param[in,out] field_np1 ACTIVE Field to return at end + !> @param[in,out] field_n ACTIVE Field at the start + !> @param[in] ls_field_n PASSIVE Field at the start + !> @param[in,out] tl_transport_controller + !! Encapsulating object containing the + !! transport counter and precomputations + subroutine atl_split_transport_field(field_np1, field_n, ls_field_n, tl_transport_controller) + + use atl_mol_conservative_alg_mod, only: atl_mol_conservative_alg + use atl_mol_advective_alg_mod, only: atl_mol_advective_alg + + implicit none + + ! Arguments + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), intent(inout) :: field_n + type(r_tran_field_type), intent(in) :: ls_field_n + type(tl_transport_controller_type), intent(inout) :: tl_transport_controller + + ! Internal variables + integer(kind=i_def) :: method, direction + type(transport_counter_type), pointer :: transport_counter + type(transport_metadata_type), pointer :: transport_metadata + type(transport_controller_type), pointer :: pert_transport_controller + + pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() + transport_counter => pert_transport_controller%get_transport_counter() + transport_metadata => pert_transport_controller%get_transport_metadata() + + ! -------------------------------------------------------------------------! + ! Set up method based on direction + ! -------------------------------------------------------------------------! + direction = get_splitting_direction( & + transport_metadata%get_splitting(), & + transport_counter%get_split_step_of_substep_counter() & + ) + + select case ( direction ) + case ( direction_h ) + method = transport_metadata%get_horizontal_method() + case ( direction_v ) + method = transport_metadata%get_vertical_method() + case default + call log_event('Split transport direction not recognised', LOG_LEVEL_ERROR) + end select + + ! -------------------------------------------------------------------------! + ! Choose method, and then choose equation + ! -------------------------------------------------------------------------! + select case ( method ) + + ! -------------------------------------------------------------------------! + ! Null step + ! -------------------------------------------------------------------------! + case ( split_method_null ) + call log_event( & + 'ADJ: Split method null not coded', & + LOG_LEVEL_ERROR & + ) + + ! -------------------------------------------------------------------------! + ! Method of Lines step + ! -------------------------------------------------------------------------! + case ( split_method_mol ) + ! Choose form of transport equation + select case ( transport_metadata%get_equation_form() ) + case ( equation_form_conservative ) + call atl_mol_conservative_alg( & + field_np1, field_n, ls_field_n, tl_transport_controller & + ) + case ( equation_form_advective ) + call atl_mol_advective_alg( & + field_np1, field_n, ls_field_n, tl_transport_controller & + ) + case ( equation_form_consistent ) + call log_event( & + 'ADJ: MoL Consistent not coded yet', & + LOG_LEVEL_ERROR & + ) + case default + call log_event( & + 'Trying to solve unrecognised form of transport equation', & + LOG_LEVEL_ERROR & + ) + + end select + + ! -------------------------------------------------------------------------! + ! Flux-Form Semi-Lagrangian step + ! -------------------------------------------------------------------------! + case ( split_method_ffsl ) + ! All equation forms have the same control method + call log_event( & + 'ADJ: FFSL not coded yet', & + LOG_LEVEL_ERROR & + ) + ! -------------------------------------------------------------------------! + ! Semi-Lagrangian step + ! -------------------------------------------------------------------------! + case ( split_method_sl ) + ! Choose direction + select case ( direction ) + + case ( direction_h ) + ! Horizontal SL only for advective form + if ( transport_metadata%get_equation_form() /= equation_form_advective ) then + call log_event( & + 'Horizontal semi-Lagrangian is only for advective form', & + LOG_LEVEL_ERROR & + ) + end if + call log_event( & + 'ADJ: Horizontal SL not coded yet', & + LOG_LEVEL_ERROR & + ) + + case ( direction_v ) + ! Choose form of transport equation for vertical + select case ( transport_metadata%get_equation_form() ) + + case ( equation_form_conservative ) + call log_event( & + 'TL: Vertical SL conservative not coded yet', & + LOG_LEVEL_ERROR & + ) + case ( equation_form_advective ) + call log_event( & + 'ADJ: Vertical SL advective not coded yet', & + LOG_LEVEL_ERROR & + ) + case default + call log_event( & + 'Trying to solve unrecognised form of transport equation', & + LOG_LEVEL_ERROR & + ) + end select + end select + + case default + call log_event( & + 'Trying to transport with unrecognised scheme', & + LOG_LEVEL_ERROR & + ) + end select + + end subroutine atl_split_transport_field + +end module atl_split_transport_mod diff --git a/science/adjoint/source/algorithm/transport/control/atl_transport_field_mod.f90 b/science/adjoint/source/algorithm/transport/control/atl_transport_field_mod.f90 index a00c2ee0b..2a7a05cf9 100644 --- a/science/adjoint/source/algorithm/transport/control/atl_transport_field_mod.f90 +++ b/science/adjoint/source/algorithm/transport/control/atl_transport_field_mod.f90 @@ -20,6 +20,7 @@ module atl_transport_field_mod equation_form_advective use atl_mol_conservative_alg_mod, only: atl_mol_conservative_alg use atl_mol_advective_alg_mod, only: atl_mol_advective_alg + use atl_split_transport_mod, only: atl_split_transport_control use transport_controller_mod, only: transport_controller_type use tl_transport_controller_mod, only: tl_transport_controller_type use transport_counter_mod, only: transport_counter_type @@ -112,8 +113,8 @@ subroutine atl_transport_field(field_np1, field_n, ls_field_n, & ! Some split horizontal/vertical transport scheme ! -------------------------------------------------------------------------! case ( scheme_split ) - call log_event('Split transport not implemented for tangent-linear app', & - LOG_LEVEL_ERROR) + call atl_split_transport_control(field_np1, field_n, ls_field_n, & + tl_transport_controller) case default call log_event('Trying to transport with unrecognised scheme', & diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 index cec84c386..be746dc00 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 @@ -71,7 +71,10 @@ contains type(field_type), allocatable :: rk_field(:) real(kind=r_def), allocatable :: rk_weights(:,:) type(transport_metadata_type), pointer :: transport_metadata + type(transport_metadata_type), pointer :: ls_transport_metadata type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter + type(transport_controller_type), pointer :: transport_controller type(transport_controller_type), pointer :: ls_transport_controller type(transport_controller_type), pointer :: pert_transport_controller type(wind_precomputations_type), pointer :: ls_wind_precomputations @@ -81,10 +84,16 @@ contains ! Extract transport objects and initialise temporary fields ! ------------------------------------------------------------------------ ! mesh => field%get_mesh() + 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() + ls_transport_metadata => transport_controller%get_transport_metadata() + transport_counter => pert_transport_controller%get_transport_counter() + ls_transport_counter => transport_controller%get_transport_counter() + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() @@ -158,9 +167,9 @@ contains end do ! Compute update: rhs = u.grad(rhs_field) - call advective_and_flux_alg(dummy, rhs, rhs_field, ls_field_n, & - ls_advecting_wind, direction, & - transport_metadata, final_rk_stage, & + call advective_and_flux_alg(dummy, rhs, rhs_field, ls_field_n, & + ls_advecting_wind, direction, & + ls_transport_metadata, final_rk_stage, & dt_mol_substep, .false., .true. ) ! Update field: f = f^n - dt*rhs @@ -170,8 +179,8 @@ contains end do ! End of step: if necessary enforce min val and overwrite in blending zone - call end_of_advective_step_alg( & - ls_field_np1, ls_field_n, transport_counter, transport_metadata & + call end_of_advective_step_alg( & + ls_field_np1, ls_field_n, ls_transport_counter, ls_transport_metadata & ) ! -------------------------------------------------------------------------- diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 index b5ed18d7e..85c0b374c 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 @@ -26,7 +26,7 @@ module atl_mol_conservative_alg_mod use runge_kutta_init_mod, only: get_rk_transport_weights use split_transport_utils_mod, only: get_num_split_steps, & get_splitting_direction - use transport_constants_mod, only: get_directional_im3_div + use transport_constants_mod, only: get_directional_im3_div_r_tran use transport_controller_mod, only: transport_controller_type use tl_transport_controller_mod, only: tl_transport_controller_type use transport_counter_mod, only: transport_counter_type @@ -102,7 +102,9 @@ module atl_mol_conservative_alg_mod type(field_type), allocatable :: rk_field(:) real(kind=r_def), allocatable :: rk_weights(:,:) type(transport_metadata_type), pointer :: transport_metadata + type(transport_metadata_type), pointer :: ls_transport_metadata type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter type(transport_controller_type), pointer :: transport_controller type(transport_controller_type), pointer :: ls_transport_controller type(transport_controller_type), pointer :: pert_transport_controller @@ -122,11 +124,18 @@ module atl_mol_conservative_alg_mod 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() + ls_transport_metadata => transport_controller%get_transport_metadata() + transport_counter => pert_transport_controller%get_transport_counter() + ls_transport_counter => transport_controller%get_transport_counter() + flux_precomputations => transport_controller%get_flux_precomputations() + ls_wind_flux_precomp => ls_transport_controller%get_flux_precomputations() pert_wind_flux_precomp => pert_transport_controller%get_flux_precomputations() + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() @@ -142,7 +151,7 @@ module atl_mol_conservative_alg_mod dt_mol_substep = ls_wind_precomputations%get_dt_mol_substep( & mesh%get_id(), direction, splitting, step & ) - div => get_directional_im3_div(mesh_id, direction) + div => get_directional_im3_div_r_tran(mesh_id, direction) call get_rk_transport_weights(nstage, rk_weights, runge_kutta_method) allocate( rk_field(nstage) ) @@ -240,7 +249,7 @@ module atl_mol_conservative_alg_mod call advective_and_flux_alg(flux_step, adv_inc, rhs_field, ls_field_n, & ls_advecting_wind, direction, & - transport_metadata, final_rk_stage, & + ls_transport_metadata, final_rk_stage, & dt_mol_substep, do_flux, do_advective) if ( do_flux ) then @@ -283,7 +292,7 @@ module atl_mol_conservative_alg_mod ! increment, and may be adjusted to enforce min value or in blending zone call end_of_conservative_step_alg( & ls_field_np1, ls_field, ls_sum_flux, flux_precomputations, & - transport_counter, transport_metadata & + ls_transport_counter, ls_transport_metadata & ) ! ======================================================================== ! diff --git a/science/gungho/source/algorithm/transport/common/end_of_transport_step_alg_mod.x90 b/science/gungho/source/algorithm/transport/common/end_of_transport_step_alg_mod.x90 index 34ee74e25..ec2e5e80e 100644 --- a/science/gungho/source/algorithm/transport/common/end_of_transport_step_alg_mod.x90 +++ b/science/gungho/source/algorithm/transport/common/end_of_transport_step_alg_mod.x90 @@ -837,6 +837,7 @@ contains ! General case for any splitting else + call sum_hori_flux%initialise(w2h_fs) call sum_vert_flux%initialise(w2v_fs) diff --git a/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 b/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 index 993b71d38..c7535e2de 100644 --- a/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 +++ b/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 @@ -84,7 +84,7 @@ module flux_precomputations_alg_mod use transport_enumerated_types_mod, only: direction_h, & direction_v, & direction_3d - + implicit none private diff --git a/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 b/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 index 6e7dbe6a6..630fb12ae 100644 --- a/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 +++ b/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 @@ -40,6 +40,7 @@ module transport_counter_mod contains procedure, public :: initialise + procedure, public :: adj_initialise procedure, public :: get_field_n procedure, public :: set_field_n procedure, public :: get_flux @@ -51,6 +52,7 @@ module transport_counter_mod procedure, public :: get_num_split_steps_per_substep procedure, public :: get_dt_substep procedure, public :: get_outer_iteration + procedure, public :: dec_split_step_counter procedure, public :: inc_split_step_counter procedure, public :: inc_substep_counter procedure, public :: apply_cheap_update @@ -98,18 +100,70 @@ contains self%split_step_of_substep_counter = 1 self%substep_counter = 1 - if (allocated(self%flux)) deallocate(self%flux) - equation_form = transport_metadata%get_equation_form() ! Allocate arrays for dry fields if (equation_form == equation_form_conservative & - .or. equation_form == equation_form_consistent) then - allocate(self%flux(self%num_split_steps_per_substep-1)) + .or. equation_form == equation_form_consistent) then + if ( .not. allocated(self%flux)) then + allocate(self%flux(self%num_split_steps_per_substep-1)) + end if end if end subroutine initialise + !> @brief Initialises the transport_counter object, allocating flux fields + !! if necessary, ready for the adjoint model simulation + !> @details This is the same as initialise, but it prepares the code to be + !! run in reverse order, with the counter decreasing instead of + !! increasing. + !> @param[in] transport_metadata Object containing metadata describing + !! the options for transporting a variable + !> @param[in] dt_substep The time interval for a single substep + !> @param[in] num_substeps The number of total transport substeps to be + !! performed + !> @param[in] outer Optional, current iteration of the outer + !! loop of the semi-implicit time step + subroutine adj_initialise(self, transport_metadata, dt_substep, num_substeps, outer) + + implicit none + + class(transport_counter_type), intent(inout) :: self + type(transport_metadata_type), intent(in) :: transport_metadata + real(kind=r_tran), intent(in) :: dt_substep + integer(kind=i_def), intent(in) :: num_substeps + integer(kind=i_def), optional, intent(in) :: outer + + integer(kind=i_def) :: equation_form + + self%dt_substep = dt_substep + self%num_substeps = num_substeps + self%num_split_steps_per_substep = get_num_split_steps(transport_metadata%get_splitting()) + self%num_split_steps_per_whole_step = self%num_substeps * self%num_split_steps_per_substep + + if (present(outer)) then + self%outer = outer + else + self%outer = 0 + end if + + ! Initialise step counters to the last values (NOT 1) + self%split_step_of_whole_step_counter = self%num_split_steps_per_whole_step + self%split_step_of_substep_counter = self%num_split_steps_per_substep + self%substep_counter = num_substeps + + equation_form = transport_metadata%get_equation_form() + + ! Allocate arrays for dry fields + if (equation_form == equation_form_conservative & + .or. equation_form == equation_form_consistent) then + if ( .not. allocated(self%flux)) then + allocate(self%flux(self%num_split_steps_per_substep-1)) + end if + end if + + end subroutine adj_initialise + !> Public finalise method for the transport_counter subroutine finalise(self) @@ -314,7 +368,19 @@ contains ! ============================================================================ ! ! UTILITIES ! ============================================================================ ! + !> @brief Decreases the counter of transport split steps (for adjoint model) + subroutine dec_split_step_counter(self) + + implicit none + + class(transport_counter_type), target, intent(inout) :: self + + self%split_step_of_substep_counter = self%split_step_of_substep_counter - 1 + self%split_step_of_whole_step_counter = self%split_step_of_whole_step_counter - 1 + + end subroutine dec_split_step_counter + !> @brief Increments the counter of transport split steps subroutine inc_split_step_counter(self) diff --git a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 new file mode 100644 index 000000000..15d2d65a2 --- /dev/null +++ b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 @@ -0,0 +1,334 @@ +!----------------------------------------------------------------------------- +! (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 Tangent linear version of split_transport + +module tl_split_transport_mod + + use constants_mod, only: i_def, r_tran + use r_tran_field_mod, only: r_tran_field_type + use log_mod, only: log_event, LOG_LEVEL_ERROR + use split_transport_utils_mod, only: get_splitting_direction, & + get_splitting_fraction, & + get_num_split_steps + use split_transport_mod, only: split_transport_field + + ! Transport control infrastructure + use transport_controller_mod, only: transport_controller_type + use tl_transport_controller_mod, only: tl_transport_controller_type + use transport_counter_mod, only: transport_counter_type + use transport_enumerated_types_mod, only: direction_h, & + direction_v, & + split_method_null, & + split_method_mol, & + split_method_ffsl, & + split_method_sl, & + equation_form_conservative, & + equation_form_advective, & + equation_form_consistent + use transport_metadata_mod, only: transport_metadata_type + + ! Algorithms + use end_of_transport_step_alg_mod, only: end_of_conservative_step_alg, & + end_of_consistent_step_alg, & + end_of_advective_step_alg + + implicit none + + private + + public :: tl_split_transport_control + public :: tl_split_transport_field + +contains + + !============================================================================= + !> @brief Controls vertical/horizontal split transport. + !> @details Manages the vertical/horizontal splitting of the split transport + !! scheme by choosing the splitting type and calling the individual + !! vertical and horizontal split components. + !> @param[in,out] field_np1 ACTIVE Field to return at end + !> @param[in] field_n ACTIVE Field at the start + !> @param[in] ls_field_n PASSIVE LS Field at the start + !> @param[in,out] tl_transport_controller + !! Encapsulating object containing the + !! transport counter and precomputations + subroutine tl_split_transport_control(field_np1, field_n, ls_field_n, & + tl_transport_controller) + + implicit none + + ! Arguments + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), target, intent(in) :: field_n + type(r_tran_field_type), target, intent(in) :: ls_field_n + type(tl_transport_controller_type), intent(inout) :: tl_transport_controller + + ! Internal variables + integer(kind=i_def) :: num_split_steps + integer(kind=i_def) :: split_step_count + type(r_tran_field_type), allocatable :: ls_field_np1(:) + type(r_tran_field_type), target :: field_tmp + type(r_tran_field_type), pointer :: field_ptr + type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter + type(transport_metadata_type), pointer :: transport_metadata + type(transport_controller_type), pointer :: pert_transport_controller + type(transport_controller_type), pointer :: ls_transport_controller + logical :: efficiency + real(kind=r_tran) :: dt_substep + integer(kind=i_def) :: num_substeps + + efficiency = .false. + + ! ------------------------------------------------------------------------ ! + ! NONLINEAR (LS) + ! ------------------------------------------------------------------------ ! + + ls_transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller() + transport_metadata => ls_transport_controller%get_transport_metadata() + ls_transport_counter => ls_transport_controller%get_transport_counter() + + ! Initialise fields + num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) + allocate(ls_field_np1(num_split_steps + 1)) + do split_step_count = 1, num_split_steps + 1 + call field_n%copy_field_properties(ls_field_np1(split_step_count)) + end do + + if ( .not. efficiency ) then + + ! When we have multiple split steps, we need an intermediate field for the + ! field at the start of each substeps + ! field_ptr points to the field at the start of each split step + call invoke( setval_X(ls_field_np1(1), ls_field_n) ) + + if (num_split_steps > 1) then + call field_n%copy_field_properties(field_tmp) + call invoke( setval_X(field_tmp, ls_field_n) ) + field_ptr => field_tmp + else + field_ptr => ls_field_n + end if + + do split_step_count = 1, num_split_steps + call split_transport_field( ls_field_np1(split_step_count+1), & + field_ptr, & + ls_transport_controller & + ) + + if (split_step_count < num_split_steps) then + call invoke( setval_X(field_tmp, ls_field_np1(split_step_count+1) ) ) + + ! Increment split step counter + call ls_transport_counter%inc_split_step_counter() + end if + end do + + else + do split_step_count = 1, num_split_steps + 1 + call invoke( setval_X(ls_field_np1(split_step_count), ls_field_n) ) + end do + end if + + dt_substep = ls_transport_counter%get_dt_substep() + num_substeps = ls_transport_counter%get_num_substeps() + call ls_transport_counter%initialise(transport_metadata, dt_substep, num_substeps ) + + ! ------------------------------------------------------------------------ ! + ! LINEAR + ! ------------------------------------------------------------------------ ! + + pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() + transport_metadata => pert_transport_controller%get_transport_metadata() + transport_counter => pert_transport_controller%get_transport_counter() + + ! Initialise fields + num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) + + ! When we have multiple split steps, we need an intermediate field for the + ! field at the start of each substeps + ! field_ptr points to the field at the start of each split step + if (num_split_steps > 1) then + call field_n%copy_field_properties(field_tmp) + call invoke( setval_X(field_tmp, field_n) ) + field_ptr => field_tmp + else + field_ptr => field_n + end if + + do split_step_count = 1, num_split_steps + + call tl_split_transport_field( & + field_np1, field_ptr, ls_field_np1(split_step_count), & + tl_transport_controller & + ) + + if (split_step_count < num_split_steps) then + call invoke( setval_X(field_tmp, field_np1 ) ) + + ! Increment split step counter + call transport_counter%inc_split_step_counter() + call ls_transport_counter%inc_split_step_counter() + end if + + end do + + deallocate( ls_field_np1 ) + + end subroutine tl_split_transport_control + + !============================================================================= + !> @brief Does either vertical or horizontal transport of a field. + !> @details Performs a vertical or horizontal transport step, solving the + !! transport equation for a (multidata) field. + !> @param[in,out] field_np1 ACTIVE Field to return at end + !> @param[in] field_n ACTIVE Field at the start + !> @param[in] ls_field_n PASSIVE Field at the start + !> @param[in,out] tl_transport_controller + !! Encapsulating object containing the + !! transport counter and precomputations + subroutine tl_split_transport_field(field_np1, field_n, ls_field_n, tl_transport_controller) + + use tl_mol_conservative_alg_mod, only: tl_mol_conservative_alg + use tl_mol_advective_alg_mod, only: tl_mol_advective_alg + + implicit none + + ! Arguments + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), intent(in) :: field_n + type(r_tran_field_type), intent(in) :: ls_field_n + type(tl_transport_controller_type), intent(inout) :: tl_transport_controller + + ! Internal variables + integer(kind=i_def) :: method, direction + type(transport_counter_type), pointer :: transport_counter + type(transport_metadata_type), pointer :: transport_metadata + type(transport_controller_type), pointer :: pert_transport_controller + + pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() + transport_counter => pert_transport_controller%get_transport_counter() + transport_metadata => pert_transport_controller%get_transport_metadata() + + ! -------------------------------------------------------------------------! + ! Set up method based on direction + ! -------------------------------------------------------------------------! + direction = get_splitting_direction( & + transport_metadata%get_splitting(), & + transport_counter%get_split_step_of_substep_counter() & + ) + + select case ( direction ) + case ( direction_h ) + method = transport_metadata%get_horizontal_method() + case ( direction_v ) + method = transport_metadata%get_vertical_method() + case default + call log_event('Split transport direction not recognised', LOG_LEVEL_ERROR) + end select + + ! -------------------------------------------------------------------------! + ! Choose method, and then choose equation + ! -------------------------------------------------------------------------! + select case ( method ) + + ! -------------------------------------------------------------------------! + ! Null step + ! -------------------------------------------------------------------------! + case ( split_method_null ) + call log_event( & + 'TL: Split method null not coded', & + LOG_LEVEL_ERROR & + ) + + ! -------------------------------------------------------------------------! + ! Method of Lines step + ! -------------------------------------------------------------------------! + case ( split_method_mol ) + ! Choose form of transport equation + select case ( transport_metadata%get_equation_form() ) + case ( equation_form_conservative ) + call tl_mol_conservative_alg( & + field_np1, field_n, ls_field_n, tl_transport_controller & + ) + case ( equation_form_advective ) + call tl_mol_advective_alg( & + field_np1, field_n, ls_field_n, tl_transport_controller & + ) + case ( equation_form_consistent ) + call log_event( & + 'TL: MoL Consistent not coded yet', & + LOG_LEVEL_ERROR & + ) + case default + call log_event( & + 'Trying to solve unrecognised form of transport equation', & + LOG_LEVEL_ERROR & + ) + + end select + + ! -------------------------------------------------------------------------! + ! Flux-Form Semi-Lagrangian step + ! -------------------------------------------------------------------------! + case ( split_method_ffsl ) + ! All equation forms have the same control method + call log_event( & + 'TL: FFSL not coded yet', & + LOG_LEVEL_ERROR & + ) + ! -------------------------------------------------------------------------! + ! Semi-Lagrangian step + ! -------------------------------------------------------------------------! + case ( split_method_sl ) + ! Choose direction + select case ( direction ) + + case ( direction_h ) + ! Horizontal SL only for advective form + if ( transport_metadata%get_equation_form() /= equation_form_advective ) then + call log_event( & + 'Horizontal semi-Lagrangian is only for advective form', & + LOG_LEVEL_ERROR & + ) + end if + call log_event( & + 'TL: Horizontal SL not coded yet', & + LOG_LEVEL_ERROR & + ) + + case ( direction_v ) + ! Choose form of transport equation for vertical + select case ( transport_metadata%get_equation_form() ) + + case ( equation_form_conservative ) + call log_event( & + 'TL: Vertical SL conservative not coded yet', & + LOG_LEVEL_ERROR & + ) + case ( equation_form_advective ) + call log_event( & + 'TL: Vertical SL advective not coded yet', & + LOG_LEVEL_ERROR & + ) + case default + call log_event( & + 'Trying to solve unrecognised form of transport equation', & + LOG_LEVEL_ERROR & + ) + end select + end select + + case default + call log_event( & + 'Trying to transport with unrecognised scheme', & + LOG_LEVEL_ERROR & + ) + end select + + end subroutine tl_split_transport_field + +end module tl_split_transport_mod diff --git a/science/linear/source/algorithm/transport/control/tl_transport_field_mod.f90 b/science/linear/source/algorithm/transport/control/tl_transport_field_mod.f90 index 17016206a..5fd0a5b02 100644 --- a/science/linear/source/algorithm/transport/control/tl_transport_field_mod.f90 +++ b/science/linear/source/algorithm/transport/control/tl_transport_field_mod.f90 @@ -21,6 +21,7 @@ module tl_transport_field_mod equation_form_advective use tl_mol_conservative_alg_mod, only: tl_mol_conservative_alg use tl_mol_advective_alg_mod, only: tl_mol_advective_alg + use tl_split_transport_mod, only: tl_split_transport_control use transport_controller_mod, only: transport_controller_type use tl_transport_controller_mod, only: tl_transport_controller_type use transport_counter_mod, only: transport_counter_type @@ -121,10 +122,8 @@ subroutine tl_transport_field(field_np1, field_n, ls_field_n, & ! Some split horizontal/vertical transport scheme ! -------------------------------------------------------------------------! case ( scheme_split ) - call log_event( & - 'Split transport not implemented for tangent-linear app', & - LOG_LEVEL_ERROR & - ) + call tl_split_transport_control(field_np1, field_n, ls_field_n, & + tl_transport_controller) case default call log_event( & diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 index a1a34919f..1e4f52afe 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 @@ -73,7 +73,10 @@ contains type(field_type), allocatable :: rk_field(:) real(kind=r_def), allocatable :: rk_weights(:,:) type(transport_metadata_type), pointer :: transport_metadata + type(transport_metadata_type), pointer :: ls_transport_metadata type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter + type(transport_controller_type), pointer :: transport_controller type(transport_controller_type), pointer :: ls_transport_controller type(transport_controller_type), pointer :: pert_transport_controller type(wind_precomputations_type), pointer :: ls_wind_precomputations @@ -83,10 +86,17 @@ contains ! Extract transport objects and initialise temporary fields ! ------------------------------------------------------------------------ ! mesh => field%get_mesh() + + 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() + ls_transport_metadata => transport_controller%get_transport_metadata() + transport_counter => pert_transport_controller%get_transport_counter() + ls_transport_counter => transport_controller%get_transport_counter() + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() @@ -153,9 +163,9 @@ contains end do ! Compute update: rhs = u.grad(rhs_field) - call advective_and_flux_alg(dummy, rhs, rhs_field, ls_field_n, & - ls_advecting_wind, direction, & - transport_metadata, final_rk_stage, & + call advective_and_flux_alg(dummy, rhs, rhs_field, ls_field_n, & + ls_advecting_wind, direction, & + ls_transport_metadata, final_rk_stage, & dt_mol_substep, .false., .true. ) ! Update field: f = f^n - dt*rhs @@ -165,8 +175,8 @@ contains end do ! End of step: if necessary enforce min val and overwrite in blending zone - call end_of_advective_step_alg( & - ls_field_np1, ls_field_n, transport_counter, transport_metadata & + call end_of_advective_step_alg( & + ls_field_np1, ls_field_n, ls_transport_counter, ls_transport_metadata & ) ! -------------------------------------------------------------------------- diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 index b4563234e..cb954533a 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 @@ -27,7 +27,7 @@ module tl_mol_conservative_alg_mod use runge_kutta_init_mod, only: get_rk_transport_weights use split_transport_utils_mod, only: get_num_split_steps, & get_splitting_direction - use transport_constants_mod, only: get_directional_im3_div + use transport_constants_mod, only: get_directional_im3_div_r_tran use transport_controller_mod, only: transport_controller_type use tl_transport_controller_mod, only: tl_transport_controller_type use transport_counter_mod, only: transport_counter_type @@ -106,7 +106,9 @@ module tl_mol_conservative_alg_mod type(field_type), allocatable :: rk_field(:) real(kind=r_def), allocatable :: rk_weights(:,:) type(transport_metadata_type), pointer :: transport_metadata + type(transport_metadata_type), pointer :: ls_transport_metadata type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter type(transport_controller_type), pointer :: transport_controller type(transport_controller_type), pointer :: ls_transport_controller type(transport_controller_type), pointer :: pert_transport_controller @@ -126,11 +128,18 @@ module tl_mol_conservative_alg_mod 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() + ls_transport_metadata => transport_controller%get_transport_metadata() + transport_counter => pert_transport_controller%get_transport_counter() + ls_transport_counter => transport_controller%get_transport_counter() + flux_precomputations => transport_controller%get_flux_precomputations() + ls_wind_flux_precomp => ls_transport_controller%get_flux_precomputations() pert_wind_flux_precomp => pert_transport_controller%get_flux_precomputations() + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() @@ -146,7 +155,7 @@ module tl_mol_conservative_alg_mod dt_mol_substep = ls_wind_precomputations%get_dt_mol_substep( & mesh%get_id(), direction, splitting, step & ) - div => get_directional_im3_div(mesh_id, direction) + div => get_directional_im3_div_r_tran(mesh_id, direction) call get_rk_transport_weights(nstage, rk_weights, runge_kutta_method) allocate( rk_field(nstage) ) @@ -248,7 +257,7 @@ module tl_mol_conservative_alg_mod call advective_and_flux_alg(flux_step, adv_inc, rhs_field, ls_field_n, & ls_advecting_wind, direction, & - transport_metadata, final_rk_stage, & + ls_transport_metadata, final_rk_stage, & dt_mol_substep, do_flux, do_advective) if ( do_flux ) then @@ -291,7 +300,7 @@ module tl_mol_conservative_alg_mod ! increment, and may be adjusted to enforce min value or in blending zone call end_of_conservative_step_alg( & ls_field_np1, ls_field, ls_sum_flux, flux_precomputations, & - transport_counter, transport_metadata & + ls_transport_counter, ls_transport_metadata & ) ! ======================================================================== ! From c2e1fb5929cb9b0e712bf0477746d86c0dcbd295 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Tue, 13 Jan 2026 13:35:52 +0000 Subject: [PATCH 02/19] Changes from pre-science review --- .../rose-meta/lfric-adjoint_tests/versions.py | 18 ++++++++ .../atlt_end_transport_step_alg_mod.x90 | 28 ++++++------- rose-stem/app/linear_model/rose-app.conf | 1 + .../common/adj_flux_precomputations_mod.x90 | 2 +- .../control/atl_split_transport_mod.x90 | 40 +++++++++--------- .../lfric-linear/HEAD/rose-meta.conf | 7 ++++ .../linear/rose-meta/lfric-linear/versions.py | 18 ++++++++ .../control/tl_split_transport_mod.x90 | 41 +++++++++---------- 8 files changed, 98 insertions(+), 57 deletions(-) diff --git a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py index 152c043d0..31afea825 100644 --- a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py +++ b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py @@ -31,3 +31,21 @@ def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ + +class vn30_t108(MacroUpgrade): + # Upgrade macro for #108 by Christine Johnson + + BEFORE_TAG = "vn3.0" + AFTER_TAG = "vn3.0_t108" + + def upgrade(self, config, meta_config=None): + # Commands from rose-meta/lfric-linear + scaling = self.get_setting_value( + config, ["namelist:planet", "scaling_factor"] + ) + if "125.0" in scaling: + self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".false.") + else: + self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".true.") + + return config, self.reports \ No newline at end of file diff --git a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 index c2b259cb4..992458106 100644 --- a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 @@ -27,7 +27,8 @@ module atlt_end_transport_step_alg_mod 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 + 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 @@ -234,7 +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 @@ -286,19 +289,16 @@ module atlt_end_transport_step_alg_mod dummy_ref_mass_2_inp, & pert_transport_controller ) - ! if split scheme, w2v else w2 - num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) - if (num_split_steps > 1) then - vector_space_w2_ptr => function_space_collection%get_fs( & - mesh, element_order_h, element_order_v, W2V & - ) - else - vector_space_w2_ptr => function_space_collection%get_fs( & - mesh, element_order_h, element_order_v, W2 & - ) - end if - vector_space_w3_ptr => function_space_collection%get_fs( & - mesh, element_order_h, element_order_v, W3 & + ! 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 & ) call field_np1%initialise( vector_space = vector_space_w3_ptr ) diff --git a/rose-stem/app/linear_model/rose-app.conf b/rose-stem/app/linear_model/rose-app.conf index fadf6904a..78d13e797 100644 --- a/rose-stem/app/linear_model/rose-app.conf +++ b/rose-stem/app/linear_model/rose-app.conf @@ -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. diff --git a/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 b/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 index 03b8376fd..a742942de 100644 --- a/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 +++ b/science/adjoint/source/algorithm/transport/common/adj_flux_precomputations_mod.x90 @@ -141,7 +141,7 @@ module adj_flux_precomputations_mod class(flux_precomputations_type), intent(inout) :: flux_pc integer(kind=i_def), intent(in) :: step - type(r_tran_field_type), intent(inout) :: ref_flux + type(r_tran_field_type), intent(inout) :: ref_flux ! Local variables integer(kind=i_def) :: splitting diff --git a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 index 6cf636048..03e3c9327 100644 --- a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 +++ b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 @@ -34,6 +34,7 @@ module atl_split_transport_mod use end_of_transport_step_alg_mod, only: end_of_conservative_step_alg, & end_of_consistent_step_alg, & end_of_advective_step_alg + use linear_config_mod, only: transport_efficiency implicit none @@ -61,28 +62,25 @@ contains implicit none ! Arguments - type(r_tran_field_type), intent(inout) :: field_np1 - type(r_tran_field_type), target, intent(inout) :: field_n - type(r_tran_field_type), target, intent(in) :: ls_field_n + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), target, intent(inout) :: field_n + type(r_tran_field_type), target, intent(in) :: ls_field_n type(tl_transport_controller_type), intent(inout) :: tl_transport_controller ! Internal variables - integer(kind=i_def) :: num_split_steps - integer(kind=i_def) :: split_step_count - type(r_tran_field_type), allocatable :: ls_field_np1(:) - type(r_tran_field_type), target :: field_tmp - type(r_tran_field_type), pointer :: field_ptr - type(transport_counter_type), pointer :: transport_counter - type(transport_counter_type), pointer :: ls_transport_counter - type(transport_metadata_type), pointer :: transport_metadata + integer(kind=i_def) :: num_split_steps + integer(kind=i_def) :: split_step_count + type(r_tran_field_type), allocatable :: ls_field_np1(:) + type(r_tran_field_type), target :: field_tmp + type(r_tran_field_type), pointer :: field_ptr + type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter + type(transport_metadata_type), pointer :: transport_metadata type(transport_controller_type), pointer :: pert_transport_controller type(transport_controller_type), pointer :: ls_transport_controller - logical :: efficiency real(kind=r_tran) :: dt_substep integer(kind=i_def) :: num_substeps - efficiency = .false. - ! ------------------------------------------------------------------------ ! ! NONLINEAR (LS) ! ------------------------------------------------------------------------ ! @@ -98,7 +96,7 @@ contains call field_n%copy_field_properties(ls_field_np1(split_step_count)) end do - if ( .not. efficiency ) then + if ( .not. transport_efficiency ) then ! When we have multiple split steps, we need an intermediate field for the ! field at the start of each substeps @@ -200,15 +198,15 @@ contains implicit none ! Arguments - type(r_tran_field_type), intent(inout) :: field_np1 - type(r_tran_field_type), intent(inout) :: field_n - type(r_tran_field_type), intent(in) :: ls_field_n + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), intent(inout) :: field_n + type(r_tran_field_type), intent(in) :: ls_field_n type(tl_transport_controller_type), intent(inout) :: tl_transport_controller ! Internal variables - integer(kind=i_def) :: method, direction - type(transport_counter_type), pointer :: transport_counter - type(transport_metadata_type), pointer :: transport_metadata + integer(kind=i_def) :: method, direction + type(transport_counter_type), pointer :: transport_counter + type(transport_metadata_type), pointer :: transport_metadata type(transport_controller_type), pointer :: pert_transport_controller pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() 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 98a373e47..5d56a6c9f 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,13 @@ value-titles=analytic, =zero values='analytic', 'random', 'file', 'zero' +[namelist:linear=transport_efficiency] +compulsory=true +description=Do not update the linearisation state during the timestep. +help=The linearisation state remains fixed during the entire timestep. +!kind=default +type=logical + [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 152c043d0..a24af4285 100644 --- a/science/linear/rose-meta/lfric-linear/versions.py +++ b/science/linear/rose-meta/lfric-linear/versions.py @@ -31,3 +31,21 @@ def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ + +class vn30_t108(MacroUpgrade): + # Upgrade macro for #108 by Christine Johnson + + BEFORE_TAG = "vn3.0" + AFTER_TAG = "vn3.0_t108" + + def upgrade(self, config, meta_config=None): + # Commands from rose-meta/lfric-linear + scaling = self.get_setting_value( + config, ["namelist:planet", "scaling_factor"] + ) + if "125.0" in scaling: + self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".false.") + else: + self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".true.") + + return config, self.reports diff --git a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 index 15d2d65a2..1947b2fce 100644 --- a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 +++ b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 @@ -34,6 +34,7 @@ module tl_split_transport_mod use end_of_transport_step_alg_mod, only: end_of_conservative_step_alg, & end_of_consistent_step_alg, & end_of_advective_step_alg + use linear_config_mod, only: transport_efficiency implicit none @@ -61,28 +62,25 @@ contains implicit none ! Arguments - type(r_tran_field_type), intent(inout) :: field_np1 - type(r_tran_field_type), target, intent(in) :: field_n - type(r_tran_field_type), target, intent(in) :: ls_field_n + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), target, intent(in) :: field_n + type(r_tran_field_type), target, intent(in) :: ls_field_n type(tl_transport_controller_type), intent(inout) :: tl_transport_controller ! Internal variables - integer(kind=i_def) :: num_split_steps - integer(kind=i_def) :: split_step_count - type(r_tran_field_type), allocatable :: ls_field_np1(:) - type(r_tran_field_type), target :: field_tmp - type(r_tran_field_type), pointer :: field_ptr - type(transport_counter_type), pointer :: transport_counter - type(transport_counter_type), pointer :: ls_transport_counter - type(transport_metadata_type), pointer :: transport_metadata + integer(kind=i_def) :: num_split_steps + integer(kind=i_def) :: split_step_count + type(r_tran_field_type), allocatable :: ls_field_np1(:) + type(r_tran_field_type), target :: field_tmp + type(r_tran_field_type), pointer :: field_ptr + type(transport_counter_type), pointer :: transport_counter + type(transport_counter_type), pointer :: ls_transport_counter + type(transport_metadata_type), pointer :: transport_metadata type(transport_controller_type), pointer :: pert_transport_controller type(transport_controller_type), pointer :: ls_transport_controller - logical :: efficiency real(kind=r_tran) :: dt_substep integer(kind=i_def) :: num_substeps - efficiency = .false. - ! ------------------------------------------------------------------------ ! ! NONLINEAR (LS) ! ------------------------------------------------------------------------ ! @@ -98,7 +96,7 @@ contains call field_n%copy_field_properties(ls_field_np1(split_step_count)) end do - if ( .not. efficiency ) then + if ( .not. transport_efficiency ) then ! When we have multiple split steps, we need an intermediate field for the ! field at the start of each substeps @@ -128,6 +126,7 @@ contains end do else + ! Assume that the linearisation state does not evolve during the split transport do split_step_count = 1, num_split_steps + 1 call invoke( setval_X(ls_field_np1(split_step_count), ls_field_n) ) end do @@ -198,15 +197,15 @@ contains implicit none ! Arguments - type(r_tran_field_type), intent(inout) :: field_np1 - type(r_tran_field_type), intent(in) :: field_n - type(r_tran_field_type), intent(in) :: ls_field_n + type(r_tran_field_type), intent(inout) :: field_np1 + type(r_tran_field_type), intent(in) :: field_n + type(r_tran_field_type), intent(in) :: ls_field_n type(tl_transport_controller_type), intent(inout) :: tl_transport_controller ! Internal variables - integer(kind=i_def) :: method, direction - type(transport_counter_type), pointer :: transport_counter - type(transport_metadata_type), pointer :: transport_metadata + integer(kind=i_def) :: method, direction + type(transport_counter_type), pointer :: transport_counter + type(transport_metadata_type), pointer :: transport_metadata type(transport_controller_type), pointer :: pert_transport_controller pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() From dd93686c5534f27dd3856f6eb70f2c16b5a75236 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:19:13 +0000 Subject: [PATCH 03/19] Tidy linear rose meta --- .../lfric-linear/HEAD/rose-meta.conf | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) 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 5d56a6c9f..2e8b47047 100644 --- a/science/linear/rose-meta/lfric-linear/HEAD/rose-meta.conf +++ b/science/linear/rose-meta/lfric-linear/HEAD/rose-meta.conf @@ -4,7 +4,7 @@ import=lfric-gungho/HEAD compulsory=true description=Provides extra information for the tangent linear model. help= -ns=namelist/Linear/Initial +ns=namelist/Linear sort-key=Section-A07 title=Linear @@ -13,6 +13,7 @@ compulsory=true description=Do not update the linearisation state during the timestep. help=The linearisation state is the same for every outer and inner loop. !kind=default +ns=namelist/Linear/Efficiency type=logical [namelist:linear=l_stabilise_bl] @@ -20,7 +21,7 @@ compulsory=true description=?????? help=If true then turn on boundary layer stabilisation in linear model !kind=default -ns=namelist/Job/Timestepping/semi-implicit +ns=namelist/Linear/BoundaryLayer type=logical [namelist:linear=ls_read_w2h] @@ -30,7 +31,7 @@ description=For the linearisation state, read winds on a W2h space =from a file. help=Horizontal winds are read in on a W2h space from the ls file. If =false, then cell-centres (W3), co-located winds are assumed. -sort-key=Panel-A07a +ns=namelist/Linear/Data type=logical [namelist:linear=max_bl_stabilisation] @@ -39,7 +40,7 @@ description=?????? fail-if=this < 0.0 help=Maximum boundary layer stabilisation scalar in linear model !kind=default -ns=namelist/Job/Timestepping/semi-implicit +ns=namelist/Linear/BoundaryLayer range=0.0: type=real @@ -49,7 +50,7 @@ description=?????? fail-if=this < 1 ; help=Number of boundary layers levels to stabilise in linear model !kind=default -ns=namelist/Job/Timestepping/semi-implicit +ns=namelist/Linear/BoundaryLayer range=1: type=integer @@ -61,8 +62,7 @@ help=This can be an analytical perturbation, random data or from a file. =The analytical perturbation is based on the DCMIP gravity wave test. =The random data is generated with the Fortran intrinsic function 'random_number'. =The file contains data produced from LFRic with horizontal winds in W2. -ns=namelist/Linear/Initial -sort-key=Panel-A07a +ns=namelist/Linear/Data value-titles=analytic, =random, =file, @@ -71,9 +71,10 @@ values='analytic', 'random', 'file', 'zero' [namelist:linear=transport_efficiency] compulsory=true -description=Do not update the linearisation state during the timestep. -help=The linearisation state remains fixed during the entire timestep. +description=Do not update the linearisation state during the transport step. +help=The linearisation state remains fixed. !kind=default +ns=namelist/Linear/Efficiency type=logical [namelist:validity_test] @@ -81,7 +82,6 @@ compulsory=true description=Provides settings for the tangent linear validity tests. help=The validity tests are performed using the integration test framework. ns=namelist/Linear/ValidityTest -sort-key=Section-A07 title=Validity Tests [namelist:validity_test=number_gamma_values] @@ -94,7 +94,6 @@ help=Gamma is the size of the perturbation used in the validity test. !kind=default ns=namelist/Linear/ValidityTest range=0: -sort-key=Panel-A07b type=integer [namelist:validity_test=update_ls_frequency] @@ -109,5 +108,4 @@ help=In the integration tests, when running over multiple timesteps, !kind=default ns=namelist/Linear/ValidityTest range=0: -sort-key=Panel-A07c type=integer From 94f77d80482571d0d279ac1ab9bfc16171f0e13e Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Wed, 14 Jan 2026 09:23:16 +0000 Subject: [PATCH 04/19] correct versions.py upgrade macro --- .../resources/runge_kutta_configuration.nml | 1 + .../resources/semi_implicit_configuration.nml | 1 + science/linear/rose-meta/lfric-linear/versions.py | 15 +++++++++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/science/linear/integration-test/runge_kutta/resources/runge_kutta_configuration.nml b/science/linear/integration-test/runge_kutta/resources/runge_kutta_configuration.nml index 9298f96f7..0296f5165 100644 --- a/science/linear/integration-test/runge_kutta/resources/runge_kutta_configuration.nml +++ b/science/linear/integration-test/runge_kutta/resources/runge_kutta_configuration.nml @@ -139,6 +139,7 @@ write_minmax_tseries=.false., &linear fixed_ls=.false. pert_option='random', +transport_efficiency=.false. / &logging run_log_level='info', diff --git a/science/linear/integration-test/semi_implicit/resources/semi_implicit_configuration.nml b/science/linear/integration-test/semi_implicit/resources/semi_implicit_configuration.nml index 2b208a451..902c03a53 100644 --- a/science/linear/integration-test/semi_implicit/resources/semi_implicit_configuration.nml +++ b/science/linear/integration-test/semi_implicit/resources/semi_implicit_configuration.nml @@ -140,6 +140,7 @@ write_minmax_tseries=.false., &linear fixed_ls=.false. pert_option='random', +transport_efficiency=.false. / &logging run_log_level='info', diff --git a/science/linear/rose-meta/lfric-linear/versions.py b/science/linear/rose-meta/lfric-linear/versions.py index a24af4285..230a8bc09 100644 --- a/science/linear/rose-meta/lfric-linear/versions.py +++ b/science/linear/rose-meta/lfric-linear/versions.py @@ -20,32 +20,35 @@ def __repr__(self): """ Copy this template and complete to add your macro - class vnXX_txxx(MacroUpgrade): # Upgrade macro for by - BEFORE_TAG = "vnX.X" AFTER_TAG = "vnX.X_txxx" - def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ + class vn30_t108(MacroUpgrade): - # Upgrade macro for #108 by Christine Johnson + """Upgrade macro for ticket #108 by Christine Johnson.""" BEFORE_TAG = "vn3.0" AFTER_TAG = "vn3.0_t108" def upgrade(self, config, meta_config=None): + # Commands From: rose-meta/lfric-linear # Commands from rose-meta/lfric-linear scaling = self.get_setting_value( config, ["namelist:planet", "scaling_factor"] ) if "125.0" in scaling: - self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".false.") + self.add_setting( + config, ["namelist:linear", "transport_efficiency"], ".false." + ) else: - self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".true.") + self.add_setting( + config, ["namelist:linear", "transport_efficiency"], ".true." + ) return config, self.reports From 6279ad8839004c88e8a2e0517e2900dd0ba3c7fd Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:05:22 +0000 Subject: [PATCH 05/19] whitespace --- .../control/atl_split_transport_mod.x90 | 20 +++++++++---------- .../mol/atl_mol_advective_alg_mod.x90 | 2 +- .../mol/atl_mol_conservative_alg_mod.x90 | 10 +++++----- .../common/flux_precomputations_mod.x90 | 2 +- .../common/transport_counter_mod.x90 | 2 +- .../control/tl_split_transport_mod.x90 | 10 +++++----- .../mol/tl_mol_advective_alg_mod.x90 | 8 ++++---- .../mol/tl_mol_conservative_alg_mod.x90 | 10 +++++----- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 index 03e3c9327..e1b94e875 100644 --- a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 +++ b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 @@ -34,7 +34,7 @@ module atl_split_transport_mod use end_of_transport_step_alg_mod, only: end_of_conservative_step_alg, & end_of_consistent_step_alg, & end_of_advective_step_alg - use linear_config_mod, only: transport_efficiency + use linear_config_mod, only: transport_efficiency implicit none @@ -80,7 +80,7 @@ contains type(transport_controller_type), pointer :: ls_transport_controller real(kind=r_tran) :: dt_substep integer(kind=i_def) :: num_substeps - + ! ------------------------------------------------------------------------ ! ! NONLINEAR (LS) ! ------------------------------------------------------------------------ ! @@ -88,7 +88,7 @@ contains ls_transport_controller => tl_transport_controller%get_ls_wind_ls_rho_controller() transport_metadata => ls_transport_controller%get_transport_metadata() ls_transport_counter => ls_transport_controller%get_transport_counter() - + ! Initialise fields num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) allocate(ls_field_np1(num_split_steps + 1)) @@ -102,7 +102,7 @@ contains ! field at the start of each substeps ! field_ptr points to the field at the start of each split step call invoke( setval_X(ls_field_np1(1), ls_field_n) ) - + if (num_split_steps > 1) then call field_n%copy_field_properties(field_tmp) call invoke( setval_X(field_tmp, ls_field_n) ) @@ -146,7 +146,7 @@ contains num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) call field_n%copy_field_properties(field_tmp) - + ! Set fields to zero call invoke( setval_C(field_tmp, 0.0_r_def ) ) @@ -154,7 +154,7 @@ contains do split_step_count = num_split_steps, 1, -1 if (split_step_count < num_split_steps) then - + ! Increment split step counter call transport_counter%dec_split_step_counter() call ls_transport_counter%dec_split_step_counter() @@ -163,7 +163,7 @@ contains call invoke( setval_C(field_tmp, 0.0_r_def ) ) end if - + call atl_split_transport_field( & field_np1, field_tmp, ls_field_np1(split_step_count), & tl_transport_controller & @@ -171,7 +171,7 @@ contains call invoke( setval_C(field_np1, 0.0_r_def ) ) end do - + call invoke( setval_C(field_np1, 0.0_r_def ) ) call invoke( inc_X_plus_Y(field_n, field_tmp) ) call invoke( setval_C(field_tmp, 0.0_r_def ) ) @@ -208,11 +208,11 @@ contains type(transport_counter_type), pointer :: transport_counter type(transport_metadata_type), pointer :: transport_metadata type(transport_controller_type), pointer :: pert_transport_controller - + pert_transport_controller => tl_transport_controller%get_pert_wind_ls_rho_controller() transport_counter => pert_transport_controller%get_transport_counter() transport_metadata => pert_transport_controller%get_transport_metadata() - + ! -------------------------------------------------------------------------! ! Set up method based on direction ! -------------------------------------------------------------------------! diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 index be746dc00..e0b53e7d1 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 @@ -87,7 +87,7 @@ contains 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() ls_transport_metadata => transport_controller%get_transport_metadata() diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 index 85c0b374c..f24f134ec 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 @@ -124,18 +124,18 @@ module atl_mol_conservative_alg_mod 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() ls_transport_metadata => transport_controller%get_transport_metadata() - + transport_counter => pert_transport_controller%get_transport_counter() ls_transport_counter => transport_controller%get_transport_counter() - + flux_precomputations => transport_controller%get_flux_precomputations() - + ls_wind_flux_precomp => ls_transport_controller%get_flux_precomputations() pert_wind_flux_precomp => pert_transport_controller%get_flux_precomputations() - + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() diff --git a/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 b/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 index c7535e2de..993b71d38 100644 --- a/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 +++ b/science/gungho/source/algorithm/transport/common/flux_precomputations_mod.x90 @@ -84,7 +84,7 @@ module flux_precomputations_alg_mod use transport_enumerated_types_mod, only: direction_h, & direction_v, & direction_3d - + implicit none private diff --git a/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 b/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 index 630fb12ae..b40c2cc84 100644 --- a/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 +++ b/science/gungho/source/algorithm/transport/common/transport_counter_mod.x90 @@ -380,7 +380,7 @@ contains end subroutine dec_split_step_counter - + !> @brief Increments the counter of transport split steps subroutine inc_split_step_counter(self) diff --git a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 index 1947b2fce..7f749edc3 100644 --- a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 +++ b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 @@ -102,7 +102,7 @@ contains ! field at the start of each substeps ! field_ptr points to the field at the start of each split step call invoke( setval_X(ls_field_np1(1), ls_field_n) ) - + if (num_split_steps > 1) then call field_n%copy_field_properties(field_tmp) call invoke( setval_X(field_tmp, ls_field_n) ) @@ -127,7 +127,7 @@ contains else ! Assume that the linearisation state does not evolve during the split transport - do split_step_count = 1, num_split_steps + 1 + do split_step_count = 1, num_split_steps + 1 call invoke( setval_X(ls_field_np1(split_step_count), ls_field_n) ) end do end if @@ -135,7 +135,7 @@ contains dt_substep = ls_transport_counter%get_dt_substep() num_substeps = ls_transport_counter%get_num_substeps() call ls_transport_counter%initialise(transport_metadata, dt_substep, num_substeps ) - + ! ------------------------------------------------------------------------ ! ! LINEAR ! ------------------------------------------------------------------------ ! @@ -146,7 +146,7 @@ contains ! Initialise fields num_split_steps = get_num_split_steps(transport_metadata%get_splitting()) - + ! When we have multiple split steps, we need an intermediate field for the ! field at the start of each substeps ! field_ptr points to the field at the start of each split step @@ -159,7 +159,7 @@ contains end if do split_step_count = 1, num_split_steps - + call tl_split_transport_field( & field_np1, field_ptr, ls_field_np1(split_step_count), & tl_transport_controller & diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 index 1e4f52afe..a3173daeb 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 @@ -86,17 +86,17 @@ contains ! Extract transport objects and initialise temporary fields ! ------------------------------------------------------------------------ ! mesh => field%get_mesh() - + 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() ls_transport_metadata => transport_controller%get_transport_metadata() - + transport_counter => pert_transport_controller%get_transport_counter() ls_transport_counter => transport_controller%get_transport_counter() - + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 index cb954533a..3ead8b4a8 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 @@ -128,18 +128,18 @@ module tl_mol_conservative_alg_mod 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() ls_transport_metadata => transport_controller%get_transport_metadata() - + transport_counter => pert_transport_controller%get_transport_counter() ls_transport_counter => transport_controller%get_transport_counter() - + flux_precomputations => transport_controller%get_flux_precomputations() - + ls_wind_flux_precomp => ls_transport_controller%get_flux_precomputations() pert_wind_flux_precomp => pert_transport_controller%get_flux_precomputations() - + ls_wind_precomputations => ls_transport_controller%get_wind_precomputations() pert_wind_precomputations => pert_transport_controller%get_wind_precomputations() From 0dc995801457292f1536f8957549f63dc5ae55e6 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Wed, 14 Jan 2026 11:16:09 +0000 Subject: [PATCH 06/19] kgos --- ...l_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt | 6 +++--- ...wp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ..._random-C12_MG_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ...unge-kutta-C12_azspice_gnu_fast-debug-64bit.txt | 6 +++--- ...i-implicit-C12_azspice_gnu_fast-debug-64bit.txt | 6 +++--- ...odel_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt | 6 +++--- ...l_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt | 14 +++++++------- ...al9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt | 14 +++++++------- ...l_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt | 4 ++-- ...semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt | 6 +++--- 10 files changed, 45 insertions(+), 45 deletions(-) diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt index 4148368a6..ae6941aff 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3F20250B4FE9B9EF -Inner product checksum theta = 403305E848D6E311 -Inner product checksum u = 433053B3FA026478 +Inner product checksum rho = 3F20209A5300C0CE +Inner product checksum theta = 4033045F89E0C7D3 +Inner product checksum u = 43305393093018DC diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt index 6a7be832b..db6b47cd7 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3FA958F0C1D55513 -Inner product checksum theta = 4161FFBE6B89106C -Inner product checksum u = 456A4D0AF00B4480 -Inner product checksum mr1 = 3F3B888F79EB2E18 -Inner product checksum mr2 = 3EEB3109C670AF3C -Inner product checksum mr3 = 3EDFF31B816930A0 -Inner product checksum mr4 = 3EED42827F73DFDC +Inner product checksum rho = 3FA95DD5052A7C54 +Inner product checksum theta = 41636B4726CF61F4 +Inner product checksum u = 456C1EED9BF1A98F +Inner product checksum mr1 = 3F3BAF2278B82055 +Inner product checksum mr2 = 3EEB5E34685F900C +Inner product checksum mr3 = 3EE049E6792ED97D +Inner product checksum mr4 = 3EED677D6E22A0CA Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt index c19cd8f5f..fbb1060dc 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 40C2C1694FA30DD0 -Inner product checksum theta = 43076DE653AEC2FE -Inner product checksum u = 4697E3FAA368DE1C -Inner product checksum mr1 = 40A1D167F8ADA142 -Inner product checksum mr2 = 40699AF5BDBC4864 -Inner product checksum mr3 = 4069A3412D88D047 -Inner product checksum mr4 = 40697EB0A557078A +Inner product checksum rho = 40C23B4AA301D21E +Inner product checksum theta = 43077388557CDBD5 +Inner product checksum u = 4697AEF36F87734E +Inner product checksum mr1 = 40A1E3658F83F085 +Inner product checksum mr2 = 4069A3FDF086D038 +Inner product checksum mr3 = 4069ABB3EE2CFE34 +Inner product checksum mr4 = 406986D1C3387EAA Inner product checksum mr5 = 406997D0C9B8EEFB Inner product checksum mr6 = 40699547929283AC diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt index f718f88ba..204143dea 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED6D12BBFEDECC -Inner product checksum theta = 4012F2F8A6298AC5 -Inner product checksum u = 42F12DF2D0BF0EFC +Inner product checksum rho = 3EED6D12BBFEDECA +Inner product checksum theta = 4012F2F8A6298AC1 +Inner product checksum u = 42F12DF2D0BF0EF8 diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt index f7e9ed399..e9a271b36 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED280BC778BD3B -Inner product checksum theta = 4012F415A1A3F24B -Inner product checksum u = 43A4936A5FD755CE +Inner product checksum rho = 3EED280BC7780EE7 +Inner product checksum theta = 4012F415A1A39E11 +Inner product checksum u = 43A4936A5FD5B9C7 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt index a5449d77a..dc2dbe879 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3F20250B300C3D30 -Inner product checksum theta = 403305E8470B6A22 -Inner product checksum u = 433053B3A41C6049 +Inner product checksum rho = 3F20209A53120A6A +Inner product checksum theta = 4033045F89ECFF19 +Inner product checksum u = 43305393095E8AE2 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt index 8839d63b9..78709ef9b 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3FA958F09D97D52D -Inner product checksum theta = 4161FFBE7B6B7DE1 -Inner product checksum u = 456A4D0ACAB467CA -Inner product checksum mr1 = 3F3B888D5EA6A45C -Inner product checksum mr2 = 3EEB310977D9678E -Inner product checksum mr3 = 3EDFF31B705B97D8 -Inner product checksum mr4 = 3EED42824B13222B +Inner product checksum rho = 3FA95DD6CC7F967E +Inner product checksum theta = 41636B48AFC67370 +Inner product checksum u = 456C1EF0619892FE +Inner product checksum mr1 = 3F3BAF201D7152F2 +Inner product checksum mr2 = 3EEB5E33F92169E6 +Inner product checksum mr3 = 3EE049E67B5E5895 +Inner product checksum mr4 = 3EED677D74E9E5FF Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt index 1fba69899..0b6c122a1 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 40C2C1668AA536C6 -Inner product checksum theta = 43076DE652800BE2 -Inner product checksum u = 4697E3FAA2E5E0C6 -Inner product checksum mr1 = 40A1D167F834C0E0 -Inner product checksum mr2 = 40699AF5BDC7A01E -Inner product checksum mr3 = 4069A3412D91ECF2 -Inner product checksum mr4 = 40697EB0A55E4C2B +Inner product checksum rho = 40C23B4B28ECB124 +Inner product checksum theta = 430773885087F775 +Inner product checksum u = 4697AEF366E4CB22 +Inner product checksum mr1 = 40A1E365936C7D5A +Inner product checksum mr2 = 4069A3FDF0B3AC59 +Inner product checksum mr3 = 4069ABB3EE229127 +Inner product checksum mr4 = 406986D1C332A855 Inner product checksum mr5 = 406997D0C9B8EEFC Inner product checksum mr6 = 40699547929283AD diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt index ccf712d8a..031ad08f4 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED6D12BBFEDE9E -Inner product checksum theta = 4012F2F8A6298AC9 +Inner product checksum rho = 3EED6D12BBFEDE9C +Inner product checksum theta = 4012F2F8A6298AC4 Inner product checksum u = 42F12DF2D0BF0EC7 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt index 3906107bd..2fc4cf414 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED280BC779365A -Inner product checksum theta = 4012F415A1A375AE -Inner product checksum u = 43A4936A5FD4C67B +Inner product checksum rho = 3EED280BC779830C +Inner product checksum theta = 4012F415A1A32C5E +Inner product checksum u = 43A4936A5FD272E2 From 812b8d2bf6617c073745ab619aefc00d4cd03637 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Wed, 14 Jan 2026 11:58:10 +0000 Subject: [PATCH 07/19] whitespace --- .../transport/common/atlt_end_transport_step_alg_mod.x90 | 4 ++-- .../transport/control/atlt_transport_field_alg_mod.x90 | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 index 992458106..a4d64e064 100644 --- a/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/common/atlt_end_transport_step_alg_mod.x90 @@ -290,13 +290,13 @@ module atlt_end_transport_step_alg_mod pert_transport_controller ) ! W2 function space appropriate for splitting (fs on the last step) - splitting = transport_metadata%get_splitting() + 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 & ) diff --git a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 index 379ca3838..6ec2d229b 100644 --- a/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/control/atlt_transport_field_alg_mod.x90 @@ -40,7 +40,7 @@ module atlt_transport_field_alg_mod direction_h, & direction_v use fs_continuity_mod, only : W3 - + implicit none private @@ -111,7 +111,7 @@ module atlt_transport_field_alg_mod 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 real(kind=r_def) :: machine_tol @@ -164,7 +164,7 @@ module atlt_transport_field_alg_mod 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 ) @@ -210,7 +210,7 @@ module atlt_transport_field_alg_mod 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 ), & inc_a_times_X( field_n_sf, field_n ) ) From 5255c5014fe1b44fe94b87db1fb7829ca3aef1fc Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:01:35 +0000 Subject: [PATCH 08/19] upgrade macro correction --- .../adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py index 31afea825..663adddc7 100644 --- a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py +++ b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py @@ -44,8 +44,8 @@ def upgrade(self, config, meta_config=None): config, ["namelist:planet", "scaling_factor"] ) if "125.0" in scaling: - self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".false.") + self.add_setting(config, ["namelist:linear", "transport_efficiency"], ".false.") else: - self.add_setting(config, ["namelist:linear", "mol_efficiency"], ".true.") + self.add_setting(config, ["namelist:linear", "transport_efficiency"], ".true.") - return config, self.reports \ No newline at end of file + return config, self.reports From 3e978ea293cbfde381eee64f572b8fcd58efcb3d Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:14:55 +0000 Subject: [PATCH 09/19] Add transport_efficiency to MoL --- .../adjoint_tests/example/configuration.nml | 2 + .../linear_model/example/configuration.nml | 1 + .../mol/atl_mol_advective_alg_mod.x90 | 48 +++++++++++++++--- .../mol/atl_mol_conservative_alg_mod.x90 | 50 +++++++++++++++---- .../mol/tl_mol_advective_alg_mod.x90 | 46 ++++++++++++++--- .../mol/tl_mol_conservative_alg_mod.x90 | 47 ++++++++++++++--- 6 files changed, 162 insertions(+), 32 deletions(-) diff --git a/applications/adjoint_tests/example/configuration.nml b/applications/adjoint_tests/example/configuration.nml index 9dca2765c..928fa295a 100644 --- a/applications/adjoint_tests/example/configuration.nml +++ b/applications/adjoint_tests/example/configuration.nml @@ -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', diff --git a/applications/linear_model/example/configuration.nml b/applications/linear_model/example/configuration.nml index 9d52e8011..f41da1efb 100644 --- a/applications/linear_model/example/configuration.nml +++ b/applications/linear_model/example/configuration.nml @@ -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', diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 index e0b53e7d1..3f63651f1 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_advective_alg_mod.x90 @@ -27,7 +27,8 @@ module atl_mol_advective_alg_mod use wind_precomputations_alg_mod, only: wind_precomputations_type ! Configuration - use transport_config_mod, only: runge_kutta_method + use transport_config_mod, only: runge_kutta_method + use linear_config_mod, only: transport_efficiency implicit none @@ -56,7 +57,9 @@ contains ! Internal variables integer(kind=i_def) :: stage, s, direction integer(kind=i_def) :: nstage, substep + integer(kind=i_def) :: ls_stage, ls_nstage integer(kind=i_def) :: number_substeps + integer(kind=i_def) :: ls_number_substeps, ls_substep integer(kind=i_def) :: step integer(kind=i_def) :: splitting real(kind=r_def) :: dt_mol_substep @@ -111,13 +114,24 @@ contains ) call get_rk_transport_weights(nstage, rk_weights, runge_kutta_method) + + if (transport_efficiency) then + ls_number_substeps = 1 + ls_nstage =1 + else + ls_number_substeps = number_substeps + ls_nstage = nstage + end if + allocate( rk_field(nstage) ) - allocate( stored_ls_field(number_substeps, nstage) ) + allocate( stored_ls_field(ls_number_substeps, ls_nstage) ) do stage = 1, nstage call rk_field(stage)%initialise(field%get_function_space()) - do substep = 1, number_substeps - call stored_ls_field(substep, stage)%initialise(field%get_function_space()) + end do + do ls_stage = 1, ls_nstage + do ls_substep = 1, ls_number_substeps + call stored_ls_field(ls_substep, ls_stage)%initialise(field%get_function_space()) end do end do call rhs_field%initialise( field%get_function_space() ) @@ -144,19 +158,23 @@ contains ! array for each substep and each RK stage to use in the perturbation !--------------------------------------------------------------------------! + if (transport_efficiency) then + call invoke( setval_X(stored_ls_field(1,1), ls_field_np1 )) + else + ! Perform the number of rk-stages and substeps required - do substep = 1, number_substeps + do substep = 1, ls_number_substeps ! Reset field_n ready for the this substep call ls_field_np1%copy_field_properties(ls_field_n) call invoke( setval_X(ls_field_n, ls_field_np1) ) - do stage = 1, nstage + do stage = 1, ls_nstage ! Store values for use in the perturbation code. This is done before ! advecting so as to pick up the correct linearisation state call invoke( setval_X(stored_ls_field(substep, stage), ls_field_np1) ) - final_rk_stage = ( stage == nstage ) + final_rk_stage = ( stage == ls_nstage ) ! Compute the field for this stage: ! rhs_field = sum(s=1,stage): a(stage,s)*field^(s) @@ -183,6 +201,8 @@ contains ls_field_np1, ls_field_n, ls_transport_counter, ls_transport_metadata & ) + end if + ! -------------------------------------------------------------------------- ! Perturbation ! @@ -208,8 +228,20 @@ contains ! Perform the number of rk-stages and substeps required do substep = number_substeps, 1, -1 + if (transport_efficiency) then + ls_substep = 1 + else + ls_substep = substep + end if + do stage = nstage, 1, -1 + if (transport_efficiency) then + ls_stage = 1 + else + ls_stage = stage + end if + final_rk_stage = ( stage == nstage ) ! Update field: f = f^n - dt_substep*rhs @@ -220,7 +252,7 @@ contains ! Compute update: rhs = u.grad(rhs_field) call atl_advective_and_flux_alg( & dummy, dummy, rhs, rhs_field, advecting_wind, & - stored_ls_field(substep, stage), ls_advecting_wind, & + stored_ls_field(ls_substep, ls_stage), ls_advecting_wind, & direction, transport_metadata, final_rk_stage, dt_mol_substep, & .false., .true. & ) diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 index f24f134ec..1c1f45aaa 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 @@ -40,6 +40,7 @@ module atl_mol_conservative_alg_mod ! Configuration use boundaries_config_mod, only: limited_area use base_mesh_config_mod, only: topology, topology_non_periodic + use linear_config_mod, only: transport_efficiency use io_config_mod, only: subroutine_timers use transport_config_mod, only: runge_kutta_method, & dry_field_name, & @@ -74,7 +75,9 @@ module atl_mol_conservative_alg_mod integer(kind=i_def) :: mesh_id integer(kind=i_def) :: stage, s, direction integer(kind=i_def) :: nstage, substep - integer(kind=i_def) :: number_substeps + integer(kind=i_def) :: ls_nstage, ls_substep + integer(kind=i_def) :: ls_stage, number_substeps + integer(kind=i_def) :: ls_number_substeps integer(kind=i_def) :: step integer(kind=i_def) :: splitting real(kind=r_def) :: dt_mol_substep @@ -154,13 +157,24 @@ module atl_mol_conservative_alg_mod div => get_directional_im3_div_r_tran(mesh_id, direction) call get_rk_transport_weights(nstage, rk_weights, runge_kutta_method) + + if (transport_efficiency) then + ls_nstage = 1 + ls_number_substeps = 1 + else + ls_nstage = nstage + ls_number_substeps = number_substeps + end if + allocate( rk_field(nstage) ) - allocate( stored_ls_field(number_substeps,nstage) ) + allocate( stored_ls_field(ls_number_substeps,ls_nstage) ) do stage = 1, nstage call rk_field(stage)%initialise(field%get_function_space()) - do substep = 1, number_substeps - call stored_ls_field(substep, stage)%initialise(field%get_function_space()) + end do + do ls_stage = 1, ls_nstage + do ls_substep = 1, ls_number_substeps + call stored_ls_field(ls_substep, ls_stage)%initialise(field%get_function_space()) end do end do call rhs_field%initialise( field%get_function_space() ) @@ -195,20 +209,24 @@ module atl_mol_conservative_alg_mod ! This calculates the values of ls_field. These are stored as an ! array for each substep and each RK stage to use in the perturbation ! ======================================================================== ! + + if ( transport_efficiency ) then + call invoke( setval_X( stored_ls_field(1,1), ls_field_np1 ) ) + else ! ------------------------------------------------------------------------ ! ! Start of substepping loop ! ------------------------------------------------------------------------ ! - ls_substep_loop: do substep = 1, number_substeps + ls_substep_loop: do substep = 1, ls_number_substeps - final_substep = ( substep == number_substeps ) + final_substep = ( substep == ls_number_substeps ) ! Reset field_n ready for the this substep call ls_field_np1%copy_field_properties(ls_field_n) call invoke( setval_X(ls_field_n, ls_field_np1) ) - ls_stage_loop: do stage = 1, nstage + ls_stage_loop: do stage = 1, ls_nstage - final_rk_stage = ( stage == nstage ) + final_rk_stage = ( stage == ls_nstage ) ! Store values for use in the perturbation code. This is done before ! advecting so as to pick up the correct linearisation state @@ -295,6 +313,8 @@ module atl_mol_conservative_alg_mod ls_transport_counter, ls_transport_metadata & ) + end if + ! ======================================================================== ! ! Perturbation ! @@ -332,6 +352,12 @@ module atl_mol_conservative_alg_mod ! ------------------------------------------------------------------------ ! substep_loop: do substep = number_substeps, 1, -1 + if (transport_efficiency) then + ls_substep = 1 + else + ls_substep = substep + end if + final_substep = ( substep == number_substeps ) ! ---------------------------------------------------------------------- ! @@ -348,6 +374,12 @@ module atl_mol_conservative_alg_mod stage_loop: do stage = nstage, 1, -1 + if (transport_efficiency) then + ls_stage = 1 + else + ls_stage = stage + end if + final_rk_stage = ( stage == nstage ) ! -------------------------------------------------------------------- ! @@ -396,7 +428,7 @@ module atl_mol_conservative_alg_mod call atl_advective_and_flux_alg( & flux_step_ls_wind, flux_step_pert_wind, adv_inc, & rhs_field, advecting_wind, & - stored_ls_field(substep,stage), ls_advecting_wind, & + stored_ls_field(ls_substep,ls_stage), ls_advecting_wind, & direction, transport_metadata, final_rk_stage, & dt_mol_substep, do_flux, do_advective & ) diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 index a3173daeb..44ebf4248 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 @@ -28,6 +28,7 @@ module tl_mol_advective_alg_mod ! Configuration use transport_config_mod, only: runge_kutta_method + use linear_config_mod, only: transport_efficiency implicit none @@ -58,7 +59,9 @@ contains ! Internal variables integer(kind=i_def) :: stage, s, direction integer(kind=i_def) :: nstage, substep + integer(kind=i_def) :: ls_nstage, ls_substep integer(kind=i_def) :: number_substeps + integer(kind=i_def) :: ls_stage, ls_number_substeps integer(kind=i_def) :: step integer(kind=i_def) :: splitting real(kind=r_def) :: dt_mol_substep @@ -117,13 +120,23 @@ contains call field_n%initialise(field%get_function_space()) call get_rk_transport_weights(nstage, rk_weights, runge_kutta_method) + + if (transport_efficiency) then + ls_number_substeps = 1 + ls_nstage =1 + else + ls_number_substeps = number_substeps + ls_nstage = nstage + end if allocate( rk_field(nstage) ) - allocate( stored_ls_field(number_substeps, nstage) ) + allocate( stored_ls_field(ls_number_substeps, ls_nstage) ) do stage = 1, nstage call rk_field(stage)%initialise(field%get_function_space()) - do substep = 1, number_substeps - call stored_ls_field(substep, stage)%initialise(field%get_function_space()) + end do + do ls_stage = 1, ls_nstage + do ls_substep = 1, ls_number_substeps + call stored_ls_field(ls_substep, ls_stage)%initialise(field%get_function_space()) end do end do call rhs_field%initialise( field%get_function_space() ) @@ -140,19 +153,23 @@ contains ! array for each substep and each RK stage to use in the perturbation !--------------------------------------------------------------------------! + if (transport_efficiency) then + call invoke( setval_X( stored_ls_field(1,1), ls_field_np1)) + else + ! Perform the number of rk-stages and substeps required - do substep = 1, number_substeps + do substep = 1, ls_number_substeps ! Reset field_n ready for the this substep call ls_field_np1%copy_field_properties(ls_field_n) call invoke( setval_X(ls_field_n, ls_field_np1) ) - do stage = 1, nstage + do stage = 1, ls_nstage ! Store values for use in the perturbation code. This is done before ! advecting so as to pick up the correct linearisation state call invoke( setval_X(stored_ls_field(substep, stage), ls_field_np1) ) - final_rk_stage = ( stage == nstage ) + final_rk_stage = ( stage == ls_nstage ) ! Compute the field for this stage: ! rhs_field = sum(s=1,stage): a(stage,s)*field^(s) @@ -179,6 +196,8 @@ contains ls_field_np1, ls_field_n, ls_transport_counter, ls_transport_metadata & ) + end if + ! -------------------------------------------------------------------------- ! Perturbation ! @@ -187,15 +206,28 @@ contains ! linearisation stage stage !--------------------------------------------------------------------------- + ! Perform the number of rk-stages and substeps required do substep = 1, number_substeps + if (transport_efficiency) then + ls_substep = 1 + else + ls_substep = substep + end if + ! Reset field_n ready for the this substep call field_np1%copy_field_properties(field_n) call invoke( setval_X(field_n, field_np1) ) do stage = 1, nstage + if (transport_efficiency) then + ls_stage = 1 + else + ls_stage = stage + end if + final_rk_stage = ( stage == nstage ) ! Compute the field for this stage: @@ -209,7 +241,7 @@ contains ! Compute update: rhs = u.grad(rhs_field) call tl_advective_and_flux_alg( & dummy, dummy, rhs, rhs_field, advecting_wind, & - stored_ls_field(substep, stage), ls_advecting_wind, & + stored_ls_field(ls_substep, ls_stage), ls_advecting_wind, & direction, transport_metadata, final_rk_stage, dt_mol_substep, & .false., .true. & ) diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 index 3ead8b4a8..e9ec55497 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_conservative_alg_mod.x90 @@ -43,6 +43,7 @@ module tl_mol_conservative_alg_mod use boundaries_config_mod, only: limited_area use base_mesh_config_mod, only: topology, topology_non_periodic use io_config_mod, only: subroutine_timers + use linear_config_mod, only: transport_efficiency use transport_config_mod, only: runge_kutta_method, & dry_field_name, & operators, & @@ -79,6 +80,8 @@ module tl_mol_conservative_alg_mod integer(kind=i_def) :: stage, s, direction integer(kind=i_def) :: nstage, substep integer(kind=i_def) :: number_substeps + integer(kind=i_def) :: ls_nstage, ls_substep + integer(kind=i_def) :: ls_stage, ls_number_substeps integer(kind=i_def) :: step integer(kind=i_def) :: splitting real(kind=r_def) :: dt_mol_substep @@ -158,13 +161,24 @@ module tl_mol_conservative_alg_mod div => get_directional_im3_div_r_tran(mesh_id, direction) call get_rk_transport_weights(nstage, rk_weights, runge_kutta_method) + + if (transport_efficiency) then + ls_number_substeps = 1 + ls_nstage = 1 + else + ls_number_substeps = number_substeps + ls_nstage = nstage + end if + allocate( rk_field(nstage) ) - allocate( stored_ls_field(number_substeps,nstage) ) + allocate( stored_ls_field(ls_number_substeps,ls_nstage) ) do stage = 1, nstage call rk_field(stage)%initialise(field%get_function_space()) - do substep = 1, number_substeps - call stored_ls_field(substep, stage)%initialise(field%get_function_space()) + end do + do ls_stage = 1, ls_nstage + do ls_substep = 1, ls_number_substeps + call stored_ls_field(ls_substep, ls_stage)%initialise(field%get_function_space()) end do end do call rhs_field%initialise( field%get_function_space() ) @@ -203,20 +217,23 @@ module tl_mol_conservative_alg_mod ! array for each substep and each RK stage to use in the perturbation ! ======================================================================== ! + if (transport_efficiency) then + call invoke( setval_X( stored_ls_field(1,1), ls_field_np1 ) ) + else ! ------------------------------------------------------------------------ ! ! Start of substepping loop ! ------------------------------------------------------------------------ ! - ls_substep_loop: do substep = 1, number_substeps + ls_substep_loop: do substep = 1, ls_number_substeps - final_substep = ( substep == number_substeps ) + final_substep = ( substep == ls_number_substeps ) ! Reset field_n ready for the this substep call ls_field_np1%copy_field_properties(ls_field_n) call invoke( setval_X(ls_field_n, ls_field_np1) ) - ls_stage_loop: do stage = 1, nstage + ls_stage_loop: do stage = 1, ls_nstage - final_rk_stage = ( stage == nstage ) + final_rk_stage = ( stage == ls_nstage ) ! Store values for use in the perturbation code. This is done before ! advecting so as to pick up the correct linearisation state @@ -303,6 +320,8 @@ module tl_mol_conservative_alg_mod ls_transport_counter, ls_transport_metadata & ) + end if + ! ======================================================================== ! ! Perturbation ! @@ -316,6 +335,12 @@ module tl_mol_conservative_alg_mod ! ------------------------------------------------------------------------ ! substep_loop: do substep = 1, number_substeps + if (transport_efficiency) then + ls_substep = 1 + else + ls_substep = substep + end if + final_substep = ( substep == number_substeps ) ! Reset field_n ready for the this substep @@ -324,6 +349,12 @@ module tl_mol_conservative_alg_mod stage_loop: do stage = 1, nstage + if (transport_efficiency) then + ls_stage = 1 + else + ls_stage = stage + end if + final_rk_stage = ( stage == nstage ) ! Compute the field for this stage: @@ -361,7 +392,7 @@ module tl_mol_conservative_alg_mod call tl_advective_and_flux_alg( & flux_step_ls_wind, flux_step_pert_wind, adv_inc, & rhs_field, advecting_wind, & - stored_ls_field(substep,stage), ls_advecting_wind, & + stored_ls_field(ls_substep,ls_stage), ls_advecting_wind, & direction, transport_metadata, final_rk_stage, & dt_mol_substep, do_flux, do_advective & ) From 7079f066cdfb15eda36b9aaf6c06175becad92e1 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:42:59 +0000 Subject: [PATCH 10/19] kgos --- ...l_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt | 6 +++--- ...wp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ..._random-C12_MG_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ...odel_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt | 6 +++--- ...l_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt | 14 +++++++------- ...al9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt | 14 +++++++------- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt index ae6941aff..7e2da881a 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_dcmip301-C24_azspice_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3F20209A5300C0CE -Inner product checksum theta = 4033045F89E0C7D3 -Inner product checksum u = 43305393093018DC +Inner product checksum rho = 3F2022594816DB4A +Inner product checksum theta = 4033068A55A83CF8 +Inner product checksum u = 433056118E026D02 diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt index db6b47cd7..421106c0a 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9-C12_MG_azspice_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3FA95DD5052A7C54 -Inner product checksum theta = 41636B4726CF61F4 -Inner product checksum u = 456C1EED9BF1A98F -Inner product checksum mr1 = 3F3BAF2278B82055 -Inner product checksum mr2 = 3EEB5E34685F900C -Inner product checksum mr3 = 3EE049E6792ED97D -Inner product checksum mr4 = 3EED677D6E22A0CA +Inner product checksum rho = 3FA958AB1C8F215C +Inner product checksum theta = 416354444EC30001 +Inner product checksum u = 456C296AB5699467 +Inner product checksum mr1 = 3F3BB706EC65A9C8 +Inner product checksum mr2 = 3EEB5F98BD833463 +Inner product checksum mr3 = 3EE049E45013AA3C +Inner product checksum mr4 = 3EED67E57E3C63B8 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt index fbb1060dc..16ae3f01f 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_nwp_gal9_random-C12_MG_azspice_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 40C23B4AA301D21E -Inner product checksum theta = 43077388557CDBD5 -Inner product checksum u = 4697AEF36F87734E -Inner product checksum mr1 = 40A1E3658F83F085 -Inner product checksum mr2 = 4069A3FDF086D038 -Inner product checksum mr3 = 4069ABB3EE2CFE34 -Inner product checksum mr4 = 406986D1C3387EAA +Inner product checksum rho = 40C231C005491FDA +Inner product checksum theta = 43076F9C99ACD554 +Inner product checksum u = 4697A0E8F7E333C4 +Inner product checksum mr1 = 40A1E7982CFF402D +Inner product checksum mr2 = 4069A4088DCC70F6 +Inner product checksum mr3 = 4069ABB4FA045ED2 +Inner product checksum mr4 = 406986D0FD3118C3 Inner product checksum mr5 = 406997D0C9B8EEFB Inner product checksum mr6 = 40699547929283AC diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt index dc2dbe879..489629753 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_dcmip301-C24_ex1a_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3F20209A53120A6A -Inner product checksum theta = 4033045F89ECFF19 -Inner product checksum u = 43305393095E8AE2 +Inner product checksum rho = 3F20225947FE2721 +Inner product checksum theta = 4033068A55825E07 +Inner product checksum u = 433056118DDB6C73 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt index 78709ef9b..6ad269013 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9-C12_MG_ex1a_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3FA95DD6CC7F967E -Inner product checksum theta = 41636B48AFC67370 -Inner product checksum u = 456C1EF0619892FE -Inner product checksum mr1 = 3F3BAF201D7152F2 -Inner product checksum mr2 = 3EEB5E33F92169E6 -Inner product checksum mr3 = 3EE049E67B5E5895 -Inner product checksum mr4 = 3EED677D74E9E5FF +Inner product checksum rho = 3FA958AC8E6AE778 +Inner product checksum theta = 4163544440909176 +Inner product checksum u = 456C296A75CB61E1 +Inner product checksum mr1 = 3F3BB70A4A2CDB2C +Inner product checksum mr2 = 3EEB5F9888ADF09C +Inner product checksum mr3 = 3EE049E45255EF3E +Inner product checksum mr4 = 3EED67E58C2021B8 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt index 0b6c122a1..a311bce1d 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_nwp_gal9_random-C12_MG_ex1a_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 40C23B4B28ECB124 -Inner product checksum theta = 430773885087F775 -Inner product checksum u = 4697AEF366E4CB22 -Inner product checksum mr1 = 40A1E365936C7D5A -Inner product checksum mr2 = 4069A3FDF0B3AC59 -Inner product checksum mr3 = 4069ABB3EE229127 -Inner product checksum mr4 = 406986D1C332A855 +Inner product checksum rho = 40C231C0161316BD +Inner product checksum theta = 43076F9C97F79AE5 +Inner product checksum u = 4697A0E8F3CD0B5C +Inner product checksum mr1 = 40A1E79829B25F82 +Inner product checksum mr2 = 4069A4088E1A7842 +Inner product checksum mr3 = 4069ABB4FA005079 +Inner product checksum mr4 = 406986D0FD2D0E7A Inner product checksum mr5 = 406997D0C9B8EEFC Inner product checksum mr6 = 40699547929283AD From c423204412e76c268edc2b3c6aa8467a806769ba Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:49:20 +0000 Subject: [PATCH 11/19] clearwhitespace --- .../algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 | 4 ++-- .../algorithm/transport/mol/tl_mol_advective_alg_mod.x90 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 index 1c1f45aaa..75bd9d794 100644 --- a/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 +++ b/science/adjoint/source/algorithm/transport/mol/atl_mol_conservative_alg_mod.x90 @@ -209,7 +209,7 @@ module atl_mol_conservative_alg_mod ! This calculates the values of ls_field. These are stored as an ! array for each substep and each RK stage to use in the perturbation ! ======================================================================== ! - + if ( transport_efficiency ) then call invoke( setval_X( stored_ls_field(1,1), ls_field_np1 ) ) else @@ -356,7 +356,7 @@ module atl_mol_conservative_alg_mod ls_substep = 1 else ls_substep = substep - end if + end if final_substep = ( substep == number_substeps ) diff --git a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 index 44ebf4248..e85d71036 100644 --- a/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 +++ b/science/linear/source/algorithm/transport/mol/tl_mol_advective_alg_mod.x90 @@ -156,7 +156,7 @@ contains if (transport_efficiency) then call invoke( setval_X( stored_ls_field(1,1), ls_field_np1)) else - + ! Perform the number of rk-stages and substeps required do substep = 1, ls_number_substeps @@ -206,7 +206,7 @@ contains ! linearisation stage stage !--------------------------------------------------------------------------- - + ! Perform the number of rk-stages and substeps required do substep = 1, number_substeps From ef59ad106acfaea81f3ebe723ee701202d12d2fa Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Thu, 15 Jan 2026 16:33:23 +0000 Subject: [PATCH 12/19] jedi kgo --- ...s_nwp_gal9-C12_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ...tl_default-C12_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ...ests_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt | 14 +++++++------- ...st_tl_default-C12_ex1a_cce_fast-debug-64bit.txt | 14 +++++++------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_nwp_gal9-C12_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_nwp_gal9-C12_azspice_gnu_fast-debug-64bit.txt index b17a42b79..007c1751c 100644 --- a/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_nwp_gal9-C12_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_nwp_gal9-C12_azspice_gnu_fast-debug-64bit.txt @@ -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 diff --git a/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_azspice_gnu_fast-debug-64bit.txt index 36256062e..7d6d62d97 100644 --- a/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_azspice_gnu_fast-debug-64bit.txt @@ -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 diff --git a/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt index db90ee0d3..9ba16ef2b 100644 --- a/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_nwp_gal9-C12_ex1a_cce_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3FA7A119D15694EA -Inner product checksum theta = 4161FFC6B41D6C18 -Inner product checksum u = 4569B9484F679FDB -Inner product checksum mr1 = 3F36C0A85083444F -Inner product checksum mr2 = 3EEADFD859B930EE -Inner product checksum mr3 = 3EDFEC0C98392EF7 -Inner product checksum mr4 = 3EED3A95035B479C +Inner product checksum rho = 3FA79A9D24D80B84 +Inner product checksum theta = 4162215D998A790E +Inner product checksum u = 456A083CF563E471 +Inner product checksum mr1 = 3F36D11B19E12F6E +Inner product checksum mr2 = 3EEAE32B48FCBD56 +Inner product checksum mr3 = 3EDFEC26C094A93A +Inner product checksum mr4 = 3EED3B0E07D01F92 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_ex1a_cce_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_ex1a_cce_fast-debug-64bit.txt index 7dfc5de39..50ce4226d 100644 --- a/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_ex1a_cce_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_ex1a_cce_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3F95A1C504B6A918 -Inner product checksum theta = 413FF942C2E563C0 -Inner product checksum u = 452CCCF6ABE0865F -Inner product checksum mr1 = 3F2D21C8E6687010 -Inner product checksum mr2 = 3EDF53AD2309BABA -Inner product checksum mr3 = 3ED26AEFEBB2B535 -Inner product checksum mr4 = 3EE00982584FBC51 +Inner product checksum rho = 3F95ACB014DA78D0 +Inner product checksum theta = 413FCBF88C4910CE +Inner product checksum u = 452CBA65B40AFAB8 +Inner product checksum mr1 = 3F2D49E974B2F080 +Inner product checksum mr2 = 3EDF5792D6D2D34E +Inner product checksum mr3 = 3ED26AFD01439F84 +Inner product checksum mr4 = 3EE00984EA466A8E Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 From 55d91c7e7878908f57e910175a6b1a02c492d36c Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:39:36 +0000 Subject: [PATCH 13/19] CLA --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d0f7ae14d..8dbd04bd8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -4,3 +4,4 @@ | ----------- | --------- | ----------- | ---- | | james-bruten-mo | James Bruten | Met Office | 2025-12-09 | | jennyhickson | Jenny Hickson | Met Office | 2025-12-10 | +| cjohnson-pi | Christine Johnson | Met Office | 2026-01-16 | \ No newline at end of file From ffe83124264e917663b83faa5f1db2b79842679d Mon Sep 17 00:00:00 2001 From: cjohnson-pi <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:46:28 +0000 Subject: [PATCH 14/19] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index e87b305bd..310442f22 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,9 +1,9 @@ # Contributors -| GitHub user | Real Name | Affiliation | Date | -| ----------- | --------- | ----------- | ---- | -| james-bruten-mo | James Bruten | Met Office | 2025-12-09 | -| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 | +| GitHub user | Real Name | Affiliation | Date | +| ----------------| ----------------- | ----------- | ---------- | +| james-bruten-mo | James Bruten | Met Office | 2025-12-09 | +| jennyhickson | Jenny Hickson | Met Office | 2025-12-10 | | mike-hobson | Mike Hobson | Met Office | 2025-12-17 | | mo-marqh | mark Hedley | Met Office | 2025-12-11 | | yaswant | Yaswant Pradhan | Met Office | 2025-12-16 | @@ -11,4 +11,4 @@ | 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 | -| cjohnson-pi | Christine Johnson | Met Office | 2026-01-16 | \ No newline at end of file +| cjohnson-pi | Christine Johnson | Met Office | 2026-01-16 | From ae93c29588c2cb18683ec90ce29a72942f9c2f8e Mon Sep 17 00:00:00 2001 From: cjohnson-pi <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:47:18 +0000 Subject: [PATCH 15/19] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 310442f22..fd6acf699 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,7 +1,7 @@ # Contributors | GitHub user | Real Name | Affiliation | Date | -| ----------------| ----------------- | ----------- | ---------- | +| --------------- | ----------------- | ----------- | ---------- | | james-bruten-mo | James Bruten | Met Office | 2025-12-09 | | jennyhickson | Jenny Hickson | Met Office | 2025-12-10 | | mike-hobson | Mike Hobson | Met Office | 2025-12-17 | From b400557f656ce338904b3e9566ddc7693c64dcb8 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:32:10 +0000 Subject: [PATCH 16/19] Modifying rose --- .../rose-meta/lfric-adjoint_tests/versions.py | 18 ------------------ .../linear_model/opt/rose-app-runge-kutta.conf | 2 ++ .../opt/rose-app-semi-implicit.conf | 2 ++ .../linear/rose-meta/lfric-linear/versions.py | 11 +++++------ 4 files changed, 9 insertions(+), 24 deletions(-) diff --git a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py index 663adddc7..152c043d0 100644 --- a/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py +++ b/applications/adjoint_tests/rose-meta/lfric-adjoint_tests/versions.py @@ -31,21 +31,3 @@ def upgrade(self, config, meta_config=None): # Add settings return config, self.reports """ - -class vn30_t108(MacroUpgrade): - # Upgrade macro for #108 by Christine Johnson - - BEFORE_TAG = "vn3.0" - AFTER_TAG = "vn3.0_t108" - - def upgrade(self, config, meta_config=None): - # Commands from rose-meta/lfric-linear - scaling = self.get_setting_value( - config, ["namelist:planet", "scaling_factor"] - ) - if "125.0" in scaling: - self.add_setting(config, ["namelist:linear", "transport_efficiency"], ".false.") - else: - self.add_setting(config, ["namelist:linear", "transport_efficiency"], ".true.") - - return config, self.reports diff --git a/rose-stem/app/linear_model/opt/rose-app-runge-kutta.conf b/rose-stem/app/linear_model/opt/rose-app-runge-kutta.conf index 1047582b2..4f831da45 100644 --- a/rose-stem/app/linear_model/opt/rose-app-runge-kutta.conf +++ b/rose-stem/app/linear_model/opt/rose-app-runge-kutta.conf @@ -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 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 be23c9c84..b300e53d1 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 @@ -87,3 +87,5 @@ tau_u=0.5 [namelist:transport] !!wind_mono_top_depth=0 +scheme=5*1 +splitting=5*1 \ No newline at end of file diff --git a/science/linear/rose-meta/lfric-linear/versions.py b/science/linear/rose-meta/lfric-linear/versions.py index 230a8bc09..73609deda 100644 --- a/science/linear/rose-meta/lfric-linear/versions.py +++ b/science/linear/rose-meta/lfric-linear/versions.py @@ -38,17 +38,16 @@ class vn30_t108(MacroUpgrade): def upgrade(self, config, meta_config=None): # Commands From: rose-meta/lfric-linear - # Commands from rose-meta/lfric-linear - scaling = self.get_setting_value( - config, ["namelist:planet", "scaling_factor"] + fixed_ls = self.get_setting_value( + config, ["namelist:linear", "fixed_ls"] ) - if "125.0" in scaling: + if ".true." in fixed_ls: self.add_setting( - config, ["namelist:linear", "transport_efficiency"], ".false." + config, ["namelist:linear", "transport_efficiency"], ".true.." ) else: self.add_setting( - config, ["namelist:linear", "transport_efficiency"], ".true." + config, ["namelist:linear", "transport_efficiency"], ".false." ) return config, self.reports From 2f5970f0aa3916b26e02ed95ee556113840fb842 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:47:46 +0000 Subject: [PATCH 17/19] correction --- science/linear/rose-meta/lfric-linear/versions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/science/linear/rose-meta/lfric-linear/versions.py b/science/linear/rose-meta/lfric-linear/versions.py index 73609deda..90fa49f2e 100644 --- a/science/linear/rose-meta/lfric-linear/versions.py +++ b/science/linear/rose-meta/lfric-linear/versions.py @@ -43,7 +43,7 @@ def upgrade(self, config, meta_config=None): ) if ".true." in fixed_ls: self.add_setting( - config, ["namelist:linear", "transport_efficiency"], ".true.." + config, ["namelist:linear", "transport_efficiency"], ".true." ) else: self.add_setting( From 6d4797162a0497239394dabd16ed0b56920076dd Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 12:18:53 +0000 Subject: [PATCH 18/19] kgo --- ...default-C12_op_azspice_gnu_fast-debug-64bit.txt | 14 +++++++------- ...tl_default-C12_op_ex1a_cce_fast-debug-64bit.txt | 14 +++++++------- ...unge-kutta-C12_azspice_gnu_fast-debug-64bit.txt | 6 +++--- ...i-implicit-C12_azspice_gnu_fast-debug-64bit.txt | 6 +++--- ...l_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt | 4 ++-- ...semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt | 6 +++--- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_azspice_gnu_fast-debug-64bit.txt index 5ae16e5aa..fc254a564 100644 --- a/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/jedi_lfric_tests/azspice/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_azspice_gnu_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3F95A1DF1E431E10 -Inner product checksum theta = 41400115CD2072D9 -Inner product checksum u = 452CCC1C9C56D3B6 -Inner product checksum mr1 = 3F2D21B9057A6428 -Inner product checksum mr2 = 3EDF53C45279F22E -Inner product checksum mr3 = 3ED26AEE8FE0B97C -Inner product checksum mr4 = 3EE009839EC7E10F +Inner product checksum rho = 3F95ACCAC59D64D9 +Inner product checksum theta = 413FD499BD5603B7 +Inner product checksum u = 452CB9ABAE30ABAF +Inner product checksum mr1 = 3F2D49D33C196D4C +Inner product checksum mr2 = 3EDF57AEC293C509 +Inner product checksum mr3 = 3ED26AFB9145F0F5 +Inner product checksum mr4 = 3EE009862BB0DCF3 Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_ex1a_cce_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_ex1a_cce_fast-debug-64bit.txt index f6ca49a10..a8eadce8d 100644 --- a/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_ex1a_cce_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/jedi_lfric_tests/ex1a/checksum_jedi_lfric_tests_tlm_forecast_tl_default-C12_op_ex1a_cce_fast-debug-64bit.txt @@ -1,9 +1,9 @@ -Inner product checksum rho = 3F95A1E1F17F7A09 -Inner product checksum theta = 413FF80D6A5F4BE8 -Inner product checksum u = 452CCB73BB6342D4 -Inner product checksum mr1 = 3F2D21C0C423794A -Inner product checksum mr2 = 3EDF53B78E4C3283 -Inner product checksum mr3 = 3ED26AEF7B3222E8 -Inner product checksum mr4 = 3EE00982FE30ACFA +Inner product checksum rho = 3F95ACCD3EEAC2B8 +Inner product checksum theta = 413FCAAF700BA76A +Inner product checksum u = 452CB8D93BF67253 +Inner product checksum mr1 = 3F2D49E4C797F50E +Inner product checksum mr2 = 3EDF579D1DD1B948 +Inner product checksum mr3 = 3ED26AFC92438788 +Inner product checksum mr4 = 3EE00985A17972EA Inner product checksum mr5 = 0 Inner product checksum mr6 = 0 diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt index 204143dea..f718f88ba 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_runge-kutta-C12_azspice_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED6D12BBFEDECA -Inner product checksum theta = 4012F2F8A6298AC1 -Inner product checksum u = 42F12DF2D0BF0EF8 +Inner product checksum rho = 3EED6D12BBFEDECC +Inner product checksum theta = 4012F2F8A6298AC5 +Inner product checksum u = 42F12DF2D0BF0EFC diff --git a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt index e9a271b36..f7e9ed399 100644 --- a/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/azspice/checksum_linear_model_semi-implicit-C12_azspice_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED280BC7780EE7 -Inner product checksum theta = 4012F415A1A39E11 -Inner product checksum u = 43A4936A5FD5B9C7 +Inner product checksum rho = 3EED280BC778BD3B +Inner product checksum theta = 4012F415A1A3F24B +Inner product checksum u = 43A4936A5FD755CE diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt index 031ad08f4..ccf712d8a 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_runge-kutta-C12_ex1a_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED6D12BBFEDE9C -Inner product checksum theta = 4012F2F8A6298AC4 +Inner product checksum rho = 3EED6D12BBFEDE9E +Inner product checksum theta = 4012F2F8A6298AC9 Inner product checksum u = 42F12DF2D0BF0EC7 diff --git a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt index 2fc4cf414..3906107bd 100644 --- a/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt +++ b/rose-stem/site/meto/kgos/linear_model/ex1a/checksum_linear_model_semi-implicit-C12_ex1a_gnu_fast-debug-64bit.txt @@ -1,3 +1,3 @@ -Inner product checksum rho = 3EED280BC779830C -Inner product checksum theta = 4012F415A1A32C5E -Inner product checksum u = 43A4936A5FD272E2 +Inner product checksum rho = 3EED280BC779365A +Inner product checksum theta = 4012F415A1A375AE +Inner product checksum u = 43A4936A5FD4C67B From 52d158cd90ebb4d87ea81dd5620eb65982483ec3 Mon Sep 17 00:00:00 2001 From: Christine Johnson <74597224+cjohnson-pi@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:27:59 +0000 Subject: [PATCH 19/19] response to science review --- .../transport/common/adjt_end_transport_step_alg_mod.x90 | 1 + .../algorithm/transport/control/atl_split_transport_mod.x90 | 2 +- .../algorithm/transport/control/tl_split_transport_mod.x90 | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 b/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 index 610292851..7fa6bf71e 100644 --- a/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 +++ b/applications/adjoint_tests/source/algorithm/transport/common/adjt_end_transport_step_alg_mod.x90 @@ -113,6 +113,7 @@ module adjt_end_transport_step_alg_mod 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_w2v_ptr ) diff --git a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 index e1b94e875..2295ba4f1 100644 --- a/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 +++ b/science/adjoint/source/algorithm/transport/control/atl_split_transport_mod.x90 @@ -99,7 +99,7 @@ contains if ( .not. transport_efficiency ) then ! When we have multiple split steps, we need an intermediate field for the - ! field at the start of each substeps + ! field at the start of each substep ! field_ptr points to the field at the start of each split step call invoke( setval_X(ls_field_np1(1), ls_field_n) ) diff --git a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 index 7f749edc3..779dd5b5a 100644 --- a/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 +++ b/science/linear/source/algorithm/transport/control/tl_split_transport_mod.x90 @@ -99,7 +99,7 @@ contains if ( .not. transport_efficiency ) then ! When we have multiple split steps, we need an intermediate field for the - ! field at the start of each substeps + ! field at the start of each substep ! field_ptr points to the field at the start of each split step call invoke( setval_X(ls_field_np1(1), ls_field_n) )