Memosa-FVM  0.2
SpikeSolver.cpp
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifdef FVM_PARALLEL
6 #include <mpi.h>
7 #endif
8 
9 #include "SpikeSolver.h"
10 #include "LinearSystemMerger.h"
11 #include "CRConnectivity.h"
12 #include "SpikeStorage.h"
13 #include <set>
14 
15 
16 SpikeSolver::SpikeSolver(const SpikeStorage& spike_storage):
17 _spikeStorage(spike_storage)
18 {
19  logCtor();
20 
21 }
22 
24 {
25  logDtor();
26 }
27 
28 void
29 SpikeSolver::doSweeps(LinearSystem& ls, const int nSweeps)
30 {
31  const MultiFieldMatrix& m = ls.getMatrix();
32  MultiField& delta = ls.getDelta();
33  const MultiField& b = ls.getB();
34  MultiField& r = ls.getResidual();
35 
36  for(int i=0; i<nSweeps; i++)
37  {
38  m.spikeSolve(delta,b,r,_spikeStorage);
39  }
40 }
41 
42 
43 void
45 {
46 }
47 
48 MFRPtr
50 {
52  ls.getB(),
53  ls.getResidual());
54  MFRPtr rNorm0(ls.getResidual().getOneNorm());
55 
56 #ifdef FVM_PARALLEL
57  if (verbosity >0 && MPI::COMM_WORLD.Get_rank() == 0 )
58  cout << "0: " << *rNorm0 << "procID = " << MPI::COMM_WORLD.Get_rank() << endl;
59 #endif
60 
61 #ifndef FVM_PARALLEL
62  if ( verbosity > 0 )
63  cout << "0: " << *rNorm0 << endl;
64 #endif
65 
66  if (*rNorm0 < absoluteTolerance )
67  return rNorm0;
68 
69  for(int i=1; i<nMaxIterations; i++)
70  {
71  doSweeps(ls,1);
72 
74  ls.getB(),
75  ls.getResidual());
76  MFRPtr rNorm(ls.getResidual().getOneNorm());
77  MFRPtr normRatio((*rNorm)/(*rNorm0));
78 
79 #ifndef FVM_PARALLEL
80  if (verbosity >0 )
81  cout << i << ": " << *rNorm << endl;
82 #endif
83 
84 
85 #ifdef FVM_PARALLEL
86  if (*rNorm < absoluteTolerance || *normRatio < relativeTolerance || i == nMaxIterations-1)
87  if (verbosity >0 && MPI::COMM_WORLD.Get_rank() == 0 )
88  cout <<i << ": " << "procID = " << MPI::COMM_WORLD.Get_rank() << *rNorm << endl;
89 #endif
90 
91  if (*rNorm < absoluteTolerance || *normRatio < relativeTolerance)
92  break;
93 
94  }
95  return rNorm0;
96 }
97 
98 
99 void
101 {
102  doSweeps(ls,1);
103 }
void doSweeps(LinearSystem &ls, const int nSweeps)
Definition: SpikeSolver.cpp:29
MultiField & getResidual()
Definition: LinearSystem.h:35
#define logCtor()
Definition: RLogInterface.h:26
MultiField & getDelta()
Definition: LinearSystem.h:34
virtual void smooth(LinearSystem &ls)
virtual MFRPtr solve(LinearSystem &ls)
Definition: SpikeSolver.cpp:49
virtual void spikeSolve(IContainer &xB, const IContainer &bB, IContainer &tempB, const SpikeStorage &spike_storage) const
int nMaxIterations
Definition: LinearSolver.h:31
shared_ptr< MultiFieldReduction > getOneNorm() const
Definition: MultiField.cpp:216
double relativeTolerance
Definition: LinearSolver.h:33
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
#define logDtor()
Definition: RLogInterface.h:33
virtual void cleanup()
Definition: SpikeSolver.cpp:44
double absoluteTolerance
Definition: LinearSolver.h:34
SpikeSolver(const SpikeStorage &spike_storage)
Definition: SpikeSolver.cpp:16
const SpikeStorage & _spikeStorage
Definition: SpikeSolver.h:36
MultiField & getB()
Definition: LinearSystem.h:33
shared_ptr< MultiFieldReduction > MFRPtr
virtual ~SpikeSolver()
Definition: SpikeSolver.cpp:23
MultiFieldMatrix & getMatrix()
Definition: LinearSystem.h:37