C++********************************************************************* C C POLAR_CC.F C OPFILEC FEB 03 ARDEAN LEITH C DE-OMP PARRALEL LOOP FOR FFTW3 USE MAR 08 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 ********************************************************************** SUBROUTINE POLAR_CC INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' CHARACTER(LEN=MAXNAM) :: FINPIC,FINPAT COMMON /F_SPEC/ FINPAT,NLET,FINPIC REAL, ALLOCATABLE, DIMENSION(:,:) :: X,REF CHARACTER(LEN=1) :: MODE,ASK,NULL DOUBLE PRECISION T7(-3:3) DATA INPIC/77/,INREF/76/,LUNO/75/ NULL = CHAR(0) C ASK FOR DATA FILES MAXIM = 0 CALL OPFILEC(0,.TRUE.,FINPIC,INPIC,'O',ITYPE,NSAM,NROW, & NSLICE,MAXIM,'INPUT',.FALSE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN MAXIM = 0 CALL OPFILEC(0,.TRUE.,FINPIC,INREF,'O',ITYPE,NSAMP,NROWP, & NSLICE,MAXIM,'REFERENCE',.FALSE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN IF (NSAM.NE.NSAMP .OR. NROW.NE.NROWP) THEN CALL ERRT(1,'POLAR_CC',IER) RETURN ENDIF C ASK FOR OUTPUT FILE MAXIM = 0 ITYPE=1 NROWP=1 NSLICEP=1 CALL OPFILEC(INPIC,.TRUE.,FINPIC,LUNO,'N',ITYPE,NSAM,NROWP, & NSLICEP,MAXIM,'OUTUT',.FALSE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN NA=1 CALL RDPRMC(ASK,NA,.TRUE.,'(F)ULL OR (H)ALF CIRCLE',NULL,IRT) IF (ASK.EQ.'H') THEN MODE='H' ELSE MODE='F' ENDIF PI = 4*DATAN(1.0D0) LSAM = NSAM+2-MOD(NSAM,2) ALLOCATE (X(LSAM,NROW),REF(LSAM,NROW), STAT=IRTFLG) IF (IRTFLG.NE.0) THEN CALL ERRT(46,'POLAR_CC, X,REF',IER) CLOSE(INPIC) CLOSE(INREF) RETURN ENDIF DO J=1,NROW CALL REDLIN(INPIC,X(1,J),NSAM,J) ENDDO CLOSE(INPIC) DO J=1,NROW CALL REDLIN(INREF,REF(1,J),NSAM,J) ENDDO CLOSE(INREF) INV = +1 C parallel do private(j),shared(invt) REMOVED FOR FFTW3 al DO J=1,NROW INVT = INV CALL FMRS_1(X(1,J),NSAM,INVT) CALL FMRS_1(REF(1,J),NSAM,INVT) ENDDO IF (INV .EQ. 0) THEN CALL ERRT(101,'*** ERROR IN POLAR_CC, INV = 0',NDUM) RETURN ENDIF CALL MF1D(X,REF,LSAM/2,NROW) INV=-1 CALL FMRS_1(X(1,1),NSAM,INV) QM=-1.0E20 DO I=1,NSAM IF (X(I,1) .GE. QM) THEN QM = X(I,1) JTOT = I ENDIF ENDDO DO K=-3,3 J = MOD(JTOT+K+NSAM-1,NSAM)+1 T7(K) = X(J,1) ENDDO CALL PRB1D(T7,7,POS) RANG=REAL(JTOT)+POS IF (MODE.EQ.'F') THEN RANG=(RANG-1.0)/NSAM*360.0 ELSE RANG=(RANG-1.0)/NSAM*180.0 ENDIF WRITE(NOUT,2700) RANG,QM 2700 FORMAT(' Angle = ',F10.4,' Peak = ',G12.5) CALL REG_SET_NSEL(1,2,RANG,QM,0.0,0.0,0.0,IRTFLG) C Shift 1D CCF to have the origin at INT(NSAM/2)+1 DO I=1,NSAM REF(MOD(I+INT(NSAM/2)-1,NSAM)+1,1)=X(I,1) ENDDO CALL WRTLIN(LUNO,REF,NSAM,1) CLOSE(LUNO) DEALLOCATE (X,REF) END C -------------------- MF1D ------------------------------------- SUBROUTINE MF1D(X,REF,L,NROW) COMPLEX X(L,NROW),REF(L,NROW) X(:,1) = X(:,1)*CONJG(REF(:,1)) IF (NROW .EQ. 1) RETURN DO J=2,NROW X(:,1) = X(:,1) + X(:,J) * CONJG(REF(:,J)) ENDDO END