From 319b6d43a29a03908c385e54751e881da3f40157 Mon Sep 17 00:00:00 2001 From: Xiangyu Hu Date: Sat, 29 Jun 2024 20:45:00 +0000 Subject: [PATCH] contact density non-dimensionlized --- src/shared/materials/base_material.h | 13 ++++++++----- src/shared/materials/complex_solid.h | 2 ++ src/shared/materials/elastic_solid.cpp | 1 + .../contact_dynamics/contact_repulsion.cpp | 5 +---- .../contact_dynamics/contact_repulsion.h | 5 ++--- .../repulsion_density_summation.cpp | 11 +++++------ .../contact_dynamics/repulsion_density_summation.h | 3 +-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/shared/materials/base_material.h b/src/shared/materials/base_material.h index 6a1253b94b..4896126564 100644 --- a/src/shared/materials/base_material.h +++ b/src/shared/materials/base_material.h @@ -103,16 +103,18 @@ class Solid : public BaseMaterial public: Solid(Real rho0, Real contact_stiffness, Real contact_friction = 0.0) : BaseMaterial(rho0), contact_stiffness_(contact_stiffness), + contact_impendence_(rho0 * sqrt(contact_stiffness / rho0)), contact_friction_(contact_friction) { material_type_name_ = "Solid"; }; - explicit Solid(Real rho0) : Solid(rho0, 1.0){}; + explicit Solid(Real rho0) : Solid(rho0, rho0){}; Solid() : Solid(1.0){}; virtual ~Solid(){}; Real ContactFriction() { return contact_friction_; }; Real ContactStiffness() { return contact_stiffness_; }; + Real ContactImpedence() { return contact_impendence_; }; virtual Solid *ThisObjectPtr() override { return this; }; /** Get average velocity when interacting with fluid. */ virtual StdLargeVec *AverageVelocity(BaseParticles *base_particles); @@ -120,10 +122,11 @@ class Solid : public BaseMaterial virtual StdLargeVec *AverageAcceleration(BaseParticles *base_particles); protected: - Real contact_stiffness_; /**< contact-force stiffness related to bulk modulus*/ - Real contact_friction_; /**< friction property mimic fluid viscosity*/ - - void setContactStiffness(Real c0) { contact_stiffness_ = c0 * c0; }; + Real contact_stiffness_; /**< Stiffness has the unit of bulk modules*/ + Real contact_impendence_; /**< contact-impendence */ + Real contact_friction_; /**< friction property mimic fluid viscosity */ + void setContactStiffness(Real c0) { contact_stiffness_ = rho0_ * c0 * c0; }; + void setContactImpedence(Real c0) { contact_impendence_ = rho0_ * c0; }; }; } // namespace SPH #endif // BASE_MATERIAL_H \ No newline at end of file diff --git a/src/shared/materials/complex_solid.h b/src/shared/materials/complex_solid.h index 691a8678a5..2c9b62360d 100644 --- a/src/shared/materials/complex_solid.h +++ b/src/shared/materials/complex_solid.h @@ -87,7 +87,9 @@ class CompositeSolid : public ElasticSolid composite_ptrs_keeper_.createPtr(std::forward(args)...); composite_materials_.push_back(added_material); c0_ = SMAX(c0_, added_material->ReferenceSoundSpeed()); + rho0_ = SMAX(rho0_, added_material->ReferenceDensity()); setContactStiffness(c0_); + setContactImpedence(c0_); }; }; diff --git a/src/shared/materials/elastic_solid.cpp b/src/shared/materials/elastic_solid.cpp index 461462c135..6c3fcfb2f8 100644 --- a/src/shared/materials/elastic_solid.cpp +++ b/src/shared/materials/elastic_solid.cpp @@ -46,6 +46,7 @@ LinearElasticSolid:: lambda0_ = getLambda(youngs_modulus, poisson_ratio); setSoundSpeeds(); setContactStiffness(c0_); + setContactImpedence(c0_); } //=================================================================================================// Real LinearElasticSolid::getBulkModulus(Real youngs_modulus, Real poisson_ratio) diff --git a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.cpp b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.cpp index 92ee3dee7e..ee5d0a7103 100644 --- a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.cpp +++ b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.cpp @@ -9,10 +9,9 @@ RepulsionForce>>:: RepulsionForce(SelfSurfaceContactRelation &self_contact_relation) : RepulsionForce(self_contact_relation, "SelfRepulsionForce"), ForcePrior(particles_, "SelfRepulsionForce"), - solid_(DynamicCast(this, sph_body_.getBaseMaterial())), self_repulsion_density_(*particles_->getVariableDataByName("SelfRepulsionDensity")), vel_(*particles_->getVariableDataByName("Velocity")), - contact_impedance_(solid_.ReferenceDensity() * sqrt(solid_.ContactStiffness())) {} + contact_impedance_(solid_.ContactImpedence()) {} //=================================================================================================// void RepulsionForce>>::interaction(size_t index_i, Real dt) { @@ -34,7 +33,6 @@ void RepulsionForce>>::interaction(size_t index_i, Real dt) RepulsionForce>::RepulsionForce(SurfaceContactRelation &solid_body_contact_relation) : RepulsionForce(solid_body_contact_relation, "RepulsionForce"), ForcePrior(particles_, "RepulsionForce"), - solid_(DynamicCast(this, sph_body_.getBaseMaterial())), repulsion_density_(*particles_->getVariableDataByName("RepulsionDensity")) { for (size_t k = 0; k != contact_particles_.size(); ++k) @@ -72,7 +70,6 @@ void RepulsionForce>::interaction(size_t index_i, Real dt) RepulsionForce>::RepulsionForce(SurfaceContactRelation &solid_body_contact_relation) : RepulsionForce(solid_body_contact_relation, "RepulsionForce"), ForcePrior(particles_, "RepulsionForce"), - solid_(DynamicCast(this, sph_body_.getBaseMaterial())), repulsion_density_(*particles_->getVariableDataByName("RepulsionDensity")) { for (size_t k = 0; k < this->contact_configuration_.size(); ++k) diff --git a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.h b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.h index 9b7bced208..b7fe54a58a 100644 --- a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.h +++ b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/contact_repulsion.h @@ -49,11 +49,13 @@ class RepulsionForce template RepulsionForce(BaseRelationType &base_relation, const std::string &variable_name) : LocalDynamics(base_relation.getSPHBody()), DataDelegationType(base_relation), + solid_(DynamicCast(this, this->sph_body_.getBaseMaterial())), repulsion_force_(*this->particles_->template registerSharedVariable(variable_name)), Vol_(*this->particles_->template getVariableDataByName("VolumetricMeasure")){}; virtual ~RepulsionForce(){}; protected: + Solid &solid_; StdLargeVec &repulsion_force_; StdLargeVec &Vol_; }; @@ -67,7 +69,6 @@ class RepulsionForce>> : public RepulsionForce &self_repulsion_density_; StdLargeVec &vel_; Real contact_impedance_; @@ -83,7 +84,6 @@ class RepulsionForce> : public RepulsionForce &repulsion_density_; StdVec contact_solids_; StdVec *> contact_contact_density_, contact_Vol_; @@ -99,7 +99,6 @@ class RepulsionForce> : public RepulsionForce &repulsion_density_; StdVec *> contact_Vol_; }; diff --git a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.cpp b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.cpp index c52209923b..256813a203 100644 --- a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.cpp +++ b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.cpp @@ -8,7 +8,7 @@ namespace solid_dynamics RepulsionDensitySummation>:: RepulsionDensitySummation(SelfSurfaceContactRelation &self_contact_relation) : RepulsionDensitySummation(self_contact_relation, "SelfRepulsionDensity"), - mass_(*particles_->getVariableDataByName("Mass")) + Vol_(*particles_->getVariableDataByName("VolumetricMeasure")) { Real dp_1 = self_contact_relation.getSPHBody().sph_adaptation_->ReferenceSpacing(); offset_W_ij_ = self_contact_relation.getSPHBody().sph_adaptation_->getKernel()->W(dp_1, ZeroVecd); @@ -20,15 +20,14 @@ void RepulsionDensitySummation>::interaction(size_t index_i, Real dt) const Neighborhood &inner_neighborhood = inner_configuration_[index_i]; for (size_t n = 0; n != inner_neighborhood.current_size_; ++n) { - sigma += std::max(inner_neighborhood.W_ij_[n] - offset_W_ij_, Real(0)); + sigma += std::max(inner_neighborhood.W_ij_[n] - offset_W_ij_, Real(0)) * Vol_[inner_neighborhood.j_[n]]; } - repulsion_density_[index_i] = mass_[index_i] * sigma; + repulsion_density_[index_i] = sigma; } //=================================================================================================// RepulsionDensitySummation>:: RepulsionDensitySummation(SurfaceContactRelation &solid_body_contact_relation) : RepulsionDensitySummation(solid_body_contact_relation, "RepulsionDensity"), - rho0_(sph_body_.getBaseMaterial().ReferenceDensity()), offset_W_ij_(StdVec(contact_configuration_.size(), 0.0)) { for (size_t k = 0; k != contact_particles_.size(); ++k) @@ -66,7 +65,7 @@ void RepulsionDensitySummation>::interaction(size_t index_i, Real dt) sigma += corrected_W_ij * contact_Vol0_k[contact_neighborhood.j_[n]]; } } - repulsion_density_[index_i] = rho0_ * sigma; + repulsion_density_[index_i] = sigma; }; //=================================================================================================// ShellContactDensity::ShellContactDensity(SurfaceContactRelation &solid_body_contact_relation) @@ -91,7 +90,7 @@ ShellContactDensity::ShellContactDensity(SurfaceContactRelation &solid_body_cont contact_max += Dimensions == 2 ? contact_temp : contact_temp * Pi * temp; } /** a calibration factor to avoid particle penetration into shell structure */ - calibration_factor_.push_back(solid_.ReferenceDensity() / (contact_max + Eps)); + calibration_factor_.push_back(1.0 / (contact_max + Eps)); contact_Vol_.push_back(contact_particles_[k]->getVariableDataByName("VolumetricMeasure")); } diff --git a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.h b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.h index a773af570e..8a9eccd484 100644 --- a/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.h +++ b/src/shared/particle_dynamics/solid_dynamics/contact_dynamics/repulsion_density_summation.h @@ -64,7 +64,7 @@ class RepulsionDensitySummation> : public RepulsionDensitySummation &mass_; + StdLargeVec &Vol_; Real offset_W_ij_; }; using SelfContactDensitySummation = RepulsionDensitySummation>; @@ -78,7 +78,6 @@ class RepulsionDensitySummation> : public RepulsionDensitySummation *> contact_Vol0_; StdVec offset_W_ij_; };