diff --git a/Manifest.toml b/Manifest.toml index 595183e..143c92d 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ [[AbInitioSoftwareBase]] deps = ["Configurations", "IsURL", "JSON", "Pkg", "YAML"] -git-tree-sha1 = "7ae139ee9c89fe6e6ec81b28c8692c9e55499293" +git-tree-sha1 = "3a3ac0ec81aaf25f97be132438d03ac293cbc0ab" repo-rev = "master" repo-url = "git@github.com:MineralsCloud/AbInitioSoftwareBase.jl.git" uuid = "df5135bc-470e-46c6-b451-292e27ca5b84" @@ -191,9 +191,9 @@ 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"] @@ -201,7 +201,7 @@ 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 = "git@github.com:MineralsCloud/EquationsOfStateOfSolids.jl.git" uuid = "1eaa2786-f833-4167-8397-974edad0881e" @@ -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 = "git@github.com:MineralsCloud/Express.jl.git" uuid = "b12df14e-adf7-11e9-0606-d5813a258349" @@ -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"] @@ -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"] @@ -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"] diff --git a/src/EosFitting/Config.jl b/src/EosFitting/Config.jl index b9f224e..c50bece 100644 --- a/src/EosFitting/Config.jl +++ b/src/EosFitting/Config.jl @@ -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) @@ -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 diff --git a/src/EosFitting/EosFitting.jl b/src/EosFitting/EosFitting.jl index b4215f7..7695680 100644 --- a/src/EosFitting/EosFitting.jl +++ b/src/EosFitting/EosFitting.jl @@ -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 @@ -16,14 +14,14 @@ 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 @@ -31,15 +29,19 @@ 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 @@ -47,61 +49,6 @@ 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) diff --git a/src/EosFitting/MakeCmd.jl b/src/EosFitting/MakeCmd.jl new file mode 100644 index 0000000..b4d9e14 --- /dev/null +++ b/src/EosFitting/MakeCmd.jl @@ -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 diff --git a/src/EosFitting/MakeInput.jl b/src/EosFitting/MakeInput.jl index e5ccf87..b0369bc 100644 --- a/src/EosFitting/MakeInput.jl +++ b/src/EosFitting/MakeInput.jl @@ -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 @@ -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...) = diff --git a/src/Phonon/Config.jl b/src/Phonon/Config.jl index e77722c..f26f947 100644 --- a/src/Phonon/Config.jl +++ b/src/Phonon/Config.jl @@ -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( @@ -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 diff --git a/src/Phonon/Phonon.jl b/src/Phonon/Phonon.jl index 9309ca0..1c6c42e 100644 --- a/src/Phonon/Phonon.jl +++ b/src/Phonon/Phonon.jl @@ -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")