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 ! I/O manager USE lib_mpp ! MPP library USE fldread ! read input fields IMPLICIT NONE PRIVATE PUBLIC isf_alloc, isf_alloc_par, isf_alloc_cav ! public in order to be able to output then LOGICAL, PUBLIC :: ln_isfpar_mlt !: logical for the computation of melt inside the cavity LOGICAL, PUBLIC :: ln_isfcav_mlt !: logical for the use of ice shelf parametrisation REAL(wp), PUBLIC :: rn_hisf_tbl !: thickness of top boundary layer [m] REAL(wp), PUBLIC :: rn_gammat0 !: temperature exchange coeficient [] REAL(wp), PUBLIC :: rn_gammas0 !: salinity exchange coeficient [] REAL(wp), PUBLIC :: rn_htbl !: Losch top boundary layer thickness [m] CHARACTER(LEN=256), PUBLIC :: cn_isfload !: ice shelf load computation method CHARACTER(LEN=256), PUBLIC :: cn_gammablk !: gamma formulation CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt, cn_isfpar_mlt !: melt formulation (cavity/param) TYPE(FLD_N), PUBLIC :: sn_isfcav_fwf !: information about the isf melting file to be read 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 LOGICAL, PUBLIC :: l_isfcpl ! INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt_par, misfkt_cav !: Level of ice shelf base INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkb_par, misfkb_cav !: Level of ice shelf base ! INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mskisf_par, mskisf_cav !: Level of ice shelf base ! REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfload !: ice shelf load ! REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl_0 !: thickness of tbl (initial value) [m] REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl_cav, rhisf_tbl_par !: thickness of tbl [m] REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rfrac_tbl_cav, rfrac_tbl_par !: fraction of the deepest cell affect by isf tbl [] REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf0_tbl_par ! REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_cpl REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_par, fwfisf_par_b !: net fwf from the ice shelf [kg/m2/s] REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fwfisf_cav, fwfisf_cav_b !: net fwf from the ice shelf [kg/m2/s] ! REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfLeff REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc_b, risf_cav_tsc !: before and now T & S isf contents [K.m/s & PSU.m/s] REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc_b, risf_par_tsc !: before and now T & S isf contents [K.m/s & PSU.m/s] 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 = 1.54e-6_wp !: 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] REAL(wp), PARAMETER, PUBLIC :: risf_eps = 1.e-20_wp REAL(wp), PUBLIC :: risf_lamb1, risf_lamb2, risf_lamb3 ! freezing point linearization coeficient REAL(wp), PUBLIC :: r1_Lfusisf !: 1/rLfusisf TYPE(FLD) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfcav_fwf TYPE(FLD) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfpar_fwf !: Variable used in fldread to read the forcing file (nn_isf == 4 .OR. nn_isf == 3) CHARACTER(len=100), PUBLIC :: cn_dirisf = './' !: Root directory for location of ssr files TYPE(FLD_N) , PUBLIC :: sn_fwfisf !: information about the isf melting file to be read TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_fwfisf TYPE(FLD_N) , PUBLIC :: sn_rnfisf !: information about the isf melting param. file to be read TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnfisf !!---------------------------------------------------------------------- !! 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 ! 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.' ) END SUBROUTINE isf_alloc_cav SUBROUTINE isf_alloc() !!--------------------------------------------------------------------- !! *** ROUTINE isf_alloc *** !! !! ** Purpose : !! !! ** Method : !! !!---------------------------------------------------------------------- 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_cpl(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 ! CALL mpp_sum ( 'isf', ierr ) IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' ) END SUBROUTINE isf_alloc ! END MODULE isf