Flow123d  master-130ae5c
Classes | Public Types | Public Member Functions | Private Attributes | List of all members
MultiField< spacedim, Value > Class Template Reference

Class for representation of a vector of fields of the same physical quantity. More...

#include <multi_field.hh>

Inheritance diagram for MultiField< spacedim, Value >:
Inheritance graph
[legend]
Collaboration diagram for MultiField< spacedim, Value >:
Collaboration graph
[legend]

Classes

class  MultiFieldFactory
 

Public Types

typedef FieldAlgorithmBase< spacedim, ValueSubFieldBaseType
 
typedef Field< spacedim, ValueSubFieldType
 
typedef FieldAlgorithmBase< spacedim, Value >::Point Point
 
typedef FieldValue_< 0, 1, typename Value::element_type > MultiFieldValue
 

Public Member Functions

 TYPEDEF_ERR_INFO (EI_MultiFieldName, const string)
 
 TYPEDEF_ERR_INFO (EI_Size, unsigned int)
 
 TYPEDEF_ERR_INFO (EI_ExpectedSize, unsigned int)
 
 DECLARE_INPUT_EXCEPTION (Exc_InvalidMultiFieldSize,<< "Invalid size "<< EI_Size::val<< "of the MultiField "<< EI_MultiFieldName::qval<< ", expected size: "<< EI_ExpectedSize::val)
 
 MultiField ()
 
 MultiField (const MultiField &other)
 
MultiFieldoperator= (const MultiField &other)
 
IT::Instance get_input_type () override
 
IT::Array get_multifield_input_type () override
 
auto disable_where (const MultiField< spacedim, typename FieldValue< spacedim >::Enum > &control_field, const vector< FieldEnum > &value_list) -> MultiField &
 
bool set_time (const TimeStep &time, LimitSide limit_side) override
 
void set_mesh (const Mesh &mesh) override
 
void copy_from (const FieldCommon &other) override
 
void field_output (std::shared_ptr< OutputTime > stream, OutputTime::DiscreteSpace type) override
 
bool is_constant (Region reg) override
 
FieldResult field_result (RegionSet region_set) const override
 Indicates special field states. More...
 
std::string get_value_attribute () const override
 
virtual ~MultiField ()
 
unsigned int size () const
 Number of subfields that compose the multi-field. More...
 
std::vector< const FieldCommon * > set_dependency (unsigned int i_reg) const override
 
SubFieldTypeoperator[] (unsigned int idx)
 
const SubFieldTypeoperator[] (unsigned int idx) const
 
FieldCommonget_component (unsigned int idx) override
 
void setup_components ()
 
void set_input_list (const Input::Array &list, const TimeGovernor &tg) override
 
void cache_reallocate (const ElementCacheMap &cache_map, unsigned int region_idx) const override
 Implements FieldCommon::cache_reallocate. More...
 
void cache_update (ElementCacheMap &cache_map, unsigned int region_patch_idx) const override
 Implements FieldCommon::cache_update. More...
 
void set (std::vector< typename Field< spacedim, Value >::FieldBasePtr > field_vec, double time, std::vector< std::string > region_set_names={"ALL"})
 
void set (typename Field< spacedim, Value >::FieldBasePtr field, double time, std::vector< std::string > region_set_names={"ALL"})
 
FieldValueCache< double > * value_cache () override
 Implements FieldCommon::value_cache. More...
 
const FieldValueCache< double > * value_cache () const override
 Implements FieldCommon::value_cache. More...
 
- Public Member Functions inherited from FieldCommon
 TYPEDEF_ERR_INFO (EI_Time, double)
 
 TYPEDEF_ERR_INFO (EI_Field, std::string)
 
 TYPEDEF_ERR_INFO (EI_FieldInputName, std::string)
 
 TYPEDEF_ERR_INFO (EI_FieldName, std::string)
 
 TYPEDEF_ERR_INFO (EI_RegId, unsigned int)
 
 TYPEDEF_ERR_INFO (EI_RegLabel, std::string)
 
 DECLARE_INPUT_EXCEPTION (ExcNonascendingTime,<< "Non-ascending time: "<< EI_Time::val<< " for field "<< EI_Field::qval<< ".\n")
 
 DECLARE_INPUT_EXCEPTION (ExcMissingDomain,<< "Missing domain specification (region or r_id) in the field descriptor:")
 
 DECLARE_EXCEPTION (ExcFieldMeshDifference,<< "Two copies of the field "<< EI_Field::qval<< "call set_mesh with different arguments.\n")
 
 DECLARE_INPUT_EXCEPTION (ExcMissingFieldValue,<< "Missing value of the input field "<< EI_FieldInputName::qval<< " ("<< EI_FieldName::qval<< ") on region ID: "<< EI_RegId::val<< " label: "<< EI_RegLabel::qval<< ".\n")
 
