Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Программа)
(Ссылки по теме)
Строка 430: Строка 430:
 
==Ссылки по теме==
 
==Ссылки по теме==
  
* Danis J. Evans, Garry Morriss "Statitical mechanics of nonequilibrium liquids", 2008, pages 146-150.
+
1) Danis J. Evans, Garry Morriss "Statitical mechanics of nonequilibrium liquids", 2008, pages 146-150.
* A. M. KRAYNIK  and D. A. REINELT "EXTENSIONAL MOTIONS OF SPATIALLY PERIODIC LATTICES ",1992.
+
2) A. M. KRAYNIK  and D. A. REINELT "EXTENSIONAL MOTIONS OF SPATIALLY PERIODIC LATTICES ",1992.
* B. D. Todd, Peter J. Daivis "Nonequilibrium Molecular Dynamics Simulations of Planar Elongational Flow with Spatially
+
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.
* B.D.Todd, Peter J. Daivis "New algorithm for unrestricted duration nonequilibrium molecular dynamics
+
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

Описание задачи

Рис.1 Периодическая система ячеек.

Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongational flow) было произведено методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются, относительно вертикального положения (Рис.1).

Ниже привеведен код граничных периодических условий Крайника-Реинельта:


[math] if (x \gt w - sx) [/math] [math]\{x = x - w;\} [/math]

[math] if (x \lt -sx) [/math] [math]\{x = x + w;\} [/math]


[math] if (y \gt h) [/math] [math]\{y = y - h; x = x - sy;\} [/math]

[math] if (y \lt 0) [/math] [math]\{y = y + h; x = x + sy;\} [/math]

Где [math]x[/math] и [math]у[/math] - это координаты частицы, [math]w[/math] и [math]h[/math] - ширина и высота ячейки периодичности. [math] sx [/math] и [math] sy [/math] - смещение по x b y при переходе через границы ячейки периодичности.

Программа

Текст программы на языке JavaScript:

Файл "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.