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

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

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

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

  • Property svn:keywords set to Id
File size: 14.7 KB
Line 
1MODULE isfstp
2   !!======================================================================
3   !!                       ***  MODULE  isfstp  ***
4   !! Surface module :  compute iceshelf load, melt and heat flux
5   !!======================================================================
6   !! History :  3.2  !  2011-02  (C.Harris  ) Original code isf cav
7   !!            X.X  !  2006-02  (C. Wang   ) Original code bg03
8   !!            3.4  !  2013-03  (P. Mathiot) Merging + parametrization
9   !!            4.1  !  2019-09  (P. Mathiot) Split param/explicit ice shelf and re-organisation
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   isfstp       : compute iceshelf melt and heat flux
14   !!----------------------------------------------------------------------
15   USE oce            ! ocean dynamics and tracers
16   USE dom_oce        ! ocean space and time domain
17   USE phycst         ! physical constants
18   USE eosbn2         ! equation of state
19   USE sbc_oce        ! surface boundary condition: ocean fields
20   USE zdfdrg         ! vertical physics: top/bottom drag coef.
21   !
22   USE in_out_manager ! I/O manager
23   USE iom            ! I/O library
24   USE fldread        ! read input field at current time step
25   USE lbclnk         !
26   USE lib_fortran    ! glob_sum
27   !
28   USE isfrst         ! iceshelf restart
29   USE isftbl         ! ice shelf boundary layer
30   USE isfpar         ! ice shelf parametrisation
31   USE isfcav         ! ice shelf cavity
32   USE isfload        ! ice shelf load
33   USE isfcpl         ! isf variables
34   USE isf            ! isf variables
35   USE isfutils
36
37   IMPLICIT NONE
38
39   PRIVATE
40
41   PUBLIC   isf_stp, isf_stp_init  ! routine called in sbcmod and divhor
42
43   !!----------------------------------------------------------------------
44   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
45   !! $Id$
46   !! Software governed by the CeCILL license (see ./LICENSE)
47   !!----------------------------------------------------------------------
48CONTAINS
49 
50  SUBROUTINE isf_stp( kt )
51      !!---------------------------------------------------------------------
52      !!                  ***  ROUTINE isf_stp  ***
53      !!
54      !! ** Purpose : compute total heat flux and total fwf due to ice shelf melt
55      !!
56      !! ** Method  : For each case (parametrisation or explicity cavity) :
57      !!              - define the before fields
58      !!              - compute top boundary layer properties
59      !!                (in case of parametrisation, this is the
60      !!                 depth range model array used to compute mean far fields properties)
61      !!              - compute fluxes
62      !!              - write restart variables
63      !!
64      !!----------------------------------------------------------------------
65      INTEGER, INTENT(in) ::   kt   ! ocean time step
66      !!---------------------------------------------------------------------
67      !
68      IF ( ln_isfcav_mlt ) THEN
69         !
70         ! before time step
71         IF ( kt /= nit000 ) THEN
72            risf_cav_tsc_b (:,:,:) = risf_cav_tsc (:,:,:)
73            fwfisf_cav_b(:,:)      = fwfisf_cav(:,:)
74         END IF
75         !
76         ! compute tbl lvl/h
77         rhisf_tbl_cav(:,:) = rn_htbl * mskisf_cav(:,:)
78         CALL isf_tbl_lvl(ht_n, e3t_n, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav)
79         !
80         ! compute ice shelf melt
81         CALL isf_cav( kt, risf_cav_tsc, fwfisf_cav)
82         !
83         ! write restart variables (risf_cav_tsc, fwfisf for now and before)
84         IF (lrst_oce) CALL isfrst_write(kt, 'cav', risf_cav_tsc, fwfisf_cav)
85         !
86      END IF
87      !
88      IF ( ln_isfpar_mlt ) THEN
89         !
90         ! before time step
91         IF ( kt /= nit000 ) THEN
92            risf_par_tsc_b(:,:,:) = risf_par_tsc(:,:,:)
93            fwfisf_par_b  (:,:)   = fwfisf_par  (:,:)
94         END IF
95         !
96         ! compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
97         rhisf_tbl_par(:,:) = rhisf0_tbl_par(:,:)
98         CALL isf_tbl_lvl(ht_n, e3t_n, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par)
99         !
100         ! compute ice shelf melt
101         CALL isf_par( kt, risf_par_tsc, fwfisf_par)
102         !
103         ! write restart variables (qoceisf, qhcisf, fwfisf for now and before)
104         IF (lrst_oce) CALL isfrst_write(kt, 'par', risf_par_tsc, fwfisf_par)
105         !
106      END IF
107
108      IF ( ln_isfcpl ) THEN
109         !
110         IF (lrst_oce) CALL isfcpl_rst_write(kt)
111         !
112      END IF
113      !
114   END SUBROUTINE isf_stp
115
116   SUBROUTINE isf_stp_init
117      !!---------------------------------------------------------------------
118      !!                  ***  ROUTINE isfstp_init  ***
119      !!
120      !! ** Purpose :   Initialisation of the ice shelf public variables
121      !!
122      !! ** Method  :   Read the namsbc namelist and set derived parameters
123      !!                Call init routines for all other SBC modules that have one
124      !!
125      !! ** Action  : - read namsbc parameters
126      !!              - allocate memory
127      !!              - call cav/param init routine
128      !!----------------------------------------------------------------------
129      INTEGER               :: inum, ierror
130      INTEGER               :: ios                  ! Local integer output status for namelist read
131      INTEGER               :: ikt, ikb
132      INTEGER               :: ji, jj
133      !!----------------------------------------------------------------------
134      NAMELIST/namisf/ ln_isf       ,                                                                               & 
135         &             ln_isfcav_mlt, cn_isfcav_mlt, cn_gammablk, rn_gammat0, rn_gammas0, rn_htbl, sn_isfcav_fwf,   &
136         &             ln_isfpar_mlt, cn_isfpar_mlt, sn_isfpar_fwf, sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff, &
137         &             ln_isfcpl    , nn_drown, ln_isfcpl_cons,                                                     &
138         &             cn_isfload   , cn_isfdir
139      !!----------------------------------------------------------------------
140      !
141      ! Allocate public array
142      CALL isf_alloc()
143      !
144      ! initalisation of fwf and tsc array to 0
145      riceload(:,:)       = 0.0_wp
146      fwfisf_oasis(:,:)   = 0.0_wp
147      fwfisf_par(:,:)     = 0.0_wp    ; fwfisf_par_b(:,:)     = 0.0_wp
148      fwfisf_cav(:,:)     = 0.0_wp    ; fwfisf_cav_b(:,:)     = 0.0_wp
149      risf_cav_tsc(:,:,:) = 0.0_wp    ; risf_cav_tsc_b(:,:,:) = 0.0_wp
150      risf_par_tsc(:,:,:) = 0.0_wp    ; risf_par_tsc_b(:,:,:) = 0.0_wp
151      !
152      REWIND( numnam_ref )              ! Namelist namsbc_rnf in reference namelist : Runoffs
153      READ  ( numnam_ref, namisf, IOSTAT = ios, ERR = 901)
154901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namisf in reference namelist', lwp )
155      !
156      REWIND( numnam_cfg )              ! Namelist namsbc_rnf in configuration namelist : Runoffs
157      READ  ( numnam_cfg, namisf, IOSTAT = ios, ERR = 902 )
158902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namisf in configuration namelist', lwp )
159      IF(lwm) WRITE ( numond, namisf )
160      !
161      IF (lwp) THEN
162         WRITE(numout,*)
163         WRITE(numout,*) 'isf_init : ice shelf initialisation'
164         WRITE(numout,*) '~~~~~~~~~~~~'
165         WRITE(numout,*) '   Namelist namisf :'
166         !
167         WRITE(numout,*) '   ice shelf cavity (open or parametrised)  ln_isf = ', ln_isf
168         !
169         IF ( ln_isf ) THEN
170            WRITE(numout,*) '      melt inside the cavity                  ln_isfcav_mlt   = ', ln_isfcav_mlt
171            IF ( ln_isfcav_mlt) THEN
172               WRITE(numout,*) '         melt formulation                        cn_isfcav_mlt   = ', TRIM(cn_isfcav_mlt)
173               WRITE(numout,*) '         thickness of the top boundary layer     rn_htbl     = ', rn_htbl
174               WRITE(numout,*) '         gamma formulation                       cn_gammablk = ', TRIM(cn_gammablk) 
175               IF ( TRIM(cn_gammablk) .NE. 'spe' ) THEN
176                  WRITE(numout,*) '            gammat coefficient                      rn_gammat0  = ', rn_gammat0 
177                  WRITE(numout,*) '            gammas coefficient                      rn_gammas0  = ', rn_gammas0 
178                  WRITE(numout,*) '            top drag coef. used (from namdrg_top)   rn_Cd0      = ', r_Cdmin_top 
179               END IF
180            END IF
181            WRITE(numout,*) ''
182            !
183            WRITE(numout,*) '      ice shelf melt parametrisation          ln_isfpar_mlt    = ', ln_isfpar_mlt
184            IF ( ln_isfpar_mlt ) THEN
185               WRITE(numout,*) '         isf parametrisation formulation         cn_isfpar_mlt   = ', TRIM(cn_isfpar_mlt)
186            END IF
187            WRITE(numout,*) ''
188            !
189            WRITE(numout,*) '      Coupling to an ice sheet model          ln_isfcpl        = ', ln_isfcpl
190            IF ( ln_isfcpl ) THEN
191               WRITE(numout,*) '         conservation activated ln_isfcpl_cons           = ', ln_isfcpl_cons
192               WRITE(numout,*) '            number of call of the extrapolation loop = ', nn_drown
193            ENDIF
194            WRITE(numout,*) ''
195            !
196         ELSE
197
198            IF ( ln_isfcav ) THEN
199               WRITE(numout,*) ''
200               WRITE(numout,*) '   W A R N I N G: ice shelf cavities are open BUT no melt will be computed or read from file !'
201               WRITE(numout,*) ''
202            END IF
203         END IF
204
205         IF (ln_isfcav) WRITE(numout,*) '      Ice shelf load method                   cn_isfload        = ', TRIM(cn_isfload)
206         WRITE(numout,*) ''
207
208      END IF
209      !
210      !---------------------------------------------------------------------------------------------------------------------
211      ! initialisation ice shelf load
212      IF ( ln_isfcav ) THEN
213         !
214         ! compute ice shelf mask
215         mskisf_cav(:,:) = (1._wp - tmask(:,:,1)) * ssmask(:,:)
216         !
217         ! compute ice shelf load
218         CALL isf_load( risfload )
219         !
220      END IF
221      !
222      !---------------------------------------------------------------------------------------------------------------------
223      ! sanity check
224      ! melt in the cavity without cavity
225      IF ( ln_isfcav_mlt .AND. (.NOT. ln_isfcav) ) &
226         &   CALL ctl_stop('ice shelf melt in the cavity activated (ln_isfcav_mlt) but no cavity detected in domcfg (ln_isfcav), STOP' )
227      !
228      ! ice sheet coupling without cavity
229      IF ( ln_isfcpl .AND. (.NOT. ln_isfcav) ) &
230         &   CALL ctl_stop('coupling with an ice sheet model detected (ln_isfcpl) but no cavity detected in domcfg (ln_isfcav), STOP' )
231      !
232      IF ( ln_isfcpl .AND. ln_isfcpl_cons .AND. ln_linssh ) &
233         &   CALL ctl_stop( 'The coupling between NEMO and an ice sheet model with the conservation option does not work with the linssh option' )
234      !
235      IF ( l_isfoasis ) THEN
236         !
237         CALL ctl_stop( ' ln_ctl and ice shelf not tested' )
238         !
239         ! NEMO coupled to ATMO model with isf cavity need oasis method for melt computation
240         IF ( ln_isfcav_mlt .AND. TRIM(cn_isfcav_mlt) /= 'oasis' ) CALL ctl_stop( 'cn_isfcav_mlt = oasis is the only option availble if fwf send by oasis' )
241         IF ( ln_isfpar_mlt .AND. TRIM(cn_isfpar_mlt) /= 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis is the only option availble if fwf send by oasis' )
242         !
243         ! oasis melt computation not tested (coded but not tested)
244         IF ( ln_isfcav_mlt .OR. ln_isfpar_mlt ) THEN
245            IF ( TRIM(cn_isfcav_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfcav_mlt = oasis not tested' )
246            IF ( TRIM(cn_isfpar_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis not tested' )
247         END IF
248         !
249         ! oasis melt computation with cavity open and cavity parametrised (not coded)
250         IF ( ln_isfcav_mlt .AND. ln_isfpar_mlt ) THEN
251            IF ( TRIM(cn_isfpar_mlt) == 'oasis' .AND. TRIM(cn_isfcav_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis and cn_isfcav_mlt = oasis not coded' )
252         END IF
253      END IF
254      !
255      ! terminate routine now if no ice shelf melt formulation specify
256      IF ( ln_isf ) THEN
257         !
258         !---------------------------------------------------------------------------------------------------------------------
259         ! initialisation melt in the cavity
260         IF ( ln_isfcav_mlt ) THEN
261            !
262            ! initialisation  of cav variable
263            CALL isf_cav_init()
264            !
265            ! read cav variable from restart
266            IF ( ln_rstart ) CALL isfrst_read('cav', risf_cav_tsc, fwfisf_cav, risf_cav_tsc_b, fwfisf_cav_b)
267            !
268         END IF
269         !
270         !---------------------------------------------------------------------------------------------------------------------
271         ! initialisation parametrised melt
272         IF ( ln_isfpar_mlt ) THEN
273            !
274            ! initialisation  of par variable
275            CALL isf_par_init()
276            !
277            ! read par variable from restart
278            IF ( ln_rstart ) CALL isfrst_read('par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b)
279            !
280         END IF
281         !
282         !---------------------------------------------------------------------------------------------------------------------
283         ! initialisation ice sheet coupling
284         IF( ln_isfcpl ) THEN
285            !
286            ! prepare writing restart
287            IF( lwxios ) CALL iom_set_rstw_var_active('ssmask')
288            IF( lwxios ) CALL iom_set_rstw_var_active('tmask')
289            IF( lwxios ) CALL iom_set_rstw_var_active('e3t_n')
290            IF( lwxios ) CALL iom_set_rstw_var_active('e3u_n')
291            IF( lwxios ) CALL iom_set_rstw_var_active('e3v_n')
292            !
293            IF( ln_rstart ) THEN
294               !
295               CALL isf_alloc_cpl()
296               !
297               ! extrapolation tracer properties
298               CALL isfcpl_tra()
299               !
300               ! correction of the horizontal divergence and associated temp. and salt content flux
301               CALL isfcpl_vol()
302               !
303               ! apply the 'conservation' method
304               IF ( ln_isfcpl_cons ) CALL isfcpl_cons()
305               !
306               ! Need to : - include in the cpl cons the risfcpl_vol/tsc contribution
307               !           - decide how to manage thickness level change in conservation
308               !
309               tsb    (:,:,:,:) = tsn (:,:,:,:)
310               sshb   (:,:)     = sshn(:,:)
311               ub     (:,:,:)   = un(:,:,:)
312               vb     (:,:,:)   = vn(:,:,:)
313               !
314            END IF
315            !
316         END IF
317         !
318      END IF
319         
320  END SUBROUTINE isf_stp_init
321   !!======================================================================
322END MODULE isfstp
Note: See TracBrowser for help on using the repository browser.