5
5
#include < string>
6
6
#include < vector>
7
7
#include < unsupported/Eigen/SparseExtra>
8
- // ///////////////////////////////s ///////////////////////////////////////////////
8
+ // //////////////////////////////////////////////////////////////////////////////
9
9
10
- namespace polysolve ::linear
10
+ Eigen::MatrixXd test_vertices;
11
+ Eigen::MatrixXd init_vertices;
12
+ std::vector<int > test_boundary_nodes;
13
+ Eigen::MatrixXd remove_boundary_vertices (const Eigen::MatrixXd &vertices, const std::vector<int > &boundary_nodes)
11
14
{
12
- namespace {
13
- // //////////////////////////////////////////////////////////////
14
- // int rigid_body_mode(int ndim, const std::vector<double> &coo, std::vector<double> &B, bool transpose = true) {
15
-
16
- // size_t n = coo.size();
17
- // int nmodes = (ndim == 2 ? 3 : 6);
18
- // B.resize(n * nmodes, 0.0);
19
-
20
- // const int stride1 = transpose ? 1 : nmodes;
21
- // const int stride2 = transpose ? n : 1;
22
- // // int stride1 = nmodes;
23
- // // int stride2 = 1;
24
-
25
- // double sn = 1 / sqrt(n);
26
-
27
- // if (ndim == 2) {
28
- // for(size_t i = 0; i < n; ++i) {
29
- // size_t nod = i / ndim;
30
- // size_t dim = i % ndim;
31
-
32
- // double x = coo[nod * 2 + 0];
33
- // double y = coo[nod * 2 + 1];
34
-
35
- // // Translation
36
- // B[i * stride1 + dim * stride2] = sn;
37
-
38
- // // Rotation
39
- // switch(dim) {
40
- // case 0:
41
- // B[i * stride1 + 2 * stride2] = -y;
42
- // break;
43
- // case 1:
44
- // B[i * stride1 + 2 * stride2] = x;
45
- // break;
46
- // }
47
- // }
48
- // } else if (ndim == 3) {
49
- // for(size_t i = 0; i < n; ++i) {
50
- // size_t nod = i / ndim;
51
- // size_t dim = i % ndim;
52
-
53
- // double x = coo[nod * 3 + 0];
54
- // double y = coo[nod * 3 + 1];
55
- // double z = coo[nod * 3 + 2];
56
-
57
- // // Translation
58
- // B[i * stride1 + dim * stride2] = sn;
59
-
60
- // // Rotation
61
- // switch(dim) {
62
- // case 0:
63
- // B[i * stride1 + 5 * stride2] = -y;
64
- // B[i * stride1 + 4 * stride2] = z;
65
- // break;
66
- // case 1:
67
- // B[i * stride1 + 5 * stride2] = x;
68
- // B[i * stride1 + 3 * stride2] = -z;
69
- // break;
70
- // case 2:
71
- // B[i * stride1 + 3 * stride2] = y;
72
- // B[i * stride1 + 4 * stride2] = -x;
73
- // break;
74
- // }
75
- // }
76
- // }
77
-
78
- // // Orthonormalization
79
- // std::array<double, 6> dot;
80
- // for(int i = ndim; i < nmodes; ++i) {
81
- // std::fill(dot.begin(), dot.end(), 0.0);
82
- // for(size_t j = 0; j < n; ++j) {
83
- // for(int k = 0; k < i; ++k)
84
- // dot[k] += B[j * stride1 + k * stride2] * B[j * stride1 + i * stride2];
85
- // }
86
- // double s = 0.0;
87
- // for(size_t j = 0; j < n; ++j) {
88
- // for(int k = 0; k < i; ++k)
89
- // B[j * stride1 + i * stride2] -= dot[k] * B[j * stride1 + k * stride2];
90
- // s += B[j * stride1 + i * stride2] * B[j * stride1 + i * stride2];
91
- // }
92
- // s = sqrt(s);
93
- // for(size_t j = 0; j < n; ++j)
94
- // B[j * stride1 + i * stride2] /= s;
95
- // }
96
- // return nmodes;
97
- // }
98
- // Produce a vector of rigid body modes
99
-
15
+ // Remove boundary vertices
16
+ if (boundary_nodes.empty ())
17
+ {
18
+ return vertices;
100
19
}
20
+ else
21
+ {
22
+ std::vector<int > order_nodes = boundary_nodes;
23
+ std::sort (order_nodes.begin (), order_nodes.end ());
24
+ Eigen::MatrixXd out_vertices;
25
+ std::vector<int > keep;
26
+ for (int i = 0 ; i < vertices.rows (); i++)
27
+ {
28
+ if (!std::binary_search (order_nodes.begin (), order_nodes.end (),i))
29
+ {
30
+ keep.push_back (i);
31
+ }
32
+ }
33
+ out_vertices = vertices (keep, Eigen::all);
34
+ return out_vertices;
35
+ }
36
+ }
37
+
38
+ namespace polysolve ::linear
39
+ {
101
40
TrilinosSolver::TrilinosSolver ()
102
41
{
103
42
precond_num_ = 0 ;
104
- #ifdef HAVE_MPI
43
+ // #ifdef HAVE_MPI
105
44
int done_already;
106
45
MPI_Initialized (&done_already);
107
46
if (!done_already)
@@ -114,9 +53,9 @@ namespace polysolve::linear
114
53
MPI_Init (&argc, &argvv);
115
54
CommPtr = new Epetra_MpiComm (MPI_COMM_WORLD);
116
55
}
117
- #else
118
- CommPtr=new Epetra_SerialComm;
119
- #endif
56
+ // #else
57
+ // CommPtr=new Epetra_SerialComm;
58
+ // #endif
120
59
}
121
60
122
61
// //////////////////////////////////////////////////////////////
@@ -226,36 +165,6 @@ namespace polysolve::linear
226
165
Teuchos::ParameterList MLList;
227
166
TrilinosML_SetDefaultOptions (MLList);
228
167
MLList.set (" PDE equations" ,numPDEs);
229
-
230
- // Set null space
231
-
232
- // if (true)
233
- // {
234
- // int n=test_vertices.rows();
235
- // int NRbm=0;
236
- // int NscalarDof=0;
237
-
238
- // if (numPDEs==2)
239
- // {
240
- // NRbm=3;
241
- // rbm=new double[n*(NRbm+NscalarDof)*(numPDEs+NscalarDof)];
242
- // std::vector<double> z_coord(n,0);
243
- // ML_Coord2RBM(n,test_vertices.col(0).data(),test_vertices.col(1).data(),z_coord.data(),rbm,numPDEs,NscalarDof);
244
- // }
245
- // else
246
- // {
247
- // NRbm=6;
248
- // rbm=new double[n*(NRbm+NscalarDof)*(numPDEs+NscalarDof)];
249
- // ML_Coord2RBM(n,test_vertices.col(0).data(),test_vertices.col(1).data(),test_vertices.col(2).data(),rbm,numPDEs,NscalarDof);
250
- // }
251
-
252
- // MLList.set("null space: vectors",rbm);
253
- // MLList.set("null space: dimension", NRbm);
254
- // MLList.set("null space: type", "pre-computed");
255
- // MLList.set("aggregation: threshold",0.00);
256
- // }
257
-
258
- // /////////////////////////////////////////////////////////////////////
259
168
260
169
if (is_nullspace_)
261
170
{
@@ -342,9 +251,9 @@ namespace polysolve::linear
342
251
delete A;
343
252
delete rowMap;
344
253
delete MLPrec;
345
- #ifdef HAVE_MPI
254
+ // #ifdef HAVE_MPI
346
255
MPI_Finalize () ;
347
- #endif
256
+ // #endif
348
257
}
349
258
}
350
259
0 commit comments