Ray Tracing for Nuclear Reactor Physics package


I have just released the RayTracing.jl package, which computes cyclic ray tracing across any unstructured mesh in a rectangular domain. Its results are commonly used in Nuclear Reactor Physics, such as in the Collision Probability Method or the Method of Characteristics for solving the Neutron Transport equation. However, this information might be useful for some other subjects I am not familiar with.

A simple and comprehensive example can be found in the README.md. I will add more examples and documentation the next couple of days.

The following step will be the implementation of the Method of Characteristics. I will be working on that for the next days and anyone is invited to participate.

Thank you and let’s keep writing Julia packages!


Nice! Reminds me of the good ol’ days when I was working on the solution of the neutron transport equation using the Method of Characteristics during my PhD… in Fortran :cry:

If you can also handle arbitrary geometries (not necessarily defined by a mesh, but also pure geometrical models, e.g. CSG), I’ve seen other domains where such a form of ray tracing could be useful. One such application that comes to mind is the simulation of industrial non-destructive evaluations with X-rays (but photon transport is arguably not that far from neutron transport…)
However, I’d say that the “cyclic” part is pretty much specific to nuclear reactor physics (and not even all reactor geometries can benefit from it!)

Judging by the example given in the README, I’d guess you’re targetting assembly calculations? Are you also interested in whole-core simulations?

1 Like

Hi @ffevotte! Thank you for your comments!

:smile: yes, Fortran is still being used in most of the privative software used for reactor physics! Also in some huge open source projects, such as DRAGON.

We can definitely use GridapEmbedded.jl for that purpose. Currently, RayTracing.jl uses GridapGmsh.jl, but it can be extended for sure.

The example in the README, for the purpose of simplicity, is the most basic case, which is a 2D square pin cell. However, the ray tracing algorithm can be applied to any big or small geometry, it is pretty fast. The only limitation is the rectangular domain needed for cyclic paths.

Yes, that is something I might have to extend in the future!

Regarding the MoC solver, its first milestone is to solve lattice computations. However, I believe whole cores are also possible. There are some approximations that can be implemented for such purpose. For example, the Coarse Mesh Finite Difference Acceleration. We will have to code that!


Very nice package! I look forward to trying it out.

If you’re looking for an alternative csg package, I’ve had a good experience with ConstructiveSolidGeometry.jl.

I see that you’ve linked OpenMOC. Would be great to have a OpenMC/OpenMOC geometry parser :slight_smile:

1 Like

Hi @AnderGray, thank you for your comments!

I have been working in NeutronTransport.jl for a couple of days now and I have already concluded the first version of the Method of Characteristics solver, which works really great. I will add some test cases and examples and make the package announcement in discourse this week.

At the moment, I am using unstructured meshes using gmsh. However, it would be amazing to have CSGs because that would involve smaller number of computations for the MoC solver. This needs to be the following task to implement!

It would involve implementing the ray tracing algorithm over such geometries in RayTracing.jl. Once we have this, the solver in NeutronTransport.jl will work out of the box.

Then, a OpenMC/OpenMOC geometry parser could also be implemented or we could just use PyCall.jl.

This is just the beginning!

1 Like