www.mooseframework.org
PorousFlowMaterial.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "PorousFlowMaterial.h"
11 #include "libmesh/quadrature.h"
12 #include <limits>
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<Material>();
19  params.addRequiredParam<UserObjectName>(
20  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names");
21  params.addParam<bool>(
22  "at_nodes", false, "Evaluate Material properties at nodes instead of quadpoints");
23  params.addPrivateParam<std::string>("pf_material_type", "pf_material");
24  params.addClassDescription("This generalises MOOSE's Material class to allow for Materials that "
25  "hold information related to the nodes in the finite element");
26  return params;
27 }
28 
29 PorousFlowMaterial::PorousFlowMaterial(const InputParameters & parameters)
30  : Material(parameters),
31  _nodal_material(getParam<bool>("at_nodes")),
32  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
33  _pressure_variable_name("pressure_variable"),
34  _saturation_variable_name("saturation_variable"),
35  _temperature_variable_name("temperature_variable"),
36  _mass_fraction_variable_name("mass_fraction_variable")
37 {
38 }
39 
40 void
42 {
43  if (_nodal_material)
44  {
45  // size the Properties to max(number_of_nodes, number_of_quadpoints)
47 
48  // compute the values only for number_of_nodes
49  Material::initStatefulProperties(_current_elem->n_nodes());
50  }
51  else
52  Material::initStatefulProperties(n_points);
53 }
54 
55 void
57 {
58  if (_nodal_material)
59  {
60  // size the Properties to max(number_of_nodes, number_of_quadpoints)
62 
63  // compute the values only for number_of_nodes
64  for (_qp = 0; _qp < _current_elem->n_nodes(); ++_qp)
65  computeQpProperties();
66  }
67  else
68  Material::computeProperties();
69 }
70 
71 void
72 PorousFlowMaterial::sizeNodalProperty(const std::string & prop_name)
73 {
74  /*
75  * For nodal materials, the Properties should be sized as the maximum of
76  * the number of nodes and the number of quadpoints.
77  * We only actually need "number of nodes" pieces of information, which are
78  * computed by computeProperties(), so the n_points - _current_elem->n_nodes()
79  * elements at the end of the std::vector will always be zero, but they
80  * are needed because MOOSE does copy operations (etc) that assumes that
81  * the std::vector is sized to number of quadpoints.
82  */
83  mooseAssert(_material_data->getMaterialPropertyStorage().hasProperty(prop_name),
84 
85  "PorousFlowMaterial can not find nodal property " << prop_name);
86  const unsigned prop_id =
87  _material_data->getMaterialPropertyStorage().retrievePropertyId(prop_name);
88  // _material_data->props() returns MaterialProperties, which is a std::vector of PropertyValue.
89  _material_data->props()[prop_id]->resize(std::max(_current_elem->n_nodes(), _qrule->n_points()));
90 }
91 
92 void
94 {
95  for (auto prop_name : getSuppliedItems())
96  sizeNodalProperty(prop_name);
97 }
98 
99 unsigned
100 PorousFlowMaterial::nearestQP(unsigned nodenum) const
101 {
102  unsigned nearest_qp = 0;
103  Real smallest_dist = std::numeric_limits<Real>::max();
104  for (unsigned qp = 1; qp < _qrule->n_points(); ++qp)
105  {
106  const Real this_dist = (_current_elem->point(nodenum) - _q_point[qp]).size();
107  if (this_dist < smallest_dist)
108  {
109  nearest_qp = qp;
110  smallest_dist = this_dist;
111  }
112  }
113  return nearest_qp;
114 }
void sizeNodalProperty(const std::string &prop_name)
Makes property with name prop_name to be size equal to max(number of nodes, number of quadpoints) in ...
void sizeAllSuppliedProperties()
Makes all supplied properties for this material to be size equal to max(number of nodes...
virtual void computeProperties() override
Correctly sizes nodal materials, then computes using Material::computeProperties. ...
virtual void initStatefulProperties(unsigned int n_points) override
Correctly sizes nodal materials, then initialises using Material::initStatefulProperties.
const bool _nodal_material
Whether the derived class holds nodal values.
InputParameters validParams< PorousFlowMaterial >()
PorousFlowMaterial(const InputParameters &parameters)
unsigned nearestQP(unsigned nodenum) const
Find the nearest quadpoint to the node labelled by nodenum in the current element.
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...