DOpE
mol_multimesh_spacetimehandler.h
Go to the documentation of this file.
1 
24 #ifndef MOL_MULTIMESH_SPACE_TIME_HANDLER_H_
25 #define MOL_MULTIMESH_SPACE_TIME_HANDLER_H_
26 
27 #include "mol_spacetimehandler.h"
28 #include "constraints.h"
29 #include "sparsitymaker.h"
31 #include "sth_internals.h"
32 #include "refinementcontainer.h"
34 
35 #include <deal.II/dofs/dof_handler.h>
36 #include <deal.II/dofs/dof_renumbering.h>
37 #include <deal.II/dofs/dof_tools.h>
38 #include <deal.II/hp/mapping_collection.h>
39 #include <deal.II/lac/constraint_matrix.h>
40 #include <deal.II/grid/grid_refinement.h>
41 
42 namespace DOpE
43 {
55  template<template<int, int> class FE, template<int, int> class DH,
56  typename SPARSITYPATTERN, typename VECTOR, int dim>
58  DH, SPARSITYPATTERN, VECTOR, dim, dim>
59  {
60  public:
62  dealii::Triangulation<dim>& triangulation,
63  const FE<dim, dim>& control_fe, const FE<dim, dim>& state_fe,
65  bool flux_pattern = false,
66  const ActiveFEIndexSetterInterface<dim, dim>& index_setter =
68  SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dim, dim>(type,
69  index_setter), state_triangulation_(triangulation), control_dof_handler_(
70  control_triangulation_), state_dof_handler_(
71  state_triangulation_), control_fe_(&control_fe), state_fe_(
72  &state_fe), mapping_(
73  DOpEWrapper::StaticMappingQ1<dim, DH>::mapping_q1), constraints_(), control_mesh_transfer_(
74  NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
75  {
76  control_triangulation_.copy_triangulation(state_triangulation_);
77  sparsitymaker_ = new SparsityMaker<DH, dim>(flux_pattern);
78  user_defined_dof_constr_ = NULL;
79  }
80 
82  dealii::Triangulation<dim>& triangulation,
83  const FE<dim, dim>& control_fe, const FE<dim, dim>& state_fe,
84  dealii::Triangulation<1> & times, DOpEtypes::ControlType type,
85  bool flux_pattern = false,
86  const ActiveFEIndexSetterInterface<dim, dim>& index_setter =
88  SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dim, dim>(times,
89  type, index_setter), state_triangulation_(triangulation), control_dof_handler_(
90  control_triangulation_), state_dof_handler_(
91  state_triangulation_), control_fe_(&control_fe), state_fe_(
92  &state_fe), mapping_(
93  DOpEWrapper::StaticMappingQ1<dim, DH>::mapping_q1), constraints_(), control_mesh_transfer_(
94  NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(true)
95  {
96  control_triangulation_.copy_triangulation(state_triangulation_);
97  sparsitymaker_ = new SparsityMaker<DH, dim>(flux_pattern);
98  user_defined_dof_constr_ = NULL;
99  }
100 
102  dealii::Triangulation<dim>& triangulation,
103  const FE<dim, dim>& control_fe, const FE<dim, dim>& state_fe,
104  const Constraints& c, DOpEtypes::ControlType type,
105  bool flux_pattern = false,
106  const ActiveFEIndexSetterInterface<dim, dim>& index_setter =
108  SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dim, dim>(type,
109  index_setter), state_triangulation_(triangulation), control_dof_handler_(
110  control_triangulation_), state_dof_handler_(
111  state_triangulation_), control_fe_(&control_fe), state_fe_(
112  &state_fe), mapping_(
113  DOpEWrapper::StaticMappingQ1<dim, DH>::mapping_q1), constraints_(
114  c), control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(
115  true)
116  {
117  control_triangulation_.copy_triangulation(state_triangulation_);
118  sparsitymaker_ = new SparsityMaker<DH, dim>(flux_pattern);
119  user_defined_dof_constr_ = NULL;
120  }
121 
123  dealii::Triangulation<dim>& triangulation,
124  const FE<dim, dim>& control_fe, const FE<dim, dim>& state_fe,
125  dealii::Triangulation<1> & times, const Constraints& c,
127  bool flux_pattern = false,
128  const ActiveFEIndexSetterInterface<dim, dim>& index_setter =
130  SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR, dim, dim>(times,
131  type, index_setter), state_triangulation_(triangulation), control_dof_handler_(
132  control_triangulation_), state_dof_handler_(
133  state_triangulation_), control_fe_(&control_fe), state_fe_(
134  &state_fe), mapping_(
135  DOpEWrapper::StaticMappingQ1<dim, DH>::mapping_q1), constraints_(
136  c), control_mesh_transfer_(NULL), state_mesh_transfer_(NULL), sparse_mkr_dynamic_(
137  true)
138  {
139  control_triangulation_.copy_triangulation(state_triangulation_);
140  sparsitymaker_ = new SparsityMaker<DH, dim>(flux_pattern);
141  user_defined_dof_constr_ = NULL;
142  }
143 
145  {
146  control_dof_handler_.clear();
147 
148  state_dof_handler_.clear();
149 
150  if (control_mesh_transfer_ != NULL)
151  {
152  delete control_mesh_transfer_;
153  }
154  if (state_mesh_transfer_ != NULL)
155  {
156  delete state_mesh_transfer_;
157  }
158  if (sparsitymaker_ != NULL && sparse_mkr_dynamic_ == true)
159  {
160  delete sparsitymaker_;
161  }
162  }
163 
167  void
168  ReInit(unsigned int control_n_blocks,
169  const std::vector<unsigned int>& control_block_component,
170  unsigned int state_n_blocks,
171  const std::vector<unsigned int>& state_block_component)
172  {
174  control_dof_handler_);
175  control_dof_handler_.distribute_dofs(*control_fe_);
176  DoFRenumbering::component_wise(static_cast<DH<dim, dim>&>(control_dof_handler_));
177 
178  control_dof_constraints_.clear();
179  DoFTools::make_hanging_node_constraints(
180  static_cast<DH<dim, dim>&>(control_dof_handler_), control_dof_constraints_);
181  if (GetUserDefinedDoFConstraints() != NULL)
182  GetUserDefinedDoFConstraints()->MakeControlDoFConstraints(
183  control_dof_handler_, control_dof_constraints_);
184  control_dof_constraints_.close();
185 
186  control_dofs_per_block_.resize(control_n_blocks);
187  {
188  DoFTools::count_dofs_per_block(
189  static_cast<DH<dim, dim>&>(control_dof_handler_), control_dofs_per_block_,
190  control_block_component);
191  }
192 
194  state_dof_handler_);
195  state_dof_handler_.distribute_dofs(GetFESystem("state"));
196  DoFRenumbering::component_wise(static_cast<DH<dim, dim>&>(state_dof_handler_));
197 
198  state_dof_constraints_.clear();
199  DoFTools::make_hanging_node_constraints(
200  static_cast<DH<dim, dim>&>(state_dof_handler_), state_dof_constraints_);
201  //TODO Dirichlet Daten hierueber.
202  if (GetUserDefinedDoFConstraints() != NULL)
203  GetUserDefinedDoFConstraints()->MakeStateDoFConstraints(
204  state_dof_handler_, state_dof_constraints_);
205  state_dof_constraints_.close();
206 
207  state_dofs_per_block_.resize(state_n_blocks);
208  DoFTools::count_dofs_per_block(static_cast<DH<dim, dim>&>(state_dof_handler_),
209  state_dofs_per_block_, state_block_component);
210 
211  support_points_.clear();
212 
213  constraints_.ReInit(control_dofs_per_block_);
214  //constraints_.ReInit(control_dofs_per_block_, state_dofs_per_block_);
215 
216  //Initialize also the timediscretization.
217  this->ReInitTime();
218 
219  //There where changes invalidate tickets
220  this->IncrementControlTicket();
221  this->IncrementStateTicket();
222  }
223 
229  {
230  //There is only one mesh, hence always return this
231  return control_dof_handler_;
232  }
238  {
239  //There is only one mesh, hence always return this
240  return state_dof_handler_;
241  }
242 
247  GetMapping() const
248  {
249  return mapping_;
250  }
251 
255  unsigned int
256  GetControlDoFsPerBlock(unsigned int b, int /*time_point*/= -1) const
257  {
258  return control_dofs_per_block_[b];
259  }
263  unsigned int
264  GetStateDoFsPerBlock(unsigned int b, int /*time_point*/= -1) const
265  {
266  return state_dofs_per_block_[b];
267  }
271  unsigned int
272  GetConstraintDoFsPerBlock(std::string name, unsigned int b) const
273  {
274  return (constraints_.GetDoFsPerBlock(name))[b];
275  }
279  const std::vector<unsigned int>&
280  GetControlDoFsPerBlock(int /*time_point*/= -1) const
281  {
282  return control_dofs_per_block_;
283  }
287  const std::vector<unsigned int>&
288  GetStateDoFsPerBlock(int /*time_point*/= -1) const
289  {
290  return state_dofs_per_block_;
291  }
295  const std::vector<unsigned int>&
296  GetConstraintDoFsPerBlock(std::string name) const
297  {
298  return constraints_.GetDoFsPerBlock(name);
299  }
303  const dealii::ConstraintMatrix&
305  {
306  return control_dof_constraints_;
307  }
311  const dealii::ConstraintMatrix&
313  {
314  return state_dof_constraints_;
315  }
316 
321  virtual void
322  InterpolateControl(VECTOR& result,
323  const std::vector<VECTOR*> & local_vectors, double t,
324  const TimeIterator& it) const
325  {
326  assert(it.get_left() <= t);
327  assert(it.get_right() >= t);
328  if (local_vectors.size() != 2)
329  throw DOpEException(
330  "This function is currently not implemented for anything other than"
331  " linear interpolation of 2 DoFs.",
332  "MethodOfLine_SpaceTimeHandler::InterpolateControl");
333 
334  double lambda_l = (it.get_right() - t) / it.get_k();
335  double lambda_r = (t - it.get_left()) / it.get_k();
336 
337  //Here we assume that the numbering of dofs goes from left to right!
338  result = *local_vectors[0];
339 
340  result.sadd(lambda_l, lambda_r, *local_vectors[1]);
341  }
342 
343  virtual void
344  InterpolateState(VECTOR& result,
345  const std::vector<VECTOR*> & local_vectors, double t,
346  const TimeIterator& it) const
347  {
348  assert(it.get_left() <= t);
349  assert(it.get_right() >= t);
350  if (local_vectors.size() != 2)
351  throw DOpEException(
352  "This function is currently not implemented for anything other than"
353  " linear interpolation of 2 DoFs.",
354  "MethodOfLine_SpaceTimeHandler::InterpolateState");
355 
356  double lambda_l = (it.get_right() - t) / it.get_k();
357  double lambda_r = (t - it.get_left()) / it.get_k();
358 
359  //Here we assume that the numbering of dofs goes from left to right!
360  result = *local_vectors[0];
361 
362  result.sadd(lambda_l, lambda_r, *local_vectors[1]);
363  }
364 
368  unsigned int
369  GetControlNDoFs(int /*time_point*/= -1) const
370  {
371  return GetControlDoFHandler().n_dofs();
372  }
376  unsigned int
377  GetStateNDoFs(int /*time_point*/= -1) const
378  {
379  return GetStateDoFHandler().n_dofs();
380  }
384  unsigned int
385  GetConstraintNDoFs(std::string name) const
386  {
387  return constraints_.n_dofs(name);
388  }
392  unsigned int
394  {
395  return constraints_.n_dofs("global");
396  //return constraints_.global_n_dofs();
397  }
401  unsigned int
403  {
404  return constraints_.n_dofs("local");
405  //return constraints_.local_n_dofs();
406  }
407 
411  const std::vector<Point<dim> >&
413  {
414  support_points_.resize(GetStateNDoFs());
416  GetStateDoFHandler(), support_points_);
417  return support_points_;
418  }
419 
420  /******************************************************/
421  void
422  ComputeControlSparsityPattern(SPARSITYPATTERN & sparsity) const;
423 
424  /******************************************************/
425  void
426  ComputeStateSparsityPattern(SPARSITYPATTERN & sparsity) const
427  {
428  this->GetSparsityMaker()->ComputeSparsityPattern(
429  this->GetStateDoFHandler(), sparsity,
431  }
432 
433  /******************************************************/
434 
438  const FE<dim, dim>&
439  GetFESystem(std::string name) const
440  {
441  if (name == "state")
442  {
443  return *state_fe_;
444  }
445  else if (name == "control")
446  {
447  return *control_fe_;
448  }
449  else
450  {
451  throw DOpEException("Not implemented for name =" + name,
452  "MethodOfLines_MultiMesh_SpaceTimeHandler::GetFESystem");
453  }
454 
455  }
456 
467  void
470  {
471  assert(ref_type == DOpEtypes::RefinementType::global);
472  RefinementContainer ref_con_dummy;
473  RefineStateSpace(ref_con_dummy);
474  RefineControlSpace(ref_con_dummy);
475  }
476 
487  void
490  {
491  //assert(ref_type == DOpEtypes::RefinementType::global);
492  RefinementContainer ref_con_dummy;
493  RefineStateSpace(ref_con_dummy);
494  }
495 
506  void
509  {
510  //assert(ref_type == DOpEtypes::RefinementType::global);
511  RefinementContainer ref_con_dummy;
512  RefineControlSpace(ref_con_dummy);
513  }
514 
524  template<typename NUMBER>
525  void
526  RefineSpace(const RefinementContainer&ref_container)
527  {
528  RefineStateSpace(ref_container);
529  RefineControlSpace(ref_container);
530  }
531 
540  void
541  RefineStateSpace(const RefinementContainer& ref_container)
542  {
543  DOpEtypes::RefinementType ref_type = ref_container.GetRefType();
544 
545  //make sure that we do not use any coarsening
546  assert(!ref_container.UsesCoarsening());
547 
548  if (state_mesh_transfer_ != NULL)
549  {
550  delete state_mesh_transfer_;
551  state_mesh_transfer_ = NULL;
552  }
553  state_mesh_transfer_ = new DOpEWrapper::SolutionTransfer<dim, VECTOR,
554  DH>(state_dof_handler_);
555 
556  if (DOpEtypes::RefinementType::global == ref_type)
557  {
558  state_triangulation_.set_all_refine_flags();
559  }
560  else if (DOpEtypes::RefinementType::fixed_number == ref_type)
561  {
562 
563  GridRefinement::refine_and_coarsen_fixed_number(
564  state_triangulation_, ref_container.GetLocalErrorIndicators(),
565  ref_container.GetTopFraction(),
566  ref_container.GetBottomFraction());
567  }
568  else if (DOpEtypes::RefinementType::fixed_fraction == ref_type)
569  {
570 
571  GridRefinement::refine_and_coarsen_fixed_fraction(
572  state_triangulation_, ref_container.GetLocalErrorIndicators(),
573  ref_container.GetTopFraction(),
574  ref_container.GetBottomFraction());
575  }
576  else if (DOpEtypes::RefinementType::optimized == ref_type)
577  {
578 
579  GridRefinement::refine_and_coarsen_optimize(state_triangulation_,
580  ref_container.GetLocalErrorIndicators(),
581  ref_container.GetConvergenceOrder());
582  }
583  else if (DOpEtypes::RefinementType::finest_of_both == ref_type)
584  {
585  this->FlagIfLeftIsNotFinest(state_triangulation_,
586  control_triangulation_);
587  }
588  else
589  {
590  throw DOpEException("Not implemented for name =" + DOpEtypesToString(ref_type),
591  "MethodOfLines_MultiMesh_SpaceTimeHandler::RefineSpace");
592  }
593  state_triangulation_.prepare_coarsening_and_refinement();
594  if (state_mesh_transfer_ != NULL)
595  state_mesh_transfer_->prepare_for_pure_refinement();
596 
597  state_triangulation_.execute_coarsening_and_refinement();
598  }
599 
608  void
610  {
611  DOpEtypes::RefinementType ref_type = ref_container.GetRefType();
612 
613  //make sure that we do not use any coarsening
614  assert(!ref_container.UsesCoarsening());
615 
616  if (control_mesh_transfer_ != NULL)
617  {
618  delete control_mesh_transfer_;
619  control_mesh_transfer_ = NULL;
620  }
621 #if dope_dimension == deal_II_dimension
622  control_mesh_transfer_ = new DOpEWrapper::SolutionTransfer<dim, VECTOR,
623  DH>(control_dof_handler_);
624 #endif
625  if (DOpEtypes::RefinementType::global == ref_type)
626  {
627  control_triangulation_.set_all_refine_flags();
628  }
629 
630  else if (DOpEtypes::RefinementType::fixed_number == ref_type)
631  {
632 
633  GridRefinement::refine_and_coarsen_fixed_number(
634  control_triangulation_, ref_container.GetLocalErrorIndicators(),
635  ref_container.GetTopFraction(),
636  ref_container.GetBottomFraction());
637  }
638  else if (DOpEtypes::RefinementType::fixed_fraction == ref_type)
639  {
640 
641  GridRefinement::refine_and_coarsen_fixed_fraction(
642  control_triangulation_, ref_container.GetLocalErrorIndicators(),
643  ref_container.GetTopFraction(),
644  ref_container.GetBottomFraction());
645  }
646  else if (DOpEtypes::RefinementType::optimized == ref_type)
647  {
648 
649  GridRefinement::refine_and_coarsen_optimize(control_triangulation_,
650  ref_container.GetLocalErrorIndicators(),
651  ref_container.GetConvergenceOrder());
652  }
653  else if ("finest-of-both")
654  {
655  this->FlagIfLeftIsNotFinest(control_triangulation_,
656  state_triangulation_);
657  }
658  else
659  {
660  throw DOpEException("Not implemented for name =" + DOpEtypesToString(ref_type),
661  "MethodOfLines_MultiMesh_SpaceTimeHandler::RefineSpace");
662  }
663  control_triangulation_.prepare_coarsening_and_refinement();
664 
665  //FIXME: works only if no coarsening happens, because we do not have the vectors to be interpolated availiable...
666  if (control_mesh_transfer_ != NULL)
667  control_mesh_transfer_->prepare_for_pure_refinement();
668 
669  control_triangulation_.execute_coarsening_and_refinement();
670  }
671  /******************************************************/
672 
676  unsigned int
677  NewTimePointToOldTimePoint(unsigned int t) const
678  {
679  //TODO this has to be implemented when temporal refinement is possible!
680  //At present the temporal grid can't be refined
681  return t;
682  }
683 
684  /******************************************************/
685 
689  void
690  SpatialMeshTransferControl(const VECTOR& old_values,
691  VECTOR& new_values) const
692  {
693  if (control_mesh_transfer_ != NULL)
694  control_mesh_transfer_->refine_interpolate(old_values, new_values);
695  }
696  /******************************************************/
697 
701  void
702  SpatialMeshTransferState(const VECTOR& old_values,
703  VECTOR& new_values) const
704  {
705  if (state_mesh_transfer_ != NULL)
706  state_mesh_transfer_->refine_interpolate(old_values, new_values);
707  }
708  /******************************************************/
717  void
719  UserDefinedDoFConstraints<DH, dim>& constraints_maker)
720  {
721  user_defined_dof_constr_ = &constraints_maker;
722  user_defined_dof_constr_->RegisterMapping(this->GetMapping());
723  }
724  /******************************************************/
732  void
734  {
735  assert(sparse_mkr_dynamic_==true); //If not true, we already set the sparsity maker
736  if (sparsitymaker_ != NULL && sparse_mkr_dynamic_)
737  delete sparsitymaker_;
738  sparsitymaker_ = &sparsity_maker;
739  sparse_mkr_dynamic_ = false;
740  }
741  /******************************************************/
748  void
749  ResetStateTriangulation(const dealii::Triangulation<dim>& tria)
750  {
751  state_dof_handler_.clear();
752  state_triangulation_.clear();
753  state_triangulation_.copy_triangulation(tria);
754  state_dof_handler_.initialize(state_triangulation_, *state_fe_);
755  this->IncrementStateTicket();
756  if (state_mesh_transfer_ != NULL)
757  delete state_mesh_transfer_;
758  state_mesh_transfer_ = NULL;
759  }
760 
761  /******************************************************/
768  void
769  ResetControlTriangulation(const dealii::Triangulation<dim>& tria)
770  {
771  control_dof_handler_.clear();
772  control_triangulation_.clear();
773  control_triangulation_.copy_triangulation(tria);
774  control_dof_handler_.initialize(control_triangulation_, *control_fe_);
775  this->IncrementControlTicket();
776  if (control_mesh_transfer_ != NULL)
777  delete control_mesh_transfer_;
778  control_mesh_transfer_ = NULL;
779  }
780 
781  private:
783  GetSparsityMaker() const
784  {
785  return sparsitymaker_;
786  }
787  const UserDefinedDoFConstraints<DH, dim>*
788  GetUserDefinedDoFConstraints() const
789  {
790  return user_defined_dof_constr_;
791  }
792 
793  void
794  FlagIfLeftIsNotFinest(dealii::Triangulation<dim>& left,
795  const dealii::Triangulation<dim>& right);
796 
797  SparsityMaker<DH, dim>* sparsitymaker_;
798  UserDefinedDoFConstraints<DH, dim>* user_defined_dof_constr_;
799 
800  dealii::Triangulation<dim> control_triangulation_;
801  dealii::Triangulation<dim>& state_triangulation_;
802  DOpEWrapper::DoFHandler<dim, DH> control_dof_handler_;
803  DOpEWrapper::DoFHandler<dim, DH> state_dof_handler_;
804 
805  std::vector<unsigned int> control_dofs_per_block_;
806  std::vector<unsigned int> state_dofs_per_block_;
807 
808  dealii::ConstraintMatrix control_dof_constraints_;
809  dealii::ConstraintMatrix state_dof_constraints_;
810 
811  const dealii::SmartPointer<const FE<dim, dim>> control_fe_;
812  const dealii::SmartPointer<const FE<dim, dim>> state_fe_;
813 
815 
816  std::vector<Point<dim> > support_points_;
817 
818  Constraints constraints_;
819  DOpEWrapper::SolutionTransfer<dim, VECTOR,DH>* control_mesh_transfer_;
820  DOpEWrapper::SolutionTransfer<dim, VECTOR,DH>* state_mesh_transfer_;
821  bool sparse_mkr_dynamic_;
822  };
823 
824  /**************************explicit instantiation*************/
825 #if dope_dimension == deal_II_dimension
826 
829  template<>
830  void
832  dealii::DoFHandler, dealii::BlockSparsityPattern,
833  dealii::BlockVector<double>, dope_dimension>::ComputeControlSparsityPattern(
834  dealii::BlockSparsityPattern & sparsity) const
835  {
836  const std::vector<unsigned int>& blocks = this->GetControlDoFsPerBlock();
837 #if DEAL_II_VERSION_GTE(8,3,0)
838  dealii::BlockDynamicSparsityPattern csp(blocks.size(),
839  blocks.size());
840 #else
841  dealii::BlockCompressedSimpleSparsityPattern csp(blocks.size(),
842  blocks.size());
843 #endif
844  for (unsigned int i = 0; i < blocks.size(); i++)
845  {
846  for (unsigned int j = 0; j < blocks.size(); j++)
847  {
848  csp.block(i, j).reinit(this->GetControlDoFsPerBlock(i),
849  this->GetControlDoFsPerBlock(j));
850  }
851  }
852  csp.collect_sizes();
853 
854  dealii::DoFTools::make_sparsity_pattern(
855  static_cast<const dealii::DoFHandler<deal_II_dimension>&>(this->GetControlDoFHandler()),
856  csp);
857  this->GetControlDoFConstraints().condense(csp);
858  sparsity.copy_from(csp);
859  }
860 
861  /******************************************************/
862 
863  template<>
864  void
866  dealii::DoFHandler, dealii::SparsityPattern, dealii::Vector<double>,
867  dope_dimension>::ComputeControlSparsityPattern(
868  dealii::SparsityPattern & sparsity) const
869  {
870  const unsigned int total_dofs = this->GetControlNDoFs();
871 #if DEAL_II_VERSION_GTE(8,3,0)
872  dealii::DynamicSparsityPattern csp(total_dofs, total_dofs);
873 #else
874  dealii::CompressedSimpleSparsityPattern csp(total_dofs, total_dofs);
875 #endif
876  dealii::DoFTools::make_sparsity_pattern(
877  static_cast<const dealii::DoFHandler<deal_II_dimension>&>(this->GetControlDoFHandler()),
878  csp);
879  this->GetControlDoFConstraints().condense(csp);
880  sparsity.copy_from(csp);
881  }
882 
886  template<>
887  void
888  DOpE::MethodOfLines_MultiMesh_SpaceTimeHandler<dealii::hp::FECollection,
889  dealii::hp::DoFHandler, dealii::BlockSparsityPattern,
890  dealii::BlockVector<double>, dope_dimension>::ComputeControlSparsityPattern(
891  dealii::BlockSparsityPattern & sparsity) const
892  {
893  const std::vector<unsigned int>& blocks = this->GetControlDoFsPerBlock();
894 #if DEAL_II_VERSION_GTE(8,3,0)
895  dealii::BlockDynamicSparsityPattern csp(blocks.size(),
896  blocks.size());
897 #else
898  dealii::BlockCompressedSimpleSparsityPattern csp(blocks.size(),
899  blocks.size());
900 #endif
901  for (unsigned int i = 0; i < blocks.size(); i++)
902  {
903  for (unsigned int j = 0; j < blocks.size(); j++)
904  {
905  csp.block(i, j).reinit(this->GetControlDoFsPerBlock(i),
906  this->GetControlDoFsPerBlock(j));
907  }
908  }
909  csp.collect_sizes();
910 
911  dealii::DoFTools::make_sparsity_pattern(
912  static_cast<const dealii::hp::DoFHandler<deal_II_dimension>&>(this->GetControlDoFHandler()),
913  csp);
914  this->GetControlDoFConstraints().condense(csp);
915  sparsity.copy_from(csp);
916  }
917 
918  /******************************************************/
919 
920  template<>
921  void
922  MethodOfLines_MultiMesh_SpaceTimeHandler<dealii::hp::FECollection,
923  dealii::hp::DoFHandler, dealii::SparsityPattern, dealii::Vector<double>,
924  dope_dimension>::ComputeControlSparsityPattern(
925  dealii::SparsityPattern & sparsity) const
926  {
927  const unsigned int total_dofs = this->GetControlNDoFs();
928 #if DEAL_II_VERSION_GTE(8,3,0)
929  dealii::DynamicSparsityPattern csp(total_dofs, total_dofs);
930 #else
931  dealii::CompressedSimpleSparsityPattern csp(total_dofs, total_dofs);
932 #endif
933  dealii::DoFTools::make_sparsity_pattern(
934  static_cast<const dealii::hp::DoFHandler<deal_II_dimension>&>(this->GetControlDoFHandler()),
935  csp);
936  this->GetControlDoFConstraints().condense(csp);
937  sparsity.copy_from(csp);
938  }
939 #endif //Endof explicit instanciation
940  /*******************************************************/
941  template<template<int, int> class FE, template<int, int> class DH,
942  typename SPARSITYPATTERN, typename VECTOR, int dim>
943  void
944  MethodOfLines_MultiMesh_SpaceTimeHandler<FE, DH, SPARSITYPATTERN, VECTOR,
945  dim>::FlagIfLeftIsNotFinest(dealii::Triangulation<dim>& left,
946  const dealii::Triangulation<dim>& right)
947  {
948  auto element_list = GridTools::get_finest_common_cells(left, right);
949  auto element_iter = element_list.begin();
950  for (; element_iter != element_list.end(); element_iter++)
951  {
952  if (element_iter->second->has_children())
953  {
954  //left is not finest, so we should flag the left element to be refined
955  element_iter->first->set_refine_flag();
956  }
957  }
958  }
959 }
960 
961 #endif
void ReInitTime()
Definition: spacetimehandler_base.h:86
void SetActiveFEIndicesState(DOpEWrapper::DoFHandler< dealdim, DH > &dof_handler)
Definition: spacetimehandler.h:327
Definition: mapping_wrapper.h:48
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_multimesh_spacetimehandler.h:168
void RegisterMapping(const typename DOpEWrapper::Mapping< dealdim, DH > &mapping)
Definition: userdefineddofconstraints.h:76
Definition: dopetypes.h:52
unsigned int GetControlNDoFs(int=-1) const
Definition: mol_multimesh_spacetimehandler.h:369
void SetSparsityMaker(SparsityMaker< DH, dim > &sparsity_maker)
Definition: mol_multimesh_spacetimehandler.h:733
void RefineSpace(const RefinementContainer &ref_container)
Definition: mol_multimesh_spacetimehandler.h:526
unsigned int GetConstraintNDoFs(std::string name) const
Definition: mol_multimesh_spacetimehandler.h:385
const DOpEWrapper::DoFHandler< dim, DH > & GetStateDoFHandler() const
Definition: mol_multimesh_spacetimehandler.h:237
void SetActiveFEIndicesControl(DOpEWrapper::DoFHandler< dopedim, DH > &dof_handler)
Definition: spacetimehandler.h:348
void RefineControlSpace(DOpEtypes::RefinementType=DOpEtypes::RefinementType::global)
Definition: mol_multimesh_spacetimehandler.h:507
const std::vector< unsigned int > & GetStateDoFsPerBlock(int=-1) const
Definition: mol_multimesh_spacetimehandler.h:288
ControlType
Definition: dopetypes.h:103
void SetUserDefinedDoFConstraints(UserDefinedDoFConstraints< DH, dim > &constraints_maker)
Definition: mol_multimesh_spacetimehandler.h:718
MethodOfLines_MultiMesh_SpaceTimeHandler(dealii::Triangulation< dim > &triangulation, const FE< dim, dim > &control_fe, const FE< dim, dim > &state_fe, dealii::Triangulation< 1 > &times, const Constraints &c, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dim, dim > &index_setter=ActiveFEIndexSetterInterface< dim, dim >())
Definition: mol_multimesh_spacetimehandler.h:122
Definition: dopetypes.h:52
void RefineSpace(DOpEtypes::RefinementType ref_type=DOpEtypes::RefinementType::global)
Definition: mol_multimesh_spacetimehandler.h:468
Definition: dopetypes.h:52
const std::vector< Point< dim > > & GetMapDoFToSupportPoints()
Definition: mol_multimesh_spacetimehandler.h:412
void ComputeControlSparsityPattern(SPARSITYPATTERN &sparsity) const
MethodOfLines_MultiMesh_SpaceTimeHandler(dealii::Triangulation< dim > &triangulation, const FE< dim, dim > &control_fe, const FE< dim, dim > &state_fe, dealii::Triangulation< 1 > &times, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dim, dim > &index_setter=ActiveFEIndexSetterInterface< dim, dim >())
Definition: mol_multimesh_spacetimehandler.h:81
Definition: timeiterator.h:62
unsigned int NewTimePointToOldTimePoint(unsigned int t) const
Definition: mol_multimesh_spacetimehandler.h:677
double get_k() const
Definition: timeiterator.h:194
DOpEtypes::RefinementType GetRefType() const
Definition: refinementcontainer.cc:86
RefinementType
Definition: dopetypes.h:50
const dealii::ConstraintMatrix & GetStateDoFConstraints() const
Definition: mol_multimesh_spacetimehandler.h:312
const DOpEWrapper::DoFHandler< dim, DH > & GetControlDoFHandler() const
Definition: mol_multimesh_spacetimehandler.h:228
Definition: refinementcontainer.h:42
void ResetStateTriangulation(const dealii::Triangulation< dim > &tria)
Definition: mol_multimesh_spacetimehandler.h:749
const std::vector< unsigned int > & GetDoFsPerBlock(std::string name) const
Definition: constraints.h:159
unsigned int GetNGlobalConstraints() const
Definition: mol_multimesh_spacetimehandler.h:393
Definition: active_fe_index_setter_interface.h:39
unsigned int GetStateDoFsPerBlock(unsigned int b, int=-1) const
Definition: mol_multimesh_spacetimehandler.h:264
virtual const dealii::Vector< float > & GetLocalErrorIndicators() const
Definition: refinementcontainer.cc:46
virtual double GetTopFraction() const
Definition: refinementcontainer.cc:56
virtual void InterpolateState(VECTOR &result, const std::vector< VECTOR * > &local_vectors, double t, const TimeIterator &it) const
Definition: mol_multimesh_spacetimehandler.h:344
Definition: dopetypes.h:52
unsigned int GetConstraintDoFsPerBlock(std::string name, unsigned int b) const
Definition: mol_multimesh_spacetimehandler.h:272
MethodOfLines_MultiMesh_SpaceTimeHandler(dealii::Triangulation< dim > &triangulation, const FE< dim, dim > &control_fe, const FE< dim, dim > &state_fe, const Constraints &c, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dim, dim > &index_setter=ActiveFEIndexSetterInterface< dim, dim >())
Definition: mol_multimesh_spacetimehandler.h:101
void ComputeStateSparsityPattern(SPARSITYPATTERN &sparsity) const
Definition: mol_multimesh_spacetimehandler.h:426
Definition: constraints.h:33
void SpatialMeshTransferState(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_multimesh_spacetimehandler.h:702
virtual double GetConvergenceOrder() const
Definition: refinementcontainer.cc:76
const dealii::ConstraintMatrix & GetControlDoFConstraints() const
Definition: mol_multimesh_spacetimehandler.h:304
const std::vector< unsigned int > & GetControlDoFsPerBlock(int=-1) const
Definition: mol_multimesh_spacetimehandler.h:280
double get_right() const
Definition: timeiterator.h:184
Definition: spacetimehandler.h:71
void MapDoFsToSupportPoints(const DOpEWrapper::Mapping< dealdim, dealii::DoFHandler > &mapping, const DOpEWrapper::DoFHandler< dealdim, dealii::DoFHandler > &dh, VECTOR &support_points)
Definition: sth_internals.h:47
virtual void InterpolateControl(VECTOR &result, const std::vector< VECTOR * > &local_vectors, double t, const TimeIterator &it) const
Definition: mol_multimesh_spacetimehandler.h:322
virtual void MakeControlDoFConstraints(const DOpEWrapper::DoFHandler< dopedim, DH > &dof_handler, dealii::ConstraintMatrix &dof_constraints) const
Definition: userdefineddofconstraints.h:103
const std::vector< unsigned int > & GetConstraintDoFsPerBlock(std::string name) const
Definition: mol_multimesh_spacetimehandler.h:296
void ReInit(std::vector< unsigned int > &control_dofs_per_block)
Definition: constraints.h:108
~MethodOfLines_MultiMesh_SpaceTimeHandler()
Definition: mol_multimesh_spacetimehandler.h:144
unsigned int GetControlDoFsPerBlock(unsigned int b, int=-1) const
Definition: mol_multimesh_spacetimehandler.h:256
Definition: mol_multimesh_spacetimehandler.h:57
Definition: sparsitymaker.h:50
bool UsesCoarsening() const
Definition: refinementcontainer.cc:94
void RefineStateSpace(DOpEtypes::RefinementType=DOpEtypes::RefinementType::global)
Definition: mol_multimesh_spacetimehandler.h:488
double get_left() const
Definition: timeiterator.h:174
const FE< dim, dim > & GetFESystem(std::string name) const
Definition: mol_multimesh_spacetimehandler.h:439
unsigned int GetStateNDoFs(int=-1) const
Definition: mol_multimesh_spacetimehandler.h:377
void IncrementControlTicket()
Definition: spacetimehandler_base.h:446
Definition: solutiontransfer_wrapper.h:51
unsigned int GetNLocalConstraints() const
Definition: mol_multimesh_spacetimehandler.h:402
MethodOfLines_MultiMesh_SpaceTimeHandler(dealii::Triangulation< dim > &triangulation, const FE< dim, dim > &control_fe, const FE< dim, dim > &state_fe, DOpEtypes::ControlType type, bool flux_pattern=false, const ActiveFEIndexSetterInterface< dim, dim > &index_setter=ActiveFEIndexSetterInterface< dim, dim >())
Definition: mol_multimesh_spacetimehandler.h:61
void RefineStateSpace(const RefinementContainer &ref_container)
Definition: mol_multimesh_spacetimehandler.h:541
Definition: dopeexception.h:35
Definition: dopetypes.h:52
const DOpEWrapper::Mapping< dim, DH > & GetMapping() const
Definition: mol_multimesh_spacetimehandler.h:247
void SpatialMeshTransferControl(const VECTOR &old_values, VECTOR &new_values) const
Definition: mol_multimesh_spacetimehandler.h:690
void RefineControlSpace(const RefinementContainer &ref_container)
Definition: mol_multimesh_spacetimehandler.h:609
virtual double GetBottomFraction() const
Definition: refinementcontainer.cc:66
std::string DOpEtypesToString(const C &)
Definition: dopetypes.h:134
virtual void MakeStateDoFConstraints(const DOpEWrapper::DoFHandler< dealdim, DH > &dof_handler, dealii::ConstraintMatrix &dof_constraints) const
Definition: userdefineddofconstraints.h:93
unsigned int n_dofs(std::string name) const
Definition: constraints.h:141
void IncrementStateTicket()
Definition: spacetimehandler_base.h:437
void ResetControlTriangulation(const dealii::Triangulation< dim > &tria)
Definition: mol_multimesh_spacetimehandler.h:769