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);
66 int findEdge (Edge* elt);
68 int findVertex (double vx, double vy, double vz);
70 Elements (Document* doc, int nx, int ny, int nz);
71 Elements (Elements* orig);
73 virtual ~Elements () {}
74 virtual void remove ();
76 Hexa* getStrate (int couche, EnumHQuad face);
78 int getHexas (Hexas& liste);
80 void addHexa (Hexa* element);
81 void addQuad (Quad* element);
82 void addEdge (Edge* element);
83 void addVertex (Vertex* element);
84 int transform (Matrix* matrice);
86 int saveVtk (cpchar nomfic, int& nro);
88 int makeCartesianGrid (Vertex* orig, Vector* v1, Vector* v2, Vector* v3,
89 int px, int py, int pz, int mx=0, int my=0, int mz=0);
91 int makeCylinder (Cylinder* cyl, Vector* base, int nr, int na, int nl);
92 int makePipe (Cylinder* cyl, Vector* base, int nr, int na, int nl);
94 int makeCylindricalGrid (Vertex* c, Vector* b, Vector* h,
95 double dr, double da, double dl, int nr, int na, int nl, bool fill);
97 int makeSphericalGrid (Vertex* v, Vector* dv, int nb, double k=1); // perime
98 int makeSphericalGrid (Vertex* v, double rayon, int nb, double k=1); // perime
100 int joinQuads (Quads& q0, int nb, Vertex* v1, Vertex* v2, Vertex* v3,
101 Vertex* v4, Quad* dest);
102 int coupler (int nro, Quad* other, StrOrient* orient);
104 int prismQuads (Quads& start, Vector* dv, int nb);
105 int prismQuadsVec (Quads& start, Vector* dv, RealVector& tlen, int crit);
107 int cutHexas (const Edges& edges, int nbcuts);
109 void setVertex (Vertex* node, int nx, int ny, int nz);
111 void transfoVertices (double* orig, double* base, double* haut);
112 // DELETE les 2 suivants
113 void transfoVertices (Vertex* orig, Vector* vi, Vector* vj, Vector* vk);
114 void transfoVertices (Vertex* orig, Vector* base, Vector* haut);
117 void setVertex (Vertex* node, int nro);
118 void setEdge (Edge* edge, int nro);
119 void setQuad (Quad* quad, int nro);
120 void setHexa (Hexa* cell, int nro);
122 int nroVertex (int nsommet, int nquad, int nh);
126 int getCylPoint (int nr, int na, int nh, double& px, double& py, double& pz);
127 int revolutionQuads (Quads& start, Vertex* center, Vector* axis,
130 int makeRind (EnumGrid type, Vertex* center, Vector* vx, Vector* vz,
131 double rext, double rint, double radhole,
132 Vertex* plorig, double angle, int nrad, int nang, int nhaut);
134 static int controlRind (EnumGrid type, Vertex* cx, Vector* vx, Vector* vz,
135 double rext, double rint, double radhole,
136 Vertex* plorig, double angle,
137 int nrad, int nang, int nhaut,
138 double &phi0, double &phi1);
140 int makeCylindricalGrid (Vertex* c, Vector* b, Vector* h,
141 RealVector& tdr, RealVector& tda, RealVector& tdh,
144 int replaceHexas (Quads& pattern, Vertex* p1, Vertex* c1,
145 Vertex* p2, Vertex* c2, Vertex* p3, Vertex* c3);
147 int replaceHexa (int nh, Pattern* pat, Hexa* hexa);
148 int replaceQuad (int nh, Pattern* pat, Quad* quad, Vertex* tvert[]);
149 int extrudeQuad (Pattern* pat);
151 void repVertex (int nh, int nro, Vertex* node);
152 void repEdgeH (int nh, int nro, Edge* node);
153 void repEdgeV (int nh, int nro, Edge* node);
154 void repQuadH (int nh, int nro, Quad* node);
155 void repQuadV (int nh, int nro, Quad* node);
157 Vertex* repVertex (int nh, int nro, double px, double py, double pz);
158 Edge* repEdgeV (int nh, int nro, Vertex* v1, Vertex*v2);
159 Edge* repEdgeH (int nh, int nro, Vertex* v1, Vertex*v2);
160 Quad* repQuadH (int nh, int nro, Edge* ea, Edge* eb, Edge* ec, Edge* ed);
161 Quad* repQuadV (int nh, int nro, Edge* ea, Edge* eb, Edge* ec, Edge* ed);
162 Hexa* repHexa (int nh, int nro, Quad* qa, Quad* qb, Quad* qc,
163 Quad* qd, Quad* qe, Quad* qf);
165 Vertex* repVertex (int nh, int nro);
166 Edge* repEdgeV (int nh, int nro);
167 Edge* repEdgeH (int nh, int nro);
168 Quad* repQuadH (int nh, int nro);
169 Quad* repQuadV (int nh, int nro);
171 virtual Hexa* getKerHexa (int nro) { return ker_hexa [nro] ; }
172 virtual Quad* getKerHQuad (int nro) { return ker_hquad [nro] ; }
173 virtual Quad* getKerVQuad (int nro) { return ker_vquad [nro] ; }
174 virtual Edge* getKerHEdge (int nro) { return ker_hedge [nro] ; }
175 virtual Edge* getKerVEdge (int nro) { return ker_vedge [nro] ; }
177 void moveDisco (Hexa* hexa);
181 int makeCartesian (Vertex* origine, double* vx, double* vy, double* vz,
182 RealVector& lx, RealVector& ly, RealVector& lz);
183 int makeCylinder (Vertex* origine, double* vx, double* vz,
184 RealVector& rayon, RealVector& angle, RealVector& hauteur,
186 int makeSpherical (double* centre, double* vx, double* vz, RealVector& ray,
188 int makeRind (EnumGrid type, double* centre, double* vx, double* vz,
189 RealVector& rayon, RealVector& angle, RealVector& hauteur);
191 int extrudeQuads (Quads& quads, double* axe, RealVector& val,
192 bool revol=false, Vertex* center=NULL);
194 int joinQuads (Quads& quadsa, Quad* quadb, Vertex* va1, Vertex* vb1,
195 Vertex* va2, Vertex* vb2, RealVector& longueur);
197 int cutEdge (Edge* edge, RealVector& longueur);
200 void checkSystem (int nro, Vector* vx, Vector* vy, Vector* vz,
201 double* ux, double* uy, double* uz);
202 void checkSystem (int nro, Vector* vx, Vector* vz, double* ux, double* uz);
203 void checkSize (int nro, int nx, int ny, int nz, bool rad=false);
204 void checkVector (int nro, RealVector& table, int lgmin=1, bool relative=false);
205 void checkPipe (int nro, double rint, double rext, double ang, double hot);
206 void checkOrig (int nro, Vertex* orig);
207 void checkDiams (int nro, double rint, double rext);
209 int checkPhi (bool sphere, double* orig, double* norm, double rmax,
210 double rhole, Vertex* plan, double& phi0, double& phi1);
212 int checkInter (double* pa, double* ua, double raya, double lga,
213 double* pb, double* ub, double rayb, double lgb,
214 double* center, bool& left, bool& right);
216 void makeNormale (Quads& tquads, double* normale, double& larg) { } // TODO
217 void checkQuads (Quads& tquads);
218 void checkQuad (Quad* quad, int nro=0);
219 void checkAxis (Vector* vect, double* axe);
220 void checkSense (int nro, Vertex* v1, Vertex* v2, Quad* quad);
222 void checkDisco (Hexas& thexas, Edges& tedges);
223 void checkDisco (Hexa* cell, Quad* element);
224 void checkDisco (Hexa* cell, Edge* element);
225 void checkDisco (Hexa* cell, Vertex* element);
229 void cutAssociation (Shapes& tshapes, Edges& tedges, bool exist=true);
230 void cutAssociation (Edge* orig, Edges& tedges);
231 void assoCylinder (Vertex* center, Vector* vz, double rayon);
232 void assoCylinders (Vertex* center, Vector* vz, double ray, RealVector& ta);
233 void assoCylinders (double* orig, double* vz, double ray, RealVector& ta);
235 void assoRind (double* center, double* vx, int nx, NewShape* geom);
237 void assoSphere (double* center, Edge* t_edge[], Quad* t_quad[]);
238 void assoCircle (double* center, Edge* ed1, Edge* ed2, NewShape* geom);
239 void assoResiduelle ();
241 int makeBasicCylinder (RealVector& tdr, RealVector& tda, RealVector& tdh,
244 int propagateAssociation (Edge* orig, Edge* dest, Edge* dir);
247 void updateMatrix (int hauteur);
250 int prismAssociation (Edge* orig, Edge* dest, int nh);
253 int makeRindPoint (double ray, double ang, double haut, double& px,
254 double& py, double& pz);
263 void fillCenterOdd ();
265 int prismHexas (int nro, Quad* sol, int hauteur);
267 void setVertex (int nx, int ny, int nz, double px, double py, double pz);
268 void setEdge (Edge* edge, EnumCoord dir, int nx, int ny, int nz);
269 void setQuad (Quad* quad, EnumCoord dir, int nx, int ny, int nz);
270 void setHexa (Hexa* cell, int nx, int ny, int nz);
272 Edge* newEdge (Vertex* v1, Vertex* v2);
273 Quad* newQuad (Edge* e1, Edge* e2, Edge* e3, Edge* e4);
274 Hexa* newHexa (Quad* e1, Quad* e2, Quad* e3, Quad* e4, Quad* e5, Quad* e6);
276 void resize (EnumGrid type, int nx, int ny=0, int nz=0, int nplus=0);
278 int makeCartesianNodes (Vertex* orig, Vector* v1, Vector* v2, Vector* v3,
279 int px, int py, int pz, int mx=0, int my=0, int mz=0);
281 int makeCylindricalNodes (Vertex* c, Vector* b, Vector* h,
282 double dr, double da, double dl, int nr, int na, int nl, bool fill);
284 int makeBasicCylinder (double dr, double da, double dl, int nr, int na,
287 int addStrate (Quad* i_quad[], Edge* i_edge[], Vertex* i_node[], // DEL
288 Vertex* center, double lambda);
290 int addStrate (Quad* i_quad[], Edge* i_edge[], Vertex* i_node[],
291 double* center, double lambda);
293 int indVertex (int nsommet, int nquad, int nh);
294 int indVertex (int ref_vert, int nh);
295 int nroEdgeH (int nvertex);
296 int nroEdgeH (int nsommet, int nquad, int nh);
297 int nroHexa (int nquad, int nh);
299 void copyVertex (Elements* other, int px, int py, int pz,
300 int nx, int ny, int nz);
301 void completerGrille (double hauteur);
302 NewShape* getShape ();
309 std::vector<Hexa*> tab_hexa;
310 std::vector<Quad*> tab_quad;
311 std::vector<Edge*> tab_edge;
312 std::vector<Edge*> tab_pilier;
313 std::vector<Vertex*> tab_vertex;
315 std::vector<Quad*> tab_orig;
317 int size_hx, size_hy, size_hz, size_hplus;
318 int size_qx, size_qy, size_qz, size_qhplus, size_qvplus;
319 int size_ex, size_ey, size_ez, size_ehplus, size_evplus;
320 int size_vx, size_vy, size_vz;
322 int nbr_hexas, nbr_quads, nbr_edges, nbr_vertex;
323 int nbr_orig, nbr_piliers, ker_vertex;
325 int gr_rayon; // Spheric
326 int gr_hauteur; // Joint
327 int nbr_secteurs; // Cyl
329 bool cyl_closed; // Angle = 180 degres
330 bool cyl_fill; // Interieur rempli
331 bool val_absolues; // Version Hexa6
332 EnumCyl cyl_dispo; // Type de remplissage
335 bool revo_lution; // Number 9 ...
340 RealVector gen_values; // Angle pour la revolution
341 RealVector cum_values; // Valeurs cumulees
343 Matrix cum_matrix; // Matrice angles cumules
349 // EnumGrid grid_type; // deja la
350 bool grid_nocart; // Grille non cartesienne : no acces aux getTrucIJK
352 double cyl_radhole, cyl_radext, cyl_radint;
353 double cyl_dtheta; // angle = na*dtheta
354 double cyl_phi0, cyl_dphi; // angle = phi0 + nh*dphi;
360 std::vector<Hexa*> ker_hexa;
361 std::vector<Quad*> ker_hquad, ker_vquad;
362 std::vector<Edge*> ker_hedge, ker_vedge;
364 NewShape* grid_geom; // Utilise pour faire la revolution
365 std::map <std::string, int> map_shape;