Electrowetting on dielectric
|
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