cannam@95: c Copyright (c) 2003, 2007-11 Matteo Frigo cannam@95: c Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology cannam@95: c cannam@95: c This program is free software; you can redistribute it and/or modify cannam@95: c it under the terms of the GNU General Public License as published by cannam@95: c the Free Software Foundation; either version 2 of the License, or cannam@95: c (at your option) any later version. cannam@95: c cannam@95: c This program is distributed in the hope that it will be useful, cannam@95: c but WITHOUT ANY WARRANTY; without even the implied warranty of cannam@95: c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the cannam@95: c GNU General Public License for more details. cannam@95: c cannam@95: c You should have received a copy of the GNU General Public License cannam@95: c along with this program; if not, write to the Free Software cannam@95: c Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA cannam@95: c cannam@95: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cannam@95: c cannam@95: c This is an example implementation of Fortran wisdom export/import cannam@95: c to/from a Fortran unit (file), exploiting the generic cannam@95: c dfftw_export_wisdom/dfftw_import_wisdom functions. cannam@95: c cannam@95: c We cannot compile this file into the FFTW library itself, lest all cannam@95: c FFTW-calling programs be required to link to the Fortran I/O cannam@95: c libraries. cannam@95: c cannam@95: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cannam@95: cannam@95: c Strictly speaking, the '$' format specifier, which allows us to cannam@95: c write a character without a trailing newline, is not standard F77. cannam@95: c However, it seems to be a nearly universal extension. cannam@95: subroutine write_char(c, iunit) cannam@95: character c cannam@95: integer iunit cannam@95: write(iunit,321) c cannam@95: 321 format(a,$) cannam@95: end cannam@95: cannam@95: subroutine export_wisdom_to_file(iunit) cannam@95: integer iunit cannam@95: external write_char cannam@95: call dfftw_export_wisdom(write_char, iunit) cannam@95: end cannam@95: cannam@95: c Fortran 77 does not have any portable way to read an arbitrary cannam@95: c file one character at a time. The best alternative seems to be to cannam@95: c read a whole line into a buffer, since for fftw-exported wisdom we cannam@95: c can bound the line length. (If the file contains longer lines, cannam@95: c then the lines will be truncated and the wisdom import should cannam@95: c simply fail.) Ugh. cannam@95: subroutine read_char(ic, iunit) cannam@95: integer ic cannam@95: integer iunit cannam@95: character*256 buf cannam@95: save buf cannam@95: integer ibuf cannam@95: data ibuf/257/ cannam@95: save ibuf cannam@95: if (ibuf .lt. 257) then cannam@95: ic = ichar(buf(ibuf:ibuf)) cannam@95: ibuf = ibuf + 1 cannam@95: return cannam@95: endif cannam@95: read(iunit,123,end=666) buf cannam@95: ic = ichar(buf(1:1)) cannam@95: ibuf = 2 cannam@95: return cannam@95: 666 ic = -1 cannam@95: ibuf = 257 cannam@95: 123 format(a256) cannam@95: end cannam@95: cannam@95: subroutine import_wisdom_from_file(isuccess, iunit) cannam@95: integer isuccess cannam@95: integer iunit cannam@95: external read_char cannam@95: call dfftw_import_wisdom(isuccess, read_char, iunit) cannam@95: end