瀏覽代碼

MACRO to switch ColMajor vs RowMajor

master
Trevor Irons 6 年之前
父節點
當前提交
6357ed5265
共有 6 個檔案被更改,包括 103 行新增64 行删除
  1. 33
    1
      CMakeLists.txt
  2. 8
    8
      examples/EMSchur3D-vtk.cpp
  3. 8
    8
      examples/EMSchur3D.cpp
  4. 34
    34
      include/EMSchur3D.h
  5. 19
    12
      include/EMSchur3DBase.h
  6. 1
    1
      src/EMSchur3DBase.cpp

+ 33
- 1
CMakeLists.txt 查看文件

@@ -14,13 +14,45 @@ if (SUPERLU_FOUND)
14 14
 	INCLUDE_DIRECTORIES(${SUPERLU_INCLUDES})
15 15
 endif()
16 16
 
17
-find_package( PaSTiX )
17
+#find_package( PaSTiX )
18
+find_package( PaSTiX COMPONENTS METIS SEQ )
19
+
20
+find_path(PASTIX_pastix_nompi.h_INCLUDE_DIRS
21
+  #NAMES pastix/nompi.h
22
+  NAMES pastix_nompi.h
23
+  HINTS ${PASTIX_INCLUDE_DIRS}
24
+)
25
+if (NOT PASTIX_pastix_nompi.h_INCLUDE_DIRS)
26
+  message(STATUS "A version of Pastix has been found but pastix_nompi.h does not exist in the include directory."
27
+                 " Because Eigen tests require a version without MPI, we disable the Pastix backend.")
28
+endif()
29
+if(PASTIX_FOUND AND PASTIX_pastix_nompi.h_INCLUDE_DIRS)
30
+  add_definitions("-DEIGEN_PASTIX_SUPPORT")
31
+  include_directories(${PASTIX_INCLUDE_DIRS_DEP})
32
+  if(SCOTCH_FOUND)
33
+    include_directories(${SCOTCH_INCLUDE_DIRS})
34
+    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${SCOTCH_LIBRARIES})
35
+  elseif(METIS_FOUND)
36
+    include_directories(${METIS_INCLUDE_DIRS})
37
+    set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${METIS_LIBRARIES})
38
+  else(SCOTCH_FOUND)
39
+#    ei_add_property(EIGEN_MISSING_BACKENDS  "PaStiX, ")
40
+  endif(SCOTCH_FOUND)
41
+  set(SPARSE_LIBS ${SPARSE_LIBS} ${PASTIX_LIBRARIES_DEP} ${ORDERING_LIBRARIES})
42
+  set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES_DEP})
43
+#  ei_add_property(EIGEN_TESTED_BACKENDS  "PaStiX, ")
44
+else()
45
+#  ei_add_property(EIGEN_MISSING_BACKENDS  "PaStiX, ")
46
+endif()
47
+
18 48
 if ( PASTIX_FOUND )
19 49
 	message( STATUS "PaSTiX was found" )
20 50
 	add_compile_options(-DHAVE_PASTIX)
21 51
 	INCLUDE_DIRECTORIES(${PASTIX_INCLUDES})
22 52
 endif()
23 53
 
54
+
55
+
24 56
 find_package( Umfpack )
25 57
 if ( UMFPACK_FOUND )
26 58
 	message( STATUS "Umfpack was found" )

+ 8
- 8
examples/EMSchur3D-vtk.cpp 查看文件

