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 4902 for branches/2014/dev_CNRS_2014/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90 – NEMO

Ignore:
Timestamp:
2014-11-27T17:13:38+01:00 (9 years ago)
Author:
cetlod
Message:

2014/dev_CNRS_2014 : Merge in the trunk changes between 4728 and 4879, see ticket #1415

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_CNRS_2014/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90

    r4901 r4902  
    7575      !! 
    7676      !! ** Inputs / Ouputs : (global commons) 
    77       !!           surface temperature : t_su_b 
    78       !!           ice/snow temperatures   : t_i_b, t_s_b 
    79       !!           ice salinities          : s_i_b 
     77      !!           surface temperature : t_su_1d 
     78      !!           ice/snow temperatures   : t_i_1d, t_s_1d 
     79      !!           ice salinities          : s_i_1d 
    8080      !!           number of layers in the ice/snow: nlay_i, nlay_s 
    8181      !!           profile of the ice/snow layers : z_i, z_s 
    82       !!           total ice/snow thickness : ht_i_b, ht_s_b 
     82      !!           total ice/snow thickness : ht_i_1d, ht_s_1d 
    8383      !! 
    8484      !! ** External :  
     
    9898      INTEGER ::   ii, ij      ! temporary dummy loop index 
    9999      INTEGER ::   numeq       ! current reference number of equation 
    100       INTEGER ::   layer       ! vertical dummy loop index  
     100      INTEGER ::   jk       ! vertical dummy loop index  
    101101      INTEGER ::   nconv       ! number of iterations in iterative procedure 
    102102      INTEGER ::   minnumeqmin, maxnumeqmax 
     
    114114      REAL(wp) ::   zerritmax   ! current maximal error on temperature  
    115115      REAL(wp), POINTER, DIMENSION(:) ::   ztfs        ! ice melting point 
    116       REAL(wp), POINTER, DIMENSION(:) ::   ztsuold     ! old surface temperature (before the iterative procedure ) 
    117       REAL(wp), POINTER, DIMENSION(:) ::   ztsuoldit   ! surface temperature at previous iteration 
     116      REAL(wp), POINTER, DIMENSION(:) ::   ztsu     ! old surface temperature (before the iterative procedure ) 
     117      REAL(wp), POINTER, DIMENSION(:) ::   ztsubit     ! surface temperature at previous iteration 
    118118      REAL(wp), POINTER, DIMENSION(:) ::   zh_i        ! ice layer thickness 
    119119      REAL(wp), POINTER, DIMENSION(:) ::   zh_s        ! snow layer thickness 
     
    129129      REAL(wp), POINTER, DIMENSION(:,:) ::   zradab_i    ! Radiation absorbed in the ice 
    130130      REAL(wp), POINTER, DIMENSION(:,:) ::   zkappa_i    ! Kappa factor in the ice 
    131       REAL(wp), POINTER, DIMENSION(:,:) ::   ztiold      ! Old temperature in the ice 
     131      REAL(wp), POINTER, DIMENSION(:,:) ::   zti      ! Old temperature in the ice 
    132132      REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_i      ! Eta factor in the ice 
    133133      REAL(wp), POINTER, DIMENSION(:,:) ::   ztitemp     ! Temporary temperature in the ice to check the convergence 
     
    137137      REAL(wp), POINTER, DIMENSION(:,:) ::   zradab_s    ! Radiation absorbed in the snow 
    138138      REAL(wp), POINTER, DIMENSION(:,:) ::   zkappa_s    ! Kappa factor in the snow 
    139       REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_s       ! Eta factor in the snow 
    140       REAL(wp), POINTER, DIMENSION(:,:) ::   ztstemp      ! Temporary temperature in the snow to check the convergence 
    141       REAL(wp), POINTER, DIMENSION(:,:) ::   ztsold       ! Temporary temperature in the snow 
    142       REAL(wp), POINTER, DIMENSION(:,:) ::   z_s          ! Vertical cotes of the layers in the snow 
    143       REAL(wp), POINTER, DIMENSION(:,:) ::   zindterm   ! Independent term 
    144       REAL(wp), POINTER, DIMENSION(:,:) ::   zindtbis   ! temporary independent term 
     139      REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_s      ! Eta factor in the snow 
     140      REAL(wp), POINTER, DIMENSION(:,:) ::   ztstemp     ! Temporary temperature in the snow to check the convergence 
     141      REAL(wp), POINTER, DIMENSION(:,:) ::   ztsb        ! Temporary temperature in the snow 
     142      REAL(wp), POINTER, DIMENSION(:,:) ::   z_s         ! Vertical cotes of the layers in the snow 
     143      REAL(wp), POINTER, DIMENSION(:,:) ::   zindterm    ! Independent term 
     144      REAL(wp), POINTER, DIMENSION(:,:) ::   zindtbis    ! temporary independent term 
    145145      REAL(wp), POINTER, DIMENSION(:,:) ::   zdiagbis 
    146       REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid   ! tridiagonal system terms 
     146      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid     ! tridiagonal system terms 
    147147      ! diag errors on heat 
    148148      REAL(wp), POINTER, DIMENSION(:) :: zdq, zq_ini, zhfx_err 
     
    150150      !  
    151151      CALL wrk_alloc( jpij, numeqmin, numeqmax, isnow ) 
    152       CALL wrk_alloc( jpij, ztfs, ztsuold, ztsuoldit, zh_i, zh_s, zfsw ) 
     152      CALL wrk_alloc( jpij, ztfs, ztsub, ztsubit, zh_i, zh_s, zfsw ) 
    153153      CALL wrk_alloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zhsu ) 
    154       CALL wrk_alloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztiold, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0) 
    155       CALL wrk_alloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsold, zeta_s, ztstemp, z_s, kjstart=0) 
    156       CALL wrk_alloc( jpij, jkmax+2, zindterm, zindtbis, zdiagbis  ) 
    157       CALL wrk_alloc( jpij, jkmax+2, 3, ztrid ) 
     154      CALL wrk_alloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0) 
     155      CALL wrk_alloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart=0) 
     156      CALL wrk_alloc( jpij, nlay_i+3, zindterm, zindtbis, zdiagbis  ) 
     157      CALL wrk_alloc( jpij, nlay_i+3, 3, ztrid ) 
    158158 
    159159      CALL wrk_alloc( jpij, zdq, zq_ini, zhfx_err ) 
     
    162162      zdq(:) = 0._wp ; zq_ini(:) = 0._wp       
    163163      DO ji = kideb, kiut 
    164          zq_ini(ji) = ( SUM( q_i_b(ji,1:nlay_i) ) * ht_i_b(ji) / REAL( nlay_i ) +  & 
    165             &           SUM( q_s_b(ji,1:nlay_s) ) * ht_s_b(ji) / REAL( nlay_s ) )  
     164         zq_ini(ji) = ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) / REAL( nlay_i ) +  & 
     165            &           SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) / REAL( nlay_s ) )  
    166166      END DO 
    167167 
     
    172172      DO ji = kideb , kiut 
    173173         ! is there snow or not 
    174          isnow(ji)= NINT(  1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_b(ji) ) )  ) 
     174         isnow(ji)= NINT(  1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_1d(ji) ) )  ) 
    175175         ! surface temperature of fusion 
    176176         ztfs(ji) = REAL( isnow(ji) ) * rtt + REAL( 1 - isnow(ji) ) * rtt 
    177177         ! layer thickness 
    178          zh_i(ji) = ht_i_b(ji) / REAL( nlay_i ) 
    179          zh_s(ji) = ht_s_b(ji) / REAL( nlay_s ) 
     178         zh_i(ji) = ht_i_1d(ji) / REAL( nlay_i ) 
     179         zh_s(ji) = ht_s_1d(ji) / REAL( nlay_s ) 
    180180      END DO 
    181181 
     
    187187      z_i(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st ice layer 
    188188 
    189       DO layer = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer 
    190          DO ji = kideb , kiut 
    191             z_s(ji,layer) = z_s(ji,layer-1) + ht_s_b(ji) / REAL( nlay_s ) 
    192          END DO 
    193       END DO 
    194  
    195       DO layer = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer 
    196          DO ji = kideb , kiut 
    197             z_i(ji,layer) = z_i(ji,layer-1) + ht_i_b(ji) / REAL( nlay_i ) 
     189      DO jk = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer 
     190         DO ji = kideb , kiut 
     191            z_s(ji,jk) = z_s(ji,jk-1) + ht_s_1d(ji) / REAL( nlay_s ) 
     192         END DO 
     193      END DO 
     194 
     195      DO jk = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer 
     196         DO ji = kideb , kiut 
     197            z_i(ji,jk) = z_i(ji,jk-1) + ht_i_1d(ji) / REAL( nlay_i ) 
    198198         END DO 
    199199      END DO 
     
    216216      DO ji = kideb , kiut 
    217217         ! switches 
    218          isnow(ji) = NINT(  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_b(ji) ) )  )  
     218         isnow(ji) = NINT(  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_1d(ji) ) )  )  
    219219         ! hs > 0, isnow = 1 
    220220         zhsu (ji) = hnzst  ! threshold for the computation of i0 
    221          zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_b(ji) / zhsu(ji) ) )      
     221         zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_1d(ji) / zhsu(ji) ) )      
    222222 
    223223         i0(ji)    = REAL( 1 - isnow(ji) ) * ( fr1_i0_1d(ji) + zihic(ji) * fr2_i0_1d(ji) ) 
     
    226226         !            a function of the cloud cover 
    227227         ! 
    228          !i0(ji)     =  (1.0-FLOAT(isnow(ji)))*3.0/(100*ht_s_b(ji)+10.0) 
     228         !i0(ji)     =  (1.0-FLOAT(isnow(ji)))*3.0/(100*ht_s_1d(ji)+10.0) 
    229229         !formula used in Cice 
    230230      END DO 
     
    248248      END DO 
    249249 
    250       DO layer = 1, nlay_s          ! Radiation through snow 
     250      DO jk = 1, nlay_s          ! Radiation through snow 
    251251         DO ji = kideb, kiut 
    252252            !                             ! radiation transmitted below the layer-th snow layer 
    253             zradtr_s(ji,layer) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,layer) ) ) ) 
     253            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,jk) ) ) ) 
    254254            !                             ! radiation absorbed by the layer-th snow layer 
    255             zradab_s(ji,layer) = zradtr_s(ji,layer-1) - zradtr_s(ji,layer) 
     255            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk) 
    256256         END DO 
    257257      END DO 
     
    261261      END DO 
    262262 
    263       DO layer = 1, nlay_i          ! Radiation through ice 
     263      DO jk = 1, nlay_i          ! Radiation through ice 
    264264         DO ji = kideb, kiut 
    265265            !                             ! radiation transmitted below the layer-th ice layer 
    266             zradtr_i(ji,layer) = zradtr_i(ji,0) * EXP( - kappa_i * ( MAX ( 0._wp , z_i(ji,layer) ) ) ) 
     266            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - kappa_i * ( MAX ( 0._wp , z_i(ji,jk) ) ) ) 
    267267            !                             ! radiation absorbed by the layer-th ice layer 
    268             zradab_i(ji,layer) = zradtr_i(ji,layer-1) - zradtr_i(ji,layer) 
     268            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk) 
    269269         END DO 
    270270      END DO 
     
    280280      ! 
    281281      DO ji = kideb, kiut        ! Old surface temperature 
    282          ztsuold  (ji) =  t_su_b(ji)                              ! temperature at the beg of iter pr. 
    283          ztsuoldit(ji) =  t_su_b(ji)                              ! temperature at the previous iter 
    284          t_su_b   (ji) =  MIN( t_su_b(ji), ztfs(ji) - ztsu_err )  ! necessary 
     282         ztsub  (ji) =  t_su_1d(ji)                              ! temperature at the beg of iter pr. 
     283         ztsubit(ji) =  t_su_1d(ji)                              ! temperature at the previous iter 
     284         t_su_1d   (ji) =  MIN( t_su_1d(ji), ztfs(ji) - ztsu_err )  ! necessary 
    285285         zerrit   (ji) =  1000._wp                                ! initial value of error 
    286286      END DO 
    287287 
    288       DO layer = 1, nlay_s       ! Old snow temperature 
    289          DO ji = kideb , kiut 
    290             ztsold(ji,layer) =  t_s_b(ji,layer) 
    291          END DO 
    292       END DO 
    293  
    294       DO layer = 1, nlay_i       ! Old ice temperature 
    295          DO ji = kideb , kiut 
    296             ztiold(ji,layer) =  t_i_b(ji,layer) 
     288      DO jk = 1, nlay_s       ! Old snow temperature 
     289         DO ji = kideb , kiut 
     290            ztsb(ji,jk) =  t_s_1d(ji,jk) 
     291         END DO 
     292      END DO 
     293 
     294      DO jk = 1, nlay_i       ! Old ice temperature 
     295         DO ji = kideb , kiut 
     296            ztib(ji,jk) =  t_i_1d(ji,jk) 
    297297         END DO 
    298298      END DO 
     
    311311         IF( thcon_i_swi == 0 ) THEN      ! Untersteiner (1964) formula 
    312312            DO ji = kideb , kiut 
    313                ztcond_i(ji,0)        = rcdic + zbeta*s_i_b(ji,1) / MIN(-epsi10,t_i_b(ji,1)-rtt) 
     313               ztcond_i(ji,0)        = rcdic + zbeta*s_i_1d(ji,1) / MIN(-epsi10,t_i_1d(ji,1)-rtt) 
    314314               ztcond_i(ji,0)        = MAX(ztcond_i(ji,0),zkimin) 
    315315            END DO 
    316             DO layer = 1, nlay_i-1 
     316            DO jk = 1, nlay_i-1 
    317317               DO ji = kideb , kiut 
    318                   ztcond_i(ji,layer) = rcdic + zbeta*( s_i_b(ji,layer) + s_i_b(ji,layer+1) ) /  & 
    319                      MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt) 
    320                   ztcond_i(ji,layer) = MAX(ztcond_i(ji,layer),zkimin) 
     318                  ztcond_i(ji,jk) = rcdic + zbeta*( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) ) /  & 
     319                     MIN(-2.0_wp * epsi10, t_i_1d(ji,jk)+t_i_1d(ji,jk+1) - 2.0_wp * rtt) 
     320                  ztcond_i(ji,jk) = MAX(ztcond_i(ji,jk),zkimin) 
    321321               END DO 
    322322            END DO 
     
    325325         IF( thcon_i_swi == 1 ) THEN      ! Pringle et al formula included: 2.11 + 0.09 S/T - 0.011.T 
    326326            DO ji = kideb , kiut 
    327                ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_b(ji,1) / MIN( -epsi10, t_i_b(ji,1)-rtt )   & 
    328                   &                   - 0.011_wp * ( t_i_b(ji,1) - rtt )   
     327               ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1)-rtt )   & 
     328                  &                   - 0.011_wp * ( t_i_1d(ji,1) - rtt )   
    329329               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin ) 
    330330            END DO 
    331             DO layer = 1, nlay_i-1 
     331            DO jk = 1, nlay_i-1 
    332332               DO ji = kideb , kiut 
    333                   ztcond_i(ji,layer) = rcdic + 0.090_wp * ( s_i_b(ji,layer) + s_i_b(ji,layer+1) )   & 
    334                      &                                  / MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt)   & 
    335                      &                       - 0.0055_wp* ( t_i_b(ji,layer) + t_i_b(ji,layer+1) - 2.0*rtt )   
    336                   ztcond_i(ji,layer) = MAX( ztcond_i(ji,layer), zkimin ) 
     333                  ztcond_i(ji,jk) = rcdic +                                                                     &  
     334                     &                 0.090_wp * ( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) )                          & 
     335                     &                 / MIN(-2.0_wp * epsi10, t_i_1d(ji,jk)+t_i_1d(ji,jk+1) - 2.0_wp * rtt)   & 
     336                     &               - 0.0055_wp* ( t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0*rtt )   
     337                  ztcond_i(ji,jk) = MAX( ztcond_i(ji,jk), zkimin ) 
    337338               END DO 
    338339            END DO 
    339340            DO ji = kideb , kiut 
    340                ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_b(ji,nlay_i) / MIN(-epsi10,t_bo_b(ji)-rtt)   & 
    341                   &                        - 0.011_wp * ( t_bo_b(ji) - rtt )   
     341               ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_1d(ji,nlay_i) / MIN(-epsi10,t_bo_1d(ji)-rtt)   & 
     342                  &                        - 0.011_wp * ( t_bo_1d(ji) - rtt )   
    342343               ztcond_i(ji,nlay_i) = MAX( ztcond_i(ji,nlay_i), zkimin ) 
    343344            END DO 
     
    355356         END DO 
    356357 
    357          DO layer = 1, nlay_s-1 
    358             DO ji = kideb , kiut 
    359                zkappa_s(ji,layer)  = 2.0 * rcdsn / & 
     358         DO jk = 1, nlay_s-1 
     359            DO ji = kideb , kiut 
     360               zkappa_s(ji,jk)  = 2.0 * rcdsn / & 
    360361                  MAX(epsi10,2.0*zh_s(ji)) 
    361362            END DO 
    362363         END DO 
    363364 
    364          DO layer = 1, nlay_i-1 
     365         DO jk = 1, nlay_i-1 
    365366            DO ji = kideb , kiut 
    366367               !-- Ice kappa factors 
    367                zkappa_i(ji,layer)  = 2.0*ztcond_i(ji,layer)/ & 
     368               zkappa_i(ji,jk)  = 2.0*ztcond_i(ji,jk)/ & 
    368369                  MAX(epsi10,2.0*zh_i(ji))  
    369370            END DO 
     
    384385         !------------------------------------------------------------------------------| 
    385386         ! 
    386          DO layer = 1, nlay_i 
    387             DO ji = kideb , kiut 
    388                ztitemp(ji,layer)   = t_i_b(ji,layer) 
    389                zspeche_i(ji,layer) = cpic + zgamma*s_i_b(ji,layer)/ & 
    390                   MAX((t_i_b(ji,layer)-rtt)*(ztiold(ji,layer)-rtt),epsi10) 
    391                zeta_i(ji,layer)    = rdt_ice / MAX(rhoic*zspeche_i(ji,layer)*zh_i(ji), & 
     387         DO jk = 1, nlay_i 
     388            DO ji = kideb , kiut 
     389               ztitemp(ji,jk)   = t_i_1d(ji,jk) 
     390               zspeche_i(ji,jk) = cpic + zgamma*s_i_1d(ji,jk)/ & 
     391                  MAX((t_i_1d(ji,jk)-rtt)*(ztib(ji,jk)-rtt),epsi10) 
     392               zeta_i(ji,jk)    = rdt_ice / MAX(rhoic*zspeche_i(ji,jk)*zh_i(ji), & 
    392393                  epsi10) 
    393394            END DO 
    394395         END DO 
    395396 
    396          DO layer = 1, nlay_s 
    397             DO ji = kideb , kiut 
    398                ztstemp(ji,layer) = t_s_b(ji,layer) 
    399                zeta_s(ji,layer)  = rdt_ice / MAX(rhosn*cpic*zh_s(ji),epsi10) 
     397         DO jk = 1, nlay_s 
     398            DO ji = kideb , kiut 
     399               ztstemp(ji,jk) = t_s_1d(ji,jk) 
     400               zeta_s(ji,jk)  = rdt_ice / MAX(rhosn*cpic*zh_s(ji),epsi10) 
    400401            END DO 
    401402         END DO 
     
    408409            DO ji = kideb , kiut 
    409410               ! update of the non solar flux according to the update in T_su 
    410                qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_b(ji) - ztsuoldit(ji) ) 
     411               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsubit(ji) ) 
    411412            END DO 
    412413         ENDIF 
     
    432433         !!ice interior terms (top equation has the same form as the others) 
    433434 
    434          DO numeq=1,jkmax+2 
     435         DO numeq=1,nlay_i+3 
    435436            DO ji = kideb , kiut 
    436437               ztrid(ji,numeq,1) = 0. 
     
    445446         DO numeq = nlay_s + 2, nlay_s + nlay_i  
    446447            DO ji = kideb , kiut 
    447                layer              = numeq - nlay_s - 1 
    448                ztrid(ji,numeq,1)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer-1) 
    449                ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,layer)*(zkappa_i(ji,layer-1) + & 
    450                   zkappa_i(ji,layer)) 
    451                ztrid(ji,numeq,3)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer) 
    452                zindterm(ji,numeq) =  ztiold(ji,layer) + zeta_i(ji,layer)* & 
    453                   zradab_i(ji,layer) 
     448               jk              = numeq - nlay_s - 1 
     449               ztrid(ji,numeq,1)  =  - zeta_i(ji,jk)*zkappa_i(ji,jk-1) 
     450               ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,jk)*(zkappa_i(ji,jk-1) + & 
     451                  zkappa_i(ji,jk)) 
     452               ztrid(ji,numeq,3)  =  - zeta_i(ji,jk)*zkappa_i(ji,jk) 
     453               zindterm(ji,numeq) =  ztib(ji,jk) + zeta_i(ji,jk)* & 
     454                  zradab_i(ji,jk) 
    454455            END DO 
    455456         ENDDO 
     
    462463               +  zkappa_i(ji,nlay_i-1) ) 
    463464            ztrid(ji,numeq,3)  =  0.0 
    464             zindterm(ji,numeq) =  ztiold(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
     465            zindterm(ji,numeq) =  ztib(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
    465466               ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i)*zg1 & 
    466                *  t_bo_b(ji) )  
     467               *  t_bo_1d(ji) )  
    467468         ENDDO 
    468469 
    469470 
    470471         DO ji = kideb , kiut 
    471             IF ( ht_s_b(ji).gt.0.0 ) THEN 
     472            IF ( ht_s_1d(ji).gt.0.0 ) THEN 
    472473               ! 
    473474               !------------------------------------------------------------------------------| 
     
    477478               !!snow interior terms (bottom equation has the same form as the others) 
    478479               DO numeq = 3, nlay_s + 1 
    479                   layer =  numeq - 1 
    480                   ztrid(ji,numeq,1)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer-1) 
    481                   ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,layer)*( zkappa_s(ji,layer-1) + & 
    482                      zkappa_s(ji,layer) ) 
    483                   ztrid(ji,numeq,3)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer) 
    484                   zindterm(ji,numeq)  =  ztsold(ji,layer) + zeta_s(ji,layer)* & 
    485                      zradab_s(ji,layer) 
     480                  jk =  numeq - 1 
     481                  ztrid(ji,numeq,1)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk-1) 
     482                  ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,jk)*( zkappa_s(ji,jk-1) + & 
     483                     zkappa_s(ji,jk) ) 
     484                  ztrid(ji,numeq,3)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk) 
     485                  zindterm(ji,numeq)  =  ztsb(ji,jk) + zeta_s(ji,jk)* & 
     486                     zradab_s(ji,jk) 
    486487               END DO 
    487488 
     
    490491                  ztrid(ji,nlay_s+2,3)    =  0.0 
    491492                  zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1)* & 
    492                      t_bo_b(ji)  
     493                     t_bo_1d(ji)  
    493494               ENDIF 
    494495 
    495                IF ( t_su_b(ji) .LT. rtt ) THEN 
     496               IF ( t_su_1d(ji) .LT. rtt ) THEN 
    496497 
    497498                  !------------------------------------------------------------------------------| 
     
    506507                  ztrid(ji,1,2) = dzf(ji) - zg1s*zkappa_s(ji,0) 
    507508                  ztrid(ji,1,3) = zg1s*zkappa_s(ji,0) 
    508                   zindterm(ji,1) = dzf(ji)*t_su_b(ji)   - zf(ji) 
     509                  zindterm(ji,1) = dzf(ji)*t_su_1d(ji)   - zf(ji) 
    509510 
    510511                  !!first layer of snow equation 
     
    512513                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1)*(zkappa_s(ji,1) + zkappa_s(ji,0)*zg1s) 
    513514                  ztrid(ji,2,3)  =  - zeta_s(ji,1)* zkappa_s(ji,1) 
    514                   zindterm(ji,2) =  ztsold(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
     515                  zindterm(ji,2) =  ztsb(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
    515516 
    516517               ELSE  
     
    529530                     zkappa_s(ji,0) * zg1s ) 
    530531                  ztrid(ji,2,3)  =  - zeta_s(ji,1)*zkappa_s(ji,1)  
    531                   zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *            & 
     532                  zindterm(ji,2) = ztsb(ji,1) + zeta_s(ji,1) *            & 
    532533                     ( zradab_s(ji,1) +                         & 
    533                      zkappa_s(ji,0) * zg1s * t_su_b(ji) )  
     534                     zkappa_s(ji,0) * zg1s * t_su_1d(ji) )  
    534535               ENDIF 
    535536            ELSE 
     
    539540               !------------------------------------------------------------------------------| 
    540541               ! 
    541                IF (t_su_b(ji) .LT. rtt) THEN 
     542               IF (t_su_1d(ji) .LT. rtt) THEN 
    542543                  ! 
    543544                  !------------------------------------------------------------------------------| 
     
    553554                  ztrid(ji,numeqmin(ji),2)   =  dzf(ji) - zkappa_i(ji,0)*zg1     
    554555                  ztrid(ji,numeqmin(ji),3)   =  zkappa_i(ji,0)*zg1 
    555                   zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_b(ji) - zf(ji) 
     556                  zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_1d(ji) - zf(ji) 
    556557 
    557558                  !!first layer of ice equation 
     
    560561                     + zkappa_i(ji,0) * zg1 ) 
    561562                  ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1)*zkappa_i(ji,1)   
    562                   zindterm(ji,numeqmin(ji)+1)=  ztiold(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
     563                  zindterm(ji,numeqmin(ji)+1)=  ztib(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
    563564 
    564565                  !!case of only one layer in the ice (surface & ice equations are altered) 
     
    573574                     ztrid(ji,numeqmin(ji)+1,3)  =  0.0 
    574575 
    575                      zindterm(ji,numeqmin(ji)+1) =  ztiold(ji,1) + zeta_i(ji,1)* & 
    576                         ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji) ) 
     576                     zindterm(ji,numeqmin(ji)+1) =  ztib(ji,1) + zeta_i(ji,1)* & 
     577                        ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_1d(ji) ) 
    577578                  ENDIF 
    578579 
     
    593594                     zg1)   
    594595                  ztrid(ji,numeqmin(ji),3)      =  - zeta_i(ji,1) * zkappa_i(ji,1) 
    595                   zindterm(ji,numeqmin(ji))     =  ztiold(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
    596                      zkappa_i(ji,0) * zg1 * t_su_b(ji) )  
     596                  zindterm(ji,numeqmin(ji))     =  ztib(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
     597                     zkappa_i(ji,0) * zg1 * t_su_1d(ji) )  
    597598 
    598599                  !!case of only one layer in the ice (surface & ice equations are altered) 
     
    602603                        zkappa_i(ji,1)) 
    603604                     ztrid(ji,numeqmin(ji),3)  =  0.0 
    604                      zindterm(ji,numeqmin(ji)) =  ztiold(ji,1) + zeta_i(ji,1)* & 
    605                         (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji)) & 
    606                         + t_su_b(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0 
     605                     zindterm(ji,numeqmin(ji)) =  ztib(ji,1) + zeta_i(ji,1)* & 
     606                        (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_1d(ji)) & 
     607                        + t_su_1d(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0 
    607608                  ENDIF 
    608609 
     
    623624 
    624625         maxnumeqmax = 0 
    625          minnumeqmin = jkmax+4 
     626         minnumeqmin = nlay_i+5 
    626627 
    627628         DO ji = kideb , kiut 
     
    632633         END DO 
    633634 
    634          DO layer = minnumeqmin+1, maxnumeqmax 
    635             DO ji = kideb , kiut 
    636                numeq               =  min(max(numeqmin(ji)+1,layer),numeqmax(ji)) 
     635         DO jk = minnumeqmin+1, maxnumeqmax 
     636            DO ji = kideb , kiut 
     637               numeq               =  min(max(numeqmin(ji)+1,jk),numeqmax(ji)) 
    637638               zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2) - ztrid(ji,numeq,1)* & 
    638639                  ztrid(ji,numeq-1,3)/zdiagbis(ji,numeq-1) 
     
    644645         DO ji = kideb , kiut 
    645646            ! ice temperatures 
    646             t_i_b(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
     647            t_i_1d(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
    647648         END DO 
    648649 
    649650         DO numeq = nlay_i + nlay_s + 1, nlay_s + 2, -1 
    650651            DO ji = kideb , kiut 
    651                layer    =  numeq - nlay_s - 1 
    652                t_i_b(ji,layer)  =  (zindtbis(ji,numeq) - ztrid(ji,numeq,3)* & 
    653                   t_i_b(ji,layer+1))/zdiagbis(ji,numeq) 
     652               jk    =  numeq - nlay_s - 1 
     653               t_i_1d(ji,jk)  =  (zindtbis(ji,numeq) - ztrid(ji,numeq,3)* & 
     654                  t_i_1d(ji,jk+1))/zdiagbis(ji,numeq) 
    654655            END DO 
    655656         END DO 
     
    657658         DO ji = kideb , kiut 
    658659            ! snow temperatures       
    659             IF (ht_s_b(ji).GT.0._wp) & 
    660                t_s_b(ji,nlay_s)     =  (zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
    661                *  t_i_b(ji,1))/zdiagbis(ji,nlay_s+1) & 
    662                *        MAX(0.0,SIGN(1.0,ht_s_b(ji)))  
     660            IF (ht_s_1d(ji).GT.0._wp) & 
     661               t_s_1d(ji,nlay_s)     =  (zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
     662               *  t_i_1d(ji,1))/zdiagbis(ji,nlay_s+1) & 
     663               *        MAX(0.0,SIGN(1.0,ht_s_1d(ji)))  
    663664 
    664665            ! surface temperature 
    665             isnow(ji)     = NINT(  1.0 - MAX( 0.0 , SIGN( 1.0 , -ht_s_b(ji) )  )  ) 
    666             ztsuoldit(ji) = t_su_b(ji) 
    667             IF( t_su_b(ji) < ztfs(ji) ) & 
    668                t_su_b(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_b(ji,1)   & 
    669                &          + REAL( 1 - isnow(ji) )*t_i_b(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
     666            isnow(ji)     = NINT(  1.0 - MAX( 0.0 , SIGN( 1.0 , -ht_s_1d(ji) )  )  ) 
     667            ztsubit(ji) = t_su_1d(ji) 
     668            IF( t_su_1d(ji) < ztfs(ji) ) & 
     669               t_su_1d(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_1d(ji,1)   & 
     670               &          + REAL( 1 - isnow(ji) )*t_i_1d(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
    670671         END DO 
    671672         ! 
     
    677678         ! zerrit(ji) is a measure of error, it has to be under maxer_i_thd 
    678679         DO ji = kideb , kiut 
    679             t_su_b(ji) =  MAX(  MIN( t_su_b(ji) , ztfs(ji) ) , 190._wp  ) 
    680             zerrit(ji) =  ABS( t_su_b(ji) - ztsuoldit(ji) )      
    681          END DO 
    682  
    683          DO layer  =  1, nlay_s 
    684             DO ji = kideb , kiut 
    685                t_s_b(ji,layer) = MAX(  MIN( t_s_b(ji,layer), rtt ), 190._wp  ) 
    686                zerrit(ji)      = MAX(zerrit(ji),ABS(t_s_b(ji,layer) - ztstemp(ji,layer))) 
    687             END DO 
    688          END DO 
    689  
    690          DO layer  =  1, nlay_i 
    691             DO ji = kideb , kiut 
    692                ztmelt_i        = -tmut * s_i_b(ji,layer) + rtt  
    693                t_i_b(ji,layer) =  MAX(MIN(t_i_b(ji,layer),ztmelt_i), 190._wp) 
    694                zerrit(ji)      =  MAX(zerrit(ji),ABS(t_i_b(ji,layer) - ztitemp(ji,layer))) 
     680            t_su_1d(ji) =  MAX(  MIN( t_su_1d(ji) , ztfs(ji) ) , 190._wp  ) 
     681            zerrit(ji) =  ABS( t_su_1d(ji) - ztsubit(ji) )      
     682         END DO 
     683 
     684         DO jk  =  1, nlay_s 
     685            DO ji = kideb , kiut 
     686               t_s_1d(ji,jk) = MAX(  MIN( t_s_1d(ji,jk), rtt ), 190._wp  ) 
     687               zerrit(ji)      = MAX(zerrit(ji),ABS(t_s_1d(ji,jk) - ztstemp(ji,jk))) 
     688            END DO 
     689         END DO 
     690 
     691         DO jk  =  1, nlay_i 
     692            DO ji = kideb , kiut 
     693               ztmelt_i        = -tmut * s_i_1d(ji,jk) + rtt  
     694               t_i_1d(ji,jk) =  MAX(MIN(t_i_1d(ji,jk),ztmelt_i), 190._wp) 
     695               zerrit(ji)      =  MAX(zerrit(ji),ABS(t_i_1d(ji,jk) - ztitemp(ji,jk))) 
    695696            END DO 
    696697         END DO 
     
    717718      DO ji = kideb, kiut 
    718719         ! forced mode only : update of latent heat fluxes (sublimation) (always >=0, upward flux)  
    719          IF( .NOT. lk_cpl) qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_b(ji) - ztsuold(ji) ) ) 
     720         IF( .NOT. lk_cpl) qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) ) ) 
    720721         !                                ! surface ice conduction flux 
    721          isnow(ji)       = NINT(  1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_b(ji) ) )  ) 
    722          fc_su(ji)       =  -     REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * (t_s_b(ji,1) - t_su_b(ji))   & 
    723             &               - REAL( 1 - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_b(ji,1) - t_su_b(ji)) 
     722         isnow(ji)       = NINT(  1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_1d(ji) ) )  ) 
     723         fc_su(ji)       =  -     REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * (t_s_1d(ji,1) - t_su_1d(ji))   & 
     724            &               - REAL( 1 - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_1d(ji,1) - t_su_1d(ji)) 
    724725         !                                ! bottom ice conduction flux 
    725          fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_b(ji) - t_i_b(ji,nlay_i)) ) 
     726         fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_1d(ji) - t_i_1d(ji,nlay_i)) ) 
    726727      END DO 
    727728 
     
    730731      !----------------------------------------- 
    731732      DO ji = kideb, kiut 
    732          IF( t_su_b(ji) < rtt ) THEN  ! case T_su < 0degC 
    733             hfx_dif_1d(ji) = hfx_dif_1d(ji) + ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_b(ji) 
     733         IF( t_su_1d(ji) < rtt ) THEN  ! case T_su < 0degC 
     734            hfx_dif_1d(ji) = hfx_dif_1d(ji)  +   & 
     735               &            ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji) 
    734736         ELSE                         ! case T_su = 0degC 
    735             hfx_dif_1d(ji) = hfx_dif_1d(ji) + ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_b(ji) 
     737            hfx_dif_1d(ji) = hfx_dif_1d(ji) +    & 
     738               &             ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji) 
    736739         ENDIF 
    737740      END DO 
     
    742745      ! --- diag conservation imbalance on heat diffusion - PART 2 --- ! 
    743746      DO ji = kideb, kiut 
    744          zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_b(ji,1:nlay_i) ) * ht_i_b(ji) / REAL( nlay_i ) +  & 
    745             &                              SUM( q_s_b(ji,1:nlay_s) ) * ht_s_b(ji) / REAL( nlay_s ) ) 
     747         zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) / REAL( nlay_i ) +  & 
     748            &                              SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) / REAL( nlay_s ) ) 
    746749         zhfx_err(ji)   = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice )  
    747          hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err(ji) * a_i_b(ji) 
     750         hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err(ji) * a_i_1d(ji) 
    748751      END DO  
    749752 
     
    767770      DO ji = kideb, kiut 
    768771         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1 
    769          hfx_in (ii,ij) = hfx_in (ii,ij) + a_i_b(ji) * ( qsr_ice_1d(ji) + qns_ice_1d(ji) ) 
     772         hfx_in (ii,ij) = hfx_in (ii,ij) + a_i_1d(ji) * ( qsr_ice_1d(ji) + qns_ice_1d(ji) ) 
    770773      END DO 
    771774    
    772775      ! 
    773776      CALL wrk_dealloc( jpij, numeqmin, numeqmax, isnow ) 
    774       CALL wrk_dealloc( jpij, ztfs, ztsuold, ztsuoldit, zh_i, zh_s, zfsw ) 
     777      CALL wrk_dealloc( jpij, ztfs, ztsub, ztsubit, zh_i, zh_s, zfsw ) 
    775778      CALL wrk_dealloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zhsu ) 
    776       CALL wrk_dealloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztiold, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 ) 
    777       CALL wrk_dealloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsold, zeta_s, ztstemp, z_s, kjstart = 0 ) 
    778       CALL wrk_dealloc( jpij, jkmax+2, zindterm, zindtbis, zdiagbis ) 
    779       CALL wrk_dealloc( jpij, jkmax+2, 3, ztrid ) 
     779      CALL wrk_dealloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i,   & 
     780         &              ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 ) 
     781      CALL wrk_dealloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart = 0 ) 
     782      CALL wrk_dealloc( jpij, nlay_i+3, zindterm, zindtbis, zdiagbis ) 
     783      CALL wrk_dealloc( jpij, nlay_i+3, 3, ztrid ) 
    780784      CALL wrk_dealloc( jpij, zdq, zq_ini, zhfx_err ) 
    781785 
     
    798802      DO jk = 1, nlay_i             ! Sea ice energy of melting 
    799803         DO ji = kideb, kiut 
    800             ztmelts      = - tmut  * s_i_b(ji,jk) + rtt  
    801             zindb        = MAX( 0._wp , SIGN( 1._wp , -(t_i_b(ji,jk) - rtt) - epsi10 ) ) 
    802             q_i_b(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_b(ji,jk) )                                             & 
    803                &                   + lfus * ( 1.0 - zindb * ( ztmelts-rtt ) / MIN( t_i_b(ji,jk)-rtt, -epsi10 ) )   & 
     804            ztmelts      = - tmut  * s_i_1d(ji,jk) + rtt  
     805            zindb        = MAX( 0._wp , SIGN( 1._wp , -(t_i_1d(ji,jk) - rtt) - epsi10 ) ) 
     806            q_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_1d(ji,jk) )                                             & 
     807               &                   + lfus * ( 1.0 - zindb * ( ztmelts-rtt ) / MIN( t_i_1d(ji,jk)-rtt, -epsi10 ) )   & 
    804808               &                   - rcp  *                 ( ztmelts-rtt )  )  
    805809         END DO 
     
    807811      DO jk = 1, nlay_s             ! Snow energy of melting 
    808812         DO ji = kideb, kiut 
    809             q_s_b(ji,jk) = rhosn * ( cpic * ( rtt - t_s_b(ji,jk) ) + lfus ) 
     813            q_s_1d(ji,jk) = rhosn * ( cpic * ( rtt - t_s_1d(ji,jk) ) + lfus ) 
    810814         END DO 
    811815      END DO 
Note: See TracChangeset for help on using the changeset viewer.