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 6515 for branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90 – NEMO

Ignore:
Timestamp:
2016-05-09T16:42:28+02:00 (8 years ago)
Author:
clem
Message:

implement several developments for LIM3: new advection scheme (ultimate-macho, not yet perfect) ; lateral ice melt ; enabling/disabling thermo and dyn with namelist options ; simplifications (including a clarified namelist)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r6469 r6515  
    2929   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3030   USE wrk_nemo         ! work arrays 
     31   USE fldread          ! read input fields 
     32   USE iom 
    3133 
    3234   IMPLICIT NONE 
     
    3537   PUBLIC   lim_istate      ! routine called by lim_init.F90 
    3638 
    37    !                          !!** init namelist (namiceini) ** 
    38    REAL(wp) ::   rn_thres_sst   ! threshold water temperature for initial sea ice 
    39    REAL(wp) ::   rn_hts_ini_n   ! initial snow thickness in the north 
    40    REAL(wp) ::   rn_hts_ini_s   ! initial snow thickness in the south 
    41    REAL(wp) ::   rn_hti_ini_n   ! initial ice thickness in the north 
    42    REAL(wp) ::   rn_hti_ini_s   ! initial ice thickness in the south 
    43    REAL(wp) ::   rn_ati_ini_n   ! initial leads area in the north 
    44    REAL(wp) ::   rn_ati_ini_s   ! initial leads area in the south 
    45    REAL(wp) ::   rn_smi_ini_n   ! initial salinity  
    46    REAL(wp) ::   rn_smi_ini_s   ! initial salinity 
    47    REAL(wp) ::   rn_tmi_ini_n   ! initial temperature 
    48    REAL(wp) ::   rn_tmi_ini_s   ! initial temperature 
    49  
    50    LOGICAL  ::  ln_iceini    ! initialization or not 
     39   INTEGER , PARAMETER ::   jpfldi = 6           ! maximum number of files to read 
     40   INTEGER , PARAMETER ::   jp_hti = 1           ! index of ice thickness (m)    at T-point 
     41   INTEGER , PARAMETER ::   jp_hts = 2           ! index of snow thicknes (m)    at T-point 
     42   INTEGER , PARAMETER ::   jp_ati = 3           ! index of ice fraction (%) at T-point 
     43   INTEGER , PARAMETER ::   jp_tsu = 4           ! index of ice surface temp (K)    at T-point 
     44   INTEGER , PARAMETER ::   jp_tmi = 5           ! index of ice temp at T-point 
     45   INTEGER , PARAMETER ::   jp_smi = 6           ! index of ice sali at T-point 
     46   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   si  ! structure of input fields (file informations, fields read) 
    5147   !!---------------------------------------------------------------------- 
    5248   !!   LIM 3.0,  UCL-LOCEAN-IPSL (2008) 
     
    8985      REAL(wp)   :: ztmelts, zdh 
    9086      INTEGER    :: i_hemis, i_fill, jl0   
    91       REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv 
    92       REAL(wp), POINTER, DIMENSION(:)     :: zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini 
    93       REAL(wp), POINTER, DIMENSION(:,:)   :: zh_i_ini, za_i_ini, zv_i_ini 
     87      REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv  
    9488      REAL(wp), POINTER, DIMENSION(:,:)   :: zswitch    ! ice indicator 
    95       INTEGER,  POINTER, DIMENSION(:,:)   :: zhemis   ! hemispheric index 
    96       !-------------------------------------------------------------------- 
    97  
    98       CALL wrk_alloc( jpi, jpj, zswitch ) 
    99       CALL wrk_alloc( jpi, jpj, zhemis ) 
    100       CALL wrk_alloc( jpl,   2, zh_i_ini,  za_i_ini,  zv_i_ini ) 
    101       CALL wrk_alloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     89      REAL(wp), POINTER, DIMENSION(:,:)   :: zht_i_ini, zat_i_ini, zvt_i_ini            !data from namelist or nc file 
     90      REAL(wp), POINTER, DIMENSION(:,:)   :: zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file 
     91      REAL(wp), POINTER, DIMENSION(:,:,:) :: zh_i_ini, za_i_ini, zv_i_ini               !data by cattegories to fill 
     92      !-------------------------------------------------------------------- 
     93 
     94      CALL wrk_alloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
     95      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 ) 
     96      CALL wrk_alloc( jpi, jpj,      zswitch ) 
    10297 
    10398      IF(lwp) WRITE(numout,*) 
     
    121116      t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1)  
    122117 
    123       IF( ln_iceini ) THEN 
    124  
    125       !-------------------------------------------------------------------- 
    126       ! 2) Basal temperature, ice mask and hemispheric index 
    127       !-------------------------------------------------------------------- 
    128  
    129       DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
    130          DO ji = 1, jpi 
    131             IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN  
    132                zswitch(ji,jj) = 0._wp * tmask(ji,jj,1)    ! no ice 
    133             ELSE                                                                                    
    134                zswitch(ji,jj) = 1._wp * tmask(ji,jj,1)    !    ice 
    135             ENDIF 
     118 
     119      IF( ln_limini ) THEN 
     120 
     121         !-------------------------------------------------------------------- 
     122         ! 2) Basal temperature, ice mask and hemispheric index 
     123         !-------------------------------------------------------------------- 
     124 
     125         DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
     126            DO ji = 1, jpi 
     127               IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN  
     128                  zswitch(ji,jj) = 0._wp * tmask(ji,jj,1)    ! no ice 
     129               ELSE                                                                                    
     130                  zswitch(ji,jj) = 1._wp * tmask(ji,jj,1)    !    ice 
     131               ENDIF 
     132            END DO 
    136133         END DO 
    137       END DO 
    138  
    139  
    140       ! Hemispheric index 
    141       DO jj = 1, jpj 
    142          DO ji = 1, jpi 
    143             IF( fcor(ji,jj) >= 0._wp ) THEN     
    144                zhemis(ji,jj) = 1 ! Northern hemisphere 
    145             ELSE 
    146                zhemis(ji,jj) = 2 ! Southern hemisphere 
    147             ENDIF 
    148          END DO 
    149       END DO 
    150  
    151       !-------------------------------------------------------------------- 
    152       ! 3) Initialization of sea ice state variables 
    153       !-------------------------------------------------------------------- 
    154  
    155       !----------------------------- 
    156       ! 3.1) Hemisphere-dependent arrays 
    157       !----------------------------- 
    158       ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array 
    159       zht_i_ini(1) = rn_hti_ini_n ; zht_i_ini(2) = rn_hti_ini_s  ! ice thickness 
    160       zht_s_ini(1) = rn_hts_ini_n ; zht_s_ini(2) = rn_hts_ini_s  ! snow depth 
    161       zat_i_ini(1) = rn_ati_ini_n ; zat_i_ini(2) = rn_ati_ini_s  ! ice concentration 
    162       zsm_i_ini(1) = rn_smi_ini_n ; zsm_i_ini(2) = rn_smi_ini_s  ! bulk ice salinity 
    163       ztm_i_ini(1) = rn_tmi_ini_n ; ztm_i_ini(2) = rn_tmi_ini_s  ! temperature (ice and snow) 
    164  
    165       zvt_i_ini(:) = zht_i_ini(:) * zat_i_ini(:)   ! ice volume 
    166  
    167       !--------------------------------------------------------------------- 
    168       ! 3.2) Distribute ice concentration and thickness into the categories 
    169       !--------------------------------------------------------------------- 
    170       ! a gaussian distribution for ice concentration is used 
    171       ! then we check whether the distribution fullfills 
    172       ! volume and area conservation, positivity and ice categories bounds 
    173       DO i_hemis = 1, 2 
    174  
    175       ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 
    176  
    177       ! note for the great nemo engineers:  
    178       ! only very few of the WRITE statements are necessary for the reference version 
    179       ! they were one day useful, but now i personally doubt of their 
    180       ! potential for bringing anything useful 
    181  
    182       DO i_fill = jpl, 1, -1 
    183          IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN 
    184             !---------------------------- 
    185             ! fill the i_fill categories 
    186             !---------------------------- 
    187             ! *** 1 category to fill 
    188             IF ( i_fill .EQ. 1 ) THEN 
    189                zh_i_ini(1,i_hemis)       = zht_i_ini(i_hemis) 
    190                za_i_ini(1,i_hemis)       = zat_i_ini(i_hemis) 
    191                zh_i_ini(2:jpl,i_hemis)   = 0._wp 
    192                za_i_ini(2:jpl,i_hemis)   = 0._wp 
    193             ELSE 
    194  
    195                ! *** >1 categores to fill 
    196                !--- Ice thicknesses in the i_fill - 1 first categories 
    197                DO jl = 1, i_fill - 1 
    198                   zh_i_ini(jl,i_hemis) = hi_mean(jl) 
    199                END DO 
    200                 
    201                !--- jl0: most likely index where cc will be maximum 
    202                DO jl = 1, jpl 
    203                   IF ( ( zht_i_ini(i_hemis) >  hi_max(jl-1) ) .AND. & 
    204                      & ( zht_i_ini(i_hemis) <= hi_max(jl)   ) ) THEN 
    205                      jl0 = jl 
     134 
     135         !-------------------------------------------------------------------- 
     136         ! 3) Initialization of sea ice state variables 
     137         !-------------------------------------------------------------------- 
     138         IF( ln_limini_file )THEN 
     139 
     140            zht_i_ini(:,:)  = si(jp_hti)%fnow(:,:,1) 
     141            zht_s_ini(:,:)  = si(jp_hts)%fnow(:,:,1) 
     142            zat_i_ini(:,:)  = si(jp_ati)%fnow(:,:,1) 
     143            zts_u_ini(:,:)  = si(jp_tsu)%fnow(:,:,1) 
     144            ztm_i_ini(:,:)  = si(jp_tmi)%fnow(:,:,1) 
     145            zsm_i_ini(:,:)  = si(jp_smi)%fnow(:,:,1) 
     146 
     147         ELSE ! ln_limini_file = F 
     148 
     149            !----------------------------- 
     150            ! 3.1) Hemisphere-dependent arrays 
     151            !----------------------------- 
     152            ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array 
     153            DO jj = 1, jpj 
     154               DO ji = 1, jpi 
     155                  IF( fcor(ji,jj) >= 0._wp ) THEN 
     156                     zht_i_ini(ji,jj) = rn_hti_ini_n 
     157                     zht_s_ini(ji,jj) = rn_hts_ini_n 
     158                     zat_i_ini(ji,jj) = rn_ati_ini_n 
     159                     zts_u_ini(ji,jj) = rn_tmi_ini_n 
     160                     zsm_i_ini(ji,jj) = rn_smi_ini_n 
     161                     ztm_i_ini(ji,jj) = rn_tmi_ini_n 
     162                  ELSE 
     163                     zht_i_ini(ji,jj) = rn_hti_ini_s 
     164                     zht_s_ini(ji,jj) = rn_hts_ini_s 
     165                     zat_i_ini(ji,jj) = rn_ati_ini_s 
     166                     zts_u_ini(ji,jj) = rn_tmi_ini_s 
     167                     zsm_i_ini(ji,jj) = rn_smi_ini_s 
     168                     ztm_i_ini(ji,jj) = rn_tmi_ini_s 
    206169                  ENDIF 
    207170               END DO 
    208                jl0 = MIN(jl0, i_fill) 
    209                 
    210                !--- Concentrations 
    211                za_i_ini(jl0,i_hemis)      = zat_i_ini(i_hemis) / SQRT(REAL(jpl)) 
    212                DO jl = 1, i_fill - 1 
    213                   IF ( jl .NE. jl0 ) THEN 
    214                      zsigma               = 0.5 * zht_i_ini(i_hemis) 
    215                      zarg                 = ( zh_i_ini(jl,i_hemis) - zht_i_ini(i_hemis) ) / zsigma 
    216                      za_i_ini(jl,i_hemis) = za_i_ini(jl0,i_hemis) * EXP(-zarg**2) 
    217                   ENDIF 
    218                END DO 
    219                 
    220                zA = 0. ! sum of the areas in the jpl categories  
    221                DO jl = 1, i_fill - 1 
    222                  zA = zA + za_i_ini(jl,i_hemis) 
    223                END DO 
    224                za_i_ini(i_fill,i_hemis)   = zat_i_ini(i_hemis) - zA ! ice conc in the last category 
    225                IF ( i_fill .LT. jpl ) za_i_ini(i_fill+1:jpl, i_hemis) = 0._wp 
     171            END DO 
     172 
     173         ENDIF ! ln_limini_file 
    226174          
    227                !--- Ice thickness in the last category 
    228                zV = 0. ! sum of the volumes of the N-1 categories 
    229                DO jl = 1, i_fill - 1 
    230                   zV = zV + za_i_ini(jl,i_hemis)*zh_i_ini(jl,i_hemis) 
    231                END DO 
    232                zh_i_ini(i_fill,i_hemis) = ( zvt_i_ini(i_hemis) - zV ) / za_i_ini(i_fill,i_hemis)  
    233                IF ( i_fill .LT. jpl ) zh_i_ini(i_fill+1:jpl, i_hemis) = 0._wp 
    234  
    235                !--- volumes 
    236                zv_i_ini(:,i_hemis) = za_i_ini(:,i_hemis) * zh_i_ini(:,i_hemis) 
    237                IF ( i_fill .LT. jpl ) zv_i_ini(i_fill+1:jpl, i_hemis) = 0._wp 
    238  
    239             ENDIF ! i_fill 
    240  
    241             !--------------------- 
    242             ! Compatibility tests 
    243             !--------------------- 
    244             ! Test 1: area conservation 
    245             zA_cons = SUM(za_i_ini(:,i_hemis)) ; zconv = ABS(zat_i_ini(i_hemis) - zA_cons ) 
    246             IF ( zconv .LT. 1.0e-6 ) THEN 
    247                ztest_1 = 1 
    248             ELSE  
    249               ! this write is useful 
    250               IF(lwp)  WRITE(numout,*) ' * TEST1 AREA NOT CONSERVED *** zA_cons = ', zA_cons,' zat_i_ini = ',zat_i_ini(i_hemis)  
    251                ztest_1 = 0 
    252             ENDIF 
    253  
    254             ! Test 2: volume conservation 
    255             zV_cons = SUM(zv_i_ini(:,i_hemis)) 
    256             zconv = ABS(zvt_i_ini(i_hemis) - zV_cons) 
    257  
    258             IF ( zconv .LT. 1.0e-6 ) THEN 
    259                ztest_2 = 1 
    260             ELSE 
    261               ! this write is useful 
    262               IF(lwp)  WRITE(numout,*) ' * TEST2 VOLUME NOT CONSERVED *** zV_cons = ', zV_cons, & 
    263                             ' zvt_i_ini = ', zvt_i_ini(i_hemis) 
    264                ztest_2 = 0 
    265             ENDIF 
    266  
    267             ! Test 3: thickness of the last category is in-bounds ? 
    268             IF ( zh_i_ini(i_fill, i_hemis) > hi_max(i_fill-1) ) THEN 
    269                ztest_3 = 1 
    270             ELSE 
    271                ! this write is useful 
    272                IF(lwp) WRITE(numout,*) ' * TEST 3 THICKNESS OF THE LAST CATEGORY OUT OF BOUNDS *** zh_i_ini(i_fill,i_hemis) = ', & 
    273                zh_i_ini(i_fill,i_hemis), ' hi_max(jpl-1) = ', hi_max(i_fill-1) 
    274                ztest_3 = 0 
    275             ENDIF 
    276  
    277             ! Test 4: positivity of ice concentrations 
    278             ztest_4 = 1 
    279             DO jl = 1, jpl 
    280                IF ( za_i_ini(jl,i_hemis) .LT. 0._wp ) THEN  
    281                   ! this write is useful 
    282                   IF(lwp) WRITE(numout,*) ' * TEST 4 POSITIVITY NOT OK FOR CAT ', jl, ' WITH A = ', za_i_ini(jl,i_hemis) 
    283                   ztest_4 = 0 
    284                ENDIF 
    285             END DO 
    286  
    287          ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 
    288   
    289          ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 
    290  
    291       END DO ! i_fill 
    292  
    293       IF(lwp) THEN  
    294          WRITE(numout,*) ' ztests : ', ztests 
    295          IF ( ztests .NE. 4 ) THEN 
    296             WRITE(numout,*) 
    297             WRITE(numout,*) ' !!!! ALERT                  !!! ' 
    298             WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
    299             WRITE(numout,*) 
    300             WRITE(numout,*) ' *** ztests is not equal to 4 ' 
    301             WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
    302             WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(i_hemis) 
    303             WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(i_hemis) 
    304          ENDIF ! ztests .NE. 4 
    305       ENDIF 
    306        
    307       END DO ! i_hemis 
    308  
    309       !--------------------------------------------------------------------- 
    310       ! 3.3) Space-dependent arrays for ice state variables 
    311       !--------------------------------------------------------------------- 
    312  
    313       ! Ice concentration, thickness and volume, ice salinity, ice age, surface temperature 
    314       DO jl = 1, jpl ! loop over categories 
     175         zvt_i_ini(:,:) = zht_i_ini(:,:) * zat_i_ini(:,:)   ! ice volume 
     176         !--------------------------------------------------------------------- 
     177         ! 3.2) Distribute ice concentration and thickness into the categories 
     178         !--------------------------------------------------------------------- 
     179         ! a gaussian distribution for ice concentration is used 
     180         ! then we check whether the distribution fullfills 
     181         ! volume and area conservation, positivity and ice categories bounds 
     182         zh_i_ini(:,:,:) = 0._wp  
     183         za_i_ini(:,:,:) = 0._wp 
     184         zv_i_ini(:,:,:) = 0._wp 
     185 
    315186         DO jj = 1, jpj 
    316187            DO ji = 1, jpi 
    317                a_i(ji,jj,jl)   = zswitch(ji,jj) * za_i_ini (jl,zhemis(ji,jj))  ! concentration 
    318                ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(jl,zhemis(ji,jj))   ! ice thickness 
    319                ht_s(ji,jj,jl)  = ht_i(ji,jj,jl) * ( zht_s_ini( zhemis(ji,jj) ) / zht_i_ini( zhemis(ji,jj) ) )  ! snow depth 
    320                sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj))     ! salinity 
    321                o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp                        ! age (1 day) 
    322                t_su(ji,jj,jl)  = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0 ! surf temp 
    323  
    324                ! This case below should not be used if (ht_s/ht_i) is ok in namelist 
    325                ! In case snow load is in excess that would lead to transformation from snow to ice 
    326                ! Then, transfer the snow excess into the ice (different from limthd_dh) 
    327                zdh = MAX( 0._wp, ( rhosn * ht_s(ji,jj,jl) + ( rhoic - rau0 ) * ht_i(ji,jj,jl) ) * r1_rau0 )  
    328                ! recompute ht_i, ht_s avoiding out of bounds values 
    329                ht_i(ji,jj,jl) = MIN( hi_max(jl), ht_i(ji,jj,jl) + zdh ) 
    330                ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic * r1_rhosn ) 
    331  
    332                ! ice volume, salt content, age content 
    333                v_i(ji,jj,jl)   = ht_i(ji,jj,jl) * a_i(ji,jj,jl)              ! ice volume 
    334                v_s(ji,jj,jl)   = ht_s(ji,jj,jl) * a_i(ji,jj,jl)              ! snow volume 
    335                smv_i(ji,jj,jl) = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) ! salt content 
    336                oa_i(ji,jj,jl)  = o_i(ji,jj,jl) * a_i(ji,jj,jl)               ! age content 
    337             END DO 
    338          END DO 
    339       END DO 
    340  
    341       ! for constant salinity in time 
    342       IF( nn_icesal == 1 .OR. nn_icesal == 3 )  THEN 
    343          CALL lim_var_salprof 
    344          smv_i = sm_i * v_i 
    345       ENDIF 
    346  
    347       ! Snow temperature and heat content 
    348       DO jk = 1, nlay_s 
     188 
     189               IF( zat_i_ini(ji,jj) > 0._wp .AND. zht_i_ini(ji,jj) > 0._wp )THEN 
     190 
     191                  ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 
     192!                  ztests  = 0  
     193 
     194                  DO i_fill = jpl, 1, -1 
     195 
     196!                     IF( ztests .NE. 4 ) THEN 
     197                     IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN 
     198                        !---------------------------- 
     199                        ! fill the i_fill categories 
     200                        !---------------------------- 
     201                        ! *** 1 category to fill 
     202                        IF ( i_fill .EQ. 1 ) THEN 
     203                           zh_i_ini(ji,jj,    1)   = zht_i_ini(ji,jj) 
     204                           za_i_ini(ji,jj,    1)   = zat_i_ini(ji,jj) 
     205                           zh_i_ini(ji,jj,2:jpl)   = 0._wp 
     206                           za_i_ini(ji,jj,2:jpl)   = 0._wp 
     207                        ELSE 
     208 
     209                           ! *** >1 categores to fill 
     210                           !--- Ice thicknesses in the i_fill - 1 first categories 
     211                           DO jl = 1, i_fill - 1 
     212                              zh_i_ini(ji,jj,jl) = hi_mean(jl) 
     213                           END DO 
     214                
     215                           !--- jl0: most likely index where cc will be maximum 
     216                           DO jl = 1, jpl 
     217                              IF ( ( zht_i_ini(ji,jj) >  hi_max(jl-1) ) .AND. & 
     218                                 & ( zht_i_ini(ji,jj) <= hi_max(jl)   ) ) THEN 
     219                                 jl0 = jl 
     220                              ENDIF 
     221                           END DO 
     222                           jl0 = MIN(jl0, i_fill) 
     223                
     224                           !--- Concentrations 
     225                           za_i_ini(ji,jj,jl0) = zat_i_ini(ji,jj) / SQRT(REAL(jpl)) 
     226                           DO jl = 1, i_fill - 1 
     227                              IF( jl .NE. jl0 )THEN 
     228                                 zsigma             = 0.5 * zht_i_ini(ji,jj) 
     229                                 zarg               = ( zh_i_ini(ji,jj,jl) - zht_i_ini(ji,jj) ) / zsigma 
     230                                 za_i_ini(ji,jj,jl) = za_i_ini(ji,jj,jl0) * EXP(-zarg**2) 
     231                              ENDIF 
     232                           END DO 
     233                
     234                           zA = 0. ! sum of the areas in the jpl categories  
     235                           DO jl = 1, i_fill - 1 
     236                              zA = zA + za_i_ini(ji,jj,jl) 
     237                           END DO 
     238                           za_i_ini(ji,jj,i_fill)   = zat_i_ini(ji,jj) - zA ! ice conc in the last category 
     239                           IF ( i_fill .LT. jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     240          
     241                           !--- Ice thickness in the last category 
     242                           zV = 0. ! sum of the volumes of the N-1 categories 
     243                           DO jl = 1, i_fill - 1 
     244                              zV = zV + za_i_ini(ji,jj,jl)*zh_i_ini(ji,jj,jl) 
     245                           END DO 
     246                           zh_i_ini(ji,jj,i_fill) = ( zvt_i_ini(ji,jj) - zV ) / za_i_ini(ji,jj,i_fill)  
     247                           IF ( i_fill .LT. jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     248 
     249                           !--- volumes 
     250                           zv_i_ini(ji,jj,:) = za_i_ini(ji,jj,:) * zh_i_ini(ji,jj,:) 
     251                           IF ( i_fill .LT. jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     252 
     253                        ENDIF ! i_fill 
     254 
     255                        !--------------------- 
     256                        ! Compatibility tests 
     257                        !--------------------- 
     258                        ! Test 1: area conservation 
     259                        zA_cons = SUM(za_i_ini(ji,jj,:)) ; zconv = ABS(zat_i_ini(ji,jj) - zA_cons ) 
     260                        IF ( zconv .LT. 1.0e-6 ) THEN 
     261                           ztest_1 = 1 
     262                        ELSE  
     263                          !this write is useful 
     264                          IF(lwp)  WRITE(numout,*) ' * TEST1 AREA NOT CONSERVED *** zA_cons = ', zA_cons,' zat_i_ini = ',zat_i_ini(ji,jj)  
     265                          ztest_1 = 0 
     266                        ENDIF 
     267 
     268                        ! Test 2: volume conservation 
     269                        zV_cons = SUM(zv_i_ini(ji,jj,:)) 
     270                        zconv = ABS(zvt_i_ini(ji,jj) - zV_cons) 
     271 
     272                        IF( zconv .LT. 1.0e-6 ) THEN 
     273                           ztest_2 = 1 
     274                        ELSE 
     275                           !this write is useful 
     276                           IF(lwp)  WRITE(numout,*) ' * TEST2 VOLUME NOT CONSERVED *** zV_cons = ', zV_cons, & 
     277                                                    ' zvt_i_ini = ', zvt_i_ini(ji,jj) 
     278                           ztest_2 = 0 
     279                        ENDIF 
     280 
     281                        ! Test 3: thickness of the last category is in-bounds ? 
     282                        IF ( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN 
     283                           ztest_3 = 1 
     284                        ELSE 
     285                           ! this write is useful 
     286                           IF(lwp) WRITE(numout,*) ' * TEST 3 THICKNESS OF THE LAST CATEGORY OUT OF BOUNDS *** zh_i_ini(ji,jj,i_fill) = ', & 
     287                           zh_i_ini(ji,jj,i_fill), ' hi_max(jpl-1) = ', hi_max(i_fill-1) 
     288                           IF(lwp) WRITE(numout,*) ' ji,jj,i_fill ',ji,jj,i_fill 
     289                           IF(lwp) WRITE(numout,*) 'zht_i_ini ',zht_i_ini(ji,jj) 
     290                           ztest_3 = 0 
     291                        ENDIF 
     292 
     293                        ! Test 4: positivity of ice concentrations 
     294                        ztest_4 = 1 
     295                        DO jl = 1, jpl 
     296                           IF ( za_i_ini(ji,jj,jl) .LT. 0._wp ) THEN  
     297                              ! this write is useful 
     298                              IF(lwp) WRITE(numout,*) ' * TEST 4 POSITIVITY NOT OK FOR CAT ', jl, ' WITH A = ', za_i_ini(ji,jj,jl) 
     299                              ztest_4 = 0 
     300                           ENDIF 
     301                        END DO 
     302 
     303                     ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 
     304  
     305                     ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 
     306 
     307                  END DO ! i_fill 
     308 
     309                  IF(lwp) THEN  
     310                     WRITE(numout,*) ' ztests : ', ztests 
     311                     IF( ztests .NE. 4 )THEN 
     312                        WRITE(numout,*) 
     313                        WRITE(numout,*) ' !!!! ALERT                  !!! ' 
     314                        WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
     315                        WRITE(numout,*) 
     316                        WRITE(numout,*) ' *** ztests is not equal to 4 ' 
     317                        WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
     318                        WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(ji,jj) 
     319                        WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(ji,jj) 
     320                     ENDIF ! ztests .NE. 4 
     321                  ENDIF 
     322       
     323               ENDIF !  zat_i_ini(ji,jj) > 0._wp .AND. zhm_i_ini(ji,jj) > 0._wp 
     324 
     325            ENDDO    
     326         ENDDO    
     327 
     328         !--------------------------------------------------------------------- 
     329         ! 3.3) Space-dependent arrays for ice state variables 
     330         !--------------------------------------------------------------------- 
     331 
     332         ! Ice concentration, thickness and volume, ice salinity, ice age, surface temperature 
    349333         DO jl = 1, jpl ! loop over categories 
    350334            DO jj = 1, jpj 
    351335               DO ji = 1, jpi 
    352                    t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0 
    353                    ! Snow energy of melting 
    354                    e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rt0 - t_s(ji,jj,jk,jl) ) + lfus ) 
    355  
    356                    ! Mutliply by volume, and divide by number of layers to get heat content in J/m2 
    357                    e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * v_s(ji,jj,jl) * r1_nlay_s 
     336                  a_i(ji,jj,jl)   = zswitch(ji,jj) * za_i_ini(ji,jj,jl)                       ! concentration 
     337                  ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(ji,jj,jl)                       ! ice thickness 
     338                  sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(ji,jj)                         ! salinity 
     339                  o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp                                    ! age (1 day) 
     340                  t_su(ji,jj,jl)  = zswitch(ji,jj) * zts_u_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rt0 ! surf temp 
     341 
     342                  IF( zht_i_ini(ji,jj) > 0._wp )THEN 
     343                    ht_s(ji,jj,jl)= ht_i(ji,jj,jl) * ( zht_s_ini(ji,jj) / zht_i_ini(ji,jj) )  ! snow depth 
     344                  ELSE 
     345                    ht_s(ji,jj,jl)= 0._wp 
     346                  ENDIF 
     347 
     348                  ! This case below should not be used if (ht_s/ht_i) is ok in namelist 
     349                  ! In case snow load is in excess that would lead to transformation from snow to ice 
     350                  ! Then, transfer the snow excess into the ice (different from limthd_dh) 
     351                  zdh = MAX( 0._wp, ( rhosn * ht_s(ji,jj,jl) + ( rhoic - rau0 ) * ht_i(ji,jj,jl) ) * r1_rau0 )  
     352                  ! recompute ht_i, ht_s avoiding out of bounds values 
     353                  ht_i(ji,jj,jl) = MIN( hi_max(jl), ht_i(ji,jj,jl) + zdh ) 
     354                  ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic * r1_rhosn ) 
     355 
     356                  ! ice volume, salt content, age content 
     357                  v_i(ji,jj,jl)   = ht_i(ji,jj,jl) * a_i(ji,jj,jl)              ! ice volume 
     358                  v_s(ji,jj,jl)   = ht_s(ji,jj,jl) * a_i(ji,jj,jl)              ! snow volume 
     359                  smv_i(ji,jj,jl) = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) ! salt content 
     360                  oa_i(ji,jj,jl)  = o_i(ji,jj,jl) * a_i(ji,jj,jl)               ! age content 
    358361               END DO 
    359362            END DO 
    360363         END DO 
    361       END DO 
    362  
    363       ! Ice salinity, temperature and heat content 
    364       DO jk = 1, nlay_i 
    365          DO jl = 1, jpl ! loop over categories 
    366             DO jj = 1, jpj 
    367                DO ji = 1, jpi 
    368                    t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0  
    369                    s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * rn_simin 
    370                    ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rt0 !Melting temperature in K 
    371  
    372                    ! heat content per unit volume 
    373                    e_i(ji,jj,jk,jl) = zswitch(ji,jj) * rhoic * (   cpic    * ( ztmelts - t_i(ji,jj,jk,jl) ) & 
    374                       +   lfus    * ( 1._wp - (ztmelts-rt0) / MIN((t_i(ji,jj,jk,jl)-rt0),-epsi20) ) & 
    375                       -   rcp     * ( ztmelts - rt0 ) ) 
    376  
    377                    ! Mutliply by ice volume, and divide by number of layers to get heat content in J/m2 
    378                    e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * v_i(ji,jj,jl) * r1_nlay_i 
     364 
     365         ! for constant salinity in time 
     366         IF( nn_icesal == 1 .OR. nn_icesal == 3 )  THEN 
     367            CALL lim_var_salprof 
     368            smv_i = sm_i * v_i 
     369         ENDIF 
     370             
     371         ! Snow temperature and heat content 
     372         DO jk = 1, nlay_s 
     373            DO jl = 1, jpl ! loop over categories 
     374               DO jj = 1, jpj 
     375                  DO ji = 1, jpi 
     376                     t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rt0 
     377                     ! Snow energy of melting 
     378                     e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rt0 - t_s(ji,jj,jk,jl) ) + lfus ) 
     379 
     380                     ! Mutliply by volume, and divide by number of layers to get heat content in J/m2 
     381                     e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * v_s(ji,jj,jl) * r1_nlay_s 
     382                  END DO 
    379383               END DO 
    380384            END DO 
    381385         END DO 
    382       END DO 
    383  
    384       tn_ice (:,:,:) = t_su (:,:,:) 
    385  
    386       ELSE  
    387          ! if ln_iceini=false 
     386 
     387         ! Ice salinity, temperature and heat content 
     388         DO jk = 1, nlay_i 
     389            DO jl = 1, jpl ! loop over categories 
     390               DO jj = 1, jpj 
     391                  DO ji = 1, jpi 
     392                     t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rt0  
     393                     s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(ji,jj) + ( 1._wp - zswitch(ji,jj) ) * rn_simin 
     394                     ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rt0 !Melting temperature in K 
     395 
     396                     ! heat content per unit volume 
     397                     e_i(ji,jj,jk,jl) = zswitch(ji,jj) * rhoic * (   cpic    * ( ztmelts - t_i(ji,jj,jk,jl) ) & 
     398                        +   lfus    * ( 1._wp - (ztmelts-rt0) / MIN((t_i(ji,jj,jk,jl)-rt0),-epsi20) ) & 
     399                        -   rcp     * ( ztmelts - rt0 ) ) 
     400 
     401                     ! Mutliply by ice volume, and divide by number of layers to get heat content in J/m2 
     402                     e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * v_i(ji,jj,jl) * r1_nlay_i 
     403                  END DO 
     404               END DO 
     405            END DO 
     406         END DO 
     407 
     408         tn_ice (:,:,:) = t_su (:,:,:) 
     409 
     410      ELSE ! if ln_limini=false 
    388411         a_i  (:,:,:) = 0._wp 
    389412         v_i  (:,:,:) = 0._wp 
     
    407430            END DO 
    408431         END DO 
    409        
    410       ENDIF ! ln_iceini 
     432 
     433      ENDIF ! ln_limini 
    411434       
    412435      at_i (:,:) = 0.0_wp 
     
    459482 
    460483 
    461       CALL wrk_dealloc( jpi, jpj, zswitch ) 
    462       CALL wrk_dealloc( jpi, jpj, zhemis ) 
    463       CALL wrk_dealloc( jpl,   2, zh_i_ini,  za_i_ini,  zv_i_ini ) 
    464       CALL wrk_dealloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     484      CALL wrk_dealloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
     485      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 ) 
     486      CALL wrk_dealloc( jpi, jpj,      zswitch ) 
    465487 
    466488   END SUBROUTINE lim_istate 
     
    482504      !!  8.5  ! 07-11 (M. Vancoppenolle) rewritten initialization 
    483505      !!----------------------------------------------------------------------------- 
    484       NAMELIST/namiceini/ ln_iceini, rn_thres_sst, rn_hts_ini_n, rn_hts_ini_s, rn_hti_ini_n, rn_hti_ini_s,  & 
    485          &                                      rn_ati_ini_n, rn_ati_ini_s, rn_smi_ini_n, rn_smi_ini_s, rn_tmi_ini_n, rn_tmi_ini_s 
    486       INTEGER :: ios                 ! Local integer output status for namelist read 
     506      ! 
     507      INTEGER :: ios,ierr,inum_ice                 ! Local integer output status for namelist read 
     508      INTEGER :: ji,jj 
     509      INTEGER :: ifpr, ierror 
     510      ! 
     511      CHARACTER(len=100) ::  cn_dir          ! Root directory for location of ice files 
     512      TYPE(FLD_N)                    ::   sn_hti, sn_hts, sn_ati, sn_tsu, sn_tmi, sn_smi 
     513      TYPE(FLD_N), DIMENSION(jpfldi) ::   slf_i                 ! array of namelist informations on the fields to read 
     514      ! 
     515      NAMELIST/namiceini/ ln_limini, ln_limini_file, rn_thres_sst, rn_hts_ini_n, rn_hts_ini_s,  & 
     516         &                rn_hti_ini_n, rn_hti_ini_s, rn_ati_ini_n, rn_ati_ini_s, rn_smi_ini_n, & 
     517         &                rn_smi_ini_s, rn_tmi_ini_n, rn_tmi_ini_s,                             & 
     518         &                sn_hti, sn_hts, sn_ati, sn_tsu, sn_tmi, sn_smi, cn_dir 
    487519      !!----------------------------------------------------------------------------- 
    488520      ! 
     
    496528      IF(lwm) WRITE ( numoni, namiceini ) 
    497529 
     530      slf_i(jp_hti) = sn_hti  ;  slf_i(jp_hts) = sn_hts 
     531      slf_i(jp_ati) = sn_ati  ;  slf_i(jp_tsu) = sn_tsu 
     532      slf_i(jp_tmi) = sn_tmi  ;  slf_i(jp_smi) = sn_smi 
     533 
    498534      ! Define the initial parameters 
    499535      ! ------------------------- 
     
    503539         WRITE(numout,*) 'lim_istate_init : ice parameters inititialisation ' 
    504540         WRITE(numout,*) '~~~~~~~~~~~~~~~' 
    505          WRITE(numout,*) '   initialization with ice (T) or not (F)       ln_iceini     = ', ln_iceini 
     541         WRITE(numout,*) '   initialization with ice (T) or not (F)       ln_limini     = ', ln_limini 
     542         WRITE(numout,*) '   ice initialization from a netcdf file      ln_limini_file  = ', ln_limini_file 
    506543         WRITE(numout,*) '   threshold water temp. for initial sea-ice    rn_thres_sst  = ', rn_thres_sst 
    507544         WRITE(numout,*) '   initial snow thickness in the north          rn_hts_ini_n  = ', rn_hts_ini_n 
     
    517554      ENDIF 
    518555 
     556      IF( ln_limini_file ) THEN                      ! Ice initialization using input file 
     557         ! 
     558         ! set si structure 
     559         ALLOCATE( si(jpfldi), STAT=ierror ) 
     560         IF( ierror > 0 ) THEN 
     561            CALL ctl_stop( 'Ice_ini in limistate: unable to allocate si structure' )   ;   RETURN 
     562         ENDIF 
     563 
     564         DO ifpr = 1, jpfldi 
     565            ALLOCATE( si(ifpr)%fnow(jpi,jpj,1) ) 
     566            ALLOCATE( si(ifpr)%fdta(jpi,jpj,1,2) ) 
     567         END DO 
     568 
     569         ! fill si with slf_i and control print 
     570         CALL fld_fill( si, slf_i, cn_dir, 'lim_istate', 'lim istate ini', 'numnam_ice' ) 
     571 
     572         CALL fld_read( nit000, 1, si )                ! input fields provided at the current time-step 
     573 
     574      ENDIF 
     575 
    519576   END SUBROUTINE lim_istate_init 
    520577 
Note: See TracChangeset for help on using the changeset viewer.