00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _WRAPPEDGSHOP_H_
00012 #define _WRAPPEDGSHOP_H_
00013
00014 #include "REAL.H"
00015 #include "RealVect.H"
00016 #include "Box.H"
00017 #include "IntVect.H"
00018 #include "EBISBox.H"
00019 #include "GeometryService.H"
00020 #include "WrappedGShop.H"
00021 #include "LSquares.H"
00022 #include "BaseIF.H"
00023 #include "AMRIO.H"
00024 #include "IrregNode.H"
00025 #include "CutCellMoments.H"
00026 #include "RefCountedPtr.H"
00027 #include "NamespaceHeader.H"
00028
00029 class WGSRefinementCriterion
00030 {
00031 public:
00032
00033 virtual bool refineHere(const IrregNode& a_node, const IntVect& a_iv, const Real& a_dx) const
00034 {
00035 return false;
00036 }
00037
00038 virtual ~WGSRefinementCriterion()
00039 {
00040 }
00041
00042 WGSRefinementCriterion()
00043 {
00044 }
00045 };
00046
00047
00048
00049
00050
00051
00052
00053
00054 class WrappedGShop: public GeometryService
00055 {
00056
00057 public:
00058
00059 int m_phase;
00060
00061
00062
00063
00064
00065
00066 WrappedGShop(const RefCountedPtr<BaseIF> & a_baseIF,
00067 const RealVect & a_origin,
00068 const Real & a_dx,
00069 const ProblemDomain & a_domain,
00070 int minNumberRefines,
00071 int maxNumberRefines);
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 bool checkNodeMoments(IrregNode & a_node,
00082 const Real& a_dx,
00083 const bool& a_bindMoments,
00084 const Real& a_tolerance) const;
00085
00086 virtual const BaseIF* getBaseIFPtr() const
00087 {
00088
00089 return &(*m_baseIF);
00090 }
00091
00092
00093
00094 ~WrappedGShop()
00095 {
00096 }
00097
00098
00099 virtual bool generatesHigherOrderMoments() const
00100 {
00101 return true;
00102 }
00103
00104
00105
00106
00107
00108
00109 virtual bool isRegular(const Box & a_region,
00110 const ProblemDomain & a_domain,
00111 const RealVect & a_origin,
00112 const Real & a_dx) const;
00113
00114
00115
00116
00117
00118
00119 virtual bool isCovered(const Box & a_region,
00120 const ProblemDomain & a_domain,
00121 const RealVect & a_origin,
00122 const Real & a_dx) const;
00123
00124
00125 virtual bool isIrregular(const Box & a_region,
00126 const ProblemDomain & a_domain,
00127 const RealVect & a_origin,
00128 const Real & a_dx) const;
00129
00130 virtual bool canGenerateMultiCells() const
00131 {
00132 return false;
00133 }
00134
00135 bool onBoxBoundary(const IntVect & a_iv,
00136 const Box & a_box,
00137 const int & a_dir,
00138 const Side::LoHiSide & a_sd) const;
00139
00140
00141
00142
00143
00144 virtual void fillGraph(BaseFab<int>& a_regIrregCovered,
00145 Vector<IrregNode>& a_nodes,
00146 const Box& a_validRegion,
00147 const Box& a_ghostRegion,
00148 const ProblemDomain& a_domain,
00149 const RealVect& a_origin,
00150 const Real& a_dx,
00151 const DataIndex& a_di ) const;
00152
00153
00154 void
00155 computeVoFInternals(IrregNode & a_node,
00156 const IntVectSet & a_ivsIrreg,
00157 const ProblemDomain & a_domain,
00158 const RealVect & a_origin,
00159 const Real & a_dx,
00160 const IntVect & a_iv) const;
00161
00162
00163
00164
00165 bool needToRefine(IrregNode & a_node,
00166 const Real & a_dx,
00167 const int & a_numRefSoFar)const ;
00168
00169 void agglomerateMoments(IrregNode & a_node,
00170 const Vector<IrregNode>& a_refNodes,
00171 const Box & a_refBox,
00172 const Real & a_fineDx,
00173 const Real & a_coarDx) const;
00174
00175
00176 RealVect convert2RelativeCoord(const RealVect& a_rVect)const;
00177
00178
00179
00180 RealVect convert2RelativeCoord(const IndexTM<Real,SpaceDim>& a_rVect)const;
00181
00182 void
00183 fillNewNode(IrregNode & a_node,
00184 const IntVectSet & a_ivsIrreg,
00185 const ProblemDomain & a_domain,
00186 const RealVect & a_origin,
00187 const Real & a_dx,
00188 const IntVect & a_iv) const;
00189
00190 void setRefinementCriterion(const RefCountedPtr<WGSRefinementCriterion>& a_refCrit)
00191 {
00192 m_refCrit = a_refCrit;
00193 }
00194
00195 private:
00196 void
00197 fixRegularCellsNextToCovered(Vector<IrregNode> & a_nodes,
00198 BaseFab<int> & a_regIrregCovered,
00199 const Box & a_validRegion,
00200 const Box & a_domain,
00201 const IntVect & a_iv,
00202 const Real & a_dx) const;
00203 void
00204 getFullNodeWithCoveredFace(IrregNode & a_newNode,
00205 const BaseFab<int> & a_regIrregCovered,
00206 const IntVect & a_iv,
00207 const Real & a_dx,
00208 const Box & a_domain) const;
00209
00210
00211 RefCountedPtr<WGSRefinementCriterion> m_refCrit;
00212
00213 Real m_threshold;
00214
00215
00216 RealVect m_origin;
00217
00218 int m_order;
00219 int m_degreeP;
00220 int m_minNumberRefines;
00221 int m_maxNumberRefines;
00222
00223 ProblemDomain m_domain;
00224
00225 RefCountedPtr<BaseIF> m_baseIF;
00226
00227 static Real s_relativeTol;
00228
00229
00230
00231
00232 bool isRegularEveryPoint(const Box& a_region,
00233 const ProblemDomain& a_domain,
00234 const RealVect& a_origin,
00235 const Real& a_dx) const;
00236
00237
00238
00239
00240
00241
00242 bool isCoveredEveryPoint(const Box& a_region,
00243 const ProblemDomain& a_domain,
00244 const RealVect& a_origin,
00245 const Real& a_dx) const;
00246
00247
00248 void fillArc(Vector<int> a_arc[SpaceDim],
00249 CutCellMoments<SpaceDim> & a_cutCellMoments,
00250 const int & a_hilo,
00251 const IntVectSet & a_ivsIrreg,
00252 const IntVect & a_curriv) const;
00253
00254
00255
00256 WrappedGShop()
00257 {
00258 MayDay::Abort("WrappedGShop uses strong construction only");
00259 }
00260 WrappedGShop(const WrappedGShop& a_workshopin)
00261 {
00262 MayDay::Abort("WrappedGShop disallows copy contruction");
00263 }
00264 void operator=(const WrappedGShop& a_workshopin)
00265 {
00266 MayDay::Abort("WrappedGShop disallows the assignment operator");
00267 }
00268
00269 };
00270 #include "NamespaceFooter.H"
00271 #endif