MCPcopy Create free account
hub / github.com/PyMesh/PyMesh / assemble

Method assemble

tools/Assembler/Assemblers/StiffnessAssembler.cpp:16–56  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

14using namespace PyMesh;
15
16ZSparseMatrix StiffnessAssembler::assemble(FESettingPtr setting) {
17 typedef FESetting::FEMeshPtr FEMeshPtr;
18 typedef FESetting::FEBasisPtr FEBasisPtr;
19 typedef FESetting::MaterialPtr MaterialPtr;
20
21 typedef Eigen::Triplet<Float> T;
22 std::vector<T> entries;
23
24 FEMeshPtr mesh = setting->get_mesh();
25 FEBasisPtr basis = setting->get_basis();
26 MaterialPtr material = setting->get_material();
27
28 const size_t dim = mesh->getDim();
29 const size_t num_nodes = mesh->getNbrNodes();
30 const size_t num_elements = mesh->getNbrElements();
31 const size_t nodes_per_element = mesh->getNodePerElement();
32
33 for (size_t i=0; i<num_elements; i++) {
34 const VectorI elem = mesh->getElement(i);
35 VectorF coord = mesh->getElementCenter(i);
36 Float density = material->get_density(coord);
37
38 for (size_t j=0; j<nodes_per_element; j++) {
39 for (size_t k=0; k<nodes_per_element; k++) {
40 MatrixF coeff = basis->integrate_material_contraction(
41 i, j, k, material);
42 for (size_t l=0; l<dim; l++) {
43 for (size_t n=0; n<dim; n++) {
44 entries.push_back(
45 T(elem[j]*dim+l, elem[k]*dim+n, coeff(l, n) * density));
46 }
47 }
48 }
49 }
50 }
51
52 ZSparseMatrix K(num_nodes * dim, num_nodes * dim);
53 K.setFromTriplets(entries.begin(), entries.end());
54
55 return K;
56}

Callers

nothing calls this directly

Calls 13

get_basisMethod · 0.80
get_materialMethod · 0.80
get_meshMethod · 0.45
getDimMethod · 0.45
getNbrNodesMethod · 0.45
getNbrElementsMethod · 0.45
getNodePerElementMethod · 0.45
getElementMethod · 0.45
getElementCenterMethod · 0.45
get_densityMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected