Size: a a a

Язык программирования Julia / Julia programming language

2020 January 20

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Viktor Maslov
n = 1
atoms = []
for i = -n:n
   for j = -n:n
       for k = -n:n
           push!(atoms, (a1 .+ [i j k]));
           push!(atoms, (a2 .+ [i j k]));
           push!(atoms, (a3 .+ [i j k]));
           push!(atoms, (a4 .+ [i j k]));
           push!(atoms, (a5 .+ [i j k]));
           push!(atoms, (a6 .+ [i j k]));
           push!(atoms, (a7 .+ [i j k]));
           push!(atoms, (a8 .+ [i j k]));
           push!(atoms, (a9 .+ [i j k]));
           push!(atoms, (a10 .+ [i j k]));
           push!(atoms, (a11 .+ [i j k]));
           push!(atoms, (a12 .+ [i j k]));
           push!(atoms, (a13 .+ [i j k]));
           push!(atoms, (a14 .+ [i j k]));
           push!(atoms, (a15 .+ [i j k]));
           push!(atoms, (a16 .+ [i j k]));
           push!(atoms, (a17 .+ [i j k]));
           push!(atoms, (a18 .+ [i j k]));
           push!(atoms, (a19 .+ [i j k]));
           push!(atoms, (a20 .+ [i j k]));
           push!(atoms, (a21 .+ [i j k]));
           push!(atoms, (a22 .+ [i j k]));
           push!(atoms, (a23 .+ [i j k]));
           push!(atoms, (a24 .+ [i j k]));
           push!(atoms, (a25 .+ [i j k]));
           push!(atoms, (a26 .+ [i j k]));
           push!(atoms, (a27 .+ [i j k]));
           push!(atoms, (a28 .+ [i j k]));
           push!(atoms, (a29 .+ [i j k]));
           push!(atoms, (a30 .+ [i j k]));
           push!(atoms, (a31 .+ [i j k]));
           push!(atoms, (a32 .+ [i j k]));
           push!(atoms, (a33 .+ [i j k]));
           push!(atoms, (a34 .+ [i j k]));
           push!(atoms, (a35 .+ [i j k]));
           push!(atoms, (a36 .+ [i j k]));
       end
   end
end
atoms = vcat(atoms...)
unit_cell = similar(atoms); mul!(unit_cell, atoms, M1);
unit_cell = round.(unit_cell, digits = 5)
unit_cell = unique(unit_cell, dims = 1)
unit_cell[.!((-a1 .< unit_cell[:, 1] .< a1) .| (-b1 .< unit_cell[:, 2] .< b1) .| (-c1 .< unit_cell[:, 3] .< c1)), :]
у меня есть подозрение, что без предварительного выделения памяти, push! внутри цикла будет очень не быстро работать
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Roman Samarev
у меня есть подозрение, что без предварительного выделения памяти, push! внутри цикла будет очень не быстро работать
здесь непринципиально. Необходимо только +-1 по x y z сделать
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Ахахаха
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
1. a1 = [x y z] + T1
2. unit_cell[.!((-a1 .< unit_cell[:, 1] .< a1)
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Андрей Оськин
1. a1 = [x y z] + T1
2. unit_cell[.!((-a1 .< unit_cell[:, 1] .< a1)
вот блин...
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Слишком умная Julia смогла проглотить эту конструкцию.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Видимо немного удивилась по дороге.
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Но вообще, все эти a... конечно так и просятся, чтобы их в виде каких-то красивых теоретикогрупповых конструкций переписали.
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Андрей Оськин
Но вообще, все эти a... конечно так и просятся, чтобы их в виде каких-то красивых теоретикогрупповых конструкций переписали.
Попробовать, конечно, можно, но это впринципе элемменты симметрии и по сути литературные данные.
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Андрей Оськин
Но вообще, все эти a... конечно так и просятся, чтобы их в виде каких-то красивых теоретикогрупповых конструкций переписали.
Они у меня в другом куске переназваны уже - это проверочный файл. и это конечно эпик фэйл
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Такой код будет очень трудно поддерживать имхо.

Нужно как обычно от типов плясать.
Т.е. есть тип АбстрактнаяРешётка, от неё наследуются решётки конкретные, для каждого типа решётки прописывается своя функция get_symmetries или вроде того
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Kirill Tsaregorodtsev
т.е. у меня там обёртки всякие над Tuple, и я их применяю и получаю Tuple той же длины, что и внутри обёртки был
Я не совсем правильно сказал, она и в самом деле на длину ругается.
Но с другой стороны, её можно понять: Tuple(Iterators.take(1:100, 5)) <- тут уже надо знать, что результат применения take изменит длину 1:100. То есть такую штуку можно поймать только во время исполнения кода, а не на этапе компиляции.

Вот он и пишет Vararg - буквально и есть "лови значение в момент исполнения программы"
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Причём эта иерархия решёток должна быть ещё подразделена на куски абстрактных решёток, потому что у некоторых решёток есть общие симметрии
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Kirill Tsaregorodtsev
Такой код будет очень трудно поддерживать имхо.

Нужно как обычно от типов плясать.
Т.е. есть тип АбстрактнаяРешётка, от неё наследуются решётки конкретные, для каждого типа решётки прописывается своя функция get_symmetries или вроде того
Ну так и предполагалось примерно. У меня просто не получилось так легко все с Scilab переписать как изначально задумывалось
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Kirill Tsaregorodtsev
Причём эта иерархия решёток должна быть ещё подразделена на куски абстрактных решёток, потому что у некоторых решёток есть общие симметрии
Да и их довольно много. По сути в каждой сингонии более высокосимметричные группы заимствуют у менеесимметричных элементы симметрии
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
unit_cell[.!((-a .< unit_cell[:, 1] .< a) .| (-b .< unit_cell[:, 2] .< b) .| (-c .< unit_cell[:, 3] .< c)), :]
и все было бы хорошо если бы эта конструкция выполнила свое предназначение и убрала бы ненужные элементы
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
На самом деле выглядит так, что тебе порядок точек не сильно важен, да?
источник

VM

Viktor Maslov in Язык программирования Julia / Julia programming language
Андрей Оськин
На самом деле выглядит так, что тебе порядок точек не сильно важен, да?
Порядок вообще пока не важен
источник

RS

Roman Samarev in Язык программирования Julia / Julia programming language
Viktor Maslov
перед n

M = [a b*cosd(gamma) c*cosd(beta); 0 b*sind(gamma) (c/sind(gamma))*(cosd(alpha)-cosd(beta)*cosd(gamma)); 0 0 (c*((1-cosd(alpha)^2 - cosd(beta)^2 - cosd(gamma)^2 + (2)*cosd(alpha)* cosd(beta)* cosd(gamma))^0.5))/(sind(gamma))]
M1 = M .* abc
T1 = [0 0 0]
T2 = [0 0 0.5]
T3 = ([0 0 0] + [2/3 1/3 1/3]) - floor.([0 0 0] + [2/3 1/3 1/3])
T4 = ([0 0 0.5] + [2/3 1/3 1/3]) - floor.([0 0 0.5] + [2/3 1/3 1/3])
T5 = ([0 0 0] + [1/3 2/3 2/3]) - floor.([0 0 0] + [1/3 2/3 2/3])
T6 = ([0 0 0.5] + [1/3 2/3 2/3]) - floor.([0 0 0.5] + [1/3 2/3 2/3])
a1 = [x y z] + T1
a2 = [-y x - y z] + T1
a3 = [-x + y -x z] + T1
a4 = [y x -z] + T2
a5 = [x - y -y -z] + T2
a6 = [-x -x + y  -z] + T2
a7 = [-x  -y  -z] + T1
a8 = [y  -x + y  -z] + T1
a9 = [x - y  x  -z] + T1
a10 = [-y  -x  z] + T2
a11 = [-x + y  y  z] + T2
a12 = [x  x - y  z] + T2
a13 = [x  y  z] + T3
a14 = [-y  x - y  z] + T3
a15 = [-x + y  -x  z] + T3
a16 = [y  x  -z] + T4
a17 = [x - y  -y  -z] + T4
a18 = [-x  -x + y  -z] + T4
a19 = [-x  -y  -z] + T3
a20 = [y  -x + y  -z] + T3
a21 = [x - y  x  -z] + T3
a22 = [-y  -x  z] + T4
a23 = [-x + y  y  z] + T4
a24 = [x  x - y  z] + T4
a25 = [x  y  z] + T5
a26 = [-y  x - y  z] + T5
a27 = [-x + y  -x  z] + T5
a28 = [y  x  -z] + T6
a29 = [x - y  -y  -z] + T6
a30 = [-x  -x + y  -z] + T6
a31 = [-x  -y  -z] + T5
a32 = [y  -x + y  -z] + T5
a33 = [x - y  x  -z] + T5
a34 = [-y  -x  z] + T6
a35 = [-x + y  y  z] + T6
a36 = [x  x - y  z] + T6
n = 2
a = [0.1, 0.2, 0.3]
a_length = length(a)
indices = CartesianIndices((-n:n, -n:n, -n:n))
atoms = Array{Vector}(undef, length(indices) * a_length)
foreach(indices) do (i, ci)
  base = (i - 1) * a_length
  foreach(enumerate(a)) do (j, av)
     atoms[base + j] = av .+ collect(ci.I)
  end
end


как-то так…..
источник