Author: eudoxos Date: 2009-05-24 20:47:16 +0200 (Sun, 24 May 2009) New Revision: 1779
Added: trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.cpp trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.hpp Log: 2 forgotten files (separated from UniaxialStrainer before) Added: trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.cpp =================================================================== --- trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.cpp 2009-05-24 18:22:30 UTC (rev 1778) +++ trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.cpp 2009-05-24 18:47:16 UTC (rev 1779) @@ -0,0 +1,127 @@ +// 2008 © Václav Šmilauer <[email protected]> + +#include"UniaxialStrainerGen.hpp" + +#include<yade/pkg-dem/ConcretePM.hpp> + +#include<yade/pkg-common/RigidBodyParameters.hpp> +#include<yade/pkg-common/InteractionPhysicsEngineUnit.hpp> +#include<yade/pkg-common/PhysicalActionContainerReseter.hpp> +#include<yade/pkg-common/BoundingVolumeMetaEngine.hpp> +#include<yade/pkg-common/AABB.hpp> +#include<yade/pkg-common/InteractingSphere2AABB.hpp> +#include<yade/pkg-common/MetaInteractingGeometry.hpp> +#include<yade/pkg-common/MetaInteractingGeometry2AABB.hpp> +#include<yade/pkg-common/InteractionGeometryMetaEngine.hpp> +#include<yade/pkg-common/InteractionPhysicsMetaEngine.hpp> +#include<yade/pkg-common/PhysicalActionApplier.hpp> +#include<yade/pkg-common/PhysicalParametersMetaEngine.hpp> +#include<yade/pkg-common/PersistentSAPCollider.hpp> +#include<yade/pkg-common/ConstitutiveLawDispatcher.hpp> +#include<yade/pkg-dem/NewtonsDampedLaw.hpp> +#include<yade/pkg-dem/BodyMacroParameters.hpp> +#include<yade/pkg-dem/Dem3DofGeom_SphereSphere.hpp> + +CREATE_LOGGER(UniaxialStrainerGen); + +bool UniaxialStrainerGen::generate(){ + message=""; + rootBody=Shop::rootBody(); + //Shop::rootBodyActors(rootBody); + createEngines(); + shared_ptr<UniaxialStrainer> strainer(new UniaxialStrainer); + rootBody->engines.push_back(strainer); // updating params later + strainer->strainRate=strainRate; + strainer->axis=axis; + strainer->limitStrain=limitStrain; + + // load spheres + Vector3r minXYZ,maxXYZ; + typedef vector<pair<Vector3r,Real> > vecVecReal; + + vecVecReal spheres; + if(spheresFile.empty()){ + LOG_INFO("spheresFile empty, loading hardwired Shop::smallSdecXyzData (examples/small.sdec.xyz)."); + spheres=Shop::loadSpheresSmallSdecXyz(minXYZ,maxXYZ); + } + else spheres=Shop::loadSpheresFromFile(spheresFile,minXYZ,maxXYZ); + + + TRVAR2(minXYZ,maxXYZ); + // get spheres that are "close enough" to the strained ends + for(vecVecReal::iterator I=spheres.begin(); I!=spheres.end(); I++){ + Vector3r C=I->first; + Real r=I->second; + shared_ptr<Body> S=Shop::sphere(C,r); + + // replace BodyMacroParameters by CpmMat + shared_ptr<BodyMacroParameters> bmp=YADE_PTR_CAST<BodyMacroParameters>(S->physicalParameters); + shared_ptr<CpmMat> bpp(new CpmMat); + #define _CP(attr) bpp->attr=bmp->attr; + _CP(acceleration); _CP(angularVelocity); _CP(blockedDOFs); _CP(frictionAngle); _CP(inertia); _CP(mass); _CP(poisson); _CP(refSe3); _CP(se3); _CP(young); _CP(velocity); + #undef _CP + S->physicalParameters=bpp; + + body_id_t sId=rootBody->bodies->insert(S); + + Real distFactor=1.2; + if (C[axis]-distFactor*r<minXYZ[axis]) { + strainer->negIds.push_back(sId); + strainer->negCoords.push_back(C[axis]); + LOG_DEBUG("NEG inserted #"<<sId<<" with C[axis]="<<C[axis]); + } + if (C[axis]+distFactor*r>maxXYZ[axis]) { + strainer->posIds.push_back(sId); + strainer->posCoords.push_back(C[axis]); + LOG_DEBUG("POS inserted #"<<sId<<" with C[axis]="<<C[axis]); + } + } + + return true; +} + + + +void UniaxialStrainerGen::createEngines(){ + rootBody->initializers.clear(); + + shared_ptr<BoundingVolumeMetaEngine> boundingVolumeDispatcher = shared_ptr<BoundingVolumeMetaEngine>(new BoundingVolumeMetaEngine); + boundingVolumeDispatcher->add(new InteractingSphere2AABB); + boundingVolumeDispatcher->add(new MetaInteractingGeometry2AABB); + rootBody->initializers.push_back(boundingVolumeDispatcher); + + rootBody->engines.clear(); + + rootBody->engines.push_back(shared_ptr<Engine>(new PhysicalActionContainerReseter)); + rootBody->engines.push_back(boundingVolumeDispatcher); + + shared_ptr<PersistentSAPCollider> collider(new PersistentSAPCollider); + collider->haveDistantTransient=true; + rootBody->engines.push_back(collider); + + shared_ptr<InteractionGeometryMetaEngine> igeomDispatcher(new InteractionGeometryMetaEngine); + igeomDispatcher->add(shared_ptr<ef2_Sphere_Sphere_Dem3DofGeom>(new ef2_Sphere_Sphere_Dem3DofGeom)); + rootBody->engines.push_back(igeomDispatcher); + + shared_ptr<InteractionPhysicsMetaEngine> iphysDispatcher(new InteractionPhysicsMetaEngine); + shared_ptr<Ip2_CpmMat_CpmMat_CpmPhys> bmc(new Ip2_CpmMat_CpmMat_CpmPhys); + bmc->cohesiveThresholdIter=cohesiveThresholdIter; + bmc->cohesiveThresholdIter=-1; bmc->G_over_E=1;bmc->sigmaT=3e9; bmc->neverDamage=true; bmc->epsCrackOnset=1e-4; bmc->relDuctility=5; + iphysDispatcher->add(bmc); + rootBody->engines.push_back(iphysDispatcher); + + shared_ptr<ConstitutiveLawDispatcher> clDisp(new ConstitutiveLawDispatcher); + clDisp->add(shared_ptr<ConstitutiveLaw>(new Law2_Dem3DofGeom_CpmPhys_Cpm)); + rootBody->engines.push_back(clDisp); + + shared_ptr<NewtonsDampedLaw> newton(new NewtonsDampedLaw); + newton->damping=damping; + rootBody->engines.push_back(newton); + + rootBody->engines.push_back(shared_ptr<CpmPhysDamageColorizer>(new CpmPhysDamageColorizer)); + +} + + + + Added: trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.hpp =================================================================== --- trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.hpp 2009-05-24 18:22:30 UTC (rev 1778) +++ trunk/pkg/dem/PreProcessor/UniaxialStrainerGen.hpp 2009-05-24 18:47:16 UTC (rev 1779) @@ -0,0 +1,38 @@ +// 2008 © Václav Šmilauer <[email protected]> + +#pragma once +#include<yade/extra/Shop.hpp> +#include<yade/core/FileGenerator.hpp> +#include<yade/pkg-dem/UniaxialStrainer.hpp> + +/* + Class for demonstrating the use of UniaxialStrainer. + It is better to use UniaxialStrainer from python, since that way + stresses can be plot easily etc. +*/ +class UniaxialStrainerGen: public FileGenerator { + private: + void createEngines(); + public: + UniaxialStrainerGen(){ axis=1; limitStrain=0; damping=0.2;cohesiveThresholdIter=10;}; + ~UniaxialStrainerGen (){}; + bool generate(); + string spheresFile; + Real strainRate, limitStrain, damping; + int axis; + long cohesiveThresholdIter; + protected : + void registerAttributes(){ + FileGenerator::registerAttributes(); + REGISTER_ATTRIBUTE(spheresFile); + REGISTER_ATTRIBUTE(axis); + REGISTER_ATTRIBUTE(strainRate); + REGISTER_ATTRIBUTE(limitStrain); + REGISTER_ATTRIBUTE(damping); + REGISTER_ATTRIBUTE(cohesiveThresholdIter); + } + REGISTER_CLASS_AND_BASE(UniaxialStrainerGen,FileGenerator); + DECLARE_LOGGER; +}; +REGISTER_SERIALIZABLE(UniaxialStrainerGen); + _______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : [email protected] Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp _______________________________________________ yade-dev mailing list [email protected] https://lists.berlios.de/mailman/listinfo/yade-dev
