00001 /* _______ __
00002 / ___/ / ___ __ _ / / ___
00003 / /__/ _ \/ _ \/ V \/ _ \/ _ \
00004 \___/_//_/\___/_/_/_/_.__/\___/
00005 */
00006 // CHOMBO Copyright (c) 2000-2004, The Regents of the University of
00007 // California, through Lawrence Berkeley National Laboratory (subject to
00008 // receipt of any required approvals from U.S. Dept. of Energy). All
00009 // rights reserved.
00010 //
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are met:
00013 //
00014 // (1) Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 // (2) Redistributions in binary form must reproduce the above copyright
00017 // notice, this list of conditions and the following disclaimer in the
00018 // documentation and/or other materials provided with the distribution.
00019 // (3) Neither the name of Lawrence Berkeley National Laboratory, U.S.
00020 // Dept. of Energy nor the names of its contributors may be used to endorse
00021 // or promote products derived from this software without specific prior
00022 // written permission.
00023 //
00024 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00025 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00026 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00027 // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00028 // OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00029 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00030 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00031 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00032 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00033 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00034 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035 //
00036 // You are under no obligation whatsoever to provide any bug fixes,
00037 // patches, or upgrades to the features, functionality or performance of
00038 // the source code ("Enhancements") to anyone; however, if you choose to
00039 // make your Enhancements available either publicly, or directly to
00040 // Lawrence Berkeley National Laboratory, without imposing a separate
00041 // written license agreement for such Enhancements, then you hereby grant
00042 // the following license: a non-exclusive, royalty-free perpetual license
00043 // to install, use, modify, prepare derivative works, incorporate into
00044 // other computer software, distribute, and sublicense such Enhancements or
00045 // derivative works thereof, in binary and source code form.
00046 //
00047 // TRADEMARKS. Product and company names mentioned herein may be the
00048 // trademarks of their respective owners. Any rights not expressly granted
00049 // herein are reserved.
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 // Constants:
00066
00067 // Minimum acceptable ratio of tagged cells to total cells for
00068 // the Berger-Rigoutsos algorithm in \func{makeBoxes}.
00069 // Used as default for \var{FillRatio} optional argument.
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
1.2.16