V3FIT
trigfact.f
1  SUBROUTINE trigfact(nu, nv, nvh, nuvh, mf, nf, cmunv, smunv,
2  1 cu, su, cv, sv)
3  USE stel_kinds
4  IMPLICIT NONE
5 C-----------------------------------------------
6 C D u m m y A r g u m e n t s
7 C-----------------------------------------------
8  INTEGER :: nu, nv, nvh, nuvh, mf, nf
9  REAL(rprec), DIMENSION(nuvh,0:mf,-nf:nf) :: cmunv, smunv
10  REAL(rprec), DIMENSION(nu,0:mf) :: cu, su
11  REAL(rprec), DIMENSION(nvh,0:nf) :: cv, sv
12 C-----------------------------------------------
13 C L o c a l P a r a m e t e r s
14 C-----------------------------------------------
15  REAL(rprec), PARAMETER :: one = 1, zero = 0
16 C-----------------------------------------------
17 C L o c a l V a r i a b l e s
18 C-----------------------------------------------
19  INTEGER :: i, j, m, n, kv, ku
20  REAL(rprec) :: pi2, du, dv, cc, ss, sc, cs
21 C-----------------------------------------------
22 c Calculate SIN/COS(m*u+n*nfp*v) factors for USE in FSIN transform
23 c efficiently, i.e., SIN and COS are ONLY called once.
24 c Must have nuvh=nu*(1+nv/2) = nu*nvh
25 c nfp is the number of field periods
26 c
27 c Note: The m,n dimensions of SIN/COS are different here from
28 c the version in fourfast.f
29 c this version allows you to calculate all the sin/cos factors
30 c at one time using the largest (m,n) and
31 c then use them for all smaller (m,n) as long as nu,nv are same
32 c
33  pi2 = 4*asin(one)
34 
35  cu(:,0) = one !at m=0, m*u=0 for ALL u
36  cv(:,0) = one
37  su(:,0) = zero
38  sv(:,0) = zero
39 
40  cu(1,:mf) = one !at u=0, m*u=0 for ALL m
41  cv(1,:nf) = one !remember, u(i)=du*(i-1), so u=0 at i=1
42  su(1,:mf) = zero
43  sv(1,:nf) = zero
44 
45  du = pi2/nu !basic steps in u and v
46  dv = pi2/nv !nfp factors cancelled out...
47  cu(2,1) = cos(du) !These are the ONLY calls to COS/sin
48  su(2,1) = sin(du) !remember, u(i)=du*(i-1)
49  cv(2,1) = cos(dv) !so u=du and v=dv at i=2
50  sv(2,1) = sin(dv)
51 
52 c.... Next, Calculate COS/SIN(m*u)=cos/SIN(u) for m=1
53 c USE SIN/COS(du) to calculate SIN/COS(u) : u=i*du
54  DO i = 3, nu
55  j = i - 1
56  cu(i,1) = cu(2,1)*cu(j,1) - su(2,1)*su(j,1)
57  su(i,1) = su(2,1)*cu(j,1) + cu(2,1)*su(j,1)
58  END DO
59 
60 c And calculate COS/SIN(n*v)=cos/SIN(v) for n=1
61 c USE SIN/COS(dv) to calculate SIN/COS(v) : v=i*dv
62  DO i = 3, nvh
63  j = i - 1
64  cv(i,1) = cv(2,1)*cv(j,1) - sv(2,1)*sv(j,1)
65  sv(i,1) = sv(2,1)*cv(j,1) + cv(2,1)*sv(j,1)
66  END DO
67 
68 c.... Then USE SIN/COS(u) to calculate SIN/COS(m*u) for ALL u
69  DO i = 2, mf
70  j = i - 1
71  cu(:,i) = cu(:,1)*cu(:,j) - su(:,1)*su(:,j)
72  su(:,i) = su(:,1)*cu(:,j) + cu(:,1)*su(:,j)
73  END DO
74 
75 c And USE SIN/COS(v) to calculate SIN/COS(n*v) for ALL v
76  DO i = 2, nf
77  j = i - 1
78  cv(:,i) = cv(:,1)*cv(:,j) - sv(:,1)*sv(:,j)
79  sv(:,i) = sv(:,1)*cv(:,j) + cv(:,1)*sv(:,j)
80  END DO
81 
82 c..... Now ALL the SIN/COS(m*u) and SIN/COS(n*v) are READy, so
83 c Calculate SIN/COS(m*u+n*v) at ALL u,v for m=0,mf; n=-nf,nf
84  DO m = 0, mf
85  DO n = 0, nf
86  i = 0 !i is REAL space INDEX 1,nuvh
87  DO kv = 1, nvh
88  DO ku = 1, nu
89  i = i + 1 !i goes from 1 to nuvh=nu*(1+nv/2)
90  cc = cu(ku,m)*cv(kv,n)
91  ss = su(ku,m)*sv(kv,n)
92  sc = su(ku,m)*cv(kv,n)
93  cs = cu(ku,m)*sv(kv,n)
94  cmunv(i,m,n) = cc - ss
95  cmunv(i,m,(-n)) = cc + ss
96  smunv(i,m,n) = sc + cs
97  smunv(i,m,(-n)) = sc - cs
98  END DO
99  END DO
100  END DO !ku loop
101  END DO !kv loop
102 
103  END SUBROUTINE trigfact