Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
− | [[ Курсовые_работы_по_ВМДС:_2016-2017 | Курсовые работы 2016-2017 учебного года]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR>
| + | [[Курсовые работы по МДС: 2016-2017]] > '''Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частиц''' <HR> |
| | | |
| '''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]''''' | | '''''Курсовой проект по [[Механика дискретных сред|Механике дискретных сред]]''''' |
Строка 8: |
Строка 8: |
| | | |
| '''Семестр:''' осень 2016 | | '''Семестр:''' осень 2016 |
| + | |
| | | |
| == Описание задачи == | | == Описание задачи == |
− | [[Файл:KR.png|thumb|Рис.1 Периодическая система ячеек.|450px]]
| + | Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом было произведено |
− | Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongational flow) было произведено | |
| методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами | | методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами |
| описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических | | описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических |
| граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются, | | граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются, |
− | относительно вертикального положения (Рис.1). | + | относительно вертикального положения. |
− | | |
− | Ниже привеведен код граничных периодических условий Крайника-Реинельта:
| |
− | | |
− | | |
− | <math> if (x > w - sx) </math>
| |
− | <math>\{x = x - w;\} </math>
| |
− | | |
− | <math> if (x < -sx) </math>
| |
− | <math>\{x = x + w;\} </math>
| |
− | | |
− | | |
− | <math> if (y > h) </math>
| |
− | <math>\{y = y - h;
| |
− | x = x - sy;\} </math>
| |
− | | |
− | <math> if (y < 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 при переходе через границы
| |
− | ячейки периодичности.
| |
− | | |
− | ==Программа==
| |
− | {{#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.
| |