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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Результаты)
Строка 559: Строка 559:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
</div>
 
==Ссылки==
 
==Ссылки==
 
* [[Виртуальная лаборатория]]
 
* [[Виртуальная лаборатория]]

Версия 23:54, 4 февраля 2016

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

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

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

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

Цель проекта

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

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

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

если [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"

  1 function main_particle_1() {
  2  
  3     var ctx = canvas_particle_1.getContext("2d");
  4 	var w = canvas_particle_1.width;				//длина
  5     var h = canvas_particle_1.height;				//высота
  6 	
  7 	
  8 	var w_1 = w/3;
  9 	var h_1 = h/3;
 10 	
 11 	rx = new Array(0, w_1, 2*w_1, 0, w_1, 2*w_1, 0, w_1, 2*w_1);
 12 	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);
 13 	
 14 																// координаты шара
 15     var v0 = 1;                       							// скорость шара
 16     var r = 7;                                 				// радиус шара
 17     var dt = 5;											
 18 	var alfa = 45 / 180 * Math.PI;
 19 	var steps = 0;
 20 
 21 	function step()
 22 	{                          		
 23 		tick();
 24 		draw();
 25 	}
 26 			
 27 		var vGraph = new TM_graph(                  			// определить график
 28 					"#vGraph",                              	// на html-элементе #vGraph
 29 					250,                                    	// сколько шагов по оси "x" отображается
 30 					-1, 1,0.2);                           		// мин. значение оси Y, макс. значение оси Y, шаг по оси Y
 31 		
 32 			function tick() 
 33 			{	
 34 				for (i = 0; i < rx.length; i++)	
 35 				{	
 36 					vx = v0 * Math.cos(alfa); 
 37 					vy = v0 * Math.sin(alfa); 
 38 					steps+=1;
 39 			
 40 					rx[i] += vx*dt;
 41 					ry[i] += vy*dt;
 42 					
 43 				
 44 					if (rx[i] >= w) 
 45 					 {
 46 						 rx[i] = rx[i] - w; 
 47 					 }
 48 				 
 49 					if (rx[i] <= 0) 
 50 					 {
 51 						 rx[i] = rx[i] + w;
 52 					 }
 53 			
 54 					 if (ry[i] >= h)
 55 					 {
 56 						ry[i] = ry[i] - h;
 57 					 }
 58 					
 59 					if (ry[i] <= 0)
 60 					{
 61 						ry[i] = ry[i] + h;
 62 					}
 63 				}		
 64 				
 65 				var L = (rx[8] * vy - ry[8] * vx)/240.4164;
 66 				
 67 				console.log(L);
 68 			
 69 				if (dt % 0.5 == 0) vGraph.graphIter(steps, L);   		// подать данные на график
 70 			}
 71 			
 72 			
 73 			
 74 		
 75 	function draw() 
 76 	{
 77 		ctx.clearRect(0, 0, w , h );     				 // очистить экран
 78 		for (var i = 0; i < rx.length; i++)
 79 		{
 80 			var xS = rx[i];           
 81 			var yS = ry[i];
 82 			
 83 			
 84 			ctx.beginPath();
 85 			ctx.fillStyle = "#00008B";
 86 			ctx.arc(xS, yS, r , 0, 2 * Math.PI, false);
 87 			ctx.closePath();
 88 			ctx.fill();
 89 			
 90 			ctx.beginPath();                                			// начать рисование
 91 			ctx.fillStyle="#000000";
 92 			ctx.moveTo(w_1, 0);                             		// переместить "карандаш" в точку 
 93 			ctx.lineTo(w_1, h);                           		// нарисовать "карандашом" линию до точки 
 94 			ctx.stroke();
 95 			
 96 			ctx.beginPath();
 97 			ctx.fillStyle="#000000";		
 98 			ctx.moveTo(2*w_1, 0);                             
 99 			ctx.lineTo(2*w_1, h);                            
100 			ctx.stroke();
101 			
102 			ctx.beginPath();  
103 			ctx.fillStyle="#000000";
104 			ctx.moveTo(0, h_1);                             
105 			ctx.lineTo(w, h_1);                            
106 			ctx.stroke();
107 			
108 			ctx.beginPath(); 
109 			ctx.fillStyle="#000000";		
110 			ctx.moveTo(0, 2*h_1);                             
111 			ctx.lineTo(w, 2*h_1);                             
112 			ctx.stroke();
113 			
114 		}
115 	}
116 		
117 		
118 		setInterval(step, 1000/100);               				// функция step будет запускаться 100 раз в секунду (100 раз / 1000 мс)
119 		
120 }

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

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

