C++*********************************************************************
C
C CROSRNG_DS.F 
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 CROSRNG_DS(CIRC1,CIRC2,LCIRC,NRING,MAXRIN,NUMR,QN,TOT,TT)
C
C  INPUT - FOURIER TRANSFORMS OF RINGS!!!
C  CIRC1 ALREADY MULTIPLIED BY WEIGHTS!!
C
C23456789012345678901234567890123456789012345678901234567890123456789012
C--*********************************************************************

	SUBROUTINE CROSRNG_DS(CIRC1,CIRC2,LCIRC,NRING,MAXRIN,NUMR,
     &                        QN,TOT,TT)

	INTEGER           NUMR(3,NRING)
	DIMENSION         CIRC1(LCIRC),CIRC2(LCIRC)
	DOUBLE PRECISION  TT(*),QN

C       AUTOMATIC ARRAYS
	DIMENSION         T(MAXRIN+2)
	DOUBLE PRECISION  Q(MAXRIN+2)
	DOUBLE PRECISION  T7(-3:3)

        DATA  ICALL/0/

	IP = MAXRIN
#ifndef SP_LIBFFT
	IP=-LOG2(IP)
#endif


C       ZERO Q ARRAY
	Q = 0.0D0
     
	T(MAXRIN+1) = 0.0
	T(MAXRIN+2) = 0.0

 	DO I=1,NRING
	   NUMR3I = NUMR(3,I)
	   NUMR2I = NUMR(2,I)

	   T(1) = (CIRC1(NUMR2I)) * CIRC2(NUMR2I)

	   IF (NUMR3I .NE. MAXRIN)  THEN
	      T(NUMR3I+1) = (CIRC1(NUMR2I+1))*CIRC2(NUMR2I+1)
	      T(2)        = 0.0

	      DO J=3,NUMR3I,2
	         JC     = J+NUMR2I-1

	         T(J)   =  (CIRC1(JC))*CIRC2(JC) +
     &                     (CIRC1(JC+1))*CIRC2(JC+1)

	         T(J+1) = -(CIRC1(JC))*CIRC2(JC+1) +
     &                     (CIRC1(JC+1))*CIRC2(JC)
	      ENDDO

	      Q(1:NUMR3I+1) = Q(1:NUMR3I+1) + T(1:NUMR3I+1)

	   ELSE
	      T(2) = CIRC1(NUMR2I+1) * CIRC2(NUMR2I+1)

	      DO J=3,MAXRIN,2
	         JC     =  J+NUMR2I-1

	         T(J)   =  (CIRC1(JC))*CIRC2(JC) +
     &                     (CIRC1(JC+1))*CIRC2(JC+1)

	         T(J+1) = -(CIRC1(JC))*CIRC2(JC+1) +
     &                     (CIRC1(JC+1))*CIRC2(JC)
	      ENDDO
	      Q = Q + T
           ENDIF
	ENDDO
 
#ifdef SP_LIBFFT
	INV         = -1
	LDA         = 1
	Q(MAXRIN+1) = Q(2)
	Q(2)        = 0.0
	Q(MAXRIN+2) = 0.0
	CALL  ZDFFT1DU(INV,IP,Q,LDA,TT)

C       SKIP THE NORMALIZATION, DIVIDE THE MAXIMUM INSTEAD.
C	CALL DSCAL1D(IP,1.0D0/DBLE(FLOAT(IP)),Q,LDA)
#else
	CALL FFTR_D(Q,IP)
#endif

	QN = -1.0D20
	DO J=1,MAXRIN
	   IF (Q(J) .GE. QN)  THEN
	      QN   = Q(J)
	      JTOT = J
	   ENDIF
	ENDDO
#ifdef SP_LIBFFT
	QN=QN/MAXRIN
#endif

	DO K=-3,3
           J     = MOD(JTOT+K+MAXRIN-1,MAXRIN) + 1
	   T7(K) = Q(J)
	ENDDO

	CALL  PRB1D(T7,7,POS)

	TOT = FLOAT(JTOT) + POS

	END
