diff --git a/doc/content/bib/vtb.bib b/doc/content/bib/vtb.bib index b3104cecd..018577d49 100755 --- a/doc/content/bib/vtb.bib +++ b/doc/content/bib/vtb.bib @@ -1551,6 +1551,17 @@ @techreport{steffy1970 year = 1970 } +@techreport{osti_2562160, + author = {Shahbazi, Shayan and Fei, Tingzhou and Fang, Jun and Jeong, Yeongshin and Tano, Mauricio and de Oliveira, Rodrigo and Walker, Samuel and Hartanto, Donny and Davidson, Eva}, + title = {Towards the Development of Molten Salt Reactor Multiphysics Modeling Capabilities: Depletion, Thermochemistry, Reactor Dynamics, and Species Tracking}, + institution = {Argonne National Laboratory}, + number = {ANL/NSE--24/62}, + doi = {10.2172/2562160}, + url = {https://www.osti.gov/biblio/2562160}, + place = {United States}, + year = {2024}, + month = {09}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % references for the MSFR Thermochimica multiphysics core model diff --git a/doc/content/media/msr/msre/xe_poisoning/msre_model.png b/doc/content/media/msr/msre/xe_poisoning/msre_model.png new file mode 100755 index 000000000..457d4d984 Binary files /dev/null and b/doc/content/media/msr/msre/xe_poisoning/msre_model.png differ diff --git a/doc/content/media/msr/msre/xe_poisoning/ss_results.png b/doc/content/media/msr/msre/xe_poisoning/ss_results.png new file mode 100755 index 000000000..1fee83d96 Binary files /dev/null and b/doc/content/media/msr/msre/xe_poisoning/ss_results.png differ diff --git a/doc/content/media/msr/msre/xe_poisoning/xe_feedback.png b/doc/content/media/msr/msre/xe_poisoning/xe_feedback.png new file mode 100755 index 000000000..659946ff8 Binary files /dev/null and b/doc/content/media/msr/msre/xe_poisoning/xe_feedback.png differ diff --git a/doc/content/msr/msre/index.md b/doc/content/msr/msre/index.md index 9e5cbe278..e6069b5ed 100644 --- a/doc/content/msr/msre/index.md +++ b/doc/content/msr/msre/index.md @@ -6,6 +6,8 @@ [Multiphysics RZ Model](multiphysics_rz_model/index.md) +[Modeling Xenon poisoning](msre/msre_xe.md) + [Cardinal model of pipe thermal striping](cardinal_thermal_striping.md) [nekRS CFD model of lower plenum](msre/lp_nekrs_model.md) diff --git a/doc/content/msr/msre/msre_xe.md b/doc/content/msr/msre/msre_xe.md new file mode 100644 index 000000000..ed0fc9763 --- /dev/null +++ b/doc/content/msr/msre/msre_xe.md @@ -0,0 +1,364 @@ +# MSRE Multiphysics Xenon Poisoning Model + +*Contact: Jun Fang, fangj.at.anl.gov* + +*Model link: [MSRE Xe Poisoning Model](https://github.com/idaholab/virtual_test_bed/tree/xe/msr/msre/xe_poisoning)* + +!tag name=Molten Salt Reactor Experiment MultiPhysics Primary loop Model + description=Steady state and reactivity insertion accident models of the MSRE primary loop + image=https://github.com/idaholab/virtual_test_bed/blob/xe/doc/content/media/msr/msre/xe_poisoning/ss_results.png + pairs=reactor_type:MSR + reactor:MSRE + geometry:primary_loop + codes_used:BlueCrab;Griffin;Pronghorn + transient:steady_state;Xenon + V_and_V:demonstration + input_features:checkpoint_restart + computing_needs:Workstation + fiscal_year:2024 + sponsor:NEAMS + institution:ANL;INL + +## Summary + +This page documents an effort that extends the existing MSRE multiphysics Griffin–Pronghorn studies by incorporating Xe poisoning physics. The objective is to integrate fission-product transport and reactivity feedback effects into the established loop-scale multiphysics model so reactor dynamics reflect both thermal-hydraulic and neutronic responses to ($^{135}\text{Xe}$) and ($^{135}\text{I}$) behavior in circulating fuel salt. + +Modeling xenon effects is essential because ($^{135}\text{Xe}$), with its large neutron absorption cross section, has a dominant influence on reactor reactivity and stability. In molten salt reactors, $^{135}\text{I}$ and its daughter product $^{135}\text{Xe}$ are transported throughout the primary loop by the flowing fuel. This implementation specifically accounts for the advection and diffusion of both isotopes within the salt. Additionally, it models the gaseous fission product removal of $^{135}\text{Xe}$ (e.g., at the pump bowl), while $^{135}\text{I}$ remains entirely within the salt phase. Note that more complex interactions, such as xenon migration into the graphite moderator or transport via discrete helium bubbles, are currently outside the scope of this model. + +Therefore, incorporating xenon transport and feedback within a tightly coupled multiphysics framework is critical for accurately predicting reactor dynamics and ensuring reliable analysis of MSR behavior under both steady-state and transient conditions. + + +## Model Description + +The model utilizes a 2-D axisymmetric configuration representing the full MSRE primary loop. Compared with the SAM-Griffin configuration, this Griffin-Pronghorn model resolves the complete loop in a computationally efficient 2-D form while preserving the dominant system-level transport and feedback behavior. For foundational details on the base mesh and geometry, refer to the [MSRE Multiphysics Core Model](https://mooseframework.inl.gov/virtual_test_bed/msr/msre/multiphysics_rz_model/msre_multiphysics_core_model.html). + +The total reactor power for this coupled model is set to $5.0\ \mathrm{MW}$ [!citep](osti_2562160). The pump head is selected to produce a loop circulation time of approximately $25\ \mathrm{s}$, which corresponds to a volumetric flow rate of about $3.14\times10^{-2}\ \mathrm{m^3\,s^{-1}}$ for the modeled loop volume. + +## Computational Model Description + +### Geometry and Mesh + +The computational domain includes the core, lower plenum, upper plenum, downcomer, riser, pump bowl, and return-line regions of the MSRE primary loop. As shown in [msre_2d], the 2-D loop-wide representation provides improved geometric fidelity relative to reduced-order configurations while remaining computationally tractable for tightly coupled multiphysics analysis. The core region is modeled using a porous-medium approach with a porosity of 22.28%, representing the fuel-salt volume fraction in the homogenized fuel-graphite region. + +!media msr/msre/xe_poisoning/msre_model.png + style=width:20% + id=msre_2d + caption=2-D axisymmetric model components for the MSRE multiphysics model. + +### Physics and Coupling Strategy + +To model Xe poisoning in the existing Griffin-Pronghorn MSRE framework, the +MOOSE MultiApps+ hierarchy is configured with +Pronghorn+ as the parent application and +Griffin+ as the child application. This mirrors the SAM-Griffin coupling philosophy: the thermal-hydraulics application drives simulation flow and data exchange, while Griffin performs neutronics calculations for reactivity and power updates. At a high level, the coupling workflow is: + +- +Thermal Hydraulics (Pronghorn):+ Solves weakly compressible porous-media conservation equations for mass, momentum, and energy to obtain temperature, pressure, and flow fields. +- +Neutronics (Griffin):+ Solves a multigroup diffusion eigenvalue problem to obtain neutron flux and power distribution. +- +Species Transport (Pronghorn):+ Evolves $^{135}Xe$ and $^{135}I$ concentrations in the circulating fuel salt, including production, decay, and transport effects. +- +Gas Removal Representation:+ Includes a pump-bowl treatment to represent stripping/removal of gaseous fission products such as $^{135}Xe$ during circulation. +- +Coupling/Feedback:+ Power and temperature fields are exchanged between applications, and local xenon concentration updates absorption for neutronics. + +!alert note title=Explicit Coupling Implementation +The exchange between Pronghorn and Griffin is handled via two-way explicit coupling. While data is transferred between the thermal-hydraulics and neutronics solvers at every timestep, the current implementation does not utilize fixed-point (Picard) iterations. This explicit treatment is computationally efficient and provides sufficient accuracy for the slow-evolving transients typical of $^{135}\text{Xe}$ poisoning and $^{135}\text{I}$ decay. + +### Governing Equations and Closure Models + +#### Species Transport (Pronghorn) + +The transport of $^{135}Xe$ and $^{135}I$ is modeled as advection-diffusion-reaction of scalar concentrations in the fuel salt: + +\begin{equation} +\frac{\partial \epsilon C_i}{\partial t} + +\nabla \cdot (\vec{u} C_i) - +\nabla \cdot \left( \epsilon \left( D_{m,i} + \frac{\nu_t}{Sc_t} \right) \nabla C_i \right) = S_i - \lambda_i \epsilon C_i +\end{equation} + +where $\epsilon$ is porosity (salt volume fraction), $\vec{u}$ is superficial velocity, $D_{m,i}$ is molecular diffusion coefficient, $\nu_t$ is turbulent eddy viscosity, $Sc_t$ is turbulent Schmidt number, $S_i$ is source term, and $\lambda_i$ is decay constant. + +For the xenon-iodine chain, the source terms are: + +- For $^{135}I$: $S_I = \gamma_I \Sigma_f \phi$ +- For $^{135}Xe$: $S_{Xe} = \gamma_{Xe} \Sigma_f \phi + \lambda_I C_I$ + +#### Thermal Hydraulics (Pronghorn) + +Pronghorn uses a weakly compressible porous-media formulation. Momentum conservation follows Darcy-Forchheimer behavior: + +\begin{equation} +\frac{\rho}{\epsilon} \left( \frac{\partial \vec{u}}{\partial t} + \frac{(\vec{u} \cdot \nabla) \vec{u}}{\epsilon} \right) = -\nabla P + \rho \vec{g} - \left( \frac{\mu}{K} + \frac{\rho C_d}{\sqrt{K}} |\vec{u}| \right) \vec{u} +\end{equation} + +#### Neutronics (Griffin) + +The neutron flux is computed with a 16-group diffusion approximation using cross sections from the [base MSRE coupled model](https://virtualtestbed.inl.gov/msr/msre/multiphysics_rz_model/msre_multiphysics_core_model.html). + +\begin{equation} +-\nabla \cdot D_g \nabla \phi_g + \Sigma_{r,g} \phi_g - \sum_{g' \neq g} \Sigma_{s,g' \to g} \phi_{g'} = \frac{\chi_g}{k_{eff}} \sum_{g'} \nu \Sigma_{f,g'} \phi_{g'} +\end{equation} + +#### Reactivity Feedback and Xenon Poisoning + +Coupling between physics is achieved through cross-section updates that account for temperature feedback and delayed neutron precursor (DNP) advection, in addition to xenon poisoning. The macroscopic absorption cross section in Griffin is updated with local xenon concentration from Pronghorn: + +\begin{equation} +\Sigma_{a,g}(\vec{r}) = \Sigma_{a,g}^{base}(\vec{r}, T) + \sigma_{a,g}^{Xe135} C_{Xe135}(\vec{r}) +\end{equation} + +where $\sigma_{a,g}^{Xe135}$ is the microscopic absorption cross section for $^{135}Xe$ in energy group $g$. This local feedback captures net reactivity loss and the spatial xenon burnout effect in high-flux regions. + +#### Key Model Parameters + +Key parameters used in the governing equations include: + +- $\epsilon$: Porosity (fuel-salt volume fraction in porous regions). +- $C_i$: Species concentration for isotope $i$ (e.g., $^{135}I$, $^{135}Xe$). +- $\vec{u}$: Superficial velocity vector in the porous medium. +- $D_{m,i}$: Molecular diffusion coefficient for species $i$. +- $\nu_t$: Turbulent eddy viscosity. +- $Sc_t$: Turbulent Schmidt number. +- $S_i$: Net source term for species $i$ (fission yield and/or parent decay contribution). +- $\lambda_i$: Radioactive decay constant for species $i$. +- $\rho$: Fluid density. +- $\mu$: Dynamic viscosity. +- $K$: Permeability of the porous region. +- $C_d$: Forchheimer drag coefficient. +- $D_g$: Diffusion coefficient for neutron energy group $g$. +- $\phi_g$: Neutron flux in group $g$. +- $\Sigma_{r,g}$: Removal macroscopic cross section in group $g$. +- $\Sigma_{s,g' \to g}$: Scattering macroscopic cross section from group $g'$ to group $g$. +- $\nu \Sigma_{f,g}$: Production macroscopic cross section in group $g$. +- $\chi_g$: Fission spectrum fraction in group $g$. +- $k_{eff}$: Effective neutron multiplication factor. +- $\Sigma_{a,g}^{base}$: Baseline macroscopic absorption cross section in group $g$ (temperature dependent). +- $\sigma_{a,g}^{Xe135}$: Microscopic absorption cross section of $^{135}Xe$ in group $g$. +- $C_{Xe135}$: Local concentration of $^{135}Xe$ used for reactivity feedback. + +## Input Descriptions + +There are two primary input files in this coupled Xe-poisoning model: + +- Pronghorn thermal-hydraulics/species parent input: `msr/msre/xe_poisoning/th_xe.i` +- Griffin neutronics sub-application input: `msr/msre/xe_poisoning/neu_xe.i` + +### Pronghorn Input File (`th_xe.i`) + +The Pronghorn input file acts as the **Parent Application**. It is responsible for solving fluid flow, heat transfer, and the transport of physical species (iodine and xenon) throughout the primary loop. + +#### Mesh + +The simulation uses a 2-D axisymmetric (RZ) coordinate system. + +- **Geometry:** The mesh represents the full primary loop, including the core, plenums, and piping regions. +- **Initialization:** `FileMeshGenerator` loads a pre-existing mesh and restart-ready state. In practice, using Exodus restart settings (e.g., `use_for_exodus_restart = true`) allows the xenon study to start from a previously converged flow field. + +!listing msr/msre/xe_poisoning/th_xe.i block=Mesh language=cpp + +#### Variables + +This block defines the finite-volume primary variables for the coupled thermal-hydraulic and species problem: + +- **Flow & energy:** Superficial velocity components ($u_x$, $u_y$), pressure ($P$), fluid temperature ($T_{fluid}$), and solid temperature ($T_{solid}$). +- **Delayed neutron precursors (DNP):** Six groups (`c1` through `c6`) that drift with circulating salt. +- **Fission-product species:** `I135` and `Xe135` as transport scalars for poisoning-chain dynamics. + +!listing msr/msre/xe_poisoning/th_xe.i block=Variables language=cpp + +#### Physics / NavierStokes + +The `NavierStokes` physics syntax streamlines the coupled porous-media thermal-hydraulic and species transport setup: + +- **Flow & Energy:** Weakly compressible porous-media formulation with Darcy-Forchheimer resistance and heat transfer. +- **Turbulence:** Mixing-length model provides turbulent viscosity and diffusivity for heat and species transport. +- **Scalar Transport:** Integrated advection for delayed neutron precursors (DNP) and fission-product species (`I135`, `Xe135`). + +!listing msr/msre/xe_poisoning/th_xe.i block=Physics language=cpp + +#### FVBCs + +Boundary conditions for species transport primarily enforce symmetry: + +- Symmetry scalar BCs on centerline/top boundaries for `I135` and `Xe135` preserve the 2-D axisymmetric assumption and prevent non-physical cross-axis species flux. + +!listing msr/msre/xe_poisoning/th_xe.i block=FVBCs language=cpp + +#### FVKernels + +This section contains specific source, reaction, and component-level kernels: + +- **Source & Decay:** Handles fission production and radioactive decay for I-135, Xe-135, and the six DNP groups. +- **Pump & Heat Transfer:** Includes `INSFVPump` kernels for momentum and `NSFVEnergyAmbientConvection` for heat exchange in the pump/HX block. +- **Stripping Model:** A dedicated `NSFVEnergyAmbientConvection` kernel in the `strip` block represents physical xenon removal from the salt. + +!listing msr/msre/xe_poisoning/th_xe.i block=FVKernels language=cpp + +#### FVInterfaceKernels + +Conjugate heat transfer (CHT) across fluid/structure interfaces is handled here: + +- Interface kernels (e.g., convection-correlation based) compute local heat transfer between fuel salt and structures such as the core barrel, ensuring realistic thermal coupling. + +!listing msr/msre/xe_poisoning/th_xe.i block=FVInterfaceKernels language=cpp + +#### Materials + +Material models provide local properties and closures: + +- **Porosity:** Core porosity set to 22.28% to represent effective salt-channel volume fraction. +- **Fluid properties:** Temperature-dependent density, viscosity, and thermal conductivity. +- **Xenon mass transfer:** Parsed/functor-based closures can be used for stripping coefficients (often tied to Reynolds/Schmidt correlations). + +!listing msr/msre/xe_poisoning/th_xe.i block=Materials language=cpp + +#### MultiApps + +This block defines multiphysics execution hierarchy: + +- Griffin (`neu_xe.i`) is launched as a sub-application and typically executed at the end of each Pronghorn timestep/Picard update. + +!listing msr/msre/xe_poisoning/th_xe.i block=MultiApps language=cpp + +#### Transfers + +Transfers implement two-way coupling data exchange: + +- **To Griffin:** Pronghorn sends thermal state (e.g., `T_salt`), flow-related fields, DNP groups, and `Xe135` concentration. +- **From Griffin:** Pronghorn receives `power_density` and `fission_source` to update heat deposition and isotope source terms. + +!listing msr/msre/xe_poisoning/th_xe.i block=Transfers language=cpp + +### Griffin Input File (`neu_xe.i`) + +The Griffin input file is the **Sub-Application**. It solves neutronics to determine flux, power generation, and xenon-driven reactivity effects. + +#### TransportSystems + +Griffin uses a 16-group CFEM-diffusion transport system: + +- **Eigenvalue solve:** Computes $k_{eff}$ and flux distribution. +- **DNP linkage:** External DNP settings allow Griffin to consume precursor information transferred from Pronghorn instead of solving an independent precursor transport problem. + +!listing msr/msre/xe_poisoning/neu_xe.i block=TransportSystems language=cpp + +#### Mesh + +The neutronics solve uses an RZ mesh loaded via `FileMeshGenerator`, consistent with loop geometry used by the parent application. + +!listing msr/msre/xe_poisoning/neu_xe.i block=Mesh language=cpp + +#### AuxVariables + +Aux variables store transferred and derived feedback fields (e.g., salt temperature, velocity components, isotope-density-related auxiliaries). + +!listing msr/msre/xe_poisoning/neu_xe.i block=AuxVariables language=cpp + +#### AuxKernels + +Aux kernels process coupled state updates: + +- Build array representations for precursor groups (`c1`-`c6`) when needed by transport systems. +- Use parsed expressions to update atomic densities (e.g., `ad_Xe135`, fuel/isotope densities) as local TH conditions evolve. + +!listing msr/msre/xe_poisoning/neu_xe.i block=AuxKernels language=cpp + +#### UserObjects + +User objects support restart and solution persistence: + +- Solution vectors (transport and auxiliary state) are written for restartability and postprocessing continuity. + +!listing msr/msre/xe_poisoning/neu_xe.i block=UserObjects language=cpp + +#### PowerDensity + +This block converts fission rate into volumetric power density ($W/m^3$): + +- Power is normalized to the operating reactor level (5.0 MW) so the returned thermal source is physically consistent for Pronghorn energy equations. + +!listing msr/msre/xe_poisoning/neu_xe.i block=PowerDensity language=cpp + +#### Materials + +`CoupledFeedbackNeutronicsMaterial` is the core poisoning-feedback mechanism: + +- **Cross-section feedback:** Microscopic cross-sections are interpolated versus local fuel temperature (`T_{salt}`). +- **Xenon integration:** Including `XE135` in isotope feedback and linking to `ad_Xe135` adds explicit xenon absorption penalties in the eigenvalue calculation. +- **Reactivity impact:** This coupling pathway enables prediction of xenon-induced reactivity loss (e.g., the ~-410 pcm level reported in results). + +!listing msr/msre/xe_poisoning/neu_xe.i block=Materials language=cpp + +## Results + +The current Pronghorn-Griffin configuration represents an initial implementation of Xe-poisoning physics in a 2-D MSRE multiphysics model. At this stage, results are limited to steady-state behavior; transient cases and additional Xe interactions with graphite and circulating bubbles are reserved for future studies. + +The coupled model was run on Idaho National Laboratory's Sawtooth cluster using the NEAMS BlueCRAB suite for a total simulated time of 400,000 s (about 111 h). + +### Steady-State Xenon Convergence + +The core-averaged $^{135}Xe$ concentration increases monotonically and asymptotically approaches a steady value, with practical convergence reached at approximately 80 h. + +!media msr/msre/xe_poisoning/xe_feedback.png + style=width:45% + id=xe_feedback + caption=Development of core-averaged $^{135}Xe$ concentration during the steady-state coupled simulation. + +The converged average core concentration is $3.86\times10^{-11}$ atoms/barn-cm. The curve shows a rapid early rise followed by a saturation regime, consistent with the balance between I-135 decay production, Xe-135 burnout in high-flux regions, and loop transport. + +### Steady-State Field Distributions in the Primary Loop + +[ss_results] shows the steady-state scaled fission source and $^{135}Xe$ concentration distributions. + +!media msr/msre/xe_poisoning/ss_results.png + style=width:60% + id=ss_results + caption=Steady-state distributions in the MSRE loop: (a) scaled fission source and (b) $^{135}Xe$ concentration. + +Key observations from the spatial fields include: + +- The highest fission source is concentrated in the core region, with expected attenuation toward ex-core loop components. +- $^{135}Xe$ remains relatively low in most core regions because strong neutron flux drives Xe burnout to $^{136}Xe$ by absorption. +- A comparatively elevated $^{135}Xe$ band appears near the upper core / outlet region, where transport and production-decay competition produce localized accumulation. +- Ex-core regions retain higher Xe than the core until recirculation through the lower plenum returns salt to high-flux zones. + +### Reactivity Impact of Xe Poisoning + +A reference case without Xe poisoning was also evaluated. Comparison of $k_{eff}$ between poisoned and unpoisoned coupled cases indicates an estimated reactivity penalty of approximately -337 pcm, which is in agreement with trends from the SAM-Griffin coupled study. + +This -337 pcm penalty is significantly lower than the values typically encountered in commercial light water reactors (often exceeding -2000 pcm). The reduced xenon poisoning in the MSRE is mainly due to two factors: the online gas stripping system in the pump bowl, which actively removes $^{135}Xe$ from the salt, and the relatively lower power density of the MSRE compared to a typical PWR, which leads to a lower steady-state xenon concentration. + +### Current Status and Future Work + +These results demonstrate that the 2-D Pronghorn-Griffin MSRE model can capture first-order Xe-poisoning behavior in a fully coupled loop simulation. Ongoing development will expand the model to transient operation and include additional physics for Xe interactions with graphite and circulating bubbles. + +## Postprocessing + +A Python plotting script, `plot_xe.py`, is located in the model folder for plotting the $^{135}Xe$ concentration data. This script reads the `th_xe_out.csv` output file and generates a plot (e.g., `xe_feedback.png`) showing the evolution of xenon concentration over time. + +## Run Command + +The MSRE Xenon Poisoning Model is executed using the BlueCRAB physics suite, which provides the necessary coupling between Pronghorn (thermal-hydraulics) and Griffin (neutronics). The following example demonstrates how to initialize the environment and launch a parallel simulation on the INL Sawtooth cluster. + +### 1. Environment Setup + +Before launching on the INL Sawtooth cluster (or a similar MOOSE-based HPC environment), load the required modules so dependencies, MPI libraries, and executables are available in your shell environment. + +```language=bash +# Initialize the MOOSE environment and load the BlueCRAB application suite +module load use.moose moose-apps bluecrab +``` + +### 2. Executing the Coupled Simulation + +Use `mpiexec` to distribute the coupled solve. For this 2-D axisymmetric case, 6 cores are a practical balance between computational speed and communication overhead. + +```language=bash +# Execute the parent application input file using 6 processors +mpiexec -n 6 blue_crab-opt -i th_xe.i 2>&1 | tee logfile +``` + +### 3. Detailed Command Breakdown + +!table id=xe_run_cmd_breakdown caption=Breakdown of the coupled run command. +| Component | Function | +| :- | :- | +| `mpiexec -n 6` | Launches MPI with 6 parallel processes. | +| `blue_crab-opt` | Optimized executable containing both Pronghorn and Griffin physics. | +| `-i th_xe.i` | Specifies the parent application input file; the sub-app input (`neu_xe.i`) is launched via the `[MultiApps]` block. | +| `2>&1` | Redirects standard error to standard output so all messages are captured together. | +| `tee logfile` | Writes console output to `logfile` while still printing to screen for live monitoring. | diff --git a/msr/msre/xe_poisoning/.gitattributes b/msr/msre/xe_poisoning/.gitattributes new file mode 100644 index 000000000..87d2162c1 --- /dev/null +++ b/msr/msre/xe_poisoning/.gitattributes @@ -0,0 +1 @@ +neu_xe_init.e filter=lfs diff=lfs merge=lfs -text diff --git a/msr/msre/xe_poisoning/gold/neu_xe_out.csv.gold b/msr/msre/xe_poisoning/gold/neu_xe_out.csv.gold new file mode 100755 index 000000000..380719f08 --- /dev/null +++ b/msr/msre/xe_poisoning/gold/neu_xe_out.csv.gold @@ -0,0 +1,4 @@ +time,Fuel_avg_Temp,Fuel_core_avg_Temp,Fuel_core_max_Temp,Fuel_max_Temp,Leakage,Mod_avg_Temp,Mod_max_Temp,absorption_RR,eigenvalue,fission_RR,ngamma_RR,nufission_RR,power_scaling,total_power +0,923,923,923,923,0,923,923,0,1,0,0,0,3.456287690711e+15,5000000 +1,923,923,923,923,37.712728282201,923,923,70.041277574854,1.0123676840583,44.597005994381,24.868374260478,108.36777298497,3.6167661946162e+15,5000000 +2,923,923,923,923,37.712728282201,923,923,70.041277574854,1.0123676840583,44.597005994381,24.868374260478,108.36777298497,3.6167661946162e+15,5000000 diff --git a/msr/msre/xe_poisoning/gold/th_xe_out.csv.gold b/msr/msre/xe_poisoning/gold/th_xe_out.csv.gold new file mode 100755 index 000000000..5ec21da57 --- /dev/null +++ b/msr/msre/xe_poisoning/gold/th_xe_out.csv.gold @@ -0,0 +1,3 @@ +time,Xe_avg,area_pp_downcomer_inlet,inlet_T,inlet_p,outlet_T,outlet_p,return_line_fraction,vfr_downcomer,vfr_pump,vfr_return_line +0,0,0.19677333595724,0,0,0,0,0,0,0,0 +0.1,2.6314560213783e-27,0.19677333595724,923.00465965952,-413648.28395474,909.53681689842,-480719.92049981,-0.18272592545552,-0.028604114493781,0.029091320728937,0.0053157385029184 diff --git a/msr/msre/xe_poisoning/mesh/.gitattributes b/msr/msre/xe_poisoning/mesh/.gitattributes new file mode 100644 index 000000000..8d5831472 --- /dev/null +++ b/msr/msre/xe_poisoning/mesh/.gitattributes @@ -0,0 +1 @@ +strip_mesh_in.e filter=lfs diff=lfs merge=lfs -text diff --git a/msr/msre/xe_poisoning/mesh/strip_mesh.i b/msr/msre/xe_poisoning/mesh/strip_mesh.i new file mode 100755 index 000000000..e16cc0953 --- /dev/null +++ b/msr/msre/xe_poisoning/mesh/strip_mesh.i @@ -0,0 +1,160 @@ +fuel_pipe_D = '${fparse 10*0.0254}' +fuel_pipe_R = '${fparse fuel_pipe_D/2.0}' +core_internal_R = '${fparse 0.496855718 + 2.5*0.0254 - fuel_pipe_R}' +core_outer_gap = 0.098795213 +core_barrel_thickness = 0.005 +downcomer_thickness = 0.045589414 +height_retrun_elbow = 0.05 + +external_pipe_length = '${fparse 6.71 * 2.0}' +external_piping_volume = '${fparse pi*((2.5*0.0254)^2)*external_pipe_length}' +height_pump = '${fparse fuel_pipe_R / 1.5}' +outer_R = '${fparse fuel_pipe_R +core_internal_R + core_outer_gap + core_barrel_thickness + downcomer_thickness}' +top_disc_volume = '${fparse pi*outer_R^2*height_pump}' +remaining_volume = '${fparse external_piping_volume-top_disc_volume}' +#core_riser_flow_area = '${fparse pi*fuel_pipe_R^2}' +core_downcomer_flow_area = '${fparse pi*(outer_R^2 - (outer_R-downcomer_thickness)^2)}' +piping_height = '${fparse remaining_volume/(core_downcomer_flow_area + core_downcomer_flow_area)}' + +[Mesh] + coord_type = 'RZ' + type = MeshGeneratorMesh + block_id = '1 2 3 4 6 7 8 9 10 11 14 15' + block_name = 'core lower_plenum upper_plenum down_comer core_barrel riser pump elbow void bypass_line strip return_line' + uniform_refine = 1 + + [cartesian_mesh] + type = CartesianMeshGenerator + dim = 2 + dx = '${height_retrun_elbow} + ${fparse fuel_pipe_R - height_retrun_elbow} + ${height_retrun_elbow} + ${fparse core_internal_R - height_retrun_elbow} + ${core_outer_gap} + ${core_barrel_thickness} + ${downcomer_thickness}' + ix = '2 + 4 + 2 + 8 + 2 + 1 + 1' + dy = '0.1715 0.100 0.100 0.246 0.246 0.246 + 0.246 0.246 0.100 0.100 0.1715 ${piping_height} ${height_pump} + ${height_retrun_elbow} ${height_retrun_elbow}' + iy = '6 4 4 10 10 10 10 10 4 4 6 4 4 4 4' + subdomain_id = ' 2 2 2 2 2 2 2 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 1 1 1 1 1 6 4 + 3 3 3 3 3 6 4 + 7 7 10 10 10 10 9 + 8 8 9 9 9 9 9 + 15 13 11 12 12 12 12 + 15 14 11 12 12 12 12' + [] + [core_downcomer_boundary] + input = cartesian_mesh + type = SideSetsBetweenSubdomainsGenerator + primary_block = '6' + paired_block = '1 4 2 3' + new_boundary = core_downcomer_boundary + [] + [loop_boundary] + input = core_downcomer_boundary + type = SideSetsBetweenSubdomainsGenerator + primary_block = '9 7 3' + paired_block = '10' + new_boundary = 'loop_boundary' + [] + [bypass_line_boundary] + input = loop_boundary + type = SideSetsBetweenSubdomainsGenerator + primary_block = '11' + paired_block = '12' + new_boundary = 'bypass_line_boundary' + [] + [adding_top_to_return_line] + input = bypass_line_boundary + type = RenameBoundaryGenerator + old_boundary = 'top' + new_boundary = 'extraction' + [] + [strip_line_boundary] + input = adding_top_to_return_line + type = SideSetsBetweenSubdomainsGenerator + primary_block = '14' + paired_block = '15 11' + new_boundary = 'strip_line_boundary' + [] + [return_line_boundary] + input = strip_line_boundary + type = SideSetsBetweenSubdomainsGenerator + primary_block = '11 14 15 8' + paired_block = '13' + new_boundary = 'return_line_boundary' + [] + [internal_pump_sideset] + input = return_line_boundary + type = SideSetsBetweenSubdomainsGenerator + primary_block = '7' + paired_block = '8' + new_boundary = 'pump_outlet' + [] + [internal_downcomer_sideset] + input = internal_pump_sideset + type = SideSetsBetweenSubdomainsGenerator + primary_block = '4' + paired_block = '9' + new_boundary = 'downcomer_inlet' + [] + [top_core_barrel] + input = internal_downcomer_sideset + type = SideSetsBetweenSubdomainsGenerator + primary_block = '6' + paired_block = '10' + new_boundary = 'top_core_barrel' + [] + [top_boundary_return_line] + input = top_core_barrel + type = SideSetsBetweenSubdomainsGenerator + primary_block = '9' + paired_block = '12' + new_boundary = 'top' + [] + [return_line_internal_sideset] + input = top_boundary_return_line + type = SideSetsBetweenSubdomainsGenerator + primary_block = '15' + paired_block = '8' + new_boundary = 'return_line_sideset' + [] + # [missing_boundary] + # input = return_line_internal_sideset + # type = SideSetsBetweenSubdomainsGenerator + # primary_block = '13' + # paired_block = '8' + # new_boundary = 'top_of_pump' + # [] + [block_delete] + input = return_line_internal_sideset + type = BlockDeletionGenerator + block = '10 12 13' + [] + #[block_delete] + # type = BlockDeletionGenerator + # input = top_core_barrel + # block = '10' + #[] +[] + +[Executioner] + type = Steady +[] diff --git a/msr/msre/xe_poisoning/mgxs/.gitattributes b/msr/msre/xe_poisoning/mgxs/.gitattributes new file mode 100644 index 000000000..486caf183 --- /dev/null +++ b/msr/msre/xe_poisoning/mgxs/.gitattributes @@ -0,0 +1 @@ +xs_msre_micro_xe.xml filter=lfs diff=lfs merge=lfs -text diff --git a/msr/msre/xe_poisoning/mgxs/xs_msre_micro_xe.xml b/msr/msre/xe_poisoning/mgxs/xs_msre_micro_xe.xml new file mode 100755 index 000000000..667ba7b40 --- /dev/null +++ b/msr/msre/xe_poisoning/mgxs/xs_msre_micro_xe.xml @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb333f333cd9a6c0284d5360993edf49eb3a965cc275088a20d83763857a41e0 +size 129651 diff --git a/msr/msre/xe_poisoning/neu_xe.i b/msr/msre/xe_poisoning/neu_xe.i new file mode 100644 index 000000000..d48864c5f --- /dev/null +++ b/msr/msre/xe_poisoning/neu_xe.i @@ -0,0 +1,546 @@ +# ============================================================================== +# Model description +# Molten Salt Reactor Experiment (MSRE) Model +# Core Neutronics Model +# Integrates: +# - Doppler-Temperature feedback with interpolation from tabulated cross sections +# - Density-Temperature feedback with field functions for density +# MSRE: reference plant design based on 5MW of MSRE Experiment. +# ============================================================================== +# Author(s): Dr. Mauricio Tano, Dr. Mustafa K. Jaradat, Dr. Samuel Walker +# ============================================================================== +# ============================================================================== +# MODEL PARAMETERS +# ============================================================================== +total_power = 5.0E+6 # Total reactor Power (W) +T_Salt_initial = 923.0 # (K) +Salt_Density_initial = 2263.0 # (kg/m3) +# ============================================================================== +# GLOBAL PARAMETERS +# ============================================================================== +[GlobalParams] + library_file = './mgxs/xs_msre_micro_xe.xml' + library_name = 'xs_msre_micro_xe' + is_meter = true +[] +# ============================================================================== +# TRANSPORT SYSTEM +# ============================================================================== +[TransportSystems] + particle = neutron + equation_type = eigenvalue + G = 16 + ReflectingBoundary = 'left' + VacuumBoundary = 'bottom loop_boundary right top top_core_barrel bypass_line_boundary extraction return_line_boundary' + [transport] + scheme = CFEM-Diffusion + family = LAGRANGE + order = FIRST + n_delay_groups = 6 + + assemble_scattering_jacobian = true + assemble_fission_jacobian = true + + external_dnp_variable = 'dnp' + fission_source_aux = true + [] +[] +# ============================================================================== +# GEOMETRY AND MESH +# ============================================================================== +[Mesh] + coord_type = 'RZ' + [fmg] + type = FileMeshGenerator + file = './mesh/strip_mesh_in.e' + [] +[] +# ============================================================================== +# AUXVARIABLES AND AUXKERNELS +# ============================================================================== +[AuxVariables] + [T_salt] + order = CONSTANT + family = MONOMIAL + initial_condition = ${T_Salt_initial} + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [T_solid] + order = CONSTANT + family = MONOMIAL + initial_condition = ${T_Salt_initial} + block = 'core core_barrel' + [] + [fission_rate] + family = MONOMIAL + order = CONSTANT + [] + [Absorption_rate] + family = MONOMIAL + order = CONSTANT + [] + [Leakage_rate] + family = MONOMIAL + order = CONSTANT + [] + [c1] + order = CONSTANT + family = MONOMIAL + initial_condition = 0.000 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [c2] + order = CONSTANT + family = MONOMIAL + initial_condition = 0.000 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [c3] + order = CONSTANT + family = MONOMIAL + initial_condition = 0.000 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [c4] + order = CONSTANT + family = MONOMIAL + initial_condition = 0.000 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [c5] + order = CONSTANT + family = MONOMIAL + initial_condition = 0.000 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [c6] + order = CONSTANT + family = MONOMIAL + initial_condition = 0.000 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [dnp] + order = CONSTANT + family = MONOMIAL + components = 6 + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + + [ad_Xe135] + order = CONSTANT + family = MONOMIAL + initial_condition = 1.0E-10 + [] + + [ad_U235] + order = CONSTANT + family = MONOMIAL + initial_condition = 9.692763E-05 + [] + [ad_U238] + order = CONSTANT + family = MONOMIAL + initial_condition = 1.967924E-04 + [] + [ad_Be9] + order = CONSTANT + family = MONOMIAL + initial_condition = 9.496943E-03 + [] + [ad_Li7] + order = CONSTANT + family = MONOMIAL + initial_condition = 2.121311E-02 + [] + [ad_F9] + order = CONSTANT + family = MONOMIAL + initial_condition = 4.790899E-02 + [] + [ad_Zr90] + order = CONSTANT + family = MONOMIAL + initial_condition = 8.395505E-04 + [] + [ad_Zr91] + order = CONSTANT + family = MONOMIAL + initial_condition = 1.830855E-04 + [] + [ad_Zr92] + order = CONSTANT + family = MONOMIAL + initial_condition = 2.798495E-04 + [] + [ad_Zr94] + order = CONSTANT + family = MONOMIAL + initial_condition = 2.836027E-04 + [] + [ad_Zr96] + order = CONSTANT + family = MONOMIAL + initial_condition = 4.568967E-05 + [] + [ad_C12] + order = CONSTANT + family = MONOMIAL + initial_condition = 7.247622E-02 + block = 'core core_barrel' + [] +[] + +[AuxKernels] + [build_dnp] + type = BuildArrayVariableAux + variable = dnp + component_variables = 'c1 c2 c3 c4 c5 c6' + execute_on = 'initial timestep_begin final' + [] + [update_ad_f_U235] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_U235 + coupled_variables = 'T_salt' + expression = '9.692763E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_U238] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_U238 + coupled_variables = 'T_salt' + expression = '1.967924E-04 *(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Be9] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Be9 + coupled_variables = 'T_salt' + expression = '9.496943E-03*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Li7] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Li7 + coupled_variables = 'T_salt' + expression = '2.121311E-02 *(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_F9] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_F9 + coupled_variables = 'T_salt' + expression = '4.790899E-02*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Zr90] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Zr90 + coupled_variables = 'T_salt' + expression = '8.395505E-04*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Zr91] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Zr91 + coupled_variables = 'T_salt' + expression = '1.830855E-04*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Zr92] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Zr92 + coupled_variables = 'T_salt' + expression = '2.798495E-04*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Zr94] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Zr94 + coupled_variables = 'T_salt' + expression = '2.836027E-04*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_f_Zr96] + type = ParsedAux + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + variable = ad_Zr96 + coupled_variables = 'T_salt' + expression = '4.568967E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_U235] + type = ParsedAux + block = 'core' + variable = ad_U235 + coupled_variables = 'T_salt' + expression = '2.159856E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_U238] + type = ParsedAux + block = 'core' + variable = ad_U238 + coupled_variables = 'T_salt' + expression = '4.385162E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_Be9] + type = ParsedAux + block = 'core' + variable = ad_Be9 + coupled_variables = 'T_salt' + expression = '2.116221E-03*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_Li7] + type = ParsedAux + block = 'core' + variable = ad_Li7 + coupled_variables = 'T_salt' + expression = '4.726958E-03*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_F9] + type = ParsedAux + block = 'core' + variable = ad_F9 + coupled_variables = 'T_salt' + expression = '1.067565E-02*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_Zr90] + type = ParsedAux + block = 'core' + variable = ad_Zr90 + coupled_variables = 'T_salt' + expression = '1.870786E-04*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_Zr91] + type = ParsedAux + block = 'core' + variable = ad_Zr91 + coupled_variables = 'T_salt' + expression = '4.079728E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_Zr92] + type = ParsedAux + block = 'core' + variable = ad_Zr92 + coupled_variables = 'T_salt' + expression = '6.235937E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_c_Zr94] + type = ParsedAux + block = 'core' + variable = ad_Zr94 + coupled_variables = 'T_salt' + expression = '6.319571E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] + [update_ad_Zr96] + type = ParsedAux + block = 'core' + variable = ad_Zr96 + coupled_variables = 'T_salt' + expression = '1.018111E-05*(1.0-0.4798*(T_salt-${T_Salt_initial})/${Salt_Density_initial})' + execute_on = 'INITIAL timestep_end' + [] +[] +# ============================================================================== +# USER OBJECTS (Needed for Restart) +# ============================================================================== +[UserObjects] + [transport_solution_s1] + type = TransportSolutionVectorFile + transport_system = transport + writing = true + execute_on = 'FINAL' + [] + [auxvar_solution_s1] + type = SolutionVectorFile + var = 'T_salt T_solid c1 c2 c3 c4 c5 c6 + ad_C12 ad_U235 ad_U238 ad_Be9 ad_Li7 ad_F9 + ad_Zr90 ad_Zr91 ad_Zr92 ad_Zr94 ad_Zr96 ad_Xe135' + writing = true + execute_on = 'FINAL' + [] +[] +# ============================================================================== +# MATERIALS +# ============================================================================== +[PowerDensity] + power = '${fparse total_power}' + power_density_variable = power_density + integrated_power_postprocessor = total_power + family = L2_LAGRANGE + order = FIRST +[] + +[Materials] + [activeCore] + type = CoupledFeedbackNeutronicsMaterial + grid_names = ' Tfuel' + grid_variables = ' T_salt' + plus = true + isotopes = 'U235 U238 BE9 LI7 F19 + ZR90 ZR91 ZR92 ZR94 ZR96 + C12 XE135' + densities = 'ad_U235 ad_U238 ad_Be9 ad_Li7 ad_F9 + ad_Zr90 ad_Zr91 ad_Zr92 ad_Zr94 ad_Zr96 + ad_C12 ad_Xe135' + material_id = 1 + block = 'core' + [] + [flow_loop] + type = CoupledFeedbackNeutronicsMaterial + grid_names = ' Tfuel ' + grid_variables = ' T_salt' + plus = true + isotopes = 'U235 U238 BE9 LI7 F19 + ZR90 ZR91 ZR92 ZR94 ZR96 + XE135' + densities = 'ad_U235 ad_U238 ad_Be9 ad_Li7 ad_F9 + ad_Zr90 ad_Zr91 ad_Zr92 ad_Zr94 ad_Zr96 + ad_Xe135' + material_id = 2 + block = 'lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + [] + [core_barrel] + type = CoupledFeedbackNeutronicsMaterial + grid_names = ' Tfuel ' + grid_variables = ' T_solid' + plus = true + isotopes = 'C12' + densities = 'ad_C12' + material_id = 1 + block = 'core_barrel' + [] +[] +# ============================================================================== +# POSTPROCESSORS +# ============================================================================== +[Postprocessors] + [Fuel_max_Temp] + type = ElementExtremeValue + variable = T_salt + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + execute_on = 'INITIAL TIMESTEP_END' + [] + [Fuel_avg_Temp] + type = ElementAverageValue + variable = T_salt + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + execute_on = 'INITIAL TIMESTEP_END' + [] + [Fuel_core_max_Temp] + type = ElementExtremeValue + variable = T_salt + block = 'core' + execute_on = 'INITIAL TIMESTEP_END' + [] + [Fuel_core_avg_Temp] + type = ElementAverageValue + variable = T_salt + block = 'core' + execute_on = 'INITIAL TIMESTEP_END' + [] + [Mod_max_Temp] + type = ElementExtremeValue + variable = T_solid + block = 'core core_barrel' + execute_on = 'INITIAL TIMESTEP_END' + [] + [Mod_avg_Temp] + type = ElementAverageValue + variable = T_solid + block = 'core core_barrel' + execute_on = 'INITIAL TIMESTEP_END' + [] + [nufission_RR] + type = FluxRxnIntegral + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + cross_section = nu_sigma_fission + coupled_flux_groups = ' sflux_g0 sflux_g1 sflux_g2 sflux_g3 sflux_g4 sflux_g5 sflux_g6 sflux_g7 sflux_g8 sflux_g9 sflux_g10 sflux_g11 sflux_g12 sflux_g13 sflux_g14 sflux_g15' + execute_on = 'transfer timestep_end' + [] + [absorption_RR] + type = FluxRxnIntegral + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + cross_section = sigma_absorption + coupled_flux_groups = ' sflux_g0 sflux_g1 sflux_g2 sflux_g3 sflux_g4 sflux_g5 sflux_g6 sflux_g7 sflux_g8 sflux_g9 sflux_g10 sflux_g11 sflux_g12 sflux_g13 sflux_g14 sflux_g15' + execute_on = 'transfer timestep_end' + [] + [fission_RR] + type = FluxRxnIntegral + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + cross_section = sigma_fission + coupled_flux_groups = ' sflux_g0 sflux_g1 sflux_g2 sflux_g3 sflux_g4 sflux_g5 sflux_g6 sflux_g7 sflux_g8 sflux_g9 sflux_g10 sflux_g11 sflux_g12 sflux_g13 sflux_g14 sflux_g15' + execute_on = 'transfer timestep_end' + [] + [ngamma_RR] + type = FluxRxnIntegral + block = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' + cross_section = sigma_ngamma + coupled_flux_groups = ' sflux_g0 sflux_g1 sflux_g2 sflux_g3 sflux_g4 sflux_g5 sflux_g6 sflux_g7 sflux_g8 sflux_g9 sflux_g10 sflux_g11 sflux_g12 sflux_g13 sflux_g14 sflux_g15' + execute_on = 'transfer timestep_end' + [] + [Leakage] + type = PartialSurfaceCurrent + boundary = 'right bottom loop_boundary pump_outlet downcomer_inlet top_core_barrel bypass_line_boundary extraction return_line_boundary' + transport_system = transport + [] +[] + +# ============================================================================== +# EXECUTION PARAMETERS +# ============================================================================== + +[Preconditioning] + [SMP] + type = SMP + full = true + [] +[] + +[Executioner] + type = Eigenvalue + solve_type = PJFNKMO + + petsc_options_iname = '-pc_type -pc_hypre_type -ksp_gmres_restart' + petsc_options_value = 'hypre boomeramg 50' + l_max_its = 5000 + # Avoid over-converging the problem + nl_abs_tol = 1e-7 + + free_power_iterations = 4 # important to obtain fundamental mode eigenvalue +[] + +[Debug] + show_var_residual_norms = false +[] +# ============================================================================== +# OUTPUTS +# ============================================================================== +[Outputs] + #file_base = msre_neutronics_ss + exodus = true + csv = true + [restart] + type = Exodus + overwrite = true + [] + perf_graph = true + execute_on = 'INITIAL FINAL TIMESTEP_END' +[] diff --git a/msr/msre/xe_poisoning/neu_xe_init.e b/msr/msre/xe_poisoning/neu_xe_init.e new file mode 100644 index 000000000..fd072311f --- /dev/null +++ b/msr/msre/xe_poisoning/neu_xe_init.e @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0487853703216be2bd50d82aa632823f44fab665d013df425798269241be71ff +size 1680044 diff --git a/msr/msre/xe_poisoning/plot_xe.py b/msr/msre/xe_poisoning/plot_xe.py new file mode 100644 index 000000000..3a44595b4 --- /dev/null +++ b/msr/msre/xe_poisoning/plot_xe.py @@ -0,0 +1,48 @@ +##This plots the Xe concentration evolution over time +import matplotlib.pyplot as plt +import pandas as pd + +# Set parameters as requested +plt.rcParams['font.family'] = 'DejaVu Sans Mono' +plt.rcParams['font.size'] = 12 + +# Load the CSV files into DataFrames +data_case1 = pd.read_csv('./th_xe_out.csv') +#data_case2 = pd.read_csv('th_xe_out_coupled01.csv') + +# Extract the 1st and 2nd columns from both datasets +x_data_case1 = data_case1.iloc[:, 0] / 3600 # Convert seconds to hours +y_data_case1 = data_case1.iloc[:, 1] # 2nd column for case 1 + +#x_data_case2 = data_case2.iloc[:, 0] / 3600 # Convert seconds to hours +#y_data_case2 = data_case2.iloc[:, 1] # 2nd column for case 2 + +# Plot the data +plt.figure(figsize=(10, 6)) + +# Plot case 1 data +plt.plot(x_data_case1, y_data_case1, linestyle='-', color='#1f77b4', linewidth=2) + +# Plot case 2 data +#plt.plot(x_data_case2, y_data_case2, marker='s', linestyle='--', color='r', label='Xe production scaling, 4.0e-18') + +## Set y-axis to log scale +#plt.yscale('log') + +# Add labels and title +plt.xlabel('Time (hours)') +plt.ylabel('Xe-135 Concentration (#/barn-cm)') +plt.title('Development of Xe-135 concentration') + +# Display the plot +plt.grid(True, linestyle='--', alpha=0.6) + +# Remove top and right spines for a cleaner look +ax = plt.gca() +ax.spines['top'].set_visible(False) +ax.spines['right'].set_visible(False) + +plt.tight_layout() +plt.savefig('xe_feedback.png', dpi=300, bbox_inches='tight') +plt.show() + diff --git a/msr/msre/xe_poisoning/tests b/msr/msre/xe_poisoning/tests new file mode 100644 index 000000000..6d9353cb0 --- /dev/null +++ b/msr/msre/xe_poisoning/tests @@ -0,0 +1,54 @@ +[Tests] + # Syntax checks + [generate_mesh] + type = RunApp + executable_pattern = 'combined*|reactor*' + input = './mesh/strip_mesh.i' + cli_args = '--mesh-only' + working_directory = './mesh' + [] + + [neu_xe_syntax] + type = RunApp + input = 'neu_xe.i' + check_input = True + executable_pattern = 'griffin*' + cli_args = "MultiApps/active='' Transfers/active=''" + [] + + [th_xe_syntax] + type = RunApp + input = 'th_xe.i' + check_input = True + executable_pattern = 'blue_crab*|combined*' + capabilities = 'method=opt' + [] + + # Regression tests with CSV output + [neu_xe_regression] + prereq = neu_xe_syntax + type = CSVDiff + rel_err = 1.0E-4 + input = 'neu_xe.i' + # Ensure this matches the [Outputs] block name in your .i file + csvdiff = 'neu_xe_out.csv' + executable_pattern = 'griffin*' + allow_warnings = true + cli_args = "MultiApps/active='' Transfers/active=''" + capabilities = 'method=opt' + [] + + [th_xe_regression] + prereq = th_xe_syntax + type = CSVDiff + rel_err = 1.0E-4 + input = 'th_xe.i' + # Ensure this matches the [Outputs] block name in your .i file + csvdiff = 'th_xe_out.csv' + executable_pattern = 'blue_crab*|combined*' + allow_warnings = true + capabilities = 'method=opt' + cli_args = 'Executioner/num_steps=1' + min_parallel = 8 + [] +[] diff --git a/msr/msre/xe_poisoning/th_xe.i b/msr/msre/xe_poisoning/th_xe.i new file mode 100644 index 000000000..4ca42ff2c --- /dev/null +++ b/msr/msre/xe_poisoning/th_xe.i @@ -0,0 +1,921 @@ +# ============================================================================== +# Model description +# Molten Salt Reactor Experiment (MSRE) Model - Steady-State Model +# Primary Loop Thermal Hydraulics Model +# Integrates: +# - Porous media model for reactor primary loop +# - Weakly compressible, turbulent flow formulation +# - Delayed neutron precursor transport +# - Xenon and Iodine production-consumption-advection +# MSRE: reference plant design based on 5MW of MSRE Experiment. +# ============================================================================== +# Author(s): +# INL: Dr. Mauricio Tano, Dr. Samuel Walker, Dr. Guillaume Giudicelli +# ANL: Dr. Jun Fang +# ============================================================================== +# ============================================================================== +# MODEL PARAMETERS +# ============================================================================== +# Problem Parameters ----------------------------------------------------------- +# Geometry --------------------------------------------------------------------- +core_radius = 0.69793684 + +# Properties ------------------------------------------------------------------- +core_porosity = 0.222831853 # core porosity salt VF=0.222831853, Graphite VF=0.777168147 +down_comer_porosity = 1.0 # downcomer porosity +lower_plenum_porosity = 0.5 # lower plenum porosity +upper_plenum_porosity = 1.0 # upper plenum porosity +riser_porosity = 1.0 # riser porosity +pump_porosity = 1.0 # pump porosity +elbow_porosity = 1.0 # elbow porosity +bypass_line_porosity = 1.0 # bypass_line porosity +strip_porosity = 1.0 # strip porosity +return_line_porosity = 1.0 # return_line porosity + +cp_steel = 500.0 # (J/(kg.K)) specific heat of steel +rho_steel = 8000.0 # (kg/(m3)) density of steel +k_steel = 15.0 # # (W/(m.k)) density of steel + +# Operational Parameters -------------------------------------------------------- +#p_outlet = 1.01325e+05 # Reactor outlet pressure (Pa) +p_outlet = 1.50653e+05 # Reactor outlet pressure (Pa) +T_inlet = 908.15 # Salt inlet temperature (K). +T_Salt_initial = 923.0 # inital salt temperature (will change in steady-state) + +pump_force = -1.3e6 # pump force functor (set to get a loop circulation time of ~25 seconds) +vol_hx = 1e10 # (W/(m3.K)) volumetric heat exchange coefficient for heat exchanger +# Note: vol_hx need to be tuned to match intermediate HX performance for transients +bulk_hx = 100.0 # (W/(m3.K)) core bulk volumetric heat exchange coefficient (already callibrated) + +# Thermal-Hydraulic diameters ---------------------------------------------------- +D_H_fuel_channel = 0.0191334114 # Hydraulic diameter of bypass +D_H_downcomer = 0.045589414 # Hydraulic diameter of riser +D_H_pipe = '${fparse 5*0.0254}' # Riser Hydraulic Diameter +D_H_plena = '${fparse 2*core_radius}' # Hydraulic diameter of riser + +# Delayed neutron precursors constants ------------------------------------------ +lambda1 = 0.0133104 +lambda2 = 0.0305427 +lambda3 = 0.115179 +lambda4 = 0.301152 +lambda5 = 0.879376 +lambda6 = 2.91303 +beta1 = 8.42817e-05 +beta2 = 0.000684616 +beta3 = 0.000479796 +beta4 = 0.00103883 +beta5 = 0.000549185 +beta6 = 0.000184087 + +Sc_t = 1 # turbulent Schmidt number + +yield_I135 = ${fparse 0.0263071*1.37e-15} +lambda_I135 = ${fparse log(2)/(3600*6.58)} +lambda_I135_g = ${fparse log(2)/(3600*6.58)} + +yield_XE135 = ${fparse 0.00325859*1.37e-15} +lambda_XE135 = ${fparse log(2)/(3600*9.14)} + +# Utils ------------------------------------------------------------------------- +# fluid blocks define fluid vars and solve for them +fluid_blocks = 'core lower_plenum upper_plenum down_comer riser pump elbow bypass_line strip return_line' +solid_blocks = 'core core_barrel' + +# ============================================================================== +# GLOBAL PARAMETERS +# ============================================================================== +[GlobalParams] + porosity = 'porosity' + rhie_chow_user_object = 'pins_rhie_chow_interpolator' + + advected_interp_method = 'upwind' + velocity_interp_method = 'rc' +[] + +# ============================================================================== +# GEOMETRY AND MESH +# ============================================================================== +[Mesh] + coord_type = 'RZ' + [restart] + type = FileMeshGenerator + use_for_exodus_restart = true + file = './neu_xe_init.e' + [] +[] + +[Problem] + kernel_coverage_check = false + allow_initial_conditions_with_restart = true + + # We segregate the solve of the advected species as they do not influence + # the velocity or temperature directly, only through neutronic feedback + # We separate the energy equations solve from pressure and momentum as + # this first order explicit coupling does not change the solution at steady state + nl_sys_names = 'ns energy c1 c2 c3 c4 c5 c6 xe_i' +[] + +# ============================================================================== +# FV VARIABLES +# ============================================================================== +[Variables] + [T_solid] + type = INSFVEnergyVariable + initial_condition = ${T_Salt_initial} + block = ${solid_blocks} + + solver_sys = 'energy' + [] +[] + +# ============================================================================== +# THERMAL-HYDRAULICS PROBLEM SETUP +# ============================================================================== +[FluidProperties] + [fluid_properties_obj] + type = FlibeFluidProperties + [] +[] + +[Physics] + [NavierStokes] + [Flow] + [flow] + block = ${fluid_blocks} + compressibility = 'weakly-compressible' + porous_medium_treatment = true + gravity = '0.0 -9.81 0.0' + + # Variable naming + velocity_variable = 'superficial_vel_x superficial_vel_y' + pressure_variable = 'pressure' + + # ICs + initial_velocity = '1e-8 1e-8' + initial_pressure = ${p_outlet} + + # Numerical schemes + momentum_advection_interpolation = upwind + mass_advection_interpolation = upwind + velocity_interpolation = rc + system_names = 'ns' + + # Porous & Friction treatment + use_friction_correction = true + friction_types = 'darcy forchheimer' + friction_coeffs = 'Darcy_coefficient Forchheimer_coefficient' + consistent_scaling = 1.0 + porosity_smoothing_layers = 2 + + # Fluid properties + density = 'rho' + dynamic_viscosity = 'mu' + + # Boundary Conditions + wall_boundaries = 'left top bottom right loop_boundary bypass_line_boundary extraction return_line_boundary' + momentum_wall_types = 'symmetry slip noslip noslip noslip noslip noslip noslip' + + # Constrain Pressure + pin_pressure = true + pinned_pressure_value = ${p_outlet} + pinned_pressure_point = '0.0 2.13859 0.0' + pinned_pressure_type = point-value-uo + + # Explicit physics coupling (can be auto-detected) + coupled_turbulence_physics = 'turb' + [] + [] + + [FluidHeatTransfer] + [ht] + block = ${fluid_blocks} + + # Variable naming and coupling + fluid_temperature_variable = 'T_fluid' + + # ICs + initial_temperature = ${T_Salt_initial} + + # Numerical schemes + energy_advection_interpolation = upwind + system_names = 'energy' + + # Fluid properties + thermal_conductivity = 'kappa' + specific_heat = 'cp' + + # Energy source-sink + external_heat_source = 'power_density' + + # Boundary Conditions (Inherits wall_boundaries from [flow]) + energy_wall_types = 'heatflux heatflux heatflux heatflux heatflux heatflux heatflux heatflux' + energy_wall_functors = '0 0 0 0 0 0 0 0' + + # Explicit physics coupling (can be auto-detected) + coupled_flow_physics = 'flow' + coupled_turbulence_physics = 'turb' + [] + [] + + [Turbulence] + [turb] + block = ${fluid_blocks} + turbulence_handling = 'mixing-length' + mixing_length_name = 'mixing_length' + Sc_t = '${Sc_t} ${Sc_t} ${Sc_t} ${Sc_t} ${Sc_t} ${Sc_t} ${Sc_t} ${Sc_t}' + system_names = 'ns' + + # TODO: consider if having different mixing length near wall makes + # sense in this coarse mesh TH model + + # Explicit physics coupling (can be auto-detected) + coupled_flow_physics = 'flow' + fluid_heat_transfer_physics = 'ht' + scalar_transport_physics = 'species' + [] + [] + + [ScalarTransport] + [species] + passive_scalar_names = 'c1 c2 c3 c4 c5 c6 I135 Xe135' + block = ${fluid_blocks} + + # Numerical scheme parameters + passive_scalar_advection_interpolation = upwind + system_names = 'c1 c2 c3 c4 c5 c6 xe_i xe_i' + + # Explicit physics coupling (can be auto-detected) + coupled_flow_physics = 'flow' + # coupled_turbulence_physics = 'turb' # TODO: uncomment post typo fix in code + [] + [] + [] +[] + +[FVBCs] + [sym_I135] + type = INSFVSymmetryScalarBC + boundary = 'left' + variable = I135 + [] + [sym_Xe135] + type = INSFVSymmetryScalarBC + boundary = 'left' + variable = Xe135 + [] +[] + +[FVKernels] + # Extra kernels for the thermal-hydraulics solve in the fluid + [pump_x] + type = INSFVPump + momentum_component = x + rhie_chow_user_object = 'pins_rhie_chow_interpolator' + variable = superficial_vel_x + block = 'pump' + pump_volume_force = ${pump_force} + [] + [pump_y] + type = INSFVPump + momentum_component = y + rhie_chow_user_object = 'pins_rhie_chow_interpolator' + variable = superficial_vel_y + block = 'pump' + pump_volume_force = ${pump_force} + [] + [convection_fluid_hx] + type = NSFVEnergyAmbientConvection + variable = T_fluid + T_ambient = ${T_inlet} + alpha = ${vol_hx} + block = 'pump' + [] + + # Kernels for solve in the solid blocks + [heat_time_solid] + type = INSFVEnergyTimeDerivative + variable = T_solid + dh_dt = dh_dt + rho = ${rho_steel} + [] + [heat_diffusion_solid] + type = FVDiffusion + variable = T_solid + coeff = ${k_steel} + [] + [convection_core] + type = PINSFVEnergyAmbientConvection + variable = T_solid + T_fluid = T_fluid + T_solid = T_solid + is_solid = true + h_solid_fluid = ${bulk_hx} + block = 'core' + [] + [convection_core_completmeent] + type = PINSFVEnergyAmbientConvection + variable = T_fluid + T_fluid = T_fluid + T_solid = T_solid + is_solid = false + h_solid_fluid = ${bulk_hx} + block = 'core' + [] + + # Kernels for solve of delayed neutron precursor transport + [c1_src] + type = FVCoupledForce + variable = c1 + v = fission_source + coef = ${beta1} + block = ${fluid_blocks} + [] + [c2_src] + type = FVCoupledForce + variable = c2 + v = fission_source + coef = ${beta2} + block = ${fluid_blocks} + [] + [c3_src] + type = FVCoupledForce + variable = c3 + v = fission_source + coef = ${beta3} + block = ${fluid_blocks} + [] + [c4_src] + type = FVCoupledForce + variable = c4 + v = fission_source + coef = ${beta4} + block = ${fluid_blocks} + [] + [c5_src] + type = FVCoupledForce + variable = c5 + v = fission_source + coef = ${beta5} + block = ${fluid_blocks} + [] + [c6_src] + type = FVCoupledForce + variable = c6 + v = fission_source + coef = ${beta6} + block = ${fluid_blocks} + [] + [c1_decay] + type = FVReaction + variable = c1 + rate = ${lambda1} + block = ${fluid_blocks} + [] + [c2_decay] + type = FVReaction + variable = c2 + rate = ${lambda2} + block = ${fluid_blocks} + [] + [c3_decay] + type = FVReaction + variable = c3 + rate = ${lambda3} + block = ${fluid_blocks} + [] + [c4_decay] + type = FVReaction + variable = c4 + rate = ${lambda4} + block = ${fluid_blocks} + [] + [c5_decay] + type = FVReaction + variable = c5 + rate = ${lambda5} + block = ${fluid_blocks} + [] + [c6_decay] + type = FVReaction + variable = c6 + rate = ${lambda6} + block = ${fluid_blocks} + [] +# Kernels for solve of I and Xe transport + [I135_src] + type = FVCoupledForce + variable = I135 + v = fission_source + coef = ${yield_I135} + block = ${fluid_blocks} + [] + [Xe135_src] + type = FVCoupledForce + variable = Xe135 + v = fission_source + coef = ${yield_XE135} + block = ${fluid_blocks} + [] + # Stripping + [Xe135_strip] + type = NSFVEnergyAmbientConvection + variable = Xe135 + alpha = mass_trans_var + block = strip + T_ambient = 0 + [] + + [I135_decay] + type = FVReaction + variable = I135 + rate = ${lambda_I135} + block = ${fluid_blocks} + [] + [Xe135_decay] + type = FVReaction + variable = Xe135 + rate = ${lambda_XE135} + block = ${fluid_blocks} + [] + [Xe135_grow] + type = FVCoupledForce + variable = Xe135 + v = I135 + coef = ${lambda_I135_g} + block = ${fluid_blocks} + [] +[] + +[FVInterfaceKernels] + # Conjugated heat transfer with core barrel + [convection] + type = FVConvectionCorrelationInterface + variable1 = T_fluid + variable2 = T_solid + boundary = 'core_downcomer_boundary' + h = ${bulk_hx} + T_solid = T_solid + T_fluid = T_fluid + subdomain1 = 'core down_comer lower_plenum upper_plenum' + subdomain2 = 'core_barrel' + wall_cell_is_bulk = true + [] +[] + +# ============================================================================== +# AUXVARIABLES AND AUXKERNELS +# ============================================================================== +[Functions] + [cosine_guess] + type = ParsedFunction + expression = 'max(0, cos(x*pi/2/1.0))*max(0, cos((y-1.0)*pi/2/1.1))' + [] +[] + +[AuxVariables] + [porosity_var] + type = MooseVariableFVReal + block = ${fluid_blocks} + [] + [power_density] + type = MooseVariableFVReal + [FVInitialCondition] + type = FVFunctionIC + function = 'cosine_guess' + scaling_factor = '${fparse 2.9183E+6}' + [] + [] + [fission_source] + type = MooseVariableFVReal + [FVInitialCondition] + type = FVFunctionIC + function = 'cosine_guess' + scaling_factor = '${fparse 1.0E-8}' + [] + [] + [rho_var] + type = MooseVariableFVReal + initial_condition = 1.0 + block = ${fluid_blocks} + [] + [mass_trans_var] + type = MooseVariableFVReal + block = ${fluid_blocks} + [] + [mu_var] + type = MooseVariableFVReal + block = ${fluid_blocks} + [] + [speed_var] + type = MooseVariableFVReal + block = ${fluid_blocks} + [] +[] + +[AuxKernels] + [porosity_var_aux] + type = FunctorAux + variable = porosity_var + functor = 'porosity' + block = ${fluid_blocks} + [] + [rho_var_aux] + type = FunctorAux + variable = 'rho_var' + functor = 'rho' + block = ${fluid_blocks} + [] + [comp_mass_trans] + type = FunctorAux + functor = 'mass_trans_mat' + variable = 'mass_trans_var' + block = ${fluid_blocks} + execute_on = 'timestep_end' + [] + [mu_var_aux] + type = FunctorAux + functor = 'mu' + variable = mu_var + block = ${fluid_blocks} + execute_on = 'timestep_end' + [] + [speed_var_aux] + type = FunctorAux + functor = 'speed' + variable = speed_var + block = ${fluid_blocks} + execute_on = 'timestep_end' + [] +[] + +# ============================================================================== +# MATERIALS +# ============================================================================== +[FunctorMaterials] + + # Setting up material porosities at fluid blocks + [porosity] + type = ADPiecewiseByBlockFunctorMaterial + prop_name = 'porosity' + subdomain_to_prop_value = 'core ${core_porosity} + lower_plenum ${lower_plenum_porosity} + upper_plenum ${upper_plenum_porosity} + down_comer ${down_comer_porosity} + riser ${riser_porosity} + pump ${pump_porosity} + elbow ${elbow_porosity} + bypass_line ${bypass_line_porosity} + strip ${strip_porosity} + return_line ${return_line_porosity}' + [] + + # Setting up hydraulic diameters at fluid blocks + [hydraulic_diameter] + type = PiecewiseByBlockFunctorMaterial + prop_name = 'characteristic_length' + subdomain_to_prop_value = 'core ${D_H_fuel_channel} + lower_plenum ${D_H_plena} + upper_plenum ${D_H_plena} + down_comer ${D_H_downcomer} + riser ${D_H_pipe} + pump ${D_H_pipe} + elbow ${D_H_pipe} + bypass_line ${D_H_pipe} + strip ${D_H_pipe} + return_line ${D_H_pipe}' + block = ${fluid_blocks} + [] + + # Setting up fluid properties at blocks material blocks + [fluid_props_to_mat_props] + type = GeneralFunctorFluidProps + fp = fluid_properties_obj # Add this explicitly here + pressure = 'pressure' + T_fluid = 'T_fluid' + speed = 'speed' + characteristic_length = characteristic_length + block = ${fluid_blocks} + [] + + # Setting up heat conduction materials at blocks + [dh_dt_mat] + type = INSFVEnthalpyFunctorMaterial + rho = ${rho_steel} + temperature = T_solid + cp = ${cp_steel} + block = 'core_barrel' + [] + + [effective_fluid_thermal_conductivity] + type = ADGenericVectorFunctorMaterial + prop_names = 'kappa' + prop_values = 'k k k' + block = ${fluid_blocks} + [] + + ## Drag correlations per block + [isotropic_drag_core] + type = FunctorChurchillDragCoefficients + multipliers = '100000 100 100000' + block = 'core' + [] + [drag_lower_plenum] + type = FunctorChurchillDragCoefficients + multipliers = '10 1 10' + block = 'upper_plenum' + [] + [drag_upper_plenum] + type = FunctorChurchillDragCoefficients + multipliers = '1 1 1' + block = 'lower_plenum' + [] + [drag_downcomer] + type = FunctorChurchillDragCoefficients + multipliers = '1 1 1' + block = 'down_comer' + [] + [drag_piping] + type = FunctorChurchillDragCoefficients + multipliers = '0 0 0' + block = 'riser pump elbow bypass_line strip return_line' + [] + + ## Materials for computing corrected DNP advection + [c1_mat] + type = ADParsedFunctorMaterial + expression = 'c1 / porosity' + functor_names = 'c1 porosity' + functor_symbols = 'c1 porosity' + property_name = 'c1_porous' + [] + [c2_mat] + type = ADParsedFunctorMaterial + expression = 'c2 / porosity' + functor_names = 'c2 porosity' + functor_symbols = 'c2 porosity' + property_name = 'c2_porous' + [] + [c3_mat] + type = ADParsedFunctorMaterial + expression = 'c3 / porosity' + functor_names = 'c3 porosity' + functor_symbols = 'c3 porosity' + property_name = 'c3_porous' + [] + [c4_mat] + type = ADParsedFunctorMaterial + expression = 'c4 / porosity' + functor_names = 'c4 porosity' + functor_symbols = 'c4 porosity' + property_name = 'c4_porous' + [] + [c5_mat] + type = ADParsedFunctorMaterial + expression = 'c5 / porosity' + functor_names = 'c5 porosity' + functor_symbols = 'c5 porosity' + property_name = 'c5_porous' + [] + [c6_mat] + type = ADParsedFunctorMaterial + expression = 'c6 / porosity' + functor_names = 'c6 porosity' + functor_symbols = 'c6 porosity' + property_name = 'c6_porous' + [] + + [I135_mat] + type = ADParsedFunctorMaterial + expression = 'I135 / porosity_var' + functor_names = 'I135 porosity_var' + functor_symbols = 'I135 porosity_var' + property_name = 'I135_porous' + [] + [Xe135_mat] + type = ADParsedFunctorMaterial + expression = 'Xe135 / porosity_var' + functor_names = 'Xe135 porosity_var' + functor_symbols = 'Xe135 porosity_var' + property_name = 'Xe135_porous' + [] + [coupled_Xe135_mass_trans] + type = ADParsedFunctorMaterial + property_name = coupled_Xe135_mass_trans + functor_names = 'Xe135 mass_trans_mat' + expression = 'Xe135*mass_trans_mat' + [] + [mass_trans_mat] + type = ADParsedFunctorMaterial + property_name = mass_trans_mat + functor_names = 'rho mu speed' + expression = '0.023*1e-6/0.01*((rho*0.01*speed)/mu)^(0.8)*(mu/(rho*1e-6))^(0.4)' + [] +[] + +# ============================================================================== +# POSTPROCESSORS +# ============================================================================== +[Postprocessors] + [Xe_avg] + type = ElementAverageValue + variable = Xe135 + block = 'core' + [] + + [outlet_p] + type = SideAverageValue + variable = pressure + boundary = 'pump_outlet' + [] + [outlet_T] + type = SideAverageValue + variable = 'T_fluid' + boundary = 'pump_outlet' + [] + [inlet_p] + type = SideAverageValue + variable = 'pressure' + boundary = 'downcomer_inlet' + [] + [inlet_T] + type = SideAverageValue + variable = 'T_fluid' + boundary = 'downcomer_inlet' + [] + [vfr_downcomer] + type = VolumetricFlowRate + vel_x = superficial_vel_x + vel_y = superficial_vel_y + advected_quantity = 1.0 + boundary = 'downcomer_inlet' + [] + [area_pp_downcomer_inlet] + type = AreaPostprocessor + boundary = 'downcomer_inlet' + execute_on = 'INITIAL' + [] + [vfr_pump] + type = VolumetricFlowRate + vel_x = superficial_vel_x + vel_y = superficial_vel_y + advected_quantity = 1.0 + boundary = 'pump_outlet' + [] + [vfr_return_line] + type = VolumetricFlowRate + vel_x = superficial_vel_x + vel_y = superficial_vel_y + advected_quantity = 1.0 + boundary = 'return_line_sideset' + [] + [return_line_fraction] + type = ParsedPostprocessor + expression = '- vfr_return_line / vfr_pump' + pp_names = 'vfr_return_line vfr_pump' + [] +[] + +# ============================================================================== +# EXECUTION PARAMETERS +# ============================================================================== +[Debug] + show_var_residual_norms = true +[] + +[Executioner] + type = Transient + solve_type = NEWTON + petsc_options_iname = '-pc_type -sub_pc_factor_shift_type -pc_factor_mat_solver_package' + petsc_options_value = ' lu NONZERO superlu_dist' + automatic_scaling = true + + # TODO: create custom convergence objects for each system to have an optimal behavior + nl_abs_tol = 1e-6 + nl_max_its = 100 + # force a solve to see the updated value on every step + nl_forced_its = 1 + + [TimeStepper] + type = IterationAdaptiveDT + dt = 0.1 + optimal_iterations = 20 + iteration_window = 2 + growth_factor = 2 + cutback_factor = 0.5 + [] + + dtmin = 0.01 + dtmax = 1e4 + end_time = 4e5 + #steady_state_detection = true +[] + +[Outputs] + csv = true + exodus = true + [restart] + type = Exodus + overwrite = true + [] + print_linear_converged_reason = false + print_linear_residuals = false + print_nonlinear_converged_reason = false +[] + +# ============================================================================== +# MULTIAPPS AND TRANSFERS +# ============================================================================== +[MultiApps] + [griffin] + type = FullSolveMultiApp + app_type = GriffinApp + input_files = 'neu_xe.i' + execute_on = 'timestep_end' + + # Restarting from the previous step is closer to the solution + keep_solution_during_restore = true + update_old_solution_when_keeping_solution_during_restore = true + [] +[] + +[Transfers] + [power_density] + type = MultiAppGeneralFieldShapeEvaluationTransfer + from_multi_app = griffin + source_variable = power_density + variable = power_density + execute_on = 'timestep_end' + [] + [fission_source] + type = MultiAppGeneralFieldShapeEvaluationTransfer + from_multi_app = griffin + source_variable = fission_source + variable = fission_source + execute_on = 'timestep_end' + [] + [c1] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'c1' + variable = 'c1' + execute_on = 'timestep_end' + [] + [c2] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'c2' + variable = 'c2' + execute_on = 'timestep_end' + [] + [c3] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'c3' + variable = 'c3' + execute_on = 'timestep_end' + [] + [c4] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'c4' + variable = 'c4' + execute_on = 'timestep_end' + [] + [c5] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'c5' + variable = 'c5' + execute_on = 'timestep_end' + [] + [c6] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'c6' + variable = 'c6' + execute_on = 'timestep_end' + [] + [update_ad_Xe135] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'Xe135' + variable = 'ad_Xe135' + execute_on = 'timestep_end' + [] + [T_salt] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'T_fluid' + variable = 'T_salt' + execute_on = 'timestep_end' + [] + [T_graph] + type = MultiAppGeneralFieldShapeEvaluationTransfer + to_multi_app = griffin + source_variable = 'T_solid' + variable = 'T_solid' + execute_on = 'timestep_end' + [] +[] + +