Electrowetting on dielectric
/export/home/gkanscha/ANS/submissions/Salgado/include/CahnHilliard.h
Go to the documentation of this file.
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 &params, 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