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 4161 for branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/LIM_SRC_3/limthd.F90 – NEMO

Ignore:
Timestamp:
2013-11-07T11:01:27+01:00 (10 years ago)
Author:
cetlod
Message:

dev_LOCEAN_2013 : merge in the 3rd dev branch dev_r4028_CNRS_LIM3, see ticket #1169

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/LIM_SRC_3/limthd.F90

    r4147 r4161  
    1111   !!            3.3  ! 2010-11 (G. Madec) corrected snow melting heat (due to factor betas) 
    1212   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation 
     13   !!             -   ! 2012-05 (C. Rousset) add penetration solar flux 
    1314   !!---------------------------------------------------------------------- 
    1415#if defined key_lim3 
     
    4041   USE prtctl         ! Print control 
    4142   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     43   USE timing         ! Timing 
    4244 
    4345   IMPLICIT NONE 
     
    9294      REAL(wp) ::   zfntlat, zpareff, zareamin, zcoef   !    -         - 
    9395      REAL(wp), POINTER, DIMENSION(:,:) ::   zqlbsbq   ! link with lead energy budget qldif 
     96      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) 
     97      REAL(wp) :: zchk_vmin, zchk_amin, zchk_amax ! Check errors (C Rousset) 
    9498      !!------------------------------------------------------------------- 
     99      IF( nn_timing == 1 )  CALL timing_start('limthd') 
    95100 
    96101      CALL wrk_alloc( jpi, jpj, zqlbsbq ) 
    97102    
     103      ! ------------------------------- 
     104      !- check conservation (C Rousset) 
     105      IF (ln_limdiahsb) THEN 
     106         zchk_v_i_b = glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
     107         zchk_smv_b = glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) 
     108         zchk_fw_b  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) 
     109         zchk_fs_b  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) 
     110      ENDIF 
     111      !- check conservation (C Rousset) 
     112      ! ------------------------------- 
     113 
    98114      !------------------------------------------------------------------------------! 
    99115      ! 1) Initialization of diagnostic variables                                    ! 
     
    109125               DO ji = 1, jpi 
    110126                  !Energy of melting q(S,T) [J.m-3] 
    111                   e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_i(ji,jj,jl) , epsi06 ) ) * nlay_i 
     127                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_i(ji,jj,jl) , epsi06 ) ) * REAL( nlay_i ) 
    112128                  !0 if no ice and 1 if yes 
    113129                  zindb = 1.0 - MAX(  0.0 , SIGN( 1.0 , - ht_i(ji,jj,jl) )  )  
     
    121137               DO ji = 1, jpi 
    122138                  !Energy of melting q(S,T) [J.m-3] 
    123                   e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , epsi06 ) ) * nlay_s 
     139                  e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , epsi06 ) ) * REAL( nlay_s ) 
    124140                  !0 if no ice and 1 if yes 
    125141                  zindb = 1.0 - MAX(  0.0 , SIGN( 1.0 , - ht_s(ji,jj,jl) )  )  
     
    134150      ! 1.3) Set some dummies to 0 
    135151      !----------------------------- 
    136       rdvosif(:,:) = 0.e0   ! variation of ice volume at surface 
    137       rdvobif(:,:) = 0.e0   ! variation of ice volume at bottom 
    138       fdvolif(:,:) = 0.e0   ! total variation of ice volume 
    139       rdvonif(:,:) = 0.e0   ! lateral variation of ice volume 
    140       fstric (:,:) = 0.e0   ! part of solar radiation transmitted through the ice 
    141       ffltbif(:,:) = 0.e0   ! linked with fstric 
    142       qfvbq  (:,:) = 0.e0   ! linked with fstric 
    143       rdm_snw(:,:) = 0.e0   ! variation of snow mass per unit area 
    144       rdm_ice(:,:) = 0.e0   ! variation of ice mass per unit area 
    145       hicifp (:,:) = 0.e0   ! daily thermodynamic ice production.  
    146       sfx_bri(:,:) = 0.e0   ! brine flux contribution to salt flux to the ocean 
    147       fhbri  (:,:) = 0.e0   ! brine flux contribution to heat flux to the ocean 
    148       sfx_thd(:,:) = 0.e0   ! equivalent salt flux to the ocean due to ice/growth decay 
     152      !clem rdvosif(:,:) = 0.e0   ! variation of ice volume at surface 
     153      !clem rdvobif(:,:) = 0.e0   ! variation of ice volume at bottom 
     154      !clem fdvolif(:,:) = 0.e0   ! total variation of ice volume 
     155      !clem rdvonif(:,:) = 0.e0   ! lateral variation of ice volume 
     156      !clem fstric (:,:) = 0.e0   ! part of solar radiation transmitted through the ice 
     157      !clem ffltbif(:,:) = 0.e0   ! linked with fstric 
     158      !clem qfvbq  (:,:) = 0.e0   ! linked with fstric 
     159      !clem rdm_snw(:,:) = 0.e0   ! variation of snow mass per unit area 
     160      !clem rdm_ice(:,:) = 0.e0   ! variation of ice mass per unit area 
     161      !clem hicifp (:,:) = 0.e0   ! daily thermodynamic ice production.  
     162      !clem sfx_bri(:,:) = 0.e0   ! brine flux contribution to salt flux to the ocean 
     163      !clem fhbri  (:,:) = 0.e0   ! brine flux contribution to heat flux to the ocean 
     164      !clem sfx_thd(:,:) = 0.e0   ! equivalent salt flux to the ocean due to ice/growth decay 
    149165 
    150166      !----------------------------------- 
     
    165181!CDIR NOVERRCHK 
    166182         DO ji = 1, jpi 
    167             zthsnice       = SUM( ht_s(ji,jj,1:jpl) ) + SUM( ht_i(ji,jj,1:jpl) ) 
    168             zindb          = tms(ji,jj) * ( 1.0 - MAX( zzero , SIGN( zone , - zthsnice ) ) )  
    169183            phicif(ji,jj)  = vt_i(ji,jj) 
    170184            pfrld(ji,jj)   = 1.0 - at_i(ji,jj) 
    171             zinda          = 1.0 - MAX( zzero , SIGN( zone , - ( 1.0 - pfrld(ji,jj) ) ) ) 
     185            zinda          = tms(ji,jj) * ( 1.0 - MAX( zzero , SIGN( zone , - at_i(ji,jj) ) ) ) 
    172186            ! 
    173187            !           !  solar irradiance transmission at the mixed layer bottom and used in the lead heat budget 
     
    180194 
    181195            ! here the drag will depend on ice thickness and type (0.006) 
    182             fdtcn(ji,jj)  = zindb * rau0 * rcp * 0.006  * zfric_u * ( (sst_m(ji,jj) + rt0) - t_bo(ji,jj) )  
     196            fdtcn(ji,jj)  = zinda * rau0 * rcp * 0.006  * zfric_u * ( (sst_m(ji,jj) + rt0) - t_bo(ji,jj) )  
    183197            ! also category dependent 
    184198            !           !-- Energy from the turbulent oceanic heat flux heat flux coming in the lead  
    185             qdtcn(ji,jj)  = zindb * fdtcn(ji,jj) * (1.0 - at_i(ji,jj)) * rdt_ice 
     199            qdtcn(ji,jj)  = zinda * fdtcn(ji,jj) * (1.0 - at_i(ji,jj)) * rdt_ice 
    186200            !                        
    187201            !           !-- Lead heat budget, qldif (part 1, next one is in limthd_dh)  
    188202            !           !   caution: exponent betas used as more snow can fallinto leads 
    189203            qldif(ji,jj) =  tms(ji,jj) * rdt_ice  * (                             & 
    190                &   pfrld(ji,jj)        * (  qsr(ji,jj)                            &   ! solar heat 
     204               &   pfrld(ji,jj)        * (  qsr(ji,jj) * oatte(ji,jj)             &   ! solar heat + clem modif 
    191205               &                            + qns(ji,jj)                          &   ! non solar heat 
    192206               &                            + fdtcn(ji,jj)                        &   ! turbulent ice-ocean heat 
    193                &                            + fsbbq(ji,jj) * ( 1.0 - zindb )  )   &   ! residual heat from previous step 
     207               &                            + fsbbq(ji,jj) * ( 1.0 - zinda )  )   &   ! residual heat from previous step 
    194208               & - pfrld(ji,jj)**betas * sprecip(ji,jj) * lfus                    )   ! latent heat of sprecip melting 
    195209            ! 
     
    206220            ! 
    207221            ! Energy needed to bring ocean surface layer until its freezing (qcmif, limflx) 
    208             qcmif  (ji,jj) =  rau0 * rcp * fse3t(ji,jj,1) * ( t_bo(ji,jj) - (sst_m(ji,jj) + rt0) ) * ( 1. - zinda ) 
     222            qcmif  (ji,jj) =  rau0 * rcp * fse3t(ji,jj,1) * ( t_bo(ji,jj) - (sst_m(ji,jj) + rt0) ) 
    209223            ! 
    210224            ! oceanic heat flux (limthd_dh) 
    211             fbif   (ji,jj) = zindb * (  fsbbq(ji,jj) / MAX( at_i(ji,jj) , epsi20 ) + fdtcn(ji,jj) ) 
     225            fbif   (ji,jj) = zinda * (  fsbbq(ji,jj) / MAX( at_i(ji,jj) , epsi20 ) + fdtcn(ji,jj) ) 
    212226            ! 
    213227         END DO 
     
    294308            CALL tab_2d_1d( nbpb, qfvbq_1d   (1:nbpb), qfvbq           , jpi, jpj, npb(1:nbpb) ) 
    295309 
     310            CALL tab_2d_1d( nbpb, iatte_1d   (1:nbpb), iatte           , jpi, jpj, npb(1:nbpb) ) ! clem modif 
     311            CALL tab_2d_1d( nbpb, oatte_1d   (1:nbpb), oatte           , jpi, jpj, npb(1:nbpb) ) ! clem modif 
    296312            !-------------------------------- 
    297313            ! 4.3) Thermodynamic processes 
     
    411427      ! 5.4) Diagnostic thermodynamic growth rates 
    412428      !-------------------------------------------- 
    413       d_v_i_thd(:,:,:) = v_i      (:,:,:) - old_v_i(:,:,:)    ! ice volumes  
    414       dv_dt_thd(:,:,:) = d_v_i_thd(:,:,:) * r1_rdtice * rday 
     429!clem@useless      d_v_i_thd(:,:,:) = v_i      (:,:,:) - old_v_i(:,:,:)    ! ice volumes  
     430!clem@mv-to-itd    dv_dt_thd(:,:,:) = d_v_i_thd(:,:,:) * r1_rdtice * rday 
    415431 
    416432      IF( con_i )   fbif(:,:) = fbif(:,:) + zqlbsbq(:,:) 
     
    448464      ENDIF 
    449465      ! 
     466      ! ------------------------------- 
     467      !- check conservation (C Rousset) 
     468      IF (ln_limdiahsb) THEN 
     469         zchk_fs  = glob_sum( ( sfx_bri(:,:) + sfx_thd(:,:) + sfx_res(:,:) + sfx_mec(:,:) ) * area(:,:) * tms(:,:) ) - zchk_fs_b 
     470         zchk_fw  = glob_sum( rdm_ice(:,:) * area(:,:) * tms(:,:) ) - zchk_fw_b 
     471  
     472         zchk_v_i = ( glob_sum( SUM(   v_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_v_i_b - ( zchk_fw / rhoic ) ) * r1_rdtice 
     473         zchk_smv = ( glob_sum( SUM( smv_i(:,:,:), dim=3 ) * area(:,:) * tms(:,:) ) - zchk_smv_b ) * r1_rdtice + ( zchk_fs / rhoic ) 
     474 
     475         zchk_vmin = glob_min(v_i) 
     476         zchk_amax = glob_max(SUM(a_i,dim=3)) 
     477         zchk_amin = glob_min(a_i) 
     478        
     479         IF(lwp) THEN 
     480            IF ( ABS( zchk_v_i   ) >  1.e-5 ) WRITE(numout,*) 'violation volume [m3/day]     (limthd) = ',(zchk_v_i * rday) 
     481            IF ( ABS( zchk_smv   ) >  1.e-4 ) WRITE(numout,*) 'violation saline [psu*m3/day] (limthd) = ',(zchk_smv * rday) 
     482            IF ( zchk_vmin <  0.            ) WRITE(numout,*) 'violation v_i<0  [mm]         (limthd) = ',(zchk_vmin * 1.e-3) 
     483            IF ( zchk_amax >  amax+epsi10   ) WRITE(numout,*) 'violation a_i>amax            (limthd) = ',zchk_amax 
     484            IF ( zchk_amin <  0.            ) WRITE(numout,*) 'violation a_i<0               (limthd) = ',zchk_amin 
     485         ENDIF 
     486      ENDIF 
     487      !- check conservation (C Rousset) 
     488      ! ------------------------------- 
     489      ! 
    450490      CALL wrk_dealloc( jpi, jpj, zqlbsbq ) 
    451491      ! 
     492      IF( nn_timing == 1 )  CALL timing_stop('limthd') 
    452493   END SUBROUTINE lim_thd 
    453494 
     
    472513      DO jk = 1, nlay_i                ! total q over all layers, ice [J.m-2] 
    473514         DO ji = kideb, kiut 
    474             etilayer(ji,jk) = q_i_b(ji,jk) * ht_i_b(ji) / nlay_i 
     515            etilayer(ji,jk) = q_i_b(ji,jk) * ht_i_b(ji) / REAL( nlay_i ) 
    475516            eti     (ji,jl) = eti(ji,jl) + etilayer(ji,jk)  
    476517         END DO 
    477518      END DO 
    478519      DO ji = kideb, kiut              ! total q over all layers, snow [J.m-2] 
    479          ets(ji,jl) = ets(ji,jl) + q_s_b(ji,1) * ht_s_b(ji) / nlay_s 
     520         ets(ji,jl) = ets(ji,jl) + q_s_b(ji,1) * ht_s_b(ji) / REAL( nlay_s ) 
    480521      END DO 
    481522      ! 
     
    498539 
    499540      INTEGER  ::   ji, jk         ! loop indices 
    500       INTEGER  ::   zji, zjj 
     541      INTEGER  ::   ii, ij 
    501542      INTEGER  ::   numce          ! number of points for which conservation is violated 
    502543      REAL(wp) ::   meance         ! mean conservation error 
     
    521562      !---------------------------------------- 
    522563      DO ji = kideb, kiut 
    523          zji = MOD( npb(ji) - 1 , jpi ) + 1 
    524          zjj =    ( npb(ji) - 1 ) / jpi + 1 
     564         ii = MOD( npb(ji) - 1 , jpi ) + 1 
     565         ij =    ( npb(ji) - 1 ) / jpi + 1 
    525566         fatm     (ji,jl) = qnsr_ice_1d(ji) + ( 1._wp - i0(ji) ) * qsr_ice_1d(ji) 
    526          sum_fluxq(ji,jl) = fc_su(ji) - fc_bo_i(ji) + qsr_ice_1d(ji) * i0(ji) - fstroc(zji,zjj,jl) 
     567         sum_fluxq(ji,jl) = fc_su(ji) - fc_bo_i(ji) + qsr_ice_1d(ji) * i0(ji) - fstroc(ii,ij,jl) 
    527568      END DO 
    528569 
     
    579620         IF ( ( ( t_su_b(ji) .LT. rtt ) .AND. ( surf_error(ji,jl) .GT. max_surf_err ) ) .OR. & 
    580621            ( cons_error(ji,jl) .GT. max_cons_err  ) ) THEN 
    581             zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    582             zjj                 = ( npb(ji) - 1 ) / jpi + 1 
     622            ii                 = MOD( npb(ji) - 1, jpi ) + 1 
     623            ij                 = ( npb(ji) - 1 ) / jpi + 1 
    583624            ! 
    584625            WRITE(numout,*) ' alerte 1     ' 
     
    586627            WRITE(numout,*) ' heat diffusion in the ice ' 
    587628            WRITE(numout,*) ' Category   : ', jl 
    588             WRITE(numout,*) ' zji , zjj  : ', zji, zjj 
    589             WRITE(numout,*) ' lat, lon   : ', gphit(zji,zjj), glamt(zji,zjj) 
     629            WRITE(numout,*) ' ii , ij  : ', ii, ij 
     630            WRITE(numout,*) ' lat, lon   : ', gphit(ii,ij), glamt(ii,ij) 
    590631            WRITE(numout,*) ' cons_error : ', cons_error(ji,jl) 
    591632            WRITE(numout,*) ' surf_error : ', surf_error(ji,jl) 
     
    615656            WRITE(numout,*) ' fc_bo      : ', - fc_bo_i  (ji) 
    616657            WRITE(numout,*) ' foc        : ', fbif_1d(ji) 
    617             WRITE(numout,*) ' fstroc     : ', fstroc   (zji,zjj,jl) 
     658            WRITE(numout,*) ' fstroc     : ', fstroc   (ii,ij,jl) 
    618659            WRITE(numout,*) ' i0         : ', i0(ji) 
    619660            WRITE(numout,*) ' qsr_ice    : ', (1.0-i0(ji))*qsr_ice_1d(ji) 
     
    651692      ! 
    652693      INTEGER  ::   ji                ! loop indices 
    653       INTEGER  ::   zji, zjj, numce         ! local integers 
     694      INTEGER  ::   ii, ij, numce         ! local integers 
    654695      REAL(wp) ::   meance, max_cons_err    !local scalar 
    655696      !!--------------------------------------------------------------------- 
     
    669710      !---------------------------------------- 
    670711      DO ji = kideb, kiut 
    671          zji = MOD( npb(ji) - 1 , jpi ) + 1 
    672          zjj =    ( npb(ji) - 1 ) / jpi + 1 
     712         ii = MOD( npb(ji) - 1 , jpi ) + 1 
     713         ij =    ( npb(ji) - 1 ) / jpi + 1 
    673714 
    674715         fatm      (ji,jl) = qnsr_ice_1d(ji) + qsr_ice_1d(ji)                       ! total heat flux 
    675          sum_fluxq (ji,jl) = fatm(ji,jl) + fbif_1d(ji) - ftotal_fin(ji) - fstroc(zji,zjj,jl)  
     716         sum_fluxq (ji,jl) = fatm(ji,jl) + fbif_1d(ji) - ftotal_fin(ji) - fstroc(ii,ij,jl)  
    676717         cons_error(ji,jl) = ABS( dq_i(ji,jl) * r1_rdtice + sum_fluxq(ji,jl) ) 
    677718      END DO 
     
    706747      DO ji = kideb, kiut 
    707748         IF ( cons_error(ji,jl) .GT. max_cons_err  ) THEN 
    708             zji = MOD( npb(ji) - 1, jpi ) + 1 
    709             zjj =    ( npb(ji) - 1 ) / jpi + 1 
     749            ii = MOD( npb(ji) - 1, jpi ) + 1 
     750            ij =    ( npb(ji) - 1 ) / jpi + 1 
    710751            ! 
    711752            WRITE(numout,*) ' alerte 1 - category : ', jl 
    712753            WRITE(numout,*) ' Untolerated conservation error after limthd_ent ' 
    713             WRITE(numout,*) ' zji , zjj  : ', zji, zjj 
    714             WRITE(numout,*) ' lat, lon   : ', gphit(zji,zjj), glamt(zji,zjj) 
     754            WRITE(numout,*) ' ii , ij  : ', ii, ij 
     755            WRITE(numout,*) ' lat, lon   : ', gphit(ii,ij), glamt(ii,ij) 
    715756            WRITE(numout,*) ' * ' 
    716757            WRITE(numout,*) ' Ftotal     : ', sum_fluxq(ji,jl) 
     
    724765            WRITE(numout,*) ' foce       : ', fbif_1d(ji) 
    725766            WRITE(numout,*) ' fres       : ', ftotal_fin(ji) 
    726             WRITE(numout,*) ' fhbri      : ', fhbricat(zji,zjj,jl) 
     767            WRITE(numout,*) ' fhbri      : ', fhbricat(ii,ij,jl) 
    727768            WRITE(numout,*) ' * ' 
    728769            WRITE(numout,*) ' Heat contents --- : ' 
     
    793834      INTEGER  ::   ios                 ! Local integer output status for namelist read 
    794835      NAMELIST/namicethd/ hmelt , hiccrit, fraz_swi, maxfrazb, vfrazb, Cfrazb,   & 
    795          &                hicmin, hiclim, amax  ,                                & 
     836         &                hicmin, hiclim,                                        & 
    796837         &                sbeta  , parlat, hakspl, hibspl, exld,                 & 
    797838         &                hakdif, hnzst  , thth  , parsub, alphs, betas,         &  
     
    825866         WRITE(numout,*)'      ice thick. corr. to max. energy stored in brine pocket  hicmin       = ', hicmin   
    826867         WRITE(numout,*)'      minimum ice thickness                                   hiclim       = ', hiclim  
    827          WRITE(numout,*)'      maximum lead fraction                                   amax         = ', amax  
    828868         WRITE(numout,*)'      numerical carac. of the scheme for diffusion in ice ' 
    829869         WRITE(numout,*)'      Cranck-Nicholson (=0.5), implicit (=1), explicit (=0)   sbeta        = ', sbeta 
Note: See TracChangeset for help on using the changeset viewer.