source: NEMO/releases/r4.0/r4.0-HEAD/src/TOP/PISCES/P4Z/p4zopt.F90 @ 13331

Last change on this file since 13331 was 13331, checked in by cetlod, 15 months ago

r4.0-HEAD : bugfix in the heat content trend when activating bio-model light penetration, see ticket #2499

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