Trying to get responsive control rods. Currently not working, but framework is in place

This commit is contained in:
Adam Parler 2023-11-11 22:37:19 -08:00
parent e9c4ec0104
commit 2ee5cdbe17
12 changed files with 530 additions and 359 deletions

View file

@ -6,7 +6,6 @@ Provides a container class of all BEAVRS lattices
import openmc
import beavrs.constants as c
from beavrs.corebuilder import TemplatedLattice
from beavrs.corebuilder import InfinitePinCell
@ -32,11 +31,12 @@ class Assemblies(object):
['fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel', ' fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel', 'fuel']
]
def __init__(self, pincells, mats):
def __init__(self, pincells, mats, c):
""" Creates BEAVRS pincell universes """
self.pins = pincells
self.mats = mats
self.c = c
self._add_lattice_surfs()
self._add_assembly_surfs()
@ -50,7 +50,7 @@ class Assemblies(object):
# Rectangular prism around the edge of the pinlattice
self.lattice_surfs = \
openmc.rectangular_prism(17*c.pinPitch, 17*c.pinPitch)
openmc.rectangular_prism(17*self.c.pinPitch, 17*self.c.pinPitch)
def _add_assembly_surfs(self):
@ -58,7 +58,7 @@ class Assemblies(object):
# Rectangular prism around the edge of the pinlattice
self.assem_surfs = \
openmc.rectangular_prism(c.latticePitch, c.latticePitch)
openmc.rectangular_prism(self.c.latticePitch, self.c.latticePitch)
def _add_bpra_layouts(self):
@ -256,8 +256,8 @@ class Assemblies(object):
# Make the pin lattice
lattice = TemplatedLattice(name=name)
lattice.setTemplate(self.pin_lattice_template)
lattice.pitch = [c.pinPitch, c.pinPitch]
lattice.lower_left = [-17.*c.pinPitch/2., -17.*c.pinPitch/2.]
lattice.pitch = [self.c.pinPitch, self.c.pinPitch]
lattice.lower_left = [-17.*self.c.pinPitch/2., -17.*self.c.pinPitch/2.]
lattice.setPosition('center', u_c)
lattice.setPosition('fuel', self.pins.u_fuel_p[enr])
lattice.updatePositions(gt_spec)

View file

@ -9,17 +9,16 @@ assemblies
import openmc
import beavrs.constants as c
from beavrs.corebuilder import InfinitePinCell
class Baffle(object):
def __init__(self, assemblies, mats):
def __init__(self, assemblies, mats, c):
""" Creates BEAVRS baffle universes """
self.assem = assemblies
self.mats = mats
self.c = c
self._add_baffle_universes()
@ -31,10 +30,10 @@ class Baffle(object):
# North Baffle
self.u_baffle_N = openmc.Universe(name='Baffle North')
self.s_baffle_N_gap = openmc.YPlane(name='North Baffle Water Gap Surface',
y0=c.latticePitch/2-c.baffleWaterGap)
y0=self.c.latticePitch/2-self.c.baffleWaterGap)
self.s_baffle_N = openmc.YPlane(name='North Baffle Surface',
y0=c.latticePitch/2 - c.baffleWaterGap
- c.baffleWidth)
y0=self.c.latticePitch/2 - self.c.baffleWaterGap
- self.c.baffleWidth)
self.c_baffle_N1 = openmc.Cell(name='North Baffle Water Gap',
fill=self.mats['Borated Water'])
self.c_baffle_N1.region = +self.s_baffle_N_gap
@ -68,10 +67,10 @@ class Baffle(object):
# North West Corner Baffle
self.u_baffle_NW = openmc.Universe(name='Baffle North West Corner')
self.s_baffle_W_gap = openmc.XPlane(name='West Baffle Water Gap Surface',
x0=c.baffleWaterGap-c.latticePitch/2)
x0=self.c.baffleWaterGap-self.c.latticePitch/2)
self.s_baffle_W = openmc.XPlane(name='West Baffle Surface',
x0=c.baffleWaterGap + c.baffleWidth
- c.latticePitch/2)
x0=self.c.baffleWaterGap + self.c.baffleWidth
- self.c.latticePitch/2)
self.c_baffle_C1 = openmc.Cell(name='Corner Baffle Water Gap N',
fill=self.mats['Borated Water'])
self.c_baffle_C1.region = +self.s_baffle_N_gap

View file

