|
@@ -231,6 +231,8 @@ namespace Lemma {
|
231
|
231
|
/////////////////////////////////////////
|
232
|
232
|
// Solve for RHS
|
233
|
233
|
//CSolver[iw].setMaxIterations(750);
|
|
234
|
+ Eigen::initParallel();
|
|
235
|
+ std::cout << "Eigen using " << Eigen::nbThreads( ) << " threads" << std::endl;
|
234
|
236
|
VectorXcr A = CSolver[iw].solve(Se);
|
235
|
237
|
|
236
|
238
|
// // Solve Real system instead
|
|
@@ -392,8 +394,8 @@ namespace Lemma {
|
392
|
394
|
|
393
|
395
|
#ifdef HAVE_SUPERLU
|
394
|
396
|
template<>
|
395
|
|
- void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::BuildCDirectSolver() {
|
396
|
|
- CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
397
|
+ void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
|
|
398
|
+ CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
397
|
399
|
|
398
|
400
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
399
|
401
|
jsw_timer timer;
|
|
@@ -432,8 +434,8 @@ namespace Lemma {
|
432
|
434
|
#endif
|
433
|
435
|
|
434
|
436
|
template<>
|
435
|
|
- void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
|
436
|
|
- CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
|
|
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
|
439
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
438
|
440
|
jsw_timer timer;
|
439
|
441
|
timer.begin();
|
|
@@ -462,8 +464,8 @@ namespace Lemma {
|
462
|
464
|
|
463
|
465
|
#ifdef HAVE_PARDISO
|
464
|
466
|
template<>
|
465
|
|
- void EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::BuildCDirectSolver() {
|
466
|
|
- CSolver = new Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
467
|
+ void EMSchur3D< Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
|
|
468
|
+ CSolver = new Eigen::PardisoLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
467
|
469
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
468
|
470
|
jsw_timer timer;
|
469
|
471
|
timer.begin();
|
|
@@ -486,8 +488,8 @@ namespace Lemma {
|
486
|
488
|
}
|
487
|
489
|
|
488
|
490
|
template<>
|
489
|
|
- void EMSchur3D< Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Symmetric > >::BuildCDirectSolver() {
|
490
|
|
- CSolver = new Eigen::PardisoLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Symmetric > [Omegas.size()];
|
|
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
|
493
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
492
|
494
|
jsw_timer timer;
|
493
|
495
|
timer.begin();
|
|
@@ -516,8 +518,8 @@ namespace Lemma {
|
516
|
518
|
#ifdef HAVE_UMFPACK
|
517
|
519
|
// Umfpack only seems to work when LOWER and UPPER are set to 1. Workarounds this have not been found.
|
518
|
520
|
template<>
|
519
|
|
- void EMSchur3D< Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::BuildCDirectSolver() {
|
520
|
|
- CSolver = new Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
521
|
+ void EMSchur3D< Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
|
|
522
|
+ CSolver = new Eigen::UmfPackLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
521
|
523
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
522
|
524
|
jsw_timer timer;
|
523
|
525
|
timer.begin();
|
|
@@ -547,8 +549,8 @@ namespace Lemma {
|
547
|
549
|
#endif
|
548
|
550
|
|
549
|
551
|
// template<>
|
550
|
|
-// void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
551
|
|
-// CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
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
|
554
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
553
|
555
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
554
|
556
|
// jsw_timer timer;
|
|
@@ -568,8 +570,8 @@ namespace Lemma {
|
568
|
570
|
// }
|
569
|
571
|
|
570
|
572
|
// template<>
|
571
|
|
-// void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
|
572
|
|
-// CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
|
|
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
|
575
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
574
|
576
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
575
|
577
|
// jsw_timer timer;
|
|
@@ -589,8 +591,8 @@ namespace Lemma {
|
589
|
591
|
// }
|
590
|
592
|
//
|
591
|
593
|
// template<>
|
592
|
|
-// void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
|
593
|
|
-// CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
|
|
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
|
596
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
595
|
597
|
// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
596
|
598
|
// jsw_timer timer;
|
|
@@ -610,8 +612,8 @@ namespace Lemma {
|
610
|
612
|
// }
|
611
|
613
|
//
|
612
|
614
|
// template<>
|
613
|
|
-// void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
|
614
|
|
-// CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
|
|
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
|
617
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
616
|
618
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
617
|
619
|
// jsw_timer timer;
|
|
@@ -632,8 +634,8 @@ namespace Lemma {
|
632
|
634
|
|
633
|
635
|
|
634
|
636
|
template<>
|
635
|
|
- void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
|
636
|
|
- CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
|
|
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
|
639
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
638
|
640
|
Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
639
|
641
|
CSolver[iw].preconditioner().setDroptol(1e-6); //1e-5); // 1e-12
|
|
@@ -657,8 +659,8 @@ namespace Lemma {
|
657
|
659
|
}
|
658
|
660
|
|
659
|
661
|
template<>
|
660
|
|
- void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > ::BuildCDirectSolver() {
|
661
|
|
- CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
662
|
+ void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
|
|
663
|
+ CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
662
|
664
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
663
|
665
|
Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
664
|
666
|
jsw_timer timer;
|
|
@@ -678,8 +680,8 @@ namespace Lemma {
|
678
|
680
|
}
|
679
|
681
|
|
680
|
682
|
template<>
|
681
|
|
- void EMSchur3D< Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > ::BuildCDirectSolver() {
|
682
|
|
- CSolver = new Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
683
|
+ void EMSchur3D< Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
|
|
684
|
+ CSolver = new Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
683
|
685
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
684
|
686
|
Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
685
|
687
|
jsw_timer timer;
|
|
@@ -699,8 +701,8 @@ namespace Lemma {
|
699
|
701
|
}
|
700
|
702
|
|
701
|
703
|
template<>
|
702
|
|
- void EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
703
|
|
- CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
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
|
706
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
705
|
707
|
//Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
706
|
708
|
jsw_timer timer;
|
|
@@ -720,8 +722,8 @@ namespace Lemma {
|
720
|
722
|
}
|
721
|
723
|
|
722
|
724
|
template<>
|
723
|
|
- void EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > > ::BuildCDirectSolver() {
|
724
|
|
- CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > [Omegas.size()];
|
|
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
|
727
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
726
|
728
|
//Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
727
|
729
|
jsw_timer timer;
|
|
@@ -741,8 +743,8 @@ namespace Lemma {
|
741
|
743
|
}
|
742
|
744
|
|
743
|
745
|
// template<>
|
744
|
|
-// void EMSchur3D< Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
745
|
|
-// CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
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
|
748
|
// //MPI_Init(NULL, NULL);
|
747
|
749
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
748
|
750
|
// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
|
@@ -763,8 +765,8 @@ namespace Lemma {
|
763
|
765
|
// }
|
764
|
766
|
//
|
765
|
767
|
// template<>
|
766
|
|
-// void EMSchur3D< Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
767
|
|
-// CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
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
|
770
|
// //MPI_Init(NULL, NULL);
|
769
|
771
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
770
|
772
|
// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
|
@@ -788,8 +790,8 @@ namespace Lemma {
|
788
|
790
|
|
789
|
791
|
#ifdef HAVE_PASTIX
|
790
|
792
|
template<>
|
791
|
|
- void EMSchur3D< Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, true > > ::BuildCDirectSolver() {
|
792
|
|
- CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, true > [Omegas.size()];
|
|
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
|
795
|
|
794
|
796
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
795
|
797
|
jsw_timer timer;
|