00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _EBSTENCIL_H_
00012 #define _EBSTENCIL_H_
00013
00014 #include "Stencils.H"
00015 #include "Vector.H"
00016 #include "VolIndex.H"
00017 #include "REAL.H"
00018 #include "Box.H"
00019 #include "FArrayBox.H"
00020 #include "EBIndexSpace.H"
00021 #include "EBCellFAB.H"
00022 #include "NamespaceHeader.H"
00023
00024
00025
00026
00027 class EBStencil
00028 {
00029 public:
00030
00031
00032
00033
00034 ~EBStencil();
00035
00036
00037
00038
00039
00040
00041
00042
00043 EBStencil(const Vector<VolIndex>& a_srcVofs,
00044 const BaseIVFAB<VoFStencil>& a_vofstencil,
00045 const Box& a_box,
00046 const EBISBox& a_ebisbox,
00047 const IntVect& a_ghostVectPhi,
00048 const IntVect& a_ghostVectLph,
00049 int a_varDest = 0,
00050 bool a_doRelaxOpt = false,
00051 int ncomp = 1,
00052 IntVectSet a_setIrreg = IntVectSet(),
00053 bool a_useInputSets = false);
00054
00055
00056
00057
00058
00059
00060
00061
00062 EBStencil(const Vector<VolIndex>& a_srcVofs,
00063 const Vector<VoFStencil>& a_vofStencil,
00064 const Box& a_boxLph,
00065 const Box& a_boxPhi,
00066 const EBISBox& a_ebisBoxLph,
00067 const EBISBox& a_ebisBoxPhi,
00068 const IntVect& a_ghostVectLph,
00069 const IntVect& a_ghostVectPhi,
00070 int a_varDest = 0,
00071 int ncomp = 1,
00072 IntVectSet a_setIrreg = IntVectSet(),
00073 bool a_useInputSets = false);
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 void
00086 apply(EBCellFAB& a_lofphi, const EBCellFAB& a_phi, bool incrementOnly = false, int ivar = 0) const;
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 void
00100 apply(EBCellFAB& a_lofphi, const EBCellFAB& a_phi,
00101 const BaseIVFAB<Real>& a_alphaWeight,
00102 Real a_alpha, Real a_beta, bool incrementOnly = false) const;
00103
00104 void
00105 apply(EBCellFAB& a_lofphi,
00106 const EBCellFAB& a_phi,
00107 const Real a_lambdaFactor,
00108 const Real a_alpha,
00109 const BaseIVFAB<Real>& a_alphaWeight,
00110 const Real a_beta,
00111 const BaseIVFAB<Real>& a_betaWeight,
00112 Real a_one,
00113 bool incrementOnly = false) const;
00114
00115 void
00116 applyInhomDomBC(EBCellFAB& a_lofphi,
00117 const EBCellFAB& a_phi,
00118 const Real a_factor) const;
00119
00120
00121 void
00122 relax(EBCellFAB& a_phi,
00123 const EBCellFAB& a_rhs,
00124 const BaseIVFAB<Real>& a_alphaWeight,
00125 const BaseIVFAB<Real>& a_betaWeight,
00126 Real a_alpha, Real a_beta, Real a_safety) const;
00127
00128
00129 void
00130 relaxClone(EBCellFAB& a_phi,
00131 const EBCellFAB& a_phiOld,
00132 const EBCellFAB& a_rhs,
00133 const BaseIVFAB<Real>& a_alphaWeight,
00134 const BaseIVFAB<Real>& a_betaWeight,
00135 Real a_alpha, Real a_beta, Real a_safety) const;
00136
00137
00138
00139
00140
00141
00142 void
00143 cache(const EBCellFAB& a_lphi, int a_ivar = 0) const;
00144
00145
00146
00147
00148
00149
00150 void
00151 cachePhi(const EBCellFAB& a_lphi, int a_ivar = 0) const;
00152
00153
00154
00155
00156
00157
00158
00159 void
00160 uncache(EBCellFAB& a_lphi, int a_ivar = 0) const;
00161
00162
00163
00164
00165
00166
00167 void
00168 uncachePhi(EBCellFAB& a_phi, int a_ivar = 0) const;
00169
00170
00171
00172
00173
00174
00175 void
00176 computeOffsets(const Vector<VolIndex>& a_srcVoFs, const BaseIVFAB<VoFStencil>& a_vofstencil);
00177
00178
00179 struct
00180 {
00181 int offset;
00182 bool multiValued;
00183 } typedef destTerm_t;
00184
00185 struct
00186 {
00187 int offset;
00188 Real weight;
00189
00190
00191 } typedef stencilTerm;
00192
00193 struct
00194 {
00195 Vector<stencilTerm> single;
00196 Vector<stencilTerm> multi;
00197 } typedef ebstencil_t;
00198
00199 protected:
00200
00201 Box m_box;
00202 EBISBox m_ebisBox;
00203 Box m_lphBox;
00204 Box m_phiBox;
00205 IntVect m_ghostVectPhi;
00206 IntVect m_ghostVectLph;
00207 int m_destVar;
00208 Vector<ebstencil_t> m_ebstencil;
00209 Vector<destTerm_t> m_destTerms;
00210 Vector<destTerm_t> m_sourTerms;
00211 Vector<int> m_alphaBeta;
00212 mutable Vector<Real> m_cacheLph;
00213 mutable Vector<Real> m_cachePhi;
00214 bool m_doRelaxOpt;
00215 int m_nComp;
00216 IntVectSet m_setIrreg;
00217 bool m_useInputSets;
00218
00219
00220 private:
00221
00222
00223
00224
00225 EBStencil()
00226 {
00227 MayDay::Error("invalid operator");
00228 }
00229
00230
00231
00232
00233
00234 void
00235 operator=(const EBStencil& stenin)
00236 {
00237 MayDay::Error("invalid operator");
00238 }
00239
00240
00241
00242
00243
00244 EBStencil(const EBStencil& stenin)
00245 {
00246 MayDay::Error("invalid operator");
00247 }
00248
00249 };
00250
00251
00252 #include "NamespaceFooter.H"
00253 #endif