24 #ifndef MOL_SPACE_TIME_HANDLER_H_
25 #define MOL_SPACE_TIME_HANDLER_H_
36 #include <deal.II/dofs/dof_handler.h>
37 #include <deal.II/dofs/dof_renumbering.h>
38 #include <deal.II/dofs/dof_tools.h>
39 #include <deal.II/hp/mapping_collection.h>
40 #include <deal.II/lac/constraint_matrix.h>
41 #include <deal.II/grid/grid_refinement.h>
49 template<
template <
int,
int>
class FE,
template<
int,
int>
class DH,
typename SPARSITYPATTERN,
50 typename VECTOR,
int dopedim,
int dealdim>
52 SPARSITYPATTERN, VECTOR, dopedim, dealdim>
67 const FE<dealdim, dealdim>& control_fe,
68 const FE<dealdim, dealdim>& state_fe,
70 bool flux_pattern =
false,
73 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(type, index_setter),
74 triangulation_(triangulation),
75 control_dof_handler_(triangulation_),
76 state_dof_handler_(triangulation_),
77 control_fe_(&control_fe),
79 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
81 control_mesh_transfer_(NULL),
82 state_mesh_transfer_(NULL),
83 sparse_mkr_dynamic_(true)
86 user_defined_dof_constr_ = NULL;
102 const FE<dealdim, dealdim>& control_fe,
103 const FE<dealdim, dealdim>& state_fe,
104 dealii::Triangulation<1> & times,
106 bool flux_pattern =
false,
109 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(times, type, index_setter),
110 triangulation_(triangulation),
111 control_dof_handler_(triangulation_),
112 state_dof_handler_(triangulation_),
113 control_fe_(&control_fe),
114 state_fe_(&state_fe),
115 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
117 control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
120 user_defined_dof_constr_ = NULL;
136 const FE<dealdim, dealdim>& control_fe,
137 const FE<dealdim, dealdim>& state_fe,
140 bool flux_pattern =
false,
143 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(type, index_setter),
144 triangulation_(triangulation),
145 control_dof_handler_(triangulation_),
146 state_dof_handler_(triangulation_),
147 control_fe_(&control_fe),
148 state_fe_(&state_fe),
149 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
151 control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
154 user_defined_dof_constr_ = NULL;
171 const FE<dealdim, dealdim>& control_fe,
172 const FE<dealdim, dealdim>& state_fe,
173 dealii::Triangulation<1> & times,
176 bool flux_pattern =
false,
179 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(times, type, index_setter),
180 triangulation_(triangulation),
181 control_dof_handler_(triangulation_),
182 state_dof_handler_(triangulation_),
183 control_fe_(&control_fe),
184 state_fe_(&state_fe),
185 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
187 control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
190 user_defined_dof_constr_ = NULL;
195 control_dof_handler_.clear();
197 state_dof_handler_.clear();
199 if (control_mesh_transfer_ != NULL)
201 delete control_mesh_transfer_;
203 if (state_mesh_transfer_ != NULL)
205 delete state_mesh_transfer_;
207 if (sparsitymaker_ != NULL && sparse_mkr_dynamic_ ==
true)
209 delete sparsitymaker_;
218 const std::vector<unsigned int>& control_block_component,
219 unsigned int state_n_blocks,
220 const std::vector<unsigned int>& state_block_component)
222 #if dope_dimension > 0
226 control_dof_handler_.distribute_dofs(*control_fe_);
228 #if dope_dimension > 0
229 DoFRenumbering::component_wise (
static_cast<DH<dopedim, dopedim>&
>(control_dof_handler_));
232 control_dof_constraints_.clear ();
233 DoFTools::make_hanging_node_constraints (
static_cast<DH<dopedim, dopedim>&
>(control_dof_handler_),
234 control_dof_constraints_);
235 if (GetUserDefinedDoFConstraints() != NULL)
236 GetUserDefinedDoFConstraints()->MakeControlDoFConstraints(control_dof_handler_,
237 control_dof_constraints_);
238 control_dof_constraints_.close ();
242 throw DOpEException(
"Not implemented for dopedim != dealdim",
"MethodOfLines_SpaceTimeHandler::ReInit");
245 control_dofs_per_block_.resize(control_n_blocks);
246 #if dope_dimension > 0
248 DoFTools::count_dofs_per_block (
static_cast<DH<dopedim, dopedim>&
>(control_dof_handler_),
249 control_dofs_per_block_,control_block_component);
253 for (
unsigned int i = 0; i < control_dofs_per_block_.size(); i++)
255 control_dofs_per_block_[i] = 0;
257 for (
unsigned int i = 0; i < control_block_component.size(); i++)
259 control_dofs_per_block_[control_block_component[i]]++;
265 state_dof_handler_.distribute_dofs(
GetFESystem(
"state"));
266 DoFRenumbering::component_wise(
267 static_cast<DH<dealdim, dealdim>&
>(state_dof_handler_));
269 state_dof_constraints_.clear();
270 DoFTools::make_hanging_node_constraints(
271 static_cast<DH<dealdim, dealdim>&
>(state_dof_handler_),
272 state_dof_constraints_);
274 if (GetUserDefinedDoFConstraints() != NULL)
275 GetUserDefinedDoFConstraints()->MakeStateDoFConstraints(
276 state_dof_handler_, state_dof_constraints_);
277 state_dof_constraints_.close();
279 state_dofs_per_block_.resize(state_n_blocks);
280 DoFTools::count_dofs_per_block(
281 static_cast<DH<dealdim, dealdim>&
>(state_dof_handler_),
282 state_dofs_per_block_, state_block_component);
284 support_points_.clear();
286 constraints_.
ReInit(control_dofs_per_block_);
304 return control_dof_handler_;
313 return state_dof_handler_;
330 return control_dofs_per_block_[b];
338 return state_dofs_per_block_[b];
351 const std::vector<unsigned int>&
354 return control_dofs_per_block_;
359 const std::vector<unsigned int>&
362 return state_dofs_per_block_;
367 const std::vector<unsigned int>&
375 const dealii::ConstraintMatrix&
378 return control_dof_constraints_;
383 const dealii::ConstraintMatrix&
386 return state_dof_constraints_;
394 const std::vector<VECTOR*> & local_vectors,
double t,
399 if (local_vectors.size() != 2)
402 "This function is currently not implemented for anything other than"
403 " linear interpolation of 2 DoFs.",
404 "MethodOfLine_SpaceTimeHandler::InterpolateControl");
410 result = *local_vectors[0];
412 result.sadd(lambda_l, lambda_r, *local_vectors[1]);
416 const std::vector<VECTOR*> & local_vectors,
double t,
421 if (local_vectors.size() != 2)
424 "This function is currently not implemented for anything other than"
425 " linear interpolation of 2 DoFs.",
426 "MethodOfLine_SpaceTimeHandler::InterpolateState");
432 result = *local_vectors[0];
434 result.sadd(lambda_l, lambda_r, *local_vectors[1]);
459 return constraints_.
n_dofs(name);
467 return constraints_.
n_dofs(
"global");
477 return constraints_.
n_dofs(
"local");
483 const std::vector<Point<dealdim> >&
489 return support_points_;
518 const FE<dealdim, dealdim>&
525 else if (name ==
"control")
532 "MethodOfLines_SpaceTimeHandler::GetFESystem");
594 if (control_mesh_transfer_ != NULL)
596 delete control_mesh_transfer_;
597 control_mesh_transfer_ = NULL;
599 if (state_mesh_transfer_ != NULL)
601 delete state_mesh_transfer_;
602 state_mesh_transfer_ = NULL;
604 #if dope_dimension == deal_II_dimension
606 DH>(control_dof_handler_);
609 DH>(state_dof_handler_);
612 triangulation_.set_all_refine_flags();
616 GridRefinement::refine_and_coarsen_fixed_number(triangulation_,
623 GridRefinement::refine_and_coarsen_fixed_fraction(triangulation_,
630 GridRefinement::refine_and_coarsen_optimize(triangulation_,
637 "MethodOfLines_SpaceTimeHandler::RefineSpace");
639 triangulation_.prepare_coarsening_and_refinement();
642 if (control_mesh_transfer_ != NULL)
643 control_mesh_transfer_->prepare_for_pure_refinement();
644 if (state_mesh_transfer_ != NULL)
645 state_mesh_transfer_->prepare_for_pure_refinement();
647 triangulation_.execute_coarsening_and_refinement();
670 VECTOR& new_values)
const
672 if (control_mesh_transfer_ != NULL)
673 control_mesh_transfer_->refine_interpolate(old_values, new_values);
677 VECTOR& new_values)
const
679 if (state_mesh_transfer_ != NULL)
680 state_mesh_transfer_->refine_interpolate(old_values, new_values);
695 user_defined_dof_constr_ = &constraints_maker;
696 user_defined_dof_constr_->RegisterMapping(this->
GetMapping());
709 assert(sparse_mkr_dynamic_==
true);
710 if (sparsitymaker_ != NULL && sparse_mkr_dynamic_)
711 delete sparsitymaker_;
712 sparsitymaker_ = &sparsity_maker;
713 sparse_mkr_dynamic_ =
false;
727 GetSparsityMaker()
const
729 return sparsitymaker_;
731 const UserDefinedDoFConstraints<DH, dopedim, dealdim>*
732 GetUserDefinedDoFConstraints()
const
734 return user_defined_dof_constr_;
736 SparsityMaker<DH, dealdim>* sparsitymaker_;
737 UserDefinedDoFConstraints<DH, dopedim, dealdim>* user_defined_dof_constr_;
739 dealii::Triangulation<dealdim>& triangulation_;
743 std::vector<unsigned int> control_dofs_per_block_;
744 std::vector<unsigned int> state_dofs_per_block_;
746 dealii::ConstraintMatrix control_dof_constraints_;
747 dealii::ConstraintMatrix state_dof_constraints_;
749 const dealii::SmartPointer<const FE<dealdim, dealdim> > control_fe_;
750 const dealii::SmartPointer<const FE<dealdim, dealdim> > state_fe_;
752 const dealii::SmartPointer<const DOpEWrapper::Mapping<dealdim, DH> > mapping_;
754 std::vector<Point<dealdim> > support_points_;
756 Constraints constraints_;
759 bool sparse_mkr_dynamic_;
770 dealii::DoFHandler, dealii::BlockSparsityPattern,
771 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
772 dealii::BlockSparsityPattern & sparsity)
const;
776 dealii::DoFHandler, dealii::BlockSparsityPattern,
777 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ResetTriangulation(
778 const dealii::Triangulation<deal_II_dimension>& tria);
784 MethodOfLines_SpaceTimeHandler<dealii::FESystem,
785 dealii::DoFHandler, dealii::SparsityPattern,
786 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
787 dealii::SparsityPattern & sparsity)
const;
790 MethodOfLines_SpaceTimeHandler<dealii::FESystem,
791 dealii::DoFHandler, dealii::SparsityPattern,
792 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ResetTriangulation(
793 const dealii::Triangulation<deal_II_dimension>& tria);
802 dealii::hp::FECollection,
803 dealii::hp::DoFHandler, dealii::BlockSparsityPattern,
804 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
805 dealii::BlockSparsityPattern & sparsity)
const;
809 dealii::hp::FECollection,
810 dealii::hp::DoFHandler, dealii::BlockSparsityPattern,
811 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ResetTriangulation(
812 const dealii::Triangulation<deal_II_dimension>& tria);
818 MethodOfLines_SpaceTimeHandler<dealii::hp::FECollection,
819 dealii::hp::DoFHandler, dealii::SparsityPattern,
820 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
821 dealii::SparsityPattern & sparsity)
const;
824 MethodOfLines_SpaceTimeHandler<dealii::hp::FECollection,
825 dealii::hp::DoFHandler, dealii::SparsityPattern,
826 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ResetTriangulation(
827 const dealii::Triangulation<deal_II_dimension>& tria);
const DOpEWrapper::DoFHandler< dopedim, DH > & GetControlDoFHandler() const
Definition: mol_spacetimehandler.h:301
void ReInitTime()
Definition: spacetimehandler_base.h:86
const DOpEWrapper::Mapping< dealdim, DH > & GetMapping() const
Definition: mol_spacetimehandler.h:319
void SetActiveFEIndicesState(DOpEWrapper::DoFHandler< dealdim, DH > &dof_handler)
Definition: spacetimehandler.h:327
void ComputeStateSparsityPattern(SPARSITYPATTERN &sparsity) const
Definition: mol_spacetimehandler.h:506
unsigned int GetConstraintNDoFs(std::string name) const
Definition: mol_spacetimehandler.h:457
Definition: dopetypes.h:52
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, const Constraints &c, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:135
void RefineSpace(const RefinementContainer &ref_container)
Definition: mol_spacetimehandler.h:587
void RefineTime(DOpEtypes::RefinementType=DOpEtypes::RefinementType::global)
Definition: spacetimehandler_base.h:390
unsigned int GetStateNDoFs(int=-1) const
Definition: mol_spacetimehandler.h:449
void SetSparsityMaker(SparsityMaker< DH, dealdim > &sparsity_maker)
Definition: mol_spacetimehandler.h:707
unsigned int GetStateDoFsPerBlock(unsigned int b, int=-1) const
Definition: mol_spacetimehandler.h:336
void SetActiveFEIndicesControl(DOpEWrapper::DoFHandler< dopedim, DH > &dof_handler)
Definition: spacetimehandler.h:348
void RefineSpaceTime(DOpEtypes::RefinementType ref_type=DOpEtypes::RefinementType::global)
Definition: mol_spacetimehandler.h:548
void ComputeControlSparsityPattern(SPARSITYPATTERN &sparsity) const
const std::vector< unsigned int > & GetConstraintDoFsPerBlock(std::string name) const
Definition: mol_spacetimehandler.h:368
unsigned int GetConstraintDoFsPerBlock(std::string name, unsigned int b) const
Definition: mol_spacetimehandler.h:344
unsigned int GetControlDoFsPerBlock(unsigned int b, int=-1) const
Definition: mol_spacetimehandler.h:328
unsigned int GetControlNDoFs(int=-1) const
Definition: mol_spacetimehandler.h:441
const FE< dealdim, dealdim > & GetFESystem(std::string name) const
Definition: mol_spacetimehandler.h:519
ControlType
Definition: dopetypes.h:103
void SpatialMeshTransferControl(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_spacetimehandler.h:669
void SetUserDefinedDoFConstraints(UserDefinedDoFConstraints< DH, dopedim, dealdim > &constraints_maker)
Definition: mol_spacetimehandler.h:692
Definition: dopetypes.h:52
const std::vector< unsigned int > & GetControlDoFsPerBlock(int=-1) const
Definition: mol_spacetimehandler.h:352
const DOpEWrapper::DoFHandler< dealdim, DH > & GetStateDoFHandler() const
Definition: mol_spacetimehandler.h:310
unsigned int NewTimePointToOldTimePoint(unsigned int t) const
Definition: mol_spacetimehandler.h:656
Definition: timeiterator.h:62
Definition: userdefineddofconstraints.h:55
double get_k() const
Definition: timeiterator.h:194
void ResetTriangulation(const dealii::Triangulation< dealdim > &tria)
DOpEtypes::RefinementType GetRefType() const
Definition: refinementcontainer.cc:86
RefinementType
Definition: dopetypes.h:50
virtual void InterpolateState(VECTOR &result, const std::vector< VECTOR * > &local_vectors, double t, const TimeIterator &it) const
Definition: mol_spacetimehandler.h:415
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, dealii::Triangulation< 1 > ×, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:101
Definition: refinementcontainer.h:42
const std::vector< unsigned int > & GetDoFsPerBlock(std::string name) const
Definition: constraints.h:159
virtual void InterpolateControl(VECTOR &result, const std::vector< VECTOR * > &local_vectors, double t, const TimeIterator &it) const
Definition: mol_spacetimehandler.h:393
Definition: active_fe_index_setter_interface.h:39
virtual const dealii::Vector< float > & GetLocalErrorIndicators() const
Definition: refinementcontainer.cc:46
virtual double GetTopFraction() const
Definition: refinementcontainer.cc:56
Definition: dopetypes.h:52
Definition: mol_spacetimehandler.h:51
Definition: constraints.h:33
void RefineSpace(DOpEtypes::RefinementType=DOpEtypes::RefinementType::global)
Definition: mol_spacetimehandler.h:568
const std::vector< unsigned int > & GetStateDoFsPerBlock(int=-1) const
Definition: mol_spacetimehandler.h:360
virtual double GetConvergenceOrder() const
Definition: refinementcontainer.cc:76
double get_right() const
Definition: timeiterator.h:184
Definition: spacetimehandler.h:71
~MethodOfLines_SpaceTimeHandler()
Definition: mol_spacetimehandler.h:193
void MapDoFsToSupportPoints(const DOpEWrapper::Mapping< dealdim, dealii::DoFHandler > &mapping, const DOpEWrapper::DoFHandler< dealdim, dealii::DoFHandler > &dh, VECTOR &support_points)
Definition: sth_internals.h:47
void ReInit(std::vector< unsigned int > &control_dofs_per_block)
Definition: constraints.h:108
const dealii::ConstraintMatrix & GetControlDoFConstraints() const
Definition: mol_spacetimehandler.h:376
virtual void ComputeSparsityPattern(const DOpEWrapper::DoFHandler< dim, DH > &dof_handler, dealii::BlockSparsityPattern &sparsity, const dealii::ConstraintMatrix &hanging_node_constraints, const std::vector< unsigned int > &blocks) const
Definition: sparsitymaker.h:113
void ReInit(unsigned int control_n_blocks, const std::vector< unsigned int > &control_block_component, unsigned int state_n_blocks, const std::vector< unsigned int > &state_block_component)
Definition: mol_spacetimehandler.h:217
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, dealii::Triangulation< 1 > ×, const Constraints &c, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:170
void SpatialMeshTransferState(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_spacetimehandler.h:676
bool UsesCoarsening() const
Definition: refinementcontainer.cc:94
const std::vector< Point< dealdim > > & GetMapDoFToSupportPoints()
Definition: mol_spacetimehandler.h:484
double get_left() const
Definition: timeiterator.h:174
unsigned int GetNLocalConstraints() const
Definition: mol_spacetimehandler.h:474
void IncrementControlTicket()
Definition: spacetimehandler_base.h:446
Definition: solutiontransfer_wrapper.h:51
Definition: dopeexception.h:35
const dealii::ConstraintMatrix & GetStateDoFConstraints() const
Definition: mol_spacetimehandler.h:384
Definition: dopetypes.h:52
virtual double GetBottomFraction() const
Definition: refinementcontainer.cc:66
std::string DOpEtypesToString(const C &)
Definition: dopetypes.h:134
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:66
unsigned int n_dofs(std::string name) const
Definition: constraints.h:141
unsigned int GetNGlobalConstraints() const
Definition: mol_spacetimehandler.h:465
void IncrementStateTicket()
Definition: spacetimehandler_base.h:437