-
Notifications
You must be signed in to change notification settings - Fork 4
/
simulations.jl
101 lines (81 loc) · 3.8 KB
/
simulations.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using Unitful: @u_str
using UnitfulAtomic: austrip, auconvert
using .Calculators: AbstractCalculator, Calculator
using NQCModels: Model
abstract type AbstractSimulation{M} end
Base.broadcastable(sim::AbstractSimulation) = Ref(sim)
struct Simulation{M,Calc,T,Ttype,C} <: AbstractSimulation{M}
temperature::Ttype
cell::C
atoms::Atoms{T}
calculator::Calc
method::M
end
"""
Simulation(atoms::Atoms{T}, model::Model, method::M;
temperature=0u"K", cell::AbstractCell=InfiniteCell()) where {M,S,T}
Simulation parameters that controls the types of atoms, interactions,
dynamics method, temperature and simulation cell.
"""
function Simulation(atoms::Atoms{T}, model::Model, method::M;
temperature=0u"K", cell::AbstractCell=InfiniteCell()) where {M,T}
calc = Calculator(model, length(atoms), T)
Simulation(temperature, cell, atoms, calc, method)
end
struct RingPolymerSimulation{M,Calc,T,Ttype,C,B} <: AbstractSimulation{M}
temperature::Ttype
cell::C
atoms::Atoms{T}
calculator::Calc
method::M
beads::B
end
function RingPolymerSimulation(temperature, cell::AbstractCell,
atoms::Atoms{T}, model::Model, method::M,
n_beads::Integer, quantum_nuclei::Vector{Symbol}) where {M,T}
if isempty(quantum_nuclei)
beads = RingPolymers.RingPolymerParameters{T}(n_beads, get_temperature(temperature), length(atoms))
else
beads = RingPolymers.RingPolymerParameters{T}(n_beads, get_temperature(temperature), atoms.types, quantum_nuclei)
end
calc = Calculator(model, length(atoms), n_beads, T)
RingPolymerSimulation(temperature, cell, atoms, calc, method, beads)
end
function RingPolymerSimulation(atoms::Atoms, model::Model, method::M, n_beads::Integer;
temperature=0,
cell::AbstractCell=InfiniteCell(), quantum_nuclei::Vector{Symbol}=Symbol[]) where {M}
RingPolymerSimulation(temperature, cell, atoms, model, method, n_beads, quantum_nuclei)
end
NQCModels.nstates(sim::AbstractSimulation) = NQCModels.nstates(sim.calculator)
NQCModels.eachstate(sim::AbstractSimulation) = NQCModels.eachstate(sim.calculator)
NQCModels.nelectrons(sim::AbstractSimulation) = NQCModels.nelectrons(sim.calculator)
NQCModels.eachelectron(sim::AbstractSimulation) = NQCModels.eachelectron(sim.calculator)
NQCModels.mobileatoms(sim::AbstractSimulation) = NQCModels.mobileatoms(sim.calculator)
NQCModels.dofs(sim::AbstractSimulation) = NQCModels.dofs(sim.calculator)
NQCModels.fermilevel(sim::AbstractSimulation) = NQCModels.fermilevel(sim.calculator)
NQCModels.ndofs(sim::AbstractSimulation) = NQCModels.ndofs(sim.calculator.model)
natoms(sim::AbstractSimulation) = length(sim.atoms)
RingPolymers.nbeads(sim::RingPolymerSimulation) = RingPolymers.nbeads(sim.beads)
masses(sim::AbstractSimulation) = sim.atoms.masses
masses(sim::AbstractSimulation, i::Int) = sim.atoms.masses[i]
function masses(sim::AbstractSimulation, I::CartesianIndex)
masses(sim, I[2])
end
Base.size(sim::Simulation) = (ndofs(sim), natoms(sim))
Base.size(sim::RingPolymerSimulation) = (ndofs(sim), natoms(sim), RingPolymers.nbeads(sim))
function get_temperature(sim::AbstractSimulation, t::Real=0)
t = auconvert(u"fs", t)
get_temperature(sim.temperature, t)
end
get_temperature(temperature::Number, t=0) = austrip(temperature)
get_temperature(temperature::Function, t=0) = austrip(temperature(t))
function get_ring_polymer_temperature(sim::RingPolymerSimulation, t::Real=0)
return get_temperature(sim, t) * nbeads(sim)
end
function Base.show(io::IO, sim::Simulation{M}) where {M}
print(io, "Simulation{$M}:\n ", sim.atoms, "\n ", sim.calculator.model)
end
function Base.show(io::IO, sim::RingPolymerSimulation{M}) where {M}
print(io, "RingPolymerSimulation{$M}:\n\n ", sim.atoms, "\n\n ", sim.calculator.model,
"\n with ", length(sim.beads), " beads.")
end