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
6b371bfd
Commit
6b371bfd
authored
Jul 25, 2011
by
Naumann, Andreas
Browse files
removed possible memory error, tested with demos
parent
5603ff15
Changes
5
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/ITL_OEMSolver.h
View file @
6b371bfd
...
...
@@ -43,13 +43,13 @@ namespace AMDiS {
*/
template
<
typename
ITLSolver
>
class
ITL_OEMSolver
:
public
MTL4Solver
<
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
>
>
{
class
ITL_OEMSolver
:
public
MTL4Solver
<
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
,
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
>
>
{
protected:
public:
/// The constructor reads needed parameters and sets solvers \ref name.
ITL_OEMSolver
(
std
::
string
name
)
:
MTL4Solver
<
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
>
>
(
name
)
{}
MTL4Solver
<
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
,
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
>
>
(
name
)
{}
~
ITL_OEMSolver
()
{}
...
...
@@ -77,12 +77,12 @@ namespace AMDiS {
*/
template
<
typename
ITLSolver
>
class
ITL_OEMSolver_para
:
public
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
>
>
// ITL_OEMSolver<ITLSolver>
:
public
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
,
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
>
>
// ITL_OEMSolver<ITLSolver>
{
public:
/// The constructor reads needed parameters and sets solvers \ref name.
ITL_OEMSolver_para
(
std
::
string
name
)
:
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
>
>
(
name
)
:
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
,
MTLTypes
::
MTLMatrix
,
MTLTypes
::
MTLVector
>
>
(
name
)
{
}
...
...
AMDiS/src/ITL_OEMSolver.hh
View file @
6b371bfd
...
...
@@ -49,7 +49,7 @@ namespace AMDiS {
}
};
template
<
typename
ITLSolver
>
template
<
typename
ITLSolver
,
typename
Matrix
,
typename
Vector
>
struct
ITL_OEMSolver_para_runner
:
BaseITL_runner
{
ITL_OEMSolver_para_runner
(
OEMSolver
*
oem_
)
:
BaseITL_runner
(
oem_
),
...
...
@@ -59,27 +59,32 @@ namespace AMDiS {
Parameters
::
get
(
oem
.
getName
()
+
"->ell"
,
ell
);
}
template
<
typename
Matrix
,
typename
Vector
>
void
init
(
const
Matrix
&
A
)
{
BaseITL_runner
::
setPrecon
(
preconPair
,
A
);
}
int
solve
(
const
Matrix
&
A
,
Vector
&
x
,
Vector
&
b
)
{
itl
::
cyclic_iteration
<
typename
Matrix
::
value_type
>
iter
(
b
,
oem
.
getMaxIterations
(),
oem
.
getRelative
(),
FUNCNAME
(
"ITL_OEMSolver_para_runner::solve()"
);
TEST_EXIT
(
preconPair
.
l
!=
NULL
)(
"there is no left preconditioner"
);
TEST_EXIT
(
preconPair
.
r
!=
NULL
)(
"there is no right preconditioner"
);
itl
::
cyclic_iteration
<
typename
Vector
::
value_type
>
iter
(
b
,
oem
.
getMaxIterations
(),
oem
.
getRelative
(),
oem
.
getTolerance
(),
oem
.
getPrint_cycle
());
static
PreconPair
<
Vector
>
preconPair
;
if
(
preconPair
.
l
==
NULL
||
preconPair
.
r
==
NULL
||
!
oem
.
getMultipleRhs
())
BaseITL_runner
::
setPrecon
(
preconPair
,
A
);
int
error
=
ITLSolver
()(
A
,
x
,
b
,
*
(
preconPair
.
l
),
*
(
preconPair
.
r
),
iter
,
ell
);
int
error
=
solver
(
A
,
x
,
b
,
*
(
preconPair
.
l
),
*
(
preconPair
.
r
),
iter
,
ell
);
oem
.
setIterations
(
iter
.
iterations
());
oem
.
setResidual
(
iter
.
resid
());
oem
.
setErrorCode
(
error
);
return
error
;
}
private:
PreconPair
<
Vector
>
preconPair
;
ITLSolver
solver
;
int
ell
;
};
template
<
typename
ITLSolver
>
template
<
typename
ITLSolver
,
typename
Matrix
,
typename
Vector
>
struct
ITL_OEMSolver_runner
:
BaseITL_runner
{
...
...
@@ -87,21 +92,26 @@ namespace AMDiS {
BaseITL_runner
(
oem
)
{}
template
<
typename
Matrix
,
typename
Vector
>
int
solve
(
const
Matrix
&
A
,
Vector
&
x
,
Vector
&
b
)
void
init
(
const
Matrix
&
A
)
{
BaseITL_runner
::
setPrecon
(
preconPair
,
A
);
}
int
solve
(
const
Matrix
&
A
,
Vector
&
x
,
Vector
&
b
)
{
FUNCNAME
(
"ITL_OEMSolver_runner::solve()"
);
TEST_EXIT
(
preconPair
.
l
!=
NULL
)(
"there is no left preconditioner"
);
TEST_EXIT
(
preconPair
.
r
!=
NULL
)(
"there is no right preconditioner"
);
itl
::
cyclic_iteration
<
typename
Matrix
::
value_type
>
iter
(
b
,
oem
.
getMaxIterations
(),
oem
.
getRelative
(),
oem
.
getTolerance
(),
oem
.
getPrint_cycle
());
static
PreconPair
<
Vector
>
preconPair
;
if
(
preconPair
.
l
==
NULL
||
preconPair
.
r
==
NULL
||
!
oem
.
getMultipleRhs
())
BaseITL_runner
::
setPrecon
(
preconPair
,
A
);
int
error
=
ITLSolver
()(
A
,
x
,
b
,
*
(
preconPair
.
l
),
*
(
preconPair
.
r
),
iter
);
int
error
=
solver
(
A
,
x
,
b
,
*
(
preconPair
.
l
),
*
(
preconPair
.
r
),
iter
);
oem
.
setErrorCode
(
error
);
oem
.
setIterations
(
iter
.
iterations
());
oem
.
setResidual
(
iter
.
resid
());
return
error
;
}
private:
ITLSolver
solver
;
PreconPair
<
Vector
>
preconPair
;
};
}
AMDiS/src/MTL4Solver.h
View file @
6b371bfd
...
...
@@ -28,16 +28,20 @@ namespace AMDiS {
template
<
typename
MTLMatrix
,
typename
MTLVector
,
typename
Worker
>
class
MTL4Solver
:
public
OEMSolver
{
MTLMatrix
matrix
;
protected:
Worker
worker
;
template
<
typename
Matrix
,
typename
Vector
,
typename
Mapper
>
int
solve
(
const
Matrix
&
A
,
Vector
&
x
,
Vector
&
b
,
Mapper
&
mapper
)
{
MTLMatrix
matrix
(
mapper
.
nRow
(),
mapper
.
nCol
());
set_to_zero
(
matrix
);
MatMap
<
const
Matrix
,
Mapper
>
matMap
(
A
,
mapper
);
matrix
<<
matMap
;
if
(
num_rows
(
matrix
)
==
0
||
!
getMultipleRhs
()
)
{
matrix
.
change_dim
(
mapper
.
nRow
(),
mapper
.
nCol
());
set_to_zero
(
matrix
);
MatMap
<
const
Matrix
,
Mapper
>
matMap
(
A
,
mapper
);
matrix
<<
matMap
;
worker
.
init
(
matrix
);
}
MTLVector
mtl_x
(
mapper
.
nRow
());
set_to_zero
(
mtl_x
);
...
...
@@ -49,7 +53,7 @@ namespace AMDiS {
VecMap
<
Vector
,
Mapper
>
bVecMap
(
b
,
mapper
);
mtl_b
<<
bVecMap
;
error
=
worker
.
solve
(
matrix
,
mtl_x
,
mtl_b
);
error
=
worker
.
solve
(
matrix
,
mtl_x
,
mtl_b
);
mtl_x
>>
xVecMap
;
return
error
;
...
...
@@ -58,6 +62,7 @@ namespace AMDiS {
public:
MTL4Solver
(
std
::
string
n
)
:
OEMSolver
(
n
),
matrix
(
0
,
0
),
worker
(
this
)
{}
...
...
AMDiS/src/UmfPackSolver.h
View file @
6b371bfd
...
...
@@ -61,20 +61,27 @@ namespace AMDiS {
Parameters
::
get
(
oem
.
getName
()
+
"->alloc init"
,
alloc_init
);
}
void
init
(
const
Matrix
&
A
)
{
FUNCNAME
(
"Umfpack_runner::init()"
)
if
(
solver
!=
NULL
)
delete
solver
;
solver
=
new
mtl
::
matrix
::
umfpack
::
solver
<
matrix_type
>
(
A
,
symmetric_strategy
,
alloc_init
);
}
template
<
typename
Vector
>
int
solve
(
const
Matrix
&
A
,
Vector
&
x
,
Vector
&
b
)
{
FUNCNAME
(
"Umfpack_runner::solve()"
);
if
(
!
solver
)
{
solver
=
new
mtl
::
matrix
::
umfpack
::
solver
<
matrix_type
>
(
A
,
symmetric_strategy
,
alloc_init
);
}
else
{
if
(
!
oem
.
getMultipleRhs
())
{
if
(
store_symbolic
)
TEST_EXIT
(
solver
!=
NULL
)(
"The umfpack solver was not initialized
\n
"
);
#if 0
if (!oem.getMultipleRhs()) {
if (store_symbolic)
solver->update_numeric();
else
solver->update();
}
}
#endif
int
code
=
(
*
solver
)(
x
,
b
);
if
(
oem
.
getInfo
()
>
0
)
{
...
...
@@ -92,7 +99,7 @@ namespace AMDiS {
~
Umfpack_runner
()
{
if
(
!
solver
)
if
(
solver
!=
NULL
)
delete
solver
;
}
...
...
AMDiS/src/parallel/PITL_Solver.h
View file @
6b371bfd
...
...
@@ -32,17 +32,17 @@ namespace AMDiS {
typedef
ITL_BasePreconditioner
<
MTLVector
>
ParallelPreconditioner
;
template
<
typename
ITLSolver
>
class
PITL_Solver
:
public
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
>
>
{
class
PITL_Solver
:
public
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
,
MTLMatrix
,
MTLVector
>
>
{
public:
PITL_Solver
(
std
::
string
name
)
:
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
>
>
(
name
)
{}
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
,
MTLMatrix
,
MTLVector
>
>
(
name
)
{}
int
solveSystem
(
const
SolverMatrix
<
Matrix
<
DOFMatrix
*>
>&
A
,
SystemVector
&
x
,
SystemVector
&
b
,
ParallelMapper
&
m
)
{
return
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
>
>::
solve
(
A
,
x
,
b
,
m
);
return
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_runner
<
ITLSolver
,
MTLMatrix
,
MTLVector
>
>::
solve
(
A
,
x
,
b
,
m
);
}
...
...
@@ -61,17 +61,17 @@ namespace AMDiS {
};
template
<
typename
ITLSolver
>
class
PITL_Solver_para
:
public
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
>
>
{
class
PITL_Solver_para
:
public
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
,
MTLMatrix
,
MTLVector
>
>
{
public:
PITL_Solver_para
(
std
::
string
name
)
:
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
>
>
(
name
)
{}
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
,
MTLMatrix
,
MTLVector
>
>
(
name
)
{}
int
solveSystem
(
const
SolverMatrix
<
Matrix
<
DOFMatrix
*>
>&
A
,
SystemVector
&
x
,
SystemVector
&
b
,
ParallelMapper
&
m
)
{
return
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
>
>::
solve
(
A
,
x
,
b
,
m
);
return
AMDiS
::
MTL4Solver
<
MTLMatrix
,
MTLVector
,
ITL_OEMSolver_para_runner
<
ITLSolver
,
MTLMatrix
,
MTLVector
>
>::
solve
(
A
,
x
,
b
,
m
);
}
/// Creator class used in the OEMSolverMap.
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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