master
1using DFTK
2
3"""
4A struct to hold all parameters for a simulation.
5"""
6struct SimParams{T<:AbstractFloat}
7 # Configuration
8 case::Symbol
9 Ecut::T
10 kpoints::UnitRange{Int}
11 ε::T
12 δ::T
13 gaussian_factor::T
14
15 # Physics setup
16 lattice::Matrix{T}
17 atoms::Vector{ElementGaussian}
18 positions::Function
19
20 # Derived parameters
21 kgrid::Vector{Int}
22 disregistries::StepRangeLen{T, Base.TwicePrecision{T}, Base.TwicePrecision{T}, Int64}
23 xs::StepRangeLen{T, Base.TwicePrecision{T}, Base.TwicePrecision{T}, Int64}
24 xlims::Tuple{Int, Int}
25end
26
27function gaussian_parameters(p::SimParams)
28 (; α=1.0, p.δ, p.gaussian_factor, δx=step(p.xs))
29end
30
31function get_params(; case::Symbol=:fast, xlims::Tuple{T, T}=(-35.,35.),
32 gaussian_factor::T=0.08) where {T}
33 @show xlims, case, gaussian_factor
34
35 Ecut, kpoints, ε = if case == :full
36 (1e4, 1:1000, 0.001)
37 elseif case == :fast
38 (1e2, 1:2, 0.5)
39 elseif case == :mfast
40 (1e3, 1:8, 0.2)
41 elseif case == :clean
42 # Nice zero-order, huge big shift on end of first-order.
43 # A bit squiggly with low Gaussian factor but acceptable.
44 (1e4, 1:20, 0.01)
45 elseif case == :big
46 (1e4, 1:100, 0.01)
47 elseif case == :huge
48 (1e4, 1:500, 0.002)
49 elseif case == :huge_ecut
50 (5e4, 1:500, 0.002)
51 elseif case == :full
52 (1e4, 1:1000, 0.001)
53 else
54 error("Unknown case: $case")
55 end
56
57 # Common parameters
58 δ = 0.2
59 xs = range(xlims...; step=δ/2)
60 kgrid = [kpoints[end], 1, 1]
61 disregistries = 0:ε:1-ε
62
63 # Model definition
64 unit_cell_length = 1
65 lattice = T.(unit_cell_length .* [1.0 0 0; 0 0 0; 0 0 0])
66 A = T[7.0, 5.0]
67 σ = T(0.05) * ones(T, 2)
68 atoms = [ElementGaussian(Ai, σi) for (Ai, σi) in zip(A, σ)]
69 positions(shift) = [zeros(T, 3), [T(shift), 0.0, 0.0]]
70
71 return SimParams{T}(case, Ecut, kpoints, ε, δ, gaussian_factor,
72 lattice, atoms, positions, kgrid, disregistries,
73 xs, xlims)
74end