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

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

Last change on this file since 11403 was 11403, checked in by mathiot, 5 years ago

ENHANCE-02_ISF_nemo : add comments, renaming file (AGRIF), add isfload module (ticket #2142)

File size: 9.3 KB
Line 
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   !!----------------------------------------------------------------------
13   !!   isf          : define and allocate ice shelf variables
14   !!----------------------------------------------------------------------
15
16   USE in_out_manager ! I/O manager
17   USE lib_mpp        ! MPP library
18   USE fldread        ! read input fields
19
20   IMPLICIT NONE
21
22   PRIVATE
23
24   PUBLIC   isf_alloc, isf_alloc_par, isf_alloc_cav
25
26   ! public in order to be able to output then
27
28   LOGICAL, PUBLIC :: ln_isfpar_mlt                  !: logical for the computation of melt inside the cavity
29   LOGICAL, PUBLIC :: ln_isfcav_mlt                  !: logical for the use of ice shelf parametrisation
30   REAL(wp), PUBLIC ::   rn_hisf_tbl                 !: thickness of top boundary layer [m]
31   REAL(wp), PUBLIC ::   rn_gammat0                  !: temperature exchange coeficient    []
32   REAL(wp), PUBLIC ::   rn_gammas0                  !: salinity    exchange coeficient    []
33   REAL(wp), PUBLIC ::   rn_htbl                     !: Losch top boundary layer thickness [m]
34   CHARACTER(LEN=256), PUBLIC :: cn_isfload          !: ice shelf load computation method
35   CHARACTER(LEN=256), PUBLIC :: cn_gammablk         !: gamma formulation
36   CHARACTER(LEN=256), PUBLIC :: cn_isfcav_mlt, cn_isfpar_mlt !: melt formulation (cavity/param)
37   TYPE(FLD_N), PUBLIC                                  :: sn_isfcav_fwf   !: information about the isf melting file to be read
38   TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_fwf   !: information about the isf melting file to be read
39   TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_zmax  !: information about the grounding line depth file to be read
40   TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_zmin  !: information about the calving   line depth file to be read
41   TYPE(FLD_N), PUBLIC                                  :: sn_isfpar_Leff  !: information about the effective length     file to be read
42
43   LOGICAL, PUBLIC :: l_isfcpl
44   !
45   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkt_par, misfkt_cav   !: Level of ice shelf base
46   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   misfkb_par, misfkb_cav   !: Level of ice shelf base
47   !
48   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mskisf_par, mskisf_cav   !: Level of ice shelf base
49   !
50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfload                     !: ice shelf load
51   !
52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_0                  !: thickness of tbl (initial value)  [m]
53   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf_tbl_cav, rhisf_tbl_par !: thickness of tbl                  [m]
54   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rfrac_tbl_cav, rfrac_tbl_par !: fraction of the deepest cell affect by isf tbl  []
55   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   rhisf0_tbl_par
56   !
57   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_cpl
58   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_par, fwfisf_par_b !: net fwf from the ice shelf        [kg/m2/s]
59   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_cav, fwfisf_cav_b !: net fwf from the ice shelf        [kg/m2/s]
60   !
61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   risfLeff
62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_cav_tsc_b, risf_cav_tsc     !: before and now T & S isf contents [K.m/s & PSU.m/s] 
63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_par_tsc_b, risf_par_tsc     !: before and now T & S isf contents [K.m/s & PSU.m/s] 
64
65   REAL(wp), PARAMETER, PUBLIC :: rLfusisf = 0.334e6_wp    !: latent heat of fusion of ice shelf     [J/kg]
66   REAL(wp), PARAMETER, PUBLIC :: rcpisf = 2000.0_wp       !: specific heat of ice shelf             [J/kg/K]
67   REAL(wp), PARAMETER, PUBLIC :: rkappa = 1.54e-6_wp      !: heat diffusivity through the ice-shelf [m2/s]
68   REAL(wp), PARAMETER, PUBLIC :: rhoisf = 920.0_wp        !: volumic mass of ice shelf              [kg/m3]
69   REAL(wp), PARAMETER, PUBLIC :: rtsurf = -20.0           !: surface temperature                    [C]
70   REAL(wp), PARAMETER, PUBLIC :: risf_eps = 1.e-20_wp       
71
72   REAL(wp), PUBLIC            :: risf_lamb1, risf_lamb2, risf_lamb3  ! freezing point linearization coeficient
73
74   REAL(wp), PUBLIC            :: r1_Lfusisf               !: 1/rLfusisf
75
76   TYPE(FLD)  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfcav_fwf
77   TYPE(FLD)  , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sf_isfpar_fwf
78
79!: Variable used in fldread to read the forcing file (nn_isf == 4 .OR. nn_isf == 3)
80   CHARACTER(len=100), PUBLIC           :: cn_dirisf  = './' !: Root directory for location of ssr files
81   TYPE(FLD_N)       , PUBLIC           :: sn_fwfisf         !: information about the isf melting file to be read
82   TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_fwfisf
83   TYPE(FLD_N)       , PUBLIC           :: sn_rnfisf         !: information about the isf melting param.   file to be read
84   TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnfisf           
85   
86   !!----------------------------------------------------------------------
87   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
88   !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $
89   !! Software governed by the CeCILL license (see ./LICENSE)
90   !!----------------------------------------------------------------------
91CONTAINS
92
93   SUBROUTINE isf_alloc_par()
94      !!---------------------------------------------------------------------
95      !!                  ***  ROUTINE isf_alloc_par  ***
96      !!
97      !! ** Purpose :
98      !!
99      !! ** Method  :
100      !!
101      !!----------------------------------------------------------------------
102      INTEGER :: ierr, ialloc
103      !!----------------------------------------------------------------------
104      ierr = 0       ! set to zero if no array to be allocated
105      !
106      ALLOCATE(risfLeff(jpi,jpj), STAT=ialloc)
107      ierr = ierr + ialloc
108      !
109      ALLOCATE(misfkt_par(jpi,jpj), misfkb_par(jpi,jpj), STAT=ialloc )
110      ierr = ierr + ialloc
111      !
112      ALLOCATE( rfrac_tbl_par(jpi,jpj), STAT=ialloc)
113      ierr = ierr + ialloc
114      !
115      ALLOCATE( rhisf_tbl_par(jpi,jpj), rhisf0_tbl_par(jpi,jpj), STAT=ialloc)
116      ierr = ierr + ialloc
117      !
118      ALLOCATE( mskisf_par(jpi,jpj), STAT=ialloc)
119      ierr = ierr + ialloc
120      !
121      CALL mpp_sum ( 'isf', ierr )
122      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
123   END SUBROUTINE isf_alloc_par
124
125   SUBROUTINE isf_alloc_cav()
126      !!---------------------------------------------------------------------
127      !!                  ***  ROUTINE isf_alloc_cav  ***
128      !!
129      !! ** Purpose :
130      !!
131      !! ** Method  :
132      !!
133      !!----------------------------------------------------------------------
134      INTEGER :: ierr, ialloc
135      !!----------------------------------------------------------------------
136      ierr = 0       ! set to zero if no array to be allocated
137      !
138      ALLOCATE(misfkt_cav(jpi,jpj), misfkb_cav(jpi,jpj), STAT=ialloc )
139      ierr = ierr + ialloc
140      !
141      ALLOCATE( rfrac_tbl_cav(jpi,jpj), STAT=ialloc)
142      ierr = ierr + ialloc
143      !
144      ALLOCATE( rhisf_tbl_cav(jpi,jpj), STAT=ialloc)
145      ierr = ierr + ialloc
146      !
147      ALLOCATE( mskisf_cav(jpi,jpj), STAT=ialloc)
148      ierr = ierr + ialloc
149      !
150      CALL mpp_sum ( 'isf', ierr )
151      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
152   END SUBROUTINE isf_alloc_cav
153
154   SUBROUTINE isf_alloc()
155      !!---------------------------------------------------------------------
156      !!                  ***  ROUTINE isf_alloc  ***
157      !!
158      !! ** Purpose :
159      !!
160      !! ** Method  :
161      !!
162      !!----------------------------------------------------------------------
163      INTEGER :: ierr, ialloc
164      !!----------------------------------------------------------------------
165      !
166      ierr = 0       ! set to zero if no array to be allocated
167      !
168      ALLOCATE(fwfisf_par(jpi,jpj), fwfisf_par_b(jpi,jpj), &
169         &     fwfisf_cav(jpi,jpj), fwfisf_cav_b(jpi,jpj), &
170         &     fwfisf_cpl(jpi,jpj),            STAT=ialloc )
171      ierr = ierr + ialloc
172      !
173      ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc )
174      ierr = ierr + ialloc
175      !
176      ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc )
177      ierr = ierr + ialloc
178      !
179      ALLOCATE(risfload(jpi,jpj), STAT=ialloc)
180      ierr = ierr + ialloc
181      !
182      CALL mpp_sum ( 'isf', ierr )
183      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'isf: failed to allocate arrays.' )
184
185   END SUBROUTINE isf_alloc
186   !
187END MODULE isf
Note: See TracBrowser for help on using the repository browser.