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