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.
isfparmlt.F90 in NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF – NEMO

source: NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfparmlt.F90 @ 11541

Last change on this file since 11541 was 11541, checked in by mathiot, 5 years ago

ENHANCE-02_ISF: simplify use of ln_isf, add extra comments + minor changes (ticket #2142)

File size: 11.0 KB
RevLine 
[11395]1MODULE isfparmlt
2   !!======================================================================
[11403]3   !!                       ***  MODULE  isfparmlt  ***
[11541]4   !! Ice shelf parametrisation module :  update surface ocean boundary condition under ice
5   !!                   shelf using an ice shelf melt parametrisation
[11395]6   !!======================================================================
7   !! History :  4.0  ! original code
8   !!----------------------------------------------------------------------
9
10   USE oce            ! ocean dynamics and tracers
[11541]11   USE isf            ! ice shelf
12   USE isftbl         ! ice shelf depth average
[11395]13   USE dom_oce        ! ocean space and time domain
14   USE phycst         ! physical constants
15   USE eosbn2         ! equation of state
16
17   USE in_out_manager ! I/O manager
18   USE iom            ! I/O library
[11541]19   USE fldread        !
20   USE lib_fortran    !
[11395]21
22   IMPLICIT NONE
23
24   PRIVATE
25
26   PUBLIC  isfpar_mlt 
27   
28   !!----------------------------------------------------------------------
29   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
30   !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
31   !! Software governed by the CeCILL license (see ./LICENSE)
32   !!----------------------------------------------------------------------
33CONTAINS
34
35! -------------------------------------------------------------------------------------------------------
36! -------------------------------- PUBLIC SUBROUTINE ----------------------------------------------------
37! -------------------------------------------------------------------------------------------------------
38
[11494]39  SUBROUTINE isfpar_mlt( kt, pqhc, pqoce, pqfwf )
[11395]40      !!---------------------------------------------------------------------
[11494]41      !!                  ***  ROUTINE isfpar_mlt  ***
[11395]42      !!
43      !! ** Purpose : Compute Salt and Heat fluxes related to ice_shelf
44      !!              melting and freezing
45      !!
[11403]46      !! ** Method  :  2 parameterizations are available according
47      !!                        1 : Specified melt flux
[11395]48      !!                        2 : Beckmann & Goose parameterization
49      !!----------------------------------------------------------------------
50      !!-------------------------- OUT -------------------------------------
[11494]51      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pqfwf, pqoce, pqhc  ! fresh water, ice-ocean heat and heat content fluxes
[11395]52      !!-------------------------- IN  -------------------------------------
53      INTEGER, INTENT(in) ::   kt   ! ocean time step
54      !!---------------------------------------------------------------------
55      !
56      ! Choose among the available ice shelf parametrisation
57      SELECT CASE ( cn_isfpar_mlt )
58      CASE ( 'spe' )    ! specified runoff in depth (Mathiot et al., 2017 in preparation)
59         CALL isfpar_mlt_spe(kt, pqhc, pqoce, pqfwf)
60      CASE ( 'bg03' )    ! Beckmann and Goosse parametrisation
61         CALL isfpar_mlt_bg03(kt, pqhc, pqoce, pqfwf)
62      CASE ( 'oasis' )
[11403]63         CALL isfpar_mlt_oasis( kt, pqhc, pqoce, pqfwf)
[11395]64      CASE DEFAULT
65         CALL ctl_stop('STOP', 'unknown isf melt formulation : cn_isfpar (should not see this)')
66      END SELECT
67      !
68   END SUBROUTINE isfpar_mlt
69
70! -------------------------------------------------------------------------------------------------------
71! -------------------------------- PRIVATE SUBROUTINE ---------------------------------------------------
72! -------------------------------------------------------------------------------------------------------
73
[11494]74   SUBROUTINE isfpar_mlt_spe(kt, pqhc, pqoce, pqfwf)
[11395]75      !!---------------------------------------------------------------------
[11403]76      !!                  ***  ROUTINE isfpar_mlt_spe  ***
[11395]77      !!
78      !! ** Purpose : prescribed ice shelf melting in case ice shelf cavities are closed.
79      !!              data read into a forcing files.
80      !!
81      !!----------------------------------------------------------------------
82      !!-------------------------- OUT -------------------------------------
[11494]83      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pqhc, pqfwf, pqoce  ! fresh water and ice-ocean heat fluxes
[11395]84      !!-------------------------- IN  -------------------------------------
85      INTEGER,  INTENT(in) :: kt
86      !!--------------------------------------------------------------------
87      INTEGER :: jk
88      REAL(wp), DIMENSION(jpi,jpj,jpk)  :: ztfrz3d
89      REAL(wp), DIMENSION(jpi,jpj)      :: ztfrz
90      !!--------------------------------------------------------------------
91      !
[11403]92      ! 0. ------------Read specified runoff
[11395]93      CALL fld_read ( kt, nn_fsbc, sf_isfpar_fwf   )
94      !
95      ! compute ptfrz
[11403]96      ! 1. ------------Mean freezing point
[11395]97      DO jk = 1,jpk
98         CALL eos_fzp(tsn(:,:,jk,jp_sal), ztfrz3d(:,:,jk), gdept_n(:,:,jk))
99      END DO
[11495]100      CALL isf_tbl(ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
[11395]101      !
102      pqfwf(:,:) = - sf_isfpar_fwf(1)%fnow(:,:,1)      ! fresh water flux from the isf (fwfisf <0 mean melting)
103      pqoce(:,:) =   pqfwf(:,:) * rLfusisf             ! ocean/ice shelf flux assume to be equal to latent heat flux
104      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux
105      !
106   END SUBROUTINE isfpar_mlt_spe
107
108   SUBROUTINE isfpar_mlt_bg03(kt, pqhc, pqoce, pqfwf)
109      !!---------------------------------------------------------------------
[11403]110      !!                  ***  ROUTINE isfpar_mlt_bg03  ***
[11395]111      !!
[11403]112      !! ** Purpose : compute an estimate of ice shelf melting and
113      !!              latent, ocean-ice and heat content heat fluxes
114      !!              in case cavities are closed based on the far fields T and S properties.
[11395]115      !!
[11403]116      !! ** Method  : The ice shelf melt is computed as proportional to the differences between the
117      !!              mean temperature and mean freezing point in front of the ice shelf averaged
118      !!              over the ice shelf min ice shelf draft and max ice shelf draft and the freezing point
[11395]119      !!
120      !! ** Reference : Beckmann and Goosse (2003), "A parameterization of ice shelf-ocean
[11403]121      !!                interaction for climate models", Ocean Modelling 5(2003) 157-170.
[11395]122      !!----------------------------------------------------------------------
123      !!-------------------------- OUT -------------------------------------
[11494]124      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pqhc, pqfwf, pqoce  ! fresh water and ice-ocean heat fluxes
[11395]125      !!-------------------------- IN  -------------------------------------
126      INTEGER,  INTENT(in) :: kt
127      !!--------------------------------------------------------------------
128      INTEGER :: jk
129      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztfrz3d        ! freezing point
130      REAL(wp), DIMENSION(jpi,jpj)     :: ztfrz          ! freezing point
131      REAL(wp), DIMENSION(jpi,jpj)     :: ztavg          ! temperature avg
132      !!----------------------------------------------------------------------
133      !
134      ! 0. ------------Mean freezing point
135      DO jk = 1,jpk
136         CALL eos_fzp(tsn(:,:,jk,jp_sal), ztfrz3d(:,:,jk), gdept_n(:,:,jk))
137      END DO
[11495]138      CALL isf_tbl(ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
[11395]139      !
140      ! 1. ------------Mean temperature
[11495]141      CALL isf_tbl(tsn(:,:,jk,jp_tem), ztavg, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
[11395]142      !
143      ! 2. ------------Net heat flux and fresh water flux due to the ice shelf
[11403]144      pqoce(:,:) =   rau0 * rcp * rn_gammat0 * risfLeff(:,:) * e1t(:,:) * ( ztavg(:,:) - ztfrz(:,:) ) * r1_e1e2t(:,:)
[11541]145      pqfwf(:,:) = - pqoce(:,:) / rLfusisf             ! derived from the latent heat flux
[11395]146      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux
147      !
[11403]148      ! 3. ------------BG03 output
[11395]149      ! output ttbl
[11521]150      CALL iom_put('ttbl_par', ztavg(:,:) * mskisf_par(:,:) )
[11395]151      !
152      ! output thermal driving
[11521]153      CALL iom_put('isfthermald_par',( ztfrz(:,:) - ztavg(:,:) ) * mskisf_par(:,:))
[11395]154      !
155      !
156   END SUBROUTINE isfpar_mlt_bg03
157
[11403]158   SUBROUTINE isfpar_mlt_oasis(kt, pqhc , pqoce, pqfwf )
159      !!----------------------------------------------------------------------
[11541]160      !!                  ***  ROUTINE isfpar_mlt_oasis  ***
[11403]161      !!
162      !! ** Purpose    : scale the fwf read from input file by the total amount received by the sbccpl interface
163      !!
[11494]164      !! ** Purpose    : - read ice shelf melt from forcing file and scale it by the input file total amount => pattern
165      !!                 - compute total amount of fwf given by sbccpl (fwfisf_oasis)
[11403]166      !!                 - scale fwf and compute heat fluxes
167      !!
168      !!---------------------------------------------------------------------
169      !!-------------------------- OUT -------------------------------------
170      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pqhc, pqoce, pqfwf  ! heat content, latent heat and fwf fluxes
171      !!-------------------------- IN  -------------------------------------
172      INTEGER                     , INTENT(in   ) :: kt                  ! current time step
173      !!--------------------------------------------------------------------
174      INTEGER                           :: jk                            ! loop index
[11541]175      REAL(wp)                          :: zfwf_fld, zfwf_oasis          ! total fwf in the forcing fields (pattern) and from the cpl interface (amount)
[11403]176      REAL(wp), DIMENSION(jpi,jpj)      :: ztfrz                         ! tbl freezing temperature
177      REAL(wp), DIMENSION(jpi,jpj)      :: zfwf                          ! 2d fwf map after scaling
178      REAL(wp), DIMENSION(jpi,jpj,jpk)  :: ztfrz3d
179      !!--------------------------------------------------------------------
180      !
181      ! 0. ------------Read specified runoff
182      CALL fld_read ( kt, nn_fsbc, sf_isfpar_fwf   )
183      !
[11541]184      ! 1. ------------Mean freezing point (needed for heat content flux)
[11403]185      DO jk = 1,jpk
186         CALL eos_fzp(tsn(:,:,jk,jp_sal), ztfrz3d(:,:,jk), gdept_n(:,:,jk))
187      END DO
[11495]188      CALL isf_tbl(ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
[11403]189      !
[11541]190      ! 2. ------------Scale isf melt pattern with total amount from oasis
[11403]191      ! ice shelf 2d map
192      zfwf(:,:) = - sf_isfpar_fwf(1)%fnow(:,:,1)
193      !
194      ! compute glob sum from input file
[11425]195      ! (PM) should we consider delay sum as in fwb ? (it will offset by 1 time step if I understood well)
196      zfwf_fld = glob_sum('isfcav_mlt', e1e2t(:,:) * zfwf(:,:))
[11403]197      !
198      ! compute glob sum from atm->oce ice shelf fwf
[11425]199      ! (PM) should we consider delay sum as in fwb ?
200      zfwf_oasis = glob_sum('isfcav_mlt', e1e2t(:,:) * fwfisf_oasis(:,:))
[11403]201      !
202      ! scale fwf
[11423]203      zfwf(:,:) = zfwf(:,:) * zfwf_oasis / zfwf_fld
[11403]204      !
[11541]205      ! i3. -----------Define fwf and qoce
[11403]206      ! ocean heat flux is assume to be equal to the latent heat
207      pqfwf(:,:) =   zfwf(:,:)                         ! fwf                ( >0 out )
208      pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean heat flux    ( >0 out ) (assumed to be the latent heat flux)
209      pqhc (:,:) =   pqfwf(:,:) * ztfrz(:,:) * rcp     ! heat content flux  ( >0 out )
210      !
[11395]211   END SUBROUTINE isfpar_mlt_oasis
212
213END MODULE isfparmlt
Note: See TracBrowser for help on using the repository browser.