V3FIT
fmn_to_uv.f
1  SUBROUTINE fmn_to_uv(nu,nv,nuvh,fuv,mf,nf,mnf,fmn,ms,ns,sincos)
2  USE stel_kinds
3  IMPLICIT NONE
4 C-----------------------------------------------
5 C D u m m y A r g u m e n t s
6 C-----------------------------------------------
7  INTEGER nu, nv, nuvh, mf, nf, mnf, ms, ns
8  REAL(rprec), DIMENSION(nuvh) :: fuv
9  REAL(rprec), DIMENSION(mnf) :: fmn
10  REAL(rprec), DIMENSION(nuvh,0:ms,-ns:ns) :: sincos
11 C-----------------------------------------------
12 C L o c a l P a r a m e t e r s
13 C-----------------------------------------------
14  REAL(rprec), PARAMETER :: zero = 0
15 C-----------------------------------------------
16 C L o c a l V a r i a b l e s
17 C-----------------------------------------------
18  INTEGER :: i, kv, ku, k, m
19 C-----------------------------------------------
20 c Calculate inverse SIN/COS transform of fmn on mn space, i.e.,
21 c fuv(u,v)=Sum_m_n[ fmn * SIN(2*pi*(m*u+n*v)) ]
22 c
23 c Inputs:
24 c mf,nf,mnf: MAX m, n anf dimensions of arrays
25 c DIMENSION mnf must be = nf+mf*(2*nf+1))
26 c fmn(mnf) : Fourier transform of fuv
27 c
28 c Outputs:
29 c fuv(nuvh), nuvh: (fuv(nuvh) is defined on half field period)
30 c DIMENSION nuvh must be = nu*nv/2+nu
31 c
32  fuv = zero
33  IF (nf .lt. 0) nf = -nf
34 
35 c Calculate fuv at each point on half+ period on uv surface
36  i = 0 !i is REAL space infex 1,nuvh
37  DO kv = 1, 1 + nv/2 !See surfacep.f, this is the same
38  DO ku = 1, nu
39  i = i + 1 !i goes from 1 to nuvh=nu*(1+nv/2)
40 c Find fuv(i) at this uv point
41 c Go over m=0,mf; n=-nf,nf
42  k = 0 !k is fourier space INDEX 1,mnfim
43 c !m=0 CASE, -nf<n<-1
44  fuv(i) = fuv(i) + sum(fmn(k+1:nf+1+k)*sincos(i,0,0:nf))
45  k = nf + 1 + k
46 c
47  DO m = 1, mf !for m>0, n=-nf:nf
48  fuv(i) = fuv(i) + sum(fmn(k+1:nf*2+1+k)*
49  1 sincos(i,m,-nf:nf))
50  k = nf*2 + 1 + k
51  END DO
52  END DO !ku loop
53  END DO !kv loop
54 
55  END SUBROUTINE fmn_to_uv