fftw3: Wisdom Generic Export/Import from Fortran

 
 7.6.3 Wisdom Generic Export/Import from Fortran
 -----------------------------------------------
 
 The most generic wisdom export/import functions allow you to provide an
 arbitrary callback function to read/write one character at a time in any
 way you want.  However, your callback function must be written in a
 special way, using the 'bind(C)' attribute to be passed to a C
 interface.
 
    In particular, to call the generic wisdom export function
 'fftw_export_wisdom', you would write a callback subroutine of the form:
 
        subroutine my_write_char(c, p) bind(C)
          use, intrinsic :: iso_c_binding
          character(C_CHAR), value :: c
          type(C_PTR), value :: p
          _...write c..._
        end subroutine my_write_char
 
    Given such a subroutine (along with the corresponding interface
 definition), you could then export wisdom using:
 
        call fftw_export_wisdom(c_funloc(my_write_char), p)
 
    The standard 'c_funloc' intrinsic converts a Fortran 'bind(C)'
 subroutine into a C function pointer.  The parameter 'p' is a
 'type(C_PTR)' to any arbitrary data that you want to pass to
 'my_write_char' (or 'C_NULL_PTR' if none).  (Note that you can get a C
 pointer to Fortran data using the intrinsic 'c_loc', and convert it back
 to a Fortran pointer in 'my_write_char' using 'c_f_pointer'.)
 
    Similarly, to use the generic 'fftw_import_wisdom', you would define
 a callback function of the form:
 
        integer(C_INT) function my_read_char(p) bind(C)
          use, intrinsic :: iso_c_binding
          type(C_PTR), value :: p
          character :: c
          _...read a character c..._
          my_read_char = ichar(c, C_INT)
        end function my_read_char
 
        ....
 
        integer(C_INT) :: ret
        ret = fftw_import_wisdom(c_funloc(my_read_char), p)
        if (ret .eq. 0) stop 'error importing wisdom'
 
    Your function can return '-1' if the end of the input is reached.
 Again, 'p' is an arbitrary 'type(C_PTR' that is passed through to your
 function.  'fftw_import_wisdom' returns '0' if an error occurred and
 nonzero otherwise.