1 |
// $Id$ |
|
2 |
/* |
/******************************************************* |
3 |
****************************************************************************** |
* |
4 |
* * |
* Copyright (c) 2003-2008 by University of Queensland |
5 |
* COPYRIGHT ACcESS 2004 - All Rights Reserved * |
* Earth Systems Science Computational Center (ESSCC) |
6 |
* * |
* http://www.uq.edu.au/esscc |
7 |
* This software is the property of ACcESS. No part of this code * |
* |
8 |
* may be copied in any form or by any means without the expressed written * |
* Primary Business: Queensland, Australia |
9 |
* consent of ACcESS. Copying, use or modification of this software * |
* Licensed under the Open Software License version 3.0 |
10 |
* by any unauthorised person is illegal unless that person has a software * |
* http://www.opensource.org/licenses/osl-3.0.php |
11 |
* license agreement with ACcESS. * |
* |
12 |
* * |
*******************************************************/ |
13 |
****************************************************************************** |
|
14 |
*/ |
|
15 |
|
#include "AbstractSystemMatrix.h" |
16 |
#include "escript/Data/AbstractSystemMatrix.h" |
#include "DataException.h" |
17 |
#include "escript/Data/FunctionSpace.h" |
#include "Data.h" |
18 |
#include "escript/Data/DataException.h" |
#include "DataTypes.h" |
|
#include "escript/Data/DataArrayView.h" |
|
19 |
|
|
20 |
namespace escript { |
namespace escript { |
21 |
|
|
48 |
return m_empty; |
return m_empty; |
49 |
} |
} |
50 |
|
|
51 |
Data operator*(const AbstractSystemMatrix& left, const Data& right) |
Data operator*(const AbstractSystemMatrix& left,const Data& right) |
52 |
{ |
{ |
53 |
return left.vectorMultiply(right); |
Data tmp=(Data) right; |
54 |
|
return left.vectorMultiply(tmp); |
55 |
} |
} |
56 |
|
|
57 |
Data AbstractSystemMatrix::vectorMultiply(const Data& right) const |
Data AbstractSystemMatrix::vectorMultiply(Data& right) const |
58 |
{ |
{ |
59 |
if (isEmpty()) |
if (isEmpty()) |
60 |
throw SystemMatrixException("Error - Matrix is empty."); |
throw SystemMatrixException("Error - Matrix is empty."); |
|
if (right.getFunctionSpace()!=getColumnFunctionSpace()) |
|
|
throw SystemMatrixException("Error - column function space and function space of input data do not match."); |
|
61 |
if (right.getDataPointSize()!=getColumnBlockSize()) |
if (right.getDataPointSize()!=getColumnBlockSize()) |
62 |
throw SystemMatrixException("Error - column block size and input data size do not match."); |
throw SystemMatrixException("Error - column block size and input data size do not match."); |
63 |
DataArrayView::ShapeType shape; |
DataTypes::ShapeType shape; |
64 |
if (getRowBlockSize()>1) shape.push_back(getRowBlockSize()); |
if (getRowBlockSize()>1) shape.push_back(getRowBlockSize()); |
65 |
|
|
66 |
Data out=Data(0.,shape,getRowFunctionSpace(),true); |
Data out=Data(0.,shape,getRowFunctionSpace(),true); |
67 |
ypAx(out,right); |
Data in=Data(right,getColumnFunctionSpace()); |
68 |
|
ypAx(out,in); |
69 |
return out; |
return out; |
70 |
} |
} |
71 |
|
|
72 |
void AbstractSystemMatrix::ypAx(Data& y,const Data& x) const |
void AbstractSystemMatrix::ypAx(Data& y,Data& x) const |
73 |
{ |
{ |
74 |
throw SystemMatrixException("Error - ypAx not available"); |
throw SystemMatrixException("Error - ypAx not available"); |
75 |
} |
} |
76 |
|
|
77 |
Data AbstractSystemMatrix::solve(const Data& in,const boost::python::dict& options) const |
Data AbstractSystemMatrix::solve(Data& in,const boost::python::dict& options) const |
78 |
{ |
{ |
79 |
if (isEmpty()) |
if (isEmpty()) |
80 |
throw SystemMatrixException("Error - Matrix is empty."); |
throw SystemMatrixException("Error - Matrix is empty."); |
82 |
throw SystemMatrixException("Error - row function space and function space of right hand side do not match."); |
throw SystemMatrixException("Error - row function space and function space of right hand side do not match."); |
83 |
if (in.getDataPointSize()!=getRowBlockSize()) |
if (in.getDataPointSize()!=getRowBlockSize()) |
84 |
throw SystemMatrixException("Error - row block size and right hand side size do not match."); |
throw SystemMatrixException("Error - row block size and right hand side size do not match."); |
85 |
DataArrayView::ShapeType shape; |
DataTypes::ShapeType shape; |
86 |
if (getRowBlockSize()>1) shape.push_back(getColumnBlockSize()); |
if (getRowBlockSize()>1) shape.push_back(getColumnBlockSize()); |
87 |
Data out=Data(0.,shape,getColumnFunctionSpace(),true); |
Data out=Data(0.,shape,getColumnFunctionSpace(),true); |
88 |
setToSolution(out,in,options); |
setToSolution(out,in,options); |
89 |
return out; |
return out; |
90 |
} |
} |
91 |
void AbstractSystemMatrix::setToSolution(Data& out,const Data& in,const boost::python::dict& options) const |
void AbstractSystemMatrix::setToSolution(Data& out,Data& in,const boost::python::dict& options) const |
92 |
{ |
{ |
93 |
throw SystemMatrixException("Error - setToSolution not available"); |
throw SystemMatrixException("Error - setToSolution not available"); |
94 |
} |
} |
96 |
{ |
{ |
97 |
throw SystemMatrixException("Error - Matrix Market interface not available."); |
throw SystemMatrixException("Error - Matrix Market interface not available."); |
98 |
} |
} |
99 |
void AbstractSystemMatrix:: setValue(const double value) const |
void AbstractSystemMatrix::saveHB(const std::string& fileName) const |
100 |
|
{ |
101 |
|
throw SystemMatrixException("Error - Harwell-Boeing interface not available."); |
102 |
|
} |
103 |
|
void AbstractSystemMatrix::resetValues() const |
104 |
{ |
{ |
105 |
|
throw SystemMatrixException("Error - setValue is not implemented."); |
106 |
} |
} |
107 |
|
|
108 |
} // end of namespace |
} // end of namespace |