00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _DIRICHLETVISCOUSTENSORDOMAINBC_H_
00012 #define _DIRICHLETVISCOUSTENSORDOMAINBC_H_
00013
00014 #include "RefCountedPtr.H"
00015 #include "BCFunc.H"
00016 #include "ViscousBaseDomainBC.H"
00017 #include "BaseBCFuncEval.H"
00018 #include "NamespaceHeader.H"
00019
00020
00021
00022
00023 class DirichletViscousTensorDomainBC: public ViscousBaseDomainBC
00024 {
00025 public:
00026
00027
00028
00029 DirichletViscousTensorDomainBC();
00030
00031
00032
00033
00034 virtual ~DirichletViscousTensorDomainBC();
00035
00036
00037
00038
00039
00040 virtual void getFaceFlux(BaseFab<Real>& a_faceFlux,
00041 const BaseFab<Real>& a_phi,
00042 const RealVect& a_probLo,
00043 const RealVect& a_dx,
00044 const int& a_idir,
00045 const Side::LoHiSide& a_side,
00046 const DataIndex& a_dit,
00047 const Real& a_time,
00048 const bool& a_useHomogeneous);
00049
00050
00051
00052
00053
00054 virtual void getFaceFlux(Real& a_faceFlux,
00055 const VolIndex& a_vof,
00056 const int& a_comp,
00057 const EBCellFAB& a_phi,
00058 const RealVect& a_probLo,
00059 const RealVect& a_dx,
00060 const int& a_idir,
00061 const Side::LoHiSide& a_side,
00062 const DataIndex& a_dit,
00063 const Real& a_time,
00064 const bool& a_homogeneous);
00065
00066 virtual void
00067 fillVelGhost(FArrayBox& a_phi,
00068 const Box& a_valid,
00069 const Box& a_domain,
00070 Real a_dx,
00071 bool a_homogeneous)
00072 {
00073 Box grownBox = a_valid;
00074 grownBox.grow(1);
00075 for (int idir=0; idir<CH_SPACEDIM; ++idir)
00076 {
00077 for(SideIterator sit; sit.ok(); ++sit)
00078 {
00079 Box choppedBox = grownBox;
00080 choppedBox.grow(idir,-1);
00081 Box toRegion = adjCellBox(choppedBox, idir, sit(), 1);
00082 if(!a_domain.contains(toRegion))
00083 {
00084 for (BoxIterator bit(toRegion); bit.ok(); ++bit)
00085 {
00086 const IntVect& iv = bit();
00087
00088 VolIndex vof(iv, 0);
00089 RealVect loc = EBArith::getVoFLocation(vof, a_dx, RealVect::Zero);
00090 int isign = sign(sit());
00091 IntVect ivneigh = iv - isign*BASISV(idir);
00092 RealVect value = bcvaluefunc(loc, idir, sit());
00093 if(a_homogeneous) value = RealVect::Zero;
00094 for(int comp = 0; comp < SpaceDim; comp++)
00095 {
00096
00097 a_phi(iv, comp) = -a_phi(ivneigh, comp) + 2.*value[comp];
00098 }
00099 }
00100 }
00101 }
00102 }
00103 }
00104
00105 private:
00106 void getDivergenceAndGradient(Real& a_divergence,
00107 Real* a_gradient,
00108 const int& a_idir,
00109 const FaceIndex& a_bndryFace,
00110 const VolIndex& a_vof,
00111 const EBCellFAB& a_phi,
00112 const RealVect& a_probLo,
00113 const RealVect& a_dx,
00114 const Side::LoHiSide& a_side,
00115 const DataIndex& a_dit,
00116 const Real& a_time,
00117 const bool& a_useHomogeneous);
00118
00119 };
00120
00121 class DirichletViscousTensorDomainBCFactory: public BaseDomainBCFactory
00122 {
00123 public:
00124
00125
00126
00127 DirichletViscousTensorDomainBCFactory();
00128
00129
00130
00131
00132 virtual ~DirichletViscousTensorDomainBCFactory();
00133
00134
00135
00136
00137 virtual DirichletViscousTensorDomainBC* create(const ProblemDomain& a_domain,
00138 const EBISLayout& a_layout,
00139 const RealVect& a_dx);
00140
00141
00142
00143
00144
00145 virtual void setValue(Real a_value);
00146
00147
00148
00149
00150 virtual void setFunction(RefCountedPtr<BaseBCFuncEval> a_func);
00151
00152 private:
00153 bool m_onlyHomogeneous;
00154 bool m_isFunctional;
00155
00156 Real m_value;
00157 RefCountedPtr<BaseBCFuncEval> m_func;
00158 };
00159 #include "NamespaceFooter.H"
00160 #endif