Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
27.03.2015
Размер:
1.38 Кб
Скачать
#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));
        }
}
Соседние файлы в папке CUDA_HeatEquation_Completed