aboutsummaryrefslogtreecommitdiff
path: root/src/box_obstacle.h
blob: 46660a773810fb5ea273fefe2325f933d3344510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma once

#include "data_cell_buffer.h"
#include "boundary_conditions.h"

struct BoxObstacle {
	const std::size_t lower_x_;
	const std::size_t lower_y_;
	const std::size_t upper_x_;
	const std::size_t upper_y_;

	BoxObstacle(std::size_t lX, std::size_t lY, std::size_t uX, std::size_t uY):
		lower_x_(lX), lower_y_(lY), upper_x_(uX), upper_y_(uY) { }

	bool isInside(std::size_t x, std::size_t y) const {
		return x > lower_x_
		    && x < upper_x_
		    && y > lower_y_
		    && y < upper_y_;
	}

	void applyBoundary(DataCellBuffer& pop) const {
		for ( std::size_t x = lower_x_+1; x < upper_x_; ++x ) {
			computeWallCell(pop, {x, lower_y_}, { 0,-1});
			computeWallCell(pop, {x, upper_y_}, { 0, 1});
		}
		for ( std::size_t y = lower_y_+1; y < upper_y_; ++y ) {
			computeWallCell(pop, {lower_x_, y}, {-1, 0});
			computeWallCell(pop, {upper_x_, y}, { 1, 0});
		}
		computeWallCell(pop, {lower_x_, lower_y_}, {-1,-1});
		computeWallCell(pop, {upper_x_, lower_y_}, { 1,-1});
		computeWallCell(pop, {upper_x_, upper_y_}, { 1, 1});
		computeWallCell(pop, {lower_x_, upper_y_}, {-1, 1});
	}
};