/[PAMELA software]/DarthVader/TrackerLevel2/src/F77/interB.f
ViewVC logotype

Contents of /DarthVader/TrackerLevel2/src/F77/interB.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Fri May 19 13:15:55 2006 UTC (18 years, 6 months ago) by mocchiut
Branch point for: DarthVader, MAIN
Initial revision

1 *************************************************************************
2 *
3 * Subroutine inter_B.f
4 *
5 * it computes the magnetic field in a chosen point x,y,z inside or
6 * outside the magnetic cavity, using a trilinear interpolation of
7 * B field measurements (read before by means of ./read_B.f)
8 * if the point falls outside the interpolation volume, set the field to 0
9 *
10 * needs:
11 * - common_B_inner.f common file for the inner magnetic field map
12 * - ./inter_B_inner.f common file for the inner magnetic field map
13 * - common_B_outer.f common file for the outer magnetic field map
14 * - ./inter_B_outer.f common file for the outer magnetic field map
15 *
16 * to be called after ./read_B.f (magnetic field map reading subroutine)
17 *
18 * input: coordinates in m
19 * output: magnetic field in T
20 *
21 *************************************************************************
22
23 subroutine inter_B(x,y,z,res) !coordinates in m, magnetic field in T
24
25 implicit double precision (a-h,o-z)
26 include 'common_B.f'
27
28
29 c------------------------------------------------------------------------
30 c
31 c local variables
32 c
33 c------------------------------------------------------------------------
34
35 real*8 x,y,z !point of interest
36 real*8 res(3) !interpolated B components: res = (Bx, By, Bz)
37
38 real*8 zl,zu
39 real*8 resu(3),resl(3)
40
41 c------------------------------------------------------------------------
42 c
43 c set the field outside the interpolation volume to be 0
44 c
45 c------------------------------------------------------------------------
46
47 do ip=1,3
48 res(ip)=0.
49 enddo
50
51
52 c------------------------------------------------------------------------
53 c
54 c check if the point falls inside the interpolation volumes
55 c
56 c------------------------------------------------------------------------
57
58 * -----------------------
59 * INNER MAP
60 * -----------------------
61 if(
62 $ (x.ge.edgexmin).and.(x.le.edgexmax)
63 $ .and.(y.ge.edgeymin).and.(y.le.edgeymax)
64 $ .and.(z.ge.edgezmin).and.(z.le.edgezmax)
65 $ ) then
66
67 call inter_B_inner(x,y,z,res)
68 c print*,'INNER - ',z,res
69
70 endif
71
72 * -----------------------
73 * OUTER MAP
74 * -----------------------
75 if(
76 $ ((x.ge.edgeuxmin).and.(x.le.edgeuxmax)
77 $ .and.(y.ge.edgeuymin).and.(y.le.edgeuymax)
78 $ .and.(z.ge.edgeuzmin).and.(z.le.edgeuzmax))
79 $ .or.
80 $ ((x.ge.edgelxmin).and.(x.le.edgelxmax)
81 $ .and.(y.ge.edgelymin).and.(y.le.edgelymax)
82 $ .and.(z.ge.edgelzmin).and.(z.le.edgelzmax))
83 $ ) then
84
85 call inter_B_outer(x,y,z,res)
86 c res(2)=res(2)*10
87 c print*,'OUTER - ',z,res
88
89 endif
90
91 * --------------------------------
92 * GAP between INNER and OUTER MAPS
93 * --------------------------------
94 if(
95 $ (x.gt.edgexmin).and.(x.lt.edgexmax)
96 $ .and.(y.gt.edgeymin).and.(y.lt.edgeymax)
97 $ .and.(z.gt.edgezmax).and.(z.lt.edgeuzmin)
98 $ )then
99
100 zu = edgeuzmin
101 zl = edgezmax
102 call inter_B_inner(x,y,zl,resu)
103 call inter_B_outer(x,y,zu,resl)
104
105 do i=1,3
106 res(i) = z * ((resu(i)-resl(i))/(zu-zl))
107 $ + resu(i)
108 $ - zu * ((resu(i)-resl(i))/(zu-zl))
109 enddo
110 c print*,'GAP U - ',z,res
111
112 elseif(
113 $ (x.gt.edgexmin).and.(x.lt.edgexmax)
114 $ .and.(y.gt.edgeymin).and.(y.lt.edgeymax)
115 $ .and.(z.gt.edgelzmax).and.(z.lt.edgezmin)
116 $ ) then
117
118
119 zu = edgezmin
120 zl = edgelzmax
121 call inter_B_inner(x,y,zu,resu)
122 call inter_B_outer(x,y,zl,resl)
123
124 do i=1,3
125 res(i) = z * ((resu(i)-resl(i))/(zu-zl))
126 $ + resu(i)
127 $ - zu * ((resu(i)-resl(i))/(zu-zl))
128 enddo
129 c print*,'GAP D - ',z,res
130
131 endif
132
133 return
134 end
135
136
137 *************************************************************************
138 *
139 * Subroutine inter_B_inner.f
140 *
141 * it computes the magnetic field in a chosen point x,y,z inside the
142 * magnetic cavity, using a trilinear interpolation of
143 * B field measurements (read before by means of ./read_B.f)
144 * the value is computed for two different inner maps and then averaged
145 *
146 * needs:
147 * - ../common/common_B_inner.f
148 *
149 * input: coordinates in m
150 * output: magnetic field in T
151 *
152 *************************************************************************
153
154 subroutine inter_B_inner(x,y,z,res) !coordinates in m, magnetic field in T
155
156 implicit double precision (a-h,o-z)
157 include 'common_B.f'
158
159
160 c------------------------------------------------------------------------
161 c
162 c local variables
163 c
164 c------------------------------------------------------------------------
165
166 real*8 x,y,z !point of interpolation
167 real*8 res(3) !interpolated B components: res = (Bx, By, Bz)
168 real*8 res1(3),res2(3) !interpolated B components for the two maps
169
170 integer ic !index for B components:
171 ! ic=1 ---> Bx
172 ! ic=2 ---> By
173 ! ic=3 ---> Bz
174
175 integer cube(3) !vector of indexes identifying the cube
176 ! containing the point of interpolation
177 ! (see later...)
178
179 real*8 xl,xh,yl,yh,zl,zh !cube vertexes coordinates
180
181 real*8 xr,yr,zr !reduced variables (coordinates of the
182 ! point of interpolation inside the cube)
183
184 real*8 Bp(8) !vector of values of B component
185 ! being computed, on the eight cube vertexes
186
187
188 c------------------------------------------------------------------------
189 c
190 c *** FIRST MAP ***
191 c
192 c------------------------------------------------------------------------
193
194 do ic=1,3 !loops on the three B components
195
196 c------------------------------------------------------------------------
197 c
198 c chooses the coordinates interval containing the input point
199 c
200 c------------------------------------------------------------------------
201 c e.g.:
202 c
203 c x1 x2 x3 x4 x5...
204 c |-----|-+---|-----|-----|----
205 c ~~~~~~~~x
206 c
207 c in this case the right interval is identified by indexes 2-3, so the
208 c value assigned to cube variable is 2
209
210 cube(1)=INT((nx-1)*(x-px1min(ic))/(px1max(ic)-px1min(ic))) +1
211 cube(2)=INT((ny-1)*(y-py1min(ic))/(py1max(ic)-py1min(ic))) +1
212 cube(3)=INT((nz-1)*(z-pz1min(ic))/(pz1max(ic)-pz1min(ic))) +1
213
214 c------------------------------------------------------------------------
215 c
216 c if the point falls beyond the extremes of the grid...
217 c
218 c------------------------------------------------------------------------
219 c
220 c ~~~~~~~~~~x1 x2 x3...
221 c - - + - - |-----|-----|----
222 c ~~~~x
223 c
224 c in the case cube = 1
225 c
226 c
227 c ...nx-2 nx-1 nx
228 c ----|-----|-----| - - - + - -
229 c ~~~~~~~~~~~~~~~~~~~~~~~~x
230 c
231 c in this case cube = nx-1
232
233 if (cube(1).le.0) cube(1) = 1
234 if (cube(2).le.0) cube(2) = 1
235 if (cube(3).le.0) cube(3) = 1
236 if (cube(1).ge.nx) cube(1) = nx-1
237 if (cube(2).ge.ny) cube(2) = ny-1
238 if (cube(3).ge.nz) cube(3) = nz-1
239
240
241 c------------------------------------------------------------------------
242 c
243 c temporary variables definition for field computation
244 c
245 c------------------------------------------------------------------------
246
247 xl = px1(cube(1),ic) !X coordinates of cube vertexes
248 xh = px1(cube(1)+1,ic)
249
250 yl = py1(cube(2),ic) !Y coordinates of cube vertexes
251 yh = py1(cube(2)+1,ic)
252
253 zl = pz1(cube(3),ic) !Z coordinates of cube vertexes
254 zh = pz1(cube(3)+1,ic)
255
256 xr = (x-xl) / (xh-xl) !reduced variables
257 yr = (y-yl) / (yh-yl)
258 zr = (z-zl) / (zh-zl)
259
260 Bp(1) = b1(cube(1) ,cube(2) ,cube(3) ,ic) !ic-th component of B
261 Bp(2) = b1(cube(1)+1,cube(2) ,cube(3) ,ic) ! on the eight cube
262 Bp(3) = b1(cube(1) ,cube(2)+1,cube(3) ,ic) ! vertexes
263 Bp(4) = b1(cube(1)+1,cube(2)+1,cube(3) ,ic)
264 Bp(5) = b1(cube(1) ,cube(2) ,cube(3)+1,ic)
265 Bp(6) = b1(cube(1)+1,cube(2) ,cube(3)+1,ic)
266 Bp(7) = b1(cube(1) ,cube(2)+1,cube(3)+1,ic)
267 Bp(8) = b1(cube(1)+1,cube(2)+1,cube(3)+1,ic)
268
269 c------------------------------------------------------------------------
270 c
271 c computes interpolated ic-th component of B in (x,y,z)
272 c
273 c------------------------------------------------------------------------
274
275 res1(ic) =
276 + Bp(1)*(1-xr)*(1-yr)*(1-zr) +
277 + Bp(2)*xr*(1-yr)*(1-zr) +
278 + Bp(3)*(1-xr)*yr*(1-zr) +
279 + Bp(4)*xr*yr*(1-zr) +
280 + Bp(5)*(1-xr)*(1-yr)*zr +
281 + Bp(6)*xr*(1-yr)*zr +
282 + Bp(7)*(1-xr)*yr*zr +
283 + Bp(8)*xr*yr*zr
284
285
286 enddo
287
288 c------------------------------------------------------------------------
289 c
290 c *** SECOND MAP ***
291 c
292 c------------------------------------------------------------------------
293
294 c second map is rotated by 180 degree along the Z axis. so change sign
295 c of x and y coordinates and then change sign to Bx and By components
296 c to obtain the correct result
297
298 x=-x
299 y=-y
300
301 do ic=1,3
302
303 cube(1)=INT((nx-1)*(x-px2min(ic))/(px2max(ic)-px2min(ic))) +1
304 cube(2)=INT((ny-1)*(y-py2min(ic))/(py2max(ic)-py2min(ic))) +1
305 cube(3)=INT((nz-1)*(z-pz2min(ic))/(pz2max(ic)-pz2min(ic))) +1
306
307 if (cube(1).le.0) cube(1) = 1
308 if (cube(2).le.0) cube(2) = 1
309 if (cube(3).le.0) cube(3) = 1
310 if (cube(1).ge.nx) cube(1) = nx-1
311 if (cube(2).ge.ny) cube(2) = ny-1
312 if (cube(3).ge.nz) cube(3) = nz-1
313
314 xl = px2(cube(1),ic)
315 xh = px2(cube(1)+1,ic)
316
317 yl = py2(cube(2),ic)
318 yh = py2(cube(2)+1,ic)
319
320 zl = pz2(cube(3),ic)
321 zh = pz2(cube(3)+1,ic)
322
323 xr = (x-xl) / (xh-xl)
324 yr = (y-yl) / (yh-yl)
325 zr = (z-zl) / (zh-zl)
326
327 Bp(1) = b2(cube(1) ,cube(2) ,cube(3) ,ic)
328 Bp(2) = b2(cube(1)+1,cube(2) ,cube(3) ,ic)
329 Bp(3) = b2(cube(1) ,cube(2)+1,cube(3) ,ic)
330 Bp(4) = b2(cube(1)+1,cube(2)+1,cube(3) ,ic)
331 Bp(5) = b2(cube(1) ,cube(2) ,cube(3)+1,ic)
332 Bp(6) = b2(cube(1)+1,cube(2) ,cube(3)+1,ic)
333 Bp(7) = b2(cube(1) ,cube(2)+1,cube(3)+1,ic)
334 Bp(8) = b2(cube(1)+1,cube(2)+1,cube(3)+1,ic)
335
336 res2(ic) =
337 + Bp(1)*(1-xr)*(1-yr)*(1-zr) +
338 + Bp(2)*xr*(1-yr)*(1-zr) +
339 + Bp(3)*(1-xr)*yr*(1-zr) +
340 + Bp(4)*xr*yr*(1-zr) +
341 + Bp(5)*(1-xr)*(1-yr)*zr +
342 + Bp(6)*xr*(1-yr)*zr +
343 + Bp(7)*(1-xr)*yr*zr +
344 + Bp(8)*xr*yr*zr
345
346 enddo
347
348 c change Bx and By components sign
349 res2(1)=-res2(1)
350 res2(2)=-res2(2)
351
352 c change back the x and y coordinate signs
353 x=-x
354 y=-y
355
356
357 c------------------------------------------------------------------------
358 c
359 c average the two maps results
360 c
361 c------------------------------------------------------------------------
362
363 do ic=1,3
364 res(ic)=(res1(ic)+res2(ic))/2
365 enddo
366
367
368 return
369 end
370 *************************************************************************
371 *
372 * Subroutine inter_B_outer.f
373 *
374 * it computes the magnetic field in a chosen point x,y,z OUTSIDE the
375 * magnetic cavity, using a trilinear interpolation of
376 * B field measurements (read before by means of ./read_B.f)
377 * the value is computed for the outer map
378 *
379 * needs:
380 * - ../common/common_B_outer.f
381 *
382 * input: coordinates in m
383 * output: magnetic field in T
384 *
385 *************************************************************************
386
387 subroutine inter_B_outer(x,y,z,res) !coordinates in m, magnetic field in T
388
389 implicit double precision (a-h,o-z)
390 include 'common_B.f'
391
392
393 c------------------------------------------------------------------------
394 c
395 c local variables
396 c
397 c------------------------------------------------------------------------
398
399 real*8 x,y,z !point of interpolation
400 real*8 res(3) !interpolated B components: res = (Bx, By, Bz)
401 real*8 zin
402
403 integer ic
404 c !index for B components:
405 c ! ic=1 ---> Bx
406 c ! ic=2 ---> By
407 c ! ic=3 ---> Bz
408
409 integer cube(3)
410 c !vector of indexes identifying the cube
411 c ! containing the point of interpolation
412 c ! (see later...)
413
414 real*8 xl,xh,yl,yh,zl,zh !cube vertexes coordinates
415
416 real*8 xr,yr,zr
417 c !reduced variables (coordinates of the
418 c ! point of interpolation inside the cube)
419
420 real*8 Bp(8)
421 c !vector of values of B component
422 c ! being computed, on the eight cube vertexes
423
424
425 c LOWER MAP
426 c ---> up/down simmetry
427 zin=z
428 if(zin.le.edgelzmax)z=-z
429
430 c------------------------------------------------------------------------
431 c
432 c *** MAP ***
433 c
434 c------------------------------------------------------------------------
435
436 do ic=1,3 !loops on the three B components
437
438 c------------------------------------------------------------------------
439 c
440 c chooses the coordinates interval containing the input point
441 c
442 c------------------------------------------------------------------------
443 c e.g.:
444 c
445 c x1 x2 x3 x4 x5... xN
446 c |-----|-+---|-----|-----|---- ... ----|-----|
447 c ~~~~~~~~x
448 c
449 c in this case the right interval is identified by indexes 2-3, so the
450 c value assigned to cube variable is 2
451
452 cube(1)=INT((nox-1)*(x-poxmin(ic))/(poxmax(ic)-poxmin(ic))) +1
453 cube(2)=INT((noy-1)*(y-poymin(ic))/(poymax(ic)-poymin(ic))) +1
454 cube(3)=INT((noz-1)*(z-pozmin(ic))/(pozmax(ic)-pozmin(ic))) +1
455
456 c------------------------------------------------------------------------
457 c
458 c if the point falls beyond the extremes of the grid...
459 c
460 c------------------------------------------------------------------------
461 c
462 c ~~~~~~~~~~x1 x2 x3...
463 c - - + - - |-----|-----|----
464 c ~~~~x
465 c
466 c in the case cube = 1
467 c
468 c
469 c ...nx-2 nx-1 nx
470 c ----|-----|-----| - - - + - -
471 c ~~~~~~~~~~~~~~~~~~~~~~~~x
472 c
473 c in this case cube = nx-1
474
475 if (cube(1).le.0) cube(1) = 1
476 if (cube(2).le.0) cube(2) = 1
477 if (cube(3).le.0) cube(3) = 1
478 if (cube(1).ge.nox) cube(1) = nox-1
479 if (cube(2).ge.noy) cube(2) = noy-1
480 if (cube(3).ge.noz) cube(3) = noz-1
481
482
483 c------------------------------------------------------------------------
484 c
485 c temporary variables definition for field computation
486 c
487 c------------------------------------------------------------------------
488
489 xl = pox(cube(1),ic) !X coordinates of cube vertexes
490 xh = pox(cube(1)+1,ic)
491
492 yl = poy(cube(2),ic) !Y coordinates of cube vertexes
493 yh = poy(cube(2)+1,ic)
494
495 zl = poz(cube(3),ic) !Z coordinates of cube vertexes
496 zh = poz(cube(3)+1,ic)
497
498 xr = (x-xl) / (xh-xl) !reduced variables
499 yr = (y-yl) / (yh-yl)
500 zr = (z-zl) / (zh-zl)
501
502 Bp(1) = bo(cube(1) ,cube(2) ,cube(3) ,ic) !ic-th component of B
503 Bp(2) = bo(cube(1)+1,cube(2) ,cube(3) ,ic) ! on the eight cube
504 Bp(3) = bo(cube(1) ,cube(2)+1,cube(3) ,ic) ! vertexes
505 Bp(4) = bo(cube(1)+1,cube(2)+1,cube(3) ,ic)
506 Bp(5) = bo(cube(1) ,cube(2) ,cube(3)+1,ic)
507 Bp(6) = bo(cube(1)+1,cube(2) ,cube(3)+1,ic)
508 Bp(7) = bo(cube(1) ,cube(2)+1,cube(3)+1,ic)
509 Bp(8) = bo(cube(1)+1,cube(2)+1,cube(3)+1,ic)
510
511 c------------------------------------------------------------------------
512 c
513 c computes interpolated ic-th component of B in (x,y,z)
514 c
515 c------------------------------------------------------------------------
516
517 res(ic) =
518 + Bp(1)*(1-xr)*(1-yr)*(1-zr) +
519 + Bp(2)*xr*(1-yr)*(1-zr) +
520 + Bp(3)*(1-xr)*yr*(1-zr) +
521 + Bp(4)*xr*yr*(1-zr) +
522 + Bp(5)*(1-xr)*(1-yr)*zr +
523 + Bp(6)*xr*(1-yr)*zr +
524 + Bp(7)*(1-xr)*yr*zr +
525 + Bp(8)*xr*yr*zr
526
527
528 enddo
529
530 c LOWER MAP
531 c ---> up/down simmetry
532 if(zin.le.edgelzmax)then
533 z=-z !back to initial ccoordinate
534 res(3)=-res(3) !invert BZ component
535 endif
536
537 return
538 end

  ViewVC Help
Powered by ViewVC 1.1.23