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/limcat_1D.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/limcat_1D.F90

    r4099 r4332  
    4444      REAL(wp), DIMENSION(:),   INTENT(in)    ::   zhti, zhts, zai    ! input ice/snow variables 
    4545      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   zht_i, zht_s, za_i ! output ice/snow variables 
    46       REAL(wp) :: epsi06 = 1.0e-6 
    47    
     46      REAL(wp)                     ::   epsi06 = 1.0e-6 
     47      REAL(wp)                     ::   zc1, zc2, zc3, zx1, zdh   ! local scalars 
     48      REAL(wp), DIMENSION(0:jpl)   ::   zhi_max         !:Boundary of ice thickness categories in thickness space 
     49  
    4850      IF( nn_timing == 1 )  CALL timing_start('limcat_1D') 
    4951      !-------------------------------------------------------------------- 
     
    5153      !-------------------------------------------------------------------- 
    5254      ijpij = SIZE(zhti,1) 
    53       zht_i(1:ijpij,1:jpl) = 0.d0 
    54       zht_s(1:ijpij,1:jpl) = 0.d0 
    55       za_i (1:ijpij,1:jpl) = 0.d0 
     55      zht_i(1:ijpij,1:jpl) = 0._wp 
     56      zht_s(1:ijpij,1:jpl) = 0._wp 
     57      za_i (1:ijpij,1:jpl) = 0._wp 
    5658 
    5759      !------------------------------------------------------------------------------------ 
     
    6668      !         fulfills ice volume concervation between input and output (ztests=4)  
    6769      !-------------------------------------------------------------------------------------- 
     70 
     71      !- Thickness categories boundaries 
     72      !    hi_max is calculated in iceini.F90 but since limcat_1D.F90 routine  
     73      !    is called before (in bdydta.F90), one must recalculate it.    
     74      !    Note clem: there may be a way of doing things cleaner 
     75      !---------------------------------- 
     76      zhi_max(:) = 0._wp 
     77      zc1 =  3._wp / REAL( jpl , wp ) ; zc2 = 10._wp * zc1 ; zc3 =  3._wp 
     78      DO jl = 1, jpl 
     79         zx1 = REAL( jl-1 , wp ) / REAL( jpl , wp ) 
     80         zhi_max(jl) = zhi_max(jl-1) + zc1 + zc2 * ( 1._wp + TANH( zc3 * ( zx1 - 1._wp ) ) ) 
     81      END DO 
    6882  
    6983      ! ---------------------------------------- 
     
    7185      ! ---------------------------------------- 
    7286      DO ji = 1, ijpij 
    73         ! snow thickness in each category  
    74          zht_s(ji,1:jpl) = zhts(ji) 
    7587          
     88         IF( zhti(ji) > 0._wp ) THEN 
     89 
    7690         ! initialisation of tests 
    7791         ztest_1 = 0 
     
    87101             
    88102            ! initialisation of ice variables for each try 
    89             zht_i(ji,1:jpl) = 0.d0 
    90             za_i (ji,1:jpl) = 0.d0 
     103            zht_i(ji,1:jpl) = 0._wp 
     104            za_i (ji,1:jpl) = 0._wp 
    91105             
    92106            ! *** case very thin ice: fill only category 1 
     
    94108               zht_i(ji,1) = zhti(ji) 
    95109               za_i (ji,1) = zai (ji) 
    96                 
    97110               ! *** case ice is thicker: fill categories >1 
    98111            ELSE 
     
    100113               ! Fill ice thicknesses except the last one (i_fill) by (hmax-hmin)/2  
    101114               DO jl = 1, i_fill - 1 
    102                   zht_i(ji,jl) = ( hi_max(jl) + hi_max(jl-1) ) / 2. 
     115                  zht_i(ji,jl) = ( zhi_max(jl) + zhi_max(jl-1) ) * 0.5_wp 
    103116               END DO 
    104117                
     
    106119               jl0 = i_fill 
    107120               DO jl = 1, i_fill 
    108                   IF ( ( zhti(ji) >= hi_max(jl-1) ) .AND. ( zhti(ji) < hi_max(jl) ) ) THEN 
     121                  IF ( ( zhti(ji) >= zhi_max(jl-1) ) .AND. ( zhti(ji) < zhi_max(jl) ) ) THEN 
    109122                     jl0 = jl 
    110123           CYCLE 
     
    116129               DO jl = 1, i_fill - 1 
    117130                  IF ( jl == jl0 ) CYCLE 
    118                   zarg           = ( zht_i(ji,jl) - zhti(ji) ) / ( zhti(ji) / 2. ) 
     131                  zarg           = ( zht_i(ji,jl) - zhti(ji) ) / ( zhti(ji) * 0.5_wp ) 
    119132                  za_i(ji,jl) =   za_i (ji,jl0) * EXP(-zarg**2) 
    120133               END DO 
     
    141154             
    142155            ! Test 3: thickness of the last category is in-bounds ? 
    143             IF ( zht_i(ji,i_fill) >= hi_max(i_fill-1) ) ztest_3 = 1 
     156            IF ( zht_i(ji,i_fill) >= zhi_max(i_fill-1) ) ztest_3 = 1 
    144157             
    145158            ! Test 4: positivity of ice concentrations 
    146159            ztest_4 = 1 
    147160            DO jl = 1, i_fill 
    148                IF ( za_i(ji,jl) < 0.0d0 ) ztest_4 = 0 
     161               IF ( za_i(ji,jl) < 0._wp ) ztest_4 = 0 
    149162            END DO 
    150163             
     
    164177         !   WRITE(numout,*) 'za_i(ji,jpl)=',za_i(ji,:) 
    165178         !ENDIF 
    166              
     179          
     180         ENDIF ! if zhti > 0 
     181 
    167182      END DO ! i loop 
     183 
     184      ! ------------------------------------------------ 
     185      ! Adding Snow in each category where za_i is not 0 
     186      ! ------------------------------------------------  
     187      DO jl = 1, jpl 
     188         DO ji = 1, ijpij 
     189            IF( za_i(ji,jl) > 0._wp ) THEN 
     190               zht_s(ji,jl) = zht_i(ji,jl) * ( zhts(ji) / zhti(ji) ) 
     191               ! In case snow load is in excess that would lead to transformation from snow to ice 
     192               ! Then, transfer the snow excess into the ice (different from limthd_dh) 
     193               zdh = MAX( 0._wp, ( rhosn * zht_s(ji,jl) + ( rhoic - rau0 ) * zht_i(ji,jl) ) * r1_rau0 )  
     194               ! recompute ht_i, ht_s avoiding out of bounds values 
     195               zht_i(ji,jl) = MIN( zhi_max(jl), zht_i(ji,jl) + zdh ) 
     196               zht_s(ji,jl) = MAX( 0._wp, zht_s(ji,jl) - zdh * rhoic / rhosn ) 
     197            ENDIF 
     198         ENDDO 
     199      ENDDO 
    168200 
    169201      IF( nn_timing == 1 )  CALL timing_stop('limcat_1D') 
Note: See TracChangeset for help on using the changeset viewer.