New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 11564 for NEMO/branches/2019/dev_r10973_AGRIF-01_jchanut_small_jpi_jpj/src/ICE/iceitd.F90 – NEMO

Ignore:
Timestamp:
2019-09-18T16:11:52+02:00 (5 years ago)
Author:
jchanut
Message:

#2199, merged with trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10973_AGRIF-01_jchanut_small_jpi_jpj/src/ICE/iceitd.F90

    r10069 r11564  
    2121   USE ice1D          ! sea-ice: thermodynamic variables 
    2222   USE ice            ! sea-ice: variables 
     23   USE icevar         ! sea-ice: operations 
    2324   USE icectl         ! sea-ice: conservation tests 
    2425   USE icetab         ! sea-ice: convert 1D<=>2D 
     
    8788 
    8889      IF( ln_icediachk )   CALL ice_cons_hsm(0, 'iceitd_rem', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) 
     90      IF( ln_icediachk )   CALL ice_cons2D  (0, 'iceitd_rem',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft) 
    8991 
    9092      !----------------------------------------------------------------------------------------------- 
    9193      !  1) Identify grid cells with ice 
    9294      !----------------------------------------------------------------------------------------------- 
     95      at_i(:,:) = SUM( a_i, dim=3 ) 
     96      ! 
    9397      npti = 0   ;   nptidx(:) = 0 
    9498      DO jj = 1, jpj 
     
    249253            ! --- g(h) for each thickness category --- !   
    250254            CALL itd_glinear( zhbnew(1:npti,jl-1), zhbnew(1:npti,jl), h_i_1d(1:npti)   , a_i_1d(1:npti)   ,  &   ! in 
    251                &              g0    (1:npti,jl  ), g1    (1:npti,jl), hL     (1:npti,jl), hR   (1:npti,jl)   )   ! out 
     255               &              g0    (1:npti,jl  ), g1    (1:npti,jl), hL    (1:npti,jl), hR    (1:npti,jl)   )   ! out 
    252256            ! 
    253257         END DO 
     
    313317      ! 
    314318      IF( ln_icediachk )   CALL ice_cons_hsm(1, 'iceitd_rem', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) 
     319      IF( ln_icediachk )   CALL ice_cons2D  (1, 'iceitd_rem',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft) 
    315320      ! 
    316321   END SUBROUTINE ice_itd_rem 
     
    389394      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pdvice   ! ice volume transferred across boundary 
    390395      ! 
    391       INTEGER  ::   ji, jj, jl, jk     ! dummy loop indices 
    392       INTEGER  ::   ii, ij, jl2, jl1   ! local integers 
     396      INTEGER  ::   ji, jl, jk         ! dummy loop indices 
     397      INTEGER  ::   jl2, jl1           ! local integers 
    393398      REAL(wp) ::   ztrans             ! ice/snow transferred 
    394       REAL(wp), DIMENSION(jpij)     ::   zworka, zworkv   ! workspace 
    395       REAL(wp), DIMENSION(jpij,jpl) ::   zaTsfn           !  -    - 
     399      REAL(wp), DIMENSION(jpij)            ::   zworka, zworkv   ! workspace 
     400      REAL(wp), DIMENSION(jpij,jpl)        ::   zaTsfn           !  -    - 
     401      REAL(wp), DIMENSION(jpij,nlay_i,jpl) ::   ze_i_2d 
     402      REAL(wp), DIMENSION(jpij,nlay_s,jpl) ::   ze_s_2d 
    396403      !!------------------------------------------------------------------ 
    397404          
     
    405412      CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip ) 
    406413      CALL tab_3d_2d( npti, nptidx(1:npti), t_su_2d(1:npti,1:jpl), t_su ) 
     414      DO jl = 1, jpl 
     415         DO jk = 1, nlay_s 
     416            CALL tab_2d_1d( npti, nptidx(1:npti), ze_s_2d(1:npti,jk,jl), e_s(:,:,jk,jl) ) 
     417         END DO 
     418         DO jk = 1, nlay_i 
     419            CALL tab_2d_1d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) ) 
     420         END DO 
     421      END DO 
     422      ! to correct roundoff errors on a_i 
     423      CALL tab_2d_1d( npti, nptidx(1:npti), rn_amax_1d(1:npti), rn_amax_2d ) 
    407424 
    408425      !---------------------------------------------------------------------------------------------- 
     
    435452               ELSE                                  ;   zworka(ji) = 0._wp 
    436453               ENDIF 
    437                ! 
    438                ! clem: The transfer between one category to another can lead to very small negative values (-1.e-20) 
    439                !       because of truncation error ( i.e. 1. - 1. /= 0 ) 
    440                !       I do not think it should be a concern since small areas and volumes are erased (in ice_var_zapsmall.F90) 
    441454               ! 
    442455               a_i_2d(ji,jl1) = a_i_2d(ji,jl1) - pdaice(ji,jl)       ! Ice areas 
     
    476489         ! 
    477490         DO jk = 1, nlay_s         !--- Snow heat content 
    478             ! 
    479491            DO ji = 1, npti 
    480                ii = MOD( nptidx(ji) - 1, jpi ) + 1 
    481                ij = ( nptidx(ji) - 1 ) / jpi + 1 
    482492               ! 
    483493               jl1 = kdonor(ji,jl) 
     
    487497                  ELSE                ;  jl2 = jl 
    488498                  ENDIF 
    489                   ! 
    490                   ztrans            = e_s(ii,ij,jk,jl1) * zworkv(ji) 
    491                   e_s(ii,ij,jk,jl1) = e_s(ii,ij,jk,jl1) - ztrans 
    492                   e_s(ii,ij,jk,jl2) = e_s(ii,ij,jk,jl2) + ztrans 
     499                  ztrans             = ze_s_2d(ji,jk,jl1) * zworkv(ji) 
     500                  ze_s_2d(ji,jk,jl1) = ze_s_2d(ji,jk,jl1) - ztrans 
     501                  ze_s_2d(ji,jk,jl2) = ze_s_2d(ji,jk,jl2) + ztrans 
    493502               ENDIF 
    494503            END DO 
     
    497506         DO jk = 1, nlay_i         !--- Ice heat content 
    498507            DO ji = 1, npti 
    499                ii = MOD( nptidx(ji) - 1, jpi ) + 1 
    500                ij = ( nptidx(ji) - 1 ) / jpi + 1 
    501508               ! 
    502509               jl1 = kdonor(ji,jl) 
     
    506513                  ELSE                ;  jl2 = jl 
    507514                  ENDIF 
    508                   ! 
    509                   ztrans            = e_i(ii,ij,jk,jl1) * zworkv(ji) 
    510                   e_i(ii,ij,jk,jl1) = e_i(ii,ij,jk,jl1) - ztrans 
    511                   e_i(ii,ij,jk,jl2) = e_i(ii,ij,jk,jl2) + ztrans 
     515                  ztrans             = ze_i_2d(ji,jk,jl1) * zworkv(ji) 
     516                  ze_i_2d(ji,jk,jl1) = ze_i_2d(ji,jk,jl1) - ztrans 
     517                  ze_i_2d(ji,jk,jl2) = ze_i_2d(ji,jk,jl2) + ztrans 
    512518               ENDIF 
    513519            END DO 
     
    515521         ! 
    516522      END DO                   ! boundaries, 1 to jpl-1 
     523 
     524      !------------------- 
     525      ! 3) roundoff errors 
     526      !------------------- 
     527      ! clem: The transfer between one category to another can lead to very small negative values (-1.e-20) 
     528      !       because of truncation error ( i.e. 1. - 1. /= 0 ) 
     529      CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, ze_s_2d, ze_i_2d ) 
     530 
     531      ! at_i must be <= rn_amax 
     532      zworka(1:npti) = SUM( a_i_2d(1:npti,:), dim=2 ) 
     533      DO jl  = 1, jpl 
     534         WHERE( zworka(1:npti) > rn_amax_1d(1:npti) )   & 
     535            &   a_i_2d(1:npti,jl) = a_i_2d(1:npti,jl) * rn_amax_1d(1:npti) / zworka(1:npti) 
     536      END DO 
    517537       
    518538      !------------------------------------------------------------------------------- 
    519       ! 3) Update ice thickness and temperature 
     539      ! 4) Update ice thickness and temperature 
    520540      !------------------------------------------------------------------------------- 
    521541      WHERE( a_i_2d(1:npti,:) >= epsi20 ) 
     
    536556      CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip ) 
    537557      CALL tab_2d_3d( npti, nptidx(1:npti), t_su_2d(1:npti,1:jpl), t_su ) 
     558      DO jl = 1, jpl 
     559         DO jk = 1, nlay_s 
     560            CALL tab_1d_2d( npti, nptidx(1:npti), ze_s_2d(1:npti,jk,jl), e_s(:,:,jk,jl) ) 
     561         END DO 
     562         DO jk = 1, nlay_i 
     563            CALL tab_1d_2d( npti, nptidx(1:npti), ze_i_2d(1:npti,jk,jl), e_i(:,:,jk,jl) ) 
     564         END DO 
     565      END DO 
    538566      ! 
    539567   END SUBROUTINE itd_shiftice 
     
    558586      ! 
    559587      IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_itd_reb: rebining ice thickness distribution'  
     588      ! 
     589      IF( ln_icediachk )   CALL ice_cons_hsm(0, 'iceitd_reb', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) 
     590      IF( ln_icediachk )   CALL ice_cons2D  (0, 'iceitd_reb',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft) 
    560591      ! 
    561592      jdonor(:,:) = 0 
     
    635666      END DO 
    636667      ! 
     668      IF( ln_icediachk )   CALL ice_cons_hsm(1, 'iceitd_reb', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) 
     669      IF( ln_icediachk )   CALL ice_cons2D  (1, 'iceitd_reb',  diag_v,  diag_s,  diag_t,  diag_fv,  diag_fs,  diag_ft) 
     670      ! 
    637671   END SUBROUTINE ice_itd_reb 
    638672 
     
    655689      REWIND( numnam_ice_ref )      ! Namelist namitd in reference namelist : Parameters for ice 
    656690      READ  ( numnam_ice_ref, namitd, IOSTAT = ios, ERR = 901) 
    657 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namitd in reference namelist', lwp ) 
     691901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namitd in reference namelist' ) 
    658692      REWIND( numnam_ice_cfg )      ! Namelist namitd in configuration namelist : Parameters for ice 
    659693      READ  ( numnam_ice_cfg, namitd, IOSTAT = ios, ERR = 902 ) 
    660 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namitd in configuration namelist', lwp ) 
     694902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namitd in configuration namelist' ) 
    661695      IF(lwm) WRITE( numoni, namitd ) 
    662696      ! 
Note: See TracChangeset for help on using the changeset viewer.