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
39 changes: 37 additions & 2 deletions cicecore/cicedyn/dynamics/ice_dyn_evp1d.F90
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ subroutine dyn_evp1d_init
endif

! gather from blks to global
call gather_static(G_uarear, G_dxT, G_dyT, G_tmask)
call gather_static(G_uarear, G_dxT, G_dyT, G_tmask)

! calculate number of water points (T and U). Only needed for the static version
! tmask in ocean/ice
Expand Down Expand Up @@ -349,7 +349,6 @@ subroutine evp1d_alloc_static_na(na0)
call abort_ice(subname//' ERROR: allocating', file=__FILE__, line=__LINE__)
endif


allocate(indxTi(1:na0), &
indxTj(1:na0), &
stat=ierr)
Expand Down Expand Up @@ -628,6 +627,11 @@ subroutine gather_static(G_uarear, G_dxT, G_dyT, G_Tmask)

character(len=*), parameter :: subname = '(gather_static)'

G_uarear = c0
G_dyT = c0
Copy link
Contributor

@TillRasmussen TillRasmussen Oct 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is necessary because the G_ARRAY of gather_global_ext is intent(inout).
Are there places where it is intent in?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This may not be necessary in practice if we can be sure that the gather_global_ext sets all gridcells in the G_ arrays. But the cost of zeroing the arrays at initialization is also very small and probably reasonable to do. The hope is that zeroing these arrays makes the implementation more robust. Given we have a small technical issue in the evp1d implementation where some compilers trap a floating point error, this seems like a sensible thing to do for now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A slightly bigger worry is resetting all the G_ arrays to zero in convert_1d_2d_dyn below which happens each timestep. Again, it may improve robustness in the short term. But at some point, we may decide it's unnecessary and want to remove that code again.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Many of these conversions are not really needed or only needed for history output which should be done smarter than it currently is (only convert when needed).

G_dxT = c0
G_tmask = .false.

! copy from distributed I_* to G_*
call gather_global_ext(G_uarear, uarear, master_task, distrb_info)
call gather_global_ext(G_dxT , dxT , master_task, distrb_info)
Expand Down Expand Up @@ -977,6 +981,37 @@ subroutine convert_1d_2d_dyn(na0 , navel0 ,
integer(kind=int_kind) :: lo, up, iw, i, j
character(len=*), parameter :: subname = '(convert_1d_2d_dyn)'

G_stressp_1 = c0
G_stressp_2 = c0
G_stressp_3 = c0
G_stressp_4 = c0
G_stressm_1 = c0
G_stressm_2 = c0
G_stressm_3 = c0
G_stressm_4 = c0
G_stress12_1 = c0
G_stress12_2 = c0
G_stress12_3 = c0
G_stress12_4 = c0
G_strength = c0
G_cdn_ocn = c0
G_aiu = c0
G_uocn = c0
G_vocn = c0
G_waterxU = c0
G_wateryU = c0
G_forcexU = c0
G_forceyU = c0
G_umassdti = c0
G_fmU = c0
G_strintxU = c0
G_strintyU = c0
G_Tbu = c0
G_uvel = c0
G_vvel = c0
G_taubxU = c0
G_taubyU = c0

lo=1
up=na0
do iw = lo, up
Expand Down
26 changes: 26 additions & 0 deletions cicecore/cicedyn/dynamics/ice_dyn_shared.F90
Original file line number Diff line number Diff line change
Expand Up @@ -193,13 +193,24 @@ subroutine alloc_dyn_shared
stat=ierr)
if (ierr/=0) call abort_ice(subname//': Out of memory')

uvel_init = c0
vvel_init = c0
iceTmask = .false.
iceUmask = .false.
fcor_blk = c0
DminTarea = c0

allocate( &
fld2(nx_block,ny_block,2,max_blocks), &
fld3(nx_block,ny_block,3,max_blocks), &
fld4(nx_block,ny_block,4,max_blocks), &
stat=ierr)
if (ierr/=0) call abort_ice(subname//': Out of memory')

fld2 = c0
fld3 = c0
fld4 = c0

allocate( &
cyp(nx_block,ny_block,max_blocks), & ! 1.5*HTE - 0.5*HTW
cxp(nx_block,ny_block,max_blocks), & ! 1.5*HTN - 0.5*HTS
Expand All @@ -208,12 +219,19 @@ subroutine alloc_dyn_shared
stat=ierr)
if (ierr/=0) call abort_ice(subname//': Out of memory')

cyp = c0
cxp = c0
cym = c0
cxm = c0

if (grid_ice == 'B' .and. evp_algorithm == "standard_2d") then
allocate( &
dxhy(nx_block,ny_block,max_blocks), & ! 0.5*(HTE - HTW)
dyhx(nx_block,ny_block,max_blocks), & ! 0.5*(HTN - HTS)
stat=ierr)
if (ierr/=0) call abort_ice(subname//': Out of memory')
dxhy = c0
dyhx = c0
endif

if (grid_ice == 'CD' .or. grid_ice == 'C') then
Expand All @@ -228,6 +246,14 @@ subroutine alloc_dyn_shared
fcorN_blk (nx_block,ny_block,max_blocks), & ! Coriolis
stat=ierr)
if (ierr/=0) call abort_ice(subname//': Out of memory')
uvelE_init = c0
vvelE_init = c0
uvelN_init = c0
vvelN_init = c0
iceEmask = .false.
iceNmask = .false.
fcorE_blk = c0
fcorN_blk = c0
endif

end subroutine alloc_dyn_shared
Expand Down
Loading