-
Notifications
You must be signed in to change notification settings - Fork 90
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
Modeling ex-core structures: RPV, shielding, etc. #262
Comments
@youngmit thank you for the detailed explanation. I do appreciate getting a look at the design and inheritance model 👍
Definitely agree
I wonder if an extra ring of some homogenized reflector + RPV might be a good workaround / substitute. Then it's still a regular structure. But the homogenzation would have to be block specific since the fraction of reflector + rpv + void varies by block... yikes
exciting! by blueprints not really supporting axial ex-core stuff, do you mean that's something that has to be made w/ a driver script, not the plain yaml file?
If instead of adding the RPV to the Core, would it be easier w.r.t. existing interfaces to have the RPV and ex-core stuff be a child of the Reactor and a sibling to Core? Then anything that works on I'll try and kick some stuff around and see what I can come up with. |
Regarding custom reactor model construction/initialization, I had in the past proposed the following plugin API: @staticmethod
@HOOKSPEC
def defineReactorConstructionMethods():
"""
Return new methods by which a Reactor object can be created.
This allows for plugins to provide their own approach to Reactor model
construction than the default, Blueprints-defined method that comes with ARMI.
These can be useful for exotic reactor types which are not well served by the
Blueprints mechanism.
Returns
-------
methods : dict
Implementations should return a dictionary mapping of name to method,
where ``name`` is a unique string label for the corresponding method, and
``method`` is a function-like object that takes a ``Settings`` object as its
only argument and returns a fully-constructed ``Reactor`` object.
Note
----
Reactor construction is ultimately governed by the ``reactorConstructionMethod``
setting. To fully expose new methods, the names should also be provided as
Options to the ``reactorConstructionMethod`` setting as well.
See also
--------
defineSettings
armi.settings.setting.Option
Example
-------
In this example, we define a new function for creating a Reactor object. It uses
a new setting that we also provide to control its behavior. We also advertise
the method using the ``defineSettings()`` and
``defineReactorConstructionMethods()`` hooks::
def fancyReactorMaker(cs):
r = reactors.Reactor(name=cs["fancyReactorName"], blueprints=None)
// Do more magic!
return r
class MyPlugin(ArmiPlugin):
def defineSettings():
return [
# This setting is used to control/parameterize the function
# defined above.
setting.Setting("fancyReactorName", default=""),
setting.Option("reactorConstructionMethod", "fancyReactor")
]
def defineReactorConstructionMethods():
return {"fancyReactor": fancyReactorMaker}
""" The direct motivation for this API was to make a custom reactor initializer that did some mesh overlay work to handle weirdly-shaped Blocks/Components (eerily similar to your fixed reflector situation). The intention was for this to also serve as a proving ground for more flexible Reactor model hierarchies and ex-core things that aren't yet supported by Blueprints. If you think this would be useful, I could try to get this on a branch for you to experiment with. |
Thanks for the detailed response @youngmit. If you're comfortable pushing a branch of some level of usability (WIP or stable but not accepted) I could take a swing at using that hook. It might be a good way to drop in some shield / rpv-like classes |
@drewejohnson finally got around from digging this up. Check out the |
@youngmit thank you for making that available. I'll let you know how it goes on my end |
One possible solution to this would be to an armi/armi/physics/neutronics/parameters.py Lines 30 to 32 in 6163e94
So, we would define:
This all seems quite easy to do. And then ex-core structures would be automatically read to-and-from the ARMI Database. Downsides on this first draft, that ARMI could improve in future versions:
Obviously, my idea is just a starting place. Your double-cylinder would be built on top of this kind of entry-level infrastructure. I'm just thinking aloud about a place to start. |
@jakehader This is the ticket in question. In order for something like this to work, we need:
My last thought is: I don't want to have to hunt or guess at what is in the |
I think everything under For example, having a dry cask storage pad with dry casks that sit in the grid cylindrical grid which contain core assemblies inside in a cartesian grid of the casks themselves. In this hypothetical, the core, SFP, and StoragePad would each have independent grids and the reactor would then have it's own grid that defines the relative orientation and origin of each grid underneath. Next, for a specific reactor design, the plugin or application might want some functionality to say, core assemblies shall not go straight to the StoragePad until some conditions are met (i.e., passing through the SFP, waiting for X amount of time, until peak decay heat is below a certain value, or all the above). I think applications should be able to subclass the Reactor if needed to get some type of this behavior and the plugin hooks should support an adaptive process to register new things as needed. In this example, may be the Reactor doesn't hold the logic or constraints but maybe a FuelHandler does. Right now I'm just thinking let's add the capability to have "N" containers that sit on the reactor that house assemblies. How they get there based on other equipment or snap to that location using a FuelHandler may be the next step. Handling fluid systems like heat exchangers, pumps, pipes, etc. is probably too ambitious at first, and would require more thought about what a Reactor object truly is and isn't |
Okay, we finally have a first pass at this in ARMI: #1891 We have two teams using this feature internally, so I fully expect if there are problems, they will be opened as smaller (less architectural) changes. Thanks, all! |
Wanted to start a discussion / propose a new feature: ex-core structures in ARMI
The base system I'd like to model is one or more concentric right cylinders defining ex-core structures like core barrel, reactor pressure vessel (RPV) and shielding. I had a thought of adding some features to the blueprints file, like a block that doesn't make it's way into the core, but still utilizes material resolution and dimension linking. A new
ComplexShape
could be added to model the various aspects of the canning like(dimensions made up) This information could be provided in the
blocks
section using circles rather than cylinders, and not placed in the core facemap. Maybe given a uniqueFlag
to show it's part of the ex-core for bookkeeping and other checks, e.g.,getFirstBlock(Flags.EXCORE)
I guess you could also model the upper / lower ex-core structures with dedicated axial layers. But you could run into a position like
where the vertical ex-core structures that make up the radial shielding don't form a connection with the two lowest levels. Or they would, but the green and blue materials don't line up correctly
Another consideration would be "clipped" assemblies. In modeling the MHTGR in ARMI (#224), we'd likely have extra rings around the outside making up the "permanent reflector" which would then be clipped by the barrel to make up those complex outer shapes.
I've dropped a proxy barrel over the FFTF facemap as another example
This will likely also have knock-on effects for tallying (full hex volume won't actually see neutrons) and visualization
The MHTGR also has some repeating arc-segments that make up coolant channels. The BEAVRS model has similar arcs for neutron shields between the core barrel and the RPV
The region between the barrel, shield segments, and RPV could be filled with a
DerivedShape
to help model the down-comer regionThe text was updated successfully, but these errors were encountered: