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

source: branches/2017/dev_merge_2017/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zopt.F90 @ 9124

Last change on this file since 9124 was 9124, checked in by gm, 6 years ago

dev_merge_2017: ln_timing instead of nn_timing + restricted timing to nemo_init and routine called by step in OPA_SRC

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