Укороченное взаимодействие Леннард-Джонса — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
м
Строка 9: Строка 9:
 
Файл '''"SLJ.js"'''
 
Файл '''"SLJ.js"'''
 
<source lang="javascript" first-line="1">
 
<source lang="javascript" first-line="1">
// Укороченное взаимодействие Леннард-Джонса
+
// Укороченное взаимодействий Леннард-Джонса  
// Short Lennard-Jones (SLJ)
+
// Short Lennard-Jones (SLJ) interaction
// Разработчик А. М. Кривцов
+
// Разработчик А.М. Кривцов  
// 01.05.2014
+
// 17.05.2014  
 
// Интернет: tm.spbstu.ru/SLJ
 
// Интернет: tm.spbstu.ru/SLJ
  
function MainSLJ(canvas, acSlider, acText) {
+
function MainSLJ(canvas) {
  
 
     // Предварительные установки
 
     // Предварительные установки
  
    var context = canvas.getContext("2d"); // на context происходит рисование
+
const X_max = canvas.width;
 
+
const Y_max = canvas.height;
 +
 
     // Размерные параметры
 
     // Размерные параметры
 
      
 
      
Строка 26: Строка 27:
 
     const D = 1.;    // энергия связи
 
     const D = 1.;    // энергия связи
  
     // Расчет параметров взаимодействия
+
     // Расчет констант взаимодействия
  
 
     const b = a * Math.pow(13./7, 1./6);    // положение минимума силы Леннард-Джонса (= 1.1086834 a)
 
     const b = a * Math.pow(13./7, 1./6);    // положение минимума силы Леннард-Джонса (= 1.1086834 a)
Строка 33: Строка 34:
 
     const P = 42. / 169 * P0 / b;          // модуль минимума силы Леннард-Джонса
 
     const P = 42. / 169 * P0 / b;          // модуль минимума силы Леннард-Джонса
  
     // Задаваемые параметры
+
// Переменные параметры взаимодействия
 +
 +
var ac;  // радиус обрезания взаимодействия
 +
 
 +
var ac2; // квадрат ac
 +
 +
     // Задание начальных значений параметров
 
    
 
    
    var ac = 1.4 * a; var ac2 = ac * ac;  // радиус обрезания взаимодействия
+
set_ac(1.4 * a);
   
 
    const fps = 50;                        // frames per second - число кадров в секунду (качество отображения)
 
  
 
     // Область построения графика
 
     // Область построения графика
Строка 43: Строка 48:
 
     const x_max = 2.5 * a;
 
     const x_max = 2.5 * a;
 
     const y_min = -1.2 * P;     
 
     const y_min = -1.2 * P;     
     const y_max = 2 * P;  
+
     const y_max = 2 * P;    
     
+
 
     // Установка слайдера
+
const N = X_max;                // число точек по оси x
 +
const dx = x_max / N;            // шаг по оси x
 +
const sx = X_max / x_max;        // масштаб по оси x
 +
 
 +
var sy; // масштаб по оси y
 +
var Y0;  // положение 0 оси y в экранных координатах
 +
var context;  // на context происходит рисование
 +
 
 +
// Установка флажков чекбоксов
 +
var LJ_flag = true;
 +
var SLJ_flag = true;
 +
 
 +
     // настройка слайдеров и текстовых полей
 
   
 
   
 +
Slider_01.min = 1.11 * a;      // лучше было бы взять acSlider.min = b, но b не кратно значению acSlider.step, что портит слайдер
 +
    Slider_01.max = x_max;
 +
    Slider_01.step = 0.01 * a;
 +
    Slider_01.value = ac;   
 +
    Text_01.value = ac;
 +
 +
draw();
 +
 
     // функция, запускающаяся при перемещении слайдера
 
     // функция, запускающаяся при перемещении слайдера
     this.set_ac = function(input_ac)  
+
     this.set_01 = function(input) { set_ac(input); draw(); } 
{
+
   
ac = input_ac * a; // input_ac - значение на слайдере
+
// Функции, запускающиеся при изменении элементов управления
ac2 = ac * ac;  
+
    this.setCheckbox_01 = function(bool) {LJ_flag = bool; draw(); }
draw();
+
this.setCheckbox_02 = function(bool) {SLJ_flag = bool; draw(); }
}  
 
  
    // настройка слайдеров и текстовых полей
+
function set_ac(value)
    acSlider.min = 1.11 * a;      // лучше было бы взять acSlider.min = b, но b не кратно значению acSlider.step, что портит слайдер
+
{
    acSlider.max = x_max;
+
ac = Number(value);
    acSlider.step = 0.01 * a;
+
ac2 = ac * ac;
    acSlider.value = ac;          // значение ползунка должно задаваться после min, max и step
+
}
    acText.value = ac;
 
   
 
  // Расчет параметров графики
 
   
 
    const N = canvas.width;                // число точек по оси x
 
    const dx = x_max / N;                  // шаг по оси x
 
    const sx = canvas.width / x_max;        // масштаб по оси x
 
    const sy = canvas.height / (y_max - y_min); // масштаб по оси y
 
    const Y0 = canvas.height + y_min * sy; // положение 0 оси y в экранных координатах
 
  
draw();
+
// Отображение
 +
 +
function draw()  
 +
{
 +
  // Расчет параметров графики
 +
 +
sy = Y_max / (y_max - y_min); // масштаб по оси y
 +
Y0 = Y_max + y_min * sy; // положение 0 оси y в экранных координатах
  
    // Отображение
+
context = canvas.getContext("2d");  // на context происходит рисование
  
    function draw()
+
context.clearRect(0, 0, X_max, Y_max); // очистить экран
    {
 
        context.clearRect(0, 0, canvas.width, canvas.height);         // очистить экран
 
 
          
 
          
 
         // Горизонтальная ось
 
         // Горизонтальная ось
Строка 82: Строка 102:
 
         context.beginPath();
 
         context.beginPath();
 
         context.moveTo(0, Y0);
 
         context.moveTo(0, Y0);
         context.lineTo(canvas.width, Y0);
+
         context.lineTo(X_max, Y0);
 
         context.stroke();
 
         context.stroke();
  
Строка 104: Строка 124:
 
         context.fillText("b", b * sx - 3, Y0 - 3);
 
         context.fillText("b", b * sx - 3, Y0 - 3);
 
         context.fillText("-P", 3, Y0 + P * sy - 5);
 
         context.fillText("-P", 3, Y0 + P * sy - 5);
         var dX = 0, dY = 0;
+
         if (SLJ_flag)
        if (ac < 1.2)  { dX = 13; dY = 17; }         
+
{
        if (ac > 2.38) { dX = 0;  dY = 19; }
+
var dX = 13, dY = 17;
        context.fillText("a", ac * sx - 10 + dX, Y0 - 4 + dY);
+
if (ac > 1.2)  { dX = 0; dY = 0; }         
        context.font = "12px Times";
+
if (ac > 2.38) { dX = 0;  dY = 19; }
        context.fillText("cut", ac * sx + dX, Y0 - 3 + dY);
+
context.fillText("a", ac * sx - 10 + dX, Y0 - 4 + dY);
 +
context.font = "12px Times";
 +
context.fillText("cut", ac * sx + dX, Y0 - 3 + dY);
 +
}
 +
 +
// Графики сил
 +
Graph(F_SLJ, SLJ_flag, 'red');
 +
Graph(F_LJ, LJ_flag, 'black');
 +
}
  
        // График (укороченная сила Леннард-Джонса)
+
// Построение графика функции
        context.strokeStyle = 'red';
+
        context.beginPath();
+
function Graph(F, flag, color)
        for (var x = x_min; x < x_max; x += dx)
+
{
        {
+
if (!flag) return;
            var y = k(x) * f_LJ(x);
+
   
+
context.strokeStyle = color;
            var X = x * sx;            
+
context.beginPath();
            var Y = Y0 - y * sy;  
+
for (var x = x_min; x < x_max; x+=dx)
 +
{
 +
var y = F(x);
 +
var X = x * sx;  
 +
var Y = Y0 - y * sy;  
  
            if (x == x_min) context.moveTo(X, Y);
+
if (Y > -Y_max) context.lineTo(X, Y); // Графика, сильно выходящяя за границы области, отключается
            else            context.lineTo(X, Y);
+
}
        }
+
context.stroke();
        context.stroke();      
+
}
 
+
        // График (полная сила Леннард-Джонса)
+
    // Потенциал Леннард-Джонса
        context.strokeStyle = 'black';
+
   
        context.beginPath();
+
    function U_LJ(r)
        for (var x = x_min; x < x_max; x+=dx)
+
    {
         {
+
         var s2 = 1 / (r * r);
            var y = f_LJ(x);
+
        var s6 = s2 * s2 * s2;
           
+
         return D * s6 * (s6 - 2);
            var X = x * sx;
+
     }  
            var Y = Y0 - y * sy;
+
 
+
// Сила Леннард-Джонса
            if (x == x_min) context.moveTo(X, Y);
 
            else            context.lineTo(X, Y);
 
         }
 
        context.stroke();
 
     }
 
 
 
    // Сила Леннард-Джонса
 
 
      
 
      
     function f_LJ(r)
+
     function F_LJ(r)
 
     {
 
     {
 
         var s2 = 1 / (r * r);
 
         var s2 = 1 / (r * r);
Строка 150: Строка 175:
 
         return P0 * s4 * s4 * (s4 * s2 - 1) * r;
 
         return P0 * s4 * s4 * (s4 * s2 - 1) * r;
 
     }
 
     }
+
     // Сглаживающий коэффициент
+
// Укороченная сила Леннард-Джонса
 +
   
 +
    function F_SLJ(r)
 +
     {
 +
        return k(r) * F_LJ(r);
 +
    }
 +
 
 +
// Сглаживающий коэффициент
 
   
 
   
 
     function k(x)
 
     function k(x)
Строка 162: Строка 194:
 
         return (1 - z2) * (1 - z2);
 
         return (1 - z2) * (1 - z2);
 
     }
 
     }
 +
 
}
 
}
 
