https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MutableCoefficientsInterface.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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 <iostream>
11#include <iomanip>
12
13#include "MooseObject.h"
14
16
19{
21
22 params.addClassDescription("This interface universalizes the communication standards for "
23 "array-based coefficient transfers.");
24
25 params.addParam<bool>("print_when_set", false, "Print the array of coefficients when set");
26
27 return params;
28}
29
31 const InputParameters & parameters)
32 : Restartable(moose_object->getMooseApp(),
33 moose_object->name() + "_coefs",
34 "MutableCoefficientsInterface",
35 moose_object->parameters().get<THREAD_ID>("_tid")),
36 _characteristics(declareRestartableData<std::vector<std::size_t>>("characteristics")),
37 _coefficients(declareRestartableData<std::vector<Real>>("coefficients")),
38 _enforce_size(false),
39 _print_coefficients(parameters.get<bool>("print_when_set")),
40 _console(moose_object->_console)
41{
42}
43
44Real
46{
47 return _coefficients[index];
48}
49
50const std::vector<std::size_t> &
55
56const std::vector<Real> &
61
62std::vector<Real> &
67
68std::string
70{
71 std::stringbuf string;
72 std::ostream table(&string);
73
74 table << *this;
75
76 return string.str();
77}
78
79std::size_t
81{
82 return _coefficients.size();
83}
84
85bool
87{
88 // Check the coefficient sizes if requested
89 if ((_enforce_size && other._enforce_size) && getSize() != other.getSize())
90 return false;
91
92 // Check the size of the characteristics array
93 if (_characteristics.size() != other._characteristics.size())
94 return false;
95
96 // Check the values of the characteristics array
97 for (std::size_t i = 0; i < _characteristics.size(); ++i)
98 if (_characteristics[i] != other._characteristics[i])
99 return false;
100
101 return true;
102}
103
104bool
109
110void
112{
113 _enforce_size = enforce;
114}
115
116void
118{
119 if (!isCompatibleWith(other))
120 mooseError("Cannot import coefficients from incompatible MutableCoefficientsInterface");
121
123
125 _console << *this;
126
128}
129
130void
131MutableCoefficientsInterface::resize(std::size_t size, Real fill, bool fill_out_to_size)
132{
133 if (size != _coefficients.size())
134 {
135 if (_enforce_size &&
136 (size > _coefficients.size() || (size < _coefficients.size() && !fill_out_to_size)))
137 mooseError("Cannot resize coefficient array with size enforcement enabled.");
138
139 _coefficients.resize(size, fill);
140
142 _console << *this;
143
145 }
146}
147
148void
150 const std::vector<std::size_t> & new_characteristics)
151{
152 _characteristics = new_characteristics;
153}
154
155void
156MutableCoefficientsInterface::setCoefficients(const std::vector<Real> & new_coefficients)
157{
158 if (_enforce_size && new_coefficients.size() != _coefficients.size())
159 mooseError("Cannon assigned a coefficient array with differing size when size enforcement is "
160 "enabled.");
161
162 _coefficients = new_coefficients;
163
165 _console << *this;
166
168}
169
170void
171MutableCoefficientsInterface::setCoefficients(std::vector<Real> && dropin_coefficients)
172{
173 if (_enforce_size && dropin_coefficients.size() != _coefficients.size())
174 mooseError("Cannon assigned a coefficient array with differing size when size enforcement is "
175 "enabled.");
176
177 _coefficients = dropin_coefficients;
178
180 _console << *this;
181
183}
184
185std::ostream &
186operator<<(std::ostream & stream, const MutableCoefficientsInterface & me)
187{
188 const MooseObject * myself_again = dynamic_cast<const MooseObject *>(&me);
189 stream << "\n\n"
190 << "MutableCoefficientsInterface: " << (myself_again ? myself_again->name() : "Unknown")
191 << "\n"
192 << " Number of Coefficients: " << me.getSize() << "\n";
193
194 for (std::size_t i = 0; i < me.getSize(); ++i)
195 stream << std::setw(4) << i << ": " << std::setw(12) << me[i] << ((i % 6 == 5) ? "\n" : " ");
196
197 stream << "\n\n" << std::flush;
198
199 return stream;
200}
InputParameters emptyInputParameters()
void mooseError(Args &&... args)
unsigned int THREAD_ID
std::ostream & operator<<(std::ostream &stream, const MutableCoefficientsInterface &me)
const std::string name
Definition Setup.h:21
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
const std::string & name() const
This class is designed to provide a uniform interface for any class that uses an array of coefficient...
virtual void coefficientsChanged()
Called when the coefficients have been changed.
bool _enforce_size
Boolean that locks or allows resizing of the coefficient array.
Real operator[](std::size_t index) const
Get the value of the coefficient at the corresponding index.
std::vector< std::size_t > & _characteristics
An array of integer characteristics that can be used to check compatibility.
void setCharacteristics(const std::vector< std::size_t > &new_characteristics)
Sets the characteristics array.
void importCoefficients(const MutableCoefficientsInterface &other)
Import the coefficients from another instance.
bool isSizeEnforced() const
Returns true if the size of the coefficient array is fixed and enforced.
MutableCoefficientsInterface(const MooseObject *moose_object, const InputParameters &parameters)
std::string getCoefficientsTable() const
Get a formatted string of the coefficients.
void enforceSize(bool enforce)
Toggle whether the size of the coefficient array can be changed.
const bool _print_coefficients
Boolean to flag if the coefficients should be printed when set.
const std::vector< Real > & getCoefficients() const
Get a read-only reference to the vector of coefficients.
void setCoefficients(const std::vector< Real > &new_coefficients)
Set the coefficients using a copy operation.
std::size_t getSize() const
Get the size, aka number of coefficients.
const ConsoleStream & _console
MooseObject instance of this to provide access to _console
bool isCompatibleWith(const MutableCoefficientsInterface &other) const
Checks to see if another instance is compatible.
std::vector< Real > & _coefficients
The coefficient array.
void resize(std::size_t size, Real fill=0.0, bool fill_out_to_size=true)
Resize the array, using the value for fill if the new size is larger.
const std::vector< std::size_t > & getCharacteristics() const
Get a reference to the characteristics array.