24 USE iso_c_binding,
ONLY: c_int, c_float, c_double, c_ptr, c_size_t,c_char
32 Integer(C_INT) Function create_metadata_c(xyzdim,vdctype) bind(C)
34 Integer(C_SIZE_T),
Intent(IN) :: xyzdim(3)
35 Integer(C_INT),
Intent(IN),
VALUE :: vdctype
36 End Function create_metadata_c
38 Integer(C_INT) Function create_writer_c(filename) bind(C)
40 Character(C_CHAR),
Intent(IN) :: filename
41 End Function create_writer_c
43 Integer(C_INT) Function create_metadata_from_file_c(filename) bind(C)
45 Character(C_CHAR),
Intent(IN) :: filename
46 End Function create_metadata_from_file_c
48 Integer(C_INT) Function set_num_timesteps_c(ntime ) bind(C)
50 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ntime
51 end Function set_num_timesteps_c
54 Integer(C_INT) Function set_variables_names_c(nvar, varnames, len ) bind(C)
56 Integer(C_SIZE_T),
Intent(IN),
VALUE :: nvar
57 Character(C_CHAR),
Intent(IN) :: varnames(nvar)
58 Integer(C_SIZE_T),
Intent(IN),
VALUE :: len
59 end Function set_variables_names_c
61 Integer(C_INT) function vdf4f_set_comment_c(comment) bind(C)
63 Character(C_CHAR),
Intent(IN) :: comment
64 end function vdf4f_set_comment_c
66 Integer(C_INT) function vdf4f_set_ts_comment_c(ts,comment) bind(C)
68 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ts
69 Character(C_CHAR),
Intent(IN) :: comment
70 end function vdf4f_set_ts_comment_c
72 Integer(C_INT) function vdf4f_set_v_comment_c(ts,var,comment) bind(C)
74 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ts
75 Character(C_CHAR),
Intent(IN) :: var
76 Character(C_CHAR),
Intent(IN) :: comment
77 end function vdf4f_set_v_comment_c
79 Integer(C_INT) function vdf4f_set_grid_extents_c(extents) bind(C)
81 Real(C_DOUBLE),
Intent(IN) :: extents(6)
82 end function vdf4f_set_grid_extents_c
84 Integer(C_INT) function vdf4f_set_coord_system_type_c(coordsystemtype) bind(C)
86 Character(C_CHAR),
Intent(IN) :: coordsystemtype
87 end function vdf4f_set_coord_system_type_c
89 Integer(C_INT) function vdf4f_set_grid_type_c(gridtype) bind(C)
91 Character(C_CHAR),
Intent(IN) :: gridtype
92 end function vdf4f_set_grid_type_c
94 Integer(C_INT) function vdf4f_set_map_projection_c(mapprojection) bind(C)
96 Character(C_CHAR),
Intent(IN) :: mapprojection
97 end function vdf4f_set_map_projection_c
101 Integer(C_INT) function write_metadata_c(filename) bind(C)
103 Character(C_CHAR),
Intent(IN) :: filename
104 end function write_metadata_c
106 Integer(C_INT) Function vdf4f_write_c(volume, xyzdim, ntime,nvar,varnames,len, rzscan) bind(C)
108 Integer(C_SIZE_T),
Intent(IN) :: xyzdim(3)
109 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ntime
110 Integer(C_SIZE_T),
Intent(IN),
VALUE :: nvar
111 Real(C_FLOAT),
Intent(IN) :: volume(xyzdim(1),xyzdim(2),xyzdim(3),ntime,nvar)
112 Character(C_CHAR),
Intent(IN) :: varnames(nvar)
113 Integer(C_SIZE_T),
Intent(IN),
VALUE :: len
114 Integer(C_INT),
Intent(IN),
VALUE :: rzscan
115 End Function vdf4f_write_c
117 Integer(C_INT) function destroy_metadata_c() bind(C)
119 end function destroy_metadata_c
121 Integer(C_INT) function destroy_writer_c() bind(C)
123 end function destroy_writer_c
125 Integer(C_INT) function get_err_msg_c(errmsg,len) bind(C)
127 Character(C_CHAR),
Intent(OUT) :: errmsg
128 Integer(C_SIZE_T),
Intent(OUT) :: len
129 end function get_err_msg_c
131 Integer(C_INT) function set_missing_value_c(missingv ) bind(C)
133 Real(C_DOUBLE),
VALUE :: missingv
134 end function set_missing_value_c
136 Integer(C_INT) function get_missing_value_c(missingv ) bind(C)
138 Real(C_DOUBLE),
Intent(OUT) :: missingv
139 end function get_missing_value_c
141 Integer(C_INT) Function set_variables_2d_xy_c(nvar, varnames, len ) bind(C)
143 Integer(C_SIZE_T),
Intent(IN),
VALUE :: nvar
144 Character(C_CHAR),
Intent(IN) :: varnames(nvar)
145 Integer(C_SIZE_T),
Intent(IN),
VALUE :: len
146 end Function set_variables_2d_xy_c
149 Integer(C_INT) Function vdf4f_write_2d_xy_c(volume, xydim, ntime,nvar,varnames,len) bind(C)
151 Integer(C_SIZE_T),
Intent(IN) :: xydim(2)
152 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ntime
153 Integer(C_SIZE_T),
Intent(IN),
VALUE :: nvar
154 Real(C_FLOAT),
Intent(IN) :: volume(xydim(1),xydim(2),ntime,nvar)
155 Character(C_CHAR),
Intent(IN) :: varnames(nvar)
156 Integer(C_SIZE_T),
Intent(IN),
VALUE :: len
157 End Function vdf4f_write_2d_xy_c
161 public vdf4f_write, vdf4f_create_metadata, vdf4f_create_metadata_from_file, vdf4f_create_writer,&
162 vdf4f_set_num_timesteps, vdf4f_set_variables_names, &
163 vdf4f_set_comment, vdf4f_set_ts_comment, vdf4f_set_v_comment, vdf4f_set_grid_extents, &
164 vdf4f_set_coord_system_type, vdf4f_set_grid_type, &
165 vdf4f_set_map_projection, vdf4f_write_metadata, destroy_metadata_c, destroy_writer_c, vdf4f_get_err_msg, &
166 vdf4f_set_missing_value, vdf4f_get_missing_value, vdf4f_set_variables_2d_xy, vdf4f_write_2d_xy
171 #if SIZEOF_SIZE_T == 8 172 module procedure vdf4f_write_amd64
174 module procedure vdf4f_write_i386
178 interface vdf4f_create_metadata
179 #if SIZEOF_SIZE_T == 8 180 module procedure create_metadata_amd64
182 module procedure create_metadata_i386
186 interface vdf4f_set_num_timesteps
187 #if SIZEOF_SIZE_T == 8 188 module procedure set_num_timesteps_amd64
190 module procedure set_num_timesteps_i386
193 interface vdf4f_set_variables_names
194 #if SIZEOF_SIZE_T == 8 195 module procedure set_variables_names_amd64
197 module procedure set_variables_names_i386
200 interface vdf4f_set_ts_comment
201 #if SIZEOF_SIZE_T == 8 202 module procedure vdf4f_set_ts_comment_amd64
204 module procedure vdf4f_set_ts_comment_i386
208 interface vdf4f_set_v_comment
209 #if SIZEOF_SIZE_T == 8 210 module procedure vdf4f_set_v_comment_amd64
212 module procedure vdf4f_set_v_comment_i386
215 interface vdf4f_set_variables_2d_xy
216 #if SIZEOF_SIZE_T == 8 217 module procedure set_variables_2d_xy_amd64
219 module procedure set_variables_2d_xy_i386
223 interface vdf4f_write_2d_xy
224 #if SIZEOF_SIZE_T == 8 225 module procedure vdf4f_write_2d_xy_amd64
227 module procedure vdf4f_write_2d_xy_i386
228 end interface vdf4f_write_2d_xy
233 integer function vdf4f_write_i386(volume, xyzdim, ntime,nvar,varnames, rzscan)
235 Real,
intent(in) :: volume(:,:,:,:,:)
236 Integer(C_SIZE_T),
intent(in) :: xyzdim(3)
237 integer(C_SIZE_T),
intent(in) :: nvar, ntime
238 Character(len=*),
intent(in) :: varnames(nvar)
239 Integer,
intent(in) :: rzscan
245 integer(C_SIZE_T) :: len_c
246 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
247 integer(C_SIZE_T) :: i
253 len_c=len(varnames)+1
255 varnames_c(i)=trim(varnames(i))//char(0)
258 vdf4f_write_i386 = vdf4f_write_c(volume, xyzdim, ntime, nvar, varnames_c, len_c, rzscan)
262 end function vdf4f_write_i386
265 integer function vdf4f_write_amd64(volume, xyzdim, ntime,nvar,varnames,rzscan)
268 Real,
intent(in) :: volume(:,:,:,:,:)
269 Integer,
intent(in) :: xyzdim(3)
270 Integer,
intent(in) :: nvar,ntime
271 Character(len=*),
intent(in) :: varnames(nvar)
272 integer,
intent(in) :: rzscan
275 Integer(C_SIZE_T) :: nvar_c
276 Integer(C_SIZE_T) :: xyzdim_c(3)
277 Integer(C_SIZE_T) :: ntime_c
278 Integer(C_SIZE_T) :: len_c
279 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
287 len_c=len(varnames)+1
289 varnames_c(i)=trim(varnames(i))//char(0)
292 vdf4f_write_amd64 = vdf4f_write_c(volume, xyzdim_c, ntime_c, nvar_c, varnames_c, len_c, rzscan)
296 end function vdf4f_write_amd64
300 Integer Function create_metadata_i386(xyzdim, vdctype)
301 Integer(C_SIZE_T),
intent(in) :: xyzdim(3)
302 Integer(C_INT),
Intent(IN),
VALUE :: vdctype
304 create_metadata_i386 = create_metadata_c(xyzdim, vdctype)
305 End Function create_metadata_i386
307 Integer Function create_metadata_amd64(xyzdim, vdctype)
308 Integer,
intent(in) :: xyzdim(3)
309 Integer(C_INT),
Intent(IN),
VALUE :: vdctype
310 Integer(C_SIZE_T) :: xyzdim_c(3)
312 create_metadata_amd64 = create_metadata_c(xyzdim_c,vdctype)
313 End Function create_metadata_amd64
315 Integer function vdf4f_create_metadata_from_file(filename)
316 Character(len=*),
Intent(IN) :: filename
317 vdf4f_create_metadata_from_file = create_metadata_from_file_c(trim(filename)//char(0))
318 end function vdf4f_create_metadata_from_file
320 Integer function vdf4f_create_writer(filename)
321 Character(len=*),
Intent(IN) :: filename
322 vdf4f_create_writer = create_writer_c(trim(filename)//char(0))
323 end function vdf4f_create_writer
325 Integer Function set_num_timesteps_i386(ntime )
326 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ntime
327 set_num_timesteps_i386 = set_num_timesteps_c(ntime)
328 end Function set_num_timesteps_i386
330 Integer Function set_num_timesteps_amd64(ntime )
331 Integer,
Intent(IN) :: ntime
332 Integer(C_SIZE_T) :: ntime_c
334 set_num_timesteps_amd64 = set_num_timesteps_c(ntime_c)
335 end Function set_num_timesteps_amd64
338 Integer Function set_variables_names_i386(nvar, varnames)
339 Integer(C_SIZE_T),
Intent(IN),
VALUE :: nvar
340 Character(len=*),
Intent(IN) :: varnames(nvar)
342 integer(C_SIZE_T) :: len_c
343 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
344 integer(C_SIZE_T) :: i
346 len_c=len(varnames)+1
348 varnames_c(i)=trim(varnames(i))//char(0)
351 set_variables_names_i386 = set_variables_names_c(nvar, varnames_c, len_c)
353 end Function set_variables_names_i386
355 Integer Function set_variables_names_amd64(nvar, varnames)
357 Integer(C_SIZE_T) :: nvar_c
358 Character(len=*),
Intent(IN) :: varnames(nvar)
360 integer(C_SIZE_T) :: len_c
361 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
364 len_c=len(varnames)+1
366 varnames_c(i)=trim(varnames(i))//char(0)
371 set_variables_names_amd64 = set_variables_names_c(nvar_c, varnames_c, len_c)
373 end Function set_variables_names_amd64
376 Integer function vdf4f_set_comment(comment)
377 Character(len=*),
intent(in) :: comment
378 vdf4f_set_comment = vdf4f_set_comment_c(trim(comment)//char(0))
379 end function vdf4f_set_comment
381 Integer function vdf4f_set_ts_comment_i386(ts,comment)
382 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ts
383 Character(len=*),
intent(in) :: comment
384 vdf4f_set_ts_comment_i386 = vdf4f_set_ts_comment_c(ts,trim(comment)//char(0))
385 end function vdf4f_set_ts_comment_i386
388 Integer function vdf4f_set_ts_comment_amd64(ts,comment)
390 Integer(C_SIZE_T) :: ts_c
391 Character(len=*),
intent(in) :: comment
393 vdf4f_set_ts_comment_amd64 = vdf4f_set_ts_comment_c(ts_c,trim(comment)//char(0))
394 end function vdf4f_set_ts_comment_amd64
397 Integer function vdf4f_set_v_comment_i386(ts,var,comment)
398 Integer(C_SIZE_T),
Intent(IN),
VALUE :: ts
399 Character(len=*),
intent(in) :: var
400 Character(len=*),
intent(in) :: comment
401 vdf4f_set_v_comment_i386 = vdf4f_set_v_comment_c(ts, trim(var)//char(0), trim(comment)//char(0))
402 end function vdf4f_set_v_comment_i386
404 Integer function vdf4f_set_v_comment_amd64(ts,var,comment)
406 Integer(C_SIZE_T) :: ts_c
407 Character(len=*),
intent(in) :: var
408 Character(len=*),
intent(in) :: comment
412 vdf4f_set_v_comment_amd64 = vdf4f_set_v_comment_c(ts_c, trim(var)//char(0), trim(comment)//char(0))
413 end function vdf4f_set_v_comment_amd64
415 Integer function vdf4f_set_grid_extents(extents)
416 Doubleprecision,
Intent(IN) :: extents(6)
417 vdf4f_set_grid_extents = vdf4f_set_grid_extents_c(extents)
418 end function vdf4f_set_grid_extents
420 Integer function vdf4f_set_coord_system_type(coordsystemtype)
421 Character(len=*),
Intent(IN) :: coordsystemtype
422 vdf4f_set_coord_system_type = vdf4f_set_coord_system_type_c(trim(coordsystemtype)//char(0))
423 end function vdf4f_set_coord_system_type
425 Integer function vdf4f_set_grid_type(gridtype)
426 Character(len=*),
Intent(IN) :: gridtype
427 vdf4f_set_grid_type = vdf4f_set_grid_type_c(trim(gridtype)//char(0))
428 end function vdf4f_set_grid_type
430 Integer function vdf4f_set_map_projection(mapprojection)
431 Character(len=*),
Intent(IN) :: mapprojection
432 vdf4f_set_map_projection = vdf4f_set_map_projection_c(trim(mapprojection)//char(0))
433 end function vdf4f_set_map_projection
436 function vdf4f_get_err_msg()
438 integer,
parameter :: lenfun=255
439 character(len=lenfun) :: vdf4f_get_err_msg
440 Integer(C_SIZE_T) :: len
441 Character(len=lenfun) :: errmsg
446 ier = get_err_msg_c(errmsg,len)
447 vdf4f_get_err_msg=errmsg(:min(len,lenfun))
450 end function vdf4f_get_err_msg
453 Integer function vdf4f_write_metadata(filename)
454 Character(len=*),
Intent(IN) :: filename
455 vdf4f_write_metadata = write_metadata_c(trim(filename)//char(0))
456 end function vdf4f_write_metadata
459 Integer function vdf4f_set_missing_value(missingv)
460 doubleprecision,
Intent(IN) :: missingv
461 vdf4f_set_missing_value = set_missing_value_c(missingv)
462 end function vdf4f_set_missing_value
464 Integer function vdf4f_get_missing_value(missingv)
465 doubleprecision,
Intent(OUT) :: missingv
466 vdf4f_get_missing_value = get_missing_value_c(missingv)
467 end function vdf4f_get_missing_value
470 Integer Function set_variables_2d_xy_i386(nvar, varnames)
471 Integer(C_SIZE_T),
Intent(IN),
VALUE :: nvar
472 Character(len=*),
Intent(IN) :: varnames(nvar)
474 integer(C_SIZE_T) :: len_c
475 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
476 integer(C_SIZE_T) :: i
478 len_c=len(varnames)+1
480 varnames_c(i)=trim(varnames(i))//char(0)
483 set_variables_2d_xy_i386 = set_variables_2d_xy_c(nvar, varnames_c, len_c)
485 end Function set_variables_2d_xy_i386
487 Integer Function set_variables_2d_xy_amd64(nvar, varnames)
489 Integer(C_SIZE_T) :: nvar_c
490 Character(len=*),
Intent(IN) :: varnames(nvar)
492 integer(C_SIZE_T) :: len_c
493 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
496 len_c=len(varnames)+1
498 varnames_c(i)=trim(varnames(i))//char(0)
503 set_variables_2d_xy_amd64 = set_variables_2d_xy_c(nvar_c, varnames_c, len_c)
505 end Function set_variables_2d_xy_amd64
509 integer function vdf4f_write_2d_xy_i386(volume, xydim, ntime,nvar,varnames)
511 Real,
intent(in) :: volume(:,:,:,:)
512 Integer(C_SIZE_T),
intent(in) :: xydim(2)
513 integer(C_SIZE_T),
intent(in) :: nvar, ntime
514 Character(len=*),
intent(in) :: varnames(nvar)
519 integer(C_SIZE_T) :: len_c
520 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
521 integer(C_SIZE_T) :: i
527 len_c=len(varnames)+1
529 varnames_c(i)=trim(varnames(i))//char(0)
532 vdf4f_write_2d_xy_i386 = vdf4f_write_2d_xy_c(volume, xydim, ntime, nvar, varnames_c, len_c)
536 end function vdf4f_write_2d_xy_i386
539 integer function vdf4f_write_2d_xy_amd64(volume, xydim, ntime,nvar,varnames)
541 Real,
intent(in) :: volume(:,:,:,:)
542 Integer,
intent(in) :: xydim(2)
543 Integer,
intent(in) :: nvar,ntime
544 Character(len=*),
intent(in) :: varnames(nvar)
546 Integer(C_SIZE_T) :: nvar_c
547 Integer(C_SIZE_T) :: xydim_c(2)
548 Integer(C_SIZE_T) :: ntime_c
549 Integer(C_SIZE_T) :: len_c
550 Character(len=LEN(varnames)+1) :: varnames_c(nvar)
557 len_c=len(varnames)+1
559 varnames_c(i)=trim(varnames(i))//char(0)
562 vdf4f_write_2d_xy_amd64 = vdf4f_write_2d_xy_c(volume, xydim_c, ntime_c, nvar_c, varnames_c, len_c)
566 end function vdf4f_write_2d_xy_amd64
interface to different architectures (cast some type)