24 #ifndef MOL_SPACE_TIME_HANDLER_H_
25 #define MOL_SPACE_TIME_HANDLER_H_
36 #include <dofs/dof_handler.h>
37 #include <dofs/dof_renumbering.h>
38 #include <dofs/dof_tools.h>
39 #include <hp/mapping_collection.h>
40 #include <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>
66 const FE<dealdim, dealdim>& control_fe,
67 const FE<dealdim, dealdim>& state_fe,
71 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(type, index_setter),
72 triangulation_(triangulation),
73 control_dof_handler_(triangulation_),
74 state_dof_handler_(triangulation_),
75 control_fe_(&control_fe),
77 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
79 control_mesh_transfer_(NULL),
80 state_mesh_transfer_(NULL),
81 sparse_mkr_dynamic_(true)
84 user_defined_dof_constr_ = NULL;
99 const FE<dealdim, dealdim>& control_fe,
100 const FE<dealdim, dealdim>& state_fe,
101 dealii::Triangulation<1> & times,
105 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(times, type, index_setter),
106 triangulation_(triangulation),
107 control_dof_handler_(triangulation_),
108 state_dof_handler_(triangulation_),
109 control_fe_(&control_fe),
110 state_fe_(&state_fe),
111 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
113 control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
116 user_defined_dof_constr_ = NULL;
131 const FE<dealdim, dealdim>& control_fe,
132 const FE<dealdim, dealdim>& state_fe,
137 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(type, index_setter),
138 triangulation_(triangulation),
139 control_dof_handler_(triangulation_),
140 state_dof_handler_(triangulation_),
141 control_fe_(&control_fe),
142 state_fe_(&state_fe),
143 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
145 control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
148 user_defined_dof_constr_ = NULL;
164 const FE<dealdim, dealdim>& control_fe,
165 const FE<dealdim, dealdim>& state_fe,
166 dealii::Triangulation<1> & times,
171 SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dopedim, dealdim>(times, type, index_setter),
172 triangulation_(triangulation),
173 control_dof_handler_(triangulation_),
174 state_dof_handler_(triangulation_),
175 control_fe_(&control_fe),
176 state_fe_(&state_fe),
177 mapping_(&DOpEWrapper::StaticMappingQ1<dealdim, DH>::mapping_q1),
179 control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
182 user_defined_dof_constr_ = NULL;
187 control_dof_handler_.clear();
189 state_dof_handler_.clear();
191 if (control_mesh_transfer_ != NULL)
193 delete control_mesh_transfer_;
195 if (state_mesh_transfer_ != NULL)
197 delete state_mesh_transfer_;
199 if (sparsitymaker_ != NULL && sparse_mkr_dynamic_ ==
true)
201 delete sparsitymaker_;
210 const std::vector<unsigned int>& control_block_component,
211 unsigned int state_n_blocks,
212 const std::vector<unsigned int>& state_block_component)
214 #if dope_dimension > 0
218 control_dof_handler_.distribute_dofs(*control_fe_);
220 #if dope_dimension > 0
221 DoFRenumbering::component_wise (
static_cast<DH<dopedim, dopedim>&
>(control_dof_handler_));
224 control_dof_constraints_.clear ();
225 DoFTools::make_hanging_node_constraints (
static_cast<DH<dopedim, dopedim>&
>(control_dof_handler_),
226 control_dof_constraints_);
227 if (GetUserDefinedDoFConstraints() != NULL)
228 GetUserDefinedDoFConstraints()->MakeControlDoFConstraints(control_dof_handler_,
229 control_dof_constraints_);
230 control_dof_constraints_.close ();
234 throw DOpEException(
"Not implemented for dopedim != dealdim",
"MethodOfLines_SpaceTimeHandler::ReInit");
237 control_dofs_per_block_.resize(control_n_blocks);
238 #if dope_dimension > 0
240 DoFTools::count_dofs_per_block (
static_cast<DH<dopedim, dopedim>&
>(control_dof_handler_),
241 control_dofs_per_block_,control_block_component);
245 for (
unsigned int i = 0; i < control_dofs_per_block_.size(); i++)
247 control_dofs_per_block_[i] = 0;
249 for (
unsigned int i = 0; i < control_block_component.size(); i++)
251 control_dofs_per_block_[control_block_component[i]]++;
257 state_dof_handler_.distribute_dofs(
GetFESystem(
"state"));
258 DoFRenumbering::component_wise(
259 static_cast<DH<dealdim, dealdim>&
>(state_dof_handler_));
261 state_dof_constraints_.clear();
262 DoFTools::make_hanging_node_constraints(
263 static_cast<DH<dealdim, dealdim>&
>(state_dof_handler_),
264 state_dof_constraints_);
266 if (GetUserDefinedDoFConstraints() != NULL)
267 GetUserDefinedDoFConstraints()->MakeStateDoFConstraints(
268 state_dof_handler_, state_dof_constraints_);
269 state_dof_constraints_.close();
271 state_dofs_per_block_.resize(state_n_blocks);
272 DoFTools::count_dofs_per_block(
273 static_cast<DH<dealdim, dealdim>&
>(state_dof_handler_),
274 state_dofs_per_block_, state_block_component);
276 support_points_.clear();
278 constraints_.
ReInit(control_dofs_per_block_);
296 return control_dof_handler_;
305 return state_dof_handler_;
322 return control_dofs_per_block_[b];
330 return state_dofs_per_block_[b];
343 const std::vector<unsigned int>&
346 return control_dofs_per_block_;
351 const std::vector<unsigned int>&
354 return state_dofs_per_block_;
359 const std::vector<unsigned int>&
367 const dealii::ConstraintMatrix&
370 return control_dof_constraints_;
375 const dealii::ConstraintMatrix&
378 return state_dof_constraints_;
386 const std::vector<VECTOR*> & local_vectors,
double t,
391 if (local_vectors.size() != 2)
394 "This function is currently not implemented for anything other than"
395 " linear interpolation of 2 DoFs.",
396 "MethodOfLine_SpaceTimeHandler::InterpolateControl");
402 result = *local_vectors[0];
404 result.sadd(lambda_l, lambda_r, *local_vectors[1]);
408 const std::vector<VECTOR*> & local_vectors,
double t,
413 if (local_vectors.size() != 2)
416 "This function is currently not implemented for anything other than"
417 " linear interpolation of 2 DoFs.",
418 "MethodOfLine_SpaceTimeHandler::InterpolateState");
424 result = *local_vectors[0];
426 result.sadd(lambda_l, lambda_r, *local_vectors[1]);
451 return constraints_.
n_dofs(name);
459 return constraints_.
n_dofs(
"global");
469 return constraints_.
n_dofs(
"local");
475 const std::vector<Point<dealdim> >&
481 return support_points_;
510 const FE<dealdim, dealdim>&
517 else if (name ==
"control")
524 "MethodOfLines_SpaceTimeHandler::GetFESystem");
586 if (control_mesh_transfer_ != NULL)
588 delete control_mesh_transfer_;
589 control_mesh_transfer_ = NULL;
591 if (state_mesh_transfer_ != NULL)
593 delete state_mesh_transfer_;
594 state_mesh_transfer_ = NULL;
596 #if dope_dimension == deal_II_dimension
598 DH>(control_dof_handler_);
601 DH>(state_dof_handler_);
604 triangulation_.set_all_refine_flags();
608 GridRefinement::refine_and_coarsen_fixed_number(triangulation_,
615 GridRefinement::refine_and_coarsen_fixed_fraction(triangulation_,
622 GridRefinement::refine_and_coarsen_optimize(triangulation_,
629 "MethodOfLines_SpaceTimeHandler::RefineSpace");
631 triangulation_.prepare_coarsening_and_refinement();
634 if (control_mesh_transfer_ != NULL)
635 control_mesh_transfer_->prepare_for_pure_refinement();
636 if (state_mesh_transfer_ != NULL)
637 state_mesh_transfer_->prepare_for_pure_refinement();
639 triangulation_.execute_coarsening_and_refinement();
662 VECTOR& new_values)
const
664 if (control_mesh_transfer_ != NULL)
665 control_mesh_transfer_->refine_interpolate(old_values, new_values);
669 VECTOR& new_values)
const
671 if (state_mesh_transfer_ != NULL)
672 state_mesh_transfer_->refine_interpolate(old_values, new_values);
687 user_defined_dof_constr_ = &constraints_maker;
688 user_defined_dof_constr_->RegisterMapping(this->
GetMapping());
701 if (sparsitymaker_ != NULL && sparse_mkr_dynamic_)
702 delete sparsitymaker_;
703 sparsitymaker_ = &sparsity_maker;
704 sparse_mkr_dynamic_ =
false;
734 GetSparsityMaker()
const
736 return sparsitymaker_;
738 const UserDefinedDoFConstraints<DH, dopedim, dealdim>*
739 GetUserDefinedDoFConstraints()
const
741 return user_defined_dof_constr_;
743 SparsityMaker<DH, dealdim>* sparsitymaker_;
744 UserDefinedDoFConstraints<DH, dopedim, dealdim>* user_defined_dof_constr_;
746 dealii::Triangulation<dealdim>& triangulation_;
750 std::vector<unsigned int> control_dofs_per_block_;
751 std::vector<unsigned int> state_dofs_per_block_;
753 dealii::ConstraintMatrix control_dof_constraints_;
754 dealii::ConstraintMatrix state_dof_constraints_;
756 const dealii::SmartPointer<const FE<dealdim, dealdim> > control_fe_;
757 const dealii::SmartPointer<const FE<dealdim, dealdim> > state_fe_;
759 const dealii::SmartPointer<const DOpEWrapper::Mapping<dealdim, DH> > mapping_;
761 std::vector<Point<dealdim> > support_points_;
763 Constraints constraints_;
766 bool sparse_mkr_dynamic_;
777 dealii::DoFHandler, dealii::BlockSparsityPattern,
778 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
779 dealii::BlockSparsityPattern & sparsity)
const;
785 MethodOfLines_SpaceTimeHandler<dealii::FESystem,
786 dealii::DoFHandler, dealii::SparsityPattern,
787 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
788 dealii::SparsityPattern & sparsity)
const;
797 dealii::hp::FECollection,
798 dealii::hp::DoFHandler, dealii::BlockSparsityPattern,
799 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
800 dealii::BlockSparsityPattern & sparsity)
const;
806 MethodOfLines_SpaceTimeHandler<dealii::hp::FECollection,
807 dealii::hp::DoFHandler, dealii::SparsityPattern,
808 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
809 dealii::SparsityPattern & sparsity)
const;
const DOpEWrapper::DoFHandler< dopedim, DH > & GetControlDoFHandler() const
Definition: mol_spacetimehandler.h:293
void ReInitTime()
Definition: spacetimehandler_base.h:86
const DOpEWrapper::Mapping< dealdim, DH > & GetMapping() const
Definition: mol_spacetimehandler.h:311
void SetActiveFEIndicesState(DOpEWrapper::DoFHandler< dealdim, DH > &dof_handler)
Definition: spacetimehandler.h:327
void ComputeStateSparsityPattern(SPARSITYPATTERN &sparsity) const
Definition: mol_spacetimehandler.h:498
unsigned int GetConstraintNDoFs(std::string name) const
Definition: mol_spacetimehandler.h:449
Definition: dopetypes.h:52
void RefineSpace(const RefinementContainer &ref_container)
Definition: mol_spacetimehandler.h:579
unsigned int GetStateNDoFs(int=-1) const
Definition: mol_spacetimehandler.h:441
void SetSparsityMaker(SparsityMaker< DH, dealdim > &sparsity_maker)
Definition: mol_spacetimehandler.h:699
unsigned int GetStateDoFsPerBlock(unsigned int b, int=-1) const
Definition: mol_spacetimehandler.h:328
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:540
void ComputeControlSparsityPattern(SPARSITYPATTERN &sparsity) const
const std::vector< unsigned int > & GetConstraintDoFsPerBlock(std::string name) const
Definition: mol_spacetimehandler.h:360
unsigned int GetConstraintDoFsPerBlock(std::string name, unsigned int b) const
Definition: mol_spacetimehandler.h:336
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, DOpEtypes::ControlType type, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:65
unsigned int GetControlDoFsPerBlock(unsigned int b, int=-1) const
Definition: mol_spacetimehandler.h:320
unsigned int GetControlNDoFs(int=-1) const
Definition: mol_spacetimehandler.h:433
const FE< dealdim, dealdim > & GetFESystem(std::string name) const
Definition: mol_spacetimehandler.h:511
ControlType
Definition: dopetypes.h:103
void SpatialMeshTransferControl(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_spacetimehandler.h:661
void SetUserDefinedDoFConstraints(UserDefinedDoFConstraints< DH, dopedim, dealdim > &constraints_maker)
Definition: mol_spacetimehandler.h:684
Definition: dopetypes.h:52
const std::vector< unsigned int > & GetControlDoFsPerBlock(int=-1) const
Definition: mol_spacetimehandler.h:344
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, dealii::Triangulation< 1 > ×, DOpEtypes::ControlType type, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:98
const DOpEWrapper::DoFHandler< dealdim, DH > & GetStateDoFHandler() const
Definition: mol_spacetimehandler.h:302
unsigned int NewTimePointToOldTimePoint(unsigned int t) const
Definition: mol_spacetimehandler.h:648
Definition: timeiterator.h:63
Definition: userdefineddofconstraints.h:55
double get_k() const
Definition: timeiterator.h:195
DOpEtypes::RefinementType GetRefType() const
Definition: refinementcontainer.cc:95
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:407
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, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:163
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:385
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
const std::vector< unsigned int > & GetStateDoFsPerBlock(int=-1) const
Definition: mol_spacetimehandler.h:352
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, const Constraints &c, DOpEtypes::ControlType type, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:130
virtual double GetConvergenceOrder() const
Definition: refinementcontainer.cc:85
double get_right() const
Definition: timeiterator.h:185
Definition: spacetimehandler.h:71
~MethodOfLines_SpaceTimeHandler()
Definition: mol_spacetimehandler.h:185
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:368
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:111
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:209
void RefineSpace(DOpEtypes::RefinementType ref_type=DOpEtypes::RefinementType::global)
Definition: mol_spacetimehandler.h:560
void SpatialMeshTransferState(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_spacetimehandler.h:668
bool UsesCoarsening() const
Definition: refinementcontainer.cc:103
const std::vector< Point< dealdim > > & GetMapDoFToSupportPoints()
Definition: mol_spacetimehandler.h:476
double get_left() const
Definition: timeiterator.h:175
void RefineTime(DOpEtypes::RefinementType ref_type=DOpEtypes::RefinementType::global)
Definition: spacetimehandler_base.h:390
unsigned int GetNLocalConstraints() const
Definition: mol_spacetimehandler.h:466
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:376
Definition: dopetypes.h:52
virtual double GetBottomFraction() const
Definition: refinementcontainer.cc:66
unsigned int n_dofs(std::string name) const
Definition: constraints.h:141
unsigned int GetNGlobalConstraints() const
Definition: mol_spacetimehandler.h:457
void IncrementStateTicket()
Definition: spacetimehandler_base.h:437