FieldCommonname (const string &name)
 
FieldCommondescription (const string &description)
 
FieldCommoninput_default (const string &input_default)
 
FieldCommonunits (const UnitSI &units)
 Set basic units of the field. More...
 
FieldCommonset_limits (double min, double max=std::numeric_limits< double >::max())
 
FieldCommoninput_selection (Input::Type::Selection element_selection)
 
FieldCommonoutput_type (OutputTime::DiscreteSpace rt)
 
FieldCommonflags (FieldFlag::Flags::Mask mask)
 
FieldCommonflags_add (FieldFlag::Flags::Mask mask)
 
void set_components (const std::vector< string > &names)
 
const std::string & input_name () const
 
const std::string & name () const
 
const std::string description () const
 
const std::string & input_default () const
 
const UnitSIunits () const
 
std::pair< double, double > limits () const
 
OutputTime::DiscreteSpace get_output_type () const
 
unsigned int n_comp () const
 
std::string full_comp_name (unsigned int i_comp) const
 
const Meshmesh () const
 
FieldFlag::Flagsflags ()
 
FieldFlag::Flags get_flags () const
 
double time () const
 
bool is_jump_time ()
 
unsigned int input_list_size () const
 
bool changed () const
 
void mark_input_times (const TimeGovernor &tg)
 
void set_component_index (unsigned int idx)
 
bool is_multifield () const
 
virtual FieldCommonget_component (FMT_UNUSED unsigned int idx)
 
virtual void set_output_data_cache (FMT_UNUSED OutputTime::DiscreteSpace space_type, FMT_UNUSED std::shared_ptr< OutputTime > stream)
 Create and set shared_ptr to ElementDataCache. Used only in descendant Field<>. More...
 
virtual void fill_data_value (FMT_UNUSED const std::vector< int > &offsets)
 Fill data to ElementDataCache on given patch. More...
 
virtual void fill_observe_value (FMT_UNUSED std::shared_ptr< ElementDataCacheBase > output_cache_base, FMT_UNUSED const std::vector< int > &offsets)
 Fill data to ElementDataCache on given patch. More...
 
void set_default_fieldset (FieldSet &default_fs)
 
virtual ~FieldCommon ()
 
uint n_shape () const
 Return number of shape components. More...
 
void set_time_result_changed ()
 Manually mark flag that the field has been changed. More...
 

Private Attributes

std::vector< SubFieldTypesub_fields_
 Subfields (items) of MultiField. More...
 
Input::Array full_input_list_
 Full list of input field descriptors from which the subfields of MultiField are set. More...
 
const TimeGovernortg_
 TimeGovernor is necessary for set input list in setup_components method. More...
 
const MultiField< spacedim, typename FieldValue< spacedim >::Enum > * no_check_control_field_
 

Additional Inherited Members

- Static Public Member Functions inherited from FieldCommon
static IT::Record field_descriptor_record (const string &record_name)
 
static const std::string field_descriptor_record_description (const string &record_name)
 
static bool print_message_table (ostream &stream, std::string equation_name)
 
- Public Attributes inherited from FieldCommon
std::vector< uintshape_
 
- Protected Types inherited from FieldCommon
enum class  TimeStatus { changed , constant , changed_forced , unknown }
 
- Protected Member Functions inherited from FieldCommon
 FieldCommon ()
 
 FieldCommon (const FieldCommon &other)
 
void set_history_changed ()
 
void set_shape (uint n_rows, uint n_cols)
 
- Protected Attributes inherited from FieldCommon
std::string name_
 
std::shared_ptr< SharedDatashared_
 
TimeStatus set_time_result_
 
double last_time_ = -numeric_limits<double>::infinity()
 
LimitSide last_limit_side_ = LimitSide::left
 
bool is_jump_time_
 
OutputTime::DiscreteSpace default_output_data_ = OutputTime::ELEM_DATA
 
unsigned int component_index_
 
bool multifield_
 
FieldFlag::Flags flags_ = FieldFlag::declare_input & FieldFlag::equation_input & FieldFlag::allow_output
 Field flags. Default setting is "an equation input field, that can read from user input, and can be written to output". More...
 
