7#ifndef FRICTIONQPOTFEM_UNIFORMMULTILAYERINDIVIDUALDRIVE2D_H
8#define FRICTIONQPOTFEM_UNIFORMMULTILAYERINDIVIDUALDRIVE2D_H
21namespace UniformMultiLayerIndividualDrive2d {
161 std::array<size_type, 1> shape1 = {
static_cast<size_type
>(
m_n_layer)};
162 std::array<size_type, 2> shape2 = {
static_cast<size_type
>(
m_n_layer), 2};
172 size_t n_elem_plas = 0;
173 size_t n_elem_elas = 0;
174 size_t n_layer_plas = 0;
175 size_t n_layer_elas = 0;
177 for (
size_t i = 0; i < elem.size(); ++i) {
179 n_elem_plas += elem[i].size();
183 n_elem_elas += elem[i].size();
188 array_type::tensor<size_t, 1> plas = xt::empty<size_t>({n_elem_plas});
189 array_type::tensor<size_t, 1> elas = xt::empty<size_t>({n_elem_elas});
191 std::array<size_type, 1> size_plas = {
static_cast<size_type
>(n_layer_plas) + 1};
192 std::array<size_type, 1> size_elas = {
static_cast<size_type
>(n_layer_elas) + 1};
207 size_t u = n_elem_plas + elem[i].size();
212 xt::view(plas, xt::range(l,
u)) = elem[i];
214 n_elem_plas += elem[i].size();
218 m_N = elem[i].size();
222 size_t u = n_elem_elas + elem[i].size();
227 xt::view(elas, xt::range(l,
u)) = elem[i];
229 n_elem_elas += elem[i].size();
261 for (
size_t q = 0; q <
nip; ++q) {
262 for (
size_t d = 0; d < 2; ++d) {
270#ifdef FRICTIONQPOTFEM_ENABLE_ASSERT
273 auto n = xt::unique(xt::view(
m_vector.
conn(), xt::keep(e)));
279#ifdef FRICTIONQPOTFEM_ENABLE_ASSERT
281 array_type::tensor<size_t, 1> e;
301 size_t N()
const override
306 std::string
type()
const override
308 return "FrictionQPotFEM.UniformMultiLayerIndividualDrive2d.System";
387 template <
class S,
class T>
405 double infty = std::numeric_limits<double>::max();
408 for (
size_t q = 0; q <
m_nip; ++q) {
409 rigid(e, q, 0) = -infty;
410 rigid(e, q, 1) = infty;
459 template <
class S,
class T,
class U>
493 bool yield_element =
false,
494 bool fallback =
false)
override
541 for (
size_t d = 0; d < 2; ++d) {
542 for (
size_t q = 0; q < nip; ++q) {
603 template <
class S,
class T>
609 for (
size_t d = 0; d < 2; ++d) {
610 if (prescribe(i, d)) {
611 double du = ubar(i, d) - current(i, d);
644 ret(i, 0) += 2.0 * delta_gamma * height(i);
676 for (
size_t d = 0; d < 2; ++d) {
699 for (
size_t d = 0; d < 2; ++d) {
702 for (
size_t q = 0; q < nip; ++q) {
727 for (
size_t d = 0; d < 2; ++d) {
732 for (
size_t q = 0; q < nip; ++q) {
System with elastic elements and plastic elements (GMatElastoPlasticQPot).
long minimise(size_t nmargin=0, double tol=1e-5, size_t niter_tol=20, size_t max_iter=1e7, bool time_activity=false, bool max_iter_is_error=true)
Minimise energy: run System::timeStep until a mechanical equilibrium has been reached.
array_type::tensor< double, 2 > m_fext
Nodal force: total external force (reaction force)
double eta() const
Get the damping at the interface.
double rho() const
Mass density.
array_type::tensor< size_t, 1 > m_elem_elas
Elastic elements.
array_type::tensor< double, 2 > m_fmaterial
Nodal force, deriving from elasticity.
void setV(const T &v)
Overwrite nodal velocities.
GMatElastoPlasticQPot::Cartesian2d::Cusp< 2 > m_plas
Material for plastic el.
array_type::tensor< double, 2 > m_a
Nodal accelerations.
array_type::tensor< double, 2 > m_fres
Nodal force: residual force.
double eventDriven_setDeltaU(const T &delta_u, bool autoscale=true)
Set purely elastic and linear response to specific boundary conditions.
array_type::tensor< double, 3 > m_ue
Element vector (used for displacements).
size_t m_inc
Current increment (current time = m_dt * m_inc).
const auto & u() const
Nodal displacements.
void setU(const T &u)
Overwrite nodal displacements.
array_type::tensor< size_t, 1 > m_elem_plas
Plastic elements.
array_type::tensor< double, 2 > m_v
Nodal velocities.
const auto & coor() const
Nodal coordinates.
void computeForceMaterial()
Update m_fmaterial based on the current displacement field m_u.
array_type::tensor< double, 2 > m_fint
Nodal force: total internal force.
virtual void setInc(size_t arg)
Set increment.
const auto & conn() const
Connectivity.
GooseFEM::Element::Quad4::Quadrature m_quad
Quadrature for all elements.
array_type::tensor< double, 2 > m_fdamp
Nodal force from damping.
double dt() const
Get time step.
array_type::tensor< double, 2 > m_u
Nodal displacements.
GooseFEM::VectorPartitioned m_vector
Convert vectors between 'nodevec', 'elemvec', ....
const auto & dofs() const
DOFs per node.
virtual double eventDrivenStep(double deps, bool kick, int direction=1, bool yield_element=false, bool iterative=false)
Add event driven step for the boundary conditions that correspond to the displacement perturbation se...
double alpha() const
Background damping density.
void setA(const T &a)
Overwrite nodal accelerations.
size_t m_nip
Number of integration points.
size_t m_nelem_plas
Number of plastic elements.
const array_type::tensor< size_t, N > & i() const
Index of the current yield strain per item.
void set_epsy(const T &epsy)
Overwrite yield strains per item.
const array_type::tensor< double, N+1 > & epsy() const
Yield strains per item.
auto dV() const -> const array_type::tensor< double, 2 > &
Integration volume.
void int_N_vector_dV(const T &qvector, R &elemvec) const
Same as Int_N_vector_dV(), but writing to preallocated return.
void interpQuad_vector(const T &elemvec, R &qvector) const
Same as InterpQuad_vector(), but writing to preallocated return.
auto nip() const
Number of integration points.
auto allocate_qtensor() const
Get an allocated array_type::tensor to store a "qtensor" of a certain rank (0 = scalar,...
void copy_p(const array_type::tensor< double, 2 > &nodevec_src, array_type::tensor< double, 2 > &nodevec_dest) const
Copy prescribed DOFs from "nodevec" to another "nodvec":
const array_type::tensor< size_t, 2 > & conn() const
void asElement(const T &arg, R &ret) const
Convert "dofval" or "nodevec" to "elemvec" (overwrite entries that occur more than once).
void assembleDofs(const T &arg, R &ret) const
Assemble "nodevec" or "elemvec" to "dofval" (adds entries that occur more that once).
array_type::tensor< double, 1 > allocate_dofval() const
Allocated "dofval".
array_type::tensor< double, 2 > allocate_nodevec() const
Allocated "nodevec".
void asNode(const T &arg, R &ret) const
Convert "dofval" or "elemvec" to "nodevec" (overwrite entries that occur more than once).
std::vector< std::string > version_dependencies()
Return versions of this library and of all of its dependencies.
std::vector< std::string > version_compiler()
Version information of the compilers.
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Friction simulations based on a disorder potential energy landscape and the finite element method.
size_t nip()
Number of integration points:
#define FRICTIONQPOTFEM_REQUIRE(expr)
Assertions that cannot be disabled.
#define FRICTIONQPOTFEM_ASSERT(expr)
All assertions are implementation as::