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

Last change on this file since 11423 was 11423, checked in by mathiot, 15 months ago

ENHANCE-02_ISF_nemo : add UKESM ice sheet coupling method (ticket #2142)

  • Property svn:keywords set to Id
File size: 13.4 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
36   IMPLICIT NONE
37
38   PRIVATE
39
40   PUBLIC   isf_stp, isf_stp_init  ! routine called in sbcmod and divhor
41
42   !!----------------------------------------------------------------------
43   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
44   !! $Id$
45   !! Software governed by the CeCILL license (see ./LICENSE)
46   !!----------------------------------------------------------------------
47CONTAINS
48 
49  SUBROUTINE isf_stp( kt )
50      !!---------------------------------------------------------------------
51      !!                  ***  ROUTINE isf_stp  ***
52      !!
53      !! ** Purpose : compute total heat flux and total fwf due to ice shelf melt
54      !!
55      !! ** Method  : For each case (parametrisation or explicity cavity) :
56      !!              - define the before fields
57      !!              - compute top boundary layer properties
58      !!                (in case of parametrisation, this is the
59      !!                 depth range model array used to compute mean far fields properties)
60      !!              - compute fluxes
61      !!              - write restart variables
62      !!
63      !!----------------------------------------------------------------------
64      INTEGER, INTENT(in) ::   kt   ! ocean time step
65      !!---------------------------------------------------------------------
66      !
67      IF ( ln_isfcav_mlt ) THEN
68         !
69         ! before time step
70         IF ( kt /= nit000 ) THEN
71            risf_cav_tsc_b (:,:,:) = risf_cav_tsc (:,:,:)
72            fwfisf_cav_b(:,:)      = fwfisf_cav(:,:)
73         END IF
74         !
75         ! compute tbl lvl/h
76         CALL isf_tbl_lvl(ht_n, e3t_n, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav)
77         !
78         ! compute ice shelf melt
79         CALL isf_cav( kt, risf_cav_tsc, fwfisf_cav)
80         !
81         ! write restart variables (qoceisf, qhcisf, fwfisf for now and before)
82         IF (lrst_oce) CALL isfrst_write(kt, 'cav', risf_cav_tsc, fwfisf_cav)
83         !
84      END IF
85      !
86      IF ( ln_isfpar_mlt ) THEN
87         !
88         ! before time step
89         IF ( kt /= nit000 ) THEN
90            risf_par_tsc_b(:,:,:) = risf_par_tsc(:,:,:)
91            fwfisf_par_b  (:,:)   = fwfisf_par  (:,:)
92         END IF
93         !
94         ! compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
95         CALL isf_tbl_lvl(ht_n, e3t_n, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par)
96         !
97         ! compute ice shelf melt
98         CALL isf_par( kt, risf_par_tsc, fwfisf_par)
99         !
100         ! write restart variables (qoceisf, qhcisf, fwfisf for now and before)
101         IF (lrst_oce) CALL isfrst_write(kt, 'par', risf_par_tsc, fwfisf_par)
102         !
103      END IF
104
105      IF ( ln_isfcpl ) THEN
106         IF (lrst_oce) CALL isfcpl_rst_write(kt)
107      END IF
108      !
109   END SUBROUTINE isf_stp
110
111   SUBROUTINE isf_stp_init
112      !!---------------------------------------------------------------------
113      !!                  ***  ROUTINE isfstp_init  ***
114      !!
115      !! ** Purpose :   Initialisation of the ice shelf public variables
116      !!
117      !! ** Method  :   Read the namsbc namelist and set derived parameters
118      !!                Call init routines for all other SBC modules that have one
119      !!
120      !! ** Action  : - read namsbc parameters
121      !!              - allocate memory
122      !!              - call cav/param init routine
123      !!----------------------------------------------------------------------
124      INTEGER               :: inum, ierror
125      INTEGER               :: ios                  ! Local integer output status for namelist read
126      INTEGER               :: ikt, ikb
127      INTEGER               :: ji, jj
128      !!----------------------------------------------------------------------
129      NAMELIST/namisf/ ln_isfcav_mlt, cn_isfcav_mlt, cn_gammablk, rn_gammat0, rn_gammas0, rn_htbl, sn_isfcav_fwf,   &
130         &             ln_isfpar_mlt, cn_isfpar_mlt, sn_isfpar_fwf, sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff, &
131         &             ln_isfcpl    , nn_drown, ln_isfcpl_cons,                                                     &
132         &             cn_isfload   , cn_isfdir
133      !!----------------------------------------------------------------------
134      !
135      ! Allocate public array
136      CALL isf_alloc()
137      !
138      riceload(:,:)       = 0.0_wp
139      fwfisf_oasis(:,:)   = 0.0_wp
140      fwfisf_par(:,:)     = 0.0_wp    ; fwfisf_par_b(:,:)     = 0.0_wp
141      fwfisf_cav(:,:)     = 0.0_wp    ; fwfisf_cav_b(:,:)     = 0.0_wp
142      risf_cav_tsc(:,:,:) = 0.0_wp    ; risf_cav_tsc_b(:,:,:) = 0.0_wp
143      risf_par_tsc(:,:,:) = 0.0_wp    ; risf_par_tsc_b(:,:,:) = 0.0_wp
144      !
145      ! terminate routine now if no ice shelf melt formulation specify
146      IF ( .NOT. ln_isf ) RETURN
147      !
148      REWIND( numnam_ref )              ! Namelist namsbc_rnf in reference namelist : Runoffs
149      READ  ( numnam_ref, namisf, IOSTAT = ios, ERR = 901)
150901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namisf in reference namelist', lwp )
151      !
152      REWIND( numnam_cfg )              ! Namelist namsbc_rnf in configuration namelist : Runoffs
153      READ  ( numnam_cfg, namisf, IOSTAT = ios, ERR = 902 )
154902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namisf in configuration namelist', lwp )
155      IF(lwm) WRITE ( numond, namisf )
156      !
157      IF (lwp) THEN
158         WRITE(numout,*)
159         WRITE(numout,*) 'isf_init : ice shelf initialisation'
160         WRITE(numout,*) '~~~~~~~~~~~~'
161         WRITE(numout,*) '   Namelist namisf :'
162         !
163         WRITE(numout,*) '      melt inside the cavity                  ln_isfcav_mlt   = ', ln_isfcav_mlt
164         IF ( ln_isfcav ) THEN
165            WRITE(numout,*) '         melt formulation                        cn_isfcav_mlt   = ', TRIM(cn_isfcav_mlt)
166            WRITE(numout,*) '         thickness of the top boundary layer     rn_htbl     = ', rn_htbl
167            WRITE(numout,*) '         gamma formulation                       cn_gammablk = ', TRIM(cn_gammablk) 
168            IF ( TRIM(cn_gammablk) .NE. 'spe' ) THEN
169               WRITE(numout,*) '            gammat coefficient                      rn_gammat0  = ', rn_gammat0 
170               WRITE(numout,*) '            gammas coefficient                      rn_gammas0  = ', rn_gammas0 
171               WRITE(numout,*) '            top drag coef. used (from namdrg_top)   rn_Cd0      = ', r_Cdmin_top 
172            END IF
173         END IF
174         WRITE(numout,*) ''
175         !
176         WRITE(numout,*) '      ice shelf melt parametrisation          ln_isfpar_mlt    = ', ln_isfpar_mlt
177         IF ( ln_isfpar_mlt ) THEN
178            WRITE(numout,*) '         isf parametrisation formulation         cn_isfpar_mlt   = ', TRIM(cn_isfpar_mlt)
179         END IF
180         WRITE(numout,*) ''
181         !
182         WRITE(numout,*) '      Coupling to an ice sheet model          ln_isfcpl         = ', ln_isfcpl
183         IF ( ln_isfcpl ) THEN
184            WRITE(numout,*) '         conservation activated ln_isfcpl_cons           = ', ln_isfcpl_cons
185            WRITE(numout,*) '            number of call of the extrapolation loop = ', nn_drown
186         ENDIF
187         !
188         WRITE(numout,*) '      Ice shelf load method                   cn_isfload        = ', TRIM(cn_isfload)
189
190      END IF
191      !
192      !---------------------------------------------------------------------------------------------------------------------
193      ! sanity check
194      ! melt in the cavity without cavity
195      IF ( ln_isfcav_mlt .AND. (.NOT. ln_isfcav) ) &
196         &   CALL ctl_stop('ice shelf melt in the cavity activated (ln_isfcav_mlt) but no cavity detected in domcfg (ln_isfcav), STOP' )
197      !
198      IF ( ln_isfcpl .AND. ln_isfcpl_cons .AND. ln_linssh ) &
199         &   CALL ctl_stop( 'The coupling between NEMO and an ice sheet model with the conservation option does not work with the linssh option' )
200      !
201      IF ( l_isfoasis ) THEN
202         !
203         CALL ctl_stop( ' ln_ctl and ice shelf not tested' )
204         !
205         ! NEMO coupled to ATMO model with isf cavity need oasis method for melt computation
206         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' )
207         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' )
208         !
209         ! oasis melt computation not tested (coded but not tested)
210         IF ( ln_isfcav_mlt .OR. ln_isfpar_mlt ) THEN
211            IF ( TRIM(cn_isfcav_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfcav_mlt = oasis not tested' )
212            IF ( TRIM(cn_isfpar_mlt) == 'oasis' ) CALL ctl_stop( 'cn_isfpar_mlt = oasis not tested' )
213         END IF
214         !
215         ! oasis melt computation with cavity open and cavity parametrised (not coded)
216         IF ( ln_isfcav_mlt .AND. ln_isfpar_mlt ) THEN
217            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' )
218         END IF
219      END IF
220      !
221      !---------------------------------------------------------------------------------------------------------------------
222      ! initialisation ice shelf load
223      IF ( ln_isfcav ) THEN
224         !
225         ! compute ice shelf mask
226         mskisf_cav(:,:) = (1._wp - tmask(:,:,1)) * ssmask(:,:)
227         !
228         ! compute ice shelf load
229         CALL isf_load( risfload )
230         !
231      END IF
232      !
233      ! initialisation useful variable
234      r1_Lfusisf =  1._wp / rLfusisf
235      !
236      ll_isfcpl     = .FALSE.
237      ll_isfcpl_cons= .FALSE.
238      !
239      ! initialisation melt in the cavity
240      IF ( ln_isfcav_mlt ) THEN
241         !
242         ! initialisation  of cav variable
243         CALL isf_cav_init()
244         !
245         ! read cav variable from restart
246         IF ( ln_rstart ) CALL isfrst_read('cav', risf_cav_tsc, fwfisf_cav, risf_cav_tsc_b, fwfisf_cav_b)
247         !
248      END IF
249      !
250      !---------------------------------------------------------------------------------------------------------------------
251      ! initialisation parametrised melt
252      IF ( ln_isfpar_mlt ) THEN
253         !
254         ! initialisation  of par variable
255         CALL isf_par_init()
256         !
257         ! read par variable from restart
258         IF ( ln_rstart ) CALL isfrst_read('par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b)
259         !
260      END IF
261      !
262      !---------------------------------------------------------------------------------------------------------------------
263      ! initialisation ice sheet coupling
264      IF( ln_isfcpl ) THEN
265
266         ! prepare writing restart
267         IF( lwxios ) CALL iom_set_rstw_var_active('ssmask')
268         IF( lwxios ) CALL iom_set_rstw_var_active('tmask')
269         IF( lwxios ) CALL iom_set_rstw_var_active('e3t_n')
270         IF( lwxios ) CALL iom_set_rstw_var_active('e3u_n')
271         IF( lwxios ) CALL iom_set_rstw_var_active('e3v_n')
272
273         IF( ln_rstart ) THEN
274            !
275            ll_isfcpl = .TRUE.
276            !
277            CALL isf_alloc_cpl()
278            !
279            ! extrapolation tracer properties
280            CALL isfcpl_tra()
281            !
282            ! correction of the horizontal divergence and associated temp. and salt content flux
283            CALL isfcpl_vol()
284            !
285            ! apply the 'conservation' method
286            IF ( ln_isfcpl_cons )  THEN
287               ll_isfcpl_cons = .TRUE.
288               CALL isfcpl_cons()
289            END IF
290            !
291            ! Need to include in the cpl cons the isfrst_cpl_div contribution
292            ! decide how to manage thickness level change in conservation
293            !
294            tsb    (:,:,:,:) = tsn (:,:,:,:)
295            sshb   (:,:)     = sshn(:,:)
296            !
297         END IF
298      END IF
299         
300  END SUBROUTINE isf_stp_init
301   !!======================================================================
302END MODULE isfstp
Note: See TracBrowser for help on using the repository browser.