C++********************************************************************* C C FOUR1C.F C OPFILEC FEB 03 ARDEAN LEITH C CLEANED JUL 08 ARDEAN LEITH C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2008 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (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 GNU * C=* 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 * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C C FOUR1C C C PURPOSE: FORWARD OR REVERSE FOURIER TRANSFORMS AN IMAGE OR VOLUME. C C23456789012345678901234567890123456789012345678901234567890123456789012 C--********************************************************************* SUBROUTINE FOUR1C INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' REAL, ALLOCATABLE, DIMENSION(:,:,:) :: QA CHARACTER(LEN=MAXNAM) :: FILNAM DATA LUN1,LUN2/21,22/ MAXIM = 0 MAXIM2 = 0 IRTFLG = 0 CALL OPFILEC(0,.TRUE.,FILNAM,LUN1,'O',IFORM,NSAM,NROW,NSLICE, & MAXIM,'INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN INV = ISIGN(1,IFORM) IF (IFORM.EQ.1) THEN IF (MOD(NSAM,2) .EQ. 0) THEN IFORM = -12 LS = NSAM+2 ELSE IFORM = -11 LS = NSAM+1 ENDIF ELSEIF (IFORM.EQ.3) THEN IF (MOD(NSAM,2) .EQ. 0) THEN IFORM = -22 LS = NSAM+2 ELSE IFORM = -21 LS = NSAM+1 ENDIF ELSEIF (IFORM .EQ. -11) THEN IFORM = 1 LS = NSAM-1 ELSEIF (IFORM .EQ. -12) THEN IFORM = 1 LS =NSAM-2 ELSEIF (IFORM .EQ. -21) THEN IFORM = 3 LS = NSAM-1 ELSEIF (IFORM .EQ. -22) THEN IFORM = 3 LS = NSAM-2 ELSE CALL ERRT(2,'FT',NE) CLOSE(LUN1) RETURN ENDIF ISPACE = MAX(NSAM,LS) ISAM = MIN(NSAM,LS) CALL OPFILEC(LUN1,.TRUE.,FILNAM,LUN2,'N',IFORM,LS,NROW,NSLICE, & MAXIM2,'OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) THEN CLOSE(LUN1) RETURN ENDIF ALLOCATE (QA(ISPACE,NROW,NSLICE), STAT=IRTFLG) IF (IRTFLG .EQ. 0) THEN C ADEQUATE MEMORY CALL READV(LUN1,QA,ISPACE,NROW,NSAM,NROW,NSLICE) CLOSE(LUN1) IF (IFORM .EQ. 3 .OR. IFORM .LT. -20) THEN CALL FMRS_3(QA,ISAM,NROW,NSLICE,INV) ELSE CALL FMRS_2(QA,ISAM,NROW,INV) ENDIF IF (INV .EQ. 0)THEN CALL ERRT(38,'FT',NE) ELSE CALL WRITEV(LUN2,QA,ISPACE,NROW,LS,NROW,NSLICE) ENDIF ELSE C INADEQUATE MEMORY NNNN = ISAM+2-MOD(ISAM,2) WRITE(NOUT,*)' WARNING: USING SLOW ON-DISK VERSION OF FFT.' IF (NSLICE .LE. 1) THEN C 2D FFT NC = 2 LR = ISPACE / NC CALL FMRS_2DR(LUN1,LUN2,LR,NNNN,ISAM,NROW,INV) ELSE C 3D FFT CALL FMRS_3DR(LUN1,LUN2,NNNN,ISAM,NROW,NSLICE,INV) ENDIF ENDIF 9999 CLOSE(LUN2) IF (ALLOCATED(QA)) DEALLOCATE (QA) END