NGSolve  4.9
comp/linearform.hpp
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