652
653
655
656
657
658 integer, intent(in) :: ng, tile, model
659
660 character (len=*), intent(in) :: INPncname
661
662
663
664 integer :: LBi, UBi, LBj, UBj
665 integer :: Iinp, Iout, Irec, Nrec
666 integer :: INPncid, INPvid
667 integer :: i, status
668 integer :: ibuffer(2), Vsize(4)
669# ifdef CHECKSUM
670 integer(i8b) :: Fhash
671# endif
672
673 real(r8) :: Fmin, Fmax
674 real(dp) :: scale
675 real(dp) :: inp_time(1)
676
677 character (len=*), parameter :: MyFile = &
678 & __FILE__//", wrt_impulse_pio"
679
680 TYPE (IO_desc_t), pointer :: ioDesc
681 TYPE (File_desc_t) :: pioFile
682 TYPE (My_VarDesc) :: pioVar
683
684
685# include "set_bounds.h"
686
687 sourcefile=myfile
688
689
690
691
692
693
694
696 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
697 nrec=rec_size
698
699
700
702 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
703
704
705
706
707 DO i=1,4
708 vsize(i)=0
709 END DO
710
711# ifdef SP4DVAR
712 IF (master) WRITE (stdout,10) nrec, trim(tlf(ng)%name)
713# else
714 IF (master) WRITE (stdout,10) nrec-1, trim(tlf(ng)%name)
715# endif
716
717
718
719
720
721
722
723
725 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
726 WRITE (stdout,20) trim(inpncname)
727 RETURN
728 END IF
729# ifdef SP4DVAR
730
731 iinp=1
732 scale=1.0_dp
733
734 DO irec=1,nrec
735 iout=irec
736# else
737
738
739
740
741
742
743
744 iinp=1
745 iout=0
746 scale=1.0_dp
747
748 DO irec=nrec-1,1,-1
749 iout=iout+1
750# endif
751
752
753
754 IF (find_string(var_name, n_var, vname(1,idtime), inpvid)) THEN
756 & vname(1,idtime), &
757 & rclock%DateNumber, inp_time, &
758 & piofile = piofile, &
759 & start = (/irec/), &
760 & total = (/1/))
761 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
762
764 & vname(1,idtime), inp_time, &
765 & (/iout/), (/1/), &
766 & piofile = tlf(ng)%pioFile)
767 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
768 ELSE
769 IF (master) WRITE (stdout,30) trim(vname(1,idtime)), &
770 & trim(inpncname)
771 exit_flag=2
772 END IF
773
774
775
776 IF (find_string(var_name, n_var, vname(1,idztlf), inpvid)) THEN
777
779 IF (kind(ocean(ng)%ad_zeta).eq.8) THEN
780 piovar%dkind=pio_double
782 ELSE
783 piovar%dkind=pio_real
785 END IF
786 piovar%gtype=r2dvar
787
788 status=nf_fread2d(ng, model, inpncname, piofile, &
789 & vname(1,idztlf), piovar, irec, &
790 & iodesc, vsize, &
791 & lbi, ubi, lbj, ubj, &
792 & scale, fmin, fmax, &
793# ifdef MASKING
794 & grid(ng) % rmask, &
795# endif
796# ifdef CHECKSUM
797 & ocean(ng) % ad_zeta(:,:,iinp), &
798 & checksum = fhash)
799# else
800 & ocean(ng) % ad_zeta(:,:,iinp))
801# endif
802 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
803 IF (master) THEN
804 WRITE (stdout,40) trim(vname(1,idztlf)), irec, &
805 & trim(inpncname)
806 END IF
807 exit_flag=2
808 ioerror=status
809 RETURN
810 ELSE
811 IF (master) THEN
812 WRITE (stdout,50) trim(vname(1,idztlf)), irec, &
813# ifdef CHECKSUM
814 & fmin, fmax, fhash
815# else
816 & fmin, fmax
817# endif
818 END IF
819 END IF
820
821 IF (tlf(ng)%pioVar(idztlf)%dkind.eq.pio_double) THEN
823 ELSE
825 END IF
826
827 status=nf_fwrite2d(ng, model, tlf(ng)%pioFile, idztlf, &
828 & tlf(ng)%pioVar(idztlf), iout, &
829 & iodesc, &
830 & lbi, ubi, lbj, ubj, scale, &
831# ifdef MASKING
832 & grid(ng) % rmask, &
833# endif
834 & ocean(ng) % ad_zeta(:,:,iinp))
835 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
836 IF (master) THEN
837 WRITE (stdout,60) trim(vname(1,idztlf)), irec, &
838 & trim(tlf(ng)%name)
839 END IF
840 exit_flag=3
841 ioerror=status
842 RETURN
843 END IF
844 ELSE
845 IF (master) WRITE (stdout,30) trim(vname(1,idztlf)), &
846 & trim(inpncname)
847 exit_flag=2
848 RETURN
849 END IF
850
851# ifndef SOLVE3D
852
853
854
855 IF (find_string(var_name, n_var, vname(1,idubtf), inpvid)) THEN
856
858 IF (kind(ocean(ng)%ad_ubar).eq.8) THEN
859 piovar%dkind=pio_double
861 ELSE
862 piovar%dkind=pio_real
864 END IF
865 piovar%gtype=u2dvar
866
867 status=nf_fread2d(ng, model, inpncname, piofile, &
868 & vname(1,idubtf), piovar, irec, &
869 & iodesc, vsize, &
870 & lbi, ubi, lbj, ubj, &
871 & scale, fmin, fmax, &
872# ifdef MASKING
873 & grid(ng) % umask_full, &
874# endif
875# ifdef CHECKSUM
876 & ocean(ng) % ad_ubar(:,:,iinp), &
877 & checksum = fhash)
878# else
879 & ocean(ng) % ad_ubar(:,:,iinp))
880# endif
881 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
882 IF (master) THEN
883 WRITE (stdout,40) trim(vname(1,idubtf)), irec, &
884 & trim(inpncname)
885 END IF
886 exit_flag=2
887 ioerror=status
888 RETURN
889 ELSE
890 IF (master) THEN
891 WRITE (stdout,50) trim(vname(1,idubtf)), irec, &
892# ifdef CHECKSUM
893 & fmin, fmax, fhash
894# else
895 & fmin, fmax
896# endif
897 END IF
898 END IF
899
900 IF (tlf(ng)%pioVar(idubtf)%dkind.eq.pio_double) THEN
902 ELSE
904 END IF
905
906 status=nf_fwrite2d(ng, model, tlf(ng)%pioFile, idubtf, &
907 & tlf(ng)%pioVar(idubtf), iout, &
908 & iodesc, &
909 & lbi, ubi, lbj, ubj, scale, &
910# ifdef MASKING
911 & grid(ng) % umask_full, &
912# endif
913 & ocean(ng) % ad_ubar(:,:,iinp))
914 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
915 IF (master) THEN
916 WRITE (stdout,60) trim(vname(1,idubtf)), irec, &
917 & trim(tlf(ng)%name)
918 END IF
919 exit_flag=3
920 ioerror=status
921 RETURN
922 END IF
923 ELSE
924 IF (master) WRITE (stdout,30) trim(vname(1,idubtf)), &
925 & trim(inpncname)
926 exit_flag=2
927 RETURN
928 END IF
929
930
931
932 IF (find_string(var_name, n_var, vname(1,idvbtf), inpvid)) THEN
933
935 IF (kind(ocean(ng)%ad_vbar).eq.8) THEN
936 piovar%dkind=pio_double
938 ELSE
939 piovar%dkind=pio_real
941 END IF
942 piovar%gtype=v2dvar
943
944 status=nf_fread2d(ng, model, inpncname, piofile, &
945 & vname(1,idvbtf), piovar, irec, &
946 & iodesc, vsize, &
947 & lbi, ubi, lbj, ubj, &
948 & scale, fmin, fmax, &
949# ifdef MASKING
950 & grid(ng) % vmask_full, &
951# endif
952# ifdef CHECKSUM
953 & ocean(ng) % ad_vbar(:,:,iinp), &
954 & checksum = fhash)
955# else
956 & ocean(ng) % ad_vbar(:,:,iinp))
957# endif
958 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
959 IF (master) THEN
960 WRITE (stdout,40) trim(vname(1,idvbtf)), irec, &
961 & trim(inpncname)
962 END IF
963 exit_flag=2
964 ioerror=status
965 RETURN
966 ELSE
967 IF (master) THEN
968 WRITE (stdout,50) trim(vname(1,idvbtf)), irec, &
969# ifdef CHECKSUM
970 & fmin, fmax, fhash
971# else
972 & fmin, fmax
973# endif
974 END IF
975 END IF
976
977 IF (tlf(ng)%pioVar(idvbtf)%dkind.eq.pio_double) THEN
979 ELSE
981 END IF
982
983 status=nf_fwrite2d(ng, model, tlf(ng)%pioFile, idvbtf, &
984 & tlf(ng)%pioVar(idvbtf), iout, &
985 & iodesc, &
986 & lbi, ubi, lbj, ubj, scale, &
987# ifdef MASKING
988 & grid(ng) % vmask_full, &
989# endif
990 & ocean(ng) % ad_vbar(:,:,iinp))
991 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
992 IF (master) THEN
993 WRITE (stdout,60) trim(vname(1,idvbtf)), irec, &
994 & trim(tlf(ng)%name)
995 END IF
996 exit_flag=3
997 ioerror=status
998 RETURN
999 END IF
1000 ELSE
1001 IF (master) WRITE (stdout,30) trim(vname(1,idvbtf)), &
1002 & trim(inpncname)
1003 exit_flag=2
1004 RETURN
1005 END IF
1006# endif
1007# ifdef SOLVE3D
1008
1009
1010
1011 IF (find_string(var_name, n_var, vname(1,idutlf), inpvid)) THEN
1012
1014 IF (kind(ocean(ng)%ad_u).eq.8) THEN
1015 piovar%dkind=pio_double
1017 ELSE
1018 piovar%dkind=pio_real
1020 END IF
1021 piovar%gtype=u3dvar
1022
1023 status=nf_fread3d(ng, model, inpncname, piofile, &
1024 & vname(1,idutlf), piovar, irec, &
1025 & iodesc, vsize, &
1026 & lbi, ubi, lbj, ubj, 1, n(ng), &
1027 & scale, fmin, fmax, &
1028# ifdef MASKING
1029 & grid(ng) % umask_full, &
1030# endif
1031# ifdef CHECKSUM
1032 & ocean(ng) % ad_u(:,:,:,iinp), &
1033 & checksum = fhash)
1034# else
1035 & ocean(ng) % ad_u(:,:,:,iinp))
1036# endif
1037 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
1038 IF (master) THEN
1039 WRITE (stdout,40) trim(vname(1,idutlf)), irec, &
1040 & trim(inpncname)
1041 END IF
1042 exit_flag=2
1043 ioerror=status
1044 RETURN
1045 ELSE
1046 IF (master) THEN
1047 WRITE (stdout,50) trim(vname(1,idutlf)), irec, &
1048# ifdef CHECKSUM
1049 & fmin, fmax, fhash
1050# else
1051 & fmin, fmax
1052# endif
1053 END IF
1054 END IF
1055
1056 IF (tlf(ng)%pioVar(idutlf)%dkind.eq.pio_double) THEN
1058 ELSE
1060 END IF
1061
1062 status=nf_fwrite3d(ng, model, tlf(ng)%pioFile, idutlf, &
1063 & tlf(ng)%pioVar(idutlf), iout, &
1064 & iodesc, &
1065 & lbi, ubi, lbj, ubj, 1, n(ng), scale, &
1066# ifdef MASKING
1067 & grid(ng) % umask_full, &
1068# endif
1069 & ocean(ng) % ad_u(:,:,:,iinp))
1070 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
1071 IF (master) THEN
1072 WRITE (stdout,60) trim(vname(1,idutlf)), irec, &
1073 & trim(tlf(ng)%name)
1074 END IF
1075 exit_flag=3
1076 ioerror=status
1077 RETURN
1078 END IF
1079 ELSE
1080 IF (master) WRITE (stdout,30) trim(vname(1,idutlf)), &
1081 & trim(inpncname)
1082 exit_flag=2
1083 RETURN
1084 END IF
1085
1086
1087
1088 IF (find_string(var_name, n_var, vname(1,idvtlf), inpvid)) THEN
1089
1091 IF (kind(ocean(ng)%ad_v).eq.8) THEN
1092 piovar%dkind=pio_double
1094 ELSE
1095 piovar%dkind=pio_real
1097 END IF
1098 piovar%gtype=v3dvar
1099
1100 status=nf_fread3d(ng, model, inpncname, piofile, &
1101 & vname(1,idvtlf), piovar, irec, &
1102 & iodesc, vsize, &
1103 & lbi, ubi, lbj, ubj, 1, n(ng), &
1104 & scale, fmin, fmax, &
1105# ifdef MASKING
1106 & grid(ng) % vmask_full, &
1107# endif
1108# ifdef CHECKSUM
1109 & ocean(ng) % ad_v(:,:,:,iinp), &
1110 & checksum = fhash)
1111# else
1112 & ocean(ng) % ad_v(:,:,:,iinp))
1113# endif
1114 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
1115 IF (master) THEN
1116 WRITE (stdout,40) trim(vname(1,idvtlf)), irec, &
1117 & trim(inpncname)
1118 END IF
1119 exit_flag=2
1120 ioerror=status
1121 RETURN
1122 ELSE
1123 IF (master) THEN
1124 WRITE (stdout,50) trim(vname(1,idvtlf)), irec, &
1125# ifdef CHECKSUM
1126 & fmin, fmax, fhash
1127# else
1128 & fmin, fmax
1129# endif
1130 END IF
1131 END IF
1132
1133 IF (tlf(ng)%pioVar(idvtlf)%dkind.eq.pio_double) THEN
1135 ELSE
1137 END IF
1138
1139 status=nf_fwrite3d(ng, model, tlf(ng)%pioFile, idvtlf, &
1140 & tlf(ng)%pioVar(idvtlf), iout, &
1141 & iodesc, &
1142 & lbi, ubi, lbj, ubj, 1, n(ng), scale, &
1143# ifdef MASKING
1144 & grid(ng) % vmask_full, &
1145# endif
1146 & ocean(ng) % ad_v(:,:,:,iinp))
1147 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
1148 IF (master) THEN
1149 WRITE (stdout,60) trim(vname(1,idvtlf)), irec, &
1150 & trim(tlf(ng)%name)
1151 END IF
1152 exit_flag=3
1153 ioerror=status
1154 RETURN
1155 END IF
1156 ELSE
1157 IF (master) WRITE (stdout,30) trim(vname(1,idvtlf)), &
1158 & trim(inpncname)
1159 exit_flag=2
1160 RETURN
1161 END IF
1162
1163
1164
1165 DO i=1,nt(ng)
1166 IF (find_string(var_name, n_var, vname(1,idttlf(i)), &
1167 & inpvid)) THEN
1168
1170 IF (kind(ocean(ng)%ad_t).eq.8) THEN
1171 piovar%dkind=pio_double
1173 ELSE
1174 piovar%dkind=pio_real
1176 END IF
1177 piovar%gtype=r3dvar
1178
1179 status=nf_fread3d(ng, model, inpncname, piofile, &
1180 & vname(1,idttlf(i)), piovar, &
1181 & irec, iodesc, vsize, &
1182 & lbi, ubi, lbj, ubj, 1, n(ng), &
1183 & scale, fmin, fmax, &
1184# ifdef MASKING
1185 & grid(ng) % rmask, &
1186# endif
1187# ifdef CHECKSUM
1188 & ocean(ng) % ad_t(:,:,:,iinp,i), &
1189 & checksum = fhash)
1190# else
1191 & ocean(ng) % ad_t(:,:,:,iinp,i))
1192# endif
1193 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
1194 IF (master) THEN
1195 WRITE (stdout,40) trim(vname(1,idttlf(i))), irec, &
1196 & trim(inpncname)
1197 END IF
1198 exit_flag=2
1199 ioerror=status
1200 RETURN
1201 ELSE
1202 IF (master) THEN
1203 WRITE (stdout,50) trim(vname(1,idttlf(i))), irec, &
1204# ifdef CHECKSUM
1205 & fmin, fmax, fhash
1206# else
1207 & fmin, fmax
1208# endif
1209 END IF
1210 END IF
1211
1212 IF (tlf(ng)%pioTrc(i)%dkind.eq.pio_double) THEN
1214 ELSE
1216 END IF
1217
1218 status=nf_fwrite3d(ng, model, tlf(ng)%pioFile, idttlf(i), &
1219 & tlf(ng)%pioTrc(i), iout, &
1220 & iodesc, &
1221 & lbi, ubi, lbj, ubj, 1, n(ng), scale, &
1222# ifdef MASKING
1223 & grid(ng) % rmask, &
1224# endif
1225 & ocean(ng) % ad_t(:,:,:,iinp,i))
1226 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
1227 IF (master) THEN
1228 WRITE (stdout,60) trim(vname(1,idttlf(i))), irec, &
1229 & trim(tlf(ng)%name)
1230 END IF
1231 exit_flag=3
1232 ioerror=status
1233 RETURN
1234 END IF
1235 ELSE
1236 IF (master) WRITE (stdout,30) trim(vname(1,idttlf(i))), &
1237 & trim(inpncname)
1238 exit_flag=2
1239 RETURN
1240 END IF
1241 END DO
1242# endif
1243 END DO
1244
1245
1246
1248 IF (founderror(exit_flag, noerror, __line__, myfile)) THEN
1249 WRITE (stdout,70) trim(inpncname)
1250 RETURN
1251 END IF
1252
1253
1254
1255
1256
1257
1259 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1260
1261 10 FORMAT (2x,'WRT_IMPULSE_PIO - processing convolved adjoint', &
1262 & ' impulses, records: 1 to ',i0,/,21x,'file: ',a)
1263 20 FORMAT (/,' WRT_IMPULSE_PIO - unable to open input NetCDF', &
1264 & ' file: ',a)
1265 30 FORMAT (/,' WRT_IMPULSE_PIO - cannot find state variable: ',a, &
1266 & /,20x,'in input NetCDF file: ',a)
1267 40 FORMAT (/,' WRT_IMPULSE_PIO - error while reading variable: ',a, &
1268 & 2x,'at time record = ',i0, &
1269 & /,20x,'in input NetCDF file: ',a)
1270# ifdef CHECKSUM
1271 50 FORMAT (19x,'- ',a,/,22x,'(Rec = ',i0,' Min = ',1p,e15.8, &
1272 & ' Max = ',1p,e15.8,' CheckSum = ',i0,')')
1273# else
1274 50 FORMAT (19x,'- ',a,/,22x,'(Rec = ',i0,' Min = ',1p,e15.8, &
1275 & ' Max = ',1p,e15.8,')')
1276# endif
1277 60 FORMAT (/,' WRT_IMPULSE_PIO - error while writing variable: ',a, &
1278 & 2x,'at time record = ',i0,/,20x,'into NetCDF file: ',a)
1279 70 FORMAT (/,' WRT_IMPULSE_PIO - unable to close input NetCDF', &
1280 & ' file: ',a)
1281
1282 RETURN
type(io_desc_t), dimension(:), pointer iodesc_dp_r3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_u3dvar
subroutine, public pio_netcdf_sync(ng, model, ncname, piofile)
type(io_desc_t), dimension(:), pointer iodesc_sp_u2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_u3dvar
type(var_desc_t), dimension(:), pointer var_desc
type(io_desc_t), dimension(:), pointer iodesc_sp_r2dvar
subroutine, public pio_netcdf_inq_var(ng, model, ncname, piofile, myvarname, searchvar, piovar, nvardim, nvaratt)
subroutine, public pio_netcdf_close(ng, model, piofile, ncname, lupdate)
subroutine, public pio_netcdf_open(ng, model, ncname, omode, piofile)
type(io_desc_t), dimension(:), pointer iodesc_dp_u2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v3dvar
subroutine, public pio_netcdf_check_dim(ng, model, ncname, piofile)
type(io_desc_t), dimension(:), pointer iodesc_dp_v2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_v3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_r3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_r2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_v2dvar