Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Backofen, Rainer
amdis
Commits
013c2859
Commit
013c2859
authored
Jun 29, 2015
by
Praetorius, Simon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
allow lambda-functions in dirichlet BC
parent
d2aafda1
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
156 additions
and
0 deletions
+156
-0
AMDiS/src/DirichletBC.hh
AMDiS/src/DirichletBC.hh
+156
-0
No files found.
AMDiS/src/DirichletBC.hh
0 → 100644
View file @
013c2859
/******************************************************************************
*
* AMDiS - Adaptive multidimensional simulations
*
* Copyright (C) 2013 Dresden University of Technology. All Rights Reserved.
* Web: https://fusionforge.zih.tu-dresden.de/projects/amdis
*
* Authors:
* Simon Vey, Thomas Witkowski, Andreas Naumann, Simon Praetorius, et al.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
*
* This file is part of AMDiS
*
* See also license.opensource.txt in the distribution.
*
******************************************************************************/
#include "ElInfo.h"
#include "BasisFunction.h"
#include "DOFVector.h"
#include "DOFMatrix.h"
namespace
AMDiS
{
template
<
class
Tag
>
DirichletBC
<
Tag
>::
DirichletBC
(
BoundaryType
type
,
AbstractFunction
<
double
,
WorldVector
<
double
>
>
*
fct
,
const
FiniteElemSpace
*
rowFeSpace
,
const
FiniteElemSpace
*
colFeSpace
,
bool
apply
)
:
BoundaryCondition
(
type
,
rowFeSpace
,
colFeSpace
),
container
(
fct
),
applyBC
(
apply
)
{}
#if __cplusplus > 199711L
template
<
class
Tag
>
DirichletBC
<
Tag
>::
DirichletBC
(
BoundaryType
type
,
std
::
function
<
double
(
WorldVector
<
double
>
)
>
fct
,
const
FiniteElemSpace
*
rowFeSpace
,
const
FiniteElemSpace
*
colFeSpace
,
bool
apply
)
:
BoundaryCondition
(
type
,
rowFeSpace
,
colFeSpace
),
container
(
fct
),
applyBC
(
apply
)
{}
#endif
template
<
class
Tag
>
DirichletBC
<
Tag
>::
DirichletBC
(
BoundaryType
type
,
DOFVectorBase
<
double
>
*
vec
,
bool
apply
)
:
BoundaryCondition
(
type
,
vec
->
getFeSpace
(),
vec
->
getFeSpace
()),
container
(
vec
),
applyBC
(
apply
)
{}
template
<
class
Tag
>
void
DirichletBC
<
Tag
>::
fillBoundaryCondition
(
DOFMatrix
*
matrix
,
ElInfo
*
elInfo
,
const
DegreeOfFreedom
*
dofIndices
,
const
BoundaryType
*
localBound
,
int
nBasFcts
)
{
FUNCNAME_DBG
(
"DirichletBC::fillBoundaryCondition()"
);
TEST_EXIT_DBG
(
matrix
->
getRowFeSpace
()
==
rowFeSpace
)(
"invalid row fe space
\n
"
);
}
template
<
class
Tag
>
void
DirichletBC
<
Tag
>::
fillBoundaryCondition
(
DOFVectorBase
<
double
>*
vector
,
ElInfo
*
elInfo
,
const
DegreeOfFreedom
*
dofIndices
,
const
BoundaryType
*
localBound
,
int
nBasFcts
)
{
FUNCNAME_DBG
(
"DirichletBC::fillBoundaryCondition()"
);
TEST_EXIT_DBG
(
vector
->
getFeSpace
()
==
rowFeSpace
)(
"invalid row fe space
\n
"
);
fillBC
(
Tag
(),
vector
,
elInfo
,
dofIndices
,
localBound
,
nBasFcts
);
}
template
<
class
Tag
>
void
DirichletBC
<
Tag
>::
fillBC
(
_value_by_abstractfunction
,
DOFVectorBase
<
double
>*
vector
,
ElInfo
*
elInfo
,
const
DegreeOfFreedom
*
dofIndices
,
const
BoundaryType
*
localBound
,
int
nBasFcts
)
{
WorldVector
<
double
>
worldCoords
;
const
BasisFunction
*
basFcts
=
rowFeSpace
->
getBasisFcts
();
for
(
int
i
=
0
;
i
<
nBasFcts
;
i
++
)
if
(
localBound
[
i
]
==
boundaryType
)
{
elInfo
->
coordToWorld
(
*
(
basFcts
->
getCoords
(
i
)),
worldCoords
);
double
value
=
container
.
value
(
worldCoords
);
vector
->
setDirichletDofValue
(
dofIndices
[
i
],
value
);
(
*
vector
)[
dofIndices
[
i
]]
=
value
;
}
}
// c++11 std::function of lambda-functions
template
<
class
Tag
>
void
DirichletBC
<
Tag
>::
fillBC
(
_value_by_function
,
DOFVectorBase
<
double
>*
vector
,
ElInfo
*
elInfo
,
const
DegreeOfFreedom
*
dofIndices
,
const
BoundaryType
*
localBound
,
int
nBasFcts
)
{
WorldVector
<
double
>
worldCoords
;
const
BasisFunction
*
basFcts
=
rowFeSpace
->
getBasisFcts
();
for
(
int
i
=
0
;
i
<
nBasFcts
;
i
++
)
if
(
localBound
[
i
]
==
boundaryType
)
{
elInfo
->
coordToWorld
(
*
(
basFcts
->
getCoords
(
i
)),
worldCoords
);
double
value
=
container
.
value
(
worldCoords
);
vector
->
setDirichletDofValue
(
dofIndices
[
i
],
value
);
(
*
vector
)[
dofIndices
[
i
]]
=
value
;
}
}
template
<
class
Tag
>
void
DirichletBC
<
Tag
>::
fillBC
(
_value_by_dofvector
,
DOFVectorBase
<
double
>*
vector
,
ElInfo
*
elInfo
,
const
DegreeOfFreedom
*
dofIndices
,
const
BoundaryType
*
localBound
,
int
nBasFcts
)
{
for
(
int
i
=
0
;
i
<
nBasFcts
;
i
++
)
if
(
localBound
[
i
]
==
boundaryType
)
{
double
value
=
(
*
container
.
value
)[
dofIndices
[
i
]];
vector
->
setDirichletDofValue
(
dofIndices
[
i
],
value
);
(
*
vector
)[
dofIndices
[
i
]]
=
value
;
}
}
template
<
class
Tag
>
void
DirichletBC
<
Tag
>::
initVector
(
DOFVectorBase
<
double
>*
vec
)
{
if
(
dynamic_cast
<
DOFVector
<
double
>*>
(
vec
))
dynamic_cast
<
DOFVector
<
double
>*>
(
vec
)
->
getDirichletValues
().
clear
();
}
}
Write
Preview
Markdown
is supported
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