1 | subroutine emit(deltap, tol, orbit0, disp0, rt, u0, emit_v, & |
---|
2 | nemit_v, bmax, gmax, dismax, tunes, sig_v, pdamp) |
---|
3 | use bbfi |
---|
4 | use twiss0fi |
---|
5 | use emitfi |
---|
6 | implicit none |
---|
7 | |
---|
8 | |
---|
9 | !----------------------------------------------------------------------* |
---|
10 | ! Purpose: * |
---|
11 | ! Compute emittances by A. Chao's method. * |
---|
12 | ! Input: * |
---|
13 | ! DELTAP (real) Average energy error desired. * |
---|
14 | ! tol (real) tolerance for distinction static/dynamic: |
---|
15 | ! |e_val_5| < tol & |e-val_6| < tol: static, |
---|
16 | ! default: 1.000001 |
---|
17 | ! orbit0 (real) closed orbit from TMCLOR |
---|
18 | ! disp0 (real) dispersion from TMCLOR |
---|
19 | ! rt (real) one_turn matrix TMCLOR |
---|
20 | ! Output: |
---|
21 | ! u0 (real) Radiation loss per turn in GeV |
---|
22 | ! emit_v (real) ex, ey, et (emittances) |
---|
23 | ! nemit_v (real) exn, eyn, etn (normalised emitt., MAD style) |
---|
24 | ! bmax (real) Maximum extents of modes. |
---|
25 | ! gmax (real) Maximum divergences of modes. |
---|
26 | ! dismax (real) Maximum dispersion. |
---|
27 | ! tunes (real) qx, qy, qs |
---|
28 | ! pdamp (real) damping partition numbers |
---|
29 | ! sig_v (real) sigx, sigy, sigt, sige |
---|
30 | !----------------------------------------------------------------------* |
---|
31 | !---- Communication area for radiation damping. |
---|
32 | double precision orbit0(6), orbit(6), orbit2(6), em(6,6), rd(6,6), reval(6) |
---|
33 | double precision aival(6), rt(6,6), orbit1(6), ek(6) |
---|
34 | double precision emit_v(3), nemit_v(3), tunes(3), sig_v(4) |
---|
35 | double precision u0, pdamp(3) |
---|
36 | double precision bmax(3,3), gmax(3,3), dismax(4) |
---|
37 | double precision em2(6,6), disp(6), disp0(6),al_errors(align_max) |
---|
38 | double precision tol, deltap, get_value, arad, suml, gammas, el |
---|
39 | double precision betas, bx, gx, re(6,6), te(6,6,6), tt(6,6,6) |
---|
40 | double precision get_variable, node_value |
---|
41 | integer i, j, j1, j2, k, k1, k2, eflag, restart_sequ, n_align |
---|
42 | integer node_al_errors, code, advance_node |
---|
43 | logical m66sta, fmap, stabx, staby, stabt, frad |
---|
44 | double precision zero, one, three, twopi |
---|
45 | parameter (zero = 0.0d0, one = 1.d0, three = 3.0d0) |
---|
46 | |
---|
47 | twopi = get_variable('twopi ') |
---|
48 | do i = 1, 6 |
---|
49 | orbit(i) = orbit0(i) |
---|
50 | disp(i) = disp0(i) |
---|
51 | enddo |
---|
52 | call dzero(emit_v, 3) |
---|
53 | call dzero(nemit_v, 3) |
---|
54 | call dzero(bmax, 9) |
---|
55 | call dzero(gmax, 9) |
---|
56 | call dzero(dismax, 4) |
---|
57 | call dzero(tunes, 3) |
---|
58 | call dzero(sig_v, 4) |
---|
59 | call dzero(pdamp, 3) |
---|
60 | u0 = zero |
---|
61 | !---- Find eigenvectors at initial position. |
---|
62 | if (m66sta(rt)) then |
---|
63 | call laseig(rt, reval, aival, em) |
---|
64 | stabt = .false. |
---|
65 | ! print '('' Static map, eigenvalues:'',(/1X,2E15.8))', |
---|
66 | ! + (reval(i), aival(i), i = 1, 4) |
---|
67 | else |
---|
68 | call ladeig(rt, reval, aival, em) |
---|
69 | stabt = reval(5)**2 + aival(5)**2 .le. tol .and. & |
---|
70 | reval(6)**2 + aival(6)**2 .le. tol |
---|
71 | ! print '('' Static map, eigenvalues:'',(/1X,2E15.8))', |
---|
72 | ! + (reval(i), aival(i), i = 1, 6) |
---|
73 | endif |
---|
74 | stabx = reval(1)**2 + aival(1)**2 .le. tol .and. & |
---|
75 | reval(2)**2 + aival(2)**2 .le. tol |
---|
76 | staby = reval(3)**2 + aival(3)**2 .le. tol .and. & |
---|
77 | reval(4)**2 + aival(4)**2 .le. tol |
---|
78 | |
---|
79 | !---- Maximum extents. |
---|
80 | do j = 1, 3 |
---|
81 | j1 = 2 * j -1 |
---|
82 | j2 = 2 * j |
---|
83 | do k = 1, 3 |
---|
84 | k1 = 2 * k - 1 |
---|
85 | k2 = 2 * k |
---|
86 | bmax(j,k) = em(j1,k1) * em(j1,k1) + em(j1,k2) * em(j1,k2) |
---|
87 | gmax(j,k) = em(j2,k1) * em(j2,k1) + em(j2,k2) * em(j2,k2) |
---|
88 | enddo |
---|
89 | enddo |
---|
90 | arad = get_value('probe ','arad ') |
---|
91 | betas = get_value('probe ','beta ') |
---|
92 | gammas = get_value('probe ','gamma ') |
---|
93 | cg = arad * gammas**3 / three |
---|
94 | frad = get_value('probe ','radiate ') .ne. zero |
---|
95 | !---- Initialize damping calculation. |
---|
96 | if (frad .and. stabt) then |
---|
97 | sum(1) = zero |
---|
98 | sum(2) = zero |
---|
99 | sum(3) = zero |
---|
100 | sumu0 = zero |
---|
101 | call m66one(rd) |
---|
102 | endif |
---|
103 | call dzero(tt,216) |
---|
104 | call m66one(rt) |
---|
105 | eflag = 0 |
---|
106 | suml = zero |
---|
107 | bbd_cnt=0 |
---|
108 | bbd_flag=1 |
---|
109 | |
---|
110 | i = restart_sequ() |
---|
111 | 10 continue |
---|
112 | bbd_pos=i |
---|
113 | code = node_value('mad8_type ') |
---|
114 | if(code.eq.39) code=15 |
---|
115 | if(code.eq.38) code=24 |
---|
116 | el = node_value('l ') |
---|
117 | n_align = node_al_errors(al_errors) |
---|
118 | if (n_align.ne.0) then |
---|
119 | call dcopy(orbit, orbit2, 6) |
---|
120 | call tmali1(orbit2,al_errors,betas,gammas,orbit,re) |
---|
121 | if (.not. stabt) call m66byv(re, disp, disp) |
---|
122 | call m66mpy(re, em, em) |
---|
123 | if (frad .and. stabt) call m66mpy(re, rd, rd) |
---|
124 | endif |
---|
125 | !*---- Keep orbit at entrance. |
---|
126 | call dcopy(orbit, orbit1, 6) |
---|
127 | !---- Element matrix and length. |
---|
128 | call tmmap(code,.true.,.true.,orbit,fmap,ek,re,te) |
---|
129 | if (fmap) then |
---|
130 | !---- Advance dispersion. |
---|
131 | if (.not. stabt) then |
---|
132 | call m66byv(re, disp, disp) |
---|
133 | do j = 1, 4 |
---|
134 | dismax(j) = max(abs(disp(j)),dismax(j)) |
---|
135 | enddo |
---|
136 | endif |
---|
137 | !---- Radiation damping. |
---|
138 | call m66mpy(re, em, em2) |
---|
139 | if (frad .and. stabt) then |
---|
140 | call emdamp(code, deltap, em, em2, orbit1, orbit, re) |
---|
141 | call m66mpy(re, rd, rd) |
---|
142 | endif |
---|
143 | call dcopy(em2, em, 36) |
---|
144 | |
---|
145 | !---- Compute beta and gamma. |
---|
146 | do j = 1, 3 |
---|
147 | j1 = 2 * j -1 |
---|
148 | j2 = 2 * j |
---|
149 | do k = 1, 3 |
---|
150 | k1 = 2 * k - 1 |
---|
151 | k2 = 2 * k |
---|
152 | bx = em(j1,k1) * em(j1,k1) + em(j1,k2) * em(j1,k2) |
---|
153 | bmax(j,k) = max(bmax(j,k),bx) |
---|
154 | gx = em(j2,k1) * em(j2,k1) + em(j2,k2) * em(j2,k2) |
---|
155 | gmax(j,k) = max(gmax(j,k),gx) |
---|
156 | enddo |
---|
157 | enddo |
---|
158 | suml = suml + el |
---|
159 | endif |
---|
160 | if (n_align.ne.0) then |
---|
161 | call dcopy(orbit, orbit2, 6) |
---|
162 | call tmali2(el,orbit2,al_errors,betas,gammas,orbit,re) |
---|
163 | if (.not. stabt) call m66byv(re, disp, disp) |
---|
164 | call m66mpy(re, em, em) |
---|
165 | if (frad .and. stabt) call m66mpy(re, rd, rd) |
---|
166 | endif |
---|
167 | if (advance_node().ne.0) then |
---|
168 | i=i+1 |
---|
169 | goto 10 |
---|
170 | endif |
---|
171 | bbd_flag=0 |
---|
172 | !---- Undamped tunes and beam extents. |
---|
173 | qx = atan2(aival(1), reval(1)) / twopi |
---|
174 | if (qx .lt. zero) qx = qx + one |
---|
175 | qy = atan2(aival(3), reval(3)) / twopi |
---|
176 | if (qy .lt. zero) qy = qy + one |
---|
177 | qs = atan2(aival(5), reval(5)) / twopi |
---|
178 | if (qs .lt. zero) qs = - qs |
---|
179 | !---- Summary output. |
---|
180 | call emsumm(rd,em,bmax,gmax,stabt,frad,u0,emit_v,nemit_v,tunes, & |
---|
181 | sig_v,pdamp) |
---|
182 | end subroutine emit |
---|
183 | subroutine emsumm(rd,em,bmax,gmax,stabt,frad,u0,emit_v,nemit_v, & |
---|
184 | tunes,sig_v,pdamp) |
---|
185 | use emitfi |
---|
186 | implicit none |
---|
187 | |
---|
188 | |
---|
189 | !----------------------------------------------------------------------* |
---|
190 | ! Purpose: * |
---|
191 | ! Finish radiation damping calculation and print summary. * |
---|
192 | ! Input: * |
---|
193 | ! RD(6,6) (real) Damped one-turn transfer matrix. * |
---|
194 | ! EM(6,6) (real) Undamped eigenvectors. * |
---|
195 | ! BMAX(3,3) (real) Maximum extents of modes. * |
---|
196 | ! GMAX(3,3) (real) Maximum divergences of modes. * |
---|
197 | ! STABT (logical) anti-STATIC flag |
---|
198 | ! FRAD (logical) radiation flag |
---|
199 | ! Output: |
---|
200 | ! u0 (real) Radiation loss per turn in GeV |
---|
201 | ! emit_v (real) ex, ey, et (emittances) |
---|
202 | ! nemit_v (real) exn, eyn, etn (normalised emitt., MAD style) |
---|
203 | ! tunes (real) qx, qy, qs |
---|
204 | ! pdamp (real) damping partition numbers |
---|
205 | ! sig_v (real) sigx, sigy, sigt, sige |
---|
206 | !----------------------------------------------------------------------* |
---|
207 | integer j,j1,j2,k,k1,k2,iqpr2 |
---|
208 | double precision arad,gammas,clg,etpr,expr,eypr,f0,sal,en0 |
---|
209 | double precision amass, clight, hbar, freq0, u0, betas |
---|
210 | double precision ten3p,tenp6,tenp9,three,twopi,one,two,zero,four |
---|
211 | double precision ex,ey,et,exn,eyn,sigx,sigy,sige,sigt |
---|
212 | double precision rd(6,6), em(6,6), bmax(3,3), gmax(3,3),pdamp(3) |
---|
213 | double precision get_variable,get_value |
---|
214 | double precision emit_v(3), nemit_v(3), tunes(3), sig_v(4) |
---|
215 | logical stabt, frad |
---|
216 | double precision reval(6), aival(6), alj(3), tau(3), tune(3) |
---|
217 | double precision sigma(6,6), bstar(3,3), gstar(3,3), dummy(6,6) |
---|
218 | parameter (zero = 0.d0, one = 1.d0, two = 2.d0, three = 3.0d0) |
---|
219 | parameter (iqpr2 = 6, four = 4.d0) |
---|
220 | parameter (ten3p = 1.0d3, tenp6 = 1.0d6, tenp9 = 1.0d9) |
---|
221 | |
---|
222 | call dzero(sigma,36) |
---|
223 | ex=zero |
---|
224 | ey=zero |
---|
225 | et=zero |
---|
226 | twopi=get_variable('twopi ') |
---|
227 | clight = get_variable('clight ') |
---|
228 | hbar = get_variable('hbar ') |
---|
229 | arad = get_value('probe ','arad ') |
---|
230 | betas = get_value('probe ','beta ') |
---|
231 | gammas = get_value('probe ','gamma ') |
---|
232 | amass = get_value('probe ','mass ') |
---|
233 | freq0 = get_value('probe ','freq0 ') |
---|
234 | !---- Synchrotron energy loss [GeV]. |
---|
235 | if (stabt .and. frad) then |
---|
236 | u0 = sumu0 |
---|
237 | |
---|
238 | !---- Tunes. |
---|
239 | call ladeig(rd, reval, aival, dummy) |
---|
240 | tune(1) = atan2(aival(1), reval(1)) / twopi |
---|
241 | if (tune(1) .lt. zero) tune(1) = tune(1) + one |
---|
242 | tune(2) = atan2(aival(3), reval(3)) / twopi |
---|
243 | if (tune(2) .lt. zero) tune(2) = tune(2) + one |
---|
244 | tune(3) = atan2(aival(5), reval(5)) / twopi |
---|
245 | if (tune(3) .lt. zero) tune(3) = - tune(3) |
---|
246 | |
---|
247 | !---- Damping constants per turn. |
---|
248 | alj(1) = - log(reval(1)**2 + aival(1)**2) / two |
---|
249 | alj(2) = - log(reval(3)**2 + aival(3)**2) / two |
---|
250 | alj(3) = - log(reval(5)**2 + aival(5)**2) / two |
---|
251 | |
---|
252 | !---- Damping partition numbers. |
---|
253 | en0 = get_value('probe ','energy ') |
---|
254 | sal = two * en0 / u0 |
---|
255 | pdamp(1) = alj(1) * sal |
---|
256 | pdamp(2) = alj(2) * sal |
---|
257 | pdamp(3) = alj(3) * sal |
---|
258 | !---- Emittances. |
---|
259 | clg = ((55.d0 * hbar * clight) / (96.d0 * sqrt(three))) & |
---|
260 | * ((arad * gammas**5) / amass) |
---|
261 | ex = clg * sum(1) / alj(1) |
---|
262 | ey = clg * sum(2) / alj(2) |
---|
263 | et = clg * sum(3) / alj(3) |
---|
264 | |
---|
265 | !---- Damping constants per second and damping times. |
---|
266 | f0 = freq0 * tenp6 |
---|
267 | alj(1) = abs(alj(1) * f0) |
---|
268 | alj(2) = abs(alj(2) * f0) |
---|
269 | alj(3) = abs(alj(3) * f0) |
---|
270 | tau(1) = one / alj(1) |
---|
271 | tau(2) = one / alj(2) |
---|
272 | tau(3) = one / alj(3) |
---|
273 | endif |
---|
274 | |
---|
275 | !---- TRANSPORT sigma matrix. |
---|
276 | call emce2i(stabt, em, ex, ey, et, sigma) |
---|
277 | |
---|
278 | !---- Extents at interaction point. |
---|
279 | do j = 1, 3 |
---|
280 | j1 = 2 * j -1 |
---|
281 | j2 = 2 * j |
---|
282 | do k = 1, 3 |
---|
283 | k1 = 2 * k - 1 |
---|
284 | k2 = 2 * k |
---|
285 | bstar(j,k) = em(j1,k1) * em(j1,k1) + em(j1,k2) * em(j1,k2) |
---|
286 | gstar(j,k) = em(j2,k1) * em(j2,k1) + em(j2,k2) * em(j2,k2) |
---|
287 | enddo |
---|
288 | enddo |
---|
289 | |
---|
290 | exn = ex * four * betas * gammas |
---|
291 | eyn = ey * four * betas * gammas |
---|
292 | sigx = sqrt(abs(sigma(1,1))) |
---|
293 | sigy = sqrt(abs(sigma(3,3))) |
---|
294 | if (sigma(5,5) .gt. zero .or. sigma(6,6) .gt. zero) then |
---|
295 | sigt = sqrt(abs(sigma(5,5))) |
---|
296 | sige = sqrt(abs(sigma(6,6))) |
---|
297 | else |
---|
298 | sigt = zero |
---|
299 | sige = zero |
---|
300 | endif |
---|
301 | tunes(1) = qx |
---|
302 | tunes(2) = qy |
---|
303 | tunes(3) = qs |
---|
304 | emit_v(1) = ex |
---|
305 | emit_v(2) = ey |
---|
306 | emit_v(3) = et |
---|
307 | nemit_v(1) = exn |
---|
308 | nemit_v(2) = eyn |
---|
309 | sig_v(1) = sigx |
---|
310 | sig_v(2) = sigy |
---|
311 | sig_v(3) = sigt |
---|
312 | sig_v(4) = sige |
---|
313 | !---- Summary output; header and global parameters. |
---|
314 | !---- Dynamic case. |
---|
315 | expr = ex * tenp6 |
---|
316 | eypr = ey * tenp6 |
---|
317 | etpr = et * tenp6 |
---|
318 | if (stabt) then |
---|
319 | if (frad) write (iqpr2, 910) ten3p * u0 |
---|
320 | write (iqpr2, 920) 1, 2, 3 |
---|
321 | write (iqpr2, 930) qx, qy, qs |
---|
322 | if (frad) write (iqpr2, 940) tune |
---|
323 | write (iqpr2, 950) ((bstar(j,k), j = 1, 3), k = 1, 3), & |
---|
324 | ((gstar(j,k), j = 1, 3), k = 1, 3), & |
---|
325 | ((bmax(j,k), j = 1, 3), k = 1, 3), & |
---|
326 | ((gmax(j,k), j = 1, 3), k = 1, 3) |
---|
327 | if (frad) then |
---|
328 | write (iqpr2, 960) pdamp, alj, (tau(j), j = 1, 3), & |
---|
329 | expr, eypr, etpr |
---|
330 | endif |
---|
331 | else |
---|
332 | write (iqpr2, 920) 1, 2 |
---|
333 | write (iqpr2, 930) qx, qy |
---|
334 | write (iqpr2, 970) ((bstar(j,k), j = 1, 2), k = 1, 2), & |
---|
335 | ((gstar(j,k), j = 1, 2), k = 1, 2), & |
---|
336 | ((bmax(j,k), j = 1, 2), k = 1, 2), & |
---|
337 | ((gmax(j,k), j = 1, 2), k = 1, 2) |
---|
338 | endif |
---|
339 | |
---|
340 | !---- RF system. |
---|
341 | ! call enprrf |
---|
342 | |
---|
343 | 910 format(t6,'U0',t16,f14.6,' [MeV/turn]') |
---|
344 | 920 format(' '/' ',t42,3(9x,'M o d e',3x,i1:)) |
---|
345 | 930 format(' Fractional tunes',t30,'undamped',t42,3f20.8) |
---|
346 | 940 format(' ',t30,'damped',t42,3f20.8) |
---|
347 | 950 format(' '/' beta* [m]',t30,'x',t42,3e20.8/t30,'y',t42,3e20.8/ & |
---|
348 | t30,'t',t42,3e20.8/ & |
---|
349 | ' '/' gamma* [1/m]',t30,'px',t42,3e20.8/t30,'py',t42,3e20.8/ & |
---|
350 | t30,'pt',t42,3e20.8/ & |
---|
351 | ' '/' beta(max) [m]',t30,'x',t42,3e20.8/t30,'y',t42,3e20.8/ & |
---|
352 | t30,'t',t42,3e20.8/ & |
---|
353 | ' '/' gamma(max) [1/m]',t30,'px',t42,3e20.8/t30,'py',t42,3e20.8/ & |
---|
354 | t30,'pt',t42,3e20.8) |
---|
355 | 960 format(' '/' Damping partition numbers',t42,3f20.8/ & |
---|
356 | ' Damping constants [1/s]',t46,3e20.8/ & |
---|
357 | ' Damping times [s]',t46,3e20.8/ & |
---|
358 | ' Emittances [pi micro m]',t42,3e20.8) |
---|
359 | 970 format(' '/' beta* [m]',t30,'x',t42,2e20.8/t30,'y',t42,2e20.8/ & |
---|
360 | ' '/' gamma* [1/m]',t30,'px',t42,2e20.8/t30,'py',t42,2e20.8/ & |
---|
361 | ' '/' beta(max) [m]',t30,'x',t42,2e20.8/t30,'y',t42,2e20.8/ & |
---|
362 | ' '/' gamma(max) [1/m]',t30,'px',t42,2e20.8/t30,'py',t42,2e20.8) |
---|
363 | |
---|
364 | end subroutine emsumm |
---|
365 | subroutine emce2i(stabt, em, ex, ey, et, sigma) |
---|
366 | implicit none |
---|
367 | !----------------------------------------------------------------------* |
---|
368 | ! Purpose: * |
---|
369 | ! Convert eigenvectors to internal sigma matrix form. * |
---|
370 | ! Input: * |
---|
371 | ! EM(6,6) (real) Eigenvector matrix. * |
---|
372 | ! EX (real) Horizontal emittance. * |
---|
373 | ! EY (real) Vertical emittance. * |
---|
374 | ! ET (real) Longitudinal emittance. * |
---|
375 | ! Output: * |
---|
376 | ! SIGMA(6,6)(real) Beam matrix in internal form. * |
---|
377 | !----------------------------------------------------------------------* |
---|
378 | integer j,k |
---|
379 | double precision et, ex, ey, em(6,6), sigma(6,6) |
---|
380 | logical stabt |
---|
381 | |
---|
382 | do j = 1, 6 |
---|
383 | do k = 1, 6 |
---|
384 | sigma(j,k) = & |
---|
385 | ex * (em(j,1) * em(k,1) + em(j,2) * em(k,2)) + & |
---|
386 | ey * (em(j,3) * em(k,3) + em(j,4) * em(k,4)) |
---|
387 | if (stabt) then |
---|
388 | sigma(j,k) = sigma(j,k) + & |
---|
389 | et * (em(j,5) * em(k,5) + em(j,6) * em(k,6)) |
---|
390 | endif |
---|
391 | enddo |
---|
392 | enddo |
---|
393 | end subroutine emce2i |
---|
394 | subroutine emdamp(code, deltap, em1, em2, orb1, orb2, re) |
---|
395 | use twiss0fi |
---|
396 | use emitfi |
---|
397 | use twtrrfi |
---|
398 | implicit none |
---|
399 | |
---|
400 | |
---|
401 | !---------------------------------------------------------------------* |
---|
402 | ! Purpose: * |
---|
403 | ! Deal with radiation damping in an element. * |
---|
404 | ! Input: * |
---|
405 | ! code (int) MAD-8 element code * |
---|
406 | ! deltap (real) momentum error * |
---|
407 | ! EM1(6,6) (real) Matrix of eigenvectors at entrance. * |
---|
408 | ! EM2(6,6) (real) Matrix of eigenvectors at exit. * |
---|
409 | ! ORB1(6) (real) Orbit position at entrance. * |
---|
410 | ! ORB2(6) (real) Orbit position at exit. * |
---|
411 | ! Input/output: * |
---|
412 | ! RE(6,6) (real) Transfer matrix for the element; changed on * |
---|
413 | ! output to contain damping. * |
---|
414 | !---------------------------------------------------------------------* |
---|
415 | integer code |
---|
416 | double precision deltap |
---|
417 | double precision em1(6,6), em2(6,6), orb1(6), orb2(6), re(6,6) |
---|
418 | double precision ten3m, ten6p, zero, half, one, two, three, four |
---|
419 | double precision six, twelve |
---|
420 | parameter (ten3m = 1.0d-3, ten6p = 1.0d+6) |
---|
421 | parameter (zero = 0.0d0, half = 0.5d0) |
---|
422 | parameter (one = 1.0d0, two = 2.0d0) |
---|
423 | parameter (three = 3.0d0, twelve = 12.d0) |
---|
424 | parameter (four = 4.0d0, six = 6.0d0) |
---|
425 | integer i, j, ir, ii, n, n_ferr, iord, nn, ns, nd, nord |
---|
426 | integer node_fd_errors |
---|
427 | double precision rw(6,6), tw(6,6,6), ferror(2), rw0(6,6) |
---|
428 | double precision normal(0:maxmul), skew(0:maxmul) |
---|
429 | double precision vals(2,0:maxmul), field(2,0:maxmul) |
---|
430 | double precision f_errors(0:50) |
---|
431 | double precision o1(6), e1(6,6), o2(6), e2(6,6) |
---|
432 | double precision x1, y1, t1, x2, y2, t2, px1, py1, pt1 |
---|
433 | double precision px2, py2, pt2 |
---|
434 | equivalence (x1, o1(1)), (px1, o1(2)) |
---|
435 | equivalence (y1, o1(3)), (py1, o1(4)) |
---|
436 | equivalence (t1, o1(3)), (pt1, o1(4)) |
---|
437 | equivalence (x2, o2(1)), (px2, o2(2)) |
---|
438 | equivalence (y2, o2(3)), (py2, o2(4)) |
---|
439 | equivalence (t2, o2(3)), (pt2, o2(4)) |
---|
440 | double precision el, node_value, tilt, bvk |
---|
441 | double precision edg1, edg2, sk1, sk2, hgap, fint, sks, h, ct |
---|
442 | double precision corr, hx, hy, hxx, hxy, hyy, h1, hcb1, hcbs1 |
---|
443 | double precision tedg1, fact1, fact1x, rfac1, rfac1x, rfac1y |
---|
444 | double precision h2, hcb2, tedg2, fact2, fact2x, rfac2 |
---|
445 | double precision rfac2x, rfac2y, bi2gi2, betas, gammas |
---|
446 | double precision get_value, e5sq1, e5sq2, e5sqs1, e5sqs2, x, y |
---|
447 | double precision f1, f2, f1s, f2s, twon, str, st, pi, clight |
---|
448 | double precision r1sq, r2sq, fh1, fh2, dr, di, drt, hcb |
---|
449 | double precision rfv, rff, rfl, rfvlt, rffrq, rflag, time |
---|
450 | double precision xkick, ykick, dpx, dpy, an, hyx, hcbs2,hbi |
---|
451 | double precision sk3, rfac, rfacx, rfacy |
---|
452 | double precision get_variable, fh |
---|
453 | ! double precision sk0, sk0s |
---|
454 | if (code .eq. 8) then |
---|
455 | !--- multipole |
---|
456 | el = node_value('lrad ') |
---|
457 | else |
---|
458 | el = node_value('l ') |
---|
459 | endif |
---|
460 | if (el .eq. zero.and.code .ne. 10) goto 500 |
---|
461 | betas = get_value('probe ','beta ') |
---|
462 | gammas = get_value('probe ','gamma ') |
---|
463 | !---- Prepare data. |
---|
464 | bvk = node_value('other_bv ') |
---|
465 | !---- Switch on element type. |
---|
466 | go to (500, 20, 30, 500, 50, 60, 70, 80, 500, 100, & |
---|
467 | 500, 500, 500, 140, 150, 160, 500, 500, 500, 500, & |
---|
468 | 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, & |
---|
469 | 500, 500, 500, 500, 500, 500, 500, 500, 150, 500), code |
---|
470 | go to 500 |
---|
471 | |
---|
472 | !---- Dipole. |
---|
473 | 20 continue |
---|
474 | 30 continue |
---|
475 | |
---|
476 | ! FRS 16.11.2004 This is still in the intermediate spirit of k0&k0s |
---|
477 | ! an = node_value('angle ') |
---|
478 | ! sk0 = an / el |
---|
479 | ! sk0s = node_value('k0s ') |
---|
480 | ! if (sk0s .eq. zero) then |
---|
481 | ! tilt = zero |
---|
482 | ! else |
---|
483 | ! tilt = atan2(sk0s, sk0) |
---|
484 | ! sk0 = sqrt(sk0**2 + sk0s**2) |
---|
485 | ! an = sk0 * el |
---|
486 | ! endif |
---|
487 | ! an = bvk * an |
---|
488 | ! sk0 = bvk * sk0 |
---|
489 | ! sk0s = bvk * sk0s |
---|
490 | ! FRS 16.11.2004 here the correction |
---|
491 | an = bvk * node_value('angle ') * el/node_value('l ') |
---|
492 | tilt = -node_value('tilt ') |
---|
493 | edg1 = bvk * node_value('e1 ') |
---|
494 | edg2 = bvk * node_value('e2 ') |
---|
495 | sk1 = bvk * node_value('k1 ') |
---|
496 | sk2 = bvk * node_value('k2 ') |
---|
497 | hgap = node_value('hgap ') |
---|
498 | fint = node_value('fint ') |
---|
499 | sks = zero |
---|
500 | h = an / el |
---|
501 | |
---|
502 | !---- Refer orbit and eigenvectors to magnet midplane. |
---|
503 | ct = cos(tilt) |
---|
504 | st = sin(tilt) |
---|
505 | o1(1) = ct * orb1(1) + st * orb1(3) |
---|
506 | o1(2) = ct * orb1(2) + st * orb1(4) |
---|
507 | o1(3) = - st * orb1(1) + ct * orb1(3) |
---|
508 | o1(4) = - st * orb1(2) + ct * orb1(4) |
---|
509 | o1(5) = orb1(5) |
---|
510 | o1(6) = orb1(6) |
---|
511 | o2(1) = ct * orb2(1) + st * orb2(3) |
---|
512 | o2(2) = ct * orb2(2) + st * orb2(4) |
---|
513 | o2(3) = - st * orb2(1) + ct * orb2(3) |
---|
514 | o2(4) = - st * orb2(2) + ct * orb2(4) |
---|
515 | o2(5) = orb2(5) |
---|
516 | o2(6) = orb2(6) |
---|
517 | do i = 1, 6 |
---|
518 | e1(1,i) = ct * em1(1,i) + st * em1(3,i) |
---|
519 | e1(2,i) = ct * em1(2,i) + st * em1(4,i) |
---|
520 | e1(3,i) = - st * em1(1,i) + ct * em1(3,i) |
---|
521 | e1(4,i) = - st * em1(2,i) + ct * em1(4,i) |
---|
522 | e1(5,i) = em1(5,i) |
---|
523 | e1(6,i) = em1(6,i) |
---|
524 | e2(1,i) = ct * em2(1,i) + st * em2(3,i) |
---|
525 | e2(2,i) = ct * em2(2,i) + st * em2(4,i) |
---|
526 | e2(3,i) = - st * em2(1,i) + ct * em2(3,i) |
---|
527 | e2(4,i) = - st * em2(2,i) + ct * em2(4,i) |
---|
528 | e2(5,i) = em2(5,i) |
---|
529 | e2(6,i) = em2(6,i) |
---|
530 | enddo |
---|
531 | !---- Move through orbit through fringing field; |
---|
532 | ! Requested components of eigenvectors are not affected. |
---|
533 | corr = (h + h) * hgap * fint |
---|
534 | call m66one(rw) |
---|
535 | call dzero(tw,216) |
---|
536 | call tmfrng(.false.,h,sk1,edg1,zero,+one,corr,rw,tw) |
---|
537 | call m66byv(rw,o1,o1) |
---|
538 | call m66one(rw) |
---|
539 | call dzero(tw,216) |
---|
540 | call tmfrng(.false.,h,sk1,edg2,zero,-one,corr,rw,tw) |
---|
541 | call dcopy(rw,rw0,36) |
---|
542 | call m66inv(rw0,rw) |
---|
543 | call m66byv(rw,o2,o2) |
---|
544 | |
---|
545 | !---- Local curvature and its derivatives, |
---|
546 | ! Coefficients for damping matrix. |
---|
547 | hx = sk1*x1 + sks*y1 + h + half*sk2 * (x1**2 - y1**2) |
---|
548 | hy = sks*x1 - sk1*y1 - sk2*x1*y1 |
---|
549 | hxx = sk1 + sk2*x1 |
---|
550 | hxy = sks - sk2*y1 |
---|
551 | hyx = hxy |
---|
552 | hyy = - hxx |
---|
553 | h1 = sqrt(hx**2 + hy**2) |
---|
554 | hcb1 = h1**3 |
---|
555 | hcbs1 = three*h1 * & |
---|
556 | (hx * (hxx*px1 + hxy*py1) + hy * (hxy*px1 + hyy*py1)) |
---|
557 | |
---|
558 | tedg1 = tan(edg1) |
---|
559 | fact1 = (one + h*x1) * (one - tedg1*x1) |
---|
560 | fact1x = h - tedg1 - 2.0*h*tedg1*x1 |
---|
561 | rfac1 = cg*el*h1**2*fact1 |
---|
562 | rfac1x = cg*el * (two*(hx*hxx+hy*hyx)*fact1 + h1**2*fact1x) |
---|
563 | rfac1y = cg*el * two*(hx*hxy+hy*hyy)*fact1 |
---|
564 | |
---|
565 | hx = sk1*x2 + sks*y2 + h + half*sk2 * (x2**2 - y2**2) |
---|
566 | hy = sks*x2 - sk1*y2 - sk2*x2*y2 |
---|
567 | hxx = sk1 + sk2*x2 |
---|
568 | hxy = sks - sk2*y2 |
---|
569 | hyx = hxy |
---|
570 | hyy = - hxx |
---|
571 | h2 = sqrt(hx**2 + hy**2) |
---|
572 | hcb2 = h2**3 |
---|
573 | hcbs2 = three*h2 * & |
---|
574 | (hx * (hxx*px2 + hxy*py2) + hy * (hxy*px2 + hyy*py2)) |
---|
575 | |
---|
576 | tedg2 = tan(edg2) |
---|
577 | fact2 = (one + h*x2) * (one - tedg2*x2) |
---|
578 | fact2x = h - tedg2 - 2.0*h*tedg2*x2 |
---|
579 | rfac2 = cg*el*h2**2*fact2 |
---|
580 | rfac2x = cg*el * (two*(hx*hxx+hy*hyx)*fact2 + h2**2*fact2x) |
---|
581 | rfac2y = cg*el * two*(hx*hxy+hy*hyy)*fact2 |
---|
582 | |
---|
583 | !---- Cubic integration over h**3 * E(i,5) * conjg(E(i,5)). |
---|
584 | bi2gi2 = one / (betas * gammas)**2 |
---|
585 | hbi = h / betas |
---|
586 | do i = 1, 3 |
---|
587 | ir = 2 * i - 1 |
---|
588 | ii = 2 * i |
---|
589 | |
---|
590 | !---- E(i,5) * conjg(E(i,5)) and its derivative w.r.t. S. |
---|
591 | e5sq1 = e1(5,ir)**2 + e1(5,ii)**2 |
---|
592 | e5sq2 = e2(5,ir)**2 + e2(5,ii)**2 |
---|
593 | e5sqs1 = two * (e1(5,ir) * (bi2gi2*e1(6,ir) - hbi*e1(1,ir)) & |
---|
594 | + e1(5,ii) * (bi2gi2*e1(6,ii) - hbi*e1(1,ii))) |
---|
595 | e5sqs2 = two * (e2(5,ir) * (bi2gi2*e2(6,ir) - hbi*e2(1,ir)) & |
---|
596 | + e2(5,ii) * (bi2gi2*e2(6,ii) - hbi*e2(1,ii))) |
---|
597 | |
---|
598 | !---- Integrand and its derivative w.r.t. S. |
---|
599 | f1 = hcb1 * e5sq1 |
---|
600 | f2 = hcb2 * e5sq2 |
---|
601 | f1s = hcbs1 * e5sq1 + hcb1 * e5sqs1 |
---|
602 | f2s = hcbs2 * e5sq2 + hcb2 * e5sqs2 |
---|
603 | |
---|
604 | !---- Actual integration. |
---|
605 | sum(i) = sum(i) + half * el * (f1 + f2) - & |
---|
606 | el**2 * (f2s - f1s) / twelve |
---|
607 | enddo |
---|
608 | go to 77 |
---|
609 | |
---|
610 | !---- Quadrupole. |
---|
611 | 50 continue |
---|
612 | bvk = node_value('other_bv ') |
---|
613 | sk1 = bvk * node_value('k1 ') |
---|
614 | str = sk1 |
---|
615 | n = 1 |
---|
616 | twon = two |
---|
617 | go to 75 |
---|
618 | |
---|
619 | !---- Sextupole. |
---|
620 | 60 continue |
---|
621 | bvk = node_value('other_bv ') |
---|
622 | sk2 = bvk * node_value('k2 ') |
---|
623 | str = sk2 / two |
---|
624 | n = 2 |
---|
625 | twon = four |
---|
626 | go to 75 |
---|
627 | |
---|
628 | !---- Octupole. |
---|
629 | 70 continue |
---|
630 | bvk = node_value('other_bv ') |
---|
631 | sk3 = bvk * node_value('k2 ') |
---|
632 | str = sk3 / six |
---|
633 | n = 3 |
---|
634 | twon = six |
---|
635 | |
---|
636 | !---- Common to all pure multipoles. |
---|
637 | 75 continue |
---|
638 | call dcopy(orb1, o1, 6) |
---|
639 | call dcopy(orb2, o2, 6) |
---|
640 | call dcopy(em1, e1, 36) |
---|
641 | call dcopy(em2, e2, 36) |
---|
642 | |
---|
643 | !---- Local curvature. |
---|
644 | r1sq = orb1(1)**2 + orb1(3)**2 |
---|
645 | r2sq = orb2(1)**2 + orb2(3)**2 |
---|
646 | h1 = abs(str) * sqrt(r1sq)**n |
---|
647 | h2 = abs(str) * sqrt(r2sq)**n |
---|
648 | rfac = cg * str**2 * el |
---|
649 | rfac1 = rfac * r1sq**n |
---|
650 | rfac2 = rfac * r2sq**n |
---|
651 | rfac1x = twon * rfac * r1sq**(n-1) * x1 |
---|
652 | rfac2x = twon * rfac * r1sq**(n-1) * x2 |
---|
653 | rfac1y = twon * rfac * r1sq**(n-1) * y1 |
---|
654 | rfac2y = twon * rfac * r1sq**(n-1) * y2 |
---|
655 | |
---|
656 | !---- Trapezoidal integration over h**3 * E(k,5) * conjg(E(k,5)). |
---|
657 | fh1 = half * el * h1**3 |
---|
658 | fh2 = half * el * h2**3 |
---|
659 | sum(1) = sum(1) + fh1 * (e1(5,1)**2 + e1(5,2)**2) & |
---|
660 | + fh2 * (e2(5,1)**2 + e2(5,2)**2) |
---|
661 | sum(2) = sum(2) + fh1 * (e1(5,3)**2 + e1(5,4)**2) & |
---|
662 | + fh2 * (e2(5,3)**2 + e2(5,4)**2) |
---|
663 | sum(3) = sum(3) + fh1 * (e1(5,5)**2 + e1(5,6)**2) & |
---|
664 | + fh2 * (e2(5,5)**2 + e2(5,6)**2) |
---|
665 | |
---|
666 | !---- Damping matrices. |
---|
667 | ! Code common to bending magnet and pure multipoles. |
---|
668 | 77 call m66one(rw) |
---|
669 | rw(2,1) = - rfac1x * (one + pt1) * px1 |
---|
670 | rw(2,2) = one - rfac1 * (one + pt1) |
---|
671 | rw(2,3) = - rfac1y * (one + pt1) * px1 |
---|
672 | rw(2,6) = - rfac1 * px1 |
---|
673 | rw(4,1) = - rfac1x * (one + pt1) * py1 |
---|
674 | rw(4,3) = - rfac1y * (one + pt1) * py1 |
---|
675 | rw(4,4) = one - rfac1 * (one + pt1) |
---|
676 | rw(4,6) = - rfac1 * py1 |
---|
677 | rw(6,1) = - rfac1x * (one + pt1)**2 |
---|
678 | rw(6,3) = - rfac1y * (one + pt1)**2 |
---|
679 | rw(6,6) = one - two * rfac1 * (one + pt1) |
---|
680 | call m66mpy(re, rw, re) |
---|
681 | |
---|
682 | call m66one(rw) |
---|
683 | rw(2,1) = - rfac2x * (one + pt2) * px2 |
---|
684 | rw(2,2) = one - rfac2 * (one + pt2) |
---|
685 | rw(2,3) = - rfac2y * (one + pt2) * px2 |
---|
686 | rw(2,6) = - rfac2 * px2 |
---|
687 | rw(4,1) = - rfac2x * (one + pt2) * py2 |
---|
688 | rw(4,3) = - rfac2y * (one + pt2) * py2 |
---|
689 | rw(4,4) = one - rfac2 * (one + pt2) |
---|
690 | rw(4,6) = - rfac2 * py2 |
---|
691 | rw(6,1) = - rfac2x * (one + pt2)**2 |
---|
692 | rw(6,3) = - rfac2y * (one + pt2)**2 |
---|
693 | rw(6,6) = one - two * rfac2 * (one + pt2) |
---|
694 | call m66mpy(rw, re, re) |
---|
695 | go to 500 |
---|
696 | |
---|
697 | !---- Thin multipoles, EL is the fictitious length for radiation. |
---|
698 | 80 continue |
---|
699 | !---- Multipole components. |
---|
700 | call dzero(f_errors,maxferr+1) |
---|
701 | n_ferr = node_fd_errors(f_errors) |
---|
702 | bvk = node_value('other_bv ') |
---|
703 | call dzero(normal,maxmul+1) |
---|
704 | call dzero(skew,maxmul+1) |
---|
705 | call get_node_vector('knl ',nn,normal) |
---|
706 | call get_node_vector('ksl ',ns,skew) |
---|
707 | call dzero(vals,2*(maxmul+1)) |
---|
708 | do iord = 0, nn |
---|
709 | vals(1,iord) = normal(iord) |
---|
710 | enddo |
---|
711 | do iord = 0, ns |
---|
712 | vals(2,iord) = skew(iord) |
---|
713 | enddo |
---|
714 | |
---|
715 | !---- Field error vals. |
---|
716 | call dzero(field,2*(maxmul+1)) |
---|
717 | if (n_ferr .gt. 0) then |
---|
718 | call dcopy(f_errors,field,n_ferr) |
---|
719 | endif |
---|
720 | nd = 2 * max(nn, ns, n_ferr/2-1) |
---|
721 | |
---|
722 | !---- Other components and errors. |
---|
723 | nord = 0 |
---|
724 | do iord = 0, nd/2 |
---|
725 | do j = 1, 2 |
---|
726 | field(j,iord) = bvk * (vals(j,iord) + field(j,iord)) & |
---|
727 | / (one + deltap) |
---|
728 | if (field(j,iord) .ne. zero) nord = iord |
---|
729 | enddo |
---|
730 | enddo |
---|
731 | |
---|
732 | !---- Track orbit. |
---|
733 | x = orb1(1) |
---|
734 | y = orb1(3) |
---|
735 | |
---|
736 | !---- Multipole kick. |
---|
737 | dr = zero |
---|
738 | di = zero |
---|
739 | do iord = nord, 0, -1 |
---|
740 | drt = (dr * x - di * y) / float(iord+1) + field(1,iord) |
---|
741 | di = (dr * y + di * x) / float(iord+1) + field(2,iord) |
---|
742 | dr = drt |
---|
743 | enddo |
---|
744 | |
---|
745 | !---- H is local "curvature" due to multipole kick. |
---|
746 | h = sqrt(dr**2 + di**2) / el |
---|
747 | hcb = half * el * h**3 |
---|
748 | sum(1) = sum(1) + hcb * & |
---|
749 | (em1(5,1)**2 + em1(5,2)**2 + em2(5,1)**2 + em2(5,2)**2) |
---|
750 | sum(2) = sum(2) + hcb * & |
---|
751 | (em1(5,3)**2 + em1(5,4)**2 + em2(5,3)**2 + em2(5,4)**2) |
---|
752 | sum(3) = sum(3) + hcb * & |
---|
753 | (em1(5,5)**2 + em1(5,6)**2 + em2(5,5)**2 + em2(5,6)**2) |
---|
754 | |
---|
755 | !---- Damping matrix, is the same at both ends. |
---|
756 | rfac = cg * (dr**2 + di**2) / el |
---|
757 | rfacx = cg * (- dr * re(2,1) + di * re(4,1)) / el |
---|
758 | rfacy = cg * (- dr * re(2,3) + di * re(4,3)) / el |
---|
759 | |
---|
760 | call m66one(rw) |
---|
761 | rw(2,1) = - rfacx * (one + orb1(6)) * orb1(2) |
---|
762 | rw(2,2) = one - rfac * (one + orb1(6)) |
---|
763 | rw(2,3) = - rfacy * (one + orb1(6)) * orb1(2) |
---|
764 | rw(2,6) = - rfac * orb1(2) |
---|
765 | rw(4,1) = - rfacx * (one + orb1(6)) * orb1(4) |
---|
766 | rw(4,3) = - rfacy * (one + orb1(6)) * orb1(4) |
---|
767 | rw(4,4) = one - rfac * (one + orb1(6)) |
---|
768 | rw(4,6) = - rfac * orb1(4) |
---|
769 | rw(6,1) = - rfacx * (one + orb1(6)) |
---|
770 | rw(6,3) = - rfacy * (one + orb1(6)) |
---|
771 | rw(6,6) = one - two * rfac * (one + orb1(6)) |
---|
772 | call m66mpy(re, rw, re) |
---|
773 | call m66mpy(rw, re, re) |
---|
774 | go to 500 |
---|
775 | |
---|
776 | !---- RF cavities. |
---|
777 | 100 continue |
---|
778 | rfv = node_value('volt ') |
---|
779 | rff = node_value('freq ') |
---|
780 | rfl = node_value('lag ') |
---|
781 | pi = get_variable('pi ') |
---|
782 | clight = get_variable('clight ') |
---|
783 | rfvlt = ten3m * rfv |
---|
784 | rffrq = rff * (ten6p * two * pi / clight) |
---|
785 | rflag = two * pi * rfl |
---|
786 | time = half * (orb1(5) + orb2(5)) |
---|
787 | sumu0 = sumu0 + rfvlt * sin(rflag - rffrq * time) |
---|
788 | go to 500 |
---|
789 | |
---|
790 | !---- Orbit correctors. |
---|
791 | 140 continue |
---|
792 | 150 continue |
---|
793 | 160 continue |
---|
794 | n_ferr = node_fd_errors(f_errors) |
---|
795 | do i = 1, 2 |
---|
796 | ferror(i) = zero |
---|
797 | enddo |
---|
798 | if (n_ferr .gt. 0) call dcopy(f_errors, ferror, min(2, n_ferr)) |
---|
799 | if(code.eq.14) then |
---|
800 | xkick=bvk*(node_value('kick ')+node_value('chkick ')+ & |
---|
801 | ferror(1)) |
---|
802 | ykick=zero |
---|
803 | else if(code.eq.15.or.code.eq.39) then |
---|
804 | xkick=bvk*(node_value('hkick ')+node_value('chkick ')+ & |
---|
805 | ferror(1)) |
---|
806 | ykick=bvk*(node_value('vkick ')+node_value('cvkick ')+ & |
---|
807 | ferror(2)) |
---|
808 | else if(code.eq.16) then |
---|
809 | xkick=zero |
---|
810 | ykick=bvk*(node_value('kick ')+node_value('cvkick ')+ & |
---|
811 | ferror(2)) |
---|
812 | else |
---|
813 | xkick=zero |
---|
814 | ykick=zero |
---|
815 | endif |
---|
816 | !---- Sum up total kicks. |
---|
817 | dpx = xkick / (one + deltap) |
---|
818 | dpy = ykick / (one + deltap) |
---|
819 | |
---|
820 | !---- Local curvature. |
---|
821 | hx = abs(dpx) / el |
---|
822 | hy = abs(dpy) / el |
---|
823 | rfac = cg * (hx**2 + hx**2) * el |
---|
824 | |
---|
825 | !---- Trapezoidal integration over h**3*E(k,5)*E*(k,5). |
---|
826 | fh = half * el * sqrt(hx**2 + hy**2)**3 |
---|
827 | sum(1) = sum(1) + fh * & |
---|
828 | (em1(5,1)**2 + em1(5,2)**2 + em2(5,1)**2 + em2(5,2)**2) |
---|
829 | sum(2) = sum(2) + fh * & |
---|
830 | (em1(5,3)**2 + em1(5,4)**2 + em2(5,3)**2 + em2(5,4)**2) |
---|
831 | sum(3) = sum(3) + fh * & |
---|
832 | (em1(5,5)**2 + em1(5,6)**2 + em2(5,5)**2 + em2(5,6)**2) |
---|
833 | |
---|
834 | !---- Damping matrices. |
---|
835 | call m66one(rw) |
---|
836 | rw(2,2) = one - rfac * (one + orb1(6)) |
---|
837 | rw(2,6) = - rfac * orb1(2) |
---|
838 | rw(4,4) = one - rfac * (one + orb1(6)) |
---|
839 | rw(4,6) = - rfac * orb1(4) |
---|
840 | rw(6,6) = one - two * rfac * (one + orb1(6)) |
---|
841 | call m66mpy(re, rw, re) |
---|
842 | |
---|
843 | call m66one(rw) |
---|
844 | rw(2,2) = one - rfac * (one + orb2(6)) |
---|
845 | rw(2,6) = - rfac * orb2(2) |
---|
846 | rw(4,4) = one - rfac * (one + orb2(6)) |
---|
847 | rw(4,6) = - rfac * orb2(4) |
---|
848 | rw(6,6) = one - two * rfac * (one + orb2(6)) |
---|
849 | call m66mpy(rw, re, re) |
---|
850 | 500 continue |
---|
851 | |
---|
852 | end subroutine emdamp |
---|