37 use version_control,
only : swb_version, git_commit_hash_string, &
38 git_branch_string, compile_date, compile_time, &
71 integer(c_int),
parameter ::
nc_nat = 0
75 integer(c_int),
parameter ::
nc_int = 4
138 integer (c_int),
public,
parameter ::
nc_time = 0
139 integer (c_int),
public,
parameter ::
nc_y = 1
140 integer (c_int),
public,
parameter ::
nc_x = 2
141 integer (c_int),
public,
parameter ::
nc_z = 3
142 integer (c_int),
public,
parameter ::
nc_aux = 3
143 integer (c_int),
public,
parameter ::
nc_crs = 4
144 integer (c_int),
public,
parameter ::
nc_lat = 5
145 integer (c_int),
public,
parameter ::
nc_lon = 6
150 integer (c_int),
parameter ::
nc_by = 2
152 integer (c_int),
public,
parameter ::
nc_left = 0
154 integer (c_int),
public,
parameter ::
nc_top = 0
158 integer (c_int),
parameter ::
row = 2
165 [
"NC_FORMAT_CLASSIC ", &
166 "NC_FORMAT_64BIT ", &
167 "NC_FORMAT_NETCDF4 ", &
168 "NC_FORMAT_NETCDF4_CLASSIC" ]
180 character (len=64) :: sdimensionname
182 integer (c_size_t) :: inc_dimsize
183 logical (c_bool) :: lunlimited =
false
187 character (len=64) :: sattributename
188 character (len=256),
dimension(:),
allocatable :: sattvalue
189 integer (c_short),
dimension(:),
allocatable :: i2attvalue
190 integer (c_int),
dimension(:),
allocatable :: iattvalue
191 real (c_float),
dimension(:),
allocatable :: rattvalue
192 real (c_double),
dimension(:),
allocatable :: dpattvalue
193 integer (c_int) :: inc_atttype
194 integer (c_size_t) :: inc_attsize
198 character (len=64) :: svariablename
200 integer (c_int) :: inc_vartype
201 integer (c_int) :: inumberofdimensions
202 integer (c_int),
dimension(0:3) :: inc_dimid =
nc_na_int
203 integer (c_int) :: inumberofattributes
208 integer (c_int) :: incid
209 character (len=256) :: sfilename
210 integer (c_int) :: ifileformat
211 integer (c_int) :: inumberofdimensions
212 integer (c_int) :: inumberofvariables
213 integer (c_int) :: inumberofattributes
214 integer (c_int) :: inc3_unlimiteddimensionnumber
218 integer (c_int) :: ioriginmonth
219 integer (c_int) :: ioriginday
220 integer (c_int) :: ioriginyear
221 integer (c_int) :: ioriginhh
222 integer (c_int) :: ioriginmm
223 integer (c_int) :: ioriginss
225 integer (c_size_t),
dimension(0:3) :: istart
226 integer (c_size_t),
dimension(0:3) :: icount
227 integer (c_size_t),
dimension(0:3) :: istride = 1
228 integer (c_size_t),
dimension(0:1) :: icolbounds
229 integer (c_size_t),
dimension(0:1) :: irowbounds
230 integer (c_int) :: inx
231 integer (c_int) :: iny
232 character (len=3) :: svariableorder =
"tyx"
233 real (c_double),
dimension(0:1) :: rx
234 real (c_double),
dimension(0:1) :: ry
235 real (c_double) :: rcoordinatetolerance = 0.0_c_double
236 logical (c_bool) :: lx_increaseswithindex =
true
237 logical (c_bool) :: ly_increaseswithindex =
false
238 logical (c_bool) :: lallowautomaticdataflipping =
true
240 real (c_double),
dimension(0:1) :: dpfirstandlasttimevalues
241 character (len=64),
dimension(0:3) :: svarname = [
"time",
"y ",
"x ",
"z "]
243 integer (c_int),
dimension(0:3) :: ivarindex =
nc_na_int
245 character (len=64),
dimension(0:3) :: svarunits =
"NA"
246 integer (c_int),
dimension(0:3, 0:3) :: ivar_dimid =
nc_na_int
247 real (c_double),
dimension(0:3) :: rscalefactor = 1.0_c_double
248 real (c_double),
dimension(0:3) :: raddoffset = 0.0_c_double
249 integer (c_int),
dimension(0:2) :: irowiter
250 integer (c_int),
dimension(0:2) :: icoliter
251 logical (c_bool) :: lfliphorizontal =
false
252 logical (c_bool) :: lflipvertical =
false
254 real (c_double),
allocatable,
dimension(:) :: rx_coords
255 real (c_double),
allocatable,
dimension(:) :: ry_coords
256 real (c_double) :: rx_coord_addoffset = 0.0_c_double
257 real (c_double) :: ry_coord_addoffset = 0.0_c_double
258 real (c_double),
allocatable,
dimension(:) :: rdatetimevalues
259 real (c_double) :: rgridcellsizex
260 real (c_double) :: rgridcellsizey
320 integer (c_int) :: ijulianday
321 logical (c_bool) :: lwithinrange
323 if ( ijulianday >= ncfile%iFirstDayJD &
324 .and. ijulianday <= ncfile%iLastDayJD )
then
346 real (c_double) :: rjulianday
347 integer (c_int) :: iindex
349 iindex = aint(rjulianday) - ncfile%iFirstDayJD
358 integer (c_int) :: iindex
359 real (c_double) :: rdayvalue
361 call assert(iindex >= lbound(ncfile%rDateTimeValues, 1) &
362 .and. iindex <= ubound(ncfile%rDateTimeValues, 1), &
363 "Dimension out of bounds", __file__, __line__)
364 rdayvalue = ncfile%rDateTimeValues(iindex)
373 real (c_double) :: rdayvalue
374 real (c_double) :: rjulianday
376 rjulianday = real(ncfile%iOriginJD, c_double) &
377 + real(ncfile%iOriginHH, c_double) / 24_c_double &
378 + real(ncfile%iOriginMM, c_double) / 1440_c_double &
379 + real(ncfile%iOriginSS, c_double) / 86400_c_double &
389 real (c_double) :: rjulianday
390 integer (c_size_t) :: istart
393 integer (c_int) :: imindiff, idiff
394 integer (c_int) :: icandidateindex, ilastcandidate
395 integer (c_int) :: iinitialcandidateindex
396 integer (c_int) :: itestindex
397 real (c_double) :: rtestjd
398 integer (c_int) :: iindexlower, iindexupper, iindex
399 logical (c_bool) :: lchanged
407 call assert(icandidateindex >=0,
"Problem finding the index number of the time " &
408 //
"variable in netCDF file "//
dquote(ncfile%sFilename), __file__, __line__)
410 iinitialcandidateindex = icandidateindex
415 iindexlower = max( lbound(ncfile%rDateTimeValues, 1), icandidateindex - 1)
416 iindexupper = min( ubound(ncfile%rDateTimeValues, 1), icandidateindex + 1)
420 do iindex=iindexlower,iindexupper
423 rdayvalue=ncfile%rDateTimeValues(iindex))
425 itestindex = aint(rtestjd) - ncfile%iFirstDayJD
426 idiff = abs(itestindex - iinitialcandidateindex)
428 if (idiff < imindiff )
then
431 icandidateindex = iindex
438 if (.not. lchanged )
exit
442 if (imindiff == 0) istart = icandidateindex
451 integer (c_int) :: ivarindex
452 integer (c_int) :: ivarid
456 pnc_var => ncfile%pNC_VAR(ivarindex)
458 ivarid = pnc_var%iNC_VarID
467 integer (c_int) :: idimindex
468 integer (c_int) :: idimid
472 pnc_dim => ncfile%pNC_DIM(idimindex)
474 idimid = pnc_dim%iNC_DimID
483 integer (c_int) :: ivarid
484 integer (c_int) :: ivarindex
487 integer (c_int) :: iindex
488 logical (c_bool) :: lfound
492 do iindex=0, ncfile%iNumberOfVariables - 1
494 pnc_var => ncfile%pNC_VAR(iindex)
496 if (pnc_var%iNC_VarID == ivarid)
then
503 call assert(lfound,
"INTERNAL PROGRAMMING ERROR - No matching variable " &
504 //
"ID found: was looking for Variable ID: "//trim(
ascharacter(ivarid)), &
516 integer (c_int) :: ivarindex
517 character (len=*) :: sattname
518 character (len=256) :: sattvalue
521 integer (c_int) :: iindex, iindex2
522 logical (c_bool) :: lfound
524 if (ivarindex < 0)
then
526 pnc_att => ncfile%pNC_ATT
530 call assert(ivarindex >= lbound(ncfile%pNC_VAR,1) &
531 .and. ivarindex <= ubound(ncfile%pNC_VAR,1), &
532 "Index out of bounds referencing NCFILE%pNC_VAR" &
533 //
"~Offending index value: "//trim(
ascharacter(ivarindex)), &
536 pnc_att => ncfile%pNC_VAR(ivarindex)%pNC_ATT
542 do iindex=lbound(pnc_att,1), ubound(pnc_att,1)
544 if ( sattname .strequal. pnc_att(iindex)%sAttributeName )
then
551 call assert(lfound,
"INTERNAL PROGRAMMING ERROR - No matching attribute " &
552 //
"name found: was looking for attribute with name: "//
dquote(sattname), &
556 do iindex2=0, ubound(pnc_att(iindex)%sAttValue,1)
557 sattvalue = sattvalue//
" "//trim(pnc_att(iindex)%sAttValue(iindex))
568 integer (c_int) :: idimid
569 integer (c_int) :: idimindex
572 integer (c_int) :: iindex
573 logical (c_bool) :: lfound
577 do iindex=0, ncfile%iNumberOfDimensions - 1
579 pnc_dim => ncfile%pNC_DIM(iindex)
581 if (pnc_dim%iNC_DimID == idimid)
then
588 call assert(lfound,
"INTERNAL PROGRAMMING ERROR - No matching dimension " &
589 //
"ID found: was looking for Dimension ID: "//trim(
ascharacter(idimid)), &
601 integer (c_int) :: idimid
602 integer (c_size_t) :: idimsize
605 integer (c_int) :: iindex
606 logical (c_bool) :: lfound
610 do iindex=0, ncfile%iNumberOfDimensions - 1
612 pnc_dim => ncfile%pNC_DIM(iindex)
614 if (pnc_dim%iNC_DimID == idimid)
then
621 call assert(lfound,
"INTERNAL PROGRAMMING ERROR - No matching dimension " &
622 //
"ID found: was looking for Dimension ID: "//trim(
ascharacter(idimid)), &
625 idimsize = pnc_dim%iNC_DimSize
633 type (T_NETCDF4_FILE ) :: NCFILE
636 integer (c_int) :: iIndex
637 integer (c_int) :: iCount
638 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
640 do iindex=lbound(ncfile%pNC_VAR,1),ubound(ncfile%pNC_VAR,1)
642 pnc_var => ncfile%pNC_VAR(iindex)
644 if ( ( pnc_var%sVariableName .strapprox.
'time') &
645 .or. ( pnc_var%sVariableName .strapprox.
'x') &
646 .or. ( pnc_var%sVariableName .strapprox.
'y') &
647 .or. ( pnc_var%sVariableName .strapprox.
'time_bnds') &
648 .or. ( pnc_var%sVariableName .strapprox.
'lat') &
649 .or. ( pnc_var%sVariableName .strapprox.
'lon') ) cycle
651 ncfile%sVarName(
nc_z) = pnc_var%sVariableName
663 character (len=*),
intent(in) :: sfilename
664 logical (c_bool),
intent(in),
optional :: guess_z_var_name
669 logical (c_bool) :: lfileopen
670 integer (c_int),
dimension(2) :: icolrow_ll, icolrow_ur, icolrow_lr, icolrow_ul
671 integer (c_int) :: icolmin, icolmax, irowmin, irowmax
672 integer (c_int) :: iindex
673 logical (c_bool) :: guess_z_var_name_l
675 if (
present( guess_z_var_name) )
then
676 guess_z_var_name_l = guess_z_var_name
678 guess_z_var_name_l =
false
693 if ( ncfile%iVarID(
nc_time) >= 0 )
then
696 ivarindex=ncfile%iVarIndex(
nc_time) )
712 ncfile%iColBounds(
nc_left) = lbound(ncfile%rX_Coords,1)
713 ncfile%iColBounds(
nc_right) = ubound(ncfile%rX_Coords,1)
715 ncfile%iRowBounds(
nc_top) = lbound(ncfile%rY_Coords,1)
716 ncfile%iRowBounds(
nc_bottom) = ubound(ncfile%rY_Coords,1)
736 lFlipHorizontal, lFlipVertical, &
737 lAllowAutomaticDataFlipping, &
738 rX_Coord_AddOffset, rY_Coord_AddOffset, &
739 sVariableOrder, sVarName_x, &
740 sVarName_y, sVarName_z, sVarName_time, &
741 rCoordinateTolerance, &
745 character (len=*) :: sfilename
746 logical (c_bool),
optional :: lfliphorizontal
747 logical (c_bool),
optional :: lflipvertical
748 logical (c_bool),
optional :: lallowautomaticdataflipping
749 character (len=*),
optional :: svariableorder
750 real (c_double),
optional :: rx_coord_addoffset
751 real (c_double),
optional :: ry_coord_addoffset
752 character (len=*),
optional :: svarname_x
753 character (len=*),
optional :: svarname_y
754 character (len=*),
optional :: svarname_z
755 character (len=*),
optional :: svarname_time
756 real (c_double),
optional :: rcoordinatetolerance
758 integer (c_int),
optional :: ilu
763 logical (c_bool) :: lfileopen
764 integer (c_int),
dimension(2) :: icolrow_ll, icolrow_ur, icolrow_lr, icolrow_ul
765 integer (c_int) :: icolmin, icolmax, irowmin, irowmax
766 integer (c_int) :: iindex
773 if (
present(lfliphorizontal) ) ncfile%lFlipHorizontal = lfliphorizontal
774 if (
present(lflipvertical) ) ncfile%lFlipVertical = lflipvertical
775 if (
present( lallowautomaticdataflipping) ) &
776 ncfile%lAllowAutomaticDataFlipping = lallowautomaticdataflipping
777 if (
present(rx_coord_addoffset)) ncfile%rX_Coord_AddOffset = rx_coord_addoffset
778 if (
present(ry_coord_addoffset)) ncfile%rY_Coord_AddOffset = ry_coord_addoffset
780 if (
present(rcoordinatetolerance)) ncfile%rCoordinateTolerance = rcoordinatetolerance
782 if (
present(svariableorder) ) ncfile%sVariableOrder = svariableorder
784 if(
present(ilu) )
then
785 inquire (unit=ilu, opened=lfileopen)
789 if (
present(svarname_x) )
then
790 ncfile%sVarName(
nc_x) = svarname_x
792 ncfile%sVarName(
nc_x) =
"x"
795 if (
present(svarname_y) )
then
796 ncfile%sVarName(
nc_y) = svarname_y
798 ncfile%sVarName(
nc_y) =
"y"
801 if (
present(svarname_z) )
then
802 ncfile%sVarName(
nc_z) = svarname_z
804 ncfile%sVarName(
nc_z) =
"prcp"
807 if (
present(svarname_time) )
then
808 ncfile%sVarName(
nc_time) = svarname_time
810 ncfile%sVarName(
nc_time) =
"time"
817 if ( ncfile%iVarID(
nc_time) >= 0 )
then
820 ivarindex=ncfile%iVarIndex(
nc_time) )
840 if (
present(tgridbounds) )
then
848 rx=tgridbounds%rXll, &
852 rx=tgridbounds%rXlr, &
856 rx=tgridbounds%rXul, &
860 rx=tgridbounds%rXur, &
864 write(*, fmt=
"(a)")
"subroutine 'netcdf_open_and_prepare_as_input'"
865 write(*, fmt=
"(a,a,i6)")
"Find correspondence between project bounds (in native projection) and row, col of dataset | ", &
866 trim(__file__), __line__
867 write(*, fmt=
"(a)")
" column row X Y"
868 write(*, fmt=
"(a,i6,i6,a,f14.3,f14.3)")
"LL: ", icolrow_ll(
column), icolrow_ll(
row),
" <==> ", tgridbounds%rXll, tgridbounds%rYll
869 write(*, fmt=
"(a,i6,i6,a,f14.3,f14.3)")
"LR: ", icolrow_lr(
column), icolrow_lr(
row),
" <==> ", tgridbounds%rXlr, tgridbounds%rYlr
870 write(*, fmt=
"(a,i6,i6,a,f14.3,f14.3)")
"UL: ", icolrow_ul(
column), icolrow_ul(
row),
" <==> ", tgridbounds%rXul, tgridbounds%rYul
871 write(*, fmt=
"(a,i6,i6,a,f14.3,f14.3)")
"UR: ", icolrow_ur(
column), icolrow_ur(
row),
" <==> ", tgridbounds%rXur, tgridbounds%rYur
876 lbound(ncfile%rX_Coords,1) )
880 ubound(ncfile%rX_Coords,1) )
883 ncfile%iRowBounds(
nc_top) = &
884 max( min( icolrow_ul(
row), icolrow_ur(
row), icolrow_ll(
row), icolrow_lr(
row) ) - 4, &
885 lbound(ncfile%rY_Coords,1) )
888 min( max( icolrow_ul(
row), icolrow_ur(
row), icolrow_ll(
row), icolrow_lr(
row) ) + 4, &
889 ubound(ncfile%rY_Coords,1) )
894 ncfile%iColBounds(
nc_left) = lbound(ncfile%rX_Coords,1)
895 ncfile%iColBounds(
nc_right) = ubound(ncfile%rX_Coords,1)
897 ncfile%iRowBounds(
nc_top) = lbound(ncfile%rY_Coords,1)
898 ncfile%iRowBounds(
nc_bottom) = ubound(ncfile%rY_Coords,1)
920 iOriginMonth, iOriginDay, iOriginYear, iStartYear, iEndYear)
924 integer (c_int) :: ioriginmonth
925 integer (c_int) :: ioriginday
926 integer (c_int) :: ioriginyear
927 integer (c_int) :: istartyear
928 integer (c_int) :: iendyear
933 integer (c_int) :: iindex
934 integer (c_int) :: inumcols, inumrows
935 integer (c_int) :: imincol, imaxcol
936 integer (c_int) :: iminrow, imaxrow
937 real (c_double),
dimension(:),
allocatable :: rx, ry
938 character (len=10) :: sorigintext
939 character (len=256) :: sfilename
941 write(sorigintext, fmt=
"(i4.4,'-',i2.2,'-',i2.2)") ioriginyear, &
942 ioriginmonth, ioriginday
944 imaxrow = maxval(ncfile%iRowBounds)
945 iminrow = minval(ncfile%iRowBounds)
946 imaxcol = maxval(ncfile%iColBounds)
947 imincol = minval(ncfile%iColBounds)
949 inumrows = imaxrow - iminrow + 1
950 inumcols = imaxcol - imincol + 1
952 allocate(rx(inumcols))
953 allocate(ry(inumrows))
954 rx = ncfile%rX_Coords(imincol:imaxcol)
955 ry = ncfile%rY_Coords(iminrow:imaxrow)
957 sfilename = trim(ncfile%sVarName(
nc_z))//
"_"//trim(
ascharacter(istartyear)) &
962 call nf_create(ncfile=ncfile_archive, sfilename=trim(sfilename) )
969 ncfile_archive%sVarUnits(
nc_x) = ncfile%sVarUnits(
nc_x)
970 ncfile_archive%sVarUnits(
nc_y) = ncfile%sVarUnits(
nc_y)
971 ncfile_archive%sVarUnits(
nc_z) = ncfile%sVarUnits(
nc_z)
978 svarname_z = trim(ncfile%sVarName(
nc_z)) )
986 sorigintext=sorigintext)
989 sdatatype=trim(ncfile%sVarName(
nc_z)), &
990 ssourcefile=trim(ncfile%sFilename))
997 ivarid=ncfile_archive%iVarID(
nc_z), &
1005 dpx=ncfile%rX_Coords(imincol:imaxcol), &
1006 dpy=ncfile%rY_Coords(iminrow:imaxrow) )
1017 iNX, iNY, fX, fY, StartDate, EndDate, PROJ4_string, history_list, executable_name, &
1018 dpLat, dpLon, fValidMin, fValidMax, write_time_bounds, filename_prefix, &
1022 character (len=*),
intent(in) :: svariablename
1023 character (len=*),
intent(in) :: svariableunits
1024 integer (c_int),
intent(in) :: iny
1025 real (c_double),
intent(in) :: fx(:)
1026 integer (c_int),
intent(in) :: inx
1027 real (c_double),
intent(in) :: fy(:)
1030 character (len=*),
intent(in) :: proj4_string
1031 type (
fstring_list_t),
intent(in),
pointer,
optional :: history_list
1032 character (len=*),
intent(in),
optional :: executable_name
1033 real (c_double),
intent(in),
optional :: dplat(:,:)
1034 real (c_double),
intent(in),
optional :: dplon(:,:)
1035 real (c_float),
intent(in),
optional :: fvalidmin
1036 real (c_float),
intent(in),
optional :: fvalidmax
1037 logical (c_bool),
intent(in),
optional :: write_time_bounds
1038 character (len=*),
intent(in),
optional :: filename_prefix
1039 character (len=*),
intent(in),
optional :: filename_modifier
1044 integer (c_int) :: iindex
1045 character (len=10) :: sorigintext
1046 character (len=:),
allocatable :: sfilename
1048 logical (c_bool) :: write_time_bounds_l
1049 character (len=:),
allocatable :: executable_name_l
1050 real (c_float) :: valid_minimum
1051 real (c_float) :: valid_maximum
1052 logical (c_bool) :: include_latlon
1054 character (len=:),
allocatable :: date_time_text
1055 character (len=:),
allocatable :: filename_prefix_l
1056 character (len=:),
allocatable :: filename_modifier_l
1058 date_time_text = dt%prettydatetime()
1061 if (
present( fvalidmin ) )
then
1062 valid_minimum = fvalidmin
1064 valid_minimum = -1.0e+3
1067 if (
present( fvalidmax ) )
then
1068 valid_maximum = fvalidmax
1070 valid_maximum = 1.0e+10
1073 if (
present( executable_name ) )
then
1074 executable_name_l = trim( executable_name )
1076 executable_name_l =
"SWB"
1079 if (
present( filename_modifier ) )
then
1080 filename_modifier_l =
"_"//trim( filename_modifier )//
"_"
1082 filename_modifier_l =
"_"
1085 if (
present( filename_prefix ) )
then
1086 if (len_trim(filename_prefix) > 0)
then
1087 filename_prefix_l = trim( filename_prefix )//
"_"
1089 filename_prefix_l =
""
1092 filename_prefix_l =
""
1095 if (
present( history_list) )
then
1096 history_list_l => history_list
1098 allocate( history_list_l )
1099 call history_list_l%append(date_time_text//
": Soil-Water-Balance run started.")
1102 if (
present( write_time_bounds ) )
then
1103 write_time_bounds_l = write_time_bounds
1105 write_time_bounds_l =
false
1108 include_latlon =
logical( present( dpLat ) .and. present( dpLon ), c_bool )
1110 write(sorigintext, fmt=
"(i4.4,'-',i2.2,'-',i2.2)") startdate%iYear, startdate%iMonth, startdate%iDay
1114 if (len_trim(filename_prefix_l) > 0 )
then
1117 //trim(svariablename)//
"_"//filename_modifier_l &
1118 //startdate%prettydate()//
"_to_"//enddate%prettydate()//
"__" &
1124 //trim(svariablename)//
"_"//filename_modifier_l &
1125 //startdate%prettydate()//
"_to_"//enddate%prettydate()//
"__" &
1130 call logs%write(
"Attempting to open netCDF file for writing with filename "//
dquote(sfilename))
1132 call nf_create(ncfile=ncfile, sfilename=trim(sfilename) )
1136 write_time_bounds=write_time_bounds_l )
1141 ncfile%sVarUnits(
nc_z) = svariableunits
1148 llatlon=include_latlon, write_time_bounds=write_time_bounds_l )
1156 proj4_string=proj4_string, llatlon=include_latlon, fvalidmin=valid_minimum, &
1157 fvalidmax=valid_maximum, write_time_bounds=write_time_bounds_l )
1160 sdatatype=trim(ncfile%sVarName(
nc_z)), history_list=history_list_l, &
1161 executable_name=executable_name_l )
1167 ivarid=ncfile%iVarID(
nc_z), &
1182 ncfile%rX_Coords = fx
1183 ncfile%rY_Coords = fy
1185 if (
present( dplat ) .and.
present( dplon ) )
then
1200 type (T_NETCDF4_FILE ) :: NCFILE
1201 character (len=*) :: sVarName_z
1203 ncfile%sVarName(
nc_z) = svarname_z
1211 type (T_NETCDF4_FILE ) :: NCFILE
1219 ncfile%iRowIter(
nc_last) = ncfile%iNY
1220 ncfile%iRowIter(
nc_by) = 1
1229 ncfile%iColIter(
nc_last) = ncfile%iNX
1230 ncfile%iColIter(
nc_by) = 1
1239 type (T_NETCDF4_FILE ) :: NCFILE
1242 integer (c_int) :: iIndex
1248 select case (iindex)
1254 ncfile%iStart(iindex) = minval(ncfile%iColBounds) - 1
1255 ncfile%iNX = maxval(ncfile%iColBounds) - minval(ncfile%iColBounds) + 1
1256 ncfile%iCount(iindex) = ncfile%iNX
1258 ncfile%iStride(iindex) = 1_c_size_t
1265 ncfile%iStart(iindex) = minval(ncfile%iRowBounds) - 1
1266 ncfile%iNY = maxval(ncfile%iRowBounds) - minval(ncfile%iRowBounds) + 1
1267 ncfile%iCount(iindex) = ncfile%iNY
1273 ncfile%iStride(iindex) = 1_c_size_t
1277 ncfile%iStart(iindex) = 0_c_size_t
1278 ncfile%iCount(iindex) = 1_c_size_t
1279 ncfile%iStride(iindex) = 1_c_size_t
1293 type (T_NETCDF4_FILE ) :: NCFILE
1296 real (c_double) :: rXmin, rXmax
1297 real (c_double) :: rYmin, rYmax
1300 rxmin = minval(ncfile%rX_Coords(ncfile%iColBounds(
nc_left):ncfile%iColBounds(
nc_right)) )
1301 rxmax = maxval(ncfile%rX_Coords(ncfile%iColBounds(
nc_left):ncfile%iColBounds(
nc_right)) )
1302 rymin = minval(ncfile%rY_Coords(ncfile%iRowBounds(
nc_top):ncfile%iRowBounds(
nc_bottom)) )
1303 rymax = maxval(ncfile%rY_Coords(ncfile%iRowBounds(
nc_top):ncfile%iRowBounds(
nc_bottom)) )
1305 ncfile%rX(
nc_left) = rxmin - ncfile%rGridCellSizeX * 0.5_c_double
1306 ncfile%rX(
nc_right) = rxmax + ncfile%rGridCellSizeX * 0.5_c_double
1307 ncfile%rY(
nc_top) = rymax + ncfile%rGridCellSizeY * 0.5_c_double
1308 ncfile%rY(
nc_bottom) = rymin - ncfile%rGridCellSizeY * 0.5_c_double
1312 print *, repeat(
"-", 80)
1313 print *,
"Filename: ", ncfile%sFilename
1314 print *,
"Grid cell size (X): ", ncfile%rGridCellSizeX
1315 print *,
"Grid cell size (Y): ", ncfile%rGridCellSizeY
1317 print *,
"Bounds of data subset area, in native coordinates"
1318 print *,
"X (left): ", ncfile%rX(
nc_left)
1319 print *,
"X (right): ", ncfile%rX(
nc_right)
1320 print *,
"Y (top): ", ncfile%rY(
nc_top)
1321 print *,
"Y (bottom): ", ncfile%rY(
nc_bottom)
1331 type (T_NETCDF4_FILE ) :: NCFILE
1333 integer (c_int) :: iVarIndex_time
1334 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR_time
1335 type (T_NETCDF_DIMENSION),
pointer :: pNC_DIM_time
1336 integer (c_int) :: iLowerBound, iUpperBound
1337 integer (c_int) :: iStat
1341 ivarindex_time = ncfile%iVarIndex(
nc_time)
1343 call assert(ivarindex_time >= lbound(ncfile%pNC_VAR,1) &
1344 .and. ivarindex_time <= ubound(ncfile%pNC_VAR,1), &
1345 "INTERNAL PROGRAMMING ERROR - Index out of bounds", __file__, __line__)
1347 pnc_var_time => ncfile%pNC_VAR(ivarindex_time)
1348 pnc_dim_time => ncfile%pNC_DIM( pnc_var_time%iNC_DimID(0) )
1350 if (
allocated(ncfile%rDateTimeValues) )
deallocate(ncfile%rDateTimeValues, stat=istat)
1351 call assert(istat==0,
"Failed to deallocate memory for time values", &
1354 allocate( ncfile%rDateTimeValues(0 : pnc_dim_time%iNC_DimSize-1 ), stat=istat )
1355 call assert(istat==0,
"Failed to allocate memory for time values", &
1361 inc_varid=pnc_var_time%iNC_VarID, &
1362 inc_start=0_c_size_t, &
1363 inc_count=pnc_dim_time%iNC_DimSize, &
1364 inc_stride=1_c_size_t, &
1365 dpnc_vars=ncfile%rDateTimeValues)
1373 type (T_NETCDF4_FILE ) :: NCFILE
1375 integer (c_int) :: iVarIndex_x, iVarIndex_y
1376 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR_x, pNC_VAR_y
1377 type (T_NETCDF_DIMENSION),
pointer :: pNC_DIM_x, pNC_DIM_y
1378 integer (c_int) :: iLowerBound, iUpperBound
1379 integer (c_int) :: iStat
1381 ivarindex_x = ncfile%iVarIndex(
nc_x)
1382 ivarindex_y = ncfile%iVarIndex(
nc_y)
1384 call assert(ivarindex_x >= lbound(ncfile%pNC_VAR,1) &
1385 .and. ivarindex_x <= ubound(ncfile%pNC_VAR,1), &
1386 "INTERNAL PROGRAMMING ERROR - Index out of bounds", __file__, __line__)
1388 call assert(ivarindex_y >= lbound(ncfile%pNC_VAR,1) &
1389 .and. ivarindex_y <= ubound(ncfile%pNC_VAR,1), &
1390 "INTERNAL PROGRAMMING ERROR - Index out of bounds", __file__, __line__)
1392 pnc_var_x => ncfile%pNC_VAR(ivarindex_x)
1393 pnc_var_y => ncfile%pNC_VAR(ivarindex_y)
1395 call assert( pnc_var_x%iNumberOfDimensions == 1, &
1396 "Dimensions other than one for the x-coordinate variable are currently unsupported.", &
1399 call assert( pnc_var_y%iNumberOfDimensions == 1, &
1400 "Dimensions other than one for the y-coordinate variable are currently unsupported.", &
1403 pnc_dim_x => ncfile%pNC_DIM( pnc_var_x%iNC_DimID(0) )
1404 pnc_dim_y => ncfile%pNC_DIM( pnc_var_y%iNC_DimID(0) )
1406 allocate( ncfile%rX_Coords( pnc_dim_x%iNC_DimSize ), stat=istat )
1407 call assert(istat==0,
"Failed to allocate memory for X-coordinate values", &
1410 allocate (ncfile%rY_Coords( pnc_dim_y%iNC_DimSize ), stat=istat )
1411 call assert(istat==0,
"Failed to allocate memory for Y-coordinate values", &
1415 inc_varid=pnc_var_x%iNC_VarID, &
1416 inc_start=0_c_size_t, &
1417 inc_count=pnc_dim_x%iNC_DimSize, &
1418 inc_stride=1_c_size_t, &
1419 dpnc_vars=ncfile%rX_Coords)
1422 inc_varid=pnc_var_y%iNC_VarID, &
1423 inc_start=0_c_size_t, &
1424 inc_count=pnc_dim_y%iNC_DimSize, &
1425 inc_stride=1_c_size_t, &
1426 dpnc_vars=ncfile%rY_Coords)
1428 ncfile%rX_Coords = ncfile%rX_Coords + ncfile%rX_Coord_AddOffset
1429 ncfile%rY_Coords = ncfile%rY_Coords + ncfile%rY_Coord_AddOffset
1431 ilowerbound = lbound(ncfile%rX_Coords, 1)
1432 iupperbound = ubound(ncfile%rX_Coords, 1)
1434 if (ncfile%rX_Coords(iupperbound) > ncfile%rX_Coords(ilowerbound) )
then
1435 ncfile%lX_IncreasesWithIndex =
true
1436 if ( ncfile%lAllowAutomaticDataFlipping ) ncfile%lFlipHorizontal =
false
1438 ncfile%lX_IncreasesWithIndex =
false
1439 if ( ncfile%lAllowAutomaticDataFlipping )
then
1440 ncfile%lFlipHorizontal =
true
1441 call logs%write(
"** Horizontal coordinates decrease with index values **", &
1444 call logs%write(
" ==> flipping grid horizontally", &
1450 ilowerbound = lbound(ncfile%rY_Coords, 1)
1451 iupperbound = ubound(ncfile%rY_Coords, 1)
1453 if (ncfile%rY_Coords(iupperbound) > ncfile%rY_Coords(ilowerbound) )
then
1454 ncfile%lY_IncreasesWithIndex =
true
1455 if ( ncfile%lAllowAutomaticDataFlipping )
then
1456 ncfile%lFlipVertical =
true
1457 call logs%write(
"** Vertical coordinates increase with index values **", &
1460 call logs%write(
" ==> flipping grid vertically", &
1465 ncfile%lY_IncreasesWithIndex =
false
1466 if ( ncfile%lAllowAutomaticDataFlipping ) ncfile%lFlipVertical =
false
1469 call assert(pnc_dim_x%iNC_DimSize > 2,
"INTERNAL PROGRAMMING ERROR - " &
1470 //
"netCDF X dimension size must be greater than 2.", __file__, __line__)
1472 call assert(pnc_dim_y%iNC_DimSize > 2,
"INTERNAL PROGRAMMING ERROR - " &
1473 //
"netCDF Y dimension size must be greater than 2.", __file__, __line__)
1475 ncfile%rGridCellSizeX = ( maxval(ncfile%rX_Coords) &
1476 - minval(ncfile%rX_Coords) ) &
1477 / real(pnc_dim_x%iNC_DimSize - 1, c_double)
1479 ncfile%rGridCellSizeY = ( maxval(ncfile%rY_Coords) &
1480 - minval(ncfile%rY_Coords) ) &
1481 / real(pnc_dim_y%iNC_DimSize - 1, c_double)
1496 type (T_NETCDF4_FILE ) :: NCFILE
1497 character (len=*) :: sFilename
1498 integer (c_int),
optional :: iLU
1501 logical (c_bool) :: lFileOpen
1503 call logs%write(
"Attempting to open READONLY netCDF file: " &
1512 call logs%write(
" Succeeded. ncid: "//trim(
ascharacter(ncfile%iNCID)) &
1515 ncfile%sFilename = sfilename
1517 if(
present(ilu) )
then
1518 inquire (unit=ilu, opened=lfileopen)
1529 character (len=*) :: sfilename
1530 integer (c_int),
optional :: ilu
1532 if (
present(ilu) )
then
1535 sfilename=sfilename, &
1541 sfilename=sfilename)
1561 if ( ncfile%iVarID(
nc_time) >= 0 )
then
1564 ivarindex=ncfile%iVarIndex(
nc_time) )
1583subroutine nf_trap( iResultCode, sFilename, iLineNumber, netcdf_filename )
1585 integer (c_int) :: iResultCode
1586 character (len=*),
optional :: sFilename
1587 integer (c_int),
optional :: iLineNumber
1588 character (len=*),
optional :: netcdf_filename
1591 type(c_ptr) :: cpResult
1592 character (len=256) :: sTextString
1593 character (len=256) :: sFile
1594 integer (c_int) :: iLine
1596 if (iresultcode /= 0)
then
1598 if (
present(sfilename))
then
1599 sfile = trim(sfilename)
1604 if (
present(ilinenumber))
then
1613 if (
present( netcdf_filename ) ) &
1614 call logs%write(
"netCDF filename: "//
dquote( netcdf_filename ) )
1616 call logs%write(
"netCDF ERROR: "//
dquote( stextstring )//
" | error code was: " &
1619 call assert(
false,
"SWB is stopping due to a problem reading or writing" &
1620 //
" a netCDF file", trim(sfile), iline)
1632 call logs%write(
"Closing netCDF file with name: "//
dquote(ncfile%sFilename))
1647 integer (c_int) :: iindex
1649 do iindex=0, ncfile%iNumberOfVariables - 1
1651 pnc_var => ncfile%pNC_VAR(iindex)
1653 if (pnc_var%iNumberOfAttributes == 0 ) cycle
1655 if (
associated( pnc_var%pNC_ATT ))
deallocate( pnc_var%pNC_ATT )
1656 pnc_var%pNC_ATT => null()
1660 if (
associated( ncfile%pNC_VAR ))
deallocate( ncfile%pNC_VAR )
1661 if (
associated( ncfile%pNC_ATT ))
deallocate( ncfile%pNC_ATT )
1662 if (
associated( ncfile%pNC_DIM ))
deallocate( ncfile%pNC_DIM )
1664 ncfile%pNC_VAR => null()
1665 ncfile%pNC_ATT => null()
1666 ncfile%pNC_DIM => null()
1678 ncfile%pNC_VAR => null()
1679 ncfile%pNC_ATT => null()
1680 ncfile%pNC_DIM => null()
1688 type (T_NETCDF4_FILE) :: NCFILE
1689 integer (c_int) :: iStat
1690 integer (c_int) :: iIndex
1691 character (len=256) :: sDimName
1694 __file__, __line__ )
1697 if (
associated(ncfile%pNC_DIM) )
deallocate(ncfile%pNC_DIM, stat=istat)
1698 call assert(istat == 0,
"Could not deallocate memory for NC_DIM member in NC_FILE defined type", &
1701 allocate(ncfile%pNC_DIM( 0 : ncfile%iNumberOfDimensions-1), stat=istat )
1702 call assert(istat == 0,
"Could not allocate memory for NC_DIM member in NC_FILE defined type", &
1707 __file__, __line__ )
1709 do iindex = 0, ncfile%iNumberOfDimensions-1
1713 lenp=ncfile%pNC_DIM(iindex)%iNC_DimSize), __file__, __line__ )
1715 ncfile%pNC_DIM(iindex)%iNC_DimID = iindex
1726 type (T_NETCDF4_FILE) :: NCFILE
1728 type (T_NETCDF_ATTRIBUTE),
pointer :: pNC_ATT
1729 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
1730 integer (c_int) :: iStat
1731 integer (c_int) :: iIndex, iIndex2 , iIndex3
1732 character (len=256) :: sVarName
1733 character (len=256) :: sAttName
1734 character (len=512) :: sAttValue
1735 integer (c_int),
dimension(0:25) :: iAttValue
1736 integer (c_short),
dimension(0:25) :: i2AttValue
1737 real (c_double),
dimension(0:25) :: cdAttValue
1740 __file__, __line__ )
1743 if (
associated(ncfile%pNC_VAR) )
deallocate(ncfile%pNC_VAR, stat=istat)
1744 call assert(istat == 0,
"Could not deallocate memory for NC_VAR member in NC_FILE defined type", &
1747 allocate(ncfile%pNC_VAR( 0 : ncfile%iNumberOfVariables-1), stat=istat )
1748 call assert(istat == 0,
"Could not allocate memory for NC_VAR member in NC_FILE defined type", &
1751 do iindex = 0, ncfile%iNumberOfVariables-1
1753 pnc_var => ncfile%pNC_VAR(iindex)
1758 xtypep=pnc_var%iNC_VarType, &
1759 ndimsp=pnc_var%iNumberOfDimensions, &
1760 dimidsp=pnc_var%iNC_DimID, &
1761 nattsp=pnc_var%iNumberOfAttributes ), __file__, __line__ )
1763 pnc_var%iNC_VarID = iindex
1766 if( pnc_var%iNumberOfAttributes > 0 )
then
1768 if (
associated(pnc_var%pNC_ATT) )
deallocate(pnc_var%pNC_ATT, stat=istat)
1769 call assert(istat == 0,
"Could not deallocate memory for NC_ATT member within NC_VAR in NC_FILE defined type", &
1772 allocate( pnc_var%pNC_ATT( 0:pnc_var%iNumberOfAttributes - 1 ), stat = istat)
1773 call assert(istat == 0,
"Could not allocate memory for NC_ATT member within NC_VAR in NC_FILE defined type", &
1776 do iindex2=0, pnc_var%iNumberOfAttributes - 1
1778 pnc_att => pnc_var%pNC_ATT(iindex2)
1781 inc_varid=iindex, iattnum=iindex2 )
1790 __file__, __line__ )
1793 if (
associated(ncfile%pNC_ATT) )
deallocate(ncfile%pNC_ATT, stat=istat)
1794 call assert(istat == 0,
"Could not deallocate memory for NC_ATT member within NC_FILE defined type", &
1797 allocate(ncfile%pNC_ATT(0:ncfile%iNumberOfAttributes - 1), stat=istat )
1798 call assert(istat == 0,
"Could not allocate memory for NC_ATT member within NC_FILE defined type", &
1801 do iindex=0, ncfile%iNumberOfAttributes - 1
1802 pnc_att => ncfile%pNC_ATT(iindex)
1815 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
1816 type (T_NETCDF_ATTRIBUTE),
pointer :: pNC_ATT
1817 integer (c_int) :: iNC_VarID
1818 integer (c_int) :: iAttNum
1821 integer (c_int) :: iStat
1822 character (len=256) :: sVarName
1823 character (len=256) :: sAttName
1824 integer (c_int) :: iIndex
1825 integer (c_int) :: iLength
1830 name=sattname), __file__, __line__ )
1837 xtypep=pnc_att%iNC_AttType, &
1838 lenp=pnc_att%iNC_AttSize), __file__, __line__ )
1840 ilength = pnc_att%iNC_AttSize
1843 allocate(pnc_att%sAttValue(0:ilength-1), stat=istat )
1844 call assert(istat==0,
"INTERNAL PROGRAMMING ERROR - problem allocating memory", &
1846 pnc_att%sAttValue =
""
1848 select case(pnc_att%iNC_AttType)
1855 ip=pnc_att%sAttValue), __file__, __line__ )
1861 allocate(pnc_att%i2AttValue(0:ilength-1), stat=istat )
1862 call assert(istat==0,
"INTERNAL PROGRAMMING ERROR - problem allocating memory", &
1869 ip=pnc_att%i2AttValue), __file__, __line__ )
1871 do iindex=1,ubound(pnc_att%i2AttValue,1)
1872 pnc_att%sAttValue(iindex) =
ascharacter(pnc_att%i2AttValue(iindex))
1877 allocate(pnc_att%iAttValue(0:ilength-1), stat=istat )
1878 call assert(istat==0,
"INTERNAL PROGRAMMING ERROR - problem allocating memory", &
1884 ip=pnc_att%iAttValue), __file__, __line__ )
1886 do iindex=1,ubound(pnc_att%iAttValue,1)
1887 pnc_att%sAttValue(iindex) =
ascharacter(pnc_att%iAttValue(iindex))
1892 allocate(pnc_att%rAttValue(0:ilength-1), stat=istat )
1893 call assert(istat==0,
"INTERNAL PROGRAMMING ERROR - problem allocating memory", &
1900 ip=pnc_att%rAttValue), __file__, __line__ )
1902 do iindex=1,ubound(pnc_att%rAttValue,1)
1903 pnc_att%sAttValue(iindex) =
ascharacter(pnc_att%rAttValue(iindex))
1908 allocate(pnc_att%dpAttValue(0:ilength-1), stat=istat )
1909 call assert(istat==0,
"INTERNAL PROGRAMMING ERROR - problem allocating memory", &
1915 ip=pnc_att%dpAttValue), __file__, __line__ )
1917 do iindex=1,ubound(pnc_att%dpAttValue,1)
1918 pnc_att%sAttValue(iindex) =
ascharacter(pnc_att%dpAttValue(iindex))
1934 character (len=*),
intent(in) :: variable_name
1935 integer (c_int),
intent(out) :: variable_id
1938 integer (c_int) :: indx
1940 logical (c_bool) :: variable_was_found
1941 character (len=256) :: tempstring
1943 variable_was_found =
false
1945 do indx=0, ncfile%iNumberOfVariables-1
1946 pnc_var => ncfile%pNC_VAR( indx )
1947 if (
associated( pnc_var ) )
then
1948 if ( pnc_var%sVariableName .strequal. variable_name )
then
1949 variable_was_found =
true
1955 if ( variable_was_found )
then
1957 variable_id = pnc_var%iNC_VarID
1970 attribute_name_list, &
1971 attribute_value_list )
1974 character (len=*),
intent(in) :: variable_name
1979 integer (c_int) :: indx
1982 logical (c_bool) :: variable_was_found
1983 character (len=256) :: tempstring
1985 variable_was_found =
false
1987 call attribute_name_list%clear
1988 call attribute_value_list%clear
1990 do indx=0, ncfile%iNumberOfVariables-1
1991 pnc_var => ncfile%pNC_VAR( indx )
1992 if (
associated( pnc_var ) )
then
1993 if ( pnc_var%sVariableName .strequal. variable_name )
then
1994 variable_was_found =
true
2000 if ( variable_was_found )
then
2002 do indx=0, pnc_var%iNumberOfAttributes-1
2003 pnc_att => pnc_var%pNC_ATT( indx )
2004 if (
associated( pnc_att) )
then
2006 tempstring = pnc_att%sAttributeName
2007 call attribute_name_list%append( trim( tempstring ) )
2009 select case ( pnc_att%iNC_AttType )
2013 tempstring = pnc_att%sAttValue(0)
2014 call attribute_value_list%append( trim( tempstring ) )
2019 call attribute_value_list%append( trim( tempstring ) )
2024 call attribute_value_list%append( trim( tempstring ) )
2029 call attribute_value_list%append( trim( tempstring ) )
2034 call attribute_value_list%append( trim( tempstring ) )
2044 call attribute_name_list%append(
"<NA>")
2045 call attribute_value_list%append(
"<NA>")
2056 real (c_double),
intent(in) :: tolerance
2058 ncfile%rCoordinateTolerance = tolerance
2070 integer (c_int) :: indx
2074 call variable_list%clear
2076 do indx=0, ncfile%iNumberOfVariables-1
2077 pnc_var => ncfile%pNC_VAR( indx )
2078 if (
associated( pnc_var ) )
call variable_list%append( pnc_var%sVariableName )
2088 integer (c_int) :: ijulianday
2089 logical (c_bool) :: ldatetimefound
2092 real (c_double) :: rnc_datetime
2095 rjulianday=real(ijulianday, c_double ) )
2097 if (ncfile%iStart(
nc_time) < 0)
then
2099 ldatetimefound =
false
2101 ldatetimefound =
true
2111 real (c_float),
dimension(:,:),
optional :: rvalues
2112 real (c_double),
dimension(:,:),
optional :: dpvalues
2113 integer (c_int),
dimension(:,:),
optional :: ivalues
2115 real (c_float),
allocatable :: rtempvals(:,:)
2116 integer (c_short),
allocatable :: i2tempvals(:,:)
2117 integer (c_int),
allocatable :: itempvals(:,:)
2118 real (c_double),
allocatable :: dptempvals(:,:)
2119 integer (c_int) :: nrow, ncol
2121 if (
present( rvalues) )
then
2122 nrow =
size(rvalues,2)
2123 ncol =
size(rvalues,1)
2124 elseif (
present( dpvalues) )
then
2125 nrow =
size(dpvalues,2)
2126 ncol =
size(dpvalues,1)
2127 elseif (
present( ivalues) )
then
2128 nrow =
size(ivalues,2)
2129 ncol =
size(ivalues,1)
2131 call die(
"Internal programming error: unhandled data type", &
2138 allocate( i2tempvals(ncol, nrow))
2142 if (
present(rvalues)) rvalues =
asfloat(i2tempvals)
2143 if (
present(ivalues)) ivalues = i2tempvals
2144 if (
present(dpvalues)) dpvalues =
asdouble(i2tempvals)
2149 allocate( itempvals(ncol, nrow))
2152 if (
present(rvalues)) rvalues =
asfloat(itempvals)
2153 if (
present(ivalues)) ivalues = itempvals
2154 if (
present(dpvalues)) dpvalues =
asdouble(itempvals)
2158 allocate( rtempvals(ncol, nrow))
2161 if (
present(rvalues)) rvalues = rtempvals
2162 if (
present(ivalues)) ivalues =
asint(rtempvals)
2163 if (
present(dpvalues)) dpvalues =
asdouble(rtempvals)
2167 allocate( dptempvals(ncol, nrow))
2170 if (
present(rvalues)) rvalues =
asfloat(dptempvals)
2171 if (
present(ivalues)) ivalues =
asint(dptempvals)
2172 if (
present(dpvalues)) dpvalues = dptempvals
2176 call warn(
"Failed to find a method to retrieve data of the given type.", __file__, __line__)
2178 print *,
'var type: ',ncfile%iVarType(
nc_z)
2188 type (T_NETCDF4_FILE) :: NCFILE
2189 integer (c_short),
intent(inout) :: i2Values(:,:)
2193 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
2195 integer (c_short),
dimension(size(i2Values,2) * size(i2Values,1)) :: iTemp
2197 integer (c_int) :: iStat
2198 integer (c_int) :: iRow, iCol, iIndex
2199 integer (c_int) :: iFromRow, iToRow, iByRow
2200 integer (c_int) :: iFromCol, iToCol, iByCol
2202 ifromrow = ncfile%iRowIter(
nc_first)
2203 itorow = ncfile%iRowIter(
nc_last)
2204 ibyrow = ncfile%iRowIter(
nc_by)
2206 ifromcol = ncfile%iColIter(
nc_first)
2207 itocol = ncfile%iColIter(
nc_last)
2208 ibycol = ncfile%iColIter(
nc_by)
2212 select case (ncfile%sVariableOrder)
2217 inc_varid=ncfile%iVarID(
nc_z), &
2218 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_x), ncfile%iStart(
nc_y)], &
2219 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_x), ncfile%iCount(
nc_y)], &
2220 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_x), ncfile%iStride(
nc_y)], &
2224 do icol=ifromcol, itocol, ibycol
2225 do irow=ifromrow, itorow, ibyrow
2227 i2values(icol,irow) = itemp(iindex)
2234 inc_varid=ncfile%iVarID(
nc_z), &
2235 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_y), ncfile%iStart(
nc_x)], &
2236 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_y), ncfile%iCount(
nc_x)], &
2237 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_y), ncfile%iStride(
nc_x)], &
2241 do irow=ifromrow, itorow, ibyrow
2242 do icol=ifromcol, itocol, ibycol
2244 i2values(icol,irow) = itemp(iindex)
2250 call warn(
"INTERNAL PROGRAMMING ERROR: Unhandled select case. Program will probably fail.", __file__, __line__)
2260 type (T_NETCDF4_FILE) :: NCFILE
2261 integer (c_int),
dimension(:,:) :: iValues
2265 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
2267 integer (c_int),
dimension(size(iValues,2) * size(iValues,1)) :: iTemp
2269 integer (c_int) :: iStat
2270 integer (c_int) :: iRow, iCol, iIndex
2271 integer (c_int) :: iFromRow, iToRow, iByRow
2272 integer (c_int) :: iFromCol, iToCol, iByCol
2274 ifromrow = ncfile%iRowIter(
nc_first)
2275 itorow = ncfile%iRowIter(
nc_last)
2276 ibyrow = ncfile%iRowIter(
nc_by)
2278 ifromcol = ncfile%iColIter(
nc_first)
2279 itocol = ncfile%iColIter(
nc_last)
2280 ibycol = ncfile%iColIter(
nc_by)
2284 select case (ncfile%sVariableOrder)
2289 inc_varid=ncfile%iVarID(
nc_z), &
2290 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_x), ncfile%iStart(
nc_y)], &
2291 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_x), ncfile%iCount(
nc_y)], &
2292 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_x), ncfile%iStride(
nc_y)], &
2296 do icol=ifromcol, itocol, ibycol
2297 do irow=ifromrow, itorow, ibyrow
2299 ivalues(icol,irow) = itemp(iindex)
2306 inc_varid=ncfile%iVarID(
nc_z), &
2307 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_y), ncfile%iStart(
nc_x)], &
2308 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_y), ncfile%iCount(
nc_x)], &
2309 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_y), ncfile%iStride(
nc_x)], &
2313 do irow=ifromrow, itorow, ibyrow
2314 do icol=ifromcol, itocol, ibycol
2316 ivalues(icol,irow) = itemp(iindex)
2322 call warn(
"INTERNAL PROGRAMMING ERROR: Unhandled select case. Program will probably fail.", __file__, __line__)
2333 type (T_NETCDF4_FILE) :: NCFILE
2334 real (c_float),
dimension(:,:) :: rValues
2337 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
2338 real (c_float),
dimension(size(rValues,2) * size(rValues,1)) :: rTemp
2339 integer (c_int) :: iStat
2340 integer (c_int) :: iRow, iCol, iIndex
2341 integer (c_int) :: iFromRow, iToRow, iByRow
2342 integer (c_int) :: iFromCol, iToCol, iByCol
2344 ifromrow = ncfile%iRowIter(
nc_first)
2345 itorow = ncfile%iRowIter(
nc_last)
2346 ibyrow = ncfile%iRowIter(
nc_by)
2348 ifromcol = ncfile%iColIter(
nc_first)
2349 itocol = ncfile%iColIter(
nc_last)
2350 ibycol = ncfile%iColIter(
nc_by)
2354 select case (ncfile%sVariableOrder)
2359 inc_varid=ncfile%iVarID(
nc_z), &
2360 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_x), ncfile%iStart(
nc_y)], &
2361 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_x), ncfile%iCount(
nc_y)], &
2362 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_x), ncfile%iStride(
nc_y)], &
2366 do icol=ifromcol, itocol, ibycol
2367 do irow=ifromrow, itorow, ibyrow
2369 rvalues(icol,irow) = rtemp(iindex)
2376 inc_varid=ncfile%iVarID(
nc_z), &
2377 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_y), ncfile%iStart(
nc_x)], &
2378 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_y), ncfile%iCount(
nc_x)], &
2379 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_y), ncfile%iStride(
nc_x)], &
2383 do irow=ifromrow, itorow, ibyrow
2384 do icol=ifromcol, itocol, ibycol
2386 rvalues(icol,irow) = rtemp(iindex)
2392 call warn(
"INTERNAL PROGRAMMING ERROR: Unhandled select case. Program will probably fail.", __file__, __line__)
2402 type (T_NETCDF4_FILE) :: NCFILE
2403 real (c_double),
dimension(:,:) :: dpValues
2406 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
2407 real (c_double),
dimension(size(dpValues,2) * size(dpValues,1)) :: dpTemp
2408 integer (c_int) :: iStat
2409 integer (c_int) :: iRow, iCol, iIndex
2410 integer (c_int) :: iFromRow, iToRow, iByRow
2411 integer (c_int) :: iFromCol, iToCol, iByCol
2413 ifromrow = ncfile%iRowIter(
nc_first)
2414 itorow = ncfile%iRowIter(
nc_last)
2415 ibyrow = ncfile%iRowIter(
nc_by)
2417 ifromcol = ncfile%iColIter(
nc_first)
2418 itocol = ncfile%iColIter(
nc_last)
2419 ibycol = ncfile%iColIter(
nc_by)
2423 select case (ncfile%sVariableOrder)
2428 inc_varid=ncfile%iVarID(
nc_z), &
2429 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_x), ncfile%iStart(
nc_y)], &
2430 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_x), ncfile%iCount(
nc_y)], &
2431 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_x), ncfile%iStride(
nc_y)], &
2435 do icol=ifromcol, itocol, ibycol
2436 do irow=ifromrow, itorow, ibyrow
2438 dpvalues(icol,irow) = dptemp(iindex)
2445 inc_varid=ncfile%iVarID(
nc_z), &
2446 inc_start=[ncfile%iStart(
nc_time), ncfile%iStart(
nc_y), ncfile%iStart(
nc_x)], &
2447 inc_count=[ncfile%iCount(
nc_time), ncfile%iCount(
nc_y), ncfile%iCount(
nc_x)], &
2448 inc_stride=[ncfile%iStride(
nc_time), ncfile%iStride(
nc_y), ncfile%iStride(
nc_x)], &
2452 do irow=ifromrow, itorow, ibyrow
2453 do icol=ifromcol, itocol, ibycol
2455 dpvalues(icol,irow) = dptemp(iindex)
2461 call warn(
"INTERNAL PROGRAMMING ERROR: Unhandled select case. Program will probably fail.", __file__, __line__)
2470 iNC_Stride, iNC_Vars)
2472 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2473 integer (c_int) :: iNC_VarID
2474 integer (c_size_t) :: iNC_Start
2475 integer (c_size_t) :: iNC_Count
2476 integer (c_size_t) :: iNC_Stride
2477 integer (c_short),
dimension(:) :: iNC_Vars
2481 startp=[inc_start], &
2482 countp=[inc_count], &
2483 stridep=[inc_stride], &
2484 vars=inc_vars), __file__, __line__ )
2491 iNC_Stride, iNC_Vars)
2493 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2494 integer (c_int) :: iNC_VarID
2495 integer (c_size_t),
dimension(:) :: iNC_Start
2496 integer (c_size_t),
dimension(:) :: iNC_Count
2497 integer (c_size_t),
dimension(:) :: iNC_Stride
2498 integer (c_short),
dimension(:,:) :: iNC_Vars
2502 startp=[inc_start], &
2503 countp=[inc_count], &
2504 stridep=[inc_stride], &
2505 vars=inc_vars), __file__, __line__ )
2512 iNC_Stride, iNC_Vars)
2514 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2515 integer (c_int) :: iNC_VarID
2516 integer (c_size_t),
dimension(:) :: iNC_Start
2517 integer (c_size_t),
dimension(:) :: iNC_Count
2518 integer (c_size_t),
dimension(:) :: iNC_Stride
2519 integer (c_short),
dimension(:) :: iNC_Vars
2523 startp=[inc_start], &
2524 countp=[inc_count], &
2525 stridep=[inc_stride], &
2526 vars=inc_vars), __file__, __line__ )
2533 iNC_Stride, iNC_Vars)
2535 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2536 integer (c_int) :: iNC_VarID
2537 integer (c_size_t),
dimension(:) :: iNC_Start
2538 integer (c_size_t),
dimension(:) :: iNC_Count
2539 integer (c_size_t),
dimension(:) :: iNC_Stride
2540 integer (c_int),
dimension(:) :: iNC_Vars
2544 startp=[inc_start], &
2545 countp=[inc_count], &
2546 stridep=[inc_stride], &
2547 vars=inc_vars), __file__, __line__ )
2554 iNC_Stride, iNC_Vars)
2556 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2557 integer (c_int) :: iNC_VarID
2558 integer (c_size_t) :: iNC_Start
2559 integer (c_size_t) :: iNC_Count
2560 integer (c_size_t) :: iNC_Stride
2561 integer (c_int),
dimension(:) :: iNC_Vars
2565 startp=[inc_start], &
2566 countp=[inc_count], &
2567 stridep=[inc_stride], &
2568 vars=inc_vars), __file__, __line__ )
2575 iNC_Stride, dpNC_Vars)
2577 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2578 integer (c_int) :: iNC_VarID
2579 integer (c_size_t) :: iNC_Start
2580 integer (c_size_t) :: iNC_Count
2581 integer (c_size_t) :: iNC_Stride
2582 real (c_double),
dimension(:) :: dpNC_Vars
2586 startp=[inc_start], &
2587 countp=[inc_count], &
2588 stridep=[inc_stride], &
2589 vars=dpnc_vars), __file__, __line__ )
2596 iNC_Stride, dpNC_Vars)
2598 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2599 integer (c_int) :: iNC_VarID
2600 integer (c_size_t),
dimension(:) :: iNC_Start
2601 integer (c_size_t),
dimension(:) :: iNC_Count
2602 integer (c_size_t),
dimension(:) :: iNC_Stride
2603 real (c_double),
dimension(:,:) :: dpNC_Vars
2607 startp=[inc_start], &
2608 countp=[inc_count], &
2609 stridep=[inc_stride], &
2610 vars=dpnc_vars), __file__, __line__ )
2617 iNC_Stride, dpNC_Vars)
2619 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2620 integer (c_int) :: iNC_VarID
2621 integer (c_size_t),
dimension(:) :: iNC_Start
2622 integer (c_size_t),
dimension(:) :: iNC_Count
2623 integer (c_size_t),
dimension(:) :: iNC_Stride
2624 real (c_double),
dimension(:) :: dpNC_Vars
2628 startp=[inc_start], &
2629 countp=[inc_count], &
2630 stridep=[inc_stride], &
2631 vars=dpnc_vars), __file__, __line__ )
2638 iNC_Stride, rNC_Vars )
2640 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2641 integer (c_int) :: iNC_VarID
2642 integer (c_size_t) :: iNC_Start
2643 integer (c_size_t) :: iNC_Count
2644 integer (c_size_t) :: iNC_Stride
2645 real (c_float),
dimension(:) :: rNC_Vars
2649 startp=[inc_start], &
2650 countp=[inc_count], &
2651 stridep=[inc_stride], &
2652 vars=rnc_vars), __file__, __line__ )
2659 iNC_Stride, rNC_Vars )
2661 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2662 integer (c_int) :: iNC_VarID
2663 integer (c_size_t),
dimension(:) :: iNC_Start
2664 integer (c_size_t),
dimension(:) :: iNC_Count
2665 integer (c_size_t),
dimension(:) :: iNC_Stride
2666 real (c_float),
dimension(:,:) :: rNC_Vars
2670 startp=[inc_start], &
2671 countp=[inc_count], &
2672 stridep=[inc_stride], &
2673 vars=rnc_vars), __file__, __line__ )
2680 iNC_Stride, rNC_Vars )
2682 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2683 integer (c_int) :: iNC_VarID
2684 integer (c_size_t),
dimension(:) :: iNC_Start
2685 integer (c_size_t),
dimension(:) :: iNC_Count
2686 integer (c_size_t),
dimension(:) :: iNC_Stride
2687 real (c_float),
dimension(:) :: rNC_Vars
2691 startp=[inc_start], &
2692 countp=[inc_count], &
2693 stridep=[inc_stride], &
2694 vars=rnc_vars), __file__, __line__ )
2707 character (len=256) :: sbuf, sbuf2
2708 character (len=256) :: sdimname
2709 integer (c_int) :: idimid
2710 integer (c_int) :: iubound
2712 integer :: iresult, iindex, iindex2, iindex3, iindex4
2716 write(unit=ilu, fmt=
"(a)")
"netcdf "//trim(ncfile%sFilename)//
" {"
2717 write(unit=ilu, fmt=
"(a)")
" dimensions:"
2719 do iindex = 0, ncfile%iNumberOfDimensions - 1
2720 write(unit=ilu, fmt=
"(4x,a, ' = ', i0, ';')") trim(ncfile%pNC_DIM(iindex)%sDimensionName), &
2721 ncfile%pNC_DIM(iindex)%iNC_DimSize
2724 do iindex = 0, ncfile%iNumberOfVariables - 1
2726 pnc_var => ncfile%pNC_VAR(iindex)
2728 if(pnc_var%iNumberOfDimensions > 0)
then
2732 iubound = pnc_var%iNumberOfDimensions - 1
2733 do iindex3 = 0, iubound
2735 idimid = pnc_var%iNC_DimID(iindex3)
2737 call assert(idimid >=0 .and. &
2738 idimid <= ubound( ncfile%pNC_DIM, 1 ), &
2739 "INTERNAL PROGRAMMING ERROR -- iDimID out of bounds", &
2742 pnc_dim => ncfile%pNC_DIM(idimid)
2743 sdimname = pnc_dim%sDimensionName
2745 write(sbuf2, fmt=
"(i12)") pnc_dim%iNC_DimSize
2746 sbuf = trim(sbuf)//trim(pnc_dim%sDimensionName)//
"=" &
2747 //trim(adjustl(sbuf2))
2749 if (iindex3 /= iubound) sbuf = trim(sbuf)//
", "
2753 sbuf = trim(sbuf)//
')'
2762 //
" "//trim(pnc_var%sVariableName)//sbuf//
";"
2764 write(unit=ilu, fmt=
"(2x,a)") trim(sbuf)
2766 iubound = pnc_var%iNumberOfAttributes - 1
2767 do iindex3 = 0, iubound
2769 pnc_att => ncfile%pNC_VAR(iindex)%pNC_ATT(iindex3)
2771 sbuf = trim(pnc_var%sVariableName)//
":"//trim(pnc_att%sAttributeName )//
" ="
2773 do iindex4=0, ubound(pnc_att%sAttValue, 1)
2775 sbuf = trim(sbuf)//
" "//trim(pnc_att%sAttValue(iindex4))
2781 write(unit=ilu, fmt=
"(4x,a)") trim(sbuf)
2787 do iindex = 0, ncfile%iNumberOfAttributes - 1
2789 pnc_att => ncfile%pNC_ATT(iindex)
2791 sbuf =
":"//trim(pnc_att%sAttributeName )//
" ="
2793 do iindex4=0, ubound(pnc_att%sAttValue, 1)
2795 sbuf = trim(sbuf)//
" "//trim(pnc_att%sAttValue(iindex4))
2801 write(unit=ilu, fmt=
"(a)") trim(sbuf)
2805 write(unit=ilu, fmt=
"(a,/,/)")
"}"
2815 integer (c_int) :: ivarindex
2816 real (c_double),
dimension(0:1) :: dpvalues
2821 integer (c_int) :: idimsize
2822 integer (c_int) :: idimindex
2823 integer (c_size_t) :: istride
2824 integer (c_size_t) :: icount
2825 integer (c_short),
dimension(0:1) :: spvalues
2826 integer (c_int),
dimension(0:1) :: ipvalues
2827 real (c_float),
dimension(0:1) :: rpvalues
2829 call assert (ivarindex >= lbound(ncfile%pNC_VAR,1) &
2830 .and. ivarindex <= ubound(ncfile%pNC_VAR,1), &
2831 "INTERNAL PROGRAMMING ERROR - index out of bounds NC_FILE%pNC_VAR" &
2832 //
"~Offending index value: "//trim(
ascharacter(ivarindex)), &
2835 pnc_var => ncfile%pNC_VAR(ivarindex)
2838 if (idimsize > 1)
then
2840 istride = int(idimsize, c_size_t) - 1_c_size_t
2843 istride = 1_c_size_t
2846 select case (pnc_var%iNC_VarType )
2851 inc_varid=pnc_var%iNC_VarID, &
2852 inc_start=0_c_size_t, &
2854 inc_stride=istride, &
2857 dpvalues = real(spvalues, c_double)
2862 inc_varid=pnc_var%iNC_VarID, &
2863 inc_start=0_c_size_t, &
2865 inc_stride=istride, &
2868 dpvalues = real(ipvalues, c_double)
2873 inc_varid=pnc_var%iNC_VarID, &
2874 inc_start=0_c_size_t, &
2876 inc_stride=istride, &
2879 dpvalues = real(rpvalues, c_double)
2884 inc_varid=pnc_var%iNC_VarID, &
2885 inc_start=0_c_size_t, &
2887 inc_stride=istride, &
2892 call warn(
"INTERNAL PROGRAMMING ERROR: Unhandled select case. Program will probably fail.", __file__, __line__)
2906 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2908 ncfile%iOriginJD =
julian_day(ncfile%iOriginYear, &
2909 ncfile%iOriginMonth, ncfile%iOriginDay)
2911 ncfile%iFirstDayJD = ncfile%iOriginJD + ncfile%dpFirstAndLastTimeValues(
nc_first)
2912 ncfile%iLastDayJD = ncfile%iOriginJD + ncfile%dpFirstAndLastTimeValues(
nc_last)
2920 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2923 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
2924 character (len=256) :: sDateTime
2925 character (len=256) :: sItem
2926 integer (c_int) :: iIndex
2927 logical (c_bool) :: lFound
2928 integer (c_int) :: iStat
2929 real (c_float) :: fTempVal
2931 call assert(ncfile%iVarID(
nc_time) >= 0,
"INTERNAL PROGRAMMING ERROR -- " &
2932 //
"nf_get_time_units must be called only after a call is made to ~" &
2933 //
"netcdf_get_variable_ids", __file__, __line__)
2935 pnc_var => ncfile%pNC_VAR(ncfile%iVarID(
nc_time) )
2939 do iindex=0, pnc_var%iNumberOfAttributes - 1
2941 if ( pnc_var%pNC_ATT(iindex)%sAttributeName .strequal.
"units" )
then
2948 call assert (lfound,
"Failed to find the 'units' attribute associated " &
2949 //
"with time variable "//
dquote(pnc_var%sVariableName), &
2952 sdatetime = pnc_var%pNC_ATT(iindex)%sAttValue(0)
2954 call chomp(sdatetime, sitem)
2955 call chomp(sdatetime, sitem)
2957 call chomp(sdatetime, sitem,
"/-")
2958 read(sitem, *) ncfile%iOriginYear
2960 call chomp(sdatetime, sitem,
"/-")
2961 read(sitem, *) ncfile%iOriginMonth
2966 read(sdatetime, *) ncfile%iOriginDay
2968 call chomp(sdatetime, sitem,
":")
2969 read(sitem, *, iostat=istat) ncfile%iOriginHH
2970 if (istat /=0) ncfile%iOriginHH = 0
2972 call chomp(sdatetime, sitem,
":")
2973 read(sitem, *, iostat=istat) ncfile%iOriginMM
2974 if (istat /=0) ncfile%iOriginMM = 0
2978 read(sdatetime, *, iostat=istat) ftempval
2980 ncfile%iOriginSS = int(ftempval, c_int)
2982 ncfile%iOriginSS = 0
2991 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
2994 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
2995 integer (c_int) :: iIndex, iIndex2
2996 logical (c_bool) :: lFound
2997 integer (c_int) :: iStat
3001 call assert(ncfile%iVarID(iindex) >= 0,
"INTERNAL PROGRAMMING ERROR -- " &
3002 //
"nc_get_XYZ_units must be called only after a call is made to ~" &
3003 //
"netcdf_get_variable_ids", __file__, __line__)
3005 pnc_var => ncfile%pNC_VAR(ncfile%iVarID(iindex) )
3009 do iindex2=0, pnc_var%iNumberOfAttributes - 1
3011 if ( pnc_var%pNC_ATT(iindex2)%sAttributeName .strequal.
"units" )
then
3019 ncfile%sVarUnits(iindex) = trim(pnc_var%pNC_ATT(iindex2)%sAttValue(0))
3030 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
3033 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
3034 integer (c_int) :: iIndex
3035 logical (c_bool) :: lFound
3036 integer (c_int) :: iStat
3037 character (len=32) :: sBuf
3039 pnc_var => ncfile%pNC_VAR(ncfile%iVarID(
nc_z) )
3043 do iindex=0, pnc_var%iNumberOfAttributes - 1
3045 if ( pnc_var%pNC_ATT(iindex)%sAttributeName .strequal.
"scale_factor" )
then
3053 if (
allocated( pnc_var%pNC_ATT(iindex)%i2AttValue ))
then
3054 ncfile%rScaleFactor(
nc_z) =
asfloat( pnc_var%pNC_ATT(iindex)%i2AttValue(0) )
3055 elseif (
allocated( pnc_var%pNC_ATT(iindex)%iAttValue ))
then
3056 ncfile%rScaleFactor(
nc_z) =
asfloat( pnc_var%pNC_ATT(iindex)%iAttValue(0) )
3057 elseif (
allocated( pnc_var%pNC_ATT(iindex)%rAttValue ))
then
3058 ncfile%rScaleFactor(
nc_z) = pnc_var%pNC_ATT(iindex)%rAttValue(0)
3059 elseif (
allocated( pnc_var%pNC_ATT(iindex)%dpAttValue ))
then
3060 ncfile%rScaleFactor(
nc_z) =
asfloat( pnc_var%pNC_ATT(iindex)%dpAttValue(0) )
3061 elseif (len_trim(pnc_var%pNC_ATT(iindex)%sAttValue(0)) > 0)
then
3062 sbuf = trim(pnc_var%pNC_ATT(iindex)%sAttValue(0) )
3063 read(sbuf,*) ncfile%rScaleFactor(
nc_z)
3065 call die(
"Error reading the 'scale_factor' attribute from the netCDF file" &
3066 //
dquote(ncfile%sFilename))
3073 do iindex=0, pnc_var%iNumberOfAttributes - 1
3075 if ( pnc_var%pNC_ATT(iindex)%sAttributeName .strequal.
"add_offset" )
then
3083 if (
allocated( pnc_var%pNC_ATT(iindex)%i2AttValue ))
then
3084 ncfile%rAddOffset(
nc_z) =
asfloat( pnc_var%pNC_ATT(iindex)%i2AttValue(0) )
3085 elseif (
allocated( pnc_var%pNC_ATT(iindex)%iAttValue ))
then
3086 ncfile%rAddOffset(
nc_z) =
asfloat( pnc_var%pNC_ATT(iindex)%iAttValue(0) )
3087 elseif (
allocated( pnc_var%pNC_ATT(iindex)%rAttValue ))
then
3088 ncfile%rAddOffset(
nc_z) = pnc_var%pNC_ATT(iindex)%rAttValue(0)
3089 elseif (
allocated( pnc_var%pNC_ATT(iindex)%dpAttValue ))
then
3090 ncfile%rAddOffset(
nc_z) =
asfloat( pnc_var%pNC_ATT(iindex)%dpAttValue(0) )
3091 elseif (len_trim(pnc_var%pNC_ATT(iindex)%sAttValue(0)) > 0)
then
3092 sbuf = trim(pnc_var%pNC_ATT(iindex)%sAttValue(0) )
3093 read(sbuf,*) ncfile%rAddOffset(
nc_z)
3095 call die(
"Error reading the 'add_offset' attribute from the netCDF file" &
3096 //
dquote(ncfile%sFilename))
3105 type (T_NETCDF4_FILE),
intent(inout) :: NCFILE
3106 logical (c_bool),
intent(in),
optional :: strict_asserts
3109 integer (c_int) :: iIndex
3110 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
3111 logical (c_bool) :: strict_asserts_l
3113 if (
present( strict_asserts ) )
then
3114 strict_asserts_l = strict_asserts
3116 strict_asserts_l =
true
3119 ncfile%iVarID = -9999
3121 do iindex=0, ncfile%iNumberOfVariables - 1
3123 pnc_var => ncfile%pNC_VAR(iindex)
3125 if ( pnc_var%sVariableName .strequal. ncfile%sVarName(
nc_x) )
then
3126 ncfile%iVarIndex(
nc_x) = iindex
3127 ncfile%iVarID(
nc_x) = pnc_var%iNC_VarID
3128 ncfile%iVarType(
nc_x) = pnc_var%iNC_VarType
3129 ncfile%iVar_DimID(
nc_x,:) = pnc_var%iNC_DimID
3131 elseif ( pnc_var%sVariableName .strequal. ncfile%sVarName(
nc_y) )
then
3132 ncfile%iVarIndex(
nc_y) = iindex
3133 ncfile%iVarID(
nc_y) = pnc_var%iNC_VarID
3134 ncfile%iVarType(
nc_y) = pnc_var%iNC_VarType
3135 ncfile%iVar_DimID(
nc_y,:) = pnc_var%iNC_DimID
3137 elseif ( pnc_var%sVariableName .strequal. ncfile%sVarName(
nc_z) )
then
3138 ncfile%iVarIndex(
nc_z) = iindex
3139 ncfile%iVarID(
nc_z) = pnc_var%iNC_VarID
3140 ncfile%iVarType(
nc_z) = pnc_var%iNC_VarType
3141 ncfile%iVar_DimID(
nc_z,:) = pnc_var%iNC_DimID
3143 elseif ( pnc_var%sVariableName .strequal. ncfile%sVarName(
nc_time) )
then
3144 ncfile%iVarIndex(
nc_time) = iindex
3145 ncfile%iVarID(
nc_time) = pnc_var%iNC_VarID
3146 ncfile%iVarType(
nc_time) = pnc_var%iNC_VarType
3147 ncfile%iVar_DimID(
nc_time,:) = pnc_var%iNC_DimID
3152 if ( strict_asserts_l )
then
3155 "Unable to find the variable named "//
dquote(ncfile%sVarName(
nc_x) )//
" in " &
3156 //
"file "//
dquote(ncfile%sFilename), __file__, __line__)
3159 "Unable to find the variable named "//
dquote(ncfile%sVarName(
nc_y))//
" in " &
3160 //
"file "//
dquote(ncfile%sFilename), __file__, __line__)
3163 "Unable to find the variable named "//
dquote(ncfile%sVarName(
nc_z))//
" in " &
3164 //
"file "//
dquote(ncfile%sFilename), __file__, __line__)
3166 if ( ncfile%iVarID(
nc_time) < 0 ) &
3167 call warn(
"Unable to find the variable named "//
dquote(ncfile%sVarName(
nc_time))//
" in " &
3168 //
"file "//
dquote(ncfile%sFilename) )
3178 real (c_double),
dimension(:) :: rvalues
3179 real (c_double) :: rtargetvalue
3180 real (c_double) :: roffsetvalue
3181 integer (c_int) :: iindex
3184 integer (c_int) :: icount
3185 real (c_double) :: rdiff, rdiffmin
3190 if ( .not. (rtargetvalue >= (minval(rvalues) - roffsetvalue) ) &
3191 .and. (rtargetvalue <= (maxval(rvalues) + roffsetvalue) ) )
then
3192 call logs%write(
"rTargetValue (" &
3193 //trim(
ascharacter(rtargetvalue))//
") is not within the range " &
3196 call assert(
false,
"INTERNAL PROGRAMMING ERROR", __file__, __line__)
3201 do icount=lbound(rvalues,1), ubound(rvalues,1)
3203 rdiff = abs(rvalues(icount) - rtargetvalue)
3205 if ( rdiff < rdiffmin )
then
3223 real (c_double) :: rx
3224 real (c_double) :: ry
3225 integer (c_size_t),
dimension(2) :: icolrow
3228 integer (c_int) :: icolnum, irownum
3229 real (c_double) :: x_offset
3230 real (c_double) :: y_offset
3232 x_offset = ncfile%rGridCellSizeX / 2.0_c_double + ncfile%rCoordinateTolerance
3233 y_offset = ncfile%rGridCellSizeY / 2.0_c_double + ncfile%rCoordinateTolerance
3235 call assert(
allocated( ncfile%rX_Coords ),
"Internal programming error -- attempt " &
3236 //
"to access unallocated array rX_Coords.", __file__, __line__ )
3238 if (rx < (minval(ncfile%rX_Coords) - x_offset) ) &
3239 call die(
"X coordinate value "//
ascharacter(rx)//
" is less than the minimum X coordinate " &
3240 //
"value ("//
ascharacter(minval(ncfile%rX_Coords)-x_offset)//
") contained in the netCDF file " &
3241 //
dquote(ncfile%sFilename), trim(__file__), __line__ )
3243 if (rx > (maxval(ncfile%rX_Coords) + x_offset) ) &
3244 call die(
"X coordinate value "//
ascharacter(rx)//
" is greater than the maximum X coordinate " &
3245 //
"value ("//
ascharacter(maxval(ncfile%rX_Coords)+x_offset)//
") contained in the netCDF file " &
3246 //
dquote(ncfile%sFilename), trim(__file__), __line__ )
3248 if (ry < (minval(ncfile%rY_Coords) - y_offset) ) &
3249 call die(
"Y coordinate value "//
ascharacter(ry)//
" is less than the minimum Y coordinate " &
3250 //
"value ("//
ascharacter(minval(ncfile%rY_Coords)-y_offset)//
") contained in the netCDF file " &
3251 //
dquote(ncfile%sFilename), trim(__file__), __line__ )
3253 if (ry > (maxval(ncfile%rY_Coords) + y_offset) ) &
3254 call die(
"Y coordinate value "//
ascharacter(ry)//
" is greater than the maximum Y coordinate " &
3255 //
"value ("//
ascharacter(maxval(ncfile%rY_Coords)+y_offset)//
") contained in the netCDF file " &
3256 //
dquote(ncfile%sFilename), trim(__file__), __line__ )
3261 icolrow(
column) = icolnum
3262 icolrow(
row) = irownum
3271 character (len=*) :: svariablename
3272 integer (c_int) :: inc_varid
3274 integer (c_int) :: iindex
3279 do iindex=0, ncfile%iNumberOfVariables - 1
3281 pnc_var => ncfile%pNC_VAR(iindex)
3283 if(trim(svariablename) .eq. trim(pnc_var%sVariableName) )
then
3298 type (T_NETCDF4_FILE ) :: NCFILE
3299 character (len=*) :: sFilename
3300 integer (c_int),
optional :: iLU
3304 ncidp=ncfile%iNCID), &
3321 ncfile%sFilename = trim(sfilename)
3324 if (
present(ilu) )
then
3325 call logs%write(
"Created netCDF file for output. Filename: " &
3335 type (T_NETCDF4_FILE ) :: NCFILE
3336 integer (c_int) :: iVarID
3337 integer (c_int) :: iShuffle
3338 integer (c_int) :: iDeflate
3339 integer (c_int) :: iDeflate_level
3345 deflate_level=ideflate_level), &
3354 type (T_NETCDF4_FILE ) :: NCFILE
3365 type (T_NETCDF4_FILE ) :: NCFILE
3376 type (T_NETCDF4_FILE ) :: NCFILE
3377 character (len=*) :: sDimensionName
3378 integer (c_int) :: iDimensionSize
3379 integer (c_int) :: iDimID
3381 integer (c_size_t) :: iDimSize
3382 type (T_NETCDF_DIMENSION),
pointer :: pNC_DIM
3384 idimsize = int(idimensionsize, c_size_t)
3387 name=trim(sdimensionname)//c_null_char, &
3398 type (T_NETCDF4_FILE ) :: NCFILE
3399 character (len=*) :: sVariableName
3400 character (len=*) :: sAttributeName
3402 integer (c_int) :: iVarID
3404 ivarid =
nf_get_varid(ncfile, svariablename//c_null_char)
3408 name=trim(sattributename)//c_null_char), &
3417 type (T_NETCDF4_FILE) :: NCFILE
3420 integer (c_int) :: iStat
3421 integer (c_int) :: iIndex
3422 character (len=256) :: sDimName
3423 type (T_NETCDF_DIMENSION),
pointer :: pNC_DIM
3425 do iindex = 0, ncfile%iNumberOfDimensions-1
3427 pnc_dim => ncfile%pNC_DIM(iindex)
3430 name=trim(pnc_dim%sDimensionName)//c_null_char, &
3431 lenv=pnc_dim%iNC_DimSize, &
3432 dimidp=pnc_dim%iNC_DimID), &
3433 __file__, __line__ )
3443 type (T_NETCDF4_FILE ) :: NCFILE
3444 integer (c_int) :: iNX
3445 integer (c_int) :: iNY
3446 logical (c_bool),
optional :: write_time_bounds
3449 integer (c_int) :: iStat
3450 logical (c_bool) :: write_time_bounds_l
3454 ncfile%iNumberOfDimensions = 3
3456 if (
present( write_time_bounds ) )
then
3458 write_time_bounds_l = write_time_bounds
3462 write_time_bounds_l =
false
3466 if ( write_time_bounds_l ) ncfile%iNumberOfDimensions = 4
3468 if (
associated(ncfile%pNC_DIM) )
deallocate(ncfile%pNC_DIM, stat=istat)
3469 call assert(istat == 0,
"Could not deallocate memory for NC_DIM member in NC_FILE defined type", &
3472 allocate(ncfile%pNC_DIM( 0 : ncfile%iNumberOfDimensions-1), stat=istat )
3473 call assert(istat == 0,
"Could not allocate memory for NC_DIM member in NC_FILE defined type", &
3477 ncfile%pNC_DIM(
nc_time)%sDimensionName =
"time"
3481 ncfile%pNC_DIM(
nc_y)%sDimensionName =
"y"
3482 ncfile%pNC_DIM(
nc_y)%iNC_DimSize = iny
3485 ncfile%pNC_DIM(
nc_x)%sDimensionName =
"x"
3486 ncfile%pNC_DIM(
nc_x)%iNC_DimSize = inx
3488 if ( write_time_bounds_l )
then
3490 ncfile%pNC_DIM(
nc_aux)%sDimensionName =
"nv"
3491 ncfile%pNC_DIM(
nc_aux)%iNC_DimSize = 2
3500 type (T_NETCDF4_FILE ) :: NCFILE
3501 character (len=*) :: sVarName_z
3502 logical (c_bool),
optional :: lLatLon
3503 logical (c_bool),
optional :: write_time_bounds
3506 integer (c_int) :: iStat
3507 logical (c_bool) :: lLatLon_l
3508 logical (c_bool) :: write_time_bounds_l
3510 if (
present( llatlon) )
then
3516 if (
present(write_time_bounds) )
then
3517 write_time_bounds_l = write_time_bounds
3519 write_time_bounds_l =
false
3524 ncfile%iNumberOfVariables = 5
3526 if ( llatlon_l ) ncfile%iNumberOfVariables = 7
3527 if ( write_time_bounds_l ) ncfile%iNumberOfVariables = &
3528 ncfile%iNumberOfVariables + 1
3533 if (
associated(ncfile%pNC_VAR) )
deallocate(ncfile%pNC_VAR, stat=istat)
3534 call assert(istat == 0,
"Could not deallocate memory for NC_VAR member in NC_FILE defined type", &
3537 allocate(ncfile%pNC_VAR( 0 : ncfile%iNumberOfVariables-1), stat=istat )
3538 call assert(istat == 0,
"Could not allocate memory for NC_VAR member in NC_FILE defined type", &
3541 ncfile%pNC_VAR(
nc_time)%sVariableName =
"time"
3543 ncfile%pNC_VAR(
nc_time)%iNumberOfDimensions = 1
3544 ncfile%pNC_VAR(
nc_time)%iNC_DimID(0) = ncfile%pNC_DIM(
nc_time)%iNC_DimID
3546 ncfile%pNC_VAR(
nc_y)%sVariableName =
"y"
3548 ncfile%pNC_VAR(
nc_y)%iNumberOfDimensions = 1
3549 ncfile%pNC_VAR(
nc_y)%iNC_DimID = ncfile%pNC_DIM(
nc_y)%iNC_DimID
3551 ncfile%pNC_VAR(
nc_x)%sVariableName =
"x"
3553 ncfile%pNC_VAR(
nc_x)%iNumberOfDimensions = 1
3554 ncfile%pNC_VAR(
nc_x)%iNC_DimID = ncfile%pNC_DIM(
nc_x)%iNC_DimID
3556 ncfile%pNC_VAR(
nc_crs)%sVariableName =
"crs"
3558 ncfile%pNC_VAR(
nc_crs)%iNumberOfDimensions = 0
3560 ncfile%pNC_VAR(
nc_z)%sVariableName = trim(svarname_z)
3562 ncfile%pNC_VAR(
nc_z)%iNumberOfDimensions = 3
3563 ncfile%pNC_VAR(
nc_z)%iNC_DimID = [ncfile%pNC_DIM(
nc_time)%iNC_DimID, &
3564 ncfile%pNC_DIM(
nc_y)%iNC_DimID, &
3565 ncfile%pNC_DIM(
nc_x)%iNC_DimID,0]
3567 ncfile%sVarName(
nc_z) = trim(svarname_z)
3569 if ( llatlon_l )
then
3571 ncfile%pNC_VAR(
nc_lat)%sVariableName =
"lat"
3573 ncfile%pNC_VAR(
nc_lat)%iNumberOfDimensions = 2
3574 ncfile%pNC_VAR(
nc_lat)%iNC_DimID = [ncfile%pNC_DIM(
nc_y)%iNC_DimID, &
3575 ncfile%pNC_DIM(
nc_x)%iNC_DimID,0,0]
3577 ncfile%pNC_VAR(
nc_lon)%sVariableName =
"lon"
3579 ncfile%pNC_VAR(
nc_lon)%iNumberOfDimensions = 2
3580 ncfile%pNC_VAR(
nc_lon)%iNC_DimID = [ncfile%pNC_DIM(
nc_y)%iNC_DimID, &
3581 ncfile%pNC_DIM(
nc_x)%iNC_DimID,0,0]
3584 if ( write_time_bounds_l )
then
3586 ncfile%pNC_VAR(
nc_time_bnds)%sVariableName =
"time_bnds"
3590 ncfile%pNC_DIM(
nc_aux)%iNC_DimID,0,0]
3599 history_list, sSourceFile )
3601 type (T_NETCDF4_FILE ) :: NCFILE
3602 character (len=*),
intent(in) :: sDataType
3603 character (len=*),
intent(in),
optional :: executable_name
3604 type (FSTRING_LIST_T),
intent(in),
pointer,
optional :: history_list
3605 character (len=*),
intent(in),
optional :: sSourceFile
3608 integer (c_int) :: iStat
3609 type (DATETIME_T) :: DT
3610 character (len=20) :: sDateTime
3611 character (len=:),
allocatable :: executable_name_l
3612 type (FSTRING_LIST_T),
pointer :: history_list_l
3613 integer (c_int) :: indx, jndx
3614 integer (c_int) :: records
3616 if (
present( executable_name) )
then
3617 executable_name_l = trim( executable_name )
3619 executable_name_l =
"SWB"
3622 if (
present( history_list ) )
then
3623 history_list_l => history_list
3624 ncfile%iNumberOfAttributes = 3 + history_list_l%count
3626 allocate( history_list_l )
3627 call history_list_l%append(trim(sdatetime)//
": Soil-Water-Balance model run started.")
3628 ncfile%iNumberOfAttributes = 4
3632 sdatetime = dt%prettydatetime()
3634 allocate( ncfile%pNC_ATT(0:ncfile%iNumberOfAttributes-1), stat=istat)
3635 call assert(istat == 0,
"Could not allocate memory for NC_ATT member of NC_FILE", &
3640 if (
present(ssourcefile) )
then
3642 ncfile%pNC_ATT(0)%sAttributeName =
"source"
3643 allocate(ncfile%pNC_ATT(0)%sAttValue(0:0))
3644 ncfile%pNC_ATT(0)%sAttValue(0) = trim(sdatatype)//
" data from file "//
dquote(ssourcefile)
3645 ncfile%pNC_ATT(0)%iNC_AttType =
nc_char
3646 ncfile%pNC_ATT(0)%iNC_AttSize = 1_c_size_t
3650 ncfile%pNC_ATT(0)%sAttributeName =
"source"
3651 allocate(ncfile%pNC_ATT(0)%sAttValue(0:0))
3652 ncfile%pNC_ATT(0)%sAttValue(0) = trim(sdatatype)//
" output from " &
3653 //executable_name_l//
" run " &
3654 //
"started on "//trim(sdatetime)//
"."
3655 ncfile%pNC_ATT(0)%iNC_AttType =
nc_char
3656 ncfile%pNC_ATT(0)%iNC_AttSize = 1_c_size_t
3660 ncfile%pNC_ATT(1)%sAttributeName =
"executable_version"
3661 allocate(ncfile%pNC_ATT(1)%sAttValue(0:0))
3662 ncfile%pNC_ATT(1)%sAttValue(0) =
"version "//trim(swb_version) &
3663 //
", Git branch: "//trim(git_branch_string)//
", Git commit hash string: " &
3664 //trim(git_commit_hash_string)//
", compiled on: "//trim(compile_date) &
3665 //
" "//trim(compile_time)//
"."
3666 ncfile%pNC_ATT(1)%iNC_AttType =
nc_char
3667 ncfile%pNC_ATT(1)%iNC_AttSize = 1_c_size_t
3669 ncfile%pNC_ATT(2)%sAttributeName =
"Conventions"
3670 allocate(ncfile%pNC_ATT(2)%sAttValue(0:0))
3671 ncfile%pNC_ATT(2)%sAttValue(0) =
"CF-1.6"
3672 ncfile%pNC_ATT(2)%iNC_AttType =
nc_char
3673 ncfile%pNC_ATT(2)%iNC_AttSize = 1_c_size_t
3676 records = history_list_l%count
3681 ncfile%pNC_ATT( jndx )%sAttributeName =
"history"
3682 allocate(ncfile%pNC_ATT(jndx)%sAttValue( 0:0 ) )
3683 ncfile%pNC_ATT(jndx)%iNC_AttType =
nc_char
3684 ncfile%pNC_ATT(jndx)%iNC_AttSize = int( records, c_size_t )
3685 ncfile%pNC_ATT(jndx)%sAttValue( 0 ) = trim(history_list_l%get( indx ))//c_null_char
3696 lLatLon, fValidMin, fValidMax, &
3699 type (T_NETCDF4_FILE ) :: NCFILE
3700 character (len=*) :: sOriginText
3701 character (len=*),
optional :: PROJ4_string
3702 logical (c_bool),
optional :: lLatLon
3703 real (c_float),
optional :: fValidMin
3704 real (c_float),
optional :: fValidMax
3705 logical (c_bool),
optional :: write_time_bounds
3708 integer (c_int) :: iStat
3709 integer (c_int) :: iNumAttributes
3710 type (T_NETCDF_ATTRIBUTE),
dimension(:),
pointer :: pNC_ATT
3711 logical (c_bool) :: lLatLon_l
3712 logical (c_bool) :: write_time_bounds_l
3713 type (FSTRING_LIST_T) :: attribute_name_list
3714 type (FSTRING_LIST_T) :: attribute_value_list
3715 character (len=:),
allocatable :: tempstring
3716 character (len=:),
allocatable :: value_string
3717 character (len=:),
allocatable :: value_string1
3718 character (len=:),
allocatable :: value_string2
3719 integer (c_int) :: indx
3721 if (
present( llatlon ) )
then
3727 if (
present( write_time_bounds ) )
then
3728 write_time_bounds_l = write_time_bounds
3730 write_time_bounds_l = false
3733 if (
present( proj4_string ) )
then
3734 call create_attributes_from_proj4_string( proj4_string, attribute_name_list, &
3735 attribute_value_list )
3738 inumattributes = attribute_name_list%count + 1
3740 allocate( ncfile%pNC_VAR(
nc_crs)%pNC_ATT(0:inumattributes-1), stat=istat)
3741 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
3743 ncfile%pNC_VAR(
nc_crs)%iNumberOfAttributes = inumattributes
3745 pnc_att => ncfile%pNC_VAR(
nc_crs)%pNC_ATT
3749 do indx=0, inumattributes-2
3751 tempstring = attribute_name_list%get( indx + 1 )
3752 pnc_att(indx)%sAttributeName = tempstring
3754 select case ( tempstring )
3758 value_string = attribute_value_list%get( indx + 1 )
3759 ncfile%sVarUnits(
nc_x) = value_string
3760 ncfile%sVarUnits(
nc_y) = value_string
3762 allocate(pnc_att(indx)%sAttValue(0:0))
3763 pnc_att(indx)%sAttValue(0) = value_string
3764 pnc_att(indx)%iNC_AttType =
nc_char
3765 pnc_att(indx)%iNC_AttSize = 1_c_size_t
3767 case (
"datum",
"spheroid",
"grid_mapping_name" )
3769 allocate(pnc_att(indx)%sAttValue(0:0))
3770 pnc_att(indx)%sAttValue(0) = attribute_value_list%get( indx + 1 )
3771 pnc_att(indx)%iNC_AttType =
nc_char
3772 pnc_att(indx)%iNC_AttSize = 1_c_size_t
3774 case (
"standard_parallel" )
3776 allocate(pnc_att(indx)%dpAttValue(0:1))
3778 value_string = attribute_value_list%get( indx + 1 )
3779 value_string1 = left(value_string, substring=
",")
3780 value_string2 = right(value_string, substring=
",")
3782 call assert(len_trim(value_string1) > 0,
"standard_parallel requires valid values for '+lat_1' and '+lat_2'.", &
3783 shints=
"Are '+lat_1' or '+lat_2' missing or out of order in the control file PROJ string?")
3785 pnc_att(indx)%dpAttValue(0) = asdouble( value_string1 )
3786 pnc_att(indx)%dpAttValue(1) = asdouble( value_string2 )
3788 pnc_att(indx)%iNC_AttSize = 2_c_size_t
3792 allocate(pnc_att(indx)%iAttValue(0:0))
3793 pnc_att(indx)%iAttValue(0) = asint( attribute_value_list%get( indx + 1 ) )
3794 pnc_att(indx)%iNC_AttType =
nc_int
3795 pnc_att(indx)%iNC_AttSize = 1_c_size_t
3799 allocate(pnc_att(indx)%dpAttValue(0:0))
3800 pnc_att(indx)%dpAttValue(0) = asdouble( attribute_value_list%get( indx + 1 ) )
3802 pnc_att(indx)%iNC_AttSize = 1_c_size_t
3809 pnc_att(indx)%sAttributeName =
"proj4_string"
3810 allocate(pnc_att(indx)%sAttValue(0:0))
3811 pnc_att(indx)%sAttValue(0) = proj4_string
3812 pnc_att(indx)%iNC_AttType =
nc_char
3813 pnc_att(indx)%iNC_AttSize = 1_c_size_t
3815 call attribute_name_list%clear()
3816 call attribute_value_list%clear()
3822 if ( write_time_bounds_l ) inumattributes=4
3823 allocate( ncfile%pNC_VAR(
nc_time)%pNC_ATT(0:inumattributes-1), stat=istat)
3824 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
3826 ncfile%pNC_VAR(
nc_time)%iNumberOfAttributes = inumattributes
3828 pnc_att => ncfile%pNC_VAR(
nc_time)%pNC_ATT
3830 pnc_att(0)%sAttributeName =
"units"
3831 allocate(pnc_att(0)%sAttValue(0:0))
3832 pnc_att(0)%sAttValue(0) =
"days since "//trim(sorigintext)//
" 00:00:00"
3833 pnc_att(0)%iNC_AttType =
nc_char
3834 pnc_att(0)%iNC_AttSize = 1_c_size_t
3836 pnc_att(1)%sAttributeName =
"calendar"
3837 allocate(pnc_att(1)%sAttValue(0:0))
3838 pnc_att(1)%sAttValue(0) =
"standard"
3839 pnc_att(1)%iNC_AttType =
nc_char
3840 pnc_att(1)%iNC_AttSize = 1_c_size_t
3842 pnc_att(2)%sAttributeName =
"long_name"
3843 allocate(pnc_att(2)%sAttValue(0:0))
3844 pnc_att(2)%sAttValue(0) =
"time"
3845 pnc_att(2)%iNC_AttType =
nc_char
3846 pnc_att(2)%iNC_AttSize = 1_c_size_t
3848 if ( write_time_bounds_l )
then
3849 pnc_att(3)%sAttributeName =
"bounds"
3850 allocate(pnc_att(3)%sAttValue(0:0))
3851 pnc_att(3)%sAttValue(0) =
"time_bounds"
3852 pnc_att(3)%iNC_AttType =
nc_char
3853 pnc_att(3)%iNC_AttSize = 1_c_size_t
3856 if (
present( fvalidmin ) .and.
present( fvalidmax) )
then
3859 allocate( ncfile%pNC_VAR(
nc_z)%pNC_ATT(0:inumattributes-1), stat=istat)
3860 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
3862 ncfile%pNC_VAR(
nc_z)%iNumberOfAttributes = inumattributes
3864 pnc_att => ncfile%pNC_VAR(
nc_z)%pNC_ATT
3866 pnc_att(0)%sAttributeName =
"units"
3867 allocate(pnc_att(0)%sAttValue(0:0))
3868 pnc_att(0)%sAttValue(0) = ncfile%sVarUnits(
nc_z)
3869 pnc_att(0)%iNC_AttType =
nc_char
3870 pnc_att(0)%iNC_AttSize = 1_c_size_t
3872 pnc_att(1)%sAttributeName =
"valid_min"
3873 allocate(pnc_att(1)%rAttValue(0:0))
3874 pnc_att(1)%rAttValue(0) = fvalidmin
3876 pnc_att(1)%iNC_AttSize = 1_c_size_t
3878 pnc_att(2)%sAttributeName =
"valid_max"
3879 allocate(pnc_att(2)%rAttValue(0:0))
3880 pnc_att(2)%rAttValue(0) = fvalidmax
3882 pnc_att(2)%iNC_AttSize = 1_c_size_t
3884 pnc_att(3)%sAttributeName =
"valid_range"
3885 allocate(pnc_att(3)%rAttValue(0:1))
3886 pnc_att(3)%rAttValue(0) = fvalidmin
3887 pnc_att(3)%rAttValue(1) = fvalidmax
3889 pnc_att(3)%iNC_AttSize = 2_c_size_t
3891 pnc_att(4)%sAttributeName =
"_FillValue"
3892 allocate(pnc_att(4)%rAttValue(0:0))
3895 pnc_att(4)%iNC_AttSize = 1_c_size_t
3897 pnc_att(5)%sAttributeName =
"coordinates"
3898 allocate(pnc_att(5)%sAttValue(0:0))
3900 pnc_att(5)%sAttValue(0) =
"crs"
3901 pnc_att(5)%iNC_AttType =
nc_char
3902 pnc_att(5)%iNC_AttSize = 1_c_size_t
3904 pnc_att(6)%sAttributeName =
"grid_mapping"
3905 allocate(pnc_att(6)%sAttValue(0:0))
3906 pnc_att(6)%sAttValue(0) =
"crs"
3907 pnc_att(6)%iNC_AttType =
nc_char
3908 pnc_att(6)%iNC_AttSize = 1_c_size_t
3913 allocate( ncfile%pNC_VAR(
nc_z)%pNC_ATT(0:inumattributes-1), stat=istat)
3914 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
3916 ncfile%pNC_VAR(
nc_z)%iNumberOfAttributes = inumattributes
3918 pnc_att => ncfile%pNC_VAR(
nc_z)%pNC_ATT
3920 pnc_att(0)%sAttributeName =
"units"
3921 allocate(pnc_att(0)%sAttValue(0:0))
3922 pnc_att(0)%sAttValue(0) = ncfile%sVarUnits(
nc_z)
3923 pnc_att(0)%iNC_AttType =
nc_char
3924 pnc_att(0)%iNC_AttSize = 1_c_size_t
3926 pnc_att(1)%sAttributeName =
"coordinates"
3927 allocate(pnc_att(1)%sAttValue(0:0))
3928 pnc_att(1)%sAttValue(0) =
"lat lon"
3929 pnc_att(1)%iNC_AttType =
nc_char
3930 pnc_att(1)%iNC_AttSize = 1_c_size_t
3932 pnc_att(2)%sAttributeName =
"grid_mapping"
3933 allocate(pnc_att(2)%sAttValue(0:0))
3934 pnc_att(2)%sAttValue(0) =
"crs"
3935 pnc_att(2)%iNC_AttType =
nc_char
3936 pnc_att(2)%iNC_AttSize = 1_c_size_t
3941 allocate( ncfile%pNC_VAR(
nc_y)%pNC_ATT(0:inumattributes-1), stat=istat)
3942 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
3944 ncfile%pNC_VAR(
nc_y)%iNumberOfAttributes = inumattributes
3946 pnc_att => ncfile%pNC_VAR(
nc_y)%pNC_ATT
3950 pnc_att(0)%sAttributeName =
"units"
3951 allocate(pnc_att(0)%sAttValue(0:0))
3952 pnc_att(0)%sAttValue(0) = ncfile%sVarUnits(
nc_y)
3953 pnc_att(0)%iNC_AttType =
nc_char
3954 pnc_att(0)%iNC_AttSize = 1_c_size_t
3956 pnc_att(1)%sAttributeName =
"long_name"
3957 allocate(pnc_att(1)%sAttValue(0:0))
3958 pnc_att(1)%sAttValue(0) =
"y coordinate of projection"
3959 pnc_att(1)%iNC_AttType =
nc_char
3960 pnc_att(1)%iNC_AttSize = 1_c_size_t
3962 pnc_att(2)%sAttributeName =
"standard_name"
3963 allocate(pnc_att(2)%sAttValue(0:0))
3964 pnc_att(2)%sAttValue(0) =
"projection_y_coordinate"
3965 pnc_att(2)%iNC_AttType =
nc_char
3966 pnc_att(2)%iNC_AttSize = 1_c_size_t
3972 allocate( ncfile%pNC_VAR(
nc_x)%pNC_ATT(0:inumattributes-1), stat=istat)
3973 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
3975 ncfile%pNC_VAR(
nc_x)%iNumberOfAttributes = inumattributes
3977 pnc_att => ncfile%pNC_VAR(
nc_x)%pNC_ATT
3981 pnc_att(0)%sAttributeName =
"units"
3982 allocate(pnc_att(0)%sAttValue(0:0))
3983 pnc_att(0)%sAttValue(0) = ncfile%sVarUnits(
nc_x)
3984 pnc_att(0)%iNC_AttType =
nc_char
3985 pnc_att(0)%iNC_AttSize = 1_c_size_t
3987 pnc_att(1)%sAttributeName =
"long_name"
3988 allocate(pnc_att(1)%sAttValue(0:0))
3989 pnc_att(1)%sAttValue(0) =
"x coordinate of projection"
3990 pnc_att(1)%iNC_AttType =
nc_char
3991 pnc_att(1)%iNC_AttSize = 1_c_size_t
3993 pnc_att(2)%sAttributeName =
"standard_name"
3994 allocate(pnc_att(2)%sAttValue(0:0))
3995 pnc_att(2)%sAttValue(0) =
"projection_x_coordinate"
3996 pnc_att(2)%iNC_AttType =
nc_char
3997 pnc_att(2)%iNC_AttSize = 1_c_size_t
4002 if ( llatlon_l )
then
4005 allocate( ncfile%pNC_VAR(
nc_lat)%pNC_ATT(0:inumattributes-1), stat=istat)
4006 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
4008 ncfile%pNC_VAR(
nc_lat)%iNumberOfAttributes = inumattributes
4010 pnc_att => ncfile%pNC_VAR(
nc_lat)%pNC_ATT
4014 pnc_att(0)%sAttributeName =
"units"
4015 allocate(pnc_att(0)%sAttValue(0:0))
4016 pnc_att(0)%sAttValue(0) =
"degrees_north"
4017 pnc_att(0)%iNC_AttType =
nc_char
4018 pnc_att(0)%iNC_AttSize = 1_c_size_t
4020 pnc_att(1)%sAttributeName =
"long_name"
4021 allocate(pnc_att(1)%sAttValue(0:0))
4022 pnc_att(1)%sAttValue(0) =
"latitude"
4023 pnc_att(1)%iNC_AttType =
nc_char
4024 pnc_att(1)%iNC_AttSize = 1_c_size_t
4026 pnc_att(2)%sAttributeName =
"standard_name"
4027 allocate(pnc_att(2)%sAttValue(0:0))
4028 pnc_att(2)%sAttValue(0) =
"latitude"
4029 pnc_att(2)%iNC_AttType =
nc_char
4030 pnc_att(2)%iNC_AttSize = 1_c_size_t
4037 allocate( ncfile%pNC_VAR(
nc_lon)%pNC_ATT(0:inumattributes-1), stat=istat)
4038 call assert(istat == 0,
"Could not allocate memory for NC_ATT member in NC_VAR struct of NC_FILE", &
4040 ncfile%pNC_VAR(
nc_lon)%iNumberOfAttributes = inumattributes
4042 pnc_att => ncfile%pNC_VAR(
nc_lon)%pNC_ATT
4046 pnc_att(0)%sAttributeName =
"units"
4047 allocate(pnc_att(0)%sAttValue(0:0))
4048 pnc_att(0)%sAttValue(0) =
"degrees_east"
4049 pnc_att(0)%iNC_AttType =
nc_char
4050 pnc_att(0)%iNC_AttSize = 1_c_size_t
4052 pnc_att(1)%sAttributeName =
"long_name"
4053 allocate(pnc_att(1)%sAttValue(0:0))
4054 pnc_att(1)%sAttValue(0) =
"longitude"
4055 pnc_att(1)%iNC_AttType =
nc_char
4056 pnc_att(1)%iNC_AttSize = 1_c_size_t
4058 pnc_att(2)%sAttributeName =
"standard_name"
4059 allocate(pnc_att(2)%sAttValue(0:0))
4060 pnc_att(2)%sAttValue(0) =
"longitude"
4061 pnc_att(2)%iNC_AttType =
nc_char
4062 pnc_att(2)%iNC_AttSize = 1_c_size_t
4075 type (T_NETCDF4_FILE) :: NCFILE
4076 real (c_double),
dimension(:) :: dpX
4077 real (c_double),
dimension(:) :: dpY
4080 integer (c_size_t) :: iLength
4081 real (c_double),
dimension(:),
allocatable :: rX, rY
4083 ilength = int(
size(dpx, 1), c_size_t)
4086 ivarid=ncfile%pNC_VAR(
nc_x)%iNC_VarID, &
4087 istart=[0_c_size_t], &
4089 istride=[1_c_size_t], &
4092 ilength = int(
size(dpy, 1), c_size_t)
4095 ivarid=ncfile%pNC_VAR(
nc_y)%iNC_VarID, &
4096 istart=[0_c_size_t], &
4098 istride=[1_c_size_t], &
4107 type (T_NETCDF4_FILE) :: NCFILE
4108 real (c_double),
dimension(:,:) :: dpLat
4109 real (c_double),
dimension(:,:) :: dpLon
4112 integer (c_size_t) :: iNX, iNY
4114 inx = int(
size(dplat, 1), c_size_t)
4115 iny = int(
size(dplat, 2), c_size_t)
4118 ivarid=ncfile%pNC_VAR(
nc_lat)%iNC_VarID, &
4119 istart=[0_c_size_t, 0_c_size_t], &
4120 icount=[ iny, inx ], &
4121 istride=[1_c_size_t,1_c_size_t], &
4126 ivarid=ncfile%pNC_VAR(
nc_lon)%iNC_VarID, &
4127 istart=[0_c_size_t, 0_c_size_t], &
4128 icount=[ iny, inx ],&
4129 istride=[1_c_size_t,1_c_size_t], &
4137 iNumberOfDimensions, iDimIDs)
result(iVarID)
4140 character (len=*) :: svariablename
4141 integer (c_int) :: ivariabletype
4142 integer (c_int) :: inumberofdimensions
4143 integer (c_int),
dimension(:) :: idimids
4144 integer (c_int) :: ivarid
4146 call nf_trap( nc_def_var(ncid=ncfile%iNCID,&
4147 name=trim(fortran_to_c_string(svariablename)), &
4148 xtype=ivariabletype, &
4149 ndims=inumberofdimensions, &
4162 type (T_NETCDF4_FILE) :: NCFILE
4165 integer (c_int) :: iStat
4166 integer (c_int) :: iIndex
4167 character (len=256) :: sDimName
4168 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
4173 do iindex = 0, ncfile%iNumberOfVariables-1
4175 pnc_var => ncfile%pNC_VAR(iindex)
4177 call nf_trap( nc_def_var(ncid=ncfile%iNCID,&
4178 name=trim(fortran_to_c_string(pnc_var%sVariableName)), &
4179 xtype=pnc_var%iNC_VarType, &
4180 ndims=pnc_var%iNumberOfDimensions, &
4181 dimidsp=pnc_var%iNC_DimID, &
4182 varidp=pnc_var%iNC_VarID), &
4192 sAttributeValue, iAttributeValue, rAttributeValue, dpAttributeValue)
4195 character (len=*) :: svariablename
4196 character (len=*) :: sattributename
4197 character (len=*),
dimension(:),
optional :: sattributevalue
4198 integer (c_int),
dimension(:),
optional :: iattributevalue
4199 real (c_float),
dimension(:),
optional :: rattributevalue
4200 real (c_double),
dimension(:),
optional :: dpattributevalue
4202 integer (c_int) :: ivarid
4209 if (
present(sattributevalue)) &
4210 call nf_put_attribute( ncfile, ivarid, trim(sattributename)//c_null_char, sattributevalue )
4212 if (
present(iattributevalue)) &
4213 call nf_put_attribute( ncfile, ivarid, trim(sattributename)//c_null_char, iattributevalue=iattributevalue )
4215 if (
present(rattributevalue)) &
4216 call nf_put_attribute( ncfile, ivarid, trim(sattributename)//c_null_char, rattributevalue=rattributevalue )
4218 if (
present(dpattributevalue)) &
4219 call nf_put_attribute( ncfile, ivarid, trim(sattributename)//c_null_char, dpattributevalue=dpattributevalue )
4226 sAttributeValue, iAttributeValue, rAttributeValue, dpAttributeValue)
4228 type (T_NETCDF4_FILE ) :: NCFILE
4229 integer (c_int) :: iVarID
4230 character (len=*) :: sAttributeName
4231 character (len=*),
dimension(:),
optional :: sAttributeValue
4232 integer (c_int),
dimension(:),
optional :: iAttributeValue
4233 real (c_float),
dimension(:),
optional :: rAttributeValue
4234 real (c_double),
dimension(:),
optional :: dpAttributeValue
4237 integer (c_size_t) :: iNumberOfAttributes
4239 if (
present(sattributevalue) )
then
4241 inumberofattributes =
size( sattributevalue, 1)
4242 inumberofattributes = int(len_trim(sattributevalue(1)), c_size_t)
4244 call nf_trap( nc_put_att_text(ncid=ncfile%iNCID, &
4246 name=trim(sattributename), &
4247 nlen=inumberofattributes, &
4248 tp=trim(sattributevalue(1))), &
4251 elseif (
present(iattributevalue) )
then
4253 inumberofattributes =
size( iattributevalue, 1)
4255 call nf_trap( nc_put_att_int(ncid=ncfile%iNCID, &
4257 name=trim(sattributename), &
4259 nlen=inumberofattributes, &
4260 ip=iattributevalue), &
4263 elseif (
present(rattributevalue) )
then
4265 inumberofattributes =
size( rattributevalue, 1)
4267 call nf_trap( nc_put_att_float(ncid=ncfile%iNCID, &
4269 name=trim(sattributename), &
4271 nlen=inumberofattributes, &
4272 fp=rattributevalue), &
4275 elseif (
present(dpattributevalue) )
then
4277 inumberofattributes =
size( dpattributevalue, 1)
4279 call nf_trap( nc_put_att_double(ncid=ncfile%iNCID, &
4281 name=trim(sattributename), &
4283 nlen=inumberofattributes, &
4284 dp=dpattributevalue), &
4296 type (T_NETCDF4_FILE ) :: NCFILE
4299 integer (c_size_t) :: iNumberOfAttributes
4300 type (T_NETCDF_VARIABLE),
pointer :: pNC_VAR
4301 type (T_NETCDF_ATTRIBUTE),
pointer :: pNC_ATT
4302 integer (c_int) :: iIndex
4303 integer (c_int) :: iIndex2
4304 integer (c_int) :: iStat
4305 integer (c_int) :: indx
4308 do iindex = 0, ncfile%iNumberOfVariables-1
4310 pnc_var => ncfile%pNC_VAR(iindex)
4313 do iindex2 = 0, pnc_var%iNumberOfAttributes-1
4315 pnc_att => pnc_var%pNC_ATT(iindex2)
4317 select case (pnc_att%iNC_AttType)
4321 if (.not.
allocated(pnc_att%dpAttValue) ) &
4322 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4323 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4327 ivarid=pnc_var%iNC_VarID, &
4328 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4329 dpattributevalue=pnc_att%dpAttValue)
4333 if (.not.
allocated(pnc_att%iAttValue) ) &
4334 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4335 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4339 ivarid=pnc_var%iNC_VarID, &
4340 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4341 iattributevalue=pnc_att%iAttValue)
4345 if (.not.
allocated(pnc_att%rAttValue) ) &
4346 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4347 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4351 ivarid=pnc_var%iNC_VarID, &
4352 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4353 rattributevalue=pnc_att%rAttValue)
4357 if (.not.
allocated(pnc_att%sAttValue) ) &
4358 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4359 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4362 do indx=0,ubound(pnc_att%sAttValue, 1)
4365 ivarid=pnc_var%iNC_VarID, &
4366 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4367 sattributevalue=[trim(pnc_att%sAttValue(indx))//c_null_char])
4378 do iindex2 = 0, ncfile%iNumberOfAttributes-1
4380 pnc_att => ncfile%pNC_ATT(iindex2)
4382 select case (pnc_att%iNC_AttType)
4386 if (.not.
allocated(pnc_att%sAttValue) ) &
4387 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4388 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4393 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4394 dpattributevalue=pnc_att%dpAttValue)
4398 if (.not.
allocated(pnc_att%sAttValue) ) &
4399 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4400 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4405 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4406 iattributevalue=pnc_att%iAttValue)
4410 if (.not.
allocated(pnc_att%sAttValue) ) &
4411 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4412 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4417 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4418 rattributevalue=pnc_att%rAttValue)
4422 if (.not.
allocated(pnc_att%sAttValue) ) &
4423 call die(
"INTERNAL PROGRAMMING ERROR - attempt to use unallocated variable; " &
4424 //
"attribute name: "//dquote(pnc_att%sAttributeName), &
4427 do indx=0, ubound(pnc_att%sAttValue, 1)
4431 sattributename=trim(pnc_att%sAttributeName)//c_null_char, &
4432 sattributevalue=[trim(pnc_att%sAttValue(indx))//c_null_char])
4445 iValues, i2Values, rValues, dpValues)
4448 integer (c_int) :: ivarid
4449 integer (c_size_t),
dimension(:) :: istart
4450 integer (c_size_t),
dimension(:) :: icount
4451 integer (c_size_t),
dimension(:) :: istride
4452 integer (c_int),
dimension(:,:),
optional :: ivalues
4453 integer (c_short),
dimension(:,:),
optional :: i2values
4454 real (c_float),
dimension(:,:),
optional :: rvalues
4455 real (c_double),
dimension(:,:),
optional :: dpvalues
4457 if (
present(ivalues) )
then
4459 call nf_trap(nc_put_vars_int(ncid=ncfile%iNCID, &
4467 elseif (
present(i2values) )
then
4469 call nf_trap(nc_put_vars_short(ncid=ncfile%iNCID, &
4477 elseif (
present(rvalues) )
then
4479 call nf_trap(nc_put_vars_float(ncid=ncfile%iNCID, &
4487 elseif (
present(dpvalues) )
then
4491 call nf_trap(nc_put_vars_double(ncid=ncfile%iNCID, &
4504 lMask, iValues, iField, i2Values, i2Field, rValues, rField, dpValues, dpField)
4507 integer (c_int) :: ivarid
4508 integer (c_size_t),
dimension(:) :: istart
4509 integer (c_size_t),
dimension(:) :: icount
4510 integer (c_size_t),
dimension(:) :: istride
4511 logical (c_bool),
dimension(:,:) :: lmask
4512 integer (c_int),
dimension(:),
optional :: ivalues
4513 integer (c_int),
dimension(:,:),
optional :: ifield
4514 integer (c_short),
dimension(:),
optional :: i2values
4515 integer (c_short),
dimension(:,:),
optional :: i2field
4516 real (c_float),
dimension(:),
optional :: rvalues
4517 real (c_float),
dimension(:,:),
optional :: rfield
4518 real (c_double),
dimension(:),
optional :: dpvalues
4519 real (c_double),
dimension(:,:),
optional :: dpfield
4521 if (
present(ivalues) )
then
4523 call nf_trap(nc_put_vars_int(ncid=ncfile%iNCID, &
4528 vars=unpack(ivalues, lmask, ifield)), &
4531 elseif (
present(i2values) )
then
4533 call nf_trap(nc_put_vars_short(ncid=ncfile%iNCID, &
4538 vars=unpack(i2values, lmask, i2field)), &
4541 elseif (
present(rvalues) )
then
4543 call nf_trap(nc_put_vars_float(ncid=ncfile%iNCID, &
4548 vars=unpack(rvalues, lmask, rfield)), &
4551 elseif (
present(dpvalues) )
then
4553 call nf_trap(nc_put_vars_double(ncid=ncfile%iNCID, &
4558 vars=unpack(dpvalues, lmask, dpfield)), &
4567 iValues, i2Values, rValues, dpValues)
4570 integer (c_int) :: ivarid
4571 integer (c_size_t),
dimension(:) :: istart
4572 integer (c_size_t),
dimension(:) :: icount
4573 integer (c_size_t),
dimension(:) :: istride
4574 integer (c_int),
dimension(:),
optional :: ivalues
4575 integer (c_short),
dimension(:),
optional :: i2values
4576 real (c_float),
dimension(:),
optional :: rvalues
4577 real (c_double),
dimension(:),
optional :: dpvalues
4579 if (
present(ivalues) )
then
4581 call nf_trap(nc_put_vars_int(ncid=ncfile%iNCID, &
4589 elseif (
present(i2values) )
then
4591 call nf_trap(nc_put_vars_short(ncid=ncfile%iNCID, &
4599 elseif (
present(rvalues) )
then
4601 call nf_trap(nc_put_vars_float(ncid=ncfile%iNCID, &
4609 elseif (
present(dpvalues) )
then
4611 call nf_trap(nc_put_vars_double(ncid=ncfile%iNCID, &
4617 __file__, __line__, ncfile%sFilename )
This module contains physical constants and convenience functions aimed at performing unit conversion...
logical(c_bool), parameter, public true
elemental character(len=256) function, public fortran_to_c_string(stext)
character(len=:), allocatable, public output_prefix_name
logical(c_bool), parameter, public false
character(len=:), allocatable, public output_directory_name
elemental character(len=len(ccharacterstring) - 1) function, public c_to_fortran_string(ccharacterstring)
character(len=256) function, public char_ptr_to_fortran_string(cpcharacterptr)
integer(c_int), parameter, public ibigval
This module contains the DATETIME_T class and associated time and date-related routines,...
integer(c_int) function, public julian_day(iyear, imonth, iday, iorigin, sinputitemname)
subroutine, public warn(smessage, smodule, iline, shints, lfatal, iloglevel, lecho)
subroutine, public die(smessage, smodule, iline, shints, scalledby, icalledbyline)
Provides support for input and output of gridded ASCII data, as well as for creation and destruction ...
real(c_float), parameter nc_fill_float
integer(c_int), parameter, private row
integer(c_int), parameter, private column
integer(c_int), parameter nc_fill_int
real(c_double), parameter nc_fill_double
type(logfile_t), public logs
Provide support for use of netCDF files as input for time-varying, gridded meteorlogic data,...
integer(c_int), parameter nc_64bit_offset
subroutine, public netcdf_set_coordinate_tolerance(ncfile, tolerance)
integer(c_int), parameter nc_netcdf4
integer(c_int), parameter nc_short
integer(c_int) function nf_get_varid(ncfile, svariablename)
integer(c_int), parameter, public nc_bottom
integer(c_int), parameter, public nc_y
subroutine nf_get_variable_array_as_vector_float(ncfile, inc_varid, inc_start, inc_count, inc_stride, rnc_vars)
subroutine nf_define_dimension(ncfile, sdimensionname, idimensionsize)
integer(c_int), parameter nc_string
integer(c_int) function nf_return_index_double(rvalues, rtargetvalue, roffsetvalue)
subroutine, public netcdf_nullify_data_struct(ncfile)
integer(c_int), parameter nc_int64
subroutine nf_populate_dimension_struct(ncfile)
integer(c_int), parameter, public nc_x
integer(c_int) function nf_julian_day_to_index(ncfile, rjulianday)
We need two functions to convert from index to timeval, and timeval to JD; note that timeval refers t...
integer(c_int), parameter nc_max_attrs
integer(c_int), parameter, public nc_crs
integer(c_int), parameter nc_fill_short
subroutine, public netcdf_open_and_prepare_as_output(ncfile, svariablename, svariableunits, inx, iny, fx, fy, startdate, enddate, proj4_string, history_list, executable_name, dplat, dplon, fvalidmin, fvalidmax, write_time_bounds, filename_prefix, filename_modifier)
integer(c_int), parameter nc_max_dims
subroutine, public netcdf_dump_cdl(ncfile, ilu)
integer(c_int) function nf_return_varindex(ncfile, ivarid)
subroutine nf_get_variable_slice_double(ncfile, dpvalues)
subroutine nf_guess_z_variable_name(ncfile)
integer(c_int), parameter, public nc_top
integer(c_int), parameter nc_ushort
integer(c_int), parameter nc_shuffle_no
integer(c_int), parameter nc_char
integer(c_int), parameter, public nc_right
integer(c_int), parameter nc_format_64bit
integer(c_int), parameter nc_max_name
integer(c_int), parameter nc_first
integer(c_int), parameter nc_lock
subroutine nf_get_variable_slice_short(ncfile, i2values)
integer(c_int), parameter nc_fill_byte
character(len=6), dimension(0:6), parameter netcdf_data_type
integer(c_int), public nc_readwrite
integer(c_int), parameter nc_byte
subroutine nf_get_variable_vector_float(ncfile, inc_varid, inc_start, inc_count, inc_stride, rnc_vars)
integer(c_int), parameter year_is_360_days
subroutine nf_get_variable_id_and_type(ncfile, strict_asserts)
subroutine nf_put_x_and_y(ncfile, dpx, dpy)
integer(c_int), parameter nc_int
integer(c_int), parameter nc_fill_char
subroutine nf_get_variable_array_double(ncfile, inc_varid, inc_start, inc_count, inc_stride, dpnc_vars)
real(c_double) function nf_index_to_dayvalue(ncfile, iindex)
subroutine, public netcdf_put_packed_variable_array(ncfile, ivarid, istart, icount, istride, lmask, ivalues, ifield, i2values, i2field, rvalues, rfield, dpvalues, dpfield)
subroutine, public netcdf_get_variable_slice(ncfile, rvalues, dpvalues, ivalues)
subroutine, public netcdf_close_file(ncfile)
integer(c_int), parameter nc_deflate_yes
integer(c_size_t) function nf_return_dimsize(ncfile, idimid)
subroutine nf_define_dimensions(ncfile)
subroutine nf_set_standard_attributes(ncfile, sorigintext, proj4_string, llatlon, fvalidmin, fvalidmax, write_time_bounds)
integer(c_int), parameter nc_double
subroutine nf_get_variable_array_as_vector_short(ncfile, inc_varid, inc_start, inc_count, inc_stride, inc_vars)
integer(c_int), parameter nc_max_vars
subroutine, public netcdf_get_attribute_list_for_variable(ncfile, variable_name, attribute_name_list, attribute_value_list)
integer(c_int), parameter nc_sizehint_default
subroutine nf_set_iteration_bounds(ncfile)
integer(c_int), parameter, public nc_time
@TODO: implement a more flexible way of tracking variable IDs; presently the code can break if lat an...
subroutine, public netcdf_open_and_prepare_for_merging(ncfile, sfilename, guess_z_var_name)
subroutine nf_calculate_time_range(ncfile)
subroutine, public netcdf_open_file(ncfile, sfilename, ilu)
integer(c_int), parameter, public nc_lon
integer(c_int), parameter nc_share
subroutine, public netcdf_open_and_prepare_as_input(ncfile, sfilename, lfliphorizontal, lflipvertical, lallowautomaticdataflipping, rx_coord_addoffset, ry_coord_addoffset, svariableorder, svarname_x, svarname_y, svarname_z, svarname_time, rcoordinatetolerance, tgridbounds, ilu)
real(c_float), parameter, public nc_fill_float
subroutine nf_put_attribute(ncfile, ivarid, sattributename, sattributevalue, iattributevalue, rattributevalue, dpattributevalue)
subroutine nf_get_scale_and_offset(ncfile)
character(len=25), dimension(4), parameter netcdf_format_string
subroutine nf_get_time_units(ncfile)
character(len=256) function nf_return_attvalue(ncfile, ivarindex, sattname)
integer(c_int), parameter nc_long
real(c_double) function nf_dayvalue_to_julian_day(ncfile, rdayvalue)
integer(c_int), parameter nc_nowrite
integer(c_int), parameter nc_shuffle_yes
integer(c_int), parameter nc_format_netcdf4
subroutine nf_redef(ncfile)
integer(c_int) function nf_define_variable(ncfile, svariablename, ivariabletype, inumberofdimensions, idimids)
subroutine nf_trap(iresultcode, sfilename, ilinenumber, netcdf_filename)
integer(c_int), parameter nc_classic_model
subroutine nf_enddef(ncfile)
subroutine nf_get_time_vals(ncfile)
subroutine nf_set_start_count_stride(ncfile)
integer(c_int), parameter nc_uint
logical(c_bool) function, public netcdf_date_within_range(ncfile, ijulianday)
integer(c_int), parameter, public nc_aux
subroutine nf_populate_variable_struct(ncfile)
subroutine nf_set_z_variable_name(ncfile, svarname_z)
integer(c_int), parameter nc_format_classic
integer(c_int) function nf_return_dimindex(ncfile, idimid)
integer(c_int), parameter nc_nat
integer(c_int), parameter nc_ubyte
subroutine nf_get_variable_vector_double(ncfile, inc_varid, inc_start, inc_count, inc_stride, dpnc_vars)
integer(c_int), parameter nc_unlimited
subroutine nf_get_variable_slice_int(ncfile, ivalues)
subroutine nf_set_standard_variables(ncfile, svarname_z, llatlon, write_time_bounds)
real(c_double) function, dimension(0:1) nf_get_first_and_last(ncfile, ivarindex)
subroutine nf_get_variable_vector_short(ncfile, inc_varid, inc_start, inc_count, inc_stride, inc_vars)
integer(c_int), parameter nc_write
integer(c_int), parameter nc_deflate_no
subroutine nf_get_xyz_units(ncfile)
subroutine nf_put_attributes(ncfile)
subroutine nf_delete_attribute(ncfile, svariablename, sattributename)
subroutine nf_get_variable_slice_float(ncfile, rvalues)
subroutine nf_populate_attribute_struct(ncfile, pnc_att, inc_varid, iattnum)
integer(c_int) function nf_return_varid(ncfile, ivarindex)
integer(c_int), parameter, public nc_lat
subroutine nf_set_global_attributes(ncfile, sdatatype, executable_name, history_list, ssourcefile)
subroutine nf_define_deflate(ncfile, ivarid, ishuffle, ideflate, ideflate_level)
subroutine nf_set_standard_dimensions(ncfile, inx, iny, write_time_bounds)
integer(c_int), parameter nc_global
integer(c_int), public nc_time_bnds
subroutine nf_define_variables(ncfile)
integer(c_int), parameter nc_fill
subroutine nf_open_file(ncfile, sfilename, ilu)
integer(c_int), parameter, public nc_left
subroutine, public netcdf_put_variable_array(ncfile, ivarid, istart, icount, istride, ivalues, i2values, rvalues, dpvalues)
subroutine nf_get_variable_array_as_vector_int(ncfile, inc_varid, inc_start, inc_count, inc_stride, inc_vars)
subroutine, public netcdf_put_variable_vector(ncfile, ivarid, istart, icount, istride, ivalues, i2values, rvalues, dpvalues)
subroutine nf_get_variable_vector_int(ncfile, inc_varid, inc_start, inc_count, inc_stride, inc_vars)
integer(c_int) function nf_return_dimid(ncfile, idimindex)
subroutine, public netcdf_open_and_prepare_as_output_archive(ncfile, ncfile_archive, ioriginmonth, ioriginday, ioriginyear, istartyear, iendyear)
integer(c_int), public nc_readonly
subroutine nf_create(ncfile, sfilename, ilu)
integer(c_int), parameter nc_clobber
subroutine nf_get_variable_array_as_vector_double(ncfile, inc_varid, inc_start, inc_count, inc_stride, dpnc_vars)
subroutine, public netcdf_get_variable_list(ncfile, variable_list)
integer(c_int), parameter nc_noclobber
subroutine nf_get_x_and_y(ncfile)
logical(c_bool) function, public netcdf_update_time_starting_index(ncfile, ijulianday)
integer(c_size_t) function, dimension(2), public netcdf_coord_to_col_row(ncfile, rx, ry)
integer(c_int), parameter, public nc_z
integer(c_int), parameter nc_align_chunk
integer(c_int), parameter nc_last
integer(c_int), parameter, public nc_float
integer(c_int), parameter nc_format_netcdf4_classic
subroutine nf_return_native_coord_bounds(ncfile)
subroutine, public netcdf_get_variable_id_for_variable(ncfile, variable_name, variable_id)
integer(c_int), parameter nc_by
subroutine nf_get_variable_array_short(ncfile, inc_varid, inc_start, inc_count, inc_stride, inc_vars)
integer(c_int), parameter nc_uint64
integer(c_int), parameter nc_strict_nc3
integer(c_int), parameter noleap_year
subroutine, public netcdf_rewrite_attribute(ncfile, svariablename, sattributename, sattributevalue, iattributevalue, rattributevalue, dpattributevalue)
subroutine, public netcdf_deallocate_data_struct(ncfile)
integer(c_int), parameter leap_year
integer(c_int), parameter nc_nofill
integer(c_size_t) function nf_julian_day_to_index_adj(ncfile, rjulianday)
subroutine nf_put_lat_and_lon(ncfile, dplat, dplon)
subroutine nf_get_variable_array_float(ncfile, inc_varid, inc_start, inc_count, inc_stride, rnc_vars)
integer(c_int), parameter nc_na_int
Provides Fortran interfaces to the NetCDF C API. This approach is much more straightforward than usin...
subroutine, public create_attributes_from_proj4_string(proj4_string, attribute_name_list, attribute_value_list)