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

source: branches/2015/dev_r5204_CNRS_PISCES_dcy/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zopt.F90 @ 5206

Last change on this file since 5206 was 5206, checked in by cetlod, 9 years ago

First improvment of diurnal cycle for passive tracers, see ticket #1484

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