Trevor Irons 6 роки тому
джерело
коміт
ffe60de02b

+ 6
- 6
examples/EMSchur3D-vtk.cpp Переглянути файл

114
     // And solve
114
     // And solve
115
 
115
 
116
     // Use BiCGSTAB Diagonal preconditioner
116
     // Use BiCGSTAB Diagonal preconditioner
117
-    //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > >::NewSP();
118
-    //auto EM3D = EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::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();
119
 
119
 
120
     // LS CG
120
     // LS CG
121
-    //auto EM3D = EMSchur3D< Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::NewSP();
121
+    //auto EM3D = EMSchur3D< Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::NewSP();
122
 
122
 
123
     // CG...dangerous
123
     // CG...dangerous
124
-    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > >::NewSP();
125
-    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > >::NewSP();
124
+    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > >::NewSP();
125
+    //auto EM3D = EMSchur3D< Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > >::NewSP();
126
 
126
 
127
     // LU direct
127
     // LU direct
128
-    auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > >::NewSP();
128
+    //auto EM3D = EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > >::NewSP();
129
 
129
 
130
     EM3D->SetRectilinearGrid( gimp->GetGrid() );
130
     EM3D->SetRectilinearGrid( gimp->GetGrid() );
131
 
131
 

+ 1
- 1
examples/EMSchur3D.cpp Переглянути файл

