Amandus: Simulations based on multilevel Schwarz methods
massout.h
Go to the documentation of this file.
1 #ifndef __cahn_hilliard_massout_h
2 #define __cahn_hilliard_massout_h
3 
4 #include <deal.II/algorithms/any_data.h>
5 #include <deal.II/algorithms/operator.h>
6 #include <deal.II/base/config.h>
7 #include <deal.II/base/event.h>
8 #include <deal.II/base/parameter_handler.h>
9 #include <deal.II/base/timer.h>
10 #include <deal.II/dofs/dof_handler.h>
11 #include <deal.II/numerics/data_out.h>
12 #include <deal.II/numerics/solution_transfer.h>
13 
14 #include <amandus/adaptivity.h>
15 
16 namespace CahnHilliard
17 {
18 using namespace dealii;
19 using namespace Algorithms;
20 
21 template <class VECTOR, int dim, int spacedim = dim>
22 class MassOutputOperator : public OutputOperator<VECTOR>
23 {
24 public:
25  MassOutputOperator(const std::string filename_base = std::string("output"),
26  const unsigned int digits = 3);
27 
28  void parse_parameters(ParameterHandler& param);
29  void initialize(const DoFHandler<dim, spacedim>& dof_handler);
30  void
32  {
33  this->remesher = remesher;
34  }
35 
36  void assemble_mean_operator();
37  void log_mass(const VECTOR* solution);
38  void write_output(const AnyData& vectors);
39 
40  virtual OutputOperator<VECTOR>& operator<<(const AnyData& vectors);
41 
42 protected:
43  Vector<double> mean_values;
44  std::vector<bool> cdofmask;
45  SmartPointer<const DoFHandler<dim, spacedim>, MassOutputOperator<VECTOR, dim, spacedim>> dof;
47 
48  const std::string filename_base;
49  const unsigned int digits;
50 
51  DataOut<dim> out;
52 
53  Timer timer;
54 };
55 
56 template <class VECTOR, int dim, int spacedim>
57 inline void
58 MassOutputOperator<VECTOR, dim, spacedim>::initialize(const DoFHandler<dim, spacedim>& dof_handler)
59 {
60  dof = &dof_handler;
61 }
62 
63 template <class VECTOR, int dim, int spacedim>
65  const unsigned int digits)
66  : filename_base(filename_base)
67  , digits(digits)
68 {
69  out.set_default_format(DataOutBase::gnuplot);
70 }
71 
72 template <class VECTOR, int dim, int spacedim>
73 void
75 {
76  out.parse_parameters(param);
77 }
78 
79 template <class VECTOR, int dim, int spacedim>
80 void
82 {
83  ConstraintMatrix hanging_node_constraints;
84  DoFTools::make_hanging_node_constraints(*(this->dof), hanging_node_constraints);
85  hanging_node_constraints.close();
86 
87  MeshWorker::IntegrationInfoBox<dim> info_box;
88  UpdateFlags update_flags = update_values;
89  info_box.add_update_flags_cell(update_flags);
90  info_box.initialize(
91  this->dof->get_fe(), StaticMappingQ1<dim, spacedim>::mapping, &(this->dof->block_info()));
92 
93  MeshWorker::DoFInfo<dim> dofinfo(this->dof->block_info());
94 
95  AnyData out;
96  mean_values.reinit(this->dof->n_dofs());
97  out.add(&mean_values, "mean");
98 
99  MeshWorker::Assembler::ResidualSimple<Vector<double>> assembler;
100  assembler.initialize(hanging_node_constraints);
101  assembler.initialize(out);
102 
104 
105  MeshWorker::integration_loop<dim, dim>(
106  this->dof->begin_active(), this->dof->end(), dofinfo, info_box, integrator, assembler);
107 
108  const FiniteElement<dim>& fe_sys = this->dof->get_fe();
109  ComponentMask cmask(fe_sys.n_components(), false);
110  cmask.set(1, true);
111  cdofmask.resize(this->dof->n_dofs());
112  DoFTools::extract_dofs(*(this->dof), cmask, cdofmask);
113 }
114 
115 template <class VECTOR, int dim, int spacedim>
116 void
118 {
119  double mass = 0.0;
120  for (unsigned int i = 0; i < this->cdofmask.size(); ++i)
121  {
122  if (this->cdofmask[i])
123  {
124  mass += (*solution)[i] * this->mean_values[i];
125  }
126  }
127  deallog << "Mass(" << this->step << "): " << mass << std::endl;
128 }
129 
130 template <class VECTOR, int dim, int spacedim>
131 void
133 {
134  Assert((dof != 0), ExcNotInitialized());
135  out.attach_dof_handler(*dof);
136  for (unsigned int i = 0; i < data.size(); ++i)
137  {
138  const VECTOR* p = data.try_read_ptr<VECTOR>(i);
139  if (p != 0)
140  {
141  out.add_data_vector(*p, data.name(i));
142  }
143  }
144  std::ostringstream streamOut;
145  streamOut << filename_base << std::setw(digits) << std::setfill('0') << this->step
146  << out.default_suffix();
147  std::ofstream out_filename(streamOut.str().c_str());
148  out.build_patches();
149  out.write(out_filename);
150  out.clear();
151 }
152 
153 template <class VECTOR, int dim, int spacedim>
154 OutputOperator<VECTOR>& MassOutputOperator<VECTOR, dim, spacedim>::operator<<(const AnyData& data)
155 {
156  timer.stop();
157  deallog << "Time(" << this->step << "): " << timer.wall_time() << std::endl;
158 
159  write_output(data);
160 
161  if (this->mean_values.size() != this->dof->n_dofs())
162  {
164  }
165  log_mass(data.try_read_ptr<VECTOR>(0));
166  if (this->remesher != 0)
167  {
168  this->remesher->operator()(const_cast<AnyData&>(data), AnyData());
169  }
170 
171  timer.restart();
172 
173  return *this;
174 }
175 }
176 
177 #endif
Definition: massout.h:22
void initialize(Remesher< VECTOR, dim > *remesher)
Definition: massout.h:31
Vector< double > mean_values
Definition: massout.h:43
DataOut< dim > out
Definition: massout.h:51
void assemble_mean_operator()
Definition: massout.h:81
const unsigned int digits
Definition: massout.h:49
const std::string filename_base
Definition: massout.h:48
virtual OutputOperator< VECTOR > & operator<<(const AnyData &vectors)
Definition: massout.h:154
Remesher< VECTOR, dim > * remesher
Definition: massout.h:46
void log_mass(const VECTOR *solution)
Definition: massout.h:117
void write_output(const AnyData &vectors)
Definition: massout.h:132
SmartPointer< const DoFHandler< dim, spacedim >, MassOutputOperator< VECTOR, dim, spacedim > > dof
Definition: massout.h:45
MassOutputOperator(const std::string filename_base=std::string("output"), const unsigned int digits=3)
Definition: massout.h:64
Timer timer
Definition: massout.h:53
void initialize(const DoFHandler< dim, spacedim > &dof_handler)
Definition: massout.h:58
Definition: integrator.h:599
Base class for remeshing operators.
Definition: adaptivity.h:26
void parse_parameters(ParameterHandler &param)
Definition: massout.h:74
Definition: massout.h:16
std::vector< bool > cdofmask
Definition: massout.h:44