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_r5803_NOC_WAD/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zopt.F90 @ 5870

Last change on this file since 5870 was 5870, checked in by acc, 8 years ago

Branch 2015/dev_r5803_NOC_WAD. Merge in trunk changes from 5803 to 5869 in preparation for merge. Also tidied and reorganised some wetting and drying code. Renamed wadlmt.F90 to wetdry.F90. Wetting drying code changes restricted to domzgr.F90, domvvl.F90 nemogcm.F90 sshwzv.F90, dynspg_ts.F90, wetdry.F90 and dynhpg.F90. Code passes full SETTE tests with ln_wd=.false.. Still awaiting test case for checking with ln_wd=.false.

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