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.
p4zopt.F90 in branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zopt.F90 @ 7520

Last change on this file since 7520 was 7520, checked in by cbricaud, 8 years ago

cleaning and bug correction in CRS branch

File size: 19.9 KB
Line 
1MODULE p4zopt
2   !!======================================================================
3   !!                         ***  MODULE p4zopt  ***
4   !! TOP - PISCES : Compute the light availability in the water column
5   !!======================================================================
6   !! History :   1.0  !  2004     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.2  !  2009-04  (C. Ethe, G. Madec)  optimisation
9   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Improve light availability of nano & diat
10   !!----------------------------------------------------------------------
11#if defined  key_pisces
12   !!----------------------------------------------------------------------
13   !!   'key_pisces'                                       PISCES bio-model
14   !!----------------------------------------------------------------------
15   !!   p4z_opt       : light availability in the water column
16   !!----------------------------------------------------------------------
17   USE oce_trc        ! tracer-ocean share variables
18   USE sms_pisces     ! Source Minus Sink of PISCES
19   USE fldread         !  time interpolation
20   USE prtctl_trc,ONLY:prt_ctl_trc_info,prt_ctl_trc      !  print control for debugging
21   USE trc_oce, ONLY : trc_oce_rgb
22
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC   p4z_opt        ! called in p4zbio.F90 module
27   PUBLIC   p4z_opt_init   ! called in trcsms_pisces.F90 module
28   PUBLIC   p4z_opt_alloc
29
30   !! * Shared module variables
31
32   LOGICAL  :: ln_varpar   !: boolean for variable PAR fraction
33   REAL(wp) :: parlux      !: Fraction of shortwave as PAR
34   REAL(wp) :: xparsw                 !: parlux/3
35   REAL(wp) :: xsi0r                 !:  1. /rn_si0
36
37   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_par      ! structure of input par
38   INTEGER , PARAMETER :: nbtimes = 365  !: maximum number of times record in a file
39   INTEGER  :: ntimes_par                ! number of time steps in a file
40   REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:,:) :: par_varsw    !: PAR fraction of shortwave
41
42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: enano, ediat   !: PAR for phyto, nano and diat
43   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: etot_ndcy      !: PAR over 24h in case of diurnal cycle
44   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: emoy           !: averaged PAR in the mixed layer
45   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ekb, ekg, ekr  !: wavelength (Red-Green-Blue)
46
47   INTEGER  ::   nksrp   ! levels below which the light cannot penetrate ( depth larger than 391 m)
48
49   REAL(wp), DIMENSION(3,61), PUBLIC ::   xkrgb   !: tabulated attenuation coefficients for RGB absorption
50   
51   !!* Substitution
52#  include "top_substitute.h90"
53   !!----------------------------------------------------------------------
54   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
55   !! $Id: p4zopt.F90 3160 2011-11-20 14:27:18Z cetlod $
56   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
57   !!----------------------------------------------------------------------
58CONTAINS
59
60   SUBROUTINE p4z_opt( kt, knt )
61      !!---------------------------------------------------------------------
62      !!                     ***  ROUTINE p4z_opt  ***
63      !!
64      !! ** Purpose :   Compute the light availability in the water column
65      !!              depending on the depth and the chlorophyll concentration
66      !!
67      !! ** Method  : - ???
68      !!---------------------------------------------------------------------
69      !
70      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step
71      !
72      INTEGER  ::   ji, jj, jk
73      INTEGER  ::   irgb
74      REAL(wp) ::   zchl
75      REAL(wp) ::   zc0 , zc1 , zc2, zc3, z1_dep
76      REAL(wp) ::   zfse3
77      REAL(wp), POINTER, DIMENSION(:,:  ) :: zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4
78      REAL(wp), POINTER, DIMENSION(:,:  ) :: zqsr100, zqsr_corr
79      REAL(wp), POINTER, DIMENSION(:,:,:) :: zpar, ze0, ze1, ze2, ze3
80      !!---------------------------------------------------------------------
81      !
82      IF( nn_timing == 1 )  CALL timing_start('p4z_opt')
83      !
84      ! Allocate temporary workspace
85      CALL wrk_alloc( jpi, jpj,      zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4 )
86      CALL wrk_alloc( jpi, jpj,      zqsr100, zqsr_corr )
87      CALL wrk_alloc( jpi, jpj, jpk, zpar, ze0, ze1, ze2, ze3 )
88
89      IF( knt == 1 .AND. ln_varpar ) CALL p4z_opt_sbc( kt )
90
91      !     Initialisation of variables used to compute PAR
92      !     -----------------------------------------------
93      ze1(:,:,:) = 0._wp
94      ze2(:,:,:) = 0._wp
95      ze3(:,:,:) = 0._wp
96      !                                        !* attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue)
97      DO jk = 1, jpkm1                         !  --------------------------------------------------------
98!CDIR NOVERRCHK
99         DO jj = 1, jpj
100!CDIR NOVERRCHK
101            DO ji = 1, jpi
102               zchl = ( trb(ji,jj,jk,jpnch) + trb(ji,jj,jk,jpdch) + rtrn ) * 1.e6
103               zchl = MIN(  10. , MAX( 0.05, zchl )  )
104               irgb = NINT( 41 + 20.* LOG10( zchl ) + rtrn )
105               !                                                         
106               ekb(ji,jj,jk) = xkrgb(1,irgb) * fse3t(ji,jj,jk)
107               ekg(ji,jj,jk) = xkrgb(2,irgb) * fse3t(ji,jj,jk)
108               ekr(ji,jj,jk) = xkrgb(3,irgb) * fse3t(ji,jj,jk)
109            END DO
110         END DO
111      END DO
112      !                                        !* Photosynthetically Available Radiation (PAR)
113      !                                        !  --------------------------------------
114      IF( l_trcdm2dc ) THEN                     !  diurnal cycle
115         !
116         zqsr_corr(:,:) = qsr_mean(:,:) / ( 1. - fr_i(:,:) + rtrn )
117         !
118         CALL p4z_opt_par( kt, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 ) 
119         !
120         DO jk = 1, nksrp     
121            etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)
122            enano    (:,:,jk) =  2.1 * ze1(:,:,jk) + 0.42 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)
123            ediat    (:,:,jk) =  1.6 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.7 * ze3(:,:,jk)
124         END DO
125         !
126         zqsr_corr(:,:) = qsr(:,:) / ( 1. - fr_i(:,:) + rtrn )
127         !
128         CALL p4z_opt_par( kt, zqsr_corr, ze1, ze2, ze3 ) 
129         !
130         DO jk = 1, nksrp     
131            etot(:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk)
132         END DO
133         !
134      ELSE
135         !
136         zqsr_corr(:,:) = qsr(:,:) / ( 1. - fr_i(:,:) + rtrn )
137         !
138         CALL p4z_opt_par( kt, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 ) 
139         !
140         DO jk = 1, nksrp     
141            etot (:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)
142            enano(:,:,jk) =  2.1 * ze1(:,:,jk) + 0.42 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)
143            ediat(:,:,jk) =  1.6 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.7 * ze3(:,:,jk)
144         END DO
145         etot_ndcy(:,:,:) =  etot(:,:,:) 
146      ENDIF
147
148
149      IF( ln_qsr_bio ) THEN                    !* heat flux accros w-level (used in the dynamics)
150         !                                     !  ------------------------
151         CALL p4z_opt_par( kt, qsr, ze1, ze2, ze3, pe0=ze0 )
152         !
153         etot3(:,:,1) =  qsr(:,:) * tmask(:,:,1)
154         DO jk = 2, nksrp + 1
155            etot3(:,:,jk) =  ( ze0(:,:,jk) + ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) ) * tmask(:,:,jk)
156         END DO
157         !                                     !  ------------------------
158      ENDIF
159      !                                        !* Euphotic depth and level
160      neln(:,:) = 1                            !  ------------------------
161      heup(:,:) = 300.
162
163      DO jk = 2, nksrp
164         DO jj = 1, jpj
165           DO ji = 1, jpi
166              IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= zqsr100(ji,jj) )  THEN
167                 neln(ji,jj) = jk+1                    ! Euphotic level : 1rst T-level strictly below Euphotic layer
168                 !                                     ! nb: ensure the compatibility with nmld_trc definition in trd_mld_trc_zint
169                 heup(ji,jj) = fsdepw(ji,jj,jk+1)      ! Euphotic layer depth
170              ENDIF
171           END DO
172        END DO
173      END DO
174      !
175      heup(:,:) = MIN( 300., heup(:,:) )
176      !                                        !* mean light over the mixed layer
177      zdepmoy(:,:)   = 0.e0                    !  -------------------------------
178      zetmp1 (:,:)   = 0.e0
179      zetmp2 (:,:)   = 0.e0
180      zetmp3 (:,:)   = 0.e0
181      zetmp4 (:,:)   = 0.e0
182
183      DO jk = 1, nksrp
184!CDIR NOVERRCHK
185         DO jj = 1, jpj
186!CDIR NOVERRCHK
187            DO ji = 1, jpi
188               IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
189                  zetmp1 (ji,jj) = zetmp1 (ji,jj) + etot     (ji,jj,jk) * fse3t(ji,jj,jk) ! remineralisation
190                  zetmp2 (ji,jj) = zetmp2 (ji,jj) + etot_ndcy(ji,jj,jk) * fse3t(ji,jj,jk) ! production
191                  zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano    (ji,jj,jk) * fse3t(ji,jj,jk) ! production
192                  zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat    (ji,jj,jk) * fse3t(ji,jj,jk) ! production
193                  zdepmoy(ji,jj) = zdepmoy(ji,jj) + fse3t(ji,jj,jk)
194               ENDIF
195            END DO
196         END DO
197      END DO
198      !
199      emoy(:,:,:) = etot(:,:,:)       ! remineralisation
200      zpar(:,:,:) = etot_ndcy(:,:,:)  ! diagnostic : PAR with no diurnal cycle
201      !
202      DO jk = 1, nksrp
203!CDIR NOVERRCHK
204         DO jj = 1, jpj
205!CDIR NOVERRCHK
206            DO ji = 1, jpi
207               IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
208                  z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn )
209                  emoy (ji,jj,jk) = zetmp1(ji,jj) * z1_dep
210                  zpar (ji,jj,jk) = zetmp2(ji,jj) * z1_dep
211                  enano(ji,jj,jk) = zetmp3(ji,jj) * z1_dep
212                  ediat(ji,jj,jk) = zetmp4(ji,jj) * z1_dep
213               ENDIF
214            END DO
215         END DO
216      END DO
217      !
218      IF( lk_iomput ) THEN
219        IF( knt == nrdttrc ) THEN
220           IF( iom_use( "Heup"  ) ) CALL iom_put( "Heup" , heup(:,:  ) * tmask(:,:,1) )  ! euphotic layer deptht
221           IF( iom_use( "PARDM" ) ) CALL iom_put( "PARDM", zpar(:,:,:) * tmask(:,:,:) )  ! Photosynthetically Available Radiation
222           IF( iom_use( "PAR"   ) ) CALL iom_put( "PAR"  , emoy(:,:,:) * tmask(:,:,:) )  ! Photosynthetically Available Radiation
223        ENDIF
224      ELSE
225         IF( ln_diatrc ) THEN        ! save output diagnostics
226            trc2d(:,:,  jp_pcs0_2d + 10) = heup(:,:  ) * tmask(:,:,1)
227            trc3d(:,:,:,jp_pcs0_3d + 3)  = etot(:,:,:) * tmask(:,:,:)
228         ENDIF
229      ENDIF
230      !
231      CALL wrk_dealloc( jpi, jpj,      zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4 )
232      CALL wrk_dealloc( jpi, jpj,      zqsr100, zqsr_corr )
233      CALL wrk_dealloc( jpi, jpj, jpk, zpar,  ze0, ze1, ze2, ze3 )
234      !
235      IF( nn_timing == 1 )  CALL timing_stop('p4z_opt')
236      !
237   END SUBROUTINE p4z_opt
238
239   SUBROUTINE p4z_opt_par( kt, pqsr, pe1, pe2, pe3, pe0, pqsr100 ) 
240      !!----------------------------------------------------------------------
241      !!                  ***  routine p4z_opt_par  ***
242      !!
243      !! ** purpose :   compute PAR of each wavelength (Red-Green-Blue)
244      !!                for a given shortwave radiation
245      !!
246      !!----------------------------------------------------------------------
247      !! * arguments
248      INTEGER, INTENT(in)                                        ::  kt            !   ocean time-step
249      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in)               ::  pqsr          !   shortwave
250      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)            ::  pe1 , pe2 , pe3   !  PAR ( R-G-B)
251      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout), OPTIONAL  ::  pe0 
252      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(out)  , OPTIONAL  ::  pqsr100 
253      !! * local variables
254      INTEGER    ::   ji, jj, jk     ! dummy loop indices
255      REAL(wp), POINTER, DIMENSION(:,:)     ::  zqsr          !   shortwave
256      !!----------------------------------------------------------------------
257      CALL wrk_alloc( jpi, jpj, zqsr )
258
259      !  Real shortwave
260      IF( ln_varpar ) THEN  ;  zqsr(:,:) = par_varsw(:,:) * pqsr(:,:)
261      ELSE                  ;  zqsr(:,:) = xparsw         * pqsr(:,:)
262      ENDIF
263
264      !  Light at the euphotic depth
265      IF( PRESENT( pqsr100 ) )  pqsr100(:,:) = 0.01 * 3. * zqsr(:,:)
266      !
267      IF( PRESENT( pe0 ) ) THEN     !  W-level
268         !
269         pe0(:,:,1) = pqsr(:,:) - 3. * zqsr(:,:)    !   ( 1 - 3 * alpha ) * q
270         pe1(:,:,1) = zqsr(:,:)         
271         pe2(:,:,1) = zqsr(:,:)
272         pe3(:,:,1) = zqsr(:,:)
273         !
274         DO jk = 2, nksrp + 1
275!CDIR NOVERRCHK
276            DO jj = 1, jpj
277!CDIR NOVERRCHK
278               DO ji = 1, jpi
279                  pe0(ji,jj,jk) = pe0(ji,jj,jk-1) * EXP( -fse3t(ji,jj,jk-1) * xsi0r )
280                  pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -ekb(ji,jj,jk-1 ) )
281                  pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -ekg(ji,jj,jk-1 ) )
282                  pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -ekr(ji,jj,jk-1 ) )
283               END DO
284              !
285            END DO
286            !
287         END DO
288        !
289      ELSE   ! T- level
290        !
291        pe1(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekb(:,:,1) )
292        pe2(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekg(:,:,1) )
293        pe3(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekr(:,:,1) )
294        !
295        DO jk = 2, nksrp     
296!CDIR NOVERRCHK
297           DO jj = 1, jpj
298!CDIR NOVERRCHK
299              DO ji = 1, jpi
300                 pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -0.5 * ( ekb(ji,jj,jk-1) + ekb(ji,jj,jk) ) )
301                 pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -0.5 * ( ekg(ji,jj,jk-1) + ekg(ji,jj,jk) ) )
302                 pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -0.5 * ( ekr(ji,jj,jk-1) + ekr(ji,jj,jk) ) )
303              END DO
304           END DO
305        END DO   
306        !
307      ENDIF
308      !
309      CALL wrk_dealloc( jpi, jpj, zqsr )
310      !
311   END SUBROUTINE p4z_opt_par
312
313
314   SUBROUTINE p4z_opt_sbc( kt )
315      !!----------------------------------------------------------------------
316      !!                  ***  routine p4z_opt_sbc  ***
317      !!
318      !! ** purpose :   read and interpolate the variable PAR fraction
319      !!                of shortwave radiation
320      !!
321      !! ** method  :   read the files and interpolate the appropriate variables
322      !!
323      !! ** input   :   external netcdf files
324      !!
325      !!----------------------------------------------------------------------
326      !! * arguments
327      INTEGER ,                INTENT(in) ::   kt     ! ocean time step
328
329      !! * local declarations
330      INTEGER  :: ji,jj
331      REAL(wp) :: zcoef
332      !!---------------------------------------------------------------------
333      !
334      IF( nn_timing == 1 )  CALL timing_start('p4z_optsbc')
335      !
336      ! Compute par_varsw at nit000 or only if there is more than 1 time record in par coefficient file
337      IF( ln_varpar ) THEN
338         IF( kt == nit000 .OR. ( kt /= nit000 .AND. ntimes_par > 1 ) ) THEN
339            CALL fld_read( kt, 1, sf_par )
340            par_varsw(:,:) = ( sf_par(1)%fnow(:,:,1) ) / 3.0
341         ENDIF
342      ENDIF
343      !
344      IF( nn_timing == 1 )  CALL timing_stop('p4z_optsbc')
345      !
346   END SUBROUTINE p4z_opt_sbc
347
348   SUBROUTINE p4z_opt_init
349      !!----------------------------------------------------------------------
350      !!                  ***  ROUTINE p4z_opt_init  ***
351      !!
352      !! ** Purpose :   Initialization of tabulated attenuation coef
353      !!                and of the percentage of PAR in Shortwave
354      !!
355      !! ** Input   :   external ascii and netcdf files
356      !!----------------------------------------------------------------------
357      !
358      INTEGER :: numpar
359      INTEGER :: ierr
360      INTEGER :: ios                 ! Local integer output status for namelist read
361      REAL(wp), DIMENSION(nbtimes) :: zsteps                 ! times records
362      !
363      CHARACTER(len=100) ::  cn_dir          ! Root directory for location of ssr files
364      TYPE(FLD_N) ::   sn_par                ! informations about the fields to be read
365      !
366      NAMELIST/nampisopt/cn_dir, sn_par, ln_varpar, parlux
367
368      !!----------------------------------------------------------------------
369
370      IF( nn_timing == 1 )  CALL timing_start('p4z_opt_init')
371
372      REWIND( numnatp_ref )              ! Namelist nampisopt in reference namelist : Pisces attenuation coef. and PAR
373      READ  ( numnatp_ref, nampisopt, IOSTAT = ios, ERR = 901)
374901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisopt in reference namelist', lwp )
375
376      REWIND( numnatp_cfg )              ! Namelist nampisopt in configuration namelist : Pisces attenuation coef. and PAR
377      READ  ( numnatp_cfg, nampisopt, IOSTAT = ios, ERR = 902 )
378902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisopt in configuration namelist', lwp )
379      IF(lwm) WRITE ( numonp, nampisopt )
380
381      IF(lwp) THEN
382         WRITE(numout,*) ' '
383         WRITE(numout,*) ' namelist : nampisopt '
384         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~ '
385         WRITE(numout,*) '    PAR as a variable fraction of SW     ln_varpar      = ', ln_varpar
386         WRITE(numout,*) '    Default value for the PAR fraction   parlux         = ', parlux
387      ENDIF
388      !
389      xparsw = parlux / 3.0
390      xsi0r  = 1.e0 / rn_si0
391      !
392      ! Variable PAR at the surface of the ocean
393      ! ----------------------------------------
394      IF( ln_varpar ) THEN
395         IF(lwp) WRITE(numout,*) '    initialize variable par fraction '
396         IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
397         !
398         ALLOCATE( par_varsw(jpi,jpj) )
399         !
400         ALLOCATE( sf_par(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst
401         IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_opt_init: unable to allocate sf_par structure' )
402         !
403         CALL fld_fill( sf_par, (/ sn_par /), cn_dir, 'p4z_opt_init', 'Variable PAR fraction ', 'nampisopt' )
404                                   ALLOCATE( sf_par(1)%fnow(jpi,jpj,1)   )
405         IF( sn_par%ln_tint )      ALLOCATE( sf_par(1)%fdta(jpi,jpj,1,2) )
406
407         CALL iom_open (  TRIM( sn_par%clname ) , numpar )
408         CALL iom_gettime( numpar, zsteps, kntime=ntimes_par)  ! get number of record in file
409      ENDIF
410      !
411      CALL trc_oce_rgb( xkrgb )                  ! tabulated attenuation coefficients
412      nksrp = trc_oce_ext_lev( r_si2, 0.33e2 )     ! max level of light extinction (Blue Chl=0.01)
413      !
414      IF(lwp) WRITE(numout,*) '        level of light extinction = ', nksrp, ' ref depth = ', gdepw_1d(nksrp+1), ' m'
415      !
416                         ekr      (:,:,:) = 0._wp
417                         ekb      (:,:,:) = 0._wp
418                         ekg      (:,:,:) = 0._wp
419                         etot     (:,:,:) = 0._wp
420                         etot_ndcy(:,:,:) = 0._wp
421                         enano    (:,:,:) = 0._wp
422                         ediat    (:,:,:) = 0._wp
423      IF( ln_qsr_bio )   etot3    (:,:,:) = 0._wp
424      !
425      IF( nn_timing == 1 )  CALL timing_stop('p4z_opt_init')
426      !
427   END SUBROUTINE p4z_opt_init
428
429
430   INTEGER FUNCTION p4z_opt_alloc()
431      !!----------------------------------------------------------------------
432      !!                     ***  ROUTINE p4z_opt_alloc  ***
433      !!----------------------------------------------------------------------
434      ALLOCATE( ekb(jpi,jpj,jpk)      , ekr(jpi,jpj,jpk), ekg(jpi,jpj,jpk),   &
435        &       enano(jpi,jpj,jpk)    , ediat(jpi,jpj,jpk), &
436        &       etot_ndcy(jpi,jpj,jpk), emoy (jpi,jpj,jpk), STAT=p4z_opt_alloc ) 
437         !
438      IF( p4z_opt_alloc /= 0 ) CALL ctl_warn('p4z_opt_alloc : failed to allocate arrays.')
439      !
440   END FUNCTION p4z_opt_alloc
441
442#else
443   !!----------------------------------------------------------------------
444   !!  Dummy module :                                   No PISCES bio-model
445   !!----------------------------------------------------------------------
446CONTAINS
447   SUBROUTINE p4z_opt                   ! Empty routine
448   END SUBROUTINE p4z_opt
449#endif 
450
451   !!======================================================================
452END MODULE p4zopt
Note: See TracBrowser for help on using the repository browser.