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 "BaseIndex.H"
00017 #include "FaceIndex.H"
00018 #include "REAL.H"
00019 #include "NamespaceHeader.H"
00020 using std::string;
00021
00022
00023
00024
00025
00026 class BaseStencil
00027 {
00028 public:
00029
00030 BaseStencil()
00031 {
00032 }
00033
00034
00035 virtual ~BaseStencil()
00036 {
00037 }
00038
00039
00040 virtual int size() const = 0;
00041
00042
00043 virtual const BaseIndex& index(int isten) const = 0;
00044
00045
00046
00047 virtual const Real& weight(int isten) const = 0;
00048
00049
00050 virtual const int& variable(int isten) const = 0;
00051 };
00052
00053
00054
00055
00056
00057
00058
00059
00060 class VoFStencil: public BaseStencil
00061 {
00062 public:
00063
00064
00065
00066
00067 VoFStencil();
00068
00069
00070 virtual ~VoFStencil();
00071
00072
00073 void clear();
00074
00075
00076
00077
00078
00079
00080
00081
00082 void
00083 add(const VolIndex& vof,const Real& weight, int ivar = 0);
00084
00085
00086
00087
00088
00089 virtual int size() const;
00090
00091
00092
00093
00094
00095 const VolIndex& vof(int i) const;
00096
00097
00098
00099
00100 virtual BaseIndex& index(int i) const
00101 {
00102 return (BaseIndex&)(vof(i));
00103 }
00104
00105
00106
00107
00108
00109 virtual const Real& weight(int i) const;
00110
00111
00112
00113
00114
00115 virtual Real& weight(int i);
00116
00117
00118
00119
00120
00121 void shift(const IntVect& a_shift);
00122
00123
00124 virtual const int& variable(int i) const;
00125
00126
00127 virtual int& variable(int i);
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 VoFStencil&
00139 operator+=(const VoFStencil& a_vofsten);
00140
00141
00142
00143
00144 void operator*=(const Real& scaling);
00145
00146
00147 VoFStencil&
00148 operator=(const VoFStencil& a_vofsten);
00149
00150
00151 VoFStencil(const VoFStencil& a_vofstenin);
00152
00153 void setAllVariables(int a_var)
00154 {
00155 if (vofs.size() > 0)
00156 {
00157 variables = Vector<int>(vofs.size(), a_var);
00158 }
00159 }
00160
00161 void getExponentAndMantissa(Real& a_mantissa, int& a_exp, Real a_input) const;
00162
00163
00164 void poutFortranRelative(const IntVect& a_startIV, const string& a_prefix, const Real& wgtScaling) const;
00165
00166 void outputToPout() const;
00167 protected:
00168
00169
00170 Vector<VolIndex> vofs;
00171
00172 Vector<Real> weights;
00173
00174 Vector<int> variables;
00175 };
00176
00177
00178
00179
00180
00181 class FaceStencil: public BaseStencil
00182 {
00183 public:
00184
00185 FaceStencil();
00186
00187
00188 virtual ~FaceStencil();
00189
00190
00191 void clear();
00192
00193
00194
00195
00196
00197
00198
00199 void add(const FaceIndex& face,const Real& weight, int variable=0);
00200
00201
00202
00203
00204
00205 void shift(const IntVect& a_shift);
00206
00207
00208
00209
00210
00211 virtual int size() const;
00212
00213
00214 void setAllVariables(int a_var)
00215 {
00216 if (faces.size() > 0)
00217 {
00218 variables = Vector<int>(faces.size(), a_var);
00219 }
00220 }
00221
00222
00223
00224
00225 const FaceIndex& face(int i) const;
00226
00227
00228
00229
00230
00231 virtual const Real& weight(int i) const;
00232
00233
00234 virtual BaseIndex& index(int i) const
00235 {
00236 return (BaseIndex&)(face(i));
00237 }
00238
00239
00240 virtual const int& variable(int i) const;
00241
00242
00243 virtual int& variable(int i);
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 FaceStencil& operator+=(const FaceStencil& a_facesten);
00255
00256
00257 FaceStencil& operator=(const FaceStencil& a_facesten);
00258
00259
00260 FaceStencil(const FaceStencil& a_facesten);
00261
00262
00263
00264
00265 void operator*=(const Real& scaling);
00266
00267 void outputToPout() const;
00268 private:
00269
00270
00271 Vector<FaceIndex> faces;
00272
00273 Vector<Real> weights;
00274
00275 Vector<int> variables;
00276
00277 };
00278
00279 class EBCellFAB;
00280 class EBFaceFAB;
00281
00282 extern Real applyVoFStencil(const VoFStencil& a_vofSten, const EBCellFAB& a_fab, const int& a_comp);
00283
00284
00285 extern Real applyFaceStencil(const FaceStencil& a_faceSten, const EBFaceFAB& a_fab, const int& a_comp);
00286
00287
00288
00289
00290 inline int
00291 VoFStencil::size() const
00292 {
00293 return weights.size();
00294 }
00295
00296
00297 inline const VolIndex&
00298 VoFStencil::vof(int i) const
00299 {
00300 return vofs[i];
00301 }
00302
00303
00304 inline const Real&
00305 VoFStencil::weight(int i) const
00306 {
00307 return weights[i];
00308 }
00309
00310 inline Real&
00311 VoFStencil::weight(int i)
00312 {
00313 return weights[i];
00314 }
00315
00316 #ifdef CH_EXPLICIT_TEMPLATES
00317
00318
00319
00320 inline int linearSize( const FaceStencil& fs )
00321 {
00322 CH_assert(0);
00323 return -1;
00324 }
00325 template<> inline
00326 void linearIn<FaceStencil>(FaceStencil& a_outputT, const void* const inBuf)
00327 {
00328 CH_assert(0);
00329 }
00330 template<> inline
00331 void linearOut<FaceStencil>(void* const a_outBuf, const FaceStencil& a_inputT)
00332 {
00333 CH_assert(0);
00334 }
00335
00336
00337 inline int linearSize( const VoFStencil& fs )
00338 {
00339 CH_assert(0);
00340 return -1;
00341 }
00342 template<> inline
00343 void linearIn<VoFStencil>(VoFStencil& a_outputT, const void* const inBuf)
00344 {
00345 CH_assert(0);
00346 }
00347 template<> inline
00348 void linearOut<VoFStencil>(void* const a_outBuf, const VoFStencil& a_inputT)
00349 {
00350 CH_assert(0);
00351 }
00352
00353
00354 inline int linearSize( const bool& fs )
00355 {
00356 CH_assert(0);
00357 return -1;
00358 }
00359 template<> inline
00360 void linearIn<bool>(bool& a_outputT, const void* const inBuf)
00361 {
00362 CH_assert(0);
00363 }
00364 template<> inline
00365 void linearOut<bool>(void* const a_outBuf, const bool& a_inputT)
00366 {
00367 CH_assert(0);
00368 }
00369
00370
00371 #endif // CH_EXPLICIT_TEMPLATES
00372
00373
00374 #include "NamespaceFooter.H"
00375 #endif