Electrowetting on dielectric
|
00001 #ifndef _CAHN_HILLIARD_H_ 00002 #define _CAHN_HILLIARD_H_ 00003 00004 #include "Problem.h" 00005 00010 template<int dim> class Phase0: public Function<dim>{ 00011 public: 00017 Phase0( const double dd, const TestCase _tc ); 00021 virtual ~Phase0(); 00027 virtual double value( const Point<dim> &p, const unsigned component = 0 ) const; 00028 protected: 00032 const double delta; 00036 const TestCase tc; 00037 }; 00038 00058 template<int dim> class CahnHilliard: public Problem<dim>{ 00059 public: 00068 CahnHilliard( const Triangulation<dim> &tria, Material_Parameters ¶ms, const unsigned deg, 00069 const TestCase _tc ); 00073 virtual ~CahnHilliard(); 00077 void advance(); 00081 double it_error(); 00082 protected: 00083 const material_function &mobility, 00084 &permitivity, 00085 &density; 00086 const GLPotential &W; 00087 const InterfaceEnergy &gamma_fs; 00088 const double gamma, 00089 delta, 00090 alpha; 00091 const TestCase tc; 00092 TrilinosWrappers::Vector oldsol, 00093 olditsol; 00094 00097 virtual void InitLADataSuffix(); 00107 typedef IteratorGroup<3,typename hp::DoFHandler<dim>::active_cell_iterator> Iterator; 00116 struct ScratchData{ 00117 hp::QCollection<dim> quad; 00118 UpdateFlags flags; 00119 hp::FEValues<dim> fe_val; 00120 hp::QCollection<dim-1> f_quad; 00121 UpdateFlags f_flags; 00122 hp::FEFaceValues<dim> fe_face_val; 00123 AsFunction<dim> voltage, 00124 velocity; 00125 std::vector< Tensor<1,dim> > loc_grad_voltage, loc_vel, loc_face_vel, phase_grad, phase_face_grad; 00126 std::vector< Point<dim> > normals; 00127 std::vector<double> phase_val, phase_face_val; 00128 ScratchData( const hp::FECollection<dim> &fe, std::vector<AsFunction<dim> *> &data, 00129 const hp::QCollection<dim> &q, const UpdateFlags u_flags, 00130 const hp::QCollection<dim-1> &fq, const UpdateFlags u_f_flags ) : 00131 quad(q), flags( u_flags ), fe_val( fe, quad, flags ), 00132 f_quad(fq), f_flags( u_f_flags ), fe_face_val( fe, f_quad, f_flags ), 00133 voltage( *(data[0]) ), velocity( *(data[1]) ), 00134 loc_grad_voltage( quad.max_n_quadrature_points() ), loc_vel( quad.max_n_quadrature_points() ), 00135 loc_face_vel( f_quad.max_n_quadrature_points() ), phase_grad( quad.max_n_quadrature_points() ), 00136 phase_face_grad( f_quad.max_n_quadrature_points() ), 00137 normals( f_quad.max_n_quadrature_points() ), 00138 phase_val( quad.max_n_quadrature_points() ), 00139 phase_face_val( f_quad.max_n_quadrature_points() ) {} 00140 ScratchData ( const ScratchData &scratch ) : 00141 quad( scratch.quad ), flags( scratch.flags ), 00142 fe_val( scratch.fe_val.get_fe_collection(), quad, flags ), 00143 f_quad( scratch.f_quad ), f_flags( scratch.f_flags ), 00144 fe_face_val( scratch.fe_face_val.get_fe_collection(), f_quad, f_flags ), 00145 voltage( scratch.voltage ), velocity( scratch.velocity ), 00146 loc_grad_voltage( quad.max_n_quadrature_points() ), loc_vel( quad.max_n_quadrature_points() ), 00147 loc_face_vel( f_quad.max_n_quadrature_points() ), phase_grad( quad.max_n_quadrature_points() ), 00148 phase_face_grad( f_quad.max_n_quadrature_points() ), 00149 normals( f_quad.max_n_quadrature_points() ), 00150 phase_val( quad.max_n_quadrature_points() ), 00151 phase_face_val( f_quad.max_n_quadrature_points() ) {} 00152 }; 00165 virtual void AssembleSystem( std::vector< AsFunction<dim> *> &data, const double time, 00166 const bool m_theaded = true ); 00173 void AssembleCell( const Iterator Its, ScratchData &scratch, 00174 typename Problem<dim>::PerTaskData &data ); 00178 virtual void ReinitPrec(); 00182 virtual void SolveSystemPreffix(); 00186 virtual void DoSolve( SolverControl &control ); 00190 virtual void SetInitialData(); 00195 virtual void PreRefinementPreffix(); 00200 virtual void PostRefinementSuffix( const std::vector<TrilinosWrappers::Vector> &sol_tmp ); 00201 public: 00202 AsFunction<dim> get_phase, 00203 get_potential, 00204 get_old_phase; 00205 }; 00206 00207 #endif 00208