yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #12499
[Branch ~yade-pkg/yade/git-trunk] Rev 3769: Update formatting in SpherePack
------------------------------------------------------------
revno: 3769
committer: Anton Gladky <gladky.anton@xxxxxxxxx>
timestamp: Thu 2016-01-07 11:47:37 +0100
message:
Update formatting in SpherePack
Sorry, I cannot read it in a previous form
modified:
pkg/dem/SpherePack.cpp
--
lp:yade
https://code.launchpad.net/~yade-pkg/yade/git-trunk
Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-pkg/yade/git-trunk/+edit-subscription
=== modified file 'pkg/dem/SpherePack.cpp'
--- pkg/dem/SpherePack.cpp 2014-10-15 06:44:01 +0000
+++ pkg/dem/SpherePack.cpp 2016-01-07 10:47:37 +0000
@@ -89,9 +89,8 @@
static boost::variate_generator<boost::minstd_rand&, boost::uniform_real<Real> > rnd(randGen, boost::uniform_real<Real>(0,1));
vector<Real> psdRadii; // holds plain radii (rather than diameters), scaled down in some situations to get the target number
vector<Real> psdCumm2; // psdCumm but dimensionally transformed to match mass distribution
- Vector3r size;
+ Vector3r size=mx-mn;
bool hSizeFound =(hSize!=Matrix3r::Zero());//is hSize passed to the function?
- size=mx-mn;
if (!hSizeFound) {hSize=size.asDiagonal();}
if (hSizeFound && !periodic) LOG_WARN("hSize can be defined only for periodic cells.");
Real volume=hSize.determinant();
@@ -176,41 +175,81 @@
r=psdRadii[piece]+norm*(psdRadii[piece+1]-psdRadii[piece]);}
}
// try to put the sphere into a free spot
- for(t=0; t<maxTry; ++t){
- Vector3r c;
- if(!periodic) { for(int axis=0; axis<3; axis++) c[axis]=mn[axis]+(size[axis]?(size[axis]-2*r)*rnd()+r:0);}//we handle 2D with the special case size[axis]==0
- else { for(int axis=0; axis<3; axis++) c[axis]=rnd();//coordinates in [0,1]
- c=mn+hSize*c;}//coordinates in reference frame (inside the base cell)
- size_t packSize=pack.size(); bool overlap=false;
- if(!periodic) for(size_t j=0;j<packSize;j++) {if(pow(pack[j].r+r,2)>=(pack[j].c-c).squaredNorm()) {overlap=true; break;}}
- else {
- for(size_t j=0; j<packSize; j++){
+ for(t=0; t<maxTry; ++t) {
+ Vector3r c = Vector3r::Zero();
+ if(!periodic) {
+ //we handle 2D with the special case size[axis]==0
+ for(int axis=0; axis<3; axis++) {
+ c[axis]=mn[axis]+(size[axis]?(size[axis]-2*r)*rnd()+r:0);
+ }
+ } else {
+ for(int axis=0; axis<3; axis++) {
+ c[axis]=rnd();//coordinates in [0,1]
+ }
+ c=mn + hSize*c; //coordinates in reference frame (inside the base cell)
+ }
+
+ size_t packSize=pack.size();
+ bool overlap=false;
+ if(!periodic) {
+ for(size_t j=0;j<packSize;j++) {
+ if(pow(pack[j].r+r,2)>=(pack[j].c-c).squaredNorm()) {
+ overlap=true;
+ break;
+ }
+ }
+ } else {
+ for(size_t j=0; j<packSize; j++) {
Vector3r dr=Vector3r::Zero();
if (!hSizeFound) {//The box is axis-aligned, use the wrap methods
- for(int axis=0; axis<3; axis++) dr[axis]=size[axis]? min(cellWrapRel(c[axis],pack[j].c[axis],pack[j].c[axis]+size[axis]),cellWrapRel(pack[j].c[axis],c[axis],c[axis]+size[axis])) : 0;
+ for(int axis=0; axis<3; axis++) {
+ if (size[axis]) {
+ dr[axis]=min(cellWrapRel(c[axis],pack[j].c[axis],pack[j].c[axis]+size[axis]),
+ cellWrapRel(pack[j].c[axis],c[axis],c[axis]+size[axis]));
+ } else {
+ dr[axis]=0;
+ }
+ }
} else {//not aligned, find closest neighbor in a cube of size 1, then transform distance to cartesian coordinates
Vector3r c1c2=invHsize*(pack[j].c-c);
- for(int axis=0; axis<3; axis++){
+ for(int axis=0; axis<3; axis++) {
if (std::abs(c1c2[axis])<std::abs(c1c2[axis] - Mathr::Sign(c1c2[axis]))) dr[axis]=c1c2[axis];
- else dr[axis] = c1c2[axis] - Mathr::Sign(c1c2[axis]);}
+ else dr[axis] = c1c2[axis] - Mathr::Sign(c1c2[axis]);
+ }
dr=hSize*dr;//now in cartesian coordinates
}
- if(pow(pack[j].r+r,2)>= dr.squaredNorm()){ overlap=true; break; }
+ if(pow(pack[j].r+r,2) >= dr.squaredNorm()) {
+ overlap=true;
+ break;
+ }
}
}
- if(!overlap) { pack.push_back(Sph(c,r)); break; }
+ if(!overlap) {
+ pack.push_back(Sph(c,r));
+ break;
+ }
}
if (t==maxTry) {
if(num>0) {
if (mode!=RDIST_RMEAN) {
- //if rMean is not imposed, then we call makeCloud recursively, scaling the PSD down until the target num is obtained
+ //if rMean is not imposed, then we call makeCloud recursively,
+ //scaling the PSD down until the target num is obtained
Real nextPoro = porosity+(1-porosity)/10.;
- LOG_WARN("Exceeded "<<maxTry<<" tries to insert non-overlapping sphere to packing. Only "<<i<<" spheres were added, although you requested "<<num<<". Trying again with porosity "<<nextPoro<<". The size distribution is being scaled down");
+ LOG_WARN("Exceeded "<<maxTry
+ <<" tries to insert non-overlapping sphere to packing. Only "
+ <<i<<" spheres were added, although you requested "<<num
+ <<". Trying again with porosity "<<nextPoro
+ <<". The size distribution is being scaled down");
pack.clear();
- return makeCloud(mn, mx, -1., rRelFuzz, num, periodic, nextPoro, psdSizes, psdCumm, distributeMass,seed,hSizeFound?hSize:Matrix3r::Zero());}
- else LOG_WARN("Exceeded "<<maxTry<<" tries to insert non-overlapping sphere to packing. Only "<<i<<" spheres were added, although you requested "<<num<<".");
+ return makeCloud(mn, mx, -1., rRelFuzz, num, periodic, nextPoro,
+ psdSizes, psdCumm, distributeMass,seed,hSizeFound?hSize:Matrix3r::Zero());
+ } else {
+ LOG_WARN("Exceeded "<<maxTry<<" tries to insert non-overlapping sphere to packing. Only "
+ <<i<<" spheres were added, although you requested "<<num<<".");
+ }
}
- return i;}
+ return i;
+ }
}
if (appliedPsdScaling<1) LOG_WARN("The size distribution has been scaled down by a factor pack.appliedPsdScaling="<<appliedPsdScaling);
return pack.size();