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

source: branches/2016/dev_r7012_ROBUST5_CNRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zopt.F90 @ 7068

Last change on this file since 7068 was 7068, checked in by cetlod, 6 years ago

ROBUST5_CNRS : implementation of part I of new TOP interface - 1st step -, see ticket #1782

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