Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом — различия между версиями
(→Программа) |
(→Ссылки по теме) |
||
Строка 430: | Строка 430: | ||
==Ссылки по теме== | ==Ссылки по теме== | ||
− | + | 1) Danis J. Evans, Garry Morriss "Statitical mechanics of nonequilibrium liquids", 2008, pages 146-150. | |
− | + | 2) A. M. KRAYNIK and D. A. REINELT "EXTENSIONAL MOTIONS OF SPATIALLY PERIODIC LATTICES ",1992. | |
− | + | 3) B. D. Todd, Peter J. Daivis "Nonequilibrium Molecular Dynamics Simulations of Planar Elongational Flow with Spatially | |
and Temporally Periodic Boundary Conditions", 1992. | and Temporally Periodic Boundary Conditions", 1992. | ||
− | + | 4) B.D.Todd, Peter J. Daivis "New algorithm for unrestricted duration nonequilibrium molecular dynamics | |
simulations of planar elongational flow", 2003. | simulations of planar elongational flow", 2003. |
Версия 11:11, 12 января 2017
Курсовые работы 2016-2017 учебного года > Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частицКурсовой проект по Механике дискретных сред
Исполнитель: Мущак Никита
Группа: 09 (43604/1)
Семестр: осень 2016
Описание задачи
Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongational flow) было произведено методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются, относительно вертикального положения (Рис.1).
Ниже привеведен код граничных периодических условий Крайника-Реинельта:
Где
и - это координаты частицы, и - ширина и высота ячейки периодичности. и - смещение по x b y при переходе через границы ячейки периодичности.Программа
Файл "NNNN.js"
1 function main_particle_1(canvas_particle_1,slider_01) {
2 // Предварительные установки
3 var w_1 = canvas_particle_1.width; // Ширина рабочего поля
4 var h_1 = canvas_particle_1.height; // Высота рабочего поля
5
6 var w = w_1/3; // Ширина ячеки периодичности
7 var h = h_1/3;
8
9 var ctx = canvas_particle_1.getContext("2d");
10
11 this.newSystem = function() {
12 var w_1 = canvas_particle_1.width; // Ширина рабочего поля
13 var h_1 = canvas_particle_1.height; // Высота рабочего поля
14
15 var w = w_1 / 3; // Ширина ячеки периодичности
16 var h = h_1 / 3; // Высота ячейки периодичности
17 };
18 var sh = -10 * 15;
19 // Наклоненность боковых границ ячеек ее можно менять
20 this.set_01 = function(o) {sh = 10 * o;};
21
22 // настройка слайдеров и текстовых полей
23 slider_01.min = -15; slider_01.max = 15;
24 slider_01.step = 1;
25 slider_01.value = sh/10; // начальное значение ползунка должно задаваться после min и max
26 text_01.value = sh/10;
27
28 var s = 0; // предустановка
29 var s1 = 2/3 * sh; // Начальный сдвиг при переходе через гориз. границу
30 var se = -(2 * sh / h_1) * (h - 0.5 * h_1); // Начальный сдвиг при переходе через верт. границу
31 var r = 10; // Радиус частиц
32 var N = 10; // Число частиц можно менять
33 rx = new Array(); // Содержит координаты частиц по оси Х
34 ry = new Array(); // Содержит координаты частиц по оси У
35 rxI0 = new Array(); // Координаты для ячеек перидичностей - клонов
36 rxI1 = new Array();
37 rxI2 = new Array();
38 rxI3 = new Array();
39 rxI4 = new Array();
40 rxI5 = new Array();
41 rxI6 = new Array();
42 rxI7 = new Array();
43 ryI0 = new Array();
44 ryI1= new Array();
45 ryI2= new Array();
46 ryI3= new Array();
47 ryI4= new Array();
48 ryI5= new Array();
49 ryI6= new Array();
50 ryI7= new Array();
51 vx = new Array(); //Скорость по Х
52 vy = new Array(); //Скорость по У
53 vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array();
54 var distR0,distR2,distR3,distR;
55
56 L = new Array(); // Кинетический момент
57 var D = 5; // Энергия связи
58 var a0 = w * 0.1;
59 var c = 72 * D/r; // Жесткость связи частиц
60 var W = Math.sqrt(c);
61 var T = 2 * Math.PI/W;
62 dt = 0.03;
63 //0.04380741654852822
64
65
66
67
68 for (i = 0; i < N/2; ++i)
69 {
70 vx_p[i] = Math.random()*15;
71 vy_p[i] = Math.random()*15;
72 vx_m[i] = Math.random()*15;
73 vy_m[i] = Math.random()*15;
74 vx = vx_p.concat(vx_m);
75 vy = vy_p.concat(vy_m);
76 }
77
78 var kol = 1;
79 var prx = 0;
80 var pry = 0;
81 var dist= 0;
82 var f;
83 rx[0] = Math.random() * (w - 10) ;//-s;
84 ry[0] = Math.random() * (h - 10);
85 while (kol < N)
86 {
87 f = 0;
88 prx = Math.random() * (w - 10);//-s;
89 pry = Math.random() * (h - 10);
90 for (i = 0; i < kol; i++)
91 {
92 dist = Math.pow((rx[i] - prx),2) + Math.pow((ry[i] - pry),2);
93 if (dist < Math.pow(2 * a0,2))
94 {
95 f = f+1;
96 }
97 }
98 if (f==0)
99 {
100 rx[kol] = prx;
101 ry[kol] = pry;
102 kol++;
103 }
104 }
105
106 var steps = 0;
107
108
109 function step()
110 {
111 tick();
112 draw();
113 }
114 var vGraph = new TM_graph( // определить график
115 "#vGraph", // на html-элементе #vGraph
116 1000, // сколько шагов по оси "x" отображается
117 -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
118
119 function tick()
120 {
121 for (i = 0; i < N ; i++)
122 {
123
124 steps += 1;
125
126 rx[i] += vx[i]*dt;
127 ry[i] += vy[i]*dt;
128
129 s = -(2 * sh / h_1) * (ry[i] - 0.5 * h_1);
130
131 if (rx[i] >= w - s) {rx[i] = rx[i] - w ;}
132 if (rx[i] <= 0 - s) {rx[i] = rx[i] + w;}
133
134 if (ry[i] >= h) {ry[i] = ry[i] - h ;
135 rx[i]=rx[i]- 2 * se; }
136 if (ry[i] <= 0) {ry[i] = ry[i] + h;
137 rx[i]=rx[i]+2*se; }
138
139 rxI0[i] = rx[i] + w;
140 ryI0[i] = ry[i];
141
142 rxI3[i] = rx[i] + w +s1;
143 ryI3[i] = ry[i] + h;
144
145 rxI6[i] = rx[i] + w +s1 +s1;
146 ryI6[i] = ry[i] + 2*h;
147
148 rxI1[i] = rx[i] + 2*w ;
149 ryI1[i] = ry[i];
150
151 rxI4[i] = rx[i] + 2*w +s1;
152 ryI4[i] = ry[i] + h;
153
154 rxI7[i] = rx[i] + 2*w +s1 +s1 ;
155 ryI7[i] = ry[i] + 2*h;
156
157 rxI2[i] = rx[i] +s1;
158 ryI2[i] = ry[i] + h;
159
160 rxI5[i] = rx[i] +s1 +s1 ;
161 ryI5[i] = ry[i] + 2*h;
162
163
164
165 //раcсчет расстояний
166
167 for (j = 0; j < N ; j++)
168 {
169 if (i != j)
170 {
171 distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2));
172 distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2));
173 distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2));
174 distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
175
176 //раcсчет сил
177 a = 4 * r;
178 if (distR0 < 2*r)
179 {
180 var mod_fR0,fxR0,fyR0;
181
182 mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a;
183 //console.log(mod_fR0);
184 if (mod_fR0 >=0)
185 {
186 fxR0 = mod_fR0*(rx[i]-rxI0[j]);
187 fyR0 = mod_fR0*(ry[i]-ryI0[j]);
188 vx[i]+=fxR0*dt;
189 vx[j]-=fxR0*dt;
190 vy[i]+=fyR0*dt;
191 vy[j]-=fyR0*dt;
192 }
193 }
194 if (distR2 < 2*r)
195 {
196 var mod_fR2,fxR2,fyR2;
197
198 mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a;
199
200 if (mod_fR2 >=0)
201 {
202 fxR2 = mod_fR2*(rx[i]-rxI2[j]);
203 fyR2 = mod_fR2*(ry[i]-ryI2[j]);
204 vx[i]+=fxR2*dt;
205 vx[j]-=fxR2*dt;
206 vy[i]+=fyR2*dt;
207 vy[j]-=fyR2*dt;
208 }
209 }
210 if (distR3 < 2*r)
211 {
212 var mod_fR3,fxR3,fyR3;
213
214 mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a;
215
216 if (mod_fR3 >=0)
217 {
218 fxR3 = mod_fR3*(rx[i]-rxI3[j]);
219 fyR3 = mod_fR3*(ry[i]-ryI3[j]);
220 vx[i]+=fxR3*dt;
221 vx[j]-=fxR3*dt;
222 vy[i]+=fyR3*dt;
223 vy[j]-=fyR3*dt;
224 }
225 }
226
227 if (distR < 2*r)
228 {
229 var mod_fR,fxR,fyR;
230 mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a;
231 if (mod_fR >=0)
232 {
233 fxR = mod_fR*(rx[i]-rx[j]);
234 fyR = mod_fR*(ry[i]-ry[j]);
235 vx[i]+=fxR*dt;
236 vx[j]-=fxR*dt;
237 vy[i]+=fyR*dt;
238 vy[j]-=fyR*dt;
239 }
240 }
241
242 Array.prototype.sum = function()
243 {
244 for (var i=0, sum=0; i < this.length; sum += this[i++]);
245 return sum;
246 }
247
248
249 // L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/6000;
250 var sumL = L.sum();
251 //график
252 // if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
253 //console.log(sumL);
254
255 }
256
257 }
258 }
259 }
260
261
262 function draw()
263 {
264 ctx.clearRect(0, 0, w_1+100 , h_1+100); // очистить экран
265 for (var i = 0; i < N; i++)
266
267 {
268 var x = rx[i];
269 var y = ry[i];
270 ctx.beginPath();
271 ctx.fillStyle = "#00008B";
272 ctx.arc(x, y, r , 0, 2 * Math.PI, false);
273 ctx.closePath();
274 ctx.fill();
275
276 var xI0 = rxI0[i];
277 var yI0 = ryI0[i];
278 ctx.beginPath();
279 ctx.fillStyle = "#00008B";
280 ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
281 ctx.closePath();
282 ctx.fill();
283
284 var xI1 = rxI1[i];
285 var yI1 = ryI1[i];
286 ctx.beginPath();
287 ctx.fillStyle = "#00008B";
288 ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
289 ctx.closePath();
290 ctx.fill();
291
292 var xI2 = rxI2[i];
293 var yI2 = ryI2[i];
294 ctx.beginPath();
295 ctx.fillStyle = "#00008B";
296 ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
297 ctx.closePath();
298 ctx.fill();
299
300 var xI3 = rxI3[i];
301 var yI3 = ryI3[i];
302 ctx.beginPath();
303 ctx.fillStyle = "#00008B";
304 ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
305 ctx.closePath();
306 ctx.fill();
307
308 var xI4 = rxI4[i];
309 var yI4 = ryI4[i];
310 ctx.beginPath();
311 ctx.fillStyle = "#00008B";
312 ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
313 ctx.closePath();
314 ctx.fill();
315
316 var xI5 = rxI5[i];
317 var yI5 = ryI5[i];
318 ctx.beginPath();
319 ctx.fillStyle = "#00008B";
320 ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
321 ctx.closePath();
322 ctx.fill();
323
324 var xI6 = rxI6[i];
325 var yI6 = ryI6[i];
326 ctx.beginPath();
327 ctx.fillStyle = "#00008B";
328 ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
329 ctx.closePath();
330 ctx.fill();
331
332 var xI7 = rxI7[i];
333 var yI7 = ryI7[i];
334 ctx.beginPath();
335 ctx.fillStyle = "#00008B";
336 ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
337 ctx.closePath();
338 ctx.fill();
339
340 }
341 ctx.beginPath(); // начать рисование
342 ctx.fillStyle="#000000";
343 ctx.moveTo(w-sh, 0); // переместить "карандаш" в точку
344 ctx.lineTo(w+sh, h_1); // нарисовать "карандашом" линию до точки
345 ctx.stroke();
346
347 ctx.beginPath();
348 ctx.fillStyle="#000000";
349 ctx.moveTo(2 * w-sh, 0);
350 ctx.lineTo(2 * w+sh, h_1);
351 ctx.stroke();
352
353 ctx.beginPath();
354 ctx.fillStyle="#000000";
355 ctx.moveTo( 0- sh, 0);
356 ctx.lineTo( sh, h_1);
357 ctx.stroke();
358
359 ctx.beginPath();
360 ctx.fillStyle="#000000";
361 ctx.moveTo(w_1 - sh, 0);
362 ctx.lineTo(w_1 + sh, h_1);
363 ctx.stroke();
364
365 ctx.beginPath();
366 ctx.fillStyle="#000000";
367 ctx.moveTo(0, h);
368 ctx.lineTo(w_1, h);
369 ctx.stroke();
370
371 ctx.beginPath();
372 ctx.fillStyle="#000000";
373 ctx.moveTo(0, 2 * h);
374 ctx.lineTo(w_1, 2 * h);
375 ctx.stroke();
376 }
377 // Запуск системы
378 this.newSystem();
379 setInterval(step, 1000/120); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
380
381 }
Ссылки по теме
1) Danis J. Evans, Garry Morriss "Statitical mechanics of nonequilibrium liquids", 2008, pages 146-150. 2) A. M. KRAYNIK and D. A. REINELT "EXTENSIONAL MOTIONS OF SPATIALLY PERIODIC LATTICES ",1992. 3) B. D. Todd, Peter J. Daivis "Nonequilibrium Molecular Dynamics Simulations of Planar Elongational Flow with Spatially and Temporally Periodic Boundary Conditions", 1992. 4) B.D.Todd, Peter J. Daivis "New algorithm for unrestricted duration nonequilibrium molecular dynamics
simulations of planar elongational flow", 2003.