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 10026 for branches/UKMO – NEMO

Changeset 10026 for branches/UKMO


Ignore:
Timestamp:
2018-08-02T16:11:22+02:00 (6 years ago)
Author:
mathiot
Message:

Compute isf heat content flx using interface S in of far field S + add isfmask to simplify isf masking

Location:
branches/UKMO/dev_isf_flx_UKESM_r9321/NEMOGCM/NEMO/OPA_SRC
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_isf_flx_UKESM_r9321/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90

    r8427 r10026  
    259259   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mikt, miku, mikv, mikf  !: first wet T-, U-, V-, F- ocean level (ISF) 
    260260   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   risfdep                 !: Iceshelf draft                       (ISF) 
    261    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssmask                   !: surface domain T-point mask  
     261   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssmask, ssisfmask       !: surface domain T-point mask  
    262262 
    263263   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: tmask, umask, vmask, fmask   !: land/ocean mask at T-, U-, V- and F-pts 
     
    403403      ALLOCATE( misfdep(jpi,jpj) , risfdep(jpi,jpj),     & 
    404404         &     mikt(jpi,jpj), miku(jpi,jpj), mikv(jpi,jpj) ,           & 
    405          &     mikf(jpi,jpj), ssmask(jpi,jpj), STAT=ierr(10) ) 
     405         &     mikf(jpi,jpj), ssmask(jpi,jpj), ssisfmask(jpi,jpj), STAT=ierr(10) ) 
    406406 
    407407      ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk),     &  
  • branches/UKMO/dev_isf_flx_UKESM_r9321/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90

    r8280 r10026  
    218218      ENDIF 
    219219#endif 
     220 
     221      ! in case of iceshelf definition of iceshelf surface mask (1 under 
     222      ! iceshelf and 0 elsewhere 
     223      ssisfmask = (1._wp - tmask(:,:,1)) * ssmask(:,:) 
     224 
    220225!!gm end 
    221226 
  • branches/UKMO/dev_isf_flx_UKESM_r9321/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90

    r9321 r10026  
    197197       
    198198      ! note that mbkt is set to 1 over land ==> use surface tmask 
    199       zprt(:,:) = ssmask(:,:) * REAL( mbkt(:,:) , wp ) 
     199      zprt(:,:) = ssisfmask(:,:) 
     200      CALL iom_rstput( 0, 0, inum4, 'maskisf', zprt, ktype = jp_i1 )       !    ! surface ice shelf mask  
     201      zprt(:,:) = ssmask(:,:) * mbkt(:,:) 
    200202      CALL iom_rstput( 0, 0, inum4, 'mbathy', zprt, ktype = jp_i2 )     !    ! nb of ocean T-points 
    201203      zprt(:,:) = ssmask(:,:) * REAL( mikt(:,:) , wp ) 
  • branches/UKMO/dev_isf_flx_UKESM_r9321/NEMOGCM/NEMO/OPA_SRC/SBC/sbcisf.F90

    r9936 r10026  
    3636 
    3737   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_tsc_b, risf_tsc  !: before and now T & S isf contents [K.m/s & PSU.m/s]   
    38    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qisf                  !: net heat flux from ice shelf      [W/m2] 
     38   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qisf, qhcisf          !: latent heat and heat content flux from ice shelf  [W/m2] 
    3939   REAL(wp), PUBLIC ::   rn_hisf_tbl                 !: thickness of top boundary layer [m] 
    4040   INTEGER , PUBLIC ::   nn_isfblk                   !: flag to choose the bulk formulation to compute the ice shelf melting 
     
    101101 
    102102      REAL(wp), DIMENSION(:,:,:), POINTER :: zfwfisf3d, zqhcisf3d, zqlatisf3d 
    103       REAL(wp), DIMENSION(:,:  ), POINTER :: zqhcisf2d 
    104       REAL(wp), DIMENSION(:,:  ), POINTER :: zt_frz, zdep         ! freezing temperature (zt_frz) at depth (zdep)  
     103      REAL(wp), DIMENSION(:,:  ), POINTER :: ztfrz, zdep         ! freezing temperature (ztfrz) at depth (zdep)  
    105104      ! 
    106105      !!--------------------------------------------------------------------- 
     
    208207      IF( MOD( kt-1, nn_fsbc) == 0 ) THEN 
    209208         ! allocation 
    210          CALL wrk_alloc( jpi,jpj, zt_frz, zdep  ) 
     209         CALL wrk_alloc( jpi,jpj, ztfrz, zdep  ) 
    211210 
    212211         ! compute bottom level of isf tbl and thickness of tbl below the ice shelf 
     
    347346         END SELECT 
    348347 
     348         ! compute heat content 
     349         ! heat content flux for nn_isf==1 is done in sbcisf_cav 
     350         SELECT CASE ( nn_isf ) 
     351         CASE ( 2, 3, 4 ) 
     352            DO jj = 1,jpj 
     353               DO ji = 1,jpi 
     354                  zdep(ji,jj)=fsdepw_n(ji,jj,misfkt(ji,jj)) 
     355               END DO 
     356            END DO 
     357            CALL eos_fzp( stbl(:,:), ztfrz(:,:), zdep(:,:) ) 
     358            qhcisf(:,:) = - fwfisf(:,:) * ztfrz(:,:) * rcp 
     359         END SELECT 
     360          
    349361         ! compute tsc due to isf 
    350          ! isf melting implemented as a volume flux and we assume that melt water is at 0 PSU. 
    351          ! WARNING water add at temp = 0C, need to add a correction term (fwfisf * tfreez / rau0). 
    352          ! compute freezing point beneath ice shelf (or top cell if nn_isf = 3) 
    353          DO jj = 1,jpj 
    354             DO ji = 1,jpi 
    355                zdep(ji,jj)=fsdepw_n(ji,jj,misfkt(ji,jj)) 
    356             END DO 
    357          END DO 
    358          CALL eos_fzp( stbl(:,:), zt_frz(:,:), zdep(:,:) ) 
    359           
    360          risf_tsc(:,:,jp_tem) = qisf(:,:) * r1_rau0_rcp - fwfisf(:,:) * zt_frz(:,:) * r1_rau0 ! 
     362         risf_tsc(:,:,jp_tem) = (qisf(:,:) + qhcisf(:,:)) * r1_rau0_rcp 
    361363         risf_tsc(:,:,jp_sal) = 0.0_wp 
    362364 
    363365         ! output 
    364          IF( iom_use('qlatisf' ) )   CALL iom_put('qlatisf', qisf) 
     366         IF( iom_use('qlatisf' ) )   CALL iom_put('qlatisf', qisf  ) 
    365367         IF( iom_use('fwfisf'  ) )   CALL iom_put('fwfisf' , fwfisf) 
     368         IF( iom_use('qhcisf'  ) )   CALL iom_put('qhcisf' , qhcisf) 
    366369 
    367370         ! lbclnk 
     
    372375 
    373376!============================================================================================================================================= 
    374          IF ( iom_use('fwfisf3d') .OR. iom_use('qlatisf3d') .OR. iom_use('qhcisf3d') .OR. iom_use('qhcisf')) THEN 
     377         IF ( iom_use('fwfisf3d') .OR. iom_use('qlatisf3d') .OR. iom_use('qhcisf3d')) THEN 
    375378            CALL wrk_alloc( jpi,jpj,jpk, zfwfisf3d, zqhcisf3d, zqlatisf3d ) 
    376             CALL wrk_alloc( jpi,jpj,     zqhcisf2d                        ) 
    377379 
    378380            zfwfisf3d(:,:,:) = 0.0_wp                         ! 3d ice shelf melting (kg/m2/s) 
    379381            zqhcisf3d(:,:,:) = 0.0_wp                         ! 3d heat content flux (W/m2) 
    380382            zqlatisf3d(:,:,:)= 0.0_wp                         ! 3d ice shelf melting latent heat flux (W/m2) 
    381             zqhcisf2d(:,:)   = fwfisf(:,:) * zt_frz(:,:) * rcp     ! 2d heat content flux (W/m2) 
    382383 
    383384            DO jj = 1,jpj 
     
    386387                  ikb = misfkb(ji,jj) 
    387388                  DO jk = ikt, ikb - 1 
    388                      zfwfisf3d (ji,jj,jk) = zfwfisf3d (ji,jj,jk) + fwfisf   (ji,jj) * r1_hisf_tbl(ji,jj) * fse3t(ji,jj,jk) 
    389                      zqhcisf3d (ji,jj,jk) = zqhcisf3d (ji,jj,jk) + zqhcisf2d(ji,jj) * r1_hisf_tbl(ji,jj) * fse3t(ji,jj,jk) 
    390                      zqlatisf3d(ji,jj,jk) = zqlatisf3d(ji,jj,jk) + qisf     (ji,jj) * r1_hisf_tbl(ji,jj) * fse3t(ji,jj,jk) 
     389                     zfwfisf3d (ji,jj,jk) = zfwfisf3d (ji,jj,jk) + fwfisf(ji,jj) * r1_hisf_tbl(ji,jj) * fse3t(ji,jj,jk) 
     390                     zqhcisf3d (ji,jj,jk) = zqhcisf3d (ji,jj,jk) + qhcisf(ji,jj) * r1_hisf_tbl(ji,jj) * fse3t(ji,jj,jk) 
     391                     zqlatisf3d(ji,jj,jk) = zqlatisf3d(ji,jj,jk) + qisf  (ji,jj) * r1_hisf_tbl(ji,jj) * fse3t(ji,jj,jk) 
    391392                  END DO 
    392                   zfwfisf3d (ji,jj,jk) = zfwfisf3d (ji,jj,jk) + fwfisf   (ji,jj) * r1_hisf_tbl(ji,jj) * ralpha(ji,jj) * fse3t(ji,jj,jk) 
    393                   zqhcisf3d (ji,jj,jk) = zqhcisf3d (ji,jj,jk) + zqhcisf2d(ji,jj) * r1_hisf_tbl(ji,jj) * ralpha(ji,jj) * fse3t(ji,jj,jk) 
    394                   zqlatisf3d(ji,jj,jk) = zqlatisf3d(ji,jj,jk) + qisf     (ji,jj) * r1_hisf_tbl(ji,jj) * ralpha(ji,jj) * fse3t(ji,jj,jk) 
     393                  zfwfisf3d (ji,jj,jk) = zfwfisf3d (ji,jj,jk) + fwfisf(ji,jj) * r1_hisf_tbl(ji,jj) * ralpha(ji,jj) * fse3t(ji,jj,jk) 
     394                  zqhcisf3d (ji,jj,jk) = zqhcisf3d (ji,jj,jk) + qhcisf(ji,jj) * r1_hisf_tbl(ji,jj) * ralpha(ji,jj) * fse3t(ji,jj,jk) 
     395                  zqlatisf3d(ji,jj,jk) = zqlatisf3d(ji,jj,jk) + qisf  (ji,jj) * r1_hisf_tbl(ji,jj) * ralpha(ji,jj) * fse3t(ji,jj,jk) 
    395396               END DO 
    396397            END DO 
     
    399400            CALL iom_put('qlatisf3d', zqlatisf3d(:,:,:)) 
    400401            CALL iom_put('qhcisf3d' , zqhcisf3d (:,:,:)) 
    401             CALL iom_put('qhcisf'   , zqhcisf2d (:,:  )) 
    402402 
    403403            CALL wrk_dealloc( jpi,jpj,jpk, zfwfisf3d, zqhcisf3d, zqlatisf3d ) 
    404             CALL wrk_dealloc( jpi,jpj,     zqhcisf2d                        ) 
    405404         END IF 
    406405!============================================================================================================================================= 
     
    420419         !  
    421420         ! deallocation 
    422          CALL wrk_dealloc( jpi,jpj, zt_frz, zdep  ) 
     421         CALL wrk_dealloc( jpi,jpj, ztfrz, zdep  ) 
    423422      END IF 
    424423      !   
     
    437436               &    vtbl(jpi, jpj)        , risfLeff(jpi,jpj)   , rhisf_tbl_0(jpi,jpj), & 
    438437               &    ralpha(jpi,jpj)       , misfkt(jpi,jpj)     , misfkb(jpi,jpj)     , & 
    439                &    STAT= sbc_isf_alloc ) 
     438               &    qhcisf(jpi,jpj), STAT= sbc_isf_alloc ) 
    440439         ! 
    441440         IF( lk_mpp             )   CALL mpp_sum ( sbc_isf_alloc ) 
     
    466465      REAL(wp) :: zt_sum     ! sum of the temperature between 200m and 600m 
    467466      REAL(wp) :: zt_ave     ! averaged temperature between 200m and 600m 
    468       REAL(wp) :: zt_frz     ! freezing point temperature at depth z 
     467      REAL(wp) :: ztfrz     ! freezing point temperature at depth z 
    469468      REAL(wp) :: zpress     ! pressure to compute the freezing point in depth 
    470469      !!---------------------------------------------------------------------- 
     
    483482                  ! after verif with UNESCO, wrong sign in BG eq. 2 
    484483                  ! Calculate freezing temperature 
    485                   CALL eos_fzp(stbl(ji,jj), zt_frz, gdept_n(ji,jj,jk))  
    486                   zt_sum = zt_sum + (tsn(ji,jj,jk,jp_tem)-zt_frz) * fse3t(ji,jj,jk) * tmask(ji,jj,jk)  ! sum temp 
     484                  CALL eos_fzp(stbl(ji,jj), ztfrz, gdept_n(ji,jj,jk))  
     485                  zt_sum = zt_sum + (tsn(ji,jj,jk,jp_tem)-ztfrz) * fse3t(ji,jj,jk) * tmask(ji,jj,jk)  ! sum temp 
    487486               END DO 
    488487               zt_ave = zt_sum/rhisf_tbl(ji,jj) ! calcul mean value 
     
    574573 
    575574            ! Compute heat flux and upward fresh water flux 
    576             qisf  (:,:) = - zhtflx(:,:) * (1._wp - tmask(:,:,1)) * ssmask(:,:) 
    577             fwfisf(:,:) =   zfwflx(:,:) * (1._wp - tmask(:,:,1)) * ssmask(:,:) 
     575            qisf  (:,:) = - zhtflx(:,:) * ssisfmask(:,:) 
     576            fwfisf(:,:) =   zfwflx(:,:) * ssisfmask(:,:) 
    578577 
    579578         CASE ( 2 )  ! ISOMIP+ formulation (3 equations) for volume flux (Asay-Davis et al., 2015) 
     
    604603 
    605604                  ! compute t freeze (eq. 22) 
    606                   ztfrz(ji,jj)=zeps4+zlamb1*zsfrz(ji,jj) 
     605                  ztfrz(ji,jj)=( zeps4+zlamb1*zsfrz(ji,jj) ) * ssisfmask(ji,jj) 
    607606   
    608607                  ! zfwflx is upward water flux 
     
    613612               END DO 
    614613            END DO 
    615  
    616             ! compute heat and water flux 
    617             qisf  (:,:) = - zhtflx(:,:) * (1._wp - tmask(:,:,1)) * ssmask(:,:) 
    618             fwfisf(:,:) =   zfwflx(:,:) * (1._wp - tmask(:,:,1)) * ssmask(:,:) 
     614            ! 
     615            ! mask heat and water flux 
     616            fwfisf(:,:) =   zfwflx(:,:) * ssisfmask(:,:) 
     617            qisf  (:,:) = - zhtflx(:,:) * ssisfmask(:,:) 
     618            ! 
     619            ! compute heat content flux 
     620            qhcisf(:,:) = - fwfisf(:,:) * ztfrz(:,:) * rcp  
    619621 
    620622         END SELECT 
     
    637639      END DO 
    638640      ! 
    639       CALL iom_put('isftfrz'  , ztfrz * (1._wp - tmask(:,:,1)) * ssmask(:,:)) 
    640       CALL iom_put('isfsfrz'  , zsfrz * (1._wp - tmask(:,:,1)) * ssmask(:,:)) 
     641      CALL iom_put('isftfrz'  , ztfrz  ) 
     642      CALL iom_put('isfsfrz'  , zsfrz  ) 
    641643      CALL iom_put('isfgammat', zgammat) 
    642644      CALL iom_put('isfgammas', zgammas) 
     
    876878 
    877879      ! mask mean tbl value 
    878       pvarout(:,:) = pvarout(:,:) * (1._wp - tmask(:,:,1)) * ssmask(:,:) 
     880      pvarout(:,:) = pvarout(:,:) * ssisfmask(:,:) 
    879881 
    880882      ! deallocation 
Note: See TracChangeset for help on using the changeset viewer.