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

Last change on this file since 11395 was 11395, checked in by mathiot, 2 years ago

ENHANCE-02_ISF_nemo : Initial commit isf simplification (add ISF directory, moved isf routine in and split isf cavity and isf parametrisation, …) (ticket #2142)

  • Property svn:keywords set to Id
File size: 8.5 KB
Line 
1MODULE isfmlt
2   !!======================================================================
3   !!                       ***  MODULE  sbcisf  ***
4   !! Surface module :  compute iceshelf 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   !!   isfmlt       : 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 isf            ! isf variables
33
34   IMPLICIT NONE
35
36   PRIVATE
37
38   PUBLIC   isf_mlt, isf_mlt_init  ! routine called in sbcmod and divhor
39
40   !!----------------------------------------------------------------------
41   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
42   !! $Id$
43   !! Software governed by the CeCILL license (see ./LICENSE)
44   !!----------------------------------------------------------------------
45CONTAINS
46 
47  SUBROUTINE isf_mlt( kt )
48      !!---------------------------------------------------------------------
49      !!                  ***  ROUTINE isf_mlt  ***
50      !!
51      !! ** Purpose :
52      !!
53      !! ** Method  :
54      !!
55      !!----------------------------------------------------------------------
56      INTEGER, INTENT(in) ::   kt   ! ocean time step
57      !!---------------------------------------------------------------------
58      !
59      IF ( ln_isfcav_mlt ) THEN
60         !
61         ! before time step
62         IF ( kt /= nit000 ) THEN
63            risf_cav_tsc_b (:,:,:) = risf_cav_tsc (:,:,:)
64            fwfisf_cav_b(:,:)      = fwfisf_cav(:,:)
65         END IF
66         !
67         ! compute tbl lvl/h
68         CALL isf_tbl_lvl(ht_n, e3t_n, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav)
69         !
70         ! compute ice shelf melt
71         CALL isf_cav( kt, risf_cav_tsc, fwfisf_cav)
72         !
73         ! write restart variables (qoceisf, qhcisf, fwfisf for now and before)
74         IF (lrst_oce) CALL isfrst_write(kt, 'cav', risf_cav_tsc, fwfisf_cav)
75         !
76      END IF
77      !
78      IF ( ln_isfpar_mlt ) THEN
79         !
80         ! before time step
81         IF ( kt /= nit000 ) THEN
82            risf_par_tsc_b (:,:) = risf_par_tsc (:,:)
83            fwfisf_par_b(:,:)    = fwfisf_par(:,:)
84         END IF
85         !
86         ! compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl)
87         CALL isf_tbl_lvl(ht_n, e3t_n, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par)
88         !
89         ! compute ice shelf melt
90         CALL isf_par( kt, risf_par_tsc, fwfisf_par)
91         !
92         ! write restart variables (qoceisf, qhcisf, fwfisf for now and before)
93         IF (lrst_oce) CALL isfrst_write(kt, 'par', risf_par_tsc, fwfisf_par)
94         !
95      END IF
96      !
97   END SUBROUTINE isf_mlt
98
99   SUBROUTINE isf_mlt_init
100      !!---------------------------------------------------------------------
101      !!                  ***  ROUTINE isfmlt_init  ***
102      !!
103      !! ** Purpose :
104      !!
105      !! ** Method  :
106      !!
107      !!----------------------------------------------------------------------
108      INTEGER               :: inum, ierror
109      INTEGER               :: ios                  ! Local integer output status for namelist read
110      INTEGER               :: ikt, ikb
111      INTEGER               :: ji, jj
112      !!----------------------------------------------------------------------
113      NAMELIST/namisf/ ln_isfcav_mlt, cn_isfcav_mlt, cn_gammablk, rn_gammat0, rn_gammas0, rn_htbl, sn_isfcav_fwf,  &
114         &             ln_isfpar_mlt, cn_isfpar_mlt, sn_isfpar_fwf, sn_isfpar_zmin, sn_isfpar_zmax, sn_isfpar_Leff
115      !!----------------------------------------------------------------------
116
117      REWIND( numnam_ref )              ! Namelist namsbc_rnf in reference namelist : Runoffs
118      READ  ( numnam_ref, namisf, IOSTAT = ios, ERR = 901)
119901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namisf in reference namelist', lwp )
120
121      REWIND( numnam_cfg )              ! Namelist namsbc_rnf in configuration namelist : Runoffs
122      READ  ( numnam_cfg, namisf, IOSTAT = ios, ERR = 902 )
123902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namisf in configuration namelist', lwp )
124      IF(lwm) WRITE ( numond, namisf )
125      !
126      IF(lwp) WRITE(numout,*)
127      IF(lwp) WRITE(numout,*) 'isf_init : ice shelf initialisation'
128      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
129      IF(lwp) WRITE(numout,*) '   Namelist namisf :'
130      IF(lwp) WRITE(numout,*) '      melt inside the cavity                  ln_isfcav_mlt   = ', ln_isfcav_mlt
131      IF ( ln_isfcav ) THEN
132         IF(lwp) WRITE(numout,*) '         melt formulation                        cn_isfcav_mlt   = ', cn_isfcav_mlt
133         IF(lwp) WRITE(numout,*) '         thickness of the top boundary layer     rn_htbl     = ', rn_htbl
134         IF(lwp) WRITE(numout,*) '         gamma formulation                       cn_gammablk = ', cn_gammablk 
135         IF ( TRIM(cn_gammablk) .NE. 'spe' ) THEN
136            IF(lwp) WRITE(numout,*) '            gammat coefficient                      rn_gammat0  = ', rn_gammat0 
137            IF(lwp) WRITE(numout,*) '            gammas coefficient                      rn_gammas0  = ', rn_gammas0 
138            IF(lwp) WRITE(numout,*) '            top drag coef. used (from namdrg_top)   rn_Cd0      = ', r_Cdmin_top 
139         END IF
140      END IF
141      IF(lwp) WRITE(numout,*) ''
142      IF(lwp) WRITE(numout,*) '      ice shelf melt parametrisation          ln_isfpar_mlt    = ', ln_isfpar_mlt
143      IF ( ln_isfpar_mlt ) THEN
144         IF(lwp) WRITE(numout,*) '         isf parametrisation formulation         cn_isfpar_mlt   = ', cn_isfpar_mlt
145      END IF
146      IF(lwp) WRITE(numout,*) ''
147      !
148      ! Allocate public array
149      CALL isf_alloc()
150      !
151      ! initialisation
152      ! cav
153      misfkt_cav(:,:)     = mikt(:,:) ; misfkb_cav(:,:)       = mikt(:,:)
154      fwfisf_cav(:,:)     = 0.0_wp    ; fwfisf_cav_b(:,:)     = 0.0_wp
155      rhisf_tbl_cav(:,:)  = 1e-20     ; rfrac_tbl_cav(:,:)    = 0.0_wp
156      risf_cav_tsc(:,:,:) = 0.0_wp    ; risf_cav_tsc_b(:,:,:) = 0.0_wp
157      !
158      mskisf_cav(:,:) = (1._wp - tmask(:,:,1)) * ssmask(:,:)
159      !
160      ! par
161      misfkt_par(:,:)     = 1         ; misfkb_par(:,:)       = 1         
162      fwfisf_par(:,:)     = 0.0_wp    ; fwfisf_par_b(:,:)     = 0.0_wp
163      rhisf_tbl_par(:,:)  = 1e-20     ; rfrac_tbl_par(:,:)    = 0.0_wp
164      risf_par_tsc(:,:,:) = 0.0_wp    ; risf_par_tsc_b(:,:,:) = 0.0_wp
165      !
166      mskisf_par(:,:) = 0
167      !
168      ! initialisation useful variable
169      r1_Lfusisf =  1._wp / rLfusisf
170      !
171      DO jj = 1,jpj
172         DO ji = 1,jpi
173            ikt = mikt(ji,jj)
174            ikb = mbkt(ji,jj)
175            bathy  (ji,jj) = gdepw_0(ji,jj,ikb+1)
176            risfdep(ji,jj) = gdepw_0(ji,jj,ikt  )
177         END DO
178      END DO
179      !
180      IF ( ln_isfcav_mlt ) THEN
181         !
182         ! initialisation  of cav variable
183         CALL isf_cav_init()
184         !
185         ! read cav variable from restart
186         IF ( ln_rstart ) CALL isfrst_read('cav', risf_cav_tsc, fwfisf_cav, risf_cav_tsc_b, fwfisf_cav_b)
187         !
188      END IF
189      !
190      IF ( ln_isfpar_mlt ) THEN
191         !
192         ! initialisation  of par variable
193         CALL isf_par_init()
194         !
195         ! read par variable from restart
196         IF ( ln_rstart ) CALL isfrst_read('par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b)
197         !
198      END IF
199      !
200  END SUBROUTINE isf_mlt_init
201   !!======================================================================
202END MODULE isfmlt
Note: See TracBrowser for help on using the repository browser.