ASPECT
interface.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2017-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 #ifndef _aspect_simulator_assemblers_interface_h
16 #define _aspect_simulator_assemblers_interface_h
17 
18 #include <aspect/global.h>
21 
22 #include <deal.II/fe/fe_values.h>
23 
24 namespace aspect
25 {
26  template <int dim>
27  class Simulator;
28 
29  struct AdvectionField;
30 
38  namespace internal
39  {
40  namespace Assembly
41  {
42  namespace Scratch
43  {
50  template <int dim>
51  struct ScratchBase
52  {
54  :
55  cell(),
56  face_number(numbers::invalid_unsigned_int)
57  {}
58 
59  ScratchBase(const ScratchBase &scratch)
60  :
61  cell(scratch.cell),
62  face_number(scratch.face_number)
63  {}
64 
65  virtual ~ScratchBase () = default;
66 
71 
78  unsigned face_number;
79  };
80 
85  template <int dim>
86  struct StokesPreconditioner: public ScratchBase<dim>
87  {
88  StokesPreconditioner (const FiniteElement<dim> &finite_element,
89  const Quadrature<dim> &quadrature,
90  const Mapping<dim> &mapping,
91  const UpdateFlags update_flags,
92  const unsigned int n_compositional_fields,
93  const unsigned int stokes_dofs_per_cell,
94  const bool add_compaction_pressure,
95  const bool rebuild_matrix,
96  const bool use_bfbt);
97  StokesPreconditioner (const StokesPreconditioner &scratch);
98 
99  ~StokesPreconditioner () override;
100 
102 
103  void reinit (const typename DoFHandler<dim>::active_cell_iterator &cell_ref);
104 
105  std::vector<types::global_dof_index> local_dof_indices;
106  std::vector<SymmetricTensor<2,dim>> grads_phi_u;
107  std::vector<double> div_phi_u;
108  std::vector<double> phi_p;
109  std::vector<Tensor<1,dim>> phi_u;
110  std::vector<double> phi_p_c;
111  std::vector<Tensor<1,dim>> grad_phi_p;
112 
119 
126  };
127 
128 
129 
140  template <int dim>
141  struct StokesSystem : public StokesPreconditioner<dim>
142  {
143  StokesSystem (const FiniteElement<dim> &finite_element,
144  const Mapping<dim> &mapping,
145  const Quadrature<dim> &quadrature,
146  const Quadrature<dim-1> &face_quadrature,
147  const UpdateFlags update_flags,
148  const UpdateFlags face_update_flags,
149  const unsigned int n_compositional_fields,
150  const unsigned int stokes_dofs_per_cell,
151  const bool add_compaction_pressure,
152  const bool use_reference_density_profile,
153  const bool rebuild_stokes_matrix,
154  const bool rebuild_newton_stokes_matrix,
155  const bool use_bfbt);
156 
157  StokesSystem (const StokesSystem<dim> &scratch);
158 
160 
162 
163  void reinit (const typename DoFHandler<dim>::active_cell_iterator &cell_ref,
164  const unsigned face_number_ref);
165 
166  std::vector<Tensor<1,dim>> phi_u;
167  std::vector<Tensor<1,dim>> velocity_values;
168  std::vector<double> velocity_divergence;
169  std::vector<Tensor<1,dim>> temperature_gradients;
170 
181 
191  std::vector<double> reference_densities;
193 
200  };
201 
202 
203 
208  template <int dim>
209  struct AdvectionSystem: public ScratchBase<dim>
210  {
211  AdvectionSystem (const FiniteElement<dim> &finite_element,
212  const FiniteElement<dim> &advection_element,
213  const Mapping<dim> &mapping,
214  const Quadrature<dim> &quadrature,
215  const Quadrature<dim-1> &face_quadrature,
216  const UpdateFlags update_flags,
217  const UpdateFlags face_update_flags,
218  const unsigned int n_compositional_fields,
219  const AdvectionField &field);
220  AdvectionSystem (const AdvectionSystem &scratch);
221 
223 
224  void reinit (const typename DoFHandler<dim>::active_cell_iterator &cell_ref);
225 
226  std::unique_ptr<FEFaceValues<dim>> face_finite_element_values;
227  std::unique_ptr<FEFaceValues<dim>> neighbor_face_finite_element_values;
228  std::unique_ptr<FESubfaceValues<dim>> subface_finite_element_values;
229 
230  std::vector<types::global_dof_index> local_dof_indices;
231 
240  std::vector<double> phi_field;
241  std::vector<Tensor<1,dim>> grad_phi_field;
242  std::vector<double> laplacian_phi_field;
243  std::vector<double> face_phi_field;
244  std::vector<Tensor<1,dim>> face_grad_phi_field;
245  std::vector<double> neighbor_face_phi_field;
246  std::vector<Tensor<1,dim>> neighbor_face_grad_phi_field;
247 
248  std::vector<Tensor<1,dim>> old_velocity_values;
249  std::vector<Tensor<1,dim>> old_old_velocity_values;
250 
251  std::vector<double> old_pressure;
252  std::vector<double> old_old_pressure;
253  std::vector<Tensor<1,dim>> old_pressure_gradients;
254  std::vector<Tensor<1,dim>> old_old_pressure_gradients;
255 
256  std::vector<SymmetricTensor<2,dim>> old_strain_rates;
257  std::vector<SymmetricTensor<2,dim>> old_old_strain_rates;
258 
259  std::vector<double> old_temperature_values;
260  std::vector<double> old_old_temperature_values;
261 
262  std::vector<double> old_field_values;
263  std::vector<double> old_old_field_values;
264  std::vector<Tensor<1,dim>> old_field_grads;
265  std::vector<Tensor<1,dim>> old_old_field_grads;
266  std::vector<double> old_field_laplacians;
267  std::vector<double> old_old_field_laplacians;
268 
269  std::vector<std::vector<double>> old_composition_values;
270  std::vector<std::vector<double>> old_old_composition_values;
271 
272  std::vector<double> current_temperature_values;
273  std::vector<Tensor<1,dim>> current_velocity_values;
274  std::vector<Tensor<1,dim>> face_current_velocity_values;
275  std::vector<Tensor<1,dim>> mesh_velocity_values;
276  std::vector<Tensor<1,dim>> face_mesh_velocity_values;
277 
278  std::vector<SymmetricTensor<2,dim>> current_strain_rates;
279  std::vector<std::vector<double>> current_composition_values;
280  std::vector<double> current_velocity_divergences;
281 
288 
291 
294 
305 
314 
320  };
321  }
322 
323 
324 
337  namespace CopyData
338  {
344  template <int dim>
346  {
347  virtual ~CopyDataBase () = default;
348  };
349 
355  template <int dim>
356  struct StokesPreconditioner: public CopyDataBase<dim>
357  {
358  StokesPreconditioner (const unsigned int stokes_dofs_per_cell);
359 
360  StokesPreconditioner (const StokesPreconditioner &data);
361 
362  ~StokesPreconditioner () override = default;
363  StokesPreconditioner<dim> &operator= (const StokesPreconditioner<dim> &data) = default;
364 
367  std::vector<types::global_dof_index> local_dof_indices;
368 
374  void extract_stokes_dof_indices(const std::vector<types::global_dof_index> &all_dof_indices,
375  const Introspection<dim> &introspection);
376  };
377 
383  template <int dim>
384  struct StokesSystem : public StokesPreconditioner<dim>
385  {
386  StokesSystem (const unsigned int stokes_dofs_per_cell,
387  const bool do_pressure_rhs_compatibility_modification);
388  StokesSystem (const StokesSystem<dim> &data);
389 
390  ~StokesSystem () override = default;
391  StokesSystem<dim> &operator= (const StokesSystem<dim> &data) = default;
392 
395  };
396 
402  template <int dim>
403  struct AdvectionSystem: public CopyDataBase<dim>
404  {
413  AdvectionSystem (const FiniteElement<dim> &finite_element,
414  const bool field_is_discontinuous);
415 
421 
433  std::vector<FullMatrix<double>> local_matrices_int_ext;
434  std::vector<FullMatrix<double>> local_matrices_ext_int;
435  std::vector<FullMatrix<double>> local_matrices_ext_ext;
436 
442 
449  std::vector<bool> assembled_matrices;
450 
460  std::vector<types::global_dof_index> local_dof_indices;
461 
470  std::vector<std::vector<types::global_dof_index>> neighbor_dof_indices;
471  };
472  }
473  }
474  }
475 
480  namespace Assemblers
481  {
491  template <int dim>
492  unsigned int
494 
500  template <int dim>
501  unsigned int
502  nth_interface_matrix (const ReferenceCell<dim> &reference_cell,
503  const unsigned int face);
504 
510  template <int dim>
511  unsigned int
512  nth_interface_matrix (const ReferenceCell<dim> &reference_cell,
513  const unsigned int face,
514  const unsigned int sub_face);
515 
530  template <int dim>
531  class Interface : public Plugins::InterfaceBase
532  {
533  public:
547  virtual
548  void
551 
586  virtual
587  void
588  create_additional_material_model_outputs(MaterialModel::MaterialModelOutputs<dim> &) const;
589 
603  virtual
604  std::vector<double>
605  compute_residual(internal::Assembly::Scratch::ScratchBase<dim> &) const;
606  };
607 
608 
609 
617  template <int dim>
619  {
620  public:
622 
632  virtual
633  std::vector<double>
634  advection_prefactors(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base) const;
635 
645  virtual
646  std::vector<double>
647  diffusion_prefactors(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base) const;
648  };
649 
650 
651 
678  template <int dim>
679  class Manager
680  {
681  public:
682 
686  void reset ();
687 
692  std::vector<std::unique_ptr<Assemblers::Interface<dim>>> stokes_preconditioner;
693 
699  std::vector<std::unique_ptr<Assemblers::Interface<dim>>> stokes_system;
700 
708  std::vector<std::unique_ptr<Assemblers::Interface<dim>>> stokes_system_on_boundary_face;
709 
715  std::vector<std::vector<std::unique_ptr<Assemblers::Interface<dim>>>> advection_system;
716 
724  std::vector<std::vector<std::unique_ptr<Assemblers::Interface<dim>>>> advection_system_on_boundary_face;
725 
733  std::vector<std::vector<std::unique_ptr<Assemblers::Interface<dim>>>> advection_system_on_interior_face;
734 
754  struct Properties
755  {
760  Properties ();
761 
770 
779 
785 
793  };
794 
804  std::vector<Properties> advection_system_assembler_properties;
806  };
807  }
808 }
809 
810 
811 #endif
std::vector< SymmetricTensor< 2, dim > > old_strain_rates
Definition: interface.h:256
std::vector< Tensor< 1, dim > > old_field_grads
Definition: interface.h:264
std::vector< types::global_dof_index > local_dof_indices
Definition: interface.h:460
std::vector< Tensor< 1, dim > > old_velocity_values
Definition: interface.h:248
std::vector< index_type > data
std::vector< std::unique_ptr< Assemblers::Interface< dim > > > stokes_system
Definition: interface.h:699
std::vector< std::vector< std::unique_ptr< Assemblers::Interface< dim > > > > advection_system_on_interior_face
Definition: interface.h:733
Properties stokes_preconditioner_assembler_properties
Definition: interface.h:801
MaterialModel::MaterialModelInputs< dim > face_material_model_inputs
Definition: interface.h:179
unsigned int n_interface_matrices(const ReferenceCell< dim > &reference_cell)
std::vector< Tensor< 1, dim > > face_mesh_velocity_values
Definition: interface.h:276
std::vector< Tensor< 1, dim > > grad_phi_field
Definition: interface.h:241
std::vector< std::vector< std::unique_ptr< Assemblers::Interface< dim > > > > advection_system
Definition: interface.h:715
std::vector< Tensor< 1, dim > > face_grad_phi_field
Definition: interface.h:244
MaterialModel::MaterialModelOutputs< dim > material_model_outputs
Definition: interface.h:287
MaterialModel::MaterialModelInputs< dim > material_model_inputs
Definition: interface.h:286
HeatingModel::HeatingModelOutputs face_heating_model_outputs
Definition: interface.h:303
MaterialModel::MaterialModelOutputs< dim > neighbor_face_material_model_outputs
Definition: interface.h:293
std::vector< Tensor< 1, dim > > mesh_velocity_values
Definition: interface.h:275
std::vector< Tensor< 1, dim > > old_pressure_gradients
Definition: interface.h:253
std::vector< SymmetricTensor< 2, dim > > old_old_strain_rates
Definition: interface.h:257
std::vector< Tensor< 1, dim > > old_old_field_grads
Definition: interface.h:265
std::vector< Tensor< 1, dim > > temperature_gradients
Definition: interface.h:169
std::vector< SymmetricTensor< 2, dim > > current_strain_rates
Definition: interface.h:278
ScratchBase(const ScratchBase &scratch)
Definition: interface.h:59
UpdateFlags
std::vector< Tensor< 1, dim > > current_velocity_values
Definition: interface.h:273
unsigned int nth_interface_matrix(const ReferenceCell< dim > &reference_cell, const unsigned int face, const unsigned int sub_face)
std::vector< Properties > advection_system_assembler_properties
Definition: interface.h:804
MaterialModel::MaterialModelOutputs< dim > face_material_model_outputs
Definition: interface.h:290
HeatingModel::HeatingModelOutputs neighbor_face_heating_model_outputs
Definition: interface.h:304
std::vector< Tensor< 1, dim > > neighbor_face_grad_phi_field
Definition: interface.h:246
std::unique_ptr< FEFaceValues< dim > > neighbor_face_finite_element_values
Definition: interface.h:227
std::vector< std::vector< types::global_dof_index > > neighbor_dof_indices
Definition: interface.h:470
std::vector< FullMatrix< double > > local_matrices_int_ext
Definition: interface.h:433
std::vector< Tensor< 1, dim > > old_old_velocity_values
Definition: interface.h:249
std::vector< FullMatrix< double > > local_matrices_ext_int
Definition: interface.h:434
std::vector< std::vector< double > > old_composition_values
Definition: interface.h:269
std::vector< SymmetricTensor< 2, dim > > grads_phi_u
Definition: interface.h:106
Properties stokes_system_assembler_on_boundary_face_properties
Definition: interface.h:803
DoFHandler< dim >::active_cell_iterator cell
Definition: interface.h:70
std::vector< std::vector< double > > old_old_composition_values
Definition: interface.h:270
MaterialModel::MaterialModelOutputs< dim > face_material_model_outputs
Definition: interface.h:180
std::vector< Tensor< 1, dim > > old_old_pressure_gradients
Definition: interface.h:254
std::vector< types::global_dof_index > local_dof_indices
Definition: interface.h:367
std::vector< Tensor< 1, dim > > velocity_values
Definition: interface.h:167
HeatingModel::HeatingModelOutputs heating_model_outputs
Definition: interface.h:302
std::vector< Properties > advection_system_assembler_on_face_properties
Definition: interface.h:805
std::vector< double > reference_densities_depth_derivative
Definition: interface.h:192
MaterialModel::MaterialModelInputs< dim > neighbor_face_material_model_inputs
Definition: interface.h:292
std::unique_ptr< FESubfaceValues< dim > > subface_finite_element_values
Definition: interface.h:228
std::vector< std::unique_ptr< Assemblers::Interface< dim > > > stokes_system_on_boundary_face
Definition: interface.h:708
std::vector< Tensor< 1, dim > > face_current_velocity_values
Definition: interface.h:274
std::vector< FullMatrix< double > > local_matrices_ext_ext
Definition: interface.h:435
std::vector< Tensor< 1, dim > > phi_u
Definition: interface.h:166
std::vector< std::vector< std::unique_ptr< Assemblers::Interface< dim > > > > advection_system_on_boundary_face
Definition: interface.h:724
MaterialModel::MaterialModelInputs< dim > face_material_model_inputs
Definition: interface.h:289
MaterialModel::MaterialModelInputs< dim > material_model_inputs
Definition: interface.h:117
std::vector< std::vector< double > > current_composition_values
Definition: interface.h:279
std::unique_ptr< FEFaceValues< dim > > face_finite_element_values
Definition: interface.h:226
std::vector< std::unique_ptr< Assemblers::Interface< dim > > > stokes_preconditioner
Definition: interface.h:692
MaterialModel::MaterialModelOutputs< dim > material_model_outputs
Definition: interface.h:118
Properties stokes_system_assembler_properties
Definition: interface.h:802
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell< dim > &reference_cell)
std::vector< types::global_dof_index > local_dof_indices
Definition: interface.h:230
std::vector< types::global_dof_index > local_dof_indices
Definition: interface.h:105