@ -6,10 +6,11 @@ the BEAVRS geometry.
"""
import warnings
import numpy as np
import openmc
import beavrs.constants as c
from beavrs.constants import Constants
from beavrs.materials import openmc_materials
from beavrs.pincells import Pincells
from beavrs.assemblies import Assemblies
@ -24,32 +25,42 @@ warnings.simplefilter('once', DeprecationWarning)
class BEAVRS(object):
""" Main BEAVRS class"""
def __init__(self, boron_ppm=c.nominalBoronPPM, is_symmetric=False, is_2d=False):
def __init__(self, boron_ppm=None, is_symmetric=False, is_2d=False, S=None, SS=None):
""" We build the entire geometry in memory in the constructor """
# TODO: make the control rod bank insertion heights attributes
self.c = Constants(S,SS)
if boron_ppm is not None:
self.boron_ppm = boron_ppm
else:
self.boron_ppm = self.c.nominalBoronPPM
self.is_symmetric = is_symmetric
self.is_2d = is_2d
# Setup the materials
self.mats = openmc_materials(ppm=boron_ppm)
self.mats = openmc_materials(self.c, ppm=self.boron_ppm)
self.pincells = Pincells(self.mats)
self.assemblies = Assemblies(self.pincells, self.mats)
self.baffle = Baffle(self.assemblies, self.mats)
self.core = Core(self.pincells, self.assemblies, self.baffle, is_symmetric=is_symmetric)
self.main_universe = UniverseZero(self.core, self.mats, is_2d=is_2d)
self.pincells = Pincells(self.mats, self.c)
self.assemblies = Assemblies(self.pincells, self.mats, self.c)
self.baffle = Baffle(self.assemblies, self.mats, self.c)
self.core = Core(self.pincells, self.assemblies, self.baffle, self.c, is_symmetric=self.is_symmetric)
self.main_universe = UniverseZero(self.core, self.mats, self.c, is_2d=self.is_2d)
self.openmc_geometry = openmc.Geometry(self.main_universe)
self.settings_batches = 10
self.settings_inactive = 5
self.settings_particles = 1000
baffle_flat = 7.5*c.latticePitch
baffle_flat = 7.5*self.c.latticePitch
if is_2d:
self.settings_sourcebox = [-baffle_flat, -baffle_flat, c.struct_LowestExtent_2d,
baffle_flat, baffle_flat, c.struct_HighestExtent_2d]
self.settings_sourcebox = [-baffle_flat, -baffle_flat, self.c.struct_LowestExtent_2d,
baffle_flat, baffle_flat, self.c.struct_HighestExtent_2d]
else:
self.settings_sourcebox = [-baffle_flat, -baffle_flat, c.fuel_Rod_bot,
baffle_flat, baffle_flat, c.fuel_Rod_top]
self.settings_sourcebox = [-baffle_flat, -baffle_flat, self.c.fuel_Rod_bot,
baffle_flat, baffle_flat, self.c.fuel_Rod_top]
self.settings_output_tallies = False
self.settings_summary = True
self.settings_output_distribmats = False
@ -109,6 +120,7 @@ class BEAVRS(object):
self.depletion_nuclides = nuclides
def set_boron_ppm(self, ppm):
self.ppm = ppm
self.mats = openmc_materials(ppm=ppm)
def write_openmc_geometry(self):
@ -123,7 +135,7 @@ class BEAVRS(object):
@property
def plots(self):
plots = Plots(self.mats)
plots = Plots(self.mats, self.c)
plot_file = openmc.Plots(plots.plots)
return plot_file
@ -152,6 +164,8 @@ class BEAVRS(object):
output = {'tallies': self.settings_output_tallies,
'summary': self.settings_summary}
settings_file.output = output
settings_file.confidence_intervals = False
settings_file.seed = np.random.randint(1e14, dtype=np.uint64)
return settings_file
def write_openmc_settings(self):
@ -170,10 +184,48 @@ class BEAVRS(object):
def write_openmc_tallies(self):
self.common_tallies.export_to_xml()
def set_volumes(self, samples=100000):
def set_S(self,val):
self.c.S = val
self.pincells = Pincells(self.mats, self.c)
self.assemblies = Assemblies(self.pincells, self.mats, self.c)
self.baffle = Baffle(self.assemblies, self.mats, self.c)
self.core = Core(self.pincells, self.assemblies, self.baffle, self.c, is_symmetric=self.is_symmetric)
self.main_universe = UniverseZero(self.core, self.mats, self.c, is_2d=self.is_2d)
self.openmc_geometry = openmc.Geometry(self.main_universe)
def set_SS(self,val):
self.c.SS = val
self.pincells = Pincells(self.mats, self.c)
self.assemblies = Assemblies(self.pincells, self.mats, self.c)
self.baffle = Baffle(self.assemblies, self.mats, self.c)
self.core = Core(self.pincells, self.assemblies, self.baffle, self.c, is_symmetric=self.is_symmetric)
self.main_universe = UniverseZero(self.core, self.mats, self.c, is_2d=self.is_2d)
self.openmc_geometry = openmc.Geometry(self.main_universe)
def export_model(self) -> openmc.Model:
model = openmc.Model(geometry=self.openmc_geometry, materials=self.materials,
settings=self.settings, tallies=self.common_tallies, plots=self.plots)
model.settings.seed = np.random.randint(1e14, dtype=np.uint64)
return model
def export_xml(self,as_model:bool=False):
if as_model:
self.export_model().export_to_model_xml()
else:
self.export_model().export_to_xml()
def set_volumes(self, samples:int=100000) -> None:
self.settings_volumes = openmc.VolumeCalculation(domains=[self.main_universe], samples=samples, lower_left=(-170, -170, 0), upper_right=(170, 170, 420))
def set_params(self, particles=None, batches=None, inactive=None):
def set_params(self, particles:int=None, batches:int=None, inactive:int=None) -> None:
if particles: self.settings_particles = particles
if batches: self.settings_batches = batches
if inactive: self.settings_inactive = inactive
@ -182,8 +234,8 @@ class BEAVRS(object):
""" Sets a DD mesh that covers the whole geometry
"""
self.dd_mesh_dimension = [nx, ny, nz]
self.dd_mesh_lower_left = [-c.rpvOR, -c.rpvOR, c.struct_LowestExtent]
self.dd_mesh_upper_right = [c.rpvOR, c.rpvOR, c.struct_HighestExtent]
self.dd_mesh_lower_left = [-self.c.rpvOR, -self.c.rpvOR, self.c.struct_LowestExtent]
self.dd_mesh_upper_right = [self.c.rpvOR, self.c.rpvOR, self.c.struct_HighestExtent]
self.dd_nodemap = nodemap
self.dd_truncate = False
@ -191,28 +243,28 @@ class BEAVRS(object):
""" Sets a DD mesh that truncates tracking outside the shield panels
"""
self.dd_mesh_dimension = [nx, ny, nz]
self.dd_mesh_lower_left = [-c.neutronShieldOR, -c.neutronShieldOR, c.struct_LowestExtent]
self.dd_mesh_upper_right = [c.neutronShieldOR, c.neutronShieldOR, c.struct_HighestExtent]
self.dd_mesh_lower_left = [-self.c.neutronShieldOR, -self.c.neutronShieldOR, self.c.struct_LowestExtent]
self.dd_mesh_upper_right = [self.c.neutronShieldOR, self.c.neutronShieldOR, self.c.struct_HighestExtent]
self.dd_nodemap = nodemap
self.dd_truncate = True
def set_dd_mesh_assembly_restricted(self, nz, nodemap=None):
""" Sets a restricted DD mesh that is assembly-sized radially, and user-specified axially
"""
lp = c.latticePitch
lp = self.c.latticePitch
self.dd_mesh_dimension = [17, 17, nz]
self.dd_mesh_lower_left = [-8*lp, -8*lp, c.struct_LowestExtent]
self.dd_mesh_upper_right = [8*lp, 8*lp, c.struct_HighestExtent]
self.dd_mesh_lower_left = [-8*lp, -8*lp, self.c.struct_LowestExtent]
self.dd_mesh_upper_right = [8*lp, 8*lp, self.c.struct_HighestExtent]
self.dd_nodemap = nodemap
self.dd_truncate = True
def set_dd_mesh_3assembly_restricted(self, nz, nodemap=None):
""" Sets a restricted DD mesh that is 3x3 assebly-sized radially, and user-specified axially
"""
lp = c.latticePitch
lp = self.c.latticePitch
self.dd_mesh_dimension = [7, 7, nz]
self.dd_mesh_lower_left = [-10*lp, -10*lp, c.struct_LowestExtent]
self.dd_mesh_upper_right = [10*lp, 10*lp, c.struct_HighestExtent]
self.dd_mesh_lower_left = [-10*lp, -10*lp, self.self.c.struct_LowestExtent]
self.dd_mesh_upper_right = [10*lp, 10*lp, self.self.c.struct_HighestExtent]
self.dd_nodemap = nodemap
self.dd_truncate = True

View file

@ -1,178 +1,274 @@
import math
############## Material paramters ##############
class Constants(object):
h2oDens = 0.73986
nominalBoronPPM = 975
############## Material paramters ##############
############## Geometry paramters ##############
h2oDens = 0.73986
nominalBoronPPM = 975
S = 315
SS = 0
## pincell parameters
pelletOR = 0.39218 #
cladIR = 0.40005 #
cladOR = 0.45720 #
rodGridSide_tb = 1.22030 #
rodGridSide_i = 1.22098 #
guideTubeIR = 0.56134 #
guideTubeOR = 0.60198 #
guideTubeDashIR = 0.50419 #
guideTubeDashOR = 0.54610 #
rcca_clad_OR = 0.48387 # ML033530020 page 15
rcca_clad_IR = 0.38608 # ML033530020 page 15
rcca_b4c_OR = 0.37338 # ML033530020 page 15
rcca_aic_OR = 0.38227 # ML033530020 page 15
rcca_spacer_OR = 0.37845 # ML033530020 page 15
rcca_spring_OR = 0.06459 # Assumed same as fuel
burnabs1 = 0.21400 #
burnabs2 = 0.23051 #
burnabs3 = 0.24130 #
burnabs4 = 0.42672 #
burnabs5 = 0.43688 #
burnabs6 = 0.48387 #
instrTubeIR = 0.43688 # no source
instrTubeOR = 0.48387 # no source
plenumSpringOR = 0.06459 # frapcon source - see beavrs_spring.ods
# bite position is bank D at 213 steps withdrawn
_D = max(0,228-S)
_C = 228 if _D > 113 else max(0, 228-S+113 +2)
_B = 228 if _C > 113 else max(0, 228-S+113*2+4)
_A = 228 if _B > 113 else max(0, 228-S+113*3+6)
## lattice parameters
pinPitch = 1.25984 #
latticePitch = 21.50364 #
gridstrapSide = 21.49595 #
_SA = 228-SS
_SB = 228-SS
_SC = 228-SS
_SD = 228-SS
_SE = 228-SS
## <!--- axials copied straight from rod_axials.ods
print(" RCCA Positions")
print(f" A: {_A} B: {_B} C: {_C} D: {_D}")
print(f" SA: {_SA} SB: {_SB} SC: {_SC} SD: {_SD} SE: {_SE}")
# Core Structures
struct_LowestExtent = 0.00000 #
struct_SupportPlate_bot = 20.0000 # arbitrary amount of water below core
struct_SupportPlate_top = 25.0000 # guessed
struct_LowerNozzle_bot = 25.0000 # same as struct_SupportPlate_top
struct_LowerNozzle_top = 35.0000 # approx from ** NDR of 4.088in for lower nozzle height
struct_LowestExtent_2d = 220.000 # arbitrary lower slice for 2D problem
struct_HighestExtent_2d = 230.000 # arbitrary upper slice for 2D problem
struct_UpperNozzle_bot = 423.049 # fig 4.2-3 from Watts Bar Unit 2 safety analysis report
struct_UpperNozzle_top = 431.876 # fig 4.2-3 from Watts Bar Unit 2 safety analysis report
struct_HighestExtent = 460.000 # arbitrary amount of water above core
## Steps withdrawn for each RCCA bank
rcca_bank_steps_withdrawn = {
'A': _A,
'B': _B,
'C': _C,
'D': _D,
'SA': _SA,
'SB': _SB,
'SC': _SC,
'SD': _SD,
'SE': _SE,
}
rcca_banks = rcca_bank_steps_withdrawn.keys()
# Fuel Rod
fuel_Rod_bot = 35.0000 # same as struct_LowerNozzle_top
fuel_LowerFitting_bot = 35.0000 # ML033530020 Fig 2-7
fuel_LowerFitting_top = 36.7480 # ML033530020 Fig 2-7
fuel_ActiveFuel_bot = 36.7480 # ML033530020 Fig 2-7
fuel_ActiveFuel_top = 402.508 # ML033530020 Fig 2-7
fuel_Plenum_bot = 402.508 # ML033530020 Fig 2-7
fuel_Plenum_top = 417.164 # ML033530020 Fig 2-7
fuel_UpperFitting_bot = 417.164 # ML033530020 Fig 2-7
fuel_UpperFitting_top = 419.704 # ML033530020 Fig 2-7
fuel_Rod_top = 419.704 # ML033530020 Fig 2-7
## pincell parameters
pelletOR = 0.39218 #
cladIR = 0.40005 #
cladOR = 0.45720 #
rodGridSide_tb = 1.22030 #
rodGridSide_i = 1.22098 #
guideTubeIR = 0.56134 #
guideTubeOR = 0.60198 #
guideTubeDashIR = 0.50419 #
guideTubeDashOR = 0.54610 #
rcca_clad_OR = 0.48387 # ML033530020 page 15
rcca_clad_IR = 0.38608 # ML033530020 page 15
rcca_b4c_OR = 0.37338 # ML033530020 page 15
rcca_aic_OR = 0.38227 # ML033530020 page 15
rcca_spacer_OR = 0.37845 # ML033530020 page 15
rcca_spring_OR = 0.06459 # Assumed same as fuel
burnabs1 = 0.21400 #
burnabs2 = 0.23051 #
burnabs3 = 0.24130 #
burnabs4 = 0.42672 #
burnabs5 = 0.43688 #
burnabs6 = 0.48387 #
instrTubeIR = 0.43688 # no source
instrTubeOR = 0.48387 # no source
plenumSpringOR = 0.06459 # frapcon source - see beavrs_spring.ods
# RCCAs (0 steps withdraw, i.e., fully inserted)
rcca_Rod_bot = 39.9580 # ML033530020 Fig 2-8
rcca_LowerFitting_bot = 39.9580 # ML033530020 Fig 2-8
rcca_LowerFitting_top = 41.8280 # ML033530020 Fig 2-8
rcca_AIC_bot = 41.8280 # ML033530020 Fig 2-8
rcca_AIC_top = 143.428 # ML033530020 Fig 2-8
rcca_B4C_bot = 143.428 # ML033530020 Fig 2-8
rcca_B4C_top = 402.508 # ML033530020 Fig 2-8
rcca_Spacer_bot = 402.508 # ML033530020 Fig 2-8
rcca_Spacer_top = 403.778 # ML033530020 Fig 2-8
rcca_Plenum_bot = 403.778 # ML033530020 Fig 2-8
rcca_Plenum_top = 415.558 # ML033530020 Fig 2-8
rcca_Rod_top = 460.000 # same as struct_HighestExtent
rcca_StepWidth = 1.58193 # Active height divided into 228 steps
## lattice parameters
pinPitch = 1.25984 #
latticePitch = 21.50364 #
gridstrapSide = 21.49595 #
# BPRAs
bpra_Rod_bot = 38.6600 # ML033530020 Fig 2-9
bpra_LowerFitting_bot = 38.6600 # ML033530020 Fig 2-9
bpra_LowerFitting_top = 40.5580 # ML033530020 Fig 2-9
bpra_Active_bot = 40.5580 # ML033530020 Fig 2-9
bpra_Active_top = 401.238 # ML033530020 Fig 2-9
bpra_Plenum_bot = 401.238 # ML033530020 Fig 2-9
bpra_Plenum_top = 421.532 # ML033530020 Fig 2-9
bpra_Rod_top = 431.876 # same as struct_UpperNozzle_top
## <!--- axials copied straight from rod_axials.ods
# Guide Tube
gt_Rod_bot = 35.0000 # same as fuel_Rod_bot
gt_Dashpot_bot = 35.0000 #
gt_Dashpot_top = 39.9580 # same as rcca_Rod_bot for full insertion
gt_Upper_bot = 39.9580 #
gt_Upper_top = 423.049 # same as struct_UpperNozzle_bot
gt_Rod_top = 423.049 #
# Core Structures
struct_LowestExtent = 0.00000 #
struct_SupportPlate_bot = 20.0000 # arbitrary amount of water below core
struct_SupportPlate_top = 25.0000 # guessed
struct_LowerNozzle_bot = 25.0000 # same as struct_SupportPlate_top
struct_LowerNozzle_top = 35.0000 # approx from ** NDR of 4.088in for lower nozzle height
struct_LowestExtent_2d = 220.000 # arbitrary lower slice for 2D problem
struct_HighestExtent_2d = 230.000 # arbitrary upper slice for 2D problem
struct_UpperNozzle_bot = 423.049 # fig 4.2-3 from Watts Bar Unit 2 safety analysis report
struct_UpperNozzle_top = 431.876 # fig 4.2-3 from Watts Bar Unit 2 safety analysis report
struct_HighestExtent = 460.000 # arbitrary amount of water above core
# Intrument Tube
instr_Rod_bot = 35.0000 # same as fuel_Rod_bot
instr_Rod_top = 423.049 # same as struct_UpperNozzle_bot
# Fuel Rod
fuel_Rod_bot = 35.0000 # same as struct_LowerNozzle_top
fuel_LowerFitting_bot = 35.0000 # ML033530020 Fig 2-7
fuel_LowerFitting_top = 36.7480 # ML033530020 Fig 2-7
fuel_ActiveFuel_bot = 36.7480 # ML033530020 Fig 2-7
fuel_ActiveFuel_top = 402.508 # ML033530020 Fig 2-7
fuel_Plenum_bot = 402.508 # ML033530020 Fig 2-7
fuel_Plenum_top = 417.164 # ML033530020 Fig 2-7
fuel_UpperFitting_bot = 417.164 # ML033530020 Fig 2-7
fuel_UpperFitting_top = 419.704 # ML033530020 Fig 2-7
fuel_Rod_top = 419.704 # ML033530020 Fig 2-7
# Grid Spacers (centers provided by utiliy) (heights 1.65 top/bottom, 2.25 intermediate)
grid1_bot = 37.1621 #
grid1_top = 40.5200 #
grid2_bot = 98.0250 #
grid2_top = 103.740 #
grid3_bot = 150.222 #
grid3_top = 155.937 #
grid4_bot = 202.419 #
grid4_top = 208.134 #
grid5_bot = 254.616 #
grid5_top = 260.331 #
grid6_bot = 306.813 #
grid6_top = 312.528 #
grid7_bot = 359.010 #
grid7_top = 364.725 #
grid8_bot = 411.806 #
grid8_top = 415.164 #
# RCCAs (0 steps withdraw, i.e., fully inserted)
rcca_Rod_bot = 39.9580 # ML033530020 Fig 2-8
rcca_LowerFitting_bot = 39.9580 # ML033530020 Fig 2-8
rcca_LowerFitting_top = 41.8280 # ML033530020 Fig 2-8
rcca_AIC_bot = 41.8280 # ML033530020 Fig 2-8
rcca_AIC_top = 143.428 # ML033530020 Fig 2-8
rcca_B4C_bot = 143.428 # ML033530020 Fig 2-8
rcca_B4C_top = 402.508 # ML033530020 Fig 2-8
rcca_Spacer_bot = 402.508 # ML033530020 Fig 2-8
rcca_Spacer_top = 403.778 # ML033530020 Fig 2-8
rcca_Plenum_bot = 403.778 # ML033530020 Fig 2-8
rcca_Plenum_top = 415.558 # ML033530020 Fig 2-8
rcca_Rod_top = 460.000 # same as struct_HighestExtent
rcca_StepWidth = 1.58193 # Active height divided into 228 steps
# data for nozzle and support plate region
n_nozzle_pins = 264 # number of pins
# volume fractions from ML033530020 (table 2-3)
nozzle_water_vol_frac = 0.8280 # water volume fraction
nozzle_ss_vol_frac = 0.1720 # stainless steel volume fraction
# BPRAs
bpra_Rod_bot = 38.6600 # ML033530020 Fig 2-9
bpra_LowerFitting_bot = 38.6600 # ML033530020 Fig 2-9
bpra_LowerFitting_top = 40.5580 # ML033530020 Fig 2-9
bpra_Active_bot = 40.5580 # ML033530020 Fig 2-9
bpra_Active_top = 401.238 # ML033530020 Fig 2-9
bpra_Plenum_bot = 401.238 # ML033530020 Fig 2-9
bpra_Plenum_top = 421.532 # ML033530020 Fig 2-9
bpra_Rod_top = 431.876 # same as struct_UpperNozzle_top
## -- axials copied straight from rod_axials.ods -->
# Guide Tube
gt_Rod_bot = 35.0000 # same as fuel_Rod_bot
gt_Dashpot_bot = 35.0000 #
gt_Dashpot_top = 39.9580 # same as rcca_Rod_bot for full insertion
gt_Upper_bot = 39.9580 #
gt_Upper_top = 423.049 # same as struct_UpperNozzle_bot
gt_Rod_top = 423.049 #
## radial paramters
coreBarrelIR = 187.9600 # Fig 2.1 from NDR 2-8
coreBarrelOR = 193.6750 # Fig 2.1 from NDR 2-8
baffleWidth = 2.2225 # Fig 2.1 from NDR 2-8
baffleWaterGap = 0.1627 # ML033530020
linerIR = 219.150 # ML033530020
rpvIR = 219.710 # ML033530020
rpvOR = 241.300 # ML033530020
# Intrument Tube
instr_Rod_bot = 35.0000 # same as fuel_Rod_bot
instr_Rod_top = 423.049 # same as struct_UpperNozzle_bot
neutronShieldIR = 194.840 # ML033530020
neutronShieldOR = 201.630 # ML033530020
neutronShield_NWbot_SEtop = {'a': 1, 'b': math.tan(math.pi/3 + math.pi/180), 'c': 0, 'd': 0}
neutronShield_NWtop_SEbot = {'a': 1, 'b': math.tan(math.pi/6 - math.pi/180), 'c': 0, 'd': 0}
neutronShield_NEbot_SWtop = {'a': 1, 'b': math.tan(-math.pi/3 - math.pi/180), 'c': 0, 'd': 0}
neutronShield_NEtop_SWbot = {'a': 1, 'b': math.tan(-math.pi/6 + math.pi/180), 'c': 0, 'd': 0}
# Grid Spacers (centers provided by utiliy) (heights 1.65 top/bottom, 2.25 intermediate)
grid1_bot = 37.1621 #
grid1_top = 40.5200 #
grid2_bot = 98.0250 #
grid2_top = 103.740 #
grid3_bot = 150.222 #
grid3_top = 155.937 #
grid4_bot = 202.419 #
grid4_top = 208.134 #
grid5_bot = 254.616 #
grid5_top = 260.331 #
grid6_bot = 306.813 #
grid6_top = 312.528 #
grid7_bot = 359.010 #
grid7_top = 364.725 #
grid8_bot = 411.806 #
grid8_top = 415.164 #
def __init__(self, S:int=None, SS:int=None) -> None:
# data for nozzle and support plate region
n_nozzle_pins = 264 # number of pins
# volume fractions from ML033530020 (table 2-3)
nozzle_water_vol_frac = 0.8280 # water volume fraction
nozzle_ss_vol_frac = 0.1720 # stainless steel volume fraction
############## Geometry paramters ##############
self.first_thru = True
self.rcca_bank_steps_withdrawn = {}
self.S = S
self.SS = SS
## -- axials copied straight from rod_axials.ods -->
@property
def S(self) -> int:
return self._S
## radial paramters
coreBarrelIR = 187.9600 # Fig 2.1 from NDR 2-8
coreBarrelOR = 193.6750 # Fig 2.1 from NDR 2-8
baffleWidth = 2.2225 # Fig 2.1 from NDR 2-8
baffleWaterGap = 0.1627 # ML033530020
linerIR = 219.150 # ML033530020
rpvIR = 219.710 # ML033530020
rpvOR = 241.300 # ML033530020
@S.setter
def S(self,S):
neutronShieldIR = 194.840 # ML033530020
neutronShieldOR = 201.630 # ML033530020
neutronShield_NWbot_SEtop = {'a': 1, 'b': math.tan(math.pi/3 + math.pi/180), 'c': 0, 'd': 0}
neutronShield_NWtop_SEbot = {'a': 1, 'b': math.tan(math.pi/6 - math.pi/180), 'c': 0, 'd': 0}
neutronShield_NEbot_SWtop = {'a': 1, 'b': math.tan(-math.pi/3 - math.pi/180), 'c': 0, 'd': 0}
neutronShield_NEtop_SWbot = {'a': 1, 'b': math.tan(-math.pi/6 + math.pi/180), 'c': 0, 'd': 0}
if isinstance(S,(float,int)):
if S < 0:
print("Cannot have a negative S position. S set to 0")
self._S = 0
elif S > 574:
print("Cannot have a S position greater than 573. S set to 573")
self._S = 573
else:
self._S = S
elif S == None:
self._S = 0
print("Value supplied was 'None'. S Value set to default value")
else:
raise ValueError
self._D = max(0,228-self._S) # bite position is bank D at 213 steps withdrawn
self._C = 228 if self._D > 113 else max(0, 228-self._S+113+2)
self._B = 228 if self._C > 113 else max(0, 228-self._S+113*2+4)
self._A = 228 if self._B > 113 else max(0, 228-self._S+113*3+6)
if not self.first_thru:
self._update_dictionary()
print(" RCCA Positions")
print(f" A: {self._A:3d} B: {self._B:3d} C: {self._C:3d} D: {self._D:3d}")
print(f" SA: {self._SA:3d} SB: {self._SB:3d} SC: {self._SC:3d} SD: {self._SD:3d} SE: {self._SE:3d}")
else:
self.first_thru = False
@property
def A(self) -> int:
return self._A
@property
def B(self) -> int:
return self._B
@property
def C(self) -> int:
return self._C
@property
def D(self) -> int:
return self._D
@property
def SS(self) -> int:
return self._SS
@SS.setter
def SS(self,SS):
if isinstance(SS,(float,int)):
if SS < 0:
print("Cannot have a negative SS position. SS set to 0")
self._SS = 0
elif SS > 228:
print("Cannot have a SS position greater than 228. SS set to 228")
self._SS = 228
else:
self._SS = int(SS)
elif SS == None:
self._SS = 0
print("Value supplied was 'None'. SS Value set to default value")
else:
raise ValueError
self._SA = 228-self._SS
self._SB = 228-self._SS
self._SC = 228-self._SS
self._SD = 228-self._SS
self._SE = 228-self._SS
self._update_dictionary()
print(" RCCA Positions")
print(f" A: {self._A:3d} B: {self._B:3d} C: {self._C:3d} D: {self._D:3d}")
print(f" SA: {self._SA:3d} SB: {self._SB:3d} SC: {self._SC:3d} SD: {self._SD:3d} SE: {self._SE:3d}")
@property
def SA(self) -> int:
return self._SA
@property
def SB(self) -> int:
return self._SB
@property
def SC(self) -> int:
return self._SC
@property
def SD(self) -> int:
return self._SD
@property
def SE(self) -> int:
return self._SE
def _update_dictionary(self):
self.rcca_bank_steps_withdrawn = {
'A': self._A,
'B': self._B,
'C': self._C,
'D': self._D,
'SA': self._SA,
'SB': self._SB,
'SC': self._SC,
'SD': self._SD,
'SE': self._SE,
}
@property
def rcca_banks(self):
self._update_dictionary()
return self.rcca_bank_steps_withdrawn.keys()

View file

@ -4,7 +4,6 @@ Provides a container class for BEAVRS core lattice
"""
import beavrs.constants as c
from beavrs.corebuilder import TemplatedLattice
class Core(object):
@ -57,12 +56,13 @@ class Core(object):
'J___1', 'J___2', 'J___3', 'J___8', 'J___9', 'K__15', 'K__14', 'K__13',
'K__12', 'K__11', 'K__10']
def __init__(self, pincells, assemblies, baffle, is_symmetric=False):
def __init__(self, pincells, assemblies, baffle, C, is_symmetric=False):
""" Creates BEAVRS core lattice universe """
self.pins = pincells
self.assem = assemblies
self.baffle = baffle
self.c = C
self.is_symmetric = is_symmetric
self._set_enrichment_positions()
@ -161,8 +161,8 @@ class Core(object):
lattice = TemplatedLattice(name='Core Lattice')
lattice.setTemplate(self.core_lattice_template)
lattice.pitch = [c.latticePitch, c.latticePitch]
lattice.lower_left = [-19.*c.latticePitch/2., -19.*c.latticePitch/2.]
lattice.pitch = [self.c.latticePitch, self.c.latticePitch]
lattice.lower_left = [-19.*self.c.latticePitch/2., -19.*self.c.latticePitch/2.]
lattice.updatePositions(self.baffle.universes)
lattice.setPosition('dummy', self.pins.u_waterPin)
for pos in self.core_positions:

