yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #12585
[Branch ~yade-pkg/yade/git-trunk] Rev 3819: Non-invasive fixes in polyhedra_splitter.
------------------------------------------------------------
revno: 3819
committer: Anton Gladky <gladky.anton@xxxxxxxxx>
timestamp: Thu 2016-03-24 23:08:26 +0100
message:
Non-invasive fixes in polyhedra_splitter.
modified:
pkg/dem/Polyhedra_splitter.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/Polyhedra_splitter.cpp'
--- pkg/dem/Polyhedra_splitter.cpp 2016-03-24 22:08:26 +0000
+++ pkg/dem/Polyhedra_splitter.cpp 2016-03-24 22:08:26 +0000
@@ -13,26 +13,25 @@
void getStressForEachBody(vector<Matrix3r>& bStresses){
const shared_ptr<Scene>& scene=Omega::instance().getScene();
- bStresses.resize(scene->bodies->size());
- for (size_t k=0;k<scene->bodies->size();k++) bStresses[k]=Matrix3r::Zero();
FOREACH(const shared_ptr<Interaction>& I, *scene->interactions){
if(!I->isReal()) continue;
PolyhedraGeom* geom=YADE_CAST<PolyhedraGeom*>(I->geom.get());
PolyhedraPhys* phys=YADE_CAST<PolyhedraPhys*>(I->phys.get());
if(!geom || !phys) continue;
Vector3r f=phys->normalForce+phys->shearForce;
- //Sum f_i*l_j for each contact of each particle
- bStresses[I->getId1()] -=f*((geom->contactPoint-Body::byId(I->getId1(),scene)->state->pos).transpose());
- bStresses[I->getId2()] +=f*((geom->contactPoint-Body::byId(I->getId2(),scene)->state->pos).transpose());
+ //Sum f_i*l_j for each contact of each particle
+ const auto cP = geom->contactPoint;
+ bStresses[I->getId1()] -=f*((cP-Body::byId(I->getId1(),scene)->state->pos).transpose());
+ bStresses[I->getId2()] +=f*((cP-Body::byId(I->getId2(),scene)->state->pos).transpose());
}
}
//*********************************************************************************
/* Size dependent strength */
-double PolyhedraSplitter::getStrength(const double & volume, const double & strength) const{
+Real PolyhedraSplitter::getStrength(const Real & volume, const Real & strength) const {
//equvalent radius
- const double r_eq = pow(volume*3./4./Mathr::PI,1./3.);
+ const Real r_eq = pow(volume*3./4./Mathr::PI,1./3.);
//r should be in milimeters
return strength/(r_eq/1000.);
}
@@ -60,7 +59,6 @@
shared_ptr<Body> B4 = SplitPolyhedra(body, direction2, point);
}
-
//*********************************************************************************
/* Split if stress exceed strength */
@@ -71,9 +69,9 @@
vector<shared_ptr<Body> > bodies;
vector<Vector3r > directions1, directions2;
- vector<double > sigmas;
+ vector<Real > sigmas;
- vector<Matrix3r> bStresses;
+ vector<Matrix3r> bStresses (scene->bodies->size(), Matrix3r::Zero());
getStressForEachBody(bStresses);
FOREACH(const shared_ptr<Body>& b, *rb->bodies){
@@ -97,14 +95,12 @@
if (I_valu(max_i,max_i) < I_valu(2,2)) max_i = 2;
//division of stress by volume
- // double comp_stress = I_valu(min_i,min_i)/p->GetVolume();
- // double tens_stress = I_valu(max_i,max_i)/p->GetVolume();
const Vector3r dirC = I_vect.col(max_i);
const Vector3r dirT = I_vect.col(min_i);
const Vector3r dir1 = dirC.normalized() + dirT.normalized();
const Vector3r dir2 = dirC.normalized() - dirT.normalized();
//double sigma_t = -comp_stress/2.+ tens_stress;
- const double sigma_t = pow((pow(I_valu(0,0)-I_valu(1,1),2)+pow(I_valu(0,0)-I_valu(2,2),2)+pow(I_valu(1,1)-I_valu(2,2),2))/2.,0.5)/p->GetVolume();
+ const Real sigma_t = pow((pow(I_valu(0,0)-I_valu(1,1),2)+pow(I_valu(0,0)-I_valu(2,2),2)+pow(I_valu(1,1)-I_valu(2,2),2))/2.,0.5)/p->GetVolume();
if (sigma_t > getStrength(p->GetVolume(),m->GetStrength())) {
bodies.push_back(b);
directions1.push_back(dir1.normalized());