37 #include "constitutive.h" 41 #include "meshes/triangle_mesh.h" 44 using namespace oomph;
50 template<
class ELEMENT>
52 public virtual SolidMesh
59 const std::string& element_file_name,
60 const std::string& poly_file_name,
61 TimeStepper* time_stepper_pt=
62 &Mesh::Default_TimeStepper) :
63 TriangleMesh<ELEMENT>(node_file_name,element_file_name,
64 poly_file_name, time_stepper_pt)
67 set_lagrangian_nodal_coordinates();
72 unsigned n_node=this->nnode();
73 for (
unsigned j=0;j<n_node;j++)
75 Node* nod_pt=this->node_pt(j);
78 if (nod_pt->x(1)<0.15)
80 this->remove_boundary_node(0,nod_pt);
81 this->add_boundary_node(1,nod_pt);
85 if (nod_pt->x(1)>2.69)
87 this->remove_boundary_node(0,nod_pt);
88 this->add_boundary_node(2,nod_pt);
92 std::cout <<
"About to setup the boundary elements" << std::endl;
94 TriangleMesh<ELEMENT>::setup_boundary_element_info();
124 void gravity(
const double& time,
125 const Vector<double> &xi,
141 const Vector<double> &n, Vector<double> &traction)
143 unsigned dim = traction.size();
144 for(
unsigned i=0;i<dim;i++)
146 traction[i] = -P*n[i];
160 template<
class ELEMENT>
173 void doc_solution(DocInfo& doc_info);
181 SolidMesh* Traction_mesh_pt;
190 template<
class ELEMENT>
195 string node_file_name=
"solid.fig.1.node";
196 string element_file_name=
"solid.fig.1.ele";
197 string poly_file_name=
"solid.fig.1.poly";
206 Traction_mesh_pt=
new SolidMesh;
209 unsigned n_element = Solid_mesh_pt->nboundary_element(b);
212 for(
unsigned e=0;e<n_element;e++)
215 ELEMENT* bulk_elem_pt =
dynamic_cast<ELEMENT*
>(
216 Solid_mesh_pt->boundary_element_pt(b,e));
219 int face_index = Solid_mesh_pt->face_index_at_boundary(b,e);
222 SolidTractionElement<ELEMENT> *el_pt =
223 new SolidTractionElement<ELEMENT>(bulk_elem_pt,face_index);
226 Traction_mesh_pt->add_element_pt(el_pt);
233 add_sub_mesh(Solid_mesh_pt);
234 add_sub_mesh(Traction_mesh_pt);
240 std::ofstream bc_file(
"pinned_nodes.dat");
244 unsigned num_nod= mesh_pt()->nboundary_node(ibound);
245 for (
unsigned inod=0;inod<num_nod;inod++)
249 SolidNode* nod_pt=Solid_mesh_pt->boundary_node_pt(ibound,inod);
252 for (
unsigned i=0;i<2;i++)
254 nod_pt->pin_position(i);
257 bc_file << nod_pt->x(i) <<
" ";
260 bc_file << std::endl;
266 n_element = Solid_mesh_pt->nelement();
267 for(
unsigned i=0;i<n_element;i++)
270 ELEMENT *el_pt =
dynamic_cast<ELEMENT*
>(Solid_mesh_pt->element_pt(i));
273 el_pt->constitutive_law_pt() =
281 cout <<
"Number of equations: " << assign_eqn_numbers() << std::endl;
289 template<
class ELEMENT>
302 sprintf(filename,
"%s/soln%i.dat",doc_info.directory().c_str(),
304 some_file.open(filename);
305 Solid_mesh_pt->output(some_file,npts);
310 sprintf(filename,
"%s/traction%i.dat",doc_info.directory().c_str(),
312 some_file.open(filename);
313 Traction_mesh_pt->output(some_file,npts);
318 sprintf(filename,
"%s/boundaries.dat",doc_info.directory().c_str());
319 some_file.open(filename);
320 Solid_mesh_pt->output_boundaries(some_file);
338 doc_info.set_directory(
"RESLT");
345 std::cout <<
"Running with pure displacement formulation\n";
357 double pressure_increment=-1.0e-4;
360 for (
unsigned istep=0;istep<nstep;istep++)
363 problem.newton_solve();
376 std::cout <<
"Running with pressure/displacement formulation\n";
379 doc_info.set_directory(
"RESLT_pres_disp");
381 doc_info.number() = 0;
393 double pressure_increment=-1.0e-4;
396 for (
unsigned istep=0;istep<nstep;istep++)
399 problem.newton_solve();
415 "Running with pressure/displacement formulation (incompressible) \n";
418 doc_info.set_directory(
"RESLT_pres_disp_incomp");
420 doc_info.number() = 0;
427 const unsigned n_element = problem.mesh_pt()->nelement();
428 for(
unsigned e=0;e<n_element;e++)
431 PVDEquationsWithPressure<2> *cast_el_pt =
432 dynamic_cast<PVDEquationsWithPressure<2>*
>(
433 problem.mesh_pt()->element_pt(e));
437 if(cast_el_pt) {cast_el_pt->set_incompressible();}
449 double pressure_increment=-1.0e-4;
452 for (
unsigned istep=0;istep<nstep;istep++)
455 problem.newton_solve();
double Gravity
Non-dim gravity.
void doc_solution(DocInfo &doc_info)
Doc the solution.
Unstructured solid problem.
ConstitutiveLaw * Constitutive_law_pt
Pointer to constitutive law.
UnstructuredSolidProblem()
Constructor:
double P
Uniform pressure.
virtual ~ElasticTriangleMesh()
Empty Destructor.
void gravity(const double &time, const Vector< double > &xi, Vector< double > &b)
Non-dimensional gravity as body force.
ElasticTriangleMesh< ELEMENT > * Solid_mesh_pt
Bulk mesh.
int main()
Demonstrate how to solve an unstructured solid problem.
void constant_pressure(const Vector< double > &xi, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction)
Constant pressure load. The arguments to this function are imposed on us by the SolidTractionElements...
Triangle-based mesh upgraded to become a solid mesh.
~UnstructuredSolidProblem()
Destructor (empty)
ElasticTriangleMesh(const std::string &node_file_name, const std::string &element_file_name, const std::string &poly_file_name, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor:
double Nu
Poisson's ratio.