source: branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/OPA_SRC/ICB/icb_oce.F90 @ 4147

Last change on this file since 4147 was 4147, checked in by cetlod, 8 years ago

merge in dev_LOCEAN_2013, the 1st development branch dev_r3853_CNRS9_Confsetting, from its starting point ( r3853 ) on the trunk: see ticket #1169

File size: 13.4 KB
Line 
1MODULE icb_oce
2
3   !!======================================================================
4   !!                       ***  MODULE  icb_oce  ***
5   !! Icebergs:  declare variables for iceberg tracking
6   !!======================================================================
7   !! History :  3.3  !  2010-01  (T. Martin & A. Adcroft)  Original code
8   !!             -   !  2011-03  (G. Madec)  Part conversion to NEMO form
9   !!             -   !                       Removal of mapping from another grid
10   !!             -   !  2011-04  (S. Alderson) Extensive rewrite ; Split into separate modules
11   !!----------------------------------------------------------------------
12   !!
13   !! Track Icebergs as Lagrangian objects within the model domain
14   !! Interaction with the other model variables through 'icebergs_gridded'
15   !!
16   !! A single iceberg is held as an instance of type 'iceberg'
17   !! This type defines a linked list, so each instance contains a pointer
18   !! to the previous and next icebergs in the list
19   !!
20   !! Type 'icebergs' is a convenience container for all relevant arrays
21   !! It contains one pointer to an 'iceberg' instance representing all icebergs in the processor
22   !!
23   !! Each iceberg has a position represented as a real cartesian coordinate which is
24   !! fractional grid cell, centred on T-points; so an iceberg position of (1.0,1.0) lies
25   !! exactly on the first T-point and the T-cell spans 0.5 to 1.5 in each direction
26   !!
27   !! Each iceberg is assigned a unique id even in MPI
28   !! This consists of an array of integers: the first element is used to label, the second
29   !! and subsequent elements are used to count the number of times the first element wraps
30   !! around all possible values within the valid size for this datatype.
31   !! Labelling is done by starting the first label in each processor (even when only one)
32   !! as narea, and then incrementing by jpnij (i.e. the total number of processors.
33   !! This means that the source processor for each iceberg can be identified by arithmetic
34   !! modulo jpnij.
35   !!
36   !!----------------------------------------------------------------------
37   USE par_oce   ! ocean parameters
38   USE lib_mpp   ! MPP library
39   USE fldread   ! read input fields (FLD type)
40
41   IMPLICIT NONE
42   PUBLIC
43
44   PUBLIC   icb_alloc   ! routine called by icb_init in icbini.F90 module
45
46INTEGER, PUBLIC, PARAMETER ::   nclasses = 10   !: Number of icebergs classes   
47!!INTEGER, PUBLIC &
48!!#if !defined key_agrif
49!!           , PARAMETER &
50!!#endif
51!!     :: &
52!!     nclasses = 10   !: Number of icebergs classes
53   INTEGER, PUBLIC, PARAMETER ::   nkounts  =  3   !: Number of integers combined for unique naming
54
55   TYPE, PUBLIC ::   icebergs_gridded   !: various icebergs properties on model grid
56      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   calving         ! Calving mass rate  (into stored ice)         [kg/s]
57      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   calving_hflx    ! Calving heat flux [heat content of calving]  [W/m2]
58      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   floating_melt   ! Net melting rate to icebergs + bits      [kg/s/m^2]
59      INTEGER , DIMENSION(:,:)  , ALLOCATABLE ::   maxclass        ! maximum class number at calving source point
60      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   tmp             ! Temporary work space
61      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   stored_ice      ! Accumulated ice mass flux at calving locations [kg]
62      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   stored_heat     ! Heat content of stored ice                      [J]
63   END TYPE icebergs_gridded
64
65   TYPE, PUBLIC ::   point              !: properties of an individual iceberg (position, mass, size, etc...)
66      INTEGER  ::   year
67      REAL(wp) ::   xi , yj                                              ! iceberg coordinates in the (i,j) referential (global)
68      REAL(wp) ::   e1 , e2                                              ! horizontal scale factors at the iceberg position
69      REAL(wp) ::   lon, lat, day                                        ! geographic position
70      REAL(wp) ::   mass, thickness, width, length, uvel, vvel           ! iceberg physical properties
71      REAL(wp) ::   uo, vo, ui, vi, ua, va, ssh_x, ssh_y, sst, cn, hi    ! properties of iceberg environment
72      REAL(wp) ::   mass_of_bits, heat_density
73   END TYPE point
74
75   TYPE, PUBLIC ::   iceberg            !: linked list defining all the icebergs present in the model domain
76      TYPE(iceberg), POINTER      ::   prev=>NULL(), next=>NULL()   ! pointers to previous and next unique icebergs in linked list
77      INTEGER, DIMENSION(nkounts) ::   number                       ! variables which do not change for this iceberg
78      REAL(wp)                    ::   mass_scaling                 !    -        -            -                - 
79      TYPE(point), POINTER        ::   current_point => NULL()      ! variables which change with time are held in a separate type
80   END TYPE iceberg
81
82
83   TYPE(icebergs_gridded), POINTER ::   berg_grid                 !: master instance of gridded iceberg type
84   TYPE(iceberg)         , POINTER ::   first_berg => NULL()      !: master instance of linked list iceberg type
85
86   !                                                             !!! parameters controlling iceberg characteristics and modelling
87   REAL(wp)                            ::   berg_dt                   !: Time-step between iceberg CALLs (should make adaptive?)
88   REAL(wp), DIMENSION(:), ALLOCATABLE ::   first_width, first_length !:
89   LOGICAL                             ::   l_restarted_bergs=.FALSE.  ! Indicate whether we read state from a restart or not
90   !                                                               ! arbitrary numbers for diawri entry
91   REAL(wp), DIMENSION(nclasses), PUBLIC ::   class_num=(/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
92
93   ! Extra arrays with bigger halo, needed when interpolating forcing onto iceberg position
94   ! particularly for MPP when iceberg can lie inside T grid but outside U, V, or f grid
95   REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE ::   uo_e, vo_e
96   REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE ::   ff_e
97   REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE ::   ua_e, va_e
98   REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE ::   ssh_e
99#if defined key_lim2 || defined key_lim3
100   REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE ::   ui_e, vi_e
101#endif
102
103   !!gm almost all those PARAM ARE defined in NEMO
104   REAL(wp), PUBLIC, PARAMETER :: pp_rho_ice      = 916.7_wp   !: Density of fresh ice   @ 0oC [kg/m^3]
105   REAL(wp), PUBLIC, PARAMETER :: pp_rho_water    = 999.8_wp   !: Density of fresh water @ 0oC [kg/m^3]
106   REAL(wp), PUBLIC, PARAMETER :: pp_rho_air      = 1.1_wp     !: Density of air         @ 0oC [kg/m^3]
107   REAL(wp), PUBLIC, PARAMETER :: pp_rho_seawater = 1025._wp   !: Approx. density of surface sea water @ 0oC [kg/m^3]
108   !!gm end
109   REAL(wp), PUBLIC, PARAMETER :: pp_Cd_av = 1.3_wp      !: (Vertical) Drag coefficient between bergs and atmos
110   REAL(wp), PUBLIC, PARAMETER :: pp_Cd_ah = 0.0055_wp   !: (lateral ) Drag coefficient between bergs and atmos
111   REAL(wp), PUBLIC, PARAMETER :: pp_Cd_wv = 0.9_wp      !: (Vertical) Drag coefficient between bergs and ocean
112   REAL(wp), PUBLIC, PARAMETER :: pp_Cd_wh = 0.0012_wp   !: (lateral ) Drag coefficient between bergs and ocean
113   REAL(wp), PUBLIC, PARAMETER :: pp_Cd_iv = 0.9_wp      !: (Vertical) Drag coefficient between bergs and sea-ice
114!TOM> no horizontal drag for sea ice! real, PARAMETER :: pp_Cd_ih=0.0012 ! (lateral) Drag coeff. between bergs and sea-ice
115
116   !                                                         !!* namberg namelist parameters (and defaults) **
117   LOGICAL , PUBLIC ::   ln_bergdia                      !: Calculate budgets
118   INTEGER , PUBLIC ::   nn_verbose_level                !: Turn on debugging when level > 0
119   INTEGER , PUBLIC ::   nn_test_icebergs                !: Create icebergs in absence of a restart file from the supplied class nb
120   REAL(wp), PUBLIC, DIMENSION(4) ::   rn_test_box       !: lon1,lon2,lat1,lat2 box to create them in
121   INTEGER , PUBLIC ::   nn_sample_rate                  !: Timesteps between sampling of position for trajectory storage
122   INTEGER , PUBLIC ::   nn_verbose_write                !: timesteps between verbose messages
123   REAL(wp), PUBLIC ::   rn_rho_bergs                    !: Density of icebergs
124   REAL(wp), PUBLIC ::   rn_LoW_ratio                    !: Initial ratio L/W for newly calved icebergs
125   REAL(wp), PUBLIC ::   rn_bits_erosion_fraction        !: Fraction of erosion melt flux to divert to bergy bits
126   REAL(wp), PUBLIC ::   rn_sicn_shift                   !: Shift of sea-ice concentration in erosion flux modulation (0<sicn_shift<1)
127   LOGICAL , PUBLIC ::   ln_operator_splitting           !: Use first order operator splitting for thermodynamics
128   LOGICAL , PUBLIC ::   ln_passive_mode                 !: iceberg - ocean decoupling
129   LOGICAL , PUBLIC ::   ln_time_average_weight          !: Time average the weight on the ocean    !!gm I don't understand that !
130   REAL(wp), PUBLIC ::   rn_speed_limit                  !: CFL speed limit for a berg
131   !
132   !                                     ! Mass thresholds between iceberg classes [kg]
133   REAL(wp), DIMENSION(nclasses), PUBLIC ::   rn_initial_mass      ! Fraction of calving to apply to this class [non-dim]
134   REAL(wp), DIMENSION(nclasses), PUBLIC ::   rn_distribution      ! Ratio between effective and real iceberg mass (non-dim)
135   REAL(wp), DIMENSION(nclasses), PUBLIC ::   rn_mass_scaling      ! Total thickness of newly calved bergs [m]
136   REAL(wp), DIMENSION(nclasses), PUBLIC ::   rn_initial_thickness !  Single instance of an icebergs type initialised in icebergs_init and updated in icebergs_run
137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   src_calving, src_calving_hflx    !: accumulate input ice
138   INTEGER , PUBLIC             , SAVE                     ::   numicb                           !: iceberg IO
139   INTEGER , PUBLIC             , SAVE, DIMENSION(nkounts) ::   num_bergs                        !: iceberg counter
140   INTEGER , PUBLIC             , SAVE                     ::   nicbdi, nicbei, nicbdj, nicbej   !: processor bounds
141   REAL(wp), PUBLIC             , SAVE                     ::   ricb_left, ricb_right            !: cyclical bounds
142   INTEGER , PUBLIC             , SAVE                     ::   nicbpack                         !: packing integer
143   INTEGER , PUBLIC             , SAVE                     ::   nktberg, nknberg                 !: helpers
144   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::   nicbfldpts                       !: nfold packed points
145   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::   nicbflddest                      !: nfold destination proc
146   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::   nicbfldproc                      !: nfold destination proc
147
148   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   :: griddata                           !: work array for icbrst
149
150   TYPE(FLD), PUBLIC, ALLOCATABLE     , DIMENSION(:)       ::   sf_icb   !: structure: file information, fields read
151
152   !!----------------------------------------------------------------------
153   !! NEMO/OPA 3.3 , NEMO Consortium (2011)
154   !! $Id: sbc_oce.F90 3340 2012-04-02 11:05:35Z sga $
155   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
156   !!----------------------------------------------------------------------
157CONTAINS
158   
159   INTEGER FUNCTION icb_alloc()
160      !!----------------------------------------------------------------------
161      !!                ***  ROUTINE icb_alloc  ***
162      !!----------------------------------------------------------------------
163      INTEGER ::   ill
164      !!----------------------------------------------------------------------
165      !
166      icb_alloc = 0
167!!      ALLOCATE( berg_grid                      ,                                               &
168      ALLOCATE(                                                                                &
169         &      berg_grid%calving    (jpi,jpj) , berg_grid%calving_hflx (jpi,jpj)          ,   &
170         &      berg_grid%stored_heat(jpi,jpj) , berg_grid%floating_melt(jpi,jpj)          ,   &
171         &      berg_grid%maxclass   (jpi,jpj) , berg_grid%stored_ice   (jpi,jpj,nclasses) ,   &
172         &      berg_grid%tmp        (jpi,jpj) , STAT=ill)
173      icb_alloc = icb_alloc + ill
174      !
175      ! expanded arrays for bilinear interpolation
176      ALLOCATE( uo_e(0:jpi+1,0:jpj+1) , ua_e(0:jpi+1,0:jpj+1) ,   &
177         &      vo_e(0:jpi+1,0:jpj+1) , va_e(0:jpi+1,0:jpj+1) ,   &
178#if defined key_lim2 || defined key_lim3
179         &      ui_e(0:jpi+1,0:jpj+1) ,                            &
180         &      vi_e(0:jpi+1,0:jpj+1) ,                            &
181#endif
182         &      ff_e(0:jpi+1,0:jpj+1) , ssh_e(0:jpi+1,0:jpj+1) ,   &
183         &      first_width(nclasses) , first_length(nclasses) ,   &
184         &      src_calving (jpi,jpj) ,                            &
185         &      src_calving_hflx(jpi,jpj) , STAT=ill)
186      icb_alloc = icb_alloc + ill
187
188      ALLOCATE( nicbfldpts(jpi) , nicbflddest(jpi) , nicbfldproc(jpni) , STAT=ill)
189      icb_alloc = icb_alloc + ill
190
191      ALLOCATE( griddata(jpi,jpj,1), STAT=ill )
192      icb_alloc = icb_alloc + ill
193
194      IF( lk_mpp        )   CALL mpp_sum ( icb_alloc )
195      IF( icb_alloc > 0 )   CALL ctl_warn('icb_alloc: allocation of arrays failed')
196      !
197   END FUNCTION icb_alloc
198
199   !!======================================================================
200END MODULE icb_oce
Note: See TracBrowser for help on using the repository browser.