2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Определение ускорения частиц
Сообщение17.11.2016, 21:49 
Здравствуйте, есть задание. Вкратце формулировка такая:

Дан кусок кода, состоящий из двух функций. Суть кода: первая приведённая функция добавляет частицу в одномерное поле плотности, затем решается уравнение Пуассона, которое определеяет по полученному полю плотности гравитационный потенциал, а затем (вторая приведённая функция) происходит вычисление ускроений частиц.

а) Считая, что все части кода, которые не показаны, работают нормально, укажите, какие проблемы могут возникнуть в работе программы?
б) Исправьте вторую функцию так, чтобы всё работало нормально. Желательно в виде псевдокода.
в) Будут ли работать эти функции с периодическими граничными условиями? Если нет, то что нало изменить?

код: [ скачать ] [ спрятать ]
Используется синтаксис C
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;
}
 


Итак, вот что я надумал:

а-б) В первой части вроде как всё прилично. Определяем номера ячеек, куда массу будем распределять. Распределение идёт вполне нормально - обычная "квадратная частица". Во второй функции, по-моему, проблемы уже. Здесь, как я понимаю, вычисляется значение поля ускорений в точке $x_i + 0.5$ (где находится центр частицы), после чего объявляется, что на частицу под номером $i$ действует сила $\vec{F}_i = m \vec{w}_p$, где $p$ отвечает номеру ячейки для координаты $x_i + 0.5$. Правильно же, как я понимаю, делать так:

$\vec{F}_i = m \sum_p \vec{w}_p W(x_i - x_p) ,$

где функция $W(x - x_p)$ вычисляет, какой вклад ячейка $p$ даст в ускорение частицы $i$ (может, обозначения слегка неудачные). По сути, абсолютно аналогично тому, как с плотностью.

в) Нет, не подходит. Как я понимаю, для этого по определению в конце должно быть $\rho [N] = \rho [0]$

Используется синтаксис C
if (ii >= N);
ii = 0;
rho_field[i] += 1 - u; * particle_mass / cellsize;
rho_field[ii] += u * particle_mass / cellsize;


Вот здесь видно, что если частица попадает так, что центр её расположен во второй половине последней ячейки, то в ячейки $0$ и $N$ попадёт разная масса ($u$ и $1 - u$ соответственно). Что-то немного запутался с тем, как исправить.

Заранее спасибо за помощь.

P.S. Почему скобки норовят замениться на ASCII кодировку? Смотрел-смотрел, так и не понял, в чём проблема.

 
 
 
 Re: Определение ускорения частиц
Сообщение17.11.2016, 22:20 
Это из-за того что syntax внутри off, баг.

 
 
 
 Re: Определение ускорения частиц
Сообщение17.11.2016, 22:25 
 i  Убрал оффтоп с кода.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group