Файл "TwoBalls.js"

  1 function main_particle_1() {
  2  
  3     var ctx_11 = canvas_particle_11.getContext("2d");
  4 	var ctx_12 = canvas_particle_12.getContext("2d");
  5 	var ctx_13 = canvas_particle_13.getContext("2d");
  6 	var ctx_21 = canvas_particle_21.getContext("2d");
  7 	var ctx_22 = canvas_particle_22.getContext("2d");
  8 	var ctx_23 = canvas_particle_23.getContext("2d");
  9 	var ctx_31 = canvas_particle_31.getContext("2d");
 10 	var ctx_32 = canvas_particle_32.getContext("2d");
 11 	var ctx_33 = canvas_particle_33.getContext("2d");
 12 	
 13    	
 14 	var width = canvas_particle_11.width;
 15     var height = canvas_particle_11.height;
 16    
 17 	var rx_1, ry_1, rx_2, ry_2;            									// координаты шара
 18     var v0 = 4, vx_1, vy_1, vx_2, vy_2;
 19     var r = 7;                                								// радиус шара
 20     var dt_1 = 0; dt_2 = 0;
 21 	var x0_1 = width/2, x0_2 = width/2, y0_1 = 0, y0_2 = height;		
 22 	var steps = 0;
 23 	var val = 1;
 24 	var alfa = 45/180*Math.PI;
 25 	
 26 	function step() 
 27 		{                          		
 28 			tick();
 29 			draw();
 30 		}
 31 		
 32 		var vGraph = new TM_graph(                  			// определить график
 33 					"#vGraph",                              	// на html-элементе #vGraph
 34 					250,                                    	// сколько шагов по оси "x" отображается
 35 					-1,1,0.2);   
 36 			
 37 			function tick() 
 38 			{													// вычисление новой позиции шар	 
 39 				vx_1 = v0 * Math.cos(alfa); 
 40 				vy_1 = v0 * Math.sin(alfa); 
 41 				vx_2 = -v0 * Math.cos(alfa); 
 42 				vy_2 = -v0 * Math.sin(alfa); 
 43 				
 44 				steps+=1;
 45 				if (val==1)
 46 				{
 47 					rx_1 = vx_1*dt_1 + x0_1 + r - 2.7; //
 48 					ry_1 = vy_1*dt_1 + y0_1 + r - 2.7;
 49 					dt_1+= 1;
 50 					rx_2 = vx_2*dt_2 + x0_2 - r + 2.7; //
 51 					ry_2 = vy_2*dt_2 + y0_2 - r + 2.7;
 52 					dt_2+= 1;
 53 					
 54 					
 55 				}
 56 				else
 57 				{
 58 					vy_1 = -vy_1;
 59 					vx_1 = -vx_1;
 60 					rx_1 = vx_1*dt_1 + width - r + 2.7;
 61 					ry_1 = vy_1*dt_1 + x0_1 - r + 2.7;
 62 					dt_1+= 1;
 63 					vy_2 = -vy_2;
 64 					vx_2 = -vx_2;
 65 					rx_2 = vx_2*dt_2 - 2.7 + r; //
 66 					ry_2 = vy_2*dt_2 + x0_2 - 2.7 + r;
 67 					dt_2+= 1;
 68 				}
 69 				
 70 				if (rx_2 < 0 || rx_1 - r> width) 
 71 				{	
 72 					//alert(rx_2);
 73 					val = 0;
 74 					dt_1 = 0;
 75 					dt_2 = 0;
 76 				}
 77 				
 78 				if (ry_1 < 0 || ry_2 - r > height) 
 79 				{   
 80 					val = 1;
 81 					dt_1=0;
 82 					dt_2 = 0;
 83 				}
 84 				
 85 						
 86 				var L = ((rx_1 * vy_1 - ry_1 * vx_1)+(rx_2 * vy_2 - ry_2 * vx_2))/376.2;
 87 				console.log(L);
 88 			
 89 				if (dt_1 % 0.5 == 0) vGraph.graphIter(steps, L);   		// подать данные на график	
 90 				
 91 
 92 
 93 			}	
 94 		
 95 		function draw() // рисование шара
 96 		{ 
 97 		
 98 		ctx_11.fillStyle= "#DC143C" ;        				// цвет закраски
 99         ctx_11.clearRect(0, 0, width, height); 				// очистить экран
100 		ctx_11.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
101 		ctx_11.fill();
102         ctx_11.beginPath();
103 		
104 		ctx_11.fillStyle = "#00008B";
105 		ctx_11.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
106         ctx_11.fill();
107 		ctx_11.beginPath();
108 		
109 		ctx_12.fillStyle = "#DC143C";           				// цвет закраски
110         ctx_12.clearRect(0, 0, width, height); 					// очистить экран
111 		ctx_12.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
112 		ctx_12.fill();
113         ctx_12.beginPath();
114 		
115 		ctx_12.fillStyle = "#00008B";
116 		ctx_12.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
117         ctx_12.fill();
118 		ctx_12.beginPath();
119 		
120 		ctx_13.fillStyle = "#DC143C";           				// цвет закраски
121         ctx_13.clearRect(0, 0, width, height); 					// очистить экран
122 		ctx_13.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
123 		ctx_13.fill();
124         ctx_13.beginPath();
125 		
126 		ctx_13.fillStyle = "#00008B";
127 		ctx_13.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
128         ctx_13.fill();
129 		ctx_13.beginPath();
130 		
131 		ctx_21.fillStyle = "#DC143C";           				// цвет закраски
132         ctx_21.clearRect(0, 0, width, height); 					// очистить экран
133 		ctx_21.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
134 		ctx_21.fill();
135         ctx_21.beginPath();
136 		
137 		ctx_21.fillStyle = "#00008B";
138 		ctx_21.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
139         ctx_21.fill();
140 		ctx_21.beginPath();
141 		
142 		ctx_22.fillStyle = "#DC143C";           				// цвет закраски
143         ctx_22.clearRect(0, 0, width, height); 					// очистить экран
144 		ctx_22.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
145 		ctx_22.fill();
146         ctx_22.beginPath();
147 		
148 		ctx_22.fillStyle = "#00008B";
149 		ctx_22.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
150         ctx_22.fill();
151 		ctx_22.beginPath();
152 		
153 		ctx_23.fillStyle = "#DC143C";           				// цвет закраски
154         ctx_23.clearRect(0, 0, width, height); 					// очистить экран
155 		ctx_23.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
156 		ctx_23.fill();
157         ctx_23.beginPath();
158 		
159 		ctx_23.fillStyle = "#00008B";
160 		ctx_23.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
161         ctx_23.fill();
162 		ctx_23.beginPath();
163 		
164 		ctx_31.fillStyle = "#DC143C";           				// цвет закраски
165         ctx_31.clearRect(0, 0, width, height); 					// очистить экран
166 		ctx_31.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
167 		ctx_31.fill();
168         ctx_31.beginPath();
169 		
170 		ctx_31.fillStyle = "#00008B";
171 		ctx_31.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
172         ctx_31.fill();
173 		ctx_31.beginPath();
174 		
175 		ctx_32.fillStyle = "#DC143C";           				// цвет закраски
176         ctx_32.clearRect(0, 0, width, height); 					// очистить экран
177 		ctx_32.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
178 		ctx_32.fill();
179         ctx_32.beginPath();
180 		
181 		ctx_32.fillStyle = "#00008B";
182 		ctx_32.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
183         ctx_32.fill();
184 		ctx_32.beginPath();
185 		
186 		ctx_33.fillStyle = "#DC143C";           				// цвет закраски
187         ctx_33.clearRect(0, 0, width, height); 					// очистить экран
188 		ctx_33.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
189 		ctx_33.fill();
190         ctx_33.beginPath();
191 		
192 		ctx_33.fillStyle = "#00008B";
193 		ctx_33.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
194         ctx_33.fill();
195 		ctx_33.beginPath();
196 		}
197 		
198 		setInterval(step, 1000/30);               				// функция step будет запускаться 30 раз в секунду (30 раз / 1000 мс)
199 		
200 }

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

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

