Здравствуйте, есть задание. Вкратце формулировка такая:
Дан кусок кода, состоящий из двух функций. Суть кода: первая приведённая функция добавляет частицу в одномерное поле плотности, затем решается уравнение Пуассона, которое определеяет по полученному полю плотности гравитационный потенциал, а затем (вторая приведённая функция) происходит вычисление ускроений частиц.
а) Считая, что все части кода, которые не показаны, работают нормально, укажите, какие проблемы могут возникнуть в работе программы?
б) Исправьте вторую функцию так, чтобы всё работало нормально. Желательно в виде псевдокода.
в) Будут ли работать эти функции с периодическими граничными условиями? Если нет, то что нало изменить?
void add_particle_to_density_field(double rho_field[N], /* the density field discretised on a grid of length N */
int N,
double cellsize, /* size of a single cell of the grid */
double particle_pos, /* the particle position */
double particle_mass) /* the particle mass */
{
double xx = particle_pos / cellsize;
int i = floor(xx); /* floor(x) truncates all decimal digits of the floating point
number x, similar to ((int) x) in C (or: it does a strict rounding to the next
lower integer number; floor(5.9) = 5) */
double u = xx - i;
int ii = i + 1;
if(ii >= N)
ii = 0;
rho_field[i] += (1 - u) * particle_mass / cellsize;
rho_field[ii] += u * particle_mass / cellsize;
}
double interpolate_force_field_to_particle_position(double force_field[N],/* the force
field discretised on a grid of length N */
int N,
double cellsize, /* size of a single cell of the grid */
double particle_pos, /* the particle position */
double particle_mass) /* the particle mass */
{
double xx = particle_pos / cellsize;
int i = floor(xx + 0.5);
double acceleration = force_field[i];
return acceleration * particle_mass;
}
Итак, вот что я надумал:
а-б) В первой части вроде как всё прилично. Определяем номера ячеек, куда массу будем распределять. Распределение идёт вполне нормально - обычная "квадратная частица". Во второй функции, по-моему, проблемы уже. Здесь, как я понимаю, вычисляется значение поля ускорений в точке
(где находится центр частицы), после чего объявляется, что на частицу под номером
действует сила
, где
отвечает номеру ячейки для координаты
. Правильно же, как я понимаю, делать так:
где функция
вычисляет, какой вклад ячейка
даст в ускорение частицы
(может, обозначения слегка неудачные). По сути, абсолютно аналогично тому, как с плотностью.
в) Нет, не подходит. Как я понимаю, для этого по определению в конце должно быть
if (ii >= N);
ii = 0;
rho_field[i] += 1 - u; * particle_mass / cellsize;
rho_field[ii] += u * particle_mass / cellsize;
Вот здесь видно, что если частица попадает так, что центр её расположен во второй половине последней ячейки, то в ячейки
и
попадёт разная масса (
и
соответственно). Что-то немного запутался с тем, как исправить.
Заранее спасибо за помощь.
P.S. Почему скобки норовят замениться на ASCII кодировку? Смотрел-смотрел, так и не понял, в чём проблема.