Skip to content
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