31 #ifndef SOLID_PROBLEM_H
32 #define SOLID_PROBLEM_H
37 #include "constitutive.h"
46 #include "meshes/simple_cubic_mesh.h"
47 #include "meshes/tetgen_mesh.h"
51 using namespace oomph;
54 #define OOMPH_MPI_PROCESSOR_NUM communicator_pt()->nproc()
56 #define OOMPH_MPI_PROCESSOR_NUM 1
60 #define OOMPH_MPI_PROCESSOR_ID communicator_pt()->my_rank()
62 #define OOMPH_MPI_PROCESSOR_ID 0
78 template<
class ELEMENT_TYPE>
89 double elasticModulus_ = 0;
92 double poissonRatio_ = 0;
101 void (* body_force_fct)(
const double& time,
const Vector<double>& xi, Vector<double>& b) =
nullptr;
104 ConstitutiveLaw* constitutive_law_pt =
nullptr;
120 logger(
INFO,
"Set default constitutive law (GeneralisedHookean) and time stepper (Newmark<2>)");
123 Max_newton_iterations = 20;
124 Newton_solver_tolerance = 1e-10;
128 constitutive_law_pt =
new GeneralisedHookean(&poissonRatio_, &elasticModulus_);
131 add_time_stepper_pt(
new Newmark<2>);
155 elasticModulus_ = elasticModulus;
156 logger(
INFO,
"Elastic Modulus: %", elasticModulus_);
162 return elasticModulus_;
181 poissonRatio_ = poissonRatio;
182 logger(
INFO,
"Poisson Ratio: %", poissonRatio_);
188 return poissonRatio_;
207 logger(
INFO,
"Setting oomph-gravity in z-direction");
210 static double& Density = density_;
211 static double& Gravity = gravity_;
212 body_force_fct = [](
const double& time,
const Vector<double>& xi, Vector<double>& b) {
215 b[2] = -Gravity * Density;
222 isPinned_ = std::move(isPinned);
223 logger(
INFO,
"Setting which positions on which nodes are pinned");
228 logger(
INFO,
"Pinning nodes on boundary %", b);
230 return n->is_on_boundary(b);
236 for (
const auto a: b) {
237 logger(
INFO,
"Pinning nodes on boundary %", a);
240 for (
const auto a : b) {
241 if (
n->is_on_boundary(a))
return true;
248 std::enable_if<std::is_base_of<RefineableQDPVDElement<3,2>,
ELEMENT>::value,
void>
setDissipation(
double dissipation)
250 for (
int i = 0;
i < solid_mesh_pt()->nelement(); ++
i)
259 this->Newton_solver_tolerance = Newton_solver_tolerance;
265 this->Max_newton_iterations = Max_newton_iterations;
270 time_pt()->initialise_dt(dt);
275 return time_pt()->dt();
280 return time_pt()->time();
296 void getDomainSize(std::array<double, 3>& min, std::array<double, 3>& max)
const
300 logger.assert_always(solid_mesh_pt(),
"mesh not found");
301 for (
unsigned i = 0;
i < solid_mesh_pt()->nnode();
i++)
303 const auto n = solid_mesh_pt()->node_pt(
i);
304 for (
int j = 0; j < 3; ++j)
306 min[j] = std::min(min[j],
n->xi(j));
307 max[j] = std::max(max[j],
n->xi(j));
325 logger.assert_always(!name_.empty(),
"Set name via setName(..)");
326 logger.assert_always(elasticModulus_>0,
"Set elastic modulus via setElasticModulus(..)");
327 logger.assert_always(density_>0,
"Set density via setDensity(..)");
328 logger.assert_always(solid_mesh_pt(),
"Set solid mesh via e.g. setSolidCubicMesh(..)");
331 logger(
INFO,
"Assign constitutive_law, body_force, density to all elements");
332 for (
unsigned i = 0;
i < solid_mesh_pt()->nelement();
i++)
335 ELEMENT* el_pt =
dynamic_cast<ELEMENT*
>(solid_mesh_pt()->element_pt(
i));
337 el_pt->constitutive_law_pt() = constitutive_law_pt;
339 el_pt->body_force_fct_pt() = body_force_fct;
341 el_pt->lambda_sq_pt() = &density_;
349 add_sub_mesh(solid_mesh_pt());
350 if (traction_mesh_pt()) {
351 add_sub_mesh(traction_mesh_pt());
352 logger(
INFO,
"Built global mesh from solid mesh and traction mesh");
354 logger(
INFO,
"Built global mesh from solid mesh");
361 for (
unsigned n = 0;
n < solid_mesh_pt()->nnode();
n++ )
363 SolidNode* n_pt = solid_mesh_pt()->node_pt(
n );
365 for (
unsigned i = 0;
i < 3;
i++ )
367 if ( isPinned_( n_pt,
i ) )
369 n_pt->pin_position(
i );
373 n_pt->unpin_position(
i );
381 PVDEquationsBase<3>::pin_redundant_nodal_solid_pressures(
382 solid_mesh_pt()->element_pt());
383 logger(
INFO,
"Pinned redundant nodal solid pressures");
386 unsigned n_eq = assign_eqn_numbers();
387 logger(
INFO,
"Assigned % equation numbers", n_eq);
394 std::array<unsigned,3> countPinned {0,0,0};
395 unsigned countAll = 0;
396 for (
unsigned n = 0;
n < solid_mesh_pt()->nnode();
n++)
398 for (
unsigned i = 0;
i < 3;
i++)
400 countPinned[
i] += solid_mesh_pt()->node_pt(
n)->position_is_pinned(
i);
404 unsigned countPinnedAll = countPinned[0] + countPinned[1] +countPinned[2];
405 logger(
INFO,
"Pinned % of % positions (% free): % in x, % in y, % in z", countPinnedAll, countAll, countAll - countPinnedAll, countPinned[0], countPinned[1], countPinned[2]);
413 logger.assert_always(mesh_pt(),
"Mesh pointer not set; did you call prepareForSolve?");
415 actionsBeforeSolve();
433 logger.assert_always(mesh_pt(),
"Mesh pointer not set; did you call prepareForSolve?");
435 std::cout <<
"Solving oomph with dt=" << dt <<
" until timeMax=" << timeMax << std::endl;
438 assign_initial_values_impulsive(dt);
439 actionsBeforeSolve();
442 double& time = time_stepper_pt()->time();
444 const unsigned countMax = std::ceil(timeMax/dt);
445 while (time < timeMax)
447 logger(
INFO,
"Time %s of %s (% of %)", time, timeMax, count, countMax);
448 actionsBeforeOomphTimeStep();
450 adaptive_unsteady_newton_solve(dt,2e-7);
454 if (count % saveCount == 0 or time + dt > timeMax) {
458 if (Max_res.back()==0) {
459 logger(
WARN,
"Maximum residual is 0; aborting time loop");
472 for (
int i = 0;
true; ++
i)
474 std::string fileName = name_ +
"FEM_" + std::to_string(
i) +
".vtu";
475 if (remove(fileName.c_str()))
break;
476 std::cout <<
"Deleted " << fileName <<
'\n';
483 void get_x(
const Vector<double>& xi, Vector<double>& x)
const
487 for (
int i = 0;
i < 3; ++
i) {
492 GeomObject *geom_obj_pt =
nullptr;
493 const unsigned long nelement = solid_mesh_pt()->nelement();
494 for (
unsigned long i = 0;
i < nelement;
i++) {
495 auto el_pt =
dynamic_cast<ELEMENT *
>(solid_mesh_pt()->element_pt(
i));
496 el_pt->locate_zeta(xi, geom_obj_pt, s);
500 el_pt->interpolated_x(s, x);
521 Z_MIN = 0, Y_MIN = 1, X_MAX = 2, Y_MAX = 3, X_MIN = 4, Z_MAX = 5
533 const double& xMin,
const double& xMax,
const double& yMin,
534 const double& yMax,
const double& zMin,
const double& zMax,
535 TimeStepper* time_stepper_pt) :
536 SimpleCubicMesh<
ELEMENT>(nx, ny, nz, xMin, xMax, yMin, yMax, zMin, zMax, time_stepper_pt),
537 RefineableSimpleCubicMesh<
ELEMENT>(nx, ny, nz, xMin, xMax, yMin, yMax, zMin, zMax, time_stepper_pt),
541 set_lagrangian_nodal_coordinates();
547 const double& xMin,
const double& xMax,
const double& yMin,
548 const double& yMax,
const double& zMin,
const double& zMax)
551 solid_mesh_pt() =
new SolidCubicMesh(nx, ny, nz, xMin, xMax, yMin, yMax, zMin, zMax, time_stepper_pt());
553 logger(
INFO,
"Created %x%x% cubic mesh on domain [%,%]x[%,%]x[%,%]",
554 nx, ny, nz, xMin, xMax, yMin, yMax, zMin, zMax);
559 auto solid_cubic_mesh_pt =
dynamic_cast<SolidCubicMesh*
>(solid_mesh_pt());
560 if (not solid_cubic_mesh_pt) {
561 logger(
INFO,
"Solid mesh can only be stored if based on cubic constructor");
565 std::ofstream mesh(name_ +
".mesh");
566 mesh << solid_cubic_mesh_pt->nx() <<
' ';
567 mesh << solid_cubic_mesh_pt->ny() <<
' ';
568 mesh << solid_cubic_mesh_pt->nz() <<
'\n';
569 for (
int i = 0;
i < solid_mesh_pt()->nnode(); ++
i)
572 for (
int j = 0; j < 3; ++j)
574 mesh <<
n->xi(j) <<
' ' <<
n->x(j) <<
' ' <<
n->position_is_pinned(j) <<
' ';
578 logger(
INFO,
"Saved %x%x% mesh to %.mesh",solid_cubic_mesh_pt->nx(), solid_cubic_mesh_pt->ny(), solid_cubic_mesh_pt->nz(),name_);
587 std::ifstream mesh(
name);
588 logger.assert_always(mesh.good(),
"Mesh file % could not be opened",
name);
590 mesh >> nx >> ny >> nz;
592 solid_mesh_pt() =
new SolidCubicMesh(nx, ny, nz, 0, 1, 0, 1, 0, 1, time_stepper_pt());
596 for (
int i = 0;
i < solid_mesh_pt()->nnode(); ++
i)
599 for (
int j = 0; j < 3; ++j)
601 mesh >> xi >> x >> pin;
604 if (pin)
n->pin_position(j);
613 std::vector<std::vector<double>> sList0;
615 std::vector<unsigned> nList;
621 if (std::is_base_of<SolidTElement<3, 2>,
ELEMENT>::value)
632 nList = {0, 1, 2, 3};
649 nList = {0, 4, 6, 2, 1, 5, 7, 3};
655 std::vector<Vector<double>> sList;
656 for (
auto s0 : sList0)
666 unsigned nel = solid_mesh_pt()->nelement();
671 Vector<double> coordinate;
675 std::vector<double> value;
677 std::vector<Data> data;
679 std::vector<Point> points;
680 points.reserve(nel * sList.size());
685 std::vector<unsigned long> connectivity;
686 unsigned long offset;
689 std::vector<Cell> cells;
693 for (
unsigned e = 0; e < nel; e++)
696 auto el_pt =
dynamic_cast<ELEMENT*
>(
697 solid_mesh_pt()->element_pt(e));
699 std::vector<unsigned long> connectivity;
701 for (
const auto& s : sList)
705 auto n_pt =
dynamic_cast<SolidNode*
>(el_pt->node_pt(
n));
708 el_pt->interpolated_x(s, x);
710 Vector<double> dxdt(3);
711 el_pt->interpolated_dxdt(s, 1, dxdt);
713 Vector<double> xi(3);
714 el_pt->interpolated_xi(s, xi);
716 Vector<double> body_force(3);
717 auto bodyForceFct = el_pt->body_force_fct_pt();
718 if (bodyForceFct) bodyForceFct(time(), xi, body_force);
720 DenseMatrix<double> sigma(3,3);
721 el_pt->get_stress(s, sigma);
722 double pressure = (sigma(0,0)+sigma(1,1)+sigma(2,2))/3;
724 DenseMatrix<double> strain(3,3);
725 el_pt->get_strain(s, strain);
727 std::vector<double> dudt
728 {el_pt->dnodal_position_dt(
n, 0),
729 el_pt->dnodal_position_dt(
n, 1),
730 el_pt->dnodal_position_dt(
n, 2)};
732 std::vector<double> coupledForce(3,0.0);
733 double couplingWeight = 0.0;
735 if (c_el_pt !=
nullptr) {
736 double nnode = c_el_pt->nnode();
737 double dim = c_el_pt->dim();
739 c_el_pt->shape(s, psi);
740 for (
int n=0;
n<nnode; ++
n) {
741 for (
int d=0; d<dim; ++d) {
742 coupledForce[d] += c_el_pt->get_coupling_residual(
n, d) * psi(
n);
744 couplingWeight += c_el_pt->get_coupling_weight(
n) * psi(
n);
748 std::set<unsigned>* boundaries_pt;
749 n_pt->get_boundaries_pt(boundaries_pt);
750 double b = boundaries_pt ? *boundaries_pt->begin() : -1;
751 std::vector<double> pin {(
double) n_pt->position_is_pinned(0),
752 (
double) n_pt->position_is_pinned(1),
753 (
double) n_pt->position_is_pinned(2)};
756 {
"Velocity", {dxdt[0], dxdt[1], dxdt[2]}},
757 {
"Displacement", {x[0] - xi[0], x[1] - xi[1], x[2] - xi[2]}},
758 {
"BodyForce", {body_force[0], body_force[1], body_force[2]}},
761 {
"CoupledForce",coupledForce},
762 {
"CouplingWeight", {couplingWeight}},
775 connectivity.push_back(points.size() - 1);
778 cells.push_back({connectivity, points.size(), vtkFormat});
782 static unsigned count = 0;
784 std::string vtkFileName = name_ +
"FEM_" + std::to_string(
OOMPH_MPI_PROCESSOR_ID) +
"_" + std::to_string(count++) +
".vtu";
786 std::string vtkFileName = name_ +
"FEM_" + std::to_string(count++) +
".vtu";
789 std::ofstream vtk(vtkFileName);
792 vtk <<
"<?xml version=\"1.0\"?>\n"
793 "<!-- time " << getOomphTime() <<
"-->\n"
794 "<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n"
795 "<UnstructuredGrid>\n"
796 "<Piece NumberOfPoints=\""
798 <<
"\" NumberOfCells=\""
803 "<DataArray type=\"Float32\" Name=\"Position\" NumberOfComponents=\"3\" format=\"ascii\">\n";
804 for (
auto point : points)
806 vtk << point.coordinate[0] <<
" " << point.coordinate[1] <<
" " << point.coordinate[2] <<
"\n";
808 vtk <<
"</DataArray>\n"
810 if (not points.empty())
812 vtk <<
"<PointData Vectors=\"vector\">\n";
813 for (
int i = 0;
i < points.front().data.size(); ++
i)
815 auto data = points.front().data[
i];
816 vtk << R
"(<DataArray type="Float32" Name=")"
817 << points.front().data[i].name
818 << R"(" NumberOfComponents=")"
819 << points.front().data[i].value.size()
820 << R"(" format="ascii">)" << "\n";
821 for (
const Point& point : points)
823 for (
const auto& value : point.data[
i].value)
831 vtk <<
"</PointData>\n"
835 "<DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\">\n";
836 for (
const Cell& cell : cells)
838 for (
auto point : cell.connectivity)
843 vtk <<
"</DataArray>\n"
844 "<DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">\n";
845 for (
const Cell& cell : cells)
847 vtk << cell.offset <<
" ";
849 vtk <<
"</DataArray>\n"
850 "<DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">\n";
851 for (
const Cell& cell : cells)
853 vtk << cell.type <<
" ";
860 "</UnstructuredGrid>\n"
867 void getMassMomentumEnergy(
double& mass, Vector<double>& com, Vector<double>& linearMomentum, Vector<double>& angularMomentum,
double& elasticEnergy,
868 double& kineticEnergy) {
874 linearMomentum.initialise(0);
875 angularMomentum.initialise(0);
881 const unsigned long nelement = this->solid_mesh_pt()->nelement();
882 for (
unsigned long e = 0; e < nelement; e++) {
885 ELEMENT* e_pt =
dynamic_cast<ELEMENT*
>(Solid_mesh_pt->element_pt(e));
887 const unsigned DIM = e_pt->dim();
890 unsigned n_intpt = e_pt->integral_pt()->nweight();
893 Vector<double> s(DIM);
896 const unsigned n_node = e_pt->nnode();
899 const unsigned n_position_type = e_pt->nnodal_position_type();
902 Shape psi(n_node, n_position_type);
903 DShape dpsidxi(n_node, n_position_type, DIM);
906 double lambda_sq = e_pt->lambda_sq();
909 for (
unsigned ipt = 0; ipt < n_intpt; ipt++) {
911 for (
unsigned i = 0;
i < DIM;
i++) { s[
i] = e_pt->integral_pt()->knot(ipt,
i); }
914 double w = e_pt->integral_pt()->weight(ipt);
917 double J = e_pt->dshape_lagrangian_at_knot(ipt, psi, dpsidxi);
920 double coupling_w = 0;
929 Vector<double> x(DIM, 0.0);
930 e_pt->interpolated_x(s,x);
933 Vector<double> interpolated_xi(DIM, 0.0);
934 Vector<double> veloc(DIM, 0.0);
937 for (
unsigned l = 0; l < n_node; l++) {
939 for (
unsigned k = 0; k < n_position_type; k++) {
941 for (
unsigned i = 0;
i < DIM;
i++) {
943 interpolated_xi[
i] += e_pt->lagrangian_position_gen(l, k,
i) * psi(l, k);
946 if (e_pt->is_inertia_enabled()) {
947 veloc[
i] += e_pt->dnodal_position_gen_dt(l, k,
i) * psi(l, k);
955 e_pt->get_isotropic_growth(ipt, s, interpolated_xi,
gamma);
959 double W =
gamma * w * (1.0 - coupling_w) * J;
961 DenseMatrix<double> sigma(DIM, DIM);
962 DenseMatrix<double> strain(DIM, DIM);
965 e_pt->get_stress(s, sigma);
968 for (
unsigned i = 0;
i < DIM;
i++) {
969 for (
unsigned j = 0; j < DIM; j++) {
970 sigma(
i, j) += e_pt->prestress(
i, j, interpolated_xi);
975 e_pt->get_strain(s, strain);
978 double localElasticEnergy = 0;
979 double velocitySquared = 0;
982 for (
unsigned i = 0;
i < DIM;
i++) {
983 for (
unsigned j = 0; j < DIM; j++) {
984 localElasticEnergy += sigma(
i, j) * strain(
i, j);
986 velocitySquared += veloc[
i] * veloc[
i];
990 mass += lambda_sq * W;
992 Vector<double> cross_product(DIM, 0);
993 VectorHelpers::cross(interpolated_xi, veloc, cross_product);
994 for (
unsigned i = 0;
i < DIM;
i++) {
995 com[
i] += lambda_sq * W * x[
i];
996 linearMomentum[
i] += lambda_sq * veloc[
i] * W;
997 angularMomentum[
i] += lambda_sq * cross_product[
i] * W;
1000 elasticEnergy += 0.5 * localElasticEnergy * W;
1002 kineticEnergy += lambda_sq * 0.5 * velocitySquared * W;
1005 for (
unsigned i = 0;
i < com.size();
i++) {
const unsigned n
Definition: CG3DPackingUnitTest.cpp:32
LL< Log::INFO > INFO
Info log level.
Definition: Logger.cc:55
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
LL< Log::ERROR > ERROR
Error log level.
Definition: Logger.cc:53
LL< Log::WARN > WARN
Warning log level.
Definition: Logger.cc:54
#define OOMPH_MPI_PROCESSOR_ID
Definition: SolidProblem.h:62
#define OOMPH_MPI_PROCESSOR_NUM
Definition: SolidProblem.h:56
Definition: SolidProblem.h:526
SolidCubicMesh(const unsigned &nx, const unsigned &ny, const unsigned &nz, const double &xMin, const double &xMax, const double &yMin, const double &yMax, const double &zMin, const double &zMax, TimeStepper *time_stepper_pt)
Constructor:
Definition: SolidProblem.h:532
Definition: SolidProblem.h:80
SolidMesh *& traction_mesh_pt()
Get function for the traction mesh pointer.
Definition: SolidProblem.h:287
virtual void actionsBeforeOomphTimeStep()
Definition: SolidProblem.h:426
Boundary
Definition: SolidProblem.h:520
void setElasticModulus(double elasticModulus)
set function for elasticModulus_
Definition: SolidProblem.h:153
void setName(const std::string &name)
set function for name_
Definition: SolidProblem.h:140
void prepareForSolve()
Definition: SolidProblem.h:322
void saveSolidMesh()
Definition: SolidProblem.h:557
void removeOldFiles() const
Definition: SolidProblem.h:470
double getOomphTime() const
get function for current time
Definition: SolidProblem.h:279
void setSolidCubicMesh(const unsigned &nx, const unsigned &ny, const unsigned &nz, const double &xMin, const double &xMax, const double &yMin, const double &yMax, const double &zMin, const double &zMax)
Definition: SolidProblem.h:546
void pinBoundary(unsigned b)
Definition: SolidProblem.h:227
virtual void actionsBeforeSolve()
Definition: SolidProblem.h:422
void writeToVTK()
Definition: SolidProblem.h:610
void solveUnsteady(double timeMax, double dt, unsigned saveCount=10)
Definition: SolidProblem.h:431
std::enable_if< std::is_base_of< RefineableQDPVDElement< 3, 2 >, ELEMENT >::value, void > setDissipation(double dissipation)
Sets the dissipation coefficient for all elements.
Definition: SolidProblem.h:248
void loadSolidMesh(std::string name)
Definition: SolidProblem.h:581
void setOomphTimeStep(double dt)
set function for time step
Definition: SolidProblem.h:269
ELEMENT_TYPE ELEMENT
Definition: SolidProblem.h:83
std::string name_
Definition: SolidProblem.h:86
void setOomphGravity(double gravity)
set function for elasticModulus_
Definition: SolidProblem.h:166
double getDeflection(Vector< double > xi, unsigned d) const
Definition: SolidProblem.h:511
void setPoissonRatio(double poissonRatio)
set function for poissonRatio_
Definition: SolidProblem.h:179
void getDomainSize(std::array< double, 3 > &min, std::array< double, 3 > &max) const
Computes the domain size (min/max of the nodal positions in x/y/z)
Definition: SolidProblem.h:296
double getPoissonRatio() const
get function for poissonRatio_
Definition: SolidProblem.h:186
SolidProblem()
Constructor: set default constitutive law and time stepper.
Definition: SolidProblem.h:118
void get_x(const Vector< double > &xi, Vector< double > &x) const
Definition: SolidProblem.h:483
SolidMesh *const & traction_mesh_pt() const
Get function for the traction mesh pointer.
Definition: SolidProblem.h:293
std::function< bool(SolidNode *, unsigned)> isPinned_
Function to determine which nodal positions are pinned.
Definition: SolidProblem.h:113
void setDensity(double density)
set function for density_
Definition: SolidProblem.h:192
double getOomphGravity() const
get function for gravity_
Definition: SolidProblem.h:173
void setIsPinned(std::function< bool(SolidNode *, unsigned)> isPinned)
set function for isPinned_
Definition: SolidProblem.h:220
virtual void actionsAfterSolve()
Definition: SolidProblem.h:424
void setBodyForceAsGravity(double gravity=9.8)
set function for body_force_pt
Definition: SolidProblem.h:205
void solveSteady()
Definition: SolidProblem.h:411
void setNewtonSolverTolerance(double Newton_solver_tolerance)
set function for Newton_solver_tolerance
Definition: SolidProblem.h:257
double getOomphTimeStep() const
get function for time step
Definition: SolidProblem.h:274
double getDensity() const
get function for density_
Definition: SolidProblem.h:199
void setMaxNewtonIterations(unsigned Max_newton_iterations)
set function for Max_newton_iterations
Definition: SolidProblem.h:263
SolidMesh *& solid_mesh_pt()
Get function for the solid mesh pointer.
Definition: SolidProblem.h:284
void countPinned()
returns statistics about pinned nodes to the console
Definition: SolidProblem.h:391
void getMassMomentumEnergy(double &mass, Vector< double > &com, Vector< double > &linearMomentum, Vector< double > &angularMomentum, double &elasticEnergy, double &kineticEnergy)
See PVDEquationsBase<DIM>::get_energy.
Definition: SolidProblem.h:867
SolidMesh *const & solid_mesh_pt() const
Get function for the solid mesh pointer.
Definition: SolidProblem.h:290
double getElasticModulus() const
get function for elasticModulus_
Definition: SolidProblem.h:160
std::string getName() const
get function for name_
Definition: SolidProblem.h:147
void pinBoundaries(std::vector< unsigned > b)
Definition: SolidProblem.h:235
Definition: RefineableQDPVDElement.h:19
Wrapper class for solid elements to be coupled with discrete solid particles on the surfaces.
Definition: ScaleCoupledElement.h:37
const std::complex< Mdouble > i
Definition: ExtendedMath.h:51
const Mdouble inf
Definition: GeneralDefine.h:44
Mdouble gamma(Mdouble gamma_in)
This is the gamma function returns the true value for the half integer value.
Definition: ExtendedMath.cc:137
Definition: AnisotropicHookean.h:31
std::string name
Definition: MercuryProb.h:48