00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _DIRICHLETVISCOUSTENSOREBBC_H_
00012 #define _DIRICHLETVISCOUSTENSOREBBC_H_
00013
00014 #include "RefCountedPtr.H"
00015
00016 #include "BaseEBBC.H"
00017 #include "BaseBCFuncEval.H"
00018 #include "LayoutData.H"
00019 #include "IntVectSet.H"
00020 #include "EBStencil.H"
00021 #include "NamespaceHeader.H"
00022 class VoFCache;
00023 class VoFStencil;
00024
00026
00028 class DirichletViscousTensorEBBC: public ViscousBaseEBBC
00029 {
00030 public:
00031
00033 DirichletViscousTensorEBBC();
00034
00036
00040 DirichletViscousTensorEBBC( const ProblemDomain& a_domain,
00041 const EBISLayout& a_layout,
00042 const RealVect& a_dx,
00043 const IntVect* a_ghostCellsPhi,
00044 const IntVect* a_ghostCellsRhs);
00045
00047
00049 virtual ~DirichletViscousTensorEBBC();
00050
00052
00054 virtual void define(const LayoutData<IntVectSet>& a_cfivs,
00055 const Real& a_factor);
00056
00057 virtual LayoutData<BaseIVFAB<VoFStencil> >* getFluxStencil(int ivar)
00058 {
00059 CH_assert((ivar >= 0) && (ivar < SpaceDim));
00060 m_nullReturned = false;
00061
00062
00063
00064
00065 LayoutData<BaseIVFAB<VoFStencil> >* retval = NULL;
00066 if(!m_nullReturned)
00067 {
00068
00069 return &m_fluxStencil[ivar];
00070 }
00071
00072 return retval;
00073 }
00074
00075 virtual void applyEBFlux(EBCellFAB& a_lphi,
00076 const EBCellFAB& a_phi,
00077 VoFIterator& a_vofit,
00078 const LayoutData<IntVectSet>& a_cfivs,
00079 const DataIndex& a_dit,
00080 const RealVect& a_probLo,
00081 const RealVect& a_dx,
00082 const Real& a_factor,
00083 const bool& a_useHomogeneous,
00084 const Real& a_time);
00086
00088 virtual void getEBFlux(Real& a_flux,
00089 const VolIndex& a_vof,
00090 const LevelData<EBCellFAB>& a_phi,
00091 const LayoutData<IntVectSet>& a_cfivs,
00092 const DataIndex& a_dit,
00093 const RealVect& a_probLo,
00094 const RealVect& a_dx,
00095 const bool& a_useHomogeneous,
00096 const Real& a_time,
00097 const pair<int,Real>* a_cacheHint=0 )
00098 {
00099 MayDay::Error();
00100 }
00101
00102
00103 protected:
00104 void getNormalStencil(VoFStencil& a_stencil,
00105 Real& a_weight,
00106 const VolIndex& a_vof,
00107 const EBISBox& a_ebisBox,
00108 const RealVect& a_dx,
00109 const IntVectSet& a_cfivs);
00110
00111 void getFluxStencil(VoFStencil* a_stencil,
00112 Real* a_weight,
00113 const DataIndex& a_dit,
00114 const VolIndex& a_vof,
00115 const EBISBox& a_ebisBox,
00116 const RealVect& a_dx,
00117 const IntVectSet& a_cfivs);
00118
00119
00120 bool getSecondOrderStencil(VoFStencil& a_stencil,
00121 Real& a_weight,
00122 Vector<VoFStencil>& a_pointStencil,
00123 Vector<Real>& a_distanceAlongLine,
00124 const VolIndex& a_vof,
00125 const EBISBox& a_ebisBox,
00126 const RealVect& a_dx,
00127 const IntVectSet& a_cfivs);
00128
00129 void getFirstOrderStencil(VoFStencil& a_stencil,
00130 Real& a_weight,
00131 const VolIndex& a_vof,
00132 const EBISBox& a_ebisBox,
00133 const RealVect& a_dx,
00134 const IntVectSet& a_cfivs);
00135
00136
00137 void getNormalGradFast(Real a_normalGrad[CH_SPACEDIM],
00138 const DataIndex& a_dit,
00139 const VolIndex & a_vof,
00140 const RealVect& a_probLo,
00141 const EBISBox & a_ebisBox);
00142
00143
00144
00145 void getNormalGradSlow(Real a_normalGrad[CH_SPACEDIM],
00146 const DataIndex& a_dit,
00147 const VolIndex & a_vof,
00148 const RealVect& a_probLo,
00149 const EBISBox & a_ebisBox,
00150 const EBCellFAB& a_phi);
00151
00152
00153 private:
00154 bool m_isDefined;
00155
00156 bool m_nullReturned;
00157
00158
00159 ProblemDomain m_domain;
00160 EBISLayout m_ebisl;
00161
00162 RealVect m_dx;
00163
00164
00165
00166 LayoutData<BaseIVFAB<VoFStencil> > m_fluxStencil[CH_SPACEDIM];
00167 LayoutData<BaseIVFAB<Real> > m_fluxWeight[CH_SPACEDIM];
00168 const IntVect m_ghostCellsPhi;
00169 const IntVect m_ghostCellsRHS;
00170
00171
00172 };
00173
00175
00177 class DirichletViscousTensorEBBCFactory: public BaseEBBCFactory
00178 {
00179 public:
00181
00183 DirichletViscousTensorEBBCFactory();
00184
00186
00188 virtual ~DirichletViscousTensorEBBCFactory();
00189
00190
00192
00194 virtual void setValue(Real a_value);
00195
00197
00199 virtual void setFunction(RefCountedPtr<BaseBCFuncEval> a_func);
00200
00202
00204 virtual DirichletViscousTensorEBBC* create( const ProblemDomain& a_domain,
00205 const EBISLayout& a_layout,
00206 const RealVect& a_dx,
00207 const IntVect* a_ghostCellsPhi,
00208 const IntVect* a_ghostCellsRhs);
00209
00210 protected:
00211
00212 private:
00213 bool m_isFunction;
00214
00215 Real m_value;
00216 RefCountedPtr<BaseBCFuncEval> m_func;
00217 const IntVect m_ghostCellsPhi;
00218 const IntVect m_ghostCellsRHS;
00219
00220 };
00221
00222
00223
00224 #include "NamespaceFooter.H"
00225 #endif