</source>
 
</source>
Строка 170: Строка 203:
 
<head>
 
<head>
 
     <meta charset="UTF-8" />
 
     <meta charset="UTF-8" />
     <title>SLJ</title>
+
     <title>Short Lennard-Jones Interaction (SLJ)</title>
 
     <script src="SLJ.js"></script>
 
     <script src="SLJ.js"></script>
 
</head>
 
</head>
Строка 176: Строка 209:
 
     <canvas id="canvasGraph" width="800" height="400" style="border:1px solid #000000;"></canvas>
 
     <canvas id="canvasGraph" width="800" height="400" style="border:1px solid #000000;"></canvas>
  
 +
<!--Выбор графика (чекбоксы)-->
 +
<div>
 +
        Сила взаимодействия Леннард-Джонса:
 +
<font color="#000000" size="5"><B>—</B></font>
 +
<input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>классическая,
 +
        <font color="#ff0000" size="5"><B>—</B></font>
 +
<input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>укороченная
 +
    </div>
 +
 +
    <!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
 
     <div>
 
     <div>
        Сила Леннард-Джонса: <BR>
+
         <font face= "Times New Roman">
         <font color="#000000" size="5"><B>—</B></font> полная (LJ)<BR>
+
Радиус обрезания:
        <font color="#ff0000" size="5"><B>—</B></font> укороченная (SLJ)<BR>
