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 4332 for branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limupdate1.F90 – NEMO

Ignore:
Timestamp:
2013-12-11T15:38:42+01:00 (10 years ago)
Author:
clem
Message:

update LIM3 to fix remaining bugs. Now working in global and regional config.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limupdate1.F90

    r4099 r4332  
    4848   PUBLIC   lim_update1   ! routine called by ice_step 
    4949 
    50       REAL(wp)  ::   epsi06 = 1.e-06_wp   ! module constants 
    51       REAL(wp)  ::   epsi04 = 1.e-04_wp   !    -       - 
    52       REAL(wp)  ::   epsi03 = 1.e-03_wp   !    -       - 
    5350      REAL(wp)  ::   epsi10 = 1.e-10_wp   !    -       - 
    54       REAL(wp)  ::   epsi16 = 1.e-16_wp   !    -       - 
    55       REAL(wp)  ::   epsi20 = 1.e-20_wp   !    -       - 
    5651      REAL(wp)  ::   rzero  = 0._wp       !    -       - 
    5752      REAL(wp)  ::   rone   = 1._wp       !    -       - 
     
    108103      !------------------------------------------------------------------------------ 
    109104 
    110       !--------------------- 
    111       ! Ice dynamics   
    112       !--------------------- 
    113       u_ice(:,:) = u_ice(:,:) + d_u_ice_dyn(:,:) 
    114       v_ice(:,:) = v_ice(:,:) + d_v_ice_dyn(:,:) 
    115   
    116       !----------------------------- 
    117       ! Update ice and snow volumes   
    118       !----------------------------- 
    119       DO jl = 1, jpl 
    120          v_i(:,:,jl)  = v_i(:,:,jl) + d_v_i_trp(:,:,jl)  
    121          v_s(:,:,jl)  = v_s(:,:,jl) + d_v_s_trp(:,:,jl) 
    122       END DO 
    123  
    124  
    125       !--------------------------------------------- 
    126       ! Ice concentration and ice heat content 
    127       !--------------------------------------------- 
    128       a_i (:,:,:)  = a_i (:,:,:) + d_a_i_trp(:,:,:) 
    129       e_i(:,:,:,:) = e_i(:,:,:,:) + d_e_i_trp(:,:,:,:)   
    130  
    131       !------------------------------ 
    132       ! Snow temperature and ice age 
    133       !------------------------------ 
    134       e_s (:,:,:,:) = e_s (:,:,:,:) + d_e_s_trp (:,:,:,:) 
    135       oa_i(:,:,:)   = oa_i(:,:,:)   + d_oa_i_trp(:,:,:)   
    136  
    137       !-------------- 
    138       ! Ice salinity     
    139       !-------------- 
    140       IF(  num_sal == 2  ) THEN      ! general case 
    141          smv_i(:,:,:) = smv_i(:,:,:) + d_smv_i_trp(:,:,:) 
    142       ENDIF 
     105      !----------------- 
     106      !  Trend terms 
     107      !----------------- 
     108      d_u_ice_dyn(:,:)     = u_ice(:,:)     - old_u_ice(:,:) 
     109      d_v_ice_dyn(:,:)     = v_ice(:,:)     - old_v_ice(:,:) 
     110      d_a_i_trp  (:,:,:)   = a_i  (:,:,:)   - old_a_i  (:,:,:) 
     111      d_v_s_trp  (:,:,:)   = v_s  (:,:,:)   - old_v_s  (:,:,:)   
     112      d_v_i_trp  (:,:,:)   = v_i  (:,:,:)   - old_v_i  (:,:,:)    
     113      d_e_s_trp  (:,:,:,:) = e_s  (:,:,:,:) - old_e_s  (:,:,:,:)   
     114      d_e_i_trp  (:,:,:,:) = e_i  (:,:,:,:) - old_e_i  (:,:,:,:) 
     115      d_oa_i_trp (:,:,:)   = oa_i (:,:,:)   - old_oa_i (:,:,:) 
     116      d_smv_i_trp(:,:,:)   = 0._wp 
     117      IF(  num_sal == 2  )   d_smv_i_trp(:,:,:)  = smv_i(:,:,:) - old_smv_i(:,:,:) 
    143118 
    144119      ! mass and salt flux init (clem) 
     
    160135      CALL lim_var_glo2eqv 
    161136 
    162       !--------------------------------- 
    163       ! Classify the pathological cases 
    164       !--------------------------------- 
    165       ! (1) v_i (new) > 0; d_v_i_thd + v_i(old) > 0 (easy case) 
    166       ! (3) v_i (new) < 0; d_v_i_thd + v_i(old) > 0 (combined total ablation) 
    167       ! (5) v_i (old) = 0; d_v_i_trp > 0 (advection of ice in a free-cell) 
    168       ! 
    169       DO jl = 1, jpl 
    170          DO jj = 1, jpj 
    171             DO ji = 1, jpi 
    172                patho_case(ji,jj,jl) = 1 
    173                IF( v_i(ji,jj,jl) .LT. 0.0 ) THEN 
    174                   patho_case(ji,jj,jl) = 3 
    175                ENDIF 
    176                IF( ( old_v_i(ji,jj,jl) .LE. epsi10 ) .AND. ( d_v_i_trp(ji,jj,jl) .GT. epsi06 ) ) THEN 
    177                   patho_case(ji,jj,jl) = 5 ! advection of ice in an ice-free cell 
    178                ENDIF 
    179             END DO 
    180          END DO 
    181       END DO 
    182  
    183137      !-------------------------------------- 
    184138      ! 2. Review of all pathological cases 
    185139      !-------------------------------------- 
    186140 
     141! clem: useless now 
    187142      !------------------------------------------- 
    188143      ! 2.1) Advection of ice in an ice-free cell 
    189144      !------------------------------------------- 
    190145      ! should be removed since it is treated after dynamics now 
    191  
    192 !      !IF( ln_nicep ) THEN   
    193 !         WRITE(numout,*) ' limupdate1 - before h correction ' 
    194 !         WRITE(numout,*) ' a_i  : ', a_i(12, 44, 1:jpl) 
    195 !         WRITE(numout,*) ' at_i : ', at_i(12,44) 
    196 !         WRITE(numout,*) ' v_i  : ', v_i(12, 44, 1:jpl) 
    197 !         WRITE(numout,*) ' ht_i : ', ht_i(12, 44, 1:jpl) 
    198 !      !ENDIF 
     146!      zhimax = 5._wp 
     147!      ! first category 
     148!      DO jj = 1, jpj 
     149!         DO ji = 1, jpi 
     150!            !--- the thickness of such an ice is often out of bounds 
     151!            !--- thus we recompute a new area while conserving ice volume 
     152!            zat_i_old = SUM( old_a_i(ji,jj,:) ) 
     153!            zindb     = MAX( 0._wp, SIGN( 1._wp, ABS( d_a_i_trp(ji,jj,1) ) - epsi10 ) )  
     154!            IF( ( ABS( d_v_i_trp(ji,jj,1) ) / MAX( ABS( d_a_i_trp(ji,jj,1) ), epsi10 ) * zindb .GT. zhimax ) & 
     155!              &   .AND.( ( v_i(ji,jj,1) / MAX( a_i(ji,jj,1), epsi10 ) * zindb ) .GT. zhimax ) & 
     156!              &   .AND.( zat_i_old .LT. 1.e-6 ) )  THEN ! new line 
     157!               ht_i(ji,jj,1) = hi_max(1) * 0.5_wp 
     158!               a_i (ji,jj,1) = v_i(ji,jj,1) / ht_i(ji,jj,1) 
     159!            ENDIF 
     160!         END DO 
     161!      END DO 
    199162! 
    200       zhimax = .3_wp 
    201       ! first category 
    202       DO jj = 1, jpj 
    203          DO ji = 1, jpi 
    204             !--- the thickness of such an ice is often out of bounds 
    205             !--- thus we recompute a new area while conserving ice volume 
    206             zat_i_old = SUM( old_a_i(ji,jj,:) ) 
    207             zindb     = MAX( 0._wp, SIGN( 1._wp, ABS( d_a_i_trp(ji,jj,1)) - epsi10 ) )  
    208             IF ( ( ABS(d_v_i_trp(ji,jj,1))/MAX(ABS(d_a_i_trp(ji,jj,1)),epsi10)*zindb .GT. zhimax) & 
    209                  .AND.( ( v_i(ji,jj,1)/MAX(a_i(ji,jj,1),epsi10)*zindb) .GT. zhimax ) & 
    210                  .AND.( zat_i_old .LT. 1.e-6 ) )  THEN ! new line 
    211                ht_i(ji,jj,1) = hi_max(1) / 2.0 
    212                a_i (ji,jj,1) = v_i(ji,jj,1) / ht_i(ji,jj,1) 
    213             ENDIF 
    214          END DO 
    215       END DO 
    216  
    217  
    218 !      !IF( ln_nicep ) THEN   
    219 !         at_i(:,:) = 0._wp 
    220 !         DO jl = 1, jpl 
    221 !            at_i(:,:) = a_i(:,:,jl) + at_i(:,:) 
    222 !         END DO 
    223 !         WRITE(numout,*) ' limupdate1 - after h correction 1 ' 
    224 !         WRITE(numout,*) ' a_i  : ', a_i(12, 44, 1:jpl) 
    225 !         WRITE(numout,*) ' at_i : ', at_i(12,44) 
    226 !         WRITE(numout,*) ' v_i  : ', v_i(12, 44, 1:jpl) 
    227 !         WRITE(numout,*) ' ht_i : ', ht_i(12, 44, 1:jpl) 
    228 !      !ENDIF 
    229  
    230       zhimax = 1._wp 
    231       ! other categories 
    232       DO jl = 2, jpl 
    233          jm = ice_types(jl) 
    234          DO jj = 1, jpj 
    235             DO ji = 1, jpi 
    236                zindb =  MAX( rzero, SIGN( rone, ABS(d_a_i_trp(ji,jj,jl)) - epsi10 ) )  
    237                ! this correction is very tricky... sometimes, advection gets wrong i don't know why 
    238                ! it makes problems when the advected volume and concentration do not seem to be  
    239                ! related with each other 
    240                ! the new thickness is sometimes very big! 
    241                ! and sometimes d_a_i_trp and d_v_i_trp have different sign 
    242                ! which of course is plausible 
    243                ! but fuck! it fucks everything up :) 
    244                IF ( (ABS(d_v_i_trp(ji,jj,jl))/MAX(ABS(d_a_i_trp(ji,jj,jl)),epsi10)*zindb .GT. zhimax) & 
    245                     .AND.(v_i(ji,jj,jl)/MAX(a_i(ji,jj,jl),epsi10)*zindb) .GT. zhimax ) THEN 
    246                   ht_i(ji,jj,jl) = ( hi_max_typ(jl-ice_cat_bounds(jm,1),jm) + hi_max_typ(jl-ice_cat_bounds(jm,1)+1,jm) ) / 2.0 
    247                   a_i (ji,jj,jl) = v_i(ji,jj,jl) / ht_i(ji,jj,jl) 
    248                ENDIF 
    249             END DO ! ji 
    250          END DO !jj 
    251       END DO !jl 
     163!      zhimax = 20._wp 
     164!      ! other categories 
     165!      DO jl = 2, jpl 
     166!         jm = ice_types(jl) 
     167!         DO jj = 1, jpj 
     168!            DO ji = 1, jpi 
     169!               zindb =  MAX( rzero, SIGN( rone, ABS( d_a_i_trp(ji,jj,jl) ) - epsi10 ) )  
     170!               ! this correction is very tricky... sometimes, advection gets wrong i don't know why 
     171!               ! it makes problems when the advected volume and concentration do not seem to be  
     172!               ! related with each other 
     173!               ! the new thickness is sometimes very big! 
     174!               ! and sometimes d_a_i_trp and d_v_i_trp have different sign 
     175!               ! which of course is plausible 
     176!               ! but fuck! it fucks everything up :) 
     177!               IF ( ( ABS( d_v_i_trp(ji,jj,jl) ) / MAX( ABS( d_a_i_trp(ji,jj,jl) ), epsi10 ) * zindb .GT. zhimax ) & 
     178!                  &  .AND. ( v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * zindb ) .GT. zhimax ) THEN 
     179!                  ht_i(ji,jj,jl) = ( hi_max_typ(jl-ice_cat_bounds(jm,1),jm) + hi_max_typ(jl-ice_cat_bounds(jm,1)+1,jm) ) * 0.5_wp 
     180!                  a_i (ji,jj,jl) = v_i(ji,jj,jl) / ht_i(ji,jj,jl) 
     181!               ENDIF 
     182!            END DO ! ji 
     183!         END DO !jj 
     184!      END DO !jl 
    252185      
    253186      at_i(:,:) = 0._wp 
     
    255188         at_i(:,:) = a_i(:,:,jl) + at_i(:,:) 
    256189      END DO 
    257  
    258 !      !IF( ln_nicep ) THEN   
    259 !         WRITE(numout,*) ' limupdate1 - after h correction 2 ' 
    260 !         WRITE(numout,*) ' a_i  : ', a_i(12, 44, 1:jpl) 
    261 !         WRITE(numout,*) ' at_i : ', at_i(12,44) 
    262 !         WRITE(numout,*) ' v_i  : ', v_i(12, 44, 1:jpl) 
    263 !         WRITE(numout,*) ' ht_i : ', ht_i(12, 44, 1:jpl) 
    264 !      !ENDIF 
    265190 
    266191      !---------------------------------------------------- 
     
    285210 
    286211               !switches 
    287                zindb         = MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi06 ) )  
     212               zindb         = MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi10 ) )  
    288213               !switch = 1 if a_i > 1e-06 and 0 if not 
    289                zindsn        = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - epsi06 ) ) !=1 if hs > 1e-6 and 0 if not 
    290                zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi04 ) ) !=1 if hi > 1e-3 and 0 if not 
     214               zindsn        = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - epsi10 ) ) !=1 if hs > 1e-10 and 0 if not 
     215               zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi10 ) ) !=1 if hi > 1e-10 and 0 if not 
    291216               ! bug fix 25 avril 2007 
    292217               zindb         = zindb*zindic 
     
    332257               !-------------------------------------------- 
    333258               ! if greater than 0, ice concentration cannot be smaller than 1e-10 
    334                !clem a_i(ji,jj,jl) = zindb * MAX(zindsn, zindic) * MAX( a_i(ji,jj,jl), epsi06 ) 
    335259               a_i(ji,jj,jl) = zindb * a_i(ji,jj,jl) 
    336260 
     
    352276            DO jj = 1, jpj  
    353277               DO ji = 1, jpi 
    354                   zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi04 ) )  
     278                  zindic        = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi10 ) )  
    355279                  e_i(ji,jj,jk,jl)= zindic * ( MIN ( MAX ( 0.0, e_i(ji,jj,jk,jl) ), zbigvalue ) ) 
    356280               END DO ! ji 
     
    370294         DO ji = 1, jpi 
    371295            z_da_ex =  MAX( at_i(ji,jj) - amax , 0.0 )         
    372             zindb   =  MAX( rzero, SIGN( rone, at_i(ji,jj) - epsi06 ) )  
     296            zindb   =  MAX( rzero, SIGN( rone, at_i(ji,jj) - epsi10 ) )  
    373297            DO jl  = 1, jpl 
    374                z_da_i = a_i(ji,jj,jl) * z_da_ex / MAX( at_i(ji,jj), epsi06 ) * zindb 
     298               z_da_i = a_i(ji,jj,jl) * z_da_ex / MAX( at_i(ji,jj), epsi10 ) * zindb 
    375299               a_i(ji,jj,jl) = MAX( 0._wp, a_i(ji,jj,jl) - z_da_i ) 
    376300               ! 
    377                zinda   =  MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi06 ) )  
    378                ht_i(ji,jj,jl) = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi06 ) * zinda 
     301               zinda   =  MAX( rzero, SIGN( rone, a_i(ji,jj,jl) - epsi10 ) )  
     302               ht_i(ji,jj,jl) = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * zinda 
    379303               !v_i(ji,jj,jl) = ht_i(ji,jj,jl) * a_i(ji,jj,jl) ! makes ice shrinken but should not be used 
    380304            END DO 
     
    412336                     !clem smv_i(ji,jj,jl)  =  MAX(MIN((rhoic-rhosn)/rhoic*sss_m(ji,jj),smv_i(ji,jj,jl)),0.1 * v_i(ji,jj,jl) ) 
    413337                     smv_i(ji,jj,jl) = MAX( MIN( s_i_max * v_i(ji,jj,jl), smv_i(ji,jj,jl) ), s_i_min * v_i(ji,jj,jl) ) 
    414                      i_ice_switch    = 1._wp - MAX( 0._wp, SIGN( 1._wp, -v_i(ji,jj,jl) + epsi20 ) ) 
    415                      smv_i(ji,jj,jl) = i_ice_switch * smv_i(ji,jj,jl) + s_i_min * ( 1._wp - i_ice_switch ) * v_i(ji,jj,jl) 
     338                     i_ice_switch    = 1._wp - MAX( 0._wp, SIGN( 1._wp, -v_i(ji,jj,jl) ) ) 
     339                     smv_i(ji,jj,jl) = i_ice_switch * smv_i(ji,jj,jl) !+ s_i_min * ( 1._wp - i_ice_switch ) * v_i(ji,jj,jl) 
    416340                  END DO ! ji 
    417341               END DO ! jj 
     
    512436            CALL prt_ctl(tab2d_1=old_oa_i   (:,:,jl)        , clinfo1= ' lim_update1  : old_oa_i    : ') 
    513437            CALL prt_ctl(tab2d_1=d_oa_i_trp (:,:,jl)        , clinfo1= ' lim_update1  : d_oa_i_trp  : ') 
    514             CALL prt_ctl(tab2d_1=REAL(patho_case(:,:,jl))   , clinfo1= ' lim_update1  : Path. case  : ') 
    515438 
    516439            DO jk = 1, nlay_i 
Note: See TracChangeset for help on using the changeset viewer.