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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
| MetBenjaminWent | Benjamin Went | Met Office | 2026-01-15 |
| timgraham-Met | Tim Graham | Met Office | 2026-01-15 |
| mo-alistairp | Alistair Pirrie | Met Office | 2026-01-19 |
| cjohnson-pi | Christine Johnson | Met Office | 2026-01-19 |
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

module adjt_mixed_operator_alg_mod

use constants_mod, only: i_def, r_def, l_def, r_solver
use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_DEBUG, &
Expand Down Expand Up @@ -83,7 +83,6 @@ contains
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(kind=tik) :: id

if ( LPROF ) call start_timing( id, 'adjt_mixed_operator_alg' )
Expand Down Expand Up @@ -167,9 +166,9 @@ contains
write(log_scratch_space, *) "w inner product = ", w_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )

p_sf = 1.0_r_def / (p_inner_prod + eps)
uv_sf = 1.0_r_def / (uv_inner_prod + eps)
w_sf = 1.0_r_def / (w_inner_prod + eps)
p_sf = 1.0_r_def / (p_inner_prod + EPS)
uv_sf = 1.0_r_def / (uv_inner_prod + EPS)
w_sf = 1.0_r_def / (w_inner_prod + EPS)

inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

module adjt_mixed_schur_preconditioner_alg_mod

use constants_mod, only: i_def, r_def, l_def, r_solver
use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
Expand Down Expand Up @@ -125,7 +125,6 @@ contains
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(kind=tik) :: id

if ( LPROF ) call start_timing( id, 'adjt_mixed_schur_preconditioner_alg' )
Expand Down Expand Up @@ -254,9 +253,9 @@ contains
write(log_scratch_space, *) "w inner product = ", w_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )

p_sf = 1.0_r_def / (p_inner_prod + eps)
uv_sf = 1.0_r_def / (uv_inner_prod + eps)
w_sf = 1.0_r_def / (w_inner_prod + eps)
p_sf = 1.0_r_def / (p_inner_prod + EPS)
uv_sf = 1.0_r_def / (uv_inner_prod + EPS)
w_sf = 1.0_r_def / (w_inner_prod + EPS)

inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

module adjt_mixed_solver_alg_mod

use constants_mod, only: i_def, r_def, l_def, r_solver
use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
Expand Down Expand Up @@ -142,7 +142,6 @@ contains
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(tik) :: id

if ( LPROF ) call start_timing( id, 'adjt_mixed_solver_alg' )
Expand Down Expand Up @@ -285,9 +284,9 @@ contains
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )

! Scaling factors are scaled up a bit to avoid numerical issues
p_sf = 1.0E4_r_def / (p_inner_prod + eps)
uv_sf = 1.0E4_r_def / (uv_inner_prod + eps)
w_sf = 1.0E4_r_def / (w_inner_prod + eps)
p_sf = 1.0E4_r_def / (p_inner_prod + EPS)
uv_sf = 1.0E4_r_def / (uv_inner_prod + EPS)
w_sf = 1.0E4_r_def / (w_inner_prod + EPS)

inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

module adjt_pressure_precon_alg_mod

use constants_mod, only: i_def, r_def, l_def, r_solver
use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
Expand Down Expand Up @@ -114,7 +114,6 @@ contains
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
real(kind=r_def), parameter :: eps = 1e-30_r_def
integer(tik) :: id

if ( LPROF ) call start_timing( id, 'adjt_pressure_precon_alg' )
Expand Down Expand Up @@ -236,7 +235,7 @@ contains
write(log_scratch_space, *) "p inner product = ", p_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )

p_sf = 1.0_r_def / (p_inner_prod + eps)
p_sf = 1.0_r_def / (p_inner_prod + EPS)

inner1 = 0.0_r_def
inner1 = inner1 + p_inner_prod * p_sf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
!> @brief Module containing adjoint test for scaled_matrix_vector_kernel
module adjt_scaled_matrix_vector_alg_mod

use constants_mod, only: i_def, r_def, l_def, r_solver
use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use field_mod, only: field_type
use finite_element_config_mod, only: element_order_h, element_order_v
use fs_continuity_mod, only: W2, W3, Wtheta
Expand Down Expand Up @@ -77,7 +77,6 @@ module adjt_scaled_matrix_vector_alg_mod
real(kind=r_def) :: machine_tolerance
real(kind=r_def) :: relative_diff
real(kind=r_def), parameter :: overall_tolerance = 1500.0_r_def
real(kind=r_def), parameter :: eps = 1e-30_r_def

! Setup

Expand Down Expand Up @@ -128,7 +127,7 @@ module adjt_scaled_matrix_vector_alg_mod
write(log_scratch_space, *) "vector inner product = ", vector_inner_prod
call log_event( log_scratch_space, LOG_LEVEL_DEBUG )

