|
@@ -54,7 +54,7 @@ namespace Lemma {
|
54
|
54
|
*/
|
55
|
55
|
static std::shared_ptr< EMSchur3D > NewSP() {
|
56
|
56
|
return std::make_shared< EMSchur3D<Solver> >( ctor_key() );
|
57
|
|
- //return std::make_shared< EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > >( ctor_key() ) ;
|
|
57
|
+ //return std::make_shared< EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > >( ctor_key() ) ;
|
58
|
58
|
}
|
59
|
59
|
|
60
|
60
|
/** Default protected constructor, use New */
|
|
@@ -142,6 +142,8 @@ namespace Lemma {
|
142
|
142
|
template < class Solver >
|
143
|
143
|
void EMSchur3D<Solver>::SolveSource ( std::shared_ptr<DipoleSource> Source, const int& isource ) {
|
144
|
144
|
|
|
145
|
+ std::cout << "In vanilla SolveSource" << std::endl;
|
|
146
|
+
|
145
|
147
|
// figure out which omega we are working with
|
146
|
148
|
int iw = -1;
|
147
|
149
|
for (int iiw=0; iiw<Omegas.size(); ++iiw) {
|
|
@@ -168,6 +170,8 @@ namespace Lemma {
|
168
|
170
|
FillPoints(dpoint);
|
169
|
171
|
PrimaryField(Source, dpoint);
|
170
|
172
|
|
|
173
|
+ std::cout << "Done with primary field" << std::endl;
|
|
174
|
+
|
171
|
175
|
// Allocate a ton of memory
|
172
|
176
|
VectorXcr Phi = VectorXcr::Zero(uns);
|
173
|
177
|
VectorXcr ms(unx+uny+unz); // mu sigma
|
|
@@ -179,7 +183,9 @@ namespace Lemma {
|
179
|
183
|
VectorXcr E0 = VectorXcr::Zero(unx+uny+unz);
|
180
|
184
|
|
181
|
185
|
// Lets get cracking
|
|
186
|
+ std::cout << "Filling source terms" << std::endl;
|
182
|
187
|
FillSourceTerms(ms, Se, E0, dpoint, Omegas[iw]);
|
|
188
|
+ std::cout << "Done source terms" << std::endl;
|
183
|
189
|
|
184
|
190
|
/////////////////////////////////////////////////
|
185
|
191
|
// LOG File
|
|
@@ -187,9 +193,11 @@ namespace Lemma {
|
187
|
193
|
logfile += to_string(isource) + std::string(".log");
|
188
|
194
|
ofstream logio(logfile.c_str());
|
189
|
195
|
|
190
|
|
- logio << *Source << std::endl;
|
|
196
|
+ std::cout << "just logging" << std::endl;
|
|
197
|
+// logio << *Source << std::endl;
|
191
|
198
|
logio << *Grid << std::endl;
|
192
|
199
|
logio << *LayModel << std::endl;
|
|
200
|
+ std::cout << "dun logging" << std::endl;
|
193
|
201
|
|
194
|
202
|
// solve for RHS
|
195
|
203
|
int max_it(nx*ny*nz), iter_done(0);
|
|
@@ -334,9 +342,9 @@ namespace Lemma {
|
334
|
342
|
|
335
|
343
|
#ifdef HAVE_SUPERLUMT
|
336
|
344
|
template<>
|
337
|
|
- void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::BuildCDirectSolver() {
|
|
345
|
+ void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
|
338
|
346
|
|
339
|
|
- CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
347
|
+ CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
340
|
348
|
|
341
|
349
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
342
|
350
|
jsw_timer timer;
|
|
@@ -374,8 +382,8 @@ namespace Lemma {
|
374
|
382
|
#endif
|
375
|
383
|
|
376
|
384
|
template<>
|
377
|
|
- void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
|
378
|
|
- CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
|
|
385
|
+ void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
|
|
386
|
+ CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
|
379
|
387
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
380
|
388
|
jsw_timer timer;
|
381
|
389
|
timer.begin();
|
|
@@ -399,8 +407,8 @@ namespace Lemma {
|
399
|
407
|
}
|
400
|
408
|
|
401
|
409
|
// template<>
|
402
|
|
-// void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
403
|
|
-// CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
410
|
+// void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
|
411
|
+// CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
|
404
|
412
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
405
|
413
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
406
|
414
|
// jsw_timer timer;
|
|
@@ -420,8 +428,8 @@ namespace Lemma {
|
420
|
428
|
// }
|
421
|
429
|
|
422
|
430
|
// template<>
|
423
|
|
-// void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
|
424
|
|
-// CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
|
|
431
|
+// void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
|
|
432
|
+// CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
|
425
|
433
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
426
|
434
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
427
|
435
|
// jsw_timer timer;
|
|
@@ -441,8 +449,8 @@ namespace Lemma {
|
441
|
449
|
// }
|
442
|
450
|
//
|
443
|
451
|
// template<>
|
444
|
|
-// void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
|
445
|
|
-// CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
|
|
452
|
+// void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
|
|
453
|
+// CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
|
446
|
454
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
447
|
455
|
// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
448
|
456
|
// jsw_timer timer;
|
|
@@ -462,8 +470,8 @@ namespace Lemma {
|
462
|
470
|
// }
|
463
|
471
|
//
|
464
|
472
|
// template<>
|
465
|
|
-// void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
|
466
|
|
-// CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
|
|
473
|
+// void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
|
|
474
|
+// CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
|
467
|
475
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
468
|
476
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
469
|
477
|
// jsw_timer timer;
|
|
@@ -484,10 +492,12 @@ namespace Lemma {
|
484
|
492
|
|
485
|
493
|
|
486
|
494
|
template<>
|
487
|
|
- void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
|
488
|
|
- CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
|
|
495
|
+ void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
|
|
496
|
+ CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
|
489
|
497
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
490
|
498
|
Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
|
499
|
+ CSolver[iw].preconditioner().setDroptol(1e-3);
|
|
500
|
+ //CSolver[iw].preconditioner().setFillfactor(1e3);
|
491
|
501
|
jsw_timer timer;
|
492
|
502
|
timer.begin();
|
493
|
503
|
/* Complex system */
|
|
@@ -505,8 +515,8 @@ namespace Lemma {
|
505
|
515
|
}
|
506
|
516
|
|
507
|
517
|
template<>
|
508
|
|
- void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > ::BuildCDirectSolver() {
|
509
|
|
- CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
|
|
518
|
+ void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
|
|
519
|
+ CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
|
510
|
520
|
for (int iw=0; iw<Omegas.size(); ++iw) {
|
511
|
521
|
Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
512
|
522
|
jsw_timer timer;
|
|
@@ -525,30 +535,30 @@ namespace Lemma {
|
525
|
535
|
}
|
526
|
536
|
}
|
527
|
537
|
|
528
|
|
- template<>
|
529
|
|
- void EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
530
|
|
- CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
531
|
|
- for (int iw=0; iw<Omegas.size(); ++iw) {
|
532
|
|
- //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
533
|
|
- jsw_timer timer;
|
534
|
|
- timer.begin();
|
535
|
|
- /* Complex system */
|
536
|
|
- std::cout << "ConjugateGradient pattern analyzing C_" << iw << ",";
|
537
|
|
- std::cout.flush();
|
538
|
|
- CSolver[iw].analyzePattern( Cvec[iw] );
|
539
|
|
- std::cout << " done in " << timer.end() / 60. << " [m]" << std::endl;
|
540
|
|
- // factorize
|
541
|
|
- timer.begin();
|
542
|
|
- std::cout << "ConjugateGradient factorising C_" << iw << ", ";
|
543
|
|
- std::cout.flush();
|
544
|
|
- CSolver[iw].factorize( Cvec[iw] );
|
545
|
|
- std::cout << " done in " << timer.end() / 60. << " [m]" << std::endl;
|
546
|
|
- }
|
547
|
|
- }
|
|
538
|
+// template<>
|
|
539
|
+// void EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
|
540
|
+// CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
|
|
541
|
+// for (int iw=0; iw<Omegas.size(); ++iw) {
|
|
542
|
+// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
|
543
|
+// jsw_timer timer;
|
|
544
|
+// timer.begin();
|
|
545
|
+// /* Complex system */
|
|
546
|
+// std::cout << "ConjugateGradient pattern analyzing C_" << iw << ",";
|
|
547
|
+// std::cout.flush();
|
|
548
|
+// CSolver[iw].analyzePattern( Cvec[iw] );
|
|
549
|
+// std::cout << " done in " << timer.end() / 60. << " [m]" << std::endl;
|
|
550
|
+// // factorize
|
|
551
|
+// timer.begin();
|
|
552
|
+// std::cout << "ConjugateGradient factorising C_" << iw << ", ";
|
|
553
|
+// std::cout.flush();
|
|
554
|
+// CSolver[iw].factorize( Cvec[iw] );
|
|
555
|
+// std::cout << " done in " << timer.end() / 60. << " [m]" << std::endl;
|
|
556
|
+// }
|
|
557
|
+// }
|
548
|
558
|
|
549
|
559
|
// template<>
|
550
|
|
-// void EMSchur3D< Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
551
|
|
-// CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
560
|
+// void EMSchur3D< Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
|
561
|
+// CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
|
552
|
562
|
// //MPI_Init(NULL, NULL);
|
553
|
563
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
554
|
564
|
// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
|
@@ -569,8 +579,8 @@ namespace Lemma {
|
569
|
579
|
// }
|
570
|
580
|
//
|
571
|
581
|
// template<>
|
572
|
|
-// void EMSchur3D< Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
573
|
|
-// CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
|
|
582
|
+// void EMSchur3D< Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
|
|
583
|
+// CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
|
574
|
584
|
// //MPI_Init(NULL, NULL);
|
575
|
585
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
576
|
586
|
// //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|
|
@@ -592,8 +602,8 @@ namespace Lemma {
|
592
|
602
|
// }
|
593
|
603
|
//
|
594
|
604
|
// template<>
|
595
|
|
-// void EMSchur3D< Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, true > > ::BuildCDirectSolver() {
|
596
|
|
-// CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, true > [Omegas.size()];
|
|
605
|
+// void EMSchur3D< Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > > ::BuildCDirectSolver() {
|
|
606
|
+// CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > [Omegas.size()];
|
597
|
607
|
// //MPI_Init(NULL, NULL);
|
598
|
608
|
// for (int iw=0; iw<Omegas.size(); ++iw) {
|
599
|
609
|
// Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
|