CICE-Consortium / CICE

Development repository for the CICE sea-ice model
Other
57 stars 131 forks source link

Some CMIP variables are computed using a mix of U and T quantities #904

Open phil-blain opened 11 months ago

phil-blain commented 11 months ago

Hi @dabail10,

I realized that some of the CMIP output variables are computed by multiplying the concentration aice (thus a T-point quantity) with variables from the dynamics which are U-point quantities. I'm wondering if we should not use grid_average_X2Y to shift the dynamical quantities to the T-point prior to computing these variables ?

Here is a diff that shows which variables I'm talking about:

diff --git a/cicecore/cicedyn/analysis/ice_history.F90 b/cicecore/cicedyn/analysis/ice_history.F90
index 570ef495..6340d503 100644
--- a/cicecore/cicedyn/analysis/ice_history.F90
+++ b/cicecore/cicedyn/analysis/ice_history.F90
@@ -2744,11 +2744,11 @@ subroutine accum_hist (dt)

          if (f_siu(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
-              if (aice(i,j,iblk) > puny) worka(i,j) = aice(i,j,iblk)*uvel(i,j,iblk)
+              if (aice(i,j,iblk) > puny) worka(i,j) = aice(i,j,iblk)*uvel(i,j,iblk) ! should be computed at the same location ?
            enddo
            enddo
            call accum_hist_field(n_siu, iblk, worka(:,:), a2D)
          endif

@@ -2816,11 +2816,11 @@ subroutine accum_hist (dt)
          if (f_sistrxdtop(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice_init(i,j,iblk) > puny) &
-                 worka(i,j) = aice(i,j,iblk)*(aice(i,j,iblk)*strairxU(i,j,iblk)/aice_init(i,j,iblk))
+                 worka(i,j) = aice(i,j,iblk)*(aice(i,j,iblk)*strairxU(i,j,iblk)/aice_init(i,j,iblk)) !idem
            enddo
            enddo
            call accum_hist_field(n_sistrxdtop, iblk, worka(:,:), a2D)
          endif

@@ -2838,11 +2838,11 @@ subroutine accum_hist (dt)
          if (f_sistrxubot(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) &
-                 worka(i,j) = aice(i,j,iblk)*strocnxU(i,j,iblk)
+                 worka(i,j) = aice(i,j,iblk)*strocnxU(i,j,iblk) ! idem
            enddo
            enddo
            call accum_hist_field(n_sistrxubot, iblk, worka(:,:), a2D)
          endif

@@ -3302,11 +3302,11 @@ subroutine accum_hist (dt)
          if (f_sidragtop(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) then
-                 worka(i,j) = aice(i,j,iblk)*Cdn_atm(i,j,iblk)
+                 worka(i,j) = aice(i,j,iblk)*Cdn_atm(i,j,iblk) !idem
               endif
            enddo
            enddo
            call accum_hist_field(n_sidragtop, iblk, worka(:,:), a2D)
          endif
@@ -3327,11 +3327,11 @@ subroutine accum_hist (dt)
          if (f_siforcetiltx(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) then
-                 worka(i,j) = aice(i,j,iblk)*strtltxU(i,j,iblk)
+                 worka(i,j) = aice(i,j,iblk)*strtltxU(i,j,iblk) !idem
               endif
            enddo
            enddo
            call accum_hist_field(n_siforcetiltx, iblk, worka(:,:), a2D)
          endif
@@ -3339,11 +3339,11 @@ subroutine accum_hist (dt)
          if (f_siforcetilty(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) then
-                 worka(i,j) = aice(i,j,iblk)*strtltyU(i,j,iblk)
+                 worka(i,j) = aice(i,j,iblk)*strtltyU(i,j,iblk) ! idem
               endif
            enddo
            enddo
            call accum_hist_field(n_siforcetilty, iblk, worka(:,:), a2D)
          endif
@@ -3351,11 +3351,11 @@ subroutine accum_hist (dt)
          if (f_siforcecoriolx(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) then
-                 worka(i,j) = aice(i,j,iblk)*fmU(i,j,iblk)*vvel(i,j,iblk)
+                 worka(i,j) = aice(i,j,iblk)*fmU(i,j,iblk)*vvel(i,j,iblk) ! idem
               endif
            enddo
            enddo
            call accum_hist_field(n_siforcecoriolx, iblk, worka(:,:), a2D)
          endif
@@ -3363,11 +3363,11 @@ subroutine accum_hist (dt)
          if (f_siforcecorioly(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) then
-                 worka(i,j) = -aice(i,j,iblk)*fmU(i,j,iblk)*uvel(i,j,iblk)
+                 worka(i,j) = -aice(i,j,iblk)*fmU(i,j,iblk)*uvel(i,j,iblk) ! idem
               endif
            enddo
            enddo
            call accum_hist_field(n_siforcecorioly, iblk, worka(:,:), a2D)
          endif
@@ -3375,11 +3375,11 @@ subroutine accum_hist (dt)
          if (f_siforceintstrx(1:1) /= 'x') then
            worka(:,:) = c0
            do j = jlo, jhi
            do i = ilo, ihi
               if (aice(i,j,iblk) > puny) then
-                 worka(i,j) = aice(i,j,iblk)*strintxU(i,j,iblk)
+                 worka(i,j) = aice(i,j,iblk)*strintxU(i,j,iblk) ! idem
               endif
            enddo
            enddo
            call accum_hist_field(n_siforceintstrx, iblk, worka(:,:), a2D)
          endif

I'm working on some slight refactoring of the history code so I could include such a change if you think it makes sense.

dabail10 commented 11 months ago

This was a debate. According to the SIMIP protocol, everything was supposed to stay on the native grid. I agree that I probably should have interpolated these. I ended up leaving this as is. I am open to changing this.