00001 #ifndef _MY_EqVarT_
00002 #define _MY_EqVarT_
00003 #include <fe/fe_q.h>
00004 #include <dofs/dof_tools.h>
00005 #include <fe/fe_values.h>
00006 #include <base/quadrature_lib.h>
00007 #include <lac/vector.h>
00008 #include <lac/full_matrix.h>
00009 #include "globals.h"
00010 #include <base/tensor.h>
00011 #include "vecdouble.h"
00012
00013
00014
00015
00016 class EqVarTAccessor;
00017
00018 class EqVarT
00019 {
00020 friend class EqVarTAccessor;
00021
00022 private:
00023 bool m_validFeValues;
00024 bool m_validFeFaceValues;
00025
00026 protected:
00027
00028 public:
00029
00030 private:
00031 UpdateFlags m_upFlags;
00032 DoFHandler<DIM>::active_cell_iterator *m_pCell;
00033 FEValues<DIM> *m_fev;
00034 FEFaceValues<DIM> *m_face_values;
00035 std::vector<unsigned int> m_dofIndices;
00036 unsigned m_qPoint;
00037 unsigned m_qPointFace;
00038
00039
00040
00041 void setCell(DoFHandler<DIM>::active_cell_iterator &cell){m_pCell = &cell;}
00042 void setQPoint(unsigned qpoint){m_qPoint = qpoint;}
00043
00044
00045 protected:
00046
00047 public:
00048 EqVarT(UpdateFlags up){m_upFlags = up;m_fev=NULL;m_face_values=NULL;}
00049 virtual ~EqVarT(){}
00050 void setFeValue(FEValues<DIM> *fe);
00051 bool validFeValues(){return m_validFeValues;}
00052 void setFaceValues(FEFaceValues<DIM> *face_values);
00053 bool validFeFaceValues(){return m_validFeFaceValues;}
00054
00055 std::vector<unsigned int>& getDofIndices(){return m_dofIndices;}
00056 void addNeumannBoundary(unsigned boundary_value);
00057 UpdateFlags getUpdateFlags(){return m_upFlags;}
00058 DoFHandler<DIM>::active_cell_iterator& getCell(){return *m_pCell;}
00059 double getSolValue(Vector<double> &sol);
00060 double getCoefSolValue(unsigned index,VecDouble &sol);
00061 double getSolGradComponent(Vector<double> &sol,int component);
00062 double getValueByCellIndex(const VecDouble &sol);
00063 Tensor<1,DIM> getSolGrad(VecDouble &sol);
00064 const FEValues<DIM>& getFEValues(){assert(validFeValues());return *m_fev;}
00065 unsigned getQPoint(){assert(validFeValues());return m_qPoint;}
00066 unsigned getQPointAtFace(){assert(validFeFaceValues());return m_qPointFace;}
00067
00068 double measure(){return getCell()->measure();}
00069 double localNeumannBoundary(unsigned i);
00070 double localEqVar(unsigned i,unsigned j);
00071 double localRhs(unsigned i);
00072
00073
00074
00075 unsigned component(unsigned i);
00076
00077
00078 unsigned component_face(unsigned i) {assert(m_face_values);return m_face_values->get_fe().system_to_component_index(i).first;}
00079
00080 unsigned base_function(unsigned i) { assert(validFeValues());return m_fev->get_fe().system_to_component_index(i).second;}
00081 unsigned base_element_mult(unsigned i){assert(validFeValues());return m_fev->get_fe().system_to_base_index(i).first.second;}
00082
00083
00084 bool changedCell(unsigned i,unsigned j) {return (i ==0 && j==0 && m_qPoint == 0);}
00085
00086
00087 const Point<DIM>& getPoint() {assert(validFeValues());return m_fev->quadrature_point(m_qPoint);}
00088 double shape_value(unsigned i) {assert(validFeValues());return m_fev->shape_value(i,m_qPoint);}
00089 const Tensor<1,DIM>& shape_grad(unsigned i) {assert(validFeValues());return m_fev->shape_grad(i,m_qPoint);}
00090 double shape_value(unsigned i,unsigned component) {assert(validFeValues());return m_fev->shape_value_component(i,getQPoint(),component);}
00091 Tensor<1,DIM> shape_grad (unsigned i,unsigned component) {assert(validFeValues());return m_fev->shape_grad_component(i,getQPoint(),component);}
00092 double shape_div(unsigned i);
00093 double JxW() {assert(validFeValues());return m_fev->JxW(m_qPoint);}
00094
00095
00096 double JFace() {assert(validFeFaceValues());return m_face_values->JxW(m_qPointFace);}
00097 double JxWFace() {assert(validFeFaceValues());return m_face_values->JxW(m_qPointFace);}
00098 FEFaceValues<DIM>& getFEFaceValues() {assert(validFeFaceValues());return *m_face_values;}
00099
00100 const Point<DIM>& getPointAtFace() {assert(validFeFaceValues());return m_face_values->quadrature_point(m_qPointFace);}
00101 const Tensor<1,DIM>& normal_vector() {assert(validFeFaceValues());return m_face_values->normal_vector(m_qPointFace);}
00102 const Tensor<1,DIM>& shape_grad_face (unsigned i) {assert(validFeFaceValues());return m_face_values->shape_grad(i,m_qPointFace);}
00103 double shape_value_face(unsigned i) {assert(validFeFaceValues());return m_face_values->shape_value(i,m_qPointFace);}
00104
00105
00106 void changedCellEvent(){}
00107 void changedQPointEvent(){}
00108 void changedCellRHSEvent(){changedCellEvent();}
00109
00110 void changedQPointRHSEvent(){}
00111
00112 void changedQPointFaceEvent(){}
00113
00114
00115
00116 };
00117
00118 #endif