This is a pure-Julia interface to the data from the neutronics_material_maker Python package https://github.com/fusion-energy/neutronics_material_maker
Properties of each material can be accessed by calling the Material()
function with the material name as a symbol passed as the function argument.
To add a new material, first add a function to src/materials.jl
called Material with the function argument being your material's name. In the body of the function, assign the material's name (as a string, all lowercase, and with any spaces filled by underscores), type (as a list containing each possible IMAS BuildLayerType the material could be assigned to), density (in kg/m^3
) and unit cost (in US dollars per kilogram). Include a comment providing a link to the source from which the unit cost was taken.
Below is an example of a complete Material function for a non-superconductor material (more about superconductor materials below):
function Material(::Type{Val{:graphite}};)
mat = Material()
mat.name = "graphite" # string with no spaces
mat.type = [IMAS._wall_] # list of allowable layer types for this material
mat.density = 1.7e3 # in kg/m^3
mat.unit_cost = 1.3 # in US$/kg, include source as a comment # source: https://businessanalytiq.com/procurementanalytics/index/graphite-price-index/
return mat
end
If the material is a superconductor that is meant to be assigned to magnet-type layers, additional characteristics need to be defined. First, add the relevant critical current density scaling for the chosen superconductor material as a function in FusionMaterials/src/jcrit.jl
. Then, assign the technology parameters for the material (temperature, steel fraction, void fraction, and ratio of superconductor to copper) to their respective fields in coil_tech within the coil_technology function in FUSE/src/technology.jl
. Finally, call the critical current density scaling function within the newly written Material function in materials.jl
and assign the output critical current density and critical magnetic field to the material object. The coil_tech object should be passed as an argument to the Material function, along with the external B field, and used to calculate the critical current density and critical magnetic field.
Below is an example of a complete superconductor Material function:
function Material(::Type{Val{:rebco}}; coil_tech::Union{Missing, IMAS.build__pf_active__technology, IMAS.build__oh__technology, IMAS.build__tf__technology} = missing, Bext::Union{Real, Missing} = missing)
mat = Material()
mat.name = "rebco"
mat.type = [IMAS._tf_, IMAS._oh_]
mat.density = 6.3
mat.unit_cost = 7000
if !ismissing(coil_tech)
Jcrit_SC, Bext_Bcrit_ratio = ReBCO_Jcrit(Bext, coil_tech.thermal_strain + coil_tech.JxB_strain, coil_tech.temperature) # A/m^2
fc = fraction_conductor(coil_tech)
mat.critical_current_density = Jcrit_SC * fc
mat.critical_magnetic_field = Bext / Bext_Bcrit_ratio
end
return mat
end
The function ReBCO_Jcrit
is the critical current density function for this material.
You can then access the parameters of your material by calling the function you've created. For example, access the material's density anywhere in FUSE by calling:
my_mat_density = Material(:my_mat).density
For more details, see the online documentation.