COSMOS v7.655  COSMOSv7655
(AirShowerMC)
smashSkel.f
Go to the documentation of this file.
1 #if defined (KEKB) || defined (KEKA)
2 #define AVOIDFOOL
3 #endif
4  implicit none
5 ! We smash the skeleton into NCPU skeeltons; but flesh (MCPU+MARGIN) skeletons
6 ! and modify the fleshed one by multiplying a factor NCPU/MCPU
7 ! to the total number of particles.
8 ! We select (MCPU+MARGIN) skeletons among NCPU skeletons randomly.
9 !
10 !
11 ! read skelton data and store each children as a complete
12 ! track so that each can be put to stack area as incidnet
13 ! particle.
14 ! smashed skeleton data format
15 ! Assume ncpu cpu's; For each cpu, smashed skeleton files will be
16 !
17 ! skeleton001
18 ! cumnum, num, ir, Zfirst
19 ! Np
20 ! observed ptcles 1
21 ! observed ptcles 2
22 !
23 ! observed ptcles Np
24 ! nlowp
25 ! track-1
26 ! track-2
27 ! ...
28 ! track-nlowp
29 ! other skeleton file( skeleton002,...)
30 ! cumnum, num, ir, Zfirst
31 ! 0
32 ! nlowp
33 ! track-1
34 ! track-2
35 ! ...
36 ! track-nlowp
37 ! ....
38 !
39 #include "Ztrack.h"
40 #include "Zearth.h"
41  include "../../SkelFlesh/Zprivate.h"
42  include "Zprivate2.h"
43 
44 
45  type(child):: cc
46  integer icon
47  integer klena
48  integer i, nlow, cumnum, num, ir(2)
49  integer ii
50  type(track):: Zfirst
51  character*120 outdir
52  character*120 skelfilebase
53  character*100 basename
54  character*100 filename
55  character*100 input
56  character*100 hostlist, thinhostlist
57  character*15 field(3)
58  integer n, j, k, nr, ll, kgetenv2
59 !//////////
60  write(0,*) ' start'
61 !///////////
62 
63  hostlist = ' '
64  thinhostlist = ' '
65 
66  ll = kgetenv2("NCPU", msg)
67  read( msg(1:ll), *) ncpu
68  ll = kgetenv2("MCPU", msg)
69  read( msg(1:ll), *) mcpu
70  ll = kgetenv2("MARGIN", msg)
71  read( msg(1:ll), *) margin
72 !//////////
73  write(0,*) ncpu, mcpu, margin
74 !///////////
75 
76  ll = kgetenv2("SKELETON", msg)
77  skelfilebase=msg(1:ll)
78  ll = kgetenv2("SMSKELDIR", msg)
79  outdir = msg(1:ll)
80  ll = kgetenv2("SKELNAME", msg)
81  basename= msg(1:ll)
82  ll = kgetenv2("HOSTLIST", msg)
83  if(ll .gt. 0) hostlist = msg(1:ll)
84 
85  ll = kgetenv2("THINHOSTLIST", msg)
86  if(ll .gt. 0) thinhostlist = msg(1:ll)
87 ! binary open
88  call copenfw2(11, skelfilebase, 2, icon)
89  if(icon .ne. 1) then
90  write(msg,*) skelfilebase(1:klena(skelfilebase)),
91  * ' could not be opened properly'
92  call cerrormsg(msg, 0)
93  endif
94  write(msg,*) "# of cpu's=",ncpu, mcpu
95  call cerrormsg(msg, 1)
96  if(ncpu .lt. 1 .or. ncpu .gt. maxcpu) then
97  call cerrormsg("# of cpu's > MaxCPU <1 ",0)
98  endif
99 
100 ! open output smashed skeleton files
101  k = klena(outdir)
102  if( outdir(k:k) .ne. '/') then
103  k = k + 1
104  outdir(k:k)= '/'
105  endif
106  write(msg, '(a,a)') 'output directory is ',
107  * outdir(1:k)
108  call cerrormsg(msg, 1)
109  write(msg,*) mcpu,
110  * ' files will be created there as '//
111  * basename(1:klena(basename))//'00003 etc'
112  call cerrormsg(msg, 1)
113 
114 !
115 
116  if(hostlist .ne. ' ') then
117  call copenf(12, hostlist, icon)
118  if(icon .ne. 0 ) then
119  call cerrormsg(hostlist, 1)
120  call cerrormsg(' could not be opened', 0)
121  endif
122  else
123  write(0,*) ' hostlist not given'
124  stop 1234
125  endif
126 
127  if( mcpu .le. ncpu ) then
128  if( thinhostlist .ne. ' ' ) then
129  call copenf(13, thinhostlist, icon)
130  if(icon .ne. 0 ) then
131  call cerrormsg(thinhostlist, 1)
132  call cerrormsg(' could not be opened', 0)
133  endif
134  else
135  write(0,*) ' thinhostlist not given'
136  stop 1234
137  endif
138  else
139  write(0,*) ' Mcpu =', mcpu, ' > Ncpu=', ncpu
140  stop 1234
141  endif
142 
143  do i = 1, ncpu
144  read(12, '(a)') input
145 ! input may be like: 1 hosta 2.5
146  field(1) = ' '
147  field(2) = ' '
148  field(3) = ' '
149  call ksplit(input, 30, 3, field, nr)
150  read(field(1), '(i5)' ) numba(i)
151  if( numba(i) .gt. ncpu .or. numba(i) .lt. 1 ) then
152  write(0,*) i, '-th line has ivalid number=',
153  * numba(i), ' in Hosts'
154  stop 0000
155  endif
156  if(nr .le. 2) then
157  cpupw(i) = 1.0
158  else
159  read(field(3), * ) cpupw(i)
160  endif
161  enddo
162  close(12)
163 
164  if(mcpu .le. ncpu) then
165  do i = 1, mcpu+margin
166  read(13, '(a)') input
167 ! input may be like: 1 hosta 2.5
168  field(1) = ' '
169  field(2) = ' '
170  field(3) = ' '
171  call ksplit(input, 30, 3, field, nr)
172  read(field(1), '(i5)' ) ii
173  if( ii .gt. ncpu .or. ii .lt. 1 ) then
174  write(0,*) i, '-th line has invalid number=',
175  * ii, ' in ThinHosts'
176  stop 0000
177  endif
178  numba(ii) = -ii
179  enddo
180  close(13)
181  endif
182 
183  do i = 1, ncpu
184  if( numba(i) .lt. 0 ) then
185  write(filename,'(a,i5.5)')
186  * basename(1:klena(basename)), i
187  skelfile(i) = outdir(1:klena(outdir))//filename
188 ! We don't open files here; too many files
189 ! might not be opened simultaneously.
190 ! call copenfw2(basefn+i, skelefile, 2, icon)
191 ! if(icon .ne. 0) then
192 ! call cerrorMsg(skelfile(i), 1)
193 ! call cerrorMsg('could not be opened properly',1)
194 ! call cerrorMsg('maybe they already exist', 0)
195  endif
196  enddo
197 
198 
199 ! ------------
200 
201 
202  do while(.true.)
203  read(11, end=100) cumnum, num, ir,
204 #if defined (AVOIDFOOL)
205 #include "ZavoidUnionMap.h"
206 #else
207  * zfirst
208 #endif
209 
210  do i = 1, ncpu
211  if( numba(i) .lt. 0 ) then
212 ! open one file at a time and
213 ! if possible.
214 #if defined (AVOIDFOOL)
215  open(basefn+i, file=skelfile(i), position="append",
216 #else
217  open(basefn+i, file=skelfile(i), access="append",
218 #endif
219  * form="unformatted", iostat=icon)
220 
221  if(icon .eq. 0) then
222  write(basefn+i) cumnum, num, ir,
223 #if defined (AVOIDFOOL)
224 #include "ZavoidUnionMap.h"
225 #else
226  * zfirst
227 #endif
228 !////////////
229 ! write(0,*) ' cpu #=',i,
230 ! * ' Zfirst=',Zfirst.pos.depth*0.1,'g/cm2',
231 ! * ' ir=', ir
232 !//////////////////
233  else
234  write(0,*) skelfile(i), " could not be opened"
235  stop 0000
236  endif
237  close(basefn+i)
238  endif
239  enddo
240 
241  read(11) np
242  call cerrormsg('------------', 1)
243  write(msg, *) np, ' ptcls are observed ones in skeleton'
244  call cerrormsg(msg, 1)
245  if(np .gt. maxob) then
246  call cerrormsg(
247  * 'It is too large; enlarge Maxob', 0)
248  endif
249 
250  do i = 1, np
251  read(11) oo(i)
252  enddo
253  write(0,*) ' observed ptcles have been read'
254  nlow = 1
255  ctc=0
256  do while (nlow .ge. 0)
257  read(11) nlow, pp
258 ! nlow = 0, if pp.asflag=-1.
259 !////////////
260 ! write(0,*) ' nlow=',nlow, ' ctc=',ctc
261 !//////////
262  do i = 1, nlow
263  read(11) cc
264  if(ctc .lt. maxp) then
265  ctc = ctc + 1
266  call movetrack(cc, ct(ctc) )
267  else
268  call cerrormsg(
269  * 'too many particles in skeleton',1)
270  call cerrormsg(
271  * 'Enlarge Maxp in Zprivate2.h', 0)
272  endif
273  enddo
274  enddo
275 
276  write(msg,*)
277  * '# of total ptcls at flesh=',ctc
278  call cerrormsg(msg, 1)
279 
280 ! 1 event data is ready now in oo and ct.
281 ! distribute particles to ncpu
282 ! first sort ct by energy
283 !///////////
284  write(0,*) ' sort by energy starts'
285  call sortbyerg
286  write(0,*) ' sort by energy ended'
287 !/////////////////
288 ! deploy particles to Ncpu so that
289 ! sum energy on each cpu is roughly the same
290  if(ctc .lt. ncpu) then
291  n = ctc
292  write(msg, *) '# of ptcls < Ncpu'
293  call cerrormsg(msg, 1)
294  else
295  n = ncpu
296  endif
297  write(0,*) ' distribute particles to', n, ' cpus'
298  call distribute( n )
299 
300  write(0,*) ' starts to write sub skeletons'
301  call memoforcpu( n )
302 
303  call issuemsg( ncpu )
304  enddo
305 
306  100 continue
307  call cerrormsg('all events have been smashed',1)
308 ! do i = 1, Ncpu
309 ! close(basefn+i)
310 ! enddo
311 
312  end
313 ! ----------------------------
314  subroutine distribute( n )
315  implicit none
316 #include "Ztrack.h"
317  include "../../SkelFlesh/Zprivate.h"
318  include "Zprivate2.h"
319  integer i, k
320  integer n, j
321 
322  do i = 1, ncpu
323  sumergi(i)= 0.
324  sumergw(i) = 0.
325  noncpu(i) = 0
326  enddo
327  do i = 1, n
328 ! max energy ptcl for i-th cpu
329  sumergi(i) = erg(idx(i))
330  sumergw(i) = erg(idx(i)) / cpupw(i)
331  noncpu(i) = 1
332  idxlist(1, i) = idx(i)
333  idxlocal(i) = i
334  enddo
335 ! if all cpupw =1, next two not needed
336  call kqsortd(sumergw, idxlocal, n)
337  call ksortinv(idxlocal, n)
338 
339 !///////////
340 ! write(0,*) ' top E=',(sumergi(i), i=1, n)
341 ! write(0,*) ' idx=',(idx(i), i=1, n)
342 !////////
343 ! next explanation is for cpupw = 1
344 ! erg idx sumergi idxlocal nOnCpu idxlist
345 ! 1,1
346 ! 1 9 5 30 1 1 5
347 ! 2 1 3 18 2 1 3
348 ! n 3 18 7 15 3 1 7
349 ! 4 5 8
350 ! 5 30 1
351 ! 6 4 4
352 ! 7 15
353 ! 8 13
354 ! .
355 ! .
356 ! . 6
357 ! ctc . 2
358 !
359 ! after j= 4
360 ! sumergi idxlocal nOnCpu idxlist
361 ! 1 2
362 ! 30 1 1 5
363 ! 18 2 1 3
364 ! 28 3 2 7 8
365 ! after j=5
366 ! sumergi idxlocal nOnCpu idxlist
367 ! 1 2
368 ! 30 1 1 5
369 ! 27 3 2 3 1
370 ! 28 2 2 7 8
371 ! after j=6
372 ! sumergi idxlocal nOnCpu idxlist
373 ! 1 2 3
374 ! 30 1 1 5
375 ! 32 3 3 3 1 4
376 ! 28 2 2 7 8
377 !
378  do j = n+1, ctc
379  if(n .ge. 2) then
380  if( sumergw( idxlocal(n) ) .gt.
381  * sumergw( idxlocal(n-1) ) ) then
382  call kqsortd(sumergw, idxlocal, n)
383  call ksortinv(idxlocal, n)
384  endif
385  endif
386  k = idxlocal(n)
387  noncpu( k ) = noncpu( k ) + 1
388  if( noncpu( k ) .gt. maxptclpercpu ) then
389  write(msg, *)
390  * '# of ptcls on a cpu', k, ' exceeded limit=',
391  * maxptclpercpu
392  call cerrormsg(msg, 1)
393  call cerrormsg('Enlarge MaxPtclPerCpu in Zprivate2.h',0)
394  endif
395  idxlist( noncpu(k), k ) = idx(j)
396  sumergw(k) = sumergw(k) + erg(idx(j))/cpupw(k)
397  sumergi(k) = sumergi(k) + erg(idx(j))
398  enddo
399 
400  end
401 ! *************************
402  subroutine memoforcpu( n )
403  implicit none
404 #include "Ztrack.h"
405  include "../../SkelFlesh/Zprivate.h"
406  include "Zprivate2.h"
407 
408  integer n
409  integer navob, navobc, navobx
410  integer i, j, icon
411  real avob, resob
412  real*8 u
413  integer cpuc
414  type(track)::Zfirst ! name is some reason
415 
416 ! we distribute Np observed ptcls (at skeleton making time)
417 ! almost equally to Mcpu cpu (not to Margin);
418 ! If some hosts fails, observed ones will be lost since
419 ! hosts of Margin have no observed ptcls. This may not have
420 ! any dangour since, observed ptcls will be only at the core
421 ! region and we don't need such region for detector simulation
422 ! number of average ptcls
423 
424  avob = np
425  avob = avob/mcpu
426 ! navobx = max(Np/Ncpu, 1)
427  navobx = np/mcpu
428 ! if( Np .eq. 0 ) navobx = 0
429 
430  resob = avob-navobx ! 0<= resob< 1
431 
432  navobc = 0
433 !/////////////////
434  write(0,*) ' navobx=', navobx, ' resob=',resob
435 !///////////
436  cpuc = 0
437  do i = 1, ncpu
438  if(numba(i) .lt. 0 ) then
439  cpuc = cpuc + 1
440  navob = navobx
441  call rndc(u)
442  if( u .lt. resob) then
443  navob = navobx + 1
444  endif
445  if(navobc+navob .gt. np .or. cpuc .eq. mcpu ) then
446  navob = np - navobc
447  endif
448 #if defined (AVOIDFOOL)
449  open(basefn+i, file=skelfile(i), position="append",
450 #else
451  open(basefn+i, file=skelfile(i), access="append",
452 #endif
453  * form="unformatted", iostat=icon)
454  if(icon .eq. 0) then
455 !/////////////
456  write(0,*) ' cpu ',i, ' cpuc=',cpuc, ' obs=',navob
457 !//////////////
458  write(basefn+i) navob
459 !
460 
461  do j = navobc +1, navobc+navob
462  write(basefn+i) oo(j)
463  enddo
464  navobc = navobc + navob
465  else
466  write(0,*) ' skelfile=', skelfile(i), " cannot be opened"
467  stop 11111
468  endif
469 
470 ! *** enddo
471 ! *** do i = 1, Ncpu
472 !cc if(i .eq. 1) then
473 ! for the first skeleton, put observed ptcls
474 !c write(basefn+i) Np
475 !c do j = 1, Np
476 !c write(basefn+1) oo(j)
477 !c enddo
478 !c else
479 !c write(basefn+i) 0
480 !c endif
481 !////////////////
482  write(0,*)' i=', i, ' nOnCpu(i)=',noncpu(i)
483 ! j = 1
484 ! write(0,*)'j=1 code=',ct( idxlist(j, i)).p.code,
485 ! * ' where=', ct( idxlist(j, i)).where
486 !///////////////////
487  write(basefn+i) noncpu(i)
488  do j = 1, noncpu(i)
489 #if defined (AVOIDFOOL)
490  zfirst = ct( idxlist(j, i) )
491  write(basefn+i)
492 #include "ZavoidUnionMap.h"
493 #else
494  write(basefn+i) ct( idxlist(j, i) )
495 #endif
496  enddo
497 
498  close(basefn+i)
499  endif
500  enddo
501  end
502  subroutine issuemsg( n )
503  implicit none
504 #include "Ztrack.h"
505  include "../../SkelFlesh/Zprivate.h"
506  include "Zprivate2.h"
507 
508  integer n
509  integer i
510 
511  msg = ' cpu# cpuPW Sum E # of ptcls'
512 ! msg = 'cpu# Sum E # of ptcls'
513  call cerrormsg(msg, 1)
514  do i = 1, n
515  write(msg,'(i6, f7.1, g16.7, i9)')
516 ! write(msg,'(i3, g16.7, i9)')
517  * numba(i), cpupw(i), sumergi(i), noncpu(i)
518 ! * i, sumergi(i), nOnCpu(i)
519  call cerrormsg(msg, 1)
520  enddo
521  end
522 
523 
524  subroutine sortbyerg
525  implicit none
526 #include "Ztrack.h"
527  include "../../SkelFlesh/Zprivate.h"
528  include "Zprivate2.h"
529 
530  integer i
531 
532  averg = 0.
533  do i = 1, ctc
534  erg(i) = ct(i).p.fm.p(4)
535  averg = averg + erg(i)
536  enddo
537  call kqsortd(erg, idx, ctc)
538 ! high to low
539  call ksortinv(idx, ctc)
540  if(ctc .gt. 0.) then
541 ! average total energy on 1 cpu
542  averg = averg/ctc * ncpu
543  else
544  call cerrormsg('no child',1)
545  return
546  endif
547  if( erg(idx(ctc) ) .gt. averg*1.1 ) then
548 ! max energy is too large. issue
549 ! warning
550  write(msg,*) 'WARGNING: max E=', erg(idx(i)),
551  * ' is > average total energy for 1 cpu=',
552  * averg
553  call cerrormsg(msg, 1)
554  endif
555  end
556 
557 
558 
559  subroutine movetrack(f, t)
560  implicit none
561 #include "Ztrack.h"
562 #include "Zearth.h"
563  include "../../SkelFlesh/Zprivate.h"
564  include "Zprivate2.h"
565 
566  type(child):: f
567  type(track):: t
568 
569  t.p.code = f.code
570  t.p.subcode = f.subcode
571  t.p.charge = f.charge
572  t.p.fm.p(1) = f.fm(1)
573  t.p.fm.p(2) = f.fm(2)
574  t.p.fm.p(3) = f.fm(3)
575  t.p.fm.p(4) = f.fm(4)
576  t.p.mass = f.mass
577  t.pos.xyz.r(1) = pp.posx
578  t.pos.xyz.r(2) = pp.posy
579  t.pos.xyz.r(3) = pp.posz
580 
581  t.pos.depth = pp.depth
582  t.pos.height = pp.height
583  t.pos.colheight = pp.colheight
584  t.t = pp.atime
585  t.where = pp.where
586  t.pos.radiallen =
587  * eradius + pp.height
588  t.pos.xyz.sys = 'xyz'
589  t.vec.w.sys = 'xyz'
590  t.wgt = 1.0
591  t.asflag = 0
592 ! t.user = pp.user
593  call cresetdirec( t )
594  end
595 
596 
subroutine ksplit(a, m, n, b, nr)
Definition: ksplit.f:2
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz *Zfirst pos *Zfirst pos depth
Definition: ZavoidUnionMap.h:1
subroutine cerrormsg(msg, needrtn)
Definition: cerrorMsg.f:4
subroutine issuemsg(n)
Definition: smashSkel.f:503
integer function kgetenv2(envname, envresult)
Definition: cgetLoginN.f:77
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz *Zfirst pos *Zfirst pos Zfirst pos *Zfirst pos colheight
Definition: ZavoidUnionMap.h:1
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz r
Definition: ZavoidUnionMap.h:1
nodes i
subroutine movetrack(f, t)
Definition: smashSkel.f:560
latitude latitude this system is used *****************************************************************! type coord sequence union map real z z in m endmap xyz map real ! latitude in deg is to the north ! longitude in deg is to the east *h ! height in m endmap llh map real ! polar angle ! azimuthal angle *radius ! radial distance endmap sph endunion character *sys ! which system xyz
Definition: Zcoord.h:25
Definition: Ztrack.h:44
block data cblkElemag data *AnihiE ! Eposi< 1 TeV, anihilation considered *X0/365.667/, ! radiation length of air in kg/m2 *Ecrit/81.e-3/, ! critical energy of air in GeV *MaxComptonE/1./, ! compton is considered below 1 GeV *MaxPhotoE/1.e-3/, ! above this, PhotoElectric effect neg. *MinPhotoProdE/153.e-3/, ! below 153 MeV, no gp --> hadrons ! scattering const not MeV *Knockon true
Definition: cblkElemag.h:7
averg real * sumergi(MaxCPU)
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz sys
Definition: ZavoidUnionMap.h:1
subroutine rndc(u)
Definition: rnd.f:91
averg real MaxCPU integer idx(Maxp)
subroutine cresetdirec(aTrack)
Definition: cresetDirec.f:5
********************block data cblkHeavy ********************integer j data *HeavyG2symbol p
Definition: cblkHeavy.h:7
subroutine copenfw2(io, fnin, form, icon)
Definition: copenf.f:205
subroutine kqsortd(A, ORD, N)
Definition: kqsortd.f:23
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz *Zfirst pos *Zfirst pos Zfirst pos *Zfirst pos *Zfirst Zfirst vec w *Zfirst vec w Zfirst vec *Zfirst Zfirst Zfirst asflag
Definition: ZavoidUnionMap.h:1
*Zfirst p fm *Zfirst p Zfirst p code
Definition: ZavoidUnionMap.h:1
subroutine ksortinv(idx, n)
Definition: ksortinv.f:2
averg real sumergw(MaxCPU)
subroutine distribute(n)
Definition: smashSkel.f:315
subroutine copenf(io, fnin, icon)
Definition: copenf.f:8
subroutine sortbyerg
Definition: smashSkel.f:525
averg real MaxCPU integer idxlocal(MaxCPU) integer numba(MaxCPU) integer ctc
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz *Zfirst pos *Zfirst pos Zfirst pos height
Definition: ZavoidUnionMap.h:1
float erg[maxp]
Definition: Zprivate.h:7
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p charge
Definition: ZavoidUnionMap.h:1
integer function klena(cha)
Definition: klena.f:20
Definition: Zprivate.h:25
Definition: Zpos.h:16
!onst int maxp
Definition: Zprivate.h:3
*Zfirst p fm *Zfirst p mass
Definition: ZavoidUnionMap.h:1
averg real cpupw(MaxCPU) integer nOnCpu(MaxCPU) integer idxlist(MaxPtclPerCpu
subroutine memoforcpu(n)
Definition: smashSkel.f:403
integer n
Definition: Zcinippxc.h:1
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz *Zfirst pos *Zfirst pos Zfirst pos *Zfirst pos *Zfirst Zfirst vec w *Zfirst vec w Zfirst vec *Zfirst wgt
Definition: ZavoidUnionMap.h:1
*Zfirst p fm *Zfirst p Zfirst p Zfirst p subcode
Definition: ZavoidUnionMap.h:1
*Zfirst p fm *Zfirst p Zfirst p Zfirst p *Zfirst p *Zfirst pos xyz Zfirst pos xyz *Zfirst pos radiallen
Definition: ZavoidUnionMap.h:1