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

Ignore:
Timestamp:
2013-09-25T16:38:24+02:00 (11 years ago)
Author:
clem
Message:

new LIM3

File:
1 edited

Legend:

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

    r3625 r4045  
    2828   USE prtctl         ! Print control 
    2929   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     30   USE limvar          ! clem for ice thickness correction 
    3031 
    3132   IMPLICIT NONE 
     
    3637   REAL(wp)  ::   epsi06 = 1.e-06_wp   ! constant values 
    3738   REAL(wp)  ::   epsi03 = 1.e-03_wp   
    38    REAL(wp)  ::   zeps10 = 1.e-10_wp   
     39   REAL(wp)  ::   epsi10 = 1.e-10_wp   
    3940   REAL(wp)  ::   epsi16 = 1.e-16_wp 
     41   REAL(wp)  ::   epsi20 = 1.e-20_wp 
    4042   REAL(wp)  ::   rzero  = 0._wp    
    4143   REAL(wp)  ::   rone   = 1._wp 
     
    4648#  include "vectopt_loop_substitute.h90" 
    4749   !!---------------------------------------------------------------------- 
    48    !! NEMO/LIM3 3.4 , UCL - NEMO Consortium (2011) 
     50   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
    4951   !! $Id$ 
    5052   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6971      INTEGER  ::   initad                  ! number of sub-timestep for the advection 
    7072      INTEGER  ::   ierr                    ! error status 
    71       REAL(wp) ::   zindb  , zindsn , zindic      ! local scalar 
     73      REAL(wp) ::   zindb  , zindsn , zindic, zindh, zinda      ! local scalar 
    7274      REAL(wp) ::   zusvosn, zusvoic, zbigval     !   -      - 
    7375      REAL(wp) ::   zcfl , zusnit , zrtt          !   -      - 
     
    7779      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   zs0ice, zs0sn, zs0a, zs0c0 , zs0sm , zs0oi 
    7880      REAL(wp), POINTER, DIMENSION(:,:,:,:)  ::   zs0e 
     81      REAL(wp) :: zchk_v_i, zchk_smv, zchk_fs, zchk_fw, zchk_v_i_b, zchk_smv_b, zchk_fs_b, zchk_fw_b ! Check conservation (C Rousset) 
     82      REAL(wp) :: zchk_vmin, zchk_amin, zchk_amax ! Check errors (C Rousset) 
     83      ! mass and salt flux (clem) 
     84      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zviold   ! old ice volume... 
     85      ! correct ice thickness (clem) 
     86      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zaiold, zhimax   ! old ice concentration and thickness 
     87      REAL(wp) :: zdv, zda, zvi, zvs, zsmv 
    7988      !!--------------------------------------------------------------------- 
    8089 
     
    8291      CALL wrk_alloc( jpi, jpj, jpl, zs0ice, zs0sn, zs0a, zs0c0 , zs0sm , zs0oi ) 
    8392      CALL wrk_alloc( jpi, jpj, jkmax, jpl, zs0e ) 
     93 
     94      CALL wrk_alloc( jpi,jpj,jpl,zviold )   ! clem 
     95      CALL wrk_alloc( jpi,jpj,jpl,zaiold, zhimax )   ! clem 
     96 
     97      ! ------------------------------- 
     98      !- check conservation (C Rousset) 
     99      IF (ln_limdiahsb) THEN 
     100         zchk_v_i_b = glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
     101         zchk_smv_b = glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
     102         zchk_fw_b  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) 
     103         zchk_fs_b  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) 
     104      ENDIF 
     105      !- check conservation (C Rousset) 
     106      ! ------------------------------- 
    84107 
    85108      IF( numit == nstart .AND. lwp ) THEN 
     
    96119      IF( ln_limdyn ) THEN          !   Advection of sea ice properties   ! 
    97120         !                          !-------------------------------------! 
    98          ! 
    99  
     121         ! mass and salt flux init (clem) 
     122         zviold(:,:,:)  = v_i(:,:,:) 
     123 
     124         !--- Thickness correction init. (clem) ------------------------------- 
     125         CALL lim_var_glo2eqv 
     126         zaiold(:,:,:) = a_i(:,:,:) 
     127         !--------------------------------------------------------------------- 
     128         ! Record max of the surrounding ice thicknesses for correction in limupdate 
     129         ! in case advection creates ice too thick. 
     130         !--------------------------------------------------------------------- 
     131         zhimax(:,:,:) = ht_i(:,:,:) 
     132         DO jl = 1, jpl 
     133            DO jj = 2, jpjm1 
     134               DO ji = 2, jpim1 
     135                  zhimax(ji,jj,jl) = MAXVAL( ht_i(ji-1:ji+1,jj-1:jj+1,jl) ) 
     136                  !zhimax(ji,jj,jl) = ( ht_i(ji  ,jj  ,jl) * tmask(ji,  jj  ,1) + ht_i(ji-1,jj-1,jl) * tmask(ji-1,jj-1,1) + ht_i(ji+1,jj+1,jl) * tmask(ji+1,jj+1,1) & 
     137                  !     &             + ht_i(ji-1,jj  ,jl) * tmask(ji-1,jj  ,1) + ht_i(ji  ,jj-1,jl) * tmask(ji  ,jj-1,1) & 
     138                  !     &             + ht_i(ji+1,jj  ,jl) * tmask(ji+1,jj  ,1) + ht_i(ji  ,jj+1,jl) * tmask(ji  ,jj+1,1) & 
     139                  !     &             + ht_i(ji-1,jj+1,jl) * tmask(ji-1,jj+1,1) + ht_i(ji+1,jj-1,jl) * tmask(ji+1,jj-1,1) ) 
     140               END DO 
     141            END DO 
     142            CALL lbc_lnk(zhimax(:,:,jl),'T',1.) 
     143         END DO 
     144          
    100145         !------------------------- 
    101146         ! transported fields                                         
     
    126171!         ENDIF 
    127172!!gm end 
    128          initad = 1 + INT( MAX( rzero, SIGN( rone, zcfl-0.5 ) ) ) 
     173         initad = 1 + NINT( MAX( rzero, SIGN( rone, zcfl-0.5 ) ) ) 
    129174         zusnit = 1.0 / REAL( initad )  
    130175         IF( zcfl > 0.5 .AND. lwp )   & 
     
    282327         END DO 
    283328 
    284          !----------------------------------------- 
    285          !  Remultiply everything by ice area 
    286          !----------------------------------------- 
    287          zs0ow(:,:) = MAX( rzero, zs0ow(:,:) * area(:,:) ) 
    288          DO jl = 1, jpl 
    289             zs0ice(:,:,jl) = MAX( rzero, zs0ice(:,:,jl) * area(:,:) )    !!bug:  est-ce utile 
    290             zs0sn (:,:,jl) = MAX( rzero, zs0sn (:,:,jl) * area(:,:) )    !!bug:  cf /area  juste apres 
    291             zs0sm (:,:,jl) = MAX( rzero, zs0sm (:,:,jl) * area(:,:) )    !!bug:  cf /area  juste apres 
    292             zs0oi (:,:,jl) = MAX( rzero, zs0oi (:,:,jl) * area(:,:) ) 
    293             zs0a  (:,:,jl) = MAX( rzero, zs0a  (:,:,jl) * area(:,:) )    !! suppress both change le resultat 
    294             zs0c0 (:,:,jl) = MAX( rzero, zs0c0 (:,:,jl) * area(:,:) ) 
    295             DO jk = 1, nlay_i 
    296                zs0e(:,:,jk,jl) = MAX( rzero, zs0e (:,:,jk,jl) * area(:,:) ) 
    297             END DO ! jk 
    298          END DO ! jl 
    299  
    300329         !------------------------------------------------------------------------------! 
    301330         ! 5) Update and limit ice properties after transport                            
     
    305334         ! 5.1) Recover mean values over the grid squares. 
    306335         !-------------------------------------------------- 
    307  
    308          DO jl = 1, jpl 
    309             DO jk = 1, nlay_i 
    310                DO jj = 1, jpj 
    311                   DO ji = 1, jpi 
    312                      zs0e(ji,jj,jk,jl) = MAX( rzero, zs0e(ji,jj,jk,jl) / area(ji,jj) ) 
    313                   END DO 
    314                END DO 
    315             END DO 
    316          END DO 
    317  
    318          DO jj = 1, jpj 
    319             DO ji = 1, jpi 
    320                zs0ow(ji,jj) = MAX( rzero, zs0ow (ji,jj) / area(ji,jj) ) 
    321             END DO 
    322          END DO 
    323  
    324336         zs0at(:,:) = 0._wp 
    325337         DO jl = 1, jpl 
    326338            DO jj = 1, jpj 
    327339               DO ji = 1, jpi 
    328                   zs0sn (ji,jj,jl) = MAX( rzero, zs0sn (ji,jj,jl)/area(ji,jj) ) 
    329                   zs0ice(ji,jj,jl) = MAX( rzero, zs0ice(ji,jj,jl)/area(ji,jj) ) 
    330                   zs0sm (ji,jj,jl) = MAX( rzero, zs0sm (ji,jj,jl)/area(ji,jj) ) 
    331                   zs0oi (ji,jj,jl) = MAX( rzero, zs0oi (ji,jj,jl)/area(ji,jj) ) 
    332                   zs0a  (ji,jj,jl) = MAX( rzero, zs0a  (ji,jj,jl)/area(ji,jj) ) 
    333                   zs0c0 (ji,jj,jl) = MAX( rzero, zs0c0 (ji,jj,jl)/area(ji,jj) ) 
     340                  zs0sn (ji,jj,jl) = MAX( rzero, zs0sn (ji,jj,jl) ) 
     341                  zs0ice(ji,jj,jl) = MAX( rzero, zs0ice(ji,jj,jl) ) 
     342                  zs0sm (ji,jj,jl) = MAX( rzero, zs0sm (ji,jj,jl) ) 
     343                  zs0oi (ji,jj,jl) = MAX( rzero, zs0oi (ji,jj,jl) ) 
     344                  zs0a  (ji,jj,jl) = MAX( rzero, zs0a  (ji,jj,jl) ) 
     345                  zs0c0 (ji,jj,jl) = MAX( rzero, zs0c0 (ji,jj,jl) ) 
    334346                  zs0at (ji,jj)    = zs0at(ji,jj) + zs0a(ji,jj,jl) 
    335347               END DO 
     
    342354         DO jj = 1, jpj 
    343355            DO ji = 1, jpi 
    344                zindb        = MAX( 0._wp , SIGN( 1.0, zs0at(ji,jj) - zeps10) ) 
     356               zindb        = MAX( 0._wp , SIGN( 1.0, zs0at(ji,jj) - epsi10) ) 
    345357               zs0ow(ji,jj) = ( 1._wp - zindb ) + zindb * MAX( zs0ow(ji,jj), 0._wp ) 
    346358               ato_i(ji,jj) = zs0ow(ji,jj) 
     
    351363            DO jj = 1, jpj 
    352364               DO ji = 1, jpi 
    353                   zindb         = MAX( 0.0 , SIGN( 1.0, zs0a(ji,jj,jl) - zeps10) ) 
     365                  zvi = zs0ice(ji,jj,jl) 
     366                  zvs = zs0sn(ji,jj,jl) 
    354367                  ! 
    355                   zs0a(ji,jj,jl) = zindb * MIN( zs0a(ji,jj,jl), 0.99 ) 
     368                  zindb         = MAX( 0.0 , SIGN( 1.0, zs0a(ji,jj,jl) - epsi10) ) 
     369                  ! 
    356370                  v_s(ji,jj,jl)  = zindb * zs0sn (ji,jj,jl)  
    357371                  v_i(ji,jj,jl)  = zindb * zs0ice(ji,jj,jl) 
    358372                  ! 
    359                   zindsn         = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - zeps10 ) ) 
    360                   zindic         = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - zeps10 ) ) 
     373                  zindsn         = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - epsi10 ) ) 
     374                  zindic         = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi10 ) ) 
    361375                  zindb          = MAX( zindsn, zindic ) 
     376                  ! 
    362377                  zs0a(ji,jj,jl) = zindb  * zs0a(ji,jj,jl) !ice concentration 
    363378                  a_i (ji,jj,jl) = zs0a(ji,jj,jl) 
    364379                  v_s (ji,jj,jl) = zindsn * v_s(ji,jj,jl) 
    365380                  v_i (ji,jj,jl) = zindic * v_i(ji,jj,jl) 
     381                  ! 
     382                  ! Update mass fluxes (clem) 
     383                  rdm_ice(ji,jj) = rdm_ice(ji,jj) + ( v_i(ji,jj,jl) - zvi ) * rhoic  
     384                  rdm_snw(ji,jj) = rdm_snw(ji,jj) + ( v_s(ji,jj,jl) - zvs ) * rhosn  
     385              END DO 
     386            END DO 
     387         END DO 
     388 
     389         !--- Thickness correction in case too high (clem) -------------------------------------------------------- 
     390         CALL lim_var_glo2eqv 
     391         DO jl = 1, jpl 
     392            DO jj = 1, jpj 
     393               DO ji = 1, jpi 
     394 
     395                  IF ( v_i(ji,jj,jl) > 0._wp ) THEN 
     396                     zvi = v_i(ji,jj,jl) 
     397                     zvs = v_s(ji,jj,jl) 
     398                     zdv = v_i(ji,jj,jl) - zviold(ji,jj,jl)    
     399                     !zda = a_i(ji,jj,jl) - zaiold(ji,jj,jl)    
     400                      
     401                     zindh = 1._wp 
     402                     IF ( ( zdv > 0.0 .AND. ht_i(ji,jj,jl) > zhimax(ji,jj,jl) .AND. SUM( zaiold(ji,jj,1:jpl) ) < 0.80 ) .OR. & 
     403                        & ( zdv < 0.0 .AND. ht_i(ji,jj,jl) > zhimax(ji,jj,jl) ) ) THEN                                           
     404                        ht_i(ji,jj,jl) = MIN( zhimax(ji,jj,jl), hi_max(jl) ) 
     405                        zindh   =  MAX( rzero, SIGN( rone, ht_i(ji,jj,jl) - epsi10 ) ) 
     406                        a_i(ji,jj,jl)  = zindh * v_i(ji,jj,jl) / MAX( ht_i(ji,jj,jl), epsi10 ) 
     407                     ELSE 
     408                        ht_i(ji,jj,jl) = MAX( MIN( ht_i(ji,jj,jl), hi_max(jl) ), hi_max(jl-1) ) 
     409                        zindh   =  MAX( rzero, SIGN( rone, ht_i(ji,jj,jl) - epsi10 ) ) 
     410                        a_i(ji,jj,jl)  = zindh * v_i(ji,jj,jl) / MAX( ht_i(ji,jj,jl), epsi10 ) 
     411                     ENDIF 
     412 
     413                     ! small correction due to *zindh for a_i 
     414                     v_i(ji,jj,jl) = zindh * v_i(ji,jj,jl) 
     415                     v_s(ji,jj,jl) = zindh * v_s(ji,jj,jl) 
     416 
     417                     ! Update mass fluxes 
     418                     rdm_ice(ji,jj) = rdm_ice(ji,jj) + ( v_i(ji,jj,jl) - zvi ) * rhoic 
     419                     rdm_snw(ji,jj) = rdm_snw(ji,jj) + ( v_s(ji,jj,jl) - zvs ) * rhosn 
     420 
     421                  ENDIF 
     422 
     423                  diag_trp_vi(ji,jj) = diag_trp_vi(ji,jj) + ( v_i(ji,jj,jl) - zviold(ji,jj,jl) ) * r1_rdtice 
     424 
    366425               END DO 
    367426            END DO 
    368427         END DO 
    369428 
     429         ! --- 
    370430         DO jj = 1, jpj 
    371431            DO ji = 1, jpi 
    372                zs0at(ji,jj) = SUM( zs0a(ji,jj,1:jpl) ) 
     432               zs0at(ji,jj) = SUM( zs0a(ji,jj,1:jpl) ) ! clem@useless?? 
    373433            END DO 
    374434         END DO 
     
    378438         !---------------------- 
    379439 
    380          zbigval = 1.d+13 
     440         zbigval = 1.e+13 
    381441 
    382442         DO jl = 1, jpl 
    383443            DO jj = 1, jpj 
    384444               DO ji = 1, jpi 
     445                  zsmv = zs0sm(ji,jj,jl) 
    385446 
    386447                  ! Switches and dummy variables 
     
    388449                  zusvoic         = 1.0/MAX( v_i(ji,jj,jl) , epsi16 ) 
    389450                  zrtt            = 173.15 * rone  
    390                   zindsn          = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - zeps10 ) ) 
    391                   zindic          = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - zeps10 ) ) 
     451                  zindsn          = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - epsi10 ) ) 
     452                  zindic          = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi10 ) ) 
    392453                  zindb           = MAX( zindsn, zindic ) 
    393454 
     
    395456                  zsal = MAX( MIN(  (rhoic-rhosn)/rhoic*sss_m(ji,jj) ,   & 
    396457                     &              zusvoic * zs0sm(ji,jj,jl)         ) , s_i_min ) * v_i(ji,jj,jl) 
    397                   IF(  num_sal == 2  )   smv_i(ji,jj,jl) = zindic * zsal + (1.0-zindic) * 0._wp 
     458                  IF(  num_sal == 2  )   smv_i(ji,jj,jl) = zindic * zsal 
    398459 
    399460                  zage = MAX(  MIN( zbigval, zs0oi(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi16 ) ), 0._wp  ) * a_i(ji,jj,jl) 
     
    402463                  ! Snow heat content 
    403464                  ze              =  MIN( MAX( 0.0, zs0c0(ji,jj,jl)*area(ji,jj) ), zbigval ) 
    404                   e_s(ji,jj,1,jl) = zindsn * ze + (1.0 - zindsn) * 0.0       
    405  
     465                  e_s(ji,jj,1,jl) = zindsn * ze       
     466 
     467                  ! Update salt fluxes (clem) 
     468                  sfx_res(ji,jj) = sfx_res(ji,jj) - ( smv_i(ji,jj,jl) - zsmv ) * rhoic * r1_rdtice  
    406469               END DO !ji 
    407470            END DO !jj 
     
    413476                  DO ji = 1, jpi 
    414477                     ! Ice heat content 
    415                      zindic          =  MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - zeps10 ) ) 
     478                     zindic          =  MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi10 ) ) 
    416479                     ze              =  MIN( MAX( 0.0, zs0e(ji,jj,jk,jl)*area(ji,jj) ), zbigval ) 
    417                      e_i(ji,jj,jk,jl) = zindic * ze    + ( 1.0 - zindic ) * 0.0 
     480                     e_i(ji,jj,jk,jl) = zindic * ze 
    418481                  END DO !ji 
    419482               END DO ! jj 
    420483            END DO ! jk 
    421484         END DO ! jl 
     485 
     486 
     487      ! --- agglomerate variables (clem) ----------------- 
     488      vt_i (:,:) = 0._wp 
     489      vt_s (:,:) = 0._wp 
     490      at_i (:,:) = 0._wp 
     491      ! 
     492      DO jl = 1, jpl 
     493         DO jj = 1, jpj 
     494            DO ji = 1, jpi 
     495               ! 
     496               vt_i(ji,jj) = vt_i(ji,jj) + v_i(ji,jj,jl) ! ice volume 
     497               vt_s(ji,jj) = vt_s(ji,jj) + v_s(ji,jj,jl) ! snow volume 
     498               at_i(ji,jj) = at_i(ji,jj) + a_i(ji,jj,jl) ! ice concentration 
     499               ! 
     500               zinda = MAX( rzero , SIGN( rone , at_i(ji,jj) - epsi16 ) ) 
     501               icethi(ji,jj) = vt_i(ji,jj) / MAX( at_i(ji,jj) , epsi16 ) * zinda  ! ice thickness 
     502            END DO 
     503         END DO 
     504      END DO 
     505      ! ------------------------------------------------- 
     506 
     507 
    422508 
    423509      ENDIF 
     
    454540         END DO 
    455541      ENDIF 
     542      ! ------------------------------- 
     543      !- check conservation (C Rousset) 
     544      IF (ln_limdiahsb) THEN 
     545         zchk_fs  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) - zchk_fs_b 
     546         zchk_fw  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) - zchk_fw_b 
     547  
     548         zchk_v_i = ( glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_v_i_b - ( zchk_fw / rhoic ) ) / rdt_ice 
     549         zchk_smv = ( glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_smv_b ) / rdt_ice + ( zchk_fs / rhoic ) 
     550 
     551         zchk_vmin = glob_min(v_i) 
     552         zchk_amax = glob_max(SUM(a_i,dim=3)) 
     553         zchk_amin = glob_min(a_i) 
     554 
     555         IF(lwp) THEN 
     556            IF ( ABS( zchk_v_i   ) >  1.e-5 ) WRITE(numout,*) 'violation volume [m3/day]     (limtrp) = ',(zchk_v_i * rday) 
     557            IF ( ABS( zchk_smv   ) >  1.e-4 ) WRITE(numout,*) 'violation saline [psu*m3/day] (limtrp) = ',(zchk_smv * rday) 
     558            IF ( zchk_vmin <  0.            ) WRITE(numout,*) 'violation v_i<0  [mm]         (limtrp) = ',(zchk_vmin * 1.e-3) 
     559            IF ( zchk_amin <  0.            ) WRITE(numout,*) 'violation a_i<0               (limtrp) = ',zchk_amin 
     560         ENDIF 
     561      ENDIF 
     562      !- check conservation (C Rousset) 
     563      ! ------------------------------- 
    456564      ! 
    457565      CALL wrk_dealloc( jpi, jpj, zui_u, zvi_v, zsm, zs0at, zs0ow ) 
    458566      CALL wrk_dealloc( jpi, jpj, jpl, zs0ice, zs0sn, zs0a, zs0c0 , zs0sm , zs0oi ) 
    459567      CALL wrk_dealloc( jpi, jpj, jkmax, jpl, zs0e ) 
     568 
     569      CALL wrk_dealloc( jpi,jpj,jpl,zaiold, zhimax )   ! clem 
    460570      ! 
    461571   END SUBROUTINE lim_trp 
Note: See TracChangeset for help on using the changeset viewer.