From 6ffd5471c4b7b8f34079c9f11301bc38684ac2cc Mon Sep 17 00:00:00 2001 From: Philippe Blain Date: Fri, 20 Oct 2023 16:41:06 -0400 Subject: [PATCH] ice_history: use avg_ice_present, mask_ice_free_points to reduce duplication Some CMIP variables are processed differently in ice_history::accum_hist: they are averaged only for time steps when ice is present, and points where ice is absent are masked. This processing is repeated for each of these variables in the 2D and 3Dc loops. To reduce code duplication, use the new components avg_ice_present and mask_ice_free_points of ice_hist_field to perform this processing only for variables that were defined accordingly. The relevant variables already have those components defined as of the previous commit. Note that we still need a separate loop for the variable 'sialb' (sea ice albedo) to mask points below the horizon. --- cicecore/cicedyn/analysis/ice_history.F90 | 434 +--------------------- 1 file changed, 13 insertions(+), 421 deletions(-) diff --git a/cicecore/cicedyn/analysis/ice_history.F90 b/cicecore/cicedyn/analysis/ice_history.F90 index 8d283d08f..34e5a9131 100644 --- a/cicecore/cicedyn/analysis/ice_history.F90 +++ b/cicecore/cicedyn/analysis/ice_history.F90 @@ -3654,425 +3654,29 @@ subroutine accum_hist (dt) enddo ! j ! Only average for timesteps when ice present - if (index(avail_hist_fields(n)%vname,'sithick') /= 0) then + if (avail_hist_fields(n)%avg_ice_present) then do j = jlo, jhi do i = ilo, ihi if (tmask(i,j,iblk)) then a2D(i,j,n,iblk) = & a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siage') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sisnthick') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sitemptop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sitempsnic') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sitempbot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siu') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siv') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sistrxdtop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sistrydtop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sistrxubot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sistryubot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sicompstren') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sispeed') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) + ! Mask ice-free points + if (avail_hist_fields(n)%mask_ice_free_points) then + if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl enddo ! i enddo ! j endif + + ! CMIP albedo: also mask points below horizon if (index(avail_hist_fields(n)%vname,'sialb') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - if (albcnt(i,j,iblk,ns) <= puny) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflswdtop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflswutop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflswdbot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sifllwdtop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sifllwutop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflsenstop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflsensupbot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sifllatstop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sipr') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sifb') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflcondtop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflcondbot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflsaltbot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflfwbot') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siflfwdrain') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sidragtop') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'sirdgthick') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siforcetiltx') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siforcetilty') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siforcecoriolx') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siforcecorioly') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siforceintstrx') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif - if (index(avail_hist_fields(n)%vname,'siforceintstry') /= 0) then - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a2D(i,j,n,iblk) = & - a2D(i,j,n,iblk)*avgct(ns)*ravgip(i,j) - endif - if (ravgip(i,j) == c0) a2D(i,j,n,iblk) = spval_dbl - enddo ! i - enddo ! j - endif + do j = jlo, jhi + do i = ilo, ihi + if (albcnt(i,j,iblk,ns) <= puny) a2D(i,j,n,iblk) = spval_dbl + enddo ! i + enddo ! j + endif ! back out albedo/zenith angle dependence if (avail_hist_fields(n)%vname(1:6) == 'albice') then @@ -4183,19 +3787,7 @@ subroutine accum_hist (dt) enddo ! i enddo ! j enddo ! k - if (index(avail_hist_fields(nn)%vname,'siitdthick') /= 0) then - do k = 1, ncat_hist - do j = jlo, jhi - do i = ilo, ihi - if (tmask(i,j,iblk)) then - a3Dc(i,j,k,n,iblk) = & - a3Dc(i,j,k,n,iblk)*avgct(ns)*ravgipn(i,j,k) - endif - enddo ! i - enddo ! j - enddo ! k - endif - if (index(avail_hist_fields(nn)%vname,'siitdsnthick') /= 0) then + if (avail_hist_fields(nn)%avg_ice_present) then do k = 1, ncat_hist do j = jlo, jhi do i = ilo, ihi