Моделирование распространения газовых примесей на JavaSctipt

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск

Описание[править]

Математическая модель[править]

Используемые уравнения:[править]

  • F(x,y,t), G(x,y,t) - функции источника
  • A, a - специальные коэффициенты
  • T - температура
  • С - концентрация

Начальные условия:[править]

  • источник располагается в центре комнаты
  • L = 2 - длина и ширина источника

Температура[править]

  • T0 = 300 - начальная температура во всем помещении;
  • Tmax = 400 - температура внутри источника;

Концентрация[править]

  • C0 = 0.03 - концентрация газовой смеси во всем помещении;
  • Cmax = 0.97 - концентрация газовой смеси внутри источника;

Визуализация[править]

Код программы[править]

Код программы на языке JavaScript:
  1 /*
  2 x0 - координата источника по иксу
  3 y0 - координата источника по игреку
  4 U0 - начальная температура во всем помещении
  5 C0 - пиковая интенсивность источника
  6 
  7 C - массив значений концентрации
  8 G - массив значений источника диффузанта
  9 A - коэф. перед dC/dt
 10 */
 11 window.addEventListener('load', main, false);
 12 function main()
 13 {
 14 	
 15 var ctx = canvas_example.getContext('2d');
 16 var ctx1 = canvas_example1.getContext('2d');
 17 
 18 var X_MAX=canvas_example.height;
 19 var Y_MAX=canvas_example.height;
 20 var L=4;
 21 var t0=0;
 22 var U0=300;
 23 var C0=1;
 24 var a=0.08;
 25 var A=1000000;
 26 
 27 
 28 var dt = 0.01;
 29 var X_STEPS = 50;
 30 var Y_STEPS = 50;
 31 var x0=X_STEPS/2;
 32 var y0=Y_STEPS/2;
 33 var h=X_MAX/X_STEPS;
 34 var T = new Array();
 35 var C = new Array();
 36 var G = new Array();
 37 var fps = 60;
 38 var MX = X_STEPS/X_MAX;
 39 var MY = Y_STEPS/Y_MAX;
 40 var С0=0.03;
 41 var Cmax=0.97;
 42 var flag1=0;
 43 
 44 var flag3=0;
 45 
 46 var timer;
 47 var timer1;
 48 var check=0;
 49 
 50 
 51 
 52 
 53 	
 54 	Start();
 55 	drawC();
 56 	drawT();
 57 	flag1=1;
 58 	flag3=0;
 59 	
 60 	
 61 	
 62 	
 63 	function Start() 
 64 	{
 65 		for(var i = 0; i < X_STEPS; i++) {
 66 			T[i] = new Array();
 67 			C[i] = new Array();
 68 			G[i] = new Array();
 69 			for(var j = 0; j < Y_STEPS; j++) {
 70 				T[i][j] = U0;
 71 				C[i][j] = С0;
 72 				G[i][j] = 0.0;
 73 			}
 74 		}
 75 		//это чтобы задать начальное распределение тепла от ичточника
 76 		for(var i = x0-L/2; i <x0+L/2; i++) 
 77 		{
 78 			for(var j = y0-L/2; j <y0+L/2; j++) 
 79 			{
 80 				T[i][j] = U0+100;
 81 				C[i][j] = Cmax;
 82 			}
 83 		}
 84 	}
 85 	//Пуск
 86 	button1.onclick = function()
 87 	{
 88 		if (flag1==1)
 89 		{	
 90 			controlC();
 91 			controlT();
 92 			console.log('Старт');
 93 			flag3=2;
 94 		}
 95 	}
 96 	
 97 	//пауза
 98 	button2.onclick = function()
 99 	{
100 		
101 		if (flag3==2)
102 		{
103 			clearTimeout(timer);
104 			clearTimeout(timer1);
105 			console.log('Пауза');
106 			flag1=1;
107 		}
108 		//console.log(check);
109 	}
110 	//стоп
111 	button3.onclick = function()
112 	{
113 		
114 		if (flag3==2)
115 		{
116 			clearTimeout(timer);
117 			clearTimeout(timer1);
118 			Start();
119 			drawC();
120 			drawT();
121 			console.log('Стоп');
122 			flag1=1;
123 		}
124 		
125 	}
126 	
127 	
128 function TEMPERATURE() 
129 {
130 	for(var i = 1; i < X_STEPS - 1; i++) 
131 	{
132 		for(var j = 1; j < Y_STEPS - 1; j++) 
133 		{
134 			T[i][j]= T[i][j] + dt*( (a*a) *((T[i+1][j]-2*T[i][j]+T[i-1][j])/(h*h)+(T[i][j+1]-2*T[i][j]+T[i][j-1])/(h*h)));
135 			C[i][j] = dt*(G[i][j]/A) + C[i][j] + (dt/A)*( ((T[i][j])**(1.5))*((1/(h*h))*(C[i+1][j] + C[i-1][j] + C[i][j-1] + C[i][j+1] - 4*C[i][j])) + (1.5*((T[i][j])**0.5)/(h*h))*((T[i+1][j] - T[i][j])*(C[i+1][j] - C[i][j]) + (T[i][j+1] - T[i][j])*(C[i][j+1] - C[i][j])));
136 			
137 		}
138 	}
139 	for(var i = 0; i < X_STEPS; i++) 
140 	{
141 		T[i][0] = U0;//T[i][1] + dt*(T[i][1] - U0);
142 		T[i][Y_STEPS -1] =U0; //T[i][Y_STEPS - 2] + dt*(T[i][Y_STEPS - 2] - U0);
143 		C[i][0] = С0;//C[i][1];
144 		C[i][Y_STEPS-1] = С0;//C[i][Y_STEPS - 1];
145 	}
146 	for(var j = 0; j < Y_STEPS; j++) 
147 	{
148 		T[0][j] = U0;//T[1][j] + dt*(T[1][j] - U0);
149 		T[X_STEPS-1 ][j] = U0;//T[X_STEPS - 2][j] + dt*(T[X_STEPS - 2][j] - U0);
150 		C[0][j] = С0;//C[1][j];
151 		C[X_STEPS-1][j] = С0;//C[X_STEPS - 1][j];
152 		
153 	}
154 	//Это чтобы  поддерживать температуру в источнике
155 	for(var i = x0-L/2; i < x0+L/2; i++) 
156 	{
157 		for(var j = y0-L/2; j < y0+L/2; j++) 
158 		{
159 			T[i][j] = U0+100;
160 			C[i][j] = Cmax;
161 		}
162 	}
163 	dt += 1;
164 	return T;
165 	return C;
166 }
167 
168 function drawT()
169 {
170 	ctx.clearRect(0, 0, X_MAX, Y_MAX);
171 	//Для температуры
172 	for(var i=0; i<X_STEPS; i++)
173 	{
174 		for(var j=0; j<Y_STEPS; j++)
175 		{
176 			
177 			ctx.beginPath();
178 			if(T[i][j] < 323.5) {
179 				ctx.fillStyle = ("rgb(0, " + ("" + parseInt(20 + 10*(T[i][j] - U0))) + ", 255)");
180 			}
181 				
182 			else if((T[i][j] >= 323.5)&&(T[i][j] < 349)) {
183 				ctx.fillStyle = ("rgb(0, 255, " + ("" + parseInt(490 - 10*(T[i][j] - U0))) + ")");
184 			}
185 				
186 			else if((T[i][j] >= 349)&&(T[i][j] < 374.5)) {
187 				ctx.fillStyle = ("rgb(" + ("" + parseInt(10*(T[i][j] - U0) - 490)) + ", 255, 0)")
188 			}
189 				
190 			else if((T[i][j] >= 374.5)&&(T[i][j] <= 400)) {
191 				ctx.fillStyle = ("rgb(255," + ("" + parseInt(1000 - 10*(T[i][j] - U0))) + ", 0)");
192 			}			
193 			ctx.fillRect(i/MX, j/MY, (j+1)/MX,(i+1)/MY);
194 			ctx.fill();
195 		}
196 		
197 	}
198 	console.log('Температура')
199 	ctx.fillStyle="black";
200 	ctx.font = "italic 15pt Arial";
201 	ctx. fillText('Температура',10,450);
202 	ctx. fillText('Синий цвет: T[i][j]=300;',10,470);
203 	ctx. fillText('Красный цвет: T[i][j]=400;',10,490);
204 }
205 function drawC()
206 {
207 	ctx1.clearRect(0, 0, X_MAX, Y_MAX);
208 	//для концентрации
209 	for(var i=0; i<X_STEPS; i++)
210 	{
211 		for(var j=0; j<Y_STEPS; j++)
212 		{
213 			
214 			ctx1.beginPath();
215 			if(C[i][j] < 0.22795) {
216 				ctx1.fillStyle = ("rgb(0, " + ("" + parseInt(20 + (100000/97)*(C[i][j]))) + ", 255)");
217 			}
218 				
219 			else if((C[i][j] >= 0.22795)&&(C[i][j] < 0.4753)) {
220 				ctx1.fillStyle = ("rgb(0, 255, " + ("" + parseInt(490 - (100000/97)*(C[i][j] ))) + ")");
221 			}
222 			
223 			else if((C[i][j] >= 0.4753)&&(C[i][j] < 0.72265)) {
224 				ctx1.fillStyle = ("rgb(" + ("" + parseInt((100000/97)*(C[i][j] ) - 490)) + ", 255, 0)")
225 			}
226 			
227 			else if((C[i][j] >= 0.72265)&&(C[i][j] <= 0.97)) {
228 				ctx1.fillStyle = ("rgb(255," + ("" + parseInt(1000 - (100000/97)*(C[i][j] ))) + ", 0)");
229 			}			
230 			ctx1.fillRect(i/MX, j/MY, (j+1)/MX,(i+1)/MY);
231 			ctx1.fill();
232 			
233 		}
234 		
235 	}
236 	
237 	ctx1.fillStyle="black";
238 	ctx1.font = "italic 15pt Arial";
239 	ctx1. fillText('Концентрация',10,450);
240 	ctx1. fillText('Синий цвет: C[i][j]=0.03;',10,470);
241 	ctx1. fillText('Красный цвет: C[i][j]=0.97;',10,490);
242 }
243 	//первый интервал - [Tmin; Tmin + 0.235*(Tmax - Tmin)] - от синего к голубому, rgb(0, 20 + 10*(T - Tmin), 255)
244 	//второй интервал - [Tmin + 0.235*(Tmax - Tmin); Tmin + 0.49*(Tmax - Tmin)] - от голубого к зеленому, rgb(0, 255, 490 - 10*(T - Tmin))
245 	//третий интервал - [Tmin + 0.49*(Tmax - Tmin); Tmin + 0.745*(Tmax - Tmin)] - от зеленого к желтому, rgb(10*(T - Tmin) - 490; 255; 0)
246 	//четвертый интервал - [Tmin + 0.745(Tmax - Tmin); Tmax] - от желтого к красному; rgb(255, 1000 - 10*(T - Tmin); 0)
247 	function controlC()
248 	{
249 		drawC();
250 		TEMPERATURE();
251 		timer = setTimeout(controlC, 1000/fps); //1000мс
252 		if (check==4541) 
253 		{
254 			clearTimeout(timer);
255 			Start();
256 			drawC();
257 			drawT();
258 			console.log('Дальше схема может разойтись');
259 			flag1=0;	
260 		}
261 	}
262 	function controlT()
263 	{
264 		drawT();
265 		TEMPERATURE();
266 		timer1 = setTimeout(controlT, 1000/fps); //1000мс
267 		if (check==4541) 
268 		{
269 			clearTimeout(timer1);
270 			Start();
271 			drawC();
272 			drawT();
273 			console.log('Дальше схема может разойтись');
274 			flag1=0;
275 		}
276 	}
277 
278 }
Код программы на языке HTML:
 1 <!DOCTYPE html>
 2 <html>
 3 	<head>
 4 		<script src='animation.js'></script>
 5 		<link href="style.css" rel="stylesheet"/>
 6 	</head>
 7 	
 8 	<body bgcolor='#FFFFFF'>
 9 	<table >
10 	<tr>
11 		<td> <canvas id='canvas_example' width=500 height=500 style='border: 1px solid black;'></canvas> </td> 
12 		<td> <canvas id='canvas_example1' width=500 height=500 style='border: 1px solid black;'></canvas> </td> 
13 	</tr>
14 	</table>
15 	<table >
16 	<tr>
17 		<td> <input type=button id=button1 value='Пуск'> </td> 
18 		<td> <input type=button id=button2 value='Пауза'> </td> 
19 		<td> <input type=button id=button3 value='Стоп'> </td> 
20 	</tr>
21 	</table>
22 	
23 		
24 
25 	</body>
26 </html>
Код программы на языке CSS:
 1 	input
 2 {
 3 	margin:2px;
 4 
 5     width:100%;
 6     height:100%;
 7 	background-color:gainsboro;
 8 	font-size:100%;
 9 }
10 
11 #button1, #button2, #button3, #button4
12 {
13 	background-color:gainsboro;
14 	width:100%;
15     height:100%;
16 }
17 
18 
19 body
20 {
21 	background-color: snow;
22 	
23 	
24 }