Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/SHARED/field_def_nemo-oce.xml
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/SHARED/field_def_nemo-oce.xml (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/SHARED/field_def_nemo-oce.xml (revision 12062)
@@ -264,32 +264,32 @@
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/SHARED/namelist_ref
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/SHARED/namelist_ref (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/SHARED/namelist_ref (revision 12062)
@@ -436,5 +436,7 @@
! ---------------- ice shelf load -------------------------------
!
- cn_isfload = 'isomip' ! scheme to compute ice shelf load (ln_isfcav = .true. in domain_cfg.nc)
+ cn_isfload = 'uniform' ! scheme to compute ice shelf load (ln_isfcav = .true. in domain_cfg.nc)
+ rn_isfload_T = -1.9
+ rn_isfload_S = 34.4
!
! ---------------- ice shelf melt formulation -------------------------------
@@ -449,13 +451,14 @@
cn_isfcav_mlt = '3eq' ! ice shelf melting formulation (spe/2eq/3eq/oasis)
! ! spe = fwfisf is read from a forcing field
- ! ! 2eq = ISOMIP like: 2 equations formulation (Hunter et al., 2006)
- ! ! 3eq = ISOMIP+ like: 3 equations formulation (Asay-Davis et al., 2015)
+ ! ! 2eq = ISOMIP like: 2 equations formulation (Hunter et al., 2006 for a short description)
+ ! ! 3eq = ISOMIP+ like: 3 equations formulation (Asay-Davis et al., 2016 for a short description)
! ! oasis = fwfisf is given by oasis and pattern by file sn_isfcav_fwf
! ! cn_isfcav_mlt = 2eq or 3eq cases:
- cn_gammablk = 'ad15' ! scheme to compute gammat/s (spe,ad15,hj99)
- ! ! ad15 = velocity dependend Gamma (u* * gammat/s) (Jenkins et al. 2010)
- ! ! hj99 = velocity and stability dependent Gamma (Holland et al. 1999)
- rn_gammat0 = 1.4e-2 ! gammat coefficient used in blk formula
- rn_gammas0 = 4.e-4 ! gammas coefficient used in blk formula
+ cn_gammablk = 'vel' ! scheme to compute gammat/s (spe,ad15,hj99)
+ ! ! spe = constant transfert velocity (rn_gammat0, rn_gammas0)
+ ! ! vel = velocity dependent transfert velocity (u* * gammat/s) (Asay-Davis et al. 2016 for a short description)
+ ! ! vel_stab = velocity and stability dependent transfert coeficient (Holland et al. 1999 for a complete description)
+ rn_gammat0 = 1.4e-2 ! gammat coefficient used in spe, vel and vel_stab gamma computation method
+ rn_gammas0 = 4.0e-4 ! gammas coefficient used in spe, vel and vel_stab gamma computation method
!
rn_htbl = 30. ! thickness of the top boundary layer (Losh et al. 2008)
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/WED025/EXPREF/namelist_cfg
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/WED025/EXPREF/namelist_cfg (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/cfgs/WED025/EXPREF/namelist_cfg (revision 12062)
@@ -211,8 +211,4 @@
!-----------------------------------------------------------------------
!
- ! ---------------- ice shelf load -------------------------------
- !
- cn_isfload = 'isomip' ! scheme to compute ice shelf load (ln_isfcav = .true. in domain_cfg.nc)
- !
! ---------------- ice shelf melt formulation -------------------------------
!
@@ -229,5 +225,5 @@
! ! oasis = fwfisf is given by oasis and pattern by file sn_isfcav_fwf
! ! cn_isfcav_mlt = 2eq or 3eq cases:
- cn_gammablk = 'ad15' ! scheme to compute gammat/s (spe,ad15,hj99)
+ cn_gammablk = 'vel' ! scheme to compute gammat/s (spe,ad15,hj99)
! ! ad15 = velocity dependend Gamma (u* * gammat/s) (Jenkins et al. 2010)
! ! hj99 = velocity and stability dependent Gamma (Holland et al. 1999)
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isf_oce.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isf_oce.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isf_oce.F90 (revision 12062)
@@ -39,4 +39,6 @@
REAL(wp) , PUBLIC :: rn_gammas0 !: salinity exchange coeficient []
REAL(wp) , PUBLIC :: rn_htbl !: Losch top boundary layer thickness [m]
+ REAL(wp) , PUBLIC :: rn_isfload_T !:
+ REAL(wp) , PUBLIC :: rn_isfload_S !:
CHARACTER(LEN=256), PUBLIC :: cn_gammablk !: gamma formulation
CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt !: melt formulation (cavity/param)
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcav.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcav.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcav.F90 (revision 12062)
@@ -25,5 +25,5 @@
USE par_oce , ONLY: jpi,jpj ! ocean space and time domain
USE phycst , ONLY: grav,rau0,r1_rau0_rcp ! physical constants
- USE eosbn2 , ONLY: l_useCT ! l_useCT
+ USE eosbn2 , ONLY: ln_teos10 ! use ln_teos10 or not
!
USE in_out_manager ! I/O manager
@@ -84,5 +84,5 @@
!
! initialisation
- IF (TRIM(cn_gammablk) == 'HJ99' ) zqoce_b (:,:) = ptsc(:,:,jp_tem) * rau0_rcp ! last time step total heat fluxes (to speed up convergence)
+ IF (TRIM(cn_gammablk) == 'vel_stab' ) zqoce_b (:,:) = ptsc(:,:,jp_tem) * rau0_rcp ! last time step total heat fluxes (to speed up convergence)
!
! compute ice shelf melting
@@ -103,8 +103,8 @@
! define if we need to iterate
SELECT CASE ( cn_gammablk )
- CASE ( 'spe','ad15' )
+ CASE ( 'spe','vel' )
! no convergence needed
lit = .FALSE.
- CASE ( 'hj99' )
+ CASE ( 'vel_stab' )
! compute error between 2 iterations
zerr = MAXVAL(ABS(zqoce(:,:) - zqoce_b(:,:)))
@@ -112,5 +112,5 @@
! define if iteration needed
IF (nit >= 100) THEN ! too much iteration
- CALL ctl_stop( 'STOP', 'isf_cav: HJ99 gamma formulation had too many iterations ...' )
+ CALL ctl_stop( 'STOP', 'isf_cav: vel_stab gamma formulation had too many iterations ...' )
ELSE IF ( zerr <= 0.01_wp ) THEN ! convergence is achieve
lit = .FALSE.
@@ -163,5 +163,4 @@
INTEGER :: ierr
!!---------------------------------------------------------------------
- PRINT *, cn_isfcav_mlt
!
!==============
@@ -212,5 +211,5 @@
! coeficient for linearisation of potential tfreez
! Crude approximation for pressure (but commonly used)
- IF ( l_useCT ) THEN ! linearisation from Jourdain et al. (2017)
+ IF ( ln_teos10 ) THEN ! linearisation from Jourdain et al. (2017)
risf_lamb1 =-0.0564_wp
risf_lamb2 = 0.0773_wp
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcavgam.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcavgam.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcavgam.F90 (revision 12062)
@@ -46,5 +46,5 @@
!!
!! ** Method : select the gamma formulation
- !! 3 method available (cst, AD15 and HJ99)
+ !! 3 method available (cst, vel and vel_stab)
!!---------------------------------------------------------------------
!!-------------------------- OUT -------------------------------------
@@ -65,5 +65,5 @@
! gamma is constant (specified in namelist)
! nothing to do
- CASE ('ad15', 'hj99')
+ CASE ('vel', 'vel_stab')
! compute velocity in tbl
CALL isf_tbl(un(:,:,:) ,zutbl(:,:),'U', miku, rhisf_tbl_cav)
@@ -89,8 +89,8 @@
pgt(:,:) = rn_gammat0
pgs(:,:) = rn_gammas0
- CASE ( 'ad15' ) ! gamma is proportional to u*
- CALL gammats_AD15 ( zutbl, zvtbl, rCd0_top, r_ke0_top, pgt, pgs )
- CASE ( 'hj99' ) ! gamma depends of stability of boundary layer and u*
- CALL gammats_HJ99 (pttbl, pstbl, zutbl, zvtbl, rCd0_top, r_ke0_top, pqoce, pqfwf, pgt, pgs )
+ CASE ( 'vel' ) ! gamma is proportional to u*
+ CALL gammats_vel ( zutbl, zvtbl, rCd0_top, r_ke0_top, pgt, pgs )
+ CASE ( 'vel_stab' ) ! gamma depends of stability of boundary layer and u*
+ CALL gammats_vel_stab (pttbl, pstbl, zutbl, zvtbl, rCd0_top, r_ke0_top, pqoce, pqfwf, pgt, pgs )
CASE DEFAULT
CALL ctl_stop('STOP','method to compute gamma (cn_gammablk) is unknown (should not see this)')
@@ -115,5 +115,5 @@
!!-----------------------------------------------------------------------------------------------------
!
- SUBROUTINE gammats_AD15(putbl, pvtbl, pCd, pke2, & ! <<== in
+ SUBROUTINE gammats_vel( putbl, pvtbl, pCd, pke2, & ! <<== in
& pgt, pgs ) ! ==>> out gammats [m/s]
!!----------------------------------------------------------------------
@@ -122,6 +122,5 @@
!! ** Method : gamma is velocity dependent ( gt= gt0 * Ustar )
!!
- !! ** Reference : Jenkins et al., 2010, JPO, p2298-2312
- !! Asay-Davis et al., Geosci. Model Dev., 9, 2471-2497, 2016
+ !! ** Reference : Asay-Davis et al., Geosci. Model Dev., 9, 2471-2497, 2016
!!---------------------------------------------------------------------
!!-------------------------- OUT -------------------------------------
@@ -145,8 +144,8 @@
CALL iom_put('isfustar',zustar(:,:))
!
- END SUBROUTINE gammats_AD15
-
- SUBROUTINE gammats_HJ99( pttbl, pstbl, putbl, pvtbl, pCd, pke2, pqoce, pqfwf, & ! <<== in
- & pgt , pgs ) ! ==>> out gammats [m/s]
+ END SUBROUTINE gammats_vel
+
+ SUBROUTINE gammats_vel_stab( pttbl, pstbl, putbl, pvtbl, pCd, pke2, pqoce, pqfwf, & ! <<== in
+ & pgt , pgs ) ! ==>> out gammats [m/s]
!!----------------------------------------------------------------------
!! ** Purpose : compute the coefficient echange coefficient
@@ -252,5 +251,5 @@
END DO
- END SUBROUTINE gammats_HJ99
+ END SUBROUTINE gammats_vel_stab
END MODULE isfcavgam
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcpl.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcpl.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcpl.F90 (revision 12062)
@@ -25,6 +25,6 @@
PRIVATE
- PUBLIC isfcpl_rst_write, isfcpl_init ! iceshelf restart read and write
- PUBLIC isfcpl_ssh, isfcpl_tra, isfcpl_vol, isfcpl_cons
+ PUBLIC isfcpl_rst_write, isfcpl_init ! iceshelf restart read and write
+ PUBLIC isfcpl_ssh, isfcpl_tra, isfcpl_vol, isfcpl_cons ! iceshelf correction for ssh, tra, dyn and conservation
TYPE isfcons
@@ -48,4 +48,13 @@
SUBROUTINE isfcpl_init()
!!---------------------------------------------------------------------
+ !! *** ROUTINE iscpl_init ***
+ !!
+ !! ** Purpose : correct ocean state for new wet cell and horizontal divergence
+ !! correction for the dynamical adjustement
+ !!
+ !! ** Action : - compute ssh on new wet cell
+ !! - compute T/S on new wet cell
+ !! - compute horizontal divergence correction as a volume flux
+ !! - compute the T/S/vol correction increment to keep trend to 0
!!
!!---------------------------------------------------------------------
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfdiags.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfdiags.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfdiags.F90 (revision 12062)
@@ -1,7 +1,6 @@
MODULE isfdiags
!!======================================================================
- !! *** MODULE sbcisf ***
- !! Surface module : update surface ocean boundary condition under ice
- !! shelf
+ !! *** MODULE isfdiags ***
+ !! ice shelf diagnostics module : manage the 2d and 3d flux outputs from the ice shelf module
!!======================================================================
!! History : 3.2 ! 2011-02 (C.Harris ) Original code isf cav
@@ -35,7 +34,8 @@
SUBROUTINE isf_diags_flx(ktop, kbot, phtbl, pfrac, cdisf, pqfwf, pqoce, pqlat, pqhc)
!!---------------------------------------------------------------------
- !! *** ROUTINE isf_diags_2dto3d ***
+ !! *** ROUTINE isf_diags_flx ***
!!
- !! ** Purpose :
+ !! ** Purpose : manage the 2d and 3d flux outputs of the ice shelf module
+ !! fwf, latent heat flux, heat content flux, oce->ice heat flux
!!
!!----------------------------------------------------------------------
@@ -57,9 +57,9 @@
cvarqhc = 'qhcisf_'//cdisf ; cvarqhc3d = 'qhcisf3d_'//cdisf
!
- ! output 2d melt rate, latent heat and heat content flux
- CALL iom_put( TRIM(cvarqfwf), pqfwf(:,:) ) ! isf mass flux (opposite sign)
- CALL iom_put( TRIM(cvarqoce), pqoce(:,:) ) ! isf oce to ice flux (cpo*gt*dt)
- CALL iom_put( TRIM(cvarqlat), pqlat(:,:) ) ! isf oce to ice flux (cpo*gt*dt)
- CALL iom_put( TRIM(cvarqhc) , pqhc (:,:) ) ! isf heat content flux (cpo*fwf*Tfrz)
+ ! output 2d melt rate, latent heat and heat content flux from the injected water
+ CALL iom_put( TRIM(cvarqfwf), pqfwf(:,:) ) ! mass flux ( >0 out )
+ CALL iom_put( TRIM(cvarqoce), pqoce(:,:) ) ! oce to ice flux ( >0 out )
+ CALL iom_put( TRIM(cvarqlat), pqlat(:,:) ) ! latent heat flux ( >0 out )
+ CALL iom_put( TRIM(cvarqhc) , pqhc (:,:) ) ! heat content flux ( >0 out )
!
! output 3d Diagnostics
@@ -75,5 +75,6 @@
!! *** ROUTINE isf_diags_2dto3d ***
!!
- !! ** Purpose :
+ !! ** Purpose : compute the 3d flux outputs as they are injected into NEMO
+ !! (ie uniformaly spread into the top boundary layer or parametrisation layer)
!!
!!----------------------------------------------------------------------
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfhdiv.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfhdiv.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfhdiv.F90 (revision 12062)
@@ -51,7 +51,10 @@
IF ( ln_isfcpl .AND. kt /= 0 ) THEN
!
- ! correct divergence only for the first time step
+ ! Dynamical stability at start up after change in under ice shelf cavity geometry is achieve by correcting the divergence.
+ ! This is achieved by applying a volume flux in order to keep the horizontal divergence after remapping
+ ! the same as at the end of the latest time step. So correction need to be apply at nit000 (euler time step) and
+ ! half of it at nit000+1 (leap frog time step).
IF ( kt == nit000 ) CALL isf_hdiv_cpl(risfcpl_vol , phdiv)
- IF ( kt == nit000+1 ) CALL isf_hdiv_cpl(risfcpl_vol*0.5_wp, phdiv)
+ IF ( kt == nit000+1 ) CALL isf_hdiv_cpl(risfcpl_vol*0.5_wp, phdiv) ! risfcpl_vol*0.5_wp = 0.5 * (risfcpl_vol_b + risfcpl_vol_n)
!
! correct divergence every time step to remove any trend due to coupling
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfload.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfload.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfload.F90 (revision 12062)
@@ -11,11 +11,11 @@
!!----------------------------------------------------------------------
- USE isf_oce, ONLY: cn_isfload ! ice shelf variables
+ USE isf_oce, ONLY: cn_isfload, rn_isfload_T, rn_isfload_S ! ice shelf variables
- USE dom_oce, ONLY: e3w_n, gdept_n, risfdep, mikt ! vertical scale factor
- USE eosbn2 , ONLY: eos ! eos routine
+ USE dom_oce, ONLY: e3w_n, gdept_n, risfdep, mikt ! vertical scale factor
+ USE eosbn2 , ONLY: eos ! eos routine
- USE lib_mpp, ONLY: ctl_stop ! ctl_stop routine
- USE in_out_manager !
+ USE lib_mpp, ONLY: ctl_stop ! ctl_stop routine
+ USE in_out_manager !
IMPLICIT NONE
@@ -44,6 +44,6 @@
! ice shelf cavity
SELECT CASE ( cn_isfload )
- CASE ( 'isomip' )
- CALL isf_load_isomip ( pisfload )
+ CASE ( 'uniform' )
+ CALL isf_load_uniform ( pisfload )
CASE DEFAULT
CALL ctl_stop('STOP','method cn_isfload to compute ice shelf load does not exist (isomip), check your namelist')
@@ -52,5 +52,5 @@
END SUBROUTINE isf_load
- SUBROUTINE isf_load_isomip( pisfload )
+ SUBROUTINE isf_load_uniform( pisfload )
!!--------------------------------------------------------------------
!! *** SUBROUTINE isf_load ***
@@ -77,6 +77,6 @@
znad = 1._wp !- To use density and not density anomaly
!
- ! !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude)
- zts_top(:,:,jp_tem) = -1.9_wp ; zts_top(:,:,jp_sal) = 34.4_wp
+ ! !- assume water displaced by the ice shelf is at T=rn_isfload_T and S=rn_isfload_S (rude)
+ zts_top(:,:,jp_tem) = rn_isfload_T ; zts_top(:,:,jp_sal) = rn_isfload_S
!
DO jk = 1, jpk !- compute density of the water displaced by the ice shelf
@@ -111,5 +111,5 @@
END DO
!
- END SUBROUTINE isf_load_isomip
+ END SUBROUTINE isf_load_uniform
END MODULE isfload
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfpar.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfpar.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfpar.F90 (revision 12062)
@@ -48,4 +48,11 @@
!!
!! ** Purpose : compute the heat and fresh water due to ice shelf melting/freezing using a parametrisation
+ !!
+ !! ** Comment : in isf_par and all its call tree,
+ !! 'tbl' means parametrisation layer (ie how the far field temperature/salinity is computed)
+ !! instead of in a proper top boundary layer as at the ice shelf ocean interface
+ !! as the action to compute the properties of the tbl or the parametrisation layer are the same,
+ !! (ie average T/S over a specific depth (can be across multiple levels))
+ !! the name tbl was kept.
!!
!!---------------------------------------------------------------------
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfstp.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfstp.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfstp.F90 (revision 12062)
@@ -220,5 +220,9 @@
END IF
- IF (ln_isfcav) WRITE(numout,*) ' Ice shelf load method cn_isfload = ', TRIM(cn_isfload)
+ IF (ln_isfcav) THEN
+ WRITE(numout,*) ' Ice shelf load method cn_isfload = ', TRIM(cn_isfload)
+ WRITE(numout,*) ' Temperature used to compute the ice shelf load = ', rn_isfload_T
+ WRITE(numout,*) ' Salinity used to compute the ice shelf load = ', rn_isfload_S
+ END IF
WRITE(numout,*) ''
FLUSH(numout)
@@ -276,9 +280,11 @@
INTEGER :: ios ! Local integer output status for namelist read
!!----------------------------------------------------------------------
- NAMELIST/namisf/ ln_isf , &
- & ln_isfcav_mlt, cn_isfcav_mlt, cn_gammablk, rn_gammat0, rn_gammas0, rn_htbl, sn_isfcav_fwf, &
- & ln_isfpar_mlt, cn_isfpar_mlt, sn_isfpar_fwf, sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff, &
- & ln_isfcpl , nn_drown, ln_isfcpl_cons, ln_isfdebug, &
- & cn_isfload , cn_isfdir
+ NAMELIST/namisf/ ln_isf , &
+ & cn_gammablk , rn_gammat0 , rn_gammas0 , rn_htbl, sn_isfcav_fwf, &
+ & ln_isfcav_mlt , cn_isfcav_mlt , sn_isfcav_fwf , &
+ & ln_isfpar_mlt , cn_isfpar_mlt , sn_isfpar_fwf , &
+ & sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff, &
+ & ln_isfcpl , nn_drown , ln_isfcpl_cons, ln_isfdebug, &
+ & cn_isfload , rn_isfload_T , rn_isfload_S , cn_isfdir
!!----------------------------------------------------------------------
!
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfutils.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfutils.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfutils.F90 (revision 12062)
@@ -87,7 +87,8 @@
!
! print out
- IF (lwp) WRITE(numout,*) TRIM(cdtxt),' (min, max, sum, tag) : ',zmin, zmax, zsum, itmps
- !
- CALL FLUSH(numout)
+ IF (lwp) THEN
+ WRITE(numout,*) TRIM(cdtxt),' (min, max, sum, tag) : ',zmin, zmax, zsum, itmps
+ CALL FLUSH(numout)
+ END IF
!
END SUBROUTINE debug2d
@@ -130,7 +131,8 @@
!
! print out
- IF (lwp) WRITE(numout,*) TRIM(cdtxt),' (min, max, sum, tag) : ',zmin, zmax, zsum, itmps
- !
- CALL FLUSH(numout)
+ IF (lwp) THEN
+ WRITE(numout,*) TRIM(cdtxt),' (min, max, sum, tag) : ',zmin, zmax, zsum, itmps
+ CALL FLUSH(numout)
+ END IF
!
END SUBROUTINE debug3d
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/TRA/traisf.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/TRA/traisf.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/TRA/traisf.F90 (revision 12062)
@@ -10,14 +10,10 @@
!! tra_isf : update the tracer trend at ocean surface
!!----------------------------------------------------------------------
- USE oce ! ocean dynamics and active tracers
- USE dom_oce ! ocean space domain variables
- USE isf_oce ! Ice shelf variable
- USE phycst ! physical constant
- USE eosbn2 ! Equation Of State
- USE isfutils !
- !
- USE in_out_manager ! I/O manager
- USE iom ! xIOS server
- USE timing ! Timing
+ USE isf_oce ! Ice shelf variables
+ USE oce , ONLY : tsa ! ocean dynamics and active tracers
+ USE dom_oce , ONLY : e3t_n, r1_e1e2t ! ocean space domain variables
+ USE isfutils, ONLY : debug ! debug option
+ USE timing , ONLY : timing_start, timing_stop ! Timing
+ USE in_out_manager ! I/O manager
IMPLICIT NONE
@@ -63,4 +59,10 @@
IF ( ln_isfcpl ) THEN
!
+ ! Dynamical stability at start up after change in under ice shelf cavity geometry is achieve by correcting the divergence.
+ ! This is achieved by applying a volume flux in order to keep the horizontal divergence after remapping
+ ! the same as at the end of the latest time step. So correction need to be apply at nit000 (euler time step) and
+ ! half of it at nit000+1 (leap frog time step).
+ ! in accordance to this, the heat content flux due to injected water need to be added in the temperature and salt trend
+ ! at time step nit000 and nit000+1
IF ( kt == nit000 ) CALL tra_isf_cpl(risfcpl_tsc , tsa)
IF ( kt == nit000+1) CALL tra_isf_cpl(risfcpl_tsc*0.5_wp, tsa)
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/step.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/step.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/step.F90 (revision 12062)
@@ -113,5 +113,5 @@
IF( ln_apr_dyn ) CALL sbc_apr ( kstp ) ! atmospheric pressure (NB: call before bdy_dta which needs ssh_ib)
IF( ln_bdy ) CALL bdy_dta ( kstp, time_offset=+1 ) ! update dynamic & tracer data at open boundaries
- IF( ln_isf ) CALL isf_stp ( kstp )
+ IF( ln_isf ) CALL isf_stp ( kstp ) ! ice shelf/ocean boundary condition
CALL sbc ( kstp ) ! Sea Boundary Condition (including sea-ice)
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/EXPREF/namelist_cfg
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/EXPREF/namelist_cfg (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/EXPREF/namelist_cfg (revision 12062)
@@ -165,5 +165,7 @@
! ---------------- ice shelf load -------------------------------
!
- cn_isfload = 'isomip' ! scheme to compute ice shelf load (ln_isfcav = .true. in domain_cfg.nc)
+ cn_isfload = 'uniform' ! scheme to compute ice shelf load (ln_isfcav = .true. in domain_cfg.nc)
+ rn_isfload_T = -1.0
+ rn_isfload_S = 34.2
!
! ---------------- ice shelf melt formulation -------------------------------
@@ -182,7 +184,8 @@
! ! oasis = fwfisf is given by oasis and pattern by file sn_isfcav_fwf
! ! cn_isfcav_mlt = 2eq or 3eq cases:
- cn_gammablk = 'ad15' ! scheme to compute gammat/s (spe,ad15,hj99)
- ! ! ad15 = velocity dependend Gamma (u* * gammat/s) (Jenkins et al. 2010)
- ! ! hj99 = velocity and stability dependent Gamma (Holland et al. 1999)
+ cn_gammablk = 'vel' ! scheme to compute gammat/s (spe,ad15,hj99)
+ ! ! spe = constant transfert velocity (rn_gammat0, rn_gammas0)
+ ! ! vel = velocity dependent transfert velocity (u* * gammat/s) (Asay-Davis et al. 2016 for a short description)
+ ! ! vel_stab = velocity and stability dependent transfert coeficient (Holland et al. 1999 for a complete description)
rn_gammat0 = 0.0215 ! gammat coefficient used in blk formula
rn_gammas0 = 0.614e-3 ! gammas coefficient used in blk formula
Index: MO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isf.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isf.F90 (revision 12061)
+++ (revision )
@@ -1,264 +1,0 @@
-MODULE isf
- !!======================================================================
- !! *** MODULE sbcisf ***
- !! Surface module : compute iceshelf melt and heat flux
- !!======================================================================
- !! History : 3.2 ! 2011-02 (C.Harris ) Original code isf cav
- !! X.X ! 2006-02 (C. Wang ) Original code bg03
- !! 3.4 ! 2013-03 (P. Mathiot) Merging + parametrization
- !! 4.1 ! 2019-09 (P. Mathiot) Split param/explicit ice shelf and re-organisation
- !!----------------------------------------------------------------------
-
- !!----------------------------------------------------------------------
- !! isf : define and allocate ice shelf variables
- !!----------------------------------------------------------------------
-
- USE in_out_manager, ONLY: wp, jpi,jpj, jpk, jpts ! I/O manager
- USE lib_mpp , ONLY: ctl_stop, mpp_sum ! MPP library
- USE fldread ! read input fields
-
- IMPLICIT NONE
-
- PRIVATE
-
- PUBLIC isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl, isf_dealloc_cpl
- !
- !-------------------------------------------------------
- ! 0 : namelist parameter
- !-------------------------------------------------------
- !
- ! 0.1 -------- ice shelf cavity parameter --------------
- CHARACTER(LEN=256), PUBLIC :: cn_isfdir
- LOGICAL , PUBLIC :: ln_isf
- LOGICAL , PUBLIC :: ln_isfdebug
- !
- ! 0.2 -------- ice shelf cavity opened namelist parameter -------------
- LOGICAL , PUBLIC :: ln_isfcav_mlt !: logical for the use of ice shelf parametrisation
- REAL(wp) , PUBLIC :: rn_gammat0 !: temperature exchange coeficient []
- REAL(wp) , PUBLIC :: rn_gammas0 !: salinity exchange coeficient []
- REAL(wp) , PUBLIC :: rn_vtide !: tidal background velocity (can be different to what is used in the
- REAL(wp) , PUBLIC :: rn_htbl !: Losch top boundary layer thickness [m]
- CHARACTER(LEN=256), PUBLIC :: cn_gammablk !: gamma formulation
- CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt !: melt formulation (cavity/param)
- CHARACTER(LEN=256), PUBLIC :: cn_isfload !: ice shelf load computation method
- TYPE(FLD_N) , PUBLIC :: sn_isfcav_fwf !: information about the isf melting file to be read
- !
- ! 0.3 -------- ice shelf cavity parametrised namelist parameter -------------
- LOGICAL , PUBLIC :: ln_isfpar_mlt !: logical for the computation of melt inside the cavity
- CHARACTER(LEN=256), PUBLIC :: cn_isfpar_mlt !: melt formulation (cavity/param)
- TYPE(FLD_N) , PUBLIC :: sn_isfpar_fwf !: information about the isf melting file to be read
- TYPE(FLD_N) , PUBLIC :: sn_isfpar_zmax !: information about the grounding line depth file to be read
- TYPE(FLD_N) , PUBLIC :: sn_isfpar_zmin !: information about the calving line depth file to be read
- TYPE(FLD_N) , PUBLIC :: sn_isfpar_Leff !: information about the effective length file to be read
- !
- ! 0.4 -------- coupling namelist parameter -------------
- LOGICAL, PUBLIC :: ln_isfcpl !:
- LOGICAL, PUBLIC :: ln_isfcpl_cons !:
- INTEGER, PUBLIC :: nn_drown !:
- !
- !-------------------------------------------------------
- ! 1 : ice shelf parameter
- !-------------------------------------------------------
- !
- REAL(wp), PARAMETER, PUBLIC :: rLfusisf = 0.334e6_wp !: latent heat of fusion of ice shelf [J/kg]
- REAL(wp), PARAMETER, PUBLIC :: rcpisf = 2000.0_wp !: specific heat of ice shelf [J/kg/K]
- REAL(wp), PARAMETER, PUBLIC :: rkappa = 0.0_wp !: ISOMIP+ no heat diffusivity through the ice-shelf [m2/s]
- REAL(wp), PARAMETER, PUBLIC :: rhoisf = 920.0_wp !: volumic mass of ice shelf [kg/m3]
- REAL(wp), PARAMETER, PUBLIC :: rtsurf = -20.0 !: surface temperature [C]
- !
- !-------------------------------------------------------
- ! 2 : ice shelf global variables
- !-------------------------------------------------------
- !
- ! 0.1 -------- ice shelf cavity parameter --------------
- LOGICAL , PUBLIC :: l_isfoasis
- REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfload !: ice shelf load
- REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_oasis
- !
- ! 0.2 -------- ice shelf cavity melt namelist parameter -------------
- INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mskisf_cav !:
- INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt_cav , misfkb_cav !:
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl_cav, rfrac_tbl_cav !:
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_cav , fwfisf_cav_b !: before and now net fwf from the ice shelf [kg/m2/s]
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]
- TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfcav_fwf !:
- !
- REAL(wp) , PUBLIC :: risf_lamb1, risf_lamb2, risf_lamb3 ! freezing point linearization coeficient
- !
- ! 0.3 -------- ice shelf param. melt namelist parameter -------------
- INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mskisf_par !:
- INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt_par , misfkb_par !:
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl_par, rfrac_tbl_par !:
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_par , fwfisf_par_b !: before and now net fwf from the ice shelf [kg/m2/s]
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]
- TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfpar_fwf !:
- !
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf0_tbl_par !: thickness of tbl (initial value) [m]
- REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfLeff !:
- !
- ! 0.4 -------- coupling namelist parameter -------------
- INTEGER , PUBLIC :: nstp_iscpl !:
- REAL(wp), PUBLIC :: rdt_iscpl !:
- REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfcpl_ssh, risfcpl_cons_ssh, risfcpl_cons_ssh_b !:
- REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risfcpl_vol, risfcpl_cons_vol, risfcpl_cons_vol_b !:
- REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: risfcpl_tsc, risfcpl_cons_tsc, risfcpl_cons_tsc_b !:
- !
- !!----------------------------------------------------------------------
- !! NEMO/OCE 4.0 , NEMO Consortium (2018)
- !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
- !! Software governed by the CeCILL license (see ./LICENSE)
- !!----------------------------------------------------------------------
-CONTAINS
-
- SUBROUTINE isf_alloc_par()
- !!---------------------------------------------------------------------
- !! *** ROUTINE isf_alloc_par ***
- !!
- !! ** Purpose :
- !!
- !! ** Method :
- !!
- !!----------------------------------------------------------------------
- INTEGER :: ierr, ialloc
- !!----------------------------------------------------------------------
- ierr = 0 ! set to zero if no array to be allocated
- !
- ALLOCATE(risfLeff(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- ALLOCATE(misfkt_par(jpi,jpj), misfkb_par(jpi,jpj), STAT=ialloc )
- ierr = ierr + ialloc
- !
- ALLOCATE( rfrac_tbl_par(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- ALLOCATE( rhisf_tbl_par(jpi,jpj), rhisf0_tbl_par(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- ALLOCATE( mskisf_par(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- CALL mpp_sum ( 'isf', ierr )
- IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
- !
- END SUBROUTINE isf_alloc_par
-
- SUBROUTINE isf_alloc_cav()
- !!---------------------------------------------------------------------
- !! *** ROUTINE isf_alloc_cav ***
- !!
- !! ** Purpose :
- !!
- !! ** Method :
- !!
- !!----------------------------------------------------------------------
- INTEGER :: ierr, ialloc
- !!----------------------------------------------------------------------
- ierr = 0 ! set to zero if no array to be allocated
- !
- ALLOCATE(misfkt_cav(jpi,jpj), misfkb_cav(jpi,jpj), STAT=ialloc )
- ierr = ierr + ialloc
- !
- ALLOCATE( rfrac_tbl_cav(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- ALLOCATE( rhisf_tbl_cav(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- CALL mpp_sum ( 'isf', ierr )
- IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
- !
- END SUBROUTINE isf_alloc_cav
-
- SUBROUTINE isf_alloc_cpl()
- !!---------------------------------------------------------------------
- !! *** ROUTINE isf_alloc_cpl ***
- !!
- !! ** Purpose : allocate array use for the ice sheet coupling
- !!
- !!----------------------------------------------------------------------
- INTEGER :: ierr, ialloc
- !!----------------------------------------------------------------------
- ierr = 0
- !
- ALLOCATE( risfcpl_ssh(jpi,jpj), risfcpl_tsc(jpi,jpj,jpk,jpts), risfcpl_vol(jpi,jpj,jpk), STAT=ialloc )
- ierr = ierr + ialloc
- !
- risfcpl_tsc(:,:,:,:) = 0.0 ; risfcpl_vol(:,:,:) = 0.0 ; risfcpl_ssh(:,:) = 0.0
-
- IF ( ln_isfcpl_cons) THEN
- ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) ,risfcpl_cons_ssh(jpi,jpj), STAT=ialloc )
- ierr = ierr + ialloc
- !
- risfcpl_cons_tsc(:,:,:,:) = 0.0 ; risfcpl_cons_vol(:,:,:) = 0.0 ; risfcpl_cons_ssh(:,:) = 0.0
- !
- END IF
- !
- CALL mpp_sum ( 'isf', ierr )
- IF( ierr /= 0 ) CALL ctl_stop('STOP','isfcpl: failed to allocate arrays.')
- !
- END SUBROUTINE isf_alloc_cpl
-
- SUBROUTINE isf_dealloc_cpl()
- !!---------------------------------------------------------------------
- !! *** ROUTINE isf_dealloc_cpl ***
- !!
- !! ** Purpose : de-allocate useless public 3d array used for ice sheet coupling
- !!
- !!----------------------------------------------------------------------
- INTEGER :: ierr, ialloc
- !!----------------------------------------------------------------------
- ierr = 0
- !
- DEALLOCATE( risfcpl_ssh, risfcpl_tsc, risfcpl_vol, STAT=ialloc )
- ierr = ierr + ialloc
- !
- CALL mpp_sum ( 'isf', ierr )
- IF( ierr /= 0 ) CALL ctl_stop('STOP','isfcpl: failed to deallocate arrays.')
- !
- END SUBROUTINE isf_dealloc_cpl
-
- SUBROUTINE isf_alloc()
- !!---------------------------------------------------------------------
- !! *** ROUTINE isf_alloc ***
- !!
- !! ** Purpose : allocate array used for the ice shelf cavity (cav and par)
- !!
- !!----------------------------------------------------------------------
- INTEGER :: ierr, ialloc
- !!----------------------------------------------------------------------
- !
- ierr = 0 ! set to zero if no array to be allocated
- !
- ALLOCATE(fwfisf_par(jpi,jpj) , fwfisf_par_b(jpi,jpj), &
- & fwfisf_cav(jpi,jpj) , fwfisf_cav_b(jpi,jpj), &
- & fwfisf_oasis(jpi,jpj), STAT=ialloc )
- ierr = ierr + ialloc
- !
- ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc )
- ierr = ierr + ialloc
- !
- ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc )
- ierr = ierr + ialloc
- !
- ALLOCATE(risfload(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- ALLOCATE( mskisf_cav(jpi,jpj), STAT=ialloc)
- ierr = ierr + ialloc
- !
- CALL mpp_sum ( 'isf', ierr )
- IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
- !
- ! initalisation of fwf and tsc array to 0
- risfload(:,:) = 0.0_wp
- fwfisf_oasis(:,:) = 0.0_wp
- fwfisf_par(:,:) = 0.0_wp ; fwfisf_par_b(:,:) = 0.0_wp
- fwfisf_cav(:,:) = 0.0_wp ; fwfisf_cav_b(:,:) = 0.0_wp
- risf_cav_tsc(:,:,:) = 0.0_wp ; risf_cav_tsc_b(:,:,:) = 0.0_wp
- risf_par_tsc(:,:,:) = 0.0_wp ; risf_par_tsc_b(:,:,:) = 0.0_wp
- !
-
- END SUBROUTINE isf_alloc
-
-END MODULE isf
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isf_oce.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isf_oce.F90 (revision 12062)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isf_oce.F90 (revision 12062)
@@ -0,0 +1,267 @@
+MODULE isf_oce
+ !!======================================================================
+ !! *** MODULE sbcisf ***
+ !! Surface module : compute iceshelf melt and heat flux
+ !!======================================================================
+ !! History : 3.2 ! 2011-02 (C.Harris ) Original code isf cav
+ !! X.X ! 2006-02 (C. Wang ) Original code bg03
+ !! 3.4 ! 2013-03 (P. Mathiot) Merging + parametrization
+ !! 4.1 ! 2019-09 (P. Mathiot) Split param/explicit ice shelf and re-organisation
+ !!----------------------------------------------------------------------
+
+ !!----------------------------------------------------------------------
+ !! isf : define and allocate ice shelf variables
+ !!----------------------------------------------------------------------
+
+ USE par_oce , ONLY: jpi, jpj, jpk
+ USE in_out_manager, ONLY: wp, jpts ! I/O manager
+ USE lib_mpp , ONLY: ctl_stop, mpp_sum ! MPP library
+ USE fldread ! read input fields
+
+ IMPLICIT NONE
+
+ PRIVATE
+
+ PUBLIC isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl, isf_dealloc_cpl
+ !
+ !-------------------------------------------------------
+ ! 0 : namelist parameter
+ !-------------------------------------------------------
+ !
+ ! 0.1 -------- ice shelf cavity parameter --------------
+ CHARACTER(LEN=256), PUBLIC :: cn_isfdir
+ LOGICAL , PUBLIC :: ln_isf
+ LOGICAL , PUBLIC :: ln_isfdebug
+ !
+ ! 0.2 -------- ice shelf cavity opened namelist parameter -------------
+ LOGICAL , PUBLIC :: ln_isfcav_mlt !: logical for the use of ice shelf parametrisation
+ REAL(wp) , PUBLIC :: rn_gammat0 !: temperature exchange coeficient []
+ REAL(wp) , PUBLIC :: rn_gammas0 !: salinity exchange coeficient []
+ REAL(wp) , PUBLIC :: rn_vtide !: tidal background velocity (can be different to what is used in the
+ REAL(wp) , PUBLIC :: rn_htbl !: Losch top boundary layer thickness [m]
+ REAL(wp) , PUBLIC :: rn_isfload_T !:
+ REAL(wp) , PUBLIC :: rn_isfload_S !:
+ CHARACTER(LEN=256), PUBLIC :: cn_gammablk !: gamma formulation
+ CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt !: melt formulation (cavity/param)
+ CHARACTER(LEN=256), PUBLIC :: cn_isfload !: ice shelf load computation method
+ TYPE(FLD_N) , PUBLIC :: sn_isfcav_fwf !: information about the isf melting file to be read
+ !
+ ! 0.3 -------- ice shelf cavity parametrised namelist parameter -------------
+ LOGICAL , PUBLIC :: ln_isfpar_mlt !: logical for the computation of melt inside the cavity
+ CHARACTER(LEN=256), PUBLIC :: cn_isfpar_mlt !: melt formulation (cavity/param)
+ TYPE(FLD_N) , PUBLIC :: sn_isfpar_fwf !: information about the isf melting file to be read
+ TYPE(FLD_N) , PUBLIC :: sn_isfpar_zmax !: information about the grounding line depth file to be read
+ TYPE(FLD_N) , PUBLIC :: sn_isfpar_zmin !: information about the calving line depth file to be read
+ TYPE(FLD_N) , PUBLIC :: sn_isfpar_Leff !: information about the effective length file to be read
+ !
+ ! 0.4 -------- coupling namelist parameter -------------
+ LOGICAL, PUBLIC :: ln_isfcpl !:
+ LOGICAL, PUBLIC :: ln_isfcpl_cons !:
+ INTEGER, PUBLIC :: nn_drown !:
+ !
+ !-------------------------------------------------------
+ ! 1 : ice shelf parameter
+ !-------------------------------------------------------
+ !
+ REAL(wp), PARAMETER, PUBLIC :: rLfusisf = 0.334e6_wp !: latent heat of fusion of ice shelf [J/kg]
+ REAL(wp), PARAMETER, PUBLIC :: rcpisf = 2000.0_wp !: specific heat of ice shelf [J/kg/K]
+ REAL(wp), PARAMETER, PUBLIC :: rkappa = 0.0_wp !: ISOMIP+ no heat diffusivity through the ice-shelf [m2/s]
+ REAL(wp), PARAMETER, PUBLIC :: rhoisf = 920.0_wp !: volumic mass of ice shelf [kg/m3]
+ REAL(wp), PARAMETER, PUBLIC :: rtsurf = -20.0 !: surface temperature [C]
+ !
+ !-------------------------------------------------------
+ ! 2 : ice shelf global variables
+ !-------------------------------------------------------
+ !
+ ! 2.1 -------- ice shelf cavity parameter --------------
+ LOGICAL , PUBLIC :: l_isfoasis
+ REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfload !: ice shelf load
+ REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_oasis
+ !
+ ! 2.2 -------- ice shelf cavity melt namelist parameter -------------
+ INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mskisf_cav !:
+ INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt_cav , misfkb_cav !:
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl_cav, rfrac_tbl_cav !:
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_cav , fwfisf_cav_b !: before and now net fwf from the ice shelf [kg/m2/s]
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]
+ TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfcav_fwf !:
+ !
+ REAL(wp) , PUBLIC :: risf_lamb1, risf_lamb2, risf_lamb3 ! freezing point linearization coeficient
+ !
+ ! 2.3 -------- ice shelf param. melt namelist parameter -------------
+ INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mskisf_par !:
+ INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt_par , misfkb_par !:
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl_par, rfrac_tbl_par !:
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_par , fwfisf_par_b !: before and now net fwf from the ice shelf [kg/m2/s]
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s]
+ TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfpar_fwf !:
+ !
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf0_tbl_par !: thickness of tbl (initial value) [m]
+ REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfLeff !:
+ !
+ ! 2.4 -------- coupling namelist parameter -------------
+ INTEGER , PUBLIC :: nstp_iscpl !:
+ REAL(wp), PUBLIC :: rdt_iscpl !:
+ REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfcpl_ssh, risfcpl_cons_ssh, risfcpl_cons_ssh_b !:
+ REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risfcpl_vol, risfcpl_cons_vol, risfcpl_cons_vol_b !:
+ REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: risfcpl_tsc, risfcpl_cons_tsc, risfcpl_cons_tsc_b !:
+ !
+ !!----------------------------------------------------------------------
+ !! NEMO/OCE 4.0 , NEMO Consortium (2018)
+ !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
+ !! Software governed by the CeCILL license (see ./LICENSE)
+ !!----------------------------------------------------------------------
+CONTAINS
+
+ SUBROUTINE isf_alloc_par()
+ !!---------------------------------------------------------------------
+ !! *** ROUTINE isf_alloc_par ***
+ !!
+ !! ** Purpose :
+ !!
+ !! ** Method :
+ !!
+ !!----------------------------------------------------------------------
+ INTEGER :: ierr, ialloc
+ !!----------------------------------------------------------------------
+ ierr = 0 ! set to zero if no array to be allocated
+ !
+ ALLOCATE(risfLeff(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ ALLOCATE(misfkt_par(jpi,jpj), misfkb_par(jpi,jpj), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ ALLOCATE( rfrac_tbl_par(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ ALLOCATE( rhisf_tbl_par(jpi,jpj), rhisf0_tbl_par(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ ALLOCATE( mskisf_par(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ CALL mpp_sum ( 'isf', ierr )
+ IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
+ !
+ END SUBROUTINE isf_alloc_par
+
+ SUBROUTINE isf_alloc_cav()
+ !!---------------------------------------------------------------------
+ !! *** ROUTINE isf_alloc_cav ***
+ !!
+ !! ** Purpose :
+ !!
+ !! ** Method :
+ !!
+ !!----------------------------------------------------------------------
+ INTEGER :: ierr, ialloc
+ !!----------------------------------------------------------------------
+ ierr = 0 ! set to zero if no array to be allocated
+ !
+ ALLOCATE(misfkt_cav(jpi,jpj), misfkb_cav(jpi,jpj), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ ALLOCATE( rfrac_tbl_cav(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ ALLOCATE( rhisf_tbl_cav(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ CALL mpp_sum ( 'isf', ierr )
+ IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
+ !
+ END SUBROUTINE isf_alloc_cav
+
+ SUBROUTINE isf_alloc_cpl()
+ !!---------------------------------------------------------------------
+ !! *** ROUTINE isf_alloc_cpl ***
+ !!
+ !! ** Purpose : allocate array use for the ice sheet coupling
+ !!
+ !!----------------------------------------------------------------------
+ INTEGER :: ierr, ialloc
+ !!----------------------------------------------------------------------
+ ierr = 0
+ !
+ ALLOCATE( risfcpl_ssh(jpi,jpj), risfcpl_tsc(jpi,jpj,jpk,jpts), risfcpl_vol(jpi,jpj,jpk), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ risfcpl_tsc(:,:,:,:) = 0.0 ; risfcpl_vol(:,:,:) = 0.0 ; risfcpl_ssh(:,:) = 0.0
+
+ IF ( ln_isfcpl_cons) THEN
+ ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) ,risfcpl_cons_ssh(jpi,jpj), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ risfcpl_cons_tsc(:,:,:,:) = 0.0 ; risfcpl_cons_vol(:,:,:) = 0.0 ; risfcpl_cons_ssh(:,:) = 0.0
+ !
+ END IF
+ !
+ CALL mpp_sum ( 'isf', ierr )
+ IF( ierr /= 0 ) CALL ctl_stop('STOP','isfcpl: failed to allocate arrays.')
+ !
+ END SUBROUTINE isf_alloc_cpl
+
+ SUBROUTINE isf_dealloc_cpl()
+ !!---------------------------------------------------------------------
+ !! *** ROUTINE isf_dealloc_cpl ***
+ !!
+ !! ** Purpose : de-allocate useless public 3d array used for ice sheet coupling
+ !!
+ !!----------------------------------------------------------------------
+ INTEGER :: ierr, ialloc
+ !!----------------------------------------------------------------------
+ ierr = 0
+ !
+ DEALLOCATE( risfcpl_ssh, risfcpl_tsc, risfcpl_vol, STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ CALL mpp_sum ( 'isf', ierr )
+ IF( ierr /= 0 ) CALL ctl_stop('STOP','isfcpl: failed to deallocate arrays.')
+ !
+ END SUBROUTINE isf_dealloc_cpl
+
+ SUBROUTINE isf_alloc()
+ !!---------------------------------------------------------------------
+ !! *** ROUTINE isf_alloc ***
+ !!
+ !! ** Purpose : allocate array used for the ice shelf cavity (cav and par)
+ !!
+ !!----------------------------------------------------------------------
+ INTEGER :: ierr, ialloc
+ !!----------------------------------------------------------------------
+ !
+ ierr = 0 ! set to zero if no array to be allocated
+ !
+ ALLOCATE(fwfisf_par(jpi,jpj) , fwfisf_par_b(jpi,jpj), &
+ & fwfisf_cav(jpi,jpj) , fwfisf_cav_b(jpi,jpj), &
+ & fwfisf_oasis(jpi,jpj), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc )
+ ierr = ierr + ialloc
+ !
+ ALLOCATE(risfload(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ ALLOCATE( mskisf_cav(jpi,jpj), STAT=ialloc)
+ ierr = ierr + ialloc
+ !
+ CALL mpp_sum ( 'isf', ierr )
+ IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
+ !
+ ! initalisation of fwf and tsc array to 0
+ risfload(:,:) = 0.0_wp
+ fwfisf_oasis(:,:) = 0.0_wp
+ fwfisf_par(:,:) = 0.0_wp ; fwfisf_par_b(:,:) = 0.0_wp
+ fwfisf_cav(:,:) = 0.0_wp ; fwfisf_cav_b(:,:) = 0.0_wp
+ risf_cav_tsc(:,:,:) = 0.0_wp ; risf_cav_tsc_b(:,:,:) = 0.0_wp
+ risf_par_tsc(:,:,:) = 0.0_wp ; risf_par_tsc_b(:,:,:) = 0.0_wp
+ !
+
+ END SUBROUTINE isf_alloc
+
+END MODULE isf_oce
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isfcavgam.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isfcavgam.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isfcavgam.F90 (revision 12062)
@@ -65,5 +65,5 @@
! gamma is constant (specified in namelist)
! nothing to do
- CASE ('ad15', 'hj99')
+ CASE ('vel', 'vel_stab')
! compute velocity in tbl
CALL isf_tbl(un(:,:,:) ,zutbl(:,:),'U', miku, rhisf_tbl_cav)
@@ -89,8 +89,8 @@
pgt(:,:) = rn_gammat0
pgs(:,:) = rn_gammas0
- CASE ( 'ad15' ) ! gamma is proportional to u*
- CALL gammats_AD15 ( zutbl, zvtbl, rCd0_top, rn_vtide**2, pgt, pgs )
- CASE ( 'hj99' ) ! gamma depends of stability of boundary layer and u*
- CALL gammats_HJ99 (pttbl, pstbl, zutbl, zvtbl, rCd0_top, r_ke0_top, pqoce, pqfwf, pgt, pgs )
+ CASE ( 'vel' ) ! gamma is proportional to u*
+ CALL gammats_vel ( zutbl, zvtbl, rCd0_top, rn_vtide**2, pgt, pgs )
+ CASE ( 'vel_stab' ) ! gamma depends of stability of boundary layer and u*
+ CALL gammats_vel_stab (pttbl, pstbl, zutbl, zvtbl, rCd0_top, r_ke0_top, pqoce, pqfwf, pgt, pgs )
CASE DEFAULT
CALL ctl_stop('STOP','method to compute gamma (cn_gammablk) is unknown (should not see this)')
@@ -115,5 +115,5 @@
!!-----------------------------------------------------------------------------------------------------
!
- SUBROUTINE gammats_AD15(putbl, pvtbl, pCd, pke2, & ! <<== in
+ SUBROUTINE gammats_vel( putbl, pvtbl, pCd, pke2, & ! <<== in
& pgt, pgs ) ! ==>> out gammats [m/s]
!!----------------------------------------------------------------------
@@ -145,8 +145,8 @@
CALL iom_put('isfustar',zustar(:,:))
!
- END SUBROUTINE gammats_AD15
-
- SUBROUTINE gammats_HJ99( pttbl, pstbl, putbl, pvtbl, pCd, pke2, pqoce, pqfwf, & ! <<== in
- & pgt , pgs ) ! ==>> out gammats [m/s]
+ END SUBROUTINE gammats_vel
+
+ SUBROUTINE gammats_vel_stab( pttbl, pstbl, putbl, pvtbl, pCd, pke2, pqoce, pqfwf, & ! <<== in
+ & pgt , pgs ) ! ==>> out gammats [m/s]
!!----------------------------------------------------------------------
!! ** Purpose : compute the coefficient echange coefficient
@@ -252,5 +252,5 @@
END DO
- END SUBROUTINE gammats_HJ99
+ END SUBROUTINE gammats_vel_stab
END MODULE isfcavgam
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isfstp.F90
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isfstp.F90 (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP+/MY_SRC/isfstp.F90 (revision 12062)
@@ -220,5 +220,9 @@
END IF
- IF (ln_isfcav) WRITE(numout,*) ' Ice shelf load method cn_isfload = ', TRIM(cn_isfload)
+ IF (ln_isfcav) THEN
+ WRITE(numout,*) ' Ice shelf load method cn_isfload = ', TRIM(cn_isfload)
+ WRITE(numout,*) ' Temperature used to compute the ice shelf load = ', rn_isfload_T
+ WRITE(numout,*) ' Salinity used to compute the ice shelf load = ', rn_isfload_S
+ END IF
WRITE(numout,*) ''
FLUSH(numout)
@@ -276,9 +280,11 @@
INTEGER :: ios ! Local integer output status for namelist read
!!----------------------------------------------------------------------
- NAMELIST/namisf/ ln_isf , &
- & ln_isfcav_mlt, cn_isfcav_mlt, cn_gammablk, rn_gammat0, rn_gammas0, rn_htbl, sn_isfcav_fwf, &
- & ln_isfpar_mlt, cn_isfpar_mlt, sn_isfpar_fwf, sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff, &
- & ln_isfcpl , nn_drown, ln_isfcpl_cons, ln_isfdebug, rn_vtide, &
- & cn_isfload , cn_isfdir
+ NAMELIST/namisf/ ln_isf , &
+ & cn_gammablk , rn_gammat0 , rn_gammas0 , rn_htbl, sn_isfcav_fwf, &
+ & ln_isfcav_mlt , cn_isfcav_mlt , sn_isfcav_fwf , &
+ & ln_isfpar_mlt , cn_isfpar_mlt , sn_isfpar_fwf , &
+ & sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff, &
+ & ln_isfcpl , nn_drown , ln_isfcpl_cons, ln_isfdebug, rn_vtide, &
+ & cn_isfload , rn_isfload_T , rn_isfload_S , cn_isfdir
!!----------------------------------------------------------------------
!
Index: /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP/EXPREF/namelist_cfg
===================================================================
--- /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP/EXPREF/namelist_cfg (revision 12061)
+++ /NEMO/branches/2019/ENHANCE-02_ISF_nemo/tests/ISOMIP/EXPREF/namelist_cfg (revision 12062)
@@ -150,5 +150,4 @@
! ---------------- ice shelf load -------------------------------
!
- cn_isfload = 'isomip' ! scheme to compute ice shelf load (ln_isfcav = .true. in domain_cfg.nc)
!
! ---------------- ice shelf melt formulation -------------------------------