37 using std::endl; 
using std::cout; 
using std::cerr;
 
   38 using std::ends; 
using std::cin;
 
   46 using bgeot::scalar_type; 
 
   48 using bgeot::base_matrix; 
 
   53 typedef getfem::modeling_standard_sparse_matrix sparse_matrix;
 
   54 typedef getfem::modeling_standard_plain_vector  plain_vector;
 
   56 template<
typename VEC>
 
   57 static void vecsave(std::string fname, 
const VEC& V);
 
   60 template<
typename VEC>
 
   61 static void vecsave( std::string fname, 
const VEC& V) {
 
   63   std::ofstream f(fname.c_str()); f.precision(16);
 
   74 struct elastoplasticity_problem {
 
   76   enum { DIRICHLET_BOUNDARY_NUM = 0,
 
   77          NEUMANN_BOUNDARY_NUM = 1};
 
   87   scalar_type lambda, mu;    
 
   92   std::string datafilename;
 
   93   bgeot::md_param PARAM;
 
   96   bool solve(plain_vector &U);
 
   99   elastoplasticity_problem(
void) : mim(mesh), mim_data(mim), mf_u(mesh),
 
  100                              mf_xi(mesh), mf_rhs(mesh) {}
 
  111 void elastoplasticity_problem::init(
void) {
 
  113   std::string MESH_TYPE =
 
  114     PARAM.string_value(
"MESH_TYPE",
"Mesh type ");
 
  115   std::string FEM_TYPE  =
 
  116     PARAM.string_value(
"FEM_TYPE",
"FEM name");
 
  117   std::string FEM_TYPE_XI =
 
  118     PARAM.string_value(
"FEM_TYPE_XI",
"FEM name");
 
  119   std::string INTEGRATION =
 
  120     PARAM.string_value(
"INTEGRATION",
 
  121                        "Name of integration method");
 
  122   do_export = (PARAM.int_value(
"EXPORT", 
"Perform or not the vtk export") != 0);
 
  124   cout << 
"MESH_TYPE=" << MESH_TYPE << 
"\n";
 
  125   cout << 
"FEM_TYPE="  << FEM_TYPE << 
"\n";
 
  126   cout << 
"INTEGRATION=" << INTEGRATION << 
"\n";
 
  128   residual = PARAM.real_value(
"RESIDUAL", 
"residual");
 
  131   datafilename = PARAM.string_value(
"ROOTFILENAME",
 
  132                                     "Filename for saving");
 
  138   if (MESH_TYPE != 
"load") {
 
  139     std::cout << 
"created getfem mesh"  << 
"\n";
 
  142     std::vector<size_type> nsubdiv(N);
 
  143     nsubdiv[0]=PARAM.int_value
 
  144       (
"NX", 
"Number of space steps in x direction ");
 
  145     nsubdiv[1]=PARAM.int_value
 
  146       (
"NY", 
"Number of space steps in y direction ");
 
  149       nsubdiv[2]=PARAM.int_value
 
  150         (
"NZ", 
"Number of space steps in z direction ");
 
  152                               PARAM.int_value(
"MESH_NOISED")!= 0);
 
  154     bgeot::base_matrix M(N,N);
 
  157       static const char *t[] = {
"LX",
"LY",
"LZ"};
 
  158       M(i,i) = (i<3) ? PARAM.real_value(t[i],t[i]) : 1.0;
 
  162       M(0,1) = PARAM.real_value(
"INCLINE") *
 
  163         PARAM.real_value(
"LY");
 
  167     mesh.transformation(M);
 
  170     std ::cout << 
"mesh from pdetool"  << 
"\n";
 
  171     std::string MESH_FILE
 
  172       = PARAM.string_value(
"MESH_FILE", 
"Mesh file name");
 
  174     mesh.read_from_file(MESH_FILE);
 
  177     pgt = mesh.trans_of_convex
 
  178       (mesh.convex_index().first_true());
 
  181   mu = PARAM.real_value(
"MU", 
"Lamé coefficient mu");
 
  186   lambda = PARAM.real_value(
"LAMBDA",
 
  187                             "Lamé coefficient lambda");
 
  188   mf_u.set_qdim(bgeot::dim_type(N));
 
  194   getfem::pintegration_method ppi =
 
  197   mim.set_integration_method(mesh.convex_index(), ppi);
 
  198   mim_data.set_tensor_size(bgeot::multi_index(N,N));
 
  199   mf_u.set_finite_element(mesh.convex_index(), pf_u);
 
  204   mf_xi.set_finite_element(mesh.convex_index(), pf_xi);
 
  209   std::string data_fem_name
 
  210     = PARAM.string_value(
"DATA_FEM_TYPE");
 
  212   if (data_fem_name.size() == 0) {
 
  213     GMM_ASSERT1(pf_u->is_lagrange(),
 
  214                 "You are using a non-lagrange FEM. " 
  215                 << 
"In that case you need to set " 
  216                 << 
"DATA_FEM_TYPE in the .param file");
 
  217     mf_rhs.set_finite_element(mesh.convex_index(), pf_u);
 
  220     mf_rhs.set_finite_element(mesh.convex_index(),
 
  227   cout << 
"Selecting Neumann and Dirichlet boundaries\n";
 
  232        !it.finished(); ++it) {
 
  233     assert(it.is_face());
 
  235       = mesh.normal_of_face_of_convex(it.cv(), it.f());
 
  238     if (gmm::abs(un[0] - 1.0) < 1.0E-7)
 
  239       mesh.region(NEUMANN_BOUNDARY_NUM).add(it.cv(), it.f());
 
  240     else if (gmm::abs(un[0] + 1.0) < 1.0E-7)
 
  241       mesh.region(DIRICHLET_BOUNDARY_NUM).add(it.cv(),it.f());
 
  246   sigma_y = PARAM.real_value(
"SIGMA_Y", 
"plasticity yield stress");
 
  247   flag_hyp=PARAM.int_value(
"FLAG_HYP");
 
  256 bool elastoplasticity_problem::solve(plain_vector &U) {
 
  262   gmm::set_traces_level(1);
 
  277   getfem::pconstraints_projection
 
  278     proj = std::make_shared<getfem::VM_projection>(0);
 
  280   std::vector<std::string> plastic_variables = {
"u", 
"xi", 
"Previous_Ep"};
 
  281   std::vector<std::string> plastic_data = {
"lambda", 
"mu", 
"sigma_y"};
 
  285     (model, mim, 
"Prandtl Reuss", getfem::DISPLACEMENT_ONLY,
 
  286      plastic_variables, plastic_data);
 
  288   plain_vector F(nb_dof_rhs * N);
 
  291     (model, mim, 
"u", 
"NeumannData", NEUMANN_BOUNDARY_NUM);
 
  295     (model, mim, 
"u", mf_u, DIRICHLET_BOUNDARY_NUM,
 
  299   std::vector<scalar_type> T(19);
 
  300   T[0] = 0; T[1] = 0.9032; T[2] = 1; T[3] = 1.1; T[4] = 1.3;
 
  301   T[5] = 1.5; T[6] = 1.7; T[7] = 1.74; T[8] = 1.7; T[9] = 1.5;
 
  302   T[10] = 1.3; T[11] = 1.1; T[12] = 1; T[13] = 0.9032; T[14] = 0.7;
 
  303   T[15] = 0.5; T[16] = 0.3; T[17] = 0.1; T[18] = 0;
 
  307   mf_vm.set_classical_discontinuous_finite_element(1);
 
  308   getfem::base_vector VM(mf_vm.nb_dof());
 
  309   getfem::base_vector plast(mf_vm.nb_dof());
 
  311   for (
size_type nb = 0; nb < Nb_t; ++nb) {
 
  312     cout << 
"=============iteration number : " << nb << 
"==========" << endl;
 
  314     scalar_type t = T[nb];
 
  317     base_small_vector v(N);
 
  318     v[N-1] = -PARAM.real_value(
"FORCE");
 
  321     for (
size_type i = 0; i < nb_dof_rhs; ++i)
 
  322       gmm::copy(v, gmm::sub_vector
 
  323                 (F, gmm::sub_interval(i*N, N)));
 
  328     cout << 
"Number of variables : " 
  329          << model.
nb_dof() << endl;
 
  331     getfem::newton_search_with_step_control ls;
 
  335 #
if defined(GMM_USES_MUMPS)
 
  336                            getfem::rselect_linear_solver(model, 
"mumps"), ls);
 
  338                            getfem::rselect_linear_solver(model, 
"superlu"), ls);
 
  342       (model, mim, 
"Prandtl Reuss", getfem::DISPLACEMENT_ONLY,
 
  343        plastic_variables, plastic_data);
 
  350       (model, mim, 
"Prandtl Reuss", getfem::DISPLACEMENT_ONLY,
 
  351        plastic_variables, plastic_data, mf_vm, VM);
 
  353     std::stringstream fname; fname << datafilename << 
"_" << nb << 
".vtk";
 
  357       exp.exporting(mf_vm);
 
  358       exp.write_point_data(mf_vm,VM, 
"Von Mises stress");
 
  359       exp.write_point_data(mf_u, U, 
"displacement");
 
  365     cout << 
"export done, you can view the data file with " 
  367       "mayavi2 -d " << datafilename << 
"_1.vtk -f " 
  368       "WarpVector -m Surface -m Outline\n";
 
  379 int main(
int argc, 
char *argv[]) {
 
  381   GETFEM_MPI_INIT(argc, argv);
 
  382   GMM_SET_EXCEPTION_DEBUG;
 
  388   elastoplasticity_problem p;
 
  389   p.PARAM.read_command_line(argc, argv);
 
  391   p.mesh.write_to_file(p.datafilename + 
".mesh");
 
  392   plain_vector U(p.mf_u.nb_dof());
 
  393   if (!p.solve(U)) GMM_ASSERT1(
false, 
"Solve has failed");
 
  394   vecsave(p.datafilename + 
".U", U);
 
  395   cout << 
"Resultats dans fichier : " 
  396        <<p.datafilename<<
".U \n";
 
  397   p.mf_u.write_to_file(p.datafilename + 
".meshfem",
true);
 
  398   scalar_type t[2]={p.mu,p.lambda};
 
  399   vecsave(p.datafilename+
".coef",
 
  400           std::vector<scalar_type>(t, t+2));
 
im_data provides indexing to the integration points of a mesh im object.
Describe a finite element method linked to a mesh.
Describe an integration method linked to a mesh.
"iterator" class for regions.
structure used to hold a set of convexes and/or convex faces.
Describe a mesh (collection of convexes (elements) and points).
`‘Model’' variables store the variables, the data and the description of a model.
size_type nb_dof(bool with_internal=false) const
Total number of degrees of freedom in the model.
void add_initialized_scalar_data(const std::string &name, T e)
Add a scalar data (i.e.
void add_fem_variable(const std::string &name, const mesh_fem &mf, size_type niter=1)
Add a variable being the dofs of a finite element method to the model.
void add_im_data(const std::string &name, const im_data &imd, size_type niter=1)
Add data defined at integration points.
void add_initialized_fem_data(const std::string &name, const mesh_fem &mf, const VECT &v)
Add an initialized fixed size data to the model, assumed to be a vector field if the size of the vect...
model_real_plain_vector & set_real_variable(const std::string &name, size_type niter) const
Gives the write access to the vector value of a variable.
const model_real_plain_vector & real_variable(const std::string &name, size_type niter) const
Gives the access to the vector value of a variable.
void add_fem_data(const std::string &name, const mesh_fem &mf, dim_type qdim=1, size_type niter=1)
Add a data being the dofs of a finite element method to the model.
The Iteration object calculates whether the solution has reached the desired accuracy,...
sparse vector built upon std::vector.
Miscelleanous assembly routines for common terms. Use the low-level generic assembly....
Export solutions to various formats.
Standard solvers for model bricks.
void copy(const L1 &l1, L2 &l2)
*/
number_traits< typename linalg_traits< V >::value_type >::magnitude_type vect_norm2(const V &v)
Euclidean norm of a vector.
void APIDECL outer_faces_of_mesh(const mesh &m, const dal::bit_vector &cvlst, convex_face_ct &flist)
returns a list of "exterior" faces of a mesh (i.e.
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
pfem fem_descriptor(const std::string &name)
get a fem descriptor from its string name.
pgeometric_trans geometric_trans_descriptor(std::string name)
Get the geometric transformation from its string name.
size_t size_type
used as the common size type in the library
std::shared_ptr< const bgeot::geometric_trans > pgeometric_trans
pointer type for a geometric transformation
size_type APIDECL add_Dirichlet_condition_with_multipliers(model &md, const mesh_im &mim, const std::string &varname, const std::string &multname, size_type region, const std::string &dataname=std::string())
Add a Dirichlet condition on the variable varname and the mesh region region.
void compute_small_strain_elastoplasticity_Von_Mises(model &md, const mesh_im &mim, std::string lawname, plasticity_unknowns_type unknowns_type, const std::vector< std::string > &varnames, const std::vector< std::string > ¶ms, const mesh_fem &mf_vm, model_real_plain_vector &VM, size_type region=size_type(-1))
This function computes the Von Mises stress field with respect to a small strain elastoplasticity ter...
void regular_unit_mesh(mesh &m, std::vector< size_type > nsubdiv, bgeot::pgeometric_trans pgt, bool noised=false)
Build a regular mesh of the unit square/cube/, etc.
size_type add_small_strain_elastoplasticity_brick(model &md, const mesh_im &mim, std::string lawname, plasticity_unknowns_type unknowns_type, const std::vector< std::string > &varnames, const std::vector< std::string > ¶ms, size_type region=size_type(-1))
Adds a small strain plasticity term to the model md.
pintegration_method int_method_descriptor(std::string name, bool throw_if_not_found=true)
Get an integration method from its name .
void small_strain_elastoplasticity_next_iter(model &md, const mesh_im &mim, std::string lawname, plasticity_unknowns_type unknowns_type, const std::vector< std::string > &varnames, const std::vector< std::string > ¶ms, size_type region=size_type(-1))
Function that allows to pass from a time step to another for the small strain plastic brick.
size_type APIDECL add_source_term_brick(model &md, const mesh_im &mim, const std::string &varname, const std::string &dataexpr, size_type region=size_type(-1), const std::string &directdataname=std::string())
Add a source term on the variable varname.
void standard_solve(model &md, gmm::iteration &iter, rmodel_plsolver_type lsolver, abstract_newton_line_search &ls)
A default solver for the model brick system.