00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _REFINEMENTCRITERION_H_
00012 #define _REFINEMENTCRITERION_H_
00013
00014 #include "IndexTM.H"
00015 #include "CutCellMoments.H"
00016
00017 #include "NamespaceHeader.H"
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 template <int dim> class RefinementCriterion
00028 {
00029 public:
00030
00031
00032 RefinementCriterion()
00033 {
00034 m_constraintsSucceeded = true;
00035 m_baseMaxNumberOfRefinements = 1;
00036 }
00037
00038
00039 RefinementCriterion(const int& a_baseMaxNumberOfRefinements)
00040 {
00041 m_constraintsSucceeded = true;
00042 m_baseMaxNumberOfRefinements = a_baseMaxNumberOfRefinements;
00043 }
00044
00045
00046 RefinementCriterion(const RefinementCriterion<dim>& a_RefinementCriterion)
00047 :m_constraintsSucceeded (a_RefinementCriterion.m_constraintsSucceeded),
00048 m_baseMaxNumberOfRefinements(a_RefinementCriterion.m_baseMaxNumberOfRefinements)
00049 {
00050 }
00051
00052
00053 ~RefinementCriterion()
00054 {
00055 }
00056
00057
00058
00059
00060
00061
00062
00063 virtual bool baseDoRefine(IndexTM<int,dim> & a_refineInDir,
00064 const CutCellMoments<dim> & a_ccm,
00065 const int & a_numberOfRefinements)
00066 {
00067
00068 bool baseRetval = false;
00069
00070
00071 a_refineInDir = IndexTM<int,dim>::Zero;
00072
00073
00074 bool exceededMaxNumber = false;
00075 if (a_numberOfRefinements >= m_baseMaxNumberOfRefinements)
00076 {
00077 exceededMaxNumber = true;
00078 }
00079
00080 if (!exceededMaxNumber)
00081 {
00082
00083 if (a_ccm.m_badNormal || !m_constraintsSucceeded)
00084 {
00085 baseRetval = true;
00086 a_refineInDir = IndexTM<int,dim>::Unit;
00087 }
00088 }
00089
00090 bool derivedRetval = doRefine(a_refineInDir,
00091 a_ccm,
00092 a_numberOfRefinements);
00093
00094
00095 bool retval = baseRetval || derivedRetval;
00096
00097
00098 return retval;
00099 }
00100
00101 virtual bool doRefine(IndexTM<int,dim> & a_refineInDir,
00102 const CutCellMoments<dim> & a_ccm,
00103 const int & a_numberOfRefinements)
00104 {
00105
00106 return false;
00107 }
00108
00109
00110 void setConstrantSuccessStatus(const bool& a_status)
00111 {
00112 m_constraintsSucceeded = a_status;
00113 }
00114
00115
00116 bool getConstrantSuccessStatus()
00117 {
00118 return m_constraintsSucceeded;
00119 }
00120
00121
00122 void setBaseMaxNumberOfRefinements(const int & a_baseMaxNumberOfRefinements)
00123 {
00124 if (a_baseMaxNumberOfRefinements < 0)
00125 {
00126 MayDay::Abort("FixedRefinement<dim>::setNumberOfRefinements - maxNumberOfRefinements must be >= 0");
00127 }
00128
00129 m_baseMaxNumberOfRefinements = a_baseMaxNumberOfRefinements;
00130 }
00131
00132
00133 int getBaseMaxNumberOfRefinements()
00134 {
00135 return m_baseMaxNumberOfRefinements;
00136 }
00137
00138 void print(ostream& a_out) const
00139 {
00140 a_out << "m_constraintsSucceeded = " << m_constraintsSucceeded << "\n";
00141 }
00142
00143
00144 void operator=(const RefinementCriterion & a_RefinementCriterion)
00145 {
00146 m_constraintsSucceeded = a_RefinementCriterion.m_constraintsSucceeded;
00147 m_baseMaxNumberOfRefinements = a_RefinementCriterion.m_baseMaxNumberOfRefinements;
00148 }
00149
00150 protected:
00151 bool m_constraintsSucceeded;
00152 int m_baseMaxNumberOfRefinements;
00153 };
00154
00155 template<int dim> ostream& operator<<(ostream & a_out,
00156 const RefinementCriterion<dim> & a_RefinementCriterion)
00157 {
00158 a_RefinementCriterion.print(a_out);
00159 return a_out;
00160 }
00161
00162 #include "NamespaceFooter.H"
00163
00164 #endif