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

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[ Курсовые_работы_по_ВМДС:_2016-2017 | Курсовые работы 2016-2017 учебного года]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
+
[[Курсовые работы по МДС: 2016-2017]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
  
 
'''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]'''''
 
'''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]'''''
Строка 8: Строка 8:
  
 
'''Семестр:''' осень 2016
 
'''Семестр:''' осень 2016
 +
  
 
== Описание задачи ==
 
== Описание задачи ==
Строка 16: Строка 17:
 
граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются,
 
граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются,
 
относительно вертикального положения (Рис.1).  
 
относительно вертикального положения (Рис.1).  
 
Ниже привеведен код граничных периодических условий Крайника-Реинельта:
 
 
  
 
<math> if (x > w - sx) </math>
 
<math> if (x > w - sx) </math>
Строка 35: Строка 33:
 
         x = x + sy;\} </math>
 
         x = x + sy;\} </math>
  
Где <math>x</math> и <math>у</math> - это координаты частицы, <math>w</math> и <math>h</math> - ширина и высота ячейки периодичности.
+
Где x и у - это координаты частицы, w и h - ширина и высота ячейки периодичности.
 
<math> sx </math> и <math> sy </math> - смещение по x b y при переходе через границы
 
<math> sx </math> и <math> sy </math> - смещение по x b y при переходе через границы
 
ячейки периодичности.
 
ячейки периодичности.
 
 
==Программа==
 
==Программа==
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/MuschakND/Elongational%20flow/NNN-1.html |width=800 |height=800 |border=0 }}
 
<div class="mw-collapsible mw-collapsed">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"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 мс)
 
   
 
}
 
</syntaxhighlight>
 
</div>
 
==Ссылки по теме==
 
 
* 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.
 
* B. D. Todd, Peter J. Daivis "Nonequilibrium Molecular Dynamics Simulations of Planar Elongational Flow with Spatially
 
and Temporally Periodic Boundary Conditions", 1992.
 
* B.D.Todd, Peter J. Daivis "New algorithm for unrestricted duration nonequilibrium molecular dynamics
 
simulations of planar elongational flow", 2003.
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)