diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp index 271f460147d97c612b50620b9de01a935684b7c9..f2ad9f9378a431230adfab50090b70efb617e010 100644 --- a/Geo/GEdge.cpp +++ b/Geo/GEdge.cpp @@ -48,15 +48,15 @@ void GEdge::deleteMesh() void GEdge::setMeshMaster(GEdge* ge,int ori) { #warning missing:computation of affine transformation during setMeshMaster - + GEntity::setMeshMaster(ge); masterOrientation = ori > 0 ? 1:-1; - + if (ori < 0) { vertexCounterparts[getBeginVertex()] = ge->getEndVertex(); vertexCounterparts[getEndVertex()] = ge->getBeginVertex(); getBeginVertex()->setMeshMaster(ge->getEndVertex()); - getEndVertex() ->setMeshMaster(ge->getBeginVertex()); + getEndVertex() ->setMeshMaster(ge->getBeginVertex()); } else { vertexCounterparts[getBeginVertex()] = ge->getBeginVertex(); @@ -66,8 +66,8 @@ void GEdge::setMeshMaster(GEdge* ge,int ori) { } } -void GEdge::setMeshMaster(GEdge* ge,const std::vector<double>& tfo) { - +void GEdge::setMeshMaster(GEdge* ge,const std::vector<double>& tfo) +{ SPoint3 oriXYZ0 = ge->getBeginVertex()->xyz(); SPoint3 oriXYZ1 = ge->getEndVertex()->xyz(); @@ -83,17 +83,17 @@ void GEdge::setMeshMaster(GEdge* ge,const std::vector<double>& tfo) { tfoXYZ0[i] += tfo[idx]; tfoXYZ1[i] += tfo[idx]; } - + SPoint3 locXYZ0 = getBeginVertex()->xyz(); SPoint3 locXYZ1 = getEndVertex()->xyz(); - + SVector3 d00 = locXYZ0 - tfoXYZ0; SVector3 d10 = locXYZ1 - tfoXYZ0; SVector3 d01 = locXYZ0 - tfoXYZ1; SVector3 d11 = locXYZ1 - tfoXYZ1; double tol = CTX::instance()->geom.tolerance; - + if ((d00.norm() < tol) && (d11.norm() < tol)) { GEntity::setMeshMaster(ge,tfo); masterOrientation = 1; @@ -112,7 +112,7 @@ void GEdge::setMeshMaster(GEdge* ge,const std::vector<double>& tfo) { getEndVertex() ->setMeshMaster(ge->getBeginVertex(),tfo); return; } - + Msg::Error("Transformation from edge %d (%d-%d) to %d (%d-%d) is incorrect", ge->tag(),ge->getBeginVertex()->tag(),ge->getEndVertex()->tag(), this->tag(),this->getBeginVertex()->tag(),this->getEndVertex()->tag()); diff --git a/Geo/GEntity.cpp b/Geo/GEntity.cpp index 392a32f6eec5fdfb9fa448c30ae8303ee093be05..ce75f16cd22f6d00f39cf8939407048d2fdd63a0 100644 --- a/Geo/GEntity.cpp +++ b/Geo/GEntity.cpp @@ -73,7 +73,7 @@ GRegion *GEntity::cast2Region() { return dynamic_cast<GRegion*>(this); } void GEntity::setMeshMaster(GEntity* gMaster) { if (gMaster->dim() != dim()){ - Msg::Error("Model entity %d of dimension %d cannot" + Msg::Error("Model entity %d of dimension %d cannot" "be the mesh master of entity %d of dimension %d", gMaster->tag(),gMaster->dim(),tag(),dim()); return; @@ -84,7 +84,7 @@ void GEntity::setMeshMaster(GEntity* gMaster) void GEntity::setMeshMaster(GEntity* gMaster,const std::vector<double>& tfo) { if (gMaster->dim() != dim()){ - Msg::Error("Model entity %d of dimension %d cannot" + Msg::Error("Model entity %d of dimension %d cannot" "be the mesh master of entity %d of dimension %d", gMaster->tag(),gMaster->dim(),tag(),dim()); return; @@ -101,9 +101,5 @@ void GEntity::setMeshMaster(GEntity* gMaster,const std::vector<double>& tfo) _meshMaster = gMaster; } - - - // gets the entity from which the mesh will be copied -GEntity* GEntity::meshMaster() const {return _meshMaster;} - +GEntity* GEntity::meshMaster() const { return _meshMaster; } diff --git a/Geo/GEntity.h b/Geo/GEntity.h index acacca864d4aafe2919b203f506cc3e6083c6384..c989dd6579669df1f0aa45962a8bb4d738abb114 100644 --- a/Geo/GEntity.h +++ b/Geo/GEntity.h @@ -36,7 +36,6 @@ class GEntity { // if non-periodic GEntity* _meshMaster; - // the visibility and the selection flag char _visible, _selection; @@ -48,7 +47,7 @@ class GEntity { protected: SOrientedBoundingBox *_obb; - + public: // these will become protected at some point // the mesh vertices uniquely owned by the entity std::vector<MVertex*> mesh_vertices; @@ -244,7 +243,7 @@ class GEntity { // get the native pointer of the particular representation virtual void *getNativePtr() const { return 0; } - + // get the native id (int) of the particular representation virtual int getNativeInt() const { return 0; } @@ -268,7 +267,6 @@ class GEntity { // returns the master entity (for mesh) GEntity* meshMaster() const; void setMeshMaster(GEntity*); - void setMeshMaster(GEntity*,const std::vector<double>&); // get the bounding box @@ -321,7 +319,7 @@ class GEntity { // get the number of mesh vertices in the entity unsigned int getNumMeshVertices() { return (int)mesh_vertices.size(); } - + // get the mesh vertex at the given index MVertex *getMeshVertex(unsigned int index) { return mesh_vertices[index]; } diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp index bf687799606ecb4b938b19e8197f1e0efe62ed9e..615ce7128de8c7ca036fff3d5822729ee6a8376b 100644 --- a/Geo/GFace.cpp +++ b/Geo/GFace.cpp @@ -1479,16 +1479,16 @@ void GFace::relocateMeshVertices() } } -void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { - +void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) +{ std::list<GEdge*>::iterator eIter; std::list<GVertex*>::iterator vIter; - + // list all vertices and construct vertex to edge correspondence for local edge - + std::set<GVertex*> l_vertices; std::map<std::pair<GVertex*,GVertex*>,GEdge* > l_vtxToEdge; - + for (eIter=l_edges.begin();eIter!=l_edges.end();++eIter) { GVertex* v0 = (*eIter)->getBeginVertex(); GVertex* v1 = (*eIter)->getEndVertex(); @@ -1504,11 +1504,11 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { l_vertices.insert(v1); l_vtxToEdge[std::make_pair(v0,v1)] = (*eIter); } - - l_vertices.insert(embedded_vertices.begin(),embedded_vertices.end()); + + l_vertices.insert(embedded_vertices.begin(),embedded_vertices.end()); // list all vertices and vertex to edge correspondence for remote edge - + std::list<GEdge*> m_edges = master->edges(); std::set<GVertex*> m_vertices; std::map<std::pair<GVertex*,GVertex*>,GEdge* > m_vtxToEdge; @@ -1519,7 +1519,7 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { m_vertices.insert(v1); m_vtxToEdge[std::make_pair(v0,v1)] = (*eIter); } - + std::list<GEdge*> m_embedded_edges = master->embeddedEdges(); for (eIter=m_embedded_edges.begin();eIter!=m_embedded_edges.end();eIter++) { @@ -1529,12 +1529,12 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { m_vertices.insert(v1); m_vtxToEdge[std::make_pair(v0,v1)] = (*eIter); } - + std::list<GVertex*> m_embedded_vertices = master->embeddedVertices(); m_vertices.insert(m_embedded_vertices.begin(),m_embedded_vertices.end()); // check topological correspondence - + if (l_vertices.size() != m_vertices.size()) { Msg::Error("Periodic connection specified between topologically " "incompatible surfaces %d and %d (that have %d vs %d model vertices)", @@ -1548,41 +1548,41 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { master->tag(),tag(),l_vtxToEdge.size(),m_vtxToEdge.size()); return; } - - // compute corresponding vertices + + // compute corresponding vertices std::map<GVertex*,GVertex*> gVertexCounterparts; - + std::set<GVertex*>::iterator mvIter; for (mvIter=m_vertices.begin();mvIter!=m_vertices.end();++mvIter) { - + GVertex* m_vertex = *mvIter; - + double xyzOri[4] = {m_vertex->x(), m_vertex->y(), m_vertex->z(),1}; SPoint3 xyzTfo(0,0,0); - + for (size_t i=0,ij=0;i<3;i++) { for (size_t j=0;j<4;j++,ij++) { xyzTfo[i] += tfo[ij] * xyzOri[j]; } } - + GVertex* l_vertex = NULL; std::set<GVertex*>::iterator lvIter = l_vertices.begin(); for (;lvIter!=l_vertices.end();++lvIter) { - + SPoint3 xyz((*lvIter)->x(),(*lvIter)->y(),(*lvIter)->z()); SVector3 dist = xyz - xyzTfo; - + if (dist.norm() < CTX::instance()->geom.tolerance) { l_vertex = *lvIter; break; } } - + if (l_vertex==NULL) { Msg::Error("Was not able to find corresponding node for %d " "for periodic connection of surface %d to %d " @@ -1592,7 +1592,7 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { } gVertexCounterparts[l_vertex] = m_vertex; } - + if (gVertexCounterparts.size() != m_vertices.size()) { Msg::Error("Could not find all node correspondances " "for the periodic connection from surface %d to %d", @@ -1606,10 +1606,10 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { std::map<std::pair<GVertex*,GVertex*>,GEdge*>::iterator lv2eIter; for (lv2eIter=l_vtxToEdge.begin();lv2eIter!=l_vtxToEdge.end();lv2eIter++) { - + std::pair<GVertex*,GVertex*> lPair = lv2eIter->first; GEdge* localEdge = lv2eIter->second; - + std::pair<GVertex*,GVertex*> mPair(gVertexCounterparts[lPair.first], gVertexCounterparts[lPair.second]); int sign = 1; @@ -1619,7 +1619,7 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { std::pair<GVertex*,GVertex*> backward(mPair.second,mPair.first); mv2eIter = m_vtxToEdge.find(backward); } - + if (mv2eIter == m_vtxToEdge.end()) { Msg::Error("Could not find periodic copy of edge %d-%d " "(corresponding to vertices %d %d) in face %d", @@ -1631,10 +1631,10 @@ void GFace::setMeshMaster(GFace* master,const std::vector<double>& tfo) { GEdge* masterEdge = mv2eIter->second; localEdge->setMeshMaster(masterEdge,tfo); gEdgeCounterparts[localEdge] = std::make_pair(masterEdge,sign); - } - + } + // complete the information at the edge level - + edgeCounterparts = gEdgeCounterparts; vertexCounterparts = gVertexCounterparts; GEntity::setMeshMaster(master,tfo); @@ -1709,15 +1709,13 @@ struct myLine { } }; - - -void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { - +void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) +{ std::map<GVertex*,GVertex*> vs2vt; - + for (std::list<GEdge*>::iterator it=l_edges.begin();it!=l_edges.end();++it){ - - // slave edge + + // slave edge GEdge* le = *it; int sign = 1; @@ -1734,10 +1732,10 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { return; } } - + // master edge GEdge *me = master->model()->getEdgeByTag(abs(source_e)); - + if (source_e * sign > 0){ vs2vt[me->getBeginVertex()] = le->getBeginVertex(); vs2vt[me->getEndVertex()] = le->getEndVertex(); @@ -1748,11 +1746,11 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { } } - // --- find out the transformation + // --- find out the transformation bool translation = true; SVector3 DX; - + int count = 0; for (std::map<GVertex*, GVertex*>::iterator it = vs2vt.begin(); it != vs2vt.end() ; ++it){ @@ -1769,24 +1767,24 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { } std::vector<double> tfo(16); - + if (translation) { Msg::Info("Periodic mesh translation found: dx = (%g,%g,%g)", DX.x(), DX.y(), DX.z()); - + for (size_t i=0;i<16;i++) tfo[i] = 0; for (size_t i=0;i<3;i++) tfo[i*4+i] = 1; tfo[3] = DX.x(); tfo[7] = DX.y(); - tfo[11] = DX.z(); + tfo[11] = DX.z(); } - + else { - + bool rotation = false; myLine LINE; double ANGLE=0; - + count = 0; rotation = true; std::vector<SPoint3> mps, mpt; @@ -1800,14 +1798,14 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { mean_plane mean_source, mean_target; computeMeanPlaneSimple(mps, mean_source); computeMeanPlaneSimple(mpt, mean_target); - + myPlane PLANE_SOURCE(SPoint3(mean_source.x,mean_source.y,mean_source.z), SVector3(mean_source.a,mean_source.b,mean_source.c)); myPlane PLANE_TARGET(SPoint3(mean_target.x,mean_target.y,mean_target.z), SVector3(mean_target.a,mean_target.b,mean_target.c)); - + LINE = myLine(PLANE_SOURCE, PLANE_TARGET); - + // LINE is the axis of rotation // let us compute the angle of rotation count = 0; @@ -1841,7 +1839,7 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { } } } - + if (rotation){ Msg::Info("Periodic mesh rotation found: axis (%g,%g,%g) point (%g %g %g) angle %g", LINE.t.x(), LINE.t.y(), LINE.t.z(), LINE.p.x(), LINE.p.y(), LINE.p.z(), @@ -1850,22 +1848,22 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { double ux = LINE.t.x(); double uy = LINE.t.y(); double uz = LINE.t.z(); - + tfo[0*4+0] = cos (ANGLE) + ux*ux*(1.-cos(ANGLE)); tfo[0*4+1] = ux*uy*(1.-cos(ANGLE)) - uz * sin(ANGLE); tfo[0*4+2] = ux*uz*(1.-cos(ANGLE)) + uy * sin(ANGLE); - + tfo[1*4+0] = ux*uy*(1.-cos(ANGLE)) + uz * sin(ANGLE); tfo[1*4+1] = cos (ANGLE) + uy*uy*(1.-cos(ANGLE)); tfo[1*4+2] = uy*uz*(1.-cos(ANGLE)) - ux * sin(ANGLE); - + tfo[2*4+0] = ux*uz*(1.-cos(ANGLE)) - uy * sin(ANGLE); tfo[2*4+1] = uy*uz*(1.-cos(ANGLE)) + ux * sin(ANGLE); tfo[2*4+2] = cos (ANGLE) + uz*uz*(1.-cos(ANGLE)); - + tfo[3] = tfo[7] = tfo[11] = 0; for (int i=0;i<4;i++) tfo[12+i] = 0; - + } else { Msg::Error("Only rotations or translations can currently be computed " @@ -1874,9 +1872,9 @@ void GFace::setMeshMaster(GFace* master,const std::map<int,int>& edgeCopies) { return; } } - + // --- now check and encode the transformation // --- including for edges and vertices - setMeshMaster(master,tfo); + setMeshMaster(master, tfo); } diff --git a/Geo/GModelFactory.cpp b/Geo/GModelFactory.cpp index 109af03ba801c2f415d2b30ea2411cae7c2e988c..36f2539f82e18732754cf2c6499d5b0cdd4d089e 100644 --- a/Geo/GModelFactory.cpp +++ b/Geo/GModelFactory.cpp @@ -1220,25 +1220,24 @@ void OCCFactory::setPeriodicAllFaces(GModel *gm, std::vector<double> FaceTransla /* setPeriodicPairOfFaces: set periodic given a Slave/Master pair of numFace-Edgelist */ -void OCCFactory::setPeriodicPairOfFaces(GModel *gm, int numFaceMaster, +void OCCFactory::setPeriodicPairOfFaces(GModel *gm, int numFaceMaster, std::vector<int> EdgeListMaster, - int numFaceSlave, + int numFaceSlave, std::vector<int> EdgeListSlave) { - int NEdges=EdgeListMaster.size(); if (EdgeListMaster.size() != EdgeListSlave.size()){ Msg::Error("Slave/Master faces don't have the same number of edges!"); } else { - + std::map<int,int> edgeCounterparts; std::vector<int>::iterator siter = EdgeListSlave.begin(); std::vector<int>::iterator miter = EdgeListMaster.begin(); - + for (;siter!=EdgeListSlave.end();++siter,++miter) { edgeCounterparts[*siter] = *miter; } - + Surface *s_slave = FindSurface(abs(numFaceSlave)); if(s_slave){ s_slave->master = numFaceMaster; diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp index bdbab02a040f65c252065ca2eddb454b449ffdf5..c9bf423aee61923cacd59c5fa33b17b56d692a69 100644 --- a/Geo/GModelIO_GEO.cpp +++ b/Geo/GModelIO_GEO.cpp @@ -331,41 +331,45 @@ int GModel::importGEOInternals() ge->physicals.push_back(pnum); } } - - std::map<int,GEO_Internals::MasterEdge>::iterator peIter = _geo_internals->periodicEdges.begin(); + + std::map<int,GEO_Internals::MasterEdge>::iterator peIter = + _geo_internals->periodicEdges.begin(); for (;peIter!=_geo_internals->periodicEdges.end();++peIter) { - int iTarget = peIter->first; GEO_Internals::MasterEdge& me = peIter->second; int iSource = me.tag; - GEdge* target = getEdgeByTag(iTarget); GEdge* source = getEdgeByTag(iSource); - - if (!target) Msg::Error("Unknown target line for periodic connection from %d to %d",iTarget,iSource); - if (!source) Msg::Error("Unknown source line for periodic connection from %d to %d",iTarget,iSource); - - if (me.affineTransform.size()==16) target->setMeshMaster(source,me.affineTransform); - else target->setMeshMaster(source,me.tag > 0 ? 1 : -1); - + if (!target) + Msg::Error("Unknown target line for periodic connection from %d to %d", + iTarget, iSource); + if (!source) + Msg::Error("Unknown source line for periodic connection from %d to %d", + iTarget, iSource); + if (me.affineTransform.size()==16) + target->setMeshMaster(source,me.affineTransform); + else + target->setMeshMaster(source,me.tag > 0 ? 1 : -1); } - - std::map<int,GEO_Internals::MasterFace>::iterator pfIter = _geo_internals->periodicFaces.begin(); + std::map<int,GEO_Internals::MasterFace>::iterator pfIter = + _geo_internals->periodicFaces.begin(); for (;pfIter!=_geo_internals->periodicFaces.end();++pfIter) { - int iTarget = pfIter->first; GEO_Internals::MasterFace& mf = pfIter->second; int iSource = mf.tag; - GFace* target = getFaceByTag(iTarget); GFace* source = getFaceByTag(iSource); - - if (!target) Msg::Error("Unknown target surface for periodic connection from %d to %d",iTarget,iSource); - if (!source) Msg::Error("Unknown source surface for periodic connection from %d to %d",iTarget,iSource); - - if (mf.affineTransform.size()==16) target->setMeshMaster(source,mf.affineTransform); - else target->setMeshMaster(source,mf.edgeCounterparts); + if (!target) + Msg::Error("Unknown target surface for periodic connection from %d to %d", + iTarget, iSource); + if (!source) + Msg::Error("Unknown source surface for periodic connection from %d to %d", + iTarget, iSource); + if (mf.affineTransform.size()==16) + target->setMeshMaster(source,mf.affineTransform); + else + target->setMeshMaster(source,mf.edgeCounterparts); } Msg::Debug("Gmsh model (GModel) imported:"); @@ -373,7 +377,6 @@ int GModel::importGEOInternals() Msg::Debug("%d Edges", edges.size()); Msg::Debug("%d Faces", faces.size()); Msg::Debug("%d Regions", regions.size()); - return 1; } diff --git a/Geo/Geo.h b/Geo/Geo.h index 7e22189f2ab1ef56b77da3b3af15a2adfbf5cb67..b93a6ed9982d9b4541fc92cee2baa585b4e2027d 100644 --- a/Geo/Geo.h +++ b/Geo/Geo.h @@ -288,7 +288,7 @@ class GEO_Internals{ void alloc_all(); void free_all(); public: - + Tree_T *Points; Tree_T *Curves; Tree_T *Surfaces; @@ -300,12 +300,11 @@ class GEO_Internals{ int MaxPointNum, MaxLineNum, MaxLineLoopNum, MaxSurfaceNum; int MaxSurfaceLoopNum, MaxVolumeNum, MaxPhysicalNum; - struct MasterEdge { int tag; // signed std::vector<double> affineTransform; }; - + std::map<int,MasterEdge> periodicEdges; struct MasterFace { @@ -316,7 +315,7 @@ class GEO_Internals{ }; std::map<int,MasterFace> periodicFaces; - + GEO_Internals(){ alloc_all(); } ~GEO_Internals(){ free_all(); } void destroy(){ free_all(); alloc_all(); } diff --git a/Graphics/drawGlyph.cpp b/Graphics/drawGlyph.cpp index c7c73fae9c774be306a3ad36080cb985d33ce963..f932f8c749eed23bc1e3caecab94e0d33bed7dad 100644 --- a/Graphics/drawGlyph.cpp +++ b/Graphics/drawGlyph.cpp @@ -229,6 +229,7 @@ void drawContext::drawImage(const std::string &name, double x, double y, double glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, img->tex); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3d(x+wx*w, y+wy*w, z+wz*w); glTexCoord2f(1.0f, 0.0f); glVertex3d(x+wx*w+hx*h, y+wy*w+hy*h, z+wz*w+hz*h); @@ -240,7 +241,7 @@ void drawContext::drawImage(const std::string &name, double x, double y, double if(billboard){ glPopMatrix(); - glMatrixMode (GL_PROJECTION); + glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(matrixMode); } diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index bb2a20bfe4e65a36c3d39a1a3ed33641fc2bdac5..f67008341441edc3ab68de6402a0c053af9be1b1 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -70,8 +70,6 @@ static void computeElementShapes(GFace *gf, double &worst, double &avg, avg /= nT; } - - class quadMeshRemoveHalfOfOneDMesh { GFace *_gf; @@ -79,10 +77,12 @@ public: std::map<GEdge*,std::vector<MLine*> > _backup; std::map<MEdge, MVertex*,Less_Edge> _middle; // remove one point every two and remember middle points - quadMeshRemoveHalfOfOneDMesh (GFace* gf) : _gf(gf){ + quadMeshRemoveHalfOfOneDMesh (GFace* gf) : _gf(gf) + { // only do it if a recombination has to be done - if((CTX::instance()->mesh.recombineAll || gf->meshAttributes.recombine) && CTX::instance()->mesh.algoRecombine == 2){ - // printf("GFace %d removing half of the points in the 1D mesh\n",gf->tag()); + if((CTX::instance()->mesh.recombineAll || gf->meshAttributes.recombine) && + CTX::instance()->mesh.algoRecombine == 2){ + // printf("GFace %d removing half of the points in the 1D mesh\n",gf->tag()); std::list<GEdge*> edges = gf->edges(); std::list<GEdge*>::iterator ite = edges.begin(); while(ite != edges.end()){ @@ -110,7 +110,8 @@ public: } backgroundMesh::setSizeFactor(2.0); } - void subdivide (){ + void subdivide () + { std::vector<MQuadrangle*> qnew; std::map<MEdge,MVertex*,Less_Edge> eds; @@ -184,9 +185,11 @@ public: _gf->quadrangles = qnew; // printf("%d triangles %d quads\n",_gf->triangles.size(),_gf->quadrangles.size()); } - void finish (){ + void finish () + { backgroundMesh::setSizeFactor(1.0); - if((CTX::instance()->mesh.recombineAll || _gf->meshAttributes.recombine) && CTX::instance()->mesh.algoRecombine == 2){ + if((CTX::instance()->mesh.recombineAll || _gf->meshAttributes.recombine) && + CTX::instance()->mesh.algoRecombine == 2){ // recombine the elements on the half mesh recombineIntoQuads(_gf,true,true,.1); Msg::Info("subdividing"); @@ -203,7 +206,8 @@ public: _gf->meshStatistics.nbGoodQuality); } } - void restore (){ + void restore () + { std::list<GEdge*> edges = _gf->edges(); std::list<GEdge*>::iterator ite = edges.begin(); while(ite != edges.end()){ @@ -216,53 +220,47 @@ public: } }; - - static void copyMesh(GFace *source, GFace *target) { std::map<MVertex*, MVertex*> vs2vt; - + // add principal vertex pairs - + std::list<GVertex*> s_vtcs = source->vertices(); std::list<GVertex*> t_vtcs = target->vertices(); - - + if (s_vtcs.size() != t_vtcs.size()) { Msg::Info("Periodicity imposed on topologically incompatible surfaces" "(%d vs %d bounding vertices)",s_vtcs.size(),t_vtcs.size()); } - - + std::set<GVertex*> checkVtcs; checkVtcs.insert(s_vtcs.begin(),s_vtcs.end()); for (std::list<GVertex*>::iterator tvIter=t_vtcs.begin();tvIter!=t_vtcs.end();++tvIter) { - + GVertex* gvt = *tvIter; std::map<GVertex*,GVertex*>::iterator gvsIter = target->vertexCounterparts.find(gvt); - - + if (gvsIter == target->vertexCounterparts.end()) { Msg::Info("Error during periodic meshing of surface %d with surface %d:" "vertex %d has no periodic counterpart", target->tag(),source->tag(),gvt->tag()); } - + GVertex* gvs = gvsIter->second; if (checkVtcs.find(gvs) == checkVtcs.end()) { if (gvs) Msg::Info("Error during periodic meshing of surface %d with surface %d:" "vertex %d has periodic counterpart %d outside of source surface", target->tag(),source->tag(),gvt->tag(),gvs->tag()); - + else Msg::Info("Error during periodic meshing of surface %d with surface %d:" "vertex %d has no periodic counterpart", target->tag(),source->tag(),gvt->tag()); } - + vs2vt[gvs->mesh_vertices[0]] = gvt->mesh_vertices[0]; } - // add corresponding edge nodes assuming edges were correctly meshed already @@ -271,27 +269,27 @@ static void copyMesh(GFace *source, GFace *target) std::set<GEdge*> checkEdges; checkEdges.insert(s_edges.begin(),s_edges.end()); - - for (std::list<GEdge*>::iterator te_iter = t_edges.begin();te_iter!=t_edges.end();++te_iter) { - + + for (std::list<GEdge*>::iterator te_iter = t_edges.begin(); + te_iter != t_edges.end(); ++te_iter) { + GEdge* get = *te_iter; - std::map<GEdge*,std::pair<GEdge*,int> >::iterator gesIter = target->edgeCounterparts.find(get); - + + std::map<GEdge*,std::pair<GEdge*,int> >::iterator gesIter = + target->edgeCounterparts.find(get); if (gesIter == target->edgeCounterparts.end()) { Msg::Info("Error during periodic meshing of surface %d with surface %d:" "edge %d has no periodic counterpart", target->tag(),source->tag(),get->tag()); } - - GEdge* ges = gesIter->second.first; + GEdge* ges = gesIter->second.first; if (checkEdges.find(ges) == checkEdges.end()) { Msg::Info("Error during periodic meshing of surface %d with surface %d:" "edge %d has periodic counterpart %d outside of get surface", target->tag(),source->tag(),get->tag(),ges->tag()); } - if (get->mesh_vertices.size() != ges->mesh_vertices.size()) { Msg::Info("Error during periodic meshing of surface %d with surface %d:" "edge %d has %d vertices, whereas correspondant %d has %d", @@ -299,34 +297,32 @@ static void copyMesh(GFace *source, GFace *target) get->tag(),get->mesh_vertices.size(), ges->tag(),ges->mesh_vertices.size()); } - + int orientation = gesIter->second.second; int is = orientation == 1 ? 0 : get->mesh_vertices.size()-1; - + for (unsigned it=0;it<get->mesh_vertices.size();it++,is+=orientation) { vs2vt[ges->mesh_vertices[is]] = get->mesh_vertices[it]; } } - + // now transform - std::vector<double>& tfo = target->affineTransform; - for(unsigned int i = 0; i < source->mesh_vertices.size(); i++){ MVertex *vs = source->mesh_vertices[i]; SPoint2 XXX; - + double ps[4] = {vs->x(), vs->y(), vs->z(), 1.}; double res[4] = {0., 0., 0., 0.}; int idx = 0; for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) res[i] += tfo[idx++] * ps[j]; - + SPoint3 tp (res[0], res[1], res[2]); XXX = target->parFromPoint(tp); - + GPoint gp = target->point(XXX); MVertex *vt = new MFaceVertex(gp.x(), gp.y(), gp.z(), target, gp.u(), gp.v()); target->mesh_vertices.push_back(vt); @@ -536,9 +532,10 @@ static bool recoverEdge(BDS_Mesh *m, GEdge *ge, BDS_Edge *e = m->recover_edge(pstart->iD, pend->iD, _fatallyFailed, e2r, notRecovered); if(e) e->g = g; else { - if (_fatallyFailed) Msg::Error("Unable to recover an edge %g %g && %g %g (%d/%d)", - vstart->x(), vstart->y(), vend->x(), vend->y(), i, - ge->mesh_vertices.size()); + if (_fatallyFailed) + Msg::Error("Unable to recover an edge %g %g && %g %g (%d/%d)", + vstart->x(), vstart->y(), vend->x(), vend->y(), i, + ge->mesh_vertices.size()); return !_fatallyFailed; } } @@ -2745,9 +2742,10 @@ static void getGFaceOrientation(GFace *gf, BoundaryLayerColumns *blc, const bool isBLEl = existBL && (blc->_toFirst.find(e) != blc->_toFirst.end()); SVector3 nf; - if ((!isBLEl && orientNonBL == 0) || (isBLEl && orientBL == 0)) { // Check only if orientation of BL/non-BL el. not already known + // Check only if orientation of BL/non-BL el. not already known + if ((!isBLEl && orientNonBL == 0) || (isBLEl && orientBL == 0)) { const bool found = fromVert ? getGFaceNormalFromVert(gf, e, nf) : - getGFaceNormalFromBary(gf, e, nf); + getGFaceNormalFromBary(gf, e, nf); if (found) { SVector3 ne = e->getFace(0).normal(); const int orient = (dot(ne, nf) > 0.) ? 1 : -1; @@ -2755,7 +2753,8 @@ static void getGFaceOrientation(GFace *gf, BoundaryLayerColumns *blc, else orientNonBL = orient; } } - if ((orientNonBL != 0) && (orientBL != 0)) break; // Stop when orientation found for non-BL and BL el. + // Stop when orientation found for non-BL and BL el. + if ((orientNonBL != 0) && (orientBL != 0)) break; } } @@ -2804,18 +2803,21 @@ void orientMeshGFace::operator()(GFace *gf) } // Reverse BL and non-BL elements if needed - if (existBL) { // If there is a BL, test BL/non-BL elements + if (existBL) { // If there is a BL, test BL/non-BL elements if ((orientNonBL == -1) || (orientBL == -1)) for (unsigned int iEl = 0; iEl < gf->getNumMeshElements(); iEl++) { MElement *e = gf->getMeshElement(iEl); - if (blc->_toFirst.find(e) == blc->_toFirst.end()) { // If el. outside of BL... - if (orientNonBL == -1) e->reverse(); // ... reverse if needed + // If el. outside of BL... + if (blc->_toFirst.find(e) == blc->_toFirst.end()) { + // ... reverse if needed + if (orientNonBL == -1) e->reverse(); } - else // If el. in BL - if (orientBL == -1) e->reverse(); // ... reverse if needed + else // If el. in BL + // ... reverse if needed + if (orientBL == -1) e->reverse(); } } - else // If no BL, reverse all elements if needed + else // If no BL, reverse all elements if needed if (orientNonBL == -1) for (unsigned int iEl = 0; iEl < gf->getNumMeshElements(); iEl++) gf->getMeshElement(iEl)->reverse(); diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y index 8d1e662afe14a87fdb9ad5641be1de1ca70d1b76..e482c5051f4e562548a6f628048905237451df02 100644 --- a/Parser/Gmsh.y +++ b/Parser/Gmsh.y @@ -4026,201 +4026,207 @@ Constraints : | tSmoother tSurface ListOfDouble tAFFECT FExpr tEND { for(int i = 0; i < List_Nbr($3); i++){ - double d; - List_Read($3, i, &d); - int j = (int)d; - Surface *s = FindSurface(j); - if(s){ - s->TransfiniteSmoothing = (int)$5; - } - else{ - GFace *gf = GModel::current()->getFaceByTag(j); - if(gf) - gf->meshAttributes.transfiniteSmoothing = (int)$5; - else - yymsg(1, "Unknown surface %d", (int)$5); - } + double d; + List_Read($3, i, &d); + int j = (int)d; + Surface *s = FindSurface(j); + if(s){ + s->TransfiniteSmoothing = (int)$5; + } + else{ + GFace *gf = GModel::current()->getFaceByTag(j); + if(gf) + gf->meshAttributes.transfiniteSmoothing = (int)$5; + else + yymsg(1, "Unknown surface %d", (int)$5); + } } List_Delete($3); } - | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT '{' RecursiveListOfDouble '}' tTransform PeriodicTransform tEND - { - if (List_Nbr($4) != List_Nbr($8)){ - yymsg(0, "Number of master lines (%d) different from number of " - "slaves (%d) ", List_Nbr($8), List_Nbr($4)); - } - else{ - if (List_Nbr($11) < 12){ - yymsg(0, "Affine transformation requires at least 12 entries"); - } - else { - - std::vector<double> transfo(16,0); - for(int i = 0; i < List_Nbr($11); i++) List_Read($11, i, &transfo[i]); - - for(int i = 0; i < List_Nbr($4); i++){ - double d_master, d_slave; - List_Read($8, i, &d_master); - List_Read($4, i, &d_slave); - int j_master = (int)d_master; - int j_slave = (int)d_slave; - - addPeriodicEdge(j_slave,j_master,transfo); - } - } - } - List_Delete($8); - List_Delete($4); - } - | tPeriodic tSurface '{' RecursiveListOfDouble '}' tAFFECT '{' RecursiveListOfDouble '}' tTransform PeriodicTransform tEND - { - if (List_Nbr($4) != List_Nbr($8)){ - yymsg(0, "Number of master faces (%d) different from number of " - "slaves (%d) ", List_Nbr($8), List_Nbr($4)); - } - else{ - if (List_Nbr($11) < 12){ - yymsg(0, "Affine transformation requires at least 12 entries"); - } - else { - std::vector<double> transfo(16,0); - for(int i = 0; i < List_Nbr($11); i++) List_Read($11, i, &transfo[i]); - - for(int i = 0; i < List_Nbr($4); i++){ - double d_master, d_slave; - List_Read($8, i, &d_master); - List_Read($4, i, &d_slave); - addPeriodicFace(d_slave,d_master,transfo); - } - } - } - List_Delete($4); - List_Delete($8); - } - | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT '{' RecursiveListOfDouble '}' tRotate '{' VExpr ',' VExpr ',' FExpr '}' tEND - { - if (List_Nbr($4) != List_Nbr($8)){ - yymsg(0, "Number of master edges (%d) different from number of " - "slaves (%d) ", List_Nbr($8), List_Nbr($4)); - } - else{ - SPoint3 origin($12[0],$12[1],$12[2]); - SPoint3 axis($14[0],$14[1],$14[2]); - double angle($16); - SPoint3 translation(0,0,0); - - std::vector<double> transfo; - computeAffineTransformation(origin,axis,angle,translation,transfo); - - for(int i = 0; i < List_Nbr($4); i++){ - double d_master, d_slave; - List_Read($8, i, &d_master); - List_Read($4, i, &d_slave); - addPeriodicEdge(d_slave,d_master,transfo); - } - } - List_Delete($4); - List_Delete($8); - } - | tPeriodic tSurface '{' RecursiveListOfDouble '}' tAFFECT '{' RecursiveListOfDouble '}' tRotate '{' VExpr ',' VExpr ',' FExpr '}' tEND - { - if (List_Nbr($4) != List_Nbr($8)){ - yymsg(0, "Number of master faces (%d) different from number of " - "slaves (%d) ", List_Nbr($8), List_Nbr($4)); - } - else{ - - SPoint3 origin($12[0],$12[1],$12[2]); - SPoint3 axis($14[0],$14[1],$14[2]); - double angle($16); - SPoint3 translation(0,0,0); - - std::vector<double> transfo; - computeAffineTransformation(origin,axis,angle,translation,transfo); - - for(int i = 0; i < List_Nbr($4); i++){ - double d_master, d_slave; - List_Read($8, i, &d_master); - List_Read($4, i, &d_slave); - addPeriodicFace(d_slave,d_master,transfo); - } - } - List_Delete($4); - List_Delete($8); - } - | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT '{' RecursiveListOfDouble '}' tTranslate VExpr tEND - { - if (List_Nbr($4) != List_Nbr($8)){ - yymsg(0, "Number of master edges (%d) different from number of " - "slaves (%d) ", List_Nbr($8), List_Nbr($4)); - } - else{ - SPoint3 origin(0,0,0); - SPoint3 axis(0,0,0); - double angle(0); - SPoint3 translation($11[0],$11[1],$11[2]); - - std::vector<double> transfo; - computeAffineTransformation(origin,axis,angle,translation,transfo); - - for(int i = 0; i < List_Nbr($4); i++){ - double d_master, d_slave; - List_Read($8, i, &d_master); - List_Read($4, i, &d_slave); - addPeriodicEdge(d_slave,d_master,transfo); - } - } - List_Delete($4); - List_Delete($8); - } - | tPeriodic tSurface '{' RecursiveListOfDouble '}' tAFFECT '{' RecursiveListOfDouble '}' tTranslate VExpr tEND - { - if (List_Nbr($4) != List_Nbr($8)){ - yymsg(0, "Number of master faces (%d) different from number of " - "slaves (%d) ", List_Nbr($8), List_Nbr($4)); - } - else{ - SPoint3 origin(0,0,0); - SPoint3 axis(0,0,0); - double angle(0); - SPoint3 translation($11[0],$11[1],$11[2]); - - std::vector<double> transfo; - computeAffineTransformation(origin,axis,angle,translation,transfo); - - for(int i = 0; i < List_Nbr($4); i++){ - double d_master, d_slave; - List_Read($8, i, &d_master); - List_Read($4, i, &d_slave); - addPeriodicFace(d_slave,d_master,transfo); - } - } - List_Delete($4); - List_Delete($8); - } - | tPeriodic tSurface FExpr '{' RecursiveListOfDouble '}' tAFFECT FExpr '{' RecursiveListOfDouble '}' tEND - { - if (List_Nbr($5) != List_Nbr($10)){ - yymsg(0, "Number of master surface edges (%d) different from number of " - "slave (%d) edges", List_Nbr($10), List_Nbr($5)); - } - else{ - int j_master = (int)$8; - int j_slave = (int)$3; - - std::map<int,int> edgeCounterParts; - for (int i = 0; i < List_Nbr($5); i++){ - double ds,dm; - List_Read($5,i,&ds); - List_Read($10,i,&dm); - edgeCounterParts[(int) ds] = (int) dm; - std::cout << "edge " << ds << " to " << dm << std::endl; - } - addPeriodicFace(j_slave,j_master,edgeCounterParts); - } - List_Delete($5); - List_Delete($10); - } + | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT + '{' RecursiveListOfDouble '}' tTransform PeriodicTransform tEND + { + if (List_Nbr($4) != List_Nbr($8)){ + yymsg(0, "Number of master lines (%d) different from number of " + "slaves (%d) ", List_Nbr($8), List_Nbr($4)); + } + else{ + if (List_Nbr($11) < 12){ + yymsg(0, "Affine transformation requires at least 12 entries"); + } + else { + + std::vector<double> transfo(16,0); + for(int i = 0; i < List_Nbr($11); i++) List_Read($11, i, &transfo[i]); + + for(int i = 0; i < List_Nbr($4); i++){ + double d_master, d_slave; + List_Read($8, i, &d_master); + List_Read($4, i, &d_slave); + int j_master = (int)d_master; + int j_slave = (int)d_slave; + + addPeriodicEdge(j_slave,j_master,transfo); + } + } + } + List_Delete($8); + List_Delete($4); + } + | tPeriodic tSurface '{' RecursiveListOfDouble '}' tAFFECT + '{' RecursiveListOfDouble '}' tTransform PeriodicTransform tEND + { + if (List_Nbr($4) != List_Nbr($8)){ + yymsg(0, "Number of master faces (%d) different from number of " + "slaves (%d) ", List_Nbr($8), List_Nbr($4)); + } + else{ + if (List_Nbr($11) < 12){ + yymsg(0, "Affine transformation requires at least 12 entries"); + } + else { + std::vector<double> transfo(16,0); + for(int i = 0; i < List_Nbr($11); i++) List_Read($11, i, &transfo[i]); + + for(int i = 0; i < List_Nbr($4); i++){ + double d_master, d_slave; + List_Read($8, i, &d_master); + List_Read($4, i, &d_slave); + addPeriodicFace(d_slave,d_master,transfo); + } + } + } + List_Delete($4); + List_Delete($8); + } + | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT + '{' RecursiveListOfDouble '}' tRotate '{' VExpr ',' VExpr ',' FExpr '}' tEND + { + if (List_Nbr($4) != List_Nbr($8)){ + yymsg(0, "Number of master edges (%d) different from number of " + "slaves (%d) ", List_Nbr($8), List_Nbr($4)); + } + else{ + SPoint3 origin($12[0],$12[1],$12[2]); + SPoint3 axis($14[0],$14[1],$14[2]); + double angle($16); + SPoint3 translation(0,0,0); + + std::vector<double> transfo; + computeAffineTransformation(origin,axis,angle,translation,transfo); + + for(int i = 0; i < List_Nbr($4); i++){ + double d_master, d_slave; + List_Read($8, i, &d_master); + List_Read($4, i, &d_slave); + addPeriodicEdge(d_slave,d_master,transfo); + } + } + List_Delete($4); + List_Delete($8); + } + | tPeriodic tSurface '{' RecursiveListOfDouble '}' tAFFECT + '{' RecursiveListOfDouble '}' tRotate '{' VExpr ',' VExpr ',' FExpr '}' tEND + { + if (List_Nbr($4) != List_Nbr($8)){ + yymsg(0, "Number of master faces (%d) different from number of " + "slaves (%d) ", List_Nbr($8), List_Nbr($4)); + } + else{ + SPoint3 origin($12[0],$12[1],$12[2]); + SPoint3 axis($14[0],$14[1],$14[2]); + double angle($16); + SPoint3 translation(0,0,0); + + std::vector<double> transfo; + computeAffineTransformation(origin,axis,angle,translation,transfo); + + for(int i = 0; i < List_Nbr($4); i++){ + double d_master, d_slave; + List_Read($8, i, &d_master); + List_Read($4, i, &d_slave); + addPeriodicFace(d_slave,d_master,transfo); + } + } + List_Delete($4); + List_Delete($8); + } + | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT + '{' RecursiveListOfDouble '}' tTranslate VExpr tEND + { + if (List_Nbr($4) != List_Nbr($8)){ + yymsg(0, "Number of master edges (%d) different from number of " + "slaves (%d) ", List_Nbr($8), List_Nbr($4)); + } + else{ + SPoint3 origin(0,0,0); + SPoint3 axis(0,0,0); + double angle(0); + SPoint3 translation($11[0],$11[1],$11[2]); + + std::vector<double> transfo; + computeAffineTransformation(origin,axis,angle,translation,transfo); + + for(int i = 0; i < List_Nbr($4); i++){ + double d_master, d_slave; + List_Read($8, i, &d_master); + List_Read($4, i, &d_slave); + addPeriodicEdge(d_slave,d_master,transfo); + } + } + List_Delete($4); + List_Delete($8); + } + | tPeriodic tSurface '{' RecursiveListOfDouble '}' tAFFECT + '{' RecursiveListOfDouble '}' tTranslate VExpr tEND + { + if (List_Nbr($4) != List_Nbr($8)){ + yymsg(0, "Number of master faces (%d) different from number of " + "slaves (%d) ", List_Nbr($8), List_Nbr($4)); + } + else{ + SPoint3 origin(0,0,0); + SPoint3 axis(0,0,0); + double angle(0); + SPoint3 translation($11[0],$11[1],$11[2]); + + std::vector<double> transfo; + computeAffineTransformation(origin,axis,angle,translation,transfo); + + for(int i = 0; i < List_Nbr($4); i++){ + double d_master, d_slave; + List_Read($8, i, &d_master); + List_Read($4, i, &d_slave); + addPeriodicFace(d_slave,d_master,transfo); + } + } + List_Delete($4); + List_Delete($8); + } + | tPeriodic tSurface FExpr '{' RecursiveListOfDouble '}' + tAFFECT FExpr '{' RecursiveListOfDouble '}' tEND + { + if (List_Nbr($5) != List_Nbr($10)){ + yymsg(0, "Number of master surface edges (%d) different from number of " + "slave (%d) edges", List_Nbr($10), List_Nbr($5)); + } + else{ + int j_master = (int)$8; + int j_slave = (int)$3; + + std::map<int,int> edgeCounterParts; + for (int i = 0; i < List_Nbr($5); i++){ + double ds,dm; + List_Read($5,i,&ds); + List_Read($10,i,&dm); + edgeCounterParts[(int) ds] = (int) dm; + std::cout << "edge " << ds << " to " << dm << std::endl; + } + addPeriodicFace(j_slave,j_master,edgeCounterParts); + } + List_Delete($5); + List_Delete($10); + } | tPoint '{' RecursiveListOfDouble '}' tIn tSurface '{' FExpr '}' tEND { Surface *s = FindSurface((int)$8); @@ -5994,121 +6000,117 @@ void yymsg(int level, const char *fmt, ...) void addPeriodicFace(int iTarget,int iSource, - const std::vector<double>& affineTransform) { - - Surface *target = FindSurface(abs(iTarget)); - - if (target) { - GEO_Internals::MasterFace& mf = - GModel::current()->getGEOInternals()->periodicFaces[iTarget]; - mf.tag = iSource; - mf.edgeCounterparts.clear(); - mf.affineTransform = affineTransform; - } - else{ - GFace *target = GModel::current()->getFaceByTag(abs(iTarget)); - GFace *source = GModel::current()->getFaceByTag(abs(iSource)); - if (!target) Msg::Error("Could not find edge %d for periodic copy from %d", - iTarget,iSource); - target->setMeshMaster(source,affineTransform); - } + const std::vector<double>& affineTransform) +{ + Surface *target = FindSurface(abs(iTarget)); + + if (target) { + GEO_Internals::MasterFace& mf = + GModel::current()->getGEOInternals()->periodicFaces[iTarget]; + mf.tag = iSource; + mf.edgeCounterparts.clear(); + mf.affineTransform = affineTransform; + } + else{ + GFace *target = GModel::current()->getFaceByTag(abs(iTarget)); + GFace *source = GModel::current()->getFaceByTag(abs(iSource)); + if (!target) Msg::Error("Could not find edge %d for periodic copy from %d", + iTarget,iSource); + target->setMeshMaster(source,affineTransform); + } } - void addPeriodicFace(int iTarget,int iSource, - const std::map<int,int>& edgeCounterparts) { - - Surface *target = FindSurface(abs(iTarget)); - - std::cout << "Encoding periodic connection between " << iTarget << " and " << iSource << std::endl; - std::map<int,int>::const_iterator sIter = edgeCounterparts.begin(); - for (;sIter!=edgeCounterparts.end();++sIter) { - std::cout << sIter->first << " - " << sIter->second << std::endl; - } + const std::map<int,int>& edgeCounterparts) +{ + Surface *target = FindSurface(abs(iTarget)); + std::cout << "Encoding periodic connection between " << iTarget << " and " << iSource << std::endl; + std::map<int,int>::const_iterator sIter = edgeCounterparts.begin(); + for (;sIter!=edgeCounterparts.end();++sIter) { + std::cout << sIter->first << " - " << sIter->second << std::endl; + } - if (target) { - GEO_Internals::MasterFace& mf = - GModel::current()->getGEOInternals()->periodicFaces[iTarget]; - mf.tag = iSource; - mf.edgeCounterparts = edgeCounterparts; - mf.affineTransform.clear(); - } - else{ - GFace *target = GModel::current()->getFaceByTag(abs(iTarget)); - GFace *source = GModel::current()->getFaceByTag(abs(iSource)); - if (!target || !source) Msg::Error("Could not find surface %d or %d for periodic copy", - iTarget,iSource); - target->setMeshMaster(source,edgeCounterparts); - } + if (target) { + GEO_Internals::MasterFace& mf = + GModel::current()->getGEOInternals()->periodicFaces[iTarget]; + mf.tag = iSource; + mf.edgeCounterparts = edgeCounterparts; + mf.affineTransform.clear(); + } + else{ + GFace *target = GModel::current()->getFaceByTag(abs(iTarget)); + GFace *source = GModel::current()->getFaceByTag(abs(iSource)); + if (!target || !source) Msg::Error("Could not find surface %d or %d for periodic copy", + iTarget,iSource); + target->setMeshMaster(source,edgeCounterparts); + } } void addPeriodicEdge(int iTarget,int iSource, - const std::vector<double>& affineTransform) { - - Curve *target = FindCurve(abs(iTarget)); - if (target) { - GEO_Internals::MasterEdge& me = GModel::current()->getGEOInternals()->periodicEdges[iTarget]; - me.tag = iSource; - me.affineTransform = affineTransform; - - GEO_Internals::MasterEdge& test = GModel::current()->getGEOInternals()->periodicEdges[iTarget]; - } - else{ - GEdge *target = GModel::current()->getEdgeByTag(abs(iTarget)); - GEdge *source = GModel::current()->getEdgeByTag(abs(iSource)); - if (!target || !source) Msg::Error("Could not find surface %d or %d for periodic copy", - iTarget,iSource); - if (affineTransform.size() == 16) { - target->setMeshMaster(source,affineTransform); - } - else { - target->setMeshMaster(source,iSource*iTarget < 0 ? -1:1); - } - } + const std::vector<double>& affineTransform) +{ + Curve *target = FindCurve(abs(iTarget)); + if (target) { + GEO_Internals::MasterEdge& me = + GModel::current()->getGEOInternals()->periodicEdges[iTarget]; + me.tag = iSource; + me.affineTransform = affineTransform; + } + else{ + GEdge *target = GModel::current()->getEdgeByTag(abs(iTarget)); + GEdge *source = GModel::current()->getEdgeByTag(abs(iSource)); + if (!target || !source) Msg::Error("Could not find surface %d or %d for periodic copy", + iTarget,iSource); + if (affineTransform.size() == 16) { + target->setMeshMaster(source,affineTransform); + } + else { + target->setMeshMaster(source,iSource*iTarget < 0 ? -1:1); + } + } } void computeAffineTransformation(SPoint3& origin, - SPoint3& axis, - double angle, - SPoint3& translation, - std::vector<double>& tfo) { - - tfo.resize(16,0.0); - - angle *= acos(-1.)/180.; - - double ca = cos(angle); - double sa = sin(angle); - - double ux = axis.x(); - double uy = axis.y(); - double uz = axis.z(); - - tfo.resize(16); - - tfo[0*4+0] = ca + ux*ux*(1.-ca); - tfo[0*4+1] = ux*uy*(1.-ca) - uz * sa; - tfo[0*4+2] = ux*uz*(1.-ca) + uy * sa; - - tfo[1*4+0] = ux*uy*(1.-ca) + uz * sa; - tfo[1*4+1] = ca + uy*uy*(1.-ca); - tfo[1*4+2] = uy*uz*(1.-ca) - ux * sa; - - tfo[2*4+0] = ux*uz*(1.-ca) - uy * sa; - tfo[2*4+1] = uy*uz*(1.-ca) + ux * sa; - tfo[2*4+2] = ca + uz*uz*(1.-ca); - - int idx = 0; - for (size_t i=0;i<3;i++) { - int tIdx = i*4+3; - tfo[tIdx] = translation[i]; - for (int j=0;j<3;j++,idx++) { - tfo[tIdx] -= tfo[idx] * origin[j]; - } - idx++; - } - - for (int i=0;i<4;i++) tfo[12+i] = 0; - tfo[15] = 1; + SPoint3& axis, + double angle, + SPoint3& translation, + std::vector<double>& tfo) +{ + tfo.resize(16,0.0); + angle *= acos(-1.)/180.; + + double ca = cos(angle); + double sa = sin(angle); + + double ux = axis.x(); + double uy = axis.y(); + double uz = axis.z(); + + tfo.resize(16); + + tfo[0*4+0] = ca + ux*ux*(1.-ca); + tfo[0*4+1] = ux*uy*(1.-ca) - uz * sa; + tfo[0*4+2] = ux*uz*(1.-ca) + uy * sa; + + tfo[1*4+0] = ux*uy*(1.-ca) + uz * sa; + tfo[1*4+1] = ca + uy*uy*(1.-ca); + tfo[1*4+2] = uy*uz*(1.-ca) - ux * sa; + + tfo[2*4+0] = ux*uz*(1.-ca) - uy * sa; + tfo[2*4+1] = uy*uz*(1.-ca) + ux * sa; + tfo[2*4+2] = ca + uz*uz*(1.-ca); + + int idx = 0; + for (size_t i = 0; i < 3; i++) { + int tIdx = i*4+3; + tfo[tIdx] = translation[i]; + for (int j = 0; j < 3; j++, idx++) { + tfo[tIdx] -= tfo[idx] * origin[j]; + } + idx++; + } + + for (int i = 0; i < 4; i++) tfo[12+i] = 0; + tfo[15] = 1; }