pure subroutine restore_state(ms)
!! Copy the *_0 save buffers back into h_layer / u_face_x_layer /
!! v_face_y_layer — the pred_corr between-stage reset (SPEC §2): the
!! predictor's provisional up/vp/hp are DISCARDED (only u_av/v_av/
!! h_av survive it), and the corrector advances from u^n / h^n.
!! Tracers are untouched by the predictor (TR_MODE_NONE + no
!! thermodynamics), so no tracer restore is needed.
type(multilayer_state_t), intent(inout) :: ms
integer :: i, j, k, nx, ny, nz, nx_face, ny_uface, nx_vface, ny_face
nx = size(ms%h_layer, 1)
ny = size(ms%h_layer, 2)
nz = ms%nz_ml
nx_face = size(ms%u_face_x_layer, 1)
ny_uface = size(ms%u_face_x_layer, 2)
nx_vface = size(ms%v_face_y_layer, 1)
ny_face = size(ms%v_face_y_layer, 2)
do concurrent(k=1:nz, j=1:ny, i=1:nx)
ms%h_layer(i, j, k) = ms%h_layer0(i, j, k)
end do
do concurrent(k=1:nz, j=1:ny_uface, i=1:nx_face)
ms%u_face_x_layer(i, j, k) = ms%u_face_x_layer0(i, j, k)
end do
do concurrent(k=1:nz, j=1:ny_face, i=1:nx_vface)
ms%v_face_y_layer(i, j, k) = ms%v_face_y_layer0(i, j, k)
end do
end subroutine restore_state