@@ -114,21 +114,21 @@ int main( int argc, char** argv ) {
114 114
     // And solve
115 115
 
116 116
     // Use BiCGSTAB Diagonal preconditioner
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();
117
+    auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::IncompleteLUT<Complex> > >::NewSP();
118
+    //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::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::Symmetric > >::NewSP();
120
+    //auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
121
+    //auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Symmetric > >::NewSP();
122 122
 
123 123
     // LS CG
124
-    //auto EM3D = EMSchur3D< Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
124
+    //auto EM3D = EMSchur3D< Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
125 125
 
126 126
     // CG...dangerous
127
-    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > >::NewSP();
128
-    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > >::NewSP();
127
+    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > >::NewSP();
128
+    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > >::NewSP();
129 129
 
130 130
     // LU direct
131
-    //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > >::NewSP();
131
+    //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::COLAMDOrdering<int> > >::NewSP();
132 132
 
133 133
     EM3D->SetRectilinearGrid( gimp->GetGrid() );
134 134
 

+ 8
- 8
examples/EMSchur3D.cpp 查看文件

@@ -29,24 +29,24 @@ using namespace Lemma;
29 29
 int main( int argc, char** argv ) {
30 30
 
31 31
     // BiCGSTAB Diagonal preconditioner
32
-    //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > >::NewSP();
32
+    //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::IncompleteLUT<Complex> > >::NewSP();
33 33
 
34
-    auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::NewSP();
34
+    //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
35 35
 
36 36
     // SUPERLU
37
-    //auto EM3D = EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::NewSP();
37
+    //auto EM3D = EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
38 38
 
39
-    //auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::NewSP();
40
-    //auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Symmetric&Eigen::Lower > >::NewSP();
39
+    //auto EM3D = EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
40
+    //auto EM3D = EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Symmetric&Eigen::Lower > >::NewSP();
41 41
 
42 42
     // Eigen built-in
43
-    //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::NewSP();
43
+    //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
44 44
 
45 45
     // UmfPack
46
-    //auto EM3D = EMSchur3D< Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::NewSP();
46
+    auto EM3D = EMSchur3D< Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::NewSP();
47 47
 
48 48
     // PaStiX
49
-    //auto EM3D = EMSchur3D< Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > >::NewSP();
49
+    //auto EM3D = EMSchur3D< Eigen::PastixLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, true > >::NewSP();
50 50
 
51 51
 
52 52
     if (argc < 3) {

+ 34
- 34
include/EMSchur3D.h 查看文件

@@ -394,8 +394,8 @@ namespace Lemma {
394 394
 
395 395
 #ifdef HAVE_SUPERLU
396 396
     template<>
397
-    void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
398
-        CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
397
+    void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::BuildCDirectSolver() {
398
+        CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > [Omegas.size()];
399 399
 
400 400
         for (int iw=0; iw<Omegas.size(); ++iw) {
401 401
             jsw_timer timer;
@@ -434,8 +434,8 @@ namespace Lemma {
434 434
 #endif
435 435
 
436 436
     template<>
437
-    void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
438
-        CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
437
+    void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
438
+        CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
439 439
         for (int iw=0; iw<Omegas.size(); ++iw) {
440 440
             jsw_timer timer;
441 441
             timer.begin();
@@ -464,8 +464,8 @@ namespace Lemma {
464 464
 
465 465
 #ifdef HAVE_PARDISO
466 466
     template<>
467
-    void EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
468
-        CSolver = new Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
467
+    void EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::BuildCDirectSolver() {
468
+        CSolver = new Eigen::PardisoLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > [Omegas.size()];
469 469
         for (int iw=0; iw<Omegas.size(); ++iw) {
470 470
             jsw_timer timer;
471 471
             timer.begin();
@@ -488,8 +488,8 @@ namespace Lemma {
488 488
     }
489 489
 
490 490
     template<>
491
-    void EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Symmetric > >::BuildCDirectSolver() {
492
-        CSolver = new Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Symmetric > [Omegas.size()];
491
+    void EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Symmetric > >::BuildCDirectSolver() {
492
+        CSolver = new Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Symmetric > [Omegas.size()];
493 493
         for (int iw=0; iw<Omegas.size(); ++iw) {
494 494
             jsw_timer timer;
495 495
             timer.begin();
@@ -518,8 +518,8 @@ namespace Lemma {
518 518
 #ifdef HAVE_UMFPACK
519 519
     // Umfpack only seems to work when LOWER and UPPER are set to 1. Workarounds this have not been found.
520 520
     template<>
521
-    void EMSchur3D< Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
522
-        CSolver = new Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
521
+    void EMSchur3D< Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > >::BuildCDirectSolver() {
522
+        CSolver = new Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR> > [Omegas.size()];
523 523
         for (int iw=0; iw<Omegas.size(); ++iw) {
524 524
             jsw_timer timer;
525 525
             timer.begin();
@@ -549,8 +549,8 @@ namespace Lemma {
549 549
 #endif
550 550
 
551 551
 //     template<>
552
-//     void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
553
-//         CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
552
+//     void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > > ::BuildCDirectSolver() {
553
+//         CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > [Omegas.size()];
554 554
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
555 555
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
556 556
 //             jsw_timer timer;
@@ -570,8 +570,8 @@ namespace Lemma {
570 570
 //     }
571 571
 
572 572
 //     template<>
573
-//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
574
-//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
573
+//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
574
+//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
575 575
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
576 576
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
577 577
 //             jsw_timer timer;
@@ -591,8 +591,8 @@ namespace Lemma {
591 591
 //     }
592 592
 //
593 593
 //     template<>
594
-//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
595
-//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
594
+//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
595
+//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
596 596
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
597 597
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
598 598
 //             jsw_timer timer;
@@ -612,8 +612,8 @@ namespace Lemma {
612 612
 //     }
613 613
 //
614 614
 //     template<>
615
-//     void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
616
-//         CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
615
+//     void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
616
+//         CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
617 617
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
618 618
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
619 619
 //             jsw_timer timer;
@@ -634,8 +634,8 @@ namespace Lemma {
634 634
 
635 635
 
636 636
     template<>
637
-    void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
638
-        CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
637
+    void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
638
+        CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
639 639
         for (int iw=0; iw<Omegas.size(); ++iw) {
640 640
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
641 641
             CSolver[iw].preconditioner().setDroptol(1e-6);       //1e-5);      // 1e-12
@@ -659,8 +659,8 @@ namespace Lemma {
659 659
     }
660 660
 
661 661
     template<>
662
-    void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
663
-        CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
662
+    void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, SPARSEMAJOR> > > ::BuildCDirectSolver() {
663
+        CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, SPARSEMAJOR> > [Omegas.size()];
664 664
         for (int iw=0; iw<Omegas.size(); ++iw) {
665 665
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
666 666
             jsw_timer timer;
@@ -680,8 +680,8 @@ namespace Lemma {
680 680
     }
681 681
 
682 682
     template<>
683
-    void EMSchur3D< Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
684
-        CSolver = new Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
683
+    void EMSchur3D< Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, SPARSEMAJOR> > > ::BuildCDirectSolver() {
684
+        CSolver = new Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, SPARSEMAJOR> > [Omegas.size()];
685 685
         for (int iw=0; iw<Omegas.size(); ++iw) {
686 686
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
687 687
             jsw_timer timer;
@@ -701,8 +701,8 @@ namespace Lemma {
701 701
     }
702 702
 
703 703
     template<>
704
-    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
705
-        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
704
+    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > > ::BuildCDirectSolver() {
705
+        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > [Omegas.size()];
706 706
         for (int iw=0; iw<Omegas.size(); ++iw) {
707 707
             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
708 708
             jsw_timer timer;
@@ -722,8 +722,8 @@ namespace Lemma {
722 722
     }
723 723
 
724 724
     template<>
725
-    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > > ::BuildCDirectSolver() {
726
-        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > [Omegas.size()];
725
+    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > > ::BuildCDirectSolver() {
726
+        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > [Omegas.size()];
727 727
         for (int iw=0; iw<Omegas.size(); ++iw) {
728 728
             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
729 729
             jsw_timer timer;
@@ -743,8 +743,8 @@ namespace Lemma {
743 743
     }
744 744
 
745 745
 //     template<>
746
-//     void EMSchur3D<   Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
747
-//         CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
746
+//     void EMSchur3D<   Eigen::PastixLLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > > ::BuildCDirectSolver() {
747
+//         CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > [Omegas.size()];
748 748
 //         //MPI_Init(NULL, NULL);
749 749
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
750 750
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
@@ -765,8 +765,8 @@ namespace Lemma {
765 765
 //     }
766 766
 //
767 767
 //     template<>
768
-//     void EMSchur3D<   Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
769
-//         CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
768
+//     void EMSchur3D<   Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > > ::BuildCDirectSolver() {
769
+//         CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, Eigen::Lower > [Omegas.size()];
770 770
 //         //MPI_Init(NULL, NULL);
771 771
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
772 772
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
@@ -790,8 +790,8 @@ namespace Lemma {
790 790
 
791 791
 #ifdef HAVE_PASTIX
792 792
     template<>
793
-    void EMSchur3D<   Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > > ::BuildCDirectSolver() {
794
-        CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > [Omegas.size()];
793
+    void EMSchur3D<   Eigen::PastixLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, true > > ::BuildCDirectSolver() {
794
+        CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, SPARSEMAJOR>, true > [Omegas.size()];
795 795
 
796 796
         for (int iw=0; iw<Omegas.size(); ++iw) {
797 797
             jsw_timer timer;

+ 19
- 12
include/EMSchur3DBase.h 查看文件

@@ -42,6 +42,13 @@
42 42
 
43 43
 #include "timer.h"
44 44
 #include <Eigen/Sparse>
45
+
46
+//#define  SPARSEMAJOR Eigen::ColMajor
47
+#define  SPARSEMAJOR Eigen::RowMajor
48
+
49
+// SPARSEMAJOR;
50
+//typedef  Eigen::RowMajor  SPARSEMAJOR;
51
+
45 52
 //#include "bicgstab.h"
46 53
 
47 54
 // // Solvers
@@ -359,13 +366,13 @@ class EMSchur3DBase : public LemmaObject {
359 366
 
360 367
     /** Matrix objects representing discrete operators
361 368
      */
362
-    Eigen::SparseMatrix<Complex, Eigen::RowMajor>*                  Cvec;
363
-    Eigen::SparseMatrix<Complex, Eigen::RowMajor>                   D;
369
+    Eigen::SparseMatrix<Complex, SPARSEMAJOR>*                  Cvec;
370
+    Eigen::SparseMatrix<Complex, SPARSEMAJOR>                   D;
364 371
 
365 372
     /** Squeezed matrices for reduced phi grid
366 373
      */
367
-    Eigen::SparseMatrix<Complex, Eigen::RowMajor>*                  Cvec_s;
368
-    Eigen::SparseMatrix<Complex, Eigen::RowMajor>                   D_s;
374
+    Eigen::SparseMatrix<Complex, SPARSEMAJOR>*                  Cvec_s;
375
+    Eigen::SparseMatrix<Complex, SPARSEMAJOR>                   D_s;
369 376
 
370 377
     /** number of cells in x, set when RectilinearGrid is attached */
371 378
     int nx;
@@ -436,17 +443,17 @@ class EMSchur3DBase : public LemmaObject {
436 443
     std::vector<int> idx;
437 444
 
438 445
     /** Dirichlet on low X */
439
-    bool DirichletXLO = true;
440
-    //bool DirichletXLO = false;
446
+    //bool DirichletXLO = true;
447
+    bool DirichletXLO = false;
441 448
 
442
-    bool DirichletXHI = true;
443
-    //bool DirichletXHI = false;
449
+    //bool DirichletXHI = true;
450
+    bool DirichletXHI = false;
444 451
 
445
-    bool DirichletYLO = true;
446
-    //bool DirichletYLO = false;
452
+    //bool DirichletYLO = true;
453
+    bool DirichletYLO = false;
447 454
 
448
-    bool DirichletYHI = true;
449
-    //bool DirichletYHI = false;
455
+    //bool DirichletYHI = true;
456
+    bool DirichletYHI = false;
450 457
 
451 458
 //    bool DirichletZLO = true;
452 459
     bool DirichletZLO = false;

+ 1
- 1
src/EMSchur3DBase.cpp 查看文件

@@ -942,7 +942,7 @@ namespace Lemma {
942 942
         // First set up grid stuff
943 943
         if (Cvec) delete [] Cvec;
944 944
         //if (CSolver) delete [] CSolver;
945
-        Cvec    = new Eigen::SparseMatrix<Complex, Eigen::RowMajor> [Omegas.size()];
945
+        Cvec    = new Eigen::SparseMatrix<Complex, SPARSEMAJOR> [Omegas.size()];
946 946
 
947 947
         //#ifdef LEMMAUSEOMP
948 948
         //#pragma omp parallel for schedule(static, 1)

Loading…
取消
儲存