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

Last change on this file since 11852 was 11852, checked in by mathiot, 12 months ago

ENHANCE-02_ISF_nemo: fix WED025 restartability, finish removing useless USE, remove useless lbc_lnk

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