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

Method assemble

tools/Assembler/Assemblers/DisplacementStrainAssembler.cpp:15–60  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

13using namespace PyMesh;
14
15ZSparseMatrix DisplacementStrainAssembler::assemble(FESettingPtr setting) {
16 typedef FESetting::FEMeshPtr FEMeshPtr;
17 typedef FESetting::FEBasisPtr FEBasisPtr;
18
19 typedef Eigen::Triplet<Float> T;
20 std::vector<T> entries;
21
22 FEMeshPtr mesh = setting->get_mesh();
23 FEBasisPtr basis = setting->get_basis();
24
25 const size_t dim = mesh->getDim();
26 const size_t num_nodes = mesh->getNbrNodes();
27 const size_t num_elements = mesh->getNbrElements();
28 const size_t nodes_per_element = mesh->getNodePerElement();
29 MatrixI order = MatrixOrder::get_order(dim);
30 size_t num_entries_per_element = dim * (dim+1) / 2;
31
32 for (size_t i=0; i<num_elements; i++) {
33 VectorI elem = mesh->getElement(i);
34 MatrixFr grads(nodes_per_element, dim);
35 VectorF coord = VectorF::Ones(nodes_per_element) / nodes_per_element;
36 for (size_t j=0; j<nodes_per_element; j++) {
37 grads.row(j) = basis->evaluate_grad(i, j, coord);
38 }
39
40 size_t row_base = num_entries_per_element * i;
41 for (size_t j=0; j<dim; j++) {
42 for (size_t k=j; k<dim; k++) {
43 for (size_t l=0; l<nodes_per_element; l++) {
44 entries.push_back(T(
45 row_base+order(j, k),
46 elem[l] * dim + k,
47 0.5 * grads(l, j) ));
48 entries.push_back(T(
49 row_base+order(k, j),
50 elem[l] * dim + j,
51 0.5 * grads(l, k) ));
52 }
53 }
54 }
55 }
56
57 ZSparseMatrix B(num_elements * num_entries_per_element, num_nodes * dim);
58 B.setFromTriplets(entries.begin(), entries.end());
59 return B;
60}

Callers

nothing calls this directly

Calls 10

get_basisMethod · 0.80
get_meshMethod · 0.45
getDimMethod · 0.45
getNbrNodesMethod · 0.45
getNbrElementsMethod · 0.45
getNodePerElementMethod · 0.45
getElementMethod · 0.45
evaluate_gradMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected