Vit Nhoc писал(а): ↑Чт июн 08, 2023 4:49 pm
Третий вариант мне кажется предпочтительным, но тогда, возможно, надо будет добавить ещё одну опцию: обратное преобразование координат назад, т.е. обратное тому, которое было когда мы помещали плоскость на xy. Это надо добавить опцию к меню Edit/Translate atomic coordinates, чтобы вращать/транслировать молекулу по матрице 4*3, и построить обратную матрицу той, что использовалась для этого помещения плоскости на xy. Надеюсь я понятно объяснил.
Если честно то я понял плохо.
Но если есть уже закодированный трансформатор координат то на мой взгляд можно сделать так:
- Пользователь вводит индексы L,M,N и толщину среза D (эту букву мы кажется еще не использовали) и размер вакуума E
(опционально можно еще "сдвиг от низа" F с дефолтом в 1 ангстрем, но это я уже украшательством занимаюсь)
- программа генерирует большой supercell (мне кажется 6x6x6 должно хватать, но можно и больше)
- программа вставляет 3 dummy atoms согласно координатам X1=[1/L,0,0], X2=[0,1/M,0], X3=[0,0,1/N], если какая то из этих точек невозможна ввиду деления на ноль то она заменяется на дубль существующей точки сдвинутой на вектор вдоль которого "ноль". То есть для среза 0 1 0 будет построена одна "реальная" точка 0,b,0 , а также ее дубли a,b,0 и 0,b,c. Я даю фракционные координаты, в случае ортогональной ячейки фракционные нули это и декартовы нули, в случае неортогональных ячеек - первая цифра второго думми и первые две цифры третьего думми могут быть и ненулями в декартовых координатах)
- проводится поворот всего таким манером, чтобы 3 заданные точки лежали в плоскости x,y
Теперь продолжение нашей задачи - после нарезки у нас должно получиться PBC (ок, двухмерное), то есть нам надо опознать направления и длины векторов. К счастью когда мы обозначили 3 dummy atoms - это углы нашей ячейки (3 из 4 на одной стороне, а сторона ячейки - параллелограмм).
- находим расстояния между каждой парой точек X1-X2, X1-X3, X2-X3, выбираем два наименьших. Это будут длины наших векторов. Тот атом который попал в оба вектора я буду далее называть главным X
главн. Два другие dummy это X
ближн и X
дальн. Этот шаг независим от предыдущего и может быть сделан до него.
- проводится поворот всего вокруг оси z таким манером чтобы X
главн и X
дальн лежали на оси x (этот поворот может быть совмещен с предыдущим поворотом)
- проводится смещение всего таким манером чтобы X
главн попал
в начало координат в точку 0,0,D (чисто чтобы потом лишний раз не таскать)
Порядок поворотов не играет роли.
теперь мы можем сказать что Lattice vectors если без вакуума у нас такие:
a - координаты X
дальн с нулем по z
b - координаты X
ближн с нулем по z
с - 0.0 0.0 D
Изначально я здесь прописал алгоритм с созданием всех углов параллелограмма, но потом решил что нафиг надо и можно решить проще.
- создается четвертый угол параллелограмма (это дубликат точки Xближн сдвинутый вдоль оси x на длину "длинного" вектора (Xглавн-Xдальн)
- создаются еще 4 угла - дубликаты имеющихся точек, смещенные на -D вдоль оси z, то есть лежащие в плоскости x-y
теперь у нас есть параллелепипед и нам просто нужно удалить все атомы которые не попали вовнутрь.
Если делать это в декартовых координатах то начало вроде бы простое:
1) удаляем все атомы ниже плоскости xy (те у кого координата z меньше чем 0-погрешность)
2) удаляем все атомы выше D (те у кого координата z выше чем D-погрешность)
но с остальных 4 сторон это в случае неортогональной ячейки не так просто, можно конечно повращать ячейку и пообрубать тупо по декартовым координатам, но как альтернатива:
- перегоняем все координаты в фракционные (Lattice vectors прописали выше) и тупо обрубаем всех кто не попал в диапазон от (0-погрешность) до (1-погрешность) по любой координате
Теперь у нас есть все нужные нам атомы, и есть ячейка, но нет вакуумного зазора, ну так это ж очень просто:
- возвращаем атомы из фракционных в декартовы
- переписываем в Lattice vectors последнюю строку как
с - 0.0 0.0 D
+E
- Bingo, Вы прекрасны!
Наверняка это можно сделать математически изящнее или программисстки менее убого, но программист из меня
так что это чтото по типу общей блоксхемы.
P.S. по сути получилось что все нужные модули в Chemcraft уже есть, их нужно только правильно скомпоновать