Skip to content
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

B4C defaults to a 0.9 TD fraction #1116

Closed
keckler opened this issue Jan 24, 2023 · 3 comments · Fixed by #1117
Closed

B4C defaults to a 0.9 TD fraction #1116

keckler opened this issue Jan 24, 2023 · 3 comments · Fixed by #1117

Comments

@keckler
Copy link
Member

keckler commented Jan 24, 2023

This isn't really a Problem, but it is unexpected, inconsistent, and potentially troublesome.

The B4C class has a built-in non-unity theoretical density fraction that is applied by default when the material is constructed:

armi/armi/materials/b4c.py

Lines 117 to 145 in 37f5479

def setDefaultMassFracs(self) -> None:
r"""B4C mass fractions. Using Natural B4C. 19.9% B-10/ 80.1% B-11
Boron: 10.811 g/mol
Carbon: 12.0107 g/mol
4 moles of boron/1 mole of carbon
grams of boron-10 = 10.01 g/mol* 4 mol * 0.199 = 7.96796 g
grams of boron-11 = 11.01 g/mol* 4 mol * 0.801 = 35.27604 g
grams of carbon= 12.0107 g/mol * 1 mol = 12.0107 g
total=55.2547 g.
Mass fractions are computed from this.
"""
massEnrich = self.getMassEnrichmentFromNumEnrich(naturalB10NumberFraction=0.199)
gBoron10, gBoron11, gCarbon = self.setNewMassFracsFromMassEnrich(
massEnrichment=massEnrich
)
self.setMassFrac("B10", gBoron10)
self.setMassFrac("B11", gBoron11)
self.setMassFrac("C", gCarbon)
self.p.refDens = DEFAULT_MASS_DENSITY
# TD reference : Dunner, Heuvel, "Absorber Materials for control rod systems of fast breeder reactors"
# Journal of nuclear materials, 124, 185-194, (1984)."
self.p.theoreticalDensityFrac = (
DEFAULT_THEORETICAL_DENSITY_FRAC # normally is around 0.88-93.
)

This non-unity fraction is used whenever the material density is queried:

armi/armi/materials/b4c.py

Lines 160 to 178 in 37f5479

def density(self, Tk: float = None, Tc: float = None) -> float:
"""
Return density that preserves mass when thermally expanded in 2D.
Notes
-----
- applies theoretical density of B4C to parent method
"""
return material.Material.density(self, Tk, Tc) * self.p.theoreticalDensityFrac
def density3(self, Tk: float = None, Tc: float = None) -> float:
"""
Return density that preserves mass when thermally expanded in 3D.
Notes
-----
- applies theoretical density of B4C to parent method
"""
return material.Material.density3(self, Tk, Tc) * self.p.theoreticalDensityFrac

There is also the ability to specify the theoretical density fraction using the TD_frac material modification, which is a good thing:

def applyInputParams(
self, B10_wt_frac=None, theoretical_density=None, TD_frac=None, *args, **kwargs
):
if B10_wt_frac is not None:
# we can't just use the generic enrichment adjustment here because the
# carbon has to change with enrich.
self.adjustMassEnrichment(B10_wt_frac)
if theoretical_density is not None:
runLog.warning(
"The 'threoretical_density' material modification for B4C will be "
"deprecated. Update your inputs to use 'TD_frac' instead.",
single=True,
)
if TD_frac is not None:
runLog.warning(
"Both 'theoretical_density' and 'TD_frac' are specified "
f"for {self}. 'TD_frac' will be used."
)
else:
self.updateTD(theoretical_density)
if TD_frac is not None:
self.updateTD(TD_frac)

The bad part about that is that all other material classes return a fully-dense material by default. If you want a version of the material with lower density, generally you should use the associated material modification TD_frac. But for B4C, you actually need to use TD_frac to get a full-density material. So this means that the B4C class is inconsistent with our other materials, but it is not documented as such.

I did want to change this as part of #1114 , but since it would be an API-breaking change and it proved a bit more challenging than expected, I decided to just report it here for future work instead. B4C, being as ubiquitous as it is, is used allllllll over our repos, and this could be tricky to implement a change.

@ntouran
Copy link
Member

ntouran commented Jan 24, 2023

B4C is a ceramic and ceramics are always manufactured at less than their max theoretical density. B4C in particular is typically around 90%. This is a lot different from typical metals and coolants and stuff. I still feel that it's reasonable to use a typical B4C TD as the default. I think the big concern otherwise is that if you default to a physically impossible full TD B4C beginners may think their rod worth is a lot higher than it actually is.

I do agree that it should be more clearly documented.

@john-science
Copy link
Member

Based on Nick's comment above, I would prefer to leave B4C as-is, and add a comment/docstring explaining the matter.

@keckler Thoughts?

@keckler
Copy link
Member Author

keckler commented Jan 24, 2023

Totally fine with the solution being better documentation. Let's go with that.

I will point out, however, that we don't do the same for other ceramics which suffer from the same physical reality that they are difficult to produce at 100% TD (UO2, ThO2, MOX). So I still view this as inconsistent and somewhat confusing.

I'll go put a comment in the docstring!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants