00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SPECTRAL_LEGENDRE_DISCRETIZATION_CONFORM_HPP
00021 #define SPECTRAL_LEGENDRE_DISCRETIZATION_CONFORM_HPP
00022
00023 #include <Problem.hpp>
00024
00025 #include <DegreeOfFreedomSet.hpp>
00026 #include <SpectralMesh.hpp>
00027
00028 #include <DoubleHashedMatrix.hpp>
00029 #include <UnAssembledMatrix.hpp>
00030
00031 #include <Discretization.hpp>
00032 #include <ScalarDiscretizationTypeSpectral.hpp>
00033
00034 #include <Mesh.hpp>
00035
00036 #include <SpectralLegendreDiscretizer.hpp>
00037
00038 #include <ErrorHandler.hpp>
00039 #include <Timer.hpp>
00040
00041 class SpectralLegendreDiscretizationConform
00042 : public Discretization
00043 {
00044 private:
00045 SpectralLegendreDiscretizer __spectralLegendreDiscretizer;
00046
00047 const DegreeOfFreedomSet& __degreeOfFreedomSet;
00048
00049 const SpectralMesh& __mesh;
00050
00051 public:
00057 void assembleMatrix()
00058 {
00059 switch ((this->__A).type()) {
00060 case BaseMatrix::doubleHashedMatrix: {
00061 throw ErrorHandler(__FILE__,__LINE__,
00062 "Spectral Method cannot be used with assembled matrices",
00063 ErrorHandler::unexpected);
00064 }
00065 case BaseMatrix::unAssembled: {
00066 UnAssembledMatrix& A = dynamic_cast<UnAssembledMatrix&>(this->__A);
00067 A.setDiscretization(this);
00068 break;
00069 }
00070 default: {
00071 throw ErrorHandler(__FILE__,__LINE__,
00072 "unexpected matrix type",
00073 ErrorHandler::unexpected);
00074 }
00075 }
00076 }
00077
00084 void timesX(const BaseVector& u, BaseVector& v) const
00085 {
00086 dynamic_cast<Vector<real_t>&>(v)=0;
00087 __spectralLegendreDiscretizer.timesX(u,v);
00088 }
00089
00096 void transposedTimesX(const BaseVector& u, BaseVector& v) const
00097 {
00098 dynamic_cast<Vector<real_t>&>(v) = 0;
00099 __spectralLegendreDiscretizer.transposedTimesX(u,v);
00100 }
00101
00107 void getDiagonal(BaseVector& z) const
00108 {
00109 dynamic_cast<Vector<real_t>&>(z)=0;
00110 __spectralLegendreDiscretizer.getDiagonal(z);
00111 }
00112
00118 void getMultiDiagonal(BaseMatrix& A) const
00119 {
00120 A.reset();
00121 __spectralLegendreDiscretizer.getMultiDiagonal(A);
00122 }
00123
00128 void assembleSecondMember()
00129 {
00130 Timer t;
00131 t.start();
00132
00133 ffout(2) << "- assembling second member\n";
00134
00136 Vector<real_t>& b = (static_cast<Vector<real_t>&>(this->__b));
00137 b = 0;
00138
00139 __spectralLegendreDiscretizer.assembleSecondMember();
00140
00141 ffout(2) << "- assembling second member: done";
00142 t.stop();
00143 ffout(3) << " [cost: " << t << ']';
00144 ffout(2) << '\n';
00145 }
00146 public:
00147
00158 SpectralLegendreDiscretizationConform(const Problem& p,
00159 const SpectralMesh& m,
00160 BaseMatrix& a,
00161 BaseVector& bb,
00162 const DegreeOfFreedomSet& dof,
00163 const DiscretizationType& discretizationType);
00168 ~SpectralLegendreDiscretizationConform();
00169 };
00170
00171
00172 #endif // SPECTRAL_LEGENDRE_DISCRETIZATION_CONFORM_HPP