102
103
105
106#if !defined PARALLEL_IO && defined DISTRIBUTE
108#endif
110
111
112
113 logical, intent(in), optional :: SetFillVal
114 logical, intent(in), optional :: SetParAccess
115
116 integer, intent (in) :: ng, model, ncid, Vtype, nVdim
117
118 integer, dimension(:), intent (in) :: Vdim
119
120 integer, intent (out) :: Vid
121
122 real(r8), dimension(:), intent(inout) :: Aval
123
124 character (len=*), intent(in) :: ncname
125 character (len=*), intent(inout) :: Vinfo(25)
126
127
128
129#ifdef MASKING
130 logical :: LandFill
131#endif
132#if defined PARALLEL_IO && defined DISTRIBUTE
133 logical :: Ltiled
134
135#endif
136 integer :: i, j, latt
137 integer :: status
138
139 character (len= 5) location
140 character (len=160) text
141
142 character (len=*), parameter :: MyFile = &
143 & __FILE__//", def_var_nf90"
144
145
146
147
148
149 status=nf90_noerr
150
151 IF (outthread) THEN
152
153
154
155 IF (exit_flag.eq.noerror) THEN
156 IF (len_trim(vinfo(1)).gt.0) THEN
157 IF ((nvdim.eq.1).and.(vdim(1).eq.0)) THEN
158 status=nf90_def_var(ncid, trim(vinfo(1)), vtype, &
159 & varid = vid)
160 ELSE
161 status=nf90_def_var(ncid, trim(vinfo(1)), vtype, &
162 & vdim(1:nvdim), vid)
163 END IF
164 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
165 IF (master) WRITE (stdout,10) ng, trim(vinfo(1)), &
166 & trim(ncname)
167 exit_flag=3
168 ioerror=status
169 END IF
170 END IF
171 END IF
172
173#if !defined PARALLEL_IO && (defined HDF5 && defined DEFLATE)
174
175
176
177
178
179
180
181 IF (exit_flag.eq.noerror) THEN
182 IF (len_trim(vinfo(1)).gt.0) THEN
183 IF ((nvdim.gt.1).and.(vdim(1).ne.0)) THEN
186 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
187 IF (master) WRITE (stdout,20) trim(vinfo(1)), &
188 & trim(ncname)
189 exit_flag=3
190 ioerror=status
191 END IF
192 END IF
193 END IF
194 END IF
195#endif
196
197
198
199 IF (exit_flag.eq.noerror) THEN
200 IF (trim(vinfo(1)).eq.'grid') THEN
201 status=nf90_put_att(ncid, vid, 'cf_role', &
202 & 'grid_topology')
203 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
204 IF (master) WRITE (stdout,30) 'cf_role', &
205 & trim(vinfo(1)), &
206 & trim(ncname)
207 exit_flag=3
208 ioerror=status
209 END IF
210
211 status=nf90_put_att(ncid, vid, 'topology_dimension', &
212 & (/2/))
213 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
214 IF (master) WRITE (stdout,30) 'topology_dimension', &
215 & trim(vinfo(1)), &
216 & trim(ncname)
217 exit_flag=3
218 ioerror=status
219 END IF
220
221 status=nf90_put_att(ncid, vid, 'node_dimensions', &
222 & 'xi_psi eta_psi')
223 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
224 IF (master) WRITE (stdout,30) 'node_dimensions', &
225 & trim(vinfo(1)), &
226 & trim(ncname)
227 exit_flag=3
228 ioerror=status
229 END IF
230
231 text='xi_rho: xi_psi (padding: both) '// &
232 & 'eta_rho: eta_psi (padding: both)'
233 status=nf90_put_att(ncid, vid, 'face_dimensions', &
234 & trim(text))
235 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
236 IF (master) WRITE (stdout,30) 'face_dimensions', &
237 & trim(vinfo(1)), &
238 & trim(ncname)
239 exit_flag=3
240 ioerror=status
241 END IF
242
243 text='xi_u: xi_psi eta_u: eta_psi (padding: both)'
244 status=nf90_put_att(ncid, vid, 'edge1_dimensions', &
245 & trim(text))
246 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
247 IF (master) WRITE (stdout,30) 'edge1_dimensions', &
248 & trim(vinfo(1)), &
249 & trim(ncname)
250 exit_flag=3
251 ioerror=status
252 END IF
253
254 text='xi_v: xi_psi (padding: both) eta_v: eta_psi'
255 status=nf90_put_att(ncid, vid, 'edge2_dimensions', &
256 & trim(text))
257 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
258 IF (master) WRITE (stdout,30) 'edge2_dimensions', &
259 & trim(vinfo(1)), &
260 & trim(ncname)
261 exit_flag=3
262 ioerror=status
263 END IF
264
265 IF (spherical) THEN
266 status=nf90_put_att(ncid, vid, 'node_coordinates', &
267 & 'lon_psi lat_psi')
268 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
269 IF (master) WRITE (stdout,30) 'node_coordinates', &
270 & trim(vinfo(1)), &
271 & trim(ncname)
272 exit_flag=3
273 ioerror=status
274 END IF
275
276 status=nf90_put_att(ncid, vid, 'face_coordinates', &
277 & 'lon_rho lat_rho')
278 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
279 IF (master) WRITE (stdout,30) 'face_coordinates', &
280 & trim(vinfo(1)), &
281 & trim(ncname)
282 exit_flag=3
283 ioerror=status
284 END IF
285
286 status=nf90_put_att(ncid, vid, 'edge1_coordinates', &
287 & 'lon_u lat_u')
288 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
289 IF (master) WRITE (stdout,30) 'edge1_coordinates', &
290 & trim(vinfo(1)), &
291 & trim(ncname)
292 exit_flag=3
293 ioerror=status
294 END IF
295
296 status=nf90_put_att(ncid, vid, 'edge2_coordinates', &
297 & 'lon_v lat_v')
298 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
299 IF (master) WRITE (stdout,30) 'edge2_coordinates', &
300 & trim(vinfo(1)), &
301 & trim(ncname)
302 exit_flag=3
303 ioerror=status
304 END IF
305 ELSE
306 status=nf90_put_att(ncid, vid, 'node_coordinates', &
307 & 'x_psi y_psi')
308 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
309 IF (master) WRITE (stdout,30) 'node_coordinates', &
310 & trim(vinfo(1)), &
311 & trim(ncname)
312 exit_flag=3
313 ioerror=status
314 END IF
315
316 status=nf90_put_att(ncid, vid, 'face_coordinates', &
317 & 'x_rho y_rho')
318 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
319 IF (master) WRITE (stdout,30) 'face_coordinates', &
320 & trim(vinfo(1)), &
321 & trim(ncname)
322 exit_flag=3
323 ioerror=status
324 END IF
325
326 status=nf90_put_att(ncid, vid, 'edge1_coordinates', &
327 & 'x_u y_u')
328 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
329 IF (master) WRITE (stdout,30) 'edge1_coordinates', &
330 & trim(vinfo(1)), &
331 & trim(ncname)
332 exit_flag=3
333 ioerror=status
334 END IF
335
336 status=nf90_put_att(ncid, vid, 'edge2_coordinates', &
337 & 'x_v y_v')
338 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
339 IF (master) WRITE (stdout,30) 'edge2_coordinates', &
340 & trim(vinfo(1)), &
341 & trim(ncname)
342 exit_flag=3
343 ioerror=status
344 END IF
345 END IF
346#ifdef SOLVE3D
347
348 status=nf90_put_att(ncid, vid, 'vertical_dimensions', &
349 & 's_rho: s_w (padding: none)')
350 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
351 IF (master) WRITE (stdout,30) 'vertical_dimensions', &
352 & trim(vinfo(1)), &
353 & trim(ncname)
354 exit_flag=3
355 ioerror=status
356 END IF
357#endif
358 END IF
359 END IF
360
361
362
363 IF (exit_flag.eq.noerror) THEN
364 latt=len_trim(vinfo(21))
365 IF (latt.gt.0.and.(vinfo(21)(1:6).ne.'nulval')) THEN
366 status=nf90_put_att(ncid, vid, 'standard_name', &
367 & vinfo(21)(1:latt))
368 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
369 IF (master) WRITE (stdout,30) 'standard_name', &
370 & trim(vinfo(1)), &
371 & trim(ncname)
372 exit_flag=3
373 ioerror=status
374 END IF
375 END IF
376 END IF
377
378
379
380 IF (exit_flag.eq.noerror) THEN
381 IF (len_trim(vinfo(2)).gt.0) THEN
382 vinfo(2)=trim(adjustl(vinfo(2)))
383 latt=len_trim(vinfo(2))
384 status=nf90_put_att(ncid, vid, 'long_name', &
385 & vinfo(2)(1:latt))
386 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
387 IF (master) WRITE (stdout,30) 'long_name', &
388 & trim(vinfo(1)), &
389 & trim(ncname)
390 exit_flag=3
391 ioerror=status
392 END IF
393 END IF
394 END IF
395
396
397
398 IF (exit_flag.eq.noerror) THEN
399 latt=len_trim(vinfo(19))
400 IF (latt.gt.0) THEN
401 status=nf90_put_att(ncid, vid, 'size_class', &
402 & vinfo(19)(1:latt))
403 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
404 IF (master) WRITE (stdout,30) 'size_class', &
405 & trim(vinfo(1)), &
406 & trim(ncname)
407 exit_flag=3
408 ioerror=status
409 END IF
410 END IF
411 END IF
412
413
414
415 IF (exit_flag.eq.noerror) THEN
416 latt=len_trim(vinfo(3))
417 IF (latt.gt.0) THEN
418 IF (trim(vinfo(3)).ne.'nondimensional') THEN
419 status=nf90_put_att(ncid, vid, 'units', &
420 & vinfo(3)(1:latt))
421 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
422 IF (master) WRITE (stdout,30) 'units', &
423 & trim(vinfo(1)), &
424 & trim(ncname)
425 exit_flag=3
426 ioerror=status
427 END IF
428 END IF
429 END IF
430 END IF
431
432
433
434 IF (exit_flag.eq.noerror) THEN
435 latt=len_trim(vinfo(4))
436 IF (latt.gt.0) THEN
437 status=nf90_put_att(ncid, vid, 'calendar', &
438 & vinfo(4)(1:latt))
439 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
440 IF (master) WRITE (stdout,30) 'calendar', &
441 & trim(vinfo(1)), &
442 & trim(ncname)
443 exit_flag=3
444 ioerror=status
445 END IF
446 END IF
447 END IF
448
449
450
451 IF (exit_flag.eq.noerror) THEN
452 latt=len_trim(vinfo(5))
453 IF (latt.gt.0) THEN
454 IF (vtype.eq.nf90_int) THEN
455 status=nf90_put_att(ncid, vid, trim(vinfo(5)), &
456 & int(aval(2)))
457#ifndef NO_4BYTE_REALS
458 ELSE IF (vtype.eq.nf90_float) THEN
459 status=nf90_put_att(ncid, vid, trim(vinfo(5)), &
460 & real(aval(2),r4))
461#endif
462 ELSE
463 status=nf90_put_att(ncid, vid, trim(vinfo(5)), &
464 & aval(2))
465 END IF
466 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
467 IF (master) WRITE (stdout,30) trim(vinfo(5)), &
468 & trim(vinfo(1)), &
469 & trim(ncname)
470 exit_flag=3
471 ioerror=status
472 END IF
473 aval(2)=0.0_r8
474 END IF
475 END IF
476
477
478
479 IF (exit_flag.eq.noerror) THEN
480 latt=len_trim(vinfo(6))
481 IF (latt.gt.0) THEN
482 IF (vtype.eq.nf90_int) THEN
483 status=nf90_put_att(ncid, vid, trim(vinfo(6)), &
484 & int(aval(3)))
485#ifndef NO_4BYTE_REALS
486 ELSE IF (vtype.eq.nf90_float) THEN
487 status=nf90_put_att(ncid, vid, trim(vinfo(6)), &
488 & real(aval(3),r4))
489#endif
490 ELSE
491 status=nf90_put_att(ncid, vid, trim(vinfo(6)), &
492 & aval(3))
493 END IF
494 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
495 IF (master) WRITE (stdout,30) trim(vinfo(6)), &
496 & trim(vinfo(1)), &
497 & trim(ncname)
498 exit_flag=3
499 ioerror=status
500 END IF
501 aval(3)=0.0_r8
502 END IF
503 END IF
504
505
506
507
508 IF (exit_flag.eq.noerror) THEN
509 IF ((len_trim(vinfo(7)).gt.0).and. &
510 & (len_trim(vinfo(8)).gt.0)) THEN
511 text='T, F'
512 latt=len_trim(text)
513 status=nf90_put_att(ncid, vid, 'flag_values', &
514 & text(1:latt))
515 IF (status.eq.nf90_noerr) THEN
516 text=trim(vinfo(7))//' '//trim(vinfo(8))
517 latt=len_trim(text)
518 status=nf90_put_att(ncid, vid, 'flag_meanings', &
519 & text(1:latt))
520 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
521 IF (master) WRITE (stdout,30) 'flag_meanings (T/F)', &
522 & trim(vinfo(1)), &
523 & trim(ncname)
524 exit_flag=3
525 ioerror=status
526 END IF
527 ELSE
528 IF (master) WRITE (stdout,30) 'flag_values (T/F)', &
529 & trim(vinfo(1)), &
530 & trim(ncname)
531 exit_flag=3
532 ioerror=status
533 END IF
534 END IF
535 END IF
536
537
538
539
540 IF (exit_flag.eq.noerror) THEN
541 IF ((len_trim(vinfo( 9)).gt.0).and. &
542 & (len_trim(vinfo(10)).gt.0)) THEN
543 IF (vtype.eq.nf90_int) THEN
544 status=nf90_put_att(ncid, vid, 'flag_values', &
545 & (/0,1/))
546#ifndef NO_4BYTE_REALS
547 ELSE IF (vtype.eq.nf90_float) THEN
548 status=nf90_put_att(ncid, vid, 'flag_values', &
549 & (/0.0_r4, 1.0_r4/))
550#endif
551 ELSE
552 status=nf90_put_att(ncid, vid, 'flag_values', &
553 & (/0.0_r8, 1.0_r8/))
554 END IF
555 IF (status.eq.nf90_noerr) THEN
556 text=trim(vinfo(9))//' '//trim(vinfo(10))
557 latt=len_trim(text)
558 status=nf90_put_att(ncid, vid, 'flag_meanings', &
559 & text(1:latt))
560 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
561 IF (master) WRITE (stdout,30) 'flag_meanings', &
562 & trim(vinfo(1)), &
563 & trim(ncname)
564 exit_flag=3
565 ioerror=status
566 END IF
567 ELSE
568 IF (master) WRITE (stdout,30) 'flag_values', &
569 & trim(vinfo(1)), &
570 & trim(ncname)
571 exit_flag=3
572 ioerror=status
573 END IF
574 END IF
575 END IF
576
577
578
579 IF (exit_flag.eq.noerror) THEN
580 latt=len_trim(vinfo(11))
581 IF (latt.gt.0) THEN
582 status=nf90_put_att(ncid, vid, 'negative_value', &
583 & vinfo(11)(1:latt))
584 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
585 IF (master) WRITE (stdout,30) 'negative_value', &
586 & trim(vinfo(1)), &
587 & trim(ncname)
588 exit_flag=3
589 ioerror=status
590 END IF
591 END IF
592 END IF
593
594
595
596 IF (exit_flag.eq.noerror) THEN
597 latt=len_trim(vinfo(12))
598 IF (latt.gt.0) THEN
599 status=nf90_put_att(ncid, vid, 'positive_value', &
600 & vinfo(12)(1:latt))
601 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
602 IF (master) WRITE (stdout,30) 'positive_value', &
603 & trim(vinfo(1)), &
604 & trim(ncname)
605 exit_flag=3
606 ioerror=status
607 END IF
608 END IF
609 END IF
610
611
612
613 IF (exit_flag.eq.noerror) THEN
614 latt=len_trim(vinfo(25))
615 IF (latt.gt.0) THEN
616 status=nf90_put_att(ncid, vid, 'positive', &
617 & vinfo(25)(1:latt))
618 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
619 IF (master) WRITE (stdout,30) 'positive', &
620 & trim(vinfo(1)), &
621 & trim(ncname)
622 exit_flag=3
623 ioerror=status
624 END IF
625 END IF
626 END IF
627
628
629
630 IF (exit_flag.eq.noerror) THEN
631 latt=len_trim(vinfo(13))
632 IF (latt.gt.0) THEN
633 status=nf90_put_att(ncid, vid, 'cycle', &
634 & vinfo(13)(1:latt))
635 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
636 IF (master) WRITE (stdout,30) 'cycle', &
637 & trim(vinfo(1)), &
638 & trim(ncname)
639 exit_flag=3
640 ioerror=status
641 END IF
642 END IF
643 END IF
644
645
646
647 IF (exit_flag.eq.noerror) THEN
648 latt=len_trim(vinfo(15))
649 IF (latt.gt.0) THEN
650 status=nf90_put_att(ncid, vid, 'positions', &
651 & vinfo(15)(1:latt))
652 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
653 IF (master) WRITE (stdout,30) 'positions', &
654 & trim(vinfo(1)), &
655 & trim(ncname)
656 exit_flag=3
657 ioerror=status
658 END IF
659 END IF
660 END IF
661
662
663
664 IF (exit_flag.eq.noerror) THEN
665 latt=len_trim(vinfo(16))
666 IF (latt.gt.0) THEN
667 status=nf90_put_att(ncid, vid, 'time', &
668 & vinfo(16)(1:latt))
669 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
670 IF (master) WRITE (stdout,30) 'time', &
671 & trim(vinfo(1)), &
672 & trim(ncname)
673 exit_flag=3
674 ioerror=status
675 END IF
676 END IF
677 END IF
678
679
680
681 IF (exit_flag.eq.noerror) THEN
682 IF (((abs(int(aval(5))).le.4).and.(nvdim.gt.2)).or. &
683 & ((abs(int(aval(5))).gt.4).and.(nvdim.gt.3))) THEN
684 IF ((ncid.eq.avg(ng)%ncid).or. &
685 & (ncid.eq.dia(ng)%ncid)) THEN
686 text='ocean_time: mean'
687 ELSE
688 text='ocean_time: point'
689 END IF
690 latt=len_trim(text)
691 status=nf90_put_att(ncid, vid, 'cell_methods', &
692 & text(1:latt))
693 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
694 IF (master) WRITE (stdout,30) 'cell_methods', &
695 & text(1:latt), &
696 & trim(ncname)
697 exit_flag=3
698 ioerror=status
699 END IF
700 END IF
701 END IF
702
703
704
705 IF (exit_flag.eq.noerror) THEN
706 latt=len_trim(vinfo(17))
707 IF (latt.gt.0) THEN
708 IF (vtype.eq.nf90_int) THEN
709 status=nf90_put_att(ncid, vid, trim(vinfo(17)), &
710 & int(aval(4)))
711#ifndef NO_4BYTE_REALS
712 ELSE IF (vtype.eq.nf90_float) THEN
713 status=nf90_put_att(ncid, vid, trim(vinfo(17)), &
714 & real(aval(4),r4))
715#endif
716 ELSE
717 status=nf90_put_att(ncid, vid, trim(vinfo(17)), &
718 & aval(4))
719 END IF
720 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
721 IF (master) WRITE (stdout,30) trim(vinfo(17)), &
722 & trim(vinfo(1)), &
723 & trim(ncname)
724 exit_flag=3
725 ioerror=status
726 END IF
727 aval(4)=0.0_r8
728 END IF
729 END IF
730
731
732
733 IF (exit_flag.eq.noerror) THEN
734 latt=len_trim(vinfo(18))
735 IF (latt.gt.0) THEN
736 IF (vtype.eq.nf90_int) THEN
737 status=nf90_put_att(ncid, vid, trim(vinfo(18)), &
738 & int(aval(1)))
739#ifndef NO_4BYTE_REALS
740 ELSE IF (vtype.eq.nf90_float) THEN
741 status=nf90_put_att(ncid, vid, trim(vinfo(18)), &
742 & real(aval(1),r4))
743#endif
744 ELSE
745 status=nf90_put_att(ncid, vid, trim(vinfo(18)), &
746 & aval(1))
747 END IF
748 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
749 IF (master) WRITE (stdout,30) trim(vinfo(18)), &
750 & trim(vinfo(1)), &
751 & trim(ncname)
752 exit_flag=3
753 ioerror=status
754 END IF
755 aval(1)=0.0_r8
756 END IF
757 END IF
758
759
760
761 IF (exit_flag.eq.noerror) THEN
762 latt=len_trim(vinfo(24))
763 IF (latt.gt.0) THEN
764 IF (vtype.eq.nf90_int) THEN
765 status=nf90_put_att(ncid, vid, trim(vinfo(24)), &
766 & int(aval(6)))
767#ifndef NO_4BYTE_REALS
768 ELSE IF (vtype.eq.nf90_float) THEN
769 status=nf90_put_att(ncid, vid, trim(vinfo(24)), &
770 & real(aval(6),r4))
771#endif
772 ELSE
773 status=nf90_put_att(ncid, vid, trim(vinfo(24)), &
774 & aval(6))
775 END IF
776 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
777 IF (master) WRITE (stdout,30) trim(vinfo(24)), &
778 & trim(vinfo(1)), &
779 & trim(ncname)
780 exit_flag=3
781 ioerror=status
782 END IF
783 aval(6)=0.0_r8
784 END IF
785 END IF
786
787
788
789 IF (exit_flag.eq.noerror) THEN
790 latt=len_trim(vinfo(20))
791 IF (latt.gt.0) THEN
792 status=nf90_put_att(ncid, vid, 'water_points', &
793 & vinfo(20)(1:latt))
794 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
795 IF (master) WRITE (stdout,30) 'water_points', &
796 & trim(vinfo(1)), &
797 & trim(ncname)
798 exit_flag=3
799 ioerror=status
800 END IF
801 END IF
802 END IF
803
804
805
806 IF (exit_flag.eq.noerror) THEN
807 latt=len_trim(vinfo(22))
808 IF (latt.gt.0) THEN
809 IF (spherical) THEN
810 IF (int(aval(5)).eq.r2dvar) THEN
811 text='lon_rho lat_rho'
812 location='face'
813 ELSE IF (int(aval(5)).eq.r3dvar) THEN
814 text='lon_rho lat_rho s_rho'
815 location='face'
816 ELSE IF (int(aval(5)).eq.w3dvar) THEN
817 text='lon_rho lat_rho s_w'
818 location='face'
819 ELSE IF (int(aval(5)).eq.b3dvar) THEN
820 text='lon_rho lat_rho'
821 location='face'
822 ELSE IF (int(aval(5)).eq.u2dvar) THEN
823 text='lon_u lat_u'
824 location='edge1'
825 ELSE IF (int(aval(5)).eq.u3dvar) THEN
826 text='lon_u lat_u s_rho'
827 location='edge1'
828 ELSE IF (int(aval(5)).eq.-u3dvar) THEN
829 text='lon_u lat_u s_w'
830 location='edge1'
831 ELSE IF (int(aval(5)).eq.v2dvar) THEN
832 text='lon_v lat_v'
833 location='edge2'
834 ELSE IF (int(aval(5)).eq.v3dvar) THEN
835 text='lon_v lat_v s_rho'
836 location='edge2'
837 ELSE IF (int(aval(5)).eq.-v3dvar) THEN
838 text='lon_v lat_v s_w'
839 location='edge2'
840 ELSE IF (int(aval(5)).eq.p2dvar) THEN
841 text='lon_psi lat_psi'
842 location='node'
843 ELSE IF (int(aval(5)).eq.p3dvar) THEN
844 text='lon_psi lat_psi s_rho'
845 location='node'
846 ELSE IF (int(aval(5)).eq.l3dvar) THEN
847 text='lon_rho lat_rho light'
848 location='face'
849 ELSE IF (int(aval(5)).eq.l4dvar) THEN
850 text='lon_rho lat_rho s_rho light'
851 location='face'
852 END IF
853 ELSE
854 IF (int(aval(5)).eq.r2dvar) THEN
855 text='x_rho y_rho'
856 location='face'
857 ELSE IF (int(aval(5)).eq.r3dvar) THEN
858 text='x_rho y_rho s_rho'
859 location='face'
860 ELSE IF (int(aval(5)).eq.w3dvar) THEN
861 text='x_rho y_rho s_w'
862 location='face'
863 ELSE IF (int(aval(5)).eq.b3dvar) THEN
864 text='x_rho y_rho'
865 location='face'
866 ELSE IF (int(aval(5)).eq.u2dvar) THEN
867 text='x_u y_u'
868 location='edge1'
869 ELSE IF (int(aval(5)).eq.u3dvar) THEN
870 text='x_u y_u s_rho'
871 location='edge1'
872 ELSE IF (int(aval(5)).eq.-u3dvar) THEN
873 text='x_u y_u s_w'
874 location='edge1'
875 ELSE IF (int(aval(5)).eq.v2dvar) THEN
876 text='x_v y_v'
877 location='edge2'
878 ELSE IF (int(aval(5)).eq.v3dvar) THEN
879 text='x_v y_v s_rho'
880 location='edge2'
881 ELSE IF (int(aval(5)).eq.-v3dvar) THEN
882 text='x_v y_v s_w'
883 location='edge2'
884 ELSE IF (int(aval(5)).eq.p2dvar) THEN
885 text='x_psi y_psi'
886 location='node'
887 ELSE IF (int(aval(5)).eq.p3dvar) THEN
888 text='x_psi y_psi s_rho'
889 location='node'
890 ELSE IF (int(aval(5)).eq.l3dvar) THEN
891 text='x_rho y_rho Nbands'
892 location='face'
893 ELSE IF (int(aval(5)).eq.l4dvar) THEN
894 text='x_rho y_rho s_rho Nbands'
895 location='face'
896 END IF
897 END IF
898
899 status=nf90_put_att(ncid, vid, 'grid', &
900 & 'grid')
901 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
902 IF (master) WRITE (stdout,30) 'grid', &
903 & trim(vinfo(1)), &
904 & trim(ncname)
905 exit_flag=3
906 ioerror=status
907 END IF
908
909 status=nf90_put_att(ncid, vid, 'location', &
910 & trim(location))
911 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
912 IF (master) WRITE (stdout,30) 'location', &
913 & trim(vinfo(1)), &
914 & trim(ncname)
915 exit_flag=3
916 ioerror=status
917 END IF
918
919 latt=len_trim(text)
920 IF (((abs(int(aval(5))).le.4).and.(nvdim.gt.2)).or. &
921 & ((abs(int(aval(5))).gt.4).and.(nvdim.gt.3))) THEN
922 text=text(1:latt)//' ocean_time'
923 latt=len_trim(text)
924 END IF
925 status=nf90_put_att(ncid, vid, trim(vinfo(22)), &
926 & text(1:latt))
927 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
928 IF (master) WRITE (stdout,30) 'coordinates', &
929 & trim(vinfo(1)), &
930 & trim(ncname)
931 exit_flag=3
932 ioerror=status
933 END IF
934 aval(5)=0.0_r8
935 END IF
936 END IF
937
938
939
940 IF (exit_flag.eq.noerror) THEN
941 latt=len_trim(vinfo(23))
942 IF (latt.gt.0) THEN
943 status=nf90_put_att(ncid, vid, 'formula_terms', &
944 & vinfo(23)(1:latt))
945 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
946 IF (master) WRITE (stdout,30) 'formula_terms', &
947 & trim(vinfo(1)), &
948 & trim(ncname)
949 exit_flag=3
950 ioerror=status
951 END IF
952 END IF
953 END IF
954
955
956
957 IF (exit_flag.eq.noerror) THEN
958 latt=len_trim(vinfo(14))
959 IF (latt.gt.0) THEN
960 status=nf90_put_att(ncid, vid, 'field', &
961 & vinfo(14)(1:latt))
962 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
963 IF (master) WRITE (stdout,30) 'field', &
964 & trim(vinfo(1)), &
965 & trim(ncname)
966 exit_flag=3
967 ioerror=status
968 END IF
969 END IF
970 END IF
971
972#if defined MASKING && !defined WRITE_WATER
973
974
975
976
977
978
979 IF (exit_flag.eq.noerror) THEN
980 latt=len_trim(vinfo(22))
981 IF (PRESENT(setfillval)) THEN
982 landfill=setfillval
983 ELSE
984 landfill=(latt.gt.0).and.(nvdim.gt.2)
985 END IF
986 IF (landfill) THEN
987 IF (vtype.eq.nf90_double) THEN
988 status=nf90_put_att(ncid, vid, '_FillValue', &
989 & spval)
990# ifndef NO_4BYTE_REALS
991 ELSE IF (vtype.eq.nf90_float) THEN
992 status=nf90_put_att(ncid, vid, '_FillValue', &
993 & real(spval,r4))
994# endif
995 END IF
996 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
997 IF (master) WRITE (stdout,30) '_FillValue', &
998 & trim(vinfo(1)), &
999 & trim(ncname)
1000 exit_flag=3
1001 ioerror=status
1002 END IF
1003 END IF
1004 END IF
1005#endif
1006#if defined PARALLEL_IO && defined DISTRIBUTE
1007
1008
1009
1010
1011
1012
1013 IF (exit_flag.eq.noerror) THEN
1014 IF (PRESENT(setparaccess)) THEN
1015 ltiled=setparaccess
1016 ELSE
1017 ltiled=.true.
1018 END IF
1019 IF (ltiled) THEN
1021 ELSE
1023 END IF
1024 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
1025 IF (master) WRITE (stdout,40) trim(vinfo(1)), &
1026 & trim(ncname)
1027 exit_flag=3
1028 ioerror=status
1029 END IF
1030 END IF
1031#endif
1032 END IF
1033
1034
1035
1036 DO i=1,SIZE(vinfo)
1037 DO j=1,len(vinfo(1))
1038 vinfo(i)(j:j)=' '
1039 END DO
1040 END DO
1041
1042#if !defined PARALLEL_IO && defined DISTRIBUTE
1043
1044
1045
1047#endif
1048
1049 10 FORMAT (/,' DEF_VAR_NF90 - Grid ',i2.2, &
1050 & ', unable to define variable: ',a,/, &
1051 & 16x,'in NetCDF file: ',a)
1052 20 FORMAT (/,' DEF_VAR_NF90 - error while setting deflate', &
1053 & ' parameters for variable: ',a,/,16x,'in NetCDF file: ',a)
1054 30 FORMAT (/,'DEF_VAR_NF90 - error while defining attribute: ',a, &
1055 & ' for variable: ',a,/,16x,'in NetCDF file: ',a)
1056#if defined PARALLEL_IO && defined DISTRIBUTE
1057 40 FORMAT (/,'DEF_VAR - error while setting parallel access flag', &
1058 & ' for variable: ',a,/,16x,'in NetCDF file: ',a)
1059#endif
1060
1061 RETURN
integer, parameter io_tiled_access
integer, parameter io_nontiled_access
logical function, public founderror(flag, noerr, line, routine)