/[MITgcm]/MITgcm/pkg/mnc/mnc_cwrapper.F
ViewVC logotype

Contents of /MITgcm/pkg/mnc/mnc_cwrapper.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (show annotations) (download)
Thu Feb 5 00:13:47 2004 UTC (20 years, 4 months ago) by edhill
Branch: MAIN
Changes since 1.4: +6 -3 lines
 o getting closer to a usable MNC package through the "cw" layer:
   - numerous bug fixes
   - global attributes added
   - improved handling of the unlimited dimension
   - "cw" can handle variables with up to 7 dimensions
   - added list of pre-defined grid types

1 C $Header: /u/u3/gcmpack/MITgcm/pkg/mnc/mnc_cwrapper.F,v 1.4 2004/02/04 05:45:09 edhill Exp $
2 C $Name: $
3
4 #include "MNC_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7
8 SUBROUTINE MNC_CW_ADD_GNAME(
9 I myThid,
10 I name,
11 I ndim,
12 I dlens,
13 I dnames,
14 I inds_beg, inds_end )
15
16 implicit none
17 #include "mnc_common.h"
18 #include "EEPARAMS.h"
19
20 C Arguments
21 integer myThid, ndim
22 character*(*) name
23 integer dlens(*), inds_beg(*), inds_end(*)
24 character*(*) dnames(*)
25
26 C Functions
27 integer IFNBLNK, ILNBLNK
28
29 C Local Variables
30 integer i, nnf,nnl, indg
31 character*(MAX_LEN_MBUF) msgbuf
32
33 nnf = IFNBLNK(name)
34 nnl = ILNBLNK(name)
35
36 C Check that this name is not already defined
37 CALL MNC_GET_IND(myThid, MNC_MAX_ID, name, mnc_cw_gname, indg)
38 IF (indg .GT. 0) THEN
39 write(msgbuf,'(3a)') 'MNC_CW_ADD_GNAME ERROR: ''', name,
40 & ''' is already defined'
41 CALL print_error(msgbuf, mythid)
42 stop 'ABNORMAL END: S/R MNC_CW_ADD_GNAME'
43 ENDIF
44 CALL MNC_GET_NEXT_EMPTY_IND(myThid, MNC_MAX_ID, mnc_cw_gname,
45 & indg)
46
47 mnc_cw_gname(indg)(1:MNC_MAX_CHAR)=mnc_blank_name(1:MNC_MAX_CHAR)
48 mnc_cw_gname(indg)(1:(nnl-nnf+1)) = name(nnf:nnl)
49 mnc_cw_ndim(indg) = ndim
50
51 DO i = 1,ndim
52 mnc_cw_dn(i,indg)(1:MNC_MAX_CHAR)=mnc_blank_name(1:MNC_MAX_CHAR)
53 nnf = IFNBLNK(dnames(i))
54 nnl = ILNBLNK(dnames(i))
55 mnc_cw_dn(i,indg)(1:(nnl-nnf+1)) = dnames(i)(nnf:nnl)
56 mnc_cw_dims(i,indg) = dlens(i)
57 mnc_cw_is(i,indg) = inds_beg(i)
58 mnc_cw_ie(i,indg) = inds_end(i)
59 ENDDO
60
61 RETURN
62 END
63
64 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
65
66 SUBROUTINE MNC_CW_DUMP()
67
68 implicit none
69 #include "mnc_common.h"
70
71 C Local Variables
72 integer i,j, ntot
73
74 write(*,'(a)') 'The currently defined Grid Types are:'
75 ntot = 0
76 DO j = 1,MNC_MAX_ID
77 IF (mnc_cw_gname(j)(1:MNC_MAX_CHAR)
78 & .NE. mnc_blank_name(1:MNC_MAX_CHAR)) THEN
79
80 ntot = ntot + 1
81 write(*,'(2i5,a3,a20,i3,a3,5i4,a4,5i4,a4,5i4,6a4)')
82 & j, ntot, ' : ', mnc_cw_gname(j)(1:20), mnc_cw_ndim(j),
83 & ' : ', (mnc_cw_dims(i,j), i=1,5),
84 & ' | ', (mnc_cw_is(i,j), i=1,5),
85 & ' | ', (mnc_cw_ie(i,j), i=1,5),
86 & ' | ', (mnc_cw_dn(i,j)(1:4), i=1,5)
87
88 ENDIF
89 ENDDO
90
91 write(*,'(a)') 'The currently defined Variable Types are:'
92 ntot = 0
93 DO j = 1,MNC_MAX_ID
94 IF (mnc_cw_vname(j)(1:MNC_MAX_CHAR)
95 & .NE. mnc_blank_name(1:MNC_MAX_CHAR)) THEN
96
97 ntot = ntot + 1
98 write(*,'(2i5,a3,a25,a3,i4)') j, ntot, ' : ',
99 & mnc_cw_vname(j)(1:20), ' : ', mnc_cw_vgind(j)
100
101 DO i = 1,mnc_cw_vnat(1,j)
102 write(*,'(a14,i4,a3,a25,a3,a25)') ' text_at:',i,
103 & ' : ', mnc_cw_vtnm(i,j)(1:25), ' : ',
104 & mnc_cw_vtat(i,j)(1:25)
105 ENDDO
106 DO i = 1,mnc_cw_vnat(2,j)
107 write(*,'(a14,i4,a3,a25,a3,i20)') ' int__at:',i,
108 & ' : ', mnc_cw_vinm(i,j)(1:25), ' : ',
109 & mnc_cw_viat(i,j)
110 ENDDO
111 DO i = 1,mnc_cw_vnat(3,j)
112 write(*,'(a14,i4,a3,a25,a3,f25.10)') ' dbl__at:',i,
113 & ' : ', mnc_cw_vdnm(i,j)(1:25), ' : ',
114 & mnc_cw_vdat(i,j)
115 ENDDO
116
117 ENDIF
118 ENDDO
119 IF (ntot .EQ. 0) THEN
120 write(*,'(a)') ' None defined!'
121 ENDIF
122
123
124 RETURN
125 END
126
127 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
128
129 SUBROUTINE MNC_CW_INIT(
130 I myThid,
131 I sNx,sNy, OLx,OLy, nSx,nSy, nPx,nPy, Nr )
132
133 implicit none
134 #include "mnc_common.h"
135 #include "EEPARAMS.h"
136
137 C Arguments
138 integer myThid
139 integer sNx,sNy, OLx,OLy, nSx,nSy, nPx,nPy, Nr
140
141 C Functions
142 integer IFNBLNK, ILNBLNK
143
144 C Local Variables
145 integer CW_MAX_LOC
146 parameter ( CW_MAX_LOC = 5 )
147 integer i, ihorz,ihsub,ivert,itime,ihalo, is,ih, n,ntot
148 integer ndim, ncomb
149 character*(MAX_LEN_MBUF) msgbuf
150 character*(MNC_MAX_CHAR) name
151 character*(MNC_MAX_CHAR) dn(CW_MAX_LOC)
152 character*(5) horz_dat(CW_MAX_LOC), hsub_dat(CW_MAX_LOC),
153 & vert_dat(CW_MAX_LOC), time_dat(CW_MAX_LOC),
154 & halo_dat(CW_MAX_LOC)
155 integer dim(CW_MAX_LOC), ib(CW_MAX_LOC), ie(CW_MAX_LOC)
156
157 C ......12345....12345....12345....12345....12345...
158 data horz_dat /
159 & '- ', 'U ', 'V ', 'Cen ', 'Cor ' /
160 data hsub_dat /
161 & 'xy ', 'x ', 'y ', '- ', ' ' /
162 data halo_dat /
163 & 'Hn ', 'Hy ', '-- ', ' ', ' ' /
164 data vert_dat /
165 & '- ', 'C ', 'I ', ' ', ' ' /
166 data time_dat /
167 & '- ', 't ', ' ', ' ', ' ' /
168
169 ncomb = 0
170 DO ihorz = 1,5
171 DO is = 1,3
172 DO ih = 1,2
173
174 C Loop just ONCE if the Horiz component is "-"
175 ihsub = is
176 ihalo = ih
177 IF (ihorz .EQ. 1) THEN
178 IF ((is .EQ. 1) .AND. (ih .EQ. 1)) THEN
179 ihsub = 4
180 ihalo = 3
181 ELSE
182 GOTO 10
183 ENDIF
184 ENDIF
185
186 DO ivert = 1,3
187 DO itime = 1,2
188
189 C horiz and hsub
190 name(1:MNC_MAX_CHAR) = mnc_blank_name(1:MNC_MAX_CHAR)
191 n = ILNBLNK(horz_dat(ihorz))
192 name(1:n) = horz_dat(ihorz)(1:n)
193 ntot = n + 1
194 name(ntot:ntot) = '_'
195 n = ILNBLNK(hsub_dat(ihsub))
196 name((ntot+1):(ntot+n)) = hsub_dat(ihsub)(1:n)
197 ntot = ntot + n
198
199 C vert, time, and halo
200 write(name((ntot+1):(ntot+9)), '(a1,2a2,a1,a2,a1)')
201 & '_', halo_dat(ihalo)(1:2), '__',
202 & vert_dat(ivert)(1:1), '__',
203 & time_dat(itime)(1:1)
204
205 ndim = 0
206 DO i = 1,CW_MAX_LOC
207 dn(i)(1:MNC_MAX_CHAR)=mnc_blank_name(1:MNC_MAX_CHAR)
208 dim(i) = 0
209 ib(i) = 0
210 ie(i) = 0
211 ENDDO
212
213 C Horizontal dimensions
214 IF (halo_dat(ihalo)(1:5) .EQ. 'Hn ') THEN
215
216 IF (hsub_dat(ihsub)(1:1) .EQ. 'x') THEN
217 ndim = ndim + 1
218 IF ( (horz_dat(ihorz)(1:3) .EQ. 'Cen')
219 & .OR. (horz_dat(ihorz)(1:1) .EQ. 'V') ) THEN
220 dn(ndim)(1:1) = 'X'
221 dim(ndim) = sNx + 2*OLx
222 ib(ndim) = OLx + 1
223 ie(ndim) = OLx + sNx
224 ENDIF
225 IF ( (horz_dat(ihorz)(1:3) .EQ. 'Cor')
226 & .OR. (horz_dat(ihorz)(1:1) .EQ. 'U') ) THEN
227 dn(ndim)(1:3) = 'Xp1'
228 dim(ndim) = sNx + 2*OLx
229 ib(ndim) = OLx + 1
230 ie(ndim) = OLx + sNx + 1
231 ENDIF
232 ENDIF
233 IF ((hsub_dat(ihsub)(1:1) .EQ. 'y')
234 & .OR. (hsub_dat(ihsub)(2:2) .EQ. 'y')) THEN
235 ndim = ndim + 1
236 IF ( (horz_dat(ihorz)(1:3) .EQ. 'Cen')
237 & .OR. (horz_dat(ihorz)(1:1) .EQ. 'U') ) THEN
238 dn(ndim)(1:1) = 'Y'
239 dim(ndim) = sNy + 2*OLy
240 ib(ndim) = OLy + 1
241 ie(ndim) = OLy + sNy
242 ENDIF
243 IF ( (horz_dat(ihorz)(1:3) .EQ. 'Cor')
244 & .OR. (horz_dat(ihorz)(1:1) .EQ. 'V') ) THEN
245 dn(ndim)(1:3) = 'Yp1'
246 dim(ndim) = sNy + 2*OLy
247 ib(ndim) = OLy + 1
248 ie(ndim) = OLy + sNy + 1
249 ENDIF
250 ENDIF
251
252 ELSEIF (halo_dat(ihalo)(1:5) .EQ. 'Hy ') THEN
253
254 IF (hsub_dat(ihsub)(1:1) .EQ. 'x') THEN
255 ndim = ndim + 1
256 dn(ndim)(1:3) = 'Xwh'
257 dim(ndim) = sNx + 2*OLx
258 ib(ndim) = 1
259 ie(ndim) = sNx + 2*OLx
260 ENDIF
261 IF ((hsub_dat(ihsub)(1:1) .EQ. 'y')
262 & .OR. (hsub_dat(ihsub)(2:2) .EQ. 'y')) THEN
263 ndim = ndim + 1
264 dn(ndim)(1:3) = 'Ywh'
265 dim(ndim) = sNy + 2*OLy
266 ib(ndim) = 1
267 ie(ndim) = sNy + 2*OLy
268 ENDIF
269
270 ENDIF
271
272 C Vertical dimension
273 IF (vert_dat(ivert)(1:1) .EQ. 'C') THEN
274 ndim = ndim + 1
275 dn(ndim)(1:1) = 'Z'
276 dim(ndim) = Nr
277 ib(ndim) = 1
278 ie(ndim) = Nr
279 ENDIF
280 IF (vert_dat(ivert)(1:1) .EQ. 'I') THEN
281 ndim = ndim + 1
282 dn(ndim)(1:3) = 'Zp1'
283 dim(ndim) = Nr + 1
284 ib(ndim) = 1
285 ie(ndim) = Nr + 1
286 ENDIF
287
288 C Time dimension
289 IF (time_dat(itime)(1:1) .EQ. 't') THEN
290 ndim = ndim + 1
291 dn(ndim)(1:1) = 'T'
292 dim(ndim) = -1
293 ib(ndim) = 1
294 ie(ndim) = 1
295 ENDIF
296
297 IF (ndim .GT. 0) THEN
298 #ifdef MNC_DEBUG
299 ncomb = ncomb + 1
300 write(*,'(i4,a3,a15,i3,a3,5i4,a4,5i4,a4,5i4,6a4)')
301 & ncomb, ' : ', name(1:15), ndim,
302 & ' : ', (dim(i), i=1,5),
303 & ' | ', (ib(i), i=1,5),
304 & ' | ', (ie(i), i=1,5),
305 & ' | ', (dn(i)(1:4), i=1,5)
306 #endif
307
308 CALL MNC_CW_ADD_GNAME(myThid, name, ndim,
309 & dim, dn, ib, ie)
310 ENDIF
311
312 ENDDO
313 ENDDO
314
315 10 CONTINUE
316 ENDDO
317 ENDDO
318 ENDDO
319
320 RETURN
321 END
322
323 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
324
325 SUBROUTINE MNC_CW_ADD_VNAME(
326 I myThid,
327 I vname,
328 I gname,
329 I bi_dim, bj_dim )
330
331 implicit none
332 #include "mnc_common.h"
333 #include "EEPARAMS.h"
334
335 C Arguments
336 integer myThid, bi_dim, bj_dim
337 character*(*) vname, gname
338
339 C Functions
340 integer IFNBLNK, ILNBLNK
341
342 C Local Variables
343 integer i, nvf,nvl, ngf,ngl, indv,indg
344 character*(MAX_LEN_MBUF) msgbuf
345
346 nvf = IFNBLNK(vname)
347 nvl = ILNBLNK(vname)
348 ngf = IFNBLNK(gname)
349 ngl = ILNBLNK(gname)
350
351 C Check that this vname is not already defined
352 CALL MNC_GET_IND(myThid, MNC_MAX_ID, vname, mnc_cw_vname, indv)
353 IF (indv .GT. 0) THEN
354 write(msgbuf,'(3a)') 'MNC_CW_ADD_VNAME ERROR: ''',
355 & vname(nvf:nvl), ''' is already defined'
356 CALL print_error(msgbuf, mythid)
357 stop 'ABNORMAL END: S/R MNC_CW_ADD_VNAME'
358 ENDIF
359 CALL MNC_GET_NEXT_EMPTY_IND(myThid, MNC_MAX_ID, mnc_cw_vname,
360 & indv)
361
362 C Check that gname exists
363 CALL MNC_GET_IND(myThid, MNC_MAX_ID, gname, mnc_cw_gname, indg)
364 IF (indg .LT. 1) THEN
365 write(msgbuf,'(3a)') 'MNC_CW_ADD_VNAME ERROR: ''',
366 & gname(ngf:ngl), ''' is not defined'
367 CALL print_error(msgbuf, mythid)
368 stop 'ABNORMAL END: S/R MNC_CW_ADD_VNAME'
369 ENDIF
370
371 mnc_cw_vname(indv)(1:MNC_MAX_CHAR)=mnc_blank_name(1:MNC_MAX_CHAR)
372 mnc_cw_vname(indv)(1:(nvl-nvf+1)) = vname(nvf:nvl)
373 mnc_cw_vgind(indv) = indg
374 DO i = 1,3
375 mnc_cw_vnat(i,indv) = 0
376 ENDDO
377 mnc_cw_vbij(1,indv) = bi_dim
378 mnc_cw_vbij(2,indv) = bj_dim
379
380 RETURN
381 END
382
383 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
384
385 SUBROUTINE MNC_CW_ADD_VATTR_TEXT(
386 I myThid,
387 I vname,
388 I ntat,
389 I tnames,
390 I tvals )
391
392 implicit none
393
394 C Arguments
395 integer myThid, ntat
396 character*(*) vname, tnames(*), tvals(*)
397
398 CALL MNC_CW_ADD_VATTR_ANY(myThid, vname,
399 & ntat, 0, 0,
400 & tnames, ' ', ' ',
401 & tvals, 0, 0.0D0 )
402
403 RETURN
404 END
405
406 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
407
408 SUBROUTINE MNC_CW_ADD_VATTR_INT(
409 I myThid,
410 I vname,
411 I niat,
412 I inames,
413 I ivals )
414
415 implicit none
416
417 C Arguments
418 integer myThid, niat
419 character*(*) vname, inames(*)
420 integer ivals(*)
421
422 CALL MNC_CW_ADD_VATTR_ANY(myThid, vname,
423 & 0, niat, 0,
424 & ' ', inames, ' ',
425 & ' ', ivals, 0.0D0 )
426
427 RETURN
428 END
429
430 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
431
432 SUBROUTINE MNC_CW_ADD_VATTR_DBL(
433 I myThid,
434 I vname,
435 I ndat,
436 I dnames,
437 I dvals )
438
439 implicit none
440
441 C Arguments
442 integer myThid, ndat
443 character*(*) vname, dnames(*)
444 REAL*8 dvals(*)
445
446 CALL MNC_CW_ADD_VATTR_ANY(myThid, vname,
447 & 0, 0, ndat,
448 & ' ', ' ', dnames,
449 & ' ', 0, dvals )
450
451 RETURN
452 END
453
454 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
455
456 SUBROUTINE MNC_CW_ADD_VATTR_ANY(
457 I myThid,
458 I vname,
459 I ntat, niat, ndat,
460 I tnames, inames, dnames,
461 I tvals, ivals, dvals )
462
463 implicit none
464 #include "mnc_common.h"
465 #include "EEPARAMS.h"
466
467 C Arguments
468 integer myThid, ntat, niat, ndat
469 character*(*) vname
470 character*(*) tnames(*), inames(*), dnames(*)
471 character*(*) tvals(*)
472 integer ivals(*)
473 REAL*8 dvals(*)
474
475 C Functions
476 integer IFNBLNK, ILNBLNK
477
478 C Local Variables
479 integer i, n, nvf,nvl, n1,n2, indv
480 character*(MAX_LEN_MBUF) msgbuf
481
482 nvf = IFNBLNK(vname)
483 nvl = ILNBLNK(vname)
484
485 C Check that vname is defined
486 CALL MNC_GET_IND(myThid, MNC_MAX_ID, vname, mnc_cw_vname, indv)
487 IF (indv .LT. 1) THEN
488 write(msgbuf,'(3a)') 'MNC_CW_ADD_VATTR_ANY ERROR: ''',
489 & vname(nvf:nvl), ''' is not defined'
490 CALL print_error(msgbuf, mythid)
491 stop 'ABNORMAL END: S/R MNC_CW_ADD_VATTR_ANY'
492 ENDIF
493
494 C Text Attributes
495 n = mnc_cw_vnat(1,indv)
496 DO i = 1,ntat
497 n1 = IFNBLNK(tnames(i))
498 n2 = ILNBLNK(tnames(i))
499 mnc_cw_vtnm(n+i,indv)(1:(n2-n1+1)) = tnames(i)(n1:n2)
500 n1 = IFNBLNK(tvals(i))
501 n2 = ILNBLNK(tvals(i))
502 mnc_cw_vtat(n+i,indv)(1:(n2-n1+1)) = tvals(i)(n1:n2)
503 ENDDO
504 mnc_cw_vnat(1,indv) = n + ntat
505
506 C Integer Attributes
507 n = mnc_cw_vnat(2,indv)
508 DO i = 1,niat
509 n1 = IFNBLNK(inames(i))
510 n2 = ILNBLNK(inames(i))
511 mnc_cw_vinm(n+i,indv)(1:(n2-n1+1)) = inames(i)(n1:n2)
512 mnc_cw_viat(n+i,indv) = ivals(i)
513 ENDDO
514 mnc_cw_vnat(2,indv) = n + niat
515
516 C Double Attributes
517 n = mnc_cw_vnat(3,indv)
518 DO i = 1,ndat
519 n1 = IFNBLNK(dnames(i))
520 n2 = ILNBLNK(dnames(i))
521 mnc_cw_vdnm(n+i,indv)(1:(n2-n1+1)) = dnames(i)(n1:n2)
522 mnc_cw_vdat(n+i,indv) = dvals(i)
523 ENDDO
524 mnc_cw_vnat(3,indv) = n + ndat
525
526 RETURN
527 END
528
529 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
530
531 SUBROUTINE MNC_CW_GET_TILE_NUM(
532 I myThid,
533 I bi, bj,
534 O uniq_tnum )
535
536 implicit none
537 #include "EEPARAMS.h"
538 #include "SIZE.h"
539
540 C Arguments
541 integer myThid, bi,bj, uniq_tnum
542
543 C Local Variables
544 integer iG,jG
545
546 iG = 0
547 jG = 0
548
549 #ifdef ALLOW_EXCH2
550
551 #include "W2_EXCH2_PARAMS.h"
552 uniq_tnum = W2_myTileList(bi)
553
554 #else
555
556 C Global tile number for simple (non-cube) domains
557 iG = bi+(myXGlobalLo-1)/sNx
558 jG = bj+(myYGlobalLo-1)/sNy
559
560 uniq_tnum = (jG - 1)*(nPx*nSx) + iG
561
562 #endif
563
564 CEH3 write(*,*) 'iG,jG,uniq_tnum :', iG,jG,uniq_tnum
565
566 RETURN
567 END
568
569 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
570
571 SUBROUTINE MNC_CW_FILE_AORC(
572 I myThid,
573 I fname,
574 O indf )
575
576 implicit none
577 #include "netcdf.inc"
578 #include "mnc_common.h"
579 #include "EEPARAMS.h"
580
581 C Arguments
582 integer myThid, indf
583 character*(*) fname
584
585 C Local Variables
586 integer i, ierr
587 character*(MAX_LEN_MBUF) msgbuf
588
589 C Check if the file is already open
590 CALL MNC_GET_IND(myThid, MNC_MAX_ID, fname, mnc_f_names, indf)
591 IF (indf .GT. 0) THEN
592 RETURN
593 ENDIF
594
595 C Try to open an existing file
596 CALL MNC_FILE_TRY_READ(myThid, fname, ierr, indf)
597 IF (ierr .EQ. NF_NOERR) THEN
598 RETURN
599 ENDIF
600
601 C Try to create a new one
602 CALL MNC_FILE_OPEN(myThid, fname, 0, indf)
603
604 RETURN
605 END
606
607 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
608

  ViewVC Help
Powered by ViewVC 1.1.22