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>
29 #include <deal.II/base/quadrature.h>
30 #include <deal.II/base/symmetric_tensor.h>
31 #include <deal.II/base/parameter_handler.h>
32 #include <deal.II/dofs/dof_handler.h>
33 #include <deal.II/dofs/dof_accessor.h>
34 #include <deal.II/fe/mapping.h>
35 #include <deal.II/fe/fe_values.h>
36 #include <deal.II/fe/component_mask.h>
37 #include <deal.II/numerics/data_postprocessor.h>
38 #include <deal.II/base/signaling_nan.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 
274  MaterialModelInputs(const DataPostprocessorInputs::Vector<dim> &input_data,
275  const Introspection<dim> &introspection,
276  const bool compute_strain_rate = true);
277 
278 
298  MaterialModelInputs(const FEValuesBase<dim,dim> &fe_values,
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 
320  void
321  resize(const unsigned int n_points,
322  const unsigned int n_comp);
323 
338 
342  MaterialModelInputs (MaterialModelInputs &&) noexcept = default;
343 
348  MaterialModelInputs &operator= (const MaterialModelInputs &source) = delete;
349 
353  MaterialModelInputs &operator= (MaterialModelInputs &&) = default;
354 
360  void reinit(const FEValuesBase<dim,dim> &fe_values,
361  const typename DoFHandler<dim>::active_cell_iterator &cell,
362  const Introspection<dim> &introspection,
363  const LinearAlgebra::BlockVector &solution_vector,
364  const bool compute_strain_rate = true);
365 
370  unsigned int n_evaluation_points() const;
371 
378  bool requests_property(const MaterialProperties::Property &property) const;
379 
384  std::vector<Point<dim>> position;
385 
389  std::vector<double> temperature;
390 
394  std::vector<double> pressure;
395 
400  std::vector<Tensor<1,dim>> pressure_gradient;
401 
409  std::vector<Tensor<1,dim>> velocity;
410 
416  std::vector<std::vector<double>> composition;
417 
430  std::vector<SymmetricTensor<2,dim>> strain_rate;
431 
447  typename DoFHandler<dim>::active_cell_iterator current_cell;
448 
457 
466  template <class AdditionalInputType>
467  std::shared_ptr<AdditionalInputType>
468  get_additional_input_object();
469 
474  template <class AdditionalInputType>
475  std::shared_ptr<const AdditionalInputType>
476  get_additional_input_object() const;
477 
483  template <class AdditionalInputType>
484  DEAL_II_DEPRECATED
485  AdditionalInputType *
486  get_additional_input();
487 
493  template <class AdditionalInputType>
494  DEAL_II_DEPRECATED
495  const AdditionalInputType *
496  get_additional_input() const;
497 
507  template <class AdditionalInputType>
508  bool
509  has_additional_input_object() const;
510 
516  std::vector<std::shared_ptr<AdditionalMaterialInputs<dim>>> additional_inputs;
517  };
518 
519 
520  // Forward declaration:
521  template <int dim>
523 
524 
531  template <int dim>
533  {
534  public:
545  MaterialModelOutputs (const unsigned int n_points,
546  const unsigned int n_comp);
547 
564  void
565  resize(const unsigned int n_points,
566  const unsigned int n_comp);
567 
582 
586  MaterialModelOutputs (MaterialModelOutputs &&) noexcept = default;
587 
592  MaterialModelOutputs &operator= (const MaterialModelOutputs &source) = delete;
593 
597  MaterialModelOutputs &operator= (MaterialModelOutputs &&) noexcept = default;
598 
603  unsigned int n_evaluation_points() const;
604 
608  std::vector<double> viscosities;
609 
613  std::vector<double> densities;
614 
619  std::vector<double> thermal_expansion_coefficients;
620 
624  std::vector<double> specific_heat;
625 
629  std::vector<double> thermal_conductivities;
630 
635  std::vector<double> compressibilities;
636 
642  std::vector<double> entropy_derivative_pressure;
643 
650  std::vector<double> entropy_derivative_temperature;
651 
688  std::vector<std::vector<double>> reaction_terms;
689 
695  std::vector<std::shared_ptr<AdditionalMaterialOutputs<dim>>> additional_outputs;
696 
706  template <class AdditionalOutputType>
707  std::shared_ptr<AdditionalOutputType>
708  get_additional_output_object();
709 
714  template <class AdditionalOutputType>
715  std::shared_ptr<const AdditionalOutputType>
716  get_additional_output_object() const;
717 
723  template <class AdditionalOutputType>
724  DEAL_II_DEPRECATED
725  AdditionalOutputType *
726  get_additional_output();
727 
733  template <class AdditionalOutputType>
734  DEAL_II_DEPRECATED
735  const AdditionalOutputType *
736  get_additional_output() const;
737 
747  template <class AdditionalInputType>
748  bool
749  has_additional_output_object() const;
750 
755  void move_additional_outputs_from(MaterialModelOutputs<dim> &other);
756  };
757 
758 
759 
774  namespace MaterialAveraging
775  {
815  {
827  };
828 
829 
836  std::string get_averaging_operation_names ();
837 
843  AveragingOperation parse_averaging_operation_name (const std::string &s);
844 
850  template <int dim>
851  void average (const AveragingOperation operation,
852  const typename DoFHandler<dim>::active_cell_iterator &cell,
853  const Quadrature<dim> &quadrature_formula,
854  const Mapping<dim> &mapping,
855  const MaterialProperties::Property &requested_properties,
856  MaterialModelOutputs<dim> &values_out);
857 
863  void average_property (const AveragingOperation operation,
864  const FullMatrix<double> &projection_matrix,
865  const FullMatrix<double> &expansion_matrix,
866  std::vector<double> &values_out);
867 
878  }
879 
898  template <int dim>
900  {
901  public:
906  virtual ~AdditionalMaterialInputs() = default;
907 
912  virtual void
913  fill (const LinearAlgebra::BlockVector &solution,
914  const FEValuesBase<dim> &fe_values,
915  const Introspection<dim> &introspection) = 0;
916  };
917 
918 
945  template <int dim>
947  {
948  public:
953  virtual ~AdditionalMaterialOutputs() = default;
954 
955  virtual void average (const MaterialAveraging::AveragingOperation /*operation*/,
956  const FullMatrix<double> &/*projection_matrix*/,
957  const FullMatrix<double> &/*expansion_matrix*/)
958  {}
959  };
960 
961 
983  template <int dim>
985  {
986  public:
995  NamedAdditionalMaterialOutputs(const std::vector<std::string> &output_names);
996 
1007  NamedAdditionalMaterialOutputs(const std::vector<std::string> &output_names,
1008  const unsigned int n_points);
1009 
1013  ~NamedAdditionalMaterialOutputs() override;
1014 
1019  const std::vector<std::string> &get_names() const;
1020 
1025  virtual std::vector<double> get_nth_output(const unsigned int idx) const;
1026 
1028  const FullMatrix<double> &/*projection_matrix*/,
1029  const FullMatrix<double> &/*expansion_matrix*/) override
1030  {}
1031 
1032 
1037  std::vector<std::vector<double>> output_values;
1038 
1039  private:
1040  const std::vector<std::string> names;
1041  };
1042 
1043 
1049  template <int dim>
1051  {
1052  public:
1053  SeismicAdditionalOutputs(const unsigned int n_points);
1054 
1055  std::vector<double> get_nth_output(const unsigned int idx) const override;
1056 
1062  std::vector<double> vs;
1063 
1069  std::vector<double> vp;
1070  };
1071 
1072 
1093  template <int dim>
1095  {
1096  public:
1097  ReactionRateOutputs (const unsigned int n_points,
1098  const unsigned int n_comp);
1099 
1100  std::vector<double> get_nth_output(const unsigned int idx) const override;
1101 
1109  std::vector<std::vector<double>> reaction_rates;
1110  };
1111 
1112 
1113 
1119  template <int dim>
1121  {
1122  public:
1123  PhaseOutputs(const unsigned int n_points);
1124  };
1125 
1126 
1127 
1146  template <int dim>
1148  {
1149  public:
1150  PrescribedFieldOutputs (const unsigned int n_points,
1151  const unsigned int n_comp);
1152 
1153  std::vector<double> get_nth_output(const unsigned int idx) const override;
1154 
1162  std::vector<std::vector<double>> prescribed_field_outputs;
1163  };
1164 
1178  template <int dim>
1180  {
1181  public:
1182  PrescribedTemperatureOutputs (const unsigned int n_points);
1183 
1184  std::vector<double> get_nth_output(const unsigned int idx) const override;
1185 
1193  std::vector<double> prescribed_temperature_outputs;
1194  };
1195 
1202  template <int dim>
1204  {
1205  public:
1206  AdditionalMaterialOutputsStokesRHS(const unsigned int n_points)
1207  : rhs_u(n_points), rhs_p(n_points), rhs_melt_pc(n_points)
1208  {}
1209 
1211  = default;
1212 
1214  const FullMatrix<double> &/*projection_matrix*/,
1215  const FullMatrix<double> &/*expansion_matrix*/) override
1216  {
1217  // TODO: not implemented
1218  }
1219 
1225  std::vector<Tensor<1,dim>> rhs_u;
1226 
1231  std::vector<double> rhs_p;
1232 
1237  std::vector<double> rhs_melt_pc;
1238  };
1239 
1240 
1241 
1269  template <int dim>
1271  {
1272  public:
1276  explicit PrescribedPlasticDilation (const unsigned int n_points);
1277 
1281  std::vector<double> get_nth_output(const unsigned int idx) const override;
1282 
1287  std::vector<double> dilation_lhs_term;
1288 
1293  std::vector<double> dilation_rhs_term;
1294  };
1295 
1296 
1297 
1304  template <int dim>
1306  {
1307  public:
1308  ElasticOutputs(const unsigned int n_points)
1309  : elastic_force(n_points, numbers::signaling_nan<SymmetricTensor<2,dim>>()),
1310  viscoelastic_strain_rate(n_points, numbers::signaling_nan<SymmetricTensor<2,dim>>())
1311  {}
1312 
1313  ~ElasticOutputs() override
1314  = default;
1315 
1317  const FullMatrix<double> &/*projection_matrix*/,
1318  const FullMatrix<double> &/*expansion_matrix*/) override
1319  {
1320  AssertThrow(operation == MaterialAveraging::AveragingOperation::none,ExcNotImplemented());
1321  return;
1322  }
1323 
1329  std::vector<SymmetricTensor<2,dim>> elastic_force;
1330 
1335  std::vector<SymmetricTensor<2,dim>> viscoelastic_strain_rate;
1336  };
1337 
1338 
1339 
1350  template <int dim>
1352  {
1353  public:
1354  EnthalpyOutputs(const unsigned int n_points)
1355  : enthalpies_of_fusion(n_points, numbers::signaling_nan<double>())
1356  {}
1357 
1358  virtual ~EnthalpyOutputs()
1359  = default;
1360 
1362  const FullMatrix<double> &/*projection_matrix*/,
1363  const FullMatrix<double> &/*expansion_matrix*/) override
1364  {
1365  AssertThrow(operation == MaterialAveraging::AveragingOperation::none,ExcNotImplemented());
1366  return;
1367  }
1368 
1374  std::vector<double> enthalpies_of_fusion;
1375  };
1376 
1377 
1378 
1394  template <int dim>
1395  class Interface : public Plugins::InterfaceBase
1396  {
1397  public:
1405 
1413 
1426  get_model_dependence () const;
1427 
1437  virtual bool is_compressible () const = 0;
1446  virtual
1447  void evaluate (const MaterialModel::MaterialModelInputs<dim> &in,
1449 
1455  virtual
1456  void
1457  create_additional_named_outputs (MaterialModelOutputs &outputs) const;
1458 
1459 
1467  virtual
1468  void
1469  fill_additional_material_model_inputs(MaterialModel::MaterialModelInputs<dim> &input,
1470  const LinearAlgebra::BlockVector &solution,
1471  const FEValuesBase<dim> &fe_values,
1472  const Introspection<dim> &introspection) const;
1473 
1474  protected:
1491  };
1492 
1508  template <int dim>
1509  void
1510  register_material_model (const std::string &name,
1511  const std::string &description,
1512  void (*declare_parameters_function) (ParameterHandler &),
1513  std::unique_ptr<Interface<dim>> (*factory_function) ());
1514 
1525  template <int dim>
1526  std::unique_ptr<Interface<dim>>
1527  create_material_model (const std::string &model_name);
1528 
1529 
1541  template <int dim>
1542  std::unique_ptr<Interface<dim>>
1543  create_material_model (ParameterHandler &prm);
1544 
1545 
1552  template <int dim>
1553  std::string
1555 
1556 
1562  template <int dim>
1563  void
1564  declare_parameters (ParameterHandler &prm);
1565 
1566 
1567 
1577  template <int dim>
1578  void
1579  write_plugin_graph (std::ostream &output_stream);
1580 
1581 
1582 
1583 // --------------------- template function definitions ----------------------------------
1584 
1585  template <int dim>
1586  template <class AdditionalInputType>
1587  std::shared_ptr<AdditionalInputType>
1589  {
1590  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1591  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1592  return std::dynamic_pointer_cast<AdditionalInputType>(additional_inputs[i]);
1593 
1594  return nullptr;
1595  }
1596 
1597 
1598  template <int dim>
1599  template <class AdditionalInputType>
1600  std::shared_ptr<const AdditionalInputType>
1602  {
1603  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1604  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1605  return std::dynamic_pointer_cast<const AdditionalInputType>(additional_inputs[i]);
1606 
1607  return nullptr;
1608  }
1609 
1610 
1611  template <int dim>
1612  template <class AdditionalOutputType>
1613  std::shared_ptr<AdditionalOutputType>
1615  {
1616  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1617  if (dynamic_cast<AdditionalOutputType *> (additional_outputs[i].get()))
1618  return std::dynamic_pointer_cast<AdditionalOutputType>(additional_outputs[i]);
1619 
1620  return nullptr;
1621  }
1622 
1623 
1624  template <int dim>
1625  template <class AdditionalOutputType>
1626  std::shared_ptr<const AdditionalOutputType>
1628  {
1629  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1630  if (dynamic_cast<const AdditionalOutputType *> (additional_outputs[i].get()))
1631  return std::dynamic_pointer_cast<const AdditionalOutputType>(additional_outputs[i]);
1632 
1633  return nullptr;
1634  }
1635 
1636 
1637  // The following four functions are deprecated:
1638  template <int dim>
1639  template <class AdditionalInputType>
1640  AdditionalInputType *
1642  {
1643  return get_additional_input_object<AdditionalInputType>().get();
1644  }
1645 
1646 
1647  template <int dim>
1648  template <class AdditionalInputType>
1649  const AdditionalInputType *
1651  {
1652  return get_additional_input_object<AdditionalInputType>().get();
1653  }
1654 
1655 
1656  template <int dim>
1657  template <class AdditionalOutputType>
1658  AdditionalOutputType *
1660  {
1661  return get_additional_output_object<AdditionalOutputType>().get();
1662  }
1663 
1664 
1665  template <int dim>
1666  template <class AdditionalOutputType>
1667  const AdditionalOutputType *
1669  {
1670  return get_additional_output_object<AdditionalOutputType>().get();
1671  }
1672 
1673 
1674  template <int dim>
1675  template <class AdditionalInputType>
1676  bool
1678  {
1679  for (unsigned int i=0; i<additional_inputs.size(); ++i)
1680  if (dynamic_cast<AdditionalInputType *> (additional_inputs[i].get()))
1681  return true;
1682 
1683  return false;
1684  }
1685 
1686 
1687  template <int dim>
1688  template <class AdditionalOutputType>
1689  bool
1691  {
1692  for (unsigned int i=0; i<additional_outputs.size(); ++i)
1693  if (dynamic_cast<const AdditionalOutputType *> (additional_outputs[i].get()))
1694  return true;
1695 
1696  return false;
1697  }
1698 
1699 
1700 
1701  template <int dim>
1703  {
1704  Assert(this->additional_outputs.empty(), ExcMessage("Destination of move needs to be empty!"));
1705  this->additional_outputs = std::move(other.additional_outputs);
1706  }
1707 
1708 
1716 #define ASPECT_REGISTER_MATERIAL_MODEL(classname,name,description) \
1717  template class classname<2>; \
1718  template class classname<3>; \
1719  namespace ASPECT_REGISTER_MATERIAL_MODEL_ ## classname \
1720  { \
1721  aspect::internal::Plugins::RegisterHelper<aspect::MaterialModel::Interface<2>,classname<2>> \
1722  dummy_ ## classname ## _2d (&aspect::MaterialModel::register_material_model<2>, \
1723  name, description); \
1724  aspect::internal::Plugins::RegisterHelper<aspect::MaterialModel::Interface<3>,classname<3>> \
1725  dummy_ ## classname ## _3d (&aspect::MaterialModel::register_material_model<3>, \
1726  name, description); \
1727  }
1728  }
1729 }
1730 
1731 
1732 #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:516
std::vector< double > entropy_derivative_pressure
Definition: interface.h:642
std::vector< double > entropy_derivative_temperature
Definition: interface.h:650
void average_property(const AveragingOperation operation, const FullMatrix< double > &projection_matrix, const FullMatrix< double > &expansion_matrix, std::vector< double > &values_out)
::TrilinosWrappers::MPI::BlockVector BlockVector
Definition: global.h:301
std::vector< std::vector< double > > composition
Definition: interface.h:416
std::vector< double > thermal_expansion_coefficients
Definition: interface.h:619
virtual void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &)
Definition: interface.h:955
std::vector< Point< dim > > position
Definition: interface.h:384
std::vector< std::vector< double > > prescribed_field_outputs
Definition: interface.h:1162
void register_material_model(const std::string &name, const std::string &description, void(*declare_parameters_function)(ParameterHandler &), std::unique_ptr< Interface< dim >>(*factory_function)())
std::vector< double > thermal_conductivities
Definition: interface.h:629
ElasticOutputs(const unsigned int n_points)
Definition: interface.h:1308
std::vector< std::vector< double > > reaction_rates
Definition: interface.h:1109
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:1213
std::vector< SymmetricTensor< 2, dim > > strain_rate
Definition: interface.h:430
std::vector< std::vector< double > > reaction_terms
Definition: interface.h:688
void average(const MaterialAveraging::AveragingOperation operation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1361
std::shared_ptr< AdditionalOutputType > get_additional_output_object()
Definition: interface.h:1614
std::vector< Tensor< 1, dim > > velocity
Definition: interface.h:409
EnthalpyOutputs(const unsigned int n_points)
Definition: interface.h:1354
AveragingOperation parse_averaging_operation_name(const std::string &s)
std::shared_ptr< AdditionalInputType > get_additional_input_object()
Definition: interface.h:1588
AdditionalMaterialOutputsStokesRHS(const unsigned int n_points)
Definition: interface.h:1206
Dependence operator|=(Dependence &d1, const Dependence d2)
Definition: interface.h:105
void move_additional_outputs_from(MaterialModelOutputs< dim > &other)
Definition: interface.h:1702
std::vector< double > enthalpies_of_fusion
Definition: interface.h:1374
std::vector< SymmetricTensor< 2, dim > > elastic_force
Definition: interface.h:1329
DEAL_II_DEPRECATED AdditionalInputType * get_additional_input()
DEAL_II_DEPRECATED AdditionalOutputType * get_additional_output()
std::vector< std::vector< double > > output_values
Definition: interface.h:1037
void average(const MaterialAveraging::AveragingOperation operation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1316
DoFHandler< dim >::active_cell_iterator current_cell
Definition: interface.h:447
NonlinearDependence::ModelDependence model_dependence
Definition: interface.h:1490
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:400
std::vector< SymmetricTensor< 2, dim > > viscoelastic_strain_rate
Definition: interface.h:1335
MaterialProperties::Property requested_properties
Definition: interface.h:456
void average(const MaterialAveraging::AveragingOperation, const FullMatrix< double > &, const FullMatrix< double > &) override
Definition: interface.h:1027
std::vector< std::shared_ptr< AdditionalMaterialOutputs< dim > > > additional_outputs
Definition: interface.h:695