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
iwr
amdis
Commits
8698e7fe
Commit
8698e7fe
authored
Jun 07, 2011
by
Thomas Witkowski
Browse files
Initfiles in AMDiS code style.
parent
f025c9bb
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/Initfile.cc
View file @
8698e7fe
...
...
@@ -8,153 +8,164 @@ using namespace std;
namespace
AMDiS
{
/// the small parser for the initfile. see description of read(Initfile&, istream&)
struct
Parser
{
Parser
(
const
string
&
line
)
{
size_t
pos
=
line
.
find
(
':'
);
if
(
pos
==
string
::
npos
)
throw
runtime_error
(
"cannot find the delimiter ':' in line '"
+
line
+
"'"
);
name
=
line
.
substr
(
0
,
pos
);
value
=
line
.
substr
(
pos
+
1
,
line
.
length
()
-
(
pos
+
1
));
// remove everything after the %
pos
=
value
.
find
(
'%'
);
if
(
pos
!=
string
::
npos
)
{
value
=
value
.
substr
(
0
,
pos
);
}
}
string
name
;
string
value
;
};
Initfile
*
Initfile
::
singlett
=
NULL
;
std
::
set
<
std
::
string
>
Initfile
::
fn_include_list
;
/// initialize singleton object an global parameters
void
Initfile
::
init
(
std
::
string
in
)
{
initIntern
();
singlett
->
clear
();
fn_include_list
.
clear
();
singlett
->
read
(
in
);
singlett
->
getInternalParameters
();
/// the small parser for the initfile. see description of read(Initfile&, istream&)
struct
Parser
{
Parser
(
const
string
&
line
)
{
size_t
pos
=
line
.
find
(
':'
);
if
(
pos
==
string
::
npos
)
throw
runtime_error
(
"cannot find the delimiter ':' in line '"
+
line
+
"'"
);
name
=
line
.
substr
(
0
,
pos
);
value
=
line
.
substr
(
pos
+
1
,
line
.
length
()
-
(
pos
+
1
));
// remove everything after the %
pos
=
value
.
find
(
'%'
);
if
(
pos
!=
string
::
npos
)
value
=
value
.
substr
(
0
,
pos
);
}
string
name
;
string
value
;
};
Initfile
*
Initfile
::
singlett
=
NULL
;
std
::
set
<
std
::
string
>
Initfile
::
fn_include_list
;
/// initialize singleton object an global parameters
void
Initfile
::
init
(
std
::
string
in
)
{
initIntern
();
singlett
->
clear
();
fn_include_list
.
clear
();
singlett
->
read
(
in
);
singlett
->
getInternalParameters
();
// initialize global strcutures using parameters
Global
::
init
();
};
/// Fill an initfile from a file with filename fn
void
Initfile
::
read
(
std
::
string
fn
)
{
// read file if its not parsed already
if
(
fn_include_list
.
find
(
fn
)
==
fn_include_list
.
end
())
{
std
::
ifstream
inputFile
;
inputFile
.
open
(
fn
.
c_str
(),
std
::
ios
::
in
);
if
(
!
inputFile
.
is_open
())
throw
runtime_error
(
"init-file cannot be opened for reading"
);
// initialize global strcutures using parameters
Global
::
init
();
}
/// Fill an initfile from a file with filename fn
void
Initfile
::
read
(
std
::
string
fn
)
{
// read file if its not parsed already
if
(
fn_include_list
.
find
(
fn
)
==
fn_include_list
.
end
())
{
std
::
ifstream
inputFile
;
inputFile
.
open
(
fn
.
c_str
(),
std
::
ios
::
in
);
if
(
!
inputFile
.
is_open
())
throw
runtime_error
(
"init-file cannot be opened for reading"
);
fn_include_list
.
insert
(
fn
);
read
(
inputFile
);
}
};
/// Fill an initfile from an input stream
void
Initfile
::
read
(
istream
&
in
)
{
unsigned
line_length
=
256
;
char
swap
[
line_length
];
in
.
getline
(
swap
,
line_length
);
while
(
in
.
good
())
{
std
::
string
whitespaces
=
"
\t\r\f
"
;
std
::
string
sw
(
swap
);
size_t
pos0
=
sw
.
find_first_not_of
(
whitespaces
);
fn_include_list
.
insert
(
fn
);
read
(
inputFile
);
}
}
/// Fill an initfile from an input stream
void
Initfile
::
read
(
istream
&
in
)
{
unsigned
line_length
=
256
;
char
swap
[
line_length
];
in
.
getline
(
swap
,
line_length
);
while
(
in
.
good
())
{
std
::
string
whitespaces
=
"
\t\r\f
"
;
std
::
string
sw
(
swap
);
size_t
pos0
=
sw
.
find_first_not_of
(
whitespaces
);
if
(
pos0
!=
std
::
string
::
npos
&&
sw
[
pos0
]
!=
'%'
&&
sw
[
pos0
]
!=
'#'
&&
sw
[
pos0
]
!=
0
)
{
// parse line and extract map: tag->value
Parser
parser
(
sw
);
operator
[](
parser
.
name
)
=
parser
.
value
;
}
else
if
(
sw
[
pos0
]
==
'#'
&&
static_cast
<
size_t
>
(
sw
.
find
(
"#include"
))
==
pos0
)
{
// include file by '#include "filename"' or '#include <filename>'
size_t
pos
=
sw
.
find_first_not_of
(
whitespaces
,
std
::
string
(
"#include"
).
size
()
+
1
);
size_t
epos
=
0
;
std
::
string
fn
=
""
;
std
::
stringstream
errorMsg
;
switch
(
char
c
=
swap
[
pos
++
])
{
case
'<'
:
c
=
'>'
;
case
'\"'
:
whitespaces
+=
c
;
epos
=
sw
.
find_first_of
(
whitespaces
,
pos
);
fn
=
sw
.
substr
(
pos
,
epos
-
pos
);
if
(
pos0
!=
std
::
string
::
npos
&&
sw
[
pos0
]
!=
'%'
&&
sw
[
pos0
]
!=
'#'
&&
sw
[
pos0
]
!=
0
)
{
// parse line and extract map: tag->value
Parser
parser
(
sw
);
operator
[](
parser
.
name
)
=
parser
.
value
;
}
else
if
(
sw
[
pos0
]
==
'#'
&&
static_cast
<
size_t
>
(
sw
.
find
(
"#include"
))
==
pos0
)
{
// include file by '#include "filename"' or '#include <filename>'
size_t
pos
=
sw
.
find_first_not_of
(
whitespaces
,
std
::
string
(
"#include"
).
size
()
+
1
);
size_t
epos
=
0
;
std
::
string
fn
=
""
;
std
::
stringstream
errorMsg
;
switch
(
char
c
=
swap
[
pos
++
])
{
case
'<'
:
c
=
'>'
;
case
'\"'
:
whitespaces
+=
c
;
epos
=
sw
.
find_first_of
(
whitespaces
,
pos
);
fn
=
sw
.
substr
(
pos
,
epos
-
pos
);
if
(
sw
[
epos
]
!=
c
)
{
errorMsg
<<
"filename in #include not terminated by "
<<
c
;
throw
std
::
runtime_error
(
errorMsg
.
str
());
}
break
;
default:
throw
std
::
runtime_error
(
"no filename given for #include"
);
}
read
(
fn
);
}
in
.
getline
(
swap
,
line_length
);
}
};
void
Initfile
::
readArgv
(
int
argc
,
char
**
argv
)
{
for
(
int
i
=
0
;
i
<
argc
;
++
i
)
{
if
(
strcmp
(
"-rs"
,
argv
[
i
])
==
0
)
{
std
::
string
input
(
argv
[
i
+
1
]);
add
(
"argv->rs"
,
input
,
0
);
}
if
(
sw
[
epos
]
!=
c
)
{
errorMsg
<<
"filename in #include not terminated by "
<<
c
;
throw
std
::
runtime_error
(
errorMsg
.
str
());
}
break
;
default:
throw
std
::
runtime_error
(
"no filename given for #include"
);
}
}
read
(
fn
);
}
in
.
getline
(
swap
,
line_length
);
}
}
/// read standard values for output and information of parameter-values
void
Initfile
::
getInternalParameters
()
{
int
val
=
0
;
get
(
"level of information"
,
val
,
0
);
msgInfo
=
val
;
val
=
1
;
get
(
"WAIT"
,
val
,
0
);
msgWait
=
val
;
void
Initfile
::
readArgv
(
int
argc
,
char
**
argv
)
{
for
(
int
i
=
0
;
i
<
argc
;
i
++
)
{
if
(
strcmp
(
"-rs"
,
argv
[
i
])
==
0
)
{
std
::
string
input
(
argv
[
i
+
1
]);
add
(
"argv->rs"
,
input
,
0
);
}
}
}
/// read standard values for output and information of parameter-values
void
Initfile
::
getInternalParameters
()
{
int
val
=
0
;
get
(
"level of information"
,
val
,
0
);
msgInfo
=
val
;
val
=
1
;
get
(
"
parameter information
"
,
val
,
0
);
paramInfo
=
val
;
val
=
1
;
get
(
"
WAIT
"
,
val
,
0
);
msgWait
=
val
;
val
=
0
;
get
(
"break on missing tag"
,
val
,
0
);
breakOnMissingTag
=
val
;
if
(
msgInfo
==
0
)
paramInfo
=
0
;
};
/// print all parameters to std::cout
void
Initfile
::
printParameters
()
{
initIntern
();
Initfile
::
iterator
it
;
for
(
it
=
singlett
->
begin
();
it
!=
singlett
->
end
();
it
++
)
std
::
cout
<<
(
*
it
).
first
<<
" => "
<<
(
*
it
).
second
<<
std
::
endl
;
};
/// Write data-map to initfile
void
Initfile
::
write
(
ostream
&
out
)
{
Initfile
::
iterator
it
;
for
(
it
=
begin
()
;
it
!=
end
();
it
++
)
out
<<
(
*
it
).
first
<<
": "
<<
(
*
it
).
second
<<
std
::
endl
;
val
=
1
;
get
(
"parameter information"
,
val
,
0
);
paramInfo
=
val
;
};
/// Write data-map to initfile
void
Initfile
::
write
(
std
::
string
fn
)
{
std
::
ofstream
outFile
;
outFile
.
open
(
fn
.
c_str
(),
std
::
ios
::
out
);
if
(
!
outFile
.
is_open
())
throw
runtime_error
(
"init-file cannot be opened for writing"
);
val
=
0
;
get
(
"break on missing tag"
,
val
,
0
);
breakOnMissingTag
=
val
;
if
(
msgInfo
==
0
)
paramInfo
=
0
;
}
/// print all parameters to std::cout
void
Initfile
::
printParameters
()
{
initIntern
();
for
(
Initfile
::
iterator
it
=
singlett
->
begin
();
it
!=
singlett
->
end
();
it
++
)
std
::
cout
<<
(
*
it
).
first
<<
" => "
<<
(
*
it
).
second
<<
std
::
endl
;
}
/// Write data-map to initfile
void
Initfile
::
write
(
ostream
&
out
)
{
for
(
Initfile
::
iterator
it
=
begin
()
;
it
!=
end
();
it
++
)
out
<<
(
*
it
).
first
<<
": "
<<
(
*
it
).
second
<<
std
::
endl
;
}
/// Write data-map to initfile
void
Initfile
::
write
(
std
::
string
fn
)
{
std
::
ofstream
outFile
;
outFile
.
open
(
fn
.
c_str
(),
std
::
ios
::
out
);
if
(
!
outFile
.
is_open
())
throw
runtime_error
(
"init-file cannot be opened for writing"
);
write
(
outFile
);
}
;
write
(
outFile
);
}
}
AMDiS/src/Initfile.h
View file @
8698e7fe
This diff is collapsed.
Click to expand it.
AMDiS/src/UmfPackSolver.h
View file @
8698e7fe
...
...
@@ -50,13 +50,15 @@ namespace AMDiS {
oem
(
*
oem_
),
solver
(
NULL
),
store_symbolic
(
0
),
symmetric_strategy
(
0
)
symmetric_strategy
(
0
),
alloc_init
(
0.7
)
{
FUNCNAME
(
"Umfpack_runner::Umfpack_runner()"
);
TEST_EXIT_DBG
(
oem_
!=
NULL
)(
"Need real OEMSolver
\n
"
);
Parameters
::
get
(
oem
.
getName
()
+
"->store symbolic"
,
store_symbolic
);
Parameters
::
get
(
oem
.
getName
()
+
"->symmetric strategy"
,
symmetric_strategy
);
Parameters
::
get
(
oem
.
getName
()
+
"->alloc init"
,
alloc_init
);
}
template
<
typename
Vector
>
...
...
@@ -64,10 +66,7 @@ namespace AMDiS {
{
FUNCNAME
(
"Umfpack_runner::solve()"
);
if
(
!
solver
)
{
if
(
!
symmetric_strategy
)
solver
=
new
mtl
::
matrix
::
umfpack
::
solver
<
matrix_type
>
(
A
);
else
solver
=
new
mtl
::
matrix
::
umfpack
::
solver
<
matrix_type
>
(
A
,
UMFPACK_STRATEGY_SYMMETRIC
);
solver
=
new
mtl
::
matrix
::
umfpack
::
solver
<
matrix_type
>
(
A
,
symmetric_strategy
,
alloc_init
);
}
else
{
if
(
!
oem
.
getMultipleRhs
())
{
if
(
store_symbolic
)
...
...
@@ -101,7 +100,10 @@ namespace AMDiS {
mtl
::
matrix
::
umfpack
::
solver
<
matrix_type
>
*
solver
;
int
store_symbolic
;
int
symmetric_strategy
;
double
alloc_init
;
};
using
namespace
MTLTypes
;
...
...
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