V3FIT
lamcal.f90
1  SUBROUTINE lamcal_par(overg, guu, guv, gvv)
2  USE vmec_main
3  USE vmec_params, ONLY: ntmax, jlam, lamscale
4  USE realspace, ONLY: psqrts
5  USE parallel_include_module
6  IMPLICIT NONE
7 !-----------------------------------------------
8 ! D u m m y A r g u m e n t s
9 !-----------------------------------------------
10  REAL(rprec), DIMENSION(nznt,ns), INTENT(in) :: &
11  overg, guu, guv, gvv
12 !-----------------------------------------------
13 ! L o c a l P a r a m e t e r s
14 !-----------------------------------------------
15  REAL(rprec), PARAMETER :: damping_fac = 2
16 !-----------------------------------------------
17 ! L o c a l V a r i a b l e s
18 !-----------------------------------------------
19  INTEGER :: m, n, js, nsmin, nsmax, numjs, i, j, k, l
20  REAL(rprec) :: tnn, tnm, tmm, power, pfactor0, pfactor
21 
22  INTEGER :: blksize
23  INTEGER, ALLOCATABLE, DIMENSION(:) :: counts, disps
24  REAL(rprec), ALLOCATABLE, DIMENSION(:,:,:,:) :: send_buf
25  REAL(rprec), ALLOCATABLE, DIMENSION(:) :: recv_buf
26  REAL(rprec) :: allgvton, allgvtoff
27 !-----------------------------------------------
28 
29  nsmin=tlglob; nsmax=t1rglob
30 
31  blam(nsmin:nsmax) = sum(guu(:,nsmin:nsmax)*overg(:,nsmin:nsmax), dim=1)
32  clam(nsmin:nsmax) = sum(gvv(:,nsmin:nsmax)*overg(:,nsmin:nsmax), dim=1)
33  dlam(nsmin:nsmax) = sum(guv(:,nsmin:nsmax)*overg(:,nsmin:nsmax), dim=1)
34  blam(1) = blam(2)
35  clam(1) = clam(2)
36  dlam(1) = dlam(2)
37  blam(ns+1) = 0
38  clam(ns+1) = 0
39  dlam(ns+1) = 0
40 
41  nsmin=max(2,tlglob); nsmax=trglob
42  DO js = nsmin, nsmax
43  blam(js) = cp5*(blam(js) + blam(js+1))
44  clam(js) = cp5*(clam(js) + clam(js+1))
45  dlam(js) = cp5*(dlam(js) + dlam(js+1))
46  END DO
47 
48  pfaclam = 0
49 ! pfactor0 = 2*damping_fac/(2*r0scale*lamscale)**2
50  pfactor0 = damping_fac/(2*r0scale*lamscale)**2
51 
52  DO m = 0, mpol1
53  tmm = m*m
54  power = min(tmm/256, 8._dp)
55  pfactor = pfactor0
56  DO n = 0, ntor
57  IF (m.eq.0 .and. n.eq.0) cycle
58  tnn = (n*nfp)**2
59  tnm = 2*m*n*nfp
60 
61  DO js = max(jlam(m),tlglob), trglob
62  pfaclam(n,m,js,1) = blam(js)*tnn + clam(js)*tmm &
63  + sign(dlam(js),blam(js))*tnm
64  IF (pfaclam(n,m,js,1) .eq. zero) THEN
65  pfaclam(n,m,js,1) = -1.e-10_dp
66  END IF
67  pfaclam(n,m,js,1) = (pfactor/pfaclam(n,m,js,1)) &
68  * psqrts(1,js)**power !Damps m > 16 modes
69  END DO
70  END DO
71  END DO
72 
73  nsmin=tlglob; nsmax=trglob
74  DO n = 2, ntmax
75  pfaclam(0:ntor,0:mpol1,nsmin:nsmax,n) = &
76  pfaclam(0:ntor,0:mpol1,nsmin:nsmax,1)
77  END DO
78 
79 !
80 ! ADD NORM FOR CHIP (PREVIOUSLY IOTA) FORCE, STORED IN lmnsc(m=0,n=0) COMPONENT
81 !
82  nsmin=tlglob; nsmax=trglob
83  DO js = nsmin, nsmax
84  pfaclam(0,0,js,1) = (pfactor0*lamscale**2)/blam(js)
85  END DO
86 
87  END SUBROUTINE lamcal_par
88 
89  SUBROUTINE lamcal(overg, guu, guv, gvv)
90  USE vmec_main
91  USE vmec_params, ONLY: ntmax, jlam, lamscale
92  USE realspace, ONLY: sqrts
93 
94  IMPLICIT NONE
95 !-----------------------------------------------
96 ! D u m m y A r g u m e n t s
97 !-----------------------------------------------
98  REAL(rprec), DIMENSION(ns,nznt), INTENT(in) :: &
99  overg, guu, guv, gvv
100 !-----------------------------------------------
101 ! L o c a l P a r a m e t e r s
102 !-----------------------------------------------
103  REAL(rprec), PARAMETER :: damping_fac=2
104 !-----------------------------------------------
105 ! L o c a l V a r i a b l e s
106 !-----------------------------------------------
107  INTEGER :: m,n,js
108  REAL(rprec) :: tnn, tnm, tmm, power, pfactor0, pfactor
109 
110 !-----------------------------------------------
111 
112 
113  blam(:ns) = sum(guu*overg, dim=2)
114  clam(:ns) = sum(gvv*overg, dim=2)
115  dlam(:ns) = sum(guv*overg, dim=2)
116  blam(1) = blam(2)
117  clam(1) = clam(2)
118  dlam(1) = dlam(2)
119  blam(ns+1) = 0
120  clam(ns+1) = 0
121  dlam(ns+1) = 0
122  DO js = 2, ns
123  blam(js) = cp5*(blam(js) + blam(js+1))
124  clam(js) = cp5*(clam(js) + clam(js+1))
125  dlam(js) = cp5*(dlam(js) + dlam(js+1))
126  END DO
127 
128  faclam = 0
129  pfactor0 = damping_fac/(2*r0scale*lamscale)**2
130 
131  DO m = 0, mpol1
132  tmm = m*m
133  power = min(tmm/256, 8._dp)
134  pfactor = pfactor0
135  DO n = 0, ntor
136  IF (m.eq.0 .and. n.eq.0) cycle
137 ! IF (n .gt. 1) pfactor = pfactor0/4 !sometimes helps convergence
138  tnn = (n*nfp)**2
139  tnm = 2*m*n*nfp
140  DO js = jlam(m), ns
141  faclam(js,n,m,1) = blam(js)*tnn + clam(js)*tmm &
142  + sign(dlam(js),blam(js))*tnm
143  IF (faclam(js,n,m,1) .eq. zero) THEN
144  faclam(js,n,m,1) = -1.e-10_dp
145  END IF
146  faclam(js,n,m,1) = (pfactor/faclam(js,n,m,1)) &
147  * sqrts(js)**power !Damps m > 16 modes
148  END DO
149  END DO
150  END DO
151 
152  DO n = 2, ntmax
153  faclam(:ns,0:ntor,0:mpol1,n) = faclam(:ns,0:ntor,0:mpol1,1)
154  END DO
155 !
156 ! ADD NORM FOR CHIP (PREVIOUSLY IOTA) FORCE, STORED IN lmnsc(m=0,n=0) COMPONENT
157 !
158  DO js = 1, ns
159  faclam(js,0,0,1) = (pfactor0*lamscale**2)/blam(js)
160  END DO
161 
162  END SUBROUTINE lamcal