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