V3FIT
profil3d.f
1  SUBROUTINE profil3d_par(rmn, zmn, lreset, linterp)
2  USE vmec_main
3  USE vmec_params
4  USE vspline, ONLY: sknots, pknots, hstark, hthom
5  USE realspace
6  USE xstuff
7 #ifdef _HBANGLE
8  USE angle_constraints, ONLY: store_init_array
9 #endif
10  USE parallel_include_module
11  IMPLICIT NONE
12 !-----------------------------------------------
13 ! D u m m y A r g u m e n t s
14 !-----------------------------------------------
15  REAL(dp), DIMENSION(0:ntor,0:mpol1,ns,ntmax), INTENT(inout) ::
16  & rmn, zmn
17  LOGICAL, INTENT(in) :: lreset, linterp
18 
19 !-----------------------------------------------
20 ! L o c a l V a r i a b l e s
21 !-----------------------------------------------
22  INTEGER :: js, l, lk, lt, lz, ntype, m, n, mn
23  REAL(dp), DIMENSION(0:ntor,ntmax) :: rold, zold
24  REAL(dp) :: sm0, t1, facj, si, rax1, zax1
25  INTEGER :: jcount, jk, k
26  INTEGER :: i, j, nsmin, nsmax, lpar
27  REAL(dp), ALLOCATABLE, DIMENSION(:,:) :: bcast_buf
28 
29 !-----------------------------------------------
30 ! INDEX OF LOCAL VARIABLES
31 !
32 ! phip radial derivative of phi/(2*pi) on half-grid
33 ! chip radial derivative of chi/(2*pi) on half-grid
34 ! shalf sqrt(s) ,two-dimensional array on half-grid
35 ! sqrts sqrt(s), two-dimensional array on full-grid
36 ! wint two-dimensional array for normalizing angle integrations
37 ! ireflect two-dimensional array for computing 2pi-v angle
38 !-----------------------------------------------
39 ! CALL second0(tprofon)
40 
41  nsmin = t1lglob; nsmax = t1rglob
42  DO js = nsmin, nsmax
43  pphip(:,js) = phips(js)
44  pchip(:,js) = chips(js)
45  END DO
46 
47  faclam = 0
48  sigma_an = 1 !INITIALIZE sigma FOR ANISOTROPIC PLASMA
49  pwint(:,1) = 0
50  pfaclam(:,:,nsmin:nsmax,:)=0
51 !
52 ! COMPUTE ARRAY FOR REFLECTING v = -v (ONLY needed for lasym)
53 !
54  DO k = 1, nzeta
55  jk = nzeta + 2 - k
56  IF (k .eq. 1) THEN
57  jk = 1
58  END IF
59  ireflect_par(k) = jk
60  END DO
61 
62  lk = 0
63  DO lt = 1, ntheta3
64  DO lz = 1, nzeta
65  lk = lk + 1
66  pwint_ns(lk) = cosmui3(lt,0)/mscale(0)
67  DO js = max(2, t1lglob), t1rglob
68  pwint(lk,js) = pwint_ns(lk)
69  END DO
70  END DO
71  END DO
72 
73 ! INDEX FOR u = -u (need for lasym integration in wrout)
74  lk = 0
75  IF (.NOT.ALLOCATED(uminus)) THEN
76  ALLOCATE(uminus(nznt))
77  END IF
78  DO lt = 1, ntheta2
79  k = ntheta1 - lt + 2
80  IF (lt .eq. 1) THEN
81  k = 1 !u=-0 => u=0
82  END IF
83  DO lz = 1, nzeta
84  lk = lk + 1
85  uminus(lk) = k !(-u), for u = 0,pi
86  END DO
87  END DO
88 
89 !
90 ! COMPUTE INITIAL R AND Z FOURIER COEFFICIENTS,
91 ! FROM SCALED BOUNDARY VALUES, AND SCALXC ARRAY
92 ! (1/SQRTS FACTOR FOR ODD M VALUES)
93 !
94 
95  nsmin = t1lglob
96  nsmax = t1rglob
97 
98  rold(0:ntor,1:ntmax) = rmn(0:ntor,0,1,1:ntmax)
99  zold(0:ntor,1:ntmax) = zmn(0:ntor,0,1,1:ntmax)
100 
101  IF (nranks.GT.1) THEN
102  ALLOCATE(bcast_buf(0:2*ntor+1,1:ntmax))
103  bcast_buf(0:ntor,1:ntmax) = rold(0:ntor,1:ntmax)
104  bcast_buf(ntor+1:2*ntor+1,1:ntmax) = zold(0:ntor,1:ntmax)
105  CALL mpi_bcast(bcast_buf, 2*(ntor + 1)*ntmax, mpi_real8, 0,
106  & ns_comm, mpi_err)
107  rold(0:ntor,1:ntmax) = bcast_buf(0:ntor,1:ntmax)
108  zold(0:ntor,1:ntmax) = bcast_buf(ntor+1:2*ntor+1,1:ntmax)
109  DEALLOCATE(bcast_buf)
110  END IF
111 
112  nsmin = t1lglob
113  nsmax = t1rglob
114  DO js = nsmin, nsmax
115  si = psqrts(1,js)*psqrts(1,js)
116  sm0 = one - si
117  DO ntype = 1, ntmax
118  DO m = 0, mpol1
119  DO n = 0, ntor
120  t1 = one/(mscale(m)*nscale(n))
121  mn = n + ntor1*m
122  lpar = mn+mnsize*(js - 1) + (ntype - 1)*mns + 1
123  IF (mod(m,2) .eq. 0) THEN
124  pscalxc(lpar) = one
125  ELSE
126  pscalxc(lpar) = one/psqrts(1,max(2,js))
127  END IF
128 
129  pscalxc(lpar+irzloff)=pscalxc(lpar)
130  pscalxc(lpar+2*irzloff)=pscalxc(lpar)
131 
132 ! Do not overwrite r,z if read in from wout file AND in free bdy mode
133 ! For fixed boundary, edge values MAY have been perturbed, so must execute this loop
134  IF (.not.lreset .and. lfreeb) cycle
135  IF (m .eq. 0) THEN
136  IF (.not.lreset) cycle !Freeze axis if read in from wout file
137 
138  rmn(n,m,js,ntype) = rmn(n,m,js,ntype)
139  & + si*(rmn_bdy(n,m,ntype)*t1 -
140  & rmn(n,m,ns,ntype))
141  zmn(n,m,js,ntype) = zmn(n,m,js,ntype)
142  & + si*(zmn_bdy(n,m,ntype)*t1 -
143  & zmn(n,m,ns,ntype))
144 
145  IF (ntype .eq. rcc) rax1 = raxis_cc(n)
146  IF (ntype .eq. zcs) zax1 =-zaxis_cs(n)
147  IF (ntype .eq. rcs) rax1 =-raxis_cs(n)
148  IF (ntype .eq. zcc) zax1 = zaxis_cc(n)
149 
150  IF (ntype.eq.rcc .or. ntype.eq.rcs) THEN
151  rmn(n,m,js,ntype) = rmn(n,m,js,ntype)
152  & + sm0*(rax1*t1 -
153  & rold(n,ntype))
154  END IF
155  IF (ntype.eq.zcs .or. ntype.eq.zcc) THEN
156  zmn(n,m,js,ntype) = zmn(n,m,js,ntype)
157  & + sm0*(zax1*t1 -
158  & zold(n,ntype))
159  END IF
160  ELSE
161  facj = psqrts(1,js)**m !!TURN OFF NEXT 3 LINES IF THIS ONE ACTIVATED
162  rmn(n,m,js,ntype) = rmn(n,m,js,ntype)
163  & + (rmn_bdy(n,m,ntype)*t1 -
164  & rmn(n,m,ns,ntype))*facj
165  zmn(n,m,js,ntype) = zmn(n,m,js,ntype)
166  & + (zmn_bdy(n,m,ntype)*t1 -
167  & zmn(n,m,ns,ntype))*facj
168  END IF
169  END DO
170  END DO
171  END DO
172  END DO
173 
174 #ifdef _HBANGLE
175  IF (.NOT.linterp) THEN
176  CALL store_init_array(xc)
177  END IF
178 #endif
179 
180  END SUBROUTINE profil3d_par
181 
182  SUBROUTINE profil3d(rmn, zmn, lreset, linterp)
183  USE vmec_main
184  USE vmec_params
185  USE vspline, ONLY: sknots, pknots, hstark, hthom
186  USE realspace
187  USE xstuff
188 #ifdef _HBANGLE
189  USE angle_constraints, ONLY: store_init_array
190 #endif
191 
192  IMPLICIT NONE
193 !-----------------------------------------------
194 ! D u m m y A r g u m e n t s
195 !-----------------------------------------------
196  REAL(dp), DIMENSION(ns,0:ntor,0:mpol1,ntmax), INTENT(inout) ::
197  & rmn, zmn
198  LOGICAL, INTENT(in) :: lreset, linterp
199 !-----------------------------------------------
200 ! L o c a l V a r i a b l e s
201 !-----------------------------------------------
202  INTEGER :: js, l, lk, lt, lz, ntype, m, n, mn
203  REAL(dp), DIMENSION(0:ntor,ntmax) :: rold, zold
204  REAL(dp) :: sm0, t1, facj, si, rax1, zax1
205  INTEGER :: jcount, jk, k
206 
207 !-----------------------------------------------
208 
209 !
210 ! INDEX OF LOCAL VARIABLES
211 !
212 ! phip radial derivative of phi/(2*pi) on half-grid
213 ! chip radial derivative of chi/(2*pi) on half-grid
214 ! shalf sqrt(s) ,two-dimensional array on half-grid
215 ! sqrts sqrt(s), two-dimensional array on full-grid
216 ! wint two-dimensional array for normalizing angle integrations
217 ! ireflect two-dimensional array for computing 2pi-v angle
218 
219  DO js = 1, ns
220  phip(js:nrzt:ns) = phips(js)
221  chip(js:nrzt:ns) = chips(js)
222  END DO
223 
224  phip(nrzt + 1) = 0
225  faclam = 0
226  sigma_an = 1 !INITIALIZE sigma FOR ANISOTROPIC PLASMA
227  wint(1:nrzt:ns) = 0
228 
229  lk = 0
230  DO lt = 1, ntheta3
231  DO lz = 1, nzeta
232  lk = lk + 1
233  DO js = 2,ns
234  wint(js+ns*(lk-1)) = cosmui3(lt,0)/mscale(0)
235  END DO
236  END DO
237  END DO
238 
239 !
240 ! COMPUTE ARRAY FOR REFLECTING v = -v (ONLY needed for lasym)
241 !
242  jcount = 0
243  DO k = 1, nzeta
244  jk = nzeta + 2 - k
245  IF (k .eq. 1) jk = 1
246  DO js = 1, ns
247  jcount = jcount+1
248  ireflect(jcount) = js + ns*(jk - 1) !Index for -zeta[k]
249  END DO
250  END DO
251 
252 ! INDEX FOR u = -u (need for lasym integration in wrout)
253  lk = 0
254  IF (.NOT.ALLOCATED(uminus)) THEN
255  ALLOCATE (uminus(nznt))
256  END IF
257  DO lt = 1, ntheta2
258  k = ntheta1 - lt + 2
259  IF (lt .eq. 1) THEN
260  k = 1 !u=-0 => u=0
261  END IF
262  DO lz = 1, nzeta
263  lk = lk + 1
264  uminus(lk) = k !(-u), for u = 0,pi
265  END DO
266  END DO
267 
268 !
269 ! COMPUTE INITIAL R AND Z FOURIER COEFFICIENTS,
270 ! FROM SCALED BOUNDARY VALUES, AND SCALXC ARRAY
271 ! (1/SQRTS FACTOR FOR ODD M VALUES)
272 !
273 
274  DO js = 1, ns
275  si = sqrts(js)*sqrts(js)
276  sm0 = one - si
277  DO ntype = 1, ntmax
278  DO m = 0, mpol1
279  DO n = 0, ntor
280  t1 = one/(mscale(m)*nscale(n))
281  mn = n + ntor1*m
282  l = js + ns*mn + (ntype - 1)*mns
283  IF (mod(m,2) .eq. 0) THEN
284  scalxc(l) = one
285  ELSE
286  scalxc(l) = one/max(sqrts(js),sqrts(2))
287  END IF
288 ! Do not overwrite r,z if read in from wout file AND in free bdy mode
289 ! For fixed boundary, edge values MAY have been perturbed, so must execute this loop
290  IF (.not.lreset .and. lfreeb) cycle
291  IF (m .eq. 0) THEN
292  IF (.not.lreset) cycle !Freeze axis if read in from wout file
293  rmn(js,n,m,ntype) = rmn(js,n,m,ntype)
294  & + si*(rmn_bdy(n,m,ntype)*t1 -
295  & rmn(ns,n,m,ntype))
296  zmn(js,n,m,ntype) = zmn(js,n,m,ntype)
297  & + si*(zmn_bdy(n,m,ntype)*t1 -
298  & zmn(ns,n,m,ntype))
299  IF (js .eq. 1) THEN
300  rold(n,ntype) = rmn(1,n,0,ntype)
301  zold(n,ntype) = zmn(1,n,0,ntype)
302  END IF
303  IF (ntype .eq. rcc) rax1 = raxis_cc(n)
304  IF (ntype .eq. zcs) zax1 =-zaxis_cs(n)
305  IF (ntype .eq. rcs) rax1 =-raxis_cs(n)
306  IF (ntype .eq. zcc) zax1 = zaxis_cc(n)
307  IF (ntype.eq.rcc .or. ntype.eq.rcs) THEN
308  rmn(js,n,m,ntype) = rmn(js,n,m,ntype)
309  & + sm0*(rax1*t1 -
310  & rold(n,ntype))
311  END IF
312  IF (ntype.eq.zcs .or. ntype.eq.zcc) THEN
313  zmn(js,n,m,ntype) = zmn(js,n,m,ntype)
314  & + sm0*(zax1*t1 -
315  & zold(n,ntype))
316  END IF
317  ELSE
318  facj = sqrts(js)**m !!TURN OFF NEXT 3 LINES IF THIS ONE ACTIVATED
319  rmn(js,n,m,ntype) = rmn(js,n,m,ntype)
320  & + (rmn_bdy(n,m,ntype)*t1 -
321  & rmn(ns,n,m,ntype))*facj
322  zmn(js,n,m,ntype) = zmn(js,n,m,ntype)
323  & + (zmn_bdy(n,m,ntype)*t1 -
324  & zmn(ns,n,m,ntype))*facj
325  END IF
326  END DO
327  END DO
328  END DO
329  END DO
330 
331  scalxc(1+irzloff:2*irzloff) = scalxc(:irzloff) !Z-components
332  scalxc(1+2*irzloff:3*irzloff) = scalxc(:irzloff) !Lamda-components
333 
334 #ifdef _HBANGLE
335  IF (.NOT.linterp) CALL store_init_array(xc)
336 #endif
337 
338  END SUBROUTINE profil3d