BISICLES AMR ice sheet model  0.9
AVCAMRPoissonOp.H
Go to the documentation of this file.
1 #ifdef CH_LANG_CC
2 /*
3  * _______ __
4  * / ___/ / ___ __ _ / / ___
5  * / /__/ _ \/ _ \/ V \/ _ \/ _ \
6  * \___/_//_/\___/_/_/_/_.__/\___/
7  * Please refer to Copyright.txt, in Chombo's root directory.
8  */
9 #endif
10 
11 #ifndef _AVCAMRPOISSONOP_H_
12 #define _AVCAMRPOISSONOP_H_
13 
14 #include "AMRPoissonOp.H"
15 #include "CoefficientInterpolator.H"
16 
17 #include "NamespaceHeader.H"
18 
20 
27 class AVCAMRPoissonOp : public AMRPoissonOp
28 {
29 public:
33 
35 
38  {
40  }
41 
43 
45  virtual ~AVCAMRPoissonOp()
46  {
47  }
48 
50  virtual void residualI(LevelData<FArrayBox>& a_lhs,
51  const LevelData<FArrayBox>& a_phi,
52  const LevelData<FArrayBox>& a_rhs,
53  bool a_homogeneous = false);
54 
56  virtual void preCond(LevelData<FArrayBox>& a_correction,
57  const LevelData<FArrayBox>& a_residual);
58 
60  virtual void applyOpI(LevelData<FArrayBox>& a_lhs,
61  const LevelData<FArrayBox>& a_phi,
62  bool a_homogeneous = false);
63 
64  virtual void applyOpNoBoundary(LevelData<FArrayBox>& a_lhs,
65  const LevelData<FArrayBox>& a_phi);
66 
73  virtual void restrictResidual(LevelData<FArrayBox>& a_resCoarse,
74  LevelData<FArrayBox>& a_phiFine,
75  const LevelData<FArrayBox>& a_rhsFine);
76 
82 
84  virtual void setAlphaAndBeta(const Real& a_alpha,
85  const Real& a_beta);
86 
88  virtual void setCoefs(const RefCountedPtr<LevelData<FArrayBox> >& a_aCoef,
89  const RefCountedPtr<LevelData<FluxBox> >& a_bCoef,
90  const Real& a_alpha,
91  const Real& a_beta);
92 
94  virtual void resetLambda();
95 
97  virtual void computeLambda();
98 
99  virtual void reflux(const LevelData<FArrayBox>& a_phiFine,
100  const LevelData<FArrayBox>& a_phi,
101  LevelData<FArrayBox>& a_residual,
102  AMRLevelOp<LevelData<FArrayBox> >* a_finerOp);
103 
106  void finerOperatorChanged(const MGLevelOp<LevelData<FArrayBox> >& a_operator,
109  int a_coarseningFactor);
110 
112  LevelData<FArrayBox>& identityCoef()
113  {
114  return *m_aCoef;
115  }
116 
122  void setBCoefInterpolator(RefCountedPtr<CoefficientInterpolator<LevelData<FluxBox>, LevelData<FArrayBox> > >& a_bCoefInterpolator)
123  {
124  m_bCoefInterpolator = a_bCoefInterpolator;
125  }
126 
128  LevelData<FluxBox>& BCoef()
129  {
130  return *m_bCoef;
131  }
132 
133  // Allows access to the B coefficient interpolator.
134  RefCountedPtr<CoefficientInterpolator<LevelData<FluxBox>, LevelData<FArrayBox> > > BCoefInterpolator()
135  {
136  return m_bCoefInterpolator;
137  }
138 
141  void setTime(Real a_time);
142 
144  RefCountedPtr<LevelData<FArrayBox> > m_aCoef;
145 
147  RefCountedPtr<LevelData<FluxBox> > m_bCoef;
148 
150  LevelData<FArrayBox> m_lambda;
151 
152 protected:
153  LayoutData<CFIVS> m_loCFIVS[SpaceDim];
154  LayoutData<CFIVS> m_hiCFIVS[SpaceDim];
155 
156  // Interpolator for b coefficient data.
157  RefCountedPtr<CoefficientInterpolator<LevelData<FluxBox>, LevelData<FArrayBox> > > m_bCoefInterpolator;
158 
159  // Current time.
160  Real m_time;
161 
162  // Does the relaxation coefficient need to be reset?
164 
165  virtual void levelGSRB(LevelData<FArrayBox>& a_phi,
166  const LevelData<FArrayBox>& a_rhs);
167 
168  virtual void levelMultiColor(LevelData<FArrayBox>& a_phi,
169  const LevelData<FArrayBox>& a_rhs);
170 
171  virtual void looseGSRB(LevelData<FArrayBox>& a_phi,
172  const LevelData<FArrayBox>& a_rhs);
173 
174  virtual void overlapGSRB(LevelData<FArrayBox>& a_phi,
175  const LevelData<FArrayBox>& a_rhs);
176 
177  virtual void levelGSRBLazy(LevelData<FArrayBox>& a_phi,
178  const LevelData<FArrayBox>& a_rhs);
179 
180  virtual void levelJacobi(LevelData<FArrayBox>& a_phi,
181  const LevelData<FArrayBox>& a_rhs);
182 
184  virtual void getFlux(FArrayBox& a_flux,
185  const FArrayBox& a_data,
186  const FluxBox& a_bCoef,
187  const Box& a_facebox,
188  int a_dir,
189  int a_ref = 1) const ;
190 #if 0
191  void computeOperatorNoBCs(LevelData<FArrayBox>& a_lhs,
193  const LevelData<FArrayBox>& a_phi);
194 #endif
195 };
196 
198 
201 class AVCAMRPoissonOpFactory: public AMRLevelOpFactory<LevelData<FArrayBox> >
202 {
203 public:
205 
207  {
208  }
209 
211 
224  void define(const ProblemDomain& a_coarseDomain,
225  const Vector<DisjointBoxLayout>& a_grids,
226  const Vector<int>& a_refRatios,
227  const Real& a_coarsedx,
228  BCHolder a_bc,
229  const Real& a_alpha,
230  Vector<RefCountedPtr<LevelData<FArrayBox> > >& a_aCoef,
231  const Real& a_beta,
232  Vector<RefCountedPtr<LevelData<FluxBox> > >& a_bCoef);
233 
243  void define(const ProblemDomain& a_coarseDomain,
244  const Vector<DisjointBoxLayout>& a_grids,
245  const Vector<int>& a_refRatios,
246  const Real& a_coarsedx,
247  BCHolder a_bc,
248  const IntVect& a_ghostVect);
249 
251  virtual MGLevelOp<LevelData<FArrayBox> >* MGnewOp(const ProblemDomain& a_FineindexSpace,
252  int a_depth,
253  bool a_homoOnly = true);
254 
256  virtual AMRLevelOp<LevelData<FArrayBox> >* AMRnewOp(const ProblemDomain& a_indexSpace);
257 
259  virtual int refToFiner(const ProblemDomain& a_domain) const;
260 
262 
263 private:
264  void setDefaultValues();
265 
266  Vector<ProblemDomain> m_domains;
267  Vector<DisjointBoxLayout> m_boxes;
268 
269  Vector<Real> m_dx;
270  Vector<int> m_refRatios; // refinement to next coarser level
271 
272  BCHolder m_bc;
273 
274  Real m_alpha;
275  Real m_beta;
276 
277  Vector<RefCountedPtr<LevelData<FArrayBox> > > m_aCoef;
278  Vector<RefCountedPtr<LevelData<FluxBox> > > m_bCoef;
279 
280  Vector<RefCountedPtr<LevelData<FArrayBox> > > m_lambda;
281 
282  Vector<Copier> m_exchangeCopiers;
283  Vector<CFRegion> m_cfregion;
284 };
285 
286 #include "NamespaceFooter.H"
287 #endif
virtual void levelGSRBLazy(LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs)
Definition: AVCAMRPoissonOp.cpp:684
virtual void levelJacobi(LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs)
Definition: AVCAMRPoissonOp.cpp:691
virtual void applyOpI(LevelData< FArrayBox > &a_lhs, const LevelData< FArrayBox > &a_phi, bool a_homogeneous=false)
Definition: AVCAMRPoissonOp.cpp:135
virtual void levelMultiColor(LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs)
Definition: AVCAMRPoissonOp.cpp:554
virtual void restrictResidual(LevelData< FArrayBox > &a_resCoarse, LevelData< FArrayBox > &a_phiFine, const LevelData< FArrayBox > &a_rhsFine)
Definition: AVCAMRPoissonOp.cpp:201
bool m_lambdaNeedsResetting
Definition: AVCAMRPoissonOp.H:163
virtual void setAlphaAndBeta(const Real &a_alpha, const Real &a_beta)
For tga stuff.
Definition: AVCAMRPoissonOp.cpp:267
virtual void setCoefs(const RefCountedPtr< LevelData< FArrayBox > > &a_aCoef, const RefCountedPtr< LevelData< FluxBox > > &a_bCoef, const Real &a_alpha, const Real &a_beta)
Also calls reset lambda.
Definition: AVCAMRPoissonOp.cpp:277
RefCountedPtr< LevelData< FArrayBox > > m_aCoef
Identity operator spatially varying coefficient storage (cell-centered) — if you change this call re...
Definition: AVCAMRPoissonOp.H:144
RefCountedPtr< CoefficientInterpolator< LevelData< FluxBox >, LevelData< FArrayBox > > > BCoefInterpolator()
Definition: AVCAMRPoissonOp.H:134
virtual void looseGSRB(LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs)
Definition: AVCAMRPoissonOp.cpp:561
RefCountedPtr< CoefficientInterpolator< LevelData< FluxBox >, LevelData< FArrayBox > > > m_bCoefInterpolator
Definition: AVCAMRPoissonOp.H:157
virtual void computeLambda()
Compute lambda once alpha, aCoef, beta, bCoef are defined.
Definition: AVCAMRPoissonOp.cpp:331
void setTime(Real a_time)
Definition: AVCAMRPoissonOp.cpp:787
LevelData< FluxBox > & BCoef()
Returns the B coefficient.
Definition: AVCAMRPoissonOp.H:128
Definition: AVCAMRPoissonOp.H:201
virtual void overlapGSRB(LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs)
Definition: AVCAMRPoissonOp.cpp:677
LayoutData< CFIVS > m_loCFIVS[SpaceDim]
Definition: AVCAMRPoissonOp.H:153
virtual ~AVCAMRPoissonOp()
Definition: AVCAMRPoissonOp.H:45
virtual void reflux(const LevelData< FArrayBox > &a_phiFine, const LevelData< FArrayBox > &a_phi, LevelData< FArrayBox > &a_residual, AMRLevelOp< LevelData< FArrayBox > > *a_finerOp)
Definition: AVCAMRPoissonOp.cpp:343
virtual ~AVCAMRPoissonOpFactory()
Definition: AVCAMRPoissonOp.H:206
virtual void preCond(LevelData< FArrayBox > &a_correction, const LevelData< FArrayBox > &a_residual)
Definition: AVCAMRPoissonOp.cpp:99
virtual void levelGSRB(LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs)
Definition: AVCAMRPoissonOp.cpp:449
RefCountedPtr< LevelData< FluxBox > > m_bCoef
Laplacian operator spatially varying coefficient storage (face-centered) — if you change this call r...
Definition: AVCAMRPoissonOp.H:147
AVCAMRPoissonOp()
Definition: AVCAMRPoissonOp.H:37
void computeOperatorNoBCs(LevelData< FArrayBox > &a_lhs, const LevelData< FArrayBox > &a_phi)
utility function which computes operator after all bc&#39;s have been set
virtual void residualI(LevelData< FArrayBox > &a_lhs, const LevelData< FArrayBox > &a_phi, const LevelData< FArrayBox > &a_rhs, bool a_homogeneous=false)
Definition: AVCAMRPoissonOp.cpp:30
virtual void getFlux(FArrayBox &a_flux, const FArrayBox &a_data, const FluxBox &a_bCoef, const Box &a_facebox, int a_dir, int a_ref=1) const
computes flux over face-centered a_facebox.
Definition: AVCAMRPoissonOp.cpp:716
Real m_time
Definition: AVCAMRPoissonOp.H:160
LevelData< FArrayBox > m_lambda
Reciprocal of the diagonal entry of the operator matrix.
Definition: AVCAMRPoissonOp.H:150
virtual void applyOpNoBoundary(LevelData< FArrayBox > &a_lhs, const LevelData< FArrayBox > &a_phi)
Definition: AVCAMRPoissonOp.cpp:153
LevelData< FArrayBox > & identityCoef()
Returns identity coefficient data.
Definition: AVCAMRPoissonOp.H:112
int m_coefficient_average_type
Definition: AVCAMRPoissonOp.H:261
LayoutData< CFIVS > m_hiCFIVS[SpaceDim]
Definition: AVCAMRPoissonOp.H:154
void setBCoefInterpolator(RefCountedPtr< CoefficientInterpolator< LevelData< FluxBox >, LevelData< FArrayBox > > > &a_bCoefInterpolator)
Definition: AVCAMRPoissonOp.H:122
void finerOperatorChanged(const MGLevelOp< LevelData< FArrayBox > > &a_operator, int a_coarseningFactor)
Definition: AVCAMRPoissonOp.cpp:1133
virtual void resetLambda()
Should be called before the relaxation parameter is needed.
Definition: AVCAMRPoissonOp.cpp:292
Definition: AVCAMRPoissonOp.H:27