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) 2011-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_material_model_interface_h
16 #define _aspect_material_model_interface_h
17 
18 #include <aspect/global.h>
19 #include <aspect/plugins.h>
21 
22 #include <deal.II/base/point.h>
28 #include <deal.II/fe/mapping.h>
29 #include <deal.II/fe/fe_values.h>
33 
34 namespace aspect
35 {
36  template <int dim>
37  struct Introspection;
38 
39 
47  namespace MaterialModel
48  {
53  namespace NonlinearDependence
54  {
77  {
79 
80  none = 1,
82  pressure = 4,
85 
87  };
88 
89 
94  const Dependence d2)
95  {
96  return Dependence(static_cast<int>(d1) | static_cast<int>(d2));
97  }
98 
100  const Dependence d2)
101  {
102  d1 = (d1 | d2);
103  return d1;
104  }
105 
111  {
117 
123 
129 
135 
141 
147  ModelDependence ();
148  };
149 
158  bool
159  identifies_single_variable(const Dependence dependence);
160  }
161 
166  namespace MaterialProperties
167  {
177  enum Property
178  {
180 
181  none = 1,
183  density = 4,
193 
196  specific_heat |
201  viscosity |
206  };
207 
212  inline Property operator | (const Property d1,
213  const Property d2)
214  {
215  return Property(static_cast<int>(d1) | static_cast<int>(d2));
216  }
217 
219  const Property d2)
220  {
221  return (d1 | d2);
222  }
223  }
224 
225 
226  // Forward declaration:
227  template <int dim>
229 
236  template <int dim>
238  {
239  public:
250  MaterialModelInputs(const unsigned int n_points,
251  const unsigned int n_comp);
252 
269  const Introspection<dim> &introspection,
270  const bool compute_strain_rate = true);
271 
272 
293  const typename DoFHandler<dim>::active_cell_iterator &cell,
294  const Introspection<dim> &introspection,
295  const LinearAlgebra::BlockVector &solution_vector,
296  const bool compute_strain_rate = true);
297 
312  void
313  resize(const unsigned int n_points,
314  const unsigned int n_comp);
315 
330 
334  MaterialModelInputs (MaterialModelInputs &&) noexcept = default;
335 
340  MaterialModelInputs &operator= (const MaterialModelInputs &source) = delete;
341 
345  MaterialModelInputs &operator= (MaterialModelInputs &&) = default;
346 
352  void reinit(const FEValuesBase<dim,dim> &fe_values,
353  const typename DoFHandler<dim>::active_cell_iterator &cell,
354  const Introspection<dim> &introspection,
355  const LinearAlgebra::BlockVector &solution_vector,
356  const bool compute_strain_rate = true);
357 
362  unsigned int n_evaluation_points() const;
363 
370  bool requests_property(const MaterialProperties::Property &property) const;
371 
376  std::vector<Point<dim>> position;
377 
381  std::vector<double> temperature;
382 
386  std::vector<double> pressure;
387 
392  std::vector<Tensor<1,dim>> pressure_gradient;
393 
401  std::vector<Tensor<1,dim>> velocity;
402 
408  std::vector<std::vector<double>> composition;
409 
422  std::vector<SymmetricTensor<2,dim>> strain_rate;
423 
440 
449 
458  template <class AdditionalInputType>
459  std::shared_ptr<AdditionalInputType>
460  get_additional_input_object();
461 
466  template <class AdditionalInputType>
467  std::shared_ptr<const AdditionalInputType>
468  get_additional_input_object() const;
469 
475  template <class AdditionalInputType>
477  AdditionalInputType *
478  get_additional_input();
479 
485  template <class AdditionalInputType>
487  const AdditionalInputType *
488  get_additional_input() const;
489 
499  template <class AdditionalInputType>
500  bool
501  has_additional_input_object() const;
502 
508  std::vector<std::shared_ptr<AdditionalMaterialInputs<dim>>> additional_inputs;
509  };
510 
511 
512  // Forward declaration:
513  template <int dim>
515 
516 
523  template <int dim>
525  {
526  public:
537  MaterialModelOutputs (const unsigned int n_points,
538  const unsigned int n_comp);
539 
561  void
562  resize(const unsigned int n_points,
563  const unsigned int n_comp,
564  const bool remove_additional_outputs = true);
565 
580 
584  MaterialModelOutputs (MaterialModelOutputs &&) noexcept = default;
585 
590  MaterialModelOutputs &operator= (const MaterialModelOutputs &source) = delete;
591 
595  MaterialModelOutputs &operator= (MaterialModelOutputs &&) noexcept = default;
596 
601  unsigned int n_evaluation_points() const;
602 
606  std::vector<double> viscosities;
607 
611  std::vector<double> densities;
612 
617  std::vector<double> thermal_expansion_coefficients;
618 
622  std::vector<double> specific_heat;
623 
627  std::vector<double> thermal_conductivities;
628 
633  std::vector<double> compressibilities;
634 
640  std::vector<double> entropy_derivative_pressure;
641 
648  std::vector<double> entropy_derivative_temperature;
649 
686  std::vector<std::vector<double>> reaction_terms;
687 
693  std::vector<std::shared_ptr<AdditionalMaterialOutputs<dim>>> additional_outputs;
694 
704  template <class AdditionalOutputType>
705  std::shared_ptr<AdditionalOutputType>
706  get_additional_output_object();
707 
712  template <class AdditionalOutputType>
713  std::shared_ptr<const AdditionalOutputType>
714  get_additional_output_object() const;
715 
721  template <class AdditionalOutputType>
723  AdditionalOutputType *
724  get_additional_output();
725 
731  template <class AdditionalOutputType>
733  const AdditionalOutputType *
734  get_additional_output() const;
735 
745  template <class AdditionalInputType>
746  bool
747  has_additional_output_object() const;
748 
753  void move_additional_outputs_from(MaterialModelOutputs<dim> &other);
754  };
755 
756 
757 
772  namespace MaterialAveraging
773  {
813  {
825  };
826 
827 
834  std::string get_averaging_operation_names ();
835 
841  AveragingOperation parse_averaging_operation_name (const std::string &s);
842 
848  template <int dim>
849  void average (const AveragingOperation operation,
850  const typename DoFHandler<dim>::active_cell_iterator &cell,
851  const Quadrature<dim> &quadrature_formula,
852  const Mapping<dim> &mapping,
853  const MaterialProperties::Property &requested_properties,
854  MaterialModelOutputs<dim> &values_out);
855 
861  void average_property (const AveragingOperation operation,
862  const FullMatrix<double> &projection_matrix,
863  const FullMatrix<double> &expansion_matrix,
864  std::vector<double> &values_out);
865 
876  }
877 
896  template <int dim>
898  {
899  public:
904  virtual ~AdditionalMaterialInputs() = default;
905 
910  virtual void
911  fill (const LinearAlgebra::BlockVector &solution,
912  const FEValuesBase<dim> &fe_values,
913  const Introspection<dim> &introspection) = 0;
914  };
915 
916 
943  template <int dim>
945  {
946  public:
951  virtual ~AdditionalMaterialOutputs() = default;
952 
953  virtual void average (const MaterialAveraging::AveragingOperation /*operation*/,
954  const FullMatrix<double> &/*projection_matrix*/,
955  const FullMatrix<double> &/*expansion_matrix*/)
956  {}
957  };
958 
959 
984  template <int dim>
986  {
987  public:
996  NamedAdditionalMaterialOutputs(const std::vector<std::string> &output_names);
997 
1008  NamedAdditionalMaterialOutputs(const std::vector<std::string> &output_names,
1009  const unsigned int n_points);
1010 
1014  ~NamedAdditionalMaterialOutputs() override;
1015 
1020  const std::vector<std::string> &get_names() const;
1021 
1026  virtual std::vector<double> get_nth_output(const unsigned int idx) const;
1027 
1029  const FullMatrix<double> &/*projection_matrix*/,
1030  const FullMatrix<double> &/*expansion_matrix*/) override
1031  {}
1032 
1033 
1038  std::vector<std::vector<double>> output_values;
1039 
1040  private:
1041  const std::vector<std::string> names;
1042  };
1043 
1044 
1050  template <int dim>
1052  {
1053  public:
1054  SeismicAdditionalOutputs(const unsigned int n_points);
1055 
1056  std::vector<double> get_nth_output(const unsigned int idx) const override;
1057 
1063  std::vector<double> vs;
1064 
1070  std::vector<double> vp;
1071  };
1072 
1073 
1094  template <int dim>
1096  {
1097  public:
1098  ReactionRateOutputs (const unsigned int n_points,
1099  const unsigned int n_comp);
1100 
1101  std::vector<double> get_nth_output(const unsigned int idx) const override;
1102 
1110  std::vector<std::vector<double>> reaction_rates;
1111  };
1112 
1113 
1114 
1120  template <int dim>
1122  {
1123  public:
1124  PhaseOutputs(const unsigned int n_points);
1125  };
1126 
1127 
1128 
1147  template <int dim>
1149  {
1150  public:
1151  PrescribedFieldOutputs (const unsigned int n_points,
1152  const unsigned int n_comp);
1153 
1154  std::vector<double> get_nth_output(const unsigned int idx) const override;
1155 
1163  std::vector<std::vector<double>> prescribed_field_outputs;
1164  };
1165 
1179  template <int dim>
1181  {
1182  public:
1183  PrescribedTemperatureOutputs (const unsigned int n_points);
1184 
1185  std::vector<double> get_nth_output(const unsigned int idx) const override;
1186 
1194  std::vector<double> prescribed_temperature_outputs;
1195  };
1196 
1203  template <int dim>
1205  {
1206  public:
1207  AdditionalMaterialOutputsStokesRHS(const unsigned int n_points)
1208  : rhs_u(n_points), rhs_p(n_points), rhs_melt_pc(n_points)
1209  {}
1210 
1212  = default;
1213 
1215  const FullMatrix<double> &/*projection_matrix*/,
1216  const FullMatrix<double> &/*expansion_matrix*/) override
1217  {
1218  // TODO: not implemented
1219  }
1220 
1226  std::vector<Tensor<1,dim>> rhs_u;
1227 
1232  std::vector<double> rhs_p;
1233 
1238  std::vector<double> rhs_melt_pc;
1239  };
1240 
1241 
1242 
1270  template <int dim>
1272  {
1273  public:
1277  explicit PrescribedPlasticDilation (const unsigned int n_points);
1278 
1282  std::vector<double> get_nth_output(const unsigned int idx) const override;
1283 
1288  std::vector<double> dilation_lhs_term;
1289 
1294  std::vector<double> dilation_rhs_term;
1295  };
1296 
1297 
1298 
1305  template <int dim>
1307  {
1308  public:
1309  ElasticOutputs(const unsigned int n_points)
1310  : elastic_force(n_points, numbers::signaling_nan<SymmetricTensor<2,dim>>()),
1311  viscoelastic_strain_rate(n_points, numbers::signaling_nan<SymmetricTensor<2,dim>>())
1312  {}
1313 
1314  ~ElasticOutputs() override
1315  = default;
1316 
1318  const FullMatrix<double> &/*projection_matrix*/,
1319  const FullMatrix<double> &/*expansion_matrix*/) override
1320  {
1322  return;
1323  }
1324 
1330  std::vector<SymmetricTensor<2,dim>> elastic_force;
1331 
1336  std::vector<SymmetricTensor<2,dim>> viscoelastic_strain_rate;
1337  };
1338 
1339 
1340 
1351  template <int dim>
1353  {
1354  public:
1355  EnthalpyOutputs(const unsigned int n_points)
1356  : enthalpies_of_fusion(n_points, numbers::signaling_nan<double>())
1357  {}
1358 
1359  virtual ~EnthalpyOutputs()
1360  = default;
1361 
1363  const FullMatrix<double> &/*projection_matrix*/,
1364  const FullMatrix<double> &/*expansion_matrix*/) override
1365  {
1367  return;
1368  }
1369 
1375  std::vector<double> enthalpies_of_fusion;
1376  };
1377 
1378 
1379 
1395  template <int dim>
1396  class Interface : public Plugins::InterfaceBase
1397  {
1398  public:
1406 
1414 
1427  get_model_dependence () const;
1428 
1438  virtual bool is_compressible () const = 0;
1447  virtual
1448  void evaluate (const MaterialModel::MaterialModelInputs<dim> &in,
1450 
1456  virtual
1457  void
1458  create_additional_named_outputs (MaterialModelOutputs &outputs) const;
1459 
1460 
1468  virtual
1469  void
1470  fill_additional_material_model_inputs(MaterialModel::MaterialModelInputs<dim> &input,
1471  const LinearAlgebra::BlockVector &solution,
1472  const FEValuesBase<dim> &fe_values,
1473  const Introspection<dim> &introspection) const;
1474 
1475  protected:
1492  };
1493 
1509  template <int dim>
1510  void
1511  register_material_model (const std::string &name,
1512  const std::string &description,
1513  void (*declare_parameters_function) (ParameterHandler &),
1514  std::unique_ptr<Interface<dim>> (*factory_function) ());
1515 
1526  template <int dim>
1527  std::unique_ptr<Interface<dim>>
1528  create_material_model (const std::string &model_name);
1529 
1530 
1542  template <int dim>
1543  std::unique_ptr<Interface<dim>>
1545 
1546 
1553  template <int dim>
1554  std::string
1556 
1557 
1563  template <int dim>
1564  void
1566 
1567 
1568 
1578  template <int dim>
1579  void
1580  write_plugin_graph (std::ostream &output_stream);
1581 
1582 
1583 
1584 // --------------------- template function definitions ----------------------------------
1585 
1586  template <int dim>
1587  template <class AdditionalInputType>
1588  std::shared_ptr<AdditionalInputType>
1590  {
1591  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1592  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1593  return std::dynamic_pointer_cast<AdditionalInputType>(additional_inputs[i]);
1594 
1595  return nullptr;
1596  }
1597 
1598 
1599  template <int dim>
1600  template <class AdditionalInputType>
1601  std::shared_ptr<const AdditionalInputType>
1603  {
1604  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1605  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1606  return std::dynamic_pointer_cast<const AdditionalInputType>(additional_inputs[i]);
1607 
1608  return nullptr;
1609  }
1610 
1611 
1612  template <int dim>
1613  template <class AdditionalOutputType>
1614  std::shared_ptr<AdditionalOutputType>
1616  {
1617  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1618  if (dynamic_cast<AdditionalOutputType *> (additional_outputs[i].get()))
1619  return std::dynamic_pointer_cast<AdditionalOutputType>(additional_outputs[i]);
1620 
1621  return nullptr;
1622  }
1623 
1624 
1625  template <int dim>
1626  template <class AdditionalOutputType>
1627  std::shared_ptr<const AdditionalOutputType>
1629  {
1630  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1631  if (dynamic_cast<const AdditionalOutputType *> (additional_outputs[i].get()))
1632  return std::dynamic_pointer_cast<const AdditionalOutputType>(additional_outputs[i]);
1633 
1634  return nullptr;
1635  }
1636 
1637 
1638  // The following four functions are deprecated:
1639  template <int dim>
1640  template <class AdditionalInputType>
1641  AdditionalInputType *
1643  {
1644  return get_additional_input_object<AdditionalInputType>().get();
1645  }
1646 
1647 
1648  template <int dim>
1649  template <class AdditionalInputType>
1650  const AdditionalInputType *
1652  {
1653  return get_additional_input_object<AdditionalInputType>().get();
1654  }
1655 
1656 
1657  template <int dim>
1658  template <class AdditionalOutputType>
1659  AdditionalOutputType *
1661  {
1662  return get_additional_output_object<AdditionalOutputType>().get();
1663  }
1664 
1665 
1666  template <int dim>
1667  template <class AdditionalOutputType>
1668  const AdditionalOutputType *
1670  {
1671  return get_additional_output_object<AdditionalOutputType>().get();
1672  }
1673 
1674 
1675  template <int dim>
1676  template <class AdditionalInputType>
1677  bool
1679  {
1680  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1681  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1682  return true;
1683 
1684  return false;
1685  }
1686 
1687 
1688  template <int dim>
1689  template <class AdditionalOutputType>
1690  bool
1692  {
1693  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1694  if (dynamic_cast<const AdditionalOutputType *> (additional_outputs[i].get()))
1695  return true;
1696 
1697  return false;
1698  }
1699 
1700 
1701 
1702  template <int dim>
1704  {
1705  Assert(this->additional_outputs.empty(), ExcMessage("Destination of move needs to be empty!"));
1706  this->additional_outputs = std::move(other.additional_outputs);
1707  }
1708 
1709 
1717 #define ASPECT_REGISTER_MATERIAL_MODEL(classname,name,description) \
1718  template class classname<2>; \
1719  template class classname<3>; \
1720  namespace ASPECT_REGISTER_MATERIAL_MODEL_ ## classname \
1721  { \
1722  aspect::internal::Plugins::RegisterHelper<aspect::MaterialModel::Interface<2>,classname<2>> \
1723  dummy_ ## classname ## _2d (&aspect::MaterialModel::register_material_model<2>, \
1724  name, description); \
1725  aspect::internal::Plugins::RegisterHelper<aspect::MaterialModel::Interface<3>,classname<3>> \
1726  dummy_ ## classname ## _3d (&aspect::MaterialModel::register_material_model<3>, \
1727  name, description); \
1728  }
1729  }
1730 }
1731 
1732 
1733 #endif
void write_plugin_graph(std::ostream &output_stream)
AveragingOperation get_averaging_operation_for_viscosity(const AveragingOperation operation)
std::vector< std::shared_ptr< AdditionalMaterialInputs< dim > > > additional_inputs
Definition: interface.h:508
std::vector< double > entropy_derivative_pressure
Definition: interface.h:640
std::vector< double > entropy_derivative_temperature
Definition: interface.h:648
void average_property(const AveragingOperation operation, const FullMatrix< double > &projection_matrix, const FullMatrix< double > &expansion_matrix, std::vector< double > &values_out)
std::vector< std::vector< double > > composition
Definition: interface.h:408
std::vector< double > thermal_expansion_coefficients
Definition: interface.h:617
virtual void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &)
Definition: interface.h:953
std::vector< Point< dim > > position
Definition: interface.h:376
std::vector< std::vector< double > > prescribed_field_outputs
Definition: interface.h:1163
void register_material_model(const std::string &name, const std::string &description, void(*declare_parameters_function)(ParameterHandler &), std::unique_ptr< Interface< dim >>(*factory_function)())
#define AssertThrow(cond, exc)
std::vector< double > thermal_conductivities
Definition: interface.h:627
ElasticOutputs(const unsigned int n_points)
Definition: interface.h:1309
std::vector< std::vector< double > > reaction_rates
Definition: interface.h:1110
void declare_parameters(ParameterHandler &prm)
bool identifies_single_variable(const Dependence dependence)
void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1214
std::vector< SymmetricTensor< 2, dim > > strain_rate
Definition: interface.h:422
std::vector< std::vector< double > > reaction_terms
Definition: interface.h:686
static ::ExceptionBase & ExcNotImplemented()
void average(const MaterialAveraging::AveragingOperation operation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1362
std::shared_ptr< AdditionalOutputType > get_additional_output_object()
Definition: interface.h:1615
std::vector< Tensor< 1, dim > > velocity
Definition: interface.h:401
EnthalpyOutputs(const unsigned int n_points)
Definition: interface.h:1355
AveragingOperation parse_averaging_operation_name(const std::string &s)
std::shared_ptr< AdditionalInputType > get_additional_input_object()
Definition: interface.h:1589
AdditionalMaterialOutputsStokesRHS(const unsigned int n_points)
Definition: interface.h:1207
#define Assert(cond, exc)
Dependence operator|=(Dependence &d1, const Dependence d2)
Definition: interface.h:99
void move_additional_outputs_from(MaterialModelOutputs< dim > &other)
Definition: interface.h:1703
std::vector< double > enthalpies_of_fusion
Definition: interface.h:1375
std::vector< SymmetricTensor< 2, dim > > elastic_force
Definition: interface.h:1330
DEAL_II_DEPRECATED AdditionalInputType * get_additional_input()
DEAL_II_DEPRECATED AdditionalOutputType * get_additional_output()
std::vector< std::vector< double > > output_values
Definition: interface.h:1038
void average(const MaterialAveraging::AveragingOperation operation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1317
static ::ExceptionBase & ExcMessage(std::string arg1)
DoFHandler< dim >::active_cell_iterator current_cell
Definition: interface.h:439
NonlinearDependence::ModelDependence model_dependence
Definition: interface.h:1491
std::unique_ptr< Interface< dim > > create_material_model(const std::string &model_name)
void average(const AveragingOperation operation, const typename DoFHandler< dim >::active_cell_iterator &cell, const Quadrature< dim > &quadrature_formula, const Mapping< dim > &mapping, const MaterialProperties::Property &requested_properties, MaterialModelOutputs< dim > &values_out)
std::string get_valid_model_names_pattern()
Dependence operator|(const Dependence d1, const Dependence d2)
Definition: interface.h:93
std::vector< Tensor< 1, dim > > pressure_gradient
Definition: interface.h:392
std::vector< SymmetricTensor< 2, dim > > viscoelastic_strain_rate
Definition: interface.h:1336
MaterialProperties::Property requested_properties
Definition: interface.h:448
void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1028
#define DEAL_II_DEPRECATED
std::vector< std::shared_ptr< AdditionalMaterialOutputs< dim > > > additional_outputs
Definition: interface.h:693