35#include "axisym_solid.h"
38#include "constitutive.h"
41#include "meshes/annular_mesh.h"
43#include "meshes/one_d_mesh.h"
66 Vector<double> lambda(2);
67 double A =
A0 * sin(
omega * time);
68 double B =
B0 * sin(
omega * time);
69 lambda[0] = 1.0 + A - 2.0 * B * pow(r, -3.0);
70 lambda[1] = 1.0 + A + B * pow(r, -3.0);
78 Vector<double> dlambda_dr(2);
79 double B =
B0 * sin(
omega * time);
80 dlambda_dr[0] = 6.0 * B / pow(r, 4.0);
81 dlambda_dr[1] = -3.0 * B / pow(r, 4.0);
87 const Vector<double>& xi,
90 double r = pow(xi[0] * xi[0] + xi[1] * xi[1], 0.5);
91 double theta = atan2(xi[1], xi[0]);
93 xi[0] + (
A0 * r +
B0 * pow(r, -2.0)) * sin(
omega * time) * cos(theta);
95 xi[1] + (
A0 * r +
B0 * pow(r, -2.0)) * sin(
omega * time) * sin(theta);
100 const Vector<double>& xi,
101 Vector<double>& x_dot)
103 double r = pow(xi[0] * xi[0] + xi[1] * xi[1], 0.5);
104 double theta = atan2(xi[1], xi[0]);
106 omega * (
A0 * r +
B0 * pow(r, -2.0)) * cos(
omega * time) * cos(theta);
108 omega * (
A0 * r +
B0 * pow(r, -2.0)) * cos(
omega * time) * sin(theta);
113 const Vector<double>& xi,
114 Vector<double>& x_ddot)
116 double r = pow(xi[0] * xi[0] + xi[1] * xi[1], 0.5);
117 double theta = atan2(xi[1], xi[0]);
119 sin(
omega * time) * cos(theta);
121 sin(
omega * time) * sin(theta);
126 const Vector<double>& xi,
130 double r = pow(xi[0] * xi[0] + xi[1] * xi[1], 0.5);
137 double J = lambda[0] * lambda[1] * lambda[1];
140 double dJdr = dlambda_dr[0] * lambda[1] * lambda[1] +
141 2.0 * lambda[0] * lambda[1] * dlambda_dr[1];
144 double mu_L = 1.0 / (2.0 * (1.0 +
nu));
145 double lambda_L =
nu / ((1.0 +
nu) * (1.0 - 2.0 *
nu));
149 accel - mu_L * (dlambda_dr[0] + (2.0 / r) * (lambda[0] - lambda[1])) -
150 lambda_L * dJdr / (J * lambda[0]) -
151 (dlambda_dr[0] / (lambda[0] * lambda[0]) +
152 (2.0 / r) * (1.0 / lambda[1] - 1.0 / lambda[0])) *
153 (mu_L - lambda_L * log(J));
155 double theta = atan2(xi[1], xi[0]);
156 b[0] = b_spher * cos(theta);
157 b[1] = b_spher * sin(theta);
162 const Vector<double>& xi,
163 const Vector<double>& x,
164 const Vector<double>& n,
165 Vector<double>& traction)
168 double r = pow(xi[0] * xi[0] + xi[1] * xi[1], 0.5);
172 double J = lambda[0] * lambda[1] * lambda[1];
175 double mu_L = 1.0 / (2.0 * (1.0 +
nu));
176 double lambda_L =
nu / ((1.0 +
nu) * (1.0 - 2.0 *
nu));
179 double ext_pressure =
180 -1.0 * (mu_L * (lambda[0] * lambda[0] - 1.0) + lambda_L * log(J)) / J;
183 traction[0] = -1.0 * ext_pressure * n[0];
184 traction[1] = -1.0 * ext_pressure * n[1];
227template<
class ELEMENT>
229 public virtual SolidMesh
262template<
class ELEMENT>
321template<
class ELEMENT>
328 Doc_info.number() = 0;
347 Surface_mesh_pt =
new Mesh;
350 create_boundary_elements();
363 Constitutive_law_pt =
367 complete_problem_setup();
370 set_initial_condition();
379template<
class ELEMENT>
392 el_pt->constitutive_law_pt() = Constitutive_law_pt;
407 Surface_mesh_pt->element_pt(
e));
419 Bulk_mesh_pt->boundary_node_pt(1,
n)->pin_position(1);
427 Bulk_mesh_pt->boundary_node_pt(3,
n)->pin_position(0);
434template<
class ELEMENT>
438 for (
unsigned ibound : {0, 2})
447 dynamic_cast<ELEMENT*
>(Bulk_mesh_pt->boundary_element_pt(
ibound,
e));
469template<
class ELEMENT>
476 unsigned n_node = Bulk_mesh_pt->nnode();
487 xi[0] =
nod_pt->lagrangian_position(0);
488 xi[1] =
nod_pt->lagrangian_position(1);
516template<
class ELEMENT>
533template<
class ELEMENT>
543 "%s/bulk_soln%i.dat",
544 Doc_info.directory().c_str(),
551 "%s/bulk_soln%i.vtu",
552 Doc_info.directory().c_str(),
572 "--use_solid_pressure", &
str_temp,
"Use solid pressure");
Upgrade the mesh to a solidmesh. Quarter-annulus in quadrant r>0, z>0 ntheta - no....
ElasticTwoDAnnularMesh(const unsigned &ntheta, const unsigned &nr, const double &a, const double &h, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Build mesh and copy Eulerian coords to Lagrangian ones so that the initial configuration...
Axisymmetric compression of a finite thickness shell in cylindrical polar coordiantes.
void create_boundary_elements()
Create the boundary elements.
void set_initial_condition()
Set the initial condition.
void complete_problem_setup()
Complete the problem setup (attach function/physical parameter pointers)
void delete_boundary_elements()
Delete boundary elements and wipe the associated mesh.
ElasticTwoDAnnularMesh< ELEMENT > * Bulk_mesh_pt
Bulk mesh.
void doc_solution()
Doc the solution.
void unsteady_run()
Run through the timesteps.
Mesh * Surface_mesh_pt
Surface mesh for traction force.
ShellProblem()
Constructor:
ConstitutiveLaw * Constitutive_law_pt
Pointer to constitutive law.
~ShellProblem()
Destructor.
Global physical variables.
Vector< double > get_principal_stretches(const double &time, const double &r)
Vector< double > get_principal_stretch_derivatives(const double &time, const double &r)
void deformed_accel_fct(const double &time, const Vector< double > &xi, Vector< double > &x_ddot)
void deformed_position_fct(const double &time, const Vector< double > &xi, Vector< double > &x)
void traction_force_fct(const double &time, const Vector< double > &xi, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction)
void deformed_velocity_fct(const double &time, const Vector< double > &xi, Vector< double > &x_dot)
void body_force_fct(const double &time, const Vector< double > &xi, Vector< double > &b)
Global simulation settings.
bool use_pressure_formulation
Flag for using a pressure formulation.
int main(int argc, char *argv[])
Demonstrate how to solve an unstructured solid problem.