Материал: FTTLabRab

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

turquose, violet, gray, grey, khaki, wheat, green, red, pink,

tank]

Задаются тройки целых чисел, позволяющие перечислить всех соседей, необходимых для построения зоны Бриллюэна в любой решетке:

> neigh:=[[-1,0,0],[1,0,0],[0,-1,0],[0,1,0],[0,0,-1],[0,0,1],[1,1,1],[-1,-1,-1],[1,1,0],[-1,-1,0],[1,0,1],[-1,0,-1],[0,1,1],[0,-1,-1],[-1,1,0],[1,-1,0],[-1,0,1],[1,0,-1],[0,-1,1],[0,1,-1],[-1,1,1],[1,-1,1],[1,1,-1],[-1,-1,1],[1,-1,-1],[-1,1,-1]].

neigh := [[-1, 0, 0], [1, 0, 0], [0, -1, 0], [0, 1, 0], [0, 0, -1],

[0, 0, 1], [1, 1, 1], [-1, -1, -1], [1, 1, 0], [-1, -1, 0],

[1, 0, 1], [-1, 0, -1], [0, 1, 1], [0, -1, -1], [-1, 1, 0],

[1, -1, 0], [-1, 0, 1], [1, 0, -1], [0, -1, 1], [0, 1, -1],

[-1, 1, 1], [1, -1, 1], [1, 1, -1], [-1, -1, 1], [1, -1, -1],

[-1, 1, -1]]

> for i1 from 1 to 26 do G1:=vector(3,[neigh[i1,1],neigh[i1,2],neigh[i1,3]]): NG[i1]:=0: for i2 from 1 to 26 do G2:=vector(3,[neigh[i2,1],neigh[i2,2],neigh[i2,3]]); for i3 from 1 to 26 do G3:=vector(3,[neigh[i3,1],neigh[i3,2],neigh[i3,3]]);vG:=innerprod(G1,crossprod(G2,G3));if vG<>0 then NG[i1]:=NG[i1]+1;R[i1,NG[i1]]:=node(matadd(matadd(b1,b2,neigh[i1,1],neigh[i1,2]),b3,1,neigh[i1,3]),matadd(matadd(b1,b2,neigh[i2,1],neigh[i2,2]),b3,1,neigh[i2,3]),matadd(matadd(b1,b2,neigh[i3,1],neigh[i3,2]),b3,1,neigh[i3,3]));fi;od:od:od: - вычисляются все точки, которые могут быть вершинами искомого полиэдра. Точки сгруппированы по граням в массиве R[i1,NG[i1]], где первый аргумент задает номер грани, второй - номер точки в данной грани. Вычисление основано на использовании выше написанной процедуры "node". Здесь используются операторы цикла и условный оператор. Недостающую информацию о их свойствах извлеките из "Help".

> for i1 from 1 to 26 do NVert[i1]:=0: for i from 1 to NG[i1] do L:=1; for i2 from 1 to 26 do if (i2<>i1) then G2:=matadd(matadd(b1,b2,neigh[i2,1],neigh[i2,2]),b3,1,neigh[i2,3]); NG2:=norm(G2,2)^2; if (evalf(2*innerprod(R[i1,i],G2)-NG2)>=10^(-5)) then L:=0: fi:fi:od: if (L=1) then NVert[i1]:=NVert[i1]+1;Vertex[i1,NVert[i1]]:=R[i1,i] fi;od:od: - отбраковка вершин полиэдра, которые отсекаются от центральной области хотя бы одной плоскостью.

>l1:=seq(polygon([seq([Vertex[i1,i][1],Vertex[i1,i][2],Vertex[i1,i][3]],i=1..NVert[i1])], color=col[i1],style=patchnogrid, thickness=1),i1=1..14): display(l1,scaling=constrained,axes=boxed); - построение полиэдра. Выясните с использованием Help, что означает функция "seq".

Рисунок 2 - Результат работы программы.

