diff --git a/Project.toml b/Project.toml index a33a8e3f4..76563d054 100644 --- a/Project.toml +++ b/Project.toml @@ -43,6 +43,7 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [compat] julia = "1.7.0" diff --git a/docs/src/utils.md b/docs/src/utils.md new file mode 100644 index 000000000..5394ba87d --- /dev/null +++ b/docs/src/utils.md @@ -0,0 +1,6 @@ +`utils` +=============== + +```@autodocs +Modules = [moment_kinetics.utils] +``` diff --git a/src/moment_kinetics.jl b/src/moment_kinetics.jl index bb0536db2..73bfd15b8 100644 --- a/src/moment_kinetics.jl +++ b/src/moment_kinetics.jl @@ -62,6 +62,7 @@ include("plot_sequence.jl") include("makie_post_processing.jl") include("time_advance.jl") +include("utils.jl") using TimerOutputs using Dates using Glob diff --git a/src/utils.jl b/src/utils.jl new file mode 100644 index 000000000..fcf549b69 --- /dev/null +++ b/src/utils.jl @@ -0,0 +1,93 @@ +""" +Utility functions +""" +module utils + +export get_unnormalized_parameters, print_unnormalized_parameters + +using ..moment_kinetics_input: mk_input + +using OrderedCollections +using TOML +using Unitful + +Unitful.@unit eV "eV" "electron volt" 1.602176634e-19*Unitful.J true + +function __init__() + Unitful.register(utils) +end + +""" + get_unnormalized_parameters(input::Dict) + get_unnormalized_parameters(input_filename::String) + +Get many parameters for the simulation setup given by `input` or in the file +`input_filename`, in SI units and eV, returned as an OrderedDict. +""" +function get_unnormalized_parameters end +function get_unnormalized_parameters(input::Dict) + io_input, evolve_moments, t_input, z, z_spectral, r, r_spectral, vpa, vpa_spectral, + vperp, vperp_spectral, gyrophase, gyrophase_spectral, vz, vz_spectral, vr, + vr_spectral, vzeta, vzeta_spectral, composition, species, collisions, geometry, + drive_input, external_source_settings, num_diss_params, manufactured_solns_input, + reference_parameters = mk_input(input) + + Nnorm = reference_parameters.Nref * Unitful.m^(-3) + Tnorm = reference_parameters.Tref * eV + Lnorm = reference_parameters.Lref * Unitful.m + Bnorm = reference_parameters.Bref * Unitful.T + cnorm = reference_parameters.cref * Unitful.m / Unitful.s + timenorm = reference_parameters.timeref * Unitful.s + + # Assume single ion species so normalised ion mass is always 1 + mi = reference_parameters.mnorm * Unitful.kg + + parameters = OrderedDict{String,Any}() + parameters["run_name"] = run_name + + parameters["Nnorm"] = Nnorm + parameters["Tnorm"] = Tnorm + parameters["Lnorm"] = Lnorm + + parameters["Lz"] = Lnorm * z_input.L + + parameters["cs0"] = cnorm + + dt = t_input.dt * timenorm + parameters["dt"] = dt + parameters["output time step"] = dt * t_input.nwrite + parameters["total simulated time"] = dt * t_input.nstep + + parameters["T_e"] = Tnorm * composition.T_e + parameters["T_wall"] = Tnorm * composition.T_wall + + parameters["CX_rate_coefficient"] = collisions.charge_exchange / Nnorm / timenorm + parameters["ionization_rate_coefficient"] = collisions.ionization / Nnorm / timenorm + + return parameters +end +function get_unnormalized_parameters(input_filename::String, args...; kwargs...) + return get_unnormalized_parameters(TOML.parsefile(input_filename), args...; + kwargs...) +end + +""" + print_unnormalized_parameters(input) + +Print many parameters for the simulation setup given by `input` (a Dict of parameters or +a String giving a filename), in SI units and eV. +""" +function print_unnormalized_parameters(args...; kwargs...) + + parameters = get_unnormalized_parameters(args...; kwargs...) + + println("Dimensional parameters for '$(parameters["run_name"])'") + + for (k,v) ∈ parameters + println("$k = $v") + end + + return nothing +end + +end #utils