00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _MIXEDVISCOUSTENSORDOMAINBC_H_
00012 #define _MIXEDVISCOUSTENSORDOMAINBC_H_
00013
00014 #include "RefCountedPtr.H"
00015 #include "BaseDomainBC.H"
00016 #include "BaseBCFuncEval.H"
00017 #include "ViscousBaseDomainBC.H"
00018 #include "NamespaceHeader.H"
00019
00020
00021
00022
00023 class MixedViscousTensorDomainBC: public ViscousBaseDomainBC
00024 {
00025 public:
00026
00027
00028
00029 MixedViscousTensorDomainBC()
00030 {
00031
00032 m_startDirichlet = 1.23456789e10;
00033 }
00034
00035
00036
00037
00038 virtual ~MixedViscousTensorDomainBC()
00039 {;}
00040
00041
00042
00043
00044
00045 virtual void getFaceFlux(BaseFab<Real>& a_faceFlux,
00046 const BaseFab<Real>& a_phi,
00047 const RealVect& a_probLo,
00048 const RealVect& a_dx,
00049 const int& a_idir,
00050 const Side::LoHiSide& a_side,
00051 const DataIndex& a_dit,
00052 const Real& a_time,
00053 const bool& a_useHomogeneous);
00054
00055
00056 virtual void getFaceFlux(Real& a_faceFlux,
00057 const VolIndex& a_vof,
00058 const int& a_comp,
00059 const EBCellFAB& a_phi,
00060 const RealVect& a_probLo,
00061 const RealVect& a_dx,
00062 const int& a_idir,
00063 const Side::LoHiSide& a_side,
00064 const DataIndex& a_dit,
00065 const Real& a_time,
00066 const bool& a_useHomogeneous);
00067
00068
00069 void setStartDirichlet(const Real& a_startDirichlet)
00070 {
00071 m_startDirichlet = a_startDirichlet;
00072 }
00073
00074 virtual void
00075 fillVelGhost(FArrayBox& a_phi,
00076 const Box& a_valid,
00077 const Box& a_domain,
00078 Real a_dx,
00079 bool a_homogeneous)
00080 {
00081
00082 Box grownBox = a_valid;
00083 grownBox.grow(1);
00084 for (int idir=0; idir<CH_SPACEDIM; ++idir)
00085 {
00086 for(SideIterator sit; sit.ok(); ++sit)
00087 {
00088 Box choppedBox = grownBox;
00089 choppedBox.grow(idir,-1);
00090 Box toRegion = adjCellBox(choppedBox, idir, sit(), 1);
00091
00092 for (BoxIterator bit(toRegion); bit.ok(); ++bit)
00093 {
00094 const IntVect& iv = bit();
00095
00096 VolIndex vof(iv, 0);
00097 RealVect loc = EBArith::getVoFLocation(vof, a_dx, RealVect::Zero);
00098 int isign = sign(sit());
00099 IntVect ivneigh = iv - isign*BASISV(idir);
00100 RealVect value = bcvaluefunc(loc, idir, sit());
00101 if(a_homogeneous) value = RealVect::Zero;
00102 for(int comp = 0; comp < SpaceDim; comp++)
00103 {
00104 if(loc[0] < m_startDirichlet)
00105 {
00106
00107 a_phi(iv, comp) = a_phi(ivneigh, comp) + a_dx*value[comp];
00108 }
00109 else
00110 {
00111
00112 a_phi(iv, comp) = -a_phi(ivneigh, comp) + 2.*value[comp];
00113 }
00114 }
00115 }
00116 }
00117 }
00118 }
00119
00120 private:
00121
00122 Real m_startDirichlet;
00123
00124 };
00125
00126 #include "NamespaceFooter.H"
00127 #endif