Выполненное построение требует около двух часов работы компьютера с процессором P166 и использует приблизительно 34 мегабайта памяти. Это слишком большая цена, которую приходится платить за удобства написания программы с использованием пакета "Линейная алгебра". Ниже приведен вариант этой же программы, в которой функции пакета используются минимально. Т.е. все векторные операции расписаны покоординатно и выполнены без обращения к функциям пакета. То же самое построение занимает уже не более пяти минут, что вполне приемлимо. Мы не пишем комментарий к этому варианту программы, т.к. она по сути та же самая. Исключение - это последний оператор, с помощью которого осуществляется вращение полиэдра относительно вертикальной оси.

> restart:with(linalg);with(plots);with(plottools);

>a1:=vector(3,[-1/2,1/2,1/2]);a2:=vector(3,[1/2,-1/2,1/2]);a3:=vector(3,[1/2,1/2,-1/2]);va:=innerprod(a1,crossprod(a2,a3));

>a1:=vector(3,[1/2,-sqrt(3)/2,0]);a2:=vector(3,[1/2,sqrt(3)/2,0]); a3:=vector(3,[0,0,1.633]);va:=innerprod(a1,crossprod(a2,a3));

>a1:=vector(3,[0,1/2,1/2]);a2:=vector(3,[1/2,0,1/2]);a3:=vector(3,[1/2,1/2,0]);va:=innerprod(a1,crossprod(a2,a3));

>b1:=scalarmul(crossprod(a2,a3),2*Pi/va);b2:=scalarmul(crossprod(a3,a1),2*Pi/va);b3:=scalarmul(crossprod(a1,a2),2*Pi/va);

>col:=[green,red,pink,purple,yellow,brown,blue,orange,gold,coral,cyan,magenta,navy,maroon,aquamarine,plum,sienna,turquose,violet,gray,grey,khaki,wheat,black,tan,green];

>neigh:=[[-1,0,0],[1,0,0],[0,-1,0],[0,1,0],[0,0,-1],[0,0,1],[1,1,1],[-1,-1,-1],[1,1,0],[-1,-1,0],[1,0,1],[-1,0,-1],[0,1,1],[0,-1,-1],[-1,1,0],[1,-1,0],[-1,0,1],[1,0,-1],[0,-1,1],[0,1,-1],[-1,1,1],[1,-1,1],[1,1,-1],[-1,-1,1],[1,-1,-1],[-1,1,-1]];

>for i1 from 1 to 26 do NG[i1]:=0: for i2 from 1 to 26 do for i3 from 1 to 26 do if (neigh[i1,1]*(neigh[i2,2]*neigh[i3,3]- neigh[i3,2]*neigh[i2,3])+ neigh[i1,2]*(neigh[i3,1]*neigh[i2,3]- neigh[i2,1]*neigh[i3,3])+ neigh[i1,3]*(neigh[i2,1]*neigh[i3,2]-neigh[i3,1]*neigh[i2,2]))<>0 then NG[i1]:=NG[i1]+1;G1x:=neigh[i1,1]*b1[1]+neigh[i1,2]*b2[1]+neigh[i1,3]*b3[1];G1y:=neigh[i1,1]*b1[2]+neigh[i1,2]*b2[2]+neigh[i1,3]*b3[2];G1z:=neigh[i1,1]*b1[3]+neigh[i1,2]*b2[3]+neigh[i1,3]*b3[3]; G2x:=neigh[i2,1]*b1[1]+neigh[i2,2]*b2[1]+neigh[i2,3]*b3[1];G2y:=neigh[i2,1]*b1[2]+neigh[i2,2]*b2[2]+neigh[i2,3]*b3[2];G2z:=neigh[i2,1]*b1[3]+neigh[i2,2]*b2[3]+neigh[i2,3]*b3[3]; G3x:=neigh[i3,1]*b1[1]+neigh[i3,2]*b2[1]+neigh[i3,3]*b3[1];G3y:=neigh[i3,1]*b1[2]+neigh[i3,2]*b2[2]+neigh[i3,3]*b3[2];G3z:=neigh[i3,1]*b1[3]+neigh[i3,2]*b2[3]+neigh[i3,3]*b3[3];A1x:=G2y*G3z-G3y*G2z;A1y:=G3x*G2z-G2x*G3z;A1z:=G2x*G3y-G3x*G2y;A2x:=G3y*G1z-G1y*G3z;A2y:=G1x*G3z-G3x*G1z;A2z:=G3x*G1y-G1x*G3y;A3x:=G1y*G2z-G2y*G1z;A3y:=G2x*G1z-G1x*G2z;A3z:=G1x*G2y-G2x*G1y;v:=2*(G1x*A1x+G1y*A1y+G1z*A1z);r1:=-(G1x^2+G1y^2+G1z^2)/v;r2:=-(G2x^2+G2y^2+G2z^2)/v;r3:=-(G3x^2+G3y^2+G3z^2)/v; R[i1,NG[i1]]:=vector(3,[r1*A1x+r2*A2x+r3*A3x,r1*A1y+r2*A2y+r3*A3y,r1*A1z+r2*A2z+r3*A3z]);fi;od:od:od:

