Колебания энергий в одномерном кристалле — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Денис (обсуждение | вклад) |
Денис (обсуждение | вклад) |
||
Строка 3: | Строка 3: | ||
Данная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле. | Данная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле. | ||
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Bessel_fluctuations/Bessel_fluctuations_v2.3_no_realiz/Bessel_fluctuations.html |width=1030 |height=640 |border=0 }} | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Bessel_fluctuations/Bessel_fluctuations_v2.3_no_realiz/Bessel_fluctuations.html |width=1030 |height=640 |border=0 }} | ||
+ | |||
+ | Скачать программу: [[Медиа:Bessel_fluctuations_v2.3_no_realiz.zip|Bessel_fluctuations_v2.3_no_realiz.zip]] | ||
+ | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
+ | '''Текст программы на языке JavaScript (разработчик [[Цветков Денис]]):''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"Bessel_fluctuations.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | window.addEventListener("load", main_BF, false); | ||
+ | function main_BF() { | ||
+ | |||
+ | // Предварительные установки | ||
+ | var a0 = 1; // масштаб расстояния | ||
+ | var t0 = 1; // масштаб времени | ||
+ | var m0 = 1; // масштаб массы | ||
+ | |||
+ | var k0 = 2 * Math.PI / t0; // масштаб частоты | ||
+ | var C0 = m0 * k0 * k0; // масштаб жесткости | ||
+ | |||
+ | var m = 1 * m0; // масса | ||
+ | var C = 0.02 * C0; // жесткость | ||
+ | |||
+ | var dx = 1 * a0; // шаг сетки по оси x | ||
+ | var dt = 0.02 * t0; // шаг интегрирования по времени | ||
+ | |||
+ | var N = 100000; // количество частиц в каждой реализации | ||
+ | var T = 15; // время расчета | ||
+ | |||
+ | var koeff = C / (dx * dx) / m * dt; // коэффициент для уравнения динамики частиц | ||
+ | |||
+ | // интерфейс программы | ||
+ | N_number.value = N; | ||
+ | N_number.oninput = function() {N = parseInt(N_number.value);}; | ||
+ | T_number.value = T; | ||
+ | T_number.oninput = function() {T = parseInt(T_number.value);}; | ||
+ | button_start.onclick = calculate_new_system; | ||
+ | |||
+ | checkbox_K.onchange = function() {if (first_calc) draw();}; | ||
+ | checkbox_P.onchange = function() {if (first_calc) draw();}; | ||
+ | checkbox_E.onchange = function() {if (first_calc) draw();}; | ||
+ | |||
+ | var ctx = BF_canvas.getContext("2d"); // на context происходит рисование | ||
+ | var w = BF_canvas.width; // ширина окна в расчетных координатах | ||
+ | var h = BF_canvas.height; // высота окна в расчетных координатах | ||
+ | |||
+ | // основная расчетная функция | ||
+ | var data_K, data_P, data_E; // данные для графика | ||
+ | var first_calc = false; // произведен ли первый расчет | ||
+ | var t, n; | ||
+ | var t_start; | ||
+ | function calculate_new_system() { | ||
+ | first_calc = true; | ||
+ | t = 0; | ||
+ | n = N + 2; // количество узлов по оси x + 2 для ГУ | ||
+ | span_time_calc.innerHTML = ""; | ||
+ | div_calc_speed.style.display = "none"; | ||
+ | |||
+ | // задание начальных условий | ||
+ | var P = []; | ||
+ | for (var i = 1; i < n - 1; i++) { | ||
+ | P[i] = {}; | ||
+ | P[i].u = 0; | ||
+ | P[i].v = (2 * Math.random() - 1) * 0.25; | ||
+ | } | ||
+ | // периодические граничные условия | ||
+ | P[0] = P[n - 2]; | ||
+ | P[n - 1] = P[1]; | ||
+ | |||
+ | data_K = []; data_P = []; data_E = []; | ||
+ | |||
+ | // основной расчет | ||
+ | t_start = performance.now(); | ||
+ | calculate(P); | ||
+ | } | ||
+ | |||
+ | function calculate(P) { | ||
+ | var t1 = performance.now(); | ||
+ | |||
+ | while (t < T) { | ||
+ | // расчет энергий для графиков | ||
+ | var Kin = 0; | ||
+ | var Pot = 0; | ||
+ | for (var j = 1; j < n - 1; j++) {Kin += P[j].v * P[j].v;} | ||
+ | for (var j = 1; j < n - 1; j++) {Pot += Math.pow(P[j].u - P[j - 1].u, 2);} | ||
+ | Kin = Kin * m; | ||
+ | Pot = Pot * C; | ||
+ | data_K.push(Kin); | ||
+ | data_P.push(Pot); | ||
+ | data_E.push(Kin + Pot); | ||
+ | |||
+ | // расчет состояния системы на следующем шаге | ||
+ | for (var i = 1; i < n - 1; i++) { | ||
+ | P[i].v += (P[i + 1].u - 2 * P[i].u + P[i - 1].u) * koeff; | ||
+ | } | ||
+ | for (var i = 1; i < n - 1; i++) { | ||
+ | P[i].u += P[i].v * dt; | ||
+ | } | ||
+ | |||
+ | t += dt; | ||
+ | if ((performance.now() - t1) > 200) { | ||
+ | draw(); | ||
+ | setTimeout( function(){calculate(P); }, 10); | ||
+ | div_container_progress.style.display = "block"; | ||
+ | button_start.style.display = "none"; | ||
+ | progress_bar.style.width = Math.round(t / T * 100) + "%"; | ||
+ | span_progress.innerHTML = (t / T * 100).toFixed(2) + "%"; | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | draw(); | ||
+ | div_container_progress.style.display = "none"; | ||
+ | button_start.style.display = "inline"; | ||
+ | div_calc_speed.style.display = "block"; | ||
+ | span_time_calc.innerHTML = ((performance.now() - t_start) / N * 1000 / Math.ceil(T/t)).toFixed(2); | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | function draw() { | ||
+ | ctx.clearRect(0, 0, w, h); // очистка экрана | ||
+ | |||
+ | // подпись к оси ("х") | ||
+ | ctx.font = "20pt Arial"; | ||
+ | ctx.textAlign = "right"; | ||
+ | ctx.textBaseline = "bottom"; | ||
+ | ctx.fillStyle = "#666666"; | ||
+ | ctx.fillText("x", w - 4, h); | ||
+ | |||
+ | var title_y = 3; // начальный отступ для подписи | ||
+ | var title_y_plus = 30; // на столько увеличивается отступ для каждой следующей подписи | ||
+ | |||
+ | if (checkbox_K.checked) { | ||
+ | // Кинетическая энергия | ||
+ | ctx.strokeStyle = "#ff0000"; | ||
+ | ctx.lineWidth = 1; | ||
+ | ctx.beginPath(); | ||
+ | ctx.moveTo(0, 0); | ||
+ | for (var i = 1; i < data_K.length; i++) { | ||
+ | ctx.lineTo(i / (data_K.length - 1) * w, h - data_K[i] / data_K[0] * h); | ||
+ | } | ||
+ | ctx.stroke(); | ||
+ | |||
+ | // подпись | ||
+ | ctx.textAlign = "center"; | ||
+ | ctx.textBaseline = "top"; | ||
+ | ctx.fillStyle = "#ff0000"; | ||
+ | ctx.fillText("K", w - 24, title_y); | ||
+ | title_y += title_y_plus; | ||
+ | } | ||
+ | |||
+ | if (checkbox_P.checked) { | ||
+ | // Потенциальная энергия | ||
+ | ctx.strokeStyle = "#0000ff"; | ||
+ | ctx.lineWidth = 1; | ||
+ | ctx.beginPath(); | ||
+ | ctx.moveTo(0, h - data_P[0] / data_K[0] * h); | ||
+ | for (var i = 1; i < data_P.length; i++) { | ||
+ | ctx.lineTo(i / (data_P.length - 1) * w, h - data_P[i] / data_K[0] * h); | ||
+ | } | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.textAlign = "center"; | ||
+ | ctx.textBaseline = "top"; | ||
+ | ctx.fillStyle = "#0000ff"; | ||
+ | ctx.fillText("П", w - 24, title_y); | ||
+ | title_y += title_y_plus; | ||
+ | } | ||
+ | |||
+ | if (checkbox_E.checked) { | ||
+ | // Полная энергия | ||
+ | ctx.strokeStyle = "#880088"; | ||
+ | ctx.lineWidth = 2; | ||
+ | ctx.beginPath(); | ||
+ | ctx.moveTo(0, h - data_E[0] / 2 / data_K[0] * h); | ||
+ | for (var i = 1; i < data_E.length; i++) { | ||
+ | ctx.lineTo(i / (data_E.length - 1) * w, h - data_E[i] / 2 / data_K[0] * h); | ||
+ | } | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.textAlign = "center"; | ||
+ | ctx.textBaseline = "top"; | ||
+ | ctx.fillStyle = "#880088"; | ||
+ | ctx.fillText("E/2", w - 24, title_y); | ||
+ | title_y += title_y_plus; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Файл '''"Lang.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | strings = { | ||
+ | span_kin_energy:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Kinetic energy", | ||
+ | ru:"Кинетическая энергия" | ||
+ | }, span_pot_energy:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Potential energy", | ||
+ | ru:"Потенциальная энергия" | ||
+ | }, span_full_energy:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Full energy", | ||
+ | ru:"Полная энергия" | ||
+ | }, button_start:{ | ||
+ | field:"value", | ||
+ | en:"Start", | ||
+ | ru:"Старт" | ||
+ | }, span_progress_txt:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Progress: ", | ||
+ | ru:"Прогресс: " | ||
+ | }, abbr_speed:{ | ||
+ | field:"title", | ||
+ | en:"The calculation of this speed includes the time for processing interface and drawing the intermediate states of the system", | ||
+ | ru:"Расчет данной скорости включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы" | ||
+ | }, span_txt_nubmer_of_particles:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Number of particles", | ||
+ | ru:"Количество частиц" | ||
+ | }, span_txt_calc_time:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Calculation time", | ||
+ | ru:"Время расчета" | ||
+ | }, span_txt_calc_speed:{ | ||
+ | field:"innerHTML", | ||
+ | en:"Calculation speed", | ||
+ | ru:"Скорость расчета" | ||
+ | }, span_txt_ns_particle_step:{ | ||
+ | field:"innerHTML", | ||
+ | en:"ns/(particle⋅step)", | ||
+ | ru:"нс/(частица⋅шаг)" | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | function set_lang(lang){ | ||
+ | for (var s in strings) { | ||
+ | document.getElementById(s)[strings[s].field] = strings[s][lang]; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Файл '''"Bessel_fluctuations.html"''' | ||
+ | <syntaxhighlight lang="html5" enclose="div"> | ||
+ | <!DOCTYPE html> | ||
+ | <html> | ||
+ | <head> | ||
+ | <meta charset="UTF-8" /> | ||
+ | <title>Bessel fluctuations</title> | ||
+ | <script src="Bessel_fluctuations.js"></script> | ||
+ | <script src="Lang/Lang.js"></script> | ||
+ | <style> | ||
+ | table.outer td, table.outer tr {border: 1px solid #ddd; padding-right: 10px; padding-left: 5px} | ||
+ | table.inner td, table.inner tr {border: 0} | ||
+ | </style> | ||
+ | </head> | ||
+ | <body> | ||
+ | <canvas id="BF_canvas" width="1000" height="500" style="border:1px solid #000000;"></canvas><br> | ||
+ | |||
+ | <table class="outer" style="border-collapse: collapse; width:1002px"> | ||
+ | <tr> | ||
+ | <td style="width: 300px"> | ||
+ | <input type="checkbox" id="checkbox_K" checked/><font color="#ff0000" size="5"><B>—</B></font> <span id="span_kin_energy"></span> <br> | ||
+ | <input type="checkbox" id="checkbox_P" checked/><font color="#0000ff" size="5"><B>—</B></font> <span id="span_pot_energy"></span> <br> | ||
+ | <input type="checkbox" id="checkbox_E" checked/><font color="#880088" size="5"><B>—</B></font> <span id="span_full_energy"></span> <br> | ||
+ | </td><td> | ||
+ | <input type="button" id="button_start" style="background:#fb4;border-radius: 5px;color:#000; font-weight: bold;"/><br> | ||
+ | <input type="image" src="Lang/RU.png" onclick="set_lang('ru')"/> | ||
+ | <input type="image" src="Lang/GB.png" onclick="set_lang('en')"/><br> | ||
+ | <div id="div_container_progress" style="display: none;"> | ||
+ | <span id="span_progress_txt"></span><span id="span_progress"></span> | ||
+ | <div id="container_bar" style="width:200px; height:20px; border:1px solid black;"> | ||
+ | <div id="progress_bar" style="width:10%;background-color: orange; height:20px;"></div> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | <div id="div_calc_speed" style="display: none"> | ||
+ | <abbr id="abbr_speed" style="border-bottom: 1px dotted black;" title="Данная скорость включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы"> | ||
+ | <span id="span_txt_calc_speed"></span> <span id="span_time_calc"></span> <span id="span_txt_ns_particle_step"></span> | ||
+ | </abbr> | ||
+ | </div> | ||
+ | |||
+ | </td><td style="width: 300px"> | ||
+ | <table class="inner"> | ||
+ | <tr> | ||
+ | <td><span id="span_txt_nubmer_of_particles"></span></td> | ||
+ | <td><input type="number" id="N_number" step="1" style="width: 70px;"/></td> | ||
+ | </tr> | ||
+ | <tr> | ||
+ | <td><span id="span_txt_calc_time"></span></td> | ||
+ | <td><input type="number" id="T_number" step="1" style="width: 70px;"/> t0</td> | ||
+ | </tr> | ||
+ | </table> | ||
+ | </td> | ||
+ | </tr> | ||
+ | </table> | ||
+ | <script>set_lang("ru")</script> | ||
+ | </body> | ||
+ | </html> | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
[[Category: Виртуальная лаборатория]] | [[Category: Виртуальная лаборатория]] | ||
[[Category: Программирование]] | [[Category: Программирование]] |
Версия 16:52, 18 октября 2015
Виртуальная лаборатория > Колебания энергий в одномерном кристаллеДанная программа демонстрирует колебания кинетической, потенциальной и полной энергий в одномерном кристалле.
Скачать программу: Bessel_fluctuations_v2.3_no_realiz.zip
Текст программы на языке JavaScript (разработчик Цветков Денис):
Файл "Bessel_fluctuations.js"
1 window.addEventListener("load", main_BF, false);
2 function main_BF() {
3
4 // Предварительные установки
5 var a0 = 1; // масштаб расстояния
6 var t0 = 1; // масштаб времени
7 var m0 = 1; // масштаб массы
8
9 var k0 = 2 * Math.PI / t0; // масштаб частоты
10 var C0 = m0 * k0 * k0; // масштаб жесткости
11
12 var m = 1 * m0; // масса
13 var C = 0.02 * C0; // жесткость
14
15 var dx = 1 * a0; // шаг сетки по оси x
16 var dt = 0.02 * t0; // шаг интегрирования по времени
17
18 var N = 100000; // количество частиц в каждой реализации
19 var T = 15; // время расчета
20
21 var koeff = C / (dx * dx) / m * dt; // коэффициент для уравнения динамики частиц
22
23 // интерфейс программы
24 N_number.value = N;
25 N_number.oninput = function() {N = parseInt(N_number.value);};
26 T_number.value = T;
27 T_number.oninput = function() {T = parseInt(T_number.value);};
28 button_start.onclick = calculate_new_system;
29
30 checkbox_K.onchange = function() {if (first_calc) draw();};
31 checkbox_P.onchange = function() {if (first_calc) draw();};
32 checkbox_E.onchange = function() {if (first_calc) draw();};
33
34 var ctx = BF_canvas.getContext("2d"); // на context происходит рисование
35 var w = BF_canvas.width; // ширина окна в расчетных координатах
36 var h = BF_canvas.height; // высота окна в расчетных координатах
37
38 // основная расчетная функция
39 var data_K, data_P, data_E; // данные для графика
40 var first_calc = false; // произведен ли первый расчет
41 var t, n;
42 var t_start;
43 function calculate_new_system() {
44 first_calc = true;
45 t = 0;
46 n = N + 2; // количество узлов по оси x + 2 для ГУ
47 span_time_calc.innerHTML = "";
48 div_calc_speed.style.display = "none";
49
50 // задание начальных условий
51 var P = [];
52 for (var i = 1; i < n - 1; i++) {
53 P[i] = {};
54 P[i].u = 0;
55 P[i].v = (2 * Math.random() - 1) * 0.25;
56 }
57 // периодические граничные условия
58 P[0] = P[n - 2];
59 P[n - 1] = P[1];
60
61 data_K = []; data_P = []; data_E = [];
62
63 // основной расчет
64 t_start = performance.now();
65 calculate(P);
66 }
67
68 function calculate(P) {
69 var t1 = performance.now();
70
71 while (t < T) {
72 // расчет энергий для графиков
73 var Kin = 0;
74 var Pot = 0;
75 for (var j = 1; j < n - 1; j++) {Kin += P[j].v * P[j].v;}
76 for (var j = 1; j < n - 1; j++) {Pot += Math.pow(P[j].u - P[j - 1].u, 2);}
77 Kin = Kin * m;
78 Pot = Pot * C;
79 data_K.push(Kin);
80 data_P.push(Pot);
81 data_E.push(Kin + Pot);
82
83 // расчет состояния системы на следующем шаге
84 for (var i = 1; i < n - 1; i++) {
85 P[i].v += (P[i + 1].u - 2 * P[i].u + P[i - 1].u) * koeff;
86 }
87 for (var i = 1; i < n - 1; i++) {
88 P[i].u += P[i].v * dt;
89 }
90
91 t += dt;
92 if ((performance.now() - t1) > 200) {
93 draw();
94 setTimeout( function(){calculate(P); }, 10);
95 div_container_progress.style.display = "block";
96 button_start.style.display = "none";
97 progress_bar.style.width = Math.round(t / T * 100) + "%";
98 span_progress.innerHTML = (t / T * 100).toFixed(2) + "%";
99 return;
100 }
101 }
102 draw();
103 div_container_progress.style.display = "none";
104 button_start.style.display = "inline";
105 div_calc_speed.style.display = "block";
106 span_time_calc.innerHTML = ((performance.now() - t_start) / N * 1000 / Math.ceil(T/t)).toFixed(2);
107 return true;
108 }
109
110 function draw() {
111 ctx.clearRect(0, 0, w, h); // очистка экрана
112
113 // подпись к оси ("х")
114 ctx.font = "20pt Arial";
115 ctx.textAlign = "right";
116 ctx.textBaseline = "bottom";
117 ctx.fillStyle = "#666666";
118 ctx.fillText("x", w - 4, h);
119
120 var title_y = 3; // начальный отступ для подписи
121 var title_y_plus = 30; // на столько увеличивается отступ для каждой следующей подписи
122
123 if (checkbox_K.checked) {
124 // Кинетическая энергия
125 ctx.strokeStyle = "#ff0000";
126 ctx.lineWidth = 1;
127 ctx.beginPath();
128 ctx.moveTo(0, 0);
129 for (var i = 1; i < data_K.length; i++) {
130 ctx.lineTo(i / (data_K.length - 1) * w, h - data_K[i] / data_K[0] * h);
131 }
132 ctx.stroke();
133
134 // подпись
135 ctx.textAlign = "center";
136 ctx.textBaseline = "top";
137 ctx.fillStyle = "#ff0000";
138 ctx.fillText("K", w - 24, title_y);
139 title_y += title_y_plus;
140 }
141
142 if (checkbox_P.checked) {
143 // Потенциальная энергия
144 ctx.strokeStyle = "#0000ff";
145 ctx.lineWidth = 1;
146 ctx.beginPath();
147 ctx.moveTo(0, h - data_P[0] / data_K[0] * h);
148 for (var i = 1; i < data_P.length; i++) {
149 ctx.lineTo(i / (data_P.length - 1) * w, h - data_P[i] / data_K[0] * h);
150 }
151 ctx.stroke();
152
153 ctx.textAlign = "center";
154 ctx.textBaseline = "top";
155 ctx.fillStyle = "#0000ff";
156 ctx.fillText("П", w - 24, title_y);
157 title_y += title_y_plus;
158 }
159
160 if (checkbox_E.checked) {
161 // Полная энергия
162 ctx.strokeStyle = "#880088";
163 ctx.lineWidth = 2;
164 ctx.beginPath();
165 ctx.moveTo(0, h - data_E[0] / 2 / data_K[0] * h);
166 for (var i = 1; i < data_E.length; i++) {
167 ctx.lineTo(i / (data_E.length - 1) * w, h - data_E[i] / 2 / data_K[0] * h);
168 }
169 ctx.stroke();
170
171 ctx.textAlign = "center";
172 ctx.textBaseline = "top";
173 ctx.fillStyle = "#880088";
174 ctx.fillText("E/2", w - 24, title_y);
175 title_y += title_y_plus;
176 }
177
178 }
179 }
Файл "Lang.js"
1 strings = {
2 span_kin_energy:{
3 field:"innerHTML",
4 en:"Kinetic energy",
5 ru:"Кинетическая энергия"
6 }, span_pot_energy:{
7 field:"innerHTML",
8 en:"Potential energy",
9 ru:"Потенциальная энергия"
10 }, span_full_energy:{
11 field:"innerHTML",
12 en:"Full energy",
13 ru:"Полная энергия"
14 }, button_start:{
15 field:"value",
16 en:"Start",
17 ru:"Старт"
18 }, span_progress_txt:{
19 field:"innerHTML",
20 en:"Progress: ",
21 ru:"Прогресс: "
22 }, abbr_speed:{
23 field:"title",
24 en:"The calculation of this speed includes the time for processing interface and drawing the intermediate states of the system",
25 ru:"Расчет данной скорости включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы"
26 }, span_txt_nubmer_of_particles:{
27 field:"innerHTML",
28 en:"Number of particles",
29 ru:"Количество частиц"
30 }, span_txt_calc_time:{
31 field:"innerHTML",
32 en:"Calculation time",
33 ru:"Время расчета"
34 }, span_txt_calc_speed:{
35 field:"innerHTML",
36 en:"Calculation speed",
37 ru:"Скорость расчета"
38 }, span_txt_ns_particle_step:{
39 field:"innerHTML",
40 en:"ns/(particle⋅step)",
41 ru:"нс/(частица⋅шаг)"
42 }
43 };
44
45 function set_lang(lang){
46 for (var s in strings) {
47 document.getElementById(s)[strings[s].field] = strings[s][lang];
48 }
49 }
Файл "Bessel_fluctuations.html"
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Bessel fluctuations</title>
<script src="Bessel_fluctuations.js"></script>
<script src="Lang/Lang.js"></script>
<style>
table.outer td, table.outer tr {border: 1px solid #ddd; padding-right: 10px; padding-left: 5px}
table.inner td, table.inner tr {border: 0}
</style>
</head>
<body>
<canvas id="BF_canvas" width="1000" height="500" style="border:1px solid #000000;"></canvas><br>
<table class="outer" style="border-collapse: collapse; width:1002px">
<tr>
<td style="width: 300px">
<input type="checkbox" id="checkbox_K" checked/><font color="#ff0000" size="5"><B>—</B></font> <span id="span_kin_energy"></span> <br>
<input type="checkbox" id="checkbox_P" checked/><font color="#0000ff" size="5"><B>—</B></font> <span id="span_pot_energy"></span> <br>
<input type="checkbox" id="checkbox_E" checked/><font color="#880088" size="5"><B>—</B></font> <span id="span_full_energy"></span> <br>
</td><td>
<input type="button" id="button_start" style="background:#fb4;border-radius: 5px;color:#000; font-weight: bold;"/><br>
<input type="image" src="Lang/RU.png" onclick="set_lang('ru')"/>
<input type="image" src="Lang/GB.png" onclick="set_lang('en')"/><br>
<div id="div_container_progress" style="display: none;">
<span id="span_progress_txt"></span><span id="span_progress"></span>
<div id="container_bar" style="width:200px; height:20px; border:1px solid black;">
<div id="progress_bar" style="width:10%;background-color: orange; height:20px;"></div>
</div>
</div>
<div id="div_calc_speed" style="display: none">
<abbr id="abbr_speed" style="border-bottom: 1px dotted black;" title="Данная скорость включает в себя время на обработку интерфейса и прорисовку промежуточных состояний системы">
<span id="span_txt_calc_speed"></span> <span id="span_time_calc"></span> <span id="span_txt_ns_particle_step"></span>
</abbr>
</div>
</td><td style="width: 300px">
<table class="inner">
<tr>
<td><span id="span_txt_nubmer_of_particles"></span></td>
<td><input type="number" id="N_number" step="1" style="width: 70px;"/></td>
</tr>
<tr>
<td><span id="span_txt_calc_time"></span></td>
<td><input type="number" id="T_number" step="1" style="width: 70px;"/> t0</td>
</tr>
</table>
</td>
</tr>
</table>
<script>set_lang("ru")</script>
</body>
</html>