Файл "NBalls.js"

  1 function main_particle_1(canvas_particle_1)//,canvas_particle_2,canvas_particle_3,canvas_particle_4,canvas_particle_5,canvas_particle_6,canvas_particle_7,canvas_particle_8,canvas_particle_9) {
  2  {
  3 	
  4     var ctx = canvas_particle_1.getContext("2d");
  5 	var W = canvas_particle_1.width;				
  6     var H = canvas_particle_1.height;		
  7 	
  8 	var dx = 10;
  9 	var w = W/3 - dx;
 10 	var h = H/3 - dx;
 11 	var r = 7;
 12 	var N = 15;//количество частиц
 13 
 14 	var a0 = w*0.1; //равновесное расстояние
 15 	var D = 100;//удельная энергия коэффициент в формуле силы
 16 	rx = new Array();//Содержит координаты частиц по оси Х
 17 	ry = new Array();//Содержит координаты частиц по оси У
 18 	vx = new Array();//Скорость по Х
 19 	vy = new Array();//Скорость по У
 20 	L = new Array();
 21 	num_canv = new Array();
 22 	var mod_f = 0;//модуль силы
 23 	var f = 0;
 24 	var rass = 0;//расстояние между частицами
 25 	var fx_i= 0;//сила по х
 26 	var fy_i = 0;//сида по у
 27 	var dt = 0.0025;//шаг интегрирования
 28 	v = new Array(0,0,0);
 29 	//==========Заготовки для создания начальных конфигураций======
 30 	for (j = 0;j<N;j++)//начальные скорости
 31 	{
 32 			vx[j] = Math.random()*10;//Math.random();
 33 			vy[j] = Math.random()*10;//Math.random() ;		
 34 	}
 35 	var kol = 0;
 36 	var prx = 0;
 37 	var pry = 0;
 38 	var dist = 0;
 39 	var f;
 40 	rx[0] = Math.random() * w; //w*(0.5+(j-2)*0.15);
 41 	ry[0] = Math.random() * h;//h/2;
 42 	kol = 1;
 43 	while (kol<N)
 44 	{
 45 		f =0;
 46 		prx = Math.random() * w; //w*(0.5+(j-2)*0.15);
 47 		pry = Math.random() * h;//h/2;
 48 		for (i = 0; i < kol;i++)
 49 		{
 50 			dist = Math.pow((rx[i]-prx),2)+Math.pow((ry[i]-pry),2);
 51 			if (dist<Math.pow(2*a0,2))
 52 			{
 53 				f = f+1;
 54 			}
 55 		}
 56 		if (f==0)
 57 		{
 58 			rx[kol] = prx; //w*(0.5+(j-2)*0.15);
 59 			ry[kol] = pry;//h/2;
 60 			kol++;
 61 		}
 62 	}
 63 	
 64 	//================================================
 65 	
 66 	var steps = 0;
 67 
 68 	function step()
 69 	{
 70 		tick();
 71 		draw();
 72 	}
 73 	var vGraph = new TM_graph(                  			// определить график
 74 					"#vGraph",                              	// на html-элементе #vGraph
 75 					500,                                    	// сколько шагов по оси "x" отображается
 76 					-1,1,0.5);   
 77 
 78 	function tick()
 79 	{
 80 		
 81 		steps += 1;
 82 		for (i = 0; i < N; i++) //расчет сил и скоростей
 83 			for (j = 0; j < N; j++)
 84 				{
 85 					if (i!=j)
 86 				{
 87 					rass = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
 88 	
 89 					var r2 = r*r;
 90 					var b = Math.pow(13/7,1/6)*r;
 91 					var b2 = b * b;
 92 					var rass2 = rass * rass;
 93 					var acut = 2 * r;//14
 94 					var acut2 = acut*acut;
 95 					if (rass >= 0 && rass <= b) {k = 1;}//0;7.76
 96 					if (rass >= acut) {k = 0;}
 97 					if (rass >= b && rass <= acut)
 98 					{
 99 						k = Math.pow((1- Math.pow((rass2 - b2)/(acut2-b2),2)),2);
100 					}
101 
102 					mod_f = 5000/r2*k*((Math.pow(r/rass),8)-Math.pow((r/rass),14));
103 					if (mod_f < 0){mod_f = 4;}
104 				
105 					fx_i = mod_f*(rx[i]-rx[j]);
106 					fy_i = mod_f*(ry[i]-ry[j]);
107 					vx[i]+=fx_i*dt;
108 					vx[j]-=fx_i*dt;
109 					vy[i]+=fy_i*dt;
110 					vy[j]-=fy_i*dt;
111 				}
112 				}
113 		
114 		for (i = 0; i < N; i++)	//пересчет положений
115 		{	
116 			rx[i] += vx[i]*dt;
117 			ry[i] += vy[i]*dt;
118 			if (rx[i] >= w) {rx[i] = rx[i] - w;}
119 			if (rx[i] <= 0)	{rx[i] = rx[i] + w;}
120 			if (ry[i] >= h) {ry[i] = ry[i] - h;}
121 			if (ry[i] <= 0) {ry[i] = ry[i] + h;}
122 			
123 			
124 			var sumL = 0;
125 			L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/1100;
126 			sumL += L[i];
127 			if (steps % 100 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
128 			//console.log(sumL);
129 		}		
130 }
131 				
132 	
133 	function draw() 
134 	{   
135 
136 		
137 		ctx.clearRect(0, 0, W , H );     				 // очистить экран
138 		 ctx.beginPath();
139 		 for (var i1 = 1; i1<3;i1++)
140 			for (var i2 = 1;i2<3;i2++)
141                {
142 			   var px = i1 *(h+dx);
143 			   var py = i2 *(w+dx);
144 			   ctx.moveTo(px, 0);
145                 ctx.lineTo(px, H);
146 				ctx.moveTo(0, py);
147                 ctx.lineTo(W,py);
148                 ctx.strokeStyle = "#000000"; // цвет линии
149                 ctx.stroke();
150 			}	
151 		for (var i = 0; i < rx.length; i++)
152 			for (var ii = 0; ii<3;ii++)
153 				for (var jj = 0; jj<3; jj++)
154 					for (var i = 0; i < N; i++)
155 					{
156 						var xS_Real0 = rx[i] + ii*(h + dx);           
157 						var yS_Real0 = ry[i]+ jj*(w + dx);
158 						ctx.beginPath();
159 						ctx.fillStyle = "#00008B";
160 						ctx.arc(xS_Real0, yS_Real0, r , 0, 2 * Math.PI, false);
161 						ctx.closePath();
162 						ctx.fill();
163 					}
164 		
165 	}
166 	
167  
168 	setInterval(step, 1000/20);               				// функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
169 		
170 }

Ссылки