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 5167 for trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90 – NEMO

Ignore:
Timestamp:
2015-03-24T18:35:00+01:00 (9 years ago)
Author:
clem
Message:

LIM3 bug fix. see ticket #1492 (forthcoming update) which also solve ticket #1497

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90

    r5134 r5167  
    8686      REAL(wp) ::   zsstK        ! SST in Kelvin 
    8787 
    88       REAL(wp), POINTER, DIMENSION(:) ::   zh_s        ! snow layer thickness 
    8988      REAL(wp), POINTER, DIMENSION(:) ::   zqprec      ! energy of fallen snow                       (J.m-3) 
    9089      REAL(wp), POINTER, DIMENSION(:) ::   zq_su       ! heat for surface ablation                   (J.m-2) 
     
    118117      END SELECT 
    119118 
    120       CALL wrk_alloc( jpij, zh_s, zqprec, zq_su, zq_bo, zf_tt, zq_rema ) 
     119      CALL wrk_alloc( jpij, zqprec, zq_su, zq_bo, zf_tt, zq_rema ) 
    121120      CALL wrk_alloc( jpij, zdh_s_mel, zdh_s_pre, zdh_s_sub, zqh_i, zqh_s, zq_s ) 
    122121      CALL wrk_alloc( jpij, nlay_i+1, zdeltah, zh_i ) 
     
    129128      zq_rema(:) = 0._wp 
    130129 
    131       zh_s     (:) = 0._wp        
    132130      zdh_s_pre(:) = 0._wp 
    133131      zdh_s_mel(:) = 0._wp 
     
    140138      icount    (:)   = 0 
    141139 
     140      ! Initialize enthalpy at nlay_i+1 
     141      DO ji = kideb, kiut 
     142         q_i_1d(ji,nlay_i+1) = 0._wp 
     143      END DO 
     144 
    142145      ! initialize layer thicknesses and enthalpies 
    143146      h_i_old (:,0:nlay_i+1) = 0._wp 
     
    155158      ! 
    156159      DO ji = kideb, kiut 
    157          rswitch       = 1._wp - MAX(  0._wp , SIGN( 1._wp , - ht_s_1d(ji) ) ) 
    158          ztmelts       = rswitch * rt0 + ( 1._wp - rswitch ) * rt0 
    159  
    160160         zfdum      = qns_ice_1d(ji) + ( 1._wp - i0(ji) ) * qsr_ice_1d(ji) - fc_su(ji)  
    161161         zf_tt(ji)  = fc_bo_i(ji) + fhtur_1d(ji) + fhld_1d(ji)  
    162162 
    163          zq_su (ji) = MAX( 0._wp, zfdum     * rdt_ice ) * MAX( 0._wp , SIGN( 1._wp, t_su_1d(ji) - ztmelts ) ) 
     163         zq_su (ji) = MAX( 0._wp, zfdum     * rdt_ice ) * MAX( 0._wp , SIGN( 1._wp, t_su_1d(ji) - rt0 ) ) 
    164164         zq_bo (ji) = MAX( 0._wp, zf_tt(ji) * rdt_ice ) 
    165165      END DO 
     
    187187      !------------------------------------------------------------! 
    188188      ! 
    189       DO ji = kideb, kiut      
    190          zh_s(ji) = ht_s_1d(ji) * r1_nlay_s 
    191       END DO 
    192       ! 
    193189      DO jk = 1, nlay_s 
    194190         DO ji = kideb, kiut 
    195             zqh_s(ji) =  zqh_s(ji) + q_s_1d(ji,jk) * zh_s(ji) 
     191            zqh_s(ji) =  zqh_s(ji) + q_s_1d(ji,jk) * ht_s_1d(ji) * r1_nlay_s 
    196192         END DO 
    197193      END DO 
     
    222218      ! Martin Vancoppenolle, December 2006 
    223219 
     220      zdeltah(:,:) = 0._wp 
    224221      DO ji = kideb, kiut 
    225222         !----------- 
     
    236233         ! mass flux, <0 
    237234         wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_pre(ji) * r1_rdtice 
    238          ! update thickness 
    239          ht_s_1d    (ji) = MAX( 0._wp , ht_s_1d(ji) + zdh_s_pre(ji) ) 
    240235 
    241236         !--------------------- 
     
    243238         !--------------------- 
    244239         ! thickness change 
    245          IF( zdh_s_pre(ji) > 0._wp ) THEN 
    246240         rswitch        = MAX( 0._wp , SIGN( 1._wp , zqprec(ji) - epsi20 ) ) 
    247          zdh_s_mel (ji) = - rswitch * zq_su(ji) / MAX( zqprec(ji) , epsi20 ) 
    248          zdh_s_mel (ji) = MAX( - zdh_s_pre(ji), zdh_s_mel(ji) ) ! bound melting  
     241         zdeltah (ji,1) = - rswitch * zq_su(ji) / MAX( zqprec(ji) , epsi20 ) 
     242         zdeltah (ji,1) = MAX( - zdh_s_pre(ji), zdeltah(ji,1) ) ! bound melting  
    249243         ! heat used to melt snow (W.m-2, >0) 
    250          hfx_snw_1d(ji) = hfx_snw_1d(ji) - zdh_s_mel(ji) * a_i_1d(ji) * zqprec(ji) * r1_rdtice 
     244         hfx_snw_1d(ji) = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * zqprec(ji) * r1_rdtice 
    251245         ! snow melting only = water into the ocean (then without snow precip), >0 
    252          wfx_snw_1d(ji) = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_mel(ji) * r1_rdtice 
    253           
    254          ! updates available heat + thickness 
    255          zq_su (ji) = MAX( 0._wp , zq_su (ji) + zdh_s_mel(ji) * zqprec(ji) )       
    256          ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdh_s_mel(ji) ) 
    257          zh_s  (ji) = ht_s_1d(ji) * r1_nlay_s 
    258  
    259          ENDIF 
    260       END DO 
    261  
    262       ! If heat still available, then melt more snow 
    263       zdeltah(:,:) = 0._wp ! important 
     246         wfx_snw_1d(ji) = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice     
     247         ! updates available heat + precipitations after melting 
     248         zq_su     (ji) = MAX( 0._wp , zq_su (ji) + zdeltah(ji,1) * zqprec(ji) )       
     249         zdh_s_pre (ji) = zdh_s_pre(ji) + zdeltah(ji,1) 
     250 
     251         ! update thickness 
     252         ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdh_s_pre(ji) ) 
     253      END DO 
     254 
     255      ! If heat still available (zq_su > 0), then melt more snow 
     256      zdeltah(:,:) = 0._wp 
    264257      DO jk = 1, nlay_s 
    265258         DO ji = kideb, kiut 
     
    268261            rswitch          = rswitch * ( MAX( 0._wp, SIGN( 1._wp, q_s_1d(ji,jk) - epsi20 ) ) )  
    269262            zdeltah  (ji,jk) = - rswitch * zq_su(ji) / MAX( q_s_1d(ji,jk), epsi20 ) 
    270             zdeltah  (ji,jk) = MAX( zdeltah(ji,jk) , - zh_s(ji) ) ! bound melting 
     263            zdeltah  (ji,jk) = MAX( zdeltah(ji,jk) , - ht_s_1d(ji) ) ! bound melting 
    271264            zdh_s_mel(ji)    = zdh_s_mel(ji) + zdeltah(ji,jk)     
    272265            ! heat used to melt snow(W.m-2, >0) 
     
    274267            ! snow melting only = water into the ocean (then without snow precip) 
    275268            wfx_snw_1d(ji)   = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
    276  
    277269            ! updates available heat + thickness 
    278270            zq_su (ji)  = MAX( 0._wp , zq_su (ji) + zdeltah(ji,jk) * q_s_1d(ji,jk) ) 
    279271            ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdeltah(ji,jk) ) 
    280  
    281272         END DO 
    282273      END DO 
     
    286277      !---------------------- 
    287278      ! qla_ice is always >=0 (upwards), heat goes to the atmosphere, therefore snow sublimates 
    288       ! clem comment: not counted in mass exchange in limsbc since this is an exchange with atm. (not ocean) 
     279      ! clem comment: not counted in mass/heat exchange in limsbc since this is an exchange with atm. (not ocean) 
    289280      ! clem comment: ice should also sublimate 
     281      zdeltah(:,:) = 0._wp 
    290282      IF( lk_cpl ) THEN 
    291283         ! coupled mode: sublimation already included in emp_ice (to do in limsbc_ice) 
     
    294286         ! forced  mode: snow thickness change due to sublimation 
    295287         DO ji = kideb, kiut 
    296             zdh_s_sub(ji)  =  MAX( - ht_s_1d(ji) , - parsub * qla_ice_1d(ji) / ( rhosn * lsub ) * rdt_ice ) 
     288            zdh_s_sub(ji)  =  MAX( - ht_s_1d(ji) , - qla_ice_1d(ji) / ( rhosn * lsub ) * rdt_ice ) 
    297289            ! Heat flux by sublimation [W.m-2], < 0 
    298290            !      sublimate first snow that had fallen, then pre-existing snow 
    299             zcoeff         =      ( MAX( zdh_s_sub(ji), - MAX( 0._wp, zdh_s_pre(ji) + zdh_s_mel(ji) ) )   * zqprec(ji) +   & 
    300                &  ( zdh_s_sub(ji) - MAX( zdh_s_sub(ji), - MAX( 0._wp, zdh_s_pre(ji) + zdh_s_mel(ji) ) ) ) * q_s_1d(ji,1) )  & 
    301                &  * a_i_1d(ji) * r1_rdtice 
    302             hfx_sub_1d(ji) = hfx_sub_1d(ji) + zcoeff 
     291            zdeltah(ji,1)  = MAX( zdh_s_sub(ji), - zdh_s_pre(ji) ) 
     292            hfx_sub_1d(ji) = hfx_sub_1d(ji) + ( zdeltah(ji,1) * zqprec(ji) + ( zdh_s_sub(ji) - zdeltah(ji,1) ) * q_s_1d(ji,1)  & 
     293               &                              ) * a_i_1d(ji) * r1_rdtice 
    303294            ! Mass flux by sublimation 
    304295            wfx_sub_1d(ji) =  wfx_sub_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_sub(ji) * r1_rdtice 
    305296            ! new snow thickness 
    306             ht_s_1d(ji)     =  MAX( 0._wp , ht_s_1d(ji) + zdh_s_sub(ji) ) 
     297            ht_s_1d(ji)    =  MAX( 0._wp , ht_s_1d(ji) + zdh_s_sub(ji) ) 
     298            ! update precipitations after sublimation and correct sublimation 
     299            zdh_s_pre(ji) = zdh_s_pre(ji) + zdeltah(ji,1) 
     300            zdh_s_sub(ji) = zdh_s_sub(ji) - zdeltah(ji,1) 
    307301         END DO 
    308302      ENDIF 
     
    310304      ! --- Update snow diags --- ! 
    311305      DO ji = kideb, kiut 
    312          dh_s_tot(ji)   = zdh_s_mel(ji) + zdh_s_pre(ji) + zdh_s_sub(ji) 
    313          zh_s(ji)       = ht_s_1d(ji) * r1_nlay_s 
    314       END DO ! ji 
     306         dh_s_tot(ji) = zdh_s_mel(ji) + zdh_s_pre(ji) + zdh_s_sub(ji) 
     307      END DO 
    315308 
    316309      !------------------------------------------- 
     
    323316            rswitch       = MAX(  0._wp , SIGN( 1._wp, ht_s_1d(ji) - epsi20 )  ) 
    324317            q_s_1d(ji,jk) = rswitch / MAX( ht_s_1d(ji), epsi20 ) *                          & 
    325               &            ( (   MAX( 0._wp, dh_s_tot(ji) )               ) * zqprec(ji) +  & 
    326               &              ( - MAX( 0._wp, dh_s_tot(ji) ) + ht_s_1d(ji) ) * rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus ) ) 
     318              &            ( (   zdh_s_pre(ji)             ) * zqprec(ji) +  & 
     319              &              (   ht_s_1d(ji) - zdh_s_pre(ji) ) * rhosn * ( cpic * ( rt0 - t_s_1d(ji,jk) ) + lfus ) ) 
    327320            zq_s(ji)     =  zq_s(ji) + q_s_1d(ji,jk) 
    328321         END DO 
     
    334327      zdeltah(:,:) = 0._wp ! important 
    335328      DO jk = 1, nlay_i 
    336          DO ji = kideb, kiut  
    337             zEi            = - q_i_1d(ji,jk) * r1_rhoic             ! Specific enthalpy of layer k [J/kg, <0] 
    338  
    339             ztmelts        = - tmut * s_i_1d(ji,jk) + rt0           ! Melting point of layer k [K] 
     329         DO ji = kideb, kiut 
     330            zEi            = - q_i_1d(ji,jk) * r1_rhoic            ! Specific enthalpy of layer k [J/kg, <0] 
     331 
     332            ztmelts        = - tmut * s_i_1d(ji,jk) + rt0          ! Melting point of layer k [K] 
    340333 
    341334            zEw            =    rcp * ( ztmelts - rt0 )            ! Specific enthalpy of resulting meltwater [J/kg, <0] 
     
    343336            zdE            =    zEi - zEw                          ! Specific enthalpy difference < 0 
    344337 
    345             zfmdt          = - zq_su(ji) / zdE                     ! Mass flux to the ocean [kg/m2, >0] 
     338            IF( zdE < 0._wp ) THEN                                  
     339               zfmdt       = - zq_su(ji) / zdE                     ! Mass flux to the ocean [kg/m2, >0] 
     340            ELSE 
     341               zfmdt       = rhoic * zh_i(ji,jk)                   !!! internal melting 
     342               zdE         = 0._wp                                 !   All the layer melts if t_i(jk) = Tmelt (i.e. zdE = 0) 
     343            END IF 
    346344 
    347345            zdeltah(ji,jk) = - zfmdt * r1_rhoic                    ! Melt of layer jk [m, <0] 
     
    358356 
    359357            ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok) 
    360             sfx_sum_1d(ji)   = sfx_sum_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
     358            sfx_sum_1d(ji) = sfx_sum_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice 
    361359 
    362360            ! Contribution to heat flux [W.m-2], < 0 
     
    405403      ! -> need for an iterative procedure, which converges quickly 
    406404 
    407       IF ( nn_icesal == 2 ) THEN 
    408          num_iter_max = 5 
    409       ELSE 
    410          num_iter_max = 1 
    411       ENDIF 
    412  
    413       ! Just to be sure that enthalpy at nlay_i+1 is null 
    414       DO ji = kideb, kiut 
    415          q_i_1d(ji,nlay_i+1) = 0._wp 
    416       END DO 
     405      num_iter_max = 1 
     406      IF( nn_icesal == 2 ) num_iter_max = 5 
    417407 
    418408      ! Iterative procedure 
     
    483473             
    484474            ! Contribution to salt flux, <0 
    485             sfx_bog_1d(ji) = sfx_bog_1d(ji) + s_i_new(ji) * a_i_1d(ji) * zfmdt * r1_rdtice 
     475            sfx_bog_1d(ji) = sfx_bog_1d(ji) - rhoic * a_i_1d(ji) * dh_i_bott(ji) * s_i_new(ji) * r1_rdtice 
    486476 
    487477            ! Contribution to mass flux, <0 
     
    500490      DO jk = nlay_i, 1, -1 
    501491         DO ji = kideb, kiut 
    502             IF(  zf_tt(ji)  >=  0._wp  .AND. jk > icount(ji) ) THEN   ! do not calculate where layer has already disappeared by surface melting  
     492            IF(  zf_tt(ji)  >  0._wp  .AND. jk > icount(ji) ) THEN   ! do not calculate where layer has already disappeared by surface melting  
    503493 
    504494               ztmelts = - tmut * s_i_1d(ji,jk) + rt0  ! Melting point of layer jk (K) 
     
    524514 
    525515                  ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok) 
    526                   sfx_res_1d(ji) = sfx_res_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
     516                  sfx_res_1d(ji) = sfx_res_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice 
    527517                                     
    528518                  ! Contribution to mass flux 
     
    559549 
    560550                  ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok) 
    561                   sfx_bom_1d(ji) = sfx_bom_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
     551                  sfx_bom_1d(ji) = sfx_bom_1d(ji) - rhoic *  a_i_1d(ji) * zdeltah(ji,jk) * sm_i_1d(ji) * r1_rdtice 
    562552                   
    563553                  ! Total heat flux used in this process [W.m-2], >0   
     
    595585         zdeltah  (ji,1) = - rswitch * zq_rema(ji) / MAX( q_s_1d(ji,1), epsi20 ) 
    596586         zdeltah  (ji,1) = MIN( 0._wp , MAX( zdeltah(ji,1) , - ht_s_1d(ji) ) ) ! bound melting 
    597          zdh_s_mel(ji)   = zdh_s_mel(ji) + zdeltah(ji,1)     
    598587         dh_s_tot (ji)   = dh_s_tot(ji)  + zdeltah(ji,1) 
    599588         ht_s_1d   (ji)  = ht_s_1d(ji)   + zdeltah(ji,1) 
     
    622611         dh_snowice(ji) = MAX(  0._wp , ( rhosn * ht_s_1d(ji) + (rhoic-rau0) * ht_i_1d(ji) ) / ( rhosn+rau0-rhoic )  ) 
    623612 
    624          ht_i_1d(ji)     = ht_i_1d(ji) + dh_snowice(ji) 
    625          ht_s_1d(ji)     = ht_s_1d(ji) - dh_snowice(ji) 
     613         ht_i_1d(ji)    = ht_i_1d(ji) + dh_snowice(ji) 
     614         ht_s_1d(ji)    = ht_s_1d(ji) - dh_snowice(ji) 
    626615 
    627616         ! Salinity of snow ice 
     
    669658      ! Update temperature, energy 
    670659      !------------------------------------------- 
    671       !clem bug: we should take snow into account here 
    672660      DO ji = kideb, kiut 
    673661         rswitch     =  1.0 - MAX( 0._wp , SIGN( 1._wp , - ht_i_1d(ji) ) )  
     
    688676      WHERE( ht_i_1d == 0._wp ) a_i_1d = 0._wp 
    689677       
    690       CALL wrk_dealloc( jpij, zh_s, zqprec, zq_su, zq_bo, zf_tt, zq_rema ) 
     678      CALL wrk_dealloc( jpij, zqprec, zq_su, zq_bo, zf_tt, zq_rema ) 
    691679      CALL wrk_dealloc( jpij, zdh_s_mel, zdh_s_pre, zdh_s_sub, zqh_i, zqh_s, zq_s ) 
    692680      CALL wrk_dealloc( jpij, nlay_i+1, zdeltah, zh_i ) 
Note: See TracChangeset for help on using the changeset viewer.