-
Notifications
You must be signed in to change notification settings - Fork 1
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
Feature/impurity example #171
base: develop
Are you sure you want to change the base?
Conversation
Pull Request Test Coverage Report for Build 3094929077
💛 - Coveralls |
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
Benchmark resultJudge resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsA ratio greater than
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfoTarget
Baseline
Target resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Baseline resultBenchmark Report for /home/runner/work/Rimu.jl/Rimu.jlJob Properties
ResultsBelow is a table of this job's results, obtained by running the benchmarks.
Benchmark Group ListHere's a list of all the benchmark groups executed by this job:
Julia versioninfo
Runtime information
Architecture: x86_64
|
The issue with Perhaps this is an issue with Literate/Documenter but I am not sure |
Indeed, it's a known limitation with IOCapture.jl. I'll try |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few minor points about syntax, and I also wonder about how big this calculation is, in terms of how long it takes to run with GitHub actions
# ## Stage 1: Running with the "dummy" Hamiltonian | ||
|
||
# Here we are constructing a secondary Hamiltonian `ham2` with equal boson-boson and impurity coupling | ||
# strength. We use this Hamiltonian to further generate a batter staring vector. From previous experiences |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
# strength. We use this Hamiltonian to further generate a batter staring vector. From previous experiences | |
# strength. We use this Hamiltonian to further generate a better starting vector. From previous experiences |
) | ||
|
||
# We will turn on the replica, but without operators for a fast equilibration. | ||
el2 = @elapsed df, state = lomc!(ham,dv; params, s_strat, r_strat, replica = AllOverlaps(2, nothing), laststep = (steps_equilibrate+steps_warmup)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
deprecated syntax. Also, could this step use NoStats
to save some time?
el2 = @elapsed df, state = lomc!(ham,dv; params, s_strat, r_strat, replica = AllOverlaps(2, nothing), laststep = (steps_equilibrate+steps_warmup)) | |
el2 = @elapsed df, state = lomc!(ham,dv; params, s_strat, r_strat, replica = AllOverlaps(2; operator=nothing), laststep = (steps_equilibrate+steps_warmup)) |
) | ||
|
||
# Setting up a tuple of G2 correlators: | ||
g = Tuple(G2Correlator.(0:m)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
g = Tuple(G2Correlator.(0:m)) | |
g = Tuple(G2MomCorrelator.(0:m)) |
scripts/Impurity-example.jl
Outdated
# Carry over information from the previous stage and set up a new `QMCState`: | ||
new_state = Rimu.QMCState( | ||
state.hamiltonian, state.replicas, Ref(Int(state.maxlength)), | ||
state.m_strat, r_strat, state.s_strat, state.τ_strat, state.threading, state.post_step, AllOverlaps(2, g) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
state.m_strat, r_strat, state.s_strat, state.τ_strat, state.threading, state.post_step, AllOverlaps(2, g) | |
state.m_strat, r_strat, state.s_strat, state.τ_strat, state.threading, state.post_step, AllOverlaps(2; operator=g) |
# If you want to calculate the correlations within a single component, `G2Correlator(d,:first)` | ||
# or `G2Correlator(d,:second)` can be called based on your choice. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
# If you want to calculate the correlations within a single component, `G2Correlator(d,:first)` | |
# or `G2Correlator(d,:second)` can be called based on your choice. | |
# If you want to calculate the correlations within a single component, `G2MomCorrelator(d,:first)` | |
# or `G2MomCorrelator(d,:second)` can be called based on your choice. |
# ## Stage 3: Running with the real Hamiltonian with replica and observables | ||
|
||
# We now at the last stage of the calculation, doing replica FCIQMC with a serious of | ||
# G2 correlators with distance `d` from `0` to `m`. See [`G2Correlator`](@ref). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
deprecated method name. Check that the references work!
# G2 correlators with distance `d` from `0` to `m`. See [`G2Correlator`](@ref). | |
# G2 correlators with distance `d` from `0` to `m`. See [`G2MomCorrelator`](@ref). |
# Now we can setup the Monte Carlo parameters | ||
steps_warmup = 10_000 # number of QMC steps running with a dummy Hamiltonian, see Stage 1 | ||
steps_equilibrate = 10_000 # number of QMC steps running with the real `ham` | ||
steps_final = 10_000 # number of QMC steps running with G2 correlators, very slow, be caution! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How slow is this script? The examples have been moved out of the testing job into the documentation job, but we don't want these examples to take too long...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It takes about 1 min. I can make it quicker by using a smaller system or running fewer steps. What's your opinion for a ideal run time?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The whole Documenter "build and deploy" step took less than three minutes (after taking about the same time for installing the dependencies. I think that is fine. Still much faster that the automated "testing".
using Test #src | ||
r = rayleigh_replica_estimator(df2; op_name = "Op1", skip = 5_000) #src | ||
@test r.f ≈ 0.6294961872457038 rtol = 0.01 #src |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does #src
mean that these lines are still executed by Literate.markdown(..., execute=true)
? Because the test needs to happen at this point.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good question, I gonna check it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you need to use #hide
to make sure that the testing happens while Literate.jl 'execute's the file. See here:
https://fredrikekre.github.io/Literate.jl/v2/fileformat/#:~:text=Difference%20between%20%60%23src,out%20after%20execution.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes that is my interpretation of the Literate.jl documentation. If that is indeed the case, then the output of tests can be suppressed by ending with the line
nothing #hide
# Typically, one should not include any analyses when using MPI, as they will be calculated multiple | ||
# time unless you put the `@mpi_root` macro everywhere. Even so, all other MPI ranks apart from the root | ||
# will be idling and wasting CPU hours on a HPC unit. | ||
# But here, let's have a look of the calculated G2 correlations: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This part of the example overlaps with the third example script, i.e. just listing and checking the G2 values. Perhaps this is all that can be done in a small example script, but can something be said about the effect of the impurity?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it looks like the analysis that follows is already shown and explained in another example script. Maybe then it would be better to just describe in words what kind of analysis can be done on the data that has been saved to disk and refer to Example 3.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the example script! See comments below.
I guess the main question is whether you want to show a functional MPI script, or provide a quick-to-execute tutorial script that teaches something about how to set up and interpret some trickier calculation.
# impurity coupled with a one-dimensional Bose gas. We will be using MPI parallelisation | ||
# as such calculations are typically expensive. This script is designed to be run effectively | ||
# on a high performance computing (HPC) unit. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a little confused here, and I think it might also be confusing for other future readers. My understanding is that actually this script works on a small enough example that it can be run under CI and without MPI. Telling the reader that it is going to be an expensive calculation and that MPI is necessary is potentially misleading, or at least confusing information. It might be better to say that for larger system sizes (and for data reported in the publication) it makes sense to run this with MPI, but that the current example script can also be run without MPI.
The bigger questions is how many thing you want to teach or show the reader. The simpler and easier to understand a tutorial is, the more helpful it is, usually. A basic example for running with MPI is already available.
# A runnable script for this example is located | ||
# [here](https://github.com/joachimbrand/Rimu.jl/blob/develop/scripts/Impurity-example.jl). | ||
# Run it with `mpirun -np [# of CPUs] julia Impurity-example.jl`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See above. Maybe mention that it can be run without MPI as well.
# Let's define a function for constructing the starting vector based on | ||
# the total momentum of the coupled system `P`, the number of modes `m` and the | ||
# number of non-impurity bosons `n`. The maximum allowed total momentum equals to the total | ||
# number of particles including the impurity, hence `n+1`. Apart from the zero and the maximum | ||
# total momentum states, we will have more than one configurations in the starting vector | ||
# to reflect various possible excitation options based on intuitions in physics. | ||
function init_dv(P,m,n) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately this function is not very readable (more comment lines might help) and comes right at the start of the example. I don't have a good alternative suggestion, but this might be an early turnoff for potential readers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe this function could be simplified by making it return only the addresses. This would have the additional benefit of being able to reuse one of them as a starting address for the Hamiltonian.
Then I think the text should also explain which configurations you are constructing, or by which principle you are constructing them.
# Now let's first do some MPI sanity checks and print some information: | ||
mpi_barrier() # optional, use for debugging and sanity checks | ||
@info "After barrier 1" mpi_rank() mpi_size() Threads.nthreads() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks like some debugging code that I had in my scripts when I was learning how MPI works. It does not fulfil any real function and I'm not sure how helpful it will be to the reader. My suggestion is to delete these lines.
# Now let's first do some MPI sanity checks and print some information: | |
mpi_barrier() # optional, use for debugging and sanity checks | |
@info "After barrier 1" mpi_rank() mpi_size() Threads.nthreads() |
# Now we can setup the Monte Carlo parameters | ||
steps_warmup = 10_000 # number of QMC steps running with a dummy Hamiltonian, see Stage 1 | ||
steps_equilibrate = 10_000 # number of QMC steps running with the real `ham` | ||
steps_final = 10_000 # number of QMC steps running with G2 correlators, very slow, be caution! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The whole Documenter "build and deploy" step took less than three minutes (after taking about the same time for installing the dependencies. I think that is fine. Still much faster that the automated "testing".
aIni = BoseFS2C(BoseFS([n; zeros(Int, m-1)]), BoseFS([1; zeros(Int, m-1)])) | ||
dv = InitiatorDVec(aIni=>1.0;style=IsDynamicSemistochastic()) | ||
empty!(dv) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Constructing an InitiatorDVec
first with the wrong address in it and then emptying it is quite confusing. Why don't you use the constructor for an empty InitiatorDVec
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have to test it out. Previously doing dv[add] += 1.0
with an empty dv
did not give what I wanted (sorry can't really remember what the problem was).
# Both `df` and `state` will be overwritten later with the "real" data. | ||
el = @elapsed df, state = lomc!(ham2, dv; params, s_strat, r_strat,) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
# Both `df` and `state` will be overwritten later with the "real" data. | |
el = @elapsed df, state = lomc!(ham2, dv; params, s_strat, r_strat,) | |
el = @elapsed lomc!(ham2, dv; params, s_strat, r_strat,) |
If we are not interested in df
and state
, why ask to have them returned in the first place?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point, will remove them.
# or `G2Correlator(d,:second)` can be called based on your choice. | ||
|
||
# Carry over information from the previous stage and set up a new `QMCState`: | ||
new_state = Rimu.QMCState( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, this is undocumented usage of an unexported constructor for QMCState
. Maybe we can leave it for now (because it may be the only way to achieve what you need), but I don't particularly like it. Instead I think we should make lomc!
accept an old QMCState
and allow keyword arguments to change any of the fields:
new_df, new_state = lomc!(old_state; replica = AllOverlaps(2; operator=g), laststep = new_laststep)
# Typically, one should not include any analyses when using MPI, as they will be calculated multiple | ||
# time unless you put the `@mpi_root` macro everywhere. Even so, all other MPI ranks apart from the root | ||
# will be idling and wasting CPU hours on a HPC unit. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree that one should not do this. Maybe then it is better to not show an example where this is done?
# Typically, one should not include any analyses when using MPI, as they will be calculated multiple | ||
# time unless you put the `@mpi_root` macro everywhere. Even so, all other MPI ranks apart from the root | ||
# will be idling and wasting CPU hours on a HPC unit. | ||
# But here, let's have a look of the calculated G2 correlations: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it looks like the analysis that follows is already shown and explained in another example script. Maybe then it would be better to just describe in words what kind of analysis can be done on the data that has been saved to disk and refer to Example 3.
Adding the tutorial for calculating 1D two-component impurity-Bose gas systems in momentum space. MPI is used in this example to emulate a job for HPC. The calculation is split into three stages for optimising resources utilisation on HPC and decreasing overall runtime. Many "tricks" based on previous experiences are included and explained. This example should give potential users guides on how to manage a complex FCIQMC calculation with Rimu.jl, as well as provides a script that can be run straightaway on a HPC cluster with minimal changes.