18 #ifndef MULTI_FIELD_IMPL_HH_ 19 #define MULTI_FIELD_IMPL_HH_ 36 template<
int spacedim,
class Value>
39 no_check_control_field_(nullptr)
48 template<
int spacedim,
class Value>
60 template<
int spacedim,
class Value>
64 OLD_ASSERT(other.
shared_->mesh_,
"Must call set_mesh before assign to other field.\n");
66 "Assignment between multi fields with different meshes.\n");
67 OLD_ASSERT(
shared_->comp_names_.size(),
"Vector of component names can't be empty!\n");
69 "Both multi fields must have same size of vectors of component names.\n");
72 if (&other ==
this)
return *
this;
77 shared_->comp_names_ = comp_names;
78 shared_->is_fully_initialized_ =
false;
91 for (
unsigned int i=0; i<other.
size(); ++i) {
93 if (this->
shared_->comp_names_[i].length() == 0)
94 THROW( Input::ExcInputMessage() << EI_Message(
"The field " + this->
input_name()
95 +
" has set empty name of component.") );
101 THROW( ExcMessage() << EI_Message(
"Internal error. Assignment operator can't be used after call setup_component() method.") );
111 template<
int spacedim,
class Value>
113 OLD_ASSERT(
false,
"This method can't be used for MultiField");
121 template<
int spacedim,
class Value>
128 template<
int spacedim,
class Value>
134 shared_->no_check_values_=value_list;
139 template<
int spacedim,
class Value>
152 if (field.set_time(time, limit_side))
161 template<
int spacedim,
class Value>
165 THROW(ExcFieldMeshDifference() << EI_Field(
name()) );
172 template<
int spacedim,
class Value>
175 .error(
"Can not copy to the non-copy field.");
179 && this->
shared_->input_list_.size() != 0 )
return;
181 if (
typeid(other) ==
typeid(*this)) {
185 auto const &other_field =
dynamic_cast< SubFieldType const &
>(other);
193 template<
int spacedim,
class Value>
202 for (
unsigned long index=0; index < this->
size(); index++) {
203 sub_fields_[index].compute_field_data( type, stream );
210 template<
int spacedim,
class Value>
213 for(
auto &field :
sub_fields_) field.observe_output(observe);
219 template<
int spacedim,
class Value>
222 for(
auto &field :
sub_fields_) const_all = const_all && field.is_constant(reg);
226 template<
int spacedim,
class Value>
229 ASSERT_DBG(
true).error(
"Not used yet. Test it.");
233 FieldResult sub_result = field.field_result(region_set);
237 result_all = sub_result;
240 else if (sub_result != result_all)
249 template<
int spacedim,
class Value>
252 int nrows = Value::NRows_;
253 int ncols = Value::NCols_;
254 string type =
"Integer";
258 return fmt::format(
"{{ \"subfields\": true, \"shape\": [ {}, {} ], \"type\": \"{}\", \"limit\": [ {}, {} ] }}",
259 nrows, ncols, type, this->
limits().first, this->
limits().second);
263 template<
int spacedim,
class Value>
265 unsigned int comp_size = this->
shared_->comp_names_.size();
267 ASSERT_GT(comp_size, 0).error(
"Vector of component names is empty!\n");
271 for(
unsigned int i_comp=0; i_comp < comp_size; i_comp++)
273 if (this->
shared_->comp_names_[i_comp].length() == 0)
276 full_name = this->
shared_->comp_names_[i_comp] +
"_" +
name();
286 sub_fields_[i_comp].add_factory( std::make_shared<MultiFieldFactory>(i_comp) );
288 if (this->
shared_->input_default_!=
"") {
299 template<
int spacedim,
class Value>
308 if (
it->opt_val(this->input_name(), mf_array) ) {
309 unsigned int comp_size = this->
shared_->comp_names_.size();
310 if (mf_array.
size() != 1 && mf_array.
size() != comp_size)
311 THROW( Exc_InvalidMultiFieldSize() << EI_MultiFieldName(this->
input_name())
312 << EI_Size(mf_array.
size()) << EI_ExpectedSize(comp_size) << list.
ei_address() );
347 template<
int spacedim,
class Value>
354 unsigned int position = 0;
356 if (multifield_arr.
size() > 1)
357 while (index_ != position) {
363 field_algo_base->set_component_idx(index_);
364 return field_algo_base;
372 template<
int spacedim,
class Value>
379 template<
int spacedim,
class Value>
381 for(
auto &field :
sub_fields_) field.cache_allocate(eval_points);
385 template<
int spacedim,
class Value>
387 for(
auto &field :
sub_fields_) field.cache_update(cache_map);
391 template<
int spacedim,
class Value>
397 unsigned int comp_size = this->
shared_->comp_names_.size();
398 ASSERT_GT(comp_size, 0).error(
"Vector of component names is empty!\n");
403 for(
unsigned int i_comp=0; i_comp < comp_size; i_comp++)
408 sub_fields_[i_comp].set_field(domain, field_vec[i_comp], time);
IT::Instance get_input_type() override
std::string get_value_attribute() const override
Common abstract parent of all Field<...> classes.
auto disable_where(const MultiField< spacedim, typename FieldValue< spacedim >::Enum > &control_field, const vector< FieldEnum > &value_list) -> MultiField &
unsigned int size() const
Number of subfields that compose the multi-field.
FieldFlag::Flags get_flags() const
void set_fields(const RegionSet &domain, std::vector< typename Field< spacedim, Value >::FieldBasePtr > field_vec, double time=0.0)
static const Input::Type::Instance & get_input_type_instance(Input::Type::Selection value_selection=Input::Type::Selection())
bool is_active_field_descriptor(const Input::Record &in_rec, const std::string &input_name) override
OutputTime::DiscreteSpace get_output_type() const
void copy_from(const FieldCommon &other) override
Class template representing a field with values dependent on: point, element, and region...
std::string format(CStringRef format_str, ArgList args)
unsigned int component_index_
std::pair< double, double > limits() const
#define ASSERT_GT(a, b)
Definition of comparative assert macro (Greater Than)
Directing class of FieldValueCache.
Field< spacedim, Value > SubFieldType
const MultiField< spacedim, typename FieldValue< spacedim >::Enum > * no_check_control_field_
Helper struct stores data for initizalize descentants of FieldAlgorithmBase.
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
MultiField & operator=(const MultiField &other)
Basic time management functionality for unsteady (and steady) solvers (class Equation).
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
void set_input_list(const Input::Array &list, const TimeGovernor &tg) override
Input::Array full_input_list_
Full list of input field descriptors from which the subfields of MultiField are set.
static constexpr bool value
constexpr bool match(Mask mask) const
std::shared_ptr< SharedData > shared_
const std::string & name() const
std::vector< SubFieldType > sub_fields_
Subfields (items) of MultiField.
FieldFlag::Flags & flags()
virtual Field< spacedim, Value >::FieldBasePtr create_field(Input::Record rec, const FieldCommon &field)
const UnitSI & units() const
FieldFlag::Flags flags_
Field flags. Default setting is "an equation input field, that can read from user input...
static const unsigned int N_DISCRETE_SPACES
const TimeGovernor * tg_
TimeGovernor is necessary for set input list in setup_components method.
bool set_time(const TimeStep &time, LimitSide limit_side) override
LimitSide last_limit_side_
FieldResult field_result(RegionSet region_set) const override
Indicates special field states.
MultiField(bool bc=false)
void field_output(std::shared_ptr< OutputTime > stream) override
static std::shared_ptr< FieldAlgorithmBase< spacedim, Value > > function_factory(const Input::AbstractRecord &rec, const struct FieldAlgoBaseInitData &init_data)
std::shared_ptr< FieldBaseType > FieldBasePtr
bool is_constant(Region reg) override
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR)
IT::Array get_multifield_input_type() override
void cache_update(ElementCacheMap &cache_map) override
Implements FieldCommon::cache_update.
#define ASSERT_LT(a, b)
Definition of comparative assert macro (Less Than)
const Mesh * mesh() const
FieldCommon & name(const string &name)
unsigned int n_comp() const
Class for representation of a vector of fields of the same physical quantity.
const std::string & input_name() const
static constexpr Mask equation_input
The field is data parameter of the owning equation. (default on)
void cache_allocate(std::shared_ptr< EvalPoints > eval_points) override
Implements FieldCommon::cache_allocate.
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
Representation of one time step..
TimeStatus set_time_result_
void observe_output(std::shared_ptr< Observe > observe) override
void set_mesh(const Mesh &mesh) override
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual)
static constexpr Mask declare_input
The field can be set from input. The key in input field descriptor is declared. (default on) ...