Loading [MathJax]/extensions/tex2jax.js
Plugins
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
domain_util.h
Go to the documentation of this file.
1# ifndef __util__domain_util__h__
2# define __util__domain_util__h__
3
4// UG4 base libs.
5#include "common/common.h"
6#include "common/log.h"
8
9
11#include "lib_grid/algorithms/problem_detection_util.h" // CheckForUnconnectedSides
12
13
14#include "lib_disc/domain.h"
16
17// C++ libs.
18#include <vector>
19#include <string>
20
21namespace ug {
22namespace Util {
23
24namespace aux {
25 template <typename TObject>
26 void write(TObject &text) { UG_LOG(text); }
27}
28
29using aux::write;
30
31// util.CheckSubsets
32// checks if all required subsets are contained in the SubsetHandler
33// @param dom Domain
34// @param neededSubsets List of subsets the SubsetHandler must contain
35// @return true if all subsets are contained, false else
36
37template <typename TDomain>
38bool CheckSubsets(const TDomain &dom, const std::vector<std::string> &neededSubsets)
39{
40 auto sh = dom.subset_handler();
41
42 for (auto &subset : neededSubsets) {
43 if (sh->get_subset_index(subset.c_str()) == -1) {
44 UG_LOG("Domain does not contain subset '" << subset.c_str() <<"'.");
45 return false;
46 }
47 }
48
49 return true;
50}
51
52
53// Creates a new domain and loads the specified grid.
54// The method then performs numRefs global refinements.
55// A list of subset-names can be specified which have to be present in the loaded grid.
56// The method returns the created domain.
57// @note Some paramters are optional. nil is a valid value for each optional parameter.
58// @return (Domain) the created domain
59// @param gridName (string) The filename of the grid which shall be loaded.
60// The grid is searched in a path relative to the current path
61// first. If it isn't found there, the path is interpreted as
62// an absolute path. If the grid still can't be found, the method
63// tries to load it from UG_BASE/data/grids.
64// @param numRefs (int) The total number of global refinements
65// @param neededSubsets (optional, list of strings) The subsets that are required
66// by the simulation. If not all those subsets are present,
67// the method aborts. Default is an empty list.
68// @param noIntegrityCheck (optional, bool) Disables integrity check if 'true'.
69
70
71template <typename TDomain>
72SmartPtr<TDomain> CreateDomain(const std::string &gridName, int numRefs,
73 const std::vector<std::string> &neededSubsets, bool noIntegrityCheck=false) {
74
75 // Create domain instance.
76 auto dom = make_sp<TDomain>(new TDomain());
77
78 // load domain
79 UG_LOG("Loading Domain " << gridName << " ... ")
80 LoadDomain(*dom, gridName.c_str()); // from lib_disc/domain_util.cpp
81 UG_LOG("done." << std::endl)
82
83
84 if (noIntegrityCheck == false) {
85 UG_LOG("Performing integrity check on domain ... ");
86 if (CheckForUnconnectedSides(*dom->grid()))
87 {
88 UG_LOG("WARNING: unconnected sides found (see above).\n");
89 std::string note("NOTE: You may disable this check by passing 'true' to 'noIntegrityCheck' in 'util.CreateDomain'.\n");
90 UG_LOG(note);
91 UG_ERR_LOG(note);
92 }
93 UG_LOG("done.\n");
94 }
95
96 // Create a refiner instance. This is a factory method
97 // which automatically creates a parallel refiner if required.
98 // if numRefs == nil then numRefs = 0 end
99 if (numRefs > 0) {
100 UG_LOG("Refining(" << numRefs << "): ");
101 auto refiner = GlobalDomainRefiner(*dom);
102 for (int i=0; i<numRefs; ++i){
103 // TerminateAbortedRun();
104 refiner->refine();
105 UG_LOG(i << " ");
106 }
107 UG_LOG("done.\n");
108 // delete(refiner)
109 }
110
111 // check whether required subsets are present
112 if (!neededSubsets.empty())
113 {
114
115 UG_ASSERT(CheckSubsets(*dom, neededSubsets) == true,
116 "Something wrong with required subsets. Aborting.");
117 }
118
119 // return the created domain
120 return dom;
121}
122
123
124template <typename TDomain>
125SmartPtr<TDomain> CreateDomain(const std::string &gridName, int numRefs, const std::vector<std::string> &neededSubsets)
126{
127 return CreateDomain<TDomain>(gridName, numRefs, neededSubsets, false);
128}
129
130template <typename TDomain>
131SmartPtr<TDomain> CreateDomain(const std::string &gridName, int numRefs)
132{
133 return CreateDomain<TDomain>(gridName,numRefs, std::vector<std::string>(), false);
134}
135
136template <typename TDomain>
137SmartPtr<TDomain> CreateDomain(const std::string &gridName)
138{
139
140 return CreateDomain<TDomain>(gridName, 0, std::vector<std::string>(), false);
141}
142
143
144// Creates a new domain and loads the specified grid. The method then performs
145// numPreRefs refinements before it distributes the domain onto the available
146// processes. The partitioning method can be chosen through distributionMethod.
147// After distribution the domain is refined until a total of numRefs refinement
148// steps has been performed (including numPreRefs).
149// A list of subset-names can be specified. After distribution the methods checks
150// Whether all processes received the required subsets.
151// The method returns the created domain.
152// @note Some paramters are optional. nil is a valid value for each optional parameter.
153// @return (Domain) the created domain
154// @param gridName (string) The filename of the grid which shall be loaded.
155// The grid is searched in a path relative to the current path
156// first. If it isn't found there, the path is interpreted as
157// an absolute path. If the grid still can't be found, the method
158// tries to load it from UG_BASE/data/grids.
159// @param numRefs (int) The total number of global refinements
160// @param numPreRefs (int) The number of refinements that are performed before
161// distribution.
162// @param neededSubsets (optional, list of strings) The subsets that are required
163// by the simulation. If not all those subsets are present,
164// the method aborts. Default is an empty list.
165// @param distributionMethod (optional, string) The distribution method.
166// Either "bisection" or "metis". Default is "bisection".
167// See util.DistributeDomain for more information
168// (in UG_BASE/scripts/util/domain_distribution.lua)
169// @param verticalInterfaces (optional, bool) Vertical interfaces are required
170// by multi-grid solvers. Default is true.
171// See util.DistributeDomain for more information
172// (in UG_BASE/scripts/util/domain_distribution.lua)
173// @param numTargetProcs (optional, int) The number of target processes to which
174// the domain shall be distributed. Make sure that the
175// number of target processes is not higher than the
176// number of elements in the distributionLevel.
177// Default is NumProcs()
178// See util.DistributeDomain for more information
179// (in UG_BASE/scripts/util/domain_distribution.lua)
180// @param distributionLevel (optional, int) The level on which the distribution
181// is performed. Default is the domains top-level
182// after pre-refinement.
183// See util.DistributeDomain for more information
184// (in UG_BASE/scripts/util/domain_distribution.lua)
185// @param wFct (optional SmartPtr<EdgeWeighting>) Sets the weighting function for the
186// 'metisReweigh' partitioning method.
187// @param noIntegrityCheck (optional, bool) Disables integrity check if 'true'.
188
189/*function util.CreateAndDistributeDomain(gridName, numRefs, numPreRefs,
190 neededSubsets, distributionMethod,
191 verticalInterfaces, numTargetProcs,
192 distributionLevel, wFct, noIntegrityCheck)
193
194 // create Instance of a Domain
195 local dom = Domain()
196
197 // load domain
198 write("Loading Domain "..gridName.." ... ")
199 LoadDomain(dom, gridName)
200 write("done.\n")
201
202 if noIntegrityCheck ~= true then
203 write("Performing integrity check on domain ... ")
204 if CheckForUnconnectedSides(dom:grid()) == true then
205 write("WARNING: unconnected sides found (see above).\n")
206 local note = "NOTE: You may disable this check by passing 'true' "..
207 "to 'noIntegrityCheck' in 'util.CreateAndDistributeDomain'.\n"
208 write(note)
209 errlog(note)
210 end
211 write("done.\n")
212 end
213
214 // create Refiner
215 ug_assert(numPreRefs <= numRefs, "numPreRefs must be smaller than numRefs. Aborting.");
216
217 if numPreRefs > numRefs then
218 numPreRefs = numRefs
219 end
220
221 // Create a refiner instance. This is a factory method
222 // which automatically creates a parallel refiner if required.
223 local refiner = nil
224 if numRefs > 0 then
225 refiner = GlobalDomainRefiner(dom)
226 end
227
228 write("Pre-Refining("..numPreRefs.."): ")
229 // Performing pre-refines
230 for i=1,numPreRefs do
231 TerminateAbortedRun()
232 write(i .. " ")
233 refiner:refine()
234 end
235 write("done.\nDistributing...")
236 // Distribute the domain to all involved processes
237 if util.DistributeDomain(dom, distributionMethod, verticalInterfaces, numTargetProcs, distributionLevel, wFct) == false then
238 ug_error("Error while Distributing Grid. Aborting.")
239 end
240 write(" done.\nPost-Refining("..(numRefs-numPreRefs).."): ")
241
242 if numRefs > 0 then
243 // Perform post-refine
244 for i=numPreRefs+1,numRefs do
245 TerminateAbortedRun()
246 refiner:refine()
247 write(i-numPreRefs .. " ")
248 end
249 end
250 write("done.\n")
251
252 // Now we loop all subsets an search for it in the SubsetHandler of the domain
253 if neededSubsets ~= nil then
254 if util.CheckSubsets(dom, neededSubsets) == false then
255 ug_error("Something wrong with required subsets. Aborting.");
256 end
257 end
258
259
260 //clean up
261 if refiner ~= nil then
262 delete(refiner)
263 end
264
265 // return the created domain
266 return dom
267end
268*/
269} // namespace util
270} // namespace ug
271
272# endif //__util__domain_util__h__
parameterNumber numRefs
Definition evaluate.lua:2
void LoadDomain(TDomain &domain, const char *filename)
#define UG_ASSERT(expr, msg)
#define UG_ERR_LOG(msg)
#define UG_LOG(msg)
void write(TObject &text)
Definition domain_util.h:26
SmartPtr< TDomain > CreateDomain(const std::string &gridName, int numRefs, const std::vector< std::string > &neededSubsets, bool noIntegrityCheck=false)
Definition domain_util.h:72
bool CheckSubsets(const TDomain &dom, const std::vector< std::string > &neededSubsets)
Definition domain_util.h:38
bool CheckForUnconnectedSides(Grid &grid)
static SmartPtr< IRefiner > GlobalDomainRefiner(TDomain &dom)