Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Ein Anmelden über dieses erzeugt ein neues Konto. Das alte Konto ist über den Reiter "Standard" erreichbar. Die Administratoren

Dear Gitlab user, it is now possible to log in to our service using the ZIH login/LDAP. Logging in via this will create a new account. The old account can be accessed via the "Standard" tab. The administrators

Commit 013c2859 authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

allow lambda-functions in dirichlet BC

parent d2aafda1
/******************************************************************************
*
* 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();
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment