remap_tracer_grounded Subroutine

private pure subroutine remap_tracer_grounded(nx, ny, nz, h_old, h_new, mask, hTr)

Conservative tracer remap gated on the grounded mask. Non-grounded columns are skipped -> hTr byte-unchanged; the concentration divisions only happen on grounded columns.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nx
integer, intent(in) :: ny
integer, intent(in) :: nz
real(kind=wp), intent(in) :: h_old(nx,ny,nz)
real(kind=wp), intent(in) :: h_new(nx,ny,nz)
real(kind=wp), intent(in) :: mask(nx,ny,1)
real(kind=wp), intent(inout) :: hTr(nx,ny,nz)

Calls

proc~~remap_tracer_grounded~~CallsGraph proc~remap_tracer_grounded remap_tracer_grounded local local proc~remap_tracer_grounded->local proc~remap_column remap_column proc~remap_tracer_grounded->proc~remap_column proc~remap_column_pcm remap_column_pcm proc~remap_column->proc~remap_column_pcm proc~remap_column_plm remap_column_plm proc~remap_column->proc~remap_column_plm proc~remap_column_ppm remap_column_ppm proc~remap_column->proc~remap_column_ppm proc~remap_column_ppm_h4 remap_column_ppm_h4 proc~remap_column->proc~remap_column_ppm_h4 proc~remap_column_pqm remap_column_pqm proc~remap_column->proc~remap_column_pqm proc~boundary_half_jump boundary_half_jump proc~remap_column_plm->proc~boundary_half_jump proc~plm_slope_nonuniform plm_slope_nonuniform proc~remap_column_plm->proc~plm_slope_nonuniform proc~remap_column_ppm->proc~remap_column_plm proc~remap_column_ppm->proc~boundary_half_jump proc~ppm_edge_nonuniform ppm_edge_nonuniform proc~remap_column_ppm->proc~ppm_edge_nonuniform proc~ppm_edge_two_cell ppm_edge_two_cell proc~remap_column_ppm->proc~ppm_edge_two_cell proc~ppm_jump_nonuniform ppm_jump_nonuniform proc~remap_column_ppm->proc~ppm_jump_nonuniform proc~remap_column_ppm_h4->proc~remap_column_plm proc~remap_column_ppm_h4->proc~boundary_half_jump proc~remap_column_pqm->proc~remap_column_ppm proc~remap_column_pqm->proc~boundary_half_jump proc~pqm_end_value_h4 pqm_end_value_h4 proc~remap_column_pqm->proc~pqm_end_value_h4 proc~pqm_solve_diag_dominant pqm_solve_diag_dominant proc~remap_column_pqm->proc~pqm_solve_diag_dominant

Called by

proc~~remap_tracer_grounded~~CalledByGraph proc~remap_tracer_grounded remap_tracer_grounded proc~ocean_apply_conservative_min_thickness ocean_apply_conservative_min_thickness proc~ocean_apply_conservative_min_thickness->proc~remap_tracer_grounded proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~ocean_apply_conservative_min_thickness proc~run_stage_split run_stage_split proc~run_stage_split->proc~run_continuity_chain proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_split proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step_split

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: c_new(NZ_STACK_MAX)
real(kind=wp), private :: c_old(NZ_STACK_MAX)
real(kind=wp), private :: h_new_col(NZ_STACK_MAX)
real(kind=wp), private :: h_old_col(NZ_STACK_MAX)
integer, private :: i
integer, private :: j
integer, private :: k

Source Code

   pure subroutine remap_tracer_grounded(nx, ny, nz, h_old, h_new, mask, hTr)
      !! Conservative tracer remap gated on the grounded mask.  Non-grounded
      !! columns are skipped -> hTr byte-unchanged; the concentration
      !! divisions only happen on grounded columns.
      integer, intent(in) :: nx, ny, nz
      real(wp), intent(in) :: h_old(nx, ny, nz)
      real(wp), intent(in) :: h_new(nx, ny, nz)
      real(wp), intent(in) :: mask(nx, ny, 1)
      real(wp), intent(inout) :: hTr(nx, ny, nz)
      integer :: i, j, k
      real(wp) :: h_old_col(NZ_STACK_MAX), h_new_col(NZ_STACK_MAX)
      real(wp) :: c_old(NZ_STACK_MAX), c_new(NZ_STACK_MAX)

      do concurrent(j=1:ny, i=1:nx) &
         local(k, h_old_col, h_new_col, c_old, c_new)
         if (mask(i, j, 1) > 0.5_wp) then
            do k = 1, nz
               h_old_col(k) = h_old(i, j, k)
               h_new_col(k) = h_new(i, j, k)
               if (h_old_col(k) > H_CONC_FLOOR) then
                  c_old(k) = hTr(i, j, k)/h_old_col(k)
               else
                  c_old(k) = 0.0_wp
               end if
            end do
            call remap_column(REMAP_PPM, nz, h_old_col(1:nz), h_new_col(1:nz), &
                              c_old(1:nz), c_new(1:nz))
            do k = 1, nz
               hTr(i, j, k) = c_new(k)*h_new_col(k)
            end do
         end if
      end do
   end subroutine remap_tracer_grounded