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

Method assemble

tools/Assembler/Assemblers/ElasticityTensorAssembler.cpp:9–48  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

7using namespace PyMesh;
8
9ZSparseMatrix ElasticityTensorAssembler::assemble(FESettingPtr setting) {
10 typedef FESetting::FEMeshPtr FEMeshPtr;
11 typedef FESetting::MaterialPtr MaterialPtr;
12
13 typedef Eigen::Triplet<Float> T;
14 std::vector<T> entries;
15
16 FEMeshPtr mesh = setting->get_mesh();
17 MaterialPtr material = setting->get_material();
18
19 const size_t dim = mesh->getDim();
20 const size_t num_elements = mesh->getNbrElements();
21 MatrixI order = MatrixOrder::get_order(dim);
22 size_t num_entries_per_element = dim * (dim+1) / 2;
23
24 for (size_t i=0; i<num_elements; i++) {
25 size_t base = i * num_entries_per_element;
26 VectorF coord = mesh->getElementCenter(i);
27 for (size_t j=0; j<dim; j++) {
28 for (size_t k=j; k<dim; k++) {
29 size_t tensor_row = order(j, k);
30 for (size_t m=0; m<dim; m++) {
31 for (size_t n=0; n<dim; n++) {
32 size_t tensor_col = order(m, n);
33 Float entry = material->get_material_tensor(j,k,m,n,coord);
34 if (entry != 0.0) {
35 entries.push_back(T(base + tensor_row,
36 base + tensor_col, entry));
37 }
38 }
39 }
40 }
41 }
42 }
43
44 ZSparseMatrix C(num_elements * num_entries_per_element,
45 num_elements* num_entries_per_element);
46 C.setFromTriplets(entries.begin(), entries.end());
47 return C;
48}

Callers

nothing calls this directly

Calls 8

get_materialMethod · 0.80
get_meshMethod · 0.45
getDimMethod · 0.45
getNbrElementsMethod · 0.45
getElementCenterMethod · 0.45
get_material_tensorMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected