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 NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z/p4zopt.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • Property svn:keywords set to Id
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 4.0 , NEMO Consortium (2018)
46   !! $Id$
47   !! Software governed by the CeCILL license (see ./LICENSE)
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), ALLOCATABLE, DIMENSION(:,:  ) :: zetmp5
67      REAL(wp), DIMENSION(jpi,jpj    ) :: zdepmoy, zetmp1, zetmp2, zetmp3, zetmp4
68      REAL(wp), DIMENSION(jpi,jpj    ) :: zqsr100, zqsr_corr
69      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpar, ze0, ze1, ze2, ze3, zchl3d
70      !!---------------------------------------------------------------------
71      !
72      IF( ln_timing )   CALL timing_start('p4z_opt')
73      IF( ln_p5z    )   ALLOCATE( zetmp5(jpi,jpj) )
74
75      IF( knt == 1 .AND. ln_varpar )   CALL p4z_opt_sbc( kt )
76
77      !     Initialisation of variables used to compute PAR
78      !     -----------------------------------------------
79      ze1(:,:,:) = 0._wp
80      ze2(:,:,:) = 0._wp
81      ze3(:,:,:) = 0._wp
82      !
83      !                                        !* attenuation coef. function of Chlorophyll and wavelength (Red-Green-Blue)
84      !                                        !  --------------------------------------------------------
85                     zchl3d(:,:,:) = trb(:,:,:,jpnch) + trb(:,:,:,jpdch)
86      IF( ln_p5z )   zchl3d(:,:,:) = zchl3d(:,:,:)    + trb(:,:,:,jppch)
87      !
88      DO jk = 1, jpkm1   
89         DO jj = 1, jpj
90            DO ji = 1, jpi
91               zchl = ( zchl3d(ji,jj,jk) + rtrn ) * 1.e6
92               zchl = MIN(  10. , MAX( 0.05, zchl )  )
93               irgb = NINT( 41 + 20.* LOG10( zchl ) + rtrn )
94               !                                                         
95               ekb(ji,jj,jk) = xkrgb(1,irgb) * e3t_n(ji,jj,jk)
96               ekg(ji,jj,jk) = xkrgb(2,irgb) * e3t_n(ji,jj,jk)
97               ekr(ji,jj,jk) = xkrgb(3,irgb) * e3t_n(ji,jj,jk)
98            END DO
99         END DO
100      END DO
101      !                                        !* Photosynthetically Available Radiation (PAR)
102      !                                        !  --------------------------------------
103      IF( l_trcdm2dc ) THEN                     !  diurnal cycle
104         !
105         zqsr_corr(:,:) = qsr_mean(:,:) / ( 1.-fr_i(:,:) + rtrn )
106         !
107         CALL p4z_opt_par( kt, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100 ) 
108         !
109         DO jk = 1, nksrp     
110            etot_ndcy(:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)
111            enano    (:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)
112            ediat    (:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)
113         END DO
114         IF( ln_p5z ) THEN
115            DO jk = 1, nksrp     
116              epico  (:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)
117            END DO
118         ENDIF
119         !
120         zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn )
121         !
122         CALL p4z_opt_par( kt, zqsr_corr, ze1, ze2, ze3 ) 
123         !
124         DO jk = 1, nksrp     
125            etot(:,:,jk) =  ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk)
126         END DO
127         !
128      ELSE
129         !
130         zqsr_corr(:,:) = qsr(:,:) / ( 1.-fr_i(:,:) + rtrn )
131         !
132         CALL p4z_opt_par( kt, zqsr_corr, ze1, ze2, ze3, pqsr100 = zqsr100  ) 
133         !
134         DO jk = 1, nksrp     
135            etot (:,:,jk) =        ze1(:,:,jk) +        ze2(:,:,jk) +       ze3(:,:,jk)
136            enano(:,:,jk) =  1.85 * ze1(:,:,jk) + 0.69 * ze2(:,:,jk) + 0.46 * ze3(:,:,jk)
137            ediat(:,:,jk) =  1.62 * ze1(:,:,jk) + 0.74 * ze2(:,:,jk) + 0.63 * ze3(:,:,jk)
138         END DO
139         IF( ln_p5z ) THEN
140            DO jk = 1, nksrp     
141              epico(:,:,jk) =  1.94 * ze1(:,:,jk) + 0.66 * ze2(:,:,jk) + 0.4 * ze3(:,:,jk)
142            END DO
143         ENDIF
144         etot_ndcy(:,:,:) =  etot(:,:,:) 
145      ENDIF
146
147
148      IF( ln_qsr_bio ) THEN                    !* heat flux accros w-level (used in the dynamics)
149         !                                     !  ------------------------
150         CALL p4z_opt_par( kt, qsr, ze1, ze2, ze3, pe0=ze0 )
151         !
152         etot3(:,:,1) =  qsr(:,:) * tmask(:,:,1)
153         DO jk = 2, nksrp + 1
154            etot3(:,:,jk) =  ( ze0(:,:,jk) + ze1(:,:,jk) + ze2(:,:,jk) + ze3(:,:,jk) ) * tmask(:,:,jk)
155         END DO
156         !                                     !  ------------------------
157      ENDIF
158      !                                        !* Euphotic depth and level
159      neln   (:,:) = 1                            !  ------------------------
160      heup   (:,:) = gdepw_n(:,:,2)
161      heup_01(:,:) = gdepw_n(:,:,2)
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) = gdepw_n(ji,jj,jk+1)     ! Euphotic layer depth
170              ENDIF
171              IF( etot_ndcy(ji,jj,jk) * tmask(ji,jj,jk) >= 0.50 )  THEN
172                 heup_01(ji,jj) = gdepw_n(ji,jj,jk+1)  ! Euphotic layer depth (light level definition)
173              ENDIF
174           END DO
175        END DO
176      END DO
177      !
178      heup   (:,:) = MIN( 300., heup   (:,:) )
179      heup_01(:,:) = MIN( 300., heup_01(:,:) )
180      !                                        !* mean light over the mixed layer
181      zdepmoy(:,:)   = 0.e0                    !  -------------------------------
182      zetmp1 (:,:)   = 0.e0
183      zetmp2 (:,:)   = 0.e0
184
185      DO jk = 1, nksrp
186         DO jj = 1, jpj
187            DO ji = 1, jpi
188               IF( gdepw_n(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
189                  zetmp1 (ji,jj) = zetmp1 (ji,jj) + etot     (ji,jj,jk) * e3t_n(ji,jj,jk) ! remineralisation
190                  zetmp2 (ji,jj) = zetmp2 (ji,jj) + etot_ndcy(ji,jj,jk) * e3t_n(ji,jj,jk) ! production
191                  zdepmoy(ji,jj) = zdepmoy(ji,jj) +                       e3t_n(ji,jj,jk)
192               ENDIF
193            END DO
194         END DO
195      END DO
196      !
197      emoy(:,:,:) = etot(:,:,:)       ! remineralisation
198      zpar(:,:,:) = etot_ndcy(:,:,:)  ! diagnostic : PAR with no diurnal cycle
199      !
200      DO jk = 1, nksrp
201         DO jj = 1, jpj
202            DO ji = 1, jpi
203               IF( gdepw_n(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               ENDIF
208            END DO
209         END DO
210      END DO
211      !
212      zdepmoy(:,:)   = 0.e0
213      zetmp3 (:,:)   = 0.e0
214      zetmp4 (:,:)   = 0.e0
215      !
216      DO jk = 1, nksrp
217         DO jj = 1, jpj
218            DO ji = 1, jpi
219               IF( gdepw_n(ji,jj,jk+1) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN
220                  zetmp3 (ji,jj) = zetmp3 (ji,jj) + enano    (ji,jj,jk) * e3t_n(ji,jj,jk) ! production
221                  zetmp4 (ji,jj) = zetmp4 (ji,jj) + ediat    (ji,jj,jk) * e3t_n(ji,jj,jk) ! production
222                  zdepmoy(ji,jj) = zdepmoy(ji,jj) +                       e3t_n(ji,jj,jk)
223               ENDIF
224            END DO
225         END DO
226      END DO
227      enanom(:,:,:) = enano(:,:,:)
228      ediatm(:,:,:) = ediat(:,:,:)
229      !
230      DO jk = 1, nksrp
231         DO jj = 1, jpj
232            DO ji = 1, jpi
233               IF( gdepw_n(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
234                  z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn )
235                  enanom(ji,jj,jk) = zetmp3(ji,jj) * z1_dep
236                  ediatm(ji,jj,jk) = zetmp4(ji,jj) * z1_dep
237               ENDIF
238            END DO
239         END DO
240      END DO
241      !
242      IF( ln_p5z ) THEN
243         zetmp5 (:,:) = 0.e0
244         DO jk = 1, nksrp
245            DO jj = 1, jpj
246               DO ji = 1, jpi
247                  IF( gdepw_n(ji,jj,jk+1) <= MIN(hmld(ji,jj), heup_01(ji,jj)) ) THEN
248                     zetmp5(ji,jj)  = zetmp5 (ji,jj) + epico(ji,jj,jk) * e3t_n(ji,jj,jk) ! production
249                  ENDIF
250               END DO
251            END DO
252         END DO
253         !
254         epicom(:,:,:) = epico(:,:,:)
255         !
256         DO jk = 1, nksrp
257            DO jj = 1, jpj
258               DO ji = 1, jpi
259                  IF( gdepw_n(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
260                     z1_dep = 1. / ( zdepmoy(ji,jj) + rtrn )
261                     epicom(ji,jj,jk) = zetmp5(ji,jj) * z1_dep
262                  ENDIF
263               END DO
264            END DO
265         END DO
266      ENDIF
267      IF( lk_iomput ) THEN
268        IF( knt == nrdttrc ) THEN
269           IF( iom_use( "Heup"  ) ) CALL iom_put( "Heup" , heup(:,:  ) * tmask(:,:,1) )  ! euphotic layer deptht
270           IF( iom_use( "PARDM" ) ) CALL iom_put( "PARDM", zpar(:,:,:) * tmask(:,:,:) )  ! Photosynthetically Available Radiation
271           IF( iom_use( "PAR"   ) ) CALL iom_put( "PAR"  , emoy(:,:,:) * tmask(:,:,:) )  ! Photosynthetically Available Radiation
272        ENDIF
273      ENDIF
274      !
275      IF( ln_p5z    )   DEALLOCATE( zetmp5 )
276      IF( ln_timing )   CALL timing_stop('p4z_opt')
277      !
278   END SUBROUTINE p4z_opt
279
280
281   SUBROUTINE p4z_opt_par( kt, pqsr, pe1, pe2, pe3, pe0, pqsr100 ) 
282      !!----------------------------------------------------------------------
283      !!                  ***  routine p4z_opt_par  ***
284      !!
285      !! ** purpose :   compute PAR of each wavelength (Red-Green-Blue)
286      !!                for a given shortwave radiation
287      !!
288      !!----------------------------------------------------------------------
289      INTEGER                         , INTENT(in)              ::   kt                ! ocean time-step
290      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   )           ::   pqsr              ! shortwave
291      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)           ::   pe1 , pe2 , pe3   ! PAR ( R-G-B)
292      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout), OPTIONAL ::   pe0               !
293      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(  out), OPTIONAL ::   pqsr100           !
294      !
295      INTEGER    ::   ji, jj, jk     ! dummy loop indices
296      REAL(wp), DIMENSION(jpi,jpj) ::  zqsr   ! shortwave
297      !!----------------------------------------------------------------------
298
299      !  Real shortwave
300      IF( ln_varpar ) THEN  ;  zqsr(:,:) = par_varsw(:,:) * pqsr(:,:)
301      ELSE                  ;  zqsr(:,:) = xparsw         * pqsr(:,:)
302      ENDIF
303     
304      !  Light at the euphotic depth
305      IF( PRESENT( pqsr100 ) )   pqsr100(:,:) = 0.01 * 3. * zqsr(:,:)
306
307      IF( PRESENT( pe0 ) ) THEN     !  W-level
308         !
309         pe0(:,:,1) = pqsr(:,:) - 3. * zqsr(:,:)    !   ( 1 - 3 * alpha ) * q
310         pe1(:,:,1) = zqsr(:,:)         
311         pe2(:,:,1) = zqsr(:,:)
312         pe3(:,:,1) = zqsr(:,:)
313         !
314         DO jk = 2, nksrp + 1
315            DO jj = 1, jpj
316               DO ji = 1, jpi
317                  pe0(ji,jj,jk) = pe0(ji,jj,jk-1) * EXP( -e3t_n(ji,jj,jk-1) * xsi0r )
318                  pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -ekb  (ji,jj,jk-1 )        )
319                  pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -ekg  (ji,jj,jk-1 )        )
320                  pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -ekr  (ji,jj,jk-1 )        )
321               END DO
322              !
323            END DO
324            !
325         END DO
326        !
327      ELSE   ! T- level
328        !
329        pe1(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekb(:,:,1) )
330        pe2(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekg(:,:,1) )
331        pe3(:,:,1) = zqsr(:,:) * EXP( -0.5 * ekr(:,:,1) )
332        !
333        DO jk = 2, nksrp     
334           DO jj = 1, jpj
335              DO ji = 1, jpi
336                 pe1(ji,jj,jk) = pe1(ji,jj,jk-1) * EXP( -0.5 * ( ekb(ji,jj,jk-1) + ekb(ji,jj,jk) ) )
337                 pe2(ji,jj,jk) = pe2(ji,jj,jk-1) * EXP( -0.5 * ( ekg(ji,jj,jk-1) + ekg(ji,jj,jk) ) )
338                 pe3(ji,jj,jk) = pe3(ji,jj,jk-1) * EXP( -0.5 * ( ekr(ji,jj,jk-1) + ekr(ji,jj,jk) ) )
339              END DO
340           END DO
341        END DO   
342        !
343      ENDIF
344      !
345   END SUBROUTINE p4z_opt_par
346
347
348   SUBROUTINE p4z_opt_sbc( kt )
349      !!----------------------------------------------------------------------
350      !!                  ***  routine p4z_opt_sbc  ***
351      !!
352      !! ** purpose :   read and interpolate the variable PAR fraction
353      !!                of shortwave radiation
354      !!
355      !! ** method  :   read the files and interpolate the appropriate variables
356      !!
357      !! ** input   :   external netcdf files
358      !!
359      !!----------------------------------------------------------------------
360      INTEGER, INTENT(in) ::   kt   ! ocean time step
361      !
362      INTEGER  :: ji,jj
363      REAL(wp) :: zcoef
364      !!---------------------------------------------------------------------
365      !
366      IF( ln_timing )  CALL timing_start('p4z_optsbc')
367      !
368      ! Compute par_varsw at nit000 or only if there is more than 1 time record in par coefficient file
369      IF( ln_varpar ) THEN
370         IF( kt == nit000 .OR. ( kt /= nit000 .AND. ntimes_par > 1 ) ) THEN
371            CALL fld_read( kt, 1, sf_par )
372            par_varsw(:,:) = ( sf_par(1)%fnow(:,:,1) ) / 3.0
373         ENDIF
374      ENDIF
375      !
376      IF( ln_timing )  CALL timing_stop('p4z_optsbc')
377      !
378   END SUBROUTINE p4z_opt_sbc
379
380
381   SUBROUTINE p4z_opt_init
382      !!----------------------------------------------------------------------
383      !!                  ***  ROUTINE p4z_opt_init  ***
384      !!
385      !! ** Purpose :   Initialization of tabulated attenuation coef
386      !!                and of the percentage of PAR in Shortwave
387      !!
388      !! ** Input   :   external ascii and netcdf files
389      !!----------------------------------------------------------------------
390      INTEGER :: numpar, ierr, ios   ! Local integer
391      !
392      CHARACTER(len=100) ::  cn_dir          ! Root directory for location of ssr files
393      TYPE(FLD_N) ::   sn_par                ! informations about the fields to be read
394      !
395      NAMELIST/nampisopt/cn_dir, sn_par, ln_varpar, parlux
396      !!----------------------------------------------------------------------
397      IF(lwp) THEN
398         WRITE(numout,*)
399         WRITE(numout,*) 'p4z_opt_init : '
400         WRITE(numout,*) '~~~~~~~~~~~~ '
401      ENDIF
402      READ  ( numnatp_ref, nampisopt, IOSTAT = ios, ERR = 901)
403901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisopt in reference namelist' )
404      READ  ( numnatp_cfg, nampisopt, IOSTAT = ios, ERR = 902 )
405902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisopt in configuration namelist' )
406      IF(lwm) WRITE ( numonp, nampisopt )
407
408      IF(lwp) THEN
409         WRITE(numout,*) '   Namelist : nampisopt '
410         WRITE(numout,*) '      PAR as a variable fraction of SW     ln_varpar      = ', ln_varpar
411         WRITE(numout,*) '      Default value for the PAR fraction   parlux         = ', parlux
412      ENDIF
413      !
414      xparsw = parlux / 3.0
415      xsi0r  = 1.e0 / rn_si0
416      !
417      ! Variable PAR at the surface of the ocean
418      ! ----------------------------------------
419      IF( ln_varpar ) THEN
420         IF(lwp) WRITE(numout,*)
421         IF(lwp) WRITE(numout,*) '   ==>>>   initialize variable par fraction (ln_varpar=T)'
422         !
423         ALLOCATE( par_varsw(jpi,jpj) )
424         !
425         ALLOCATE( sf_par(1), STAT=ierr )           !* allocate and fill sf_sst (forcing structure) with sn_sst
426         IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_opt_init: unable to allocate sf_par structure' )
427         !
428         CALL fld_fill( sf_par, (/ sn_par /), cn_dir, 'p4z_opt_init', 'Variable PAR fraction ', 'nampisopt' )
429                                   ALLOCATE( sf_par(1)%fnow(jpi,jpj,1)   )
430         IF( sn_par%ln_tint )      ALLOCATE( sf_par(1)%fdta(jpi,jpj,1,2) )
431
432         CALL iom_open (  TRIM( sn_par%clname ) , numpar )
433         ntimes_par = iom_getszuld( numpar )   ! get number of record in file
434      ENDIF
435      !
436      CALL trc_oce_rgb( xkrgb )                  ! tabulated attenuation coefficients
437      nksrp = trc_oce_ext_lev( r_si2, 0.33e2 )     ! max level of light extinction (Blue Chl=0.01)
438      !
439      IF(lwp) WRITE(numout,*) '        level of light extinction = ', nksrp, ' ref depth = ', gdepw_1d(nksrp+1), ' m'
440      !
441                         ekr      (:,:,:) = 0._wp
442                         ekb      (:,:,:) = 0._wp
443                         ekg      (:,:,:) = 0._wp
444                         etot     (:,:,:) = 0._wp
445                         etot_ndcy(:,:,:) = 0._wp
446                         enano    (:,:,:) = 0._wp
447                         ediat    (:,:,:) = 0._wp
448      IF( ln_p5z     )   epico    (:,:,:) = 0._wp
449      IF( ln_qsr_bio )   etot3    (:,:,:) = 0._wp
450      !
451   END SUBROUTINE p4z_opt_init
452
453
454   INTEGER FUNCTION p4z_opt_alloc()
455      !!----------------------------------------------------------------------
456      !!                     ***  ROUTINE p4z_opt_alloc  ***
457      !!----------------------------------------------------------------------
458      !
459      ALLOCATE( ekb(jpi,jpj,jpk), ekr(jpi,jpj,jpk),  &
460                ekg(jpi,jpj,jpk), STAT= p4z_opt_alloc  ) 
461      !
462      IF( p4z_opt_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_opt_alloc : failed to allocate arrays.' )
463      !
464   END FUNCTION p4z_opt_alloc
465
466   !!======================================================================
467END MODULE p4zopt
Note: See TracBrowser for help on using the repository browser.