diff --git a/docs/examples/statics/FixedDisplacements_LinearElastic/manual_partition.cpp b/docs/examples/statics/FixedDisplacements_LinearElastic/manual_partition.cpp index c1475a5..8a36871 100644 --- a/docs/examples/statics/FixedDisplacements_LinearElastic/manual_partition.cpp +++ b/docs/examples/statics/FixedDisplacements_LinearElastic/manual_partition.cpp @@ -1,156 +1,156 @@ #include #include #include #include int main() { // mesh // ---- // define mesh GooseFEM::Mesh::Quad4::Regular mesh(5, 5); // mesh dimensions size_t nelem = mesh.nelem(); size_t nne = mesh.nne(); size_t ndim = mesh.ndim(); // mesh definitions xt::xtensor coor = mesh.coor(); xt::xtensor conn = mesh.conn(); xt::xtensor dofs = mesh.dofs(); // node sets xt::xtensor nodesLft = mesh.nodesLeftEdge(); xt::xtensor nodesRgt = mesh.nodesRightEdge(); xt::xtensor nodesTop = mesh.nodesTopEdge(); xt::xtensor nodesBot = mesh.nodesBottomEdge(); // fixed displacements DOFs // ------------------------ xt::xtensor iip = xt::concatenate(xt::xtuple( xt::view(dofs, xt::keep(nodesRgt), 0), xt::view(dofs, xt::keep(nodesTop), 1), xt::view(dofs, xt::keep(nodesLft), 0), xt::view(dofs, xt::keep(nodesBot), 1))); // simulation variables // -------------------- // vector definition GooseFEM::VectorPartitioned vector(conn, dofs, iip); // allocate system matrix GooseFEM::MatrixPartitioned K(conn, dofs, iip); GooseFEM::MatrixPartitionedSolver<> Solver; // nodal quantities xt::xtensor disp = xt::zeros(coor.shape()); xt::xtensor fint = xt::zeros(coor.shape()); xt::xtensor fext = xt::zeros(coor.shape()); xt::xtensor fres = xt::zeros(coor.shape()); // DOF values xt::xtensor u_u = xt::zeros({vector.nnu()}); xt::xtensor fres_u = xt::zeros({vector.nnu()}); xt::xtensor fext_p = xt::zeros({vector.nnp()}); // element vectors xt::xtensor ue = xt::empty({nelem, nne, ndim}); xt::xtensor fe = xt::empty({nelem, nne, ndim}); xt::xtensor Ke = xt::empty({nelem, nne * ndim, nne * ndim}); // element/material definition // --------------------------- // element definition GooseFEM::Element::Quad4::QuadraturePlanar elem(vector.AsElement(coor)); size_t nip = elem.nip(); // material definition GMatElastic::Cartesian3d::Array<2> mat({nelem, nip}, 1.0, 1.0); // integration point tensors xt::xtensor Eps = xt::empty({nelem, nip, 3ul, 3ul}); xt::xtensor Sig = xt::empty({nelem, nip, 3ul, 3ul}); xt::xtensor C = xt::empty({nelem, nip, 3ul, 3ul, 3ul, 3ul}); // solve // ----- // strain vector.asElement(disp, ue); elem.symGradN_vector(ue, Eps); // stress & tangent mat.setStrain(Eps); mat.stress(Sig); mat.tangent(C); // internal force elem.int_gradN_dot_tensor2_dV(Sig, fe); vector.assembleNode(fe, fint); // stiffness matrix elem.int_gradN_dot_tensor4_dot_gradNT_dV(C, Ke); K.assemble(Ke); // set fixed displacements xt::xtensor u_p = xt::concatenate(xt::xtuple( +0.1 * xt::ones({nodesRgt.size()}), -0.1 * xt::ones({nodesTop.size()}), xt::zeros({nodesLft.size()}), xt::zeros({nodesBot.size()}))); // residual xt::noalias(fres) = fext - fint; // partition vector.asDofs_u(fres, fres_u); // solve Solver.solve_u(K, fres_u, u_p, u_u); // assemble to nodal vector - vector.asNode(u_u, u_p, disp); + vector.nodeFromPartitioned(u_u, u_p, disp); // post-process // ------------ // compute strain and stress vector.asElement(disp, ue); elem.symGradN_vector(ue, Eps); mat.setStrain(Eps); mat.stress(Sig); // internal force elem.int_gradN_dot_tensor2_dV(Sig, fe); vector.assembleNode(fe, fint); // apply reaction force vector.asDofs_p(fint, fext_p); // residual xt::noalias(fres) = fext - fint; // partition vector.asDofs_u(fres, fres_u); // print residual std::cout << xt::sum(xt::abs(fres_u))[0] / xt::sum(xt::abs(fext_p))[0] << std::endl; // average stress per node xt::xtensor dV = elem.AsTensor<2>(elem.dV()); xt::xtensor SigAv = xt::average(Sig, dV, {1}); // write output H5Easy::File file("output.h5", H5Easy::File::Overwrite); H5Easy::dump(file, "/coor", coor); H5Easy::dump(file, "/conn", conn); H5Easy::dump(file, "/disp", disp); H5Easy::dump(file, "/Sig", SigAv); return 0; }