00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _VISCOUSBASEDOMAINBC_H_
00012 #define _VISCOUSBASEDOMAINBC_H_
00013
00014 #include "LoHiSide.H"
00015 #include "RealVect.H"
00016 #include "FArrayBox.H"
00017 #include "BaseDomainBC.H"
00018 #include "VolIndex.H"
00019 #include "EBCellFAB.H"
00020 #include "EBFaceFAB.H"
00021 #include "EBFluxFAB.H"
00022 #include "EBISLayout.H"
00023 #include "EBLevelGrid.H"
00024 #include "TensorCFInterp.H"
00025 #include "BaseBCFuncEval.H"
00026 #include "ViscousTensorOp.H"
00027 #include "NamespaceHeader.H"
00028
00029
00030
00031
00032
00033 class ViscousBaseDomainBC: public BaseDomainBC
00034 {
00035 public:
00036
00037
00038
00039 ViscousBaseDomainBC()
00040 {
00041 m_coefSet = false;
00042 m_value = 12345.6789;
00043 m_func = RefCountedPtr<BaseBCFuncEval>();
00044 m_isFunction = false;
00045 }
00046
00047 virtual ~ViscousBaseDomainBC()
00048 {
00049 }
00050
00051
00052
00053 void setCoef(EBLevelGrid & a_eblg,
00054 Real & a_beta,
00055 RefCountedPtr<LevelData<EBFluxFAB> >& a_eta,
00056 RefCountedPtr<LevelData<EBFluxFAB> >& a_lambda)
00057 {
00058 m_coefSet = true;
00059 m_eblg = a_eblg;
00060 m_beta = a_beta;
00061 m_eta = a_eta;
00062 m_lambda = a_lambda;
00063 }
00064
00065 virtual void getFaceVel(Real& a_faceFlux,
00066 const FaceIndex& a_vof,
00067 const EBFluxFAB& a_vel,
00068 const RealVect& a_probLo,
00069 const RealVect& a_dx,
00070 const int& a_idir,
00071 const int& a_icomp,
00072 const Real& a_time,
00073 const Side::LoHiSide& a_side)
00074 {
00075
00076 MayDay::Error();
00077 }
00078 virtual void getFaceGradPhi(Real& a_faceFlux,
00079 const FaceIndex& a_face,
00080 const int& a_comp,
00081 const EBCellFAB& a_phi,
00082 const RealVect& a_probLo,
00083 const RealVect& a_dx,
00084 const int& a_idir,
00085 const Side::LoHiSide& a_side,
00086 const DataIndex& a_dit,
00087 const Real& a_time,
00088 const bool& a_useAreaFrac,
00089 const RealVect& a_centroid,
00090 const bool& a_useHomogeneous)
00091 {
00092
00093 MayDay::Error();
00094 }
00095
00096
00097
00098 virtual void setValue(Real a_value)
00099 {
00100 m_value = a_value;
00101 m_func = RefCountedPtr<BaseBCFuncEval>();
00102
00103 m_isFunction = false;
00104 }
00105
00106
00107
00108
00109
00110 virtual void setFunction(RefCountedPtr<BaseBCFuncEval> a_func)
00111 {
00112 m_value = 12345.6789;
00113 m_func = a_func;
00114
00115 m_isFunction = true;
00116 }
00117
00118 void getFluxFromGrad(BaseFab<Real>& a_flux,
00119 const FArrayBox& a_grad,
00120 const DataIndex& a_dit,
00121 const int& a_idir)
00122 {
00123 FArrayBox& fluxFAB = (FArrayBox&) a_flux;
00124 FArrayBox faceDiv(a_flux.box(), 1);
00125 faceDiv.setVal(0.);
00126
00127 for (int divDir = 0; divDir < SpaceDim; divDir++)
00128 {
00129 int gradComp = TensorCFInterp::gradIndex(divDir,divDir);
00130 int srccomp = gradComp;
00131 int dstcomp = 0;
00132 faceDiv.plus(a_grad, srccomp, dstcomp, 1);
00133 }
00134
00135
00136 const Box& faceBox = fluxFAB.box();
00137 fluxFAB.setVal(0.);
00138 const FArrayBox& lamFace = (const FArrayBox&)((*m_lambda)[a_dit][a_idir].getSingleValuedFAB());
00139 const FArrayBox& etaFace = (const FArrayBox&)((*m_eta )[a_dit][a_idir].getSingleValuedFAB());
00140 ViscousTensorOp::getFluxFromDivAndGrad(fluxFAB, faceDiv, a_grad, etaFace, lamFace, faceBox, a_idir);
00141 }
00142
00143
00144 virtual void
00145 fillVelGhost(FArrayBox& a_state,
00146 const Box& a_valid,
00147 const Box& a_domain,
00148 Real a_dx,
00149 bool a_homogeneous) = 0;
00150
00151
00152 RealVect bcvaluefunc(const RealVect & a_point,
00153 const int & a_dir,
00154 const Side::LoHiSide& a_side)
00155 {
00156 RealVect retval;
00157 if(m_isFunction)
00158 {
00159 for(int idir = 0; idir < SpaceDim; idir++)
00160 {
00161 retval[idir]= m_func->value(a_point, idir);
00162 }
00163 }
00164 else
00165 {
00166 for(int idir = 0; idir < SpaceDim; idir++)
00167 {
00168 retval[idir] = m_value;
00169 }
00170 }
00171 return retval;
00172 }
00173 protected:
00174 bool m_onlyHomogeneous;
00175 bool m_isFunction;
00176
00177 Real m_value;
00178 RefCountedPtr<BaseBCFuncEval> m_func;
00179
00180
00181 Real m_beta;
00182 bool m_coefSet;
00183 EBLevelGrid m_eblg;
00184 RefCountedPtr<LevelData<EBFluxFAB> > m_eta;
00185 RefCountedPtr<LevelData<EBFluxFAB> > m_lambda;
00186 };
00187
00188 #include "NamespaceFooter.H"
00189 #endif