/[PAMELA software]/tracker/ground/source/magnet/magnetic-field.tar
ViewVC logotype

Annotation of /tracker/ground/source/magnet/magnetic-field.tar

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (download) (as text) (vendor branch)
Wed Mar 8 15:00:38 2006 UTC (18 years, 9 months ago) by pam-fi
Branch: MAIN, trk-ground
CVS Tags: R3v02, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: application/x-tar
First CVS release of tracker ground software (R3v02) 

1 pam-fi 1.1 common_B_inner.f0100640000076700007640000000271110252260040014041 0ustar vannucciwizard*************************************************************************
2     *
3     * Common common_B_inner.f
4     *
5     * to be included in:
6     * - ../magnet/read_B_inner.f
7     * - ../magnet/inter_B.f
8     * - ../magnet/inter_B_inner.f
9     *
10     *************************************************************************
11    
12     c implicit double precision (a-h,o-z)
13    
14    
15     parameter (nx=29, ny=23, nz=101) !number of measures along X, Y and Z axes
16    
17     c coordinates in m of the edges of the volume in which the field
18     c is interpolated according to the inner maps
19     parameter (edgexmin=-0.085,edgexmax=0.085
20     $ ,edgeymin=-0.07,edgeymax=0.07
21     $ ,edgezmin=-0.26,edgezmax=0.26)
22    
23     ************
24     c first map
25     real*8 px1(nx,3),py1(ny,3),pz1(nz,3) !coordinates of measure points:
26     c e.g. py1(ny,1) = Y coordinates of Bx (=1) component of magnetic field
27    
28     real*8 b1(nx,ny,nz,3) !magnetic field values:
29     c e.g. b1(nx,ny,nz,2) = By (=2) component of magnetic field measured in (nx, ny, nz)
30    
31     real*8 px1max(3),px1min(3),py1max(3),py1min(3),pz1max(3),pz1min(3) !grid edges
32    
33     common/interpolation1/px1,py1,pz1,b1
34     $ ,px1max,px1min,py1max,py1min,pz1max,pz1min
35    
36     ************
37     c second map
38     real*8 px2(nx,3),py2(ny,3),pz2(nz,3)
39     real*8 b2(nx,ny,nz,3)
40     real*8 px2max(3),px2min(3),py2max(3),py2min(3),pz2max(3),pz2min(3)
41    
42     common/interpolation2/px2,py2,pz2,b2
43     $ ,px2max,px2min,py2max,py2min,pz2max,pz2min
44     common_B_outer.f0100640000076700007640000000303410252260012014062 0ustar vannucciwizard*************************************************************************
45     *
46     * Common common_B_outer.f
47     *
48     * to be included in:
49     * - ../magnet/read_B_outer.f
50     * - ../magnet/inter_B.f
51     * - ../magnet/inter_B_outer.f
52     *
53     *************************************************************************
54    
55     c implicit double precision (a-h,o-z)
56    
57    
58     c number of measures along X, Y and Z axes
59     parameter (nox=13, noy=13, noz=4)
60    
61     c coordinates in m of the edges of the volume in which the field
62     c is interpolated according to the inner maps
63     c UPPER VOLUME
64     parameter (edgeuxmin=-0.18)
65     parameter (edgeuxmax=0.18)
66     parameter (edgeuymin=-0.18)
67     parameter (edgeuymax=0.18)
68     parameter (edgeuzmin=0.28)
69     parameter (edgeuzmax=0.37)
70     c LOWER VOLUME
71     parameter (edgelxmin=edgeuxmin)
72     parameter (edgelxmax=edgeuxmax)
73     parameter (edgelymin=edgeuymin)
74     parameter (edgelymax=edgeuymax)
75     parameter (edgelzmin=-0.37)
76     parameter (edgelzmax=-0.28)
77    
78     ************
79     c MAGNETIC-FIELD MAP
80     real*8 pox(nox,3),poy(noy,3),poz(noz,3) !coordinates of measure points:
81     c e.g. py1(ny,1) = Y coordinates of Bx (=1) component of magnetic field
82    
83     real*8 bo(nox,noy,noz,3) !magnetic field values:
84     c e.g. b1(nx,ny,nz,2) = By (=2) component of magnetic field measured in (nx, ny, nz)
85    
86     real*8 poxmax(3),poxmin(3),poymax(3),poymin(3),pozmax(3),pozmin(3)
87     c grid edges
88    
89     common/interpolationo/pox,poy,poz,bo
90     $ ,poxmax,poxmin,poymax,poymin,pozmax,pozmin
91    
92     inter_B.f0100640000076700007640000001021710252303110012473 0ustar vannucciwizard*************************************************************************
93     *
94     * Subroutine inter_B.f
95     *
96     * it computes the magnetic field in a chosen point x,y,z inside or
97     * outside the magnetic cavity, using a trilinear interpolation of
98     * B field measurements (read before by means of ./read_B.f)
99     * if the point falls outside the interpolation volume, set the field to 0
100     *
101     * needs:
102     * - ../common/common_B_inner.f common file for the inner magnetic field map
103     * - ./inter_B_inner.f common file for the inner magnetic field map
104     * - ../common/common_B_outer.f common file for the outer magnetic field map
105     * - ./inter_B_outer.f common file for the outer magnetic field map
106     *
107     * to be called after ./read_B.f (magnetic field map reading subroutine)
108     *
109     * input: coordinates in m
110     * output: magnetic field in T
111     *
112     *************************************************************************
113    
114     subroutine inter_B(x,y,z,res) !coordinates in m, magnetic field in T
115    
116     implicit double precision (a-h,o-z)
117     include '../common/common_B_inner.f'
118     include '../common/common_B_outer.f'
119    
120    
121     c------------------------------------------------------------------------
122     c
123     c local variables
124     c
125     c------------------------------------------------------------------------
126    
127     real*8 x,y,z !point of interest
128     real*8 res(3) !interpolated B components: res = (Bx, By, Bz)
129    
130     real*8 zl,zu
131     real*8 resu(3),resl(3)
132    
133     c------------------------------------------------------------------------
134     c
135     c set the field outside the interpolation volume to be 0
136     c
137     c------------------------------------------------------------------------
138    
139     do ip=1,3
140     res(ip)=0.
141     enddo
142    
143    
144     c------------------------------------------------------------------------
145     c
146     c check if the point falls inside the interpolation volumes
147     c
148     c------------------------------------------------------------------------
149    
150     * -----------------------
151     * INNER MAP
152     * -----------------------
153     if(
154     $ (x.ge.edgexmin).and.(x.le.edgexmax)
155     $ .and.(y.ge.edgeymin).and.(y.le.edgeymax)
156     $ .and.(z.ge.edgezmin).and.(z.le.edgezmax)
157     $ ) then
158    
159     call inter_B_inner(x,y,z,res)
160     c print*,'INNER - ',z,res
161    
162     endif
163    
164     * -----------------------
165     * OUTER MAP
166     * -----------------------
167     if(
168     $ ((x.ge.edgeuxmin).and.(x.le.edgeuxmax)
169     $ .and.(y.ge.edgeuymin).and.(y.le.edgeuymax)
170     $ .and.(z.ge.edgeuzmin).and.(z.le.edgeuzmax))
171     $ .or.
172     $ ((x.ge.edgelxmin).and.(x.le.edgelxmax)
173     $ .and.(y.ge.edgelymin).and.(y.le.edgelymax)
174     $ .and.(z.ge.edgelzmin).and.(z.le.edgelzmax))
175     $ ) then
176    
177     call inter_B_outer(x,y,z,res)
178     c res(2)=res(2)*10
179     c print*,'OUTER - ',z,res
180    
181     endif
182    
183     * --------------------------------
184     * GAP between INNER and OUTER MAPS
185     * --------------------------------
186     if(
187     $ (x.gt.edgexmin).and.(x.lt.edgexmax)
188     $ .and.(y.gt.edgeymin).and.(y.lt.edgeymax)
189     $ .and.(z.gt.edgezmax).and.(z.lt.edgeuzmin)
190     $ )then
191    
192     zu = edgeuzmin
193     zl = edgezmax
194     call inter_B_inner(x,y,zl,resu)
195     call inter_B_outer(x,y,zu,resl)
196    
197     do i=1,3
198     res(i) = z * ((resu(i)-resl(i))/(zu-zl))
199     $ + resu(i)
200     $ - zu * ((resu(i)-resl(i))/(zu-zl))
201     enddo
202     c print*,'GAP U - ',z,res
203    
204     elseif(
205     $ (x.gt.edgexmin).and.(x.lt.edgexmax)
206     $ .and.(y.gt.edgeymin).and.(y.lt.edgeymax)
207     $ .and.(z.gt.edgelzmax).and.(z.lt.edgezmin)
208     $ ) then
209    
210    
211     zu = edgezmin
212     zl = edgelzmax
213     call inter_B_inner(x,y,zu,resu)
214     call inter_B_outer(x,y,zl,resl)
215    
216     do i=1,3
217     res(i) = z * ((resu(i)-resl(i))/(zu-zl))
218     $ + resu(i)
219     $ - zu * ((resu(i)-resl(i))/(zu-zl))
220     enddo
221     c print*,'GAP D - ',z,res
222    
223     endif
224    
225     return
226     end
227    
228    
229     include './inter_B_inner.f'
230     include './inter_B_outer.f'
231     inter_B_inner.f0100640000076700007640000001662510252260077013715 0ustar vannucciwizard*************************************************************************
232     *
233     * Subroutine inter_B_inner.f
234     *
235     * it computes the magnetic field in a chosen point x,y,z inside the
236     * magnetic cavity, using a trilinear interpolation of
237     * B field measurements (read before by means of ./read_B.f)
238     * the value is computed for two different inner maps and then averaged
239     *
240     * needs:
241     * - ../common/common_B_inner.f
242     *
243     * input: coordinates in m
244     * output: magnetic field in T
245     *
246     *************************************************************************
247    
248     subroutine inter_B_inner(x,y,z,res) !coordinates in m, magnetic field in T
249    
250     implicit double precision (a-h,o-z)
251     include '../common/common_B_inner.f'
252    
253    
254     c------------------------------------------------------------------------
255     c
256     c local variables
257     c
258     c------------------------------------------------------------------------
259    
260     real*8 x,y,z !point of interpolation
261     real*8 res(3) !interpolated B components: res = (Bx, By, Bz)
262     real*8 res1(3),res2(3) !interpolated B components for the two maps
263    
264     integer ic !index for B components:
265     ! ic=1 ---> Bx
266     ! ic=2 ---> By
267     ! ic=3 ---> Bz
268    
269     integer cube(3) !vector of indexes identifying the cube
270     ! containing the point of interpolation
271     ! (see later...)
272    
273     real*8 xl,xh,yl,yh,zl,zh !cube vertexes coordinates
274    
275     real*8 xr,yr,zr !reduced variables (coordinates of the
276     ! point of interpolation inside the cube)
277    
278     real*8 Bp(8) !vector of values of B component
279     ! being computed, on the eight cube vertexes
280    
281    
282     c------------------------------------------------------------------------
283     c
284     c *** FIRST MAP ***
285     c
286     c------------------------------------------------------------------------
287    
288     do ic=1,3 !loops on the three B components
289    
290     c------------------------------------------------------------------------
291     c
292     c chooses the coordinates interval containing the input point
293     c
294     c------------------------------------------------------------------------
295     c e.g.:
296     c
297     c x1 x2 x3 x4 x5...
298     c |-----|-+---|-----|-----|----
299     c ~~~~~~~~x
300     c
301     c in this case the right interval is identified by indexes 2-3, so the
302     c value assigned to cube variable is 2
303    
304     cube(1)=INT((nx-1)*(x-px1min(ic))/(px1max(ic)-px1min(ic))) +1
305     cube(2)=INT((ny-1)*(y-py1min(ic))/(py1max(ic)-py1min(ic))) +1
306     cube(3)=INT((nz-1)*(z-pz1min(ic))/(pz1max(ic)-pz1min(ic))) +1
307    
308     c------------------------------------------------------------------------
309     c
310     c if the point falls beyond the extremes of the grid...
311     c
312     c------------------------------------------------------------------------
313     c
314     c ~~~~~~~~~~x1 x2 x3...
315     c - - + - - |-----|-----|----
316     c ~~~~x
317     c
318     c in the case cube = 1
319     c
320     c
321     c ...nx-2 nx-1 nx
322     c ----|-----|-----| - - - + - -
323     c ~~~~~~~~~~~~~~~~~~~~~~~~x
324     c
325     c in this case cube = nx-1
326    
327     if (cube(1).le.0) cube(1) = 1
328     if (cube(2).le.0) cube(2) = 1
329     if (cube(3).le.0) cube(3) = 1
330     if (cube(1).ge.nx) cube(1) = nx-1
331     if (cube(2).ge.ny) cube(2) = ny-1
332     if (cube(3).ge.nz) cube(3) = nz-1
333    
334    
335     c------------------------------------------------------------------------
336     c
337     c temporary variables definition for field computation
338     c
339     c------------------------------------------------------------------------
340    
341     xl = px1(cube(1),ic) !X coordinates of cube vertexes
342     xh = px1(cube(1)+1,ic)
343    
344     yl = py1(cube(2),ic) !Y coordinates of cube vertexes
345     yh = py1(cube(2)+1,ic)
346    
347     zl = pz1(cube(3),ic) !Z coordinates of cube vertexes
348     zh = pz1(cube(3)+1,ic)
349    
350     xr = (x-xl) / (xh-xl) !reduced variables
351     yr = (y-yl) / (yh-yl)
352     zr = (z-zl) / (zh-zl)
353    
354     Bp(1) = b1(cube(1) ,cube(2) ,cube(3) ,ic) !ic-th component of B
355     Bp(2) = b1(cube(1)+1,cube(2) ,cube(3) ,ic) ! on the eight cube
356     Bp(3) = b1(cube(1) ,cube(2)+1,cube(3) ,ic) ! vertexes
357     Bp(4) = b1(cube(1)+1,cube(2)+1,cube(3) ,ic)
358     Bp(5) = b1(cube(1) ,cube(2) ,cube(3)+1,ic)
359     Bp(6) = b1(cube(1)+1,cube(2) ,cube(3)+1,ic)
360     Bp(7) = b1(cube(1) ,cube(2)+1,cube(3)+1,ic)
361     Bp(8) = b1(cube(1)+1,cube(2)+1,cube(3)+1,ic)
362    
363     c------------------------------------------------------------------------
364     c
365     c computes interpolated ic-th component of B in (x,y,z)
366     c
367     c------------------------------------------------------------------------
368    
369     res1(ic) =
370     + Bp(1)*(1-xr)*(1-yr)*(1-zr) +
371     + Bp(2)*xr*(1-yr)*(1-zr) +
372     + Bp(3)*(1-xr)*yr*(1-zr) +
373     + Bp(4)*xr*yr*(1-zr) +
374     + Bp(5)*(1-xr)*(1-yr)*zr +
375     + Bp(6)*xr*(1-yr)*zr +
376     + Bp(7)*(1-xr)*yr*zr +
377     + Bp(8)*xr*yr*zr
378    
379    
380     enddo
381    
382     c------------------------------------------------------------------------
383     c
384     c *** SECOND MAP ***
385     c
386     c------------------------------------------------------------------------
387    
388     c second map is rotated by 180 degree along the Z axis. so change sign
389     c of x and y coordinates and then change sign to Bx and By components
390     c to obtain the correct result
391    
392     x=-x
393     y=-y
394    
395     do ic=1,3
396    
397     cube(1)=INT((nx-1)*(x-px2min(ic))/(px2max(ic)-px2min(ic))) +1
398     cube(2)=INT((ny-1)*(y-py2min(ic))/(py2max(ic)-py2min(ic))) +1
399     cube(3)=INT((nz-1)*(z-pz2min(ic))/(pz2max(ic)-pz2min(ic))) +1
400    
401     if (cube(1).le.0) cube(1) = 1
402     if (cube(2).le.0) cube(2) = 1
403     if (cube(3).le.0) cube(3) = 1
404     if (cube(1).ge.nx) cube(1) = nx-1
405     if (cube(2).ge.ny) cube(2) = ny-1
406     if (cube(3).ge.nz) cube(3) = nz-1
407    
408     xl = px2(cube(1),ic)
409     xh = px2(cube(1)+1,ic)
410    
411     yl = py2(cube(2),ic)
412     yh = py2(cube(2)+1,ic)
413    
414     zl = pz2(cube(3),ic)
415     zh = pz2(cube(3)+1,ic)
416    
417     xr = (x-xl) / (xh-xl)
418     yr = (y-yl) / (yh-yl)
419     zr = (z-zl) / (zh-zl)
420    
421     Bp(1) = b2(cube(1) ,cube(2) ,cube(3) ,ic)
422     Bp(2) = b2(cube(1)+1,cube(2) ,cube(3) ,ic)
423     Bp(3) = b2(cube(1) ,cube(2)+1,cube(3) ,ic)
424     Bp(4) = b2(cube(1)+1,cube(2)+1,cube(3) ,ic)
425     Bp(5) = b2(cube(1) ,cube(2) ,cube(3)+1,ic)
426     Bp(6) = b2(cube(1)+1,cube(2) ,cube(3)+1,ic)
427     Bp(7) = b2(cube(1) ,cube(2)+1,cube(3)+1,ic)
428     Bp(8) = b2(cube(1)+1,cube(2)+1,cube(3)+1,ic)
429    
430     res2(ic) =
431     + Bp(1)*(1-xr)*(1-yr)*(1-zr) +
432     + Bp(2)*xr*(1-yr)*(1-zr) +
433     + Bp(3)*(1-xr)*yr*(1-zr) +
434     + Bp(4)*xr*yr*(1-zr) +
435     + Bp(5)*(1-xr)*(1-yr)*zr +
436     + Bp(6)*xr*(1-yr)*zr +
437     + Bp(7)*(1-xr)*yr*zr +
438     + Bp(8)*xr*yr*zr
439    
440     enddo
441    
442     c change Bx and By components sign
443     res2(1)=-res2(1)
444     res2(2)=-res2(2)
445    
446     c change back the x and y coordinate signs
447     x=-x
448     y=-y
449    
450    
451     c------------------------------------------------------------------------
452     c
453     c average the two maps results
454     c
455     c------------------------------------------------------------------------
456    
457     do ic=1,3
458     res(ic)=(res1(ic)+res2(ic))/2
459     enddo
460    
461    
462     return
463     end
464     inter_B_outer.f0100640000076700007640000001234110252267445013735 0ustar vannucciwizard*************************************************************************
465     *
466     * Subroutine inter_B_outer.f
467     *
468     * it computes the magnetic field in a chosen point x,y,z OUTSIDE the
469     * magnetic cavity, using a trilinear interpolation of
470     * B field measurements (read before by means of ./read_B.f)
471     * the value is computed for the outer map
472     *
473     * needs:
474     * - ../common/common_B_outer.f
475     *
476     * input: coordinates in m
477     * output: magnetic field in T
478     *
479     *************************************************************************
480    
481     subroutine inter_B_outer(x,y,z,res) !coordinates in m, magnetic field in T
482    
483     implicit double precision (a-h,o-z)
484     include '../common/common_B_outer.f'
485    
486    
487     c------------------------------------------------------------------------
488     c
489     c local variables
490     c
491     c------------------------------------------------------------------------
492    
493     real*8 x,y,z !point of interpolation
494     real*8 res(3) !interpolated B components: res = (Bx, By, Bz)
495     real*8 zin
496    
497     integer ic
498     c !index for B components:
499     c ! ic=1 ---> Bx
500     c ! ic=2 ---> By
501     c ! ic=3 ---> Bz
502    
503     integer cube(3)
504     c !vector of indexes identifying the cube
505     c ! containing the point of interpolation
506     c ! (see later...)
507    
508     real*8 xl,xh,yl,yh,zl,zh !cube vertexes coordinates
509    
510     real*8 xr,yr,zr
511     c !reduced variables (coordinates of the
512     c ! point of interpolation inside the cube)
513    
514     real*8 Bp(8)
515     c !vector of values of B component
516     c ! being computed, on the eight cube vertexes
517    
518    
519     c LOWER MAP
520     c ---> up/down simmetry
521     zin=z
522     if(zin.le.edgelzmax)z=-z
523    
524     c------------------------------------------------------------------------
525     c
526     c *** MAP ***
527     c
528     c------------------------------------------------------------------------
529    
530     do ic=1,3 !loops on the three B components
531    
532     c------------------------------------------------------------------------
533     c
534     c chooses the coordinates interval containing the input point
535     c
536     c------------------------------------------------------------------------
537     c e.g.:
538     c
539     c x1 x2 x3 x4 x5... xN
540     c |-----|-+---|-----|-----|---- ... ----|-----|
541     c ~~~~~~~~x
542     c
543     c in this case the right interval is identified by indexes 2-3, so the
544     c value assigned to cube variable is 2
545    
546     cube(1)=INT((nox-1)*(x-poxmin(ic))/(poxmax(ic)-poxmin(ic))) +1
547     cube(2)=INT((noy-1)*(y-poymin(ic))/(poymax(ic)-poymin(ic))) +1
548     cube(3)=INT((noz-1)*(z-pozmin(ic))/(pozmax(ic)-pozmin(ic))) +1
549    
550     c------------------------------------------------------------------------
551     c
552     c if the point falls beyond the extremes of the grid...
553     c
554     c------------------------------------------------------------------------
555     c
556     c ~~~~~~~~~~x1 x2 x3...
557     c - - + - - |-----|-----|----
558     c ~~~~x
559     c
560     c in the case cube = 1
561     c
562     c
563     c ...nx-2 nx-1 nx
564     c ----|-----|-----| - - - + - -
565     c ~~~~~~~~~~~~~~~~~~~~~~~~x
566     c
567     c in this case cube = nx-1
568    
569     if (cube(1).le.0) cube(1) = 1
570     if (cube(2).le.0) cube(2) = 1
571     if (cube(3).le.0) cube(3) = 1
572     if (cube(1).ge.nox) cube(1) = nox-1
573     if (cube(2).ge.noy) cube(2) = noy-1
574     if (cube(3).ge.noz) cube(3) = noz-1
575    
576    
577     c------------------------------------------------------------------------
578     c
579     c temporary variables definition for field computation
580     c
581     c------------------------------------------------------------------------
582    
583     xl = pox(cube(1),ic) !X coordinates of cube vertexes
584     xh = pox(cube(1)+1,ic)
585    
586     yl = poy(cube(2),ic) !Y coordinates of cube vertexes
587     yh = poy(cube(2)+1,ic)
588    
589     zl = poz(cube(3),ic) !Z coordinates of cube vertexes
590     zh = poz(cube(3)+1,ic)
591    
592     xr = (x-xl) / (xh-xl) !reduced variables
593     yr = (y-yl) / (yh-yl)
594     zr = (z-zl) / (zh-zl)
595    
596     Bp(1) = bo(cube(1) ,cube(2) ,cube(3) ,ic) !ic-th component of B
597     Bp(2) = bo(cube(1)+1,cube(2) ,cube(3) ,ic) ! on the eight cube
598     Bp(3) = bo(cube(1) ,cube(2)+1,cube(3) ,ic) ! vertexes
599     Bp(4) = bo(cube(1)+1,cube(2)+1,cube(3) ,ic)
600     Bp(5) = bo(cube(1) ,cube(2) ,cube(3)+1,ic)
601     Bp(6) = bo(cube(1)+1,cube(2) ,cube(3)+1,ic)
602     Bp(7) = bo(cube(1) ,cube(2)+1,cube(3)+1,ic)
603     Bp(8) = bo(cube(1)+1,cube(2)+1,cube(3)+1,ic)
604    
605     c------------------------------------------------------------------------
606     c
607     c computes interpolated ic-th component of B in (x,y,z)
608     c
609     c------------------------------------------------------------------------
610    
611     res(ic) =
612     + Bp(1)*(1-xr)*(1-yr)*(1-zr) +
613     + Bp(2)*xr*(1-yr)*(1-zr) +
614     + Bp(3)*(1-xr)*yr*(1-zr) +
615     + Bp(4)*xr*yr*(1-zr) +
616     + Bp(5)*(1-xr)*(1-yr)*zr +
617     + Bp(6)*xr*(1-yr)*zr +
618     + Bp(7)*(1-xr)*yr*zr +
619     + Bp(8)*xr*yr*zr
620    
621    
622     enddo
623    
624     c LOWER MAP
625     c ---> up/down simmetry
626     if(zin.le.edgelzmax)then
627     z=-z !back to initial ccoordinate
628     res(3)=-res(3) !invert BZ component
629     endif
630    
631     return
632     end
633     read_B.f0100640000076700007640000000156310252256652012313 0ustar vannucciwizard*************************************************************************
634     *
635     * Subroutine read_B.f
636     *
637     * it calls the subroutines which read the magnetic field maps for
638     * the PAMELA spectrometer
639     *
640     * needs:
641     * - ./read_B_inner.f inner map reading subroutine
642     * - ./read_B_outer.f outer map reading subroutine
643     *
644     * to be called before ./inter_B.f (interpolation subroutine)
645     *
646     *************************************************************************
647    
648     subroutine read_B
649    
650     c call the subroutine which reads the maps of the measurements taken
651     c inside the magnetic cavity
652     call read_B_inner
653    
654     c call the subroutine which reads the maps of the measurements taken
655     c outside the magnetic cavity
656     call read_B_outer
657    
658     return
659     end
660    
661     include './read_B_inner.f'
662     include './read_B_outer.f'
663     read_B_inner.f0100640000076700007640000002564510252261245013507 0ustar vannucciwizard*************************************************************************
664     *
665     * Subroutine read_B_inner.f
666     *
667     * it reads from rz files the two magnetic field maps taken inside the
668     * spectrometer cavity and fills the variables in common_B_inner.f
669     *
670     * needs:
671     * - ../common/common_B_inner.f common file for the inner magnetic field map
672     * - .rz map files in ./ containing coordinates of measured points, Bx, By
673     * and Bz components + errors
674     *
675     * output variables: (see common_B_inner.f)
676     * - px#(nx,3) with #=1,2 for the 2 maps
677     * - py#(ny,3)
678     * - pz#(nz,3)
679     * - b#(nx,ny,nz,3)
680     *
681     *************************************************************************
682    
683     subroutine read_B_inner
684    
685     implicit double precision (a-h,o-z)
686     include '../common/common_B_inner.f'
687    
688    
689     c------------------------------------------------------------------------
690     c
691     c local variables
692     c
693     c------------------------------------------------------------------------
694    
695     character*64 Bmap_file !magnetic field file name
696     c character*120 cmd1
697     c character*120 cmd2
698     parameter (lun_Bmap_file=66) !magnetic field map file id number
699    
700     parameter (ntpl_Bmap=20) !ntuple identifier
701    
702     REAL PFX(3),FX,DFX, !Bx field component coordinates in m, value and error in T
703     $ PFY(3),FY,DFY
704     $ ,PFZ(3),FZ,DFZ
705     INTEGER INDEX(3) !point index
706    
707     COMMON /PAWCR4/ INDEX,PFX,FX,DFX,PFY,FY,DFY,PFZ,FZ,DFZ
708    
709    
710     c------------------------------------------------------------------------
711     c
712     c *** FIRST MAP ***
713     c
714     c------------------------------------------------------------------------
715    
716     c------------------------------------------------------------------------
717     c
718     c initialization and map file opening
719     c
720     c------------------------------------------------------------------------
721    
722     c print*,' '
723     c print*,' '
724    
725     Bmap_file='measure_n3_290302.rz'
726    
727     c$$$ cmd1='cp $TRK_GRND/source/magnet/'
728     c$$$ $ //Bmap_file(1:LNBLNK(Bmap_file))//' .'
729     c$$$ call system(cmd1)
730    
731     c opens magnetic field map first file
732     print *,'Opening file: ',Bmap_file
733     call HROPEN
734     $ (lun_Bmap_file,'Bmap','./bin-aux/'//Bmap_file,'P',1024,istat)
735     if(istat.ne.0) goto 21
736    
737    
738     call HRIN(ntpl_Bmap,9999,0) !puts B map ntuple in memory
739    
740     c call HPRNTU(ntpl_Bmap)
741     call HBNAME(ntpl_Bmap,' ',0,'$CLEAR')
742     call HBNAME(ntpl_Bmap,'INDEX',index,'$SET')
743     call HBNAME(ntpl_Bmap,'BX',pfx,'$SET')
744     call HBNAME(ntpl_Bmap,'BY',pfy,'$SET')
745     call HBNAME(ntpl_Bmap,'BZ',pfz,'$SET')
746    
747    
748     c------------------------------------------------------------------------
749     c
750     c reads events and fills variables
751     c
752     c------------------------------------------------------------------------
753    
754     call HNOENT(ntpl_Bmap,iemax) !number of events
755    
756     c initializes measurement grid edges
757     do ic=1,3
758     px1max(ic)=0.
759     px1min(ic)=0.
760     py1max(ic)=0.
761     py1min(ic)=0.
762     pz1max(ic)=0.
763     pz1min(ic)=0.
764     enddo
765    
766    
767     do iev=1,iemax !event loop
768    
769     call HGNT(ntpl_Bmap,iev,ierr) !reads event
770     if(ierr.ne.0) goto 22
771    
772     c the output consists of matrices for coordinates, B components values
773     c and errors:
774     c e.g. px1(4,2) = X coordinate of the point with index = 4 along X,
775     c in which By (=2) component has been measured
776     c e.g. b1(3,23,4,1) = Bx (=1) component value, measured in the point with
777     c indexes = 3,23,4 along X, Y and Z
778    
779     c Bx component
780     px1(index(1),1) = pfx(1)
781     if(px1(index(1),1).lt.px1min(1)) px1min(1)=px1(index(1),1)
782     if(px1(index(1),1).gt.px1max(1)) px1max(1)=px1(index(1),1)
783     py1(index(2),1) = pfx(2)
784     if(py1(index(2),1).lt.py1min(1)) py1min(1)=py1(index(2),1)
785     if(py1(index(2),1).gt.py1max(1)) py1max(1)=py1(index(2),1)
786     pz1(index(3),1) = pfx(3)
787     if(pz1(index(3),1).lt.pz1min(1)) pz1min(1)=pz1(index(3),1)
788     if(pz1(index(3),1).gt.pz1max(1)) pz1max(1)=pz1(index(3),1)
789    
790     b1(index(1),index(2),index(3),1) = fx
791    
792    
793     c By component
794     px1(index(1),2) = pfy(1)
795     if(px1(index(1),2).lt.px1min(2)) px1min(2)=px1(index(1),2)
796     if(px1(index(1),2).gt.px1max(2)) px1max(2)=px1(index(1),2)
797     py1(index(2),2) = pfy(2)
798     if(py1(index(2),2).lt.py1min(2)) py1min(2)=py1(index(2),2)
799     if(py1(index(2),2).gt.py1max(2)) py1max(2)=py1(index(2),2)
800     pz1(index(3),2) = pfy(3)
801     if(pz1(index(3),2).lt.pz1min(2)) pz1min(2)=pz1(index(3),2)
802     if(pz1(index(3),2).gt.pz1max(2)) pz1max(2)=pz1(index(3),2)
803    
804     b1(index(1),index(2),index(3),2) = fy
805    
806    
807     c Bz component
808     px1(index(1),3) = pfz(1)
809     if(px1(index(1),3).lt.px1min(3)) px1min(3)=px1(index(1),3)
810     if(px1(index(1),3).gt.px1max(3)) px1max(3)=px1(index(1),3)
811     py1(index(2),3) = pfz(2)
812     if(py1(index(2),3).lt.py1min(3)) py1min(3)=py1(index(2),3)
813     if(py1(index(2),3).gt.py1max(3)) py1max(3)=py1(index(2),3)
814     pz1(index(3),3) = pfz(3)
815     if(pz1(index(3),3).lt.pz1min(3)) pz1min(3)=pz1(index(3),3)
816     if(pz1(index(3),3).gt.pz1max(3)) pz1max(3)=pz1(index(3),3)
817    
818     b1(index(1),index(2),index(3),3) = fz
819    
820     enddo
821    
822    
823     c------------------------------------------------------------------------
824     c
825     c closes files
826     c
827     c------------------------------------------------------------------------
828    
829     call HREND('Bmap')
830     close(lun_Bmap_file)
831     c$$$ cmd2='rm -f '
832     c$$$ $ //Bmap_file(1:LNBLNK(Bmap_file))
833     c$$$ call system(cmd2)
834     c$$$
835    
836    
837     c------------------------------------------------------------------------
838     c
839     c *** SECOND MAP ***
840     c
841     c------------------------------------------------------------------------
842    
843     c------------------------------------------------------------------------
844     c
845     c initialization and map file opening
846     c
847     c------------------------------------------------------------------------
848    
849     c print*,' '
850     c print*,' '
851    
852     Bmap_file='measure_n4_110402_corrected.rz'
853     c$$$ cmd1='cp $TRK_GRND/source/magnet/'
854     c$$$ $ //Bmap_file(1:LNBLNK(Bmap_file))//' .'
855     c$$$ call system(cmd1)
856    
857     c opens magnetic field map first file
858     print *,'Opening file: ',Bmap_file
859     call HROPEN
860     $ (lun_Bmap_file,'Bmap','./bin-aux/'//Bmap_file,'P',1024,istat)
861     if(istat.ne.0) goto 21
862    
863    
864     call HRIN(ntpl_Bmap,9999,0) !puts B map ntuple in memory
865    
866     c call HPRNTU(ntpl_Bmap)
867     call HBNAME(ntpl_Bmap,' ',0,'$CLEAR')
868     call HBNAME(ntpl_Bmap,'INDEX',index,'$SET')
869     call HBNAME(ntpl_Bmap,'BX',pfx,'$SET')
870     call HBNAME(ntpl_Bmap,'BY',pfy,'$SET')
871     call HBNAME(ntpl_Bmap,'BZ',pfz,'$SET')
872    
873    
874     c------------------------------------------------------------------------
875     c
876     c reads events and fills variables
877     c
878     c------------------------------------------------------------------------
879    
880     call HNOENT(ntpl_Bmap,iemax) !number of events
881    
882     do ic=1,3 !grid edges
883     px2max(ic)=0.
884     px2min(ic)=0.
885     py2max(ic)=0.
886     py2min(ic)=0.
887     pz2max(ic)=0.
888     pz2min(ic)=0.
889     enddo
890    
891    
892     do iev=1,iemax !event loop
893    
894     call HGNT(ntpl_Bmap,iev,ierr) !reads event
895     if(ierr.ne.0) goto 22
896    
897     c the output consists of matrices for coordinates, B components values
898     c and errors:
899     c e.g. px(4,2) = X coordinate of the point with index = 4 along X,
900     c in which By (=2) component has been measured
901     c e.g. b(3,23,4,1) = Bx (=1) component value, measured in the point with
902     c indexes = 3,23,4 along X, Y and Z
903    
904     c Bx component
905     px2(index(1),1) = pfx(1)
906     if(px2(index(1),1).lt.px2min(1)) px2min(1)=px2(index(1),1)
907     if(px2(index(1),1).gt.px2max(1)) px2max(1)=px2(index(1),1)
908     py2(index(2),1) = pfx(2)
909     if(py2(index(2),1).lt.py2min(1)) py2min(1)=py2(index(2),1)
910     if(py2(index(2),1).gt.py2max(1)) py2max(1)=py2(index(2),1)
911     pz2(index(3),1) = pfx(3)
912     if(pz2(index(3),1).lt.pz2min(1)) pz2min(1)=pz2(index(3),1)
913     if(pz2(index(3),1).gt.pz2max(1)) pz2max(1)=pz2(index(3),1)
914    
915     b2(index(1),index(2),index(3),1) = fx
916    
917    
918     c By component
919     px2(index(1),2) = pfy(1)
920     if(px2(index(1),2).lt.px2min(2)) px2min(2)=px2(index(1),2)
921     if(px2(index(1),2).gt.px2max(2)) px2max(2)=px2(index(1),2)
922     py2(index(2),2) = pfy(2)
923     if(py2(index(2),2).lt.py2min(2)) py2min(2)=py2(index(2),2)
924     if(py2(index(2),2).gt.py2max(2)) py2max(2)=py2(index(2),2)
925     pz2(index(3),2) = pfy(3)
926     if(pz2(index(3),2).lt.pz2min(2)) pz2min(2)=pz2(index(3),2)
927     if(pz2(index(3),2).gt.pz2max(2)) pz2max(2)=pz2(index(3),2)
928    
929     b2(index(1),index(2),index(3),2) = fy
930    
931    
932     c Bz component
933     px2(index(1),3) = pfz(1)
934     if(px2(index(1),3).lt.px2min(3)) px2min(3)=px2(index(1),3)
935     if(px2(index(1),3).gt.px2max(3)) px2max(3)=px2(index(1),3)
936     py2(index(2),3) = pfz(2)
937     if(py2(index(2),3).lt.py2min(3)) py2min(3)=py2(index(2),3)
938     if(py2(index(2),3).gt.py2max(3)) py2max(3)=py2(index(2),3)
939     pz2(index(3),3) = pfz(3)
940     if(pz2(index(3),3).lt.pz2min(3)) pz2min(3)=pz2(index(3),3)
941     if(pz2(index(3),3).gt.pz2max(3)) pz2max(3)=pz2(index(3),3)
942    
943     b2(index(1),index(2),index(3),3) = fz
944    
945     enddo
946    
947    
948     c------------------------------------------------------------------------
949     c
950     c closes files
951     c
952     c------------------------------------------------------------------------
953    
954     call HREND('Bmap')
955     close(lun_Bmap_file)
956     c$$$ cmd2='rm -f '
957     c$$$ $ //Bmap_file(1:LNBLNK(Bmap_file))
958     c$$$ call system(cmd2)
959    
960    
961     c------------------------------------------------------------------------
962     c
963     c no error exit
964     c
965     c------------------------------------------------------------------------
966    
967     c$$$ print*,' '
968     c$$$ print*,'MAGNETIC FIELD SUCCESSFULLY READ'
969     c$$$ print*,' '
970     c$$$ print*,' '
971    
972     goto 9000 !happy ending
973    
974     c------------------------------------------------------------------------
975     c
976     c magnetic field map file opening error
977     c
978     c------------------------------------------------------------------------
979    
980     21 continue
981    
982     print*,' '
983     print*,'read_B_inner: ERROR OPENING MAGNETIC FIELD MAP FILE: '
984     $ ,Bmap_file
985     print*,' '
986     print*,' '
987    
988     goto 9000 !the end
989    
990    
991     c------------------------------------------------------------------------
992     c
993     c ntuple event reading error
994     c
995     c------------------------------------------------------------------------
996    
997     22 continue
998    
999     print*,' '
1000     print*,'read_B_inner: ERROR WHILE READING NTUPLE, AT EVENT
1001     $ : ',iev
1002     print*,' '
1003     print*,' '
1004    
1005     goto 9000 !the end
1006    
1007    
1008     c------------------------------------------------------------------------
1009     c
1010     c exit
1011     c
1012     c------------------------------------------------------------------------
1013    
1014     9000 continue
1015    
1016     return
1017     end
1018     read_B_outer.f0100640000076700007640000001510610252261222013514 0ustar vannucciwizard*************************************************************************
1019     *
1020     * Subroutine read_B_outer.f
1021     *
1022     * it reads from rz files the two magnetic field maps taken inside the
1023     * spectrometer cavity and fills the variables in common_B_inner.f
1024     *
1025     * needs:
1026     * - ../common/common_B_outer.f common file for the outer magnetic field map
1027     * - .rz map files in ./ containing coordinates of measured points, Bx, By
1028     * and Bz components + errors
1029     *
1030     * output variables: (see common_B_outer.f)
1031     * - pxo(nx,3)
1032     * - pyo(ny,3)
1033     * - pzo(nz,3)
1034     * - bo(nx,ny,nz,3)
1035     *
1036     *************************************************************************
1037    
1038     subroutine read_B_outer
1039    
1040     implicit double precision (a-h,o-z)
1041     include '../common/common_B_outer.f'
1042    
1043    
1044     c------------------------------------------------------------------------
1045     c
1046     c local variables
1047     c
1048     c------------------------------------------------------------------------
1049    
1050     character*64 Bmap_file !magnetic field file name
1051     parameter (lun_Bmap_file=66) !magnetic field map file id number
1052    
1053     parameter (ntpl_Bmap=20) !ntuple identifier
1054    
1055     REAL PFX(3),FX,DFX, !Bx field component coordinates in m, value and error in T
1056     $ PFY(3),FY,DFY
1057     $ ,PFZ(3),FZ,DFZ
1058     INTEGER INDEX(3) !point index
1059    
1060     COMMON /PAWCR4/ INDEX,PFX,FX,DFX,PFY,FY,DFY,PFZ,FZ,DFZ
1061    
1062    
1063     c------------------------------------------------------------------------
1064     c
1065     c *** FIRST MAP ***
1066     c
1067     c------------------------------------------------------------------------
1068    
1069     c------------------------------------------------------------------------
1070     c
1071     c initialization and map file opening
1072     c
1073     c------------------------------------------------------------------------
1074    
1075     c print*,' '
1076     c print*,' '
1077    
1078     Bmap_file='External_top_map_n4_150402.rz'
1079    
1080     c opens magnetic field map first file
1081     print *,'Opening file: ',Bmap_file
1082     call HROPEN
1083     $ (lun_Bmap_file,'Bmap','./bin-aux/'//Bmap_file,'P',1024,istat)
1084     if(istat.ne.0) goto 21
1085    
1086    
1087     call HRIN(ntpl_Bmap,9999,0) !puts B map ntuple in memory
1088    
1089     c call HPRNTU(ntpl_Bmap)
1090     call HBNAME(ntpl_Bmap,' ',0,'$CLEAR')
1091     call HBNAME(ntpl_Bmap,'INDEX',index,'$SET')
1092     call HBNAME(ntpl_Bmap,'BX',pfx,'$SET')
1093     call HBNAME(ntpl_Bmap,'BY',pfy,'$SET')
1094     call HBNAME(ntpl_Bmap,'BZ',pfz,'$SET')
1095    
1096    
1097     c------------------------------------------------------------------------
1098     c
1099     c reads events and fills variables
1100     c
1101     c------------------------------------------------------------------------
1102    
1103     call HNOENT(ntpl_Bmap,iemax) !number of events
1104    
1105     c initializes measurement grid edges
1106     do ic=1,3
1107     poxmax(ic)=0.
1108     poxmin(ic)=0.
1109     poymax(ic)=0.
1110     poymin(ic)=0.
1111     pozmax(ic)=0.
1112     pozmin(ic)=0.
1113     enddo
1114    
1115    
1116     do iev=1,iemax !event loop
1117    
1118     call HGNT(ntpl_Bmap,iev,ierr) !reads event
1119     if(ierr.ne.0) goto 22
1120    
1121     c the output consists of matrices for coordinates, B components values
1122     c and errors:
1123     c e.g. px1(4,2) = X coordinate of the point with index = 4 along X,
1124     c in which By (=2) component has been measured
1125     c e.g. b1(3,23,4,1) = Bx (=1) component value, measured in the point with
1126     c indexes = 3,23,4 along X, Y and Z
1127    
1128     c Bx component
1129     pox(index(1),1) = pfx(1)
1130     if(pox(index(1),1).lt.poxmin(1)) poxmin(1)=pox(index(1),1)
1131     if(pox(index(1),1).gt.poxmax(1)) poxmax(1)=pox(index(1),1)
1132     poy(index(2),1) = pfx(2)
1133     if(poy(index(2),1).lt.poymin(1)) poymin(1)=poy(index(2),1)
1134     if(poy(index(2),1).gt.poymax(1)) poymax(1)=poy(index(2),1)
1135     poz(index(3),1) = pfx(3)
1136     if(poz(index(3),1).lt.pozmin(1)) pozmin(1)=poz(index(3),1)
1137     if(poz(index(3),1).gt.pozmax(1)) pozmax(1)=poz(index(3),1)
1138    
1139     bo(index(1),index(2),index(3),1) = fx
1140    
1141    
1142     c By component
1143     pox(index(1),2) = pfy(1)
1144     if(pox(index(1),2).lt.poxmin(2)) poxmin(2)=pox(index(1),2)
1145     if(pox(index(1),2).gt.poxmax(2)) poxmax(2)=pox(index(1),2)
1146     poy(index(2),2) = pfy(2)
1147     if(poy(index(2),2).lt.poymin(2)) poymin(2)=poy(index(2),2)
1148     if(poy(index(2),2).gt.poymax(2)) poymax(2)=poy(index(2),2)
1149     poz(index(3),2) = pfy(3)
1150     if(poz(index(3),2).lt.pozmin(2)) pozmin(2)=poz(index(3),2)
1151     if(poz(index(3),2).gt.pozmax(2)) pozmax(2)=poz(index(3),2)
1152    
1153     bo(index(1),index(2),index(3),2) = fy
1154    
1155    
1156     c Bz component
1157     pox(index(1),3) = pfz(1)
1158     if(pox(index(1),3).lt.poxmin(3)) poxmin(3)=pox(index(1),3)
1159     if(pox(index(1),3).gt.poxmax(3)) poxmax(3)=pox(index(1),3)
1160     poy(index(2),3) = pfz(2)
1161     if(poy(index(2),3).lt.poymin(3)) poymin(3)=poy(index(2),3)
1162     if(poy(index(2),3).gt.poymax(3)) poymax(3)=poy(index(2),3)
1163     poz(index(3),3) = pfz(3)
1164     if(poz(index(3),3).lt.pozmin(3)) pozmin(3)=poz(index(3),3)
1165     if(poz(index(3),3).gt.pozmax(3)) pozmax(3)=poz(index(3),3)
1166    
1167     bo(index(1),index(2),index(3),3) = fz
1168    
1169     enddo
1170    
1171    
1172     c------------------------------------------------------------------------
1173     c
1174     c closes files
1175     c
1176     c------------------------------------------------------------------------
1177    
1178     call HREND('Bmap')
1179     close(lun_Bmap_file)
1180    
1181    
1182     c------------------------------------------------------------------------
1183     c
1184     c no error exit
1185     c
1186     c------------------------------------------------------------------------
1187    
1188     c$$$ print*,' '
1189     c$$$ print*,'MAGNETIC FIELD SUCCESSFULLY READ'
1190     c$$$ print*,' '
1191     c$$$ print*,' '
1192    
1193     goto 9000 !happy ending
1194    
1195     c------------------------------------------------------------------------
1196     c
1197     c magnetic field map file opening error
1198     c
1199     c------------------------------------------------------------------------
1200    
1201     21 continue
1202    
1203     print*,' '
1204     print*,'read_B_inner: ERROR OPENING MAGNETIC FIELD MAP FILE: '
1205     $ ,Bmap_file
1206     print*,' '
1207     print*,' '
1208    
1209     goto 9000 !the end
1210    
1211    
1212     c------------------------------------------------------------------------
1213     c
1214     c ntuple event reading error
1215     c
1216     c------------------------------------------------------------------------
1217    
1218     22 continue
1219    
1220     print*,' '
1221     print*,'read_B_inner: ERROR WHILE READING NTUPLE, AT EVENT
1222     $ : ',iev
1223     print*,' '
1224     print*,' '
1225    
1226     goto 9000 !the end
1227    
1228    
1229     c------------------------------------------------------------------------
1230     c
1231     c exit
1232     c
1233     c------------------------------------------------------------------------
1234    
1235     9000 continue
1236    
1237     return
1238     end
1239    

  ViewVC Help
Powered by ViewVC 1.1.23