>for i1 from 1 to 26 do NVert[i1]:=0: for i from 1 to NG[i1] do L:=1; for i2 from 1 to 26 do if (i2<>i1) then Gx:=neigh[i2,1]*b1[1]+neigh[i2,2]*b2[1]+neigh[i2,3]*b3[1]: Gy:=neigh[i2,1]*b1[2]+neigh[i2,2]*b2[2]+neigh[i2,3]*b3[2]:Gz:=neigh[i2,1]*b1[3]+neigh[i2,2]*b2[3]+neigh[i2,3]*b3[3]: if (evalf(2*(R[i1,i][1]*Gx+R[i1,i][2]*Gy+R[i1,i][3]*Gz)-Gx^2-Gy^2-Gz^2)>=10^(-5)) then L:=0:i2:=26; fi:fi:od: if (L=1) then NVert[i1]:=NVert[i1]+1;Vertex[i1,NVert[i1]]:=R[i1,i] fi;od:od:

>Face:=0: for i1 from 1 to 26 do if (NVert[i1]<>0) then Face:=Face+1: NODE[Face]:=NVert[i1]: for i from 1 to NVert[i1] do IVertex[Face,i]:=Vertex[i1,i]: od:fi:od:

>l1:=seq(polygon([seq([IVertex[i1,i][1],IVertex[i1,i][2],IVertex[i1,i][3]],i=1..NODE[i1])], color=col[i1],style=patchnogrid, thickness=1),i1=1..Face):display(l1,scaling=constrained,axes=boxed);

l2:=display(l1,scaling=constrained):display(seq(rotate(l2,0,0,J*Pi/10),J=0..20),insequence=true);

3.3 Последовательность операций

  1. Запустить программу Maple V.

  2. Открыть файл Brill.mws.

  3. Задать в строке операторов а1...а3 (вместо звездочек) соответствующие векторы ГЦК решетки.

  4. Установить курсор на команде restart и последовательными нажатиями клавиши Enter запустить выполнение всех частей программы.

  5. Найти и записать вычисленный объем зоны.

  6. Включив анимацию рисунка, рассмотреть и описать форму полученного полиэдра.

  7. Повторить п. 3 - 6 для всех типов решеток.

4 Требования к отчету

Отчет по работе должен содержать: конспект теоретической части, порядок выполнения работы, рисунки элементарных ячеек и значения базисных векторов, рисунок (распечатку) и описание полученных полиэдров и выводы по работе.

Список литературы

1. Жданов Г.С. Физика твердого тела. -М.: МГУ, 1962, -502 с.

  1. Физическое металловедение: в 3-х т., под ред. Кана Р.У., Хаазена П.Т. т.2: М.: Металлургия, 1987, 663 с.

50