- Static Protected Attributes inherited from FieldCommon
static const unsigned int history_length_limit_ =3
 
static std::vector< MessageDatamessages_data_ = std::vector<FieldCommon::MessageData>()
 Vector of data of initialization messages. More...
 

Detailed Description

template<int spacedim, class Value>
class MultiField< spacedim, Value >

Class for representation of a vector of fields of the same physical quantity.

When solving a system of same equations with the number of components given at runtime (as in the case of transport equation for runtime given number of substances) we need means how to work with the whole vector of fields at once. This is the aim of this class. It provides the interface given by the parent class FieldCommonBase, but principally it is just a vector of Field<Value,dim> objects. The sub-fields or components of a MultiField are independent objects, how ever the setters propagates the values from the MultiFields to the individual fields. The only exception is the set_name method which in conjunction with MultiField::set_subfield_names can set unique name to each component.

Template parameters are used for every subfield.

TODO:

Definition of MultiField must be in separate file. In other case source file field.cc is too big and compiler can throw compile error.

Definition at line 87 of file multi_field.hh.

Member Typedef Documentation

◆ MultiFieldValue

template<int spacedim, class Value >
typedef FieldValue_<0,1,typename Value::element_type> MultiField< spacedim, Value >::MultiFieldValue

Definition at line 92 of file multi_field.hh.

◆ Point

template<int spacedim, class Value >
typedef FieldAlgorithmBase<spacedim, Value>::Point MultiField< spacedim, Value >::Point

Definition at line 91 of file multi_field.hh.

◆ SubFieldBaseType

template<int spacedim, class Value >
typedef FieldAlgorithmBase<spacedim, Value> MultiField< spacedim, Value >::SubFieldBaseType

Definition at line 89 of file multi_field.hh.

◆ SubFieldType

template<int spacedim, class Value >
typedef Field<spacedim, Value> MultiField< spacedim, Value >::SubFieldType

Definition at line 90 of file multi_field.hh.

Constructor & Destructor Documentation

◆ MultiField() [1/2]

template<int spacedim, class Value >
MultiField< spacedim, Value >::MultiField

Default constructor.

Definition at line 38 of file multi_field.impl.hh.

◆ MultiField() [2/2]

template<int spacedim, class Value >
MultiField< spacedim, Value >::MultiField ( const MultiField< spacedim, Value > &  other)

Copy constructor.

Definition at line 50 of file multi_field.impl.hh.

◆ ~MultiField()

template<int spacedim, class Value >
virtual MultiField< spacedim, Value >::~MultiField ( )
inlinevirtual

Virtual destructor.

Definition at line 197 of file multi_field.hh.

Member Function Documentation

◆ cache_reallocate()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::cache_reallocate ( const ElementCacheMap cache_map,
unsigned int  region_idx 
) const
overridevirtual

Implements FieldCommon::cache_reallocate.

Implements FieldCommon.

Definition at line 349 of file multi_field.impl.hh.

◆ cache_update()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::cache_update ( ElementCacheMap cache_map,
unsigned int  region_patch_idx 
) const
overridevirtual

Implements FieldCommon::cache_update.

Implements FieldCommon.

Definition at line 356 of file multi_field.impl.hh.

◆ copy_from()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::copy_from ( const FieldCommon other)
overridevirtual

Polymorphic copy. Check correct type, allows copy of MultiField or Field.

Implements FieldCommon.

Definition at line 176 of file multi_field.impl.hh.

◆ DECLARE_INPUT_EXCEPTION()

template<int spacedim, class Value >
MultiField< spacedim, Value >::DECLARE_INPUT_EXCEPTION ( Exc_InvalidMultiFieldSize  ,
<< "Invalid size "<< EI_Size::val<< "of the MultiField< spacedim, Value > "<< EI_MultiFieldName::qval<< "  ,
expected size:"<< EI_ExpectedSize::val   
)

◆ disable_where()

template<int spacedim, class Value >
auto MultiField< spacedim, Value >::disable_where ( const MultiField< spacedim, typename FieldValue< spacedim >::Enum > &  control_field,
const vector< FieldEnum > &  value_list 
) -> MultiField &

By this method you can allow that the field need not to be set on regions (and times) where the given control_field is FieldConstant and has value in given value_list. We check this in the set_time method. Through this mechanism we can switch of e.g. boundary data fields according to the type of the boundary condition.

