61   : fBoundingBox(
"TessBBox", 1, 1, 1)
 
   84   const vector<G4int> empty(0);
 
   87   unsigned int size = 
max[0] * 
max[1] * 
max[2];
 
   93   for (xyz[2] = 0; xyz[2] < max[2]; ++xyz[2])
 
   95     for (xyz[1] = 0; xyz[1] < max[1]; ++xyz[1])
 
   97       for (xyz[0] = 0; xyz[0] < max[0]; ++xyz[0])
 
  109           c.reserve(candidates.size());
 
  110           c.assign(candidates.begin(), candidates.end());
 
  128   if (
G4int numNodes = facets.size()) 
 
  136     for (
G4int i = 0; i < numNodes; ++i)
 
  144       min -= toleranceVector; max += toleranceVector;
 
  147       fBoxes[i].pos = min + hlen;
 
  160   for(
G4int i = 0; i < numNodes; ++i)
 
  162     G4cout << setw(10) << setiosflags(ios::fixed) <<
 
  163       "    -> Node " << i+1 <<  
":\n" << 
 
  164       "\t * [x,y,z] = " << 
fBoxes[i].hlen <<
 
  165       "\t * [x,y,z] = " << 
fBoxes[i].pos << 
"\n";
 
  167   G4cout.precision(oldprec);
 
  182   for(
G4int i = 0 ; i < numNodes; ++i)   
 
  192     G4cout << 
"Boundary " << p - d << 
" - " << p + d << 
G4endl;
 
  194     boundary[2*i] = p - d;
 
  195     boundary[2*i+1] = p + d;
 
  197   sort(boundary.begin(), boundary.end());
 
  218     vector<G4double> sortedBoundary(2*numNodes);
 
  222     for (
G4int j = 0; j <= 2; ++j)
 
  230       for(
G4int i = 0 ; i < 2*numNodes; ++i)
 
  232         G4double newBoundary = sortedBoundary[i];
 
  234         if (j == 0) 
G4cout << 
"Examining " << newBoundary << 
"..." << 
G4endl;
 
  236         G4int size = boundary.size();
 
  237         if(!size || abs(boundary[size-1] - newBoundary) > tolerance)
 
  242             if (j == 0) 
G4cout << 
"Adding boundary " << newBoundary << 
"..." 
  245             boundary.push_back(newBoundary);
 
  253       G4int n = boundary.size();
 
  257         G4int skip = n / (max /2); 
 
  259         vector<G4double> reduced;
 
  260         for (
G4int i = 0; i < 
n; i++)
 
  263           G4int size = boundary.size();
 
  264           if (i % skip == 0 || i == 0 || i == size - 1)
 
  271             reduced.push_back(boundary[i]);
 
  283   char axis[3] = {
'X', 
'Y', 
'Z'};
 
  284   for (
G4int i = 0; i <= 2; ++i)
 
  286     G4cout << 
" * " << axis[i] << 
" axis:" << 
G4endl << 
"    | ";
 
  296   G4int count = boundaries.size();
 
  298   for(
G4int i = 0; i < count; ++i)
 
  300     G4cout << setw(10) << setiosflags(ios::fixed) << boundaries[i];
 
  301     if(i != count-1) 
G4cout << 
"-> ";
 
  304   G4cout.precision(oldprec);
 
  317   for (
G4int k = 0; k < 3; k++)
 
  320     vector<G4double> &boundary = boundaries[k];
 
  321     G4int voxelsCount = boundary.size() - 1;
 
  330       bitmask.
SetBitNumber(voxelsCount*bitsPerSlice-1, 
false);
 
  335     candidatesCount.resize(voxelsCount);
 
  337     for(
G4int i = 0 ; i < voxelsCount; ++i) { candidatesCount[i] = 0; }
 
  341     for(
G4int j = 0 ; j < numNodes; j++)
 
  352       if (i < 0)  { i = 0; }
 
  358           G4int index = i*bitsPerSlice+j;
 
  361         candidatesCount[i]++;
 
  365       while (max > boundary[i] && i < voxelsCount);
 
  381   for(
G4int i=0; i<numNodes; ++i)
 
  393   char axis[3] = {
'X', 
'Y', 
'Z'};
 
  397   for (
G4int j = 0; j <= 2; ++j)
 
  401     for(
G4int i=0; i < count-1; ++i)
 
  418   for (
G4int i = 0; i <= 2; ++i)
 
  451   if (maxVoxels > 0 && maxVoxels < maxTotal)
 
  454     ratio = pow(ratio, 1./3.);
 
  455     if (ratio > 1)  { ratio = 1; }
 
  456     reductionRatio.set(ratio,ratio,ratio);
 
  464   for (
G4int k = 0; k <= 2; ++k)
 
  468     vector<G4VoxelInfo> voxels(max);
 
  470     set<G4int, G4VoxelComparator> voxelSet(comp);
 
  471     vector<G4int> mergings;
 
  476       voxel.
