662
663
664
665
666 logical, intent(in) :: Lmulti
667
668 integer, intent(in) :: ng, model, job, ifield, nfiles
669 integer, intent(in) :: Iout, Irec, Mrec
670
671 TYPE (File_desc_t), intent(inout) :: pioFile
672 TYPE (T_IO), intent(inout) :: S(nfiles)
673
674
675
676 logical :: CloseFile, Liocycle, Lgridded, Lonerec
677 logical :: foundit, got_var, got_time, special
678
679 integer :: Fcount, Nrec, Tindex, Trec, Vtype
680 integer :: i, ifile, lstr, nvatt, nvdim
681 integer :: Vsize(4)
682
683 real(dp) :: Clength, Tend, Tmax, Tmin, Tmono, Tscale, Tstr, Tval
684 real(dp) :: scale
685
686 character (len=1 ), parameter :: blank = ' '
687 character (len=3 ) :: label
688 character (len=256) :: Fname
689
690 character (len=*), parameter :: MyFile = &
691 & __FILE__//", inquiry_pio"
692
693 TYPE (File_desc_t) :: my_pioFile
694 TYPE (Var_desc_t) :: pioVar, TpioVar
695
696 sourcefile=myfile
697
698
699
700
701
702
703
704 piovar%varID=-1
705 tpiovar%varID=-1
706 nrec=0
707 liocycle=.false.
708 lgridded=.false.
709 lonerec=.false.
710 got_var=.false.
711 got_time=.false.
712 label=s(1)%label(1:3)
713 vtype=iinfo(1,ifield,ng)
714
715
716
717 DO i=1,len(ncfile)
718 ncfile(i:i)=blank
719 END DO
720
721
722
723
724 IF (lmulti) THEN
725 DO ifile=1,nfiles
726 IF (trim(cinfo(ifield,ng)).eq.trim(s(ifile)%name)) THEN
727 IF (job.gt.0) THEN
728 fcount=s(ifile)%Fcount+1
729 ELSE
730 fcount=s(ifile)%Fcount-1
731 END IF
732 IF ((1.gt.fcount).and.(fcount.gt.s(ifile)%Nfiles)) THEN
733 IF (master) THEN
734 WRITE (stdout,10) trim(vname(1,ifield)), &
735 & fcount, s(ifile)%Nfiles
736 END IF
737 exit_flag=4
738 IF (founderror(exit_flag, noerror, &
739 & __line__, myfile)) RETURN
740 END IF
741 s(ifile)%Fcount=fcount
742 s(ifile)%name=trim(s(ifile)%files(fcount))
743 CALL pio_netcdf_close (ng, model, piofile)
744 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
745 IF (label(1:3).eq.'FRC') THEN
746 frcdesc(ifile,ng)%fh=-1
747 s(ifile)%pioFile%fh=-1
748 END IF
749 IF (label(1:3).eq.'BRY') THEN
750 brydesc(ifile,ng)%fh=-1
751 s(ifile)%pioFile%fh=-1
752 END IF
753 IF (label(1:3).eq.'CLM') THEN
754 clmdesc(ifile,ng)%fh=-1
755 s(ifile)%pioFile%fh=-1
756 END IF
757 EXIT
758 ELSE
759 fcount=s(ifile)%Fcount
760 END IF
761 END DO
762 ELSE
763 fcount=s(1)%Fcount
764 END IF
765 IF (fcount.eq.0) THEN
766 IF (master) THEN
767 WRITE (stdout,20) fcount, label, trim(vname(1,ifield))
768 END IF
769 exit_flag=4
770 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
771 END IF
772
773
774
775
776 foundit=.false.
777 query: DO ifile=1,nfiles
778 fname=s(ifile)%name
779
780
781
782 IF (s(ifile)%pioFile%fh.eq.-1) THEN
783 CALL pio_netcdf_open (ng, model, fname, 0, my_piofile)
784 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
785 IF (master) WRITE (stdout,60) trim(fname)
786 RETURN
787 END IF
788 closefile=.true.
789 ELSE
790 my_piofile=s(ifile)%pioFile
791 closefile=.false.
792 END IF
793
794
795
796 CALL pio_netcdf_check_dim (ng, model, fname, &
797 & piofile = my_piofile)
798 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
799
800
801
802 CALL pio_netcdf_inq_var (ng, model, fname, &
803 & piofile = my_piofile, &
804 & myvarname = trim(vname(1,ifield)), &
805 & searchvar = foundit, &
806 & piovar = piovar, &
807 & nvardim = nvdim, &
808 & nvaratt = nvatt)
809 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
810
811
812
813 IF (foundit) THEN
814 got_var=.true.
815 ncfile=fname
816 IF ((nvdim.gt.1).and.(abs(job).gt.1)) THEN
817 lgridded=.true.
818 END IF
819 vsize=0
820 DO i=1,nvdim
821 vsize(i)=var_dsize(i)
822 END DO
823 ELSE
824 IF (.not.lmulti) THEN
825 ncfile=fname
826 END IF
827 END IF
828
829
830
831
832
833 IF (foundit) THEN
834 DO i=1,nvatt
835 IF (trim(var_aname(i)).eq.'scale_factor') THEN
836 scale=var_afloat(i)
837 finfo(10,ifield,ng)=scale
838 ELSE IF (trim(var_aname(i)).eq.'water_points') THEN
839 iinfo(1,ifield,ng)=-abs(iinfo(1,ifield,ng))
840 vtype=iinfo(1,ifield,ng)
841 END IF
842 END DO
843 END IF
844
845
846
847
848 IF (foundit.and.(abs(job).eq.2)) THEN
849 special=.false.
850 DO i=1,nvdim
851 IF (index(trim(var_dname(i)),'period').ne.0) THEN
852 special=.true.
853 END IF
854 END DO
855 linfo(4,ifield,ng)=special
856 END IF
857
858
859
860
861 IF (foundit) THEN
862 IF (len_trim(vname(5,ifield)).gt.0) THEN
863 tname(ifield)=trim(vname(5,ifield))
864 DO i=1,nvdim
865 IF (var_dname(i).eq.trim(tname(ifield))) THEN
866 nrec=var_dsize(i)
867 got_time=.true.
868 END IF
869 END DO
870 END IF
871
872
873
874
875
876
877
878 IF (nrec.eq.0) THEN
879 DO i=1,nvatt
880 IF (trim(var_aname(i)).eq.'time') THEN
881 tname(ifield)=trim(var_achar(i))
882 got_time=.true.
883 END IF
884 END DO
885 IF (got_time) THEN
886 lstr=len_trim(tname(ifield))
887 DO i=1,n_dim
888 IF (trim(dim_name(i)).eq.tname(ifield)(1:lstr)) THEN
889 nrec=dim_size(i)
890 ELSE IF (trim(dim_name(i)).eq. &
891 & tname(ifield)(1:lstr-1)) THEN
892 nrec=dim_size(i)
893 tname(ifield)=tname(ifield)(1:lstr-1)
894 END IF
895 END DO
896 END IF
897 END IF
898
899
900
901
902 IF (got_time.and.(nrec.eq.0)) THEN
903 DO i=1,n_vdim
904 IF (index(trim(lowercase(var_dname(i))),'time').ne.0) THEN
905 nrec=var_dsize(i)
906 END IF
907 END DO
908 END IF
909 IF (got_time.and.(nrec.eq.0)) THEN
910 IF (master) WRITE (stdout,30) trim(tname(ifield)), &
911 & trim(vname(1,ifield)), &
912 & trim(fname)
913 exit_flag=4
914 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
915 END IF
916 END IF
917 IF (abs(job).eq.1) THEN
918 IF ((iout.eq.1).and.(nrec.gt.mrec)) THEN
919 IF (master) WRITE (stdout,40) trim(vname(1,ifield)), &
920 & mrec, nrec
921 exit_flag=4
922 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
923 END IF
924 END IF
925
926
927
928 IF (foundit) THEN
929 CALL get_cycle (ng, model, ifield, job, lmulti, &
930 & ncfile, my_piofile, tname(ifield), nrec, &
931 & tdays(ng), tpiovar, liocycle, clength, trec, &
932 & tstr, tend, tmin, tmax, tscale)
933 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
934 sourcefile=myfile
935 END IF
936
937
938
939
940 IF (foundit) THEN
941 piofile=my_piofile
942 dinfo( 1,ifield,ng)%vd=piovar
943 dinfo( 1,ifield,ng)%dkind=pio_type
944 dinfo( 1,ifield,ng)%gtype=vtype
945 dinfo( 2,ifield,ng)%vd=tpiovar
946 dinfo( 1,ifield,ng)%dkind=pio_tout
947 dinfo( 2,ifield,ng)%gtype=0
948 linfo( 1,ifield,ng)=lgridded
949 linfo( 2,ifield,ng)=liocycle
950 iinfo( 4,ifield,ng)=nrec
951 iinfo( 5,ifield,ng)=vsize(1)
952 iinfo( 6,ifield,ng)=vsize(2)
953 iinfo( 7,ifield,ng)=vsize(3)
954 iinfo(10,ifield,ng)=s(ifile)%Nfiles
955 iinfo(11,ifield,ng)=nvdim
956 finfo(1,ifield,ng)=tmin
957 finfo(2,ifield,ng)=tmax
958 finfo(3,ifield,ng)=tstr
959 finfo(4,ifield,ng)=tend
960 finfo(5,ifield,ng)=clength
961 finfo(6,ifield,ng)=tscale
962 s(ifile)%Nrec(fcount)=nrec
963 s(ifile)%time_min(fcount)=tmin
964 s(ifile)%time_max(fcount)=tmax
965 EXIT query
966 END IF
967
968
969
970
971
972 IF (closefile) THEN
973 CALL pio_netcdf_close (ng, model, my_piofile, fname, .false.)
974 END IF
975 END DO query
976
977
978
979 IF (.not.got_var) THEN
980 IF ((nfiles.gt.1).and.(label(1:3).eq.'FRC')) THEN
981 IF (master) THEN
982 WRITE (stdout,50) trim(vname(1,ifield)), 'files:'
983 DO i=1,nfiles
984 WRITE (stdout,'(15x,a)') trim(s(i)%name)
985 END DO
986 END IF
987 ELSE IF ((nfiles.gt.1).and.(label(1:3).eq.'BRY')) THEN
988 IF (master) THEN
989 WRITE (stdout,50) trim(vname(1,ifield)), 'files:'
990 DO i=1,nfiles
991 WRITE (stdout,'(15x,a)') trim(s(i)%name)
992 END DO
993 END IF
994 ELSE IF ((nfiles.gt.1).and.(label(1:3).eq.'CLM')) THEN
995 IF (master) THEN
996 WRITE (stdout,50) trim(vname(1,ifield)), 'files:'
997 DO i=1,nfiles
998 WRITE (stdout,'(15x,a)') trim(s(i)%name)
999 END DO
1000 END IF
1001 ELSE
1002 lstr=len_trim(ncfile)
1003 IF (master) THEN
1004 WRITE (stdout,50) trim(vname(1,ifield)), 'file:'
1005 IF (lstr.gt.0) THEN
1006 WRITE (stdout,'(15x,a)') trim(ncfile)
1007 ELSE
1008 WRITE (stdout,'(15x,a,a)') 'file name is blank, ', &
1009 & 'cannot be determined.'
1010 END IF
1011 END IF
1012 END IF
1013 exit_flag=2
1014 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1015 END IF
1016 IF (.not.got_time) THEN
1017 IF ((nfiles.gt.1).and.(label(1:3).eq.'FRC')) THEN
1018 IF (master) THEN
1019 WRITE (stdout,50) trim(tname(ifield)), 'files:'
1020 DO i=1,nfiles
1021 WRITE (stdout,'(15x,a)') trim(s(i)%name)
1022 END DO
1023 END IF
1024 ELSE IF ((nfiles.gt.1).and.(label(1:3).eq.'BRY')) THEN
1025 IF (master) THEN
1026 WRITE (stdout,50) trim(tname(ifield)), 'files:'
1027 DO i=1,nfiles
1028 WRITE (stdout,'(15x,a)') trim(s(i)%name)
1029 END DO
1030 END IF
1031 ELSE IF ((nfiles.gt.1).and.(label(1:3).eq.'CLM')) THEN
1032 IF (master) THEN
1033 WRITE (stdout,50) trim(tname(ifield)), 'files:'
1034 DO i=1,nfiles
1035 WRITE (stdout,'(15x,a)') trim(s(i)%name)
1036 END DO
1037 END IF
1038 ELSE
1039 lstr=len_trim(ncfile)
1040 IF (master) THEN
1041 WRITE (stdout,50) trim(tname(ifield)), 'file:'
1042 IF (lstr.gt.0) THEN
1043 WRITE (stdout,'(15x,a)') trim(ncfile)
1044 ELSE
1045 WRITE (stdout,'(15x,a,a)') 'file name is blank, ', &
1046 & 'cannot be determined.'
1047 END IF
1048 END IF
1049 END IF
1050 exit_flag=2
1051 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1052 END IF
1053
1054
1055
1056
1057
1058 IF (label(1:3).eq.'FRC') THEN
1059 DO ifile=1,nfiles
1060 IF ((trim(ncfile).eq.trim(s(ifile)%name)).and. &
1061 & (frcdesc(ifile,ng)%fh.ne.-1).and. &
1062 & (piofile%fh.ne.frcdesc(ifile,ng)%fh)) THEN
1063 piofile=frcdesc(ifile,ng)
1064 EXIT
1065 END IF
1066 END DO
1067 END IF
1068 IF (label(1:3).eq.'BRY') THEN
1069 DO ifile=1,nfiles
1070 IF ((trim(ncfile).eq.trim(s(ifile)%name)).and. &
1071 & (brydesc(ifile,ng)%fh.ne.-1).and. &
1072 & (piofile%fh.ne.brydesc(ifile,ng)%fh)) THEN
1073 piofile=brydesc(ifile,ng)
1074 EXIT
1075 END IF
1076 END DO
1077 END IF
1078 IF (label(1:3).eq.'CLM') THEN
1079 DO ifile=1,nfiles
1080 IF ((trim(ncfile).eq.trim(s(ifile)%name)).and. &
1081 & (clmdesc(ifile,ng)%fh.ne.-1).and. &
1082 & (piofile%fh.ne.clmdesc(ifile,ng)%fh)) THEN
1083 piofile=clmdesc(ifile,ng)
1084 EXIT
1085 END IF
1086 END DO
1087 END IF
1088
1089
1090
1091
1092
1093 IF (piofile%fh.eq.-1) THEN
1094 CALL pio_netcdf_open (ng, model, ncfile, 0, piofile)
1095 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
1096 IF (master) WRITE (stdout,60) trim(ncfile)
1097 RETURN
1098 END IF
1099 END IF
1100
1101
1102
1103 IF (label(1:3).eq.'FRC') THEN
1104 DO ifile=1,nfiles
1105 IF (trim(ncfile).eq.trim(s(ifile)%name)) THEN
1106 frcdesc(ifile,ng)=piofile
1107 s(ifile)%pioFile=piofile
1108 EXIT
1109 END IF
1110 END DO
1111 ELSE IF (label(1:3).eq.'BRY') THEN
1112 DO ifile=1,nfiles
1113 IF (trim(ncfile).eq.trim(s(ifile)%name)) THEN
1114 brydesc(ifile,ng)=piofile
1115 s(ifile)%pioFile=piofile
1116 EXIT
1117 END IF
1118 END DO
1119 ELSE IF (label(1:3).eq.'CLM') THEN
1120 DO ifile=1,nfiles
1121 IF (trim(ncfile).eq.trim(s(ifile)%name)) THEN
1122 clmdesc(ifile,ng)=piofile
1123 s(ifile)%pioFile=piofile
1124 EXIT
1125 END IF
1126 END DO
1127 ELSE
1128 s(1)%pioFile=piofile
1129 END IF
1130 cinfo(ifield,ng)=trim(ncfile)
1131
1132
1133
1134
1135
1136
1137
1138
1139 IF (.not.lmulti) THEN
1140 IF (job.lt.0) THEN
1141 IF (irec.eq.1) THEN
1142 tindex=iout
1143 ELSE
1144 tindex=iinfo(8,ifield,ng)
1145 END IF
1146 IF (liocycle) THEN
1147 IF (trec.eq.nrec) THEN
1148 IF (tdays(ng).lt.tmax) THEN
1149 tmono=tend
1150 ELSE
1151 tmono=tend+(tdays(ng)-mod(tdays(ng),clength))
1152 END IF
1153 ELSE
1154 IF (tdays(ng).gt.clength) THEN
1155 tmono=tend+(tdays(ng)-mod(tdays(ng),clength))
1156 ELSE
1157 tmono=tend
1158 END IF
1159 END IF
1160 trec=trec+2
1161 ELSE
1162 tmono=tend
1163 trec=trec+1
1164 CALL pio_netcdf_get_time (ng, model, ncfile, tname(ifield), &
1165 & rclock%DateNumber, tval, &
1166 & piofile = piofile, &
1167 & start = (/trec-1/), &
1168 & total = (/1/))
1169 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
1170 IF (master) WRITE (stdout,70) trim(tname(ifield)), trec
1171 RETURN
1172 END IF
1173 tval=tval*tscale
1174 IF (tval.lt.tend) THEN
1175 trec=trec+1
1176 END IF
1177 END IF
1178 ELSE
1179 IF (irec.eq.1) THEN
1180 tindex=iout
1181 ELSE
1182 tindex=1
1183 END IF
1184 IF (liocycle) THEN
1185 IF (trec.eq.nrec) THEN
1186 IF (tdays(ng).lt.tmax) THEN
1187 tmono=tstr-clength
1188 ELSE
1189 tmono=tdays(ng)+(tstr-clength)
1190 IF (tstr.eq.tmax) THEN
1191 tmono=tmono+(tmin-mod(tdays(ng)+tmin,clength))
1192 ELSE
1193 tmono=tmono+(tstr-mod(tdays(ng)+tstr,clength))
1194 END IF
1195 END IF
1196 ELSE
1197 IF (tdays(ng).gt.clength) THEN
1198 tmono=tdays(ng)-mod(tdays(ng)-tstr,clength)
1199 ELSE
1200 tmono=tstr
1201 END IF
1202 END IF
1203 ELSE
1204 tmono=tstr
1205 END IF
1206 trec=trec-1
1207 END IF
1208 tmono=tmono*day2sec
1209 iinfo(8,ifield,ng)=tindex
1210 iinfo(9,ifield,ng)=trec
1211 finfo(7,ifield,ng)=tmono
1212 ELSE
1213 iinfo(9,ifield,ng)=trec
1214 END IF
1215
1216
1217
1218
1219 IF (nrec.eq.1) lonerec=.true.
1220 linfo(3,ifield,ng)=lonerec
1221 tindex=iinfo(8,ifield,ng)
1222 IF (job.lt.0) THEN
1223 vtime(tindex,ifield,ng)=finfo(4,ifield,ng)
1224 ELSE
1225 vtime(tindex,ifield,ng)=finfo(3,ifield,ng)
1226 END IF
1227
1228 10 FORMAT (/,' INQUIRY_PIO - out of range multi-files counter for', &
1229 & ' variable: ',a,/,16x,'Fcount = ',i0, &
1230 & ', Expected range: 1 - ',i0)
1231 20 FORMAT (/,' INQUIRY_PIO - unable to assign file counter, ', &
1232 & 'Fcount = ',i0,/,16x,'while processing structure: ',a, &
1233 & /,16x,'and variable; ',a)
1234 30 FORMAT (/,' INQUIRY_PIO - unable to find dimension ',a, &
1235 & /,16x,'for variable: ',a,/,16x,'in file: ',a, &
1236 & /,16x,'file is not CF compliant...')
1237 40 FORMAT (/,' INQUIRY_PIO - too small dimension for variable ',a, &
1238 & ': ',i0,2x,i0)
1239 50 FORMAT (/,' INQUIRY_PIO - unable to find requested variable: ', &
1240 & a,/,16x,'in ',a)
1241 60 FORMAT (/,' INQUIRY_PIO - unable to open input NetCDF file: ',a)
1242 70 FORMAT (/,' INQUIRY_PIO - error while reading variable: ',a,2x, &
1243 & ' at TIME index = ',i0)
1244
1245 RETURN