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.
icbini.F90 in branches/UKMO/test_moci_test_suite_namelist_read/NEMOGCM/NEMO/OPA_SRC/ICB – NEMO

source: branches/UKMO/test_moci_test_suite_namelist_read/NEMOGCM/NEMO/OPA_SRC/ICB/icbini.F90 @ 9366

Last change on this file since 9366 was 9366, checked in by andmirek, 6 years ago

#2050 first version. Compiled OK in moci test suite

File size: 22.9 KB
Line 
1MODULE icbini
2   !!======================================================================
3   !!                       ***  MODULE  icbini  ***
4   !! Icebergs:  initialise variables for iceberg tracking
5   !!======================================================================
6   !! History :   -   !  2010-01  (T. Martin & A. Adcroft)  Original code
7   !!            3.3  !  2011-03  (G. Madec)  Part conversion to NEMO form ; Removal of mapping from another grid
8   !!             -   !  2011-04  (S. Alderson)  Split into separate modules ; Restore restart routines
9   !!             -   !  2011-05  (S. Alderson)  generate_test_icebergs restored ; new forcing arrays with extra halo ;
10   !!             -   !                          north fold exchange arrays added
11   !!----------------------------------------------------------------------
12   !!----------------------------------------------------------------------
13   !!   icb_init     : initialise icebergs
14   !!   icb_ini_gen  : generate test icebergs
15   !!   icb_nam      : read iceberg namelist
16   !!----------------------------------------------------------------------
17   USE dom_oce        ! ocean domain
18   USE in_out_manager ! IO routines and numout in particular
19   USE lib_mpp        ! mpi library and lk_mpp in particular
20   USE sbc_oce        ! ocean  : surface boundary condition
21   USE sbc_ice        ! sea-ice: surface boundary condition
22   USE iom            ! IOM library
23   USE fldread        ! field read
24   USE lbclnk         ! lateral boundary condition - MPP link
25   !
26   USE icb_oce        ! define iceberg arrays
27   USE icbutl         ! iceberg utility routines
28   USE icbrst         ! iceberg restart routines
29   USE icbtrj         ! iceberg trajectory I/O routines
30   USE icbdia         ! iceberg budget routines
31
32   IMPLICIT NONE
33   PRIVATE
34
35   PUBLIC   icb_init  ! routine called in nemogcm.F90 module
36   PRIVATE  icb_namelist
37
38   CHARACTER(len=100)                                 ::   cn_dir = './'   !: Root directory for location of icb files
39   TYPE(FLD_N)                                        ::   sn_icb          !: information about the calving file to be read
40   TYPE(FLD), PUBLIC, ALLOCATABLE     , DIMENSION(:)  ::   sf_icb          !: structure: file information, fields read
41                                                                           !: used in icbini and icbstp
42   !!----------------------------------------------------------------------
43   !! NEMO/OPA 3.3 , NEMO Consortium (2011)
44   !! $Id$
45   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
46   !!----------------------------------------------------------------------
47CONTAINS
48
49   SUBROUTINE icb_init( pdt, kt )
50      !!----------------------------------------------------------------------
51      !!                  ***  ROUTINE dom_init  ***
52      !!
53      !! ** Purpose :   iceberg initialization.
54      !!
55      !! ** Method  : - read the iceberg namelist
56      !!              - find non-overlapping processor interior since we can only
57      !!                have one instance of a particular iceberg
58      !!              - calculate the destinations for north fold exchanges
59      !!              - setup either test icebergs or calving file
60      !!----------------------------------------------------------------------
61      REAL(wp), INTENT(in) ::   pdt   ! iceberg time-step (rdt*nn_fsbc)
62      INTEGER , INTENT(in) ::   kt    ! time step number
63      !
64      INTEGER ::   ji, jj, jn               ! dummy loop indices
65      INTEGER ::   i1, i2, i3               ! local integers
66      INTEGER ::   ii, inum, ivar           !   -       -
67      INTEGER ::   istat1, istat2, istat3   !   -       -
68      CHARACTER(len=300) ::   cl_sdist      ! local character
69      !!----------------------------------------------------------------------
70      !
71      CALL icb_nam               ! Read and print namelist parameters
72      !
73      IF( .NOT. ln_icebergs )   RETURN
74
75      !                          ! allocate gridded fields
76      IF( icb_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'icb_alloc : unable to allocate arrays' )
77
78      !                          ! open ascii output file or files for iceberg status information
79      !                          ! note that we choose to do this on all processors since we cannot
80      !                          ! predict where icebergs will be ahead of time
81      CALL ctl_opn( numicb, 'icebergs.stat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea )
82
83      ! set parameters (mostly from namelist)
84      !
85      berg_dt         = pdt
86      first_width (:) = SQRT(  rn_initial_mass(:) / ( rn_LoW_ratio * rn_rho_bergs * rn_initial_thickness(:) )  )
87      first_length(:) = rn_LoW_ratio * first_width(:)
88
89      berg_grid%calving      (:,:)   = 0._wp
90      berg_grid%calving_hflx (:,:)   = 0._wp
91      berg_grid%stored_heat  (:,:)   = 0._wp
92      berg_grid%floating_melt(:,:)   = 0._wp
93      berg_grid%maxclass     (:,:)   = nclasses
94      berg_grid%stored_ice   (:,:,:) = 0._wp
95      berg_grid%tmp          (:,:)   = 0._wp
96      src_calving            (:,:)   = 0._wp
97      src_calving_hflx       (:,:)   = 0._wp
98
99      !                          ! domain for icebergs
100      IF( lk_mpp .AND. jpni == 1 )   CALL ctl_stop( 'icbinit: having ONE processor in x currently does not work' )
101      ! NB: the issue here is simply that cyclic east-west boundary condition have not been coded in mpp case
102      ! for the north fold we work out which points communicate by asking
103      ! lbc_lnk to pass processor number (valid even in single processor case)
104      ! borrow src_calving arrays for this
105      !
106      ! pack i and j together using a scaling of a power of 10
107      nicbpack = 10000
108      IF( jpiglo >= nicbpack )   CALL ctl_stop( 'icbini: processor index packing failure' )
109      nicbfldproc(:) = -1
110
111      DO jj = 1, jpj
112         DO ji = 1, jpi
113            src_calving_hflx(ji,jj) = narea
114            src_calving     (ji,jj) = nicbpack * mjg(jj) + mig(ji)
115         END DO
116      END DO
117      CALL lbc_lnk( src_calving_hflx, 'T', 1._wp )
118      CALL lbc_lnk( src_calving     , 'T', 1._wp )
119
120      ! work out interior of processor from exchange array
121      ! first entry with narea for this processor is left hand interior index
122      ! last  entry                               is right hand interior index
123      jj = nlcj/2
124      nicbdi = -1
125      nicbei = -1
126      DO ji = 1, jpi
127         i3 = INT( src_calving(ji,jj) )
128         i2 = INT( i3/nicbpack )
129         i1 = i3 - i2*nicbpack
130         i3 = INT( src_calving_hflx(ji,jj) )
131         IF( i1 == mig(ji) .AND. i3 == narea ) THEN
132            IF( nicbdi < 0 ) THEN   ;   nicbdi = ji
133            ELSE                    ;   nicbei = ji
134            ENDIF
135         ENDIF
136      END DO
137      !
138      ! repeat for j direction
139      ji = nlci/2
140      nicbdj = -1
141      nicbej = -1
142      DO jj = 1, jpj
143         i3 = INT( src_calving(ji,jj) )
144         i2 = INT( i3/nicbpack )
145         i1 = i3 - i2*nicbpack
146         i3 = INT( src_calving_hflx(ji,jj) )
147         IF( i2 == mjg(jj) .AND. i3 == narea ) THEN
148            IF( nicbdj < 0 ) THEN   ;   nicbdj = jj
149            ELSE                    ;   nicbej = jj
150            ENDIF
151         ENDIF
152      END DO
153      !   
154      ! special for east-west boundary exchange we save the destination index
155      i1 = MAX( nicbdi-1, 1)
156      i3 = INT( src_calving(i1,nlcj/2) )
157      jj = INT( i3/nicbpack )
158      ricb_left = REAL( i3 - nicbpack*jj, wp )
159      i1 = MIN( nicbei+1, jpi )
160      i3 = INT( src_calving(i1,nlcj/2) )
161      jj = INT( i3/nicbpack )
162      ricb_right = REAL( i3 - nicbpack*jj, wp )
163     
164      ! north fold
165      IF( npolj > 0 ) THEN
166         !
167         ! icebergs in row nicbej+1 get passed across fold
168         nicbfldpts(:)  = INT( src_calving(:,nicbej+1) )
169         nicbflddest(:) = INT( src_calving_hflx(:,nicbej+1) )
170         !
171         ! work out list of unique processors to talk to
172         ! pack them into a fixed size array where empty slots are marked by a -1
173         DO ji = nicbdi, nicbei
174            ii = nicbflddest(ji)
175            IF( ii .GT. 0 ) THEN     ! Needed because land suppression can mean
176                                     ! that unused points are not set in edge haloes
177               DO jn = 1, jpni
178                  ! work along array until we find an empty slot
179                  IF( nicbfldproc(jn) == -1 ) THEN
180                     nicbfldproc(jn) = ii
181                     EXIT                             !!gm EXIT should be avoided: use DO WHILE expression instead
182                  ENDIF
183                  ! before we find an empty slot, we may find processor number is already here so we exit
184                  IF( nicbfldproc(jn) == ii ) EXIT
185               END DO
186            ENDIF
187         END DO
188      ENDIF
189      !
190      IF( nn_verbose_level > 0) THEN
191         WRITE(numicb,*) 'processor ', narea
192         WRITE(numicb,*) 'jpi, jpj   ', jpi, jpj
193         WRITE(numicb,*) 'nldi, nlei ', nldi, nlei
194         WRITE(numicb,*) 'nldj, nlej ', nldj, nlej
195         WRITE(numicb,*) 'berg i interior ', nicbdi, nicbei
196         WRITE(numicb,*) 'berg j interior ', nicbdj, nicbej
197         WRITE(numicb,*) 'berg left       ', ricb_left
198         WRITE(numicb,*) 'berg right      ', ricb_right
199         jj = nlcj/2
200         WRITE(numicb,*) "central j line:"
201         WRITE(numicb,*) "i processor"
202         WRITE(numicb,*) (INT(src_calving_hflx(ji,jj)), ji=1,jpi)
203         WRITE(numicb,*) "i point"
204         WRITE(numicb,*) (INT(src_calving(ji,jj)), ji=1,jpi)
205         ji = nlci/2
206         WRITE(numicb,*) "central i line:"
207         WRITE(numicb,*) "j processor"
208         WRITE(numicb,*) (INT(src_calving_hflx(ji,jj)), jj=1,jpj)
209         WRITE(numicb,*) "j point"
210         WRITE(numicb,*) (INT(src_calving(ji,jj)), jj=1,jpj)
211         IF( npolj > 0 ) THEN
212            WRITE(numicb,*) 'north fold destination points '
213            WRITE(numicb,*) nicbfldpts
214            WRITE(numicb,*) 'north fold destination procs  '
215            WRITE(numicb,*) nicbflddest
216            WRITE(numicb,*) 'north fold destination proclist  '
217            WRITE(numicb,*) nicbfldproc
218         ENDIF
219         CALL flush(numicb)
220      ENDIF
221     
222      src_calving     (:,:) = 0._wp
223      src_calving_hflx(:,:) = 0._wp
224
225      ! assign each new iceberg with a unique number constructed from the processor number
226      ! and incremented by the total number of processors
227      num_bergs(:) = 0
228      num_bergs(1) = narea - jpnij
229
230      ! when not generating test icebergs we need to setup calving file
231      IF( nn_test_icebergs < 0 ) THEN
232         !
233         ! maximum distribution class array does not change in time so read it once
234         cl_sdist = TRIM( cn_dir )//TRIM( sn_icb%clname )
235         CALL iom_open ( cl_sdist, inum )                              ! open file
236         ivar = iom_varid( inum, 'maxclass', ldstop=.FALSE. )
237         IF( ivar > 0 ) THEN
238            CALL iom_get  ( inum, jpdom_data, 'maxclass', src_calving )   ! read the max distribution array
239            berg_grid%maxclass(:,:) = INT( src_calving )
240            src_calving(:,:) = 0._wp
241         ENDIF
242         CALL iom_close( inum )                                     ! close file
243         !
244         WRITE(numicb,*)
245         WRITE(numicb,*) '          calving read in a file'
246         ALLOCATE( sf_icb(1), STAT=istat1 )         ! Create sf_icb structure (calving)
247         ALLOCATE( sf_icb(1)%fnow(jpi,jpj,1), STAT=istat2 )
248         ALLOCATE( sf_icb(1)%fdta(jpi,jpj,1,2), STAT=istat3 )
249         IF( istat1+istat2+istat3 > 0 ) THEN
250            CALL ctl_stop( 'sbc_icb: unable to allocate sf_icb structure' )   ;   RETURN
251         ENDIF
252         !                                          ! fill sf_icb with the namelist (sn_icb) and control print
253         CALL fld_fill( sf_icb, (/ sn_icb /), cn_dir, 'icb_init', 'read calving data', 'namicb' )
254         !
255      ENDIF
256
257      IF( .NOT.ln_rstart ) THEN
258         IF( nn_test_icebergs > 0 )   CALL icb_ini_gen()
259      ELSE
260         IF( nn_test_icebergs > 0 ) THEN
261            CALL icb_ini_gen()
262         ELSE
263            CALL icb_rst_read()
264            l_restarted_bergs = .TRUE.
265         ENDIF
266      ENDIF
267      !
268      IF( nn_sample_rate .GT. 0 ) CALL icb_trj_init( nitend )
269      !
270      CALL icb_dia_init()
271      !
272      IF( nn_verbose_level >= 2 )   CALL icb_utl_print('icb_init, initial status', nit000-1)
273      !
274   END SUBROUTINE icb_init
275
276
277   SUBROUTINE icb_ini_gen()
278      !!----------------------------------------------------------------------
279      !!                  ***  ROUTINE icb_ini_gen  ***
280      !!
281      !! ** Purpose :   iceberg generation
282      !!
283      !! ** Method  : - at each grid point of the test box supplied in the namelist
284      !!                generate an iceberg in one class determined by the value of
285      !!                parameter nn_test_icebergs
286      !!----------------------------------------------------------------------
287      INTEGER                         ::   ji, jj, ibergs
288      TYPE(iceberg)                   ::   localberg ! NOT a pointer but an actual local variable
289      TYPE(point)                     ::   localpt
290      INTEGER                         ::   iyr, imon, iday, ihr, imin, isec
291      INTEGER                         ::   iberg
292      !!----------------------------------------------------------------------
293
294      ! For convenience
295      iberg = nn_test_icebergs
296
297      ! call get_date(Time, iyr, imon, iday, ihr, imin, isec)
298      ! Convert nemo time variables from dom_oce into local versions
299      iyr  = nyear
300      imon = nmonth
301      iday = nday
302      ihr = INT(nsec_day/3600)
303      imin = INT((nsec_day-ihr*3600)/60)
304      isec = nsec_day - ihr*3600 - imin*60
305
306      ! no overlap for icebergs since we want only one instance of each across the whole domain
307      ! so restrict area of interest
308      ! use tmask here because tmask_i has been doctored on one side of the north fold line
309
310      DO jj = nicbdj, nicbej
311         DO ji = nicbdi, nicbei
312            IF( tmask(ji,jj,1) > 0._wp        .AND.                                       &
313                rn_test_box(1) < glamt(ji,jj) .AND. glamt(ji,jj) < rn_test_box(2) .AND.   &
314                rn_test_box(3) < gphit(ji,jj) .AND. gphit(ji,jj) < rn_test_box(4) ) THEN
315               localberg%mass_scaling = rn_mass_scaling(iberg)
316               localpt%xi = REAL( mig(ji), wp )
317               localpt%yj = REAL( mjg(jj), wp )
318               localpt%lon = icb_utl_bilin(glamt, localpt%xi, localpt%yj, 'T' )
319               localpt%lat = icb_utl_bilin(gphit, localpt%xi, localpt%yj, 'T' )
320               localpt%mass      = rn_initial_mass     (iberg)
321               localpt%thickness = rn_initial_thickness(iberg)
322               localpt%width  = first_width (iberg)
323               localpt%length = first_length(iberg)
324               localpt%year = iyr
325               localpt%day = REAL(iday,wp)+(REAL(ihr,wp)+REAL(imin,wp)/60._wp)/24._wp
326               localpt%mass_of_bits = 0._wp
327               localpt%heat_density = 0._wp
328               localpt%uvel = 0._wp
329               localpt%vvel = 0._wp
330               CALL icb_utl_incr()
331               localberg%number(:) = num_bergs(:)
332               call icb_utl_add(localberg, localpt)
333            ENDIF
334         END DO
335      END DO
336      !
337      ibergs = icb_utl_count()
338      IF( lk_mpp ) CALL mpp_sum(ibergs)
339      WRITE(numicb,'(a,i6,a)') 'diamonds, icb_ini_gen: ',ibergs,' were generated'
340      !
341   END SUBROUTINE icb_ini_gen
342
343
344   SUBROUTINE icb_nam
345      !!----------------------------------------------------------------------
346      !!                     ***  ROUTINE icb_nam  ***
347      !!
348      !! ** Purpose :   read iceberg namelist and print the variables.
349      !!
350      !! ** input   : - namberg namelist
351      !!----------------------------------------------------------------------
352      INTEGER  ::   jn      ! dummy loop indices
353      INTEGER  ::   ios     ! Local integer output status for namelist read
354      REAL(wp) ::   zfact   ! local scalar
355      !
356      NAMELIST/namberg/ ln_icebergs    , ln_bergdia     , nn_sample_rate      , rn_initial_mass      ,   &
357         &              rn_distribution, rn_mass_scaling, rn_initial_thickness, nn_verbose_write     ,   &
358         &              rn_rho_bergs   , rn_LoW_ratio   , nn_verbose_level    , ln_operator_splitting,   &
359         &              rn_bits_erosion_fraction        , rn_sicn_shift       , ln_passive_mode      ,   &
360         &              ln_time_average_weight          , nn_test_icebergs    , rn_test_box          ,   &
361         &              rn_speed_limit , cn_dir, sn_icb
362      !!----------------------------------------------------------------------
363
364#if !defined key_agrif
365      IF(lwm) THEN
366         REWIND( numnam_ref )              ! Namelist namberg in reference namelist : Iceberg parameters
367         READ  ( numnam_ref, namberg, IOSTAT = ios, ERR = 901)
368901      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namberg in reference namelist', lwm )
369         REWIND( numnam_cfg )              ! Namelist namberg in configuration namelist : Iceberg parameters
370         READ  ( numnam_cfg, namberg, IOSTAT = ios, ERR = 902 )
371902      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namberg in configuration namelist', lwm )
372      ENDIF
373
374      IF(lwm) WRITE ( numond, namberg )
375
376      CALL icb_namelist()
377
378#else
379      IF(lwp) THEN
380         WRITE(numout,*)
381         WRITE(numout,*) 'icbini :   AGRIF is not compatible with namelist namberg :  '
382         WRITE(numout,*) '         definition of rn_initial_mass(nclasses) with nclasses as PARAMETER '
383         WRITE(numout,*) ' namelist namberg not read'
384      ENDIF
385      ln_icebergs = .false.     
386#endif   
387      IF( .NOT. ln_icebergs ) THEN   ! no icebergs
388         IF(lwp) THEN
389            WRITE(numout,*)
390            WRITE(numout,*) 'icbini :   Namelist namberg ln_icebergs = F , NO icebergs used'
391            WRITE(numout,*) '~~~~~~~~ '
392         ENDIF
393         RETURN
394      ENDIF
395
396      IF( nn_test_icebergs > nclasses ) THEN
397          IF(lwp) WRITE(numout,*) 'Resetting nn_test_icebergs to ', nclasses
398          nn_test_icebergs = nclasses
399      ENDIF
400
401      zfact = SUM( rn_distribution )
402      IF( zfact < 1._wp ) THEN
403         IF( zfact <= 0._wp ) THEN
404           
405         ELSE
406            rn_distribution(:) = rn_distribution(:) / zfact
407            CALL ctl_warn( 'icb_nam: sum of berg input distribution not equal to one and so RESCALED' )
408         ENDIF
409      ENDIF
410
411!     IF( lk_lim3 .AND. ln_icebergs ) THEN
412!        CALL ctl_stop( 'icb_nam: the use of ICB with LIM3 not allowed. ice thickness missing in ICB' )
413!     ENDIF
414
415      IF(lwp) THEN                  ! control print
416         WRITE(numout,*)
417         WRITE(numout,*) 'icb_nam : iceberg initialization through namberg namelist read'
418         WRITE(numout,*) '~~~~~~~~ '
419         WRITE(numout,*) '   Calculate budgets                                            ln_bergdia       = ', ln_bergdia
420         WRITE(numout,*) '   Period between sampling of position for trajectory storage   nn_sample_rate = ', nn_sample_rate
421         WRITE(numout,*) '   Mass thresholds between iceberg classes (kg)                 rn_initial_mass     ='
422         DO jn=1,nclasses
423            WRITE(numout,'(a,f15.2)') '                                                                ',rn_initial_mass(jn)
424         ENDDO
425         WRITE(numout,*) '   Fraction of calving to apply to this class (non-dim)         rn_distribution     ='
426         DO jn = 1, nclasses
427            WRITE(numout,'(a,f10.2)') '                                                                ',rn_distribution(jn)
428         END DO
429         WRITE(numout,*) '   Ratio between effective and real iceberg mass (non-dim)      rn_mass_scaling     = '
430         DO jn = 1, nclasses
431            WRITE(numout,'(a,f10.2)') '                                                                ',rn_mass_scaling(jn)
432         END DO
433         WRITE(numout,*) '   Total thickness of newly calved bergs (m)                    rn_initial_thickness = '
434         DO jn = 1, nclasses
435            WRITE(numout,'(a,f10.2)') '                                                                ',rn_initial_thickness(jn)
436         END DO
437         WRITE(numout,*) '   Timesteps between verbose messages                           nn_verbose_write    = ', nn_verbose_write
438
439         WRITE(numout,*) '   Density of icebergs                           rn_rho_bergs  = ', rn_rho_bergs
440         WRITE(numout,*) '   Initial ratio L/W for newly calved icebergs   rn_LoW_ratio  = ', rn_LoW_ratio
441         WRITE(numout,*) '   Turn on more verbose output                          level  = ', nn_verbose_level
442         WRITE(numout,*) '   Use first order operator splitting for thermodynamics    ',   &
443            &                    'use_operator_splitting = ', ln_operator_splitting
444         WRITE(numout,*) '   Fraction of erosion melt flux to divert to bergy bits    ',   &
445            &                    'bits_erosion_fraction = ', rn_bits_erosion_fraction
446
447         WRITE(numout,*) '   Shift of sea-ice concentration in erosion flux modulation ',   &
448            &                    '(0<sicn_shift<1)    rn_sicn_shift  = ', rn_sicn_shift
449         WRITE(numout,*) '   Do not add freshwater flux from icebergs to ocean                ',   &
450            &                    '                  passive_mode            = ', ln_passive_mode
451         WRITE(numout,*) '   Time average the weight on the ocean   time_average_weight       = ', ln_time_average_weight
452         WRITE(numout,*) '   Create icebergs in absence of a restart file   nn_test_icebergs  = ', nn_test_icebergs
453         WRITE(numout,*) '                   in lon/lat box                                   = ', rn_test_box
454         WRITE(numout,*) '   CFL speed limit for a berg            speed_limit                = ', rn_speed_limit
455         WRITE(numout,*) '   Writing Iceberg status information to icebergs.stat file        '
456      ENDIF
457      !
458   END SUBROUTINE icb_nam
459
460   SUBROUTINE icb_namelist()
461     !!---------------------------------------------------------------------
462     !!                   ***  ROUTINE icb_namelist  ***
463     !!                     
464     !! ** Purpose :   Broadcast namelist variables read by procesor lwm
465     !!
466     !! ** Method  :   use lib_mpp
467     !!----------------------------------------------------------------------
468#if defined key_mpp_mpi
469      CALL mpp_bcast(ln_icebergs)
470      CALL mpp_bcast(ln_bergdia)
471      CALL mpp_bcast(nn_sample_rate)
472      CALL mpp_bcast(rn_initial_mass, nclasses)
473      CALL mpp_bcast(rn_distribution, nclasses)
474      CALL mpp_bcast(rn_mass_scaling, nclasses)
475      CALL mpp_bcast(rn_initial_thickness, nclasses)
476      CALL mpp_bcast(nn_verbose_write)
477      CALL mpp_bcast(rn_rho_bergs)
478      CALL mpp_bcast(rn_LoW_ratio)
479      CALL mpp_bcast(nn_verbose_level)
480      CALL mpp_bcast(ln_operator_splitting)
481      CALL mpp_bcast(rn_bits_erosion_fraction)
482      CALL mpp_bcast(rn_sicn_shift)
483      CALL mpp_bcast(ln_passive_mode)
484      CALL mpp_bcast(ln_time_average_weight)
485      CALL mpp_bcast(nn_test_icebergs)
486      CALL mpp_bcast(rn_test_box, 4)
487      CALL mpp_bcast(rn_speed_limit)
488      CALL mpp_bcast(cn_dir, 100)
489      CALL fld_n_bcast(sn_icb)
490#endif
491   END SUBROUTINE icb_namelist
492
493   !!======================================================================
494END MODULE icbini
Note: See TracBrowser for help on using the repository browser.