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 const 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 const 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::InterpolateState");
402 result = *local_vectors[0];
404 result.sadd(lambda_l, lambda_r, *local_vectors[1]);
429 return _constraints.
n_dofs(name);
437 return _constraints.
n_dofs(
"global");
447 return _constraints.
n_dofs(
"local");
453 const std::vector<Point<dealdim> >&
459 return _support_points;
488 const FE<dealdim, dealdim>&
495 else if (name ==
"control")
502 "MethodOfLines_SpaceTimeHandler::GetFESystem");
545 if (_control_mesh_transfer != NULL)
547 delete _control_mesh_transfer;
548 _control_mesh_transfer = NULL;
550 if (_state_mesh_transfer != NULL)
552 delete _state_mesh_transfer;
553 _state_mesh_transfer = NULL;
555 #if dope_dimension == deal_II_dimension
557 DH>(_control_dof_handler);
560 DH>(_state_dof_handler);
563 _triangulation.set_all_refine_flags();
567 GridRefinement::refine_and_coarsen_fixed_number(_triangulation,
574 GridRefinement::refine_and_coarsen_fixed_fraction(_triangulation,
581 GridRefinement::refine_and_coarsen_optimize(_triangulation,
588 "MethodOfLines_SpaceTimeHandler::RefineSpace");
590 _triangulation.prepare_coarsening_and_refinement();
593 if (_control_mesh_transfer != NULL)
594 _control_mesh_transfer->prepare_for_pure_refinement();
595 if (_state_mesh_transfer != NULL)
596 _state_mesh_transfer->prepare_for_pure_refinement();
598 _triangulation.execute_coarsening_and_refinement();
620 VECTOR& new_values)
const
622 if (_control_mesh_transfer != NULL)
623 _control_mesh_transfer->refine_interpolate(old_values, new_values);
627 VECTOR& new_values)
const
629 if (_state_mesh_transfer != NULL)
630 _state_mesh_transfer->refine_interpolate(old_values, new_values);
645 _user_defined_dof_constr = &constraints_maker;
646 _user_defined_dof_constr->RegisterMapping(this->
GetMapping());
659 if (_sparsitymaker != NULL && _sparse_mkr_dynamic)
660 delete _sparsitymaker;
661 _sparsitymaker = &sparsity_maker;
662 _sparse_mkr_dynamic =
false;
675 _state_dof_handler.clear();
676 _triangulation.clear();
677 _triangulation.copy_triangulation(tria);
678 _state_dof_handler.initialize(_triangulation, *_state_fe);
681 if (_control_mesh_transfer != NULL)
682 delete _control_mesh_transfer;
683 _control_mesh_transfer = NULL;
684 if (_state_mesh_transfer != NULL)
685 delete _state_mesh_transfer;
686 _state_mesh_transfer = NULL;
692 GetSparsityMaker()
const
694 return _sparsitymaker;
696 const UserDefinedDoFConstraints<DH, dopedim, dealdim>*
697 GetUserDefinedDoFConstraints()
const
699 return _user_defined_dof_constr;
701 SparsityMaker<DH, dealdim>* _sparsitymaker;
702 UserDefinedDoFConstraints<DH, dopedim, dealdim>* _user_defined_dof_constr;
704 dealii::Triangulation<dealdim>& _triangulation;
708 std::vector<unsigned int> _control_dofs_per_block;
709 std::vector<unsigned int> _state_dofs_per_block;
711 dealii::ConstraintMatrix _control_dof_constraints;
712 dealii::ConstraintMatrix _state_dof_constraints;
714 const dealii::SmartPointer<const FE<dealdim, dealdim> > _control_fe;
715 const dealii::SmartPointer<const FE<dealdim, dealdim> > _state_fe;
717 const dealii::SmartPointer<const DOpEWrapper::Mapping<dealdim, DH> > _mapping;
719 std::vector<Point<dealdim> > _support_points;
721 Constraints _constraints;
724 bool _sparse_mkr_dynamic;
735 dealii::DoFHandler, dealii::BlockSparsityPattern,
736 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
737 dealii::BlockSparsityPattern & sparsity)
const
739 const std::vector<unsigned int>& blocks = this->GetControlDoFsPerBlock();
740 dealii::BlockCompressedSimpleSparsityPattern csp(blocks.size(),
742 for (
unsigned int i = 0; i < blocks.size(); i++)
744 for (
unsigned int j = 0; j < blocks.size(); j++)
746 csp.block(i, j).reinit(this->GetControlDoFsPerBlock(i),
747 this->GetControlDoFsPerBlock(j));
751 #if dope_dimension > 0
753 dealii::DoFTools::make_sparsity_pattern (this->GetControlDoFHandler().GetDEALDoFHandler(),csp);
757 this->GetControlDoFConstraints().condense(csp);
758 sparsity.copy_from(csp);
766 dealii::DoFHandler, dealii::SparsityPattern,
767 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
768 dealii::SparsityPattern & sparsity)
const
770 const unsigned int total_dofs = this->GetControlNDoFs();
771 dealii::CompressedSimpleSparsityPattern csp(total_dofs, total_dofs);
773 #if dope_dimension > 0
774 dealii::DoFTools::make_sparsity_pattern (this->GetControlDoFHandler().GetDEALDoFHandler(),csp);
778 this->GetControlDoFConstraints().condense(csp);
779 sparsity.copy_from(csp);
788 dealii::hp::FECollection,
789 dealii::hp::DoFHandler, dealii::BlockSparsityPattern,
790 dealii::BlockVector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
791 dealii::BlockSparsityPattern & sparsity)
const
793 const std::vector<unsigned int>& blocks = this->GetControlDoFsPerBlock();
794 dealii::BlockCompressedSimpleSparsityPattern csp(blocks.size(),
796 for (
unsigned int i = 0; i < blocks.size(); i++)
798 for (
unsigned int j = 0; j < blocks.size(); j++)
800 csp.block(i, j).reinit(this->GetControlDoFsPerBlock(i),
801 this->GetControlDoFsPerBlock(j));
805 #if dope_dimension > 0
807 dealii::DoFTools::make_sparsity_pattern (this->GetControlDoFHandler().GetDEALDoFHandler(),csp);
811 this->GetControlDoFConstraints().condense(csp);
812 sparsity.copy_from(csp);
820 dealii::hp::DoFHandler, dealii::SparsityPattern,
821 dealii::Vector<double>, dope_dimension, deal_II_dimension>::ComputeControlSparsityPattern(
822 dealii::SparsityPattern & sparsity)
const
824 const unsigned int total_dofs = this->GetControlNDoFs();
825 dealii::CompressedSimpleSparsityPattern csp(total_dofs, total_dofs);
827 #if dope_dimension > 0
828 dealii::DoFTools::make_sparsity_pattern (this->GetControlDoFHandler().GetDEALDoFHandler(),csp);
832 this->GetControlDoFConstraints().condense(csp);
833 sparsity.copy_from(csp);
const DOpEWrapper::DoFHandler< dopedim, DH > & GetControlDoFHandler() const
Definition: mol_spacetimehandler.h:293
void ReInitTime()
Definition: spacetimehandler_base.h:82
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:476
unsigned int GetConstraintNDoFs(std::string name) const
Definition: mol_spacetimehandler.h:427
Definition: dopetypes.h:50
void RefineSpace(const RefinementContainer &ref_container)
Definition: mol_spacetimehandler.h:538
unsigned int GetStateNDoFs(int=-1) const
Definition: mol_spacetimehandler.h:419
void SetSparsityMaker(SparsityMaker< DH, dealdim > &sparsity_maker)
Definition: mol_spacetimehandler.h:657
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 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
const FE< dealdim, dealdim > & GetFESystem(std::string name) const
Definition: mol_spacetimehandler.h:489
ControlType
Definition: dopetypes.h:102
unsigned int GetControlNDoFs() const
Definition: mol_spacetimehandler.h:411
void SpatialMeshTransferControl(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_spacetimehandler.h:619
void SetUserDefinedDoFConstraints(UserDefinedDoFConstraints< DH, dopedim, dealdim > &constraints_maker)
Definition: mol_spacetimehandler.h:642
Definition: dopetypes.h:50
const DOpEWrapper::DoFHandler< dealdim, DH > & GetStateDoFHandler() const
Definition: mol_spacetimehandler.h:302
unsigned int NewTimePointToOldTimePoint(unsigned int t) const
Definition: mol_spacetimehandler.h:606
Definition: timeiterator.h:63
Definition: userdefineddofconstraints.h:55
double get_k() const
Definition: timeiterator.h:195
void ResetTriangulation(const dealii::Triangulation< dealdim > &tria)
Definition: mol_spacetimehandler.h:673
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, const dealii::Triangulation< 1 > ×, DOpEtypes::ControlType type, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:98
DOpEtypes::RefinementType GetRefType() const
Definition: refinementcontainer.cc:95
RefinementType
Definition: dopetypes.h:48
virtual void InterpolateState(VECTOR &result, const std::vector< VECTOR * > &local_vectors, double t, const TimeIterator &it) const
Definition: mol_spacetimehandler.h:385
Definition: refinementcontainer.h:42
const std::vector< unsigned int > & GetDoFsPerBlock(std::string name) const
Definition: constraints.h:159
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:50
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:519
void SpatialMeshTransferState(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_spacetimehandler.h:626
bool UsesCoarsening() const
Definition: refinementcontainer.cc:103
const std::vector< Point< dealdim > > & GetMapDoFToSupportPoints()
Definition: mol_spacetimehandler.h:454
double get_left() const
Definition: timeiterator.h:175
unsigned int GetNLocalConstraints() const
Definition: mol_spacetimehandler.h:444
void IncrementControlTicket()
Definition: spacetimehandler_base.h:382
Definition: solutiontransfer_wrapper.h:51
Definition: dopeexception.h:35
const dealii::ConstraintMatrix & GetStateDoFConstraints() const
Definition: mol_spacetimehandler.h:376
Definition: dopetypes.h:50
virtual double GetBottomFraction() const
Definition: refinementcontainer.cc:66
MethodOfLines_SpaceTimeHandler(dealii::Triangulation< dealdim > &triangulation, const FE< dealdim, dealdim > &control_fe, const FE< dealdim, dealdim > &state_fe, const dealii::Triangulation< 1 > ×, const Constraints &c, DOpEtypes::ControlType type, const ActiveFEIndexSetterInterface< dopedim, dealdim > &index_setter=ActiveFEIndexSetterInterface< dopedim, dealdim >())
Definition: mol_spacetimehandler.h:163
unsigned int n_dofs(std::string name) const
Definition: constraints.h:141
unsigned int GetNGlobalConstraints() const
Definition: mol_spacetimehandler.h:435
void IncrementStateTicket()
Definition: spacetimehandler_base.h:373
const std::vector< unsigned int > & GetControlDoFsPerBlock() const
Definition: mol_spacetimehandler.h:344