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
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
62179813
Commit
62179813
authored
15 years ago
by
Jean-François Remacle
Browse files
Options
Downloads
Patches
Plain Diff
No commit message
No commit message
parent
fca91426
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
Mesh/highOrderSmoother.cpp
+57
-48
57 additions, 48 deletions
Mesh/highOrderSmoother.cpp
with
57 additions
and
48 deletions
Mesh/highOrderSmoother.cpp
+
57
−
48
View file @
62179813
...
@@ -368,8 +368,11 @@ void highOrderSmoother::optimize(GFace * gf,
...
@@ -368,8 +368,11 @@ void highOrderSmoother::optimize(GFace * gf,
// then try to swap for better configurations
// then try to swap for better configurations
smooth
(
gf
,
true
);
smooth
(
gf
,
true
);
for
(
int
i
=
0
;
i
<
100
;
i
++
){
int
nbSwap
=
int
nbSwap
=
swapHighOrderTriangles
(
gf
,
edgeVertices
,
faceVertices
,
this
);
swapHighOrderTriangles
(
gf
,
edgeVertices
,
faceVertices
,
this
);
printf
(
"%d swaps
\n
"
,
nbSwap
);
}
// smooth(gf,true);
// smooth(gf,true);
// smooth(gf,true);
// smooth(gf,true);
// smooth(gf,true);
// smooth(gf,true);
...
@@ -440,8 +443,9 @@ void highOrderSmoother::smooth_metric(std::vector<MElement*> & all, GFace *gf)
...
@@ -440,8 +443,9 @@ void highOrderSmoother::smooth_metric(std::vector<MElement*> & all, GFace *gf)
elasticityTerm
El
(
0
,
1.0
,
.48
,
getTag
());
elasticityTerm
El
(
0
,
1.0
,
.48
,
getTag
());
std
::
vector
<
MElement
*>
layer
,
v
;
std
::
vector
<
MElement
*>
layer
,
v
;
double
minD
;
if
(
!
v
.
size
())
return
;
getDistordedElements
(
all
,
0.5
,
v
,
minD
)
;
const
int
nbLayers
=
10
;
//2, originally :)
const
int
nbLayers
=
10
;
//2, originally :)
for
(
int
i
=
0
;
i
<
nbLayers
;
i
++
){
for
(
int
i
=
0
;
i
<
nbLayers
;
i
++
){
...
@@ -451,6 +455,8 @@ void highOrderSmoother::smooth_metric(std::vector<MElement*> & all, GFace *gf)
...
@@ -451,6 +455,8 @@ void highOrderSmoother::smooth_metric(std::vector<MElement*> & all, GFace *gf)
Msg
::
Debug
(
"%d elements after adding %d layers"
,
(
int
)
v
.
size
(),
nbLayers
);
Msg
::
Debug
(
"%d elements after adding %d layers"
,
(
int
)
v
.
size
(),
nbLayers
);
if
(
!
v
.
size
())
return
;
addOneLayer
(
all
,
v
,
layer
);
addOneLayer
(
all
,
v
,
layer
);
std
::
set
<
MVertex
*>::
iterator
it
;
std
::
set
<
MVertex
*>::
iterator
it
;
...
@@ -541,6 +547,9 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
...
@@ -541,6 +547,9 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
elasticityTerm
&
El
)
elasticityTerm
&
El
)
{
{
std
::
set
<
MVertex
*>::
iterator
it
;
std
::
set
<
MVertex
*>::
iterator
it
;
double
dx
=
0.0
;
// printf("size %d\n",myAssembler.sizeOfR());
if
(
myAssembler
.
sizeOfR
()){
if
(
myAssembler
.
sizeOfR
()){
...
@@ -564,7 +573,7 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
...
@@ -564,7 +573,7 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
J23K33
.
gemm
(
J23
,
K33
,
1
,
0
);
J23K33
.
gemm
(
J23
,
K33
,
1
,
0
);
K22
.
gemm
(
J23K33
,
J32
,
1
,
0
);
K22
.
gemm
(
J23K33
,
J32
,
1
,
0
);
J23K33
.
mult
(
D3
,
R2
);
J23K33
.
mult
(
D3
,
R2
);
J23K33
.
print
(
"J23K33"
);
//
J23K33.print("J23K33");
for
(
int
j
=
0
;
j
<
n2
;
j
++
){
for
(
int
j
=
0
;
j
<
n2
;
j
++
){
Dof
RDOF
=
El
.
getLocalDofR
(
&
se
,
j
);
Dof
RDOF
=
El
.
getLocalDofR
(
&
se
,
j
);
myAssembler
.
assemble
(
RDOF
,
-
R2
(
j
));
myAssembler
.
assemble
(
RDOF
,
-
R2
(
j
));
...
@@ -575,9 +584,7 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
...
@@ -575,9 +584,7 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
}
}
}
}
myAssembler
.
systemSolve
();
myAssembler
.
systemSolve
();
}
double
dx
=
0.0
;
for
(
it
=
verticesToMove
.
begin
();
it
!=
verticesToMove
.
end
();
++
it
){
for
(
it
=
verticesToMove
.
begin
();
it
!=
verticesToMove
.
end
();
++
it
){
if
((
*
it
)
->
onWhat
()
->
dim
()
==
2
){
if
((
*
it
)
->
onWhat
()
->
dim
()
==
2
){
SPoint2
param
;
SPoint2
param
;
...
@@ -590,8 +597,8 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
...
@@ -590,8 +597,8 @@ double highOrderSmoother::smooth_metric_(std::vector<MElement*> & v,
(
*
it
)
->
setParameter
(
1
,
newp
.
y
());
(
*
it
)
->
setParameter
(
1
,
newp
.
y
());
}
}
}
}
myAssembler
.
systemClear
();
myAssembler
.
systemClear
();
}
return
dx
;
return
dx
;
}
}
...
@@ -712,19 +719,21 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
...
@@ -712,19 +719,21 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
std
::
vector
<
MElement
*>&
old_elems
,
std
::
vector
<
MElement
*>&
old_elems
,
GFace
*
gf
)
{
GFace
*
gf
)
{
printf
(
"Smoothing a cavity...
\n
"
);
//
printf("Smoothing a cavity...\n");
printf
(
"Old elems : %d and %d
\n
"
,
old_elems
[
0
]
->
getNum
(),
old_elems
[
1
]
->
getNum
());
//
printf("Old elems : %d and %d\n", old_elems[0]->getNum(), old_elems[1]->getNum());
printf
(
"Cavity elems : %d and %d
\n
"
,
cavity
[
0
]
->
getNum
(),
cavity
[
1
]
->
getNum
());
//
printf("Cavity elems : %d and %d\n", cavity[0]->getNum(), cavity[1]->getNum());
linearSystem
<
double
>
*
lsys
;
#ifdef HAVE_TAUCS
#ifdef HAVE_TAUCS
linearSystemCSRTaucs
<
double
>
*
lsys
=
new
linearSystemCSRTaucs
<
double
>
;
if
(
cavity
.
size
()
<
20
)
printf
(
"Using Taucs
\n
"
);
lsys
=
new
linearSystemFull
<
double
>
;
else
lsys
=
new
linearSystemCSRTaucs
<
double
>
;
#else
#else
linearSystemCSRGmm
<
double
>
*
lsys
=
new
linearSystemCSRGmm
<
double
>
;
linearSystemCSRGmm
<
double
>
*
lsys
_
=
new
linearSystemCSRGmm
<
double
>
;
lsys
->
setNoisy
(
1
);
lsys
_
->
setNoisy
(
1
);
lsys
->
setGmres
(
1
);
lsys
_
->
setGmres
(
1
);
lsys
->
setPrec
(
5.e-8
);
lsys
_
->
setPrec
(
5.e-8
);
printf
(
"Using Gmm
\n
"
)
;
lsys
=
_lsys
;
#endif
#endif
dofManager
<
double
>
myAssembler
(
lsys
);
dofManager
<
double
>
myAssembler
(
lsys
);
...
@@ -742,12 +751,12 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
...
@@ -742,12 +751,12 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
for
(
unsigned
int
i
=
0
;
i
<
layer
.
size
();
i
++
){
for
(
unsigned
int
i
=
0
;
i
<
layer
.
size
();
i
++
){
if
(
find
(
old_elems
.
begin
(),
old_elems
.
end
(),
layer
[
i
])
==
old_elems
.
end
())
{
if
(
find
(
old_elems
.
begin
(),
old_elems
.
end
(),
layer
[
i
])
==
old_elems
.
end
())
{
printf
(
"In the layer, there is element %d
\n
"
,
layer
[
i
]
->
getNum
());
//
printf("In the layer, there is element %d\n", layer[i]->getNum());
for
(
int
j
=
0
;
j
<
layer
[
i
]
->
getNumVertices
();
j
++
){
for
(
int
j
=
0
;
j
<
layer
[
i
]
->
getNumVertices
();
j
++
){
MVertex
*
vert
=
layer
[
i
]
->
getVertex
(
j
);
MVertex
*
vert
=
layer
[
i
]
->
getVertex
(
j
);
myAssembler
.
fixVertex
(
vert
,
0
,
getTag
(),
0
);
myAssembler
.
fixVertex
(
vert
,
0
,
getTag
(),
0
);
myAssembler
.
fixVertex
(
vert
,
1
,
getTag
(),
0
);
myAssembler
.
fixVertex
(
vert
,
1
,
getTag
(),
0
);
printf
(
"Fixing vertex (internal) %d
\n
"
,
vert
->
getNum
());
//
printf("Fixing vertex (internal) %d\n", vert->getNum());
}
}
}
}
}
}
...
@@ -768,7 +777,7 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
...
@@ -768,7 +777,7 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
MVertex
*
vert
=
cavity
[
i
]
->
getVertex
(
j
);
MVertex
*
vert
=
cavity
[
i
]
->
getVertex
(
j
);
its
=
_straightSidedLocation
.
find
(
vert
);
its
=
_straightSidedLocation
.
find
(
vert
);
if
(
its
==
_straightSidedLocation
.
end
())
{
if
(
its
==
_straightSidedLocation
.
end
())
{
printf
(
"SETTING LOCATIONS for %d
\n
"
,
vert
->
getNum
());
//
printf("SETTING LOCATIONS for %d\n",vert->getNum());
_straightSidedLocation
[
vert
]
=
_straightSidedLocation
[
vert
]
=
SVector3
(
vert
->
x
(),
vert
->
y
(),
vert
->
z
());
SVector3
(
vert
->
x
(),
vert
->
y
(),
vert
->
z
());
_targetLocation
[
vert
]
=
_targetLocation
[
vert
]
=
...
@@ -780,7 +789,7 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
...
@@ -780,7 +789,7 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
if
(
vert
->
onWhat
()
->
dim
()
<
_dim
){
if
(
vert
->
onWhat
()
->
dim
()
<
_dim
){
myAssembler
.
fixVertex
(
vert
,
0
,
getTag
(),
0
);
myAssembler
.
fixVertex
(
vert
,
0
,
getTag
(),
0
);
myAssembler
.
fixVertex
(
vert
,
1
,
getTag
(),
0
);
myAssembler
.
fixVertex
(
vert
,
1
,
getTag
(),
0
);
printf
(
"Fixing vertex (boundary) %d
\n
"
,
vert
->
getNum
());
//
printf("Fixing vertex (boundary) %d\n", vert->getNum());
}
}
}
}
}
}
...
@@ -790,23 +799,23 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
...
@@ -790,23 +799,23 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
for
(
unsigned
int
i
=
0
;
i
<
cavity
.
size
();
i
++
){
for
(
unsigned
int
i
=
0
;
i
<
cavity
.
size
();
i
++
){
for
(
int
j
=
0
;
j
<
cavity
[
i
]
->
getNumVertices
();
j
++
){
for
(
int
j
=
0
;
j
<
cavity
[
i
]
->
getNumVertices
();
j
++
){
MVertex
*
vert
=
cavity
[
i
]
->
getVertex
(
j
);
MVertex
*
vert
=
cavity
[
i
]
->
getVertex
(
j
);
printf
(
"Numbering vertex %d
\n
"
,
vert
->
getNum
());
//
printf("Numbering vertex %d\n",vert->getNum());
myAssembler
.
numberVertex
(
vert
,
0
,
getTag
());
myAssembler
.
numberVertex
(
vert
,
0
,
getTag
());
myAssembler
.
numberVertex
(
vert
,
1
,
getTag
());
myAssembler
.
numberVertex
(
vert
,
1
,
getTag
());
verticesToMove
.
insert
(
vert
);
verticesToMove
.
insert
(
vert
);
}
}
}
}
Msg
::
Info
(
"%d vertices FIXED %d NUMBERED
\n
"
,
myAssembler
.
sizeOfF
()
//
Msg::Info("%d vertices FIXED %d NUMBERED\n", myAssembler.sizeOfF()
,
myAssembler
.
sizeOfR
());
//
, myAssembler.sizeOfR());
double
dx0
=
smooth_metric_
(
cavity
,
gf
,
myAssembler
,
verticesToMove
,
El
);
double
dx0
=
smooth_metric_
(
cavity
,
gf
,
myAssembler
,
verticesToMove
,
El
);
double
dx
=
dx0
;
double
dx
=
dx0
;
printf
(
" dx0 = %12.5E
\n
"
,
dx0
);
//
printf(" dx0 = %12.5E\n", dx0);
int
iter
=
0
;
int
iter
=
0
;
while
(
1
){
while
(
1
){
double
dx2
=
smooth_metric_
(
cavity
,
gf
,
myAssembler
,
verticesToMove
,
El
);
double
dx2
=
smooth_metric_
(
cavity
,
gf
,
myAssembler
,
verticesToMove
,
El
);
printf
(
" dx2 = %12.5E
\n
"
,
dx2
);
//
printf(" dx2 = %12.5E\n", dx2);
if
(
fabs
(
dx2
-
dx
)
<
1.e-4
*
dx0
)
break
;
if
(
fabs
(
dx2
-
dx
)
<
1.e-4
*
dx0
)
break
;
if
(
iter
++
>
2
)
break
;
if
(
iter
++
>
2
)
break
;
dx
=
dx2
;
dx
=
dx2
;
...
@@ -828,7 +837,7 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
...
@@ -828,7 +837,7 @@ void highOrderSmoother::smooth_cavity(std::vector<MElement*>& cavity,
(
*
it
)
->
y
()
=
p
.
y
();
(
*
it
)
->
y
()
=
p
.
y
();
(
*
it
)
->
z
()
=
p
.
z
();
(
*
it
)
->
z
()
=
p
.
z
();
}
}
printf
(
" Moving %d to %g %g %g
\n
"
,
(
*
it
)
->
getNum
(),
_targetLocation
[(
*
it
)][
0
],
_targetLocation
[(
*
it
)][
1
],
_targetLocation
[(
*
it
)][
2
]
);
//
printf(" Moving %d to %g %g %g\n", (*it)->getNum(),_targetLocation[(*it)][0], _targetLocation[(*it)][1],_targetLocation[(*it)][2] );
}
}
/*
/*
...
@@ -1142,7 +1151,7 @@ struct swap_triangles_pN
...
@@ -1142,7 +1151,7 @@ struct swap_triangles_pN
quality_old
=
std
::
min
(
qold1
,
qold2
);
quality_old
=
std
::
min
(
qold1
,
qold2
);
// if (quality_old < quality_new)
// if (quality_old < quality_new)
printf
(
"QUALITY GOING FROM %12.5E TO %12.5E
\n
"
,
quality_old
,
quality_new
);
//
printf("QUALITY GOING FROM %12.5E TO %12.5E\n",quality_old,quality_new);
}
}
bool
operator
<
(
const
swap_triangles_pN
&
other
)
const
bool
operator
<
(
const
swap_triangles_pN
&
other
)
const
...
@@ -1339,23 +1348,23 @@ static int swapHighOrderTriangles(GFace *gf,
...
@@ -1339,23 +1348,23 @@ static int swapHighOrderTriangles(GFace *gf,
std
::
vector
<
MVertex
*>
vf3
(
v3
.
begin
()
+
3
*
o3
,
v3
.
end
());
std
::
vector
<
MVertex
*>
vf3
(
v3
.
begin
()
+
3
*
o3
,
v3
.
end
());
std
::
vector
<
MVertex
*>
vf4
(
v4
.
begin
()
+
3
*
o4
,
v4
.
end
());
std
::
vector
<
MVertex
*>
vf4
(
v4
.
begin
()
+
3
*
o4
,
v4
.
end
());
printf
(
"========== Diff = %g
\n
"
,
diff
);
//
printf("========== Diff = %g\n",diff);
bool
t1_rem
=
(
t_removed
.
find
(
itp
->
t1
)
!=
t_removed
.
end
());
bool
t1_rem
=
(
t_removed
.
find
(
itp
->
t1
)
!=
t_removed
.
end
());
bool
t2_rem
=
(
t_removed
.
find
(
itp
->
t2
)
!=
t_removed
.
end
());
bool
t2_rem
=
(
t_removed
.
find
(
itp
->
t2
)
!=
t_removed
.
end
());
if
(
t1_rem
)
//
if ( t1_rem)
printf
(
"====== Eww, t1 is going DOWN!
\n
"
);
//
printf("====== Eww, t1 is going DOWN!\n");
if
(
t2_rem
)
//
if ( t2_rem)
printf
(
"====== Eww, t2 is going DOWN!
\n
"
);
//
printf("====== Eww, t2 is going DOWN!\n");
if
(
!
t1_rem
&&
!
t2_rem
&&
if
(
!
t1_rem
&&
!
t2_rem
&&
//itp->quality_new > itp->quality_old &&
//itp->quality_new > itp->quality_old &&
diff
<
1.e-9
){
diff
<
1.e-9
){
printf
(
"Element quality : %f --> %f
\n
"
,
itp
->
quality_old
,
itp
->
quality_new
);
//
printf("Element quality : %f --> %f\n",itp->quality_old,itp->quality_new);
t_removed
.
insert
(
itp
->
t1
);
t_removed
.
insert
(
itp
->
t1
);
t_removed
.
insert
(
itp
->
t2
);
t_removed
.
insert
(
itp
->
t2
);
...
...
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