From 25968512a014b9c7087ca651630b02ea85e634b9 Mon Sep 17 00:00:00 2001 From: johannes-moegerle Date: Mon, 15 Dec 2025 14:35:28 +0100 Subject: [PATCH 1/2] add single_channel_fj_models --- examples/generate_Yb174_database.jl | 2 +- src/MQDT.jl | 3 ++- src/general.jl | 41 ++++++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/examples/generate_Yb174_database.jl b/examples/generate_Yb174_database.jl index 13098c8..50fed5f 100644 --- a/examples/generate_Yb174_database.jl +++ b/examples/generate_Yb174_database.jl @@ -33,7 +33,7 @@ low_l_states = [eigenstates(n_min[i], n_max, low_l_models[i], parameters) for i # calculate high \ell SQDT states l_max = n_max - 1 MQDT.wigner_init_float(n_max, "Jmax", 9) # initialize Wigner symbol calculation -high_l_models = single_channel_models(:Yb174, 5:l_max) +high_l_models = single_channel_jj_models(:Yb174, 5:l_max) high_l_states = [eigenstates(25, n_max, M, parameters) for M in high_l_models] # generate basis and calculate matrix elements diff --git a/src/MQDT.jl b/src/MQDT.jl index 69e73d6..b2d8488 100644 --- a/src/MQDT.jl +++ b/src/MQDT.jl @@ -24,7 +24,8 @@ export lsQuantumNumbers, eigenstates, basisarray, matrix_elements, - single_channel_models + single_channel_jj_models, + single_channel_fj_models include("general.jl") include("boundstates.jl") diff --git a/src/general.jl b/src/general.jl index cfe5228..3de9f04 100644 --- a/src/general.jl +++ b/src/general.jl @@ -644,7 +644,7 @@ function get_thresholds(M::kModel, P::Parameters) return thresholds end -function single_channel_models(species::Symbol, l::Integer) +function single_channel_jj_models(species::Symbol, l::Integer) @assert l > 0 "l must be positive and nonzero for this function" jr = [l-1/2, l-1/2, l+1/2, l+1/2] jt = [l-1, l, l, l+1] @@ -667,10 +667,45 @@ function single_channel_models(species::Symbol, l::Integer) return m end -function single_channel_models(species::Symbol, l_list::UnitRange{Int64}) +function single_channel_jj_models(species::Symbol, l_list::UnitRange{Int64}) m = Vector{fModel}() for l in l_list - append!(m, single_channel_models(species, l)) + append!(m, single_channel_jj_models(species, l)) + end + return m +end + +function single_channel_fj_models(species::Symbol, l_ryd::Integer, p::Parameters) + j_ryd_list = collect(abs(l_ryd - 1 / 2):1:(l_ryd + 1 / 2)) + f_core_list = collect(abs(p.spin - 1 / 2):1:(p.spin + 1 / 2)) + model_list = Vector{fModel}() + for j_ryd in j_ryd_list + for f_core in f_core_list + for f_tot in abs(f_core - j_ryd):1:(f_core + j_ryd) + model = fModel( + species, + "Lr=$l_ryd, Jr=$j_ryd, Fc=$f_core, F=$f_tot", + 1, + [""], + Bool[1], + [0;;], + [""], + [0;;], + fjChannels([fjQuantumNumbers(0.5, 0, 0.5, f_core, l_ryd, j_ryd, f_tot)]), + fjChannels([fjQuantumNumbers(0.5, 0, 0.5, f_core, l_ryd, j_ryd, f_tot)]), + [1;;], + ) + push!(model_list, model) + end + end + end + return model_list +end + +function single_channel_fj_models(species::Symbol, l_ryd_list::UnitRange{Int64}, p::Parameters) + m = Vector{fModel}() + for l_ryd in l_ryd_list + append!(m, single_channel_fj_models(species, l_ryd, p)) end return m end From 3656d74209824ee27119beef68d753aeb641491d Mon Sep 17 00:00:00 2001 From: johannes-moegerle Date: Mon, 15 Dec 2025 09:49:43 +0100 Subject: [PATCH 2/2] add Yb173 example --- examples/.gitignore | 1 + examples/generate_Yb173_database.jl | 70 +++++++++++++++++++++++++++++ examples/generate_Yb174_database.jl | 23 +++++----- 3 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 examples/generate_Yb173_database.jl diff --git a/examples/.gitignore b/examples/.gitignore index d39c1d8..7928c8a 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,2 +1,3 @@ *.csv *.parquet +./data/ diff --git a/examples/generate_Yb173_database.jl b/examples/generate_Yb173_database.jl new file mode 100644 index 0000000..e7faa49 --- /dev/null +++ b/examples/generate_Yb173_database.jl @@ -0,0 +1,70 @@ +using MQDT + +# load Yb173 data +parameters = MQDT.Yb173.PARA +low_l_models = [ + MQDT.Yb173.FMODEL_HIGHN_S15, + MQDT.Yb173.FMODEL_HIGHN_S25, + MQDT.Yb173.FMODEL_HIGHN_S35, + MQDT.Yb173.FMODEL_HIGHN_P05, + MQDT.Yb173.FMODEL_HIGHN_P15, + MQDT.Yb173.FMODEL_HIGHN_P25, + MQDT.Yb173.FMODEL_HIGHN_P35, + MQDT.Yb173.FMODEL_HIGHN_P45, +] + +# bounds +n_min = 20 +n_max = 30 + +# calculate high \nu, low \ell MQDT states +low_l_states = [eigenstates(n_min, n_max, low_l_models[i], parameters) for i in eachindex(low_l_models)] + +# calculate high \ell SQDT states +l_max = n_max - 1 +MQDT.wigner_init_float(n_max, "Jmax", 9) # initialize Wigner symbol caluclation +high_l_models = single_channel_fj_models(:Yb173, 5:l_max, parameters) +high_l_states = [eigenstates(25, n_max, M, parameters) for M in high_l_models] + +# generate basis and calculate matrix elements +basis = basisarray(vcat(low_l_states, high_l_states), vcat(low_l_models, high_l_models)) +@time me = matrix_elements(basis, parameters) + +# prepare tables +using DataFrames +col_names = [:id_initial, :id_final, :value] + +e1 = DataFrame(me["dipole"], col_names) +e2 = DataFrame(me["quadrupole"], col_names) +m1 = DataFrame(me["paramagnetic"], col_names) +m2 = DataFrame(me["diamagnetic"], col_names) + +states_table = DataFrame(; + id=collect(1:size(basis)), + energy=MQDT.get_e(basis, parameters), + parity=MQDT.get_p(basis), + f=MQDT.get_f(basis), + nu=MQDT.get_nu(basis), + term=MQDT.get_term(basis), + lead=MQDT.get_lead(basis), +) +sort!(states_table, [:nu]) + +# store tables as csv files +output_dir = "data/Yb173_mqdt/" +mkpath(output_dir) + +using CSV +CSV.write("$(output_dir)states.csv", states_table) +CSV.write("$(output_dir)matrix_elements_d.csv", e1) +CSV.write("$(output_dir)matrix_elements_q.csv", e2) +CSV.write("$(output_dir)matrix_elements_mu.csv", m1) +CSV.write("$(output_dir)matrix_elements_q0.csv", m2) + +# store tables as parquet files +using Parquet2 +Parquet2.writefile("$(output_dir)states.parquet", states_table) +Parquet2.writefile("$(output_dir)matrix_elements_d.parquet", e1) +Parquet2.writefile("$(output_dir)matrix_elements_q.parquet", e2) +Parquet2.writefile("$(output_dir)matrix_elements_mu.parquet", m1) +Parquet2.writefile("$(output_dir)matrix_elements_q0.parquet", m2) diff --git a/examples/generate_Yb174_database.jl b/examples/generate_Yb174_database.jl index 50fed5f..b9d9e61 100644 --- a/examples/generate_Yb174_database.jl +++ b/examples/generate_Yb174_database.jl @@ -61,17 +61,20 @@ states_table = DataFrame(; sort!(states_table, [:nu]) # store tables as csv files +output_dir = "data/Yb174_mqdt/" +mkpath(output_dir) + using CSV -CSV.write("Yb174_mqdt_states.csv", states_table) -CSV.write("Yb174_mqdt_matrix_elements_d.csv", e1) -CSV.write("Yb174_mqdt_matrix_elements_q.csv", e2) -CSV.write("Yb174_mqdt_matrix_elements_mu.csv", m1) -CSV.write("Yb174_mqdt_matrix_elements_q0.csv", m2) +CSV.write("$(output_dir)states.csv", states_table) +CSV.write("$(output_dir)matrix_elements_d.csv", e1) +CSV.write("$(output_dir)matrix_elements_q.csv", e2) +CSV.write("$(output_dir)matrix_elements_mu.csv", m1) +CSV.write("$(output_dir)matrix_elements_q0.csv", m2) # store tables as parquet files using Parquet2 -Parquet2.writefile("Yb174_mqdt_states.parquet", states_table) -Parquet2.writefile("Yb174_mqdt_matrix_elements_d.parquet", e1) -Parquet2.writefile("Yb174_mqdt_matrix_elements_q.parquet", e2) -Parquet2.writefile("Yb174_mqdt_matrix_elements_mu.parquet", m1) -Parquet2.writefile("Yb174_mqdt_matrix_elements_q0.parquet", m2) +Parquet2.writefile("$(output_dir)states.parquet", states_table) +Parquet2.writefile("$(output_dir)matrix_elements_d.parquet", e1) +Parquet2.writefile("$(output_dir)matrix_elements_q.parquet", e2) +Parquet2.writefile("$(output_dir)matrix_elements_mu.parquet", m1) +Parquet2.writefile("$(output_dir)matrix_elements_q0.parquet", m2)