+
<I>a</I><SUB>cut</SUB> = <input id="Text_01" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
    </div>
 
 
 
    <!--слайдер-->
 
    <div>Радиус обрезания:
 
        <input type="range" id="acSlider" style="width: 150px;" oninput="app.set_ac(this.value); document.getElementById('acText').value = this.value;">
 
        <font face= "Times New Roman"><I>a</I><SUB>cut</SUB> =
 
        <input id="acText" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
 
 
             // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 
             // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 
             if (!this.checkValidity()) return;
 
             if (!this.checkValidity()) return;
             app.set_ac(this.value);
+
             app.set_01(this.value);
             document.getElementById('acSlider').value = this.value;
+
             document.getElementById('Slider_01').value = this.value;
         ">
+
         ">  
    <I>a</I></font></div>
+
<input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
    <br>
+
</font>
 +
</div>
 
      
 
      
    <script type="text/javascript">var app = new MainSLJ(document.getElementById('canvasGraph'),
+
<script type="text/javascript">var app = new MainSLJ(
            document.getElementById('acSlider'), document.getElementById('acText'));</script>
+
document.getElementById('canvasGraph')
 +
);</script>
  
    <div style="clear:both;"></div>
 
 
</body>
 
</body>
 
</html>  
 
</html>  

Версия 05:45, 18 мая 2014

Кафедра ТМ > Научный справочник > Потенциалы взаимодействия > Парные силовые > Укороченное взаимодействие Леннард-Джонса


