source: CPL/oasis3/trunk/src/mod/oasis3/src/givfld.F @ 1677

Last change on this file since 1677 was 1677, checked in by aclsce, 12 years ago

Imported oasis3 (tag ipslcm5a) from cvs server to svn server (igcmg project).

File size: 24.7 KB
Line 
1      SUBROUTINE givfld (kindex, kfield, kiter)
2C****
3C               *****************************
4C               * OASIS ROUTINE  -  LEVEL 1 *
5C               * -------------     ------- *
6C               *****************************
7C
8C**** *givfld* - writing routine
9C
10C
11C     Purpose:
12C     -------
13C     Write out coupling fields for iteration kiter
14C
15C**   Interface:
16C     ---------
17C       *CALL*  *givfld (kindex, kfield, kiter)*
18C
19C     Input:
20C     -----
21C                kindex : current active fields index array
22C                kfield : current active fields total number
23C                kiter  : iteration number
24C
25C     Output:
26C     ------
27C     None
28C
29C     Workspace:
30C     ---------
31C     None
32C
33C     Externals:
34C     ---------
35C     PIPE_Send, CLIM_Export, SVIPC_write
36C
37C     Reference:
38C     ---------
39C     See OASIS manual (1995)
40C
41C     History:
42C     -------
43C       Version   Programmer     Date      Description
44C       -------   ----------     ----      ----------- 
45C       2.0       L. Terray      95/09/01  created
46C       2.1       L. Terray      96/08/07  modified: addition of cstate
47C                                          to prevent field transfer
48C       2.2       S. Valcke      97/08/22  added: introduction of SVIPC
49C       2.2       L. Terray      97/12/14  added: test on mode info +
50C                                          general cleaning
51C       2.3       S. Valcke      99/04/30  added: printing levels
52C       2.3       L. Terray      99/09/15  added: GMEM branch
53C
54C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55C
56C* -----------------Include files and USE of modules---------------------------
57C
58      USE mod_kinds_oasis
59#if defined use_comm_MPI1 || defined use_comm_MPI2 || !defined use_comm_MPI1 && !defined use_comm_MPI2 && !defined use_comm_SIPC && !defined use_comm_GMEM && !defined use_comm_PIPE && !defined use_comm_NONE
60      USE mod_clim
61#endif
62      USE mod_parameter 
63      USE mod_string
64      USE mod_analysis
65      USE mod_memory
66      USE mod_sipc
67      USE mod_unitncdf
68      USE mod_experiment
69      USE mod_timestep
70      USE mod_unit
71      USE mod_hardware
72      USE mod_label
73      USE mod_calendar
74      USE mod_printing
75      INCLUDE 'netcdf.inc'
76C
77C* ---------------------------- Argument declarations -------------------
78C
79      INTEGER (kind=ip_intwp_p) kindex(kfield)
80C
81C* ---------------------------- Local declarations ----------------------
82C
83      INTEGER (kind=ip_intwp_p), DIMENSION(:), ALLOCATABLE :: info, 
84     $    iflag
85      INTEGER (kind=ip_intwp_p), DIMENSION(:), ALLOCATABLE :: idimlon, 
86     $    idimlat, ivarid
87      INTEGER (kind=ip_intwp_p), DIMENSION(:), ALLOCATABLE :: ilongrd, 
88     $    ilatgrd
89      CHARACTER*8 clname, clfic, clstat, clwork, clstrg
90      CHARACTER*53 clabel
91      CHARACTER*32 cl_att_name
92      INTEGER (kind=ip_intwp_p) itime(3)
93      INTEGER (kind=ip_intwp_p) ist(3), icnt(3), ivardim(3)
94      INTEGER (kind=ip_intwp_p) idimtime, il_timevarid
95      INTEGER (kind=ip_intwp_p) il_nb_att, il_ind_att
96      CHARACTER*4 clon, clat
97C
98C* ---------------------------- Poema verses ----------------------------
99C
100C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
101C
102C*    1. Allocation and initialization
103C        -----------------------------
104C
105      IF (nlogprt .GE. 2) THEN
106          WRITE (UNIT = nulou,FMT = *) ' '
107          WRITE (UNIT = nulou,FMT = *) ' '
108          WRITE (UNIT = nulou,FMT = *) 
109     $    '           ROUTINE givfld  -  Level 1'
110          WRITE (UNIT = nulou,FMT = *) 
111     $    '           **************     *******'
112          WRITE (UNIT = nulou,FMT = *) ' '
113          WRITE (UNIT = nulou,FMT = *) ' Give coupling fields'
114          WRITE (UNIT = nulou,FMT = *) ' '
115          WRITE (UNIT = nulou,FMT = *) ' '
116      ENDIF
117      infos = CLIM_Ok
118      itime(:)=0
119      ist(:)=0
120      icnt(:)=0
121      iflags = 0
122      istop = 0
123      imrca = 0
124      imrcb = 0
125      ALLOCATE (iflag(ig_nfield))
126      ALLOCATE (info(ig_nfield))
127      ALLOCATE (idimlon(ig_nfield))
128      ALLOCATE (idimlat(ig_nfield))
129      ALLOCATE (ivarid(ig_nfield))
130      ALLOCATE (ilongrd(ig_nfield))
131      ALLOCATE (ilatgrd(ig_nfield))     
132      CALL izero (iflag, ig_nfield)
133      CALL izero (info, ig_nfield)
134      idimlon(:)=0
135      idimlat(:)=0
136      ivarid(:)=0
137      ilongrd(:)=0
138      ilatgrd(:)=0
139C
140C
141C*    1.5 Create binary or netcdf output files for PIPE or NONE technique
142C        ----------------------------------------------------------------
143C
144      IF (kiter .eq. 0 .or. cchan .eq. 'PIPE') THEN
145      IF (cchan .eq. 'PIPE' .or. cchan .eq. 'NONE' ) THEN
146         DO 120 jf = 1, kfield
147           iloc = kindex(jf)
148           isamefic=0
149           DO 125 jj = 1, jf-1
150             ilocp=kindex(jj)
151             IF (nluout(iloc) .eq. nluout(ilocp)) THEN
152                 isamefic=isamefic+1
153                 nc_outid(jf) =  nc_outid(jj)
154             ENDIF
155 125       END DO
156           IF (isamefic .lt. 1) THEN
157               iunit = nluout(iloc)
158               clfic = cficout(iloc)
159               IF (lncdfrst) THEN
160                   istatus=NF_CREATE(clfic, NF_CLOBBER, nc_outid(jf))
161                   IF (istatus .ne. NF_NOERR) THEN
162                      CALL prtout
163     $           ('Cannot create netcdf output file for field ',iloc,1)
164                      CALL HALTE('STOP in givfld') 
165                   ENDIF
166C
167C                  For each new file created define all possible 
168C                  dimensions and coordinate variables 
169C
170                   DO 130 jfint=1, kfield
171                     ilocint = kindex(jfint)
172                     isamedimlon = 0
173                     ilon = 0
174                     isamedimlat = 0
175                     ilat = 0
176                     isamegrd = 0
177                     igrd = 0
178C
179C                    Test if same output file 
180                     IF (nluout(ilocint) .eq. iunit) THEN
181C
182C                        Loop on all previous fields
183                         DO 135 jfintp=1, jfint-1
184                           ilocintp=kindex(jfintp)
185C
186C                          Test if same x dimension
187                           IF(nluout(ilocint) .eq. nluout(ilocintp)
188     $                .and. nlonaf(ilocint) .eq. nlonaf(ilocintp)) THEN
189                               isamedimlon = isamedimlon + 1
190                               idimlon(jfint) = idimlon(jfintp)
191                           ENDIF
192C
193C                          Test if same y dimension
194                           IF(nluout(ilocint) .eq. nluout(ilocintp)
195     $                .and. nlataf(ilocint) .eq. nlataf(ilocintp)) THEN
196                               isamedimlat = isamedimlat + 1
197                               idimlat(jfint) = idimlat(jfintp)
198                           ENDIF
199C
200C                          Test IF same grid
201                           IF(nluout(ilocint).eq.nluout(ilocintp) .and.
202     $                     cficaf(ilocint) .eq. cficaf(ilocintp)) THEN
203                               isamegrd = isamegrd + 1
204                               ilongrd(jfint) = ilongrd(jfintp)
205                               ilatgrd(jfint) = ilatgrd(jfintp)
206                           ENDIF
207 135                     CONTINUE
208C
209C                        Define x dimension if not already defined
210                         IF (isamedimlon .lt. 1) THEN
211                             ilon=ilon+1
212                             clon='lon'//char(ilon+48)
213                             CALL hdlerr(NF_DEF_DIM(nc_outid(jf), clon,
214     $                       nlonaf(ilocint), idimlon(jfint)),'givfld')
215                         ENDIF
216C
217C                        Define y dimension if not already defined
218                         IF (isamedimlat .lt. 1) THEN
219                             ilat=ilat+1
220                             clat='lat'//char(ilon+48)
221                             CALL hdlerr(NF_DEF_DIM(nc_outid(jf), clat,
222     $                       nlataf(ilocint), idimlat(jfint)),'givfld')
223                         ENDIF
224C
225C                        Define t dimension and variable at first 
226C                        time step if necessary
227                            CALL hdlerr(NF_DEF_DIM(nc_outid(jf),
228     $                           nc_invartime_name,NF_UNLIMITED,
229     $                           idimtime),'givfld')
230                            CALL hdlerr(NF_DEF_VAR(nc_outid(jf),
231     $                           nc_invartime_name,n_reaty,1,idimtime,
232     $                           il_timevarid),'givfld')
233                            icount = 80
234C
235C                        Copy time variable attributes
236C
237                         IF ( nitfn .gt. 0) THEN
238                            CALL hdlerr(NF_OPEN(cficinp(1),NF_NOWRITE,
239     $                           nc_inpid(1)),'givfld')
240                            CALL hdlerr(NF_INQ_VARNATTS(nc_inpid(1),
241     $                           nc_invartimeid, il_nb_att), 'givfld')
242                            DO il_ind_att=1, il_nb_att
243                                CALL hdlerr(NF_INQ_ATTNAME(nc_inpid(1),
244     $                               nc_invartimeid, il_ind_att,
245     $                               cl_att_name), 'givfld')
246                                CALL hdlerr(NF_COPY_ATT(nc_inpid(1),
247     $                               nc_invartimeid, cl_att_name,
248     $                               nc_outid(jf), il_timevarid)
249     $                               , 'givfld')
250                            END DO
251                            CALL hdlerr(NF_CLOSE(nc_inpid(1)))
252                         ENDIF
253C
254C                        Create coord. variable IF not already created
255                         IF (isamegrd .lt. 1) THEN
256                             ivardim(1)=idimlon(jfint)
257                             ivardim(2)=idimlat(jfint)
258                             clwork = cficaf(jfint)
259                             icount = ilenstr(clwork,jpeight)
260                             clstrg = clwork(1:icount)//cglonsuf
261                             CALL hdlerr(NF_DEF_VAR(nc_outid(jf),
262     $               clstrg,n_reaty,2,ivardim,ilongrd(jfint)),'givfld')
263                             clstrg = clwork(1:icount)//cglatsuf
264                             CALL hdlerr(NF_DEF_VAR(nc_outid(jf), 
265     $               clstrg,n_reaty,2,ivardim,ilatgrd(jfint)),'givfld')
266                         ENDIF
267                     ENDIF
268 130               CONTINUE
269               ELSE
270                   OPEN (UNIT = iunit,FILE = clfic,STATUS = 'UNKNOWN',
271     $             FORM = 'UNFORMATTED',IOSTAT = iost)
272                   IF (iost .ne. 0) THEN
273                       CALL prtout
274     $           ('Cannot create binary output file for field ',iloc,1)
275                       CALL HALTE('STOP in givfld') 
276                   ENDIF
277               ENDIF
278           ENDIF
279
280C
281C* Create the jf netcdf variables
282C
283           IF (lncdfrst) THEN
284               ivardim(1)=idimlon(jf)
285               ivardim(2)=idimlat(jf)
286C                 IF ( nitfn .gt. 0) THEN
287                     ivardim(3)=idimtime
288                     CALL hdlerr(NF_DEF_VAR(nc_outid(jf), cnamout(iloc), 
289     $                    n_reaty, 3, ivardim, ivarid(jf)), 'givfld')
290C                 ELSE
291C                    CALL hdlerr(NF_DEF_VAR(nc_outid(jf), cnamout(iloc), 
292C    $                    n_reaty, 2, ivardim, ivarid(jf)), 'givfld')
293C                 ENDIF
294           ENDIF
295 120     CONTINUE
296C
297C* Define header if info mode is on :
298C  experiment name, initial date, iteration number, time since start
299C
300         IF (lmodinf) THEN
301             itime(1) = ndate
302             itime(2) = kiter
303             itime(3) = kiter * nstep
304             IF (nlogprt .GE. 2) THEN
305                 WRITE (UNIT = nulou,FMT = *) 
306     $              ' Encapsulated data for current field is :'
307                 CALL prcout ('Experiment name', cjobnam, 1)
308                 CALL prtout ('Initial date', itime(1), 2)
309                 CALL prtout ('Iteration number', itime(2), 2)
310                 CALL prtout ('Time since start', itime(3), 2)
311             ENDIF
312         ENDIF
313C
314         IF (lncdfrst) THEN
315C     
316C            Loop on all fields for this iteration
317             DO 140 jf = 1, kfield
318               iloc=kindex(jf)
319               isamefic=0
320C
321C              Test IF define mode has been already left. 
322               DO 145 jj = 1, jf-1
323                 IF (nc_outid(jf) .eq. nc_outid(jj)) THEN
324                     isamefic=isamefic+1
325                 ENDIF
326 145           CONTINUE
327C
328               IF (isamefic .lt. 1) THEN
329C
330C*                 Put header as global attribute IF lmodinf
331                   WRITE(nulou,*)'lmodinf=', lmodinf
332                   IF (lmodinf) THEN
333                      CALL hdlerr(NF_PUT_ATT_TEXT(nc_outid(jf),
334     $                NF_GLOBAL,'Experiment_name',4,cjobnam),'givfld')
335                      CALL hdlerr(NF_PUT_ATT_INT(nc_outid(jf),NF_GLOBAL
336     $                ,'Initial_date',NF_INT,1,itime(1)),'givfld') 
337                      CALL hdlerr(NF_PUT_ATT_INT(nc_outid(jf),NF_GLOBAL
338     $                ,'Iteration_number',NF_INT,1,itime(2)),'givfld')
339                      CALL hdlerr(NF_PUT_ATT_INT(nc_outid(jf),NF_GLOBAL
340     $                ,'Time_since_start',NF_INT,1,itime(3)),'givfld')
341                   ENDIF
342C
343C*                 Leave define mode for netcdf files
344                   istatus=NF_ENDDEF(nc_outid(jf))
345                   IF(istatus .ne. NF_NOERR) THEN
346                       CALL prtout
347     $   ('Cannot leave define mode for output file for field ',iloc,1)
348                       CALL HALTE('STOP in givfld') 
349                   ENDIF   
350               ENDIF
351C
352C              Test IF coordinate variables have already been put. 
353               isamegrd = 0
354               iadrnew = nadrnew_grid(jf)
355               isiznew = nsiznew(jf)
356               DO 155 jj = 1, jf-1
357                 ilocp=kindex(jj)
358                 IF (nluout(iloc) .eq. nluout(ilocp) .and. cficaf(iloc)
359     $               .eq. cficaf(ilocp)) isamegrd=isamegrd+1
360 155           CONTINUE
361C
362C              If not, put coordinate variable to file jf
363               IF (isamegrd .lt. 1) THEN
364                   ist(1)=1 ; ist(2)=1
365                   icnt(1)=nlonaf(iloc) ; icnt(2)=nlataf(iloc)
366                   IF (n_reaty .eq. NF_FLOAT) THEN
367                       istatus=NF_PUT_VARA_REAL 
368     $                    (nc_outid(jf),ilongrd(jf),ist, icnt,
369     $                     xgrnew(iadrnew:iadrnew+isiznew-1))
370
371                   ELSE IF (n_reaty .eq. NF_DOUBLE) THEN
372                       istatus=NF_PUT_VARA_DOUBLE 
373     $                    (nc_outid(jf),ilongrd(jf),ist, icnt,
374     $                     xgrnew(iadrnew:iadrnew+isiznew-1))
375                   ENDIF
376                   IF (n_reaty .eq. NF_FLOAT) THEN
377                       istatus=NF_PUT_VARA_REAL 
378     $                    (nc_outid(jf),ilatgrd(jf),ist, icnt,
379     $                     ygrnew(iadrnew:iadrnew+isiznew-1))
380
381                   ELSE IF (n_reaty .eq. NF_DOUBLE) THEN
382                       istatus=NF_PUT_VARA_DOUBLE 
383     $                    (nc_outid(jf),ilatgrd(jf),ist, icnt,
384     $                     ygrnew(iadrnew:iadrnew+isiznew-1))
385                   ENDIF
386               ENDIF
387 140         CONTINUE
388         ENDIF
389C
390      ENDIF
391C
392      ENDIF
393C
394C*    2. Loop on active fields for iteration kiter
395C        -----------------------------------------
396C
397!$omp parallel do default (shared)
398!$omp+ private (jf,iloc,iadrnew,isiznew,clname,ilabel)
399!$omp+ private (clabel,iunit,clstat)
400!$omp+ reduction (+:infos)
401
402      DO 210 jf = 1, kfield
403C
404C* Assign local variables
405C
406        iloc = kindex(jf)
407        iadrnew = nadrnew(iloc)
408        isiznew = nsiznew(iloc)
409        clname = cnamout(iloc)
410        ilabel = numlab(iloc)
411        clabel = cfldlab(ilabel)
412        iunit = nluout(iloc)
413        clstat = cstate(iloc)
414C
415C* Test if field must be exported
416C
417        IF (clstat .EQ. 'EXPORTED') THEN
418C
419C* Print field name
420C
421           IF (nlogprt .GE. 1) THEN
422              CALL prcout('Writing of field : ', clname, 2)
423              CALL prcout('Field definition : ', clabel, 2)
424           ENDIF
425
426C
427C* - Give coupling fields
428C
429C* PIPE or NONE case
430C
431           IF (cchan .EQ. 'PIPE' .OR. cchan .EQ. 'NONE') THEN
432C     
433              IF (lncdfrst) THEN
434CEM
435C  Get variables ID
436CEM
437                 istatus=NF_INQ_VARID(nc_outid(jf),clname,
438     $                   ivarid(jf))
439                 istatus=NF_INQ_VARID(nc_outid(jf),nc_invartime_name,
440     $                   il_timevarid)
441                 ist(1)=1 ; ist(2)=1 ; ist(3)=1+kiter
442                 icnt(1)=nlonaf(iloc) ; icnt(2)=nlataf(iloc)
443                 icnt(3)=1
444                 IF (n_reaty .eq. NF_FLOAT) THEN
445                    CALL hdlerr(NF_PUT_VARA_REAL
446     $                   (nc_outid(jf),il_timevarid,ist(3),
447     $                   icnt(3),r_time_val), 'givfld')
448                    istatus=NF_PUT_VARA_REAL
449     $                   (nc_outid(jf),ivarid(jf),ist, icnt,
450     $                   fldnew(iadrnew:iadrnew+isiznew-1))
451                    IF (istatus .ne. 0)  THEN
452                       iflag(jf) = istatus
453                       iflags= iflags + 1
454                    ENDIF
455                   
456                 ELSE IF (n_reaty .eq. NF_DOUBLE) THEN
457                    CALL hdlerr(NF_PUT_VARA_DOUBLE
458     $                   (nc_outid(jf),il_timevarid,ist(3),
459     $                    icnt(3),rtime_val), 'givfld')
460                    istatus=NF_PUT_VARA_DOUBLE 
461     $                   (nc_outid(jf),ivarid(jf),ist, icnt,
462     $                   fldnew(iadrnew:iadrnew+isiznew-1))
463                    IF (istatus .ne. 0)  THEN
464                       iflag(jf) = istatus
465                       iflags= iflags + 1
466                    ENDIF
467                 ENDIF
468              ELSE
469C* Write new field on unit iunit with header if required
470C 
471                 IF (lmodinf) THEN
472                    CALL locwrith (clname, cjobnam, itime, 
473     $                   fldnew(iadrnew), isiznew, iunit, iflag(jf))
474                 ELSE
475                    CALL locwrite (clname, fldnew(iadrnew), isiznew, 
476     $                   iunit, iflag(jf))
477                 ENDIF
478                 iflags = iflags + iflag(jf)
479              ENDIF
480          ELSE IF (cchan .EQ. 'SIPC' .OR. cchan .EQ. 'GMEM') THEN
481C
482C* SIPC case
483C
484#if defined use_comm_SIPC || defined use_comm_GMEM
485C
486              ipbytecha=kind('A')
487              ipbyteint=kind(itime)
488              ipbyterea=kind(fldnew)
489C
490C* Write encapsulated infos in field-specific shared memory pool
491C
492              IF (lmodinf) THEN
493                 isizeout = 3*ipbytecha
494                 CALL SVIPC_write(mpoolidou(iloc), cjobnam 
495     $                , isizeout, imrca)
496                 isizeout = 3*ipbyteint
497                 CALL SVIPC_write(mpoolidou(iloc), itime 
498     $                ,isizeout,imrcb)
499C
500C* Find error if any
501C
502                 IF (imrca .LT. 0 .OR. imrcb .LT. 0) THEN
503                    CALL prcout 
504     $  ('Problem in writing encapsulated infos for field', clname, 1)
505                    istop = 1
506                 ENDIF
507                 IF (nlogprt .GE. 2) THEN
508                    CALL prcout
509     $    ('Wrote encapsulated infos in pool for field',clname,1)
510                 ENDIF
511              ENDIF
512C
513C* Write part of macro array in field-specific shared memory pool
514C
515              isizeout = isiznew * ipbyterea
516              IF (nlogprt .GE. 2) THEN
517                 WRITE(UNIT = nulou, FMT = *) 
518     $                'Writing field data to pool = ',mpoolidou(iloc)
519              ENDIF
520              CALL SVIPC_write(mpoolidou(iloc),
521     $             fldnew(iadrnew), isizeout, imrc)
522C
523C* Find error and stop if any
524C
525              IF (imrc .LT. 0) THEN
526                 CALL prcout
527     $               ('Problem in writing field in SHM pool:',clname,1) 
528                 istop = 1
529              ELSE IF (nlogprt .GE. 2) THEN
530                 CALL prcout
531     $                ('Wrote field in SHM pool:', clname, 1)
532              ENDIF
533C
534C* CLIM case
535C
536#endif
537          ELSE IF (cchan .EQ. 'MPI2' .or. cchan .EQ. 'MPI1' ) THEN
538#if defined use_comm_MPI1 || defined use_comm_MPI2 || !defined use_comm_MPI1 && !defined use_comm_MPI2 && !defined use_comm_SIPC && !defined use_comm_GMEM && !defined use_comm_PIPE && !defined use_comm_NONE
539C
540C* Write new field on port clname
541C
542!$omp critical
543              CALL CLIM_Export 
544     $            (ig_portout_id(iloc), kiter*nstep, 
545     $            fldnew(iadrnew), info(jf))
546              infos = infos + info(jf)
547!$omp end critical
548#endif
549          ELSE
550              CALL prcout 
551     $            ('Wrong CHANNEL option for field', clname, 1)
552          ENDIF
553      ELSE IF (clstat .EQ. 'AUXILARY') THEN
554          iflag(jf) = 0
555          info(jf) = 0
556      ENDIF
557 210  CONTINUE
558C
559      IF (cchan .EQ. 'MPI2' .or. cchan .EQ. 'MPI1' ) THEN
560C*
561#if defined use_comm_MPI1 || defined use_comm_MPI2 || !defined use_comm_MPI1 && !defined use_comm_MPI2 && !defined use_comm_SIPC && !defined use_comm_GMEM && !defined use_comm_PIPE && !defined use_comm_NONE
562C*    Stop if problem in writing in CLIM case
563C
564          IF (infos .NE. CLIM_Ok) THEN
565              DO 220 jf = 1, kfield
566                IF (info(jf) .NE. CLIM_Ok) THEN
567                    CALL prcout
568     $                  ('WARNING: problem in writing field on port',
569     $                  clname, 1)
570                    CALL prtout
571     $                  ('error code number', info(jf), 2)
572                ENDIF
573 220          CONTINUE
574              CALL HALTE ('STOP in givfld') 
575          ENDIF
576C
577#endif
578      ELSE IF (cchan .EQ. 'PIPE' .or. cchan .eq. 'NONE') THEN
579#if defined use_comm_PIPE || defined use_comm_NONE
580C*    Stop if problem in writing in PIPE or NONE case
581C
582          IF (iflags .NE. 0) THEN
583              DO 230 jf = 1, kfield
584                IF (iflag(jf) .NE. 0) THEN
585                    iloc = kindex(jf)
586                    iunit = nluout(iloc)
587                    clname = cnamout(iloc)
588                    CALL prcout
589     $                  ('WARNING: problem in writing field',
590     $                  clname, 1)
591                    CALL prtout
592     $                  ('Error writing on logical unit', iunit, 2)
593                ENDIF
594 230          CONTINUE
595              CALL HALTE ('STOP in givfld')
596          ENDIF
597C
598#endif
599      ELSE IF (cchan .EQ. 'SIPC' .or. cchan .eq. 'GMEM') THEN
600#if defined use_comm_SIPC || defined use_comm_GMEM
601C*    Stop if problem in writing in SIPC or GMEM case
602C
603          IF (istop .NE. 0) CALL HALTE ('STOP in givfld')
604#endif
605C
606      ENDIF
607C
608C*    3. PIPE Case: flush data files and send message
609C        --------------------------------------------
610C
611      IF (cchan .EQ. 'PIPE' .or. cchan .eq. 'NONE') THEN
612C 
613          DO 310 jf = 1, kfield
614C
615C* Assign local variables
616C
617            iloc = kindex(jf)
618            clname = cnamout(iloc)
619            iunit = nluout(iloc)
620            clfic = cficout(iloc)
621            clstat = cstate(iloc)
622C
623C* Test if field must be exported
624C
625            IF (clstat .EQ. 'EXPORTED') THEN
626C
627C* Close data file
628C
629                iloc=kindex(jf)
630                isamefic=0
631                DO 3005 jj = 1, jf-1
632                  IF (nc_outid(jf) .eq. nc_outid(jj)) THEN
633                      isamefic=isamefic+1
634                  ENDIF
635 3005           CONTINUE
636C
637                IF (isamefic .lt. 1) THEN
638                    IF (lncdfrst) THEN
639                      IF (kiter.eq.nitfn) then
640                        CALL hdlerr(NF_CLOSE(nc_outid(jf)), 'givfld')
641                     ENDIF
642                    ELSE
643                        CLOSE(UNIT = iunit, ERR = 3010, IOSTAT = ios)
644                        IF (nlogprt .GE. 2) THEN
645                            WRITE(UNIT = nulou,FMT = 3100) iunit,clfic
646                        ENDIF
647 3010                   CONTINUE
648                        IF (ios .NE. 0) THEN
649                            CALL prtout('Problem in closing unit',
650     $                          iunit, 2)
651                            CALL prtout('Error message nbr is= ',ios,2)
652                            CALL HALTE('STOP in givfld')
653                        ENDIF
654                    ENDIF
655                ENDIF
656C
657C* Send message on pipe clname for PIPE technique
658C
659#ifdef use_comm_PIPE
660                CALL PIPE_Send (clname, kiter)
661#endif
662            ELSE IF (clstat .EQ. 'AUXILARY' .AND. nlogprt .GE. 2) THEN
663                WRITE(UNIT = nulou, FMT = 3300) clname, clfic
664            ENDIF
665 310      CONTINUE
666      ENDIF
667 3100 FORMAT(/,5X,' Unit ',I2,' has been disconnected from file ',A8)
668 3200 FORMAT(/,5X,' Unit ',I2,' has been reconnected to file ',A8)
669 3300 FORMAT(/,5X,' Auxilary field ',A8,' is not written on file ',A8)
670C
671C
672C*    4. End of routine
673C        --------------
674C
675      IF (nlogprt .GE. 2) THEN
676          WRITE (UNIT = nulou,FMT = *) ' '
677          WRITE (UNIT = nulou,FMT = *) 
678     $    '          --------- End of routine givfld ---------'
679          CALL FLUSH (nulou)
680      ENDIF
681      DEALLOCATE (info)
682      DEALLOCATE (iflag)
683      DEALLOCATE (idimlon)
684      DEALLOCATE (idimlat)
685      DEALLOCATE (ivarid)
686      DEALLOCATE (ilongrd)
687      DEALLOCATE (ilatgrd)
688      RETURN
689      END
690
Note: See TracBrowser for help on using the repository browser.