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 4990 for trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90 – NEMO

Ignore:
Timestamp:
2014-12-15T17:42:49+01:00 (10 years ago)
Author:
timgraham
Message:

Merged branches/2014/dev_MERGE_2014 back onto the trunk as follows:

In the working copy of branch ran:
svn merge svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk@HEAD
1 conflict in LIM_SRC_3/limdiahsb.F90
Resolved by keeping the version from dev_MERGE_2014 branch
and commited at r4989

In working copy run:
svn switch svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk
to switch working copy

Run:
svn merge --reintegrate svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2014/dev_MERGE_2014
to merge the branch into the trunk - no conflicts at this stage.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90

    r4873 r4990  
    2525   USE wrk_nemo       ! work arrays 
    2626   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    27    USE cpl_oasis3, ONLY : lk_cpl 
     27   USE sbc_oce, ONLY : lk_cpl 
    2828 
    2929   IMPLICIT NONE 
     
    3232   PUBLIC   lim_thd_dif   ! called by lim_thd 
    3333 
    34    REAL(wp) ::   epsi10 = 1.e-10_wp    ! 
    3534   !!---------------------------------------------------------------------- 
    3635   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
     
    108107      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat 
    109108      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13) 
    110       REAL(wp) ::   zraext_s  =  1.e+8_wp     ! extinction coefficient of radiation in the snow 
     109      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow 
    111110      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity 
    112111      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered as 0°C  
     
    141140      REAL(wp), POINTER, DIMENSION(:,:) ::   ztsb        ! Temporary temperature in the snow 
    142141      REAL(wp), POINTER, DIMENSION(:,:) ::   z_s         ! Vertical cotes of the layers in the snow 
    143       REAL(wp), POINTER, DIMENSION(:,:) ::   zindterm    ! Independent term 
    144       REAL(wp), POINTER, DIMENSION(:,:) ::   zindtbis    ! temporary independent term 
     142      REAL(wp), POINTER, DIMENSION(:,:) ::   zswiterm    ! Independent term 
     143      REAL(wp), POINTER, DIMENSION(:,:) ::   zswitbis    ! temporary independent term 
    145144      REAL(wp), POINTER, DIMENSION(:,:) ::   zdiagbis 
    146145      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid     ! tridiagonal system terms 
    147146      ! diag errors on heat 
    148       REAL(wp), POINTER, DIMENSION(:) :: zdq, zq_ini 
    149       REAL(wp)                        :: zhfx_err 
     147      REAL(wp), POINTER, DIMENSION(:) :: zdq, zq_ini, zhfx_err 
    150148      !!------------------------------------------------------------------      
    151149      !  
     
    155153      CALL wrk_alloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0) 
    156154      CALL wrk_alloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart=0) 
    157       CALL wrk_alloc( jpij, nlay_i+3, zindterm, zindtbis, zdiagbis  ) 
     155      CALL wrk_alloc( jpij, nlay_i+3, zswiterm, zswitbis, zdiagbis  ) 
    158156      CALL wrk_alloc( jpij, nlay_i+3, 3, ztrid ) 
    159157 
    160       CALL wrk_alloc( jpij, zdq, zq_ini ) 
     158      CALL wrk_alloc( jpij, zdq, zq_ini, zhfx_err ) 
    161159 
    162160      ! --- diag error on heat diffusion - PART 1 --- ! 
     
    272270 
    273271      DO ji = kideb, kiut           ! Radiation transmitted below the ice 
    274          !!!ftr_ice_1d(ji) = ftr_ice_1d(ji) + iatte_1d(ji) * zradtr_i(ji,nlay_i) * a_i_1d(ji) / at_i_1d(ji) ! clem modif 
    275272         ftr_ice_1d(ji) = zradtr_i(ji,nlay_i)  
    276273      END DO 
     
    408405         !------------------------------------------------------------------------------| 
    409406         ! 
    410          DO ji = kideb , kiut 
    411             ! update of the non solar flux according to the update in T_su 
    412             qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsubit(ji) ) 
    413  
     407         IF( .NOT. lk_cpl ) THEN   !--- forced atmosphere case 
     408            DO ji = kideb , kiut 
     409               ! update of the non solar flux according to the update in T_su 
     410               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsubit(ji) ) 
     411            END DO 
     412         ENDIF 
     413 
     414         ! Update incoming flux 
     415         DO ji = kideb , kiut 
    414416            ! update incoming flux 
    415417            zf(ji)    =   zfsw(ji)              & ! net absorbed solar radiation 
    416                + qns_ice_1d(ji)                  ! non solar total flux  
     418               + qns_ice_1d(ji)                   ! non solar total flux  
    417419            ! (LWup, LWdw, SH, LH) 
    418420         END DO 
     
    435437               ztrid(ji,numeq,2) = 0. 
    436438               ztrid(ji,numeq,3) = 0. 
    437                zindterm(ji,numeq)= 0. 
    438                zindtbis(ji,numeq)= 0. 
     439               zswiterm(ji,numeq)= 0. 
     440               zswitbis(ji,numeq)= 0. 
    439441               zdiagbis(ji,numeq)= 0. 
    440442            ENDDO 
     
    448450                  zkappa_i(ji,jk)) 
    449451               ztrid(ji,numeq,3)  =  - zeta_i(ji,jk)*zkappa_i(ji,jk) 
    450                zindterm(ji,numeq) =  ztib(ji,jk) + zeta_i(ji,jk)* & 
     452               zswiterm(ji,numeq) =  ztib(ji,jk) + zeta_i(ji,jk)* & 
    451453                  zradab_i(ji,jk) 
    452454            END DO 
     
    460462               +  zkappa_i(ji,nlay_i-1) ) 
    461463            ztrid(ji,numeq,3)  =  0.0 
    462             zindterm(ji,numeq) =  ztib(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
     464            zswiterm(ji,numeq) =  ztib(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
    463465               ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i)*zg1 & 
    464466               *  t_bo_1d(ji) )  
     
    480482                     zkappa_s(ji,jk) ) 
    481483                  ztrid(ji,numeq,3)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk) 
    482                   zindterm(ji,numeq)  =  ztsb(ji,jk) + zeta_s(ji,jk)* & 
     484                  zswiterm(ji,numeq)  =  ztsb(ji,jk) + zeta_s(ji,jk)* & 
    483485                     zradab_s(ji,jk) 
    484486               END DO 
     
    487489               IF ( nlay_i.eq.1 ) THEN 
    488490                  ztrid(ji,nlay_s+2,3)    =  0.0 
    489                   zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1)* & 
     491                  zswiterm(ji,nlay_s+2)   =  zswiterm(ji,nlay_s+2) + zkappa_i(ji,1)* & 
    490492                     t_bo_1d(ji)  
    491493               ENDIF 
     
    504506                  ztrid(ji,1,2) = dzf(ji) - zg1s*zkappa_s(ji,0) 
    505507                  ztrid(ji,1,3) = zg1s*zkappa_s(ji,0) 
    506                   zindterm(ji,1) = dzf(ji)*t_su_1d(ji)   - zf(ji) 
     508                  zswiterm(ji,1) = dzf(ji)*t_su_1d(ji)   - zf(ji) 
    507509 
    508510                  !!first layer of snow equation 
     
    510512                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1)*(zkappa_s(ji,1) + zkappa_s(ji,0)*zg1s) 
    511513                  ztrid(ji,2,3)  =  - zeta_s(ji,1)* zkappa_s(ji,1) 
    512                   zindterm(ji,2) =  ztsb(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
     514                  zswiterm(ji,2) =  ztsb(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
    513515 
    514516               ELSE  
     
    527529                     zkappa_s(ji,0) * zg1s ) 
    528530                  ztrid(ji,2,3)  =  - zeta_s(ji,1)*zkappa_s(ji,1)  
    529                   zindterm(ji,2) = ztsb(ji,1) + zeta_s(ji,1) *            & 
     531                  zswiterm(ji,2) = ztsb(ji,1) + zeta_s(ji,1) *            & 
    530532                     ( zradab_s(ji,1) +                         & 
    531533                     zkappa_s(ji,0) * zg1s * t_su_1d(ji) )  
     
    551553                  ztrid(ji,numeqmin(ji),2)   =  dzf(ji) - zkappa_i(ji,0)*zg1     
    552554                  ztrid(ji,numeqmin(ji),3)   =  zkappa_i(ji,0)*zg1 
    553                   zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_1d(ji) - zf(ji) 
     555                  zswiterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_1d(ji) - zf(ji) 
    554556 
    555557                  !!first layer of ice equation 
     
    558560                     + zkappa_i(ji,0) * zg1 ) 
    559561                  ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1)*zkappa_i(ji,1)   
    560                   zindterm(ji,numeqmin(ji)+1)=  ztib(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
     562                  zswiterm(ji,numeqmin(ji)+1)=  ztib(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
    561563 
    562564                  !!case of only one layer in the ice (surface & ice equations are altered) 
     
    571573                     ztrid(ji,numeqmin(ji)+1,3)  =  0.0 
    572574 
    573                      zindterm(ji,numeqmin(ji)+1) =  ztib(ji,1) + zeta_i(ji,1)* & 
     575                     zswiterm(ji,numeqmin(ji)+1) =  ztib(ji,1) + zeta_i(ji,1)* & 
    574576                        ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_1d(ji) ) 
    575577                  ENDIF 
     
    591593                     zg1)   
    592594                  ztrid(ji,numeqmin(ji),3)      =  - zeta_i(ji,1) * zkappa_i(ji,1) 
    593                   zindterm(ji,numeqmin(ji))     =  ztib(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
     595                  zswiterm(ji,numeqmin(ji))     =  ztib(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
    594596                     zkappa_i(ji,0) * zg1 * t_su_1d(ji) )  
    595597 
     
    600602                        zkappa_i(ji,1)) 
    601603                     ztrid(ji,numeqmin(ji),3)  =  0.0 
    602                      zindterm(ji,numeqmin(ji)) =  ztib(ji,1) + zeta_i(ji,1)* & 
     604                     zswiterm(ji,numeqmin(ji)) =  ztib(ji,1) + zeta_i(ji,1)* & 
    603605                        (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_1d(ji)) & 
    604606                        + t_su_1d(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0 
     
    624626 
    625627         DO ji = kideb , kiut 
    626             zindtbis(ji,numeqmin(ji)) =  zindterm(ji,numeqmin(ji)) 
     628            zswitbis(ji,numeqmin(ji)) =  zswiterm(ji,numeqmin(ji)) 
    627629            zdiagbis(ji,numeqmin(ji)) =  ztrid(ji,numeqmin(ji),2) 
    628630            minnumeqmin               =  MIN(numeqmin(ji),minnumeqmin) 
     
    635637               zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2) - ztrid(ji,numeq,1)* & 
    636638                  ztrid(ji,numeq-1,3)/zdiagbis(ji,numeq-1) 
    637                zindtbis(ji,numeq)  =  zindterm(ji,numeq) - ztrid(ji,numeq,1)* & 
    638                   zindtbis(ji,numeq-1)/zdiagbis(ji,numeq-1) 
     639               zswitbis(ji,numeq)  =  zswiterm(ji,numeq) - ztrid(ji,numeq,1)* & 
     640                  zswitbis(ji,numeq-1)/zdiagbis(ji,numeq-1) 
    639641            END DO 
    640642         END DO 
     
    642644         DO ji = kideb , kiut 
    643645            ! ice temperatures 
    644             t_i_1d(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
     646            t_i_1d(ji,nlay_i)    =  zswitbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
    645647         END DO 
    646648 
     
    648650            DO ji = kideb , kiut 
    649651               jk    =  numeq - nlay_s - 1 
    650                t_i_1d(ji,jk)  =  (zindtbis(ji,numeq) - ztrid(ji,numeq,3)* & 
     652               t_i_1d(ji,jk)  =  (zswitbis(ji,numeq) - ztrid(ji,numeq,3)* & 
    651653                  t_i_1d(ji,jk+1))/zdiagbis(ji,numeq) 
    652654            END DO 
     
    656658            ! snow temperatures       
    657659            IF (ht_s_1d(ji).GT.0._wp) & 
    658                t_s_1d(ji,nlay_s)     =  (zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
     660               t_s_1d(ji,nlay_s)     =  (zswitbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
    659661               *  t_i_1d(ji,1))/zdiagbis(ji,nlay_s+1) & 
    660662               *        MAX(0.0,SIGN(1.0,ht_s_1d(ji)))  
     
    664666            ztsubit(ji) = t_su_1d(ji) 
    665667            IF( t_su_1d(ji) < ztfs(ji) ) & 
    666                t_su_1d(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_1d(ji,1)   & 
     668               t_su_1d(ji) = ( zswitbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_1d(ji,1)   & 
    667669               &          + REAL( 1 - isnow(ji) )*t_i_1d(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
    668670         END DO 
     
    740742      CALL lim_thd_enmelt( kideb, kiut ) 
    741743 
    742       ! --- diag error on heat diffusion - PART 2 --- ! 
     744      ! --- diag conservation imbalance on heat diffusion - PART 2 --- ! 
    743745      DO ji = kideb, kiut 
    744746         zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) / REAL( nlay_i ) +  & 
    745747            &                              SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) / REAL( nlay_s ) ) 
    746          zhfx_err    = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice )  
    747          hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err * a_i_1d(ji) 
    748          ! --- correction of qns_ice and surface conduction flux --- ! 
    749          qns_ice_1d(ji) = qns_ice_1d(ji) - zhfx_err  
    750          fc_su     (ji) = fc_su     (ji) - zhfx_err  
    751          ! --- Heat flux at the ice surface in W.m-2 --- ! 
     748         zhfx_err(ji)   = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice )  
     749         hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err(ji) * a_i_1d(ji) 
     750      END DO  
     751 
     752      ! diagnose external surface (forced case) or bottom (forced case) from heat conservation 
     753      IF( .NOT. lk_cpl ) THEN   ! --- forced case: qns_ice and fc_su are diagnosed 
     754         ! 
     755         DO ji = kideb, kiut 
     756            qns_ice_1d(ji) = qns_ice_1d(ji) - zhfx_err(ji) 
     757            fc_su     (ji) = fc_su(ji)      - zhfx_err(ji) 
     758         END DO 
     759         ! 
     760      ELSE                      ! --- coupled case: ocean turbulent heat flux is diagnosed 
     761         ! 
     762         DO ji = kideb, kiut 
     763            fhtur_1d  (ji) = fhtur_1d(ji)   - zhfx_err(ji) 
     764         END DO 
     765         ! 
     766      ENDIF 
     767 
     768      ! --- compute diagnostic net heat flux at the surface of the snow-ice system (W.m2) 
     769      DO ji = kideb, kiut 
    752770         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1 
    753771         hfx_in (ii,ij) = hfx_in (ii,ij) + a_i_1d(ji) * ( qsr_ice_1d(ji) + qns_ice_1d(ji) ) 
     
    761779         &              ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 ) 
    762780      CALL wrk_dealloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart = 0 ) 
    763       CALL wrk_dealloc( jpij, nlay_i+3, zindterm, zindtbis, zdiagbis ) 
     781      CALL wrk_dealloc( jpij, nlay_i+3, zswiterm, zswitbis, zdiagbis ) 
    764782      CALL wrk_dealloc( jpij, nlay_i+3, 3, ztrid ) 
    765       CALL wrk_dealloc( jpij, zdq, zq_ini ) 
     783      CALL wrk_dealloc( jpij, zdq, zq_ini, zhfx_err ) 
    766784 
    767785   END SUBROUTINE lim_thd_dif 
     
    778796      ! 
    779797      INTEGER  ::   ji, jk   ! dummy loop indices 
    780       REAL(wp) ::   ztmelts, zindb  ! local scalar  
     798      REAL(wp) ::   ztmelts  ! local scalar  
    781799      !!------------------------------------------------------------------- 
    782800      ! 
     
    784802         DO ji = kideb, kiut 
    785803            ztmelts      = - tmut  * s_i_1d(ji,jk) + rtt  
    786             zindb        = MAX( 0._wp , SIGN( 1._wp , -(t_i_1d(ji,jk) - rtt) - epsi10 ) ) 
     804            rswitch      = MAX( 0._wp , SIGN( 1._wp , -(t_i_1d(ji,jk) - rtt) - epsi10 ) ) 
    787805            q_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_1d(ji,jk) )                                             & 
    788                &                   + lfus * ( 1.0 - zindb * ( ztmelts-rtt ) / MIN( t_i_1d(ji,jk)-rtt, -epsi10 ) )   & 
     806               &                   + lfus * ( 1.0 - rswitch * ( ztmelts-rtt ) / MIN( t_i_1d(ji,jk)-rtt, -epsi10 ) )   & 
    789807               &                   - rcp  *                 ( ztmelts-rtt )  )  
    790808         END DO 
Note: See TracChangeset for help on using the changeset viewer.