fix: grid dimensions were stored and accessed incorrectly

This commit is contained in:
Max Lübke 2022-08-24 14:29:58 +02:00
parent 32f3658861
commit 97889cde5e

View File

@ -15,14 +15,13 @@ tug::boundary_condition::BoundaryCondition::BoundaryCondition(int x) {
// this value is actually unused // this value is actually unused
this->maxsize = 1; this->maxsize = 1;
this->sizes[X_DIM] = 1; this->sizes[X_DIM] = x;
this->sizes[Y_DIM] = x; this->sizes[Y_DIM] = 1;
this->maxindex = x - 1; this->maxindex = x - 1;
} }
tug::boundary_condition::BoundaryCondition::BoundaryCondition(int x, tug::boundary_condition::BoundaryCondition::BoundaryCondition(int x, int y) {
int y) {
this->maxsize = (x >= y ? x : y); this->maxsize = (x >= y ? x : y);
this->bc_internal.resize(DIM_2D * maxsize, {0, 0}); this->bc_internal.resize(DIM_2D * maxsize, {0, 0});
this->special_cells.resize(x * y, {BC_UNSET, 0}); this->special_cells.resize(x * y, {BC_UNSET, 0});
@ -45,8 +44,8 @@ void tug::boundary_condition::BoundaryCondition::setSide(
uint32_t size = (side == tug::boundary_condition::BC_SIDE_LEFT || uint32_t size = (side == tug::boundary_condition::BC_SIDE_LEFT ||
side == tug::boundary_condition::BC_SIDE_RIGHT side == tug::boundary_condition::BC_SIDE_RIGHT
? this->sizes[X_DIM] ? this->sizes[Y_DIM]
: this->sizes[Y_DIM]); : this->sizes[X_DIM]);
for (uint32_t i = 0; i < size; i++) { for (uint32_t i = 0; i < size; i++) {
this->bc_internal[side * maxsize + i] = input_bc; this->bc_internal[side * maxsize + i] = input_bc;
@ -65,8 +64,8 @@ void tug::boundary_condition::BoundaryCondition::setSide(
uint32_t size = (side == tug::boundary_condition::BC_SIDE_LEFT || uint32_t size = (side == tug::boundary_condition::BC_SIDE_LEFT ||
side == tug::boundary_condition::BC_SIDE_RIGHT side == tug::boundary_condition::BC_SIDE_RIGHT
? this->sizes[X_DIM] ? this->sizes[Y_DIM]
: this->sizes[Y_DIM]); : this->sizes[X_DIM]);
if (input_bc.size() > size) { if (input_bc.size() > size) {
throw_out_of_range("Input vector is greater than maximum excpected value"); throw_out_of_range("Input vector is greater than maximum excpected value");
@ -88,8 +87,8 @@ auto tug::boundary_condition::BoundaryCondition::getSide(uint8_t side)
uint32_t size = (side == tug::boundary_condition::BC_SIDE_LEFT || uint32_t size = (side == tug::boundary_condition::BC_SIDE_LEFT ||
side == tug::boundary_condition::BC_SIDE_RIGHT side == tug::boundary_condition::BC_SIDE_RIGHT
? this->sizes[X_DIM] ? this->sizes[Y_DIM]
: this->sizes[Y_DIM]); : this->sizes[X_DIM]);
std::vector<tug::boundary_condition::boundary_condition> out(size); std::vector<tug::boundary_condition::boundary_condition> out(size);
@ -100,12 +99,12 @@ auto tug::boundary_condition::BoundaryCondition::getSide(uint8_t side)
return out; return out;
} }
auto tug::boundary_condition::BoundaryCondition::col_boundary( auto tug::boundary_condition::BoundaryCondition::col_boundary(uint32_t i) const
uint32_t i) const -> tug::boundary_condition::bc_tuple { -> tug::boundary_condition::bc_tuple {
if (this->dim == 1) { if (this->dim == 1) {
throw_invalid_argument("Access of column requires at least 2D grid"); throw_invalid_argument("Access of column requires at least 2D grid");
} }
if (i >= this->sizes[Y_DIM]) { if (i >= this->sizes[X_DIM]) {
throw_out_of_range("Index out of range"); throw_out_of_range("Index out of range");
} }
@ -113,9 +112,9 @@ auto tug::boundary_condition::BoundaryCondition::col_boundary(
this->bc_internal[BC_SIDE_BOTTOM * this->maxsize + i]}; this->bc_internal[BC_SIDE_BOTTOM * this->maxsize + i]};
} }
auto tug::boundary_condition::BoundaryCondition::row_boundary( auto tug::boundary_condition::BoundaryCondition::row_boundary(uint32_t i) const
uint32_t i) const -> tug::boundary_condition::bc_tuple { -> tug::boundary_condition::bc_tuple {
if (i >= this->sizes[X_DIM]) { if (i >= this->sizes[Y_DIM]) {
throw_out_of_range("Index out of range"); throw_out_of_range("Index out of range");
} }
@ -123,22 +122,22 @@ auto tug::boundary_condition::BoundaryCondition::row_boundary(
this->bc_internal[BC_SIDE_RIGHT * this->maxsize + i]}; this->bc_internal[BC_SIDE_RIGHT * this->maxsize + i]};
} }
auto tug::boundary_condition::BoundaryCondition::getInnerRow( auto tug::boundary_condition::BoundaryCondition::getInnerRow(uint32_t i) const
uint32_t i) const -> bc_vec { -> bc_vec {
if (i >= this->sizes[X_DIM]) { if (i >= this->sizes[Y_DIM]) {
throw_out_of_range("Index is out of range"); throw_out_of_range("Index is out of range");
} }
auto start = this->special_cells.begin() + (i * this->sizes[Y_DIM]); auto start = this->special_cells.begin() + (i * this->sizes[X_DIM]);
auto end = this->special_cells.begin() + ((i + 1) * this->sizes[Y_DIM]); auto end = this->special_cells.begin() + ((i + 1) * this->sizes[X_DIM]);
bc_vec row(start, end); bc_vec row(start, end);
return row; return row;
} }
auto tug::boundary_condition::BoundaryCondition::getInnerCol( auto tug::boundary_condition::BoundaryCondition::getInnerCol(uint32_t i) const
uint32_t i) const -> bc_vec { -> bc_vec {
if (this->dim != 2) { if (this->dim != 2) {
throw_invalid_argument("getInnerCol is only applicable for 2D grids"); throw_invalid_argument("getInnerCol is only applicable for 2D grids");
} }
@ -147,9 +146,9 @@ auto tug::boundary_condition::BoundaryCondition::getInnerCol(
} }
bc_vec col; bc_vec col;
col.reserve(this->sizes[X_DIM]); col.reserve(this->sizes[Y_DIM]);
for (int j = 0; j < this->sizes[X_DIM]; i += this->sizes[Y_DIM], j++) { for (int j = 0; j < this->sizes[Y_DIM]; i += this->sizes[X_DIM], j++) {
col[j] = this->special_cells[i]; col[j] = this->special_cells[i];
} }