count = candidatesCount[j];
 
  482     for (
G4int j = 0; j < max - 1; ++j)  { voxelSet.insert(j); }
 
  488       G4double reduction = reductionRatio[k];
 
  491       G4int currentCount = voxelSet.size();
 
  492       if (currentCount <= 2)
 
  495       if (currentRatio <= reduction && currentCount <= 1000)
 
  497       const G4int pos = *voxelSet.begin();
 
  498       mergings.push_back(pos);
 
  504       if (voxel.
next != max - 1) { voxelSet.erase(voxel.
next); }
 
  511       if (voxel.
next != max - 1)
 
  512         voxelSet.insert(voxel.
next);
 
  524       sort(mergings.begin(), mergings.end());
 
  526       vector<G4double> &boundary = boundaries[k];
 
  527       vector<G4double> reducedBoundary(boundary.size() - mergings.size());
 
  528       G4int skip = mergings[0] + 1, cur = 0, i = 0;
 
  529       max = boundary.size();
 
  534           reducedBoundary[cur++] = boundary[j];
 
  538           if (++i < (
G4int)mergings.size())  { skip = mergings[i] + 1; }
 
  541       boundaries[k] = reducedBoundary;
 
  550   for (
G4int k = 0; k <= 2; ++k)
 
  555     for (
G4int i = 0; i < 
max; i++) total += candidatesCount[i];
 
  557     G4double reduction = reductionRatio[k];
 
  561     G4int destination = (
G4int) (reduction * max) + 1;
 
  562     if (destination > 1000) destination = 1000;
 
  563     if (destination < 2) destination = 2;
 
  566     vector<G4int> mergings;
 
  568     vector<G4double> &boundary = boundaries[k];
 
  569     vector<G4double> reducedBoundary(destination);
 
  571     G4int sum = 0, cur = 0;
 
  574       sum += candidatesCount[i];
 
  575       if (sum > average * (cur + 1) || i == 0)
 
  578         reducedBoundary[cur] = val;
 
  580         if (cur == destination)
 
  584     reducedBoundary[destination-1] = boundary[
max];
 
  585     boundaries[k] = reducedBoundary;
 
  593   vector<G4int> voxel(3), maxVoxels(3);
 
  594   for (
G4int i = 0; i <= 2; ++i) maxVoxels[i] = boundaries[i].size();
 
  597   for (voxel[2] = 0; voxel[2] < maxVoxels[2] - 1; ++voxel[2])
 
  599     for (voxel[1] = 0; voxel[1] < maxVoxels[1] - 1; ++voxel[1])
 
  601       for (voxel[0] = 0; voxel[0] < maxVoxels[0] - 1; ++voxel[0])
 
  603         vector<G4int> candidates;
 
  608           for (
G4int i = 0; i <= 2; ++i)
 
  610             G4int index = voxel[i];
 
  611             const vector<G4double> &boundary = boundaries[i];
 
  612             G4double hlen = 0.5 * (boundary[index+1] - boundary[index]);
 
  614             box.
pos[i] = boundary[index] + hlen;
 
  617           vector<G4int>(candidates).swap(candidates);
 
  631   G4int size = facets.size();
 
  634     for (
G4int i = 0; i < (
G4int) facets.size(); i++)
 
  636       if (facets[i]->GetNumberOfVertices() > 3) size++;
 
  640   if ((size >= 10 || maxVoxels > 0) && maxVoxels != 0 && maxVoxels != 1)
 
  679     G4cout << 
"Total number of voxels after reduction: " 
  695     vector<G4double> miniBoundaries[3];
 
  715     G4cout << 
"Total number of mini voxels: " << total << 
G4endl;
 
  743     G4cout << 
"Deallocating unnecessary fields during runtime..." << 
G4endl;
 
  748     for (
G4int i = 0; i < 3; i++)
 
  763   G4cout << 
"   Candidates in voxel [" << voxels[0] << 
" ; " << voxels[1]
 
  764          << 
" ; " << voxels[2] << 
"]: ";
 
  765   vector<G4int> candidates;
 
  768   for (
G4int i = 0; i < count; ++i) 
G4cout << candidates[i];
 
  774                                          std::vector<G4int> &list, 