Укороченное взаимодействие Леннард-Джонса (SLJ) определяется на основе силы взаимодействия Леннард-Джонса с применением коэффициента, плавно ограничивающего взаимодействие — см. интерактивный график ниже (перемещая слайдер проследите изменение радиуса обрезания).

<addscript src=SLJ/>

Не удается найти HTML-файл SLJ_TM.html
Текст программы построения графиков на языке JavaScript: <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "SLJ.js"

// Укороченное взаимодействий Леннард-Джонса 
// Short Lennard-Jones (SLJ) interaction
// Разработчик А.М. Кривцов 
// 17.05.2014 
// Интернет: tm.spbstu.ru/SLJ

function MainSLJ(canvas) {

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

	const X_max = canvas.width;
 	const Y_max = canvas.height;
	
    // Размерные параметры
    
    const a = 1.;    // длина связи
    const D = 1.;    // энергия связи

    // Расчет констант взаимодействия

    const b = a * Math.pow(13./7, 1./6);    // положение минимума силы Леннард-Джонса (= 1.1086834 a)
    const b2 = b * b;
    const P0 = 12 * D / a;                  // коэффициент в выражении для силы Леннард-Джонса
    const P = 42. / 169 * P0 / b;           // модуль минимума силы Леннард-Джонса

	// Переменные параметры взаимодействия
	
	var ac;   								// радиус обрезания взаимодействия

	var ac2;								// квадрат ac
	
    // Задание начальных значений параметров
   
	set_ac(1.4 * a);

    // Область построения графика
    const x_min = 0.9 * a;  
    const x_max = 2.5 * a;
    const y_min = -1.2 * P;    
    const y_max = 2 * P;      

 	const N = X_max;                 	// число точек по оси x
	const dx = x_max / N;            	// шаг по оси x
	const sx = X_max / x_max;        	// масштаб по оси x

	var sy; 							// масштаб по оси y
	var Y0;  							// положение 0 оси y в экранных координатах
	var context;  						// на context происходит рисование

	// Установка флажков чекбоксов
	var LJ_flag = true;
	var SLJ_flag = true;

    // настройка слайдеров и текстовых полей
 
	Slider_01.min = 1.11 * a;       		// лучше было бы взять acSlider.min = b, но b не кратно значению acSlider.step, что портит слайдер
    Slider_01.max = x_max;
    Slider_01.step = 0.01 * a;
    Slider_01.value = ac;     	
    Text_01.value = ac;
	
	draw();

    // функция, запускающаяся при перемещении слайдера
    this.set_01 = function(input) { set_ac(input);	draw(); }  
    
	// Функции, запускающиеся при изменении элементов управления
    this.setCheckbox_01 = function(bool) {LJ_flag = bool; 	 draw(); }
	this.setCheckbox_02 = function(bool) {SLJ_flag = bool; 	 draw(); }	

	function set_ac(value)
	{
		ac = Number(value);
		ac2 = ac * ac;	
	}

	// Отображение
	
	function draw() 
	{ 
	   // Расчет параметров графики
		
		sy = Y_max / (y_max - y_min); 			// масштаб по оси y
		Y0 = Y_max + y_min * sy;  				// положение 0 оси y в экранных координатах

		context = canvas.getContext("2d");  	// на context происходит рисование

		context.clearRect(0, 0, X_max, Y_max); 	// очистить экран
        
        // Горизонтальная ось
        context.strokeStyle = 'lightgrey';
        context.beginPath();
        context.moveTo(0, Y0);
        context.lineTo(X_max, Y0);
        context.stroke();

        // Пунктирные линии
        context.beginPath();
        context.setLineDash([5]);
        context.moveTo(b * sx, Y0);
        context.lineTo(b * sx, Y0 + P * sy);
        context.lineTo(0,      Y0 + P * sy);
        context.stroke();
        context.setLineDash([0]);

        // Надписи
        context.fillStyle = 'black';
        context.font = "italic 20px Times";
        context.fillText("r", x_max * sx - 15, Y0 - 7);
        context.fillText("F", 5, 20);
        context.fillText("0", 3, Y0 - 3);
        context.fillStyle = 'grey';
        context.fillText("a", a * sx + 3, Y0 - 3);
        context.fillText("b", b * sx - 3, Y0 - 3);
        context.fillText("-P", 3, Y0 + P * sy - 5);
        if (SLJ_flag)
		{
			var dX = 13, dY = 17;
			if (ac > 1.2)  { dX = 0; dY = 0; }        
			if (ac > 2.38) { dX = 0;  dY = 19; }
			context.fillText("a", ac * sx - 10 + dX, Y0 - 4 + dY);
			context.font = "12px Times";
			context.fillText("cut", ac * sx + dX, Y0 - 3 + dY);
		}
		
		// Графики сил
		Graph(F_SLJ, 	SLJ_flag, 	'red');
		Graph(F_LJ, 	LJ_flag, 	'black');
	}

	// Построение графика функции
	
	function Graph(F, flag, color)
	{
		if (!flag) return;
		
		context.strokeStyle = color;
		context.beginPath();
		for (var x = x_min; x < x_max; x+=dx)
		{
			var y = F(x);
			var X = x * sx; 
			var Y = Y0 - y * sy; 

			if (Y > -Y_max) context.lineTo(X, Y);	// Графика, сильно выходящяя за границы области, отключается
		}
		context.stroke();
	}	
	
    // Потенциал Леннард-Джонса
    
    function U_LJ(r)
    {
        var s2 = 1 / (r * r);
        var s6 = s2 * s2 * s2;
        return D * s6 * (s6 - 2);
    }    
	
	// Сила Леннард-Джонса
    
    function F_LJ(r)
    {
        var s2 = 1 / (r * r);
        var s4 = s2 * s2;
        return P0 * s4 * s4 * (s4 * s2 - 1) * r;
    }
	
	// Укороченная сила Леннард-Джонса
    
    function F_SLJ(r)
    {
        return k(r) * F_LJ(r);
    }

	// Сглаживающий коэффициент
 
    function k(x)
    {
        if (x > ac) return 0; 
        if (x < b) return 1; 

        var z = (x * x - b2) / (ac2 - b2)
        var z2 = z * z;
        return (1 - z2) * (1 - z2);
    }

}

