Flow123d  master-130ae5c
field_common.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file field_common.cc
15  * @brief
16  */
17 
18 #include <iomanip> // for operator<<, setw, setfill, left
19 #include "fields/field_common.hh"
20 #include "input/accessors_impl.hh" // for Record::val
21 #include "input/attribute_lib.hh" // for Attribute
22 #include "input/storage.hh" // for ExcStorageTypeMismatch
23 #include "tools/time_marks.hh" // for TimeMark, TimeMark::Type, TimeMarks
24 
25 
26 /****************************************************************************
27  * Implementation of FieldCommon
28  */
29 
30 
32 : shared_( std::make_shared<SharedData>() ),
33  set_time_result_(TimeStatus::unknown),
34  is_jump_time_(true),
35  component_index_(std::numeric_limits<unsigned int>::max())
36 {
37  shared_->input_default_="";
38  shared_->n_comp_ = 0;
39  shared_->mesh_ = nullptr;
40  shared_->is_fully_initialized_=false;
41 }
42 
43 
44 
46 : name_(other.name_),
47  shared_(other.shared_),
48  set_time_result_(other.set_time_result_),
49  last_time_(other.last_time_),
50  last_limit_side_(other.last_limit_side_),
51  is_jump_time_(other.is_jump_time_),
52  component_index_(other.component_index_)
53 {
55 }
56 
57 
58 
60  return IT::Record(record_name, field_descriptor_record_description(record_name))
61  .declare_key("region", IT::Array( IT::String(), 1 ), "Labels of the regions where to set fields. ")
62  .declare_key("rid", IT::Integer(0), "ID of the region where to set fields.",
64  "\"Specification of the region by its ID is obsolete, will be removed in release 3.0.\\n"
65  "Use region label declared in the Mesh record or default label 'region_<ID>'.\""} })
66  .declare_key("time", TimeGovernor::get_input_time_type(), IT::Default("0.0"),
67  "Apply field setting in this record after this time.\n"
68  "These times have to form an increasing sequence.")
69  .close();
70 }
71 
72 const std::string FieldCommon::field_descriptor_record_description(const string& record_name) {
73  return "Record to set fields of the equation.\n"
74  "The fields are set only on the domain specified by one of the keys: 'region', 'rid'\n"
75  "and after the time given by the key 'time'. The field setting can be overridden by\n"
76  " any " + record_name + " record that comes later in the boundary data array.";
77 }
78 
79 
80 
82  if (! flags().match(FieldFlag::declare_input)) return;
83 
84  // pass through field descriptors containing key matching field name.
86  double time;
87  for( auto &item : shared_->input_list_) {
88  time = tg.read_time( item.find<Input::Tuple>("time") ); // default time=0
89  TimeGovernor::marks().add( TimeMark(time, mark_type | TimeGovernor::marks().type_input() ));
90  }
91 }
92 
93 
94 
95 bool FieldCommon::print_message_table(ostream& stream, std::string equation_name) {
96  if (FieldCommon::messages_data_.size() == 0) return false;
97 
98  stream << endl << "Used default values of Fields for equation " << equation_name << ":" << endl;
99  stream << std::setfill('-') << setw(100) << "" << endl;
100  stream << std::setfill(' ') << " Field name" << setw(21) << "" << "Default value" << setw(7) << "" << "Apply on regions" << endl;
102  stringstream ss;
103  stream << " " << std::left << setw(30) << it->field_name_ << "" << " "
104  << setw(18) << it->default_value_ << "" << " " << it->region_list_ << endl;
105  }
106  stream << std::setfill('-') << setw(100) << "" << endl << endl;
107 
109  return true;
110 }
111 
112 
113 
115 
116 
117 
Common abstract parent of all Field<...> classes.
Definition: field_common.hh:77
static bool print_message_table(ostream &stream, std::string equation_name)
Definition: field_common.cc:95
std::shared_ptr< SharedData > shared_
static IT::Record field_descriptor_record(const string &record_name)
Definition: field_common.cc:59
static const std::string field_descriptor_record_description(const string &record_name)
Definition: field_common.cc:72
FieldFlag::Flags flags_
Field flags. Default setting is "an equation input field, that can read from user input,...
void mark_input_times(const TimeGovernor &tg)
Definition: field_common.cc:81
FieldFlag::Flags & flags()
double time() const
virtual ~FieldCommon()
static std::vector< MessageData > messages_data_
Vector of data of initialization messages.
static constexpr Mask declare_input
The field can be set from input. The key in input field descriptor is declared. (default on)
Definition: field_flag.hh:35
static constexpr Mask input_copy
Definition: field_flag.hh:44
FlagArray & add(Mask mask)
Definition: flag_array.hh:170
Accessor to the data with type Type::Tuple.
Definition: accessors.hh:411
Class for declaration of inputs sequences.
Definition: type_base.hh:339
static string obsolete()
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:61
Class for declaration of the integral input data.
Definition: type_base.hh:483
Record type proxy class.
Definition: type_record.hh:182
Record & declare_key(const string &key, std::shared_ptr< TypeBase > type, const Default &default_value, const string &description, TypeBase::attribute_map key_attributes=TypeBase::attribute_map())
Declares a new key of the Record.
Definition: type_record.cc:503
Class for declaration of the input data that are in string format.
Definition: type_base.hh:582
Basic time management functionality for unsteady (and steady) solvers (class Equation).
TimeMark::Type equation_fixed_mark_type() const
double read_time(Input::Iterator< Input::Tuple > time_it, double default_time=std::numeric_limits< double >::quiet_NaN()) const
static const Input::Type::Tuple & get_input_time_type(double lower_bound=-std::numeric_limits< double >::max(), double upper_bound=std::numeric_limits< double >::max())
static TimeMarks & marks()
Class used for marking specified times at which some events occur.
Definition: time_marks.hh:45
TimeMark add(const TimeMark &mark)
Definition: time_marks.cc:81