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

Ignore:
Timestamp:
2016-08-08T11:02:18+02:00 (8 years ago)
Author:
clem
Message:

correct bugs on LIM3 rheology and outputs. Make sure the ice thickness distribution (used in initialization and bdy boundary conditions) is a gaussian.

File:
1 edited

Legend:

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

    r6746 r6853  
    3131   USE iom 
    3232 
     33!!!clem 
     34!!   USE diawri 
     35!!! 
     36    
    3337   IMPLICIT NONE 
    3438   PRIVATE 
     
    8488      REAL(wp)   :: ztmelts, zdh 
    8589      INTEGER    :: i_hemis, i_fill, jl0   
    86       REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv  
     90      REAL(wp)   :: zarg, zV, zconv, zdv  
    8791      REAL(wp), POINTER, DIMENSION(:,:)   :: zswitch    ! ice indicator 
    8892      REAL(wp), POINTER, DIMENSION(:,:)   :: zht_i_ini, zat_i_ini, zvt_i_ini            !data from namelist or nc file 
    8993      REAL(wp), POINTER, DIMENSION(:,:)   :: zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file 
    90       REAL(wp), POINTER, DIMENSION(:,:,:) :: zh_i_ini, za_i_ini, zv_i_ini               !data by cattegories to fill 
    91       !-------------------------------------------------------------------- 
    92  
    93       CALL wrk_alloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
     94      REAL(wp), POINTER, DIMENSION(:,:,:) :: zh_i_ini, za_i_ini                         !data by cattegories to fill 
     95      INTEGER , POINTER, DIMENSION(:)     :: itest 
     96      !-------------------------------------------------------------------- 
     97 
     98      CALL wrk_alloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini ) 
    9499      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 ) 
    95100      CALL wrk_alloc( jpi, jpj,      zswitch ) 
     101      Call wrk_alloc( 4,             itest ) 
    96102 
    97103      IF(lwp) WRITE(numout,*) 
     
    124130         DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
    125131            DO ji = 1, jpi 
    126                IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN  
    127                   zswitch(ji,jj) = 0._wp * tmask(ji,jj,1)    ! no ice 
     132               IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst * tmask(ji,jj,1) ) THEN 
     133                  zswitch(ji,jj) = 0._wp                     ! no ice 
    128134               ELSE                                                                                    
    129135                  zswitch(ji,jj) = 1._wp * tmask(ji,jj,1)    !    ice 
     
    153159               DO ji = 1, jpi 
    154160                  IF( ff(ji,jj) >= 0._wp ) THEN 
    155                      zht_i_ini(ji,jj) = rn_hti_ini_n 
    156                      zht_s_ini(ji,jj) = rn_hts_ini_n 
    157                      zat_i_ini(ji,jj) = rn_ati_ini_n 
    158                      zts_u_ini(ji,jj) = rn_tmi_ini_n 
    159                      zsm_i_ini(ji,jj) = rn_smi_ini_n 
    160                      ztm_i_ini(ji,jj) = rn_tmi_ini_n 
     161                     zht_i_ini(ji,jj) = rn_hti_ini_n * zswitch(ji,jj) 
     162                     zht_s_ini(ji,jj) = rn_hts_ini_n * zswitch(ji,jj) 
     163                     zat_i_ini(ji,jj) = rn_ati_ini_n * zswitch(ji,jj) 
     164                     zts_u_ini(ji,jj) = rn_tmi_ini_n * zswitch(ji,jj) 
     165                     zsm_i_ini(ji,jj) = rn_smi_ini_n * zswitch(ji,jj) 
     166                     ztm_i_ini(ji,jj) = rn_tmi_ini_n * zswitch(ji,jj) 
    161167                  ELSE 
    162                      zht_i_ini(ji,jj) = rn_hti_ini_s 
    163                      zht_s_ini(ji,jj) = rn_hts_ini_s 
    164                      zat_i_ini(ji,jj) = rn_ati_ini_s 
    165                      zts_u_ini(ji,jj) = rn_tmi_ini_s 
    166                      zsm_i_ini(ji,jj) = rn_smi_ini_s 
    167                      ztm_i_ini(ji,jj) = rn_tmi_ini_s 
     168                     zht_i_ini(ji,jj) = rn_hti_ini_s * zswitch(ji,jj) 
     169                     zht_s_ini(ji,jj) = rn_hts_ini_s * zswitch(ji,jj) 
     170                     zat_i_ini(ji,jj) = rn_ati_ini_s * zswitch(ji,jj) 
     171                     zts_u_ini(ji,jj) = rn_tmi_ini_s * zswitch(ji,jj) 
     172                     zsm_i_ini(ji,jj) = rn_smi_ini_s * zswitch(ji,jj) 
     173                     ztm_i_ini(ji,jj) = rn_tmi_ini_s * zswitch(ji,jj) 
    168174                  ENDIF 
    169175               END DO 
     
    181187         zh_i_ini(:,:,:) = 0._wp  
    182188         za_i_ini(:,:,:) = 0._wp 
    183          zv_i_ini(:,:,:) = 0._wp 
    184189 
    185190         DO jj = 1, jpj 
     
    188193               IF( zat_i_ini(ji,jj) > 0._wp .AND. zht_i_ini(ji,jj) > 0._wp )THEN 
    189194 
    190                   ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 
    191 !                  ztests  = 0  
    192  
    193                   DO i_fill = jpl, 1, -1 
    194  
    195 !                     IF( ztests .NE. 4 ) THEN 
    196                      IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN 
    197                         !---------------------------- 
    198                         ! fill the i_fill categories 
    199                         !---------------------------- 
    200                         ! *** 1 category to fill 
    201                         IF ( i_fill .EQ. 1 ) THEN 
    202                            zh_i_ini(ji,jj,    1)   = zht_i_ini(ji,jj) 
    203                            za_i_ini(ji,jj,    1)   = zat_i_ini(ji,jj) 
    204                            zh_i_ini(ji,jj,2:jpl)   = 0._wp 
    205                            za_i_ini(ji,jj,2:jpl)   = 0._wp 
    206                         ELSE 
    207  
    208                            ! *** >1 categores to fill 
    209                            !--- Ice thicknesses in the i_fill - 1 first categories 
    210                            DO jl = 1, i_fill - 1 
    211                               zh_i_ini(ji,jj,jl) = hi_mean(jl) 
    212                            END DO 
     195                  !--- jl0: most likely index where cc will be maximum 
     196                  jl0 = jpl 
     197                  DO jl = 1, jpl 
     198                     IF ( ( zht_i_ini(ji,jj) >  hi_max(jl-1) ) .AND. ( zht_i_ini(ji,jj) <= hi_max(jl) ) ) THEN 
     199                        jl0 = jl 
     200                        CYCLE 
     201                     ENDIF 
     202                  END DO 
     203 
     204                  ! initialisation of tests 
     205                  itest(:)  = 0 
     206                   
     207                  i_fill = jpl + 1                                             !==================================== 
     208                  DO WHILE ( ( SUM( itest(:) ) /= 4 ) .AND. ( i_fill >= 2 ) )  ! iterative loop on i_fill categories 
     209                     ! iteration                                               !==================================== 
     210                     i_fill = i_fill - 1 
     211 
     212                     ! initialisation of ice variables for each try 
     213                     zh_i_ini(ji,jj,:) = 0._wp  
     214                     za_i_ini(ji,jj,:) = 0._wp 
     215                     itest(:) = 0 
     216 
     217                     ! *** case very thin ice: fill only category 1 
     218                     IF ( i_fill == 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 
     222                     ! *** case ice is thicker: fill categories >1 
     223                     ELSE 
     224 
     225                        ! Fill ice thicknesses in the (i_fill-1) cat by hmean  
     226                        DO jl = 1, i_fill-1 
     227                           zh_i_ini(ji,jj,jl) = hi_mean(jl) 
     228                        END DO 
    213229                
    214                            !--- jl0: most likely index where cc will be maximum 
    215                            DO jl = 1, jpl 
    216                               IF ( ( zht_i_ini(ji,jj) >  hi_max(jl-1) ) .AND. & 
    217                                  & ( zht_i_ini(ji,jj) <= hi_max(jl)   ) ) THEN 
    218                                  jl0 = jl 
    219                               ENDIF 
    220                            END DO 
    221                            jl0 = MIN(jl0, i_fill) 
    222                 
    223                            !--- Concentrations 
    224                            za_i_ini(ji,jj,jl0) = zat_i_ini(ji,jj) / SQRT(REAL(jpl)) 
    225                            DO jl = 1, i_fill - 1 
    226                               IF( jl .NE. jl0 )THEN 
    227                                  zsigma             = 0.5 * zht_i_ini(ji,jj) 
    228                                  zarg               = ( zh_i_ini(ji,jj,jl) - zht_i_ini(ji,jj) ) / zsigma 
    229                                  za_i_ini(ji,jj,jl) = za_i_ini(ji,jj,jl0) * EXP(-zarg**2) 
    230                               ENDIF 
    231                            END DO 
    232                 
    233                            zA = 0. ! sum of the areas in the jpl categories  
    234                            DO jl = 1, i_fill - 1 
    235                               zA = zA + za_i_ini(ji,jj,jl) 
    236                            END DO 
    237                            za_i_ini(ji,jj,i_fill)   = zat_i_ini(ji,jj) - zA ! ice conc in the last category 
    238                            IF ( i_fill .LT. jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
    239           
    240                            !--- Ice thickness in the last category 
    241                            zV = 0. ! sum of the volumes of the N-1 categories 
    242                            DO jl = 1, i_fill - 1 
    243                               zV = zV + za_i_ini(ji,jj,jl)*zh_i_ini(ji,jj,jl) 
    244                            END DO 
    245                            zh_i_ini(ji,jj,i_fill) = ( zvt_i_ini(ji,jj) - zV ) / za_i_ini(ji,jj,i_fill)  
    246                            IF ( i_fill .LT. jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
    247  
    248                            !--- volumes 
    249                            zv_i_ini(ji,jj,:) = za_i_ini(ji,jj,:) * zh_i_ini(ji,jj,:) 
    250                            IF ( i_fill .LT. jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
    251  
    252                         ENDIF ! i_fill 
    253  
    254                         !--------------------- 
    255                         ! Compatibility tests 
    256                         !--------------------- 
    257                         ! Test 1: area conservation 
    258                         zA_cons = SUM(za_i_ini(ji,jj,:)) ; zconv = ABS(zat_i_ini(ji,jj) - zA_cons ) 
    259                         IF ( zconv .LT. 1.0e-6 ) THEN 
    260                            ztest_1 = 1 
    261                         ELSE  
    262                           ztest_1 = 0 
    263                         ENDIF 
    264  
    265                         ! Test 2: volume conservation 
    266                         zV_cons = SUM(zv_i_ini(ji,jj,:)) 
    267                         zconv = ABS(zvt_i_ini(ji,jj) - zV_cons) 
    268  
    269                         IF( zconv .LT. 1.0e-6 ) THEN 
    270                            ztest_2 = 1 
    271                         ELSE 
    272                            ztest_2 = 0 
    273                         ENDIF 
    274  
    275                         ! Test 3: thickness of the last category is in-bounds ? 
    276                         IF ( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN 
    277                            ztest_3 = 1 
    278                         ELSE 
    279                            ztest_3 = 0 
    280                         ENDIF 
    281  
    282                         ! Test 4: positivity of ice concentrations 
    283                         ztest_4 = 1 
    284                         DO jl = 1, jpl 
    285                            IF ( za_i_ini(ji,jj,jl) .LT. 0._wp ) THEN  
    286                               ztest_4 = 0 
     230                        !--- Concentrations 
     231                        za_i_ini(ji,jj,jl0) = zat_i_ini(ji,jj) / SQRT(REAL(jpl)) 
     232                        DO jl = 1, i_fill - 1 
     233                           IF( jl /= jl0 )THEN 
     234                              zarg               = ( zh_i_ini(ji,jj,jl) - zht_i_ini(ji,jj) ) / ( 0.5_wp * zht_i_ini(ji,jj) ) 
     235                              za_i_ini(ji,jj,jl) = za_i_ini(ji,jj,jl0) * EXP(-zarg**2) 
    287236                           ENDIF 
    288237                        END DO 
    289  
    290                      ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 
    291   
    292                      ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 
    293  
    294                   END DO ! i_fill 
    295  
    296                   IF(lwp) THEN  
    297                      WRITE(numout,*) ' ztests : ', ztests 
    298                      IF( ztests .NE. 4 )THEN 
    299                         WRITE(numout,*) 
    300                         WRITE(numout,*) ' !!!! ALERT                  !!! ' 
    301                         WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
    302                         WRITE(numout,*) 
    303                         WRITE(numout,*) ' *** ztests is not equal to 4 ' 
    304                         WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
    305                         WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(ji,jj) 
    306                         WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(ji,jj) 
    307                      ENDIF ! ztests .NE. 4 
     238                
     239                        ! Concentration in the last (i_fill) category 
     240                        za_i_ini(ji,jj,i_fill) = zat_i_ini(ji,jj) - SUM( za_i_ini(ji,jj,1:i_fill-1) ) 
     241 
     242                        ! Ice thickness in the last (i_fill) category 
     243                        zV = SUM( za_i_ini(ji,jj,1:i_fill-1) * zh_i_ini(ji,jj,1:i_fill-1) ) 
     244                        zh_i_ini(ji,jj,i_fill) = ( zvt_i_ini(ji,jj) - zV ) / MAX( za_i_ini(ji,jj,i_fill), epsi10 )  
     245 
     246                        ! clem: correction if concentration of upper cat is greater than lower cat 
     247                        !       (it should be a gaussian around jl0 but sometimes it is not) 
     248                        IF ( jl0 /= jpl ) THEN 
     249                           DO jl = jpl, jl0+1, -1 
     250                              IF ( za_i_ini(ji,jj,jl) > za_i_ini(ji,jj,jl-1) ) THEN 
     251                                 zdv = zh_i_ini(ji,jj,jl) * za_i_ini(ji,jj,jl) 
     252                                 zh_i_ini(ji,jj,jl    ) = 0._wp 
     253                                 za_i_ini(ji,jj,jl    ) = 0._wp 
     254                                 za_i_ini(ji,jj,1:jl-1) = za_i_ini(ji,jj,1:jl-1)  & 
     255                                    &                     + zdv / MAX( REAL(jl-1) * zht_i_ini(ji,jj), epsi10 ) 
     256                              END IF 
     257                           ENDDO 
     258                        ENDIF 
     259 
     260                     ENDIF ! case ice is thick or thin 
     261 
     262                     !--------------------- 
     263                     ! Compatibility tests 
     264                     !--------------------- 
     265                     ! Test 1: area conservation 
     266                     zconv = ABS( zat_i_ini(ji,jj) - SUM( za_i_ini(ji,jj,1:jpl) ) ) 
     267                     IF ( zconv < epsi06 ) itest(1) = 1 
     268                      
     269                     ! Test 2: volume conservation 
     270                     zconv = ABS(       zat_i_ini(ji,jj)       * zht_i_ini(ji,jj)   & 
     271                        &        - SUM( za_i_ini (ji,jj,1:jpl) * zh_i_ini (ji,jj,1:jpl) ) ) 
     272                     IF ( zconv < epsi06 ) itest(2) = 1 
     273                      
     274                     ! Test 3: thickness of the last category is in-bounds ? 
     275                     IF ( zh_i_ini(ji,jj,i_fill) >= hi_max(i_fill-1) ) itest(3) = 1 
     276                      
     277                     ! Test 4: positivity of ice concentrations 
     278                     itest(4) = 1 
     279                     DO jl = 1, i_fill 
     280                        IF ( za_i_ini(ji,jj,jl) < 0._wp ) itest(4) = 0 
     281                     END DO 
     282                     !                                      !============================ 
     283                  END DO                                    ! end iteration on categories 
     284                  !                                         !============================ 
     285 
     286                  IF( lwp .AND. SUM(itest) /= 4 ) THEN  
     287                     WRITE(numout,*) 
     288                     WRITE(numout,*) ' !!!! ALERT itest is not equal to 4      !!! ' 
     289                     WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
     290                     WRITE(numout,*) 
     291                     WRITE(numout,*) ' *** itest_i (i=1,4) = ', itest(:) 
     292                     WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(ji,jj) 
     293                     WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(ji,jj) 
    308294                  ENDIF 
    309        
    310                ENDIF !  zat_i_ini(ji,jj) > 0._wp .AND. zhm_i_ini(ji,jj) > 0._wp 
    311  
    312             ENDDO    
    313          ENDDO    
     295                
     296               ENDIF !  zat_i_ini(ji,jj) > 0._wp .AND. zht_i_ini(ji,jj) > 0._wp 
     297             
     298            ENDDO 
     299         ENDDO 
    314300 
    315301         !--------------------------------------------------------------------- 
     
    468454      sxyage (:,:,:)  = 0._wp 
    469455 
    470  
    471       CALL wrk_dealloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
     456!!!clem 
     457!!      ! Output the initial state and forcings 
     458!!      CALL dia_wri_state( 'output.init', nit000 ) 
     459!!! 
     460       
     461      CALL wrk_dealloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini ) 
    472462      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 ) 
    473463      CALL wrk_dealloc( jpi, jpj,      zswitch ) 
     464      Call wrk_dealloc( 4,             itest ) 
    474465 
    475466   END SUBROUTINE lim_istate 
Note: See TracChangeset for help on using the changeset viewer.