Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gmsh
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
a5bd62aa
Commit
a5bd62aa
authored
13 years ago
by
Amaury Johnen
Browse files
Options
Downloads
Patches
Plain Diff
detection all quad ok, need debug
parent
9286da3a
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
Mesh/meshGFaceRecombine.cpp
+467
-33
467 additions, 33 deletions
Mesh/meshGFaceRecombine.cpp
Mesh/meshGFaceRecombine.h
+39
-5
39 additions, 5 deletions
Mesh/meshGFaceRecombine.h
with
506 additions
and
38 deletions
Mesh/meshGFaceRecombine.cpp
+
467
−
33
View file @
a5bd62aa
...
...
@@ -10,18 +10,18 @@
#define REC2D_EDGE_BASE 1
#define REC2D_EDGE_QUAD 1
#define REC2D_ALIGNMENT .5
#define REC2D_WAIT_TIME .0
5
#define REC2D_WAIT_TIME .0
1
#define REC2D_NUM_ACTIO 1000
// #define REC2D_SMOOTH
#define REC2D_DRAW
#include
"meshGFaceRecombine.h"
//#include "MElement.h"
#include
"MTriangle.h"
#include
"MQuadrangle.h"
//#include "meshGFaceOptimize.h"
#ifdef REC2D_SMOOTH
#include
"meshGFaceOptimize.h"
#endif
#ifdef REC2D_DRAW
#include
"drawContext.h"
#include
"FlGui.h"
...
...
@@ -205,15 +205,15 @@ bool Recombine2D::recombine()
{
Rec2DAction
*
nextAction
;
while
(
nextAction
=
Rec2DData
::
getBestAction
())
{
#ifdef REC2D_DRAW
FlGui
::
instance
()
->
check
();
double
time
=
Cpu
();
#ifdef REC2D_DRAW
nextAction
->
color
(
0
,
0
,
200
);
CTX
::
instance
()
->
mesh
.
changed
=
(
ENT_ALL
);
drawContext
::
global
()
->
draw
();
#endif
if
(
nextAction
->
isObsolete
(
))
{
if
(
!
_remainAllQuad
(
nextAction
))
{
nextAction
->
color
(
190
,
0
,
0
);
delete
nextAction
;
continue
;
...
...
@@ -233,6 +233,10 @@ bool Recombine2D::recombine()
delete
nextAction
;
}
#ifdef REC2D_SMOOTH
laplaceSmoothing
(
_gf
,
100
);
#endif
return
1
;
}
...
...
@@ -294,6 +298,159 @@ double Recombine2D::_geomAngle(MVertex *v,
return
angle2
;
}
bool
Recombine2D
::
_remainAllQuad
(
Rec2DAction
*
action
)
{
if
(
action
->
isAssumedObsolete
())
{
static
int
a
=
-
1
;
if
(
++
a
<
1
)
Msg
::
Error
(
"[Recombine2D] obsolete action (allQuad)"
);
return
false
;
}
Rec2DData
::
clearAssumedParities
();
int
p
[
4
];
action
->
getAssumedParities
(
p
);
if
(
!
p
[
0
]
&&
!
p
[
1
]
&&
!
p
[
2
]
&&
!
p
[
3
])
{
Msg
::
Info
(
"is isolated"
);
return
true
;
}
int
min
=
Rec2DData
::
getNewParity
(),
index
;
for
(
int
i
=
0
;
i
<
4
;
++
i
)
{
if
(
p
[
i
]
&&
min
>
p
[
i
])
{
min
=
p
[
i
];
index
=
i
;
}
}
if
(
p
[
0
]
&&
!
p
[
1
]
&&
!
p
[
2
]
&&
!
p
[
3
])
{
Msg
::
Info
(
"is isolated"
);
static
int
a
=
-
1
;
if
(
++
a
<
1
)
Msg
::
Warning
(
"FIXME isoleted should be check ? Think not"
);
return
true
;
}
//Msg::Info("Passsed through there, [%d %d %d %d] -> min %d", p[0], p[1], p[2], p[3], min);
std
::
set
<
Rec2DElement
*>
neighbours
;
std
::
vector
<
Rec2DVertex
*>
touched
;
for
(
int
i
=
0
;
i
<
4
;
i
+=
2
)
{
static
int
a
=
-
1
;
if
(
++
a
<
1
)
Msg
::
Info
(
"FIXME depend de l'action"
);
int
par
;
if
((
index
/
2
)
*
2
==
i
)
par
=
min
;
else
par
=
otherParity
(
min
);
for
(
int
j
=
0
;
j
<
2
;
++
j
)
{
if
(
!
p
[
i
+
j
])
{
Rec2DVertex
*
v
=
action
->
getVertex
(
i
+
j
);
v
->
setAssumedParity
(
par
);
v
->
getTriangles
(
neighbours
);
}
else
if
(
p
[
i
+
j
]
!=
par
)
{
Msg
::
Info
(
"oui a %d, %d"
,
p
[
i
+
j
],
par
);
Rec2DData
::
associateAssumedParity
(
p
[
i
+
j
],
par
,
touched
);
}
}
}
for
(
unsigned
int
i
=
0
;
i
<
touched
.
size
();
++
i
)
{
touched
[
i
]
->
getTriangles
(
neighbours
);
}
touched
.
clear
();
while
(
neighbours
.
size
()
>
0
)
{
//Msg::Info("num neigh %d", neighbours.size());
std
::
set
<
Rec2DElement
*>::
iterator
itTri
=
neighbours
.
begin
();
int
p
[
3
];
(
*
itTri
)
->
getAssumedParities
(
p
);
//Msg::Info("tri %d [%d %d %d]", (*itel)->getNum(), p[0], p[1], p[2]);
bool
hasIdentical
=
false
;
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
if
(
p
[
i
]
&&
p
[
i
]
==
p
[(
i
+
1
)
%
3
])
hasIdentical
=
true
;
}
if
(
!
hasIdentical
)
{
neighbours
.
erase
(
itTri
);
continue
;
}
if
(
p
[
0
]
==
p
[
1
]
&&
p
[
0
]
==
p
[
2
])
{
Msg
::
Info
(
"3 identical par"
);
Rec2DData
::
revertAssumedParities
();
return
false
;
}
//Msg::Info("has identical");
bool
hasAction
=
false
;
std
::
map
<
Rec2DVertex
*
,
std
::
vector
<
int
>
>
suggestions
;
for
(
int
i
=
0
;
i
<
(
*
itTri
)
->
getNumActions
();
++
i
)
{
if
((
*
itTri
)
->
getAction
(
i
)
->
whatWouldYouDo
(
suggestions
))
hasAction
=
true
;
}
if
(
!
hasAction
)
{
//Msg::Info("No action %d", (*itTri)->getNum());
Rec2DData
::
revertAssumedParities
();
return
false
;
}
//Msg::Info("suggest %d", suggestions.size());
std
::
map
<
Rec2DVertex
*
,
std
::
vector
<
int
>
>::
iterator
itSug
;
itSug
=
suggestions
.
begin
();
for
(;
itSug
!=
suggestions
.
end
();
++
itSug
)
{
int
par
=
itSug
->
second
.
front
();
bool
onlyOnePar
=
true
;
for
(
unsigned
int
i
=
1
;
i
<
itSug
->
second
.
size
();
++
i
)
{
if
(
itSug
->
second
[
i
]
!=
par
)
{
onlyOnePar
=
false
;
break
;
}
}
if
(
onlyOnePar
)
{
Rec2DVertex
*
v
=
itSug
->
first
;
int
oldPar
=
v
->
getAssumedParity
();
//Msg::Info("a %d, %d", par, oldPar);
if
(
!
oldPar
)
{
//Msg::Info("b");
v
->
setAssumedParity
(
par
);
v
->
getTriangles
(
neighbours
);
}
else
if
((
par
/
2
)
*
2
!=
(
oldPar
/
2
)
*
2
)
{
//Msg::Info("c");
Msg
::
Info
(
"oui b %d, %d"
,
oldPar
,
par
);
if
(
oldPar
<
par
)
{
int
a
=
oldPar
;
oldPar
=
par
;
par
=
a
;
}
Rec2DData
::
associateAssumedParity
(
oldPar
,
par
,
touched
);
for
(
unsigned
int
i
=
0
;
i
<
touched
.
size
();
++
i
)
{
touched
[
i
]
->
getTriangles
(
neighbours
);
}
touched
.
clear
();
}
else
if
(
par
%
2
!=
oldPar
%
2
)
{
Msg
::
Error
(
"SHOULD NOT HAPPEN"
);
Msg
::
Info
(
"not all quad"
);
Rec2DData
::
revertAssumedParities
();
return
false
;
}
else
Msg
::
Error
(
"SHOULD NOT HAPPEN 2"
);
}
}
neighbours
.
erase
(
itTri
);
}
//Msg::Info("all quad");
return
true
;
}
/** Rec2DData **/
/*****************/
...
...
@@ -346,7 +503,10 @@ void Rec2DData::remove(Rec2DEdge *re)
}
else
++i;
}*/
}
if (!b)
Msg::Error("[Rec2DData] No edge");
*/
_current
->
_edges
.
erase
(
re
);
}
...
...
@@ -369,7 +529,10 @@ void Rec2DData::remove(Rec2DElement *rel)
}
else
++i;
}*/
}
if (!b)
Msg::Error("[Rec2DData] No element");
*/
_current
->
_elements
.
erase
(
rel
);
#ifdef REC2D_DRAW
MTriangle
*
t
=
rel
->
getMTriangle
();
...
...
@@ -471,10 +634,16 @@ void Rec2DData::removeParity(Rec2DVertex *rv, int p)
else
++
i
;
}
if
(
!
b
)
Msg
::
Error
(
"[Rec2DData] No vertex"
);
}
void
Rec2DData
::
associateParity
(
int
pOld
,
int
pNew
)
{
if
(
pOld
/
2
==
pNew
/
2
)
{
Msg
::
Error
(
"[Rec2DData] Do you want to make a mess of parities ?"
);
return
;
}
if
(
_current
->
_parities
.
find
(
pNew
)
==
_current
->
_parities
.
end
())
{
Msg
::
Warning
(
"[Rec2DData] That's strange, isn't it ?"
);
static
int
a
=
-
1
;
...
...
@@ -482,29 +651,151 @@ void Rec2DData::associateParity(int pOld, int pNew)
Msg
::
Warning
(
"[Rec2DData] AND LOOK AT ME WHEN I TALK TO YOU !"
);
}
std
::
map
<
int
,
std
::
vector
<
Rec2DVertex
*>
>::
iterator
it
;
std
::
vector
<
Rec2DVertex
*>
*
vect
,
*
vectNew
;
{
it
=
_current
->
_parities
.
find
(
pOld
);
if
(
it
==
_current
->
_parities
.
end
())
{
static
int
a
=
-
1
;
if
(
++
a
==
0
)
Msg
::
Error
(
"[Rec2DData] You are mistaken, I'll never talk to you again !"
);
return
;
}
std
::
vector
<
Rec2DVertex
*>
*
vect
=
&
it
->
second
;
vect
=
&
it
->
second
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
vect
->
at
(
i
)
->
setParityWD
(
pOld
,
pNew
);
//_current->_parities[pNew].push_back(vect->begin(), vect->end());
_current
->
_parities
.
erase
(
pOld
);
vectNew
=
&
_current
->
_parities
[
pNew
];
vectNew
->
insert
(
vectNew
->
end
(),
vect
->
begin
(),
vect
->
end
());
_current
->
_parities
.
erase
(
it
);
}
pOld
=
otherParity
(
pOld
);
pNew
=
otherParity
(
pNew
);
{
it
=
_current
->
_parities
.
find
(
pOld
);
if
(
it
==
_current
->
_parities
.
end
())
if
(
it
==
_current
->
_parities
.
end
())
{
Msg
::
Warning
(
"[Rec2DData] What ?"
);
return
;
}
vect
=
&
it
->
second
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
vect
->
at
(
i
)
->
setParityWD
(
pOld
,
pNew
);
//_current->_parities[pNew].push_back(vect->begin(), vect->end());
_current
->
_parities
.
erase
(
pOld
);
vectNew
=
&
_current
->
_parities
[
pNew
];
vectNew
->
insert
(
vectNew
->
end
(),
vect
->
begin
(),
vect
->
end
());
_current
->
_parities
.
erase
(
it
);
}
}
void
Rec2DData
::
removeAssumedParity
(
Rec2DVertex
*
rv
,
int
p
)
{
std
::
map
<
int
,
std
::
vector
<
Rec2DVertex
*>
>::
iterator
it
;
it
=
_current
->
_assumedParities
.
find
(
p
);
if
(
it
==
_current
->
_assumedParities
.
end
())
{
Msg
::
Error
(
"[Rec2DData] Don't have assumed parity %d"
,
p
);
return
;
}
bool
b
=
false
;
std
::
vector
<
Rec2DVertex
*>
*
vect
=
&
it
->
second
;
unsigned
int
i
=
0
;
while
(
i
<
vect
->
size
())
{
if
(
vect
->
at
(
i
)
==
rv
)
{
vect
->
at
(
i
)
=
vect
->
back
();
vect
->
pop_back
();
if
(
b
)
Msg
::
Error
(
"[Rec2DData] Two or more times same vertex"
);
b
=
true
;
}
else
++
i
;
}
if
(
!
b
)
Msg
::
Error
(
"[Rec2DData] No vertex"
);
}
void
Rec2DData
::
saveAssumedParity
(
Rec2DVertex
*
rv
,
int
p
)
{
static
int
a
=
-
1
;
if
(
++
a
<
1
)
Msg
::
Warning
(
"FIXME Do you have cleared _oldParity ?"
);
std
::
map
<
Rec2DVertex
*
,
int
>::
iterator
it
;
it
=
_current
->
_oldParity
.
find
(
rv
);
if
(
it
==
_current
->
_oldParity
.
end
())
_current
->
_oldParity
[
rv
]
=
p
;
}
void
Rec2DData
::
associateAssumedParity
(
int
pOld
,
int
pNew
,
std
::
vector
<
Rec2DVertex
*>
&
touched
)
{
if
(
pOld
/
2
==
pNew
/
2
)
{
Msg
::
Error
(
"[Rec2DData] Do you want to make a mess of assumed parities ?"
);
return
;
}
if
(
_current
->
_assumedParities
.
find
(
pNew
)
==
_current
->
_assumedParities
.
end
())
{
Msg
::
Warning
(
"[Rec2DData] That's strange, isn't it ?"
);
}
std
::
map
<
int
,
std
::
vector
<
Rec2DVertex
*>
>::
iterator
it
;
std
::
vector
<
Rec2DVertex
*>
*
vect
,
*
vectNew
;
{
it
=
_current
->
_parities
.
find
(
pOld
);
if
(
it
==
_current
->
_parities
.
end
())
{
Msg
::
Error
(
"[Rec2DData] But, this parity doesn't exist !"
);
return
;
}
vect
=
&
it
->
second
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
{
if
(
vect
->
at
(
i
)
->
setAssumedParity
(
pNew
))
touched
.
push_back
(
vect
->
at
(
i
));
}
it
=
_current
->
_assumedParities
.
find
(
pOld
);
if
(
it
!=
_current
->
_assumedParities
.
end
())
{
vect
=
&
it
->
second
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
{
vect
->
at
(
i
)
->
setAssumedParityWD
(
pOld
,
pNew
);
touched
.
push_back
(
vect
->
at
(
i
));
}
vectNew
=
&
_current
->
_assumedParities
[
pNew
];
vectNew
->
insert
(
vectNew
->
end
(),
vect
->
begin
(),
vect
->
end
());
_current
->
_assumedParities
.
erase
(
it
);
}
}
pOld
=
otherParity
(
pOld
);
pNew
=
otherParity
(
pNew
);
{
it
=
_current
->
_parities
.
find
(
pOld
);
if
(
it
==
_current
->
_parities
.
end
())
{
Msg
::
Warning
(
"[Rec2DData] What ?"
);
return
;
}
vect
=
&
it
->
second
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
{
if
(
vect
->
at
(
i
)
->
setAssumedParity
(
pNew
))
touched
.
push_back
(
vect
->
at
(
i
));
}
it
=
_current
->
_assumedParities
.
find
(
pOld
);
if
(
it
!=
_current
->
_assumedParities
.
end
())
{
vect
=
&
it
->
second
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
{
vect
->
at
(
i
)
->
setAssumedParityWD
(
pOld
,
pNew
);
touched
.
push_back
(
vect
->
at
(
i
));
}
vectNew
=
&
_current
->
_assumedParities
[
pNew
];
vectNew
->
insert
(
vectNew
->
end
(),
vect
->
begin
(),
vect
->
end
());
_current
->
_assumedParities
.
erase
(
it
);
}
}
}
void
Rec2DData
::
revertAssumedParities
()
{
std
::
map
<
Rec2DVertex
*
,
int
>::
iterator
it
;
it
=
_current
->
_oldParity
.
begin
();
for
(;
it
!=
_current
->
_oldParity
.
end
();
++
it
)
{
it
->
first
->
revertAssumedParity
(
it
->
second
);
}
}
double
Rec2DData
::
getGlobalValue
()
...
...
@@ -582,9 +873,9 @@ Rec2DTwoTri2Quad::Rec2DTwoTri2Quad(Rec2DElement *el0, Rec2DElement *el1)
Rec2DTwoTri2Quad
::~
Rec2DTwoTri2Quad
()
{
if
(
_triangles
[
0
])
_triangles
[
0
]
->
remove
T
(
this
);
_triangles
[
0
]
->
remove
(
this
);
if
(
_triangles
[
1
])
_triangles
[
1
]
->
remove
T
(
this
);
_triangles
[
1
]
->
remove
(
this
);
Rec2DData
::
remove
(
this
);
}
...
...
@@ -604,9 +895,11 @@ void Rec2DTwoTri2Quad::_computeGlobVal()
void
Rec2DTwoTri2Quad
::
color
(
int
a
,
int
b
,
int
c
)
{
#ifdef REC2D_DRAW
unsigned
int
col
=
CTX
::
instance
()
->
packColor
(
a
,
b
,
c
,
255
);
_triangles
[
0
]
->
getMElement
()
->
setCol
(
col
);
_triangles
[
1
]
->
getMElement
()
->
setCol
(
col
);
#endif
}
void
Rec2DTwoTri2Quad
::
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
)
...
...
@@ -646,8 +939,8 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar)
}
}
_triangles
[
0
]
->
remove
T
(
this
);
_triangles
[
1
]
->
remove
T
(
this
);
_triangles
[
0
]
->
remove
(
this
);
_triangles
[
1
]
->
remove
(
this
);
std
::
vector
<
Rec2DAction
*>
actions
;
_triangles
[
0
]
->
getUniqueActions
(
actions
);
...
...
@@ -675,6 +968,16 @@ bool Rec2DTwoTri2Quad::isObsolete()
return
Rec2DTwoTri2Quad
::
isObsolete
(
p
);
}
bool
Rec2DTwoTri2Quad
::
isAssumedObsolete
()
{
int
p
[
4
];
p
[
0
]
=
_vertices
[
0
]
->
getAssumedParity
();
p
[
1
]
=
_vertices
[
1
]
->
getAssumedParity
();
p
[
2
]
=
_vertices
[
2
]
->
getAssumedParity
();
p
[
3
]
=
_vertices
[
3
]
->
getAssumedParity
();
return
Rec2DTwoTri2Quad
::
isObsolete
(
p
);
}
bool
Rec2DTwoTri2Quad
::
isObsolete
(
int
*
p
)
{
if
(
p
[
0
]
&&
p
[
0
]
/
2
==
p
[
1
]
/
2
&&
p
[
0
]
%
2
!=
p
[
1
]
%
2
||
...
...
@@ -685,6 +988,53 @@ bool Rec2DTwoTri2Quad::isObsolete(int *p)
return
false
;
}
void
Rec2DTwoTri2Quad
::
getAssumedParities
(
int
*
par
)
{
par
[
0
]
=
_vertices
[
0
]
->
getAssumedParity
();
par
[
1
]
=
_vertices
[
1
]
->
getAssumedParity
();
par
[
2
]
=
_vertices
[
2
]
->
getAssumedParity
();
par
[
3
]
=
_vertices
[
3
]
->
getAssumedParity
();
}
bool
Rec2DTwoTri2Quad
::
whatWouldYouDo
(
std
::
map
<
Rec2DVertex
*
,
std
::
vector
<
int
>
>
&
suggestions
)
{
int
p
[
4
];
p
[
0
]
=
_vertices
[
0
]
->
getAssumedParity
();
p
[
1
]
=
_vertices
[
1
]
->
getAssumedParity
();
p
[
2
]
=
_vertices
[
2
]
->
getAssumedParity
();
p
[
3
]
=
_vertices
[
3
]
->
getAssumedParity
();
if
(
Rec2DTwoTri2Quad
::
isObsolete
(
p
))
{
return
false
;
}
int
min
=
100
,
index
=
-
1
;
for
(
int
i
=
0
;
i
<
4
;
++
i
)
{
if
(
p
[
i
]
&&
min
>
p
[
i
])
{
min
=
p
[
i
];
index
=
i
;
}
}
if
(
index
==
-
1
)
{
Msg
::
Error
(
"[Rec2DTwoTri2Quad] No parities ! That's not acceptable !"
);
return
false
;
}
for
(
int
i
=
0
;
i
<
4
;
i
+=
2
)
{
int
par
;
if
((
index
/
2
)
*
2
==
i
)
par
=
min
;
else
par
=
otherParity
(
min
);
for
(
int
j
=
0
;
j
<
2
;
++
j
)
{
if
(
p
[
i
+
j
]
!=
par
)
suggestions
[
_vertices
[
i
+
j
]].
push_back
(
par
);
}
}
return
true
;
}
/** Rec2DEdge **/
/*****************/
...
...
@@ -817,7 +1167,8 @@ Rec2DVertex* Rec2DEdge::getOtherVertex(Rec2DVertex *rv) const
/** Rec2DVertex **/
/*******************/
Rec2DVertex
::
Rec2DVertex
(
MVertex
*
v
,
bool
toSave
)
:
_v
(
v
),
_angle
(
4
*
M_PI
),
_onWhat
(
1
),
_parity
(
0
),
_lastMove
(
-
1
),
_isMesh
(
toSave
)
:
_v
(
v
),
_angle
(
4
*
M_PI
),
_onWhat
(
1
),
_parity
(
0
),
_assumedParity
(
0
),
_lastMove
(
-
1
),
_isMesh
(
toSave
)
{
reparamMeshVertexOnFace
(
_v
,
Recombine2D
::
getGFace
(),
_param
);
if
(
_isMesh
)
{
...
...
@@ -827,7 +1178,8 @@ Rec2DVertex::Rec2DVertex(MVertex *v, bool toSave)
}
Rec2DVertex
::
Rec2DVertex
(
Rec2DVertex
*
rv
,
double
ang
)
:
_v
(
rv
->
_v
),
_angle
(
ang
),
_onWhat
(
-
1
),
_parity
(
0
),
_lastMove
(
-
1
),
_isMesh
(
true
)
:
_v
(
rv
->
_v
),
_angle
(
ang
),
_onWhat
(
-
1
),
_parity
(
0
),
_assumedParity
(
0
),
_lastMove
(
-
1
),
_isMesh
(
true
)
{
_edges
=
rv
->
_edges
;
_elements
=
rv
->
_elements
;
...
...
@@ -842,6 +1194,10 @@ Rec2DVertex::Rec2DVertex(Rec2DVertex *rv, double ang)
Rec2DVertex
::~
Rec2DVertex
()
{
if
(
_parity
)
Rec2DData
::
removeParity
(
this
,
_parity
);
if
(
_assumedParity
)
Rec2DData
::
removeAssumedParity
(
this
,
_assumedParity
);
Rec2DData
::
remove
(
this
);
Rec2DData
::
addVert
(
-
1
,
-
getQual
());
}
...
...
@@ -948,6 +1304,7 @@ void Rec2DVertex::setParity(int p)
Rec2DData
::
removeParity
(
this
,
_parity
);
}
_parity
=
p
;
_assumedParity
=
0
;
Rec2DData
::
addParity
(
this
,
_parity
);
}
...
...
@@ -959,6 +1316,65 @@ void Rec2DVertex::setParityWD(int pOld, int pNew)
if
(
pOld
!=
_parity
)
Msg
::
Error
(
"[Rec2DVertex] Old parity was not correct"
);
_parity
=
pNew
;
_assumedParity
=
0
;
}
int
Rec2DVertex
::
getAssumedParity
()
const
{
if
(
_assumedParity
)
return
_assumedParity
;
return
_parity
;
}
bool
Rec2DVertex
::
setAssumedParity
(
int
p
)
{
if
(
p
==
_assumedParity
)
{
Msg
::
Warning
(
"[Rec2DVertex] Already have this assumed parity"
);
return
false
;
}
if
(
p
==
_parity
)
{
Msg
::
Warning
(
"[Rec2DVertex] Parity already this value (%d, %d) -> %d"
,
_parity
,
_assumedParity
,
p
);
return
false
;
}
Rec2DData
::
saveAssumedParity
(
this
,
_assumedParity
);
if
(
_assumedParity
)
{
Rec2DData
::
removeAssumedParity
(
this
,
_assumedParity
);
}
_assumedParity
=
p
;
Rec2DData
::
addAssumedParity
(
this
,
_assumedParity
);
return
true
;
}
void
Rec2DVertex
::
setAssumedParityWD
(
int
pOld
,
int
pNew
)
{
static
int
a
=
-
1
;
if
(
++
a
<
1
)
Msg
::
Warning
(
"FIXME puis-je rendre fonction utilisable uniquement par recdata ?"
);
if
(
pOld
!=
_assumedParity
)
Msg
::
Error
(
"[Rec2DVertex] Old assumed parity was not correct"
);
Rec2DData
::
saveAssumedParity
(
this
,
_assumedParity
);
_assumedParity
=
pNew
;
}
void
Rec2DVertex
::
revertAssumedParity
(
int
p
)
{
if
(
p
==
_parity
)
{
if
(
_assumedParity
)
{
Rec2DData
::
removeAssumedParity
(
this
,
_assumedParity
);
_assumedParity
=
0
;
}
}
else
_assumedParity
=
p
;
}
void
Rec2DVertex
::
getTriangles
(
std
::
set
<
Rec2DElement
*>
&
tri
)
{
for
(
unsigned
int
i
=
0
;
i
<
_elements
.
size
();
++
i
)
{
if
(
_elements
[
i
]
->
isTri
())
tri
.
insert
(
_elements
[
i
]);
}
}
double
Rec2DVertex
::
getQual
(
int
numEl
)
const
...
...
@@ -1167,7 +1583,7 @@ void Rec2DElement::add(Rec2DAction *ra)
_actions
.
push_back
(
ra
);
}
void
Rec2DElement
::
remove
T
(
Rec2DAction
*
ra
)
void
Rec2DElement
::
remove
(
Rec2DAction
*
ra
)
{
unsigned
int
i
=
0
;
while
(
i
<
_actions
.
size
())
{
...
...
@@ -1210,6 +1626,24 @@ void Rec2DElement::removeNeighbour(Rec2DEdge *re, Rec2DElement *rel)
}
void
Rec2DElement
::
getAssumedParities
(
int
*
p
)
const
{
if
(
_numEdge
==
4
)
{
Msg
::
Error
(
"[Rec2DElement] Not implemented for quad"
);
}
Rec2DVertex
*
v
[
3
];
v
[
0
]
=
_edges
[
0
]
->
getVertex
(
0
);
v
[
1
]
=
_edges
[
0
]
->
getVertex
(
1
);
if
(
_edges
[
1
]
->
getVertex
(
0
)
==
v
[
0
]
||
_edges
[
1
]
->
getVertex
(
0
)
==
v
[
1
]
)
v
[
2
]
=
_edges
[
1
]
->
getVertex
(
1
);
else
v
[
2
]
=
_edges
[
1
]
->
getVertex
(
0
);
p
[
0
]
=
v
[
0
]
->
getAssumedParity
();
p
[
1
]
=
v
[
1
]
->
getAssumedParity
();
p
[
2
]
=
v
[
2
]
->
getAssumedParity
();
}
void
Rec2DElement
::
getMoreEdges
(
std
::
vector
<
Rec2DEdge
*>
&
edges
)
const
{
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
...
...
This diff is collapsed.
Click to expand it.
Mesh/meshGFaceRecombine.h
+
39
−
5
View file @
a5bd62aa
...
...
@@ -52,7 +52,7 @@ class Recombine2D {
double
_geomAngle
(
MVertex
*
,
std
::
vector
<
GEdge
*>&
,
std
::
vector
<
MElement
*>&
);
//
bool _remainAllQuad(Rec2DAction *action);
bool
_remainAllQuad
(
Rec2DAction
*
action
);
};
class
Rec2DData
{
...
...
@@ -67,6 +67,8 @@ class Rec2DData {
std
::
list
<
Rec2DAction
*>
_actions
;
std
::
map
<
int
,
std
::
vector
<
Rec2DVertex
*>
>
_parities
;
std
::
map
<
int
,
std
::
vector
<
Rec2DVertex
*>
>
_assumedParities
;
std
::
map
<
Rec2DVertex
*
,
int
>
_oldParity
;
public
:
Rec2DData
(
int
numTri
,
int
numQuad
);
...
...
@@ -109,9 +111,19 @@ class Rec2DData {
static
int
getNewParity
();
static
void
removeParity
(
Rec2DVertex
*
,
int
);
static
inline
void
addParity
(
Rec2DVertex
*
rv
,
int
p
)
{
_current
->
_parities
[
p
].
push_back
(
rv
);}
static
inline
void
addParity
(
Rec2DVertex
*
rv
,
int
p
)
{
_current
->
_parities
[
p
].
push_back
(
rv
);
}
static
void
associateParity
(
int
pOld
,
int
pNew
);
static
void
removeAssumedParity
(
Rec2DVertex
*
,
int
);
static
inline
void
addAssumedParity
(
Rec2DVertex
*
rv
,
int
p
)
{
_current
->
_assumedParities
[
p
].
push_back
(
rv
);
}
static
void
saveAssumedParity
(
Rec2DVertex
*
,
int
);
static
void
associateAssumedParity
(
int
pOld
,
int
pNew
,
std
::
vector
<
Rec2DVertex
*>&
);
static
inline
void
clearAssumedParities
()
{
_current
->
_oldParity
.
clear
();}
static
void
revertAssumedParities
();
static
inline
void
addVert
(
int
num
,
double
val
)
{
_current
->
_numVert
+=
num
;
...
...
@@ -135,11 +147,16 @@ class Rec2DAction {
public
:
virtual
inline
~
Rec2DAction
()
{
Rec2DData
::
remove
(
this
);}
bool
operator
<
(
Rec2DAction
&
);
virtual
double
getReward
();
virtual
void
color
(
int
,
int
,
int
)
=
0
;
virtual
void
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
)
=
0
;
virtual
bool
isObsolete
()
=
0
;
virtual
bool
isAssumedObsolete
()
=
0
;
virtual
void
getAssumedParities
(
int
*
)
=
0
;
virtual
bool
whatWouldYouDo
(
std
::
map
<
Rec2DVertex
*
,
std
::
vector
<
int
>
>&
)
=
0
;
virtual
Rec2DVertex
*
getVertex
(
int
)
=
0
;
private
:
virtual
void
_computeGlobVal
()
=
0
;
...
...
@@ -158,7 +175,11 @@ class Rec2DTwoTri2Quad : public Rec2DAction {
virtual
void
color
(
int
,
int
,
int
);
virtual
void
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
);
virtual
bool
isObsolete
();
virtual
bool
isAssumedObsolete
();
static
bool
isObsolete
(
int
*
);
virtual
void
getAssumedParities
(
int
*
);
virtual
bool
whatWouldYouDo
(
std
::
map
<
Rec2DVertex
*
,
std
::
vector
<
int
>
>&
);
virtual
inline
Rec2DVertex
*
getVertex
(
int
i
)
{
return
_vertices
[
i
];}
//-
private
:
virtual
void
_computeGlobVal
();
...
...
@@ -208,7 +229,8 @@ class Rec2DVertex {
const
double
_angle
;
std
::
vector
<
Rec2DEdge
*>
_edges
;
std
::
vector
<
Rec2DElement
*>
_elements
;
int
_onWhat
,
_parity
,
_lastMove
;
// _onWhat={-1:corner,0:edge,1:face}
int
_lastMove
,
_onWhat
;
// _onWhat={-1:corner,0:edge,1:face}
int
_parity
,
_assumedParity
;
SPoint2
_param
;
bool
_isMesh
;
...
...
@@ -228,10 +250,17 @@ class Rec2DVertex {
inline
void
setOnBoundary
()
{
if
(
_onWhat
>
0
)
_onWhat
=
0
;}
inline
bool
getOnBoundary
()
const
{
return
_onWhat
<
1
;}
bool
setBoundaryParity
(
int
p0
,
int
p1
);
inline
int
getParity
()
const
{
return
_parity
;}
void
setParity
(
int
);
void
setParityWD
(
int
pOld
,
int
pNew
);
int
getAssumedParity
()
const
;
bool
setAssumedParity
(
int
);
void
setAssumedParityWD
(
int
pOld
,
int
pNew
);
void
revertAssumedParity
(
int
);
inline
int
getNumElements
()
const
{
return
_elements
.
size
();}
void
getTriangles
(
std
::
set
<
Rec2DElement
*>&
);
inline
MVertex
*
getMVertex
()
const
{
return
_v
;}
inline
int
getLastMove
()
const
{
return
_lastMove
;}
...
...
@@ -272,10 +301,12 @@ class Rec2DElement {
Rec2DElement
(
Rec2DEdge
**
);
~
Rec2DElement
();
bool
inline
isTri
()
{
return
_numEdge
==
3
;}
bool
inline
isQuad
()
{
return
_numEdge
==
4
;}
void
add
(
Rec2DEdge
*
);
bool
has
(
Rec2DEdge
*
)
const
;
void
add
(
Rec2DAction
*
);
void
remove
T
(
Rec2DAction
*
);
void
remove
(
Rec2DAction
*
);
void
addNeighbour
(
Rec2DEdge
*
,
Rec2DElement
*
);
void
removeNeighbour
(
Rec2DEdge
*
,
Rec2DElement
*
);
inline
MElement
*
getMElement
()
const
{
return
_mEl
;}
...
...
@@ -299,6 +330,9 @@ class Rec2DElement {
}
#endif
inline
int
getNumActions
()
const
{
return
_actions
.
size
();}
inline
Rec2DAction
*
getAction
(
int
i
)
const
{
return
_actions
[
i
];}
void
getAssumedParities
(
int
*
)
const
;
void
getMoreEdges
(
std
::
vector
<
Rec2DEdge
*>&
)
const
;
void
getVertices
(
std
::
vector
<
Rec2DVertex
*>&
)
const
;
void
getUniqueActions
(
std
::
vector
<
Rec2DAction
*>&
)
const
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment