ソースを参照

Pardiso support on Kingspeak

master
Trevor Irons 5年前
コミット
6a30e4bb34
5個のファイルの変更26行の追加11行の削除
  1. 2
    2
      examples/EMSchur3D-vtk.cpp
  2. 1
    1
      examples/EMSchur3D.cpp
  3. 17
    6
      include/EMSchur3D.h
  4. 3
    0
      include/EMSchur3DBase.h
  5. 3
    2
      src/EMSchur3DBase.cpp

+ 2
- 2
examples/EMSchur3D-vtk.cpp ファイルの表示

117
     //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > >::NewSP();
117
     //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > >::NewSP();
118
     //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
118
     //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
119
     
119
     
120
-    auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
121
-    //auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > >::NewSP();
120
+    //auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
121
+    auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Symmetric > >::NewSP();
122
 
122
 
123
     // LS CG
123
     // LS CG
124
     //auto EM3D = EMSchur3D< Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
124
     //auto EM3D = EMSchur3D< Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();

+ 1
- 1
examples/EMSchur3D.cpp ファイルの表示

36
     //auto EM3D = EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
36
     //auto EM3D = EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
37
     
37
     
38
     //auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
38
     //auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
39
-    auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > >::NewSP();
39
+    auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Symmetric&Eigen::Lower > >::NewSP();
40
 
40
 
41
     // Eigen built-in
41
     // Eigen built-in
42
     //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
42
     //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();

+ 17
- 6
include/EMSchur3D.h ファイルの表示

12
  * @date      02/19/2015 01:10:39 PM
12
  * @date      02/19/2015 01:10:39 PM
13
  * @version   $Id$
13
  * @version   $Id$
14
  * @author    Trevor Irons (ti)
14
  * @author    Trevor Irons (ti)
15
- * @email     Trevor.Irons@xri-geo.com
15
+ * @email     Trevor.Irons@Lemmasoftware.org
16
  * @copyright Copyright (c) 2015, XRI Geophysics, LLC
16
  * @copyright Copyright (c) 2015, XRI Geophysics, LLC
17
- * @copyright Copyright (c) 2015, Trevor Irons
18
- * @copyright Copyright (c) 2011, Trevor Irons
17
+ * @copyright Copyright (c) 2011, 2015, 2017, 2018  Trevor Irons
19
  * @copyright Copyright (c) 2011, Colorado School of Mines
18
  * @copyright Copyright (c) 2011, Colorado School of Mines
20
  */
19
  */
21
 
20
 
247
 
246
 
248
         VectorXcr ADiv = D*A;  // ADiv == RHS == D C^I Se
247
         VectorXcr ADiv = D*A;  // ADiv == RHS == D C^I Se
249
         //VectorXcr Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() - Se.array());
248
         //VectorXcr Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() - Se.array());
249
+#if LOWER==1
250
+        std::cout << "Using Eigen::Lower to calculate Error" << std::endl;
250
         VectorXcr Error = ((Cvec[iw].selfadjointView<Eigen::Lower>()*A).array() - Se.array());
251
         VectorXcr Error = ((Cvec[iw].selfadjointView<Eigen::Lower>()*A).array() - Se.array());
252
+#elif UPPER==1
253
+        std::cout << "Using Eigen::Upper to calculate Error" << std::endl;
254
+        VectorXcr Error = ((Cvec[iw].selfadjointView<Eigen::Upper>()*A).array() - Se.array());
255
+#endif
251
         logio << "|| Div(A) || = " << ADiv.norm()
256
         logio << "|| Div(A) || = " << ADiv.norm()
252
               << "\tInital solution error="<<   Error.norm()  // Iteritive info
257
               << "\tInital solution error="<<   Error.norm()  // Iteritive info
253
 //              << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
258
 //              << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
306
 
311
 
307
         // Report error of solutions
312
         // Report error of solutions
308
         //Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() + E.array() - Se.array());
313
         //Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() + E.array() - Se.array());
314
+#if LOWER==1
315
+        std::cout << "Using Eigen::Lower to calculate Error" << std::endl;
309
         Error = ((Cvec[iw].selfadjointView<Eigen::Lower>()*A).array() + E.array() - Se.array());
316
         Error = ((Cvec[iw].selfadjointView<Eigen::Lower>()*A).array() + E.array() - Se.array());
310
-
317
+#elif UPPER==1
318
+        std::cout << "Using Eigen::Upper to calculate Error" << std::endl;
319
+        Error = ((Cvec[iw].selfadjointView<Eigen::Upper>()*A).array() + E.array() - Se.array());
320
+#endif
311
         //      << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
321
         //      << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
312
         //      << "\ttime " << timer.end() / 60. << " [m]   "
322
         //      << "\ttime " << timer.end() / 60. << " [m]   "
313
         //      <<  CSolver[iw].iterations() << "  iterations"
323
         //      <<  CSolver[iw].iterations() << "  iterations"
466
     }
476
     }
467
 
477
 
468
     template<>
478
     template<>
469
-    void EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > >::BuildCDirectSolver() {
470
-        CSolver = new Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
479
+    void EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Symmetric > >::BuildCDirectSolver() {
480
+        CSolver = new Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Symmetric > [Omegas.size()];
471
         for (int iw=0; iw<Omegas.size(); ++iw) {
481
         for (int iw=0; iw<Omegas.size(); ++iw) {
472
             jsw_timer timer;
482
             jsw_timer timer;
473
             timer.begin();
483
             timer.begin();
474
         
484
         
475
             //CSolver[iw].pardisoParameterArray()[2] = 28; // OMP_NUM_THREADS?
485
             //CSolver[iw].pardisoParameterArray()[2] = 28; // OMP_NUM_THREADS?
486
+            //Eigen::SparseMatrix<Complex> Csym = Cvec[iw].selfadjointView< Eigen::Lower >();
476
             
487
             
477
             /*  Complex system */
488
             /*  Complex system */
478
             std::cout << "PardisoLDLT pattern analyzing C_" << iw << ",";
489
             std::cout << "PardisoLDLT pattern analyzing C_" << iw << ",";

+ 3
- 0
include/EMSchur3DBase.h ファイルの表示

77
 
77
 
78
 namespace Lemma {
78
 namespace Lemma {
79
 
79
 
80
+#define UPPER 0  // LOWER WAS 0
81
+#define LOWER 1  // 1=true, 0=false
82
+
80
 enum SOLVER{ SPARSELU, SimplicialLLT, SimplicialLDLT, BiCGStab, SparseQR };
83
 enum SOLVER{ SPARSELU, SimplicialLLT, SimplicialLDLT, BiCGStab, SparseQR };
81
 
84
 
82
 /**
85
 /**

+ 3
- 2
src/EMSchur3DBase.cpp ファイルの表示

26
 typedef Eigen::Triplet<Lemma::Complex> Tc;
26
 typedef Eigen::Triplet<Lemma::Complex> Tc;
27
 typedef Eigen::Triplet<Lemma::Real> Tr;
27
 typedef Eigen::Triplet<Lemma::Real> Tr;
28
 
28
 
29
-#define UPPER 0  // LOWER WAS 0
30
-#define LOWER 1  // 1=true, 0=false
29
+// Moved to header 
30
+//#define UPPER 0  // LOWER WAS 0
31
+//#define LOWER 1  // 1=true, 0=false
31
 
32
 
32
 namespace Lemma {
33
 namespace Lemma {
33
 
34
 

読み込み中…
キャンセル
保存