Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dispatch materialize #35

Merged
merged 10 commits into from
Feb 20, 2021
22 changes: 11 additions & 11 deletions Manifest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[[AbInitioSoftwareBase]]
deps = ["Configurations", "IsURL", "JSON", "Pkg", "YAML"]
git-tree-sha1 = "7ae139ee9c89fe6e6ec81b28c8692c9e55499293"
git-tree-sha1 = "3a3ac0ec81aaf25f97be132438d03ac293cbc0ab"
repo-rev = "master"
repo-url = "[email protected]:MineralsCloud/AbInitioSoftwareBase.jl.git"
uuid = "df5135bc-470e-46c6-b451-292e27ca5b84"
Expand Down Expand Up @@ -191,17 +191,17 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"

[[Distributions]]
deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns"]
git-tree-sha1 = "5a9a742ae30f13d6172c7ea245988d932134e25b"
git-tree-sha1 = "0fc424e725eaec6ea3e9fa8df773bee18a1ab503"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
version = "0.24.13"
version = "0.24.14"

[[Downloads]]
deps = ["ArgTools", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"

[[EquationsOfStateOfSolids]]
deps = ["AutoHashEquals", "Compat", "Configurations", "ConstructionBase", "InteractiveUtils", "LsqFit", "PolynomialRoots", "Polynomials", "Roots", "Serialization", "UnPack", "Unitful"]
git-tree-sha1 = "52caa9a6a8ad896ba8f590c88e69c0f10ba06736"
git-tree-sha1 = "6cdb7e3b7800750321a0fcd16e523ef1e1c2e9be"
repo-rev = "master"
repo-url = "[email protected]:MineralsCloud/EquationsOfStateOfSolids.jl.git"
uuid = "1eaa2786-f833-4167-8397-974edad0881e"
Expand All @@ -214,7 +214,7 @@ version = "0.1.3"

[[Express]]
deps = ["AbInitioSoftwareBase", "Compat", "Configurations", "Crystallography", "Distributed", "EquationsOfStateOfSolids", "Mustache", "PyQHA", "Serialization", "Setfield", "SimpleWorkflow", "Unitful", "UnitfulAtomic", "UrlDownload"]
git-tree-sha1 = "c46bfa614a53235a776460b62e82d65eba2c2c5d"
git-tree-sha1 = "2db6b7526fe5ce4d3973acfd9eedac98ae300a0b"
repo-rev = "master"
repo-url = "[email protected]:MineralsCloud/Express.jl.git"
uuid = "b12df14e-adf7-11e9-0606-d5813a258349"
Expand All @@ -228,9 +228,9 @@ version = "1.1.0"

[[FillArrays]]
deps = ["LinearAlgebra", "Random", "SparseArrays"]
git-tree-sha1 = "bed538ad14d132aa8240bb2e8ab82fcd2fd2f548"
git-tree-sha1 = "4705cc4e212c3c978c60b1b18118ec49b4d731fd"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
version = "0.11.3"
version = "0.11.5"

[[FiniteDiff]]
deps = ["ArrayInterface", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays"]
Expand Down Expand Up @@ -457,9 +457,9 @@ uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"

[[OffsetArrays]]
deps = ["Adapt"]
git-tree-sha1 = "76622f08645764e040b4d7e86d0ff471fd126ae4"
git-tree-sha1 = "986e7c0a0ef1863be969d191957ac32cb17d0d79"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.5.3"
version = "1.6.0"

[[OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
Expand Down Expand Up @@ -789,9 +789,9 @@ uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[Unitful]]
deps = ["ConstructionBase", "LinearAlgebra", "Random"]
git-tree-sha1 = "2b643523d52fc9fb4fe0729e6561d066055d58d8"
git-tree-sha1 = "fdfbea79b5b9a305bf226eb4730321f603281290"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
version = "1.5.0"
version = "1.6.0"

[[UnitfulAtomic]]
deps = ["Unitful"]
Expand Down
31 changes: 14 additions & 17 deletions src/EosFitting/Config.jl
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
module Config

using Configurations: from_dict, @option
using Express.EosFitting.Config:
Pressures,
EosFittingConfig,
materialize_eos,
materialize_press,
materialize_vol,
materialize_dir
import Express.EosFitting.Config: materialize
using Crystallography: cellvolume
using Express.EosFitting.Config: Pressures, Volumes, EosFittingConfig
using QuantumESPRESSO.Cli: QuantumESPRESSOCliConfig
using QuantumESPRESSO.Inputs.PWscf:
CellParametersCard, PWInput, VerbositySetter, VolumeSetter, PressureSetter

import Express.EosFitting.Config: materialize

function _materialize_tmpl(config, fixed)
arr = map(config.paths) do file
str = read(expanduser(file), String)
Expand All @@ -25,24 +21,25 @@ function _materialize_tmpl(config, fixed)
end
end

function materialize(config)
function materialize(config::AbstractDict)
config = from_dict(EosFittingConfig{QuantumESPRESSOCliConfig}, config)

templates = _materialize_tmpl(config.templates, config.fixed)

fixed = if config.fixed isa Pressures
materialize_press(config.fixed)
fixed = if config.fixed === nothing
# If no volume or pressure is provided, use templates cell volumes
Volumes(map(cellvolume, config.templates))
else
materialize_vol(config)
end
config.fixed
end |> materialize

return (
templates = templates,
fixed = fixed,
trial_eos = materialize_eos(config.trial_eos),
workdir = config.outdirs.root,
dirs = materialize_dir(config),
num_inv = config.num_inv,
trial_eos = materialize(config.trial_eos),
workdir = config.dirs.root,
dirs = materialize(config.dirs, config.fixed),
inv_opt = config.inv_opt,
cli = config.cli,
)
end
Expand Down
67 changes: 7 additions & 60 deletions src/EosFitting/EosFitting.jl
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
module EosFitting

using AbInitioSoftwareBase.Cli: MpiexecOptions
using Crystallography: cellvolume
using QuantumESPRESSOCli: PwxConfig, makecmd
using QuantumESPRESSO.Inputs.PWscf: CellParametersCard
using QuantumESPRESSO.Outputs.PWscf:
Preamble, parse_electrons_energies, parsefinal, isjobdone, tryparsefinal
using Setfield: @set!
using SimpleWorkflow: ExternalAtomicJob, parallel
using Unitful: Pressure, Volume, @u_str
import Unitful
using UnitfulAtomic
Expand All @@ -16,92 +14,41 @@ using ..QuantumESPRESSOExpress: QE

using Express: loadconfig
using Express.EosFitting: SelfConsistentField, StOptim, VcOptim, ScfOrOptim, iofiles
import Express.Shell: MakeCmd, distprocs
import Express.EosFitting: shortname, buildjob
import Express.EosFitting: shortname
import Express.EosFitting.DefaultActions: parseoutput

include("Config.jl")

module DefaultActions

using AbInitioSoftwareBase.Cli: MpiexecOptions
using AbInitioSoftwareBase.Inputs: Setter
using Dates: format, now
using EquationsOfStateOfSolids: EquationOfStateOfSolids, PressureEquation, Parameters
using EquationsOfStateOfSolids.Inverse: NumericalInversionOptions, inverse
using QuantumESPRESSOCli: PwxConfig, makecmd
using QuantumESPRESSO.Inputs.PWscf: PWInput, VerbositySetter, VolumeSetter, PressureSetter
using Setfield: @set!
using SimpleWorkflow: ExternalAtomicJob, parallel
using Unitful: Pressure, Volume, @u_str
import Unitful
using UnitfulAtomic

using Express.EosFitting:
SelfConsistentField, Optimization, StOptim, VcOptim, ScfOrOptim, iofiles, loadconfig
import Express.EosFitting.DefaultActions: MakeInput, FitEos
import Express.EosFitting: buildjob
import Express.EosFitting.DefaultActions: MakeInput, FitEos, MakeCmd
import Express.Shell: distprocs

include("MakeInput.jl")
include("MakeCmd.jl")

end

shortname(::Type{SelfConsistentField}) = "scf"
shortname(::Type{StOptim}) = "relax"
shortname(::Type{VcOptim}) = "vc-relax"

function (::MakeCmd)(
input;
output = tempname(; cleanup = false),
error = "",
mpi = MpiexecOptions(),
options = PwxConfig(),
)
mkpath(dirname(input))
@set! options.script_dest = mktemp(dirname(input); cleanup = false)[1]
return makecmd(input; output = output, error = error, mpi = mpi, options = options)
end
function (x::MakeCmd)(
inputs::AbstractArray;
outputs,
errors = outputs,
mpi,
options = PwxConfig(),
)
if !isempty(outputs)
if size(inputs) != size(outputs)
throw(DimensionMismatch("size of inputs and outputs are different!"))
end
end
if !isempty(errors)
if size(inputs) != size(errors)
throw(DimensionMismatch("size of inputs and outputs are different!"))
end
end
@set! mpi.np = distprocs(mpi.np, length(inputs))
distkeys = []
for (key, value) in mpi.options
if value isa AbstractArray
push!(distkeys, key)
end
end
return map(enumerate(inputs)) do (i, input)
tempmpi = mpi
for key in distkeys
@set! tempmpi.options[key] = mpi.options[key][i]
end
x(input; output = outputs[i], error = errors[i], mpi = tempmpi, options = options)
end
end

function buildjob(x::MakeCmd{T}, cfgfile) where {T}
config = loadconfig(cfgfile)
io = iofiles(T(), cfgfile)
infiles, outfiles = first.(io), last.(io)
jobs = map(
ExternalAtomicJob,
x(infiles; outputs = outfiles, mpi = config.cli.mpi, options = config.cli.pw),
)
return parallel(jobs...)
end

function parseoutput(::SelfConsistentField)
function (file)
str = read(file, String)
Expand Down
54 changes: 54 additions & 0 deletions src/EosFitting/MakeCmd.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
function (::MakeCmd)(
input;
output = tempname(; cleanup = false),
error = "",
mpi = MpiexecOptions(),
options = PwxConfig(),
)
mkpath(dirname(input))
@set! options.script_dest = mktemp(dirname(input); cleanup = false)[1]
return makecmd(input; output = output, error = error, mpi = mpi, options = options)
end
function (x::MakeCmd)(
inputs::AbstractArray;
outputs,
errors = outputs,
mpi,
options = PwxConfig(),
)
if !isempty(outputs)
if size(inputs) != size(outputs)
throw(DimensionMismatch("size of inputs and outputs are different!"))
end
end
if !isempty(errors)
if size(inputs) != size(errors)
throw(DimensionMismatch("size of inputs and outputs are different!"))
end
end
@set! mpi.np = distprocs(mpi.np, length(inputs))
distkeys = []
for (key, value) in mpi.options
if value isa AbstractArray
push!(distkeys, key)
end
end
return map(enumerate(inputs)) do (i, input)
tempmpi = mpi
for key in distkeys
@set! tempmpi.options[key] = mpi.options[key][i]
end
x(input; output = outputs[i], error = errors[i], mpi = tempmpi, options = options)
end
end

function buildjob(x::MakeCmd{T}, cfgfile) where {T}
config = loadconfig(cfgfile)
io = iofiles(T(), cfgfile)
infiles, outfiles = first.(io), last.(io)
jobs = map(
ExternalAtomicJob,
x(infiles; outputs = outfiles, mpi = config.cli.mpi, options = config.cli.pw),
)
return parallel(jobs...)
end
6 changes: 3 additions & 3 deletions src/EosFitting/MakeInput.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ function (x::MakeInput{T})(cfgfile) where {T}
fill(config.trial_eos, length(infiles)),
config.fixed,
fill("Y-m-d_H:M:S", length(infiles)),
fill(config.num_inv, length(infiles)),
fill(config.inv_opt, length(infiles)),
)
end
end
Expand Down Expand Up @@ -75,9 +75,9 @@ function Customizer(
eos::EquationOfStateOfSolids,
pressure::Pressure,
timefmt,
num_inv = NumericalInversionOptions(),
inv_opt = NumericalInversionOptions(),
)
volume = inverse(eos)(pressure, num_inv)
volume = inverse(eos)(pressure, inv_opt)
return Customizer(volume, pressure, timefmt)
end
Customizer(params::Parameters, pressure::Pressure, args...) =
Expand Down
11 changes: 5 additions & 6 deletions src/Phonon/Config.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ using QuantumESPRESSO.Inputs.PWscf: PWInput
using QuantumESPRESSO.Inputs.PHonon: PhInput, Q2rInput, MatdynInput
using Unitful: ustrip

using Express.Phonon.Config:
Pressures, Volumes, PhononConfig, DfptTemplate, materialize_press_vol, materialize_dir
using Express.Phonon.Config: Pressures, Volumes, PhononConfig, DfptTemplate
import Express.Phonon.Config: materialize

function _materialize_tmpl(
Expand All @@ -33,16 +32,16 @@ function _materialize_tmpl(
end
end

function materialize(config)
function materialize(config::AbstractDict)
config = from_dict(PhononConfig{QuantumESPRESSOCliConfig}, config)

templates = _materialize_tmpl(config.templates, config.fixed)

return (
templates = templates,
fixed = materialize_press_vol(config.fixed),
workdir = config.outdirs.root,
dirs = materialize_dir(config),
fixed = materialize(config.fixed),
workdir = config.dirs.root,
dirs = materialize(config.dirs, config.fixed),
cli = config.cli,
)
end
Expand Down
4 changes: 2 additions & 2 deletions src/Phonon/Phonon.jl
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ using SimpleWorkflow: ExternalAtomicJob, parallel
using ...QuantumESPRESSOExpress: QE

import Express.Phonon: shortname, buildjob
import Express.Phonon.DefaultActions: MakeInput, parsecell, inputtype
import Express.Shell: MakeCmd, distprocs
import Express.Phonon.DefaultActions: MakeInput, MakeCmd, parsecell, inputtype
import Express.Shell: distprocs

include("MakeInput.jl")
include("MakeCmd.jl")
Expand Down