|
| 1 | +module fortran_interface |
| 2 | +!! filename(256) and var_name(64) are arbitrary sizes. |
| 3 | +!! ensure calling program buffers are equally sized |
| 4 | +use, intrinsic :: iso_c_binding, only : C_INT32_T, C_CHAR, C_NULL_CHAR |
| 5 | +use nc4fortran, only : netcdf_file |
| 6 | + |
| 7 | +implicit none (type, external) |
| 8 | + |
| 9 | +contains |
| 10 | + |
| 11 | + |
| 12 | +subroutine write_int32(filename, var_name, i32) bind(C) |
| 13 | +character(kind=C_CHAR) :: filename(256) |
| 14 | +character(kind=C_CHAR) :: var_name(64) |
| 15 | +integer(C_INT32_T), intent(in) :: i32 |
| 16 | +type(netcdf_file) :: h |
| 17 | + |
| 18 | +call h%initialize(cstr2fstr(filename), status='replace') |
| 19 | +call h%write(cstr2fstr(var_name), i32) |
| 20 | +call h%finalize() |
| 21 | + |
| 22 | +end subroutine write_int32 |
| 23 | + |
| 24 | + |
| 25 | +subroutine read_int32(filename, var_name, i32) bind(C) |
| 26 | +character(kind=C_CHAR) :: filename(256) |
| 27 | +character(kind=C_CHAR) :: var_name(64) |
| 28 | +integer(C_INT32_T), intent(out) :: i32 |
| 29 | +type(netcdf_file) :: h |
| 30 | + |
| 31 | +call h%initialize(cstr2fstr(filename), status='old', action='r') |
| 32 | +call h%read(cstr2fstr(var_name), i32) |
| 33 | +call h%finalize() |
| 34 | + |
| 35 | +end subroutine read_int32 |
| 36 | + |
| 37 | + |
| 38 | +function cstr2fstr(c_str) result(f_str) |
| 39 | + |
| 40 | +character(kind=C_CHAR), intent(in) :: c_str(:) |
| 41 | +character(len=size(c_str)) :: buf |
| 42 | +character(:), allocatable :: f_str |
| 43 | +integer :: i |
| 44 | + |
| 45 | +buf = "" |
| 46 | +!! clean variable, will get extra garbled text otherwise, maybe blank but non-trimmable character |
| 47 | + |
| 48 | +do i = 1, size(c_str) |
| 49 | + if (c_str(i) == C_NULL_CHAR) exit |
| 50 | + buf(i:i) = c_str(i) |
| 51 | +enddo |
| 52 | + |
| 53 | +f_str = trim(buf) |
| 54 | + |
| 55 | +end function cstr2fstr |
| 56 | + |
| 57 | +end module fortran_interface |
0 commit comments