source: branches/UKMO/dev_r5518_GO6_package_OMP/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90 @ 9616

Last change on this file since 9616 was 9616, checked in by andmirek, 2 years ago

#2001 few additionale changes

File size: 18.4 KB
Line 
1MODULE dynzdf_imp
2   !!======================================================================
3   !!                    ***  MODULE  dynzdf_imp  ***
4   !! Ocean dynamics:  vertical component(s) of the momentum mixing trend
5   !!======================================================================
6   !! History :  OPA  !  1990-10  (B. Blanke)  Original code
7   !!            8.0  !  1997-05  (G. Madec)  vertical component of isopycnal
8   !!   NEMO     0.5  !  2002-08  (G. Madec)  F90: Free form and module
9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps
10   !!            3.4  !  2012-01  (H. Liu) Semi-implicit bottom friction
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   dyn_zdf_imp  : update the momentum trend with the vertical diffusion using a implicit time-stepping
15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers
17   USE dom_oce         ! ocean space and time domain
18   USE domvvl          ! variable volume
19   USE sbc_oce         ! surface boundary condition: ocean
20   USE zdf_oce         ! ocean vertical physics
21   USE phycst          ! physical constants
22   USE in_out_manager  ! I/O manager
23   USE lib_mpp         ! MPP library
24   USE zdfbfr          ! Bottom friction setup
25   USE wrk_nemo        ! Memory Allocation
26   USE timing          ! Timing
27   USE dynadv          ! dynamics: vector invariant versus flux form
28   USE dynspg_oce, ONLY: lk_dynspg_ts
29
30   IMPLICIT NONE
31   PRIVATE
32
33   PUBLIC   dyn_zdf_imp   ! called by step.F90
34
35   REAL(wp) ::  r_vvl     ! variable volume indicator, =1 if lk_vvl=T, =0 otherwise
36
37   !! * Substitutions
38#  include "domzgr_substitute.h90"
39#  include "vectopt_loop_substitute.h90"
40   !!----------------------------------------------------------------------
41   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
42   !! $Id$
43   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
44   !!----------------------------------------------------------------------
45CONTAINS
46
47   SUBROUTINE dyn_zdf_imp( kt, p2dt )
48      !!----------------------------------------------------------------------
49      !!                  ***  ROUTINE dyn_zdf_imp  ***
50      !!                   
51      !! ** Purpose :   Compute the trend due to the vert. momentum diffusion
52      !!      and the surface forcing, and add it to the general trend of
53      !!      the momentum equations.
54      !!
55      !! ** Method  :   The vertical momentum mixing trend is given by :
56      !!             dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) )
57      !!      backward time stepping
58      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2)
59      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F)
60      !!      Add this trend to the general trend ua :
61      !!         ua = ua + dz( avmu dz(u) )
62      !!
63      !! ** Action : - Update (ua,va) arrays with the after vertical diffusive mixing trend.
64      !!---------------------------------------------------------------------
65      INTEGER , INTENT(in) ::  kt     ! ocean time-step index
66      REAL(wp), INTENT(in) ::  p2dt   ! vertical profile of tracer time-step
67      !!
68      INTEGER  ::   ji, jj, jk   ! dummy loop indices
69      INTEGER  ::   ikbu, ikbv   ! local integers
70      REAL(wp) ::   z1_p2dt, zcoef, zzwi, zzws, zrhs   ! local scalars
71      REAL(wp) ::   ze3ua, ze3va
72      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwi, zwd, zws
73      !!----------------------------------------------------------------------
74      !
75      IF( nn_timing == 1 )  CALL timing_start('dyn_zdf_imp')
76      !
77      CALL wrk_alloc( jpi,jpj,jpk, zwi, zwd, zws ) 
78      !
79      IF( kt == nit000 ) THEN
80         IF(lwp) WRITE(numout,*)
81         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator'
82         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
83         !
84         IF( lk_vvl ) THEN   ;    r_vvl = 1._wp       ! Variable volume indicator
85         ELSE                ;    r_vvl = 0._wp       
86         ENDIF
87      ENDIF
88
89      ! 0. Local constant initialization
90      ! --------------------------------
91      z1_p2dt = 1._wp / p2dt      ! inverse of the timestep
92
93      ! 1. Apply semi-implicit bottom friction
94      ! --------------------------------------
95      ! Only needed for semi-implicit bottom friction setup. The explicit
96      ! bottom friction has been included in "u(v)a" which act as the R.H.S
97      ! column vector of the tri-diagonal matrix equation
98      !
99
100      IF( ln_bfrimp ) THEN
101!$OMP PARALLEL DO PRIVATE(ikbu, ikbv) SHARED(mbku, mbkv)
102         DO jj = 2, jpjm1
103            DO ji = 2, jpim1
104               ikbu = mbku(ji,jj)       ! ocean bottom level at u- and v-points
105               ikbv = mbkv(ji,jj)       ! (deepest ocean u- and v-points)
106               avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1)
107               avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1)
108            END DO
109         END DO
110         IF ( ln_isfcav ) THEN
111!$OMP PARALLEL DO PRIVATE(ikbu, ikbv) SHARED(miku, mikv)
112            DO jj = 2, jpjm1
113               DO ji = 2, jpim1
114                  ikbu = miku(ji,jj)       ! ocean top level at u- and v-points
115                  ikbv = mikv(ji,jj)       ! (first wet ocean u- and v-points)
116                  IF (ikbu .GE. 2) avmu(ji,jj,ikbu) = -tfrua(ji,jj) * fse3uw(ji,jj,ikbu)
117                  IF (ikbv .GE. 2) avmv(ji,jj,ikbv) = -tfrva(ji,jj) * fse3vw(ji,jj,ikbv)
118               END DO
119            END DO
120         END IF
121      ENDIF
122
123#if defined key_dynspg_ts
124      IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity
125!$OMP PARALLEL DO
126         DO jk = 1, jpkm1
127            ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk)
128            va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk)
129         END DO
130      ELSE                                            ! applied on thickness weighted velocity
131!$OMP PARALLEL DO
132         DO jk = 1, jpkm1
133            ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      &
134               &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   &
135               &                               / fse3u_a(:,:,jk) * umask(:,:,jk)
136            va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      &
137               &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   &
138               &                               / fse3v_a(:,:,jk) * vmask(:,:,jk)
139         END DO
140      ENDIF
141
142      IF ( ln_bfrimp .AND.lk_dynspg_ts ) THEN
143         ! remove barotropic velocities:
144!$OMP PARALLEL DO
145         DO jk = 1, jpkm1
146            ua(:,:,jk) = (ua(:,:,jk) - ua_b(:,:)) * umask(:,:,jk)
147            va(:,:,jk) = (va(:,:,jk) - va_b(:,:)) * vmask(:,:,jk)
148         END DO
149         ! Add bottom/top stress due to barotropic component only:
150!$OMP PARALLEL DO PRIVATE(ikbu, ikbv, ze3ua, ze3va)
151         DO jj = 2, jpjm1       
152            DO ji = fs_2, fs_jpim1   ! vector opt.
153               ikbu = mbku(ji,jj)         ! ocean bottom level at u- and v-points
154               ikbv = mbkv(ji,jj)         ! (deepest ocean u- and v-points)
155               ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,ikbu) + r_vvl   * fse3u_a(ji,jj,ikbu)
156               ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,ikbv) + r_vvl   * fse3v_a(ji,jj,ikbv)
157               ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + p2dt * bfrua(ji,jj) * ua_b(ji,jj) / ze3ua
158               va(ji,jj,ikbv) = va(ji,jj,ikbv) + p2dt * bfrva(ji,jj) * va_b(ji,jj) / ze3va
159            END DO
160         END DO
161         IF ( ln_isfcav ) THEN
162!$OMP PARALLEL DO PRIVATE(ikbu, ikbv, ze3ua, ze3va)
163            DO jj = 2, jpjm1       
164               DO ji = fs_2, fs_jpim1   ! vector opt.
165                  ikbu = miku(ji,jj)         ! top ocean level at u- and v-points
166                  ikbv = mikv(ji,jj)         ! (first wet ocean u- and v-points)
167                  ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,ikbu) + r_vvl   * fse3u_a(ji,jj,ikbu)
168                  ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,ikbv) + r_vvl   * fse3v_a(ji,jj,ikbv)
169                  ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + p2dt * tfrua(ji,jj) * ua_b(ji,jj) / ze3ua
170                  va(ji,jj,ikbv) = va(ji,jj,ikbv) + p2dt * tfrva(ji,jj) * va_b(ji,jj) / ze3va
171               END DO
172            END DO
173         END IF
174      ENDIF
175#endif
176
177      ! 2. Vertical diffusion on u
178      ! ---------------------------
179      ! Matrix and second member construction
180      ! bottom boundary condition: both zwi and zws must be masked as avmu can take
181      ! non zero value at the ocean bottom depending on the bottom friction used.
182      !
183!$OMP PARALLEL DO PRIVATE(ze3ua, zcoef, zzwi, zzws)
184      DO jk = 1, jpkm1        ! Matrix
185         DO jj = 2, jpjm1 
186            DO ji = fs_2, fs_jpim1   ! vector opt.
187               ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,jk) + r_vvl   * fse3u_a(ji,jj,jk)   ! after scale factor at T-point
188               zcoef = - p2dt / ze3ua     
189               zzwi          = zcoef * avmu  (ji,jj,jk  ) / fse3uw(ji,jj,jk  )
190               zwi(ji,jj,jk) = zzwi  * wumask(ji,jj,jk  )
191               zzws          = zcoef * avmu  (ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 
192               zws(ji,jj,jk) = zzws  * wumask(ji,jj,jk+1)
193               zwd(ji,jj,jk) = 1._wp - zzwi - zzws
194            END DO
195         END DO
196      END DO
197!$OMP PARALLEL DO
198      DO jj = 2, jpjm1        ! Surface boundary conditions
199         DO ji = fs_2, fs_jpim1   ! vector opt.
200            zwi(ji,jj,1) = 0._wp
201            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
202         END DO
203      END DO
204
205      ! Matrix inversion starting from the first level
206      !-----------------------------------------------------------------------
207      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
208      !
209      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
210      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
211      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
212      !        (        ...               )( ...  ) ( ...  )
213      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
214      !
215      !   m is decomposed in the product of an upper and a lower triangular matrix
216      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
217      !   The solution (the after velocity) is in ua
218      !-----------------------------------------------------------------------
219      !
220      !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
221!$OMP PARALLEL
222      DO jk = 2, jpkm1
223!$OMP DO
224         DO jj = 2, jpjm1   
225            DO ji = fs_2, fs_jpim1   ! vector opt.
226               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
227            END DO
228         END DO
229      END DO
230!$OMP END PARALLEL
231      !
232#if defined key_dynspg_ts
233!$OMP PARALLEL DO PRIVATE(ze3ua)
234      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==
235         DO ji = fs_2, fs_jpim1   ! vector opt.
236            ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,1) + r_vvl   * fse3u_a(ji,jj,1) 
237            ua(ji,jj,1) = ua(ji,jj,1) + p2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   &
238               &                                      / ( ze3ua * rau0 ) * umask(ji,jj,1) 
239         END DO
240      END DO
241#else
242!$OMP PARALLEL DO
243      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1 Lk-1  ==
244         DO ji = fs_2, fs_jpim1   ! vector opt.
245            ua(ji,jj,1) = ub(ji,jj,1) &
246               &                   + p2dt *(ua(ji,jj,1) +  0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   &
247               &                                      / ( fse3u(ji,jj,1) * rau0     ) * umask(ji,jj,1) ) 
248         END DO
249      END DO
250#endif
251!$OMP PARALLEL PRIVATE(zrhs)
252      DO jk = 2, jpkm1
253!$OMP DO
254         DO jj = 2, jpjm1
255            DO ji = fs_2, fs_jpim1
256#if defined key_dynspg_ts
257               zrhs = ua(ji,jj,jk)   ! zrhs=right hand side
258#else
259               zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk)
260#endif
261               ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1)
262            END DO
263         END DO
264      END DO
265!$OMP END PARALLEL
266      !
267!$OMP PARALLEL DO
268      DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  ==
269         DO ji = fs_2, fs_jpim1   ! vector opt.
270            ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
271         END DO
272      END DO
273!$OMP PARALLEL
274      DO jk = jpk-2, 1, -1
275!$OMP DO
276         DO jj = 2, jpjm1
277            DO ji = fs_2, fs_jpim1
278               ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk)
279            END DO
280         END DO
281      END DO
282!$OMP END PARALLEL
283
284#if ! defined key_dynspg_ts
285      ! Normalization to obtain the general momentum trend ua
286!$OMP PARALLEL DO
287      DO jk = 1, jpkm1
288         DO jj = 2, jpjm1   
289            DO ji = fs_2, fs_jpim1   ! vector opt.
290               ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) * z1_p2dt
291            END DO
292         END DO
293      END DO
294#endif
295
296      ! 3. Vertical diffusion on v
297      ! ---------------------------
298      ! Matrix and second member construction
299      ! bottom boundary condition: both zwi and zws must be masked as avmv can take
300      ! non zero value at the ocean bottom depending on the bottom friction used
301      !
302!$OMP PARALLEL
303!$OMP DO PRIVATE(ze3va, zcoef, zzwi, zzws)
304      DO jk = 1, jpkm1        ! Matrix
305         DO jj = 2, jpjm1   
306            DO ji = fs_2, fs_jpim1   ! vector opt.
307               ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,jk)  + r_vvl * fse3v_a(ji,jj,jk)   ! after scale factor at T-point
308               zcoef = - p2dt / ze3va
309               zzwi          = zcoef * avmv (ji,jj,jk  ) / fse3vw(ji,jj,jk  )
310               zwi(ji,jj,jk) =  zzwi * wvmask(ji,jj,jk)
311               zzws          = zcoef * avmv (ji,jj,jk+1) / fse3vw(ji,jj,jk+1)
312               zws(ji,jj,jk) =  zzws * wvmask(ji,jj,jk+1)
313               zwd(ji,jj,jk) = 1._wp - zzwi - zzws
314            END DO
315         END DO
316      END DO
317!$OMP DO
318      DO jj = 2, jpjm1        ! Surface boundary conditions
319         DO ji = fs_2, fs_jpim1   ! vector opt.
320            zwi(ji,jj,1) = 0._wp
321            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
322         END DO
323      END DO
324!$OMP END PARALLEL
325
326      ! Matrix inversion
327      !-----------------------------------------------------------------------
328      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
329      !
330      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
331      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
332      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
333      !        (        ...               )( ...  ) ( ...  )
334      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
335      !
336      !   m is decomposed in the product of an upper and lower triangular matrix
337      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
338      !   The solution (after velocity) is in 2d array va
339      !-----------------------------------------------------------------------
340      !
341      !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
342!$OMP PARALLEL
343      DO jk = 2, jpkm1       
344!$OMP DO
345         DO jj = 2, jpjm1   
346            DO ji = fs_2, fs_jpim1   ! vector opt.
347               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
348            END DO
349         END DO
350      END DO
351!$OMP END PARALLEL
352      !
353!$OMP PARALLEL DO PRIVATE(ze3va)
354      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==
355         DO ji = fs_2, fs_jpim1   ! vector opt.
356#if defined key_dynspg_ts           
357            ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,1) + r_vvl   * fse3v_a(ji,jj,1) 
358            va(ji,jj,1) = va(ji,jj,1) + p2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   &
359               &                                      / ( ze3va * rau0 ) * vmask(ji,jj,1)
360#else
361            va(ji,jj,1) = vb(ji,jj,1) &
362               &                   + p2dt *(va(ji,jj,1) +  0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   &
363               &                                      / ( fse3v(ji,jj,1) * rau0     ) * vmask(ji,jj,1) )
364#endif
365         END DO
366      END DO
367!$OMP PARALLEL
368      DO jk = 2, jpkm1
369!$OMP DO PRIVATE(zrhs)
370         DO jj = 2, jpjm1
371            DO ji = fs_2, fs_jpim1   ! vector opt.
372#if defined key_dynspg_ts
373               zrhs = va(ji,jj,jk)   ! zrhs=right hand side
374#else
375               zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk)
376#endif
377               va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1)
378            END DO
379         END DO
380      END DO
381!$OMP END PARALLEL
382      !
383!$OMP PARALLEL DO
384      DO jj = 2, jpjm1        !==  third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  ==
385         DO ji = fs_2, fs_jpim1   ! vector opt.
386            va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
387         END DO
388      END DO
389
390!$OMP PARALLEL
391      DO jk = jpk-2, 1, -1
392!$OMP DO
393         DO jj = 2, jpjm1
394            DO ji = fs_2, fs_jpim1
395               va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk)
396            END DO
397         END DO
398      END DO
399!$OMP END PARALLEL
400
401      ! Normalization to obtain the general momentum trend va
402#if ! defined key_dynspg_ts
403!$OMP PARALLEL DO
404      DO jk = 1, jpkm1
405         DO jj = 2, jpjm1   
406            DO ji = fs_2, fs_jpim1   ! vector opt.
407               va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) * z1_p2dt
408            END DO
409         END DO
410      END DO
411#endif
412
413      ! J. Chanut: Lines below are useless ?
414      !! restore bottom layer avmu(v)
415      IF( ln_bfrimp ) THEN
416!$OMP PARALLEL PRIVATE(ikbu, ikbv)
417!$OMP DO
418        DO jj = 2, jpjm1
419           DO ji = 2, jpim1
420              ikbu = mbku(ji,jj)         ! ocean bottom level at u- and v-points
421              ikbv = mbkv(ji,jj)         ! (deepest ocean u- and v-points)
422              avmu(ji,jj,ikbu+1) = 0.e0
423              avmv(ji,jj,ikbv+1) = 0.e0
424           END DO
425        END DO
426        IF (ln_isfcav) THEN
427!$OMP DO
428           DO jj = 2, jpjm1
429              DO ji = 2, jpim1
430                 ikbu = miku(ji,jj)         ! ocean top level at u- and v-points
431                 ikbv = mikv(ji,jj)         ! (first wet ocean u- and v-points)
432                 IF (ikbu > 1) avmu(ji,jj,ikbu) = 0.e0
433                 IF (ikbv > 1) avmv(ji,jj,ikbv) = 0.e0
434              END DO
435           END DO
436        END IF
437!$OMP END PARALLEL
438      ENDIF
439      !
440      CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwd, zws) 
441      !
442      IF( nn_timing == 1 )  CALL timing_stop('dyn_zdf_imp')
443      !
444   END SUBROUTINE dyn_zdf_imp
445
446   !!==============================================================================
447END MODULE dynzdf_imp
Note: See TracBrowser for help on using the repository browser.