7 TYPE(
fimexio) :: fio, finter, finter2, frw
9 CHARACTER(LEN=80) :: input_file
10 CHARACTER(LEN=80) :: config_file
11 CHARACTER(LEN=80) :: varname
12 REAL(KIND=8),
DIMENSION(:),
ALLOCATABLE,
TARGET :: field
13 REAL(KIND=8),
DIMENSION(:,:,:,:),
POINTER :: field4d
14 REAL(KIND=8),
DIMENSION(:,:,:),
POINTER :: field3d
15 REAL(KIND=8),
DIMENSION(:),
TARGET,
ALLOCATABLE :: lonvals
16 REAL(KIND=8),
DIMENSION(:),
TARGET,
ALLOCATABLE :: latvals
20 INTEGER(KIND=4),
ALLOCATABLE,
DIMENSION(:) :: start, vsize, atypes
21 INTEGER(KIND=8) :: vars
22 CHARACTER(LEN=10) :: cunit,cfiletype
23 CHARACTER(LEN=1024) :: dimname
26 IF (( command_argument_count() /= 4 ) .AND. ( command_argument_count() /= 5 ))
THEN 27 WRITE(*,*)
"Usage: ./fortran_test input-file file-type variable unit [config]" 28 WRITE(*,*)
"Example ./fortran_test /opdata/arome_norway25/AROME_Norway25_00.nc netcdf surface_air_pressure hPa" 29 WRITE(*,*)
" ./fortran_test /opdata/arome_norway25/preprod/AROME_Norway25_00.dat felt surface_air_pressure "//&
30 "hPa ~/metop/arome_norway25/etc/AromeFeltReaderConfig.xml" 32 CALL get_command_argument(1,input_file)
33 CALL get_command_argument(2,cfiletype)
34 CALL get_command_argument(3,varname)
35 CALL get_command_argument(4,cunit)
36 IF ( command_argument_count() == 5 )
THEN 37 CALL get_command_argument(5,config_file)
43 ierr=fio%open(input_file,config_file,
set_filetype(cfiletype))
44 IF ( ierr /= 0 )
CALL error(
"Can't make io-object with file:"//trim(input_file)//
" config: "//config_file)
45 WRITE(0,*)
"open_file: success" 47 write(*,*)
"refTime = ", fio%get_refTime(
'days since 2013-01-01 00:00:00 +0000'),
" days since 2013-01-01" 49 write(*,*)
"unlimited dimension = ", trim(fio%file_ulim_dimname())
51 write(*,*)
"dimensions" 52 DO i = 1, fio%dimensions_size()
53 write(*,*) i,
" ", trim(fio%file_dimname(i)), fio%get_dimsize(fio%file_dimname(i))
56 write(*,*)
"variables" 57 DO i = 1, fio%variables_size()
58 write(*,*) i,
" ", trim(fio%get_varname(i)),
" (", trim(fio%get_var_longitude(fio%get_varname(i))),
",",&
59 trim(fio%get_var_latitude(fio%get_varname(i))),
")", &
60 fio%get_vartype(fio%get_varname(i))
64 ndims=fio%get_dimensions(varname)
65 IF ( ndims <= 0 )
CALL error(
"Can't make slicebuilder")
66 WRITE(0,*)
"get_dimensions: ", ndims
68 ALLOCATE(start(ndims))
69 ALLOCATE(vsize(ndims))
70 ierr = fio%get_dimension_start_size(start, vsize)
72 WRITE(*,*)
"dimname ", i,
": ", trim(fio%get_dimname(i)), vsize(i)
74 ALLOCATE(atypes(ndims))
75 ierr = fio%get_axistypes(atypes)
80 SELECT CASE (atypes(i))
81 CASE(axis_geox, axis_lon)
83 CASE(axis_geoy, axis_lat)
86 WRITE(*,*)
"reducind dimension ", i,
" ",trim(fio%get_dimname(i))
87 ierr=fio%reduce_dimension(fio%get_dimname(i), 0, 1)
90 WRITE(*,*)
"end reduce" 91 ALLOCATE(field(nx*ny))
92 ierr=fio%read(varname,field,cunit)
93 field4d(1:nx,1:ny,1:1,1:1) => field
95 CALL error(
"Can't read field")
98 WRITE(*,*) field4d(i,1,1,1)
103 ALLOCATE(field(vsize(1)*vsize(2)))
104 field3d(1:vsize(1),1:vsize(2),1:1) => field
105 ierr=fio%read(varname,field,cunit)
106 IF ( ierr /= 0 )
THEN 107 CALL error(
"Can't read field")
110 WRITE(*,*) field3d(i,1,1)
119 WRITE(*,*)
"method ", interpol_bilinear
120 ierr = finter%interpolate(fio, interpol_bilinear,
"+proj=latlon +datum=WGS84",
"8,9,...,12",
"58,59,...,62", .true.)
121 IF ( ierr /= 0 )
THEN 122 CALL error(
"Can't interpolate file")
125 ndims=finter%get_dimensions(varname)
126 IF ( ndims <= 0 )
CALL error(
"Can't make slicebuilder for interpol")
127 WRITE(0,*)
"inter-get_dimensions: ", ndims
129 ALLOCATE(start(ndims))
130 ALLOCATE(vsize(ndims))
131 ierr = finter%get_dimension_start_size(start, vsize)
132 ALLOCATE(atypes(ndims))
133 ierr = finter%get_axistypes(atypes)
138 SELECT CASE (atypes(i))
139 CASE(axis_geox, axis_lon)
141 CASE(axis_geoy, axis_lat)
144 WRITE(*,*)
"reducind dimension ", i,
" ",trim(finter%get_dimname(i))
145 ierr=finter%reduce_dimension(finter%get_dimname(i), 0, 1)
148 WRITE(*,*)
"end reduce" 149 ALLOCATE(field(nx*ny))
150 ierr=finter%read(varname,field,cunit)
151 field4d(1:nx,1:ny,1:1,1:1) => field
152 IF ( ierr /= 0 )
THEN 153 CALL error(
"Can't read field")
159 ndims=finter%get_dimensions(
'x')
161 ierr=finter%read(
'x',field)
162 IF ( ierr /= 0 )
THEN 163 CALL error(
"Can't read field x/latitude")
181 WRITE(*,*)
"method ", interpol_bilinear
182 ierr = finter2%interpolate_lonlat(fio, interpol_bilinear, lonvals, latvals)
183 IF ( ierr /= 0 )
THEN 184 CALL error(
"Can't interpolate file to lonlat")
187 ndims=finter2%get_dimensions(varname)
188 IF ( ndims <= 0 )
CALL error(
"Can't make slicebuilder for interpol")
189 WRITE(0,*)
"inter-get_dimensions: ", ndims
191 ALLOCATE(start(ndims))
192 ALLOCATE(vsize(ndims))
193 ierr = finter2%get_dimension_start_size(start, vsize)
194 ALLOCATE(atypes(ndims))
195 ierr = finter2%get_axistypes(atypes)
200 SELECT CASE (atypes(i))
201 CASE(axis_geox, axis_lon)
203 CASE(axis_geoy, axis_lat)
206 WRITE(*,*)
"reducind dimension ", i,
" ",trim(finter2%get_dimname(i))
207 ierr=finter2%reduce_dimension(finter2%get_dimname(i), 0, 1)
210 WRITE(*,*)
"end reduce" 211 ALLOCATE(field(nx*ny))
212 ierr=finter2%read(varname,field,cunit)
213 field4d(1:nx,1:ny,1:1,1:1) => field
214 IF ( ierr /= 0 )
THEN 215 CALL error(
"Can't read field")
220 ndims=finter2%get_dimensions(finter2%get_var_longitude(varname))
221 IF ( ndims == 1 )
then 222 WRITE(*,*) trim(varname),
" has longitude as dimension" 224 WRITE(*,*) trim(varname),
" has longitude as coordinates" 225 ierr=finter2%read(finter2%get_var_longitude(varname),field)
226 field4d(1:nx,1:ny,1:1,1:1) => field
227 IF ( ierr /= 0 )
THEN 228 CALL error(
"Can't read field longitude")
235 ierr=frw%open(
"testOut.nc",
"",
set_filetype(
"netcdf",filetype_rw))
236 IF ( ierr /= 0 )
CALL error(
"Can't make rw-object with file: testOut.nc")
237 ndims=frw%get_dimensions(
"pressure")
238 IF ( ndims <= 0 )
CALL error(
"Can't make slicebuilder for pressure in testOut.nc")
239 WRITE(0,*)
"frw-get_dimensions: ", ndims
243 ierr=frw%reduce_dimension(dimname, 0, 1)
245 write(*,*)
"writing data in cunit to t=0: ", cunit
246 ierr=frw%write(
"pressure", field, cunit)
247 IF ( ierr /= 0 )
THEN 248 CALL error(
"Can't write field at t=0")
252 ierr=frw%reduce_dimension(dimname, 1, 1)
254 write(*,*)
"writing data in cunit to t=1: ", cunit
255 ierr=frw%write(
"pressure", field, cunit)
256 IF ( ierr /= 0 )
THEN 257 CALL error(
"Can't write field at t=1")
261 ndims=frw%get_dimensions(
"lon")
267 ierr=frw%write(
"lon", lonvals,
"degrees_east")
268 IF ( ierr /= 0 )
CALL error(
"Can't write lon")
269 ndims=frw%get_dimensions(
"lat")
270 ierr=frw%write(
"lat", latvals,
"degrees_north")
271 IF ( ierr /= 0 )
CALL error(
"Can't write lat")
281 IF ( ierr /= 0 )
CALL error(
"Can't free memory")
286 SUBROUTINE error(error_string)
288 CHARACTER(*),
INTENT(IN) :: error_string
290 WRITE(*,*)
'******** ERROR ***********' 291 WRITE(*,*) error_string
292 WRITE(*,*)
'**************************'