Definition at line 132 of file multi_field.impl.hh.

Here is the caller graph for this function:

◆ field_output()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::field_output ( std::shared_ptr< OutputTime stream,
OutputTime::DiscreteSpace  type 
)
overridevirtual

Implementation of FieldCommonBase::output().

Implements FieldCommon.

Definition at line 197 of file multi_field.impl.hh.

◆ field_result()

template<int spacedim, class Value >
FieldResult MultiField< spacedim, Value >::field_result ( RegionSet  region_set) const
overridevirtual

Indicates special field states.

Return possible values from the enum FieldResult, see description there.

Only difference to Field<>::field_result is meaning of result_constant. Here we return this value if all subfields are (possibly different) constants.

Not used yet. Possibly tune behavior after usage.

Implements FieldCommon.

Definition at line 217 of file multi_field.impl.hh.

◆ get_component()

template<int spacedim, class Value >
FieldCommon* MultiField< spacedim, Value >::get_component ( unsigned int  idx)
inlineoverride

Returns pointer to the sub-field (component, as FieldCommon) of given index idx.

Definition at line 229 of file multi_field.hh.

◆ get_input_type()

template<int spacedim, class Value >
it::Instance MultiField< spacedim, Value >::get_input_type
overridevirtual

Returns input type of particular field instance, this is usually static member input_type of the corresponding FieldBase class ( with same template parameters), however, for fields returning "Enum" we have to create whole unique Input::Type hierarchy for every instance since every such field use different Selection for initialization, even if all returns just unsigned int.

Implements FieldCommon.

Definition at line 115 of file multi_field.impl.hh.

◆ get_multifield_input_type()

template<int spacedim, class Value >
it::Array MultiField< spacedim, Value >::get_multifield_input_type ( )
overridevirtual

Returns input type for MultiField instance. TODO: temporary solution, see multifield_

Implements FieldCommon.

Definition at line 125 of file multi_field.impl.hh.

◆ get_value_attribute()

template<int spacedim, class Value >
std::string MultiField< spacedim, Value >::get_value_attribute ( ) const
overridevirtual

Return specification of the field value type in form of the string: [ <element type>, NRows, NCols]

Result is valid JSON (and/or flow style YAML). For multifields not implemented.

Implements FieldCommon.

Definition at line 240 of file multi_field.impl.hh.

◆ is_constant()

template<int spacedim, class Value >
bool MultiField< spacedim, Value >::is_constant ( Region  reg)
overridevirtual

Implementation of FieldCommonBase::is_constant().

Implements FieldCommon.

Definition at line 210 of file multi_field.impl.hh.

◆ operator=()

template<int spacedim, class Value >
MultiField< spacedim, Value > & MultiField< spacedim, Value >::operator= ( const MultiField< spacedim, Value > &  other)

Assignment operator. Same properties as copy constructor, but class member name_ is not copied.

Definition at line 63 of file multi_field.impl.hh.

◆ operator[]() [1/2]

template<int spacedim, class Value >
SubFieldType& MultiField< spacedim, Value >::operator[] ( unsigned int  idx)
inline

Returns reference to the sub-field (component) of given index idx.

Definition at line 211 of file multi_field.hh.

◆ operator[]() [2/2]

template<int spacedim, class Value >
const SubFieldType& MultiField< spacedim, Value >::operator[] ( unsigned int  idx) const
inline

Returns constant reference to the sub-field (component) of given index idx.

Definition at line 220 of file multi_field.hh.

◆ set() [1/2]

template<int spacedim, class Value >
void MultiField< spacedim, Value >::set ( std::vector< typename Field< spacedim, Value >::FieldBasePtr >  field_vec,
double  time,
std::vector< std::string >  region_set_names = {"ALL"} 
)

Assigns fields from field_vec to individual components and all regions in region sets given by region_set_names. Field is added to the history with given time and possibly used in the next call of the set_time method. Caller is responsible for correct construction of given field.

Use this method only if necessary.

Definition at line 363 of file multi_field.impl.hh.

◆ set() [2/2]

template<int spacedim, class Value >
void MultiField< spacedim, Value >::set ( typename Field< spacedim, Value >::FieldBasePtr  field,
double  time,
std::vector< std::string >  region_set_names = {"ALL"} 
)

Same as previous but only for one-component MultiField (simplification for HeatModel).

Definition at line 385 of file multi_field.impl.hh.

◆ set_dependency()

