瀏覽代碼

Working with Lemma 0.2

master
Trevor Irons 7 年之前
父節點
當前提交
d7b4d91ca5
共有 4 個檔案被更改,包括 69 行新增54 行删除
  1. 6
    1
      examples/EMSchur3D.cpp
  2. 54
    44
      include/EMSchur3D.h
  3. 4
    4
      include/EMSchur3DBase.h
  4. 5
    5
      src/EMSchur3DBase.cpp

+ 6
- 1
examples/EMSchur3D.cpp 查看文件

@@ -29,13 +29,18 @@ 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::ColMajor> > >::NewSP();
32
+    auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > >::NewSP();
33 33
 
34 34
     if (argc < 3) {
35 35
         std::cout << "EMSchur3D  <rgrid>  <1dmod>  <aemsurvey> " << std::endl;
36 36
         exit( EXIT_SUCCESS );
37 37
     }
38 38
 
39
+    #ifdef LEMMAUSEOMP
40
+    std::cout << "Eigen is using OpenMP!!!\n";
41
+    Eigen::initParallel();
42
+    #endif
43
+
39 44
     ///////////////////////////////////////////////////
40 45
     // Read in Grid
41 46
     auto GridRead = RectilinearGridReader::NewSP();

+ 54
- 44
include/EMSchur3D.h 查看文件

@@ -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>();

+ 4
- 4
include/EMSchur3DBase.h 查看文件

@@ -357,13 +357,13 @@ class EMSchur3DBase : public LemmaObject {
357 357
 
358 358
     /** Matrix objects representing discrete operators
359 359
      */
360
-    Eigen::SparseMatrix<Complex, Eigen::ColMajor>*                  Cvec;
361
-    Eigen::SparseMatrix<Complex, Eigen::ColMajor>                   D;
360
+    Eigen::SparseMatrix<Complex, Eigen::RowMajor>*                  Cvec;
361
+    Eigen::SparseMatrix<Complex, Eigen::RowMajor>                   D;
362 362
 
363 363
     /** Squeezed matrices for reduced phi grid
364 364
      */
365
-    Eigen::SparseMatrix<Complex, Eigen::ColMajor>*                  Cvec_s;
366
-    Eigen::SparseMatrix<Complex, Eigen::ColMajor>                   D_s;
365
+    Eigen::SparseMatrix<Complex, Eigen::RowMajor>*                  Cvec_s;
366
+    Eigen::SparseMatrix<Complex, Eigen::RowMajor>                   D_s;
367 367
 
368 368
     /** number of cells in x, set when RectilinearGrid is attached */
369 369
     int nx;

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

@@ -35,7 +35,7 @@ namespace Lemma {
35 35
     // ====================  FRIEND METHODS  =====================
36 36
 
37 37
     std::ostream &operator<<(std::ostream &stream, const EMSchur3DBase &ob) {
38
-        stream << ob.Serialize()  << "\n---\n"; // End of doc ---
38
+        stream << ob.Serialize()  << "\n";
39 39
         return stream;
40 40
     }
41 41
 
@@ -866,7 +866,7 @@ namespace Lemma {
866 866
         // First set up grid stuff
867 867
         if (Cvec) delete [] Cvec;
868 868
         //if (CSolver) delete [] CSolver;
869
-        Cvec    = new Eigen::SparseMatrix<Complex> [Omegas.size()];
869
+        Cvec    = new Eigen::SparseMatrix<Complex, Eigen::RowMajor> [Omegas.size()];
870 870
 
871 871
         //#ifdef LEMMAUSEOMP
872 872
         //#pragma omp parallel for schedule(static, 1)
@@ -1490,9 +1490,9 @@ namespace Lemma {
1490 1490
         Setup();
1491 1491
 
1492 1492
         std::cout << "Entering parallel solve" << std::endl;
1493
-        #ifdef LEMMAUSEOMP
1494
-        #pragma omp parallel for schedule(static,1)
1495
-        #endif
1493
+        //#ifdef LEMMAUSEOMP
1494
+        //#pragma omp parallel for schedule(static,1)
1495
+        //#endif
1496 1496
         for (int isource=0; isource<Survey->GetNumberOfSources(); ++isource) {
1497 1497
             SolveSource(Survey->GetSource(isource), isource);
1498 1498
         }

Loading…
取消
儲存