Salome HOME
f3b202890534dcc0578e6aab88c864be91f6bcc5
[plugins/ghs3dplugin.git] / src / GHS3DPlugin / GHS3DPlugin_Hypothesis.hxx
1 // Copyright (C) 2004-2013  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 //  GHS3DPlugin : C++ implementation
21 // File      : GHS3DPlugin_Hypothesis.hxx
22 // Created   : Wed Apr  2 12:21:17 2008
23 // Author    : Edward AGAPOV (eap)
24 //
25 #ifndef GHS3DPlugin_Hypothesis_HeaderFile
26 #define GHS3DPlugin_Hypothesis_HeaderFile
27
28 #include "GHS3DPlugin_Defs.hxx"
29
30 #include <SMDS_MeshNode.hxx>
31
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"
37
38 #include <stdexcept>
39 #include <map>
40 #include <vector>
41 #include <cstdio>
42
43 class GHS3DPLUGIN_EXPORT GHS3DPlugin_Hypothesis: public SMESH_Hypothesis
44 {
45 public:
46
47   GHS3DPlugin_Hypothesis(int hypId, int studyId, SMESH_Gen * gen);
48
49   typedef std::map<std::vector<double>,double> TGHS3DEnforcedVertexCoordsValues;
50   typedef std::map<std::string,double> TGHS3DEnforcedVertexEntryValues;
51   
52   struct TGHS3DEnforcedVertex {
53     std::string name;
54     std::string geomEntry;
55     bool isCompound;
56     std::vector<double> coords;
57     std::string groupName;
58     double size;
59   };
60   
61   struct CompareGHS3DEnforcedVertex {
62     bool operator () (const TGHS3DEnforcedVertex* e1, const TGHS3DEnforcedVertex* e2) const {
63       if (e1 && e2) {
64         if (e1->coords.size() && e2->coords.size())
65           return (e1->coords < e2->coords);
66         else
67           return (e1->geomEntry < e2->geomEntry);
68       }
69       return false;
70     }
71   };
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;
79   
80   ////////////////////
81   // Enforced meshes
82   ////////////////////
83   
84   struct TGHS3DEnforcedMesh {
85     int         persistID;
86     std::string name;
87     std::string entry;
88     std::string groupName;
89     SMESH::ElementType elementType;
90   };
91   
92   struct CompareGHS3DEnforcedMesh {
93     bool operator () (const TGHS3DEnforcedMesh* e1, const TGHS3DEnforcedMesh* e2) const {
94       if (e1 && e2) {
95         if (e1->entry == e2->entry)
96           return (e1->elementType < e2->elementType);
97         else
98           return (e1->entry < e2->entry);
99       }
100       else
101         return false;
102     }
103   };
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;
109   
110   typedef std::map<int,double> TID2SizeMap;
111
112   struct TIDMeshIDCompare {
113     bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const
114     { return e1->getMeshId() == e2->getMeshId() ? e1->GetID() < e2->GetID() : e1->getMeshId() < e2->getMeshId() ; }
115   };
116   
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;
120
121   static const char* GetHypType() { return "GHS3D_Parameters"; }
122   /*!
123    * To mesh "holes" in a solid or not. Default is to mesh.
124    */
125   void SetToMeshHoles(bool toMesh);
126   bool GetToMeshHoles(bool checkFreeOption = false) const;
127   /*!
128    * To make groups of volumes of different domains when mesh is generated from skin.
129    * Default is to make groups.
130    * This option works only (1) for the mesh w/o shape and (2) if GetToMeshHoles() == true
131    */
132   void SetToMakeGroupsOfDomains(bool toMakeGroups);
133   bool GetToMakeGroupsOfDomains() const;
134   /*!
135    * Maximal size of memory to be used by the algorithm (in Megabytes)
136    */
137   void SetMaximumMemory(short MB);
138   short GetMaximumMemory() const;
139   /*!
140    * Initial size of memory to be used by the algorithm (in Megabytes) in
141    * automatic memory adjustment mode. Default is zero
142    */
143   void SetInitialMemory(short MB);
144   short GetInitialMemory() const;
145   /*!
146    * Optimization level: 0-none, 1-light, 2-medium, 3-standard+, 4-strong. Default is medium
147    */
148   enum OptimizationLevel { None = 0, Light, Medium, StandardPlus, Strong };
149   void SetOptimizationLevel(OptimizationLevel level);
150   OptimizationLevel GetOptimizationLevel() const;
151   /*!
152    * Path to working directory
153    */
154   void SetWorkingDirectory(const std::string& path);
155   std::string GetWorkingDirectory() const;
156   /*!
157    * To keep working files or remove them. Log file remains in case of errors anyway.
158    */
159   void SetKeepFiles(bool toKeep);
160   bool GetKeepFiles() const;
161   /*!
162    * Verbose level [0-10]
163    *  0 - no standard output,
164    *  2 - prints the data, quality statistics of the skin and final meshes and
165    *     indicates when the final mesh is being saved. In addition the software
166    *     gives indication regarding the CPU time.
167    * 10 - same as 2 plus the main steps in the computation, quality statistics
168    *     histogram of the skin mesh, quality statistics histogram together with
169    *     the characteristics of the final mesh.
170    */
171   void SetVerboseLevel(short level);
172   short GetVerboseLevel() const;
173   /*!
174    * To create new nodes
175    */
176   void SetToCreateNewNodes(bool toCreate);
177   bool GetToCreateNewNodes() const;
178   /*!
179    * To use boundary recovery version which tries to create mesh on a very poor
180    * quality surface mesh
181    */
182   void SetToUseBoundaryRecoveryVersion(bool toUse);
183   bool GetToUseBoundaryRecoveryVersion() const;
184   /*!
185    * Applies finite-element correction by replacing overconstrained elements where
186    * it is possible. The process is cutting first the overconstrained edges and
187    * second the overconstrained facets. This insure that no edges have two boundary
188    * vertices and that no facets have three boundary vertices.
189    */
190   void SetFEMCorrection(bool toUseFem);
191   bool GetFEMCorrection() const;
192   /*!
193    * To removes initial central point.
194    */
195   void SetToRemoveCentralPoint(bool toRemove);
196   bool GetToRemoveCentralPoint() const;
197   /*!
198    * To set hiden/undocumented/advanced options
199    */
200   void SetTextOption(const std::string& option);
201   std::string GetTextOption() const;
202   /*!
203   * To define the volumic gradation
204   */
205   void SetGradation(double gradation);
206   double GetGradation() const ;
207     
208   
209 //   struct TEnforcedEdge {
210 //     long ID;
211 //     long node1;
212 //     long node2;
213 //     std::string groupName;
214 //   };
215   
216
217   /*!
218    * \brief Return command to run ghs3d mesher excluding file prefix (-f)
219    */
220   static std::string CommandToRun(const GHS3DPlugin_Hypothesis* hyp,
221                                   const bool                    hasShapeToMesh=true);
222   /*!
223    * \brief Return a unique file name
224    */
225   static std::string GetFileName(const GHS3DPlugin_Hypothesis* hyp);
226   /*!
227    * \brief Return the name of executable
228    */
229   static std::string GetExeName();
230
231   /*!
232    * To set an enforced vertex
233    */
234   bool SetEnforcedVertex(std::string aName, std::string anEntry, std::string aGroupName,
235                          double size, double x=0.0, double y=0.0, double z=0.0, bool isCompound = false);
236   TGHS3DEnforcedVertex* GetEnforcedVertex(double x, double y, double z) throw (std::invalid_argument);
237   TGHS3DEnforcedVertex* GetEnforcedVertex(const std::string anEntry) throw (std::invalid_argument);
238   bool RemoveEnforcedVertex(double x=0.0, double y=0.0, double z=0.0, const std::string anEntry="" ) throw (std::invalid_argument);
239   const TGHS3DEnforcedVertexCoordsValues _GetEnforcedVerticesCoordsSize() const {return _enfVertexCoordsSizeList; }
240   const TGHS3DEnforcedVertexEntryValues  _GetEnforcedVerticesEntrySize() const {return _enfVertexEntrySizeList; }
241   const TGHS3DEnforcedVertexList         _GetEnforcedVertices() const { return _enfVertexList; }
242   const TCoordsGHS3DEnforcedVertexMap    _GetEnforcedVerticesByCoords() const { return _coordsEnfVertexMap; }
243   const TGeomEntryGHS3DEnforcedVertexMap _GetEnforcedVerticesByEntry() const { return _geomEntryEnfVertexMap; }
244   void ClearEnforcedVertices();
245
246   /*!
247    * To set enforced elements
248    */
249   bool SetEnforcedMesh(SMESH_Mesh& theMesh, SMESH::ElementType elementType, std::string name, std::string entry, std::string groupName = "");
250   bool SetEnforcedGroup(const SMESHDS_Mesh* theMeshDS, SMESH::long_array_var theIDs, SMESH::ElementType elementType, std::string name, std::string entry, std::string groupName = "");
251   bool SetEnforcedElements(TIDSortedElemSet theElemSet, SMESH::ElementType elementType, std::string groupName = "");
252   const TGHS3DEnforcedMeshList _GetEnforcedMeshes() const { return _enfMeshList; }
253   const TEntryGHS3DEnforcedMeshListMap _GetEnforcedMeshesByEntry() const { return _entryEnfMeshMap; }
254   void ClearEnforcedMeshes();
255   const TIDSortedNodeGroupMap _GetEnforcedNodes() const { return _enfNodes; }
256   const TIDSortedElemGroupMap _GetEnforcedEdges() const { return _enfEdges; }
257   const TIDSortedElemGroupMap _GetEnforcedTriangles() const { return _enfTriangles; }
258   const TID2SizeMap _GetNodeIDToSizeMap() const {return _nodeIDToSizeMap; }
259   const TSetStrings _GetGroupsToRemove() const {return _groupsToRemove; }
260   void RestoreEnfElemsByMeshes(); // persistence
261   /*!
262    * \brief Return the enforced vertices
263    */
264   static TGHS3DEnforcedVertexList GetEnforcedVertices(const GHS3DPlugin_Hypothesis* hyp);
265   static TGHS3DEnforcedVertexCoordsValues GetEnforcedVerticesCoordsSize(const GHS3DPlugin_Hypothesis* hyp);
266   static TGHS3DEnforcedVertexEntryValues  GetEnforcedVerticesEntrySize(const GHS3DPlugin_Hypothesis* hyp);
267   static TCoordsGHS3DEnforcedVertexMap GetEnforcedVerticesByCoords(const GHS3DPlugin_Hypothesis* hyp);
268   static TGeomEntryGHS3DEnforcedVertexMap GetEnforcedVerticesByEntry(const GHS3DPlugin_Hypothesis* hyp);
269   
270   static TGHS3DEnforcedMeshList GetEnforcedMeshes(const GHS3DPlugin_Hypothesis* hyp);
271   static TEntryGHS3DEnforcedMeshListMap GetEnforcedMeshesByEntry(const GHS3DPlugin_Hypothesis* hyp);
272   static TIDSortedNodeGroupMap GetEnforcedNodes(const GHS3DPlugin_Hypothesis* hyp);
273   static TIDSortedElemGroupMap GetEnforcedEdges(const GHS3DPlugin_Hypothesis* hyp);
274   static TIDSortedElemGroupMap GetEnforcedTriangles(const GHS3DPlugin_Hypothesis* hyp);
275   static TID2SizeMap GetNodeIDToSizeMap(const GHS3DPlugin_Hypothesis* hyp);
276   static TSetStrings GetGroupsToRemove(const GHS3DPlugin_Hypothesis* hyp);
277   static bool GetToMakeGroupsOfDomains(const GHS3DPlugin_Hypothesis* hyp);
278   void ClearGroupsToRemove();
279   
280   static bool   DefaultMeshHoles();
281   static bool   DefaultToMakeGroupsOfDomains();
282   static short  DefaultMaximumMemory();
283   static short  DefaultInitialMemory();
284   static short  DefaultOptimizationLevel();
285   static std::string DefaultWorkingDirectory();
286   static bool   DefaultKeepFiles();
287   static short  DefaultVerboseLevel();
288   static bool   DefaultToCreateNewNodes();
289   static bool   DefaultToUseBoundaryRecoveryVersion();
290   static bool   DefaultToUseFEMCorrection();
291   static bool   DefaultToRemoveCentralPoint();
292   static double DefaultGradation();
293   
294   static TGHS3DEnforcedVertex DefaultGHS3DEnforcedVertex() {return TGHS3DEnforcedVertex();}
295   static TGHS3DEnforcedVertexList DefaultGHS3DEnforcedVertexList() {return TGHS3DEnforcedVertexList();}
296   static TGHS3DEnforcedVertexCoordsValues DefaultGHS3DEnforcedVertexCoordsValues() {return TGHS3DEnforcedVertexCoordsValues();}
297   static TGHS3DEnforcedVertexEntryValues DefaultGHS3DEnforcedVertexEntryValues() {return TGHS3DEnforcedVertexEntryValues();}
298   static TCoordsGHS3DEnforcedVertexMap DefaultCoordsGHS3DEnforcedVertexMap() {return TCoordsGHS3DEnforcedVertexMap();}
299   static TGeomEntryGHS3DEnforcedVertexMap DefaultGeomEntryGHS3DEnforcedVertexMap() {return TGeomEntryGHS3DEnforcedVertexMap();}
300   static TGroupNameGHS3DEnforcedVertexMap DefaultGroupNameGHS3DEnforcedVertexMap() {return TGroupNameGHS3DEnforcedVertexMap();}
301   
302   static TGHS3DEnforcedMesh         DefaultGHS3DEnforcedMesh() {return TGHS3DEnforcedMesh();}
303   static TGHS3DEnforcedMeshList     DefaultGHS3DEnforcedMeshList() {return TGHS3DEnforcedMeshList();}
304   static TEntryGHS3DEnforcedMeshListMap DefaultEntryGHS3DEnforcedMeshListMap() {return TEntryGHS3DEnforcedMeshListMap();}
305   static TIDSortedNodeGroupMap      DefaultIDSortedNodeGroupMap() {return TIDSortedNodeGroupMap();}
306   static TIDSortedElemGroupMap      DefaultIDSortedElemGroupMap() {return TIDSortedElemGroupMap();}
307   static TID2SizeMap                DefaultID2SizeMap() {return TID2SizeMap();}
308   static TSetStrings                DefaultGroupsToRemove() {return TSetStrings();}
309   
310   // Persistence
311   virtual std::ostream & SaveTo(std::ostream & save);
312   virtual std::istream & LoadFrom(std::istream & load);
313   friend GHS3DPLUGIN_EXPORT std::ostream & operator <<(std::ostream & save, GHS3DPlugin_Hypothesis & hyp);
314   friend GHS3DPLUGIN_EXPORT std::istream & operator >>(std::istream & load, GHS3DPlugin_Hypothesis & hyp);
315
316   /*!
317    * \brief Does nothing
318    */
319   virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape);
320
321   /*!
322    * \brief Does nothing
323    */
324   virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0);
325
326 private:
327
328   bool   myToMeshHoles;
329   bool   myToMakeGroupsOfDomains;
330   short  myMaximumMemory;
331   short  myInitialMemory;
332   short  myOptimizationLevel;
333   bool   myKeepFiles;
334   std::string myWorkingDirectory;
335   short  myVerboseLevel;
336   bool   myToCreateNewNodes;
337   bool   myToUseBoundaryRecoveryVersion;
338   bool   myToUseFemCorrection;
339   bool   myToRemoveCentralPoint;
340   std::string myTextOption;
341   double myGradation;
342   
343   TGHS3DEnforcedVertexList _enfVertexList;
344   TGHS3DEnforcedVertexCoordsValues _enfVertexCoordsSizeList;
345   TGHS3DEnforcedVertexEntryValues _enfVertexEntrySizeList;
346   // map to get "manual" enf vertex (through the coordinates)
347   TCoordsGHS3DEnforcedVertexMap _coordsEnfVertexMap;
348   // map to get "geom" enf vertex (through the geom entries)
349   TGeomEntryGHS3DEnforcedVertexMap _geomEntryEnfVertexMap;
350   
351   
352   TGHS3DEnforcedMeshList _enfMeshList;
353   // map to get enf meshes through the entries
354   TEntryGHS3DEnforcedMeshListMap _entryEnfMeshMap;
355   TIDSortedNodeGroupMap _enfNodes;
356   TIDSortedElemGroupMap _enfEdges;
357   TIDSortedElemGroupMap _enfTriangles;
358   TID2SizeMap _nodeIDToSizeMap;
359   std::map<std::string, TIDSortedElemSet > _entryToElemsMap;
360   
361   TSetStrings _groupsToRemove;
362 };
363
364
365 #endif