Electrowetting on dielectric
/export/home/gkanscha/ANS/submissions/Salgado/include/Problem.h
Go to the documentation of this file.
00001 #ifndef _PROBLEM_H_
00002 #define _PROBLEM_H_
00003 
00004 #include <deal.II/base/point.h>
00005 #include <deal.II/base/function.h>
00006 #include <deal.II/base/multithread_info.h>
00007 #include <deal.II/base/thread_management.h>
00008 #include <deal.II/base/work_stream.h>
00009 #include <deal.II/base/parallel.h>
00010 
00011 #include <deal.II/grid/tria.h>
00012 
00013 #include <deal.II/hp/dof_handler.h>
00014 #include <deal.II/hp/fe_collection.h>
00015 
00016 #include <deal.II/dofs/dof_accessor.h>
00017 #include <deal.II/dofs/dof_tools.h>
00018 #include <deal.II/dofs/function_map.h>
00019 
00020 #include <deal.II/fe/fe_q.h>
00021 #include <deal.II/fe/fe_nothing.h>
00022 #include <deal.II/fe/fe_system.h>
00023 #include <deal.II/fe/fe_tools.h>
00024 
00025 #include <deal.II/lac/trilinos_vector.h>
00026 #include <deal.II/lac/trilinos_sparse_matrix.h>
00027 #include <deal.II/lac/trilinos_solver.h>
00028 #include <deal.II/lac/trilinos_precondition.h>
00029 #include <deal.II/lac/compressed_sparsity_pattern.h>
00030 #include <deal.II/lac/constraint_matrix.h>
00031 
00032 #include <deal.II/numerics/matrix_tools.h>
00033 #include <deal.II/numerics/vector_tools.h>
00034 #include <deal.II/numerics/solution_transfer.h>
00035 
00036 #include "Material.h"
00037 #include "AsFunction.h"
00038 #include "GroupedIterators.h"
00039 
00040 using namespace dealii;
00041 
00054 template<int dim> class Problem{
00055   public:
00070     Problem( const Triangulation<dim> &tria, const unsigned _n_transfers, const double _eps,
00071              bool _prec_needs_reinit = false, const unsigned _update_prec = 10 );
00075     virtual ~Problem();
00079     void set_dt( const double _dt );
00090     void init();
00096     virtual void solve( std::vector< AsFunction<dim> *> &data, const double time );
00100     const hp::FECollection<dim> &get_fe() const;
00104     unsigned size() const;
00105   protected:
00106     const Triangulation<dim> &tri; 
00107     bool mesh_has_changed; 
00108     hp::DoFHandler<dim> dh; 
00109     ConstraintMatrix constraints; 
00110     hp::FECollection<dim> fe; 
00111     unsigned n_dofs; 
00112     double dt; 
00113     unsigned steps; 
00114     TrilinosWrappers::Vector sol, 
00115                              rhs; 
00116     TrilinosWrappers::SparseMatrix K; 
00117     const double eps; 
00118     const unsigned update_prec; 
00119     const bool prec_needs_reinit; 
00120 
00125     void SetupDoFs();
00133     virtual void SetupDoFsSuffix();
00140     void InitLAData();
00148     virtual void InitLADataSuffix();
00154     struct PerTaskData{
00155       unsigned dpc; 
00156       std::vector<unsigned> ldi; 
00157       FullMatrix<double> loc_m; 
00158       Vector<double> loc_rhs; 
00159       PerTaskData( const unsigned _dpc ) : dpc( _dpc ), ldi( dpc ), loc_m( dpc, dpc ),
00160                 loc_rhs( dpc ) {}
00161       PerTaskData( const PerTaskData &data ) : dpc( data.dpc ), ldi( dpc ),
00162                 loc_m( dpc, dpc ), loc_rhs( dpc ) {}
00163     };
00176     virtual void AssembleSystem( std::vector< AsFunction<dim> *> &data, const double time,
00177                                   const bool m_threaded = true ) = 0;
00183     void CopyToGlob( const PerTaskData &data );
00196     void SolveSystem();
00201     virtual void SolveSystemPreffix();
00207     virtual void ReinitPrec() = 0;
00212     virtual void DoSolve( SolverControl &control ) = 0;
00217     virtual void SolveSystemSuffix();
00221     virtual void SetInitialData() = 0;
00222     const unsigned n_of_transfers; 
00223     std::vector<TrilinosWrappers::Vector> x_sol; 
00224     SolutionTransfer<dim, TrilinosWrappers::Vector, hp::DoFHandler<dim> > transfer; 
00225 
00228     void PreRefinement();
00232     virtual void PreRefinementPreffix() = 0;
00238     void PostRefinement();
00242     virtual void PostRefinementSuffix( const std::vector<TrilinosWrappers::Vector> &sol_tmp ) = 0;
00249     bool isNeeded( const typename hp::DoFHandler<dim>::active_cell_iterator &c,
00250                    const unsigned face ) const;
00251 };
00252 
00253 #endif
00254