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
Backofen, Rainer
amdis
Commits
9c44b131
Commit
9c44b131
authored
Aug 06, 2014
by
Praetorius, Simon
Browse files
merge of branches/expr to trunk
parent
a091668f
Changes
326
Expand all
Hide whitespace changes
Inline
Side-by-side
AMDiS/AMDISConfig.cmake.in
View file @
9c44b131
...
...
@@ -59,12 +59,12 @@ unset(_AMDIS_LIB CACHE)
# Boost libraries
# ---------------
set(AMDIS_HAS_PARALLEL_DOMAIN @ENABLE_PARALLEL_DOMAIN@)
set(AMDIS_NEED_COMPRESSION @ENABLE_COMPRESSIN@)
set(AMDIS_NEED_COMPRESSION @ENABLE_COMPRESSI
O
N@)
set(BOOST_LIBS_REQUIRED system iostreams filesystem program_options date_time)
if(AMDIS_NEED_COMPRESSION)
if(
WIN32 AND
AMDIS_NEED_COMPRESSION)
list(APPEND BOOST_LIBS_REQUIRED zlib bzip2)
endif(AMDIS_NEED_COMPRESSION)
endif(
WIN32 AND
AMDIS_NEED_COMPRESSION)
set(BOOST_VERSION "1.42")
if(AMDIS_HAS_PARALLEL_DOMAIN)
...
...
AMDiS/CMakeLists.txt
View file @
9c44b131
...
...
@@ -56,6 +56,8 @@ option(ENABLE_OUTPUT "AMDiS output printing, disable only for debugging!" true)
mark_as_advanced
(
ENABLE_OUTPUT
)
mark_as_advanced
(
ENABLE_BDDCML
)
mark_as_advanced
(
USE_PETSC_DEV
)
find_package
(
Boost 1.44 REQUIRED
)
...
...
@@ -81,6 +83,7 @@ SET(AMDIS_SRC ${SOURCE_DIR}/AdaptBase.cc
${
SOURCE_DIR
}
/Boundary.cc
${
SOURCE_DIR
}
/BoundaryManager.cc
${
SOURCE_DIR
}
/BoundaryObject.cc
${
SOURCE_DIR
}
/Bubble.cc
${
SOURCE_DIR
}
/Cholesky.cc
${
SOURCE_DIR
}
/CoarseningManager.cc
${
SOURCE_DIR
}
/CoarseningManager1d.cc
...
...
@@ -125,7 +128,7 @@ SET(AMDIS_SRC ${SOURCE_DIR}/AdaptBase.cc
${
SOURCE_DIR
}
/OperatorTerm.cc
${
SOURCE_DIR
}
/Parametric.cc
${
SOURCE_DIR
}
/PeriodicBC.cc
${
SOURCE_DIR
}
/ProblemImplicit.cc
#
${SOURCE_DIR}/ProblemImplicit.cc
${
SOURCE_DIR
}
/ProblemInstat.cc
${
SOURCE_DIR
}
/ProblemInterpol.cc
${
SOURCE_DIR
}
/ProblemStat.cc
...
...
@@ -342,7 +345,7 @@ endif(ENABLE_UMFPACK)
if
(
ENABLE_HYPRE
)
include
(
Find
HYPRE.cmake
)
include
(
HYPRE
Config
.cmake
)
message
(
"have hypre:
${
HAVE_HYPRE
}
"
)
if
(
HAVE_HYPRE
)
if
(
NOT MPI_FOUND
)
...
...
@@ -437,13 +440,15 @@ if(ENABLE_EXTENSIONS)
if
(
ENABLE_SEQ_PETSC
)
list
(
APPEND EXTENSIONS_SRC
${
EXTENSIONS_DIR
}
/preconditioner/PetscPreconPfc.cc
${
EXTENSIONS_DIR
}
/preconditioner/PetscPreconPfcDiag.cc
${
EXTENSIONS_DIR
}
/preconditioner/PetscPreconCahnHilliard.cc
)
endif
(
ENABLE_SEQ_PETSC
)
if
(
ENABLE_PARALLEL_DOMAIN
)
list
(
APPEND EXTENSIONS_SRC
# ${EXTENSIONS_DIR}/preconditioner/PetscSolverNavierStokes2.cc
${
EXTENSIONS_DIR
}
/preconditioner/PetscSolverPfc.cc
)
${
EXTENSIONS_DIR
}
/preconditioner/PetscSolverPfc.cc
${
EXTENSIONS_DIR
}
/preconditioner/PetscSolverPfc_diag.cc
)
endif
(
ENABLE_PARALLEL_DOMAIN
)
list
(
APPEND COMPILEFLAGS
"-DHAVE_EXTENSIONS=1"
)
...
...
@@ -502,7 +507,7 @@ if(ENABLE_EXTENSIONS)
if
(
ENABLE_BASE_PROBLEMS
)
SET
(
BASE_PROBLEMS_SRC
#
${EXTENSIONS_DIR}/base_problems/CahnHilliard.cc
${
EXTENSIONS_DIR
}
/base_problems/CahnHilliard.cc
${
EXTENSIONS_DIR
}
/base_problems/CahnHilliard_RB.cc
${
EXTENSIONS_DIR
}
/base_problems/CahnHilliardNavierStokes.cc
# ${EXTENSIONS_DIR}/base_problems/DiffuseDomainFsi.cc
...
...
@@ -511,13 +516,15 @@ if(ENABLE_EXTENSIONS)
# ${EXTENSIONS_DIR}/base_problems/NavierStokes_Chorin.cc
${
EXTENSIONS_DIR
}
/base_problems/NavierStokesCahnHilliard.cc
${
EXTENSIONS_DIR
}
/base_problems/NavierStokesPhase_TaylorHood.cc
#
${EXTENSIONS_DIR}/base_problems/NavierStokes_TaylorHood.cc
${
EXTENSIONS_DIR
}
/base_problems/NavierStokes_TaylorHood.cc
${
EXTENSIONS_DIR
}
/base_problems/NavierStokes_TaylorHood_RB.cc
#
${EXTENSIONS_DIR}/base_problems/NavierStokes_TH_MultiPhase.cc
${
EXTENSIONS_DIR
}
/base_problems/NavierStokes_TH_MultiPhase.cc
${
EXTENSIONS_DIR
}
/base_problems/NavierStokes_TH_MultiPhase_RB.cc
${
EXTENSIONS_DIR
}
/base_problems/PhaseFieldCrystal.cc
${
EXTENSIONS_DIR
}
/base_problems/PhaseFieldCrystal_Phase.cc
${
EXTENSIONS_DIR
}
/base_problems/PhaseFieldCrystal_RB.cc
)
${
EXTENSIONS_DIR
}
/base_problems/PhaseFieldCrystal_RB.cc
${
EXTENSIONS_DIR
}
/base_problems/PolarizationField.cc
${
EXTENSIONS_DIR
}
/base_problems/QuasiCrystal.cc
)
list
(
APPEND COMPILEFLAGS
"-DHAVE_BASE_PROBLEMS=1"
)
list
(
APPEND AMDIS_INCLUDE_DIRS
${
EXTENSIONS_DIR
}
/base_problems
)
if
(
WIN32
)
...
...
@@ -647,11 +654,21 @@ INSTALL(FILES ${HEADERS}
DESTINATION include/amdis/est/
)
list
(
APPEND deb_add_dirs
"include/amdis/est"
)
FILE
(
GLOB HEADERS
"
${
SOURCE_DIR
}
/expressions/*.h"
)
FILE
(
GLOB HEADERS
"
${
SOURCE_DIR
}
/expressions/*.h
*
"
)
INSTALL
(
FILES
${
HEADERS
}
DESTINATION include/amdis/expressions/
)
list
(
APPEND deb_add_dirs
"include/amdis/expressions"
)
FILE
(
GLOB HEADERS
"
${
SOURCE_DIR
}
/operations/*.h*"
)
INSTALL
(
FILES
${
HEADERS
}
DESTINATION include/amdis/operations/
)
list
(
APPEND deb_add_dirs
"include/amdis/operations"
)
FILE
(
GLOB HEADERS
"
${
SOURCE_DIR
}
/traits/*.h*"
)
INSTALL
(
FILES
${
HEADERS
}
DESTINATION include/amdis/traits/
)
list
(
APPEND deb_add_dirs
"include/amdis/traits"
)
FILE
(
GLOB HEADERS
"
${
SOURCE_DIR
}
/time/*.h"
)
INSTALL
(
FILES
${
HEADERS
}
DESTINATION include/amdis/time/
)
...
...
AMDiS/
Find
HYPRE.cmake
→
AMDiS/HYPRE
Config
.cmake
View file @
9c44b131
File moved
AMDiS/src/AMDiS.h
View file @
9c44b131
...
...
@@ -37,6 +37,7 @@
#include
"Boundary.h"
#include
"BoundaryCondition.h"
#include
"BoundaryManager.h"
#include
"Bubble.h"
#include
"CoarseningManager.h"
#include
"CoarseningManager1d.h"
#include
"CoarseningManager2d.h"
...
...
@@ -73,7 +74,7 @@
#include
"Line.h"
#include
"MacroElement.h"
#include
"Marker.h"
#include
"MathFunctions.h"
//
#include "MathFunctions.h"
#include
"MatrixVector.h"
#include
"Mesh.h"
#include
"MeshStructure.h"
...
...
@@ -85,7 +86,7 @@
#include
"ProblemStat.h"
#include
"ProblemInstat.h"
#include
"ProblemTimeInterface.h"
#include
"ProblemImplicit.h"
//
#include "ProblemImplicit.h"
#include
"ProblemInterpol.h"
#include
"ProblemStatBase.h"
#include
"SecondOrderTerm.h"
...
...
@@ -106,6 +107,7 @@
#include
"TimedObject.h"
#include
"TransformDOF.h"
#include
"Traverse.h"
#include
"Traits.h"
#include
"Triangle.h"
#include
"VertexVector.h"
#include
"ZeroOrderTerm.h"
...
...
@@ -153,7 +155,7 @@
#include
"parallel/ParallelProblemStat.h"
#if HAVE_PARALLEL_MTL4
#include
"parallel/PMTL4Solver.h"
//
#include "parallel/PMTL4Solver.h"
#else
#include
"parallel/PetscSolver.h"
#include
"parallel/PetscSolverNavierStokes.h"
...
...
AMDiS/src/AMDiS_fwd.h
View file @
9c44b131
...
...
@@ -104,7 +104,7 @@ namespace AMDiS {
class
ElementFileWriter
;
class
GNUPlotWriter
;
class
MacroReader
;
class
MacroWriter
;
struct
MacroWriter
;
class
PngWriter
;
class
PovrayWriter
;
class
Spreadsheet
;
...
...
AMDiS/src/AdaptInfo.h
View file @
9c44b131
...
...
@@ -57,6 +57,7 @@ namespace AMDiS {
fac_sum
(
1.0
),
spaceTolerance
(
0.0
),
timeTolerance
(
0.0
),
timeRelativeTolerance
(
0.0
),
timeErrLow
(
0.0
),
coarsenAllowed
(
0
),
refinementAllowed
(
1
),
...
...
@@ -65,6 +66,7 @@ namespace AMDiS {
{
Parameters
::
get
(
prefix
+
"->tolerance"
,
spaceTolerance
);
Parameters
::
get
(
prefix
+
"->time tolerance"
,
timeTolerance
);
Parameters
::
get
(
prefix
+
"->time relative tolerance"
,
timeRelativeTolerance
);
Parameters
::
get
(
prefix
+
"->coarsen allowed"
,
coarsenAllowed
);
Parameters
::
get
(
prefix
+
"->refinement allowed"
,
refinementAllowed
);
Parameters
::
get
(
prefix
+
"->refine bisections"
,
refineBisections
);
...
...
@@ -72,6 +74,8 @@ namespace AMDiS {
Parameters
::
get
(
prefix
+
"->sum factor"
,
fac_sum
);
Parameters
::
get
(
prefix
+
"->max factor"
,
fac_max
);
if
(
timeTolerance
==
0.0
&&
timeRelativeTolerance
==
0.0
)
timeTolerance
=
1.0
;
timeErrLow
=
timeTolerance
*
0.3
;
}
...
...
@@ -95,6 +99,9 @@ namespace AMDiS {
/// Time tolerance.
double
timeTolerance
;
/// Relative time tolerance
double
timeRelativeTolerance
;
/// Lower bound for the time error.
double
timeErrLow
;
...
...
@@ -143,6 +150,7 @@ namespace AMDiS {
maxSolverIterations
(
0
),
solverTolerance
(
1e-8
),
solverResidual
(
0.0
),
globalTimeTolerance
(
1.0
),
scalContents
(
size
),
deserialized
(
false
),
rosenbrockMode
(
false
)
...
...
@@ -175,6 +183,7 @@ namespace AMDiS {
Parameters
::
get
(
name
+
"->min timestep"
,
minTimestep
);
Parameters
::
get
(
name
+
"->max timestep"
,
maxTimestep
);
Parameters
::
get
(
name
+
"->number of timesteps"
,
nTimesteps
);
Parameters
::
get
(
name
+
"->time tolerance"
,
globalTimeTolerance
);
}
/// Resets all variables to zero (or something equivalent)
...
...
@@ -481,6 +490,12 @@ namespace AMDiS {
return
scalContents
[
index
]
->
timeTolerance
;
}
/// Returns \ref timeRelativeTolerance.
inline
double
getTimeRelativeTolerance
(
int
index
)
{
return
scalContents
[
index
]
->
timeRelativeTolerance
;
}
/// Sets \ref time
inline
double
setTime
(
double
t
)
{
...
...
@@ -690,6 +705,18 @@ namespace AMDiS {
{
return
solverResidual
;
}
inline
void
setGlobalTimeTolerance
(
double
tol
)
{
globalTimeTolerance
=
tol
;
}
inline
double
getGlobalTimeTolerance
()
{
return
globalTimeTolerance
;
}
/// Returns true, if the adaptive procedure was deserialized from a file.
bool
isDeserialized
()
const
...
...
@@ -796,6 +823,9 @@ namespace AMDiS {
///
double
solverResidual
;
/// tolerance for the overall time error
double
globalTimeTolerance
;
/// Scalar adapt infos.
std
::
vector
<
ScalContent
*>
scalContents
;
...
...
AMDiS/src/AdaptInstationary.cc
View file @
9c44b131
...
...
@@ -162,12 +162,6 @@ namespace AMDiS {
problemIteration
->
oneIteration
(
adaptInfo
,
FULL_ITERATION
);
problemIteration
->
endIteration
(
adaptInfo
);
adaptInfo
->
setLastProcessedTimestep
(
adaptInfo
->
getTimestep
());
if
(
dbgMode
)
{
std
::
cout
<<
"=== ADAPT INFO DEBUG MODE ===
\n
"
;
std
::
cout
<<
"=== explicitTimeStrategy() ===
\n
"
;
adaptInfo
->
printTimeErrorLowInfo
();
}
}
...
...
@@ -207,15 +201,24 @@ namespace AMDiS {
// === Space iterations. ===
do
{
problemIteration
->
beginIteration
(
adaptInfo
);
if
(
dbgMode
)
{
std
::
cout
<<
"=== ADAPT INFO DEBUG MODE ===
\n
"
;
std
::
cout
<<
"=== in implicitTimeStrategy() ===
\n
"
;
std
::
cout
<<
"=== space/time iteration "
<<
adaptInfo
->
getSpaceIteration
()
<<
" : "
<<
adaptInfo
->
getTimestepIteration
()
<<
" ===
\n
"
;
adaptInfo
->
printTimeErrorLowInfo
();
}
if
(
problemIteration
->
oneIteration
(
adaptInfo
,
FULL_ITERATION
))
{
if
(
dbgMode
)
{
std
::
cout
<<
"=== ADAPT INFO DEBUG MODE ===
\n
"
;
std
::
cout
<<
"=== in implicitTimeStrategy() ===
\n
"
;
std
::
cout
<<
"=== space/time iteration "
<<
adaptInfo
->
getSpaceIteration
()
<<
" : "
<<
adaptInfo
->
getTimestepIteration
()
<<
" ===
\n
"
;
adaptInfo
->
printTimeErrorLowInfo
();
}
Flag
adapted
=
problemIteration
->
oneIteration
(
adaptInfo
,
FULL_ITERATION
);
#if HAVE_PARALLEL_DOMAIN_AMDIS
int
recvAllValues
=
0
;
int
isAdapted
=
static_cast
<
bool
>
(
adapted
);
MPI
::
COMM_WORLD
.
Allreduce
(
&
isAdapted
,
&
recvAllValues
,
1
,
MPI_INT
,
MPI_SUM
);
if
(
recvAllValues
)
{
#else
if
(
adapted
)
{
#endif
if
(
!
fixedTimestep
&&
!
adaptInfo
->
timeToleranceReached
()
&&
!
(
adaptInfo
->
getTimestep
()
<=
adaptInfo
->
getMinTimestep
()))
{
...
...
@@ -244,7 +247,6 @@ namespace AMDiS {
adaptInfo
->
setLastProcessedTimestep
(
adaptInfo
->
getTimestep
());
// After successful iteration/timestep the timestep will be changed according
// adaption rules for next timestep.
// First, check for increase of timestep
...
...
AMDiS/src/AdaptStationary.cc
View file @
9c44b131
...
...
@@ -99,7 +99,7 @@ namespace AMDiS {
void
AdaptStationary
::
initialize
()
{
{
Parameters
::
get
(
name
+
"->info"
,
info
);
}
...
...
AMDiS/src/BasisFunction.cc
View file @
9c44b131
...
...
@@ -25,6 +25,7 @@
#include
"DOFVector.h"
#include
"BasisFunction.h"
#include
"Lagrange.h"
#include
"Bubble.h"
namespace
AMDiS
{
...
...
AMDiS/src/BasisFunction.h
View file @
9c44b131
...
...
@@ -27,6 +27,7 @@
#include
<string>
#include
"AMDiS_fwd.h"
#include
"CreatorInterface.h"
#include
"Global.h"
#include
"Boundary.h"
#include
"MatrixVector.h"
...
...
@@ -311,6 +312,12 @@ namespace AMDiS {
const
ElementVector
&
uh
,
WorldMatrix
<
double
>*
val
)
const
;
/**
* override this method, if the base of your finite element space is not
* nodal
*/
virtual
bool
isNodal
()
const
=
0
;
protected:
/// Textual description
std
::
string
name
;
...
...
@@ -339,6 +346,26 @@ namespace AMDiS {
/// Vector of second derivatives
std
::
vector
<
D2BasFctType
*>
*
d2Phi
;
};
/**
* \brief
* Interface for creators of concrete BasisFunctions.
*/
class
BasisFunctionCreator
:
public
CreatorInterface
<
BasisFunction
>
{
public:
virtual
~
BasisFunctionCreator
()
{}
/// Sets \ref problem
void
setDim
(
int
dim_
)
{
dim
=
dim_
;
}
protected:
/// dimension of the mesh
int
dim
;
};
}
#include
"BasisFunction.hh"
...
...
AMDiS/src/Bubble.cc
0 → 100644
View file @
9c44b131
This diff is collapsed.
Click to expand it.
AMDiS/src/Bubble.h
0 → 100644
View file @
9c44b131
/******************************************************************************
*
* 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.
*
******************************************************************************/
// Created by Roman Weissflog & Philipp Schulz
/** \file Bubble.h */
#ifndef AMDIS_BUBBLE_H
#define AMDIS_BUBBLE_H
#include
<list>
#include
<boost/numeric/mtl/mtl.hpp>
#include
"AbstractFunction.h"
#include
"BasisFunction.h"
#include
"FixVec.h"
namespace
AMDiS
{
/** \ingroup FEMSpace
* \brief
* Lagrange basis functions plus Bubble function. Sub class of BasisFunction
*/
class
Bubble
:
public
BasisFunction
{
public:
/// Creator class used in the BasisFunctionCreatorMap.
class
Creator
:
public
BasisFunctionCreator
{
public:
virtual
~
Creator
()
{}
/// Returns a new Lagrange object.
BasisFunction
*
create
()
{
return
getBubble
(
this
->
dim
,
this
->
dim
+
1
);
// has to be generalized in later versions of bubble functions
}
};
protected:
/// Constructs lagrange/bubble basis functions with the given dim and degree.
/// Constructor is protected to avoid multiple instantiation of identical
/// basis functions. Use \ref getBubble instead.
Bubble
(
int
dim_
,
int
degree_
);
/** \brief
* destructor
*/
virtual
~
Bubble
();
public:
/// Returns a pointer to lagrange and bubble basis functions with the given dim and
/// degree. Multiple instantiation of identical basis functions is avoided
/// by rembering once created basis functions in \ref allBasFcts.
static
Bubble
*
getBubble
(
int
dim
,
int
degree
);
/// Implements BasisFunction::interpol
void
interpol
(
const
ElInfo
*
,
int
,
const
int
*
,
AbstractFunction
<
double
,
WorldVector
<
double
>
>*
,
mtl
::
dense_vector
<
double
>&
)
const
override
;
/// Implements BasisFunction::interpol
void
interpol
(
const
ElInfo
*
,
int
,
const
int
*
b_no
,
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>*
,
mtl
::
dense_vector
<
WorldVector
<
double
>
>&
)
const
override
;
/// Returns the barycentric coordinates of the i-th basis function.
DimVec
<
double
>
*
getCoords
(
int
i
)
const
override
;
/// Implements BasisFunction::getBound
void
getBound
(
const
ElInfo
*
,
BoundaryType
*
)
const
override
;
/** \brief
* Calculates the local vertex indices which are involved in evaluating
* the nodeIndex-th DOF at the positionIndex-th part of type position
* (VERTEX/EDGE/FACE/CENTER). nodeIndex determines the permutation
* of the involved vertices. So in 1d for lagrange4 there are two DOFs at
* the CENTER (which is an edge in this case). Then vertices[0] = {0, 1} and
* vertices[1] = {1, 0}. This allows to use the same local basis function
* for all DOFs at the same position.
*/
static
void
setVertices
(
int
dim
,
int
degree
,
GeoIndex
position
,
int
positionIndex
,
int
nodeIndex
,
int
**
vertices
);
/// Implements BasisFunction::refineInter
inline
void
refineInter
(
DOFIndexed
<
double
>
*
drv
,
RCNeighbourList
*
list
,
int
n
)
override
{
if
(
refineInter_fct
)
(
*
refineInter_fct
)(
drv
,
list
,
n
,
this
);
}
/// Implements BasisFunction::coarseRestrict
inline
void
coarseRestr
(
DOFIndexed
<
double
>
*
drv
,
RCNeighbourList
*
list
,
int
n
)
override
{
if
(
coarseRestr_fct
)
(
*
coarseRestr_fct
)(
drv
,
list
,
n
,
this
);
}
/// Implements BasisFunction::coarseInter
inline
void
coarseInter
(
DOFIndexed
<
double
>
*
drv
,
RCNeighbourList
*
list
,
int
n
)
override
{
if
(
coarseInter_fct
)
(
*
coarseInter_fct
)(
drv
,
list
,
n
,
this
);
}
/// Implements BasisFunction::getLocalIndices().
void
getLocalIndices
(
const
Element
*
el
,
const
DOFAdmin
*
admin
,
std
::
vector
<
DegreeOfFreedom
>
&
dofs
)
const
override
;
/// Implements BasisFunction::getLocalDofPtrVec()
/// Returns an vector filled with all DOFs per position
void
getLocalDofPtrVec
(
const
Element
*
el
,
const
DOFAdmin
*
admin
,
std
::
vector
<
const
DegreeOfFreedom
*>&
vec
)
const
override
;
/// Implements BasisFunction::l2ScpFctBas
void
l2ScpFctBas
(
Quadrature
*
q
,
AbstractFunction
<
double
,
WorldVector
<
double
>
>*
f
,
DOFVector
<
double
>*
fh
)
override
;
/// Implements BasisFunction::l2ScpFctBas
void
l2ScpFctBas
(
Quadrature
*
q
,
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>*
f
,
DOFVector
<
WorldVector
<
double
>
>*
fh
)
override
;
static
void
clear
();
/// Implements BasisFunction::isnodal
bool
isNodal
()
const
override
{
return
false
;
}
protected:
/// sets the barycentric coordinates (stored in \ref bary) of the local
/// basis functions.
void
setBary
();
/// Implements BasisFunction::setNDOF
void
setNDOF
()
override
;
/// Sets used function pointers
void
setFunctionPointer
();
/// Used by \ref getVec
int
*
orderOfPositionIndices
(
const
Element
*
el
,
GeoIndex
position
,
int
positionIndex
)
const
override
;
private:
/// barycentric coordinates of the locations of all basis functions
std
::
vector
<
DimVec
<
double
>*
>
*
bary
;
/** \name static dim-degree-arrays
* \{
*/
static
std
::
vector
<
DimVec
<
double
>*
>
baryDimDegree
;
static
DimVec
<
int
>*
ndofDimDegree
;
static
int
nBasFctsDimDegree
;
static
std
::
vector
<
BasFctType
*>
phifunc
;
static
std
::
vector
<
GrdBasFctType
*>
grdPhifunc
;
static
std
::
vector
<
D2BasFctType
*>
D2Phifunc
;
/** \} */
/// List of all used BasisFunctions in the whole program. Avoids duplicate
/// instantiation of identical BasisFunctions.
static
Bubble
*
Singleton
;
protected:
/// Pointer to the used refineInter function
void
(
*
refineInter_fct
)(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
refineInter2_1d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
refineInter3_2d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
refineInter4_3d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
/// Pointer to the used coarseRestr function
void
(
*
coarseRestr_fct
)(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
coarseRestr2_1d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
coarseRestr3_2d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
coarseRestr4_3d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
/// Pointer to the used coarseInter function
void
(
*
coarseInter_fct
)(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
coarseInter2_1d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
coarseInter3_2d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
static
void
coarseInter4_3d
(
DOFIndexed
<
double
>
*
,
RCNeighbourList
*
,
int
,
BasisFunction
*
);
/// AbstractFunction which implements lagrange/bubble basis functions
class
Phi
:
public
BasFctType
{
public:
/// Constructs the local lagrange/bubble basis function for the given position,
/// positionIndex and nodeIndex. owner_ is a pointer to the Bubble
/// object this basis function belongs to.
Phi
(
Bubble
*
owner
,
GeoIndex
position
,
int
positionIndex
,
int
nodeIndex
);
/// Destructor
virtual
~
Phi
();
private:
/// vertices needed for evaluation of this function
int
*
vertices
;
/// Pointer to the evaluating function
double
(
*
func
)(
const
DimVec
<
double
>&
lambda
,
int
*
vert
);
/// Returns \ref func(lambda, vertices)
inline
double
operator
()(
const
DimVec
<
double
>&
lambda
)
const
override