G4int i)
 
  776   for (
G4int byte = 0; byte < (
G4int) (
sizeof(
unsigned int)); byte++)
 
  778     if (
G4int maskByte = mask & 0xFF)
 
  780       for (
G4int bit = 0; bit < 8; bit++)
 
  783           { list.push_back(8*(
sizeof(
unsigned int)*i+ byte) + bit); }
 
  784         if (!(maskByte >>= 1)) 
break;
 
  793                           std::vector<G4int> &list, 
G4SurfBits *crossed)
 const 
  799   for (
G4int i = 0; i <= 2; ++i)
 
  816       if (!(mask = ((
unsigned int *) 
fBitmasks[0].fAllBits)[slice]
 
  819       if (!(mask &= ((
unsigned int *) 
fBitmasks[1].fAllBits)[slice]
 
  822       if (!(mask &= ((
unsigned int *) 
fBitmasks[2].fAllBits)[slice]
 
  824       if (crossed && (!(mask &= ~((
unsigned int *)crossed->
fAllBits)[0])))
 
  831       unsigned int *masks[3], 
mask; 
 
  832       for (
G4int i = 0; i <= 2; ++i)
 
  837       unsigned int *maskCrossed =
 
  838         crossed ? (
unsigned int *)crossed->
fAllBits : 0;
 
  845         if (!(mask = masks[0][i])) 
continue;
 
  846         if (!(mask &= masks[1][i])) 
continue;
 
  847         if (!(mask &= masks[2][i])) 
continue;
 
  848         if (maskCrossed && !(mask &= ~maskCrossed[i])) 
continue;
 
  861                                                   std::vector<G4int> &list,
 
  876       if (!(mask = ((
unsigned int *) bitmasks[0].fAllBits)[voxels[0]]
 
  878       if (!(mask &= ((
unsigned int *) bitmasks[1].fAllBits)[voxels[1]]
 
  880       if (!(mask &= ((
unsigned int *) bitmasks[2].fAllBits)[voxels[2]]
 
  882       if (crossed && (!(mask &= ~((
unsigned int *)crossed->
fAllBits)[0])))
 
  889       unsigned int *masks[3], 
mask; 
 
  890       for (
G4int i = 0; i <= 2; ++i)
 
  892         masks[i] = ((
unsigned int *) bitmasks[i].fAllBits)
 
  895       unsigned int *maskCrossed =
 
  896         crossed ? (
unsigned int *)crossed->
fAllBits : 0;
 
  903         if (!(mask = masks[0][i])) 
continue;
 
  904         if (!(mask &= masks[1][i])) 
continue;
 
  905         if (!(mask &= masks[2][i])) 
continue;
 
  906         if (maskCrossed && !(mask &= ~maskCrossed[i])) 
continue;
 
  918                           std::vector<G4int> &list, 
G4SurfBits *crossed)
 const 
  928   for (
G4int i = 0; i < 3; ++i)
 
  965   safe = safx = -f.x() + std::abs(aPoint.x());
 
  966   safy = -f.y() + std::abs(aPoint.y());
 
  967   if ( safy > safe ) safe = safy;
 
  968   safz = -f.z() + std::abs(aPoint.z());
 
  969   if ( safz > safe ) safe = safz;
 
  970   if (safe < 0.0) 
return 0.0; 
 
  974   if ( safx > 0 ) { safsq += safx*safx; count++; }
 
  975   if ( safy > 0 ) { safsq += safy*safy; count++; }
 
  976   if ( safz > 0 ) { safsq += safz*safz; count++; }
 
  977   if (count == 1) 
return safe;
 
  978   return std::sqrt(safsq);
 
  985                                    const std::vector<G4int> &curVoxel)
 const 
  989   for (
G4int i = 0; i <= 2; ++i)
 
  994     G4int cur = curVoxel[i];
 
  995     if(direction[i] >= 1e-10)
 
  998         if (++cur >= (
G4int) boundary.size())      
 
 1003       if(direction[i] <= -1e-10) 
 
 1012     G4double dif = boundary[cur] - point[i];
 
 1013     G4double distance = dif / direction[i];
 
 1015     if (shift > distance) 
 
 1026                                              std::vector<G4int> &curVoxel)
 const 
 1028   for (
G4int i = 0; i <= 2; ++i)
 
 1030     G4int index = curVoxel[i];
 
 1031     const vector<G4double> &boundary = 
fBoundaries[i];
 
 1033     if (direction[i] > 0) 
 
 1035       if (point[i] >= boundary[++index]) 
 
 1036         if (++curVoxel[i] >= (
G4int) boundary.size() - 1)
 
 1041       if (point[i] < boundary[index]) 
 
 1042         if (--curVoxel[i] < 0) 
 
 1047     if (curVoxel[i] != indexOK)
 
 1048       curVoxel[i] = indexOK; 
 
 1095   for (
G4int i = 0; i < csize; i++)
 
G4bool Contains(const G4ThreeVector &point) const 
 
void ResetBitNumber(unsigned int bitnumber)
 
G4ThreeVector fBoundingBoxSize
 
void BuildReduceVoxels(std::vector< G4double > fBoundaries[], G4ThreeVector reductionRatio)
 
void DisplayListNodes() const 
 
static const G4double kInfinity
 
G4int GetCandidatesVoxelArray(const G4ThreeVector &point, std::vector< G4int > &list, G4SurfBits *crossed=0) const 
 
std::vector< G4VoxelBox > fVoxelBoxes
 
void Voxelize(std::vector< G4VFacet * > &facets)
 
CLHEP::Hep3Vector G4ThreeVector
 
static void DeRegister(G4VSolid *pSolid)
 
G4ThreeVector fBoundingBoxCenter
 
G4double DistanceToFirst(const G4ThreeVector &point, const G4ThreeVector &direction) const 
 
G4double GetSurfaceTolerance() const 
 
G4double DistanceToBoundingBox(const G4ThreeVector &point) const 
 
std::vector< G4int > fCandidatesCounts[3]
 
void BuildVoxelLimits(std::vector< G4VFacet * > &facets)
 
G4int GetVoxelsIndex(G4int x, G4int y, G4int z) const 
 
static const G4double tolerance
 
G4String GetCandidatesAsString(const G4SurfBits &bits) const 
 
void DisplayVoxelLimits()
 
static G4double MinDistanceToBox(const G4ThreeVector &aPoint, const G4ThreeVector &f)
 
G4bool UpdateCurrentVoxel(const G4ThreeVector &point, const G4ThreeVector &direction, std::vector< G4int > &curVoxel) const 
 
G4int GetBitsPerSlice() const 
 
static G4ThreadLocal G4int fDefaultVoxelsCount
 
void SetBitNumber(unsigned int bitnumber, G4bool value=true)
 
std::map< G4int, std::vector< G4int > > fCandidates
 
static G4int BinarySearch(const std::vector< T > &vec, T value)
 
G4bool TestBitNumber(unsigned int bitnumber) const 
 
void SetReductionRatio(G4int maxVoxels, G4ThreeVector &reductionRatio)
 
G4GLOB_DLL std::ostream G4cout
 
std::vector< std::vector< G4int > > fVoxelBoxesCandidates
 
void CreateMiniVoxels(std::vector< G4double > fBoundaries[], G4SurfBits bitmasks[])
 
void BuildBitmasks(std::vector< G4double > fBoundaries[], G4SurfBits bitmasks[], G4bool countsOnly=false)
 
std::vector< G4VoxelBox > fBoxes
 
G4double DistanceToNext(const G4ThreeVector &point, const G4ThreeVector &direction, const std::vector< G4int > &curVoxel) const 
 
static G4SolidStore * GetInstance()
 
void SetMaxVoxels(G4int max)
 
std::vector< G4double > fBoundaries[3]
 
void ResetAllBits(G4bool value=false)
 
void set(unsigned int nbits, const char *array)
 
static G4int SetDefaultVoxelsCount(G4int count)
 
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const 
 
G4double total(Particle const *const p1, Particle const *const p2)
 
virtual G4double Extent(const G4ThreeVector)=0
 
T max(const T t1, const T t2)
brief Return the largest of the two arguments 
 
G4ThreeVector fReductionRatio
 
static void FindComponentsFastest(unsigned int mask, std::vector< G4int > &list, G4int i)
 
T min(const T t1, const T t2)
brief Return the smallest of the two arguments 
 
void BuildReduceVoxels2(std::vector< G4double > fBoundaries[], G4ThreeVector reductionRatio)
 
void GetCandidatesVoxel(std::vector< G4int > &voxels)
 
void CreateSortedBoundary(std::vector< G4double > &boundaryRaw, G4int axis)
 
long long CountVoxels(std::vector< G4double > boundaries[]) const 
 
static const G4double pos
 
static G4GeometryTolerance * GetInstance()
 
static G4int GetDefaultVoxelsCount()
 
unsigned int GetNbytes() const