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

Method assemble

tools/Assembler/Assemblers/GraphLaplacianAssembler.cpp:8–48  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6using namespace PyMesh;
7
8ZSparseMatrix GraphLaplacianAssembler::assemble(FESettingPtr setting) {
9 typedef FESetting::FEMeshPtr FEMeshPtr;
10 typedef Eigen::Triplet<Float, size_t> T;
11 std::vector<T> entries;
12
13 auto mesh = setting->get_mesh();
14
15 const size_t num_nodes = mesh->getNbrNodes();
16 const size_t num_elements = mesh->getNbrElements();
17 const size_t node_per_element = mesh->getNodePerElement();
18
19 std::vector<std::list<size_t>> node_adjacency_list(num_nodes);
20 for (size_t i=0; i<num_elements; i++) {
21 const auto elem = mesh->getElement(i);
22 for (size_t j=0; j<node_per_element; j++) {
23 const size_t v0 = elem[j];
24 for (size_t k=0; k<node_per_element; k++) {
25 if (j == k) continue;
26 const size_t v1 = elem[k];
27 node_adjacency_list[v0].push_back(v1);
28 node_adjacency_list[v1].push_back(v0);
29 }
30 }
31 }
32
33 for (size_t i=0; i<num_nodes; i++) {
34 auto& adj_nodes = node_adjacency_list[i];
35 adj_nodes.sort();
36 adj_nodes.unique();
37
38 const size_t num_adj_nodes = adj_nodes.size();
39 entries.push_back({i, i, -1.0});
40 for (size_t j : adj_nodes) {
41 entries.push_back({i, j, 1.0 / num_adj_nodes});
42 }
43 }
44
45 ZSparseMatrix L(num_nodes, num_nodes);
46 L.setFromTriplets(entries.begin(), entries.end());
47 return L;
48}

Callers

nothing calls this directly

Calls 8

get_meshMethod · 0.45
getNbrNodesMethod · 0.45
getNbrElementsMethod · 0.45
getNodePerElementMethod · 0.45
getElementMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected