X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHEXABLOCK%2FHexElements_bis.cxx;h=92b13bee7e26bbb0ad04ac42b45a1c16b756106c;hb=167be4931bccbbe01e53313d18a9d3dd1484ecb4;hp=77658c3a34ab19e34d7adc5e2276aafde17df0dd;hpb=477b7b7c83bbdc72658b0561639a253afb8ab62d;p=modules%2Fhexablock.git diff --git a/src/HEXABLOCK/HexElements_bis.cxx b/src/HEXABLOCK/HexElements_bis.cxx old mode 100755 new mode 100644 index 77658c3..92b13be --- a/src/HEXABLOCK/HexElements_bis.cxx +++ b/src/HEXABLOCK/HexElements_bis.cxx @@ -1,12 +1,12 @@ // C++ : Table d'hexaedres -// Copyright (C) 2009-2012 CEA/DEN, EDF R&D +// Copyright (C) 2009-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -29,17 +29,12 @@ #include "HexEdge.hxx" #include "HexGlobale.hxx" -#include "HexCylinder.hxx" -#include "HexShape.hxx" +#include "HexNewShape.hxx" #include BEGIN_NAMESPACE_HEXA -void geom_dump_asso (Edge* edge); -void geom_create_circle (double* milieu, double rayon, double* normale, - double* base, string& brep); - // ====================================================== getHexaIJK Hexa* Elements::getHexaIJK (int nx, int ny, int nz) { @@ -50,9 +45,11 @@ Hexa* Elements::getHexaIJK (int nx, int ny, int nz) else if (grid_nocart) return NULL; - int nro = nx + size_hx*ny + size_hx*size_hy*nz; + int nro = nx + size_hx*ny + size_hx*size_hy*nz; - return tab_hexa [nro]; + DumpStart ("getHexaIJK", nx << ny << nz); + DumpReturn (tab_hexa [nro]); + return tab_hexa [nro]; } // ====================================================== getQuadIJ Quad* Elements::getQuadIJ (int nx, int ny, int nz) @@ -64,9 +61,12 @@ Quad* Elements::getQuadIJ (int nx, int ny, int nz) else if (grid_nocart) return NULL; - int nro = nx + size_qx*ny + size_qx*size_qy*nz + int nro = nx + size_qx*ny + size_qx*size_qy*nz + size_qx*size_qy*size_qz*dir_z; - return tab_quad [nro]; + + DumpStart ("getQuadIJ", nx << ny << nz); + DumpReturn (tab_quad [nro]); + return tab_quad [nro]; } // ====================================================== getQuadJK Quad* Elements::getQuadJK (int nx, int ny, int nz) @@ -80,7 +80,9 @@ Quad* Elements::getQuadJK (int nx, int ny, int nz) int nro = nx + size_qx*ny + size_qx*size_qy*nz; // + dir_x*... - return tab_quad [nro]; + DumpStart ("getQuadJK", nx << ny << nz); + DumpReturn (tab_quad [nro]); + return tab_quad [nro]; } // ====================================================== getQuadIK Quad* Elements::getQuadIK (int nx, int ny, int nz) @@ -94,7 +96,9 @@ Quad* Elements::getQuadIK (int nx, int ny, int nz) int nro = nx + size_qx*ny + size_qx*size_qy*nz + size_qx*size_qy*size_qz; - return tab_quad [nro]; + DumpStart ("getQuadIK", nx << ny << nz); + DumpReturn (tab_quad [nro]); + return tab_quad [nro]; } // ====================================================== getEdgeI Edge* Elements::getEdgeI (int nx, int ny, int nz) @@ -108,7 +112,9 @@ Edge* Elements::getEdgeI (int nx, int ny, int nz) int nro = nx + size_ex*ny + size_ex*size_ey*nz; - return tab_edge [nro]; + DumpStart ("getEdgeI", nx << ny << nz); + DumpReturn (tab_edge [nro]); + return tab_edge [nro]; } // ====================================================== getEdgeJ Edge* Elements::getEdgeJ (int nx, int ny, int nz) @@ -122,7 +128,9 @@ Edge* Elements::getEdgeJ (int nx, int ny, int nz) int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez; - return tab_edge [nro]; + DumpStart ("getEdgeJ", nx << ny << nz); + DumpReturn (tab_edge [nro]); + return tab_edge [nro]; } // ====================================================== getEdgeK Edge* Elements::getEdgeK (int nx, int ny, int nz) @@ -134,9 +142,12 @@ Edge* Elements::getEdgeK (int nx, int ny, int nz) else if (grid_nocart) return NULL; - int nro = nx + size_ex*ny + size_ex*size_ey*nz + int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez*dir_z; - return tab_edge [nro]; + + DumpStart ("getEdgeK", nx << ny << nz); + DumpReturn (tab_edge [nro]); + return tab_edge [nro]; } // ====================================================== getVertexIJK Vertex* Elements::getVertexIJK (int nx, int ny, int nz) @@ -148,25 +159,27 @@ Vertex* Elements::getVertexIJK (int nx, int ny, int nz) else if (grid_nocart) return NULL; - int nro = nx + size_vx*ny + size_vx*size_vy*nz; + int nro = nx + size_vx*ny + size_vx*size_vy*nz; - return tab_vertex [nro]; + DumpStart ("getVertexIJK", nx << ny << nz); + DumpReturn (tab_vertex [nro]); + return tab_vertex [nro]; } // ====================================================== setVertex void Elements::setVertex (Vertex* elt, int nx, int ny, int nz) { - if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy - || nz < 0 || nz >= size_vz) return; + if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy + || nz < 0 || nz >= size_vz) return; int nro = nx + size_vx*ny + size_vx*size_vy*nz; tab_vertex [nro] = elt; } // ====================================================== setVertex (2) -void Elements::setVertex (int nx, int ny, int nz, double px, double py, +void Elements::setVertex (int nx, int ny, int nz, double px, double py, double pz) { - if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy - || nz < 0 || nz >= size_vz) return; + if ( nx < 0 || nx >= size_vx || ny < 0 || ny >= size_vy + || nz < 0 || nz >= size_vz) return; Vertex* node = el_root->addVertex (px, py, pz); setVertex (node, nx, ny, nz); @@ -179,7 +192,7 @@ void Elements::setEdge (Edge* elt, EnumCoord dir, int nx, int ny, int nz) return; int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez*dir; - tab_edge [nro] = elt; + tab_edge [nro] = elt; } // ====================================================== setQuad void Elements::setQuad (Quad* elt, EnumCoord dir, int nx, int ny, int nz) @@ -189,13 +202,13 @@ void Elements::setQuad (Quad* elt, EnumCoord dir, int nx, int ny, int nz) return; int nro = nx + size_ex*ny + size_ex*size_ey*nz + size_ex*size_ey*size_ez*dir; - tab_quad [nro] = elt; + tab_quad [nro] = elt; } // ====================================================== setHexa void Elements::setHexa (Hexa* elt, int nx, int ny, int nz) { - if ( nx < 0 || nx >= size_hx || ny < 0 || ny >= size_hy - || nz < 0 || nz >= size_hz) return; + if ( nx < 0 || nx >= size_hx || ny < 0 || ny >= size_hy + || nz < 0 || nz >= size_hz) return; int nro = nx + size_hx*ny + size_hx*size_hy*nz; tab_hexa [nro] = elt; @@ -209,181 +222,23 @@ void Elements::remove () if (tab_hexa[nh] != NULL) tab_hexa[nh]->remove(); } -// ====================================================== makeCylinder -int Elements::makeCylinder (Cylinder* cyl, Vector* vx, int nr, int na, int nl) -{ - if (BadElement (cyl) || BadElement (vx) || nr<=0 || na <=3 || nl <=0 - || vx->getNorm () <= Epsil) - { - setError (); - return HERR; - } - - Vertex* orig = cyl->getBase (); - Vector* dir = cyl->getDirection (); - double ray = cyl->getRadius (); - double haut = cyl->getHeight (); - - resize (GR_CYLINDRIC, nr, na, nl); - cyl_closed = true; - makeCylindricalNodes (orig, vx, dir, ray/(nr+1), 360, haut/nl, - nr, na, nl, true); - fillGrid (); - assoCylinder (orig, dir, 360); - return HOK; -} -// ====================================================== makePipe -int Elements::makePipe (Cylinder* cyl, Vector* vx, int nr, int na, int nl) -{ - if (BadElement (cyl) || BadElement (vx) || nr<=0 || na <=3 || nl <=0 - || vx->getNorm () <= Epsil) - { - setError (); - return HERR; - } - - Vertex* orig = cyl->getBase (); - Vector* dir = cyl->getDirection (); - double ray = cyl->getRadius (); - double haut = cyl->getHeight (); - - resize (GR_CYLINDRIC, nr, na, nl); - cyl_closed = true; - makeCylindricalNodes (orig, vx, dir, ray, 360, haut, nr, na, nl, false); - fillGrid (); - assoCylinder (orig, dir, 360); - return HOK; -} -// -// ---------------------------------------- prism Quads -// -// ====================================================== prismQuads -int Elements::prismQuads (Quads& tstart, Vector* dir, int nbiter) -{ - if (BadElement (dir) || dir->getNorm () <= Epsil || nbiter <= 0) - { - setError (); - return HERR; - } - - el_root->markAll (NO_USED); - int nbcells = tstart.size (); - nbr_vertex = 0; - nbr_edges = 0; - - nbr_hexas = nbcells*nbiter; - - tab_hexa.resize (nbr_hexas); - tab_quad.clear (); // verticaux - ker_hquad.clear (); // Horizontaux - tab_edge.clear (); - tab_pilier.clear (); - tab_vertex.clear (); - - revo_lution = false; - prism_vec = false; - gen_matrix.defTranslation (dir); - - for (int nro=0 ; nrogetNorm () <= Epsil || nbiter <= 0) - { - setError (); - return HERR; - } - - el_root->markAll (NO_USED); - int nbcells = tstart.size (); - nbr_vertex = 0; - nbr_edges = 0; - - nbr_hexas = nbcells*nbiter; - - tab_hexa.resize (nbr_hexas); - tab_quad.clear (); // verticaux - ker_hquad.clear (); // Horizontaux - tab_edge.clear (); - tab_pilier.clear (); - tab_vertex.clear (); - - revo_lution = false; - prism_vec = true; - dir->getCoord (prism_dir); - normer_vecteur (prism_dir); - gen_values = tlen; - - for (int nro=0 ; nrogetNorm () <= Epsil) - { - setError (); - return HERR; - } - - el_root->markAll (NO_USED); - nbr_vertex = 0; - nbr_edges = 0; - - nbr_hexas = nbcells*nbiter; - - tab_hexa.resize (nbr_hexas); - tab_quad.clear (); // verticaux - ker_hquad.clear (); // Horizontaux - tab_edge.clear (); - tab_pilier.clear (); - tab_vertex.clear (); - - revo_lution = true; - prism_vec = false; - revo_axis = axis; - revo_center = center; - gen_values = angles; - - for (int nro=0 ; nrogetVertex (ns); + Vertex* vbase = qbase->getVertex (ns); int indx = vbase->getMark (); if (indx<0) { + bool asso = vbase->isAssociated(); + vbase->getAssoCoord (koord); + indx = nbr_vertex++; vbase->setMark (indx); Vertex* nd0 = vbase; @@ -391,33 +246,21 @@ int Elements::prismHexas (int nro, Quad* qbase, int hauteur) double beta = 0; if (revo_lution) { - Real3 centre, vk, point, om; + Real3 centre, point, om; revo_center->getPoint (centre); vbase ->getPoint (point); - revo_axis ->getCoord (vk); - normer_vecteur (vk); - calc_vecteur (centre, point, om); - double oh = prod_scalaire (om, vk); - double rayon = 0; + calc_vecteur (centre, point, om); + double oh = prod_scalaire (om, revo_axe); + double rayon = 0; Real3 ph, hm; for (int dd=dir_x; dd<=dir_z ; dd++) { - ph [dd] = centre [dd] + oh*vk[dd]; + ph [dd] = centre [dd] + oh*revo_axe[dd]; hm [dd] = point [dd] - ph[dd]; rayon += hm[dd] * hm[dd]; } - rayon = sqrt (rayon); -/******************************** - PutCoord (centre); - PutCoord (point); - PutData (oh); - PutCoord (ph); - PutData (rayon); - PutCoord (vk); - PutCoord (hm); -********************************/ - geom_create_circle (ph, rayon, vk, hm, c_rep); + subid = grid_geom->addCircle (ph, sqrt(rayon), revo_axe, hm); } for (int nh=0 ; nhsetBounds (alpha/360, beta/360); - pilier->addAssociation (shape); - // geom_dump_asso (pilier); + beta = alpha + gen_values[nh]; + grid_geom->addAssociation (pilier, subid, alpha/360, beta/360); + } + if (asso) + { + cum_matrix.perform (koord, transfo); + nd1->setAssociation (transfo); } nd0 = nd1; } @@ -460,7 +305,7 @@ int Elements::prismHexas (int nro, Quad* qbase, int hauteur) for (int nh=0 ; nhisAssociated ()) + prismAssociation (ebase, ed0, nh); } } ind_poutre [ns] = indx; @@ -483,14 +329,14 @@ int Elements::prismHexas (int nro, Quad* qbase, int hauteur) int nv3 = hauteur*ind_poutre [3]; for (int nh=0 ; nh0 ? gen_values[hauteur-1] : 0; - double dh = gen_values[hauteur] - h0; - Real3 decal; + double hauteur = (nh+1)*prism_len; + double dh = prism_len; + if (prism_vec) + { + if (under_v6) + { + hauteur = gen_values[nh]; + dh = nh>0 ? hauteur-gen_values[nh-1] : hauteur; + } + else + { + hauteur = cum_values[nh]; + dh = gen_values[nh]; + } + } + Real3 trans, decal; for (int nc=dir_x ; nc<=dir_z ; nc++) - decal [nc] = prism_dir [nc]*dh; + { + decal [nc] = prism_dir [nc]*dh; + trans [nc] = prism_dir [nc]*hauteur; + } + gen_matrix.defTranslation (decal); + cum_matrix.defTranslation (trans); } } // ====================================================== endPrism void Elements::endPrism () { + closeShape(); + int nbelts = ker_hquad.size(); for (int nro=0 ; nroaddShape (name.c_str(), SH_EXTRUD); + grid_geom -> openShape(); + } + + return grid_geom; +} +// ====================================================== closeShape +void Elements::closeShape() +{ + if (grid_geom==NULL) + return; + + grid_geom -> closeShape(); + grid_geom = NULL; +} END_NAMESPACE_HEXA