55#include  < string> 
66#include  < vector> 
77#include  < unsupported/Eigen/SparseExtra> 
8- // ///////////////////////////////s ///////////////////////////////////////////////
8+ // //////////////////////////////////////////////////////////////////////////////
99
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)
1114{
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;
10019    }
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+ {
10140    TrilinosSolver::TrilinosSolver ()
10241    {
10342        precond_num_ = 0 ;
104- #ifdef  HAVE_MPI
43+ //   #ifdef HAVE_MPI
10544        int  done_already;
10645        MPI_Initialized (&done_already);
10746        if  (!done_already)
@@ -114,9 +53,9 @@ namespace polysolve::linear
11453            MPI_Init (&argc, &argvv);
11554            CommPtr = new  Epetra_MpiComm (MPI_COMM_WORLD);
11655        }
117- #else 
118-      CommPtr=new  Epetra_SerialComm;
119- #endif 
56+ //   #else
57+     //    CommPtr=new Epetra_SerialComm;
58+ //   #endif
12059    }
12160
12261    // //////////////////////////////////////////////////////////////
@@ -226,36 +165,6 @@ namespace polysolve::linear
226165        Teuchos::ParameterList MLList;
227166        TrilinosML_SetDefaultOptions (MLList);
228167        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-         // /////////////////////////////////////////////////////////////////////
259168
260169        if  (is_nullspace_)
261170        {
@@ -342,9 +251,9 @@ namespace polysolve::linear
342251        delete  A;
343252        delete  rowMap;
344253        delete  MLPrec;   
345- #ifdef  HAVE_MPI
254+ //   #ifdef HAVE_MPI
346255        MPI_Finalize () ;
347- #endif 
256+ //   #endif
348257    }
349258}
350259
0 commit comments