00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SECOND_ORDER_OPERATOR_HPP
00021 #define SECOND_ORDER_OPERATOR_HPP
00022
00023 #include <TinyMatrix.hpp>
00024 #include <PDEOperator.hpp>
00025
00039 class SecondOrderOperator
00040 : public PDEOperator
00041 {
00042 public:
00043 typedef
00044 TinyMatrix<3,3, ConstReferenceCounting<ScalarFunctionBase> >
00045 Matrix;
00048 private:
00049 ConstReferenceCounting<SecondOrderOperator::Matrix>
00050 __A;
00052 public:
00061 bool isSet(const int&i,
00062 const int&j) const
00063 {
00064 return ((*__A)(i,j) != 0);
00065 }
00066
00072 std::string typeName() const
00073 {
00074 return "SecondOrderOperator";
00075 }
00076
00085 ConstReferenceCounting<ScalarFunctionBase>
00086 A(const int&i, const int&j) const
00087 {
00088 return (*__A)(i,j);
00089 }
00090
00096 ConstReferenceCounting<SecondOrderOperator::Matrix>
00097 A() const
00098 {
00099 return __A;
00100 }
00101
00109 ConstReferenceCounting<PDEOperator>
00110 operator*(const ConstReferenceCounting<ScalarFunctionBase>& c) const
00111 {
00112 ReferenceCounting<SecondOrderOperator::Matrix> A2
00113 = new SecondOrderOperator::Matrix;
00114
00115 for (size_t i=0; i<3; ++i)
00116 for (size_t j=0; j<3; ++j) {
00117 if ((*__A)(i,j) != 0) {
00118 ScalarFunctionBuilder functionBuilder;
00119 functionBuilder.setFunction((*__A)(i,j));
00120 functionBuilder.setBinaryOperation(BinaryOperation::product,c);
00121 (*A2)(i,j) = functionBuilder.getBuiltFunction();
00122 }
00123 }
00124
00125 return (new SecondOrderOperator(A2));
00126 }
00127
00129
00134 ConstReferenceCounting<PDEOperator>
00135 operator-() const
00136 {
00137 ReferenceCounting<SecondOrderOperator::Matrix> A2
00138 = new SecondOrderOperator::Matrix;
00139
00140 for (size_t i=0; i<3; ++i)
00141 for (size_t j=0; j<3; ++j) {
00142 if ((*__A)(i,j) != 0) {
00143 ScalarFunctionBuilder functionBuilder;
00144 functionBuilder.setFunction((*__A)(i,j));
00145 functionBuilder.setUnaryMinus();
00146 (*A2)(i,j) = functionBuilder.getBuiltFunction();
00147 }
00148 }
00149
00150 return (new SecondOrderOperator(A2));
00151 }
00152
00158 SecondOrderOperator(ReferenceCounting<SecondOrderOperator::Matrix> A)
00159 : PDEOperator(PDEOperator::secondorderop,
00160 9),
00161 __A(A)
00162 {
00163 ;
00164 }
00165
00171 SecondOrderOperator(const SecondOrderOperator& O)
00172 : PDEOperator(O),
00173 __A(O.__A)
00174 {
00175 ;
00176 }
00177
00182 ~SecondOrderOperator()
00183 {
00184 ;
00185 }
00186 };
00187
00188 #endif // SECOND_ORDER_OPERATOR_HPP