NGSolve
4.9
|
00001 #ifndef FILE_LINEARFORM 00002 #define FILE_LINEARFORM 00003 00004 /*********************************************************************/ 00005 /* File: linearform.hh */ 00006 /* Author: Joachim Schoeberl */ 00007 /* Date: 25. Mar. 2000 */ 00008 /*********************************************************************/ 00009 00010 namespace ngcomp 00011 { 00012 00017 class NGS_DLL_HEADER LinearForm : public NGS_Object 00018 { 00019 protected: 00021 const FESpace & fespace; 00023 Array<LinearFormIntegrator*> parts; 00025 Array<bool> parts_deletable; 00027 bool independent; 00029 bool print; 00031 bool printelvec; 00032 00033 bool allocated; 00034 bool assembled; 00035 bool initialassembling; 00036 00037 int cacheblocksize; 00038 public: 00040 LinearForm (const FESpace & afespace, 00041 const string & aname, const Flags & flags); 00042 00044 virtual ~LinearForm (); 00045 00047 const FESpace & GetFESpace() const 00048 { return fespace; } 00049 00050 00052 virtual void AddIntegrator (LinearFormIntegrator * lfi, bool deletable = true); 00053 00055 virtual const LinearFormIntegrator * GetIntegrator (int i) const 00056 { 00057 return parts[i]; 00058 } 00059 00060 virtual LinearFormIntegrator * GetIntegrator (int i) 00061 { 00062 return parts[i]; 00063 } 00064 00066 virtual int NumIntegrators () const 00067 { 00068 return parts.Size(); 00069 } 00070 00071 00072 void SetIndependent (int aindependent = true) 00073 { independent = aindependent; } 00074 00075 00077 virtual void Assemble (LocalHeap & lh) = 0; 00078 00079 virtual void CleanUpLevel() { ; } 00080 00081 virtual bool IsAssembled (void); 00082 bool InitialAssembling (void); 00083 void SetNoInitialAssembling (void); 00084 00085 00087 virtual BaseVector & GetVector () const = 0; 00088 operator BaseVector& () const { return GetVector(); } 00089 00091 virtual string GetClassName () const 00092 { 00093 return "LinearForm"; 00094 } 00095 00096 void SetPrint (bool ap); 00097 void SetPrintElmat (bool ap); 00098 00100 virtual void PrintReport (ostream & ost); 00102 virtual void MemoryUsage (Array<MemoryUsageStruct*> & mu) const; 00103 00104 00105 virtual void AddElementVector (const Array<int> & dnums, 00106 const FlatVector<double> & elvec, 00107 const int cachecomp = -1); 00108 virtual void SetElementVector (const Array<int> & dnums, 00109 const FlatVector<double> & elvec); 00110 virtual void GetElementVector (const Array<int> & dnums, 00111 FlatVector<double> & elvec) const; 00112 00113 virtual void AddElementVector (const Array<int> & dnums, 00114 const FlatVector<Complex> & elvec, 00115 const int cachecomp = -1); 00116 virtual void SetElementVector (const Array<int> & dnums, 00117 const FlatVector<Complex> & elvec); 00118 virtual void GetElementVector (const Array<int> & dnums, 00119 FlatVector<Complex> & elvec) const; 00120 00121 00122 00123 virtual void SetCacheBlockSize (const int size) 00124 { 00125 cacheblocksize = size; 00126 } 00127 }; 00128 00129 00130 template <class SCAL> 00131 class NGS_DLL_HEADER S_LinearForm : public LinearForm 00132 { 00133 public: 00134 typedef SCAL TSCAL; 00135 00137 S_LinearForm (const FESpace & afespace, 00138 const string & aname, 00139 const Flags & flags) 00140 : LinearForm (afespace, aname, flags) 00141 { 00142 ; 00143 } 00144 00146 virtual void AllocateVector () = 0; 00147 00149 virtual void AddElementVector (const Array<int> & dnums, 00150 const FlatVector<SCAL> & elvec, 00151 const int cachecomp = -1) = 0; 00152 virtual void SetElementVector (const Array<int> & dnums, 00153 const FlatVector<SCAL> & elvec) = 0; 00154 virtual void GetElementVector (const Array<int> & dnums, 00155 FlatVector<SCAL> & elvec) const = 0; 00156 00158 virtual void Assemble (LocalHeap & lh); 00159 void AssembleIndependent (LocalHeap & lh); 00160 }; 00161 00162 00163 00164 00165 00166 00168 template <class TV> 00169 class NGS_DLL_HEADER T_LinearForm : public S_LinearForm<typename mat_traits<TV>::TSCAL> 00170 { 00172 ngla::VVector<TV> * vec; 00173 00174 public: 00175 00176 typedef typename mat_traits<TV>::TSCAL TSCAL; 00177 enum { HEIGHT = mat_traits<TV>::HEIGHT }; 00178 00180 T_LinearForm (const FESpace & afespace, const string & aname, 00181 const Flags & flags); 00182 00184 virtual ~T_LinearForm (); 00185 00187 virtual BaseVector & GetVector () const; 00188 00190 virtual void AllocateVector (); 00192 virtual void CleanUpLevel(); 00193 00195 virtual void AddElementVector (const Array<int> & dnums, 00196 const FlatVector<TSCAL> & elvec, 00197 const int cachecomp = -1); 00198 virtual void SetElementVector (const Array<int> & dnums, 00199 const FlatVector<TSCAL> & elvec); 00200 virtual void GetElementVector (const Array<int> & dnums, 00201 FlatVector<TSCAL> & elvec) const; 00202 }; 00203 00204 00205 extern NGS_DLL_HEADER LinearForm * CreateLinearForm (const FESpace * space, 00206 const string & name, 00207 const Flags & flags); 00208 00209 } 00210 00211 #endif 00212 00213