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

source: NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfpar.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: 6.7 KB
Line 
1MODULE isfpar
2   !!======================================================================
3   !!                       ***  MODULE  isfpar  ***
4   !! ice shelf module :  update ocean boundary condition under ice
5   !!                   shelf
6   !!======================================================================
7   !! History :  3.2  !  2011-02  (C.Harris  ) Original code isf cav
8   !!            X.X  !  2006-02  (C. Wang   ) Original code bg03
9   !!            3.4  !  2013-03  (P. Mathiot) Merging + parametrization
10   !!            4.1  !  2019-09  (P. Mathiot) Restructuration
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   isfpar       : compute ice shelf melt using a prametrisation of ice shelf cavities
15   !!----------------------------------------------------------------------
16   USE oce            ! ocean dynamics and tracers
17   USE isf            ! ice shelf
18   USE isfutils       !
19   USE isfparmlt      ! ice shelf parametrisation
20   USE isftbl         ! ice shelf depth average
21   USE isfdiags       ! ice shelf diagnostics
22   USE dom_oce        ! ocean space and time domain
23   USE phycst         ! physical constants
24   USE eosbn2         ! equation of state
25   !
26   USE in_out_manager ! I/O manager
27   USE iom            ! I/O library
28   USE fldread        ! read input field at current time step
29   USE lbclnk         !
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   isf_par, isf_par_init
35
36   !!----------------------------------------------------------------------
37   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
38   !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
39   !! Software governed by the CeCILL license (see ./LICENSE)
40   !!----------------------------------------------------------------------
41CONTAINS
42 
43   SUBROUTINE isf_par( kt, ptsc, pqfwf )
44      !!---------------------------------------------------------------------
45      !!                     ***  ROUTINE isf_par ***     
46      !!
47      !! ** Purpose : compute the heat and fresh water due to ice shelf melting/freezing using a parametrisation
48      !!
49      !!---------------------------------------------------------------------
50      !!-------------------------- OUT --------------------------------------
51      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(inout) :: pqfwf
52      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(inout) :: ptsc
53      !!-------------------------- IN  --------------------------------------
54      INTEGER, INTENT(in) ::   kt                                           ! ocean time step
55      !!---------------------------------------------------------------------
56      REAL(wp), DIMENSION(jpi,jpj) :: zqoce, zqhc, zqlat, zqh
57      !!---------------------------------------------------------------------
58      !
59      ! compute heat content, latent heat and melt fluxes (2d)
60      CALL isfpar_mlt( kt, zqhc, zqoce, pqfwf  )
61      !
62      ! compute heat and water flux  (change signe directly in the melt subroutine)
63      pqfwf(:,:) = pqfwf(:,:) * mskisf_par(:,:)
64      zqoce(:,:) = zqoce(:,:) * mskisf_par(:,:)
65      zqhc (:,:) = zqhc(:,:)  * mskisf_par(:,:)
66      !
67      ! compute heat content flux
68      zqlat(:,:) = pqfwf(:,:) * rLfusisf    ! 2d latent heat flux (W/m2)
69      !
70      ! total heat flux
71      zqh(:,:) = ( zqhc (:,:) + zqoce(:,:) )
72      !
73      ! lbclnk on melt and heat fluxes
74      CALL lbc_lnk_multi( 'isfmlt', zqh, 'T', 1., pqfwf, 'T', 1.)
75      !
76      ! output fluxes
77      CALL isf_diags_flx( misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, 'par', pqfwf, zqoce, zqlat, zqhc)
78      !
79      ! set temperature content
80      ptsc(:,:,jp_tem) = zqh(:,:) * r1_rau0_rcp
81      !
82   END SUBROUTINE isf_par
83
84   SUBROUTINE isf_par_init
85      !!---------------------------------------------------------------------
86      !!                  ***  ROUTINE isf_par_init  ***
87      !!
88      !! ** Purpose : initialisation of the variable needed for the parametrisation of ice shelf melt
89      !!
90      !!----------------------------------------------------------------------
91      INTEGER               :: ierr
92      REAL(wp), DIMENSION(jpi,jpj) :: ztblmax, ztblmin
93      !!----------------------------------------------------------------------
94      !
95      ! allocation
96      CALL isf_alloc_par()
97      !
98      ! par
99      misfkt_par(:,:)     = 1         ; misfkb_par(:,:)       = 1         
100      rhisf_tbl_par(:,:)  = 1e-20     ; rfrac_tbl_par(:,:)    = 0.0_wp
101      !
102      mskisf_par(:,:) = 0
103      !
104      ! define isf tbl tickness, top and bottom indice
105      CALL read_2dcstdta(TRIM(sn_isfpar_zmax%clname), TRIM(sn_isfpar_zmax%clvar), ztblmax)
106      CALL read_2dcstdta(TRIM(sn_isfpar_zmin%clname), TRIM(sn_isfpar_zmin%clvar), ztblmin)
107      !
108      ! mask ice shelf parametrisation location
109      ztblmax(:,:) = ztblmax(:,:) * ssmask(:,:)
110      ztblmin(:,:) = ztblmin(:,:) * ssmask(:,:)
111      !
112      ! if param used under an ice shelf overwrite ztblmax by the ice shelf draft
113      WHERE ( risfdep > 0._wp .AND. ztblmin > 0._wp )
114         ztblmin(:,:) = risfdep(:,:)
115      END WHERE
116      !
117      ! compute ktop
118      CALL isf_tbl_ktop(ztblmin, misfkt_par)
119      !
120      ! initial tbl thickness
121      rhisf0_tbl_par(:,:) = ztblmax(:,:) - ztblmin(:,:)
122      !
123      ! define iceshelf parametrisation mask
124      mskisf_par = 0
125      WHERE ( ztblmax > 0._wp )
126         mskisf_par(:,:) = 1._wp
127      END WHERE
128      !
129      ! compute misfkb_par, rhisf_tbl
130      rhisf_tbl_par(:,:) = rhisf0_tbl_par(:,:)
131      CALL isf_tbl_lvl( ht_n * mskisf_par, e3t_n, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
132      !
133      SELECT CASE ( TRIM(cn_isfpar_mlt) )
134         !
135      CASE ( 'spe' )
136         !
137         ALLOCATE( sf_isfpar_fwf(1), STAT=ierr )
138         ALLOCATE( sf_isfpar_fwf(1)%fnow(jpi,jpj,1), sf_isfpar_fwf(1)%fdta(jpi,jpj,1,2) )
139         CALL fld_fill( sf_isfpar_fwf, (/ sn_isfpar_fwf /), cn_isfdir, 'isf_par_init', 'read fresh water flux isf data', 'namisf' )
140         !
141         IF(lwp) WRITE(numout,*)
142         IF(lwp) WRITE(numout,*) '      ==>>>   ice melt read from forcing field (cn_isfmlt_par = spe)'
143         !
144      CASE ( 'bg03' )
145         !
146         IF(lwp) WRITE(numout,*)
147         IF(lwp) WRITE(numout,*) '      ==>>>   bg03 parametrisation (cn_isfmlt_par = bg03)'
148         !
149         ! read effective length
150         CALL read_2dcstdta(TRIM(sn_isfpar_Leff%clname), TRIM(sn_isfpar_Leff%clvar), risfLeff)
151         risfLeff = risfLeff*1000.0_wp           !: convertion in m
152         !
153      CASE ( 'oasis' )
154         !
155         IF(lwp) WRITE(numout,*)
156         IF(lwp) WRITE(numout,*) '      ==>>>    isf melt provided by OASIS (cn_isfmlt_par = oasis)'
157         !
158      CASE DEFAULT
159         CALL ctl_stop( 'sbc_isf_init: wrong value of nn_isf' )
160      END SELECT
161      !
162   END SUBROUTINE isf_par_init
163
164END MODULE isfpar
Note: See TracBrowser for help on using the repository browser.