Flow123d
JS_before_hm-1710-g489f4168f
|
Class template representing a field with values dependent on: point, element, and region. More...
#include <field.hh>
Classes | |
class | FactoryBase |
struct | SharedData |
Public Types | |
typedef FieldAlgorithmBase< spacedim, Value > | FieldBaseType |
typedef std::shared_ptr< FieldBaseType > | FieldBasePtr |
typedef FieldAlgorithmBase< spacedim, Value >::Point | Point |
typedef Value | ValueType |
Public Member Functions | |
Field () | |
Field (const string &name, bool bc=false) | |
Field (unsigned int component_index, string input_name, string name="", bool bc=false) | |
Field (const Field &other) | |
Field & | operator= (const Field &other) |
Value::return_type | operator() (BulkPoint &p) |
Return appropriate value to BulkPoint in FieldValueCache. More... | |
Value::return_type | operator() (EdgePoint &p) |
Return appropriate value to EdgePoint in FieldValueCache. More... | |
Value::return_type | operator() (CouplingPoint &p) |
Return appropriate value to CouplingPoint in FieldValueCache. More... | |
Value::return_type | operator() (BoundaryPoint &p) |
Return appropriate value to BoundaryPoint in FieldValueCache. More... | |
IT::Instance | get_input_type () override |
IT::Array | get_multifield_input_type () override |
auto | disable_where (const Field< spacedim, typename FieldValue< spacedim >::Enum > &control_field, const vector< FieldEnum > &value_list) -> Field & |
void | set_mesh (const Mesh &mesh) override |
bool | is_constant (Region reg) override |
void | set (FieldBasePtr field, double time, std::vector< std::string > region_set_names={"ALL"}) |
void | set (const Input::AbstractRecord &a_rec, double time, std::vector< std::string > region_set_names={"ALL"}) |
bool | set_time (const TimeStep &time, LimitSide limit_side) override |
void | copy_from (const FieldCommon &other) override |
void | field_output (std::shared_ptr< OutputTime > stream, OutputTime::DiscreteSpaceFlags type) override |
void | observe_output (std::shared_ptr< Observe > observe) override |
FieldResult | field_result (RegionSet region_set) const override |
Indicates special field states. More... | |
std::string | get_value_attribute () const override |
virtual const Value::return_type & | value (const Point &p, const ElementAccessor< spacedim > &elm) const |
virtual void | value_list (const Armor::array &point_list, const ElementAccessor< spacedim > &elm, std::vector< typename Value::return_type > &value_list) const |
void | add_factory (std::shared_ptr< FactoryBase > factory) |
void | set_input_list (const Input::Array &list, const TimeGovernor &tg) override |
void | compute_field_data (OutputTime::DiscreteSpaceFlags space_type, std::shared_ptr< OutputTime > stream) |
void | cache_reallocate (const ElementCacheMap &cache_map, unsigned int region_idx) const override |
Implements FieldCommon::cache_allocate. More... | |
void | cache_update (ElementCacheMap &cache_map, unsigned int region_patch_idx) const override |
Implements FieldCommon::cache_update. More... | |
FieldValueCache< double > * | value_cache () override |
Implements FieldCommon::value_cache. More... | |
const FieldValueCache< double > * | value_cache () const override |
Implements FieldCommon::value_cache. More... | |
std::vector< const FieldCommon * > | set_dependency (FieldSet &field_set, unsigned int i_reg) const override |
FieldValueCache< double > * | value_cache () |
FieldValueCache< double > * | value_cache () |
const FieldValueCache< double > * | value_cache () const |
const FieldValueCache< double > * | value_cache () const |
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") | |
FieldCommon & | name (const string &name) |
FieldCommon & | description (const string &description) |
FieldCommon & | input_default (const string &input_default) |
FieldCommon & | units (const UnitSI &units) |
Set basic units of the field. More... | |
FieldCommon & | set_limits (double min, double max=std::numeric_limits< double >::max()) |
FieldCommon & | input_selection (Input::Type::Selection element_selection) |
FieldCommon & | output_type (OutputTime::DiscreteSpace rt) |
FieldCommon & | flags (FieldFlag::Flags::Mask mask) |
FieldCommon & | flags_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 UnitSI & | units () const |
std::pair< double, double > | limits () const |
OutputTime::DiscreteSpace | get_output_type () const |
bool | is_bc () const |
unsigned int | n_comp () const |
const Mesh * | mesh () const |
FieldFlag::Flags & | flags () |
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 * | get_component (FMT_UNUSED unsigned int idx) |
virtual | ~FieldCommon () |
void | set_time_result_changed () |
Manually mark flag that the field has been changed. More... | |
Static Public Attributes | |
static const unsigned int | space_dim = spacedim |
Protected Types | |
typedef pair< double, FieldBasePtr > | HistoryPoint |
Pair: time, pointer to FieldBase instance. More... | |
typedef boost::circular_buffer< HistoryPoint > | RegionHistory |
Nearest history of one region. More... | |
typedef Field< spacedim, typename FieldValue< spacedim >::Enum > | ControlField |
Protected Types inherited from FieldCommon | |
enum | TimeStatus { TimeStatus::changed, TimeStatus::constant, TimeStatus::unknown } |
Protected Member Functions | |
Value::return_type | operator[] (unsigned int i_cache_point) const |
Return item of value_cache_ given by i_cache_point. More... | |
void | update_history (const TimeStep &time) |
void | fill_data_cache (OutputTime::DiscreteSpace space_type, std::shared_ptr< OutputTime > stream, std::shared_ptr< ElementDataCache< typename Value::element_type >> data_cache) |
Fills acutally the data cache with field values, used in compute_field_data . More... | |
void | check_initialized_region_fields_ () |
std::shared_ptr< FieldFE< spacedim, Value > > | get_field_fe () |
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 | |
std::shared_ptr< SharedData > | data_ |
std::shared_ptr< ControlField > | no_check_control_field_ |
std::vector< FieldBasePtr > | region_fields_ |
std::vector< std::shared_ptr< FactoryBase > > | factories_ |
FieldValueCache< typename Value::element_type > | value_cache_ |
Protected Attributes inherited from FieldCommon | |
std::string | name_ |
std::shared_ptr< SharedData > | shared_ |
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... | |
Friends | |
template<int dim, class Val > | |
class | MultiField |
template<typename CALLABLE , typename TUPLE , int INDEX> | |
struct | detail::model_cache_item |
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< uint > | shape_ |
Static Protected Attributes inherited from FieldCommon | |
static const unsigned int | history_length_limit_ =3 |
static std::vector< MessageData > | messages_data_ = std::vector<FieldCommon::MessageData>() |
Vector of data of initialization messages. More... | |
Class template representing a field with values dependent on: point, element, and region.
By "field" we mean a mapping of a a pair (Point, Time) to a Value
, where Point is from spacedim
dimensional ambient space, Time is real number (set by set_time
method), and Value
type representing range of the field, which can be: real scalar, integer scalar (a discrete value), real vector of fixed (compile time) size, real vector of runtime size, or a matrix of fixed dimensions. Extensions to vectors or matrices of integers, or to variable tensors are possible. For vector and matrix values we use classes provided by Armadillo library for linear algebra. The Value
template parameter should FieldValue<> template, usual choices are: FieldValue<spacedim>::Scalar, FieldValue<spacedim>::Integer, FieldValue<spacedim>::Enum, FieldValue<spacedim>::VectorFixed, FieldValue<spacedim>::TensorFixed.
This class assign particular fields (instances of descendants of FiledBase) to the regions. It keeps a table of pointers to fields for every possible bulk region index (very same functionality, but for boundary regions is provided by BCField
class). This class has interface very similar to FiledBase, however key methods value
, and value_list
are not virtual in this class by contrast these methods are inlined to minimize overhead for simplest fields like FieldConstant.
TODO: currently it works only for spacedim==3 since we have only mesh in 3D ambient space.
|
protected |
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.
typedef std::shared_ptr< FieldBaseType > Field< spacedim, Value >::FieldBasePtr |
typedef FieldAlgorithmBase<spacedim, Value> Field< spacedim, Value >::FieldBaseType |
|
protected |
|
protected |
Default constructor.
Definition at line 41 of file field.impl.hh.
Field< spacedim, Value >::Field | ( | const string & | name, |
bool | bc = false |
||
) |
Definition at line 60 of file field.impl.hh.
Field< spacedim, Value >::Field | ( | unsigned int | component_index, |
string | input_name, | ||
string | name = "" , |
||
bool | bc = false |
||
) |
Constructor that must be used for create of MultiField components.
Set parameters component_index_
, shared_->input_name_
and name_
. Parameter name_ of Field is consisted of component name and MultiField name.
Definition at line 81 of file field.impl.hh.
Field< spacedim, Value >::Field | ( | const Field< spacedim, Value > & | other | ) |
Copy constructor. Keeps shared history, declaration data, mesh.
Definition at line 103 of file field.impl.hh.
void Field< spacedim, Value >::add_factory | ( | std::shared_ptr< FactoryBase > | factory | ) |
Add a new factory for creating Field algorithms on individual regions. The last factory is tried first, the last one is always the default implementation Field<...>::FactoryBase.
The Field<...> object keeps a list of such factories. When the instance of a new field algorithm has to be created from the input field descriptor, we pass through the list of factories backward and let factories to create the field algorithm instance from the actual input field descriptor. The first instance (non-null pointer) is used.
Definition at line 595 of file field.impl.hh.
|
overridevirtual |
Implements FieldCommon::cache_allocate.
Implements FieldCommon.
Definition at line 770 of file field.impl.hh.
|
overridevirtual |
Implements FieldCommon::cache_update.
Implements FieldCommon.
Definition at line 778 of file field.impl.hh.
|
protected |
Check that whole field list (region_fields_
) is set, possibly use default values for unset regions.
Definition at line 539 of file field.impl.hh.
void Field< spacedim, Value >::compute_field_data | ( | OutputTime::DiscreteSpaceFlags | space_type, |
std::shared_ptr< OutputTime > | stream | ||
) |
Interpolate given field into output discrete space_type
and store the values into storage of output time stream
for postponed output.
Definition at line 652 of file field.impl.hh.
|
overridevirtual |
Check that other has same type and assign from it.
Implements FieldCommon.
Definition at line 378 of file field.impl.hh.
auto Field< spacedim, Value >::disable_where | ( | const Field< spacedim, typename FieldValue< spacedim >::Enum > & | control_field, |
const vector< FieldEnum > & | value_list | ||
) | -> Field & |
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 209 of file field.impl.hh.
|
overridevirtual |
Implementation of FieldCommonBase::output().
Implements FieldCommon.
Definition at line 395 of file field.impl.hh.
|
overridevirtual |
Indicates special field states.
Returns true, if field is currently set to a time in which it is discontinuous. Return possible values from the enum FieldResult
, see description there. The initial state is field_none
, if the field is correctly set on all regions of the region_set
given as parameter we return state field_other
result_none
, if the field is not initialized on the region of the given element accessor elm
. Other possible results are: result_zeros, result_eye, result_ones, result_constant, result_other see FieldResult
for explanation. Implements FieldCommon.
Definition at line 431 of file field.impl.hh.
|
protected |
Fills acutally the data cache with field values, used in compute_field_data
.
Definition at line 679 of file field.impl.hh.
|
overridevirtual |
Returns reference to input type of particular field instance, this is static member input_type
of the corresponding FieldBase class (i.e. with same template parameters). However, for fields returning "Enum" we have to create whole unique Input::Type hierarchy using following method make_input_tree
. every instance since every such field use different Selection for initialization, even if all returns just unsigned int.
Implements FieldCommon.
Definition at line 192 of file field.impl.hh.
|
overridevirtual |
Returns input type for MultiField instance. TODO: temporary solution, see multifield_
Implements FieldCommon.
Definition at line 199 of file field.impl.hh.
|
overridevirtual |
Return value of input type attribute 'field_value_shape' that is appended to the input type of this field in FieldSet::make_field_descriptor_type and also to the output field selection created in EquationOutput::make_output_type. This attribute is used by GeoMop to have semantics of the input and output field data.
Attribute value is a valid JSON (and/or flow style YAML) with keys: 'subfields' - value True for multifields, False or not presented for single value fields 'shape' - [ NRows, Ncols] ... given by FieldValue 'type' - <element type> (Double or Integer) ... given by FieldValue 'limit' - bounds of the field values.
Implements FieldCommon.
Definition at line 454 of file field.impl.hh.
|
overridevirtual |
Direct read access to the table of Field pointers on regions. Implementation of FieldCommonBase::is_constant()
. See also Field<>::field_result which provide better information about special field values.
Implements FieldCommon.
Definition at line 249 of file field.impl.hh.
|
overridevirtual |
Implementation of FieldCommonBase::observe_output().
Implements FieldCommon.
Definition at line 406 of file field.impl.hh.
Value::return_type Field< spacedim, Value >::operator() | ( | BoundaryPoint & | p | ) |
Return appropriate value to BoundaryPoint in FieldValueCache.
Definition at line 176 of file field.impl.hh.
Value::return_type Field< spacedim, Value >::operator() | ( | BulkPoint & | p | ) |
Return appropriate value to BulkPoint in FieldValueCache.
Definition at line 155 of file field.impl.hh.
Value::return_type Field< spacedim, Value >::operator() | ( | CouplingPoint & | p | ) |
Return appropriate value to CouplingPoint in FieldValueCache.
Definition at line 169 of file field.impl.hh.
Value::return_type Field< spacedim, Value >::operator() | ( | EdgePoint & | p | ) |
Return appropriate value to EdgePoint in FieldValueCache.
Definition at line 162 of file field.impl.hh.
Field< spacedim, Value > & Field< spacedim, Value >::operator= | ( | const Field< spacedim, Value > & | other | ) |
Assignment operator. Same properties as copy constructor, but class member name_ is not copied.
Question: do we really need this, isn't copy constructor enough? Answer: It is necessary in (usual) case when Field instance is created as the class member but is filled later by assignment possibly from other class. TODO: operator can be merged with copy constructor, but we must provide to set correct value of name in method copy_from
Definition at line 119 of file field.impl.hh.
|
protected |
Return item of value_cache_
given by i_cache_point.
Definition at line 184 of file field.impl.hh.
void Field< spacedim, Value >::set | ( | const Input::AbstractRecord & | a_rec, |
double | time, | ||
std::vector< std::string > | region_set_names = {"ALL"} |
||
) |
Same as before but the field is first created using FieldBase::function_factory(), from given abstract record accessor a_rec
.
Definition at line 288 of file field.impl.hh.
void Field< spacedim, Value >::set | ( | FieldBasePtr | field, |
double | time, | ||
std::vector< std::string > | region_set_names = {"ALL"} |
||
) |
Assigns given field
to all regions in region set 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 258 of file field.impl.hh.
|
overridevirtual |
Implementation of FieldCommon::set_dependency().
Implements FieldCommon.
Definition at line 786 of file field.impl.hh.
|
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 621 of file field.impl.hh.
|
overridevirtual |
Set mesh pointer and resize region arrays.
Implements abstract method.
Implements FieldCommon.
Definition at line 219 of file field.impl.hh.
|
overridevirtual |
Check that whole field list is set, possibly use default values for unset regions and call set_time for every field in the field list.
Returns true if the field has been changed.
Implements FieldCommon.
Definition at line 300 of file field.impl.hh.
|
protected |
Read input into regions_history_
possibly pop some old values from the history queue to keep its size less then history_length_limit_
.
Definition at line 468 of file field.impl.hh.
|
inlinevirtual |
Returns one 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.
Definition at line 452 of file field.hh.
|
virtual |
Returns FieldValueCache if element_type of field is double or nullptr for other element_types.
Implements FieldCommon.
Definition at line 799 of file field.impl.hh.
|
virtual |
Returns FieldValueCache if element_type of field is double or nullptr for other element_types.
Implements FieldCommon.
Definition at line 804 of file field.impl.hh.
|
virtual |
Same as previous but return const pointer
Implements FieldCommon.
Definition at line 816 of file field.impl.hh.
|
virtual |
Same as previous but return const pointer
Implements FieldCommon.
Definition at line 821 of file field.impl.hh.
|
overridevirtual |
Implements FieldCommon::value_cache.
Implements FieldCommon.
|
overridevirtual |
Implements FieldCommon::value_cache.
Implements FieldCommon.
Definition at line 793 of file field.impl.hh.
|
inlinevirtual |
Returns std::vector of scalar 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.
Definition at line 466 of file field.hh.
|
friend |
|
protected |
|
protected |
|
protected |
|
protected |
|
mutableprotected |
Field value data cache
Data is ordered like three dimensional table. The highest level is determinated by subsets, those data ranges are holds in subset_starts. Data block size of each subset is determined by number of eval_points (of subset) and maximal number of stored elements. The table is allocated to hold all subsets, but only those marked in used_subsets are updated. Order of subsets is same as in eval_points.