View file

@ -9,7 +9,6 @@ import numpy as np
import openmc
from openmc.data import atomic_mass, atomic_weight
import beavrs.constants as c
MB10 = atomic_mass('B10')
@ -18,8 +17,7 @@ MU234 = atomic_mass('U234')
MU235 = atomic_mass('U235')
MU238 = atomic_mass('U238')
def openmc_materials(ppm):
def openmc_materials(c,ppm):
# Initialize openmc material dictionary
mats = OrderedDict()

View file

@ -6,17 +6,16 @@ Provides a container class of all BEAVRS pincells
import openmc
import beavrs.constants as c
from beavrs.corebuilder import InfinitePinCell
from beavrs.corebuilder import AxialPinCell
class Pincells(object):
def __init__(self, mats):
def __init__(self, mats, C):
""" Creates BEAVRS pincell universes """
self.mats = mats
self.c = C
self._add_structural_axials()
self._add_dummy_universe()
@ -30,12 +29,12 @@ class Pincells(object):
def _add_structural_axials(self):
""" Adds structure axial surfaces common for most pincells """
self.s_struct_supportPlate_bot = openmc.ZPlane(name='Support plate bottom', z0=c.struct_SupportPlate_bot)
self.s_struct_supportPlate_top = openmc.ZPlane(name='Support plate top', z0=c.struct_SupportPlate_top)
self.s_struct_lowerNozzle_bot = openmc.ZPlane(name='Lower nozzle bottom', z0=c.struct_LowerNozzle_bot)
self.s_struct_lowerNozzle_top = openmc.ZPlane(name='Lower nozzle top', z0=c.struct_LowerNozzle_top)
self.s_struct_upperNozzle_bot = openmc.ZPlane(name='Upper nozzle bottom', z0=c.struct_UpperNozzle_bot)
self.s_struct_upperNozzle_top = openmc.ZPlane(name='Upper nozzle top', z0=c.struct_UpperNozzle_top)
self.s_struct_supportPlate_bot = openmc.ZPlane(name='Support plate bottom', z0=self.c.struct_SupportPlate_bot)
self.s_struct_supportPlate_top = openmc.ZPlane(name='Support plate top', z0=self.c.struct_SupportPlate_top)
self.s_struct_lowerNozzle_bot = openmc.ZPlane(name='Lower nozzle bottom', z0=self.c.struct_LowerNozzle_bot)
self.s_struct_lowerNozzle_top = openmc.ZPlane(name='Lower nozzle top', z0=self.c.struct_LowerNozzle_top)
self.s_struct_upperNozzle_bot = openmc.ZPlane(name='Upper nozzle bottom', z0=self.c.struct_UpperNozzle_bot)
self.s_struct_upperNozzle_top = openmc.ZPlane(name='Upper nozzle top', z0=self.c.struct_UpperNozzle_top)
def _add_dummy_universe(self):
""" Adds all-water universe for empty lattice positions"""
@ -49,32 +48,32 @@ class Pincells(object):
# Rectangular prisms for grid spacers
grid_surfs_tb = \
openmc.rectangular_prism(c.rodGridSide_tb, c.rodGridSide_tb)
openmc.rectangular_prism(self.c.rodGridSide_tb, self.c.rodGridSide_tb)
grid_surfs_i = \
openmc.rectangular_prism(c.rodGridSide_i, c.rodGridSide_i)
openmc.rectangular_prism(self.c.rodGridSide_i, self.c.rodGridSide_i)
# Rectangular prisms for lattice grid sleeves
grid_surfs_ass = \
openmc.rectangular_prism(c.gridstrapSide, c.gridstrapSide)
openmc.rectangular_prism(self.c.gridstrapSide, self.c.gridstrapSide)
# Grids axial surfaces
self.s_grid1_bot = openmc.ZPlane(name='Bottom of grid 1', z0=c.grid1_bot)
self.s_grid1_top = openmc.ZPlane(name='Top of grid 1', z0=c.grid1_top)
self.s_grid2_bot = openmc.ZPlane(name='Bottom of grid 2', z0=c.grid2_bot)
self.s_grid2_top = openmc.ZPlane(name='Top of grid 2', z0=c.grid2_top)
self.s_grid3_bot = openmc.ZPlane(name='Bottom of grid 3', z0=c.grid3_bot)
self.s_grid3_top = openmc.ZPlane(name='Top of grid 3', z0=c.grid3_top)
self.s_grid4_bot = openmc.ZPlane(name='Bottom of grid 4', z0=c.grid4_bot)
self.s_grid4_top = openmc.ZPlane(name='Top of grid 4', z0=c.grid4_top)
self.s_grid5_bot = openmc.ZPlane(name='Bottom of grid 5', z0=c.grid5_bot)
self.s_grid5_top = openmc.ZPlane(name='Top of grid 5', z0=c.grid5_top)
self.s_grid6_bot = openmc.ZPlane(name='Bottom of grid 6', z0=c.grid6_bot)
self.s_grid6_top = openmc.ZPlane(name='Top of grid 6', z0=c.grid6_top)
self.s_grid7_bot = openmc.ZPlane(name='Bottom of grid 7', z0=c.grid7_bot)
self.s_grid7_top = openmc.ZPlane(name='Top of grid 7', z0=c.grid7_top)
self.s_grid8_bot = openmc.ZPlane(name='Bottom of grid 8', z0=c.grid8_bot)
self.s_grid8_top = openmc.ZPlane(name='Top of grid 8', z0=c.grid8_top)
self.s_grid1_bot = openmc.ZPlane(name='Bottom of grid 1', z0=self.c.grid1_bot)
self.s_grid1_top = openmc.ZPlane(name='Top of grid 1', z0=self.c.grid1_top)
self.s_grid2_bot = openmc.ZPlane(name='Bottom of grid 2', z0=self.c.grid2_bot)
self.s_grid2_top = openmc.ZPlane(name='Top of grid 2', z0=self.c.grid2_top)
self.s_grid3_bot = openmc.ZPlane(name='Bottom of grid 3', z0=self.c.grid3_bot)
self.s_grid3_top = openmc.ZPlane(name='Top of grid 3', z0=self.c.grid3_top)
self.s_grid4_bot = openmc.ZPlane(name='Bottom of grid 4', z0=self.c.grid4_bot)
self.s_grid4_top = openmc.ZPlane(name='Top of grid 4', z0=self.c.grid4_top)
self.s_grid5_bot = openmc.ZPlane(name='Bottom of grid 5', z0=self.c.grid5_bot)
self.s_grid5_top = openmc.ZPlane(name='Top of grid 5', z0=self.c.grid5_top)
self.s_grid6_bot = openmc.ZPlane(name='Bottom of grid 6', z0=self.c.grid6_bot)
self.s_grid6_top = openmc.ZPlane(name='Top of grid 6', z0=self.c.grid6_top)
self.s_grid7_bot = openmc.ZPlane(name='Bottom of grid 7', z0=self.c.grid7_bot)
self.s_grid7_top = openmc.ZPlane(name='Top of grid 7', z0=self.c.grid7_top)
self.s_grid8_bot = openmc.ZPlane(name='Bottom of grid 8', z0=self.c.grid8_bot)
self.s_grid8_top = openmc.ZPlane(name='Top of grid 8', z0=self.c.grid8_top)
# Grids pincell universes
@ -155,22 +154,22 @@ class Pincells(object):
# Fuel radial surfaces
self.s_fuel_pellet_OR = openmc.ZCylinder(name='Fuel pellet OR', r=c.pelletOR)
self.s_fuel_clad_IR = openmc.ZCylinder(name='Fuel clad IR', r=c.cladIR)
self.s_fuel_clad_OR = openmc.ZCylinder(name='Fuel clad OR', r=c.cladOR)
self.s_fuel_plenumSpring_OR = openmc.ZCylinder(name='Fuel rod plenum spring OR', r=c.plenumSpringOR)
self.s_fuel_pellet_OR = openmc.ZCylinder(name='Fuel pellet OR', r=self.c.pelletOR)
self.s_fuel_clad_IR = openmc.ZCylinder(name='Fuel clad IR', r=self.c.cladIR)
self.s_fuel_clad_OR = openmc.ZCylinder(name='Fuel clad OR', r=self.c.cladOR)
self.s_fuel_plenumSpring_OR = openmc.ZCylinder(name='Fuel rod plenum spring OR', r=self.c.plenumSpringOR)
# Fuel axial surfaces
self.s_fuel_rod_bot = openmc.ZPlane(name='Fuel rod bottom', z0=c.fuel_Rod_bot)
self.s_fuel_rod_bot = openmc.ZPlane(name='Fuel rod bottom', z0=self.c.fuel_Rod_bot)
self.s_fuel_lowerFitting_bot = self.s_fuel_rod_bot
self.s_fuel_lowerFitting_top = openmc.ZPlane(name='Fuel lower fitting top', z0=c.fuel_LowerFitting_top)
self.s_fuel_lowerFitting_top = openmc.ZPlane(name='Fuel lower fitting top', z0=self.c.fuel_LowerFitting_top)
self.s_fuel_activeFuel_bot = self.s_fuel_lowerFitting_top
self.s_fuel_activeFuel_top = openmc.ZPlane(name='Fuel active region top', z0=c.fuel_ActiveFuel_top)
self.s_fuel_activeFuel_top = openmc.ZPlane(name='Fuel active region top', z0=self.c.fuel_ActiveFuel_top)
self.s_fuel_plenum_bot = self.s_fuel_activeFuel_top
self.s_fuel_plenum_top = openmc.ZPlane(name='Fuel plenum top', z0=c.fuel_Plenum_top)
self.s_fuel_plenum_top = openmc.ZPlane(name='Fuel plenum top', z0=self.c.fuel_Plenum_top)
self.s_fuel_upperFitting_bot = self.s_fuel_plenum_top
self.s_fuel_upperFitting_top = openmc.ZPlane(name='Fuel upper fitting top', z0=c.fuel_UpperFitting_top)
self.s_fuel_upperFitting_top = openmc.ZPlane(name='Fuel upper fitting top', z0=self.c.fuel_UpperFitting_top)
# Fuel pincell universes
@ -210,17 +209,17 @@ class Pincells(object):
# GT radial surfaces
self.s_gt_IR = openmc.ZCylinder(name='Guide tube IR', r=c.guideTubeIR)
self.s_gt_OR = openmc.ZCylinder(name='Guide tube OR', r=c.guideTubeOR)
self.s_gt_dashpot_IR = openmc.ZCylinder(name='Guide tube IR below dashpot', r=c.guideTubeDashIR)
self.s_gt_dashpot_OR = openmc.ZCylinder(name='Guide tube OR below dashpot', r=c.guideTubeDashOR)
self.s_gt_IR = openmc.ZCylinder(name='Guide tube IR', r=self.c.guideTubeIR)
self.s_gt_OR = openmc.ZCylinder(name='Guide tube OR', r=self.c.guideTubeOR)
self.s_gt_dashpot_IR = openmc.ZCylinder(name='Guide tube IR below dashpot', r=self.c.guideTubeDashIR)
self.s_gt_dashpot_OR = openmc.ZCylinder(name='Guide tube OR below dashpot', r=self.c.guideTubeDashOR)
# GT axial surfaces
self.s_gt_rod_bot = openmc.ZPlane(name='Bottom of GT rod', z0=c.gt_Rod_bot)
self.s_gt_rod_bot = openmc.ZPlane(name='Bottom of GT rod', z0=self.c.gt_Rod_bot)
self.s_gt_dashpot_bot = self.s_gt_rod_bot
self.s_gt_dashpot_top = openmc.ZPlane(name='GT Dashpot plane', z0=c.gt_Dashpot_top)
self.s_gt_rod_top = openmc.ZPlane(name='Top of GT rod', z0=c.gt_Rod_top)
self.s_gt_dashpot_top = openmc.ZPlane(name='GT Dashpot plane', z0=self.c.gt_Dashpot_top)
self.s_gt_rod_top = openmc.ZPlane(name='Top of GT rod', z0=self.c.gt_Rod_top)
# GT pincell universes
@ -261,8 +260,8 @@ class Pincells(object):
# IT radial surfaces
self.s_it_IR = openmc.ZCylinder(name='Instrument tube thimble IR', r=c.instrTubeIR)
self.s_it_OR = openmc.ZCylinder(name='Instrument tube thimble OR', r=c.instrTubeOR)
self.s_it_IR = openmc.ZCylinder(name='Instrument tube thimble IR', r=self.c.instrTubeIR)
self.s_it_OR = openmc.ZCylinder(name='Instrument tube thimble OR', r=self.c.instrTubeOR)
# IT pincell universe
self.u_it_p = InfinitePinCell(name='Instrument tube thimble')
@ -294,23 +293,23 @@ class Pincells(object):
# BP radial surfaces
self.s_bp_innerclad_IR = openmc.ZCylinder(name='BPRA rod radius 1', r=c.burnabs1)
self.s_bp_innerclad_OR = openmc.ZCylinder(name='BPRA rod radius 2', r=c.burnabs2)
self.s_bp_poison_IR = openmc.ZCylinder(name='BPRA rod radius 3', r=c.burnabs3)
self.s_bp_poison_OR = openmc.ZCylinder(name='BPRA rod radius 4', r=c.burnabs4)
self.s_bp_outerclad_IR = openmc.ZCylinder(name='BPRA rod radius 5', r=c.burnabs5)
self.s_bp_outerclad_OR = openmc.ZCylinder(name='BPRA rod radius 6', r=c.burnabs6)
self.s_bp_innerclad_IR = openmc.ZCylinder(name='BPRA rod radius 1', r=self.c.burnabs1)
self.s_bp_innerclad_OR = openmc.ZCylinder(name='BPRA rod radius 2', r=self.c.burnabs2)
self.s_bp_poison_IR = openmc.ZCylinder(name='BPRA rod radius 3', r=self.c.burnabs3)
self.s_bp_poison_OR = openmc.ZCylinder(name='BPRA rod radius 4', r=self.c.burnabs4)
self.s_bp_outerclad_IR = openmc.ZCylinder(name='BPRA rod radius 5', r=self.c.burnabs5)
self.s_bp_outerclad_OR = openmc.ZCylinder(name='BPRA rod radius 6', r=self.c.burnabs6)
# BP axial surfaces
self.s_bp_rod_bot = openmc.ZPlane(name='Bottom of BPRA rod', z0=c.bpra_Rod_bot)
self.s_bp_rod_bot = openmc.ZPlane(name='Bottom of BPRA rod', z0=self.c.bpra_Rod_bot)
self.s_bp_lowerFitting_bot = self.s_bp_rod_bot
self.s_bp_lowerFitting_top = openmc.ZPlane(name='Top of lower fitting in BPRA rod', z0=c.bpra_LowerFitting_top)
self.s_bp_lowerFitting_top = openmc.ZPlane(name='Top of lower fitting in BPRA rod', z0=self.c.bpra_LowerFitting_top)
self.s_bp_active_bot = self.s_bp_lowerFitting_top
self.s_bp_active_top = openmc.ZPlane(name='Top of active poison in BPRA rod', z0=c.bpra_Active_top)
self.s_bp_active_top = openmc.ZPlane(name='Top of active poison in BPRA rod', z0=self.c.bpra_Active_top)
self.s_bp_plenum_bot = self.s_bp_active_top
self.s_bp_plenum_top = openmc.ZPlane(name='Top of plenum in BPRA rod', z0=c.bpra_Plenum_top)
self.s_bp_rod_top = openmc.ZPlane(name='Top of BPRA rod', z0=c.bpra_Rod_top)
self.s_bp_plenum_top = openmc.ZPlane(name='Top of plenum in BPRA rod', z0=self.c.bpra_Plenum_top)
self.s_bp_rod_top = openmc.ZPlane(name='Top of BPRA rod', z0=self.c.bpra_Rod_top)
# BP pincell universes
@ -349,12 +348,12 @@ class Pincells(object):
# RCCA rod radial surfaces
self.s_rcca_clad_IR = openmc.ZCylinder(name='RCCA rod clad IR', r=c.rcca_clad_IR)
self.s_rcca_clad_OR = openmc.ZCylinder(name='RCCA rod clad OR', r=c.rcca_clad_OR)
self.s_rcca_b4c_OR = openmc.ZCylinder(name='RCCA rod B4C OR', r=c.rcca_b4c_OR)
self.s_rcca_aic_OR = openmc.ZCylinder(name='RCCA rod AIC OR', r=c.rcca_aic_OR)
self.s_rcca_spacer_OR = openmc.ZCylinder(name='RCCA rod spacer OR', r=c.rcca_spacer_OR)
self.s_rcca_spring_OR = openmc.ZCylinder(name='RCCA rod plenum spring OR', r=c.rcca_spring_OR)
self.s_rcca_clad_IR = openmc.ZCylinder(name='RCCA rod clad IR', r=self.c.rcca_clad_IR)
self.s_rcca_clad_OR = openmc.ZCylinder(name='RCCA rod clad OR', r=self.c.rcca_clad_OR)
self.s_rcca_b4c_OR = openmc.ZCylinder(name='RCCA rod B4C OR', r=self.c.rcca_b4c_OR)
self.s_rcca_aic_OR = openmc.ZCylinder(name='RCCA rod AIC OR', r=self.c.rcca_aic_OR)
self.s_rcca_spacer_OR = openmc.ZCylinder(name='RCCA rod spacer OR', r=self.c.rcca_spacer_OR)
self.s_rcca_spring_OR = openmc.ZCylinder(name='RCCA rod plenum spring OR', r=self.c.rcca_spring_OR)
# RCCA rod axial surfaces
@ -364,14 +363,14 @@ class Pincells(object):
self.s_rcca_b4c_top = {}
self.s_rcca_spacer_top = {}
self.s_rcca_plenum_top = {}
for b in sorted(c.rcca_banks):
d = c.rcca_bank_steps_withdrawn[b]*c.rcca_StepWidth
self.s_rcca_rod_bot[b] = openmc.ZPlane(name='Bottom of RCCA rod bank {0}'.format(b), z0=c.rcca_Rod_bot + d)
self.s_rcca_lowerFitting_top[b] = openmc.ZPlane(name='Top of RCCA rod lower fitting bank {0}'.format(b), z0=c.rcca_LowerFitting_top + d)
self.s_rcca_aic_top[b] = openmc.ZPlane(name='Top of RCCA rod AIC bank {0}'.format(b), z0=c.rcca_AIC_top + d)
self.s_rcca_b4c_top[b] = openmc.ZPlane(name='Top of RCCA rod B4C bank {0}'.format(b), z0=c.rcca_B4C_top + d)
self.s_rcca_spacer_top[b] = openmc.ZPlane(name='Top of RCCA rod spacer bank {0}'.format(b), z0=c.rcca_Spacer_top + d)
self.s_rcca_plenum_top[b] = openmc.ZPlane(name='Top of RCCA rod plenum bank {0}'.format(b), z0=c.rcca_Plenum_top + d)
for b in sorted(self.c.rcca_banks):
d = self.c.rcca_bank_steps_withdrawn[b]*self.c.rcca_StepWidth
self.s_rcca_rod_bot[b] = openmc.ZPlane(name='Bottom of RCCA rod bank {0}'.format(b), z0=self.c.rcca_Rod_bot + d)
self.s_rcca_lowerFitting_top[b] = openmc.ZPlane(name='Top of RCCA rod lower fitting bank {0}'.format(b), z0=self.c.rcca_LowerFitting_top + d)
self.s_rcca_aic_top[b] = openmc.ZPlane(name='Top of RCCA rod AIC bank {0}'.format(b), z0=self.c.rcca_AIC_top + d)
self.s_rcca_b4c_top[b] = openmc.ZPlane(name='Top of RCCA rod B4C bank {0}'.format(b), z0=self.c.rcca_B4C_top + d)
self.s_rcca_spacer_top[b] = openmc.ZPlane(name='Top of RCCA rod spacer bank {0}'.format(b), z0=self.c.rcca_Spacer_top + d)
self.s_rcca_plenum_top[b] = openmc.ZPlane(name='Top of RCCA rod plenum bank {0}'.format(b), z0=self.c.rcca_Plenum_top + d)
# RCCA pincell universes
@ -402,7 +401,7 @@ class Pincells(object):
# RCCA rod axial stack
self.u_rcca = {}
for b in sorted(c.rcca_banks):
for b in sorted(self.c.rcca_banks):
self.u_rcca[b] = AxialPinCell(name='RCCA bank {0}'.format(b))
self.u_rcca[b].add_axial_section(self.s_struct_supportPlate_bot, self.mats['Borated Water'])
self.u_rcca[b].add_axial_section(self.s_struct_lowerNozzle_top, self.mats['Water SPN'])

