source: trunk/LMDZ.COMMON/libf/dyn3dpar/gcm.F @ 1443

Last change on this file since 1443 was 1422, checked in by milmd, 10 years ago

In GENERIC, MARS and COMMON models replace some include files by modules (usefull for decoupling physics with dynamics).

File size: 19.6 KB
Line 
1!
2! $Id: gcm.F 1446 2010-10-22 09:27:25Z emillour $
3!
4c
5c
6      PROGRAM gcm
7
8#ifdef CPP_IOIPSL
9      USE IOIPSL
10#endif
11
12
13      USE mod_const_mpi, ONLY: init_const_mpi
14      USE parallel_lmdz
15      USE infotrac
16      USE mod_interface_dyn_phys
17      USE mod_hallo
18      USE Bands
19      USE getparam
20      USE filtreg_mod
21      USE control_mod, only: planet_type,nday,day_step,iperiod,iphysiq,
22     &                       raz_date,anneeref,starttime,dayref,
23     &                       ok_dyn_ins,ok_dyn_ave,iecri,periodav,
24     &                       less1day,fractday,ndynstep,nsplit_phys
25      use cpdet_mod, only: ini_cpdet
26
27
28#ifdef INCA
29! Only INCA needs these informations (from the Earth's physics)
30      USE indice_sol_mod
31#endif
32
33! Ehouarn: the following are needed with (parallel) physics:
34#ifdef CPP_PHYS
35      USE mod_grid_phy_lmdz
36!      USE mod_phys_lmdz_para, ONLY : klon_mpi_para_nb
37      USE mod_phys_lmdz_omp_data, ONLY: klon_omp
38      USE dimphy
39      USE comgeomphy
40#endif
41      USE comconst_mod, ONLY: daysec,dtvr,dtphys,rad,g,r,cpp
42      USE logic_mod
43      USE temps_mod, ONLY: calend,start_time,annee_ref,day_ref,
44     .          itau_dyn,itau_phy,day_ini,jD_ref,jH_ref,day_end,
45     .          dt,hour_ini,itaufin
46      IMPLICIT NONE
47
48c      ......   Version  du 10/01/98    ..........
49
50c             avec  coordonnees  verticales hybrides
51c   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
52
53c=======================================================================
54c
55c   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
56c   -------
57c
58c   Objet:
59c   ------
60c
61c   GCM LMD nouvelle grille
62c
63c=======================================================================
64c
65c  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
66c      et possibilite d'appeler une fonction f(y)  a derivee tangente
67c      hyperbolique a la  place de la fonction a derivee sinusoidale.
68c  ... Possibilite de choisir le schema pour l'advection de
69c        q  , en modifiant iadv dans traceur.def  (MAF,10/02) .
70c
71c      Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
72c      Pour Van-Leer iadv=10
73c
74c-----------------------------------------------------------------------
75c   Declarations:
76c   -------------
77
78#include "dimensions.h"
79#include "paramet.h"
80#include "comdissnew.h"
81#include "comgeom.h"
82!!!!!!!!!!!#include "control.h"
83!#include "com_io_dyn.h"
84#include "iniprint.h"
85#include "tracstoke.h"
86#ifdef INCA
87! Only INCA needs these informations (from the Earth's physics)
88#include "indicesol.h"
89#endif
90
91
92      REAL zdtvr
93
94c   variables dynamiques
95      REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm) ! vents covariants
96      REAL teta(ip1jmp1,llm)                 ! temperature potentielle
97      REAL, ALLOCATABLE, DIMENSION(:,:,:):: q! champs advectes
98      REAL ps(ip1jmp1)                       ! pression  au sol
99c      REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
100c      REAL pks(ip1jmp1)                      ! exner au  sol
101c      REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
102c      REAL pkf(ip1jmp1,llm)                  ! exner filt.au milieu des couches
103      REAL masse(ip1jmp1,llm)                ! masse d'air
104      REAL phis(ip1jmp1)                     ! geopotentiel au sol
105c      REAL phi(ip1jmp1,llm)                  ! geopotentiel
106c      REAL w(ip1jmp1,llm)                    ! vitesse verticale
107
108c variables dynamiques intermediaire pour le transport
109
110c   variables pour le fichier histoire
111      REAL dtav      ! intervalle de temps elementaire
112
113      REAL time_0
114
115      LOGICAL lafin
116c      INTEGER ij,iq,l,i,j
117      INTEGER i,j
118
119
120      real time_step, t_wrt, t_ops
121
122
123!      LOGICAL call_iniphys
124!      data call_iniphys/.true./
125
126c      REAL alpha(ip1jmp1,llm),beta(ip1jmp1,llm)
127c+jld variables test conservation energie
128c      REAL ecin(ip1jmp1,llm),ecin0(ip1jmp1,llm)
129C     Tendance de la temp. potentiel d (theta)/ d t due a la
130C     tansformation d'energie cinetique en energie thermique
131C     cree par la dissipation
132c      REAL dhecdt(ip1jmp1,llm)
133c      REAL vcont(ip1jm,llm),ucont(ip1jmp1,llm)
134c      REAL      d_h_vcol, d_qt, d_qw, d_ql, d_ec
135c      CHARACTER (len=15) :: ztit
136c-jld
137
138
139      character (len=80) :: dynhist_file, dynhistave_file
140      character (len=20) :: modname
141      character (len=80) :: abort_message
142! locales pour gestion du temps
143      INTEGER :: an, mois, jour
144      REAL :: heure
145
146
147c-----------------------------------------------------------------------
148c    variables pour l'initialisation de la physique :
149c    ------------------------------------------------
150!      INTEGER ngridmx
151!      PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm   )
152!      REAL zcufi(ngridmx),zcvfi(ngridmx)
153!      REAL latfi(ngridmx),lonfi(ngridmx)
154!      REAL airefi(ngridmx)
155!      SAVE latfi, lonfi, airefi
156     
157      INTEGER :: ierr
158
159
160c-----------------------------------------------------------------------
161c   Initialisations:
162c   ----------------
163
164      abort_message = 'last timestep reached'
165      modname = 'gcm'
166      lafin    = .FALSE.
167      dynhist_file = 'dyn_hist'
168      dynhistave_file = 'dyn_hist_ave'
169
170
171
172c----------------------------------------------------------------------
173c  lecture des fichiers gcm.def ou run.def
174c  ---------------------------------------
175c
176! Ehouarn: dump possibility of using defrun
177!#ifdef CPP_IOIPSL
178      CALL conf_gcm( 99, .TRUE. )
179      if (mod(iphysiq, iperiod) /= 0) call abort_gcm("conf_gcm",
180     s "iphysiq must be a multiple of iperiod", 1)
181!#else
182!      CALL defrun( 99, .TRUE. , clesphy0 )
183!#endif
184c
185c
186c------------------------------------
187c   Initialisation partie parallele
188c------------------------------------
189
190      CALL init_const_mpi
191      call init_parallel
192      call ini_getparam("out.def")
193      call Read_Distrib
194
195#ifdef CPP_PHYS
196        CALL init_phys_lmdz(iim,jjp1,llm,mpi_size,distrib_phys)
197!#endif
198!      CALL set_bands
199!#ifdef CPP_PHYS
200      CALL Init_interface_dyn_phys
201#endif
202      CALL barrier
203
204      CALL set_bands
205      if (mpi_rank==0) call WriteBands
206      call SetDistrib(jj_Nb_Caldyn)
207
208c$OMP PARALLEL
209      call Init_Mod_hallo
210c$OMP END PARALLEL
211
212#ifdef CPP_PHYS
213!c$OMP PARALLEL
214!      call initcomgeomphy
215!c$OMP END PARALLEL
216#endif
217
218!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
219! Initialisation de XIOS
220!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
221
222
223c
224c Initialisations pour Cp(T) Venus
225      call ini_cpdet
226c
227c-----------------------------------------------------------------------
228c   Choix du calendrier
229c   -------------------
230
231c      calend = 'earth_365d'
232
233#ifdef CPP_IOIPSL
234      if (calend == 'earth_360d') then
235        call ioconf_calendar('360d')
236        write(lunout,*)'CALENDRIER CHOISI: Terrestre a 360 jours/an'
237      else if (calend == 'earth_365d') then
238        call ioconf_calendar('noleap')
239        write(lunout,*)'CALENDRIER CHOISI: Terrestre a 365 jours/an'
240      else if (calend == 'earth_366d') then
241        call ioconf_calendar('gregorian')
242        write(lunout,*)'CALENDRIER CHOISI: Terrestre bissextile'
243      else if (calend == 'titan') then
244!        call ioconf_calendar('titan')
245        write(lunout,*)'CALENDRIER CHOISI: Titan'
246        abort_message = 'A FAIRE...'
247        call abort_gcm(modname,abort_message,1)
248      else if (calend == 'venus') then
249!        call ioconf_calendar('venus')
250        write(lunout,*)'CALENDRIER CHOISI: Venus'
251        abort_message = 'A FAIRE...'
252        call abort_gcm(modname,abort_message,1)
253      else
254        abort_message = 'Mauvais choix de calendrier'
255        call abort_gcm(modname,abort_message,1)
256      endif
257#endif
258c-----------------------------------------------------------------------
259
260      IF (type_trac == 'inca') THEN
261#ifdef INCA
262         call init_const_lmdz(
263     $        nbtr,anneeref,dayref,
264     $        iphysiq,day_step,nday,
265     $        nbsrf, is_oce,is_sic,
266     $        is_ter,is_lic, calend)
267
268         call init_inca_para(
269     $        iim,jjm+1,llm,klon_glo,mpi_size,
270     $        distrib_phys,COMM_LMDZ)
271#endif
272      END IF
273
274c-----------------------------------------------------------------------
275c   Initialisation des traceurs
276c   ---------------------------
277c  Choix du nombre de traceurs et du schema pour l'advection
278c  dans fichier traceur.def, par default ou via INCA
279      call infotrac_init
280
281c Allocation de la tableau q : champs advectes   
282      ALLOCATE(q(ip1jmp1,llm,nqtot))
283
284c-----------------------------------------------------------------------
285c   Lecture de l'etat initial :
286c   ---------------------------
287
288c  lecture du fichier start.nc
289      if (read_start) then
290      ! we still need to run iniacademic to initialize some
291      ! constants & fields, if we run the 'newtonian' or 'SW' cases:
292        if (iflag_phys.ne.1) then
293          CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
294        endif
295
296        CALL dynetat0("start.nc",vcov,ucov,
297     &              teta,q,masse,ps,phis, time_0)
298       
299        ! Load relaxation fields (simple nudging). AS 09/2013
300        ! ---------------------------------------------------
301        if (planet_type.eq."generic") then
302         if (ok_guide) then
303           CALL relaxetat0("relax.nc")
304         endif
305        endif
306 
307c       write(73,*) 'ucov',ucov
308c       write(74,*) 'vcov',vcov
309c       write(75,*) 'teta',teta
310c       write(76,*) 'ps',ps
311c       write(77,*) 'q',q
312
313      endif ! of if (read_start)
314
315c le cas echeant, creation d un etat initial
316      IF (prt_level > 9) WRITE(lunout,*)
317     .              'GCM: AVANT iniacademic AVANT AVANT AVANT AVANT'
318      if (.not.read_start) then
319         CALL iniacademic(vcov,ucov,teta,q,masse,ps,phis,time_0)
320      endif
321
322
323c-----------------------------------------------------------------------
324c   Lecture des parametres de controle pour la simulation :
325c   -------------------------------------------------------
326c  on recalcule eventuellement le pas de temps
327
328      IF(MOD(day_step,iperiod).NE.0) THEN
329        abort_message =
330     .  'Il faut choisir un nb de pas par jour multiple de iperiod'
331        call abort_gcm(modname,abort_message,1)
332      ENDIF
333
334      IF(MOD(day_step,iphysiq).NE.0) THEN
335        abort_message =
336     * 'Il faut choisir un nb de pas par jour multiple de iphysiq'
337        call abort_gcm(modname,abort_message,1)
338      ENDIF
339
340      zdtvr    = daysec/REAL(day_step)
341        IF(dtvr.NE.zdtvr) THEN
342         WRITE(lunout,*)
343     .    'WARNING!!! changement de pas de temps',dtvr,'>',zdtvr
344        ENDIF
345
346C
347C on remet le calendrier à zero si demande
348c
349      IF (start_time /= starttime) then
350        WRITE(lunout,*)' GCM: Attention l''heure de depart lue dans le'
351     &,' fichier restart ne correspond pas à celle lue dans le run.def'
352        IF (raz_date == 1) then
353          WRITE(lunout,*)'Je prends l''heure lue dans run.def'
354          start_time = starttime
355        ELSE
356          call abort_gcm("gcm", "'Je m''arrete'", 1)
357        ENDIF
358      ENDIF
359      IF (raz_date == 1) THEN
360        annee_ref = anneeref
361        day_ref = dayref
362        day_ini = dayref
363        itau_dyn = 0
364        itau_phy = 0
365        time_0 = 0.
366        write(lunout,*)
367     .   'GCM: On reinitialise a la date lue dans gcm.def'
368      ELSE IF (annee_ref .ne. anneeref .or. day_ref .ne. dayref) THEN
369        write(lunout,*)
370     .  'GCM: Attention les dates initiales lues dans le fichier'
371        write(lunout,*)
372     .  ' restart ne correspondent pas a celles lues dans '
373        write(lunout,*)' gcm.def'
374        write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref
375        write(lunout,*)' day_ref=',day_ref," dayref=",dayref
376        write(lunout,*)' Pas de remise a zero'
377      ENDIF
378
379c      if (annee_ref .ne. anneeref .or. day_ref .ne. dayref) then
380c        write(lunout,*)
381c     .  'GCM: Attention les dates initiales lues dans le fichier'
382c        write(lunout,*)
383c     .  ' restart ne correspondent pas a celles lues dans '
384c        write(lunout,*)' gcm.def'
385c        write(lunout,*)' annee_ref=',annee_ref," anneeref=",anneeref
386c        write(lunout,*)' day_ref=',day_ref," dayref=",dayref
387c        if (raz_date .ne. 1) then
388c          write(lunout,*)
389c     .    'GCM: On garde les dates du fichier restart'
390c        else
391c          annee_ref = anneeref
392c          day_ref = dayref
393c          day_ini = dayref
394c          itau_dyn = 0
395c          itau_phy = 0
396c          time_0 = 0.
397c          write(lunout,*)
398c     .   'GCM: On reinitialise a la date lue dans gcm.def'
399c        endif
400c      ELSE
401c        raz_date = 0
402c      endif
403
404#ifdef CPP_IOIPSL
405      mois = 1
406      heure = 0.
407! Ce n'est defini pour l'instant que pour la Terre...
408      if (planet_type.eq.'earth') then
409      call ymds2ju(annee_ref, mois, day_ref, heure, jD_ref)
410      jH_ref = jD_ref - int(jD_ref)
411      jD_ref = int(jD_ref)
412
413      call ioconf_startdate(INT(jD_ref), jH_ref)
414
415      write(lunout,*)'DEBUG'
416      write(lunout,*)'annee_ref, mois, day_ref, heure, jD_ref'
417      write(lunout,*)annee_ref, mois, day_ref, heure, jD_ref
418      call ju2ymds(jD_ref+jH_ref,an, mois, jour, heure)
419      write(lunout,*)'jD_ref+jH_ref,an, mois, jour, heure'
420      write(lunout,*)jD_ref+jH_ref,an, mois, jour, heure
421      else
422! A voir pour Titan et Venus
423        jD_ref=0
424        jH_ref=0
425      write(lunout,*)'A VOIR POUR VENUS ET TITAN: jD_ref, jH_ref'
426      write(lunout,*)jD_ref,jH_ref
427      endif ! planet_type
428#else
429! Ehouarn: we still need to define JD_ref and JH_ref
430! and since we don't know how many days there are in a year
431! we set JD_ref to 0 (this should be improved ...)
432      jD_ref=0
433      jH_ref=0
434#endif
435
436      if (iflag_phys.eq.1) then
437      ! these initialisations have already been done (via iniacademic)
438      ! if running in SW or Newtonian mode
439c-----------------------------------------------------------------------
440c   Initialisation des constantes dynamiques :
441c   ------------------------------------------
442        dtvr = zdtvr
443        CALL iniconst
444
445c-----------------------------------------------------------------------
446c   Initialisation de la geometrie :
447c   --------------------------------
448        CALL inigeom
449
450c-----------------------------------------------------------------------
451c   Initialisation du filtre :
452c   --------------------------
453        CALL inifilr
454      endif ! of if (iflag_phys.eq.1)
455c
456c-----------------------------------------------------------------------
457c   Initialisation de la dissipation :
458c   ----------------------------------
459
460      CALL inidissip( lstardis, nitergdiv, nitergrot, niterh   ,
461     *                tetagdiv, tetagrot , tetatemp, vert_prof_dissip)
462
463c-----------------------------------------------------------------------
464c   Initialisation de la physique :
465c   -------------------------------
466
467      IF ((iflag_phys==1).or.(iflag_phys>=100)) THEN
468!         latfi(1)=rlatu(1)
469!         lonfi(1)=0.
470!         zcufi(1) = cu(1)
471!         zcvfi(1) = cv(1)
472!         DO j=2,jjm
473!            DO i=1,iim
474!               latfi((j-2)*iim+1+i)= rlatu(j)
475!               lonfi((j-2)*iim+1+i)= rlonv(i)
476!               zcufi((j-2)*iim+1+i) = cu((j-1)*iip1+i)
477!               zcvfi((j-2)*iim+1+i) = cv((j-1)*iip1+i)
478!            ENDDO
479!         ENDDO
480!         latfi(ngridmx)= rlatu(jjp1)
481!         lonfi(ngridmx)= 0.
482!         zcufi(ngridmx) = cu(ip1jm+1)
483!         zcvfi(ngridmx) = cv(ip1jm-iim)
484
485         ! build airefi(), mesh area on physics grid
486!         CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,aire,airefi)
487         ! Poles are single points on physics grid
488!         airefi(1)=airefi(1)*iim
489!         airefi(ngridmx)=airefi(ngridmx)*iim
490
491! Physics
492#ifdef CPP_PHYS
493!         CALL iniphysiq(ngridmx,llm,daysec,day_ini,dtphys/nsplit_phys,
494!     &                latfi,lonfi,airefi,zcufi,zcvfi,rad,g,r,cpp,
495!     &                iflag_phys)
496         CALL iniphysiq(iim,jjm,llm,daysec,day_ini,dtphys/nsplit_phys,
497     &                rlatu,rlonv,aire,cu,cv,rad,g,r,cpp,
498     &                iflag_phys)
499#endif
500!         call_iniphys=.false.
501      ENDIF ! of IF (call_iniphys.and.(iflag_phys==1.or.iflag_phys>=100))
502
503
504c-----------------------------------------------------------------------
505c   Initialisation des dimensions d'INCA :
506c   --------------------------------------
507      IF (type_trac == 'inca') THEN
508#ifdef INCA
509!$OMP PARALLEL
510         CALL init_inca_dim(klon_omp,llm,iim,jjm,
511     $        rlonu,rlatu,rlonv,rlatv)
512!$OMP END PARALLEL
513#endif
514      END IF
515
516c-----------------------------------------------------------------------
517c   Initialisation des I/O :
518c   ------------------------
519
520
521      if (nday>=0) then ! standard case
522        day_end=day_ini+nday
523      else ! special case when nday <0, run -nday dynamical steps
524        day_end=day_ini-nday/day_step
525      endif
526      if (less1day) then
527        day_end=day_ini+floor(time_0+fractday)
528      endif
529      if (ndynstep.gt.0) then
530        day_end=day_ini+floor(time_0+float(ndynstep)/float(day_step))
531      endif
532     
533      WRITE(lunout,'(a,i7,a,i7)')
534     &             "run from day ",day_ini,"  to day",day_end
535
536#ifdef CPP_IOIPSL
537! Ce n'est defini pour l'instant que pour la Terre...
538      if (planet_type.eq.'earth') then
539      call ju2ymds(jD_ref + day_ini - day_ref, an, mois, jour, heure)
540      write (lunout,301)jour, mois, an
541      call ju2ymds(jD_ref + day_end - day_ref, an, mois, jour, heure)
542      write (lunout,302)jour, mois, an
543      else
544! A voir pour Titan et Venus
545      write(lunout,*)'A VOIR POUR VENUS/TITAN: separation en annees...'
546      endif ! planet_type
547
548 301  FORMAT('1'/,15x,'run du ', i2,'/',i2,'/',i4)
549 302  FORMAT('1'/,15x,'    au ', i2,'/',i2,'/',i4)
550#endif
551
552      if (planet_type=="mars") then
553         ! For Mars we transmit day_ini
554        CALL dynredem0_p("restart.nc", day_ini, phis)
555      else
556        CALL dynredem0_p("restart.nc", day_end, phis)
557      endif
558      ecripar = .TRUE.
559
560#ifdef CPP_IOIPSL
561      time_step = zdtvr
562      IF (mpi_rank==0) then
563        if (ok_dyn_ins) then
564        ! initialize output file for instantaneous outputs
565        ! t_ops = iecri * daysec ! do operations every t_ops
566        t_ops =((1.0*iecri)/day_step) * daysec 
567        t_wrt = daysec ! iecri * daysec ! write output every t_wrt
568        CALL inithist(day_ref,annee_ref,time_step,
569     &                  t_ops,t_wrt)
570        endif
571
572        IF (ok_dyn_ave) THEN
573          ! initialize output file for averaged outputs
574          t_ops = iperiod * time_step ! do operations every t_ops
575          t_wrt = periodav * daysec   ! write output every t_wrt
576          CALL initdynav(day_ref,annee_ref,time_step,
577     &                   t_ops,t_wrt)
578!         CALL initdynav_p(dynhistave_file,day_ref,annee_ref,time_step,
579!     .        t_ops, t_wrt, histaveid)
580        END IF
581      ENDIF
582      dtav = iperiod*dtvr/daysec
583#endif
584! #endif of #ifdef CPP_IOIPSL
585
586c  Choix des frequences de stokage pour le offline
587c      istdyn=day_step/4     ! stockage toutes les 6h=1jour/4
588c      istdyn=day_step/12     ! stockage toutes les 2h=1jour/12
589      istdyn=day_step/4     ! stockage toutes les 6h=1jour/12
590      istphy=istdyn/iphysiq     
591
592
593c
594c-----------------------------------------------------------------------
595c   Integration temporelle du modele :
596c   ----------------------------------
597
598c       write(78,*) 'ucov',ucov
599c       write(78,*) 'vcov',vcov
600c       write(78,*) 'teta',teta
601c       write(78,*) 'ps',ps
602c       write(78,*) 'q',q
603
604!c$OMP PARALLEL DEFAULT(SHARED) COPYIN(/temps/,/logici/,/logicl/)
605!variable temps no longer exists
606c$OMP PARALLEL DEFAULT(SHARED)
607c       Copy all threadprivate variables from temps_mod
608c$OMP1 COPYIN(dt,jD_ref,jH_ref,start_time,hour_ini,day_ini,day_end)
609c$OMP1 COPYIN(annee_ref,day_ref,itau_dyn,itau_phy,itaufin,calend)
610c       Copy all threadprivate variables from logic_mod
611c$OMP1 COPYIN(purmats,forward,leapf,apphys,statcl,conser,apdiss,apdelq)
612c$OMP1 COPYIN(saison,ecripar,fxyhypb,ysinus,read_start,ok_guide)
613c$OMP1 COPYIN(ok_strato,tidal,ok_gradsfile,ok_limit,ok_etat0,physic)
614c$OMP1 COPYIN(grireg,iflag_phys,iflag_trac)
615
616
617      CALL leapfrog_p(ucov,vcov,teta,ps,masse,phis,q,
618     .              time_0)
619c$OMP END PARALLEL
620
621
622      END
623
Note: See TracBrowser for help on using the repository browser.