2 // Class : Gestion des tableaux d'hexaedres
4 // Copyright (C) 2009-2013 CEA/DEN, EDF R&D
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
26 #include "HexEltBase.hxx"
27 #include "HexMatrix.hxx"
33 class Elements : public EltBase
36 virtual Hexa* getHexa (int nro);
37 virtual Quad* getQuad (int nro);
38 virtual Edge* getEdge (int nro);
39 virtual Vertex* getVertex (int nro);
41 Hexa* getHexaIJK (int nx, int ny, int nz);
42 Quad* getQuadIJ (int nx, int ny, int nz);
43 Quad* getQuadJK (int nx, int ny, int nz);
44 Quad* getQuadIK (int nx, int ny, int nz);
45 Edge* getEdgeI (int nx, int ny, int nz);
46 Edge* getEdgeJ (int nx, int ny, int nz);
47 Edge* getEdgeK (int nx, int ny, int nz);
48 Vertex* getVertexIJK (int nx, int ny, int nz);
50 virtual int countHexa () { return nbr_hexas ; }
51 virtual int countQuad () { return nbr_quads ; }
52 virtual int countEdge () { return nbr_edges ; }
53 virtual int countVertex () { return nbr_vertex ; }
55 Vertex* nearestVertex (Vertex* other);
57 int findVertex (Vertex* elt);
58 virtual void clearAssociation ();
59 int saveVtk (cpchar nomfic);
60 Elements (Document* doc);
64 int findHexa (Hexa* elt);
65 int findQuad (Quad* elt); // indexQuad ?
66 int findEdge (Edge* elt); // indexVertex ?
68 int findVertex (double vx, double vy, double vz);
69 Edge* findEdge (Vertex* v1, Vertex* v2);
70 Quad* findQuad (Edge* e1, Edge* e2);
72 Elements (Document* doc, int nx, int ny, int nz);
73 Elements (Elements* orig);
75 virtual ~Elements () {}
76 virtual void remove ();
78 Hexa* getStrate (int couche, EnumHQuad face);
80 int getHexas (Hexas& liste);
82 void addHexa (Hexa* element);
83 void addQuad (Quad* element);
84 void addEdge (Edge* element);
85 void addVertex (Vertex* element);
86 int transform (Matrix* matrice);
88 int saveVtk (cpchar nomfic, int& nro);
90 int makeCartesianGrid (Vertex* orig, Vector* v1, Vector* v2, Vector* v3,
91 int px, int py, int pz, int mx=0, int my=0, int mz=0);
93 int makeCylinder (Cylinder* cyl, Vector* base, int nr, int na, int nl);
94 int makePipe (Cylinder* cyl, Vector* base, int nr, int na, int nl);
96 int makeCylindricalGrid (Vertex* c, Vector* b, Vector* h,
97 double dr, double da, double dl, int nr, int na, int nl, bool fill);
99 int makeSphericalGrid (Vertex* v, Vector* dv, int nb, double k=1); // perime
100 int makeSphericalGrid (Vertex* v, double rayon, int nb, double k=1); // perime
102 int joinQuads (Quads& q0, int nb, Vertex* v1, Vertex* v2, Vertex* v3,
103 Vertex* v4, Quad* dest);
104 int coupler (int nro, Quad* other, StrOrient* orient);
106 int prismQuads (Quads& start, Vector* dv, int nb);
107 int prismQuadsVec (Quads& start, Vector* dv, RealVector& tlen, int crit);
109 int cutHexas (const Edges& edges, int nbcuts);
111 void setVertex (Vertex* node, int nx, int ny, int nz);
113 void transfoVertices (double* orig, double* base, double* haut);
114 // DELETE les 2 suivants
115 void transfoVertices (Vertex* orig, Vector* vi, Vector* vj, Vector* vk);
116 void transfoVertices (Vertex* orig, Vector* base, Vector* haut);
119 void setVertex (Vertex* node, int nro);
120 void setEdge (Edge* edge, int nro);
121 void setQuad (Quad* quad, int nro);
122 void setHexa (Hexa* cell, int nro);
124 int nroVertex (int nsommet, int nquad, int nh);
128 int getCylPoint (int nr, int na, int nh, double& px, double& py, double& pz);
129 int revolutionQuads (Quads& start, Vertex* center, Vector* axis,
132 int makeRind (EnumGrid type, Vertex* center, Vector* vx, Vector* vz,
133 double rext, double rint, double radhole,
134 Vertex* plorig, double angle, int nrad, int nang, int nhaut);
136 static int controlRind (EnumGrid type, Vertex* cx, Vector* vx, Vector* vz,
137 double rext, double rint, double radhole,
138 Vertex* plorig, double angle,
139 int nrad, int nang, int nhaut,
140 double &phi0, double &phi1);
142 int makeCylindricalGrid (Vertex* c, Vector* b, Vector* h,
143 RealVector& tdr, RealVector& tda, RealVector& tdh,
146 int replaceHexas (Quads& pattern, Vertex* p1, Vertex* c1,
147 Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3);
149 int replaceHexa (int nh, Pattern* pat, Hexa* hexa);
150 int replaceQuad (int nh, Pattern* pat, Quad* quad, Vertex* tvert[]);
151 int extrudeQuad (Pattern* pat);
153 void repVertex (int nh, int nro, Vertex* node);
154 void repEdgeH (int nh, int nro, Edge* node);
155 void repEdgeV (int nh, int nro, Edge* node);
156 void repQuadH (int nh, int nro, Quad* node);
157 void repQuadV (int nh, int nro, Quad* node);
159 Vertex* repVertex (int nh, int nro, double px, double py, double pz);
160 Edge* repEdgeV (int nh, int nro, Vertex* v1, Vertex*v2);
161 Edge* repEdgeH (int nh, int nro, Vertex* v1, Vertex*v2);
162 Quad* repQuadH (int nh, int nro, Edge* ea, Edge* eb, Edge* ec, Edge* ed);
163 Quad* repQuadV (int nh, int nro, Edge* ea, Edge* eb, Edge* ec, Edge* ed);
164 Hexa* repHexa (int nh, int nro, Quad* qa, Quad* qb, Quad* qc,
165 Quad* qd, Quad* qe, Quad* qf);
167 Vertex* repVertex (int nh, int nro);
168 Edge* repEdgeV (int nh, int nro);
169 Edge* repEdgeH (int nh, int nro);
170 Quad* repQuadH (int nh, int nro);
171 Quad* repQuadV (int nh, int nro);
173 virtual Hexa* getKerHexa (int nro) { return ker_hexa [nro] ; }
174 virtual Quad* getKerHQuad (int nro) { return ker_hquad [nro] ; }
175 virtual Quad* getKerVQuad (int nro) { return ker_vquad [nro] ; }
176 virtual Edge* getKerHEdge (int nro) { return ker_hedge [nro] ; }
177 virtual Edge* getKerVEdge (int nro) { return ker_vedge [nro] ; }
179 void moveDisco (Hexa* hexa);
183 int makeCartesian (Vertex* origine, double* vx, double* vy, double* vz,
184 RealVector& lx, RealVector& ly, RealVector& lz);
185 int makeCylinder (Vertex* origine, double* vx, double* vz,
186 RealVector& rayon, RealVector& angle, RealVector& hauteur,
188 int makeSpherical (double* centre, double* vx, double* vz, RealVector& ray,
190 int makeRind (EnumGrid type, double* centre, double* vx, double* vz,
191 RealVector& rayon, RealVector& angle, RealVector& hauteur);
193 int extrudeQuads (Quads& quads, double* axe, RealVector& val,
194 bool revol=false, Vertex* center=NULL);
196 int joinQuads (Quads& quadsa, Quad* quadb, Vertex* va1, Vertex* vb1,
197 Vertex* va2, Vertex* vb2, RealVector& longueur);
199 int cutEdge (Edge* edge, RealVector& longueur);
202 void checkSystem (int nro, Vector* vx, Vector* vy, Vector* vz,
203 double* ux, double* uy, double* uz);
204 void checkSystem (int nro, Vector* vx, Vector* vz, double* ux, double* uz);
205 void checkSize (int nro, int nx, int ny, int nz, bool rad=false);
206 void checkVector (int nro, RealVector& table, int lgmin=1, bool relative=false);
207 void checkPipe (int nro, double rint, double rext, double ang, double hot);
208 void checkOrig (int nro, Vertex* orig);
209 void checkDiams (int nro, double rint, double rext);
211 int checkPhi (bool sphere, double* orig, double* norm, double rmax,
212 double rhole, Vertex* plan, double& phi0, double& phi1);
214 int checkInter (double* pa, double* ua, double raya, double lga,
215 double* pb, double* ub, double rayb, double lgb,
216 double* center, bool& left, bool& right);
218 void makeNormale (Quads& tquads, double* normale, double& larg) { } // TODO
219 void checkQuads (Quads& tquads);
220 void checkQuad (Quad* quad, int nro=0);
221 void checkAxis (Vector* vect, double* axe);
222 void checkSense (int nro, Vertex* v1, Vertex* v2, Quad* quad);
224 void checkDisco (Hexas& thexas, Edges& tedges);
225 void checkDisco (Hexa* cell, Quad* element);
226 void checkDisco (Hexa* cell, Edge* element);
227 void checkDisco (Hexa* cell, Vertex* element);
231 void cutAssociation (Shapes& tshapes, Edges& tedges, bool exist=true);
232 void cutAssociation (Edge* orig, Edges& tedges);
233 void assoCylinder (Vertex* center, Vector* vz, double rayon);
234 void assoCylinders (Vertex* center, Vector* vz, double ray, RealVector& ta);
235 void assoCylinders (double* orig, double* vz, double ray, RealVector& ta);
237 void assoRind (double* center, double* vx, int nx, NewShape* geom);
239 void assoSphere (double* center, Edge* t_edge[], Quad* t_quad[]);
240 void assoCircle (double* center, Edge* ed1, Edge* ed2, NewShape* geom);
241 void assoResiduelle ();
243 int makeBasicCylinder (RealVector& tdr, RealVector& tda, RealVector& tdh,
246 int propagateAssociation (Edge* orig, Edge* dest, Edge* dir);
249 void updateMatrix (int hauteur);
252 int prismAssociation (Edge* orig, Edge* dest, int nh);
255 int makeRindPoint (double ray, double ang, double haut, double& px,
256 double& py, double& pz);
265 void fillCenterOdd ();
267 int prismHexas (int nro, Quad* sol, int hauteur);
269 void setVertex (int nx, int ny, int nz, double px, double py, double pz);
270 void setEdge (Edge* edge, EnumCoord dir, int nx, int ny, int nz);
271 void setQuad (Quad* quad, EnumCoord dir, int nx, int ny, int nz);
272 void setHexa (Hexa* cell, int nx, int ny, int nz);
274 Edge* newEdge (Vertex* v1, Vertex* v2);
275 Quad* newQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4);
276 Hexa* newHexa (Quad* e1, Quad* e2, Quad* e3, Quad* e4, Quad* e5, Quad* e6);
278 void resize (EnumGrid type, int nx, int ny=0, int nz=0, int nplus=0);
280 int makeCartesianNodes (Vertex* orig, Vector* v1, Vector* v2, Vector* v3,
281 int px, int py, int pz, int mx=0, int my=0, int mz=0);
283 int makeCylindricalNodes (Vertex* c, Vector* b, Vector* h,
284 double dr, double da, double dl, int nr, int na, int nl, bool fill);
286 int makeBasicCylinder (double dr, double da, double dl, int nr, int na,
289 int addStrate (Quad* i_quad[], Edge* i_edge[], Vertex* i_node[], // DEL
290 Vertex* center, double lambda);
292 int addStrate (Quad* i_quad[], Edge* i_edge[], Vertex* i_node[],
293 double* center, double lambda);
295 int indVertex (int nsommet, int nquad, int nh);
296 int indVertex (int ref_vert, int nh);
297 int nroEdgeH (int nvertex);
298 int nroEdgeH (int nsommet, int nquad, int nh);
299 int nroHexa (int nquad, int nh);
301 void copyVertex (Elements* other, int px, int py, int pz,
302 int nx, int ny, int nz);
303 void completerGrille (double hauteur);
304 NewShape* getShape ();
311 std::vector<Hexa*> tab_hexa;
312 std::vector<Quad*> tab_quad;
313 std::vector<Edge*> tab_edge;
314 std::vector<Edge*> tab_pilier;
315 std::vector<Vertex*> tab_vertex;
317 std::vector<Quad*> tab_orig;
319 int size_hx, size_hy, size_hz, size_hplus;
320 int size_qx, size_qy, size_qz, size_qhplus, size_qvplus;
321 int size_ex, size_ey, size_ez, size_ehplus, size_evplus;
322 int size_vx, size_vy, size_vz;
324 int nbr_hexas, nbr_quads, nbr_edges, nbr_vertex;
325 int nbr_orig, nbr_piliers, ker_vertex;
327 int gr_rayon; // Spheric
328 int gr_hauteur; // Joint
329 int nbr_secteurs; // Cyl
331 bool cyl_closed; // Angle = 180 degres
332 bool cyl_fill; // Interieur rempli
333 bool val_absolues; // Version Hexa6
334 EnumCyl cyl_dispo; // Type de remplissage
337 bool revo_lution; // Number 9 ...
342 RealVector gen_values; // Angle pour la revolution
343 RealVector cum_values; // Valeurs cumulees
345 Matrix cum_matrix; // Matrice angles cumules
351 // EnumGrid grid_type; // deja la
352 bool grid_nocart; // Grille non cartesienne : no acces aux getTrucIJK
354 double cyl_radhole, cyl_radext, cyl_radint;
355 double cyl_dtheta; // angle = na*dtheta
356 double cyl_phi0, cyl_dphi; // angle = phi0 + nh*dphi;
362 std::vector<Hexa*> ker_hexa;
363 std::vector<Quad*> ker_hquad, ker_vquad;
364 std::vector<Edge*> ker_hedge, ker_vedge;
366 NewShape* grid_geom; // Utilise pour faire la revolution
367 std::map <std::string, int> map_shape;