429
430
432
433
434
435 logical, intent(in) :: Lmulti
436 logical, intent(out) :: Lcycle
437
438 integer, intent(in) :: ng, model, ifield, job, ntime
439
440 integer, intent(out) :: Tindex
441
442 real(dp), intent(in) :: smday
443
444 real(dp), intent(out) :: Tmax, Tmin, Tend, Tscale, Tstr, clength
445
446 character (len=*), intent(in) :: ncname
447 character (len=*), intent(in) :: TvarName
448
449 TYPE (File_desc_t), intent(inout) :: pioFile
450 TYPE (Var_desc_t), intent(out) :: TpioVar
451
452
453
454 logical :: TimeLess
455 logical :: Linside, LowerBound, Upperbound
456
457 integer :: i, nvatt, nvdim
458
459 real(dp) :: mday, tstart
460 real(dp) :: Tval(ntime)
461
462 character (len=40) :: tunits
463
464 character (len=*), parameter :: MyFile = &
465 & __FILE__
466
467 sourcefile=myfile
468
469
470
471
472
473
474
475 lcycle=.false.
476 linside=.false.
477 lowerbound=.false.
478 timeless=.false.
479 upperbound=.false.
480 tindex=0
481 clength=0.0_r8
482 tstr=0.0_r8
483 tscale=1.0_r8
484
485
486
487
488 IF ((index(trim(tvarname),'period').gt.0).or. &
489 & (trim(tvarname).eq.'river')) THEN
490 timeless=.true.
491 END IF
492
493
494
495 IF (ntime.ge.1) THEN
497 & piofile = piofile, &
498 & myvarname = trim(tvarname), &
499 & piovar = tpiovar, &
500 & nvardim = nvdim, &
501 & nvaratt = nvatt)
502 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
503
504
505
506
507
508
509 DO i=1,nvatt
510 IF (trim(var_aname(i)).eq.'cycle_length') THEN
511 lcycle=.true.
512 IF (var_afloat(i).gt.0.0_r8) THEN
513 clength=var_afloat(i)
514 ELSE IF (var_aint(i).gt.0) THEN
515 clength=real(var_aint(i),r8)
516 ELSE
517 IF (master) WRITE (stdout,10) trim(var_aname(i)), &
518 & trim(tvarname)
519 exit_flag=2
520 RETURN
521 END IF
522 ELSE IF (trim(var_aname(i)).eq.'units') THEN
523 tunits=trim(var_achar(i))
524 IF (tunits(1:6).eq.'second') THEN
525 tscale=sec2day
526 END IF
527 END IF
528 END DO
529 END IF
530
531
532
534 & rclock%DateNumber, tval, &
535 & piofile = piofile, &
536 & start = (/1/), &
537 & total = (/ntime/), &
538 & min_val = tmin, &
539 & max_val = tmax)
540 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
541
542
543
544
545 DO i=1,ntime
546 tval(i)=tval(i)*tscale
547 END DO
548 tmin=tmin*tscale
549 tmax=tmax*tscale
550 IF (lcycle) THEN
551 mday=mod(smday,clength)
552 ELSE
553 mday=smday
554 END IF
555
556
557
558
559 IF ((tmin.le.mday).and.(mday.le.tmax)) THEN
560 linside=.true.
561 ELSE IF (mday.ge.tmax) THEN
562 lowerbound=.true.
563 ELSE IF (mday.le.tmin) THEN
564 upperbound=.true.
565 END IF
566
567
568
569 IF (timeless) THEN
570 tstr=tmin
571 tend=tmax
572 tindex=ntime
573 RETURN
574 END IF
575
576
577
578
579 IF (lmulti) THEN
580 IF (job.gt.0) THEN
581 DO i=1,ntime
582 IF (tval(i).gt.mday) THEN
583 tindex=i-1
584 tend=tval(i)
585 EXIT
586 END IF
587 END DO
588 ELSE
589 DO i=ntime,1,-1
590 IF (tval(i).le.mday) THEN
591 tindex=i+1
592 tstr=tval(i)
593 EXIT
594 END IF
595 END DO
596 END IF
597
598
599
600
601 ELSE
602 IF (job.gt.0) THEN
603 IF (linside) THEN
604 tstart=tmin
605 IF (ntime.eq.1) THEN
606 tstr=tmin
607 tindex=1
608 ELSE
609 DO i=2,ntime
610 IF ((tstart.le.mday).and.(mday.le.tval(i))) THEN
611 tstr=tstart
612 tindex=i-1
613 EXIT
614 END IF
615 tstart=tval(i)
616 END DO
617 END IF
618 ELSE
619 tstr=tmax
620 tindex=ntime
621 END IF
622 ELSE
623 IF (linside) THEN
624 tstart=tmin
625 IF (ntime.eq.1) THEN
626 tstr=tmin
627 tindex=1
628 ELSE
629 DO i=2,ntime
630 IF ((tstart.le.mday).and.(mday.le.tval(i))) THEN
631 tstr=tval(i)
632 tindex=i
633 EXIT
634 END IF
635 tstart=tval(i)
636 END DO
637 END IF
638 ELSE IF (lowerbound) THEN
639 tstr=tmax
640 tindex=ntime
641 ELSE IF (upperbound) THEN
642 tstr=tmin
643 tindex=1
644 END IF
645 END IF
646 END IF
647
648
649
650
651
652 IF (lmulti) THEN
653 IF (job.gt.0) THEN
654 tstr=finfo(2,ifield,ng)
655 ELSE
656 tend=finfo(1,ifield,ng)
657 END IF
658 ELSE
659 IF (lcycle.and.(tindex.eq.ntime)) THEN
660 tend=tmin
661 ELSE
662 IF (job.gt.0) THEN
663 i=min(ntime,tindex+1)
664 tend=tval(i)
665 ELSE
666 i=max(1,tindex-1)
667 tend=tval(i)
668 END IF
669 END IF
670 END IF
671
672
673
674
675
676 IF (.not.timeless) THEN
677 IF (.not.lcycle.and.(ntime.gt.1)) THEN
678 IF (lmulti) THEN
679 IF (job.gt.0) THEN
680 IF (smday.gt.tmax) THEN
681 IF (master) WRITE (stdout,20) trim(tvarname), &
682 & tmax, smday
683 exit_flag=2
684 RETURN
685 ELSE IF (linfo(6,ifield,ng)) THEN
686 IF (tmin.lt.smday) THEN
687 IF (master) THEN
688 WRITE (stdout,30) &
689 & 'Upper snapshot time for multi-file variable:', &
690 & trim(tvarname), &
691 & trim(vname(1,ifield)), &
692 & 'is less than current model time.', &
693 & 'Tmin = ', tmin, smday
694 END IF
695 exit_flag=2
696 RETURN
697 END IF
698 END IF
699 ELSE
700 IF (linfo(5,ifield,ng)) THEN
701 IF (tmin.gt.smday) THEN
702 IF (master) THEN
703 WRITE (stdout,30) &
704 & 'Lower snapshot time for multi-file variable:', &
705 & trim(tvarname), &
706 & trim(vname(1,ifield)), &
707 & 'is greater than current model time.', &
708 & 'Tmin = ', tmin, smday
709 END IF
710 exit_flag=2
711 RETURN
712 END IF
713 ELSE
714 IF (smday.lt.tmax) THEN
715 IF (master) THEN
716 WRITE (stdout,30) &
717 & 'starting time for multi-file variable:', &
718 & trim(tvarname), &
719 & trim(vname(1,ifield)), &
720 & 'is greater than current model time.', &
721 & 'Tmax = ', tmax, smday
722 END IF
723 exit_flag=2
724 RETURN
725 END IF
726 END IF
727 END IF
728 ELSE
729 IF (.not.upperbound.and.(smday.lt.tmin)) THEN
730 IF (master) WRITE (stdout,40) trim(tvarname), &
731 & trim(vname(1,ifield)), &
732 & tmin, smday
733 exit_flag=2
734 RETURN
735 END IF
736 END IF
737 END IF
738 END IF
739
740 10 FORMAT (/,' GET_CYCLE_PIO - unable to get value for attribute:', &
741 & 1x,a,/,17x,'in variable: ',a, &
742 & /,17x,'This attribute value is expected to be of', &
743 & /,17x,'the same external type as the variable.')
744 20 FORMAT (/,' GET_CYCLE_PIO - ending time for multi-file', &
745 & ' variable: ',a,/,17x,'is less than current model time.', &
746 & /,17x,'TMAX = ',f15.4,2x,'TDAYS = ',f15.4)
747 30 FORMAT (/,' GET_CYCLE_PIO - ',a,1x,a,2x,'(',a,')',/,17x,a, &
748 & /,17x,a,f15.4,2x,'TDAYS = ',f15.4)
749 40 FORMAT (/,' GET_CYCLE_PIO - starting time for variable: ',a,2x, &
750 & '(',a,')',/,17x,'is greater than current model time.', &
751 & /,17x,'TMIN = ',f15.4,2x,'TDAYS = ',f15.4)
752
753 RETURN
subroutine, public pio_netcdf_inq_var(ng, model, ncname, piofile, myvarname, searchvar, piovar, nvardim, nvaratt)