Materials Compendium

In this tutorial, we will access data from the “Compendium of Material Composition Data for Radiation Transport Modeling” provided by the Pacific Northwest National Laboratory (PNNL). This data contains material properties, including material density, atom density, elemental and isotopic compositions provided as weight, atom fraction, and atom density. The data file is intended for radiation transport modeling and can be used with various radiation transport codes.

Accessing the Materials Compendium

To access the data from the Materials Compendium, we will use the MaterialsCompendium module from materials_compendium. First, let’s import the required modules and see how many materials are in the compendium:

from materials_compendium import MaterialsCompendium

# Get the number of materials in the Compendium
num_materials = len(MaterialsCompendium)
print("Number of materials in the Compendium:", num_materials)

# Get the name of the first material
first_material_name = MaterialsCompendium[0].Name
print("First material name:", first_material_name)

# Get the number of elements in the first material
num_elements_in_first_material = len(MaterialsCompendium[0].Elements)
print("Number of elements in the first material:", num_elements_in_first_material)
Number of materials in the Compendium: 411
First material name: Bone Equivalent Plastic, B-110
Number of elements in the first material: 6

Creating a Material Object

To work with the material data more conveniently, PyNE provides a Material class. We can create a Material object from a material in the Compendium. The Material class allows us to access various properties and data associated with the material.

from materials_compendium.utils import Material

# Create a Material object from the first material in the Compendium
material_obj = Material(MaterialsCompendium[0])

# Print the basic information about the material
print("Material object:")
print(material_obj)
print("-"*50)
# Print the complete properties of the material
print("Complete material properties:")
print(material_obj.get_all())
Material object:
Material Name: Bone Equivalent Plastic, B-110 
Formula: None 
Density: 1.785
--------------------------------------------------
Complete material properties:
Material Name: Bone Equivalent Plastic, B-110 
Acronym: B-110 
Formula: None 
Density: 1.785 
Material Atom Density: 0.09797999999999998 
Elements: H, C, N, O, F, Ca 
Mat Num: 33 
Material Weight: 0.000000 
Comments:
 The above density is estimated to be accurate to 3 significant digits. Uncertainties are not addressed.
 The carbon fraction was adjusted from 0.3672 to 0.3673 to provide normalization to 1 
Source: PNNL 
Verification Notes:  
References: Density and weight fractions in J. J. Spokas and D. R. White, A Conducting Plastic Simulating Cortical Bone at https://iopscience.iop.org/article/10.1088/0031-9155/27/1/012/pdf; with the carbon fraction adjusted from 0.3672 to 0.3673 to provide normalization to 1 
Contact:
 Name: Rebecca Detwiler 
 Phone: 352-484-4040 
 Email: Rebecca.Detwiler@pnnl.gov

Accessing Element and Isotope Information

The Material class is integrated with other classes, such as ElementInfo and IsotopeInfo, to provide more detailed information about elements and isotopes present in the material.

# Get information about all elements in the material
elements_info = material_obj.get_elements()
print("Elements information:")
print(elements_info)
Elements information:
Index: 0 
 Element: H 
 ZAID: 1000 
 Isotopes:H1, H2
Index: 1 
 Element: C 
 ZAID: 6000 
 Isotopes:C12, C13
Index: 2 
 Element: N 
 ZAID: 7000 
 Isotopes:N14, N15
Index: 3 
 Element: O 
 ZAID: 8000 
 Isotopes:O16, O17, O18
Index: 4 
 Element: F 
 ZAID: 9000 
 Isotopes:F19
Index: 5 
 Element: Ca 
 ZAID: 20000 
 Isotopes:Ca40, Ca42, Ca43, Ca44, Ca46, Ca48
# Get complete information about the first isotope of the first element in the material
isotope_info = material_obj.elements[0].isotopes[0].get_all()
print("Complete information of the first isotope of the first element:")
print(isotope_info)
Complete information of the first isotope of the first element:
Isotope: H1 
 ZAID: 1001 
 Weight Percent: 0.999736 
 Weight Fraction (Whole): 0.0354906363733931 
 Isotopic Weight Fraction (Whole): 0.9997362358702283 
 Weight Fraction: 0.035491 
 Abundance: 0.999885 
 Isotopic Atom Density: 0.037855 
 Atomic Number (Whole): 1 
 Atom Fraction: 0.386351 
 Atomic Number: 1 
 Isotopic Weight Fraction: 0.999736 
 Relative Atomic Mass: 1.007825 
 Relative Atomic Mass (Whole): 1.00782503223 
 Isotopic Atom Fraction: 0.999885 
 Abundance (Whole): 0.999885 
 Isotopic Atom Fraction (Whole): 0.999885 
 Atom Fraction (Whole): 0.386350546172812 
 Isotopic Atom Density (Whole): 0.0378545221546933 

Accessing Materials by Name, Formula, or Acronym

We can also access specific materials directly from the Compendium using their names, formulas, or acronyms using the from_name, from_formula, and from_acronym functions.

mat2 = Material.from_name("Liquid")
Material 'Liquid' not found. Did you mean:
Water, Liquid

It appears that the compendium does not contain information specifically about “Liquid” material. However, it does provide suggestions for related materials. Let’s explore one of the suggested materials instead.

mat2 = Material.from_name("Water, Liquid")
print(mat2)
Material Name: Water, Liquid 
Formula: H2O 
Density: 0.997

We can also try to access a material by its chemical formula.

mat3 = Material.from_formula("UO2")
print(mat3)
Material Name: Uranium Dioxide 
Formula: UO2 
Density: 10.96

To get more specific data, we can use get_[something] functions. For example:

print(mat3.get_comment())
print(mat3.get_source())
['CAS # 1344-57-6', 'Uranium isotopics assumed for LEU:  Wt% U234/235/236/238 =   0.0267/3.0/0.0138/96.9595.']
BNL/ORNL

Advanced Example:

As an advanced example, we can find materials that contain a specific isotope (e.g., U-235) in their compositions.

# Define the isotope you want to search for
target_isotope = "U235"

# Create an empty list to store the names of materials containing the target isotope
materials_with_isotope = []

# Loop through each material entry in the Compendium
for material in MaterialsCompendium:
    # Check if the target isotope is present in the material's isotopes
    for element in material.Elements:
        for isotope in element.Isotopes:
            if isotope.Isotope == target_isotope:
                # If the isotope is found in the material, add the material name to the list
                materials_with_isotope.append(material.Name)

# Print the material names containing the target isotope
print("Materials containing", target_isotope)
for material in materials_with_isotope:
    print(material)
Materials containing U235
Uranium Trioxide
Uranium Dicarbide
Uranium Hydride
Uranium Oxide
Uranium Nitride
Uranium Tetrafluoride
Uranium Dioxide
Uranium Carbide
Uranium Hexafluoride
Uranyl Fluoride
Uranyl Nitrate

Conclusion

In this tutorial, we learned how to access and utilize data from the Materials Compendium. With this information, you can perform various analyses and simulations related to radiation transport modeling. PyNE provides powerful tools to extract and manipulate material properties, which can be valuable for researchers and engineers working in the field of nuclear and radiation engineering.