1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/* temperton/dgpfa.f -- translated by f2c (version 20050501).
You must link the resulting object file with libf2c:
on Microsoft Windows system, link with libf2c.lib;
on Linux or Unix systems, link with .../path/to/libf2c.a -lm
or, if you install libf2c.a in a standard place, with -lf2c -lm
-- in that order, at the end of the command line, as in
cc *.o -lf2c -lm
Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
http://www.netlib.org/f2c/libf2c.zip
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "v3p_netlib.h"
/* Table of constant values */
static integer c__2 = 2;
static integer c__3 = 3;
/* SUBROUTINE 'DGPFA' */
/* SELF-SORTING IN-PLACE GENERALIZED PRIME FACTOR (COMPLEX) FFT */
/* *** THIS IS THE ALL-FORTRAN VERSION *** */
/* ------------------------------- */
/* CALL DGPFA(A,B,TRIGS,INC,JUMP,N,LOT,ISIGN,NPQR) */
/* A IS FIRST REAL INPUT/OUTPUT VECTOR */
/* B IS FIRST IMAGINARY INPUT/OUTPUT VECTOR */
/* TRIGS IS A TABLE OF TWIDDLE FACTORS, PRECALCULATED */
/* BY CALLING SUBROUTINE 'SETDGPFA' */
/* INC IS THE INCREMENT WITHIN EACH DATA VECTOR */
/* JUMP IS THE INCREMENT BETWEEN DATA VECTORS */
/* N IS THE LENGTH OF THE TRANSFORMS: */
/* ----------------------------------- */
/* N = (2**IP) * (3**IQ) * (5**IR) */
/* ----------------------------------- */
/* LOT IS THE NUMBER OF TRANSFORMS */
/* ISIGN = +1 FOR FORWARD TRANSFORM */
/* = -1 FOR INVERSE TRANSFORM */
/* NPQR = NPQR OBTAINED FROM SETDGPFA */
/* WRITTEN BY CLIVE TEMPERTON */
/* RECHERCHE EN PREVISION NUMERIQUE */
/* ATMOSPHERIC ENVIRONMENT SERVICE, CANADA */
/* MODIFIED FOR VXL PROJECT TO ADD NPQR ARGUMENT */
/* ---------------------------------------------------------------------- */
/* DEFINITION OF TRANSFORM */
/* ----------------------- */
/* X(J) = SUM(K=0,...,N-1)(C(K)*EXP(ISIGN*2*I*J*K*PI/N)) */
/* --------------------------------------------------------------------- */
/* FOR A MATHEMATICAL DEVELOPMENT OF THE ALGORITHM USED, */
/* SEE: */
/* C TEMPERTON : "A GENERALIZED PRIME FACTOR FFT ALGORITHM */
/* FOR ANY N = (2**P)(3**Q)(5**R)", */
/* SIAM J. SCI. STAT. COMP., MAY 1992. */
/* ---------------------------------------------------------------------- */
/*< SUBROUTINE DGPFA(A,B,TRIGS,INC,JUMP,N,LOT,ISIGN,NPQR) >*/
/* Subroutine */ int dgpfa_(doublereal *a, doublereal *b, doublereal *trigs,
integer *inc, integer *jump, integer *n, integer *lot, integer *isign,
integer *npqr)
{
/* Builtin functions */
integer pow_ii(integer *, integer *);
/* Local variables */
integer i__, ip, iq, ir;
extern /* Subroutine */ int dgpfa2f_(doublereal *, doublereal *,
doublereal *, integer *, integer *, integer *, integer *, integer
*, integer *), dgpfa3f_(doublereal *, doublereal *, doublereal *,
integer *, integer *, integer *, integer *, integer *, integer *),
dgpfa5f_(doublereal *, doublereal *, doublereal *, integer *,
integer *, integer *, integer *, integer *, integer *);
/*< DOUBLE PRECISION A(*), B(*), TRIGS(*) >*/
/*< INTEGER INC, JUMP, N, LOT, ISIGN, NPQR(3) >*/
/*< IP = NPQR(1) >*/
/* Parameter adjustments */
--npqr;
--trigs;
--b;
--a;
/* Function Body */
ip = npqr[1];
/*< IQ = NPQR(2) >*/
iq = npqr[2];
/*< IR = NPQR(3) >*/
ir = npqr[3];
/* COMPUTE THE TRANSFORM */
/* --------------------- */
/*< I = 1 >*/
i__ = 1;
/*< IF (IP.GT.0) THEN >*/
if (ip > 0) {
/*< CALL DGPFA2F(A,B,TRIGS,INC,JUMP,N,IP,LOT,ISIGN) >*/
dgpfa2f_(&a[1], &b[1], &trigs[1], inc, jump, n, &ip, lot, isign);
/*< I = I + 2 * ( 2**IP) >*/
i__ += pow_ii(&c__2, &ip) << 1;
/*< ENDIF >*/
}
/*< IF (IQ.GT.0) THEN >*/
if (iq > 0) {
/*< CALL DGPFA3F(A,B,TRIGS(I),INC,JUMP,N,IQ,LOT,ISIGN) >*/
dgpfa3f_(&a[1], &b[1], &trigs[i__], inc, jump, n, &iq, lot, isign);
/*< I = I + 2 * (3**IQ) >*/
i__ += pow_ii(&c__3, &iq) << 1;
/*< ENDIF >*/
}
/*< IF (IR.GT.0) THEN >*/
if (ir > 0) {
/*< CALL DGPFA5F(A,B,TRIGS(I),INC,JUMP,N,IR,LOT,ISIGN) >*/
dgpfa5f_(&a[1], &b[1], &trigs[i__], inc, jump, n, &ir, lot, isign);
/*< ENDIF >*/
}
/*< RETURN >*/
return 0;
/*< END >*/
} /* dgpfa_ */
#ifdef __cplusplus
}
#endif
|