00001
00029 #ifndef BASISFUNCTIONSPROVIDED
00030 #define BASISFUNCTIONSPROVIDED
00031
00032 #include "Shape.h"
00033 #include "Quadrature.h"
00034 #include "ElementGeometry.h"
00035 #include "BasisFunctions.h"
00036 #include <iostream>
00037
00045 class BasisFunctionsProvidedExternalQuad: public BasisFunctions {
00046 public:
00066 inline BasisFunctionsProvidedExternalQuad (const std::vector<double> &ShapesInput,
00067 const std::vector<double> &DShapesInput, const std::vector<double> &QuadratureWeights,
00068 const std::vector<double> &QuadratureCoords) :
00069 LocalShapes (ShapesInput), LocalDShapes (DShapesInput),
00070 LocalWeights (QuadratureWeights), LocalCoordinates (QuadratureCoords) {
00071
00072
00073
00074 if (LocalShapes.size () % LocalWeights.size () != 0
00075 || LocalCoordinates.size () % LocalWeights.size () != 0
00076 || LocalDShapes.size () % LocalWeights.size () != 0
00077 || LocalDShapes.size () % LocalShapes.size () != 0) {
00078 std::cerr << "BasisFunctionsProvidedExternalQuad::Constructor. Error\n"
00079 " Inconsistent length of some of the vectors provided\n";
00080 exit (1);
00081 }
00082 NumberOfShapes = LocalShapes.size () / LocalWeights.size ();
00083 }
00084
00100 inline BasisFunctionsProvidedExternalQuad (size_t NShapes,
00101 const std::vector<double> &DShapesInput, const std::vector<double> &QuadratureWeights,
00102 const std::vector<double> &QuadratureCoords) :
00103 LocalShapes (ZeroSizeVector), LocalDShapes (DShapesInput), NumberOfShapes (NShapes),
00104 LocalWeights (QuadratureWeights), LocalCoordinates (QuadratureCoords) {
00105
00106
00107 if (LocalCoordinates.size () % LocalWeights.size () != 0 || LocalDShapes.size ()
00108 % (LocalWeights.size () * NShapes) != 0 || LocalDShapes.size () % NShapes != 0) {
00109 std::cerr << "BasisFunctionsProvidedExternalQuad::Constructor. Error\n"
00110 " Inconsistent length of some of the vectors provided\n";
00111 exit (1);
00112 }
00113 }
00114
00115 inline virtual ~BasisFunctionsProvidedExternalQuad () {
00116 }
00117
00118 inline BasisFunctionsProvidedExternalQuad (const BasisFunctionsProvidedExternalQuad &NewBas) :
00119 LocalShapes (NewBas.LocalShapes), LocalDShapes (NewBas.LocalDShapes),
00120 NumberOfShapes (NewBas.NumberOfShapes) , LocalWeights (NewBas.LocalWeights), LocalCoordinates (NewBas.LocalCoordinates) {
00121 }
00122
00123 virtual BasisFunctionsProvidedExternalQuad * clone () const {
00124 return new BasisFunctionsProvidedExternalQuad (*this);
00125 }
00126
00130 inline const std::vector<double> & getShapes () const {
00131 return LocalShapes;
00132 }
00133
00138 inline const std::vector<double> & getDShapes () const {
00139 return LocalDShapes;
00140 }
00141
00143 inline const std::vector<double> & getIntegrationWeights () const {
00144 return LocalWeights;
00145 }
00146
00151 inline const std::vector<double> & getQuadraturePointCoordinates () const {
00152 return LocalCoordinates;
00153 }
00154
00156 inline size_t getBasisDimension () const {
00157 return NumberOfShapes;
00158 }
00159
00161 inline size_t getNumberOfDerivativesPerFunction () const {
00162 return LocalDShapes.size () / (NumberOfShapes * LocalWeights.size ());
00163 }
00164
00166 inline size_t getSpatialDimensions () const {
00167 return LocalCoordinates.size () / LocalWeights.size ();
00168 }
00169
00170 private:
00171 const std::vector<double>& LocalShapes;
00172 const std::vector<double>& LocalDShapes;
00173 size_t NumberOfShapes;
00174
00175 protected:
00176 const std::vector<double>& LocalWeights;
00177 const std::vector<double>& LocalCoordinates;
00178 static const std::vector<double> ZeroSizeVector;
00179 };
00180
00188 class BasisFunctionsProvided: public BasisFunctionsProvidedExternalQuad {
00189 public:
00206 inline BasisFunctionsProvided (const std::vector<double> &ShapesInput,
00207 const std::vector<double> &DShapesInput, const std::vector<double> &QuadratureWeights,
00208 const std::vector<double> &QuadratureCoords) :
00209 BasisFunctionsProvidedExternalQuad (ShapesInput, DShapesInput, QuadratureWeights, QuadratureCoords) {
00210 }
00211
00212 inline virtual ~BasisFunctionsProvided () {
00213 }
00214 inline BasisFunctionsProvided (const BasisFunctionsProvided &NewBas) :
00215 BasisFunctionsProvidedExternalQuad (NewBas) {
00216 }
00217
00218 virtual BasisFunctionsProvided * clone () const {
00219 return new BasisFunctionsProvided (*this);
00220 }
00221
00222 };
00223
00224 #endif
00225