Flow123d  JS_before_hm-1011-g79d7237
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 (bool bc=false)
 
 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) override
 
void observe_output (std::shared_ptr< Observe > observe) 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...
 
SubFieldTypeoperator[] (unsigned int idx)
 
const SubFieldTypeoperator[] (unsigned int idx) const
 
void setup_components ()
 
void set_input_list (const Input::Array &list, const TimeGovernor &tg) override
 
void cache_allocate (std::shared_ptr< EvalPoints > eval_points) override
 Implements FieldCommon::cache_allocate. More...
 
void cache_update (ElementCacheMap &cache_map) override
 Implements FieldCommon::cache_update. More...
 
void set_fields (const RegionSet &domain, std::vector< typename Field< spacedim, Value >::FieldBasePtr > field_vec, double time=0.0)
 
- Public Member Functions inherited from FieldCommon
 TYPEDEF_ERR_INFO (EI_Time, double)
 
 TYPEDEF_ERR_INFO (EI_Field, 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")
 
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
 
bool is_bc () const
 
unsigned int n_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 ~FieldCommon ()
 
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)
 
- Protected Types inherited from FieldCommon
enum  TimeStatus { TimeStatus::changed, TimeStatus::constant, TimeStatus::unknown }
 
- Protected Member Functions inherited from FieldCommon
 FieldCommon ()
 
 FieldCommon (const FieldCommon &other)
 
void set_history_changed ()
 
- 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 type_of_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

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.

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

Definition at line 91 of file multi_field.hh.

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

Definition at line 89 of file multi_field.hh.

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

template<int spacedim, class Value >
MultiField< spacedim, Value >::MultiField ( bool  bc = false)

Default constructor. bc indicates boundary multifield.

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

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

Copy constructor.

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

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

Virtual destructor.

Definition at line 203 of file multi_field.hh.

Member Function Documentation

template<int spacedim, class Value >
void MultiField< spacedim, Value >::cache_allocate ( std::shared_ptr< EvalPoints eval_points)
overridevirtual

Implements FieldCommon::cache_allocate.

Implements FieldCommon.

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

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

Implements FieldCommon::cache_update.

Implements FieldCommon.

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

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 173 of file multi_field.impl.hh.

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   
)
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 129 of file multi_field.impl.hh.

Here is the caller graph for this function:

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

Implementation of FieldCommonBase::output().

Implements FieldCommon.

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

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 227 of file multi_field.impl.hh.

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 112 of file multi_field.impl.hh.

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 122 of file multi_field.impl.hh.

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 250 of file multi_field.impl.hh.

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

Implementation of FieldCommonBase::is_constant().

Implements FieldCommon.

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

template<int spacedim, class Value >
void MultiField< spacedim, Value >::observe_output ( std::shared_ptr< Observe observe)
overridevirtual

Implementation of FieldCommonBase::observe_output().

Implements FieldCommon.

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

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 61 of file multi_field.impl.hh.

Here is the caller graph for this function:

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 212 of file multi_field.hh.

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 221 of file multi_field.hh.

template<int spacedim, class Value>
void MultiField< spacedim, Value >::set_fields ( const RegionSet domain,
std::vector< typename Field< spacedim, Value >::FieldBasePtr >  field_vec,
double  time = 0.0 
)

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

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

Returns vector of value in one given point on an element given by ElementAccessor elm. It returns reference to he actual value in order to avoid temporaries for vector and tensor values. Returns std::vector of vector values in several points at once. The base class implements trivial implementation using the value(,,) method. This is not optimal as it involves lot of virtual calls, but this overhead can be negligible for more complex fields as Python of Formula.

Implements FieldCommon.

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

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 162 of file multi_field.impl.hh.

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 140 of file multi_field.impl.hh.

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 264 of file multi_field.impl.hh.

Here is the caller graph for this function:

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

Number of subfields that compose the multi-field.

Definition at line 206 of file multi_field.hh.

Here is the caller graph for this function:

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

Member Data Documentation

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 265 of file multi_field.hh.

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 277 of file multi_field.hh.

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

Subfields (items) of MultiField.

Definition at line 262 of file multi_field.hh.

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 268 of file multi_field.hh.


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