Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:CUDA_full / P02_HeatEquation / CUDA_HeatEquation_Completed / heat_equation
.cpp#include "heat_equation.h"
// Функция правой части, для простоты не зависит от времени.
float f(float x, float y)
{
return 0.05f * x * x + 0.001f * y * y * y;
}
/* Функция выполняет один шаг интегрирования уравнения
du/dt = d2u/dx^2 + d2u/dy^2 + f(x, t)
по времени с использованием явной разностной схемы.
nx, ny - число узлов пространственной сетки по x, y,
dx, dy - шаги пространственной сетки по x, y,
a, c - минимальные границы области по x, y,
v - текущее приближение,
newV - следующее приближение, результат работы функции.
Матрицы хранятся в одномерных массивах по строкам.
*/
// newV(i, j) = f(x, y) + v(i, j) +
// dt * ((v(i + 1, j) - 2 * v(i, j) + v(i - 1, j)) / dx^2 +
// (V(i, j + 1) - 2 * v(i, j) + v(i, j - 1)) / dy^2),
// для i = 1, 2, ..., nx - 1, j = 1, 2, ..., ny - 1,
void step(int nx, int ny, float dx, float dy, float dt, float a, float c,
const float * v, float * newV)
{
for (int i = 1; i < nx - 1; ++i)
for (int j = 1; j < ny - 1; ++j)
{
float x = a + i * dx;
float y = c + j * dy;
newV[i * ny + j] = v[i * ny + j] + dt * (f(x, y) +
(v[(i + 1) * ny + j] - 2.0f * v[i * ny + j] + v[(i - 1) * ny + j]) / (dx * dx) +
(v[i * ny + (j + 1)] - 2.0f * v[i * ny + j] + v[i * ny + (j - 1)]) / (dy * dy));
}
}