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
00025
00027 class EBStencil
00028 {
00029 public:
00031
00034 ~EBStencil();
00035
00037
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
00052
00054
00060 EBStencil(const Vector<VolIndex>& a_srcVofs,
00061 const Vector<VoFStencil>& a_vofStencil,
00062 const Box& a_boxLph,
00063 const Box& a_boxPhi,
00064 const EBISBox& a_ebisBoxLph,
00065 const EBISBox& a_ebisBoxPhi,
00066 const IntVect& a_ghostVectLph,
00067 const IntVect& a_ghostVectPhi,
00068 int a_varDest = 0);
00069
00070
00072
00077 void
00078 apply(EBCellFAB& a_lofphi, const EBCellFAB& a_phi, bool incrementOnly = false) const;
00079
00080
00082
00091 void
00092 apply(EBCellFAB& a_lofphi, const EBCellFAB& a_phi,
00093 const BaseIVFAB<Real>& a_alphaWeight,
00094 Real a_alpha, Real a_beta, bool incrementOnly = false) const;
00095
00097 void
00098 relax(EBCellFAB& a_phi,
00099 const EBCellFAB& a_rhs,
00100 const BaseIVFAB<Real>& a_alphaWeight,
00101 const BaseIVFAB<Real>& a_betaWeight,
00102 Real a_alpha, Real a_beta, Real a_safety) const;
00103
00105
00108 void
00109 cache(const EBCellFAB& a_lphi) const;
00110
00112
00115 void
00116 cachePhi(const EBCellFAB& a_lphi) const;
00117
00118
00120
00123 void
00124 uncache(EBCellFAB& a_lphi) const;
00125
00127
00130 void
00131 uncachePhi(EBCellFAB& a_phi) const;
00132
00133
00135
00138 void
00139 computeOffsets(const Vector<VolIndex>& a_srcVoFs, const BaseIVFAB<VoFStencil>& a_vofstencil);
00140
00141
00142 struct {
00143 int offset;
00144 bool multiValued;
00145 } typedef destTerm_t;
00146
00147 struct {
00148 int offset;
00149 Real weight;
00150
00151
00152 } typedef stencilTerm;
00153
00154 struct {
00155 Vector<stencilTerm> single;
00156 Vector<stencilTerm> multi;
00157 } typedef ebstencil_t;
00158
00159 protected:
00160
00161 Box m_box;
00162 EBISBox m_ebisBox;
00163 Box m_lphBox;
00164 Box m_phiBox;
00165 IntVect m_ghostVectPhi;
00166 IntVect m_ghostVectLph;
00167 int m_destVar;
00168 Vector<ebstencil_t> m_ebstencil;
00169 Vector<destTerm_t> m_destTerms;
00170 Vector<destTerm_t> m_sourTerms;
00171 Vector<int> m_alphaBeta;
00172 mutable Vector<Real> m_cache;
00173 mutable Vector<Real> m_cachePhi;
00174
00175
00176 bool m_doRelaxOpt;
00177 private:
00179
00180
00181
00182 EBStencil()
00183 {
00184 MayDay::Error("invalid operator");
00185 }
00186
00188
00189
00190
00191 void
00192 operator=(const EBStencil& stenin)
00193 {
00194 MayDay::Error("invalid operator");
00195 }
00196
00198
00199
00200
00201 EBStencil(const EBStencil& stenin)
00202 {
00203 MayDay::Error("invalid operator");
00204 }
00205
00206 };
00207
00208
00209 #include "NamespaceFooter.H"
00210 #endif