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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r5541 r6808  
    2828   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    2929   USE wrk_nemo         ! work arrays 
     30   USE fldread          ! read input fields 
     31   USE iom 
    3032 
    3133   IMPLICIT NONE 
     
    4749   REAL(wp) ::   rn_tmi_ini_s   ! initial temperature 
    4850 
    49    LOGICAL  ::  ln_iceini    ! initialization or not 
     51   INTEGER , PARAMETER ::   jpfldi = 6           ! maximum number of files to read 
     52   INTEGER , PARAMETER ::   jp_hti = 1           ! index of ice thickness (m)    at T-point 
     53   INTEGER , PARAMETER ::   jp_hts = 2           ! index of snow thicknes (m)    at T-point 
     54   INTEGER , PARAMETER ::   jp_ati = 3           ! index of ice fraction (%) at T-point 
     55   INTEGER , PARAMETER ::   jp_tsu = 4           ! index of ice surface temp (K)    at T-point 
     56   INTEGER , PARAMETER ::   jp_tmi = 5           ! index of ice temp at T-point 
     57   INTEGER , PARAMETER ::   jp_smi = 6           ! index of ice sali at T-point 
     58   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   si    ! structure of input fields (file informations, fields read) 
     59 
     60   LOGICAL  ::  ln_iceini        ! initialization or not 
     61   LOGICAL  ::  ln_iceini_file   ! Ice initialization state from 2D netcdf file 
    5062   !!---------------------------------------------------------------------- 
    5163   !!   LIM 3.0,  UCL-LOCEAN-IPSL (2008) 
     
    88100      REAL(wp)   :: ztmelts, zdh 
    89101      INTEGER    :: i_hemis, i_fill, jl0   
    90       REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv 
    91       REAL(wp), POINTER, DIMENSION(:)     :: zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini 
    92       REAL(wp), POINTER, DIMENSION(:,:)   :: zh_i_ini, za_i_ini, zv_i_ini 
     102      REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv  
    93103      REAL(wp), POINTER, DIMENSION(:,:)   :: zswitch    ! ice indicator 
    94       INTEGER,  POINTER, DIMENSION(:,:)   :: zhemis   ! hemispheric index 
    95       !-------------------------------------------------------------------- 
    96  
    97       CALL wrk_alloc( jpi, jpj, zswitch ) 
    98       CALL wrk_alloc( jpi, jpj, zhemis ) 
    99       CALL wrk_alloc( jpl,   2, zh_i_ini,  za_i_ini,  zv_i_ini ) 
    100       CALL wrk_alloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     104      REAL(wp), POINTER, DIMENSION(:,:)   :: zht_i_ini, zat_i_ini, zvt_i_ini            !data from namelist or nc file 
     105      REAL(wp), POINTER, DIMENSION(:,:)   :: zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file 
     106      REAL(wp), POINTER, DIMENSION(:,:,:) :: zh_i_ini, za_i_ini, zv_i_ini               !data by cattegories to fill 
     107      !-------------------------------------------------------------------- 
     108 
     109      CALL wrk_alloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
     110      CALL wrk_alloc( jpi, jpj,      zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     111      CALL wrk_alloc( jpi, jpj,      zswitch ) 
    101112 
    102113      IF(lwp) WRITE(numout,*) 
     
    120131      t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1)  
    121132 
     133 
    122134      IF( ln_iceini ) THEN 
    123135 
    124       !-------------------------------------------------------------------- 
    125       ! 2) Basal temperature, ice mask and hemispheric index 
    126       !-------------------------------------------------------------------- 
    127  
    128       DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
    129          DO ji = 1, jpi 
    130             IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN  
    131                zswitch(ji,jj) = 0._wp * tmask(ji,jj,1)    ! no ice 
    132             ELSE                                                                                    
    133                zswitch(ji,jj) = 1._wp * tmask(ji,jj,1)    !    ice 
    134             ENDIF 
     136         !-------------------------------------------------------------------- 
     137         ! 2) Basal temperature, ice mask and hemispheric index 
     138         !-------------------------------------------------------------------- 
     139 
     140         DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
     141            DO ji = 1, jpi 
     142               IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN  
     143                  zswitch(ji,jj) = 0._wp * tmask(ji,jj,1)    ! no ice 
     144               ELSE                                                                                    
     145                  zswitch(ji,jj) = 1._wp * tmask(ji,jj,1)    !    ice 
     146               ENDIF 
     147            END DO 
    135148         END DO 
    136       END DO 
    137  
    138  
    139       ! Hemispheric index 
    140       DO jj = 1, jpj 
    141          DO ji = 1, jpi 
    142             IF( fcor(ji,jj) >= 0._wp ) THEN     
    143                zhemis(ji,jj) = 1 ! Northern hemisphere 
    144             ELSE 
    145                zhemis(ji,jj) = 2 ! Southern hemisphere 
    146             ENDIF 
    147          END DO 
    148       END DO 
    149  
    150       !-------------------------------------------------------------------- 
    151       ! 3) Initialization of sea ice state variables 
    152       !-------------------------------------------------------------------- 
    153  
    154       !----------------------------- 
    155       ! 3.1) Hemisphere-dependent arrays 
    156       !----------------------------- 
    157       ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array 
    158       zht_i_ini(1) = rn_hti_ini_n ; zht_i_ini(2) = rn_hti_ini_s  ! ice thickness 
    159       zht_s_ini(1) = rn_hts_ini_n ; zht_s_ini(2) = rn_hts_ini_s  ! snow depth 
    160       zat_i_ini(1) = rn_ati_ini_n ; zat_i_ini(2) = rn_ati_ini_s  ! ice concentration 
    161       zsm_i_ini(1) = rn_smi_ini_n ; zsm_i_ini(2) = rn_smi_ini_s  ! bulk ice salinity 
    162       ztm_i_ini(1) = rn_tmi_ini_n ; ztm_i_ini(2) = rn_tmi_ini_s  ! temperature (ice and snow) 
    163  
    164       zvt_i_ini(:) = zht_i_ini(:) * zat_i_ini(:)   ! ice volume 
    165  
    166       !--------------------------------------------------------------------- 
    167       ! 3.2) Distribute ice concentration and thickness into the categories 
    168       !--------------------------------------------------------------------- 
    169       ! a gaussian distribution for ice concentration is used 
    170       ! then we check whether the distribution fullfills 
    171       ! volume and area conservation, positivity and ice categories bounds 
    172       DO i_hemis = 1, 2 
    173  
    174       ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 
    175  
    176       ! note for the great nemo engineers:  
    177       ! only very few of the WRITE statements are necessary for the reference version 
    178       ! they were one day useful, but now i personally doubt of their 
    179       ! potential for bringing anything useful 
    180  
    181       DO i_fill = jpl, 1, -1 
    182          IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN 
    183             !---------------------------- 
    184             ! fill the i_fill categories 
    185             !---------------------------- 
    186             ! *** 1 category to fill 
    187             IF ( i_fill .EQ. 1 ) THEN 
    188                zh_i_ini(1,i_hemis)       = zht_i_ini(i_hemis) 
    189                za_i_ini(1,i_hemis)       = zat_i_ini(i_hemis) 
    190                zh_i_ini(2:jpl,i_hemis)   = 0._wp 
    191                za_i_ini(2:jpl,i_hemis)   = 0._wp 
    192             ELSE 
    193  
    194                ! *** >1 categores to fill 
    195                !--- Ice thicknesses in the i_fill - 1 first categories 
    196                DO jl = 1, i_fill - 1 
    197                   zh_i_ini(jl,i_hemis) = hi_mean(jl) 
    198                END DO 
    199                 
    200                !--- jl0: most likely index where cc will be maximum 
    201                DO jl = 1, jpl 
    202                   IF ( ( zht_i_ini(i_hemis) >  hi_max(jl-1) ) .AND. & 
    203                      & ( zht_i_ini(i_hemis) <= hi_max(jl)   ) ) THEN 
    204                      jl0 = jl 
     149 
     150         !-------------------------------------------------------------------- 
     151         ! 3) Initialization of sea ice state variables 
     152         !-------------------------------------------------------------------- 
     153         IF( ln_iceini_file )THEN 
     154 
     155            zht_i_ini(:,:)  = si(jp_hti)%fnow(:,:,1) 
     156            zht_s_ini(:,:)  = si(jp_hts)%fnow(:,:,1) 
     157            zat_i_ini(:,:)  = si(jp_ati)%fnow(:,:,1) 
     158            zts_u_ini(:,:)  = si(jp_tsu)%fnow(:,:,1) 
     159            ztm_i_ini(:,:)  = si(jp_tmi)%fnow(:,:,1) 
     160            zsm_i_ini(:,:)  = si(jp_smi)%fnow(:,:,1) 
     161 
     162         ELSE ! ln_iceini_file = F 
     163 
     164            !----------------------------- 
     165            ! 3.1) Hemisphere-dependent arrays 
     166            !----------------------------- 
     167            ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array 
     168            DO jj = 1, jpj 
     169               DO ji = 1, jpi 
     170                  IF( fcor(ji,jj) >= 0._wp ) THEN 
     171                     zht_i_ini(ji,jj) = rn_hti_ini_n 
     172                     zht_s_ini(ji,jj) = rn_hts_ini_n 
     173                     zat_i_ini(ji,jj) = rn_ati_ini_n 
     174                     zts_u_ini(ji,jj) = rn_tmi_ini_n 
     175                     zsm_i_ini(ji,jj) = rn_smi_ini_n 
     176                     ztm_i_ini(ji,jj) = rn_tmi_ini_n 
     177                  ELSE 
     178                     zht_i_ini(ji,jj) = rn_hti_ini_s 
     179                     zht_s_ini(ji,jj) = rn_hts_ini_s 
     180                     zat_i_ini(ji,jj) = rn_ati_ini_s 
     181                     zts_u_ini(ji,jj) = rn_tmi_ini_s 
     182                     zsm_i_ini(ji,jj) = rn_smi_ini_s 
     183                     ztm_i_ini(ji,jj) = rn_tmi_ini_s 
    205184                  ENDIF 
    206185               END DO 
    207                jl0 = MIN(jl0, i_fill) 
    208                 
    209                !--- Concentrations 
    210                za_i_ini(jl0,i_hemis)      = zat_i_ini(i_hemis) / SQRT(REAL(jpl)) 
    211                DO jl = 1, i_fill - 1 
    212                   IF ( jl .NE. jl0 ) THEN 
    213                      zsigma               = 0.5 * zht_i_ini(i_hemis) 
    214                      zarg                 = ( zh_i_ini(jl,i_hemis) - zht_i_ini(i_hemis) ) / zsigma 
    215                      za_i_ini(jl,i_hemis) = za_i_ini(jl0,i_hemis) * EXP(-zarg**2) 
    216                   ENDIF 
    217                END DO 
    218                 
    219                zA = 0. ! sum of the areas in the jpl categories  
    220                DO jl = 1, i_fill - 1 
    221                  zA = zA + za_i_ini(jl,i_hemis) 
    222                END DO 
    223                za_i_ini(i_fill,i_hemis)   = zat_i_ini(i_hemis) - zA ! ice conc in the last category 
    224                IF ( i_fill .LT. jpl ) za_i_ini(i_fill+1:jpl, i_hemis) = 0._wp 
    225           
    226                !--- Ice thickness in the last category 
    227                zV = 0. ! sum of the volumes of the N-1 categories 
    228                DO jl = 1, i_fill - 1 
    229                   zV = zV + za_i_ini(jl,i_hemis)*zh_i_ini(jl,i_hemis) 
    230                END DO 
    231                zh_i_ini(i_fill,i_hemis) = ( zvt_i_ini(i_hemis) - zV ) / za_i_ini(i_fill,i_hemis)  
    232                IF ( i_fill .LT. jpl ) zh_i_ini(i_fill+1:jpl, i_hemis) = 0._wp 
    233  
    234                !--- volumes 
    235                zv_i_ini(:,i_hemis) = za_i_ini(:,i_hemis) * zh_i_ini(:,i_hemis) 
    236                IF ( i_fill .LT. jpl ) zv_i_ini(i_fill+1:jpl, i_hemis) = 0._wp 
    237  
    238             ENDIF ! i_fill 
    239  
    240             !--------------------- 
    241             ! Compatibility tests 
    242             !--------------------- 
    243             ! Test 1: area conservation 
    244             zA_cons = SUM(za_i_ini(:,i_hemis)) ; zconv = ABS(zat_i_ini(i_hemis) - zA_cons ) 
    245             IF ( zconv .LT. 1.0e-6 ) THEN 
    246                ztest_1 = 1 
    247             ELSE  
    248               ! this write is useful 
    249               IF(lwp)  WRITE(numout,*) ' * TEST1 AREA NOT CONSERVED *** zA_cons = ', zA_cons,' zat_i_ini = ',zat_i_ini(i_hemis)  
    250                ztest_1 = 0 
    251             ENDIF 
    252  
    253             ! Test 2: volume conservation 
    254             zV_cons = SUM(zv_i_ini(:,i_hemis)) 
    255             zconv = ABS(zvt_i_ini(i_hemis) - zV_cons) 
    256  
    257             IF ( zconv .LT. 1.0e-6 ) THEN 
    258                ztest_2 = 1 
    259             ELSE 
    260               ! this write is useful 
    261               IF(lwp)  WRITE(numout,*) ' * TEST2 VOLUME NOT CONSERVED *** zV_cons = ', zV_cons, & 
    262                             ' zvt_i_ini = ', zvt_i_ini(i_hemis) 
    263                ztest_2 = 0 
    264             ENDIF 
    265  
    266             ! Test 3: thickness of the last category is in-bounds ? 
    267             IF ( zh_i_ini(i_fill, i_hemis) > hi_max(i_fill-1) ) THEN 
    268                ztest_3 = 1 
    269             ELSE 
    270                ! this write is useful 
    271                IF(lwp) WRITE(numout,*) ' * TEST 3 THICKNESS OF THE LAST CATEGORY OUT OF BOUNDS *** zh_i_ini(i_fill,i_hemis) = ', & 
    272                zh_i_ini(i_fill,i_hemis), ' hi_max(jpl-1) = ', hi_max(i_fill-1) 
    273                ztest_3 = 0 
    274             ENDIF 
    275  
    276             ! Test 4: positivity of ice concentrations 
    277             ztest_4 = 1 
    278             DO jl = 1, jpl 
    279                IF ( za_i_ini(jl,i_hemis) .LT. 0._wp ) THEN  
    280                   ! this write is useful 
    281                   IF(lwp) WRITE(numout,*) ' * TEST 4 POSITIVITY NOT OK FOR CAT ', jl, ' WITH A = ', za_i_ini(jl,i_hemis) 
    282                   ztest_4 = 0 
    283                ENDIF 
    284             END DO 
    285  
    286          ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 
    287   
    288          ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 
    289  
    290       END DO ! i_fill 
    291  
    292       IF(lwp) THEN  
    293          WRITE(numout,*) ' ztests : ', ztests 
    294          IF ( ztests .NE. 4 ) THEN 
    295             WRITE(numout,*) 
    296             WRITE(numout,*) ' !!!! ALERT                  !!! ' 
    297             WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
    298             WRITE(numout,*) 
    299             WRITE(numout,*) ' *** ztests is not equal to 4 ' 
    300             WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
    301             WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(i_hemis) 
    302             WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(i_hemis) 
    303          ENDIF ! ztests .NE. 4 
    304       ENDIF 
    305        
    306       END DO ! i_hemis 
    307  
    308       !--------------------------------------------------------------------- 
    309       ! 3.3) Space-dependent arrays for ice state variables 
    310       !--------------------------------------------------------------------- 
    311  
    312       ! Ice concentration, thickness and volume, ice salinity, ice age, surface temperature 
    313       DO jl = 1, jpl ! loop over categories 
     186            END DO 
     187 
     188         ENDIF ! ln_iceini_file 
     189 
     190         zvt_i_ini(:,:) = zht_i_ini(:,:) * zat_i_ini(:,:)   ! ice volume 
     191 
     192         !--------------------------------------------------------------------- 
     193         ! 3.2) Distribute ice concentration and thickness into the categories 
     194         !--------------------------------------------------------------------- 
     195         ! a gaussian distribution for ice concentration is used 
     196         ! then we check whether the distribution fullfills 
     197         ! volume and area conservation, positivity and ice categories bounds 
     198         zh_i_ini(:,:,:) = 0._wp  
     199         za_i_ini(:,:,:) = 0._wp 
     200         zv_i_ini(:,:,:) = 0._wp 
     201 
    314202         DO jj = 1, jpj 
    315203            DO ji = 1, jpi 
    316                a_i(ji,jj,jl)   = zswitch(ji,jj) * za_i_ini (jl,zhemis(ji,jj))  ! concentration 
    317                ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(jl,zhemis(ji,jj))   ! ice thickness 
    318                ht_s(ji,jj,jl)  = ht_i(ji,jj,jl) * ( zht_s_ini( zhemis(ji,jj) ) / zht_i_ini( zhemis(ji,jj) ) )  ! snow depth 
    319                sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj))     ! salinity 
    320                o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp                        ! age (1 day) 
    321                t_su(ji,jj,jl)  = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0 ! surf temp 
    322  
    323                ! This case below should not be used if (ht_s/ht_i) is ok in namelist 
    324                ! In case snow load is in excess that would lead to transformation from snow to ice 
    325                ! Then, transfer the snow excess into the ice (different from limthd_dh) 
    326                zdh = MAX( 0._wp, ( rhosn * ht_s(ji,jj,jl) + ( rhoic - rau0 ) * ht_i(ji,jj,jl) ) * r1_rau0 )  
    327                ! recompute ht_i, ht_s avoiding out of bounds values 
    328                ht_i(ji,jj,jl) = MIN( hi_max(jl), ht_i(ji,jj,jl) + zdh ) 
    329                ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic * r1_rhosn ) 
    330  
    331                ! ice volume, salt content, age content 
    332                v_i(ji,jj,jl)   = ht_i(ji,jj,jl) * a_i(ji,jj,jl)              ! ice volume 
    333                v_s(ji,jj,jl)   = ht_s(ji,jj,jl) * a_i(ji,jj,jl)              ! snow volume 
    334                smv_i(ji,jj,jl) = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) ! salt content 
    335                oa_i(ji,jj,jl)  = o_i(ji,jj,jl) * a_i(ji,jj,jl)               ! age content 
    336             END DO 
    337          END DO 
    338       END DO 
    339  
    340       ! Snow temperature and heat content 
    341       DO jk = 1, nlay_s 
     204 
     205               IF( zat_i_ini(ji,jj) > 0._wp .AND. zht_i_ini(ji,jj) > 0._wp )THEN 
     206 
     207                  ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 
     208!                  ztests  = 0  
     209 
     210                  DO i_fill = jpl, 1, -1 
     211 
     212!                     IF( ztests .NE. 4 ) THEN 
     213                     IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN 
     214                        !---------------------------- 
     215                        ! fill the i_fill categories 
     216                        !---------------------------- 
     217                        ! *** 1 category to fill 
     218                        IF ( i_fill .EQ. 1 ) THEN 
     219                           zh_i_ini(ji,jj,    1)   = zht_i_ini(ji,jj) 
     220                           za_i_ini(ji,jj,    1)   = zat_i_ini(ji,jj) 
     221                           zh_i_ini(ji,jj,2:jpl)   = 0._wp 
     222                           za_i_ini(ji,jj,2:jpl)   = 0._wp 
     223                        ELSE 
     224 
     225                           ! *** >1 categores to fill 
     226                           !--- Ice thicknesses in the i_fill - 1 first categories 
     227                           DO jl = 1, i_fill - 1 
     228                              zh_i_ini(ji,jj,jl) = hi_mean(jl) 
     229                           END DO 
     230                
     231                           !--- jl0: most likely index where cc will be maximum 
     232                           DO jl = 1, jpl 
     233                              IF ( ( zht_i_ini(ji,jj) >  hi_max(jl-1) ) .AND. & 
     234                                 & ( zht_i_ini(ji,jj) <= hi_max(jl)   ) ) THEN 
     235                                 jl0 = jl 
     236                              ENDIF 
     237                           END DO 
     238                           jl0 = MIN(jl0, i_fill) 
     239                
     240                           !--- Concentrations 
     241                           za_i_ini(ji,jj,jl0) = zat_i_ini(ji,jj) / SQRT(REAL(jpl)) 
     242                           DO jl = 1, i_fill - 1 
     243                              IF( jl .NE. jl0 )THEN 
     244                                 zsigma             = 0.5 * zht_i_ini(ji,jj) 
     245                                 zarg               = ( zh_i_ini(ji,jj,jl) - zht_i_ini(ji,jj) ) / zsigma 
     246                                 za_i_ini(ji,jj,jl) = za_i_ini(ji,jj,jl0) * EXP(-zarg**2) 
     247                              ENDIF 
     248                           END DO 
     249                
     250                           zA = 0. ! sum of the areas in the jpl categories  
     251                           DO jl = 1, i_fill - 1 
     252                              zA = zA + za_i_ini(ji,jj,jl) 
     253                           END DO 
     254                           za_i_ini(ji,jj,i_fill)   = zat_i_ini(ji,jj) - zA ! ice conc in the last category 
     255                           IF ( i_fill .LT. jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     256          
     257                           !--- Ice thickness in the last category 
     258                           zV = 0. ! sum of the volumes of the N-1 categories 
     259                           DO jl = 1, i_fill - 1 
     260                              zV = zV + za_i_ini(ji,jj,jl)*zh_i_ini(ji,jj,jl) 
     261                           END DO 
     262                           zh_i_ini(ji,jj,i_fill) = ( zvt_i_ini(ji,jj) - zV ) / za_i_ini(ji,jj,i_fill)  
     263                           IF ( i_fill .LT. jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     264 
     265                           !--- volumes 
     266                           zv_i_ini(ji,jj,:) = za_i_ini(ji,jj,:) * zh_i_ini(ji,jj,:) 
     267                           IF ( i_fill .LT. jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     268 
     269                        ENDIF ! i_fill 
     270 
     271                        !--------------------- 
     272                        ! Compatibility tests 
     273                        !--------------------- 
     274                        ! Test 1: area conservation 
     275                        zA_cons = SUM(za_i_ini(ji,jj,:)) ; zconv = ABS(zat_i_ini(ji,jj) - zA_cons ) 
     276                        IF ( zconv .LT. 1.0e-6 ) THEN 
     277                           ztest_1 = 1 
     278                        ELSE  
     279                          !this write is useful 
     280                          IF(lwp)  WRITE(numout,*) ' * TEST1 AREA NOT CONSERVED *** zA_cons = ', zA_cons,' zat_i_ini = ',zat_i_ini(ji,jj)  
     281                          ztest_1 = 0 
     282                        ENDIF 
     283 
     284                        ! Test 2: volume conservation 
     285                        zV_cons = SUM(zv_i_ini(ji,jj,:)) 
     286                        zconv = ABS(zvt_i_ini(ji,jj) - zV_cons) 
     287 
     288                        IF( zconv .LT. 1.0e-6 ) THEN 
     289                           ztest_2 = 1 
     290                        ELSE 
     291                           !this write is useful 
     292                           IF(lwp)  WRITE(numout,*) ' * TEST2 VOLUME NOT CONSERVED *** zV_cons = ', zV_cons, & 
     293                                                    ' zvt_i_ini = ', zvt_i_ini(ji,jj) 
     294                           ztest_2 = 0 
     295                        ENDIF 
     296 
     297                        ! Test 3: thickness of the last category is in-bounds ? 
     298                        IF ( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN 
     299                           ztest_3 = 1 
     300                        ELSE 
     301                           ! this write is useful 
     302                           IF(lwp) WRITE(numout,*) ' * TEST 3 THICKNESS OF THE LAST CATEGORY OUT OF BOUNDS *** zh_i_ini(ji,jj,i_fill) = ', & 
     303                           zh_i_ini(ji,jj,i_fill), ' hi_max(jpl-1) = ', hi_max(i_fill-1) 
     304                           IF(lwp) WRITE(numout,*) ' ji,jj,i_fill ',ji,jj,i_fill 
     305                           IF(lwp) WRITE(numout,*) 'zht_i_ini ',zht_i_ini(ji,jj) 
     306                           ztest_3 = 0 
     307                        ENDIF 
     308 
     309                        ! Test 4: positivity of ice concentrations 
     310                        ztest_4 = 1 
     311                        DO jl = 1, jpl 
     312                           IF ( za_i_ini(ji,jj,jl) .LT. 0._wp ) THEN  
     313                              ! this write is useful 
     314                              IF(lwp) WRITE(numout,*) ' * TEST 4 POSITIVITY NOT OK FOR CAT ', jl, ' WITH A = ', za_i_ini(ji,jj,jl) 
     315                              ztest_4 = 0 
     316                           ENDIF 
     317                        END DO 
     318 
     319                     ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 
     320  
     321                     ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 
     322 
     323                  END DO ! i_fill 
     324 
     325                  IF(lwp) THEN  
     326                     WRITE(numout,*) ' ztests : ', ztests 
     327                     IF( ztests .NE. 4 )THEN 
     328                        WRITE(numout,*) 
     329                        WRITE(numout,*) ' !!!! ALERT                  !!! ' 
     330                        WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
     331                        WRITE(numout,*) 
     332                        WRITE(numout,*) ' *** ztests is not equal to 4 ' 
     333                        WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
     334                        WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(ji,jj) 
     335                        WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(ji,jj) 
     336                     ENDIF ! ztests .NE. 4 
     337                  ENDIF 
     338       
     339               ENDIF !  zat_i_ini(ji,jj) > 0._wp .AND. zhm_i_ini(ji,jj) > 0._wp 
     340 
     341            ENDDO    
     342         ENDDO    
     343 
     344         !--------------------------------------------------------------------- 
     345         ! 3.3) Space-dependent arrays for ice state variables 
     346         !--------------------------------------------------------------------- 
     347 
     348         ! Ice concentration, thickness and volume, ice salinity, ice age, surface temperature 
    342349         DO jl = 1, jpl ! loop over categories 
    343350            DO jj = 1, jpj 
    344351               DO ji = 1, jpi 
    345                    t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0 
    346                    ! Snow energy of melting 
    347                    e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rt0 - t_s(ji,jj,jk,jl) ) + lfus ) 
    348  
    349                    ! Mutliply by volume, and divide by number of layers to get heat content in J/m2 
    350                    e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * v_s(ji,jj,jl) * r1_nlay_s 
     352                  a_i(ji,jj,jl)   = zswitch(ji,jj) * za_i_ini(ji,jj,jl)                       ! concentration 
     353                  ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(ji,jj,jl)                       ! ice thickness 
     354                  sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(ji,jj)                         ! salinity 
     355                  o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp                                    ! age (1 day) 
     356                  t_su(ji,jj,jl)  = zswitch(ji,jj) * zts_u_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rt0 ! surf temp 
     357 
     358                  IF( zht_i_ini(ji,jj) > 0._wp )THEN 
     359                    ht_s(ji,jj,jl)= ht_i(ji,jj,jl) * ( zht_s_ini(ji,jj) / zht_i_ini(ji,jj) )  ! snow depth 
     360                  ELSE 
     361                    ht_s(ji,jj,jl)= 0._wp 
     362                  ENDIF 
     363 
     364                  ! This case below should not be used if (ht_s/ht_i) is ok in namelist 
     365                  ! In case snow load is in excess that would lead to transformation from snow to ice 
     366                  ! Then, transfer the snow excess into the ice (different from limthd_dh) 
     367                  zdh = MAX( 0._wp, ( rhosn * ht_s(ji,jj,jl) + ( rhoic - rau0 ) * ht_i(ji,jj,jl) ) * r1_rau0 )  
     368                  ! recompute ht_i, ht_s avoiding out of bounds values 
     369                  ht_i(ji,jj,jl) = MIN( hi_max(jl), ht_i(ji,jj,jl) + zdh ) 
     370                  ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic * r1_rhosn ) 
     371 
     372                  ! ice volume, salt content, age content 
     373                  v_i(ji,jj,jl)   = ht_i(ji,jj,jl) * a_i(ji,jj,jl)              ! ice volume 
     374                  v_s(ji,jj,jl)   = ht_s(ji,jj,jl) * a_i(ji,jj,jl)              ! snow volume 
     375                  smv_i(ji,jj,jl) = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) ! salt content 
     376                  oa_i(ji,jj,jl)  = o_i(ji,jj,jl) * a_i(ji,jj,jl)               ! age content 
    351377               END DO 
    352378            END DO 
    353379         END DO 
    354       END DO 
    355  
    356       ! Ice salinity, temperature and heat content 
    357       DO jk = 1, nlay_i 
    358          DO jl = 1, jpl ! loop over categories 
    359             DO jj = 1, jpj 
    360                DO ji = 1, jpi 
    361                    t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0  
    362                    s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * rn_simin 
    363                    ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rt0 !Melting temperature in K 
    364  
    365                    ! heat content per unit volume 
    366                    e_i(ji,jj,jk,jl) = zswitch(ji,jj) * rhoic * (   cpic    * ( ztmelts - t_i(ji,jj,jk,jl) ) & 
    367                       +   lfus    * ( 1._wp - (ztmelts-rt0) / MIN((t_i(ji,jj,jk,jl)-rt0),-epsi20) ) & 
    368                       -   rcp     * ( ztmelts - rt0 ) ) 
    369  
    370                    ! Mutliply by ice volume, and divide by number of layers to get heat content in J/m2 
    371                    e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * v_i(ji,jj,jl) * r1_nlay_i 
     380 
     381         ! Snow temperature and heat content 
     382         DO jk = 1, nlay_s 
     383            DO jl = 1, jpl ! loop over categories 
     384               DO jj = 1, jpj 
     385                  DO ji = 1, jpi 
     386                     t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rt0 
     387                     ! Snow energy of melting 
     388                     e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rt0 - t_s(ji,jj,jk,jl) ) + lfus ) 
     389 
     390                     ! Mutliply by volume, and divide by number of layers to get heat content in J/m2 
     391                     e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * v_s(ji,jj,jl) * r1_nlay_s 
     392                  END DO 
    372393               END DO 
    373394            END DO 
    374395         END DO 
    375       END DO 
    376  
    377       tn_ice (:,:,:) = t_su (:,:,:) 
    378  
    379       ELSE  
    380          ! if ln_iceini=false 
     396 
     397         ! Ice salinity, temperature and heat content 
     398         DO jk = 1, nlay_i 
     399            DO jl = 1, jpl ! loop over categories 
     400               DO jj = 1, jpj 
     401                  DO ji = 1, jpi 
     402                     t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rt0  
     403                     s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rn_simin 
     404                     ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rt0 !Melting temperature in K 
     405 
     406                     ! heat content per unit volume 
     407                     e_i(ji,jj,jk,jl) = zswitch(ji,jj) * rhoic * (   cpic    * ( ztmelts - t_i(ji,jj,jk,jl) ) & 
     408                        +   lfus    * ( 1._wp - (ztmelts-rt0) / MIN((t_i(ji,jj,jk,jl)-rt0),-epsi20) ) & 
     409                        -   rcp     * ( ztmelts - rt0 ) ) 
     410 
     411                     ! Mutliply by ice volume, and divide by number of layers to get heat content in J/m2 
     412                     e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * v_i(ji,jj,jl) * r1_nlay_i 
     413                  END DO 
     414               END DO 
     415            END DO 
     416         END DO 
     417 
     418         tn_ice (:,:,:) = t_su (:,:,:) 
     419 
     420      ELSE ! if ln_iceini=false 
    381421         a_i  (:,:,:) = 0._wp 
    382422         v_i  (:,:,:) = 0._wp 
     
    400440            END DO 
    401441         END DO 
    402        
     442 
    403443      ENDIF ! ln_iceini 
    404444       
     
    452492 
    453493 
    454       CALL wrk_dealloc( jpi, jpj, zswitch ) 
    455       CALL wrk_dealloc( jpi, jpj, zhemis ) 
    456       CALL wrk_dealloc( jpl,   2, zh_i_ini,  za_i_ini,  zv_i_ini ) 
    457       CALL wrk_dealloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     494      CALL wrk_dealloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
     495      CALL wrk_dealloc( jpi, jpj,      zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     496      CALL wrk_dealloc( jpi, jpj,      zswitch ) 
    458497 
    459498   END SUBROUTINE lim_istate 
     
    475514      !!  8.5  ! 07-11 (M. Vancoppenolle) rewritten initialization 
    476515      !!----------------------------------------------------------------------------- 
    477       NAMELIST/namiceini/ ln_iceini, rn_thres_sst, rn_hts_ini_n, rn_hts_ini_s, rn_hti_ini_n, rn_hti_ini_s,  & 
    478          &                                      rn_ati_ini_n, rn_ati_ini_s, rn_smi_ini_n, rn_smi_ini_s, rn_tmi_ini_n, rn_tmi_ini_s 
    479       INTEGER :: ios                 ! Local integer output status for namelist read 
     516      ! 
     517      INTEGER :: ios,ierr,inum_ice                 ! Local integer output status for namelist read 
     518      INTEGER :: ji,jj 
     519      INTEGER :: ifpr, ierror 
     520      ! 
     521      CHARACTER(len=100) ::  cn_dir          ! Root directory for location of ice files 
     522      TYPE(FLD_N)                    ::   sn_hti, sn_hts, sn_ati, sn_tsu, sn_tmi, sn_smi 
     523      TYPE(FLD_N), DIMENSION(jpfldi) ::   slf_i                 ! array of namelist informations on the fields to read 
     524      ! 
     525      NAMELIST/namiceini/ ln_iceini, ln_iceini_file, rn_thres_sst, rn_hts_ini_n, rn_hts_ini_s,  & 
     526         &                rn_hti_ini_n, rn_hti_ini_s, rn_ati_ini_n, rn_ati_ini_s, rn_smi_ini_n, & 
     527         &                rn_smi_ini_s, rn_tmi_ini_n, rn_tmi_ini_s,                             & 
     528         &                sn_hti, sn_hts, sn_ati, sn_tsu, sn_tmi, sn_smi, cn_dir 
    480529      !!----------------------------------------------------------------------------- 
    481530      ! 
     
    489538      IF(lwm) WRITE ( numoni, namiceini ) 
    490539 
     540      slf_i(jp_hti) = sn_hti  ;  slf_i(jp_hts) = sn_hts 
     541      slf_i(jp_ati) = sn_ati  ;  slf_i(jp_tsu) = sn_tsu 
     542      slf_i(jp_tmi) = sn_tmi  ;  slf_i(jp_smi) = sn_smi 
     543 
    491544      ! Define the initial parameters 
    492545      ! ------------------------- 
     
    497550         WRITE(numout,*) '~~~~~~~~~~~~~~~' 
    498551         WRITE(numout,*) '   initialization with ice (T) or not (F)       ln_iceini     = ', ln_iceini 
     552         WRITE(numout,*) '   ice initialization from a netcdf file      ln_iceini_file  = ', ln_iceini_file 
    499553         WRITE(numout,*) '   threshold water temp. for initial sea-ice    rn_thres_sst  = ', rn_thres_sst 
    500554         WRITE(numout,*) '   initial snow thickness in the north          rn_hts_ini_n  = ', rn_hts_ini_n 
     
    510564      ENDIF 
    511565 
     566      IF( ln_iceini_file ) THEN                      ! Ice initialization using input file 
     567         ! 
     568         ! set si structure 
     569         ALLOCATE( si(jpfldi), STAT=ierror ) 
     570         IF( ierror > 0 ) THEN 
     571            CALL ctl_stop( 'Ice_ini in limistate: unable to allocate si structure' )   ;   RETURN 
     572         ENDIF 
     573 
     574         DO ifpr = 1, jpfldi 
     575            ALLOCATE( si(ifpr)%fnow(jpi,jpj,1) ) 
     576            ALLOCATE( si(ifpr)%fdta(jpi,jpj,1,2) ) 
     577         END DO 
     578 
     579         ! fill si with slf_i and control print 
     580         CALL fld_fill( si, slf_i, cn_dir, 'lim_istate', 'lim istate ini', 'numnam_ice' ) 
     581 
     582         CALL fld_read( nit000, 1, si )                ! input fields provided at the current time-step 
     583 
     584      ENDIF 
     585 
    512586   END SUBROUTINE lim_istate_init 
    513587 
Note: See TracChangeset for help on using the changeset viewer.