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
Analyze
Contributor 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
gmsh
gmsh
Commits
edefb427
Commit
edefb427
authored
12 years ago
by
Tristan Carrier Baudouin
Browse files
Options
Downloads
Patches
Plain Diff
3D fields
parent
84ca25f3
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
Mesh/Levy3D.cpp
+3
-3
3 additions, 3 deletions
Mesh/Levy3D.cpp
Mesh/directions3D.cpp
+352
-106
352 additions, 106 deletions
Mesh/directions3D.cpp
Mesh/directions3D.h
+25
-4
25 additions, 4 deletions
Mesh/directions3D.h
Mesh/simple3D.cpp
+3
-3
3 additions, 3 deletions
Mesh/simple3D.cpp
with
383 additions
and
116 deletions
Mesh/Levy3D.cpp
+
3
−
3
View file @
edefb427
...
@@ -1463,7 +1463,7 @@ void LpSmoother::improve_model(){
...
@@ -1463,7 +1463,7 @@ void LpSmoother::improve_model(){
void
LpSmoother
::
improve_region
(
GRegion
*
gr
)
void
LpSmoother
::
improve_region
(
GRegion
*
gr
)
{
{
#if defined(HAVE_BFGS)
#if defined(HAVE_BFGS)
unsigned
int
i
;
unsigned
int
i
;
int
offset
;
int
offset
;
double
epsg
;
double
epsg
;
...
@@ -1490,7 +1490,7 @@ void LpSmoother::improve_region(GRegion* gr)
...
@@ -1490,7 +1490,7 @@ void LpSmoother::improve_region(GRegion* gr)
alglib
::
real_1d_array
x
;
alglib
::
real_1d_array
x
;
alglib
::
real_1d_array
alglib_scales
;
alglib
::
real_1d_array
alglib_scales
;
Frame_field
::
init_
model
(
);
Frame_field
::
init_
region
(
gr
);
octree
=
new
MElementOctree
(
gr
->
model
());
octree
=
new
MElementOctree
(
gr
->
model
());
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
...
@@ -1621,7 +1621,7 @@ void LpSmoother::improve_region(GRegion* gr)
...
@@ -1621,7 +1621,7 @@ void LpSmoother::improve_region(GRegion* gr)
free
(
initial_conditions
);
free
(
initial_conditions
);
free
(
scales
);
free
(
scales
);
Frame_field
::
clear
();
Frame_field
::
clear
();
#endif
#endif
}
}
int
LpSmoother
::
get_nbr_interior_vertices
(){
int
LpSmoother
::
get_nbr_interior_vertices
(){
...
...
This diff is collapsed.
Click to expand it.
Mesh/directions3D.cpp
+
352
−
106
View file @
edefb427
...
@@ -112,25 +112,27 @@ double Matrix::get_m33(){
...
@@ -112,25 +112,27 @@ double Matrix::get_m33(){
Frame_field
::
Frame_field
(){}
Frame_field
::
Frame_field
(){}
void
Frame_field
::
init_
model
(
){
void
Frame_field
::
init_
region
(
GRegion
*
gr
){
#if defined(HAVE_ANN)
#if defined(HAVE_ANN)
int
index
;
int
index
;
MVertex
*
vertex
;
MVertex
*
vertex
;
GFace
*
gf
;
GFace
*
gf
;
GModel
*
model
=
GModel
::
current
()
;
std
::
list
<
GFace
*>
faces
;
GModel
::
f
iter
it
;
std
::
list
<
GFace
*>
::
iter
ator
it
;
std
::
map
<
MVertex
*
,
Matrix
>::
iterator
it2
;
std
::
map
<
MVertex
*
,
Matrix
>::
iterator
it2
;
Matrix
m
;
Matrix
m
;
Nearest_point
::
init_region
(
gr
);
faces
=
gr
->
faces
();
field
.
clear
();
field
.
clear
();
random
.
clear
();
random
.
clear
();
for
(
it
=
model
->
firstFace
();
it
!=
model
->
lastFace
();
it
++
)
for
(
it
=
faces
.
begin
();
it
!=
faces
.
end
();
it
++
)
{
{
gf
=
*
it
;
gf
=
*
it
;
if
(
gf
->
geomType
()
==
GEntity
::
CompoundSurface
){
init_face
(
gf
);
init_face
(
gf
);
}
}
}
duplicate
=
annAllocPts
(
field
.
size
(),
3
);
duplicate
=
annAllocPts
(
field
.
size
(),
3
);
...
@@ -260,7 +262,7 @@ bool Frame_field::translate(GFace* gf,MElementOctree* octree,MVertex* vertex,SPo
...
@@ -260,7 +262,7 @@ bool Frame_field::translate(GFace* gf,MElementOctree* octree,MVertex* vertex,SPo
}
}
Matrix
Frame_field
::
search
(
double
x
,
double
y
,
double
z
){
Matrix
Frame_field
::
search
(
double
x
,
double
y
,
double
z
){
int
val
;
int
index
;
double
e
;
double
e
;
#if defined(HAVE_ANN)
#if defined(HAVE_ANN)
ANNpoint
query
;
ANNpoint
query
;
...
@@ -277,14 +279,63 @@ Matrix Frame_field::search(double x,double y,double z){
...
@@ -277,14 +279,63 @@ Matrix Frame_field::search(double x,double y,double z){
e
=
0.0
;
e
=
0.0
;
kd_tree
->
annkSearch
(
query
,
1
,
indices
,
distances
,
e
);
kd_tree
->
annkSearch
(
query
,
1
,
indices
,
distances
,
e
);
val
=
indices
[
0
];
index
=
indices
[
0
];
annDeallocPt
(
query
);
annDeallocPt
(
query
);
delete
[]
indices
;
delete
[]
indices
;
delete
[]
distances
;
delete
[]
distances
;
#endif
#endif
return
random
[
val
].
second
;
return
random
[
index
].
second
;
}
Matrix
Frame_field
::
combine
(
double
x
,
double
y
,
double
z
){
bool
ok
;
double
val1
,
val2
,
val3
;
SVector3
vec
,
other
;
SVector3
vec1
,
vec2
,
vec3
;
SVector3
final1
,
final2
;
Matrix
m
,
m2
;
m
=
search
(
x
,
y
,
z
);
m2
=
m
;
ok
=
Nearest_point
::
search
(
x
,
y
,
z
,
vec
);
if
(
ok
){
vec1
=
SVector3
(
m
.
get_m11
(),
m
.
get_m21
(),
m
.
get_m31
());
vec2
=
SVector3
(
m
.
get_m12
(),
m
.
get_m22
(),
m
.
get_m32
());
vec3
=
SVector3
(
m
.
get_m13
(),
m
.
get_m23
(),
m
.
get_m33
());
val1
=
fabs
(
dot
(
vec
,
vec1
));
val2
=
fabs
(
dot
(
vec
,
vec2
));
val3
=
fabs
(
dot
(
vec
,
vec3
));
if
(
val1
<=
val2
&&
val1
<=
val3
){
other
=
vec1
;
}
else
if
(
val2
<=
val1
&&
val2
<=
val3
){
other
=
vec2
;
}
else
{
other
=
vec3
;
}
final1
=
crossprod
(
vec
,
other
);
final1
.
normalize
();
final2
=
crossprod
(
vec
,
final1
);
m2
.
set_m11
(
vec
.
x
());
m2
.
set_m21
(
vec
.
y
());
m2
.
set_m31
(
vec
.
z
());
m2
.
set_m12
(
final1
.
x
());
m2
.
set_m22
(
final1
.
y
());
m2
.
set_m32
(
final1
.
z
());
m2
.
set_m13
(
final2
.
x
());
m2
.
set_m23
(
final2
.
y
());
m2
.
set_m33
(
final2
.
z
());
}
return
m2
;
}
}
bool
Frame_field
::
inside_domain
(
MElementOctree
*
octree
,
double
x
,
double
y
){
bool
Frame_field
::
inside_domain
(
MElementOctree
*
octree
,
double
x
,
double
y
){
...
@@ -314,8 +365,8 @@ void Frame_field::print_field1(){
...
@@ -314,8 +365,8 @@ void Frame_field::print_field1(){
std
::
map
<
MVertex
*
,
Matrix
>::
iterator
it
;
std
::
map
<
MVertex
*
,
Matrix
>::
iterator
it
;
Matrix
m
;
Matrix
m
;
k
=
0.
1
;
k
=
0.
05
;
std
::
ofstream
file
(
"f
ield
1.pos"
);
std
::
ofstream
file
(
"f
rame
1.pos"
);
file
<<
"View
\"
test
\"
{
\n
"
;
file
<<
"View
\"
test
\"
{
\n
"
;
for
(
it
=
field
.
begin
();
it
!=
field
.
end
();
it
++
){
for
(
it
=
field
.
begin
();
it
!=
field
.
end
();
it
++
){
...
@@ -341,7 +392,7 @@ void Frame_field::print_field1(){
...
@@ -341,7 +392,7 @@ void Frame_field::print_field1(){
file
<<
"};
\n
"
;
file
<<
"};
\n
"
;
}
}
void
Frame_field
::
print_field2
(){
void
Frame_field
::
print_field2
(
GRegion
*
gr
){
unsigned
int
i
;
unsigned
int
i
;
int
j
;
int
j
;
double
k
;
double
k
;
...
@@ -349,40 +400,33 @@ void Frame_field::print_field2(){
...
@@ -349,40 +400,33 @@ void Frame_field::print_field2(){
SPoint3
p1
,
p2
,
p3
,
p4
,
p5
,
p6
;
SPoint3
p1
,
p2
,
p3
,
p4
,
p5
,
p6
;
MVertex
*
vertex
;
MVertex
*
vertex
;
MElement
*
element
;
MElement
*
element
;
GRegion
*
gr
;
GModel
*
model
=
GModel
::
current
();
GModel
::
riter
it
;
Matrix
m
;
Matrix
m
;
k
=
0.05
;
k
=
0.05
;
std
::
ofstream
file
(
"f
ield
2.pos"
);
std
::
ofstream
file
(
"f
rame
2.pos"
);
file
<<
"View
\"
test
\"
{
\n
"
;
file
<<
"View
\"
test
\"
{
\n
"
;
for
(
it
=
model
->
firstRegion
();
it
!=
model
->
lastRegion
();
it
++
)
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
{
element
=
gr
->
getMeshElement
(
i
);
gr
=
*
it
;
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
vertex
=
element
->
getVertex
(
j
);
element
=
gr
->
getMeshElement
(
i
);
if
(
vertex
->
onWhat
()
->
dim
()
>
2
){
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
m
=
combine
(
vertex
->
x
(),
vertex
->
y
(),
vertex
->
z
());
vertex
=
element
->
getVertex
(
j
);
if
(
vertex
->
onWhat
()
->
dim
()
>
2
){
p
=
SPoint3
(
vertex
->
x
(),
vertex
->
y
(),
vertex
->
z
());
m
=
search
(
vertex
->
x
(),
vertex
->
y
(),
vertex
->
z
());
p1
=
SPoint3
(
vertex
->
x
()
+
k
*
m
.
get_m11
(),
vertex
->
y
()
+
k
*
m
.
get_m21
(),
vertex
->
z
()
+
k
*
m
.
get_m31
());
p2
=
SPoint3
(
vertex
->
x
()
-
k
*
m
.
get_m11
(),
vertex
->
y
()
-
k
*
m
.
get_m21
(),
vertex
->
z
()
-
k
*
m
.
get_m31
());
p
=
SPoint3
(
vertex
->
x
(),
vertex
->
y
(),
vertex
->
z
());
p3
=
SPoint3
(
vertex
->
x
()
+
k
*
m
.
get_m12
(),
vertex
->
y
()
+
k
*
m
.
get_m22
(),
vertex
->
z
()
+
k
*
m
.
get_m32
());
p1
=
SPoint3
(
vertex
->
x
()
+
k
*
m
.
get_m11
(),
vertex
->
y
()
+
k
*
m
.
get_m21
(),
vertex
->
z
()
+
k
*
m
.
get_m31
());
p4
=
SPoint3
(
vertex
->
x
()
-
k
*
m
.
get_m12
(),
vertex
->
y
()
-
k
*
m
.
get_m22
(),
vertex
->
z
()
-
k
*
m
.
get_m32
());
p2
=
SPoint3
(
vertex
->
x
()
-
k
*
m
.
get_m11
(),
vertex
->
y
()
-
k
*
m
.
get_m21
(),
vertex
->
z
()
-
k
*
m
.
get_m31
());
p5
=
SPoint3
(
vertex
->
x
()
+
k
*
m
.
get_m13
(),
vertex
->
y
()
+
k
*
m
.
get_m23
(),
vertex
->
z
()
+
k
*
m
.
get_m33
());
p3
=
SPoint3
(
vertex
->
x
()
+
k
*
m
.
get_m12
(),
vertex
->
y
()
+
k
*
m
.
get_m22
(),
vertex
->
z
()
+
k
*
m
.
get_m32
());
p6
=
SPoint3
(
vertex
->
x
()
-
k
*
m
.
get_m13
(),
vertex
->
y
()
-
k
*
m
.
get_m23
(),
vertex
->
z
()
-
k
*
m
.
get_m33
());
p4
=
SPoint3
(
vertex
->
x
()
-
k
*
m
.
get_m12
(),
vertex
->
y
()
-
k
*
m
.
get_m22
(),
vertex
->
z
()
-
k
*
m
.
get_m32
());
p5
=
SPoint3
(
vertex
->
x
()
+
k
*
m
.
get_m13
(),
vertex
->
y
()
+
k
*
m
.
get_m23
(),
vertex
->
z
()
+
k
*
m
.
get_m33
());
print_segment
(
p
,
p1
,
file
);
p6
=
SPoint3
(
vertex
->
x
()
-
k
*
m
.
get_m13
(),
vertex
->
y
()
-
k
*
m
.
get_m23
(),
vertex
->
z
()
-
k
*
m
.
get_m33
());
print_segment
(
p
,
p2
,
file
);
print_segment
(
p
,
p3
,
file
);
print_segment
(
p
,
p1
,
file
);
print_segment
(
p
,
p4
,
file
);
print_segment
(
p
,
p2
,
file
);
print_segment
(
p
,
p5
,
file
);
print_segment
(
p
,
p3
,
file
);
print_segment
(
p
,
p6
,
file
);
print_segment
(
p
,
p4
,
file
);
print_segment
(
p
,
p5
,
file
);
print_segment
(
p
,
p6
,
file
);
}
}
}
}
}
}
}
...
@@ -397,7 +441,19 @@ void Frame_field::print_segment(SPoint3 p1,SPoint3 p2,std::ofstream& file){
...
@@ -397,7 +441,19 @@ void Frame_field::print_segment(SPoint3 p1,SPoint3 p2,std::ofstream& file){
<<
"{10, 20};
\n
"
;
<<
"{10, 20};
\n
"
;
}
}
GRegion
*
Frame_field
::
test
(){
GRegion
*
gr
;
GModel
*
model
=
GModel
::
current
();
gr
=
*
(
model
->
firstRegion
());
return
gr
;
}
void
Frame_field
::
clear
(){
void
Frame_field
::
clear
(){
#if defined(HAVE_ANN)
Nearest_point
::
clear
();
#endif
field
.
clear
();
field
.
clear
();
random
.
clear
();
random
.
clear
();
#if defined(HAVE_ANN)
#if defined(HAVE_ANN)
...
@@ -411,7 +467,7 @@ void Frame_field::clear(){
...
@@ -411,7 +467,7 @@ void Frame_field::clear(){
Size_field
::
Size_field
(){}
Size_field
::
Size_field
(){}
void
Size_field
::
init_
model
(
){
void
Size_field
::
init_
region
(
GRegion
*
gr
){
size_t
i
;
size_t
i
;
int
j
;
int
j
;
double
local_size
;
double
local_size
;
...
@@ -421,36 +477,38 @@ void Size_field::init_model(){
...
@@ -421,36 +477,38 @@ void Size_field::init_model(){
MVertex
*
vertex
;
MVertex
*
vertex
;
GFace
*
gf
;
GFace
*
gf
;
GModel
*
model
=
GModel
::
current
();
GModel
*
model
=
GModel
::
current
();
GModel
::
fiter
it
;
std
::
list
<
GFace
*>
faces
;
std
::
list
<
GFace
*>::
iterator
it
;
faces
=
gr
->
faces
();
boundary
.
clear
();
boundary
.
clear
();
for
(
it
=
model
->
firstFace
();
it
!=
model
->
lastFace
();
it
++
){
for
(
it
=
faces
.
begin
();
it
!=
faces
.
end
();
it
++
){
gf
=
*
it
;
gf
=
*
it
;
if
(
gf
->
geomType
()
==
GEntity
::
CompoundSurface
){
backgroundMesh
::
set
(
gf
);
backgroundMesh
::
set
(
gf
);
for
(
i
=
0
;
i
<
gf
->
getNumMeshElements
();
i
++
){
for
(
i
=
0
;
i
<
gf
->
getNumMeshElements
();
i
++
){
element
=
gf
->
getMeshElement
(
i
);
element
=
gf
->
getMeshElement
(
i
);
average_x
=
0.0
;
average_x
=
0.0
;
average_y
=
0.0
;
average_y
=
0.0
;
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
vertex
=
element
->
getVertex
(
j
);
vertex
=
element
->
getVertex
(
j
);
reparamMeshVertexOnFace
(
vertex
,
gf
,
point
);
reparamMeshVertexOnFace
(
vertex
,
gf
,
point
);
average_x
=
average_x
+
point
.
x
();
average_x
=
average_x
+
point
.
x
();
average_y
=
average_y
+
point
.
y
();
average_y
=
average_y
+
point
.
y
();
}
}
average_x
=
average_x
/
element
->
getNumVertices
();
average_x
=
average_x
/
element
->
getNumVertices
();
average_y
=
average_y
/
element
->
getNumVertices
();
average_y
=
average_y
/
element
->
getNumVertices
();
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
vertex
=
element
->
getVertex
(
j
);
vertex
=
element
->
getVertex
(
j
);
reparamMeshVertexOnFace
(
vertex
,
gf
,
point
);
reparamMeshVertexOnFace
(
vertex
,
gf
,
point
);
local_size
=
backgroundMesh
::
current
()
->
operator
()(
point
.
x
(),
point
.
y
(),
0.0
);
local_size
=
backgroundMesh
::
current
()
->
operator
()(
point
.
x
(),
point
.
y
(),
0.0
);
boundary
.
insert
(
std
::
pair
<
MVertex
*
,
double
>
(
vertex
,
/*local_size*/
0.2
));
boundary
.
insert
(
std
::
pair
<
MVertex
*
,
double
>
(
vertex
,
/*local_size*/
0.2
));
}
}
}
}
}
}
}
...
@@ -458,25 +516,18 @@ void Size_field::init_model(){
...
@@ -458,25 +516,18 @@ void Size_field::init_model(){
octree
=
new
MElementOctree
(
model
);
octree
=
new
MElementOctree
(
model
);
}
}
void
Size_field
::
solve
(){
void
Size_field
::
solve
(
GRegion
*
gr
){
#if defined(HAVE_PETSC)
#if defined(HAVE_PETSC)
linearSystem
<
double
>*
system
=
0
;
linearSystem
<
double
>*
system
=
0
;
//
system = new linearSystemPETSc<double>;
system
=
new
linearSystemPETSc
<
double
>
;
system
=
new
linearSystemFull
<
double
>
;
//
system = new linearSystemFull<double>;
size_t
i
;
size_t
i
;
int
j
;
double
val
;
double
val
;
MElement
*
element
;
MVertex
*
vertex
;
MTetrahedron
*
temp
;
GRegion
*
gr
;
GModel
*
model
=
GModel
::
current
();
GModel
::
riter
it
;
std
::
map
<
MVertex
*
,
double
>::
iterator
it2
;
std
::
set
<
MVertex
*>::
iterator
it3
;
std
::
set
<
MVertex
*>
interior
;
std
::
set
<
MVertex
*>
interior
;
std
::
set
<
MVertex
*>::
iterator
it
;
std
::
map
<
MVertex
*
,
double
>::
iterator
it2
;
interior
.
clear
();
interior
.
clear
();
dofManager
<
double
>
assembler
(
system
);
dofManager
<
double
>
assembler
(
system
);
...
@@ -485,45 +536,36 @@ void Size_field::solve(){
...
@@ -485,45 +536,36 @@ void Size_field::solve(){
assembler
.
fixVertex
(
it2
->
first
,
0
,
1
,
it2
->
second
);
assembler
.
fixVertex
(
it2
->
first
,
0
,
1
,
it2
->
second
);
}
}
for
(
it
=
model
->
firstRegion
();
it
!=
model
->
lastRegion
();
it
++
){
for
(
i
=
0
;
i
<
gr
->
tetrahedra
.
size
();
i
++
){
gr
=
*
it
;
interior
.
insert
(
gr
->
tetrahedra
[
i
]
->
getVertex
(
0
));
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
interior
.
insert
(
gr
->
tetrahedra
[
i
]
->
getVertex
(
1
));
element
=
gr
->
getMeshElement
(
i
);
interior
.
insert
(
gr
->
tetrahedra
[
i
]
->
getVertex
(
2
));
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
interior
.
insert
(
gr
->
tetrahedra
[
i
]
->
getVertex
(
3
));
vertex
=
element
->
getVertex
(
j
);
interior
.
insert
(
vertex
);
}
}
}
}
for
(
it
3
=
interior
.
begin
();
it
3
!=
interior
.
end
();
it
3
++
){
for
(
it
=
interior
.
begin
();
it
!=
interior
.
end
();
it
++
){
it2
=
boundary
.
find
(
*
it
3
);
it2
=
boundary
.
find
(
*
it
);
if
(
it2
==
boundary
.
end
()){
if
(
it2
==
boundary
.
end
()){
assembler
.
numberVertex
(
*
it
3
,
0
,
1
);
assembler
.
numberVertex
(
*
it
,
0
,
1
);
}
}
}
}
simpleFunction
<
double
>
ONE
(
1.0
);
simpleFunction
<
double
>
ONE
(
1.0
);
laplaceTerm
term
(
0
,
1
,
&
ONE
);
laplaceTerm
term
(
0
,
1
,
&
ONE
);
for
(
it
=
model
->
firstRegion
();
it
!=
model
->
lastRegion
();
it
++
){
for
(
i
=
0
;
i
<
gr
->
tetrahedra
.
size
();
i
++
){
gr
=
*
it
;
SElement
se
(
gr
->
tetrahedra
[
i
]);
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
term
.
addToMatrix
(
assembler
,
&
se
);
element
=
gr
->
getMeshElement
(
i
);
temp
=
(
MTetrahedron
*
)
element
;
SElement
se
(
temp
);
term
.
addToMatrix
(
assembler
,
&
se
);
}
}
}
system
->
systemSolve
();
system
->
systemSolve
();
for
(
it
3
=
interior
.
begin
();
it
3
!=
interior
.
end
();
it
3
++
){
for
(
it
=
interior
.
begin
();
it
!=
interior
.
end
();
it
++
){
assembler
.
getDofValue
(
*
it
3
,
0
,
1
,
val
);
assembler
.
getDofValue
(
*
it
,
0
,
1
,
val
);
boundary
.
insert
(
std
::
pair
<
MVertex
*
,
double
>
(
*
it
3
,
val
));
boundary
.
insert
(
std
::
pair
<
MVertex
*
,
double
>
(
*
it
,
val
));
}
}
delete
system
;
delete
system
;
#endif
#endif
}
}
double
Size_field
::
search
(
double
x
,
double
y
,
double
z
){
double
Size_field
::
search
(
double
x
,
double
y
,
double
z
){
...
@@ -591,11 +633,208 @@ void Size_field::print_field(){
...
@@ -591,11 +633,208 @@ void Size_field::print_field(){
printf
(
"%zu
\n
"
,
boundary
.
size
());
printf
(
"%zu
\n
"
,
boundary
.
size
());
}
}
GRegion
*
Size_field
::
test
(){
GRegion
*
gr
;
GModel
*
model
=
GModel
::
current
();
gr
=
*
(
model
->
firstRegion
());
return
gr
;
}
void
Size_field
::
clear
(){
void
Size_field
::
clear
(){
delete
octree
;
delete
octree
;
boundary
.
clear
();
boundary
.
clear
();
}
}
/****************class Nearest_point****************/
Nearest_point
::
Nearest_point
(){}
void
Nearest_point
::
init_region
(
GRegion
*
gr
){
#if defined(HAVE_ANN)
unsigned
int
i
;
int
j
;
int
gauss_num
;
double
u
,
v
;
double
x
,
y
,
z
;
double
x1
,
y1
,
z1
;
double
x2
,
y2
,
z2
;
double
x3
,
y3
,
z3
;
MElement
*
element
;
GFace
*
gf
;
std
::
list
<
GFace
*>
faces
;
std
::
set
<
MVertex
*>
vertices
;
std
::
list
<
GFace
*>::
iterator
it
;
std
::
set
<
MVertex
*>::
iterator
it2
;
fullMatrix
<
double
>
gauss_points
;
fullVector
<
double
>
gauss_weights
;
gaussIntegration
::
getTriangle
(
12
,
gauss_points
,
gauss_weights
);
gauss_num
=
gauss_points
.
size1
();
faces
=
gr
->
faces
();
random
.
clear
();
vertices
.
clear
();
for
(
it
=
faces
.
begin
();
it
!=
faces
.
end
();
it
++
){
gf
=
*
it
;
for
(
i
=
0
;
i
<
gf
->
getNumMeshElements
();
i
++
){
element
=
gf
->
getMeshElement
(
i
);
x1
=
element
->
getVertex
(
0
)
->
x
();
y1
=
element
->
getVertex
(
0
)
->
y
();
z1
=
element
->
getVertex
(
0
)
->
z
();
x2
=
element
->
getVertex
(
1
)
->
x
();
y2
=
element
->
getVertex
(
1
)
->
y
();
z2
=
element
->
getVertex
(
1
)
->
z
();
x3
=
element
->
getVertex
(
2
)
->
x
();
y3
=
element
->
getVertex
(
2
)
->
y
();
z3
=
element
->
getVertex
(
2
)
->
z
();
for
(
j
=
0
;
j
<
gauss_num
;
j
++
){
u
=
gauss_points
(
j
,
0
);
v
=
gauss_points
(
j
,
1
);
x
=
T
(
u
,
v
,
x1
,
x2
,
x3
);
y
=
T
(
u
,
v
,
y1
,
y2
,
y3
);
z
=
T
(
u
,
v
,
z1
,
z2
,
z3
);
random
.
push_back
(
SPoint3
(
x
,
y
,
z
));
}
vertices
.
insert
(
element
->
getVertex
(
0
));
vertices
.
insert
(
element
->
getVertex
(
1
));
vertices
.
insert
(
element
->
getVertex
(
2
));
}
}
for
(
it2
=
vertices
.
begin
();
it2
!=
vertices
.
end
();
it2
++
){
x
=
(
*
it2
)
->
x
();
y
=
(
*
it2
)
->
y
();
z
=
(
*
it2
)
->
z
();
random
.
push_back
(
SPoint3
(
x
,
y
,
z
));
}
duplicate
=
annAllocPts
(
random
.
size
(),
3
);
for
(
i
=
0
;
i
<
random
.
size
();
i
++
){
duplicate
[
i
][
0
]
=
random
[
i
].
x
();
duplicate
[
i
][
1
]
=
random
[
i
].
y
();
duplicate
[
i
][
2
]
=
random
[
i
].
z
();
}
kd_tree
=
new
ANNkd_tree
(
duplicate
,
random
.
size
(),
3
);
#endif
}
bool
Nearest_point
::
search
(
double
x
,
double
y
,
double
z
,
SVector3
&
vec
){
int
index
;
bool
val
;
#if defined(HAVE_ANN)
double
e
;
double
e2
;
SPoint3
point
;
ANNpoint
query
;
ANNidxArray
indices
;
ANNdistArray
distances
;
query
=
annAllocPt
(
3
);
query
[
0
]
=
x
;
query
[
1
]
=
y
;
query
[
2
]
=
z
;
indices
=
new
ANNidx
[
1
];
distances
=
new
ANNdist
[
1
];
e
=
0.0
;
kd_tree
->
annkSearch
(
query
,
1
,
indices
,
distances
,
e
);
index
=
indices
[
0
];
annDeallocPt
(
query
);
delete
[]
indices
;
delete
[]
distances
;
e2
=
0.000001
;
point
=
random
[
index
];
if
(
fabs
(
point
.
x
()
-
x
)
>
e2
||
fabs
(
point
.
y
()
-
y
)
>
e2
||
fabs
(
point
.
z
()
-
z
)
>
e2
){
vec
=
SVector3
(
point
.
x
()
-
x
,
point
.
y
()
-
y
,
point
.
z
()
-
z
);
vec
.
normalize
();
val
=
1
;
}
else
{
vec
=
SVector3
(
1.0
,
0.0
,
0.0
);
val
=
0
;
}
#endif
return
val
;
}
double
Nearest_point
::
T
(
double
u
,
double
v
,
double
val1
,
double
val2
,
double
val3
){
return
(
1.0
-
u
-
v
)
*
val1
+
u
*
val2
+
v
*
val3
;
}
void
Nearest_point
::
print_field
(
GRegion
*
gr
){
unsigned
int
i
;
int
j
;
bool
val
;
double
k
;
double
x
,
y
,
z
;
MElement
*
element
;
MVertex
*
vertex
;
SVector3
vec
;
k
=
0.05
;
std
::
ofstream
file
(
"nearest.pos"
);
file
<<
"View
\"
test
\"
{
\n
"
;
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
element
=
gr
->
getMeshElement
(
i
);
for
(
j
=
0
;
j
<
element
->
getNumVertices
();
j
++
){
vertex
=
element
->
getVertex
(
j
);
x
=
vertex
->
x
();
y
=
vertex
->
y
();
z
=
vertex
->
z
();
val
=
search
(
x
,
y
,
z
,
vec
);
if
(
val
){
print_segment
(
SPoint3
(
x
+
k
*
vec
.
x
(),
y
+
k
*
vec
.
y
(),
z
+
k
*
vec
.
z
()),
SPoint3
(
x
-
k
*
vec
.
x
(),
y
-
k
*
vec
.
y
(),
z
-
k
*
vec
.
z
()),
file
);
}
}
}
file
<<
"};
\n
"
;
}
void
Nearest_point
::
print_segment
(
SPoint3
p1
,
SPoint3
p2
,
std
::
ofstream
&
file
){
file
<<
"SL ("
<<
p1
.
x
()
<<
", "
<<
p1
.
y
()
<<
", "
<<
p1
.
z
()
<<
", "
<<
p2
.
x
()
<<
", "
<<
p2
.
y
()
<<
", "
<<
p2
.
z
()
<<
")"
<<
"{10, 20};
\n
"
;
}
GRegion
*
Nearest_point
::
test
(){
GRegion
*
gr
;
GModel
*
model
=
GModel
::
current
();
gr
=
*
(
model
->
firstRegion
());
return
gr
;
}
void
Nearest_point
::
clear
(){
random
.
clear
();
#if defined(HAVE_ANN)
delete
duplicate
;
delete
kd_tree
;
annClose
();
#endif
}
/****************static declarations****************/
/****************static declarations****************/
std
::
map
<
MVertex
*
,
Matrix
>
Frame_field
::
field
;
std
::
map
<
MVertex
*
,
Matrix
>
Frame_field
::
field
;
...
@@ -604,5 +843,12 @@ std::vector<std::pair<MVertex*,Matrix> > Frame_field::random;
...
@@ -604,5 +843,12 @@ std::vector<std::pair<MVertex*,Matrix> > Frame_field::random;
ANNpointArray
Frame_field
::
duplicate
;
ANNpointArray
Frame_field
::
duplicate
;
ANNkd_tree
*
Frame_field
::
kd_tree
;
ANNkd_tree
*
Frame_field
::
kd_tree
;
#endif
#endif
std
::
map
<
MVertex
*
,
double
>
Size_field
::
boundary
;
std
::
map
<
MVertex
*
,
double
>
Size_field
::
boundary
;
MElementOctree
*
Size_field
::
octree
;
MElementOctree
*
Size_field
::
octree
;
\ No newline at end of file
std
::
vector
<
SPoint3
>
Nearest_point
::
random
;
#if defined(HAVE_ANN)
ANNpointArray
Nearest_point
::
duplicate
;
ANNkd_tree
*
Nearest_point
::
kd_tree
;
#endif
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Mesh/directions3D.h
+
25
−
4
View file @
edefb427
...
@@ -48,15 +48,17 @@ class Frame_field{
...
@@ -48,15 +48,17 @@ class Frame_field{
#endif
#endif
Frame_field
();
Frame_field
();
public:
public:
static
void
init_
model
(
);
static
void
init_
region
(
GRegion
*
);
static
void
init_face
(
GFace
*
);
static
void
init_face
(
GFace
*
);
static
bool
translate
(
GFace
*
,
MElementOctree
*
,
MVertex
*
,
SPoint2
,
SVector3
&
,
SVector3
&
);
static
bool
translate
(
GFace
*
,
MElementOctree
*
,
MVertex
*
,
SPoint2
,
SVector3
&
,
SVector3
&
);
static
Matrix
search
(
double
,
double
,
double
);
static
Matrix
search
(
double
,
double
,
double
);
static
Matrix
combine
(
double
,
double
,
double
);
static
bool
inside_domain
(
MElementOctree
*
,
double
,
double
);
static
bool
inside_domain
(
MElementOctree
*
,
double
,
double
);
static
double
get_ratio
(
GFace
*
,
SPoint2
);
static
double
get_ratio
(
GFace
*
,
SPoint2
);
static
void
print_field1
();
static
void
print_field1
();
static
void
print_field2
();
static
void
print_field2
(
GRegion
*
);
static
void
print_segment
(
SPoint3
,
SPoint3
,
std
::
ofstream
&
);
static
void
print_segment
(
SPoint3
,
SPoint3
,
std
::
ofstream
&
);
static
GRegion
*
test
();
static
void
clear
();
static
void
clear
();
};
};
...
@@ -66,10 +68,29 @@ class Size_field{
...
@@ -66,10 +68,29 @@ class Size_field{
static
MElementOctree
*
octree
;
static
MElementOctree
*
octree
;
Size_field
();
Size_field
();
public:
public:
static
void
init_
model
(
);
static
void
init_
region
(
GRegion
*
);
static
void
solve
();
static
void
solve
(
GRegion
*
);
static
double
search
(
double
,
double
,
double
);
static
double
search
(
double
,
double
,
double
);
static
double
get_ratio
(
GFace
*
,
SPoint2
);
static
double
get_ratio
(
GFace
*
,
SPoint2
);
static
void
print_field
();
static
void
print_field
();
static
GRegion
*
test
();
static
void
clear
();
static
void
clear
();
};
};
class
Nearest_point
{
private:
static
std
::
vector
<
SPoint3
>
random
;
#if defined(HAVE_ANN)
static
ANNpointArray
duplicate
;
static
ANNkd_tree
*
kd_tree
;
#endif
Nearest_point
();
public:
static
void
init_region
(
GRegion
*
);
static
bool
search
(
double
,
double
,
double
,
SVector3
&
);
static
double
T
(
double
,
double
,
double
,
double
,
double
);
static
void
print_field
(
GRegion
*
);
static
void
print_segment
(
SPoint3
,
SPoint3
,
std
::
ofstream
&
);
static
GRegion
*
test
();
static
void
clear
();
};
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Mesh/simple3D.cpp
+
3
−
3
View file @
edefb427
...
@@ -324,7 +324,7 @@ void Filler::treat_model(){
...
@@ -324,7 +324,7 @@ void Filler::treat_model(){
}
}
void
Filler
::
treat_region
(
GRegion
*
gr
){
void
Filler
::
treat_region
(
GRegion
*
gr
){
#if defined(HAVE_RTREE)
#if defined(HAVE_RTREE)
unsigned
int
i
;
unsigned
int
i
;
int
j
;
int
j
;
int
count
;
int
count
;
...
@@ -345,7 +345,7 @@ void Filler::treat_region(GRegion* gr){
...
@@ -345,7 +345,7 @@ void Filler::treat_region(GRegion* gr){
std
::
set
<
MVertex
*>::
iterator
it
;
std
::
set
<
MVertex
*>::
iterator
it
;
RTree
<
Node
*
,
double
,
3
,
double
>
rtree
;
RTree
<
Node
*
,
double
,
3
,
double
>
rtree
;
Frame_field
::
init_
model
(
);
Frame_field
::
init_
region
(
gr
);
octree
=
new
MElementOctree
(
gr
->
model
());
octree
=
new
MElementOctree
(
gr
->
model
());
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
for
(
i
=
0
;
i
<
gr
->
getNumMeshElements
();
i
++
){
...
@@ -436,7 +436,7 @@ void Filler::treat_region(GRegion* gr){
...
@@ -436,7 +436,7 @@ void Filler::treat_region(GRegion* gr){
for
(
i
=
0
;
i
<
new_vertices
.
size
();
i
++
)
delete
new_vertices
[
i
];
for
(
i
=
0
;
i
<
new_vertices
.
size
();
i
++
)
delete
new_vertices
[
i
];
new_vertices
.
clear
();
new_vertices
.
clear
();
Frame_field
::
clear
();
Frame_field
::
clear
();
#endif
#endif
}
}
Metric
Filler
::
get_metric
(
double
x
,
double
y
,
double
z
){
Metric
Filler
::
get_metric
(
double
x
,
double
y
,
double
z
){
...
...
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