29
 int main( int argc, char** argv ) {
29
 int main( int argc, char** argv ) {
30
 
30
 
31
     // BiCGSTAB Diagonal preconditioner
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, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > >::NewSP();
33
 
33
 
34
     if (argc < 3) {
34
     if (argc < 3) {
35
         std::cout << "EMSchur3D  <rgrid>  <1dmod> <3dmod>  <aemsurvey> " << std::endl;
35
         std::cout << "EMSchur3D  <rgrid>  <1dmod> <3dmod>  <aemsurvey> " << std::endl;

+ 49
- 39
include/EMSchur3D.h Переглянути файл

54
          */
54
          */
55
         static std::shared_ptr< EMSchur3D > NewSP() {
55
         static std::shared_ptr< EMSchur3D > NewSP() {
56
             return std::make_shared< EMSchur3D<Solver> >( ctor_key() );
56
             return std::make_shared< EMSchur3D<Solver> >( ctor_key() );
57
-            //return std::make_shared< EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > >( ctor_key() ) ;
57
+            //return std::make_shared< EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > >( ctor_key() ) ;
58
         }
58
         }
59
 
59
 
60
         /** Default protected constructor, use New */
60
         /** Default protected constructor, use New */
234
         VectorXcr ADiv = D*A;  // ADiv == RHS == D C^I Se
234
         VectorXcr ADiv = D*A;  // ADiv == RHS == D C^I Se
235
         VectorXcr Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() - Se.array());
235
         VectorXcr Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() - Se.array());
236
         logio << "|| Div(A) || = " << ADiv.norm()
236
         logio << "|| Div(A) || = " << ADiv.norm()
237
-                // << " in " << iter_done << " iterations"
238
-              //<<  " with error " << errorn << "\t"
239
               << "\tInital solution error="<<   Error.norm()  // Iteritive info
237
               << "\tInital solution error="<<   Error.norm()  // Iteritive info
240
-//              << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
238
+              << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
241
               << "\ttime " << timer.end() / 60. << " [m]   "
239
               << "\ttime " << timer.end() / 60. << " [m]   "
242
-//             <<  CSolver[iw].iterations() << "  iterations"
243
-            << std::endl;
240
+              <<  CSolver[iw].iterations() << "  iterations"
241
+              << std::endl;
244
 
242
 
245
         //VectorXcr ADivMAC = ADiv.array() * MAC.array().cast<Complex>();
243
         //VectorXcr ADivMAC = ADiv.array() * MAC.array().cast<Complex>();
246
         //logio << "|| Div(A) || on MAC grid " << ADivMAC.norm() << std::endl;
244
         //logio << "|| Div(A) || on MAC grid " << ADivMAC.norm() << std::endl;
288
         A = CSolver[iw].solve( (Se-E).eval() ); // UmfPack requires eval?
286
         A = CSolver[iw].solve( (Se-E).eval() ); // UmfPack requires eval?
289
 
287
 
290
         VectorXcr ADiv2 = D*A;
288
         VectorXcr ADiv2 = D*A;
291
-        logio << "|| Div(A) || = " << ADiv2.norm() ;
289
+
290
+        //logio << "|| Div(A) || = " << ADiv2.norm() ;
292
               //" in " << iter_done << " iterations"
291
               //" in " << iter_done << " iterations"
293
               //<<  " with error " << errorn << "\t";
292
               //<<  " with error " << errorn << "\t";
294
 
293
 
295
         // Report error of solutions
294
         // Report error of solutions
296
         Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() + E.array() - Se.array());
295
         Error = ((Cc.selfadjointView<Eigen::Lower>()*A).array() + E.array() - Se.array());
297
-        logio << "\tsolution error " << Error.norm()
298
-              << std::fixed << std::setprecision(2) << "\ttime " << timer.end()/60. << "\ttotal time " << timer2.end()/60. << std::endl;
296
+        //logio << "\tsolution error " << Error.norm()
297
+        //      << std::fixed << std::setprecision(2) << "\ttime " << timer.end()/60. << "\ttotal time " << timer2.end()/60. << std::endl;
298
+        //      << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
299
+        //      << "\ttime " << timer.end() / 60. << " [m]   "
300
+        //      <<  CSolver[iw].iterations() << "  iterations"
301
+
302
+
303
+        logio << "|| Div(A) || = " << ADiv2.norm()
304
+              << "\tInital solution error="<<   Error.norm()  // Iteritive info
305
+              << "\tSolver reported error="<<   CSolver[iw].error()  // Iteritive info
306
+              << "\ttime " << timer.end() / 60. << " [m]   "
307
+              <<  CSolver[iw].iterations() << "  iterations"
308
+              << std::endl;
299
         logio.close();
309
         logio.close();
300
 
310
 
301
         //////////////////////////////////////
311
         //////////////////////////////////////
348
 
358
 
349
     #ifdef HAVE_SUPERLUMT
359
     #ifdef HAVE_SUPERLUMT
350
     template<>
360
     template<>
351
-    void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > >::BuildCDirectSolver() {
361
+    void EMSchur3D< Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > >::BuildCDirectSolver() {
352
 
362
 
353
-        CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
363
+        CSolver = new Eigen::SuperLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
354
 
364
 
355
         for (int iw=0; iw<Omegas.size(); ++iw) {
365
         for (int iw=0; iw<Omegas.size(); ++iw) {
356
             jsw_timer timer;
366
             jsw_timer timer;
388
     #endif
398
     #endif
389
 
399
 
390
     template<>
400
     template<>
391
-    void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
392
-        CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
401
+    void EMSchur3D< Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > >::BuildCDirectSolver() {
402
+        CSolver = new Eigen::SparseLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::COLAMDOrdering<int> > [Omegas.size()];
393
         for (int iw=0; iw<Omegas.size(); ++iw) {
403
         for (int iw=0; iw<Omegas.size(); ++iw) {
394
             jsw_timer timer;
404
             jsw_timer timer;
395
             timer.begin();
405
             timer.begin();
415
     }
425
     }
416
 
426
 
417
 //     template<>
427
 //     template<>
418
-//     void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
419
-//         CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
428
+//     void EMSchur3D< Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
429
+//         CSolver = new Eigen::CholmodSupernodalLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
420
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
430
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
421
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
431
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
422
 //             jsw_timer timer;
432
 //             jsw_timer timer;
436
 //     }
446
 //     }
437
 
447
 
438
 //     template<>
448
 //     template<>
439
-//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
440
-//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
449
+//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > > ::BuildCDirectSolver() {
450
+//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::NaturalOrdering<int> > [Omegas.size()];
441
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
451
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
442
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
452
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
443
 //             jsw_timer timer;
453
 //             jsw_timer timer;
457
 //     }
467
 //     }
458
 //
468
 //
459
 //     template<>
469
 //     template<>
460
-//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
461
-//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
470
+//     void EMSchur3D< Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
471
+//         CSolver = new Eigen::CSymSimplicialLLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
462
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
472
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
463
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
473
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
464
 //             jsw_timer timer;
474
 //             jsw_timer timer;
478
 //     }
488
 //     }
479
 //
489
 //
480
 //     template<>
490
 //     template<>
481
-//     void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
482
-//         CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
491
+//     void EMSchur3D< Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > > ::BuildCDirectSolver() {
492
+//         CSolver = new Eigen::CSymSimplicialLDLT< Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::AMDOrdering<int> > [Omegas.size()];
483
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
493
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
484
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
494
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
485
 //             jsw_timer timer;
495
 //             jsw_timer timer;
500
 
510
 
501
 
511
 
502
     template<>
512
     template<>
503
-    void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
504
-        CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
513
+    void EMSchur3D< Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > > ::BuildCDirectSolver() {
514
+        CSolver = new Eigen::BiCGSTAB<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::IncompleteLUT<Complex> > [Omegas.size()];
505
         for (int iw=0; iw<Omegas.size(); ++iw) {
515
         for (int iw=0; iw<Omegas.size(); ++iw) {
506
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
516
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
507
-            CSolver[iw].preconditioner().setDroptol(1e-12);      // 1e-12
508
-            CSolver[iw].preconditioner().setFillfactor(1e1);     // 1e2
517
+            CSolver[iw].preconditioner().setDroptol(1e-5);      // 1e-12
518
+            //CSolver[iw].preconditioner().setFillfactor(5e1);     // 1e2
509
             jsw_timer timer;
519
             jsw_timer timer;
510
             timer.begin();
520
             timer.begin();
511
             /*  Complex system */
521
             /*  Complex system */
523
     }
533
     }
524
 
534
 
525
     template<>
535
     template<>
526
-    void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
527
-        CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
536
+    void EMSchur3D< Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > ::BuildCDirectSolver() {
537
+        CSolver = new Eigen::BiCGSTAB< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
528
         for (int iw=0; iw<Omegas.size(); ++iw) {
538
         for (int iw=0; iw<Omegas.size(); ++iw) {
529
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
539
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
530
             jsw_timer timer;
540
             jsw_timer timer;
544
     }
554
     }
545
 
555
 
546
     template<>
556
     template<>
547
-    void EMSchur3D< Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > > ::BuildCDirectSolver() {
548
-        CSolver = new Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::RowMajor> > [Omegas.size()];
557
+    void EMSchur3D< Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > > ::BuildCDirectSolver() {
558
+        CSolver = new Eigen::LeastSquaresConjugateGradient< Eigen::SparseMatrix<Complex, Eigen::ColMajor> > [Omegas.size()];
549
         for (int iw=0; iw<Omegas.size(); ++iw) {
559
         for (int iw=0; iw<Omegas.size(); ++iw) {
550
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
560
             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
551
             jsw_timer timer;
561
             jsw_timer timer;
565
     }
575
     }
566
 
576
 
567
     template<>
577
     template<>
568
-    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
569
-        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
578
+    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
579
+        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
570
         for (int iw=0; iw<Omegas.size(); ++iw) {
580
         for (int iw=0; iw<Omegas.size(); ++iw) {
571
             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
581
             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
572
             jsw_timer timer;
582
             jsw_timer timer;
586
     }
596
     }
587
 
597
 
588
     template<>
598
     template<>
589
-    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > > ::BuildCDirectSolver() {
590
-        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > [Omegas.size()];
599
+    void EMSchur3D<   Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > > ::BuildCDirectSolver() {
600
+        CSolver = new Eigen::ConjugateGradient<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower, Eigen::IncompleteCholesky<Complex> > [Omegas.size()];
591
         for (int iw=0; iw<Omegas.size(); ++iw) {
601
         for (int iw=0; iw<Omegas.size(); ++iw) {
592
             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
602
             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
593
             jsw_timer timer;
603
             jsw_timer timer;
607
     }
617
     }
608
 
618
 
609
 //     template<>
619
 //     template<>
610
-//     void EMSchur3D<   Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
611
-//         CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
620
+//     void EMSchur3D<   Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
621
+//         CSolver = new Eigen::PastixLLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
612
 //         //MPI_Init(NULL, NULL);
622
 //         //MPI_Init(NULL, NULL);
613
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
623
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
614
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
624
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
629
 //     }
639
 //     }
630
 //
640
 //
631
 //     template<>
641
 //     template<>
632
-//     void EMSchur3D<   Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
633
-//         CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, Eigen::Lower > [Omegas.size()];
642
+//     void EMSchur3D<   Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > > ::BuildCDirectSolver() {
643
+//         CSolver = new Eigen::PastixLDLT<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, Eigen::Lower > [Omegas.size()];
634
 //         //MPI_Init(NULL, NULL);
644
 //         //MPI_Init(NULL, NULL);
635
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
645
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
636
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
646
 //             //Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
652
 //     }
662
 //     }
653
 //
663
 //
654
 //     template<>
664
 //     template<>
655
-//     void EMSchur3D<   Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > > ::BuildCDirectSolver() {
656
-//         CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::RowMajor>, true > [Omegas.size()];
665
+//     void EMSchur3D<   Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, true > > ::BuildCDirectSolver() {
666
+//         CSolver = new Eigen::PastixLU<Eigen::SparseMatrix<Complex, Eigen::ColMajor>, true > [Omegas.size()];
657
 //         //MPI_Init(NULL, NULL);
667
 //         //MPI_Init(NULL, NULL);
658
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
668
 //         for (int iw=0; iw<Omegas.size(); ++iw) {
659
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();
669
 //             Csym = Cvec[iw].selfadjointView<Eigen::Lower>();

+ 4
- 4
include/EMSchur3DBase.h Переглянути файл

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

+ 4
- 4
include/bicgstab.h Переглянути файл

326
 
326
 
327
 /** \internal Low-level conjugate gradient algorithm
327
 /** \internal Low-level conjugate gradient algorithm
328
   * \param mat The matrix A
328
   * \param mat The matrix A
329
-  * \param rhs The right hand side vector b
329
+  * \param rhs The right hand side vector b5
330
   * \param x On input and initial solution, on output the computed solution.
330
   * \param x On input and initial solution, on output the computed solution.
331
   * \param precond A preconditioner being able to efficiently solve for an
331
   * \param precond A preconditioner being able to efficiently solve for an
332
   *                approximation of Ax=b (regardless of b)
332
   *                approximation of Ax=b (regardless of b)
474
     VectorXcr b = (ioms).asDiagonal() * (D.transpose()*Phi);
474
     VectorXcr b = (ioms).asDiagonal() * (D.transpose()*Phi);
475
     VectorXcr y = solver.solve(b);
475
     VectorXcr y = solver.solve(b);
476
     //max_it = 0;
476
     //max_it = 0;
477
-    //max_it = solver.iterations();
477
+    max_it = solver.iterations();
478
     //errorn = solver.error();
478
     //errorn = solver.error();
479
     return  D*y;
479
     return  D*y;
480
 }
480
 }
746
         tol2 = tol;
746
         tol2 = tol;
747
         max_it2 = 500000;
747
         max_it2 = 500000;
748
         v = implicitDCInvBPhi3(D, solver, ioms, p, tol2, max_it2);
748
         v = implicitDCInvBPhi3(D, solver, ioms, p, tol2, max_it2);
749
-        max_it2 = 0; // solver.iterations();
749
+        max_it2 = solver.iterations();
750
 
750
 
751
         alpha = rho / r_tld.dot(v);
751
         alpha = rho / r_tld.dot(v);
752
         s = r.array() - alpha*v.array();
752
         s = r.array() - alpha*v.array();
760
         tol2 = tol;
760
         tol2 = tol;
761
         max_it1 = 500000;
761
         max_it1 = 500000;
762
         t = implicitDCInvBPhi3(D, solver, ioms, s, tol2, max_it1);
762
         t = implicitDCInvBPhi3(D, solver, ioms, s, tol2, max_it1);
763
-        max_it1 = 0; //solver.iterations();
763
+        max_it1 = solver.iterations();
764
         omega = t.dot(s)  / t.dot(t);
764
         omega = t.dot(s)  / t.dot(t);
765
 
765
 
766
         r = s.array() - omega*t.array();
766
         r = s.array() - omega*t.array();

+ 1
- 1
src/EMSchur3DBase.cpp Переглянути файл

877
         // First set up grid stuff
877
         // First set up grid stuff
878
         if (Cvec) delete [] Cvec;
878
         if (Cvec) delete [] Cvec;
879
         //if (CSolver) delete [] CSolver;
879
         //if (CSolver) delete [] CSolver;
880
-        Cvec    = new Eigen::SparseMatrix<Complex, Eigen::RowMajor> [Omegas.size()];
880
+        Cvec    = new Eigen::SparseMatrix<Complex, Eigen::ColMajor> [Omegas.size()];
881
 
881
 
882
         //#ifdef LEMMAUSEOMP
882
         //#ifdef LEMMAUSEOMP
883
         //#pragma omp parallel for schedule(static, 1)
883
         //#pragma omp parallel for schedule(static, 1)

Завантаження…
Відмінити
Зберегти