Skip to content

Commit

Permalink
Remove implicit copies in CT_extract_data rotation
Browse files Browse the repository at this point in the history
Following on the previous commit, the implicit copies in
`extract_coupler_type_data`'s `allocate_rotated_array` and
`rotate_array` are replaced with the full-sized arrays, with halos
managed by `idim` and `jdim` arguments to `CT_extract_data`.

I tested this in a rotated `Baltic` test and saw no answer changes.  The
`ocean.stats` and CFC restart files agree, but there are still known
rotation reordering and negative-zero errors in `MOM.res.nc` output.
  • Loading branch information
marshallward authored and Hallberg-NOAA committed Jan 23, 2025
1 parent aecf6f9 commit b7bc87f
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions src/framework/MOM_coupler_types.F90
Original file line number Diff line number Diff line change
Expand Up @@ -391,27 +391,33 @@ subroutine extract_coupler_type_data(var_in, bc_index, array_out, scale_factor,
! Local variables
real, allocatable :: array_unrot(:,:) ! Array on the unrotated grid in arbitrary units [A]
integer :: q_turns ! The number of quarter turns through which array_out is to be rotated
integer :: index, is, ie, js, je, halo
integer :: index

index = ind_flux ; if (present(field_index)) index = field_index
q_turns = 0 ; if (present(turns)) q_turns = modulo(turns, 4)
halo = 0 ; if (present(halo_size)) halo = halo_size

! The case with non-trivial grid rotation is complicated by the fact that the data fields
! in the coupler_2d_bc_type are never rotated, so they need to be handled separately.
if (q_turns == 0) then
call CT_extract_data(var_in, bc_index, index, array_out, &
scale_factor=scale_factor, halo_size=halo_size, idim=idim, jdim=jdim)
scale_factor=scale_factor, halo_size=halo_size, idim=idim, jdim=jdim)
elseif (present(idim) .and. present(jdim)) then
! Work only on the computational domain plus symmetric halos.
is = idim(2)-halo ; ie = idim(3)+halo ; js = jdim(2)-halo ; je = jdim(3)+halo
call allocate_rotated_array(array_out(is:ie,js:je), [1,1], -q_turns, array_unrot)
call CT_extract_data(var_in, bc_index, index, array_unrot, scale_factor=scale_factor, halo_size=halo)
call rotate_array(array_unrot, q_turns, array_out(is:ie,js:je))
call allocate_rotated_array(array_out, [1,1], -q_turns, array_unrot)

if (modulo(q_turns, 2) /= 0) then
call CT_extract_data(var_in, bc_index, index, array_unrot, &
idim=jdim, jdim=idim, scale_factor=scale_factor, halo_size=halo_size)
else
call CT_extract_data(var_in, bc_index, index, array_unrot, &
idim=idim, jdim=jdim, scale_factor=scale_factor, halo_size=halo_size)
endif

call rotate_array(array_unrot, q_turns, array_out)
deallocate(array_unrot)
else
call allocate_rotated_array(array_out, [1,1], -q_turns, array_unrot)
call CT_extract_data(var_in, bc_index, index, array_unrot, scale_factor=scale_factor, halo_size=halo)
call CT_extract_data(var_in, bc_index, index, array_unrot, &
scale_factor=scale_factor, halo_size=halo_size)
call rotate_array(array_unrot, q_turns, array_out)
deallocate(array_unrot)
endif
Expand Down

0 comments on commit b7bc87f

Please sign in to comment.