source: PSPA/parmelaPSPA/trunk/out6dp.f @ 489

Last change on this file since 489 was 12, checked in by lemeur, 12 years ago

parmela pspa initial

File size: 12.0 KB
Line 
1      subroutine out6dp(iz0,iplace)
2c        print emittances
3c        iz0 = 0 -- include all good particles
4c        iz0 = 1 -- include only good particles with cord(7,i) > 0
5c
6c        optcon(1)  = 6 -- to invoke OUT6 via the OUTPUT card
7c        optcon(2) ne 0 -- use canonical momentum rather than
8c                          ordinary momentum in emittance calculation
9c        optcon(3) ne 0 -- printer plot of x vs gamma*betax
10c                   < 0 -- also print projection plots
11c        optcon(4) ne 0 -- plot y vs gamma*betay
12c        optcon(5) ne 0 -- plot z vs r
13c        optcon(6) ne 0 -- plot z vs gamma*beta
14c        optcon(7) ne 0 -- plot z vs del(gamma*beta)/<gamma*beta>
15c
16c        OUT6 is called with IZ0 = 0 from INPUT if INTYPE = 10,  If want
17c        plots at this time, the OUTPUT card must precede the INPUT card
18c
19c
20c-----------------------------------------------------------------------
21      implicit double precision (b,g,r,t,x,y,z)
22c warning variables en simple precision dans les commons
23      real zloc                                        ! systeme
24      real gam                                         ! coords
25      real beami,brhof,radian,twopi,z0,zlimit          ! const
26      save
27c
28      include 'param_sz.h'
29      include 'cfldscom.h'
30      include 'constcom.h'
31      include 'coordcom.h'
32      include 'flagcom.h'
33      include 'ncordscom.h'
34      include 'outcom.h'
35      include 'syscom.h'
36      include 'tstepcom.h'
37      include 'ucom.h'
38      include 'upawcom.h'
39      include 'var_char.h'
40c
41      double precision adp
42      common/ddat/ctime,ddat
43cbm      common/hist2/xmax,bxmax,ymax,bymax,zminc,zmaxc,rmax,gbmin,
44cbm     *             gbmax,gbav,iiz0,ne
45cbm      common/hist3/gbxx(imaa),gbyy(imaa)
46      dimension gbxx(imaa),gbyy(imaa)
47      common/out6/nbphase,nbremesh
48      common/outpar/noutp,outpar(0:lmx,10),moutp(10)
49c--------------------------------------------------------------------------
50c*
51c        need double precision for emittance calc
52c
53      data phold/0./,neold/0/,cp/1./,sp/0./
54c        hfac = Compton wavelength times critical magnetic field
55      data hfac/1703./
56c
57      iiz0=iz0
58c        copy parameters in case OUT6 not called from OUTPUT
59      if(iplace.eq.0) then
60         navv=nnout       
61         else             
62         navv=nav         
63       endif             
64      do 5 i = 1,lmx
65        optcon(i) = outpar(i,7)
66    5 continue
67      xav = 0.
68      xsqav = 0.
69      bxav = 0.
70      bxsqav = 0.
71      xbxav = 0.
72      xbxsav = 0.
73      yav = 0.
74      ysqav = 0.
75      byav = 0.
76      bysqav = 0.
77      ybyav = 0.
78      ybysav = 0.
79      zav = 0.
80      zsqav = 0.
81      bzav = 0.
82      bzsqav = 0.
83      zbzav = 0.
84      zbzsav = 0.
85      gav = 0.
86      gsqav = 0.
87      bav = 0.
88      bsqav = 0.
89      gbav = 0.
90      gbsqav = 0.
91      zmaxc = 0.
92      zminc = 99999.
93      adp = 0.
94      xmax = 0.
95      bxmax = 0.
96      ymax = 0.
97      bymax = 0.
98      rmax = 0.
99      gmax = 0.
100      gmin = 99999.
101      gbmax = 0.
102      gbmin = 99999.
103      if (ngood.eq.0) go to 110
104c######################################################################
105      do 100 i = 1,ngood
106      ne = cord(7,i)
107c        skip if particle is still upstream of first element
108      if (ne.eq.0.and.iz0.eq.1) go to 100
109      adp = adp + 1.
110      x = cord(1,i)
111      if (abs(x).gt.xmax) xmax = abs(x)
112      xsq = x**2
113      y = cord(3,i)
114      if (abs(y).gt.ymax) ymax = abs(y)
115      ysq = y**2
116      r = dsqrt(xsq + ysq)
117      if (r.gt.rmax) rmax = r
118      z = cord(5,i)
119      if (z.gt.zmaxc) zmaxc = z
120      if (z.lt.zminc) zminc = z
121      ax = 0.
122      ay = 0.
123      if (optcon(2).eq.0.) go to 20  ! ================================
124c        calculate (transverse) vector potential for canonical momentum
125c        actually calc eA/mc**2
126c           skip if not yet in first element
127      if (ne.eq.0) go to 20 ! =========================================
128      nt = ntype(ne)
129c        skip if not in an rf cell (tho other elements can have nonzero
130c                      vector potential...)
131      if (nt.ne.7) go to 20
132      if (ne.ne.neold) then
133        neold = ne
134        e0 = el(5,ne)
135        s0 = el(9,ne)
136        c0 = el(10,ne)
137        efac = e0*wavel*(freq/el(4,ne))/twopi/erest
138        nc=el(6,ne)
139c        spzoff = spzloc(ne) - hcll(nc)
140        spzoff = zloc(ne) - hcll(nc)
141        if (el(8,ne).gt.0.) spzoff = spzoff + hcll(nc)
142        hz = el(11,ne)/hfac/2.
143      endif
144      ph=wt*radian*el(4,ne)/freq
145      if(ph.eq.phold) go to 10
146      sp=sin(ph)
147      cp=cos(ph)
148c        s = sp*c0+cp*s0
149        c = cp*c0-sp*s0
150      phold=ph
151      write(navv,12) e0,s0,c0,wt,c,efac,hz
152   12 format (' e0,s0,c0,wt,c,efac,hz =',3f8.4,f8.2,3f8.4)
153   10 continue
154      if (r.gt.0.) then
155        spzc = z - spzoff
156        call cfield(r,spzc,nc,ez,er,spbt)
157c         rf field
158        avec = efac*er*c
159        ax = avec*x/r
160        ay = avec*y/r
161c         static mag field
162        ax = ax - y*hz
163        ay = ay + x*hz
164      endif
165   20 continue  ! =====================================================
166c        write(navv,11) r,spzc,ez,er,spbt,x,y,ax,cord(2,i),ay,cord(4,i)
167   11   format (' r,zc,ez,er,bt =',5f8.4/
168     .  ' x,y,ax,bx,ay,by =',6f8.4)
169c
170c        bx = (canonical momentum)/mc, if 2nd parameter on OUTPUT card ne 0
171      bx = cord(2,i)+ ax
172      gbxx(i) = bx
173      if (abs(bx).gt.bxmax) bxmax = abs(bx)
174      bxsq = bx**2
175      xbx = x*bx
176      xbxsq = xbx**2
177      xav = xav + x
178      xsqav = xsqav + xsq
179      bxav = bxav + bx
180      bxsqav = bxsqav + bxsq
181      xbxav = xbxav + xbx
182      xbxsav = xbxsav + xbxsq
183c
184      by = cord(4,i) + ay
185      gbyy(i) = by
186      if (abs(by).gt.bymax) bymax = abs(by)
187      bysq = by**2
188      yby = y*by
189      ybysq = yby**2
190      yav = yav + y
191      ysqav = ysqav + ysq
192      byav = byav + by
193      bysqav = bysqav + bysq
194      ybyav = ybyav + yby
195      ybysav = ybysav + ybysq
196c
197      zsq = z**2
198      bz = cord(6,i)
199      bzsq = bz**2
200      zbz = z*bz
201      zbzsq = zbz**2
202      zav = zav + z
203      zsqav = zsqav + zsq
204      bzav = bzav + bz
205      bzsqav = bzsqav + bzsq
206      zbzav = zbzav + zbz
207      zbzsav = zbzsav + zbzsq
208c
209c        roundoff trouble extracting beta from gam(i) when gamma near 1
210      gb = sqrt(cord(2,i)**2 + cord(4,i)**2 + cord(6,i)**2)
211      gbsq = gb**2
212      gsq = 1. + gbsq
213      g = dsqrt(gsq)
214      if (g.gt.gmax) gmax = g
215      if (g.lt.gmin) gmin = g
216      b = gb/g
217c 20/03/2001
218      if(b.gt.1.) then
219        b = 1.
220      endif
221      bsq = b**2
222      if (gb.gt.gbmax) gbmax = gb
223      if (gb.lt.gbmin) gbmin = gb
224      gav = gav + g
225      gsqav = gsqav + gsq
226      bav = bav + b
227      bsqav = bsqav + bsq
228      gbav = gbav + gb
229      gbsqav = gbsqav + gbsq
230  100 continue
231c#####################################################################
232  110 continue
233c     1000. rad to mrad
234c     1.e6=(1.e3)**2
235c --------------------------------- x --------------------------------
236      if (adp.gt.0.) then
237        xav = xav/adp
238        xsqav = xsqav/adp
239        bxav = bxav/adp*1000.
240        bxsqav = bxsqav/adp*1.e6
241        xbxav = xbxav/adp*1000.
242        xbxsav = xbxsav/adp*1.e6
243      endif
244      xrms = 0.
245      bxrms = 0.
246      xbrms = 0.
247      xemit = 0.
248      xsqav = xsqav - xav**2
249      if (xsqav.gt.0.) xrms = dsqrt(xsqav)
250      bxsqav = bxsqav - bxav**2
251      if (bxsqav.gt.0.) bxrms = dsqrt(bxsqav)
252      temp = xbxsav - xbxav**2
253c     if(temp.gt.0) xbrms = sqrt(temp)
254      xbxav = xbxav - xav*bxav
255      temp = xsqav*bxsqav - xbxav**2
256      if (temp.gt.0.) xemit = dsqrt(temp)
257c --------------------------------- y --------------------------------
258      if (adp.gt.0.) then
259        yav = yav/adp
260        ysqav = ysqav/adp
261        byav = byav/adp*1000.
262        bysqav = bysqav/adp*1.e6
263        ybyav = ybyav/adp*1000.
264        ybysav = ybysav/adp*1.e6
265      endif
266      yrms = 0.
267      byrms = 0.
268      ybrms = 0.
269      yemit = 0.
270      ysqav = ysqav - yav**2
271      if (ysqav.gt.0.) yrms = dsqrt(ysqav)
272      bysqav = bysqav - byav**2
273      if (bysqav.gt.0.) byrms = dsqrt(bysqav)
274      temp = ybysav - ybyav**2
275c     if(temp.gt.0) ybrms = sqrt(temp)
276      ybyav = ybyav - yav*byav
277      temp = ysqav*bysqav - ybyav**2
278      if (temp.gt.0.) yemit = dsqrt(temp)
279c      rrms = 0.5*(xrms + yrms)
280c --------------------------------- z --------------------------------
281      if (adp.gt.0.) then
282        zav = zav/adp
283        zsqav = zsqav/adp
284        bzav = bzav/adp
285        bzsqav = bzsqav/adp
286        zbzav = zbzav/adp
287        zbzsav = zbzsav/adp
288      endif
289      zrms = 0.
290      zemit = 0.
291      zsqav = zsqav - zav**2
292      if (zsqav.gt.0.) zrms = dsqrt(zsqav)
293      bzsqav = bzsqav - bzav**2
294      temp = zbzsav - zbzav**2
295      zbzav = zbzav - zav*bzav
296      temp = zsqav*bzsqav - zbzav**2
297c     10. cm to mm
298      if (temp.gt.0.) zemit = 10.*dsqrt(temp)
299c --------------------------------- bg --------------------------------
300      if (adp.gt.0.) then
301        gav = gav/adp
302        gsqav = gsqav/adp
303        bav = bav/adp
304        bsqav = bsqav/adp
305        gbav = gbav/adp
306        gbsqav = gbsqav/adp
307      endif
308c      write(navv,199) gav,gsqav,bav,bsqav,gbav,gbsqav
309  199 format (' g & b aves ',1pg11.3,5g11.3)
310      grms = 0.
311      brms = 0.
312      gbrms = 0.
313      temp = gsqav - gav**2
314      if (temp.gt.0.) grms = dsqrt(temp)
315      temp = bsqav - bav**2
316      if (temp.gt.0.) brms = dsqrt(temp)
317      temp = gbsqav - gbav**2
318      if (temp.gt.0.) gbrms = dsqrt(temp)
319c --------------------------------- write  --------------------------------
320      iadp=adp
321      write(navv,*)'---------'
322      write(navv,190) wt,adp,cord(5,1) 
323  190 format (' phase =',f11.2,' degrees, ',f6.0,' active particles',
324     1' zrp = ',f10.4,' cm') 
325c        convert emittances to mm-mrad (cm-mrad to mm-mrad)
326      xemit = xemit*10.
327      yemit = yemit*10.
328c     zemit=zemit*(360.*1000*erest)/wavel  ! [keV-deg]
329c         for now, average x and y quantities
330c      xrms = 0.5*(xrms + yrms)
331c      bxrms = 0.5*(bxrms + byrms)
332c      xbxav = 0.5*(xbxav + ybyav)
333c      xemit = 0.5*(xemit + yemit)
334      write(navv,200) xrms,bxrms,xbxav,xemit
335c changer les f8.4 en f8.2 pour les emit f7.3 en f7.2 pour les gb(x/y)rms
336  200 format (' xrms = ',f7.4,' gbxrms = ',f7.2,' xgbxav = ',f8.2,
337     . ' xemit = ',f8.2,' mm-mrad')
338      xyemit = 0.5*(xemit + yemit)
339      write(navv,210) yrms,byrms,ybyav,yemit,xyemit
340  210 format (' yrms = ',f7.4,' gbyrms = ',f7.2,' ygbyav = ',f8.2,
341     . ' yemit = ',f8.2,' <',f8.2,'>')
342      write(navv,220) zminc,zmaxc,zemit
343  220 format (' zmin = ',f8.2,' zmax = ',f8.2,' zemit = ',1pg11.3)
344      write(navv,230) zav,zrms,gav,grms
345  230 format (' zav = ',g12.5,' +- ',g12.5,' gav = ',g12.5,' +- ',g12.5)
346      write(navv,231) bav,brms,gbav,gbrms
347  231 format (' bav = ',g12.5,' +- ',g12.5,' gbav= ',g12.5,' +- ',g12.5)
348      write(nsemit)wt,adp,xrms,bxrms,xbxav,xemit,yrms,byrms,ybyav,yemit,
349     *zav,zrms,zminc,zmaxc,zemit
350c
351c        histogram setup
352c
353       do 9996 i=1,ngood
354       spxx=cord(1,i)
355       if ((ne.eq.0).and.(i.eq.1)) then       
356          spxxp=0.
357          else
358          spxxp=cord(2,i)/cord(6,i)
359       endif
360       spbgx=gbxx(i)
361       spyy=cord(3,i)
362       if ((ne.eq.0).and.(i.eq.1)) then       
363          spyyp=0.
364          else
365          spyyp=cord(4,i)/cord(6,i)
366       endif
367       spbgy=gbyy(i)
368       spzz=cord(5,i)
369       spbgz=cord(6,i)
370       phi=wt
371       wz=(gam(i)-1.)*erest
372c     unit ndes2 at constant phase wt
373cbm       write(ndes2)spxx,spxxp,spbgx,spyy,spyyp,spbgy,spzz,
374cbm     1 spbgz,phi,wz,ne,i,ngood,i,phizero(i)
375       write(ndes2)spxx,spxxp,spbgx,spyy,spyyp,spbgy,spzz,
376     1 spbgz,phi,wz,ne,i,iadp,i,phizero(i),ksi1(i),ksi2(i),ksi3(i)
377       if(ne.eq.0) then
378               spzz=0.
379               phi=phizero(i)
380c     unit ndes1 end of element z=cte
381cbm        write(ndes1)spxx,spxxp,spbgx,spyy,spyyp,spbgy,spzz,
382cbm     1  spbgz,phi,wz,ne,i,ngood,i,phizero(i)
383       write(ndes1,*)spxx,spxxp,spbgx,spyy,spyyp,spbgy,spzz,
384     1 spbgz,phi,wz,ne,i,iadp,i,phizero(i),ksi1(i),ksi2(i),ksi3(i)
385        endif
386 9996   continue
387c        skip if no hists desired
388      ihist=optcon(3)+optcon(4)+optcon(5)+optcon(6)+optcon(7)
389      if (ihist.eq.0) return     
390cbm 18/07/2k      call histogram2
391      return
392      end
393c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
Note: See TracBrowser for help on using the repository browser.