sensitivity and uncertainty analysis of haleu/hbu fuel
TRANSCRIPT
ORNL is managed by UT-Battelle, LLC for the US Department of Energy
Sensitivity and Uncertainty Analysis of HALEU/HBU Fuel using SAMPLER
Ugur Mertyurek
Rike Bostelman
Andrew Holcomb
SCALE Users' Group Workshop, August 4-6, 2021
Part I: How it Works?
33
Sampler: A Module for Statistical Uncertainty Analysis with SCALE SequencesCalculates uncertainty in any result of a SCALE computation due to two basic types of uncertainty
• nuclear data uncertainty– cross sections– fission yield– decay– recoverable energy– kinetics
• input parameter uncertainty– geometry – composition – and anything else that appears in an input file
*
44
Sources of Sampler Nuclear Data Uncertainty• Cross section covariances:ENDF/B-VII.1 supplemented by other sources (SCALE cov. library)
Pu239 fissioncovariance
Yield covariance
• Fission product yield:Standard deviations from ENDF/B-VII; correlations generated by combining independent and cumulative yields
• Decay data:ENDF-VII.1 modified to include branching correlations due to constraint that branch sum=1.0
55
Decay data and Fission Product Yield Uncertainties
half-lifeintegral fission yield
(β-,n) (β-,n)
• Independent FP yields are mainly from model calculations… have large uncertainties
• Cumulative FP yields based largely on measurements… have smaller uncertainties
• Beta-delayed neutron branching ratiosusually have large uncertainties
66
Nuclear Data Uncertainty
• Sampler can propagate uncertainty assumed in model inputs.– User has control over input parameter uncertainty used.– User has NO control over nuclear data uncertainty used.
• Nuclear data uncertainty is a current hot topic– How should nuclear data evaluators map uncertainty in measurements to
uncertainty in evaluated cross sections?– What are the appropriate distributions ? Normal ? Log-normal ?– How is cross-correlation handled ? Can two reactions be correlated? Can two
different nuclides have correlated reactions ?– SCALE's nuclear data uncertainty is based on ENDF/B-VII.1 with lots of gaps filled in.
Other evaluated libraries (JEFF) have fewer gaps.
77
Cross Section Covariance
Decay Data Covariances
F.P. Yield covariances
XSUSA / CLAROL+ / PERT+
Perturbed Cross Sections
Perturbed λ’s, Branch Fractions
Perturbed F.P. Yields
Generation of Perturbed Nuclear Data Samples
88
UQ Calculations with Coupled Transport/Depletion
Sampler
𝑋𝑋𝑋𝑋1
𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦1
𝑦𝑦𝑦𝑦𝑑𝑑𝑑𝑑𝑦𝑦1
...
𝑋𝑋𝑋𝑋2
𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦2
𝑦𝑦𝑦𝑦𝑑𝑑𝑑𝑑𝑦𝑦2
𝑋𝑋𝑋𝑋𝑁𝑁
𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑁𝑁
𝑦𝑦𝑦𝑦𝑑𝑑𝑑𝑑𝑦𝑦𝑁𝑁
𝑃𝑃𝑦𝑦𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑦𝑦𝑦𝑦𝑋𝑋𝑋𝑋,𝑌𝑌𝑦𝑦𝑦𝑦𝑦𝑦𝑦𝑦,𝐷𝐷𝑦𝑦𝑑𝑑𝑑𝑑𝑦𝑦,𝐾𝐾𝑦𝑦𝐾𝐾𝑦𝑦𝑃𝑃𝑦𝑦𝑑𝑑𝐾𝐾 𝐷𝐷𝑑𝑑𝑃𝑃𝑑𝑑
𝑇𝑇𝑃𝑃𝑑𝑑𝐾𝐾𝐾𝐾𝑇𝑇𝑇𝑇𝑃𝑃𝑃𝑃
𝐷𝐷𝑦𝑦𝑇𝑇𝑦𝑦𝑦𝑦𝑃𝑃𝑦𝑦𝑇𝑇𝐾𝐾
𝑇𝑇𝑃𝑃𝑑𝑑𝐾𝐾𝐾𝐾𝑇𝑇𝑇𝑇𝑃𝑃𝑃𝑃
𝐷𝐷𝑦𝑦𝑇𝑇𝑦𝑦𝑦𝑦𝑃𝑃𝑦𝑦𝑇𝑇𝐾𝐾
𝑇𝑇𝑃𝑃𝑑𝑑𝐾𝐾𝐾𝐾𝑇𝑇𝑇𝑇𝑃𝑃𝑃𝑃
𝐷𝐷𝑦𝑦𝑇𝑇𝑦𝑦𝑦𝑦𝑃𝑃𝑦𝑦𝑇𝑇𝐾𝐾
𝐼𝐼𝐾𝐾𝑇𝑇𝑃𝑃𝑇𝑇𝑇𝑇𝑦𝑦𝑑𝑑𝐾𝐾1
𝐼𝐼𝐾𝐾𝑇𝑇𝑃𝑃𝑇𝑇𝑇𝑇𝑦𝑦𝑑𝑑𝐾𝐾2
𝐼𝐼𝐾𝐾𝑇𝑇𝑃𝑃𝑇𝑇𝑇𝑇𝑦𝑦𝑑𝑑𝐾𝐾𝑁𝑁
𝑂𝑂𝑃𝑃𝑃𝑃𝑇𝑇𝑃𝑃𝑃𝑃 𝑋𝑋𝑃𝑃𝑑𝑑𝑃𝑃𝑦𝑦𝐾𝐾𝑃𝑃𝑦𝑦𝑑𝑑𝐾𝐾(𝑚𝑚,𝝈𝝈, 𝑑𝑑𝑇𝑇𝑃𝑃𝑃𝑃𝑦𝑦𝑦𝑦𝑑𝑑𝑃𝑃𝑦𝑦𝑇𝑇𝐾𝐾𝐾𝐾 𝑦𝑦𝑃𝑃𝑑𝑑. )SCALE Model
Model Perturber
AnalyzerResponse Collector
99
Sampler Input
Sampler run time parameters: what to perturb, how many samples, libraries etc.
Case : A set of SCALE sequences (any) for your analysis
Response : Quantity of interest Sampler is requested to post process
=samplerread parameters
...end parameters
read case [myCase]sequence=polaris/origen/opus
... end sequence
end case
read variable [myVariable]...
end variable
read response [myResponse]...
end responseend
Variable : A variable in your SCALE simulation, that is allowed to be modified by Sampler
1010
Nuclear Data Perturbations
read parametersn_samples = 1000perturb_xs = yesperturb_decay = yesperturb_yields = yesperturb_kinetics = yes
end parameters
Notes• only 1000 pre-calculated nuclear
data perturbations available• with nuclear data-only
import=“x.inp” makes sampler ”case” trivial
$ROOT/src/Sampler/tutorials/burst_fission/burst_sampler.inp
1111
Perturbation of Compositions and Geometry
• Quantify uncertainties, or calculate correlation coefficients• Choose from several parametrized distributions for sampling composition
and geometry inputs (uniform, normal, beta)• Use simple mathematical expressions to calculate perturbed inputs
(𝐿𝐿 = 𝐴𝐴/sin(𝑊𝑊) where 𝑊𝑊 = 𝑁𝑁(𝜇𝜇,𝜎𝜎) )• Assign common perturbations to specified cases allowing identical
realizations for shared characteristics• Specify uncertain input parameter by using
– special variable names – SCALE Input Retrieval Engine (SIREN) to point its location in the SCALE input
User options to:
1212
Two Options for Declaring Uncertain Input Parameters
• Easy way: variables Substitute number in input with #{variable_name} and define variable
• Hard way: SIRENDeclare an uncertain variable by pointing it using a special “XPATH” like notation /path/to/variable
comp c_u : ENRU 3.5comp c_uox : FORM
c_u=1.0 o=2.0comp c_fuel : WT
c_uox=95.0 GD2O3=5.0
Polaris Composition
comp c_u : ENRU #{enr}comp c_uox : FORM
c_u=1.0 o=#{stoich}comp c_fuel : WT
c_uox=#{uox} GD2O3=#{gd}
With Placeholder Variables
1313
Variable Blocks – Normal Distributionread variable[stoich]
distribution=normalvalue=2.00stddev=0.01min=1.98max=2.02
end variable
read variable[ID]distribution=normalvalue=astddev=bminimum=cmaximum=dcases=c1 end
end variable
a
b
c d
comp c_u : ENRU #{enr}comp c_uox : FORM
c_u=1.0 o=#{stoich}comp c_fuel : WT
c_uox=#{uox} GD2O3=#{gd}
1414
Variable Blocks – Beta Distributionread variable[r_f]
distribution=betaminimum=0.4090maximum=0.4100beta_a=2 beta_b=1
end variable
read variable[ID]distribution=betabeta_a=αbeta_b=βminimum=cmaximum=dcases= c1 end
end variable
pin 1 : #{r_f} 0.418 0.475 : FUEL GAP CLAD
1515
Variable Blocks – Expression
comp c_u : ENRU #{enr}comp c_uox : FORM
c_u=1.0 o=#{stoich}comp c_fuel : WT
c_uox=#{uox} GD2O3=#{gd}
read variable[gd]distribution=normalvalue=5.0stddev=0.1
end variable
read variable[uox]distribution=expressionexpression="100.0 - gd"
end variable
1616
Allowed ExpressionsOperator Example
floor(x) floor(1)=1, floor(-1.0)=-1.0, floor(-1.1)=-2.0
ceil(x) ceil(1)=1,ceil(-1.1)=-1
round(x) round(1.1)=1,round(1.5)=2,round(1.9)=2roundn(x,n) roundn(1.15,1)= 1.2, roundn(1.519,2)= 1.52cos(x) cos(0.0)=1
sin(x) sin(0.0)=0
tan(x) tan(0.0)=0
sec(x) sec(0.0)=1
csc(x) csc(1.0)= 1.1884
cot(x) cot(1.0)= 0.642093
sinh(x) sinh(1.0)= 1.1752
cosh(x) cosh(1.0)= 1.54308
tanh(x) tanh(1.0)= 0.761594
log(x) log(2.7182818)=1
log10(x) log10(10.0)=1
exp(x) exp(1)=2.7182818
clamp(l,x,u) clamp(-1,1,+1)=1,clamp(-1,-5,+1)=-1
inrange(l,x,u) inrange(-1,1,+1)=1,inrange(-1,-5,+1)=0
sgn(x) sgn(+1)=1,sgn(-1)=-1,sgn(0)=0,sgn(5)=1
sqrt(x) sqrt(1)=1,sqrt(4)=2
root(x,y) root(4,2)=2,root(8,3)=2
true true
false False
if(cond,true,false) if( x > y, x, y) = x
Operator Example+ 3+3, x+y+ +3, +(-3), +x- 3-3, x-y- -3, -(3+3), -x* 3*3, x*y/ 3/3, x/y% 3%3, x%y^ 3^3, x^y== 3==3, x==y!= 3!=3, x!=y< 3<3, x<y> 3>3, x>y<= 3<=3, x<=y>= 3>=3, x>=yand 1 and 1 , x==y and y==zor 1 or 1, x==y or y==znand 1 nand 1, 1 nand 0, x nand y
xor 1 xor 1, 1 xor 0, x xor ynor 1 nor 1, 1 nor 0, x nor yabs(x) abs(1),abs(-1),abs(x),abs(y)min(x,…n) min(1),min(1,2,3,4,5,x,y),etcmax(x,…n) max(1),max(1,2,3,4,5,x,y),etcavg(x,…n) avg(1),avg(1,2,3,4,5,x,y),etcSum(x,…n) sum(1),sum(1,2,3,4,5,x,y),etcmul(x,…n) mul(1),mul(1,2,3,4,5,x,y),etcfloor(x) floor(1)=1, floor(-1.0)=-1.0, floor(-1.1)=-2.0
1717
Variables: Example
• Placeholders are variable IDsinside #{}, e.g., #{NORMAL}
• Must have perturb_geometry=yes• It is defined inside the case it applies or
outside of all cases with a cases card• Using shell as a sequence is an easy
way to test the sampling process
=samplerread parameters
n_samples = 5perturb_bondarenko = noperturb_pointwise = noperturb_xs = noperturb_geometry = yesforce_run = yes
end parameters
read case[c1]sequence=shell
echo NORMAL= #{NORMAL}echo UNIFORM= #{UNIFORM}
end sequenceend case
read variable[NORMAL]distribution=normalminimum=-2 value=-1 maximum=0 stddev=2cases=c1 end
end variable
read variable[UNIFORM]distribution=uniformminimum=-2 value=-1 maximum=0cases=c1 end
end variableend
1818
Responses• Collects quantities of interest from the perturbed SCALE cases
• TYPE– grep – general expression from the text output file– opus_plt – data from an OPUS-generated PLT file– triton – TRITON homogenized cross-sections (xfile016)– stdcmp – standard composition files– origen_nuclides – concentrations from the F71 ORIGEN dump– variables – the geometry perturbation sampled values
read response[NAME]type=TYPE[type-specific-params]
end variable
1919
Grep Example
• grep to extract
• alternative using ":scale.number:"
read response[mykeff]type=grepregexp="keff = [[:digit:]]\.[[:digit:]]*"regexp="[[:digit:]]\.[[:digit:]]*"
end response
line beforekeff = 1.23467line after
keff = 1.23467
1.23467read response[mykeff]type=grepregexp="keff = :scale.number:"regexp=":scale.number:"
end response
• inside .out file somewhere
20
Response type:origen_nuclidesorigen_nuclides
units fixed (moles)
nuclides user chooses at post-processing time (do not need to rerun sampler to look at different nuclides!)
filename *.samplerfiles/${SUBDIR}/${OUTBASENAME}.f71
format binary
precision 16 digits
• Multiple names for the file that contains isotopics
• ORIGEN (binary) concentrations file (ft71, f71)
• Traditionally has the file name "ft71f001" in the SCALE temporary calculation directory
• Sampler has it's own rule to copy
${TMPDIR}/ft71f001*.samplerfiles/my_pert_c00001/ my_pert_c00001.f71
• Sampler must find this file or it redoes the calculation!
• The extra file copies Sampler sets up must succeed or it will not post-process.
21
Response type:origen_nuclidesorigen_nuclides
units fixed (moles)
nuclides user chooses at post-processing time (do not need to rerun sampler to look at different nuclides!)
filename *.samplerfiles/${SUBDIR}/${OUTBASENAME}.f71
format binary
precision 16 digits
• User can ask for any of the tracked 2237 nuclidesread param
force_run=noend param…read response[moles]
type=origen_nuclidesmixture=1 nuclides= rn-200 rn-221 rn-222
rn-223 rn-224 rn-225 rn-226 end
end response
• ft71f001 is just a "stack" of isotopics vectors• when read (e.g. by ORIGEN or OPUS), a printout of
contents is shown
• Access specific ranges in the ft71f001 using either• step_from=X step_to=Y• mixture=C where C is a case number
(ORIGEN/Polaris) or mixture id (TRITON)
22
Response type:opus_pltopus_plt
units user chooses
nuclides user chooses at runtime via powerful ranking or explicit selection
filename *.samplerfiles/${OUTBASENAME}.<n>.plt (where <n> is a very long integer starting at 0)
format text
precision 5 digits
• Each “=opus” call creates a numbered *.plt file from an ORIGEN concentration file
'first opus creates *0.plt file=opus
data="ft71f001"library="end7dec"units=curiesnrank=40symnuc=rn-222 end
end
• The Sampler response accesses the file by the ndataset number (depletion step)
'access *0.plt contentsread response[mycuries]
type=opus_pltndataset=0nuclides=rn-222 total end
end response
23
Response type:opus_pltopus_plt
units user chooses
nuclides user chooses at runtime via powerful ranking or explicit selection
filename *.samplerfiles/${OUTBASENAME}.<n>.plt (where <n> is a very long integer starting at 0)
format text
precision 5 digits
• By default OPUS gives top 40 nuclides contributing to the units of interest
• E.g., if units=curies, top 40 curie-producing isotopes
• In Sampler, only available nuclides can be output—includes powerful total and subtotal
• OPUS .plt format is simpletime (d)Cinuclide6 24
0.000e+00 3.653e+03 3.653e+05 3.653e+07 3.653e+09 3.653e+11u238 8.001e-05 8.001e-05 8.001e-05 8.001e-05 7.989e-05 6.852e-05
th234 0.000e+00 8.001e-05 8.001e-05 8.001e-05 7.989e-05 6.852e-05pa234m 0.000e+00 8.001e-05 8.001e-05 8.001e-05 7.989e-05 6.852e-05
u234 0.000e+00 2.238e-09 2.256e-07 1.968e-05 7.989e-05 6.852e-05pb210 0.000e+00 1.089e-17 1.347e-10 7.086e-06 7.989e-05 6.852e-05bi210 0.000e+00 1.089e-17 1.347e-10 7.086e-06 7.989e-05 6.852e-05po210 0.000e+00 1.089e-17 1.347e-10 7.086e-06 7.989e-05 6.852e-05po218 0.000e+00 1.484e-16 1.347e-10 7.086e-06 7.989e-05 6.852e-05rn222 0.000e+00 1.484e-16 1.347e-10 7.086e-06 7.989e-05 6.852e-05ra226 0.000e+00 1.484e-16 1.347e-10 7.086e-06 7.989e-05 6.852e-05th230 0.000e+00 1.029e-13 1.035e-09 7.086e-06 7.989e-05 6.852e-05bi214 0.000e+00 1.484e-16 1.347e-10 7.086e-06 7.989e-05 6.852e-05pb214 0.000e+00 1.484e-16 1.346e-10 7.085e-06 7.987e-05 6.850e-05po214 0.000e+00 1.484e-16 1.346e-10 7.084e-06 7.987e-05 6.850e-05pa234 0.000e+00 1.280e-07 1.280e-07 1.280e-07 1.278e-07 1.096e-07tl210 0.000e+00 3.117e-20 2.828e-14 1.488e-09 1.678e-08 1.439e-08at218 0.000e+00 2.969e-20 2.693e-14 1.417e-09 1.598e-08 1.370e-08tl206 0.000e+00 1.458e-23 1.803e-16 9.488e-12 1.070e-10 9.174e-11rn218 0.000e+00 2.969e-23 2.693e-17 1.417e-12 1.598e-11 1.370e-11hg206 0.000e+00 2.068e-25 2.559e-18 1.346e-13 1.518e-12 1.302e-12pb209 0.000e+00 2.650e-24 2.404e-18 1.265e-13 1.426e-12 1.223e-12bi209 0.000e+00 0.000e+00 5.210e-47 4.726e-41 2.487e-36 3.053e-35
subtotal 8.001e-05 2.402e-04 2.404e-04 3.307e-04 1.119e-03 9.593e-04total 8.001e-05 2.402e-04 2.404e-04 3.307e-04 1.119e-03 9.593e-04
24
Comparison
opus_plt origen_nuclidesunits user chooses fixed (moles)nuclides user chooses at runtime via
powerful ranking or explicit selection
user chooses at post-processing time (do not need to rerun sampler to look at different nuclides!)
filename *.samplerfiles/${OUTBASENAME}.<n>.plt
*.samplerfiles/${SUBDIR}/${OUTBASENAME}.f71
format text binaryprecision 5 digits 16 digits
2525
Advanced Responses• To read responses from values NOT in the *.out file directly:
1. Add a “sequence=shell” case to add the value to the output, for example, for fast total XS (note: grep statement should be on a single line):
2. Add a read response for this value in the Sampler input file, for example, for the above fast total XS:
sequence=shellpython3 myT16Parser.py –grep "' *Energy group *1” –label "total_fast= " end sequence
read response[totalxs]type=grepregexp="total_fast= *:scale.number:"regexp=":scale.number:"
end response
sequence=shellgrep "' *Energy group *1" -A 2 ${OUTDIR}/${BASENAME}.t16 | grep "^[[:space:]][[:space:]]" | awk -v label="total_fast= " "{print label,\$1}"end sequence
Shell
Python
2626
Summary
• variables– defines a distribution (normal,
uniform, beta, expression)– syntax: read variable[id] … end
variable– placeholder with #{id} is easiest way
to "insert" into input
• responses– defines a quantity of interest (QOI)– many types including "grep" for
scraping output file– cases card (6.3 beta16)
read variable[NORMAL]distribution=normalminimum=-2 value=-1 maximum=0 stddev=2cases=Case1 end
end variable
read variable[UNIFORM]distribution=uniformminimum=-2 value=-1 maximum=0cases=Case1 end
end variable
read response[RNORMAL]type=grepregexp="NORMAL= *:scale.number:"regexp=":scale.number:"
end response
read response[RUNIFORM]type=grepregexp="UNIFORM= *:scale.number:"regexp=":scale.number:"
end response
read response[VNORMAL]type=variablesdata=NORMAL end
end response
2727
Post-processing• Response tables
– Responses collected from each perturbation• csv files*• every response• every time point• standard deviation, average
solution uncertainty
(only populated by Monte Carlo transport methods)
* our csv is semi-colon (;) separated not comma (,) separated to avoid international incidents where "," is used as the decimale.g. "3,14" instead of "3.14"
2828
Post-processing• PTP Plot files
– One for each time value of the response– Scatter plots showing data points
• average vs. unperturbed – Histograms– Running averages
2929
Post-processing• Correlations/Covariances
– Available through print_cov and print_corr input options(SCALE 6.3b15 and previous)
• Between each pairs of defined responses in a response set
• Between responses for each case• Between cases for each response• Every time step• Only between static or dynamic responses• For time dependent (dynamic) responses
limited to be on the same time step
3030
Post-processing• Correlations/Covariances
– Available through Analysis input block (SCALE 6.3b16 and after)• Allows user to select case dependent responses for the analysis type• Between any response type at any depletion step/index case:response.sub(instance)• Current analysis types :
– pearson_corr (ck)–covariances –correlation_matrix –covarience_matrix – r2 (sensitivity index)
read analysis [iso_ck] type = pearson_corr target = mycase1:app.u-235(15) sources = mycase2:exp.u-235(last), mycase2:ex.pu-239(14) end
end analysis
read analysis [mycovmatrix] type = covariance_matrixsources = mycase2:exp.u-235(all) end
end analysis
read analysis [sensindex] type = r2target = mycase1:app.u-235(15) sources = h-1 u-235 u-238 end
end analysis
3131
Summary
• Sampler is a wrapper for uncertainty quantification – In any (multi-group) SCALE calculation
• Leading-edge nuclear data uncertainty– Fission product yield uncertainty– Decay data uncertainty– Multi-group cross section uncertainty– Recoverable energy (i.e., energy per fission) uncertainty– Kinetics parameters uncertainty
• Input parameter perturbations– Assign distributions to variables– Use variables in placeholders #{myvariable}– Or use SIREN to avoid copy/paste input
Part II: Git’er Done (Let’s Get it Done!)
33
Tutorial Problem• Problem : Calculate decay heat and keff uncertainties for PWR HALEU/HBU
fuel*– Load polaris_haleu.inp (simplified PWR decay heat model*) and modify
it to use Sampler• Number of samples: 500• Perturb: decay constants, fission yields, and cross sections • Library: 56g• Response: opus decay heat• Response: grep keff (Can you grep keff at EOC ?)
– Check average and std dev– Plot running averages and histograms
*https://www.ornl.gov/content/depletion-and-decayIsotopic and Fuel Lattice Parameter Trends in Extended Enrichment and Higher Burnup LWR Fuel Vol. I: PWR Fuel, ORNL/TM-2020/1833,Isotopic and Fuel Lattice Parameter Trends in Extended Enrichment and Higher Burnup LWR Fuel Vol. II: BWR Fuel, ORNL/TM-2020/1835
34
Tutorial Problem• Problem : Compare decay heat and keff uncertainties between a
traditional fuel and HALEU/HBU fuel– Add a second origen run as a separate “new case”– Modify origen input in “new case” to read isotopics at 50 GWd/MTU instead of EOC– Repeat the same steps as in the first problem– Do decay heat and keff uncertainties between the two cases related– Are there other uncertainties that effect HAELU/HBU or the variation in the results due
to uncertainties in similar data?– How do we answer these questions in SCALE 6.3?