Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / external / fftpack / fftpack5 / cost1b.F
blob419fc146f0db79b6c4822881275d7c4e3cafabea
1 subroutine cost1b ( n, inc, x, lenx, wsave, lensav, work, lenwrk, ier )
3 !*****************************************************************************80
5 !! COST1B: real single precision backward cosine transform, 1D.
7 !  Discussion:
9 !    COST1B computes the one-dimensional Fourier transform of an even
10 !    sequence within a real array.  This transform is referred to as
11 !    the backward transform or Fourier synthesis, transforming the sequence
12 !    from spectral to physical space.
14 !    This transform is normalized since a call to COST1B followed
15 !    by a call to COST1F (or vice-versa) reproduces the original array
16 !    within roundoff error.
19 !    Copyright (C) 1995-2004, Scientific Computing Division,
20 !    University Corporation for Atmospheric Research
22 !  Modified:
24 !    28 March 2005
26 !  Author:
28 !    Paul Swarztrauber
29 !    Richard Valent
31 !  Reference:
33 !    Paul Swarztrauber,
34 !    Vectorizing the Fast Fourier Transforms,
35 !    in Parallel Computations,
36 !    edited by G. Rodrigue,
37 !    Academic Press, 1982.
39 !    Paul Swarztrauber,
40 !    Fast Fourier Transform Algorithms for Vector Computers,
41 !    Parallel Computing, pages 45-63, 1984.
43 !  Parameters:
45 !    Input, integer ( kind = 4 ) N, the length of the sequence to be
46 !    transformed.  The transform is most efficient when N-1 is a product of
47 !    small primes.
49 !    Input, integer ( kind = 4 ) INC, the increment between the locations,
50 !    in array R, of two consecutive elements within the sequence.
52 !    Input/output, real ( kind = 4 ) R(LENR), containing the sequence to
53 !     be transformed.
55 !    Input, integer ( kind = 4 ) LENR, the dimension of the R array.
56 !    LENR must be at least INC*(N-1)+ 1.
58 !    Input, real ( kind = 4 ) WSAVE(LENSAV).  WSAVE's contents must be
59 !    initialized with a call to COST1I before the first call to routine COST1F
60 !    or COST1B for a given transform length N.  WSAVE's contents may be re-used
61 !    for subsequent calls to COST1F and COST1B with the same N.
63 !    Input, integer ( kind = 4 ) LENSAV, the dimension of the WSAVE array.
64 !    LENSAV must be at least 2*N + INT(LOG(REAL(N))) + 4.
66 !    Workspace, real ( kind = 4 ) WORK(LENWRK).
68 !    Input, integer ( kind = 4 ) LENWRK, the dimension of the WORK array.
69 !    LENWRK must be at least N-1.
71 !    Output, integer ( kind = 4 ) IER, error flag.
72 !    0, successful exit;
73 !    1, input parameter LENR   not big enough;
74 !    2, input parameter LENSAV not big enough;
75 !    3, input parameter LENWRK not big enough;
76 !    20, input error returned by lower level routine.
78   implicit none
80   integer ( kind = 4 ) inc
81   integer ( kind = 4 ) lensav
82   integer ( kind = 4 ) lenwrk
84   integer ( kind = 4 ) ier
85   integer ( kind = 4 ) ier1
86   integer ( kind = 4 ) lenx
87   integer ( kind = 4 ) n
88   real ( kind = 4 ) work(lenwrk)
89   real ( kind = 4 ) wsave(lensav)
90   real ( kind = 4 ) x(inc,*)
92   ier = 0
94   if ( lenx < inc * ( n - 1 ) + 1 ) then
95     ier = 1
96     call xerfft ( 'cost1b', 6 )
97     return
98   end if
100   if ( lensav < 2 * n + int ( log ( real ( n, kind = 4 ) ) ) + 4 ) then
101     ier = 2
102     call xerfft ( 'cost1b', 8 )
103     return
104   end if
106   if ( lenwrk < n - 1 ) then
107     ier = 3
108     call xerfft ( 'cost1b', 10 )
109     return
110   end if
112   call costb1 ( n, inc, x, wsave, work, ier1 )
114   if ( ier1 /= 0 ) then
115     ier = 20
116     call xerfft ( 'cost1b', -5 )
117     return
118   end if
120   return