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