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 990 for branches/dev_003_CPL/NEMO/LIM_SRC_3/limthd_dh.F90 – NEMO

Ignore:
Timestamp:
2008-05-23T16:38:21+02:00 (16 years ago)
Author:
smasson
Message:

dev_003_CPL: to the trunk , see ticket #155

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_003_CPL/NEMO/LIM_SRC_3/limthd_dh.F90

    r888 r990  
    2424   USE par_ice 
    2525   USE lib_mpp 
    26        
     26 
    2727   IMPLICIT NONE 
    2828   PRIVATE 
     
    4646 
    4747   SUBROUTINE lim_thd_dh(kideb,kiut,jl) 
    48        !!------------------------------------------------------------------ 
    49        !!                ***  ROUTINE lim_thd_dh  *** 
    50        !!------------------------------------------------------------------ 
    51        !! ** Purpose : 
    52        !!           This routine determines variations of ice and snow thicknesses. 
    53        !! ** Method  : 
    54        !!           Ice/Snow surface melting arises from imbalance in surface fluxes 
    55        !!           Bottom accretion/ablation arises from flux budget 
    56        !!           Snow thickness can increase by precipitation and decrease by  
    57        !!              sublimation 
    58        !!           If snow load excesses Archmiede limit, snow-ice is formed by 
    59        !!              the flooding of sea-water in the snow 
    60        !! ** Steps   
    61        !!           1) Compute available flux of heat for surface ablation 
    62        !!           2) Compute snow and sea ice enthalpies 
    63        !!           3) Surface ablation and sublimation 
    64        !!           4) Bottom accretion/ablation 
    65        !!           5) Case of Total ablation 
    66        !!           6) Snow ice formation 
    67        !! 
    68        !! ** Arguments 
    69        !! 
    70        !! ** Inputs / Outputs 
    71        !! 
    72        !! ** External 
    73        !! 
    74        !! ** References : Bitz and Lipscomb, JGR 99 
    75        !!                 Fichefet T. and M. Maqueda 1997, J. Geophys. Res., 102(C6), 12609-12646    
    76        !!                 Vancoppenolle, Fichefet and Bitz, GRL 2005 
    77        !!                 Vancoppenolle et al., OM08 
    78        !! 
    79        !! ** History  :  
    80        !!   original code    01-04 (LIM) 
    81        !!   original routine 
    82        !!               (05-2003) M. Vancoppenolle, Louvain-La-Neuve, Belgium 
    83        !!               (06/07-2005) 3D version 
    84        !!               (03-2008)    Clean code 
    85        !! 
    86        !!------------------------------------------------------------------ 
    87        !! * Arguments 
    88        INTEGER , INTENT (IN) ::  & 
    89           kideb     ,         &  !: Start point on which the  the computation is applied 
    90           kiut      ,         &  !: End point on which the  the computation is applied 
    91           jl                     !: Thickness cateogry number 
    92  
    93        !! * Local variables 
    94        INTEGER ::             &  
    95           ji        ,         &  !: space index  
    96           jk        ,         &  !: ice layer index 
    97           isnow     ,         &  !: switch for presence (1) or absence (0) of snow 
    98           zji       ,         &  !: 2D corresponding indices to ji 
    99           zjj       ,         & 
    100           isnowic   ,         &  !: snow ice formation not 
    101           i_ice_switch   ,    &  !: ice thickness above a certain treshold or not 
    102           iter 
    103  
    104        REAL(wp) ::            & 
    105           zhsnew    ,         &  !: new snow thickness 
    106           zihgnew   ,         &  !: switch for total ablation 
    107           ztmelts   ,         &  !: melting point 
    108           zhn       ,         & 
    109           zdhcf     ,         & 
    110           zdhbf     ,         & 
    111           zhni      ,         & 
    112           zhnfi     ,         & 
    113           zihg      ,         & 
    114           zdhnm     ,         & 
    115           zhnnew    ,         & 
    116           zeps = 1.0e-13,     & 
    117           zhisn     ,         & 
    118           zfracs    ,         &  !: fractionation coefficient for bottom salt 
    119                                  !: entrapment 
    120           zds       ,         &  !: increment of bottom ice salinity 
    121           zcoeff    ,         &  !: dummy argument for snowfall partitioning 
    122                                  !: over ice and leads 
    123           zsm_snowice,        &  !: snow-ice salinity 
    124           zswi1     ,         &  !: switch for computation of bottom salinity 
    125           zswi12    ,         &  !: switch for computation of bottom salinity 
    126           zswi2     ,         &  !: switch for computation of bottom salinity 
    127           zgrr      ,         &  !: bottom growth rate 
    128           zihic     ,         &  !:  
    129           ztform                 !: bottom formation temperature 
    130  
    131        REAL(wp) , DIMENSION(jpij) ::  & 
    132           zh_i      ,         &  ! ice layer thickness 
    133           zh_s      ,         &  ! snow layer thickness 
    134           ztfs      ,         &  ! melting point 
    135           zhsold    ,         &  ! old snow thickness 
    136           zqprec    ,         &  !: energy of fallen snow 
    137           zqfont_su ,         &  ! incoming, remaining surface energy 
    138           zqfont_bo              ! incoming, bottom energy 
    139  
    140        REAL(wp) , DIMENSION(jpij) :: & 
    141           z_f_surf,           &  ! surface heat for ablation 
    142           zhgnew                 ! new ice thickness 
    143  
    144        REAL(wp), DIMENSION(jpij) :: & 
    145           zdh_s_mel  ,        &  ! snow melt  
    146           zdh_s_pre  ,        &  ! snow precipitation  
    147           zdh_s_sub  ,        &  ! snow sublimation 
    148           zfsalt_melt            ! salt flux due to ice melt 
    149  
    150        REAL(wp) , DIMENSION(jpij,jkmax) :: & 
    151           zdeltah 
    152  
    153        ! Pathological cases 
    154        REAL(wp), DIMENSION(jpij) :: & 
    155           zfdt_init  ,        &  !: total incoming heat for ice melt 
    156           zfdt_final ,        &  !: total remaing heat for ice melt 
    157           zqt_i      ,        &  !: total ice heat content 
    158           zqt_s      ,        &  !: total snow heat content 
    159           zqt_dummy              !: dummy heat content 
    160  
    161        REAL(wp), DIMENSION(jpij,jkmax) :: & 
    162           zqt_i_lay              !: total ice heat content 
    163  
    164        ! Heat conservation  
    165        REAL(wp), DIMENSION(jpij) :: & 
    166           zfbase,             & 
    167           zdq_i 
    168  
    169        INTEGER, DIMENSION(jpij) ::  & 
    170           innermelt 
    171  
    172        REAL(wp) :: & 
    173           meance_dh 
    174  
    175        INTEGER ::                   & 
    176           num_iter_max,       & 
    177           numce_dh 
    178  
    179 !!----------------------------------------------------------------------------- 
    180  
    181       WRITE(numout,*) 'lim_thd_dh : computation of vertical snow/ice accretion/ablation' 
    182       WRITE(numout,*) '~~~~~~~~~' 
     48      !!------------------------------------------------------------------ 
     49      !!                ***  ROUTINE lim_thd_dh  *** 
     50      !!------------------------------------------------------------------ 
     51      !! ** Purpose : 
     52      !!           This routine determines variations of ice and snow thicknesses. 
     53      !! ** Method  : 
     54      !!           Ice/Snow surface melting arises from imbalance in surface fluxes 
     55      !!           Bottom accretion/ablation arises from flux budget 
     56      !!           Snow thickness can increase by precipitation and decrease by  
     57      !!              sublimation 
     58      !!           If snow load excesses Archmiede limit, snow-ice is formed by 
     59      !!              the flooding of sea-water in the snow 
     60      !! ** Steps   
     61      !!           1) Compute available flux of heat for surface ablation 
     62      !!           2) Compute snow and sea ice enthalpies 
     63      !!           3) Surface ablation and sublimation 
     64      !!           4) Bottom accretion/ablation 
     65      !!           5) Case of Total ablation 
     66      !!           6) Snow ice formation 
     67      !! 
     68      !! ** Arguments 
     69      !! 
     70      !! ** Inputs / Outputs 
     71      !! 
     72      !! ** External 
     73      !! 
     74      !! ** References : Bitz and Lipscomb, JGR 99 
     75      !!                 Fichefet T. and M. Maqueda 1997, J. Geophys. Res., 102(C6), 12609-12646    
     76      !!                 Vancoppenolle, Fichefet and Bitz, GRL 2005 
     77      !!                 Vancoppenolle et al., OM08 
     78      !! 
     79      !! ** History  :  
     80      !!   original code    01-04 (LIM) 
     81      !!   original routine 
     82      !!               (05-2003) M. Vancoppenolle, Louvain-La-Neuve, Belgium 
     83      !!               (06/07-2005) 3D version 
     84      !!               (03-2008)    Clean code 
     85      !! 
     86      !!------------------------------------------------------------------ 
     87      !! * Arguments 
     88      INTEGER , INTENT (IN) ::  & 
     89         kideb     ,         &  !: Start point on which the  the computation is applied 
     90         kiut      ,         &  !: End point on which the  the computation is applied 
     91         jl                     !: Thickness cateogry number 
     92 
     93      !! * Local variables 
     94      INTEGER ::             &  
     95         ji        ,         &  !: space index  
     96         jk        ,         &  !: ice layer index 
     97         isnow     ,         &  !: switch for presence (1) or absence (0) of snow 
     98         zji       ,         &  !: 2D corresponding indices to ji 
     99         zjj       ,         & 
     100         isnowic   ,         &  !: snow ice formation not 
     101         i_ice_switch   ,    &  !: ice thickness above a certain treshold or not 
     102         iter 
     103 
     104      REAL(wp) ::            & 
     105         zhsnew    ,         &  !: new snow thickness 
     106         zihgnew   ,         &  !: switch for total ablation 
     107         ztmelts   ,         &  !: melting point 
     108         zhn       ,         & 
     109         zdhcf     ,         & 
     110         zdhbf     ,         & 
     111         zhni      ,         & 
     112         zhnfi     ,         & 
     113         zihg      ,         & 
     114         zdhnm     ,         & 
     115         zhnnew    ,         & 
     116         zeps = 1.0e-13,     & 
     117         zhisn     ,         & 
     118         zfracs    ,         &  !: fractionation coefficient for bottom salt 
     119                                !: entrapment 
     120         zds       ,         &  !: increment of bottom ice salinity 
     121         zcoeff    ,         &  !: dummy argument for snowfall partitioning 
     122                                !: over ice and leads 
     123         zsm_snowice,        &  !: snow-ice salinity 
     124         zswi1     ,         &  !: switch for computation of bottom salinity 
     125         zswi12    ,         &  !: switch for computation of bottom salinity 
     126         zswi2     ,         &  !: switch for computation of bottom salinity 
     127         zgrr      ,         &  !: bottom growth rate 
     128         zihic     ,         &  !:  
     129         ztform                 !: bottom formation temperature 
     130 
     131      REAL(wp) , DIMENSION(jpij) ::  & 
     132         zh_i      ,         &  ! ice layer thickness 
     133         zh_s      ,         &  ! snow layer thickness 
     134         ztfs      ,         &  ! melting point 
     135         zhsold    ,         &  ! old snow thickness 
     136         zqprec    ,         &  !: energy of fallen snow 
     137         zqfont_su ,         &  ! incoming, remaining surface energy 
     138         zqfont_bo              ! incoming, bottom energy 
     139 
     140      REAL(wp) , DIMENSION(jpij) :: & 
     141         z_f_surf,           &  ! surface heat for ablation 
     142         zhgnew                 ! new ice thickness 
     143 
     144      REAL(wp), DIMENSION(jpij) :: & 
     145         zdh_s_mel  ,        &  ! snow melt  
     146         zdh_s_pre  ,        &  ! snow precipitation  
     147         zdh_s_sub  ,        &  ! snow sublimation 
     148         zfsalt_melt            ! salt flux due to ice melt 
     149 
     150      REAL(wp) , DIMENSION(jpij,jkmax) :: & 
     151         zdeltah 
     152 
     153      ! Pathological cases 
     154      REAL(wp), DIMENSION(jpij) :: & 
     155         zfdt_init  ,        &  !: total incoming heat for ice melt 
     156         zfdt_final ,        &  !: total remaing heat for ice melt 
     157         zqt_i      ,        &  !: total ice heat content 
     158         zqt_s      ,        &  !: total snow heat content 
     159         zqt_dummy              !: dummy heat content 
     160 
     161      REAL(wp), DIMENSION(jpij,jkmax) :: & 
     162         zqt_i_lay              !: total ice heat content 
     163 
     164      ! Heat conservation  
     165      REAL(wp), DIMENSION(jpij) :: & 
     166         zfbase,             & 
     167         zdq_i 
     168 
     169      INTEGER, DIMENSION(jpij) ::  & 
     170         innermelt 
     171 
     172      REAL(wp) :: & 
     173         meance_dh 
     174 
     175      INTEGER ::                   & 
     176         num_iter_max,       & 
     177         numce_dh 
    183178 
    184179      zfsalt_melt(:)  = 0.0 
     
    191186         old_ht_s_b(ji) = ht_s_b(ji) 
    192187      END DO 
    193 ! 
    194 !------------------------------------------------------------------------------! 
    195 !  1) Calculate available heat for surface ablation                            ! 
    196 !------------------------------------------------------------------------------! 
    197 ! 
     188      ! 
     189      !------------------------------------------------------------------------------! 
     190      !  1) Calculate available heat for surface ablation                            ! 
     191      !------------------------------------------------------------------------------! 
     192      ! 
    198193      DO ji = kideb,kiut 
    199194         isnow         = INT( 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_s_b(ji) ) ) ) 
    200195         ztfs(ji)      = isnow * rtt + ( 1.0 - isnow ) * rtt 
    201196         z_f_surf(ji)  = qnsr_ice_1d(ji) + ( 1.0 - i0(ji) ) *                 &  
    202                          qsr_ice_1d(ji) - fc_su(ji) 
     197            qsr_ice_1d(ji) - fc_su(ji) 
    203198         z_f_surf(ji)  = MAX( zzero , z_f_surf(ji) ) *                        & 
    204                          MAX( zzero , SIGN( zone , t_su_b(ji) - ztfs(ji) ) ) 
     199            MAX( zzero , SIGN( zone , t_su_b(ji) - ztfs(ji) ) ) 
    205200         zfdt_init(ji) = ( z_f_surf(ji) + & 
    206                        MAX( fbif_1d(ji) + qlbbq_1d(ji) + fc_bo_i(ji),0.0 ) )  & 
    207                        * rdt_ice 
     201            MAX( fbif_1d(ji) + qlbbq_1d(ji) + fc_bo_i(ji),0.0 ) )  & 
     202            * rdt_ice 
    208203      END DO ! ji 
    209204 
     
    212207      dsm_i_se_1d(:) = 0.0      
    213208      dsm_i_si_1d(:) = 0.0      
    214 ! 
    215 !------------------------------------------------------------------------------! 
    216 !  2) Computing layer thicknesses and  snow and sea-ice enthalpies.            ! 
    217 !------------------------------------------------------------------------------! 
    218 ! 
     209      ! 
     210      !------------------------------------------------------------------------------! 
     211      !  2) Computing layer thicknesses and  snow and sea-ice enthalpies.            ! 
     212      !------------------------------------------------------------------------------! 
     213      ! 
    219214      ! Layer thickness 
    220215      DO ji = kideb,kiut 
     
    239234         END DO 
    240235      END DO 
    241 ! 
    242 !------------------------------------------------------------------------------| 
    243 !  3) Surface ablation and sublimation                                         | 
    244 !------------------------------------------------------------------------------| 
    245 ! 
     236      ! 
     237      !------------------------------------------------------------------------------| 
     238      !  3) Surface ablation and sublimation                                         | 
     239      !------------------------------------------------------------------------------| 
     240      ! 
    246241      !------------------------- 
    247242      ! 3.1 Snow precips / melt 
     
    272267         zdeltah(ji,1)  =  MIN( 0.0 , - zqfont_su(ji) / MAX( zqprec(ji) , epsi13 ) ) 
    273268         zqfont_su(ji)  =  MAX( 0.0 , - zdh_s_pre(ji) - zdeltah(ji,1) )      * & 
    274                            zqprec(ji) 
     269            zqprec(ji) 
    275270         zdeltah(ji,1)  =  MAX( - zdh_s_pre(ji) , zdeltah(ji,1) ) 
    276271         zdh_s_mel(ji)  =  zdh_s_mel(ji) + zdeltah(ji,1) 
     
    289284            zdeltah(ji,jk) = - zqfont_su(ji) / q_s_b(ji,jk) 
    290285            zqfont_su(ji)  =  MAX( 0.0 , - zh_s(ji) - zdeltah(ji,jk) ) * & 
    291                               q_s_b(ji,jk)  
     286               q_s_b(ji,jk)  
    292287            zdeltah(ji,jk) =  MAX( zdeltah(ji,jk) , - zh_s(ji) ) 
    293288            zdh_s_mel(ji)  =  zdh_s_mel(ji) + zdeltah(ji,jk) !resulting melt of snow     
     
    306301         ! Volume and mass variations of snow 
    307302         dvsbq_1d(ji)   =  a_i_b(ji) * ( ht_s_b(ji) - zhsold(ji)              & 
    308                         - zdh_s_mel(ji) ) 
     303            - zdh_s_mel(ji) ) 
    309304         dvsbq_1d(ji)   =  MIN( zzero, dvsbq_1d(ji) ) 
    310305         rdmsnif_1d(ji) =  rhosn*dvsbq_1d(ji) 
     
    327322            ! recompute heat available 
    328323            zqfont_su(ji)       = MAX( 0.0 , - zh_i(ji) - zdeltah(ji,jk) ) *  & 
    329                                   q_i_b(ji,jk)  
     324               q_i_b(ji,jk)  
    330325            ! melt of layer jk cannot be higher than its thickness 
    331326            zdeltah(ji,jk)      = MAX( zdeltah(ji,jk) , - zh_i(ji) ) 
     
    334329            ! for energy conservation 
    335330            zdq_i(ji)           = zdq_i(ji) + zdeltah(ji,jk) *                & 
    336                                         q_i_b(ji,jk) / rdt_ice 
     331               q_i_b(ji,jk) / rdt_ice 
    337332            ! contribution to ice-ocean salt flux  
    338333            zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    339334            zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    340335            zfsalt_melt(ji)     = zfsalt_melt(ji) +                           & 
    341                                   ( sss_m(zji,zjj) - sm_i_b(ji)   ) *         & 
    342                                   a_i_b(ji) *                                 & 
    343                                   MIN( zdeltah(ji,jk) , 0.0 ) * rhoic / rdt_ice  
     336               ( sss_m(zji,zjj) - sm_i_b(ji)   ) *         & 
     337               a_i_b(ji) *                                 & 
     338               MIN( zdeltah(ji,jk) , 0.0 ) * rhoic / rdt_ice  
    344339         END DO ! ji 
    345340      END DO ! jk 
     
    349344      !------------------- 
    350345      IF ( con_i ) THEN 
    351       numce_dh = 0 
    352       meance_dh = 0.0 
    353       DO ji = kideb, kiut 
    354  
    355          IF ( ( z_f_surf(ji) + zdq_i(ji) ) .GE. 1.0e-3 ) THEN 
    356             numce_dh  = numce_dh + 1 
    357             meance_dh = meance_dh + z_f_surf(ji) + zdq_i(ji) 
    358          ENDIF 
    359  
    360          IF ( z_f_surf(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN! 
    361             WRITE(numout,*) ' ALERTE heat loss for surface melt ' 
    362             WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl 
    363             WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    364             WRITE(numout,*) ' z_f_surf  : ', z_f_surf(ji) 
    365             WRITE(numout,*) ' zdq_i   : ', zdq_i(ji) 
    366             WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    367             WRITE(numout,*) ' fc_bo_i : ', fc_bo_i(ji) 
    368             WRITE(numout,*) ' fbif_1d : ', fbif_1d(ji) 
    369             WRITE(numout,*) ' qlbbq_1d: ', qlbbq_1d(ji) 
    370             WRITE(numout,*) ' s_i_new : ', s_i_new(ji) 
    371             WRITE(numout,*) ' sss_m   : ', sss_m(zji,zjj) 
    372          ENDIF 
    373  
    374       END DO ! ji 
    375  
    376       IF ( numce_dh .GT. 0 ) meance_dh = meance_dh / numce_dh 
    377       WRITE(numout,*) ' Error report - Category : ', jl 
    378       WRITE(numout,*) ' ~~~~~~~~~~~~ ' 
    379       WRITE(numout,*) ' Number of points where there is sur. me. error : ', numce_dh 
    380       WRITE(numout,*) ' Mean basal growth error on error points : ', meance_dh 
     346         numce_dh = 0 
     347         meance_dh = 0.0 
     348         DO ji = kideb, kiut 
     349 
     350            IF ( ( z_f_surf(ji) + zdq_i(ji) ) .GE. 1.0e-3 ) THEN 
     351               numce_dh  = numce_dh + 1 
     352               meance_dh = meance_dh + z_f_surf(ji) + zdq_i(ji) 
     353            ENDIF 
     354 
     355            IF ( z_f_surf(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN! 
     356               WRITE(numout,*) ' ALERTE heat loss for surface melt ' 
     357               WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl 
     358               WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
     359               WRITE(numout,*) ' z_f_surf  : ', z_f_surf(ji) 
     360               WRITE(numout,*) ' zdq_i   : ', zdq_i(ji) 
     361               WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
     362               WRITE(numout,*) ' fc_bo_i : ', fc_bo_i(ji) 
     363               WRITE(numout,*) ' fbif_1d : ', fbif_1d(ji) 
     364               WRITE(numout,*) ' qlbbq_1d: ', qlbbq_1d(ji) 
     365               WRITE(numout,*) ' s_i_new : ', s_i_new(ji) 
     366               WRITE(numout,*) ' sss_m   : ', sss_m(zji,zjj) 
     367            ENDIF 
     368 
     369         END DO ! ji 
     370 
     371         IF ( numce_dh .GT. 0 ) meance_dh = meance_dh / numce_dh 
     372         WRITE(numout,*) ' Error report - Category : ', jl 
     373         WRITE(numout,*) ' ~~~~~~~~~~~~ ' 
     374         WRITE(numout,*) ' Number of points where there is sur. me. error : ', numce_dh 
     375         WRITE(numout,*) ' Mean basal growth error on error points : ', meance_dh 
    381376 
    382377      ENDIF ! con_i 
     
    409404      DO jk = 1, nlay_s !n  
    410405         DO ji = kideb, kiut !n 
    411          ! In case of disparition of the snow, we have to update the snow  
    412          ! temperatures 
     406            ! In case of disparition of the snow, we have to update the snow  
     407            ! temperatures 
    413408            zhisn  =  MAX( zzero , SIGN( zone, - ht_s_b(ji) ) ) 
    414409            t_s_b(ji,jk) = ( 1.0 - zhisn ) * t_s_b(ji,jk) + zhisn * rtt 
    415410            q_s_b(ji,jk) = ( 1.0 - zhisn ) * q_s_b(ji,jk) 
    416411         END DO 
    417       END DO  
    418  
    419 ! 
    420 !------------------------------------------------------------------------------! 
    421 ! 4) Basal growth / melt                                                       ! 
    422 !------------------------------------------------------------------------------! 
    423 ! 
     412      END DO 
     413 
     414      ! 
     415      !------------------------------------------------------------------------------! 
     416      ! 4) Basal growth / melt                                                       ! 
     417      !------------------------------------------------------------------------------! 
     418      ! 
    424419      ! Ice basal growth / melt is given by the ratio of heat budget over basal 
    425420      ! ice heat content.  Basal heat budget is given by the difference between 
     
    439434               ! New ice heat content (Bitz and Lipscomb, 1999) 
    440435               ztform              =  t_i_b(ji,nlay_i)  ! t_bo_b crashes in the 
    441                                                         ! Baltic 
     436               ! Baltic 
    442437               q_i_b(ji,nlay_i+1)  =  rhoic * & 
    443                                       ( cpic * ( ztmelts - ztform     )       & 
    444                                       + lfus * ( 1.0 - ( ztmelts - rtt ) /    & 
    445                                                  ( ztform     - rtt ) )       & 
    446                                       - rcp * ( ztmelts-rtt ) ) 
     438                  ( cpic * ( ztmelts - ztform     )       & 
     439                  + lfus * ( 1.0 - ( ztmelts - rtt ) /    & 
     440                  ( ztform     - rtt ) )       & 
     441                  - rcp * ( ztmelts-rtt ) ) 
    447442               ! Basal growth rate = - F*dt / q 
    448443               dh_i_bott(ji)       =  - rdt_ice*( fc_bo_i(ji) + fbif_1d(ji) + & 
    449                                       qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1)  
     444                  qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1)  
    450445            ENDIF ! heat budget 
    451446         END DO ! ji 
     
    476471                  ! New ice heat content (Bitz and Lipscomb, 1999) 
    477472                  q_i_b(ji,nlay_i+1)  =  rhoic * & 
    478                                       ( cpic * ( ztmelts - t_bo_b(ji) )       & 
    479                                       + lfus * ( 1.0 - ( ztmelts - rtt ) /    & 
    480                                                  ( t_bo_b(ji) - rtt ) )       & 
    481                                       - rcp * ( ztmelts-rtt ) ) 
     473                     ( cpic * ( ztmelts - t_bo_b(ji) )       & 
     474                     + lfus * ( 1.0 - ( ztmelts - rtt ) /    & 
     475                     ( t_bo_b(ji) - rtt ) )       & 
     476                     - rcp * ( ztmelts-rtt ) ) 
    482477                  ! Bottom growth rate = - F*dt / q 
    483478                  dh_i_bott(ji)       =  - rdt_ice * ( fc_bo_i(ji) + fbif_1d(ji) & 
    484                                       + qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1) 
     479                     + qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1) 
    485480                  ! New ice salinity ( Cox and Weeks, JGR, 1988 ) 
    486481                  ! zswi2  (1) if dh_i_bott/rdt .GT. 3.6e-7 
     
    492487                  zswi1  = 1. - zswi2 * zswi12  
    493488                  zfracs = zswi1  * 0.12 +  & 
    494                            zswi12 * ( 0.8925 + 0.0568 * LOG( 100.0 * zgrr ) ) + & 
    495                            zswi2  * 0.26 /  & 
    496                            ( 0.26 + 0.74 * EXP ( - 724300.0 * zgrr ) )  
     489                     zswi12 * ( 0.8925 + 0.0568 * LOG( 100.0 * zgrr ) ) + & 
     490                     zswi2  * 0.26 /  & 
     491                     ( 0.26 + 0.74 * EXP ( - 724300.0 * zgrr ) )  
    497492                  zds         = zfracs*sss_m(zji,zjj) - s_i_new(ji) 
    498493                  s_i_new(ji) = zfracs * sss_m(zji,zjj) 
     
    510505               ! New ice heat content (Bitz and Lipscomb, 1999) 
    511506               q_i_b(ji,nlay_i+1)  =  rhoic *                              & 
    512                                    ( cpic * ( ztmelts - t_bo_b(ji) )       & 
    513                                    + lfus * ( 1.0 - ( ztmelts - rtt ) /    & 
    514                                               ( t_bo_b(ji) - rtt ) )       & 
    515                                    - rcp * ( ztmelts-rtt ) ) 
     507                  ( cpic * ( ztmelts - t_bo_b(ji) )       & 
     508                  + lfus * ( 1.0 - ( ztmelts - rtt ) /    & 
     509                  ( t_bo_b(ji) - rtt ) )       & 
     510                  - rcp * ( ztmelts-rtt ) ) 
    516511               ! Basal growth rate = - F*dt / q 
    517512               dh_i_bott(ji)       =  - rdt_ice*( fc_bo_i(ji) + fbif_1d(ji) + & 
    518                                       qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1)  
     513                  qlbbq_1d(ji) ) / q_i_b(ji,nlay_i+1)  
    519514               ! Salinity update 
    520515               ! entrapment during bottom growth 
    521516               dsm_i_se_1d(ji) =  ( s_i_new(ji)*dh_i_bott(ji) +              &  
    522                                    sm_i_b(ji)*ht_i_b(ji) ) /                 &  
    523                                    MAX( ht_i_b(ji) + dh_i_bott(ji) ,zeps )   & 
    524                                    - sm_i_b(ji) 
     517                  sm_i_b(ji)*ht_i_b(ji) ) /                 &  
     518                  MAX( ht_i_b(ji) + dh_i_bott(ji) ,zeps )   & 
     519                  - sm_i_b(ji) 
    525520            ENDIF ! heat budget 
    526521         END DO ! ji 
     
    537532         ! heat convergence at the surface > 0 
    538533         IF (  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) .GE. 0.0  ) THEN 
    539                   
     534 
    540535            s_i_new(ji)   =  s_i_b(ji,nlay_i) 
    541536            zqfont_bo(ji) =  rdt_ice * ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) 
     
    559554                  zdeltah(ji,jk)  = - zqfont_bo(ji) / q_i_b(ji,jk) 
    560555                  zqfont_bo(ji)   = MAX( 0.0 , - zh_i(ji) - zdeltah(ji,jk) ) * & 
    561                                     q_i_b(ji,jk) 
     556                     q_i_b(ji,jk) 
    562557                  zdeltah(ji,jk)  = MAX(zdeltah(ji,jk), - zh_i(ji) ) 
    563558                  dh_i_bott(ji)   = dh_i_bott(ji) + zdeltah(ji,jk) 
    564559                  zdq_i(ji)       = zdq_i(ji) + zdeltah(ji,jk) * & 
    565                                     q_i_b(ji,jk) / rdt_ice 
    566                ! contribution to salt flux 
     560                     q_i_b(ji,jk) / rdt_ice 
     561                  ! contribution to salt flux 
    567562                  zji             = MOD( npb(ji) - 1, jpi ) + 1 
    568563                  zjj             = ( npb(ji) - 1 ) / jpi + 1 
    569564                  zfsalt_melt(ji) = zfsalt_melt(ji) +                         & 
    570                                    ( sss_m(zji,zjj) - sm_i_b(ji)   ) *        & 
    571                                    a_i_b(ji) * & 
    572                                    MIN( zdeltah(ji,jk) , 0.0 ) * rhoic / rdt_ice  
     565                     ( sss_m(zji,zjj) - sm_i_b(ji)   ) *        & 
     566                     a_i_b(ji) * & 
     567                     MIN( zdeltah(ji,jk) , 0.0 ) * rhoic / rdt_ice  
    573568               ENDIF 
    574569            ENDIF 
     
    580575      !------------------- 
    581576      IF ( con_i ) THEN 
    582       DO ji = kideb, kiut 
    583          IF (  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) .GE. 0.0  ) THEN 
    584             IF ( ( zfbase(ji) + zdq_i(ji) ) .GE. 1.0e-3 ) THEN 
    585                numce_dh = numce_dh + 1 
    586                meance_dh = meance_dh + zfbase(ji) + zdq_i(ji) 
    587             ENDIF 
    588             IF ( zfbase(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN 
    589                 WRITE(numout,*) ' ALERTE heat loss for basal  melt ' 
    590                 WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl 
    591                 WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    592                 WRITE(numout,*) ' zfbase  : ', zfbase(ji) 
    593                 WRITE(numout,*) ' zdq_i   : ', zdq_i(ji) 
    594                 WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
    595                 WRITE(numout,*) ' fc_bo_i : ', fc_bo_i(ji) 
    596                 WRITE(numout,*) ' fbif_1d : ', fbif_1d(ji) 
    597                 WRITE(numout,*) ' qlbbq_1d: ', qlbbq_1d(ji) 
    598                 WRITE(numout,*) ' s_i_new : ', s_i_new(ji) 
    599                 WRITE(numout,*) ' sss_m   : ', sss_m(zji,zjj) 
    600                 WRITE(numout,*) ' dh_i_bott : ', dh_i_bott(ji) 
    601                 WRITE(numout,*) ' innermelt : ', innermelt(ji) 
    602             ENDIF 
    603          ENDIF ! heat convergence at the surface 
    604       END DO ! ji 
    605  
    606       IF ( numce_dh .GT. 0 ) meance_dh = meance_dh / numce_dh 
    607       WRITE(numout,*) ' Number of points where there is bas. me. error : ', numce_dh 
    608       WRITE(numout,*) ' Mean basal melt error on error points : ', meance_dh 
    609       WRITE(numout,*) ' Remaining bottom heat : ', zqfont_bo(jiindex_1d) 
     577         DO ji = kideb, kiut 
     578            IF (  ( fc_bo_i(ji) + fbif_1d(ji) + qlbbq_1d(ji) ) .GE. 0.0  ) THEN 
     579               IF ( ( zfbase(ji) + zdq_i(ji) ) .GE. 1.0e-3 ) THEN 
     580                  numce_dh = numce_dh + 1 
     581                  meance_dh = meance_dh + zfbase(ji) + zdq_i(ji) 
     582               ENDIF 
     583               IF ( zfbase(ji) + zdq_i(ji) .GE. 1.0e-3  ) THEN 
     584                  WRITE(numout,*) ' ALERTE heat loss for basal  melt ' 
     585                  WRITE(numout,*) ' zji, zjj, jl :', zji, zjj, jl 
     586                  WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
     587                  WRITE(numout,*) ' zfbase  : ', zfbase(ji) 
     588                  WRITE(numout,*) ' zdq_i   : ', zdq_i(ji) 
     589                  WRITE(numout,*) ' ht_i_b  : ', ht_i_b(ji) 
     590                  WRITE(numout,*) ' fc_bo_i : ', fc_bo_i(ji) 
     591                  WRITE(numout,*) ' fbif_1d : ', fbif_1d(ji) 
     592                  WRITE(numout,*) ' qlbbq_1d: ', qlbbq_1d(ji) 
     593                  WRITE(numout,*) ' s_i_new : ', s_i_new(ji) 
     594                  WRITE(numout,*) ' sss_m   : ', sss_m(zji,zjj) 
     595                  WRITE(numout,*) ' dh_i_bott : ', dh_i_bott(ji) 
     596                  WRITE(numout,*) ' innermelt : ', innermelt(ji) 
     597               ENDIF 
     598            ENDIF ! heat convergence at the surface 
     599         END DO ! ji 
     600 
     601         IF ( numce_dh .GT. 0 ) meance_dh = meance_dh / numce_dh 
     602         WRITE(numout,*) ' Number of points where there is bas. me. error : ', numce_dh 
     603         WRITE(numout,*) ' Mean basal melt error on error points : ', meance_dh 
     604         WRITE(numout,*) ' Remaining bottom heat : ', zqfont_bo(jiindex_1d) 
    610605 
    611606      ENDIF ! con_i 
    612607 
    613 ! 
    614 !------------------------------------------------------------------------------! 
    615 !  5) Pathological cases                                                       ! 
    616 !------------------------------------------------------------------------------! 
    617 ! 
     608      ! 
     609      !------------------------------------------------------------------------------! 
     610      !  5) Pathological cases                                                       ! 
     611      !------------------------------------------------------------------------------! 
     612      ! 
    618613      !---------------------------------------------- 
    619614      ! 5.1 Excessive ablation in a 1-category model 
     
    626621         ! excessive energy is sent to lateral ablation 
    627622         fsup(ji)            =  rhoic*lfus * at_i_b(ji) / MAX( ( 1.0 - at_i_b(ji) ),epsi13) & 
    628                              *  ( zdhbf - dh_i_bott(ji) ) / rdt_ice 
     623            *  ( zdhbf - dh_i_bott(ji) ) / rdt_ice 
    629624 
    630625         dh_i_bott(ji)  = zdhbf 
     
    638633         zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    639634         diag_bot_gr(zji,zjj) = diag_bot_gr(zji,zjj) + MAX(dh_i_bott(ji),0.0)*a_i_b(ji) & 
    640                               / rdt_ice 
     635            / rdt_ice 
    641636         diag_sur_me(zji,zjj) = diag_sur_me(zji,zjj) + MIN(dh_i_surf(ji),0.0)*a_i_b(ji) & 
    642                               / rdt_ice 
     637            / rdt_ice 
    643638         diag_bot_me(zji,zjj) = diag_bot_me(zji,zjj) + MIN(dh_i_bott(ji),0.0)*a_i_b(ji) & 
    644                               / rdt_ice 
     639            / rdt_ice 
    645640      END DO 
    646641 
     
    667662         zqt_s(ji)  =  ( 1. - zihg) * zqt_s(ji) / MAX( zhni, zeps ) 
    668663         zdhnm      =  - ( 1. - zihg ) * ( 1. - zihgnew ) * ( zfdt_final(ji) /  & 
    669                            MAX( zqt_s(ji) , zeps ) ) 
     664            MAX( zqt_s(ji) , zeps ) ) 
    670665         zhnfi          =  zhni + zdhnm 
    671666         zfdt_final(ji) =  MAX ( zfdt_final(ji) + zqt_s(ji) * zdhnm , 0.0 ) 
     
    676671         !--------------------------------- 
    677672         rdmicif_1d(ji) =  rdmicif_1d(ji) + a_i_b(ji) *                        & 
    678                            (zhgnew(ji)-ht_i_b(ji))*rhoic ! good 
     673            (zhgnew(ji)-ht_i_b(ji))*rhoic ! good 
    679674 
    680675         rdmsnif_1d(ji) =  rdmsnif_1d(ji) + a_i_b(ji) * & 
    681                            (ht_s_b(ji)-zhni)*rhosn ! good too 
     676            (ht_s_b(ji)-zhni)*rhosn ! good too 
    682677 
    683678         ! Remaining heat to the ocean  
     
    700695         zjj           = ( npb(ji) - 1 ) / jpi + 1 
    701696         IF ( num_sal .NE. 4 ) & 
    702          fseqv_1d(ji)  = fseqv_1d(ji) + zihgnew * zfsalt_melt(ji) +           & 
    703                           (1.0 - zihgnew) * rdmicif_1d(ji) *                  & 
    704                           ( sss_m(zji,zjj) - sm_i_b(ji) ) / rdt_ice 
     697            fseqv_1d(ji)  = fseqv_1d(ji) + zihgnew * zfsalt_melt(ji) +           & 
     698            (1.0 - zihgnew) * rdmicif_1d(ji) *                  & 
     699            ( sss_m(zji,zjj) - sm_i_b(ji) ) / rdt_ice 
    705700         ! new lines 
    706701         IF ( num_sal .EQ. 4 ) & 
    707          fseqv_1d(ji)  = fseqv_1d(ji) + zihgnew * zfsalt_melt(ji) +           & 
    708                           (1.0 - zihgnew) * rdmicif_1d(ji) *                  & 
    709                           ( sss_m(zji,zjj) - bulk_sal ) / rdt_ice 
     702            fseqv_1d(ji)  = fseqv_1d(ji) + zihgnew * zfsalt_melt(ji) +           & 
     703            (1.0 - zihgnew) * rdmicif_1d(ji) *                  & 
     704            ( sss_m(zji,zjj) - bulk_sal ) / rdt_ice 
    710705         ! Heat flux 
    711706         ! excessive bottom ablation energy (fsup) - 0 except if jpl = 1 
    712707         ! excessive total ablation energy (focea) sent to the ocean 
    713708         qfvbq_1d(ji)  = qfvbq_1d(ji) + & 
    714                          fsup(ji) + ( 1.0 - zihgnew ) *        &  
    715                          focea(ji) * a_i_b(ji) * rdt_ice 
     709            fsup(ji) + ( 1.0 - zihgnew ) *        &  
     710            focea(ji) * a_i_b(ji) * rdt_ice 
    716711 
    717712         zihic   = 1.0 - MAX( zzero , SIGN( zone , -ht_i_b(ji) ) ) 
     
    719714         fscbq_1d(ji) =  a_i_b(ji) * fstbif_1d(ji) 
    720715         qldif_1d(ji)  = qldif_1d(ji)                                         & 
    721                        + fsup(ji) + ( 1.0 - zihgnew ) * focea(ji) * a_i_b(ji) &  
    722                          * rdt_ice                               & 
    723                        + ( 1.0 - zihic ) * fscbq_1d(ji) * rdt_ice 
     716            + fsup(ji) + ( 1.0 - zihgnew ) * focea(ji) * a_i_b(ji) &  
     717            * rdt_ice                               & 
     718            + ( 1.0 - zihic ) * fscbq_1d(ji) * rdt_ice 
    724719      END DO  ! ji 
    725720 
     
    743738         ht_i_b(ji) = zhgnew(ji) 
    744739      END DO  ! ji 
    745 ! 
    746 !------------------------------------------------------------------------------| 
    747 !  6) Snow-Ice formation                                                       | 
    748 !------------------------------------------------------------------------------| 
    749 ! 
     740      ! 
     741      !------------------------------------------------------------------------------| 
     742      !  6) Snow-Ice formation                                                       | 
     743      !------------------------------------------------------------------------------| 
     744      ! 
    750745      ! When snow load excesses Archimede's limit, snow-ice interface goes down 
    751746      ! under sea-level, flooding of seawater transforms snow into ice 
     
    754749 
    755750         dh_snowice(ji) = MAX(zzero,(rhosn*ht_s_b(ji)+(rhoic-rau0) & 
    756                             * ht_i_b(ji))/(rhosn+rau0-rhoic)) 
     751            * ht_i_b(ji))/(rhosn+rau0-rhoic)) 
    757752         zhgnew(ji)     = MAX(zhgnew(ji),zhgnew(ji)+dh_snowice(ji)) 
    758753         zhnnew            = MIN(ht_s_b(ji),ht_s_b(ji)-dh_snowice(ji)) 
    759754 
    760       !  Changes in ice volume and ice mass. 
     755         !  Changes in ice volume and ice mass. 
    761756         dvnbq_1d(ji)      = a_i_b(ji) * (zhgnew(ji)-ht_i_b(ji)) 
    762757         dmgwi_1d(ji)      = dmgwi_1d(ji) + a_i_b(ji) & 
    763                              *(ht_s_b(ji)-zhnnew)*rhosn 
     758            *(ht_s_b(ji)-zhnnew)*rhosn 
    764759 
    765760         rdmicif_1d(ji) = rdmicif_1d(ji) + a_i_b(ji) &  
    766                                          * ( zhgnew(ji) - ht_i_b(ji) )*rhoic  
     761            * ( zhgnew(ji) - ht_i_b(ji) )*rhoic  
    767762         rdmsnif_1d(ji) = rdmsnif_1d(ji) + a_i_b(ji) &  
    768                                          * ( zhnnew       - ht_s_b(ji) )*rhosn 
    769  
    770 !        Equivalent salt flux (1) Snow-ice formation component 
    771 !        ----------------------------------------------------- 
     763            * ( zhnnew       - ht_s_b(ji) )*rhosn 
     764 
     765         !        Equivalent salt flux (1) Snow-ice formation component 
     766         !        ----------------------------------------------------- 
    772767         zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    773768         zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    774769 
    775770         zsm_snowice  = ( rhoic - rhosn ) / rhoic *            & 
    776                         sss_m(zji,zjj)  
     771            sss_m(zji,zjj)  
    777772 
    778773         IF ( num_sal .NE. 2 ) zsm_snowice = sm_i_b(ji) 
    779774 
    780775         IF ( num_sal .NE. 4 ) & 
    781          fseqv_1d(ji)   = fseqv_1d(ji)   + & 
    782                           ( sss_m(zji,zjj) - zsm_snowice ) * & 
    783                             a_i_b(ji)   * & 
    784                           ( zhgnew(ji) - ht_i_b(ji) ) * rhoic / rdt_ice 
     776            fseqv_1d(ji)   = fseqv_1d(ji)   + & 
     777            ( sss_m(zji,zjj) - zsm_snowice ) * & 
     778            a_i_b(ji)   * & 
     779            ( zhgnew(ji) - ht_i_b(ji) ) * rhoic / rdt_ice 
    785780         ! new lines 
    786781         IF ( num_sal .EQ. 4 ) & 
    787          fseqv_1d(ji)   = fseqv_1d(ji)   + & 
    788                           ( sss_m(zji,zjj) - bulk_sal    ) * & 
    789                             a_i_b(ji)   * & 
    790                           ( zhgnew(ji) - ht_i_b(ji) ) * rhoic / rdt_ice 
     782            fseqv_1d(ji)   = fseqv_1d(ji)   + & 
     783            ( sss_m(zji,zjj) - bulk_sal    ) * & 
     784            a_i_b(ji)   * & 
     785            ( zhgnew(ji) - ht_i_b(ji) ) * rhoic / rdt_ice 
    791786 
    792787         ! entrapment during snow ice formation 
    793788         i_ice_switch = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_i_b(ji) + 1.0e-6 ) ) 
    794789         isnowic      = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - dh_snowice(ji) ) ) * & 
    795                         i_ice_switch 
     790            i_ice_switch 
    796791         IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) & 
    797              dsm_i_si_1d(ji)  = ( zsm_snowice*dh_snowice(ji) & 
    798                             + sm_i_b(ji) * ht_i_b(ji)                          &  
    799                             / MAX( ht_i_b(ji) + dh_snowice(ji), zeps)          & 
    800                             - sm_i_b(ji) ) * isnowic      
    801  
    802 !  Actualize new snow and ice thickness. 
     792            dsm_i_si_1d(ji)  = ( zsm_snowice*dh_snowice(ji) & 
     793            + sm_i_b(ji) * ht_i_b(ji)                          &  
     794            / MAX( ht_i_b(ji) + dh_snowice(ji), zeps)          & 
     795            - sm_i_b(ji) ) * isnowic      
     796 
     797         !  Actualize new snow and ice thickness. 
    803798         ht_s_b(ji)  = zhnnew 
    804799         ht_i_b(ji)  = zhgnew(ji) 
     
    811806         zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    812807         diag_sni_gr(zji,zjj)  = diag_sni_gr(zji,zjj) + dh_snowice(ji)*a_i_b(ji) / & 
    813                                  rdt_ice 
     808            rdt_ice 
    814809 
    815810      END DO !ji 
    816811 
    817     END SUBROUTINE lim_thd_dh 
     812   END SUBROUTINE lim_thd_dh 
    818813#else 
    819814   !!====================================================================== 
     
    825820   END SUBROUTINE lim_thd_dh 
    826821#endif 
    827  END MODULE limthd_dh 
     822END MODULE limthd_dh 
Note: See TracChangeset for help on using the changeset viewer.