Soil Water Balance (SWB2)
Loading...
Searching...
No Matches
netcdf_c_api_interfaces.F90
Go to the documentation of this file.
1!> @file
2!> This module provides Fortran interfaces to the NetCDF C API.
3
4!> Provides Fortran interfaces to the NetCDF C API. This approach
5!> is much more straightforward than using the old Fortran 90 NetCDF interface,
6!> which was built on top of the Fortran 77 interface, which (finally) was
7!> built atop the C interface.
8!>
9!> @note
10!> old interface code didn't take advantage of the iso_c_binding types
11!> c_size_t or c_prtdiff_t, but rather used pointers (type c_ptr) to
12!> pass by reference. This appears to be unneccessary:
13
14! interface
15! function nc_get_vars_short(ncid, varid, startp, countp, stridep, vars) bind(c)
16!
17! import :: c_int, c_ptr, c_short, c_size_t
18!
19! integer (c_int), value :: ncid, varid
20!
21! integer (c_size_t) :: startp(*)
22! integer (c_size_t) :: countp(*)
23! integer (c_size_t) :: stridep(*)
24
25!!! type (c_ptr), value :: startp
26!!! type (c_ptr), value :: countp
27!!! type (c_ptr), value :: stridep
28! integer (c_short), intent(out) :: vars(*)
29
30! integer (c_int) :: nc_get_vars_short
31
32! end function nc_get_vars_short
33! end interface
34!>
35!> @todo
36!> change "type (c_ptr), value" entries to "integer (c_size_t)"
37!> or similar, depending on the size of the integer declared in the
38!> C code
39
41
42 use iso_c_binding
43
44 implicit none
45
46! supply apparently missing parameter values from Intel implementation of ISO_C_BINDING
47!#ifdef __INTEL_COMPILER
48! integer, parameter :: c_size_t = 8
49! integer, parameter :: c_diff_t = 8
50!#endif
51
52 interface
53 function nc_create(path, cmode, ncidp) bind(c)
54
55 import :: c_char, c_int
56
57 character (c_char), intent(in) :: path(*)
58 integer (c_int), value :: cmode
59 integer (c_int), intent(out) :: ncidp
60
61 integer (c_int) :: nc_create
62
63 end function nc_create
64 end interface
65
66 interface
67 function nc_def_var_deflate(ncid, varid, shuffle, deflate, deflate_level) bind(c)
68
69 import :: c_int
70
71 integer (c_int), value :: ncid
72 integer (c_int), value :: varid
73 integer (c_int), value :: shuffle
74 integer (c_int), value :: deflate
75 integer (c_int), value :: deflate_level
76
77 integer (c_int) :: nc_def_var_deflate
78
79 end function nc_def_var_deflate
80 end interface
81
82 interface
83 function nc_def_var(ncid, name, xtype, ndims, dimidsp, varidp) bind(c)
84
85 import :: c_int, c_char
86
87 integer (c_int), value :: ncid
88 character (c_char), intent(in) :: name(*)
89 integer (c_int), value :: xtype
90 integer (c_int), value :: ndims
91 integer (c_int), intent(in) :: dimidsp(*)
92 integer (c_int), intent(out) :: varidp
93
94 integer (c_int) :: nc_def_var
95
96 end function nc_def_var
97 end interface
98
99 interface
100 function nc_def_dim(ncid, name, lenv, dimidp) bind(c)
101
102 import :: c_int, c_size_t, c_char
103
104 integer (c_int), value :: ncid
105 character (c_char), intent(in) :: name(*)
106 integer (c_size_t), value :: lenv
107 integer (c_int), intent(out) :: dimidp
108
109 integer (c_int) :: nc_def_dim
110
111 end function nc_def_dim
112 end interface
113
114 interface
115 function nc_enddef(ncid) bind(c)
116
117 import :: c_int
118
119 integer (c_int), value :: ncid
120
121 integer (c_int) :: nc_enddef
122
123 end function nc_enddef
124 end interface
125
126
127 interface
128 function nc_redef(ncid) bind(c)
129
130 import :: c_int
131
132 integer (c_int), value :: ncid
133
134 integer (c_int) :: nc_redef
135
136 end function nc_redef
137 end interface
138
139
140 interface
141 function nc_get_var_short(ncid, varid, sp) bind(c)
142
143 import :: c_int, c_short
144
145 integer (c_int), value :: ncid, varid
146 integer (c_short), intent(out) :: sp(*)
147
148 integer (c_int) :: nc_get_var_short
149
150 end function nc_get_var_short
151 end interface
152
153 interface
154 function nc_put_var_short(ncid, varid, sp) bind(c)
155
156 import :: c_int, c_short
157
158 integer (c_int), value :: ncid, varid
159 integer (c_short), intent(in) :: sp(*)
160
161 integer (c_int) :: nc_put_var_short
162
163 end function nc_put_var_short
164 end interface
165
166
167 interface
168 function nc_get_var_int(ncid, varid, ip) bind(c)
169
170 import :: c_int
171
172 integer (c_int), value :: ncid, varid
173 integer (c_int), intent(out) :: ip(*)
174
175 integer (c_int) :: nc_get_var_int
176
177 end function nc_get_var_int
178 end interface
179
180 interface
181 function nc_put_var_int(ncid, varid, ip) bind(c)
182
183 import :: c_int
184
185 integer (c_int), value :: ncid, varid
186 integer (c_int), intent(in) :: ip(*)
187
188 integer (c_int) :: nc_put_var_int
189
190 end function nc_put_var_int
191 end interface
192
193
194 interface
195 function nc_get_var_float(ncid, varid, rp) bind(c)
196
197 import :: c_int, c_float
198
199 integer (c_int), value :: ncid, varid
200 real (c_float), intent(out) :: rp(*)
201
202 integer (c_int) :: nc_get_var_float
203
204 end function nc_get_var_float
205 end interface
206
207 interface
208 function nc_put_var_float(ncid, varid, rp) bind(c)
209
210 import :: c_int, c_float
211
212 integer (c_int), value :: ncid, varid
213 real (c_float), intent(in) :: rp(*)
214
215 integer (c_int) :: nc_put_var_float
216
217 end function nc_put_var_float
218 end interface
219
220
221 interface
222 function nc_get_var_double(ncid, varid, dp) bind(c)
223
224 import :: c_int, c_double
225
226 integer (c_int), value :: ncid, varid
227 real (c_double), intent(out) :: dp(*)
228
229 integer (c_int) :: nc_get_var_double
230
231 end function nc_get_var_double
232 end interface
233
234 interface
235 function nc_put_var_double(ncid, varid, dp) bind(c)
236
237 import :: c_int, c_double
238
239 integer (c_int), value :: ncid, varid
240 real (c_double), intent(in) :: dp(*)
241
242 integer (c_int) :: nc_put_var_double
243
244 end function nc_put_var_double
245 end interface
246
247
248 interface
249 function nc_get_vars_short(ncid, varid, startp, countp, stridep, vars) bind(c)
250
251 import :: c_int, c_ptr, c_short, c_size_t
252
253 integer (c_int), value :: ncid, varid
254
255 integer (c_size_t) :: startp(*)
256 integer (c_size_t) :: countp(*)
257 integer (c_size_t) :: stridep(*)
258
259! type (c_ptr), value :: startp
260! type (c_ptr), value :: countp
261! type (c_ptr), value :: stridep
262 integer (c_short), intent(out) :: vars(*)
263
264 integer (c_int) :: nc_get_vars_short
265
266 end function nc_get_vars_short
267 end interface
268
269 interface
270 function nc_put_vars_short(ncid, varid, startp, countp, stridep, vars) bind(c)
271
272 import :: c_int, c_size_t, c_short
273
274 integer (c_int), value :: ncid, varid
275! type(c_ptr), value :: startp, countp, stridep
276 integer (c_size_t) :: startp(*)
277 integer (c_size_t) :: countp(*)
278 integer (c_size_t) :: stridep(*)
279
280 integer (c_short), intent(in) :: vars(*)
281
282 integer (c_int) :: nc_put_vars_short
283
284 end function nc_put_vars_short
285 end interface
286
287
288 interface
289 function nc_get_vars_int(ncid, varid, startp, countp, stridep, vars) bind(c)
290
291 import :: c_int, c_size_t
292
293 integer (c_int), value :: ncid, varid
294! type (c_ptr), value :: startp
295! type (c_ptr), value :: countp
296! type (c_ptr), value :: stridep
297 integer (c_size_t) :: startp(*)
298 integer (c_size_t) :: countp(*)
299 integer (c_size_t) :: stridep(*)
300
301 integer (c_int), intent(out) :: vars(*)
302
303 integer (c_int) :: nc_get_vars_int
304
305 end function nc_get_vars_int
306 end interface
307
308 interface
309 function nc_put_vars_int(ncid, varid, startp, countp, stridep, vars) bind(c)
310
311 import :: c_int, c_size_t
312
313 integer (c_int), value :: ncid, varid
314! type (c_ptr), value :: startp, countp, stridep
315 integer (c_size_t) :: startp(*)
316 integer (c_size_t) :: countp(*)
317 integer (c_size_t) :: stridep(*)
318
319 integer (c_int), intent(in) :: vars(*)
320
321 integer (c_int) :: nc_put_vars_int
322
323 end function nc_put_vars_int
324 end interface
325
326
327
328
329 interface
330 function nc_get_vars_float(ncid, varid, startp, countp, stridep, vars) bind(c)
331
332 import :: c_int, c_size_t, c_float
333
334 integer (c_int), value :: ncid, varid
335! type (c_ptr), value :: startp
336! type (c_ptr), value :: countp
337! type (c_ptr), value :: stridep
338
339 integer (c_size_t) :: startp(*)
340 integer (c_size_t) :: countp(*)
341 integer (c_size_t) :: stridep(*)
342
343 real (c_float), intent(out) :: vars(*)
344
345 integer (c_int) :: nc_get_vars_float
346
347 end function nc_get_vars_float
348 end interface
349
350 interface
351 function nc_put_vars_float(ncid, varid, startp, countp, stridep, vars) bind(c)
352
353 import :: c_int, c_float, c_size_t
354
355 integer (c_int), value :: ncid, varid
356! type(c_ptr), value :: startp, countp, stridep
357 integer (c_size_t) :: startp(*)
358 integer (c_size_t) :: countp(*)
359 integer (c_size_t) :: stridep(*)
360
361 real (c_float), intent(in) :: vars(*)
362
363 integer (c_int) :: nc_put_vars_float
364
365 end function nc_put_vars_float
366 end interface
367
368
369 interface
370 function nc_get_vars_double(ncid, varid, startp, countp, stridep, vars) bind(c)
371
372 import :: c_int, c_double, c_size_t
373
374 integer (c_int), value :: ncid, varid
375! type (c_ptr), value :: startp
376! type (c_ptr), value :: countp
377! type (c_ptr), value :: stridep
378 integer (c_size_t) :: startp(*)
379 integer (c_size_t) :: countp(*)
380 integer (c_size_t) :: stridep(*)
381
382 real (c_double), intent(out) :: vars(*)
383
384 integer (c_int) :: nc_get_vars_double
385
386 end function nc_get_vars_double
387 end interface
388
389 interface
390 function nc_put_vars_double(ncid, varid, startp, countp, stridep, vars) bind(c)
391
392 import :: c_int, c_double, c_size_t
393
394 integer (c_int), value :: ncid, varid
395! type(c_ptr), value :: startp, countp, stridep
396 integer (c_size_t) :: startp(*)
397 integer (c_size_t) :: countp(*)
398 integer (c_size_t) :: stridep(*)
399
400 real (c_double), intent(in) :: vars(*)
401
402 integer (c_int) :: nc_put_vars_double
403
404 end function nc_put_vars_double
405 end interface
406
407
408 interface
409 function nc_get_att_text(ncid, varid, name, ip) bind(c)
410
411 import :: c_int, c_char
412
413 integer (c_int), value :: ncid, varid
414 character (c_char), intent(in) :: name(*)
415 character (c_char), intent(out) :: ip(*)
416
417 integer (c_int) :: nc_get_att_text
418
419 end function nc_get_att_text
420 end interface
421
422 interface
423 function nc_get_att_int(ncid, varid, name, ip) bind(c)
424
425 import :: c_int, c_char
426
427 integer (c_int), value :: ncid, varid
428 character (c_char), intent(in) :: name(*)
429 integer (c_int), intent(out) :: ip(*)
430
431 integer (c_int) :: nc_get_att_int
432
433 end function nc_get_att_int
434 end interface
435
436 interface
437 function nc_get_att_short(ncid, varid, name, ip) bind(c)
438
439 import :: c_int, c_char, c_short
440
441 integer (c_int), value :: ncid, varid
442 character (c_char), intent(in) :: name(*)
443 integer (c_short), intent(out) :: ip(*)
444
445 integer (c_int) :: nc_get_att_short
446
447 end function nc_get_att_short
448 end interface
449
450 interface
451 function nc_get_att_float(ncid, varid, name, ip) bind(c)
452
453 import :: c_int, c_float, c_char
454
455 integer (c_int), value :: ncid, varid
456 character (c_char), intent(in) :: name(*)
457 real (c_float), intent(out) :: ip(*)
458
459 integer (c_int) :: nc_get_att_float
460
461 end function nc_get_att_float
462 end interface
463
464 interface
465 function nc_get_att_double(ncid, varid, name, ip) bind(c)
466
467 import :: c_int, c_double, c_char
468
469 integer (c_int), value :: ncid, varid
470 character (c_char), intent(in) :: name(*)
471 real (c_double), intent(out) :: ip(*)
472
473 integer (c_int) :: nc_get_att_double
474
475 end function nc_get_att_double
476 end interface
477
478 interface
479 function nc_inq_attname(ncid, varid, attnum, name) bind(c)
480
481 import :: c_int, c_char
482
483 integer (c_int), value :: ncid, varid, attnum
484 character (c_char), intent(inout) :: name(*)
485
486 integer (c_int) :: nc_inq_attname
487
488 end function nc_inq_attname
489 end interface
490
491 interface
492 function nc_inq_att(ncid, varid, name, xtypep, lenp) bind(c)
493
494 import :: c_int, c_size_t, c_char
495
496 integer (c_int), value :: ncid, varid
497 character (c_char), intent(in) :: name(*)
498 integer (c_int), intent(out) :: xtypep
499 integer (c_size_t), intent(out) :: lenp
500
501 integer (c_int) :: nc_inq_att
502
503 end function nc_inq_att
504 end interface
505
506 interface
507 function nc_inq_var(ncid, varid, name, xtypep, ndimsp, dimidsp, nattsp) &
508 bind(c)
509
510 import :: c_int, c_char
511
512 integer (c_int), value :: ncid
513 integer (c_int), value :: varid
514 character (c_char) :: name(*)
515 integer (c_int), intent(out) :: xtypep
516 integer (c_int), intent(out) :: ndimsp
517 integer (c_int), intent(out) :: dimidsp(*)
518 integer (c_int), intent(out) :: nattsp
519
520 integer (c_int) :: nc_inq_var
521
522 end function nc_inq_var
523 end interface
524
525
526 interface
527 function nc_inq_dim(ncid, dimid, name, lenp) bind(c)
528
529 import :: c_int, c_size_t, c_char
530
531 integer (c_int), value :: ncid
532 integer (c_int), value :: dimid
533 character (c_char), intent(inout) :: name(*)
534 integer (c_size_t), intent(out) :: lenp
535
536 integer (c_int) :: nc_inq_dim
537
538 end function nc_inq_dim
539 end interface
540
541 interface
542 function nc_strerror(ncerr) bind(c)
543
544 import :: c_int, c_ptr
545
546 integer (c_int), value :: ncerr
547
548 type(c_ptr) :: nc_strerror
549
550 end function nc_strerror
551 end interface
552
553 interface
554 function nc_inq_format(ncid, formatp) bind(c)
555
556 import :: c_int
557
558 integer (c_int), value :: ncid
559 integer (c_int), intent(out) :: formatp
560
561 integer (c_int) :: nc_inq_format
562
563 end function nc_inq_format
564 end interface
565
566
567 interface
568 function nc_inq_dimname(ncid, dimid, name) bind(c)
569
570 import :: c_int, c_char
571
572 integer (c_int), value :: ncid
573 integer (c_int), value :: dimid
574 character (c_char), intent(inout) :: name(*)
575
576 integer (c_int) :: nc_inq_dimname
577
578 end function nc_inq_dimname
579 end interface
580
581 interface
582 function nc_inq_unlimdim(ncid, unlimdimidp) bind(c)
583
584 import :: c_int
585
586 integer (c_int), value :: ncid
587 integer (c_int), intent(out) :: unlimdimidp
588
589 integer (c_int) :: nc_inq_unlimdim
590
591 end function nc_inq_unlimdim
592 end interface
593
594 interface
595 function nc_inq_ndims(ncid, ndimsp) bind(c)
596
597 import :: c_int
598
599 integer (c_int), value :: ncid
600 integer (c_int), intent(out) :: ndimsp
601
602 integer (c_int) :: nc_inq_ndims
603
604 end function nc_inq_ndims
605 end interface
606 !---------------------------------- nc_inq_nvars ------------------------------
607 interface
608 function nc_inq_nvars(ncid, nvarsp) bind(c)
609
610 import :: c_int
611
612 integer (c_int), value :: ncid
613 integer (c_int), intent(out) :: nvarsp
614
615 integer (c_int) :: nc_inq_nvars
616
617 end function nc_inq_nvars
618 end interface
619!---------------------------------- nc_inq_natts ------------------------------
620 interface
621 function nc_inq_natts(ncid, ngattsp) bind(c)
622
623 import :: c_int
624
625 integer (c_int), value :: ncid
626 integer (c_int), intent(out) :: ngattsp
627
628 integer (c_int) :: nc_inq_natts
629
630 end function nc_inq_natts
631 end interface
632
633!----------------------------------------------------------------------
634
635 interface
636 function nc_put_att_text(ncid, varid, name, nlen, tp) bind(c)
637
638 import :: c_int, c_size_t, c_char
639
640 integer (c_int), value :: ncid, varid
641 integer (c_size_t), value :: nlen
642 character (c_char), intent(in) :: name(*)
643 character (c_char), intent(in) :: tp(*)
644
645 integer (c_int) :: nc_put_att_text
646
647 end function nc_put_att_text
648 end interface
649
650 !----------------------------------------------------------------------
651
652 interface
653 function nc_del_att(ncid, varid, name) bind(c)
654
655 import :: c_int, c_char
656
657 integer (c_int), value :: ncid, varid
658 character (c_char), intent(in) :: name(*)
659
660 integer (c_int) :: nc_del_att
661
662 end function nc_del_att
663 end interface
664
665!----------------------------------------------------------------------
666
667 interface
668 function nc_put_att_int(ncid, varid, name, xtype, nlen, ip) bind(c)
669
670 import :: c_int, c_size_t, c_char
671
672 integer (c_int), value :: ncid, varid
673 integer (c_size_t), value :: nlen
674 integer (c_int), value :: xtype
675 character (c_char), intent(in) :: name(*)
676 integer (c_int), intent(in) :: ip(*)
677
678 integer (c_int) :: nc_put_att_int
679
680 end function nc_put_att_int
681 end interface
682
683!----------------------------------------------------------------------
684
685 interface
686 function nc_put_att_float(ncid, varid, name, xtype, nlen, fp) bind(c)
687
688 import :: c_int, c_size_t, c_float, c_char
689
690 integer (c_int), value :: ncid, varid
691 integer (c_size_t), value :: nlen
692 integer (c_int), value :: xtype
693 character (c_char), intent(in) :: name(*)
694 real (c_float), intent(in) :: fp(*)
695
696 integer (c_int) :: nc_put_att_float
697
698 end function nc_put_att_float
699 end interface
700
701!----------------------------------------------------------------------
702
703 interface
704 function nc_put_att_double(ncid, varid, name, xtype, nlen, dp) bind(c)
705
706 import :: c_int, c_size_t, c_double, c_char
707
708 integer (c_int), value :: ncid, varid
709 integer (c_size_t), value :: nlen
710 integer (c_int), value :: xtype
711 character (c_char), intent(in) :: name(*)
712 real (c_double), intent(in) :: dp(*)
713
714 integer (c_int) :: nc_put_att_double
715
716 end function nc_put_att_double
717 end interface
718
719!----------------------------------------------------------------------
720
721 interface
722 function nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out ) bind(c)
723
724 import :: c_int, c_char
725
726 integer (c_int), value :: ncid_in, varid_in, varid_out, &
727 ncid_out
728 character (c_char), intent(in) :: name(*)
729
730 integer (c_int) :: nc_copy_att
731
732 end function nc_copy_att
733 end interface
734
735
736
737 interface
738 function nc_open(path, mode, ncidp) BIND(C)
739
740 import :: c_char, c_int
741
742 character (c_char), intent(in) :: path(*)
743 integer (c_int), value :: mode
744 integer (c_int), intent(out) :: ncidp
745
746 integer (c_int) :: nc_open
747
748 end function nc_open
749 end interface
750
751 interface
752 function nc__open(path, mode, chunksizehintp, ncidp) BIND(C)
753
754 import :: c_char, c_int, c_size_t
755
756 character (c_char), intent(in) :: path(*)
757 integer (c_int), value :: mode
758 integer (c_size_t), intent(in) :: chunksizehintp
759 integer (c_int), intent(out) :: ncidp
760
761 integer (c_int) :: nc__open
762
763 end function nc__open
764 end interface
765
766 interface
767 function nc_close(ncid) bind(c)
768
769 import :: c_int
770
771 integer (c_int), value :: ncid
772
773 integer (c_int) :: nc_close
774
775 end function nc_close
776 end interface
777
Provides Fortran interfaces to the NetCDF C API. This approach is much more straightforward than usin...