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
iwr
amdis
Commits
e2b785f0
Commit
e2b785f0
authored
Nov 09, 2012
by
Praetorius, Simon
Browse files
PeriodicBC corrected, GeometryTools moved to new namespace, BaseProblem extended
parent
544ddc37
Changes
17
Hide whitespace changes
Inline
Side-by-side
extensions/ExtendedProblemStat.h
View file @
e2b785f0
...
...
@@ -37,17 +37,35 @@ public:
for
(
int
i
=
0
;
i
<
nComponents
;
++
i
)
exactSolutions
[
i
]
=
NULL
;
}
template
<
typename
SubProblemType
>
ExtendedProblemStat
(
std
::
string
nameStr
,
SubProblemType
*
subProblem
)
:
ProblemStat_
(
nameStr
,
subProblem
)
,
oldMeshChangeIdx
(
0
)
{
exactSolutions
.
resize
(
nComponents
);
for
(
int
i
=
0
;
i
<
nComponents
;
++
i
)
exactSolutions
[
i
]
=
NULL
;
}
~
ExtendedProblemStat
()
{
for
(
int
i
=
0
;
i
<
nComponents
;
++
i
)
if
(
exactSolutions
[
i
])
{
delete
exactSolutions
[
i
];
exactSolutions
[
i
]
=
NULL
;
}
}
void
initialize
(
Flag
initFlag
,
ProblemStatSeq
*
adoptProblem
=
NULL
,
Flag
adoptFlag
=
INIT_NOTHING
)
{
ProblemStat_
::
initialize
(
initFlag
,
adoptProblem
,
adoptFlag
);
// if (initFlag.isSet(INIT_EXACT_SOLUTION)) {
for
(
int
i
=
0
;
i
<
nComponents
;
++
i
)
exactSolutions
[
i
]
=
new
DOFVector
<
double
>
(
getFeSpace
(
i
),
"exact_solution"
);
// }
for
(
int
i
=
0
;
i
<
nComponents
;
++
i
)
exactSolutions
[
i
]
=
new
DOFVector
<
double
>
(
getFeSpace
(
i
),
"exact_solution"
);
}
inline
DOFVector
<
double
>*
getRhsVector
(
int
i
=
0
)
...
...
@@ -85,7 +103,7 @@ public:
manualPeriodicBC
.
clear
();
std
::
vector
<
PeriodicBcData
>::
iterator
it
;
for
(
it
=
PeriodicBcDataList
.
begin
();
it
!=
PeriodicBcDataList
.
end
();
it
++
)
it
->
addToList
(
getFeSpace
(),
manualPeriodicBC
);
it
->
addToList
(
getFeSpace
(
it
->
row
),
manualPeriodicBC
);
}
// update dirichlet data
...
...
extensions/GeometryTools.cc
View file @
e2b785f0
...
...
@@ -2,7 +2,7 @@
#define EPSILON FLT_EPSILON
namespace
meshconv
{
namespace
meshconv
2
{
// ###############
// ## General ##
...
...
extensions/GeometryTools.h
View file @
e2b785f0
...
...
@@ -5,7 +5,7 @@
#include "FixVec.h"
namespace
meshconv
{
namespace
meshconv
2
{
/**
* \defgroup General Dimension independet methods
...
...
@@ -227,7 +227,7 @@ void coordinate_transform(double x[], double shift[], double scale[], double alp
double
volume_tetrahedron
(
double
tet0
[],
double
tet1
[],
double
tet2
[],
double
tet3
[]);
/**@}*/
}
// end namespace meshconv
}
// end namespace meshconv
2
#include "GeometryTools.hh"
...
...
extensions/GeometryTools.hh
View file @
e2b785f0
namespace
meshconv
{
namespace
meshconv
2
{
template
<
int
dow
>
void
coordinate_transform
(
double
x
[],
double
shift
[],
double
scale
[],
double
alpha
,
double
beta
)
...
...
@@ -38,4 +38,4 @@ namespace meshconv {
x
[
i
]
=
coords
[
i
]
+
shift
[
i
];
}
}
// end namespace meshconv
}
// end namespace meshconv
2
extensions/Helpers.cc
View file @
e2b785f0
...
...
@@ -87,7 +87,7 @@ void transformMesh(Mesh *mesh, WorldVector<double> scale, WorldVector<double> sh
T_
=
Rz
*
Ry
*
Rx
*
S
;
WorldMatrix
<
double
>
T
;
vector_operations
::
fillMatrix
(
T
,
T
_
);
vector_operations
::
fillMatrix
(
T
_
,
T
);
FixVec
<
WorldVector
<
double
>
,
VERTEX
>
coords
;
deque
<
MacroElement
*>::
iterator
macro
;
...
...
extensions/PhaseFieldConvert.h
View file @
e2b785f0
...
...
@@ -179,7 +179,7 @@ struct PhaseFieldToSignedDist : AbstractFunction<double, double>
double
operator
()(
const
double
&
phi
)
const
{
double
z
=
std
::
max
(
-
1.0
+
1.e-1
0
,
std
::
min
(
1.0
-
1.e-1
0
,
-
phi
));
double
z
=
std
::
max
(
-
1.0
+
1.e-1
2
,
std
::
min
(
1.0
-
1.e-1
2
,
-
phi
));
return
(
epsilon
/
scalingFactor
)
*
atanh
(
z
);
}
...
...
extensions/SignedDistFunctors.h
View file @
e2b785f0
...
...
@@ -24,7 +24,7 @@ using namespace AMDiS;
* - PlaneRotation(shift, angle)
* - Propeller(radius, angle)
* - Torus(radius1, radius2)
* - Polygon(v0, v1, v2, v
2
), or Polygon(vec(v_i))
* - Polygon(v0, v1, v2, v
3
), or Polygon(vec(v_i))
**/
// signed distance functions for surfaces in polar coords
...
...
@@ -32,7 +32,7 @@ static double signedDist2D(const WorldVector<double> x, const WorldVector<double
AbstractFunction
<
double
,
double
>
*
radius
,
double
eps
)
{
FUNCNAME
(
"signedDist2D"
);
using
vector_operations
::
epsN
orm
;
using
vector_operations
::
n
orm
;
WorldVector
<
double
>
x_trans
;
double
norm_xy
;
...
...
@@ -45,7 +45,7 @@ static double signedDist2D(const WorldVector<double> x, const WorldVector<double
x_trans
[
k
]
=
x
[
k
]
-
midPoint
[
k
];
}
norm_xy
=
epsN
orm
(
x_trans
,
eps
);
norm_xy
=
n
orm
(
x_trans
,
eps
);
if
(
x_trans
[
0
]
>=
0.0
)
{
alpha
=
acos
(
x_trans
[
0
]
/
norm_xy
);
...
...
@@ -60,7 +60,7 @@ static double signedDist3D(const WorldVector<double> x, const WorldVector<double
BinaryAbstractFunction
<
double
,
double
,
double
>
*
radius
,
double
eps
)
{
FUNCNAME
(
"signedDist3D"
);
using
vector_operations
::
epsN
orm
;
using
vector_operations
::
n
orm
;
WorldVector
<
double
>
x_trans
;
double
norm_xyz
,
norm_xy
;
...
...
@@ -73,7 +73,7 @@ static double signedDist3D(const WorldVector<double> x, const WorldVector<double
x_trans
[
k
]
=
x
[
k
]
-
midPoint
[
k
];
}
norm_xyz
=
epsN
orm
(
x_trans
,
eps
);
norm_xyz
=
n
orm
(
x_trans
,
eps
);
norm_xy
=
sqrt
(
sqr
(
x_trans
[
0
])
+
sqr
(
x_trans
[
1
])
+
sqr
(
eps
));
if
(
x_trans
[
1
]
>=
0
)
{
...
...
@@ -568,8 +568,8 @@ public:
{
double
result
=
1.e15
;
for
(
size_t
i
=
0
;
i
<
vertices
.
size
()
-
1
;
i
++
)
result
=
std
::
min
(
result
,
meshconv
::
distance_point_line_2d
(
x
.
begin
(),
vertices
[
i
].
begin
(),
vertices
[
i
+
1
].
begin
()));
return
factor
*
result
*
(
meshconv
::
point_in_polygon
(
x
.
begin
(),
vertices
)
?
-
1.0
:
1.0
);
result
=
std
::
min
(
result
,
meshconv
2
::
distance_point_line_2d
(
x
.
begin
(),
vertices
[
i
].
begin
(),
vertices
[
i
+
1
].
begin
()));
return
factor
*
result
*
(
meshconv
2
::
point_in_polygon
(
x
.
begin
(),
vertices
)
?
-
1.0
:
1.0
);
}
void
refine
(
int
np
)
...
...
extensions/SingularDirichletBC.h
View file @
e2b785f0
...
...
@@ -39,7 +39,7 @@ namespace details {
inline
void
getBoundaryIndices
(
const
FiniteElemSpace
*
feSpace
,
BoundaryType
nr
,
AbstractFunction
<
bool
,
WorldVector
<
double
>
>*
meshIndicator
,
std
::
vector
<
DegreeOfFreedom
>
&
indices
)
std
::
set
<
DegreeOfFreedom
>
&
indices
)
{
Mesh
*
mesh
=
feSpace
->
getMesh
();
int
dim
=
mesh
->
getDim
();
...
...
@@ -61,7 +61,7 @@ namespace details {
for
(
int
i
=
0
;
i
<
numBasFcts
;
i
++
)
{
elInfo
->
coordToWorld
(
*
(
basFcts
->
getCoords
(
i
)),
coord
);
if
((
*
meshIndicator
)(
coord
))
indices
.
push_back
(
localIndices
[
i
]);
indices
.
insert
(
localIndices
[
i
]);
}
break
;
}
...
...
@@ -77,7 +77,7 @@ namespace details {
**/
inline
void
getBoundaryIndices
(
const
FiniteElemSpace
*
feSpace
,
AbstractFunction
<
bool
,
WorldVector
<
double
>
>*
meshIndicator
,
std
::
vector
<
DegreeOfFreedom
>
&
indices
)
std
::
set
<
DegreeOfFreedom
>
&
indices
)
{
Mesh
*
mesh
=
feSpace
->
getMesh
();
int
dim
=
mesh
->
getDim
();
...
...
@@ -99,7 +99,7 @@ namespace details {
for
(
int
i
=
0
;
i
<
numBasFcts
;
i
++
)
{
elInfo
->
coordToWorld
(
*
(
basFcts
->
getCoords
(
i
)),
coord
);
if
((
*
meshIndicator
)(
coord
))
indices
.
push_back
(
localIndices
[
i
]);
indices
.
insert
(
localIndices
[
i
]);
}
break
;
}
...
...
@@ -191,23 +191,82 @@ namespace details {
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>*
periodicMap
,
std
::
vector
<
std
::
pair
<
DegreeOfFreedom
,
DegreeOfFreedom
>
>
&
association
)
{
std
::
vector
<
DegreeOfFreedom
>
indices
;
std
::
set
<
DegreeOfFreedom
>
indices
;
details
::
getBoundaryIndices
(
feSpace
,
nr
,
meshIndicator
,
indices
);
association
.
clear
();
DOFVector
<
WorldVector
<
double
>
>
coords
(
feSpace
,
"coords"
);
feSpace
->
getMesh
()
->
getDofIndexCoords
(
coords
);
for
(
size_t
i
=
0
;
i
<
indices
.
size
();
i
++
)
std
::
set
<
DegreeOfFreedom
>::
iterator
it
;
for
(
it
=
indices
.
begin
();
it
!=
indices
.
end
();
it
++
)
{
DegreeOfFreedom
idx2
;
WorldVector
<
double
>
p
;
p
=
(
*
periodicMap
)(
coords
[
indices
[
i
]
]);
p
=
(
*
periodicMap
)(
coords
[
*
it
]);
TEST_EXIT
(
coords
.
getDofIdxAtPoint
(
p
,
idx2
))(
"periodic association not found!
\n
"
);
association
.
push_back
(
std
::
make_pair
(
indices
[
i
]
,
idx2
));
association
.
push_back
(
std
::
make_pair
(
*
it
,
idx2
));
}
}
inline
bool
getDofIdxAtPoint
(
const
FiniteElemSpace
*
feSpace
,
WorldVector
<
double
>
&
p
,
DegreeOfFreedom
&
idx
,
ElInfo
*
oldElInfo
=
NULL
,
bool
useOldElInfo
=
false
)
{
FUNCNAME
(
"DOFVector::getDofIdxAtPoint()"
);
Mesh
*
mesh
=
feSpace
->
getMesh
();
const
BasisFunction
*
basFcts
=
feSpace
->
getBasisFcts
();
int
dim
=
mesh
->
getDim
();
int
numBasFcts
=
basFcts
->
getNumber
();
std
::
vector
<
DegreeOfFreedom
>
localIndices
(
numBasFcts
);
DimVec
<
double
>
lambda
(
dim
,
NO_INIT
);
ElInfo
*
elInfo
=
mesh
->
createNewElInfo
();
idx
=
0
;
bool
inside
=
false
;
if
(
oldElInfo
&&
useOldElInfo
&&
oldElInfo
->
getMacroElement
())
{
inside
=
mesh
->
findElInfoAtPoint
(
p
,
elInfo
,
lambda
,
oldElInfo
->
getMacroElement
(),
NULL
,
NULL
);
delete
oldElInfo
;
}
else
{
inside
=
mesh
->
findElInfoAtPoint
(
p
,
elInfo
,
lambda
,
NULL
,
NULL
,
NULL
);
}
if
(
oldElInfo
)
oldElInfo
=
elInfo
;
if
(
!
inside
)
return
false
;
basFcts
->
getLocalIndices
(
elInfo
->
getElement
(),
feSpace
->
getAdmin
(),
localIndices
);
WorldVector
<
double
>
coord
;
int
minIdx
=
-
1
;
double
minDist
=
1.e15
;
for
(
int
i
=
0
;
i
<
numBasFcts
;
i
++
)
{
elInfo
->
coordToWorld
(
*
(
basFcts
->
getCoords
(
i
)),
coord
);
WorldVector
<
double
>
dist
=
coord
-
p
;
double
newDist
=
norm
(
dist
);
if
(
newDist
<
minDist
)
{
minIdx
=
i
;
minDist
=
newDist
;
}
}
if
(
minIdx
>=
0
)
idx
=
localIndices
[
minIdx
];
if
(
!
oldElInfo
)
delete
elInfo
;
return
inside
;
}
/**
* get al list of pairs that describes wich DegreeOfFreedom are assiciated in the given mesh
...
...
@@ -216,32 +275,34 @@ namespace details {
* the 'periodicMap' associates a second DegreeOfFreedom.
**/
inline
void
getPeriodicAssociation
(
const
FiniteElemSpace
*
feSpace
,
AbstractFunction
<
bool
,
WorldVector
<
double
>
>*
meshIndicator
,
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>*
periodicMap
,
std
::
vector
<
std
::
pair
<
DegreeOfFreedom
,
DegreeOfFreedom
>
>
&
association
)
AbstractFunction
<
bool
,
WorldVector
<
double
>
>*
meshIndicator
,
AbstractFunction
<
WorldVector
<
double
>
,
WorldVector
<
double
>
>*
periodicMap
,
std
::
vector
<
std
::
pair
<
DegreeOfFreedom
,
DegreeOfFreedom
>
>
&
association
)
{
std
::
vector
<
DegreeOfFreedom
>
indices
;
std
::
set
<
DegreeOfFreedom
>
indices
;
details
::
getBoundaryIndices
(
feSpace
,
meshIndicator
,
indices
);
MSG_DBG
(
"Nr of indices: %d
\n
"
,
indices
.
size
());
association
.
clear
();
DOFVector
<
WorldVector
<
double
>
>
coords
(
feSpace
,
"coords"
);
feSpace
->
getMesh
()
->
getDofIndexCoords
(
coords
);
for
(
size_t
i
=
0
;
i
<
indices
.
size
();
i
++
)
std
::
set
<
DegreeOfFreedom
>::
iterator
it
;
for
(
it
=
indices
.
begin
();
it
!=
indices
.
end
();
it
++
)
{
DegreeOfFreedom
idx2
;
WorldVector
<
double
>
p
;
p
=
(
*
periodicMap
)(
coords
[
indices
[
i
]
]);
p
=
(
*
periodicMap
)(
coords
[
*
it
]);
TEST_EXIT
(
coords
.
getDofIdxAtPoint
(
p
,
idx2
))(
"periodic association not found!
\n
"
);
association
.
push_back
(
std
::
make_pair
(
indices
[
i
]
,
idx2
));
association
.
push_back
(
std
::
make_pair
(
*
it
,
idx2
));
}
MSG_DBG
(
"Nr of associations: %d
\n
"
,
association
.
size
());
}
inline
void
getDOFValues
(
const
FiniteElemSpace
*
feSpace
,
AbstractFunction
<
double
,
WorldVector
<
double
>
>*
values
,
std
::
vector
<
DegreeOfFreedom
>
&
indices
,
std
::
vector
<
double
>
&
dofValues
)
inline
void
getDOFValues
(
const
FiniteElemSpace
*
feSpace
,
AbstractFunction
<
double
,
WorldVector
<
double
>
>*
values
,
std
::
vector
<
DegreeOfFreedom
>
&
indices
,
std
::
vector
<
double
>
&
dofValues
)
{
WorldVector
<
double
>
x
;
for
(
size_t
i
=
0
;
i
<
indices
.
size
();
i
++
)
{
...
...
@@ -250,13 +311,11 @@ namespace details {
}
}
inline
void
getDOFValues
(
const
FiniteElemSpace
*
feSpace
,
DOFVector
<
double
>*
values
,
std
::
vector
<
DegreeOfFreedom
>
&
indices
,
std
::
vector
<
double
>
&
dofValues
)
inline
void
getDOFValues
(
const
FiniteElemSpace
*
feSpace
,
DOFVector
<
double
>*
values
,
std
::
vector
<
DegreeOfFreedom
>
&
indices
,
std
::
vector
<
double
>
&
dofValues
)
{
for
(
size_t
i
=
0
;
i
<
indices
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
indices
.
size
();
i
++
)
{
dofValues
.
push_back
((
*
values
)[
indices
[
i
]]);
}
}
}
// end namespace
...
...
@@ -416,10 +475,14 @@ struct DirichletBcData {
break
;
case
4
:
std
::
set
<
DegreeOfFreedom
>
indices__
;
if
(
boundary_nr
==
0
)
details
::
getBoundaryIndices
(
feSpace
,
meshIndicator
,
indices_
);
details
::
getBoundaryIndices
(
feSpace
,
meshIndicator
,
indices_
_
);
else
details
::
getBoundaryIndices
(
feSpace
,
boundary_nr
,
meshIndicator
,
indices_
);
details
::
getBoundaryIndices
(
feSpace
,
boundary_nr
,
meshIndicator
,
indices__
);
std
::
set
<
DegreeOfFreedom
>::
iterator
it
;
for
(
it
=
indices__
.
begin
();
it
!=
indices__
.
end
();
it
++
)
indices_
.
push_back
(
*
it
);
break
;
}
...
...
@@ -441,8 +504,9 @@ struct DirichletBcData {
feSpace
->
getMesh
()
->
getDofIndexCoords
(
coords
);
for
(
size_t
i
=
0
;
i
<
indices_
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
indices_
.
size
();
i
++
)
{
list
.
push_back
(
SingularDirichletBC
(
row
,
col
,
indices_
[
i
],
values_
[
i
]));
}
MSG_DBG
(
"Dirichle BC at %d DOFs added.
\n
"
,
indices_
.
size
());
}
...
...
@@ -490,10 +554,10 @@ struct PeriodicBcData {
details
::
getPeriodicAssociation
(
feSpace
,
nr
,
meshIndicator
,
periodicMap
,
associations
);
list
.
push_back
(
ManualPeriodicBC
(
row
,
associations
));
}
int
row
;
protected:
int
row
;
BoundaryType
nr
;
AbstractFunction
<
bool
,
WorldVector
<
double
>
>*
meshIndicator
;
...
...
extensions/Tools.h
View file @
e2b785f0
...
...
@@ -117,7 +117,7 @@ namespace tools {
struct
SequenceQuad
{
// integration zwischen zwei Punkten mittels Trapezregel
template
<
typename
Vector1
,
typename
Vector2
,
typename
T
>
/// requires
Callable1<Functor, T>,
Addable<T>, Multiplicable<T>, Nullifyable<T>
template
<
typename
Vector1
,
typename
Vector2
,
typename
T
>
/// requires Addable<T>, Multiplicable<T>, Nullifyable<T>
T
quad
(
Vector1
&
y
,
Vector2
&
x
)
{
T
I
;
nullify
(
I
);
...
...
extensions/VectorOperations.h
View file @
e2b785f0
...
...
@@ -18,6 +18,7 @@
#include <boost/numeric/mtl/mtl.hpp>
#include <boost/numeric/itl/itl.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits.hpp>
using
namespace
AMDiS
;
...
...
@@ -108,6 +109,7 @@ namespace vector_operations {
type
operator
()(
const
Value
[
Rows
][
Cols
])
{
return
Rows
;
}
};
/// size implementation for AMDiS WorldVectors
template
<
typename
Value
>
struct
num_rows
<
WorldVector
<
Value
>
>
{
...
...
@@ -115,6 +117,7 @@ namespace vector_operations {
type
operator
()(
const
WorldVector
<
Value
>&
v
)
{
return
static_cast
<
size_t
>
(
v
.
getSize
());
}
};
/// size implementation for AMDiS WorldMatrices
template
<
typename
Value
>
struct
num_rows
<
WorldMatrix
<
Value
>
>
{
...
...
@@ -122,6 +125,7 @@ namespace vector_operations {
type
operator
()(
const
WorldMatrix
<
Value
>&
v
)
{
return
static_cast
<
size_t
>
(
v
.
getNumRows
());
}
};
/// size implementation for arithmetic types (double, float, int, ...)
template
<
typename
Value
>
struct
num_rows
<
Value
,
typename
boost
::
enable_if
<
boost
::
is_arithmetic
<
Value
>
>::
type
>
{
...
...
@@ -135,6 +139,7 @@ namespace vector_operations {
template
<
typename
Collection
,
class
Enable
=
void
>
struct
num_cols
{};
/// size implementation for AMDiS WorldMatrices
template
<
typename
Value
>
struct
num_cols
<
WorldMatrix
<
Value
>
>
{
...
...
@@ -148,6 +153,7 @@ namespace vector_operations {
template
<
typename
Collection
,
class
Enable
=
void
>
struct
resize
{};
/// change_dim implementation for AMDiS WorldVectors
template
<
typename
Value
>
struct
resize
<
WorldVector
<
Value
>
>
{
...
...
@@ -158,6 +164,7 @@ namespace vector_operations {
}
};
/// change_dim implementation for STL vectors
template
<
typename
Value
>
struct
resize
<
std
::
vector
<
Value
>
>
{
...
...
@@ -167,6 +174,7 @@ namespace vector_operations {
}
};
/// change_dim implementation for MTL4 vectors
template
<
typename
Value
>
struct
resize
<
mtl
::
dense_vector
<
Value
>
>
{
...
...
@@ -178,6 +186,7 @@ namespace vector_operations {
// _________________________________________________________________________________
/// change_dim implementation for AMDiS WorldMatrices
template
<
typename
Value
>
struct
resize
<
WorldMatrix
<
Value
>
>
{
...
...
@@ -188,6 +197,7 @@ namespace vector_operations {
}
};
/// change_dim implementation for MTL4 matrix
template
<
typename
Value
,
typename
Param
>
struct
resize
<
mtl
::
matrix
::
base_matrix
<
Value
,
Param
>
>
{
...
...
@@ -197,6 +207,7 @@ namespace vector_operations {
}
};
/// change_dim implementation for MTL4 matrix
template
<
typename
Value
>
struct
resize
<
mtl
::
matrix
::
dense2D
<
Value
>
>
{
...
...
@@ -206,6 +217,7 @@ namespace vector_operations {
}
};
/// change_dim implementation for MTL4 matrix
template
<
typename
Value
>
struct
resize
<
mtl
::
matrix
::
compressed2D
<
Value
>
>
{
...
...
@@ -214,12 +226,67 @@ namespace vector_operations {
v
.
change_dim
(
r
,
c
);
}
};
// _________________________________________________________________________________
/// General declaration, used to disable unsupported types
template
<
typename
Collection
,
class
Enable
=
void
>
struct
at
{};
template
<
typename
Value
>
struct
at
<
WorldMatrix
<
Value
>
>
{
typedef
Value
type
;
type
&
operator
()(
WorldMatrix
<
Value
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
[
r
][
c
];
}
type
const
&
operator
()(
const
WorldMatrix
<
Value
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
[
r
][
c
];
}
};
template
<
typename
Value
,
typename
Param
>
struct
at
<
mtl
::
matrix
::
base_matrix
<
Value
,
Param
>
>
{
typedef
Value
type
;
type
&
operator
()(
mtl
::
matrix
::
base_matrix
<
Value
,
Param
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
(
r
,
c
);
}
type
const
&
operator
()(
const
mtl
::
matrix
::
base_matrix
<
Value
,
Param
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
(
r
,
c
);
}
};
template
<
typename
Value
>
struct
at
<
mtl
::
matrix
::
dense2D
<
Value
>
>
{
typedef
Value
type
;
type
&
operator
()(
mtl
::
matrix
::
dense2D
<
Value
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
(
r
,
c
);
}
type
const
&
operator
()(
const
mtl
::
matrix
::
dense2D
<
Value
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
(
r
,
c
);
}
};
template
<
typename
Value
>
struct
at
<
mtl
::
matrix
::
compressed2D
<
Value
>
>
{
typedef
Value
type
;
type
&
operator
()(
mtl
::
matrix
::
compressed2D
<
Value
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
(
r
,
c
);
}
type
const
&
operator
()(
const
mtl
::
matrix
::
compressed2D
<
Value
>&
v
,
size_t
r
,
size_t
c
)
{
return
v
(
r
,
c
);
}
};
}
/// num_rows function for non-MTL types (uses implicit enable_if)
template
<
typename
Collection
>
typename
traits
::
num_rows
<
Collection
>::
type
inline
num_rows
(
const
Collection
&
c
)
num_rows
(
const
Collection
&
c
)
{
return
traits
::
num_rows
<
Collection
>
()(
c
);
}
...
...
@@ -227,41 +294,63 @@ namespace vector_operations {
/// num_cols function for non-MTL types (uses implicit enable_if)
template
<
typename
Collection
>
typename
traits
::
num_cols
<
Collection
>::
type
inline
num_cols
(
const
Collection
&
c
)
num_cols
(
const
Collection
&
c
)
{
return
traits
::
num_cols
<
Collection
>
()(
c
);
}
/// resize function for vectors
template
<
typename
Collection
>
typename
traits
::
num_cols
<
Collection
>::
vector_void_type
inline
resize
(
const
Collection
&
c
,
size_t
rows
)
typename
traits
::
resize
<
Collection
>::
vector_void_type
resize
(
Collection
&
c
,
size_t
rows
)
{
traits
::
resize
<
Collection
>
()(
c
,
rows
);
}
/// resize function for matrices
template
<
typename
Collection
>
typename
traits
::
num_cols
<
Collection
>::
matrix_void_type
inline
resize
(
const
Collection
&
c
,
size_t
rows
,
size_t
cols
)
typename
traits
::
resize
<
Collection
>::
matrix_void_type
resize
(
Collection
&
c
,
size_t
rows
,
size_t
cols
)
{
traits
::
resize
<
Collection
>
()(
c
,
rows
,
cols
);
}
template
<
typename
T
>
T
norm
(
mtl
::
dense_vector
<
T
>
&
b
)
{
return
two_norm
(
b
);
};
template
<
typename
T
>
T
norm
(
std
::
vector
<
T
>
&
b
)
/// at function for matrices
template
<
typename
Collection
>
typename
traits
::
at
<
Collection
>::
type
const
&
at
(
const
Collection
&
c
,
size_t
rows
,
size_t
cols
)
{
return
traits
::
at
<
Collection
>
()(
c
,
rows
,
cols
);
}
/// at function for matrices
template
<
typename
Collection
>
typename
traits
::
at
<
Collection
>::
type
&
at
(
Collection
&
c
,
size_t
rows
,
size_t
cols
)
{
return
traits
::
at
<
Collection
>
()(<