View file

@ -4,15 +4,13 @@
import openmc
import beavrs.constants as c
class Plots(object):
def __init__(self, mats):
def __init__(self, mats, c):
""" Creates BEAVRS plots"""
self.mats = mats
self.c = c
self.plots = []
@ -41,7 +39,7 @@ class Plots(object):
def _add_plots(self):
H = c.struct_HighestExtent-c.struct_LowestExtent
H = self.c.struct_HighestExtent-self.c.struct_LowestExtent
res = 1000
# BPRA positions
@ -50,7 +48,7 @@ class Plots(object):
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, 0, H/2]
plot.width = [c.rpvOR*2, c.rpvOR*2]
plot.width = [self.c.rpvOR*2, self.c.rpvOR*2]
plot.pixels = [res, res]
plot.mask_components = [self.mats['Borosilicate Glass']]
self.plots.append(plot)
@ -60,7 +58,7 @@ class Plots(object):
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, 0, H/2]
plot.width = [c.rpvOR*2, c.rpvOR*2]
plot.width = [self.c.rpvOR*2, self.c.rpvOR*2]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -70,7 +68,7 @@ class Plots(object):
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, 0, H/2]
plot.width = [c.rpvOR*2, c.rpvOR*2]
plot.width = [self.c.rpvOR*2, self.c.rpvOR*2]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -79,8 +77,8 @@ class Plots(object):
plot.filename = 'radial_mats_grid1_center'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, 0, c.grid1_bot+(c.grid1_top - c.grid1_bot)/2]
plot.width = [c.rpvOR*2, c.rpvOR*2]
plot.origin = [0, 0, self.c.grid1_bot+(self.c.grid1_top - self.c.grid1_bot)/2]
plot.width = [self.c.rpvOR*2, self.c.rpvOR*2]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -89,8 +87,8 @@ class Plots(object):
plot.filename = 'radial_mats_grid4_center'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, 0, c.grid4_bot+(c.grid4_top - c.grid4_bot)/2]
plot.width = [c.rpvOR*2, c.rpvOR*2]
plot.origin = [0, 0, self.c.grid4_bot+(self.c.grid4_top - self.c.grid4_bot)/2]
plot.width = [self.c.rpvOR*2, self.c.rpvOR*2]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -129,7 +127,7 @@ class Plots(object):
plot.filename = 'axial_mats_row_8_topzoom3'
plot.color_by = 'material'
plot.basis = 'xz'
plot.origin = [0, 0, c.fuel_Rod_top]
plot.origin = [0, 0, self.c.fuel_Rod_top]
plot.width = [H/8, H/8]
plot.pixels = [res, res]
plot.colors = self.colors_mat
@ -159,7 +157,7 @@ class Plots(object):
plot.filename = 'axial_mats_row_8_botzoom3'
plot.color_by = 'material'
plot.basis = 'xz'
plot.origin = [0, 0, c.fuel_Rod_bot]
plot.origin = [0, 0, self.c.fuel_Rod_bot]
plot.width = [H/8, H/8]
plot.pixels = [res, res]
plot.colors = self.colors_mat
@ -169,8 +167,8 @@ class Plots(object):
plot.filename = 'grid5_mats_H7'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, c.latticePitch, c.grid5_bot+(c.grid5_top-c.grid5_bot)/2]
plot.width = [c.latticePitch, c.latticePitch]
plot.origin = [0, self.c.latticePitch, self.c.grid5_bot+(self.c.grid5_top-self.c.grid5_bot)/2]
plot.width = [self.c.latticePitch, self.c.latticePitch]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -179,10 +177,10 @@ class Plots(object):
plot.filename = 'grid8_mats_J14'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [-c.latticePitch+c.latticePitch/3, \
-6*c.latticePitch+c.latticePitch/3, \
c.grid8_bot+(c.grid8_top-c.grid8_bot)/2]
plot.width = [c.latticePitch, c.latticePitch]
plot.origin = [-self.c.latticePitch+self.c.latticePitch/3, \
-6*self.c.latticePitch+self.c.latticePitch/3, \
self.c.grid8_bot+(self.c.grid8_top-self.c.grid8_bot)/2]
plot.width = [self.c.latticePitch, self.c.latticePitch]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -191,10 +189,10 @@ class Plots(object):
plot.filename = 'grid5_mats_J14'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [-c.latticePitch+c.latticePitch/3, \
-6*c.latticePitch+c.latticePitch/3, \
c.grid5_bot+(c.grid5_top-c.grid5_bot)/2]
plot.width = [c.latticePitch, c.latticePitch]
plot.origin = [-self.c.latticePitch+self.c.latticePitch/3, \
-6*self.c.latticePitch+self.c.latticePitch/3, \
self.c.grid5_bot+(self.c.grid5_top-self.c.grid5_bot)/2]
plot.width = [self.c.latticePitch, self.c.latticePitch]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -203,31 +201,31 @@ class Plots(object):
plot.filename = 'midplane_mats_J14'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [-c.latticePitch+c.latticePitch/3, \
-6*c.latticePitch+c.latticePitch/3, H/2]
plot.width = [c.latticePitch, c.latticePitch]
plot.origin = [-self.c.latticePitch+self.c.latticePitch/3, \
-6*self.c.latticePitch+self.c.latticePitch/3, H/2]
plot.width = [self.c.latticePitch, self.c.latticePitch]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
h = 4*(c.struct_LowerNozzle_top - c.struct_SupportPlate_bot)/c.latticePitch
h = 4*(self.c.struct_LowerNozzle_top - self.c.struct_SupportPlate_bot)/self.c.latticePitch
plot = openmc.Plot()
plot.filename = 'J8_axial_bot'
plot.color_by = 'material'
plot.basis = 'xz'
plot.origin = [0, c.latticePitch, c.struct_LowerNozzle_top]
plot.width = [c.latticePitch, h]
plot.origin = [0, self.c.latticePitch, self.c.struct_LowerNozzle_top]
plot.width = [self.c.latticePitch, h]
plot.pixels = [res, int(res*h)]
plot.colors = self.colors_mat
self.plots.append(plot)
h = 4*(c.struct_UpperNozzle_top - c.fuel_Rod_top)/c.latticePitch
h = 4*(self.c.struct_UpperNozzle_top - self.c.fuel_Rod_top)/self.c.latticePitch
plot = openmc.Plot()
plot.filename = 'J8_axial_top'
plot.color_by = 'material'
plot.basis = 'xz'
plot.origin = [0, c.latticePitch, c.fuel_Rod_top]
plot.width = [c.latticePitch, h]
plot.origin = [0, self.c.latticePitch, self.c.fuel_Rod_top]
plot.width = [self.c.latticePitch, h]
plot.pixels = [res, int(res*h)]
plot.colors = self.colors_mat
self.plots.append(plot)
@ -236,18 +234,18 @@ class Plots(object):
plot.filename = 'J8_nozzle'
plot.color_by = 'material'
plot.basis = 'xy'
plot.origin = [0, c.latticePitch, c.struct_SupportPlate_bot + 2.0]
plot.width = [c.latticePitch, c.latticePitch]
plot.origin = [0, self.c.latticePitch, self.c.struct_SupportPlate_bot + 2.0]
plot.width = [self.c.latticePitch, self.c.latticePitch]
plot.pixels = [res, res]
plot.colors = self.colors_mat
self.plots.append(plot)
h = 2*(c.struct_UpperNozzle_top - c.fuel_Rod_top)
h = 2*(self.c.struct_UpperNozzle_top - self.c.fuel_Rod_top)
plot = openmc.Plot()
plot.filename = 'H8_axial_top'
plot.color_by = 'material'
plot.basis = 'xz'
plot.origin = [0, c.latticePitch, c.fuel_Rod_top]
plot.origin = [0, self.c.latticePitch, self.c.fuel_Rod_top]
plot.width = [h, h]
plot.pixels = [res, res]
plot.colors = self.colors_mat

