ASPECT
interface.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2024 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef _aspect_material_model_interface_h
22 #define _aspect_material_model_interface_h
23 
24 #include <aspect/global.h>
25 #include <aspect/plugins.h>
27 
28 #include <deal.II/base/point.h>
34 #include <deal.II/fe/mapping.h>
35 #include <deal.II/fe/fe_values.h>
39 
40 namespace aspect
41 {
42  template <int dim>
43  struct Introspection;
44 
45 
53  namespace MaterialModel
54  {
59  namespace NonlinearDependence
60  {
83  {
85 
86  none = 1,
88  pressure = 4,
91 
93  };
94 
95 
100  const Dependence d2)
101  {
102  return Dependence(static_cast<int>(d1) | static_cast<int>(d2));
103  }
104 
106  const Dependence d2)
107  {
108  d1 = (d1 | d2);
109  return d1;
110  }
111 
117  {
123 
129 
135 
141 
147 
153  ModelDependence ();
154  };
155 
164  bool
165  identifies_single_variable(const Dependence dependence);
166  }
167 
172  namespace MaterialProperties
173  {
183  enum Property
184  {
186 
187  none = 1,
189  density = 4,
199 
202  specific_heat |
207  viscosity |
212  };
213 
218  inline Property operator | (const Property d1,
219  const Property d2)
220  {
221  return Property(static_cast<int>(d1) | static_cast<int>(d2));
222  }
223 
225  const Property d2)
226  {
227  return (d1 | d2);
228  }
229  }
230 
231 
232  // Forward declaration:
233  template <int dim>
235 
242  template <int dim>
244  {
245  public:
256  MaterialModelInputs(const unsigned int n_points,
257  const unsigned int n_comp);
258 
275  const Introspection<dim> &introspection,
276  const bool compute_strain_rate = true);
277 
278 
299  const typename DoFHandler<dim>::active_cell_iterator &cell,
300  const Introspection<dim> &introspection,
301  const LinearAlgebra::BlockVector &solution_vector,
302  const bool compute_strain_rate = true);
303 
318  void
319  resize(const unsigned int n_points,
320  const unsigned int n_comp);
321 
336 
340  MaterialModelInputs (MaterialModelInputs &&) noexcept = default;
341 
346  MaterialModelInputs &operator= (const MaterialModelInputs &source) = delete;
347 
351  MaterialModelInputs &operator= (MaterialModelInputs &&) = default;
352 
358  void reinit(const FEValuesBase<dim,dim> &fe_values,
359  const typename DoFHandler<dim>::active_cell_iterator &cell,
360  const Introspection<dim> &introspection,
361  const LinearAlgebra::BlockVector &solution_vector,
362  const bool compute_strain_rate = true);
363 
368  unsigned int n_evaluation_points() const;
369 
376  bool requests_property(const MaterialProperties::Property &property) const;
377 
382  std::vector<Point<dim>> position;
383 
387  std::vector<double> temperature;
388 
392  std::vector<double> pressure;
393 
398  std::vector<Tensor<1,dim>> pressure_gradient;
399 
407  std::vector<Tensor<1,dim>> velocity;
408 
414  std::vector<std::vector<double>> composition;
415 
428  std::vector<SymmetricTensor<2,dim>> strain_rate;
429 
446 
455 
464  template <class AdditionalInputType>
465  std::shared_ptr<AdditionalInputType>
466  get_additional_input_object();
467 
472  template <class AdditionalInputType>
473  std::shared_ptr<const AdditionalInputType>
474  get_additional_input_object() const;
475 
481  template <class AdditionalInputType>
483  AdditionalInputType *
484  get_additional_input();
485 
491  template <class AdditionalInputType>
493  const AdditionalInputType *
494  get_additional_input() const;
495 
505  template <class AdditionalInputType>
506  bool
507  has_additional_input_object() const;
508 
514  std::vector<std::shared_ptr<AdditionalMaterialInputs<dim>>> additional_inputs;
515  };
516 
517 
518  // Forward declaration:
519  template <int dim>
521 
522 
529  template <int dim>
531  {
532  public:
543  MaterialModelOutputs (const unsigned int n_points,
544  const unsigned int n_comp);
545 
567  void
568  resize(const unsigned int n_points,
569  const unsigned int n_comp,
570  const bool remove_additional_outputs = true);
571 
586 
590  MaterialModelOutputs (MaterialModelOutputs &&) noexcept = default;
591 
596  MaterialModelOutputs &operator= (const MaterialModelOutputs &source) = delete;
597 
601  MaterialModelOutputs &operator= (MaterialModelOutputs &&) noexcept = default;
602 
607  unsigned int n_evaluation_points() const;
608 
612  std::vector<double> viscosities;
613 
617  std::vector<double> densities;
618 
623  std::vector<double> thermal_expansion_coefficients;
624 
628  std::vector<double> specific_heat;
629 
633  std::vector<double> thermal_conductivities;
634 
639  std::vector<double> compressibilities;
640 
646  std::vector<double> entropy_derivative_pressure;
647 
654  std::vector<double> entropy_derivative_temperature;
655 
692  std::vector<std::vector<double>> reaction_terms;
693 
699  std::vector<std::shared_ptr<AdditionalMaterialOutputs<dim>>> additional_outputs;
700 
710  template <class AdditionalOutputType>
711  std::shared_ptr<AdditionalOutputType>
712  get_additional_output_object();
713 
718  template <class AdditionalOutputType>
719  std::shared_ptr<const AdditionalOutputType>
720  get_additional_output_object() const;
721 
727  template <class AdditionalOutputType>
729  AdditionalOutputType *
730  get_additional_output();
731 
737  template <class AdditionalOutputType>
739  const AdditionalOutputType *
740  get_additional_output() const;
741 
751  template <class AdditionalInputType>
752  bool
753  has_additional_output_object() const;
754 
759  void move_additional_outputs_from(MaterialModelOutputs<dim> &other);
760  };
761 
762 
763 
778  namespace MaterialAveraging
779  {
819  {
831  };
832 
833 
840  std::string get_averaging_operation_names ();
841 
847  AveragingOperation parse_averaging_operation_name (const std::string &s);
848 
854  template <int dim>
855  void average (const AveragingOperation operation,
856  const typename DoFHandler<dim>::active_cell_iterator &cell,
857  const Quadrature<dim> &quadrature_formula,
858  const Mapping<dim> &mapping,
859  const MaterialProperties::Property &requested_properties,
860  MaterialModelOutputs<dim> &values_out);
861 
867  void average_property (const AveragingOperation operation,
868  const FullMatrix<double> &projection_matrix,
869  const FullMatrix<double> &expansion_matrix,
870  std::vector<double> &values_out);
871 
882  }
883 
902  template <int dim>
904  {
905  public:
910  virtual ~AdditionalMaterialInputs() = default;
911 
916  virtual void
917  fill (const LinearAlgebra::BlockVector &solution,
918  const FEValuesBase<dim> &fe_values,
919  const Introspection<dim> &introspection) = 0;
920  };
921 
922 
949  template <int dim>
951  {
952  public:
957  virtual ~AdditionalMaterialOutputs() = default;
958 
959  virtual void average (const MaterialAveraging::AveragingOperation /*operation*/,
960  const FullMatrix<double> &/*projection_matrix*/,
961  const FullMatrix<double> &/*expansion_matrix*/)
962  {}
963  };
964 
965 
990  template <int dim>
992  {
993  public:
1002  NamedAdditionalMaterialOutputs(const std::vector<std::string> &output_names);
1003 
1014  NamedAdditionalMaterialOutputs(const std::vector<std::string> &output_names,
1015  const unsigned int n_points);
1016 
1020  ~NamedAdditionalMaterialOutputs() override;
1021 
1026  const std::vector<std::string> &get_names() const;
1027 
1032  virtual std::vector<double> get_nth_output(const unsigned int idx) const;
1033 
1035  const FullMatrix<double> &/*projection_matrix*/,
1036  const FullMatrix<double> &/*expansion_matrix*/) override
1037  {}
1038 
1039 
1044  std::vector<std::vector<double>> output_values;
1045 
1046  private:
1047  const std::vector<std::string> names;
1048  };
1049 
1050 
1056  template <int dim>
1058  {
1059  public:
1060  SeismicAdditionalOutputs(const unsigned int n_points);
1061 
1062  std::vector<double> get_nth_output(const unsigned int idx) const override;
1063 
1069  std::vector<double> vs;
1070 
1076  std::vector<double> vp;
1077  };
1078 
1079 
1100  template <int dim>
1102  {
1103  public:
1104  ReactionRateOutputs (const unsigned int n_points,
1105  const unsigned int n_comp);
1106 
1107  std::vector<double> get_nth_output(const unsigned int idx) const override;
1108 
1116  std::vector<std::vector<double>> reaction_rates;
1117  };
1118 
1119 
1120 
1126  template <int dim>
1128  {
1129  public:
1130  PhaseOutputs(const unsigned int n_points);
1131  };
1132 
1133 
1134 
1153  template <int dim>
1155  {
1156  public:
1157  PrescribedFieldOutputs (const unsigned int n_points,
1158  const unsigned int n_comp);
1159 
1160  std::vector<double> get_nth_output(const unsigned int idx) const override;
1161 
1169  std::vector<std::vector<double>> prescribed_field_outputs;
1170  };
1171 
1185  template <int dim>
1187  {
1188  public:
1189  PrescribedTemperatureOutputs (const unsigned int n_points);
1190 
1191  std::vector<double> get_nth_output(const unsigned int idx) const override;
1192 
1200  std::vector<double> prescribed_temperature_outputs;
1201  };
1202 
1209  template <int dim>
1211  {
1212  public:
1213  AdditionalMaterialOutputsStokesRHS(const unsigned int n_points)
1214  : rhs_u(n_points), rhs_p(n_points), rhs_melt_pc(n_points)
1215  {}
1216 
1218  = default;
1219 
1221  const FullMatrix<double> &/*projection_matrix*/,
1222  const FullMatrix<double> &/*expansion_matrix*/) override
1223  {
1224  // TODO: not implemented
1225  }
1226 
1232  std::vector<Tensor<1,dim>> rhs_u;
1233 
1238  std::vector<double> rhs_p;
1239 
1244  std::vector<double> rhs_melt_pc;
1245  };
1246 
1247 
1248 
1276  template <int dim>
1278  {
1279  public:
1283  explicit PrescribedPlasticDilation (const unsigned int n_points);
1284 
1288  std::vector<double> get_nth_output(const unsigned int idx) const override;
1289 
1294  std::vector<double> dilation_lhs_term;
1295 
1300  std::vector<double> dilation_rhs_term;
1301  };
1302 
1303 
1304 
1311  template <int dim>
1313  {
1314  public:
1315  ElasticOutputs(const unsigned int n_points)
1316  : elastic_force(n_points, numbers::signaling_nan<SymmetricTensor<2,dim>>()),
1317  viscoelastic_strain_rate(n_points, numbers::signaling_nan<SymmetricTensor<2,dim>>())
1318  {}
1319 
1320  ~ElasticOutputs() override
1321  = default;
1322 
1324  const FullMatrix<double> &/*projection_matrix*/,
1325  const FullMatrix<double> &/*expansion_matrix*/) override
1326  {
1328  return;
1329  }
1330 
1336  std::vector<SymmetricTensor<2,dim>> elastic_force;
1337 
1342  std::vector<SymmetricTensor<2,dim>> viscoelastic_strain_rate;
1343  };
1344 
1345 
1346 
1357  template <int dim>
1359  {
1360  public:
1361  EnthalpyOutputs(const unsigned int n_points)
1362  : enthalpies_of_fusion(n_points, numbers::signaling_nan<double>())
1363  {}
1364 
1365  virtual ~EnthalpyOutputs()
1366  = default;
1367 
1369  const FullMatrix<double> &/*projection_matrix*/,
1370  const FullMatrix<double> &/*expansion_matrix*/) override
1371  {
1373  return;
1374  }
1375 
1381  std::vector<double> enthalpies_of_fusion;
1382  };
1383 
1384 
1385 
1401  template <int dim>
1402  class Interface : public Plugins::InterfaceBase
1403  {
1404  public:
1412 
1420 
1433  get_model_dependence () const;
1434 
1444  virtual bool is_compressible () const = 0;
1453  virtual
1454  void evaluate (const MaterialModel::MaterialModelInputs<dim> &in,
1456 
1462  virtual
1463  void
1464  create_additional_named_outputs (MaterialModelOutputs &outputs) const;
1465 
1466 
1474  virtual
1475  void
1476  fill_additional_material_model_inputs(MaterialModel::MaterialModelInputs<dim> &input,
1477  const LinearAlgebra::BlockVector &solution,
1478  const FEValuesBase<dim> &fe_values,
1479  const Introspection<dim> &introspection) const;
1480 
1481  protected:
1498  };
1499 
1515  template <int dim>
1516  void
1517  register_material_model (const std::string &name,
1518  const std::string &description,
1519  void (*declare_parameters_function) (ParameterHandler &),
1520  std::unique_ptr<Interface<dim>> (*factory_function) ());
1521 
1532  template <int dim>
1533  std::unique_ptr<Interface<dim>>
1534  create_material_model (const std::string &model_name);
1535 
1536 
1548  template <int dim>
1549  std::unique_ptr<Interface<dim>>
1551 
1552 
1559  template <int dim>
1560  std::string
1562 
1563 
1569  template <int dim>
1570  void
1572 
1573 
1574 
1584  template <int dim>
1585  void
1586  write_plugin_graph (std::ostream &output_stream);
1587 
1588 
1589 
1590 // --------------------- template function definitions ----------------------------------
1591 
1592  template <int dim>
1593  template <class AdditionalInputType>
1594  std::shared_ptr<AdditionalInputType>
1596  {
1597  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1598  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1599  return std::dynamic_pointer_cast<AdditionalInputType>(additional_inputs[i]);
1600 
1601  return nullptr;
1602  }
1603 
1604 
1605  template <int dim>
1606  template <class AdditionalInputType>
1607  std::shared_ptr<const AdditionalInputType>
1609  {
1610  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1611  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1612  return std::dynamic_pointer_cast<const AdditionalInputType>(additional_inputs[i]);
1613 
1614  return nullptr;
1615  }
1616 
1617 
1618  template <int dim>
1619  template <class AdditionalOutputType>
1620  std::shared_ptr<AdditionalOutputType>
1622  {
1623  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1624  if (dynamic_cast<AdditionalOutputType *> (additional_outputs[i].get()))
1625  return std::dynamic_pointer_cast<AdditionalOutputType>(additional_outputs[i]);
1626 
1627  return nullptr;
1628  }
1629 
1630 
1631  template <int dim>
1632  template <class AdditionalOutputType>
1633  std::shared_ptr<const AdditionalOutputType>
1635  {
1636  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1637  if (dynamic_cast<const AdditionalOutputType *> (additional_outputs[i].get()))
1638  return std::dynamic_pointer_cast<const AdditionalOutputType>(additional_outputs[i]);
1639 
1640  return nullptr;
1641  }
1642 
1643 
1644  // The following four functions are deprecated:
1645  template <int dim>
1646  template <class AdditionalInputType>
1647  AdditionalInputType *
1649  {
1650  return get_additional_input_object<AdditionalInputType>().get();
1651  }
1652 
1653 
1654  template <int dim>
1655  template <class AdditionalInputType>
1656  const AdditionalInputType *
1658  {
1659  return get_additional_input_object<AdditionalInputType>().get();
1660  }
1661 
1662 
1663  template <int dim>
1664  template <class AdditionalOutputType>
1665  AdditionalOutputType *
1667  {
1668  return get_additional_output_object<AdditionalOutputType>().get();
1669  }
1670 
1671 
1672  template <int dim>
1673  template <class AdditionalOutputType>
1674  const AdditionalOutputType *
1676  {
1677  return get_additional_output_object<AdditionalOutputType>().get();
1678  }
1679 
1680 
1681  template <int dim>
1682  template <class AdditionalInputType>
1683  bool
1685  {
1686  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1687  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1688  return true;
1689 
1690  return false;
1691  }
1692 
1693 
1694  template <int dim>
1695  template <class AdditionalOutputType>
1696  bool
1698  {
1699  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1700  if (dynamic_cast<const AdditionalOutputType *> (additional_outputs[i].get()))
1701  return true;
1702 
1703  return false;
1704  }
1705 
1706 
1707 
1708  template <int dim>
1710  {
1711  Assert(this->additional_outputs.empty(), ExcMessage("Destination of move needs to be empty!"));
1712  this->additional_outputs = std::move(other.additional_outputs);
1713  }
1714 
1715 
1723 #define ASPECT_REGISTER_MATERIAL_MODEL(classname,name,description) \
1724  template class classname<2>; \
1725  template class classname<3>; \
1726  namespace ASPECT_REGISTER_MATERIAL_MODEL_ ## classname \
1727  { \
1728  aspect::internal::Plugins::RegisterHelper<aspect::MaterialModel::Interface<2>,classname<2>> \
1729  dummy_ ## classname ## _2d (&aspect::MaterialModel::register_material_model<2>, \
1730  name, description); \
1731  aspect::internal::Plugins::RegisterHelper<aspect::MaterialModel::Interface<3>,classname<3>> \
1732  dummy_ ## classname ## _3d (&aspect::MaterialModel::register_material_model<3>, \
1733  name, description); \
1734  }
1735  }
1736 }
1737 
1738 
1739 #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:514
std::vector< double > entropy_derivative_pressure
Definition: interface.h:646
std::vector< double > entropy_derivative_temperature
Definition: interface.h:654
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:414
std::vector< double > thermal_expansion_coefficients
Definition: interface.h:623
virtual void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &)
Definition: interface.h:959
std::vector< Point< dim > > position
Definition: interface.h:382
std::vector< std::vector< double > > prescribed_field_outputs
Definition: interface.h:1169
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:633
ElasticOutputs(const unsigned int n_points)
Definition: interface.h:1315
std::vector< std::vector< double > > reaction_rates
Definition: interface.h:1116
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:1220
std::vector< SymmetricTensor< 2, dim > > strain_rate
Definition: interface.h:428
std::vector< std::vector< double > > reaction_terms
Definition: interface.h:692
static ::ExceptionBase & ExcNotImplemented()
void average(const MaterialAveraging::AveragingOperation operation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1368
std::shared_ptr< AdditionalOutputType > get_additional_output_object()
Definition: interface.h:1621
std::vector< Tensor< 1, dim > > velocity
Definition: interface.h:407
EnthalpyOutputs(const unsigned int n_points)
Definition: interface.h:1361
AveragingOperation parse_averaging_operation_name(const std::string &s)
std::shared_ptr< AdditionalInputType > get_additional_input_object()
Definition: interface.h:1595
AdditionalMaterialOutputsStokesRHS(const unsigned int n_points)
Definition: interface.h:1213
#define Assert(cond, exc)
Dependence operator|=(Dependence &d1, const Dependence d2)
Definition: interface.h:105
void move_additional_outputs_from(MaterialModelOutputs< dim > &other)
Definition: interface.h:1709
std::vector< double > enthalpies_of_fusion
Definition: interface.h:1381
std::vector< SymmetricTensor< 2, dim > > elastic_force
Definition: interface.h:1336
DEAL_II_DEPRECATED AdditionalInputType * get_additional_input()
DEAL_II_DEPRECATED AdditionalOutputType * get_additional_output()
std::vector< std::vector< double > > output_values
Definition: interface.h:1044
void average(const MaterialAveraging::AveragingOperation operation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1323
static ::ExceptionBase & ExcMessage(std::string arg1)
DoFHandler< dim >::active_cell_iterator current_cell
Definition: interface.h:445
NonlinearDependence::ModelDependence model_dependence
Definition: interface.h:1497
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:99
std::vector< Tensor< 1, dim > > pressure_gradient
Definition: interface.h:398
std::vector< SymmetricTensor< 2, dim > > viscoelastic_strain_rate
Definition: interface.h:1342
MaterialProperties::Property requested_properties
Definition: interface.h:454
void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1034
#define DEAL_II_DEPRECATED
std::vector< std::shared_ptr< AdditionalMaterialOutputs< dim > > > additional_outputs
Definition: interface.h:699