template<int spacedim, class Value >
std::vector< const FieldCommon * > MultiField< spacedim, Value >::set_dependency ( unsigned int  i_reg) const
overridevirtual

Implementation of FieldCommon::set_dependency().

Implements FieldCommon.

Definition at line 341 of file multi_field.impl.hh.

◆ set_input_list()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::set_input_list ( const Input::Array list,
const TimeGovernor tg 
)
overridevirtual

Set the data list from which field will read its input. It is list of "field descriptors". When reading from the input list we consider only field descriptors containing key of named by the field name. These field descriptors has to have times forming ascending sequence.

The list is used by set_time method to set field on individual regions to actual FieldBase descendants.

Implements FieldCommon.

Definition at line 284 of file multi_field.impl.hh.

◆ set_mesh()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::set_mesh ( const Mesh mesh)
overridevirtual

We have to override the set_mesh method in order to call set_mesh method for subfields.

Implements FieldCommon.

Definition at line 165 of file multi_field.impl.hh.

◆ set_time()

template<int spacedim, class Value >
bool MultiField< spacedim, Value >::set_time ( const TimeStep time,
LimitSide  limit_side 
)
overridevirtual

Abstract method to update field to the new time level. Implemented by in class template Field<...>.

Return true if the value of the field was changed on some region. The returned value is also stored in changed_during_set_time data member.

In first call initialize MultiField to the number of components given by the size of names and use this vector to name individual components. Should be called after the setters derived from FieldCommonBase.

Implements FieldCommon.

Definition at line 143 of file multi_field.impl.hh.

◆ setup_components()

template<int spacedim, class Value >
void MultiField< spacedim, Value >::setup_components

Initialize components of MultiField.

Must be call after setting components, mesh and limit side.

Definition at line 254 of file multi_field.impl.hh.

◆ size()

template<int spacedim, class Value >
unsigned int MultiField< spacedim, Value >::size ( ) const
inline

Number of subfields that compose the multi-field.

Definition at line 200 of file multi_field.hh.

Here is the caller graph for this function:

◆ TYPEDEF_ERR_INFO() [1/3]

template<int spacedim, class Value >
MultiField< spacedim, Value >::TYPEDEF_ERR_INFO ( EI_ExpectedSize  ,
unsigned int   
)

◆ TYPEDEF_ERR_INFO() [2/3]

template<int spacedim, class Value >
MultiField< spacedim, Value >::TYPEDEF_ERR_INFO ( EI_MultiFieldName  ,
const  string 
)

◆ TYPEDEF_ERR_INFO() [3/3]

template<int spacedim, class Value >
MultiField< spacedim, Value >::TYPEDEF_ERR_INFO ( EI_Size  ,
unsigned int   
)

◆ value_cache() [1/2]

template<int spacedim, class Value >
const FieldValueCache<double>* MultiField< spacedim, Value >::value_cache ( ) const
inlineoverridevirtual

Implements FieldCommon::value_cache.

Implements FieldCommon.

Definition at line 274 of file multi_field.hh.

◆ value_cache() [2/2]

template<int spacedim, class Value >
FieldValueCache<double>* MultiField< spacedim, Value >::value_cache ( )
inlineoverridevirtual

Implements FieldCommon::value_cache.

Implements FieldCommon.

Definition at line 269 of file multi_field.hh.

Member Data Documentation

◆ full_input_list_

template<int spacedim, class Value >
Input::Array MultiField< spacedim, Value >::full_input_list_
private

Full list of input field descriptors from which the subfields of MultiField are set.

Definition at line 283 of file multi_field.hh.

◆ no_check_control_field_

template<int spacedim, class Value >
const MultiField<spacedim, typename FieldValue<spacedim>::Enum >* MultiField< spacedim, Value >::no_check_control_field_
private

If this pointer is set, turn off check of initialization in the set_time method on the regions where the method get_constant_enum_value of the control field returns value from no_check_values_. This field is private copy, its set_time method is called from the set_Time method of actual object.

Definition at line 295 of file multi_field.hh.

◆ sub_fields_

template<int spacedim, class Value >
std::vector< SubFieldType > MultiField< spacedim, Value >::sub_fields_
private

Subfields (items) of MultiField.

Definition at line 280 of file multi_field.hh.

◆ tg_

template<int spacedim, class Value >
const TimeGovernor* MultiField< spacedim, Value >::tg_
private

TimeGovernor is necessary for set input list in setup_components method.

Definition at line 286 of file multi_field.hh.


The documentation for this class was generated from the following files: