Skip to content

Commit

Permalink
Added dftu and starting mag reading
Browse files Browse the repository at this point in the history
  • Loading branch information
louisponet committed Jul 19, 2021
1 parent db421a0 commit 4d3c0c3
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 6 deletions.
4 changes: 2 additions & 2 deletions src/atom.jl
Expand Up @@ -172,10 +172,10 @@ function set_magnetization!(at::AbstractAtom, mag; print = true)
return print && @info "Magnetization of at $(name(at)) was set to $(magnetization(at))"
end

function set_magnetization!(str::Structure, atsym_mag::Pair{Symbol,<:AbstractVector}...)
function set_magnetization!(str::Structure, atsym_mag::Pair{Symbol,<:AbstractVector}...; kwargs...)
for (atsym, mag) in atsym_mag
for at in str[atsym]
set_magnetization!(at, mag)
set_magnetization!(at, mag; kwargs...)
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions src/fileio.jl
Expand Up @@ -12,8 +12,8 @@ function parse_file(filename::AbstractString, parse_funcs::Vector{<:Pair{String}
func === nothing && continue
try
func[2](out, line, f)
catch
@warn "File corruption or parsing error detected.\nTrying to continue smoothly."
catch
@warn "File corruption or parsing error detected executing parse function $(func[2]).\nTrying to continue smoothly."
end
end
end
Expand Down
60 changes: 58 additions & 2 deletions src/qe/fileio.jl
Expand Up @@ -387,6 +387,34 @@ function qe_parse_timing(out, line, f)
end
end

function qe_parse_starting_magnetization(out, line, f)
readline(f)
out[:starting_magnetization] = Dict{Symbol, Vec3}()
line = readline(f)
while !isempty(line)
sline = split(line)
atsym = Symbol(sline[1])
mag = parse.(Float64, sline[2:end])
out[:starting_magnetization][atsym] = length(mag) == 1 ? Vec3(0.0, 0.0, mag[1]) : Vec3(mag...)
line = readline(f)
end
end

function qe_parse_starting_simplified_dftu(out, line, f)
readline(f)
out[:starting_simplified_dftu] = Dict{Symbol, DFTU}()
line = readline(f)
while !isempty(line)
sline = split(line)
atsym = Symbol(sline[1])
L = parse(Int, sline[2])
vals = parse.(Float64, sline[3:end])
out[:starting_simplified_dftu][atsym] = DFTU{Float64}(l = L, U = vals[1], α=vals[2], J0=vals[3], β=vals[4])
line = readline(f)
end
end


const QE_PW_PARSE_FUNCTIONS = ["C/m^2" => qe_parse_polarization,
"lattice parameter" => qe_parse_lattice_parameter,
"number of Kohn-Sham states" => qe_parse_n_KS,
Expand Down Expand Up @@ -419,7 +447,10 @@ const QE_PW_PARSE_FUNCTIONS = ["C/m^2" => qe_parse_polarization,
"Begin final coordinates" => (x, y, z) -> x[:converged] = true,
"atom number" => qe_parse_magnetization,
"--- enter write_ns ---" => qe_parse_Hubbard,
"init_run" => qe_parse_timing]
"init_run" => qe_parse_timing,
"Starting magnetic structure" => qe_parse_starting_magnetization,
"Simplified LDA+U calculation" => qe_parse_starting_simplified_dftu,
]

"""
qe_read_pw_output(filename::String; parse_funcs::Vector{Pair{String}}=Pair{String,<:Function}[])
Expand All @@ -446,6 +477,19 @@ function qe_read_pw_output(filename::String;
tmp_flags[:A] = out[:in_alat]
out[:initial_structure] = extract_structure!("initial", tmp_flags, cell_data,
out[:atsyms], atoms_data, pseudo_data)
# Add starting mag and DFTU
if haskey(out, :starting_magnetization)
set_magnetization!(out[:initial_structure], pairs(out[:starting_magnetization])...; print=false)
end
if haskey(out, :starting_simplified_dftu)
dftus = out[:starting_simplified_dftu]
for (atsym, dftu) in dftus
for a in out[:initial_structure][atsym]
a.dftu = dftu
end
end
end

end

# Process final Structure
Expand All @@ -463,6 +507,18 @@ function qe_read_pw_output(filename::String;
atoms_data = InputData(:atomic_positions, out[:pos_option], out[:atomic_positions])
out[:final_structure] = extract_structure!("final", tmp_flags, cell_data,
out[:atsyms], atoms_data, pseudo_data)
# Add starting mag and DFTU
if haskey(out, :starting_magnetization)
set_magnetization!(out[:initial_structure], pairs(out[:starting_magnetization])...; print=false)
end
if haskey(out, :starting_simplified_dftu)
dftus = out[:starting_simplified_dftu]
for (atsym, dftu) in dftus
for a in out[:initial_structure][atsym]
a.dftu = dftu
end
end
end
end

#process bands
Expand Down Expand Up @@ -505,7 +561,7 @@ function qe_read_pw_output(filename::String;
for f in
(:in_cart_positions, :in_alat, :in_cryst_positions, :alat, :pos_option, :pseudos,
:cell_parameters, :in_recip_cell, :scf_converged, :atsyms, :nat, :k_eigvals,
:k_cryst, :k_cart)
:k_cryst, :k_cart, :starting_simplified_dftu, :starting_magnetization)
pop!(out, f, nothing)
end
return out
Expand Down

0 comments on commit 4d3c0c3

Please sign in to comment.