vector_sf = 1.0_r_def / (vector_inner_prod + eps)
vector_sf = 1.0_r_def / (vector_inner_prod + EPS)

inner1 = 0.0_r_def
inner1 = inner1 + vector_inner_prod * vector_sf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

module adjt_semi_implicit_solver_step_alg_mod

use constants_mod, only: i_def, r_def, l_def, r_solver
use constants_mod, only: i_def, r_def, l_def, r_solver, EPS
use log_mod, only: log_event, &
log_scratch_space, &
LOG_LEVEL_INFO, &
Expand Down Expand Up @@ -307,7 +307,6 @@ contains
real(kind=r_def), parameter :: overall_tolerance = 1000.0_r_def
real(kind=r_def) :: machine_tol, machine_tol_r_solver
real(kind=r_def) :: relative_diff, relative_diff_r_solver
real(kind=r_def), parameter :: eps = 1e-30_r_def

integer(kind=i_def) :: i

Expand Down Expand Up @@ -363,17 +362,17 @@ contains
end do

! Scaling factors are scaled up a bit to avoid numerical issues
state_sf(igh_u) = 1.0E4_r_def / (state_inner_prod(igh_u) + eps)
state_sf(igh_t) = 1.0E4_r_def / (state_inner_prod(igh_t) + eps)
state_sf(igh_d) = 1.0E4_r_def / (state_inner_prod(igh_d) + eps)
state_sf(igh_p) = 1.0E4_r_def / (state_inner_prod(igh_p) + eps)
rhs_sf(igh_u) = 1.0E4_r_def / (rhs_inner_prod(igh_u) + eps)
rhs_sf(igh_t) = 1.0E4_r_def / (rhs_inner_prod(igh_t) + eps)
rhs_sf(igh_d) = 1.0E4_r_def / (rhs_inner_prod(igh_d) + eps)
rhs_sf(igh_p) = 1.0E4_r_def / (rhs_inner_prod(igh_p) + eps)
moist_dyn_gas_law_sf = 1.0E4_r_def / (moist_dyn_gas_law_inner_prod + eps)
state_sf(igh_u) = 1.0E4_r_def / (state_inner_prod(igh_u) + EPS)
state_sf(igh_t) = 1.0E4_r_def / (state_inner_prod(igh_t) + EPS)
state_sf(igh_d) = 1.0E4_r_def / (state_inner_prod(igh_d) + EPS)
state_sf(igh_p) = 1.0E4_r_def / (state_inner_prod(igh_p) + EPS)
rhs_sf(igh_u) = 1.0E4_r_def / (rhs_inner_prod(igh_u) + EPS)
rhs_sf(igh_t) = 1.0E4_r_def / (rhs_inner_prod(igh_t) + EPS)
rhs_sf(igh_d) = 1.0E4_r_def / (rhs_inner_prod(igh_d) + EPS)
rhs_sf(igh_p) = 1.0E4_r_def / (rhs_inner_prod(igh_p) + EPS)
moist_dyn_gas_law_sf = 1.0E4_r_def / (moist_dyn_gas_law_inner_prod + EPS)
do i = 1, nummr
mr_sf(i) = 1.0E4_r_def / (mr_inner_prod(i) + eps)
mr_sf(i) = 1.0E4_r_def / (mr_inner_prod(i) + EPS)
end do

