C++*********************************************************************
C
C     FOUR1A.F
C                                   OPFILEC          FEB 03 ARDEAN LEITH    
C	
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2005  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       'FQ' : QUICK FILTERING (IN CORE, 2-D OR 3-D, AS NEED BE)
C       APPLIES FOURIER FILTERS TO 2-D OR 3-D REAL PICTURES
C
C IMAGE_PROCESSING_ROUTINE
C
C23456789012345678901234567890123456789012345678901234567890123456789012
C--*********************************************************************

	SUBROUTINE FOUR1A

        INCLUDE 'CMBLOCK.INC' 
        INCLUDE 'CMLIMIT.INC'

        COMMON /COMMUN/ FILNAM
        CHARACTER (LEN=MAXNAM) ::  FILNAM

        REAL, ALLOCATABLE, DIMENSION(:,:)      :: BB
        REAL, ALLOCATABLE, DIMENSION(:,:,:)    :: BC
        
        DATA  LUN1,LUN2/21,22/

        MAXIM = 0
   	CALL OPFILEC(0,.TRUE.,FILNAM,LUN1,'O',IFORM,NSAM,NROW,NSLICE,
     &  	   MAXIM,'INPUT',.FALSE.,IRTFLG)
	IF (IRTFLG .NE. 0) RETURN

        IF (IFORM .NE.1 .AND. IFORM.NE.3) THEN
	   GOTO 999

	ELSEIF (IFORM .EQ.1 .AND. NROW.EQ.1) THEN
           CALL ERRT(44,'FOUR1A ',NE)
	   GOTO 999
	ENDIF
	
        MAXIM = 0
	CALL OPFILEC(LUN1,.TRUE.,FILNAM,LUN2,'U',IFORM,NSAM,NROW,NSLICE,
     &		   MAXIM,'OUTPUT',.FALSE.,IRTFLG)
	IF (IRTFLG. NE. 0) GOTO 999

 
 1000   WRITE(NOUT,1009)
 1009   FORMAT
     &     (' 1 - LOW-PASS,       2 - HIGH-PASS',/,
     &      ' 3 - GAUSS LOW-PASS, 4 - GAUSS HIGH-PASS',/,
     &      ' 5 - FERMI LOW-PASS, 6 - FERMI HIGH-PASS',/,
     &      ' 7 - BUTER LOW-PASS, 8 - BUTER HIGH-PASS')

        CALL RDPRI1S(IOPT,NOT_USED,'FILTER TYPE (1-8)',IRTFLG)
	
        IF (IOPT .LT. 1 .OR. IOPT .GT. 8) THEN
           CALL ERRT(102,'ILLEGAL VALUE FOR FILTER TYPE ',IOPT)
	   GOTO 1000
	ENDIF

	IF (FCHAR(4:5) .EQ. 'NP')  THEN
	    N2S = NSAM
            N2R = NROW
            N2L = NSLICE
        ELSE
           N2S = 2*NSAM
           N2R = 2*NROW
	   IF (NSLICE.GT.1)  THEN
	      N2L = 2*NSLICE
	   ELSE
	      N2L=1
           ENDIF
	ENDIF
	LSD = N2S+2-MOD(N2S,2)

        IF (IFORM .EQ. 1)  THEN
           WRITE(NOUT,30111)  N2S,N2R
30111      FORMAT(' DIMENSIONS USED: ',3I6)

           ALLOCATE (BB(LSD,N2R), STAT=IRTFLG)           
           IF (IRTFLG .NE. 0) THEN 
              CALL ERRT(46,'FOUR1A, BB',IER)
              GOTO 999
           ENDIF

           CALL  FQ_Q(LUN1,LUN2,BB,LSD,N2S,N2R,NSAM,NROW,IOPT)
        ELSE
           WRITE(NOUT,30111)  N2S,N2R,N2L
        
           ALLOCATE (BC(LSD,N2R,N2L), STAT=IRTFLG)           
           IF (IRTFLG .NE. 0) THEN 
              CALL ERRT(46,'FOUR1A, BC',IER)
              GOTO 998
           ENDIF  
   
           CALL FQ3_P(LUN1,LUN2,BC,LSD,
     &                N2S,N2R,N2L,NSAM,NROW,NSLICE,IOPT)
        ENDIF

	IF (IOPT.LT.0) THEN
	   CALL ERRT(38,'FQ',NE)
	ENDIF

998     IF (ALLOCATED(BB))  DEALLOCATE(BB)
	IF (ALLOCATED(BC))  DEALLOCATE(BC)

999     CLOSE(LUN1)
        CLOSE(LUN2)
       
        END
