00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _BASEEBBC_H_
00012 #define _BASEEBBC_H_
00013
00014 #include "RealVect.H"
00015 #include "ProblemDomain.H"
00016
00017 #include "VolIndex.H"
00018 #include "EBISLayout.H"
00019 #include "EBCellFAB.H"
00020 #include "EBFluxFAB.H"
00021 #include "EBStencil.H"
00022 #include "Stencils.H"
00023 #include "EBLevelGrid.H"
00024 #include "BaseBCFuncEval.H"
00025 #include "NamespaceHeader.H"
00026
00027
00028
00029
00030
00031 class BaseEBBC
00032 {
00033 public:
00034 BaseEBBC()
00035 {
00036 m_dataBased = false;
00037 }
00038
00039 virtual ~BaseEBBC()
00040 {
00041 }
00042
00043 virtual void define(const LayoutData<IntVectSet>& a_cfivs,
00044 const Real& a_factor) = 0;
00045
00046
00047 virtual void getEBFlux(Real& a_flux,
00048 const VolIndex& a_vof,
00049 const LevelData<EBCellFAB>& a_phi,
00050 const LayoutData<IntVectSet>& a_cfivs,
00051 const DataIndex& a_dit,
00052 const RealVect& a_probLo,
00053 const RealVect& a_dx,
00054 const bool& a_useHomogeneous,
00055 const Real& a_time,
00056 const pair<int,Real>* a_cacheHint=0 )
00057 {
00058
00059 MayDay::Error("how did this get called?");
00060 }
00061
00062
00063
00064
00065
00066
00067
00068 virtual LayoutData<BaseIVFAB<VoFStencil> >* getFluxStencil(int ivar)= 0;
00069
00070
00071
00072
00073
00074 virtual void applyEBFlux(EBCellFAB& a_lphi,
00075 const EBCellFAB& a_phi,
00076 VoFIterator& a_vofit,
00077 const LayoutData<IntVectSet>& a_cfivs,
00078 const DataIndex& a_dit,
00079 const RealVect& a_probLo,
00080 const RealVect& a_dx,
00081 const Real& a_factor,
00082 const bool& a_useHomogeneous,
00083 const Real& a_time) = 0;
00084
00085 virtual void setData( RefCountedPtr<LevelData<BaseIVFAB<Real> > >& a_data)
00086 {
00087 m_data = a_data;
00088 m_dataBased = true;
00089 }
00090
00091 bool dataBased() const
00092 {
00093 return m_dataBased;
00094 }
00095 protected:
00096
00097 RefCountedPtr<LevelData<BaseIVFAB<Real> > > m_data;
00098 bool m_dataBased;
00099
00100 };
00101
00102
00103
00104
00105 class ViscousBaseEBBC: public BaseEBBC
00106 {
00107 public:
00108
00109
00110
00111 ViscousBaseEBBC()
00112 {
00113 m_coefSet = false;
00114 m_value = 12345.6789;
00115 m_func = RefCountedPtr<BaseBCFuncEval>();
00116 m_isFunction = false;
00117 }
00118 virtual ~ViscousBaseEBBC()
00119 {
00120 }
00121
00122
00123
00124
00125 void setCoef(EBLevelGrid & a_eblg,
00126 Real & a_beta,
00127 RefCountedPtr<LevelData<BaseIVFAB<Real> > >& a_eta,
00128 RefCountedPtr<LevelData<BaseIVFAB<Real> > >& a_lambda,
00129 RefCountedPtr<LevelData< EBFluxFAB > >& a_etaOpen,
00130 RefCountedPtr<LevelData< EBFluxFAB > >& a_lambdaOpen
00131 )
00132 {
00133 m_coefSet = true;
00134 m_beta = a_beta;
00135 m_eblg = a_eblg;
00136 m_eta = a_eta;
00137 m_lambda = a_lambda;
00138 m_etaOpen = a_etaOpen;
00139 m_lambdaOpen = a_lambdaOpen;
00140 }
00141
00142
00143
00144
00145 virtual void setValue(Real a_value)
00146 {
00147 m_value = a_value;
00148 m_func = RefCountedPtr<BaseBCFuncEval>();
00149
00150 m_isFunction = false;
00151 }
00152
00153
00154
00155
00156
00157 virtual void setFunction(RefCountedPtr<BaseBCFuncEval> a_func)
00158 {
00159 m_value = 12345.6789;
00160 m_func = a_func;
00161
00162 m_isFunction = true;
00163 }
00164
00165 void
00166 getBoundaryGrad(Real a_grad[CH_SPACEDIM][CH_SPACEDIM],
00167 const VolIndex& a_vof,
00168 const RealVect& a_dx,
00169 const RealVect& a_probLo,
00170 const EBISBox& a_ebisBox)
00171 {
00172 for (int comp = 0; comp < SpaceDim; comp++)
00173 {
00174 for (int derivDir = 0; derivDir < SpaceDim; derivDir++)
00175 {
00176 Real value;
00177 if (m_isFunction)
00178 {
00179
00180 RealVect startPt = a_ebisBox.bndryCentroid(a_vof);
00181 startPt *= a_dx[0];
00182 startPt += a_probLo;
00183 RealVect point = EBArith::getVofLocation(a_vof, a_dx, startPt);
00184 value = m_func->derivative(point, comp, derivDir);
00185 }
00186 else
00187 {
00188 value = m_value;
00189 }
00190 a_grad[comp][derivDir] = value;
00191 }
00192 }
00193 }
00194
00195 void
00196 getFluxFromGrad(Real a_flux[CH_SPACEDIM][CH_SPACEDIM],
00197 const Real a_grad[CH_SPACEDIM][CH_SPACEDIM],
00198 const VolIndex& a_vof,
00199 const DataIndex& a_dit)
00200 {
00201
00202 Real divergence = 0;
00203 for (int divDir = 0; divDir < SpaceDim; divDir++)
00204 {
00205 divergence += a_grad[divDir][divDir];
00206 }
00207
00208 Real lambda = (*m_lambda)[a_dit](a_vof, 0);
00209 Real eta = (*m_eta)[a_dit](a_vof, 0);
00210
00211 for (int comp = 0; comp < SpaceDim; comp++)
00212 {
00213 for (int derivDir = 0; derivDir < SpaceDim; derivDir++)
00214 {
00215 a_flux[comp][derivDir] = eta*(a_grad[comp][derivDir] + a_grad[derivDir][comp]);
00216 if (comp == derivDir)
00217 {
00218 a_flux[comp][derivDir] += lambda*divergence;
00219 }
00220 }
00221 }
00222 }
00223
00224 void
00225 getChangeInSolution(Real a_deltaLph[CH_SPACEDIM],
00226 const Real a_flux[CH_SPACEDIM][CH_SPACEDIM],
00227 const RealVect& a_dx,
00228 const VolIndex& a_vof,
00229 const DataIndex& a_dit,
00230 const EBISBox& a_ebisBox)
00231 {
00232 Real beta = m_beta;
00233 RealVect normal = a_ebisBox.normal(a_vof);
00234 Real areaFrac = a_ebisBox.bndryArea(a_vof);
00235
00236
00237
00238 for (int comp = 0; comp < SpaceDim; comp++)
00239 {
00240 a_deltaLph[comp] = 0;
00241 for (int derivDir = 0; derivDir < SpaceDim; derivDir++)
00242 {
00243 a_deltaLph[comp] -= a_flux[comp][derivDir]*beta*areaFrac*normal[derivDir]/a_dx[0];
00244 }
00245 }
00246 }
00247 protected:
00248 bool m_isFunction;
00249
00250
00251 Real m_value;
00252 RefCountedPtr<BaseBCFuncEval> m_func;
00253
00254
00255 EBLevelGrid m_eblg;
00256 bool m_coefSet;
00257 Real m_beta;
00258 RefCountedPtr<LevelData<BaseIVFAB<Real> > > m_eta;
00259 RefCountedPtr<LevelData<BaseIVFAB<Real> > > m_lambda;
00260
00261 RefCountedPtr<LevelData<EBFluxFAB > > m_etaOpen;
00262 RefCountedPtr<LevelData<EBFluxFAB > > m_lambdaOpen;
00263
00264 };
00265
00266
00267
00268
00269 class ConductivityBaseEBBC: public BaseEBBC
00270 {
00271 public:
00272
00273
00274
00275 ConductivityBaseEBBC()
00276 {
00277 m_coefSet = false;
00278 m_dataBased = false;
00279 }
00280
00281 virtual ~ConductivityBaseEBBC()
00282 {
00283 }
00284
00285
00286
00287
00288
00289 void setCoef(EBLevelGrid & a_eblg,
00290 Real & a_beta,
00291 RefCountedPtr<LevelData<BaseIVFAB<Real> > >& a_bcoe)
00292 {
00293 m_coefSet = true;
00294 m_beta = a_beta;
00295 m_eblg = a_eblg;
00296 m_bcoe = a_bcoe;
00297 }
00298
00299
00300 protected:
00301
00302 EBLevelGrid m_eblg;
00303 bool m_coefSet;
00304 Real m_beta;
00305 RefCountedPtr<LevelData<BaseIVFAB<Real> > > m_bcoe;
00306
00307 };
00308
00309
00310
00311 class BaseEBBCFactory
00312 {
00313 public:
00314 BaseEBBCFactory()
00315 {
00316 }
00317
00318 virtual ~BaseEBBCFactory()
00319 {
00320 }
00321
00322
00323
00324
00325 virtual BaseEBBC* create(const ProblemDomain& a_domain,
00326 const EBISLayout& a_layout,
00327 const RealVect& a_dx,
00328 const IntVect* a_ghostCellsPhi=0,
00329 const IntVect* a_ghostCellsRhs=0 ) = 0;
00330 };
00331
00332 #include "NamespaceFooter.H"
00333 #endif