00001 00005 class FieldFE : public FieldWithPtValues 00006 00007 { 00008 friend class FieldsFE; 00009 00010 protected: 00011 Handle(GridFE) mesh; 00012 Handle(Vec(NUMT)) nodal_values; 00013 Handle(FiniteElement) globfe; 00014 Handle(BasisFuncGrid) bfnodes; 00015 00016 Handle(ArrayGen(NUMT)) lattice_indexing; 00017 bool internal_basis_func_grid; 00018 00019 00020 int init4e; 00021 Vec(NUMT) loc_nodal_values; 00022 bool different_bfgrid; 00023 bool different_geomgrid; 00024 int nbf; 00025 void precompute4interpolation (const FiniteElement& fe); 00026 int ncalls_valuePt; 00027 00028 bool renumbered; 00029 00030 Handle(MxMapping) map; 00031 00032 bool reallocate 00033 ( 00034 const GridFE& grid, 00035 const Vec(NUMT)* coeff, 00036 const BasisFuncGrid* sfg, 00037 const char* fieldname 00038 ); 00039 00040 public: 00041 FieldFE (); 00042 FieldFE (const GridFE& grid, const char* fieldname); 00043 FieldFE (const GridFE& grid, const Vec(NUMT)& coefficients, 00044 const char* fieldname); 00045 FieldFE (const BasisFuncGrid& bfnodes_grid, const char* fieldname); 00046 FieldFE (const BasisFuncGrid& bfnodes_grid, const Vec(NUMT)& coefficients, 00047 const char* fieldname); 00048 00049 ~FieldFE (); 00050 00051 bool update (); 00052 bool compatible (const GridFE& g); 00053 00054 bool updateNodalNumbering (); 00055 00056 bool redim (const FieldFE& f, const char* fieldname); 00057 bool redim (const GridFE& grid, const char* fieldname); 00058 bool redim (const BasisFuncGrid& bfnodes_grid, 00059 const char* fieldname); 00060 bool redim (const GridFE& grid, const Vec(NUMT)& coefficients, 00061 const char* fieldname); 00062 bool redim (const BasisFuncGrid& bfnodes_grid, 00063 const Vec(NUMT)& coefficients, const char* fieldname); 00064 00065 GridFE& grid () { return mesh.getRef(); } 00066 const GridFE& grid () const { return mesh.getRef(); } 00067 00068 BasisFuncGrid& grid4basisFunc () { return bfnodes.getRef(); } 00069 const BasisFuncGrid& grid4basisFunc () const { return bfnodes.getRef(); } 00070 00071 Vec(NUMT)& values () { return nodal_values.getRef();} 00072 const Vec(NUMT)& values () const { return nodal_values.getRef();} 00073 void localValues (VecSimple(NUMT)& local_values, int elm_no) const; 00074 00075 void fill (const Vector(NUMT)& new_values); 00076 int getNoNodes () const; 00077 00078 bool valueNodeRepresentation() const; 00079 bool simpleTopology() const; 00080 00081 bool isLattice (int nsd) const; 00082 const ArrayGen(NUMT)& latticeIndex () const { return lattice_indexing(); } 00083 ArrayGen(NUMT)& latticeIndex () { return lattice_indexing(); } 00084 00085 void exchangeValues (FieldFE& f); 00086 00087 virtual bool ok () const; 00088 bool empty () const; 00089 virtual void minmax (NUMT& min, NUMT& max, GridWithPts* grid =NULL) const; 00090 00091 NUMT valueElm (int elm_no, const Ptv(real)& local_pt, real t = DUMMY); 00092 NUMT valueElm (int elm_no, const Ptv(real)& local_pt, real t = DUMMY) const 00093 { return CAST_CONST_AWAY(FieldFE)->valueElm(elm_no, local_pt,t); } 00094 00095 00096 virtual NUMT valueFEM (const FiniteElement& fe, real t = DUMMY); 00097 00098 virtual NUMT valuePt (const Ptv(real)& x, real t = DUMMY); 00099 NUMT valuePt (int& element, Ptv(real)& loc_pt, 00100 const Ptv(real)& x, real t = DUMMY); 00101 00102 NUMT& valueNode (int node, real t = DUMMY); 00103 virtual NUMT valueNode (int node, real t = DUMMY) const; 00104 00105 virtual Ptv(NUMT) derivativePt (const Ptv(real)& x, real t = DUMMY); 00106 Ptv(NUMT) derivativePt (const Ptv(real)& x, real t = DUMMY) const 00107 { return CAST_CONST_AWAY(FieldFE)->derivativePt(x,t); } 00108 00109 virtual void derivativeNode (Ptv(NUMT)& gradient, int node, 00110 real t = DUMMY); 00111 00112 virtual void derivativeFEM (Ptv(NUMT)& gradient, const FiniteElement& fe, 00113 real t = DUMMY); 00114 00115 void derivativeFEM 00116 (Ptv(NUMT)& gradient, const FiniteElement& fe, real t = DUMMY) const 00117 { CAST_CONST_AWAY(FieldFE)->derivativeFEM (gradient, fe, t); } 00118 00119 void derivativeElm (Ptv(NUMT)& gradient, int elm_no, 00120 const Ptv(real)& local_pt, real t = DUMMY); 00121 00122 void derivativeElm (Ptv(NUMT)& gradient, int elm_no, 00123 const Ptv(real)& local_pt, real t = DUMMY) const 00124 { CAST_CONST_AWAY(FieldFE)->derivativeElm (gradient, elm_no, local_pt, t); } 00125 00126 virtual void hessianPt (Ptv(NUMT)&, const Ptv(real)& x, real = DUMMY); 00127 virtual void hessianFEM (Ptv(NUMT)&, const FiniteElement& fe, real = DUMMY); 00128 void hessianElm (Ptv(NUMT)&, int, const Ptv(real)&, real = DUMMY); 00129 00130 00131 void interpolate (const FieldFE& fefield); 00132 void interpolate (const FieldLattice& fdfield); 00133 00134 00135 00136 void operator = (const FieldFE& fefield); 00137 void operator = (const FieldLattice& fdfield); 00138 void operator = (const FieldFunc& func); 00139 void fill (const FieldFunc& func, real time); 00140 00141 virtual void fill (NUMT value); 00142 virtual void add (NUMT value); 00143 virtual void mult (NUMT value); 00144 virtual void apply (Func(NUMT) f); 00145 virtual void add (Field& field, int power, NUMT front_factor); 00146 void add (const FieldFE& f); 00147 00148 virtual Field& scale (); 00149 virtual Field& unscale (); 00150 00151 virtual void unloadData (Os os) const; 00152 virtual void loadData (Is is); 00153 virtual void attach (Grid& grid); 00154 virtual Grid* getGridBase(); 00155 00156 00157 00158 virtual int getNoPoints () const; 00159 virtual int getNoValues () const; 00160 00161 virtual NUMT& valuePoint (int point_no) 00162 { return nodal_values( (point_no);) } 00163 00164 virtual NUMT valuePoint (int point_no) const 00165 { return nodal_values( (point_no);) } 00166 00167 virtual Ptv(real) getPt (int point_no) const 00168 { return bfnodes->getCoor(point_no); } 00169 00170 virtual GridWithPts& getGridWithPts () 00171 { return mesh.getRef(); } 00172 00173 virtual const GridWithPts& getGridWithPts () const 00174 { return mesh.getRef(); } 00175 00176 virtual Vec(NUMT)& valuesVec () 00177 { return nodal_values.getRef(); } 00178 00179 virtual const Vec(NUMT)& valuesVec () const 00180 { return nodal_values.getRef(); } 00181 00182 CLASS_INFO 00183 VIRTUAL_CAST(FieldFE); 00184 00185 COPY_CONSTRUCTOR(FieldFE); 00186 00187 virtual void print (Os os) const; 00188 void scan (Is is); 00189 }; 00190 00191