1 |
/* |
2 |
****************************************************************************** |
3 |
* * |
4 |
* COPYRIGHT ACcESS 2004 - All Rights Reserved * |
5 |
* * |
6 |
* This software is the property of ACcESS. No part of this code * |
7 |
* may be copied in any form or by any means without the expressed written * |
8 |
* consent of ACcESS. Copying, use or modification of this software * |
9 |
* by any unauthorised person is illegal unless that person has a software * |
10 |
* license agreement with ACcESS. * |
11 |
* * |
12 |
****************************************************************************** |
13 |
*/ |
14 |
extern "C" { |
15 |
#include "finley/finleyC/System.h" |
16 |
} |
17 |
#include "escript/Data/Data.h" |
18 |
#include "finley/CPPAdapter/SystemMatrixAdapter.h" |
19 |
#include "finley/CPPAdapter/FinleyAdapterException.h" |
20 |
#include "finley/CPPAdapter/FinleyError.h" |
21 |
#include <boost/python/extract.hpp> |
22 |
|
23 |
using namespace std; |
24 |
|
25 |
namespace finley { |
26 |
|
27 |
SystemMatrixAdapter::SystemMatrixAdapter() |
28 |
{ |
29 |
throw FinleyAdapterException("Error - Illegal to generate default SystemMatrixAdapter."); |
30 |
} |
31 |
|
32 |
SystemMatrixAdapter::SystemMatrixAdapter(const Finley_SystemMatrix* system_matrix, |
33 |
const int row_blocksize, |
34 |
const escript::FunctionSpace& row_functionspace, |
35 |
const int column_blocksize, |
36 |
const escript::FunctionSpace& column_functionspace): |
37 |
AbstractSystemMatrix(row_blocksize,row_functionspace,column_blocksize,column_functionspace), |
38 |
m_system_matrix(system_matrix) |
39 |
{ |
40 |
} |
41 |
|
42 |
SystemMatrixAdapter::~SystemMatrixAdapter() |
43 |
{ |
44 |
if (m_system_matrix.unique()) { |
45 |
Finley_SystemMatrix* mat=m_system_matrix.get(); |
46 |
Finley_SystemMatrix_dealloc(mat); |
47 |
} |
48 |
} |
49 |
|
50 |
Finley_SystemMatrix* SystemMatrixAdapter::getFinley_SystemMatrix() const |
51 |
{ |
52 |
return m_system_matrix.get(); |
53 |
} |
54 |
|
55 |
void SystemMatrixAdapter::ypAx(escript::Data& y, const escript::Data& x) const |
56 |
{ |
57 |
Finley_SystemMatrix* mat=getFinley_SystemMatrix(); |
58 |
Finley_SystemMatrixVector(&(y.getDataC()),mat,&(x.getDataC())); |
59 |
checkFinleyError(); |
60 |
} |
61 |
|
62 |
void SystemMatrixAdapter::setToSolution(escript::Data& out, const escript::Data& in, const boost::python::dict& options) const |
63 |
{ |
64 |
Finley_SolverOptions finley_options; |
65 |
Finley_SystemMatrix_setDefaults(&finley_options); |
66 |
// extract options |
67 |
#define EXTRACT(__key__,__val__,__type__) if ( options.has_key(__key__)) finley_options.__val__=boost::python::extract<__type__>(options.get(__key__)) |
68 |
EXTRACT("verbose",verbose,int); |
69 |
EXTRACT("reordering",reordering,int); |
70 |
EXTRACT("tolerance",tolerance,double); |
71 |
EXTRACT("iterative_method",iterative_method,int); |
72 |
EXTRACT("preconditioner",preconditioner,int); |
73 |
EXTRACT("iter_max",iter_max,int); |
74 |
EXTRACT("drop_tolerance",drop_tolerance,double); |
75 |
EXTRACT("drop_storage",drop_storage,double); |
76 |
EXTRACT("iterative",iterative,int); |
77 |
#undef EXTRACT |
78 |
if (finley_options.iterative) { |
79 |
Finley_SystemMatrix_iterative(getFinley_SystemMatrix(),&(out.getDataC()),&(in.getDataC()),&finley_options); |
80 |
} else { |
81 |
Finley_SystemMatrix_solve(getFinley_SystemMatrix(),&(out.getDataC()),&(in.getDataC()),&finley_options); |
82 |
} |
83 |
checkFinleyError(); |
84 |
} |
85 |
|
86 |
void SystemMatrixAdapter::nullifyRowsAndCols(const escript::Data& row_q, const escript::Data& col_q, const double mdv) const |
87 |
{ |
88 |
Finley_SystemMatrix* system_matrix_ptr = getFinley_SystemMatrix(); |
89 |
escriptDataC row_qC = row_q.getDataC(); |
90 |
escriptDataC col_qC = col_q.getDataC(); |
91 |
|
92 |
Finley_SystemMatrix_nullifyRowsAndCols(system_matrix_ptr, &row_qC, &col_qC, mdv); |
93 |
} |
94 |
|
95 |
} // end of namespace |