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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(top)
(top)
Строка 1: Строка 1:
** [[ Курсовые_работы_по_ВМДС:_2016-2017 | Курсовые работы 2016-2017 учебного года]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
+
[[ Курсовые_работы_по_ВМДС:_2016-2017 | Курсовые работы 2016-2017 учебного года]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
  
 
'''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]'''''
 
'''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]'''''

Версия 13:20, 10 января 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" <syntaxhighlight lang="javascript" line start="1" enclose="div"> function main_particle_1(canvas_particle_1,slider_01) {


   // Предварительные установки

var w_1 = canvas_particle_1.width; // Ширина рабочего поля

    var h_1 = canvas_particle_1.height;         // Высота рабочего поля

   var w = w_1/3;                                // Ширина ячеки периодичности
   var h = h_1/3;          

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

this.newSystem = function() { var w_1 = canvas_particle_1.width; // Ширина рабочего поля

   var h_1 = canvas_particle_1.height;         // Высота рабочего поля

   var w = w_1 / 3;                                // Ширина ячеки периодичности
   var h = h_1 / 3;                                // Высота ячейки периодичности

}; var sh = -10 * 15; // Наклоненность боковых границ ячеек ее можно менять

     this.set_01 = function(o) {sh = 10 * o;};
   // настройка слайдеров и текстовых полей
   slider_01.min = -15;               slider_01.max = 15;
   slider_01.step = 1;
   slider_01.value = sh/10;          // начальное значение ползунка должно задаваться после min и max
   text_01.value = sh/10;  

var s = 0; // предустановка

   var s1 = 2/3 * sh;                          // Начальный сдвиг при переходе через гориз. границу
   var se = -(2 * sh / h_1) * (h - 0.5 * h_1); // Начальный сдвиг при переходе через верт. границу
 var r    = 10;                      // Радиус частиц
 var N    = 10;                       // Число частиц можно менять
 rx = new Array();                // Содержит координаты частиц по оси Х
 ry = new Array();                // Содержит координаты частиц по оси У
 rxI0 = new Array();              // Координаты для ячеек перидичностей - клонов 
 rxI1 = new Array();
 rxI2 = new Array();
 rxI3 = new Array();
 rxI4 = new Array();
 rxI5 = new Array();
 rxI6 = new Array();
 rxI7 = new Array();                          
 ryI0 = new Array();
 ryI1= new Array();
 ryI2= new Array();
 ryI3= new Array();
 ryI4= new Array();
 ryI5= new Array();
 ryI6= new Array();
 ryI7= new Array();                  
 vx = new Array();                //Скорость по Х
 vy = new Array();                //Скорость по У
 vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array();
 var distR0,distR2,distR3,distR;
 
 L = new Array();               // Кинетический момент
 var D = 5;                     // Энергия связи
 var a0 = w * 0.1; 
 var c = 72 * D/r;              // Жесткость связи частиц
 var W = Math.sqrt(c);
 var T = 2 * Math.PI/W;
 dt = 0.03;
 //0.04380741654852822
 
 
 
 
 for (i = 0; i < N/2; ++i)  
 {
     vx_p[i] = Math.random()*15;
     vy_p[i] = Math.random()*15;
     vx_m[i] = Math.random()*15;
     vy_m[i] = Math.random()*15;
     vx = vx_p.concat(vx_m);
     vy = vy_p.concat(vy_m);
 }
 
 var kol = 1;
 var prx = 0;
 var pry = 0;
 var dist= 0;
 var f;
 rx[0] = Math.random() * (w - 10) ;//-s; 
 ry[0] =  Math.random() * (h - 10);
 while (kol < N)
 {
   f = 0;
   prx = Math.random() * (w - 10);//-s; 
   pry = Math.random() * (h - 10);
   for (i = 0; i < kol; i++)
   {
     dist = Math.pow((rx[i] - prx),2) + Math.pow((ry[i] - pry),2);
     if (dist < Math.pow(2 * a0,2))
     {
       f = f+1;
     }
   }
   if (f==0)
   {
     rx[kol] = prx;
     ry[kol] = pry;
     kol++;
   }
 }
 
 var steps = 0;
 
 
 function step()
 {
   tick();
   draw();
 }
 var vGraph = new TM_graph(                        // определить график
         "#vGraph",                                // на html-элементе #vGraph
         1000,                                      // сколько шагов по оси "x" отображается
         -1, 1,0.2);                               // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
     
 function tick()
 {
   for (i = 0; i < N ; i++)
   {  
     
     steps += 1;
     
     rx[i] += vx[i]*dt;
     ry[i] += vy[i]*dt;
       
       s = -(2 * sh / h_1) * (ry[i] - 0.5 * h_1);	
   

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

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

if (ry[i] >= h) {ry[i] = ry[i] - h ; rx[i]=rx[i]- 2 * se; }

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

rx[i]=rx[i]+2*se; }

       rxI0[i] = rx[i] + w;
       ryI0[i] = ry[i];
       rxI3[i] = rx[i] + w +s1;
       ryI3[i] = ry[i] + h;
       
       rxI6[i] = rx[i] + w +s1 +s1;
       ryI6[i] = ry[i] + 2*h;
       
       rxI1[i] = rx[i] + 2*w ;
       ryI1[i] = ry[i];
       
       rxI4[i] = rx[i] + 2*w +s1;
       ryI4[i] = ry[i] + h;
       
       rxI7[i] = rx[i] + 2*w +s1 +s1 ;
       ryI7[i] = ry[i] + 2*h;
       
       rxI2[i] = rx[i] +s1;
       ryI2[i] = ry[i] + h;
       
       rxI5[i] = rx[i] +s1 +s1 ;
       ryI5[i] = ry[i] + 2*h;
       
       
       
       //раcсчет расстояний
       
       for (j = 0; j < N ; j++)
       {
         if (i != j)
         {
           distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2));
           distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2));
           distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2));
           distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
           
           //раcсчет сил
           a = 4 * r;
           if (distR0 < 2*r)
           {
             var mod_fR0,fxR0,fyR0;
             mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a;
             //console.log(mod_fR0);
             if (mod_fR0 >=0)
             {
               fxR0 = mod_fR0*(rx[i]-rxI0[j]);
               fyR0 = mod_fR0*(ry[i]-ryI0[j]);
               vx[i]+=fxR0*dt;
               vx[j]-=fxR0*dt;
               vy[i]+=fyR0*dt;
               vy[j]-=fyR0*dt;
             }
           }
           if (distR2 < 2*r)
           {
             var mod_fR2,fxR2,fyR2;
             mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a;
           
             if (mod_fR2 >=0)
             {
               fxR2 = mod_fR2*(rx[i]-rxI2[j]);
               fyR2 = mod_fR2*(ry[i]-ryI2[j]);
               vx[i]+=fxR2*dt;
               vx[j]-=fxR2*dt;
               vy[i]+=fyR2*dt;
               vy[j]-=fyR2*dt;
             }
           }
           if (distR3 < 2*r)
           {
             var mod_fR3,fxR3,fyR3;
             mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a;
             
             if (mod_fR3 >=0)
             {
               fxR3 = mod_fR3*(rx[i]-rxI3[j]);
               fyR3 = mod_fR3*(ry[i]-ryI3[j]);
               vx[i]+=fxR3*dt;
               vx[j]-=fxR3*dt;
               vy[i]+=fyR3*dt;
               vy[j]-=fyR3*dt;
             }
           }
           
           if (distR < 2*r)
           {
             var mod_fR,fxR,fyR;
             mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a;
             if (mod_fR >=0)
             {
               fxR = mod_fR*(rx[i]-rx[j]);
               fyR = mod_fR*(ry[i]-ry[j]);
               vx[i]+=fxR*dt;
               vx[j]-=fxR*dt;
               vy[i]+=fyR*dt;
               vy[j]-=fyR*dt;
             }
           }
           
 Array.prototype.sum = function()
 {
 for (var i=0, sum=0; i < this.length; sum += this[i++]);
 return sum;
 }
 
           
          // L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/6000;
           var sumL = L.sum();
           //график
          // if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
           //console.log(sumL);
         }
         
       }      
   }
 }
       
 
 function draw() 
 {
   ctx.clearRect(0, 0, w_1+100 , h_1+100);              // очистить экран
   for (var i = 0; i < N; i++)
     
   {
     var x = rx[i];           
     var y = ry[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(x, y, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     
     var xI0 = rxI0[i];           
     var yI0 = ryI0[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     

var xI1 = rxI1[i];

     var yI1 = ryI1[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     

var xI2 = rxI2[i];

     var yI2 = ryI2[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
    

var xI3 = rxI3[i];

     var yI3 = ryI3[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
    

var xI4 = rxI4[i];

     var yI4 = ryI4[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     

var xI5 = rxI5[i];

     var yI5 = ryI5[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     

var xI6 = rxI6[i];

     var yI6 = ryI6[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     

var xI7 = rxI7[i];

     var yI7 = ryI7[i];
     ctx.beginPath();
     ctx.fillStyle = "#00008B";
     ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
     ctx.closePath();
     ctx.fill();
     
   }    
     ctx.beginPath();                             // начать рисование
     ctx.fillStyle="#000000";
     ctx.moveTo(w-sh, 0);                             // переместить "карандаш" в точку 
     ctx.lineTo(w+sh, h_1);                          // нарисовать "карандашом" линию до точки 
     ctx.stroke();
     
     ctx.beginPath();
     ctx.fillStyle="#000000";    
     ctx.moveTo(2 * w-sh, 0);                             
     ctx.lineTo(2 * w+sh, h_1);                            
     ctx.stroke();
     

ctx.beginPath();

     ctx.fillStyle="#000000";    
     ctx.moveTo( 0- sh, 0);                             
     ctx.lineTo(  sh, h_1);                             
     ctx.stroke();
     
     ctx.beginPath(); 
     ctx.fillStyle="#000000";    
     ctx.moveTo(w_1 - sh, 0);                             
     ctx.lineTo(w_1 + sh, h_1);                             
     ctx.stroke();
     ctx.beginPath();  
     ctx.fillStyle="#000000";
     ctx.moveTo(0, h);                             
     ctx.lineTo(w_1, h);                            
     ctx.stroke();
     
     ctx.beginPath(); 
     ctx.fillStyle="#000000";    
     ctx.moveTo(0, 2 * h);                             
     ctx.lineTo(w_1, 2 * h);                             
     ctx.stroke();
 }
    // Запуск системы
   this.newSystem();
 setInterval(step, 1000/120);                       // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
   
}