source: NEMO/trunk/src/TOP/trcini.F90 @ 10570

Last change on this file since 10570 was 10570, checked in by acc, 19 months ago

Trunk update to implement finer control over the choice of text report files generated. See ticket: #2167

  • Property svn:keywords set to Id
File size: 13.2 KB
Line 
1MODULE trcini
2   !!======================================================================
3   !!                         ***  MODULE trcini  ***
4   !! TOP :   Manage the passive tracer initialization
5   !!======================================================================
6   !! History :   -   ! 1991-03 (O. Marti)  original code
7   !!            1.0  ! 2005-03 (O. Aumont, A. El Moussaoui) F90
8   !!            2.0  ! 2005-10 (C. Ethe, G. Madec) revised architecture
9   !!            4.0  ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation
10   !!----------------------------------------------------------------------
11#if defined key_top
12   !!----------------------------------------------------------------------
13   !!   'key_top'                                                TOP models
14   !!----------------------------------------------------------------------
15   !!   trc_init  :   Initialization for passive tracer
16   !!   top_alloc :   allocate the TOP arrays
17   !!----------------------------------------------------------------------
18   USE oce_trc         ! shared variables between ocean and passive tracers
19   USE trc             ! passive tracers common variables
20   USE trcnam          ! Namelist read
21   USE daymod          ! calendar manager
22   USE prtctl_trc      ! Print control passive tracers (prt_ctl_trc_init routine)
23   USE trcsub          ! variables to substep passive tracers
24   USE trcrst
25   USE lib_mpp         ! distribued memory computing library
26   USE trcice          ! tracers in sea ice
27   USE trcbc,   only : trc_bc_ini ! generalized Boundary Conditions
28 
29   IMPLICIT NONE
30   PRIVATE
31   
32   PUBLIC   trc_init   ! called by opa
33
34   !!----------------------------------------------------------------------
35   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
36   !! $Id$
37   !! Software governed by the CeCILL license (see ./LICENSE)
38   !!----------------------------------------------------------------------
39CONTAINS
40   
41   SUBROUTINE trc_init
42      !!---------------------------------------------------------------------
43      !!                     ***  ROUTINE trc_init  ***
44      !!
45      !! ** Purpose :   Initialization of the passive tracer fields
46      !!
47      !! ** Method  : - read namelist
48      !!              - control the consistancy
49      !!              - compute specific initialisations
50      !!              - set initial tracer fields (either read restart
51      !!                or read data or analytical formulation
52      !!---------------------------------------------------------------------
53      !
54      IF( ln_timing )   CALL timing_start('trc_init')
55      !
56      IF(lwp) WRITE(numout,*)
57      IF(lwp) WRITE(numout,*) 'trc_init : initial set up of the passive tracers'
58      IF(lwp) WRITE(numout,*) '~~~~~~~~'
59      !
60      CALL trc_ini_ctl   ! control
61      CALL trc_nam       ! read passive tracers namelists
62      CALL top_alloc()   ! allocate TOP arrays
63      !
64      IF(.NOT.ln_trcdta )   ln_trc_ini(:) = .FALSE.
65      !
66      IF(lwp) WRITE(numout,*)
67      IF( ln_rsttr .AND. .NOT. l_offline ) CALL trc_rst_cal( nit000, 'READ' )   ! calendar
68      IF(lwp) WRITE(numout,*)
69      !
70      CALL trc_ini_sms   ! SMS
71      CALL trc_ini_trp   ! passive tracers transport
72      CALL trc_ice_ini   ! Tracers in sea ice
73      !
74      IF( lwm .AND. sn_cfctl%l_trcstat ) THEN
75         CALL ctl_opn( numstr, 'tracer.stat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp , narea )
76      ENDIF
77      !
78      CALL trc_ini_state  !  passive tracers initialisation : from a restart or from clim
79      IF( nn_dttrc /= 1 ) &
80      CALL trc_sub_ini    ! Initialize variables for substepping passive tracers
81      !
82      CALL trc_ini_inv   ! Inventories
83      !
84      IF( ln_timing )   CALL timing_stop('trc_init')
85      !
86   END SUBROUTINE trc_init
87
88
89   SUBROUTINE trc_ini_ctl
90      !!----------------------------------------------------------------------
91      !!                     ***  ROUTINE trc_ini_ctl  ***
92      !! ** Purpose :        Control  + ocean volume
93      !!----------------------------------------------------------------------
94      INTEGER ::   jk    ! dummy loop indices
95      !
96      ! Define logical parameter ton control dirunal cycle in TOP
97      l_trcdm2dc = ln_dm2dc .OR. ( ln_cpl .AND. ncpl_qsr_freq /= 1 )
98      l_trcdm2dc = l_trcdm2dc  .AND. .NOT. l_offline
99      IF( l_trcdm2dc .AND. lwp )   CALL ctl_warn( 'Coupling with passive tracers and used of diurnal cycle.',   &
100         &                           'Computation of a daily mean shortwave for some biogeochemical models ' )
101      !
102   END SUBROUTINE trc_ini_ctl
103
104
105   SUBROUTINE trc_ini_inv
106      !!----------------------------------------------------------------------
107      !!                     ***  ROUTINE trc_ini_stat  ***
108      !! ** Purpose :      passive tracers inventories at initialsation phase
109      !!----------------------------------------------------------------------
110      INTEGER ::  jk, jn    ! dummy loop indices
111      CHARACTER (len=25) :: charout
112      !!----------------------------------------------------------------------
113      !
114      IF(lwp) WRITE(numout,*)
115      IF(lwp) WRITE(numout,*) 'trc_ini_inv : initial passive tracers inventories'
116      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
117      !
118      !                          ! masked grid volume
119      DO jk = 1, jpk
120         cvol(:,:,jk) = e1e2t(:,:) * e3t_n(:,:,jk) * tmask(:,:,jk)
121      END DO
122      !                          ! total volume of the ocean
123      areatot = glob_sum( 'trcini', cvol(:,:,:) )
124      !
125      trai(:) = 0._wp            ! initial content of all tracers
126      DO jn = 1, jptra
127         trai(jn) = trai(jn) + glob_sum( 'trcini', trn(:,:,:,jn) * cvol(:,:,:)   )
128      END DO
129
130      IF(lwp) THEN               ! control print
131         WRITE(numout,*)
132         WRITE(numout,*) '   ==>>>   Total number of passive tracer jptra = ', jptra
133         WRITE(numout,*) '           Total volume of ocean                = ', areatot
134         WRITE(numout,*) '           Total inital content of all tracers '
135         WRITE(numout,*)
136         DO jn = 1, jptra
137            WRITE(numout,9000) jn, TRIM( ctrcnm(jn) ), trai(jn)
138         ENDDO
139         WRITE(numout,*)
140      ENDIF
141      IF(lwp) WRITE(numout,*)
142      IF(ln_ctl) THEN            ! print mean trends (used for debugging)
143         CALL prt_ctl_trc_init
144         WRITE(charout, FMT="('ini ')")
145         CALL prt_ctl_trc_info( charout )
146         CALL prt_ctl_trc( tab4d=trn, mask=tmask, clinfo=ctrcnm )
147      ENDIF
1489000  FORMAT('      tracer nb : ',i2,'      name :',a10,'      initial content :',e18.10)
149      !
150   END SUBROUTINE trc_ini_inv
151
152
153   SUBROUTINE trc_ini_sms
154      !!----------------------------------------------------------------------
155      !!                     ***  ROUTINE trc_ini_sms  ***
156      !! ** Purpose :   SMS initialisation
157      !!----------------------------------------------------------------------
158      USE trcini_pisces  ! PISCES   initialisation
159      USE trcini_cfc     ! CFC      initialisation
160      USE trcini_c14     ! C14  initialisation
161      USE trcini_age     ! age initialisation
162      USE trcini_my_trc  ! MY_TRC   initialisation
163      !
164      INTEGER :: jn
165      !!----------------------------------------------------------------------
166      !
167      ! Pass sn_tracer fields to specialized arrays
168      DO jn = 1, jp_bgc
169         ctrcnm    (jn) = TRIM( sn_tracer(jn)%clsname )
170         ctrcln    (jn) = TRIM( sn_tracer(jn)%cllname )
171         ctrcun    (jn) = TRIM( sn_tracer(jn)%clunit  )
172         ln_trc_ini(jn) =       sn_tracer(jn)%llinit
173         ln_trc_sbc(jn) =       sn_tracer(jn)%llsbc
174         ln_trc_cbc(jn) =       sn_tracer(jn)%llcbc
175         ln_trc_obc(jn) =       sn_tracer(jn)%llobc
176      END DO
177      !   
178      IF( ln_pisces      )   CALL trc_ini_pisces     !  PISCES model
179      IF( ln_my_trc      )   CALL trc_ini_my_trc     !  MY_TRC model
180      IF( ll_cfc         )   CALL trc_ini_cfc        !  CFC's
181      IF( ln_c14         )   CALL trc_ini_c14        !  C14 model
182      IF( ln_age         )   CALL trc_ini_age        !  AGE
183      IF( .NOT.ln_pisces ) ALLOCATE( profsed(2) )
184      !
185      IF(lwp) THEN                   ! control print
186         WRITE(numout,*)
187         WRITE(numout,*) 'trc_init_sms : Summary for selected passive tracers'
188         WRITE(numout,*) '~~~~~~~~~~~~'
189         WRITE(numout,*) '    ID     NAME     INI  SBC  CBC  OBC'
190         DO jn = 1, jptra
191            WRITE(numout,9001) jn, TRIM(ctrcnm(jn)), ln_trc_ini(jn), ln_trc_sbc(jn),ln_trc_cbc(jn),ln_trc_obc(jn)
192         END DO
193      ENDIF
1949001  FORMAT(3x,i3,1x,a10,3x,l2,3x,l2,3x,l2,3x,l2)
195      !
196   END SUBROUTINE trc_ini_sms
197
198
199   SUBROUTINE trc_ini_trp
200      !!----------------------------------------------------------------------
201      !!                     ***  ROUTINE trc_ini_trp  ***
202      !!
203      !! ** Purpose :   Allocate all the dynamic arrays of the OPA modules
204      !!----------------------------------------------------------------------
205      USE trcdmp , ONLY:  trc_dmp_ini
206      USE trcadv , ONLY:  trc_adv_ini
207      USE trcldf , ONLY:  trc_ldf_ini
208      USE trcrad , ONLY:  trc_rad_ini
209      USE trcsink, ONLY:  trc_sink_ini
210      !
211      INTEGER :: ierr
212      !!----------------------------------------------------------------------
213      !
214      IF( ln_trcdmp )  CALL  trc_dmp_ini          ! damping
215                       CALL  trc_adv_ini          ! advection
216                       CALL  trc_ldf_ini          ! lateral diffusion
217                       !                          ! vertical diffusion: always implicit time stepping scheme
218                       CALL  trc_rad_ini          ! positivity of passive tracers
219                       CALL  trc_sink_ini         ! Vertical sedimentation of particles
220      !
221   END SUBROUTINE trc_ini_trp
222
223
224   SUBROUTINE trc_ini_state
225      !!----------------------------------------------------------------------
226      !!                     ***  ROUTINE trc_ini_state ***
227      !! ** Purpose :          Initialisation of passive tracer concentration
228      !!----------------------------------------------------------------------
229      USE zpshde          ! partial step: hor. derivative   (zps_hde routine)
230      USE trcrst          ! passive tracers restart
231      USE trcdta          ! initialisation from files
232      !
233      INTEGER :: jn, jl   ! dummy loop indices
234      !!----------------------------------------------------------------------
235      !
236      IF( ln_trcdta )   CALL trc_dta_ini( jptra )      ! set initial tracers values
237      !
238      IF( ln_my_trc )   CALL trc_bc_ini ( jptra )      ! set tracers Boundary Conditions
239      !
240      !
241      IF( ln_rsttr ) THEN              ! restart from a file
242        !
243        CALL trc_rst_read
244        !
245      ELSE                             ! Initialisation of tracer from a file that may also be used for damping
246!!gm BUG ?   if damping and restart, what's happening ?
247        IF( ln_trcdta .AND. nb_trcdta > 0 ) THEN
248            ! update passive tracers arrays with input data read from file
249            DO jn = 1, jptra
250               IF( ln_trc_ini(jn) ) THEN
251                  jl = n_trc_index(jn) 
252                  CALL trc_dta( nit000, sf_trcdta(jl), rf_trfac(jl), trn(:,:,:,jn) )
253                  !
254                  ! deallocate data structure if data are not used for damping
255                  IF( .NOT.ln_trcdmp .AND. .NOT.ln_trcdmp_clo ) THEN
256                     IF(lwp) WRITE(numout,*) 'trc_ini_state: deallocate data arrays as they are only used to initialize the run'
257                                                  DEALLOCATE( sf_trcdta(jl)%fnow )
258                     IF( sf_trcdta(jl)%ln_tint )  DEALLOCATE( sf_trcdta(jl)%fdta )
259                     !
260                  ENDIF
261               ENDIF
262            END DO
263            !
264        ENDIF
265        !
266        trb(:,:,:,:) = trn(:,:,:,:)
267        !
268      ENDIF
269      !
270      tra(:,:,:,:) = 0._wp
271      !                                                         ! Partial top/bottom cell: GRADh(trn)
272   END SUBROUTINE trc_ini_state
273
274
275   SUBROUTINE top_alloc
276      !!----------------------------------------------------------------------
277      !!                     ***  ROUTINE top_alloc  ***
278      !!
279      !! ** Purpose :   Allocate all the dynamic arrays of the OPA modules
280      !!----------------------------------------------------------------------
281      USE trc           , ONLY:   trc_alloc
282      USE trdtrc_oce    , ONLY:   trd_trc_oce_alloc
283#if defined key_trdmxl_trc 
284      USE trdmxl_trc    , ONLY:   trd_mxl_trc_alloc
285#endif
286      !
287      INTEGER ::   ierr   ! local integer
288      !!----------------------------------------------------------------------
289      !
290      ierr =        trc_alloc()
291      ierr = ierr + trd_trc_oce_alloc()
292#if defined key_trdmxl_trc 
293      ierr = ierr + trd_mxl_trc_alloc()
294#endif
295      !
296      CALL mpp_sum( 'trcini', ierr )
297      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'top_alloc : unable to allocate standard ocean arrays' )
298      !
299   END SUBROUTINE top_alloc
300
301#else
302   !!----------------------------------------------------------------------
303   !!  Empty module :                                     No passive tracer
304   !!----------------------------------------------------------------------
305CONTAINS
306   SUBROUTINE trc_init                      ! Dummy routine   
307   END SUBROUTINE trc_init
308#endif
309
310   !!======================================================================
311END MODULE trcini
Note: See TracBrowser for help on using the repository browser.