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

Last change on this file since 11987 was 11987, checked in by mathiot, 10 months ago

ENHANCE-02_ISF_nemo: changes needed after Dave's review

File size: 12.7 KB
Line 
1MODULE isf_oce
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   !!   isf          : define and allocate ice shelf variables
14   !!----------------------------------------------------------------------
15
16   USE par_oce       , ONLY: jpi, jpj, jpk
17   USE in_out_manager, ONLY: wp, jpts ! I/O manager
18   USE lib_mpp       , ONLY: ctl_stop, mpp_sum      ! MPP library
19   USE fldread        ! read input fields
20
21   IMPLICIT NONE
22
23   PRIVATE
24
25   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav, isf_alloc_cpl, isf_dealloc_cpl
26   !
27   !-------------------------------------------------------
28   ! 0 :              namelist parameter
29   !-------------------------------------------------------
30   !
31   ! 0.1 -------- ice shelf cavity parameter --------------
32   CHARACTER(LEN=256), PUBLIC :: cn_isfdir
33   LOGICAL           , PUBLIC :: ln_isf
34   LOGICAL           , PUBLIC :: ln_isfdebug
35   !
36   ! 0.2 -------- ice shelf cavity opened namelist parameter -------------
37   LOGICAL           , PUBLIC :: ln_isfcav_mlt   !: logical for the use of ice shelf parametrisation
38   REAL(wp)          , PUBLIC :: rn_gammat0      !: temperature exchange coeficient    []
39   REAL(wp)          , PUBLIC :: rn_gammas0      !: salinity    exchange coeficient    []
40   REAL(wp)          , PUBLIC :: rn_htbl         !: Losch top boundary layer thickness [m]
41   CHARACTER(LEN=256), PUBLIC :: cn_gammablk     !: gamma formulation
42   CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt   !: melt formulation (cavity/param)
43   CHARACTER(LEN=256), PUBLIC :: cn_isfload      !: ice shelf load computation method
44   TYPE(FLD_N)       , PUBLIC :: sn_isfcav_fwf   !: information about the isf melting file to be read
45   !
46   ! 0.3 -------- ice shelf cavity parametrised namelist parameter -------------
47   LOGICAL           , PUBLIC :: ln_isfpar_mlt   !: logical for the computation of melt inside the cavity
48   CHARACTER(LEN=256), PUBLIC :: cn_isfpar_mlt   !: melt formulation (cavity/param)
49   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_fwf   !: information about the isf melting file to be read
50   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_zmax  !: information about the grounding line depth file to be read
51   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_zmin  !: information about the calving   line depth file to be read
52   TYPE(FLD_N)       , PUBLIC :: sn_isfpar_Leff  !: information about the effective length     file to be read
53   !
54   ! 0.4 -------- coupling namelist parameter -------------
55   LOGICAL, PUBLIC :: ln_isfcpl      !:
56   LOGICAL, PUBLIC :: ln_isfcpl_cons !:
57   INTEGER, PUBLIC :: nn_drown       !:
58   !
59   !-------------------------------------------------------
60   ! 1 :              ice shelf parameter
61   !-------------------------------------------------------
62   !
63   REAL(wp), PARAMETER, PUBLIC :: rLfusisf = 0.334e6_wp    !: latent heat of fusion of ice shelf     [J/kg]
64   REAL(wp), PARAMETER, PUBLIC :: rcpisf = 2000.0_wp       !: specific heat of ice shelf             [J/kg/K]
65   REAL(wp), PARAMETER, PUBLIC :: rkappa = 1.54e-6_wp      !: heat diffusivity through the ice-shelf [m2/s]
66   REAL(wp), PARAMETER, PUBLIC :: rhoisf = 920.0_wp        !: volumic mass of ice shelf              [kg/m3]
67   REAL(wp), PARAMETER, PUBLIC :: rtsurf = -20.0           !: surface temperature                    [C]
68   !
69   !-------------------------------------------------------
70   ! 2 :              ice shelf global variables
71   !-------------------------------------------------------
72   !
73   ! 2.1 -------- ice shelf cavity parameter --------------
74   LOGICAL , PUBLIC            :: l_isfoasis
75   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   risfload                    !: ice shelf load
76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)    ::   fwfisf_oasis
77   !
78   ! 2.2 -------- ice shelf cavity melt namelist parameter -------------
79   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_cav                    !:
80   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_cav   , misfkb_cav     !:
81   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_cav, rfrac_tbl_cav  !:
82   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_cav   , fwfisf_cav_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
83   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_cav_tsc , risf_cav_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s] 
84   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfcav_fwf                 !:
85   !
86   REAL(wp) , PUBLIC                                      :: risf_lamb1, risf_lamb2, risf_lamb3  ! freezing point linearization coeficient
87   !
88   ! 2.3 -------- ice shelf param. melt namelist parameter -------------
89   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: mskisf_par                    !:
90   INTEGER  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: misfkt_par   , misfkb_par     !:
91   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf_tbl_par, rfrac_tbl_par  !:
92   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: fwfisf_par   , fwfisf_par_b   !: before and now net fwf from the ice shelf        [kg/m2/s]
93   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_par_tsc , risf_par_tsc_b !: before and now T & S isf contents [K.m/s & PSU.m/s] 
94   TYPE(FLD), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)     :: sf_isfpar_fwf                 !:
95   !
96   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: rhisf0_tbl_par                !: thickness of tbl (initial value)  [m]
97   REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: risfLeff                      !:
98   !
99   ! 2.4 -------- coupling namelist parameter -------------
100   INTEGER , PUBLIC                                        ::   nstp_iscpl   !:
101   REAL(wp), PUBLIC                                        ::   rdt_iscpl    !:
102   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   risfcpl_ssh, risfcpl_cons_ssh, risfcpl_cons_ssh_b               !:
103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol, risfcpl_cons_vol_b  !:
104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc, risfcpl_cons_tsc_b  !:
105   !
106   !!----------------------------------------------------------------------
107   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
108   !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
109   !! Software governed by the CeCILL license (see ./LICENSE)
110   !!----------------------------------------------------------------------
111CONTAINS
112
113   SUBROUTINE isf_alloc_par()
114      !!---------------------------------------------------------------------
115      !!                  ***  ROUTINE isf_alloc_par  ***
116      !!
117      !! ** Purpose :
118      !!
119      !! ** Method  :
120      !!
121      !!----------------------------------------------------------------------
122      INTEGER :: ierr, ialloc
123      !!----------------------------------------------------------------------
124      ierr = 0       ! set to zero if no array to be allocated
125      !
126      ALLOCATE(risfLeff(jpi,jpj), STAT=ialloc)
127      ierr = ierr + ialloc
128      !
129      ALLOCATE(misfkt_par(jpi,jpj), misfkb_par(jpi,jpj), STAT=ialloc )
130      ierr = ierr + ialloc
131      !
132      ALLOCATE( rfrac_tbl_par(jpi,jpj), STAT=ialloc)
133      ierr = ierr + ialloc
134      !
135      ALLOCATE( rhisf_tbl_par(jpi,jpj), rhisf0_tbl_par(jpi,jpj), STAT=ialloc)
136      ierr = ierr + ialloc
137      !
138      ALLOCATE( mskisf_par(jpi,jpj), STAT=ialloc)
139      ierr = ierr + ialloc
140      !
141      CALL mpp_sum ( 'isf', ierr )
142      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
143      !
144   END SUBROUTINE isf_alloc_par
145
146   SUBROUTINE isf_alloc_cav()
147      !!---------------------------------------------------------------------
148      !!                  ***  ROUTINE isf_alloc_cav  ***
149      !!
150      !! ** Purpose :
151      !!
152      !! ** Method  :
153      !!
154      !!----------------------------------------------------------------------
155      INTEGER :: ierr, ialloc
156      !!----------------------------------------------------------------------
157      ierr = 0       ! set to zero if no array to be allocated
158      !
159      ALLOCATE(misfkt_cav(jpi,jpj), misfkb_cav(jpi,jpj), STAT=ialloc )
160      ierr = ierr + ialloc
161      !
162      ALLOCATE( rfrac_tbl_cav(jpi,jpj), STAT=ialloc)
163      ierr = ierr + ialloc
164      !
165      ALLOCATE( rhisf_tbl_cav(jpi,jpj), STAT=ialloc)
166      ierr = ierr + ialloc
167      !
168      CALL mpp_sum ( 'isf', ierr )
169      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
170      !
171   END SUBROUTINE isf_alloc_cav
172
173   SUBROUTINE isf_alloc_cpl()
174      !!---------------------------------------------------------------------
175      !!                  ***  ROUTINE isf_alloc_cpl  ***
176      !!
177      !! ** Purpose : allocate array use for the ice sheet coupling
178      !!
179      !!----------------------------------------------------------------------
180      INTEGER :: ierr, ialloc
181      !!----------------------------------------------------------------------
182      ierr = 0
183      !
184      ALLOCATE( risfcpl_ssh(jpi,jpj), risfcpl_tsc(jpi,jpj,jpk,jpts), risfcpl_vol(jpi,jpj,jpk), STAT=ialloc )
185      ierr = ierr + ialloc
186      !
187      risfcpl_tsc(:,:,:,:) = 0.0 ; risfcpl_vol(:,:,:) = 0.0 ; risfcpl_ssh(:,:) = 0.0
188
189      IF ( ln_isfcpl_cons) THEN
190         ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) ,risfcpl_cons_ssh(jpi,jpj), STAT=ialloc )
191         ierr = ierr + ialloc
192         !
193         risfcpl_cons_tsc(:,:,:,:) = 0.0 ; risfcpl_cons_vol(:,:,:) = 0.0 ; risfcpl_cons_ssh(:,:) = 0.0
194         !
195      END IF
196      !
197      CALL mpp_sum ( 'isf', ierr )
198      IF( ierr /= 0 )   CALL ctl_stop('STOP','isfcpl: failed to allocate arrays.')
199      !
200   END SUBROUTINE isf_alloc_cpl
201
202   SUBROUTINE isf_dealloc_cpl()
203      !!---------------------------------------------------------------------
204      !!                  ***  ROUTINE isf_dealloc_cpl  ***
205      !!
206      !! ** Purpose : de-allocate useless public 3d array used for ice sheet coupling
207      !!
208      !!----------------------------------------------------------------------
209      INTEGER :: ierr, ialloc
210      !!----------------------------------------------------------------------
211      ierr = 0
212      !
213      DEALLOCATE( risfcpl_ssh, risfcpl_tsc, risfcpl_vol, STAT=ialloc )
214      ierr = ierr + ialloc
215      !
216      CALL mpp_sum ( 'isf', ierr )
217      IF( ierr /= 0 )   CALL ctl_stop('STOP','isfcpl: failed to deallocate arrays.')
218      !
219   END SUBROUTINE isf_dealloc_cpl
220
221   SUBROUTINE isf_alloc()
222      !!---------------------------------------------------------------------
223      !!                  ***  ROUTINE isf_alloc  ***
224      !!
225      !! ** Purpose : allocate array used for the ice shelf cavity (cav and par)
226      !!
227      !!----------------------------------------------------------------------
228      INTEGER :: ierr, ialloc
229      !!----------------------------------------------------------------------
230      !
231      ierr = 0       ! set to zero if no array to be allocated
232      !
233      ALLOCATE(fwfisf_par(jpi,jpj)  , fwfisf_par_b(jpi,jpj), &
234         &     fwfisf_cav(jpi,jpj)  , fwfisf_cav_b(jpi,jpj), &
235         &     fwfisf_oasis(jpi,jpj),            STAT=ialloc )
236      ierr = ierr + ialloc
237      !
238      ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc )
239      ierr = ierr + ialloc
240      !
241      ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc )
242      ierr = ierr + ialloc
243      !
244      ALLOCATE(risfload(jpi,jpj), STAT=ialloc)
245      ierr = ierr + ialloc
246      !
247      ALLOCATE( mskisf_cav(jpi,jpj), STAT=ialloc)
248      ierr = ierr + ialloc
249      !
250      CALL mpp_sum ( 'isf', ierr )
251      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
252      !
253      ! initalisation of fwf and tsc array to 0
254      risfload(:,:)       = 0.0_wp
255      fwfisf_oasis(:,:)   = 0.0_wp
256      fwfisf_par(:,:)     = 0.0_wp    ; fwfisf_par_b(:,:)     = 0.0_wp
257      fwfisf_cav(:,:)     = 0.0_wp    ; fwfisf_cav_b(:,:)     = 0.0_wp
258      risf_cav_tsc(:,:,:) = 0.0_wp    ; risf_cav_tsc_b(:,:,:) = 0.0_wp
259      risf_par_tsc(:,:,:) = 0.0_wp    ; risf_par_tsc_b(:,:,:) = 0.0_wp
260      !
261
262   END SUBROUTINE isf_alloc
263
264END MODULE isf_oce
Note: See TracBrowser for help on using the repository browser.