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.
diahsb.F90 in branches/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/DIA – NEMO

source: branches/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90 @ 11101

Last change on this file since 11101 was 11101, checked in by frrh, 5 years ago

Merge changes from Met Office GMED ticket 450 to reduce unnecessary
text output from NEMO.
This output, which is typically not switchable, is rarely of interest
in normal (non-debugging) runs and simply redunantley consumes extra
file space.
Further, the presence of this text output has been shown to
significantly degrade performance of models which are run during
Met Office HPC RAID (disk) checks.
The new code introduces switches which are configurable via the
changes made in the associated Met Office MOCI ticket 399.

File size: 20.2 KB
Line 
1MODULE diahsb
2   !!======================================================================
3   !!                       ***  MODULE  diahsb  ***
4   !! Ocean diagnostics: Heat, salt and volume budgets
5   !!======================================================================
6   !! History :  3.3  ! 2010-09  (M. Leclair)  Original code
7   !!                 ! 2012-10  (C. Rousset)  add iom_put
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   dia_hsb       : Diagnose the conservation of ocean heat and salt contents, and volume
12   !!   dia_hsb_rst   : Read or write DIA file in restart file
13   !!   dia_hsb_init  : Initialization of the conservation diagnostic
14   !!----------------------------------------------------------------------
15   USE oce             ! ocean dynamics and tracers
16   USE dom_oce         ! ocean space and time domain
17   USE phycst          ! physical constants
18   USE sbc_oce         ! surface thermohaline fluxes
19   USE sbcrnf          ! river runoff
20   USE sbcisf          ! ice shelves
21   USE domvvl          ! vertical scale factors
22   USE traqsr          ! penetrative solar radiation
23   USE trabbc          ! bottom boundary condition
24   USE trabbc          ! bottom boundary condition
25   USE bdy_par         ! (for lk_bdy)
26   USE restart         ! ocean restart
27   !
28   USE iom             ! I/O manager
29   USE in_out_manager  ! I/O manager
30   USE lib_fortran     ! glob_sum
31   USE lib_mpp         ! distributed memory computing library
32   USE timing          ! preformance summary
33   USE wrk_nemo        ! work arrays
34
35   IMPLICIT NONE
36   PRIVATE
37
38   PUBLIC   dia_hsb        ! routine called by step.F90
39   PUBLIC   dia_hsb_init   ! routine called by nemogcm.F90
40   PUBLIC   dia_hsb_rst    ! routine called by step.F90
41
42   LOGICAL, PUBLIC ::   ln_diahsb   !: check the heat and salt budgets
43
44   REAL(wp) ::   surf_tot              ! ocean surface
45   REAL(wp) ::   frc_t, frc_s, frc_v   ! global forcing trends
46   REAL(wp) ::   frc_wn_t, frc_wn_s    ! global forcing trends
47   !
48   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   surf          , ssh_ini          !
49   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   ssh_hc_loc_ini, ssh_sc_loc_ini   !
50   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   hc_loc_ini, sc_loc_ini, e3t_ini  !
51
52   !! * Substitutions
53#  include "domzgr_substitute.h90"
54#  include "vectopt_loop_substitute.h90"
55   !!----------------------------------------------------------------------
56   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
57   !! $Id$
58   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
59   !!----------------------------------------------------------------------
60CONTAINS
61
62   SUBROUTINE dia_hsb( kt )
63      !!---------------------------------------------------------------------------
64      !!                  ***  ROUTINE dia_hsb  ***
65      !!     
66      !! ** Purpose: Compute the ocean global heat content, salt content and volume conservation
67      !!
68      !! ** Method : - Compute the deviation of heat content, salt content and volume
69      !!             at the current time step from their values at nit000
70      !!             - Compute the contribution of forcing and remove it from these deviations
71      !!
72      !!---------------------------------------------------------------------------
73      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
74      !
75      INTEGER    ::   ji, jj, jk                  ! dummy loop indice
76      REAL(wp)   ::   zdiff_hc    , zdiff_sc      ! heat and salt content variations
77      REAL(wp)   ::   zdiff_hc1   , zdiff_sc1     !  -         -     -        -
78      REAL(wp)   ::   zdiff_v1    , zdiff_v2      ! volume variation
79      REAL(wp)   ::   zerr_hc1    , zerr_sc1      ! heat and salt content misfit
80      REAL(wp)   ::   zvol_tot                    ! volume
81      REAL(wp)   ::   z_frc_trd_t , z_frc_trd_s   !    -     -
82      REAL(wp)   ::   z_frc_trd_v                 !    -     -
83      REAL(wp)   ::   z_wn_trd_t , z_wn_trd_s     !    -     -
84      REAL(wp)   ::   z_ssh_hc , z_ssh_sc         !    -     -
85      REAL(wp), DIMENSION(:,:), POINTER ::   z2d0, z2d1
86      !!---------------------------------------------------------------------------
87      IF( nn_timing == 1 )   CALL timing_start('dia_hsb')     
88      CALL wrk_alloc( jpi,jpj,   z2d0, z2d1 )
89      !
90      tsn(:,:,:,1) = tsn(:,:,:,1) * tmask(:,:,:) ; tsb(:,:,:,1) = tsb(:,:,:,1) * tmask(:,:,:) ;
91      tsn(:,:,:,2) = tsn(:,:,:,2) * tmask(:,:,:) ; tsb(:,:,:,2) = tsb(:,:,:,2) * tmask(:,:,:) ;
92      ! ------------------------- !
93      ! 1 - Trends due to forcing !
94      ! ------------------------- !
95      z_frc_trd_v = r1_rau0 * glob_sum( - ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) * surf(:,:) ) ! volume fluxes
96      z_frc_trd_t =           glob_sum( sbc_tsc(:,:,jp_tem) * surf(:,:) )                               ! heat fluxes
97      z_frc_trd_s =           glob_sum( sbc_tsc(:,:,jp_sal) * surf(:,:) )                               ! salt fluxes
98      ! Add runoff    heat & salt input
99      IF( ln_rnf    )   z_frc_trd_t = z_frc_trd_t + glob_sum( rnf_tsc(:,:,jp_tem) * surf(:,:) )
100      IF( ln_rnf_sal)   z_frc_trd_s = z_frc_trd_s + glob_sum( rnf_tsc(:,:,jp_sal) * surf(:,:) )
101      ! Add ice shelf heat & salt input
102      IF( nn_isf .GE. 1 )  THEN
103          z_frc_trd_t = z_frc_trd_t + glob_sum( risf_tsc(:,:,jp_tem) * surf(:,:) )
104          z_frc_trd_s = z_frc_trd_s + glob_sum( risf_tsc(:,:,jp_sal) * surf(:,:) )
105      ENDIF
106
107      ! Add penetrative solar radiation
108      IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + r1_rau0_rcp * glob_sum( qsr     (:,:) * surf(:,:) )
109      ! Add geothermal heat flux
110      IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t +               glob_sum( qgh_trd0(:,:) * surf(:,:) )
111      !
112      IF( .NOT. lk_vvl ) THEN
113         IF ( ln_isfcav ) THEN
114            DO ji=1,jpi
115               DO jj=1,jpj
116                  z2d0(ji,jj) = surf(ji,jj) * wn(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_tem)
117                  z2d1(ji,jj) = surf(ji,jj) * wn(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_sal)
118               ENDDO
119            ENDDO
120         ELSE
121            z2d0(:,:) = surf(:,:) * wn(:,:,1) * tsb(:,:,1,jp_tem)
122            z2d1(:,:) = surf(:,:) * wn(:,:,1) * tsb(:,:,1,jp_sal)
123         END IF
124         z_wn_trd_t = - glob_sum( z2d0 ) 
125         z_wn_trd_s = - glob_sum( z2d1 )
126      ENDIF
127
128      frc_v = frc_v + z_frc_trd_v * rdt
129      frc_t = frc_t + z_frc_trd_t * rdt
130      frc_s = frc_s + z_frc_trd_s * rdt
131      !                                          ! Advection flux through fixed surface (z=0)
132      IF( .NOT. lk_vvl ) THEN
133         frc_wn_t = frc_wn_t + z_wn_trd_t * rdt
134         frc_wn_s = frc_wn_s + z_wn_trd_s * rdt
135      ENDIF
136
137      ! ------------------------ !
138      ! 2 -  Content variations !
139      ! ------------------------ !
140      zdiff_v2 = 0._wp
141      zdiff_hc = 0._wp
142      zdiff_sc = 0._wp
143
144      ! volume variation (calculated with ssh)
145      zdiff_v1 = glob_sum( surf(:,:) * ( sshn(:,:) - ssh_ini(:,:) ) )
146
147      ! heat & salt content variation (associated with ssh)
148      IF( .NOT. lk_vvl ) THEN
149         IF ( ln_isfcav ) THEN
150            DO ji = 1, jpi
151               DO jj = 1, jpj
152                  z2d0(ji,jj) = surf(ji,jj) * ( tsn(ji,jj,mikt(ji,jj),jp_tem) * sshn(ji,jj) - ssh_hc_loc_ini(ji,jj) ) 
153                  z2d1(ji,jj) = surf(ji,jj) * ( tsn(ji,jj,mikt(ji,jj),jp_sal) * sshn(ji,jj) - ssh_sc_loc_ini(ji,jj) ) 
154               END DO
155            END DO
156         ELSE
157            z2d0(:,:) = surf(:,:) * ( tsn(:,:,1,jp_tem) * sshn(:,:) - ssh_hc_loc_ini(:,:) ) 
158            z2d1(:,:) = surf(:,:) * ( tsn(:,:,1,jp_sal) * sshn(:,:) - ssh_sc_loc_ini(:,:) ) 
159         END IF
160         z_ssh_hc = glob_sum( z2d0 ) 
161         z_ssh_sc = glob_sum( z2d1 ) 
162      ENDIF
163
164      DO jk = 1, jpkm1
165         ! volume variation (calculated with scale factors)
166         zdiff_v2 = zdiff_v2 + glob_sum( surf(:,:) * tmask(:,:,jk) &
167            &                           * ( fse3t_n(:,:,jk) - e3t_ini(:,:,jk) ) )
168         ! heat content variation
169         zdiff_hc = zdiff_hc + glob_sum(  surf(:,:) * tmask(:,:,jk) & 
170            &                           * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_tem) - hc_loc_ini(:,:,jk) ) )
171         ! salt content variation
172         zdiff_sc = zdiff_sc + glob_sum(  surf(:,:) * tmask(:,:,jk)   &
173            &                           * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_sal) - sc_loc_ini(:,:,jk) ) )
174      ENDDO
175
176      ! Substract forcing from heat content, salt content and volume variations
177      zdiff_v1 = zdiff_v1 - frc_v
178      IF( lk_vvl )   zdiff_v2 = zdiff_v2 - frc_v
179      zdiff_hc = zdiff_hc - frc_t
180      zdiff_sc = zdiff_sc - frc_s
181      IF( .NOT. lk_vvl ) THEN
182         zdiff_hc1 = zdiff_hc + z_ssh_hc 
183         zdiff_sc1 = zdiff_sc + z_ssh_sc
184         zerr_hc1  = z_ssh_hc - frc_wn_t
185         zerr_sc1  = z_ssh_sc - frc_wn_s
186      ENDIF
187
188      ! ----------------------- !
189      ! 3 - Diagnostics writing !
190      ! ----------------------- !
191      zvol_tot = 0._wp                    ! total ocean volume (calculated with scale factors)
192      DO jk = 1, jpkm1
193         zvol_tot  = zvol_tot + glob_sum( surf(:,:) * tmask(:,:,jk) * fse3t_n(:,:,jk) )
194      END DO
195
196!!gm to be added ?
197!      IF( .NOT. lk_vvl ) THEN            ! fixed volume, add the ssh contribution
198!        zvol_tot = zvol_tot + glob_sum( surf(:,:) * sshn(:,:) )
199!      ENDIF
200!!gm end
201
202      IF( lk_vvl ) THEN
203        CALL iom_put( 'bgtemper' , zdiff_hc / zvol_tot )              ! Temperature variation (C)
204        CALL iom_put( 'bgsaline' , zdiff_sc / zvol_tot )              ! Salinity    variation (psu)
205        CALL iom_put( 'bgheatco' , zdiff_hc * 1.e-20 * rau0 * rcp )   ! Heat content variation (1.e20 J)
206        CALL iom_put( 'bgsaltco' , zdiff_sc * 1.e-9    )              ! Salt content variation (psu*km3)
207        CALL iom_put( 'bgvolssh' , zdiff_v1 * 1.e-9    )              ! volume ssh variation (km3) 
208        CALL iom_put( 'bgvole3t' , zdiff_v2 * 1.e-9    )              ! volume e3t variation (km3) 
209        CALL iom_put( 'bgfrcvol' , frc_v    * 1.e-9    )              ! vol - surface forcing (km3)
210        CALL iom_put( 'bgfrctem' , frc_t / zvol_tot    )              ! hc  - surface forcing (C)
211        CALL iom_put( 'bgfrcsal' , frc_s / zvol_tot    )              ! sc  - surface forcing (psu)
212      ELSE
213        CALL iom_put( 'bgtemper' , zdiff_hc1 / zvol_tot)              ! Heat content variation (C)
214        CALL iom_put( 'bgsaline' , zdiff_sc1 / zvol_tot)              ! Salt content variation (psu)
215        CALL iom_put( 'bgheatco' , zdiff_hc1 * 1.e-20 * rau0 * rcp )  ! Heat content variation (1.e20 J)
216        CALL iom_put( 'bgsaltco' , zdiff_sc1 * 1.e-9    )             ! Salt content variation (psu*km3)
217        CALL iom_put( 'bgvolssh' , zdiff_v1 * 1.e-9    )              ! volume ssh variation (km3) 
218        CALL iom_put( 'bgfrcvol' , frc_v    * 1.e-9    )              ! vol - surface forcing (km3)
219        CALL iom_put( 'bgfrctem' , frc_t / zvol_tot    )              ! hc  - surface forcing (C)
220        CALL iom_put( 'bgfrcsal' , frc_s / zvol_tot    )              ! sc  - surface forcing (psu)
221        CALL iom_put( 'bgmistem' , zerr_hc1 / zvol_tot )              ! hc  - error due to free surface (C)
222        CALL iom_put( 'bgmissal' , zerr_sc1 / zvol_tot )              ! sc  - error due to free surface (psu)
223      ENDIF
224      !
225      IF( lrst_oce )   CALL dia_hsb_rst( kt, 'WRITE' )
226
227      CALL wrk_dealloc( jpi,jpj,   z2d0, z2d1 )
228
229      IF( nn_timing == 1 )   CALL timing_stop('dia_hsb')
230      !
231   END SUBROUTINE dia_hsb
232
233
234   SUBROUTINE dia_hsb_rst( kt, cdrw )
235     !!---------------------------------------------------------------------
236     !!                   ***  ROUTINE limdia_rst  ***
237     !!                     
238     !! ** Purpose :   Read or write DIA file in restart file
239     !!
240     !! ** Method  :   use of IOM library
241     !!----------------------------------------------------------------------
242     INTEGER         , INTENT(in) ::   kt     ! ocean time-step
243     CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
244     !
245     INTEGER ::   ji, jj, jk   ! dummy loop indices
246     INTEGER ::   id1          ! local integers
247     !!----------------------------------------------------------------------
248     !
249     IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise
250        IF( ln_rstart ) THEN                   !* Read the restart file
251           !id1 = iom_varid( numror, 'frc_vol'  , ldstop = .FALSE. )
252           !
253           IF(lwp) WRITE(numout,*) '~~~~~~~'
254           IF(lwp) WRITE(numout,*) ' dia_hsb_rst at it= ', kt,' date= ', ndastp
255           IF(lwp) WRITE(numout,*) '~~~~~~~'
256           IF(nn_timing == 2)  CALL timing_start('iom_rstget')
257           CALL iom_get( numror, 'frc_v', frc_v )
258           CALL iom_get( numror, 'frc_t', frc_t )
259           CALL iom_get( numror, 'frc_s', frc_s )
260           IF( .NOT. lk_vvl ) THEN
261              CALL iom_get( numror, 'frc_wn_t', frc_wn_t )
262              CALL iom_get( numror, 'frc_wn_s', frc_wn_s )
263           ENDIF
264           CALL iom_get( numror, jpdom_autoglo, 'ssh_ini', ssh_ini )
265           CALL iom_get( numror, jpdom_autoglo, 'e3t_ini', e3t_ini )
266           CALL iom_get( numror, jpdom_autoglo, 'hc_loc_ini', hc_loc_ini )
267           CALL iom_get( numror, jpdom_autoglo, 'sc_loc_ini', sc_loc_ini )
268           IF( .NOT. lk_vvl ) THEN
269              CALL iom_get( numror, jpdom_autoglo, 'ssh_hc_loc_ini', ssh_hc_loc_ini )
270              CALL iom_get( numror, jpdom_autoglo, 'ssh_sc_loc_ini', ssh_sc_loc_ini )
271           ENDIF
272           IF(nn_timing == 2)  CALL timing_stop('iom_rstget')
273       ELSE
274          IF(lwp) WRITE(numout,*) '~~~~~~~'
275          IF(lwp) WRITE(numout,*) ' dia_hsb at initial state '
276          IF(lwp) WRITE(numout,*) '~~~~~~~'
277          ssh_ini(:,:) = sshn(:,:)                                       ! initial ssh
278          DO jk = 1, jpk
279             e3t_ini   (:,:,jk) = fse3t_n(:,:,jk)                        ! initial vertical scale factors
280             hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * fse3t_n(:,:,jk)   ! initial heat content
281             sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * fse3t_n(:,:,jk)   ! initial salt content
282          END DO
283          frc_v = 0._wp                                           ! volume       trend due to forcing
284          frc_t = 0._wp                                           ! heat content   -    -   -    -   
285          frc_s = 0._wp                                           ! salt content   -    -   -    -       
286          IF( .NOT. lk_vvl ) THEN
287             IF ( ln_isfcav ) THEN
288                DO ji=1,jpi
289                   DO jj=1,jpj
290                      ssh_hc_loc_ini(ji,jj) = tsn(ji,jj,mikt(ji,jj),jp_tem) * sshn(ji,jj)   ! initial heat content in ssh
291                      ssh_sc_loc_ini(ji,jj) = tsn(ji,jj,mikt(ji,jj),jp_sal) * sshn(ji,jj)   ! initial salt content in ssh
292                   ENDDO
293                ENDDO
294             ELSE
295                ssh_hc_loc_ini(:,:) = tsn(:,:,1,jp_tem) * sshn(:,:)   ! initial heat content in ssh
296                ssh_sc_loc_ini(:,:) = tsn(:,:,1,jp_sal) * sshn(:,:)   ! initial salt content in ssh
297             END IF
298             frc_wn_t = 0._wp                                       ! initial heat content misfit due to free surface
299             frc_wn_s = 0._wp                                       ! initial salt content misfit due to free surface
300          ENDIF
301       ENDIF
302
303     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
304        !                                   ! -------------------
305        IF(lwp) WRITE(numout,*) '~~~~~~~'
306        IF(lwp) WRITE(numout,*) ' dia_hsb_rst at it= ', kt,' date= ', ndastp
307        IF(lwp) WRITE(numout,*) '~~~~~~~'
308        IF(nn_timing == 2)  CALL timing_start('iom_rstput')
309        CALL iom_rstput( kt, nitrst, numrow, 'frc_v'   , frc_v     )
310        CALL iom_rstput( kt, nitrst, numrow, 'frc_t'   , frc_t     )
311        CALL iom_rstput( kt, nitrst, numrow, 'frc_s'   , frc_s     )
312        IF( .NOT. lk_vvl ) THEN
313           CALL iom_rstput( kt, nitrst, numrow, 'frc_wn_t', frc_wn_t )
314           CALL iom_rstput( kt, nitrst, numrow, 'frc_wn_s', frc_wn_s )
315        ENDIF
316        CALL iom_rstput( kt, nitrst, numrow, 'ssh_ini', ssh_ini )
317        CALL iom_rstput( kt, nitrst, numrow, 'e3t_ini', e3t_ini )
318        CALL iom_rstput( kt, nitrst, numrow, 'hc_loc_ini', hc_loc_ini )
319        CALL iom_rstput( kt, nitrst, numrow, 'sc_loc_ini', sc_loc_ini )
320        IF( .NOT. lk_vvl ) THEN
321           CALL iom_rstput( kt, nitrst, numrow, 'ssh_hc_loc_ini', ssh_hc_loc_ini )
322           CALL iom_rstput( kt, nitrst, numrow, 'ssh_sc_loc_ini', ssh_sc_loc_ini )
323        ENDIF
324        IF(nn_timing == 2)  CALL timing_stop('iom_rstput')
325        !
326     ENDIF
327     !
328   END SUBROUTINE dia_hsb_rst
329
330
331   SUBROUTINE dia_hsb_init
332      !!---------------------------------------------------------------------------
333      !!                  ***  ROUTINE dia_hsb  ***
334      !!     
335      !! ** Purpose: Initialization for the heat salt volume budgets
336      !!
337      !! ** Method : Compute initial heat content, salt content and volume
338      !!
339      !! ** Action : - Compute initial heat content, salt content and volume
340      !!             - Initialize forcing trends
341      !!             - Compute coefficients for conversion
342      !!---------------------------------------------------------------------------
343      INTEGER ::   jk       ! dummy loop indice
344      INTEGER ::   ierror   ! local integer
345      INTEGER ::   ios
346      !
347      NAMELIST/namhsb/ ln_diahsb
348      !!----------------------------------------------------------------------
349
350      IF(lwp) THEN
351         WRITE(numout,*)
352         WRITE(numout,*) 'dia_hsb_init : check the heat and salt budgets'
353         WRITE(numout,*) '~~~~~~~~ '
354      ENDIF
355
356      REWIND( numnam_ref )              ! Namelist namhsb in reference namelist
357      READ  ( numnam_ref, namhsb, IOSTAT = ios, ERR = 901)
358901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namhsb in reference namelist', lwp )
359
360      REWIND( numnam_cfg )              ! Namelist namhsb in configuration namelist
361      READ  ( numnam_cfg, namhsb, IOSTAT = ios, ERR = 902 )
362902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namhsb in configuration namelist', lwp )
363      IF(lwm .AND. nprint > 2) WRITE ( numond, namhsb )
364
365      !
366      IF(lwp) THEN                   ! Control print
367         WRITE(numout,*)
368         WRITE(numout,*) 'dia_hsb_init : check the heat and salt budgets'
369         WRITE(numout,*) '~~~~~~~~~~~~'
370         WRITE(numout,*) '   Namelist namhsb : set hsb parameters'
371         WRITE(numout,*) '      Switch for hsb diagnostic (T) or not (F)  ln_diahsb  = ', ln_diahsb
372         WRITE(numout,*)
373      ENDIF
374
375      IF( .NOT. ln_diahsb )   RETURN
376         !      IF( .NOT. lk_mpp_rep ) &
377         !        CALL ctl_stop (' Your global mpp_sum if performed in single precision - 64 bits -', &
378         !             &         ' whereas the global sum to be precise must be done in double precision ',&
379         !             &         ' please add key_mpp_rep')
380
381      ! ------------------- !
382      ! 1 - Allocate memory !
383      ! ------------------- !
384      ALLOCATE( hc_loc_ini(jpi,jpj,jpk), sc_loc_ini(jpi,jpj,jpk), &
385         &      e3t_ini(jpi,jpj,jpk), surf(jpi,jpj),  ssh_ini(jpi,jpj), STAT=ierror )
386      IF( ierror > 0 ) THEN
387         CALL ctl_stop( 'dia_hsb: unable to allocate hc_loc_ini' )   ;   RETURN
388      ENDIF
389
390      IF(.NOT. lk_vvl ) ALLOCATE( ssh_hc_loc_ini(jpi,jpj), ssh_sc_loc_ini(jpi,jpj),STAT=ierror )
391      IF( ierror > 0 ) THEN
392         CALL ctl_stop( 'dia_hsb: unable to allocate hc_loc_ini' )   ;   RETURN
393      ENDIF
394
395      ! ----------------------------------------------- !
396      ! 2 - Time independant variables and file opening !
397      ! ----------------------------------------------- !
398      IF(lwp) WRITE(numout,*) "dia_hsb: heat salt volume budgets activated"
399      IF(lwp) WRITE(numout,*) '~~~~~~~'
400      surf(:,:) = e1t(:,:) * e2t(:,:) * tmask_i(:,:)      ! masked surface grid cell area
401      surf_tot  = glob_sum( surf(:,:) )                                       ! total ocean surface area
402
403      IF( lk_bdy ) CALL ctl_warn( 'dia_hsb does not take open boundary fluxes into account' )         
404      !
405      ! ---------------------------------- !
406      ! 4 - initial conservation variables !
407      ! ---------------------------------- !
408      CALL dia_hsb_rst( nit000, 'READ' )  !* read or initialize all required files
409      !
410   END SUBROUTINE dia_hsb_init
411
412   !!======================================================================
413END MODULE diahsb
Note: See TracBrowser for help on using the repository browser.