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
f4b403a1
Commit
f4b403a1
authored
12 years ago
by
Tristan Carrier Baudouin
Browse files
Options
Downloads
Patches
Plain Diff
hexahedra
parent
704d10d7
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Mesh/simple3D.cpp
+77
-77
77 additions, 77 deletions
Mesh/simple3D.cpp
with
77 additions
and
77 deletions
Mesh/simple3D.cpp
+
77
−
77
View file @
f4b403a1
...
...
@@ -74,18 +74,18 @@ class Node{
class
Wrapper
{
private:
bool
too_close
;
Node
*
spawn
;
bool
ok
;
Node
*
individual
;
Node
*
parent
;
public:
Wrapper
();
Wrapper
(
Node
*
,
Node
*
);
~
Wrapper
();
void
set_
too_close
(
bool
);
void
set_
spawn
(
Node
*
);
void
set_
ok
(
bool
);
void
set_
individual
(
Node
*
);
void
set_parent
(
Node
*
);
bool
get_
too_close
();
Node
*
get_
spawn
();
bool
get_
ok
();
Node
*
get_
individual
();
Node
*
get_parent
();
};
...
...
@@ -123,19 +123,19 @@ bool rtree_callback(Node* neighbour,void* w){
double
h
;
double
distance
;
Metric
m
;
Node
*
spawn
,
*
parent
;
Node
*
individual
,
*
parent
;
Wrapper
*
wrapper
;
wrapper
=
static_cast
<
Wrapper
*>
(
w
);
spawn
=
wrapper
->
get_
spawn
();
individual
=
wrapper
->
get_
individual
();
parent
=
wrapper
->
get_parent
();
h
=
spawn
->
get_size
();
m
=
spawn
->
get_metric
();
h
=
individual
->
get_size
();
m
=
individual
->
get_metric
();
if
(
neighbour
!=
parent
){
distance
=
infinity_distance
(
spawn
->
get_point
(),
neighbour
->
get_point
(),
m
);
distance
=
infinity_distance
(
individual
->
get_point
(),
neighbour
->
get_point
(),
m
);
if
(
distance
<
k1
*
h
){
wrapper
->
set_
too_close
(
1
);
wrapper
->
set_
ok
(
0
);
return
false
;
}
}
...
...
@@ -268,35 +268,35 @@ SPoint3 Node::get_point(){
/*********class Wrapper*********/
Wrapper
::
Wrapper
(){
too_close
=
0
;
ok
=
1
;
}
Wrapper
::
Wrapper
(
Node
*
new_
spawn
,
Node
*
new_parent
){
too_close
=
0
;
spawn
=
new_spawn
;
Wrapper
::
Wrapper
(
Node
*
new_
individual
,
Node
*
new_parent
){
ok
=
1
;
individual
=
new_individual
;
parent
=
new_parent
;
}
Wrapper
::~
Wrapper
(){}
void
Wrapper
::
set_
too_close
(
bool
new_
too_close
){
too_close
=
new_too_close
;
void
Wrapper
::
set_
ok
(
bool
new_
ok
){
ok
=
new_ok
;
}
void
Wrapper
::
set_
spawn
(
Node
*
new_
spawn
){
spawn
=
new_spawn
;
void
Wrapper
::
set_
individual
(
Node
*
new_
individual
){
individual
=
new_individual
;
}
void
Wrapper
::
set_parent
(
Node
*
new_parent
){
parent
=
new_parent
;
}
bool
Wrapper
::
get_
too_close
(){
return
too_close
;
bool
Wrapper
::
get_
ok
(){
return
ok
;
}
Node
*
Wrapper
::
get_
spawn
(){
return
spawn
;
Node
*
Wrapper
::
get_
individual
(){
return
individual
;
}
Node
*
Wrapper
::
get_parent
(){
...
...
@@ -328,20 +328,20 @@ void Filler::treat_region(GRegion* gr){
unsigned
int
i
;
int
j
;
int
count
;
bool
ok
;
bool
ok
2
;
double
x
,
y
,
z
;
SPoint3
point
;
Node
*
node
,
*
spawn
,
*
parent
,
*
n1
,
*
n2
,
*
n3
,
*
n4
,
*
n5
,
*
n6
;
Node
*
node
,
*
individual
,
*
parent
;
MVertex
*
vertex
;
MElement
*
element
;
MElementOctree
*
octree
;
deMeshGRegion
deleter
;
Wrapper
wrapper
;
std
::
queue
<
Node
*>
fifo
;
std
::
vector
<
Node
*>
data
;
std
::
vector
<
Node
*>
spawns
;
std
::
vector
<
Node
*>
garbage
;
std
::
vector
<
MVertex
*>
boundary_vertices
;
std
::
set
<
MVertex
*>
old_vertices
;
std
::
set
<
MVertex
*>
temp
;
std
::
set
<
MVertex
*>::
iterator
it
;
RTree
<
Node
*
,
double
,
3
,
double
>
rtree
;
...
...
@@ -349,16 +349,20 @@ void Filler::treat_region(GRegion* gr){
Size_field
::
init_region
(
gr
);
Size_field
::
solve
(
gr
);
octree
=
new
MElementOctree
(
gr
->
model
());
garbage
.
clear
();
boundary_vertices
.
clear
();
temp
.
clear
();
new_vertices
.
clear
();
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
element
=
gr
->
getMeshElement
(
i
);
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
vertex
=
element
->
getVertex
(
j
);
old_vertices
.
insert
(
vertex
);
temp
.
insert
(
vertex
);
}
}
for
(
it
=
old_vertices
.
begin
();
it
!=
old_vertices
.
end
();
it
++
){
for
(
it
=
temp
.
begin
();
it
!=
temp
.
end
();
it
++
){
if
((
*
it
)
->
onWhat
()
->
dim
()
<
3
){
boundary_vertices
.
push_back
(
*
it
);
}
...
...
@@ -370,7 +374,8 @@ void Filler::treat_region(GRegion* gr){
x
=
boundary_vertices
[
i
]
->
x
();
y
=
boundary_vertices
[
i
]
->
y
();
z
=
boundary_vertices
[
i
]
->
z
();
node
=
new
Node
(
SPoint3
(
x
,
y
,
z
));
node
=
new
Node
(
SPoint3
(
x
,
y
,
z
));
compute_parameters
(
node
,
gr
);
rtree
.
Insert
(
node
->
min
,
node
->
max
,
node
);
fifo
.
push
(
node
);
...
...
@@ -384,47 +389,42 @@ void Filler::treat_region(GRegion* gr){
fifo
.
pop
();
garbage
.
push_back
(
parent
);
n1
=
new
Node
();
n2
=
new
Node
();
n3
=
new
Node
();
n4
=
new
Node
();
n5
=
new
Node
();
n6
=
new
Node
();
offsprings
(
gr
,
octree
,
parent
,
n1
,
n2
,
n3
,
n4
,
n5
,
n6
);
spawns
.
clear
();
spawns
.
resize
(
6
);
for
(
i
=
0
;
i
<
6
;
i
++
){
spawns
[
i
]
=
new
Node
();
}
data
.
clear
();
data
.
push_back
(
n1
);
data
.
push_back
(
n2
);
data
.
push_back
(
n3
);
data
.
push_back
(
n4
);
data
.
push_back
(
n5
);
data
.
push_back
(
n6
);
create_spawns
(
gr
,
octree
,
parent
,
spawns
);
for
(
i
=
0
;
i
<
6
;
i
++
){
ok
=
0
;
spawn
=
data
[
i
];
point
=
spawn
->
get_point
();
ok
2
=
0
;
individual
=
spawns
[
i
];
point
=
individual
->
get_point
();
x
=
point
.
x
();
y
=
point
.
y
();
z
=
point
.
z
();
if
(
inside_domain
(
octree
,
x
,
y
,
z
)){
compute_parameters
(
spawn
,
gr
);
if
(
far_from_boundary
(
octree
,
spawn
)){
wrapper
.
set_
too_close
(
0
);
wrapper
.
set_
spawn
(
spawn
);
compute_parameters
(
individual
,
gr
);
if
(
far_from_boundary
(
octree
,
individual
)){
wrapper
.
set_
ok
(
1
);
wrapper
.
set_
individual
(
individual
);
wrapper
.
set_parent
(
parent
);
rtree
.
Search
(
spawn
->
min
,
spawn
->
max
,
rtree_callback
,
&
wrapper
);
if
(
!
wrapper
.
get_too_close
()){
fifo
.
push
(
spawn
);
rtree
.
Insert
(
spawn
->
min
,
spawn
->
max
,
spawn
);
rtree
.
Search
(
individual
->
min
,
individual
->
max
,
rtree_callback
,
&
wrapper
);
if
(
wrapper
.
get_ok
()){
fifo
.
push
(
individual
);
rtree
.
Insert
(
individual
->
min
,
individual
->
max
,
individual
);
vertex
=
new
MVertex
(
x
,
y
,
z
,
gr
,
0
);
new_vertices
.
push_back
(
vertex
);
ok
=
1
;
ok
2
=
1
;
}
}
}
if
(
!
ok
)
delete
spawn
;
if
(
!
ok2
)
delete
individual
;
}
printf
(
"%d
\n
"
,
count
);
...
...
@@ -438,10 +438,10 @@ void Filler::treat_region(GRegion* gr){
mesher
(
gr
);
//?
MeshDelaunayVolume
(
regions
);
delete
octree
;
for
(
i
=
0
;
i
<
garbage
.
size
();
i
++
)
delete
garbage
[
i
];
for
(
i
=
0
;
i
<
new_vertices
.
size
();
i
++
)
delete
new_vertices
[
i
];
new_vertices
.
clear
();
delete
octree
;
Size_field
::
clear
();
Frame_field
::
clear
();
#endif
...
...
@@ -477,7 +477,7 @@ double Filler::get_size(double x,double y,double z,GEntity* ge){
Field
*
field
;
FieldManager
*
manager
;
h
=
0.25
;
h
=
1.0
;
manager
=
ge
->
model
()
->
getFields
();
if
(
manager
->
getBackgroundField
()
>
0
){
field
=
manager
->
get
(
manager
->
getBackgroundField
());
...
...
@@ -542,7 +542,7 @@ void Filler::compute_parameters(Node* node,GEntity* ge){
node
->
max
[
2
]
=
z
+
sqrt3
*
h
;
}
void
Filler
::
offspring
s
(
GEntity
*
ge
,
MElementOctree
*
octree
,
Node
*
node
,
Node
*
n1
,
Node
*
n2
,
Node
*
n3
,
Node
*
n4
,
Node
*
n5
,
Node
*
n6
){
void
Filler
::
create_spawn
s
(
GEntity
*
ge
,
MElementOctree
*
octree
,
Node
*
node
,
std
::
vector
<
Node
*>&
spawns
){
double
x
,
y
,
z
;
double
x1
,
y1
,
z1
;
double
x2
,
y2
,
z2
;
...
...
@@ -592,37 +592,37 @@ void Filler::offsprings(GEntity* ge,MElementOctree* octree,Node* node,Node* n1,N
y6
=
y
-
h6
*
m
.
get_m23
();
z6
=
z
-
h6
*
m
.
get_m33
();
*
n1
=
Node
(
SPoint3
(
x1
,
y1
,
z1
));
*
n2
=
Node
(
SPoint3
(
x2
,
y2
,
z2
));
*
n3
=
Node
(
SPoint3
(
x3
,
y3
,
z3
));
*
n4
=
Node
(
SPoint3
(
x4
,
y4
,
z4
));
*
n5
=
Node
(
SPoint3
(
x5
,
y5
,
z5
));
*
n6
=
Node
(
SPoint3
(
x6
,
y6
,
z6
));
*
spawns
[
0
]
=
Node
(
SPoint3
(
x1
,
y1
,
z1
));
*
spawns
[
1
]
=
Node
(
SPoint3
(
x2
,
y2
,
z2
));
*
spawns
[
2
]
=
Node
(
SPoint3
(
x3
,
y3
,
z3
));
*
spawns
[
3
]
=
Node
(
SPoint3
(
x4
,
y4
,
z4
));
*
spawns
[
4
]
=
Node
(
SPoint3
(
x5
,
y5
,
z5
));
*
spawns
[
5
]
=
Node
(
SPoint3
(
x6
,
y6
,
z6
));
}
double
Filler
::
improvement
(
GEntity
*
ge
,
MElementOctree
*
octree
,
SPoint3
point
,
double
h
_nearer
,
SVector3
direction
){
double
Filler
::
improvement
(
GEntity
*
ge
,
MElementOctree
*
octree
,
SPoint3
point
,
double
h
1
,
SVector3
direction
){
double
x
,
y
,
z
;
double
average
;
double
h
_farther
;
double
h
2
;
double
coeffA
,
coeffB
;
x
=
point
.
x
()
+
h
_nearer
*
direction
.
x
();
y
=
point
.
y
()
+
h
_nearer
*
direction
.
y
();
z
=
point
.
z
()
+
h
_nearer
*
direction
.
z
();
x
=
point
.
x
()
+
h
1
*
direction
.
x
();
y
=
point
.
y
()
+
h
1
*
direction
.
y
();
z
=
point
.
z
()
+
h
1
*
direction
.
z
();
if
(
inside_domain
(
octree
,
x
,
y
,
z
)){
h
_farther
=
get_size
(
x
,
y
,
z
);
h
2
=
get_size
(
x
,
y
,
z
);
}
else
h
_farther
=
h_nearer
;
else
h
2
=
h1
;
coeffA
=
1.0
;
coeffB
=
0.16
;
if
(
h
_farther
>
h_nearer
){
average
=
coeffA
*
h
_nearer
+
(
1.0
-
coeffA
)
*
h
_farther
;
if
(
h
2
>
h1
){
average
=
coeffA
*
h
1
+
(
1.0
-
coeffA
)
*
h
2
;
}
else
{
average
=
coeffB
*
h
_nearer
+
(
1.0
-
coeffB
)
*
h
_farther
;
average
=
coeffB
*
h
1
+
(
1.0
-
coeffB
)
*
h
2
;
}
return
average
;
...
...
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