Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Backofen, Rainer
amdis
Commits
7854212b
Commit
7854212b
authored
Oct 01, 2008
by
Thomas Witkowski
Browse files
* Further development of SolutionDataStorage
parent
929d4333
Changes
4
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/FiniteElemSpace.h
View file @
7854212b
...
...
@@ -76,28 +76,28 @@ namespace AMDiS {
*/
inline
std
::
string
getName
()
const
{
return
name
;
}
;
}
/** \brief
* Returns \ref admin
*/
inline
DOFAdmin
*
getAdmin
()
const
{
return
admin
;
}
;
}
/** \brief
* Returns \ref basFcts
*/
inline
const
BasisFunction
*
getBasisFcts
()
const
{
return
basFcts
;
}
;
}
/** \brief
* Returns \ref mesh
*/
inline
Mesh
*
getMesh
()
const
{
return
mesh
;
}
;
}
protected:
/** \brief
...
...
@@ -107,7 +107,7 @@ namespace AMDiS {
FiniteElemSpace
(
DOFAdmin
*
admin_
,
const
BasisFunction
*
basisFcts
,
Mesh
*
mesh
,
const
std
::
string
&
name_
=
""
);
const
std
::
string
&
name_
=
""
);
protected:
/** \brief
...
...
AMDiS/src/SolutionDataStorage.h
View file @
7854212b
...
...
@@ -25,8 +25,14 @@ namespace AMDiS {
class
SolutionDataStorage
{
public:
/** \brief
*
*/
SolutionDataStorage
(
std
::
string
name
);
/** \brief
*
*/
~
SolutionDataStorage
();
/** \brief
...
...
@@ -35,17 +41,60 @@ namespace AMDiS {
void
setFixFESpace
(
typename
SolutionHelper
<
T
>::
type
feSpace
,
bool
cleanupFeSpace
=
false
);
/** \brief
*
*/
void
push
(
T
*
solution
,
double
timestamp
,
bool
cleanupSolution
=
true
);
/** \brief
*
*/
void
push
(
T
*
solution
,
double
timestamp
,
FiniteElemSpac
e
*
feSpace
=
NULL
,
typename
SolutionHelper
<
T
>::
typ
e
feSpace
,
bool
cleanupSolution
=
true
,
bool
cleanupFeSpace
=
true
);
bool
pop
(
T
*
solution
,
/** \brief
*
*/
bool
pop
(
T
**
solution
,
double
*
timestep
);
bool
pop
(
T
**
solution
,
double
*
timestep
,
FiniteElemSpace
*
feSpace
=
NULL
);
typename
SolutionHelper
<
T
>::
type
feSpace
);
/** \brief
* Returns for a given solution number the corresponding fe Space. If the
* the fe Space is fixed, the fe Space for all solutions is stored at
* position 0.
*/
typename
SolutionHelper
<
T
>::
type
getFeSpace
(
int
i
=
0
)
{
return
feSpaces
[
i
];
}
protected:
/** \brief
* Auxiliary function for deleting either a single fe space, or a
* vector of fe spaces.
*/
void
deleteFeSpace
(
FiniteElemSpace
*
feSpace
)
{
DELETE
feSpace
;
}
void
deleteFeSpace
(
std
::
vector
<
FiniteElemSpace
*>
feSpaces
)
{
for
(
int
i
=
0
;
i
<
static_cast
<
int
>
(
feSpaces
.
size
());
i
++
)
DELETE
feSpaces
[
i
];
feSpaces
.
empty
();
}
/** \brief
* Deletes all pointers and empties all internal vectors.
*/
void
cleanup
();
/** \brief
...
...
@@ -72,7 +121,7 @@ namespace AMDiS {
* Here, all the solutions (i.e. either DOFVectors or SystemVectors)
* are stored.
*/
std
::
vector
<
T
>
solutions
;
std
::
vector
<
T
*
>
solutions
;
/** \brief
* Stores to every solution its FE Space. If \ref fixedFESpace is set
...
...
AMDiS/src/SolutionDataStorage.hh
View file @
7854212b
...
...
@@ -44,9 +44,7 @@ namespace AMDiS {
template
<
typename
T
>
void
SolutionDataStorage
<
T
>::
push
(
T
*
solution
,
double
timestamp
,
FiniteElemSpace
*
feSpace
,
bool
cleanupSolution
,
bool
cleanupFeSpace
)
bool
cleanupSolution
)
{
// If pop was the last operation, cleanup and reset the data storage.
if
(
poped
)
{
...
...
@@ -58,29 +56,35 @@ namespace AMDiS {
timestamps
.
push_back
(
timestamp
);
cleanupSolutions
.
push_back
(
cleanupSolution
);
lastPos
++
;
}
template
<
typename
T
>
void
SolutionDataStorage
<
T
>::
push
(
T
*
solution
,
double
timestamp
,
typename
SolutionHelper
<
T
>::
type
feSpace
,
bool
cleanupSolution
,
bool
cleanupFeSpace
)
{
push
(
solution
,
timestamp
,
cleanupSolution
,
cleanupFeSpace
);
// Store fe space only, if we do not have a fixed fe space.
if
(
!
fixedFESpace
)
{
feSpaces
.
push_back
(
feSpace
);
cleanupFeSpaces
.
push_back
(
cleanupFeSpace
);
}
lastPos
++
;
}
template
<
typename
T
>
bool
SolutionDataStorage
<
T
>::
pop
(
T
*
solution
,
double
*
timestamp
,
FiniteElemSpace
*
feSpace
)
bool
SolutionDataStorage
<
T
>::
pop
(
T
**
solution
,
double
*
timestamp
)
{
if
(
lastPos
<
0
)
{
return
false
;
}
solution
=
solutions
[
lastPos
];
*
solution
=
solutions
[
lastPos
];
*
timestamp
=
timestamps
[
lastPos
];
if
(
!
fixedFESpace
)
{
feSpace
=
feSpaces
[
lastPos
];
}
lastPos
--
;
poped
=
true
;
...
...
@@ -88,6 +92,24 @@ namespace AMDiS {
return
true
;
}
template
<
typename
T
>
bool
SolutionDataStorage
<
T
>::
pop
(
T
**
solution
,
double
*
timestep
,
typename
SolutionHelper
<
T
>::
type
feSpace
)
{
if
(
!
pop
(
solution
,
timestep
))
return
false
;
if
(
!
fixedFESpace
)
{
feSpace
=
feSpaces
[
lastPos
+
1
];
// + 1, because lastPos was decremented in pop call above
}
else
{
feSpace
=
feSpaces
[
0
];
}
return
true
;
}
template
<
typename
T
>
void
SolutionDataStorage
<
T
>::
cleanup
()
{
...
...
@@ -99,7 +121,7 @@ namespace AMDiS {
for
(
int
i
=
0
;
i
<
static_cast
<
int
>
(
cleanupFeSpaces
.
size
());
i
++
)
{
if
(
cleanupFeSpaces
[
i
])
{
DELETE
feSpaces
[
i
];
deleteFeSpace
(
feSpaces
[
i
]
)
;
}
}
...
...
AMDiS/src/SystemVector.h
View file @
7854212b
...
...
@@ -124,7 +124,7 @@ namespace AMDiS {
{
vectors
.
set
(
NULL
);
}
;
}
/** \brief
* Copy Constructor.
...
...
@@ -136,11 +136,19 @@ namespace AMDiS {
{
for
(
int
i
=
0
;
i
<
vectors
.
getSize
();
i
++
)
{
vectors
[
i
]
=
new
DOFVector
<
double
>
(
*
rhs
.
vectors
[
i
]);
vectors
[
i
]
=
NEW
DOFVector
<
double
>
(
*
rhs
.
vectors
[
i
]);
}
};
}
virtual
~
SystemVector
()
{}
virtual
~
SystemVector
()
{};
void
createNewDOFVectors
(
std
::
string
name
)
{
for
(
int
i
=
0
;
i
<
vectors
.
getSize
();
i
++
)
{
vectors
[
i
]
=
NEW
DOFVector
<
double
>
(
feSpace
[
i
],
"tmp"
);
}
}
/** \brief
* Sets \ref vectors[index] = vec.
...
...
@@ -148,7 +156,7 @@ namespace AMDiS {
inline
void
setDOFVector
(
int
index
,
DOFVector
<
double
>
*
vec
)
{
TEST_EXIT_DBG
(
index
<
vectors
.
getSize
())(
"invalid index
\n
"
);
vectors
[
index
]
=
vec
;
}
;
}
/** \brief
* Returns \ref vectors[index].
...
...
@@ -156,7 +164,7 @@ namespace AMDiS {
inline
DOFVector
<
double
>
*
getDOFVector
(
int
index
)
{
TEST_EXIT_DBG
(
index
<
vectors
.
getSize
())(
"invalid index
\n
"
);
return
vectors
[
index
];
}
;
}
/** \brief
* Returns \ref vectors[index].
...
...
@@ -164,7 +172,7 @@ namespace AMDiS {
inline
const
DOFVector
<
double
>
*
getDOFVector
(
int
index
)
const
{
TEST_EXIT_DBG
(
index
<
vectors
.
getSize
())(
"invalid index
\n
"
);
return
vectors
[
index
];
}
;
}
/** \brief
* Returns sum of used vector sizes.
...
...
@@ -176,25 +184,25 @@ namespace AMDiS {
totalSize
+=
vectors
[
i
]
->
getUsedSize
();
}
return
totalSize
;
}
;
}
/** \brief
* Returns number of contained vectors.
*/
inline
int
getNumVectors
()
const
{
return
vectors
.
getSize
();
}
;
}
inline
int
getSize
()
const
{
return
vectors
.
getSize
();
}
;
}
/** \brief
* Returns \ref feSpace.
*/
inline
FiniteElemSpace
*
getFESpace
(
int
i
)
const
{
return
feSpace
[
i
];
}
;
}
/** \brief
* Here the system vector is interpreted as one large vector. The given
...
...
@@ -211,7 +219,7 @@ namespace AMDiS {
}
return
(
*
(
vectors
[
vectorIndex
]))[
localIndex
];
}
;
}
/** \brief
* For const access.
...
...
@@ -225,7 +233,7 @@ namespace AMDiS {
}
return
(
*
(
vectors
[
vectorIndex
]))[
localIndex
];
}
;
}
/** \brief
* Sets all entries in all vectors to value.
...
...
@@ -235,7 +243,7 @@ namespace AMDiS {
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
vectors
[
i
]
->
set
(
value
);
}
}
;
}
/** \brief
* Sets all entries in all vectors to value.
...
...
@@ -246,7 +254,7 @@ namespace AMDiS {
(
*
(
vectors
[
i
]))
=
value
;
}
return
*
this
;
}
;
}
/** \brief
* Assignement operator.
...
...
@@ -258,7 +266,7 @@ namespace AMDiS {
(
*
(
vectors
[
i
]))
=
(
*
(
rhs
.
getDOFVector
(
i
)));
}
return
*
this
;
}
;
}
void
serialize
(
std
::
ostream
&
out
)
{
int
size
=
vectors
.
getSize
();
...
...
@@ -266,7 +274,7 @@ namespace AMDiS {
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
vectors
[
i
]
->
serialize
(
out
);
}
}
;
}
void
deserialize
(
std
::
istream
&
in
)
{
int
size
,
oldSize
=
vectors
.
getSize
();
...
...
@@ -278,7 +286,7 @@ namespace AMDiS {
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
vectors
[
i
]
->
deserialize
(
in
);
}
}
;
}
void
copy
(
const
SystemVector
&
rhs
)
{
int
size
=
vectors
.
getSize
();
...
...
@@ -286,21 +294,27 @@ namespace AMDiS {
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
vectors
[
i
]
->
copy
(
*
(
const_cast
<
SystemVector
&>
(
rhs
).
getDOFVector
(
i
)));
}
}
;
}
void
interpol
(
std
::
vector
<
AbstractFunction
<
double
,
WorldVector
<
double
>
>*>
*
f
)
{
int
size
=
vectors
.
getSize
();
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
vectors
[
i
]
->
interpol
((
*
f
)[
i
]);
}
};
}
void
interpol
(
SystemVector
*
v
,
double
factor
)
{
for
(
int
i
=
0
;
i
<
v
->
getSize
();
i
++
)
{
vectors
[
i
]
->
interpol
(
v
->
getDOFVector
(
i
),
factor
);
}
}
void
print
()
{
int
size
=
vectors
.
getSize
();
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
vectors
[
i
]
->
print
();
}
}
;
}
...
...
@@ -330,7 +344,7 @@ namespace AMDiS {
*
(
x
.
getDOFVector
(
i
))
*=
d
;
}
return
x
;
}
;
}
/** \brief
* scalar product
...
...
@@ -342,9 +356,9 @@ namespace AMDiS {
int
size
=
x
.
getNumVectors
();
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
result
+=
(
*
x
.
getDOFVector
(
i
))
*
(
*
y
.
getDOFVector
(
i
));
}
;
}
return
result
;
}
;
}
/** \brief
* addition of two system vectors
...
...
@@ -359,7 +373,7 @@ namespace AMDiS {
(
*
(
x
.
getDOFVector
(
i
)))
+=
(
*
(
y
.
getDOFVector
(
i
)));
}
return
x
;
}
;
}
/**
* subtraction of two system vectors.
...
...
@@ -374,7 +388,7 @@ namespace AMDiS {
(
*
(
x
.
getDOFVector
(
i
)))
-=
(
*
(
y
.
getDOFVector
(
i
)));
}
return
x
;
}
;
}
/** \brief
* multiplication with a scalar
...
...
@@ -386,7 +400,7 @@ namespace AMDiS {
(
*
(
result
.
getDOFVector
(
i
)))
*=
d
;
}
return
result
;
}
;
}
/** \brief
* multiplication with a scalar
...
...
@@ -398,7 +412,7 @@ namespace AMDiS {
(
*
(
result
.
getDOFVector
(
i
)))
*=
d
;
}
return
result
;
}
;
}
/** \brief
* addition of two system vectors
...
...
@@ -414,21 +428,21 @@ namespace AMDiS {
(
*
(
result
.
getDOFVector
(
i
)))
+=
(
*
(
y
.
getDOFVector
(
i
)));
}
return
result
;
}
;
}
/** \brief
* Calls SystemVector::set(). Used for solving.
*/
inline
void
set
(
SystemVector
&
x
,
double
value
)
{
x
.
set
(
value
);
}
;
}
/** \brief
* Calls SystemVector::set(). Used for solving.
*/
inline
void
setValue
(
SystemVector
&
x
,
double
value
)
{
x
.
set
(
value
);
}
;
}
/** \brief
* Norm of system vector.
...
...
@@ -440,7 +454,7 @@ namespace AMDiS {
result
+=
x
->
getDOFVector
(
i
)
->
squareNrm2
();
}
return
sqrt
(
result
);
}
;
}
/** \brief
* L2 norm of system vector.
...
...
@@ -452,7 +466,7 @@ namespace AMDiS {
result
+=
x
->
getDOFVector
(
i
)
->
L2NormSquare
();
}
return
sqrt
(
result
);
}
;
}
/** \brief
* H1 norm of system vector.
...
...
@@ -464,7 +478,7 @@ namespace AMDiS {
result
+=
x
->
getDOFVector
(
i
)
->
H1NormSquare
();
}
return
sqrt
(
result
);
}
;
}
inline
void
mv
(
Matrix
<
DOFMatrix
*>
&
matrix
,
const
SystemVector
&
x
,
...
...
@@ -495,7 +509,7 @@ namespace AMDiS {
}
}
}
}
;
}
/** \brief
* y = a*x + y;
...
...
@@ -514,7 +528,7 @@ namespace AMDiS {
for
(
i
=
0
;
i
<
size
;
i
++
)
{
axpy
(
a
,
*
(
x
.
getDOFVector
(
i
)),
*
(
y
.
getDOFVector
(
i
)));
}
}
;
}
/** \brief
* y = x + a*y
...
...
@@ -535,11 +549,11 @@ namespace AMDiS {
*/
inline
int
size
(
SystemVector
*
vec
)
{
return
vec
->
getUsedSize
();
}
;
}
inline
void
print
(
SystemVector
*
vec
)
{
vec
->
print
();
}
;
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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