72 std::vector<T> data{};
73 std::vector<value::status> value_status{};
75 std::optional<std::vector<T>> global_data{};
76 std::optional<std::vector<value::status>> global_value_status{std::nullopt};
77 mutable bool all_set{
false};
79 bool operator==(
const FieldData& other)
const
81 return this->data == other.data &&
82 this->value_status == other.value_status &&
83 this->kw_info == other.kw_info &&
84 this->global_data == other.global_data &&
85 this->global_value_status == other.global_value_status;
91 const std::size_t active_size,
92 const std::size_t global_size)
93 : data (active_size * info.num_value)
94 , value_status(active_size * info.num_value, value::status::uninitialized)
98 if (global_size != 0) {
99 this->global_data.emplace(global_size * this->numValuePerCell());
100 this->global_value_status.emplace(global_size * this->numValuePerCell(), value::status::uninitialized);
103 if (info.scalar_init) {
104 this->default_assign(*info.scalar_init);
108 std::size_t numCells()
const
110 return this->data.size() / this->numValuePerCell();
113 std::size_t dataSize()
const
115 return this->data.size();
118 std::size_t numValuePerCell()
const
120 return this->kw_info.num_value;
131 return this->all_set =
132 std::none_of(this->value_status.begin(), this->value_status.end(),
133 [](
const value::status& status)
135 return (status == value::status::uninitialized)
136 || (status == value::status::empty_default);
140 bool valid_default()
const
142 return std::all_of(this->value_status.begin(), this->value_status.end(),
143 [](
const value::status& status)
145 return status == value::status::valid_default;
149 void compress(
const std::vector<bool>& active_map)
151 Fieldprops::compress(this->data, active_map, this->numValuePerCell());
152 Fieldprops::compress(this->value_status, active_map, this->numValuePerCell());
155 void checkInitialisedCopy(
const FieldData& src,
156 const std::vector<Box::cell_index>& index_list,
157 const std::string& from,
158 const std::string& to,
160 const bool global =
false);
162 void default_assign(T value)
164 std::fill(this->data.begin(), this->data.end(), value);
165 std::fill(this->value_status.begin(),
166 this->value_status.end(),
167 value::status::valid_default);
169 if (this->global_data) {
170 std::fill(this->global_data->begin(),
171 this->global_data->end(), value);
173 std::fill(this->global_value_status->begin(),
174 this->global_value_status->end(),
175 value::status::valid_default);
179 void default_assign(
const std::vector<T>& src)
181 if (src.size() != this->dataSize()) {
182 throw std::invalid_argument {
183 "Size mismatch got: " + std::to_string(src.size()) +
184 ", expected: " + std::to_string(this->dataSize())
188 std::copy(src.begin(), src.end(), this->data.begin());
189 std::fill(this->value_status.begin(), this->value_status.end(),
190 value::status::valid_default);
193 void default_update(
const std::vector<T>& src)
195 if (src.size() != this->dataSize()) {
196 throw std::invalid_argument {
197 "Size mismatch got: " + std::to_string(src.size()) +
198 ", expected: " + std::to_string(this->dataSize())
202 for (std::size_t i = 0; i < src.size(); ++i) {
203 if (!value::has_value(this->value_status[i])) {
204 this->value_status[i] = value::status::valid_default;
205 this->data[i] = src[i];
210 void update(
const std::size_t index,
212 const value::status status)
214 this->data[index] = value;
215 this->value_status[index] = status;