1 // Copyright (C) 2004-2022 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // GHS3DPlugin : C++ implementation
21 // File : GHS3DPlugin_Hypothesis.hxx
22 // Created : Wed Apr 2 12:21:17 2008
23 // Author : Edward AGAPOV (eap)
25 #ifndef GHS3DPlugin_Hypothesis_HeaderFile
26 #define GHS3DPlugin_Hypothesis_HeaderFile
28 #include "GHS3DPlugin_Defs.hxx"
30 #include <SMDS_MeshNode.hxx>
32 #include "SMESH_Hypothesis.hxx"
33 #include "SMESH_Mesh_i.hxx"
34 #include "SMESH_Gen_i.hxx"
35 #include "SMESH_TypeDefs.hxx"
36 #include "utilities.h"
43 class GHS3DPLUGIN_EXPORT GHS3DPlugin_Hypothesis: public SMESH_Hypothesis
47 GHS3DPlugin_Hypothesis(int hypId, SMESH_Gen * gen);
49 typedef std::map<std::vector<double>,double> TGHS3DEnforcedVertexCoordsValues;
50 typedef std::map<std::string,double> TGHS3DEnforcedVertexEntryValues;
52 struct TGHS3DEnforcedVertex {
54 std::string geomEntry;
56 std::vector<double> coords;
57 std::string groupName;
61 struct CompareGHS3DEnforcedVertex {
62 bool operator () (const TGHS3DEnforcedVertex* e1, const TGHS3DEnforcedVertex* e2) const {
64 if (e1->coords.size() && e2->coords.size())
65 return (e1->coords < e2->coords);
67 return (e1->geomEntry < e2->geomEntry);
72 typedef std::set< TGHS3DEnforcedVertex*, CompareGHS3DEnforcedVertex > TGHS3DEnforcedVertexList;
73 // Map Coords / Enforced node
74 typedef std::map< std::vector<double>, TGHS3DEnforcedVertex* > TCoordsGHS3DEnforcedVertexMap;
75 // Map geom entry / Enforced node
76 typedef std::map< std::string, TGHS3DEnforcedVertex* > TGeomEntryGHS3DEnforcedVertexMap;
77 // Map groupName / Enforced node
78 typedef std::map< std::string, TGHS3DEnforcedVertexList > TGroupNameGHS3DEnforcedVertexMap;
84 struct TGHS3DEnforcedMesh {
88 std::string groupName;
89 SMESH::ElementType elementType;
92 struct CompareGHS3DEnforcedMesh {
93 bool operator () (const TGHS3DEnforcedMesh* e1, const TGHS3DEnforcedMesh* e2) const {
95 if (e1->entry == e2->entry)
96 return (e1->elementType < e2->elementType);
98 return (e1->entry < e2->entry);
104 typedef std::set< TGHS3DEnforcedMesh*, CompareGHS3DEnforcedMesh > TGHS3DEnforcedMeshList;
105 // Map mesh entry / Enforced mesh list
106 // ex: 0:1:2:1 -> [ ("Mesh_1", "0:1:2:1", TopAbs_NODE, ""),
107 // ("Mesh_1", "0:1:2:1", TopAbs_EDGE, "edge group")]
108 typedef std::map< std::string, TGHS3DEnforcedMeshList > TEntryGHS3DEnforcedMeshListMap;
110 typedef std::map<int,double> TID2SizeMap;
112 struct TIDMeshIDCompare {
113 bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const
114 { return e1->GetMesh() == e2->GetMesh() ? e1->GetID() < e2->GetID() : e1->GetMesh() < e2->GetMesh(); }
117 typedef std::map<const SMDS_MeshElement*, std::string, TIDMeshIDCompare > TIDSortedElemGroupMap;
118 typedef std::map<const SMDS_MeshNode*, std::string, TIDMeshIDCompare > TIDSortedNodeGroupMap;
119 typedef std::set<std::string> TSetStrings;
121 static const char* GetHypType() { return "MG-Tetra Parameters"; }
123 void SetMinSize(double theMinSize);
124 double GetMinSize() const { return myMinSize; }
126 void SetMaxSize(double theMaxSize);
127 double GetMaxSize() const { return myMaxSize; }
129 void SetUseVolumeProximity( bool toUse );
130 bool GetUseVolumeProximity() const { return myUseVolumeProximity; }
132 void SetNbVolumeProximityLayers( int nbLayers );
133 int GetNbVolumeProximityLayers() const { return myNbVolumeProximityLayers; }
136 * To mesh "holes" in a solid or not. Default is to mesh.
138 void SetToMeshHoles(bool toMesh);
139 bool GetToMeshHoles(bool checkFreeOption = false) const;
141 * To make groups of volumes of different domains when mesh is generated from skin.
142 * Default is to make groups.
143 * This option works only (1) for the mesh w/o shape and (2) if GetToMeshHoles() == true
145 void SetToMakeGroupsOfDomains(bool toMakeGroups);
146 bool GetToMakeGroupsOfDomains() const;
148 * Maximal size of memory to be used by the algorithm (in Megabytes)
150 void SetMaximumMemory(float MB);
151 float GetMaximumMemory() const;
153 * Initial size of memory to be used by the algorithm (in Megabytes) in
154 * automatic memory adjustment mode. Default is zero
156 void SetInitialMemory(float MB);
157 float GetInitialMemory() const;
159 * Optimization level: 0-none, 1-light, 2-medium, 3-standard+, 4-strong. Default is medium
161 enum OptimizationLevel { None = 0, Light, Medium, StandardPlus, Strong };
162 void SetOptimizationLevel(OptimizationLevel level);
163 OptimizationLevel GetOptimizationLevel() const;
165 * Path to working directory
167 void SetWorkingDirectory(const std::string& path);
168 std::string GetWorkingDirectory() const;
170 * To keep working files or remove them. Log file remains in case of errors anyway.
172 void SetKeepFiles(bool toKeep);
173 bool GetKeepFiles() const;
175 * Verbose level [0-10]
176 * 0 - no standard output,
177 * 2 - prints the data, quality statistics of the skin and final meshes and
178 * indicates when the final mesh is being saved. In addition the software
179 * gives indication regarding the CPU time.
180 * 10 - same as 2 plus the main steps in the computation, quality statistics
181 * histogram of the skin mesh, quality statistics histogram together with
182 * the characteristics of the final mesh.
184 void SetVerboseLevel(short level);
185 short GetVerboseLevel() const;
187 * Implemented algorithms to be executed [0,1]
191 enum ImplementedAlgorithms { MGTetraHPC = 0, MGTetra };
192 void SetAlgorithm(ImplementedAlgorithms algoId);
193 ImplementedAlgorithms GetAlgorithm() const;
195 * Set Get for flag to use pthread parallel version of the algorithm
197 void SetUseNumOfThreads(bool setUseOfThreads);
198 bool GetUseNumOfThreads() const;
200 * Set Get num of threads to be used by MGTetra algorithms
202 void SetNumOfThreads(short numOfThreads);
203 short GetNumOfThreads() const;
205 * Set Get pthread mode used for MGTetra
207 enum PThreadMode { PThreadNone = 0, PThreadAggressive, Safe };
208 void SetPthreadMode(PThreadMode pthreadMode );
209 PThreadMode GetPthreadMode() const;
211 * Set Get paralle mode used for MGTetra HPC
213 enum ParallelMode { ParallelNone = 0, ReproducibleGivenMaxNumThreads, Reproducible, ParallelAggressive };
214 void SetParallelMode(ParallelMode parallelMode );
215 ParallelMode GetParallelMode() const;
217 * To create new nodes
219 void SetToCreateNewNodes(bool toCreate);
220 bool GetToCreateNewNodes() const;
222 * To use boundary recovery version which tries to create mesh on a very poor
223 * quality surface mesh
225 void SetToUseBoundaryRecoveryVersion(bool toUse);
226 bool GetToUseBoundaryRecoveryVersion() const;
228 * Applies finite-element correction by replacing overconstrained elements where
229 * it is possible. The process is cutting first the overconstrained edges and
230 * second the overconstrained facets. This insure that no edges have two boundary
231 * vertices and that no facets have three boundary vertices.
233 void SetFEMCorrection(bool toUseFem);
234 bool GetFEMCorrection() const;
236 * To removes initial central point.
238 void SetToRemoveCentralPoint(bool toRemove);
239 bool GetToRemoveCentralPoint() const;
241 * To set hiden/undocumented/advanced options
243 void SetAdvancedOption(const std::string& option);
244 std::string GetAdvancedOption() const;
246 * To define the volumic gradation
248 void SetGradation(double gradation);
249 double GetGradation() const;
251 * Print log in standard output
253 void SetStandardOutputLog(bool logInStandardOutput);
254 bool GetStandardOutputLog() const;
256 * Remove log file on success
258 void SetRemoveLogOnSuccess(bool removeLogOnSuccess);
259 bool GetRemoveLogOnSuccess() const;
262 typedef std::map< std::string, std::string > TOptionValues;
263 typedef std::set< std::string > TOptionNames;
265 void SetOptionValue(const std::string& optionName,
266 const std::string& optionValue);
267 std::string GetOptionValue(const std::string& optionName,
268 bool* isDefault=0) const;
269 bool HasOptionDefined( const std::string& optionName ) const;
270 void ClearOption(const std::string& optionName);
271 TOptionValues GetOptionValues() const;
272 const TOptionValues& GetCustomOptionValues() const { return _customOption2value; }
274 * \brief To set the advanced options in the execution command line
276 void SetAdvancedOptionsInCommandLine( std::string & cmd, bool isMGTetra ) const;
278 //static inline const char* NoValue() { return "_"; }
279 // struct TEnforcedEdge {
283 // std::string groupName;
286 * \brief Return command to run MG-Tetra mesher excluding file prefix (-f)
288 static std::string CommandToRun(const GHS3DPlugin_Hypothesis* hyp,
289 const bool hasShapeToMesh,
290 const bool forExucutable);
292 * \brief Return a unique file name
294 static std::string GetFileName(const GHS3DPlugin_Hypothesis* hyp);
296 * \brief Return a unique file name for MGTetraHPC will have a GHS3D prefix
298 static std::string GetFileNameHPC(const GHS3DPlugin_Hypothesis* hyp);
300 * \brief Return the name of executable
302 static std::string GetExeName();
305 * To set an enforced vertex
307 bool SetEnforcedVertex(std::string aName, std::string anEntry, std::string aGroupName,
308 double size, double x=0.0, double y=0.0, double z=0.0, bool isCompound = false);
309 TGHS3DEnforcedVertex* GetEnforcedVertex(double x, double y, double z);
310 TGHS3DEnforcedVertex* GetEnforcedVertex(const std::string anEntry);
311 bool RemoveEnforcedVertex(double x=0.0, double y=0.0, double z=0.0, const std::string anEntry="" );
312 const TGHS3DEnforcedVertexCoordsValues& _GetEnforcedVerticesCoordsSize() const {return _enfVertexCoordsSizeList; }
313 const TGHS3DEnforcedVertexEntryValues & _GetEnforcedVerticesEntrySize() const {return _enfVertexEntrySizeList; }
314 const TGHS3DEnforcedVertexList & _GetEnforcedVertices() const { return _enfVertexList; }
315 const TCoordsGHS3DEnforcedVertexMap & _GetEnforcedVerticesByCoords() const { return _coordsEnfVertexMap; }
316 const TGeomEntryGHS3DEnforcedVertexMap& _GetEnforcedVerticesByEntry() const { return _geomEntryEnfVertexMap; }
317 void ClearEnforcedVertices();
320 * To set enforced elements
322 bool SetEnforcedMesh(SMESH_Mesh& theMesh, SMESH::ElementType elementType, std::string name, std::string entry, std::string groupName = "");
323 bool SetEnforcedGroup(const SMESHDS_Mesh* theMeshDS, SMESH::smIdType_array_var theIDs, SMESH::ElementType elementType, std::string name, std::string entry, std::string groupName = "");
324 bool SetEnforcedElements(TIDSortedElemSet theElemSet, SMESH::ElementType elementType, std::string groupName = "");
325 const TGHS3DEnforcedMeshList _GetEnforcedMeshes() const { return _enfMeshList; }
326 const TEntryGHS3DEnforcedMeshListMap _GetEnforcedMeshesByEntry() const { return _entryEnfMeshMap; }
327 void ClearEnforcedMeshes();
328 const TIDSortedNodeGroupMap _GetEnforcedNodes() const { return _enfNodes; }
329 const TIDSortedElemGroupMap _GetEnforcedEdges() const { return _enfEdges; }
330 const TIDSortedElemGroupMap _GetEnforcedTriangles() const { return _enfTriangles; }
331 const TID2SizeMap _GetNodeIDToSizeMap() const {return _nodeIDToSizeMap; }
332 const TSetStrings _GetGroupsToRemove() const {return _groupsToRemove; }
333 void RestoreEnfElemsByMeshes(); // persistence
335 * \brief Return the enforced vertices
337 static TGHS3DEnforcedVertexList GetEnforcedVertices(const GHS3DPlugin_Hypothesis* hyp);
338 static TGHS3DEnforcedVertexCoordsValues GetEnforcedVerticesCoordsSize(const GHS3DPlugin_Hypothesis* hyp);
339 static TGHS3DEnforcedVertexEntryValues GetEnforcedVerticesEntrySize(const GHS3DPlugin_Hypothesis* hyp);
340 static TCoordsGHS3DEnforcedVertexMap GetEnforcedVerticesByCoords(const GHS3DPlugin_Hypothesis* hyp);
341 static TGeomEntryGHS3DEnforcedVertexMap GetEnforcedVerticesByEntry(const GHS3DPlugin_Hypothesis* hyp);
343 static TGHS3DEnforcedMeshList GetEnforcedMeshes(const GHS3DPlugin_Hypothesis* hyp);
344 static TEntryGHS3DEnforcedMeshListMap GetEnforcedMeshesByEntry(const GHS3DPlugin_Hypothesis* hyp);
345 static TIDSortedNodeGroupMap GetEnforcedNodes(const GHS3DPlugin_Hypothesis* hyp);
346 static TIDSortedElemGroupMap GetEnforcedEdges(const GHS3DPlugin_Hypothesis* hyp);
347 static TIDSortedElemGroupMap GetEnforcedTriangles(const GHS3DPlugin_Hypothesis* hyp);
348 static TID2SizeMap GetNodeIDToSizeMap(const GHS3DPlugin_Hypothesis* hyp);
349 static TSetStrings GetGroupsToRemove(const GHS3DPlugin_Hypothesis* hyp);
350 static bool GetToMakeGroupsOfDomains(const GHS3DPlugin_Hypothesis* hyp);
351 void ClearGroupsToRemove();
353 static bool DefaultMeshHoles();
354 static bool DefaultToMakeGroupsOfDomains();
355 static float DefaultMaximumMemory();
356 static float DefaultInitialMemory();
357 static short DefaultOptimizationLevel();
358 static std::string DefaultWorkingDirectory();
359 static bool DefaultKeepFiles();
360 static short DefaultVerboseLevel();
361 static bool DefaultToCreateNewNodes();
362 static bool DefaultToUseBoundaryRecoveryVersion();
363 static bool DefaultToUseFEMCorrection();
364 static bool DefaultToRemoveCentralPoint();
365 static bool DefaultStandardOutputLog();
366 static bool DefaultRemoveLogOnSuccess();
367 static inline double DefaultGradation() { return 1.05; }
368 static bool DefaultUseVolumeProximity() { return false; }
369 static int DefaultNbVolumeProximityLayers() { return 2; }
370 static short DefaultAlgorithm() { return MGTetra; }
371 static short DefaultNumOfThreads() { return 4; }
373 void SetMinMaxSizeDefault( double theMinSize, double theMaxSize )
374 { myMinSizeDefault = theMinSize; myMaxSizeDefault = theMaxSize; }
375 double GetMinSizeDefault() const { return myMinSizeDefault; }
376 double GetMaxSizeDefault() const { return myMaxSizeDefault; }
379 virtual std::ostream & SaveTo(std::ostream & save);
380 virtual std::istream & LoadFrom(std::istream & load);
383 * \brief Does nothing
385 virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape);
388 * \brief Sets myToMakeGroupsOfDomains depending on whether theMesh is on shape or not
390 virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0);
392 static bool ToBool(const std::string& str, bool* isOk=0);
393 static double ToDbl(const std::string& str, bool* isOk=0);
394 static int ToInt(const std::string& str, bool* isOk=0);
399 bool myToMakeGroupsOfDomains;
400 float myMaximumMemory;
401 float myInitialMemory;
402 short myOptimizationLevel;
404 std::string myWorkingDirectory;
405 short myVerboseLevel;
406 bool myToCreateNewNodes;
407 bool myToUseBoundaryRecoveryVersion;
408 bool myToUseFemCorrection;
409 bool myToRemoveCentralPoint;
410 bool myLogInStandardOutput;
411 bool myRemoveLogOnSuccess;
413 bool myUseVolumeProximity;
414 int myNbVolumeProximityLayers;
415 double myMinSize, myMinSizeDefault;
416 double myMaxSize, myMaxSizeDefault;
417 //std::string myTextOption;
418 short myAlgorithm; //member used to pivot between MG-Tetra and MG-Tetra
419 bool myUseNumOfThreads;
420 short myNumOfThreads;
421 short myPthreadModeMG;
422 short myPthreadModeMGHPC;
424 TOptionValues _option2value, _customOption2value; // user defined values
425 TOptionValues _defaultOptionValues; // default values
426 TOptionNames _doubleOptions, _charOptions, _boolOptions; // to find a type of option
427 std::vector<std::string> _commonMGTetraAdvancedOptions; // common advanced options for MGTetra and MGTetraHPC
429 TGHS3DEnforcedVertexList _enfVertexList;
430 TGHS3DEnforcedVertexCoordsValues _enfVertexCoordsSizeList;
431 TGHS3DEnforcedVertexEntryValues _enfVertexEntrySizeList;
432 // map to get "manual" enf vertex (through the coordinates)
433 TCoordsGHS3DEnforcedVertexMap _coordsEnfVertexMap;
434 // map to get "geom" enf vertex (through the geom entries)
435 TGeomEntryGHS3DEnforcedVertexMap _geomEntryEnfVertexMap;
438 TGHS3DEnforcedMeshList _enfMeshList;
439 // map to get enf meshes through the entries
440 TEntryGHS3DEnforcedMeshListMap _entryEnfMeshMap;
441 TIDSortedNodeGroupMap _enfNodes;
442 TIDSortedElemGroupMap _enfEdges;
443 TIDSortedElemGroupMap _enfTriangles;
444 TID2SizeMap _nodeIDToSizeMap;
446 TSetStrings _groupsToRemove;