inner1 = 0.0_r_def
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ module adjoint_test_parameters_mod
! if the ls is not realistic. ls can still be
! randomly assigned, but in a sensible range
! to prevent these issues.
real(r_def), dimension(2), parameter :: ls_u_range = (/ 0.0_r_def, 10.0_r_def /)
real(r_def), dimension(2), parameter :: ls_u_range = (/ 1.e2_r_def, 1.e3_r_def /)
real(r_def), dimension(2), parameter :: ls_theta_range = (/ 280.0_r_def, 340.0_r_def /)
real(r_def), dimension(2), parameter :: ls_rho_range = (/ 0.0_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_exner_range = (/ 0.0_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_md1_range = (/ 0.0_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_md2_range = (/ 0.0_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_md3_range = (/ 0.0_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_rho_range = (/ 0.1_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_exner_range = (/ 0.1_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_md1_range = (/ 0.1_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_md2_range = (/ 0.1_r_def, 1.0_r_def /)
real(r_def), dimension(2), parameter :: ls_md3_range = (/ 0.1_r_def, 1.0_r_def /)

end module adjoint_test_parameters_mod
44 changes: 44 additions & 0 deletions rose-stem/app/adjoint_tests/file/field_def_diags_ls.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<field_group id="diagnostic_fields" freq_op="1ts" operation="instant" enabled=".TRUE." >
<field id="ls_theta" name="ls_theta" long_name="LS values for air potential temperature" standard_name="air_potential_temperature" unit="K" grid_ref="full_level_face_grid" />
<field id="ls_exner" name="ls_exner" long_name="LS values for exner pressure" unit="1" grid_ref="half_level_face_grid" />
<field id="ls_rho" name="ls_rho" long_name="LS values for air density" standard_name="air_density" unit="kg m-3" grid_ref="half_level_face_grid" />
<field id="ls_u1" name="ls_u1" long_name="Eastward wind derived from LS values for u" standard_name="eastward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="ls_u2" name="ls_u2" long_name="Northward wind derived from LS values for u" standard_name="northward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="ls_u3" name="ls_u3" long_name="Upward wind derived from LS values of u" standard_name="upward_air_velocity" unit="m s-1" grid_ref="full_level_face_grid" />
<field id="h_ls_u" name="ls_h_u" long_name="Horizontal flux (in computational space) derived from LS values of u" standard_name="horizontal_flux" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="v_ls_u" name="ls_v_u" long_name="Vertical flux (in computational space) derived from LS values of u" standard_name="vertical_flux" unit="m s-1" grid_ref="full_level_face_grid" />
<field id="ls_m_v" name="ls_m_v" long_name="LS values for m_v" standard_name="m_v" unit="K" grid_ref="full_level_face_grid" />
<field id="ls_m_cl" name="ls_m_cl" long_name="LS values for m_cl" standard_name="m_cl" unit="K" grid_ref="full_level_face_grid" />
<field id="ls_m_ci" name="ls_m_ci" long_name="LS values for m_ci" standard_name="m_ci" unit="K" grid_ref="full_level_face_grid" />
<field id="ls_m_r" name="ls_m_r" long_name="LS values for m_r" standard_name="m_cr" unit="K" grid_ref="full_level_face_grid" />
<field id="ls_m_g" name="ls_m_g" long_name="LS values for m_g" standard_name="m_cr" unit="K" grid_ref="full_level_face_grid" />
<field id="ls_m_s" name="ls_m_s" long_name="LS values for m_s" standard_name="m_s" unit="K" grid_ref="full_level_face_grid" />

<field id="init_ls_rho" name="ls_rho" long_name="LS values for air_density" standard_name="air_density" unit="kg m-3" grid_ref="half_level_face_grid" />
<field id="init_ls_exner" name="ls_exner" long_name="LS values for exner_pressure" unit="1" grid_ref="half_level_face_grid" />
<field id="init_ls_theta" name="ls_theta" long_name="LS values for air_potential_temperature" standard_name="air_potential_temperature" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_m_v" name="ls_m_v" long_name="LS values for m_v" standard_name="m_v" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_m_cl" name="ls_m_cl" long_name="LS values for m_cl" standard_name="m_cl" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_m_ci" name="ls_m_ci" long_name="LS values for m_ci" standard_name="m_ci" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_m_r" name="ls_m_r" long_name="LS values for m_r" standard_name="m_cr" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_m_g" name="ls_m_g" long_name="LS values for m_g" standard_name="m_cr" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_m_s" name="ls_m_s" long_name="LS values for m_s" standard_name="m_cr" unit="K" grid_ref="full_level_face_grid" />
<field id="init_ls_u1" name="ls_u1" long_name="Eastward wind derived from LS values of u" standard_name="eastward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="init_ls_u2" name="ls_u2" long_name="Northward wind derived from LS values of u" standard_name="northward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="init_ls_u3" name="ls_u3" long_name="Upward wind derived from LS values of u" standard_name="upward_air_velocity" unit="m s-1" grid_ref="full_level_face_grid" />
<field id="init_h_ls_u" name="h_u" long_name="Horizontal flux (in computational space) derived from LS values of u" standard_name="horizontal_wind" unit="m-1 s-1" grid_ref="half_level_edge_grid" />
<field id="init_v_ls_u" name="v_u" long_name="Vertical flux (in computational space) derived from LS values of u" standard_name="vertical_wind" unit="m-1 s-1" grid_ref="full_level_face_grid" />

<field id="init_readls_h_u" name="h_u" long_name="LS values of horizontal flux (in computational space)" standard_name="horizontal_wind" unit="m-1 s-1" grid_ref="half_level_edge_grid" />
<field id="init_readls_v_u" name="v_u" long_name="LS values of vertical flux (in computational space)" standard_name="vertical_wind" unit="m-1 s-1" grid_ref="full_level_face_grid" />
<field id="init_readls_h_u1" name="ls_u1" long_name="Eastward wind derived from LS values of horizontal flux (in computational space)" standard_name="eastward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="init_readls_h_u2" name="ls_u2" long_name="Northward wind derived from LS values of horizontal flux (in computational space)" standard_name="northward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="init_readls_h_u3" name="ls_u3" long_name="Upwards wind derived from LS values of horizontal flux (in computational space)" standard_name="upward_air_velocity" unit="m s-1" grid_ref="full_level_face_grid" />
<field id="init_readls_v_u1" name="ls_u1" long_name="Eastward wind derived from LS values of vertical flux (in computational space)" standard_name="eastward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="init_readls_v_u2" name="ls_u2" long_name="Northward wind derived from LS values of vertical flux (in computational space)" standard_name="northward_wind" unit="m s-1" grid_ref="half_level_edge_grid" />
<field id="init_readls_v_u3" name="ls_u3" long_name="Upward wind derived from LS values of vertical flux (in computational space)" standard_name="upward_air_velocity" unit="m s-1" grid_ref="full_level_face_grid" />
<field id="init_h_readls_h_u" name="h_u" long_name="Horizontal flux (in computational space) derived from LS values of horizontal flux" standard_name="horizontal_wind" unit="m-1 s-1" grid_ref="half_level_edge_grid" />
<field id="init_v_readls_h_u" name="h_u" long_name="Vertical flux (in computational space) derived from LS values of horizontal flux" standard_name="horizontal_wind" unit="m-1 s-1" grid_ref="full_level_face_grid" />

</field_group>

9 changes: 9 additions & 0 deletions rose-stem/app/adjoint_tests/file/file_def_ancil.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<file_definition>

<!-- This file contains orography ancil data -->
<!-- ANCIL FILES -->
<file id="orography_mean_ancil" name="orography_mean_ancil" mode="read" output_freq="1ts" convention="UGRID" cyclic="true" enabled=".FALSE.">
<field id="surface_altitude" name="surface_altitude" long_name="Surface altitude" unit="m" operation="once" domain_ref="face"/>
</file>

</file_definition>
15 changes: 15 additions & 0 deletions rose-stem/app/adjoint_tests/file/file_def_check_restart.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<file_definition>

<!-- This file contains all possible checkpointed fields -->

<!-- File definition for checkpoint write, populated by model -->
<file id="lfric_checkpoint_write" name="lfric_checkpoint_write" output_freq="1ts" convention="CF" enabled=".FALSE.">
<field_group id="checkpoint_fields" prec="8" operation="once" enabled=".FALSE." >
</field_group>
</file>

<!-- File definition for checkpoint read, populated by model -->
<file id="lfric_checkpoint_read" name="lfric_checkpoint_read" mode="read" output_freq="1ts" convention="CF" enabled=".FALSE.">
</file>

</file_definition>
17 changes: 17 additions & 0 deletions rose-stem/app/adjoint_tests/file/file_def_diags.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<file_definition>

<file id="lfric_diag" name="lfric_diag" output_freq="1ts" convention="UGRID" enabled=".TRUE.">
<field_group id="dynamics_prognostics" operation="instant" freq_op="1ts">
<field field_ref="theta"/>
<field field_ref="m_v"/>
<field field_ref="m_cl"/>
<field field_ref="m_cf"/>
<field field_ref="m_r"/>
<field field_ref="rho"/>
<field field_ref="exner"/>
<field field_ref="u_in_w3" />
<field field_ref="v_in_w3" />
</field_group>
</file>

</file_definition>
13 changes: 13 additions & 0 deletions rose-stem/app/adjoint_tests/file/file_def_diags_ls.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<file_definition>

<file id="lfric_ls_diag" name="lfric_ls_diag" output_freq="1ts" convention="UGRID" enabled=".TRUE.">
<field_group id="lin_state_fields" operation="instant" freq_op="1ts">
<field field_ref="ls_theta"/>
<field field_ref="ls_m_v"/>
<field field_ref="ls_m_cl"/>
<field field_ref="ls_rho"/>
<field field_ref="ls_exner"/>
</field_group>
</file>

</file_definition>
17 changes: 17 additions & 0 deletions rose-stem/app/adjoint_tests/file/file_def_initial.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<file_definition>

<file id="lfric_initial" name="lfric_initial" output_freq="1ts" convention="UGRID" enabled=".TRUE.">
<field_group id="initial_dynamics_fields" freq_op="1ts" operation="once" enabled=".TRUE." >
<field field_ref="init_theta" />
<field field_ref="init_m_v" />
<field field_ref="init_m_cl" />
<field field_ref="init_m_s" />
<field field_ref="init_m_r" />
<field field_ref="init_rho" />
<field field_ref="init_exner" />
<field field_ref="init_height_w3" />
<field field_ref="init_height_wth" />
</field_group>
</file>

</file_definition>
Loading