Skip to content
Snippets Groups Projects
Commit 9a6860d7 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

refactoring remaining mesh attributes

parent 850e12c2
No related branches found
No related tags found
No related merge requests found
...@@ -301,6 +301,17 @@ void GEO_Internals::addPlaneSurface(int num, std::vector<int> wireTags) ...@@ -301,6 +301,17 @@ void GEO_Internals::addPlaneSurface(int num, std::vector<int> wireTags)
_changed = true; _changed = true;
} }
void GEO_Internals::addDiscreteSurface(int num)
{
if(FindSurface(num)){
Msg::Error("GEO face with tag %d already exists", num);
return;
}
Surface *s = Create_Surface(num, MSH_SURF_DISCRETE);
Tree_Add(Surfaces, &s);
_changed = true;
}
void GEO_Internals::addSurfaceFilling(int num, std::vector<int> wireTags, void GEO_Internals::addSurfaceFilling(int num, std::vector<int> wireTags,
int sphereCenterTag) int sphereCenterTag)
{ {
...@@ -563,6 +574,115 @@ void GEO_Internals::setTransfiniteVolume(int tag, std::vector<int> cornerTags) ...@@ -563,6 +574,115 @@ void GEO_Internals::setTransfiniteVolume(int tag, std::vector<int> cornerTags)
} }
} }
void GEO_Internals::setTransfiniteVolumeQuadTri(int tag)
{
if(!tag){
List_T *tmp = Tree2List(Volumes);
for(int i = 0; i < List_Nbr(tmp); i++){
Volume *v;
List_Read(tmp, i, &v);
v->QuadTri = TRANSFINITE_QUADTRI_1;
}
List_Delete(tmp);
}
else{
Volume *v = FindVolume(tag);
if(v)
v->QuadTri = TRANSFINITE_QUADTRI_1;
}
}
void GEO_Internals::setRecombine(int dim, int tag, double angle)
{
if(dim == 2){
if(!tag){
List_T *tmp = Tree2List(Surfaces);
for(int i = 0; i < List_Nbr(tmp); i++){
Surface *s;
List_Read(tmp, i, &s);
s->Recombine = 1;
s->RecombineAngle = angle;
}
List_Delete(tmp);
}
else{
Surface *s = FindSurface(tag);
if(s){
s->Recombine = 1;
s->RecombineAngle = angle;
}
}
}
else if(dim == 3){
if(!tag){
List_T *tmp = Tree2List(Volumes);
for(int i = 0; i < List_Nbr(tmp); i++){
Volume *v;
List_Read(tmp, i, &v);
v->Recombine3D = 1;
}
List_Delete(tmp);
}
else{
Volume *v = FindVolume(tag);
if(v){
v->Recombine3D = 1;
}
}
}
}
void GEO_Internals::setSmoothing(int tag, int val)
{
if(!tag){
List_T *tmp = Tree2List(Surfaces);
for(int i = 0; i < List_Nbr(tmp); i++){
Surface *s;
List_Read(tmp, i, &s);
s->TransfiniteSmoothing = val;
}
List_Delete(tmp);
}
else{
Surface *s = FindSurface(tag);
if(s) s->TransfiniteSmoothing = val;
}
}
void GEO_Internals::setReverseMesh(int dim, int tag)
{
if(dim == 1){
if(!tag){
List_T *tmp = Tree2List(Curves);
for(int i = 0; i < List_Nbr(tmp); i++){
Curve *c;
List_Read(tmp, i, &c);
c->ReverseMesh = 1;
}
List_Delete(tmp);
}
else{
Curve *c = FindCurve(tag);
if(c) c->ReverseMesh = 1;
}
}
else if(dim == 2){
if(!tag){
List_T *tmp = Tree2List(Surfaces);
for(int i = 0; i < List_Nbr(tmp); i++){
Surface *s;
List_Read(tmp, i, &s);
s->ReverseMesh = 1;
}
List_Delete(tmp);
}
else{
Surface *s = FindSurface(tag);
if(s) s->ReverseMesh = 1;
}
}
}
void GEO_Internals::synchronize(GModel *model) void GEO_Internals::synchronize(GModel *model)
{ {
Msg::Debug("Syncing GEO_Internals with GModel"); Msg::Debug("Syncing GEO_Internals with GModel");
...@@ -740,6 +860,9 @@ void GEO_Internals::synchronize(GModel *model) ...@@ -740,6 +860,9 @@ void GEO_Internals::synchronize(GModel *model)
} }
List_Delete(volumes); List_Delete(volumes);
} }
// we might want to store physical groups directly in GModel; but this is OK
// for efficiency
for(int i = 0; i < List_Nbr(PhysicalGroups); i++){ for(int i = 0; i < List_Nbr(PhysicalGroups); i++){
PhysicalGroup *p; PhysicalGroup *p;
List_Read(PhysicalGroups, i, &p); List_Read(PhysicalGroups, i, &p);
...@@ -762,7 +885,8 @@ void GEO_Internals::synchronize(GModel *model) ...@@ -762,7 +885,8 @@ void GEO_Internals::synchronize(GModel *model)
} }
} }
// this should not be stored in GEO_internals, but directly set in GModel // we might want to store mesh compounds directly in GModel; but this is OK
// for efficiency
for(std::multimap<int, std::vector<int> >::iterator it = meshCompounds.begin(); for(std::multimap<int, std::vector<int> >::iterator it = meshCompounds.begin();
it != meshCompounds.end(); ++it){ it != meshCompounds.end(); ++it){
int dim = it->first; int dim = it->first;
......
...@@ -44,6 +44,7 @@ class GEO_Internals{ ...@@ -44,6 +44,7 @@ class GEO_Internals{
void addCompoundLine(int num, std::vector<int> edgeTags); void addCompoundLine(int num, std::vector<int> edgeTags);
void addLineLoop(int num, std::vector<int> edgeTags); void addLineLoop(int num, std::vector<int> edgeTags);
void addPlaneSurface(int num, std::vector<int> wireTags); void addPlaneSurface(int num, std::vector<int> wireTags);
void addDiscreteSurface(int num);
void addSurfaceFilling(int num, std::vector<int> wireTags, int sphereCenterTag=-1); void addSurfaceFilling(int num, std::vector<int> wireTags, int sphereCenterTag=-1);
void addSurfaceLoop(int num, std::vector<int> faceTags); void addSurfaceLoop(int num, std::vector<int> faceTags);
void addCompoundSurface(int num, std::vector<int> faceTags, void addCompoundSurface(int num, std::vector<int> faceTags,
...@@ -65,6 +66,10 @@ class GEO_Internals{ ...@@ -65,6 +66,10 @@ class GEO_Internals{
void setTransfiniteLine(int tag, int nPoints, int type, double coef); void setTransfiniteLine(int tag, int nPoints, int type, double coef);
void setTransfiniteSurface(int tag, int arrangement, std::vector<int> cornerTags); void setTransfiniteSurface(int tag, int arrangement, std::vector<int> cornerTags);
void setTransfiniteVolume(int tag, std::vector<int> cornerTags); void setTransfiniteVolume(int tag, std::vector<int> cornerTags);
void setTransfiniteVolumeQuadTri(int tag);
void setRecombine(int dim, int tag, double angle);
void setSmoothing(int tag, int val);
void setReverseMesh(int dim, int tag);
// synchronize internal CAD data with the given GModel // synchronize internal CAD data with the given GModel
void synchronize(GModel *model); void synchronize(GModel *model);
......
This diff is collapsed.
...@@ -4347,21 +4347,11 @@ ExtrudeParameter : ...@@ -4347,21 +4347,11 @@ ExtrudeParameter :
} }
| tHole '(' FExpr ')' tAFFECT ListOfDouble tUsing FExpr tEND | tHole '(' FExpr ')' tAFFECT ListOfDouble tUsing FExpr tEND
{ {
std::vector<int> tags; ListOfDouble2Vector($6, tags);
int num = (int)$3; int num = (int)$3;
if(FindSurface(num)){ GModel::current()->getGEOInternals()->addDiscreteSurface(num);
yymsg(0, "Surface %d already exists", num); extr.mesh.Holes[num].first = $8;
} extr.mesh.Holes[num].second = tags;
else{
Surface *s = Create_Surface(num, MSH_SURF_DISCRETE);
Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s);
extr.mesh.Holes[num].first = $8;
extr.mesh.Holes[num].second.clear();
for(int i = 0; i < List_Nbr($6); i++){
double d;
List_Read($6, i, &d);
extr.mesh.Holes[num].second.push_back((int)d);
}
}
List_Delete($6); List_Delete($6);
} }
| tUsing tSTRING '[' FExpr ']' tEND | tUsing tSTRING '[' FExpr ']' tEND
...@@ -4686,36 +4676,24 @@ Constraints : ...@@ -4686,36 +4676,24 @@ Constraints :
} }
| tTransfQuadTri ListOfDoubleOrAll tEND | tTransfQuadTri ListOfDoubleOrAll tEND
{ {
// transfinite constraints are also stored in GEO internals, as they can
// be copied around during GEO operations
if(GModel::current()->getOCCInternals()->getChanged())
GModel::current()->getOCCInternals()->synchronize(GModel::current());
if(!$2){ if(!$2){
List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes); GModel::current()->getGEOInternals()->setTransfiniteVolumeQuadTri(0);
if(List_Nbr(tmp)){ for(GModel::riter it = GModel::current()->firstRegion();
for(int i = 0; i < List_Nbr(tmp); i++){ it != GModel::current()->lastRegion(); it++)
Volume *v; (*it)->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
List_Read(tmp, i, &v);
v->QuadTri = TRANSFINITE_QUADTRI_1;
}
}
else{
for(GModel::riter it = GModel::current()->firstRegion();
it != GModel::current()->lastRegion(); it++)
(*it)->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
}
List_Delete(tmp);
} }
else{ else{
for(int i = 0; i < List_Nbr($2); i++){ for(int i = 0; i < List_Nbr($2); i++){
double d; double d;
List_Read($2, i, &d); List_Read($2, i, &d);
Volume *v = FindVolume((int)d); int tag = (int)d;
if(v) GModel::current()->getGEOInternals()->setTransfiniteVolumeQuadTri(tag);
v->QuadTri = TRANSFINITE_QUADTRI_1; GRegion *gr = GModel::current()->getRegionByTag(tag);
else{ if(gr) gr->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
GRegion *gr = GModel::current()->getRegionByTag((int)d);
if(gr)
gr->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
else
yymsg(1, "Unknown model region with tag %d", (int)d);
}
} }
List_Delete($2); List_Delete($2);
} }
...@@ -4733,109 +4711,80 @@ Constraints : ...@@ -4733,109 +4711,80 @@ Constraints :
{ {
// recombine constraints are also stored in GEO internals, as they can be // recombine constraints are also stored in GEO internals, as they can be
// copied around during GEO operations // copied around during GEO operations
if(GModel::current()->getOCCInternals()->getChanged())
GModel::current()->getOCCInternals()->synchronize(GModel::current());
if(!$3){ if(!$3){
List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces); GModel::current()->getGEOInternals()->setRecombine(2, 0, $4);
if(List_Nbr(tmp)){ for(GModel::fiter it = GModel::current()->firstFace();
for(int i = 0; i < List_Nbr(tmp); i++){ it != GModel::current()->lastFace(); it++){
Surface *s; (*it)->meshAttributes.recombine = 1;
List_Read(tmp, i, &s); (*it)->meshAttributes.recombineAngle = $4;
s->Recombine = 1;
s->RecombineAngle = $4;
}
}
else{
for(GModel::fiter it = GModel::current()->firstFace();
it != GModel::current()->lastFace(); it++){
(*it)->meshAttributes.recombine = 1;
(*it)->meshAttributes.recombineAngle = $4;
}
} }
List_Delete(tmp);
} }
else{ else{
for(int i = 0; i < List_Nbr($3); i++){ for(int i = 0; i < List_Nbr($3); i++){
double d; double d;
List_Read($3, i, &d); List_Read($3, i, &d);
Surface *s = FindSurface((int)d); int tag = (int)d;
if(s){ GModel::current()->getGEOInternals()->setRecombine(2, tag, $4);
s->Recombine = 1; GFace *gf = GModel::current()->getFaceByTag(tag);
s->RecombineAngle = $4; if(gf){
} gf->meshAttributes.recombine = 1;
else{ gf->meshAttributes.recombineAngle = $4;
GFace *gf = GModel::current()->getFaceByTag((int)d);
if(gf){
gf->meshAttributes.recombine = 1;
gf->meshAttributes.recombineAngle = $4;
}
else
yymsg(1, "Unknown model face with tag %d", (int)d);
} }
} }
List_Delete($3); List_Delete($3);
} }
} }
| tRecombine tVolume ListOfDoubleOrAll tEND | tRecombine tVolume ListOfDoubleOrAll tEND
{ {
// recombine constraints are also stored in GEO internals, as they can be // recombine constraints are also stored in GEO internals, as they can be
// copied around during GEO operations // copied around during GEO operations
if(GModel::current()->getOCCInternals()->getChanged())
GModel::current()->getOCCInternals()->synchronize(GModel::current());
if(!$3){ if(!$3){
List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes); GModel::current()->getGEOInternals()->setRecombine(3, 0, 0.);
if(List_Nbr(tmp)){ for(GModel::riter it = GModel::current()->firstRegion();
for(int i = 0; i < List_Nbr(tmp); i++){ it != GModel::current()->lastRegion(); it++){
Volume *v; (*it)->meshAttributes.recombine3D = 1;
List_Read(tmp, i, &v);
v->Recombine3D = 1;
}
}
else{
for(GModel::riter it = GModel::current()->firstRegion();
it != GModel::current()->lastRegion(); it++){
(*it)->meshAttributes.recombine3D = 1;
}
} }
List_Delete(tmp);
} }
else{ else{
for(int i = 0; i < List_Nbr($3); i++){ for(int i = 0; i < List_Nbr($3); i++){
double d; double d;
List_Read($3, i, &d); List_Read($3, i, &d);
Volume *v = FindVolume((int)d); int tag = (int)d;
if(v){ GModel::current()->getGEOInternals()->setRecombine(3, tag, 0.);
v->Recombine3D = 1; GRegion *gr = GModel::current()->getRegionByTag(tag);
} if(gr) gr->meshAttributes.recombine3D = 1;
else{
GRegion *gr = GModel::current()->getRegionByTag((int)d);
if(gr){
gr->meshAttributes.recombine3D = 1;
}
else
yymsg(1, "Unknown model region with tag %d", (int)d);
}
} }
List_Delete($3); List_Delete($3);
} }
} }
| tSmoother tSurface ListOfDouble tAFFECT FExpr tEND | tSmoother tSurface ListOfDoubleOrAll tAFFECT FExpr tEND
{ {
// smoothing constraints are also stored in GEO internals, as they can be // smoothing constraints are also stored in GEO internals, as they can be
// copied around during GEO operations // copied around during GEO operations
for(int i = 0; i < List_Nbr($3); i++){ if(GModel::current()->getOCCInternals()->getChanged())
double d; GModel::current()->getOCCInternals()->synchronize(GModel::current());
List_Read($3, i, &d); if(!$3){
int j = (int)d; GModel::current()->getGEOInternals()->setSmoothing(0, (int)$5);
Surface *s = FindSurface(j); for(GModel::fiter it = GModel::current()->firstFace();
if(s){ it != GModel::current()->lastFace(); it++){
s->TransfiniteSmoothing = (int)$5; (*it)->meshAttributes.transfiniteSmoothing = (int)$5;
} }
else{ }
GFace *gf = GModel::current()->getFaceByTag(j); else{
if(gf) for(int i = 0; i < List_Nbr($3); i++){
gf->meshAttributes.transfiniteSmoothing = (int)$5; double d;
else List_Read($3, i, &d);
yymsg(1, "Unknown model face with tag %d", (int)$5); int tag = (int)d;
GModel::current()->getGEOInternals()->setSmoothing(tag, (int)$5);
GFace *gf = GModel::current()->getFaceByTag(tag);
if(gf) gf->meshAttributes.transfiniteSmoothing = (int)$5;
} }
List_Delete($3);
} }
List_Delete($3);
} }
| tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT
'{' RecursiveListOfDouble '}' PeriodicTransform tEND '{' RecursiveListOfDouble '}' PeriodicTransform tEND
...@@ -5056,39 +5005,23 @@ Constraints : ...@@ -5056,39 +5005,23 @@ Constraints :
{ {
// reverse mesh constraints are also stored in GEO internals, as they can // reverse mesh constraints are also stored in GEO internals, as they can
// be copied around during GEO operations // be copied around during GEO operations
if(GModel::current()->getOCCInternals()->getChanged())
GModel::current()->getOCCInternals()->synchronize(GModel::current());
if(!$3){ if(!$3){
List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces); GModel::current()->getGEOInternals()->setReverseMesh(2, 0);
if(List_Nbr(tmp)){ for(GModel::fiter it = GModel::current()->firstFace();
for(int i = 0; i < List_Nbr(tmp); i++){ it != GModel::current()->lastFace(); it++){
Surface *s; (*it)->meshAttributes.reverseMesh = 1;
List_Read(tmp, i, &s);
s->ReverseMesh = 1;
}
}
else{
for(GModel::fiter it = GModel::current()->firstFace();
it != GModel::current()->lastFace(); it++){
(*it)->meshAttributes.reverseMesh = 1;
}
} }
List_Delete(tmp);
} }
else{ else{
for(int i = 0; i < List_Nbr($3); i++){ for(int i = 0; i < List_Nbr($3); i++){
double d; double d;
List_Read($3, i, &d); List_Read($3, i, &d);
Surface *s = FindSurface((int)d); int num = (int)d;
if(s){ GModel::current()->getGEOInternals()->setReverseMesh(2, num);
s->ReverseMesh = 1; GFace *gf = GModel::current()->getFaceByTag(num);
} if(gf) gf->meshAttributes.reverseMesh = 1;
else{
GFace *gf = GModel::current()->getFaceByTag((int)d);
if(gf){
gf->meshAttributes.reverseMesh = 1;
}
else
yymsg(1, "Unknown model face with tag %d", (int)d);
}
} }
List_Delete($3); List_Delete($3);
} }
...@@ -5097,39 +5030,23 @@ Constraints : ...@@ -5097,39 +5030,23 @@ Constraints :
{ {
// reverse mesh constraints are also stored in GEO internals, as they can // reverse mesh constraints are also stored in GEO internals, as they can
// be copied around during GEO operations // be copied around during GEO operations
if(GModel::current()->getOCCInternals()->getChanged())
GModel::current()->getOCCInternals()->synchronize(GModel::current());
if(!$3){ if(!$3){
List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Curves); GModel::current()->getGEOInternals()->setReverseMesh(1, 0);
if(List_Nbr(tmp)){ for(GModel::eiter it = GModel::current()->firstEdge();
for(int i = 0; i < List_Nbr(tmp); i++){ it != GModel::current()->lastEdge(); it++){
Curve *c; (*it)->meshAttributes.reverseMesh = 1;
List_Read(tmp, i, &c);
c->ReverseMesh = 1;
}
}
else{
for(GModel::eiter it = GModel::current()->firstEdge();
it != GModel::current()->lastEdge(); it++){
(*it)->meshAttributes.reverseMesh = 1;
}
} }
List_Delete(tmp);
} }
else{ else{
for(int i = 0; i < List_Nbr($3); i++){ for(int i = 0; i < List_Nbr($3); i++){
double d; double d;
List_Read($3, i, &d); List_Read($3, i, &d);
Curve *c = FindCurve((int)d); int num = (int)d;
if(c){ GModel::current()->getGEOInternals()->setReverseMesh(1, num);
c->ReverseMesh = 1; GEdge *ge = GModel::current()->getEdgeByTag(num);
} if(ge) ge->meshAttributes.reverseMesh = 1;
else{
GEdge *ge = GModel::current()->getEdgeByTag((int)d);
if(ge){
ge->meshAttributes.reverseMesh = 1;
}
else
yymsg(1, "Unknown model edge with tag %d", (int)d);
}
} }
List_Delete($3); List_Delete($3);
} }
...@@ -6991,6 +6908,7 @@ fullMatrix<double> ListOfListOfDouble2Matrix(List_T *list) ...@@ -6991,6 +6908,7 @@ fullMatrix<double> ListOfListOfDouble2Matrix(List_T *list)
void ListOfDouble2Vector(List_T *list, std::vector<int> &v) void ListOfDouble2Vector(List_T *list, std::vector<int> &v)
{ {
v.clear(); v.clear();
if(!list) return;
v.reserve(List_Nbr(list)); v.reserve(List_Nbr(list));
for(int i = 0; i < List_Nbr(list); i++){ for(int i = 0; i < List_Nbr(list); i++){
double d; double d;
...@@ -7002,6 +6920,7 @@ void ListOfDouble2Vector(List_T *list, std::vector<int> &v) ...@@ -7002,6 +6920,7 @@ void ListOfDouble2Vector(List_T *list, std::vector<int> &v)
void ListOfDouble2Vector(List_T *list, std::vector<double> &v) void ListOfDouble2Vector(List_T *list, std::vector<double> &v)
{ {
v.clear(); v.clear();
if(!list) return;
v.reserve(List_Nbr(list)); v.reserve(List_Nbr(list));
for(int i = 0; i < List_Nbr(list); i++){ for(int i = 0; i < List_Nbr(list); i++){
double d; double d;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment