Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
iwr
amdis
Commits
715117bf
Commit
715117bf
authored
Nov 13, 2009
by
Thomas Witkowski
Browse files
Removed several static functions from DOFVector.
parent
8f9734f5
Changes
2
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/DOFVector.h
View file @
715117bf
...
...
@@ -562,22 +562,6 @@ namespace AMDiS {
DOFVector
<
WorldVector
<
T
>
>*
getRecoveryGradient
(
DOFVector
<
WorldVector
<
T
>
>*
)
const
;
protected:
/// Used by Int while mesh traversal
static
int
Int_fct
(
ElInfo
*
elinfo
);
/// Used by L1Norm while mesh traversal
static
int
L1Norm_fct
(
ElInfo
*
elinfo
);
/// Used by L2Norm while mesh traversal
static
int
L2Norm_fct
(
ElInfo
*
elinfo
);
/// Used by H1Norm while mesh traversal
static
int
H1Norm_fct
(
ElInfo
*
elinfo
);
/// Used by DoubleWell while mesh traversal
static
int
DoubleWell_fct
(
ElInfo
*
elinfo
);
protected:
/// Data container
std
::
vector
<
T
>
vec
;
...
...
@@ -590,13 +574,6 @@ namespace AMDiS {
/// Used for mesh traversal
static
DOFVector
<
T
>
*
traverseVector
;
protected:
/// Used while calculating vector norms
static
FastQuadrature
*
quad_fast
;
/// Stores the last calculated vector norm
static
double
norm
;
};
...
...
AMDiS/src/DOFVector.hh
View file @
715117bf
...
...
@@ -138,12 +138,6 @@ namespace AMDiS {
template
<
typename
T
>
DOFVector
<
T
>
*
DOFVector
<
T
>::
traverseVector
=
NULL
;
template
<
typename
T
>
FastQuadrature
*
DOFVector
<
T
>::
quad_fast
=
NULL
;
template
<
typename
T
>
double
DOFVector
<
T
>::
norm
=
0.0
;
template
<
typename
T
>
void
DOFVectorBase
<
T
>::
addElementVector
(
T
factor
,
const
ElementVector
&
elVec
,
...
...
@@ -455,29 +449,28 @@ namespace AMDiS {
q
=
Quadrature
::
provideQuadrature
(
this
->
dim
,
deg
);
}
quad
_f
ast
=
FastQuadrature
*
quad
F
ast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
norm
=
0.0
;
traverseVector
=
const_cast
<
DOFVector
<
T
>*>
(
this
);
mesh
->
traverse
(
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
,
Int_fct
);
return
norm
;
}
template
<
typename
T
>
int
DOFVector
<
T
>::
Int_fct
(
ElInfo
*
elinfo
)
{
double
det
=
elinfo
->
getDet
();
const
T
*
uh_vec
=
traverseVector
->
getVecAtQPs
(
elinfo
,
NULL
,
quad_fast
,
NULL
);
int
numPoints
=
quad_fast
->
getNumPoints
();
double
normT
=
0.0
;
for
(
int
iq
=
0
;
iq
<
numPoints
;
iq
++
)
normT
+=
quad_fast
->
getWeight
(
iq
)
*
(
uh_vec
[
iq
]);
double
result
=
0.0
;
int
nPoints
=
quadFast
->
getNumPoints
();
std
::
vector
<
T
>
uh_vec
(
this
->
feSpace
->
getBasisFcts
()
->
getNumber
());
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
);
while
(
elInfo
)
{
double
det
=
elInfo
->
getDet
();
double
normT
=
0.0
;
this
->
getVecAtQPs
(
elInfo
,
NULL
,
quadFast
,
&
(
uh_vec
[
0
]));
for
(
int
iq
=
0
;
iq
<
nPoints
;
iq
++
)
normT
+=
quadFast
->
getWeight
(
iq
)
*
(
uh_vec
[
iq
]);
result
+=
det
*
normT
;
norm
+=
det
*
normT
;
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
return
0
;
return
result
;
}
template
<
typename
T
>
...
...
@@ -485,122 +478,114 @@ namespace AMDiS {
{
FUNCNAME
(
"DOFVector::L1Norm()"
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
if
(
!
q
)
{
int
deg
=
2
*
this
->
feSpace
->
getBasisFcts
()
->
getDegree
();
q
=
Quadrature
::
provideQuadrature
(
this
->
dim
,
deg
);
}
quad_fast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
norm
=
0.0
;
traverseVector
=
const_cast
<
DOFVector
<
T
>*>
(
this
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
mesh
->
traverse
(
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
,
L1Norm_fct
);
return
norm
;
}
template
<
typename
T
>
int
DOFVector
<
T
>::
L1Norm_fct
(
ElInfo
*
elinfo
)
{
double
det
=
elinfo
->
getDet
();
const
T
*
uh_vec
=
traverseVector
->
getVecAtQPs
(
elinfo
,
NULL
,
quad_fast
,
NULL
);
int
numPoints
=
quad_fast
->
getNumPoints
();
double
normT
=
0.0
;
FastQuadrature
*
quadFast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
for
(
int
iq
=
0
;
iq
<
numPoints
;
iq
++
)
normT
+=
quad_fast
->
getWeight
(
iq
)
*
abs
(
uh_vec
[
iq
]);
double
result
=
0.0
;
int
nPoints
=
quadFast
->
getNumPoints
();
std
::
vector
<
T
>
uh_vec
(
this
->
feSpace
->
getBasisFcts
()
->
getNumber
());
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
);
while
(
elInfo
)
{
double
det
=
elInfo
->
getDet
();
double
normT
=
0.0
;
this
->
getVecAtQPs
(
elInfo
,
NULL
,
quadFast
,
&
(
uh_vec
[
0
]));
for
(
int
iq
=
0
;
iq
<
nPoints
;
iq
++
)
normT
+=
quadFast
->
getWeight
(
iq
)
*
abs
(
uh_vec
[
iq
]);
result
+=
det
*
normT
;
norm
+=
det
*
normT
;
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
return
0
;
return
result
;
}
template
<
typename
T
>
double
DOFVector
<
T
>::
L2NormSquare
(
Quadrature
*
q
)
const
{
FUNCNAME
(
"DOFVector::L2NormSquare()"
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
if
(
!
q
)
{
int
deg
=
2
*
this
->
feSpace
->
getBasisFcts
()
->
getDegree
();
q
=
Quadrature
::
provideQuadrature
(
this
->
dim
,
deg
);
}
quad_fast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
norm
=
0.0
;
traverseVector
=
const_cast
<
DOFVector
<
T
>*>
(
this
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
mesh
->
traverse
(
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
,
L2Norm_fct
);
return
norm
;
}
template
<
typename
T
>
int
DOFVector
<
T
>::
L2Norm_fct
(
ElInfo
*
elinfo
)
{
double
det
=
elinfo
->
getDet
();
const
T
*
uh_vec
=
traverseVector
->
getVecAtQPs
(
elinfo
,
NULL
,
quad_fast
,
NULL
);
int
numPoints
=
quad_fast
->
getNumPoints
();
double
normT
=
0.0
;
for
(
int
iq
=
0
;
iq
<
numPoints
;
iq
++
)
normT
+=
quad_fast
->
getWeight
(
iq
)
*
sqr
(
uh_vec
[
iq
]);
norm
+=
det
*
normT
;
FastQuadrature
*
quadFast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
return
0
;
}
double
result
=
0.0
;
int
nPoints
=
quadFast
->
getNumPoints
();
std
::
vector
<
T
>
uh_vec
(
this
->
feSpace
->
getBasisFcts
()
->
getNumber
());
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
);
while
(
elInfo
)
{
double
det
=
elInfo
->
getDet
();
double
normT
=
0.0
;
this
->
getVecAtQPs
(
elInfo
,
NULL
,
quadFast
,
&
(
uh_vec
[
0
]));
for
(
int
iq
=
0
;
iq
<
nPoints
;
iq
++
)
normT
+=
quadFast
->
getWeight
(
iq
)
*
sqr
(
uh_vec
[
iq
]);
result
+=
det
*
normT
;
template
<
typename
T
>
int
DOFVector
<
T
>::
H1Norm_fct
(
ElInfo
*
elinfo
)
{
double
det
=
elinfo
->
getDet
();
const
WorldVector
<
T
>
*
grduh_vec
=
traverseVector
->
getGrdAtQPs
(
elinfo
,
NULL
,
quad_fast
,
NULL
);
int
dimOfWorld
=
Global
::
getGeo
(
WORLD
);
int
numPoints
=
quad_fast
->
getNumPoints
();
double
normT
=
0.0
;
for
(
int
iq
=
0
;
iq
<
numPoints
;
iq
++
)
{
double
norm2
=
0.0
;
for
(
int
j
=
0
;
j
<
dimOfWorld
;
j
++
)
norm2
+=
sqr
(
grduh_vec
[
iq
][
j
]);
normT
+=
quad_fast
->
getWeight
(
iq
)
*
norm2
;
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
norm
+=
det
*
normT
;
return
0
;
return
result
;
}
template
<
typename
T
>
template
<
typename
T
>
double
DOFVector
<
T
>::
H1NormSquare
(
Quadrature
*
q
)
const
{
FUNCNAME
(
"DOFVector::H1NormSquare()"
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
if
(
!
q
)
{
int
deg
=
2
*
this
->
feSpace
->
getBasisFcts
()
->
getDegree
()
-
2
;
q
=
Quadrature
::
provideQuadrature
(
this
->
dim
,
deg
);
}
quad_fast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_GRD_PHI
);
FastQuadrature
*
quadFast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_GRD_PHI
);
double
result
=
0.0
;
int
nPoints
=
quadFast
->
getNumPoints
();
int
dimOfWorld
=
Global
::
getGeo
(
WORLD
);
std
::
vector
<
WorldVector
<
T
>
>
grduh_vec
(
this
->
feSpace
->
getBasisFcts
()
->
getNumber
());
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
|
Mesh
::
FILL_GRD_LAMBDA
);
while
(
elInfo
)
{
double
det
=
elInfo
->
getDet
();
double
normT
=
0.0
;
this
->
getGrdAtQPs
(
elInfo
,
NULL
,
quadFast
,
&
(
grduh_vec
[
0
]));
for
(
int
iq
=
0
;
iq
<
nPoints
;
iq
++
)
{
double
norm2
=
0.0
;
for
(
int
j
=
0
;
j
<
dimOfWorld
;
j
++
)
norm2
+=
sqr
(
grduh_vec
[
iq
][
j
]);
normT
+=
quadFast
->
getWeight
(
iq
)
*
norm2
;
}
norm
=
0.0
;
traverseVector
=
const_cast
<
DOFVector
<
T
>*>
(
this
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
result
+=
det
*
normT
;
mesh
->
traverse
(
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
|
Mesh
::
FILL_GRD_LAMBDA
,
H1Norm_fct
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
return
norm
;
return
result
;
}
template
<
typename
T
>
...
...
@@ -1081,35 +1066,35 @@ namespace AMDiS {
double
DOFVector
<
T
>::
DoubleWell
(
Quadrature
*
q
)
const
{
FUNCNAME
(
"DOFVector::DoubleWell()"
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
if
(
!
q
)
{
int
deg
=
2
*
this
->
feSpace
->
getBasisFcts
()
->
getDegree
();
q
=
Quadrature
::
provideQuadrature
(
this
->
dim
,
deg
);
}
quad_fast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
norm
=
0.0
;
traverseVector
=
const_cast
<
DOFVector
<
T
>*>
(
this
);
Mesh
*
mesh
=
this
->
feSpace
->
getMesh
();
mesh
->
traverse
(
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
,
DoubleWell_fct
);
FastQuadrature
*
quadFast
=
FastQuadrature
::
provideFastQuadrature
(
this
->
feSpace
->
getBasisFcts
(),
*
q
,
INIT_PHI
);
double
result
=
0.0
;
int
nPoints
=
quadFast
->
getNumPoints
();
std
::
vector
<
T
>
uh_vec
(
this
->
feSpace
->
getBasisFcts
()
->
getNumber
());
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
|
Mesh
::
FILL_COORDS
|
Mesh
::
FILL_DET
);
while
(
elInfo
)
{
double
det
=
elInfo
->
getDet
();
double
normT
=
0.0
;
this
->
getVecAtQPs
(
elInfo
,
NULL
,
quadFast
,
&
(
uh_vec
[
0
]));
for
(
int
iq
=
0
;
iq
<
nPoints
;
iq
++
)
normT
+=
quadFast
->
getWeight
(
iq
)
*
sqr
(
uh_vec
[
iq
])
*
sqr
(
1.0
-
uh_vec
[
iq
]);
result
+=
det
*
normT
;
return
norm
;
}
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
template
<
typename
T
>
int
DOFVector
<
T
>::
DoubleWell_fct
(
ElInfo
*
elinfo
)
{
const
T
*
uh_vec
=
traverseVector
->
getVecAtQPs
(
elinfo
,
NULL
,
quad_fast
,
NULL
);
int
nPoints
=
quad_fast
->
getNumPoints
();
double
normT
=
0.0
;
for
(
int
iq
=
0
;
iq
<
nPoints
;
iq
++
)
normT
+=
quad_fast
->
getWeight
(
iq
)
*
sqr
(
uh_vec
[
iq
])
*
sqr
(
1.0
-
uh_vec
[
iq
]);
norm
+=
elinfo
->
getDet
()
*
normT
;
return
0
;
return
result
;
}
}
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment