Seed hTr(i,j,k) = t_layer(k) * h_layer(i,j,k) for the
per-layer stratified-IC tracer (temperature). t_layer(:) is
a small 1D array pre-computed on host.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(inout) | :: | hTr(:,:,:) | |||
| real(kind=wp), | intent(in) | :: | h_layer(:,:,:) | |||
| real(kind=wp), | intent(in) | :: | t_layer(:) | |||
| integer, | intent(in) | :: | nz_ml |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | private | :: | i | ||||
| integer, | private | :: | j | ||||
| integer, | private | :: | k | ||||
| integer, | private | :: | nx | ||||
| integer, | private | :: | ny |
pure subroutine seed_tracer_stratified_impl(hTr, h_layer, t_layer, nz_ml) !! Seed `hTr(i,j,k) = t_layer(k) * h_layer(i,j,k)` for the !! per-layer stratified-IC tracer (temperature). `t_layer(:)` is !! a small 1D array pre-computed on host. ! assumed-shape-ok: init routine called once at startup; size(hTr,1/2) ! used to derive loop bounds (flat-impl over registry-dereferenced allocatables). real(wp), intent(inout) :: hTr(:, :, :) real(wp), intent(in) :: h_layer(:, :, :) ! assumed-shape-ok: init routine; size() derives loop bounds real(wp), intent(in) :: t_layer(:) integer, intent(in) :: nz_ml integer :: i, j, k, nx, ny nx = size(hTr, 1) ny = size(hTr, 2) ! Plain host loop ON PURPOSE: this runs BEFORE enter_data, so a ! do concurrent here makes -stdpar=gpu implicitly round-trip the ! (unmapped) arrays through the device per loop — measured 36.9 s ! of ic_seed at 5.3M cells. Setup-only code seeds on the host; ! enter_data then maps the seeded values once. do k = 1, nz_ml do j = 1, ny do i = 1, nx hTr(i, j, k) = t_layer(k)*h_layer(i, j, k) end do end do end do end subroutine seed_tracer_stratified_impl