73 std::vector<T> data{};
74 std::vector<value::status> value_status{};
76 std::optional<std::vector<T>> global_data{};
77 std::optional<std::vector<value::status>> global_value_status{std::nullopt};
78 mutable bool all_set{
false};
80 bool operator==(
const FieldData& other)
const
82 return this->data == other.data &&
83 this->value_status == other.value_status &&
84 this->kw_info == other.kw_info &&
85 this->global_data == other.global_data &&
86 this->global_value_status == other.global_value_status;
92 const std::size_t active_size,
93 const std::size_t global_size)
94 : data (active_size * info.num_value)
95 , value_status(active_size * info.num_value, value::status::uninitialized)
99 if (global_size != 0) {
100 this->global_data.emplace(global_size * this->numValuePerCell());
101 this->global_value_status.emplace(global_size * this->numValuePerCell(), value::status::uninitialized);
104 if (info.scalar_init) {
105 this->default_assign(*info.scalar_init);
109 std::size_t numCells()
const
111 return this->data.size() / this->numValuePerCell();
114 std::size_t dataSize()
const
116 return this->data.size();
119 std::size_t numValuePerCell()
const
121 return this->kw_info.num_value;
132 return this->all_set =
133 std::none_of(this->value_status.begin(), this->value_status.end(),
134 [](
const value::status& status)
136 return (status == value::status::uninitialized)
137 || (status == value::status::empty_default);
141 bool valid_default()
const
143 return std::all_of(this->value_status.begin(), this->value_status.end(),
144 [](
const value::status& status)
146 return status == value::status::valid_default;
150 void compress(
const std::vector<bool>& active_map)
152 Fieldprops::compress(this->data, active_map, this->numValuePerCell());
153 Fieldprops::compress(this->value_status, active_map, this->numValuePerCell());
156 void checkInitialisedCopy(
const FieldData& src,
157 const std::vector<Box::cell_index>& index_list,
158 const std::string& from,
159 const std::string& to,
161 const bool global =
false);
163 void default_assign(T value)
165 std::fill(this->data.begin(), this->data.end(), value);
166 std::fill(this->value_status.begin(),
167 this->value_status.end(),
168 value::status::valid_default);
170 if (this->global_data) {
171 std::fill(this->global_data->begin(),
172 this->global_data->end(), value);
174 std::fill(this->global_value_status->begin(),
175 this->global_value_status->end(),
176 value::status::valid_default);
180 void default_assign(
const std::vector<T>& src)
182 if (src.size() != this->dataSize()) {
183 throw std::invalid_argument {
184 "Size mismatch got: " + std::to_string(src.size()) +
185 ", expected: " + std::to_string(this->dataSize())
189 std::copy(src.begin(), src.end(), this->data.begin());
190 std::fill(this->value_status.begin(), this->value_status.end(),
191 value::status::valid_default);
194 void default_assign_global(
const std::vector<T>& src)
197 throw std::invalid_argument {
198 "Cannot call default_assign_global on keyword with local storage"
202 if (src.size() != this->global_data->size()) {
203 throw std::invalid_argument {
204 "Size mismatch got: " + std::to_string(src.size()) +
205 ", expected: " + std::to_string(this->dataSize())
209 std::copy(src.begin(), src.end(), this->global_data->begin());
210 std::fill(this->global_value_status->begin(), this->global_value_status->end(),
211 value::status::valid_default);
214 void update_local_from_global(std::function<std::size_t(std::size_t)> local_to_global)
217 throw std::invalid_argument {
218 "Cannot call update_local_from_gloabl on keyword with local storage"
222 auto current_status = this->value_status.begin();
223 for(
auto current = this->data.begin(); current != this->data.end(); ++current, ++current_status, ++i)
225 const auto& global = local_to_global(i);
226 *current = (*global_data)[global];
227 *current_status = (*global_value_status)[global];
231 void default_update(
const std::vector<T>& src)
233 if (src.size() != this->dataSize()) {
234 throw std::invalid_argument {
235 "Size mismatch got: " + std::to_string(src.size()) +
236 ", expected: " + std::to_string(this->dataSize())
240 for (std::size_t i = 0; i < src.size(); ++i) {
241 if (!value::has_value(this->value_status[i])) {
242 this->value_status[i] = value::status::valid_default;
243 this->data[i] = src[i];
248 void update(
const std::size_t index,
250 const value::status status)
252 this->data[index] = value;
253 this->value_status[index] = status;