00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _STENCILS_H_
00012 #define _STENCILS_H_
00013
00014 #include "Vector.H"
00015 #include "VolIndex.H"
00016 #include "FaceIndex.H"
00017 #include "REAL.H"
00018 #include "NamespaceHeader.H"
00019
00021
00027 class VoFStencil
00028 {
00029 public:
00031
00034 VoFStencil();
00035
00037 ~VoFStencil();
00038
00040 void clear();
00041
00043
00049 void
00050 add(const VolIndex& vof,const Real& weight, int ivar = 0);
00051
00053
00056 int
00057 size() const;
00058
00060
00063 const VolIndex&
00064 vof(int i) const;
00065
00067
00070 const Real&
00071 weight(int i) const;
00072
00074
00077 Real& weight(int i);
00078
00079
00081 const int& variable(int i) const;
00082
00084 int& variable(int i);
00085
00087
00095 VoFStencil&
00096 operator+=(const VoFStencil& a_vofsten);
00097
00099
00101 void operator*=(const Real& scaling);
00102
00104 VoFStencil&
00105 operator=(const VoFStencil& a_vofsten);
00106
00108 VoFStencil(const VoFStencil& a_vofstenin);
00109
00110 void setAllVariables(int a_var)
00111 {
00112 if(vofs.size() > 0)
00113 {
00114 variables = Vector<int>(vofs.size(), a_var);
00115 }
00116 }
00117 protected:
00118
00120 Vector<VolIndex> vofs;
00122 Vector<Real> weights;
00123
00124 Vector<int> variables;
00125 };
00126
00128
00131 class FaceStencil
00132 {
00133 public:
00135 FaceStencil();
00136
00138 ~FaceStencil();
00139
00141 void clear();
00142
00144
00149 void
00150 add(const FaceIndex& face,const Real& weight, int variable=0);
00151
00153
00156 int
00157 size() const;
00158
00160
00162 const FaceIndex&
00163 face(int i) const;
00164
00166
00169 const Real&
00170 weight(int i) const;
00171
00173 const int& variable(int i) const;
00174
00176 int& variable(int i);
00177
00179
00187 FaceStencil&
00188 operator+=(const FaceStencil& a_facesten);
00189
00191 FaceStencil&
00192 operator=(const FaceStencil& a_facesten);
00193
00195 FaceStencil(const FaceStencil& a_facesten);
00196
00198
00200 void operator*=(const Real& scaling);
00201
00202 private:
00204 Vector<FaceIndex> faces;
00206 Vector<Real> weights;
00208 Vector<int> variables;
00209
00210 };
00211
00212 class EBCellFAB;
00213 class EBFaceFAB;
00215 extern Real applyVoFStencil(const VoFStencil& a_vofSten, const EBCellFAB& a_fab, const int& a_comp);
00216
00218 extern Real applyFaceStencil(const FaceStencil& a_faceSten, const EBFaceFAB& a_fab, const int& a_comp);
00219
00222
00223 inline int
00224 VoFStencil::size() const
00225 {
00226 return weights.size();
00227 }
00228
00229
00230 inline const VolIndex&
00231 VoFStencil::vof(int i) const
00232 {
00233 return vofs[i];
00234 }
00235
00236
00237 inline const Real&
00238 VoFStencil::weight(int i) const
00239 {
00240 return weights[i];
00241 }
00242
00243 inline Real&
00244 VoFStencil::weight(int i)
00245 {
00246 return weights[i];
00247 }
00248
00249 #ifdef CH_EXPLICIT_TEMPLATES
00250
00251
00252
00253 inline int linearSize( const FaceStencil& fs )
00254 {
00255 CH_assert(0);
00256 return -1;
00257 }
00258 template<> inline
00259 void linearIn<FaceStencil>(FaceStencil& a_outputT, const void* const inBuf)
00260 {
00261 CH_assert(0);
00262 }
00263 template<> inline
00264 void linearOut<FaceStencil>(void* const a_outBuf, const FaceStencil& a_inputT)
00265 {
00266 CH_assert(0);
00267 }
00268
00269
00270 inline int linearSize( const VoFStencil& fs )
00271 {
00272 CH_assert(0);
00273 return -1;
00274 }
00275 template<> inline
00276 void linearIn<VoFStencil>(VoFStencil& a_outputT, const void* const inBuf)
00277 {
00278 CH_assert(0);
00279 }
00280 template<> inline
00281 void linearOut<VoFStencil>(void* const a_outBuf, const VoFStencil& a_inputT)
00282 {
00283 CH_assert(0);
00284 }
00285
00286
00287 inline int linearSize( const bool& fs )
00288 {
00289 CH_assert(0);
00290 return -1;
00291 }
00292 template<> inline
00293 void linearIn<bool>(bool& a_outputT, const void* const inBuf)
00294 {
00295 CH_assert(0);
00296 }
00297 template<> inline
00298 void linearOut<bool>(void* const a_outBuf, const bool& a_inputT)
00299 {
00300 CH_assert(0);
00301 }
00302
00303
00304 #endif // CH_EXPLICIT_TEMPLATES
00305
00306
00307 #include "NamespaceFooter.H"
00308 #endif