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
5013e86e
Commit
5013e86e
authored
10 years ago
by
Christophe Geuzaine
Browse files
Options
Downloads
Patches
Plain Diff
merged Debian alauzet.patch
parent
c20b48dd
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
Geo/STensor3.cpp
+21
-0
21 additions, 0 deletions
Geo/STensor3.cpp
Geo/STensor3.h
+2
-0
2 additions, 0 deletions
Geo/STensor3.h
Mesh/Field.cpp
+150
-5
150 additions, 5 deletions
Mesh/Field.cpp
with
173 additions
and
5 deletions
Geo/STensor3.cpp
+
21
−
0
View file @
5013e86e
...
@@ -48,6 +48,27 @@ SMetric3 intersection (const SMetric3 &m1, const SMetric3 &m2)
...
@@ -48,6 +48,27 @@ SMetric3 intersection (const SMetric3 &m1, const SMetric3 &m2)
return
iv
;
return
iv
;
}
}
SMetric3
intersection_alauzet
(
const
SMetric3
&
m1
,
const
SMetric3
&
m2
)
{
SMetric3
im1
=
m1
.
invert
();
fullMatrix
<
double
>
V
(
3
,
3
);
fullVector
<
double
>
S
(
3
);
im1
*=
m2
;
im1
.
eig
(
V
,
S
,
true
);
SVector3
v0
(
V
(
0
,
0
),
V
(
1
,
0
),
V
(
2
,
0
));
SVector3
v1
(
V
(
0
,
1
),
V
(
1
,
1
),
V
(
2
,
1
));
SVector3
v2
(
V
(
0
,
2
),
V
(
1
,
2
),
V
(
2
,
2
));
// is this required??
v0
.
normalize
();
v1
.
normalize
();
v2
.
normalize
();
double
l0
=
std
::
max
(
dot
(
v0
,
m1
,
v0
),
dot
(
v0
,
m2
,
v0
));
double
l1
=
std
::
max
(
dot
(
v1
,
m1
,
v1
),
dot
(
v1
,
m2
,
v1
));
double
l2
=
std
::
max
(
dot
(
v2
,
m1
,
v2
),
dot
(
v2
,
m2
,
v2
));
SMetric3
iv
(
l0
,
l1
,
l2
,
v0
,
v1
,
v2
);
return
iv
;
}
// preserve orientation of m1 !!!
// preserve orientation of m1 !!!
SMetric3
intersection_conserveM1
(
const
SMetric3
&
m1
,
const
SMetric3
&
m2
)
SMetric3
intersection_conserveM1
(
const
SMetric3
&
m1
,
const
SMetric3
&
m2
)
{
{
...
...
This diff is collapsed.
Click to expand it.
Geo/STensor3.h
+
2
−
0
View file @
5013e86e
...
@@ -173,6 +173,8 @@ SMetric3 intersection_conserve_mostaniso_2d (const SMetric3 &m1, const SMetric3
...
@@ -173,6 +173,8 @@ SMetric3 intersection_conserve_mostaniso_2d (const SMetric3 &m1, const SMetric3
// compute the largest inscribed ellipsoid...
// compute the largest inscribed ellipsoid...
SMetric3
intersection
(
const
SMetric3
&
m1
,
SMetric3
intersection
(
const
SMetric3
&
m1
,
const
SMetric3
&
m2
);
const
SMetric3
&
m2
);
SMetric3
intersection_alauzet
(
const
SMetric3
&
m1
,
const
SMetric3
&
m2
);
SMetric3
interpolation
(
const
SMetric3
&
m1
,
SMetric3
interpolation
(
const
SMetric3
&
m1
,
const
SMetric3
&
m2
,
const
SMetric3
&
m2
,
const
double
t
);
const
double
t
);
...
...
This diff is collapsed.
Click to expand it.
Mesh/Field.cpp
+
150
−
5
View file @
5013e86e
...
@@ -485,6 +485,55 @@ class CylinderField : public Field
...
@@ -485,6 +485,55 @@ class CylinderField : public Field
}
}
};
};
class
SphereField
:
public
Field
{
double
v_in
,
v_out
;
double
xc
,
yc
,
zc
;
double
R
;
public:
std
::
string
getDescription
()
{
return
"The value of this field is VIn inside a sphere, VOut outside. "
"The sphere is given by
\n\n
"
" ||dX||^2 < R^2 &&
\n
"
" dX = (X - XC)^2 + (Y-YC)^2 + (Z-ZC)^2"
;
}
SphereField
()
{
v_in
=
v_out
=
xc
=
yc
=
zc
=
R
=
0
;
options
[
"VIn"
]
=
new
FieldOptionDouble
(
v_in
,
"Value inside the sphere"
);
options
[
"VOut"
]
=
new
FieldOptionDouble
(
v_out
,
"Value outside the sphere"
);
options
[
"XCenter"
]
=
new
FieldOptionDouble
(
xc
,
"X coordinate of the sphere center"
);
options
[
"YCenter"
]
=
new
FieldOptionDouble
(
yc
,
"Y coordinate of the sphere center"
);
options
[
"ZCenter"
]
=
new
FieldOptionDouble
(
zc
,
"Z coordinate of the sphere center"
);
options
[
"Radius"
]
=
new
FieldOptionDouble
(
R
,
"Radius"
);
}
const
char
*
getName
()
{
return
"Sphere"
;
}
double
operator
()
(
double
x
,
double
y
,
double
z
,
GEntity
*
ge
=
0
)
{
double
dx
=
x
-
xc
;
double
dy
=
y
-
yc
;
double
dz
=
z
-
zc
;
return
(
(
dx
*
dx
+
dy
*
dy
+
dz
*
dz
<
R
*
R
)
)
?
v_in
:
v_out
;
}
};
class
FrustumField
:
public
Field
class
FrustumField
:
public
Field
{
{
double
x1
,
y1
,
z1
;
double
x1
,
y1
,
z1
;
...
@@ -1026,15 +1075,17 @@ class MathEvalField : public Field
...
@@ -1026,15 +1075,17 @@ class MathEvalField : public Field
std
::
string
f
;
std
::
string
f
;
public:
public:
void
myAction
(){
void
myAction
()
printf
(
"doing sthg
\n
"
);
{
printf
(
"doing sthg
\n
"
);
}
}
MathEvalField
()
MathEvalField
()
{
{
options
[
"F"
]
=
new
FieldOptionString
options
[
"F"
]
=
new
FieldOptionString
(
f
,
"Mathematical function to evaluate."
,
&
update_needed
);
(
f
,
"Mathematical function to evaluate."
,
&
update_needed
);
f
=
"F2 + Sin(z)"
;
f
=
"F2 + Sin(z)"
;
callbacks
[
"test"
]
=
new
FieldCallbackGeneric
<
MathEvalField
>
(
this
,
&
MathEvalField
::
myAction
,
"description blabla"
);
callbacks
[
"test"
]
=
new
FieldCallbackGeneric
<
MathEvalField
>
(
this
,
&
MathEvalField
::
myAction
,
"description blabla"
);
}
}
double
operator
()
(
double
x
,
double
y
,
double
z
,
GEntity
*
ge
=
0
)
double
operator
()
(
double
x
,
double
y
,
double
z
,
GEntity
*
ge
=
0
)
{
{
...
@@ -1337,6 +1388,76 @@ class MinAnisoField : public Field
...
@@ -1337,6 +1388,76 @@ class MinAnisoField : public Field
}
}
};
};
class
IntersectAnisoField
:
public
Field
{
std
::
list
<
int
>
idlist
;
public:
IntersectAnisoField
()
{
options
[
"FieldsList"
]
=
new
FieldOptionList
(
idlist
,
"Field indices"
,
&
update_needed
);
}
virtual
bool
isotropic
()
const
{
return
false
;}
std
::
string
getDescription
()
{
return
"Take the intersection of 2 anisotropic fields according to Alauzet."
;
}
virtual
void
operator
()
(
double
x
,
double
y
,
double
z
,
SMetric3
&
metr
,
GEntity
*
ge
=
0
)
{
// check if idlist contains 2 elements other error message
SMetric3
v
;
for
(
std
::
list
<
int
>::
iterator
it
=
idlist
.
begin
();
it
!=
idlist
.
end
();
it
++
)
{
Field
*
f
=
(
GModel
::
current
()
->
getFields
()
->
get
(
*
it
));
SMetric3
ff
;
if
(
f
&&
*
it
!=
id
)
{
if
(
f
->
isotropic
()){
double
l
=
(
*
f
)
(
x
,
y
,
z
,
ge
);
ff
=
SMetric3
(
1.
/
(
l
*
l
));
}
else
{
(
*
f
)
(
x
,
y
,
z
,
ff
,
ge
);
}
if
(
it
==
idlist
.
begin
())
v
=
ff
;
else
v
=
intersection_alauzet
(
v
,
ff
);
}
}
metr
=
v
;
}
double
operator
()
(
double
x
,
double
y
,
double
z
,
GEntity
*
ge
=
0
)
{
// check if idlist contains 2 elements other error message
SMetric3
metr
;
for
(
std
::
list
<
int
>::
iterator
it
=
idlist
.
begin
();
it
!=
idlist
.
end
();
it
++
)
{
Field
*
f
=
(
GModel
::
current
()
->
getFields
()
->
get
(
*
it
));
SMetric3
m
;
if
(
f
&&
*
it
!=
id
){
if
(
!
f
->
isotropic
()){
(
*
f
)(
x
,
y
,
z
,
m
,
ge
);
}
else
{
double
L
=
(
*
f
)(
x
,
y
,
z
,
ge
);
for
(
int
i
=
0
;
i
<
3
;
i
++
)
m
(
i
,
i
)
=
1.
/
(
L
*
L
);
}
}
if
(
it
==
idlist
.
begin
())
metr
=
m
;
else
metr
=
intersection_alauzet
(
metr
,
m
);
}
fullMatrix
<
double
>
V
(
3
,
3
);
fullVector
<
double
>
S
(
3
);
metr
.
eig
(
V
,
S
,
1
);
return
sqrt
(
1.
/
S
(
2
));
//S(2) is largest eigenvalue
}
const
char
*
getName
()
{
return
"IntersectAniso"
;
}
};
class
MinField
:
public
Field
class
MinField
:
public
Field
{
{
std
::
list
<
int
>
idlist
;
std
::
list
<
int
>
idlist
;
...
@@ -1355,7 +1476,18 @@ class MinField : public Field
...
@@ -1355,7 +1476,18 @@ class MinField : public Field
double
v
=
MAX_LC
;
double
v
=
MAX_LC
;
for
(
std
::
list
<
int
>::
iterator
it
=
idlist
.
begin
();
it
!=
idlist
.
end
();
it
++
)
{
for
(
std
::
list
<
int
>::
iterator
it
=
idlist
.
begin
();
it
!=
idlist
.
end
();
it
++
)
{
Field
*
f
=
(
GModel
::
current
()
->
getFields
()
->
get
(
*
it
));
Field
*
f
=
(
GModel
::
current
()
->
getFields
()
->
get
(
*
it
));
if
(
f
&&
*
it
!=
id
)
v
=
std
::
min
(
v
,
(
*
f
)
(
x
,
y
,
z
,
ge
));
if
(
f
&&
*
it
!=
id
)
{
if
(
f
->
isotropic
())
v
=
std
::
min
(
v
,
(
*
f
)
(
x
,
y
,
z
,
ge
));
else
{
SMetric3
ff
;
(
*
f
)
(
x
,
y
,
z
,
ff
,
ge
);
fullMatrix
<
double
>
V
(
3
,
3
);
fullVector
<
double
>
S
(
3
);
ff
.
eig
(
V
,
S
,
1
);
v
=
std
::
min
(
v
,
sqrt
(
1.
/
S
(
2
)));
//S(2) is largest eigenvalue
}
}
}
}
return
v
;
return
v
;
}
}
...
@@ -1383,7 +1515,18 @@ class MaxField : public Field
...
@@ -1383,7 +1515,18 @@ class MaxField : public Field
double
v
=
-
MAX_LC
;
double
v
=
-
MAX_LC
;
for
(
std
::
list
<
int
>::
iterator
it
=
idlist
.
begin
();
it
!=
idlist
.
end
();
it
++
)
{
for
(
std
::
list
<
int
>::
iterator
it
=
idlist
.
begin
();
it
!=
idlist
.
end
();
it
++
)
{
Field
*
f
=
(
GModel
::
current
()
->
getFields
()
->
get
(
*
it
));
Field
*
f
=
(
GModel
::
current
()
->
getFields
()
->
get
(
*
it
));
if
(
f
&&
*
it
!=
id
)
v
=
std
::
max
(
v
,
(
*
f
)
(
x
,
y
,
z
,
ge
));
if
(
f
&&
*
it
!=
id
)
{
if
(
f
->
isotropic
())
v
=
std
::
max
(
v
,
(
*
f
)
(
x
,
y
,
z
,
ge
));
else
{
SMetric3
ff
;
(
*
f
)
(
x
,
y
,
z
,
ff
,
ge
);
fullMatrix
<
double
>
V
(
3
,
3
);
fullVector
<
double
>
S
(
3
);
ff
.
eig
(
V
,
S
,
1
);
v
=
std
::
max
(
v
,
sqrt
(
1.
/
S
(
0
)));
//S(0) is smallest eigenvalue
}
}
}
}
return
v
;
return
v
;
}
}
...
@@ -2157,6 +2300,7 @@ FieldManager::FieldManager()
...
@@ -2157,6 +2300,7 @@ FieldManager::FieldManager()
#endif
#endif
map_type_name
[
"Box"
]
=
new
FieldFactoryT
<
BoxField
>
();
map_type_name
[
"Box"
]
=
new
FieldFactoryT
<
BoxField
>
();
map_type_name
[
"Cylinder"
]
=
new
FieldFactoryT
<
CylinderField
>
();
map_type_name
[
"Cylinder"
]
=
new
FieldFactoryT
<
CylinderField
>
();
map_type_name
[
"Sphere"
]
=
new
FieldFactoryT
<
SphereField
>
();
map_type_name
[
"Frustum"
]
=
new
FieldFactoryT
<
FrustumField
>
();
map_type_name
[
"Frustum"
]
=
new
FieldFactoryT
<
FrustumField
>
();
map_type_name
[
"LonLat"
]
=
new
FieldFactoryT
<
LonLatField
>
();
map_type_name
[
"LonLat"
]
=
new
FieldFactoryT
<
LonLatField
>
();
#if defined(HAVE_POST)
#if defined(HAVE_POST)
...
@@ -2166,6 +2310,7 @@ FieldManager::FieldManager()
...
@@ -2166,6 +2310,7 @@ FieldManager::FieldManager()
map_type_name
[
"Restrict"
]
=
new
FieldFactoryT
<
RestrictField
>
();
map_type_name
[
"Restrict"
]
=
new
FieldFactoryT
<
RestrictField
>
();
map_type_name
[
"Min"
]
=
new
FieldFactoryT
<
MinField
>
();
map_type_name
[
"Min"
]
=
new
FieldFactoryT
<
MinField
>
();
map_type_name
[
"MinAniso"
]
=
new
FieldFactoryT
<
MinAnisoField
>
();
map_type_name
[
"MinAniso"
]
=
new
FieldFactoryT
<
MinAnisoField
>
();
map_type_name
[
"IntersectAniso"
]
=
new
FieldFactoryT
<
IntersectAnisoField
>
();
map_type_name
[
"Max"
]
=
new
FieldFactoryT
<
MaxField
>
();
map_type_name
[
"Max"
]
=
new
FieldFactoryT
<
MaxField
>
();
map_type_name
[
"Laplacian"
]
=
new
FieldFactoryT
<
LaplacianField
>
();
map_type_name
[
"Laplacian"
]
=
new
FieldFactoryT
<
LaplacianField
>
();
map_type_name
[
"Mean"
]
=
new
FieldFactoryT
<
MeanField
>
();
map_type_name
[
"Mean"
]
=
new
FieldFactoryT
<
MeanField
>
();
...
...
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