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

Ignore:
Timestamp:
2011-03-30T17:58:35+02:00 (13 years ago)
Author:
rblod
Message:

First attempt to put dynamic allocation on the trunk

File:
1 edited

Legend:

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

    r2528 r2715  
    66   !!                       after vertical growth/decay 
    77   !!====================================================================== 
     8   !! History :  LIM  ! 2003-05 (M. Vancoppenolle) Original code in 1D 
     9   !!                 ! 2005-07 (M. Vancoppenolle) 3D version  
     10   !!                 ! 2006-11 (X. Fettweis) Vectorized  
     11   !!            3.0  ! 2008-03 (M. Vancoppenolle) Energy conservation and clean code 
     12   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation 
     13   !!---------------------------------------------------------------------- 
    814#if defined key_lim3 
    915   !!---------------------------------------------------------------------- 
     
    1319   !!---------------------------------------------------------------------- 
    1420   USE par_oce          ! ocean parameters 
    15    USE dom_oce 
    16    USE domain 
    17    USE in_out_manager 
    18    USE phycst 
    19    USE thd_ice 
    20    USE ice 
    21    USE limvar 
    22    USE par_ice 
    23    USE lib_mpp  
     21   USE dom_oce          ! domain variables 
     22   USE domain           ! 
     23   USE phycst           ! physical constants 
     24   USE ice              ! LIM variables 
     25   USE par_ice          ! LIM parameters 
     26   USE thd_ice          ! LIM thermodynamics 
     27   USE limvar           ! LIM variables 
     28   USE in_out_manager   ! I/O manager 
     29   USE wrk_nemo         ! workspace manager 
     30   USE lib_mpp          ! MPP library 
    2431 
    2532   IMPLICIT NONE 
     
    2835   PUBLIC   lim_thd_ent     ! called by lim_thd 
    2936 
    30    REAL(wp)  ::           &  ! constant values 
    31       epsi20 = 1.e-20  ,  & 
    32       epsi13 = 1.e-13  ,  & 
    33       zzero  = 0.e0    ,  & 
    34       zone   = 1.e0    ,  & 
    35       epsi10 = 1.0e-10 
     37   REAL(wp) ::   epsi20 = 1e-20_wp   ! constant values 
     38   REAL(wp) ::   epsi13 = 1e-13_wp   ! 
     39   REAL(wp) ::   epsi10 = 1e-10_wp   ! 
     40   REAL(wp) ::   epsi06 = 1e-06_wp   ! 
     41   REAL(wp) ::   zzero  = 0._wp      ! 
     42   REAL(wp) ::   zone   = 1._wp      ! 
     43 
    3644   !!---------------------------------------------------------------------- 
    37    !! NEMO/LIM3 3.3 , UCL - NEMO Consortium (2010) 
     45   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
    3846   !! $Id$ 
    3947   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    4149CONTAINS 
    4250 
    43    SUBROUTINE lim_thd_ent(kideb,kiut,jl) 
     51   SUBROUTINE lim_thd_ent( kideb, kiut, jl ) 
    4452      !!------------------------------------------------------------------- 
    4553      !!               ***   ROUTINE lim_thd_ent  *** 
     
    6068      !!            5) Ice salinity, recover temperature 
    6169      !! 
    62       !! ** Arguments 
    63       !! 
    64       !! ** Inputs / Outputs 
    65       !! 
    66       !! ** External 
    67       !! 
    68       !! ** References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005 
    69       !! 
    70       !! ** History  : (05-2003) Martin V. UCL-Astr 
    71       !!               (07-2005) Martin for 3d adapatation 
    72       !!               (11-2006) Vectorized by Xavier Fettweis (ASTR) 
    73       !!               (03-2008) Energy conservation and clean code 
    74       !! * Arguments 
    75  
    76       INTEGER , INTENT(IN)::  & 
    77          kideb          ,   &  ! start point on which the the computation is applied 
    78          kiut           ,   &  ! end point on which the the computation is applied 
    79          jl                    ! thickness category number 
    80  
    81       INTEGER ::            & 
    82          ji,jk          ,   &  !  dummy loop indices 
    83          zji, zjj       ,   &  !  dummy indices 
     70      !! References : Bitz & Lipscomb, JGR 99; Vancoppenolle et al., GRL, 2005 
     71      !!------------------------------------------------------------------- 
     72      INTEGER , INTENT(in) ::   kideb, kiut   ! Start/End point on which the  the computation is applied 
     73      INTEGER , INTENT(in) ::   jl            ! Thickness cateogry number 
     74 
     75      INTEGER ::   ji,jk   !  dummy loop indices 
     76      INTEGER ::   zji, zjj       ,   &  !  dummy indices 
    8477         ntop0          ,   &  !  old layer top index 
    8578         nbot1          ,   &  !  new layer bottom index 
     
    9083         layer0, layer1        !  old/new layer indexes 
    9184 
    92       INTEGER, DIMENSION(jpij) :: & 
    93          snswi          ,   &  !  snow switch 
    94          nbot0          ,   &  !  old layer bottom index 
    95          icsuind        ,   &  !  ice surface index 
    96          icsuswi        ,   &  !  ice surface switch 
    97          icboind        ,   &  !  ice bottom index 
    98          icboswi        ,   &  !  ice bottom switch 
    99          snicind        ,   &  !  snow ice index 
    100          snicswi        ,   &  !  snow ice switch 
    101          snind                 !  snow index 
    10285 
    10386      REAL(wp) :: & 
    104          zeps, zeps6    ,   &  ! numerical constant very small 
    10587         ztmelts        ,   &  ! ice melting point 
    10688         zqsnic         ,   &  ! enthalpy of snow ice layer 
     
    11597         zdiscrim              !: dummy factor 
    11698 
    117       REAL(wp), DIMENSION(jpij) :: &   
    118          zh_i           ,   &  ! thickness of an ice layer 
    119          zh_s           ,   &  ! thickness of a snow layer 
    120          zqsnow         ,   &  ! enthalpy of the snow put in snow ice    
    121          zdeltah               ! temporary variable 
    122  
    123       REAL(wp), DIMENSION(jpij,0:jkmax+3) :: & 
    124          zm0            ,   &  !  old layer-system vertical cotes 
    125          qm0            ,   &  !  old layer-system heat content 
    126          z_s            ,   &  !  new snow system vertical cotes 
    127          z_i            ,   &  !  new ice system vertical cotes 
    128          zthick0               !  old ice thickness 
    129  
    130       REAL(wp), DIMENSION(jpij,0:jkmax+3) :: & 
    131          zhl0                  ! old and new layer thicknesses 
    132  
    133       REAL(wp), DIMENSION(0:jkmax+3,0:jkmax+3) :: & 
    134          zrl01 
    135  
    136       ! Energy conservation 
    137       REAL(wp), DIMENSION(jpij) :: & 
    138          zqti_in, zqts_in,         & 
    139          zqti_fin, zqts_fin 
    140  
    141       !------------------------------------------------------------------------------| 
    142  
    143       zeps   = 1.0d-20 
    144       zeps6  = 1.0d-06 
    145       zthick0(:,:) = 0.0 
    146       zm0(:,:)     = 0.0 
    147       qm0(:,:)     = 0.0 
    148       zrl01(:,:)   = 0.0 
    149       zhl0(:,:)    = 0.0 
    150       z_i(:,:)     = 0.0 
    151       z_s(:,:)     = 0.0 
     99      INTEGER, DIMENSION(jpij) :: & 
     100         snswi          ,   &  !  snow switch 
     101         nbot0          ,   &  !  old layer bottom index 
     102         icsuind        ,   &  !  ice surface index 
     103         icsuswi        ,   &  !  ice surface switch 
     104         icboind        ,   &  !  ice bottom index 
     105         icboswi        ,   &  !  ice bottom switch 
     106         snicind        ,   &  !  snow ice index 
     107         snicswi        ,   &  !  snow ice switch 
     108         snind                 !  snow index 
     109      ! 
     110      REAL(wp), DIMENSION(jpij,0:jkmax+3) ::   zm0       !  old layer-system vertical cotes 
     111      REAL(wp), DIMENSION(jpij,0:jkmax+3) ::   qm0       !  old layer-system heat content 
     112      REAL(wp), DIMENSION(jpij,0:jkmax+3) ::   z_s       !  new snow system vertical cotes 
     113      REAL(wp), DIMENSION(jpij,0:jkmax+3) ::   z_i       !  new ice system vertical cotes 
     114      REAL(wp), DIMENSION(jpij,0:jkmax+3) ::   zthick0   !  old ice thickness 
     115      REAL(wp), DIMENSION(jpij,0:jkmax+3) ::   zhl0      ! old and new layer thicknesses 
     116      ! 
     117      REAL(wp), DIMENSION(0:jkmax+3,0:jkmax+3) ::   zrl01 
     118      ! 
     119      REAL(wp), POINTER, DIMENSION(:) ::   zh_i, zqsnow , zqti_in, zqti_fin 
     120      REAL(wp), POINTER, DIMENSION(:) ::   zh_s, zdeltah, zqts_in, zqts_fin 
     121      !!------------------------------------------------------------------- 
     122 
     123      IF( wrk_in_use(1, 1,2,3,4,5,6,7,8) ) THEN 
     124         CALL ctl_stop('lim_thd_dh : requestead workspace arrays unavailable')   ;   RETURN 
     125      END IF 
     126 
     127      ! Set-up pointers to sub-arrays of workspace arrays 
     128      zh_i      =>  wrk_1d_1 (1:jpij)   ! thickness of an ice layer 
     129      zh_s      =>  wrk_1d_2 (1:jpij)   ! thickness of a snow layer 
     130      zqsnow    =>  wrk_1d_3 (1:jpij)   ! enthalpy of the snow put in snow ice 
     131      zdeltah   =>  wrk_1d_4 (1:jpij)   ! temporary variable 
     132      zqti_in   =>  wrk_1d_5 (1:jpij)   ! Energy conservation 
     133      zqts_in   =>  wrk_1d_6 (1:jpij)   !    -         - 
     134      zqti_fin  =>  wrk_1d_7 (1:jpij)   !    -         - 
     135      zqts_fin  =>  wrk_1d_8 (1:jpij)   !    -         - 
     136 
     137      zthick0(:,:) = 0._wp 
     138      zm0    (:,:) = 0._wp 
     139      qm0    (:,:) = 0._wp 
     140      zrl01  (:,:) = 0._wp 
     141      zhl0   (:,:) = 0._wp 
     142      z_i    (:,:) = 0._wp 
     143      z_s    (:,:) = 0._wp 
    152144 
    153145      ! 
     
    155147      !  1) Grid                                                                     | 
    156148      !------------------------------------------------------------------------------| 
    157       ! 
    158       nlays0        = nlay_s 
    159       nlayi0        = nlay_i 
    160  
    161       DO ji = kideb, kiut 
    162          zh_i(ji)   = old_ht_i_b(ji) / nlay_i  
    163          zh_s(ji)   = old_ht_s_b(ji) / nlay_s 
    164       ENDDO 
     149      nlays0 = nlay_s 
     150      nlayi0 = nlay_i 
     151 
     152      DO ji = kideb, kiut 
     153         zh_i(ji) = old_ht_i_b(ji) / nlay_i  
     154         zh_s(ji) = old_ht_s_b(ji) / nlay_s 
     155      END DO 
    165156 
    166157      ! 
     
    168159      !  2) Switches                                                                 | 
    169160      !------------------------------------------------------------------------------| 
    170       ! 
    171161      ! 2.1 snind(ji), snswi(ji) 
    172162      ! snow surface behaviour : computation of snind(ji)-snswi(ji) 
     
    176166      !   2 if 2nd layer is melting ... 
    177167      DO ji = kideb, kiut 
    178          snind(ji)    = 0 
    179          zdeltah(ji)   = 0.0 
     168         snind  (ji) = 0 
     169         zdeltah(ji) = 0._wp 
    180170      ENDDO !ji 
    181171 
    182172      DO jk = 1, nlays0 
    183173         DO ji = kideb, kiut 
    184             snind(ji)  = jk        *      INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-zeps))) & 
    185                + snind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-zeps)))) 
     174            snind(ji)  = jk        *      INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-epsi20))) & 
     175               + snind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_s_tot(ji)-zdeltah(ji)-epsi20)))) 
    186176            zdeltah(ji)= zdeltah(ji) + zh_s(ji) 
    187177         END DO ! ji 
    188       ENDDO ! jk 
     178      END DO ! jk 
    189179 
    190180      ! snswi(ji) : switch which value equals 1 if snow melts 
    191181      !              0 if not 
    192182      DO ji = kideb, kiut 
    193          snswi(ji)     = MAX(0,INT(-dh_s_tot(ji)/MAX(zeps,ABS(dh_s_tot(ji))))) 
    194       ENDDO ! ji 
     183         snswi(ji)     = MAX(0,INT(-dh_s_tot(ji)/MAX(epsi20,ABS(dh_s_tot(ji))))) 
     184      END DO ! ji 
    195185 
    196186      ! 2.2 icsuind(ji), icsuswi(ji) 
     
    201191      !     2 if 2nd layer is reached by melt ... 
    202192      DO ji = kideb, kiut 
    203          icsuind(ji)   = 0 
    204          zdeltah(ji)   = 0.0 
    205       ENDDO !ji 
     193         icsuind(ji) = 0 
     194         zdeltah(ji) = 0._wp 
     195      END DO !ji 
    206196      DO jk = 1, nlayi0 
    207197         DO ji = kideb, kiut 
    208             icsuind(ji) = jk          *      INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-zeps))) & 
    209                + icsuind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-zeps)))) 
     198            icsuind(ji) = jk          *      INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-epsi20))) & 
     199               + icsuind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_surf(ji)-zdeltah(ji)-epsi20)))) 
    210200            zdeltah(ji) = zdeltah(ji) + zh_i(ji) 
    211201         END DO ! ji 
     
    216206      !     0 if not 
    217207      DO ji = kideb, kiut 
    218          icsuswi(ji)  = MAX(0,INT(-dh_i_surf(ji)/MAX(zeps , ABS(dh_i_surf(ji)) ) ) ) 
     208         icsuswi(ji)  = MAX(0,INT(-dh_i_surf(ji)/MAX(epsi20 , ABS(dh_i_surf(ji)) ) ) ) 
    219209      ENDDO 
    220210 
     
    227217      !            N+1 if all layers melt and that snow transforms into ice 
    228218      DO ji = kideb, kiut  
    229          icboind(ji)   = 0 
    230          zdeltah(ji)   = 0.0 
    231       ENDDO 
     219         icboind(ji) = 0 
     220         zdeltah(ji) = 0._wp 
     221      END DO 
    232222      DO jk = nlayi0, 1, -1 
    233223         DO ji = kideb, kiut 
    234             icboind(ji) = (nlayi0+1-jk) & 
    235                *      INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-zeps))) & 
    236                + icboind(ji) & 
    237                * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-zeps))))  
     224            icboind(ji) = (nlayi0+1-jk) *      INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-epsi20))) & 
     225               &          + icboind(ji) * (1 - INT(MAX(0.0,SIGN(1.0,-dh_i_bott(ji)-zdeltah(ji)-epsi20))))  
    238226            zdeltah(ji) = zdeltah(ji) + zh_i(ji) 
    239227         END DO 
    240       ENDDO 
     228      END DO 
    241229 
    242230      DO ji = kideb, kiut 
    243231         ! case of total ablation with remaining snow 
    244          IF ( ( ht_i_b(ji) .GT. zeps ) .AND. & 
    245             ( ht_i_b(ji) - dh_snowice(ji) .LT. zeps ) ) icboind(ji) = nlay_i + 1 
     232         IF ( ( ht_i_b(ji) .GT. epsi20 ) .AND. & 
     233            ( ht_i_b(ji) - dh_snowice(ji) .LT. epsi20 ) ) icboind(ji) = nlay_i + 1 
    246234      END DO 
    247235 
     
    250238      !     0 if ablation is on the way 
    251239      DO ji = kideb, kiut  
    252          icboswi(ji)     = MAX(0,INT(dh_i_bott(ji) / MAX(zeps,ABS(dh_i_bott(ji))))) 
    253       ENDDO 
     240         icboswi(ji) = MAX(0,INT(dh_i_bott(ji) / MAX(epsi20,ABS(dh_i_bott(ji))))) 
     241      END DO 
    254242 
    255243      ! 2.4 snicind(ji), snicswi(ji) 
     
    260248      !     2 if penultiem layer ... 
    261249      DO ji = kideb, kiut 
    262          snicind(ji)   = 0 
    263          zdeltah(ji)   = 0.0 
    264       ENDDO 
     250         snicind(ji) = 0 
     251         zdeltah(ji) = 0._wp 
     252      END DO 
    265253      DO jk = nlays0, 1, -1 
    266254         DO ji = kideb, kiut 
    267255            snicind(ji) = (nlays0+1-jk) & 
    268                *      INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-zeps))) & 
    269                + snicind(ji) & 
    270                * (1 - INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-zeps)))) 
     256               *      INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-epsi20))) + snicind(ji)   & 
     257               * (1 - INT(MAX(0.0,SIGN(1.0,dh_snowice(ji)-zdeltah(ji)-epsi20)))) 
    271258            zdeltah(ji) = zdeltah(ji) + zh_s(ji) 
    272259         END DO 
    273       ENDDO 
     260      END DO 
    274261 
    275262      ! snicswi(ji) : switch which equals  
     
    277264      !     0 if not 
    278265      DO ji = kideb, kiut 
    279          snicswi(ji)   = MAX(0,INT(dh_snowice(ji)/MAX(zeps,ABS(dh_snowice(ji))))) 
     266         snicswi(ji)   = MAX(0,INT(dh_snowice(ji)/MAX(epsi20,ABS(dh_snowice(ji))))) 
    280267      ENDDO 
    281268 
     
    294281      ! indexes of the vectors 
    295282      !------------------------ 
    296       ntop0                =  1 
    297       maxnbot0             =  0 
    298  
    299       DO ji = kideb, kiut 
    300          nbot0(ji)          =  nlays0  + 1 - snind(ji) + ( 1. - snicind(ji) ) * & 
    301             snicswi(ji) 
     283      ntop0    =  1 
     284      maxnbot0 =  0 
     285 
     286      DO ji = kideb, kiut 
     287         nbot0(ji) =  nlays0  + 1 - snind(ji) + ( 1. - snicind(ji) ) * snicswi(ji) 
    302288         ! cotes of the top of the layers 
    303          zm0(ji,0)          =  0.0 
    304          maxnbot0           =  MAX ( maxnbot0 , nbot0(ji) ) 
    305       ENDDO 
    306       IF( lk_mpp ) CALL mpp_max( maxnbot0, kcom=ncomm_ice ) 
     289         zm0(ji,0) =  0._wp 
     290         maxnbot0 =  MAX ( maxnbot0 , nbot0(ji) ) 
     291      END DO 
     292      IF( lk_mpp )   CALL mpp_max( maxnbot0, kcom=ncomm_ice ) 
    307293 
    308294      DO jk = 1, maxnbot0 
    309295         DO ji = kideb, kiut 
    310296            !change 
    311             limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) +                      & 
    312                snswi(ji) * ( jk + snind(ji) - 1 ) 
     297            limsum = ( 1 - snswi(ji) ) * ( jk - 1 ) + snswi(ji) * ( jk + snind(ji) - 1 ) 
     298            limsum = MIN( limsum , nlay_s ) 
     299            zm0(ji,jk) =  dh_s_tot(ji) + zh_s(ji) * limsum 
     300         END DO 
     301      END DO 
     302 
     303      DO ji = kideb, kiut 
     304         zm0(ji,nbot0(ji)) =  dh_s_tot(ji) - snicswi(ji) * dh_snowice(ji) + zh_s(ji) * nlays0 
     305         zm0(ji,1)         =  dh_s_tot(ji) * (1 -snswi(ji) ) + snswi(ji) * zm0(ji,1) 
     306      END DO 
     307 
     308      DO jk = ntop0, maxnbot0 
     309         DO ji = kideb, kiut 
     310            zthick0(ji,jk)  =  zm0(ji,jk) - zm0(ji,jk-1)            ! layer thickness 
     311         END DO 
     312      END DO 
     313 
     314      zqts_in(:) = 0._wp 
     315 
     316      DO ji = kideb, kiut         ! layer heat content 
     317         qm0    (ji,1) =  rhosn * (  cpic * ( rtt - ( 1. - snswi(ji) ) * tatm_ice_1d(ji)        & 
     318            &                                            - snswi(ji)   * t_s_b      (ji,1)  )   & 
     319            &                      + lfus  ) * zthick0(ji,1) 
     320         zqts_in(ji)   =  zqts_in(ji) + qm0(ji,1)  
     321      END DO 
     322 
     323      DO jk = 2, maxnbot0 
     324         DO ji = kideb, kiut 
     325            limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) + snswi(ji) * ( jk + snind(ji) - 1 ) 
    313326            limsum      = MIN( limsum , nlay_s ) 
    314             zm0(ji,jk)  =  dh_s_tot(ji) + zh_s(ji) * limsum 
    315          END DO 
    316       ENDDO 
    317  
    318       DO ji = kideb, kiut 
    319          zm0(ji,nbot0(ji)) =  dh_s_tot(ji) - snicswi(ji) * dh_snowice(ji) + & 
    320             zh_s(ji) * nlays0 
    321          zm0(ji,1)         =  dh_s_tot(ji) * (1 -snswi(ji) ) +              & 
    322             snswi(ji) * zm0(ji,1) 
    323       ENDDO 
    324  
    325       DO jk = ntop0, maxnbot0 
    326          DO ji = kideb, kiut 
    327             ! layer thickness 
    328             zthick0(ji,jk)  =  zm0(ji,jk) - zm0(ji,jk-1) 
    329          END DO 
    330       ENDDO 
    331  
    332       zqts_in(:) = 0.0 
    333  
    334       DO ji = kideb, kiut 
    335          ! layer heat content 
    336          qm0(ji,1)   =  rhosn * ( cpic * ( rtt - ( 1. - snswi(ji) ) * ( tatm_ice_1d(ji) ) & 
    337             - snswi(ji) * t_s_b(ji,1) )         & 
    338             + lfus ) * zthick0(ji,1) 
    339          zqts_in(ji) =  zqts_in(ji) + qm0(ji,1)  
    340       ENDDO 
    341  
    342       DO jk = 2, maxnbot0 
    343          DO ji = kideb, kiut 
    344             limsum      = ( 1 - snswi(ji) ) * ( jk - 1 ) +                      & 
    345                snswi(ji) * ( jk + snind(ji) - 1 ) 
    346             limsum      = MIN( limsum , nlay_s ) 
    347             qm0(ji,jk)  = rhosn * ( cpic * ( rtt - t_s_b(ji,limsum) ) + lfus )  & 
    348                * zthick0(ji,jk) 
    349             zswitch = 1.0 - MAX (0.0, SIGN ( 1.0, zeps - ht_s_b(ji) ) ) 
     327            qm0(ji,jk)  = rhosn * ( cpic * ( rtt - t_s_b(ji,limsum) ) + lfus ) * zthick0(ji,jk) 
     328            zswitch = 1.0 - MAX (0.0, SIGN ( 1.0, epsi20 - ht_s_b(ji) ) ) 
    350329            zqts_in(ji) = zqts_in(ji) + ( 1. - snswi(ji) ) * qm0(ji,jk) * zswitch 
    351330         END DO ! jk 
    352       ENDDO ! ji 
     331      END DO ! ji 
    353332 
    354333      !------------------------------------------------ 
     
    357336      ! zqsnow, enthalpy of the flooded snow 
    358337      DO ji = kideb, kiut 
    359          zqsnow(ji)     =  rhosn*lfus 
    360          zdeltah(ji)    =  0.0 
    361       ENDDO 
     338         zqsnow (ji) =  rhosn * lfus 
     339         zdeltah(ji) =  0._wp 
     340      END DO 
    362341 
    363342      DO jk =  nlays0, 1, -1 
    364343         DO ji = kideb, kiut 
    365             zhsnow      =  MAX(0.0,dh_snowice(ji)-zdeltah(ji)) 
    366             zqsnow(ji)  =  zqsnow(ji) + & 
    367                rhosn*cpic*(rtt-t_s_b(ji,jk)) 
     344            zhsnow =  MAX( 0._wp , dh_snowice(ji)-zdeltah(ji) ) 
     345            zqsnow (ji) =  zqsnow (ji) + rhosn*cpic*(rtt-t_s_b(ji,jk)) 
    368346            zdeltah(ji) =  zdeltah(ji) + zh_s(ji) 
    369347         END DO 
    370       ENDDO 
     348      END DO 
    371349 
    372350      DO ji = kideb, kiut 
     
    381359      ! Vector index    
    382360      !-------------- 
    383       ntop1    =  1 
    384       nbot1    =  nlay_s 
     361      ntop1 =  1 
     362      nbot1 =  nlay_s 
    385363 
    386364      !------------------- 
     
    389367      DO ji = kideb, kiut 
    390368         zh_s(ji)  = ht_s_b(ji) / nlay_s 
    391          z_s(ji,0) =  0.0 
     369         z_s(ji,0) =  0._wp 
    392370      ENDDO 
    393371 
     
    396374            z_s(ji,jk) =  zh_s(ji) * jk 
    397375         END DO 
    398       ENDDO 
     376      END DO 
    399377 
    400378      !----------------- 
     
    405383            zhl0(ji,layer0) = zm0(ji,layer0) - zm0(ji,layer0-1) 
    406384         END DO 
    407       ENDDO 
     385      END DO 
    408386 
    409387      DO layer1 = ntop1, nbot1 
    410388         DO ji = kideb, kiut 
    411             q_s_b(ji,layer1)= 0.0 
    412          END DO 
    413       ENDDO 
     389            q_s_b(ji,layer1) = 0._wp 
     390         END DO 
     391      END DO 
    414392 
    415393      !---------------- 
     
    419397         DO layer1 = ntop1, nbot1 
    420398            DO ji = kideb, kiut 
    421                zrl01(layer1,layer0) = MAX(0.0,( MIN(zm0(ji,layer0),z_s(ji,layer1)) & 
    422                   - MAX(zm0(ji,layer0-1), z_s(ji,layer1-1)))/MAX(zhl0(ji,layer0),epsi10))  
    423                q_s_b(ji,layer1) = q_s_b(ji,layer1) + zrl01(layer1,layer0)*qm0(ji,layer0) & 
    424                   * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+zeps)) 
     399               zrl01(layer1,layer0) = MAX(0.0,( MIN(zm0(ji,layer0),z_s(ji,layer1))   & 
     400                  &                 - MAX(zm0(ji,layer0-1), z_s(ji,layer1-1))) / MAX(zhl0(ji,layer0),epsi10))  
     401               q_s_b(ji,layer1) = q_s_b(ji,layer1) + zrl01(layer1,layer0)*qm0(ji,layer0)   & 
     402                  &                                * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+epsi20)) 
    425403            END DO 
    426404         END DO 
    427       ENDDO 
     405      END DO 
    428406 
    429407      ! Heat conservation 
    430       zqts_fin(:) = 0.0 
     408      zqts_fin(:) = 0._wp 
    431409      DO jk = 1, nlay_s 
    432410         DO ji = kideb, kiut 
     
    458436      DO jk = 1, nlay_s 
    459437         DO ji = kideb, kiut 
    460             q_s_b(ji,jk) = q_s_b(ji,jk) / MAX( zh_s(ji) , zeps ) 
     438            q_s_b(ji,jk) = q_s_b(ji,jk) / MAX( zh_s(ji) , epsi20 ) 
    461439         END DO !ji 
    462       ENDDO !jk   
     440      END DO !jk   
    463441 
    464442      !--------------------- 
     
    469447      DO jk = 1, nlay_s 
    470448         DO ji = kideb, kiut 
    471             zswitch = MAX ( 0.0 , SIGN ( 1.0, zeps - ht_s_b(ji) ) ) 
    472             t_s_b(ji,jk) = rtt                                                  & 
    473                + ( 1.0 - zswitch ) *                                  & 
    474                ( - zfac1 * q_s_b(ji,jk) + zfac2 ) 
    475          END DO 
    476       ENDDO 
     449            zswitch = MAX ( 0.0 , SIGN ( 1.0, epsi20 - ht_s_b(ji) ) ) 
     450            t_s_b(ji,jk) = rtt + ( 1.0 - zswitch ) * ( - zfac1 * q_s_b(ji,jk) + zfac2 ) 
     451         END DO 
     452      END DO 
    477453      ! 
    478454      !------------------------------------------------------------------------------| 
     
    487463      ! Vector indexes 
    488464      !---------------- 
    489       ntop0          =  1 
    490       maxnbot0       =  0 
     465      ntop0    =  1 
     466      maxnbot0 =  0 
    491467 
    492468      DO ji = kideb, kiut 
    493469         ! reference number of the bottommost layer 
    494          nbot0(ji)    =  MAX( 1 ,  MIN( nlayi0 + ( 1 - icboind(ji) ) +        & 
    495             ( 1 - icsuind(ji) ) * icsuswi(ji) + snicswi(ji) ,    & 
    496             nlay_i + 2 ) ) 
     470         nbot0(ji) =  MAX( 1 ,  MIN( nlayi0 + ( 1 - icboind(ji) ) +        & 
     471            &                           ( 1 - icsuind(ji) ) * icsuswi(ji) + snicswi(ji) , nlay_i + 2 ) ) 
    497472         ! maximum reference number of the bottommost layer over all domain 
    498          maxnbot0     =  MAX( maxnbot0 , nbot0(ji) ) 
    499       ENDDO 
     473         maxnbot0 =  MAX( maxnbot0 , nbot0(ji) ) 
     474      END DO 
    500475 
    501476      !------------------------- 
    502477      ! Cotes of old ice layers 
    503478      !------------------------- 
    504       zm0(:,0)    =  0.0 
     479      zm0(:,0) =  0.-wp 
    505480 
    506481      DO jk = 1, maxnbot0 
     
    514489               +  limsum * zh_i(ji) 
    515490         END DO 
    516       ENDDO 
     491      END DO 
    517492 
    518493      DO ji = kideb, kiut 
     
    520495            +  zh_i(ji) * nlayi0 
    521496         zm0(ji,1)         =  snicswi(ji)*dh_snowice(ji) + (1-snicswi(ji))*zm0(ji,1) 
    522       ENDDO 
     497      END DO 
    523498 
    524499      !----------------------------- 
     
    529504            zthick0(ji,jk) =  zm0(ji,jk) - zm0(ji,jk-1) 
    530505         END DO 
    531       ENDDO 
     506      END DO 
    532507 
    533508      !--------------------------- 
     
    543518            ztmelts = -tmut * s_i_b(ji,limsum) + rtt 
    544519            qm0(ji,jk) = rhoic * ( cpic * (ztmelts-t_i_b(ji,limsum)) + lfus * ( 1.0-(ztmelts-rtt)/ & 
    545                MIN((t_i_b(ji,limsum)-rtt),-zeps) ) - rcp*(ztmelts-rtt) ) & 
     520               MIN((t_i_b(ji,limsum)-rtt),-epsi20) ) - rcp*(ztmelts-rtt) ) & 
    546521               * zthick0(ji,jk) 
    547522         END DO 
    548       ENDDO 
     523      END DO 
    549524 
    550525      !---------------------------- 
     
    552527      !---------------------------- 
    553528      DO ji = kideb, kiut         
    554          ztmelts    = ( 1.0 - icboswi(ji) ) * (-tmut * s_i_b(ji,nlayi0)) &   ! case of melting ice 
    555             +      icboswi(ji)      * (-tmut * s_i_new(ji))      &   ! case of forming ice 
    556             + rtt                        ! this temperature is in Celsius 
     529         ztmelts    = ( 1.0 - icboswi(ji) ) * (-tmut * s_i_b  (ji,nlayi0) )  &   ! case of melting ice 
     530            &       +         icboswi(ji)   * (-tmut * s_i_new(ji)        )   &   ! case of forming ice 
     531            &       + rtt                                                         ! in Kelvin 
    557532 
    558533         ! bottom formation temperature 
    559534         ztform = t_i_b(ji,nlay_i) 
    560535         IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) ztform = t_bo_b(ji) 
    561          qm0(ji,nbot0(ji)) = ( 1.0 - icboswi(ji) )*qm0(ji,nbot0(ji)) &   ! case of melting ice 
    562             + icboswi(ji) *                                  &   ! case of forming ice 
    563             rhoic*( cpic*(ztmelts-ztform)                  & 
    564             + lfus *( 1.0-(ztmelts-rtt)/             & 
    565             MIN ( (ztform-rtt) , - epsi10 ) )      &  
    566             - rcp*(ztmelts-rtt) )                    & 
    567             *zthick0(ji,nbot0(ji)) 
    568       ENDDO 
     536         qm0(ji,nbot0(ji)) = ( 1.0 - icboswi(ji) )*qm0(ji,nbot0(ji))             &   ! case of melting ice 
     537            &              + icboswi(ji) * rhoic * ( cpic*(ztmelts-ztform)       &   ! case of forming ice 
     538            + lfus *( 1.0-(ztmelts-rtt) / MIN ( (ztform-rtt) , - epsi10 ) )      &  
     539            - rcp*(ztmelts-rtt) ) * zthick0(ji,nbot0(ji)  ) 
     540      END DO 
    569541 
    570542      !----------------------------- 
     
    585557         qm0(ji,1)      =  snicswi(ji) * zqsnic + ( 1 - snicswi(ji) ) * qm0(ji,1) 
    586558 
    587       ENDDO ! ji 
     559      END DO ! ji 
    588560 
    589561      DO jk = ntop0, maxnbot0 
    590562         DO ji = kideb, kiut 
    591563            ! Heat conservation 
    592             zqti_in(ji) = zqti_in(ji) + qm0(ji,jk) & 
    593                * MAX( 0.0 , SIGN(1.0,ht_i_b(ji)-zeps6+zeps) ) & 
    594                * MAX( 0.0 , SIGN( 1. , nbot0(ji) - jk + zeps ) ) 
    595          END DO 
    596       ENDDO 
     564            zqti_in(ji) = zqti_in(ji) + qm0(ji,jk) * MAX( 0.0 , SIGN(1.0,ht_i_b(ji)-epsi06+epsi20) ) & 
     565               &                                   * MAX( 0.0 , SIGN( 1. , nbot0(ji) - jk + epsi20 ) ) 
     566         END DO 
     567      END DO 
    597568 
    598569      !------------- 
     
    603574      ! Vectors index 
    604575      !--------------- 
    605  
    606       ntop1    =  1  
    607       nbot1    =  nlay_i 
     576      ntop1 =  1  
     577      nbot1 =  nlay_i 
    608578 
    609579      !------------------ 
     
    611581      !------------------ 
    612582      DO ji = kideb, kiut 
    613          zh_i(ji)      = ht_i_b(ji) / nlay_i 
     583         zh_i(ji) = ht_i_b(ji) / nlay_i 
    614584      ENDDO 
    615585 
     
    617587      ! Layer cotes       
    618588      !------------- 
    619       z_i(:,0) =  0.0 
     589      z_i(:,0) =  0._wp 
    620590      DO jk = 1, nlay_i 
    621591         DO ji = kideb, kiut 
    622592            z_i(ji,jk) =  zh_i(ji) * jk 
    623593         END DO 
    624       ENDDO 
     594      END DO 
    625595 
    626596      !--thicknesses of the layers 
    627597      DO layer0 = ntop0, maxnbot0 
    628598         DO ji = kideb, kiut 
    629             zhl0(ji,layer0)   =  zm0(ji,layer0) - zm0(ji,layer0-1) !thicknesses of the layers 
    630          END DO 
    631       ENDDO 
     599            zhl0(ji,layer0) = zm0(ji,layer0) - zm0(ji,layer0-1)   ! thicknesses of the layers 
     600         END DO 
     601      END DO 
    632602 
    633603      !------------------------ 
    634604      ! Weights for relayering 
    635605      !------------------------ 
    636  
    637       q_i_b(:,:) = 0.0 
     606      q_i_b(:,:) = 0._wp 
    638607      DO layer0 = ntop0, maxnbot0 
    639608         DO layer1 = ntop1, nbot1 
     
    643612               q_i_b(ji,layer1) = q_i_b(ji,layer1) &  
    644613                  + zrl01(layer1,layer0)*qm0(ji,layer0) & 
    645                   * MAX(0.0,SIGN(1.0,ht_i_b(ji)-zeps6+zeps)) & 
    646                   * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+zeps)) 
     614                  * MAX(0.0,SIGN(1.0,ht_i_b(ji)-epsi06+epsi20)) & 
     615                  * MAX(0.0,SIGN(1.0,nbot0(ji)-layer0+epsi20)) 
    647616            END DO 
    648617         END DO 
    649       ENDDO 
     618      END DO 
    650619 
    651620      !------------------------- 
    652621      ! Heat conservation check 
    653622      !------------------------- 
    654       zqti_fin(:) = 0.0 
     623      zqti_fin(:) = 0._wp 
    655624      DO jk = 1, nlay_i 
    656625         DO ji = kideb, kiut 
     
    663632            zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    664633            zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    665             WRITE(numout,*) ' violation of heat conservation : ',             & 
    666                ABS ( zqti_in(ji) - zqti_fin(ji) ) / rdt_ice 
     634            WRITE(numout,*) ' violation of heat conservation : ', ABS ( zqti_in(ji) - zqti_fin(ji) ) / rdt_ice 
    667635            WRITE(numout,*) ' ji, jj   : ', zji, zjj 
    668636            WRITE(numout,*) ' ht_i_b   : ', ht_i_b(ji) 
     
    683651      DO jk = 1, nlay_i 
    684652         DO ji = kideb, kiut 
    685             q_i_b(ji,jk) = q_i_b(ji,jk) / MAX( zh_i(ji) , zeps ) 
     653            q_i_b(ji,jk) = q_i_b(ji,jk) / MAX( zh_i(ji) , epsi20 ) 
    686654         END DO !ji 
    687       ENDDO !jk   
     655      END DO !jk   
    688656 
    689657      ! Heat conservation 
     
    702670      ! Update salinity (basal entrapment, snow ice formation) 
    703671      DO ji = kideb, kiut 
    704          sm_i_b(ji) = sm_i_b(ji)                                & 
    705             + dsm_i_se_1d(ji) + dsm_i_si_1d(ji) 
     672         sm_i_b(ji) = sm_i_b(ji) + dsm_i_se_1d(ji) + dsm_i_si_1d(ji) 
    706673      END DO !ji 
    707674 
    708675      ! Recover temperature 
    709676      DO jk = 1, nlay_i 
    710  
    711          DO ji = kideb, kiut 
    712  
     677         DO ji = kideb, kiut 
    713678            ztmelts    =  -tmut*s_i_b(ji,jk) + rtt 
    714679            !Conversion q(S,T) -> T (second order equation) 
    715680            zaaa         =  cpic 
    716             zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + & 
    717                q_i_b(ji,jk) / rhoic - lfus 
     681            zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus 
    718682            zccc         =  lfus * ( ztmelts - rtt ) 
    719683            zdiscrim     =  SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) ) 
    720             t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / &  
    721                ( 2.0 *zaaa ) 
     684            t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2.0 *zaaa ) 
    722685         END DO !ji 
    723686 
    724687      END DO !jk 
    725  
     688      ! 
     689      IF( wrk_not_released(1, 1,2,3,4,5,6,7,8) )   CALL ctl_stop( 'lim_thd_ent : failed to release workspace arrays' ) 
     690      ! 
    726691   END SUBROUTINE lim_thd_ent 
    727692 
    728693#else 
    729    !!====================================================================== 
    730    !!                       ***  MODULE limthd_ent   *** 
    731    !!                             no sea ice model 
    732    !!====================================================================== 
     694   !!---------------------------------------------------------------------- 
     695   !!   Default option                               NO  LIM3 sea-ice model 
     696   !!---------------------------------------------------------------------- 
    733697CONTAINS 
    734698   SUBROUTINE lim_thd_ent          ! Empty routine 
    735699   END SUBROUTINE lim_thd_ent 
    736700#endif 
     701 
     702   !!====================================================================== 
    737703END MODULE limthd_ent 
Note: See TracChangeset for help on using the changeset viewer.