Файл "SLJ.html"

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Short Lennard-Jones Interaction (SLJ)</title>
    <script src="SLJ.js"></script>
</head>
<body>
    <canvas id="canvasGraph" width="800" height="400" style="border:1px solid #000000;"></canvas>

 	<!--Выбор графика (чекбоксы)-->
	<div>
        Сила взаимодействия Леннард-Джонса:
		<font color="#000000" size="5"><B></B></font>
		<input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>классическая,
        <font color="#ff0000" size="5"><B></B></font>
		<input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>укороченная
    </div>	

    <!--Установка параметров взаимодействия (текстовые поля и слайдеры)-->
    <div>
        <font face= "Times New Roman">
		Радиус обрезания:
		<I>a</I><SUB>cut</SUB> = <input id="Text_01" style="width: 4.2ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
            // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
            if (!this.checkValidity()) return;
            app.set_01(this.value);
            document.getElementById('Slider_01').value = this.value;
        "> 
		<input type="range" id="Slider_01" style="width: 100px;" oninput="app.set_01(this.value); document.getElementById('Text_01').value = this.value;">
		</font>
	</div>
    
	<script type="text/javascript">var app = new MainSLJ(
		document.getElementById('canvasGraph')
	);</script>

</body>
</html>

</toggledisplay>


Сила взаимодействия определяется формулой [math] F(r) = k(r)F_{LJ}(r)[/math], где [math]F_{LJ}(r)[/math] — сила Леннард-Джонса, [math]k(r)[/math] — сглаживающий коэффициент:


[math] k(r) = \left\{ \begin{array}{ll} 1, \qquad & r\le b; \\ \displaystyle \left(1-\left(\frac{r^2-b^2}{a_{\rm cut}^2-b^2}\right)^2\right), \qquad & b\lt r\le a_{\rm cut}; \\ 0, \qquad & r \gt a_{\rm cut}; \\ \end{array} \right. [/math]


[math] F_{LJ} = \frac{12D}{a}\left[\left(\frac a r\right)^{13}-\left(\frac a r\right)^{7}\right]. [/math]


Здесь [math]b = \sqrt[6]{\frac{13}7}\,a[/math] — расстояние, на котором реализуется минимальное значение силы Леннард-Джонса (расстояние разрыва связи), [math]a_{\rm cut}[/math] — радиус обрезания взаимодействия.


Подробнее см. стр. 40 в книге


Данное взаимодействие является частным случаем хрупкого взаимодействия Леннард-Джонса, впервые предложенного в работе