View file

@ -4,18 +4,17 @@ Provides a container class for the BEAVRS main universe cells
"""
import beavrs.constants as c
import openmc
class UniverseZero(openmc.Universe):
def __init__(self, core, mats, is_2d=False):
def __init__(self, core, mats, C, is_2d=False):
""" Creates BEAVRS main universe """
super(UniverseZero, self).__init__(name='Main BEAVRS universe', universe_id=0)
self.core = core
self.mats = mats
self.c = C
self.is_2d = is_2d
self._add_outer_rings()
@ -29,30 +28,30 @@ class UniverseZero(openmc.Universe):
# Change z-dimension based on whether 2D or 3D problem
if self.is_2d:
self.s_upperBound = openmc.ZPlane(name='Highest Extent', z0=c.struct_HighestExtent_2d, boundary_type='reflective')
self.s_lowerBound = openmc.ZPlane(name='Lowest Extent', z0=c.struct_LowestExtent_2d, boundary_type='reflective')
self.s_upperBound = openmc.ZPlane(name='Highest Extent', z0=self.c.struct_HighestExtent_2d, boundary_type='reflective')
self.s_lowerBound = openmc.ZPlane(name='Lowest Extent', z0=self.c.struct_LowestExtent_2d, boundary_type='reflective')
else:
self.s_upperBound = openmc.ZPlane(name='Highest Extent', z0=c.struct_HighestExtent, boundary_type='vacuum')
self.s_lowerBound = openmc.ZPlane(name='Lowest Extent', z0=c.struct_LowestExtent, boundary_type='vacuum')
self.s_upperBound = openmc.ZPlane(name='Highest Extent', z0=self.c.struct_HighestExtent, boundary_type='vacuum')
self.s_lowerBound = openmc.ZPlane(name='Lowest Extent', z0=self.c.struct_LowestExtent, boundary_type='vacuum')
# RPV
self.s_RPVOR = openmc.ZCylinder(name='RPV OR', r=c.rpvOR, boundary_type='vacuum')
self.s_RPVIR = openmc.ZCylinder(name='RPV IR', r=c.rpvIR)
self.s_RPVOR = openmc.ZCylinder(name='RPV OR', r=self.c.rpvOR, boundary_type='vacuum')
self.s_RPVIR = openmc.ZCylinder(name='RPV IR', r=self.c.rpvIR)
self.c_RPV = openmc.Cell(name="RPV", fill=self.mats['Carbon Steel'])
self.c_RPV.region = (-self.s_RPVOR & +self.s_RPVIR &
-self.s_upperBound & +self.s_lowerBound)
# RPV liner
self.s_linerIR = openmc.ZCylinder(name='RPV Liner IR', r=c.linerIR)
self.s_linerIR = openmc.ZCylinder(name='RPV Liner IR', r=self.c.linerIR)
self.c_liner = openmc.Cell(name="RPV Liner", fill=self.mats['SS304'])
self.c_liner.region = (-self.s_RPVIR & +self.s_linerIR &
-self.s_upperBound & +self.s_lowerBound)
# Downcomer
self.s_neutronShieldOR = openmc.ZCylinder(name='Shield Panel OR', r=c.neutronShieldOR)
self.s_neutronShieldOR = openmc.ZCylinder(name='Shield Panel OR', r=self.c.neutronShieldOR)
self.c_downcomer = openmc.Cell(name="Downcomer", fill=self.mats['Borated Water'])
self.c_downcomer.region = (-self.s_linerIR & +self.s_neutronShieldOR &
-self.s_upperBound & +self.s_lowerBound)
@ -62,11 +61,11 @@ class UniverseZero(openmc.Universe):
""" Adds BEAVRS shield panels """
# Shield panels
self.s_neutronShieldIR = openmc.ZCylinder(name='Shield Panel IR', r=c.neutronShieldIR)
self.s_ns_NWbot_SEtop = openmc.Plane(name='Shield Panel NWbot/SEtop', **c.neutronShield_NWbot_SEtop)
self.s_ns_NWtop_SEbot = openmc.Plane(name='Shield Panel NWtop/SEbot', **c.neutronShield_NWtop_SEbot)
self.s_ns_NEbot_SWtop = openmc.Plane(name='Shield Panel NEbot/SWtop', **c.neutronShield_NEbot_SWtop)
self.s_ns_NEtop_SWbot = openmc.Plane(name='Shield Panel NEtop/SWbot', **c.neutronShield_NEtop_SWbot)
self.s_neutronShieldIR = openmc.ZCylinder(name='Shield Panel IR', r=self.c.neutronShieldIR)
self.s_ns_NWbot_SEtop = openmc.Plane(name='Shield Panel NWbot/SEtop', **self.c.neutronShield_NWbot_SEtop)
self.s_ns_NWtop_SEbot = openmc.Plane(name='Shield Panel NWtop/SEbot', **self.c.neutronShield_NWtop_SEbot)
self.s_ns_NEbot_SWtop = openmc.Plane(name='Shield Panel NEbot/SWtop', **self.c.neutronShield_NEbot_SWtop)
self.s_ns_NEtop_SWbot = openmc.Plane(name='Shield Panel NEtop/SWbot', **self.c.neutronShield_NEtop_SWbot)
self.c_shieldPanels = []
@ -118,7 +117,7 @@ class UniverseZero(openmc.Universe):
-self.s_upperBound & +self.s_lowerBound)
self.c_shieldPanels.append(self.c_sp_W)
self.s_coreBarrelOR = openmc.ZCylinder(name='Core Barrel OR', r=c.coreBarrelOR)
self.s_coreBarrelOR = openmc.ZCylinder(name='Core Barrel OR', r=self.c.coreBarrelOR)
self.c_sp_inner = openmc.Cell(name='Water between barrel and shield', fill=self.mats['Borated Water'])
self.c_sp_inner.region = (+self.s_coreBarrelOR & -self.s_neutronShieldIR &
-self.s_upperBound & +self.s_lowerBound)
@ -130,7 +129,7 @@ class UniverseZero(openmc.Universe):
# Core barrel
self.s_coreBarrelIR = openmc.ZCylinder(name='Core Barrel IR', r=c.coreBarrelIR)
self.s_coreBarrelIR = openmc.ZCylinder(name='Core Barrel IR', r=self.c.coreBarrelIR)
self.c_coreBarrel = openmc.Cell(name="Core Barrel", fill=self.mats['SS304'])
self.c_coreBarrel.region = (-self.s_coreBarrelOR & +self.s_coreBarrelIR &
-self.s_upperBound & +self.s_lowerBound)
@ -166,7 +165,7 @@ class UniverseZero(openmc.Universe):
self.core_univ.add_cell(self.c_core)
# Define boundaries of bounding box
outer_bound = 8.5*c.latticePitch
outer_bound = 8.5*self.c.latticePitch
self.s_leftBound = openmc.XPlane(name='Left Box', x0=-outer_bound, boundary_type='vacuum')
self.s_rightBound = openmc.XPlane(name='Right Box', x0=outer_bound, boundary_type='vacuum')
self.s_backBound = openmc.YPlane(name='Back Box', y0=-outer_bound, boundary_type='vacuum')

File diff suppressed because one or more lines are too long

View file

@ -26,8 +26,10 @@
"source": [
"import openmc\n",
"import beavrs.builder\n",
"import beavrs.constants as c\n",
"from IPython.display import Image"
"from beavrs.constants import Constants\n",
"from IPython.display import Image\n",
"\n",
"c = Constants(150,0)"
]
},
{
@ -379,7 +381,7 @@
"outputs": [
{
"data": {
"image/png": "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\n",
"image/png": "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",
"text/plain": [
"<IPython.core.display.Image object>"
]

View file

@ -44,19 +44,15 @@ p.add_option('-i', '--insert', action='store', type='int', dest='S', default=200
help='Set where the control rods should be. Acceptable values are 15-574')
p.add_option('-o', '--optimal', action='store_true', default=False,
help='Find the best combination of particles, inactive and active batches to run')
p.add_option('-r', '--run', action='store_true', default=False,
help='Run the model once after building it')
(options, args) = p.parse_args()
if not len(args) == 0:
p.print_help()
b = BEAVRS(is_symmetric=options.is_symmetric, is_2d=options.is_2d)
model = openmc.Model(geometry=b.openmc_geometry, materials=b.materials,
settings=b.settings, tallies=b.common_tallies, plots=b.plots)
model.materials.cross_sections = "/opt/xdata/endfb-vii.1-hdf5/cross_sections.xml"
model.geometry.merge_surfaces = True
model.settings.confidence_intervals = False
b = BEAVRS(is_symmetric=options.is_symmetric, is_2d=options.is_2d, S=15)
# b.export_xml()
# openmc.calculate_volumes()
# openmc.plot_geometry()
@ -71,10 +67,8 @@ if options.optimal:
for i in inactive:
for a in active:
print(f"Particles: {p} Inactive Cycles: {i} Active Cycles: {a}\n\n")
model.settings.batches = i+a
model.settings.inactive = i
model.settings.particles = p
model.export_to_xml()
b.set_params(batches=i+a,inactive=i,particles=p)
b.export_xml()
openmc.run()
print("\n\n\n")
sys.stdout.flush()
@ -83,12 +77,8 @@ if options.optimal:
# Depletion Settings
###############################################################################
if options.run_deplete:
model.settings.batches = 350
model.settings.inactive = 50
model.settings.particles = 20000
model.settings.seed = np.random.randint(1e14, dtype=np.uint64)
model.export_to_xml()
elif options.run_deplete:
b.set_params(batches=350,inactive=50,particles=20000)
# Get fission Q values from JSON file generated by get_fission_qvals.py
with open('../beavrs/serpent_fissq.json', 'r') as f:
@ -111,20 +101,41 @@ if options.run_deplete:
## Power in Watts
full_power = 3411
full_power = 3411e6
powers = [full_power if x > 1 else full_power*x for x in time_steps_cum]
print(time_steps)
time_step = 10
power = int(3.411e9)
## setting the transport operator
model = b.export_model()
operator = openmc.deplete.CoupledOperator(model, chain_file,
#diff_burnable_mats=False, normalization_mode='fission-q',
fission_q=serpent_fission_q,
fission_yield_mode="average")
## depleting using a first-order predictor algorithm
integrator = openmc.deplete.PredictorIntegrator(operator, [time_step], [power], timestep_units='d')
integrator.integrate()
openmc.deplete.Results('depletion_results.h5').export_to_materials(len(time_steps))
"""
i = 0
for power, time_step in zip(powers, time_steps):
print(f'Current loop info: {power} {time_step}')
## setting the transport operator
model = openmc.Model(geometry=b.openmc_geometry, materials=b.materials,
settings=b.settings, tallies=b.common_tallies, plots=b.plots)
model.geometry.merge_surfaces = True
model = b.export_model()
operator = openmc.deplete.CoupledOperator(model, chain_file,
#diff_burnable_mats=False, normalization_mode='fission-q',
fission_q=serpent_fission_q,
fission_yield_mode="average")
fission_q=serpent_fission_q, fission_yield_mode="average")
## depleting using a first-order predictor algorithm
integrator = openmc.deplete.PredictorIntegrator(operator, [time_step], [power], timestep_units='d')
@ -147,6 +158,21 @@ if options.run_deplete:
# Get materials at the end of the last simulation
model.materials = results.export_to_materials(len(time_steps))
"""
elif options.run:
b.set_params(batches=350,inactive=50,particles=20000)
# b.set_S(20)
"""openmc.search_for_keff(b.set_S,initial_guess=15,target=1.0,bracket=[15,574],tol=6e-4,
bracketed_method='ridder',print_iterations=True,model_args={'particles': 20000,
'inactive': 50,'batches': 350})"""
b.export_xml(as_model=True)
openmc.run()