00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef _BRMESHREFINE_H_
00053 #define _BRMESHREFINE_H_
00054
00055 #include <climits>
00056
00057 #include "Vector.H"
00058 #include "Box.H"
00059 #include "IntVectSet.H"
00060 #include "REAL.H"
00061 #include "MeshRefine.H"
00062 #include "Interval.H"
00063 #include <list>
00064
00065
00066
00067
00068
00069
00070 #ifndef _BR_MIN_BOX_FILL_RATIO_
00071 #define _BR_MIN_BOX_FILL_RATIO_ ( 0.75 )
00072 #endif
00073
00075
00132 class BRMeshRefine : public MeshRefine
00133 {
00134 public:
00136 BRMeshRefine();
00137
00139 BRMeshRefine(
00140 const Box& a_baseDomain,
00142 const Vector<int>& a_refRatios,
00144 const Real a_fillRatio,
00146 const int a_blockFactor,
00148 const int a_bufferSize,
00150 const int a_maxSize);
00151
00153 BRMeshRefine(
00154 const ProblemDomain& a_baseDomain,
00156 const Vector<int>& a_refRatios,
00158 const Real a_fillRatio,
00160 const int a_blockFactor,
00162 const int a_bufferSize,
00164 const int a_maxSize);
00165
00167 virtual ~BRMeshRefine();
00168
00170 void define(
00171 const Box& a_baseDomain,
00173 const Vector<int>& a_refRatios,
00175 const Real a_fillRatio,
00177 const int a_blockFactor,
00179 const int a_bufferSize,
00181 const int a_maxSize);
00182
00184 void define(
00185 const ProblemDomain& a_baseDomain,
00187 const Vector<int>& a_refRatios,
00189 const Real a_fillRatio,
00191 const int a_blockFactor,
00193 const int a_bufferSize,
00195 const int a_maxSize);
00196
00198
00205 void
00206 makeBoxes(
00207 Vector<Box>& a_mesh,
00209 const IntVectSet& a_tags,
00211 const IntVectSet& a_pnd,
00213 const ProblemDomain& a_domain,
00215 const int a_maxSize) const;
00216
00217
00218 protected:
00222 void
00223 makeBoxes(
00224 std::list<Box>& a_mesh,
00226 const IntVectSet& a_tags,
00228 const IntVectSet& a_pnd,
00230 const ProblemDomain& a_domain,
00232 const int a_maxSize,
00234 const int a_depth
00235 ) const;
00238 void
00239 splitBox(std::list<Box> & a_boxes ,
00240 const std::list<Box>::iterator& a_boxindex,
00241 const int a_dimension ,const int a_maxboxsize ) const;
00242
00244 Vector<int>
00245 makeTrace( const IntVectSet& a_Ivs ,int a_dir ) const;
00246
00248 void
00249 makeTraces( const IntVectSet& a_Ivs ,Vector<int>* a_traces ) const;
00251 int
00252 findSplit( const Vector<int>& a_trace ) const;
00253
00255 int
00256 findMaxInflectionPoint( const Vector<int>& a_trace ,int& a_maxVal ) const;
00257
00259 void
00260 splitTags( const IntVectSet& a_tags,
00261 const int a_split_dir ,const int a_split_indx,
00262 IntVectSet& a_tags_lo ,IntVectSet& a_tags_hi ) const;
00263
00265 void
00266 breakBoxes(Vector<Box>& a_vboxin, const int& a_maxSize,
00267 const int& a_idir) const;
00268
00270 int
00271 maxloc( const int* a_V ,const int a_Size ) const;
00272
00273 void makeBoxesParallel(std::list<Box>& a_mesh,
00274 const IntVectSet& a_tags,
00275 const IntVectSet& a_pnd,
00276 const ProblemDomain& a_domain,
00277 const int a_maxSize,
00278 const int a_depth,
00279 const int a_minSize,
00280 const Interval& a_procInterval
00281 ) const;
00282
00283 void sendBoxesParallel( const std::list<Box>& a_mesh,
00284 int tag) const;
00285
00286 void receiveBoxesParallel(const Interval& a_from,
00287 const Interval& a_to,
00288 std::list<Box>& a_mesh,
00289 int tag) const;
00290 };
00291
00293
00301 extern void domainSplit(const ProblemDomain& a_domain, Vector<Box>& a_vbox,
00302 int a_maxSize, int a_blockfactor=1);
00303
00305
00315 extern void domainSplit(const Box& a_domain, Vector<Box>& a_vbox,
00316 int a_maxSize, int a_blockfactor=1);
00317
00319
00323 extern void
00324 breakBoxes(Vector<Box>& a_vboxin, const int& a_maxSize, const int& a_idir);
00325
00326 #endif