Периодические граничные условия

Материал из Department of Theoretical and Applied Mechanics
Версия от 22:25, 4 февраля 2016; 94.19.209.166 (обсуждение) (Результаты)

Перейти к: навигация, поиск
Виртуальная лаборатория>Периодические граничные условия

Курсовой проект по механике дискретных сред

Краткое описание

Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.
В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:
  • однородности времени соответствует закон сохранения энергии,
  • однородности пространства соответствует закон сохранения импульса,
  • изотропии пространства соответствует закон сохранения момента импульса,
  • калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.
Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.

Цель проекта

  • Визуализация системы частиц с периодическими граничными условиями.
  • Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.

Математическая модель

Граничные условия:

если [math]x \gt w[/math], то [math]x = x - w[/math]

если [math] x \lt 0 [/math], то [math] x = x + w [/math]

если [math] y \gt h [/math], то [math] y = y - h [/math]

если [math] y \lt 0 [/math], то [math] y = y + h [/math]

Где x и у - это координаты частицы, а w и h - ширина и длина окна соответственно.

Кинетический момент вычисляется по формуле: [math]L(t) = \sum_{i\in\wedge(t)} r_i\times mV_i [/math]

Результаты


Скачать архив

Текст программы на языке JavaScript (разработчик Теницкая Татьяна):

Файл "OneBall.js" <syntaxhighlight lang="javascript" line start="1" enclose="div"> function main_particle_1() {

   var ctx = canvas_particle_1.getContext("2d");

var w = canvas_particle_1.width; //длина

   var h = canvas_particle_1.height;				//высота


var w_1 = w/3; var h_1 = h/3;

rx = new Array(0, w_1, 2*w_1, 0, w_1, 2*w_1, 0, w_1, 2*w_1); ry = new Array(60, 60, 60, 60 + h_1, 60 + h_1, 60 + h_1, 60 + 2*h_1, 60 + 2*h_1, 60 + 2*h_1);

// координаты шара

   var v0 = 1;                       							// скорость шара
   var r = 7;                                 				// радиус шара
   var dt = 5;											

var alfa = 45 / 180 * Math.PI; var steps = 0;

function step() { tick(); draw(); }

var vGraph = new TM_graph( // определить график "#vGraph", // на html-элементе #vGraph 250, // сколько шагов по оси "x" отображается -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y

function tick() { for (i = 0; i < rx.length; i++) { vx = v0 * Math.cos(alfa); vy = v0 * Math.sin(alfa); steps+=1;

rx[i] += vx*dt; ry[i] += vy*dt;


if (rx[i] >= w) { rx[i] = rx[i] - w; }

if (rx[i] <= 0) { rx[i] = rx[i] + w; }

if (ry[i] >= h) { ry[i] = ry[i] - h; }

if (ry[i] <= 0) { ry[i] = ry[i] + h; } }

var L = (rx[8] * vy - ry[8] * vx)/240.4164;

console.log(L);

if (dt % 0.5 == 0) vGraph.graphIter(steps, L); // подать данные на график }



function draw() { ctx.clearRect(0, 0, w , h ); // очистить экран for (var i = 0; i < rx.length; i++) { var xS = rx[i]; var yS = ry[i];


ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xS, yS, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();

ctx.beginPath(); // начать рисование ctx.fillStyle="#000000"; ctx.moveTo(w_1, 0); // переместить "карандаш" в точку ctx.lineTo(w_1, h); // нарисовать "карандашом" линию до точки ctx.stroke();

ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(2*w_1, 0); ctx.lineTo(2*w_1, h); ctx.stroke();

ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(0, h_1); ctx.lineTo(w, h_1); ctx.stroke();

ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(0, 2*h_1); ctx.lineTo(w, 2*h_1); ctx.stroke();

} }


setInterval(step, 1000/100); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)

}

Скачать архив

Скачать архив