From 22bacf2c134f70b6fd1edd0197820c7c2a5612aa Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:02:34 -0500 Subject: [PATCH 01/23] Add Mirror reference model for SQLite ACCERT --- docs/source/examples/index.rst | 3 +- docs/source/examples/mirror.rst | 27 + docs/source/reference/table.rst | 13 +- docs/source/reference/table/Mirrortables.rst | 28 + docs/source/user/input_structure.rst | 2 +- docs/source/user/output_structure.rst | 2 +- src/Algorithm/MirrorFunc.py | 1557 ++++++++++++++++ src/Algorithm/MirrorFunc_splitInputs.py | 1557 ++++++++++++++++ src/Algorithm/__init__.py | 1 + src/Main.py | 8 + src/accertdb.sqlite | Bin 1044480 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 343 ++++ src/etc/accert.sch | 38 +- src/scripts/build_mirror_accert_tables.py | 139 ++ test/test_mirror_model.py | 60 + test/test_sqlite.py | 38 + tutorial/accert/Mirror.son | 9 + tutorial/accert/ref_tables/MirrorFunc.py | 1557 ++++++++++++++++ .../ref_tables/MirrorFunc_splitInputs.py | 1557 ++++++++++++++++ .../accert/ref_tables/mirror_accertdb.sql | 1568 +++++++++++++++++ tutorial/accert/ref_tables/mirror_account.csv | 92 + .../accert/ref_tables/mirror_algorithm.csv | 81 + .../accert/ref_tables/mirror_variable.csv | 136 ++ 23 files changed, 8791 insertions(+), 25 deletions(-) create mode 100644 docs/source/examples/mirror.rst create mode 100644 docs/source/reference/table/Mirrortables.rst create mode 100644 src/Algorithm/MirrorFunc.py create mode 100644 src/Algorithm/MirrorFunc_splitInputs.py create mode 100644 src/scripts/build_mirror_accert_tables.py create mode 100644 test/test_mirror_model.py create mode 100644 tutorial/accert/Mirror.son create mode 100644 tutorial/accert/ref_tables/MirrorFunc.py create mode 100644 tutorial/accert/ref_tables/MirrorFunc_splitInputs.py create mode 100644 tutorial/accert/ref_tables/mirror_accertdb.sql create mode 100644 tutorial/accert/ref_tables/mirror_account.csv create mode 100644 tutorial/accert/ref_tables/mirror_algorithm.csv create mode 100644 tutorial/accert/ref_tables/mirror_variable.csv diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst index 4302601..de040e9 100644 --- a/docs/source/examples/index.rst +++ b/docs/source/examples/index.rst @@ -3,7 +3,7 @@ Example ====================== -This document provides a comprehensive explanation of the ACCERT running examples, including the **PWR12-BE**, **ABR1000**, **AP1000**, and **Fusion** reactor models. It integrates key ACCERT concepts to elucidate how the input files are structured and why they are designed in a particular manner. +This document provides a comprehensive explanation of the ACCERT running examples, including the **PWR12-BE**, **ABR1000**, **AP1000**, **Fusion**, and **Mirror** reactor models. It integrates key ACCERT concepts to elucidate how the input files are structured and why they are designed in a particular manner. @@ -16,3 +16,4 @@ This document provides a comprehensive explanation of the ACCERT running example ap1000 fusion stellarator + mirror diff --git a/docs/source/examples/mirror.rst b/docs/source/examples/mirror.rst new file mode 100644 index 0000000..2609fed --- /dev/null +++ b/docs/source/examples/mirror.rst @@ -0,0 +1,27 @@ +Mirror Example +============== + +The Mirror example demonstrates the magnetic-mirror fusion reference model +ported from upstream ACCERT PR #50. The input file is located at +``ACCERT/tutorial/accert/Mirror.son``. + +Example input +------------- + +.. literalinclude:: ../../../tutorial/accert/Mirror.son + :language: none + +The example selects ``ref_model = "mirror"`` and updates the ``r_magnet`` +variable. The current Mirror reference data is account-table based and does +not include a cost-element table. + +Running the example +------------------- + +From ``tutorial/accert``: + +.. code-block:: shell + + python ../../src/Main.py -i Mirror.son + +ACCERT writes the updated account output using the ``mirror`` model prefix. diff --git a/docs/source/reference/table.rst b/docs/source/reference/table.rst index c94eb4a..da56b56 100644 --- a/docs/source/reference/table.rst +++ b/docs/source/reference/table.rst @@ -8,10 +8,12 @@ This section contains reference tables used in ACCERT. ACCERT reference tables use different base-dollar years by model. PWR12-BE, ABR1000, and LFR reference costs are in 2017 dollars; AP1000, Heatpipe, and LPSR reference costs are in 2018 dollars; Fusion and Stellarator reference - costs are in 2015 dollars. Runtime account-result tables are displayed in - the configured target dollar year using CPI-U escalation. Output account and - cost-element CSV files retain their reference-year cost columns; ACCERT - writes target-year OCC summary values in the separate ``*_post_*.csv`` file. + costs are in 2015 dollars. The Mirror reference tables are imported from the + upstream PR #50 account-level data. Runtime account-result tables are + displayed in the configured target dollar year using CPI-U escalation. + Output account and cost-element CSV files retain their reference-year cost + columns; ACCERT writes target-year OCC summary values in the separate + ``*_post_*.csv`` file. Reference-model context: @@ -31,6 +33,8 @@ Reference-model context: UKAEA's `PROCESS `_. * Stellarator is also based on UKAEA's `PROCESS `_. +* Mirror represents the magnetic-mirror fusion model imported from upstream + ACCERT PR #50. .. toctree:: @@ -39,4 +43,5 @@ Reference-model context: table/ABR1000tables table/Fusiontables table/Heatpipetables + table/Mirrortables table/PWR12tables diff --git a/docs/source/reference/table/Mirrortables.rst b/docs/source/reference/table/Mirrortables.rst new file mode 100644 index 0000000..681cf73 --- /dev/null +++ b/docs/source/reference/table/Mirrortables.rst @@ -0,0 +1,28 @@ +Mirror Tables +============= + +The Mirror model is a magnetic-mirror fusion cost model ported from upstream +ACCERT PR #50. Its reference data currently contains account, variable, and +algorithm tables. Unlike PWR12-BE, AP1000, LPSR, and ABR1000, the Mirror model +does not use a separate cost-element table. + +Mirror Account Table +-------------------- + +.. csv-table:: Mirror Account Table + :file: ../../../../tutorial/accert/ref_tables/mirror_account.csv + :header-rows: 1 + +Mirror Algorithm Table +---------------------- + +.. csv-table:: Mirror Algorithm Table + :file: ../../../../tutorial/accert/ref_tables/mirror_algorithm.csv + :header-rows: 1 + +Mirror Variable Table +--------------------- + +.. csv-table:: Mirror Variable Table + :file: ../../../../tutorial/accert/ref_tables/mirror_variable.csv + :header-rows: 1 diff --git a/docs/source/user/input_structure.rst b/docs/source/user/input_structure.rst index 5cce818..b4f970a 100644 --- a/docs/source/user/input_structure.rst +++ b/docs/source/user/input_structure.rst @@ -79,7 +79,7 @@ ref_model **Notes**: -- `` is a string indicating the reactor model, e.g., `PWR12-BE`, `ABR1000`, `LFR`. +- `` is a string indicating the reactor model, e.g., `PWR12-BE`, `ABR1000`, `AP1000`, `LPSR`, `LFR`, `heatpipe`, `fusion`, `stellarator`, or `mirror`. target_dollar_year ~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/user/output_structure.rst b/docs/source/user/output_structure.rst index 2e01d50..39436e5 100644 --- a/docs/source/user/output_structure.rst +++ b/docs/source/user/output_structure.rst @@ -8,7 +8,7 @@ Reading User Input This section summarizes the parameters entered by the user. These inputs guide the recalculations of specific cost elements. Key parameters typically include: -- **Reference Model**: The reactor model being analyzed. Current options are "PWR12-BE", "ABR1000", "LFR", "Heatpipe", and "Fusion". +- **Reference Model**: The reactor model being analyzed. Current options include "PWR12-BE", "ABR1000", "AP1000", "LPSR", "LFR", "Heatpipe", "Fusion", "Stellarator", and "Mirror". - **Thermal Power (MWth)**: The thermal power input provided by the user. - **Electric Power (MWe)**: The electric power input provided by the user. diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py new file mode 100644 index 0000000..e438257 --- /dev/null +++ b/src/Algorithm/MirrorFunc.py @@ -0,0 +1,1557 @@ +import numpy as np +import pandas as pd +import scipy +import json +import math +import pkg_resources +from .Algorithm import Algorithm + +### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples +class MirrorFunc(Algorithm): + + # Physical constants + E_DT = 17.59e6 * 1.60218*10**-19 # J + E_alpha = 3.52e6 * 1.60218*10**-19 # J + E_n = E_DT - E_alpha # J + m_T = 3.01604928 * 1.66053907*10**-27 # kg, triton mass + m_D = 2.01410177811 * 1.66053907*10**-27 # kg, deuteron mass + m_6Li = 6.0151228874 * 1.66053907*10**-27 # kg, lithium-6 mass + + # Conversion factors + Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU + + def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): + super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) + + def run(self, inputs: dict) -> float: + """ + Executes the algorithm specified by the name in the instance variables. + + Parameters: + inputs (dict): Dictionary of input variables required for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + # run the algorithm use self.name not self.alg_name + return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) + + def _run_algorithm(self, alg_name: str, variables: list) -> float: + """ + Runs the specified algorithm with given variables. + + Parameters: + alg_name (str): The name of the algorithm to run. + variables (list): List of input variables for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + try: + algorithm = getattr(self, alg_name) + return algorithm(*variables) + except AttributeError: + raise ValueError(f"Algorithm {alg_name} not found") + + ### Account Methods: ### + @staticmethod + def Account_C20(inputs): + return( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs) + + MirrorFunc.Account_C29(inputs) + ) + + @staticmethod + def Account_C21(inputs): + return( + MirrorFunc.Account_C21_1(inputs) + + MirrorFunc.Account_C21_2(inputs) + + MirrorFunc.Account_C21_3(inputs) + + MirrorFunc.Account_C21_4(inputs) + + MirrorFunc.Account_C21_5(inputs) + + MirrorFunc.Account_C21_6(inputs) + + MirrorFunc.Account_C21_7(inputs) + + MirrorFunc.Account_C21_8(inputs) + + MirrorFunc.Account_C21_9(inputs) + + MirrorFunc.Account_C21_10(inputs) + + MirrorFunc.Account_C21_11(inputs) + + MirrorFunc.Account_C21_12(inputs) + + MirrorFunc.Account_C21_13(inputs) + + MirrorFunc.Account_C21_14(inputs) + + MirrorFunc.Account_C21_15(inputs) + + MirrorFunc.Account_C21_16(inputs) + + MirrorFunc.Account_C21_17(inputs) + ) + + @staticmethod + def Account_C21_1(inputs): + # Site Preparation/Yard Work + return(inputs['Gross Electric Power'] * 268/1e3) + + @staticmethod + def Account_C21_2(inputs): + # Heat Island Building + return(inputs['Gross Electric Power'] * 186.8/1e3) + + @staticmethod + def Account_C21_3(inputs): + # Turbine Generator Building + if inputs['Application'].lower()=='electricity': + return(inputs['Gross Electric Power'] * 54.0/1e3) + else: + return(0) + + @staticmethod + def Account_C21_4(inputs): + # Heat Exchanger Building + return(37.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, + def Account_C21_5(inputs): + # Power Supply and Energy Storage + return(10.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, + def Account_C21_6(inputs): + # Reactor Auxiliaries + return(5.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, + def Account_C21_7(inputs): + # Hot Cell + return(93.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, + def Account_C21_8(inputs): + # Reactor Services + return(18.7/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, + def Account_C21_9(inputs): + # Service Water + return(0.3/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, + def Account_C21_10(inputs): + # Fuel Storage + return(1.1/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_11(inputs): + # Control Room + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, + def Account_C21_12(inputs): + # Onsite AC Power + return(0.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, + def Account_C21_13(inputs): + # Administration + return(4.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, + def Account_C21_14(inputs): + # Site Services + return(1.6/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, + def Account_C21_15(inputs): + # Cyrogenics + return(2.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_16(inputs): + # Security + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, + def Account_C21_17(inputs): + # Ventilation Stack + return(27.0/1e3 * inputs['Gross Electric Power']) + + + @staticmethod + def Account_C22(inputs): + # Rollup + return( + MirrorFunc.Account_C22_1(inputs) + + MirrorFunc.Account_C22_2(inputs) + + MirrorFunc.Account_C22_3(inputs) + + MirrorFunc.Account_C22_4(inputs) + + MirrorFunc.Account_C22_5(inputs) + + MirrorFunc.Account_C22_6(inputs) + + MirrorFunc.Account_C22_7(inputs) + ) + + + @staticmethod + def Account_C22_1(inputs): + # This is a special case and is NOT calculated using Woodruff's model, + # However, I maintained the naming convention for convenience + # Rollup + return( + MirrorFunc.Account_C22_1_1(inputs) + + MirrorFunc.Account_C22_1_2(inputs) + + MirrorFunc.Account_C22_1_3(inputs) + + MirrorFunc.Account_C22_1_4(inputs) + + MirrorFunc.Account_C22_1_5(inputs) + + MirrorFunc.Account_C22_1_6(inputs) + + MirrorFunc.Account_C22_1_7(inputs) + + MirrorFunc.Account_C22_1_8(inputs) + + MirrorFunc.Account_C22_1_9(inputs) + + MirrorFunc.Account_C22_1_11(inputs) + ) + + @staticmethod + def Account_C22_1_1(inputs): + # First Wall and Blanket (and vacuum vessel) + + L_magnet_to_magnet = inputs['End Plug Length'] + + L_cylinder = L_magnet_to_magnet + + expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) + + end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) + end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() + + central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) + central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() + + total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result + + return(total_cost/1e6) + + @staticmethod + def Account_C22_1_2(inputs): + # Magnet Radiation Shield + # Factor of two for each end plug + return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) + + @staticmethod + def Account_C22_1_3(inputs): + # Coils + # Rollup + return( + MirrorFunc.Account_C22_1_3_1(inputs) + + MirrorFunc.Account_C22_1_3_2(inputs) + + MirrorFunc.Account_C22_1_3_3(inputs) + ) + + # @staticmethod + def Account_C22_1_3_1(inputs): + # HF Coils - Quantity 4 + # 2 per end cell + # 2 end cells per tandem + return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_2(inputs): + # LF Coils - Quantity 8 + # 4 per end cell + # 2 end cells per tandem + return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_3(inputs): + # CF Coils + # One coil every L_CF m of Central Cell + return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_4(inputs): + # Supplemenatry Heating + # Rollup + return( + MirrorFunc.Account_C22_1_4_1(inputs) + + MirrorFunc.Account_C22_1_4_2(inputs) + + MirrorFunc.Account_C22_1_4_3(inputs) + ) + + @staticmethod + def Account_C22_1_4_1(inputs): + # NBI + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(7.0642 * inputs['NBI Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_2(inputs): + # ICRH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(4.149 * inputs['ICRH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_3(inputs): + # ECH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(8.0 * inputs['ECH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_5(inputs): + # Primary Structure and Support + return(0) + + @staticmethod + def Account_C22_1_6(inputs): + # Vacuum Systems + # Rollup + return( + # Account_C22_1_6_1(inputs) + + MirrorFunc.Account_C22_1_6_2(inputs) + + MirrorFunc.Account_C22_1_6_3(inputs) + + MirrorFunc.Account_C22_1_6_4(inputs) + ) + + + # def Account_C22_1_6_1(inputs): + # Vacuum Vessel + # Tracked in radial builds and folded into blanket + # return(0) + + + @staticmethod + def Account_C22_1_6_2(inputs): + # Helium Liquefier-Refrigerators (not for magnets) + # Presumably for a full vessel cryostat? + return(0) + + @staticmethod + def Account_C22_1_6_3(inputs): + + #VACUUM PUMPING 22.1.6.3 + #assume 1 second vac rate + #cost of 1 vacuum pump, scaled from 1985 dollars + cost_pump = 40000 + #48 pumps needed for 200^3 system + vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump + no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second + return(no_vpumps*cost_pump/1e6) + + + @staticmethod + def Account_C22_1_6_4(inputs): + # Roughing Pump + return(120000*2.85/1e6) + + @staticmethod + def Account_C22_1_7(inputs): + # Power Supplies + + # Not using Woodruff 2024 as that is based on ITER fusion power + # Heating and magnets are tracked elsewhere + + # #Scaled relative to ITER for a 500MW fusion power syste + # lcredit = 0.5# learning credit. + # C220107 = 269.6 * PNRL/500*lcredit #cost in kIUA + # C220107 = C220107*2 #assuming 1kIUA equals $2 M + + return(0) + + @staticmethod + def Account_C22_1_8(inputs): + # Divertor + return(0) + + @staticmethod + def Account_C22_1_9(inputs): + # Direct Energy Convertor + # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) + + @staticmethod + def Account_C22_1_11(inputs): + # Assembly and Installation Costs + + #Cost Category 22.1.11 Installation costs + axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_ir = axis_t + + # Define labor rate + lr = 1600 / 1e6 # 1600 dollars per day for skilled labor + + # Calculations + constructionworker = 20 * axis_ir / 4 + C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) + C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_8_in = 0 # guns or divertor + C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_10_in = 0 # ECRH + + # Total cost calculations + C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220111 * cost_factor) + + @staticmethod + def Account_C22_2(inputs): + # Main and Secondary Coolant + return( + MirrorFunc.Account_C22_2_1(inputs) + + MirrorFunc.Account_C22_2_2(inputs) + + MirrorFunc.Account_C22_2_3(inputs) + ) + + @staticmethod + def Account_C22_2_1(inputs): + # Primary Coolant + return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) + + @staticmethod + def Account_C22_2_2(inputs): + # Secondary Coolant + return(40.6 * (inputs['Thermal Power']/3500)**0.55) + + @staticmethod + def Account_C22_2_3(inputs): + # Tertiary Coolant + return(0) + + @staticmethod + def Account_C22_3(inputs): + # Auxiliary Cooling Systems + return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_4(inputs): + # Radioactive Waste Treatment + return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_5(inputs): + # Cost Category 22.5 Fuel Handling and Storage + + inflation = 1.43 + C2205010ITER = 20.465 * inflation + C2205020ITER = 7 * inflation + C2205030ITER = 22.511 * inflation + C2205040ITER = 9.76 * inflation + C2205050ITER = 22.826 * inflation + C2205060ITER = 47.542 * inflation + # C22050ITER = C2205010ITER + C2205020ITER + C2205030ITER + C2205040ITER + C2205050ITER + C2205060ITER #ITER inflation cost + + + lcredit = 0.8 # learning curve + ltoak = 10**(np.log10(lcredit) / np.log10(2)) + + + C220501 = C2205010ITER * ltoak + C220502 = C2205020ITER * ltoak + C220503 = C2205030ITER * ltoak + C220504 = C2205040ITER * ltoak + C220505 = C2205050ITER * ltoak + C220506 = C2205060ITER * ltoak + C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220500 * cost_factor) + + @staticmethod + def Account_C22_6(inputs): + # Cost Category 22.6 Other Reactor Plant Equipment + return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) + + @staticmethod + def Account_C22_7(inputs): + # Cost Category 22.7 Instrumentation and Control + return(85) + + @staticmethod + def Account_C23(inputs): + # Turbine Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) + + @staticmethod + def Account_C24(inputs): + # Electric Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) + + @staticmethod + def Account_C25(inputs): + # Miscellaneous Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) + + @staticmethod + def Account_C26(inputs): + # Heat Rejection + return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) + + @staticmethod + def Account_C27(inputs): + # Special Materials + # Total elsewhere, implement later + return(0) + + @staticmethod + def Account_C28(inputs): + # Digital Twin + return(5) + + @staticmethod + def Account_C29(inputs): + # Contingency on Direct Capital Costs + + # I may have to change the way that I do sums as this must be done separately? + # C21 = sum(C21.1 + C21.2 + ...) + + # Rollup + + if not(inputs['NOAK']) and inputs['Contingency']: + return(0.1 * ( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs))) + else: + return(0) + + + ### Other Methods: ### + @staticmethod + def PbLi_density(f_6Li=0.075, T=300): + """ + Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has + roughly 83% Pb and 17% Li. + + Parameters + ---------- + f_6Li : float, optional + Fraction of 6Li to all Li, aka enrichment. The default is 0.075. + T : float, optional + Temperature. Units are °C. The default is 300. + + Returns + ------- + Density of PbLi at selected parameters. + + """ + + f_6Li_natural = 0.075 + rho_6Li = 0.460e3 # kg/m^3 + rho_7Li = 0.537e3 # kg/m^3 + + T_K = T + 273.15 # K + + # Use equation for density as function of temperature from below, Table 1 + # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) + # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF + rho_PbLi = 10520.35 - 1.19051 * T_K + + + # Correct calculated density for enrichment + rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) + + return(rho_PbLi) + + @staticmethod + def Li_price(f_6Li=0.075): + """ + Return Li price (USD/kg) for enrichment levels above 90% 6Li + + Parameters + ---------- + f_6Li : TYPE, optional + DESCRIPTION. The default is 0.075. + + Returns + ------- + None. + + """ + + # https://www.dailymetalprice.com/lithium.html + # From 2024-04-01 + P_6Li075 = 15.152 # USD/kg + + if f_6Li == 0.075: + return(P_6Li075) + + elif f_6Li >= 0.90: + # From Woodruff for 90% 6Li + P_6Li90 = 70 # USD/kg + + # El-Guebaly 2011 (AIRES-AT UK Study) + # P_6Li90 = 2400.0 #USD/kg + + + f = [0.90, 0.99, 0.999, 0.9999, 0.99999] + Cf = [1, 2, 4, 8, 16] + + f_interp = scipy.interpolate.interp1d(f, Cf) + return(f_interp(f_6Li) * P_6Li90) + + else: + print('Lithium pricing at this enrichment level not supported') + return() + + @staticmethod + def PbLi_price(f_6Li, P_Pb): + + # Assuming eutectic fractions + f_Li = 0.17 + f_Pb = 1 - f_Li + + P_Li = MirrorFunc.Li_price(f_6Li) + + P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg + + return(P_PbLi) + @staticmethod + def V_cylindrical_shell(r_in, r_out, L): + """ + Return volume of a cylindrical shell + + Parameters + ---------- + r_in : float, inner radius + r_out : float, outer radius + L : float, length + + Returns + ------- + Volume (float). + + """ + return(np.pi * L * (r_out**2 - r_in**2)) + + @staticmethod + def V_inverse_triangular_washer(z, r_in, r_out): + """ + Return volume of cylindrical inverse triangular washer. + From the ASCII art below you can see how this is used for magnet shielding. + + ^ z + | + | z + |\ | /| + | \ | / | + | \ | / | + | \ | / | + | \ | / | + | \ | / | + ------------------------------------> r + r_in r_out + + Parameters + ---------- + z : float, z extent of triangle + r_in : float, inner radius of triangle + r_out : float, outer radius of triangle + + Returns + ------- + Volume (float). + + """ + + + # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b + + return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) + @staticmethod + def generate_inputs( + + application='heat', + + P_f=1, P_f_L=1, P_f_EP=1, + P_NBI=1, P_ECH=1, P_ICRH=1, + M_n=1.1, + + N_module=1, + + f_pump=0.03, f_sub=0.04, f_cryo=0.01, + + # Obsolete but kept for backwards compatibility + P_pump=1, P_sub_cont=1, P_cryo=1, + P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, + + eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, + eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, + + verbose=False, exact=False, + NOAK=False, n_unit=False, + construction_time=6, + lifetime=30, replacement=10, availability=0.90, + discount=0.0245, + LSA=2, + cost_file='woodruff-data.csv', method='new', + include_decommissioning=False, include_tax=False, + include_licensing=False, include_contingency=False, + + hf_magnet_length=1, + hf_magnet_shielding_thickness=1, + + a_EC=1, + expander_cell_vessel_thickness=0.01, + expander_cell_vessel_material='SS316', + + vacuum_gap_CC=0.01, + first_wall_material='W', + first_wall_thickness=0.01, + vacuum_vessel_material='SS316', + vacuum_vessel_thickness=0.01, + multiplier_material='Pb', + multiplier_thickness=0.01, + blanket_coolant_material='Natural PbLi', + blanket_thickness=1.00, + blanket_coolant_fraction=0.90, + blanket_structural_material='SS316', + blanket_structural_fraction=0.10, + outer_vessel_thickness=0.01, + + L_EP=1, + L_EC=1, + a_CC=1, + a_EP=1, + + save=True, + load=False, + filename=None, + run_name=None + + ): + + """ + Return a dict containing all inputs for a techno-economic analysis. + + Parameters + ---------- + application : str, optional + The application, either 'electricity' or 'heat'. + This changes the power balance and some reporting. The default + is 'heat'. + P_f : float + The total fusion power in MW. The length of the central cell + is scaled to achieve this value. This is not the net electrical power! + P_f_L : float + The central cell linear fusion power in MW/m. + P_f_EP : float + The fusion power in each of two end plugs in MW. + P_NBI : float + The applied NBI power in MW. + P_ECH : float + The applied ECH power in MW. + P_ICRH : float + The applied ICRH power in MW. + M_n : float + The neutron power multiplication factor from the blanket. + The default is 1.1. + N_module : int + The number of modules (fusion machines) per facility. + This is deprecated. The default is 1. + f_pump : float + The pumping power fraction (of M_n * P_fusion). The default is 0.03. + f_sub : float + The subsystem power fraction (of fusion power). The default is 0.04. + f_cryo : float + The cryogenic power fraction (of fusion power). The default is 0.01. + P_pump : float + The pumping power in MW. This is deprecated. + P_sub_cont : float + The subsystem and control power in MW. This is deprecated. + P_cryo: float + The cryo power in MW. The default is 0.5 MW. This is deprecated. + P_pfcool : float + The PF cooling power in MW. The default is 0. This is deprecated. + P_thcool : float + The thermal cooling power in MW. The default is 0. This is deprecated. + P_coils : float + The magnetic coil power in MW. The default is 0. + P_aux : float + The auxiliary power in MW. The default is 9.4. + + eta_th : float + The thermal conversion efficiency. + eta_DEC : float + The DEC conversion efficiency. The default is 0.90. + eta_pump : float + The pumping efficiency. The default is 0.98. + eta_NBI : float + The NBI electrical efficiency. + eta_ECH : float + The ECH electrical efficiency. + eta_ICRH : float + The ICRH electrical efficiency. + + LSA : int + The level of safey assurance. The default is 2. This is deprecated. + + construction_time : int + The construction time in years. The default is 6. + NOAK : bool + Whether this is an NOAK device. The default is False. + This will probably be deprecated soon. + n_unit : int or bool + The number of the tandem unit, in terms of first of a kind (1), + second of a kind (2), etc. When this is False, the FOAK cost is used. + The default is False. + lifetime : int + The lifetime of the tandem in years. This is used for LCOE and LCOH + calcualtions. The default is 30. + replacement : int + The replacement interval of the magnets in years. The default is 10. + availability : float + The facility availability. The range is between 0 and 1, inclusive. + The default is 0.90. + cost_file : str + The filename of the cost file. The default is 'woodruff-data.csv'. + method : str + The power balance method. The default is 'new'. + This will be deprecated soon. + include_tax : bool + Whether to include tax. The default is False. + include_decommissioning : bool + Whether to include decommissioning. The default is False. + include_licensing : bool + Whether to include licensing. The default is False. + include_contingency : bool + Whether to include continency. The default is False. + verbose : bool + Whether to print a lot. The default is False. + vacuum_gap_CC : float + The vacuum gap in the central cell, in meters. The default is 0.01. + first_wall_material : str + The first wall material. The default is 'W'. + first_wall_thickness : float + The first wall thickness, in meters. The default is 0.01. + vacuum_vessel_material : str + The vacuum vessel material. The default is 'SS316'. + vacuum_vessel_thickness : float + The vacuum vessel thickness, in meters. The default is 0.01 + multiplier_material : str + The muliplier material. The default is 'Pb' + multiplier_thickness : float + The multiplier thickness, in meters. The default is 0.01. + blanket_coolant_material : str + The blanket coolant material. The default is 'Natural PbLi'. + blanket_thickness : float + The blanket thickness, in meters. The default is 1.00. + blanket_coolant_fraction : float + The blanket coolant fraction, from 0 to 1. The default is 0.90. + blanket_structural_material : str + The blanket structural material. The default is 'SS316'. + blanket_structural_fraction : float + The blanket structural fraction, from 0 to 1. The default is 0.10. + outer_vessel_thickness : float + The outer vessel thickness, in meters. The default is 0.01. + contours : bool + Whether to plot contours of discount rates and build time. + The default is False. + tornadoes : bool + Whether to plot tornado plots. These take a while to make. + The default is False. + + hf_magnet_length : float + The axial length of the HF magnet, in meters. The default is 1.0. + hf_magnet_shielding_thickness : + The default is 1.0, + + a_EC : float + The expander cell radius, in meters. The default is 1.0. + expander_cell_vessel_thickness : float + The expander cell vessel thickness, in meters. The default is 0.01. + expander_cell_vessel_material : str + The expander cell vessel material. The default is 'SS316'. + + + + L_EP : float + The length of each end plug, in meters. The default is 1. + L_EC : float + The length of each expander cell, in meters, measured from the + centers of the HF coils. The default is 1. + a_CC : float + The central cell plasma radius, in meters. The default is 15. + a_EP : float + The end plug plasma radius, in meters. The default is 1. + + + + + save : bool + Whether to save the results. The default is True. + load : bool + Whether to load results. The default is False. + filename : str + The filename loading. The default is None. + run_name : str + A run name for saving results. The default is None. + + + """ + + if load: + with open(filename) as file: + inputs = json.load(file) + + else: + + # Fusion Power in Central Cell + P_f_CC = P_f - 2 * P_f_EP + + # Central Cell Length + L_CC = P_f_CC/P_f_L + + # Central Field Coil Spacing + L_CF = 1.0 + + # Overall Device Length + L = L_CC + 2 * L_EP + 2 * L_EC + + # Vacuum Volume - Not precise, but also not important + # Should be updated + V_vac = L * np.pi * a_EC**2 + + + # Power Balance + P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power + P_n = P_f - P_alpha # MW, neutron power + + # Input electrical power + P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH + + # Balance of Plant + P_pump = f_pump * M_n * P_n + P_sub_cont = f_sub * P_f + P_cryo = f_cryo * P_f + P_other = P_pump + P_sub_cont + P_cryo + + # Total heating input power applied to plasma + P_in = P_NBI + P_ICRH + P_ECH + + # Heat in blanket including neutron multiplication + # P_thermal_only = M_n * P_n + + # Thermal power + # No P_in term as that goes to DEC + P_th = M_n * P_n + eta_pump * P_pump + + # Thermal electric power + P_the = eta_th * P_th + + # DEC receives all charged particle exhaust, so is the sum of + # both the input power and alpha power + P_DEC = P_in + P_alpha + + # DEC electrical power + P_DECe = eta_DEC * P_DEC + + # Gross electrical power + # Differs for application + if application.lower()=='electricity': + # Electrical application uses thermal power to create electricity + P_egross = P_DECe + P_the + elif application.lower()=='heat': + # Heat application only uses DEC to create electricity + P_egross = P_DECe + + # Net electrical power + P_enet = P_egross - (P_ine + P_other) + + f_aux = P_aux / P_egross + # P_loss = P_th - P_the - P_DECe + # P_sub = f_sub * P_the + + # Scientific Q + Q_sci = P_f / P_in + + # Engineering Q + Q_eng = P_egross / (P_ine + P_other) + + # Recirculating power + f_refrac = 1 / Q_eng + if run_name==None: + run_name = '{:.1f}-MW'.format(float(P_f)) + + + cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) + + inputs = { + + # Application (heat or electricity) + 'Application':application, + 'Method':method, + + # Power Balance + 'Fusion Power': P_f, + 'Alpha Power': P_alpha, + 'Neutron Power': P_n, + 'Neutron Energy Multiplication': M_n, + # 'Thermal Only Power': P_thermal_only, + 'Thermal Power': P_th, + 'Thermal Conversion Efficiency': eta_th, + + # DEC + 'DEC Efficiency': eta_DEC, + 'DEC Electrical Power': P_DECe, + 'DEC Input Power': P_DEC, + + # Balance + 'Thermal Electric Power': P_the, + 'Gross Electric Power': P_egross, + 'Net Electric Power': P_enet, + + # Other Power + 'Other Power': P_other, + 'Pumping Power Fraction': f_pump, + 'Pumping Power': P_pump, + 'Subsystem and Control Power': P_sub_cont, + 'Auxiliary Power Fraction': f_aux, + 'Auxiliary Power': P_aux, + + # Input Power + 'Applied Heating Power': P_in, + 'Applied Heating Power Electrical Use': P_ine, + 'NBI Power': P_NBI, + 'ICRH Power': P_ICRH, + 'ECH Power': P_ECH, + 'NBI Electrical Efficiency': eta_NBI, + 'ICRH Electrical Efficiency': eta_ICRH, + 'ECH Electrical Efficiency': eta_ECH, + + # Q + 'Scientific Q': Q_sci, + 'Engineering Q': Q_eng, + 'Recirculating Power Fraction': f_refrac, + + # Don't use this - it is probably not implemented well here + 'Number of Modules': N_module, + + # Time Intervals + 'Construction Time':construction_time, + 'Lifetime':lifetime, + 'Replacement Time':replacement, + 'Level of Safety Assurance':LSA, + + # Geometry + 'Overall Length':L, + 'Central Cell Length':L_CC, + 'End Plug Length':L_EP, + 'Expander Length':L_EC, + 'Vacuum Volume':V_vac, + + # Number of Magnets + 'HF Magnet Number':4, # Always 4 for a tandem + 'LF Magnet Number':2, # Set to what you need! + 'CF Magnet Spacing':L_CF, + 'CF Magnet Number':L_CC/L_CF, # Calcuated + + 'HF Magnet Length':hf_magnet_length, + 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, + + 'End Plug Plasma Radius':a_EP, + + 'Expander Cell Length':L_EC, + 'Expander Cell Radius':a_EC, + 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, + 'Expander Cell Vessel Material':expander_cell_vessel_material, + + 'Central Cell Plasma Radius':a_CC, + 'Central Cell Vacuum Gap':vacuum_gap_CC, + 'First Wall Material':first_wall_material, + 'First Wall Thickness':first_wall_thickness, + 'Vacuum Vessel Material':vacuum_vessel_material, + 'Vacuum Vessel Thickness':vacuum_vessel_thickness, + 'Multiplier Material':multiplier_material, + 'Multiplier Thicnkess':multiplier_thickness, + 'Blanket Coolant Material':blanket_coolant_material, + 'Blanket Thickness':blanket_thickness, + 'Blanket Coolant Fraction':blanket_coolant_fraction, + 'Blanket Structural Material':blanket_structural_material, + 'Blanket Structrual Fraction':blanket_structural_fraction, + 'Outer Vessel Thickness':outer_vessel_thickness, + + # Economic Factors + 'Availability':availability, + 'Discount':discount, + 'NOAK': NOAK, + 'Unit Number':n_unit, + # 'Cost File':cost_file, + 'Cost File':cost_file_full, + 'Licensing':include_licensing, + 'Tax':include_tax, + 'Decommissioning':include_decommissioning, + 'Contingency':include_contingency, + + # File Prefix + 'Run Name':run_name + + } + + if save: + # import csv + + filename = 'inputs-'+inputs['Run Name']+'.json' + + + with open(filename, 'w') as file: + json.dump(inputs, file) + + if verbose: + + format_string = '{:35s} {:8.2f}' + + print('{:35s} {:8s}'.format('Parameter', 'Value')) + + for key in inputs: + print(format_string.format(key, inputs[key])) + + return(inputs) + @staticmethod + def create_radial_build(name, material, thickness, f_vol=1.00): + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[0.0], + 'r_out':[thickness], + 'f_vol':[f_vol]}) + + return(new_data) + @staticmethod + def add_new_layer(data, name, material, thickness, f_vol=1.00): + + # Inner radius is outer radius from last row + r_in = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_in+thickness], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def add_fractional_layer(data, name, material, f_vol=1.00): + + # Inner radius is inner radius from last row + r_in = data['r_in'].values[-1] + r_out = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_out], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def build_central_cell(inputs): + + radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) + radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) + + return(radial_build) + + @staticmethod + def central_cell_cost(inputs, L=1.0): + return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) + + @staticmethod + def central_cell(inputs, L=1.0): + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + radial_build = MirrorFunc.build_central_cell(inputs) + + + + T = 300 # °C, mean coolant temperture + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + # print(radial_build.to_string()) + + # print(radial_build) + + # Iterate over layer in radial build and calculate volume and cost + for i in range(len(radial_build)): + + material = radial_build['material'][i] + # print(material) + + ''' + PbLi is a special case as the enrichment and temperature affect + the density and cost. Here the code expects a percent enrichment as + shown here: + 'Natural PbLi' meaning '7.5% PbLi' + '93% PbLi' or similar + ''' + if 'PbLi' in material: + + if 'Natural' in material: + f_6Li = 0.075 + elif '% ' in material: + f_6Li = float(material.split('% ')[0])/100 + else: + print('Unable to parse coolant', material) + + radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) + radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) + radial_build.loc[i, 'manufacturing_factor'] = 1.0 + + + else: + + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + + + + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})], ignore_index=True) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + # print() + # print('Radial build for L =', L) + # print(radial_build.to_string()) + + return(radial_build) + + # Return total cost only + # return(radial_build['cost'].max()) + + @staticmethod + def expander_cell_cost(inputs): + """ + Each expander cell is made up of: + A cylindrical vessel + A DEC convertor + + + Returns + ------- + None. + + """ + + # print('Expander Cell') + + L = inputs['Expander Cell Length'] + radius = inputs['Expander Cell Radius'] + thickness = inputs['Expander Cell Vessel Thickness'] + vv_material = inputs['Expander Cell Vessel Material'] + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + # Cylindrical shell + + radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + for i in range(len(radial_build)): + + material = radial_build['material'][i] + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})]) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + + # print(radial_build.to_string()) + + # End cap + V_end_cap = np.pi * thickness * radius**2 + M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] + C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] + + # print('End Cap: $', C_end_cap) + # print('Cylindrical Part: $', radial_build['cost'].max()) + + total = 2*C_end_cap + radial_build['cost'].max() + + # print('Total: $', total) + + return(total) + + @staticmethod + def HF_magnet_shield_cost(inputs, verbose=False): + """ + The HF coils have annular shield with a U-shaped cross section: + + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + \ | | / + \ | | / + \ | | / + \| |/ + +--------+ + + + - - - - - - - - - - - Center Line + + + +--------+ + /| |\ + / | | \ + / | | \ + / | | \ + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + + + """ + + # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) + # It's a reasonable assumption to say that all axial widths/layers will be the same + + + filename = inputs['Cost File'] + cost_data = pd.read_csv(filename, index_col=0) + + # Eventually these will be arguments + material = 'W' + a_M = 0.15 # From Frank + a_CC = 0.54 # From Frank + a_0 = 0.7 + + # Radially Inner Cylinder + # length = 4.5 # End plug length from Frank + length = 0.5 # Is this the required shielding thickness? + a_M = 0.15 + r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding + r_vv = 0.01 # Reduced from 0.1 to 0.01 + + # r_magnet = 1.0 # original + r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses + r_cryostat = 1.0 + + f_vol = 0.90 + + + r_in = a_M + r_gap + r_vv + r_out = r_magnet - r_cryostat + + V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol + + # Central Cell Cylinder + # length_cc_cylinder = 50.0 + length_cc_cylinder = 0.5 + r_in_cc = a_CC + r_gap + r_vv + # r_out_cc = 1.0 + r_out_cc = r_in_cc+0.5 + + V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol + + # Central Cell Triangular Washer + V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol + + # End Plug Cylinder + length_ep_cylinder = 0.5 # From Frank + r_in_ep = a_0 + r_gap + r_vv + r_out_ep = r_in_ep + 0.5 + + V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol + + # End Cell Triangular Washer + V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol + + # For central cell facing magnet, add up all five regions + V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle + + # For expander cell facing magnet, only add up three regions + # No neutrons come from the expander cell + V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle + + # Summary information + V_total = V_total_cc_facing + V_total_ec_facing + mass = cost_data.loc[material]['density'] * V_total + cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass + + return(cost) + + + ### MNyberg's Magnet Methods ### + + # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 + # Table 2 should give good general information + # Critical current density from PROCESS + @staticmethod + def jcrit_rebco(temperature, b): + """Critical current density for "REBCO" 2nd generation HTS superconductor + temperature : input real : superconductor temperature (K) + b : input real : Magnetic field at superconductor (T) + jcrit : output real : Critical current density in superconductor (A/m2) + + Will return a negative number if the temperature is greater than Tc0, the + zero-field critical temperature. + """ + tc0 = 90.0 # (K) + birr0 = 132.5 # (T) + a = 1.82962e8 # scaling constant + # exponents + p = 0.5875 + q = 1.7 + alpha = 1.54121 + beta = 1.96679 + oneoveralpha = 1 / alpha + + validity = True + + if (temperature < 4.2) or (temperature > 72.0): + validity = False + if temperature < 65: + if (b < 0.0) or (b > 15.0): + validity = False + else: + if (b < 0.0) or (b > 11.5): + validity = False + + if not validity: + print( + # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" + ) + + if temperature < tc0: + # Normal case + birr = birr0 * (1 - temperature / tc0) ** alpha + else: + # If temp is greater than critical temp, ensure result is real but negative. + birr = birr0 * (1 - temperature / tc0) + + if b < birr: + # Normal case + factor = (b / birr) ** p * (1 - b / birr) ** q + jcrit = (a / b) * (birr**beta) * factor + else: + # Field is too high + # Ensure result is real but negative, and varies with temperature. + # tcb = critical temperature at field b + tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) + jcrit = -(temperature - tcb) + + return jcrit, validity + + @staticmethod + def HTS_storedEnergy(field, inner_rad, HTS_temp=20): + radius_in_wham = 6.65 # cm + radius_out_wham = 31.85 # cm + B_wham = 17 # T + cost_wham = 2.3/2 # MUSD + mew_0=1 # TODO if I value is needed change this to be the real constant value + width_ratio = 5 # TODO update + volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) + + j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] + + # Equation taking into account width and critical current ratios + I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) + outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) + # Old simple equation + # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) + volume_2 = math.pi*(outer_rad**2-inner_rad**2) + ratioOfVols=volume_2/volume_1 + + # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 + E_ratio=(field/B_wham)**2*ratioOfVols + cost_ratio=E_ratio**0.6 + return cost_ratio*cost_wham + + + @staticmethod + def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): + # This is the HF cost per magnet [MUSD], not for all four + + # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit + cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): + # This is the LF cost per magnet [MUSD] + + cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def CF_magnet_cost(inputs, CF_field=3.0): + # This is the CF cost per magnet [MUSD] + + convert_to_currentDollar = 1.31 + cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + + + + diff --git a/src/Algorithm/MirrorFunc_splitInputs.py b/src/Algorithm/MirrorFunc_splitInputs.py new file mode 100644 index 0000000..e438257 --- /dev/null +++ b/src/Algorithm/MirrorFunc_splitInputs.py @@ -0,0 +1,1557 @@ +import numpy as np +import pandas as pd +import scipy +import json +import math +import pkg_resources +from .Algorithm import Algorithm + +### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples +class MirrorFunc(Algorithm): + + # Physical constants + E_DT = 17.59e6 * 1.60218*10**-19 # J + E_alpha = 3.52e6 * 1.60218*10**-19 # J + E_n = E_DT - E_alpha # J + m_T = 3.01604928 * 1.66053907*10**-27 # kg, triton mass + m_D = 2.01410177811 * 1.66053907*10**-27 # kg, deuteron mass + m_6Li = 6.0151228874 * 1.66053907*10**-27 # kg, lithium-6 mass + + # Conversion factors + Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU + + def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): + super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) + + def run(self, inputs: dict) -> float: + """ + Executes the algorithm specified by the name in the instance variables. + + Parameters: + inputs (dict): Dictionary of input variables required for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + # run the algorithm use self.name not self.alg_name + return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) + + def _run_algorithm(self, alg_name: str, variables: list) -> float: + """ + Runs the specified algorithm with given variables. + + Parameters: + alg_name (str): The name of the algorithm to run. + variables (list): List of input variables for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + try: + algorithm = getattr(self, alg_name) + return algorithm(*variables) + except AttributeError: + raise ValueError(f"Algorithm {alg_name} not found") + + ### Account Methods: ### + @staticmethod + def Account_C20(inputs): + return( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs) + + MirrorFunc.Account_C29(inputs) + ) + + @staticmethod + def Account_C21(inputs): + return( + MirrorFunc.Account_C21_1(inputs) + + MirrorFunc.Account_C21_2(inputs) + + MirrorFunc.Account_C21_3(inputs) + + MirrorFunc.Account_C21_4(inputs) + + MirrorFunc.Account_C21_5(inputs) + + MirrorFunc.Account_C21_6(inputs) + + MirrorFunc.Account_C21_7(inputs) + + MirrorFunc.Account_C21_8(inputs) + + MirrorFunc.Account_C21_9(inputs) + + MirrorFunc.Account_C21_10(inputs) + + MirrorFunc.Account_C21_11(inputs) + + MirrorFunc.Account_C21_12(inputs) + + MirrorFunc.Account_C21_13(inputs) + + MirrorFunc.Account_C21_14(inputs) + + MirrorFunc.Account_C21_15(inputs) + + MirrorFunc.Account_C21_16(inputs) + + MirrorFunc.Account_C21_17(inputs) + ) + + @staticmethod + def Account_C21_1(inputs): + # Site Preparation/Yard Work + return(inputs['Gross Electric Power'] * 268/1e3) + + @staticmethod + def Account_C21_2(inputs): + # Heat Island Building + return(inputs['Gross Electric Power'] * 186.8/1e3) + + @staticmethod + def Account_C21_3(inputs): + # Turbine Generator Building + if inputs['Application'].lower()=='electricity': + return(inputs['Gross Electric Power'] * 54.0/1e3) + else: + return(0) + + @staticmethod + def Account_C21_4(inputs): + # Heat Exchanger Building + return(37.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, + def Account_C21_5(inputs): + # Power Supply and Energy Storage + return(10.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, + def Account_C21_6(inputs): + # Reactor Auxiliaries + return(5.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, + def Account_C21_7(inputs): + # Hot Cell + return(93.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, + def Account_C21_8(inputs): + # Reactor Services + return(18.7/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, + def Account_C21_9(inputs): + # Service Water + return(0.3/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, + def Account_C21_10(inputs): + # Fuel Storage + return(1.1/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_11(inputs): + # Control Room + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, + def Account_C21_12(inputs): + # Onsite AC Power + return(0.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, + def Account_C21_13(inputs): + # Administration + return(4.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, + def Account_C21_14(inputs): + # Site Services + return(1.6/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, + def Account_C21_15(inputs): + # Cyrogenics + return(2.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_16(inputs): + # Security + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, + def Account_C21_17(inputs): + # Ventilation Stack + return(27.0/1e3 * inputs['Gross Electric Power']) + + + @staticmethod + def Account_C22(inputs): + # Rollup + return( + MirrorFunc.Account_C22_1(inputs) + + MirrorFunc.Account_C22_2(inputs) + + MirrorFunc.Account_C22_3(inputs) + + MirrorFunc.Account_C22_4(inputs) + + MirrorFunc.Account_C22_5(inputs) + + MirrorFunc.Account_C22_6(inputs) + + MirrorFunc.Account_C22_7(inputs) + ) + + + @staticmethod + def Account_C22_1(inputs): + # This is a special case and is NOT calculated using Woodruff's model, + # However, I maintained the naming convention for convenience + # Rollup + return( + MirrorFunc.Account_C22_1_1(inputs) + + MirrorFunc.Account_C22_1_2(inputs) + + MirrorFunc.Account_C22_1_3(inputs) + + MirrorFunc.Account_C22_1_4(inputs) + + MirrorFunc.Account_C22_1_5(inputs) + + MirrorFunc.Account_C22_1_6(inputs) + + MirrorFunc.Account_C22_1_7(inputs) + + MirrorFunc.Account_C22_1_8(inputs) + + MirrorFunc.Account_C22_1_9(inputs) + + MirrorFunc.Account_C22_1_11(inputs) + ) + + @staticmethod + def Account_C22_1_1(inputs): + # First Wall and Blanket (and vacuum vessel) + + L_magnet_to_magnet = inputs['End Plug Length'] + + L_cylinder = L_magnet_to_magnet + + expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) + + end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) + end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() + + central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) + central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() + + total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result + + return(total_cost/1e6) + + @staticmethod + def Account_C22_1_2(inputs): + # Magnet Radiation Shield + # Factor of two for each end plug + return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) + + @staticmethod + def Account_C22_1_3(inputs): + # Coils + # Rollup + return( + MirrorFunc.Account_C22_1_3_1(inputs) + + MirrorFunc.Account_C22_1_3_2(inputs) + + MirrorFunc.Account_C22_1_3_3(inputs) + ) + + # @staticmethod + def Account_C22_1_3_1(inputs): + # HF Coils - Quantity 4 + # 2 per end cell + # 2 end cells per tandem + return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_2(inputs): + # LF Coils - Quantity 8 + # 4 per end cell + # 2 end cells per tandem + return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_3(inputs): + # CF Coils + # One coil every L_CF m of Central Cell + return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_4(inputs): + # Supplemenatry Heating + # Rollup + return( + MirrorFunc.Account_C22_1_4_1(inputs) + + MirrorFunc.Account_C22_1_4_2(inputs) + + MirrorFunc.Account_C22_1_4_3(inputs) + ) + + @staticmethod + def Account_C22_1_4_1(inputs): + # NBI + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(7.0642 * inputs['NBI Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_2(inputs): + # ICRH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(4.149 * inputs['ICRH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_3(inputs): + # ECH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(8.0 * inputs['ECH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_5(inputs): + # Primary Structure and Support + return(0) + + @staticmethod + def Account_C22_1_6(inputs): + # Vacuum Systems + # Rollup + return( + # Account_C22_1_6_1(inputs) + + MirrorFunc.Account_C22_1_6_2(inputs) + + MirrorFunc.Account_C22_1_6_3(inputs) + + MirrorFunc.Account_C22_1_6_4(inputs) + ) + + + # def Account_C22_1_6_1(inputs): + # Vacuum Vessel + # Tracked in radial builds and folded into blanket + # return(0) + + + @staticmethod + def Account_C22_1_6_2(inputs): + # Helium Liquefier-Refrigerators (not for magnets) + # Presumably for a full vessel cryostat? + return(0) + + @staticmethod + def Account_C22_1_6_3(inputs): + + #VACUUM PUMPING 22.1.6.3 + #assume 1 second vac rate + #cost of 1 vacuum pump, scaled from 1985 dollars + cost_pump = 40000 + #48 pumps needed for 200^3 system + vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump + no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second + return(no_vpumps*cost_pump/1e6) + + + @staticmethod + def Account_C22_1_6_4(inputs): + # Roughing Pump + return(120000*2.85/1e6) + + @staticmethod + def Account_C22_1_7(inputs): + # Power Supplies + + # Not using Woodruff 2024 as that is based on ITER fusion power + # Heating and magnets are tracked elsewhere + + # #Scaled relative to ITER for a 500MW fusion power syste + # lcredit = 0.5# learning credit. + # C220107 = 269.6 * PNRL/500*lcredit #cost in kIUA + # C220107 = C220107*2 #assuming 1kIUA equals $2 M + + return(0) + + @staticmethod + def Account_C22_1_8(inputs): + # Divertor + return(0) + + @staticmethod + def Account_C22_1_9(inputs): + # Direct Energy Convertor + # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) + + @staticmethod + def Account_C22_1_11(inputs): + # Assembly and Installation Costs + + #Cost Category 22.1.11 Installation costs + axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_ir = axis_t + + # Define labor rate + lr = 1600 / 1e6 # 1600 dollars per day for skilled labor + + # Calculations + constructionworker = 20 * axis_ir / 4 + C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) + C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_8_in = 0 # guns or divertor + C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_10_in = 0 # ECRH + + # Total cost calculations + C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220111 * cost_factor) + + @staticmethod + def Account_C22_2(inputs): + # Main and Secondary Coolant + return( + MirrorFunc.Account_C22_2_1(inputs) + + MirrorFunc.Account_C22_2_2(inputs) + + MirrorFunc.Account_C22_2_3(inputs) + ) + + @staticmethod + def Account_C22_2_1(inputs): + # Primary Coolant + return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) + + @staticmethod + def Account_C22_2_2(inputs): + # Secondary Coolant + return(40.6 * (inputs['Thermal Power']/3500)**0.55) + + @staticmethod + def Account_C22_2_3(inputs): + # Tertiary Coolant + return(0) + + @staticmethod + def Account_C22_3(inputs): + # Auxiliary Cooling Systems + return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_4(inputs): + # Radioactive Waste Treatment + return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_5(inputs): + # Cost Category 22.5 Fuel Handling and Storage + + inflation = 1.43 + C2205010ITER = 20.465 * inflation + C2205020ITER = 7 * inflation + C2205030ITER = 22.511 * inflation + C2205040ITER = 9.76 * inflation + C2205050ITER = 22.826 * inflation + C2205060ITER = 47.542 * inflation + # C22050ITER = C2205010ITER + C2205020ITER + C2205030ITER + C2205040ITER + C2205050ITER + C2205060ITER #ITER inflation cost + + + lcredit = 0.8 # learning curve + ltoak = 10**(np.log10(lcredit) / np.log10(2)) + + + C220501 = C2205010ITER * ltoak + C220502 = C2205020ITER * ltoak + C220503 = C2205030ITER * ltoak + C220504 = C2205040ITER * ltoak + C220505 = C2205050ITER * ltoak + C220506 = C2205060ITER * ltoak + C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220500 * cost_factor) + + @staticmethod + def Account_C22_6(inputs): + # Cost Category 22.6 Other Reactor Plant Equipment + return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) + + @staticmethod + def Account_C22_7(inputs): + # Cost Category 22.7 Instrumentation and Control + return(85) + + @staticmethod + def Account_C23(inputs): + # Turbine Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) + + @staticmethod + def Account_C24(inputs): + # Electric Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) + + @staticmethod + def Account_C25(inputs): + # Miscellaneous Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) + + @staticmethod + def Account_C26(inputs): + # Heat Rejection + return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) + + @staticmethod + def Account_C27(inputs): + # Special Materials + # Total elsewhere, implement later + return(0) + + @staticmethod + def Account_C28(inputs): + # Digital Twin + return(5) + + @staticmethod + def Account_C29(inputs): + # Contingency on Direct Capital Costs + + # I may have to change the way that I do sums as this must be done separately? + # C21 = sum(C21.1 + C21.2 + ...) + + # Rollup + + if not(inputs['NOAK']) and inputs['Contingency']: + return(0.1 * ( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs))) + else: + return(0) + + + ### Other Methods: ### + @staticmethod + def PbLi_density(f_6Li=0.075, T=300): + """ + Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has + roughly 83% Pb and 17% Li. + + Parameters + ---------- + f_6Li : float, optional + Fraction of 6Li to all Li, aka enrichment. The default is 0.075. + T : float, optional + Temperature. Units are °C. The default is 300. + + Returns + ------- + Density of PbLi at selected parameters. + + """ + + f_6Li_natural = 0.075 + rho_6Li = 0.460e3 # kg/m^3 + rho_7Li = 0.537e3 # kg/m^3 + + T_K = T + 273.15 # K + + # Use equation for density as function of temperature from below, Table 1 + # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) + # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF + rho_PbLi = 10520.35 - 1.19051 * T_K + + + # Correct calculated density for enrichment + rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) + + return(rho_PbLi) + + @staticmethod + def Li_price(f_6Li=0.075): + """ + Return Li price (USD/kg) for enrichment levels above 90% 6Li + + Parameters + ---------- + f_6Li : TYPE, optional + DESCRIPTION. The default is 0.075. + + Returns + ------- + None. + + """ + + # https://www.dailymetalprice.com/lithium.html + # From 2024-04-01 + P_6Li075 = 15.152 # USD/kg + + if f_6Li == 0.075: + return(P_6Li075) + + elif f_6Li >= 0.90: + # From Woodruff for 90% 6Li + P_6Li90 = 70 # USD/kg + + # El-Guebaly 2011 (AIRES-AT UK Study) + # P_6Li90 = 2400.0 #USD/kg + + + f = [0.90, 0.99, 0.999, 0.9999, 0.99999] + Cf = [1, 2, 4, 8, 16] + + f_interp = scipy.interpolate.interp1d(f, Cf) + return(f_interp(f_6Li) * P_6Li90) + + else: + print('Lithium pricing at this enrichment level not supported') + return() + + @staticmethod + def PbLi_price(f_6Li, P_Pb): + + # Assuming eutectic fractions + f_Li = 0.17 + f_Pb = 1 - f_Li + + P_Li = MirrorFunc.Li_price(f_6Li) + + P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg + + return(P_PbLi) + @staticmethod + def V_cylindrical_shell(r_in, r_out, L): + """ + Return volume of a cylindrical shell + + Parameters + ---------- + r_in : float, inner radius + r_out : float, outer radius + L : float, length + + Returns + ------- + Volume (float). + + """ + return(np.pi * L * (r_out**2 - r_in**2)) + + @staticmethod + def V_inverse_triangular_washer(z, r_in, r_out): + """ + Return volume of cylindrical inverse triangular washer. + From the ASCII art below you can see how this is used for magnet shielding. + + ^ z + | + | z + |\ | /| + | \ | / | + | \ | / | + | \ | / | + | \ | / | + | \ | / | + ------------------------------------> r + r_in r_out + + Parameters + ---------- + z : float, z extent of triangle + r_in : float, inner radius of triangle + r_out : float, outer radius of triangle + + Returns + ------- + Volume (float). + + """ + + + # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b + + return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) + @staticmethod + def generate_inputs( + + application='heat', + + P_f=1, P_f_L=1, P_f_EP=1, + P_NBI=1, P_ECH=1, P_ICRH=1, + M_n=1.1, + + N_module=1, + + f_pump=0.03, f_sub=0.04, f_cryo=0.01, + + # Obsolete but kept for backwards compatibility + P_pump=1, P_sub_cont=1, P_cryo=1, + P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, + + eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, + eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, + + verbose=False, exact=False, + NOAK=False, n_unit=False, + construction_time=6, + lifetime=30, replacement=10, availability=0.90, + discount=0.0245, + LSA=2, + cost_file='woodruff-data.csv', method='new', + include_decommissioning=False, include_tax=False, + include_licensing=False, include_contingency=False, + + hf_magnet_length=1, + hf_magnet_shielding_thickness=1, + + a_EC=1, + expander_cell_vessel_thickness=0.01, + expander_cell_vessel_material='SS316', + + vacuum_gap_CC=0.01, + first_wall_material='W', + first_wall_thickness=0.01, + vacuum_vessel_material='SS316', + vacuum_vessel_thickness=0.01, + multiplier_material='Pb', + multiplier_thickness=0.01, + blanket_coolant_material='Natural PbLi', + blanket_thickness=1.00, + blanket_coolant_fraction=0.90, + blanket_structural_material='SS316', + blanket_structural_fraction=0.10, + outer_vessel_thickness=0.01, + + L_EP=1, + L_EC=1, + a_CC=1, + a_EP=1, + + save=True, + load=False, + filename=None, + run_name=None + + ): + + """ + Return a dict containing all inputs for a techno-economic analysis. + + Parameters + ---------- + application : str, optional + The application, either 'electricity' or 'heat'. + This changes the power balance and some reporting. The default + is 'heat'. + P_f : float + The total fusion power in MW. The length of the central cell + is scaled to achieve this value. This is not the net electrical power! + P_f_L : float + The central cell linear fusion power in MW/m. + P_f_EP : float + The fusion power in each of two end plugs in MW. + P_NBI : float + The applied NBI power in MW. + P_ECH : float + The applied ECH power in MW. + P_ICRH : float + The applied ICRH power in MW. + M_n : float + The neutron power multiplication factor from the blanket. + The default is 1.1. + N_module : int + The number of modules (fusion machines) per facility. + This is deprecated. The default is 1. + f_pump : float + The pumping power fraction (of M_n * P_fusion). The default is 0.03. + f_sub : float + The subsystem power fraction (of fusion power). The default is 0.04. + f_cryo : float + The cryogenic power fraction (of fusion power). The default is 0.01. + P_pump : float + The pumping power in MW. This is deprecated. + P_sub_cont : float + The subsystem and control power in MW. This is deprecated. + P_cryo: float + The cryo power in MW. The default is 0.5 MW. This is deprecated. + P_pfcool : float + The PF cooling power in MW. The default is 0. This is deprecated. + P_thcool : float + The thermal cooling power in MW. The default is 0. This is deprecated. + P_coils : float + The magnetic coil power in MW. The default is 0. + P_aux : float + The auxiliary power in MW. The default is 9.4. + + eta_th : float + The thermal conversion efficiency. + eta_DEC : float + The DEC conversion efficiency. The default is 0.90. + eta_pump : float + The pumping efficiency. The default is 0.98. + eta_NBI : float + The NBI electrical efficiency. + eta_ECH : float + The ECH electrical efficiency. + eta_ICRH : float + The ICRH electrical efficiency. + + LSA : int + The level of safey assurance. The default is 2. This is deprecated. + + construction_time : int + The construction time in years. The default is 6. + NOAK : bool + Whether this is an NOAK device. The default is False. + This will probably be deprecated soon. + n_unit : int or bool + The number of the tandem unit, in terms of first of a kind (1), + second of a kind (2), etc. When this is False, the FOAK cost is used. + The default is False. + lifetime : int + The lifetime of the tandem in years. This is used for LCOE and LCOH + calcualtions. The default is 30. + replacement : int + The replacement interval of the magnets in years. The default is 10. + availability : float + The facility availability. The range is between 0 and 1, inclusive. + The default is 0.90. + cost_file : str + The filename of the cost file. The default is 'woodruff-data.csv'. + method : str + The power balance method. The default is 'new'. + This will be deprecated soon. + include_tax : bool + Whether to include tax. The default is False. + include_decommissioning : bool + Whether to include decommissioning. The default is False. + include_licensing : bool + Whether to include licensing. The default is False. + include_contingency : bool + Whether to include continency. The default is False. + verbose : bool + Whether to print a lot. The default is False. + vacuum_gap_CC : float + The vacuum gap in the central cell, in meters. The default is 0.01. + first_wall_material : str + The first wall material. The default is 'W'. + first_wall_thickness : float + The first wall thickness, in meters. The default is 0.01. + vacuum_vessel_material : str + The vacuum vessel material. The default is 'SS316'. + vacuum_vessel_thickness : float + The vacuum vessel thickness, in meters. The default is 0.01 + multiplier_material : str + The muliplier material. The default is 'Pb' + multiplier_thickness : float + The multiplier thickness, in meters. The default is 0.01. + blanket_coolant_material : str + The blanket coolant material. The default is 'Natural PbLi'. + blanket_thickness : float + The blanket thickness, in meters. The default is 1.00. + blanket_coolant_fraction : float + The blanket coolant fraction, from 0 to 1. The default is 0.90. + blanket_structural_material : str + The blanket structural material. The default is 'SS316'. + blanket_structural_fraction : float + The blanket structural fraction, from 0 to 1. The default is 0.10. + outer_vessel_thickness : float + The outer vessel thickness, in meters. The default is 0.01. + contours : bool + Whether to plot contours of discount rates and build time. + The default is False. + tornadoes : bool + Whether to plot tornado plots. These take a while to make. + The default is False. + + hf_magnet_length : float + The axial length of the HF magnet, in meters. The default is 1.0. + hf_magnet_shielding_thickness : + The default is 1.0, + + a_EC : float + The expander cell radius, in meters. The default is 1.0. + expander_cell_vessel_thickness : float + The expander cell vessel thickness, in meters. The default is 0.01. + expander_cell_vessel_material : str + The expander cell vessel material. The default is 'SS316'. + + + + L_EP : float + The length of each end plug, in meters. The default is 1. + L_EC : float + The length of each expander cell, in meters, measured from the + centers of the HF coils. The default is 1. + a_CC : float + The central cell plasma radius, in meters. The default is 15. + a_EP : float + The end plug plasma radius, in meters. The default is 1. + + + + + save : bool + Whether to save the results. The default is True. + load : bool + Whether to load results. The default is False. + filename : str + The filename loading. The default is None. + run_name : str + A run name for saving results. The default is None. + + + """ + + if load: + with open(filename) as file: + inputs = json.load(file) + + else: + + # Fusion Power in Central Cell + P_f_CC = P_f - 2 * P_f_EP + + # Central Cell Length + L_CC = P_f_CC/P_f_L + + # Central Field Coil Spacing + L_CF = 1.0 + + # Overall Device Length + L = L_CC + 2 * L_EP + 2 * L_EC + + # Vacuum Volume - Not precise, but also not important + # Should be updated + V_vac = L * np.pi * a_EC**2 + + + # Power Balance + P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power + P_n = P_f - P_alpha # MW, neutron power + + # Input electrical power + P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH + + # Balance of Plant + P_pump = f_pump * M_n * P_n + P_sub_cont = f_sub * P_f + P_cryo = f_cryo * P_f + P_other = P_pump + P_sub_cont + P_cryo + + # Total heating input power applied to plasma + P_in = P_NBI + P_ICRH + P_ECH + + # Heat in blanket including neutron multiplication + # P_thermal_only = M_n * P_n + + # Thermal power + # No P_in term as that goes to DEC + P_th = M_n * P_n + eta_pump * P_pump + + # Thermal electric power + P_the = eta_th * P_th + + # DEC receives all charged particle exhaust, so is the sum of + # both the input power and alpha power + P_DEC = P_in + P_alpha + + # DEC electrical power + P_DECe = eta_DEC * P_DEC + + # Gross electrical power + # Differs for application + if application.lower()=='electricity': + # Electrical application uses thermal power to create electricity + P_egross = P_DECe + P_the + elif application.lower()=='heat': + # Heat application only uses DEC to create electricity + P_egross = P_DECe + + # Net electrical power + P_enet = P_egross - (P_ine + P_other) + + f_aux = P_aux / P_egross + # P_loss = P_th - P_the - P_DECe + # P_sub = f_sub * P_the + + # Scientific Q + Q_sci = P_f / P_in + + # Engineering Q + Q_eng = P_egross / (P_ine + P_other) + + # Recirculating power + f_refrac = 1 / Q_eng + if run_name==None: + run_name = '{:.1f}-MW'.format(float(P_f)) + + + cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) + + inputs = { + + # Application (heat or electricity) + 'Application':application, + 'Method':method, + + # Power Balance + 'Fusion Power': P_f, + 'Alpha Power': P_alpha, + 'Neutron Power': P_n, + 'Neutron Energy Multiplication': M_n, + # 'Thermal Only Power': P_thermal_only, + 'Thermal Power': P_th, + 'Thermal Conversion Efficiency': eta_th, + + # DEC + 'DEC Efficiency': eta_DEC, + 'DEC Electrical Power': P_DECe, + 'DEC Input Power': P_DEC, + + # Balance + 'Thermal Electric Power': P_the, + 'Gross Electric Power': P_egross, + 'Net Electric Power': P_enet, + + # Other Power + 'Other Power': P_other, + 'Pumping Power Fraction': f_pump, + 'Pumping Power': P_pump, + 'Subsystem and Control Power': P_sub_cont, + 'Auxiliary Power Fraction': f_aux, + 'Auxiliary Power': P_aux, + + # Input Power + 'Applied Heating Power': P_in, + 'Applied Heating Power Electrical Use': P_ine, + 'NBI Power': P_NBI, + 'ICRH Power': P_ICRH, + 'ECH Power': P_ECH, + 'NBI Electrical Efficiency': eta_NBI, + 'ICRH Electrical Efficiency': eta_ICRH, + 'ECH Electrical Efficiency': eta_ECH, + + # Q + 'Scientific Q': Q_sci, + 'Engineering Q': Q_eng, + 'Recirculating Power Fraction': f_refrac, + + # Don't use this - it is probably not implemented well here + 'Number of Modules': N_module, + + # Time Intervals + 'Construction Time':construction_time, + 'Lifetime':lifetime, + 'Replacement Time':replacement, + 'Level of Safety Assurance':LSA, + + # Geometry + 'Overall Length':L, + 'Central Cell Length':L_CC, + 'End Plug Length':L_EP, + 'Expander Length':L_EC, + 'Vacuum Volume':V_vac, + + # Number of Magnets + 'HF Magnet Number':4, # Always 4 for a tandem + 'LF Magnet Number':2, # Set to what you need! + 'CF Magnet Spacing':L_CF, + 'CF Magnet Number':L_CC/L_CF, # Calcuated + + 'HF Magnet Length':hf_magnet_length, + 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, + + 'End Plug Plasma Radius':a_EP, + + 'Expander Cell Length':L_EC, + 'Expander Cell Radius':a_EC, + 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, + 'Expander Cell Vessel Material':expander_cell_vessel_material, + + 'Central Cell Plasma Radius':a_CC, + 'Central Cell Vacuum Gap':vacuum_gap_CC, + 'First Wall Material':first_wall_material, + 'First Wall Thickness':first_wall_thickness, + 'Vacuum Vessel Material':vacuum_vessel_material, + 'Vacuum Vessel Thickness':vacuum_vessel_thickness, + 'Multiplier Material':multiplier_material, + 'Multiplier Thicnkess':multiplier_thickness, + 'Blanket Coolant Material':blanket_coolant_material, + 'Blanket Thickness':blanket_thickness, + 'Blanket Coolant Fraction':blanket_coolant_fraction, + 'Blanket Structural Material':blanket_structural_material, + 'Blanket Structrual Fraction':blanket_structural_fraction, + 'Outer Vessel Thickness':outer_vessel_thickness, + + # Economic Factors + 'Availability':availability, + 'Discount':discount, + 'NOAK': NOAK, + 'Unit Number':n_unit, + # 'Cost File':cost_file, + 'Cost File':cost_file_full, + 'Licensing':include_licensing, + 'Tax':include_tax, + 'Decommissioning':include_decommissioning, + 'Contingency':include_contingency, + + # File Prefix + 'Run Name':run_name + + } + + if save: + # import csv + + filename = 'inputs-'+inputs['Run Name']+'.json' + + + with open(filename, 'w') as file: + json.dump(inputs, file) + + if verbose: + + format_string = '{:35s} {:8.2f}' + + print('{:35s} {:8s}'.format('Parameter', 'Value')) + + for key in inputs: + print(format_string.format(key, inputs[key])) + + return(inputs) + @staticmethod + def create_radial_build(name, material, thickness, f_vol=1.00): + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[0.0], + 'r_out':[thickness], + 'f_vol':[f_vol]}) + + return(new_data) + @staticmethod + def add_new_layer(data, name, material, thickness, f_vol=1.00): + + # Inner radius is outer radius from last row + r_in = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_in+thickness], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def add_fractional_layer(data, name, material, f_vol=1.00): + + # Inner radius is inner radius from last row + r_in = data['r_in'].values[-1] + r_out = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_out], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def build_central_cell(inputs): + + radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) + radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) + + return(radial_build) + + @staticmethod + def central_cell_cost(inputs, L=1.0): + return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) + + @staticmethod + def central_cell(inputs, L=1.0): + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + radial_build = MirrorFunc.build_central_cell(inputs) + + + + T = 300 # °C, mean coolant temperture + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + # print(radial_build.to_string()) + + # print(radial_build) + + # Iterate over layer in radial build and calculate volume and cost + for i in range(len(radial_build)): + + material = radial_build['material'][i] + # print(material) + + ''' + PbLi is a special case as the enrichment and temperature affect + the density and cost. Here the code expects a percent enrichment as + shown here: + 'Natural PbLi' meaning '7.5% PbLi' + '93% PbLi' or similar + ''' + if 'PbLi' in material: + + if 'Natural' in material: + f_6Li = 0.075 + elif '% ' in material: + f_6Li = float(material.split('% ')[0])/100 + else: + print('Unable to parse coolant', material) + + radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) + radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) + radial_build.loc[i, 'manufacturing_factor'] = 1.0 + + + else: + + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + + + + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})], ignore_index=True) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + # print() + # print('Radial build for L =', L) + # print(radial_build.to_string()) + + return(radial_build) + + # Return total cost only + # return(radial_build['cost'].max()) + + @staticmethod + def expander_cell_cost(inputs): + """ + Each expander cell is made up of: + A cylindrical vessel + A DEC convertor + + + Returns + ------- + None. + + """ + + # print('Expander Cell') + + L = inputs['Expander Cell Length'] + radius = inputs['Expander Cell Radius'] + thickness = inputs['Expander Cell Vessel Thickness'] + vv_material = inputs['Expander Cell Vessel Material'] + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + # Cylindrical shell + + radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + for i in range(len(radial_build)): + + material = radial_build['material'][i] + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})]) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + + # print(radial_build.to_string()) + + # End cap + V_end_cap = np.pi * thickness * radius**2 + M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] + C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] + + # print('End Cap: $', C_end_cap) + # print('Cylindrical Part: $', radial_build['cost'].max()) + + total = 2*C_end_cap + radial_build['cost'].max() + + # print('Total: $', total) + + return(total) + + @staticmethod + def HF_magnet_shield_cost(inputs, verbose=False): + """ + The HF coils have annular shield with a U-shaped cross section: + + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + \ | | / + \ | | / + \ | | / + \| |/ + +--------+ + + + - - - - - - - - - - - Center Line + + + +--------+ + /| |\ + / | | \ + / | | \ + / | | \ + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + + + """ + + # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) + # It's a reasonable assumption to say that all axial widths/layers will be the same + + + filename = inputs['Cost File'] + cost_data = pd.read_csv(filename, index_col=0) + + # Eventually these will be arguments + material = 'W' + a_M = 0.15 # From Frank + a_CC = 0.54 # From Frank + a_0 = 0.7 + + # Radially Inner Cylinder + # length = 4.5 # End plug length from Frank + length = 0.5 # Is this the required shielding thickness? + a_M = 0.15 + r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding + r_vv = 0.01 # Reduced from 0.1 to 0.01 + + # r_magnet = 1.0 # original + r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses + r_cryostat = 1.0 + + f_vol = 0.90 + + + r_in = a_M + r_gap + r_vv + r_out = r_magnet - r_cryostat + + V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol + + # Central Cell Cylinder + # length_cc_cylinder = 50.0 + length_cc_cylinder = 0.5 + r_in_cc = a_CC + r_gap + r_vv + # r_out_cc = 1.0 + r_out_cc = r_in_cc+0.5 + + V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol + + # Central Cell Triangular Washer + V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol + + # End Plug Cylinder + length_ep_cylinder = 0.5 # From Frank + r_in_ep = a_0 + r_gap + r_vv + r_out_ep = r_in_ep + 0.5 + + V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol + + # End Cell Triangular Washer + V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol + + # For central cell facing magnet, add up all five regions + V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle + + # For expander cell facing magnet, only add up three regions + # No neutrons come from the expander cell + V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle + + # Summary information + V_total = V_total_cc_facing + V_total_ec_facing + mass = cost_data.loc[material]['density'] * V_total + cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass + + return(cost) + + + ### MNyberg's Magnet Methods ### + + # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 + # Table 2 should give good general information + # Critical current density from PROCESS + @staticmethod + def jcrit_rebco(temperature, b): + """Critical current density for "REBCO" 2nd generation HTS superconductor + temperature : input real : superconductor temperature (K) + b : input real : Magnetic field at superconductor (T) + jcrit : output real : Critical current density in superconductor (A/m2) + + Will return a negative number if the temperature is greater than Tc0, the + zero-field critical temperature. + """ + tc0 = 90.0 # (K) + birr0 = 132.5 # (T) + a = 1.82962e8 # scaling constant + # exponents + p = 0.5875 + q = 1.7 + alpha = 1.54121 + beta = 1.96679 + oneoveralpha = 1 / alpha + + validity = True + + if (temperature < 4.2) or (temperature > 72.0): + validity = False + if temperature < 65: + if (b < 0.0) or (b > 15.0): + validity = False + else: + if (b < 0.0) or (b > 11.5): + validity = False + + if not validity: + print( + # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" + ) + + if temperature < tc0: + # Normal case + birr = birr0 * (1 - temperature / tc0) ** alpha + else: + # If temp is greater than critical temp, ensure result is real but negative. + birr = birr0 * (1 - temperature / tc0) + + if b < birr: + # Normal case + factor = (b / birr) ** p * (1 - b / birr) ** q + jcrit = (a / b) * (birr**beta) * factor + else: + # Field is too high + # Ensure result is real but negative, and varies with temperature. + # tcb = critical temperature at field b + tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) + jcrit = -(temperature - tcb) + + return jcrit, validity + + @staticmethod + def HTS_storedEnergy(field, inner_rad, HTS_temp=20): + radius_in_wham = 6.65 # cm + radius_out_wham = 31.85 # cm + B_wham = 17 # T + cost_wham = 2.3/2 # MUSD + mew_0=1 # TODO if I value is needed change this to be the real constant value + width_ratio = 5 # TODO update + volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) + + j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] + + # Equation taking into account width and critical current ratios + I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) + outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) + # Old simple equation + # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) + volume_2 = math.pi*(outer_rad**2-inner_rad**2) + ratioOfVols=volume_2/volume_1 + + # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 + E_ratio=(field/B_wham)**2*ratioOfVols + cost_ratio=E_ratio**0.6 + return cost_ratio*cost_wham + + + @staticmethod + def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): + # This is the HF cost per magnet [MUSD], not for all four + + # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit + cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): + # This is the LF cost per magnet [MUSD] + + cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def CF_magnet_cost(inputs, CF_field=3.0): + # This is the CF cost per magnet [MUSD] + + convert_to_currentDollar = 1.31 + cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + + + + diff --git a/src/Algorithm/__init__.py b/src/Algorithm/__init__.py index 896beb4..d1b1039 100644 --- a/src/Algorithm/__init__.py +++ b/src/Algorithm/__init__.py @@ -6,3 +6,4 @@ from .LCOE import LCOE from .LPSRDirectCostFunc import LPSRDirectCostFunc from .AP1000DirectCostFunc import AP1000DirectCostFunc +from .MirrorFunc import MirrorFunc diff --git a/src/Main.py b/src/Main.py index 02f23ba..56e4b6c 100755 --- a/src/Main.py +++ b/src/Main.py @@ -177,6 +177,14 @@ def setup_table_names(self,xml2obj): self.alg_tabl = 'fusion_alg' self.esc_tabl = 'escalation' self.fac_tabl = 'facility' + elif "mirror" in str(xml2obj.ref_model.value).lower(): + self.ref_model = 'mirror' + self.acc_tabl = 'mirror_acco' + self.cel_tabl = None + self.var_tabl = 'mirror_var' + self.alg_tabl = 'mirror_alg' + self.esc_tabl = 'escalation' + self.fac_tabl = 'facility' elif "user_defined" in str(xml2obj.ref_model.value).lower(): self.ref_model = 'user_defined' self.acc_tabl = 'user_defined_account' diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 792498c80db890c03e6e3e39a20c1706867e9600..307c70258ae293cb514406df3f40f0a6610f283a 100644 GIT binary patch delta 44954 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 GHvj+{r(5Cx diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 8479a17..dfd0a88 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6931,4 +6931,347 @@ INSERT INTO ap1000_algorithm VALUES(28,'scale_law_wastewater_bldg','v','Wastewat INSERT INTO ap1000_algorithm VALUES(29,'scale_law_power','v','Power scale law.','AP1000DirectCostFunc','(input_unit_value / reference_unit_value)^exponent','1','input_unit_value, reference_unit_value, exponent',NULL); INSERT INTO ap1000_algorithm VALUES(30,'sum_all','c/v','Sum all supplied child cost elements or intermediate variables.','AP1000DirectCostFunc','sum(values)','$','values',NULL); INSERT INTO ap1000_algorithm VALUES(31,'calc_rej_th_P','v','Rejected thermal power = thermal power - electric power.','AP1000DirectCostFunc','rx_P - elec_P','MWt','rx_P, elec_P',NULL); +CREATE TABLE mirror_acco ( + ind INTEGER DEFAULT NULL, + code_of_account TEXT NOT NULL, + account_description text, + total_cost REAL DEFAULT NULL, + total_cost_dollars REAL DEFAULT NULL, + level INTEGER DEFAULT NULL, + prn REAL DEFAULT NULL, + supaccount text, + alg_name text, + fun_unit text, + variables text, + algno text, review_status TEXT, + PRIMARY KEY (code_of_account) +); +INSERT INTO "mirror_acco" VALUES(1,'10','Pre-Construction_Costs',24.18611754,'$24186117.540000003',0,4.687831810420024433e-03,'','ac10','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(2,'11','Land_and_Land_Rights',1.18611754,'$1186117.5399999998',1,2.298971517736676198e-04,'1','ac11','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(3,'12','Site_Permits',10.0,'$10000000.0',1,1.938232460281024469e-03,'1','ac12','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(4,'13','Plant_Licensing',0.0,'$0.0',1,0.0,'1','ac13','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(5,'14','Plant_Permits',5.0,'$5000000.0',1,9.69116230140512235e-04,'1','ac14','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(6,'15','Plant_Studies',5.0,'$5000000.0',1,9.69116230140512235e-04,'1','ac15','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(7,'16','Plant_Reports',2.0,'$2000000.0',1,3.876464920562048719e-04,'1','ac16','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(8,'17','Other_Pre-Construction_Costs',1.0,'$1000000.0',1,1.938232460281024359e-04,'1','ac17','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,'$0.0',1,0.0,'1','ac19','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298.175963,'$1298175963.0',0,2.516166790643177831e-01,'','ac20','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(11,'21','Structures_and_Improvements',112.9457941,'$112945794.1',1,2.189152043768370289e-02,'2','ac21','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(12,'21.1','Site_Preparation/Yard_Work',42.37641442,'$42376414.42',2,8.213534197916488519e-03,'21','ac21.1','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(13,'21.2','Heat_Island_Building',29.53699334,'$29536993.34',2,5.724955927069242875e-03,'21','ac21.2','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(14,'21.3','Turbine_Generator_Building',8.538531265,'$8538531.264999999',2,1.654965846094739622e-03,'21','ac21.3','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(15,'21.4','Heat_Exchanger_Building',5.976971885,'$5976971.885',2,1.158476092169406302e-03,'21','ac21.4','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(16,'21.5','Power_Supply_and_Energy_Storage',1.707706253,'$1707706.253',2,3.309931692189479568e-04,'21','ac21.5','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(17,'21.6','Reactor_Auxiliaries',0.8538531265,'$853853.1265',2,1.654965846094739784e-04,'21','ac21.6','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(18,'21.7','Hot_Cell',14.76849667,'$14768496.67',2,2.862477963534621437e-03,'21','ac21.7','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(19,'21.8','Reactor_Services',2.956861753,'$2956861.753',2,5.731085430228053398e-04,'21','ac21.8','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(20,'21.9','Service_Water',0.0474362848,'$47436.2848',2,9.194254699449536794e-06,'21','ac21.9','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(21,'21.10','Fuel_Storage',0.1739330443,'$173933.0443',2,3.371226723777574368e-05,'','ac21.10','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(22,'21.11','Control_Room',0.1423088544,'$142308.85439999998',2,2.758276409834860699e-05,'211','ac21.11','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(23,'21.12','Onsite_AC_Power',0.1264967595,'$126496.7595',2,2.45180125383262035e-05,'211','ac21.12','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(24,'21.13','Administration',0.6957321771,'$695732.1771',2,1.348490689317206382e-04,'211','ac21.13','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(25,'21.14','Site_Services',0.252993519,'$252993.519',2,4.903602507665240699e-05,'211','ac21.14','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(26,'21.15','Cryogenics',0.3794902784,'$379490.2784',2,7.35540375955963e-05,'211','ac21.15','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(27,'21.16','Security',0.1423088544,'$142308.85439999998',2,2.758276409834860699e-05,'211','ac21.16','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(28,'21.17','Ventilation_Stack',4.269265632,'$4269265.632',2,8.274829229504581827e-04,'211','ac21.17','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(29,'22','Heat_Island_Plant_Equipment',1111.99892,'$1111998920.0',1,2.155312402541442185e-01,'2','ac22','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(30,'22.1','Heat_Island_Components',901.9675668,'$901967566.8',2,1.748222816092453169e-01,'22','ac22.1','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(31,'22.1.1','First_Wall_and_Blanket',43.19343421,'$43193434.21',3,8.37189162568348702e-03,'221','ac22.1.1','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(32,'22.1.2','Magnet_Radiation_Shield',94.73695574,'$94736955.74',3,1.836222428034747084e-02,'221','ac22.1.2','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(33,'22.1.3','Coils',272.0399768,'$272039976.79999995',3,5.272767135278567941e-02,'221','ac22.1.3','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(34,'22.1.3.1','HF_Coils',116.4,'$116400000.0',4,2.256102583767112534e-02,'2213','ac22.1.3.1','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(35,'22.1.3.2','LF_Coils',12.50524,'$12505240.0',4,2.42380620916046773e-03,'2213','ac22.1.3.2','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(36,'22.1.3.3','CC_Coils',143.1347368,'$143134736.8',4,2.774283930595409022e-02,'2213','ac22.1.3.3','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(37,'22.1.4','Supplemental_Heating',227.453,'$227453000.0',3,4.408567877882998281e-02,'221','ac22.1.4','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(38,'22.1.4.1','NBI',105.963,'$105963000.0',4,2.05380926188758195e-02,'2214','ac22.1.4.1','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(39,'22.1.4.2','ICRH',41.49,'$41490000.0',4,8.041726477705971043e-03,'2214','ac22.1.4.2','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(40,'22.1.4.3','ECH',80.0,'$80000000.0',4,1.550585968224819574e-02,'2214','ac22.1.4.3','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(41,'22.1.5','Primary_Structure_and_Support',0.0,'$0.0',3,0.0,'221','ac22.1.5','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(42,'22.1.6','Vacuum_System',2.031827257,'$2031827.2570000002',3,3.938153543201155615e-04,'221','ac22.1.6','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(43,'22.1.6.2','Vessel_Refrigerators',0.0,'$0.0',4,0.0,'2216','ac22.1.6.2','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(44,'22.1.6.3','Primary_Vacuum_Pumps',1.689827257,'$1689827.257',4,3.275278041785044783e-04,'2216','ac22.1.6.3','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(45,'22.1.6.4','Backing_Vacuum_Pumps',0.342,'$342000.0',4,6.628755014161104265e-05,'2216','ac22.1.6.4','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(46,'22.1.7','Power_Supplies',0.0,'$0.0',3,0.0,'221','ac22.1.7','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(47,'22.1.8','Divertor',0.0,'$0.0',3,0.0,'221','ac22.1.8','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(48,'22.1.9','Direct_Energy_Convertor',109.3171648,'$109317164.8',3,2.118820772812501919e-02,'221','ac22.1.9','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(49,'22.1.11','Assembly_and_Installation_Costs',153.1952079,'$153195207.9',3,2.969279247112800724e-02,'2211','ac22.1.11','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(50,'22.2','Main_and_Secondary_Coolant',33.6494515,'$33649451.5',2,0.0065220459167952,'22','ac22.2','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(51,'22.3','Auxiliary_Cooling_Systems',0.3521982635,'$352198.2635',2,6.826421067703095135e-05,'22','ac22.3','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(52,'22.4','Radioactive_Waste_Treatment',0.6275532695,'$627553.2695',2,1.216344117500385732e-04,'22','ac22.4','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(53,'22.5','Fuel_Handling_and_Storage',88.65405229,'$88654052.28999999',2,1.718321618839292741e-02,'22','ac22.5','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(54,'22.6','Other_Heat_Island_Equipment',1.748097852,'$1748097.852',2,3.388220000493933943e-04,'22','ac22.6','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(55,'22.7','Instrumentation_and_Control',85.0,'$85000000.0',2,1.647497591238870906e-02,'22','ac22.7','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(56,'23','Turbine_Plant_Equipment',39.82276109,'$39822761.09',1,7.718576820265415049e-03,'2','ac23','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(57,'24','Electric_Plant_Equipment',9.819310954,'$9819310.954',1,1.903210722863583459e-03,'2','ac24','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(58,'25','Miscellaneous_Plant_Equipment',6.909885486,'$6909885.4860000005',1,1.339296434578992169e-03,'2','ac25','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(59,'26','Heat_Rejection',11.67929132,'$11679291.32',1,2.263718154950241507e-03,'2','ac26','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(60,'27','Special_Materials',0.0,'$0.0',1,0.0,'2','ac27','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(61,'28','Digital_Twin/Simulator',5.0,'$5000000.0',1,9.69116230140512235e-04,'2','ac28','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,'$0.0',1,0.0,'2','ac29','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71.59197058,'$71591970.58',0,1.387618812736401107e-02,'','ac30','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(64,'31','Field_Indirect_Costs',14.31839412,'$14318394.120000001',1,2.775237626248095324e-03,'3','ac31','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(65,'32','Construction_Supervision',35.79598529,'$35795985.29',1,6.938094063682005535e-03,'3','ac32','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(66,'33','Commissioning_and_Start-Up_Costs',0.0,'$0.0',1,0.0,'3','ac33','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(67,'34','Demonstration_Test_Run',0.0,'$0.0',1,0.0,'3','ac34','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(68,'35','Design_Services_Offsite',21.47759117,'$21477591.17',1,4.162856437433910644e-03,'3','ac35','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(69,'36','PM/CM_Services_Offsite',0.0,'$0.0',1,0.0,'3','ac36','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(70,'37','Design_Servies_Offsite',0.0,'$0.0',1,0.0,'3','ac37','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(71,'38','PM/CM_Services_Onsite',0.0,'$0.0',1,0.0,'3','ac38','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(72,'39','Contingency_on_Support_Services',0.0,'$0.0',1,0.0,'3','ac39','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',155.7811156,'$155781115.6',0,3.019400149547106504e-02,'','ac40','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',37.83719261,'$37837192.61',0,0.00733372749226073,'','ac50','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(75,'51','Shipping_and_Transportation_Costs',8.0,'$8000000.0',1,1.550585968224819487e-03,'5','ac51','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(76,'52','Spare_Parts',7.323124886,'$7323124.886',1,1.419391836473697482e-03,'5','ac52','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(77,'53','Taxes',0.0,'$0.0',1,0.0,'5','ac53','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(78,'54','Insurance',1.0,'$1000000.0',1,1.938232460281024359e-04,'5','ac54','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(79,'55','Initial_Fuel_Load',21.51406772,'$21514067.72',1,4.169926440758816612e-03,'5','ac55','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(80,'58','Decommissioning_Costs',0.0,'$0.0',1,0.0,'5','ac58','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(81,'59','Contingency_on_Supplementary_Costs',0.0,'$0.0',1,0.0,'5','ac59','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',195.4094412,'$195409441.20000002',0,3.787489219792161688e-02,'','ac60','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(83,'61','Escalation',20.125,'$20125000.0',1,3.900692826315561857e-03,'6','ac61','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(84,'62','Fees',0.0,'$0.0',1,0.0,'6','ac62','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(85,'63','Interest_During_Construction_(IDC)',175.2844412,'$175284441.20000002',1,3.397419937160605503e-02,'6','ac63','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,'$0.0',1,0.0,'6','ac69','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1587.572359,'$1587572359.0',0,0.307708427925872,'OC','acOCC','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(88,'TCC','Total_Capital_Cost_(TCC)',1782.981801,'$1782981801.0',0,3.455833202788521908e-01,'TC','acTCC','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(89,'O&M','Operations_and_Maintenance',5.69490028,'$5694900.279999999',0,1.103804058075949327e-03,'O&','acO&M','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(90,'Fuel','Fuel',0.1090042081,'$109004.2081',0,2.112754944466477681e-05,'Fue','acFuel','million','','','Unchanged'); +INSERT INTO "mirror_acco" VALUES(91,'81','Deuterium',0.04739117657,'$47391.176569999996',1,9.185511675888353413e-06,'8','ac81','million','','','Unchanged'); +CREATE TABLE mirror_alg ( + ind INTEGER DEFAULT NULL, + alg_name TEXT NOT NULL, + alg_for text, + alg_description text, + alg_python text, + alg_formulation text, + alg_units text, + PRIMARY KEY (alg_name) +); +INSERT INTO "mirror_alg" VALUES(1,'__init__','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(2,'add_account','v','Add an account to the cost_account object.','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(3,'generate_report','v','Generate a report based on user input.','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(4,'learning_credit','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(13,'Account_C21_7','c','Account C217 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(14,'Account_C21_8','c','Account C218 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(15,'Account_C21_9','c','Account C219 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(16,'Account_C21_10','c','Account C2110 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(17,'Account_C21_11','c','Account C2111 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(18,'Account_C21_12','c','Account C2112 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(19,'Account_C21_13','c','Account C2113 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(20,'Account_C21_14','c','Account C2114 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(21,'Account_C21_15','c','Account C2115 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(22,'Account_C21_16','c','Account C2116 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(23,'Account_C21_17','c','Account C2117 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(24,'Account_C22','c','Account C22 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(25,'Account_C22_1','c','Account C221 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(37,'Account_C22_1_6','c','Account C2216 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(38,'Account_C22_1_6_2','c','Account C22162 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(47,'Account_C22_2_2','c','Account C2222 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(48,'Account_C22_2_3','c','Account C2223 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(50,'Account_C22_4','c','Account C224 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(52,'Account_C22_6','c','Account C226 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(53,'Account_C22_7','c','Account C227 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(58,'Account_C27','c','Account C27 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(59,'Account_C28','c','Account C28 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(60,'Account_C29','c','Account C29 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(61,'Account_OCC','c','Account OCC Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(62,'Account_TCC','c','Account TCC Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(63,'Account_C90','c','Account C90 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(64,'PbLi_density','v','Returns PbLi density (kg/m^3). Assumes the PbLi is a eutectic, which has','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(65,'Li_price','v','Return Li price (USD/kg) for enrichment levels above 90% 6Li','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(66,'PbLi_price','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(67,'V_cylindrical_shell','v','Return volume of a cylindrical shell','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(68,'V_inverse_triangular_washer','v','Return volume of cylindrical inverse triangular washer.','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(69,'generate_inputs','v','Return a dict containing all inputs for a techno-economic analysis.','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(70,'create_radial_build','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(71,'add_new_layer','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(72,'add_fractional_layer','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(73,'build_central_cell','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(74,'central_cell_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(75,'central_cell','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(76,'expander_cell_cost','v','Each expander cell is made up of:','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(77,'HF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(78,'LF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(79,'CF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO "mirror_alg" VALUES(80,'HF_magnet_shield_cost','v','The HF coils have annular shield with a U-shaped cross section:','MirrorFunc','TODO','TODO'); +CREATE TABLE mirror_var ( + ind INTEGER DEFAULT NULL, + var_name TEXT NOT NULL, + var_description text, + var_value REAL DEFAULT NULL, + var_unit text, + var_alg text, + var_need text, + v_linked text, + user_input INTEGER DEFAULT NULL, + PRIMARY KEY (var_name) +); +INSERT INTO "mirror_var" VALUES(1,'E_DT','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(2,'E_alpha','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(3,'E_n','str','','TODO','E_DT, E_alpha','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(4,'m_T','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(5,'m_D','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(6,'m_6Li','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(7,'Wh_to_BTU','float',3.41214,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(8,'indentation','INTEGER',0.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(9,'indented_name','str','','TODO','account_name, account_number, indentation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(10,'inputs','str','','TODO','NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(11,'cost_data','str','','TODO','cost_account','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(12,'L_magnet_to_magnet','str','','TODO','inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(13,'L_cylinder','str','','TODO','L_magnet_to_magnet','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(14,'expander_cell_cost_result','str','','TODO','expander_cell_cost, inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(15,'end_plug_cylindrical_part','str','','TODO','L_cylinder, central_cell, inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(16,'end_plug_cylindrical_part_cost','str','','TODO','end_plug_cylindrical_part','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(17,'central_cell_cylindrical_part','str','','TODO','central_cell, inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(18,'central_cell_cylindrical_part_cost','str','','TODO','central_cell_cylindrical_part','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(19,'total_cost','str','','TODO','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(20,'cost_factor','str','','TODO','inputs, np','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(21,'cost_pump','INTEGER',40000.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(22,'vpump_cap','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(23,'no_vpumps','str','','TODO','inputs, vpump_cap','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(24,'axis_t','str','','TODO','inputs, np','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(25,'axis_ir','str','','TODO','axis_t','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(26,'lr','str','','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(27,'constructionworker','str','','TODO','axis_ir','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(28,'C_22_1_11_in','str','','TODO','inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(29,'C_22_1_11_1_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(30,'C_22_1_11_2_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(31,'C_22_1_11_3_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(32,'C_22_1_11_4_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(33,'C_22_1_11_5_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(34,'C_22_1_11_6_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(35,'C_22_1_11_7_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(36,'C_22_1_11_8_in','INTEGER',0.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(37,'C_22_1_11_9_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(38,'C_22_1_11_10_in','INTEGER',0.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(39,'C220111','str','','TODO','C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(40,'inflation','float',1.43,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(41,'C2205010ITER','str','','TODO','inflation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(42,'C2205020ITER','str','','TODO','inflation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(43,'C2205030ITER','str','','TODO','inflation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(44,'C2205040ITER','str','','TODO','inflation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(45,'C2205050ITER','str','','TODO','inflation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(46,'C2205060ITER','str','','TODO','inflation','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(47,'lcredit','float',0.8,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(48,'ltoak','str','','TODO','lcredit, np','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(49,'C220501','str','','TODO','C2205010ITER, ltoak','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(50,'C220502','str','','TODO','C2205020ITER, ltoak','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(51,'C220503','str','','TODO','C2205030ITER, ltoak','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(52,'C220504','str','','TODO','C2205040ITER, ltoak','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(53,'C220505','str','','TODO','C2205050ITER, ltoak','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(54,'C220506','str','','TODO','C2205060ITER, ltoak','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(55,'C220500','str','','TODO','C220501, C220502, C220503, C220504, C220505, C220506','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(56,'f_cr','float',0.09,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(57,'f_6Li_natural','float',0.075,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(58,'rho_6Li','float',460.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(59,'rho_7Li','float',537.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(60,'T_K','str','','TODO','T','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(61,'rho_PbLi','str','','TODO','T_K','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(62,'P_6Li075','float',15.152,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(63,'P_6Li90','INTEGER',70.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(64,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(65,'Cf','list','(1, 2, 4, 8, 16)','TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(66,'f_interp','str','','TODO','Cf, f, scipy','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(67,'f_Li','float',0.17,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(68,'f_Pb','str','','TODO','f_Li','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(69,'P_Li','str','','TODO','Li_price, f_6Li','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(70,'P_PbLi','str','','TODO','P_Li, P_Pb, f_Li, f_Pb','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(71,'P_f_CC','str','','TODO','P_f, P_f_EP','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(72,'L_CC','str','','TODO','P_f_CC, P_f_L','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(73,'L_CF','float',1.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(74,'L','str','','TODO','L_CC, L_EC, L_EP','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(75,'V_vac','str','','TODO','L, a_EC, np','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(76,'P_alpha','str','','TODO','E_DT, E_alpha, P_f','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(77,'P_n','str','','TODO','P_alpha, P_f','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(78,'P_ine','str','','TODO','P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(79,'P_pump','str','','TODO','M_n, P_n, f_pump','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(80,'P_sub_cont','str','','TODO','P_f, f_sub','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(81,'P_cryo','str','','TODO','P_f, f_cryo','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(82,'P_other','str','','TODO','P_cryo, P_pump, P_sub_cont','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(83,'P_in','str','','TODO','P_ECH, P_ICRH, P_NBI','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(84,'P_th','str','','TODO','M_n, P_n, P_pump, eta_pump','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(85,'P_the','str','','TODO','P_th, eta_th','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(86,'P_DEC','str','','TODO','P_alpha, P_in','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(87,'P_DECe','str','','TODO','P_DEC, eta_DEC','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(88,'P_egross','str','','TODO','P_DECe, P_the','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(89,'P_enet','str','','TODO','P_egross, P_ine, P_other','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(90,'f_aux','str','','TODO','P_aux, P_egross','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(91,'Q_sci','str','','TODO','P_f, P_in','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(92,'Q_eng','str','','TODO','P_egross, P_ine, P_other','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(93,'f_refrac','str','','TODO','Q_eng','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(94,'run_name','str','','TODO','P_f, float','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(95,'cost_file_full','str','','TODO','cost_file, pkg_resources','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(96,'new_data','str','','TODO','f_vol, material, name, pd, thickness','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(97,'r_in','str','','TODO','data','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(98,'r_out','str','','TODO','data','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(99,'radial_build','str','','TODO','create_radial_build, inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(100,'filename','str','','TODO','inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(101,'T','INTEGER',300.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(102,'material','str','','TODO','i, radial_build','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(103,'f_6Li','float',0.075,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(104,'radius','str','','TODO','inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(105,'thickness','str','','TODO','inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(106,'vv_material','str','','TODO','inputs','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(107,'V_end_cap','str','','TODO','np, radius, thickness','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(108,'M_end_cap','str','','TODO','V_end_cap, cost_data, vv_material','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(109,'C_end_cap','str','','TODO','M_end_cap, cost_data, vv_material','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(110,'total','str','','TODO','C_end_cap, radial_build','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(111,'cost','float',29.1,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(112,'a_M','float',0.15,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(113,'a_CC','float',0.54,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(114,'a_0','float',0.7,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(115,'length','float',0.5,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(116,'r_gap','float',0.1,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(117,'r_vv','float',0.01,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(118,'r_magnet','float',1.5,'m','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(119,'r_cryostat','float',1.0,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(120,'f_vol','float',0.9,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(121,'V_radially_inner_cylinder','str','','TODO','V_cylindrical_shell, f_vol, length, r_in, r_out','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(122,'length_cc_cylinder','float',0.5,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(123,'r_in_cc','str','','TODO','a_CC, r_gap, r_vv','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(124,'r_out_cc','str','','TODO','r_in_cc','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(125,'V_cc_cylinder','str','','TODO','V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(126,'V_cc_triangle','str','','TODO','V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(127,'length_ep_cylinder','float',0.5,'TODO','','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(128,'r_in_ep','str','','TODO','a_0, r_gap, r_vv','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(129,'r_out_ep','str','','TODO','r_in_ep','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(130,'V_ep_cylinder','str','','TODO','V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(131,'V_ep_triangle','str','','TODO','V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(132,'V_total_cc_facing','str','','TODO','V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(133,'V_total_ec_facing','str','','TODO','V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(134,'V_total','str','','TODO','V_total_cc_facing, V_total_ec_facing','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(135,'mass','str','','TODO','V_total, cost_data, material','TODO','TODO',''); COMMIT; diff --git a/src/etc/accert.sch b/src/etc/accert.sch index 63526c3..e251ad0 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -85,7 +85,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 1 @@ -193,7 +193,7 @@ accert{ MinOccurs = 0 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names] } var{ Description = "changed variable value" @@ -207,7 +207,7 @@ accert{ ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names - REF:stellarator_var_names REF:lpsr_var_names] + REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 0 @@ -231,7 +231,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -242,7 +242,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 1 @@ -267,7 +267,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -277,7 +277,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 0 @@ -300,7 +300,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -310,7 +310,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 1 @@ -360,7 +360,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -370,7 +370,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 0 @@ -393,7 +393,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -403,7 +403,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 1 @@ -435,7 +435,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -445,7 +445,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 0 @@ -468,7 +468,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names ] + ValEnums = [ REF:user_defined_names REF:alg_names REF:fusion_alg_names REF:mirror_alg_names ] } var{ Description = "changed variable value" @@ -478,7 +478,7 @@ accert{ MinOccurs = 1 MaxOccurs = 1 ValType = String - ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names] + ValEnums =[ REF:user_defined_names REF:pwr_var_names REF:abr_var_names REF:containment_var_names REF:heatpipe_var_names REF:fusion_var_names REF:stellarator_var_names REF:lpsr_var_names REF:mirror_var_names] } value{ MinOccurs = 1 @@ -522,7 +522,7 @@ accert{ } EndOfSchema{} -ref_models = [ "PWR12-BE" "ABR1000" "AP1000" "LFR" "LPSR" "heatpipe" "fusion" "stellarator"] +ref_models = [ "PWR12-BE" "ABR1000" "AP1000" "LFR" "LPSR" "heatpipe" "fusion" "stellarator" "mirror"] power_type = ["Thermal" "Electric"] power_unit = ["W" "kWW" "MW"] total_cost_unit = ["million" "dollar"] @@ -797,6 +797,8 @@ heatpipe_var_names = ['land_surface_area' 'containment_subVolume' 'Containment_h fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'anncap' 'anncdr' 'anncp' 'anndecom' 'anndiv' 'annfuel' 'annfwbl' 'annoam' 'annwst' 'areaoh' 'awpoh' 'b0' 'bktlife' 'blmass' 'capcost' 'cconfix' 'cconshpf' 'cconshtf' 'cdcost' 'cdirt' 'cdriv0' 'cdriv1' 'cdriv2' 'cdriv3' 'cdrlife' 'cfactr' 'cfind_0' 'cfind_1' 'cfind_2' 'cfind_3' 'cland' 'clgsmass' 'cmlsa' 'coecdr' 'coecp' 'coediv' 'coefuel' 'coefwbl' 'coewst' 'coilmass' 'convol' 'coolmass' 'coolwh' 'cowner' 'cplife' 'cpstcst' 'cpttf' 'crfcdr' 'crfcp' 'crfdiv' 'crffwbl' 'crypmw' 'cryvol' 'csi' 'cturbb' 'd_0' 'd_1' 'd_2' 'd_3' 'dcdrv0' 'dcdrv1' 'dcdrv2' 'dcond_0' 'dcond_1' 'dcond_2' 'dcond_3' 'dcond_4' 'dcond_5' 'dcond_6' 'dcond_7' 'dcond_8' 'dcopper' 'decomf' 'dens' 'denstl' 'dintrt' 'discount_rate' 'divcst' 'divlife' 'divsur' 'dlscal' 'drbi' 'dtlife' 'dtstor' 'dvrtmass' 'ealphadt' 'echarge' 'echpwr' 'edrive' 'effrfss' 'elevol' 'ensxpfm' 'esbldgm3' 'estotftgj' 'etadrv' 'expcry' 'expel' 'expepe' 'exphts' 'exprb' 'exprf' 'exptpe' 'faccd' 'faccdfix' 'fachtmw' 'fburn' 'fcap0' 'fcap0cp' 'fcdfuel' 'fcontng' 'fcr0' 'fcsht' 'fcuohsu' 'fcupfsu' 'fefcdr' 'fefcp' 'fefdiv' 'feffwbl' 'fhe3' 'fkind' 'fncmass' 'fndt' 'ftrit' 'fusionrate' 'fwallcst' 'fwarea' 'fwbllife' 'fwmass' 'fwmatm' 'gain' 'gsmass' 'hccl' 'hcwt' 'helpow' 'hrbi' 'i_tf_sc_mat' 'i_tf_sup' 'iblanket' 'iefrf' 'ife' 'ifedrv' 'ifueltyp' 'imax' 'intercoil_surface' 'iohcl' 'ipfres' 'ireactor' 'istore' 'isumatoh' 'isumatpf' 'itart' 'l1' 'lpulse' 'lsa' 'ltot' 'mbvfac' 'mcdriv' 'n_day_year' 'n_tf' 'n_tf_turn' 'nohc' 'nphx' 'ntype' 'nvduct' 'oh_steel_frac' 'pacpmw' 'palpnb' 'peakmva' 'pfbldgm3' 'pfckts' 'pfmass' 'pfwdiv' 'pfwndl' 'pgrossmw' 'pheat' 'pibv' 'pinjht' 'pinjwp' 'plascur' 'plhybd' 'pnbitot' 'pnetelmw' 'pnucblkt' 'pnucshld' 'powfmw' 'pthermmw' 'r0' 'rbrt' 'rbvfac' 'rbvol' 'rbwt' 'reprat' 'ric_0' 'ric_1' 'ric_2' 'ric_3' 'ric_4' 'ric_5' 'ric_6' 'rjconpf_0' 'rjconpf_1' 'rjconpf_10' 'rjconpf_11' 'rjconpf_12' 'rjconpf_13' 'rjconpf_14' 'rjconpf_15' 'rjconpf_16' 'rjconpf_17' 'rjconpf_18' 'rjconpf_19' 'rjconpf_2' 'rjconpf_20' 'rjconpf_21' 'rjconpf_3' 'rjconpf_4' 'rjconpf_5' 'rjconpf_6' 'rjconpf_7' 'rjconpf_8' 'rjconpf_9' 'rmbvol' 'rndfuel' 'rpf_0' 'rpf_1' 'rpf_2' 'rpf_3' 'rpf_4' 'rpf_5' 'rpf_6' 'shh' 'shldmass' 'shm' 'shmatm' 'shmf' 'shovol' 'shri' 'shro' 'sigal' 'spfbusl' 'srcktpm' 'st_f_b' 'st_f_n' 'st_f_r' 'stcl' 'stella_config_coillength' 'stella_config_coilsurface' 'targtm' 'tburn' 'tcycle' 'tdown' 'tdspmw' 'tf_h_width' 'tfacmw' 'tfbusl' 'tfbusmas' 'tfcbv' 'tfckw' 'tfcmw' 'tfhmax' 'tfleng' 'tfmass' 'tftort' 'tlife' 'tlvpmw' 'tmpcry' 'trcl' 'trithtmw' 'triv' 'turns_0' 'turns_1' 'turns_2' 'turns_3' 'turns_4' 'turns_5' 'turns_6' 'twopi' 'ucad' 'ucaf' 'ucahts' 'ucap' 'ucblbe' 'ucblbreed' 'ucblli' 'ucblli2o' 'ucbllipb' 'ucblss' 'ucblvd' 'ucbpmp' 'ucbus' 'uccarb' 'uccase' 'ucco' 'ucconc' 'uccpcl1' 'uccpclb' 'uccpmp' 'uccr' 'uccry' 'uccryo' 'uccu' 'ucdgen' 'ucdiv' 'ucdtc' 'ucduct' 'ucech' 'ucel' 'ucf1' 'ucfnc' 'ucfpr' 'ucfuel' 'ucfwa' 'ucfwps' 'ucfws' 'ucgss' 'uche3' 'uchrs' 'uchts_0' 'uchts_1' 'uciac' 'ucich' 'ucint' 'uclh' 'uclv' 'ucmb' 'ucme' 'ucmisc' 'ucnbi' 'ucnbv' 'ucoam_0' 'ucoam_1' 'ucoam_2' 'ucoam_3' 'ucpens' 'ucpfb' 'ucpfbk' 'ucpfbs' 'ucpfcb' 'ucpfdr1' 'ucpfic' 'ucpfps' 'ucphx' 'ucpp' 'ucrb' 'ucsc_0' 'ucsc_1' 'ucsc_2' 'ucsc_3' 'ucsc_4' 'ucsc_5' 'ucsc_6' 'ucsc_7' 'ucsc_8' 'ucsh' 'ucshld' 'ucswyd' 'uctarg' 'uctfbr' 'uctfbus' 'uctfdr' 'uctfgr' 'uctfic' 'uctfps' 'uctfsw' 'uctpmp' 'uctr' 'ucturb_0' 'ucturb_1' 'ucvalv' 'ucvdsh' 'ucviac' 'ucwindpf' 'ucwindtf' 'ucws' 'ucwst_0' 'ucwst_1' 'ucwst_2' 'ucwst_3' 'umass' 'vacdshm' 'vachtmw' 'vcdimax' 'vf' 'vfohc' 'vol' 'volrci' 'vpfskv' 'vpumpn' 'vtfskv' 'vvmass' 'wgt2' 'whtblbe' 'whtblbreed' 'whtblli' 'whtblss' 'whtblvd' 'whtcas' 'whtconcu' 'whtconsc' 'whtcp' 'whtpfs' 'whtshld' 'whttflgs' 'wpenshld' 'wrbi' 'wsvfac' 'wsvol' 'wtblli2o' 'wtbllipb' 'wtgpd'] stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] +mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py new file mode 100644 index 0000000..dd0e7b8 --- /dev/null +++ b/src/scripts/build_mirror_accert_tables.py @@ -0,0 +1,139 @@ +"""Load Mirror ACCERT reference tables from a PR #50 MySQL dump. + +The closed upstream Mirror PR predated the SQLite database used by ACCERT. +This script converts the Mirror-specific MySQL tables into SQLite tables and +writes reference CSVs under tutorial/accert/ref_tables. +""" +from __future__ import annotations + +import argparse +import csv +import re +import shutil +import sqlite3 +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[2] +DEFAULT_DB = ROOT / "src" / "accertdb.sqlite" +DEFAULT_REF_DIR = ROOT / "tutorial" / "accert" / "ref_tables" +DEFAULT_SQL = DEFAULT_REF_DIR / "mirror_accertdb.sql" +DEFAULT_ALG_SRC = DEFAULT_REF_DIR / "MirrorFunc.py" +DEFAULT_SPLIT_ALG_SRC = DEFAULT_REF_DIR / "MirrorFunc_splitInputs.py" +DEFAULT_ALG_DST = ROOT / "src" / "Algorithm" / "MirrorFunc.py" +DEFAULT_SPLIT_ALG_DST = ROOT / "src" / "Algorithm" / "MirrorFunc_splitInputs.py" + +TABLES = { + "mirror_acco": "mirror_account.csv", + "mirror_alg": "mirror_algorithm.csv", + "mirror_var": "mirror_variable.csv", +} + +TYPE_REPLACEMENTS = ( + (re.compile(r"varchar\(\d+\)", re.IGNORECASE), "TEXT"), + (re.compile(r"\bint\b", re.IGNORECASE), "INTEGER"), + (re.compile(r"\bdouble\b", re.IGNORECASE), "REAL"), +) + + +def _sqlite_table_script(mysql_sql: str, table_name: str) -> str: + without_commented_create = re.sub( + rf"/\*CREATE TABLE `{table_name}`.*?\*/", + "", + mysql_sql, + flags=re.DOTALL, + ) + create = re.search( + rf"CREATE TABLE `{table_name}` \(.*?\) ENGINE=.*?;", + without_commented_create, + flags=re.DOTALL, + ) + insert = re.search( + rf"INSERT INTO `{table_name}` VALUES .*?;", + without_commented_create, + flags=re.DOTALL, + ) + if create is None or insert is None: + raise ValueError(f"Could not find CREATE/INSERT SQL for {table_name}") + + script = f"DROP TABLE IF EXISTS {table_name};\n{create.group(0)}\n{insert.group(0)}" + script = re.sub(r"/\*!.*?\*/;?", "", script, flags=re.DOTALL) + script = re.sub(r"\) ENGINE=.*?;", ");", script, flags=re.DOTALL) + script = script.replace("`", "") + for pattern, replacement in TYPE_REPLACEMENTS: + script = pattern.sub(replacement, script) + return script + + +def _columns(conn: sqlite3.Connection, table_name: str) -> list[str]: + return [row[1] for row in conn.execute(f"PRAGMA table_info({table_name})")] + + +def _write_csv(conn: sqlite3.Connection, table_name: str, path: Path) -> int: + rows = conn.execute(f"SELECT * FROM {table_name} ORDER BY 1").fetchall() + columns = _columns(conn, table_name) + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w", newline="", encoding="utf-8") as handle: + writer = csv.writer(handle) + writer.writerow(columns) + writer.writerows(rows) + return len(rows) + + +def load_mirror_tables( + db_path: Path, + ref_dir: Path, + sql_path: Path, + algorithm_source: Path, + algorithm_dest: Path, + split_algorithm_source: Path, + split_algorithm_dest: Path, +) -> None: + mysql_sql = sql_path.read_text(encoding="utf-8") + conn = sqlite3.connect(db_path) + try: + for table_name in TABLES: + conn.executescript(_sqlite_table_script(mysql_sql, table_name)) + conn.execute("ALTER TABLE mirror_acco ADD COLUMN review_status TEXT") + conn.execute("UPDATE mirror_acco SET review_status = 'Unchanged'") + conn.execute( + "UPDATE mirror_var SET var_unit = ? WHERE var_name = ?", + ("m", "r_magnet"), + ) + conn.commit() + for table_name, file_name in TABLES.items(): + count = _write_csv(conn, table_name, ref_dir / file_name) + print(f"Wrote {count} {table_name} rows.") + finally: + conn.close() + + algorithm_dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(algorithm_source, algorithm_dest) + shutil.copy2(split_algorithm_source, split_algorithm_dest) + print(f"Copied {algorithm_source} to {algorithm_dest}.") + print(f"Copied {split_algorithm_source} to {split_algorithm_dest}.") + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--db", default=str(DEFAULT_DB)) + parser.add_argument("--ref-dir", default=str(DEFAULT_REF_DIR)) + parser.add_argument("--sql", default=str(DEFAULT_SQL)) + parser.add_argument("--algorithm-source", default=str(DEFAULT_ALG_SRC)) + parser.add_argument("--algorithm-dest", default=str(DEFAULT_ALG_DST)) + parser.add_argument("--split-algorithm-source", default=str(DEFAULT_SPLIT_ALG_SRC)) + parser.add_argument("--split-algorithm-dest", default=str(DEFAULT_SPLIT_ALG_DST)) + args = parser.parse_args() + load_mirror_tables( + Path(args.db).resolve(), + Path(args.ref_dir).resolve(), + Path(args.sql).resolve(), + Path(args.algorithm_source).resolve(), + Path(args.algorithm_dest).resolve(), + Path(args.split_algorithm_source).resolve(), + Path(args.split_algorithm_dest).resolve(), + ) + + +if __name__ == "__main__": + main() diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py new file mode 100644 index 0000000..e07042a --- /dev/null +++ b/test/test_mirror_model.py @@ -0,0 +1,60 @@ +import csv +from pathlib import Path +from types import SimpleNamespace + +from Main import Accert + + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +REF_DIR = PROJECT_ROOT / "tutorial" / "accert" / "ref_tables" + + +def _csv_row_count(path: Path) -> int: + with path.open(newline="", encoding="utf-8") as handle: + return sum(1 for _ in csv.DictReader(handle)) + + +def test_mirror_reference_tables_loaded(cursor): + expected = { + "mirror_acco": REF_DIR / "mirror_account.csv", + "mirror_alg": REF_DIR / "mirror_algorithm.csv", + "mirror_var": REF_DIR / "mirror_variable.csv", + } + for table_name, csv_path in expected.items(): + cursor.execute(f"SELECT COUNT(*) FROM {table_name}") + assert cursor.fetchone()[0] == _csv_row_count(csv_path) + + +def test_mirror_setup_table_names(): + accert = Accert.__new__(Accert) + accert.use_gncoa = False + accert.target_dollar_year = 2017 + input_obj = SimpleNamespace( + ref_model=SimpleNamespace(value="mirror"), + use_gncoa=None, + target_dollar_year=None, + ) + + accert.setup_table_names(input_obj) + + assert accert.ref_model == "mirror" + assert accert.acc_tabl == "mirror_acco" + assert accert.cel_tabl is None + assert accert.var_tabl == "mirror_var" + assert accert.alg_tabl == "mirror_alg" + + +def test_mirror_variable_update_uses_reference_table(cursor): + accert = Accert.__new__(Accert) + accert.var_tabl = "mirror_var" + + assert accert.update_input_variable(cursor, "r_magnet", 2.0, "m") is None + cursor.execute( + """ + SELECT var_value, var_unit, user_input + FROM mirror_var + WHERE var_name = ?; + """, + ("r_magnet",), + ) + assert cursor.fetchone() == (2.0, "m", 1) diff --git a/test/test_sqlite.py b/test/test_sqlite.py index 144c065..5860d02 100644 --- a/test/test_sqlite.py +++ b/test/test_sqlite.py @@ -26,6 +26,9 @@ def test_database_tables_exist(cursor): "cost_element", "escalation", "facility", + "mirror_acco", + "mirror_alg", + "mirror_var", "variable", }.issubset(tables) @@ -117,6 +120,41 @@ def test_table_columns(cursor): "escalation_name", "escalation_factorsValue", }, + "mirror_acco": { + "ind", + "code_of_account", + "account_description", + "total_cost", + "total_cost_dollars", + "level", + "prn", + "supaccount", + "alg_name", + "fun_unit", + "variables", + "algno", + "review_status", + }, + "mirror_alg": { + "ind", + "alg_name", + "alg_for", + "alg_description", + "alg_python", + "alg_formulation", + "alg_units", + }, + "mirror_var": { + "ind", + "var_name", + "var_description", + "var_value", + "var_unit", + "var_alg", + "var_need", + "v_linked", + "user_input", + }, "variable": { "ind", "var_name", diff --git a/tutorial/accert/Mirror.son b/tutorial/accert/Mirror.son new file mode 100644 index 0000000..627db26 --- /dev/null +++ b/tutorial/accert/Mirror.son @@ -0,0 +1,9 @@ +% ACCERT Test input file +% Author: J. Zhou (jia.zhou@anl.gov) +% Last updated: 08/08/2024 + + +accert{ + ref_model = "mirror" + var("r_magnet"){value = 2.0 unit = "m"} +} diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py new file mode 100644 index 0000000..e438257 --- /dev/null +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -0,0 +1,1557 @@ +import numpy as np +import pandas as pd +import scipy +import json +import math +import pkg_resources +from .Algorithm import Algorithm + +### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples +class MirrorFunc(Algorithm): + + # Physical constants + E_DT = 17.59e6 * 1.60218*10**-19 # J + E_alpha = 3.52e6 * 1.60218*10**-19 # J + E_n = E_DT - E_alpha # J + m_T = 3.01604928 * 1.66053907*10**-27 # kg, triton mass + m_D = 2.01410177811 * 1.66053907*10**-27 # kg, deuteron mass + m_6Li = 6.0151228874 * 1.66053907*10**-27 # kg, lithium-6 mass + + # Conversion factors + Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU + + def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): + super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) + + def run(self, inputs: dict) -> float: + """ + Executes the algorithm specified by the name in the instance variables. + + Parameters: + inputs (dict): Dictionary of input variables required for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + # run the algorithm use self.name not self.alg_name + return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) + + def _run_algorithm(self, alg_name: str, variables: list) -> float: + """ + Runs the specified algorithm with given variables. + + Parameters: + alg_name (str): The name of the algorithm to run. + variables (list): List of input variables for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + try: + algorithm = getattr(self, alg_name) + return algorithm(*variables) + except AttributeError: + raise ValueError(f"Algorithm {alg_name} not found") + + ### Account Methods: ### + @staticmethod + def Account_C20(inputs): + return( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs) + + MirrorFunc.Account_C29(inputs) + ) + + @staticmethod + def Account_C21(inputs): + return( + MirrorFunc.Account_C21_1(inputs) + + MirrorFunc.Account_C21_2(inputs) + + MirrorFunc.Account_C21_3(inputs) + + MirrorFunc.Account_C21_4(inputs) + + MirrorFunc.Account_C21_5(inputs) + + MirrorFunc.Account_C21_6(inputs) + + MirrorFunc.Account_C21_7(inputs) + + MirrorFunc.Account_C21_8(inputs) + + MirrorFunc.Account_C21_9(inputs) + + MirrorFunc.Account_C21_10(inputs) + + MirrorFunc.Account_C21_11(inputs) + + MirrorFunc.Account_C21_12(inputs) + + MirrorFunc.Account_C21_13(inputs) + + MirrorFunc.Account_C21_14(inputs) + + MirrorFunc.Account_C21_15(inputs) + + MirrorFunc.Account_C21_16(inputs) + + MirrorFunc.Account_C21_17(inputs) + ) + + @staticmethod + def Account_C21_1(inputs): + # Site Preparation/Yard Work + return(inputs['Gross Electric Power'] * 268/1e3) + + @staticmethod + def Account_C21_2(inputs): + # Heat Island Building + return(inputs['Gross Electric Power'] * 186.8/1e3) + + @staticmethod + def Account_C21_3(inputs): + # Turbine Generator Building + if inputs['Application'].lower()=='electricity': + return(inputs['Gross Electric Power'] * 54.0/1e3) + else: + return(0) + + @staticmethod + def Account_C21_4(inputs): + # Heat Exchanger Building + return(37.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, + def Account_C21_5(inputs): + # Power Supply and Energy Storage + return(10.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, + def Account_C21_6(inputs): + # Reactor Auxiliaries + return(5.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, + def Account_C21_7(inputs): + # Hot Cell + return(93.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, + def Account_C21_8(inputs): + # Reactor Services + return(18.7/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, + def Account_C21_9(inputs): + # Service Water + return(0.3/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, + def Account_C21_10(inputs): + # Fuel Storage + return(1.1/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_11(inputs): + # Control Room + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, + def Account_C21_12(inputs): + # Onsite AC Power + return(0.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, + def Account_C21_13(inputs): + # Administration + return(4.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, + def Account_C21_14(inputs): + # Site Services + return(1.6/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, + def Account_C21_15(inputs): + # Cyrogenics + return(2.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_16(inputs): + # Security + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, + def Account_C21_17(inputs): + # Ventilation Stack + return(27.0/1e3 * inputs['Gross Electric Power']) + + + @staticmethod + def Account_C22(inputs): + # Rollup + return( + MirrorFunc.Account_C22_1(inputs) + + MirrorFunc.Account_C22_2(inputs) + + MirrorFunc.Account_C22_3(inputs) + + MirrorFunc.Account_C22_4(inputs) + + MirrorFunc.Account_C22_5(inputs) + + MirrorFunc.Account_C22_6(inputs) + + MirrorFunc.Account_C22_7(inputs) + ) + + + @staticmethod + def Account_C22_1(inputs): + # This is a special case and is NOT calculated using Woodruff's model, + # However, I maintained the naming convention for convenience + # Rollup + return( + MirrorFunc.Account_C22_1_1(inputs) + + MirrorFunc.Account_C22_1_2(inputs) + + MirrorFunc.Account_C22_1_3(inputs) + + MirrorFunc.Account_C22_1_4(inputs) + + MirrorFunc.Account_C22_1_5(inputs) + + MirrorFunc.Account_C22_1_6(inputs) + + MirrorFunc.Account_C22_1_7(inputs) + + MirrorFunc.Account_C22_1_8(inputs) + + MirrorFunc.Account_C22_1_9(inputs) + + MirrorFunc.Account_C22_1_11(inputs) + ) + + @staticmethod + def Account_C22_1_1(inputs): + # First Wall and Blanket (and vacuum vessel) + + L_magnet_to_magnet = inputs['End Plug Length'] + + L_cylinder = L_magnet_to_magnet + + expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) + + end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) + end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() + + central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) + central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() + + total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result + + return(total_cost/1e6) + + @staticmethod + def Account_C22_1_2(inputs): + # Magnet Radiation Shield + # Factor of two for each end plug + return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) + + @staticmethod + def Account_C22_1_3(inputs): + # Coils + # Rollup + return( + MirrorFunc.Account_C22_1_3_1(inputs) + + MirrorFunc.Account_C22_1_3_2(inputs) + + MirrorFunc.Account_C22_1_3_3(inputs) + ) + + # @staticmethod + def Account_C22_1_3_1(inputs): + # HF Coils - Quantity 4 + # 2 per end cell + # 2 end cells per tandem + return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_2(inputs): + # LF Coils - Quantity 8 + # 4 per end cell + # 2 end cells per tandem + return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_3(inputs): + # CF Coils + # One coil every L_CF m of Central Cell + return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_4(inputs): + # Supplemenatry Heating + # Rollup + return( + MirrorFunc.Account_C22_1_4_1(inputs) + + MirrorFunc.Account_C22_1_4_2(inputs) + + MirrorFunc.Account_C22_1_4_3(inputs) + ) + + @staticmethod + def Account_C22_1_4_1(inputs): + # NBI + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(7.0642 * inputs['NBI Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_2(inputs): + # ICRH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(4.149 * inputs['ICRH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_3(inputs): + # ECH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(8.0 * inputs['ECH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_5(inputs): + # Primary Structure and Support + return(0) + + @staticmethod + def Account_C22_1_6(inputs): + # Vacuum Systems + # Rollup + return( + # Account_C22_1_6_1(inputs) + + MirrorFunc.Account_C22_1_6_2(inputs) + + MirrorFunc.Account_C22_1_6_3(inputs) + + MirrorFunc.Account_C22_1_6_4(inputs) + ) + + + # def Account_C22_1_6_1(inputs): + # Vacuum Vessel + # Tracked in radial builds and folded into blanket + # return(0) + + + @staticmethod + def Account_C22_1_6_2(inputs): + # Helium Liquefier-Refrigerators (not for magnets) + # Presumably for a full vessel cryostat? + return(0) + + @staticmethod + def Account_C22_1_6_3(inputs): + + #VACUUM PUMPING 22.1.6.3 + #assume 1 second vac rate + #cost of 1 vacuum pump, scaled from 1985 dollars + cost_pump = 40000 + #48 pumps needed for 200^3 system + vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump + no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second + return(no_vpumps*cost_pump/1e6) + + + @staticmethod + def Account_C22_1_6_4(inputs): + # Roughing Pump + return(120000*2.85/1e6) + + @staticmethod + def Account_C22_1_7(inputs): + # Power Supplies + + # Not using Woodruff 2024 as that is based on ITER fusion power + # Heating and magnets are tracked elsewhere + + # #Scaled relative to ITER for a 500MW fusion power syste + # lcredit = 0.5# learning credit. + # C220107 = 269.6 * PNRL/500*lcredit #cost in kIUA + # C220107 = C220107*2 #assuming 1kIUA equals $2 M + + return(0) + + @staticmethod + def Account_C22_1_8(inputs): + # Divertor + return(0) + + @staticmethod + def Account_C22_1_9(inputs): + # Direct Energy Convertor + # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) + + @staticmethod + def Account_C22_1_11(inputs): + # Assembly and Installation Costs + + #Cost Category 22.1.11 Installation costs + axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_ir = axis_t + + # Define labor rate + lr = 1600 / 1e6 # 1600 dollars per day for skilled labor + + # Calculations + constructionworker = 20 * axis_ir / 4 + C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) + C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_8_in = 0 # guns or divertor + C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_10_in = 0 # ECRH + + # Total cost calculations + C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220111 * cost_factor) + + @staticmethod + def Account_C22_2(inputs): + # Main and Secondary Coolant + return( + MirrorFunc.Account_C22_2_1(inputs) + + MirrorFunc.Account_C22_2_2(inputs) + + MirrorFunc.Account_C22_2_3(inputs) + ) + + @staticmethod + def Account_C22_2_1(inputs): + # Primary Coolant + return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) + + @staticmethod + def Account_C22_2_2(inputs): + # Secondary Coolant + return(40.6 * (inputs['Thermal Power']/3500)**0.55) + + @staticmethod + def Account_C22_2_3(inputs): + # Tertiary Coolant + return(0) + + @staticmethod + def Account_C22_3(inputs): + # Auxiliary Cooling Systems + return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_4(inputs): + # Radioactive Waste Treatment + return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_5(inputs): + # Cost Category 22.5 Fuel Handling and Storage + + inflation = 1.43 + C2205010ITER = 20.465 * inflation + C2205020ITER = 7 * inflation + C2205030ITER = 22.511 * inflation + C2205040ITER = 9.76 * inflation + C2205050ITER = 22.826 * inflation + C2205060ITER = 47.542 * inflation + # C22050ITER = C2205010ITER + C2205020ITER + C2205030ITER + C2205040ITER + C2205050ITER + C2205060ITER #ITER inflation cost + + + lcredit = 0.8 # learning curve + ltoak = 10**(np.log10(lcredit) / np.log10(2)) + + + C220501 = C2205010ITER * ltoak + C220502 = C2205020ITER * ltoak + C220503 = C2205030ITER * ltoak + C220504 = C2205040ITER * ltoak + C220505 = C2205050ITER * ltoak + C220506 = C2205060ITER * ltoak + C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220500 * cost_factor) + + @staticmethod + def Account_C22_6(inputs): + # Cost Category 22.6 Other Reactor Plant Equipment + return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) + + @staticmethod + def Account_C22_7(inputs): + # Cost Category 22.7 Instrumentation and Control + return(85) + + @staticmethod + def Account_C23(inputs): + # Turbine Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) + + @staticmethod + def Account_C24(inputs): + # Electric Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) + + @staticmethod + def Account_C25(inputs): + # Miscellaneous Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) + + @staticmethod + def Account_C26(inputs): + # Heat Rejection + return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) + + @staticmethod + def Account_C27(inputs): + # Special Materials + # Total elsewhere, implement later + return(0) + + @staticmethod + def Account_C28(inputs): + # Digital Twin + return(5) + + @staticmethod + def Account_C29(inputs): + # Contingency on Direct Capital Costs + + # I may have to change the way that I do sums as this must be done separately? + # C21 = sum(C21.1 + C21.2 + ...) + + # Rollup + + if not(inputs['NOAK']) and inputs['Contingency']: + return(0.1 * ( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs))) + else: + return(0) + + + ### Other Methods: ### + @staticmethod + def PbLi_density(f_6Li=0.075, T=300): + """ + Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has + roughly 83% Pb and 17% Li. + + Parameters + ---------- + f_6Li : float, optional + Fraction of 6Li to all Li, aka enrichment. The default is 0.075. + T : float, optional + Temperature. Units are °C. The default is 300. + + Returns + ------- + Density of PbLi at selected parameters. + + """ + + f_6Li_natural = 0.075 + rho_6Li = 0.460e3 # kg/m^3 + rho_7Li = 0.537e3 # kg/m^3 + + T_K = T + 273.15 # K + + # Use equation for density as function of temperature from below, Table 1 + # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) + # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF + rho_PbLi = 10520.35 - 1.19051 * T_K + + + # Correct calculated density for enrichment + rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) + + return(rho_PbLi) + + @staticmethod + def Li_price(f_6Li=0.075): + """ + Return Li price (USD/kg) for enrichment levels above 90% 6Li + + Parameters + ---------- + f_6Li : TYPE, optional + DESCRIPTION. The default is 0.075. + + Returns + ------- + None. + + """ + + # https://www.dailymetalprice.com/lithium.html + # From 2024-04-01 + P_6Li075 = 15.152 # USD/kg + + if f_6Li == 0.075: + return(P_6Li075) + + elif f_6Li >= 0.90: + # From Woodruff for 90% 6Li + P_6Li90 = 70 # USD/kg + + # El-Guebaly 2011 (AIRES-AT UK Study) + # P_6Li90 = 2400.0 #USD/kg + + + f = [0.90, 0.99, 0.999, 0.9999, 0.99999] + Cf = [1, 2, 4, 8, 16] + + f_interp = scipy.interpolate.interp1d(f, Cf) + return(f_interp(f_6Li) * P_6Li90) + + else: + print('Lithium pricing at this enrichment level not supported') + return() + + @staticmethod + def PbLi_price(f_6Li, P_Pb): + + # Assuming eutectic fractions + f_Li = 0.17 + f_Pb = 1 - f_Li + + P_Li = MirrorFunc.Li_price(f_6Li) + + P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg + + return(P_PbLi) + @staticmethod + def V_cylindrical_shell(r_in, r_out, L): + """ + Return volume of a cylindrical shell + + Parameters + ---------- + r_in : float, inner radius + r_out : float, outer radius + L : float, length + + Returns + ------- + Volume (float). + + """ + return(np.pi * L * (r_out**2 - r_in**2)) + + @staticmethod + def V_inverse_triangular_washer(z, r_in, r_out): + """ + Return volume of cylindrical inverse triangular washer. + From the ASCII art below you can see how this is used for magnet shielding. + + ^ z + | + | z + |\ | /| + | \ | / | + | \ | / | + | \ | / | + | \ | / | + | \ | / | + ------------------------------------> r + r_in r_out + + Parameters + ---------- + z : float, z extent of triangle + r_in : float, inner radius of triangle + r_out : float, outer radius of triangle + + Returns + ------- + Volume (float). + + """ + + + # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b + + return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) + @staticmethod + def generate_inputs( + + application='heat', + + P_f=1, P_f_L=1, P_f_EP=1, + P_NBI=1, P_ECH=1, P_ICRH=1, + M_n=1.1, + + N_module=1, + + f_pump=0.03, f_sub=0.04, f_cryo=0.01, + + # Obsolete but kept for backwards compatibility + P_pump=1, P_sub_cont=1, P_cryo=1, + P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, + + eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, + eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, + + verbose=False, exact=False, + NOAK=False, n_unit=False, + construction_time=6, + lifetime=30, replacement=10, availability=0.90, + discount=0.0245, + LSA=2, + cost_file='woodruff-data.csv', method='new', + include_decommissioning=False, include_tax=False, + include_licensing=False, include_contingency=False, + + hf_magnet_length=1, + hf_magnet_shielding_thickness=1, + + a_EC=1, + expander_cell_vessel_thickness=0.01, + expander_cell_vessel_material='SS316', + + vacuum_gap_CC=0.01, + first_wall_material='W', + first_wall_thickness=0.01, + vacuum_vessel_material='SS316', + vacuum_vessel_thickness=0.01, + multiplier_material='Pb', + multiplier_thickness=0.01, + blanket_coolant_material='Natural PbLi', + blanket_thickness=1.00, + blanket_coolant_fraction=0.90, + blanket_structural_material='SS316', + blanket_structural_fraction=0.10, + outer_vessel_thickness=0.01, + + L_EP=1, + L_EC=1, + a_CC=1, + a_EP=1, + + save=True, + load=False, + filename=None, + run_name=None + + ): + + """ + Return a dict containing all inputs for a techno-economic analysis. + + Parameters + ---------- + application : str, optional + The application, either 'electricity' or 'heat'. + This changes the power balance and some reporting. The default + is 'heat'. + P_f : float + The total fusion power in MW. The length of the central cell + is scaled to achieve this value. This is not the net electrical power! + P_f_L : float + The central cell linear fusion power in MW/m. + P_f_EP : float + The fusion power in each of two end plugs in MW. + P_NBI : float + The applied NBI power in MW. + P_ECH : float + The applied ECH power in MW. + P_ICRH : float + The applied ICRH power in MW. + M_n : float + The neutron power multiplication factor from the blanket. + The default is 1.1. + N_module : int + The number of modules (fusion machines) per facility. + This is deprecated. The default is 1. + f_pump : float + The pumping power fraction (of M_n * P_fusion). The default is 0.03. + f_sub : float + The subsystem power fraction (of fusion power). The default is 0.04. + f_cryo : float + The cryogenic power fraction (of fusion power). The default is 0.01. + P_pump : float + The pumping power in MW. This is deprecated. + P_sub_cont : float + The subsystem and control power in MW. This is deprecated. + P_cryo: float + The cryo power in MW. The default is 0.5 MW. This is deprecated. + P_pfcool : float + The PF cooling power in MW. The default is 0. This is deprecated. + P_thcool : float + The thermal cooling power in MW. The default is 0. This is deprecated. + P_coils : float + The magnetic coil power in MW. The default is 0. + P_aux : float + The auxiliary power in MW. The default is 9.4. + + eta_th : float + The thermal conversion efficiency. + eta_DEC : float + The DEC conversion efficiency. The default is 0.90. + eta_pump : float + The pumping efficiency. The default is 0.98. + eta_NBI : float + The NBI electrical efficiency. + eta_ECH : float + The ECH electrical efficiency. + eta_ICRH : float + The ICRH electrical efficiency. + + LSA : int + The level of safey assurance. The default is 2. This is deprecated. + + construction_time : int + The construction time in years. The default is 6. + NOAK : bool + Whether this is an NOAK device. The default is False. + This will probably be deprecated soon. + n_unit : int or bool + The number of the tandem unit, in terms of first of a kind (1), + second of a kind (2), etc. When this is False, the FOAK cost is used. + The default is False. + lifetime : int + The lifetime of the tandem in years. This is used for LCOE and LCOH + calcualtions. The default is 30. + replacement : int + The replacement interval of the magnets in years. The default is 10. + availability : float + The facility availability. The range is between 0 and 1, inclusive. + The default is 0.90. + cost_file : str + The filename of the cost file. The default is 'woodruff-data.csv'. + method : str + The power balance method. The default is 'new'. + This will be deprecated soon. + include_tax : bool + Whether to include tax. The default is False. + include_decommissioning : bool + Whether to include decommissioning. The default is False. + include_licensing : bool + Whether to include licensing. The default is False. + include_contingency : bool + Whether to include continency. The default is False. + verbose : bool + Whether to print a lot. The default is False. + vacuum_gap_CC : float + The vacuum gap in the central cell, in meters. The default is 0.01. + first_wall_material : str + The first wall material. The default is 'W'. + first_wall_thickness : float + The first wall thickness, in meters. The default is 0.01. + vacuum_vessel_material : str + The vacuum vessel material. The default is 'SS316'. + vacuum_vessel_thickness : float + The vacuum vessel thickness, in meters. The default is 0.01 + multiplier_material : str + The muliplier material. The default is 'Pb' + multiplier_thickness : float + The multiplier thickness, in meters. The default is 0.01. + blanket_coolant_material : str + The blanket coolant material. The default is 'Natural PbLi'. + blanket_thickness : float + The blanket thickness, in meters. The default is 1.00. + blanket_coolant_fraction : float + The blanket coolant fraction, from 0 to 1. The default is 0.90. + blanket_structural_material : str + The blanket structural material. The default is 'SS316'. + blanket_structural_fraction : float + The blanket structural fraction, from 0 to 1. The default is 0.10. + outer_vessel_thickness : float + The outer vessel thickness, in meters. The default is 0.01. + contours : bool + Whether to plot contours of discount rates and build time. + The default is False. + tornadoes : bool + Whether to plot tornado plots. These take a while to make. + The default is False. + + hf_magnet_length : float + The axial length of the HF magnet, in meters. The default is 1.0. + hf_magnet_shielding_thickness : + The default is 1.0, + + a_EC : float + The expander cell radius, in meters. The default is 1.0. + expander_cell_vessel_thickness : float + The expander cell vessel thickness, in meters. The default is 0.01. + expander_cell_vessel_material : str + The expander cell vessel material. The default is 'SS316'. + + + + L_EP : float + The length of each end plug, in meters. The default is 1. + L_EC : float + The length of each expander cell, in meters, measured from the + centers of the HF coils. The default is 1. + a_CC : float + The central cell plasma radius, in meters. The default is 15. + a_EP : float + The end plug plasma radius, in meters. The default is 1. + + + + + save : bool + Whether to save the results. The default is True. + load : bool + Whether to load results. The default is False. + filename : str + The filename loading. The default is None. + run_name : str + A run name for saving results. The default is None. + + + """ + + if load: + with open(filename) as file: + inputs = json.load(file) + + else: + + # Fusion Power in Central Cell + P_f_CC = P_f - 2 * P_f_EP + + # Central Cell Length + L_CC = P_f_CC/P_f_L + + # Central Field Coil Spacing + L_CF = 1.0 + + # Overall Device Length + L = L_CC + 2 * L_EP + 2 * L_EC + + # Vacuum Volume - Not precise, but also not important + # Should be updated + V_vac = L * np.pi * a_EC**2 + + + # Power Balance + P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power + P_n = P_f - P_alpha # MW, neutron power + + # Input electrical power + P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH + + # Balance of Plant + P_pump = f_pump * M_n * P_n + P_sub_cont = f_sub * P_f + P_cryo = f_cryo * P_f + P_other = P_pump + P_sub_cont + P_cryo + + # Total heating input power applied to plasma + P_in = P_NBI + P_ICRH + P_ECH + + # Heat in blanket including neutron multiplication + # P_thermal_only = M_n * P_n + + # Thermal power + # No P_in term as that goes to DEC + P_th = M_n * P_n + eta_pump * P_pump + + # Thermal electric power + P_the = eta_th * P_th + + # DEC receives all charged particle exhaust, so is the sum of + # both the input power and alpha power + P_DEC = P_in + P_alpha + + # DEC electrical power + P_DECe = eta_DEC * P_DEC + + # Gross electrical power + # Differs for application + if application.lower()=='electricity': + # Electrical application uses thermal power to create electricity + P_egross = P_DECe + P_the + elif application.lower()=='heat': + # Heat application only uses DEC to create electricity + P_egross = P_DECe + + # Net electrical power + P_enet = P_egross - (P_ine + P_other) + + f_aux = P_aux / P_egross + # P_loss = P_th - P_the - P_DECe + # P_sub = f_sub * P_the + + # Scientific Q + Q_sci = P_f / P_in + + # Engineering Q + Q_eng = P_egross / (P_ine + P_other) + + # Recirculating power + f_refrac = 1 / Q_eng + if run_name==None: + run_name = '{:.1f}-MW'.format(float(P_f)) + + + cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) + + inputs = { + + # Application (heat or electricity) + 'Application':application, + 'Method':method, + + # Power Balance + 'Fusion Power': P_f, + 'Alpha Power': P_alpha, + 'Neutron Power': P_n, + 'Neutron Energy Multiplication': M_n, + # 'Thermal Only Power': P_thermal_only, + 'Thermal Power': P_th, + 'Thermal Conversion Efficiency': eta_th, + + # DEC + 'DEC Efficiency': eta_DEC, + 'DEC Electrical Power': P_DECe, + 'DEC Input Power': P_DEC, + + # Balance + 'Thermal Electric Power': P_the, + 'Gross Electric Power': P_egross, + 'Net Electric Power': P_enet, + + # Other Power + 'Other Power': P_other, + 'Pumping Power Fraction': f_pump, + 'Pumping Power': P_pump, + 'Subsystem and Control Power': P_sub_cont, + 'Auxiliary Power Fraction': f_aux, + 'Auxiliary Power': P_aux, + + # Input Power + 'Applied Heating Power': P_in, + 'Applied Heating Power Electrical Use': P_ine, + 'NBI Power': P_NBI, + 'ICRH Power': P_ICRH, + 'ECH Power': P_ECH, + 'NBI Electrical Efficiency': eta_NBI, + 'ICRH Electrical Efficiency': eta_ICRH, + 'ECH Electrical Efficiency': eta_ECH, + + # Q + 'Scientific Q': Q_sci, + 'Engineering Q': Q_eng, + 'Recirculating Power Fraction': f_refrac, + + # Don't use this - it is probably not implemented well here + 'Number of Modules': N_module, + + # Time Intervals + 'Construction Time':construction_time, + 'Lifetime':lifetime, + 'Replacement Time':replacement, + 'Level of Safety Assurance':LSA, + + # Geometry + 'Overall Length':L, + 'Central Cell Length':L_CC, + 'End Plug Length':L_EP, + 'Expander Length':L_EC, + 'Vacuum Volume':V_vac, + + # Number of Magnets + 'HF Magnet Number':4, # Always 4 for a tandem + 'LF Magnet Number':2, # Set to what you need! + 'CF Magnet Spacing':L_CF, + 'CF Magnet Number':L_CC/L_CF, # Calcuated + + 'HF Magnet Length':hf_magnet_length, + 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, + + 'End Plug Plasma Radius':a_EP, + + 'Expander Cell Length':L_EC, + 'Expander Cell Radius':a_EC, + 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, + 'Expander Cell Vessel Material':expander_cell_vessel_material, + + 'Central Cell Plasma Radius':a_CC, + 'Central Cell Vacuum Gap':vacuum_gap_CC, + 'First Wall Material':first_wall_material, + 'First Wall Thickness':first_wall_thickness, + 'Vacuum Vessel Material':vacuum_vessel_material, + 'Vacuum Vessel Thickness':vacuum_vessel_thickness, + 'Multiplier Material':multiplier_material, + 'Multiplier Thicnkess':multiplier_thickness, + 'Blanket Coolant Material':blanket_coolant_material, + 'Blanket Thickness':blanket_thickness, + 'Blanket Coolant Fraction':blanket_coolant_fraction, + 'Blanket Structural Material':blanket_structural_material, + 'Blanket Structrual Fraction':blanket_structural_fraction, + 'Outer Vessel Thickness':outer_vessel_thickness, + + # Economic Factors + 'Availability':availability, + 'Discount':discount, + 'NOAK': NOAK, + 'Unit Number':n_unit, + # 'Cost File':cost_file, + 'Cost File':cost_file_full, + 'Licensing':include_licensing, + 'Tax':include_tax, + 'Decommissioning':include_decommissioning, + 'Contingency':include_contingency, + + # File Prefix + 'Run Name':run_name + + } + + if save: + # import csv + + filename = 'inputs-'+inputs['Run Name']+'.json' + + + with open(filename, 'w') as file: + json.dump(inputs, file) + + if verbose: + + format_string = '{:35s} {:8.2f}' + + print('{:35s} {:8s}'.format('Parameter', 'Value')) + + for key in inputs: + print(format_string.format(key, inputs[key])) + + return(inputs) + @staticmethod + def create_radial_build(name, material, thickness, f_vol=1.00): + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[0.0], + 'r_out':[thickness], + 'f_vol':[f_vol]}) + + return(new_data) + @staticmethod + def add_new_layer(data, name, material, thickness, f_vol=1.00): + + # Inner radius is outer radius from last row + r_in = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_in+thickness], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def add_fractional_layer(data, name, material, f_vol=1.00): + + # Inner radius is inner radius from last row + r_in = data['r_in'].values[-1] + r_out = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_out], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def build_central_cell(inputs): + + radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) + radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) + + return(radial_build) + + @staticmethod + def central_cell_cost(inputs, L=1.0): + return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) + + @staticmethod + def central_cell(inputs, L=1.0): + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + radial_build = MirrorFunc.build_central_cell(inputs) + + + + T = 300 # °C, mean coolant temperture + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + # print(radial_build.to_string()) + + # print(radial_build) + + # Iterate over layer in radial build and calculate volume and cost + for i in range(len(radial_build)): + + material = radial_build['material'][i] + # print(material) + + ''' + PbLi is a special case as the enrichment and temperature affect + the density and cost. Here the code expects a percent enrichment as + shown here: + 'Natural PbLi' meaning '7.5% PbLi' + '93% PbLi' or similar + ''' + if 'PbLi' in material: + + if 'Natural' in material: + f_6Li = 0.075 + elif '% ' in material: + f_6Li = float(material.split('% ')[0])/100 + else: + print('Unable to parse coolant', material) + + radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) + radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) + radial_build.loc[i, 'manufacturing_factor'] = 1.0 + + + else: + + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + + + + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})], ignore_index=True) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + # print() + # print('Radial build for L =', L) + # print(radial_build.to_string()) + + return(radial_build) + + # Return total cost only + # return(radial_build['cost'].max()) + + @staticmethod + def expander_cell_cost(inputs): + """ + Each expander cell is made up of: + A cylindrical vessel + A DEC convertor + + + Returns + ------- + None. + + """ + + # print('Expander Cell') + + L = inputs['Expander Cell Length'] + radius = inputs['Expander Cell Radius'] + thickness = inputs['Expander Cell Vessel Thickness'] + vv_material = inputs['Expander Cell Vessel Material'] + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + # Cylindrical shell + + radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + for i in range(len(radial_build)): + + material = radial_build['material'][i] + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})]) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + + # print(radial_build.to_string()) + + # End cap + V_end_cap = np.pi * thickness * radius**2 + M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] + C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] + + # print('End Cap: $', C_end_cap) + # print('Cylindrical Part: $', radial_build['cost'].max()) + + total = 2*C_end_cap + radial_build['cost'].max() + + # print('Total: $', total) + + return(total) + + @staticmethod + def HF_magnet_shield_cost(inputs, verbose=False): + """ + The HF coils have annular shield with a U-shaped cross section: + + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + \ | | / + \ | | / + \ | | / + \| |/ + +--------+ + + + - - - - - - - - - - - Center Line + + + +--------+ + /| |\ + / | | \ + / | | \ + / | | \ + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + + + """ + + # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) + # It's a reasonable assumption to say that all axial widths/layers will be the same + + + filename = inputs['Cost File'] + cost_data = pd.read_csv(filename, index_col=0) + + # Eventually these will be arguments + material = 'W' + a_M = 0.15 # From Frank + a_CC = 0.54 # From Frank + a_0 = 0.7 + + # Radially Inner Cylinder + # length = 4.5 # End plug length from Frank + length = 0.5 # Is this the required shielding thickness? + a_M = 0.15 + r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding + r_vv = 0.01 # Reduced from 0.1 to 0.01 + + # r_magnet = 1.0 # original + r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses + r_cryostat = 1.0 + + f_vol = 0.90 + + + r_in = a_M + r_gap + r_vv + r_out = r_magnet - r_cryostat + + V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol + + # Central Cell Cylinder + # length_cc_cylinder = 50.0 + length_cc_cylinder = 0.5 + r_in_cc = a_CC + r_gap + r_vv + # r_out_cc = 1.0 + r_out_cc = r_in_cc+0.5 + + V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol + + # Central Cell Triangular Washer + V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol + + # End Plug Cylinder + length_ep_cylinder = 0.5 # From Frank + r_in_ep = a_0 + r_gap + r_vv + r_out_ep = r_in_ep + 0.5 + + V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol + + # End Cell Triangular Washer + V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol + + # For central cell facing magnet, add up all five regions + V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle + + # For expander cell facing magnet, only add up three regions + # No neutrons come from the expander cell + V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle + + # Summary information + V_total = V_total_cc_facing + V_total_ec_facing + mass = cost_data.loc[material]['density'] * V_total + cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass + + return(cost) + + + ### MNyberg's Magnet Methods ### + + # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 + # Table 2 should give good general information + # Critical current density from PROCESS + @staticmethod + def jcrit_rebco(temperature, b): + """Critical current density for "REBCO" 2nd generation HTS superconductor + temperature : input real : superconductor temperature (K) + b : input real : Magnetic field at superconductor (T) + jcrit : output real : Critical current density in superconductor (A/m2) + + Will return a negative number if the temperature is greater than Tc0, the + zero-field critical temperature. + """ + tc0 = 90.0 # (K) + birr0 = 132.5 # (T) + a = 1.82962e8 # scaling constant + # exponents + p = 0.5875 + q = 1.7 + alpha = 1.54121 + beta = 1.96679 + oneoveralpha = 1 / alpha + + validity = True + + if (temperature < 4.2) or (temperature > 72.0): + validity = False + if temperature < 65: + if (b < 0.0) or (b > 15.0): + validity = False + else: + if (b < 0.0) or (b > 11.5): + validity = False + + if not validity: + print( + # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" + ) + + if temperature < tc0: + # Normal case + birr = birr0 * (1 - temperature / tc0) ** alpha + else: + # If temp is greater than critical temp, ensure result is real but negative. + birr = birr0 * (1 - temperature / tc0) + + if b < birr: + # Normal case + factor = (b / birr) ** p * (1 - b / birr) ** q + jcrit = (a / b) * (birr**beta) * factor + else: + # Field is too high + # Ensure result is real but negative, and varies with temperature. + # tcb = critical temperature at field b + tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) + jcrit = -(temperature - tcb) + + return jcrit, validity + + @staticmethod + def HTS_storedEnergy(field, inner_rad, HTS_temp=20): + radius_in_wham = 6.65 # cm + radius_out_wham = 31.85 # cm + B_wham = 17 # T + cost_wham = 2.3/2 # MUSD + mew_0=1 # TODO if I value is needed change this to be the real constant value + width_ratio = 5 # TODO update + volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) + + j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] + + # Equation taking into account width and critical current ratios + I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) + outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) + # Old simple equation + # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) + volume_2 = math.pi*(outer_rad**2-inner_rad**2) + ratioOfVols=volume_2/volume_1 + + # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 + E_ratio=(field/B_wham)**2*ratioOfVols + cost_ratio=E_ratio**0.6 + return cost_ratio*cost_wham + + + @staticmethod + def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): + # This is the HF cost per magnet [MUSD], not for all four + + # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit + cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): + # This is the LF cost per magnet [MUSD] + + cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def CF_magnet_cost(inputs, CF_field=3.0): + # This is the CF cost per magnet [MUSD] + + convert_to_currentDollar = 1.31 + cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + + + + diff --git a/tutorial/accert/ref_tables/MirrorFunc_splitInputs.py b/tutorial/accert/ref_tables/MirrorFunc_splitInputs.py new file mode 100644 index 0000000..e438257 --- /dev/null +++ b/tutorial/accert/ref_tables/MirrorFunc_splitInputs.py @@ -0,0 +1,1557 @@ +import numpy as np +import pandas as pd +import scipy +import json +import math +import pkg_resources +from .Algorithm import Algorithm + +### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples +class MirrorFunc(Algorithm): + + # Physical constants + E_DT = 17.59e6 * 1.60218*10**-19 # J + E_alpha = 3.52e6 * 1.60218*10**-19 # J + E_n = E_DT - E_alpha # J + m_T = 3.01604928 * 1.66053907*10**-27 # kg, triton mass + m_D = 2.01410177811 * 1.66053907*10**-27 # kg, deuteron mass + m_6Li = 6.0151228874 * 1.66053907*10**-27 # kg, lithium-6 mass + + # Conversion factors + Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU + + def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): + super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) + + def run(self, inputs: dict) -> float: + """ + Executes the algorithm specified by the name in the instance variables. + + Parameters: + inputs (dict): Dictionary of input variables required for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + # run the algorithm use self.name not self.alg_name + return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) + + def _run_algorithm(self, alg_name: str, variables: list) -> float: + """ + Runs the specified algorithm with given variables. + + Parameters: + alg_name (str): The name of the algorithm to run. + variables (list): List of input variables for the algorithm. + + Returns: + float: Result of the algorithm computation. + """ + try: + algorithm = getattr(self, alg_name) + return algorithm(*variables) + except AttributeError: + raise ValueError(f"Algorithm {alg_name} not found") + + ### Account Methods: ### + @staticmethod + def Account_C20(inputs): + return( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs) + + MirrorFunc.Account_C29(inputs) + ) + + @staticmethod + def Account_C21(inputs): + return( + MirrorFunc.Account_C21_1(inputs) + + MirrorFunc.Account_C21_2(inputs) + + MirrorFunc.Account_C21_3(inputs) + + MirrorFunc.Account_C21_4(inputs) + + MirrorFunc.Account_C21_5(inputs) + + MirrorFunc.Account_C21_6(inputs) + + MirrorFunc.Account_C21_7(inputs) + + MirrorFunc.Account_C21_8(inputs) + + MirrorFunc.Account_C21_9(inputs) + + MirrorFunc.Account_C21_10(inputs) + + MirrorFunc.Account_C21_11(inputs) + + MirrorFunc.Account_C21_12(inputs) + + MirrorFunc.Account_C21_13(inputs) + + MirrorFunc.Account_C21_14(inputs) + + MirrorFunc.Account_C21_15(inputs) + + MirrorFunc.Account_C21_16(inputs) + + MirrorFunc.Account_C21_17(inputs) + ) + + @staticmethod + def Account_C21_1(inputs): + # Site Preparation/Yard Work + return(inputs['Gross Electric Power'] * 268/1e3) + + @staticmethod + def Account_C21_2(inputs): + # Heat Island Building + return(inputs['Gross Electric Power'] * 186.8/1e3) + + @staticmethod + def Account_C21_3(inputs): + # Turbine Generator Building + if inputs['Application'].lower()=='electricity': + return(inputs['Gross Electric Power'] * 54.0/1e3) + else: + return(0) + + @staticmethod + def Account_C21_4(inputs): + # Heat Exchanger Building + return(37.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, + def Account_C21_5(inputs): + # Power Supply and Energy Storage + return(10.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, + def Account_C21_6(inputs): + # Reactor Auxiliaries + return(5.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, + def Account_C21_7(inputs): + # Hot Cell + return(93.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, + def Account_C21_8(inputs): + # Reactor Services + return(18.7/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, + def Account_C21_9(inputs): + # Service Water + return(0.3/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, + def Account_C21_10(inputs): + # Fuel Storage + return(1.1/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_11(inputs): + # Control Room + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, + def Account_C21_12(inputs): + # Onsite AC Power + return(0.8/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, + def Account_C21_13(inputs): + # Administration + return(4.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, + def Account_C21_14(inputs): + # Site Services + return(1.6/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, + def Account_C21_15(inputs): + # Cyrogenics + return(2.4/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, + def Account_C21_16(inputs): + # Security + return(0.9/1e3 * inputs['Gross Electric Power']) + + @staticmethod + #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, + def Account_C21_17(inputs): + # Ventilation Stack + return(27.0/1e3 * inputs['Gross Electric Power']) + + + @staticmethod + def Account_C22(inputs): + # Rollup + return( + MirrorFunc.Account_C22_1(inputs) + + MirrorFunc.Account_C22_2(inputs) + + MirrorFunc.Account_C22_3(inputs) + + MirrorFunc.Account_C22_4(inputs) + + MirrorFunc.Account_C22_5(inputs) + + MirrorFunc.Account_C22_6(inputs) + + MirrorFunc.Account_C22_7(inputs) + ) + + + @staticmethod + def Account_C22_1(inputs): + # This is a special case and is NOT calculated using Woodruff's model, + # However, I maintained the naming convention for convenience + # Rollup + return( + MirrorFunc.Account_C22_1_1(inputs) + + MirrorFunc.Account_C22_1_2(inputs) + + MirrorFunc.Account_C22_1_3(inputs) + + MirrorFunc.Account_C22_1_4(inputs) + + MirrorFunc.Account_C22_1_5(inputs) + + MirrorFunc.Account_C22_1_6(inputs) + + MirrorFunc.Account_C22_1_7(inputs) + + MirrorFunc.Account_C22_1_8(inputs) + + MirrorFunc.Account_C22_1_9(inputs) + + MirrorFunc.Account_C22_1_11(inputs) + ) + + @staticmethod + def Account_C22_1_1(inputs): + # First Wall and Blanket (and vacuum vessel) + + L_magnet_to_magnet = inputs['End Plug Length'] + + L_cylinder = L_magnet_to_magnet + + expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) + + end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) + end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() + + central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) + central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() + + total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result + + return(total_cost/1e6) + + @staticmethod + def Account_C22_1_2(inputs): + # Magnet Radiation Shield + # Factor of two for each end plug + return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) + + @staticmethod + def Account_C22_1_3(inputs): + # Coils + # Rollup + return( + MirrorFunc.Account_C22_1_3_1(inputs) + + MirrorFunc.Account_C22_1_3_2(inputs) + + MirrorFunc.Account_C22_1_3_3(inputs) + ) + + # @staticmethod + def Account_C22_1_3_1(inputs): + # HF Coils - Quantity 4 + # 2 per end cell + # 2 end cells per tandem + return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_2(inputs): + # LF Coils - Quantity 8 + # 4 per end cell + # 2 end cells per tandem + return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_3_3(inputs): + # CF Coils + # One coil every L_CF m of Central Cell + return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) + + @staticmethod + def Account_C22_1_4(inputs): + # Supplemenatry Heating + # Rollup + return( + MirrorFunc.Account_C22_1_4_1(inputs) + + MirrorFunc.Account_C22_1_4_2(inputs) + + MirrorFunc.Account_C22_1_4_3(inputs) + ) + + @staticmethod + def Account_C22_1_4_1(inputs): + # NBI + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(7.0642 * inputs['NBI Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_2(inputs): + # ICRH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(4.149 * inputs['ICRH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_4_3(inputs): + # ECH + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(8.0 * inputs['ECH Power'] * cost_factor) + + @staticmethod + def Account_C22_1_5(inputs): + # Primary Structure and Support + return(0) + + @staticmethod + def Account_C22_1_6(inputs): + # Vacuum Systems + # Rollup + return( + # Account_C22_1_6_1(inputs) + + MirrorFunc.Account_C22_1_6_2(inputs) + + MirrorFunc.Account_C22_1_6_3(inputs) + + MirrorFunc.Account_C22_1_6_4(inputs) + ) + + + # def Account_C22_1_6_1(inputs): + # Vacuum Vessel + # Tracked in radial builds and folded into blanket + # return(0) + + + @staticmethod + def Account_C22_1_6_2(inputs): + # Helium Liquefier-Refrigerators (not for magnets) + # Presumably for a full vessel cryostat? + return(0) + + @staticmethod + def Account_C22_1_6_3(inputs): + + #VACUUM PUMPING 22.1.6.3 + #assume 1 second vac rate + #cost of 1 vacuum pump, scaled from 1985 dollars + cost_pump = 40000 + #48 pumps needed for 200^3 system + vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump + no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second + return(no_vpumps*cost_pump/1e6) + + + @staticmethod + def Account_C22_1_6_4(inputs): + # Roughing Pump + return(120000*2.85/1e6) + + @staticmethod + def Account_C22_1_7(inputs): + # Power Supplies + + # Not using Woodruff 2024 as that is based on ITER fusion power + # Heating and magnets are tracked elsewhere + + # #Scaled relative to ITER for a 500MW fusion power syste + # lcredit = 0.5# learning credit. + # C220107 = 269.6 * PNRL/500*lcredit #cost in kIUA + # C220107 = C220107*2 #assuming 1kIUA equals $2 M + + return(0) + + @staticmethod + def Account_C22_1_8(inputs): + # Divertor + return(0) + + @staticmethod + def Account_C22_1_9(inputs): + # Direct Energy Convertor + # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) + + @staticmethod + def Account_C22_1_11(inputs): + # Assembly and Installation Costs + + #Cost Category 22.1.11 Installation costs + axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_ir = axis_t + + # Define labor rate + lr = 1600 / 1e6 # 1600 dollars per day for skilled labor + + # Calculations + constructionworker = 20 * axis_ir / 4 + C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) + C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_8_in = 0 # guns or divertor + C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_10_in = 0 # ECRH + + # Total cost calculations + C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220111 * cost_factor) + + @staticmethod + def Account_C22_2(inputs): + # Main and Secondary Coolant + return( + MirrorFunc.Account_C22_2_1(inputs) + + MirrorFunc.Account_C22_2_2(inputs) + + MirrorFunc.Account_C22_2_3(inputs) + ) + + @staticmethod + def Account_C22_2_1(inputs): + # Primary Coolant + return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) + + @staticmethod + def Account_C22_2_2(inputs): + # Secondary Coolant + return(40.6 * (inputs['Thermal Power']/3500)**0.55) + + @staticmethod + def Account_C22_2_3(inputs): + # Tertiary Coolant + return(0) + + @staticmethod + def Account_C22_3(inputs): + # Auxiliary Cooling Systems + return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_4(inputs): + # Radioactive Waste Treatment + return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) + + @staticmethod + def Account_C22_5(inputs): + # Cost Category 22.5 Fuel Handling and Storage + + inflation = 1.43 + C2205010ITER = 20.465 * inflation + C2205020ITER = 7 * inflation + C2205030ITER = 22.511 * inflation + C2205040ITER = 9.76 * inflation + C2205050ITER = 22.826 * inflation + C2205060ITER = 47.542 * inflation + # C22050ITER = C2205010ITER + C2205020ITER + C2205030ITER + C2205040ITER + C2205050ITER + C2205060ITER #ITER inflation cost + + + lcredit = 0.8 # learning curve + ltoak = 10**(np.log10(lcredit) / np.log10(2)) + + + C220501 = C2205010ITER * ltoak + C220502 = C2205020ITER * ltoak + C220503 = C2205030ITER * ltoak + C220504 = C2205040ITER * ltoak + C220505 = C2205050ITER * ltoak + C220506 = C2205060ITER * ltoak + C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost + + cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + + return(C220500 * cost_factor) + + @staticmethod + def Account_C22_6(inputs): + # Cost Category 22.6 Other Reactor Plant Equipment + return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) + + @staticmethod + def Account_C22_7(inputs): + # Cost Category 22.7 Instrumentation and Control + return(85) + + @staticmethod + def Account_C23(inputs): + # Turbine Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) + + @staticmethod + def Account_C24(inputs): + # Electric Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) + + @staticmethod + def Account_C25(inputs): + # Miscellaneous Plant Equipment + return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) + + @staticmethod + def Account_C26(inputs): + # Heat Rejection + return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) + + @staticmethod + def Account_C27(inputs): + # Special Materials + # Total elsewhere, implement later + return(0) + + @staticmethod + def Account_C28(inputs): + # Digital Twin + return(5) + + @staticmethod + def Account_C29(inputs): + # Contingency on Direct Capital Costs + + # I may have to change the way that I do sums as this must be done separately? + # C21 = sum(C21.1 + C21.2 + ...) + + # Rollup + + if not(inputs['NOAK']) and inputs['Contingency']: + return(0.1 * ( + MirrorFunc.Account_C21(inputs) + + MirrorFunc.Account_C22(inputs) + + MirrorFunc.Account_C23(inputs) + + MirrorFunc.Account_C24(inputs) + + MirrorFunc.Account_C25(inputs) + + MirrorFunc.Account_C26(inputs) + + MirrorFunc.Account_C27(inputs) + + MirrorFunc.Account_C28(inputs))) + else: + return(0) + + + ### Other Methods: ### + @staticmethod + def PbLi_density(f_6Li=0.075, T=300): + """ + Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has + roughly 83% Pb and 17% Li. + + Parameters + ---------- + f_6Li : float, optional + Fraction of 6Li to all Li, aka enrichment. The default is 0.075. + T : float, optional + Temperature. Units are °C. The default is 300. + + Returns + ------- + Density of PbLi at selected parameters. + + """ + + f_6Li_natural = 0.075 + rho_6Li = 0.460e3 # kg/m^3 + rho_7Li = 0.537e3 # kg/m^3 + + T_K = T + 273.15 # K + + # Use equation for density as function of temperature from below, Table 1 + # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) + # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF + rho_PbLi = 10520.35 - 1.19051 * T_K + + + # Correct calculated density for enrichment + rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) + + return(rho_PbLi) + + @staticmethod + def Li_price(f_6Li=0.075): + """ + Return Li price (USD/kg) for enrichment levels above 90% 6Li + + Parameters + ---------- + f_6Li : TYPE, optional + DESCRIPTION. The default is 0.075. + + Returns + ------- + None. + + """ + + # https://www.dailymetalprice.com/lithium.html + # From 2024-04-01 + P_6Li075 = 15.152 # USD/kg + + if f_6Li == 0.075: + return(P_6Li075) + + elif f_6Li >= 0.90: + # From Woodruff for 90% 6Li + P_6Li90 = 70 # USD/kg + + # El-Guebaly 2011 (AIRES-AT UK Study) + # P_6Li90 = 2400.0 #USD/kg + + + f = [0.90, 0.99, 0.999, 0.9999, 0.99999] + Cf = [1, 2, 4, 8, 16] + + f_interp = scipy.interpolate.interp1d(f, Cf) + return(f_interp(f_6Li) * P_6Li90) + + else: + print('Lithium pricing at this enrichment level not supported') + return() + + @staticmethod + def PbLi_price(f_6Li, P_Pb): + + # Assuming eutectic fractions + f_Li = 0.17 + f_Pb = 1 - f_Li + + P_Li = MirrorFunc.Li_price(f_6Li) + + P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg + + return(P_PbLi) + @staticmethod + def V_cylindrical_shell(r_in, r_out, L): + """ + Return volume of a cylindrical shell + + Parameters + ---------- + r_in : float, inner radius + r_out : float, outer radius + L : float, length + + Returns + ------- + Volume (float). + + """ + return(np.pi * L * (r_out**2 - r_in**2)) + + @staticmethod + def V_inverse_triangular_washer(z, r_in, r_out): + """ + Return volume of cylindrical inverse triangular washer. + From the ASCII art below you can see how this is used for magnet shielding. + + ^ z + | + | z + |\ | /| + | \ | / | + | \ | / | + | \ | / | + | \ | / | + | \ | / | + ------------------------------------> r + r_in r_out + + Parameters + ---------- + z : float, z extent of triangle + r_in : float, inner radius of triangle + r_out : float, outer radius of triangle + + Returns + ------- + Volume (float). + + """ + + + # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b + + return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) + @staticmethod + def generate_inputs( + + application='heat', + + P_f=1, P_f_L=1, P_f_EP=1, + P_NBI=1, P_ECH=1, P_ICRH=1, + M_n=1.1, + + N_module=1, + + f_pump=0.03, f_sub=0.04, f_cryo=0.01, + + # Obsolete but kept for backwards compatibility + P_pump=1, P_sub_cont=1, P_cryo=1, + P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, + + eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, + eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, + + verbose=False, exact=False, + NOAK=False, n_unit=False, + construction_time=6, + lifetime=30, replacement=10, availability=0.90, + discount=0.0245, + LSA=2, + cost_file='woodruff-data.csv', method='new', + include_decommissioning=False, include_tax=False, + include_licensing=False, include_contingency=False, + + hf_magnet_length=1, + hf_magnet_shielding_thickness=1, + + a_EC=1, + expander_cell_vessel_thickness=0.01, + expander_cell_vessel_material='SS316', + + vacuum_gap_CC=0.01, + first_wall_material='W', + first_wall_thickness=0.01, + vacuum_vessel_material='SS316', + vacuum_vessel_thickness=0.01, + multiplier_material='Pb', + multiplier_thickness=0.01, + blanket_coolant_material='Natural PbLi', + blanket_thickness=1.00, + blanket_coolant_fraction=0.90, + blanket_structural_material='SS316', + blanket_structural_fraction=0.10, + outer_vessel_thickness=0.01, + + L_EP=1, + L_EC=1, + a_CC=1, + a_EP=1, + + save=True, + load=False, + filename=None, + run_name=None + + ): + + """ + Return a dict containing all inputs for a techno-economic analysis. + + Parameters + ---------- + application : str, optional + The application, either 'electricity' or 'heat'. + This changes the power balance and some reporting. The default + is 'heat'. + P_f : float + The total fusion power in MW. The length of the central cell + is scaled to achieve this value. This is not the net electrical power! + P_f_L : float + The central cell linear fusion power in MW/m. + P_f_EP : float + The fusion power in each of two end plugs in MW. + P_NBI : float + The applied NBI power in MW. + P_ECH : float + The applied ECH power in MW. + P_ICRH : float + The applied ICRH power in MW. + M_n : float + The neutron power multiplication factor from the blanket. + The default is 1.1. + N_module : int + The number of modules (fusion machines) per facility. + This is deprecated. The default is 1. + f_pump : float + The pumping power fraction (of M_n * P_fusion). The default is 0.03. + f_sub : float + The subsystem power fraction (of fusion power). The default is 0.04. + f_cryo : float + The cryogenic power fraction (of fusion power). The default is 0.01. + P_pump : float + The pumping power in MW. This is deprecated. + P_sub_cont : float + The subsystem and control power in MW. This is deprecated. + P_cryo: float + The cryo power in MW. The default is 0.5 MW. This is deprecated. + P_pfcool : float + The PF cooling power in MW. The default is 0. This is deprecated. + P_thcool : float + The thermal cooling power in MW. The default is 0. This is deprecated. + P_coils : float + The magnetic coil power in MW. The default is 0. + P_aux : float + The auxiliary power in MW. The default is 9.4. + + eta_th : float + The thermal conversion efficiency. + eta_DEC : float + The DEC conversion efficiency. The default is 0.90. + eta_pump : float + The pumping efficiency. The default is 0.98. + eta_NBI : float + The NBI electrical efficiency. + eta_ECH : float + The ECH electrical efficiency. + eta_ICRH : float + The ICRH electrical efficiency. + + LSA : int + The level of safey assurance. The default is 2. This is deprecated. + + construction_time : int + The construction time in years. The default is 6. + NOAK : bool + Whether this is an NOAK device. The default is False. + This will probably be deprecated soon. + n_unit : int or bool + The number of the tandem unit, in terms of first of a kind (1), + second of a kind (2), etc. When this is False, the FOAK cost is used. + The default is False. + lifetime : int + The lifetime of the tandem in years. This is used for LCOE and LCOH + calcualtions. The default is 30. + replacement : int + The replacement interval of the magnets in years. The default is 10. + availability : float + The facility availability. The range is between 0 and 1, inclusive. + The default is 0.90. + cost_file : str + The filename of the cost file. The default is 'woodruff-data.csv'. + method : str + The power balance method. The default is 'new'. + This will be deprecated soon. + include_tax : bool + Whether to include tax. The default is False. + include_decommissioning : bool + Whether to include decommissioning. The default is False. + include_licensing : bool + Whether to include licensing. The default is False. + include_contingency : bool + Whether to include continency. The default is False. + verbose : bool + Whether to print a lot. The default is False. + vacuum_gap_CC : float + The vacuum gap in the central cell, in meters. The default is 0.01. + first_wall_material : str + The first wall material. The default is 'W'. + first_wall_thickness : float + The first wall thickness, in meters. The default is 0.01. + vacuum_vessel_material : str + The vacuum vessel material. The default is 'SS316'. + vacuum_vessel_thickness : float + The vacuum vessel thickness, in meters. The default is 0.01 + multiplier_material : str + The muliplier material. The default is 'Pb' + multiplier_thickness : float + The multiplier thickness, in meters. The default is 0.01. + blanket_coolant_material : str + The blanket coolant material. The default is 'Natural PbLi'. + blanket_thickness : float + The blanket thickness, in meters. The default is 1.00. + blanket_coolant_fraction : float + The blanket coolant fraction, from 0 to 1. The default is 0.90. + blanket_structural_material : str + The blanket structural material. The default is 'SS316'. + blanket_structural_fraction : float + The blanket structural fraction, from 0 to 1. The default is 0.10. + outer_vessel_thickness : float + The outer vessel thickness, in meters. The default is 0.01. + contours : bool + Whether to plot contours of discount rates and build time. + The default is False. + tornadoes : bool + Whether to plot tornado plots. These take a while to make. + The default is False. + + hf_magnet_length : float + The axial length of the HF magnet, in meters. The default is 1.0. + hf_magnet_shielding_thickness : + The default is 1.0, + + a_EC : float + The expander cell radius, in meters. The default is 1.0. + expander_cell_vessel_thickness : float + The expander cell vessel thickness, in meters. The default is 0.01. + expander_cell_vessel_material : str + The expander cell vessel material. The default is 'SS316'. + + + + L_EP : float + The length of each end plug, in meters. The default is 1. + L_EC : float + The length of each expander cell, in meters, measured from the + centers of the HF coils. The default is 1. + a_CC : float + The central cell plasma radius, in meters. The default is 15. + a_EP : float + The end plug plasma radius, in meters. The default is 1. + + + + + save : bool + Whether to save the results. The default is True. + load : bool + Whether to load results. The default is False. + filename : str + The filename loading. The default is None. + run_name : str + A run name for saving results. The default is None. + + + """ + + if load: + with open(filename) as file: + inputs = json.load(file) + + else: + + # Fusion Power in Central Cell + P_f_CC = P_f - 2 * P_f_EP + + # Central Cell Length + L_CC = P_f_CC/P_f_L + + # Central Field Coil Spacing + L_CF = 1.0 + + # Overall Device Length + L = L_CC + 2 * L_EP + 2 * L_EC + + # Vacuum Volume - Not precise, but also not important + # Should be updated + V_vac = L * np.pi * a_EC**2 + + + # Power Balance + P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power + P_n = P_f - P_alpha # MW, neutron power + + # Input electrical power + P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH + + # Balance of Plant + P_pump = f_pump * M_n * P_n + P_sub_cont = f_sub * P_f + P_cryo = f_cryo * P_f + P_other = P_pump + P_sub_cont + P_cryo + + # Total heating input power applied to plasma + P_in = P_NBI + P_ICRH + P_ECH + + # Heat in blanket including neutron multiplication + # P_thermal_only = M_n * P_n + + # Thermal power + # No P_in term as that goes to DEC + P_th = M_n * P_n + eta_pump * P_pump + + # Thermal electric power + P_the = eta_th * P_th + + # DEC receives all charged particle exhaust, so is the sum of + # both the input power and alpha power + P_DEC = P_in + P_alpha + + # DEC electrical power + P_DECe = eta_DEC * P_DEC + + # Gross electrical power + # Differs for application + if application.lower()=='electricity': + # Electrical application uses thermal power to create electricity + P_egross = P_DECe + P_the + elif application.lower()=='heat': + # Heat application only uses DEC to create electricity + P_egross = P_DECe + + # Net electrical power + P_enet = P_egross - (P_ine + P_other) + + f_aux = P_aux / P_egross + # P_loss = P_th - P_the - P_DECe + # P_sub = f_sub * P_the + + # Scientific Q + Q_sci = P_f / P_in + + # Engineering Q + Q_eng = P_egross / (P_ine + P_other) + + # Recirculating power + f_refrac = 1 / Q_eng + if run_name==None: + run_name = '{:.1f}-MW'.format(float(P_f)) + + + cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) + + inputs = { + + # Application (heat or electricity) + 'Application':application, + 'Method':method, + + # Power Balance + 'Fusion Power': P_f, + 'Alpha Power': P_alpha, + 'Neutron Power': P_n, + 'Neutron Energy Multiplication': M_n, + # 'Thermal Only Power': P_thermal_only, + 'Thermal Power': P_th, + 'Thermal Conversion Efficiency': eta_th, + + # DEC + 'DEC Efficiency': eta_DEC, + 'DEC Electrical Power': P_DECe, + 'DEC Input Power': P_DEC, + + # Balance + 'Thermal Electric Power': P_the, + 'Gross Electric Power': P_egross, + 'Net Electric Power': P_enet, + + # Other Power + 'Other Power': P_other, + 'Pumping Power Fraction': f_pump, + 'Pumping Power': P_pump, + 'Subsystem and Control Power': P_sub_cont, + 'Auxiliary Power Fraction': f_aux, + 'Auxiliary Power': P_aux, + + # Input Power + 'Applied Heating Power': P_in, + 'Applied Heating Power Electrical Use': P_ine, + 'NBI Power': P_NBI, + 'ICRH Power': P_ICRH, + 'ECH Power': P_ECH, + 'NBI Electrical Efficiency': eta_NBI, + 'ICRH Electrical Efficiency': eta_ICRH, + 'ECH Electrical Efficiency': eta_ECH, + + # Q + 'Scientific Q': Q_sci, + 'Engineering Q': Q_eng, + 'Recirculating Power Fraction': f_refrac, + + # Don't use this - it is probably not implemented well here + 'Number of Modules': N_module, + + # Time Intervals + 'Construction Time':construction_time, + 'Lifetime':lifetime, + 'Replacement Time':replacement, + 'Level of Safety Assurance':LSA, + + # Geometry + 'Overall Length':L, + 'Central Cell Length':L_CC, + 'End Plug Length':L_EP, + 'Expander Length':L_EC, + 'Vacuum Volume':V_vac, + + # Number of Magnets + 'HF Magnet Number':4, # Always 4 for a tandem + 'LF Magnet Number':2, # Set to what you need! + 'CF Magnet Spacing':L_CF, + 'CF Magnet Number':L_CC/L_CF, # Calcuated + + 'HF Magnet Length':hf_magnet_length, + 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, + + 'End Plug Plasma Radius':a_EP, + + 'Expander Cell Length':L_EC, + 'Expander Cell Radius':a_EC, + 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, + 'Expander Cell Vessel Material':expander_cell_vessel_material, + + 'Central Cell Plasma Radius':a_CC, + 'Central Cell Vacuum Gap':vacuum_gap_CC, + 'First Wall Material':first_wall_material, + 'First Wall Thickness':first_wall_thickness, + 'Vacuum Vessel Material':vacuum_vessel_material, + 'Vacuum Vessel Thickness':vacuum_vessel_thickness, + 'Multiplier Material':multiplier_material, + 'Multiplier Thicnkess':multiplier_thickness, + 'Blanket Coolant Material':blanket_coolant_material, + 'Blanket Thickness':blanket_thickness, + 'Blanket Coolant Fraction':blanket_coolant_fraction, + 'Blanket Structural Material':blanket_structural_material, + 'Blanket Structrual Fraction':blanket_structural_fraction, + 'Outer Vessel Thickness':outer_vessel_thickness, + + # Economic Factors + 'Availability':availability, + 'Discount':discount, + 'NOAK': NOAK, + 'Unit Number':n_unit, + # 'Cost File':cost_file, + 'Cost File':cost_file_full, + 'Licensing':include_licensing, + 'Tax':include_tax, + 'Decommissioning':include_decommissioning, + 'Contingency':include_contingency, + + # File Prefix + 'Run Name':run_name + + } + + if save: + # import csv + + filename = 'inputs-'+inputs['Run Name']+'.json' + + + with open(filename, 'w') as file: + json.dump(inputs, file) + + if verbose: + + format_string = '{:35s} {:8.2f}' + + print('{:35s} {:8s}'.format('Parameter', 'Value')) + + for key in inputs: + print(format_string.format(key, inputs[key])) + + return(inputs) + @staticmethod + def create_radial_build(name, material, thickness, f_vol=1.00): + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[0.0], + 'r_out':[thickness], + 'f_vol':[f_vol]}) + + return(new_data) + @staticmethod + def add_new_layer(data, name, material, thickness, f_vol=1.00): + + # Inner radius is outer radius from last row + r_in = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_in+thickness], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def add_fractional_layer(data, name, material, f_vol=1.00): + + # Inner radius is inner radius from last row + r_in = data['r_in'].values[-1] + r_out = data['r_out'].values[-1] + + new_data = pd.DataFrame(data={ + 'name':[name], + 'material':[material], + 'r_in':[r_in], + 'r_out':[r_out], + 'f_vol':[f_vol]}) + + return(pd.concat([data, new_data], ignore_index=True)) + @staticmethod + def build_central_cell(inputs): + + radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) + radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) + + return(radial_build) + + @staticmethod + def central_cell_cost(inputs, L=1.0): + return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) + + @staticmethod + def central_cell(inputs, L=1.0): + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + radial_build = MirrorFunc.build_central_cell(inputs) + + + + T = 300 # °C, mean coolant temperture + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + # print(radial_build.to_string()) + + # print(radial_build) + + # Iterate over layer in radial build and calculate volume and cost + for i in range(len(radial_build)): + + material = radial_build['material'][i] + # print(material) + + ''' + PbLi is a special case as the enrichment and temperature affect + the density and cost. Here the code expects a percent enrichment as + shown here: + 'Natural PbLi' meaning '7.5% PbLi' + '93% PbLi' or similar + ''' + if 'PbLi' in material: + + if 'Natural' in material: + f_6Li = 0.075 + elif '% ' in material: + f_6Li = float(material.split('% ')[0])/100 + else: + print('Unable to parse coolant', material) + + radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) + radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) + radial_build.loc[i, 'manufacturing_factor'] = 1.0 + + + else: + + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + + + + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})], ignore_index=True) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + # print() + # print('Radial build for L =', L) + # print(radial_build.to_string()) + + return(radial_build) + + # Return total cost only + # return(radial_build['cost'].max()) + + @staticmethod + def expander_cell_cost(inputs): + """ + Each expander cell is made up of: + A cylindrical vessel + A DEC convertor + + + Returns + ------- + None. + + """ + + # print('Expander Cell') + + L = inputs['Expander Cell Length'] + radius = inputs['Expander Cell Radius'] + thickness = inputs['Expander Cell Vessel Thickness'] + vv_material = inputs['Expander Cell Vessel Material'] + + filename = inputs['Cost File'] + + cost_data = pd.read_csv(filename, index_col=0) + + # Cylindrical shell + + radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) + + radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] + + for i in range(len(radial_build)): + + material = radial_build['material'][i] + radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] + radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] + radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] + radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] + radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] + + # Add totals to last row + radial_build = pd.concat([radial_build, pd.DataFrame(data={ + 'name':['Total'], + 'cost':[radial_build['cost'].sum()], + 'mass':[radial_build['mass'].sum()]})]) + + radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() + + # print(radial_build.to_string()) + + # End cap + V_end_cap = np.pi * thickness * radius**2 + M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] + C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] + + # print('End Cap: $', C_end_cap) + # print('Cylindrical Part: $', radial_build['cost'].max()) + + total = 2*C_end_cap + radial_build['cost'].max() + + # print('Total: $', total) + + return(total) + + @staticmethod + def HF_magnet_shield_cost(inputs, verbose=False): + """ + The HF coils have annular shield with a U-shaped cross section: + + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + \ | | / + \ | | / + \ | | / + \| |/ + +--------+ + + + - - - - - - - - - - - Center Line + + + +--------+ + /| |\ + / | | \ + / | | \ + / | | \ + +----+--------+----+ + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + | |xxxxxxxx| | + +----+--------+----+ + + + """ + + # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) + # It's a reasonable assumption to say that all axial widths/layers will be the same + + + filename = inputs['Cost File'] + cost_data = pd.read_csv(filename, index_col=0) + + # Eventually these will be arguments + material = 'W' + a_M = 0.15 # From Frank + a_CC = 0.54 # From Frank + a_0 = 0.7 + + # Radially Inner Cylinder + # length = 4.5 # End plug length from Frank + length = 0.5 # Is this the required shielding thickness? + a_M = 0.15 + r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding + r_vv = 0.01 # Reduced from 0.1 to 0.01 + + # r_magnet = 1.0 # original + r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses + r_cryostat = 1.0 + + f_vol = 0.90 + + + r_in = a_M + r_gap + r_vv + r_out = r_magnet - r_cryostat + + V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol + + # Central Cell Cylinder + # length_cc_cylinder = 50.0 + length_cc_cylinder = 0.5 + r_in_cc = a_CC + r_gap + r_vv + # r_out_cc = 1.0 + r_out_cc = r_in_cc+0.5 + + V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol + + # Central Cell Triangular Washer + V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol + + # End Plug Cylinder + length_ep_cylinder = 0.5 # From Frank + r_in_ep = a_0 + r_gap + r_vv + r_out_ep = r_in_ep + 0.5 + + V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol + + # End Cell Triangular Washer + V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol + + # For central cell facing magnet, add up all five regions + V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle + + # For expander cell facing magnet, only add up three regions + # No neutrons come from the expander cell + V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle + + # Summary information + V_total = V_total_cc_facing + V_total_ec_facing + mass = cost_data.loc[material]['density'] * V_total + cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass + + return(cost) + + + ### MNyberg's Magnet Methods ### + + # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 + # Table 2 should give good general information + # Critical current density from PROCESS + @staticmethod + def jcrit_rebco(temperature, b): + """Critical current density for "REBCO" 2nd generation HTS superconductor + temperature : input real : superconductor temperature (K) + b : input real : Magnetic field at superconductor (T) + jcrit : output real : Critical current density in superconductor (A/m2) + + Will return a negative number if the temperature is greater than Tc0, the + zero-field critical temperature. + """ + tc0 = 90.0 # (K) + birr0 = 132.5 # (T) + a = 1.82962e8 # scaling constant + # exponents + p = 0.5875 + q = 1.7 + alpha = 1.54121 + beta = 1.96679 + oneoveralpha = 1 / alpha + + validity = True + + if (temperature < 4.2) or (temperature > 72.0): + validity = False + if temperature < 65: + if (b < 0.0) or (b > 15.0): + validity = False + else: + if (b < 0.0) or (b > 11.5): + validity = False + + if not validity: + print( + # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" + ) + + if temperature < tc0: + # Normal case + birr = birr0 * (1 - temperature / tc0) ** alpha + else: + # If temp is greater than critical temp, ensure result is real but negative. + birr = birr0 * (1 - temperature / tc0) + + if b < birr: + # Normal case + factor = (b / birr) ** p * (1 - b / birr) ** q + jcrit = (a / b) * (birr**beta) * factor + else: + # Field is too high + # Ensure result is real but negative, and varies with temperature. + # tcb = critical temperature at field b + tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) + jcrit = -(temperature - tcb) + + return jcrit, validity + + @staticmethod + def HTS_storedEnergy(field, inner_rad, HTS_temp=20): + radius_in_wham = 6.65 # cm + radius_out_wham = 31.85 # cm + B_wham = 17 # T + cost_wham = 2.3/2 # MUSD + mew_0=1 # TODO if I value is needed change this to be the real constant value + width_ratio = 5 # TODO update + volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) + + j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] + + # Equation taking into account width and critical current ratios + I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) + outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) + # Old simple equation + # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) + volume_2 = math.pi*(outer_rad**2-inner_rad**2) + ratioOfVols=volume_2/volume_1 + + # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 + E_ratio=(field/B_wham)**2*ratioOfVols + cost_ratio=E_ratio**0.6 + return cost_ratio*cost_wham + + + @staticmethod + def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): + # This is the HF cost per magnet [MUSD], not for all four + + # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit + cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): + # This is the LF cost per magnet [MUSD] + + cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + @staticmethod + def CF_magnet_cost(inputs, CF_field=3.0): + # This is the CF cost per magnet [MUSD] + + convert_to_currentDollar = 1.31 + cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS + cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) + + return(cost * cost_factor) + + + + + diff --git a/tutorial/accert/ref_tables/mirror_accertdb.sql b/tutorial/accert/ref_tables/mirror_accertdb.sql new file mode 100644 index 0000000..402146e --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_accertdb.sql @@ -0,0 +1,1568 @@ +CREATE DATABASE IF NOT EXISTS `accert_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; +USE `accert_db`; +-- MySQL dump 10.13 Distrib 8.0.38, for macos14 (arm64) +-- +-- Host: 127.0.0.1 Database: accert_db +-- ------------------------------------------------------ +-- Server version 8.0.27 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `mirror_acco` +-- + +DROP TABLE IF EXISTS `mirror_acco`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +/*CREATE TABLE `mirror_acco` ( + `ind` int DEFAULT NULL, + `code_of_account` varchar(20) NOT NULL, + `account_description` text, + `total_cost` double DEFAULT NULL, + `level` int DEFAULT NULL, + `supaccount` text, + `review_status` text, + `prn` double DEFAULT NULL, + `alg_name` text, + `fun_unit` text, + `variables` text, + PRIMARY KEY (`code_of_account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; */ + +CREATE TABLE `mirror_acco` ( + `ind` int DEFAULT NULL, + `code_of_account` varchar(20) NOT NULL, + `account_description` text, + `total_cost` double DEFAULT NULL, + `total_cost_dollars` double DEFAULT NULL, + `level` int DEFAULT NULL, + `prn` double DEFAULT NULL, + `supaccount` text, + `alg_name` text, + `fun_unit` text, + `variables` text, + `algno` text, + PRIMARY KEY (`code_of_account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mirror_acco` +-- + +LOCK TABLES `mirror_acco` WRITE; +/*!40000 ALTER TABLE `mirror_acco` DISABLE KEYS */; +INSERT INTO `mirror_acco` VALUES (1, '10', 'Pre-Construction_Costs', '24.18611754', '$24186117.540000003', '0', '0.0046878318104200244', '', 'ac10', 'million', '', ''), (2, '11', 'Land_and_Land_Rights', '1.18611754', '$1186117.5399999998', '1', '0.00022989715177366762', '1', 'ac11', 'million', '', ''), (3, '12', 'Site_Permits', '10.0', '$10000000.0', '1', '0.0019382324602810245', '1', 'ac12', 'million', '', ''), (4, '13', 'Plant_Licensing', '0.0', '$0.0', '1', '0.0', '1', 'ac13', 'million', '', ''), (5, '14', 'Plant_Permits', '5.0', '$5000000.0', '1', '0.0009691162301405122', '1', 'ac14', 'million', '', ''), (6, '15', 'Plant_Studies', '5.0', '$5000000.0', '1', '0.0009691162301405122', '1', 'ac15', 'million', '', ''), (7, '16', 'Plant_Reports', '2.0', '$2000000.0', '1', '0.00038764649205620487', '1', 'ac16', 'million', '', ''), (8, '17', 'Other_Pre-Construction_Costs', '1.0', '$1000000.0', '1', '0.00019382324602810244', '1', 'ac17', 'million', '', ''), (9, '19', 'Contingency_on_Pre-Construction_Costs', '0.0', '$0.0', '1', '0.0', '1', 'ac19', 'million', '', ''), (10, '20', 'Capitalized_Direct_Costs_(CDC)', '1298.175963', '$1298175963.0', '0', '0.2516166790643178', '', 'ac20', 'million', '', ''), (11, '21', 'Structures_and_Improvements', '112.9457941', '$112945794.1', '1', '0.021891520437683703', '2', 'ac21', 'million', '', ''), (12, '21.1', 'Site_Preparation/Yard_Work', '42.37641442', '$42376414.42', '2', '0.008213534197916489', '21', 'ac21.1', 'million', '', ''), (13, '21.2', 'Heat_Island_Building', '29.53699334', '$29536993.34', '2', '0.005724955927069243', '21', 'ac21.2', 'million', '', ''), (14, '21.3', 'Turbine_Generator_Building', '8.538531265', '$8538531.264999999', '2', '0.0016549658460947396', '21', 'ac21.3', 'million', '', ''), (15, '21.4', 'Heat_Exchanger_Building', '5.976971885', '$5976971.885', '2', '0.0011584760921694063', '21', 'ac21.4', 'million', '', ''), (16, '21.5', 'Power_Supply_and_Energy_Storage', '1.707706253', '$1707706.253', '2', '0.00033099316921894796', '21', 'ac21.5', 'million', '', ''), (17, '21.6', 'Reactor_Auxiliaries', '0.8538531265', '$853853.1265', '2', '0.00016549658460947398', '21', 'ac21.6', 'million', '', ''), (18, '21.7', 'Hot_Cell', '14.76849667', '$14768496.67', '2', '0.0028624779635346214', '21', 'ac21.7', 'million', '', ''), (19, '21.8', 'Reactor_Services', '2.956861753', '$2956861.753', '2', '0.0005731085430228053', '21', 'ac21.8', 'million', '', ''), (20, '21.9', 'Service_Water', '0.0474362848', '$47436.2848', '2', '9.194254699449537e-06', '21', 'ac21.9', 'million', '', ''), (21, '21.10', 'Fuel_Storage', '0.1739330443', '$173933.0443', '2', '3.3712267237775744e-05', '', 'ac21.10', 'million', '', ''), (22, '21.11', 'Control_Room', '0.1423088544', '$142308.85439999998', '2', '2.7582764098348607e-05', '211', 'ac21.11', 'million', '', ''), (23, '21.12', 'Onsite_AC_Power', '0.1264967595', '$126496.7595', '2', '2.4518012538326203e-05', '211', 'ac21.12', 'million', '', ''), (24, '21.13', 'Administration', '0.6957321771', '$695732.1771', '2', '0.00013484906893172064', '211', 'ac21.13', 'million', '', ''), (25, '21.14', 'Site_Services', '0.252993519', '$252993.519', '2', '4.903602507665241e-05', '211', 'ac21.14', 'million', '', ''), (26, '21.15', 'Cryogenics', '0.3794902784', '$379490.2784', '2', '7.35540375955963e-05', '211', 'ac21.15', 'million', '', ''), (27, '21.16', 'Security', '0.1423088544', '$142308.85439999998', '2', '2.7582764098348607e-05', '211', 'ac21.16', 'million', '', ''), (28, '21.17', 'Ventilation_Stack', '4.269265632', '$4269265.632', '2', '0.0008274829229504582', '211', 'ac21.17', 'million', '', ''), (29, '22', 'Heat_Island_Plant_Equipment', '1111.99892', '$1111998920.0', '1', '0.21553124025414422', '2', 'ac22', 'million', '', ''), (30, '22.1', 'Heat_Island_Components', '901.9675668', '$901967566.8', '2', '0.17482228160924532', '22', 'ac22.1', 'million', '', ''), (31, '22.1.1', 'First_Wall_and_Blanket', '43.19343421', '$43193434.21', '3', '0.008371891625683487', '221', 'ac22.1.1', 'million', '', ''), (32, '22.1.2', 'Magnet_Radiation_Shield', '94.73695574', '$94736955.74', '3', '0.01836222428034747', '221', 'ac22.1.2', 'million', '', ''), (33, '22.1.3', 'Coils', '272.0399768', '$272039976.79999995', '3', '0.05272767135278568', '221', 'ac22.1.3', 'million', '', ''), (34, '22.1.3.1', 'HF_Coils', '116.4', '$116400000.0', '4', '0.022561025837671125', '2213', 'ac22.1.3.1', 'million', '', ''), (35, '22.1.3.2', 'LF_Coils', '12.50524', '$12505240.0', '4', '0.0024238062091604677', '2213', 'ac22.1.3.2', 'million', '', ''), (36, '22.1.3.3', 'CC_Coils', '143.1347368', '$143134736.8', '4', '0.02774283930595409', '2213', 'ac22.1.3.3', 'million', '', ''), (37, '22.1.4', 'Supplemental_Heating', '227.453', '$227453000.0', '3', '0.04408567877882998', '221', 'ac22.1.4', 'million', '', ''), (38, '22.1.4.1', 'NBI', '105.963', '$105963000.0', '4', '0.02053809261887582', '2214', 'ac22.1.4.1', 'million', '', ''), (39, '22.1.4.2', 'ICRH', '41.49', '$41490000.0', '4', '0.008041726477705971', '2214', 'ac22.1.4.2', 'million', '', ''), (40, '22.1.4.3', 'ECH', '80.0', '$80000000.0', '4', '0.015505859682248196', '2214', 'ac22.1.4.3', 'million', '', ''), (41, '22.1.5', 'Primary_Structure_and_Support', '0.0', '$0.0', '3', '0.0', '221', 'ac22.1.5', 'million', '', ''), (42, '22.1.6', 'Vacuum_System', '2.031827257', '$2031827.2570000002', '3', '0.00039381535432011556', '221', 'ac22.1.6', 'million', '', ''), (43, '22.1.6.2', 'Vessel_Refrigerators', '0.0', '$0.0', '4', '0.0', '2216', 'ac22.1.6.2', 'million', '', ''), (44, '22.1.6.3', 'Primary_Vacuum_Pumps', '1.689827257', '$1689827.257', '4', '0.0003275278041785045', '2216', 'ac22.1.6.3', 'million', '', ''), (45, '22.1.6.4', 'Backing_Vacuum_Pumps', '0.342', '$342000.0', '4', '6.628755014161104e-05', '2216', 'ac22.1.6.4', 'million', '', ''), (46, '22.1.7', 'Power_Supplies', '0.0', '$0.0', '3', '0.0', '221', 'ac22.1.7', 'million', '', ''), (47, '22.1.8', 'Divertor', '0.0', '$0.0', '3', '0.0', '221', 'ac22.1.8', 'million', '', ''), (48, '22.1.9', 'Direct_Energy_Convertor', '109.3171648', '$109317164.8', '3', '0.02118820772812502', '221', 'ac22.1.9', 'million', '', ''), (49, '22.1.11', 'Assembly_and_Installation_Costs', '153.1952079', '$153195207.9', '3', '0.029692792471128007', '2211', 'ac22.1.11', 'million', '', ''), (50, '22.2', 'Main_and_Secondary_Coolant', '33.6494515', '$33649451.5', '2', '0.0065220459167952', '22', 'ac22.2', 'million', '', ''), (51, '22.3', 'Auxiliary_Cooling_Systems', '0.3521982635', '$352198.2635', '2', '6.826421067703095e-05', '22', 'ac22.3', 'million', '', ''), (52, '22.4', 'Radioactive_Waste_Treatment', '0.6275532695', '$627553.2695', '2', '0.00012163441175003857', '22', 'ac22.4', 'million', '', ''), (53, '22.5', 'Fuel_Handling_and_Storage', '88.65405229', '$88654052.28999999', '2', '0.017183216188392927', '22', 'ac22.5', 'million', '', ''), (54, '22.6', 'Other_Heat_Island_Equipment', '1.748097852', '$1748097.852', '2', '0.0003388220000493934', '22', 'ac22.6', 'million', '', ''), (55, '22.7', 'Instrumentation_and_Control', '85.0', '$85000000.0', '2', '0.01647497591238871', '22', 'ac22.7', 'million', '', ''), (56, '23', 'Turbine_Plant_Equipment', '39.82276109', '$39822761.09', '1', '0.007718576820265415', '2', 'ac23', 'million', '', ''), (57, '24', 'Electric_Plant_Equipment', '9.819310954', '$9819310.954', '1', '0.0019032107228635835', '2', 'ac24', 'million', '', ''), (58, '25', 'Miscellaneous_Plant_Equipment', '6.909885486', '$6909885.4860000005', '1', '0.0013392964345789922', '2', 'ac25', 'million', '', ''), (59, '26', 'Heat_Rejection', '11.67929132', '$11679291.32', '1', '0.0022637181549502415', '2', 'ac26', 'million', '', ''), (60, '27', 'Special_Materials', '0.0', '$0.0', '1', '0.0', '2', 'ac27', 'million', '', ''), (61, '28', 'Digital_Twin/Simulator', '5.0', '$5000000.0', '1', '0.0009691162301405122', '2', 'ac28', 'million', '', ''), (62, '29', 'Contingency_on_Direct_Capital_Costs', '0.0', '$0.0', '1', '0.0', '2', 'ac29', 'million', '', ''), (63, '30', 'Capitalized_Indirect_Service_Costs_(CISC)', '71.59197058', '$71591970.58', '0', '0.013876188127364011', '', 'ac30', 'million', '', ''), (64, '31', 'Field_Indirect_Costs', '14.31839412', '$14318394.120000001', '1', '0.0027752376262480953', '3', 'ac31', 'million', '', ''), (65, '32', 'Construction_Supervision', '35.79598529', '$35795985.29', '1', '0.0069380940636820055', '3', 'ac32', 'million', '', ''), (66, '33', 'Commissioning_and_Start-Up_Costs', '0.0', '$0.0', '1', '0.0', '3', 'ac33', 'million', '', ''), (67, '34', 'Demonstration_Test_Run', '0.0', '$0.0', '1', '0.0', '3', 'ac34', 'million', '', ''), (68, '35', 'Design_Services_Offsite', '21.47759117', '$21477591.17', '1', '0.004162856437433911', '3', 'ac35', 'million', '', ''), (69, '36', 'PM/CM_Services_Offsite', '0.0', '$0.0', '1', '0.0', '3', 'ac36', 'million', '', ''), (70, '37', 'Design_Servies_Offsite', '0.0', '$0.0', '1', '0.0', '3', 'ac37', 'million', '', ''), (71, '38', 'PM/CM_Services_Onsite', '0.0', '$0.0', '1', '0.0', '3', 'ac38', 'million', '', ''), (72, '39', 'Contingency_on_Support_Services', '0.0', '$0.0', '1', '0.0', '3', 'ac39', 'million', '', ''), (73, '40', "Capitalized_Owner's_Cost_(COC)", '155.7811156', '$155781115.6', '0', '0.030194001495471065', '', 'ac40', 'million', '', ''), (74, '50', 'Capitalized_Supplementary_Costs_(CSC)', '37.83719261', '$37837192.61', '0', '0.00733372749226073', '', 'ac50', 'million', '', ''), (75, '51', 'Shipping_and_Transportation_Costs', '8.0', '$8000000.0', '1', '0.0015505859682248195', '5', 'ac51', 'million', '', ''), (76, '52', 'Spare_Parts', '7.323124886', '$7323124.886', '1', '0.0014193918364736975', '5', 'ac52', 'million', '', ''), (77, '53', 'Taxes', '0.0', '$0.0', '1', '0.0', '5', 'ac53', 'million', '', ''), (78, '54', 'Insurance', '1.0', '$1000000.0', '1', '0.00019382324602810244', '5', 'ac54', 'million', '', ''), (79, '55', 'Initial_Fuel_Load', '21.51406772', '$21514067.72', '1', '0.004169926440758817', '5', 'ac55', 'million', '', ''), (80, '58', 'Decommissioning_Costs', '0.0', '$0.0', '1', '0.0', '5', 'ac58', 'million', '', ''), (81, '59', 'Contingency_on_Supplementary_Costs', '0.0', '$0.0', '1', '0.0', '5', 'ac59', 'million', '', ''), (82, '60', 'Capitalized_Financial_Costs_(CFC)', '195.4094412', '$195409441.20000002', '0', '0.03787489219792162', '', 'ac60', 'million', '', ''), (83, '61', 'Escalation', '20.125', '$20125000.0', '1', '0.003900692826315562', '6', 'ac61', 'million', '', ''), (84, '62', 'Fees', '0.0', '$0.0', '1', '0.0', '6', 'ac62', 'million', '', ''), (85, '63', 'Interest_During_Construction_(IDC)', '175.2844412', '$175284441.20000002', '1', '0.033974199371606055', '6', 'ac63', 'million', '', ''), (86, '69', 'Contingency_on_Capitalized_Financial_Costs', '0.0', '$0.0', '1', '0.0', '6', 'ac69', 'million', '', ''), (87, 'OCC', 'Overnight_Capital_Cost_(OCC)', '1587.572359', '$1587572359.0', '0', '0.307708427925872', 'OC', 'acOCC', 'million', '', ''), (88, 'TCC', 'Total_Capital_Cost_(TCC)', '1782.981801', '$1782981801.0', '0', '0.3455833202788522', 'TC', 'acTCC', 'million', '', ''), (89, 'O&M', 'Operations_and_Maintenance', '5.69490028', '$5694900.279999999', '0', '0.0011038040580759493', 'O&', 'acO&M', 'million', '', ''), (90, 'Fuel', 'Fuel', '0.1090042081', '$109004.2081', '0', '2.1127549444664777e-05', 'Fue', 'acFuel', 'million', '', ''), (91, '81', 'Deuterium', '0.04739117657', '$47391.176569999996', '1', '9.185511675888353e-06', '8', 'ac81', 'million', '', ''); +/*!40000 ALTER TABLE `mirror_acco` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mirror_alg` +-- + +DROP TABLE IF EXISTS `mirror_alg`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mirror_alg` ( + `ind` int DEFAULT NULL, + `alg_name` varchar(20) NOT NULL, + `alg_for` text, + `alg_description` text, + `alg_python` text, + `alg_formulation` text, + `alg_units` text, + PRIMARY KEY (`alg_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mirror_alg` +-- + +LOCK TABLES `mirror_alg` WRITE; +/*!40000 ALTER TABLE `mirror_alg` DISABLE KEYS */; +INSERT INTO `mirror_alg` VALUES ('1', '__init__', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('2', 'add_account', 'v', 'Add an account to the cost_account object.', 'MirrorFunc', 'TODO', 'TODO'), ('3', 'generate_report', 'v', 'Generate a report based on user input.', 'MirrorFunc', 'TODO', 'TODO'), ('4', 'learning_credit', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('5', 'Account_C20', 'c', 'Account C20 Rollup', 'MirrorFunc', 'TODO', 'million'), ('6', 'Account_C21', 'c', 'Account C21 Rollup', 'MirrorFunc', 'TODO', 'million'), ('7', 'Account_C21_1', 'c', 'Account C211 Rollup', 'MirrorFunc', 'TODO', 'million'), ('8', 'Account_C21_2', 'c', 'Account C212 Rollup', 'MirrorFunc', 'TODO', 'million'), ('9', 'Account_C21_3', 'c', 'Account C213 Rollup', 'MirrorFunc', 'TODO', 'million'), ('10', 'Account_C21_4', 'c', 'Account C214 Rollup', 'MirrorFunc', 'TODO', 'million'), ('11', 'Account_C21_5', 'c', 'Account C215 Rollup', 'MirrorFunc', 'TODO', 'million'), ('12', 'Account_C21_6', 'c', 'Account C216 Rollup', 'MirrorFunc', 'TODO', 'million'), ('13', 'Account_C21_7', 'c', 'Account C217 Rollup', 'MirrorFunc', 'TODO', 'million'), ('14', 'Account_C21_8', 'c', 'Account C218 Rollup', 'MirrorFunc', 'TODO', 'million'), ('15', 'Account_C21_9', 'c', 'Account C219 Rollup', 'MirrorFunc', 'TODO', 'million'), ('16', 'Account_C21_10', 'c', 'Account C2110 Rollup', 'MirrorFunc', 'TODO', 'million'), ('17', 'Account_C21_11', 'c', 'Account C2111 Rollup', 'MirrorFunc', 'TODO', 'million'), ('18', 'Account_C21_12', 'c', 'Account C2112 Rollup', 'MirrorFunc', 'TODO', 'million'), ('19', 'Account_C21_13', 'c', 'Account C2113 Rollup', 'MirrorFunc', 'TODO', 'million'), ('20', 'Account_C21_14', 'c', 'Account C2114 Rollup', 'MirrorFunc', 'TODO', 'million'), ('21', 'Account_C21_15', 'c', 'Account C2115 Rollup', 'MirrorFunc', 'TODO', 'million'), ('22', 'Account_C21_16', 'c', 'Account C2116 Rollup', 'MirrorFunc', 'TODO', 'million'), ('23', 'Account_C21_17', 'c', 'Account C2117 Rollup', 'MirrorFunc', 'TODO', 'million'), ('24', 'Account_C22', 'c', 'Account C22 Rollup', 'MirrorFunc', 'TODO', 'million'), ('25', 'Account_C22_1', 'c', 'Account C221 Rollup', 'MirrorFunc', 'TODO', 'million'), ('26', 'Account_C22_1_1', 'c', 'Account C2211 Rollup', 'MirrorFunc', 'TODO', 'million'), ('27', 'Account_C22_1_2', 'c', 'Account C2212 Rollup', 'MirrorFunc', 'TODO', 'million'), ('28', 'Account_C22_1_3', 'c', 'Account C2213 Rollup', 'MirrorFunc', 'TODO', 'million'), ('29', 'Account_C22_1_3_1', 'c', 'Account C22131 Rollup', 'MirrorFunc', 'TODO', 'million'), ('30', 'Account_C22_1_3_2', 'c', 'Account C22132 Rollup', 'MirrorFunc', 'TODO', 'million'), ('31', 'Account_C22_1_3_3', 'c', 'Account C22133 Rollup', 'MirrorFunc', 'TODO', 'million'), ('32', 'Account_C22_1_4', 'c', 'Account C2214 Rollup', 'MirrorFunc', 'TODO', 'million'), ('33', 'Account_C22_1_4_1', 'c', 'Account C22141 Rollup', 'MirrorFunc', 'TODO', 'million'), ('34', 'Account_C22_1_4_2', 'c', 'Account C22142 Rollup', 'MirrorFunc', 'TODO', 'million'), ('35', 'Account_C22_1_4_3', 'c', 'Account C22143 Rollup', 'MirrorFunc', 'TODO', 'million'), ('36', 'Account_C22_1_5', 'c', 'Account C2215 Rollup', 'MirrorFunc', 'TODO', 'million'), ('37', 'Account_C22_1_6', 'c', 'Account C2216 Rollup', 'MirrorFunc', 'TODO', 'million'), ('38', 'Account_C22_1_6_2', 'c', 'Account C22162 Rollup', 'MirrorFunc', 'TODO', 'million'), ('39', 'Account_C22_1_6_3', 'c', 'Account C22163 Rollup', 'MirrorFunc', 'TODO', 'million'), ('40', 'Account_C22_1_6_4', 'c', 'Account C22164 Rollup', 'MirrorFunc', 'TODO', 'million'), ('41', 'Account_C22_1_7', 'c', 'Account C2217 Rollup', 'MirrorFunc', 'TODO', 'million'), ('42', 'Account_C22_1_8', 'c', 'Account C2218 Rollup', 'MirrorFunc', 'TODO', 'million'), ('43', 'Account_C22_1_9', 'c', 'Account C2219 Rollup', 'MirrorFunc', 'TODO', 'million'), ('44', 'Account_C22_1_11', 'c', 'Account C22111 Rollup', 'MirrorFunc', 'TODO', 'million'), ('45', 'Account_C22_2', 'c', 'Account C222 Rollup', 'MirrorFunc', 'TODO', 'million'), ('46', 'Account_C22_2_1', 'c', 'Account C2221 Rollup', 'MirrorFunc', 'TODO', 'million'), ('47', 'Account_C22_2_2', 'c', 'Account C2222 Rollup', 'MirrorFunc', 'TODO', 'million'), ('48', 'Account_C22_2_3', 'c', 'Account C2223 Rollup', 'MirrorFunc', 'TODO', 'million'), ('49', 'Account_C22_3', 'c', 'Account C223 Rollup', 'MirrorFunc', 'TODO', 'million'), ('50', 'Account_C22_4', 'c', 'Account C224 Rollup', 'MirrorFunc', 'TODO', 'million'), ('51', 'Account_C22_5', 'c', 'Account C225 Rollup', 'MirrorFunc', 'TODO', 'million'), ('52', 'Account_C22_6', 'c', 'Account C226 Rollup', 'MirrorFunc', 'TODO', 'million'), ('53', 'Account_C22_7', 'c', 'Account C227 Rollup', 'MirrorFunc', 'TODO', 'million'), ('54', 'Account_C23', 'c', 'Account C23 Rollup', 'MirrorFunc', 'TODO', 'million'), ('55', 'Account_C24', 'c', 'Account C24 Rollup', 'MirrorFunc', 'TODO', 'million'), ('56', 'Account_C25', 'c', 'Account C25 Rollup', 'MirrorFunc', 'TODO', 'million'), ('57', 'Account_C26', 'c', 'Account C26 Rollup', 'MirrorFunc', 'TODO', 'million'), ('58', 'Account_C27', 'c', 'Account C27 Rollup', 'MirrorFunc', 'TODO', 'million'), ('59', 'Account_C28', 'c', 'Account C28 Rollup', 'MirrorFunc', 'TODO', 'million'), ('60', 'Account_C29', 'c', 'Account C29 Rollup', 'MirrorFunc', 'TODO', 'million'), ('61', 'Account_OCC', 'c', 'Account OCC Rollup', 'MirrorFunc', 'TODO', 'million'), ('62', 'Account_TCC', 'c', 'Account TCC Rollup', 'MirrorFunc', 'TODO', 'million'), ('63', 'Account_C90', 'c', 'Account C90 Rollup', 'MirrorFunc', 'TODO', 'million'), ('64', 'PbLi_density', 'v', 'Returns PbLi density (kg/m^3). Assumes the PbLi is a eutectic, which has', 'MirrorFunc', 'TODO', 'TODO'), ('65', 'Li_price', 'v', 'Return Li price (USD/kg) for enrichment levels above 90% 6Li', 'MirrorFunc', 'TODO', 'TODO'), ('66', 'PbLi_price', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('67', 'V_cylindrical_shell', 'v', 'Return volume of a cylindrical shell', 'MirrorFunc', 'TODO', 'TODO'), ('68', 'V_inverse_triangular_washer', 'v', 'Return volume of cylindrical inverse triangular washer.', 'MirrorFunc', 'TODO', 'TODO'), ('69', 'generate_inputs', 'v', 'Return a dict containing all inputs for a techno-economic analysis.', 'MirrorFunc', 'TODO', 'TODO'), ('70', 'create_radial_build', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('71', 'add_new_layer', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('72', 'add_fractional_layer', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('73', 'build_central_cell', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('74', 'central_cell_cost', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('75', 'central_cell', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('76', 'expander_cell_cost', 'v', 'Each expander cell is made up of:', 'MirrorFunc', 'TODO', 'TODO'), ('77', 'HF_magnet_cost', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('78', 'LF_magnet_cost', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('79', 'CF_magnet_cost', 'v', 'None', 'MirrorFunc', 'TODO', 'TODO'), ('80', 'HF_magnet_shield_cost', 'v', 'The HF coils have annular shield with a U-shaped cross section:', 'MirrorFunc', 'TODO', 'TODO'); +/*!40000 ALTER TABLE `mirror_alg` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `mirror_var` +-- + +DROP TABLE IF EXISTS `mirror_var`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mirror_var` ( + `ind` int DEFAULT NULL, + `var_name` varchar(30) NOT NULL, + `var_description` text, + `var_value` double DEFAULT NULL, + `var_unit` text, + `var_alg` text, + `var_need` text, + `v_linked` text, + `user_input` int DEFAULT NULL, + PRIMARY KEY (`var_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `mirror_var` +-- + +LOCK TABLES `mirror_var` WRITE; +/*!40000 ALTER TABLE `mirror_var` DISABLE KEYS */; +INSERT INTO `mirror_var` VALUES ('1', 'E_DT', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('2', 'E_alpha', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('3', 'E_n', 'str', '', 'TODO', 'E_DT, E_alpha', 'TODO', 'TODO', ''), ('4', 'm_T', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('5', 'm_D', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('6', 'm_6Li', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('7', 'Wh_to_BTU', 'float', '3.41214', 'TODO', '', 'TODO', 'TODO', ''), ('8', 'indentation', 'int', '0', 'TODO', '', 'TODO', 'TODO', ''), ('9', 'indented_name', 'str', '', 'TODO', 'account_name, account_number, indentation', 'TODO', 'TODO', ''), ('10', 'inputs', 'str', '', 'TODO', 'NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness', 'TODO', 'TODO', ''), ('11', 'cost_data', 'str', '', 'TODO', 'cost_account', 'TODO', 'TODO', ''), ('12', 'L_magnet_to_magnet', 'str', '', 'TODO', 'inputs', 'TODO', 'TODO', ''), ('13', 'L_cylinder', 'str', '', 'TODO', 'L_magnet_to_magnet', 'TODO', 'TODO', ''), ('14', 'expander_cell_cost_result', 'str', '', 'TODO', 'expander_cell_cost, inputs', 'TODO', 'TODO', ''), ('15', 'end_plug_cylindrical_part', 'str', '', 'TODO', 'L_cylinder, central_cell, inputs', 'TODO', 'TODO', ''), ('16', 'end_plug_cylindrical_part_cost', 'str', '', 'TODO', 'end_plug_cylindrical_part', 'TODO', 'TODO', ''), ('17', 'central_cell_cylindrical_part', 'str', '', 'TODO', 'central_cell, inputs', 'TODO', 'TODO', ''), ('18', 'central_cell_cylindrical_part_cost', 'str', '', 'TODO', 'central_cell_cylindrical_part', 'TODO', 'TODO', ''), ('19', 'total_cost', 'str', '', 'TODO', 'central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result', 'TODO', 'TODO', ''), ('20', 'cost_factor', 'str', '', 'TODO', 'inputs, np', 'TODO', 'TODO', ''), ('21', 'cost_pump', 'int', '40000', 'TODO', '', 'TODO', 'TODO', ''), ('22', 'vpump_cap', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('23', 'no_vpumps', 'str', '', 'TODO', 'inputs, vpump_cap', 'TODO', 'TODO', ''), ('24', 'axis_t', 'str', '', 'TODO', 'inputs, np', 'TODO', 'TODO', ''), ('25', 'axis_ir', 'str', '', 'TODO', 'axis_t', 'TODO', 'TODO', ''), ('26', 'lr', 'str', '', 'TODO', '', 'TODO', 'TODO', ''), ('27', 'constructionworker', 'str', '', 'TODO', 'axis_ir', 'TODO', 'TODO', ''), ('28', 'C_22_1_11_in', 'str', '', 'TODO', 'inputs, lr', 'TODO', 'TODO', ''), ('29', 'C_22_1_11_1_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('30', 'C_22_1_11_2_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('31', 'C_22_1_11_3_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('32', 'C_22_1_11_4_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('33', 'C_22_1_11_5_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('34', 'C_22_1_11_6_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('35', 'C_22_1_11_7_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('36', 'C_22_1_11_8_in', 'int', '0', 'TODO', '', 'TODO', 'TODO', ''), ('37', 'C_22_1_11_9_in', 'str', '', 'TODO', 'constructionworker, inputs, lr', 'TODO', 'TODO', ''), ('38', 'C_22_1_11_10_in', 'int', '0', 'TODO', '', 'TODO', 'TODO', ''), ('39', 'C220111', 'str', '', 'TODO', 'C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in', 'TODO', 'TODO', ''), ('40', 'inflation', 'float', '1.43', 'TODO', '', 'TODO', 'TODO', ''), ('41', 'C2205010ITER', 'str', '', 'TODO', 'inflation', 'TODO', 'TODO', ''), ('42', 'C2205020ITER', 'str', '', 'TODO', 'inflation', 'TODO', 'TODO', ''), ('43', 'C2205030ITER', 'str', '', 'TODO', 'inflation', 'TODO', 'TODO', ''), ('44', 'C2205040ITER', 'str', '', 'TODO', 'inflation', 'TODO', 'TODO', ''), ('45', 'C2205050ITER', 'str', '', 'TODO', 'inflation', 'TODO', 'TODO', ''), ('46', 'C2205060ITER', 'str', '', 'TODO', 'inflation', 'TODO', 'TODO', ''), ('47', 'lcredit', 'float', '0.8', 'TODO', '', 'TODO', 'TODO', ''), ('48', 'ltoak', 'str', '', 'TODO', 'lcredit, np', 'TODO', 'TODO', ''), ('49', 'C220501', 'str', '', 'TODO', 'C2205010ITER, ltoak', 'TODO', 'TODO', ''), ('50', 'C220502', 'str', '', 'TODO', 'C2205020ITER, ltoak', 'TODO', 'TODO', ''), ('51', 'C220503', 'str', '', 'TODO', 'C2205030ITER, ltoak', 'TODO', 'TODO', ''), ('52', 'C220504', 'str', '', 'TODO', 'C2205040ITER, ltoak', 'TODO', 'TODO', ''), ('53', 'C220505', 'str', '', 'TODO', 'C2205050ITER, ltoak', 'TODO', 'TODO', ''), ('54', 'C220506', 'str', '', 'TODO', 'C2205060ITER, ltoak', 'TODO', 'TODO', ''), ('55', 'C220500', 'str', '', 'TODO', 'C220501, C220502, C220503, C220504, C220505, C220506', 'TODO', 'TODO', ''), ('56', 'f_cr', 'float', '0.09', 'TODO', '', 'TODO', 'TODO', ''), ('57', 'f_6Li_natural', 'float', '0.075', 'TODO', '', 'TODO', 'TODO', ''), ('58', 'rho_6Li', 'float', '460.0', 'TODO', '', 'TODO', 'TODO', ''), ('59', 'rho_7Li', 'float', '537.0', 'TODO', '', 'TODO', 'TODO', ''), ('60', 'T_K', 'str', '', 'TODO', 'T', 'TODO', 'TODO', ''), ('61', 'rho_PbLi', 'str', '', 'TODO', 'T_K', 'TODO', 'TODO', ''), ('62', 'P_6Li075', 'float', '15.152', 'TODO', '', 'TODO', 'TODO', ''), ('63', 'P_6Li90', 'int', '70', 'TODO', '', 'TODO', 'TODO', ''), ('64', 'f', 'list', '(0.9, 0.99, 0.999, 0.9999, 0.99999)', 'TODO', '', 'TODO', 'TODO', ''), ('65', 'Cf', 'list', '(1, 2, 4, 8, 16)', 'TODO', '', 'TODO', 'TODO', ''), ('66', 'f_interp', 'str', '', 'TODO', 'Cf, f, scipy', 'TODO', 'TODO', ''), ('67', 'f_Li', 'float', '0.17', 'TODO', '', 'TODO', 'TODO', ''), ('68', 'f_Pb', 'str', '', 'TODO', 'f_Li', 'TODO', 'TODO', ''), ('69', 'P_Li', 'str', '', 'TODO', 'Li_price, f_6Li', 'TODO', 'TODO', ''), ('70', 'P_PbLi', 'str', '', 'TODO', 'P_Li, P_Pb, f_Li, f_Pb', 'TODO', 'TODO', ''), ('71', 'P_f_CC', 'str', '', 'TODO', 'P_f, P_f_EP', 'TODO', 'TODO', ''), ('72', 'L_CC', 'str', '', 'TODO', 'P_f_CC, P_f_L', 'TODO', 'TODO', ''), ('73', 'L_CF', 'float', '1.0', 'TODO', '', 'TODO', 'TODO', ''), ('74', 'L', 'str', '', 'TODO', 'L_CC, L_EC, L_EP', 'TODO', 'TODO', ''), ('75', 'V_vac', 'str', '', 'TODO', 'L, a_EC, np', 'TODO', 'TODO', ''), ('76', 'P_alpha', 'str', '', 'TODO', 'E_DT, E_alpha, P_f', 'TODO', 'TODO', ''), ('77', 'P_n', 'str', '', 'TODO', 'P_alpha, P_f', 'TODO', 'TODO', ''), ('78', 'P_ine', 'str', '', 'TODO', 'P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI', 'TODO', 'TODO', ''), ('79', 'P_pump', 'str', '', 'TODO', 'M_n, P_n, f_pump', 'TODO', 'TODO', ''), ('80', 'P_sub_cont', 'str', '', 'TODO', 'P_f, f_sub', 'TODO', 'TODO', ''), ('81', 'P_cryo', 'str', '', 'TODO', 'P_f, f_cryo', 'TODO', 'TODO', ''), ('82', 'P_other', 'str', '', 'TODO', 'P_cryo, P_pump, P_sub_cont', 'TODO', 'TODO', ''), ('83', 'P_in', 'str', '', 'TODO', 'P_ECH, P_ICRH, P_NBI', 'TODO', 'TODO', ''), ('84', 'P_th', 'str', '', 'TODO', 'M_n, P_n, P_pump, eta_pump', 'TODO', 'TODO', ''), ('85', 'P_the', 'str', '', 'TODO', 'P_th, eta_th', 'TODO', 'TODO', ''), ('86', 'P_DEC', 'str', '', 'TODO', 'P_alpha, P_in', 'TODO', 'TODO', ''), ('87', 'P_DECe', 'str', '', 'TODO', 'P_DEC, eta_DEC', 'TODO', 'TODO', ''), ('88', 'P_egross', 'str', '', 'TODO', 'P_DECe, P_the', 'TODO', 'TODO', ''), ('89', 'P_enet', 'str', '', 'TODO', 'P_egross, P_ine, P_other', 'TODO', 'TODO', ''), ('90', 'f_aux', 'str', '', 'TODO', 'P_aux, P_egross', 'TODO', 'TODO', ''), ('91', 'Q_sci', 'str', '', 'TODO', 'P_f, P_in', 'TODO', 'TODO', ''), ('92', 'Q_eng', 'str', '', 'TODO', 'P_egross, P_ine, P_other', 'TODO', 'TODO', ''), ('93', 'f_refrac', 'str', '', 'TODO', 'Q_eng', 'TODO', 'TODO', ''), ('94', 'run_name', 'str', '', 'TODO', 'P_f, float', 'TODO', 'TODO', ''), ('95', 'cost_file_full', 'str', '', 'TODO', 'cost_file, pkg_resources', 'TODO', 'TODO', ''), ('96', 'new_data', 'str', '', 'TODO', 'f_vol, material, name, pd, thickness', 'TODO', 'TODO', ''), ('97', 'r_in', 'str', '', 'TODO', 'data', 'TODO', 'TODO', ''), ('98', 'r_out', 'str', '', 'TODO', 'data', 'TODO', 'TODO', ''), ('99', 'radial_build', 'str', '', 'TODO', 'create_radial_build, inputs', 'TODO', 'TODO', ''), ('100', 'filename', 'str', '', 'TODO', 'inputs', 'TODO', 'TODO', ''), ('101', 'T', 'int', '300', 'TODO', '', 'TODO', 'TODO', ''), ('102', 'material', 'str', '', 'TODO', 'i, radial_build', 'TODO', 'TODO', ''), ('103', 'f_6Li', 'float', '0.075', 'TODO', '', 'TODO', 'TODO', ''), ('104', 'radius', 'str', '', 'TODO', 'inputs', 'TODO', 'TODO', ''), ('105', 'thickness', 'str', '', 'TODO', 'inputs', 'TODO', 'TODO', ''), ('106', 'vv_material', 'str', '', 'TODO', 'inputs', 'TODO', 'TODO', ''), ('107', 'V_end_cap', 'str', '', 'TODO', 'np, radius, thickness', 'TODO', 'TODO', ''), ('108', 'M_end_cap', 'str', '', 'TODO', 'V_end_cap, cost_data, vv_material', 'TODO', 'TODO', ''), ('109', 'C_end_cap', 'str', '', 'TODO', 'M_end_cap, cost_data, vv_material', 'TODO', 'TODO', ''), ('110', 'total', 'str', '', 'TODO', 'C_end_cap, radial_build', 'TODO', 'TODO', ''), ('111', 'cost', 'float', '29.1', 'TODO', '', 'TODO', 'TODO', ''), ('112', 'a_M', 'float', '0.15', 'TODO', '', 'TODO', 'TODO', ''), ('113', 'a_CC', 'float', '0.54', 'TODO', '', 'TODO', 'TODO', ''), ('114', 'a_0', 'float', '0.7', 'TODO', '', 'TODO', 'TODO', ''), ('115', 'length', 'float', '0.5', 'TODO', '', 'TODO', 'TODO', ''), ('116', 'r_gap', 'float', '0.1', 'TODO', '', 'TODO', 'TODO', ''), ('117', 'r_vv', 'float', '0.01', 'TODO', '', 'TODO', 'TODO', ''), ('118', 'r_magnet', 'float', '1.5', 'TODO', '', 'TODO', 'TODO', ''), ('119', 'r_cryostat', 'float', '1.0', 'TODO', '', 'TODO', 'TODO', ''), ('120', 'f_vol', 'float', '0.9', 'TODO', '', 'TODO', 'TODO', ''), ('121', 'V_radially_inner_cylinder', 'str', '', 'TODO', 'V_cylindrical_shell, f_vol, length, r_in, r_out', 'TODO', 'TODO', ''), ('122', 'length_cc_cylinder', 'float', '0.5', 'TODO', '', 'TODO', 'TODO', ''), ('123', 'r_in_cc', 'str', '', 'TODO', 'a_CC, r_gap, r_vv', 'TODO', 'TODO', ''), ('124', 'r_out_cc', 'str', '', 'TODO', 'r_in_cc', 'TODO', 'TODO', ''), ('125', 'V_cc_cylinder', 'str', '', 'TODO', 'V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc', 'TODO', 'TODO', ''), ('126', 'V_cc_triangle', 'str', '', 'TODO', 'V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc', 'TODO', 'TODO', ''), ('127', 'length_ep_cylinder', 'float', '0.5', 'TODO', '', 'TODO', 'TODO', ''), ('128', 'r_in_ep', 'str', '', 'TODO', 'a_0, r_gap, r_vv', 'TODO', 'TODO', ''), ('129', 'r_out_ep', 'str', '', 'TODO', 'r_in_ep', 'TODO', 'TODO', ''), ('130', 'V_ep_cylinder', 'str', '', 'TODO', 'V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep', 'TODO', 'TODO', ''), ('131', 'V_ep_triangle', 'str', '', 'TODO', 'V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep', 'TODO', 'TODO', ''), ('132', 'V_total_cc_facing', 'str', '', 'TODO', 'V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder', 'TODO', 'TODO', ''), ('133', 'V_total_ec_facing', 'str', '', 'TODO', 'V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder', 'TODO', 'TODO', ''), ('134', 'V_total', 'str', '', 'TODO', 'V_total_cc_facing, V_total_ec_facing', 'TODO', 'TODO', ''), ('135', 'mass', 'str', '', 'TODO', 'V_total, cost_data, material', 'TODO', 'TODO', ''); +/*!40000 ALTER TABLE `mirror_var` ENABLE KEYS */; +UNLOCK TABLES; + +/* TODO add mirror vars and others */ + +-- +-- Dumping events for database 'accert_db' +-- + +-- +-- Dumping routines for database 'accert_db' +-- +/*!50003 DROP PROCEDURE IF EXISTS `cal_direct_cost_elements` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `cal_direct_cost_elements`(IN acc_table VARCHAR(50), + IN cel_table varchar(50)) +BEGIN + DECLARE tprn DECIMAL(18,6); + + -- Calculate tprn (sum of 'prn' in the account table) + SET @query = CONCAT('SELECT SUM(t1.prn) INTO @tprn + FROM ', acc_table, ' AS t1 + LEFT JOIN ', acc_table, ' AS t2 + ON t1.code_of_account = t2.supaccount + WHERE t2.code_of_account IS NULL + AND t1.code_of_account != ''2'' + AND t1.code_of_account != ''2C'';'); + PREPARE stmt FROM @query; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + -- Get the calculated tprn value + SET tprn = @tprn; + + -- Select the calculated 'fac', 'lab', and 'mat' values + SET @query = CONCAT('SELECT cost_2017 / ', tprn, ' AS fac FROM ', cel_table, ' + WHERE account = ''2'' AND cost_element = ''2c_fac'';'); + PREPARE stmt FROM @query; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + SET @query = CONCAT('SELECT cost_2017 / ', tprn, ' AS lab FROM ', cel_table, ' + WHERE account = ''2'' AND cost_element = ''2c_lab'';'); + PREPARE stmt FROM @query; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + SET @query = CONCAT('SELECT cost_2017 / ', tprn, ' AS mat FROM ', cel_table, ' + WHERE account = ''2'' AND cost_element = ''2c_mat'';'); + PREPARE stmt FROM @query; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + SET @query = CONCAT('SELECT + (SELECT cost_2017 / ', tprn, ' FROM ', cel_table, ' WHERE account = ''2'' AND cost_element = ''2c_fac'') AS fac, + (SELECT cost_2017 / ', tprn, ' FROM ', cel_table, ' WHERE account = ''2'' AND cost_element = ''2c_lab'') AS lab, + (SELECT cost_2017 / ', tprn, ' FROM ', cel_table, ' WHERE account = ''2'' AND cost_element = ''2c_mat'') AS mat;'); + + PREPARE stmt FROM @query; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_affected_accounts` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_affected_accounts`(IN acc_table VARCHAR(50), + IN var_table VARCHAR(50)) +BEGIN + SET @stmt = CONCAT("SELECT va.var_name, (SELECT GROUP_CONCAT(ac.code_of_account SEPARATOR ', ') + FROM ", acc_table, " ac + WHERE FIND_IN_SET(va.var_name, REPLACE(ac.variables, ' ', '')) > 0) AS ac_affected + FROM + (SELECT * FROM ",var_table," + WHERE user_input = 1) as va + WHERE (SELECT GROUP_CONCAT(ac.code_of_account SEPARATOR ', ') + FROM ", acc_table, " ac + WHERE FIND_IN_SET(va.var_name, REPLACE(ac.variables, ' ', '')) > 0) IS NOT NULL + "); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_affected_cost_elements` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_affected_cost_elements`(IN cel_table varchar(50), + IN var_table varchar(50)) +BEGIN + SET @stmt = CONCAT("SELECT va.var_name, (SELECT GROUP_CONCAT(ce.cost_element SEPARATOR ', ') + FROM ", cel_table, " ce + WHERE FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0) AS ce_affected + FROM + (SELECT * FROM ",var_table," + WHERE user_input = 1) as va + WHERE (SELECT GROUP_CONCAT(ce.cost_element SEPARATOR ', ') + FROM ", cel_table, " ce + WHERE FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0) IS NOT NULL + "); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_affected_cost_elements_w_dis` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_affected_cost_elements_w_dis`(IN cel_table varchar(50), + IN var_table varchar(50)) +BEGIN + SET @stmt = CONCAT("SELECT va.var_name,va.var_description, (SELECT GROUP_CONCAT(ce.cost_element SEPARATOR ', ') + FROM ", cel_table, " ce + WHERE FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0) AS ce_affected + FROM + (SELECT * FROM ",var_table," + WHERE user_input = 1) as va + WHERE (SELECT GROUP_CONCAT(ce.cost_element SEPARATOR ', ') + FROM cost_element ce + WHERE FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0) IS NOT NULL + "); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_changed_cost_elements` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_changed_cost_elements`(IN cel_table VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT cost_element, cost_2017 + FROM ',cel_table,' + WHERE updated != 0 + ORDER BY account, cost_element;'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_super_val` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_super_val`(IN table_name VARCHAR(50), + IN var_name VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT v_linked FROM ', table_name, ' WHERE var_name = ?'); + PREPARE stmt FROM @stmt; + SET @var_name = var_name; + EXECUTE stmt USING @var_name; + DEALLOCATE PREPARE stmt; + END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_total_cost_on_name` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_total_cost_on_name`(IN table_name VARCHAR(50), + IN tc_name VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT code_of_account, account_description, total_cost + FROM ', table_name, ' WHERE code_of_account = ?'); +PREPARE stmt FROM @stmt; +SET @tc_name = tc_name; +EXECUTE stmt USING @tc_name; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_user_changed_variables` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_user_changed_variables`(IN table_name VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT var_name,var_description, var_value, var_unit + FROM ', table_name, ' WHERE user_input = 1 ORDER BY var_name;'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `extract_variable_info_on_name` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `extract_variable_info_on_name`(IN table_name VARCHAR(50), + IN var_name VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT var_value, var_unit FROM ', table_name, ' WHERE var_name = ?'); +PREPARE stmt FROM @stmt; +SET @var_name = var_name; +EXECUTE stmt USING @var_name; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `get_current_COAs` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `get_current_COAs`(IN table_name VARCHAR(50), + IN inp_id VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT code_of_account, + ind FROM ', table_name, ' WHERE supaccount = ?'); + PREPARE stmt FROM @stmt; + SET @inp_id = inp_id; + EXECUTE stmt USING @inp_id; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `get_var_value_by_name` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `get_var_value_by_name`(IN table_name VARCHAR(50), + IN `var_name` VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT var_value FROM ', table_name, ' WHERE var_name = ?'); + PREPARE stmt FROM @stmt; + SET @var_name = var_name; + EXECUTE stmt USING @var_name; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `insert_new_COA` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `insert_new_COA`(IN table_name VARCHAR(50), + IN ind INT, + IN supaccount VARCHAR(50), + IN level INT, + IN code_of_account VARCHAR(50), + IN account_description VARCHAR(50), + IN total_cost INT, + IN review_status VARCHAR(50), + IN prn VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('INSERT INTO ', table_name, + ' (ind, supaccount, level, code_of_account, account_description, + total_cost, review_status, prn) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)'); +PREPARE stmt FROM @stmt; +SET @ind = ind; +SET @supaccount = supaccount; +SET @level = level; +SET @code_of_account = code_of_account; +SET @account_description = account_description; +SET @total_cost = total_cost; +SET @review_status = review_status; +SET @prn = prn; + + +EXECUTE stmt USING @ind, @supaccount, @level, @code_of_account, @account_description, +@total_cost, @review_status, @prn; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `insert_new_COA_gncoa` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `insert_new_COA_gncoa`(IN table_name VARCHAR(50), + IN ind INT, + IN supaccount VARCHAR(50), + IN level INT, + IN code_of_account VARCHAR(50), + IN account_description VARCHAR(50), + IN total_cost INT, + IN review_status VARCHAR(50), + IN prn VARCHAR(50), + IN gncoa VARCHAR(50), + IN gn_level INT, + IN gn_supaccount VARCHAR(50), + IN gn_ind INT) +BEGIN + SET @stmt = CONCAT('INSERT INTO ', table_name, + ' (ind, supaccount, level, code_of_account, account_description, + total_cost, review_status, prn, + gncoa, gn_level, gn_supaccount, gn_ind) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); +PREPARE stmt FROM @stmt; +SET @ind = ind; +SET @supaccount = supaccount; +SET @level = level; +SET @code_of_account = code_of_account; +SET @account_description = account_description; +SET @total_cost = total_cost; +SET @review_status = review_status; +SET @prn = prn; +SET @gncoa = gncoa; +SET @gn_level = gn_level; +SET @gn_supaccount = gn_supaccount; +SET @gn_ind = gn_ind; + +EXECUTE stmt USING @ind, @supaccount, @level, @code_of_account, @account_description, +@total_cost, @review_status, @prn, @gncoa, @gn_level, @gn_supaccount, @gn_ind; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_account_all` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_account_all`(IN table_name varchar(50), + IN level int) +BEGIN + SET @stmt=CONCAT('SELECT * FROM ',table_name,' WHERE level <= ?'); + PREPARE stmt FROM @stmt; + SET @level=level; + EXECUTE stmt USING @level; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_account_simple` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_account_simple`(IN table_name varchar(50), + IN level int) +BEGIN + SET @stmt=CONCAT('SELECT ind, + code_of_account, + account_description, + total_cost, + level, + review_status + FROM ',table_name,' WHERE level <= ?'); + PREPARE stmt FROM @stmt; + SET @level=level; + EXECUTE stmt USING @level; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_leveled_accounts_all` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_leveled_accounts_all`(IN acc_table varchar(50), + IN cel_table varchar(50), + IN level int) +BEGIN + SET @stmt=CONCAT('SELECT acc.level, + rankedcoa.code_of_account as code_of_account, + acc.account_description, + sorted_ce.fac_cost, + sorted_ce.lab_cost, + sorted_ce.mat_cost, + acc.total_cost, + acc.review_status + FROM ',acc_table,' as acc + JOIN + (SELECT node.code_of_account AS COA , + CONCAT( REPEAT(" ", node.level), node.code_of_account) AS code_of_account + FROM ',acc_table,' AS node + ORDER BY node.ind) as rankedcoa + ON acc.code_of_account=rankedcoa.COA + JOIN (SELECT splt_act.code_of_account, + cef.cost_2017 AS fac_cost, + cel.cost_2017 AS lab_cost, + cem.cost_2017 AS mat_cost + FROM + (SELECT code_of_account, + CONCAT(code_of_account, "_fac") AS fac_name, + CONCAT(code_of_account, "_lab") AS lab_name, + CONCAT(code_of_account, "_mat") AS mat_name + FROM ',acc_table,') AS splt_act + LEFT JOIN ',cel_table,' AS cef + ON cef.cost_element = splt_act.fac_name + LEFT JOIN ',cel_table,' AS cel + ON cel.cost_element = splt_act.lab_name + LEFT JOIN ',cel_table,' AS cem + ON cem.cost_element = splt_act.mat_name) as sorted_ce + ON sorted_ce.code_of_account=acc.code_of_account + WHERE acc.level <= ? + ORDER BY acc.ind;'); + PREPARE stmt FROM @stmt; + SET @level=level; + EXECUTE stmt USING @level; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_leveled_accounts_gn` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_leveled_accounts_gn`( + IN acc_table VARCHAR(255), + IN map_table VARCHAR(255), + IN level INT +) +BEGIN + SET @stmt = CONCAT( + 'SELECT rankedcoa.gncoa, + map.gncoa_description, + acc.total_cost, + acc.gn_level, + acc.review_status + FROM ', acc_table, ' AS acc + JOIN + ( + SELECT node.gncoa AS COA, + CONCAT(REPEAT(" ", node.gn_level), node.gncoa) AS gncoa + FROM ', acc_table, ' AS node + ORDER BY node.gn_ind + ) AS rankedcoa + ON acc.gncoa = rankedcoa.COA + JOIN ',map_table,' as map + ON acc.gncoa = map.gncoa + WHERE acc.gn_level <= ? + ORDER BY acc.gn_ind;' + ); + + PREPARE stmt FROM @stmt; + SET @level = level; + EXECUTE stmt USING @level; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_leveled_accounts_gn_all` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_leveled_accounts_gn_all`(IN acc_table varchar(50), + IN cel_table varchar(50), + IN level int) +BEGIN + SET @stmt=CONCAT('SELECT acc.gn_level, + rankedcoa.gncoa as gncoa, + acc.account_description, + sorted_ce.fac_cost, + sorted_ce.lab_cost, + sorted_ce.mat_cost, + acc.total_cost, + acc.review_status + FROM ',acc_table,' as acc + JOIN + (SELECT node.gncoa AS COA, + CONCAT(REPEAT(" ", node.gn_level), node.gncoa) AS gncoa + FROM ', acc_table, ' AS node + ORDER BY node.gn_ind) AS rankedcoa + ON acc.gncoa=rankedcoa.COA + JOIN (SELECT splt_act.code_of_account, + cef.cost_2017 AS fac_cost, + cel.cost_2017 AS lab_cost, + cem.cost_2017 AS mat_cost + FROM + (SELECT code_of_account, + CONCAT(code_of_account, "_fac") AS fac_name, + CONCAT(code_of_account, "_lab") AS lab_name, + CONCAT(code_of_account, "_mat") AS mat_name + FROM ',acc_table,') AS splt_act + LEFT JOIN ',cel_table,' AS cef + ON cef.cost_element = splt_act.fac_name + LEFT JOIN ',cel_table,' AS cel + ON cel.cost_element = splt_act.lab_name + LEFT JOIN ',cel_table,' AS cem + ON cem.cost_element = splt_act.mat_name) as sorted_ce + ON sorted_ce.code_of_account=acc.code_of_account + WHERE acc.gn_level <= ? + ORDER BY acc.gn_ind;'); + PREPARE stmt FROM @stmt; + SET @level=level; + EXECUTE stmt USING @level; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_leveled_accounts_simple` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_leveled_accounts_simple`(IN acc_table VARCHAR(255), IN level INT) +BEGIN + SET @stmt = CONCAT('SELECT rankedcoa.code_of_account, + acc.account_description, + acc.total_cost, + acc.level, + acc.review_status + FROM ',acc_table,' as acc + JOIN + (SELECT node.code_of_account AS COA , + CONCAT( REPEAT(" ", node.level), node.code_of_account) AS code_of_account + FROM ',acc_table,' AS node + ORDER BY node.ind) as rankedcoa + ON acc.code_of_account=rankedcoa.COA + WHERE acc.level <= ? + ORDER BY acc.ind;'); + PREPARE stmt FROM @stmt; + SET @level=level; + EXECUTE stmt USING @level; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_table` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_table`(IN table_name VARCHAR(255)) +BEGIN + SET @stmt = CONCAT('SELECT * FROM ',table_name); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_updated_cost_elements` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_updated_cost_elements`(IN cel_table VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT ind, + cost_element, + cost_2017, + sup_cost_ele, + account, + updated + FROM ',cel_table,' + WHERE updated = 1'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `print_user_request_parameter` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `print_user_request_parameter`(IN all_col BOOLEAN, + IN var_table VARCHAR(50), + IN cel_table VARCHAR(50)) +BEGIN + IF all_col THEN + SET @stmt = CONCAT("SELECT va.ind, va.var_name, + (SELECT GROUP_CONCAT(ce.cost_element SEPARATOR ', ') + FROM ", cel_table, " ce + WHERE FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0) AS ce_affected + FROM ",var_table," as va + WHERE va.var_value IS NULL + ORDER BY va.ind;"); + ELSE + SET @stmt = CONCAT("SELECT va.var_name, + (SELECT GROUP_CONCAT(ce.cost_element SEPARATOR ', ') + FROM ", cel_table, " ce + WHERE FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0) AS ce_affected + FROM ",var_table," as va + WHERE va.var_value IS NULL + ORDER BY va.ind;"); + END IF; + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `remove_specific_row` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `remove_specific_row`( + IN table_name VARCHAR(50), + IN target_code VARCHAR(50) +) +BEGIN + SET SQL_SAFE_UPDATES = 0; + + SET @stmt = CONCAT( + 'DELETE FROM ', table_name, + ' WHERE code_of_account = \'', target_code, '\'' + ); + + -- Debug: Print the constructed SQL statement + SELECT @stmt; + + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `roll_up_account_table_by_gn_level` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `roll_up_account_table_by_gn_level`( + IN table_name VARCHAR(50), + IN from_level INT, + IN to_level INT +) +BEGIN + SET SQL_SAFE_UPDATES = 0; + + SET @stmt = CONCAT( + 'UPDATE ', table_name, ',', + '(SELECT a', to_level, '.gncoa AS ac', to_level, '_coa, ', + 'SUM(ua', from_level, '.total_cost) AS a', to_level, '_cal_total_cost ', + 'FROM ', table_name, ' AS ua', from_level, + ' JOIN ', table_name, ' AS a', to_level, + ' ON ua', from_level, '.gn_supaccount = a', to_level, '.gncoa ', + 'WHERE ua', from_level, '.gn_level = ', from_level, + ' AND a', to_level, '.gn_level = ', to_level, + ' GROUP BY a', to_level, '.gncoa) AS updated_ac', to_level, + ' SET ', + table_name, '.total_cost = updated_ac', to_level, '.a', to_level, '_cal_total_cost, ', + table_name, '.review_status = \'Updated\' ', + 'WHERE ', + table_name, '.gncoa = updated_ac', to_level, '.ac', to_level, '_coa' + ); + + -- Debug: Print the constructed SQL statement + SELECT @stmt; + + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `roll_up_account_table_by_level` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `roll_up_account_table_by_level`(IN table_name varchar(50), + IN from_level int, IN to_level int) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT('UPDATE ', table_name, ',', + '(SELECT a',to_level,'.code_of_account as ac',to_level,'_coa, ', + 'sum(ua',from_level,'.total_cost) as a',to_level,'_cal_total_cost ', + 'FROM ', table_name, ' as ua',from_level, + ' JOIN ', table_name, ' as a',to_level, + ' on ua',from_level,'.supaccount=a',to_level,'.code_of_account ', + 'where ua',from_level,'.level=',from_level, + ' and a',to_level,'.level=',to_level, + ' group by a',to_level,'.code_of_account) as updated_ac',to_level, + ' SET ', + table_name,'.total_cost = updated_ac',to_level,'.a',to_level,'_cal_total_cost,', + table_name,'.review_status = \'Updated\' ', + 'WHERE ', + table_name,'.code_of_account = updated_ac',to_level,'.ac',to_level,'_coa'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `roll_up_cost_elements_by_level` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `roll_up_cost_elements_by_level`(IN table_name varchar(50), + IN from_level int, IN to_level int) +BEGIN + SET @stmt = CONCAT('UPDATE ', table_name, ',', + '(SELECT c',to_level,'.cost_element as ce',to_level,'_ce, ', + 'sum(uc',from_level,'.cost_2017) as c',to_level,'_cal_total_cost ', + 'FROM ', table_name, ' as uc',from_level, + ' JOIN ', table_name, ' as c',to_level, + ' on uc',from_level,'.sup_cost_ele=c',to_level,'.cost_element ', + 'join account as ac',to_level, + ' on c',to_level,'.account = ac',to_level,'.code_of_account ', + 'where ac',to_level,'.level=',to_level, + ' group by c',to_level,'.cost_element) as updated_ce',to_level, + ' SET ', + table_name,'.cost_2017 = updated_ce',to_level,'.c',to_level,'_cal_total_cost,', + table_name,'.updated = 1 ', + 'WHERE ', + table_name,'.cost_element = updated_ce',to_level,'.ce',to_level,'_ce'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `roll_up_lmt_account_2C` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `roll_up_lmt_account_2C`(IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('UPDATE ', acc_tabl_name, ',', + '(SELECT sum(t1.total_cost) as tc, sum(t1.prn) as tprn FROM + ', acc_tabl_name, ' AS t1 LEFT JOIN ', acc_tabl_name, ' as t2 + ON t1.code_of_account = t2.supaccount + WHERE t2.code_of_account IS NULL + and t1.code_of_account!=\'2\' + and t1.code_of_account!=\'2C\') as dircost + SET ', acc_tabl_name, '.total_cost = dircost.tc, + ', acc_tabl_name, '.prn=dircost.tprn, + review_status = \'Ready for Review\' + WHERE ', acc_tabl_name, '.code_of_account = \'2C\';'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `roll_up_lmt_direct_cost` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `roll_up_lmt_direct_cost`(IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('UPDATE ', acc_tabl_name, ',', + '(SELECT (total_cost/prn) as talcost + FROM ', acc_tabl_name, ' as pre_acc + WHERE pre_acc.code_of_account =\'2C\') as calcost + SET ', acc_tabl_name, '.total_cost = calcost.talcost, + review_status = \'Ready for Review\' + WHERE ', acc_tabl_name, '.code_of_account = \'2\';'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `sum_cost_elements_2C_fac` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `sum_cost_elements_2C_fac`(IN cel_tabl_name varchar(50), + IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('SELECT sum(cef.cost_2017) from + (SELECT t1.code_of_account, + CONCAT(t1.code_of_account,\'_fac\') as fac_name + FROM ', acc_tabl_name, ' AS t1 + LEFT JOIN ', acc_tabl_name, ' as t2 + ON t1.code_of_account = t2.supaccount + WHERE t2.code_of_account IS NULL + and t1.code_of_account!=\'2\' + and t1.code_of_account!=\'2C\' )as ac + join ', cel_tabl_name, ' as cef + on cef.cost_element = ac.fac_name + where ac.code_of_account!=\'2C\''); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `sum_cost_elements_2C_lab` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `sum_cost_elements_2C_lab`(IN cel_tabl_name varchar(50), + IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('SELECT sum(cef.cost_2017) from + (SELECT t1.code_of_account, + CONCAT(t1.code_of_account,\'_lab\') as lab_name + FROM ', acc_tabl_name, ' AS t1 + LEFT JOIN ', acc_tabl_name, ' as t2 + ON t1.code_of_account = t2.supaccount + WHERE t2.code_of_account IS NULL + and t1.code_of_account!=\'2\' + and t1.code_of_account!=\'2C\' )as ac + join ', cel_tabl_name, ' as cef + on cef.cost_element = ac.lab_name + where ac.code_of_account!=\'2C\''); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `sum_cost_elements_2C_mat` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `sum_cost_elements_2C_mat`(IN cel_tabl_name varchar(50), + IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('SELECT sum(cef.cost_2017) from + (SELECT t1.code_of_account, + CONCAT(t1.code_of_account,\'_mat\') as mat_name + FROM ', acc_tabl_name, ' AS t1 + LEFT JOIN ', acc_tabl_name, ' as t2 + ON t1.code_of_account = t2.supaccount + WHERE t2.code_of_account IS NULL + and t1.code_of_account!=\'2\' + and t1.code_of_account!=\'2C\' )as ac + join ', cel_tabl_name, ' as cef + on cef.cost_element = ac.mat_name + where ac.code_of_account!=\'2C\''); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `sum_up_lmt_account_2C` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `sum_up_lmt_account_2C`(IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('UPDATE ', acc_tabl_name, ',', + '(SELECT sum(t1.total_cost) as tc, sum(t1.prn) as tprn FROM + ', acc_tabl_name, ' AS t1 LEFT JOIN ', acc_tabl_name, ' as t2 + ON t1.code_of_account = t2.supaccount + WHERE t2.code_of_account IS NULL + and t1.code_of_account!=\'2\' + and t1.code_of_account!=\'2C\') as dircost + SET ', acc_tabl_name, '.total_cost = dircost.tc, + ', acc_tabl_name, '.prn=dircost.tprn, + review_status = \'Ready for Review\' + WHERE ', acc_tabl_name, '.code_of_account = \'2C\';'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `sum_up_lmt_direct_cost` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `sum_up_lmt_direct_cost`(IN acc_tabl_name varchar(50)) +BEGIN + SET @stmt = CONCAT('UPDATE ', acc_tabl_name, ',', + '(SELECT (total_cost/prn) as talcost + FROM ', acc_tabl_name, ' as pre_acc + WHERE pre_acc.code_of_account =\'2C\') as calcost + SET ', acc_tabl_name, '.total_cost = calcost.talcost, + review_status = \'Ready for Review\' + WHERE ', acc_tabl_name, '.code_of_account = \'2\';'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `sup_coa_level` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `sup_coa_level`(IN table_name VARCHAR(50), + IN supaccount VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT level FROM ', table_name, ' WHERE code_of_account = ?'); +PREPARE stmt FROM @stmt; +SET @supaccount = supaccount; +EXECUTE stmt USING @supaccount; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_account_before_insert` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_account_before_insert`(IN table_name VARCHAR(50), + IN min_ind INT) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT('UPDATE ', table_name, + ' SET ind = ind + 1 WHERE ind >?'); + PREPARE stmt FROM @stmt; + SET @min_ind = min_ind; + EXECUTE stmt USING @min_ind; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_account_table_by_cost_elements` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_account_table_by_cost_elements`(IN acc_tabl_name varchar(50), + IN cel_tabl_name varchar(50)) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT('UPDATE ', acc_tabl_name, ',', + '(SELECT ', acc_tabl_name, '.code_of_account, + ce.total_cost as cost, + ce.updated as updated + FROM ', acc_tabl_name, ' + JOIN (SELECT account, + sum(cost_2017) as total_cost, + sum(updated) as updated + FROM ', cel_tabl_name, ' + GROUP BY ', cel_tabl_name, '.account ) as ce + on ', acc_tabl_name, '.code_of_account = ce.account + ORDER BY ', acc_tabl_name, '.ind) as updated_account + SET ', acc_tabl_name, '.total_cost = updated_account.cost, + review_status = \'Ready for Review\' + WHERE updated_account.updated > 0 + and ', acc_tabl_name, '.code_of_account = updated_account.code_of_account;'); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_cost_element_on_name` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_cost_element_on_name`(IN table_name VARCHAR(50), + IN `ce_name` VARCHAR(50), + IN `alg_value` DECIMAL(20,5) ) +BEGIN + SET SQL_SAFE_UPDATES = 0; + + SET @stmt = CONCAT('UPDATE ', table_name, + ' SET cost_2017 = ', alg_value, + ', updated = 1 WHERE cost_element = ''', ce_name, ''''); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_new_accounts` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_new_accounts`(IN acc_tabl_name VARCHAR(50), + IN var_tabl_name VARCHAR(50), + IN alg_tabl_name VARCHAR(50)) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT("SELECT ac.ind, ac.code_of_account, + ac.total_cost, ac.alg_name, + ac.variables, + alg.alg_python, alg.alg_formulation, alg.alg_units + FROM ", acc_tabl_name, " AS ac + JOIN ", alg_tabl_name, " AS alg ON ac.alg_name = alg.alg_name + WHERE EXISTS ( + SELECT 1 + FROM ", var_tabl_name, " AS va + WHERE va.user_input = 1 + AND FIND_IN_SET(va.var_name, REPLACE(ac.variables, ' ', '')) > 0);"); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_new_cost_elements` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_new_cost_elements`(IN cel_tabl_name VARCHAR(50), + IN var_tabl_name VARCHAR(50), + IN alg_tabl_name VARCHAR(50)) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT("SELECT ce.ind, ce.cost_element, + ce.cost_2017, ce.alg_name, + ce.variables, ce.algno, + alg.alg_python, alg.alg_formulation, alg.alg_units + FROM ", cel_tabl_name, " AS ce + JOIN ", alg_tabl_name, " AS alg ON ce.alg_name = alg.alg_name + WHERE EXISTS ( + SELECT 1 + FROM ", var_tabl_name, " AS va + WHERE va.user_input = 1 + AND FIND_IN_SET(va.var_name, REPLACE(ce.variables, ' ', '')) > 0);"); + PREPARE stmt FROM @stmt; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_super_variable` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_super_variable`(IN var_table_name VARCHAR(50), + IN alg_table_name VARCHAR(50), IN `u_i_var_name` VARCHAR(50)) +BEGIN + SET @stmt = CONCAT('SELECT var.ind, var.var_name, var.var_value, + var.var_alg, var.var_need, alg.ind, alg.alg_python, + alg.alg_formulation, alg.alg_units, var.var_unit + FROM ', var_table_name, ' as var JOIN ', alg_table_name, ' as alg + ON var.var_alg=alg.alg_name + WHERE var.var_name=?'); +PREPARE stmt FROM @stmt; +SET @var_name = u_i_var_name; +EXECUTE stmt USING @var_name; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_total_cost_on_name` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_total_cost_on_name`(IN table_name VARCHAR(50), + IN `tc_id` VARCHAR(50), + IN `u_i_tc_value` DECIMAL(20,5)) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT('UPDATE ', table_name, ' SET total_cost = ?, + review_status = "User Input" WHERE code_of_account = ?'); + PREPARE stmt FROM @stmt; + SET @tc_id = tc_id; + SET @u_i_tc_value = u_i_tc_value; + EXECUTE stmt USING @u_i_tc_value, @tc_id; + DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `update_variable_info_on_name` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`mnyberg`@`localhost` PROCEDURE `update_variable_info_on_name`(IN table_name VARCHAR(50), + IN `u_i_var_name` VARCHAR(50), IN `value` DECIMAL(20,5), IN `unit` VARCHAR(50)) +BEGIN + SET SQL_SAFE_UPDATES = 0; + SET @stmt = CONCAT('UPDATE ', table_name, ' SET var_value = ?, + var_unit = ?, + user_input = ? WHERE var_name = ?'); +PREPARE stmt FROM @stmt; +SET @var_value = value; +SET @var_unit = unit; +SET @user_input = 1; +SET @var_name = u_i_var_name; +EXECUTE stmt USING @var_value, @var_unit, @user_input, @var_name; +DEALLOCATE PREPARE stmt; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2024-09-26 13:08:24 diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv new file mode 100644 index 0000000..f689c51 --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -0,0 +1,92 @@ +ind,code_of_account,account_description,total_cost,total_cost_dollars,level,prn,supaccount,alg_name,fun_unit,variables,algno,review_status +1,10,Pre-Construction_Costs,24.18611754,$24186117.540000003,0,0.0046878318104200244,,ac10,million,,,Unchanged +2,11,Land_and_Land_Rights,1.18611754,$1186117.5399999998,1,0.00022989715177366762,1,ac11,million,,,Unchanged +3,12,Site_Permits,10.0,$10000000.0,1,0.0019382324602810245,1,ac12,million,,,Unchanged +4,13,Plant_Licensing,0.0,$0.0,1,0.0,1,ac13,million,,,Unchanged +5,14,Plant_Permits,5.0,$5000000.0,1,0.0009691162301405122,1,ac14,million,,,Unchanged +6,15,Plant_Studies,5.0,$5000000.0,1,0.0009691162301405122,1,ac15,million,,,Unchanged +7,16,Plant_Reports,2.0,$2000000.0,1,0.00038764649205620487,1,ac16,million,,,Unchanged +8,17,Other_Pre-Construction_Costs,1.0,$1000000.0,1,0.00019382324602810244,1,ac17,million,,,Unchanged +9,19,Contingency_on_Pre-Construction_Costs,0.0,$0.0,1,0.0,1,ac19,million,,,Unchanged +10,20,Capitalized_Direct_Costs_(CDC),1298.175963,$1298175963.0,0,0.2516166790643178,,ac20,million,,,Unchanged +11,21,Structures_and_Improvements,112.9457941,$112945794.1,1,0.021891520437683703,2,ac21,million,,,Unchanged +12,21.1,Site_Preparation/Yard_Work,42.37641442,$42376414.42,2,0.008213534197916489,21,ac21.1,million,,,Unchanged +13,21.2,Heat_Island_Building,29.53699334,$29536993.34,2,0.005724955927069243,21,ac21.2,million,,,Unchanged +14,21.3,Turbine_Generator_Building,8.538531265,$8538531.264999999,2,0.0016549658460947396,21,ac21.3,million,,,Unchanged +15,21.4,Heat_Exchanger_Building,5.976971885,$5976971.885,2,0.0011584760921694063,21,ac21.4,million,,,Unchanged +16,21.5,Power_Supply_and_Energy_Storage,1.707706253,$1707706.253,2,0.00033099316921894796,21,ac21.5,million,,,Unchanged +17,21.6,Reactor_Auxiliaries,0.8538531265,$853853.1265,2,0.00016549658460947398,21,ac21.6,million,,,Unchanged +18,21.7,Hot_Cell,14.76849667,$14768496.67,2,0.0028624779635346214,21,ac21.7,million,,,Unchanged +19,21.8,Reactor_Services,2.956861753,$2956861.753,2,0.0005731085430228053,21,ac21.8,million,,,Unchanged +20,21.9,Service_Water,0.0474362848,$47436.2848,2,9.194254699449537e-06,21,ac21.9,million,,,Unchanged +21,21.10,Fuel_Storage,0.1739330443,$173933.0443,2,3.3712267237775744e-05,,ac21.10,million,,,Unchanged +22,21.11,Control_Room,0.1423088544,$142308.85439999998,2,2.7582764098348607e-05,211,ac21.11,million,,,Unchanged +23,21.12,Onsite_AC_Power,0.1264967595,$126496.7595,2,2.4518012538326203e-05,211,ac21.12,million,,,Unchanged +24,21.13,Administration,0.6957321771,$695732.1771,2,0.00013484906893172064,211,ac21.13,million,,,Unchanged +25,21.14,Site_Services,0.252993519,$252993.519,2,4.903602507665241e-05,211,ac21.14,million,,,Unchanged +26,21.15,Cryogenics,0.3794902784,$379490.2784,2,7.35540375955963e-05,211,ac21.15,million,,,Unchanged +27,21.16,Security,0.1423088544,$142308.85439999998,2,2.7582764098348607e-05,211,ac21.16,million,,,Unchanged +28,21.17,Ventilation_Stack,4.269265632,$4269265.632,2,0.0008274829229504582,211,ac21.17,million,,,Unchanged +29,22,Heat_Island_Plant_Equipment,1111.99892,$1111998920.0,1,0.21553124025414422,2,ac22,million,,,Unchanged +30,22.1,Heat_Island_Components,901.9675668,$901967566.8,2,0.17482228160924532,22,ac22.1,million,,,Unchanged +31,22.1.1,First_Wall_and_Blanket,43.19343421,$43193434.21,3,0.008371891625683487,221,ac22.1.1,million,,,Unchanged +32,22.1.2,Magnet_Radiation_Shield,94.73695574,$94736955.74,3,0.01836222428034747,221,ac22.1.2,million,,,Unchanged +33,22.1.3,Coils,272.0399768,$272039976.79999995,3,0.05272767135278568,221,ac22.1.3,million,,,Unchanged +34,22.1.3.1,HF_Coils,116.4,$116400000.0,4,0.022561025837671125,2213,ac22.1.3.1,million,,,Unchanged +35,22.1.3.2,LF_Coils,12.50524,$12505240.0,4,0.0024238062091604677,2213,ac22.1.3.2,million,,,Unchanged +36,22.1.3.3,CC_Coils,143.1347368,$143134736.8,4,0.02774283930595409,2213,ac22.1.3.3,million,,,Unchanged +37,22.1.4,Supplemental_Heating,227.453,$227453000.0,3,0.04408567877882998,221,ac22.1.4,million,,,Unchanged +38,22.1.4.1,NBI,105.963,$105963000.0,4,0.02053809261887582,2214,ac22.1.4.1,million,,,Unchanged +39,22.1.4.2,ICRH,41.49,$41490000.0,4,0.008041726477705971,2214,ac22.1.4.2,million,,,Unchanged +40,22.1.4.3,ECH,80.0,$80000000.0,4,0.015505859682248196,2214,ac22.1.4.3,million,,,Unchanged +41,22.1.5,Primary_Structure_and_Support,0.0,$0.0,3,0.0,221,ac22.1.5,million,,,Unchanged +42,22.1.6,Vacuum_System,2.031827257,$2031827.2570000002,3,0.00039381535432011556,221,ac22.1.6,million,,,Unchanged +43,22.1.6.2,Vessel_Refrigerators,0.0,$0.0,4,0.0,2216,ac22.1.6.2,million,,,Unchanged +44,22.1.6.3,Primary_Vacuum_Pumps,1.689827257,$1689827.257,4,0.0003275278041785045,2216,ac22.1.6.3,million,,,Unchanged +45,22.1.6.4,Backing_Vacuum_Pumps,0.342,$342000.0,4,6.628755014161104e-05,2216,ac22.1.6.4,million,,,Unchanged +46,22.1.7,Power_Supplies,0.0,$0.0,3,0.0,221,ac22.1.7,million,,,Unchanged +47,22.1.8,Divertor,0.0,$0.0,3,0.0,221,ac22.1.8,million,,,Unchanged +48,22.1.9,Direct_Energy_Convertor,109.3171648,$109317164.8,3,0.02118820772812502,221,ac22.1.9,million,,,Unchanged +49,22.1.11,Assembly_and_Installation_Costs,153.1952079,$153195207.9,3,0.029692792471128007,2211,ac22.1.11,million,,,Unchanged +50,22.2,Main_and_Secondary_Coolant,33.6494515,$33649451.5,2,0.0065220459167952,22,ac22.2,million,,,Unchanged +51,22.3,Auxiliary_Cooling_Systems,0.3521982635,$352198.2635,2,6.826421067703095e-05,22,ac22.3,million,,,Unchanged +52,22.4,Radioactive_Waste_Treatment,0.6275532695,$627553.2695,2,0.00012163441175003857,22,ac22.4,million,,,Unchanged +53,22.5,Fuel_Handling_and_Storage,88.65405229,$88654052.28999999,2,0.017183216188392927,22,ac22.5,million,,,Unchanged +54,22.6,Other_Heat_Island_Equipment,1.748097852,$1748097.852,2,0.0003388220000493934,22,ac22.6,million,,,Unchanged +55,22.7,Instrumentation_and_Control,85.0,$85000000.0,2,0.01647497591238871,22,ac22.7,million,,,Unchanged +56,23,Turbine_Plant_Equipment,39.82276109,$39822761.09,1,0.007718576820265415,2,ac23,million,,,Unchanged +57,24,Electric_Plant_Equipment,9.819310954,$9819310.954,1,0.0019032107228635835,2,ac24,million,,,Unchanged +58,25,Miscellaneous_Plant_Equipment,6.909885486,$6909885.4860000005,1,0.0013392964345789922,2,ac25,million,,,Unchanged +59,26,Heat_Rejection,11.67929132,$11679291.32,1,0.0022637181549502415,2,ac26,million,,,Unchanged +60,27,Special_Materials,0.0,$0.0,1,0.0,2,ac27,million,,,Unchanged +61,28,Digital_Twin/Simulator,5.0,$5000000.0,1,0.0009691162301405122,2,ac28,million,,,Unchanged +62,29,Contingency_on_Direct_Capital_Costs,0.0,$0.0,1,0.0,2,ac29,million,,,Unchanged +63,30,Capitalized_Indirect_Service_Costs_(CISC),71.59197058,$71591970.58,0,0.013876188127364011,,ac30,million,,,Unchanged +64,31,Field_Indirect_Costs,14.31839412,$14318394.120000001,1,0.0027752376262480953,3,ac31,million,,,Unchanged +65,32,Construction_Supervision,35.79598529,$35795985.29,1,0.0069380940636820055,3,ac32,million,,,Unchanged +66,33,Commissioning_and_Start-Up_Costs,0.0,$0.0,1,0.0,3,ac33,million,,,Unchanged +67,34,Demonstration_Test_Run,0.0,$0.0,1,0.0,3,ac34,million,,,Unchanged +68,35,Design_Services_Offsite,21.47759117,$21477591.17,1,0.004162856437433911,3,ac35,million,,,Unchanged +69,36,PM/CM_Services_Offsite,0.0,$0.0,1,0.0,3,ac36,million,,,Unchanged +70,37,Design_Servies_Offsite,0.0,$0.0,1,0.0,3,ac37,million,,,Unchanged +71,38,PM/CM_Services_Onsite,0.0,$0.0,1,0.0,3,ac38,million,,,Unchanged +72,39,Contingency_on_Support_Services,0.0,$0.0,1,0.0,3,ac39,million,,,Unchanged +73,40,Capitalized_Owner's_Cost_(COC),155.7811156,$155781115.6,0,0.030194001495471065,,ac40,million,,,Unchanged +74,50,Capitalized_Supplementary_Costs_(CSC),37.83719261,$37837192.61,0,0.00733372749226073,,ac50,million,,,Unchanged +75,51,Shipping_and_Transportation_Costs,8.0,$8000000.0,1,0.0015505859682248195,5,ac51,million,,,Unchanged +76,52,Spare_Parts,7.323124886,$7323124.886,1,0.0014193918364736975,5,ac52,million,,,Unchanged +77,53,Taxes,0.0,$0.0,1,0.0,5,ac53,million,,,Unchanged +78,54,Insurance,1.0,$1000000.0,1,0.00019382324602810244,5,ac54,million,,,Unchanged +79,55,Initial_Fuel_Load,21.51406772,$21514067.72,1,0.004169926440758817,5,ac55,million,,,Unchanged +80,58,Decommissioning_Costs,0.0,$0.0,1,0.0,5,ac58,million,,,Unchanged +81,59,Contingency_on_Supplementary_Costs,0.0,$0.0,1,0.0,5,ac59,million,,,Unchanged +82,60,Capitalized_Financial_Costs_(CFC),195.4094412,$195409441.20000002,0,0.03787489219792162,,ac60,million,,,Unchanged +83,61,Escalation,20.125,$20125000.0,1,0.003900692826315562,6,ac61,million,,,Unchanged +84,62,Fees,0.0,$0.0,1,0.0,6,ac62,million,,,Unchanged +85,63,Interest_During_Construction_(IDC),175.2844412,$175284441.20000002,1,0.033974199371606055,6,ac63,million,,,Unchanged +86,69,Contingency_on_Capitalized_Financial_Costs,0.0,$0.0,1,0.0,6,ac69,million,,,Unchanged +87,OCC,Overnight_Capital_Cost_(OCC),1587.572359,$1587572359.0,0,0.307708427925872,OC,acOCC,million,,,Unchanged +88,TCC,Total_Capital_Cost_(TCC),1782.981801,$1782981801.0,0,0.3455833202788522,TC,acTCC,million,,,Unchanged +89,O&M,Operations_and_Maintenance,5.69490028,$5694900.279999999,0,0.0011038040580759493,O&,acO&M,million,,,Unchanged +90,Fuel,Fuel,0.1090042081,$109004.2081,0,2.1127549444664777e-05,Fue,acFuel,million,,,Unchanged +91,81,Deuterium,0.04739117657,$47391.176569999996,1,9.185511675888353e-06,8,ac81,million,,,Unchanged diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv new file mode 100644 index 0000000..0a79908 --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -0,0 +1,81 @@ +ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units +1,__init__,v,None,MirrorFunc,TODO,TODO +2,add_account,v,Add an account to the cost_account object.,MirrorFunc,TODO,TODO +3,generate_report,v,Generate a report based on user input.,MirrorFunc,TODO,TODO +4,learning_credit,v,None,MirrorFunc,TODO,TODO +5,Account_C20,c,Account C20 Rollup,MirrorFunc,TODO,million +6,Account_C21,c,Account C21 Rollup,MirrorFunc,TODO,million +7,Account_C21_1,c,Account C211 Rollup,MirrorFunc,TODO,million +8,Account_C21_2,c,Account C212 Rollup,MirrorFunc,TODO,million +9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,TODO,million +10,Account_C21_4,c,Account C214 Rollup,MirrorFunc,TODO,million +11,Account_C21_5,c,Account C215 Rollup,MirrorFunc,TODO,million +12,Account_C21_6,c,Account C216 Rollup,MirrorFunc,TODO,million +13,Account_C21_7,c,Account C217 Rollup,MirrorFunc,TODO,million +14,Account_C21_8,c,Account C218 Rollup,MirrorFunc,TODO,million +15,Account_C21_9,c,Account C219 Rollup,MirrorFunc,TODO,million +16,Account_C21_10,c,Account C2110 Rollup,MirrorFunc,TODO,million +17,Account_C21_11,c,Account C2111 Rollup,MirrorFunc,TODO,million +18,Account_C21_12,c,Account C2112 Rollup,MirrorFunc,TODO,million +19,Account_C21_13,c,Account C2113 Rollup,MirrorFunc,TODO,million +20,Account_C21_14,c,Account C2114 Rollup,MirrorFunc,TODO,million +21,Account_C21_15,c,Account C2115 Rollup,MirrorFunc,TODO,million +22,Account_C21_16,c,Account C2116 Rollup,MirrorFunc,TODO,million +23,Account_C21_17,c,Account C2117 Rollup,MirrorFunc,TODO,million +24,Account_C22,c,Account C22 Rollup,MirrorFunc,TODO,million +25,Account_C22_1,c,Account C221 Rollup,MirrorFunc,TODO,million +26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,TODO,million +27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,TODO,million +28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,TODO,million +29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,TODO,million +30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,TODO,million +31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,TODO,million +32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,TODO,million +33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,TODO,million +34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,TODO,million +35,Account_C22_1_4_3,c,Account C22143 Rollup,MirrorFunc,TODO,million +36,Account_C22_1_5,c,Account C2215 Rollup,MirrorFunc,TODO,million +37,Account_C22_1_6,c,Account C2216 Rollup,MirrorFunc,TODO,million +38,Account_C22_1_6_2,c,Account C22162 Rollup,MirrorFunc,TODO,million +39,Account_C22_1_6_3,c,Account C22163 Rollup,MirrorFunc,TODO,million +40,Account_C22_1_6_4,c,Account C22164 Rollup,MirrorFunc,TODO,million +41,Account_C22_1_7,c,Account C2217 Rollup,MirrorFunc,TODO,million +42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,TODO,million +43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,TODO,million +44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,TODO,million +45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,TODO,million +46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,TODO,million +47,Account_C22_2_2,c,Account C2222 Rollup,MirrorFunc,TODO,million +48,Account_C22_2_3,c,Account C2223 Rollup,MirrorFunc,TODO,million +49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,TODO,million +50,Account_C22_4,c,Account C224 Rollup,MirrorFunc,TODO,million +51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,TODO,million +52,Account_C22_6,c,Account C226 Rollup,MirrorFunc,TODO,million +53,Account_C22_7,c,Account C227 Rollup,MirrorFunc,TODO,million +54,Account_C23,c,Account C23 Rollup,MirrorFunc,TODO,million +55,Account_C24,c,Account C24 Rollup,MirrorFunc,TODO,million +56,Account_C25,c,Account C25 Rollup,MirrorFunc,TODO,million +57,Account_C26,c,Account C26 Rollup,MirrorFunc,TODO,million +58,Account_C27,c,Account C27 Rollup,MirrorFunc,TODO,million +59,Account_C28,c,Account C28 Rollup,MirrorFunc,TODO,million +60,Account_C29,c,Account C29 Rollup,MirrorFunc,TODO,million +61,Account_OCC,c,Account OCC Rollup,MirrorFunc,TODO,million +62,Account_TCC,c,Account TCC Rollup,MirrorFunc,TODO,million +63,Account_C90,c,Account C90 Rollup,MirrorFunc,TODO,million +64,PbLi_density,v,"Returns PbLi density (kg/m^3). Assumes the PbLi is a eutectic, which has",MirrorFunc,TODO,TODO +65,Li_price,v,Return Li price (USD/kg) for enrichment levels above 90% 6Li,MirrorFunc,TODO,TODO +66,PbLi_price,v,None,MirrorFunc,TODO,TODO +67,V_cylindrical_shell,v,Return volume of a cylindrical shell,MirrorFunc,TODO,TODO +68,V_inverse_triangular_washer,v,Return volume of cylindrical inverse triangular washer.,MirrorFunc,TODO,TODO +69,generate_inputs,v,Return a dict containing all inputs for a techno-economic analysis.,MirrorFunc,TODO,TODO +70,create_radial_build,v,None,MirrorFunc,TODO,TODO +71,add_new_layer,v,None,MirrorFunc,TODO,TODO +72,add_fractional_layer,v,None,MirrorFunc,TODO,TODO +73,build_central_cell,v,None,MirrorFunc,TODO,TODO +74,central_cell_cost,v,None,MirrorFunc,TODO,TODO +75,central_cell,v,None,MirrorFunc,TODO,TODO +76,expander_cell_cost,v,Each expander cell is made up of:,MirrorFunc,TODO,TODO +77,HF_magnet_cost,v,None,MirrorFunc,TODO,TODO +78,LF_magnet_cost,v,None,MirrorFunc,TODO,TODO +79,CF_magnet_cost,v,None,MirrorFunc,TODO,TODO +80,HF_magnet_shield_cost,v,The HF coils have annular shield with a U-shaped cross section:,MirrorFunc,TODO,TODO diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv new file mode 100644 index 0000000..b81c4c2 --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -0,0 +1,136 @@ +ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_input +1,E_DT,str,,TODO,,TODO,TODO, +2,E_alpha,str,,TODO,,TODO,TODO, +3,E_n,str,,TODO,"E_DT, E_alpha",TODO,TODO, +4,m_T,str,,TODO,,TODO,TODO, +5,m_D,str,,TODO,,TODO,TODO, +6,m_6Li,str,,TODO,,TODO,TODO, +7,Wh_to_BTU,float,3.41214,TODO,,TODO,TODO, +8,indentation,INTEGER,0.0,TODO,,TODO,TODO, +9,indented_name,str,,TODO,"account_name, account_number, indentation",TODO,TODO, +10,inputs,str,,TODO,"NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness",TODO,TODO, +11,cost_data,str,,TODO,cost_account,TODO,TODO, +12,L_magnet_to_magnet,str,,TODO,inputs,TODO,TODO, +13,L_cylinder,str,,TODO,L_magnet_to_magnet,TODO,TODO, +14,expander_cell_cost_result,str,,TODO,"expander_cell_cost, inputs",TODO,TODO, +15,end_plug_cylindrical_part,str,,TODO,"L_cylinder, central_cell, inputs",TODO,TODO, +16,end_plug_cylindrical_part_cost,str,,TODO,end_plug_cylindrical_part,TODO,TODO, +17,central_cell_cylindrical_part,str,,TODO,"central_cell, inputs",TODO,TODO, +18,central_cell_cylindrical_part_cost,str,,TODO,central_cell_cylindrical_part,TODO,TODO, +19,total_cost,str,,TODO,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",TODO,TODO, +20,cost_factor,str,,TODO,"inputs, np",TODO,TODO, +21,cost_pump,INTEGER,40000.0,TODO,,TODO,TODO, +22,vpump_cap,str,,TODO,,TODO,TODO, +23,no_vpumps,str,,TODO,"inputs, vpump_cap",TODO,TODO, +24,axis_t,str,,TODO,"inputs, np",TODO,TODO, +25,axis_ir,str,,TODO,axis_t,TODO,TODO, +26,lr,str,,TODO,,TODO,TODO, +27,constructionworker,str,,TODO,axis_ir,TODO,TODO, +28,C_22_1_11_in,str,,TODO,"inputs, lr",TODO,TODO, +29,C_22_1_11_1_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +30,C_22_1_11_2_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +31,C_22_1_11_3_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +32,C_22_1_11_4_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +33,C_22_1_11_5_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +34,C_22_1_11_6_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +35,C_22_1_11_7_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +36,C_22_1_11_8_in,INTEGER,0.0,TODO,,TODO,TODO, +37,C_22_1_11_9_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, +38,C_22_1_11_10_in,INTEGER,0.0,TODO,,TODO,TODO, +39,C220111,str,,TODO,"C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in",TODO,TODO, +40,inflation,float,1.43,TODO,,TODO,TODO, +41,C2205010ITER,str,,TODO,inflation,TODO,TODO, +42,C2205020ITER,str,,TODO,inflation,TODO,TODO, +43,C2205030ITER,str,,TODO,inflation,TODO,TODO, +44,C2205040ITER,str,,TODO,inflation,TODO,TODO, +45,C2205050ITER,str,,TODO,inflation,TODO,TODO, +46,C2205060ITER,str,,TODO,inflation,TODO,TODO, +47,lcredit,float,0.8,TODO,,TODO,TODO, +48,ltoak,str,,TODO,"lcredit, np",TODO,TODO, +49,C220501,str,,TODO,"C2205010ITER, ltoak",TODO,TODO, +50,C220502,str,,TODO,"C2205020ITER, ltoak",TODO,TODO, +51,C220503,str,,TODO,"C2205030ITER, ltoak",TODO,TODO, +52,C220504,str,,TODO,"C2205040ITER, ltoak",TODO,TODO, +53,C220505,str,,TODO,"C2205050ITER, ltoak",TODO,TODO, +54,C220506,str,,TODO,"C2205060ITER, ltoak",TODO,TODO, +55,C220500,str,,TODO,"C220501, C220502, C220503, C220504, C220505, C220506",TODO,TODO, +56,f_cr,float,0.09,TODO,,TODO,TODO, +57,f_6Li_natural,float,0.075,TODO,,TODO,TODO, +58,rho_6Li,float,460.0,TODO,,TODO,TODO, +59,rho_7Li,float,537.0,TODO,,TODO,TODO, +60,T_K,str,,TODO,T,TODO,TODO, +61,rho_PbLi,str,,TODO,T_K,TODO,TODO, +62,P_6Li075,float,15.152,TODO,,TODO,TODO, +63,P_6Li90,INTEGER,70.0,TODO,,TODO,TODO, +64,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",TODO,,TODO,TODO, +65,Cf,list,"(1, 2, 4, 8, 16)",TODO,,TODO,TODO, +66,f_interp,str,,TODO,"Cf, f, scipy",TODO,TODO, +67,f_Li,float,0.17,TODO,,TODO,TODO, +68,f_Pb,str,,TODO,f_Li,TODO,TODO, +69,P_Li,str,,TODO,"Li_price, f_6Li",TODO,TODO, +70,P_PbLi,str,,TODO,"P_Li, P_Pb, f_Li, f_Pb",TODO,TODO, +71,P_f_CC,str,,TODO,"P_f, P_f_EP",TODO,TODO, +72,L_CC,str,,TODO,"P_f_CC, P_f_L",TODO,TODO, +73,L_CF,float,1.0,TODO,,TODO,TODO, +74,L,str,,TODO,"L_CC, L_EC, L_EP",TODO,TODO, +75,V_vac,str,,TODO,"L, a_EC, np",TODO,TODO, +76,P_alpha,str,,TODO,"E_DT, E_alpha, P_f",TODO,TODO, +77,P_n,str,,TODO,"P_alpha, P_f",TODO,TODO, +78,P_ine,str,,TODO,"P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI",TODO,TODO, +79,P_pump,str,,TODO,"M_n, P_n, f_pump",TODO,TODO, +80,P_sub_cont,str,,TODO,"P_f, f_sub",TODO,TODO, +81,P_cryo,str,,TODO,"P_f, f_cryo",TODO,TODO, +82,P_other,str,,TODO,"P_cryo, P_pump, P_sub_cont",TODO,TODO, +83,P_in,str,,TODO,"P_ECH, P_ICRH, P_NBI",TODO,TODO, +84,P_th,str,,TODO,"M_n, P_n, P_pump, eta_pump",TODO,TODO, +85,P_the,str,,TODO,"P_th, eta_th",TODO,TODO, +86,P_DEC,str,,TODO,"P_alpha, P_in",TODO,TODO, +87,P_DECe,str,,TODO,"P_DEC, eta_DEC",TODO,TODO, +88,P_egross,str,,TODO,"P_DECe, P_the",TODO,TODO, +89,P_enet,str,,TODO,"P_egross, P_ine, P_other",TODO,TODO, +90,f_aux,str,,TODO,"P_aux, P_egross",TODO,TODO, +91,Q_sci,str,,TODO,"P_f, P_in",TODO,TODO, +92,Q_eng,str,,TODO,"P_egross, P_ine, P_other",TODO,TODO, +93,f_refrac,str,,TODO,Q_eng,TODO,TODO, +94,run_name,str,,TODO,"P_f, float",TODO,TODO, +95,cost_file_full,str,,TODO,"cost_file, pkg_resources",TODO,TODO, +96,new_data,str,,TODO,"f_vol, material, name, pd, thickness",TODO,TODO, +97,r_in,str,,TODO,data,TODO,TODO, +98,r_out,str,,TODO,data,TODO,TODO, +99,radial_build,str,,TODO,"create_radial_build, inputs",TODO,TODO, +100,filename,str,,TODO,inputs,TODO,TODO, +101,T,INTEGER,300.0,TODO,,TODO,TODO, +102,material,str,,TODO,"i, radial_build",TODO,TODO, +103,f_6Li,float,0.075,TODO,,TODO,TODO, +104,radius,str,,TODO,inputs,TODO,TODO, +105,thickness,str,,TODO,inputs,TODO,TODO, +106,vv_material,str,,TODO,inputs,TODO,TODO, +107,V_end_cap,str,,TODO,"np, radius, thickness",TODO,TODO, +108,M_end_cap,str,,TODO,"V_end_cap, cost_data, vv_material",TODO,TODO, +109,C_end_cap,str,,TODO,"M_end_cap, cost_data, vv_material",TODO,TODO, +110,total,str,,TODO,"C_end_cap, radial_build",TODO,TODO, +111,cost,float,29.1,TODO,,TODO,TODO, +112,a_M,float,0.15,TODO,,TODO,TODO, +113,a_CC,float,0.54,TODO,,TODO,TODO, +114,a_0,float,0.7,TODO,,TODO,TODO, +115,length,float,0.5,TODO,,TODO,TODO, +116,r_gap,float,0.1,TODO,,TODO,TODO, +117,r_vv,float,0.01,TODO,,TODO,TODO, +118,r_magnet,float,1.5,m,,TODO,TODO, +119,r_cryostat,float,1.0,TODO,,TODO,TODO, +120,f_vol,float,0.9,TODO,,TODO,TODO, +121,V_radially_inner_cylinder,str,,TODO,"V_cylindrical_shell, f_vol, length, r_in, r_out",TODO,TODO, +122,length_cc_cylinder,float,0.5,TODO,,TODO,TODO, +123,r_in_cc,str,,TODO,"a_CC, r_gap, r_vv",TODO,TODO, +124,r_out_cc,str,,TODO,r_in_cc,TODO,TODO, +125,V_cc_cylinder,str,,TODO,"V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc",TODO,TODO, +126,V_cc_triangle,str,,TODO,"V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc",TODO,TODO, +127,length_ep_cylinder,float,0.5,TODO,,TODO,TODO, +128,r_in_ep,str,,TODO,"a_0, r_gap, r_vv",TODO,TODO, +129,r_out_ep,str,,TODO,r_in_ep,TODO,TODO, +130,V_ep_cylinder,str,,TODO,"V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep",TODO,TODO, +131,V_ep_triangle,str,,TODO,"V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep",TODO,TODO, +132,V_total_cc_facing,str,,TODO,"V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder",TODO,TODO, +133,V_total_ec_facing,str,,TODO,"V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder",TODO,TODO, +134,V_total,str,,TODO,"V_total_cc_facing, V_total_ec_facing",TODO,TODO, +135,mass,str,,TODO,"V_total, cost_data, material",TODO,TODO, From 01ce04fdbeecf03b400aeca72f7c97dffea85b08 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 14:53:18 -0500 Subject: [PATCH 02/23] Add Mirror reference model for SQLite ACCERT --- src/Algorithm/MirrorFunc.py | 37 +- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 629 +++++++++--------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 316 ++++++++- test/test_mirror_model.py | 54 ++ test/test_sqlite.py | 6 +- tutorial/accert/ref_tables/MirrorFunc.py | 37 +- tutorial/accert/ref_tables/mirror_account.csv | 184 ++--- .../accert/ref_tables/mirror_algorithm.csv | 112 ++-- .../accert/ref_tables/mirror_variable.csv | 319 +++++---- 11 files changed, 1095 insertions(+), 601 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index e438257..b71670b 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -20,6 +20,28 @@ class MirrorFunc(Algorithm): # Conversion factors Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU + ACCERT_TO_TEAM_INPUT = { + "application": "Application", + "include_contingency": "Contingency", + "L": "Overall Length", + "L_CC": "Central Cell Length", + "L_EP": "End Plug Length", + "N_module": "Number of Modules", + "n_unit": "Unit Number", + "P_DECe": "DEC Electrical Power", + "P_ECH": "ECH Power", + "P_egross": "Gross Electric Power", + "P_enet": "Net Electric Power", + "P_ICRH": "ICRH Power", + "P_NBI": "NBI Power", + "P_th": "Thermal Power", + "V_vac": "Vacuum Volume", + "construction_time": "Construction Time", + "HF_magnet_number": "HF Magnet Number", + "LF_magnet_number": "LF Magnet Number", + "NOAK": "NOAK", + } + def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) @@ -33,9 +55,22 @@ def run(self, inputs: dict) -> float: Returns: float: Result of the algorithm computation. """ - # run the algorithm use self.name not self.alg_name + if self.name.startswith("Account_"): + return self._run_account_algorithm(self.name, inputs) return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) + def _run_account_algorithm(self, alg_name: str, variables: dict) -> float: + try: + algorithm = getattr(self, alg_name) + except AttributeError: + raise ValueError(f"Algorithm {alg_name} not found") + team_inputs = { + team_name: variables[var_name] + for var_name, team_name in self.ACCERT_TO_TEAM_INPUT.items() + if var_name in variables + } + return algorithm(team_inputs) + def _run_algorithm(self, alg_name: str, variables: list) -> float: """ Runs the specified algorithm with given variables. diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 307c70258ae293cb514406df3f40f0a6610f283a..7eb5eabc320df89233d72f4621d4d7210c090eb3 100644 GIT binary patch delta 23743 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 STYV+A*^M=?pGF#Q{QrNb1qP-7 delta 32176 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 U9tT|s!?n=l&Spb^v#j&~10>K-&Hw-a diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index dfd0a88..eb5d84f 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6931,112 +6931,98 @@ INSERT INTO ap1000_algorithm VALUES(28,'scale_law_wastewater_bldg','v','Wastewat INSERT INTO ap1000_algorithm VALUES(29,'scale_law_power','v','Power scale law.','AP1000DirectCostFunc','(input_unit_value / reference_unit_value)^exponent','1','input_unit_value, reference_unit_value, exponent',NULL); INSERT INTO ap1000_algorithm VALUES(30,'sum_all','c/v','Sum all supplied child cost elements or intermediate variables.','AP1000DirectCostFunc','sum(values)','$','values',NULL); INSERT INTO ap1000_algorithm VALUES(31,'calc_rej_th_P','v','Rejected thermal power = thermal power - electric power.','AP1000DirectCostFunc','rx_P - elec_P','MWt','rx_P, elec_P',NULL); -CREATE TABLE mirror_acco ( - ind INTEGER DEFAULT NULL, - code_of_account TEXT NOT NULL, - account_description text, - total_cost REAL DEFAULT NULL, - total_cost_dollars REAL DEFAULT NULL, - level INTEGER DEFAULT NULL, - prn REAL DEFAULT NULL, - supaccount text, - alg_name text, - fun_unit text, - variables text, - algno text, review_status TEXT, - PRIMARY KEY (code_of_account) -); -INSERT INTO "mirror_acco" VALUES(1,'10','Pre-Construction_Costs',24.18611754,'$24186117.540000003',0,4.687831810420024433e-03,'','ac10','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(2,'11','Land_and_Land_Rights',1.18611754,'$1186117.5399999998',1,2.298971517736676198e-04,'1','ac11','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(3,'12','Site_Permits',10.0,'$10000000.0',1,1.938232460281024469e-03,'1','ac12','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(4,'13','Plant_Licensing',0.0,'$0.0',1,0.0,'1','ac13','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(5,'14','Plant_Permits',5.0,'$5000000.0',1,9.69116230140512235e-04,'1','ac14','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(6,'15','Plant_Studies',5.0,'$5000000.0',1,9.69116230140512235e-04,'1','ac15','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(7,'16','Plant_Reports',2.0,'$2000000.0',1,3.876464920562048719e-04,'1','ac16','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(8,'17','Other_Pre-Construction_Costs',1.0,'$1000000.0',1,1.938232460281024359e-04,'1','ac17','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,'$0.0',1,0.0,'1','ac19','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298.175963,'$1298175963.0',0,2.516166790643177831e-01,'','ac20','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(11,'21','Structures_and_Improvements',112.9457941,'$112945794.1',1,2.189152043768370289e-02,'2','ac21','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(12,'21.1','Site_Preparation/Yard_Work',42.37641442,'$42376414.42',2,8.213534197916488519e-03,'21','ac21.1','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(13,'21.2','Heat_Island_Building',29.53699334,'$29536993.34',2,5.724955927069242875e-03,'21','ac21.2','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(14,'21.3','Turbine_Generator_Building',8.538531265,'$8538531.264999999',2,1.654965846094739622e-03,'21','ac21.3','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(15,'21.4','Heat_Exchanger_Building',5.976971885,'$5976971.885',2,1.158476092169406302e-03,'21','ac21.4','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(16,'21.5','Power_Supply_and_Energy_Storage',1.707706253,'$1707706.253',2,3.309931692189479568e-04,'21','ac21.5','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(17,'21.6','Reactor_Auxiliaries',0.8538531265,'$853853.1265',2,1.654965846094739784e-04,'21','ac21.6','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(18,'21.7','Hot_Cell',14.76849667,'$14768496.67',2,2.862477963534621437e-03,'21','ac21.7','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(19,'21.8','Reactor_Services',2.956861753,'$2956861.753',2,5.731085430228053398e-04,'21','ac21.8','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(20,'21.9','Service_Water',0.0474362848,'$47436.2848',2,9.194254699449536794e-06,'21','ac21.9','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(21,'21.10','Fuel_Storage',0.1739330443,'$173933.0443',2,3.371226723777574368e-05,'','ac21.10','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(22,'21.11','Control_Room',0.1423088544,'$142308.85439999998',2,2.758276409834860699e-05,'211','ac21.11','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(23,'21.12','Onsite_AC_Power',0.1264967595,'$126496.7595',2,2.45180125383262035e-05,'211','ac21.12','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(24,'21.13','Administration',0.6957321771,'$695732.1771',2,1.348490689317206382e-04,'211','ac21.13','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(25,'21.14','Site_Services',0.252993519,'$252993.519',2,4.903602507665240699e-05,'211','ac21.14','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(26,'21.15','Cryogenics',0.3794902784,'$379490.2784',2,7.35540375955963e-05,'211','ac21.15','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(27,'21.16','Security',0.1423088544,'$142308.85439999998',2,2.758276409834860699e-05,'211','ac21.16','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(28,'21.17','Ventilation_Stack',4.269265632,'$4269265.632',2,8.274829229504581827e-04,'211','ac21.17','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(29,'22','Heat_Island_Plant_Equipment',1111.99892,'$1111998920.0',1,2.155312402541442185e-01,'2','ac22','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(30,'22.1','Heat_Island_Components',901.9675668,'$901967566.8',2,1.748222816092453169e-01,'22','ac22.1','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(31,'22.1.1','First_Wall_and_Blanket',43.19343421,'$43193434.21',3,8.37189162568348702e-03,'221','ac22.1.1','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(32,'22.1.2','Magnet_Radiation_Shield',94.73695574,'$94736955.74',3,1.836222428034747084e-02,'221','ac22.1.2','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(33,'22.1.3','Coils',272.0399768,'$272039976.79999995',3,5.272767135278567941e-02,'221','ac22.1.3','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(34,'22.1.3.1','HF_Coils',116.4,'$116400000.0',4,2.256102583767112534e-02,'2213','ac22.1.3.1','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(35,'22.1.3.2','LF_Coils',12.50524,'$12505240.0',4,2.42380620916046773e-03,'2213','ac22.1.3.2','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(36,'22.1.3.3','CC_Coils',143.1347368,'$143134736.8',4,2.774283930595409022e-02,'2213','ac22.1.3.3','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(37,'22.1.4','Supplemental_Heating',227.453,'$227453000.0',3,4.408567877882998281e-02,'221','ac22.1.4','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(38,'22.1.4.1','NBI',105.963,'$105963000.0',4,2.05380926188758195e-02,'2214','ac22.1.4.1','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(39,'22.1.4.2','ICRH',41.49,'$41490000.0',4,8.041726477705971043e-03,'2214','ac22.1.4.2','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(40,'22.1.4.3','ECH',80.0,'$80000000.0',4,1.550585968224819574e-02,'2214','ac22.1.4.3','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(41,'22.1.5','Primary_Structure_and_Support',0.0,'$0.0',3,0.0,'221','ac22.1.5','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(42,'22.1.6','Vacuum_System',2.031827257,'$2031827.2570000002',3,3.938153543201155615e-04,'221','ac22.1.6','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(43,'22.1.6.2','Vessel_Refrigerators',0.0,'$0.0',4,0.0,'2216','ac22.1.6.2','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(44,'22.1.6.3','Primary_Vacuum_Pumps',1.689827257,'$1689827.257',4,3.275278041785044783e-04,'2216','ac22.1.6.3','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(45,'22.1.6.4','Backing_Vacuum_Pumps',0.342,'$342000.0',4,6.628755014161104265e-05,'2216','ac22.1.6.4','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(46,'22.1.7','Power_Supplies',0.0,'$0.0',3,0.0,'221','ac22.1.7','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(47,'22.1.8','Divertor',0.0,'$0.0',3,0.0,'221','ac22.1.8','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(48,'22.1.9','Direct_Energy_Convertor',109.3171648,'$109317164.8',3,2.118820772812501919e-02,'221','ac22.1.9','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(49,'22.1.11','Assembly_and_Installation_Costs',153.1952079,'$153195207.9',3,2.969279247112800724e-02,'2211','ac22.1.11','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(50,'22.2','Main_and_Secondary_Coolant',33.6494515,'$33649451.5',2,0.0065220459167952,'22','ac22.2','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(51,'22.3','Auxiliary_Cooling_Systems',0.3521982635,'$352198.2635',2,6.826421067703095135e-05,'22','ac22.3','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(52,'22.4','Radioactive_Waste_Treatment',0.6275532695,'$627553.2695',2,1.216344117500385732e-04,'22','ac22.4','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(53,'22.5','Fuel_Handling_and_Storage',88.65405229,'$88654052.28999999',2,1.718321618839292741e-02,'22','ac22.5','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(54,'22.6','Other_Heat_Island_Equipment',1.748097852,'$1748097.852',2,3.388220000493933943e-04,'22','ac22.6','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(55,'22.7','Instrumentation_and_Control',85.0,'$85000000.0',2,1.647497591238870906e-02,'22','ac22.7','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(56,'23','Turbine_Plant_Equipment',39.82276109,'$39822761.09',1,7.718576820265415049e-03,'2','ac23','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(57,'24','Electric_Plant_Equipment',9.819310954,'$9819310.954',1,1.903210722863583459e-03,'2','ac24','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(58,'25','Miscellaneous_Plant_Equipment',6.909885486,'$6909885.4860000005',1,1.339296434578992169e-03,'2','ac25','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(59,'26','Heat_Rejection',11.67929132,'$11679291.32',1,2.263718154950241507e-03,'2','ac26','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(60,'27','Special_Materials',0.0,'$0.0',1,0.0,'2','ac27','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(61,'28','Digital_Twin/Simulator',5.0,'$5000000.0',1,9.69116230140512235e-04,'2','ac28','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,'$0.0',1,0.0,'2','ac29','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71.59197058,'$71591970.58',0,1.387618812736401107e-02,'','ac30','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(64,'31','Field_Indirect_Costs',14.31839412,'$14318394.120000001',1,2.775237626248095324e-03,'3','ac31','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(65,'32','Construction_Supervision',35.79598529,'$35795985.29',1,6.938094063682005535e-03,'3','ac32','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(66,'33','Commissioning_and_Start-Up_Costs',0.0,'$0.0',1,0.0,'3','ac33','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(67,'34','Demonstration_Test_Run',0.0,'$0.0',1,0.0,'3','ac34','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(68,'35','Design_Services_Offsite',21.47759117,'$21477591.17',1,4.162856437433910644e-03,'3','ac35','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(69,'36','PM/CM_Services_Offsite',0.0,'$0.0',1,0.0,'3','ac36','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(70,'37','Design_Servies_Offsite',0.0,'$0.0',1,0.0,'3','ac37','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(71,'38','PM/CM_Services_Onsite',0.0,'$0.0',1,0.0,'3','ac38','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(72,'39','Contingency_on_Support_Services',0.0,'$0.0',1,0.0,'3','ac39','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',155.7811156,'$155781115.6',0,3.019400149547106504e-02,'','ac40','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',37.83719261,'$37837192.61',0,0.00733372749226073,'','ac50','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(75,'51','Shipping_and_Transportation_Costs',8.0,'$8000000.0',1,1.550585968224819487e-03,'5','ac51','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(76,'52','Spare_Parts',7.323124886,'$7323124.886',1,1.419391836473697482e-03,'5','ac52','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(77,'53','Taxes',0.0,'$0.0',1,0.0,'5','ac53','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(78,'54','Insurance',1.0,'$1000000.0',1,1.938232460281024359e-04,'5','ac54','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(79,'55','Initial_Fuel_Load',21.51406772,'$21514067.72',1,4.169926440758816612e-03,'5','ac55','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(80,'58','Decommissioning_Costs',0.0,'$0.0',1,0.0,'5','ac58','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(81,'59','Contingency_on_Supplementary_Costs',0.0,'$0.0',1,0.0,'5','ac59','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',195.4094412,'$195409441.20000002',0,3.787489219792161688e-02,'','ac60','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(83,'61','Escalation',20.125,'$20125000.0',1,3.900692826315561857e-03,'6','ac61','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(84,'62','Fees',0.0,'$0.0',1,0.0,'6','ac62','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(85,'63','Interest_During_Construction_(IDC)',175.2844412,'$175284441.20000002',1,3.397419937160605503e-02,'6','ac63','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,'$0.0',1,0.0,'6','ac69','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1587.572359,'$1587572359.0',0,0.307708427925872,'OC','acOCC','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(88,'TCC','Total_Capital_Cost_(TCC)',1782.981801,'$1782981801.0',0,3.455833202788521908e-01,'TC','acTCC','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(89,'O&M','Operations_and_Maintenance',5.69490028,'$5694900.279999999',0,1.103804058075949327e-03,'O&','acO&M','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(90,'Fuel','Fuel',0.1090042081,'$109004.2081',0,2.112754944466477681e-05,'Fue','acFuel','million','','','Unchanged'); -INSERT INTO "mirror_acco" VALUES(91,'81','Deuterium',0.04739117657,'$47391.176569999996',1,9.185511675888353413e-06,'8','ac81','million','','','Unchanged'); +CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); +INSERT INTO "mirror_acco" VALUES(1,'10','Pre-Construction_Costs',24.18611754,0,'','Unchanged',4.687831810420024433e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(2,'11','Land_and_Land_Rights',1.18611754,1,'1','Unchanged',2.298971517736676198e-04,'','million',''); +INSERT INTO "mirror_acco" VALUES(3,'12','Site_Permits',10.0,1,'1','Unchanged',1.938232460281024469e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(4,'13','Plant_Licensing',0.0,1,'1','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(5,'14','Plant_Permits',5.0,1,'1','Unchanged',9.69116230140512235e-04,'','million',''); +INSERT INTO "mirror_acco" VALUES(6,'15','Plant_Studies',5.0,1,'1','Unchanged',9.69116230140512235e-04,'','million',''); +INSERT INTO "mirror_acco" VALUES(7,'16','Plant_Reports',2.0,1,'1','Unchanged',3.876464920562048719e-04,'','million',''); +INSERT INTO "mirror_acco" VALUES(8,'17','Other_Pre-Construction_Costs',1.0,1,'1','Unchanged',1.938232460281024359e-04,'','million',''); +INSERT INTO "mirror_acco" VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,1,'1','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298.175963,0,'','Unchanged',2.516166790643177831e-01,'Account_C20','million','rollup'); +INSERT INTO "mirror_acco" VALUES(11,'21','Structures_and_Improvements',112.9457941,1,'2','Unchanged',2.189152043768370289e-02,'Account_C21','million','rollup'); +INSERT INTO "mirror_acco" VALUES(12,'211','Site_Preparation/Yard_Work',42.37641442,2,'21','Unchanged',8.213534197916488519e-03,'Account_C21_1','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(13,'212','Heat_Island_Building',29.53699334,2,'21','Unchanged',5.724955927069242875e-03,'Account_C21_2','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(14,'213','Turbine_Generator_Building',8.538531265,2,'21','Unchanged',1.654965846094739622e-03,'Account_C21_3','million','application, P_egross'); +INSERT INTO "mirror_acco" VALUES(15,'214','Heat_Exchanger_Building',5.976971885,2,'21','Unchanged',1.158476092169406302e-03,'Account_C21_4','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(16,'215','Power_Supply_and_Energy_Storage',1.707706253,2,'21','Unchanged',3.309931692189479568e-04,'Account_C21_5','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(17,'216','Reactor_Auxiliaries',0.8538531265,2,'21','Unchanged',1.654965846094739784e-04,'Account_C21_6','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(18,'217','Hot_Cell',14.76849667,2,'21','Unchanged',2.862477963534621437e-03,'Account_C21_7','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(19,'218','Reactor_Services',2.956861753,2,'21','Unchanged',5.731085430228053398e-04,'Account_C21_8','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(20,'219','Service_Water',0.0474362848,2,'21','Unchanged',9.194254699449536794e-06,'Account_C21_9','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(21,'2110','Fuel_Storage',0.1739330443,2,'21','Unchanged',3.371226723777574368e-05,'Account_C21_10','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(22,'2111','Control_Room',0.1423088544,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_11','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(23,'2112','Onsite_AC_Power',0.1264967595,2,'21','Unchanged',2.45180125383262035e-05,'Account_C21_12','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(24,'2113','Administration',0.6957321771,2,'21','Unchanged',1.348490689317206382e-04,'Account_C21_13','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(25,'2114','Site_Services',0.252993519,2,'21','Unchanged',4.903602507665240699e-05,'Account_C21_14','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(26,'2115','Cryogenics',0.3794902784,2,'21','Unchanged',7.35540375955963e-05,'Account_C21_15','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(27,'2116','Security',0.1423088544,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_16','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(28,'2117','Ventilation_Stack',4.269265632,2,'21','Unchanged',8.274829229504581827e-04,'Account_C21_17','million','P_egross'); +INSERT INTO "mirror_acco" VALUES(29,'22','Heat_Island_Plant_Equipment',1111.99892,1,'2','Unchanged',2.155312402541442185e-01,'Account_C22','million','rollup'); +INSERT INTO "mirror_acco" VALUES(30,'221','Heat_Island_Components',901.9675668,2,'22','Unchanged',1.748222816092453169e-01,'Account_C22_1','million','rollup'); +INSERT INTO "mirror_acco" VALUES(31,'2211','First_Wall_and_Blanket',43.19343421,3,'221','Unchanged',8.37189162568348702e-03,'Account_C22_1_1','million','L_CC, L_EP'); +INSERT INTO "mirror_acco" VALUES(32,'2212','Magnet_Radiation_Shield',94.73695574,3,'221','Unchanged',1.836222428034747084e-02,'Account_C22_1_2','million',''); +INSERT INTO "mirror_acco" VALUES(33,'2213','Coils',272.0399768,3,'221','Unchanged',5.272767135278567941e-02,'Account_C22_1_3','million','rollup'); +INSERT INTO "mirror_acco" VALUES(34,'22131','HF_Coils',116.4,4,'2213','Unchanged',2.256102583767112534e-02,'Account_C22_1_3_1','million','HF_magnet_number'); +INSERT INTO "mirror_acco" VALUES(35,'22132','LF_Coils',12.50524,4,'2213','Unchanged',2.42380620916046773e-03,'Account_C22_1_3_2','million','LF_magnet_number'); +INSERT INTO "mirror_acco" VALUES(36,'22133','CC_Coils',143.1347368,4,'2213','Unchanged',2.774283930595409022e-02,'Account_C22_1_3_3','million',''); +INSERT INTO "mirror_acco" VALUES(37,'2214','Supplemental_Heating',227.453,3,'221','Unchanged',4.408567877882998281e-02,'Account_C22_1_4','million','rollup'); +INSERT INTO "mirror_acco" VALUES(38,'22141','NBI',105.963,4,'2214','Unchanged',2.05380926188758195e-02,'Account_C22_1_4_1','million','P_NBI, n_unit'); +INSERT INTO "mirror_acco" VALUES(39,'22142','ICRH',41.49,4,'2214','Unchanged',8.041726477705971043e-03,'Account_C22_1_4_2','million','P_ICRH, n_unit'); +INSERT INTO "mirror_acco" VALUES(40,'22143','ECH',80.0,4,'2214','Unchanged',1.550585968224819574e-02,'Account_C22_1_4_3','million','P_ECH, n_unit'); +INSERT INTO "mirror_acco" VALUES(41,'2215','Primary_Structure_and_Support',0.0,3,'221','Unchanged',0.0,'Account_C22_1_5','million',''); +INSERT INTO "mirror_acco" VALUES(42,'2216','Vacuum_System',2.031827257,3,'221','Unchanged',3.938153543201155615e-04,'Account_C22_1_6','million','rollup'); +INSERT INTO "mirror_acco" VALUES(43,'22162','Vessel_Refrigerators',0.0,4,'2216','Unchanged',0.0,'Account_C22_1_6_2','million',''); +INSERT INTO "mirror_acco" VALUES(44,'22163','Primary_Vacuum_Pumps',1.689827257,4,'2216','Unchanged',3.275278041785044783e-04,'Account_C22_1_6_3','million','V_vac'); +INSERT INTO "mirror_acco" VALUES(45,'22164','Backing_Vacuum_Pumps',0.342,4,'2216','Unchanged',6.628755014161104265e-05,'Account_C22_1_6_4','million',''); +INSERT INTO "mirror_acco" VALUES(46,'2217','Power_Supplies',0.0,3,'221','Unchanged',0.0,'Account_C22_1_7','million',''); +INSERT INTO "mirror_acco" VALUES(47,'2218','Divertor',0.0,3,'221','Unchanged',0.0,'Account_C22_1_8','million',''); +INSERT INTO "mirror_acco" VALUES(48,'2219','Direct_Energy_Convertor',109.3171648,3,'221','Unchanged',2.118820772812501919e-02,'Account_C22_1_9','million','P_DECe, n_unit'); +INSERT INTO "mirror_acco" VALUES(49,'22111','Assembly_and_Installation_Costs',153.1952079,3,'221','Unchanged',2.969279247112800724e-02,'Account_C22_1_11','million','construction_time, N_module, L, n_unit'); +INSERT INTO "mirror_acco" VALUES(50,'222','Main_and_Secondary_Coolant',33.6494515,2,'22','Unchanged',0.0065220459167952,'Account_C22_2','million','rollup'); +INSERT INTO "mirror_acco" VALUES(51,'223','Auxiliary_Cooling_Systems',0.3521982635,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); +INSERT INTO "mirror_acco" VALUES(52,'224','Radioactive_Waste_Treatment',0.6275532695,2,'22','Unchanged',1.216344117500385732e-04,'Account_C22_4','million','P_th'); +INSERT INTO "mirror_acco" VALUES(53,'225','Fuel_Handling_and_Storage',88.65405229,2,'22','Unchanged',1.718321618839292741e-02,'Account_C22_5','million','n_unit'); +INSERT INTO "mirror_acco" VALUES(54,'226','Other_Heat_Island_Equipment',1.748097852,2,'22','Unchanged',3.388220000493933943e-04,'Account_C22_6','million','P_enet'); +INSERT INTO "mirror_acco" VALUES(55,'227','Instrumentation_and_Control',85.0,2,'22','Unchanged',1.647497591238870906e-02,'Account_C22_7','million',''); +INSERT INTO "mirror_acco" VALUES(56,'23','Turbine_Plant_Equipment',39.82276109,1,'2','Unchanged',7.718576820265415049e-03,'Account_C23','million','P_egross, N_module'); +INSERT INTO "mirror_acco" VALUES(57,'24','Electric_Plant_Equipment',9.819310954,1,'2','Unchanged',1.903210722863583459e-03,'Account_C24','million','P_egross, N_module'); +INSERT INTO "mirror_acco" VALUES(58,'25','Miscellaneous_Plant_Equipment',6.909885486,1,'2','Unchanged',1.339296434578992169e-03,'Account_C25','million','P_egross, N_module'); +INSERT INTO "mirror_acco" VALUES(59,'26','Heat_Rejection',11.67929132,1,'2','Unchanged',2.263718154950241507e-03,'Account_C26','million','P_enet, N_module'); +INSERT INTO "mirror_acco" VALUES(60,'27','Special_Materials',0.0,1,'2','Unchanged',0.0,'Account_C27','million',''); +INSERT INTO "mirror_acco" VALUES(61,'28','Digital_Twin/Simulator',5.0,1,'2','Unchanged',9.69116230140512235e-04,'Account_C28','million',''); +INSERT INTO "mirror_acco" VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'2','Unchanged',0.0,'Account_C29','million','rollup'); +INSERT INTO "mirror_acco" VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71.59197058,0,'','Unchanged',1.387618812736401107e-02,'','million',''); +INSERT INTO "mirror_acco" VALUES(64,'31','Field_Indirect_Costs',14.31839412,1,'3','Unchanged',2.775237626248095324e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(65,'32','Construction_Supervision',35.79598529,1,'3','Unchanged',6.938094063682005535e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(66,'33','Commissioning_and_Start-Up_Costs',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(67,'34','Demonstration_Test_Run',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(68,'35','Design_Services_Offsite',21.47759117,1,'3','Unchanged',4.162856437433910644e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(69,'36','PM/CM_Services_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(70,'37','Design_Servies_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(71,'38','PM/CM_Services_Onsite',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(72,'39','Contingency_on_Support_Services',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',155.7811156,0,'','Unchanged',3.019400149547106504e-02,'','million',''); +INSERT INTO "mirror_acco" VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',37.83719261,0,'','Unchanged',0.00733372749226073,'','million',''); +INSERT INTO "mirror_acco" VALUES(75,'51','Shipping_and_Transportation_Costs',8.0,1,'5','Unchanged',1.550585968224819487e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(76,'52','Spare_Parts',7.323124886,1,'5','Unchanged',1.419391836473697482e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(77,'53','Taxes',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(78,'54','Insurance',1.0,1,'5','Unchanged',1.938232460281024359e-04,'','million',''); +INSERT INTO "mirror_acco" VALUES(79,'55','Initial_Fuel_Load',21.51406772,1,'5','Unchanged',4.169926440758816612e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(80,'58','Decommissioning_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(81,'59','Contingency_on_Supplementary_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',195.4094412,0,'','Unchanged',3.787489219792161688e-02,'','million',''); +INSERT INTO "mirror_acco" VALUES(83,'61','Escalation',20.125,1,'6','Unchanged',3.900692826315561857e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(84,'62','Fees',0.0,1,'6','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(85,'63','Interest_During_Construction_(IDC)',175.2844412,1,'6','Unchanged',3.397419937160605503e-02,'','million',''); +INSERT INTO "mirror_acco" VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,1,'6','Unchanged',0.0,'','million',''); +INSERT INTO "mirror_acco" VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1587.572359,0,'','Unchanged',0.307708427925872,'','million',''); +INSERT INTO "mirror_acco" VALUES(88,'TCC','Total_Capital_Cost_(TCC)',1782.981801,0,'','Unchanged',3.455833202788521908e-01,'','million',''); +INSERT INTO "mirror_acco" VALUES(89,'O&M','Operations_and_Maintenance',5.69490028,0,'','Unchanged',1.103804058075949327e-03,'','million',''); +INSERT INTO "mirror_acco" VALUES(90,'Fuel','Fuel',0.1090042081,0,'','Unchanged',2.112754944466477681e-05,'','million',''); +INSERT INTO "mirror_acco" VALUES(91,'81','Deuterium',0.04739117657,1,'8','Unchanged',9.185511675888353413e-06,'','million',''); CREATE TABLE mirror_alg ( ind INTEGER DEFAULT NULL, alg_name TEXT NOT NULL, @@ -7051,62 +7037,62 @@ INSERT INTO "mirror_alg" VALUES(1,'__init__','v','None','MirrorFunc','TODO','TOD INSERT INTO "mirror_alg" VALUES(2,'add_account','v','Add an account to the cost_account object.','MirrorFunc','TODO','TODO'); INSERT INTO "mirror_alg" VALUES(3,'generate_report','v','Generate a report based on user input.','MirrorFunc','TODO','TODO'); INSERT INTO "mirror_alg" VALUES(4,'learning_credit','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(13,'Account_C21_7','c','Account C217 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(14,'Account_C21_8','c','Account C218 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(15,'Account_C21_9','c','Account C219 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(16,'Account_C21_10','c','Account C2110 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(17,'Account_C21_11','c','Account C2111 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(18,'Account_C21_12','c','Account C2112 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(19,'Account_C21_13','c','Account C2113 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(20,'Account_C21_14','c','Account C2114 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(21,'Account_C21_15','c','Account C2115 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(22,'Account_C21_16','c','Account C2116 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(23,'Account_C21_17','c','Account C2117 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(24,'Account_C22','c','Account C22 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(25,'Account_C22_1','c','Account C221 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(37,'Account_C22_1_6','c','Account C2216 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(38,'Account_C22_1_6_2','c','Account C22162 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(47,'Account_C22_2_2','c','Account C2222 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(48,'Account_C22_2_3','c','Account C2223 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(50,'Account_C22_4','c','Account C224 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(52,'Account_C22_6','c','Account C226 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(53,'Account_C22_7','c','Account C227 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(58,'Account_C27','c','Account C27 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(59,'Account_C28','c','Account C28 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(60,'Account_C29','c','Account C29 Rollup','MirrorFunc','TODO','million'); +INSERT INTO "mirror_alg" VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','application, P_egross','million'); +INSERT INTO "mirror_alg" VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(13,'Account_C21_7','c','Account C217 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(14,'Account_C21_8','c','Account C218 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(15,'Account_C21_9','c','Account C219 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(16,'Account_C21_10','c','Account C2110 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(17,'Account_C21_11','c','Account C2111 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(18,'Account_C21_12','c','Account C2112 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(19,'Account_C21_13','c','Account C2113 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(20,'Account_C21_14','c','Account C2114 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(21,'Account_C21_15','c','Account C2115 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(22,'Account_C21_16','c','Account C2116 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(23,'Account_C21_17','c','Account C2117 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO "mirror_alg" VALUES(24,'Account_C22','c','Account C22 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(25,'Account_C22_1','c','Account C221 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','L_CC, L_EP','million'); +INSERT INTO "mirror_alg" VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number','million'); +INSERT INTO "mirror_alg" VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number','million'); +INSERT INTO "mirror_alg" VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','P_NBI, n_unit','million'); +INSERT INTO "mirror_alg" VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','P_ICRH, n_unit','million'); +INSERT INTO "mirror_alg" VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup','MirrorFunc','P_ECH, n_unit','million'); +INSERT INTO "mirror_alg" VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(37,'Account_C22_1_6','c','Account C2216 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(38,'Account_C22_1_6_2','c','Account C22162 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','V_vac','million'); +INSERT INTO "mirror_alg" VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','P_DECe, n_unit','million'); +INSERT INTO "mirror_alg" VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','construction_time, N_module, L, n_unit','million'); +INSERT INTO "mirror_alg" VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','rollup','million'); +INSERT INTO "mirror_alg" VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO "mirror_alg" VALUES(47,'Account_C22_2_2','c','Account C2222 Rollup','MirrorFunc','P_th','million'); +INSERT INTO "mirror_alg" VALUES(48,'Account_C22_2_3','c','Account C2223 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','N_module, P_th','million'); +INSERT INTO "mirror_alg" VALUES(50,'Account_C22_4','c','Account C224 Rollup','MirrorFunc','P_th','million'); +INSERT INTO "mirror_alg" VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','n_unit','million'); +INSERT INTO "mirror_alg" VALUES(52,'Account_C22_6','c','Account C226 Rollup','MirrorFunc','P_enet','million'); +INSERT INTO "mirror_alg" VALUES(53,'Account_C22_7','c','Account C227 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO "mirror_alg" VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO "mirror_alg" VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO "mirror_alg" VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','P_enet, N_module','million'); +INSERT INTO "mirror_alg" VALUES(58,'Account_C27','c','Account C27 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(59,'Account_C28','c','Account C28 Rollup','MirrorFunc','reference value','million'); +INSERT INTO "mirror_alg" VALUES(60,'Account_C29','c','Account C29 Rollup','MirrorFunc','rollup','million'); INSERT INTO "mirror_alg" VALUES(61,'Account_OCC','c','Account OCC Rollup','MirrorFunc','TODO','million'); INSERT INTO "mirror_alg" VALUES(62,'Account_TCC','c','Account TCC Rollup','MirrorFunc','TODO','million'); INSERT INTO "mirror_alg" VALUES(63,'Account_C90','c','Account C90 Rollup','MirrorFunc','TODO','million'); @@ -7139,139 +7125,188 @@ CREATE TABLE mirror_var ( user_input INTEGER DEFAULT NULL, PRIMARY KEY (var_name) ); -INSERT INTO "mirror_var" VALUES(1,'E_DT','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(2,'E_alpha','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(3,'E_n','str','','TODO','E_DT, E_alpha','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(4,'m_T','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(5,'m_D','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(6,'m_6Li','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(7,'Wh_to_BTU','float',3.41214,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(8,'indentation','INTEGER',0.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(9,'indented_name','str','','TODO','account_name, account_number, indentation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(10,'inputs','str','','TODO','NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(11,'cost_data','str','','TODO','cost_account','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(12,'L_magnet_to_magnet','str','','TODO','inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(13,'L_cylinder','str','','TODO','L_magnet_to_magnet','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(14,'expander_cell_cost_result','str','','TODO','expander_cell_cost, inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(15,'end_plug_cylindrical_part','str','','TODO','L_cylinder, central_cell, inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(16,'end_plug_cylindrical_part_cost','str','','TODO','end_plug_cylindrical_part','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(17,'central_cell_cylindrical_part','str','','TODO','central_cell, inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(18,'central_cell_cylindrical_part_cost','str','','TODO','central_cell_cylindrical_part','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(19,'total_cost','str','','TODO','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(20,'cost_factor','str','','TODO','inputs, np','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(21,'cost_pump','INTEGER',40000.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(22,'vpump_cap','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(23,'no_vpumps','str','','TODO','inputs, vpump_cap','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(24,'axis_t','str','','TODO','inputs, np','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(25,'axis_ir','str','','TODO','axis_t','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(26,'lr','str','','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(27,'constructionworker','str','','TODO','axis_ir','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(28,'C_22_1_11_in','str','','TODO','inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(29,'C_22_1_11_1_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(30,'C_22_1_11_2_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(31,'C_22_1_11_3_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(32,'C_22_1_11_4_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(33,'C_22_1_11_5_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(34,'C_22_1_11_6_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(35,'C_22_1_11_7_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(36,'C_22_1_11_8_in','INTEGER',0.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(37,'C_22_1_11_9_in','str','','TODO','constructionworker, inputs, lr','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(38,'C_22_1_11_10_in','INTEGER',0.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(39,'C220111','str','','TODO','C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(40,'inflation','float',1.43,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(41,'C2205010ITER','str','','TODO','inflation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(42,'C2205020ITER','str','','TODO','inflation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(43,'C2205030ITER','str','','TODO','inflation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(44,'C2205040ITER','str','','TODO','inflation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(45,'C2205050ITER','str','','TODO','inflation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(46,'C2205060ITER','str','','TODO','inflation','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(47,'lcredit','float',0.8,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(48,'ltoak','str','','TODO','lcredit, np','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(49,'C220501','str','','TODO','C2205010ITER, ltoak','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(50,'C220502','str','','TODO','C2205020ITER, ltoak','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(51,'C220503','str','','TODO','C2205030ITER, ltoak','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(52,'C220504','str','','TODO','C2205040ITER, ltoak','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(53,'C220505','str','','TODO','C2205050ITER, ltoak','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(54,'C220506','str','','TODO','C2205060ITER, ltoak','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(55,'C220500','str','','TODO','C220501, C220502, C220503, C220504, C220505, C220506','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(56,'f_cr','float',0.09,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(57,'f_6Li_natural','float',0.075,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(58,'rho_6Li','float',460.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(59,'rho_7Li','float',537.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(60,'T_K','str','','TODO','T','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(61,'rho_PbLi','str','','TODO','T_K','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(62,'P_6Li075','float',15.152,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(63,'P_6Li90','INTEGER',70.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(64,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(65,'Cf','list','(1, 2, 4, 8, 16)','TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(66,'f_interp','str','','TODO','Cf, f, scipy','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(67,'f_Li','float',0.17,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(68,'f_Pb','str','','TODO','f_Li','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(69,'P_Li','str','','TODO','Li_price, f_6Li','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(70,'P_PbLi','str','','TODO','P_Li, P_Pb, f_Li, f_Pb','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(71,'P_f_CC','str','','TODO','P_f, P_f_EP','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(72,'L_CC','str','','TODO','P_f_CC, P_f_L','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(73,'L_CF','float',1.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(74,'L','str','','TODO','L_CC, L_EC, L_EP','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(75,'V_vac','str','','TODO','L, a_EC, np','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(76,'P_alpha','str','','TODO','E_DT, E_alpha, P_f','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(77,'P_n','str','','TODO','P_alpha, P_f','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(78,'P_ine','str','','TODO','P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(79,'P_pump','str','','TODO','M_n, P_n, f_pump','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(80,'P_sub_cont','str','','TODO','P_f, f_sub','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(81,'P_cryo','str','','TODO','P_f, f_cryo','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(82,'P_other','str','','TODO','P_cryo, P_pump, P_sub_cont','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(83,'P_in','str','','TODO','P_ECH, P_ICRH, P_NBI','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(84,'P_th','str','','TODO','M_n, P_n, P_pump, eta_pump','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(85,'P_the','str','','TODO','P_th, eta_th','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(86,'P_DEC','str','','TODO','P_alpha, P_in','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(87,'P_DECe','str','','TODO','P_DEC, eta_DEC','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(88,'P_egross','str','','TODO','P_DECe, P_the','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(89,'P_enet','str','','TODO','P_egross, P_ine, P_other','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(90,'f_aux','str','','TODO','P_aux, P_egross','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(91,'Q_sci','str','','TODO','P_f, P_in','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(92,'Q_eng','str','','TODO','P_egross, P_ine, P_other','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(93,'f_refrac','str','','TODO','Q_eng','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(94,'run_name','str','','TODO','P_f, float','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(95,'cost_file_full','str','','TODO','cost_file, pkg_resources','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(96,'new_data','str','','TODO','f_vol, material, name, pd, thickness','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(97,'r_in','str','','TODO','data','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(98,'r_out','str','','TODO','data','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(99,'radial_build','str','','TODO','create_radial_build, inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(100,'filename','str','','TODO','inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(101,'T','INTEGER',300.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(102,'material','str','','TODO','i, radial_build','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(103,'f_6Li','float',0.075,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(104,'radius','str','','TODO','inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(105,'thickness','str','','TODO','inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(106,'vv_material','str','','TODO','inputs','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(107,'V_end_cap','str','','TODO','np, radius, thickness','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(108,'M_end_cap','str','','TODO','V_end_cap, cost_data, vv_material','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(109,'C_end_cap','str','','TODO','M_end_cap, cost_data, vv_material','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(110,'total','str','','TODO','C_end_cap, radial_build','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(111,'cost','float',29.1,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(112,'a_M','float',0.15,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(113,'a_CC','float',0.54,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(114,'a_0','float',0.7,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(115,'length','float',0.5,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(116,'r_gap','float',0.1,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(117,'r_vv','float',0.01,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(118,'r_magnet','float',1.5,'m','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(119,'r_cryostat','float',1.0,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(120,'f_vol','float',0.9,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(121,'V_radially_inner_cylinder','str','','TODO','V_cylindrical_shell, f_vol, length, r_in, r_out','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(122,'length_cc_cylinder','float',0.5,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(123,'r_in_cc','str','','TODO','a_CC, r_gap, r_vv','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(124,'r_out_cc','str','','TODO','r_in_cc','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(125,'V_cc_cylinder','str','','TODO','V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(126,'V_cc_triangle','str','','TODO','V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(127,'length_ep_cylinder','float',0.5,'TODO','','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(128,'r_in_ep','str','','TODO','a_0, r_gap, r_vv','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(129,'r_out_ep','str','','TODO','r_in_ep','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(130,'V_ep_cylinder','str','','TODO','V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(131,'V_ep_triangle','str','','TODO','V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(132,'V_total_cc_facing','str','','TODO','V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(133,'V_total_ec_facing','str','','TODO','V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(134,'V_total','str','','TODO','V_total_cc_facing, V_total_ec_facing','TODO','TODO',''); -INSERT INTO "mirror_var" VALUES(135,'mass','str','','TODO','V_total, cost_data, material','TODO','TODO',''); +INSERT INTO "mirror_var" VALUES(1,'E_DT','str','','1','','','P_alpha',''); +INSERT INTO "mirror_var" VALUES(2,'E_alpha','str','','1','','','P_alpha',''); +INSERT INTO "mirror_var" VALUES(3,'E_n','str','','1','E_DT, E_alpha','','',''); +INSERT INTO "mirror_var" VALUES(4,'m_T','str','','1','','','',''); +INSERT INTO "mirror_var" VALUES(5,'m_D','str','','1','','','',''); +INSERT INTO "mirror_var" VALUES(6,'m_6Li','str','','1','','','',''); +INSERT INTO "mirror_var" VALUES(7,'Wh_to_BTU','float',3.41214,'1','','','',''); +INSERT INTO "mirror_var" VALUES(8,'indentation','int',0.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(9,'indented_name','str','','1','account_name, account_number, indentation','','',''); +INSERT INTO "mirror_var" VALUES(10,'inputs','str','','1','NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness','','',''); +INSERT INTO "mirror_var" VALUES(11,'cost_data','str','','1','cost_account','','',''); +INSERT INTO "mirror_var" VALUES(12,'L_magnet_to_magnet','str','','1','inputs','','',''); +INSERT INTO "mirror_var" VALUES(13,'L_cylinder','str','','1','L_magnet_to_magnet','','',''); +INSERT INTO "mirror_var" VALUES(14,'expander_cell_cost_result','str','','1','expander_cell_cost, inputs','','',''); +INSERT INTO "mirror_var" VALUES(15,'end_plug_cylindrical_part','str','','1','L_cylinder, central_cell, inputs','','',''); +INSERT INTO "mirror_var" VALUES(16,'end_plug_cylindrical_part_cost','str','','1','end_plug_cylindrical_part','','',''); +INSERT INTO "mirror_var" VALUES(17,'central_cell_cylindrical_part','str','','1','central_cell, inputs','','',''); +INSERT INTO "mirror_var" VALUES(18,'central_cell_cylindrical_part_cost','str','','1','central_cell_cylindrical_part','','',''); +INSERT INTO "mirror_var" VALUES(19,'total_cost','str','','1','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result','','',''); +INSERT INTO "mirror_var" VALUES(20,'cost_factor','str','','1','inputs, np','','',''); +INSERT INTO "mirror_var" VALUES(21,'cost_pump','int',40000.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(22,'vpump_cap','str','','1','','','',''); +INSERT INTO "mirror_var" VALUES(23,'no_vpumps','str','','1','inputs, vpump_cap','','',''); +INSERT INTO "mirror_var" VALUES(24,'axis_t','str','','1','inputs, np','','',''); +INSERT INTO "mirror_var" VALUES(25,'axis_ir','str','','1','axis_t','','',''); +INSERT INTO "mirror_var" VALUES(26,'lr','str','','1','','','',''); +INSERT INTO "mirror_var" VALUES(27,'constructionworker','str','','1','axis_ir','','',''); +INSERT INTO "mirror_var" VALUES(28,'C_22_1_11_in','str','','1','inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(29,'C_22_1_11_1_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(30,'C_22_1_11_2_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(31,'C_22_1_11_3_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(32,'C_22_1_11_4_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(33,'C_22_1_11_5_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(34,'C_22_1_11_6_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(35,'C_22_1_11_7_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(36,'C_22_1_11_8_in','int',0.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(37,'C_22_1_11_9_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO "mirror_var" VALUES(38,'C_22_1_11_10_in','int',0.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(39,'C220111','str','','1','C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in','','',''); +INSERT INTO "mirror_var" VALUES(40,'inflation','float',1.43,'1','','','',''); +INSERT INTO "mirror_var" VALUES(41,'C2205010ITER','str','','1','inflation','','',''); +INSERT INTO "mirror_var" VALUES(42,'C2205020ITER','str','','1','inflation','','',''); +INSERT INTO "mirror_var" VALUES(43,'C2205030ITER','str','','1','inflation','','',''); +INSERT INTO "mirror_var" VALUES(44,'C2205040ITER','str','','1','inflation','','',''); +INSERT INTO "mirror_var" VALUES(45,'C2205050ITER','str','','1','inflation','','',''); +INSERT INTO "mirror_var" VALUES(46,'C2205060ITER','str','','1','inflation','','',''); +INSERT INTO "mirror_var" VALUES(47,'lcredit','float',0.8,'1','','','',''); +INSERT INTO "mirror_var" VALUES(48,'ltoak','str','','1','lcredit, np','','',''); +INSERT INTO "mirror_var" VALUES(49,'C220501','str','','1','C2205010ITER, ltoak','','',''); +INSERT INTO "mirror_var" VALUES(50,'C220502','str','','1','C2205020ITER, ltoak','','',''); +INSERT INTO "mirror_var" VALUES(51,'C220503','str','','1','C2205030ITER, ltoak','','',''); +INSERT INTO "mirror_var" VALUES(52,'C220504','str','','1','C2205040ITER, ltoak','','',''); +INSERT INTO "mirror_var" VALUES(53,'C220505','str','','1','C2205050ITER, ltoak','','',''); +INSERT INTO "mirror_var" VALUES(54,'C220506','str','','1','C2205060ITER, ltoak','','',''); +INSERT INTO "mirror_var" VALUES(55,'C220500','str','','1','C220501, C220502, C220503, C220504, C220505, C220506','','',''); +INSERT INTO "mirror_var" VALUES(56,'f_cr','float',0.09,'1','','','',''); +INSERT INTO "mirror_var" VALUES(57,'f_6Li_natural','float',0.075,'1','','','',''); +INSERT INTO "mirror_var" VALUES(58,'rho_6Li','float',460.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(59,'rho_7Li','float',537.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(60,'T_K','str','','1','T','','',''); +INSERT INTO "mirror_var" VALUES(61,'rho_PbLi','str','','1','T_K','','',''); +INSERT INTO "mirror_var" VALUES(62,'P_6Li075','float',15.152,'1','','','',''); +INSERT INTO "mirror_var" VALUES(63,'P_6Li90','int',70.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(64,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','1','','','',''); +INSERT INTO "mirror_var" VALUES(65,'Cf','list','(1, 2, 4, 8, 16)','1','','','',''); +INSERT INTO "mirror_var" VALUES(66,'f_interp','str','','1','Cf, f, scipy','','',''); +INSERT INTO "mirror_var" VALUES(67,'f_Li','float',0.17,'1','','','',''); +INSERT INTO "mirror_var" VALUES(68,'f_Pb','str','','1','f_Li','','',''); +INSERT INTO "mirror_var" VALUES(69,'P_Li','str','','1','Li_price, f_6Li','','',''); +INSERT INTO "mirror_var" VALUES(70,'P_PbLi','str','','1','P_Li, P_Pb, f_Li, f_Pb','','',''); +INSERT INTO "mirror_var" VALUES(71,'P_f_CC','str','','1','P_f, P_f_EP','P_f, P_f_EP','L_CC',''); +INSERT INTO "mirror_var" VALUES(72,'L_CC','str','','1','P_f_CC, P_f_L','P_f_CC, P_f_L','CF_magnet_number, L',''); +INSERT INTO "mirror_var" VALUES(73,'L_CF','float',1.0,'1','','','CF_magnet_number',''); +INSERT INTO "mirror_var" VALUES(74,'L','str','','1','L_CC, L_EC, L_EP','L_CC, L_EP, L_EC','V_vac',''); +INSERT INTO "mirror_var" VALUES(75,'V_vac','str','','1','L, a_EC, np','L, a_EC','',''); +INSERT INTO "mirror_var" VALUES(76,'P_alpha','str','','1','E_DT, E_alpha, P_f','E_DT, E_alpha, P_f','P_DEC, P_n',''); +INSERT INTO "mirror_var" VALUES(77,'P_n','str','','1','P_alpha, P_f','P_f, P_alpha','P_pump, P_th',''); +INSERT INTO "mirror_var" VALUES(78,'P_ine','str','','1','P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',''); +INSERT INTO "mirror_var" VALUES(79,'P_pump','str','','1','M_n, P_n, f_pump','f_pump, M_n, P_n','P_other, P_th',''); +INSERT INTO "mirror_var" VALUES(80,'P_sub_cont','str','','1','P_f, f_sub','f_sub, P_f','P_other',''); +INSERT INTO "mirror_var" VALUES(81,'P_cryo','str','','1','P_f, f_cryo','f_cryo, P_f','P_other',''); +INSERT INTO "mirror_var" VALUES(82,'P_other','str','','1','P_cryo, P_pump, P_sub_cont','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',''); +INSERT INTO "mirror_var" VALUES(83,'P_in','str','','1','P_ECH, P_ICRH, P_NBI','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',''); +INSERT INTO "mirror_var" VALUES(84,'P_th','str','','1','M_n, P_n, P_pump, eta_pump','M_n, P_n, P_pump, eta_pump','P_the',''); +INSERT INTO "mirror_var" VALUES(85,'P_the','str','','1','P_th, eta_th','eta_th, P_th','P_egross',''); +INSERT INTO "mirror_var" VALUES(86,'P_DEC','str','','1','P_alpha, P_in','P_in, P_alpha','P_DECe',''); +INSERT INTO "mirror_var" VALUES(87,'P_DECe','str','','1','P_DEC, eta_DEC','eta_DEC, P_DEC','P_egross',''); +INSERT INTO "mirror_var" VALUES(88,'P_egross','str','','1','P_DECe, P_the','application, P_DECe, P_the','P_enet, Q_eng, f_aux',''); +INSERT INTO "mirror_var" VALUES(89,'P_enet','str','','1','P_egross, P_ine, P_other','P_egross, P_ine, P_other','',''); +INSERT INTO "mirror_var" VALUES(90,'f_aux','str','','1','P_aux, P_egross','P_aux, P_egross','',''); +INSERT INTO "mirror_var" VALUES(91,'Q_sci','str','','1','P_f, P_in','P_f, P_in','',''); +INSERT INTO "mirror_var" VALUES(92,'Q_eng','str','','1','P_egross, P_ine, P_other','P_egross, P_ine, P_other','f_refrac',''); +INSERT INTO "mirror_var" VALUES(93,'f_refrac','str','','1','Q_eng','Q_eng','',''); +INSERT INTO "mirror_var" VALUES(94,'run_name','str','','1','P_f, float','','',''); +INSERT INTO "mirror_var" VALUES(95,'cost_file_full','str','','1','cost_file, pkg_resources','','',''); +INSERT INTO "mirror_var" VALUES(96,'new_data','str','','1','f_vol, material, name, pd, thickness','','',''); +INSERT INTO "mirror_var" VALUES(97,'r_in','str','','1','data','','',''); +INSERT INTO "mirror_var" VALUES(98,'r_out','str','','1','data','','',''); +INSERT INTO "mirror_var" VALUES(99,'radial_build','str','','1','create_radial_build, inputs','','',''); +INSERT INTO "mirror_var" VALUES(100,'filename','str','','1','inputs','','',''); +INSERT INTO "mirror_var" VALUES(101,'T','int',300.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(102,'material','str','','1','i, radial_build','','',''); +INSERT INTO "mirror_var" VALUES(103,'f_6Li','float',0.075,'1','','','',''); +INSERT INTO "mirror_var" VALUES(104,'radius','str','','1','inputs','','',''); +INSERT INTO "mirror_var" VALUES(105,'thickness','str','','1','inputs','','',''); +INSERT INTO "mirror_var" VALUES(106,'vv_material','str','','1','inputs','','',''); +INSERT INTO "mirror_var" VALUES(107,'V_end_cap','str','','1','np, radius, thickness','','',''); +INSERT INTO "mirror_var" VALUES(108,'M_end_cap','str','','1','V_end_cap, cost_data, vv_material','','',''); +INSERT INTO "mirror_var" VALUES(109,'C_end_cap','str','','1','M_end_cap, cost_data, vv_material','','',''); +INSERT INTO "mirror_var" VALUES(110,'total','str','','1','C_end_cap, radial_build','','',''); +INSERT INTO "mirror_var" VALUES(111,'cost','float',29.1,'1','','','',''); +INSERT INTO "mirror_var" VALUES(112,'a_M','float',0.15,'1','','','',''); +INSERT INTO "mirror_var" VALUES(113,'a_CC','float',0.54,'1','','','',''); +INSERT INTO "mirror_var" VALUES(114,'a_0','float',0.7,'1','','','',''); +INSERT INTO "mirror_var" VALUES(115,'length','float',0.5,'1','','','',''); +INSERT INTO "mirror_var" VALUES(116,'r_gap','float',0.1,'1','','','',''); +INSERT INTO "mirror_var" VALUES(117,'r_vv','float',0.01,'1','','','',''); +INSERT INTO "mirror_var" VALUES(118,'r_magnet','float',1.5,'m','','','',''); +INSERT INTO "mirror_var" VALUES(119,'r_cryostat','float',1.0,'1','','','',''); +INSERT INTO "mirror_var" VALUES(120,'f_vol','float',0.9,'1','','','',''); +INSERT INTO "mirror_var" VALUES(121,'V_radially_inner_cylinder','str','','1','V_cylindrical_shell, f_vol, length, r_in, r_out','','',''); +INSERT INTO "mirror_var" VALUES(122,'length_cc_cylinder','float',0.5,'1','','','',''); +INSERT INTO "mirror_var" VALUES(123,'r_in_cc','str','','1','a_CC, r_gap, r_vv','','',''); +INSERT INTO "mirror_var" VALUES(124,'r_out_cc','str','','1','r_in_cc','','',''); +INSERT INTO "mirror_var" VALUES(125,'V_cc_cylinder','str','','1','V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc','','',''); +INSERT INTO "mirror_var" VALUES(126,'V_cc_triangle','str','','1','V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc','','',''); +INSERT INTO "mirror_var" VALUES(127,'length_ep_cylinder','float',0.5,'1','','','',''); +INSERT INTO "mirror_var" VALUES(128,'r_in_ep','str','','1','a_0, r_gap, r_vv','','',''); +INSERT INTO "mirror_var" VALUES(129,'r_out_ep','str','','1','r_in_ep','','',''); +INSERT INTO "mirror_var" VALUES(130,'V_ep_cylinder','str','','1','V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep','','',''); +INSERT INTO "mirror_var" VALUES(131,'V_ep_triangle','str','','1','V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep','','',''); +INSERT INTO "mirror_var" VALUES(132,'V_total_cc_facing','str','','1','V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','','',''); +INSERT INTO "mirror_var" VALUES(133,'V_total_ec_facing','str','','1','V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','','',''); +INSERT INTO "mirror_var" VALUES(134,'V_total','str','','1','V_total_cc_facing, V_total_ec_facing','','',''); +INSERT INTO "mirror_var" VALUES(135,'mass','str','','1','V_total, cost_data, material','','',''); +INSERT INTO "mirror_var" VALUES(136,'application','Mirror input parameter','heat','1','','','P_egross',0); +INSERT INTO "mirror_var" VALUES(137,'P_f','Mirror input parameter',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); +INSERT INTO "mirror_var" VALUES(138,'P_f_L','Mirror input parameter',1.0,'MW/m','','','L_CC',0); +INSERT INTO "mirror_var" VALUES(139,'P_f_EP','Mirror input parameter',1.0,'MW','','','P_f_CC',0); +INSERT INTO "mirror_var" VALUES(140,'P_NBI','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); +INSERT INTO "mirror_var" VALUES(141,'P_ECH','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); +INSERT INTO "mirror_var" VALUES(142,'P_ICRH','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); +INSERT INTO "mirror_var" VALUES(143,'M_n','Mirror input parameter',1.1,'1','','','P_pump, P_th',0); +INSERT INTO "mirror_var" VALUES(144,'N_module','Mirror input parameter',1.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(145,'f_pump','Mirror input parameter',0.03,'1','','','P_pump',0); +INSERT INTO "mirror_var" VALUES(146,'f_sub','Mirror input parameter',0.04,'1','','','P_sub_cont',0); +INSERT INTO "mirror_var" VALUES(147,'f_cryo','Mirror input parameter',0.01,'1','','','P_cryo',0); +INSERT INTO "mirror_var" VALUES(148,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); +INSERT INTO "mirror_var" VALUES(149,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); +INSERT INTO "mirror_var" VALUES(150,'eta_DEC','Mirror input parameter',0.9,'1','','','P_DECe',0); +INSERT INTO "mirror_var" VALUES(151,'eta_pump','Mirror input parameter',0.98,'1','','','P_th',0); +INSERT INTO "mirror_var" VALUES(152,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO "mirror_var" VALUES(153,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO "mirror_var" VALUES(154,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO "mirror_var" VALUES(155,'NOAK','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(156,'n_unit','Mirror input parameter',1.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(157,'construction_time','Mirror input parameter',6.0,'years','','','',0); +INSERT INTO "mirror_var" VALUES(158,'lifetime','Mirror input parameter',30.0,'years','','','',0); +INSERT INTO "mirror_var" VALUES(159,'replacement','Mirror input parameter',10.0,'years','','','',0); +INSERT INTO "mirror_var" VALUES(160,'availability','Mirror input parameter',0.9,'1','','','',0); +INSERT INTO "mirror_var" VALUES(161,'discount','Mirror input parameter',0.0245,'1','','','',0); +INSERT INTO "mirror_var" VALUES(162,'LSA','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(163,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(164,'include_tax','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(165,'include_licensing','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(166,'include_contingency','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(167,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(168,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(169,'a_EC','Mirror input parameter',1.0,'m','','','V_vac',0); +INSERT INTO "mirror_var" VALUES(170,'expander_cell_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(171,'vacuum_gap_CC','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(172,'first_wall_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(173,'vacuum_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(174,'multiplier_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(175,'blanket_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(176,'blanket_coolant_fraction','Mirror input parameter',0.9,'1','','','',0); +INSERT INTO "mirror_var" VALUES(177,'blanket_structural_fraction','Mirror input parameter',0.1,'1','','','',0); +INSERT INTO "mirror_var" VALUES(178,'outer_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(179,'L_EP','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO "mirror_var" VALUES(180,'L_EC','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO "mirror_var" VALUES(181,'a_EP','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(182,'HF_magnet_number','Mirror input parameter',4.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(183,'LF_magnet_number','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(184,'CF_magnet_number','Mirror generated parameter','','1','','L_CC, L_CF','',0); COMMIT; diff --git a/src/etc/accert.sch b/src/etc/accert.sch index e251ad0..df27f70 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -798,7 +798,7 @@ fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'ann stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost'] -mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'vacuum_gap_CC' 'first_wall_thickness' 'vacuum_vessel_thickness' 'multiplier_thickness' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'CF_magnet_number'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index dd0e7b8..c7c601b 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -7,6 +7,7 @@ from __future__ import annotations import argparse +import ast import csv import re import shutil @@ -29,6 +30,121 @@ "mirror_var": "mirror_variable.csv", } +MIRROR_ACCOUNT_COLUMNS = [ + ("ind", "INTEGER"), + ("code_of_account", "TEXT NOT NULL"), + ("account_description", "TEXT"), + ("total_cost", "REAL"), + ("level", "INTEGER"), + ("supaccount", "TEXT"), + ("review_status", "TEXT"), + ("prn", "REAL"), + ("alg_name", "TEXT"), + ("fun_unit", "TEXT"), + ("variables", "TEXT"), +] + +HUMAN_INPUT_TO_VAR = { + "Application": "application", + "Central Cell Length": "L_CC", + "Construction Time": "construction_time", + "Contingency": "include_contingency", + "DEC Electrical Power": "P_DECe", + "ECH Power": "P_ECH", + "End Plug Length": "L_EP", + "Gross Electric Power": "P_egross", + "HF Magnet Number": "HF_magnet_number", + "ICRH Power": "P_ICRH", + "LF Magnet Number": "LF_magnet_number", + "NBI Power": "P_NBI", + "NOAK": "NOAK", + "Net Electric Power": "P_enet", + "Number of Modules": "N_module", + "Overall Length": "L", + "Thermal Power": "P_th", + "Unit Number": "n_unit", + "Vacuum Volume": "V_vac", +} + +MIRROR_INPUT_DEFAULTS = { + "application": ("heat", "1"), + "P_f": (1, "MW"), + "P_f_L": (1, "MW/m"), + "P_f_EP": (1, "MW"), + "P_NBI": (1, "MW"), + "P_ECH": (1, "MW"), + "P_ICRH": (1, "MW"), + "M_n": (1.1, "1"), + "N_module": (1, "1"), + "f_pump": (0.03, "1"), + "f_sub": (0.04, "1"), + "f_cryo": (0.01, "1"), + "P_aux": (1, "MW"), + "eta_th": (0.50, "1"), + "eta_DEC": (0.90, "1"), + "eta_pump": (0.98, "1"), + "eta_NBI": (0.50, "1"), + "eta_ECH": (0.50, "1"), + "eta_ICRH": (0.50, "1"), + "NOAK": (0, "1"), + "n_unit": (1, "1"), + "construction_time": (6, "years"), + "lifetime": (30, "years"), + "replacement": (10, "years"), + "availability": (0.90, "1"), + "discount": (0.0245, "1"), + "LSA": (2, "1"), + "include_decommissioning": (0, "1"), + "include_tax": (0, "1"), + "include_licensing": (0, "1"), + "include_contingency": (0, "1"), + "hf_magnet_length": (1, "m"), + "hf_magnet_shielding_thickness": (1, "m"), + "a_EC": (1, "m"), + "expander_cell_vessel_thickness": (0.01, "m"), + "vacuum_gap_CC": (0.01, "m"), + "first_wall_thickness": (0.01, "m"), + "vacuum_vessel_thickness": (0.01, "m"), + "multiplier_thickness": (0.01, "m"), + "blanket_thickness": (1.00, "m"), + "blanket_coolant_fraction": (0.90, "1"), + "blanket_structural_fraction": (0.10, "1"), + "outer_vessel_thickness": (0.01, "m"), + "L_EP": (1, "m"), + "L_EC": (1, "m"), + "a_CC": (1, "m"), + "a_EP": (1, "m"), + "HF_magnet_number": (4, "1"), + "LF_magnet_number": (2, "1"), +} + +MIRROR_GENERATED_VAR_NEEDS = { + "P_f_CC": "P_f, P_f_EP", + "L_CC": "P_f_CC, P_f_L", + "L_CF": "", + "L": "L_CC, L_EP, L_EC", + "V_vac": "L, a_EC", + "P_alpha": "E_DT, E_alpha, P_f", + "P_n": "P_f, P_alpha", + "P_ine": "P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH", + "P_pump": "f_pump, M_n, P_n", + "P_sub_cont": "f_sub, P_f", + "P_cryo": "f_cryo, P_f", + "P_other": "P_pump, P_sub_cont, P_cryo", + "P_in": "P_NBI, P_ICRH, P_ECH", + "P_th": "M_n, P_n, P_pump, eta_pump", + "P_the": "eta_th, P_th", + "P_DEC": "P_in, P_alpha", + "P_DECe": "eta_DEC, P_DEC", + "P_egross": "application, P_DECe, P_the", + "P_enet": "P_egross, P_ine, P_other", + "f_aux": "P_aux, P_egross", + "Q_sci": "P_f, P_in", + "Q_eng": "P_egross, P_ine, P_other", + "f_refrac": "Q_eng", + "CF_magnet_number": "L_CC, L_CF", +} + TYPE_REPLACEMENTS = ( (re.compile(r"varchar\(\d+\)", re.IGNORECASE), "TEXT"), (re.compile(r"\bint\b", re.IGNORECASE), "INTEGER"), @@ -48,15 +164,10 @@ def _sqlite_table_script(mysql_sql: str, table_name: str) -> str: without_commented_create, flags=re.DOTALL, ) - insert = re.search( - rf"INSERT INTO `{table_name}` VALUES .*?;", - without_commented_create, - flags=re.DOTALL, - ) - if create is None or insert is None: - raise ValueError(f"Could not find CREATE/INSERT SQL for {table_name}") + if create is None: + raise ValueError(f"Could not find CREATE SQL for {table_name}") - script = f"DROP TABLE IF EXISTS {table_name};\n{create.group(0)}\n{insert.group(0)}" + script = f"DROP TABLE IF EXISTS {table_name};\n{create.group(0)}" script = re.sub(r"/\*!.*?\*/;?", "", script, flags=re.DOTALL) script = re.sub(r"\) ENGINE=.*?;", ");", script, flags=re.DOTALL) script = script.replace("`", "") @@ -65,6 +176,17 @@ def _sqlite_table_script(mysql_sql: str, table_name: str) -> str: return script +def _mysql_insert_rows(mysql_sql: str, table_name: str) -> list[tuple]: + insert = re.search( + rf"INSERT INTO `{table_name}` VALUES (.*?);", + mysql_sql, + flags=re.DOTALL, + ) + if insert is None: + raise ValueError(f"Could not find INSERT SQL for {table_name}") + return list(ast.literal_eval(f"[{insert.group(1)}]")) + + def _columns(conn: sqlite3.Connection, table_name: str) -> list[str]: return [row[1] for row in conn.execute(f"PRAGMA table_info({table_name})")] @@ -80,6 +202,169 @@ def _write_csv(conn: sqlite3.Connection, table_name: str, path: Path) -> int: return len(rows) +def _mirror_method_name(code_of_account: str) -> str: + if code_of_account in {"OCC", "TCC"}: + return f"Account_{code_of_account}" + if re.fullmatch(r"[0-9.]+", code_of_account): + return "Account_C" + code_of_account.replace(".", "_") + return "" + + +def _mirror_code(code_of_account: str) -> str: + return code_of_account.replace(".", "") if re.fullmatch(r"[0-9.]+", code_of_account) else code_of_account + + +def _mirror_parent_code(code_of_account: str, level: int) -> str: + if level <= 0: + return "" + if "." in code_of_account: + return _mirror_code(code_of_account.rsplit(".", 1)[0]) + if re.fullmatch(r"\d+", code_of_account): + return code_of_account[:-1] + return "" + + +def _account_method_dependencies(algorithm_source: Path) -> dict[str, tuple[list[str], list[str]]]: + module = ast.parse(algorithm_source.read_text(encoding="utf-8")) + klass = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == "MirrorFunc") + dependencies = {} + for node in klass.body: + if not isinstance(node, ast.FunctionDef) or not node.name.startswith("Account_"): + continue + input_keys = set() + account_calls = set() + for child in ast.walk(node): + if ( + isinstance(child, ast.Subscript) + and isinstance(child.value, ast.Name) + and child.value.id == "inputs" + and isinstance(child.slice, ast.Constant) + and isinstance(child.slice.value, str) + ): + input_keys.add(child.slice.value) + if ( + isinstance(child, ast.Call) + and isinstance(child.func, ast.Attribute) + and isinstance(child.func.value, ast.Name) + and child.func.value.id == "MirrorFunc" + and child.func.attr.startswith("Account_") + ): + account_calls.add(child.func.attr) + dependencies[node.name] = (sorted(input_keys), sorted(account_calls)) + return dependencies + + +def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: + dependencies = _account_method_dependencies(algorithm_source) + methods = set(dependencies) + conn.execute("ALTER TABLE mirror_acco RENAME TO mirror_acco_raw") + conn.execute( + "CREATE TABLE mirror_acco (" + + ", ".join(f"{name} {kind}" for name, kind in MIRROR_ACCOUNT_COLUMNS) + + ", PRIMARY KEY (code_of_account))" + ) + rows = conn.execute( + """ + SELECT ind, code_of_account, account_description, total_cost, level, + prn, fun_unit + FROM mirror_acco_raw + ORDER BY ind + """ + ).fetchall() + for ind, raw_code, description, total_cost, level, prn, fun_unit in rows: + code = _mirror_code(raw_code) + alg_name = _mirror_method_name(raw_code) + input_keys, account_calls = dependencies.get(alg_name, ([], [])) + variables = "rollup" if account_calls else ", ".join( + HUMAN_INPUT_TO_VAR[key] for key in input_keys if key in HUMAN_INPUT_TO_VAR + ) + if alg_name not in methods: + alg_name = "" + conn.execute( + """ + INSERT INTO mirror_acco + (ind, code_of_account, account_description, total_cost, level, + supaccount, review_status, prn, alg_name, fun_unit, variables) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + ind, + code, + description, + total_cost, + level, + _mirror_parent_code(raw_code, int(level or 0)), + "Unchanged", + prn, + alg_name, + fun_unit or "million", + variables, + ), + ) + conn.execute("DROP TABLE mirror_acco_raw") + + +def _split_vars(value: str | None) -> list[str]: + if value is None: + return [] + return [part.strip() for part in str(value).split(",") if part.strip() and part.strip() != "TODO"] + + +def _normalize_mirror_variable_table(conn: sqlite3.Connection) -> None: + conn.execute("UPDATE mirror_var SET var_alg = '' WHERE var_alg = 'TODO'") + conn.execute("UPDATE mirror_var SET var_need = '' WHERE var_need = 'TODO'") + conn.execute("UPDATE mirror_var SET v_linked = '' WHERE v_linked = 'TODO'") + conn.execute("UPDATE mirror_var SET var_unit = '1' WHERE var_unit = 'TODO'") + conn.execute("UPDATE mirror_var SET var_unit = 'm' WHERE var_name = 'r_magnet'") + for var_name, (value, unit) in MIRROR_INPUT_DEFAULTS.items(): + if conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): + continue + next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] + conn.execute( + """ + INSERT INTO mirror_var + (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) + VALUES (?, ?, ?, ?, ?, '', '', '', 0) + """, + (next_ind, var_name, "Mirror input parameter", value, unit), + ) + for var_name, var_need in MIRROR_GENERATED_VAR_NEEDS.items(): + if not conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): + next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] + conn.execute( + """ + INSERT INTO mirror_var + (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) + VALUES (?, ?, ?, '', '1', '', ?, '', 0) + """, + (next_ind, var_name, "Mirror generated parameter", var_need), + ) + conn.execute("UPDATE mirror_var SET var_need = ? WHERE var_name = ?", (var_need, var_name)) + + reverse_links: dict[str, list[str]] = {} + for var_name, var_need in conn.execute("SELECT var_name, var_need FROM mirror_var"): + for needed in _split_vars(var_need): + reverse_links.setdefault(needed, []).append(var_name) + conn.execute("UPDATE mirror_var SET v_linked = ''") + for var_name, links in reverse_links.items(): + conn.execute( + "UPDATE mirror_var SET v_linked = ? WHERE var_name = ?", + (", ".join(sorted(set(links))), var_name), + ) + + +def _normalize_mirror_algorithm_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: + dependencies = _account_method_dependencies(algorithm_source) + for alg_name, (input_keys, account_calls) in dependencies.items(): + variables = "rollup" if account_calls else ", ".join( + HUMAN_INPUT_TO_VAR[key] for key in input_keys if key in HUMAN_INPUT_TO_VAR + ) + conn.execute( + "UPDATE mirror_alg SET alg_formulation = ?, alg_units = 'million' WHERE alg_name = ?", + (variables or "reference value", alg_name), + ) + + def load_mirror_tables( db_path: Path, ref_dir: Path, @@ -94,12 +379,15 @@ def load_mirror_tables( try: for table_name in TABLES: conn.executescript(_sqlite_table_script(mysql_sql, table_name)) - conn.execute("ALTER TABLE mirror_acco ADD COLUMN review_status TEXT") - conn.execute("UPDATE mirror_acco SET review_status = 'Unchanged'") - conn.execute( - "UPDATE mirror_var SET var_unit = ? WHERE var_name = ?", - ("m", "r_magnet"), - ) + columns = _columns(conn, table_name) + placeholders = ", ".join("?" for _ in columns) + conn.executemany( + f"INSERT INTO {table_name} VALUES ({placeholders})", + _mysql_insert_rows(mysql_sql, table_name), + ) + _normalize_mirror_account_table(conn, algorithm_source) + _normalize_mirror_variable_table(conn) + _normalize_mirror_algorithm_table(conn, algorithm_source) conn.commit() for table_name, file_name in TABLES.items(): count = _write_csv(conn, table_name, ref_dir / file_name) diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index e07042a..ef37c8a 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -58,3 +58,57 @@ def test_mirror_variable_update_uses_reference_table(cursor): ("r_magnet",), ) assert cursor.fetchone() == (2.0, "m", 1) + + +def test_mirror_accounts_use_fusion_style_structure(cursor): + cursor.execute( + """ + SELECT code_of_account, supaccount, alg_name, variables + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("211",), + ) + assert cursor.fetchone() == ("211", "21", "Account_C21_1", "P_egross") + + +def test_mirror_variable_links_are_reversed_from_var_need(cursor): + cursor.execute( + """ + SELECT var_need, v_linked + FROM mirror_var + WHERE var_name = ?; + """, + ("P_egross",), + ) + assert cursor.fetchone() == ( + "application, P_DECe, P_the", + "P_enet, Q_eng, f_aux", + ) + + +def test_mirror_account_recalculation_uses_accert_variables(cursor): + accert = Accert.__new__(Accert) + accert.acc_tabl = "mirror_acco" + accert.var_tabl = "mirror_var" + accert.alg_tabl = "mirror_alg" + + cursor.execute( + """ + UPDATE mirror_var + SET var_value = ?, user_input = 1 + WHERE var_name = ?; + """, + (1000.0, "P_egross"), + ) + + assert accert.update_new_accounts(cursor) is None + cursor.execute( + """ + SELECT total_cost, review_status + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("211",), + ) + assert cursor.fetchone() == (268000000.0, "User Input") diff --git a/test/test_sqlite.py b/test/test_sqlite.py index 5860d02..c409886 100644 --- a/test/test_sqlite.py +++ b/test/test_sqlite.py @@ -125,15 +125,13 @@ def test_table_columns(cursor): "code_of_account", "account_description", "total_cost", - "total_cost_dollars", "level", - "prn", "supaccount", + "review_status", + "prn", "alg_name", "fun_unit", "variables", - "algno", - "review_status", }, "mirror_alg": { "ind", diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index e438257..b71670b 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -20,6 +20,28 @@ class MirrorFunc(Algorithm): # Conversion factors Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU + ACCERT_TO_TEAM_INPUT = { + "application": "Application", + "include_contingency": "Contingency", + "L": "Overall Length", + "L_CC": "Central Cell Length", + "L_EP": "End Plug Length", + "N_module": "Number of Modules", + "n_unit": "Unit Number", + "P_DECe": "DEC Electrical Power", + "P_ECH": "ECH Power", + "P_egross": "Gross Electric Power", + "P_enet": "Net Electric Power", + "P_ICRH": "ICRH Power", + "P_NBI": "NBI Power", + "P_th": "Thermal Power", + "V_vac": "Vacuum Volume", + "construction_time": "Construction Time", + "HF_magnet_number": "HF Magnet Number", + "LF_magnet_number": "LF Magnet Number", + "NOAK": "NOAK", + } + def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) @@ -33,9 +55,22 @@ def run(self, inputs: dict) -> float: Returns: float: Result of the algorithm computation. """ - # run the algorithm use self.name not self.alg_name + if self.name.startswith("Account_"): + return self._run_account_algorithm(self.name, inputs) return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) + def _run_account_algorithm(self, alg_name: str, variables: dict) -> float: + try: + algorithm = getattr(self, alg_name) + except AttributeError: + raise ValueError(f"Algorithm {alg_name} not found") + team_inputs = { + team_name: variables[var_name] + for var_name, team_name in self.ACCERT_TO_TEAM_INPUT.items() + if var_name in variables + } + return algorithm(team_inputs) + def _run_algorithm(self, alg_name: str, variables: list) -> float: """ Runs the specified algorithm with given variables. diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index f689c51..bcfe948 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -1,92 +1,92 @@ -ind,code_of_account,account_description,total_cost,total_cost_dollars,level,prn,supaccount,alg_name,fun_unit,variables,algno,review_status -1,10,Pre-Construction_Costs,24.18611754,$24186117.540000003,0,0.0046878318104200244,,ac10,million,,,Unchanged -2,11,Land_and_Land_Rights,1.18611754,$1186117.5399999998,1,0.00022989715177366762,1,ac11,million,,,Unchanged -3,12,Site_Permits,10.0,$10000000.0,1,0.0019382324602810245,1,ac12,million,,,Unchanged -4,13,Plant_Licensing,0.0,$0.0,1,0.0,1,ac13,million,,,Unchanged -5,14,Plant_Permits,5.0,$5000000.0,1,0.0009691162301405122,1,ac14,million,,,Unchanged -6,15,Plant_Studies,5.0,$5000000.0,1,0.0009691162301405122,1,ac15,million,,,Unchanged -7,16,Plant_Reports,2.0,$2000000.0,1,0.00038764649205620487,1,ac16,million,,,Unchanged -8,17,Other_Pre-Construction_Costs,1.0,$1000000.0,1,0.00019382324602810244,1,ac17,million,,,Unchanged -9,19,Contingency_on_Pre-Construction_Costs,0.0,$0.0,1,0.0,1,ac19,million,,,Unchanged -10,20,Capitalized_Direct_Costs_(CDC),1298.175963,$1298175963.0,0,0.2516166790643178,,ac20,million,,,Unchanged -11,21,Structures_and_Improvements,112.9457941,$112945794.1,1,0.021891520437683703,2,ac21,million,,,Unchanged -12,21.1,Site_Preparation/Yard_Work,42.37641442,$42376414.42,2,0.008213534197916489,21,ac21.1,million,,,Unchanged -13,21.2,Heat_Island_Building,29.53699334,$29536993.34,2,0.005724955927069243,21,ac21.2,million,,,Unchanged -14,21.3,Turbine_Generator_Building,8.538531265,$8538531.264999999,2,0.0016549658460947396,21,ac21.3,million,,,Unchanged -15,21.4,Heat_Exchanger_Building,5.976971885,$5976971.885,2,0.0011584760921694063,21,ac21.4,million,,,Unchanged -16,21.5,Power_Supply_and_Energy_Storage,1.707706253,$1707706.253,2,0.00033099316921894796,21,ac21.5,million,,,Unchanged -17,21.6,Reactor_Auxiliaries,0.8538531265,$853853.1265,2,0.00016549658460947398,21,ac21.6,million,,,Unchanged -18,21.7,Hot_Cell,14.76849667,$14768496.67,2,0.0028624779635346214,21,ac21.7,million,,,Unchanged -19,21.8,Reactor_Services,2.956861753,$2956861.753,2,0.0005731085430228053,21,ac21.8,million,,,Unchanged -20,21.9,Service_Water,0.0474362848,$47436.2848,2,9.194254699449537e-06,21,ac21.9,million,,,Unchanged -21,21.10,Fuel_Storage,0.1739330443,$173933.0443,2,3.3712267237775744e-05,,ac21.10,million,,,Unchanged -22,21.11,Control_Room,0.1423088544,$142308.85439999998,2,2.7582764098348607e-05,211,ac21.11,million,,,Unchanged -23,21.12,Onsite_AC_Power,0.1264967595,$126496.7595,2,2.4518012538326203e-05,211,ac21.12,million,,,Unchanged -24,21.13,Administration,0.6957321771,$695732.1771,2,0.00013484906893172064,211,ac21.13,million,,,Unchanged -25,21.14,Site_Services,0.252993519,$252993.519,2,4.903602507665241e-05,211,ac21.14,million,,,Unchanged -26,21.15,Cryogenics,0.3794902784,$379490.2784,2,7.35540375955963e-05,211,ac21.15,million,,,Unchanged -27,21.16,Security,0.1423088544,$142308.85439999998,2,2.7582764098348607e-05,211,ac21.16,million,,,Unchanged -28,21.17,Ventilation_Stack,4.269265632,$4269265.632,2,0.0008274829229504582,211,ac21.17,million,,,Unchanged -29,22,Heat_Island_Plant_Equipment,1111.99892,$1111998920.0,1,0.21553124025414422,2,ac22,million,,,Unchanged -30,22.1,Heat_Island_Components,901.9675668,$901967566.8,2,0.17482228160924532,22,ac22.1,million,,,Unchanged -31,22.1.1,First_Wall_and_Blanket,43.19343421,$43193434.21,3,0.008371891625683487,221,ac22.1.1,million,,,Unchanged -32,22.1.2,Magnet_Radiation_Shield,94.73695574,$94736955.74,3,0.01836222428034747,221,ac22.1.2,million,,,Unchanged -33,22.1.3,Coils,272.0399768,$272039976.79999995,3,0.05272767135278568,221,ac22.1.3,million,,,Unchanged -34,22.1.3.1,HF_Coils,116.4,$116400000.0,4,0.022561025837671125,2213,ac22.1.3.1,million,,,Unchanged -35,22.1.3.2,LF_Coils,12.50524,$12505240.0,4,0.0024238062091604677,2213,ac22.1.3.2,million,,,Unchanged -36,22.1.3.3,CC_Coils,143.1347368,$143134736.8,4,0.02774283930595409,2213,ac22.1.3.3,million,,,Unchanged -37,22.1.4,Supplemental_Heating,227.453,$227453000.0,3,0.04408567877882998,221,ac22.1.4,million,,,Unchanged -38,22.1.4.1,NBI,105.963,$105963000.0,4,0.02053809261887582,2214,ac22.1.4.1,million,,,Unchanged -39,22.1.4.2,ICRH,41.49,$41490000.0,4,0.008041726477705971,2214,ac22.1.4.2,million,,,Unchanged -40,22.1.4.3,ECH,80.0,$80000000.0,4,0.015505859682248196,2214,ac22.1.4.3,million,,,Unchanged -41,22.1.5,Primary_Structure_and_Support,0.0,$0.0,3,0.0,221,ac22.1.5,million,,,Unchanged -42,22.1.6,Vacuum_System,2.031827257,$2031827.2570000002,3,0.00039381535432011556,221,ac22.1.6,million,,,Unchanged -43,22.1.6.2,Vessel_Refrigerators,0.0,$0.0,4,0.0,2216,ac22.1.6.2,million,,,Unchanged -44,22.1.6.3,Primary_Vacuum_Pumps,1.689827257,$1689827.257,4,0.0003275278041785045,2216,ac22.1.6.3,million,,,Unchanged -45,22.1.6.4,Backing_Vacuum_Pumps,0.342,$342000.0,4,6.628755014161104e-05,2216,ac22.1.6.4,million,,,Unchanged -46,22.1.7,Power_Supplies,0.0,$0.0,3,0.0,221,ac22.1.7,million,,,Unchanged -47,22.1.8,Divertor,0.0,$0.0,3,0.0,221,ac22.1.8,million,,,Unchanged -48,22.1.9,Direct_Energy_Convertor,109.3171648,$109317164.8,3,0.02118820772812502,221,ac22.1.9,million,,,Unchanged -49,22.1.11,Assembly_and_Installation_Costs,153.1952079,$153195207.9,3,0.029692792471128007,2211,ac22.1.11,million,,,Unchanged -50,22.2,Main_and_Secondary_Coolant,33.6494515,$33649451.5,2,0.0065220459167952,22,ac22.2,million,,,Unchanged -51,22.3,Auxiliary_Cooling_Systems,0.3521982635,$352198.2635,2,6.826421067703095e-05,22,ac22.3,million,,,Unchanged -52,22.4,Radioactive_Waste_Treatment,0.6275532695,$627553.2695,2,0.00012163441175003857,22,ac22.4,million,,,Unchanged -53,22.5,Fuel_Handling_and_Storage,88.65405229,$88654052.28999999,2,0.017183216188392927,22,ac22.5,million,,,Unchanged -54,22.6,Other_Heat_Island_Equipment,1.748097852,$1748097.852,2,0.0003388220000493934,22,ac22.6,million,,,Unchanged -55,22.7,Instrumentation_and_Control,85.0,$85000000.0,2,0.01647497591238871,22,ac22.7,million,,,Unchanged -56,23,Turbine_Plant_Equipment,39.82276109,$39822761.09,1,0.007718576820265415,2,ac23,million,,,Unchanged -57,24,Electric_Plant_Equipment,9.819310954,$9819310.954,1,0.0019032107228635835,2,ac24,million,,,Unchanged -58,25,Miscellaneous_Plant_Equipment,6.909885486,$6909885.4860000005,1,0.0013392964345789922,2,ac25,million,,,Unchanged -59,26,Heat_Rejection,11.67929132,$11679291.32,1,0.0022637181549502415,2,ac26,million,,,Unchanged -60,27,Special_Materials,0.0,$0.0,1,0.0,2,ac27,million,,,Unchanged -61,28,Digital_Twin/Simulator,5.0,$5000000.0,1,0.0009691162301405122,2,ac28,million,,,Unchanged -62,29,Contingency_on_Direct_Capital_Costs,0.0,$0.0,1,0.0,2,ac29,million,,,Unchanged -63,30,Capitalized_Indirect_Service_Costs_(CISC),71.59197058,$71591970.58,0,0.013876188127364011,,ac30,million,,,Unchanged -64,31,Field_Indirect_Costs,14.31839412,$14318394.120000001,1,0.0027752376262480953,3,ac31,million,,,Unchanged -65,32,Construction_Supervision,35.79598529,$35795985.29,1,0.0069380940636820055,3,ac32,million,,,Unchanged -66,33,Commissioning_and_Start-Up_Costs,0.0,$0.0,1,0.0,3,ac33,million,,,Unchanged -67,34,Demonstration_Test_Run,0.0,$0.0,1,0.0,3,ac34,million,,,Unchanged -68,35,Design_Services_Offsite,21.47759117,$21477591.17,1,0.004162856437433911,3,ac35,million,,,Unchanged -69,36,PM/CM_Services_Offsite,0.0,$0.0,1,0.0,3,ac36,million,,,Unchanged -70,37,Design_Servies_Offsite,0.0,$0.0,1,0.0,3,ac37,million,,,Unchanged -71,38,PM/CM_Services_Onsite,0.0,$0.0,1,0.0,3,ac38,million,,,Unchanged -72,39,Contingency_on_Support_Services,0.0,$0.0,1,0.0,3,ac39,million,,,Unchanged -73,40,Capitalized_Owner's_Cost_(COC),155.7811156,$155781115.6,0,0.030194001495471065,,ac40,million,,,Unchanged -74,50,Capitalized_Supplementary_Costs_(CSC),37.83719261,$37837192.61,0,0.00733372749226073,,ac50,million,,,Unchanged -75,51,Shipping_and_Transportation_Costs,8.0,$8000000.0,1,0.0015505859682248195,5,ac51,million,,,Unchanged -76,52,Spare_Parts,7.323124886,$7323124.886,1,0.0014193918364736975,5,ac52,million,,,Unchanged -77,53,Taxes,0.0,$0.0,1,0.0,5,ac53,million,,,Unchanged -78,54,Insurance,1.0,$1000000.0,1,0.00019382324602810244,5,ac54,million,,,Unchanged -79,55,Initial_Fuel_Load,21.51406772,$21514067.72,1,0.004169926440758817,5,ac55,million,,,Unchanged -80,58,Decommissioning_Costs,0.0,$0.0,1,0.0,5,ac58,million,,,Unchanged -81,59,Contingency_on_Supplementary_Costs,0.0,$0.0,1,0.0,5,ac59,million,,,Unchanged -82,60,Capitalized_Financial_Costs_(CFC),195.4094412,$195409441.20000002,0,0.03787489219792162,,ac60,million,,,Unchanged -83,61,Escalation,20.125,$20125000.0,1,0.003900692826315562,6,ac61,million,,,Unchanged -84,62,Fees,0.0,$0.0,1,0.0,6,ac62,million,,,Unchanged -85,63,Interest_During_Construction_(IDC),175.2844412,$175284441.20000002,1,0.033974199371606055,6,ac63,million,,,Unchanged -86,69,Contingency_on_Capitalized_Financial_Costs,0.0,$0.0,1,0.0,6,ac69,million,,,Unchanged -87,OCC,Overnight_Capital_Cost_(OCC),1587.572359,$1587572359.0,0,0.307708427925872,OC,acOCC,million,,,Unchanged -88,TCC,Total_Capital_Cost_(TCC),1782.981801,$1782981801.0,0,0.3455833202788522,TC,acTCC,million,,,Unchanged -89,O&M,Operations_and_Maintenance,5.69490028,$5694900.279999999,0,0.0011038040580759493,O&,acO&M,million,,,Unchanged -90,Fuel,Fuel,0.1090042081,$109004.2081,0,2.1127549444664777e-05,Fue,acFuel,million,,,Unchanged -91,81,Deuterium,0.04739117657,$47391.176569999996,1,9.185511675888353e-06,8,ac81,million,,,Unchanged +ind,code_of_account,account_description,total_cost,level,supaccount,review_status,prn,alg_name,fun_unit,variables +1,10,Pre-Construction_Costs,24.18611754,0,,Unchanged,0.0046878318104200244,,million, +2,11,Land_and_Land_Rights,1.18611754,1,1,Unchanged,0.00022989715177366762,,million, +3,12,Site_Permits,10.0,1,1,Unchanged,0.0019382324602810245,,million, +4,13,Plant_Licensing,0.0,1,1,Unchanged,0.0,,million, +5,14,Plant_Permits,5.0,1,1,Unchanged,0.0009691162301405122,,million, +6,15,Plant_Studies,5.0,1,1,Unchanged,0.0009691162301405122,,million, +7,16,Plant_Reports,2.0,1,1,Unchanged,0.00038764649205620487,,million, +8,17,Other_Pre-Construction_Costs,1.0,1,1,Unchanged,0.00019382324602810244,,million, +9,19,Contingency_on_Pre-Construction_Costs,0.0,1,1,Unchanged,0.0,,million, +10,20,Capitalized_Direct_Costs_(CDC),1298.175963,0,,Unchanged,0.2516166790643178,Account_C20,million,rollup +11,21,Structures_and_Improvements,112.9457941,1,2,Unchanged,0.021891520437683703,Account_C21,million,rollup +12,211,Site_Preparation/Yard_Work,42.37641442,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross +13,212,Heat_Island_Building,29.53699334,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross +14,213,Turbine_Generator_Building,8.538531265,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" +15,214,Heat_Exchanger_Building,5.976971885,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross +16,215,Power_Supply_and_Energy_Storage,1.707706253,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross +17,216,Reactor_Auxiliaries,0.8538531265,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross +18,217,Hot_Cell,14.76849667,2,21,Unchanged,0.0028624779635346214,Account_C21_7,million,P_egross +19,218,Reactor_Services,2.956861753,2,21,Unchanged,0.0005731085430228053,Account_C21_8,million,P_egross +20,219,Service_Water,0.0474362848,2,21,Unchanged,9.194254699449537e-06,Account_C21_9,million,P_egross +21,2110,Fuel_Storage,0.1739330443,2,21,Unchanged,3.3712267237775744e-05,Account_C21_10,million,P_egross +22,2111,Control_Room,0.1423088544,2,21,Unchanged,2.7582764098348607e-05,Account_C21_11,million,P_egross +23,2112,Onsite_AC_Power,0.1264967595,2,21,Unchanged,2.4518012538326203e-05,Account_C21_12,million,P_egross +24,2113,Administration,0.6957321771,2,21,Unchanged,0.00013484906893172064,Account_C21_13,million,P_egross +25,2114,Site_Services,0.252993519,2,21,Unchanged,4.903602507665241e-05,Account_C21_14,million,P_egross +26,2115,Cryogenics,0.3794902784,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross +27,2116,Security,0.1423088544,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross +28,2117,Ventilation_Stack,4.269265632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross +29,22,Heat_Island_Plant_Equipment,1111.99892,1,2,Unchanged,0.21553124025414422,Account_C22,million,rollup +30,221,Heat_Island_Components,901.9675668,2,22,Unchanged,0.17482228160924532,Account_C22_1,million,rollup +31,2211,First_Wall_and_Blanket,43.19343421,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" +32,2212,Magnet_Radiation_Shield,94.73695574,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million, +33,2213,Coils,272.0399768,3,221,Unchanged,0.05272767135278568,Account_C22_1_3,million,rollup +34,22131,HF_Coils,116.4,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,HF_magnet_number +35,22132,LF_Coils,12.50524,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,LF_magnet_number +36,22133,CC_Coils,143.1347368,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million, +37,2214,Supplemental_Heating,227.453,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup +38,22141,NBI,105.963,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, n_unit" +39,22142,ICRH,41.49,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, n_unit" +40,22143,ECH,80.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, n_unit" +41,2215,Primary_Structure_and_Support,0.0,3,221,Unchanged,0.0,Account_C22_1_5,million, +42,2216,Vacuum_System,2.031827257,3,221,Unchanged,0.00039381535432011556,Account_C22_1_6,million,rollup +43,22162,Vessel_Refrigerators,0.0,4,2216,Unchanged,0.0,Account_C22_1_6_2,million, +44,22163,Primary_Vacuum_Pumps,1.689827257,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,V_vac +45,22164,Backing_Vacuum_Pumps,0.342,4,2216,Unchanged,6.628755014161104e-05,Account_C22_1_6_4,million, +46,2217,Power_Supplies,0.0,3,221,Unchanged,0.0,Account_C22_1_7,million, +47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, +48,2219,Direct_Energy_Convertor,109.3171648,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, n_unit" +49,22111,Assembly_and_Installation_Costs,153.1952079,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"construction_time, N_module, L, n_unit" +50,222,Main_and_Secondary_Coolant,33.6494515,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,rollup +51,223,Auxiliary_Cooling_Systems,0.3521982635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" +52,224,Radioactive_Waste_Treatment,0.6275532695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th +53,225,Fuel_Handling_and_Storage,88.65405229,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,n_unit +54,226,Other_Heat_Island_Equipment,1.748097852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet +55,227,Instrumentation_and_Control,85.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, +56,23,Turbine_Plant_Equipment,39.82276109,1,2,Unchanged,0.007718576820265415,Account_C23,million,"P_egross, N_module" +57,24,Electric_Plant_Equipment,9.819310954,1,2,Unchanged,0.0019032107228635835,Account_C24,million,"P_egross, N_module" +58,25,Miscellaneous_Plant_Equipment,6.909885486,1,2,Unchanged,0.0013392964345789922,Account_C25,million,"P_egross, N_module" +59,26,Heat_Rejection,11.67929132,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"P_enet, N_module" +60,27,Special_Materials,0.0,1,2,Unchanged,0.0,Account_C27,million, +61,28,Digital_Twin/Simulator,5.0,1,2,Unchanged,0.0009691162301405122,Account_C28,million, +62,29,Contingency_on_Direct_Capital_Costs,0.0,1,2,Unchanged,0.0,Account_C29,million,rollup +63,30,Capitalized_Indirect_Service_Costs_(CISC),71.59197058,0,,Unchanged,0.013876188127364011,,million, +64,31,Field_Indirect_Costs,14.31839412,1,3,Unchanged,0.0027752376262480953,,million, +65,32,Construction_Supervision,35.79598529,1,3,Unchanged,0.0069380940636820055,,million, +66,33,Commissioning_and_Start-Up_Costs,0.0,1,3,Unchanged,0.0,,million, +67,34,Demonstration_Test_Run,0.0,1,3,Unchanged,0.0,,million, +68,35,Design_Services_Offsite,21.47759117,1,3,Unchanged,0.004162856437433911,,million, +69,36,PM/CM_Services_Offsite,0.0,1,3,Unchanged,0.0,,million, +70,37,Design_Servies_Offsite,0.0,1,3,Unchanged,0.0,,million, +71,38,PM/CM_Services_Onsite,0.0,1,3,Unchanged,0.0,,million, +72,39,Contingency_on_Support_Services,0.0,1,3,Unchanged,0.0,,million, +73,40,Capitalized_Owner's_Cost_(COC),155.7811156,0,,Unchanged,0.030194001495471065,,million, +74,50,Capitalized_Supplementary_Costs_(CSC),37.83719261,0,,Unchanged,0.00733372749226073,,million, +75,51,Shipping_and_Transportation_Costs,8.0,1,5,Unchanged,0.0015505859682248195,,million, +76,52,Spare_Parts,7.323124886,1,5,Unchanged,0.0014193918364736975,,million, +77,53,Taxes,0.0,1,5,Unchanged,0.0,,million, +78,54,Insurance,1.0,1,5,Unchanged,0.00019382324602810244,,million, +79,55,Initial_Fuel_Load,21.51406772,1,5,Unchanged,0.004169926440758817,,million, +80,58,Decommissioning_Costs,0.0,1,5,Unchanged,0.0,,million, +81,59,Contingency_on_Supplementary_Costs,0.0,1,5,Unchanged,0.0,,million, +82,60,Capitalized_Financial_Costs_(CFC),195.4094412,0,,Unchanged,0.03787489219792162,,million, +83,61,Escalation,20.125,1,6,Unchanged,0.003900692826315562,,million, +84,62,Fees,0.0,1,6,Unchanged,0.0,,million, +85,63,Interest_During_Construction_(IDC),175.2844412,1,6,Unchanged,0.033974199371606055,,million, +86,69,Contingency_on_Capitalized_Financial_Costs,0.0,1,6,Unchanged,0.0,,million, +87,OCC,Overnight_Capital_Cost_(OCC),1587.572359,0,,Unchanged,0.307708427925872,,million, +88,TCC,Total_Capital_Cost_(TCC),1782.981801,0,,Unchanged,0.3455833202788522,,million, +89,O&M,Operations_and_Maintenance,5.69490028,0,,Unchanged,0.0011038040580759493,,million, +90,Fuel,Fuel,0.1090042081,0,,Unchanged,2.1127549444664777e-05,,million, +91,81,Deuterium,0.04739117657,1,8,Unchanged,9.185511675888353e-06,,million, diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index 0a79908..d5c1647 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -3,62 +3,62 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 2,add_account,v,Add an account to the cost_account object.,MirrorFunc,TODO,TODO 3,generate_report,v,Generate a report based on user input.,MirrorFunc,TODO,TODO 4,learning_credit,v,None,MirrorFunc,TODO,TODO -5,Account_C20,c,Account C20 Rollup,MirrorFunc,TODO,million -6,Account_C21,c,Account C21 Rollup,MirrorFunc,TODO,million -7,Account_C21_1,c,Account C211 Rollup,MirrorFunc,TODO,million -8,Account_C21_2,c,Account C212 Rollup,MirrorFunc,TODO,million -9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,TODO,million -10,Account_C21_4,c,Account C214 Rollup,MirrorFunc,TODO,million -11,Account_C21_5,c,Account C215 Rollup,MirrorFunc,TODO,million -12,Account_C21_6,c,Account C216 Rollup,MirrorFunc,TODO,million -13,Account_C21_7,c,Account C217 Rollup,MirrorFunc,TODO,million -14,Account_C21_8,c,Account C218 Rollup,MirrorFunc,TODO,million -15,Account_C21_9,c,Account C219 Rollup,MirrorFunc,TODO,million -16,Account_C21_10,c,Account C2110 Rollup,MirrorFunc,TODO,million -17,Account_C21_11,c,Account C2111 Rollup,MirrorFunc,TODO,million -18,Account_C21_12,c,Account C2112 Rollup,MirrorFunc,TODO,million -19,Account_C21_13,c,Account C2113 Rollup,MirrorFunc,TODO,million -20,Account_C21_14,c,Account C2114 Rollup,MirrorFunc,TODO,million -21,Account_C21_15,c,Account C2115 Rollup,MirrorFunc,TODO,million -22,Account_C21_16,c,Account C2116 Rollup,MirrorFunc,TODO,million -23,Account_C21_17,c,Account C2117 Rollup,MirrorFunc,TODO,million -24,Account_C22,c,Account C22 Rollup,MirrorFunc,TODO,million -25,Account_C22_1,c,Account C221 Rollup,MirrorFunc,TODO,million -26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,TODO,million -27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,TODO,million -28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,TODO,million -29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,TODO,million -30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,TODO,million -31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,TODO,million -32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,TODO,million -33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,TODO,million -34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,TODO,million -35,Account_C22_1_4_3,c,Account C22143 Rollup,MirrorFunc,TODO,million -36,Account_C22_1_5,c,Account C2215 Rollup,MirrorFunc,TODO,million -37,Account_C22_1_6,c,Account C2216 Rollup,MirrorFunc,TODO,million -38,Account_C22_1_6_2,c,Account C22162 Rollup,MirrorFunc,TODO,million -39,Account_C22_1_6_3,c,Account C22163 Rollup,MirrorFunc,TODO,million -40,Account_C22_1_6_4,c,Account C22164 Rollup,MirrorFunc,TODO,million -41,Account_C22_1_7,c,Account C2217 Rollup,MirrorFunc,TODO,million -42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,TODO,million -43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,TODO,million -44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,TODO,million -45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,TODO,million -46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,TODO,million -47,Account_C22_2_2,c,Account C2222 Rollup,MirrorFunc,TODO,million -48,Account_C22_2_3,c,Account C2223 Rollup,MirrorFunc,TODO,million -49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,TODO,million -50,Account_C22_4,c,Account C224 Rollup,MirrorFunc,TODO,million -51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,TODO,million -52,Account_C22_6,c,Account C226 Rollup,MirrorFunc,TODO,million -53,Account_C22_7,c,Account C227 Rollup,MirrorFunc,TODO,million -54,Account_C23,c,Account C23 Rollup,MirrorFunc,TODO,million -55,Account_C24,c,Account C24 Rollup,MirrorFunc,TODO,million -56,Account_C25,c,Account C25 Rollup,MirrorFunc,TODO,million -57,Account_C26,c,Account C26 Rollup,MirrorFunc,TODO,million -58,Account_C27,c,Account C27 Rollup,MirrorFunc,TODO,million -59,Account_C28,c,Account C28 Rollup,MirrorFunc,TODO,million -60,Account_C29,c,Account C29 Rollup,MirrorFunc,TODO,million +5,Account_C20,c,Account C20 Rollup,MirrorFunc,rollup,million +6,Account_C21,c,Account C21 Rollup,MirrorFunc,rollup,million +7,Account_C21_1,c,Account C211 Rollup,MirrorFunc,P_egross,million +8,Account_C21_2,c,Account C212 Rollup,MirrorFunc,P_egross,million +9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,"application, P_egross",million +10,Account_C21_4,c,Account C214 Rollup,MirrorFunc,P_egross,million +11,Account_C21_5,c,Account C215 Rollup,MirrorFunc,P_egross,million +12,Account_C21_6,c,Account C216 Rollup,MirrorFunc,P_egross,million +13,Account_C21_7,c,Account C217 Rollup,MirrorFunc,P_egross,million +14,Account_C21_8,c,Account C218 Rollup,MirrorFunc,P_egross,million +15,Account_C21_9,c,Account C219 Rollup,MirrorFunc,P_egross,million +16,Account_C21_10,c,Account C2110 Rollup,MirrorFunc,P_egross,million +17,Account_C21_11,c,Account C2111 Rollup,MirrorFunc,P_egross,million +18,Account_C21_12,c,Account C2112 Rollup,MirrorFunc,P_egross,million +19,Account_C21_13,c,Account C2113 Rollup,MirrorFunc,P_egross,million +20,Account_C21_14,c,Account C2114 Rollup,MirrorFunc,P_egross,million +21,Account_C21_15,c,Account C2115 Rollup,MirrorFunc,P_egross,million +22,Account_C21_16,c,Account C2116 Rollup,MirrorFunc,P_egross,million +23,Account_C21_17,c,Account C2117 Rollup,MirrorFunc,P_egross,million +24,Account_C22,c,Account C22 Rollup,MirrorFunc,rollup,million +25,Account_C22_1,c,Account C221 Rollup,MirrorFunc,rollup,million +26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"L_CC, L_EP",million +27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,reference value,million +28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,rollup,million +29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,HF_magnet_number,million +30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,LF_magnet_number,million +31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,reference value,million +32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,rollup,million +33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,"P_NBI, n_unit",million +34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,"P_ICRH, n_unit",million +35,Account_C22_1_4_3,c,Account C22143 Rollup,MirrorFunc,"P_ECH, n_unit",million +36,Account_C22_1_5,c,Account C2215 Rollup,MirrorFunc,reference value,million +37,Account_C22_1_6,c,Account C2216 Rollup,MirrorFunc,rollup,million +38,Account_C22_1_6_2,c,Account C22162 Rollup,MirrorFunc,reference value,million +39,Account_C22_1_6_3,c,Account C22163 Rollup,MirrorFunc,V_vac,million +40,Account_C22_1_6_4,c,Account C22164 Rollup,MirrorFunc,reference value,million +41,Account_C22_1_7,c,Account C2217 Rollup,MirrorFunc,reference value,million +42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,reference value,million +43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,"P_DECe, n_unit",million +44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"construction_time, N_module, L, n_unit",million +45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,rollup,million +46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,"P_egross, N_module",million +47,Account_C22_2_2,c,Account C2222 Rollup,MirrorFunc,P_th,million +48,Account_C22_2_3,c,Account C2223 Rollup,MirrorFunc,reference value,million +49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,"N_module, P_th",million +50,Account_C22_4,c,Account C224 Rollup,MirrorFunc,P_th,million +51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,n_unit,million +52,Account_C22_6,c,Account C226 Rollup,MirrorFunc,P_enet,million +53,Account_C22_7,c,Account C227 Rollup,MirrorFunc,reference value,million +54,Account_C23,c,Account C23 Rollup,MirrorFunc,"P_egross, N_module",million +55,Account_C24,c,Account C24 Rollup,MirrorFunc,"P_egross, N_module",million +56,Account_C25,c,Account C25 Rollup,MirrorFunc,"P_egross, N_module",million +57,Account_C26,c,Account C26 Rollup,MirrorFunc,"P_enet, N_module",million +58,Account_C27,c,Account C27 Rollup,MirrorFunc,reference value,million +59,Account_C28,c,Account C28 Rollup,MirrorFunc,reference value,million +60,Account_C29,c,Account C29 Rollup,MirrorFunc,rollup,million 61,Account_OCC,c,Account OCC Rollup,MirrorFunc,TODO,million 62,Account_TCC,c,Account TCC Rollup,MirrorFunc,TODO,million 63,Account_C90,c,Account C90 Rollup,MirrorFunc,TODO,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index b81c4c2..0464766 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -1,136 +1,185 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_input -1,E_DT,str,,TODO,,TODO,TODO, -2,E_alpha,str,,TODO,,TODO,TODO, -3,E_n,str,,TODO,"E_DT, E_alpha",TODO,TODO, -4,m_T,str,,TODO,,TODO,TODO, -5,m_D,str,,TODO,,TODO,TODO, -6,m_6Li,str,,TODO,,TODO,TODO, -7,Wh_to_BTU,float,3.41214,TODO,,TODO,TODO, -8,indentation,INTEGER,0.0,TODO,,TODO,TODO, -9,indented_name,str,,TODO,"account_name, account_number, indentation",TODO,TODO, -10,inputs,str,,TODO,"NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness",TODO,TODO, -11,cost_data,str,,TODO,cost_account,TODO,TODO, -12,L_magnet_to_magnet,str,,TODO,inputs,TODO,TODO, -13,L_cylinder,str,,TODO,L_magnet_to_magnet,TODO,TODO, -14,expander_cell_cost_result,str,,TODO,"expander_cell_cost, inputs",TODO,TODO, -15,end_plug_cylindrical_part,str,,TODO,"L_cylinder, central_cell, inputs",TODO,TODO, -16,end_plug_cylindrical_part_cost,str,,TODO,end_plug_cylindrical_part,TODO,TODO, -17,central_cell_cylindrical_part,str,,TODO,"central_cell, inputs",TODO,TODO, -18,central_cell_cylindrical_part_cost,str,,TODO,central_cell_cylindrical_part,TODO,TODO, -19,total_cost,str,,TODO,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",TODO,TODO, -20,cost_factor,str,,TODO,"inputs, np",TODO,TODO, -21,cost_pump,INTEGER,40000.0,TODO,,TODO,TODO, -22,vpump_cap,str,,TODO,,TODO,TODO, -23,no_vpumps,str,,TODO,"inputs, vpump_cap",TODO,TODO, -24,axis_t,str,,TODO,"inputs, np",TODO,TODO, -25,axis_ir,str,,TODO,axis_t,TODO,TODO, -26,lr,str,,TODO,,TODO,TODO, -27,constructionworker,str,,TODO,axis_ir,TODO,TODO, -28,C_22_1_11_in,str,,TODO,"inputs, lr",TODO,TODO, -29,C_22_1_11_1_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -30,C_22_1_11_2_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -31,C_22_1_11_3_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -32,C_22_1_11_4_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -33,C_22_1_11_5_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -34,C_22_1_11_6_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -35,C_22_1_11_7_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -36,C_22_1_11_8_in,INTEGER,0.0,TODO,,TODO,TODO, -37,C_22_1_11_9_in,str,,TODO,"constructionworker, inputs, lr",TODO,TODO, -38,C_22_1_11_10_in,INTEGER,0.0,TODO,,TODO,TODO, -39,C220111,str,,TODO,"C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in",TODO,TODO, -40,inflation,float,1.43,TODO,,TODO,TODO, -41,C2205010ITER,str,,TODO,inflation,TODO,TODO, -42,C2205020ITER,str,,TODO,inflation,TODO,TODO, -43,C2205030ITER,str,,TODO,inflation,TODO,TODO, -44,C2205040ITER,str,,TODO,inflation,TODO,TODO, -45,C2205050ITER,str,,TODO,inflation,TODO,TODO, -46,C2205060ITER,str,,TODO,inflation,TODO,TODO, -47,lcredit,float,0.8,TODO,,TODO,TODO, -48,ltoak,str,,TODO,"lcredit, np",TODO,TODO, -49,C220501,str,,TODO,"C2205010ITER, ltoak",TODO,TODO, -50,C220502,str,,TODO,"C2205020ITER, ltoak",TODO,TODO, -51,C220503,str,,TODO,"C2205030ITER, ltoak",TODO,TODO, -52,C220504,str,,TODO,"C2205040ITER, ltoak",TODO,TODO, -53,C220505,str,,TODO,"C2205050ITER, ltoak",TODO,TODO, -54,C220506,str,,TODO,"C2205060ITER, ltoak",TODO,TODO, -55,C220500,str,,TODO,"C220501, C220502, C220503, C220504, C220505, C220506",TODO,TODO, -56,f_cr,float,0.09,TODO,,TODO,TODO, -57,f_6Li_natural,float,0.075,TODO,,TODO,TODO, -58,rho_6Li,float,460.0,TODO,,TODO,TODO, -59,rho_7Li,float,537.0,TODO,,TODO,TODO, -60,T_K,str,,TODO,T,TODO,TODO, -61,rho_PbLi,str,,TODO,T_K,TODO,TODO, -62,P_6Li075,float,15.152,TODO,,TODO,TODO, -63,P_6Li90,INTEGER,70.0,TODO,,TODO,TODO, -64,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",TODO,,TODO,TODO, -65,Cf,list,"(1, 2, 4, 8, 16)",TODO,,TODO,TODO, -66,f_interp,str,,TODO,"Cf, f, scipy",TODO,TODO, -67,f_Li,float,0.17,TODO,,TODO,TODO, -68,f_Pb,str,,TODO,f_Li,TODO,TODO, -69,P_Li,str,,TODO,"Li_price, f_6Li",TODO,TODO, -70,P_PbLi,str,,TODO,"P_Li, P_Pb, f_Li, f_Pb",TODO,TODO, -71,P_f_CC,str,,TODO,"P_f, P_f_EP",TODO,TODO, -72,L_CC,str,,TODO,"P_f_CC, P_f_L",TODO,TODO, -73,L_CF,float,1.0,TODO,,TODO,TODO, -74,L,str,,TODO,"L_CC, L_EC, L_EP",TODO,TODO, -75,V_vac,str,,TODO,"L, a_EC, np",TODO,TODO, -76,P_alpha,str,,TODO,"E_DT, E_alpha, P_f",TODO,TODO, -77,P_n,str,,TODO,"P_alpha, P_f",TODO,TODO, -78,P_ine,str,,TODO,"P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI",TODO,TODO, -79,P_pump,str,,TODO,"M_n, P_n, f_pump",TODO,TODO, -80,P_sub_cont,str,,TODO,"P_f, f_sub",TODO,TODO, -81,P_cryo,str,,TODO,"P_f, f_cryo",TODO,TODO, -82,P_other,str,,TODO,"P_cryo, P_pump, P_sub_cont",TODO,TODO, -83,P_in,str,,TODO,"P_ECH, P_ICRH, P_NBI",TODO,TODO, -84,P_th,str,,TODO,"M_n, P_n, P_pump, eta_pump",TODO,TODO, -85,P_the,str,,TODO,"P_th, eta_th",TODO,TODO, -86,P_DEC,str,,TODO,"P_alpha, P_in",TODO,TODO, -87,P_DECe,str,,TODO,"P_DEC, eta_DEC",TODO,TODO, -88,P_egross,str,,TODO,"P_DECe, P_the",TODO,TODO, -89,P_enet,str,,TODO,"P_egross, P_ine, P_other",TODO,TODO, -90,f_aux,str,,TODO,"P_aux, P_egross",TODO,TODO, -91,Q_sci,str,,TODO,"P_f, P_in",TODO,TODO, -92,Q_eng,str,,TODO,"P_egross, P_ine, P_other",TODO,TODO, -93,f_refrac,str,,TODO,Q_eng,TODO,TODO, -94,run_name,str,,TODO,"P_f, float",TODO,TODO, -95,cost_file_full,str,,TODO,"cost_file, pkg_resources",TODO,TODO, -96,new_data,str,,TODO,"f_vol, material, name, pd, thickness",TODO,TODO, -97,r_in,str,,TODO,data,TODO,TODO, -98,r_out,str,,TODO,data,TODO,TODO, -99,radial_build,str,,TODO,"create_radial_build, inputs",TODO,TODO, -100,filename,str,,TODO,inputs,TODO,TODO, -101,T,INTEGER,300.0,TODO,,TODO,TODO, -102,material,str,,TODO,"i, radial_build",TODO,TODO, -103,f_6Li,float,0.075,TODO,,TODO,TODO, -104,radius,str,,TODO,inputs,TODO,TODO, -105,thickness,str,,TODO,inputs,TODO,TODO, -106,vv_material,str,,TODO,inputs,TODO,TODO, -107,V_end_cap,str,,TODO,"np, radius, thickness",TODO,TODO, -108,M_end_cap,str,,TODO,"V_end_cap, cost_data, vv_material",TODO,TODO, -109,C_end_cap,str,,TODO,"M_end_cap, cost_data, vv_material",TODO,TODO, -110,total,str,,TODO,"C_end_cap, radial_build",TODO,TODO, -111,cost,float,29.1,TODO,,TODO,TODO, -112,a_M,float,0.15,TODO,,TODO,TODO, -113,a_CC,float,0.54,TODO,,TODO,TODO, -114,a_0,float,0.7,TODO,,TODO,TODO, -115,length,float,0.5,TODO,,TODO,TODO, -116,r_gap,float,0.1,TODO,,TODO,TODO, -117,r_vv,float,0.01,TODO,,TODO,TODO, -118,r_magnet,float,1.5,m,,TODO,TODO, -119,r_cryostat,float,1.0,TODO,,TODO,TODO, -120,f_vol,float,0.9,TODO,,TODO,TODO, -121,V_radially_inner_cylinder,str,,TODO,"V_cylindrical_shell, f_vol, length, r_in, r_out",TODO,TODO, -122,length_cc_cylinder,float,0.5,TODO,,TODO,TODO, -123,r_in_cc,str,,TODO,"a_CC, r_gap, r_vv",TODO,TODO, -124,r_out_cc,str,,TODO,r_in_cc,TODO,TODO, -125,V_cc_cylinder,str,,TODO,"V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc",TODO,TODO, -126,V_cc_triangle,str,,TODO,"V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc",TODO,TODO, -127,length_ep_cylinder,float,0.5,TODO,,TODO,TODO, -128,r_in_ep,str,,TODO,"a_0, r_gap, r_vv",TODO,TODO, -129,r_out_ep,str,,TODO,r_in_ep,TODO,TODO, -130,V_ep_cylinder,str,,TODO,"V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep",TODO,TODO, -131,V_ep_triangle,str,,TODO,"V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep",TODO,TODO, -132,V_total_cc_facing,str,,TODO,"V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder",TODO,TODO, -133,V_total_ec_facing,str,,TODO,"V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder",TODO,TODO, -134,V_total,str,,TODO,"V_total_cc_facing, V_total_ec_facing",TODO,TODO, -135,mass,str,,TODO,"V_total, cost_data, material",TODO,TODO, +1,E_DT,str,,1,,,P_alpha, +2,E_alpha,str,,1,,,P_alpha, +3,E_n,str,,1,"E_DT, E_alpha",,, +4,m_T,str,,1,,,, +5,m_D,str,,1,,,, +6,m_6Li,str,,1,,,, +7,Wh_to_BTU,float,3.41214,1,,,, +8,indentation,int,0.0,1,,,, +9,indented_name,str,,1,"account_name, account_number, indentation",,, +10,inputs,str,,1,"NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness",,, +11,cost_data,str,,1,cost_account,,, +12,L_magnet_to_magnet,str,,1,inputs,,, +13,L_cylinder,str,,1,L_magnet_to_magnet,,, +14,expander_cell_cost_result,str,,1,"expander_cell_cost, inputs",,, +15,end_plug_cylindrical_part,str,,1,"L_cylinder, central_cell, inputs",,, +16,end_plug_cylindrical_part_cost,str,,1,end_plug_cylindrical_part,,, +17,central_cell_cylindrical_part,str,,1,"central_cell, inputs",,, +18,central_cell_cylindrical_part_cost,str,,1,central_cell_cylindrical_part,,, +19,total_cost,str,,1,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",,, +20,cost_factor,str,,1,"inputs, np",,, +21,cost_pump,int,40000.0,1,,,, +22,vpump_cap,str,,1,,,, +23,no_vpumps,str,,1,"inputs, vpump_cap",,, +24,axis_t,str,,1,"inputs, np",,, +25,axis_ir,str,,1,axis_t,,, +26,lr,str,,1,,,, +27,constructionworker,str,,1,axis_ir,,, +28,C_22_1_11_in,str,,1,"inputs, lr",,, +29,C_22_1_11_1_in,str,,1,"constructionworker, inputs, lr",,, +30,C_22_1_11_2_in,str,,1,"constructionworker, inputs, lr",,, +31,C_22_1_11_3_in,str,,1,"constructionworker, inputs, lr",,, +32,C_22_1_11_4_in,str,,1,"constructionworker, inputs, lr",,, +33,C_22_1_11_5_in,str,,1,"constructionworker, inputs, lr",,, +34,C_22_1_11_6_in,str,,1,"constructionworker, inputs, lr",,, +35,C_22_1_11_7_in,str,,1,"constructionworker, inputs, lr",,, +36,C_22_1_11_8_in,int,0.0,1,,,, +37,C_22_1_11_9_in,str,,1,"constructionworker, inputs, lr",,, +38,C_22_1_11_10_in,int,0.0,1,,,, +39,C220111,str,,1,"C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in",,, +40,inflation,float,1.43,1,,,, +41,C2205010ITER,str,,1,inflation,,, +42,C2205020ITER,str,,1,inflation,,, +43,C2205030ITER,str,,1,inflation,,, +44,C2205040ITER,str,,1,inflation,,, +45,C2205050ITER,str,,1,inflation,,, +46,C2205060ITER,str,,1,inflation,,, +47,lcredit,float,0.8,1,,,, +48,ltoak,str,,1,"lcredit, np",,, +49,C220501,str,,1,"C2205010ITER, ltoak",,, +50,C220502,str,,1,"C2205020ITER, ltoak",,, +51,C220503,str,,1,"C2205030ITER, ltoak",,, +52,C220504,str,,1,"C2205040ITER, ltoak",,, +53,C220505,str,,1,"C2205050ITER, ltoak",,, +54,C220506,str,,1,"C2205060ITER, ltoak",,, +55,C220500,str,,1,"C220501, C220502, C220503, C220504, C220505, C220506",,, +56,f_cr,float,0.09,1,,,, +57,f_6Li_natural,float,0.075,1,,,, +58,rho_6Li,float,460.0,1,,,, +59,rho_7Li,float,537.0,1,,,, +60,T_K,str,,1,T,,, +61,rho_PbLi,str,,1,T_K,,, +62,P_6Li075,float,15.152,1,,,, +63,P_6Li90,int,70.0,1,,,, +64,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",1,,,, +65,Cf,list,"(1, 2, 4, 8, 16)",1,,,, +66,f_interp,str,,1,"Cf, f, scipy",,, +67,f_Li,float,0.17,1,,,, +68,f_Pb,str,,1,f_Li,,, +69,P_Li,str,,1,"Li_price, f_6Li",,, +70,P_PbLi,str,,1,"P_Li, P_Pb, f_Li, f_Pb",,, +71,P_f_CC,str,,1,"P_f, P_f_EP","P_f, P_f_EP",L_CC, +72,L_CC,str,,1,"P_f_CC, P_f_L","P_f_CC, P_f_L","CF_magnet_number, L", +73,L_CF,float,1.0,1,,,CF_magnet_number, +74,L,str,,1,"L_CC, L_EC, L_EP","L_CC, L_EP, L_EC",V_vac, +75,V_vac,str,,1,"L, a_EC, np","L, a_EC",, +76,P_alpha,str,,1,"E_DT, E_alpha, P_f","E_DT, E_alpha, P_f","P_DEC, P_n", +77,P_n,str,,1,"P_alpha, P_f","P_f, P_alpha","P_pump, P_th", +78,P_ine,str,,1,"P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI","P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng", +79,P_pump,str,,1,"M_n, P_n, f_pump","f_pump, M_n, P_n","P_other, P_th", +80,P_sub_cont,str,,1,"P_f, f_sub","f_sub, P_f",P_other, +81,P_cryo,str,,1,"P_f, f_cryo","f_cryo, P_f",P_other, +82,P_other,str,,1,"P_cryo, P_pump, P_sub_cont","P_pump, P_sub_cont, P_cryo","P_enet, Q_eng", +83,P_in,str,,1,"P_ECH, P_ICRH, P_NBI","P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci", +84,P_th,str,,1,"M_n, P_n, P_pump, eta_pump","M_n, P_n, P_pump, eta_pump",P_the, +85,P_the,str,,1,"P_th, eta_th","eta_th, P_th",P_egross, +86,P_DEC,str,,1,"P_alpha, P_in","P_in, P_alpha",P_DECe, +87,P_DECe,str,,1,"P_DEC, eta_DEC","eta_DEC, P_DEC",P_egross, +88,P_egross,str,,1,"P_DECe, P_the","application, P_DECe, P_the","P_enet, Q_eng, f_aux", +89,P_enet,str,,1,"P_egross, P_ine, P_other","P_egross, P_ine, P_other",, +90,f_aux,str,,1,"P_aux, P_egross","P_aux, P_egross",, +91,Q_sci,str,,1,"P_f, P_in","P_f, P_in",, +92,Q_eng,str,,1,"P_egross, P_ine, P_other","P_egross, P_ine, P_other",f_refrac, +93,f_refrac,str,,1,Q_eng,Q_eng,, +94,run_name,str,,1,"P_f, float",,, +95,cost_file_full,str,,1,"cost_file, pkg_resources",,, +96,new_data,str,,1,"f_vol, material, name, pd, thickness",,, +97,r_in,str,,1,data,,, +98,r_out,str,,1,data,,, +99,radial_build,str,,1,"create_radial_build, inputs",,, +100,filename,str,,1,inputs,,, +101,T,int,300.0,1,,,, +102,material,str,,1,"i, radial_build",,, +103,f_6Li,float,0.075,1,,,, +104,radius,str,,1,inputs,,, +105,thickness,str,,1,inputs,,, +106,vv_material,str,,1,inputs,,, +107,V_end_cap,str,,1,"np, radius, thickness",,, +108,M_end_cap,str,,1,"V_end_cap, cost_data, vv_material",,, +109,C_end_cap,str,,1,"M_end_cap, cost_data, vv_material",,, +110,total,str,,1,"C_end_cap, radial_build",,, +111,cost,float,29.1,1,,,, +112,a_M,float,0.15,1,,,, +113,a_CC,float,0.54,1,,,, +114,a_0,float,0.7,1,,,, +115,length,float,0.5,1,,,, +116,r_gap,float,0.1,1,,,, +117,r_vv,float,0.01,1,,,, +118,r_magnet,float,1.5,m,,,, +119,r_cryostat,float,1.0,1,,,, +120,f_vol,float,0.9,1,,,, +121,V_radially_inner_cylinder,str,,1,"V_cylindrical_shell, f_vol, length, r_in, r_out",,, +122,length_cc_cylinder,float,0.5,1,,,, +123,r_in_cc,str,,1,"a_CC, r_gap, r_vv",,, +124,r_out_cc,str,,1,r_in_cc,,, +125,V_cc_cylinder,str,,1,"V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc",,, +126,V_cc_triangle,str,,1,"V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc",,, +127,length_ep_cylinder,float,0.5,1,,,, +128,r_in_ep,str,,1,"a_0, r_gap, r_vv",,, +129,r_out_ep,str,,1,r_in_ep,,, +130,V_ep_cylinder,str,,1,"V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep",,, +131,V_ep_triangle,str,,1,"V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep",,, +132,V_total_cc_facing,str,,1,"V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder",,, +133,V_total_ec_facing,str,,1,"V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder",,, +134,V_total,str,,1,"V_total_cc_facing, V_total_ec_facing",,, +135,mass,str,,1,"V_total, cost_data, material",,, +136,application,Mirror input parameter,heat,1,,,P_egross,0 +137,P_f,Mirror input parameter,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 +138,P_f_L,Mirror input parameter,1.0,MW/m,,,L_CC,0 +139,P_f_EP,Mirror input parameter,1.0,MW,,,P_f_CC,0 +140,P_NBI,Mirror input parameter,1.0,MW,,,"P_in, P_ine",0 +141,P_ECH,Mirror input parameter,1.0,MW,,,"P_in, P_ine",0 +142,P_ICRH,Mirror input parameter,1.0,MW,,,"P_in, P_ine",0 +143,M_n,Mirror input parameter,1.1,1,,,"P_pump, P_th",0 +144,N_module,Mirror input parameter,1.0,1,,,,0 +145,f_pump,Mirror input parameter,0.03,1,,,P_pump,0 +146,f_sub,Mirror input parameter,0.04,1,,,P_sub_cont,0 +147,f_cryo,Mirror input parameter,0.01,1,,,P_cryo,0 +148,P_aux,Mirror input parameter,1.0,MW,,,f_aux,0 +149,eta_th,Mirror input parameter,0.5,1,,,P_the,0 +150,eta_DEC,Mirror input parameter,0.9,1,,,P_DECe,0 +151,eta_pump,Mirror input parameter,0.98,1,,,P_th,0 +152,eta_NBI,Mirror input parameter,0.5,1,,,P_ine,0 +153,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 +154,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 +155,NOAK,Mirror input parameter,0.0,1,,,,0 +156,n_unit,Mirror input parameter,1.0,1,,,,0 +157,construction_time,Mirror input parameter,6.0,years,,,,0 +158,lifetime,Mirror input parameter,30.0,years,,,,0 +159,replacement,Mirror input parameter,10.0,years,,,,0 +160,availability,Mirror input parameter,0.9,1,,,,0 +161,discount,Mirror input parameter,0.0245,1,,,,0 +162,LSA,Mirror input parameter,2.0,1,,,,0 +163,include_decommissioning,Mirror input parameter,0.0,1,,,,0 +164,include_tax,Mirror input parameter,0.0,1,,,,0 +165,include_licensing,Mirror input parameter,0.0,1,,,,0 +166,include_contingency,Mirror input parameter,0.0,1,,,,0 +167,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 +168,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 +169,a_EC,Mirror input parameter,1.0,m,,,V_vac,0 +170,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +171,vacuum_gap_CC,Mirror input parameter,0.01,m,,,,0 +172,first_wall_thickness,Mirror input parameter,0.01,m,,,,0 +173,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +174,multiplier_thickness,Mirror input parameter,0.01,m,,,,0 +175,blanket_thickness,Mirror input parameter,1.0,m,,,,0 +176,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,,0 +177,blanket_structural_fraction,Mirror input parameter,0.1,1,,,,0 +178,outer_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +179,L_EP,Mirror input parameter,1.0,m,,,L,0 +180,L_EC,Mirror input parameter,1.0,m,,,L,0 +181,a_EP,Mirror input parameter,1.0,m,,,,0 +182,HF_magnet_number,Mirror input parameter,4.0,1,,,,0 +183,LF_magnet_number,Mirror input parameter,2.0,1,,,,0 +184,CF_magnet_number,Mirror generated parameter,,1,,"L_CC, L_CF",,0 From 1621b7f313be95e10b55abb2b5716460f0d6bdeb Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 15:18:39 -0500 Subject: [PATCH 03/23] Fix Mirror account cost scaling and rollup behavior --- src/Main.py | 13 +- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 144 +++++++++--------- src/scripts/build_mirror_accert_tables.py | 10 +- test/test_mirror_model.py | 34 +++++ tutorial/accert/ref_tables/mirror_account.csv | 144 +++++++++--------- 6 files changed, 198 insertions(+), 147 deletions(-) diff --git a/src/Main.py b/src/Main.py index 56e4b6c..5472fcf 100755 --- a/src/Main.py +++ b/src/Main.py @@ -1841,12 +1841,23 @@ def _no_cost_element_processing(self, c, ut, accert): xml2obj class instantiates objects that can parse the ACCERT XML file. """ self.check_and_process_total_cost(c, accert) - self.roll_up_account_table(c, from_level=4, to_level=0) + if self._has_account_changes_to_roll_up(c): + self.roll_up_account_table(c, from_level=4, to_level=0) print(' Generating results table for review '.center(100, '=')) self._print_cost_basis_note() print('\n') ut.print_leveled_accounts(c, all=False, cost_unit='million', level=4) + def _has_account_changes_to_roll_up(self, c): + c.execute( + f""" + SELECT COUNT(*) + FROM {self.acc_tabl} + WHERE review_status IN ('User Input', 'Added') + """ + ) + return c.fetchone()[0] > 0 + def _print_cost_basis_note(self): print('[Note] Reference costs are in {} dollars. Displayed account costs are escalated to {} dollars using CPI-U.\n'.format( model_cost_year(self.ref_model), diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 7eb5eabc320df89233d72f4621d4d7210c090eb3..34b801fe2a8a673aece20e3aae8ca7d92793187e 100644 GIT binary patch delta 1884 zcmY+Fe^6A{7037Od%N$x{q+usfQZ84h98m9uq+^m2-lTg1qB3^0u>PXrLa&~HC1WX zWEmSX*4h-0noNtD&`6DA1X+G4P*6c!gfx>f(W%wg)R+*@Z!6{?nQMO1XoHk3b zoXVw+mdZJf!y1b;wbw6BVy0oHWu{}MXJ&Bu#mS!@alx?sP=3uAydRE=0UaEReWmlPmOG35a%lGjWyjFQmxk)K;16-lviDE#}a*+Dt z)-&*uxM8u5^N;26i!%_ytCl{*1@FRoLKDXC(23!fao4+WjL>Ao`^zl{>VnmT9s^^@kt0Vjwi}ih zOH52>p_qsh3KC@I2 z;dZ+*{Tvh%dgxHbgGVC=u=5-g5b8X9{Jqn2cA>flenRNP?H$!sRaLmP2bPG13v`^1 zRlxQh2o+YQ|7jd2dteQrxtTFFO=m*T?EGL ztiAw?#3Bu=OQwK7zW@=!>N326r!PRGm`+%8DvzOq5XQ?ZQ!r}~0*d2B)*8-BaxA5V?&d@ImqcSud`Lul-sH+Hzy}lALDlIzFA*eS6AC$i&sA#sW!)c z7nyJ0wz;;lIXf!_2UvoTc-7OG${h0@mRs3WUu*v#hPojzhs5)Y4HdkD;my(cwf4$V zFRD0v$brQ}u!7L&fYg0SjVJKf5F``21Evd4%xLkGAqXm(P{?hvXn4!8Tz^BqQ}3@E z)D>z!*S2aGY3^%&r^%2WNN-CUrTOIVJnE^)JHP!FqLR+p&5RCiRTR5dC; z;ik|lY!>G7*Z5!Z%XyV@f?Xe5lsG;D^Vn*eKJM6Ve1M;hKom*&`i;?ovd&6eI0~x> zUDsFd^I2;U+D2inxT;XcJ)0!p{!uWQwxm6G@`q~vB}j6dRHk{WnX!R^sRGW7Lb$N8 z-L@Ci7Xb-<^J99ps;U~_x(La^arvx1A>Y?0KhB)mTv1+EZfC2(S$s24yaZW<{voSw zr6;855}Zq>cIURl)}Y?l9}@p`&h9{|_=-1i%o?T{{QU-46C0ChYu?sWZmXzddn6XK z2VpK&Tm~zl#j`E(-3f(w`Z5HF*;yT~niY8c3OjuC zptmn}0&HS-5=)i9W9I}IdC$JOIstnKtx6l)lGOMn7F>l*gccRgmd^YA5Ds32QbITN zx82+usl-q>Y-EG_&*BVE-dEiaCvI5E3e9efaW{ksDtMBDvu@9^Ty|>D_4%g=W>0z! zVw;IS81ZNX-)cVfdePhyAmND2ED;fLRP$E~3U X-0n%VPQh+Mk3v)zn?H_CLBf9lEmdf8 delta 1880 zcmY+E3s6+o8OQhR>z=z0?uS$!T48xENRVA&QB<-ASK@+*JS7oC5s4rySRn~Dn&?P^ zade_l^J(I=TE^Ejnj*Lhh(JIdL87Ks8%w6G37V+2+9pn_SkkkyotS&?H*?SYf9L<5 z`+fJE&4+B8`BP8o<@JhsWxc9iT`$zr7Lk~um9u0Z%aVBwcBqP2rej62s-PaaWy5j3e^++4#?RF%&sTx)~=H6C%fj z7V(l&CL@1q_BM@>2HymchlYoihmMDyhnLGYLArBbFKAubUGPu>*~F#b6ZsnkvC1X@su(wOv+r~5_{iDrvCIi2fV3B=$c znH)O08Nhi6)UdKbCbdhoQj(Cba_`sydZX*{3W~dMla~`SLOOad{qjLQauIvU{=zp4hUiZW4O|X<&$HZ+Ji&CO-TN50nOqM+3XwarMG@pig z|Ex$p&4-Z5K|<_QW8}=4=J>c2n>`aRpN6@HWk#+}7ADjvqg$PsYRk5>1)Z%~ci##^ zV>8SPdNIQ7;h~HXZpxf7Kb0-pba<$H>m+=m8RiN_;W{#zudllq43t$?z42%yk1pxmaXK0kTVO`m%24h$&Epmm%H85-roXVlR$X3M!=mJ;K2NmyV?zr(AGR{& zSu(^;n(hB5mj@i+*9UmBg;#+6O4iuvd}lA(&OiZW`5#ZWm;HJ-9z6rOl%?$Nsp)x; zhjJ$@r))>;xjiTL?ZP!qm?0ES(-Ci*fCrrrPTB4i^20tCWKrv7v$lQbw8t3O3fa_p%eKzosMv*dt&l^l z-5%{qD`fu6B^cA&AeLJDIsW=|8E$QJ1IInaBW>J@3CE6wyy;M)r5(~Ji+QK6G`TJX z8`>d{TJL7}4t0FL9Y@=tnEwHu(c-i45@mkhR%8`+eut;dLLp_r{6n1n*Kkq?lu(xB zaoN=2)>2F}UQ+zgjyIl;3gecMjGG z3n-UTL=5PJh}q`6s*BlvDf4>hjVW6+U8e(a6K{L#xF;Xiu7M6GAPX%4&d znhe8wVF6{n1A88<$}!`*Uho&}FY1U-l7R2_La32_IC5`!(qQXPrM(s?ZayJ@!Bg7w zd=94wc(oUdl{24jlVq)*3daQye7edrv*6)=9HR};>zM$ z-W?WiczQbGf6v1r%E}xQ(=z+u3}u$B2mTe4n~wT^2$*8d;3h$$$0WlNpITM(%KGA} zl2WwwLt!MFmUe>)dtxj%#$vBs~8H+uGUkaJ(=G9h4>C{OXJMvajH~pYoQn=NgqeuP;>M z)ld2UVp$%|Gz3*bS`tr`NbtxI7>Ei7hhPh3#)9EVYn;EqtP8M;vZ;-2s=Qluc=iIU zpe(d;V_Q?vn;0?-MU>fYXU?1dBp0_0LxPYyi?)%d8BUWE@XJuD{=jbZzc>U?9 cB*GfjxVR2&mtZ4h1-a>t_rJ` str: return "" +def _dollar_value(value: str | float | int | None) -> float | None: + if value in (None, ""): + return None + return float(str(value).replace("$", "")) + + def _account_method_dependencies(algorithm_source: Path) -> dict[str, tuple[list[str], list[str]]]: module = ast.parse(algorithm_source.read_text(encoding="utf-8")) klass = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == "MirrorFunc") @@ -265,7 +271,7 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: ) rows = conn.execute( """ - SELECT ind, code_of_account, account_description, total_cost, level, + SELECT ind, code_of_account, account_description, total_cost_dollars, level, prn, fun_unit FROM mirror_acco_raw ORDER BY ind @@ -291,7 +297,7 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: ind, code, description, - total_cost, + _dollar_value(total_cost), level, _mirror_parent_code(raw_code, int(level or 0)), "Unchanged", diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index ef37c8a..2d3803f 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -60,6 +60,30 @@ def test_mirror_variable_update_uses_reference_table(cursor): assert cursor.fetchone() == (2.0, "m", 1) +def test_mirror_unlinked_variable_does_not_change_accounts(cursor): + accert = Accert.__new__(Accert) + accert.acc_tabl = "mirror_acco" + accert.var_tabl = "mirror_var" + accert.alg_tabl = "mirror_alg" + + cursor.execute("SELECT total_cost FROM mirror_acco WHERE code_of_account = ?", ("OCC",)) + original_occ = cursor.fetchone()[0] + + assert accert.update_input_variable(cursor, "r_magnet", 2.0, "m") is None + assert accert.update_new_accounts(cursor) is None + assert not accert._has_account_changes_to_roll_up(cursor) + + cursor.execute( + """ + SELECT total_cost, review_status + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("OCC",), + ) + assert cursor.fetchone() == (original_occ, "Unchanged") + + def test_mirror_accounts_use_fusion_style_structure(cursor): cursor.execute( """ @@ -71,6 +95,16 @@ def test_mirror_accounts_use_fusion_style_structure(cursor): ) assert cursor.fetchone() == ("211", "21", "Account_C21_1", "P_egross") + cursor.execute( + """ + SELECT total_cost + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("OCC",), + ) + assert cursor.fetchone()[0] == 1587572359.0 + def test_mirror_variable_links_are_reversed_from_var_need(cursor): cursor.execute( diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index bcfe948..31d9a98 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -1,92 +1,92 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_status,prn,alg_name,fun_unit,variables -1,10,Pre-Construction_Costs,24.18611754,0,,Unchanged,0.0046878318104200244,,million, -2,11,Land_and_Land_Rights,1.18611754,1,1,Unchanged,0.00022989715177366762,,million, -3,12,Site_Permits,10.0,1,1,Unchanged,0.0019382324602810245,,million, +1,10,Pre-Construction_Costs,24186117.540000003,0,,Unchanged,0.0046878318104200244,,million, +2,11,Land_and_Land_Rights,1186117.5399999998,1,1,Unchanged,0.00022989715177366762,,million, +3,12,Site_Permits,10000000.0,1,1,Unchanged,0.0019382324602810245,,million, 4,13,Plant_Licensing,0.0,1,1,Unchanged,0.0,,million, -5,14,Plant_Permits,5.0,1,1,Unchanged,0.0009691162301405122,,million, -6,15,Plant_Studies,5.0,1,1,Unchanged,0.0009691162301405122,,million, -7,16,Plant_Reports,2.0,1,1,Unchanged,0.00038764649205620487,,million, -8,17,Other_Pre-Construction_Costs,1.0,1,1,Unchanged,0.00019382324602810244,,million, +5,14,Plant_Permits,5000000.0,1,1,Unchanged,0.0009691162301405122,,million, +6,15,Plant_Studies,5000000.0,1,1,Unchanged,0.0009691162301405122,,million, +7,16,Plant_Reports,2000000.0,1,1,Unchanged,0.00038764649205620487,,million, +8,17,Other_Pre-Construction_Costs,1000000.0,1,1,Unchanged,0.00019382324602810244,,million, 9,19,Contingency_on_Pre-Construction_Costs,0.0,1,1,Unchanged,0.0,,million, -10,20,Capitalized_Direct_Costs_(CDC),1298.175963,0,,Unchanged,0.2516166790643178,Account_C20,million,rollup -11,21,Structures_and_Improvements,112.9457941,1,2,Unchanged,0.021891520437683703,Account_C21,million,rollup -12,211,Site_Preparation/Yard_Work,42.37641442,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross -13,212,Heat_Island_Building,29.53699334,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross -14,213,Turbine_Generator_Building,8.538531265,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" -15,214,Heat_Exchanger_Building,5.976971885,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross -16,215,Power_Supply_and_Energy_Storage,1.707706253,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross -17,216,Reactor_Auxiliaries,0.8538531265,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross -18,217,Hot_Cell,14.76849667,2,21,Unchanged,0.0028624779635346214,Account_C21_7,million,P_egross -19,218,Reactor_Services,2.956861753,2,21,Unchanged,0.0005731085430228053,Account_C21_8,million,P_egross -20,219,Service_Water,0.0474362848,2,21,Unchanged,9.194254699449537e-06,Account_C21_9,million,P_egross -21,2110,Fuel_Storage,0.1739330443,2,21,Unchanged,3.3712267237775744e-05,Account_C21_10,million,P_egross -22,2111,Control_Room,0.1423088544,2,21,Unchanged,2.7582764098348607e-05,Account_C21_11,million,P_egross -23,2112,Onsite_AC_Power,0.1264967595,2,21,Unchanged,2.4518012538326203e-05,Account_C21_12,million,P_egross -24,2113,Administration,0.6957321771,2,21,Unchanged,0.00013484906893172064,Account_C21_13,million,P_egross -25,2114,Site_Services,0.252993519,2,21,Unchanged,4.903602507665241e-05,Account_C21_14,million,P_egross -26,2115,Cryogenics,0.3794902784,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross -27,2116,Security,0.1423088544,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross -28,2117,Ventilation_Stack,4.269265632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross -29,22,Heat_Island_Plant_Equipment,1111.99892,1,2,Unchanged,0.21553124025414422,Account_C22,million,rollup -30,221,Heat_Island_Components,901.9675668,2,22,Unchanged,0.17482228160924532,Account_C22_1,million,rollup -31,2211,First_Wall_and_Blanket,43.19343421,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" -32,2212,Magnet_Radiation_Shield,94.73695574,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million, -33,2213,Coils,272.0399768,3,221,Unchanged,0.05272767135278568,Account_C22_1_3,million,rollup -34,22131,HF_Coils,116.4,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,HF_magnet_number -35,22132,LF_Coils,12.50524,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,LF_magnet_number -36,22133,CC_Coils,143.1347368,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million, -37,2214,Supplemental_Heating,227.453,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup -38,22141,NBI,105.963,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, n_unit" -39,22142,ICRH,41.49,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, n_unit" -40,22143,ECH,80.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, n_unit" +10,20,Capitalized_Direct_Costs_(CDC),1298175963.0,0,,Unchanged,0.2516166790643178,Account_C20,million,rollup +11,21,Structures_and_Improvements,112945794.1,1,2,Unchanged,0.021891520437683703,Account_C21,million,rollup +12,211,Site_Preparation/Yard_Work,42376414.42,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross +13,212,Heat_Island_Building,29536993.34,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross +14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" +15,214,Heat_Exchanger_Building,5976971.885,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross +16,215,Power_Supply_and_Energy_Storage,1707706.253,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross +17,216,Reactor_Auxiliaries,853853.1265,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross +18,217,Hot_Cell,14768496.67,2,21,Unchanged,0.0028624779635346214,Account_C21_7,million,P_egross +19,218,Reactor_Services,2956861.753,2,21,Unchanged,0.0005731085430228053,Account_C21_8,million,P_egross +20,219,Service_Water,47436.2848,2,21,Unchanged,9.194254699449537e-06,Account_C21_9,million,P_egross +21,2110,Fuel_Storage,173933.0443,2,21,Unchanged,3.3712267237775744e-05,Account_C21_10,million,P_egross +22,2111,Control_Room,142308.85439999998,2,21,Unchanged,2.7582764098348607e-05,Account_C21_11,million,P_egross +23,2112,Onsite_AC_Power,126496.7595,2,21,Unchanged,2.4518012538326203e-05,Account_C21_12,million,P_egross +24,2113,Administration,695732.1771,2,21,Unchanged,0.00013484906893172064,Account_C21_13,million,P_egross +25,2114,Site_Services,252993.519,2,21,Unchanged,4.903602507665241e-05,Account_C21_14,million,P_egross +26,2115,Cryogenics,379490.2784,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross +27,2116,Security,142308.85439999998,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross +28,2117,Ventilation_Stack,4269265.632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross +29,22,Heat_Island_Plant_Equipment,1111998920.0,1,2,Unchanged,0.21553124025414422,Account_C22,million,rollup +30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,Account_C22_1,million,rollup +31,2211,First_Wall_and_Blanket,43193434.21,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" +32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million, +33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,Account_C22_1_3,million,rollup +34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,HF_magnet_number +35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,LF_magnet_number +36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million, +37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup +38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, n_unit" +39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, n_unit" +40,22143,ECH,80000000.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, n_unit" 41,2215,Primary_Structure_and_Support,0.0,3,221,Unchanged,0.0,Account_C22_1_5,million, -42,2216,Vacuum_System,2.031827257,3,221,Unchanged,0.00039381535432011556,Account_C22_1_6,million,rollup +42,2216,Vacuum_System,2031827.2570000002,3,221,Unchanged,0.00039381535432011556,Account_C22_1_6,million,rollup 43,22162,Vessel_Refrigerators,0.0,4,2216,Unchanged,0.0,Account_C22_1_6_2,million, -44,22163,Primary_Vacuum_Pumps,1.689827257,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,V_vac -45,22164,Backing_Vacuum_Pumps,0.342,4,2216,Unchanged,6.628755014161104e-05,Account_C22_1_6_4,million, +44,22163,Primary_Vacuum_Pumps,1689827.257,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,V_vac +45,22164,Backing_Vacuum_Pumps,342000.0,4,2216,Unchanged,6.628755014161104e-05,Account_C22_1_6_4,million, 46,2217,Power_Supplies,0.0,3,221,Unchanged,0.0,Account_C22_1_7,million, 47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, -48,2219,Direct_Energy_Convertor,109.3171648,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, n_unit" -49,22111,Assembly_and_Installation_Costs,153.1952079,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"construction_time, N_module, L, n_unit" -50,222,Main_and_Secondary_Coolant,33.6494515,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,rollup -51,223,Auxiliary_Cooling_Systems,0.3521982635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" -52,224,Radioactive_Waste_Treatment,0.6275532695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th -53,225,Fuel_Handling_and_Storage,88.65405229,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,n_unit -54,226,Other_Heat_Island_Equipment,1.748097852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet -55,227,Instrumentation_and_Control,85.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, -56,23,Turbine_Plant_Equipment,39.82276109,1,2,Unchanged,0.007718576820265415,Account_C23,million,"P_egross, N_module" -57,24,Electric_Plant_Equipment,9.819310954,1,2,Unchanged,0.0019032107228635835,Account_C24,million,"P_egross, N_module" -58,25,Miscellaneous_Plant_Equipment,6.909885486,1,2,Unchanged,0.0013392964345789922,Account_C25,million,"P_egross, N_module" -59,26,Heat_Rejection,11.67929132,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"P_enet, N_module" +48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, n_unit" +49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"construction_time, N_module, L, n_unit" +50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,rollup +51,223,Auxiliary_Cooling_Systems,352198.2635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" +52,224,Radioactive_Waste_Treatment,627553.2695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th +53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,n_unit +54,226,Other_Heat_Island_Equipment,1748097.852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet +55,227,Instrumentation_and_Control,85000000.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, +56,23,Turbine_Plant_Equipment,39822761.09,1,2,Unchanged,0.007718576820265415,Account_C23,million,"P_egross, N_module" +57,24,Electric_Plant_Equipment,9819310.954,1,2,Unchanged,0.0019032107228635835,Account_C24,million,"P_egross, N_module" +58,25,Miscellaneous_Plant_Equipment,6909885.4860000005,1,2,Unchanged,0.0013392964345789922,Account_C25,million,"P_egross, N_module" +59,26,Heat_Rejection,11679291.32,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"P_enet, N_module" 60,27,Special_Materials,0.0,1,2,Unchanged,0.0,Account_C27,million, -61,28,Digital_Twin/Simulator,5.0,1,2,Unchanged,0.0009691162301405122,Account_C28,million, +61,28,Digital_Twin/Simulator,5000000.0,1,2,Unchanged,0.0009691162301405122,Account_C28,million, 62,29,Contingency_on_Direct_Capital_Costs,0.0,1,2,Unchanged,0.0,Account_C29,million,rollup -63,30,Capitalized_Indirect_Service_Costs_(CISC),71.59197058,0,,Unchanged,0.013876188127364011,,million, -64,31,Field_Indirect_Costs,14.31839412,1,3,Unchanged,0.0027752376262480953,,million, -65,32,Construction_Supervision,35.79598529,1,3,Unchanged,0.0069380940636820055,,million, +63,30,Capitalized_Indirect_Service_Costs_(CISC),71591970.58,0,,Unchanged,0.013876188127364011,,million, +64,31,Field_Indirect_Costs,14318394.120000001,1,3,Unchanged,0.0027752376262480953,,million, +65,32,Construction_Supervision,35795985.29,1,3,Unchanged,0.0069380940636820055,,million, 66,33,Commissioning_and_Start-Up_Costs,0.0,1,3,Unchanged,0.0,,million, 67,34,Demonstration_Test_Run,0.0,1,3,Unchanged,0.0,,million, -68,35,Design_Services_Offsite,21.47759117,1,3,Unchanged,0.004162856437433911,,million, +68,35,Design_Services_Offsite,21477591.17,1,3,Unchanged,0.004162856437433911,,million, 69,36,PM/CM_Services_Offsite,0.0,1,3,Unchanged,0.0,,million, 70,37,Design_Servies_Offsite,0.0,1,3,Unchanged,0.0,,million, 71,38,PM/CM_Services_Onsite,0.0,1,3,Unchanged,0.0,,million, 72,39,Contingency_on_Support_Services,0.0,1,3,Unchanged,0.0,,million, -73,40,Capitalized_Owner's_Cost_(COC),155.7811156,0,,Unchanged,0.030194001495471065,,million, -74,50,Capitalized_Supplementary_Costs_(CSC),37.83719261,0,,Unchanged,0.00733372749226073,,million, -75,51,Shipping_and_Transportation_Costs,8.0,1,5,Unchanged,0.0015505859682248195,,million, -76,52,Spare_Parts,7.323124886,1,5,Unchanged,0.0014193918364736975,,million, +73,40,Capitalized_Owner's_Cost_(COC),155781115.6,0,,Unchanged,0.030194001495471065,,million, +74,50,Capitalized_Supplementary_Costs_(CSC),37837192.61,0,,Unchanged,0.00733372749226073,,million, +75,51,Shipping_and_Transportation_Costs,8000000.0,1,5,Unchanged,0.0015505859682248195,,million, +76,52,Spare_Parts,7323124.886,1,5,Unchanged,0.0014193918364736975,,million, 77,53,Taxes,0.0,1,5,Unchanged,0.0,,million, -78,54,Insurance,1.0,1,5,Unchanged,0.00019382324602810244,,million, -79,55,Initial_Fuel_Load,21.51406772,1,5,Unchanged,0.004169926440758817,,million, +78,54,Insurance,1000000.0,1,5,Unchanged,0.00019382324602810244,,million, +79,55,Initial_Fuel_Load,21514067.72,1,5,Unchanged,0.004169926440758817,,million, 80,58,Decommissioning_Costs,0.0,1,5,Unchanged,0.0,,million, 81,59,Contingency_on_Supplementary_Costs,0.0,1,5,Unchanged,0.0,,million, -82,60,Capitalized_Financial_Costs_(CFC),195.4094412,0,,Unchanged,0.03787489219792162,,million, -83,61,Escalation,20.125,1,6,Unchanged,0.003900692826315562,,million, +82,60,Capitalized_Financial_Costs_(CFC),195409441.20000002,0,,Unchanged,0.03787489219792162,,million, +83,61,Escalation,20125000.0,1,6,Unchanged,0.003900692826315562,,million, 84,62,Fees,0.0,1,6,Unchanged,0.0,,million, -85,63,Interest_During_Construction_(IDC),175.2844412,1,6,Unchanged,0.033974199371606055,,million, +85,63,Interest_During_Construction_(IDC),175284441.20000002,1,6,Unchanged,0.033974199371606055,,million, 86,69,Contingency_on_Capitalized_Financial_Costs,0.0,1,6,Unchanged,0.0,,million, -87,OCC,Overnight_Capital_Cost_(OCC),1587.572359,0,,Unchanged,0.307708427925872,,million, -88,TCC,Total_Capital_Cost_(TCC),1782.981801,0,,Unchanged,0.3455833202788522,,million, -89,O&M,Operations_and_Maintenance,5.69490028,0,,Unchanged,0.0011038040580759493,,million, -90,Fuel,Fuel,0.1090042081,0,,Unchanged,2.1127549444664777e-05,,million, -91,81,Deuterium,0.04739117657,1,8,Unchanged,9.185511675888353e-06,,million, +87,OCC,Overnight_Capital_Cost_(OCC),1587572359.0,0,,Unchanged,0.307708427925872,,million, +88,TCC,Total_Capital_Cost_(TCC),1782981801.0,0,,Unchanged,0.3455833202788522,,million, +89,O&M,Operations_and_Maintenance,5694900.279999999,0,,Unchanged,0.0011038040580759493,,million, +90,Fuel,Fuel,109004.2081,0,,Unchanged,2.1127549444664777e-05,,million, +91,81,Deuterium,47391.176569999996,1,8,Unchanged,9.185511675888353e-06,,million, From 338baec445724dfbf9d3b60ad231f94ae12c7469 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 15:34:22 -0500 Subject: [PATCH 04/23] Generate Mirror defaults from input function --- docs/source/reference/table/Mirrortables.rst | 11 ++ src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 85 ++++++----- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 140 +++++++++++------- test/test_mirror_model.py | 15 ++ .../ref_tables/mirror_default_inputs.csv | 66 +++++++++ .../accert/ref_tables/mirror_variable.csv | 85 ++++++----- 8 files changed, 276 insertions(+), 128 deletions(-) create mode 100644 tutorial/accert/ref_tables/mirror_default_inputs.csv diff --git a/docs/source/reference/table/Mirrortables.rst b/docs/source/reference/table/Mirrortables.rst index 681cf73..0eefa2f 100644 --- a/docs/source/reference/table/Mirrortables.rst +++ b/docs/source/reference/table/Mirrortables.rst @@ -6,6 +6,10 @@ ACCERT PR #50. Its reference data currently contains account, variable, and algorithm tables. Unlike PWR12-BE, AP1000, LPSR, and ABR1000, the Mirror model does not use a separate cost-element table. +The default input table is generated from ``MirrorFunc.generate_inputs``. Boolean +defaults are stored as ``0`` or ``1`` so they can be loaded into SQLite with the +other ACCERT variable values. + Mirror Account Table -------------------- @@ -26,3 +30,10 @@ Mirror Variable Table .. csv-table:: Mirror Variable Table :file: ../../../../tutorial/accert/ref_tables/mirror_variable.csv :header-rows: 1 + +Mirror Default Input Table +-------------------------- + +.. csv-table:: Mirror Default Input Table + :file: ../../../../tutorial/accert/ref_tables/mirror_default_inputs.csv + :header-rows: 1 diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 34b801fe2a8a673aece20e3aae8ca7d92793187e..c61a6703351792afd6ffeb747294f6930f94d623 100644 GIT binary patch delta 2616 zcmaJ@du$ZP8K0ZIyWO3=-5q1j_Qg;91mkBN9#=4qxf+aO$Q5H70^z(q@7W9Yu+Deb zmP*VjC!|PJX%xbQmw6M%A&~G636F%3s;DhhmHg3`R?Q!2)v9gUs#TSWrk%OFb=)-S z>7<+ee&6@|9y9a1-E-WxhkjGG6ijg`d&-e=rudYQ5>qH8rCcdFrKHr$*yf+)T0tAw zE2t+`O>L0wK|%Sx?PEn(8f=ftf04f@)ymzn$MvC$xD5Fg*z1Dewk<3Tg3r-MXc~o) z7jfbb#Fs=vTqOKcxGC%tdW0hWH~cBvS-#%+sdL6T;%spI(J}3aI2PMKvCr5C?IqmD z+>6Q)F2v=!;X`-^YD>)m1U+6}mF0W^yh2L4ah>}y1dG!qw*U_52`w;^jEs;ITW}sp zc4Jj8ws0D9l)TuDL-Pv}EVNh-vycs|*JUCubYn%WGaC?ed&Nwe^JLW~d|vS(Sl=$I z@&Z`^cYS1459P-_xJ+J60k4hvQs8~k+JkGA_Bp2aI+<_PJbQDE`GiGFUGHdQWE1w- zBm4v)?R#Lgy3lO1a8&@e$rnAiL~cdUn=X}x+$4*7@iKWOf1!U5g~c31cK|=y7sq zGcF^go3U8F++2!ai#I1jb@fZ1|1Pk=KhV6|T!P>Vi|)!UEtpJ3NJB4fQdgOev!P_$ zy-ZF#OSgjUceb%Mvt>>tm&lDi+)}>G{02*{W>Q}a8S&9XU`z{tWi~l|&CAVZ1Z%9! zZ;?lRxK8abn-E-U<$ROu31PSJbyHnuHX^vrioU=cOGsNUF14dCKDiHyXc{=LNM1l|7W_o+tZ#ou(`#ov~C`4 z^E7FA8ZYuxAXsG$=ajZfGs4<{5jGMN>8OIXKm3q=enf-ISxdJ3^o&lDDH`lv!1%JJ z6JaByCyYp@Fn7s>uEj^aW*M7J*5x?ix8la!Qr2#E5XYi{WYkEoWcg~1S;FpH7Mdcl zt+>!GO@TVPOAE=>t$3weG)E|okbiH*byNszC|*Iny$!d?9t-yf;2=4=4cFOSf6ox) zEjIHQD&(YFIN%QiV@7y1-KS@LU!Cb@-DJ_1{ei@AFc!;P&@?=M4!qwV7zxe7&h>rD z=b(~SQARw^;4`@mWKe7q?_(r8$2{^E$!~SFY zXO0Ht=gK9%Us-}g)l~NLBD$~a$|L?Rf0+L+Kh0m^f1%<{x`v`uZKKJ^fF1|$Gi&Ep zt?!AP8)|_LKe)qIU4afCxSd`3!L35h3u8$t(Scq1=%^m1hrtN$jM6o@S;qMw6Zyh+ z@Ge{bA9V-s6mzY!4(z;WQF?phS}atZZRV6#@m_GTi8KJZpKx0X!O zBGGKRH_3NGxI(&+9iR`KCo>^jzU>V*=i!hw{jeS#N(_T@ESV7vhLeLjy>HQk5gpQ_ z!3pqs9@jVvgpHsc9iJgo~oMZu(c7YSDELvygubOUBfJquS zPBTx!j8=hTto02~wLb}_SS)*8S?Al>368qB!t_&zuM-@x9_X74IBfZ`Hz9Dyg1$u$ s-9gq9qoBij1#$V1iN!b|%qOc*-~bEvyR(V}UQRz|1?ZYGjQ=|HA8dZKw*UYD delta 1899 zcmZ8iTTB#J7(RPucW3s@&dgb1cUdl?A{UXXfUsI>*R2+mC>KFmlx2lkSh~AV*tHOA z>a>&EHl}Jtk01)(Z+I&T_+THJYEv5}P5RI_ZKE|!8dGb1Fs+G6JG1N<(#a$<^PTU% zo%4VH>=yXerl+PU(@s;h z$tmw;fB=KdhrR)cdbix9LrO*0YCdOfS$YCId6uE7Ib8G^YkPT=Nq445L_wYZco zRUoHMp)1g26?v;x;eJz#i zM zzN!1Kq<5M;-G~=)83-0RnHlI5S=@+oxOBCM7<7`fHR5b;A%bZdbb=ge#0$AJwSXAw zIJv)FIr|5V*ghvyT7Y1jc5KJ0>Ri$Ncfi6TX};DrO8ld3{@&KENGKfbIs2e(=VEAH zQ&=j^Loi({ZIpcfI?hc4?u+4cs`k4sin5ZjaCkS7xIM>Dd;E3K5I_DQV9L+jSN)<(Ti zh34!7P1uJWvpRfGQ2}|m87Ha=5OiOY(I(u+*))cO0SAa>6VB0dpM%uBt|TE(ibv4y zG+Cnh8z6T!;|0XA8K2bi&p?rKkon}vW_-a?G^N` zGouC1OEmPblZH*Si@n9(Fnnql7Mg@kl+C#4G1Ah4ZF3m|+sV#jt<3xEG!tO@*m`z1 zJIFS(G8ifD9tN8MlZhTO$)+*1%edZn$9T^8Kp9HU z={R9b7~<9nyUjnCelxvoN~5>&Rpx2ow(uPmeqs)zeq#bXif-_ohErsd7dz~o<_+cw za}oL(HJ~~C38UY*gzrPEm0@<5BDHPUx_-(^<-)4fo}jlqB!)eqNN|hT1143p;{WJ` ziLydqu))!17#7*C>{P!+!oDnsCLo6_5P+c5*d6@o>aqPtA;L~JX&%EQk98|6 z!9k7J9SL>=qAk6uoW=pw@yuTd>_?OxR(rgWJ}{udK2K{;e;3$?sL8n<_}BLT0C*?Z AlmGw# diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index d76222d..8693f37 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -7272,41 +7272,52 @@ INSERT INTO "mirror_var" VALUES(144,'N_module','Mirror input parameter',1.0,'1', INSERT INTO "mirror_var" VALUES(145,'f_pump','Mirror input parameter',0.03,'1','','','P_pump',0); INSERT INTO "mirror_var" VALUES(146,'f_sub','Mirror input parameter',0.04,'1','','','P_sub_cont',0); INSERT INTO "mirror_var" VALUES(147,'f_cryo','Mirror input parameter',0.01,'1','','','P_cryo',0); -INSERT INTO "mirror_var" VALUES(148,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); -INSERT INTO "mirror_var" VALUES(149,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); -INSERT INTO "mirror_var" VALUES(150,'eta_DEC','Mirror input parameter',0.9,'1','','','P_DECe',0); -INSERT INTO "mirror_var" VALUES(151,'eta_pump','Mirror input parameter',0.98,'1','','','P_th',0); -INSERT INTO "mirror_var" VALUES(152,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO "mirror_var" VALUES(153,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO "mirror_var" VALUES(154,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO "mirror_var" VALUES(155,'NOAK','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(156,'n_unit','Mirror input parameter',1.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(157,'construction_time','Mirror input parameter',6.0,'years','','','',0); -INSERT INTO "mirror_var" VALUES(158,'lifetime','Mirror input parameter',30.0,'years','','','',0); -INSERT INTO "mirror_var" VALUES(159,'replacement','Mirror input parameter',10.0,'years','','','',0); -INSERT INTO "mirror_var" VALUES(160,'availability','Mirror input parameter',0.9,'1','','','',0); -INSERT INTO "mirror_var" VALUES(161,'discount','Mirror input parameter',0.0245,'1','','','',0); -INSERT INTO "mirror_var" VALUES(162,'LSA','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(163,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(164,'include_tax','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(165,'include_licensing','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(166,'include_contingency','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(167,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(168,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(169,'a_EC','Mirror input parameter',1.0,'m','','','V_vac',0); -INSERT INTO "mirror_var" VALUES(170,'expander_cell_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(171,'vacuum_gap_CC','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(172,'first_wall_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(173,'vacuum_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(174,'multiplier_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(175,'blanket_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(176,'blanket_coolant_fraction','Mirror input parameter',0.9,'1','','','',0); -INSERT INTO "mirror_var" VALUES(177,'blanket_structural_fraction','Mirror input parameter',0.1,'1','','','',0); -INSERT INTO "mirror_var" VALUES(178,'outer_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(179,'L_EP','Mirror input parameter',1.0,'m','','','L',0); -INSERT INTO "mirror_var" VALUES(180,'L_EC','Mirror input parameter',1.0,'m','','','L',0); -INSERT INTO "mirror_var" VALUES(181,'a_EP','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(182,'HF_magnet_number','Mirror input parameter',4.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(183,'LF_magnet_number','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(184,'CF_magnet_number','Mirror generated parameter','','1','','L_CC, L_CF','',0); +INSERT INTO "mirror_var" VALUES(148,'P_pfcool','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO "mirror_var" VALUES(149,'P_thcool','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO "mirror_var" VALUES(150,'P_coils','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO "mirror_var" VALUES(151,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); +INSERT INTO "mirror_var" VALUES(152,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); +INSERT INTO "mirror_var" VALUES(153,'eta_DEC','Mirror input parameter',0.9,'1','','','P_DECe',0); +INSERT INTO "mirror_var" VALUES(154,'eta_pump','Mirror input parameter',0.98,'1','','','P_th',0); +INSERT INTO "mirror_var" VALUES(155,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO "mirror_var" VALUES(156,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO "mirror_var" VALUES(157,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO "mirror_var" VALUES(158,'NOAK','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(159,'n_unit','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(160,'construction_time','Mirror input parameter',6.0,'years','','','',0); +INSERT INTO "mirror_var" VALUES(161,'lifetime','Mirror input parameter',30.0,'years','','','',0); +INSERT INTO "mirror_var" VALUES(162,'replacement','Mirror input parameter',10.0,'years','','','',0); +INSERT INTO "mirror_var" VALUES(163,'availability','Mirror input parameter',0.9,'1','','','',0); +INSERT INTO "mirror_var" VALUES(164,'discount','Mirror input parameter',0.0245,'1','','','',0); +INSERT INTO "mirror_var" VALUES(165,'LSA','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(166,'cost_file','Mirror input parameter','woodruff-data.csv','1','','','',0); +INSERT INTO "mirror_var" VALUES(167,'method','Mirror input parameter','new','1','','','',0); +INSERT INTO "mirror_var" VALUES(168,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(169,'include_tax','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(170,'include_licensing','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(171,'include_contingency','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(172,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(173,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(174,'a_EC','Mirror input parameter',1.0,'m','','','V_vac',0); +INSERT INTO "mirror_var" VALUES(175,'expander_cell_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(176,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO "mirror_var" VALUES(177,'vacuum_gap_CC','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(178,'first_wall_material','Mirror input parameter','W','1','','','',0); +INSERT INTO "mirror_var" VALUES(179,'first_wall_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(180,'vacuum_vessel_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO "mirror_var" VALUES(181,'vacuum_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(182,'multiplier_material','Mirror input parameter','Pb','1','','','',0); +INSERT INTO "mirror_var" VALUES(183,'multiplier_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(184,'blanket_coolant_material','Mirror input parameter','Natural PbLi','1','','','',0); +INSERT INTO "mirror_var" VALUES(185,'blanket_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(186,'blanket_coolant_fraction','Mirror input parameter',0.9,'1','','','',0); +INSERT INTO "mirror_var" VALUES(187,'blanket_structural_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO "mirror_var" VALUES(188,'blanket_structural_fraction','Mirror input parameter',0.1,'1','','','',0); +INSERT INTO "mirror_var" VALUES(189,'outer_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); +INSERT INTO "mirror_var" VALUES(190,'L_EP','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO "mirror_var" VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO "mirror_var" VALUES(192,'a_EP','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO "mirror_var" VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO "mirror_var" VALUES(195,'CF_magnet_number','Mirror generated parameter','','1','','L_CC, L_CF','',0); COMMIT; diff --git a/src/etc/accert.sch b/src/etc/accert.sch index df27f70..5bfc14d 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -798,7 +798,7 @@ fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'ann stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost'] -mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'vacuum_gap_CC' 'first_wall_thickness' 'vacuum_vessel_thickness' 'multiplier_thickness' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'CF_magnet_number'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'CF_magnet_number'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index 552889a..30daee6 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -29,6 +29,7 @@ "mirror_alg": "mirror_algorithm.csv", "mirror_var": "mirror_variable.csv", } +DEFAULT_INPUT_FILE = "mirror_default_inputs.csv" MIRROR_ACCOUNT_COLUMNS = [ ("ind", "INTEGER"), @@ -66,56 +67,48 @@ "Vacuum Volume": "V_vac", } -MIRROR_INPUT_DEFAULTS = { - "application": ("heat", "1"), - "P_f": (1, "MW"), - "P_f_L": (1, "MW/m"), - "P_f_EP": (1, "MW"), - "P_NBI": (1, "MW"), - "P_ECH": (1, "MW"), - "P_ICRH": (1, "MW"), - "M_n": (1.1, "1"), - "N_module": (1, "1"), - "f_pump": (0.03, "1"), - "f_sub": (0.04, "1"), - "f_cryo": (0.01, "1"), - "P_aux": (1, "MW"), - "eta_th": (0.50, "1"), - "eta_DEC": (0.90, "1"), - "eta_pump": (0.98, "1"), - "eta_NBI": (0.50, "1"), - "eta_ECH": (0.50, "1"), - "eta_ICRH": (0.50, "1"), - "NOAK": (0, "1"), - "n_unit": (1, "1"), - "construction_time": (6, "years"), - "lifetime": (30, "years"), - "replacement": (10, "years"), - "availability": (0.90, "1"), - "discount": (0.0245, "1"), - "LSA": (2, "1"), - "include_decommissioning": (0, "1"), - "include_tax": (0, "1"), - "include_licensing": (0, "1"), - "include_contingency": (0, "1"), - "hf_magnet_length": (1, "m"), - "hf_magnet_shielding_thickness": (1, "m"), - "a_EC": (1, "m"), - "expander_cell_vessel_thickness": (0.01, "m"), - "vacuum_gap_CC": (0.01, "m"), - "first_wall_thickness": (0.01, "m"), - "vacuum_vessel_thickness": (0.01, "m"), - "multiplier_thickness": (0.01, "m"), - "blanket_thickness": (1.00, "m"), - "blanket_coolant_fraction": (0.90, "1"), - "blanket_structural_fraction": (0.10, "1"), - "outer_vessel_thickness": (0.01, "m"), - "L_EP": (1, "m"), - "L_EC": (1, "m"), - "a_CC": (1, "m"), - "a_EP": (1, "m"), - "HF_magnet_number": (4, "1"), - "LF_magnet_number": (2, "1"), +MIRROR_INPUT_UNITS = { + "P_f": "MW", + "P_f_L": "MW/m", + "P_f_EP": "MW", + "P_NBI": "MW", + "P_ECH": "MW", + "P_ICRH": "MW", + "P_pump": "MW", + "P_sub_cont": "MW", + "P_cryo": "MW", + "P_pfcool": "MW", + "P_thcool": "MW", + "P_coils": "MW", + "P_aux": "MW", + "construction_time": "years", + "lifetime": "years", + "replacement": "years", + "hf_magnet_length": "m", + "hf_magnet_shielding_thickness": "m", + "a_EC": "m", + "expander_cell_vessel_thickness": "m", + "vacuum_gap_CC": "m", + "first_wall_thickness": "m", + "vacuum_vessel_thickness": "m", + "multiplier_thickness": "m", + "blanket_thickness": "m", + "outer_vessel_thickness": "m", + "L_EP": "m", + "L_EC": "m", + "a_CC": "m", + "a_EP": "m", + "application": "1", + "cost_file": "1", + "method": "1", + "expander_cell_vessel_material": "1", + "first_wall_material": "1", + "vacuum_vessel_material": "1", + "multiplier_material": "1", + "blanket_coolant_material": "1", + "blanket_structural_material": "1", + "filename": "1", + "run_name": "1", } MIRROR_GENERATED_VAR_NEEDS = { @@ -260,6 +253,32 @@ def _account_method_dependencies(algorithm_source: Path) -> dict[str, tuple[list return dependencies +def _literal_default(node: ast.AST): + value = ast.literal_eval(node) + if isinstance(value, bool): + return int(value) + if value is None: + return "" + return value + + +def _generate_inputs_defaults(algorithm_source: Path) -> dict[str, tuple[object, str]]: + module = ast.parse(algorithm_source.read_text(encoding="utf-8")) + klass = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == "MirrorFunc") + method = next(node for node in klass.body if isinstance(node, ast.FunctionDef) and node.name == "generate_inputs") + args = method.args.args + defaults = method.args.defaults + default_start = len(args) - len(defaults) + values = {} + for arg, default in zip(args[default_start:], defaults): + if arg.arg in {"verbose", "exact", "save", "load"}: + continue + values[arg.arg] = (_literal_default(default), MIRROR_INPUT_UNITS.get(arg.arg, "1")) + values["HF_magnet_number"] = (4, "1") + values["LF_magnet_number"] = (2, "1") + return values + + def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: dependencies = _account_method_dependencies(algorithm_source) methods = set(dependencies) @@ -316,13 +335,13 @@ def _split_vars(value: str | None) -> list[str]: return [part.strip() for part in str(value).split(",") if part.strip() and part.strip() != "TODO"] -def _normalize_mirror_variable_table(conn: sqlite3.Connection) -> None: +def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: conn.execute("UPDATE mirror_var SET var_alg = '' WHERE var_alg = 'TODO'") conn.execute("UPDATE mirror_var SET var_need = '' WHERE var_need = 'TODO'") conn.execute("UPDATE mirror_var SET v_linked = '' WHERE v_linked = 'TODO'") conn.execute("UPDATE mirror_var SET var_unit = '1' WHERE var_unit = 'TODO'") conn.execute("UPDATE mirror_var SET var_unit = 'm' WHERE var_name = 'r_magnet'") - for var_name, (value, unit) in MIRROR_INPUT_DEFAULTS.items(): + for var_name, (value, unit) in _generate_inputs_defaults(algorithm_source).items(): if conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): continue next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] @@ -359,6 +378,19 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection) -> None: ) +def _write_default_inputs_csv(algorithm_source: Path, path: Path) -> int: + rows = [ + (name, value, unit) + for name, (value, unit) in sorted(_generate_inputs_defaults(algorithm_source).items()) + ] + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w", newline="", encoding="utf-8") as handle: + writer = csv.writer(handle) + writer.writerow(["var_name", "default_value", "var_unit"]) + writer.writerows(rows) + return len(rows) + + def _normalize_mirror_algorithm_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: dependencies = _account_method_dependencies(algorithm_source) for alg_name, (input_keys, account_calls) in dependencies.items(): @@ -392,12 +424,14 @@ def load_mirror_tables( _mysql_insert_rows(mysql_sql, table_name), ) _normalize_mirror_account_table(conn, algorithm_source) - _normalize_mirror_variable_table(conn) + _normalize_mirror_variable_table(conn, algorithm_source) _normalize_mirror_algorithm_table(conn, algorithm_source) conn.commit() for table_name, file_name in TABLES.items(): count = _write_csv(conn, table_name, ref_dir / file_name) print(f"Wrote {count} {table_name} rows.") + count = _write_default_inputs_csv(algorithm_source, ref_dir / DEFAULT_INPUT_FILE) + print(f"Wrote {count} Mirror default input rows.") finally: conn.close() diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 2d3803f..64bdf42 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -25,6 +25,21 @@ def test_mirror_reference_tables_loaded(cursor): assert cursor.fetchone()[0] == _csv_row_count(csv_path) +def test_mirror_default_inputs_are_exported_from_generate_inputs(): + defaults_path = REF_DIR / "mirror_default_inputs.csv" + with defaults_path.open(newline="", encoding="utf-8") as handle: + defaults = { + row["var_name"]: (row["default_value"], row["var_unit"]) + for row in csv.DictReader(handle) + } + + assert defaults["application"] == ("heat", "1") + assert defaults["P_f"] == ("1", "MW") + assert defaults["n_unit"] == ("0", "1") + assert defaults["HF_magnet_number"] == ("4", "1") + assert defaults["LF_magnet_number"] == ("2", "1") + + def test_mirror_setup_table_names(): accert = Accert.__new__(Accert) accert.use_gncoa = False diff --git a/tutorial/accert/ref_tables/mirror_default_inputs.csv b/tutorial/accert/ref_tables/mirror_default_inputs.csv new file mode 100644 index 0000000..d01d78c --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_default_inputs.csv @@ -0,0 +1,66 @@ +var_name,default_value,var_unit +HF_magnet_number,4,1 +LF_magnet_number,2,1 +LSA,2,1 +L_EC,1,m +L_EP,1,m +M_n,1.1,1 +NOAK,0,1 +N_module,1,1 +P_ECH,1,MW +P_ICRH,1,MW +P_NBI,1,MW +P_aux,1,MW +P_coils,0,MW +P_cryo,1,MW +P_f,1,MW +P_f_EP,1,MW +P_f_L,1,MW/m +P_pfcool,0,MW +P_pump,1,MW +P_sub_cont,1,MW +P_thcool,0,MW +a_CC,1,m +a_EC,1,m +a_EP,1,m +application,heat,1 +availability,0.9,1 +blanket_coolant_fraction,0.9,1 +blanket_coolant_material,Natural PbLi,1 +blanket_structural_fraction,0.1,1 +blanket_structural_material,SS316,1 +blanket_thickness,1.0,m +construction_time,6,years +cost_file,woodruff-data.csv,1 +discount,0.0245,1 +eta_DEC,0.9,1 +eta_ECH,0.5,1 +eta_ICRH,0.5,1 +eta_NBI,0.5,1 +eta_pump,0.98,1 +eta_th,0.5,1 +expander_cell_vessel_material,SS316,1 +expander_cell_vessel_thickness,0.01,m +f_cryo,0.01,1 +f_pump,0.03,1 +f_sub,0.04,1 +filename,,1 +first_wall_material,W,1 +first_wall_thickness,0.01,m +hf_magnet_length,1,m +hf_magnet_shielding_thickness,1,m +include_contingency,0,1 +include_decommissioning,0,1 +include_licensing,0,1 +include_tax,0,1 +lifetime,30,years +method,new,1 +multiplier_material,Pb,1 +multiplier_thickness,0.01,m +n_unit,0,1 +outer_vessel_thickness,0.01,m +replacement,10,years +run_name,,1 +vacuum_gap_CC,0.01,m +vacuum_vessel_material,SS316,1 +vacuum_vessel_thickness,0.01,m diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index 0464766..d647e8a 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -146,40 +146,51 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 145,f_pump,Mirror input parameter,0.03,1,,,P_pump,0 146,f_sub,Mirror input parameter,0.04,1,,,P_sub_cont,0 147,f_cryo,Mirror input parameter,0.01,1,,,P_cryo,0 -148,P_aux,Mirror input parameter,1.0,MW,,,f_aux,0 -149,eta_th,Mirror input parameter,0.5,1,,,P_the,0 -150,eta_DEC,Mirror input parameter,0.9,1,,,P_DECe,0 -151,eta_pump,Mirror input parameter,0.98,1,,,P_th,0 -152,eta_NBI,Mirror input parameter,0.5,1,,,P_ine,0 -153,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 -154,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 -155,NOAK,Mirror input parameter,0.0,1,,,,0 -156,n_unit,Mirror input parameter,1.0,1,,,,0 -157,construction_time,Mirror input parameter,6.0,years,,,,0 -158,lifetime,Mirror input parameter,30.0,years,,,,0 -159,replacement,Mirror input parameter,10.0,years,,,,0 -160,availability,Mirror input parameter,0.9,1,,,,0 -161,discount,Mirror input parameter,0.0245,1,,,,0 -162,LSA,Mirror input parameter,2.0,1,,,,0 -163,include_decommissioning,Mirror input parameter,0.0,1,,,,0 -164,include_tax,Mirror input parameter,0.0,1,,,,0 -165,include_licensing,Mirror input parameter,0.0,1,,,,0 -166,include_contingency,Mirror input parameter,0.0,1,,,,0 -167,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 -168,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 -169,a_EC,Mirror input parameter,1.0,m,,,V_vac,0 -170,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,,0 -171,vacuum_gap_CC,Mirror input parameter,0.01,m,,,,0 -172,first_wall_thickness,Mirror input parameter,0.01,m,,,,0 -173,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,,0 -174,multiplier_thickness,Mirror input parameter,0.01,m,,,,0 -175,blanket_thickness,Mirror input parameter,1.0,m,,,,0 -176,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,,0 -177,blanket_structural_fraction,Mirror input parameter,0.1,1,,,,0 -178,outer_vessel_thickness,Mirror input parameter,0.01,m,,,,0 -179,L_EP,Mirror input parameter,1.0,m,,,L,0 -180,L_EC,Mirror input parameter,1.0,m,,,L,0 -181,a_EP,Mirror input parameter,1.0,m,,,,0 -182,HF_magnet_number,Mirror input parameter,4.0,1,,,,0 -183,LF_magnet_number,Mirror input parameter,2.0,1,,,,0 -184,CF_magnet_number,Mirror generated parameter,,1,,"L_CC, L_CF",,0 +148,P_pfcool,Mirror input parameter,0.0,MW,,,,0 +149,P_thcool,Mirror input parameter,0.0,MW,,,,0 +150,P_coils,Mirror input parameter,0.0,MW,,,,0 +151,P_aux,Mirror input parameter,1.0,MW,,,f_aux,0 +152,eta_th,Mirror input parameter,0.5,1,,,P_the,0 +153,eta_DEC,Mirror input parameter,0.9,1,,,P_DECe,0 +154,eta_pump,Mirror input parameter,0.98,1,,,P_th,0 +155,eta_NBI,Mirror input parameter,0.5,1,,,P_ine,0 +156,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 +157,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 +158,NOAK,Mirror input parameter,0.0,1,,,,0 +159,n_unit,Mirror input parameter,0.0,1,,,,0 +160,construction_time,Mirror input parameter,6.0,years,,,,0 +161,lifetime,Mirror input parameter,30.0,years,,,,0 +162,replacement,Mirror input parameter,10.0,years,,,,0 +163,availability,Mirror input parameter,0.9,1,,,,0 +164,discount,Mirror input parameter,0.0245,1,,,,0 +165,LSA,Mirror input parameter,2.0,1,,,,0 +166,cost_file,Mirror input parameter,woodruff-data.csv,1,,,,0 +167,method,Mirror input parameter,new,1,,,,0 +168,include_decommissioning,Mirror input parameter,0.0,1,,,,0 +169,include_tax,Mirror input parameter,0.0,1,,,,0 +170,include_licensing,Mirror input parameter,0.0,1,,,,0 +171,include_contingency,Mirror input parameter,0.0,1,,,,0 +172,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 +173,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 +174,a_EC,Mirror input parameter,1.0,m,,,V_vac,0 +175,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +176,expander_cell_vessel_material,Mirror input parameter,SS316,1,,,,0 +177,vacuum_gap_CC,Mirror input parameter,0.01,m,,,,0 +178,first_wall_material,Mirror input parameter,W,1,,,,0 +179,first_wall_thickness,Mirror input parameter,0.01,m,,,,0 +180,vacuum_vessel_material,Mirror input parameter,SS316,1,,,,0 +181,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +182,multiplier_material,Mirror input parameter,Pb,1,,,,0 +183,multiplier_thickness,Mirror input parameter,0.01,m,,,,0 +184,blanket_coolant_material,Mirror input parameter,Natural PbLi,1,,,,0 +185,blanket_thickness,Mirror input parameter,1.0,m,,,,0 +186,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,,0 +187,blanket_structural_material,Mirror input parameter,SS316,1,,,,0 +188,blanket_structural_fraction,Mirror input parameter,0.1,1,,,,0 +189,outer_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +190,L_EP,Mirror input parameter,1.0,m,,,L,0 +191,L_EC,Mirror input parameter,1.0,m,,,L,0 +192,a_EP,Mirror input parameter,1.0,m,,,,0 +193,HF_magnet_number,Mirror input parameter,4.0,1,,,,0 +194,LF_magnet_number,Mirror input parameter,2.0,1,,,,0 +195,CF_magnet_number,Mirror generated parameter,,1,,"L_CC, L_CF",,0 From 4845d790272751aa664778cde922eb0972d248f3 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 16:45:22 -0500 Subject: [PATCH 05/23] Add Mirror variable algorithms --- src/Algorithm/MirrorFunc.py | 98 +++ src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 758 +++++++++--------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 137 +++- test/test_mirror_model.py | 71 ++ tutorial/accert/ref_tables/MirrorFunc.py | 98 +++ .../accert/ref_tables/mirror_algorithm.csv | 24 + .../accert/ref_tables/mirror_variable.csv | 52 +- 9 files changed, 845 insertions(+), 395 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index b71670b..7015767 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -87,6 +87,104 @@ def _run_algorithm(self, alg_name: str, variables: list) -> float: return algorithm(*variables) except AttributeError: raise ValueError(f"Algorithm {alg_name} not found") + + @staticmethod + def cal_P_f_CC(P_f, P_f_EP): + return P_f - 2 * P_f_EP + + @staticmethod + def cal_L_CC(P_f_CC, P_f_L): + return P_f_CC / P_f_L + + @staticmethod + def cal_L_CF(): + return 1.0 + + @staticmethod + def cal_L(L_CC, L_EP, L_EC): + return L_CC + 2 * L_EP + 2 * L_EC + + @staticmethod + def cal_V_vac(L, a_EC): + return L * np.pi * a_EC**2 + + @staticmethod + def cal_P_alpha(E_DT, E_alpha, P_f): + return P_f * E_alpha / E_DT + + @staticmethod + def cal_P_n(P_f, P_alpha): + return P_f - P_alpha + + @staticmethod + def cal_P_ine(P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH): + return P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH + + @staticmethod + def cal_P_pump(f_pump, M_n, P_n): + return f_pump * M_n * P_n + + @staticmethod + def cal_P_sub_cont(f_sub, P_f): + return f_sub * P_f + + @staticmethod + def cal_P_cryo(f_cryo, P_f): + return f_cryo * P_f + + @staticmethod + def cal_P_other(P_pump, P_sub_cont, P_cryo): + return P_pump + P_sub_cont + P_cryo + + @staticmethod + def cal_P_in(P_NBI, P_ICRH, P_ECH): + return P_NBI + P_ICRH + P_ECH + + @staticmethod + def cal_P_th(M_n, P_n, P_pump, eta_pump): + return M_n * P_n + eta_pump * P_pump + + @staticmethod + def cal_P_the(eta_th, P_th): + return eta_th * P_th + + @staticmethod + def cal_P_DEC(P_in, P_alpha): + return P_in + P_alpha + + @staticmethod + def cal_P_DECe(eta_DEC, P_DEC): + return eta_DEC * P_DEC + + @staticmethod + def cal_P_egross(application, P_DECe, P_the): + if str(application).lower() == "electricity": + return P_DECe + P_the + return P_DECe + + @staticmethod + def cal_P_enet(P_egross, P_ine, P_other): + return P_egross - (P_ine + P_other) + + @staticmethod + def cal_f_aux(P_aux, P_egross): + return P_aux / P_egross + + @staticmethod + def cal_Q_sci(P_f, P_in): + return P_f / P_in + + @staticmethod + def cal_Q_eng(P_egross, P_ine, P_other): + return P_egross / (P_ine + P_other) + + @staticmethod + def cal_f_refrac(Q_eng): + return 1 / Q_eng + + @staticmethod + def cal_CF_magnet_number(L_CC, L_CF): + return L_CC / L_CF ### Account Methods: ### @staticmethod diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index c61a6703351792afd6ffeb747294f6930f94d623..f7efb77b69316d95e7be4018121c0217859c1bb0 100644 GIT binary patch delta 5500 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 z S6S)q8+mD^NDIP8#+Zx(rw9AJI26=a^fWt8}My z?exFs5cMH7d#G`_lBuIB0`9U+=f?)jzlk)s3}+DUR^@yppGJ?!cc&v^Tjb|wT&Eb5-hX@V=huuFRHc{6(ved5_43-&Qr^|WRFsc zwAp%;*^>T?BBU=~yf<{X14s^=Tb3ZHl0K&)H6k=VKy7Wzej7w{ywIg*`` zbueiH%mb)o96s=lDJxqG+o+4B?P3Hjt6do6`Kl0Lc(VFESU03~D5BOnq%v~!lJDfJ zd$PMzsT-YQC!xR*u@n#t&tX9eaIV!=lc5epZJpSms&#`}>8oC^vBit@Dz!W=1jwx| z7W7QU{mRbTX!B!)Qa1d5+v^wI;T4H2Mro^ouLO7D%Sj9h4sRgi-GF8cvZ)4bl7Ci< z4$CbyXlrKuIy6nohiZ^pey|QT$|dz^oBVh^+AgQ+(H8mT8q|?7tVgZ1ys8#$SN{0} M|9Z?j@e73h2PF5@4gdfE delta 2297 zcmZuyZE#f88NTO!?A?3!o_pU6hBXsoHpwIl&Gub+nyoNA!>OgPFGaqqHy-M}#3g=bnw= zw8@;a?>Xmr-}gDsdC$2Ao(ms%E_|rCKo+zthve2pjM!GXx6{HSrGUXsZIB~yj^9t5Gwh!NdsAZV&y&LnMSP) zDJP4{pv}1RvlJLTz_V(04~=8Sh|yw*o)0`f^F%#9{gQrG-$W&PO(Inbu$Fwa02|1e zlMp7}SD~MrehoIu>P4Y}N?%8k3vf8M?iI)&^3_QQ$<{fcjV`p1)>E*Nd~^yr$djjF zb8h%m=tjBIKZi+$9rkx9rj2e`HbmgW|cK_1-w0o=jF7+Sk^JreJb^YD7;2L+;DHoNOlu@Nxz928i56gFh^szK+ z{!~gz%f!#b7sNQp?SWRZeIK-ummh=G1kDaoGWLJb|RAYVRC z!~X3tXp@b0!B3|u$eKOyh-_TV1Fr0Yr$zG`LC2t+Og|2LNnk(Jk#qYXC<+33a6hz@ zkM=`~7#XN06I0MY7N=mI7M(y|n5Ma?@m2sdkS>Vla>iPCP?W7d2-|6@fwmG+N5#u1 ze_V{kPCGs_zB`_oNC%_bEJC_gm|yO+I|goB%H3E8GLB$rwa_D630hxR?^(}V2d!Sq zZ!VgDGJkFU#Qd(lC>=CRDJm^Pui)R|F4Ko5QONk0_`Yz(Xcm8Dd{12KdBZd18AO*o zjU;ji2IqnHF29C zol3I#+r2s>T(w}Z3`g=(WeO=prcsSAucPBZemDzvEsxxFSeqI+0ArhlKv^Ix3+^f2bL6kJ^b{>9I_P)9L68Cs<6%o18cdb#~JrkLvdq z;lZd)*E!HRMTQ(svBoTC%7G-hws38mn=A1aw$7b8!`%$n6Yh6@d)M`l8;8I*UA2)X zp`zlAgZB61Lku6O@x|@VaE&iDo;N+$ghE`3nAIT%!@>${fDybyP>g>Rs2GfA3&_Dd!U zMER9Hz$Ny2F@9i4c$UC97^kb+$v0hEit)}qJ2Nz#C%{56Rh^i_sf`WyabR^d#`h)d z_~auTNDT(%$4BMAeb~8!b8c_Pcn8I#5>CB+Qw>Ga^Z!T6${wnTSEDzz7WdGdtWS=N z#V3N{_4a6d7Y$*jCPyEl1-+FMs;n%*Tb)|rgeG?L>q3i%UK%!Hi%Se!w{c14i1jS^ zyJk=?=R7*<$GuG7eD41(NlwL?XJmM>GK-b#+s{I~uVs^tmeGol)(^R3s``tfE?k@?(uY?3523+3z;&Fwl4N0CWC(*m-tvmP&f Wy4mN;$Sv9+LJpmUMQi@A7W^0I2z^2T diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 8693f37..e2b8783 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6931,98 +6931,6 @@ INSERT INTO ap1000_algorithm VALUES(28,'scale_law_wastewater_bldg','v','Wastewat INSERT INTO ap1000_algorithm VALUES(29,'scale_law_power','v','Power scale law.','AP1000DirectCostFunc','(input_unit_value / reference_unit_value)^exponent','1','input_unit_value, reference_unit_value, exponent',NULL); INSERT INTO ap1000_algorithm VALUES(30,'sum_all','c/v','Sum all supplied child cost elements or intermediate variables.','AP1000DirectCostFunc','sum(values)','$','values',NULL); INSERT INTO ap1000_algorithm VALUES(31,'calc_rej_th_P','v','Rejected thermal power = thermal power - electric power.','AP1000DirectCostFunc','rx_P - elec_P','MWt','rx_P, elec_P',NULL); -CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); -INSERT INTO "mirror_acco" VALUES(1,'10','Pre-Construction_Costs',2.418611754000000284e+07,0,'','Unchanged',4.687831810420024433e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(2,'11','Land_and_Land_Rights',1.186117539999999804e+06,1,'1','Unchanged',2.298971517736676198e-04,'','million',''); -INSERT INTO "mirror_acco" VALUES(3,'12','Site_Permits',10000000.0,1,'1','Unchanged',1.938232460281024469e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(4,'13','Plant_Licensing',0.0,1,'1','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(5,'14','Plant_Permits',5000000.0,1,'1','Unchanged',9.69116230140512235e-04,'','million',''); -INSERT INTO "mirror_acco" VALUES(6,'15','Plant_Studies',5000000.0,1,'1','Unchanged',9.69116230140512235e-04,'','million',''); -INSERT INTO "mirror_acco" VALUES(7,'16','Plant_Reports',2000000.0,1,'1','Unchanged',3.876464920562048719e-04,'','million',''); -INSERT INTO "mirror_acco" VALUES(8,'17','Other_Pre-Construction_Costs',1000000.0,1,'1','Unchanged',1.938232460281024359e-04,'','million',''); -INSERT INTO "mirror_acco" VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,1,'1','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298175963.0,0,'','Unchanged',2.516166790643177831e-01,'Account_C20','million','rollup'); -INSERT INTO "mirror_acco" VALUES(11,'21','Structures_and_Improvements',112945794.1,1,'2','Unchanged',2.189152043768370289e-02,'Account_C21','million','rollup'); -INSERT INTO "mirror_acco" VALUES(12,'211','Site_Preparation/Yard_Work',42376414.42,2,'21','Unchanged',8.213534197916488519e-03,'Account_C21_1','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(13,'212','Heat_Island_Building',29536993.34,2,'21','Unchanged',5.724955927069242875e-03,'Account_C21_2','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(14,'213','Turbine_Generator_Building',8.538531264999998733e+06,2,'21','Unchanged',1.654965846094739622e-03,'Account_C21_3','million','application, P_egross'); -INSERT INTO "mirror_acco" VALUES(15,'214','Heat_Exchanger_Building',5976971.885,2,'21','Unchanged',1.158476092169406302e-03,'Account_C21_4','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(16,'215','Power_Supply_and_Energy_Storage',1707706.253,2,'21','Unchanged',3.309931692189479568e-04,'Account_C21_5','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(17,'216','Reactor_Auxiliaries',853853.1265,2,'21','Unchanged',1.654965846094739784e-04,'Account_C21_6','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(18,'217','Hot_Cell',14768496.67,2,'21','Unchanged',2.862477963534621437e-03,'Account_C21_7','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(19,'218','Reactor_Services',2956861.753,2,'21','Unchanged',5.731085430228053398e-04,'Account_C21_8','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(20,'219','Service_Water',47436.2848,2,'21','Unchanged',9.194254699449536794e-06,'Account_C21_9','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(21,'2110','Fuel_Storage',173933.0443,2,'21','Unchanged',3.371226723777574368e-05,'Account_C21_10','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(22,'2111','Control_Room',1.423088543999999819e+05,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_11','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(23,'2112','Onsite_AC_Power',126496.7595,2,'21','Unchanged',2.45180125383262035e-05,'Account_C21_12','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(24,'2113','Administration',695732.1771,2,'21','Unchanged',1.348490689317206382e-04,'Account_C21_13','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(25,'2114','Site_Services',252993.519,2,'21','Unchanged',4.903602507665240699e-05,'Account_C21_14','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(26,'2115','Cryogenics',379490.2784,2,'21','Unchanged',7.35540375955963e-05,'Account_C21_15','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(27,'2116','Security',1.423088543999999819e+05,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_16','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(28,'2117','Ventilation_Stack',4269265.632,2,'21','Unchanged',8.274829229504581827e-04,'Account_C21_17','million','P_egross'); -INSERT INTO "mirror_acco" VALUES(29,'22','Heat_Island_Plant_Equipment',1111998920.0,1,'2','Unchanged',2.155312402541442185e-01,'Account_C22','million','rollup'); -INSERT INTO "mirror_acco" VALUES(30,'221','Heat_Island_Components',901967566.8,2,'22','Unchanged',1.748222816092453169e-01,'Account_C22_1','million','rollup'); -INSERT INTO "mirror_acco" VALUES(31,'2211','First_Wall_and_Blanket',43193434.21,3,'221','Unchanged',8.37189162568348702e-03,'Account_C22_1_1','million','L_CC, L_EP'); -INSERT INTO "mirror_acco" VALUES(32,'2212','Magnet_Radiation_Shield',94736955.74,3,'221','Unchanged',1.836222428034747084e-02,'Account_C22_1_2','million',''); -INSERT INTO "mirror_acco" VALUES(33,'2213','Coils',2.720399767999999523e+08,3,'221','Unchanged',5.272767135278567941e-02,'Account_C22_1_3','million','rollup'); -INSERT INTO "mirror_acco" VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',2.256102583767112534e-02,'Account_C22_1_3_1','million','HF_magnet_number'); -INSERT INTO "mirror_acco" VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',2.42380620916046773e-03,'Account_C22_1_3_2','million','LF_magnet_number'); -INSERT INTO "mirror_acco" VALUES(36,'22133','CC_Coils',143134736.8,4,'2213','Unchanged',2.774283930595409022e-02,'Account_C22_1_3_3','million',''); -INSERT INTO "mirror_acco" VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',4.408567877882998281e-02,'Account_C22_1_4','million','rollup'); -INSERT INTO "mirror_acco" VALUES(38,'22141','NBI',105963000.0,4,'2214','Unchanged',2.05380926188758195e-02,'Account_C22_1_4_1','million','P_NBI, n_unit'); -INSERT INTO "mirror_acco" VALUES(39,'22142','ICRH',41490000.0,4,'2214','Unchanged',8.041726477705971043e-03,'Account_C22_1_4_2','million','P_ICRH, n_unit'); -INSERT INTO "mirror_acco" VALUES(40,'22143','ECH',80000000.0,4,'2214','Unchanged',1.550585968224819574e-02,'Account_C22_1_4_3','million','P_ECH, n_unit'); -INSERT INTO "mirror_acco" VALUES(41,'2215','Primary_Structure_and_Support',0.0,3,'221','Unchanged',0.0,'Account_C22_1_5','million',''); -INSERT INTO "mirror_acco" VALUES(42,'2216','Vacuum_System',2.031827257000000217e+06,3,'221','Unchanged',3.938153543201155615e-04,'Account_C22_1_6','million','rollup'); -INSERT INTO "mirror_acco" VALUES(43,'22162','Vessel_Refrigerators',0.0,4,'2216','Unchanged',0.0,'Account_C22_1_6_2','million',''); -INSERT INTO "mirror_acco" VALUES(44,'22163','Primary_Vacuum_Pumps',1689827.257,4,'2216','Unchanged',3.275278041785044783e-04,'Account_C22_1_6_3','million','V_vac'); -INSERT INTO "mirror_acco" VALUES(45,'22164','Backing_Vacuum_Pumps',342000.0,4,'2216','Unchanged',6.628755014161104265e-05,'Account_C22_1_6_4','million',''); -INSERT INTO "mirror_acco" VALUES(46,'2217','Power_Supplies',0.0,3,'221','Unchanged',0.0,'Account_C22_1_7','million',''); -INSERT INTO "mirror_acco" VALUES(47,'2218','Divertor',0.0,3,'221','Unchanged',0.0,'Account_C22_1_8','million',''); -INSERT INTO "mirror_acco" VALUES(48,'2219','Direct_Energy_Convertor',109317164.8,3,'221','Unchanged',2.118820772812501919e-02,'Account_C22_1_9','million','P_DECe, n_unit'); -INSERT INTO "mirror_acco" VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9,3,'221','Unchanged',2.969279247112800724e-02,'Account_C22_1_11','million','construction_time, N_module, L, n_unit'); -INSERT INTO "mirror_acco" VALUES(50,'222','Main_and_Secondary_Coolant',33649451.5,2,'22','Unchanged',0.0065220459167952,'Account_C22_2','million','rollup'); -INSERT INTO "mirror_acco" VALUES(51,'223','Auxiliary_Cooling_Systems',352198.2635,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); -INSERT INTO "mirror_acco" VALUES(52,'224','Radioactive_Waste_Treatment',627553.2695,2,'22','Unchanged',1.216344117500385732e-04,'Account_C22_4','million','P_th'); -INSERT INTO "mirror_acco" VALUES(53,'225','Fuel_Handling_and_Storage',8.865405228999999166e+07,2,'22','Unchanged',1.718321618839292741e-02,'Account_C22_5','million','n_unit'); -INSERT INTO "mirror_acco" VALUES(54,'226','Other_Heat_Island_Equipment',1748097.852,2,'22','Unchanged',3.388220000493933943e-04,'Account_C22_6','million','P_enet'); -INSERT INTO "mirror_acco" VALUES(55,'227','Instrumentation_and_Control',85000000.0,2,'22','Unchanged',1.647497591238870906e-02,'Account_C22_7','million',''); -INSERT INTO "mirror_acco" VALUES(56,'23','Turbine_Plant_Equipment',39822761.09,1,'2','Unchanged',7.718576820265415049e-03,'Account_C23','million','P_egross, N_module'); -INSERT INTO "mirror_acco" VALUES(57,'24','Electric_Plant_Equipment',9819310.954,1,'2','Unchanged',1.903210722863583459e-03,'Account_C24','million','P_egross, N_module'); -INSERT INTO "mirror_acco" VALUES(58,'25','Miscellaneous_Plant_Equipment',6.909885486000000499e+06,1,'2','Unchanged',1.339296434578992169e-03,'Account_C25','million','P_egross, N_module'); -INSERT INTO "mirror_acco" VALUES(59,'26','Heat_Rejection',11679291.32,1,'2','Unchanged',2.263718154950241507e-03,'Account_C26','million','P_enet, N_module'); -INSERT INTO "mirror_acco" VALUES(60,'27','Special_Materials',0.0,1,'2','Unchanged',0.0,'Account_C27','million',''); -INSERT INTO "mirror_acco" VALUES(61,'28','Digital_Twin/Simulator',5000000.0,1,'2','Unchanged',9.69116230140512235e-04,'Account_C28','million',''); -INSERT INTO "mirror_acco" VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'2','Unchanged',0.0,'Account_C29','million','rollup'); -INSERT INTO "mirror_acco" VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71591970.58,0,'','Unchanged',1.387618812736401107e-02,'','million',''); -INSERT INTO "mirror_acco" VALUES(64,'31','Field_Indirect_Costs',1.431839412000000104e+07,1,'3','Unchanged',2.775237626248095324e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(65,'32','Construction_Supervision',35795985.29,1,'3','Unchanged',6.938094063682005535e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(66,'33','Commissioning_and_Start-Up_Costs',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(67,'34','Demonstration_Test_Run',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(68,'35','Design_Services_Offsite',21477591.17,1,'3','Unchanged',4.162856437433910644e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(69,'36','PM/CM_Services_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(70,'37','Design_Servies_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(71,'38','PM/CM_Services_Onsite',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(72,'39','Contingency_on_Support_Services',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',155781115.6,0,'','Unchanged',3.019400149547106504e-02,'','million',''); -INSERT INTO "mirror_acco" VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',37837192.61,0,'','Unchanged',0.00733372749226073,'','million',''); -INSERT INTO "mirror_acco" VALUES(75,'51','Shipping_and_Transportation_Costs',8000000.0,1,'5','Unchanged',1.550585968224819487e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(76,'52','Spare_Parts',7323124.886,1,'5','Unchanged',1.419391836473697482e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(77,'53','Taxes',0.0,1,'5','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(78,'54','Insurance',1000000.0,1,'5','Unchanged',1.938232460281024359e-04,'','million',''); -INSERT INTO "mirror_acco" VALUES(79,'55','Initial_Fuel_Load',21514067.72,1,'5','Unchanged',4.169926440758816612e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(80,'58','Decommissioning_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(81,'59','Contingency_on_Supplementary_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',1.954094412000000179e+08,0,'','Unchanged',3.787489219792161688e-02,'','million',''); -INSERT INTO "mirror_acco" VALUES(83,'61','Escalation',20125000.0,1,'6','Unchanged',3.900692826315561857e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(84,'62','Fees',0.0,1,'6','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(85,'63','Interest_During_Construction_(IDC)',1.752844412000000179e+08,1,'6','Unchanged',3.397419937160605503e-02,'','million',''); -INSERT INTO "mirror_acco" VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,1,'6','Unchanged',0.0,'','million',''); -INSERT INTO "mirror_acco" VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1587572359.0,0,'','Unchanged',0.307708427925872,'','million',''); -INSERT INTO "mirror_acco" VALUES(88,'TCC','Total_Capital_Cost_(TCC)',1782981801.0,0,'','Unchanged',3.455833202788521908e-01,'','million',''); -INSERT INTO "mirror_acco" VALUES(89,'O&M','Operations_and_Maintenance',5.694900279999999329e+06,0,'','Unchanged',1.103804058075949327e-03,'','million',''); -INSERT INTO "mirror_acco" VALUES(90,'Fuel','Fuel',109004.2081,0,'','Unchanged',2.112754944466477681e-05,'','million',''); -INSERT INTO "mirror_acco" VALUES(91,'81','Deuterium',4.739117656999999599e+04,1,'8','Unchanged',9.185511675888353413e-06,'','million',''); CREATE TABLE mirror_alg ( ind INTEGER DEFAULT NULL, alg_name TEXT NOT NULL, @@ -7033,86 +6941,110 @@ CREATE TABLE mirror_alg ( alg_units text, PRIMARY KEY (alg_name) ); -INSERT INTO "mirror_alg" VALUES(1,'__init__','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(2,'add_account','v','Add an account to the cost_account object.','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(3,'generate_report','v','Generate a report based on user input.','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(4,'learning_credit','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','application, P_egross','million'); -INSERT INTO "mirror_alg" VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(13,'Account_C21_7','c','Account C217 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(14,'Account_C21_8','c','Account C218 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(15,'Account_C21_9','c','Account C219 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(16,'Account_C21_10','c','Account C2110 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(17,'Account_C21_11','c','Account C2111 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(18,'Account_C21_12','c','Account C2112 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(19,'Account_C21_13','c','Account C2113 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(20,'Account_C21_14','c','Account C2114 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(21,'Account_C21_15','c','Account C2115 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(22,'Account_C21_16','c','Account C2116 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(23,'Account_C21_17','c','Account C2117 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO "mirror_alg" VALUES(24,'Account_C22','c','Account C22 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(25,'Account_C22_1','c','Account C221 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','L_CC, L_EP','million'); -INSERT INTO "mirror_alg" VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number','million'); -INSERT INTO "mirror_alg" VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number','million'); -INSERT INTO "mirror_alg" VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','P_NBI, n_unit','million'); -INSERT INTO "mirror_alg" VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','P_ICRH, n_unit','million'); -INSERT INTO "mirror_alg" VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup','MirrorFunc','P_ECH, n_unit','million'); -INSERT INTO "mirror_alg" VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(37,'Account_C22_1_6','c','Account C2216 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(38,'Account_C22_1_6_2','c','Account C22162 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','V_vac','million'); -INSERT INTO "mirror_alg" VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','P_DECe, n_unit','million'); -INSERT INTO "mirror_alg" VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','construction_time, N_module, L, n_unit','million'); -INSERT INTO "mirror_alg" VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO "mirror_alg" VALUES(47,'Account_C22_2_2','c','Account C2222 Rollup','MirrorFunc','P_th','million'); -INSERT INTO "mirror_alg" VALUES(48,'Account_C22_2_3','c','Account C2223 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','N_module, P_th','million'); -INSERT INTO "mirror_alg" VALUES(50,'Account_C22_4','c','Account C224 Rollup','MirrorFunc','P_th','million'); -INSERT INTO "mirror_alg" VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','n_unit','million'); -INSERT INTO "mirror_alg" VALUES(52,'Account_C22_6','c','Account C226 Rollup','MirrorFunc','P_enet','million'); -INSERT INTO "mirror_alg" VALUES(53,'Account_C22_7','c','Account C227 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO "mirror_alg" VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO "mirror_alg" VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO "mirror_alg" VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','P_enet, N_module','million'); -INSERT INTO "mirror_alg" VALUES(58,'Account_C27','c','Account C27 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(59,'Account_C28','c','Account C28 Rollup','MirrorFunc','reference value','million'); -INSERT INTO "mirror_alg" VALUES(60,'Account_C29','c','Account C29 Rollup','MirrorFunc','rollup','million'); -INSERT INTO "mirror_alg" VALUES(61,'Account_OCC','c','Account OCC Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(62,'Account_TCC','c','Account TCC Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(63,'Account_C90','c','Account C90 Rollup','MirrorFunc','TODO','million'); -INSERT INTO "mirror_alg" VALUES(64,'PbLi_density','v','Returns PbLi density (kg/m^3). Assumes the PbLi is a eutectic, which has','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(65,'Li_price','v','Return Li price (USD/kg) for enrichment levels above 90% 6Li','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(66,'PbLi_price','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(67,'V_cylindrical_shell','v','Return volume of a cylindrical shell','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(68,'V_inverse_triangular_washer','v','Return volume of cylindrical inverse triangular washer.','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(69,'generate_inputs','v','Return a dict containing all inputs for a techno-economic analysis.','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(70,'create_radial_build','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(71,'add_new_layer','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(72,'add_fractional_layer','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(73,'build_central_cell','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(74,'central_cell_cost','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(75,'central_cell','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(76,'expander_cell_cost','v','Each expander cell is made up of:','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(77,'HF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(78,'LF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(79,'CF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); -INSERT INTO "mirror_alg" VALUES(80,'HF_magnet_shield_cost','v','The HF coils have annular shield with a U-shaped cross section:','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(1,'__init__','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(2,'add_account','v','Add an account to the cost_account object.','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(3,'generate_report','v','Generate a report based on user input.','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(4,'learning_credit','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','application, P_egross','million'); +INSERT INTO mirror_alg VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(13,'Account_C21_7','c','Account C217 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(14,'Account_C21_8','c','Account C218 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(15,'Account_C21_9','c','Account C219 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(16,'Account_C21_10','c','Account C2110 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(17,'Account_C21_11','c','Account C2111 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(18,'Account_C21_12','c','Account C2112 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(19,'Account_C21_13','c','Account C2113 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(20,'Account_C21_14','c','Account C2114 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(21,'Account_C21_15','c','Account C2115 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(22,'Account_C21_16','c','Account C2116 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(23,'Account_C21_17','c','Account C2117 Rollup','MirrorFunc','P_egross','million'); +INSERT INTO mirror_alg VALUES(24,'Account_C22','c','Account C22 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(25,'Account_C22_1','c','Account C221 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','L_CC, L_EP','million'); +INSERT INTO mirror_alg VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number','million'); +INSERT INTO mirror_alg VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number','million'); +INSERT INTO mirror_alg VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','P_NBI, n_unit','million'); +INSERT INTO mirror_alg VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','P_ICRH, n_unit','million'); +INSERT INTO mirror_alg VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup','MirrorFunc','P_ECH, n_unit','million'); +INSERT INTO mirror_alg VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(37,'Account_C22_1_6','c','Account C2216 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(38,'Account_C22_1_6_2','c','Account C22162 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','V_vac','million'); +INSERT INTO mirror_alg VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','P_DECe, n_unit','million'); +INSERT INTO mirror_alg VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','construction_time, N_module, L, n_unit','million'); +INSERT INTO mirror_alg VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO mirror_alg VALUES(47,'Account_C22_2_2','c','Account C2222 Rollup','MirrorFunc','P_th','million'); +INSERT INTO mirror_alg VALUES(48,'Account_C22_2_3','c','Account C2223 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','N_module, P_th','million'); +INSERT INTO mirror_alg VALUES(50,'Account_C22_4','c','Account C224 Rollup','MirrorFunc','P_th','million'); +INSERT INTO mirror_alg VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','n_unit','million'); +INSERT INTO mirror_alg VALUES(52,'Account_C22_6','c','Account C226 Rollup','MirrorFunc','P_enet','million'); +INSERT INTO mirror_alg VALUES(53,'Account_C22_7','c','Account C227 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO mirror_alg VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO mirror_alg VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO mirror_alg VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','P_enet, N_module','million'); +INSERT INTO mirror_alg VALUES(58,'Account_C27','c','Account C27 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(59,'Account_C28','c','Account C28 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(60,'Account_C29','c','Account C29 Rollup','MirrorFunc','rollup','million'); +INSERT INTO mirror_alg VALUES(61,'Account_OCC','c','Account OCC Rollup','MirrorFunc','TODO','million'); +INSERT INTO mirror_alg VALUES(62,'Account_TCC','c','Account TCC Rollup','MirrorFunc','TODO','million'); +INSERT INTO mirror_alg VALUES(63,'Account_C90','c','Account C90 Rollup','MirrorFunc','TODO','million'); +INSERT INTO mirror_alg VALUES(64,'PbLi_density','v','Returns PbLi density (kg/m^3). Assumes the PbLi is a eutectic, which has','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(65,'Li_price','v','Return Li price (USD/kg) for enrichment levels above 90% 6Li','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(66,'PbLi_price','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(67,'V_cylindrical_shell','v','Return volume of a cylindrical shell','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(68,'V_inverse_triangular_washer','v','Return volume of cylindrical inverse triangular washer.','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(69,'generate_inputs','v','Return a dict containing all inputs for a techno-economic analysis.','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(70,'create_radial_build','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(71,'add_new_layer','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(72,'add_fractional_layer','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(73,'build_central_cell','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(74,'central_cell_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(75,'central_cell','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(76,'expander_cell_cost','v','Each expander cell is made up of:','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(77,'HF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(78,'LF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(79,'CF_magnet_cost','v','None','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(80,'HF_magnet_shield_cost','v','The HF coils have annular shield with a U-shaped cross section:','MirrorFunc','TODO','TODO'); +INSERT INTO mirror_alg VALUES(81,'cal_P_f_CC','v','Mirror generated variable calculation for P_f_CC','MirrorFunc','P_f_CC = P_f - 2 * P_f_EP','MW'); +INSERT INTO mirror_alg VALUES(82,'cal_L_CC','v','Mirror generated variable calculation for L_CC','MirrorFunc','L_CC = P_f_CC / P_f_L','m'); +INSERT INTO mirror_alg VALUES(83,'cal_L_CF','v','Mirror generated variable calculation for L_CF','MirrorFunc','L_CF = 1.0','m'); +INSERT INTO mirror_alg VALUES(84,'cal_L','v','Mirror generated variable calculation for L','MirrorFunc','L = L_CC + 2 * L_EP + 2 * L_EC','m'); +INSERT INTO mirror_alg VALUES(85,'cal_V_vac','v','Mirror generated variable calculation for V_vac','MirrorFunc','V_vac = L * pi * a_EC**2','m3'); +INSERT INTO mirror_alg VALUES(86,'cal_P_alpha','v','Mirror generated variable calculation for P_alpha','MirrorFunc','P_alpha = P_f * E_alpha / E_DT','MW'); +INSERT INTO mirror_alg VALUES(87,'cal_P_n','v','Mirror generated variable calculation for P_n','MirrorFunc','P_n = P_f - P_alpha','MW'); +INSERT INTO mirror_alg VALUES(88,'cal_P_ine','v','Mirror generated variable calculation for P_ine','MirrorFunc','P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH','MW'); +INSERT INTO mirror_alg VALUES(89,'cal_P_pump','v','Mirror generated variable calculation for P_pump','MirrorFunc','P_pump = f_pump * M_n * P_n','MW'); +INSERT INTO mirror_alg VALUES(90,'cal_P_sub_cont','v','Mirror generated variable calculation for P_sub_cont','MirrorFunc','P_sub_cont = f_sub * P_f','MW'); +INSERT INTO mirror_alg VALUES(91,'cal_P_cryo','v','Mirror generated variable calculation for P_cryo','MirrorFunc','P_cryo = f_cryo * P_f','MW'); +INSERT INTO mirror_alg VALUES(92,'cal_P_other','v','Mirror generated variable calculation for P_other','MirrorFunc','P_other = P_pump + P_sub_cont + P_cryo','MW'); +INSERT INTO mirror_alg VALUES(93,'cal_P_in','v','Mirror generated variable calculation for P_in','MirrorFunc','P_in = P_NBI + P_ICRH + P_ECH','MW'); +INSERT INTO mirror_alg VALUES(94,'cal_P_th','v','Mirror generated variable calculation for P_th','MirrorFunc','P_th = M_n * P_n + eta_pump * P_pump','MW'); +INSERT INTO mirror_alg VALUES(95,'cal_P_the','v','Mirror generated variable calculation for P_the','MirrorFunc','P_the = eta_th * P_th','MW'); +INSERT INTO mirror_alg VALUES(96,'cal_P_DEC','v','Mirror generated variable calculation for P_DEC','MirrorFunc','P_DEC = P_in + P_alpha','MW'); +INSERT INTO mirror_alg VALUES(97,'cal_P_DECe','v','Mirror generated variable calculation for P_DECe','MirrorFunc','P_DECe = eta_DEC * P_DEC','MW'); +INSERT INTO mirror_alg VALUES(98,'cal_P_egross','v','Mirror generated variable calculation for P_egross','MirrorFunc','P_egross = P_DECe + P_the if application == ''electricity'' else P_DECe','MW'); +INSERT INTO mirror_alg VALUES(99,'cal_P_enet','v','Mirror generated variable calculation for P_enet','MirrorFunc','P_enet = P_egross - (P_ine + P_other)','MW'); +INSERT INTO mirror_alg VALUES(100,'cal_f_aux','v','Mirror generated variable calculation for f_aux','MirrorFunc','f_aux = P_aux / P_egross','1'); +INSERT INTO mirror_alg VALUES(101,'cal_Q_sci','v','Mirror generated variable calculation for Q_sci','MirrorFunc','Q_sci = P_f / P_in','1'); +INSERT INTO mirror_alg VALUES(102,'cal_Q_eng','v','Mirror generated variable calculation for Q_eng','MirrorFunc','Q_eng = P_egross / (P_ine + P_other)','1'); +INSERT INTO mirror_alg VALUES(103,'cal_f_refrac','v','Mirror generated variable calculation for f_refrac','MirrorFunc','f_refrac = 1 / Q_eng','1'); +INSERT INTO mirror_alg VALUES(104,'cal_CF_magnet_number','v','Mirror generated variable calculation for CF_magnet_number','MirrorFunc','CF_magnet_number = L_CC / L_CF','1'); CREATE TABLE mirror_var ( ind INTEGER DEFAULT NULL, var_name TEXT NOT NULL, @@ -7125,199 +7057,291 @@ CREATE TABLE mirror_var ( user_input INTEGER DEFAULT NULL, PRIMARY KEY (var_name) ); -INSERT INTO "mirror_var" VALUES(1,'E_DT','str','','1','','','P_alpha',''); -INSERT INTO "mirror_var" VALUES(2,'E_alpha','str','','1','','','P_alpha',''); -INSERT INTO "mirror_var" VALUES(3,'E_n','str','','1','E_DT, E_alpha','','',''); -INSERT INTO "mirror_var" VALUES(4,'m_T','str','','1','','','',''); -INSERT INTO "mirror_var" VALUES(5,'m_D','str','','1','','','',''); -INSERT INTO "mirror_var" VALUES(6,'m_6Li','str','','1','','','',''); -INSERT INTO "mirror_var" VALUES(7,'Wh_to_BTU','float',3.41214,'1','','','',''); -INSERT INTO "mirror_var" VALUES(8,'indentation','int',0.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(9,'indented_name','str','','1','account_name, account_number, indentation','','',''); -INSERT INTO "mirror_var" VALUES(10,'inputs','str','','1','NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness','','',''); -INSERT INTO "mirror_var" VALUES(11,'cost_data','str','','1','cost_account','','',''); -INSERT INTO "mirror_var" VALUES(12,'L_magnet_to_magnet','str','','1','inputs','','',''); -INSERT INTO "mirror_var" VALUES(13,'L_cylinder','str','','1','L_magnet_to_magnet','','',''); -INSERT INTO "mirror_var" VALUES(14,'expander_cell_cost_result','str','','1','expander_cell_cost, inputs','','',''); -INSERT INTO "mirror_var" VALUES(15,'end_plug_cylindrical_part','str','','1','L_cylinder, central_cell, inputs','','',''); -INSERT INTO "mirror_var" VALUES(16,'end_plug_cylindrical_part_cost','str','','1','end_plug_cylindrical_part','','',''); -INSERT INTO "mirror_var" VALUES(17,'central_cell_cylindrical_part','str','','1','central_cell, inputs','','',''); -INSERT INTO "mirror_var" VALUES(18,'central_cell_cylindrical_part_cost','str','','1','central_cell_cylindrical_part','','',''); -INSERT INTO "mirror_var" VALUES(19,'total_cost','str','','1','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result','','',''); -INSERT INTO "mirror_var" VALUES(20,'cost_factor','str','','1','inputs, np','','',''); -INSERT INTO "mirror_var" VALUES(21,'cost_pump','int',40000.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(22,'vpump_cap','str','','1','','','',''); -INSERT INTO "mirror_var" VALUES(23,'no_vpumps','str','','1','inputs, vpump_cap','','',''); -INSERT INTO "mirror_var" VALUES(24,'axis_t','str','','1','inputs, np','','',''); -INSERT INTO "mirror_var" VALUES(25,'axis_ir','str','','1','axis_t','','',''); -INSERT INTO "mirror_var" VALUES(26,'lr','str','','1','','','',''); -INSERT INTO "mirror_var" VALUES(27,'constructionworker','str','','1','axis_ir','','',''); -INSERT INTO "mirror_var" VALUES(28,'C_22_1_11_in','str','','1','inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(29,'C_22_1_11_1_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(30,'C_22_1_11_2_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(31,'C_22_1_11_3_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(32,'C_22_1_11_4_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(33,'C_22_1_11_5_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(34,'C_22_1_11_6_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(35,'C_22_1_11_7_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(36,'C_22_1_11_8_in','int',0.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(37,'C_22_1_11_9_in','str','','1','constructionworker, inputs, lr','','',''); -INSERT INTO "mirror_var" VALUES(38,'C_22_1_11_10_in','int',0.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(39,'C220111','str','','1','C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in','','',''); -INSERT INTO "mirror_var" VALUES(40,'inflation','float',1.43,'1','','','',''); -INSERT INTO "mirror_var" VALUES(41,'C2205010ITER','str','','1','inflation','','',''); -INSERT INTO "mirror_var" VALUES(42,'C2205020ITER','str','','1','inflation','','',''); -INSERT INTO "mirror_var" VALUES(43,'C2205030ITER','str','','1','inflation','','',''); -INSERT INTO "mirror_var" VALUES(44,'C2205040ITER','str','','1','inflation','','',''); -INSERT INTO "mirror_var" VALUES(45,'C2205050ITER','str','','1','inflation','','',''); -INSERT INTO "mirror_var" VALUES(46,'C2205060ITER','str','','1','inflation','','',''); -INSERT INTO "mirror_var" VALUES(47,'lcredit','float',0.8,'1','','','',''); -INSERT INTO "mirror_var" VALUES(48,'ltoak','str','','1','lcredit, np','','',''); -INSERT INTO "mirror_var" VALUES(49,'C220501','str','','1','C2205010ITER, ltoak','','',''); -INSERT INTO "mirror_var" VALUES(50,'C220502','str','','1','C2205020ITER, ltoak','','',''); -INSERT INTO "mirror_var" VALUES(51,'C220503','str','','1','C2205030ITER, ltoak','','',''); -INSERT INTO "mirror_var" VALUES(52,'C220504','str','','1','C2205040ITER, ltoak','','',''); -INSERT INTO "mirror_var" VALUES(53,'C220505','str','','1','C2205050ITER, ltoak','','',''); -INSERT INTO "mirror_var" VALUES(54,'C220506','str','','1','C2205060ITER, ltoak','','',''); -INSERT INTO "mirror_var" VALUES(55,'C220500','str','','1','C220501, C220502, C220503, C220504, C220505, C220506','','',''); -INSERT INTO "mirror_var" VALUES(56,'f_cr','float',0.09,'1','','','',''); -INSERT INTO "mirror_var" VALUES(57,'f_6Li_natural','float',0.075,'1','','','',''); -INSERT INTO "mirror_var" VALUES(58,'rho_6Li','float',460.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(59,'rho_7Li','float',537.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(60,'T_K','str','','1','T','','',''); -INSERT INTO "mirror_var" VALUES(61,'rho_PbLi','str','','1','T_K','','',''); -INSERT INTO "mirror_var" VALUES(62,'P_6Li075','float',15.152,'1','','','',''); -INSERT INTO "mirror_var" VALUES(63,'P_6Li90','int',70.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(64,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','1','','','',''); -INSERT INTO "mirror_var" VALUES(65,'Cf','list','(1, 2, 4, 8, 16)','1','','','',''); -INSERT INTO "mirror_var" VALUES(66,'f_interp','str','','1','Cf, f, scipy','','',''); -INSERT INTO "mirror_var" VALUES(67,'f_Li','float',0.17,'1','','','',''); -INSERT INTO "mirror_var" VALUES(68,'f_Pb','str','','1','f_Li','','',''); -INSERT INTO "mirror_var" VALUES(69,'P_Li','str','','1','Li_price, f_6Li','','',''); -INSERT INTO "mirror_var" VALUES(70,'P_PbLi','str','','1','P_Li, P_Pb, f_Li, f_Pb','','',''); -INSERT INTO "mirror_var" VALUES(71,'P_f_CC','str','','1','P_f, P_f_EP','P_f, P_f_EP','L_CC',''); -INSERT INTO "mirror_var" VALUES(72,'L_CC','str','','1','P_f_CC, P_f_L','P_f_CC, P_f_L','CF_magnet_number, L',''); -INSERT INTO "mirror_var" VALUES(73,'L_CF','float',1.0,'1','','','CF_magnet_number',''); -INSERT INTO "mirror_var" VALUES(74,'L','str','','1','L_CC, L_EC, L_EP','L_CC, L_EP, L_EC','V_vac',''); -INSERT INTO "mirror_var" VALUES(75,'V_vac','str','','1','L, a_EC, np','L, a_EC','',''); -INSERT INTO "mirror_var" VALUES(76,'P_alpha','str','','1','E_DT, E_alpha, P_f','E_DT, E_alpha, P_f','P_DEC, P_n',''); -INSERT INTO "mirror_var" VALUES(77,'P_n','str','','1','P_alpha, P_f','P_f, P_alpha','P_pump, P_th',''); -INSERT INTO "mirror_var" VALUES(78,'P_ine','str','','1','P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',''); -INSERT INTO "mirror_var" VALUES(79,'P_pump','str','','1','M_n, P_n, f_pump','f_pump, M_n, P_n','P_other, P_th',''); -INSERT INTO "mirror_var" VALUES(80,'P_sub_cont','str','','1','P_f, f_sub','f_sub, P_f','P_other',''); -INSERT INTO "mirror_var" VALUES(81,'P_cryo','str','','1','P_f, f_cryo','f_cryo, P_f','P_other',''); -INSERT INTO "mirror_var" VALUES(82,'P_other','str','','1','P_cryo, P_pump, P_sub_cont','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',''); -INSERT INTO "mirror_var" VALUES(83,'P_in','str','','1','P_ECH, P_ICRH, P_NBI','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',''); -INSERT INTO "mirror_var" VALUES(84,'P_th','str','','1','M_n, P_n, P_pump, eta_pump','M_n, P_n, P_pump, eta_pump','P_the',''); -INSERT INTO "mirror_var" VALUES(85,'P_the','str','','1','P_th, eta_th','eta_th, P_th','P_egross',''); -INSERT INTO "mirror_var" VALUES(86,'P_DEC','str','','1','P_alpha, P_in','P_in, P_alpha','P_DECe',''); -INSERT INTO "mirror_var" VALUES(87,'P_DECe','str','','1','P_DEC, eta_DEC','eta_DEC, P_DEC','P_egross',''); -INSERT INTO "mirror_var" VALUES(88,'P_egross','str','','1','P_DECe, P_the','application, P_DECe, P_the','P_enet, Q_eng, f_aux',''); -INSERT INTO "mirror_var" VALUES(89,'P_enet','str','','1','P_egross, P_ine, P_other','P_egross, P_ine, P_other','',''); -INSERT INTO "mirror_var" VALUES(90,'f_aux','str','','1','P_aux, P_egross','P_aux, P_egross','',''); -INSERT INTO "mirror_var" VALUES(91,'Q_sci','str','','1','P_f, P_in','P_f, P_in','',''); -INSERT INTO "mirror_var" VALUES(92,'Q_eng','str','','1','P_egross, P_ine, P_other','P_egross, P_ine, P_other','f_refrac',''); -INSERT INTO "mirror_var" VALUES(93,'f_refrac','str','','1','Q_eng','Q_eng','',''); -INSERT INTO "mirror_var" VALUES(94,'run_name','str','','1','P_f, float','','',''); -INSERT INTO "mirror_var" VALUES(95,'cost_file_full','str','','1','cost_file, pkg_resources','','',''); -INSERT INTO "mirror_var" VALUES(96,'new_data','str','','1','f_vol, material, name, pd, thickness','','',''); -INSERT INTO "mirror_var" VALUES(97,'r_in','str','','1','data','','',''); -INSERT INTO "mirror_var" VALUES(98,'r_out','str','','1','data','','',''); -INSERT INTO "mirror_var" VALUES(99,'radial_build','str','','1','create_radial_build, inputs','','',''); -INSERT INTO "mirror_var" VALUES(100,'filename','str','','1','inputs','','',''); -INSERT INTO "mirror_var" VALUES(101,'T','int',300.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(102,'material','str','','1','i, radial_build','','',''); -INSERT INTO "mirror_var" VALUES(103,'f_6Li','float',0.075,'1','','','',''); -INSERT INTO "mirror_var" VALUES(104,'radius','str','','1','inputs','','',''); -INSERT INTO "mirror_var" VALUES(105,'thickness','str','','1','inputs','','',''); -INSERT INTO "mirror_var" VALUES(106,'vv_material','str','','1','inputs','','',''); -INSERT INTO "mirror_var" VALUES(107,'V_end_cap','str','','1','np, radius, thickness','','',''); -INSERT INTO "mirror_var" VALUES(108,'M_end_cap','str','','1','V_end_cap, cost_data, vv_material','','',''); -INSERT INTO "mirror_var" VALUES(109,'C_end_cap','str','','1','M_end_cap, cost_data, vv_material','','',''); -INSERT INTO "mirror_var" VALUES(110,'total','str','','1','C_end_cap, radial_build','','',''); -INSERT INTO "mirror_var" VALUES(111,'cost','float',29.1,'1','','','',''); -INSERT INTO "mirror_var" VALUES(112,'a_M','float',0.15,'1','','','',''); -INSERT INTO "mirror_var" VALUES(113,'a_CC','float',0.54,'1','','','',''); -INSERT INTO "mirror_var" VALUES(114,'a_0','float',0.7,'1','','','',''); -INSERT INTO "mirror_var" VALUES(115,'length','float',0.5,'1','','','',''); -INSERT INTO "mirror_var" VALUES(116,'r_gap','float',0.1,'1','','','',''); -INSERT INTO "mirror_var" VALUES(117,'r_vv','float',0.01,'1','','','',''); -INSERT INTO "mirror_var" VALUES(118,'r_magnet','float',1.5,'m','','','',''); -INSERT INTO "mirror_var" VALUES(119,'r_cryostat','float',1.0,'1','','','',''); -INSERT INTO "mirror_var" VALUES(120,'f_vol','float',0.9,'1','','','',''); -INSERT INTO "mirror_var" VALUES(121,'V_radially_inner_cylinder','str','','1','V_cylindrical_shell, f_vol, length, r_in, r_out','','',''); -INSERT INTO "mirror_var" VALUES(122,'length_cc_cylinder','float',0.5,'1','','','',''); -INSERT INTO "mirror_var" VALUES(123,'r_in_cc','str','','1','a_CC, r_gap, r_vv','','',''); -INSERT INTO "mirror_var" VALUES(124,'r_out_cc','str','','1','r_in_cc','','',''); -INSERT INTO "mirror_var" VALUES(125,'V_cc_cylinder','str','','1','V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc','','',''); -INSERT INTO "mirror_var" VALUES(126,'V_cc_triangle','str','','1','V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc','','',''); -INSERT INTO "mirror_var" VALUES(127,'length_ep_cylinder','float',0.5,'1','','','',''); -INSERT INTO "mirror_var" VALUES(128,'r_in_ep','str','','1','a_0, r_gap, r_vv','','',''); -INSERT INTO "mirror_var" VALUES(129,'r_out_ep','str','','1','r_in_ep','','',''); -INSERT INTO "mirror_var" VALUES(130,'V_ep_cylinder','str','','1','V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep','','',''); -INSERT INTO "mirror_var" VALUES(131,'V_ep_triangle','str','','1','V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep','','',''); -INSERT INTO "mirror_var" VALUES(132,'V_total_cc_facing','str','','1','V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','','',''); -INSERT INTO "mirror_var" VALUES(133,'V_total_ec_facing','str','','1','V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','','',''); -INSERT INTO "mirror_var" VALUES(134,'V_total','str','','1','V_total_cc_facing, V_total_ec_facing','','',''); -INSERT INTO "mirror_var" VALUES(135,'mass','str','','1','V_total, cost_data, material','','',''); -INSERT INTO "mirror_var" VALUES(136,'application','Mirror input parameter','heat','1','','','P_egross',0); -INSERT INTO "mirror_var" VALUES(137,'P_f','Mirror input parameter',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); -INSERT INTO "mirror_var" VALUES(138,'P_f_L','Mirror input parameter',1.0,'MW/m','','','L_CC',0); -INSERT INTO "mirror_var" VALUES(139,'P_f_EP','Mirror input parameter',1.0,'MW','','','P_f_CC',0); -INSERT INTO "mirror_var" VALUES(140,'P_NBI','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); -INSERT INTO "mirror_var" VALUES(141,'P_ECH','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); -INSERT INTO "mirror_var" VALUES(142,'P_ICRH','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); -INSERT INTO "mirror_var" VALUES(143,'M_n','Mirror input parameter',1.1,'1','','','P_pump, P_th',0); -INSERT INTO "mirror_var" VALUES(144,'N_module','Mirror input parameter',1.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(145,'f_pump','Mirror input parameter',0.03,'1','','','P_pump',0); -INSERT INTO "mirror_var" VALUES(146,'f_sub','Mirror input parameter',0.04,'1','','','P_sub_cont',0); -INSERT INTO "mirror_var" VALUES(147,'f_cryo','Mirror input parameter',0.01,'1','','','P_cryo',0); -INSERT INTO "mirror_var" VALUES(148,'P_pfcool','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO "mirror_var" VALUES(149,'P_thcool','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO "mirror_var" VALUES(150,'P_coils','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO "mirror_var" VALUES(151,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); -INSERT INTO "mirror_var" VALUES(152,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); -INSERT INTO "mirror_var" VALUES(153,'eta_DEC','Mirror input parameter',0.9,'1','','','P_DECe',0); -INSERT INTO "mirror_var" VALUES(154,'eta_pump','Mirror input parameter',0.98,'1','','','P_th',0); -INSERT INTO "mirror_var" VALUES(155,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO "mirror_var" VALUES(156,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO "mirror_var" VALUES(157,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO "mirror_var" VALUES(158,'NOAK','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(159,'n_unit','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(160,'construction_time','Mirror input parameter',6.0,'years','','','',0); -INSERT INTO "mirror_var" VALUES(161,'lifetime','Mirror input parameter',30.0,'years','','','',0); -INSERT INTO "mirror_var" VALUES(162,'replacement','Mirror input parameter',10.0,'years','','','',0); -INSERT INTO "mirror_var" VALUES(163,'availability','Mirror input parameter',0.9,'1','','','',0); -INSERT INTO "mirror_var" VALUES(164,'discount','Mirror input parameter',0.0245,'1','','','',0); -INSERT INTO "mirror_var" VALUES(165,'LSA','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(166,'cost_file','Mirror input parameter','woodruff-data.csv','1','','','',0); -INSERT INTO "mirror_var" VALUES(167,'method','Mirror input parameter','new','1','','','',0); -INSERT INTO "mirror_var" VALUES(168,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(169,'include_tax','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(170,'include_licensing','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(171,'include_contingency','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(172,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(173,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(174,'a_EC','Mirror input parameter',1.0,'m','','','V_vac',0); -INSERT INTO "mirror_var" VALUES(175,'expander_cell_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(176,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO "mirror_var" VALUES(177,'vacuum_gap_CC','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(178,'first_wall_material','Mirror input parameter','W','1','','','',0); -INSERT INTO "mirror_var" VALUES(179,'first_wall_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(180,'vacuum_vessel_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO "mirror_var" VALUES(181,'vacuum_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(182,'multiplier_material','Mirror input parameter','Pb','1','','','',0); -INSERT INTO "mirror_var" VALUES(183,'multiplier_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(184,'blanket_coolant_material','Mirror input parameter','Natural PbLi','1','','','',0); -INSERT INTO "mirror_var" VALUES(185,'blanket_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(186,'blanket_coolant_fraction','Mirror input parameter',0.9,'1','','','',0); -INSERT INTO "mirror_var" VALUES(187,'blanket_structural_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO "mirror_var" VALUES(188,'blanket_structural_fraction','Mirror input parameter',0.1,'1','','','',0); -INSERT INTO "mirror_var" VALUES(189,'outer_vessel_thickness','Mirror input parameter',0.01,'m','','','',0); -INSERT INTO "mirror_var" VALUES(190,'L_EP','Mirror input parameter',1.0,'m','','','L',0); -INSERT INTO "mirror_var" VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L',0); -INSERT INTO "mirror_var" VALUES(192,'a_EP','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO "mirror_var" VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO "mirror_var" VALUES(195,'CF_magnet_number','Mirror generated parameter','','1','','L_CC, L_CF','',0); +INSERT INTO mirror_var VALUES(1,'E_DT','str',2.818234619999999798e-12,'J','','','P_alpha',0); +INSERT INTO mirror_var VALUES(2,'E_alpha','str',5.639673600000000402e-13,'J','','','P_alpha',0); +INSERT INTO mirror_var VALUES(3,'E_n','str','','1','E_DT, E_alpha','','',''); +INSERT INTO mirror_var VALUES(4,'m_T','str','','1','','','',''); +INSERT INTO mirror_var VALUES(5,'m_D','str','','1','','','',''); +INSERT INTO mirror_var VALUES(6,'m_6Li','str','','1','','','',''); +INSERT INTO mirror_var VALUES(7,'Wh_to_BTU','float',3.412139999999999951,'1','','','',''); +INSERT INTO mirror_var VALUES(8,'indentation','int',0.0,'1','','','',''); +INSERT INTO mirror_var VALUES(9,'indented_name','str','','1','account_name, account_number, indentation','','',''); +INSERT INTO mirror_var VALUES(10,'inputs','str','','1','NOAK, P_ECH, P_ICRH, P_NBI, P_f, P_f_L, application, availability, blanket_coolant_fraction, blanket_coolant_material, blanket_structural_fraction, blanket_structural_material, blanket_thickness, construction_time, cost_file, discount, first_wall_material, first_wall_thickness, generate_inputs, include_contingency, include_decommissioning, include_licensing, include_tax, kwargs, lifetime, method, multiplier_material, multiplier_thickness, n_unit, outer_vessel_thickness, replacement, save, vacuum_gap_CC, vacuum_vessel_material, vacuum_vessel_thickness','','',''); +INSERT INTO mirror_var VALUES(11,'cost_data','str','','1','cost_account','','',''); +INSERT INTO mirror_var VALUES(12,'L_magnet_to_magnet','str','','1','inputs','','',''); +INSERT INTO mirror_var VALUES(13,'L_cylinder','str','','1','L_magnet_to_magnet','','',''); +INSERT INTO mirror_var VALUES(14,'expander_cell_cost_result','str','','1','expander_cell_cost, inputs','','',''); +INSERT INTO mirror_var VALUES(15,'end_plug_cylindrical_part','str','','1','L_cylinder, central_cell, inputs','','',''); +INSERT INTO mirror_var VALUES(16,'end_plug_cylindrical_part_cost','str','','1','end_plug_cylindrical_part','','',''); +INSERT INTO mirror_var VALUES(17,'central_cell_cylindrical_part','str','','1','central_cell, inputs','','',''); +INSERT INTO mirror_var VALUES(18,'central_cell_cylindrical_part_cost','str','','1','central_cell_cylindrical_part','','',''); +INSERT INTO mirror_var VALUES(19,'total_cost','str','','1','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result','','',''); +INSERT INTO mirror_var VALUES(20,'cost_factor','str','','1','inputs, np','','',''); +INSERT INTO mirror_var VALUES(21,'cost_pump','int',40000.0,'1','','','',''); +INSERT INTO mirror_var VALUES(22,'vpump_cap','str','','1','','','',''); +INSERT INTO mirror_var VALUES(23,'no_vpumps','str','','1','inputs, vpump_cap','','',''); +INSERT INTO mirror_var VALUES(24,'axis_t','str','','1','inputs, np','','',''); +INSERT INTO mirror_var VALUES(25,'axis_ir','str','','1','axis_t','','',''); +INSERT INTO mirror_var VALUES(26,'lr','str','','1','','','',''); +INSERT INTO mirror_var VALUES(27,'constructionworker','str','','1','axis_ir','','',''); +INSERT INTO mirror_var VALUES(28,'C_22_1_11_in','str','','1','inputs, lr','','',''); +INSERT INTO mirror_var VALUES(29,'C_22_1_11_1_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(30,'C_22_1_11_2_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(31,'C_22_1_11_3_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(32,'C_22_1_11_4_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(33,'C_22_1_11_5_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(34,'C_22_1_11_6_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(35,'C_22_1_11_7_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(36,'C_22_1_11_8_in','int',0.0,'1','','','',''); +INSERT INTO mirror_var VALUES(37,'C_22_1_11_9_in','str','','1','constructionworker, inputs, lr','','',''); +INSERT INTO mirror_var VALUES(38,'C_22_1_11_10_in','int',0.0,'1','','','',''); +INSERT INTO mirror_var VALUES(39,'C220111','str','','1','C_22_1_11_10_in, C_22_1_11_1_in, C_22_1_11_2_in, C_22_1_11_3_in, C_22_1_11_4_in, C_22_1_11_5_in, C_22_1_11_6_in, C_22_1_11_7_in, C_22_1_11_8_in, C_22_1_11_9_in, C_22_1_11_in','','',''); +INSERT INTO mirror_var VALUES(40,'inflation','float',1.429999999999999938,'1','','','',''); +INSERT INTO mirror_var VALUES(41,'C2205010ITER','str','','1','inflation','','',''); +INSERT INTO mirror_var VALUES(42,'C2205020ITER','str','','1','inflation','','',''); +INSERT INTO mirror_var VALUES(43,'C2205030ITER','str','','1','inflation','','',''); +INSERT INTO mirror_var VALUES(44,'C2205040ITER','str','','1','inflation','','',''); +INSERT INTO mirror_var VALUES(45,'C2205050ITER','str','','1','inflation','','',''); +INSERT INTO mirror_var VALUES(46,'C2205060ITER','str','','1','inflation','','',''); +INSERT INTO mirror_var VALUES(47,'lcredit','float',0.8000000000000000444,'1','','','',''); +INSERT INTO mirror_var VALUES(48,'ltoak','str','','1','lcredit, np','','',''); +INSERT INTO mirror_var VALUES(49,'C220501','str','','1','C2205010ITER, ltoak','','',''); +INSERT INTO mirror_var VALUES(50,'C220502','str','','1','C2205020ITER, ltoak','','',''); +INSERT INTO mirror_var VALUES(51,'C220503','str','','1','C2205030ITER, ltoak','','',''); +INSERT INTO mirror_var VALUES(52,'C220504','str','','1','C2205040ITER, ltoak','','',''); +INSERT INTO mirror_var VALUES(53,'C220505','str','','1','C2205050ITER, ltoak','','',''); +INSERT INTO mirror_var VALUES(54,'C220506','str','','1','C2205060ITER, ltoak','','',''); +INSERT INTO mirror_var VALUES(55,'C220500','str','','1','C220501, C220502, C220503, C220504, C220505, C220506','','',''); +INSERT INTO mirror_var VALUES(56,'f_cr','float',0.08999999999999999667,'1','','','',''); +INSERT INTO mirror_var VALUES(57,'f_6Li_natural','float',0.07499999999999999723,'1','','','',''); +INSERT INTO mirror_var VALUES(58,'rho_6Li','float',460.0,'1','','','',''); +INSERT INTO mirror_var VALUES(59,'rho_7Li','float',537.0,'1','','','',''); +INSERT INTO mirror_var VALUES(60,'T_K','str','','1','T','','',''); +INSERT INTO mirror_var VALUES(61,'rho_PbLi','str','','1','T_K','','',''); +INSERT INTO mirror_var VALUES(62,'P_6Li075','float',15.15199999999999925,'1','','','',''); +INSERT INTO mirror_var VALUES(63,'P_6Li90','int',70.0,'1','','','',''); +INSERT INTO mirror_var VALUES(64,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','1','','','',''); +INSERT INTO mirror_var VALUES(65,'Cf','list','(1, 2, 4, 8, 16)','1','','','',''); +INSERT INTO mirror_var VALUES(66,'f_interp','str','','1','Cf, f, scipy','','',''); +INSERT INTO mirror_var VALUES(67,'f_Li','float',0.1700000000000000122,'1','','','',''); +INSERT INTO mirror_var VALUES(68,'f_Pb','str','','1','f_Li','','',''); +INSERT INTO mirror_var VALUES(69,'P_Li','str','','1','Li_price, f_6Li','','',''); +INSERT INTO mirror_var VALUES(70,'P_PbLi','str','','1','P_Li, P_Pb, f_Li, f_Pb','','',''); +INSERT INTO mirror_var VALUES(71,'P_f_CC','str',-1.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); +INSERT INTO mirror_var VALUES(72,'L_CC','str',-1.0,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L',0); +INSERT INTO mirror_var VALUES(73,'L_CF','float',1.0,'m','cal_L_CF','','CF_magnet_number',0); +INSERT INTO mirror_var VALUES(74,'L','str',3.0,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); +INSERT INTO mirror_var VALUES(75,'V_vac','str',9.42477796076937935,'m3','cal_V_vac','L, a_EC','',0); +INSERT INTO mirror_var VALUES(76,'P_alpha','str',0.2001137009664582522,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); +INSERT INTO mirror_var VALUES(77,'P_n','str',0.7998862990335418033,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(78,'P_ine','str',6.0,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(79,'P_pump','str',0.02639624786810687921,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); +INSERT INTO mirror_var VALUES(80,'P_sub_cont','str',0.04000000000000000083,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); +INSERT INTO mirror_var VALUES(81,'P_cryo','str',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); +INSERT INTO mirror_var VALUES(82,'P_other','str',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(83,'P_in','str',3.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); +INSERT INTO mirror_var VALUES(84,'P_th','str',0.9057432518476407068,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); +INSERT INTO mirror_var VALUES(85,'P_the','str',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); +INSERT INTO mirror_var VALUES(86,'P_DEC','str',3.200113700966458197,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); +INSERT INTO mirror_var VALUES(87,'P_DECe','str',2.880102330869812377,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); +INSERT INTO mirror_var VALUES(88,'P_egross','str',2.880102330869812377,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); +INSERT INTO mirror_var VALUES(89,'P_enet','str',-3.196293916998294904,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); +INSERT INTO mirror_var VALUES(90,'f_aux','str',0.3472098853161209031,'1','cal_f_aux','P_aux, P_egross','',0); +INSERT INTO mirror_var VALUES(91,'Q_sci','str',0.3333333333333333148,'1','cal_Q_sci','P_f, P_in','',0); +INSERT INTO mirror_var VALUES(92,'Q_eng','str',0.4739819809941280825,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); +INSERT INTO mirror_var VALUES(93,'f_refrac','str',2.109784844357592614,'1','cal_f_refrac','Q_eng','',0); +INSERT INTO mirror_var VALUES(94,'run_name','str','','1','P_f, float','','',''); +INSERT INTO mirror_var VALUES(95,'cost_file_full','str','','1','cost_file, pkg_resources','','',''); +INSERT INTO mirror_var VALUES(96,'new_data','str','','1','f_vol, material, name, pd, thickness','','',''); +INSERT INTO mirror_var VALUES(97,'r_in','str','','1','data','','',''); +INSERT INTO mirror_var VALUES(98,'r_out','str','','1','data','','',''); +INSERT INTO mirror_var VALUES(99,'radial_build','str','','1','create_radial_build, inputs','','',''); +INSERT INTO mirror_var VALUES(100,'filename','str','','1','inputs','','',''); +INSERT INTO mirror_var VALUES(101,'T','int',300.0,'1','','','',''); +INSERT INTO mirror_var VALUES(102,'material','str','','1','i, radial_build','','',''); +INSERT INTO mirror_var VALUES(103,'f_6Li','float',0.07499999999999999723,'1','','','',''); +INSERT INTO mirror_var VALUES(104,'radius','str','','1','inputs','','',''); +INSERT INTO mirror_var VALUES(105,'thickness','str','','1','inputs','','',''); +INSERT INTO mirror_var VALUES(106,'vv_material','str','','1','inputs','','',''); +INSERT INTO mirror_var VALUES(107,'V_end_cap','str','','1','np, radius, thickness','','',''); +INSERT INTO mirror_var VALUES(108,'M_end_cap','str','','1','V_end_cap, cost_data, vv_material','','',''); +INSERT INTO mirror_var VALUES(109,'C_end_cap','str','','1','M_end_cap, cost_data, vv_material','','',''); +INSERT INTO mirror_var VALUES(110,'total','str','','1','C_end_cap, radial_build','','',''); +INSERT INTO mirror_var VALUES(111,'cost','float',29.10000000000000142,'1','','','',''); +INSERT INTO mirror_var VALUES(112,'a_M','float',0.1499999999999999945,'1','','','',''); +INSERT INTO mirror_var VALUES(113,'a_CC','float',0.5400000000000000355,'1','','','',''); +INSERT INTO mirror_var VALUES(114,'a_0','float',0.6999999999999999556,'1','','','',''); +INSERT INTO mirror_var VALUES(115,'length','float',0.5,'1','','','',''); +INSERT INTO mirror_var VALUES(116,'r_gap','float',0.1000000000000000055,'1','','','',''); +INSERT INTO mirror_var VALUES(117,'r_vv','float',0.0100000000000000002,'1','','','',''); +INSERT INTO mirror_var VALUES(118,'r_magnet','float',1.5,'m','','','',''); +INSERT INTO mirror_var VALUES(119,'r_cryostat','float',1.0,'1','','','',''); +INSERT INTO mirror_var VALUES(120,'f_vol','float',0.9000000000000000222,'1','','','',''); +INSERT INTO mirror_var VALUES(121,'V_radially_inner_cylinder','str','','1','V_cylindrical_shell, f_vol, length, r_in, r_out','','',''); +INSERT INTO mirror_var VALUES(122,'length_cc_cylinder','float',0.5,'1','','','',''); +INSERT INTO mirror_var VALUES(123,'r_in_cc','str','','1','a_CC, r_gap, r_vv','','',''); +INSERT INTO mirror_var VALUES(124,'r_out_cc','str','','1','r_in_cc','','',''); +INSERT INTO mirror_var VALUES(125,'V_cc_cylinder','str','','1','V_cylindrical_shell, f_vol, length_cc_cylinder, r_in_cc, r_out_cc','','',''); +INSERT INTO mirror_var VALUES(126,'V_cc_triangle','str','','1','V_inverse_triangular_washer, f_vol, length_cc_cylinder, r_in, r_in_cc','','',''); +INSERT INTO mirror_var VALUES(127,'length_ep_cylinder','float',0.5,'1','','','',''); +INSERT INTO mirror_var VALUES(128,'r_in_ep','str','','1','a_0, r_gap, r_vv','','',''); +INSERT INTO mirror_var VALUES(129,'r_out_ep','str','','1','r_in_ep','','',''); +INSERT INTO mirror_var VALUES(130,'V_ep_cylinder','str','','1','V_cylindrical_shell, f_vol, length_ep_cylinder, r_in_ep, r_out_ep','','',''); +INSERT INTO mirror_var VALUES(131,'V_ep_triangle','str','','1','V_inverse_triangular_washer, f_vol, length_ep_cylinder, r_in, r_in_ep','','',''); +INSERT INTO mirror_var VALUES(132,'V_total_cc_facing','str','','1','V_cc_cylinder, V_cc_triangle, V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','','',''); +INSERT INTO mirror_var VALUES(133,'V_total_ec_facing','str','','1','V_ep_cylinder, V_ep_triangle, V_radially_inner_cylinder','','',''); +INSERT INTO mirror_var VALUES(134,'V_total','str','','1','V_total_cc_facing, V_total_ec_facing','','',''); +INSERT INTO mirror_var VALUES(135,'mass','str','','1','V_total, cost_data, material','','',''); +INSERT INTO mirror_var VALUES(136,'application','Mirror input parameter','heat','1','','','P_egross',0); +INSERT INTO mirror_var VALUES(137,'P_f','Mirror input parameter',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); +INSERT INTO mirror_var VALUES(138,'P_f_L','Mirror input parameter',1.0,'MW/m','','','L_CC',0); +INSERT INTO mirror_var VALUES(139,'P_f_EP','Mirror input parameter',1.0,'MW','','','P_f_CC',0); +INSERT INTO mirror_var VALUES(140,'P_NBI','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(141,'P_ECH','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(142,'P_ICRH','Mirror input parameter',1.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(143,'M_n','Mirror input parameter',1.100000000000000089,'1','','','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(144,'N_module','Mirror input parameter',1.0,'1','','','',0); +INSERT INTO mirror_var VALUES(145,'f_pump','Mirror input parameter',0.02999999999999999889,'1','','','P_pump',0); +INSERT INTO mirror_var VALUES(146,'f_sub','Mirror input parameter',0.04000000000000000083,'1','','','P_sub_cont',0); +INSERT INTO mirror_var VALUES(147,'f_cryo','Mirror input parameter',0.0100000000000000002,'1','','','P_cryo',0); +INSERT INTO mirror_var VALUES(148,'P_pfcool','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(149,'P_thcool','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(150,'P_coils','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(151,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); +INSERT INTO mirror_var VALUES(152,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); +INSERT INTO mirror_var VALUES(153,'eta_DEC','Mirror input parameter',0.9000000000000000222,'1','','','P_DECe',0); +INSERT INTO mirror_var VALUES(154,'eta_pump','Mirror input parameter',0.979999999999999983,'1','','','P_th',0); +INSERT INTO mirror_var VALUES(155,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(156,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(157,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(158,'NOAK','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(159,'n_unit','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(160,'construction_time','Mirror input parameter',6.0,'years','','','',0); +INSERT INTO mirror_var VALUES(161,'lifetime','Mirror input parameter',30.0,'years','','','',0); +INSERT INTO mirror_var VALUES(162,'replacement','Mirror input parameter',10.0,'years','','','',0); +INSERT INTO mirror_var VALUES(163,'availability','Mirror input parameter',0.9000000000000000222,'1','','','',0); +INSERT INTO mirror_var VALUES(164,'discount','Mirror input parameter',0.02450000000000000094,'1','','','',0); +INSERT INTO mirror_var VALUES(165,'LSA','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(166,'cost_file','Mirror input parameter','woodruff-data.csv','1','','','',0); +INSERT INTO mirror_var VALUES(167,'method','Mirror input parameter','new','1','','','',0); +INSERT INTO mirror_var VALUES(168,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(169,'include_tax','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(170,'include_licensing','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(171,'include_contingency','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(172,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(173,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(174,'a_EC','Mirror input parameter',1.0,'m','','','V_vac',0); +INSERT INTO mirror_var VALUES(175,'expander_cell_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(176,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(177,'vacuum_gap_CC','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(178,'first_wall_material','Mirror input parameter','W','1','','','',0); +INSERT INTO mirror_var VALUES(179,'first_wall_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(180,'vacuum_vessel_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(181,'vacuum_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(182,'multiplier_material','Mirror input parameter','Pb','1','','','',0); +INSERT INTO mirror_var VALUES(183,'multiplier_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(184,'blanket_coolant_material','Mirror input parameter','Natural PbLi','1','','','',0); +INSERT INTO mirror_var VALUES(185,'blanket_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(186,'blanket_coolant_fraction','Mirror input parameter',0.9000000000000000222,'1','','','',0); +INSERT INTO mirror_var VALUES(187,'blanket_structural_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(188,'blanket_structural_fraction','Mirror input parameter',0.1000000000000000055,'1','','','',0); +INSERT INTO mirror_var VALUES(189,'outer_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(190,'L_EP','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO mirror_var VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO mirror_var VALUES(192,'a_EP','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','',0); +INSERT INTO mirror_var VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(195,'CF_magnet_number','Mirror generated parameter',-1.0,'1','cal_CF_magnet_number','L_CC, L_CF','',0); +CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); +INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.54000000284,0,'','Unchanged',0.004687831810420024433,'','million',''); +INSERT INTO mirror_acco VALUES(2,'11','Land_and_Land_Rights',1186117.539999999804,1,'1','Unchanged',0.0002298971517736676198,'','million',''); +INSERT INTO mirror_acco VALUES(3,'12','Site_Permits',10000000.0,1,'1','Unchanged',0.001938232460281024469,'','million',''); +INSERT INTO mirror_acco VALUES(4,'13','Plant_Licensing',0.0,1,'1','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(5,'14','Plant_Permits',5000000.0,1,'1','Unchanged',0.000969116230140512235,'','million',''); +INSERT INTO mirror_acco VALUES(6,'15','Plant_Studies',5000000.0,1,'1','Unchanged',0.000969116230140512235,'','million',''); +INSERT INTO mirror_acco VALUES(7,'16','Plant_Reports',2000000.0,1,'1','Unchanged',0.0003876464920562048719,'','million',''); +INSERT INTO mirror_acco VALUES(8,'17','Other_Pre-Construction_Costs',1000000.0,1,'1','Unchanged',0.0001938232460281024359,'','million',''); +INSERT INTO mirror_acco VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,1,'1','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298175963.0,0,'','Unchanged',0.2516166790643177831,'Account_C20','million','rollup'); +INSERT INTO mirror_acco VALUES(11,'21','Structures_and_Improvements',112945794.0999999941,1,'2','Unchanged',0.02189152043768370289,'Account_C21','million','rollup'); +INSERT INTO mirror_acco VALUES(12,'211','Site_Preparation/Yard_Work',42376414.42000000178,2,'21','Unchanged',0.008213534197916488519,'Account_C21_1','million','P_egross'); +INSERT INTO mirror_acco VALUES(13,'212','Heat_Island_Building',29536993.33999999986,2,'21','Unchanged',0.005724955927069242875,'Account_C21_2','million','P_egross'); +INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',8538531.264999998733,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','application, P_egross'); +INSERT INTO mirror_acco VALUES(15,'214','Heat_Exchanger_Building',5976971.884999999776,2,'21','Unchanged',0.001158476092169406302,'Account_C21_4','million','P_egross'); +INSERT INTO mirror_acco VALUES(16,'215','Power_Supply_and_Energy_Storage',1707706.253000000026,2,'21','Unchanged',0.0003309931692189479568,'Account_C21_5','million','P_egross'); +INSERT INTO mirror_acco VALUES(17,'216','Reactor_Auxiliaries',853853.1265000000131,2,'21','Unchanged',0.0001654965846094739784,'Account_C21_6','million','P_egross'); +INSERT INTO mirror_acco VALUES(18,'217','Hot_Cell',14768496.66999999993,2,'21','Unchanged',0.002862477963534621437,'Account_C21_7','million','P_egross'); +INSERT INTO mirror_acco VALUES(19,'218','Reactor_Services',2956861.753000000026,2,'21','Unchanged',0.0005731085430228053398,'Account_C21_8','million','P_egross'); +INSERT INTO mirror_acco VALUES(20,'219','Service_Water',47436.28480000000126,2,'21','Unchanged',9.194254699449536794e-06,'Account_C21_9','million','P_egross'); +INSERT INTO mirror_acco VALUES(21,'2110','Fuel_Storage',173933.0443000000086,2,'21','Unchanged',3.371226723777574368e-05,'Account_C21_10','million','P_egross'); +INSERT INTO mirror_acco VALUES(22,'2111','Control_Room',142308.8543999999819,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_11','million','P_egross'); +INSERT INTO mirror_acco VALUES(23,'2112','Onsite_AC_Power',126496.7595000000001,2,'21','Unchanged',2.45180125383262035e-05,'Account_C21_12','million','P_egross'); +INSERT INTO mirror_acco VALUES(24,'2113','Administration',695732.1770999999716,2,'21','Unchanged',0.0001348490689317206382,'Account_C21_13','million','P_egross'); +INSERT INTO mirror_acco VALUES(25,'2114','Site_Services',252993.5190000000002,2,'21','Unchanged',4.903602507665240699e-05,'Account_C21_14','million','P_egross'); +INSERT INTO mirror_acco VALUES(26,'2115','Cryogenics',379490.2784000000101,2,'21','Unchanged',7.355403759559629436e-05,'Account_C21_15','million','P_egross'); +INSERT INTO mirror_acco VALUES(27,'2116','Security',142308.8543999999819,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_16','million','P_egross'); +INSERT INTO mirror_acco VALUES(28,'2117','Ventilation_Stack',4269265.632000000216,2,'21','Unchanged',0.0008274829229504581827,'Account_C21_17','million','P_egross'); +INSERT INTO mirror_acco VALUES(29,'22','Heat_Island_Plant_Equipment',1111998920.0,1,'2','Unchanged',0.2155312402541442185,'Account_C22','million','rollup'); +INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',901967566.7999999524,2,'22','Unchanged',0.1748222816092453169,'Account_C22_1','million','rollup'); +INSERT INTO mirror_acco VALUES(31,'2211','First_Wall_and_Blanket',43193434.21000000089,3,'221','Unchanged',0.00837189162568348702,'Account_C22_1_1','million','L_CC, L_EP'); +INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',94736955.7399999947,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million',''); +INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'Account_C22_1_3','million','rollup'); +INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number'); +INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number'); +INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million',''); +INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',0.04408567877882998281,'Account_C22_1_4','million','rollup'); +INSERT INTO mirror_acco VALUES(38,'22141','NBI',105963000.0,4,'2214','Unchanged',0.0205380926188758195,'Account_C22_1_4_1','million','P_NBI, n_unit'); +INSERT INTO mirror_acco VALUES(39,'22142','ICRH',41490000.0,4,'2214','Unchanged',0.008041726477705971043,'Account_C22_1_4_2','million','P_ICRH, n_unit'); +INSERT INTO mirror_acco VALUES(40,'22143','ECH',80000000.0,4,'2214','Unchanged',0.01550585968224819574,'Account_C22_1_4_3','million','P_ECH, n_unit'); +INSERT INTO mirror_acco VALUES(41,'2215','Primary_Structure_and_Support',0.0,3,'221','Unchanged',0.0,'Account_C22_1_5','million',''); +INSERT INTO mirror_acco VALUES(42,'2216','Vacuum_System',2031827.257000000217,3,'221','Unchanged',0.0003938153543201155615,'Account_C22_1_6','million','rollup'); +INSERT INTO mirror_acco VALUES(43,'22162','Vessel_Refrigerators',0.0,4,'2216','Unchanged',0.0,'Account_C22_1_6_2','million',''); +INSERT INTO mirror_acco VALUES(44,'22163','Primary_Vacuum_Pumps',1689827.256999999984,4,'2216','Unchanged',0.0003275278041785044783,'Account_C22_1_6_3','million','V_vac'); +INSERT INTO mirror_acco VALUES(45,'22164','Backing_Vacuum_Pumps',342000.0,4,'2216','Unchanged',6.628755014161104265e-05,'Account_C22_1_6_4','million',''); +INSERT INTO mirror_acco VALUES(46,'2217','Power_Supplies',0.0,3,'221','Unchanged',0.0,'Account_C22_1_7','million',''); +INSERT INTO mirror_acco VALUES(47,'2218','Divertor',0.0,3,'221','Unchanged',0.0,'Account_C22_1_8','million',''); +INSERT INTO mirror_acco VALUES(48,'2219','Direct_Energy_Convertor',109317164.7999999971,3,'221','Unchanged',0.02118820772812501919,'Account_C22_1_9','million','P_DECe, n_unit'); +INSERT INTO mirror_acco VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9000000059,3,'221','Unchanged',0.02969279247112800724,'Account_C22_1_11','million','construction_time, N_module, L, n_unit'); +INSERT INTO mirror_acco VALUES(50,'222','Main_and_Secondary_Coolant',33649451.5,2,'22','Unchanged',0.006522045916795200273,'Account_C22_2','million','rollup'); +INSERT INTO mirror_acco VALUES(51,'223','Auxiliary_Cooling_Systems',352198.2635000000009,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); +INSERT INTO mirror_acco VALUES(52,'224','Radioactive_Waste_Treatment',627553.269500000053,2,'22','Unchanged',0.0001216344117500385732,'Account_C22_4','million','P_th'); +INSERT INTO mirror_acco VALUES(53,'225','Fuel_Handling_and_Storage',88654052.28999999166,2,'22','Unchanged',0.01718321618839292741,'Account_C22_5','million','n_unit'); +INSERT INTO mirror_acco VALUES(54,'226','Other_Heat_Island_Equipment',1748097.851999999956,2,'22','Unchanged',0.0003388220000493933943,'Account_C22_6','million','P_enet'); +INSERT INTO mirror_acco VALUES(55,'227','Instrumentation_and_Control',85000000.0,2,'22','Unchanged',0.01647497591238870906,'Account_C22_7','million',''); +INSERT INTO mirror_acco VALUES(56,'23','Turbine_Plant_Equipment',39822761.09000000358,1,'2','Unchanged',0.007718576820265415049,'Account_C23','million','P_egross, N_module'); +INSERT INTO mirror_acco VALUES(57,'24','Electric_Plant_Equipment',9819310.95399999992,1,'2','Unchanged',0.001903210722863583459,'Account_C24','million','P_egross, N_module'); +INSERT INTO mirror_acco VALUES(58,'25','Miscellaneous_Plant_Equipment',6909885.486000000499,1,'2','Unchanged',0.001339296434578992169,'Account_C25','million','P_egross, N_module'); +INSERT INTO mirror_acco VALUES(59,'26','Heat_Rejection',11679291.32000000029,1,'2','Unchanged',0.002263718154950241507,'Account_C26','million','P_enet, N_module'); +INSERT INTO mirror_acco VALUES(60,'27','Special_Materials',0.0,1,'2','Unchanged',0.0,'Account_C27','million',''); +INSERT INTO mirror_acco VALUES(61,'28','Digital_Twin/Simulator',5000000.0,1,'2','Unchanged',0.000969116230140512235,'Account_C28','million',''); +INSERT INTO mirror_acco VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'2','Unchanged',0.0,'Account_C29','million','rollup'); +INSERT INTO mirror_acco VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71591970.57999999822,0,'','Unchanged',0.01387618812736401107,'','million',''); +INSERT INTO mirror_acco VALUES(64,'31','Field_Indirect_Costs',14318394.12000000104,1,'3','Unchanged',0.002775237626248095324,'','million',''); +INSERT INTO mirror_acco VALUES(65,'32','Construction_Supervision',35795985.28999999911,1,'3','Unchanged',0.006938094063682005535,'','million',''); +INSERT INTO mirror_acco VALUES(66,'33','Commissioning_and_Start-Up_Costs',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(67,'34','Demonstration_Test_Run',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(68,'35','Design_Services_Offsite',21477591.17000000179,1,'3','Unchanged',0.004162856437433910644,'','million',''); +INSERT INTO mirror_acco VALUES(69,'36','PM/CM_Services_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(70,'37','Design_Servies_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(71,'38','PM/CM_Services_Onsite',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(72,'39','Contingency_on_Support_Services',0.0,1,'3','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',155781115.5999999941,0,'','Unchanged',0.03019400149547106504,'','million',''); +INSERT INTO mirror_acco VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',37837192.60999999941,0,'','Unchanged',0.007333727492260730397,'','million',''); +INSERT INTO mirror_acco VALUES(75,'51','Shipping_and_Transportation_Costs',8000000.0,1,'5','Unchanged',0.001550585968224819487,'','million',''); +INSERT INTO mirror_acco VALUES(76,'52','Spare_Parts',7323124.885999999941,1,'5','Unchanged',0.001419391836473697482,'','million',''); +INSERT INTO mirror_acco VALUES(77,'53','Taxes',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(78,'54','Insurance',1000000.0,1,'5','Unchanged',0.0001938232460281024359,'','million',''); +INSERT INTO mirror_acco VALUES(79,'55','Initial_Fuel_Load',21514067.71999999881,1,'5','Unchanged',0.004169926440758816612,'','million',''); +INSERT INTO mirror_acco VALUES(80,'58','Decommissioning_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(81,'59','Contingency_on_Supplementary_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',195409441.2000000179,0,'','Unchanged',0.03787489219792161688,'','million',''); +INSERT INTO mirror_acco VALUES(83,'61','Escalation',20125000.0,1,'6','Unchanged',0.003900692826315561857,'','million',''); +INSERT INTO mirror_acco VALUES(84,'62','Fees',0.0,1,'6','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(85,'63','Interest_During_Construction_(IDC)',175284441.2000000179,1,'6','Unchanged',0.03397419937160605503,'','million',''); +INSERT INTO mirror_acco VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,1,'6','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1587572359.0,0,'','Unchanged',0.3077084279258719967,'','million',''); +INSERT INTO mirror_acco VALUES(88,'TCC','Total_Capital_Cost_(TCC)',1782981801.0,0,'','Unchanged',0.3455833202788521908,'','million',''); +INSERT INTO mirror_acco VALUES(89,'O&M','Operations_and_Maintenance',5694900.279999999329,0,'','Unchanged',0.001103804058075949327,'','million',''); +INSERT INTO mirror_acco VALUES(90,'Fuel','Fuel',109004.2081000000034,0,'','Unchanged',2.112754944466477681e-05,'','million',''); +INSERT INTO mirror_acco VALUES(91,'81','Deuterium',47391.17656999999599,1,'8','Unchanged',9.185511675888353413e-06,'','million',''); COMMIT; diff --git a/src/etc/accert.sch b/src/etc/accert.sch index 5bfc14d..b00f728 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -797,7 +797,7 @@ heatpipe_var_names = ['land_surface_area' 'containment_subVolume' 'Containment_h fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'anncap' 'anncdr' 'anncp' 'anndecom' 'anndiv' 'annfuel' 'annfwbl' 'annoam' 'annwst' 'areaoh' 'awpoh' 'b0' 'bktlife' 'blmass' 'capcost' 'cconfix' 'cconshpf' 'cconshtf' 'cdcost' 'cdirt' 'cdriv0' 'cdriv1' 'cdriv2' 'cdriv3' 'cdrlife' 'cfactr' 'cfind_0' 'cfind_1' 'cfind_2' 'cfind_3' 'cland' 'clgsmass' 'cmlsa' 'coecdr' 'coecp' 'coediv' 'coefuel' 'coefwbl' 'coewst' 'coilmass' 'convol' 'coolmass' 'coolwh' 'cowner' 'cplife' 'cpstcst' 'cpttf' 'crfcdr' 'crfcp' 'crfdiv' 'crffwbl' 'crypmw' 'cryvol' 'csi' 'cturbb' 'd_0' 'd_1' 'd_2' 'd_3' 'dcdrv0' 'dcdrv1' 'dcdrv2' 'dcond_0' 'dcond_1' 'dcond_2' 'dcond_3' 'dcond_4' 'dcond_5' 'dcond_6' 'dcond_7' 'dcond_8' 'dcopper' 'decomf' 'dens' 'denstl' 'dintrt' 'discount_rate' 'divcst' 'divlife' 'divsur' 'dlscal' 'drbi' 'dtlife' 'dtstor' 'dvrtmass' 'ealphadt' 'echarge' 'echpwr' 'edrive' 'effrfss' 'elevol' 'ensxpfm' 'esbldgm3' 'estotftgj' 'etadrv' 'expcry' 'expel' 'expepe' 'exphts' 'exprb' 'exprf' 'exptpe' 'faccd' 'faccdfix' 'fachtmw' 'fburn' 'fcap0' 'fcap0cp' 'fcdfuel' 'fcontng' 'fcr0' 'fcsht' 'fcuohsu' 'fcupfsu' 'fefcdr' 'fefcp' 'fefdiv' 'feffwbl' 'fhe3' 'fkind' 'fncmass' 'fndt' 'ftrit' 'fusionrate' 'fwallcst' 'fwarea' 'fwbllife' 'fwmass' 'fwmatm' 'gain' 'gsmass' 'hccl' 'hcwt' 'helpow' 'hrbi' 'i_tf_sc_mat' 'i_tf_sup' 'iblanket' 'iefrf' 'ife' 'ifedrv' 'ifueltyp' 'imax' 'intercoil_surface' 'iohcl' 'ipfres' 'ireactor' 'istore' 'isumatoh' 'isumatpf' 'itart' 'l1' 'lpulse' 'lsa' 'ltot' 'mbvfac' 'mcdriv' 'n_day_year' 'n_tf' 'n_tf_turn' 'nohc' 'nphx' 'ntype' 'nvduct' 'oh_steel_frac' 'pacpmw' 'palpnb' 'peakmva' 'pfbldgm3' 'pfckts' 'pfmass' 'pfwdiv' 'pfwndl' 'pgrossmw' 'pheat' 'pibv' 'pinjht' 'pinjwp' 'plascur' 'plhybd' 'pnbitot' 'pnetelmw' 'pnucblkt' 'pnucshld' 'powfmw' 'pthermmw' 'r0' 'rbrt' 'rbvfac' 'rbvol' 'rbwt' 'reprat' 'ric_0' 'ric_1' 'ric_2' 'ric_3' 'ric_4' 'ric_5' 'ric_6' 'rjconpf_0' 'rjconpf_1' 'rjconpf_10' 'rjconpf_11' 'rjconpf_12' 'rjconpf_13' 'rjconpf_14' 'rjconpf_15' 'rjconpf_16' 'rjconpf_17' 'rjconpf_18' 'rjconpf_19' 'rjconpf_2' 'rjconpf_20' 'rjconpf_21' 'rjconpf_3' 'rjconpf_4' 'rjconpf_5' 'rjconpf_6' 'rjconpf_7' 'rjconpf_8' 'rjconpf_9' 'rmbvol' 'rndfuel' 'rpf_0' 'rpf_1' 'rpf_2' 'rpf_3' 'rpf_4' 'rpf_5' 'rpf_6' 'shh' 'shldmass' 'shm' 'shmatm' 'shmf' 'shovol' 'shri' 'shro' 'sigal' 'spfbusl' 'srcktpm' 'st_f_b' 'st_f_n' 'st_f_r' 'stcl' 'stella_config_coillength' 'stella_config_coilsurface' 'targtm' 'tburn' 'tcycle' 'tdown' 'tdspmw' 'tf_h_width' 'tfacmw' 'tfbusl' 'tfbusmas' 'tfcbv' 'tfckw' 'tfcmw' 'tfhmax' 'tfleng' 'tfmass' 'tftort' 'tlife' 'tlvpmw' 'tmpcry' 'trcl' 'trithtmw' 'triv' 'turns_0' 'turns_1' 'turns_2' 'turns_3' 'turns_4' 'turns_5' 'turns_6' 'twopi' 'ucad' 'ucaf' 'ucahts' 'ucap' 'ucblbe' 'ucblbreed' 'ucblli' 'ucblli2o' 'ucbllipb' 'ucblss' 'ucblvd' 'ucbpmp' 'ucbus' 'uccarb' 'uccase' 'ucco' 'ucconc' 'uccpcl1' 'uccpclb' 'uccpmp' 'uccr' 'uccry' 'uccryo' 'uccu' 'ucdgen' 'ucdiv' 'ucdtc' 'ucduct' 'ucech' 'ucel' 'ucf1' 'ucfnc' 'ucfpr' 'ucfuel' 'ucfwa' 'ucfwps' 'ucfws' 'ucgss' 'uche3' 'uchrs' 'uchts_0' 'uchts_1' 'uciac' 'ucich' 'ucint' 'uclh' 'uclv' 'ucmb' 'ucme' 'ucmisc' 'ucnbi' 'ucnbv' 'ucoam_0' 'ucoam_1' 'ucoam_2' 'ucoam_3' 'ucpens' 'ucpfb' 'ucpfbk' 'ucpfbs' 'ucpfcb' 'ucpfdr1' 'ucpfic' 'ucpfps' 'ucphx' 'ucpp' 'ucrb' 'ucsc_0' 'ucsc_1' 'ucsc_2' 'ucsc_3' 'ucsc_4' 'ucsc_5' 'ucsc_6' 'ucsc_7' 'ucsc_8' 'ucsh' 'ucshld' 'ucswyd' 'uctarg' 'uctfbr' 'uctfbus' 'uctfdr' 'uctfgr' 'uctfic' 'uctfps' 'uctfsw' 'uctpmp' 'uctr' 'ucturb_0' 'ucturb_1' 'ucvalv' 'ucvdsh' 'ucviac' 'ucwindpf' 'ucwindtf' 'ucws' 'ucwst_0' 'ucwst_1' 'ucwst_2' 'ucwst_3' 'umass' 'vacdshm' 'vachtmw' 'vcdimax' 'vf' 'vfohc' 'vol' 'volrci' 'vpfskv' 'vpumpn' 'vtfskv' 'vvmass' 'wgt2' 'whtblbe' 'whtblbreed' 'whtblli' 'whtblss' 'whtblvd' 'whtcas' 'whtconcu' 'whtconsc' 'whtcp' 'whtpfs' 'whtshld' 'whttflgs' 'wpenshld' 'wrbi' 'wsvfac' 'wsvol' 'wtblli2o' 'wtbllipb' 'wtgpd'] stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] -mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost'] +mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number'] mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'CF_magnet_number'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index 30daee6..6816a74 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -138,6 +138,41 @@ "CF_magnet_number": "L_CC, L_CF", } +MIRROR_GENERATED_VAR_FORMULAS = { + "P_f_CC": ("P_f_CC = P_f - 2 * P_f_EP", "MW"), + "L_CC": ("L_CC = P_f_CC / P_f_L", "m"), + "L_CF": ("L_CF = 1.0", "m"), + "L": ("L = L_CC + 2 * L_EP + 2 * L_EC", "m"), + "V_vac": ("V_vac = L * pi * a_EC**2", "m3"), + "P_alpha": ("P_alpha = P_f * E_alpha / E_DT", "MW"), + "P_n": ("P_n = P_f - P_alpha", "MW"), + "P_ine": ("P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH", "MW"), + "P_pump": ("P_pump = f_pump * M_n * P_n", "MW"), + "P_sub_cont": ("P_sub_cont = f_sub * P_f", "MW"), + "P_cryo": ("P_cryo = f_cryo * P_f", "MW"), + "P_other": ("P_other = P_pump + P_sub_cont + P_cryo", "MW"), + "P_in": ("P_in = P_NBI + P_ICRH + P_ECH", "MW"), + "P_th": ("P_th = M_n * P_n + eta_pump * P_pump", "MW"), + "P_the": ("P_the = eta_th * P_th", "MW"), + "P_DEC": ("P_DEC = P_in + P_alpha", "MW"), + "P_DECe": ("P_DECe = eta_DEC * P_DEC", "MW"), + "P_egross": ( + "P_egross = P_DECe + P_the if application == 'electricity' else P_DECe", + "MW", + ), + "P_enet": ("P_enet = P_egross - (P_ine + P_other)", "MW"), + "f_aux": ("f_aux = P_aux / P_egross", "1"), + "Q_sci": ("Q_sci = P_f / P_in", "1"), + "Q_eng": ("Q_eng = P_egross / (P_ine + P_other)", "1"), + "f_refrac": ("f_refrac = 1 / Q_eng", "1"), + "CF_magnet_number": ("CF_magnet_number = L_CC / L_CF", "1"), +} + +MIRROR_CONSTANT_DEFAULTS = { + "E_DT": (17.59e6 * 1.60218e-19, "J"), + "E_alpha": (3.52e6 * 1.60218e-19, "J"), +} + TYPE_REPLACEMENTS = ( (re.compile(r"varchar\(\d+\)", re.IGNORECASE), "TEXT"), (re.compile(r"\bint\b", re.IGNORECASE), "INTEGER"), @@ -279,6 +314,45 @@ def _generate_inputs_defaults(algorithm_source: Path) -> dict[str, tuple[object, return values +def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) -> dict[str, float]: + values = {name: value for name, (value, _unit) in input_defaults.items()} + values.update({name: value for name, (value, _unit) in MIRROR_CONSTANT_DEFAULTS.items()}) + generated = {} + + generated["P_f_CC"] = values["P_f"] - 2 * values["P_f_EP"] + generated["L_CC"] = generated["P_f_CC"] / values["P_f_L"] + generated["L_CF"] = 1.0 + generated["L"] = generated["L_CC"] + 2 * values["L_EP"] + 2 * values["L_EC"] + generated["V_vac"] = generated["L"] * 3.141592653589793 * values["a_EC"] ** 2 + generated["P_alpha"] = values["P_f"] * values["E_alpha"] / values["E_DT"] + generated["P_n"] = values["P_f"] - generated["P_alpha"] + generated["P_ine"] = ( + values["P_NBI"] / values["eta_NBI"] + + values["P_ICRH"] / values["eta_ICRH"] + + values["P_ECH"] / values["eta_ECH"] + ) + generated["P_pump"] = values["f_pump"] * values["M_n"] * generated["P_n"] + generated["P_sub_cont"] = values["f_sub"] * values["P_f"] + generated["P_cryo"] = values["f_cryo"] * values["P_f"] + generated["P_other"] = generated["P_pump"] + generated["P_sub_cont"] + generated["P_cryo"] + generated["P_in"] = values["P_NBI"] + values["P_ICRH"] + values["P_ECH"] + generated["P_th"] = values["M_n"] * generated["P_n"] + values["eta_pump"] * generated["P_pump"] + generated["P_the"] = values["eta_th"] * generated["P_th"] + generated["P_DEC"] = generated["P_in"] + generated["P_alpha"] + generated["P_DECe"] = values["eta_DEC"] * generated["P_DEC"] + if str(values["application"]).lower() == "electricity": + generated["P_egross"] = generated["P_DECe"] + generated["P_the"] + else: + generated["P_egross"] = generated["P_DECe"] + generated["P_enet"] = generated["P_egross"] - (generated["P_ine"] + generated["P_other"]) + generated["f_aux"] = values["P_aux"] / generated["P_egross"] + generated["Q_sci"] = values["P_f"] / generated["P_in"] + generated["Q_eng"] = generated["P_egross"] / (generated["P_ine"] + generated["P_other"]) + generated["f_refrac"] = 1 / generated["Q_eng"] + generated["CF_magnet_number"] = generated["L_CC"] / generated["L_CF"] + return generated + + def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: dependencies = _account_method_dependencies(algorithm_source) methods = set(dependencies) @@ -336,12 +410,14 @@ def _split_vars(value: str | None) -> list[str]: def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: + input_defaults = _generate_inputs_defaults(algorithm_source) + generated_values = _mirror_generated_var_values(input_defaults) conn.execute("UPDATE mirror_var SET var_alg = '' WHERE var_alg = 'TODO'") conn.execute("UPDATE mirror_var SET var_need = '' WHERE var_need = 'TODO'") conn.execute("UPDATE mirror_var SET v_linked = '' WHERE v_linked = 'TODO'") conn.execute("UPDATE mirror_var SET var_unit = '1' WHERE var_unit = 'TODO'") conn.execute("UPDATE mirror_var SET var_unit = 'm' WHERE var_name = 'r_magnet'") - for var_name, (value, unit) in _generate_inputs_defaults(algorithm_source).items(): + for var_name, (value, unit) in input_defaults.items(): if conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): continue next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] @@ -365,6 +441,32 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: (next_ind, var_name, "Mirror generated parameter", var_need), ) conn.execute("UPDATE mirror_var SET var_need = ? WHERE var_name = ?", (var_need, var_name)) + _formulation, unit = MIRROR_GENERATED_VAR_FORMULAS.get(var_name, ("", "1")) + conn.execute( + """ + UPDATE mirror_var + SET var_value = ?, var_alg = ?, var_unit = ?, user_input = 0 + WHERE var_name = ? + """, + (generated_values.get(var_name), f"cal_{var_name}", unit, var_name), + ) + + for var_name, (value, unit) in MIRROR_CONSTANT_DEFAULTS.items(): + if not conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): + next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] + conn.execute( + """ + INSERT INTO mirror_var + (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) + VALUES (?, ?, ?, ?, ?, '', '', '', 0) + """, + (next_ind, var_name, "Mirror physical constant", value, unit), + ) + else: + conn.execute( + "UPDATE mirror_var SET var_value = ?, var_unit = ?, user_input = 0 WHERE var_name = ?", + (value, unit, var_name), + ) reverse_links: dict[str, list[str]] = {} for var_name, var_need in conn.execute("SELECT var_name, var_need FROM mirror_var"): @@ -401,6 +503,39 @@ def _normalize_mirror_algorithm_table(conn: sqlite3.Connection, algorithm_source "UPDATE mirror_alg SET alg_formulation = ?, alg_units = 'million' WHERE alg_name = ?", (variables or "reference value", alg_name), ) + next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_alg").fetchone()[0] + for var_name, (formulation, unit) in MIRROR_GENERATED_VAR_FORMULAS.items(): + alg_name = f"cal_{var_name}" + existing = conn.execute("SELECT ind FROM mirror_alg WHERE alg_name = ?", (alg_name,)).fetchone() + if existing: + conn.execute( + """ + UPDATE mirror_alg + SET alg_for = 'v', + alg_description = ?, + alg_python = 'MirrorFunc', + alg_formulation = ?, + alg_units = ? + WHERE alg_name = ? + """, + (f"Mirror generated variable calculation for {var_name}", formulation, unit, alg_name), + ) + continue + conn.execute( + """ + INSERT INTO mirror_alg + (ind, alg_name, alg_for, alg_description, alg_python, alg_formulation, alg_units) + VALUES (?, ?, 'v', ?, 'MirrorFunc', ?, ?) + """, + ( + next_ind, + alg_name, + f"Mirror generated variable calculation for {var_name}", + formulation, + unit, + ), + ) + next_ind += 1 def load_mirror_tables( diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 64bdf42..7a48e01 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -2,6 +2,8 @@ from pathlib import Path from types import SimpleNamespace +import pytest + from Main import Accert @@ -136,6 +138,75 @@ def test_mirror_variable_links_are_reversed_from_var_need(cursor): ) +def test_mirror_generated_variable_algorithms_are_loaded(cursor): + cursor.execute( + """ + SELECT var_alg, var_need, var_unit + FROM mirror_var + WHERE var_name = ?; + """, + ("P_DECe",), + ) + assert cursor.fetchone() == ("cal_P_DECe", "eta_DEC, P_DEC", "MW") + + cursor.execute( + """ + SELECT alg_for, alg_python, alg_formulation, alg_units + FROM mirror_alg + WHERE alg_name = ?; + """, + ("cal_P_DECe",), + ) + assert cursor.fetchone() == ( + "v", + "MirrorFunc", + "P_DECe = eta_DEC * P_DEC", + "MW", + ) + + cursor.execute( + """ + SELECT var_name, var_value, var_unit, v_linked + FROM mirror_var + WHERE var_name IN (?, ?) + ORDER BY var_name; + """, + ("P_DEC", "eta_DEC"), + ) + rows = cursor.fetchall() + assert rows[0][0] == "P_DEC" + assert rows[0][1] == pytest.approx(3.20011370096646) + assert rows[0][2:] == ("MW", "P_DECe") + assert rows[1] == ("eta_DEC", 0.9, "1", "P_DECe") + + +def test_mirror_generated_variable_algorithm_can_recalculate(cursor): + accert = Accert.__new__(Accert) + accert.var_tabl = "mirror_var" + accert.alg_tabl = "mirror_alg" + accert.cel_tabl = None + + cursor.execute( + """ + UPDATE mirror_var + SET var_value = ? + WHERE var_name = ?; + """, + (10.0, "P_DEC"), + ) + + assert accert.update_super_variable(cursor, "P_DECe") is None + cursor.execute( + """ + SELECT var_value, var_unit, user_input + FROM mirror_var + WHERE var_name = ?; + """, + ("P_DECe",), + ) + assert cursor.fetchone() == (9.0, "MW", 1) + + def test_mirror_account_recalculation_uses_accert_variables(cursor): accert = Accert.__new__(Accert) accert.acc_tabl = "mirror_acco" diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index b71670b..7015767 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -87,6 +87,104 @@ def _run_algorithm(self, alg_name: str, variables: list) -> float: return algorithm(*variables) except AttributeError: raise ValueError(f"Algorithm {alg_name} not found") + + @staticmethod + def cal_P_f_CC(P_f, P_f_EP): + return P_f - 2 * P_f_EP + + @staticmethod + def cal_L_CC(P_f_CC, P_f_L): + return P_f_CC / P_f_L + + @staticmethod + def cal_L_CF(): + return 1.0 + + @staticmethod + def cal_L(L_CC, L_EP, L_EC): + return L_CC + 2 * L_EP + 2 * L_EC + + @staticmethod + def cal_V_vac(L, a_EC): + return L * np.pi * a_EC**2 + + @staticmethod + def cal_P_alpha(E_DT, E_alpha, P_f): + return P_f * E_alpha / E_DT + + @staticmethod + def cal_P_n(P_f, P_alpha): + return P_f - P_alpha + + @staticmethod + def cal_P_ine(P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH): + return P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH + + @staticmethod + def cal_P_pump(f_pump, M_n, P_n): + return f_pump * M_n * P_n + + @staticmethod + def cal_P_sub_cont(f_sub, P_f): + return f_sub * P_f + + @staticmethod + def cal_P_cryo(f_cryo, P_f): + return f_cryo * P_f + + @staticmethod + def cal_P_other(P_pump, P_sub_cont, P_cryo): + return P_pump + P_sub_cont + P_cryo + + @staticmethod + def cal_P_in(P_NBI, P_ICRH, P_ECH): + return P_NBI + P_ICRH + P_ECH + + @staticmethod + def cal_P_th(M_n, P_n, P_pump, eta_pump): + return M_n * P_n + eta_pump * P_pump + + @staticmethod + def cal_P_the(eta_th, P_th): + return eta_th * P_th + + @staticmethod + def cal_P_DEC(P_in, P_alpha): + return P_in + P_alpha + + @staticmethod + def cal_P_DECe(eta_DEC, P_DEC): + return eta_DEC * P_DEC + + @staticmethod + def cal_P_egross(application, P_DECe, P_the): + if str(application).lower() == "electricity": + return P_DECe + P_the + return P_DECe + + @staticmethod + def cal_P_enet(P_egross, P_ine, P_other): + return P_egross - (P_ine + P_other) + + @staticmethod + def cal_f_aux(P_aux, P_egross): + return P_aux / P_egross + + @staticmethod + def cal_Q_sci(P_f, P_in): + return P_f / P_in + + @staticmethod + def cal_Q_eng(P_egross, P_ine, P_other): + return P_egross / (P_ine + P_other) + + @staticmethod + def cal_f_refrac(Q_eng): + return 1 / Q_eng + + @staticmethod + def cal_CF_magnet_number(L_CC, L_CF): + return L_CC / L_CF ### Account Methods: ### @staticmethod diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index d5c1647..2c8c016 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -79,3 +79,27 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 78,LF_magnet_cost,v,None,MirrorFunc,TODO,TODO 79,CF_magnet_cost,v,None,MirrorFunc,TODO,TODO 80,HF_magnet_shield_cost,v,The HF coils have annular shield with a U-shaped cross section:,MirrorFunc,TODO,TODO +81,cal_P_f_CC,v,Mirror generated variable calculation for P_f_CC,MirrorFunc,P_f_CC = P_f - 2 * P_f_EP,MW +82,cal_L_CC,v,Mirror generated variable calculation for L_CC,MirrorFunc,L_CC = P_f_CC / P_f_L,m +83,cal_L_CF,v,Mirror generated variable calculation for L_CF,MirrorFunc,L_CF = 1.0,m +84,cal_L,v,Mirror generated variable calculation for L,MirrorFunc,L = L_CC + 2 * L_EP + 2 * L_EC,m +85,cal_V_vac,v,Mirror generated variable calculation for V_vac,MirrorFunc,V_vac = L * pi * a_EC**2,m3 +86,cal_P_alpha,v,Mirror generated variable calculation for P_alpha,MirrorFunc,P_alpha = P_f * E_alpha / E_DT,MW +87,cal_P_n,v,Mirror generated variable calculation for P_n,MirrorFunc,P_n = P_f - P_alpha,MW +88,cal_P_ine,v,Mirror generated variable calculation for P_ine,MirrorFunc,P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH,MW +89,cal_P_pump,v,Mirror generated variable calculation for P_pump,MirrorFunc,P_pump = f_pump * M_n * P_n,MW +90,cal_P_sub_cont,v,Mirror generated variable calculation for P_sub_cont,MirrorFunc,P_sub_cont = f_sub * P_f,MW +91,cal_P_cryo,v,Mirror generated variable calculation for P_cryo,MirrorFunc,P_cryo = f_cryo * P_f,MW +92,cal_P_other,v,Mirror generated variable calculation for P_other,MirrorFunc,P_other = P_pump + P_sub_cont + P_cryo,MW +93,cal_P_in,v,Mirror generated variable calculation for P_in,MirrorFunc,P_in = P_NBI + P_ICRH + P_ECH,MW +94,cal_P_th,v,Mirror generated variable calculation for P_th,MirrorFunc,P_th = M_n * P_n + eta_pump * P_pump,MW +95,cal_P_the,v,Mirror generated variable calculation for P_the,MirrorFunc,P_the = eta_th * P_th,MW +96,cal_P_DEC,v,Mirror generated variable calculation for P_DEC,MirrorFunc,P_DEC = P_in + P_alpha,MW +97,cal_P_DECe,v,Mirror generated variable calculation for P_DECe,MirrorFunc,P_DECe = eta_DEC * P_DEC,MW +98,cal_P_egross,v,Mirror generated variable calculation for P_egross,MirrorFunc,P_egross = P_DECe + P_the if application == 'electricity' else P_DECe,MW +99,cal_P_enet,v,Mirror generated variable calculation for P_enet,MirrorFunc,P_enet = P_egross - (P_ine + P_other),MW +100,cal_f_aux,v,Mirror generated variable calculation for f_aux,MirrorFunc,f_aux = P_aux / P_egross,1 +101,cal_Q_sci,v,Mirror generated variable calculation for Q_sci,MirrorFunc,Q_sci = P_f / P_in,1 +102,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 +103,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 +104,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index d647e8a..b913fe2 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -1,6 +1,6 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_input -1,E_DT,str,,1,,,P_alpha, -2,E_alpha,str,,1,,,P_alpha, +1,E_DT,str,2.8182346199999998e-12,J,,,P_alpha,0 +2,E_alpha,str,5.6396736e-13,J,,,P_alpha,0 3,E_n,str,,1,"E_DT, E_alpha",,, 4,m_T,str,,1,,,, 5,m_D,str,,1,,,, @@ -69,29 +69,29 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 68,f_Pb,str,,1,f_Li,,, 69,P_Li,str,,1,"Li_price, f_6Li",,, 70,P_PbLi,str,,1,"P_Li, P_Pb, f_Li, f_Pb",,, -71,P_f_CC,str,,1,"P_f, P_f_EP","P_f, P_f_EP",L_CC, -72,L_CC,str,,1,"P_f_CC, P_f_L","P_f_CC, P_f_L","CF_magnet_number, L", -73,L_CF,float,1.0,1,,,CF_magnet_number, -74,L,str,,1,"L_CC, L_EC, L_EP","L_CC, L_EP, L_EC",V_vac, -75,V_vac,str,,1,"L, a_EC, np","L, a_EC",, -76,P_alpha,str,,1,"E_DT, E_alpha, P_f","E_DT, E_alpha, P_f","P_DEC, P_n", -77,P_n,str,,1,"P_alpha, P_f","P_f, P_alpha","P_pump, P_th", -78,P_ine,str,,1,"P_ECH, P_ICRH, P_NBI, eta_ECH, eta_ICRH, eta_NBI","P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng", -79,P_pump,str,,1,"M_n, P_n, f_pump","f_pump, M_n, P_n","P_other, P_th", -80,P_sub_cont,str,,1,"P_f, f_sub","f_sub, P_f",P_other, -81,P_cryo,str,,1,"P_f, f_cryo","f_cryo, P_f",P_other, -82,P_other,str,,1,"P_cryo, P_pump, P_sub_cont","P_pump, P_sub_cont, P_cryo","P_enet, Q_eng", -83,P_in,str,,1,"P_ECH, P_ICRH, P_NBI","P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci", -84,P_th,str,,1,"M_n, P_n, P_pump, eta_pump","M_n, P_n, P_pump, eta_pump",P_the, -85,P_the,str,,1,"P_th, eta_th","eta_th, P_th",P_egross, -86,P_DEC,str,,1,"P_alpha, P_in","P_in, P_alpha",P_DECe, -87,P_DECe,str,,1,"P_DEC, eta_DEC","eta_DEC, P_DEC",P_egross, -88,P_egross,str,,1,"P_DECe, P_the","application, P_DECe, P_the","P_enet, Q_eng, f_aux", -89,P_enet,str,,1,"P_egross, P_ine, P_other","P_egross, P_ine, P_other",, -90,f_aux,str,,1,"P_aux, P_egross","P_aux, P_egross",, -91,Q_sci,str,,1,"P_f, P_in","P_f, P_in",, -92,Q_eng,str,,1,"P_egross, P_ine, P_other","P_egross, P_ine, P_other",f_refrac, -93,f_refrac,str,,1,Q_eng,Q_eng,, +71,P_f_CC,str,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 +72,L_CC,str,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L",0 +73,L_CF,float,1.0,m,cal_L_CF,,CF_magnet_number,0 +74,L,str,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 +75,V_vac,str,9.42477796076938,m3,cal_V_vac,"L, a_EC",,0 +76,P_alpha,str,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 +77,P_n,str,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 +78,P_ine,str,6.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 +79,P_pump,str,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 +80,P_sub_cont,str,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 +81,P_cryo,str,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 +82,P_other,str,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 +83,P_in,str,3.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 +84,P_th,str,0.9057432518476407,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 +85,P_the,str,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 +86,P_DEC,str,3.200113700966458,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 +87,P_DECe,str,2.8801023308698124,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 +88,P_egross,str,2.8801023308698124,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 +89,P_enet,str,-3.196293916998295,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 +90,f_aux,str,0.3472098853161209,1,cal_f_aux,"P_aux, P_egross",,0 +91,Q_sci,str,0.3333333333333333,1,cal_Q_sci,"P_f, P_in",,0 +92,Q_eng,str,0.4739819809941281,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 +93,f_refrac,str,2.1097848443575926,1,cal_f_refrac,Q_eng,,0 94,run_name,str,,1,"P_f, float",,, 95,cost_file_full,str,,1,"cost_file, pkg_resources",,, 96,new_data,str,,1,"f_vol, material, name, pd, thickness",,, @@ -193,4 +193,4 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 192,a_EP,Mirror input parameter,1.0,m,,,,0 193,HF_magnet_number,Mirror input parameter,4.0,1,,,,0 194,LF_magnet_number,Mirror input parameter,2.0,1,,,,0 -195,CF_magnet_number,Mirror generated parameter,,1,,"L_CC, L_CF",,0 +195,CF_magnet_number,Mirror generated parameter,-1.0,1,cal_CF_magnet_number,"L_CC, L_CF",,0 From c0460651da07c003aefc1b2c034f17053995e7ac Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 16:54:54 -0500 Subject: [PATCH 06/23] Use ACCERT variable names in Mirror algorithms --- src/Algorithm/MirrorFunc.py | 175 ++++++++---------- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 40 ++-- src/scripts/build_mirror_accert_tables.py | 23 ++- test/test_mirror_model.py | 38 +++- tutorial/accert/ref_tables/MirrorFunc.py | 175 ++++++++---------- tutorial/accert/ref_tables/mirror_account.csv | 14 +- .../accert/ref_tables/mirror_algorithm.csv | 16 +- .../accert/ref_tables/mirror_variable.csv | 10 +- 9 files changed, 242 insertions(+), 249 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index 7015767..aaaaef4 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -20,28 +20,6 @@ class MirrorFunc(Algorithm): # Conversion factors Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU - ACCERT_TO_TEAM_INPUT = { - "application": "Application", - "include_contingency": "Contingency", - "L": "Overall Length", - "L_CC": "Central Cell Length", - "L_EP": "End Plug Length", - "N_module": "Number of Modules", - "n_unit": "Unit Number", - "P_DECe": "DEC Electrical Power", - "P_ECH": "ECH Power", - "P_egross": "Gross Electric Power", - "P_enet": "Net Electric Power", - "P_ICRH": "ICRH Power", - "P_NBI": "NBI Power", - "P_th": "Thermal Power", - "V_vac": "Vacuum Volume", - "construction_time": "Construction Time", - "HF_magnet_number": "HF Magnet Number", - "LF_magnet_number": "LF Magnet Number", - "NOAK": "NOAK", - } - def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) @@ -64,12 +42,7 @@ def _run_account_algorithm(self, alg_name: str, variables: dict) -> float: algorithm = getattr(self, alg_name) except AttributeError: raise ValueError(f"Algorithm {alg_name} not found") - team_inputs = { - team_name: variables[var_name] - for var_name, team_name in self.ACCERT_TO_TEAM_INPUT.items() - if var_name in variables - } - return algorithm(team_inputs) + return algorithm(variables) def _run_algorithm(self, alg_name: str, variables: list) -> float: """ @@ -226,103 +199,103 @@ def Account_C21(inputs): @staticmethod def Account_C21_1(inputs): # Site Preparation/Yard Work - return(inputs['Gross Electric Power'] * 268/1e3) + return(inputs['P_egross'] * 268/1e3) @staticmethod def Account_C21_2(inputs): # Heat Island Building - return(inputs['Gross Electric Power'] * 186.8/1e3) + return(inputs['P_egross'] * 186.8/1e3) @staticmethod def Account_C21_3(inputs): # Turbine Generator Building - if inputs['Application'].lower()=='electricity': - return(inputs['Gross Electric Power'] * 54.0/1e3) + if inputs['application'].lower()=='electricity': + return(inputs['P_egross'] * 54.0/1e3) else: return(0) @staticmethod def Account_C21_4(inputs): # Heat Exchanger Building - return(37.8/1e3 * inputs['Gross Electric Power']) + return(37.8/1e3 * inputs['P_egross']) @staticmethod #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, def Account_C21_5(inputs): # Power Supply and Energy Storage - return(10.8/1e3 * inputs['Gross Electric Power']) + return(10.8/1e3 * inputs['P_egross']) @staticmethod #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, def Account_C21_6(inputs): # Reactor Auxiliaries - return(5.4/1e3 * inputs['Gross Electric Power']) + return(5.4/1e3 * inputs['P_egross']) @staticmethod #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, def Account_C21_7(inputs): # Hot Cell - return(93.4/1e3 * inputs['Gross Electric Power']) + return(93.4/1e3 * inputs['P_egross']) @staticmethod #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, def Account_C21_8(inputs): # Reactor Services - return(18.7/1e3 * inputs['Gross Electric Power']) + return(18.7/1e3 * inputs['P_egross']) @staticmethod #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, def Account_C21_9(inputs): # Service Water - return(0.3/1e3 * inputs['Gross Electric Power']) + return(0.3/1e3 * inputs['P_egross']) @staticmethod #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, def Account_C21_10(inputs): # Fuel Storage - return(1.1/1e3 * inputs['Gross Electric Power']) + return(1.1/1e3 * inputs['P_egross']) @staticmethod #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, def Account_C21_11(inputs): # Control Room - return(0.9/1e3 * inputs['Gross Electric Power']) + return(0.9/1e3 * inputs['P_egross']) @staticmethod #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, def Account_C21_12(inputs): # Onsite AC Power - return(0.8/1e3 * inputs['Gross Electric Power']) + return(0.8/1e3 * inputs['P_egross']) @staticmethod #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, def Account_C21_13(inputs): # Administration - return(4.4/1e3 * inputs['Gross Electric Power']) + return(4.4/1e3 * inputs['P_egross']) @staticmethod #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, def Account_C21_14(inputs): # Site Services - return(1.6/1e3 * inputs['Gross Electric Power']) + return(1.6/1e3 * inputs['P_egross']) @staticmethod #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, def Account_C21_15(inputs): # Cyrogenics - return(2.4/1e3 * inputs['Gross Electric Power']) + return(2.4/1e3 * inputs['P_egross']) @staticmethod #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, def Account_C21_16(inputs): # Security - return(0.9/1e3 * inputs['Gross Electric Power']) + return(0.9/1e3 * inputs['P_egross']) @staticmethod #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, def Account_C21_17(inputs): # Ventilation Stack - return(27.0/1e3 * inputs['Gross Electric Power']) + return(27.0/1e3 * inputs['P_egross']) @staticmethod @@ -361,7 +334,7 @@ def Account_C22_1(inputs): def Account_C22_1_1(inputs): # First Wall and Blanket (and vacuum vessel) - L_magnet_to_magnet = inputs['End Plug Length'] + L_magnet_to_magnet = inputs['L_EP'] L_cylinder = L_magnet_to_magnet @@ -370,7 +343,7 @@ def Account_C22_1_1(inputs): end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() - central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) + central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['L_CC']) central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result @@ -398,20 +371,20 @@ def Account_C22_1_3_1(inputs): # HF Coils - Quantity 4 # 2 per end cell # 2 end cells per tandem - return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) + return(inputs['HF_magnet_number'] * MirrorFunc.HF_magnet_cost(inputs)) @staticmethod def Account_C22_1_3_2(inputs): # LF Coils - Quantity 8 # 4 per end cell # 2 end cells per tandem - return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) + return(inputs['LF_magnet_number'] * MirrorFunc.LF_magnet_cost(inputs)) @staticmethod def Account_C22_1_3_3(inputs): # CF Coils # One coil every L_CF m of Central Cell - return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) + return(inputs['CF_magnet_number'] * MirrorFunc.CF_magnet_cost(inputs)) @staticmethod def Account_C22_1_4(inputs): @@ -426,20 +399,20 @@ def Account_C22_1_4(inputs): @staticmethod def Account_C22_1_4_1(inputs): # NBI - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(7.0642 * inputs['NBI Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(7.0642 * inputs['P_NBI'] * cost_factor) @staticmethod def Account_C22_1_4_2(inputs): # ICRH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(4.149 * inputs['ICRH Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(4.149 * inputs['P_ICRH'] * cost_factor) @staticmethod def Account_C22_1_4_3(inputs): # ECH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(8.0 * inputs['ECH Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(8.0 * inputs['P_ECH'] * cost_factor) @staticmethod def Account_C22_1_5(inputs): @@ -479,7 +452,7 @@ def Account_C22_1_6_3(inputs): cost_pump = 40000 #48 pumps needed for 200^3 system vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump - no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second + no_vpumps = inputs['V_vac']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second return(no_vpumps*cost_pump/1e6) @@ -511,15 +484,15 @@ def Account_C22_1_8(inputs): def Account_C22_1_9(inputs): # Direct Energy Convertor # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(1.7347 * inputs['P_DECe'] * cost_factor) @staticmethod def Account_C22_1_11(inputs): # Assembly and Installation Costs #Cost Category 22.1.11 Installation costs - axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_t = inputs['L']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius axis_ir = axis_t # Define labor rate @@ -527,22 +500,22 @@ def Account_C22_1_11(inputs): # Calculations constructionworker = 20 * axis_ir / 4 - C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) - C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket - C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield - C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils - C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating - C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure - C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system - C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_in = inputs['N_module'] * inputs['construction_time'] * (lr * 20 * 300) + C_22_1_11_1_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = inputs['N_module'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = inputs['N_module'] * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = inputs['N_module'] * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = inputs['N_module'] * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = inputs['N_module'] * ((lr * 400 * constructionworker) + 0) # power supplies C_22_1_11_8_in = 0 # guns or divertor - C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_9_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # direct energy converter C_22_1_11_10_in = 0 # ECRH # Total cost calculations C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) return(C220111 * cost_factor) @@ -558,12 +531,12 @@ def Account_C22_2(inputs): @staticmethod def Account_C22_2_1(inputs): # Primary Coolant - return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) + return(166 * (inputs['N_module'] * inputs['P_egross']/1000)) @staticmethod def Account_C22_2_2(inputs): # Secondary Coolant - return(40.6 * (inputs['Thermal Power']/3500)**0.55) + return(40.6 * (inputs['P_th']/3500)**0.55) @staticmethod def Account_C22_2_3(inputs): @@ -573,12 +546,12 @@ def Account_C22_2_3(inputs): @staticmethod def Account_C22_3(inputs): # Auxiliary Cooling Systems - return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) + return(1.10 * 1e-3 * inputs['N_module'] * inputs['P_th'] * 2.02) @staticmethod def Account_C22_4(inputs): # Radioactive Waste Treatment - return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) + return(1.96 * 1e-3 * inputs['P_th'] * 2.02) @staticmethod def Account_C22_5(inputs): @@ -606,14 +579,14 @@ def Account_C22_5(inputs): C220506 = C2205060ITER * ltoak C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) return(C220500 * cost_factor) @staticmethod def Account_C22_6(inputs): # Cost Category 22.6 Other Reactor Plant Equipment - return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) + return(11.5*(np.max((inputs['P_enet'],0))/1000)**(0.8)) @staticmethod def Account_C22_7(inputs): @@ -623,22 +596,22 @@ def Account_C22_7(inputs): @staticmethod def Account_C23(inputs): # Turbine Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) + return(inputs['N_module'] * inputs['P_egross'] * 0.219 *1.15) @staticmethod def Account_C24(inputs): # Electric Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) + return(inputs['N_module'] * inputs['P_egross'] * 0.054 * 1.15) @staticmethod def Account_C25(inputs): # Miscellaneous Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) + return(inputs['N_module'] * inputs['P_egross'] * 0.038 * 1.15) @staticmethod def Account_C26(inputs): # Heat Rejection - return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) + return(inputs['N_module'] * inputs['P_enet'] * 0.107 * 1.15 ) @staticmethod def Account_C27(inputs): @@ -660,7 +633,7 @@ def Account_C29(inputs): # Rollup - if not(inputs['NOAK']) and inputs['Contingency']: + if not(inputs['NOAK']) and inputs['include_contingency']: return(0.1 * ( MirrorFunc.Account_C21(inputs) + MirrorFunc.Account_C22(inputs) + @@ -1249,7 +1222,7 @@ def generate_inputs( if save: # import csv - filename = 'inputs-'+inputs['Run Name']+'.json' + filename = 'inputs-'+inputs['run_name']+'.json' with open(filename, 'w') as file: @@ -1308,14 +1281,14 @@ def add_fractional_layer(data, name, material, f_vol=1.00): @staticmethod def build_central_cell(inputs): - radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) - radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) + radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['a_CC']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['vacuum_gap_CC']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['first_wall_material'], inputs['first_wall_thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['vacuum_vessel_material'], inputs['vacuum_vessel_thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['multiplier_material'], inputs['multiplier_thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['blanket_coolant_material'], inputs['blanket_thickness'], inputs['blanket_coolant_fraction']) + radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['blanket_structural_material'], inputs['blanket_structural_fraction']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['vacuum_vessel_material'], inputs['outer_vessel_thickness']) return(radial_build) @@ -1326,7 +1299,7 @@ def central_cell_cost(inputs, L=1.0): @staticmethod def central_cell(inputs, L=1.0): - filename = inputs['Cost File'] + filename = inputs['cost_file'] cost_data = pd.read_csv(filename, index_col=0) @@ -1412,12 +1385,12 @@ def expander_cell_cost(inputs): # print('Expander Cell') - L = inputs['Expander Cell Length'] - radius = inputs['Expander Cell Radius'] - thickness = inputs['Expander Cell Vessel Thickness'] - vv_material = inputs['Expander Cell Vessel Material'] + L = inputs['L_EC'] + radius = inputs['a_EC'] + thickness = inputs['expander_cell_vessel_thickness'] + vv_material = inputs['expander_cell_vessel_material'] - filename = inputs['Cost File'] + filename = inputs['cost_file'] cost_data = pd.read_csv(filename, index_col=0) @@ -1503,7 +1476,7 @@ def HF_magnet_shield_cost(inputs, verbose=False): # It's a reasonable assumption to say that all axial widths/layers will be the same - filename = inputs['Cost File'] + filename = inputs['cost_file'] cost_data = pd.read_csv(filename, index_col=0) # Eventually these will be arguments @@ -1661,7 +1634,7 @@ def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['HF_magnet_number'] + 1)/np.log(2)) return(cost * cost_factor) @@ -1670,7 +1643,7 @@ def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): # This is the LF cost per magnet [MUSD] cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['LF_magnet_number'] + 1)/np.log(2)) return(cost * cost_factor) @@ -1680,7 +1653,7 @@ def CF_magnet_cost(inputs, CF_field=3.0): convert_to_currentDollar = 1.31 cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['CF_magnet_number'] + 1)/np.log(2)) return(cost * cost_factor) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index f7efb77b69316d95e7be4018121c0217859c1bb0..d65c45a2f0bd3364676f9aa1cd95ecdcc828c4d5 100644 GIT binary patch delta 888 zcmaiyPe@cj9LL|xd%N#F_s{&+RhF>Y4TI3sT~RCQqFH89x|)%6XrFG2DDJMTyB$2K z@RS0}G#t_(2|9#jSmc0*6taULV%SY6>Ec1dG7@Z48}(p{(7gL{7kM;v3X{Z*qT<#I&#!>Wb_&x7mn;~ zmFaA*YDZV-Qm(peEZJFX=XE#<923XPv2d(xJ&)kt;W-jBL5VLIz7?wvWVpP(KqwHU z`U1I;xGSxRgc}>_j|FmVzr1phRP2+pcZ*~QAHJO7+NtFahZ>`im_J$@4*81uqT4z0A znXoija?M}Oz2;(83GfF|?;s?Ysu~*VYyDN5C$ic^upvn)7tVLvJOyf*Q$cQW@<=9~ zutN?#aTkEzOag`3lb}Gt;tJQkEV6qCA%ba>9g2pXU_yoj5+}d-(mcV)#8%xPyL#q` z#H40eBMkLJx`~Egf?3+Kd1e4kZ+#jA+Zx;V1~YpC=6nI!c-KGGgP{MF->_rpEYeRQl3>g3YaOH-cX$5{4bm=Q&{5Tx=L6gv#!bMY#U<7c=W zt)c-`EG!8FLXh1agD0X@J8DLbLo!Ns%I=g*nmP{Wps>gntg7L?<_pDw)qx1B8HX7; YnfKq8q72u+k5)PfL*n*Lcmvq~0#BtPVgLXD delta 883 zcmaiyT}YEr7{}jp-gkT7cVFk3Ywf~x3zNPEo2V5PlwUbbYJ`Dwvsc%Um2Sh$8$q(* zMIx*$@nl!Sn}WJfQV(U+F1v^jtc#eScitG;C)CPygk(XBE`I0Yf1dL^|8xFlDBUoW zZn#-$uM`Ai6$D{}BXXKXz167lvZiZD*RZaMx+dwGLD!7BChM9qtEr!S=p=3Ts};yd z?X{|tj`-D8W1G>{Qh}-GwdkT7wW>lVs#Lo{=Ixgs+5K50UfJ8iMyl0)$k=LhHSa8x z$~0S}I#4rxU!#6B1`3@>&E62t*Y6-qO8kAMc9slGbEDTo2I+p2zbji2xDiBLUD&XsVryDy$h{-J-!lC#D1jwRAwL}$;I$TThw$79Jqg)eB~=rrxRDnZI3^Uk(qtZ6B)2_hKd07j*K{9o3e#$ z#G0`VSoc^~EZ12Fzz^i?OeA`u;m*wwUeA_u7A*lgqEE`2*!o_i<=Kv5c)tWLZ+&_V+2c^Y0JSvDnIb(zm}Y!ZUXv9;XWru&V+)+XVl zqGZ%t_}Y!uF`9V*7q%){)k9bmnWVw)BGDYV2#4u$J1C~YE7IX&;$jhzxqF}r|8>4A z2KxVEGQ{Ect$8+%@dYA@K4Fl`QxI@D#m8b;G~-#^g;g|>xmfQM+!1ZT gT^8gjlabRc`%10UF$0aPdj=Nee*|~>DNKvM07_C9Jpcdz diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index e2b8783..c6e6329 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6949,7 +6949,7 @@ INSERT INTO mirror_alg VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFu INSERT INTO mirror_alg VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','P_egross','million'); INSERT INTO mirror_alg VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO mirror_alg VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','application, P_egross','million'); +INSERT INTO mirror_alg VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','P_egross, application','million'); INSERT INTO mirror_alg VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','P_egross','million'); INSERT INTO mirror_alg VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','P_egross','million'); INSERT INTO mirror_alg VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','P_egross','million'); @@ -6971,7 +6971,7 @@ INSERT INTO mirror_alg VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','M INSERT INTO mirror_alg VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number','million'); INSERT INTO mirror_alg VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number','million'); -INSERT INTO mirror_alg VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','CF_magnet_number','million'); INSERT INTO mirror_alg VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','P_NBI, n_unit','million'); INSERT INTO mirror_alg VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','P_ICRH, n_unit','million'); @@ -6984,9 +6984,9 @@ INSERT INTO mirror_alg VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup' INSERT INTO mirror_alg VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','P_DECe, n_unit','million'); -INSERT INTO mirror_alg VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','construction_time, N_module, L, n_unit','million'); +INSERT INTO mirror_alg VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','L, N_module, construction_time, n_unit','million'); INSERT INTO mirror_alg VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','rollup','million'); -INSERT INTO mirror_alg VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','P_egross, N_module','million'); +INSERT INTO mirror_alg VALUES(46,'Account_C22_2_1','c','Account C2221 Rollup','MirrorFunc','N_module, P_egross','million'); INSERT INTO mirror_alg VALUES(47,'Account_C22_2_2','c','Account C2222 Rollup','MirrorFunc','P_th','million'); INSERT INTO mirror_alg VALUES(48,'Account_C22_2_3','c','Account C2223 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','N_module, P_th','million'); @@ -6994,10 +6994,10 @@ INSERT INTO mirror_alg VALUES(50,'Account_C22_4','c','Account C224 Rollup','Mirr INSERT INTO mirror_alg VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','n_unit','million'); INSERT INTO mirror_alg VALUES(52,'Account_C22_6','c','Account C226 Rollup','MirrorFunc','P_enet','million'); INSERT INTO mirror_alg VALUES(53,'Account_C22_7','c','Account C227 Rollup','MirrorFunc','reference value','million'); -INSERT INTO mirror_alg VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO mirror_alg VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO mirror_alg VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','P_egross, N_module','million'); -INSERT INTO mirror_alg VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','P_enet, N_module','million'); +INSERT INTO mirror_alg VALUES(54,'Account_C23','c','Account C23 Rollup','MirrorFunc','N_module, P_egross','million'); +INSERT INTO mirror_alg VALUES(55,'Account_C24','c','Account C24 Rollup','MirrorFunc','N_module, P_egross','million'); +INSERT INTO mirror_alg VALUES(56,'Account_C25','c','Account C25 Rollup','MirrorFunc','N_module, P_egross','million'); +INSERT INTO mirror_alg VALUES(57,'Account_C26','c','Account C26 Rollup','MirrorFunc','N_module, P_enet','million'); INSERT INTO mirror_alg VALUES(58,'Account_C27','c','Account C27 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(59,'Account_C28','c','Account C28 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(60,'Account_C29','c','Account C29 Rollup','MirrorFunc','rollup','million'); @@ -7140,12 +7140,12 @@ INSERT INTO mirror_var VALUES(80,'P_sub_cont','str',0.04000000000000000083,'MW', INSERT INTO mirror_var VALUES(81,'P_cryo','str',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); INSERT INTO mirror_var VALUES(82,'P_other','str',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); INSERT INTO mirror_var VALUES(83,'P_in','str',3.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); -INSERT INTO mirror_var VALUES(84,'P_th','str',0.9057432518476407068,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); +INSERT INTO mirror_var VALUES(84,'P_th','str',158.5050690819081751,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); INSERT INTO mirror_var VALUES(85,'P_the','str',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); -INSERT INTO mirror_var VALUES(86,'P_DEC','str',3.200113700966458197,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); -INSERT INTO mirror_var VALUES(87,'P_DECe','str',2.880102330869812377,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); -INSERT INTO mirror_var VALUES(88,'P_egross','str',2.880102330869812377,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); -INSERT INTO mirror_var VALUES(89,'P_enet','str',-3.196293916998294904,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); +INSERT INTO mirror_var VALUES(86,'P_DEC','str',70.01989764480569533,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); +INSERT INTO mirror_var VALUES(87,'P_DECe','str',63.0179078803251329,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); +INSERT INTO mirror_var VALUES(88,'P_egross','str',158.1209493283582219,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); +INSERT INTO mirror_var VALUES(89,'P_enet','str',94.9150046322633188,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); INSERT INTO mirror_var VALUES(90,'f_aux','str',0.3472098853161209031,'1','cal_f_aux','P_aux, P_egross','',0); INSERT INTO mirror_var VALUES(91,'Q_sci','str',0.3333333333333333148,'1','cal_Q_sci','P_f, P_in','',0); INSERT INTO mirror_var VALUES(92,'Q_eng','str',0.4739819809941280825,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); @@ -7266,7 +7266,7 @@ INSERT INTO mirror_acco VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',12981759 INSERT INTO mirror_acco VALUES(11,'21','Structures_and_Improvements',112945794.0999999941,1,'2','Unchanged',0.02189152043768370289,'Account_C21','million','rollup'); INSERT INTO mirror_acco VALUES(12,'211','Site_Preparation/Yard_Work',42376414.42000000178,2,'21','Unchanged',0.008213534197916488519,'Account_C21_1','million','P_egross'); INSERT INTO mirror_acco VALUES(13,'212','Heat_Island_Building',29536993.33999999986,2,'21','Unchanged',0.005724955927069242875,'Account_C21_2','million','P_egross'); -INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',8538531.264999998733,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','application, P_egross'); +INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',8538531.264999998733,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','P_egross, application'); INSERT INTO mirror_acco VALUES(15,'214','Heat_Exchanger_Building',5976971.884999999776,2,'21','Unchanged',0.001158476092169406302,'Account_C21_4','million','P_egross'); INSERT INTO mirror_acco VALUES(16,'215','Power_Supply_and_Energy_Storage',1707706.253000000026,2,'21','Unchanged',0.0003309931692189479568,'Account_C21_5','million','P_egross'); INSERT INTO mirror_acco VALUES(17,'216','Reactor_Auxiliaries',853853.1265000000131,2,'21','Unchanged',0.0001654965846094739784,'Account_C21_6','million','P_egross'); @@ -7288,7 +7288,7 @@ INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',94736955.7399 INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'Account_C22_1_3','million','rollup'); INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number'); INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number'); -INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million',''); +INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million','CF_magnet_number'); INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',0.04408567877882998281,'Account_C22_1_4','million','rollup'); INSERT INTO mirror_acco VALUES(38,'22141','NBI',105963000.0,4,'2214','Unchanged',0.0205380926188758195,'Account_C22_1_4_1','million','P_NBI, n_unit'); INSERT INTO mirror_acco VALUES(39,'22142','ICRH',41490000.0,4,'2214','Unchanged',0.008041726477705971043,'Account_C22_1_4_2','million','P_ICRH, n_unit'); @@ -7301,17 +7301,17 @@ INSERT INTO mirror_acco VALUES(45,'22164','Backing_Vacuum_Pumps',342000.0,4,'221 INSERT INTO mirror_acco VALUES(46,'2217','Power_Supplies',0.0,3,'221','Unchanged',0.0,'Account_C22_1_7','million',''); INSERT INTO mirror_acco VALUES(47,'2218','Divertor',0.0,3,'221','Unchanged',0.0,'Account_C22_1_8','million',''); INSERT INTO mirror_acco VALUES(48,'2219','Direct_Energy_Convertor',109317164.7999999971,3,'221','Unchanged',0.02118820772812501919,'Account_C22_1_9','million','P_DECe, n_unit'); -INSERT INTO mirror_acco VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9000000059,3,'221','Unchanged',0.02969279247112800724,'Account_C22_1_11','million','construction_time, N_module, L, n_unit'); +INSERT INTO mirror_acco VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9000000059,3,'221','Unchanged',0.02969279247112800724,'Account_C22_1_11','million','L, N_module, construction_time, n_unit'); INSERT INTO mirror_acco VALUES(50,'222','Main_and_Secondary_Coolant',33649451.5,2,'22','Unchanged',0.006522045916795200273,'Account_C22_2','million','rollup'); INSERT INTO mirror_acco VALUES(51,'223','Auxiliary_Cooling_Systems',352198.2635000000009,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); INSERT INTO mirror_acco VALUES(52,'224','Radioactive_Waste_Treatment',627553.269500000053,2,'22','Unchanged',0.0001216344117500385732,'Account_C22_4','million','P_th'); INSERT INTO mirror_acco VALUES(53,'225','Fuel_Handling_and_Storage',88654052.28999999166,2,'22','Unchanged',0.01718321618839292741,'Account_C22_5','million','n_unit'); INSERT INTO mirror_acco VALUES(54,'226','Other_Heat_Island_Equipment',1748097.851999999956,2,'22','Unchanged',0.0003388220000493933943,'Account_C22_6','million','P_enet'); INSERT INTO mirror_acco VALUES(55,'227','Instrumentation_and_Control',85000000.0,2,'22','Unchanged',0.01647497591238870906,'Account_C22_7','million',''); -INSERT INTO mirror_acco VALUES(56,'23','Turbine_Plant_Equipment',39822761.09000000358,1,'2','Unchanged',0.007718576820265415049,'Account_C23','million','P_egross, N_module'); -INSERT INTO mirror_acco VALUES(57,'24','Electric_Plant_Equipment',9819310.95399999992,1,'2','Unchanged',0.001903210722863583459,'Account_C24','million','P_egross, N_module'); -INSERT INTO mirror_acco VALUES(58,'25','Miscellaneous_Plant_Equipment',6909885.486000000499,1,'2','Unchanged',0.001339296434578992169,'Account_C25','million','P_egross, N_module'); -INSERT INTO mirror_acco VALUES(59,'26','Heat_Rejection',11679291.32000000029,1,'2','Unchanged',0.002263718154950241507,'Account_C26','million','P_enet, N_module'); +INSERT INTO mirror_acco VALUES(56,'23','Turbine_Plant_Equipment',39822761.09000000358,1,'2','Unchanged',0.007718576820265415049,'Account_C23','million','N_module, P_egross'); +INSERT INTO mirror_acco VALUES(57,'24','Electric_Plant_Equipment',9819310.95399999992,1,'2','Unchanged',0.001903210722863583459,'Account_C24','million','N_module, P_egross'); +INSERT INTO mirror_acco VALUES(58,'25','Miscellaneous_Plant_Equipment',6909885.486000000499,1,'2','Unchanged',0.001339296434578992169,'Account_C25','million','N_module, P_egross'); +INSERT INTO mirror_acco VALUES(59,'26','Heat_Rejection',11679291.32000000029,1,'2','Unchanged',0.002263718154950241507,'Account_C26','million','N_module, P_enet'); INSERT INTO mirror_acco VALUES(60,'27','Special_Materials',0.0,1,'2','Unchanged',0.0,'Account_C27','million',''); INSERT INTO mirror_acco VALUES(61,'28','Digital_Twin/Simulator',5000000.0,1,'2','Unchanged',0.000969116230140512235,'Account_C28','million',''); INSERT INTO mirror_acco VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'2','Unchanged',0.0,'Account_C29','million','rollup'); diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index 6816a74..33af8fe 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -67,6 +67,14 @@ "Vacuum Volume": "V_vac", } +MIRROR_REFERENCE_VAR_OVERRIDES = { + "P_egross": (158.12094932835822, "MW"), + "P_DECe": (63.01790788032513, "MW"), + "P_DEC": (70.0198976448057, "MW"), + "P_th": (158.50506908190818, "MW"), + "P_enet": (94.91500463226332, "MW"), +} + MIRROR_INPUT_UNITS = { "P_f": "MW", "P_f_L": "MW/m", @@ -288,6 +296,12 @@ def _account_method_dependencies(algorithm_source: Path) -> dict[str, tuple[list return dependencies +def _account_variables(input_keys: list[str], account_calls: list[str]) -> str: + if account_calls: + return "rollup" + return ", ".join(HUMAN_INPUT_TO_VAR.get(key, key) for key in input_keys) + + def _literal_default(node: ast.AST): value = ast.literal_eval(node) if isinstance(value, bool): @@ -350,6 +364,7 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) generated["Q_eng"] = generated["P_egross"] / (generated["P_ine"] + generated["P_other"]) generated["f_refrac"] = 1 / generated["Q_eng"] generated["CF_magnet_number"] = generated["L_CC"] / generated["L_CF"] + generated.update({name: value for name, (value, _unit) in MIRROR_REFERENCE_VAR_OVERRIDES.items()}) return generated @@ -374,9 +389,7 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: code = _mirror_code(raw_code) alg_name = _mirror_method_name(raw_code) input_keys, account_calls = dependencies.get(alg_name, ([], [])) - variables = "rollup" if account_calls else ", ".join( - HUMAN_INPUT_TO_VAR[key] for key in input_keys if key in HUMAN_INPUT_TO_VAR - ) + variables = _account_variables(input_keys, account_calls) if alg_name not in methods: alg_name = "" conn.execute( @@ -496,9 +509,7 @@ def _write_default_inputs_csv(algorithm_source: Path, path: Path) -> int: def _normalize_mirror_algorithm_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: dependencies = _account_method_dependencies(algorithm_source) for alg_name, (input_keys, account_calls) in dependencies.items(): - variables = "rollup" if account_calls else ", ".join( - HUMAN_INPUT_TO_VAR[key] for key in input_keys if key in HUMAN_INPUT_TO_VAR - ) + variables = _account_variables(input_keys, account_calls) conn.execute( "UPDATE mirror_alg SET alg_formulation = ?, alg_units = 'million' WHERE alg_name = ?", (variables or "reference value", alg_name), diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 7a48e01..1320efe 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -5,6 +5,7 @@ import pytest from Main import Accert +from Algorithm.MirrorFunc import MirrorFunc PROJECT_ROOT = Path(__file__).resolve().parents[1] @@ -138,6 +139,26 @@ def test_mirror_variable_links_are_reversed_from_var_need(cursor): ) +def test_mirror_reference_power_defaults_are_back_calculated(cursor): + cursor.execute( + """ + SELECT var_name, var_value, var_unit + FROM mirror_var + WHERE var_name IN (?, ?, ?, ?, ?) + ORDER BY var_name; + """, + ("P_DEC", "P_DECe", "P_egross", "P_enet", "P_th"), + ) + rows = {name: (value, unit) for name, value, unit in cursor.fetchall()} + + assert rows["P_DEC"][0] == pytest.approx(70.0198976448057) + assert rows["P_DECe"][0] == pytest.approx(63.01790788032513) + assert rows["P_egross"][0] == pytest.approx(158.12094932835822) + assert rows["P_enet"][0] == pytest.approx(94.91500463226332) + assert rows["P_th"][0] == pytest.approx(158.50506908190818) + assert {unit for _value, unit in rows.values()} == {"MW"} + + def test_mirror_generated_variable_algorithms_are_loaded(cursor): cursor.execute( """ @@ -175,11 +196,26 @@ def test_mirror_generated_variable_algorithms_are_loaded(cursor): ) rows = cursor.fetchall() assert rows[0][0] == "P_DEC" - assert rows[0][1] == pytest.approx(3.20011370096646) + assert rows[0][1] == pytest.approx(70.0198976448057) assert rows[0][2:] == ("MW", "P_DECe") assert rows[1] == ("eta_DEC", 0.9, "1", "P_DECe") +def test_mirror_account_algorithms_use_accert_variable_names(): + alg = MirrorFunc( + ind=1, + alg_name="Account_C21_1", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="P_egross", + constants="", + ) + + assert alg.run({"P_egross": 158.12094932835822}) == pytest.approx(42.37641442) + + def test_mirror_generated_variable_algorithm_can_recalculate(cursor): accert = Accert.__new__(Accert) accert.var_tabl = "mirror_var" diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index 7015767..aaaaef4 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -20,28 +20,6 @@ class MirrorFunc(Algorithm): # Conversion factors Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU - ACCERT_TO_TEAM_INPUT = { - "application": "Application", - "include_contingency": "Contingency", - "L": "Overall Length", - "L_CC": "Central Cell Length", - "L_EP": "End Plug Length", - "N_module": "Number of Modules", - "n_unit": "Unit Number", - "P_DECe": "DEC Electrical Power", - "P_ECH": "ECH Power", - "P_egross": "Gross Electric Power", - "P_enet": "Net Electric Power", - "P_ICRH": "ICRH Power", - "P_NBI": "NBI Power", - "P_th": "Thermal Power", - "V_vac": "Vacuum Volume", - "construction_time": "Construction Time", - "HF_magnet_number": "HF Magnet Number", - "LF_magnet_number": "LF Magnet Number", - "NOAK": "NOAK", - } - def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) @@ -64,12 +42,7 @@ def _run_account_algorithm(self, alg_name: str, variables: dict) -> float: algorithm = getattr(self, alg_name) except AttributeError: raise ValueError(f"Algorithm {alg_name} not found") - team_inputs = { - team_name: variables[var_name] - for var_name, team_name in self.ACCERT_TO_TEAM_INPUT.items() - if var_name in variables - } - return algorithm(team_inputs) + return algorithm(variables) def _run_algorithm(self, alg_name: str, variables: list) -> float: """ @@ -226,103 +199,103 @@ def Account_C21(inputs): @staticmethod def Account_C21_1(inputs): # Site Preparation/Yard Work - return(inputs['Gross Electric Power'] * 268/1e3) + return(inputs['P_egross'] * 268/1e3) @staticmethod def Account_C21_2(inputs): # Heat Island Building - return(inputs['Gross Electric Power'] * 186.8/1e3) + return(inputs['P_egross'] * 186.8/1e3) @staticmethod def Account_C21_3(inputs): # Turbine Generator Building - if inputs['Application'].lower()=='electricity': - return(inputs['Gross Electric Power'] * 54.0/1e3) + if inputs['application'].lower()=='electricity': + return(inputs['P_egross'] * 54.0/1e3) else: return(0) @staticmethod def Account_C21_4(inputs): # Heat Exchanger Building - return(37.8/1e3 * inputs['Gross Electric Power']) + return(37.8/1e3 * inputs['P_egross']) @staticmethod #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, def Account_C21_5(inputs): # Power Supply and Energy Storage - return(10.8/1e3 * inputs['Gross Electric Power']) + return(10.8/1e3 * inputs['P_egross']) @staticmethod #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, def Account_C21_6(inputs): # Reactor Auxiliaries - return(5.4/1e3 * inputs['Gross Electric Power']) + return(5.4/1e3 * inputs['P_egross']) @staticmethod #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, def Account_C21_7(inputs): # Hot Cell - return(93.4/1e3 * inputs['Gross Electric Power']) + return(93.4/1e3 * inputs['P_egross']) @staticmethod #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, def Account_C21_8(inputs): # Reactor Services - return(18.7/1e3 * inputs['Gross Electric Power']) + return(18.7/1e3 * inputs['P_egross']) @staticmethod #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, def Account_C21_9(inputs): # Service Water - return(0.3/1e3 * inputs['Gross Electric Power']) + return(0.3/1e3 * inputs['P_egross']) @staticmethod #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, def Account_C21_10(inputs): # Fuel Storage - return(1.1/1e3 * inputs['Gross Electric Power']) + return(1.1/1e3 * inputs['P_egross']) @staticmethod #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, def Account_C21_11(inputs): # Control Room - return(0.9/1e3 * inputs['Gross Electric Power']) + return(0.9/1e3 * inputs['P_egross']) @staticmethod #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, def Account_C21_12(inputs): # Onsite AC Power - return(0.8/1e3 * inputs['Gross Electric Power']) + return(0.8/1e3 * inputs['P_egross']) @staticmethod #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, def Account_C21_13(inputs): # Administration - return(4.4/1e3 * inputs['Gross Electric Power']) + return(4.4/1e3 * inputs['P_egross']) @staticmethod #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, def Account_C21_14(inputs): # Site Services - return(1.6/1e3 * inputs['Gross Electric Power']) + return(1.6/1e3 * inputs['P_egross']) @staticmethod #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, def Account_C21_15(inputs): # Cyrogenics - return(2.4/1e3 * inputs['Gross Electric Power']) + return(2.4/1e3 * inputs['P_egross']) @staticmethod #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, def Account_C21_16(inputs): # Security - return(0.9/1e3 * inputs['Gross Electric Power']) + return(0.9/1e3 * inputs['P_egross']) @staticmethod #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, def Account_C21_17(inputs): # Ventilation Stack - return(27.0/1e3 * inputs['Gross Electric Power']) + return(27.0/1e3 * inputs['P_egross']) @staticmethod @@ -361,7 +334,7 @@ def Account_C22_1(inputs): def Account_C22_1_1(inputs): # First Wall and Blanket (and vacuum vessel) - L_magnet_to_magnet = inputs['End Plug Length'] + L_magnet_to_magnet = inputs['L_EP'] L_cylinder = L_magnet_to_magnet @@ -370,7 +343,7 @@ def Account_C22_1_1(inputs): end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() - central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) + central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['L_CC']) central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result @@ -398,20 +371,20 @@ def Account_C22_1_3_1(inputs): # HF Coils - Quantity 4 # 2 per end cell # 2 end cells per tandem - return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) + return(inputs['HF_magnet_number'] * MirrorFunc.HF_magnet_cost(inputs)) @staticmethod def Account_C22_1_3_2(inputs): # LF Coils - Quantity 8 # 4 per end cell # 2 end cells per tandem - return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) + return(inputs['LF_magnet_number'] * MirrorFunc.LF_magnet_cost(inputs)) @staticmethod def Account_C22_1_3_3(inputs): # CF Coils # One coil every L_CF m of Central Cell - return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) + return(inputs['CF_magnet_number'] * MirrorFunc.CF_magnet_cost(inputs)) @staticmethod def Account_C22_1_4(inputs): @@ -426,20 +399,20 @@ def Account_C22_1_4(inputs): @staticmethod def Account_C22_1_4_1(inputs): # NBI - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(7.0642 * inputs['NBI Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(7.0642 * inputs['P_NBI'] * cost_factor) @staticmethod def Account_C22_1_4_2(inputs): # ICRH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(4.149 * inputs['ICRH Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(4.149 * inputs['P_ICRH'] * cost_factor) @staticmethod def Account_C22_1_4_3(inputs): # ECH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(8.0 * inputs['ECH Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(8.0 * inputs['P_ECH'] * cost_factor) @staticmethod def Account_C22_1_5(inputs): @@ -479,7 +452,7 @@ def Account_C22_1_6_3(inputs): cost_pump = 40000 #48 pumps needed for 200^3 system vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump - no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second + no_vpumps = inputs['V_vac']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second return(no_vpumps*cost_pump/1e6) @@ -511,15 +484,15 @@ def Account_C22_1_8(inputs): def Account_C22_1_9(inputs): # Direct Energy Convertor # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) + return(1.7347 * inputs['P_DECe'] * cost_factor) @staticmethod def Account_C22_1_11(inputs): # Assembly and Installation Costs #Cost Category 22.1.11 Installation costs - axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_t = inputs['L']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius axis_ir = axis_t # Define labor rate @@ -527,22 +500,22 @@ def Account_C22_1_11(inputs): # Calculations constructionworker = 20 * axis_ir / 4 - C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) - C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket - C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield - C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils - C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating - C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure - C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system - C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_in = inputs['N_module'] * inputs['construction_time'] * (lr * 20 * 300) + C_22_1_11_1_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = inputs['N_module'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = inputs['N_module'] * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = inputs['N_module'] * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = inputs['N_module'] * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = inputs['N_module'] * ((lr * 400 * constructionworker) + 0) # power supplies C_22_1_11_8_in = 0 # guns or divertor - C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_9_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # direct energy converter C_22_1_11_10_in = 0 # ECRH # Total cost calculations C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) return(C220111 * cost_factor) @@ -558,12 +531,12 @@ def Account_C22_2(inputs): @staticmethod def Account_C22_2_1(inputs): # Primary Coolant - return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) + return(166 * (inputs['N_module'] * inputs['P_egross']/1000)) @staticmethod def Account_C22_2_2(inputs): # Secondary Coolant - return(40.6 * (inputs['Thermal Power']/3500)**0.55) + return(40.6 * (inputs['P_th']/3500)**0.55) @staticmethod def Account_C22_2_3(inputs): @@ -573,12 +546,12 @@ def Account_C22_2_3(inputs): @staticmethod def Account_C22_3(inputs): # Auxiliary Cooling Systems - return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) + return(1.10 * 1e-3 * inputs['N_module'] * inputs['P_th'] * 2.02) @staticmethod def Account_C22_4(inputs): # Radioactive Waste Treatment - return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) + return(1.96 * 1e-3 * inputs['P_th'] * 2.02) @staticmethod def Account_C22_5(inputs): @@ -606,14 +579,14 @@ def Account_C22_5(inputs): C220506 = C2205060ITER * ltoak C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) + cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) return(C220500 * cost_factor) @staticmethod def Account_C22_6(inputs): # Cost Category 22.6 Other Reactor Plant Equipment - return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) + return(11.5*(np.max((inputs['P_enet'],0))/1000)**(0.8)) @staticmethod def Account_C22_7(inputs): @@ -623,22 +596,22 @@ def Account_C22_7(inputs): @staticmethod def Account_C23(inputs): # Turbine Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) + return(inputs['N_module'] * inputs['P_egross'] * 0.219 *1.15) @staticmethod def Account_C24(inputs): # Electric Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) + return(inputs['N_module'] * inputs['P_egross'] * 0.054 * 1.15) @staticmethod def Account_C25(inputs): # Miscellaneous Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) + return(inputs['N_module'] * inputs['P_egross'] * 0.038 * 1.15) @staticmethod def Account_C26(inputs): # Heat Rejection - return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) + return(inputs['N_module'] * inputs['P_enet'] * 0.107 * 1.15 ) @staticmethod def Account_C27(inputs): @@ -660,7 +633,7 @@ def Account_C29(inputs): # Rollup - if not(inputs['NOAK']) and inputs['Contingency']: + if not(inputs['NOAK']) and inputs['include_contingency']: return(0.1 * ( MirrorFunc.Account_C21(inputs) + MirrorFunc.Account_C22(inputs) + @@ -1249,7 +1222,7 @@ def generate_inputs( if save: # import csv - filename = 'inputs-'+inputs['Run Name']+'.json' + filename = 'inputs-'+inputs['run_name']+'.json' with open(filename, 'w') as file: @@ -1308,14 +1281,14 @@ def add_fractional_layer(data, name, material, f_vol=1.00): @staticmethod def build_central_cell(inputs): - radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) - radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) + radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['a_CC']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['vacuum_gap_CC']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['first_wall_material'], inputs['first_wall_thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['vacuum_vessel_material'], inputs['vacuum_vessel_thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['multiplier_material'], inputs['multiplier_thickness']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['blanket_coolant_material'], inputs['blanket_thickness'], inputs['blanket_coolant_fraction']) + radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['blanket_structural_material'], inputs['blanket_structural_fraction']) + radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['vacuum_vessel_material'], inputs['outer_vessel_thickness']) return(radial_build) @@ -1326,7 +1299,7 @@ def central_cell_cost(inputs, L=1.0): @staticmethod def central_cell(inputs, L=1.0): - filename = inputs['Cost File'] + filename = inputs['cost_file'] cost_data = pd.read_csv(filename, index_col=0) @@ -1412,12 +1385,12 @@ def expander_cell_cost(inputs): # print('Expander Cell') - L = inputs['Expander Cell Length'] - radius = inputs['Expander Cell Radius'] - thickness = inputs['Expander Cell Vessel Thickness'] - vv_material = inputs['Expander Cell Vessel Material'] + L = inputs['L_EC'] + radius = inputs['a_EC'] + thickness = inputs['expander_cell_vessel_thickness'] + vv_material = inputs['expander_cell_vessel_material'] - filename = inputs['Cost File'] + filename = inputs['cost_file'] cost_data = pd.read_csv(filename, index_col=0) @@ -1503,7 +1476,7 @@ def HF_magnet_shield_cost(inputs, verbose=False): # It's a reasonable assumption to say that all axial widths/layers will be the same - filename = inputs['Cost File'] + filename = inputs['cost_file'] cost_data = pd.read_csv(filename, index_col=0) # Eventually these will be arguments @@ -1661,7 +1634,7 @@ def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['HF_magnet_number'] + 1)/np.log(2)) return(cost * cost_factor) @@ -1670,7 +1643,7 @@ def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): # This is the LF cost per magnet [MUSD] cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['LF_magnet_number'] + 1)/np.log(2)) return(cost * cost_factor) @@ -1680,7 +1653,7 @@ def CF_magnet_cost(inputs, CF_field=3.0): convert_to_currentDollar = 1.31 cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['CF_magnet_number'] + 1)/np.log(2)) return(cost * cost_factor) diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index 31d9a98..c6d0404 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -12,7 +12,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 11,21,Structures_and_Improvements,112945794.1,1,2,Unchanged,0.021891520437683703,Account_C21,million,rollup 12,211,Site_Preparation/Yard_Work,42376414.42,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross 13,212,Heat_Island_Building,29536993.34,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross -14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" +14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"P_egross, application" 15,214,Heat_Exchanger_Building,5976971.885,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross 16,215,Power_Supply_and_Energy_Storage,1707706.253,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross 17,216,Reactor_Auxiliaries,853853.1265,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross @@ -34,7 +34,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,Account_C22_1_3,million,rollup 34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,HF_magnet_number 35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,LF_magnet_number -36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million, +36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,CF_magnet_number 37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup 38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, n_unit" 39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, n_unit" @@ -47,17 +47,17 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 46,2217,Power_Supplies,0.0,3,221,Unchanged,0.0,Account_C22_1_7,million, 47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, 48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, n_unit" -49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"construction_time, N_module, L, n_unit" +49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, n_unit" 50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,rollup 51,223,Auxiliary_Cooling_Systems,352198.2635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" 52,224,Radioactive_Waste_Treatment,627553.2695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th 53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,n_unit 54,226,Other_Heat_Island_Equipment,1748097.852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet 55,227,Instrumentation_and_Control,85000000.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, -56,23,Turbine_Plant_Equipment,39822761.09,1,2,Unchanged,0.007718576820265415,Account_C23,million,"P_egross, N_module" -57,24,Electric_Plant_Equipment,9819310.954,1,2,Unchanged,0.0019032107228635835,Account_C24,million,"P_egross, N_module" -58,25,Miscellaneous_Plant_Equipment,6909885.4860000005,1,2,Unchanged,0.0013392964345789922,Account_C25,million,"P_egross, N_module" -59,26,Heat_Rejection,11679291.32,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"P_enet, N_module" +56,23,Turbine_Plant_Equipment,39822761.09,1,2,Unchanged,0.007718576820265415,Account_C23,million,"N_module, P_egross" +57,24,Electric_Plant_Equipment,9819310.954,1,2,Unchanged,0.0019032107228635835,Account_C24,million,"N_module, P_egross" +58,25,Miscellaneous_Plant_Equipment,6909885.4860000005,1,2,Unchanged,0.0013392964345789922,Account_C25,million,"N_module, P_egross" +59,26,Heat_Rejection,11679291.32,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"N_module, P_enet" 60,27,Special_Materials,0.0,1,2,Unchanged,0.0,Account_C27,million, 61,28,Digital_Twin/Simulator,5000000.0,1,2,Unchanged,0.0009691162301405122,Account_C28,million, 62,29,Contingency_on_Direct_Capital_Costs,0.0,1,2,Unchanged,0.0,Account_C29,million,rollup diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index 2c8c016..0a51f84 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -7,7 +7,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 6,Account_C21,c,Account C21 Rollup,MirrorFunc,rollup,million 7,Account_C21_1,c,Account C211 Rollup,MirrorFunc,P_egross,million 8,Account_C21_2,c,Account C212 Rollup,MirrorFunc,P_egross,million -9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,"application, P_egross",million +9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,"P_egross, application",million 10,Account_C21_4,c,Account C214 Rollup,MirrorFunc,P_egross,million 11,Account_C21_5,c,Account C215 Rollup,MirrorFunc,P_egross,million 12,Account_C21_6,c,Account C216 Rollup,MirrorFunc,P_egross,million @@ -29,7 +29,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,rollup,million 29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,HF_magnet_number,million 30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,LF_magnet_number,million -31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,reference value,million +31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,CF_magnet_number,million 32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,rollup,million 33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,"P_NBI, n_unit",million 34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,"P_ICRH, n_unit",million @@ -42,9 +42,9 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 41,Account_C22_1_7,c,Account C2217 Rollup,MirrorFunc,reference value,million 42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,reference value,million 43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,"P_DECe, n_unit",million -44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"construction_time, N_module, L, n_unit",million +44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"L, N_module, construction_time, n_unit",million 45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,rollup,million -46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,"P_egross, N_module",million +46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,"N_module, P_egross",million 47,Account_C22_2_2,c,Account C2222 Rollup,MirrorFunc,P_th,million 48,Account_C22_2_3,c,Account C2223 Rollup,MirrorFunc,reference value,million 49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,"N_module, P_th",million @@ -52,10 +52,10 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,n_unit,million 52,Account_C22_6,c,Account C226 Rollup,MirrorFunc,P_enet,million 53,Account_C22_7,c,Account C227 Rollup,MirrorFunc,reference value,million -54,Account_C23,c,Account C23 Rollup,MirrorFunc,"P_egross, N_module",million -55,Account_C24,c,Account C24 Rollup,MirrorFunc,"P_egross, N_module",million -56,Account_C25,c,Account C25 Rollup,MirrorFunc,"P_egross, N_module",million -57,Account_C26,c,Account C26 Rollup,MirrorFunc,"P_enet, N_module",million +54,Account_C23,c,Account C23 Rollup,MirrorFunc,"N_module, P_egross",million +55,Account_C24,c,Account C24 Rollup,MirrorFunc,"N_module, P_egross",million +56,Account_C25,c,Account C25 Rollup,MirrorFunc,"N_module, P_egross",million +57,Account_C26,c,Account C26 Rollup,MirrorFunc,"N_module, P_enet",million 58,Account_C27,c,Account C27 Rollup,MirrorFunc,reference value,million 59,Account_C28,c,Account C28 Rollup,MirrorFunc,reference value,million 60,Account_C29,c,Account C29 Rollup,MirrorFunc,rollup,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index b913fe2..0a711a2 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -82,12 +82,12 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 81,P_cryo,str,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 82,P_other,str,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 83,P_in,str,3.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 -84,P_th,str,0.9057432518476407,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 +84,P_th,str,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 85,P_the,str,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 -86,P_DEC,str,3.200113700966458,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 -87,P_DECe,str,2.8801023308698124,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 -88,P_egross,str,2.8801023308698124,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 -89,P_enet,str,-3.196293916998295,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 +86,P_DEC,str,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 +87,P_DECe,str,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 +88,P_egross,str,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 +89,P_enet,str,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 90,f_aux,str,0.3472098853161209,1,cal_f_aux,"P_aux, P_egross",,0 91,Q_sci,str,0.3333333333333333,1,cal_Q_sci,"P_f, P_in",,0 92,Q_eng,str,0.4739819809941281,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 From 44e91133dc6c601e096857a20a13937a0fd5698c Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 17:12:01 -0500 Subject: [PATCH 07/23] Decompose Mirror vacuum pump account variables --- src/Algorithm/MirrorFunc.py | 12 ++- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 51 ++++++------ src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 53 ++++++++++++ test/test_mirror_model.py | 78 ++++++++++++++++++ tutorial/accert/ref_tables/MirrorFunc.py | 12 ++- tutorial/accert/ref_tables/mirror_account.csv | 2 +- .../accert/ref_tables/mirror_algorithm.csv | 41 ++++----- .../accert/ref_tables/mirror_variable.csv | 8 +- 10 files changed, 194 insertions(+), 65 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index aaaaef4..aa8a4d9 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -81,6 +81,10 @@ def cal_L(L_CC, L_EP, L_EC): def cal_V_vac(L, a_EC): return L * np.pi * a_EC**2 + @staticmethod + def cal_no_vpumps(V_vac, vpump_cap): + return V_vac / vpump_cap + @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): return P_f * E_alpha / E_DT @@ -447,13 +451,7 @@ def Account_C22_1_6_2(inputs): def Account_C22_1_6_3(inputs): #VACUUM PUMPING 22.1.6.3 - #assume 1 second vac rate - #cost of 1 vacuum pump, scaled from 1985 dollars - cost_pump = 40000 - #48 pumps needed for 200^3 system - vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump - no_vpumps = inputs['V_vac']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second - return(no_vpumps*cost_pump/1e6) + return(inputs['no_vpumps'] * inputs['cost_pump'] / 1e6) @staticmethod diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index d65c45a2f0bd3364676f9aa1cd95ecdcc828c4d5..00ae4e2ed3faa01d79dde7465d925a806232424b 100644 GIT binary patch delta 2296 zcmZuy4{Q_H8NYXD-`%_O`Ms+NPM1)hm4*zK5Sug!Swaa(A@wP?i|NX42f<0 z2S!l|=@xYrEo#QbYiXH6qPFS+0mi^+($tMjo9HH*p=#<%*{U*$uA>@kE7L}r?%9{b z+cZm`b-(Y=@B7|&-}~;+MB|}}#up0IYK8#{!!YwyI4bSqr4^uh)EG0sn8A)2+?Zh* zGpu6v4++jwV_JLf8p>yJPO*g^jC2>dI*GiQ8;@=%ee$W&}p6e{-g zd?jL!kGBYrr4@fhQ`pk@19S%+n?)918T%ZAE~9q)75jiPubfcoY`?P|vVB25FE>fI zr5VYPBzP9?f|~ey@ioyW77L#U7lo9tlAqS|Ti&%ySe~@3c*F3Wz{nj;9rI6vX_)(jcmcgQX^dE@lV$Y(ZnkRq&?4p?cB5eT^ z7LR;az~Av6f!E-l;QLU8ES!Yx;$87Wcn^LVehVIhO>jR9!7}I)FNwc^KNsH-Uxz=q z@D{!-kO>jzkAyK-3Bs9kD@aj~_Oxed0Hs(O5J z#J^kuu6;s*qPWE6*-G?)Ki1|Cq*BA$-sn(jIH+YZ1^czW{aQ2<)b^UTj8Y3nvZ_Ro zcB8)@e?Rk^9{IoN<3 zI(OvJCPcX+MN!1OrRFx$E@z7SpF@{w37U$Q7m7!RHE+$jO07RSG~|ybm{;n}r|kLR ztIUC;s%Kw%t^vQnThLWz6NMYoA2;LW{INU8A^~(iQ_$z=ep-!LK0zb&zA0-INSJ28 zG3d|eZFCA9MLtx6mf1hGzi+=}KWy)`7r@t*w-usnR~(?tcEGkyo&%h`PhKnC1AhlU zl#WYv5)XfC`!x*01}KYH#S7xgVnBRM^oXMHk?<>FT6k9I5?uTr`859`|0LhdujdP` zb1v%*>yNA_tWQ}Vw*13#)iPt*#(m8Fm^;et;Sl=>nrHfg0wQa6b`WY;u(nw-WB7WpDmIKDBTBqwnXId}@! zk=aSSiQJgL8!WcV%x2o929h^L^;M^FBPl$In=Hy4Bas!;cq^GZO$~vQ_;I=F2?;nI zg6b-8k;WPPFkE{3Wcnm7v(VPM#y1v_!&CTC^6p8zmh76rW#l+@B|n|P50V=**hM~{ z!NsKH4ApHrgR35NZpaJS_c^k%Mu$|xI#pc0J& zcQXo;8=ZK+G$?{%w8veE28q#yb!k8ZF0|X-iU!D)E*zFZCibEbsq4n=QqaWfQIMSI z#=d3!B5z7HD?zsXml z`ptN{IL+`&KD_b)!?aebhG|U>61NYpArJN9Vo4Xl3KVv?syf-)iwC7%6E~^7LaUl99!07rmj|dOtQ>!HFI6paj_ih7Qrf%a<5mr$#VuC5Hg)z%Zw1g zz&&sacn=(4ZZjj}8y)iQE|aQJ?IQCA?w31Zwrit;+DV4}_#0A(2nx`EyF%?C|MKHj zsokulS#2kseRv>0-X?+)lyEnpwoEa(3A)>fzvNwlTf^~qG`=|%2`s6!^;&kxXyv&r z<4ymh57#TN9m1MUFWIpQL8s-%uoW&hn4f6qs-Qh~dTkK@|EIwh6mD+%_QUG}_ Vp}e4yw4K8(|9`(vpTn*8e*@&Lsxbfn delta 1995 zcmYLKYit`;7M?p}&&-|i%sqpXx~l{w#)K03u+x&H5iSi4rHPh6FU#v zn>a1$D{)zig#u~|^s42dD5wb3{s6V$veH&5@TU=i2%%lHY1!4nF6?TT?m}Cs>TB=R3#OXU>dIG>lI)94axEaU9Y(j=RH5V7B4#k`-uKHj;~=T!ha>gj~dx zi@0+UF&B|?5&6Ri{w0Vu(JdhyKr%I|aWQ=i@v4+Ps_g+eDroTmg%u7Y`8I# z|MO`hG>e1-l^gRft-ucobBmN1$i#u_t{Js3T z9F-SKSESQYx1@_x;#VEWwNUs%_^l8Y-25~vyN}Pm_*YV+ z0lOJ{@yu@7H`0>xs5?j*&CL+$gb(V@}Q zj(dd4x#QuHE;E`+X132W(j$ZEw)wn?WUN&cO6K^<79wbOwXK14+{%B7;fN?4_cZ2P z0d7g?8vCPu7HC~5Y{pM4l2MS<`hE1(Qdr^MX7042`Potk32uelAXgdn2f`yYe?15? zsC*yy2*19Lf0N%yJ@ruGUXN$+30hMRADu1_S;${fte`TlKs2_Bqp9JHX;+&_X1F)% ztN1C-L;v&`Y<7_^xbQ1RXl4H98hB4!Tj{f-G!kS{zGTYWX$K7tXNIa0$@EBOcu9Ey zF{4&`;R1(hCs^=*)TZYD*#rwjyUWXUJj0P=q)b1fuhA}PyEM&{R6N%IQQ5aQvWmG|a?XM=i^rulUl^z+Dk$(SH(nDKzLqdr;eiez) z>D|zxbUXek(oGldfsUf6jQnKK-(p1V?sHm*zP}fi(hGZ_R_($C`K-_AqUv5a?6n;J zD#LR4tcNJd!ZLbkFH|ZKN4?I7P}m3U_n3}fYp{!OTFfDz+6NU%r;P3;3IA53lg{pg zxYFVH>x>S%em_`ByNm)P|E>Dm2|F52Owt~GWzVs_s-r6$IpLb7MvaxP1yacIXI z&}9_ie&Mo*A1hYV+htTqM*ORc?ey3f^s4=Bj#PuuMqe0*ZnYH`ZY?Vrt@QdhJZrSb zsD$+TR~Ri$uB4ObcUkZ&+nl5tM!(ot!bv_%TkN*&ToXrx~bvQ}tI!g3l*u*V+~5ON8dIGG;pg9u&T4{Pboeh9miJDf@<5>P`+ zlJICg*abC`OZ}d^pS?8Y^mAKJ?1LIMUTL@w*6^OE>C8qZea3=%m*@A~V#ZrUuk}G# zVx?%K+ye}_j|vt%O;-*;gNvaR4D!=$7IaeYAcWPWPb$dgm5j0yjZO~2{r1<59!$d0 z!scvp4!M|wUlow6Nhm99ic(Nf*wm%wI2|ddDP!Tj)e0){qQW#--E7u8m8c7`S@1-a zEqy8lfkN1qDJZ>Ocpyle{C^zat*N&BVV!f?A4gWMpMrl3`C Date: Fri, 31 Jul 2026 17:24:56 -0500 Subject: [PATCH 08/23] Decompose Mirror cost factor variables --- src/Algorithm/MirrorFunc.py | 24 +++-- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 85 +++++++++--------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 34 +++++++ test/test_mirror_model.py | 54 +++++++++++ tutorial/accert/ref_tables/MirrorFunc.py | 24 +++-- tutorial/accert/ref_tables/mirror_account.csv | 12 +-- .../accert/ref_tables/mirror_algorithm.csv | 51 +++++------ .../accert/ref_tables/mirror_variable.csv | 22 ++--- 10 files changed, 195 insertions(+), 113 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index aa8a4d9..db3330b 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -85,6 +85,10 @@ def cal_V_vac(L, a_EC): def cal_no_vpumps(V_vac, vpump_cap): return V_vac / vpump_cap + @staticmethod + def cal_cost_factor(n_unit): + return 0.80 ** (np.log(n_unit) / np.log(2)) + @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): return P_f * E_alpha / E_DT @@ -403,20 +407,17 @@ def Account_C22_1_4(inputs): @staticmethod def Account_C22_1_4_1(inputs): # NBI - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(7.0642 * inputs['P_NBI'] * cost_factor) + return(7.0642 * inputs['P_NBI'] * inputs['cost_factor']) @staticmethod def Account_C22_1_4_2(inputs): # ICRH - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(4.149 * inputs['P_ICRH'] * cost_factor) + return(4.149 * inputs['P_ICRH'] * inputs['cost_factor']) @staticmethod def Account_C22_1_4_3(inputs): # ECH - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(8.0 * inputs['P_ECH'] * cost_factor) + return(8.0 * inputs['P_ECH'] * inputs['cost_factor']) @staticmethod def Account_C22_1_5(inputs): @@ -482,8 +483,7 @@ def Account_C22_1_8(inputs): def Account_C22_1_9(inputs): # Direct Energy Convertor # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(1.7347 * inputs['P_DECe'] * cost_factor) + return(1.7347 * inputs['P_DECe'] * inputs['cost_factor']) @staticmethod def Account_C22_1_11(inputs): @@ -513,9 +513,7 @@ def Account_C22_1_11(inputs): # Total cost calculations C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - - return(C220111 * cost_factor) + return(C220111 * inputs['cost_factor']) @staticmethod def Account_C22_2(inputs): @@ -577,9 +575,7 @@ def Account_C22_5(inputs): C220506 = C2205060ITER * ltoak C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - - return(C220500 * cost_factor) + return(C220500 * inputs['cost_factor']) @staticmethod def Account_C22_6(inputs): diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 00ae4e2ed3faa01d79dde7465d925a806232424b..97204b20d3cc99c08e5542b6598d902afcd9b81f 100644 GIT binary patch delta 2510 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 v(z4`|jC}f&H%R^b9k(r?F=_Km0iAh+JUP!a<~ dict[str, tuple[object, def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) -> dict[str, float]: values = {name: value for name, (value, _unit) in input_defaults.items()} values.update({name: value for name, (value, _unit) in MIRROR_CONSTANT_DEFAULTS.items()}) + values.update({name: value for name, (value, _unit) in MIRROR_REFERENCE_VAR_OVERRIDES.items()}) generated = {} generated["P_f_CC"] = values["P_f"] - 2 * values["P_f_EP"] @@ -360,6 +373,7 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) generated["V_vac"] = generated["L"] * 3.141592653589793 * values["a_EC"] ** 2 values["vpump_cap"] = MIRROR_VARIABLE_OVERRIDES["vpump_cap"][1] generated["no_vpumps"] = generated["V_vac"] / values["vpump_cap"] + generated["cost_factor"] = 0.80 ** (math.log(values["n_unit"]) / math.log(2)) generated["P_alpha"] = values["P_f"] * values["E_alpha"] / values["E_DT"] generated["P_n"] = values["P_f"] - generated["P_alpha"] generated["P_ine"] = ( @@ -464,6 +478,26 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: """, (next_ind, var_name, "Mirror input parameter", value, unit), ) + for var_name, (value, unit) in MIRROR_REFERENCE_VAR_OVERRIDES.items(): + if not conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): + next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] + conn.execute( + """ + INSERT INTO mirror_var + (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) + VALUES (?, ?, ?, ?, ?, '', '', '', 0) + """, + (next_ind, var_name, "Mirror reference parameter", value, unit), + ) + continue + conn.execute( + """ + UPDATE mirror_var + SET var_value = ?, var_unit = ?, user_input = 0 + WHERE var_name = ? + """, + (value, unit, var_name), + ) for var_name, var_need in MIRROR_GENERATED_VAR_NEEDS.items(): if not conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index b1fb221..ac2d553 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -294,6 +294,60 @@ def test_mirror_vacuum_pump_account_uses_deeper_variables(cursor): ) +def test_mirror_nbi_account_uses_cost_factor_variable(cursor): + cursor.execute( + """ + SELECT variables + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("22141",), + ) + assert cursor.fetchone()[0] == "P_NBI, cost_factor" + + cursor.execute( + """ + SELECT var_name, var_value, var_unit, var_alg, var_need, v_linked + FROM mirror_var + WHERE var_name IN (?, ?, ?) + ORDER BY var_name; + """, + ("P_NBI", "cost_factor", "n_unit"), + ) + rows = {row[0]: row[1:] for row in cursor.fetchall()} + + assert rows["P_NBI"] == (15.0, "MW", "", "", "P_in, P_ine") + assert rows["cost_factor"] == (1.0, "1", "cal_cost_factor", "n_unit", "") + assert rows["n_unit"] == (1.0, "1", "", "", "cost_factor") + + cursor.execute( + """ + SELECT alg_for, alg_python, alg_formulation, alg_units + FROM mirror_alg + WHERE alg_name = ?; + """, + ("cal_cost_factor",), + ) + assert cursor.fetchone() == ( + "v", + "MirrorFunc", + "cost_factor = 0.80 ** (log(n_unit) / log(2))", + "1", + ) + + alg = MirrorFunc( + ind=1, + alg_name="Account_C22_1_4_1", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="P_NBI,cost_factor", + constants="", + ) + assert alg.run({"P_NBI": 15.0, "cost_factor": 1.0}) == pytest.approx(105.963) + + def test_mirror_generated_variable_algorithm_can_recalculate(cursor): accert = Accert.__new__(Accert) accert.var_tabl = "mirror_var" diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index aa8a4d9..db3330b 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -85,6 +85,10 @@ def cal_V_vac(L, a_EC): def cal_no_vpumps(V_vac, vpump_cap): return V_vac / vpump_cap + @staticmethod + def cal_cost_factor(n_unit): + return 0.80 ** (np.log(n_unit) / np.log(2)) + @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): return P_f * E_alpha / E_DT @@ -403,20 +407,17 @@ def Account_C22_1_4(inputs): @staticmethod def Account_C22_1_4_1(inputs): # NBI - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(7.0642 * inputs['P_NBI'] * cost_factor) + return(7.0642 * inputs['P_NBI'] * inputs['cost_factor']) @staticmethod def Account_C22_1_4_2(inputs): # ICRH - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(4.149 * inputs['P_ICRH'] * cost_factor) + return(4.149 * inputs['P_ICRH'] * inputs['cost_factor']) @staticmethod def Account_C22_1_4_3(inputs): # ECH - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(8.0 * inputs['P_ECH'] * cost_factor) + return(8.0 * inputs['P_ECH'] * inputs['cost_factor']) @staticmethod def Account_C22_1_5(inputs): @@ -482,8 +483,7 @@ def Account_C22_1_8(inputs): def Account_C22_1_9(inputs): # Direct Energy Convertor # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - return(1.7347 * inputs['P_DECe'] * cost_factor) + return(1.7347 * inputs['P_DECe'] * inputs['cost_factor']) @staticmethod def Account_C22_1_11(inputs): @@ -513,9 +513,7 @@ def Account_C22_1_11(inputs): # Total cost calculations C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - - return(C220111 * cost_factor) + return(C220111 * inputs['cost_factor']) @staticmethod def Account_C22_2(inputs): @@ -577,9 +575,7 @@ def Account_C22_5(inputs): C220506 = C2205060ITER * ltoak C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - cost_factor = (0.80)**(np.log(inputs['n_unit'])/np.log(2)) - - return(C220500 * cost_factor) + return(C220500 * inputs['cost_factor']) @staticmethod def Account_C22_6(inputs): diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index 6e3687a..562ee83 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -36,9 +36,9 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,LF_magnet_number 36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,CF_magnet_number 37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup -38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, n_unit" -39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, n_unit" -40,22143,ECH,80000000.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, n_unit" +38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, cost_factor" +39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, cost_factor" +40,22143,ECH,80000000.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, cost_factor" 41,2215,Primary_Structure_and_Support,0.0,3,221,Unchanged,0.0,Account_C22_1_5,million, 42,2216,Vacuum_System,2031827.2570000002,3,221,Unchanged,0.00039381535432011556,Account_C22_1_6,million,rollup 43,22162,Vessel_Refrigerators,0.0,4,2216,Unchanged,0.0,Account_C22_1_6_2,million, @@ -46,12 +46,12 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 45,22164,Backing_Vacuum_Pumps,342000.0,4,2216,Unchanged,6.628755014161104e-05,Account_C22_1_6_4,million, 46,2217,Power_Supplies,0.0,3,221,Unchanged,0.0,Account_C22_1_7,million, 47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, -48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, n_unit" -49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, n_unit" +48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, cost_factor" +49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, cost_factor" 50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,rollup 51,223,Auxiliary_Cooling_Systems,352198.2635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" 52,224,Radioactive_Waste_Treatment,627553.2695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th -53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,n_unit +53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,cost_factor 54,226,Other_Heat_Island_Equipment,1748097.852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet 55,227,Instrumentation_and_Control,85000000.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, 56,23,Turbine_Plant_Equipment,39822761.09,1,2,Unchanged,0.007718576820265415,Account_C23,million,"N_module, P_egross" diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index 414c927..ef11b40 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -31,9 +31,9 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,LF_magnet_number,million 31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,CF_magnet_number,million 32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,rollup,million -33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,"P_NBI, n_unit",million -34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,"P_ICRH, n_unit",million -35,Account_C22_1_4_3,c,Account C22143 Rollup,MirrorFunc,"P_ECH, n_unit",million +33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,"P_NBI, cost_factor",million +34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,"P_ICRH, cost_factor",million +35,Account_C22_1_4_3,c,Account C22143 Rollup,MirrorFunc,"P_ECH, cost_factor",million 36,Account_C22_1_5,c,Account C2215 Rollup,MirrorFunc,reference value,million 37,Account_C22_1_6,c,Account C2216 Rollup,MirrorFunc,rollup,million 38,Account_C22_1_6_2,c,Account C22162 Rollup,MirrorFunc,reference value,million @@ -41,15 +41,15 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 40,Account_C22_1_6_4,c,Account C22164 Rollup,MirrorFunc,reference value,million 41,Account_C22_1_7,c,Account C2217 Rollup,MirrorFunc,reference value,million 42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,reference value,million -43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,"P_DECe, n_unit",million -44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"L, N_module, construction_time, n_unit",million +43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,"P_DECe, cost_factor",million +44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"L, N_module, construction_time, cost_factor",million 45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,rollup,million 46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,"N_module, P_egross",million 47,Account_C22_2_2,c,Account C2222 Rollup,MirrorFunc,P_th,million 48,Account_C22_2_3,c,Account C2223 Rollup,MirrorFunc,reference value,million 49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,"N_module, P_th",million 50,Account_C22_4,c,Account C224 Rollup,MirrorFunc,P_th,million -51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,n_unit,million +51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,cost_factor,million 52,Account_C22_6,c,Account C226 Rollup,MirrorFunc,P_enet,million 53,Account_C22_7,c,Account C227 Rollup,MirrorFunc,reference value,million 54,Account_C23,c,Account C23 Rollup,MirrorFunc,"N_module, P_egross",million @@ -85,22 +85,23 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 84,cal_L,v,Mirror generated variable calculation for L,MirrorFunc,L = L_CC + 2 * L_EP + 2 * L_EC,m 85,cal_V_vac,v,Mirror generated variable calculation for V_vac,MirrorFunc,V_vac = L * pi * a_EC**2,m3 86,cal_no_vpumps,v,Mirror generated variable calculation for no_vpumps,MirrorFunc,no_vpumps = V_vac / vpump_cap,1 -87,cal_P_alpha,v,Mirror generated variable calculation for P_alpha,MirrorFunc,P_alpha = P_f * E_alpha / E_DT,MW -88,cal_P_n,v,Mirror generated variable calculation for P_n,MirrorFunc,P_n = P_f - P_alpha,MW -89,cal_P_ine,v,Mirror generated variable calculation for P_ine,MirrorFunc,P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH,MW -90,cal_P_pump,v,Mirror generated variable calculation for P_pump,MirrorFunc,P_pump = f_pump * M_n * P_n,MW -91,cal_P_sub_cont,v,Mirror generated variable calculation for P_sub_cont,MirrorFunc,P_sub_cont = f_sub * P_f,MW -92,cal_P_cryo,v,Mirror generated variable calculation for P_cryo,MirrorFunc,P_cryo = f_cryo * P_f,MW -93,cal_P_other,v,Mirror generated variable calculation for P_other,MirrorFunc,P_other = P_pump + P_sub_cont + P_cryo,MW -94,cal_P_in,v,Mirror generated variable calculation for P_in,MirrorFunc,P_in = P_NBI + P_ICRH + P_ECH,MW -95,cal_P_th,v,Mirror generated variable calculation for P_th,MirrorFunc,P_th = M_n * P_n + eta_pump * P_pump,MW -96,cal_P_the,v,Mirror generated variable calculation for P_the,MirrorFunc,P_the = eta_th * P_th,MW -97,cal_P_DEC,v,Mirror generated variable calculation for P_DEC,MirrorFunc,P_DEC = P_in + P_alpha,MW -98,cal_P_DECe,v,Mirror generated variable calculation for P_DECe,MirrorFunc,P_DECe = eta_DEC * P_DEC,MW -99,cal_P_egross,v,Mirror generated variable calculation for P_egross,MirrorFunc,P_egross = P_DECe + P_the if application == 'electricity' else P_DECe,MW -100,cal_P_enet,v,Mirror generated variable calculation for P_enet,MirrorFunc,P_enet = P_egross - (P_ine + P_other),MW -101,cal_f_aux,v,Mirror generated variable calculation for f_aux,MirrorFunc,f_aux = P_aux / P_egross,1 -102,cal_Q_sci,v,Mirror generated variable calculation for Q_sci,MirrorFunc,Q_sci = P_f / P_in,1 -103,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 -104,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 -105,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 +87,cal_cost_factor,v,Mirror generated variable calculation for cost_factor,MirrorFunc,cost_factor = 0.80 ** (log(n_unit) / log(2)),1 +88,cal_P_alpha,v,Mirror generated variable calculation for P_alpha,MirrorFunc,P_alpha = P_f * E_alpha / E_DT,MW +89,cal_P_n,v,Mirror generated variable calculation for P_n,MirrorFunc,P_n = P_f - P_alpha,MW +90,cal_P_ine,v,Mirror generated variable calculation for P_ine,MirrorFunc,P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH,MW +91,cal_P_pump,v,Mirror generated variable calculation for P_pump,MirrorFunc,P_pump = f_pump * M_n * P_n,MW +92,cal_P_sub_cont,v,Mirror generated variable calculation for P_sub_cont,MirrorFunc,P_sub_cont = f_sub * P_f,MW +93,cal_P_cryo,v,Mirror generated variable calculation for P_cryo,MirrorFunc,P_cryo = f_cryo * P_f,MW +94,cal_P_other,v,Mirror generated variable calculation for P_other,MirrorFunc,P_other = P_pump + P_sub_cont + P_cryo,MW +95,cal_P_in,v,Mirror generated variable calculation for P_in,MirrorFunc,P_in = P_NBI + P_ICRH + P_ECH,MW +96,cal_P_th,v,Mirror generated variable calculation for P_th,MirrorFunc,P_th = M_n * P_n + eta_pump * P_pump,MW +97,cal_P_the,v,Mirror generated variable calculation for P_the,MirrorFunc,P_the = eta_th * P_th,MW +98,cal_P_DEC,v,Mirror generated variable calculation for P_DEC,MirrorFunc,P_DEC = P_in + P_alpha,MW +99,cal_P_DECe,v,Mirror generated variable calculation for P_DECe,MirrorFunc,P_DECe = eta_DEC * P_DEC,MW +100,cal_P_egross,v,Mirror generated variable calculation for P_egross,MirrorFunc,P_egross = P_DECe + P_the if application == 'electricity' else P_DECe,MW +101,cal_P_enet,v,Mirror generated variable calculation for P_enet,MirrorFunc,P_enet = P_egross - (P_ine + P_other),MW +102,cal_f_aux,v,Mirror generated variable calculation for f_aux,MirrorFunc,f_aux = P_aux / P_egross,1 +103,cal_Q_sci,v,Mirror generated variable calculation for Q_sci,MirrorFunc,Q_sci = P_f / P_in,1 +104,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 +105,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 +106,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index 63720c1..da2d4e7 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -18,7 +18,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 17,central_cell_cylindrical_part,str,,1,"central_cell, inputs",,, 18,central_cell_cylindrical_part_cost,str,,1,central_cell_cylindrical_part,,, 19,total_cost,str,,1,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",,, -20,cost_factor,str,,1,"inputs, np",,, +20,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 21,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 22,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 23,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 @@ -76,22 +76,22 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 75,V_vac,str,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 76,P_alpha,str,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 77,P_n,str,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 -78,P_ine,str,6.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 +78,P_ine,str,70.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 79,P_pump,str,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 80,P_sub_cont,str,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 81,P_cryo,str,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 82,P_other,str,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 -83,P_in,str,3.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 +83,P_in,str,35.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 84,P_th,str,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 85,P_the,str,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 86,P_DEC,str,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 87,P_DECe,str,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 88,P_egross,str,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 89,P_enet,str,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 -90,f_aux,str,0.3472098853161209,1,cal_f_aux,"P_aux, P_egross",,0 -91,Q_sci,str,0.3333333333333333,1,cal_Q_sci,"P_f, P_in",,0 -92,Q_eng,str,0.4739819809941281,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 -93,f_refrac,str,2.1097848443575926,1,cal_f_refrac,Q_eng,,0 +90,f_aux,str,0.031565554604461525,1,cal_f_aux,"P_aux, P_egross",,0 +91,Q_sci,str,0.02857142857142857,1,cal_Q_sci,"P_f, P_in",,0 +92,Q_eng,str,0.45207950218806525,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 +93,f_refrac,str,2.2120003122459635,1,cal_f_refrac,Q_eng,,0 94,run_name,str,,1,"P_f, float",,, 95,cost_file_full,str,,1,"cost_file, pkg_resources",,, 96,new_data,str,,1,"f_vol, material, name, pd, thickness",,, @@ -138,9 +138,9 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 137,P_f,Mirror input parameter,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 138,P_f_L,Mirror input parameter,1.0,MW/m,,,L_CC,0 139,P_f_EP,Mirror input parameter,1.0,MW,,,P_f_CC,0 -140,P_NBI,Mirror input parameter,1.0,MW,,,"P_in, P_ine",0 -141,P_ECH,Mirror input parameter,1.0,MW,,,"P_in, P_ine",0 -142,P_ICRH,Mirror input parameter,1.0,MW,,,"P_in, P_ine",0 +140,P_NBI,Mirror input parameter,15.0,MW,,,"P_in, P_ine",0 +141,P_ECH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 +142,P_ICRH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 143,M_n,Mirror input parameter,1.1,1,,,"P_pump, P_th",0 144,N_module,Mirror input parameter,1.0,1,,,,0 145,f_pump,Mirror input parameter,0.03,1,,,P_pump,0 @@ -157,7 +157,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 156,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 157,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 158,NOAK,Mirror input parameter,0.0,1,,,,0 -159,n_unit,Mirror input parameter,0.0,1,,,,0 +159,n_unit,Mirror input parameter,1.0,1,,,cost_factor,0 160,construction_time,Mirror input parameter,6.0,years,,,,0 161,lifetime,Mirror input parameter,30.0,years,,,,0 162,replacement,Mirror input parameter,10.0,years,,,,0 From c4ab957e1b5b5a11cc44aa0bc031b4b55bf99476 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 17:31:16 -0500 Subject: [PATCH 09/23] Decompose Mirror magnet account variables --- src/Algorithm/MirrorFunc.py | 50 +++++++---- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 64 +++++++------ src/etc/accert.sch | 4 +- src/scripts/build_mirror_accert_tables.py | 55 +++++++++++- test/test_mirror_model.py | 85 +++++++++++++++++- tutorial/accert/ref_tables/MirrorFunc.py | 50 +++++++---- tutorial/accert/ref_tables/mirror_account.csv | 6 +- .../accert/ref_tables/mirror_algorithm.csv | 47 +++++----- .../accert/ref_tables/mirror_variable.csv | 11 ++- 10 files changed, 276 insertions(+), 96 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index db3330b..a1d6827 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -3,6 +3,7 @@ import scipy import json import math +import inspect import pkg_resources from .Algorithm import Algorithm @@ -42,7 +43,10 @@ def _run_account_algorithm(self, alg_name: str, variables: dict) -> float: algorithm = getattr(self, alg_name) except AttributeError: raise ValueError(f"Algorithm {alg_name} not found") - return algorithm(variables) + parameters = list(inspect.signature(algorithm).parameters) + if parameters == ["inputs"]: + return algorithm(variables) + return algorithm(*[variables[var] for var in parameters]) def _run_algorithm(self, alg_name: str, variables: list) -> float: """ @@ -89,6 +93,18 @@ def cal_no_vpumps(V_vac, vpump_cap): def cal_cost_factor(n_unit): return 0.80 ** (np.log(n_unit) / np.log(2)) + @staticmethod + def cal_HF_magnet_cost(n_unit, HF_magnet_number): + return MirrorFunc.HF_magnet_cost(n_unit, HF_magnet_number) + + @staticmethod + def cal_LF_magnet_cost(n_unit, LF_magnet_number): + return MirrorFunc.LF_magnet_cost(n_unit, LF_magnet_number) + + @staticmethod + def cal_CF_magnet_cost(n_unit, CF_magnet_number): + return MirrorFunc.CF_magnet_cost(n_unit, CF_magnet_number) + @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): return P_f * E_alpha / E_DT @@ -369,30 +385,30 @@ def Account_C22_1_3(inputs): # Coils # Rollup return( - MirrorFunc.Account_C22_1_3_1(inputs) + - MirrorFunc.Account_C22_1_3_2(inputs) + - MirrorFunc.Account_C22_1_3_3(inputs) + MirrorFunc.Account_C22_1_3_1(inputs['HF_magnet_number'], inputs['HF_magnet_cost']) + + MirrorFunc.Account_C22_1_3_2(inputs['LF_magnet_number'], inputs['LF_magnet_cost']) + + MirrorFunc.Account_C22_1_3_3(inputs['CF_magnet_number'], inputs['CF_magnet_cost']) ) - # @staticmethod - def Account_C22_1_3_1(inputs): + @staticmethod + def Account_C22_1_3_1(HF_magnet_number, HF_magnet_cost): # HF Coils - Quantity 4 # 2 per end cell # 2 end cells per tandem - return(inputs['HF_magnet_number'] * MirrorFunc.HF_magnet_cost(inputs)) + return(HF_magnet_number * HF_magnet_cost) @staticmethod - def Account_C22_1_3_2(inputs): + def Account_C22_1_3_2(LF_magnet_number, LF_magnet_cost): # LF Coils - Quantity 8 # 4 per end cell # 2 end cells per tandem - return(inputs['LF_magnet_number'] * MirrorFunc.LF_magnet_cost(inputs)) + return(LF_magnet_number * LF_magnet_cost) @staticmethod - def Account_C22_1_3_3(inputs): + def Account_C22_1_3_3(CF_magnet_number, CF_magnet_cost): # CF Coils # One coil every L_CF m of Central Cell - return(inputs['CF_magnet_number'] * MirrorFunc.CF_magnet_cost(inputs)) + return(CF_magnet_number * CF_magnet_cost) @staticmethod def Account_C22_1_4(inputs): @@ -1623,31 +1639,31 @@ def HTS_storedEnergy(field, inner_rad, HTS_temp=20): @staticmethod - def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): + def HF_magnet_cost(n_unit, HF_magnet_number, HF_field=25.0, inner_rad=50): # This is the HF cost per magnet [MUSD], not for all four # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['HF_magnet_number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) return(cost * cost_factor) @staticmethod - def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): + def LF_magnet_cost(n_unit, LF_magnet_number, LF_field=10.0, inner_rad=50): # This is the LF cost per magnet [MUSD] cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['LF_magnet_number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) return(cost * cost_factor) @staticmethod - def CF_magnet_cost(inputs, CF_field=3.0): + def CF_magnet_cost(n_unit, CF_magnet_number, CF_field=3.0): # This is the CF cost per magnet [MUSD] convert_to_currentDollar = 1.31 cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS - cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['CF_magnet_number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((n_unit - 1) * CF_magnet_number + 1)/np.log(2)) return(cost * cost_factor) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 97204b20d3cc99c08e5542b6598d902afcd9b81f..35e9725f289649a59c79ad3daa64048b21b3885b 100644 GIT binary patch delta 3270 zcma)84R9036~6!5z0>JdwZUOj>{A?q4gQgg9pWY~#s>3iY<@iWUy^0nmaQLGmPs4} zLIekhL%_q(jiFF7(@Y926s9<8(hMzAaF_{n!e5&d8p5OH#?2suor zH?umux8J_+z1{cT?WTj3n+{g)vRWD`idHC!`i2aajAw`Q=Fp8X*Px3YbTNZ2cF@HQ zy7)ntFz6BoU0~D&|6NFj;%n?sqlI1}V@WoHwaaVVw*`N4ax1YzhD3%;hKUS?40HTmi7M=M6)>fg z`i{C$HJjI)rzyvj8q+P)i>7?}UD+kwkw&B@Nr7?L0yDsQFa%ZuNxUfT6+Pmk!X;sY zP{`lr-{bf2t9UE-M{ba-=4P^&*sW|CbC>xU6Jbh;+gIrLhKuS83f^%HEqL=|RYtUU zym!00TeEvq8rGBOm>d!#6#ylBM6~-!*Z_#n@FMJmx8ODKD{u%d0r$YGU_1OA+<=9! z4EzIXPyv_07;u6BJPi+k^O_xr!E>&)bFfy zM!LN1CU*LStw@(ADfohIDw{nq6C%K{J89Ju9tgRpWp8b1>Knmlr?=EmFhqO zH9dg}5){hQCi!zb9W~0lN&QOw4@t6{Dx!s$UMYOJo=aogR4m$2CYwk8JZ?ueaSgXo zj&tSlrFJyN;#I|H%2Q)$Y%Y`PB6UXBr8-2N)^(HUJBrZ(8I)7oN||-=eQYX6VTlpw zztQi)yVN$^vJ*WKKUt0hniVJt|9mG}gRK>)eq8!uKFW@dR3KHPXYaPyXW|R<(adQX z^Ca4uMym>W=G8i%Sneye`+|`wM;t9hclhX1>IkJ?Q{(EZYE*4f3(Q}ePf|zB!{!FF zMY%$+Q(jS)DJq?9dfzleUuJeN$W$nQD#zum)HS(IE|R{IPD-y!L(*!gSkmAZ@B{d3 zxDO7%rBEfM^aj`ly1_D#4@~0U#q;7}afcWX(}kPDN#TI-eLnL~{1N^I-pzf(jc{4) zY4$~SHB-xc$($X}0laTJdJ3O=87;zW3?0Xxzl5H~Ct|1^Kj}tg_)d(>MuKPv7l+Wf zc;RN$CE`D9M?b}TUqa2eXb5e=Uk{-%oVEkqid$bn6?Bo_N2l<2DH3Xja!1*t2&NI! zO!>ERm2_3|NgO-?ivb3j_?B2N{8f0Kze^I~46nqP0HjOQ7;Rgk25_hz4NUa|dWQM~ zTZ!s_uqoi--Doz>Z9q9v51_Nu9$TH-gPR(VPwF;ghuV#Q-+WrE(`6=Zj@nIhNTVzUuNmRhntWq&1={zwRny7q<0w0 zuQwqcS2v?Fe2~7V9R7)_)&DE31|7Z&462W}?(~&)j{wzfm`XlOT>JX)#SNEtb z>SN}c=C{mIbA=fwA1a5H=apsj>vXs2hUpDcz*J-c@c91T5iu6#oWP`WiDBJ?8 zVLJE->;rz%h&~YaldF+U_*mE{xP(mpGQXc+%Uig!+!n5ZE8sYK2KyWKyUYn@IYl2L z;peUxh*e2Uev7D<*m40iHaWFxf?ksDnkVG*Yu357_V$YGZ5!Up5=HwZto!-y5EgTIrfKC zkoeXe^~M%TOs+$;I?5D4ok=x2?iH!tUQ&O?t)g6DOiSKwEt#mlZ?^!WiXS{yBa6JT z1rP9?PMm1exTh@F!%roe#vHv+TKUKWM2R)Vk_1swYY;sXt0Y8q69N4$bq5wt=BbI~ zX~9rL>j;H4x8G0R{o(SmX(Qy>`v7&Sl>~KCYfvjz3eVrfJZ`FpRop)gT-}Cdo0DGZ zamIhqhJGYY^~SPfW?CsErxs%Y^<%>>zR`&??5PJa`DQe^B=R);OgH)qKI%r_@evvj=Tq;+9_SQ~frc_Fw6$&LIE* delta 2135 zcmY*aYiv}<6~1$yGxs%TF=1mFu(u`%V~p+C2D^@h?Ik8Isbf2k;^*#q*_Yq=(Izy+ zEW{$nqN;0^ArBg(LMUpQ)*<*t4Uaa^^kD=7(Mkwt`amK{r6y@!ND%1Q*OuFr&X4nb z-+X6w=FGV}$Nf9U{Xb0elnVl~1VOmZL*fw}T~&a}lfmI28V-uXL1{QB4+oXupgJ7X zhJ*M-kbIVlTAWRJBm=3fs<%2*WEoc^FS}PnFnckdcoc(szJJ`4cMVCqvYMQI1!N^s zn^o@y-@H^~*9u7rYG5B1lK-fU^W+}x!$ap`@GyB;JZ$G)5mjGm%@KD9^j%tSpRrr4 z&#f^l$NZDI%`}X|MzMZFe^sv|cgP{qL_GK+X1E3~(*CL))uNhL{jJ)su2HFSRoSlu zlr;H|@~GS)d!;EUDV2&Ji*JiN_@>iDr{pr-ZB71-8i3S^-o11zBQH#m-oXEsxI*WL z)Q-3RSc9>L@pf{Vd`Pb2ukpXh4~QS%z!%7uWH}iiyGQ|vkb06z415^BNzRd<;NRe} z6PF>ZalehM2*ZOz?I1mb!lBMUG|(4`_JzU;OG=*s>H?AOSbRR~4<}-CSu_wDd^&1N zz8PgLS4IXRb51;s_4V}kZ=L7YKkAQ!=N8unc-rP>L!E)zz(70_GNmQ6UIX#qe3Ix6 zP$_ek>EXh@)_K=(-!nZe3#6=Bx__`O5bo(7Xr5Q}4tDi6&DTwIM;Z+&ZC2miKqYI= zJJi`54><=399ETxyg)kRQ~|7&(4%9Xyb4m6j!`aM>&syWQos*giO$YMPj}tYIrPr| zqD$t`)`j4ACKf`Yp=k6D{es`^EeePvWqyxJ>GVCGmFt<72TM^sTagDo={du3YV+Vd ziQiBqTT}=SII%)FXy8)ebP2kRE-|wl`uLv8ozvx@A_VMQH59P#RzfCAtAs7AVyC#= zd9f0xhB~;e-AVZte5x$>;5LD7qq6-YJKLJDs>~~9k4cPI4N)J_myxri7T>~ce22x@ zN{a0S711Q}RnvARN8uSgfzd;Bo3Dr_*q$f^^f*T8w8OWV#@Q!PNTkHvJfFsGw%ifMbmL9>#N4tFA@kCg59J;+*$xN-J*Ryq6KG#m} zifeIb)WhzIGEbPTOF&R>bNx#^ZR}VAn)Q&Iul0l&ZHJ}>L5!Brgm1Ga=o${hU9+R@ zP_!W6k{dh$mrQiKWNHVj)>|>kq&>a{Pb;hIfL^`Dt-RLL!lpW)#oLTg79I4Jd79nD zvpvXA5>~N}PRL!@Sg#G;_d=s8Z`gJj<0?{I$g@vtbpN;mS<*i+3P{ zef&$Y)PJ3Fjw!;T|0_ zS6hS$)kqTPzvxB!Ivt}ew1h6Szp$^{Z`&hwgPlf>S{E&5Jz=Gwr_Ar0#l~GE8Q(J= z*1trbqqp>z^hb1+{KY)a$7v-WrWf!D{4x&X^*9e>?E`H}`#C?*MlD^vsXFQbb-UW6 zmZ^)CyUGn^@voJG$_{0j{FQt`enYO2K9WvJW70N>ipNBD=?Tc?551IS*1-gWdMIc6 z>Y>z0-vn_@)}IrA9jb*=wxNKmj%v>qcE1ba z&SVm5mP)IIeM}pN^{Ky;W3nP0lWN3I#r>imeS}^?D}_tKKJJ#qPQFjqJBP-hP_l!| zOypgnp$F2n+_W6_&!563yE$_jljpF_hoRPP{>J}dXF29%9)TM=`^N;dAJ53!PyY*J Cg;B)- diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 0af6fe8..333eef6 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6969,9 +6969,9 @@ INSERT INTO mirror_alg VALUES(25,'Account_C22_1','c','Account C221 Rollup','Mirr INSERT INTO mirror_alg VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','L_CC, L_EP','million'); INSERT INTO mirror_alg VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','rollup','million'); -INSERT INTO mirror_alg VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number','million'); -INSERT INTO mirror_alg VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number','million'); -INSERT INTO mirror_alg VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','CF_magnet_number','million'); +INSERT INTO mirror_alg VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number, HF_magnet_cost','million'); +INSERT INTO mirror_alg VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number, LF_magnet_cost','million'); +INSERT INTO mirror_alg VALUES(31,'Account_C22_1_3_3','c','Account C22133 Rollup','MirrorFunc','CF_magnet_number, CF_magnet_cost','million'); INSERT INTO mirror_alg VALUES(32,'Account_C22_1_4','c','Account C2214 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(33,'Account_C22_1_4_1','c','Account C22141 Rollup','MirrorFunc','P_NBI, cost_factor','million'); INSERT INTO mirror_alg VALUES(34,'Account_C22_1_4_2','c','Account C22142 Rollup','MirrorFunc','P_ICRH, cost_factor','million'); @@ -7028,25 +7028,28 @@ INSERT INTO mirror_alg VALUES(84,'cal_L','v','Mirror generated variable calculat INSERT INTO mirror_alg VALUES(85,'cal_V_vac','v','Mirror generated variable calculation for V_vac','MirrorFunc','V_vac = L * pi * a_EC**2','m3'); INSERT INTO mirror_alg VALUES(86,'cal_no_vpumps','v','Mirror generated variable calculation for no_vpumps','MirrorFunc','no_vpumps = V_vac / vpump_cap','1'); INSERT INTO mirror_alg VALUES(87,'cal_cost_factor','v','Mirror generated variable calculation for cost_factor','MirrorFunc','cost_factor = 0.80 ** (log(n_unit) / log(2))','1'); -INSERT INTO mirror_alg VALUES(88,'cal_P_alpha','v','Mirror generated variable calculation for P_alpha','MirrorFunc','P_alpha = P_f * E_alpha / E_DT','MW'); -INSERT INTO mirror_alg VALUES(89,'cal_P_n','v','Mirror generated variable calculation for P_n','MirrorFunc','P_n = P_f - P_alpha','MW'); -INSERT INTO mirror_alg VALUES(90,'cal_P_ine','v','Mirror generated variable calculation for P_ine','MirrorFunc','P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH','MW'); -INSERT INTO mirror_alg VALUES(91,'cal_P_pump','v','Mirror generated variable calculation for P_pump','MirrorFunc','P_pump = f_pump * M_n * P_n','MW'); -INSERT INTO mirror_alg VALUES(92,'cal_P_sub_cont','v','Mirror generated variable calculation for P_sub_cont','MirrorFunc','P_sub_cont = f_sub * P_f','MW'); -INSERT INTO mirror_alg VALUES(93,'cal_P_cryo','v','Mirror generated variable calculation for P_cryo','MirrorFunc','P_cryo = f_cryo * P_f','MW'); -INSERT INTO mirror_alg VALUES(94,'cal_P_other','v','Mirror generated variable calculation for P_other','MirrorFunc','P_other = P_pump + P_sub_cont + P_cryo','MW'); -INSERT INTO mirror_alg VALUES(95,'cal_P_in','v','Mirror generated variable calculation for P_in','MirrorFunc','P_in = P_NBI + P_ICRH + P_ECH','MW'); -INSERT INTO mirror_alg VALUES(96,'cal_P_th','v','Mirror generated variable calculation for P_th','MirrorFunc','P_th = M_n * P_n + eta_pump * P_pump','MW'); -INSERT INTO mirror_alg VALUES(97,'cal_P_the','v','Mirror generated variable calculation for P_the','MirrorFunc','P_the = eta_th * P_th','MW'); -INSERT INTO mirror_alg VALUES(98,'cal_P_DEC','v','Mirror generated variable calculation for P_DEC','MirrorFunc','P_DEC = P_in + P_alpha','MW'); -INSERT INTO mirror_alg VALUES(99,'cal_P_DECe','v','Mirror generated variable calculation for P_DECe','MirrorFunc','P_DECe = eta_DEC * P_DEC','MW'); -INSERT INTO mirror_alg VALUES(100,'cal_P_egross','v','Mirror generated variable calculation for P_egross','MirrorFunc','P_egross = P_DECe + P_the if application == ''electricity'' else P_DECe','MW'); -INSERT INTO mirror_alg VALUES(101,'cal_P_enet','v','Mirror generated variable calculation for P_enet','MirrorFunc','P_enet = P_egross - (P_ine + P_other)','MW'); -INSERT INTO mirror_alg VALUES(102,'cal_f_aux','v','Mirror generated variable calculation for f_aux','MirrorFunc','f_aux = P_aux / P_egross','1'); -INSERT INTO mirror_alg VALUES(103,'cal_Q_sci','v','Mirror generated variable calculation for Q_sci','MirrorFunc','Q_sci = P_f / P_in','1'); -INSERT INTO mirror_alg VALUES(104,'cal_Q_eng','v','Mirror generated variable calculation for Q_eng','MirrorFunc','Q_eng = P_egross / (P_ine + P_other)','1'); -INSERT INTO mirror_alg VALUES(105,'cal_f_refrac','v','Mirror generated variable calculation for f_refrac','MirrorFunc','f_refrac = 1 / Q_eng','1'); -INSERT INTO mirror_alg VALUES(106,'cal_CF_magnet_number','v','Mirror generated variable calculation for CF_magnet_number','MirrorFunc','CF_magnet_number = L_CC / L_CF','1'); +INSERT INTO mirror_alg VALUES(88,'cal_HF_magnet_cost','v','Mirror generated variable calculation for HF_magnet_cost','MirrorFunc','HF_magnet_cost = HTS_storedEnergy(25.0, 50) * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2))','million'); +INSERT INTO mirror_alg VALUES(89,'cal_LF_magnet_cost','v','Mirror generated variable calculation for LF_magnet_cost','MirrorFunc','LF_magnet_cost = HTS_storedEnergy(10.0, 50) * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2))','million'); +INSERT INTO mirror_alg VALUES(90,'cal_CF_magnet_cost','v','Mirror generated variable calculation for CF_magnet_cost','MirrorFunc','CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2))','million'); +INSERT INTO mirror_alg VALUES(91,'cal_P_alpha','v','Mirror generated variable calculation for P_alpha','MirrorFunc','P_alpha = P_f * E_alpha / E_DT','MW'); +INSERT INTO mirror_alg VALUES(92,'cal_P_n','v','Mirror generated variable calculation for P_n','MirrorFunc','P_n = P_f - P_alpha','MW'); +INSERT INTO mirror_alg VALUES(93,'cal_P_ine','v','Mirror generated variable calculation for P_ine','MirrorFunc','P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH','MW'); +INSERT INTO mirror_alg VALUES(94,'cal_P_pump','v','Mirror generated variable calculation for P_pump','MirrorFunc','P_pump = f_pump * M_n * P_n','MW'); +INSERT INTO mirror_alg VALUES(95,'cal_P_sub_cont','v','Mirror generated variable calculation for P_sub_cont','MirrorFunc','P_sub_cont = f_sub * P_f','MW'); +INSERT INTO mirror_alg VALUES(96,'cal_P_cryo','v','Mirror generated variable calculation for P_cryo','MirrorFunc','P_cryo = f_cryo * P_f','MW'); +INSERT INTO mirror_alg VALUES(97,'cal_P_other','v','Mirror generated variable calculation for P_other','MirrorFunc','P_other = P_pump + P_sub_cont + P_cryo','MW'); +INSERT INTO mirror_alg VALUES(98,'cal_P_in','v','Mirror generated variable calculation for P_in','MirrorFunc','P_in = P_NBI + P_ICRH + P_ECH','MW'); +INSERT INTO mirror_alg VALUES(99,'cal_P_th','v','Mirror generated variable calculation for P_th','MirrorFunc','P_th = M_n * P_n + eta_pump * P_pump','MW'); +INSERT INTO mirror_alg VALUES(100,'cal_P_the','v','Mirror generated variable calculation for P_the','MirrorFunc','P_the = eta_th * P_th','MW'); +INSERT INTO mirror_alg VALUES(101,'cal_P_DEC','v','Mirror generated variable calculation for P_DEC','MirrorFunc','P_DEC = P_in + P_alpha','MW'); +INSERT INTO mirror_alg VALUES(102,'cal_P_DECe','v','Mirror generated variable calculation for P_DECe','MirrorFunc','P_DECe = eta_DEC * P_DEC','MW'); +INSERT INTO mirror_alg VALUES(103,'cal_P_egross','v','Mirror generated variable calculation for P_egross','MirrorFunc','P_egross = P_DECe + P_the if application == ''electricity'' else P_DECe','MW'); +INSERT INTO mirror_alg VALUES(104,'cal_P_enet','v','Mirror generated variable calculation for P_enet','MirrorFunc','P_enet = P_egross - (P_ine + P_other)','MW'); +INSERT INTO mirror_alg VALUES(105,'cal_f_aux','v','Mirror generated variable calculation for f_aux','MirrorFunc','f_aux = P_aux / P_egross','1'); +INSERT INTO mirror_alg VALUES(106,'cal_Q_sci','v','Mirror generated variable calculation for Q_sci','MirrorFunc','Q_sci = P_f / P_in','1'); +INSERT INTO mirror_alg VALUES(107,'cal_Q_eng','v','Mirror generated variable calculation for Q_eng','MirrorFunc','Q_eng = P_egross / (P_ine + P_other)','1'); +INSERT INTO mirror_alg VALUES(108,'cal_f_refrac','v','Mirror generated variable calculation for f_refrac','MirrorFunc','f_refrac = 1 / Q_eng','1'); +INSERT INTO mirror_alg VALUES(109,'cal_CF_magnet_number','v','Mirror generated variable calculation for CF_magnet_number','MirrorFunc','CF_magnet_number = L_CC / L_CF','1'); CREATE TABLE mirror_var ( ind INTEGER DEFAULT NULL, var_name TEXT NOT NULL, @@ -7217,7 +7220,7 @@ INSERT INTO mirror_var VALUES(155,'eta_NBI','Mirror input parameter',0.5,'1','', INSERT INTO mirror_var VALUES(156,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); INSERT INTO mirror_var VALUES(157,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); INSERT INTO mirror_var VALUES(158,'NOAK','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(159,'n_unit','Mirror input parameter',1.0,'1','','','cost_factor',0); +INSERT INTO mirror_var VALUES(159,'n_unit','Mirror input parameter',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); INSERT INTO mirror_var VALUES(160,'construction_time','Mirror input parameter',6.0,'years','','','',0); INSERT INTO mirror_var VALUES(161,'lifetime','Mirror input parameter',30.0,'years','','','',0); INSERT INTO mirror_var VALUES(162,'replacement','Mirror input parameter',10.0,'years','','','',0); @@ -7251,9 +7254,12 @@ INSERT INTO mirror_var VALUES(189,'outer_vessel_thickness','Mirror input paramet INSERT INTO mirror_var VALUES(190,'L_EP','Mirror input parameter',1.0,'m','','','L',0); INSERT INTO mirror_var VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L',0); INSERT INTO mirror_var VALUES(192,'a_EP','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','',0); -INSERT INTO mirror_var VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(195,'CF_magnet_number','Mirror generated parameter',-1.0,'1','cal_CF_magnet_number','L_CC, L_CF','',0); +INSERT INTO mirror_var VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','HF_magnet_cost',0); +INSERT INTO mirror_var VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','LF_magnet_cost',0); +INSERT INTO mirror_var VALUES(195,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); +INSERT INTO mirror_var VALUES(196,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); +INSERT INTO mirror_var VALUES(197,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); +INSERT INTO mirror_var VALUES(198,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.54000000284,0,'','Unchanged',0.004687831810420024433,'','million',''); INSERT INTO mirror_acco VALUES(2,'11','Land_and_Land_Rights',1186117.539999999804,1,'1','Unchanged',0.0002298971517736676198,'','million',''); @@ -7288,9 +7294,9 @@ INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',901967566.79999 INSERT INTO mirror_acco VALUES(31,'2211','First_Wall_and_Blanket',43193434.21000000089,3,'221','Unchanged',0.00837189162568348702,'Account_C22_1_1','million','L_CC, L_EP'); INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',94736955.7399999947,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million',''); INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'Account_C22_1_3','million','rollup'); -INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number'); -INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number'); -INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million','CF_magnet_number'); +INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number, HF_magnet_cost'); +INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number, LF_magnet_cost'); +INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million','CF_magnet_number, CF_magnet_cost'); INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',0.04408567877882998281,'Account_C22_1_4','million','rollup'); INSERT INTO mirror_acco VALUES(38,'22141','NBI',105963000.0,4,'2214','Unchanged',0.0205380926188758195,'Account_C22_1_4_1','million','P_NBI, cost_factor'); INSERT INTO mirror_acco VALUES(39,'22142','ICRH',41490000.0,4,'2214','Unchanged',0.008041726477705971043,'Account_C22_1_4_2','million','P_ICRH, cost_factor'); diff --git a/src/etc/accert.sch b/src/etc/accert.sch index 1b98bc7..ad1cb82 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -797,8 +797,8 @@ heatpipe_var_names = ['land_surface_area' 'containment_subVolume' 'Containment_h fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'anncap' 'anncdr' 'anncp' 'anndecom' 'anndiv' 'annfuel' 'annfwbl' 'annoam' 'annwst' 'areaoh' 'awpoh' 'b0' 'bktlife' 'blmass' 'capcost' 'cconfix' 'cconshpf' 'cconshtf' 'cdcost' 'cdirt' 'cdriv0' 'cdriv1' 'cdriv2' 'cdriv3' 'cdrlife' 'cfactr' 'cfind_0' 'cfind_1' 'cfind_2' 'cfind_3' 'cland' 'clgsmass' 'cmlsa' 'coecdr' 'coecp' 'coediv' 'coefuel' 'coefwbl' 'coewst' 'coilmass' 'convol' 'coolmass' 'coolwh' 'cowner' 'cplife' 'cpstcst' 'cpttf' 'crfcdr' 'crfcp' 'crfdiv' 'crffwbl' 'crypmw' 'cryvol' 'csi' 'cturbb' 'd_0' 'd_1' 'd_2' 'd_3' 'dcdrv0' 'dcdrv1' 'dcdrv2' 'dcond_0' 'dcond_1' 'dcond_2' 'dcond_3' 'dcond_4' 'dcond_5' 'dcond_6' 'dcond_7' 'dcond_8' 'dcopper' 'decomf' 'dens' 'denstl' 'dintrt' 'discount_rate' 'divcst' 'divlife' 'divsur' 'dlscal' 'drbi' 'dtlife' 'dtstor' 'dvrtmass' 'ealphadt' 'echarge' 'echpwr' 'edrive' 'effrfss' 'elevol' 'ensxpfm' 'esbldgm3' 'estotftgj' 'etadrv' 'expcry' 'expel' 'expepe' 'exphts' 'exprb' 'exprf' 'exptpe' 'faccd' 'faccdfix' 'fachtmw' 'fburn' 'fcap0' 'fcap0cp' 'fcdfuel' 'fcontng' 'fcr0' 'fcsht' 'fcuohsu' 'fcupfsu' 'fefcdr' 'fefcp' 'fefdiv' 'feffwbl' 'fhe3' 'fkind' 'fncmass' 'fndt' 'ftrit' 'fusionrate' 'fwallcst' 'fwarea' 'fwbllife' 'fwmass' 'fwmatm' 'gain' 'gsmass' 'hccl' 'hcwt' 'helpow' 'hrbi' 'i_tf_sc_mat' 'i_tf_sup' 'iblanket' 'iefrf' 'ife' 'ifedrv' 'ifueltyp' 'imax' 'intercoil_surface' 'iohcl' 'ipfres' 'ireactor' 'istore' 'isumatoh' 'isumatpf' 'itart' 'l1' 'lpulse' 'lsa' 'ltot' 'mbvfac' 'mcdriv' 'n_day_year' 'n_tf' 'n_tf_turn' 'nohc' 'nphx' 'ntype' 'nvduct' 'oh_steel_frac' 'pacpmw' 'palpnb' 'peakmva' 'pfbldgm3' 'pfckts' 'pfmass' 'pfwdiv' 'pfwndl' 'pgrossmw' 'pheat' 'pibv' 'pinjht' 'pinjwp' 'plascur' 'plhybd' 'pnbitot' 'pnetelmw' 'pnucblkt' 'pnucshld' 'powfmw' 'pthermmw' 'r0' 'rbrt' 'rbvfac' 'rbvol' 'rbwt' 'reprat' 'ric_0' 'ric_1' 'ric_2' 'ric_3' 'ric_4' 'ric_5' 'ric_6' 'rjconpf_0' 'rjconpf_1' 'rjconpf_10' 'rjconpf_11' 'rjconpf_12' 'rjconpf_13' 'rjconpf_14' 'rjconpf_15' 'rjconpf_16' 'rjconpf_17' 'rjconpf_18' 'rjconpf_19' 'rjconpf_2' 'rjconpf_20' 'rjconpf_21' 'rjconpf_3' 'rjconpf_4' 'rjconpf_5' 'rjconpf_6' 'rjconpf_7' 'rjconpf_8' 'rjconpf_9' 'rmbvol' 'rndfuel' 'rpf_0' 'rpf_1' 'rpf_2' 'rpf_3' 'rpf_4' 'rpf_5' 'rpf_6' 'shh' 'shldmass' 'shm' 'shmatm' 'shmf' 'shovol' 'shri' 'shro' 'sigal' 'spfbusl' 'srcktpm' 'st_f_b' 'st_f_n' 'st_f_r' 'stcl' 'stella_config_coillength' 'stella_config_coilsurface' 'targtm' 'tburn' 'tcycle' 'tdown' 'tdspmw' 'tf_h_width' 'tfacmw' 'tfbusl' 'tfbusmas' 'tfcbv' 'tfckw' 'tfcmw' 'tfhmax' 'tfleng' 'tfmass' 'tftort' 'tlife' 'tlvpmw' 'tmpcry' 'trcl' 'trithtmw' 'triv' 'turns_0' 'turns_1' 'turns_2' 'turns_3' 'turns_4' 'turns_5' 'turns_6' 'twopi' 'ucad' 'ucaf' 'ucahts' 'ucap' 'ucblbe' 'ucblbreed' 'ucblli' 'ucblli2o' 'ucbllipb' 'ucblss' 'ucblvd' 'ucbpmp' 'ucbus' 'uccarb' 'uccase' 'ucco' 'ucconc' 'uccpcl1' 'uccpclb' 'uccpmp' 'uccr' 'uccry' 'uccryo' 'uccu' 'ucdgen' 'ucdiv' 'ucdtc' 'ucduct' 'ucech' 'ucel' 'ucf1' 'ucfnc' 'ucfpr' 'ucfuel' 'ucfwa' 'ucfwps' 'ucfws' 'ucgss' 'uche3' 'uchrs' 'uchts_0' 'uchts_1' 'uciac' 'ucich' 'ucint' 'uclh' 'uclv' 'ucmb' 'ucme' 'ucmisc' 'ucnbi' 'ucnbv' 'ucoam_0' 'ucoam_1' 'ucoam_2' 'ucoam_3' 'ucpens' 'ucpfb' 'ucpfbk' 'ucpfbs' 'ucpfcb' 'ucpfdr1' 'ucpfic' 'ucpfps' 'ucphx' 'ucpp' 'ucrb' 'ucsc_0' 'ucsc_1' 'ucsc_2' 'ucsc_3' 'ucsc_4' 'ucsc_5' 'ucsc_6' 'ucsc_7' 'ucsc_8' 'ucsh' 'ucshld' 'ucswyd' 'uctarg' 'uctfbr' 'uctfbus' 'uctfdr' 'uctfgr' 'uctfic' 'uctfps' 'uctfsw' 'uctpmp' 'uctr' 'ucturb_0' 'ucturb_1' 'ucvalv' 'ucvdsh' 'ucviac' 'ucwindpf' 'ucwindtf' 'ucws' 'ucwst_0' 'ucwst_1' 'ucwst_2' 'ucwst_3' 'umass' 'vacdshm' 'vachtmw' 'vcdimax' 'vf' 'vfohc' 'vol' 'volrci' 'vpfskv' 'vpumpn' 'vtfskv' 'vvmass' 'wgt2' 'whtblbe' 'whtblbreed' 'whtblli' 'whtblss' 'whtblvd' 'whtcas' 'whtconcu' 'whtconsc' 'whtcp' 'whtpfs' 'whtshld' 'whttflgs' 'wpenshld' 'wrbi' 'wsvfac' 'wsvol' 'wtblli2o' 'wtbllipb' 'wtgpd'] stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] -mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number'] -mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'CF_magnet_number'] +mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_HF_magnet_cost' 'cal_LF_magnet_cost' 'cal_CF_magnet_cost' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index e58f7e2..46ecfd5 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -73,6 +73,10 @@ "P_NBI": (15, "MW"), "P_ICRH": (10, "MW"), "P_ECH": (10, "MW"), + "HF_magnet_cost": (29.1, "million"), + "LF_magnet_cost": (6.25262, "million"), + "CF_magnet_cost": (2.751, "million"), + "CF_magnet_number": (52.0300751726645, "1"), "P_egross": (158.12094932835822, "MW"), "P_DECe": (63.01790788032513, "MW"), "P_DEC": (70.0198976448057, "MW"), @@ -132,6 +136,9 @@ "V_vac": "L, a_EC", "no_vpumps": "V_vac, vpump_cap", "cost_factor": "n_unit", + "HF_magnet_cost": "n_unit, HF_magnet_number", + "LF_magnet_cost": "n_unit, LF_magnet_number", + "CF_magnet_cost": "n_unit, CF_magnet_number", "P_alpha": "E_DT, E_alpha, P_f", "P_n": "P_f, P_alpha", "P_ine": "P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH", @@ -161,6 +168,18 @@ "V_vac": ("V_vac = L * pi * a_EC**2", "m3"), "no_vpumps": ("no_vpumps = V_vac / vpump_cap", "1"), "cost_factor": ("cost_factor = 0.80 ** (log(n_unit) / log(2))", "1"), + "HF_magnet_cost": ( + "HF_magnet_cost = HTS_storedEnergy(25.0, 50) * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2))", + "million", + ), + "LF_magnet_cost": ( + "LF_magnet_cost = HTS_storedEnergy(10.0, 50) * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2))", + "million", + ), + "CF_magnet_cost": ( + "CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2))", + "million", + ), "P_alpha": ("P_alpha = P_f * E_alpha / E_DT", "MW"), "P_n": ("P_n = P_f - P_alpha", "MW"), "P_ine": ("P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH", "MW"), @@ -211,6 +230,26 @@ None, "1", ), + "HF_magnet_cost": ( + "HF cost per magnet, not for all four", + None, + "million", + ), + "LF_magnet_cost": ( + "LF cost per magnet", + None, + "million", + ), + "CF_magnet_cost": ( + "CF cost per magnet", + None, + "million", + ), + "CF_magnet_number": ( + "One CF coil every L_CF m of central cell", + None, + "1", + ), } TYPE_REPLACEMENTS = ( @@ -307,6 +346,11 @@ def _account_method_dependencies(algorithm_source: Path) -> dict[str, tuple[list continue input_keys = set() account_calls = set() + explicit_args = [ + arg.arg + for arg in node.args.args + if arg.arg not in {"self", "inputs"} + ] for child in ast.walk(node): if ( isinstance(child, ast.Subscript) @@ -324,7 +368,7 @@ def _account_method_dependencies(algorithm_source: Path) -> dict[str, tuple[list and child.func.attr.startswith("Account_") ): account_calls.add(child.func.attr) - dependencies[node.name] = (sorted(input_keys), sorted(account_calls)) + dependencies[node.name] = (explicit_args or sorted(input_keys), sorted(account_calls)) return dependencies @@ -374,6 +418,15 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) values["vpump_cap"] = MIRROR_VARIABLE_OVERRIDES["vpump_cap"][1] generated["no_vpumps"] = generated["V_vac"] / values["vpump_cap"] generated["cost_factor"] = 0.80 ** (math.log(values["n_unit"]) / math.log(2)) + generated["HF_magnet_cost"] = 29.1 * 0.70 ** ( + math.log((values["n_unit"] - 1) * values["HF_magnet_number"] + 1) / math.log(2) + ) + generated["LF_magnet_cost"] = 6.25262 * 0.70 ** ( + math.log((values["n_unit"] - 1) * values["LF_magnet_number"] + 1) / math.log(2) + ) + generated["CF_magnet_cost"] = 2.751 * 0.70 ** ( + math.log((values["n_unit"] - 1) * values["CF_magnet_number"] + 1) / math.log(2) + ) generated["P_alpha"] = values["P_f"] * values["E_alpha"] / values["E_DT"] generated["P_n"] = values["P_f"] - generated["P_alpha"] generated["P_ine"] = ( diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index ac2d553..1d981c9 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -318,7 +318,13 @@ def test_mirror_nbi_account_uses_cost_factor_variable(cursor): assert rows["P_NBI"] == (15.0, "MW", "", "", "P_in, P_ine") assert rows["cost_factor"] == (1.0, "1", "cal_cost_factor", "n_unit", "") - assert rows["n_unit"] == (1.0, "1", "", "", "cost_factor") + assert rows["n_unit"] == ( + 1.0, + "1", + "", + "", + "CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor", + ) cursor.execute( """ @@ -348,6 +354,83 @@ def test_mirror_nbi_account_uses_cost_factor_variable(cursor): assert alg.run({"P_NBI": 15.0, "cost_factor": 1.0}) == pytest.approx(105.963) +def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): + cursor.execute( + """ + SELECT code_of_account, variables + FROM mirror_acco + WHERE code_of_account IN (?, ?, ?) + ORDER BY code_of_account; + """, + ("22131", "22132", "22133"), + ) + assert cursor.fetchall() == [ + ("22131", "HF_magnet_number, HF_magnet_cost"), + ("22132", "LF_magnet_number, LF_magnet_cost"), + ("22133", "CF_magnet_number, CF_magnet_cost"), + ] + + cursor.execute( + """ + SELECT var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked + FROM mirror_var + WHERE var_name IN (?, ?, ?, ?, ?, ?, ?) + ORDER BY var_name; + """, + ( + "CF_magnet_cost", + "CF_magnet_number", + "HF_magnet_cost", + "HF_magnet_number", + "LF_magnet_cost", + "LF_magnet_number", + "n_unit", + ), + ) + rows = {row[0]: row[1:] for row in cursor.fetchall()} + + assert rows["HF_magnet_cost"] == ( + "HF cost per magnet, not for all four", + 29.1, + "million", + "cal_HF_magnet_cost", + "n_unit, HF_magnet_number", + "", + ) + assert rows["LF_magnet_cost"] == ( + "LF cost per magnet", + 6.25262, + "million", + "cal_LF_magnet_cost", + "n_unit, LF_magnet_number", + "", + ) + assert rows["CF_magnet_cost"] == ( + "CF cost per magnet", + 2.751, + "million", + "cal_CF_magnet_cost", + "n_unit, CF_magnet_number", + "", + ) + assert rows["HF_magnet_number"][5] == "HF_magnet_cost" + assert rows["LF_magnet_number"][5] == "LF_magnet_cost" + assert rows["CF_magnet_number"][5] == "CF_magnet_cost" + assert rows["n_unit"][5] == "CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor" + + alg = MirrorFunc( + ind=1, + alg_name="Account_C22_1_3_1", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="HF_magnet_number,HF_magnet_cost", + constants="", + ) + assert alg.run({"HF_magnet_number": 4.0, "HF_magnet_cost": 29.1}) == pytest.approx(116.4) + + def test_mirror_generated_variable_algorithm_can_recalculate(cursor): accert = Accert.__new__(Accert) accert.var_tabl = "mirror_var" diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index db3330b..a1d6827 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -3,6 +3,7 @@ import scipy import json import math +import inspect import pkg_resources from .Algorithm import Algorithm @@ -42,7 +43,10 @@ def _run_account_algorithm(self, alg_name: str, variables: dict) -> float: algorithm = getattr(self, alg_name) except AttributeError: raise ValueError(f"Algorithm {alg_name} not found") - return algorithm(variables) + parameters = list(inspect.signature(algorithm).parameters) + if parameters == ["inputs"]: + return algorithm(variables) + return algorithm(*[variables[var] for var in parameters]) def _run_algorithm(self, alg_name: str, variables: list) -> float: """ @@ -89,6 +93,18 @@ def cal_no_vpumps(V_vac, vpump_cap): def cal_cost_factor(n_unit): return 0.80 ** (np.log(n_unit) / np.log(2)) + @staticmethod + def cal_HF_magnet_cost(n_unit, HF_magnet_number): + return MirrorFunc.HF_magnet_cost(n_unit, HF_magnet_number) + + @staticmethod + def cal_LF_magnet_cost(n_unit, LF_magnet_number): + return MirrorFunc.LF_magnet_cost(n_unit, LF_magnet_number) + + @staticmethod + def cal_CF_magnet_cost(n_unit, CF_magnet_number): + return MirrorFunc.CF_magnet_cost(n_unit, CF_magnet_number) + @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): return P_f * E_alpha / E_DT @@ -369,30 +385,30 @@ def Account_C22_1_3(inputs): # Coils # Rollup return( - MirrorFunc.Account_C22_1_3_1(inputs) + - MirrorFunc.Account_C22_1_3_2(inputs) + - MirrorFunc.Account_C22_1_3_3(inputs) + MirrorFunc.Account_C22_1_3_1(inputs['HF_magnet_number'], inputs['HF_magnet_cost']) + + MirrorFunc.Account_C22_1_3_2(inputs['LF_magnet_number'], inputs['LF_magnet_cost']) + + MirrorFunc.Account_C22_1_3_3(inputs['CF_magnet_number'], inputs['CF_magnet_cost']) ) - # @staticmethod - def Account_C22_1_3_1(inputs): + @staticmethod + def Account_C22_1_3_1(HF_magnet_number, HF_magnet_cost): # HF Coils - Quantity 4 # 2 per end cell # 2 end cells per tandem - return(inputs['HF_magnet_number'] * MirrorFunc.HF_magnet_cost(inputs)) + return(HF_magnet_number * HF_magnet_cost) @staticmethod - def Account_C22_1_3_2(inputs): + def Account_C22_1_3_2(LF_magnet_number, LF_magnet_cost): # LF Coils - Quantity 8 # 4 per end cell # 2 end cells per tandem - return(inputs['LF_magnet_number'] * MirrorFunc.LF_magnet_cost(inputs)) + return(LF_magnet_number * LF_magnet_cost) @staticmethod - def Account_C22_1_3_3(inputs): + def Account_C22_1_3_3(CF_magnet_number, CF_magnet_cost): # CF Coils # One coil every L_CF m of Central Cell - return(inputs['CF_magnet_number'] * MirrorFunc.CF_magnet_cost(inputs)) + return(CF_magnet_number * CF_magnet_cost) @staticmethod def Account_C22_1_4(inputs): @@ -1623,31 +1639,31 @@ def HTS_storedEnergy(field, inner_rad, HTS_temp=20): @staticmethod - def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): + def HF_magnet_cost(n_unit, HF_magnet_number, HF_field=25.0, inner_rad=50): # This is the HF cost per magnet [MUSD], not for all four # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['HF_magnet_number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) return(cost * cost_factor) @staticmethod - def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): + def LF_magnet_cost(n_unit, LF_magnet_number, LF_field=10.0, inner_rad=50): # This is the LF cost per magnet [MUSD] cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['LF_magnet_number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) return(cost * cost_factor) @staticmethod - def CF_magnet_cost(inputs, CF_field=3.0): + def CF_magnet_cost(n_unit, CF_magnet_number, CF_field=3.0): # This is the CF cost per magnet [MUSD] convert_to_currentDollar = 1.31 cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS - cost_factor = (0.70)**(np.log((inputs['n_unit']-1)*inputs['CF_magnet_number'] + 1)/np.log(2)) + cost_factor = (0.70)**(np.log((n_unit - 1) * CF_magnet_number + 1)/np.log(2)) return(cost * cost_factor) diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index 562ee83..a687a4b 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -32,9 +32,9 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 31,2211,First_Wall_and_Blanket,43193434.21,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" 32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million, 33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,Account_C22_1_3,million,rollup -34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,HF_magnet_number -35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,LF_magnet_number -36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,CF_magnet_number +34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,"HF_magnet_number, HF_magnet_cost" +35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,"LF_magnet_number, LF_magnet_cost" +36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,"CF_magnet_number, CF_magnet_cost" 37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup 38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, cost_factor" 39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, cost_factor" diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index ef11b40..ebdce3d 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -27,9 +27,9 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"L_CC, L_EP",million 27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,reference value,million 28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,rollup,million -29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,HF_magnet_number,million -30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,LF_magnet_number,million -31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,CF_magnet_number,million +29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,"HF_magnet_number, HF_magnet_cost",million +30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,"LF_magnet_number, LF_magnet_cost",million +31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,"CF_magnet_number, CF_magnet_cost",million 32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,rollup,million 33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,"P_NBI, cost_factor",million 34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,"P_ICRH, cost_factor",million @@ -86,22 +86,25 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 85,cal_V_vac,v,Mirror generated variable calculation for V_vac,MirrorFunc,V_vac = L * pi * a_EC**2,m3 86,cal_no_vpumps,v,Mirror generated variable calculation for no_vpumps,MirrorFunc,no_vpumps = V_vac / vpump_cap,1 87,cal_cost_factor,v,Mirror generated variable calculation for cost_factor,MirrorFunc,cost_factor = 0.80 ** (log(n_unit) / log(2)),1 -88,cal_P_alpha,v,Mirror generated variable calculation for P_alpha,MirrorFunc,P_alpha = P_f * E_alpha / E_DT,MW -89,cal_P_n,v,Mirror generated variable calculation for P_n,MirrorFunc,P_n = P_f - P_alpha,MW -90,cal_P_ine,v,Mirror generated variable calculation for P_ine,MirrorFunc,P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH,MW -91,cal_P_pump,v,Mirror generated variable calculation for P_pump,MirrorFunc,P_pump = f_pump * M_n * P_n,MW -92,cal_P_sub_cont,v,Mirror generated variable calculation for P_sub_cont,MirrorFunc,P_sub_cont = f_sub * P_f,MW -93,cal_P_cryo,v,Mirror generated variable calculation for P_cryo,MirrorFunc,P_cryo = f_cryo * P_f,MW -94,cal_P_other,v,Mirror generated variable calculation for P_other,MirrorFunc,P_other = P_pump + P_sub_cont + P_cryo,MW -95,cal_P_in,v,Mirror generated variable calculation for P_in,MirrorFunc,P_in = P_NBI + P_ICRH + P_ECH,MW -96,cal_P_th,v,Mirror generated variable calculation for P_th,MirrorFunc,P_th = M_n * P_n + eta_pump * P_pump,MW -97,cal_P_the,v,Mirror generated variable calculation for P_the,MirrorFunc,P_the = eta_th * P_th,MW -98,cal_P_DEC,v,Mirror generated variable calculation for P_DEC,MirrorFunc,P_DEC = P_in + P_alpha,MW -99,cal_P_DECe,v,Mirror generated variable calculation for P_DECe,MirrorFunc,P_DECe = eta_DEC * P_DEC,MW -100,cal_P_egross,v,Mirror generated variable calculation for P_egross,MirrorFunc,P_egross = P_DECe + P_the if application == 'electricity' else P_DECe,MW -101,cal_P_enet,v,Mirror generated variable calculation for P_enet,MirrorFunc,P_enet = P_egross - (P_ine + P_other),MW -102,cal_f_aux,v,Mirror generated variable calculation for f_aux,MirrorFunc,f_aux = P_aux / P_egross,1 -103,cal_Q_sci,v,Mirror generated variable calculation for Q_sci,MirrorFunc,Q_sci = P_f / P_in,1 -104,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 -105,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 -106,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 +88,cal_HF_magnet_cost,v,Mirror generated variable calculation for HF_magnet_cost,MirrorFunc,"HF_magnet_cost = HTS_storedEnergy(25.0, 50) * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2))",million +89,cal_LF_magnet_cost,v,Mirror generated variable calculation for LF_magnet_cost,MirrorFunc,"LF_magnet_cost = HTS_storedEnergy(10.0, 50) * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2))",million +90,cal_CF_magnet_cost,v,Mirror generated variable calculation for CF_magnet_cost,MirrorFunc,CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2)),million +91,cal_P_alpha,v,Mirror generated variable calculation for P_alpha,MirrorFunc,P_alpha = P_f * E_alpha / E_DT,MW +92,cal_P_n,v,Mirror generated variable calculation for P_n,MirrorFunc,P_n = P_f - P_alpha,MW +93,cal_P_ine,v,Mirror generated variable calculation for P_ine,MirrorFunc,P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH,MW +94,cal_P_pump,v,Mirror generated variable calculation for P_pump,MirrorFunc,P_pump = f_pump * M_n * P_n,MW +95,cal_P_sub_cont,v,Mirror generated variable calculation for P_sub_cont,MirrorFunc,P_sub_cont = f_sub * P_f,MW +96,cal_P_cryo,v,Mirror generated variable calculation for P_cryo,MirrorFunc,P_cryo = f_cryo * P_f,MW +97,cal_P_other,v,Mirror generated variable calculation for P_other,MirrorFunc,P_other = P_pump + P_sub_cont + P_cryo,MW +98,cal_P_in,v,Mirror generated variable calculation for P_in,MirrorFunc,P_in = P_NBI + P_ICRH + P_ECH,MW +99,cal_P_th,v,Mirror generated variable calculation for P_th,MirrorFunc,P_th = M_n * P_n + eta_pump * P_pump,MW +100,cal_P_the,v,Mirror generated variable calculation for P_the,MirrorFunc,P_the = eta_th * P_th,MW +101,cal_P_DEC,v,Mirror generated variable calculation for P_DEC,MirrorFunc,P_DEC = P_in + P_alpha,MW +102,cal_P_DECe,v,Mirror generated variable calculation for P_DECe,MirrorFunc,P_DECe = eta_DEC * P_DEC,MW +103,cal_P_egross,v,Mirror generated variable calculation for P_egross,MirrorFunc,P_egross = P_DECe + P_the if application == 'electricity' else P_DECe,MW +104,cal_P_enet,v,Mirror generated variable calculation for P_enet,MirrorFunc,P_enet = P_egross - (P_ine + P_other),MW +105,cal_f_aux,v,Mirror generated variable calculation for f_aux,MirrorFunc,f_aux = P_aux / P_egross,1 +106,cal_Q_sci,v,Mirror generated variable calculation for Q_sci,MirrorFunc,Q_sci = P_f / P_in,1 +107,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 +108,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 +109,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index da2d4e7..e3a9d7b 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -157,7 +157,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 156,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 157,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 158,NOAK,Mirror input parameter,0.0,1,,,,0 -159,n_unit,Mirror input parameter,1.0,1,,,cost_factor,0 +159,n_unit,Mirror input parameter,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 160,construction_time,Mirror input parameter,6.0,years,,,,0 161,lifetime,Mirror input parameter,30.0,years,,,,0 162,replacement,Mirror input parameter,10.0,years,,,,0 @@ -191,6 +191,9 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 190,L_EP,Mirror input parameter,1.0,m,,,L,0 191,L_EC,Mirror input parameter,1.0,m,,,L,0 192,a_EP,Mirror input parameter,1.0,m,,,,0 -193,HF_magnet_number,Mirror input parameter,4.0,1,,,,0 -194,LF_magnet_number,Mirror input parameter,2.0,1,,,,0 -195,CF_magnet_number,Mirror generated parameter,-1.0,1,cal_CF_magnet_number,"L_CC, L_CF",,0 +193,HF_magnet_number,Mirror input parameter,4.0,1,,,HF_magnet_cost,0 +194,LF_magnet_number,Mirror input parameter,2.0,1,,,LF_magnet_cost,0 +195,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 +196,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 +197,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 +198,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 From ceca3fe387607d0ae40aa92aad50822d9258a432 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 22:57:00 -0500 Subject: [PATCH 10/23] Decompose Mirror leaf account algorithms --- src/Algorithm/MirrorFunc.py | 176 +++++++++--------- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 33 ++-- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 8 +- test/test_mirror_model.py | 73 +++++++- tutorial/accert/ref_tables/MirrorFunc.py | 176 +++++++++--------- tutorial/accert/ref_tables/mirror_account.csv | 24 +-- .../accert/ref_tables/mirror_algorithm.csv | 6 +- .../accert/ref_tables/mirror_variable.csv | 3 +- 10 files changed, 288 insertions(+), 213 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index a1d6827..8be7a1b 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -221,105 +221,105 @@ def Account_C21(inputs): ) @staticmethod - def Account_C21_1(inputs): + def Account_C21_1(P_egross): # Site Preparation/Yard Work - return(inputs['P_egross'] * 268/1e3) + return(P_egross * 268/1e3) @staticmethod - def Account_C21_2(inputs): + def Account_C21_2(P_egross): # Heat Island Building - return(inputs['P_egross'] * 186.8/1e3) + return(P_egross * 186.8/1e3) @staticmethod - def Account_C21_3(inputs): + def Account_C21_3(application, P_egross): # Turbine Generator Building - if inputs['application'].lower()=='electricity': - return(inputs['P_egross'] * 54.0/1e3) + if application.lower()=='electricity': + return(P_egross * 54.0/1e3) else: return(0) @staticmethod - def Account_C21_4(inputs): + def Account_C21_4(P_egross): # Heat Exchanger Building - return(37.8/1e3 * inputs['P_egross']) + return(37.8/1e3 * P_egross) @staticmethod #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, - def Account_C21_5(inputs): + def Account_C21_5(P_egross): # Power Supply and Energy Storage - return(10.8/1e3 * inputs['P_egross']) + return(10.8/1e3 * P_egross) @staticmethod #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, - def Account_C21_6(inputs): + def Account_C21_6(P_egross): # Reactor Auxiliaries - return(5.4/1e3 * inputs['P_egross']) + return(5.4/1e3 * P_egross) @staticmethod #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, - def Account_C21_7(inputs): + def Account_C21_7(P_egross): # Hot Cell - return(93.4/1e3 * inputs['P_egross']) + return(93.4/1e3 * P_egross) @staticmethod #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, - def Account_C21_8(inputs): + def Account_C21_8(P_egross): # Reactor Services - return(18.7/1e3 * inputs['P_egross']) + return(18.7/1e3 * P_egross) @staticmethod #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, - def Account_C21_9(inputs): + def Account_C21_9(P_egross): # Service Water - return(0.3/1e3 * inputs['P_egross']) + return(0.3/1e3 * P_egross) @staticmethod #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, - def Account_C21_10(inputs): + def Account_C21_10(P_egross): # Fuel Storage - return(1.1/1e3 * inputs['P_egross']) + return(1.1/1e3 * P_egross) @staticmethod #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_11(inputs): + def Account_C21_11(P_egross): # Control Room - return(0.9/1e3 * inputs['P_egross']) + return(0.9/1e3 * P_egross) @staticmethod #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, - def Account_C21_12(inputs): + def Account_C21_12(P_egross): # Onsite AC Power - return(0.8/1e3 * inputs['P_egross']) + return(0.8/1e3 * P_egross) @staticmethod #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, - def Account_C21_13(inputs): + def Account_C21_13(P_egross): # Administration - return(4.4/1e3 * inputs['P_egross']) + return(4.4/1e3 * P_egross) @staticmethod #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, - def Account_C21_14(inputs): + def Account_C21_14(P_egross): # Site Services - return(1.6/1e3 * inputs['P_egross']) + return(1.6/1e3 * P_egross) @staticmethod #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, - def Account_C21_15(inputs): + def Account_C21_15(P_egross): # Cyrogenics - return(2.4/1e3 * inputs['P_egross']) + return(2.4/1e3 * P_egross) @staticmethod #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_16(inputs): + def Account_C21_16(P_egross): # Security - return(0.9/1e3 * inputs['P_egross']) + return(0.9/1e3 * P_egross) @staticmethod #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, - def Account_C21_17(inputs): + def Account_C21_17(P_egross): # Ventilation Stack - return(27.0/1e3 * inputs['P_egross']) + return(27.0/1e3 * P_egross) @staticmethod @@ -375,10 +375,10 @@ def Account_C22_1_1(inputs): return(total_cost/1e6) @staticmethod - def Account_C22_1_2(inputs): + def Account_C22_1_2(HF_magnet_shield_cost): # Magnet Radiation Shield # Factor of two for each end plug - return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) + return(2 * HF_magnet_shield_cost) @staticmethod def Account_C22_1_3(inputs): @@ -421,22 +421,22 @@ def Account_C22_1_4(inputs): ) @staticmethod - def Account_C22_1_4_1(inputs): + def Account_C22_1_4_1(P_NBI, cost_factor): # NBI - return(7.0642 * inputs['P_NBI'] * inputs['cost_factor']) + return(7.0642 * P_NBI * cost_factor) @staticmethod - def Account_C22_1_4_2(inputs): + def Account_C22_1_4_2(P_ICRH, cost_factor): # ICRH - return(4.149 * inputs['P_ICRH'] * inputs['cost_factor']) + return(4.149 * P_ICRH * cost_factor) @staticmethod - def Account_C22_1_4_3(inputs): + def Account_C22_1_4_3(P_ECH, cost_factor): # ECH - return(8.0 * inputs['P_ECH'] * inputs['cost_factor']) + return(8.0 * P_ECH * cost_factor) @staticmethod - def Account_C22_1_5(inputs): + def Account_C22_1_5(): # Primary Structure and Support return(0) @@ -459,25 +459,25 @@ def Account_C22_1_6(inputs): @staticmethod - def Account_C22_1_6_2(inputs): + def Account_C22_1_6_2(): # Helium Liquefier-Refrigerators (not for magnets) # Presumably for a full vessel cryostat? return(0) @staticmethod - def Account_C22_1_6_3(inputs): + def Account_C22_1_6_3(no_vpumps, cost_pump): #VACUUM PUMPING 22.1.6.3 - return(inputs['no_vpumps'] * inputs['cost_pump'] / 1e6) + return(no_vpumps * cost_pump / 1e6) @staticmethod - def Account_C22_1_6_4(inputs): + def Account_C22_1_6_4(): # Roughing Pump return(120000*2.85/1e6) @staticmethod - def Account_C22_1_7(inputs): + def Account_C22_1_7(): # Power Supplies # Not using Woodruff 2024 as that is based on ITER fusion power @@ -491,22 +491,22 @@ def Account_C22_1_7(inputs): return(0) @staticmethod - def Account_C22_1_8(inputs): + def Account_C22_1_8(): # Divertor return(0) @staticmethod - def Account_C22_1_9(inputs): + def Account_C22_1_9(P_DECe, cost_factor): # Direct Energy Convertor # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - return(1.7347 * inputs['P_DECe'] * inputs['cost_factor']) + return(1.7347 * P_DECe * cost_factor) @staticmethod - def Account_C22_1_11(inputs): + def Account_C22_1_11(L, N_module, construction_time, cost_factor): # Assembly and Installation Costs #Cost Category 22.1.11 Installation costs - axis_t = inputs['L']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_t = L/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius axis_ir = axis_t # Define labor rate @@ -514,22 +514,22 @@ def Account_C22_1_11(inputs): # Calculations constructionworker = 20 * axis_ir / 4 - C_22_1_11_in = inputs['N_module'] * inputs['construction_time'] * (lr * 20 * 300) - C_22_1_11_1_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket - C_22_1_11_2_in = inputs['N_module'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield - C_22_1_11_3_in = inputs['N_module'] * ((lr * 100 * constructionworker) + 0) # coils - C_22_1_11_4_in = inputs['N_module'] * ((lr * 30 * constructionworker) + 0) # supplementary heating - C_22_1_11_5_in = inputs['N_module'] * ((lr * 60 * constructionworker) + 0) # primary structure - C_22_1_11_6_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # vacuum system - C_22_1_11_7_in = inputs['N_module'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_in = N_module * construction_time * (lr * 20 * 300) + C_22_1_11_1_in = N_module * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = N_module * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = N_module * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = N_module * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = N_module * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = N_module * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = N_module * ((lr * 400 * constructionworker) + 0) # power supplies C_22_1_11_8_in = 0 # guns or divertor - C_22_1_11_9_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_9_in = N_module * ((lr * 200 * constructionworker) + 0) # direct energy converter C_22_1_11_10_in = 0 # ECRH # Total cost calculations C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - return(C220111 * inputs['cost_factor']) + return(C220111 * cost_factor) @staticmethod def Account_C22_2(inputs): @@ -541,32 +541,32 @@ def Account_C22_2(inputs): ) @staticmethod - def Account_C22_2_1(inputs): + def Account_C22_2_1(N_module, P_egross): # Primary Coolant - return(166 * (inputs['N_module'] * inputs['P_egross']/1000)) + return(166 * (N_module * P_egross/1000)) @staticmethod - def Account_C22_2_2(inputs): + def Account_C22_2_2(P_th): # Secondary Coolant - return(40.6 * (inputs['P_th']/3500)**0.55) + return(40.6 * (P_th/3500)**0.55) @staticmethod - def Account_C22_2_3(inputs): + def Account_C22_2_3(): # Tertiary Coolant return(0) @staticmethod - def Account_C22_3(inputs): + def Account_C22_3(N_module, P_th): # Auxiliary Cooling Systems - return(1.10 * 1e-3 * inputs['N_module'] * inputs['P_th'] * 2.02) + return(1.10 * 1e-3 * N_module * P_th * 2.02) @staticmethod - def Account_C22_4(inputs): + def Account_C22_4(P_th): # Radioactive Waste Treatment - return(1.96 * 1e-3 * inputs['P_th'] * 2.02) + return(1.96 * 1e-3 * P_th * 2.02) @staticmethod - def Account_C22_5(inputs): + def Account_C22_5(cost_factor): # Cost Category 22.5 Fuel Handling and Storage inflation = 1.43 @@ -591,46 +591,46 @@ def Account_C22_5(inputs): C220506 = C2205060ITER * ltoak C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - return(C220500 * inputs['cost_factor']) + return(C220500 * cost_factor) @staticmethod - def Account_C22_6(inputs): + def Account_C22_6(P_enet): # Cost Category 22.6 Other Reactor Plant Equipment - return(11.5*(np.max((inputs['P_enet'],0))/1000)**(0.8)) + return(11.5*(np.max((P_enet,0))/1000)**(0.8)) @staticmethod - def Account_C22_7(inputs): + def Account_C22_7(): # Cost Category 22.7 Instrumentation and Control return(85) @staticmethod - def Account_C23(inputs): + def Account_C23(N_module, P_egross): # Turbine Plant Equipment - return(inputs['N_module'] * inputs['P_egross'] * 0.219 *1.15) + return(N_module * P_egross * 0.219 *1.15) @staticmethod - def Account_C24(inputs): + def Account_C24(N_module, P_egross): # Electric Plant Equipment - return(inputs['N_module'] * inputs['P_egross'] * 0.054 * 1.15) + return(N_module * P_egross * 0.054 * 1.15) @staticmethod - def Account_C25(inputs): + def Account_C25(N_module, P_egross): # Miscellaneous Plant Equipment - return(inputs['N_module'] * inputs['P_egross'] * 0.038 * 1.15) + return(N_module * P_egross * 0.038 * 1.15) @staticmethod - def Account_C26(inputs): + def Account_C26(N_module, P_enet): # Heat Rejection - return(inputs['N_module'] * inputs['P_enet'] * 0.107 * 1.15 ) + return(N_module * P_enet * 0.107 * 1.15 ) @staticmethod - def Account_C27(inputs): + def Account_C27(): # Special Materials # Total elsewhere, implement later return(0) @staticmethod - def Account_C28(inputs): + def Account_C28(): # Digital Twin return(5) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 35e9725f289649a59c79ad3daa64048b21b3885b..a07c675c72996c507234fa8438c40805f267637e 100644 GIT binary patch delta 1870 zcmZux3v5)!6@4>r-kbNIyDYAQH?9|zPwW8RjSU9u*j^j_$6rvQgs@A(229tVdTody z0vocW2}M88{omPWtGhCw`;q#pnp*iC%>5VTR6em#*ZAR}?oo81dG(|x@HvuqWOloIa`Y^u zZc$UqXFl3W`RBR17j5SM$kqR)zVaxzOXvs~0;Yf^U<)|z#6qV2Xw7_lP+}jkMrX{~ z=peh#UTS@2ZL=OThs@>1-;8&RHHKIJr5@KawVT=r?PYBN{hE%^Z8TfGr0!O0)w#+) zm0u{El^k-N93wkPw)};BSZ6HFKj`2lTSlWvV}AAI8A{-N<~??W$pUbXlFRS zp*b2`7k;TN-szU5KnI=P+7{l_-qq3`pXX1q;pE!=&ErrcD+asA{v*n`$pERnrs#xH zVu-$u%l9}9Kn527Cju}F6OUUHfa5a%RxYHZjig)~CP=^Jzf z1@(e@NZqV1RnwFvC0o(S7i5%h@;y>bGKnT%mWSnC@@hFKtN4BVV;slN;CwvC!UnpD zev95hozlk#Jb|aV8;03@Qwe;Z|0N8w_z#L<(Tvn01Npp&+2Sjz4=<`|UJ__-?JNuO z@er(Z|62mbR9+Z@o!nOftN58>=;7Wf=;nK?pq}5Tf)YNr8Y=7xW}qUk%~l8VK^@F0oUR%uRpg6wTWv|+ zBi`8&oTeDa`;b*y!prV+HeKi>$ud3_^1?KU;RVx2=H6!Sfekk2nRK!Lk^ zHRNC-o?*uRkdL2P19wIuFqwfCjO+sh+tD$pKyoEf;Xd{ZOLJ~H!%mlz?^yO_`viK$ z-el+7$QrlySdG>b=7;8MW`pT7t{Xo$dX11VP5+ZVpttC`+Jtsm`=M4$Z_`n_lZHes zr_~;{Q29z36%!vMUy=dRO=`(3lp|l23-Co8!>N+XZ#0lR*4>!E)`||2V?7hFt+yx)ZZTM@JCzM`P*Y% z>x;`zWL0eF-rv$3iwQq)Ylfi;C9Ri-dhi@~>?Ew#`NkpWbYC5X2D~om&I_b|iM`J{ z*;1xEzjF>c&pXrXPwXxBTm}1Y&B-;zt%hSG;K_aY8D-#FH%JvQKQPF zvPY>Vmr0xaKlxpG6~2vsf~&BEhEcI}Q|cEJRm4BI%9imXec(>%FFbYxYORVa3#H7Z z$eVP(b4MWPs&7LaS=F-zzmPoO6aA3up6`d}kySiX@Tm{?XAeTA?_t>;ZLwHad%ItR z^Y4eB^yTp#gHSiM@$o+l!pm0Ow}tmEdFZ{RM`7`dZ>X(E7mi&@gky`#9XSe%+#5&X zS!HVX<#q4CM^=NGOrZ}_(vQQ^Zz|RqB3wx{JE^$!I4pM09EVcuq8^xJ{KgP$Jn0V{ GV*dvp9T?aE delta 1913 zcmZuy4Qv$072esMo!QyHdB@ptsbhSO4X!bU^A9c#hS-<}unh(bf?%UN*MZ37{1bej zI6v4lIiRvAp~RUOL}Wrt1g+JG#%!A+r$j9zrKBW48z3@i70C+9pJ>t~5ZReKh`>=t zdb^+AeDBT7zBk`?^;LBBRXmgGTcaq*Q50oNnkMbh-O~!unyukj7{$VBEUd-CI2P7p zVG;||SlAd0v;WROt=@_t3n0=)QWj;ZB5+pt#IbY5|4?2qhicAj<03Y%Y;y=I;1FpsTeDaIM2+o&~6`Yzo|8|gjd9C?z=(68yI z^&Wk>o{Im4V|X#n*3N0$wK?in>TlGjS|Yc70eL;|@-5U}G1o@ET7&U)BU7Yb;sxUB z6>g#uZ`mb25!>Mc8~MvA@}<*kv3Z!6I^~Uxt(#h+p^AcnP=R-Jm@h%%U?0ps_5uGU z9Wn3v7_R^}ivNIDYS*+~-u(csD$0CdIMV_RZEcaJ#)fE9Ym3)30g@0+mi3Us+v11E z5L=vTpj*C%^8J$_WO+-1Fre)T1k=QgLP+*R*9`jsIyRqaJ{+0$%2t7SP%HU4Vs zFsclfzC)j-tLQ9pgIp#_`se!J^q2H4`f9yExA9f{7JdP@OqA(2xFd(r)bilEmT01=O)b&<_!i1* zAgfY>Bx0fzzmwpR=1_5UQ+sq{oH0Q+k^k0&-W;0$y&K>1W4 zmS=5O-nUj-1?CNN$m}<}&04d_46v`+d+bkaAM0S1j2q{Tmt|Eq$hzhkHvO2Mp-1RW z+Dwzk2pJ+Tkhyx`l0Kk6r8nR)+>6t-zi8XET6L*>6v>deTZVJ#(FDu~%6=!^UBwhW?NC(Q5J; z=^;PW-_fIbCLY8KviB$x%}tSrl!=Y4k;taDx`1TQzR6B?#J+y05o7(Z-mae{^{M2RK0R^>W=$EFW?Yih zX;SJcu#`HQDc(2)#nv5M@9RUbT2EdYTKCY#*7o*sQYF^?7T&Pyt#~-S8D2O5_h#J= z&mXtY8dEYCVZ(_pv~2)p-LX*68ybKLwG$01rOIK2pW!`xEzfdC+&{XV?mX9UE;>h? zC!8wOk2cu4d`m6`7eA%=oWXm>~8SEMxlp?g4B^krUJ|kiT=zDa(`~_r? z56C_eCX@8@`hIuD=H`TngR0?j6p_~*a zpMj%d_I`+B?K!1IQZ{&zUqdC*oK$(GyVNP(l|3N4OEzRs&Q24L?uLBtcl%+PDo!th MLJ$3!k8z}Y2SIxW+5i9m diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 333eef6..1d38370 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6949,7 +6949,7 @@ INSERT INTO mirror_alg VALUES(5,'Account_C20','c','Account C20 Rollup','MirrorFu INSERT INTO mirror_alg VALUES(6,'Account_C21','c','Account C21 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(7,'Account_C21_1','c','Account C211 Rollup','MirrorFunc','P_egross','million'); INSERT INTO mirror_alg VALUES(8,'Account_C21_2','c','Account C212 Rollup','MirrorFunc','P_egross','million'); -INSERT INTO mirror_alg VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','P_egross, application','million'); +INSERT INTO mirror_alg VALUES(9,'Account_C21_3','c','Account C213 Rollup','MirrorFunc','application, P_egross','million'); INSERT INTO mirror_alg VALUES(10,'Account_C21_4','c','Account C214 Rollup','MirrorFunc','P_egross','million'); INSERT INTO mirror_alg VALUES(11,'Account_C21_5','c','Account C215 Rollup','MirrorFunc','P_egross','million'); INSERT INTO mirror_alg VALUES(12,'Account_C21_6','c','Account C216 Rollup','MirrorFunc','P_egross','million'); @@ -6967,7 +6967,7 @@ INSERT INTO mirror_alg VALUES(23,'Account_C21_17','c','Account C2117 Rollup','Mi INSERT INTO mirror_alg VALUES(24,'Account_C22','c','Account C22 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(25,'Account_C22_1','c','Account C221 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(26,'Account_C22_1_1','c','Account C2211 Rollup','MirrorFunc','L_CC, L_EP','million'); -INSERT INTO mirror_alg VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','reference value','million'); +INSERT INTO mirror_alg VALUES(27,'Account_C22_1_2','c','Account C2212 Rollup','MirrorFunc','HF_magnet_shield_cost','million'); INSERT INTO mirror_alg VALUES(28,'Account_C22_1_3','c','Account C2213 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(29,'Account_C22_1_3_1','c','Account C22131 Rollup','MirrorFunc','HF_magnet_number, HF_magnet_cost','million'); INSERT INTO mirror_alg VALUES(30,'Account_C22_1_3_2','c','Account C22132 Rollup','MirrorFunc','LF_magnet_number, LF_magnet_cost','million'); @@ -6979,7 +6979,7 @@ INSERT INTO mirror_alg VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup' INSERT INTO mirror_alg VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(37,'Account_C22_1_6','c','Account C2216 Rollup','MirrorFunc','rollup','million'); INSERT INTO mirror_alg VALUES(38,'Account_C22_1_6_2','c','Account C22162 Rollup','MirrorFunc','reference value','million'); -INSERT INTO mirror_alg VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','cost_pump, no_vpumps','million'); +INSERT INTO mirror_alg VALUES(39,'Account_C22_1_6_3','c','Account C22163 Rollup','MirrorFunc','no_vpumps, cost_pump','million'); INSERT INTO mirror_alg VALUES(40,'Account_C22_1_6_4','c','Account C22164 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','reference value','million'); @@ -7259,7 +7259,8 @@ INSERT INTO mirror_var VALUES(194,'LF_magnet_number','Mirror input parameter',2. INSERT INTO mirror_var VALUES(195,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); INSERT INTO mirror_var VALUES(196,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); INSERT INTO mirror_var VALUES(197,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); -INSERT INTO mirror_var VALUES(198,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); +INSERT INTO mirror_var VALUES(198,'HF_magnet_shield_cost','HF magnet shield cost per end plug',47.36847786999999954,'million','','','',0); +INSERT INTO mirror_var VALUES(199,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.54000000284,0,'','Unchanged',0.004687831810420024433,'','million',''); INSERT INTO mirror_acco VALUES(2,'11','Land_and_Land_Rights',1186117.539999999804,1,'1','Unchanged',0.0002298971517736676198,'','million',''); @@ -7270,11 +7271,11 @@ INSERT INTO mirror_acco VALUES(6,'15','Plant_Studies',5000000.0,1,'1','Unchanged INSERT INTO mirror_acco VALUES(7,'16','Plant_Reports',2000000.0,1,'1','Unchanged',0.0003876464920562048719,'','million',''); INSERT INTO mirror_acco VALUES(8,'17','Other_Pre-Construction_Costs',1000000.0,1,'1','Unchanged',0.0001938232460281024359,'','million',''); INSERT INTO mirror_acco VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,1,'1','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298175963.0,0,'','Unchanged',0.2516166790643177831,'Account_C20','million','rollup'); -INSERT INTO mirror_acco VALUES(11,'21','Structures_and_Improvements',112945794.0999999941,1,'2','Unchanged',0.02189152043768370289,'Account_C21','million','rollup'); +INSERT INTO mirror_acco VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298175963.0,0,'','Unchanged',0.2516166790643177831,'','million','rollup'); +INSERT INTO mirror_acco VALUES(11,'21','Structures_and_Improvements',112945794.0999999941,1,'2','Unchanged',0.02189152043768370289,'','million','rollup'); INSERT INTO mirror_acco VALUES(12,'211','Site_Preparation/Yard_Work',42376414.42000000178,2,'21','Unchanged',0.008213534197916488519,'Account_C21_1','million','P_egross'); INSERT INTO mirror_acco VALUES(13,'212','Heat_Island_Building',29536993.33999999986,2,'21','Unchanged',0.005724955927069242875,'Account_C21_2','million','P_egross'); -INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',8538531.264999998733,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','P_egross, application'); +INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',8538531.264999998733,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','application, P_egross'); INSERT INTO mirror_acco VALUES(15,'214','Heat_Exchanger_Building',5976971.884999999776,2,'21','Unchanged',0.001158476092169406302,'Account_C21_4','million','P_egross'); INSERT INTO mirror_acco VALUES(16,'215','Power_Supply_and_Energy_Storage',1707706.253000000026,2,'21','Unchanged',0.0003309931692189479568,'Account_C21_5','million','P_egross'); INSERT INTO mirror_acco VALUES(17,'216','Reactor_Auxiliaries',853853.1265000000131,2,'21','Unchanged',0.0001654965846094739784,'Account_C21_6','million','P_egross'); @@ -7289,28 +7290,28 @@ INSERT INTO mirror_acco VALUES(25,'2114','Site_Services',252993.5190000000002,2, INSERT INTO mirror_acco VALUES(26,'2115','Cryogenics',379490.2784000000101,2,'21','Unchanged',7.355403759559629436e-05,'Account_C21_15','million','P_egross'); INSERT INTO mirror_acco VALUES(27,'2116','Security',142308.8543999999819,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_16','million','P_egross'); INSERT INTO mirror_acco VALUES(28,'2117','Ventilation_Stack',4269265.632000000216,2,'21','Unchanged',0.0008274829229504581827,'Account_C21_17','million','P_egross'); -INSERT INTO mirror_acco VALUES(29,'22','Heat_Island_Plant_Equipment',1111998920.0,1,'2','Unchanged',0.2155312402541442185,'Account_C22','million','rollup'); -INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',901967566.7999999524,2,'22','Unchanged',0.1748222816092453169,'Account_C22_1','million','rollup'); +INSERT INTO mirror_acco VALUES(29,'22','Heat_Island_Plant_Equipment',1111998920.0,1,'2','Unchanged',0.2155312402541442185,'','million','rollup'); +INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',901967566.7999999524,2,'22','Unchanged',0.1748222816092453169,'','million','rollup'); INSERT INTO mirror_acco VALUES(31,'2211','First_Wall_and_Blanket',43193434.21000000089,3,'221','Unchanged',0.00837189162568348702,'Account_C22_1_1','million','L_CC, L_EP'); -INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',94736955.7399999947,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million',''); -INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'Account_C22_1_3','million','rollup'); +INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',94736955.7399999947,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million','HF_magnet_shield_cost'); +INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'','million','rollup'); INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number, HF_magnet_cost'); INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number, LF_magnet_cost'); INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million','CF_magnet_number, CF_magnet_cost'); -INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',0.04408567877882998281,'Account_C22_1_4','million','rollup'); +INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',0.04408567877882998281,'','million','rollup'); INSERT INTO mirror_acco VALUES(38,'22141','NBI',105963000.0,4,'2214','Unchanged',0.0205380926188758195,'Account_C22_1_4_1','million','P_NBI, cost_factor'); INSERT INTO mirror_acco VALUES(39,'22142','ICRH',41490000.0,4,'2214','Unchanged',0.008041726477705971043,'Account_C22_1_4_2','million','P_ICRH, cost_factor'); INSERT INTO mirror_acco VALUES(40,'22143','ECH',80000000.0,4,'2214','Unchanged',0.01550585968224819574,'Account_C22_1_4_3','million','P_ECH, cost_factor'); INSERT INTO mirror_acco VALUES(41,'2215','Primary_Structure_and_Support',0.0,3,'221','Unchanged',0.0,'Account_C22_1_5','million',''); -INSERT INTO mirror_acco VALUES(42,'2216','Vacuum_System',2031827.257000000217,3,'221','Unchanged',0.0003938153543201155615,'Account_C22_1_6','million','rollup'); +INSERT INTO mirror_acco VALUES(42,'2216','Vacuum_System',2031827.257000000217,3,'221','Unchanged',0.0003938153543201155615,'','million','rollup'); INSERT INTO mirror_acco VALUES(43,'22162','Vessel_Refrigerators',0.0,4,'2216','Unchanged',0.0,'Account_C22_1_6_2','million',''); -INSERT INTO mirror_acco VALUES(44,'22163','Primary_Vacuum_Pumps',1689827.256999999984,4,'2216','Unchanged',0.0003275278041785044783,'Account_C22_1_6_3','million','cost_pump, no_vpumps'); +INSERT INTO mirror_acco VALUES(44,'22163','Primary_Vacuum_Pumps',1689827.256999999984,4,'2216','Unchanged',0.0003275278041785044783,'Account_C22_1_6_3','million','no_vpumps, cost_pump'); INSERT INTO mirror_acco VALUES(45,'22164','Backing_Vacuum_Pumps',342000.0,4,'2216','Unchanged',6.628755014161104265e-05,'Account_C22_1_6_4','million',''); INSERT INTO mirror_acco VALUES(46,'2217','Power_Supplies',0.0,3,'221','Unchanged',0.0,'Account_C22_1_7','million',''); INSERT INTO mirror_acco VALUES(47,'2218','Divertor',0.0,3,'221','Unchanged',0.0,'Account_C22_1_8','million',''); INSERT INTO mirror_acco VALUES(48,'2219','Direct_Energy_Convertor',109317164.7999999971,3,'221','Unchanged',0.02118820772812501919,'Account_C22_1_9','million','P_DECe, cost_factor'); INSERT INTO mirror_acco VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9000000059,3,'221','Unchanged',0.02969279247112800724,'Account_C22_1_11','million','L, N_module, construction_time, cost_factor'); -INSERT INTO mirror_acco VALUES(50,'222','Main_and_Secondary_Coolant',33649451.5,2,'22','Unchanged',0.006522045916795200273,'Account_C22_2','million','rollup'); +INSERT INTO mirror_acco VALUES(50,'222','Main_and_Secondary_Coolant',33649451.5,2,'22','Unchanged',0.006522045916795200273,'','million','rollup'); INSERT INTO mirror_acco VALUES(51,'223','Auxiliary_Cooling_Systems',352198.2635000000009,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); INSERT INTO mirror_acco VALUES(52,'224','Radioactive_Waste_Treatment',627553.269500000053,2,'22','Unchanged',0.0001216344117500385732,'Account_C22_4','million','P_th'); INSERT INTO mirror_acco VALUES(53,'225','Fuel_Handling_and_Storage',88654052.28999999166,2,'22','Unchanged',0.01718321618839292741,'Account_C22_5','million','cost_factor'); @@ -7322,7 +7323,7 @@ INSERT INTO mirror_acco VALUES(58,'25','Miscellaneous_Plant_Equipment',6909885.4 INSERT INTO mirror_acco VALUES(59,'26','Heat_Rejection',11679291.32000000029,1,'2','Unchanged',0.002263718154950241507,'Account_C26','million','N_module, P_enet'); INSERT INTO mirror_acco VALUES(60,'27','Special_Materials',0.0,1,'2','Unchanged',0.0,'Account_C27','million',''); INSERT INTO mirror_acco VALUES(61,'28','Digital_Twin/Simulator',5000000.0,1,'2','Unchanged',0.000969116230140512235,'Account_C28','million',''); -INSERT INTO mirror_acco VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'2','Unchanged',0.0,'Account_C29','million','rollup'); +INSERT INTO mirror_acco VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'2','Unchanged',0.0,'','million','rollup'); INSERT INTO mirror_acco VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71591970.57999999822,0,'','Unchanged',0.01387618812736401107,'','million',''); INSERT INTO mirror_acco VALUES(64,'31','Field_Indirect_Costs',14318394.12000000104,1,'3','Unchanged',0.002775237626248095324,'','million',''); INSERT INTO mirror_acco VALUES(65,'32','Construction_Supervision',35795985.28999999911,1,'3','Unchanged',0.006938094063682005535,'','million',''); diff --git a/src/etc/accert.sch b/src/etc/accert.sch index ad1cb82..1ff1a0d 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -798,7 +798,7 @@ fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'ann stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] mirror_alg_names = ['__init__' 'add_account' 'generate_report' 'learning_credit' 'Account_C20' 'Account_C21' 'Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22' 'Account_C22_1' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_2' 'Account_C22_2_1' 'Account_C22_2_2' 'Account_C22_2_3' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'Account_C29' 'Account_OCC' 'Account_TCC' 'Account_C90' 'PbLi_density' 'Li_price' 'PbLi_price' 'V_cylindrical_shell' 'V_inverse_triangular_washer' 'generate_inputs' 'create_radial_build' 'add_new_layer' 'add_fractional_layer' 'build_central_cell' 'central_cell_cost' 'central_cell' 'expander_cell_cost' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_HF_magnet_cost' 'cal_LF_magnet_cost' 'cal_CF_magnet_cost' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number'] -mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost' 'CF_magnet_number'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index 46ecfd5..567bd23 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -76,6 +76,7 @@ "HF_magnet_cost": (29.1, "million"), "LF_magnet_cost": (6.25262, "million"), "CF_magnet_cost": (2.751, "million"), + "HF_magnet_shield_cost": (47.36847787, "million"), "CF_magnet_number": (52.0300751726645, "1"), "P_egross": (158.12094932835822, "MW"), "P_DECe": (63.01790788032513, "MW"), @@ -250,6 +251,11 @@ None, "1", ), + "HF_magnet_shield_cost": ( + "HF magnet shield cost per end plug", + None, + "million", + ), } TYPE_REPLACEMENTS = ( @@ -479,7 +485,7 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: alg_name = _mirror_method_name(raw_code) input_keys, account_calls = dependencies.get(alg_name, ([], [])) variables = _account_variables(input_keys, account_calls) - if alg_name not in methods: + if account_calls or alg_name not in methods: alg_name = "" conn.execute( """ diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 1d981c9..4fa0b31 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -124,6 +124,25 @@ def test_mirror_accounts_use_fusion_style_structure(cursor): assert cursor.fetchone()[0] == 1587572359.0 +def test_mirror_parent_accounts_are_rollups_without_algorithms(cursor): + cursor.execute( + """ + SELECT code_of_account, alg_name, variables + FROM mirror_acco + WHERE code_of_account IN (?, ?, ?, ?, ?) + ORDER BY code_of_account; + """, + ("21", "22", "221", "2213", "29"), + ) + assert cursor.fetchall() == [ + ("21", "", "rollup"), + ("22", "", "rollup"), + ("221", "", "rollup"), + ("2213", "", "rollup"), + ("29", "", "rollup"), + ] + + def test_mirror_variable_links_are_reversed_from_var_need(cursor): cursor.execute( """ @@ -215,6 +234,20 @@ def test_mirror_account_algorithms_use_accert_variable_names(): assert alg.run({"P_egross": 158.12094932835822}) == pytest.approx(42.37641442) + alg = MirrorFunc( + ind=1, + alg_name="Account_C21_3", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="application,P_egross", + constants="", + ) + assert alg.run({"application": "electricity", "P_egross": 158.12094932835822}) == pytest.approx( + 8.538531263731343 + ) + def test_mirror_vacuum_pump_account_uses_deeper_variables(cursor): cursor.execute( @@ -225,7 +258,7 @@ def test_mirror_vacuum_pump_account_uses_deeper_variables(cursor): """, ("22163",), ) - assert cursor.fetchone()[0] == "cost_pump, no_vpumps" + assert cursor.fetchone()[0] == "no_vpumps, cost_pump" cursor.execute( """ @@ -286,10 +319,10 @@ def test_mirror_vacuum_pump_account_uses_deeper_variables(cursor): alg_description="", alg_formulation="", alg_units="million", - variables="cost_pump,no_vpumps", + variables="no_vpumps,cost_pump", constants="", ) - assert alg.run({"cost_pump": 40000, "no_vpumps": 2.2619467105846507}) == pytest.approx( + assert alg.run({"no_vpumps": 2.2619467105846507, "cost_pump": 40000}) == pytest.approx( 0.09047786842338603 ) @@ -431,6 +464,40 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): assert alg.run({"HF_magnet_number": 4.0, "HF_magnet_cost": 29.1}) == pytest.approx(116.4) +def test_mirror_magnet_shield_account_uses_reference_variable(cursor): + cursor.execute( + """ + SELECT variables + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("2212",), + ) + assert cursor.fetchone()[0] == "HF_magnet_shield_cost" + + cursor.execute( + """ + SELECT var_description, var_value, var_unit + FROM mirror_var + WHERE var_name = ?; + """, + ("HF_magnet_shield_cost",), + ) + assert cursor.fetchone() == ("HF magnet shield cost per end plug", 47.36847787, "million") + + alg = MirrorFunc( + ind=1, + alg_name="Account_C22_1_2", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="HF_magnet_shield_cost", + constants="", + ) + assert alg.run({"HF_magnet_shield_cost": 47.36847787}) == pytest.approx(94.73695574) + + def test_mirror_generated_variable_algorithm_can_recalculate(cursor): accert = Accert.__new__(Accert) accert.var_tabl = "mirror_var" diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index a1d6827..8be7a1b 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -221,105 +221,105 @@ def Account_C21(inputs): ) @staticmethod - def Account_C21_1(inputs): + def Account_C21_1(P_egross): # Site Preparation/Yard Work - return(inputs['P_egross'] * 268/1e3) + return(P_egross * 268/1e3) @staticmethod - def Account_C21_2(inputs): + def Account_C21_2(P_egross): # Heat Island Building - return(inputs['P_egross'] * 186.8/1e3) + return(P_egross * 186.8/1e3) @staticmethod - def Account_C21_3(inputs): + def Account_C21_3(application, P_egross): # Turbine Generator Building - if inputs['application'].lower()=='electricity': - return(inputs['P_egross'] * 54.0/1e3) + if application.lower()=='electricity': + return(P_egross * 54.0/1e3) else: return(0) @staticmethod - def Account_C21_4(inputs): + def Account_C21_4(P_egross): # Heat Exchanger Building - return(37.8/1e3 * inputs['P_egross']) + return(37.8/1e3 * P_egross) @staticmethod #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, - def Account_C21_5(inputs): + def Account_C21_5(P_egross): # Power Supply and Energy Storage - return(10.8/1e3 * inputs['P_egross']) + return(10.8/1e3 * P_egross) @staticmethod #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, - def Account_C21_6(inputs): + def Account_C21_6(P_egross): # Reactor Auxiliaries - return(5.4/1e3 * inputs['P_egross']) + return(5.4/1e3 * P_egross) @staticmethod #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, - def Account_C21_7(inputs): + def Account_C21_7(P_egross): # Hot Cell - return(93.4/1e3 * inputs['P_egross']) + return(93.4/1e3 * P_egross) @staticmethod #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, - def Account_C21_8(inputs): + def Account_C21_8(P_egross): # Reactor Services - return(18.7/1e3 * inputs['P_egross']) + return(18.7/1e3 * P_egross) @staticmethod #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, - def Account_C21_9(inputs): + def Account_C21_9(P_egross): # Service Water - return(0.3/1e3 * inputs['P_egross']) + return(0.3/1e3 * P_egross) @staticmethod #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, - def Account_C21_10(inputs): + def Account_C21_10(P_egross): # Fuel Storage - return(1.1/1e3 * inputs['P_egross']) + return(1.1/1e3 * P_egross) @staticmethod #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_11(inputs): + def Account_C21_11(P_egross): # Control Room - return(0.9/1e3 * inputs['P_egross']) + return(0.9/1e3 * P_egross) @staticmethod #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, - def Account_C21_12(inputs): + def Account_C21_12(P_egross): # Onsite AC Power - return(0.8/1e3 * inputs['P_egross']) + return(0.8/1e3 * P_egross) @staticmethod #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, - def Account_C21_13(inputs): + def Account_C21_13(P_egross): # Administration - return(4.4/1e3 * inputs['P_egross']) + return(4.4/1e3 * P_egross) @staticmethod #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, - def Account_C21_14(inputs): + def Account_C21_14(P_egross): # Site Services - return(1.6/1e3 * inputs['P_egross']) + return(1.6/1e3 * P_egross) @staticmethod #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, - def Account_C21_15(inputs): + def Account_C21_15(P_egross): # Cyrogenics - return(2.4/1e3 * inputs['P_egross']) + return(2.4/1e3 * P_egross) @staticmethod #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_16(inputs): + def Account_C21_16(P_egross): # Security - return(0.9/1e3 * inputs['P_egross']) + return(0.9/1e3 * P_egross) @staticmethod #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, - def Account_C21_17(inputs): + def Account_C21_17(P_egross): # Ventilation Stack - return(27.0/1e3 * inputs['P_egross']) + return(27.0/1e3 * P_egross) @staticmethod @@ -375,10 +375,10 @@ def Account_C22_1_1(inputs): return(total_cost/1e6) @staticmethod - def Account_C22_1_2(inputs): + def Account_C22_1_2(HF_magnet_shield_cost): # Magnet Radiation Shield # Factor of two for each end plug - return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) + return(2 * HF_magnet_shield_cost) @staticmethod def Account_C22_1_3(inputs): @@ -421,22 +421,22 @@ def Account_C22_1_4(inputs): ) @staticmethod - def Account_C22_1_4_1(inputs): + def Account_C22_1_4_1(P_NBI, cost_factor): # NBI - return(7.0642 * inputs['P_NBI'] * inputs['cost_factor']) + return(7.0642 * P_NBI * cost_factor) @staticmethod - def Account_C22_1_4_2(inputs): + def Account_C22_1_4_2(P_ICRH, cost_factor): # ICRH - return(4.149 * inputs['P_ICRH'] * inputs['cost_factor']) + return(4.149 * P_ICRH * cost_factor) @staticmethod - def Account_C22_1_4_3(inputs): + def Account_C22_1_4_3(P_ECH, cost_factor): # ECH - return(8.0 * inputs['P_ECH'] * inputs['cost_factor']) + return(8.0 * P_ECH * cost_factor) @staticmethod - def Account_C22_1_5(inputs): + def Account_C22_1_5(): # Primary Structure and Support return(0) @@ -459,25 +459,25 @@ def Account_C22_1_6(inputs): @staticmethod - def Account_C22_1_6_2(inputs): + def Account_C22_1_6_2(): # Helium Liquefier-Refrigerators (not for magnets) # Presumably for a full vessel cryostat? return(0) @staticmethod - def Account_C22_1_6_3(inputs): + def Account_C22_1_6_3(no_vpumps, cost_pump): #VACUUM PUMPING 22.1.6.3 - return(inputs['no_vpumps'] * inputs['cost_pump'] / 1e6) + return(no_vpumps * cost_pump / 1e6) @staticmethod - def Account_C22_1_6_4(inputs): + def Account_C22_1_6_4(): # Roughing Pump return(120000*2.85/1e6) @staticmethod - def Account_C22_1_7(inputs): + def Account_C22_1_7(): # Power Supplies # Not using Woodruff 2024 as that is based on ITER fusion power @@ -491,22 +491,22 @@ def Account_C22_1_7(inputs): return(0) @staticmethod - def Account_C22_1_8(inputs): + def Account_C22_1_8(): # Divertor return(0) @staticmethod - def Account_C22_1_9(inputs): + def Account_C22_1_9(P_DECe, cost_factor): # Direct Energy Convertor # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - return(1.7347 * inputs['P_DECe'] * inputs['cost_factor']) + return(1.7347 * P_DECe * cost_factor) @staticmethod - def Account_C22_1_11(inputs): + def Account_C22_1_11(L, N_module, construction_time, cost_factor): # Assembly and Installation Costs #Cost Category 22.1.11 Installation costs - axis_t = inputs['L']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius + axis_t = L/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius axis_ir = axis_t # Define labor rate @@ -514,22 +514,22 @@ def Account_C22_1_11(inputs): # Calculations constructionworker = 20 * axis_ir / 4 - C_22_1_11_in = inputs['N_module'] * inputs['construction_time'] * (lr * 20 * 300) - C_22_1_11_1_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket - C_22_1_11_2_in = inputs['N_module'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield - C_22_1_11_3_in = inputs['N_module'] * ((lr * 100 * constructionworker) + 0) # coils - C_22_1_11_4_in = inputs['N_module'] * ((lr * 30 * constructionworker) + 0) # supplementary heating - C_22_1_11_5_in = inputs['N_module'] * ((lr * 60 * constructionworker) + 0) # primary structure - C_22_1_11_6_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # vacuum system - C_22_1_11_7_in = inputs['N_module'] * ((lr * 400 * constructionworker) + 0) # power supplies + C_22_1_11_in = N_module * construction_time * (lr * 20 * 300) + C_22_1_11_1_in = N_module * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket + C_22_1_11_2_in = N_module * ((lr * 150 * constructionworker) + 0) # 22.2 shield + C_22_1_11_3_in = N_module * ((lr * 100 * constructionworker) + 0) # coils + C_22_1_11_4_in = N_module * ((lr * 30 * constructionworker) + 0) # supplementary heating + C_22_1_11_5_in = N_module * ((lr * 60 * constructionworker) + 0) # primary structure + C_22_1_11_6_in = N_module * ((lr * 200 * constructionworker) + 0) # vacuum system + C_22_1_11_7_in = N_module * ((lr * 400 * constructionworker) + 0) # power supplies C_22_1_11_8_in = 0 # guns or divertor - C_22_1_11_9_in = inputs['N_module'] * ((lr * 200 * constructionworker) + 0) # direct energy converter + C_22_1_11_9_in = N_module * ((lr * 200 * constructionworker) + 0) # direct energy converter C_22_1_11_10_in = 0 # ECRH # Total cost calculations C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - return(C220111 * inputs['cost_factor']) + return(C220111 * cost_factor) @staticmethod def Account_C22_2(inputs): @@ -541,32 +541,32 @@ def Account_C22_2(inputs): ) @staticmethod - def Account_C22_2_1(inputs): + def Account_C22_2_1(N_module, P_egross): # Primary Coolant - return(166 * (inputs['N_module'] * inputs['P_egross']/1000)) + return(166 * (N_module * P_egross/1000)) @staticmethod - def Account_C22_2_2(inputs): + def Account_C22_2_2(P_th): # Secondary Coolant - return(40.6 * (inputs['P_th']/3500)**0.55) + return(40.6 * (P_th/3500)**0.55) @staticmethod - def Account_C22_2_3(inputs): + def Account_C22_2_3(): # Tertiary Coolant return(0) @staticmethod - def Account_C22_3(inputs): + def Account_C22_3(N_module, P_th): # Auxiliary Cooling Systems - return(1.10 * 1e-3 * inputs['N_module'] * inputs['P_th'] * 2.02) + return(1.10 * 1e-3 * N_module * P_th * 2.02) @staticmethod - def Account_C22_4(inputs): + def Account_C22_4(P_th): # Radioactive Waste Treatment - return(1.96 * 1e-3 * inputs['P_th'] * 2.02) + return(1.96 * 1e-3 * P_th * 2.02) @staticmethod - def Account_C22_5(inputs): + def Account_C22_5(cost_factor): # Cost Category 22.5 Fuel Handling and Storage inflation = 1.43 @@ -591,46 +591,46 @@ def Account_C22_5(inputs): C220506 = C2205060ITER * ltoak C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - return(C220500 * inputs['cost_factor']) + return(C220500 * cost_factor) @staticmethod - def Account_C22_6(inputs): + def Account_C22_6(P_enet): # Cost Category 22.6 Other Reactor Plant Equipment - return(11.5*(np.max((inputs['P_enet'],0))/1000)**(0.8)) + return(11.5*(np.max((P_enet,0))/1000)**(0.8)) @staticmethod - def Account_C22_7(inputs): + def Account_C22_7(): # Cost Category 22.7 Instrumentation and Control return(85) @staticmethod - def Account_C23(inputs): + def Account_C23(N_module, P_egross): # Turbine Plant Equipment - return(inputs['N_module'] * inputs['P_egross'] * 0.219 *1.15) + return(N_module * P_egross * 0.219 *1.15) @staticmethod - def Account_C24(inputs): + def Account_C24(N_module, P_egross): # Electric Plant Equipment - return(inputs['N_module'] * inputs['P_egross'] * 0.054 * 1.15) + return(N_module * P_egross * 0.054 * 1.15) @staticmethod - def Account_C25(inputs): + def Account_C25(N_module, P_egross): # Miscellaneous Plant Equipment - return(inputs['N_module'] * inputs['P_egross'] * 0.038 * 1.15) + return(N_module * P_egross * 0.038 * 1.15) @staticmethod - def Account_C26(inputs): + def Account_C26(N_module, P_enet): # Heat Rejection - return(inputs['N_module'] * inputs['P_enet'] * 0.107 * 1.15 ) + return(N_module * P_enet * 0.107 * 1.15 ) @staticmethod - def Account_C27(inputs): + def Account_C27(): # Special Materials # Total elsewhere, implement later return(0) @staticmethod - def Account_C28(inputs): + def Account_C28(): # Digital Twin return(5) diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index a687a4b..04bb51e 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -8,11 +8,11 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 7,16,Plant_Reports,2000000.0,1,1,Unchanged,0.00038764649205620487,,million, 8,17,Other_Pre-Construction_Costs,1000000.0,1,1,Unchanged,0.00019382324602810244,,million, 9,19,Contingency_on_Pre-Construction_Costs,0.0,1,1,Unchanged,0.0,,million, -10,20,Capitalized_Direct_Costs_(CDC),1298175963.0,0,,Unchanged,0.2516166790643178,Account_C20,million,rollup -11,21,Structures_and_Improvements,112945794.1,1,2,Unchanged,0.021891520437683703,Account_C21,million,rollup +10,20,Capitalized_Direct_Costs_(CDC),1298175963.0,0,,Unchanged,0.2516166790643178,,million,rollup +11,21,Structures_and_Improvements,112945794.1,1,2,Unchanged,0.021891520437683703,,million,rollup 12,211,Site_Preparation/Yard_Work,42376414.42,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross 13,212,Heat_Island_Building,29536993.34,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross -14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"P_egross, application" +14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" 15,214,Heat_Exchanger_Building,5976971.885,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross 16,215,Power_Supply_and_Energy_Storage,1707706.253,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross 17,216,Reactor_Auxiliaries,853853.1265,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross @@ -27,28 +27,28 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 26,2115,Cryogenics,379490.2784,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross 27,2116,Security,142308.85439999998,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross 28,2117,Ventilation_Stack,4269265.632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross -29,22,Heat_Island_Plant_Equipment,1111998920.0,1,2,Unchanged,0.21553124025414422,Account_C22,million,rollup -30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,Account_C22_1,million,rollup +29,22,Heat_Island_Plant_Equipment,1111998920.0,1,2,Unchanged,0.21553124025414422,,million,rollup +30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,,million,rollup 31,2211,First_Wall_and_Blanket,43193434.21,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" -32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million, -33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,Account_C22_1_3,million,rollup +32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost +33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,,million,rollup 34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,"HF_magnet_number, HF_magnet_cost" 35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,"LF_magnet_number, LF_magnet_cost" 36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,"CF_magnet_number, CF_magnet_cost" -37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,Account_C22_1_4,million,rollup +37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,,million,rollup 38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, cost_factor" 39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, cost_factor" 40,22143,ECH,80000000.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, cost_factor" 41,2215,Primary_Structure_and_Support,0.0,3,221,Unchanged,0.0,Account_C22_1_5,million, -42,2216,Vacuum_System,2031827.2570000002,3,221,Unchanged,0.00039381535432011556,Account_C22_1_6,million,rollup +42,2216,Vacuum_System,2031827.2570000002,3,221,Unchanged,0.00039381535432011556,,million,rollup 43,22162,Vessel_Refrigerators,0.0,4,2216,Unchanged,0.0,Account_C22_1_6_2,million, -44,22163,Primary_Vacuum_Pumps,1689827.257,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,"cost_pump, no_vpumps" +44,22163,Primary_Vacuum_Pumps,1689827.257,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,"no_vpumps, cost_pump" 45,22164,Backing_Vacuum_Pumps,342000.0,4,2216,Unchanged,6.628755014161104e-05,Account_C22_1_6_4,million, 46,2217,Power_Supplies,0.0,3,221,Unchanged,0.0,Account_C22_1_7,million, 47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, 48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, cost_factor" 49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, cost_factor" -50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,rollup +50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,,million,rollup 51,223,Auxiliary_Cooling_Systems,352198.2635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" 52,224,Radioactive_Waste_Treatment,627553.2695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th 53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,cost_factor @@ -60,7 +60,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 59,26,Heat_Rejection,11679291.32,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"N_module, P_enet" 60,27,Special_Materials,0.0,1,2,Unchanged,0.0,Account_C27,million, 61,28,Digital_Twin/Simulator,5000000.0,1,2,Unchanged,0.0009691162301405122,Account_C28,million, -62,29,Contingency_on_Direct_Capital_Costs,0.0,1,2,Unchanged,0.0,Account_C29,million,rollup +62,29,Contingency_on_Direct_Capital_Costs,0.0,1,2,Unchanged,0.0,,million,rollup 63,30,Capitalized_Indirect_Service_Costs_(CISC),71591970.58,0,,Unchanged,0.013876188127364011,,million, 64,31,Field_Indirect_Costs,14318394.120000001,1,3,Unchanged,0.0027752376262480953,,million, 65,32,Construction_Supervision,35795985.29,1,3,Unchanged,0.0069380940636820055,,million, diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index ebdce3d..8b3a54f 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -7,7 +7,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 6,Account_C21,c,Account C21 Rollup,MirrorFunc,rollup,million 7,Account_C21_1,c,Account C211 Rollup,MirrorFunc,P_egross,million 8,Account_C21_2,c,Account C212 Rollup,MirrorFunc,P_egross,million -9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,"P_egross, application",million +9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,"application, P_egross",million 10,Account_C21_4,c,Account C214 Rollup,MirrorFunc,P_egross,million 11,Account_C21_5,c,Account C215 Rollup,MirrorFunc,P_egross,million 12,Account_C21_6,c,Account C216 Rollup,MirrorFunc,P_egross,million @@ -25,7 +25,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 24,Account_C22,c,Account C22 Rollup,MirrorFunc,rollup,million 25,Account_C22_1,c,Account C221 Rollup,MirrorFunc,rollup,million 26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"L_CC, L_EP",million -27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,reference value,million +27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,HF_magnet_shield_cost,million 28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,rollup,million 29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,"HF_magnet_number, HF_magnet_cost",million 30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,"LF_magnet_number, LF_magnet_cost",million @@ -37,7 +37,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 36,Account_C22_1_5,c,Account C2215 Rollup,MirrorFunc,reference value,million 37,Account_C22_1_6,c,Account C2216 Rollup,MirrorFunc,rollup,million 38,Account_C22_1_6_2,c,Account C22162 Rollup,MirrorFunc,reference value,million -39,Account_C22_1_6_3,c,Account C22163 Rollup,MirrorFunc,"cost_pump, no_vpumps",million +39,Account_C22_1_6_3,c,Account C22163 Rollup,MirrorFunc,"no_vpumps, cost_pump",million 40,Account_C22_1_6_4,c,Account C22164 Rollup,MirrorFunc,reference value,million 41,Account_C22_1_7,c,Account C2217 Rollup,MirrorFunc,reference value,million 42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,reference value,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index e3a9d7b..17606f7 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -196,4 +196,5 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 195,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 196,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 197,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 -198,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 +198,HF_magnet_shield_cost,HF magnet shield cost per end plug,47.36847787,million,,,,0 +199,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 From 78209ea6fa892f8fa2b7475a1507122756b0dcd9 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Fri, 31 Jul 2026 23:12:52 -0500 Subject: [PATCH 11/23] Remove Mirror rollup account algorithms --- src/Algorithm/MirrorFunc.py | 139 +----------------- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 35 ++--- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 32 +++- test/test_mirror_model.py | 15 +- tutorial/accert/ref_tables/MirrorFunc.py | 139 +----------------- tutorial/accert/ref_tables/mirror_account.csv | 20 +-- .../accert/ref_tables/mirror_algorithm.csv | 15 -- 9 files changed, 65 insertions(+), 332 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index 8be7a1b..32832cd 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -183,42 +183,7 @@ def cal_f_refrac(Q_eng): def cal_CF_magnet_number(L_CC, L_CF): return L_CC / L_CF - ### Account Methods: ### - @staticmethod - def Account_C20(inputs): - return( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs) + - MirrorFunc.Account_C29(inputs) - ) - - @staticmethod - def Account_C21(inputs): - return( - MirrorFunc.Account_C21_1(inputs) + - MirrorFunc.Account_C21_2(inputs) + - MirrorFunc.Account_C21_3(inputs) + - MirrorFunc.Account_C21_4(inputs) + - MirrorFunc.Account_C21_5(inputs) + - MirrorFunc.Account_C21_6(inputs) + - MirrorFunc.Account_C21_7(inputs) + - MirrorFunc.Account_C21_8(inputs) + - MirrorFunc.Account_C21_9(inputs) + - MirrorFunc.Account_C21_10(inputs) + - MirrorFunc.Account_C21_11(inputs) + - MirrorFunc.Account_C21_12(inputs) + - MirrorFunc.Account_C21_13(inputs) + - MirrorFunc.Account_C21_14(inputs) + - MirrorFunc.Account_C21_15(inputs) + - MirrorFunc.Account_C21_16(inputs) + - MirrorFunc.Account_C21_17(inputs) - ) + ### Account Methods: ### @staticmethod def Account_C21_1(P_egross): @@ -322,38 +287,6 @@ def Account_C21_17(P_egross): return(27.0/1e3 * P_egross) - @staticmethod - def Account_C22(inputs): - # Rollup - return( - MirrorFunc.Account_C22_1(inputs) + - MirrorFunc.Account_C22_2(inputs) + - MirrorFunc.Account_C22_3(inputs) + - MirrorFunc.Account_C22_4(inputs) + - MirrorFunc.Account_C22_5(inputs) + - MirrorFunc.Account_C22_6(inputs) + - MirrorFunc.Account_C22_7(inputs) - ) - - - @staticmethod - def Account_C22_1(inputs): - # This is a special case and is NOT calculated using Woodruff's model, - # However, I maintained the naming convention for convenience - # Rollup - return( - MirrorFunc.Account_C22_1_1(inputs) + - MirrorFunc.Account_C22_1_2(inputs) + - MirrorFunc.Account_C22_1_3(inputs) + - MirrorFunc.Account_C22_1_4(inputs) + - MirrorFunc.Account_C22_1_5(inputs) + - MirrorFunc.Account_C22_1_6(inputs) + - MirrorFunc.Account_C22_1_7(inputs) + - MirrorFunc.Account_C22_1_8(inputs) + - MirrorFunc.Account_C22_1_9(inputs) + - MirrorFunc.Account_C22_1_11(inputs) - ) - @staticmethod def Account_C22_1_1(inputs): # First Wall and Blanket (and vacuum vessel) @@ -380,16 +313,6 @@ def Account_C22_1_2(HF_magnet_shield_cost): # Factor of two for each end plug return(2 * HF_magnet_shield_cost) - @staticmethod - def Account_C22_1_3(inputs): - # Coils - # Rollup - return( - MirrorFunc.Account_C22_1_3_1(inputs['HF_magnet_number'], inputs['HF_magnet_cost']) + - MirrorFunc.Account_C22_1_3_2(inputs['LF_magnet_number'], inputs['LF_magnet_cost']) + - MirrorFunc.Account_C22_1_3_3(inputs['CF_magnet_number'], inputs['CF_magnet_cost']) - ) - @staticmethod def Account_C22_1_3_1(HF_magnet_number, HF_magnet_cost): # HF Coils - Quantity 4 @@ -410,16 +333,6 @@ def Account_C22_1_3_3(CF_magnet_number, CF_magnet_cost): # One coil every L_CF m of Central Cell return(CF_magnet_number * CF_magnet_cost) - @staticmethod - def Account_C22_1_4(inputs): - # Supplemenatry Heating - # Rollup - return( - MirrorFunc.Account_C22_1_4_1(inputs) + - MirrorFunc.Account_C22_1_4_2(inputs) + - MirrorFunc.Account_C22_1_4_3(inputs) - ) - @staticmethod def Account_C22_1_4_1(P_NBI, cost_factor): # NBI @@ -440,24 +353,6 @@ def Account_C22_1_5(): # Primary Structure and Support return(0) - @staticmethod - def Account_C22_1_6(inputs): - # Vacuum Systems - # Rollup - return( - # Account_C22_1_6_1(inputs) + - MirrorFunc.Account_C22_1_6_2(inputs) + - MirrorFunc.Account_C22_1_6_3(inputs) + - MirrorFunc.Account_C22_1_6_4(inputs) - ) - - - # def Account_C22_1_6_1(inputs): - # Vacuum Vessel - # Tracked in radial builds and folded into blanket - # return(0) - - @staticmethod def Account_C22_1_6_2(): # Helium Liquefier-Refrigerators (not for magnets) @@ -531,15 +426,6 @@ def Account_C22_1_11(L, N_module, construction_time, cost_factor): return(C220111 * cost_factor) - @staticmethod - def Account_C22_2(inputs): - # Main and Secondary Coolant - return( - MirrorFunc.Account_C22_2_1(inputs) + - MirrorFunc.Account_C22_2_2(inputs) + - MirrorFunc.Account_C22_2_3(inputs) - ) - @staticmethod def Account_C22_2_1(N_module, P_egross): # Primary Coolant @@ -634,29 +520,6 @@ def Account_C28(): # Digital Twin return(5) - @staticmethod - def Account_C29(inputs): - # Contingency on Direct Capital Costs - - # I may have to change the way that I do sums as this must be done separately? - # C21 = sum(C21.1 + C21.2 + ...) - - # Rollup - - if not(inputs['NOAK']) and inputs['include_contingency']: - return(0.1 * ( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs))) - else: - return(0) - - ### Other Methods: ### @staticmethod def PbLi_density(f_6Li=0.075, T=300): diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index a07c675c72996c507234fa8438c40805f267637e..c814c28cbebe508ab4530521a8e8887b247b5f4a 100644 GIT binary patch delta 1506 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 str: return "" +def _mirror_parent_code_for_table(code_of_account: str, level: int, codes: set[str]) -> str: + parent = _mirror_parent_code(code_of_account, level) + if parent == "2" and "20" in codes: + return "20" + return parent + + def _dollar_value(value: str | float | int | None) -> float | None: if value in (None, ""): return None @@ -480,12 +487,22 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: ORDER BY ind """ ).fetchall() + codes = { + _mirror_code(raw_code) + for _ind, raw_code, _description, _total_cost, _level, _prn, _fun_unit in rows + } + rollup_codes = { + _mirror_parent_code_for_table(raw_code, int(level or 0), codes) + for _ind, raw_code, _description, _total_cost, level, _prn, _fun_unit in rows + if _mirror_parent_code_for_table(raw_code, int(level or 0), codes) + } for ind, raw_code, description, total_cost, level, prn, fun_unit in rows: code = _mirror_code(raw_code) alg_name = _mirror_method_name(raw_code) input_keys, account_calls = dependencies.get(alg_name, ([], [])) - variables = _account_variables(input_keys, account_calls) - if account_calls or alg_name not in methods: + is_rollup = code in rollup_codes + variables = "rollup" if is_rollup else _account_variables(input_keys, account_calls) + if is_rollup or account_calls or alg_name not in methods: alg_name = "" conn.execute( """ @@ -500,7 +517,7 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: description, _dollar_value(total_cost), level, - _mirror_parent_code(raw_code, int(level or 0)), + _mirror_parent_code_for_table(raw_code, int(level or 0), codes), "Unchanged", prn, alg_name, @@ -654,7 +671,16 @@ def _write_default_inputs_csv(algorithm_source: Path, path: Path) -> int: def _normalize_mirror_algorithm_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: dependencies = _account_method_dependencies(algorithm_source) + used_account_algorithms = { + row[0] + for row in conn.execute("SELECT DISTINCT alg_name FROM mirror_acco WHERE COALESCE(alg_name, '') != ''") + } + for (alg_name,) in conn.execute("SELECT alg_name FROM mirror_alg WHERE alg_for = 'c'").fetchall(): + if alg_name not in used_account_algorithms: + conn.execute("DELETE FROM mirror_alg WHERE alg_name = ?", (alg_name,)) for alg_name, (input_keys, account_calls) in dependencies.items(): + if alg_name not in used_account_algorithms: + continue variables = _account_variables(input_keys, account_calls) conn.execute( "UPDATE mirror_alg SET alg_formulation = ?, alg_units = 'million' WHERE alg_name = ?", diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 4fa0b31..b1048c2 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -132,16 +132,27 @@ def test_mirror_parent_accounts_are_rollups_without_algorithms(cursor): WHERE code_of_account IN (?, ?, ?, ?, ?) ORDER BY code_of_account; """, - ("21", "22", "221", "2213", "29"), + ("20", "21", "22", "221", "2213"), ) assert cursor.fetchall() == [ + ("20", "", "rollup"), ("21", "", "rollup"), ("22", "", "rollup"), ("221", "", "rollup"), ("2213", "", "rollup"), - ("29", "", "rollup"), ] + cursor.execute( + """ + SELECT code_of_account, supaccount + FROM mirror_acco + WHERE code_of_account IN (?, ?, ?) + ORDER BY code_of_account; + """, + ("21", "22", "29"), + ) + assert cursor.fetchall() == [("21", "20"), ("22", "20"), ("29", "20")] + def test_mirror_variable_links_are_reversed_from_var_need(cursor): cursor.execute( diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index 8be7a1b..32832cd 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -183,42 +183,7 @@ def cal_f_refrac(Q_eng): def cal_CF_magnet_number(L_CC, L_CF): return L_CC / L_CF - ### Account Methods: ### - @staticmethod - def Account_C20(inputs): - return( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs) + - MirrorFunc.Account_C29(inputs) - ) - - @staticmethod - def Account_C21(inputs): - return( - MirrorFunc.Account_C21_1(inputs) + - MirrorFunc.Account_C21_2(inputs) + - MirrorFunc.Account_C21_3(inputs) + - MirrorFunc.Account_C21_4(inputs) + - MirrorFunc.Account_C21_5(inputs) + - MirrorFunc.Account_C21_6(inputs) + - MirrorFunc.Account_C21_7(inputs) + - MirrorFunc.Account_C21_8(inputs) + - MirrorFunc.Account_C21_9(inputs) + - MirrorFunc.Account_C21_10(inputs) + - MirrorFunc.Account_C21_11(inputs) + - MirrorFunc.Account_C21_12(inputs) + - MirrorFunc.Account_C21_13(inputs) + - MirrorFunc.Account_C21_14(inputs) + - MirrorFunc.Account_C21_15(inputs) + - MirrorFunc.Account_C21_16(inputs) + - MirrorFunc.Account_C21_17(inputs) - ) + ### Account Methods: ### @staticmethod def Account_C21_1(P_egross): @@ -322,38 +287,6 @@ def Account_C21_17(P_egross): return(27.0/1e3 * P_egross) - @staticmethod - def Account_C22(inputs): - # Rollup - return( - MirrorFunc.Account_C22_1(inputs) + - MirrorFunc.Account_C22_2(inputs) + - MirrorFunc.Account_C22_3(inputs) + - MirrorFunc.Account_C22_4(inputs) + - MirrorFunc.Account_C22_5(inputs) + - MirrorFunc.Account_C22_6(inputs) + - MirrorFunc.Account_C22_7(inputs) - ) - - - @staticmethod - def Account_C22_1(inputs): - # This is a special case and is NOT calculated using Woodruff's model, - # However, I maintained the naming convention for convenience - # Rollup - return( - MirrorFunc.Account_C22_1_1(inputs) + - MirrorFunc.Account_C22_1_2(inputs) + - MirrorFunc.Account_C22_1_3(inputs) + - MirrorFunc.Account_C22_1_4(inputs) + - MirrorFunc.Account_C22_1_5(inputs) + - MirrorFunc.Account_C22_1_6(inputs) + - MirrorFunc.Account_C22_1_7(inputs) + - MirrorFunc.Account_C22_1_8(inputs) + - MirrorFunc.Account_C22_1_9(inputs) + - MirrorFunc.Account_C22_1_11(inputs) - ) - @staticmethod def Account_C22_1_1(inputs): # First Wall and Blanket (and vacuum vessel) @@ -380,16 +313,6 @@ def Account_C22_1_2(HF_magnet_shield_cost): # Factor of two for each end plug return(2 * HF_magnet_shield_cost) - @staticmethod - def Account_C22_1_3(inputs): - # Coils - # Rollup - return( - MirrorFunc.Account_C22_1_3_1(inputs['HF_magnet_number'], inputs['HF_magnet_cost']) + - MirrorFunc.Account_C22_1_3_2(inputs['LF_magnet_number'], inputs['LF_magnet_cost']) + - MirrorFunc.Account_C22_1_3_3(inputs['CF_magnet_number'], inputs['CF_magnet_cost']) - ) - @staticmethod def Account_C22_1_3_1(HF_magnet_number, HF_magnet_cost): # HF Coils - Quantity 4 @@ -410,16 +333,6 @@ def Account_C22_1_3_3(CF_magnet_number, CF_magnet_cost): # One coil every L_CF m of Central Cell return(CF_magnet_number * CF_magnet_cost) - @staticmethod - def Account_C22_1_4(inputs): - # Supplemenatry Heating - # Rollup - return( - MirrorFunc.Account_C22_1_4_1(inputs) + - MirrorFunc.Account_C22_1_4_2(inputs) + - MirrorFunc.Account_C22_1_4_3(inputs) - ) - @staticmethod def Account_C22_1_4_1(P_NBI, cost_factor): # NBI @@ -440,24 +353,6 @@ def Account_C22_1_5(): # Primary Structure and Support return(0) - @staticmethod - def Account_C22_1_6(inputs): - # Vacuum Systems - # Rollup - return( - # Account_C22_1_6_1(inputs) + - MirrorFunc.Account_C22_1_6_2(inputs) + - MirrorFunc.Account_C22_1_6_3(inputs) + - MirrorFunc.Account_C22_1_6_4(inputs) - ) - - - # def Account_C22_1_6_1(inputs): - # Vacuum Vessel - # Tracked in radial builds and folded into blanket - # return(0) - - @staticmethod def Account_C22_1_6_2(): # Helium Liquefier-Refrigerators (not for magnets) @@ -531,15 +426,6 @@ def Account_C22_1_11(L, N_module, construction_time, cost_factor): return(C220111 * cost_factor) - @staticmethod - def Account_C22_2(inputs): - # Main and Secondary Coolant - return( - MirrorFunc.Account_C22_2_1(inputs) + - MirrorFunc.Account_C22_2_2(inputs) + - MirrorFunc.Account_C22_2_3(inputs) - ) - @staticmethod def Account_C22_2_1(N_module, P_egross): # Primary Coolant @@ -634,29 +520,6 @@ def Account_C28(): # Digital Twin return(5) - @staticmethod - def Account_C29(inputs): - # Contingency on Direct Capital Costs - - # I may have to change the way that I do sums as this must be done separately? - # C21 = sum(C21.1 + C21.2 + ...) - - # Rollup - - if not(inputs['NOAK']) and inputs['include_contingency']: - return(0.1 * ( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs))) - else: - return(0) - - ### Other Methods: ### @staticmethod def PbLi_density(f_6Li=0.075, T=300): diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index 04bb51e..d55521d 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -9,7 +9,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 8,17,Other_Pre-Construction_Costs,1000000.0,1,1,Unchanged,0.00019382324602810244,,million, 9,19,Contingency_on_Pre-Construction_Costs,0.0,1,1,Unchanged,0.0,,million, 10,20,Capitalized_Direct_Costs_(CDC),1298175963.0,0,,Unchanged,0.2516166790643178,,million,rollup -11,21,Structures_and_Improvements,112945794.1,1,2,Unchanged,0.021891520437683703,,million,rollup +11,21,Structures_and_Improvements,112945794.1,1,20,Unchanged,0.021891520437683703,,million,rollup 12,211,Site_Preparation/Yard_Work,42376414.42,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross 13,212,Heat_Island_Building,29536993.34,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross 14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" @@ -27,7 +27,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 26,2115,Cryogenics,379490.2784,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross 27,2116,Security,142308.85439999998,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross 28,2117,Ventilation_Stack,4269265.632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross -29,22,Heat_Island_Plant_Equipment,1111998920.0,1,2,Unchanged,0.21553124025414422,,million,rollup +29,22,Heat_Island_Plant_Equipment,1111998920.0,1,20,Unchanged,0.21553124025414422,,million,rollup 30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,,million,rollup 31,2211,First_Wall_and_Blanket,43193434.21,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" 32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost @@ -48,19 +48,19 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, 48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, cost_factor" 49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, cost_factor" -50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,,million,rollup +50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,,million, 51,223,Auxiliary_Cooling_Systems,352198.2635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" 52,224,Radioactive_Waste_Treatment,627553.2695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th 53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,cost_factor 54,226,Other_Heat_Island_Equipment,1748097.852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet 55,227,Instrumentation_and_Control,85000000.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, -56,23,Turbine_Plant_Equipment,39822761.09,1,2,Unchanged,0.007718576820265415,Account_C23,million,"N_module, P_egross" -57,24,Electric_Plant_Equipment,9819310.954,1,2,Unchanged,0.0019032107228635835,Account_C24,million,"N_module, P_egross" -58,25,Miscellaneous_Plant_Equipment,6909885.4860000005,1,2,Unchanged,0.0013392964345789922,Account_C25,million,"N_module, P_egross" -59,26,Heat_Rejection,11679291.32,1,2,Unchanged,0.0022637181549502415,Account_C26,million,"N_module, P_enet" -60,27,Special_Materials,0.0,1,2,Unchanged,0.0,Account_C27,million, -61,28,Digital_Twin/Simulator,5000000.0,1,2,Unchanged,0.0009691162301405122,Account_C28,million, -62,29,Contingency_on_Direct_Capital_Costs,0.0,1,2,Unchanged,0.0,,million,rollup +56,23,Turbine_Plant_Equipment,39822761.09,1,20,Unchanged,0.007718576820265415,Account_C23,million,"N_module, P_egross" +57,24,Electric_Plant_Equipment,9819310.954,1,20,Unchanged,0.0019032107228635835,Account_C24,million,"N_module, P_egross" +58,25,Miscellaneous_Plant_Equipment,6909885.4860000005,1,20,Unchanged,0.0013392964345789922,Account_C25,million,"N_module, P_egross" +59,26,Heat_Rejection,11679291.32,1,20,Unchanged,0.0022637181549502415,Account_C26,million,"N_module, P_enet" +60,27,Special_Materials,0.0,1,20,Unchanged,0.0,Account_C27,million, +61,28,Digital_Twin/Simulator,5000000.0,1,20,Unchanged,0.0009691162301405122,Account_C28,million, +62,29,Contingency_on_Direct_Capital_Costs,0.0,1,20,Unchanged,0.0,,million, 63,30,Capitalized_Indirect_Service_Costs_(CISC),71591970.58,0,,Unchanged,0.013876188127364011,,million, 64,31,Field_Indirect_Costs,14318394.120000001,1,3,Unchanged,0.0027752376262480953,,million, 65,32,Construction_Supervision,35795985.29,1,3,Unchanged,0.0069380940636820055,,million, diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index 8b3a54f..510bfd7 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -3,8 +3,6 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 2,add_account,v,Add an account to the cost_account object.,MirrorFunc,TODO,TODO 3,generate_report,v,Generate a report based on user input.,MirrorFunc,TODO,TODO 4,learning_credit,v,None,MirrorFunc,TODO,TODO -5,Account_C20,c,Account C20 Rollup,MirrorFunc,rollup,million -6,Account_C21,c,Account C21 Rollup,MirrorFunc,rollup,million 7,Account_C21_1,c,Account C211 Rollup,MirrorFunc,P_egross,million 8,Account_C21_2,c,Account C212 Rollup,MirrorFunc,P_egross,million 9,Account_C21_3,c,Account C213 Rollup,MirrorFunc,"application, P_egross",million @@ -22,20 +20,15 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 21,Account_C21_15,c,Account C2115 Rollup,MirrorFunc,P_egross,million 22,Account_C21_16,c,Account C2116 Rollup,MirrorFunc,P_egross,million 23,Account_C21_17,c,Account C2117 Rollup,MirrorFunc,P_egross,million -24,Account_C22,c,Account C22 Rollup,MirrorFunc,rollup,million -25,Account_C22_1,c,Account C221 Rollup,MirrorFunc,rollup,million 26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"L_CC, L_EP",million 27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,HF_magnet_shield_cost,million -28,Account_C22_1_3,c,Account C2213 Rollup,MirrorFunc,rollup,million 29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,"HF_magnet_number, HF_magnet_cost",million 30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,"LF_magnet_number, LF_magnet_cost",million 31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,"CF_magnet_number, CF_magnet_cost",million -32,Account_C22_1_4,c,Account C2214 Rollup,MirrorFunc,rollup,million 33,Account_C22_1_4_1,c,Account C22141 Rollup,MirrorFunc,"P_NBI, cost_factor",million 34,Account_C22_1_4_2,c,Account C22142 Rollup,MirrorFunc,"P_ICRH, cost_factor",million 35,Account_C22_1_4_3,c,Account C22143 Rollup,MirrorFunc,"P_ECH, cost_factor",million 36,Account_C22_1_5,c,Account C2215 Rollup,MirrorFunc,reference value,million -37,Account_C22_1_6,c,Account C2216 Rollup,MirrorFunc,rollup,million 38,Account_C22_1_6_2,c,Account C22162 Rollup,MirrorFunc,reference value,million 39,Account_C22_1_6_3,c,Account C22163 Rollup,MirrorFunc,"no_vpumps, cost_pump",million 40,Account_C22_1_6_4,c,Account C22164 Rollup,MirrorFunc,reference value,million @@ -43,10 +36,6 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,reference value,million 43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,"P_DECe, cost_factor",million 44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"L, N_module, construction_time, cost_factor",million -45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,rollup,million -46,Account_C22_2_1,c,Account C2221 Rollup,MirrorFunc,"N_module, P_egross",million -47,Account_C22_2_2,c,Account C2222 Rollup,MirrorFunc,P_th,million -48,Account_C22_2_3,c,Account C2223 Rollup,MirrorFunc,reference value,million 49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,"N_module, P_th",million 50,Account_C22_4,c,Account C224 Rollup,MirrorFunc,P_th,million 51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,cost_factor,million @@ -58,10 +47,6 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 57,Account_C26,c,Account C26 Rollup,MirrorFunc,"N_module, P_enet",million 58,Account_C27,c,Account C27 Rollup,MirrorFunc,reference value,million 59,Account_C28,c,Account C28 Rollup,MirrorFunc,reference value,million -60,Account_C29,c,Account C29 Rollup,MirrorFunc,rollup,million -61,Account_OCC,c,Account OCC Rollup,MirrorFunc,TODO,million -62,Account_TCC,c,Account TCC Rollup,MirrorFunc,TODO,million -63,Account_C90,c,Account C90 Rollup,MirrorFunc,TODO,million 64,PbLi_density,v,"Returns PbLi density (kg/m^3). Assumes the PbLi is a eutectic, which has",MirrorFunc,TODO,TODO 65,Li_price,v,Return Li price (USD/kg) for enrichment levels above 90% 6Li,MirrorFunc,TODO,TODO 66,PbLi_price,v,None,MirrorFunc,TODO,TODO From c525a46dfcb2f70511c134f443f19f723b9d5ceb Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sat, 1 Aug 2026 12:42:22 -0500 Subject: [PATCH 12/23] Prune unused Mirror variable algorithms --- src/Algorithm/MirrorFunc.py | 6 +- src/accertdb.sqlite | Bin 1101824 -> 1101824 bytes src/accertdb_sqlite_schema_data.sql | 167 ++++++++---------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 20 +++ test/test_mirror_model.py | 29 +++ tutorial/accert/ref_tables/MirrorFunc.py | 6 +- .../accert/ref_tables/mirror_algorithm.csv | 21 --- .../accert/ref_tables/mirror_variable.csv | 146 +++++++-------- 9 files changed, 202 insertions(+), 195 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index 32832cd..aad0a37 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -634,9 +634,9 @@ def V_inverse_triangular_washer(z, r_in, r_out): Return volume of cylindrical inverse triangular washer. From the ASCII art below you can see how this is used for magnet shielding. - ^ z - | - | z + ^ z + | + | z |\ | /| | \ | / | | \ | / | diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index c814c28cbebe508ab4530521a8e8887b247b5f4a..3fd5c4b77f877499bc555d8b3bc51018cd7eb8bb 100644 GIT binary patch delta 3701 zcmai14{%h)8Q*DyYJmgHcXxA z+j(!^`~7ym{l0I%@7sODr<#XPH6ITY90CBk003XITV(gQ#^y!fp=@j<21jDTNK71w zp^=z05|c+_%1BIoA*P*ONYE$J`{Kjsd9WI$%r+Jcq66hw7riZ{RY8UB3~66LH|-B= z4U)!Y`0)9H(0dRasL48VFGsYw5IX6Vdaa6nKcW?&?9Qx4s~fb>#QH2Y@%lq0jT*Z# zyB+LyvfIUOcdn#S|K#LYo1zI!*Dsi4XO4WJPw3BF)QMAKn4tfYJ)!#Cz$5yJicrD@ z9bN2OsKHnQtDlg_<|p=%rdsD%zTrEsYZG{?>1XqeY2K+)zefIwTrIGhea2ue=^zm# z=x6CSbut6730qDSgqA5TTm@!GzoI%JOJv+)w%i&*-qnx}KqYfhuEkHzBIakv`hPJ# zq09KHsV>&9=~tQP%en^TY$Zdajx!+w$q;-Qbbxby_%HaD@R5E(-=`<^#d=UUFFY@t z)UIe3-4pIt-PE0QH@XAhoDdLy32)I(YFTZA7ScTGKh)o-XH=@*r{1MDDK{yl^6%xJ zOB2%D(i!Qbv`;dm<>(XiYjhT!Mn_Qwb)gnCPwW!wMW67wFmj9dtT-yw$fI&nBJvtx zKyHv{sH$?_RjTZF{mJ#D<9^5MjtFzxk6o*92=_BG znYhUmV+>1e1}D=4yED5?xJ<)vjty(cbaziW)6;FF<9$8W6rwdneqyoJNSh#Cw44kT zN={HX%>edFFGopLsdov6L0jOG!R`G_*;|v=u!1N_43*r7VZf$uY_6*dHH1PY%VKy6 zZ_MM37T&<|hCJS2;q@G^&*SwL9^rT-k4G%L&cc^kF09KFbruok1HyScY~n>B4869Z zp;V?nzQaUmO$(V>CKmzZUC!-X-fJY8-v$R*7kVK|{LO&{7*^Y(7v!ZjhE{j9t~Z4Q z=5um>o^0UcJe#DaT1e5xz+B#UZoY4X_pRk*ZJw;-WDO^4@??05qzhZgtVa17!1*;S zUcsYdMcdSxd0KhgwYC}dLVjqFa+-;fO}>&j+<9}%Il^JfdDOpxR3K#|m@yXhmj|mc ztg)R@-E7p=8DS$FHg0B4vwXT|1t~|$_rM&M>s9onEo45@dO`VEG(Z)D3~0eBdpvz= z1t}Q{&g9}|a&e8exL_rxD>>aTNmp>Xg46YrbUCNXIUSj#XJ9#R3%$6Kl(YteynB#$ z58K@XWqb|FIGwksBMNH)STcHIh|Xr#(9>Db8DszWBCuPsYgf z+i#{E78;H-AUGB+rT^|COX&+;q&0W*-9&)J&KgjBefFCLps$^55%uqa6Yb;*J>5nY zQhz(yKo@Nx!?Q{~Tp3TMKNC+GW_>c}2^V76ZaL!I8d9sxE5LB2_32(qsvr~1B=dZi`;5kXtTUoe;$>FqGg@r9g^0tb&*-pWHedq_;R3h~zC(n1_Yv_B zd`CFq$U55f!;W(N8NP&nf=}aPcqhJ7JFh*b9nf}Y?OKBt(4cx*eM_xVixSL#;T;r|;+eaHAeR?zLqINpWIb7eq=TTExv7$VxtT13fWGz^xrx5sPR`-VESi+_4JKzOm=&=wxkG`6I*pzI zBQuzcr?;i7Eh?B5rtt?XetM+)vJeZC8xqJ48vVO7OonNdHw&iOJ3Ppe)@J4ovE=Y7 zENE!$9i+-5z4E_ye0q#5Kx#XfIToEk{g06)LuLEJ2REtrXV;(Wu5o2zBTS&UB*OZV)VI+F#B zwS4=q%AsM-Z}jd?S!w6p!Ut{{+?}2}mpNYis`C5VCh|2i@7&#A#llh2M1ORQJw}hR z$8j^`)*mH{=*Gv$&GZ)x%e5aN5F)+F-idGNV(g+(k}(hNx3hFzL*H&AE9nnM$$|m~ znZFTGzs8>6Kl(LRO+M1uABPBC3!aG)a^@5}mfsBnU^W;B_*Hxqcj9^4r`k`oVQrn} zQ{Pv=qxOPv)vsJqsB*UwkbfsXA#aj>(i;+$+9e128QKpfz$>T&J`UH3DG>=@7gp*A z;k)LH=0%SlChVYf-SF?5`(oFONG+XQt y4!{@TD)90DZ*1ZtxsQ*NTG6ipF)fG<5LSt7xw#D^Xf<=6_3$HS346F5-7 zfwV@pAjp!H*vVM3EuB5-G@4dP+sU+@q_x?JEjKf59lOcI>BODH)5?vfnc7Ly)SZbv zZk)*d_ZGkbBxQR_=>Y7%-~Zgb-GBc*eE(Q*Per;JoIW?OdtrLVd=) z{CFGJfIO~Zz(!Z*bcQj1-Ol~bM4L;3-+&&?)@#xo`YTz!)4Le@=LQ zPaIpuKN8*(u8Y{?`2c9h`>lm92~RIvQ38lR1#M?NALw;VUUTCIw(wPaAMfT{eTRMb z`S$s?`&`0rgrD<&&cDK6zcz*Umhf@@JpWVvKK?!7N5V_QqY2jB%;En`Z(??#!G0+w z&+4inCFe9X8j+NE(m1k?sYl^_4grum^s3mV0 zGqp%jbt54I0jP)9GtDSnNU?B-2>WzOBW4t!hc+@DNRC9LnS`tuT3iPyQTdFT7%XM# ztPWjWqLhJhrVS|xRW?*9AxAVoTJrkKmS}`YX!=6RNY3vNwSgy&65>M%d z)5lbD64dpF~kT&ryajd>$B>e6*-Riv!u{iLyv3;<28rl z*TS2^9}7#(m9jr)|Bn4S`xHCJ zcC#+;_q>mLN4(hcW6yQZl4q}Hv-`Na+0D8B-F3@lx=yxx`_Y#B(VqL!k^9kE-$`Y)fvir-*J;b@Y#AEwI~Ek9MqHk+@1W2$!FEt=hmGwh z!nWID+bOi&hPD?$+iYkXg|^wywjyXNfu;ijv7nV=TWxG>5jJFt4N+*whK35ERV_R! zhj`Y2)E3KC0*un7ASmh!Vl&7p_gcf)95p}e#h*)WZ{krcFjWCl6O~V+MR+xRCMuJ4 zaeJeUYNRL{r(#slMg=K~hNu|TV51sT3ZvmEhV8UrJ1L3=rWjRkqv|P&#-s>kzSoDh zr!&2EK5N2Vm<4C+2s#v^!IWBCrH~YY|1I!Jz^t+fE849q+HEV^?JL?H`Su{y(3vOD z_O2D}-7DIAR{ni6C7_lkgfO z%-sXHD&19Mi>R?h5Q{!tMAtT(d7I5l-1`j7)xhi`)|;6@yrJ%st?d%Cs>~ao0bG>> z|Ltc0Z_R<<0&x0M%&5$QA>x&`$Dz;UaqSj5QLBM@i_J`fMbn008b;=x3Lb?ZFcpBS zSZxmpt^AOdl(adjvy_STY5(@7IWhItPX`*a(_Lx)I5a2C8L%6unT^*lo3_EmoTkj{Y7!QT!ucl|T1+J*NTX)7 zDEy3QNh^bdyg`HM2e~a|EA@5er1-lfT@w({v@8iU=yqEZusi>hrgy7gv zV1_QGAmI&)@f4UVErPddw6Gr%(WtDbF*qzhP9!gayNj}tO2wpEc|i(?^UW-)?RFMM z=|^pueH@SKU^+-J${eKqAX$w_x*SuRd{~7dxiTG?rCnG zJIpn4CG4-*TkHjPfZgo<$a~xSviF8J?UlR-y_H^v=VzYFp8Gu^PpSJ`?urq&==#9* zhAZLnGfy$Qod4^5#rY*?3%Y~8Zwe!LkNHIj514}^__+D~!+7%gIDXlzJ&yOMTQXkW zxgG|j4+7x09Fvnt5|#1=V z`>X1+#vJiBXJAlFfRpr-&@;}g8nWRzE?8=E*sOOekJFzdebN#Sf{6xL1>jdz2JudE zHX?hkBatvoz^whW@iwNEC&JL?G*AVNkA4;70D`8M-~sn;%Tz>gG?k&vqCLS}s3{_o8%z zPS?IJP^w#REKwPjR2?cj)*uwrX!gYDPCN$SSRO+dMr?-s1`SL5VtyOj6SY~Rd2})j zyf6cE%GTy>oTt3xm7LF`iCUe^5->0YJ6C>F5+CGI4a`20SUgx@0%4$=ObrwRFJ^jtjknLh78kda&f7NFFg?7x)ac%(SncR|Ru~TDn z6|Z$FkJ3V!lgzh(Iu3OJ6bw~HC^OLC9N4?#!^}pyj@446g8}}{u zk~`#j*LBl%#x?5Nj@p=iWA-`Ua66;Ua)$98~_{3Z7U#_Y8iQF(mFL#}jxmNaf?5pfGc9z}X{SWU8-p9OU zotPaomXE+ONCLg*2@Y+g`y zUmS-5=wLr2?^-k|&Otg01yY?9q(zDnmtZ-8`s<0t7wHOn)TA&v8K@+!)S4_|8Dq^9Dc-hiLA4$@w6B`Hq4@sFa|Lg zUVYMA?30x_F-M0}V>BviNl5G>s+d|3<1=fx7(C3PTFb@5g{REB=?@)ZQL_aB5_fyRbD5u&B;r8z5}?YmK|W+xl75 zX2JW{Se;ierE@j@cpnEf{!AG-)VJcCw|Go7QVA%^!>Lg*$idQ(;mSdu72(jBEli0s z@dN-2RhiS{jVfT`F-?J)Do4*Gwd5MrdcBuLVIh4M6!w0?bxTe;WSXg%3ZpI349U8A z0p->$jcDJ}i1e0b4TZX&I}4~wd;X!qEcKP!Tq zi?Q6zp-Lg+1{1ooD|uSY=^fTY>*7ef=fv^e=K0xrE2OFpj?R&zETq|sDy#tVbR3p| zJuS5&Yyhk6Ien0WnV+cy9R~| Date: Sat, 1 Aug 2026 13:26:29 -0500 Subject: [PATCH 13/23] Use PyFECONS scalar defaults for Mirror reactor equipment --- src/Algorithm/MirrorFunc.py | 39 +++--- src/accertdb.sqlite | Bin 1101824 -> 1105920 bytes src/accertdb_sqlite_schema_data.sql | 80 ++++++++++++- src/etc/accert.sch | 4 +- src/scripts/build_mirror_accert_tables.py | 113 +++++++++++++++++- test/test_mirror_model.py | 64 ++++++++++ tutorial/accert/ref_tables/MirrorFunc.py | 39 +++--- tutorial/accert/ref_tables/mirror_account.csv | 2 +- .../accert/ref_tables/mirror_algorithm.csv | 6 +- .../accert/ref_tables/mirror_variable.csv | 72 ++++++++++- 10 files changed, 376 insertions(+), 43 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index aad0a37..6030363 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -182,6 +182,26 @@ def cal_f_refrac(Q_eng): @staticmethod def cal_CF_magnet_number(L_CC, L_CF): return L_CC / L_CF + + @staticmethod + def cal_firstwall_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t): + firstwall_ir = axis_t + plasma_t + vacuum_t + firstwall_or = firstwall_ir + firstwall_t + return np.pi * chamber_length * (firstwall_or**2 - firstwall_ir**2) + + @staticmethod + def cal_blanket1_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t): + blanket_ir = axis_t + plasma_t + vacuum_t + firstwall_t + blanket_or = blanket_ir + blanket1_t + return np.pi * chamber_length * (blanket_or**2 - blanket_ir**2) + + @staticmethod + def cal_first_wall_cost(firstwall_vol, Be_rho, Be_c_raw, Be_m): + return firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6 + + @staticmethod + def cal_blanket_cost(blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m): + return blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6 ### Account Methods: ### @@ -288,24 +308,9 @@ def Account_C21_17(P_egross): @staticmethod - def Account_C22_1_1(inputs): + def Account_C22_1_1(first_wall_cost, blanket_cost): # First Wall and Blanket (and vacuum vessel) - - L_magnet_to_magnet = inputs['L_EP'] - - L_cylinder = L_magnet_to_magnet - - expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) - - end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) - end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() - - central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['L_CC']) - central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() - - total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result - - return(total_cost/1e6) + return first_wall_cost + blanket_cost @staticmethod def Account_C22_1_2(HF_magnet_shield_cost): diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 3fd5c4b77f877499bc555d8b3bc51018cd7eb8bb..f9c561becc3997b0ded85ce1eb6044eb0ff58b85 100644 GIT binary patch delta 10879 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 i%1B=!y||YQQC2;* None: dependencies = _account_method_dependencies(algorithm_source) + input_defaults = _generate_inputs_defaults(algorithm_source) + generated_values = _mirror_generated_var_values(input_defaults) methods = set(dependencies) conn.execute("ALTER TABLE mirror_acco RENAME TO mirror_acco_raw") conn.execute( @@ -504,6 +610,11 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: variables = "rollup" if is_rollup else _account_variables(input_keys, account_calls) if is_rollup or account_calls or alg_name not in methods: alg_name = "" + normalized_total_cost = _dollar_value(total_cost) + if code == "2211": + normalized_total_cost = ( + generated_values["first_wall_cost"] + generated_values["blanket_cost"] + ) * 1e6 conn.execute( """ INSERT INTO mirror_acco @@ -515,7 +626,7 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: ind, code, description, - _dollar_value(total_cost), + normalized_total_cost, level, _mirror_parent_code_for_table(raw_code, int(level or 0), codes), "Unchanged", diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 48298bb..02b7ac4 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -504,6 +504,70 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): assert alg.run({"HF_magnet_number": 4.0, "HF_magnet_cost": 29.1}) == pytest.approx(116.4) +def test_mirror_first_wall_and_blanket_use_pyfecons_scalar_defaults(cursor): + cursor.execute( + """ + SELECT total_cost, alg_name, variables + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("2211",), + ) + total_cost, alg_name, variables = cursor.fetchone() + assert total_cost / 1e6 == pytest.approx(1217.1218954107624) + assert alg_name == "Account_C22_1_1" + assert variables == "first_wall_cost, blanket_cost" + + cursor.execute( + """ + SELECT var_name, var_value, var_unit, var_alg, var_need + FROM mirror_var + WHERE var_name IN (?, ?, ?, ?) + ORDER BY var_name; + """, + ("blanket1_vol", "blanket_cost", "first_wall_cost", "firstwall_vol"), + ) + rows = {row[0]: row[1:] for row in cursor.fetchall()} + assert rows["firstwall_vol"][0] == pytest.approx(38.07610296150822) + assert rows["firstwall_vol"][1:] == ( + "m3", + "cal_firstwall_vol", + "chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t", + ) + assert rows["blanket1_vol"][0] == pytest.approx(422.230052642468) + assert rows["blanket1_vol"][1:] == ( + "m3", + "cal_blanket1_vol", + "chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t", + ) + assert rows["first_wall_cost"][0] == pytest.approx(1215.1036357591313) + assert rows["first_wall_cost"][1:] == ( + "million", + "cal_first_wall_cost", + "firstwall_vol, Be_rho, Be_c_raw, Be_m", + ) + assert rows["blanket_cost"][0] == pytest.approx(2.018259651630997) + assert rows["blanket_cost"][1:] == ( + "million", + "cal_blanket_cost", + "blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m", + ) + + alg = MirrorFunc( + ind=1, + alg_name="Account_C22_1_1", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="first_wall_cost,blanket_cost", + constants="", + ) + assert alg.run({"first_wall_cost": 1215.1036357591313, "blanket_cost": 2.018259651630997}) == pytest.approx( + 1217.1218954107624 + ) + + def test_mirror_magnet_shield_account_uses_reference_variable(cursor): cursor.execute( """ diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index aad0a37..6030363 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -182,6 +182,26 @@ def cal_f_refrac(Q_eng): @staticmethod def cal_CF_magnet_number(L_CC, L_CF): return L_CC / L_CF + + @staticmethod + def cal_firstwall_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t): + firstwall_ir = axis_t + plasma_t + vacuum_t + firstwall_or = firstwall_ir + firstwall_t + return np.pi * chamber_length * (firstwall_or**2 - firstwall_ir**2) + + @staticmethod + def cal_blanket1_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t): + blanket_ir = axis_t + plasma_t + vacuum_t + firstwall_t + blanket_or = blanket_ir + blanket1_t + return np.pi * chamber_length * (blanket_or**2 - blanket_ir**2) + + @staticmethod + def cal_first_wall_cost(firstwall_vol, Be_rho, Be_c_raw, Be_m): + return firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6 + + @staticmethod + def cal_blanket_cost(blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m): + return blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6 ### Account Methods: ### @@ -288,24 +308,9 @@ def Account_C21_17(P_egross): @staticmethod - def Account_C22_1_1(inputs): + def Account_C22_1_1(first_wall_cost, blanket_cost): # First Wall and Blanket (and vacuum vessel) - - L_magnet_to_magnet = inputs['L_EP'] - - L_cylinder = L_magnet_to_magnet - - expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) - - end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) - end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() - - central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['L_CC']) - central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() - - total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result - - return(total_cost/1e6) + return first_wall_cost + blanket_cost @staticmethod def Account_C22_1_2(HF_magnet_shield_cost): diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index d55521d..862747e 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -29,7 +29,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 28,2117,Ventilation_Stack,4269265.632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross 29,22,Heat_Island_Plant_Equipment,1111998920.0,1,20,Unchanged,0.21553124025414422,,million,rollup 30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,,million,rollup -31,2211,First_Wall_and_Blanket,43193434.21,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"L_CC, L_EP" +31,2211,First_Wall_and_Blanket,1217121895.4107623,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"first_wall_cost, blanket_cost" 32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost 33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,,million,rollup 34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,"HF_magnet_number, HF_magnet_cost" diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index 5353007..6a4cd74 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -16,7 +16,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 21,Account_C21_15,c,Account C2115 Rollup,MirrorFunc,P_egross,million 22,Account_C21_16,c,Account C2116 Rollup,MirrorFunc,P_egross,million 23,Account_C21_17,c,Account C2117 Rollup,MirrorFunc,P_egross,million -26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"L_CC, L_EP",million +26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"first_wall_cost, blanket_cost",million 27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,HF_magnet_shield_cost,million 29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,"HF_magnet_number, HF_magnet_cost",million 30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,"LF_magnet_number, LF_magnet_cost",million @@ -72,3 +72,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 107,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 108,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 109,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 +110,cal_firstwall_vol,v,Mirror generated variable calculation for firstwall_vol,MirrorFunc,firstwall_vol = pi * chamber_length * ((axis_t + plasma_t + vacuum_t + firstwall_t)**2 - (axis_t + plasma_t + vacuum_t)**2),m3 +111,cal_blanket1_vol,v,Mirror generated variable calculation for blanket1_vol,MirrorFunc,blanket1_vol = pi * chamber_length * ((axis_t + plasma_t + vacuum_t + firstwall_t + blanket1_t)**2 - (axis_t + plasma_t + vacuum_t + firstwall_t)**2),m3 +112,cal_first_wall_cost,v,Mirror generated variable calculation for first_wall_cost,MirrorFunc,first_wall_cost = firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6,million +113,cal_blanket_cost,v,Mirror generated variable calculation for blanket_cost,MirrorFunc,blanket_cost = blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index 7d51555..fb19428 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -22,7 +22,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 21,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 22,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 23,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 -24,axis_t,str,,1,,,, +24,axis_t,PyFECONS radial build axis thickness,0.0,m,,,"blanket1_vol, firstwall_vol",0 25,axis_ir,str,,1,,,, 26,lr,str,,1,,,, 27,constructionworker,str,,1,,,, @@ -198,3 +198,73 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 197,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 198,HF_magnet_shield_cost,HF magnet shield cost per end plug,47.36847787,million,,,,0 199,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 +200,firstwall_vol,Mirror generated parameter,38.07610296150822,m3,cal_firstwall_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t",first_wall_cost,0 +201,blanket1_vol,Mirror generated parameter,422.230052642468,m3,cal_blanket1_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t",blanket_cost,0 +202,first_wall_cost,Mirror generated parameter,1215.1036357591313,million,cal_first_wall_cost,"firstwall_vol, Be_rho, Be_c_raw, Be_m",,0 +203,blanket_cost,Mirror generated parameter,2.018259651630997,million,cal_blanket_cost,"blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m",,0 +204,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,"blanket1_vol, firstwall_vol",0 +205,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,"blanket1_vol, firstwall_vol",0 +206,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,"blanket1_vol, firstwall_vol",0 +207,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,"blanket1_vol, firstwall_vol",0 +208,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,blanket1_vol,0 +209,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 +210,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 +211,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 +212,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 +213,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 +214,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 +215,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 +216,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 +217,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 +218,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 +219,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 +220,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 +221,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 +222,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,,0 +223,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,,0 +224,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,,0 +225,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,blanket_cost,0 +226,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,blanket_cost,0 +227,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,blanket_cost,0 +228,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 +229,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 +230,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,,0 +231,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,,0 +232,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,,0 +233,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 +234,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 +235,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 +236,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 +237,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 +238,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 +239,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 +240,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 +241,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 +242,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 +243,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 +244,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 +245,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 +246,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 +247,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 +248,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 +249,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 +250,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 +251,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 +252,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 +253,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 +254,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 +255,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 +256,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,,0 +257,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,,0 +258,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,,0 +259,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 +260,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 +261,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 +262,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 +263,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 +264,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,first_wall_cost,0 +265,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,first_wall_cost,0 +266,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,first_wall_cost,0 +267,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 +268,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 +269,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 From 84e2e0d97f7d16a7582ab8a550759bbc7053fc26 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sun, 2 Aug 2026 11:27:24 -0500 Subject: [PATCH 14/23] Move Mirror defaults into table builder --- src/Algorithm/MirrorFunc.py | 455 +--------------------- src/accertdb.sqlite | Bin 1105920 -> 1105920 bytes src/scripts/build_mirror_accert_tables.py | 101 +++-- test/test_mirror_model.py | 6 +- tutorial/accert/ref_tables/MirrorFunc.py | 455 +--------------------- 5 files changed, 88 insertions(+), 929 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index 6030363..ca4d4f6 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -1,10 +1,8 @@ import numpy as np import pandas as pd import scipy -import json import math import inspect -import pkg_resources from .Algorithm import Algorithm ### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples @@ -635,7 +633,7 @@ def V_cylindrical_shell(r_in, r_out, L): @staticmethod def V_inverse_triangular_washer(z, r_in, r_out): - """ + r""" Return volume of cylindrical inverse triangular washer. From the ASCII art below you can see how this is used for magnet shielding. @@ -668,455 +666,6 @@ def V_inverse_triangular_washer(z, r_in, r_out): return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) @staticmethod - def generate_inputs( - - application='heat', - - P_f=1, P_f_L=1, P_f_EP=1, - P_NBI=1, P_ECH=1, P_ICRH=1, - M_n=1.1, - - N_module=1, - - f_pump=0.03, f_sub=0.04, f_cryo=0.01, - - # Obsolete but kept for backwards compatibility - P_pump=1, P_sub_cont=1, P_cryo=1, - P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, - - eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, - eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, - - verbose=False, exact=False, - NOAK=False, n_unit=False, - construction_time=6, - lifetime=30, replacement=10, availability=0.90, - discount=0.0245, - LSA=2, - cost_file='woodruff-data.csv', method='new', - include_decommissioning=False, include_tax=False, - include_licensing=False, include_contingency=False, - - hf_magnet_length=1, - hf_magnet_shielding_thickness=1, - - a_EC=1, - expander_cell_vessel_thickness=0.01, - expander_cell_vessel_material='SS316', - - vacuum_gap_CC=0.01, - first_wall_material='W', - first_wall_thickness=0.01, - vacuum_vessel_material='SS316', - vacuum_vessel_thickness=0.01, - multiplier_material='Pb', - multiplier_thickness=0.01, - blanket_coolant_material='Natural PbLi', - blanket_thickness=1.00, - blanket_coolant_fraction=0.90, - blanket_structural_material='SS316', - blanket_structural_fraction=0.10, - outer_vessel_thickness=0.01, - - L_EP=1, - L_EC=1, - a_CC=1, - a_EP=1, - - save=True, - load=False, - filename=None, - run_name=None - - ): - - """ - Return a dict containing all inputs for a techno-economic analysis. - - Parameters - ---------- - application : str, optional - The application, either 'electricity' or 'heat'. - This changes the power balance and some reporting. The default - is 'heat'. - P_f : float - The total fusion power in MW. The length of the central cell - is scaled to achieve this value. This is not the net electrical power! - P_f_L : float - The central cell linear fusion power in MW/m. - P_f_EP : float - The fusion power in each of two end plugs in MW. - P_NBI : float - The applied NBI power in MW. - P_ECH : float - The applied ECH power in MW. - P_ICRH : float - The applied ICRH power in MW. - M_n : float - The neutron power multiplication factor from the blanket. - The default is 1.1. - N_module : int - The number of modules (fusion machines) per facility. - This is deprecated. The default is 1. - f_pump : float - The pumping power fraction (of M_n * P_fusion). The default is 0.03. - f_sub : float - The subsystem power fraction (of fusion power). The default is 0.04. - f_cryo : float - The cryogenic power fraction (of fusion power). The default is 0.01. - P_pump : float - The pumping power in MW. This is deprecated. - P_sub_cont : float - The subsystem and control power in MW. This is deprecated. - P_cryo: float - The cryo power in MW. The default is 0.5 MW. This is deprecated. - P_pfcool : float - The PF cooling power in MW. The default is 0. This is deprecated. - P_thcool : float - The thermal cooling power in MW. The default is 0. This is deprecated. - P_coils : float - The magnetic coil power in MW. The default is 0. - P_aux : float - The auxiliary power in MW. The default is 9.4. - - eta_th : float - The thermal conversion efficiency. - eta_DEC : float - The DEC conversion efficiency. The default is 0.90. - eta_pump : float - The pumping efficiency. The default is 0.98. - eta_NBI : float - The NBI electrical efficiency. - eta_ECH : float - The ECH electrical efficiency. - eta_ICRH : float - The ICRH electrical efficiency. - - LSA : int - The level of safey assurance. The default is 2. This is deprecated. - - construction_time : int - The construction time in years. The default is 6. - NOAK : bool - Whether this is an NOAK device. The default is False. - This will probably be deprecated soon. - n_unit : int or bool - The number of the tandem unit, in terms of first of a kind (1), - second of a kind (2), etc. When this is False, the FOAK cost is used. - The default is False. - lifetime : int - The lifetime of the tandem in years. This is used for LCOE and LCOH - calcualtions. The default is 30. - replacement : int - The replacement interval of the magnets in years. The default is 10. - availability : float - The facility availability. The range is between 0 and 1, inclusive. - The default is 0.90. - cost_file : str - The filename of the cost file. The default is 'woodruff-data.csv'. - method : str - The power balance method. The default is 'new'. - This will be deprecated soon. - include_tax : bool - Whether to include tax. The default is False. - include_decommissioning : bool - Whether to include decommissioning. The default is False. - include_licensing : bool - Whether to include licensing. The default is False. - include_contingency : bool - Whether to include continency. The default is False. - verbose : bool - Whether to print a lot. The default is False. - vacuum_gap_CC : float - The vacuum gap in the central cell, in meters. The default is 0.01. - first_wall_material : str - The first wall material. The default is 'W'. - first_wall_thickness : float - The first wall thickness, in meters. The default is 0.01. - vacuum_vessel_material : str - The vacuum vessel material. The default is 'SS316'. - vacuum_vessel_thickness : float - The vacuum vessel thickness, in meters. The default is 0.01 - multiplier_material : str - The muliplier material. The default is 'Pb' - multiplier_thickness : float - The multiplier thickness, in meters. The default is 0.01. - blanket_coolant_material : str - The blanket coolant material. The default is 'Natural PbLi'. - blanket_thickness : float - The blanket thickness, in meters. The default is 1.00. - blanket_coolant_fraction : float - The blanket coolant fraction, from 0 to 1. The default is 0.90. - blanket_structural_material : str - The blanket structural material. The default is 'SS316'. - blanket_structural_fraction : float - The blanket structural fraction, from 0 to 1. The default is 0.10. - outer_vessel_thickness : float - The outer vessel thickness, in meters. The default is 0.01. - contours : bool - Whether to plot contours of discount rates and build time. - The default is False. - tornadoes : bool - Whether to plot tornado plots. These take a while to make. - The default is False. - - hf_magnet_length : float - The axial length of the HF magnet, in meters. The default is 1.0. - hf_magnet_shielding_thickness : - The default is 1.0, - - a_EC : float - The expander cell radius, in meters. The default is 1.0. - expander_cell_vessel_thickness : float - The expander cell vessel thickness, in meters. The default is 0.01. - expander_cell_vessel_material : str - The expander cell vessel material. The default is 'SS316'. - - - - L_EP : float - The length of each end plug, in meters. The default is 1. - L_EC : float - The length of each expander cell, in meters, measured from the - centers of the HF coils. The default is 1. - a_CC : float - The central cell plasma radius, in meters. The default is 15. - a_EP : float - The end plug plasma radius, in meters. The default is 1. - - - - - save : bool - Whether to save the results. The default is True. - load : bool - Whether to load results. The default is False. - filename : str - The filename loading. The default is None. - run_name : str - A run name for saving results. The default is None. - - - """ - - if load: - with open(filename) as file: - inputs = json.load(file) - - else: - - # Fusion Power in Central Cell - P_f_CC = P_f - 2 * P_f_EP - - # Central Cell Length - L_CC = P_f_CC/P_f_L - - # Central Field Coil Spacing - L_CF = 1.0 - - # Overall Device Length - L = L_CC + 2 * L_EP + 2 * L_EC - - # Vacuum Volume - Not precise, but also not important - # Should be updated - V_vac = L * np.pi * a_EC**2 - - - # Power Balance - P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power - P_n = P_f - P_alpha # MW, neutron power - - # Input electrical power - P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH - - # Balance of Plant - P_pump = f_pump * M_n * P_n - P_sub_cont = f_sub * P_f - P_cryo = f_cryo * P_f - P_other = P_pump + P_sub_cont + P_cryo - - # Total heating input power applied to plasma - P_in = P_NBI + P_ICRH + P_ECH - - # Heat in blanket including neutron multiplication - # P_thermal_only = M_n * P_n - - # Thermal power - # No P_in term as that goes to DEC - P_th = M_n * P_n + eta_pump * P_pump - - # Thermal electric power - P_the = eta_th * P_th - - # DEC receives all charged particle exhaust, so is the sum of - # both the input power and alpha power - P_DEC = P_in + P_alpha - - # DEC electrical power - P_DECe = eta_DEC * P_DEC - - # Gross electrical power - # Differs for application - if application.lower()=='electricity': - # Electrical application uses thermal power to create electricity - P_egross = P_DECe + P_the - elif application.lower()=='heat': - # Heat application only uses DEC to create electricity - P_egross = P_DECe - - # Net electrical power - P_enet = P_egross - (P_ine + P_other) - - f_aux = P_aux / P_egross - # P_loss = P_th - P_the - P_DECe - # P_sub = f_sub * P_the - - # Scientific Q - Q_sci = P_f / P_in - - # Engineering Q - Q_eng = P_egross / (P_ine + P_other) - - # Recirculating power - f_refrac = 1 / Q_eng - if run_name==None: - run_name = '{:.1f}-MW'.format(float(P_f)) - - - cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) - - inputs = { - - # Application (heat or electricity) - 'Application':application, - 'Method':method, - - # Power Balance - 'Fusion Power': P_f, - 'Alpha Power': P_alpha, - 'Neutron Power': P_n, - 'Neutron Energy Multiplication': M_n, - # 'Thermal Only Power': P_thermal_only, - 'Thermal Power': P_th, - 'Thermal Conversion Efficiency': eta_th, - - # DEC - 'DEC Efficiency': eta_DEC, - 'DEC Electrical Power': P_DECe, - 'DEC Input Power': P_DEC, - - # Balance - 'Thermal Electric Power': P_the, - 'Gross Electric Power': P_egross, - 'Net Electric Power': P_enet, - - # Other Power - 'Other Power': P_other, - 'Pumping Power Fraction': f_pump, - 'Pumping Power': P_pump, - 'Subsystem and Control Power': P_sub_cont, - 'Auxiliary Power Fraction': f_aux, - 'Auxiliary Power': P_aux, - - # Input Power - 'Applied Heating Power': P_in, - 'Applied Heating Power Electrical Use': P_ine, - 'NBI Power': P_NBI, - 'ICRH Power': P_ICRH, - 'ECH Power': P_ECH, - 'NBI Electrical Efficiency': eta_NBI, - 'ICRH Electrical Efficiency': eta_ICRH, - 'ECH Electrical Efficiency': eta_ECH, - - # Q - 'Scientific Q': Q_sci, - 'Engineering Q': Q_eng, - 'Recirculating Power Fraction': f_refrac, - - # Don't use this - it is probably not implemented well here - 'Number of Modules': N_module, - - # Time Intervals - 'Construction Time':construction_time, - 'Lifetime':lifetime, - 'Replacement Time':replacement, - 'Level of Safety Assurance':LSA, - - # Geometry - 'Overall Length':L, - 'Central Cell Length':L_CC, - 'End Plug Length':L_EP, - 'Expander Length':L_EC, - 'Vacuum Volume':V_vac, - - # Number of Magnets - 'HF Magnet Number':4, # Always 4 for a tandem - 'LF Magnet Number':2, # Set to what you need! - 'CF Magnet Spacing':L_CF, - 'CF Magnet Number':L_CC/L_CF, # Calcuated - - 'HF Magnet Length':hf_magnet_length, - 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, - - 'End Plug Plasma Radius':a_EP, - - 'Expander Cell Length':L_EC, - 'Expander Cell Radius':a_EC, - 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, - 'Expander Cell Vessel Material':expander_cell_vessel_material, - - 'Central Cell Plasma Radius':a_CC, - 'Central Cell Vacuum Gap':vacuum_gap_CC, - 'First Wall Material':first_wall_material, - 'First Wall Thickness':first_wall_thickness, - 'Vacuum Vessel Material':vacuum_vessel_material, - 'Vacuum Vessel Thickness':vacuum_vessel_thickness, - 'Multiplier Material':multiplier_material, - 'Multiplier Thicnkess':multiplier_thickness, - 'Blanket Coolant Material':blanket_coolant_material, - 'Blanket Thickness':blanket_thickness, - 'Blanket Coolant Fraction':blanket_coolant_fraction, - 'Blanket Structural Material':blanket_structural_material, - 'Blanket Structrual Fraction':blanket_structural_fraction, - 'Outer Vessel Thickness':outer_vessel_thickness, - - # Economic Factors - 'Availability':availability, - 'Discount':discount, - 'NOAK': NOAK, - 'Unit Number':n_unit, - # 'Cost File':cost_file, - 'Cost File':cost_file_full, - 'Licensing':include_licensing, - 'Tax':include_tax, - 'Decommissioning':include_decommissioning, - 'Contingency':include_contingency, - - # File Prefix - 'Run Name':run_name - - } - - if save: - # import csv - - filename = 'inputs-'+inputs['run_name']+'.json' - - - with open(filename, 'w') as file: - json.dump(inputs, file) - - if verbose: - - format_string = '{:35s} {:8.2f}' - - print('{:35s} {:8s}'.format('Parameter', 'Value')) - - for key in inputs: - print(format_string.format(key, inputs[key])) - - return(inputs) - @staticmethod def create_radial_build(name, material, thickness, f_vol=1.00): new_data = pd.DataFrame(data={ @@ -1314,7 +863,7 @@ def expander_cell_cost(inputs): @staticmethod def HF_magnet_shield_cost(inputs, verbose=False): - """ + r""" The HF coils have annular shield with a U-shaped cross section: +----+--------+----+ diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index f9c561becc3997b0ded85ce1eb6044eb0ff58b85..8286bed4b3baef41c57c03d429efea2ca46aef30 100644 GIT binary patch delta 386 zcmYL@zfJ-{5QlH}j=NhpZimE3fqxFIOpIcH%EE%e!kF*?7Mu70!V}1uT#Qs06Sg%J z*g_%K-Wy0^V~7zuO^l7vh5*jdu*vt!%+8m|G@?o)sSP-K)6Jiu*dis-KV1#c+n8&tmZLk0U delta 382 zcmYL^ze>YU6vlJ%|F&t*jY>PXv^oi*k+zeI(7{23K7hjoAE50M*a$)F6cN0uQ{1E- zY}PzN2Nx+)-4sLw(WSKU#HAO$k8|P2`M%Rjn!ThMuDhY4Kv7w~`>X95guVy_1VRmj z76?5MMj*^USb?w~1pC;9Re9{OO|WIxV{=%O?LF2oaBK*GKtTXWu4Y5*I{}a-=-TAr(l)c+o($A9g91fwL2h Vsh^;JcQD|T9a8q_;J+`Y@egSgY_9+S diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index 4c2307c..d064f39 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -32,6 +32,78 @@ } DEFAULT_INPUT_FILE = "mirror_default_inputs.csv" +MIRROR_INPUT_DEFAULTS = { + "application": "heat", + "P_f": 1, + "P_f_L": 1, + "P_f_EP": 1, + "P_NBI": 1, + "P_ECH": 1, + "P_ICRH": 1, + "M_n": 1.1, + "N_module": 1, + "f_pump": 0.03, + "f_sub": 0.04, + "f_cryo": 0.01, + "P_pump": 1, + "P_sub_cont": 1, + "P_cryo": 1, + "P_pfcool": 0, + "P_thcool": 0, + "P_coils": 0, + "P_aux": 1, + "eta_th": 0.50, + "eta_DEC": 0.90, + "eta_pump": 0.98, + "eta_NBI": 0.50, + "eta_ECH": 0.50, + "eta_ICRH": 0.50, + "verbose": 0, + "exact": 0, + "NOAK": 0, + "n_unit": 0, + "construction_time": 6, + "lifetime": 30, + "replacement": 10, + "availability": 0.90, + "discount": 0.0245, + "LSA": 2, + "cost_file": "woodruff-data.csv", + "method": "new", + "include_decommissioning": 0, + "include_tax": 0, + "include_licensing": 0, + "include_contingency": 0, + "hf_magnet_length": 1, + "hf_magnet_shielding_thickness": 1, + "a_EC": 1, + "expander_cell_vessel_thickness": 0.01, + "expander_cell_vessel_material": "SS316", + "vacuum_gap_CC": 0.01, + "first_wall_material": "W", + "first_wall_thickness": 0.01, + "vacuum_vessel_material": "SS316", + "vacuum_vessel_thickness": 0.01, + "multiplier_material": "Pb", + "multiplier_thickness": 0.01, + "blanket_coolant_material": "Natural PbLi", + "blanket_thickness": 1.00, + "blanket_coolant_fraction": 0.90, + "blanket_structural_material": "SS316", + "blanket_structural_fraction": 0.10, + "outer_vessel_thickness": 0.01, + "L_EP": 1, + "L_EC": 1, + "a_CC": 1, + "a_EP": 1, + "save": 1, + "load": 0, + "filename": "", + "run_name": "", +} + +MIRROR_DEFAULT_EXPORT_EXCLUDE = {"verbose", "exact", "save", "load"} + MIRROR_ACCOUNT_COLUMNS = [ ("ind", "INTEGER"), ("code_of_account", "TEXT NOT NULL"), @@ -472,27 +544,12 @@ def _account_variables(input_keys: list[str], account_calls: list[str]) -> str: return ", ".join(HUMAN_INPUT_TO_VAR.get(key, key) for key in input_keys) -def _literal_default(node: ast.AST): - value = ast.literal_eval(node) - if isinstance(value, bool): - return int(value) - if value is None: - return "" - return value - - -def _generate_inputs_defaults(algorithm_source: Path) -> dict[str, tuple[object, str]]: - module = ast.parse(algorithm_source.read_text(encoding="utf-8")) - klass = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == "MirrorFunc") - method = next(node for node in klass.body if isinstance(node, ast.FunctionDef) and node.name == "generate_inputs") - args = method.args.args - defaults = method.args.defaults - default_start = len(args) - len(defaults) +def _mirror_input_defaults(_algorithm_source: Path | None = None) -> dict[str, tuple[object, str]]: values = {} - for arg, default in zip(args[default_start:], defaults): - if arg.arg in {"verbose", "exact", "save", "load"}: + for name, value in MIRROR_INPUT_DEFAULTS.items(): + if name in MIRROR_DEFAULT_EXPORT_EXCLUDE: continue - values[arg.arg] = (_literal_default(default), MIRROR_INPUT_UNITS.get(arg.arg, "1")) + values[name] = (value, MIRROR_INPUT_UNITS.get(name, "1")) values["HF_magnet_number"] = (4, "1") values["LF_magnet_number"] = (2, "1") return values @@ -576,7 +633,7 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: dependencies = _account_method_dependencies(algorithm_source) - input_defaults = _generate_inputs_defaults(algorithm_source) + input_defaults = _mirror_input_defaults(algorithm_source) generated_values = _mirror_generated_var_values(input_defaults) methods = set(dependencies) conn.execute("ALTER TABLE mirror_acco RENAME TO mirror_acco_raw") @@ -646,7 +703,7 @@ def _split_vars(value: str | None) -> list[str]: def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: - input_defaults = _generate_inputs_defaults(algorithm_source) + input_defaults = _mirror_input_defaults(algorithm_source) generated_values = _mirror_generated_var_values(input_defaults) conn.execute("UPDATE mirror_var SET var_alg = '' WHERE var_alg = 'TODO'") conn.execute("UPDATE mirror_var SET var_need = '' WHERE var_need = 'TODO'") @@ -782,7 +839,7 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: def _write_default_inputs_csv(algorithm_source: Path, path: Path) -> int: rows = [ (name, value, unit) - for name, (value, unit) in sorted(_generate_inputs_defaults(algorithm_source).items()) + for name, (value, unit) in sorted(_mirror_input_defaults(algorithm_source).items()) ] path.parent.mkdir(parents=True, exist_ok=True) with path.open("w", newline="", encoding="utf-8") as handle: diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 02b7ac4..e2b4bf0 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -28,7 +28,7 @@ def test_mirror_reference_tables_loaded(cursor): assert cursor.fetchone()[0] == _csv_row_count(csv_path) -def test_mirror_default_inputs_are_exported_from_generate_inputs(): +def test_mirror_default_inputs_are_exported_from_builder_defaults(): defaults_path = REF_DIR / "mirror_default_inputs.csv" with defaults_path.open(newline="", encoding="utf-8") as handle: defaults = { @@ -43,6 +43,10 @@ def test_mirror_default_inputs_are_exported_from_generate_inputs(): assert defaults["LF_magnet_number"] == ("2", "1") +def test_mirror_func_does_not_keep_legacy_generate_inputs(): + assert not hasattr(MirrorFunc, "generate_inputs") + + def test_mirror_setup_table_names(): accert = Accert.__new__(Accert) accert.use_gncoa = False diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index 6030363..ca4d4f6 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -1,10 +1,8 @@ import numpy as np import pandas as pd import scipy -import json import math import inspect -import pkg_resources from .Algorithm import Algorithm ### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples @@ -635,7 +633,7 @@ def V_cylindrical_shell(r_in, r_out, L): @staticmethod def V_inverse_triangular_washer(z, r_in, r_out): - """ + r""" Return volume of cylindrical inverse triangular washer. From the ASCII art below you can see how this is used for magnet shielding. @@ -668,455 +666,6 @@ def V_inverse_triangular_washer(z, r_in, r_out): return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) @staticmethod - def generate_inputs( - - application='heat', - - P_f=1, P_f_L=1, P_f_EP=1, - P_NBI=1, P_ECH=1, P_ICRH=1, - M_n=1.1, - - N_module=1, - - f_pump=0.03, f_sub=0.04, f_cryo=0.01, - - # Obsolete but kept for backwards compatibility - P_pump=1, P_sub_cont=1, P_cryo=1, - P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, - - eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, - eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, - - verbose=False, exact=False, - NOAK=False, n_unit=False, - construction_time=6, - lifetime=30, replacement=10, availability=0.90, - discount=0.0245, - LSA=2, - cost_file='woodruff-data.csv', method='new', - include_decommissioning=False, include_tax=False, - include_licensing=False, include_contingency=False, - - hf_magnet_length=1, - hf_magnet_shielding_thickness=1, - - a_EC=1, - expander_cell_vessel_thickness=0.01, - expander_cell_vessel_material='SS316', - - vacuum_gap_CC=0.01, - first_wall_material='W', - first_wall_thickness=0.01, - vacuum_vessel_material='SS316', - vacuum_vessel_thickness=0.01, - multiplier_material='Pb', - multiplier_thickness=0.01, - blanket_coolant_material='Natural PbLi', - blanket_thickness=1.00, - blanket_coolant_fraction=0.90, - blanket_structural_material='SS316', - blanket_structural_fraction=0.10, - outer_vessel_thickness=0.01, - - L_EP=1, - L_EC=1, - a_CC=1, - a_EP=1, - - save=True, - load=False, - filename=None, - run_name=None - - ): - - """ - Return a dict containing all inputs for a techno-economic analysis. - - Parameters - ---------- - application : str, optional - The application, either 'electricity' or 'heat'. - This changes the power balance and some reporting. The default - is 'heat'. - P_f : float - The total fusion power in MW. The length of the central cell - is scaled to achieve this value. This is not the net electrical power! - P_f_L : float - The central cell linear fusion power in MW/m. - P_f_EP : float - The fusion power in each of two end plugs in MW. - P_NBI : float - The applied NBI power in MW. - P_ECH : float - The applied ECH power in MW. - P_ICRH : float - The applied ICRH power in MW. - M_n : float - The neutron power multiplication factor from the blanket. - The default is 1.1. - N_module : int - The number of modules (fusion machines) per facility. - This is deprecated. The default is 1. - f_pump : float - The pumping power fraction (of M_n * P_fusion). The default is 0.03. - f_sub : float - The subsystem power fraction (of fusion power). The default is 0.04. - f_cryo : float - The cryogenic power fraction (of fusion power). The default is 0.01. - P_pump : float - The pumping power in MW. This is deprecated. - P_sub_cont : float - The subsystem and control power in MW. This is deprecated. - P_cryo: float - The cryo power in MW. The default is 0.5 MW. This is deprecated. - P_pfcool : float - The PF cooling power in MW. The default is 0. This is deprecated. - P_thcool : float - The thermal cooling power in MW. The default is 0. This is deprecated. - P_coils : float - The magnetic coil power in MW. The default is 0. - P_aux : float - The auxiliary power in MW. The default is 9.4. - - eta_th : float - The thermal conversion efficiency. - eta_DEC : float - The DEC conversion efficiency. The default is 0.90. - eta_pump : float - The pumping efficiency. The default is 0.98. - eta_NBI : float - The NBI electrical efficiency. - eta_ECH : float - The ECH electrical efficiency. - eta_ICRH : float - The ICRH electrical efficiency. - - LSA : int - The level of safey assurance. The default is 2. This is deprecated. - - construction_time : int - The construction time in years. The default is 6. - NOAK : bool - Whether this is an NOAK device. The default is False. - This will probably be deprecated soon. - n_unit : int or bool - The number of the tandem unit, in terms of first of a kind (1), - second of a kind (2), etc. When this is False, the FOAK cost is used. - The default is False. - lifetime : int - The lifetime of the tandem in years. This is used for LCOE and LCOH - calcualtions. The default is 30. - replacement : int - The replacement interval of the magnets in years. The default is 10. - availability : float - The facility availability. The range is between 0 and 1, inclusive. - The default is 0.90. - cost_file : str - The filename of the cost file. The default is 'woodruff-data.csv'. - method : str - The power balance method. The default is 'new'. - This will be deprecated soon. - include_tax : bool - Whether to include tax. The default is False. - include_decommissioning : bool - Whether to include decommissioning. The default is False. - include_licensing : bool - Whether to include licensing. The default is False. - include_contingency : bool - Whether to include continency. The default is False. - verbose : bool - Whether to print a lot. The default is False. - vacuum_gap_CC : float - The vacuum gap in the central cell, in meters. The default is 0.01. - first_wall_material : str - The first wall material. The default is 'W'. - first_wall_thickness : float - The first wall thickness, in meters. The default is 0.01. - vacuum_vessel_material : str - The vacuum vessel material. The default is 'SS316'. - vacuum_vessel_thickness : float - The vacuum vessel thickness, in meters. The default is 0.01 - multiplier_material : str - The muliplier material. The default is 'Pb' - multiplier_thickness : float - The multiplier thickness, in meters. The default is 0.01. - blanket_coolant_material : str - The blanket coolant material. The default is 'Natural PbLi'. - blanket_thickness : float - The blanket thickness, in meters. The default is 1.00. - blanket_coolant_fraction : float - The blanket coolant fraction, from 0 to 1. The default is 0.90. - blanket_structural_material : str - The blanket structural material. The default is 'SS316'. - blanket_structural_fraction : float - The blanket structural fraction, from 0 to 1. The default is 0.10. - outer_vessel_thickness : float - The outer vessel thickness, in meters. The default is 0.01. - contours : bool - Whether to plot contours of discount rates and build time. - The default is False. - tornadoes : bool - Whether to plot tornado plots. These take a while to make. - The default is False. - - hf_magnet_length : float - The axial length of the HF magnet, in meters. The default is 1.0. - hf_magnet_shielding_thickness : - The default is 1.0, - - a_EC : float - The expander cell radius, in meters. The default is 1.0. - expander_cell_vessel_thickness : float - The expander cell vessel thickness, in meters. The default is 0.01. - expander_cell_vessel_material : str - The expander cell vessel material. The default is 'SS316'. - - - - L_EP : float - The length of each end plug, in meters. The default is 1. - L_EC : float - The length of each expander cell, in meters, measured from the - centers of the HF coils. The default is 1. - a_CC : float - The central cell plasma radius, in meters. The default is 15. - a_EP : float - The end plug plasma radius, in meters. The default is 1. - - - - - save : bool - Whether to save the results. The default is True. - load : bool - Whether to load results. The default is False. - filename : str - The filename loading. The default is None. - run_name : str - A run name for saving results. The default is None. - - - """ - - if load: - with open(filename) as file: - inputs = json.load(file) - - else: - - # Fusion Power in Central Cell - P_f_CC = P_f - 2 * P_f_EP - - # Central Cell Length - L_CC = P_f_CC/P_f_L - - # Central Field Coil Spacing - L_CF = 1.0 - - # Overall Device Length - L = L_CC + 2 * L_EP + 2 * L_EC - - # Vacuum Volume - Not precise, but also not important - # Should be updated - V_vac = L * np.pi * a_EC**2 - - - # Power Balance - P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power - P_n = P_f - P_alpha # MW, neutron power - - # Input electrical power - P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH - - # Balance of Plant - P_pump = f_pump * M_n * P_n - P_sub_cont = f_sub * P_f - P_cryo = f_cryo * P_f - P_other = P_pump + P_sub_cont + P_cryo - - # Total heating input power applied to plasma - P_in = P_NBI + P_ICRH + P_ECH - - # Heat in blanket including neutron multiplication - # P_thermal_only = M_n * P_n - - # Thermal power - # No P_in term as that goes to DEC - P_th = M_n * P_n + eta_pump * P_pump - - # Thermal electric power - P_the = eta_th * P_th - - # DEC receives all charged particle exhaust, so is the sum of - # both the input power and alpha power - P_DEC = P_in + P_alpha - - # DEC electrical power - P_DECe = eta_DEC * P_DEC - - # Gross electrical power - # Differs for application - if application.lower()=='electricity': - # Electrical application uses thermal power to create electricity - P_egross = P_DECe + P_the - elif application.lower()=='heat': - # Heat application only uses DEC to create electricity - P_egross = P_DECe - - # Net electrical power - P_enet = P_egross - (P_ine + P_other) - - f_aux = P_aux / P_egross - # P_loss = P_th - P_the - P_DECe - # P_sub = f_sub * P_the - - # Scientific Q - Q_sci = P_f / P_in - - # Engineering Q - Q_eng = P_egross / (P_ine + P_other) - - # Recirculating power - f_refrac = 1 / Q_eng - if run_name==None: - run_name = '{:.1f}-MW'.format(float(P_f)) - - - cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) - - inputs = { - - # Application (heat or electricity) - 'Application':application, - 'Method':method, - - # Power Balance - 'Fusion Power': P_f, - 'Alpha Power': P_alpha, - 'Neutron Power': P_n, - 'Neutron Energy Multiplication': M_n, - # 'Thermal Only Power': P_thermal_only, - 'Thermal Power': P_th, - 'Thermal Conversion Efficiency': eta_th, - - # DEC - 'DEC Efficiency': eta_DEC, - 'DEC Electrical Power': P_DECe, - 'DEC Input Power': P_DEC, - - # Balance - 'Thermal Electric Power': P_the, - 'Gross Electric Power': P_egross, - 'Net Electric Power': P_enet, - - # Other Power - 'Other Power': P_other, - 'Pumping Power Fraction': f_pump, - 'Pumping Power': P_pump, - 'Subsystem and Control Power': P_sub_cont, - 'Auxiliary Power Fraction': f_aux, - 'Auxiliary Power': P_aux, - - # Input Power - 'Applied Heating Power': P_in, - 'Applied Heating Power Electrical Use': P_ine, - 'NBI Power': P_NBI, - 'ICRH Power': P_ICRH, - 'ECH Power': P_ECH, - 'NBI Electrical Efficiency': eta_NBI, - 'ICRH Electrical Efficiency': eta_ICRH, - 'ECH Electrical Efficiency': eta_ECH, - - # Q - 'Scientific Q': Q_sci, - 'Engineering Q': Q_eng, - 'Recirculating Power Fraction': f_refrac, - - # Don't use this - it is probably not implemented well here - 'Number of Modules': N_module, - - # Time Intervals - 'Construction Time':construction_time, - 'Lifetime':lifetime, - 'Replacement Time':replacement, - 'Level of Safety Assurance':LSA, - - # Geometry - 'Overall Length':L, - 'Central Cell Length':L_CC, - 'End Plug Length':L_EP, - 'Expander Length':L_EC, - 'Vacuum Volume':V_vac, - - # Number of Magnets - 'HF Magnet Number':4, # Always 4 for a tandem - 'LF Magnet Number':2, # Set to what you need! - 'CF Magnet Spacing':L_CF, - 'CF Magnet Number':L_CC/L_CF, # Calcuated - - 'HF Magnet Length':hf_magnet_length, - 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, - - 'End Plug Plasma Radius':a_EP, - - 'Expander Cell Length':L_EC, - 'Expander Cell Radius':a_EC, - 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, - 'Expander Cell Vessel Material':expander_cell_vessel_material, - - 'Central Cell Plasma Radius':a_CC, - 'Central Cell Vacuum Gap':vacuum_gap_CC, - 'First Wall Material':first_wall_material, - 'First Wall Thickness':first_wall_thickness, - 'Vacuum Vessel Material':vacuum_vessel_material, - 'Vacuum Vessel Thickness':vacuum_vessel_thickness, - 'Multiplier Material':multiplier_material, - 'Multiplier Thicnkess':multiplier_thickness, - 'Blanket Coolant Material':blanket_coolant_material, - 'Blanket Thickness':blanket_thickness, - 'Blanket Coolant Fraction':blanket_coolant_fraction, - 'Blanket Structural Material':blanket_structural_material, - 'Blanket Structrual Fraction':blanket_structural_fraction, - 'Outer Vessel Thickness':outer_vessel_thickness, - - # Economic Factors - 'Availability':availability, - 'Discount':discount, - 'NOAK': NOAK, - 'Unit Number':n_unit, - # 'Cost File':cost_file, - 'Cost File':cost_file_full, - 'Licensing':include_licensing, - 'Tax':include_tax, - 'Decommissioning':include_decommissioning, - 'Contingency':include_contingency, - - # File Prefix - 'Run Name':run_name - - } - - if save: - # import csv - - filename = 'inputs-'+inputs['run_name']+'.json' - - - with open(filename, 'w') as file: - json.dump(inputs, file) - - if verbose: - - format_string = '{:35s} {:8.2f}' - - print('{:35s} {:8s}'.format('Parameter', 'Value')) - - for key in inputs: - print(format_string.format(key, inputs[key])) - - return(inputs) - @staticmethod def create_radial_build(name, material, thickness, f_vol=1.00): new_data = pd.DataFrame(data={ @@ -1314,7 +863,7 @@ def expander_cell_cost(inputs): @staticmethod def HF_magnet_shield_cost(inputs, verbose=False): - """ + r""" The HF coils have annular shield with a U-shaped cross section: +----+--------+----+ From d65da8c94c9075d7cdaacad9d252502c940fd776 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sun, 2 Aug 2026 11:37:59 -0500 Subject: [PATCH 15/23] Remove legacy Mirror dataframe helpers --- src/Algorithm/MirrorFunc.py | 447 ----------------------- src/accertdb.sqlite | Bin 1105920 -> 1105920 bytes test/test_mirror_model.py | 19 + tutorial/accert/ref_tables/MirrorFunc.py | 447 ----------------------- 4 files changed, 19 insertions(+), 894 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index ca4d4f6..fe43d89 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -1,6 +1,4 @@ import numpy as np -import pandas as pd -import scipy import math import inspect from .Algorithm import Algorithm @@ -523,451 +521,6 @@ def Account_C28(): # Digital Twin return(5) - ### Other Methods: ### - @staticmethod - def PbLi_density(f_6Li=0.075, T=300): - """ - Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has - roughly 83% Pb and 17% Li. - - Parameters - ---------- - f_6Li : float, optional - Fraction of 6Li to all Li, aka enrichment. The default is 0.075. - T : float, optional - Temperature. Units are °C. The default is 300. - - Returns - ------- - Density of PbLi at selected parameters. - - """ - - f_6Li_natural = 0.075 - rho_6Li = 0.460e3 # kg/m^3 - rho_7Li = 0.537e3 # kg/m^3 - - T_K = T + 273.15 # K - - # Use equation for density as function of temperature from below, Table 1 - # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) - # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF - rho_PbLi = 10520.35 - 1.19051 * T_K - - - # Correct calculated density for enrichment - rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) - - return(rho_PbLi) - - @staticmethod - def Li_price(f_6Li=0.075): - """ - Return Li price (USD/kg) for enrichment levels above 90% 6Li - - Parameters - ---------- - f_6Li : TYPE, optional - DESCRIPTION. The default is 0.075. - - Returns - ------- - None. - - """ - - # https://www.dailymetalprice.com/lithium.html - # From 2024-04-01 - P_6Li075 = 15.152 # USD/kg - - if f_6Li == 0.075: - return(P_6Li075) - - elif f_6Li >= 0.90: - # From Woodruff for 90% 6Li - P_6Li90 = 70 # USD/kg - - # El-Guebaly 2011 (AIRES-AT UK Study) - # P_6Li90 = 2400.0 #USD/kg - - - f = [0.90, 0.99, 0.999, 0.9999, 0.99999] - Cf = [1, 2, 4, 8, 16] - - f_interp = scipy.interpolate.interp1d(f, Cf) - return(f_interp(f_6Li) * P_6Li90) - - else: - print('Lithium pricing at this enrichment level not supported') - return() - - @staticmethod - def PbLi_price(f_6Li, P_Pb): - - # Assuming eutectic fractions - f_Li = 0.17 - f_Pb = 1 - f_Li - - P_Li = MirrorFunc.Li_price(f_6Li) - - P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg - - return(P_PbLi) - @staticmethod - def V_cylindrical_shell(r_in, r_out, L): - """ - Return volume of a cylindrical shell - - Parameters - ---------- - r_in : float, inner radius - r_out : float, outer radius - L : float, length - - Returns - ------- - Volume (float). - - """ - return(np.pi * L * (r_out**2 - r_in**2)) - - @staticmethod - def V_inverse_triangular_washer(z, r_in, r_out): - r""" - Return volume of cylindrical inverse triangular washer. - From the ASCII art below you can see how this is used for magnet shielding. - - ^ z - | - | z - |\ | /| - | \ | / | - | \ | / | - | \ | / | - | \ | / | - | \ | / | - ------------------------------------> r - r_in r_out - - Parameters - ---------- - z : float, z extent of triangle - r_in : float, inner radius of triangle - r_out : float, outer radius of triangle - - Returns - ------- - Volume (float). - - """ - - - # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b - - return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) - @staticmethod - def create_radial_build(name, material, thickness, f_vol=1.00): - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[0.0], - 'r_out':[thickness], - 'f_vol':[f_vol]}) - - return(new_data) - @staticmethod - def add_new_layer(data, name, material, thickness, f_vol=1.00): - - # Inner radius is outer radius from last row - r_in = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_in+thickness], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def add_fractional_layer(data, name, material, f_vol=1.00): - - # Inner radius is inner radius from last row - r_in = data['r_in'].values[-1] - r_out = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_out], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def build_central_cell(inputs): - - radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['a_CC']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['vacuum_gap_CC']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['first_wall_material'], inputs['first_wall_thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['vacuum_vessel_material'], inputs['vacuum_vessel_thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['multiplier_material'], inputs['multiplier_thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['blanket_coolant_material'], inputs['blanket_thickness'], inputs['blanket_coolant_fraction']) - radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['blanket_structural_material'], inputs['blanket_structural_fraction']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['vacuum_vessel_material'], inputs['outer_vessel_thickness']) - - return(radial_build) - - @staticmethod - def central_cell_cost(inputs, L=1.0): - return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) - - @staticmethod - def central_cell(inputs, L=1.0): - - filename = inputs['cost_file'] - - cost_data = pd.read_csv(filename, index_col=0) - - radial_build = MirrorFunc.build_central_cell(inputs) - - - - T = 300 # °C, mean coolant temperture - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - # print(radial_build.to_string()) - - # print(radial_build) - - # Iterate over layer in radial build and calculate volume and cost - for i in range(len(radial_build)): - - material = radial_build['material'][i] - # print(material) - - ''' - PbLi is a special case as the enrichment and temperature affect - the density and cost. Here the code expects a percent enrichment as - shown here: - 'Natural PbLi' meaning '7.5% PbLi' - '93% PbLi' or similar - ''' - if 'PbLi' in material: - - if 'Natural' in material: - f_6Li = 0.075 - elif '% ' in material: - f_6Li = float(material.split('% ')[0])/100 - else: - print('Unable to parse coolant', material) - - radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) - radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) - radial_build.loc[i, 'manufacturing_factor'] = 1.0 - - - else: - - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - - - - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})], ignore_index=True) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - # print() - # print('Radial build for L =', L) - # print(radial_build.to_string()) - - return(radial_build) - - # Return total cost only - # return(radial_build['cost'].max()) - - @staticmethod - def expander_cell_cost(inputs): - """ - Each expander cell is made up of: - A cylindrical vessel - A DEC convertor - - - Returns - ------- - None. - - """ - - # print('Expander Cell') - - L = inputs['L_EC'] - radius = inputs['a_EC'] - thickness = inputs['expander_cell_vessel_thickness'] - vv_material = inputs['expander_cell_vessel_material'] - - filename = inputs['cost_file'] - - cost_data = pd.read_csv(filename, index_col=0) - - # Cylindrical shell - - radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - for i in range(len(radial_build)): - - material = radial_build['material'][i] - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})]) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - - # print(radial_build.to_string()) - - # End cap - V_end_cap = np.pi * thickness * radius**2 - M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] - C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] - - # print('End Cap: $', C_end_cap) - # print('Cylindrical Part: $', radial_build['cost'].max()) - - total = 2*C_end_cap + radial_build['cost'].max() - - # print('Total: $', total) - - return(total) - - @staticmethod - def HF_magnet_shield_cost(inputs, verbose=False): - r""" - The HF coils have annular shield with a U-shaped cross section: - - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - \ | | / - \ | | / - \ | | / - \| |/ - +--------+ - - - - - - - - - - - - - - Center Line - - - +--------+ - /| |\ - / | | \ - / | | \ - / | | \ - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - - - """ - - # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) - # It's a reasonable assumption to say that all axial widths/layers will be the same - - - filename = inputs['cost_file'] - cost_data = pd.read_csv(filename, index_col=0) - - # Eventually these will be arguments - material = 'W' - a_M = 0.15 # From Frank - a_CC = 0.54 # From Frank - a_0 = 0.7 - - # Radially Inner Cylinder - # length = 4.5 # End plug length from Frank - length = 0.5 # Is this the required shielding thickness? - a_M = 0.15 - r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding - r_vv = 0.01 # Reduced from 0.1 to 0.01 - - # r_magnet = 1.0 # original - r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses - r_cryostat = 1.0 - - f_vol = 0.90 - - - r_in = a_M + r_gap + r_vv - r_out = r_magnet - r_cryostat - - V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol - - # Central Cell Cylinder - # length_cc_cylinder = 50.0 - length_cc_cylinder = 0.5 - r_in_cc = a_CC + r_gap + r_vv - # r_out_cc = 1.0 - r_out_cc = r_in_cc+0.5 - - V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol - - # Central Cell Triangular Washer - V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol - - # End Plug Cylinder - length_ep_cylinder = 0.5 # From Frank - r_in_ep = a_0 + r_gap + r_vv - r_out_ep = r_in_ep + 0.5 - - V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol - - # End Cell Triangular Washer - V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol - - # For central cell facing magnet, add up all five regions - V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle - - # For expander cell facing magnet, only add up three regions - # No neutrons come from the expander cell - V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle - - # Summary information - V_total = V_total_cc_facing + V_total_ec_facing - mass = cost_data.loc[material]['density'] * V_total - cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass - - return(cost) - - ### MNyberg's Magnet Methods ### # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 8286bed4b3baef41c57c03d429efea2ca46aef30..e4240f266517791387030fa79beef0caf4e152f3 100644 GIT binary patch delta 335 zcmY+9yGjE=6o&WgeRA133$iI}Hi-(spewmFHbM#u5%K^Q13rN93Cs$E#45pJUO_mE;mo~ZV2RU+e8Gk|*&#K{R;ykljNu8)^HN-tmld)J_L`mB z&+8(5Fmhs1BaV2ik`>5{_bU0Y3;)9$=odkqC{l{FBBRJEJQ>vKX9v4 delta 338 zcmY+9yGjF55I{4#*~iUe?*t@UM9r#IFlZ!?#xjM42>Aeu3x0s{3(N`^iB*Ed?SpKc z6nfkJ15?;YkZ5NiHewYt&f16r=fE&8rWdz+aeGiIj8ZA^QhyN-t92NKLJE+=kiwKA zErlh8Erlb6dn?%6E|k?#jctLc&T8xn0(H8_nwCSWUNlVL3DOspa7|y;**4hgwtui; zsNli$)pwIQ>aoFAprqa#?89FDU-SVki!DZEh%AvK@`R_0E&kbuyw1h^nQ!L8b2{gS zhh#e}(gVwVgA9C@*y1x?7@POpfV7^^c@@E!bo>0eJ2-K{JEj&^i4gGy(X)Q%7KyWb pp$k*@l@B|P37MTJK)e$OsG){S9(5?~A_N-7iH!j+%NnLs`T;4cSKI&q diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index e2b4bf0..680596e 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -47,6 +47,25 @@ def test_mirror_func_does_not_keep_legacy_generate_inputs(): assert not hasattr(MirrorFunc, "generate_inputs") +def test_mirror_func_does_not_keep_legacy_dataframe_helpers(): + removed_helpers = { + "PbLi_density", + "Li_price", + "PbLi_price", + "V_cylindrical_shell", + "V_inverse_triangular_washer", + "create_radial_build", + "add_new_layer", + "add_fractional_layer", + "build_central_cell", + "central_cell_cost", + "central_cell", + "expander_cell_cost", + "HF_magnet_shield_cost", + } + assert all(not hasattr(MirrorFunc, helper) for helper in removed_helpers) + + def test_mirror_setup_table_names(): accert = Accert.__new__(Accert) accert.use_gncoa = False diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index ca4d4f6..fe43d89 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -1,6 +1,4 @@ import numpy as np -import pandas as pd -import scipy import math import inspect from .Algorithm import Algorithm @@ -523,451 +521,6 @@ def Account_C28(): # Digital Twin return(5) - ### Other Methods: ### - @staticmethod - def PbLi_density(f_6Li=0.075, T=300): - """ - Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has - roughly 83% Pb and 17% Li. - - Parameters - ---------- - f_6Li : float, optional - Fraction of 6Li to all Li, aka enrichment. The default is 0.075. - T : float, optional - Temperature. Units are °C. The default is 300. - - Returns - ------- - Density of PbLi at selected parameters. - - """ - - f_6Li_natural = 0.075 - rho_6Li = 0.460e3 # kg/m^3 - rho_7Li = 0.537e3 # kg/m^3 - - T_K = T + 273.15 # K - - # Use equation for density as function of temperature from below, Table 1 - # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) - # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF - rho_PbLi = 10520.35 - 1.19051 * T_K - - - # Correct calculated density for enrichment - rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) - - return(rho_PbLi) - - @staticmethod - def Li_price(f_6Li=0.075): - """ - Return Li price (USD/kg) for enrichment levels above 90% 6Li - - Parameters - ---------- - f_6Li : TYPE, optional - DESCRIPTION. The default is 0.075. - - Returns - ------- - None. - - """ - - # https://www.dailymetalprice.com/lithium.html - # From 2024-04-01 - P_6Li075 = 15.152 # USD/kg - - if f_6Li == 0.075: - return(P_6Li075) - - elif f_6Li >= 0.90: - # From Woodruff for 90% 6Li - P_6Li90 = 70 # USD/kg - - # El-Guebaly 2011 (AIRES-AT UK Study) - # P_6Li90 = 2400.0 #USD/kg - - - f = [0.90, 0.99, 0.999, 0.9999, 0.99999] - Cf = [1, 2, 4, 8, 16] - - f_interp = scipy.interpolate.interp1d(f, Cf) - return(f_interp(f_6Li) * P_6Li90) - - else: - print('Lithium pricing at this enrichment level not supported') - return() - - @staticmethod - def PbLi_price(f_6Li, P_Pb): - - # Assuming eutectic fractions - f_Li = 0.17 - f_Pb = 1 - f_Li - - P_Li = MirrorFunc.Li_price(f_6Li) - - P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg - - return(P_PbLi) - @staticmethod - def V_cylindrical_shell(r_in, r_out, L): - """ - Return volume of a cylindrical shell - - Parameters - ---------- - r_in : float, inner radius - r_out : float, outer radius - L : float, length - - Returns - ------- - Volume (float). - - """ - return(np.pi * L * (r_out**2 - r_in**2)) - - @staticmethod - def V_inverse_triangular_washer(z, r_in, r_out): - r""" - Return volume of cylindrical inverse triangular washer. - From the ASCII art below you can see how this is used for magnet shielding. - - ^ z - | - | z - |\ | /| - | \ | / | - | \ | / | - | \ | / | - | \ | / | - | \ | / | - ------------------------------------> r - r_in r_out - - Parameters - ---------- - z : float, z extent of triangle - r_in : float, inner radius of triangle - r_out : float, outer radius of triangle - - Returns - ------- - Volume (float). - - """ - - - # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b - - return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) - @staticmethod - def create_radial_build(name, material, thickness, f_vol=1.00): - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[0.0], - 'r_out':[thickness], - 'f_vol':[f_vol]}) - - return(new_data) - @staticmethod - def add_new_layer(data, name, material, thickness, f_vol=1.00): - - # Inner radius is outer radius from last row - r_in = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_in+thickness], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def add_fractional_layer(data, name, material, f_vol=1.00): - - # Inner radius is inner radius from last row - r_in = data['r_in'].values[-1] - r_out = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_out], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def build_central_cell(inputs): - - radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['a_CC']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['vacuum_gap_CC']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['first_wall_material'], inputs['first_wall_thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['vacuum_vessel_material'], inputs['vacuum_vessel_thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['multiplier_material'], inputs['multiplier_thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['blanket_coolant_material'], inputs['blanket_thickness'], inputs['blanket_coolant_fraction']) - radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['blanket_structural_material'], inputs['blanket_structural_fraction']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['vacuum_vessel_material'], inputs['outer_vessel_thickness']) - - return(radial_build) - - @staticmethod - def central_cell_cost(inputs, L=1.0): - return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) - - @staticmethod - def central_cell(inputs, L=1.0): - - filename = inputs['cost_file'] - - cost_data = pd.read_csv(filename, index_col=0) - - radial_build = MirrorFunc.build_central_cell(inputs) - - - - T = 300 # °C, mean coolant temperture - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - # print(radial_build.to_string()) - - # print(radial_build) - - # Iterate over layer in radial build and calculate volume and cost - for i in range(len(radial_build)): - - material = radial_build['material'][i] - # print(material) - - ''' - PbLi is a special case as the enrichment and temperature affect - the density and cost. Here the code expects a percent enrichment as - shown here: - 'Natural PbLi' meaning '7.5% PbLi' - '93% PbLi' or similar - ''' - if 'PbLi' in material: - - if 'Natural' in material: - f_6Li = 0.075 - elif '% ' in material: - f_6Li = float(material.split('% ')[0])/100 - else: - print('Unable to parse coolant', material) - - radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) - radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) - radial_build.loc[i, 'manufacturing_factor'] = 1.0 - - - else: - - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - - - - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})], ignore_index=True) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - # print() - # print('Radial build for L =', L) - # print(radial_build.to_string()) - - return(radial_build) - - # Return total cost only - # return(radial_build['cost'].max()) - - @staticmethod - def expander_cell_cost(inputs): - """ - Each expander cell is made up of: - A cylindrical vessel - A DEC convertor - - - Returns - ------- - None. - - """ - - # print('Expander Cell') - - L = inputs['L_EC'] - radius = inputs['a_EC'] - thickness = inputs['expander_cell_vessel_thickness'] - vv_material = inputs['expander_cell_vessel_material'] - - filename = inputs['cost_file'] - - cost_data = pd.read_csv(filename, index_col=0) - - # Cylindrical shell - - radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - for i in range(len(radial_build)): - - material = radial_build['material'][i] - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})]) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - - # print(radial_build.to_string()) - - # End cap - V_end_cap = np.pi * thickness * radius**2 - M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] - C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] - - # print('End Cap: $', C_end_cap) - # print('Cylindrical Part: $', radial_build['cost'].max()) - - total = 2*C_end_cap + radial_build['cost'].max() - - # print('Total: $', total) - - return(total) - - @staticmethod - def HF_magnet_shield_cost(inputs, verbose=False): - r""" - The HF coils have annular shield with a U-shaped cross section: - - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - \ | | / - \ | | / - \ | | / - \| |/ - +--------+ - - - - - - - - - - - - - - Center Line - - - +--------+ - /| |\ - / | | \ - / | | \ - / | | \ - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - - - """ - - # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) - # It's a reasonable assumption to say that all axial widths/layers will be the same - - - filename = inputs['cost_file'] - cost_data = pd.read_csv(filename, index_col=0) - - # Eventually these will be arguments - material = 'W' - a_M = 0.15 # From Frank - a_CC = 0.54 # From Frank - a_0 = 0.7 - - # Radially Inner Cylinder - # length = 4.5 # End plug length from Frank - length = 0.5 # Is this the required shielding thickness? - a_M = 0.15 - r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding - r_vv = 0.01 # Reduced from 0.1 to 0.01 - - # r_magnet = 1.0 # original - r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses - r_cryostat = 1.0 - - f_vol = 0.90 - - - r_in = a_M + r_gap + r_vv - r_out = r_magnet - r_cryostat - - V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol - - # Central Cell Cylinder - # length_cc_cylinder = 50.0 - length_cc_cylinder = 0.5 - r_in_cc = a_CC + r_gap + r_vv - # r_out_cc = 1.0 - r_out_cc = r_in_cc+0.5 - - V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol - - # Central Cell Triangular Washer - V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol - - # End Plug Cylinder - length_ep_cylinder = 0.5 # From Frank - r_in_ep = a_0 + r_gap + r_vv - r_out_ep = r_in_ep + 0.5 - - V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol - - # End Cell Triangular Washer - V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol - - # For central cell facing magnet, add up all five regions - V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle - - # For expander cell facing magnet, only add up three regions - # No neutrons come from the expander cell - V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle - - # Summary information - V_total = V_total_cc_facing + V_total_ec_facing - mass = cost_data.loc[material]['density'] * V_total - cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass - - return(cost) - - ### MNyberg's Magnet Methods ### # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 From 992f024bffe1b479fcf73c76038e8b01b3f5010e Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sun, 2 Aug 2026 11:45:20 -0500 Subject: [PATCH 16/23] Make Mirror shield and expander costs super variables --- src/Algorithm/MirrorFunc.py | 49 ++++++++++ src/accertdb.sqlite | Bin 1105920 -> 1105920 bytes src/accertdb_sqlite_schema_data.sql | 58 ++++++------ src/etc/accert.sch | 4 +- src/scripts/build_mirror_accert_tables.py | 88 +++++++++++++++++- test/test_mirror_model.py | 50 ++++++++-- tutorial/accert/ref_tables/MirrorFunc.py | 49 ++++++++++ tutorial/accert/ref_tables/mirror_account.csv | 2 +- .../accert/ref_tables/mirror_algorithm.csv | 2 + .../accert/ref_tables/mirror_variable.csv | 54 +++++------ 10 files changed, 289 insertions(+), 67 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index fe43d89..cf305cf 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -198,6 +198,55 @@ def cal_first_wall_cost(firstwall_vol, Be_rho, Be_c_raw, Be_m): @staticmethod def cal_blanket_cost(blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m): return blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6 + + @staticmethod + def cal_expander_cell_cost_result( + L_EC, + a_EC, + expander_cell_vessel_thickness, + SS316_rho, + SS316_c_raw, + SS316_m, + ): + vessel_outer_radius = a_EC + expander_cell_vessel_thickness + vessel_volume = np.pi * L_EC * (vessel_outer_radius**2 - a_EC**2) + end_cap_volume = np.pi * expander_cell_vessel_thickness * a_EC**2 + return (vessel_volume + 2 * end_cap_volume) * SS316_rho * SS316_c_raw * SS316_m / 1e6 + + @staticmethod + def cal_HF_magnet_shield_cost( + a_M, + a_CC, + a_0, + length, + r_gap, + r_vv, + r_magnet, + r_cryostat, + f_vol, + length_cc_cylinder, + length_ep_cylinder, + W_rho, + W_c_raw, + W_m, + ): + r_in = a_M + r_gap + r_vv + r_out = r_magnet - r_cryostat + v_inner = np.pi * length * (r_out**2 - r_in**2) * f_vol + + r_in_cc = a_CC + r_gap + r_vv + r_out_cc = r_in_cc + 0.5 + v_cc_cylinder = np.pi * length_cc_cylinder * (r_out_cc**2 - r_in_cc**2) * f_vol + v_cc_triangle = np.pi * length_cc_cylinder / 3 * (r_in_cc - r_in) * (r_in + 2 * r_in_cc) * f_vol + + r_in_ep = a_0 + r_gap + r_vv + r_out_ep = r_in_ep + 0.5 + v_ep_cylinder = np.pi * length_ep_cylinder * (r_out_ep**2 - r_in_ep**2) * f_vol + v_ep_triangle = np.pi * length_ep_cylinder / 3 * (r_in_ep - r_in) * (r_in + 2 * r_in_ep) * f_vol + + v_total_cc_facing = v_inner + v_cc_cylinder + v_cc_triangle + v_ep_cylinder + v_ep_triangle + v_total_ec_facing = v_inner + v_ep_cylinder + v_ep_triangle + return (v_total_cc_facing + v_total_ec_facing) * W_rho * W_c_raw * W_m / 1e6 ### Account Methods: ### diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index e4240f266517791387030fa79beef0caf4e152f3..8e4d3f8bcd108dd2faadaa8ecb5fc813ee43737c 100644 GIT binary patch delta 3985 zcmbVP33L=i8t&?2`kt;BNFaetha~1UHvx;r#A0o)Qb|#ZaGB{UyCIg8=($Od) z3t?GPx(B+ruKQLcvOZ~a4-W)EaY0>mU9W(vn zD|i;YSU!>WD%D9=-RTGOe3>kXS){Mo_O%5AlCdwkkI%Zlzku zQds*L`|I|{?019tcE84D&pUXP2i$RPANO0Xk85F@ z*;6I+#u!)9|{jD&uw@1&qKiz%5ufH z&MpCm!LX_IMuyCxW2cmq?%H)hr@z^)t1h?Kt45rzjt-w1afd=~uj&ef!fJ~i@Tp#R ztJBq~F7oJlKv!Gc0iQdpcRGSIGqYw#cKbYDuP5MlIlY=YE>5$=X_f#@cZWK>;e}dl zO@Zo+*5?gEU0pCSy+B>QysTuprndz~K3$sbTs!jPGygiIPyl^>T51dk7L+4H@sp#mil2JHG z6hK;Bz8DQrvoq|pv`iEPFge~Mc>KYRa0qP~R;Hn;ra>zMcY;j-$?+jJpEiA= z$C`K*3SEkoMtqH1mI8%G2JLj4Ot7^P^bBvt$ue{3$=ON-sS-tEJizCg@PFSkFGiT z@f|QNpk6hCn^>0`33xkv?(g8E=BX>KC6B(N>mB{_sYPmudwLvHy;tf2s8@`{^jr8; z{ZbG^%NSU&;yi3!2*4P2>pJ|dafe`obAldhgauao%E__ts^+UG&;@^#nwytbsuo5u zjK6Ymdnq0ioe&*Rh5xJx(ayY4NaN-hyhnVD{axs%S;4>~0=0zeMJ$9GiQg>{mXh3k z=G_pUVCPJw9AK;khz2~APSrLCJcT(B5lqG@9 zJhub_xTgnKCU_L?WZ3@Q-R&DPJ~99BI9!?1ji)RCO@y*v=~Hs;AJ})>4f`xRC!dy& z%BH+i-Yf^?Yvs9euFOkkrGH3&#$2>f@=L3vnc|CLSmcFA1+O6T&+zSh2KObmm0Qc* zz|G;NfhLY)KVn~EA7Src-R#wDx$Se?4x86D(*~GBOh2=n$)f)|h2BMn=~_C8I!T$- z2C9bQ$s^=l#-=Vp-znh(d}<8 z40=0S3tOBnkH1wN8G-R?O>zujUvcqW4EAWO&7t*BCHIuVSu|>$4t;Cdy0F^TnA)zm zT9<1KwJx_mtUJAh7B~JN)d*C=yzYhTFa^wy>08&L;axTAS$vDNU`EEw?R14PFFQUw zY?YTv#&l=#S^=al=c7Set7|U36O*jUAtchybQu z88a`U$Jt_3T#P;9!W>^*D$-hq04BD_Bz5RoBodXkoQvTPiS-wSCTT?C0ZUq{zQcWTAw`Hvy2S`fySGvsrQEY78}^@)~f z89Ndy+HtJoPP99ihWBNIn0dvg!O!%6(rx6~P!1L&RFI)ub`fLy(d$RiFDQma%hek(pF zZV{WsOyN^uuW-AtR7mEJ@jLiyxYOK&oR=$Q&#;5+8n(#xk?nrWftNEw48jbULm#L2 zf}es0dN%bsy>R9A@aiQCQeGvJ_rk{*V&(sjLrK&GuA zlPwnx4Z_MvjeUtu@a-6g|-o5Bg+gF;PbRoRZ&`PAm6HTckpz zQXCR%gkj+>VX?sR2l(6gLT;Gb#re1#_9SbvoouDJ)%GvjW?LciKl>@>A!ZemLJ!fu zq}R}8)ECsBsCFuk{FwYB86c~`*WfA83mn83#C`%T>!-6#V;g*uPO>!-Ld@NzMw>t; zIxTN2QT+fcO&>G)EHqkiP^vB0DpB76ykg>*!_Wrx9lb1u`im$p3}EjtGM_GQV=`wTCey8XQk#dXk&q3?ZDK+ x5H|e<#OiPzzJ+cN_M~hN_WPweqeUQ-9TpNR(NhC3XPhW??0{>~Z|;TK{{f#e=STnm delta 2474 zcmZt{Yfx0z`JDT{ckjLDAmAcz1QkVu74d}uH$K33jB!k(ad$-!8(45z6$FJ#q;=Ge z5F5^zm>M6AiJD^Tlv|xNdQtgaBbsQ6h}3HjP$#mfeOw`DVT|_k8d3y>9i{ zS=DD})kOpy2LS3|2(H$TPlLw|XRQ;~I+NMf+VH@OX#v1YF&NMj*3JHQWJB}f-H(4uro-T{z_9Qt3 z#*v4ULHnsx1xYt#eNfNtIHLHTf^fKRk z+=XUAP6z>$>2)G;ccZ^@!c(w{-d-h7I?yuGcLz;lSAghxdpMbM7iF>epo`ElwVV0( zP%`9Bf)GF&de9gm_MvD_2?nwC_DFK-A&O6+p@dl!7!wG^l3QHrb*y!HUA}-Q6CGo} z^Od}ZB^SO!En1?kz^s6Q=@ zq;9r(J`87y4b^xe!#*XGs__hl3nHFsyp=u2-Xo8y@shY(Jm%-HjjBh&Dv-t~_oYbr zgtD7G$M^8fted@Ot}*Z;W>^qAidj?Wa=(%1b@*}$u9L6d#G~O=!fwZj@G@z96Nj5g z+i{DfO4HN9N^l#XUi1|@i3oC`7f=G?^?toozo@^ZzXERSl6FJep)G`mG+sTg{sJyh zvsK1&$+F9`Km&W&-1DrDr`Tg-qXuvq{ne+K{t*(Q5NvDW1-aPpVR&%_P#K_Oe*CIv#vyJ$a2y^DsEoO>vm z%)EmdiM<;o>pYDTqNl!7Lr=}1Slo*SX{tGpf+23I!{4g#3hCO9UxnAq8SmjsOx1Ic z4!QtpMh$2siqr4vAL|}HN9)jzXdAQ)4XW4GgQ`oNXnAb8X!(`p6-%_zs+>@qN*Hb6 z!?H_`m0G3urPWf1*d`KjsVE5-g?)lsn9UFHXZV@i-?<8d(YxI?dOi zh&()kW6Z?g;>#?WXQU|1ylI2uBY{RT@E#5&{T!A_-BBE)jyER!U(HIKAK`fOHy>f1 zHLq;Iu}srUTAE^U377;<19Sjo>TUW)JyA`y+_KbIGL*;4DWy~imv71M%CE_x^e1>k z%9j$fe~4d-AFXIQ;G#N6>2{u@;1*Dy4^&HjKZzrgnJxiwH>;#Uj?EJ3(zS(xa z=-6n@cv#rX8lW&S%Lm^eLEsni6cqbK3a?|m=_P!a7aJOK9zH(5$2_(iuLw8cNj!l5 E2N`d`bN~PV diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index baf021e..4a7e40f 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -7018,6 +7018,8 @@ INSERT INTO mirror_alg VALUES(110,'cal_firstwall_vol','v','Mirror generated vari INSERT INTO mirror_alg VALUES(111,'cal_blanket1_vol','v','Mirror generated variable calculation for blanket1_vol','MirrorFunc','blanket1_vol = pi * chamber_length * ((axis_t + plasma_t + vacuum_t + firstwall_t + blanket1_t)**2 - (axis_t + plasma_t + vacuum_t + firstwall_t)**2)','m3'); INSERT INTO mirror_alg VALUES(112,'cal_first_wall_cost','v','Mirror generated variable calculation for first_wall_cost','MirrorFunc','first_wall_cost = firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6','million'); INSERT INTO mirror_alg VALUES(113,'cal_blanket_cost','v','Mirror generated variable calculation for blanket_cost','MirrorFunc','blanket_cost = blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6','million'); +INSERT INTO mirror_alg VALUES(114,'cal_expander_cell_cost_result','v','Mirror generated variable calculation for expander_cell_cost_result','MirrorFunc','expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6','million'); +INSERT INTO mirror_alg VALUES(115,'cal_HF_magnet_shield_cost','v','Mirror generated variable calculation for HF_magnet_shield_cost','MirrorFunc','HF_magnet_shield_cost = legacy shield volume geometry * W_rho * W_c_raw * W_m / 1e6','million'); CREATE TABLE mirror_var ( ind INTEGER DEFAULT NULL, var_name TEXT NOT NULL, @@ -7043,7 +7045,7 @@ INSERT INTO mirror_var VALUES(10,'inputs','str','','1','','','',''); INSERT INTO mirror_var VALUES(11,'cost_data','str','','1','','','',''); INSERT INTO mirror_var VALUES(12,'L_magnet_to_magnet','str','','1','','','',''); INSERT INTO mirror_var VALUES(13,'L_cylinder','str','','1','','','',''); -INSERT INTO mirror_var VALUES(14,'expander_cell_cost_result','str','','1','','','',''); +INSERT INTO mirror_var VALUES(14,'expander_cell_cost_result','Expander cell vacuum vessel cost from legacy Mirror geometry',0.003960744088457411084,'million','cal_expander_cell_cost_result','L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m','',0); INSERT INTO mirror_var VALUES(15,'end_plug_cylindrical_part','str','','1','','','',''); INSERT INTO mirror_var VALUES(16,'end_plug_cylindrical_part_cost','str','','1','','','',''); INSERT INTO mirror_var VALUES(17,'central_cell_cylindrical_part','str','','1','','','',''); @@ -7141,22 +7143,22 @@ INSERT INTO mirror_var VALUES(108,'M_end_cap','str','','1','','','',''); INSERT INTO mirror_var VALUES(109,'C_end_cap','str','','1','','','',''); INSERT INTO mirror_var VALUES(110,'total','str','','1','','','',''); INSERT INTO mirror_var VALUES(111,'cost','float',29.10000000000000142,'1','','','',''); -INSERT INTO mirror_var VALUES(112,'a_M','float',0.1499999999999999945,'1','','','',''); -INSERT INTO mirror_var VALUES(113,'a_CC','float',0.5400000000000000355,'1','','','',''); -INSERT INTO mirror_var VALUES(114,'a_0','float',0.6999999999999999556,'1','','','',''); -INSERT INTO mirror_var VALUES(115,'length','float',0.5,'1','','','',''); -INSERT INTO mirror_var VALUES(116,'r_gap','float',0.1000000000000000055,'1','','','',''); -INSERT INTO mirror_var VALUES(117,'r_vv','float',0.0100000000000000002,'1','','','',''); -INSERT INTO mirror_var VALUES(118,'r_magnet','float',1.5,'m','','','',''); -INSERT INTO mirror_var VALUES(119,'r_cryostat','float',1.0,'1','','','',''); -INSERT INTO mirror_var VALUES(120,'f_vol','float',0.9000000000000000222,'1','','','',''); +INSERT INTO mirror_var VALUES(112,'a_M','HF shield magnet bore/plasma radius from legacy Mirror geometry',0.1499999999999999945,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(113,'a_CC','Legacy Mirror central cell plasma radius',0.5400000000000000355,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(114,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.6999999999999999556,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(115,'length','HF shield radially inner cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(116,'r_gap','HF shield radial gap',0.1000000000000000055,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(117,'r_vv','HF shield vacuum vessel radial thickness allowance',0.0100000000000000002,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(118,'r_magnet','HF shield magnet radius',1.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(119,'r_cryostat','HF shield cryostat radius allowance',1.0,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(120,'f_vol','HF shield volume fill fraction',0.9000000000000000222,'1','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(121,'V_radially_inner_cylinder','str','','1','','','',''); -INSERT INTO mirror_var VALUES(122,'length_cc_cylinder','float',0.5,'1','','','',''); +INSERT INTO mirror_var VALUES(122,'length_cc_cylinder','HF shield central-cell-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(123,'r_in_cc','str','','1','','','',''); INSERT INTO mirror_var VALUES(124,'r_out_cc','str','','1','','','',''); INSERT INTO mirror_var VALUES(125,'V_cc_cylinder','str','','1','','','',''); INSERT INTO mirror_var VALUES(126,'V_cc_triangle','str','','1','','','',''); -INSERT INTO mirror_var VALUES(127,'length_ep_cylinder','float',0.5,'1','','','',''); +INSERT INTO mirror_var VALUES(127,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(128,'r_in_ep','str','','1','','','',''); INSERT INTO mirror_var VALUES(129,'r_out_ep','str','','1','','','',''); INSERT INTO mirror_var VALUES(130,'V_ep_cylinder','str','','1','','','',''); @@ -7203,8 +7205,8 @@ INSERT INTO mirror_var VALUES(170,'include_licensing','Mirror input parameter',0 INSERT INTO mirror_var VALUES(171,'include_contingency','Mirror input parameter',0.0,'1','','','',0); INSERT INTO mirror_var VALUES(172,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); INSERT INTO mirror_var VALUES(173,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(174,'a_EC','Mirror input parameter',1.0,'m','','','V_vac',0); -INSERT INTO mirror_var VALUES(175,'expander_cell_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); +INSERT INTO mirror_var VALUES(174,'a_EC','Mirror input parameter',1.0,'m','','','V_vac, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(175,'expander_cell_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','expander_cell_cost_result',0); INSERT INTO mirror_var VALUES(176,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); INSERT INTO mirror_var VALUES(177,'vacuum_gap_CC','Mirror input parameter',0.0100000000000000002,'m','','','',0); INSERT INTO mirror_var VALUES(178,'first_wall_material','Mirror input parameter','W','1','','','',0); @@ -7220,19 +7222,19 @@ INSERT INTO mirror_var VALUES(187,'blanket_structural_material','Mirror input pa INSERT INTO mirror_var VALUES(188,'blanket_structural_fraction','Mirror input parameter',0.1000000000000000055,'1','','','',0); INSERT INTO mirror_var VALUES(189,'outer_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','',0); INSERT INTO mirror_var VALUES(190,'L_EP','Mirror input parameter',1.0,'m','','','L',0); -INSERT INTO mirror_var VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L',0); +INSERT INTO mirror_var VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L, expander_cell_cost_result',0); INSERT INTO mirror_var VALUES(192,'a_EP','Mirror input parameter',1.0,'m','','','',0); INSERT INTO mirror_var VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','HF_magnet_cost',0); INSERT INTO mirror_var VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','LF_magnet_cost',0); INSERT INTO mirror_var VALUES(195,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); INSERT INTO mirror_var VALUES(196,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); INSERT INTO mirror_var VALUES(197,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); -INSERT INTO mirror_var VALUES(198,'HF_magnet_shield_cost','HF magnet shield cost per end plug',47.36847786999999954,'million','','','',0); -INSERT INTO mirror_var VALUES(199,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); -INSERT INTO mirror_var VALUES(200,'firstwall_vol','Mirror generated parameter',38.07610296150821937,'m3','cal_firstwall_vol','chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t','first_wall_cost',0); -INSERT INTO mirror_var VALUES(201,'blanket1_vol','Mirror generated parameter',422.2300526424680243,'m3','cal_blanket1_vol','chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t','blanket_cost',0); -INSERT INTO mirror_var VALUES(202,'first_wall_cost','Mirror generated parameter',1215.103635759131294,'million','cal_first_wall_cost','firstwall_vol, Be_rho, Be_c_raw, Be_m','',0); -INSERT INTO mirror_var VALUES(203,'blanket_cost','Mirror generated parameter',2.018259651630997187,'million','cal_blanket_cost','blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m','',0); +INSERT INTO mirror_var VALUES(198,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); +INSERT INTO mirror_var VALUES(199,'firstwall_vol','Mirror generated parameter',38.07610296150821937,'m3','cal_firstwall_vol','chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t','first_wall_cost',0); +INSERT INTO mirror_var VALUES(200,'blanket1_vol','Mirror generated parameter',422.2300526424680243,'m3','cal_blanket1_vol','chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t','blanket_cost',0); +INSERT INTO mirror_var VALUES(201,'first_wall_cost','Mirror generated parameter',1215.103635759131294,'million','cal_first_wall_cost','firstwall_vol, Be_rho, Be_c_raw, Be_m','',0); +INSERT INTO mirror_var VALUES(202,'blanket_cost','Mirror generated parameter',2.018259651630997187,'million','cal_blanket_cost','blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m','',0); +INSERT INTO mirror_var VALUES(203,'HF_magnet_shield_cost','HF magnet shield cost per end plug',35.00849418659200297,'million','cal_HF_magnet_shield_cost','a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m','',0); INSERT INTO mirror_var VALUES(204,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','blanket1_vol, firstwall_vol',0); INSERT INTO mirror_var VALUES(205,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','blanket1_vol, firstwall_vol',0); INSERT INTO mirror_var VALUES(206,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','blanket1_vol, firstwall_vol',0); @@ -7259,9 +7261,9 @@ INSERT INTO mirror_var VALUES(226,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw INSERT INTO mirror_var VALUES(227,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','blanket_cost',0); INSERT INTO mirror_var VALUES(228,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); INSERT INTO mirror_var VALUES(229,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(230,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(231,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(232,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(230,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(231,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(232,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(233,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); INSERT INTO mirror_var VALUES(234,'Li_c_raw','PyFECONS Lithium raw cost',70.0,'dollar/kg','','','',0); INSERT INTO mirror_var VALUES(235,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); @@ -7285,9 +7287,9 @@ INSERT INTO mirror_var VALUES(252,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3' INSERT INTO mirror_var VALUES(253,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); INSERT INTO mirror_var VALUES(254,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); INSERT INTO mirror_var VALUES(255,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(256,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(257,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(258,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(256,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(257,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(258,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','expander_cell_cost_result',0); INSERT INTO mirror_var VALUES(259,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); INSERT INTO mirror_var VALUES(260,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); INSERT INTO mirror_var VALUES(261,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); @@ -7331,7 +7333,7 @@ INSERT INTO mirror_acco VALUES(28,'2117','Ventilation_Stack',4269265.63200000021 INSERT INTO mirror_acco VALUES(29,'22','Heat_Island_Plant_Equipment',1111998920.0,1,'20','Unchanged',0.2155312402541442185,'','million','rollup'); INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',901967566.7999999524,2,'22','Unchanged',0.1748222816092453169,'','million','rollup'); INSERT INTO mirror_acco VALUES(31,'2211','First_Wall_and_Blanket',1217121895.41076231,3,'221','Unchanged',0.00837189162568348702,'Account_C22_1_1','million','first_wall_cost, blanket_cost'); -INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',94736955.7399999947,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million','HF_magnet_shield_cost'); +INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',70016988.37318401038,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million','HF_magnet_shield_cost'); INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'','million','rollup'); INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number, HF_magnet_cost'); INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number, LF_magnet_cost'); diff --git a/src/etc/accert.sch b/src/etc/accert.sch index c33074c..c8e3581 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -797,8 +797,8 @@ heatpipe_var_names = ['land_surface_area' 'containment_subVolume' 'Containment_h fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'anncap' 'anncdr' 'anncp' 'anndecom' 'anndiv' 'annfuel' 'annfwbl' 'annoam' 'annwst' 'areaoh' 'awpoh' 'b0' 'bktlife' 'blmass' 'capcost' 'cconfix' 'cconshpf' 'cconshtf' 'cdcost' 'cdirt' 'cdriv0' 'cdriv1' 'cdriv2' 'cdriv3' 'cdrlife' 'cfactr' 'cfind_0' 'cfind_1' 'cfind_2' 'cfind_3' 'cland' 'clgsmass' 'cmlsa' 'coecdr' 'coecp' 'coediv' 'coefuel' 'coefwbl' 'coewst' 'coilmass' 'convol' 'coolmass' 'coolwh' 'cowner' 'cplife' 'cpstcst' 'cpttf' 'crfcdr' 'crfcp' 'crfdiv' 'crffwbl' 'crypmw' 'cryvol' 'csi' 'cturbb' 'd_0' 'd_1' 'd_2' 'd_3' 'dcdrv0' 'dcdrv1' 'dcdrv2' 'dcond_0' 'dcond_1' 'dcond_2' 'dcond_3' 'dcond_4' 'dcond_5' 'dcond_6' 'dcond_7' 'dcond_8' 'dcopper' 'decomf' 'dens' 'denstl' 'dintrt' 'discount_rate' 'divcst' 'divlife' 'divsur' 'dlscal' 'drbi' 'dtlife' 'dtstor' 'dvrtmass' 'ealphadt' 'echarge' 'echpwr' 'edrive' 'effrfss' 'elevol' 'ensxpfm' 'esbldgm3' 'estotftgj' 'etadrv' 'expcry' 'expel' 'expepe' 'exphts' 'exprb' 'exprf' 'exptpe' 'faccd' 'faccdfix' 'fachtmw' 'fburn' 'fcap0' 'fcap0cp' 'fcdfuel' 'fcontng' 'fcr0' 'fcsht' 'fcuohsu' 'fcupfsu' 'fefcdr' 'fefcp' 'fefdiv' 'feffwbl' 'fhe3' 'fkind' 'fncmass' 'fndt' 'ftrit' 'fusionrate' 'fwallcst' 'fwarea' 'fwbllife' 'fwmass' 'fwmatm' 'gain' 'gsmass' 'hccl' 'hcwt' 'helpow' 'hrbi' 'i_tf_sc_mat' 'i_tf_sup' 'iblanket' 'iefrf' 'ife' 'ifedrv' 'ifueltyp' 'imax' 'intercoil_surface' 'iohcl' 'ipfres' 'ireactor' 'istore' 'isumatoh' 'isumatpf' 'itart' 'l1' 'lpulse' 'lsa' 'ltot' 'mbvfac' 'mcdriv' 'n_day_year' 'n_tf' 'n_tf_turn' 'nohc' 'nphx' 'ntype' 'nvduct' 'oh_steel_frac' 'pacpmw' 'palpnb' 'peakmva' 'pfbldgm3' 'pfckts' 'pfmass' 'pfwdiv' 'pfwndl' 'pgrossmw' 'pheat' 'pibv' 'pinjht' 'pinjwp' 'plascur' 'plhybd' 'pnbitot' 'pnetelmw' 'pnucblkt' 'pnucshld' 'powfmw' 'pthermmw' 'r0' 'rbrt' 'rbvfac' 'rbvol' 'rbwt' 'reprat' 'ric_0' 'ric_1' 'ric_2' 'ric_3' 'ric_4' 'ric_5' 'ric_6' 'rjconpf_0' 'rjconpf_1' 'rjconpf_10' 'rjconpf_11' 'rjconpf_12' 'rjconpf_13' 'rjconpf_14' 'rjconpf_15' 'rjconpf_16' 'rjconpf_17' 'rjconpf_18' 'rjconpf_19' 'rjconpf_2' 'rjconpf_20' 'rjconpf_21' 'rjconpf_3' 'rjconpf_4' 'rjconpf_5' 'rjconpf_6' 'rjconpf_7' 'rjconpf_8' 'rjconpf_9' 'rmbvol' 'rndfuel' 'rpf_0' 'rpf_1' 'rpf_2' 'rpf_3' 'rpf_4' 'rpf_5' 'rpf_6' 'shh' 'shldmass' 'shm' 'shmatm' 'shmf' 'shovol' 'shri' 'shro' 'sigal' 'spfbusl' 'srcktpm' 'st_f_b' 'st_f_n' 'st_f_r' 'stcl' 'stella_config_coillength' 'stella_config_coilsurface' 'targtm' 'tburn' 'tcycle' 'tdown' 'tdspmw' 'tf_h_width' 'tfacmw' 'tfbusl' 'tfbusmas' 'tfcbv' 'tfckw' 'tfcmw' 'tfhmax' 'tfleng' 'tfmass' 'tftort' 'tlife' 'tlvpmw' 'tmpcry' 'trcl' 'trithtmw' 'triv' 'turns_0' 'turns_1' 'turns_2' 'turns_3' 'turns_4' 'turns_5' 'turns_6' 'twopi' 'ucad' 'ucaf' 'ucahts' 'ucap' 'ucblbe' 'ucblbreed' 'ucblli' 'ucblli2o' 'ucbllipb' 'ucblss' 'ucblvd' 'ucbpmp' 'ucbus' 'uccarb' 'uccase' 'ucco' 'ucconc' 'uccpcl1' 'uccpclb' 'uccpmp' 'uccr' 'uccry' 'uccryo' 'uccu' 'ucdgen' 'ucdiv' 'ucdtc' 'ucduct' 'ucech' 'ucel' 'ucf1' 'ucfnc' 'ucfpr' 'ucfuel' 'ucfwa' 'ucfwps' 'ucfws' 'ucgss' 'uche3' 'uchrs' 'uchts_0' 'uchts_1' 'uciac' 'ucich' 'ucint' 'uclh' 'uclv' 'ucmb' 'ucme' 'ucmisc' 'ucnbi' 'ucnbv' 'ucoam_0' 'ucoam_1' 'ucoam_2' 'ucoam_3' 'ucpens' 'ucpfb' 'ucpfbk' 'ucpfbs' 'ucpfcb' 'ucpfdr1' 'ucpfic' 'ucpfps' 'ucphx' 'ucpp' 'ucrb' 'ucsc_0' 'ucsc_1' 'ucsc_2' 'ucsc_3' 'ucsc_4' 'ucsc_5' 'ucsc_6' 'ucsc_7' 'ucsc_8' 'ucsh' 'ucshld' 'ucswyd' 'uctarg' 'uctfbr' 'uctfbus' 'uctfdr' 'uctfgr' 'uctfic' 'uctfps' 'uctfsw' 'uctpmp' 'uctr' 'ucturb_0' 'ucturb_1' 'ucvalv' 'ucvdsh' 'ucviac' 'ucwindpf' 'ucwindtf' 'ucws' 'ucwst_0' 'ucwst_1' 'ucwst_2' 'ucwst_3' 'umass' 'vacdshm' 'vachtmw' 'vcdimax' 'vf' 'vfohc' 'vol' 'volrci' 'vpfskv' 'vpumpn' 'vtfskv' 'vvmass' 'wgt2' 'whtblbe' 'whtblbreed' 'whtblli' 'whtblss' 'whtblvd' 'whtcas' 'whtconcu' 'whtconsc' 'whtcp' 'whtpfs' 'whtshld' 'whttflgs' 'wpenshld' 'wrbi' 'wsvfac' 'wsvol' 'wtblli2o' 'wtbllipb' 'wtgpd'] stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] -mirror_alg_names = ['Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_HF_magnet_cost' 'cal_LF_magnet_cost' 'cal_CF_magnet_cost' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number' 'cal_firstwall_vol' 'cal_blanket1_vol' 'cal_first_wall_cost' 'cal_blanket_cost'] -mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'HF_magnet_shield_cost' 'CF_magnet_number' 'firstwall_vol' 'blanket1_vol' 'first_wall_cost' 'blanket_cost' 'chamber_length' 'plasma_t' 'vacuum_t' 'firstwall_t' 'blanket1_t' 'reflector_t' 'ht_shield_t' 'structure_t' 'gap1_t' 'vessel_t' 'coil_t' 'gap2_t' 'lt_shield_t' 'bioshield_t' 'FS_rho' 'FS_c_raw' 'FS_m' 'FS_sigma' 'Pb_rho' 'Pb_c_raw' 'Pb_m' 'Li4SiO4_rho' 'Li4SiO4_c_raw' 'Li4SiO4_m' 'FLiBe_rho' 'FLiBe_c' 'W_rho' 'W_c_raw' 'W_m' 'Li_rho' 'Li_c_raw' 'Li_m' 'BFS_rho' 'BFS_c_raw' 'BFS_m' 'SiC_rho' 'SiC_c_raw' 'SiC_m' 'Inconel_rho' 'Inconel_c_raw' 'Inconel_m' 'Cu_rho' 'Cu_c_raw' 'Cu_m' 'Polyimide_rho' 'Polyimide_c_raw' 'Polyimide_m' 'YBCO_rho' 'YBCO_c' 'Concrete_rho' 'Concrete_c_raw' 'Concrete_m' 'SS316_rho' 'SS316_c_raw' 'SS316_m' 'SS316_sigma' 'Nb3Sn_c' 'Incoloy_rho' 'Incoloy_c_raw' 'Incoloy_m' 'Be_rho' 'Be_c_raw' 'Be_m' 'Li2TiO3_rho' 'Li2TiO3_c_raw' 'Li2TiO3_m'] +mirror_alg_names = ['Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_HF_magnet_cost' 'cal_LF_magnet_cost' 'cal_CF_magnet_cost' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number' 'cal_firstwall_vol' 'cal_blanket1_vol' 'cal_first_wall_cost' 'cal_blanket_cost' 'cal_expander_cell_cost_result' 'cal_HF_magnet_shield_cost'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number' 'firstwall_vol' 'blanket1_vol' 'first_wall_cost' 'blanket_cost' 'HF_magnet_shield_cost' 'chamber_length' 'plasma_t' 'vacuum_t' 'firstwall_t' 'blanket1_t' 'reflector_t' 'ht_shield_t' 'structure_t' 'gap1_t' 'vessel_t' 'coil_t' 'gap2_t' 'lt_shield_t' 'bioshield_t' 'FS_rho' 'FS_c_raw' 'FS_m' 'FS_sigma' 'Pb_rho' 'Pb_c_raw' 'Pb_m' 'Li4SiO4_rho' 'Li4SiO4_c_raw' 'Li4SiO4_m' 'FLiBe_rho' 'FLiBe_c' 'W_rho' 'W_c_raw' 'W_m' 'Li_rho' 'Li_c_raw' 'Li_m' 'BFS_rho' 'BFS_c_raw' 'BFS_m' 'SiC_rho' 'SiC_c_raw' 'SiC_m' 'Inconel_rho' 'Inconel_c_raw' 'Inconel_m' 'Cu_rho' 'Cu_c_raw' 'Cu_m' 'Polyimide_rho' 'Polyimide_c_raw' 'Polyimide_m' 'YBCO_rho' 'YBCO_c' 'Concrete_rho' 'Concrete_c_raw' 'Concrete_m' 'SS316_rho' 'SS316_c_raw' 'SS316_m' 'SS316_sigma' 'Nb3Sn_c' 'Incoloy_rho' 'Incoloy_c_raw' 'Incoloy_m' 'Be_rho' 'Be_c_raw' 'Be_m' 'Li2TiO3_rho' 'Li2TiO3_c_raw' 'Li2TiO3_m'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index d064f39..cdd1beb 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -148,7 +148,6 @@ "HF_magnet_cost": (29.1, "million"), "LF_magnet_cost": (6.25262, "million"), "CF_magnet_cost": (2.751, "million"), - "HF_magnet_shield_cost": (47.36847787, "million"), "CF_magnet_number": (52.0300751726645, "1"), "P_egross": (158.12094932835822, "MW"), "P_DECe": (63.01790788032513, "MW"), @@ -235,6 +234,13 @@ "blanket1_vol": "chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t", "first_wall_cost": "firstwall_vol, Be_rho, Be_c_raw, Be_m", "blanket_cost": "blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m", + "expander_cell_cost_result": ( + "L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m" + ), + "HF_magnet_shield_cost": ( + "a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, " + "length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m" + ), } MIRROR_GENERATED_VAR_FORMULAS = { @@ -289,6 +295,14 @@ ), "first_wall_cost": ("first_wall_cost = firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6", "million"), "blanket_cost": ("blanket_cost = blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6", "million"), + "expander_cell_cost_result": ( + "expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6", + "million", + ), + "HF_magnet_shield_cost": ( + "HF_magnet_shield_cost = legacy shield volume geometry * W_rho * W_c_raw * W_m / 1e6", + "million", + ), } MIRROR_CONSTANT_DEFAULTS = { @@ -342,6 +356,22 @@ None, "million", ), + "expander_cell_cost_result": ( + "Expander cell vacuum vessel cost from legacy Mirror geometry", + None, + "million", + ), + "a_CC": ("Legacy Mirror central cell plasma radius", 0.54, "m"), + "a_M": ("HF shield magnet bore/plasma radius from legacy Mirror geometry", 0.15, "m"), + "a_0": ("HF shield end plug plasma radius from legacy Mirror geometry", 0.7, "m"), + "length": ("HF shield radially inner cylinder length", 0.5, "m"), + "r_gap": ("HF shield radial gap", 0.1, "m"), + "r_vv": ("HF shield vacuum vessel radial thickness allowance", 0.01, "m"), + "r_magnet": ("HF shield magnet radius", 1.5, "m"), + "r_cryostat": ("HF shield cryostat radius allowance", 1.0, "m"), + "f_vol": ("HF shield volume fill fraction", 0.9, "1"), + "length_cc_cylinder": ("HF shield central-cell-facing cylinder length", 0.5, "m"), + "length_ep_cylinder": ("HF shield end-plug-facing cylinder length", 0.5, "m"), "chamber_length": ("PyFECONS magnetic mirror chamber length", 12, "m"), "axis_t": ("PyFECONS radial build axis thickness", 0, "m"), "plasma_t": ("PyFECONS radial build plasma thickness", 4.9, "m"), @@ -627,6 +657,60 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) * values["Li4SiO4_m"] / 1e6 ) + expander_vessel_outer_radius = values["a_EC"] + values["expander_cell_vessel_thickness"] + expander_vessel_volume = math.pi * values["L_EC"] * (expander_vessel_outer_radius**2 - values["a_EC"] ** 2) + expander_end_cap_volume = math.pi * values["expander_cell_vessel_thickness"] * values["a_EC"] ** 2 + generated["expander_cell_cost_result"] = ( + (expander_vessel_volume + 2 * expander_end_cap_volume) + * values["SS316_rho"] + * values["SS316_c_raw"] + * values["SS316_m"] + / 1e6 + ) + shield_r_in = values["a_M"] + values["r_gap"] + values["r_vv"] + shield_r_out = values["r_magnet"] - values["r_cryostat"] + v_radially_inner_cylinder = ( + math.pi * values["length"] * (shield_r_out**2 - shield_r_in**2) * values["f_vol"] + ) + shield_r_in_cc = values["a_CC"] + values["r_gap"] + values["r_vv"] + shield_r_out_cc = shield_r_in_cc + 0.5 + v_cc_cylinder = ( + math.pi + * values["length_cc_cylinder"] + * (shield_r_out_cc**2 - shield_r_in_cc**2) + * values["f_vol"] + ) + v_cc_triangle = ( + math.pi + * values["length_cc_cylinder"] + / 3 + * (shield_r_in_cc - shield_r_in) + * (shield_r_in + 2 * shield_r_in_cc) + * values["f_vol"] + ) + shield_r_in_ep = values["a_0"] + values["r_gap"] + values["r_vv"] + shield_r_out_ep = shield_r_in_ep + 0.5 + v_ep_cylinder = ( + math.pi + * values["length_ep_cylinder"] + * (shield_r_out_ep**2 - shield_r_in_ep**2) + * values["f_vol"] + ) + v_ep_triangle = ( + math.pi + * values["length_ep_cylinder"] + / 3 + * (shield_r_in_ep - shield_r_in) + * (shield_r_in + 2 * shield_r_in_ep) + * values["f_vol"] + ) + v_total_cc_facing = ( + v_radially_inner_cylinder + v_cc_cylinder + v_cc_triangle + v_ep_cylinder + v_ep_triangle + ) + v_total_ec_facing = v_radially_inner_cylinder + v_ep_cylinder + v_ep_triangle + generated["HF_magnet_shield_cost"] = ( + (v_total_cc_facing + v_total_ec_facing) * values["W_rho"] * values["W_c_raw"] * values["W_m"] / 1e6 + ) generated.update({name: value for name, (value, _unit) in MIRROR_REFERENCE_VAR_OVERRIDES.items()}) return generated @@ -672,6 +756,8 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: normalized_total_cost = ( generated_values["first_wall_cost"] + generated_values["blanket_cost"] ) * 1e6 + elif code == "2212": + normalized_total_cost = 2 * generated_values["HF_magnet_shield_cost"] * 1e6 conn.execute( """ INSERT INTO mirror_acco diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 680596e..9370580 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -591,26 +591,43 @@ def test_mirror_first_wall_and_blanket_use_pyfecons_scalar_defaults(cursor): ) -def test_mirror_magnet_shield_account_uses_reference_variable(cursor): +def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): cursor.execute( """ - SELECT variables + SELECT total_cost, variables FROM mirror_acco WHERE code_of_account = ?; """, ("2212",), ) - assert cursor.fetchone()[0] == "HF_magnet_shield_cost" + total_cost, variables = cursor.fetchone() + assert total_cost / 1e6 == pytest.approx(70.016988373184) + assert variables == "HF_magnet_shield_cost" cursor.execute( """ - SELECT var_description, var_value, var_unit + SELECT var_name, var_description, var_value, var_unit, var_alg, var_need FROM mirror_var - WHERE var_name = ?; + WHERE var_name IN (?, ?) + ORDER BY var_name; """, - ("HF_magnet_shield_cost",), + ("HF_magnet_shield_cost", "expander_cell_cost_result"), + ) + rows = {row[0]: row[1:] for row in cursor.fetchall()} + assert rows["HF_magnet_shield_cost"][0] == "HF magnet shield cost per end plug" + assert rows["HF_magnet_shield_cost"][1] == pytest.approx(35.008494186592) + assert rows["HF_magnet_shield_cost"][2:] == ( + "million", + "cal_HF_magnet_shield_cost", + "a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m", + ) + assert rows["expander_cell_cost_result"][0] == "Expander cell vacuum vessel cost from legacy Mirror geometry" + assert rows["expander_cell_cost_result"][1] == pytest.approx(0.003960744088457411) + assert rows["expander_cell_cost_result"][2:] == ( + "million", + "cal_expander_cell_cost_result", + "L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m", ) - assert cursor.fetchone() == ("HF magnet shield cost per end plug", 47.36847787, "million") alg = MirrorFunc( ind=1, @@ -622,7 +639,24 @@ def test_mirror_magnet_shield_account_uses_reference_variable(cursor): variables="HF_magnet_shield_cost", constants="", ) - assert alg.run({"HF_magnet_shield_cost": 47.36847787}) == pytest.approx(94.73695574) + assert alg.run({"HF_magnet_shield_cost": 35.008494186592}) == pytest.approx(70.016988373184) + + accert = Accert.__new__(Accert) + accert.var_tabl = "mirror_var" + accert.alg_tabl = "mirror_alg" + accert.cel_tabl = None + + cursor.execute( + """ + UPDATE mirror_var + SET var_value = ? + WHERE var_name = ?; + """, + (2.0, "a_EC"), + ) + assert accert.update_super_variable(cursor, "expander_cell_cost_result") is None + cursor.execute("SELECT var_value FROM mirror_var WHERE var_name = ?;", ("expander_cell_cost_result",)) + assert cursor.fetchone()[0] == pytest.approx(0.011862477930766351) def test_mirror_generated_variable_algorithm_can_recalculate(cursor): diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index fe43d89..cf305cf 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -198,6 +198,55 @@ def cal_first_wall_cost(firstwall_vol, Be_rho, Be_c_raw, Be_m): @staticmethod def cal_blanket_cost(blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m): return blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6 + + @staticmethod + def cal_expander_cell_cost_result( + L_EC, + a_EC, + expander_cell_vessel_thickness, + SS316_rho, + SS316_c_raw, + SS316_m, + ): + vessel_outer_radius = a_EC + expander_cell_vessel_thickness + vessel_volume = np.pi * L_EC * (vessel_outer_radius**2 - a_EC**2) + end_cap_volume = np.pi * expander_cell_vessel_thickness * a_EC**2 + return (vessel_volume + 2 * end_cap_volume) * SS316_rho * SS316_c_raw * SS316_m / 1e6 + + @staticmethod + def cal_HF_magnet_shield_cost( + a_M, + a_CC, + a_0, + length, + r_gap, + r_vv, + r_magnet, + r_cryostat, + f_vol, + length_cc_cylinder, + length_ep_cylinder, + W_rho, + W_c_raw, + W_m, + ): + r_in = a_M + r_gap + r_vv + r_out = r_magnet - r_cryostat + v_inner = np.pi * length * (r_out**2 - r_in**2) * f_vol + + r_in_cc = a_CC + r_gap + r_vv + r_out_cc = r_in_cc + 0.5 + v_cc_cylinder = np.pi * length_cc_cylinder * (r_out_cc**2 - r_in_cc**2) * f_vol + v_cc_triangle = np.pi * length_cc_cylinder / 3 * (r_in_cc - r_in) * (r_in + 2 * r_in_cc) * f_vol + + r_in_ep = a_0 + r_gap + r_vv + r_out_ep = r_in_ep + 0.5 + v_ep_cylinder = np.pi * length_ep_cylinder * (r_out_ep**2 - r_in_ep**2) * f_vol + v_ep_triangle = np.pi * length_ep_cylinder / 3 * (r_in_ep - r_in) * (r_in + 2 * r_in_ep) * f_vol + + v_total_cc_facing = v_inner + v_cc_cylinder + v_cc_triangle + v_ep_cylinder + v_ep_triangle + v_total_ec_facing = v_inner + v_ep_cylinder + v_ep_triangle + return (v_total_cc_facing + v_total_ec_facing) * W_rho * W_c_raw * W_m / 1e6 ### Account Methods: ### diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index 862747e..48c2295 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -30,7 +30,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 29,22,Heat_Island_Plant_Equipment,1111998920.0,1,20,Unchanged,0.21553124025414422,,million,rollup 30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,,million,rollup 31,2211,First_Wall_and_Blanket,1217121895.4107623,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"first_wall_cost, blanket_cost" -32,2212,Magnet_Radiation_Shield,94736955.74,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost +32,2212,Magnet_Radiation_Shield,70016988.37318401,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost 33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,,million,rollup 34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,"HF_magnet_number, HF_magnet_cost" 35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,"LF_magnet_number, LF_magnet_cost" diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index 6a4cd74..d842413 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -76,3 +76,5 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 111,cal_blanket1_vol,v,Mirror generated variable calculation for blanket1_vol,MirrorFunc,blanket1_vol = pi * chamber_length * ((axis_t + plasma_t + vacuum_t + firstwall_t + blanket1_t)**2 - (axis_t + plasma_t + vacuum_t + firstwall_t)**2),m3 112,cal_first_wall_cost,v,Mirror generated variable calculation for first_wall_cost,MirrorFunc,first_wall_cost = firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6,million 113,cal_blanket_cost,v,Mirror generated variable calculation for blanket_cost,MirrorFunc,blanket_cost = blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6,million +114,cal_expander_cell_cost_result,v,Mirror generated variable calculation for expander_cell_cost_result,MirrorFunc,expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6,million +115,cal_HF_magnet_shield_cost,v,Mirror generated variable calculation for HF_magnet_shield_cost,MirrorFunc,HF_magnet_shield_cost = legacy shield volume geometry * W_rho * W_c_raw * W_m / 1e6,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index fb19428..9e760e1 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -12,7 +12,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 11,cost_data,str,,1,,,, 12,L_magnet_to_magnet,str,,1,,,, 13,L_cylinder,str,,1,,,, -14,expander_cell_cost_result,str,,1,,,, +14,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 15,end_plug_cylindrical_part,str,,1,,,, 16,end_plug_cylindrical_part_cost,str,,1,,,, 17,central_cell_cylindrical_part,str,,1,,,, @@ -110,22 +110,22 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 109,C_end_cap,str,,1,,,, 110,total,str,,1,,,, 111,cost,float,29.1,1,,,, -112,a_M,float,0.15,1,,,, -113,a_CC,float,0.54,1,,,, -114,a_0,float,0.7,1,,,, -115,length,float,0.5,1,,,, -116,r_gap,float,0.1,1,,,, -117,r_vv,float,0.01,1,,,, -118,r_magnet,float,1.5,m,,,, -119,r_cryostat,float,1.0,1,,,, -120,f_vol,float,0.9,1,,,, +112,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 +113,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,HF_magnet_shield_cost,0 +114,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 +115,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +116,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 +117,r_vv,HF shield vacuum vessel radial thickness allowance,0.01,m,,,HF_magnet_shield_cost,0 +118,r_magnet,HF shield magnet radius,1.5,m,,,HF_magnet_shield_cost,0 +119,r_cryostat,HF shield cryostat radius allowance,1.0,m,,,HF_magnet_shield_cost,0 +120,f_vol,HF shield volume fill fraction,0.9,1,,,HF_magnet_shield_cost,0 121,V_radially_inner_cylinder,str,,1,,,, -122,length_cc_cylinder,float,0.5,1,,,, +122,length_cc_cylinder,HF shield central-cell-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 123,r_in_cc,str,,1,,,, 124,r_out_cc,str,,1,,,, 125,V_cc_cylinder,str,,1,,,, 126,V_cc_triangle,str,,1,,,, -127,length_ep_cylinder,float,0.5,1,,,, +127,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 128,r_in_ep,str,,1,,,, 129,r_out_ep,str,,1,,,, 130,V_ep_cylinder,str,,1,,,, @@ -172,8 +172,8 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 171,include_contingency,Mirror input parameter,0.0,1,,,,0 172,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 173,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 -174,a_EC,Mirror input parameter,1.0,m,,,V_vac,0 -175,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +174,a_EC,Mirror input parameter,1.0,m,,,"V_vac, expander_cell_cost_result",0 +175,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,expander_cell_cost_result,0 176,expander_cell_vessel_material,Mirror input parameter,SS316,1,,,,0 177,vacuum_gap_CC,Mirror input parameter,0.01,m,,,,0 178,first_wall_material,Mirror input parameter,W,1,,,,0 @@ -189,19 +189,19 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 188,blanket_structural_fraction,Mirror input parameter,0.1,1,,,,0 189,outer_vessel_thickness,Mirror input parameter,0.01,m,,,,0 190,L_EP,Mirror input parameter,1.0,m,,,L,0 -191,L_EC,Mirror input parameter,1.0,m,,,L,0 +191,L_EC,Mirror input parameter,1.0,m,,,"L, expander_cell_cost_result",0 192,a_EP,Mirror input parameter,1.0,m,,,,0 193,HF_magnet_number,Mirror input parameter,4.0,1,,,HF_magnet_cost,0 194,LF_magnet_number,Mirror input parameter,2.0,1,,,LF_magnet_cost,0 195,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 196,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 197,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 -198,HF_magnet_shield_cost,HF magnet shield cost per end plug,47.36847787,million,,,,0 -199,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 -200,firstwall_vol,Mirror generated parameter,38.07610296150822,m3,cal_firstwall_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t",first_wall_cost,0 -201,blanket1_vol,Mirror generated parameter,422.230052642468,m3,cal_blanket1_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t",blanket_cost,0 -202,first_wall_cost,Mirror generated parameter,1215.1036357591313,million,cal_first_wall_cost,"firstwall_vol, Be_rho, Be_c_raw, Be_m",,0 -203,blanket_cost,Mirror generated parameter,2.018259651630997,million,cal_blanket_cost,"blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m",,0 +198,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 +199,firstwall_vol,Mirror generated parameter,38.07610296150822,m3,cal_firstwall_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t",first_wall_cost,0 +200,blanket1_vol,Mirror generated parameter,422.230052642468,m3,cal_blanket1_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t",blanket_cost,0 +201,first_wall_cost,Mirror generated parameter,1215.1036357591313,million,cal_first_wall_cost,"firstwall_vol, Be_rho, Be_c_raw, Be_m",,0 +202,blanket_cost,Mirror generated parameter,2.018259651630997,million,cal_blanket_cost,"blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m",,0 +203,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 204,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,"blanket1_vol, firstwall_vol",0 205,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,"blanket1_vol, firstwall_vol",0 206,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,"blanket1_vol, firstwall_vol",0 @@ -228,9 +228,9 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 227,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,blanket_cost,0 228,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 229,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 -230,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,,0 -231,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,,0 -232,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,,0 +230,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,HF_magnet_shield_cost,0 +231,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,HF_magnet_shield_cost,0 +232,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,HF_magnet_shield_cost,0 233,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 234,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 235,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 @@ -254,9 +254,9 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 253,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 254,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 255,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 -256,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,,0 -257,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,,0 -258,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,,0 +256,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,expander_cell_cost_result,0 +257,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,expander_cell_cost_result,0 +258,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,expander_cell_cost_result,0 259,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 260,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 261,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 From be191abe41e15231bcea13aebf013e261ed5072c Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sun, 2 Aug 2026 12:26:15 -0500 Subject: [PATCH 17/23] Restore legacy scalar structure for Mirror C22.1.1 --- src/Algorithm/MirrorFunc.py | 188 +++++++++++++++-- src/accertdb.sqlite | Bin 1105920 -> 1105920 bytes src/accertdb_sqlite_schema_data.sql | 193 +++++++++--------- src/etc/accert.sch | 4 +- src/scripts/build_mirror_accert_tables.py | 126 +++++++++--- test/test_mirror_model.py | 81 +++++--- tutorial/accert/ref_tables/MirrorFunc.py | 188 +++++++++++++++-- tutorial/accert/ref_tables/mirror_account.csv | 2 +- .../accert/ref_tables/mirror_algorithm.csv | 15 +- .../accert/ref_tables/mirror_variable.csv | 176 ++++++++-------- 10 files changed, 683 insertions(+), 290 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index cf305cf..e2a19f0 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -180,24 +180,178 @@ def cal_CF_magnet_number(L_CC, L_CF): return L_CC / L_CF @staticmethod - def cal_firstwall_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t): - firstwall_ir = axis_t + plasma_t + vacuum_t - firstwall_or = firstwall_ir + firstwall_t - return np.pi * chamber_length * (firstwall_or**2 - firstwall_ir**2) + def cal_rho_PbLi(T, f_6Li): + f_6Li_natural = 0.075 + rho_6Li = 460.0 + rho_7Li = 537.0 + T_K = T + 273.15 + rho_PbLi = 10520.35 - 1.19051 * T_K + return rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1 - f_6Li)) / ( + rho_6Li * f_6Li_natural + rho_7Li * (1 - f_6Li_natural) + ) + + @staticmethod + def cal_P_Li(f_6Li): + if f_6Li == 0.075: + return 15.152 + if f_6Li >= 0.90: + points = [(0.90, 1), (0.99, 2), (0.999, 4), (0.9999, 8), (0.99999, 16)] + for (x0, y0), (x1, y1) in zip(points, points[1:]): + if x0 <= f_6Li <= x1: + return (y0 + (y1 - y0) * (f_6Li - x0) / (x1 - x0)) * 70 + raise ValueError("Lithium pricing at this enrichment level is not supported") + + @staticmethod + def cal_P_PbLi(Pb_c_raw, P_Li): + f_Li = 0.17 + return (1 - f_Li) * Pb_c_raw + f_Li * P_Li + + @staticmethod + def cal_central_cell_cylindrical_part_cost( + L_CC, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ): + return MirrorFunc._central_cell_cylindrical_cost( + L_CC, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ) + + @staticmethod + def cal_end_plug_cylindrical_part_cost( + L_EP, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ): + return MirrorFunc._central_cell_cylindrical_cost( + L_EP, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ) + + @staticmethod + def _central_cell_cylindrical_cost( + length, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ): + radius = a_CC + vacuum_gap_CC + total = 0.0 - @staticmethod - def cal_blanket1_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t): - blanket_ir = axis_t + plasma_t + vacuum_t + firstwall_t - blanket_or = blanket_ir + blanket1_t - return np.pi * chamber_length * (blanket_or**2 - blanket_ir**2) + r_in = radius + radius += first_wall_thickness + total += np.pi * length * (radius**2 - r_in**2) * W_rho * W_c_raw * W_m - @staticmethod - def cal_first_wall_cost(firstwall_vol, Be_rho, Be_c_raw, Be_m): - return firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6 + r_in = radius + radius += vacuum_vessel_thickness + total += np.pi * length * (radius**2 - r_in**2) * SS316_rho * SS316_c_raw * SS316_m - @staticmethod - def cal_blanket_cost(blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m): - return blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6 + r_in = radius + radius += multiplier_thickness + total += np.pi * length * (radius**2 - r_in**2) * Pb_rho * Pb_c_raw * Pb_m + + r_in = radius + radius += blanket_thickness + blanket_volume = np.pi * length * (radius**2 - r_in**2) + total += blanket_volume * blanket_coolant_fraction * rho_PbLi * P_PbLi + total += blanket_volume * blanket_structural_fraction * SS316_rho * SS316_c_raw * SS316_m + + r_in = radius + radius += outer_vessel_thickness + total += np.pi * length * (radius**2 - r_in**2) * SS316_rho * SS316_c_raw * SS316_m + + return total / 1e6 @staticmethod def cal_expander_cell_cost_result( @@ -353,9 +507,9 @@ def Account_C21_17(P_egross): @staticmethod - def Account_C22_1_1(first_wall_cost, blanket_cost): + def Account_C22_1_1(central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result): # First Wall and Blanket (and vacuum vessel) - return first_wall_cost + blanket_cost + return central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result @staticmethod def Account_C22_1_2(HF_magnet_shield_cost): diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 8e4d3f8bcd108dd2faadaa8ecb5fc813ee43737c..80173a23039cdbab2f2725c2f2c144cd3fadcb6a 100644 GIT binary patch delta 7532 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 delta 7059 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 float: + radius = values["a_CC"] + values["vacuum_gap_CC"] + total = 0.0 + r_in = radius + radius += values["first_wall_thickness"] + total += math.pi * length * (radius**2 - r_in**2) * values["W_rho"] * values["W_c_raw"] * values["W_m"] + r_in = radius + radius += values["vacuum_vessel_thickness"] + total += ( + math.pi + * length + * (radius**2 - r_in**2) + * values["SS316_rho"] + * values["SS316_c_raw"] + * values["SS316_m"] + ) + r_in = radius + radius += values["multiplier_thickness"] + total += math.pi * length * (radius**2 - r_in**2) * values["Pb_rho"] * values["Pb_c_raw"] * values["Pb_m"] + r_in = radius + radius += values["blanket_thickness"] + blanket_volume = math.pi * length * (radius**2 - r_in**2) + total += blanket_volume * values["blanket_coolant_fraction"] * generated["rho_PbLi"] * generated["P_PbLi"] + total += ( + blanket_volume + * values["blanket_structural_fraction"] + * values["SS316_rho"] + * values["SS316_c_raw"] + * values["SS316_m"] + ) + r_in = radius + radius += values["outer_vessel_thickness"] + total += ( + math.pi + * length + * (radius**2 - r_in**2) + * values["SS316_rho"] + * values["SS316_c_raw"] + * values["SS316_m"] + ) + return total / 1e6 + + generated["central_cell_cylindrical_part_cost"] = central_cell_cylindrical_cost(generated["L_CC"]) + generated["end_plug_cylindrical_part_cost"] = central_cell_cylindrical_cost(values["L_EP"]) expander_vessel_outer_radius = values["a_EC"] + values["expander_cell_vessel_thickness"] expander_vessel_volume = math.pi * values["L_EC"] * (expander_vessel_outer_radius**2 - values["a_EC"] ** 2) expander_end_cap_volume = math.pi * values["expander_cell_vessel_thickness"] * values["a_EC"] ** 2 @@ -754,7 +820,9 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: normalized_total_cost = _dollar_value(total_cost) if code == "2211": normalized_total_cost = ( - generated_values["first_wall_cost"] + generated_values["blanket_cost"] + generated_values["central_cell_cylindrical_part_cost"] + + 2 * generated_values["end_plug_cylindrical_part_cost"] + + 2 * generated_values["expander_cell_cost_result"] ) * 1e6 elif code == "2212": normalized_total_cost = 2 * generated_values["HF_magnet_shield_cost"] * 1e6 diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 9370580..168671b 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -527,7 +527,7 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): assert alg.run({"HF_magnet_number": 4.0, "HF_magnet_cost": 29.1}) == pytest.approx(116.4) -def test_mirror_first_wall_and_blanket_use_pyfecons_scalar_defaults(cursor): +def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor): cursor.execute( """ SELECT total_cost, alg_name, variables @@ -537,44 +537,63 @@ def test_mirror_first_wall_and_blanket_use_pyfecons_scalar_defaults(cursor): ("2211",), ) total_cost, alg_name, variables = cursor.fetchone() - assert total_cost / 1e6 == pytest.approx(1217.1218954107624) + assert total_cost / 1e6 == pytest.approx(0.5110835873559177) assert alg_name == "Account_C22_1_1" - assert variables == "first_wall_cost, blanket_cost" + assert variables == ( + "central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result" + ) cursor.execute( """ SELECT var_name, var_value, var_unit, var_alg, var_need FROM mirror_var - WHERE var_name IN (?, ?, ?, ?) + WHERE var_name IN (?, ?, ?, ?, ?, ?) ORDER BY var_name; """, - ("blanket1_vol", "blanket_cost", "first_wall_cost", "firstwall_vol"), + ( + "central_cell_cylindrical_part_cost", + "end_plug_cylindrical_part_cost", + "expander_cell_cost_result", + "P_Li", + "P_PbLi", + "rho_PbLi", + ), ) rows = {row[0]: row[1:] for row in cursor.fetchall()} - assert rows["firstwall_vol"][0] == pytest.approx(38.07610296150822) - assert rows["firstwall_vol"][1:] == ( - "m3", - "cal_firstwall_vol", - "chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t", - ) - assert rows["blanket1_vol"][0] == pytest.approx(422.230052642468) - assert rows["blanket1_vol"][1:] == ( - "m3", - "cal_blanket1_vol", - "chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t", - ) - assert rows["first_wall_cost"][0] == pytest.approx(1215.1036357591313) - assert rows["first_wall_cost"][1:] == ( + assert rows["central_cell_cylindrical_part_cost"][0] == pytest.approx(-0.5031620991790029) + assert rows["central_cell_cylindrical_part_cost"][1:] == ( "million", - "cal_first_wall_cost", - "firstwall_vol, Be_rho, Be_c_raw, Be_m", + "cal_central_cell_cylindrical_part_cost", + "L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi", ) - assert rows["blanket_cost"][0] == pytest.approx(2.018259651630997) - assert rows["blanket_cost"][1:] == ( + assert rows["end_plug_cylindrical_part_cost"][0] == pytest.approx(0.5031620991790029) + assert rows["end_plug_cylindrical_part_cost"][1:] == ( "million", - "cal_blanket_cost", - "blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m", + "cal_end_plug_cylindrical_part_cost", + "L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi", + ) + assert rows["expander_cell_cost_result"][0] == pytest.approx(0.003960744088457411) + assert rows["expander_cell_cost_result"][1:] == ( + "million", + "cal_expander_cell_cost_result", + "L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m", + ) + assert rows["P_Li"][0] == pytest.approx(15.152) + assert rows["P_Li"][1:] == ("dollar/kg", "cal_P_Li", "f_6Li") + assert rows["P_PbLi"][0] == pytest.approx(4.56784) + assert rows["P_PbLi"][1:] == ("dollar/kg", "cal_P_PbLi", "Pb_c_raw, P_Li") + assert rows["rho_PbLi"][0] == pytest.approx(9838.0091935) + assert rows["rho_PbLi"][1:] == ("kg/m3", "cal_rho_PbLi", "T, f_6Li") + + cursor.execute( + """ + SELECT COUNT(*) + FROM mirror_var + WHERE var_name IN (?, ?, ?, ?); + """, + ("blanket1_vol", "blanket_cost", "first_wall_cost", "firstwall_vol"), ) + assert cursor.fetchone()[0] == 0 alg = MirrorFunc( ind=1, @@ -583,12 +602,16 @@ def test_mirror_first_wall_and_blanket_use_pyfecons_scalar_defaults(cursor): alg_description="", alg_formulation="", alg_units="million", - variables="first_wall_cost,blanket_cost", + variables="central_cell_cylindrical_part_cost,end_plug_cylindrical_part_cost,expander_cell_cost_result", constants="", ) - assert alg.run({"first_wall_cost": 1215.1036357591313, "blanket_cost": 2.018259651630997}) == pytest.approx( - 1217.1218954107624 - ) + assert alg.run( + { + "central_cell_cylindrical_part_cost": -0.5031620991790029, + "end_plug_cylindrical_part_cost": 0.5031620991790029, + "expander_cell_cost_result": 0.003960744088457411, + } + ) == pytest.approx(0.5110835873559177) def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index cf305cf..e2a19f0 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -180,24 +180,178 @@ def cal_CF_magnet_number(L_CC, L_CF): return L_CC / L_CF @staticmethod - def cal_firstwall_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t): - firstwall_ir = axis_t + plasma_t + vacuum_t - firstwall_or = firstwall_ir + firstwall_t - return np.pi * chamber_length * (firstwall_or**2 - firstwall_ir**2) + def cal_rho_PbLi(T, f_6Li): + f_6Li_natural = 0.075 + rho_6Li = 460.0 + rho_7Li = 537.0 + T_K = T + 273.15 + rho_PbLi = 10520.35 - 1.19051 * T_K + return rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1 - f_6Li)) / ( + rho_6Li * f_6Li_natural + rho_7Li * (1 - f_6Li_natural) + ) + + @staticmethod + def cal_P_Li(f_6Li): + if f_6Li == 0.075: + return 15.152 + if f_6Li >= 0.90: + points = [(0.90, 1), (0.99, 2), (0.999, 4), (0.9999, 8), (0.99999, 16)] + for (x0, y0), (x1, y1) in zip(points, points[1:]): + if x0 <= f_6Li <= x1: + return (y0 + (y1 - y0) * (f_6Li - x0) / (x1 - x0)) * 70 + raise ValueError("Lithium pricing at this enrichment level is not supported") + + @staticmethod + def cal_P_PbLi(Pb_c_raw, P_Li): + f_Li = 0.17 + return (1 - f_Li) * Pb_c_raw + f_Li * P_Li + + @staticmethod + def cal_central_cell_cylindrical_part_cost( + L_CC, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ): + return MirrorFunc._central_cell_cylindrical_cost( + L_CC, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ) + + @staticmethod + def cal_end_plug_cylindrical_part_cost( + L_EP, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ): + return MirrorFunc._central_cell_cylindrical_cost( + L_EP, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ) + + @staticmethod + def _central_cell_cylindrical_cost( + length, + a_CC, + vacuum_gap_CC, + first_wall_thickness, + vacuum_vessel_thickness, + multiplier_thickness, + blanket_thickness, + blanket_coolant_fraction, + blanket_structural_fraction, + outer_vessel_thickness, + W_rho, + W_c_raw, + W_m, + SS316_rho, + SS316_c_raw, + SS316_m, + Pb_rho, + Pb_c_raw, + Pb_m, + rho_PbLi, + P_PbLi, + ): + radius = a_CC + vacuum_gap_CC + total = 0.0 - @staticmethod - def cal_blanket1_vol(chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t): - blanket_ir = axis_t + plasma_t + vacuum_t + firstwall_t - blanket_or = blanket_ir + blanket1_t - return np.pi * chamber_length * (blanket_or**2 - blanket_ir**2) + r_in = radius + radius += first_wall_thickness + total += np.pi * length * (radius**2 - r_in**2) * W_rho * W_c_raw * W_m - @staticmethod - def cal_first_wall_cost(firstwall_vol, Be_rho, Be_c_raw, Be_m): - return firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6 + r_in = radius + radius += vacuum_vessel_thickness + total += np.pi * length * (radius**2 - r_in**2) * SS316_rho * SS316_c_raw * SS316_m - @staticmethod - def cal_blanket_cost(blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m): - return blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6 + r_in = radius + radius += multiplier_thickness + total += np.pi * length * (radius**2 - r_in**2) * Pb_rho * Pb_c_raw * Pb_m + + r_in = radius + radius += blanket_thickness + blanket_volume = np.pi * length * (radius**2 - r_in**2) + total += blanket_volume * blanket_coolant_fraction * rho_PbLi * P_PbLi + total += blanket_volume * blanket_structural_fraction * SS316_rho * SS316_c_raw * SS316_m + + r_in = radius + radius += outer_vessel_thickness + total += np.pi * length * (radius**2 - r_in**2) * SS316_rho * SS316_c_raw * SS316_m + + return total / 1e6 @staticmethod def cal_expander_cell_cost_result( @@ -353,9 +507,9 @@ def Account_C21_17(P_egross): @staticmethod - def Account_C22_1_1(first_wall_cost, blanket_cost): + def Account_C22_1_1(central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result): # First Wall and Blanket (and vacuum vessel) - return first_wall_cost + blanket_cost + return central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result @staticmethod def Account_C22_1_2(HF_magnet_shield_cost): diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index 48c2295..abd3ab3 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -29,7 +29,7 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 28,2117,Ventilation_Stack,4269265.632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross 29,22,Heat_Island_Plant_Equipment,1111998920.0,1,20,Unchanged,0.21553124025414422,,million,rollup 30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,,million,rollup -31,2211,First_Wall_and_Blanket,1217121895.4107623,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"first_wall_cost, blanket_cost" +31,2211,First_Wall_and_Blanket,511083.5873559177,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result" 32,2212,Magnet_Radiation_Shield,70016988.37318401,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost 33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,,million,rollup 34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,"HF_magnet_number, HF_magnet_cost" diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index d842413..b63431e 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -16,7 +16,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 21,Account_C21_15,c,Account C2115 Rollup,MirrorFunc,P_egross,million 22,Account_C21_16,c,Account C2116 Rollup,MirrorFunc,P_egross,million 23,Account_C21_17,c,Account C2117 Rollup,MirrorFunc,P_egross,million -26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"first_wall_cost, blanket_cost",million +26,Account_C22_1_1,c,Account C2211 Rollup,MirrorFunc,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",million 27,Account_C22_1_2,c,Account C2212 Rollup,MirrorFunc,HF_magnet_shield_cost,million 29,Account_C22_1_3_1,c,Account C22131 Rollup,MirrorFunc,"HF_magnet_number, HF_magnet_cost",million 30,Account_C22_1_3_2,c,Account C22132 Rollup,MirrorFunc,"LF_magnet_number, LF_magnet_cost",million @@ -72,9 +72,10 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 107,cal_Q_eng,v,Mirror generated variable calculation for Q_eng,MirrorFunc,Q_eng = P_egross / (P_ine + P_other),1 108,cal_f_refrac,v,Mirror generated variable calculation for f_refrac,MirrorFunc,f_refrac = 1 / Q_eng,1 109,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 -110,cal_firstwall_vol,v,Mirror generated variable calculation for firstwall_vol,MirrorFunc,firstwall_vol = pi * chamber_length * ((axis_t + plasma_t + vacuum_t + firstwall_t)**2 - (axis_t + plasma_t + vacuum_t)**2),m3 -111,cal_blanket1_vol,v,Mirror generated variable calculation for blanket1_vol,MirrorFunc,blanket1_vol = pi * chamber_length * ((axis_t + plasma_t + vacuum_t + firstwall_t + blanket1_t)**2 - (axis_t + plasma_t + vacuum_t + firstwall_t)**2),m3 -112,cal_first_wall_cost,v,Mirror generated variable calculation for first_wall_cost,MirrorFunc,first_wall_cost = firstwall_vol * Be_rho * Be_c_raw * Be_m / 1e6,million -113,cal_blanket_cost,v,Mirror generated variable calculation for blanket_cost,MirrorFunc,blanket_cost = blanket1_vol * Li4SiO4_rho * Li4SiO4_c_raw * Li4SiO4_m / 1e6,million -114,cal_expander_cell_cost_result,v,Mirror generated variable calculation for expander_cell_cost_result,MirrorFunc,expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6,million -115,cal_HF_magnet_shield_cost,v,Mirror generated variable calculation for HF_magnet_shield_cost,MirrorFunc,HF_magnet_shield_cost = legacy shield volume geometry * W_rho * W_c_raw * W_m / 1e6,million +110,cal_rho_PbLi,v,Mirror generated variable calculation for rho_PbLi,MirrorFunc,rho_PbLi = PbLi density corrected for lithium enrichment and temperature,kg/m3 +111,cal_P_Li,v,Mirror generated variable calculation for P_Li,MirrorFunc,P_Li = lithium price as a function of 6Li enrichment,dollar/kg +112,cal_P_PbLi,v,Mirror generated variable calculation for P_PbLi,MirrorFunc,P_PbLi = 0.83 * Pb_c_raw + 0.17 * P_Li,dollar/kg +113,cal_central_cell_cylindrical_part_cost,v,Mirror generated variable calculation for central_cell_cylindrical_part_cost,MirrorFunc,central_cell_cylindrical_part_cost = legacy central-cell radial build material cost for L_CC,million +114,cal_end_plug_cylindrical_part_cost,v,Mirror generated variable calculation for end_plug_cylindrical_part_cost,MirrorFunc,end_plug_cylindrical_part_cost = legacy central-cell radial build material cost for L_EP,million +115,cal_expander_cell_cost_result,v,Mirror generated variable calculation for expander_cell_cost_result,MirrorFunc,expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6,million +116,cal_HF_magnet_shield_cost,v,Mirror generated variable calculation for HF_magnet_shield_cost,MirrorFunc,HF_magnet_shield_cost = legacy shield volume geometry * W_rho * W_c_raw * W_m / 1e6,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index 9e760e1..d7e2c93 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -14,15 +14,15 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 13,L_cylinder,str,,1,,,, 14,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 15,end_plug_cylindrical_part,str,,1,,,, -16,end_plug_cylindrical_part_cost,str,,1,,,, +16,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,0.5031620991790029,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 17,central_cell_cylindrical_part,str,,1,,,, -18,central_cell_cylindrical_part_cost,str,,1,,,, +18,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,-0.5031620991790029,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 19,total_cost,str,,1,,,, 20,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 21,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 22,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 23,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 -24,axis_t,PyFECONS radial build axis thickness,0.0,m,,,"blanket1_vol, firstwall_vol",0 +24,axis_t,PyFECONS radial build axis thickness,0.0,m,,,,0 25,axis_ir,str,,1,,,, 26,lr,str,,1,,,, 27,constructionworker,str,,1,,,, @@ -59,7 +59,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 58,rho_6Li,float,460.0,1,,,, 59,rho_7Li,float,537.0,1,,,, 60,T_K,str,,1,,,, -61,rho_PbLi,str,,1,,,, +61,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9838.0091935,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 62,P_6Li075,float,15.152,1,,,, 63,P_6Li90,int,70.0,1,,,, 64,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",1,,,, @@ -67,10 +67,10 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 66,f_interp,str,,1,,,, 67,f_Li,float,0.17,1,,,, 68,f_Pb,str,,1,,,, -69,P_Li,str,,1,,,, -70,P_PbLi,str,,1,,,, +69,P_Li,Lithium price from legacy Mirror enrichment pricing,15.152,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 +70,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,4.5678399999999995,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 71,P_f_CC,str,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 -72,L_CC,str,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L",0 +72,L_CC,str,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 73,L_CF,float,1.0,m,cal_L_CF,,CF_magnet_number,0 74,L,str,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 75,V_vac,str,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 @@ -99,9 +99,9 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 98,r_out,str,,1,,,, 99,radial_build,str,,1,,,, 100,filename,str,,1,,,, -101,T,int,300.0,1,,,, +101,T,Mean coolant temperature for legacy PbLi density correlation,300.0,degC,,,rho_PbLi,0 102,material,str,,1,,,, -103,f_6Li,float,0.075,1,,,, +103,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.075,1,,,"P_Li, rho_PbLi",0 104,radius,str,,1,,,, 105,thickness,str,,1,,,, 106,vv_material,str,,1,,,, @@ -111,7 +111,7 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 110,total,str,,1,,,, 111,cost,float,29.1,1,,,, 112,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 -113,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,HF_magnet_shield_cost,0 +113,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 114,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 115,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 116,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 @@ -175,20 +175,20 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 174,a_EC,Mirror input parameter,1.0,m,,,"V_vac, expander_cell_cost_result",0 175,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,expander_cell_cost_result,0 176,expander_cell_vessel_material,Mirror input parameter,SS316,1,,,,0 -177,vacuum_gap_CC,Mirror input parameter,0.01,m,,,,0 +177,vacuum_gap_CC,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 178,first_wall_material,Mirror input parameter,W,1,,,,0 -179,first_wall_thickness,Mirror input parameter,0.01,m,,,,0 +179,first_wall_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 180,vacuum_vessel_material,Mirror input parameter,SS316,1,,,,0 -181,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,,0 +181,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 182,multiplier_material,Mirror input parameter,Pb,1,,,,0 -183,multiplier_thickness,Mirror input parameter,0.01,m,,,,0 +183,multiplier_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 184,blanket_coolant_material,Mirror input parameter,Natural PbLi,1,,,,0 -185,blanket_thickness,Mirror input parameter,1.0,m,,,,0 -186,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,,0 +185,blanket_thickness,Mirror input parameter,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +186,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 187,blanket_structural_material,Mirror input parameter,SS316,1,,,,0 -188,blanket_structural_fraction,Mirror input parameter,0.1,1,,,,0 -189,outer_vessel_thickness,Mirror input parameter,0.01,m,,,,0 -190,L_EP,Mirror input parameter,1.0,m,,,L,0 +188,blanket_structural_fraction,Mirror input parameter,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +189,outer_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +190,L_EP,Mirror input parameter,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 191,L_EC,Mirror input parameter,1.0,m,,,"L, expander_cell_cost_result",0 192,a_EP,Mirror input parameter,1.0,m,,,,0 193,HF_magnet_number,Mirror input parameter,4.0,1,,,HF_magnet_cost,0 @@ -197,74 +197,70 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 196,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 197,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 198,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 -199,firstwall_vol,Mirror generated parameter,38.07610296150822,m3,cal_firstwall_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t",first_wall_cost,0 -200,blanket1_vol,Mirror generated parameter,422.230052642468,m3,cal_blanket1_vol,"chamber_length, axis_t, plasma_t, vacuum_t, firstwall_t, blanket1_t",blanket_cost,0 -201,first_wall_cost,Mirror generated parameter,1215.1036357591313,million,cal_first_wall_cost,"firstwall_vol, Be_rho, Be_c_raw, Be_m",,0 -202,blanket_cost,Mirror generated parameter,2.018259651630997,million,cal_blanket_cost,"blanket1_vol, Li4SiO4_rho, Li4SiO4_c_raw, Li4SiO4_m",,0 -203,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 -204,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,"blanket1_vol, firstwall_vol",0 -205,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,"blanket1_vol, firstwall_vol",0 -206,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,"blanket1_vol, firstwall_vol",0 -207,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,"blanket1_vol, firstwall_vol",0 -208,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,blanket1_vol,0 -209,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 -210,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 -211,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 -212,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 -213,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 -214,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 -215,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 -216,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 -217,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 -218,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 -219,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 -220,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 -221,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 -222,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,,0 -223,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,,0 -224,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,,0 -225,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,blanket_cost,0 -226,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,blanket_cost,0 -227,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,blanket_cost,0 -228,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 -229,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 -230,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,HF_magnet_shield_cost,0 -231,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,HF_magnet_shield_cost,0 -232,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,HF_magnet_shield_cost,0 -233,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 -234,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 -235,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 -236,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 -237,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 -238,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 -239,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 -240,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 -241,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 -242,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 -243,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 -244,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 -245,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 -246,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 -247,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 -248,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 -249,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 -250,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 -251,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 -252,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 -253,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 -254,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 -255,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 -256,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,expander_cell_cost_result,0 -257,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,expander_cell_cost_result,0 -258,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,expander_cell_cost_result,0 -259,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 -260,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 -261,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 -262,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 -263,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 -264,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,first_wall_cost,0 -265,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,first_wall_cost,0 -266,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,first_wall_cost,0 -267,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 -268,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 -269,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 +199,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 +200,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 +201,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 +202,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 +203,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 +204,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 +205,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 +206,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 +207,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 +208,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 +209,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 +210,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 +211,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 +212,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 +213,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 +214,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 +215,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 +216,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 +217,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 +218,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +219,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +220,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +221,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 +222,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 +223,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 +224,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 +225,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 +226,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +227,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +228,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +229,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 +230,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 +231,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 +232,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 +233,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 +234,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 +235,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 +236,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 +237,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 +238,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 +239,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 +240,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 +241,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 +242,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 +243,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 +244,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 +245,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 +246,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 +247,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 +248,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 +249,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 +250,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 +251,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 +252,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +253,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +254,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +255,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 +256,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 +257,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 +258,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 +259,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 +260,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 +261,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 +262,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 +263,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 +264,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 +265,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 From 752fd28ca2ec9f99c96e3cc92e6882839d87a9a5 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sun, 2 Aug 2026 12:42:12 -0500 Subject: [PATCH 18/23] Remove unused Mirror C22.1.1 placeholder variables --- src/accertdb.sqlite | Bin 1105920 -> 1105920 bytes src/accertdb_sqlite_schema_data.sql | 503 +++++++++--------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 15 + test/test_mirror_model.py | 14 +- .../accert/ref_tables/mirror_variable.csv | 503 +++++++++--------- 6 files changed, 526 insertions(+), 511 deletions(-) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 80173a23039cdbab2f2725c2f2c144cd3fadcb6a..ed29696bd2e491b62896da1a6b790dce694b5118 100644 GIT binary patch delta 3629 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 diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 8278f15..7652908 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -7044,260 +7044,255 @@ INSERT INTO mirror_var VALUES(8,'indentation','int',0.0,'1','','','',''); INSERT INTO mirror_var VALUES(9,'indented_name','str','','1','','','',''); INSERT INTO mirror_var VALUES(10,'inputs','str','','1','','','',''); INSERT INTO mirror_var VALUES(11,'cost_data','str','','1','','','',''); -INSERT INTO mirror_var VALUES(12,'L_magnet_to_magnet','str','','1','','','',''); -INSERT INTO mirror_var VALUES(13,'L_cylinder','str','','1','','','',''); -INSERT INTO mirror_var VALUES(14,'expander_cell_cost_result','Expander cell vacuum vessel cost from legacy Mirror geometry',0.003960744088457411084,'million','cal_expander_cell_cost_result','L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m','',0); -INSERT INTO mirror_var VALUES(15,'end_plug_cylindrical_part','str','','1','','','',''); -INSERT INTO mirror_var VALUES(16,'end_plug_cylindrical_part_cost','End plug cylindrical radial-build material cost',0.5031620991790028973,'million','cal_end_plug_cylindrical_part_cost','L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); -INSERT INTO mirror_var VALUES(17,'central_cell_cylindrical_part','str','','1','','','',''); -INSERT INTO mirror_var VALUES(18,'central_cell_cylindrical_part_cost','Central cell cylindrical radial-build material cost',-0.5031620991790028973,'million','cal_central_cell_cylindrical_part_cost','L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); -INSERT INTO mirror_var VALUES(19,'total_cost','str','','1','','','',''); -INSERT INTO mirror_var VALUES(20,'cost_factor','Cost scaling factor calculated from the unit number using an 0.80 learning factor',1.0,'1','cal_cost_factor','n_unit','',0); -INSERT INTO mirror_var VALUES(21,'cost_pump','Cost of one vacuum pump, scaled from 1985 dollars',40000.0,'dollar/pump','','','',0); -INSERT INTO mirror_var VALUES(22,'vpump_cap','Vacuum volume pumped by one vacuum pump in one second',4.166666666666666963,'m3/pump','','','no_vpumps',0); -INSERT INTO mirror_var VALUES(23,'no_vpumps','Number of vacuum pumps required to pump the full vacuum in one second',2.261946710584650689,'1','cal_no_vpumps','V_vac, vpump_cap','',0); -INSERT INTO mirror_var VALUES(24,'axis_t','PyFECONS radial build axis thickness',0.0,'m','','','',0); -INSERT INTO mirror_var VALUES(25,'axis_ir','str','','1','','','',''); -INSERT INTO mirror_var VALUES(26,'lr','str','','1','','','',''); -INSERT INTO mirror_var VALUES(27,'constructionworker','str','','1','','','',''); -INSERT INTO mirror_var VALUES(28,'C_22_1_11_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(29,'C_22_1_11_1_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(30,'C_22_1_11_2_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(31,'C_22_1_11_3_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(32,'C_22_1_11_4_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(33,'C_22_1_11_5_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(34,'C_22_1_11_6_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(35,'C_22_1_11_7_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(36,'C_22_1_11_8_in','int',0.0,'1','','','',''); -INSERT INTO mirror_var VALUES(37,'C_22_1_11_9_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(38,'C_22_1_11_10_in','int',0.0,'1','','','',''); -INSERT INTO mirror_var VALUES(39,'C220111','str','','1','','','',''); -INSERT INTO mirror_var VALUES(40,'inflation','float',1.429999999999999938,'1','','','',''); -INSERT INTO mirror_var VALUES(41,'C2205010ITER','str','','1','','','',''); -INSERT INTO mirror_var VALUES(42,'C2205020ITER','str','','1','','','',''); -INSERT INTO mirror_var VALUES(43,'C2205030ITER','str','','1','','','',''); -INSERT INTO mirror_var VALUES(44,'C2205040ITER','str','','1','','','',''); -INSERT INTO mirror_var VALUES(45,'C2205050ITER','str','','1','','','',''); -INSERT INTO mirror_var VALUES(46,'C2205060ITER','str','','1','','','',''); -INSERT INTO mirror_var VALUES(47,'lcredit','float',0.8000000000000000444,'1','','','',''); -INSERT INTO mirror_var VALUES(48,'ltoak','str','','1','','','',''); -INSERT INTO mirror_var VALUES(49,'C220501','str','','1','','','',''); -INSERT INTO mirror_var VALUES(50,'C220502','str','','1','','','',''); -INSERT INTO mirror_var VALUES(51,'C220503','str','','1','','','',''); -INSERT INTO mirror_var VALUES(52,'C220504','str','','1','','','',''); -INSERT INTO mirror_var VALUES(53,'C220505','str','','1','','','',''); -INSERT INTO mirror_var VALUES(54,'C220506','str','','1','','','',''); -INSERT INTO mirror_var VALUES(55,'C220500','str','','1','','','',''); -INSERT INTO mirror_var VALUES(56,'f_cr','float',0.08999999999999999667,'1','','','',''); -INSERT INTO mirror_var VALUES(57,'f_6Li_natural','float',0.07499999999999999723,'1','','','',''); -INSERT INTO mirror_var VALUES(58,'rho_6Li','float',460.0,'1','','','',''); -INSERT INTO mirror_var VALUES(59,'rho_7Li','float',537.0,'1','','','',''); -INSERT INTO mirror_var VALUES(60,'T_K','str','','1','','','',''); -INSERT INTO mirror_var VALUES(61,'rho_PbLi','PbLi density from legacy Mirror temperature/enrichment correlation',9838.00919350000003,'kg/m3','cal_rho_PbLi','T, f_6Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(62,'P_6Li075','float',15.15199999999999925,'1','','','',''); -INSERT INTO mirror_var VALUES(63,'P_6Li90','int',70.0,'1','','','',''); -INSERT INTO mirror_var VALUES(64,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','1','','','',''); -INSERT INTO mirror_var VALUES(65,'Cf','list','(1, 2, 4, 8, 16)','1','','','',''); -INSERT INTO mirror_var VALUES(66,'f_interp','str','','1','','','',''); -INSERT INTO mirror_var VALUES(67,'f_Li','float',0.1700000000000000122,'1','','','',''); -INSERT INTO mirror_var VALUES(68,'f_Pb','str','','1','','','',''); -INSERT INTO mirror_var VALUES(69,'P_Li','Lithium price from legacy Mirror enrichment pricing',15.15199999999999925,'dollar/kg','cal_P_Li','f_6Li','P_PbLi',0); -INSERT INTO mirror_var VALUES(70,'P_PbLi','PbLi price from legacy Mirror eutectic mixture pricing',4.567839999999999457,'dollar/kg','cal_P_PbLi','Pb_c_raw, P_Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(71,'P_f_CC','str',-1.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); -INSERT INTO mirror_var VALUES(72,'L_CC','str',-1.0,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L, central_cell_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(73,'L_CF','float',1.0,'m','cal_L_CF','','CF_magnet_number',0); -INSERT INTO mirror_var VALUES(74,'L','str',3.0,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); -INSERT INTO mirror_var VALUES(75,'V_vac','str',9.42477796076937935,'m3','cal_V_vac','L, a_EC','no_vpumps',0); -INSERT INTO mirror_var VALUES(76,'P_alpha','str',0.2001137009664582522,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); -INSERT INTO mirror_var VALUES(77,'P_n','str',0.7998862990335418033,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); -INSERT INTO mirror_var VALUES(78,'P_ine','str',70.0,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); -INSERT INTO mirror_var VALUES(79,'P_pump','str',0.02639624786810687921,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); -INSERT INTO mirror_var VALUES(80,'P_sub_cont','str',0.04000000000000000083,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); -INSERT INTO mirror_var VALUES(81,'P_cryo','str',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); -INSERT INTO mirror_var VALUES(82,'P_other','str',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); -INSERT INTO mirror_var VALUES(83,'P_in','str',35.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); -INSERT INTO mirror_var VALUES(84,'P_th','str',158.5050690819081751,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); -INSERT INTO mirror_var VALUES(85,'P_the','str',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); -INSERT INTO mirror_var VALUES(86,'P_DEC','str',70.01989764480569533,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); -INSERT INTO mirror_var VALUES(87,'P_DECe','str',63.0179078803251329,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); -INSERT INTO mirror_var VALUES(88,'P_egross','str',158.1209493283582219,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); -INSERT INTO mirror_var VALUES(89,'P_enet','str',94.9150046322633188,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); -INSERT INTO mirror_var VALUES(90,'f_aux','str',0.03156555460446152512,'1','cal_f_aux','P_aux, P_egross','',0); -INSERT INTO mirror_var VALUES(91,'Q_sci','str',0.02857142857142857054,'1','cal_Q_sci','P_f, P_in','',0); -INSERT INTO mirror_var VALUES(92,'Q_eng','str',0.4520795021880652519,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); -INSERT INTO mirror_var VALUES(93,'f_refrac','str',2.212000312245963496,'1','cal_f_refrac','Q_eng','',0); -INSERT INTO mirror_var VALUES(94,'run_name','str','','1','','','',''); -INSERT INTO mirror_var VALUES(95,'cost_file_full','str','','1','','','',''); -INSERT INTO mirror_var VALUES(96,'new_data','str','','1','','','',''); -INSERT INTO mirror_var VALUES(97,'r_in','str','','1','','','',''); -INSERT INTO mirror_var VALUES(98,'r_out','str','','1','','','',''); -INSERT INTO mirror_var VALUES(99,'radial_build','str','','1','','','',''); -INSERT INTO mirror_var VALUES(100,'filename','str','','1','','','',''); -INSERT INTO mirror_var VALUES(101,'T','Mean coolant temperature for legacy PbLi density correlation',300.0,'degC','','','rho_PbLi',0); -INSERT INTO mirror_var VALUES(102,'material','str','','1','','','',''); -INSERT INTO mirror_var VALUES(103,'f_6Li','Lithium-6 enrichment fraction for legacy PbLi pricing',0.07499999999999999723,'1','','','P_Li, rho_PbLi',0); -INSERT INTO mirror_var VALUES(104,'radius','str','','1','','','',''); -INSERT INTO mirror_var VALUES(105,'thickness','str','','1','','','',''); -INSERT INTO mirror_var VALUES(106,'vv_material','str','','1','','','',''); -INSERT INTO mirror_var VALUES(107,'V_end_cap','str','','1','','','',''); -INSERT INTO mirror_var VALUES(108,'M_end_cap','str','','1','','','',''); -INSERT INTO mirror_var VALUES(109,'C_end_cap','str','','1','','','',''); -INSERT INTO mirror_var VALUES(110,'total','str','','1','','','',''); -INSERT INTO mirror_var VALUES(111,'cost','float',29.10000000000000142,'1','','','',''); -INSERT INTO mirror_var VALUES(112,'a_M','HF shield magnet bore/plasma radius from legacy Mirror geometry',0.1499999999999999945,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(113,'a_CC','Legacy Mirror central cell plasma radius',0.5400000000000000355,'m','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(114,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.6999999999999999556,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(115,'length','HF shield radially inner cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(116,'r_gap','HF shield radial gap',0.1000000000000000055,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(117,'r_vv','HF shield vacuum vessel radial thickness allowance',0.0100000000000000002,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(118,'r_magnet','HF shield magnet radius',1.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(119,'r_cryostat','HF shield cryostat radius allowance',1.0,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(120,'f_vol','HF shield volume fill fraction',0.9000000000000000222,'1','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(121,'V_radially_inner_cylinder','str','','1','','','',''); -INSERT INTO mirror_var VALUES(122,'length_cc_cylinder','HF shield central-cell-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(123,'r_in_cc','str','','1','','','',''); -INSERT INTO mirror_var VALUES(124,'r_out_cc','str','','1','','','',''); -INSERT INTO mirror_var VALUES(125,'V_cc_cylinder','str','','1','','','',''); -INSERT INTO mirror_var VALUES(126,'V_cc_triangle','str','','1','','','',''); -INSERT INTO mirror_var VALUES(127,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(128,'r_in_ep','str','','1','','','',''); -INSERT INTO mirror_var VALUES(129,'r_out_ep','str','','1','','','',''); -INSERT INTO mirror_var VALUES(130,'V_ep_cylinder','str','','1','','','',''); -INSERT INTO mirror_var VALUES(131,'V_ep_triangle','str','','1','','','',''); -INSERT INTO mirror_var VALUES(132,'V_total_cc_facing','str','','1','','','',''); -INSERT INTO mirror_var VALUES(133,'V_total_ec_facing','str','','1','','','',''); -INSERT INTO mirror_var VALUES(134,'V_total','str','','1','','','',''); -INSERT INTO mirror_var VALUES(135,'mass','str','','1','','','',''); -INSERT INTO mirror_var VALUES(136,'application','Mirror input parameter','heat','1','','','P_egross',0); -INSERT INTO mirror_var VALUES(137,'P_f','Mirror input parameter',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); -INSERT INTO mirror_var VALUES(138,'P_f_L','Mirror input parameter',1.0,'MW/m','','','L_CC',0); -INSERT INTO mirror_var VALUES(139,'P_f_EP','Mirror input parameter',1.0,'MW','','','P_f_CC',0); -INSERT INTO mirror_var VALUES(140,'P_NBI','Mirror input parameter',15.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(141,'P_ECH','Mirror input parameter',10.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(142,'P_ICRH','Mirror input parameter',10.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(143,'M_n','Mirror input parameter',1.100000000000000089,'1','','','P_pump, P_th',0); -INSERT INTO mirror_var VALUES(144,'N_module','Mirror input parameter',1.0,'1','','','',0); -INSERT INTO mirror_var VALUES(145,'f_pump','Mirror input parameter',0.02999999999999999889,'1','','','P_pump',0); -INSERT INTO mirror_var VALUES(146,'f_sub','Mirror input parameter',0.04000000000000000083,'1','','','P_sub_cont',0); -INSERT INTO mirror_var VALUES(147,'f_cryo','Mirror input parameter',0.0100000000000000002,'1','','','P_cryo',0); -INSERT INTO mirror_var VALUES(148,'P_pfcool','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(149,'P_thcool','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(150,'P_coils','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(151,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); -INSERT INTO mirror_var VALUES(152,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); -INSERT INTO mirror_var VALUES(153,'eta_DEC','Mirror input parameter',0.9000000000000000222,'1','','','P_DECe',0); -INSERT INTO mirror_var VALUES(154,'eta_pump','Mirror input parameter',0.979999999999999983,'1','','','P_th',0); -INSERT INTO mirror_var VALUES(155,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(156,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(157,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(158,'NOAK','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(159,'n_unit','Mirror input parameter',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); -INSERT INTO mirror_var VALUES(160,'construction_time','Mirror input parameter',6.0,'years','','','',0); -INSERT INTO mirror_var VALUES(161,'lifetime','Mirror input parameter',30.0,'years','','','',0); -INSERT INTO mirror_var VALUES(162,'replacement','Mirror input parameter',10.0,'years','','','',0); -INSERT INTO mirror_var VALUES(163,'availability','Mirror input parameter',0.9000000000000000222,'1','','','',0); -INSERT INTO mirror_var VALUES(164,'discount','Mirror input parameter',0.02450000000000000094,'1','','','',0); -INSERT INTO mirror_var VALUES(165,'LSA','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(166,'cost_file','Mirror input parameter','woodruff-data.csv','1','','','',0); -INSERT INTO mirror_var VALUES(167,'method','Mirror input parameter','new','1','','','',0); -INSERT INTO mirror_var VALUES(168,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(169,'include_tax','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(170,'include_licensing','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(171,'include_contingency','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(172,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(173,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(174,'a_EC','Mirror input parameter',1.0,'m','','','V_vac, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(175,'expander_cell_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(176,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(177,'vacuum_gap_CC','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(178,'first_wall_material','Mirror input parameter','W','1','','','',0); -INSERT INTO mirror_var VALUES(179,'first_wall_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(180,'vacuum_vessel_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(181,'vacuum_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(182,'multiplier_material','Mirror input parameter','Pb','1','','','',0); -INSERT INTO mirror_var VALUES(183,'multiplier_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(184,'blanket_coolant_material','Mirror input parameter','Natural PbLi','1','','','',0); -INSERT INTO mirror_var VALUES(185,'blanket_thickness','Mirror input parameter',1.0,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(186,'blanket_coolant_fraction','Mirror input parameter',0.9000000000000000222,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(187,'blanket_structural_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(188,'blanket_structural_fraction','Mirror input parameter',0.1000000000000000055,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(189,'outer_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(190,'L_EP','Mirror input parameter',1.0,'m','','','L, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(191,'L_EC','Mirror input parameter',1.0,'m','','','L, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(192,'a_EP','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(193,'HF_magnet_number','Mirror input parameter',4.0,'1','','','HF_magnet_cost',0); -INSERT INTO mirror_var VALUES(194,'LF_magnet_number','Mirror input parameter',2.0,'1','','','LF_magnet_cost',0); -INSERT INTO mirror_var VALUES(195,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); -INSERT INTO mirror_var VALUES(196,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); -INSERT INTO mirror_var VALUES(197,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); -INSERT INTO mirror_var VALUES(198,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); -INSERT INTO mirror_var VALUES(199,'HF_magnet_shield_cost','HF magnet shield cost per end plug',35.00849418659200297,'million','cal_HF_magnet_shield_cost','a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m','',0); -INSERT INTO mirror_var VALUES(200,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','',0); -INSERT INTO mirror_var VALUES(201,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','',0); -INSERT INTO mirror_var VALUES(202,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(203,'firstwall_t','PyFECONS radial build first wall thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(204,'blanket1_t','PyFECONS radial build blanket thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(205,'reflector_t','PyFECONS radial build reflector thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(206,'ht_shield_t','PyFECONS radial build high-temperature shield thickness',0.25,'m','','','',0); -INSERT INTO mirror_var VALUES(207,'structure_t','PyFECONS radial build support structure thickness',0.2000000000000000111,'m','','','',0); -INSERT INTO mirror_var VALUES(208,'gap1_t','PyFECONS radial build first gap thickness',0.5,'m','','','',0); -INSERT INTO mirror_var VALUES(209,'vessel_t','PyFECONS radial build vessel thickness',0.2000000000000000111,'m','','','',0); -INSERT INTO mirror_var VALUES(210,'coil_t','PyFECONS radial build coil thickness',1.760000000000000008,'m','','','',0); -INSERT INTO mirror_var VALUES(211,'gap2_t','PyFECONS radial build second gap thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(212,'lt_shield_t','PyFECONS radial build low-temperature shield thickness',0.2999999999999999889,'m','','','',0); -INSERT INTO mirror_var VALUES(213,'bioshield_t','PyFECONS radial build bioshield thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(214,'FS_rho','PyFECONS Ferritic Steel density',7470.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(215,'FS_c_raw','PyFECONS Ferritic Steel raw cost',10.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(216,'FS_m','PyFECONS Ferritic Steel manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(217,'FS_sigma','PyFECONS Ferritic Steel stress limit',450.0,'MPa','','','',0); -INSERT INTO mirror_var VALUES(218,'Pb_rho','PyFECONS Lead density',9400.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(219,'Pb_c_raw','PyFECONS Lead raw cost',2.399999999999999912,'dollar/kg','','','P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(220,'Pb_m','PyFECONS Lead manufacturing multiplier',1.5,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(221,'Li4SiO4_rho','PyFECONS Lithium Silicate density',2390.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(222,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw cost',1.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(223,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(224,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(225,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(226,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(227,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(228,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(229,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(230,'Li_c_raw','PyFECONS Lithium raw cost',70.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(231,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); -INSERT INTO mirror_var VALUES(232,'BFS_rho','PyFECONS BFS density',7800.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(233,'BFS_c_raw','PyFECONS BFS raw cost',30.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(234,'BFS_m','PyFECONS BFS manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(235,'SiC_rho','PyFECONS Silicon Carbide density',3200.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(236,'SiC_c_raw','PyFECONS Silicon Carbide raw cost',14.49000000000000021,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(237,'SiC_m','PyFECONS Silicon Carbide manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(238,'Inconel_rho','PyFECONS Inconel density',8440.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(239,'Inconel_c_raw','PyFECONS Inconel raw cost',46.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(240,'Inconel_m','PyFECONS Inconel manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(241,'Cu_rho','PyFECONS Copper density',7300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(242,'Cu_c_raw','PyFECONS Copper raw cost',10.19999999999999928,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(243,'Cu_m','PyFECONS Copper manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(244,'Polyimide_rho','PyFECONS Polyimide density',1430.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(245,'Polyimide_c_raw','PyFECONS Polyimide raw cost',100.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(246,'Polyimide_m','PyFECONS Polyimide manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(247,'YBCO_rho','PyFECONS YBCO density',6200.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(248,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(249,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(250,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(251,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(252,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(253,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(254,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(255,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); -INSERT INTO mirror_var VALUES(256,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(257,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(258,'Incoloy_c_raw','PyFECONS Incoloy raw cost',4.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(259,'Incoloy_m','PyFECONS Incoloy manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(260,'Be_rho','PyFECONS Beryllium density',1850.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(261,'Be_c_raw','PyFECONS Beryllium raw cost',5750.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(262,'Be_m','PyFECONS Beryllium manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(263,'Li2TiO3_rho','PyFECONS Lithium Titanate density',3430.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(264,'Li2TiO3_c_raw','PyFECONS Lithium Titanate raw cost',1297.049999999999955,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(265,'Li2TiO3_m','PyFECONS Lithium Titanate manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(12,'expander_cell_cost_result','Expander cell vacuum vessel cost from legacy Mirror geometry',0.003960744088457411084,'million','cal_expander_cell_cost_result','L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m','',0); +INSERT INTO mirror_var VALUES(13,'end_plug_cylindrical_part_cost','End plug cylindrical radial-build material cost',0.5031620991790028973,'million','cal_end_plug_cylindrical_part_cost','L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); +INSERT INTO mirror_var VALUES(14,'central_cell_cylindrical_part_cost','Central cell cylindrical radial-build material cost',-0.5031620991790028973,'million','cal_central_cell_cylindrical_part_cost','L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); +INSERT INTO mirror_var VALUES(15,'cost_factor','Cost scaling factor calculated from the unit number using an 0.80 learning factor',1.0,'1','cal_cost_factor','n_unit','',0); +INSERT INTO mirror_var VALUES(16,'cost_pump','Cost of one vacuum pump, scaled from 1985 dollars',40000.0,'dollar/pump','','','',0); +INSERT INTO mirror_var VALUES(17,'vpump_cap','Vacuum volume pumped by one vacuum pump in one second',4.166666666666666963,'m3/pump','','','no_vpumps',0); +INSERT INTO mirror_var VALUES(18,'no_vpumps','Number of vacuum pumps required to pump the full vacuum in one second',2.261946710584650689,'1','cal_no_vpumps','V_vac, vpump_cap','',0); +INSERT INTO mirror_var VALUES(19,'axis_t','PyFECONS radial build axis thickness',0.0,'m','','','',0); +INSERT INTO mirror_var VALUES(20,'axis_ir','str','','1','','','',''); +INSERT INTO mirror_var VALUES(21,'lr','str','','1','','','',''); +INSERT INTO mirror_var VALUES(22,'constructionworker','str','','1','','','',''); +INSERT INTO mirror_var VALUES(23,'C_22_1_11_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(24,'C_22_1_11_1_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(25,'C_22_1_11_2_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(26,'C_22_1_11_3_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(27,'C_22_1_11_4_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(28,'C_22_1_11_5_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(29,'C_22_1_11_6_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(30,'C_22_1_11_7_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(31,'C_22_1_11_8_in','int',0.0,'1','','','',''); +INSERT INTO mirror_var VALUES(32,'C_22_1_11_9_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(33,'C_22_1_11_10_in','int',0.0,'1','','','',''); +INSERT INTO mirror_var VALUES(34,'C220111','str','','1','','','',''); +INSERT INTO mirror_var VALUES(35,'inflation','float',1.429999999999999938,'1','','','',''); +INSERT INTO mirror_var VALUES(36,'C2205010ITER','str','','1','','','',''); +INSERT INTO mirror_var VALUES(37,'C2205020ITER','str','','1','','','',''); +INSERT INTO mirror_var VALUES(38,'C2205030ITER','str','','1','','','',''); +INSERT INTO mirror_var VALUES(39,'C2205040ITER','str','','1','','','',''); +INSERT INTO mirror_var VALUES(40,'C2205050ITER','str','','1','','','',''); +INSERT INTO mirror_var VALUES(41,'C2205060ITER','str','','1','','','',''); +INSERT INTO mirror_var VALUES(42,'lcredit','float',0.8000000000000000444,'1','','','',''); +INSERT INTO mirror_var VALUES(43,'ltoak','str','','1','','','',''); +INSERT INTO mirror_var VALUES(44,'C220501','str','','1','','','',''); +INSERT INTO mirror_var VALUES(45,'C220502','str','','1','','','',''); +INSERT INTO mirror_var VALUES(46,'C220503','str','','1','','','',''); +INSERT INTO mirror_var VALUES(47,'C220504','str','','1','','','',''); +INSERT INTO mirror_var VALUES(48,'C220505','str','','1','','','',''); +INSERT INTO mirror_var VALUES(49,'C220506','str','','1','','','',''); +INSERT INTO mirror_var VALUES(50,'C220500','str','','1','','','',''); +INSERT INTO mirror_var VALUES(51,'f_cr','float',0.08999999999999999667,'1','','','',''); +INSERT INTO mirror_var VALUES(52,'f_6Li_natural','float',0.07499999999999999723,'1','','','',''); +INSERT INTO mirror_var VALUES(53,'rho_6Li','float',460.0,'1','','','',''); +INSERT INTO mirror_var VALUES(54,'rho_7Li','float',537.0,'1','','','',''); +INSERT INTO mirror_var VALUES(55,'T_K','str','','1','','','',''); +INSERT INTO mirror_var VALUES(56,'rho_PbLi','PbLi density from legacy Mirror temperature/enrichment correlation',9838.00919350000003,'kg/m3','cal_rho_PbLi','T, f_6Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(57,'P_6Li075','float',15.15199999999999925,'1','','','',''); +INSERT INTO mirror_var VALUES(58,'P_6Li90','int',70.0,'1','','','',''); +INSERT INTO mirror_var VALUES(59,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','1','','','',''); +INSERT INTO mirror_var VALUES(60,'Cf','list','(1, 2, 4, 8, 16)','1','','','',''); +INSERT INTO mirror_var VALUES(61,'f_interp','str','','1','','','',''); +INSERT INTO mirror_var VALUES(62,'f_Li','float',0.1700000000000000122,'1','','','',''); +INSERT INTO mirror_var VALUES(63,'f_Pb','str','','1','','','',''); +INSERT INTO mirror_var VALUES(64,'P_Li','Lithium price from legacy Mirror enrichment pricing',15.15199999999999925,'dollar/kg','cal_P_Li','f_6Li','P_PbLi',0); +INSERT INTO mirror_var VALUES(65,'P_PbLi','PbLi price from legacy Mirror eutectic mixture pricing',4.567839999999999457,'dollar/kg','cal_P_PbLi','Pb_c_raw, P_Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(66,'P_f_CC','str',-1.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); +INSERT INTO mirror_var VALUES(67,'L_CC','str',-1.0,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L, central_cell_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(68,'L_CF','float',1.0,'m','cal_L_CF','','CF_magnet_number',0); +INSERT INTO mirror_var VALUES(69,'L','str',3.0,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); +INSERT INTO mirror_var VALUES(70,'V_vac','str',9.42477796076937935,'m3','cal_V_vac','L, a_EC','no_vpumps',0); +INSERT INTO mirror_var VALUES(71,'P_alpha','str',0.2001137009664582522,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); +INSERT INTO mirror_var VALUES(72,'P_n','str',0.7998862990335418033,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(73,'P_ine','str',70.0,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(74,'P_pump','str',0.02639624786810687921,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); +INSERT INTO mirror_var VALUES(75,'P_sub_cont','str',0.04000000000000000083,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); +INSERT INTO mirror_var VALUES(76,'P_cryo','str',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); +INSERT INTO mirror_var VALUES(77,'P_other','str',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(78,'P_in','str',35.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); +INSERT INTO mirror_var VALUES(79,'P_th','str',158.5050690819081751,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); +INSERT INTO mirror_var VALUES(80,'P_the','str',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); +INSERT INTO mirror_var VALUES(81,'P_DEC','str',70.01989764480569533,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); +INSERT INTO mirror_var VALUES(82,'P_DECe','str',63.0179078803251329,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); +INSERT INTO mirror_var VALUES(83,'P_egross','str',158.1209493283582219,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); +INSERT INTO mirror_var VALUES(84,'P_enet','str',94.9150046322633188,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); +INSERT INTO mirror_var VALUES(85,'f_aux','str',0.03156555460446152512,'1','cal_f_aux','P_aux, P_egross','',0); +INSERT INTO mirror_var VALUES(86,'Q_sci','str',0.02857142857142857054,'1','cal_Q_sci','P_f, P_in','',0); +INSERT INTO mirror_var VALUES(87,'Q_eng','str',0.4520795021880652519,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); +INSERT INTO mirror_var VALUES(88,'f_refrac','str',2.212000312245963496,'1','cal_f_refrac','Q_eng','',0); +INSERT INTO mirror_var VALUES(89,'run_name','str','','1','','','',''); +INSERT INTO mirror_var VALUES(90,'cost_file_full','str','','1','','','',''); +INSERT INTO mirror_var VALUES(91,'new_data','str','','1','','','',''); +INSERT INTO mirror_var VALUES(92,'r_in','str','','1','','','',''); +INSERT INTO mirror_var VALUES(93,'r_out','str','','1','','','',''); +INSERT INTO mirror_var VALUES(94,'radial_build','str','','1','','','',''); +INSERT INTO mirror_var VALUES(95,'filename','str','','1','','','',''); +INSERT INTO mirror_var VALUES(96,'T','Mean coolant temperature for legacy PbLi density correlation',300.0,'degC','','','rho_PbLi',0); +INSERT INTO mirror_var VALUES(97,'material','str','','1','','','',''); +INSERT INTO mirror_var VALUES(98,'f_6Li','Lithium-6 enrichment fraction for legacy PbLi pricing',0.07499999999999999723,'1','','','P_Li, rho_PbLi',0); +INSERT INTO mirror_var VALUES(99,'radius','str','','1','','','',''); +INSERT INTO mirror_var VALUES(100,'thickness','str','','1','','','',''); +INSERT INTO mirror_var VALUES(101,'vv_material','str','','1','','','',''); +INSERT INTO mirror_var VALUES(102,'V_end_cap','str','','1','','','',''); +INSERT INTO mirror_var VALUES(103,'M_end_cap','str','','1','','','',''); +INSERT INTO mirror_var VALUES(104,'C_end_cap','str','','1','','','',''); +INSERT INTO mirror_var VALUES(105,'total','str','','1','','','',''); +INSERT INTO mirror_var VALUES(106,'cost','float',29.10000000000000142,'1','','','',''); +INSERT INTO mirror_var VALUES(107,'a_M','HF shield magnet bore/plasma radius from legacy Mirror geometry',0.1499999999999999945,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(108,'a_CC','Legacy Mirror central cell plasma radius',0.5400000000000000355,'m','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(109,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.6999999999999999556,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(110,'length','HF shield radially inner cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(111,'r_gap','HF shield radial gap',0.1000000000000000055,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(112,'r_vv','HF shield vacuum vessel radial thickness allowance',0.0100000000000000002,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(113,'r_magnet','HF shield magnet radius',1.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(114,'r_cryostat','HF shield cryostat radius allowance',1.0,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(115,'f_vol','HF shield volume fill fraction',0.9000000000000000222,'1','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(116,'V_radially_inner_cylinder','str','','1','','','',''); +INSERT INTO mirror_var VALUES(117,'length_cc_cylinder','HF shield central-cell-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(118,'r_in_cc','str','','1','','','',''); +INSERT INTO mirror_var VALUES(119,'r_out_cc','str','','1','','','',''); +INSERT INTO mirror_var VALUES(120,'V_cc_cylinder','str','','1','','','',''); +INSERT INTO mirror_var VALUES(121,'V_cc_triangle','str','','1','','','',''); +INSERT INTO mirror_var VALUES(122,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(123,'r_in_ep','str','','1','','','',''); +INSERT INTO mirror_var VALUES(124,'r_out_ep','str','','1','','','',''); +INSERT INTO mirror_var VALUES(125,'V_ep_cylinder','str','','1','','','',''); +INSERT INTO mirror_var VALUES(126,'V_ep_triangle','str','','1','','','',''); +INSERT INTO mirror_var VALUES(127,'V_total_cc_facing','str','','1','','','',''); +INSERT INTO mirror_var VALUES(128,'V_total_ec_facing','str','','1','','','',''); +INSERT INTO mirror_var VALUES(129,'V_total','str','','1','','','',''); +INSERT INTO mirror_var VALUES(130,'mass','str','','1','','','',''); +INSERT INTO mirror_var VALUES(131,'application','Mirror input parameter','heat','1','','','P_egross',0); +INSERT INTO mirror_var VALUES(132,'P_f','Mirror input parameter',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); +INSERT INTO mirror_var VALUES(133,'P_f_L','Mirror input parameter',1.0,'MW/m','','','L_CC',0); +INSERT INTO mirror_var VALUES(134,'P_f_EP','Mirror input parameter',1.0,'MW','','','P_f_CC',0); +INSERT INTO mirror_var VALUES(135,'P_NBI','Mirror input parameter',15.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(136,'P_ECH','Mirror input parameter',10.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(137,'P_ICRH','Mirror input parameter',10.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(138,'M_n','Mirror input parameter',1.100000000000000089,'1','','','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(139,'N_module','Mirror input parameter',1.0,'1','','','',0); +INSERT INTO mirror_var VALUES(140,'f_pump','Mirror input parameter',0.02999999999999999889,'1','','','P_pump',0); +INSERT INTO mirror_var VALUES(141,'f_sub','Mirror input parameter',0.04000000000000000083,'1','','','P_sub_cont',0); +INSERT INTO mirror_var VALUES(142,'f_cryo','Mirror input parameter',0.0100000000000000002,'1','','','P_cryo',0); +INSERT INTO mirror_var VALUES(143,'P_pfcool','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(144,'P_thcool','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(145,'P_coils','Mirror input parameter',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(146,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); +INSERT INTO mirror_var VALUES(147,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); +INSERT INTO mirror_var VALUES(148,'eta_DEC','Mirror input parameter',0.9000000000000000222,'1','','','P_DECe',0); +INSERT INTO mirror_var VALUES(149,'eta_pump','Mirror input parameter',0.979999999999999983,'1','','','P_th',0); +INSERT INTO mirror_var VALUES(150,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(151,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(152,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(153,'NOAK','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(154,'n_unit','Mirror input parameter',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); +INSERT INTO mirror_var VALUES(155,'construction_time','Mirror input parameter',6.0,'years','','','',0); +INSERT INTO mirror_var VALUES(156,'lifetime','Mirror input parameter',30.0,'years','','','',0); +INSERT INTO mirror_var VALUES(157,'replacement','Mirror input parameter',10.0,'years','','','',0); +INSERT INTO mirror_var VALUES(158,'availability','Mirror input parameter',0.9000000000000000222,'1','','','',0); +INSERT INTO mirror_var VALUES(159,'discount','Mirror input parameter',0.02450000000000000094,'1','','','',0); +INSERT INTO mirror_var VALUES(160,'LSA','Mirror input parameter',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(161,'cost_file','Mirror input parameter','woodruff-data.csv','1','','','',0); +INSERT INTO mirror_var VALUES(162,'method','Mirror input parameter','new','1','','','',0); +INSERT INTO mirror_var VALUES(163,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(164,'include_tax','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(165,'include_licensing','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(166,'include_contingency','Mirror input parameter',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(167,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(168,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(169,'a_EC','Mirror input parameter',1.0,'m','','','V_vac, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(170,'expander_cell_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(171,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(172,'vacuum_gap_CC','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(173,'first_wall_material','Mirror input parameter','W','1','','','',0); +INSERT INTO mirror_var VALUES(174,'first_wall_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(175,'vacuum_vessel_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(176,'vacuum_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(177,'multiplier_material','Mirror input parameter','Pb','1','','','',0); +INSERT INTO mirror_var VALUES(178,'multiplier_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(179,'blanket_coolant_material','Mirror input parameter','Natural PbLi','1','','','',0); +INSERT INTO mirror_var VALUES(180,'blanket_thickness','Mirror input parameter',1.0,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(181,'blanket_coolant_fraction','Mirror input parameter',0.9000000000000000222,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(182,'blanket_structural_material','Mirror input parameter','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(183,'blanket_structural_fraction','Mirror input parameter',0.1000000000000000055,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(184,'outer_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(185,'L_EP','Mirror input parameter',1.0,'m','','','L, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(186,'L_EC','Mirror input parameter',1.0,'m','','','L, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(187,'a_EP','Mirror input parameter',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(188,'HF_magnet_number','Mirror input parameter',4.0,'1','','','HF_magnet_cost',0); +INSERT INTO mirror_var VALUES(189,'LF_magnet_number','Mirror input parameter',2.0,'1','','','LF_magnet_cost',0); +INSERT INTO mirror_var VALUES(190,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); +INSERT INTO mirror_var VALUES(191,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); +INSERT INTO mirror_var VALUES(192,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); +INSERT INTO mirror_var VALUES(193,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); +INSERT INTO mirror_var VALUES(194,'HF_magnet_shield_cost','HF magnet shield cost per end plug',35.00849418659200297,'million','cal_HF_magnet_shield_cost','a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m','',0); +INSERT INTO mirror_var VALUES(195,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','',0); +INSERT INTO mirror_var VALUES(196,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','',0); +INSERT INTO mirror_var VALUES(197,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(198,'firstwall_t','PyFECONS radial build first wall thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(199,'blanket1_t','PyFECONS radial build blanket thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(200,'reflector_t','PyFECONS radial build reflector thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(201,'ht_shield_t','PyFECONS radial build high-temperature shield thickness',0.25,'m','','','',0); +INSERT INTO mirror_var VALUES(202,'structure_t','PyFECONS radial build support structure thickness',0.2000000000000000111,'m','','','',0); +INSERT INTO mirror_var VALUES(203,'gap1_t','PyFECONS radial build first gap thickness',0.5,'m','','','',0); +INSERT INTO mirror_var VALUES(204,'vessel_t','PyFECONS radial build vessel thickness',0.2000000000000000111,'m','','','',0); +INSERT INTO mirror_var VALUES(205,'coil_t','PyFECONS radial build coil thickness',1.760000000000000008,'m','','','',0); +INSERT INTO mirror_var VALUES(206,'gap2_t','PyFECONS radial build second gap thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(207,'lt_shield_t','PyFECONS radial build low-temperature shield thickness',0.2999999999999999889,'m','','','',0); +INSERT INTO mirror_var VALUES(208,'bioshield_t','PyFECONS radial build bioshield thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(209,'FS_rho','PyFECONS Ferritic Steel density',7470.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(210,'FS_c_raw','PyFECONS Ferritic Steel raw cost',10.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(211,'FS_m','PyFECONS Ferritic Steel manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(212,'FS_sigma','PyFECONS Ferritic Steel stress limit',450.0,'MPa','','','',0); +INSERT INTO mirror_var VALUES(213,'Pb_rho','PyFECONS Lead density',9400.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(214,'Pb_c_raw','PyFECONS Lead raw cost',2.399999999999999912,'dollar/kg','','','P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(215,'Pb_m','PyFECONS Lead manufacturing multiplier',1.5,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(216,'Li4SiO4_rho','PyFECONS Lithium Silicate density',2390.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(217,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw cost',1.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(218,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(219,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(220,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(221,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(222,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(223,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(224,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(225,'Li_c_raw','PyFECONS Lithium raw cost',70.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(226,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); +INSERT INTO mirror_var VALUES(227,'BFS_rho','PyFECONS BFS density',7800.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(228,'BFS_c_raw','PyFECONS BFS raw cost',30.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(229,'BFS_m','PyFECONS BFS manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(230,'SiC_rho','PyFECONS Silicon Carbide density',3200.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(231,'SiC_c_raw','PyFECONS Silicon Carbide raw cost',14.49000000000000021,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(232,'SiC_m','PyFECONS Silicon Carbide manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(233,'Inconel_rho','PyFECONS Inconel density',8440.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(234,'Inconel_c_raw','PyFECONS Inconel raw cost',46.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(235,'Inconel_m','PyFECONS Inconel manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(236,'Cu_rho','PyFECONS Copper density',7300.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(237,'Cu_c_raw','PyFECONS Copper raw cost',10.19999999999999928,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(238,'Cu_m','PyFECONS Copper manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(239,'Polyimide_rho','PyFECONS Polyimide density',1430.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(240,'Polyimide_c_raw','PyFECONS Polyimide raw cost',100.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(241,'Polyimide_m','PyFECONS Polyimide manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(242,'YBCO_rho','PyFECONS YBCO density',6200.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(243,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(244,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(245,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(246,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(247,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(248,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(249,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(250,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); +INSERT INTO mirror_var VALUES(251,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(252,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(253,'Incoloy_c_raw','PyFECONS Incoloy raw cost',4.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(254,'Incoloy_m','PyFECONS Incoloy manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(255,'Be_rho','PyFECONS Beryllium density',1850.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(256,'Be_c_raw','PyFECONS Beryllium raw cost',5750.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(257,'Be_m','PyFECONS Beryllium manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(258,'Li2TiO3_rho','PyFECONS Lithium Titanate density',3430.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(259,'Li2TiO3_c_raw','PyFECONS Lithium Titanate raw cost',1297.049999999999955,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(260,'Li2TiO3_m','PyFECONS Lithium Titanate manufacturing multiplier',3.0,'1','','','',0); CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.54000000284,0,'','Unchanged',0.004687831810420024433,'','million',''); INSERT INTO mirror_acco VALUES(2,'11','Land_and_Land_Rights',1186117.539999999804,1,'1','Unchanged',0.0002298971517736676198,'','million',''); diff --git a/src/etc/accert.sch b/src/etc/accert.sch index 35a33be..43baa8a 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -798,7 +798,7 @@ fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'ann stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] mirror_alg_names = ['Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_HF_magnet_cost' 'cal_LF_magnet_cost' 'cal_CF_magnet_cost' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number' 'cal_rho_PbLi' 'cal_P_Li' 'cal_P_PbLi' 'cal_central_cell_cylindrical_part_cost' 'cal_end_plug_cylindrical_part_cost' 'cal_expander_cell_cost_result' 'cal_HF_magnet_shield_cost'] -mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'L_magnet_to_magnet' 'L_cylinder' 'expander_cell_cost_result' 'end_plug_cylindrical_part' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part' 'central_cell_cylindrical_part_cost' 'total_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number' 'HF_magnet_shield_cost' 'chamber_length' 'plasma_t' 'vacuum_t' 'firstwall_t' 'blanket1_t' 'reflector_t' 'ht_shield_t' 'structure_t' 'gap1_t' 'vessel_t' 'coil_t' 'gap2_t' 'lt_shield_t' 'bioshield_t' 'FS_rho' 'FS_c_raw' 'FS_m' 'FS_sigma' 'Pb_rho' 'Pb_c_raw' 'Pb_m' 'Li4SiO4_rho' 'Li4SiO4_c_raw' 'Li4SiO4_m' 'FLiBe_rho' 'FLiBe_c' 'W_rho' 'W_c_raw' 'W_m' 'Li_rho' 'Li_c_raw' 'Li_m' 'BFS_rho' 'BFS_c_raw' 'BFS_m' 'SiC_rho' 'SiC_c_raw' 'SiC_m' 'Inconel_rho' 'Inconel_c_raw' 'Inconel_m' 'Cu_rho' 'Cu_c_raw' 'Cu_m' 'Polyimide_rho' 'Polyimide_c_raw' 'Polyimide_m' 'YBCO_rho' 'YBCO_c' 'Concrete_rho' 'Concrete_c_raw' 'Concrete_m' 'SS316_rho' 'SS316_c_raw' 'SS316_m' 'SS316_sigma' 'Nb3Sn_c' 'Incoloy_rho' 'Incoloy_c_raw' 'Incoloy_m' 'Be_rho' 'Be_c_raw' 'Be_m' 'Li2TiO3_rho' 'Li2TiO3_c_raw' 'Li2TiO3_m'] +mirror_var_names = ['E_DT' 'E_alpha' 'E_n' 'm_T' 'm_D' 'm_6Li' 'Wh_to_BTU' 'indentation' 'indented_name' 'inputs' 'cost_data' 'expander_cell_cost_result' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'axis_ir' 'lr' 'constructionworker' 'C_22_1_11_in' 'C_22_1_11_1_in' 'C_22_1_11_2_in' 'C_22_1_11_3_in' 'C_22_1_11_4_in' 'C_22_1_11_5_in' 'C_22_1_11_6_in' 'C_22_1_11_7_in' 'C_22_1_11_8_in' 'C_22_1_11_9_in' 'C_22_1_11_10_in' 'C220111' 'inflation' 'C2205010ITER' 'C2205020ITER' 'C2205030ITER' 'C2205040ITER' 'C2205050ITER' 'C2205060ITER' 'lcredit' 'ltoak' 'C220501' 'C220502' 'C220503' 'C220504' 'C220505' 'C220506' 'C220500' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'T_K' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_interp' 'f_Li' 'f_Pb' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'run_name' 'cost_file_full' 'new_data' 'r_in' 'r_out' 'radial_build' 'filename' 'T' 'material' 'f_6Li' 'radius' 'thickness' 'vv_material' 'V_end_cap' 'M_end_cap' 'C_end_cap' 'total' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'V_radially_inner_cylinder' 'length_cc_cylinder' 'r_in_cc' 'r_out_cc' 'V_cc_cylinder' 'V_cc_triangle' 'length_ep_cylinder' 'r_in_ep' 'r_out_ep' 'V_ep_cylinder' 'V_ep_triangle' 'V_total_cc_facing' 'V_total_ec_facing' 'V_total' 'mass' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number' 'HF_magnet_shield_cost' 'chamber_length' 'plasma_t' 'vacuum_t' 'firstwall_t' 'blanket1_t' 'reflector_t' 'ht_shield_t' 'structure_t' 'gap1_t' 'vessel_t' 'coil_t' 'gap2_t' 'lt_shield_t' 'bioshield_t' 'FS_rho' 'FS_c_raw' 'FS_m' 'FS_sigma' 'Pb_rho' 'Pb_c_raw' 'Pb_m' 'Li4SiO4_rho' 'Li4SiO4_c_raw' 'Li4SiO4_m' 'FLiBe_rho' 'FLiBe_c' 'W_rho' 'W_c_raw' 'W_m' 'Li_rho' 'Li_c_raw' 'Li_m' 'BFS_rho' 'BFS_c_raw' 'BFS_m' 'SiC_rho' 'SiC_c_raw' 'SiC_m' 'Inconel_rho' 'Inconel_c_raw' 'Inconel_m' 'Cu_rho' 'Cu_c_raw' 'Cu_m' 'Polyimide_rho' 'Polyimide_c_raw' 'Polyimide_m' 'YBCO_rho' 'YBCO_c' 'Concrete_rho' 'Concrete_c_raw' 'Concrete_m' 'SS316_rho' 'SS316_c_raw' 'SS316_m' 'SS316_sigma' 'Nb3Sn_c' 'Incoloy_rho' 'Incoloy_c_raw' 'Incoloy_m' 'Be_rho' 'Be_c_raw' 'Be_m' 'Li2TiO3_rho' 'Li2TiO3_c_raw' 'Li2TiO3_m'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index ca1ea88..4e4fd7b 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -104,6 +104,14 @@ MIRROR_DEFAULT_EXPORT_EXCLUDE = {"verbose", "exact", "save", "load"} +MIRROR_UNUSED_C2211_FRAME_VARIABLES = { + "L_magnet_to_magnet", + "L_cylinder", + "end_plug_cylindrical_part", + "central_cell_cylindrical_part", + "total_cost", +} + MIRROR_ACCOUNT_COLUMNS = [ ("ind", "INTEGER"), ("code_of_account", "TEXT NOT NULL"), @@ -988,6 +996,13 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: "UPDATE mirror_var SET v_linked = ? WHERE var_name = ?", (", ".join(sorted(set(links))), var_name), ) + conn.executemany( + "DELETE FROM mirror_var WHERE var_name = ?", + [(var_name,) for var_name in sorted(MIRROR_UNUSED_C2211_FRAME_VARIABLES)], + ) + rows = conn.execute("SELECT rowid FROM mirror_var ORDER BY ind, rowid").fetchall() + for new_ind, (rowid,) in enumerate(rows, start=1): + conn.execute("UPDATE mirror_var SET ind = ? WHERE rowid = ?", (new_ind, rowid)) def _write_default_inputs_csv(algorithm_source: Path, path: Path) -> int: diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 168671b..596adee 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -589,9 +589,19 @@ def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor) """ SELECT COUNT(*) FROM mirror_var - WHERE var_name IN (?, ?, ?, ?); + WHERE var_name IN (?, ?, ?, ?, ?, ?, ?, ?, ?); """, - ("blanket1_vol", "blanket_cost", "first_wall_cost", "firstwall_vol"), + ( + "blanket1_vol", + "blanket_cost", + "central_cell_cylindrical_part", + "end_plug_cylindrical_part", + "first_wall_cost", + "firstwall_vol", + "L_cylinder", + "L_magnet_to_magnet", + "total_cost", + ), ) assert cursor.fetchone()[0] == 0 diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index d7e2c93..afeab6a 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -10,257 +10,252 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 9,indented_name,str,,1,,,, 10,inputs,str,,1,,,, 11,cost_data,str,,1,,,, -12,L_magnet_to_magnet,str,,1,,,, -13,L_cylinder,str,,1,,,, -14,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 -15,end_plug_cylindrical_part,str,,1,,,, -16,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,0.5031620991790029,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 -17,central_cell_cylindrical_part,str,,1,,,, -18,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,-0.5031620991790029,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 -19,total_cost,str,,1,,,, -20,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 -21,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 -22,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 -23,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 -24,axis_t,PyFECONS radial build axis thickness,0.0,m,,,,0 -25,axis_ir,str,,1,,,, -26,lr,str,,1,,,, -27,constructionworker,str,,1,,,, -28,C_22_1_11_in,str,,1,,,, -29,C_22_1_11_1_in,str,,1,,,, -30,C_22_1_11_2_in,str,,1,,,, -31,C_22_1_11_3_in,str,,1,,,, -32,C_22_1_11_4_in,str,,1,,,, -33,C_22_1_11_5_in,str,,1,,,, -34,C_22_1_11_6_in,str,,1,,,, -35,C_22_1_11_7_in,str,,1,,,, -36,C_22_1_11_8_in,int,0.0,1,,,, -37,C_22_1_11_9_in,str,,1,,,, -38,C_22_1_11_10_in,int,0.0,1,,,, -39,C220111,str,,1,,,, -40,inflation,float,1.43,1,,,, -41,C2205010ITER,str,,1,,,, -42,C2205020ITER,str,,1,,,, -43,C2205030ITER,str,,1,,,, -44,C2205040ITER,str,,1,,,, -45,C2205050ITER,str,,1,,,, -46,C2205060ITER,str,,1,,,, -47,lcredit,float,0.8,1,,,, -48,ltoak,str,,1,,,, -49,C220501,str,,1,,,, -50,C220502,str,,1,,,, -51,C220503,str,,1,,,, -52,C220504,str,,1,,,, -53,C220505,str,,1,,,, -54,C220506,str,,1,,,, -55,C220500,str,,1,,,, -56,f_cr,float,0.09,1,,,, -57,f_6Li_natural,float,0.075,1,,,, -58,rho_6Li,float,460.0,1,,,, -59,rho_7Li,float,537.0,1,,,, -60,T_K,str,,1,,,, -61,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9838.0091935,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -62,P_6Li075,float,15.152,1,,,, -63,P_6Li90,int,70.0,1,,,, -64,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",1,,,, -65,Cf,list,"(1, 2, 4, 8, 16)",1,,,, -66,f_interp,str,,1,,,, -67,f_Li,float,0.17,1,,,, -68,f_Pb,str,,1,,,, -69,P_Li,Lithium price from legacy Mirror enrichment pricing,15.152,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 -70,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,4.5678399999999995,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -71,P_f_CC,str,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 -72,L_CC,str,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 -73,L_CF,float,1.0,m,cal_L_CF,,CF_magnet_number,0 -74,L,str,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 -75,V_vac,str,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 -76,P_alpha,str,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 -77,P_n,str,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 -78,P_ine,str,70.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 -79,P_pump,str,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 -80,P_sub_cont,str,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 -81,P_cryo,str,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 -82,P_other,str,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 -83,P_in,str,35.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 -84,P_th,str,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 -85,P_the,str,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 -86,P_DEC,str,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 -87,P_DECe,str,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 -88,P_egross,str,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 -89,P_enet,str,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 -90,f_aux,str,0.031565554604461525,1,cal_f_aux,"P_aux, P_egross",,0 -91,Q_sci,str,0.02857142857142857,1,cal_Q_sci,"P_f, P_in",,0 -92,Q_eng,str,0.45207950218806525,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 -93,f_refrac,str,2.2120003122459635,1,cal_f_refrac,Q_eng,,0 -94,run_name,str,,1,,,, -95,cost_file_full,str,,1,,,, -96,new_data,str,,1,,,, -97,r_in,str,,1,,,, -98,r_out,str,,1,,,, -99,radial_build,str,,1,,,, -100,filename,str,,1,,,, -101,T,Mean coolant temperature for legacy PbLi density correlation,300.0,degC,,,rho_PbLi,0 -102,material,str,,1,,,, -103,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.075,1,,,"P_Li, rho_PbLi",0 -104,radius,str,,1,,,, -105,thickness,str,,1,,,, -106,vv_material,str,,1,,,, -107,V_end_cap,str,,1,,,, -108,M_end_cap,str,,1,,,, -109,C_end_cap,str,,1,,,, -110,total,str,,1,,,, -111,cost,float,29.1,1,,,, -112,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 -113,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -114,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 -115,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -116,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 -117,r_vv,HF shield vacuum vessel radial thickness allowance,0.01,m,,,HF_magnet_shield_cost,0 -118,r_magnet,HF shield magnet radius,1.5,m,,,HF_magnet_shield_cost,0 -119,r_cryostat,HF shield cryostat radius allowance,1.0,m,,,HF_magnet_shield_cost,0 -120,f_vol,HF shield volume fill fraction,0.9,1,,,HF_magnet_shield_cost,0 -121,V_radially_inner_cylinder,str,,1,,,, -122,length_cc_cylinder,HF shield central-cell-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -123,r_in_cc,str,,1,,,, -124,r_out_cc,str,,1,,,, -125,V_cc_cylinder,str,,1,,,, -126,V_cc_triangle,str,,1,,,, -127,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -128,r_in_ep,str,,1,,,, -129,r_out_ep,str,,1,,,, -130,V_ep_cylinder,str,,1,,,, -131,V_ep_triangle,str,,1,,,, -132,V_total_cc_facing,str,,1,,,, -133,V_total_ec_facing,str,,1,,,, -134,V_total,str,,1,,,, -135,mass,str,,1,,,, -136,application,Mirror input parameter,heat,1,,,P_egross,0 -137,P_f,Mirror input parameter,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 -138,P_f_L,Mirror input parameter,1.0,MW/m,,,L_CC,0 -139,P_f_EP,Mirror input parameter,1.0,MW,,,P_f_CC,0 -140,P_NBI,Mirror input parameter,15.0,MW,,,"P_in, P_ine",0 -141,P_ECH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 -142,P_ICRH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 -143,M_n,Mirror input parameter,1.1,1,,,"P_pump, P_th",0 -144,N_module,Mirror input parameter,1.0,1,,,,0 -145,f_pump,Mirror input parameter,0.03,1,,,P_pump,0 -146,f_sub,Mirror input parameter,0.04,1,,,P_sub_cont,0 -147,f_cryo,Mirror input parameter,0.01,1,,,P_cryo,0 -148,P_pfcool,Mirror input parameter,0.0,MW,,,,0 -149,P_thcool,Mirror input parameter,0.0,MW,,,,0 -150,P_coils,Mirror input parameter,0.0,MW,,,,0 -151,P_aux,Mirror input parameter,1.0,MW,,,f_aux,0 -152,eta_th,Mirror input parameter,0.5,1,,,P_the,0 -153,eta_DEC,Mirror input parameter,0.9,1,,,P_DECe,0 -154,eta_pump,Mirror input parameter,0.98,1,,,P_th,0 -155,eta_NBI,Mirror input parameter,0.5,1,,,P_ine,0 -156,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 -157,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 -158,NOAK,Mirror input parameter,0.0,1,,,,0 -159,n_unit,Mirror input parameter,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 -160,construction_time,Mirror input parameter,6.0,years,,,,0 -161,lifetime,Mirror input parameter,30.0,years,,,,0 -162,replacement,Mirror input parameter,10.0,years,,,,0 -163,availability,Mirror input parameter,0.9,1,,,,0 -164,discount,Mirror input parameter,0.0245,1,,,,0 -165,LSA,Mirror input parameter,2.0,1,,,,0 -166,cost_file,Mirror input parameter,woodruff-data.csv,1,,,,0 -167,method,Mirror input parameter,new,1,,,,0 -168,include_decommissioning,Mirror input parameter,0.0,1,,,,0 -169,include_tax,Mirror input parameter,0.0,1,,,,0 -170,include_licensing,Mirror input parameter,0.0,1,,,,0 -171,include_contingency,Mirror input parameter,0.0,1,,,,0 -172,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 -173,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 -174,a_EC,Mirror input parameter,1.0,m,,,"V_vac, expander_cell_cost_result",0 -175,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,expander_cell_cost_result,0 -176,expander_cell_vessel_material,Mirror input parameter,SS316,1,,,,0 -177,vacuum_gap_CC,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -178,first_wall_material,Mirror input parameter,W,1,,,,0 -179,first_wall_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -180,vacuum_vessel_material,Mirror input parameter,SS316,1,,,,0 -181,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -182,multiplier_material,Mirror input parameter,Pb,1,,,,0 -183,multiplier_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -184,blanket_coolant_material,Mirror input parameter,Natural PbLi,1,,,,0 -185,blanket_thickness,Mirror input parameter,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -186,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -187,blanket_structural_material,Mirror input parameter,SS316,1,,,,0 -188,blanket_structural_fraction,Mirror input parameter,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -189,outer_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -190,L_EP,Mirror input parameter,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 -191,L_EC,Mirror input parameter,1.0,m,,,"L, expander_cell_cost_result",0 -192,a_EP,Mirror input parameter,1.0,m,,,,0 -193,HF_magnet_number,Mirror input parameter,4.0,1,,,HF_magnet_cost,0 -194,LF_magnet_number,Mirror input parameter,2.0,1,,,LF_magnet_cost,0 -195,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 -196,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 -197,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 -198,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 -199,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 -200,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 -201,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 -202,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 -203,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 -204,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 -205,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 -206,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 -207,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 -208,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 -209,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 -210,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 -211,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 -212,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 -213,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 -214,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 -215,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 -216,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 -217,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 -218,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -219,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -220,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -221,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 -222,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 -223,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 -224,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 -225,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 -226,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -227,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -228,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -229,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 -230,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 -231,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 -232,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 -233,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 -234,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 -235,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 -236,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 -237,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 -238,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 -239,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 -240,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 -241,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 -242,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 -243,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 -244,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 -245,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 -246,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 -247,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 -248,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 -249,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 -250,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 -251,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 -252,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -253,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -254,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -255,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 -256,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 -257,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 -258,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 -259,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 -260,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 -261,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 -262,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 -263,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 -264,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 -265,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 +12,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 +13,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,0.5031620991790029,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 +14,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,-0.5031620991790029,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 +15,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 +16,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 +17,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 +18,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 +19,axis_t,PyFECONS radial build axis thickness,0.0,m,,,,0 +20,axis_ir,str,,1,,,, +21,lr,str,,1,,,, +22,constructionworker,str,,1,,,, +23,C_22_1_11_in,str,,1,,,, +24,C_22_1_11_1_in,str,,1,,,, +25,C_22_1_11_2_in,str,,1,,,, +26,C_22_1_11_3_in,str,,1,,,, +27,C_22_1_11_4_in,str,,1,,,, +28,C_22_1_11_5_in,str,,1,,,, +29,C_22_1_11_6_in,str,,1,,,, +30,C_22_1_11_7_in,str,,1,,,, +31,C_22_1_11_8_in,int,0.0,1,,,, +32,C_22_1_11_9_in,str,,1,,,, +33,C_22_1_11_10_in,int,0.0,1,,,, +34,C220111,str,,1,,,, +35,inflation,float,1.43,1,,,, +36,C2205010ITER,str,,1,,,, +37,C2205020ITER,str,,1,,,, +38,C2205030ITER,str,,1,,,, +39,C2205040ITER,str,,1,,,, +40,C2205050ITER,str,,1,,,, +41,C2205060ITER,str,,1,,,, +42,lcredit,float,0.8,1,,,, +43,ltoak,str,,1,,,, +44,C220501,str,,1,,,, +45,C220502,str,,1,,,, +46,C220503,str,,1,,,, +47,C220504,str,,1,,,, +48,C220505,str,,1,,,, +49,C220506,str,,1,,,, +50,C220500,str,,1,,,, +51,f_cr,float,0.09,1,,,, +52,f_6Li_natural,float,0.075,1,,,, +53,rho_6Li,float,460.0,1,,,, +54,rho_7Li,float,537.0,1,,,, +55,T_K,str,,1,,,, +56,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9838.0091935,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +57,P_6Li075,float,15.152,1,,,, +58,P_6Li90,int,70.0,1,,,, +59,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",1,,,, +60,Cf,list,"(1, 2, 4, 8, 16)",1,,,, +61,f_interp,str,,1,,,, +62,f_Li,float,0.17,1,,,, +63,f_Pb,str,,1,,,, +64,P_Li,Lithium price from legacy Mirror enrichment pricing,15.152,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 +65,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,4.5678399999999995,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +66,P_f_CC,str,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 +67,L_CC,str,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 +68,L_CF,float,1.0,m,cal_L_CF,,CF_magnet_number,0 +69,L,str,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 +70,V_vac,str,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 +71,P_alpha,str,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 +72,P_n,str,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 +73,P_ine,str,70.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 +74,P_pump,str,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 +75,P_sub_cont,str,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 +76,P_cryo,str,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 +77,P_other,str,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 +78,P_in,str,35.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 +79,P_th,str,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 +80,P_the,str,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 +81,P_DEC,str,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 +82,P_DECe,str,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 +83,P_egross,str,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 +84,P_enet,str,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 +85,f_aux,str,0.031565554604461525,1,cal_f_aux,"P_aux, P_egross",,0 +86,Q_sci,str,0.02857142857142857,1,cal_Q_sci,"P_f, P_in",,0 +87,Q_eng,str,0.45207950218806525,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 +88,f_refrac,str,2.2120003122459635,1,cal_f_refrac,Q_eng,,0 +89,run_name,str,,1,,,, +90,cost_file_full,str,,1,,,, +91,new_data,str,,1,,,, +92,r_in,str,,1,,,, +93,r_out,str,,1,,,, +94,radial_build,str,,1,,,, +95,filename,str,,1,,,, +96,T,Mean coolant temperature for legacy PbLi density correlation,300.0,degC,,,rho_PbLi,0 +97,material,str,,1,,,, +98,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.075,1,,,"P_Li, rho_PbLi",0 +99,radius,str,,1,,,, +100,thickness,str,,1,,,, +101,vv_material,str,,1,,,, +102,V_end_cap,str,,1,,,, +103,M_end_cap,str,,1,,,, +104,C_end_cap,str,,1,,,, +105,total,str,,1,,,, +106,cost,float,29.1,1,,,, +107,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 +108,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +109,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 +110,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +111,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 +112,r_vv,HF shield vacuum vessel radial thickness allowance,0.01,m,,,HF_magnet_shield_cost,0 +113,r_magnet,HF shield magnet radius,1.5,m,,,HF_magnet_shield_cost,0 +114,r_cryostat,HF shield cryostat radius allowance,1.0,m,,,HF_magnet_shield_cost,0 +115,f_vol,HF shield volume fill fraction,0.9,1,,,HF_magnet_shield_cost,0 +116,V_radially_inner_cylinder,str,,1,,,, +117,length_cc_cylinder,HF shield central-cell-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +118,r_in_cc,str,,1,,,, +119,r_out_cc,str,,1,,,, +120,V_cc_cylinder,str,,1,,,, +121,V_cc_triangle,str,,1,,,, +122,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +123,r_in_ep,str,,1,,,, +124,r_out_ep,str,,1,,,, +125,V_ep_cylinder,str,,1,,,, +126,V_ep_triangle,str,,1,,,, +127,V_total_cc_facing,str,,1,,,, +128,V_total_ec_facing,str,,1,,,, +129,V_total,str,,1,,,, +130,mass,str,,1,,,, +131,application,Mirror input parameter,heat,1,,,P_egross,0 +132,P_f,Mirror input parameter,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 +133,P_f_L,Mirror input parameter,1.0,MW/m,,,L_CC,0 +134,P_f_EP,Mirror input parameter,1.0,MW,,,P_f_CC,0 +135,P_NBI,Mirror input parameter,15.0,MW,,,"P_in, P_ine",0 +136,P_ECH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 +137,P_ICRH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 +138,M_n,Mirror input parameter,1.1,1,,,"P_pump, P_th",0 +139,N_module,Mirror input parameter,1.0,1,,,,0 +140,f_pump,Mirror input parameter,0.03,1,,,P_pump,0 +141,f_sub,Mirror input parameter,0.04,1,,,P_sub_cont,0 +142,f_cryo,Mirror input parameter,0.01,1,,,P_cryo,0 +143,P_pfcool,Mirror input parameter,0.0,MW,,,,0 +144,P_thcool,Mirror input parameter,0.0,MW,,,,0 +145,P_coils,Mirror input parameter,0.0,MW,,,,0 +146,P_aux,Mirror input parameter,1.0,MW,,,f_aux,0 +147,eta_th,Mirror input parameter,0.5,1,,,P_the,0 +148,eta_DEC,Mirror input parameter,0.9,1,,,P_DECe,0 +149,eta_pump,Mirror input parameter,0.98,1,,,P_th,0 +150,eta_NBI,Mirror input parameter,0.5,1,,,P_ine,0 +151,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 +152,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 +153,NOAK,Mirror input parameter,0.0,1,,,,0 +154,n_unit,Mirror input parameter,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 +155,construction_time,Mirror input parameter,6.0,years,,,,0 +156,lifetime,Mirror input parameter,30.0,years,,,,0 +157,replacement,Mirror input parameter,10.0,years,,,,0 +158,availability,Mirror input parameter,0.9,1,,,,0 +159,discount,Mirror input parameter,0.0245,1,,,,0 +160,LSA,Mirror input parameter,2.0,1,,,,0 +161,cost_file,Mirror input parameter,woodruff-data.csv,1,,,,0 +162,method,Mirror input parameter,new,1,,,,0 +163,include_decommissioning,Mirror input parameter,0.0,1,,,,0 +164,include_tax,Mirror input parameter,0.0,1,,,,0 +165,include_licensing,Mirror input parameter,0.0,1,,,,0 +166,include_contingency,Mirror input parameter,0.0,1,,,,0 +167,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 +168,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 +169,a_EC,Mirror input parameter,1.0,m,,,"V_vac, expander_cell_cost_result",0 +170,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,expander_cell_cost_result,0 +171,expander_cell_vessel_material,Mirror input parameter,SS316,1,,,,0 +172,vacuum_gap_CC,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +173,first_wall_material,Mirror input parameter,W,1,,,,0 +174,first_wall_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +175,vacuum_vessel_material,Mirror input parameter,SS316,1,,,,0 +176,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +177,multiplier_material,Mirror input parameter,Pb,1,,,,0 +178,multiplier_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +179,blanket_coolant_material,Mirror input parameter,Natural PbLi,1,,,,0 +180,blanket_thickness,Mirror input parameter,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +181,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +182,blanket_structural_material,Mirror input parameter,SS316,1,,,,0 +183,blanket_structural_fraction,Mirror input parameter,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +184,outer_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +185,L_EP,Mirror input parameter,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 +186,L_EC,Mirror input parameter,1.0,m,,,"L, expander_cell_cost_result",0 +187,a_EP,Mirror input parameter,1.0,m,,,,0 +188,HF_magnet_number,Mirror input parameter,4.0,1,,,HF_magnet_cost,0 +189,LF_magnet_number,Mirror input parameter,2.0,1,,,LF_magnet_cost,0 +190,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 +191,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 +192,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 +193,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 +194,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 +195,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 +196,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 +197,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 +198,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 +199,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 +200,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 +201,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 +202,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 +203,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 +204,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 +205,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 +206,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 +207,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 +208,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 +209,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 +210,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 +211,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 +212,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 +213,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +214,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +215,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +216,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 +217,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 +218,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 +219,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 +220,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 +221,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +222,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +223,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +224,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 +225,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 +226,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 +227,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 +228,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 +229,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 +230,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 +231,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 +232,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 +233,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 +234,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 +235,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 +236,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 +237,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 +238,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 +239,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 +240,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 +241,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 +242,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 +243,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 +244,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 +245,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 +246,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 +247,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +248,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +249,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +250,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 +251,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 +252,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 +253,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 +254,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 +255,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 +256,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 +257,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 +258,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 +259,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 +260,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 From c4b9dcbe2863739371005331c60395429cb70afc Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Sun, 2 Aug 2026 13:49:49 -0500 Subject: [PATCH 19/23] Prune unused blank Mirror variable rows --- src/accertdb.sqlite | Bin 1105920 -> 1105920 bytes src/accertdb_sqlite_schema_data.sql | 451 ++++++++---------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 9 + test/test_mirror_model.py | 35 ++ .../accert/ref_tables/mirror_variable.csv | 451 ++++++++---------- 6 files changed, 431 insertions(+), 517 deletions(-) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index ed29696bd2e491b62896da1a6b790dce694b5118..b259cba270335acacd406497a365c05ba5faa569 100644 GIT binary patch delta 4776 zcmb_g3sh9+wf_G(^Ei(=b2iTbM?^s0@)(fE2#AQrh^QE%HbxyLFvut`VF1xuJqj9p zBZe&!CH6sH)oN=p(Ws&6%I&(VX_MZYCdQ_==H4Xr(c0Xsq|ItI_djPq&Fbn}z3cWI z&djX+`u4x~{`bER+s4Ybjg=pCgnUW}wUK)lmHMaW(ofZz-Wu9lW9Y5ndTWfmHKyJg zb8n5Mw}yYIM!1zlm*JvpA%PlkL$+{-F2@$9kY^H@scQjxhW>^cx2LMrf!(=6IyFCP zw$G0<;M8|GJKoI`EcpHmA)GG7Kh6+7Ge7cmrkxsgMdl0a5!oZL$I2d=J+?q(zVdk= zl>^o><#$TFMNMUJyt3e{$B(KQk z9%7>d2Gd>Buaq(+(fB1D;AV?Q#By_-P%r<%{H6J6bI(6>2P%H2tf174Wf3qXFm_GZ zPpJhr6hVAo!+$AAsR=iHq(leeKT;%0Ma=wIS#C66AW{8g;nSuhi8MWoS7dhC%H26R zZl~MH{<7V^W?!@4X^A2w1D=DfgqUd}O&u4M?+X@=%L&&Fi?xtf7!;M*B^s;RElP5R z%uCpDUAaO9th%8rqkLfWhEmO$te%a&b}ZWoQ5gA01q@z_O!-dgBwnNm<0wX7bDg)@ z@A3OubXVdnB8_EMHCH)Yd|R;_S%il*MI8K-wze~^eab-V!CIc0SFzZeQbz&cEKrCw z+$QOCB~d<5thOwhMZPJ&WxZ?twe@xDUTcFj8|P$0PNmV#J!5#=@C1E>uKfSrnpYQa zr4wZ8!UiX-r-k^A6NYI4w&p;iJ-@c4-Cy6>;_=Tei5_CtQ73nooYB-y%B$9j)ZV47 zG?mZ8lew_eXly0X{bdoh6<&!ds>u)`%Q5^6Oq>A=4OYiMYtee*kVUicavtQ-EVSiA8O_A1e0ZE@;P>;PlupN6`7o2FV{!o$ z(KM_rfVngkpDTb_GzC8?fJbOD&MaiSBfMz-Jz}MAynbL+%I80E%CG7{k>krm8WNGAS4K2;6hi`y!l7cePCLF;3{f-^ ze_srVGy-iUa5B!en1p{Fhmc7{B6Zjex`}Z7padK-VQmd9?)-5~`ld6fN<%L7xI*N$Yps6P-#Xxuj+BeA3h`&1A4%p|Q5jTjvXAy!5)3aF%iA#3@bo zg`D`5`?an3n(G_&st;QJ;@bRE;hU~GO-!6Bf7L#%%3lK^+15WOj7G(b(b+I{tIXdZ zX@<)oa-H#naW?mba+-UNn`OAnpRydZq+3>-KQqhbZKhScY8o=d8b9KfT8FHS)?(>3 zsn^Px&zb(yJWpC>xh}DGLjk(-y?hS633v6wL9TedV zeOIpADpIFgTX_Lrh99+om(Iq8?ck%O_){&1>yN>m`I~t znp!l!NQ-QD3&wRqBti!$3UR5SY+LC3IKC1yJ0LTZ5fzb!>BK~S!6J8aP@|^ z8gk#_!g_aWM^mfLk1IX?%F>&?Q(kda=|mc*yd%K*)Dm$xU zU0FJ}M(dyMdS9bA7{QmiAv7dOP1F`kbqRN6b(zisgEL2Er&lmpGQVbU6C~U6)dZ0y z>iLuT)tJ8t(rr0vyyhphYYSV2txPU5OO4Z1gS5vRef3_yuPF!`KBe31X=^W3r;0Rd zTw*1@zX>vIN$M2VxyD!b4J_LXj)(#^dLsYPe6^PUx%0|{-k;tKiY-r#ny6Mg{|NqK zGo-~6>raU^-mCJ}NfV2R;2+iW@71%T^fqgVtShp5_BUjxcD+zo_U!ypd~*xLho`BL z8h9|HRaNfV7GEQtP{AIxXhpgjp&1VHmS`64W!orUB*(NCH6*WSXWp$2Zt9u1VGC5U z-LIrE={5IH3w_(pVXtI^5b3~eZSWZ8pvdSISuHxqLP#oWD+ zM*DDgFI3Yf@oFzTMt5Q1PFN`He4^3Qyx!{{7yRx{m@4+x``X(5U7p6qd)j8awG$F8 zJ)NG~j*g}vIeQl*TXwWIdfJ;jK}sj1(Cv797dvxRyw=XT<==L}zuD^4d2C*DS{%+2 zncs@Pd=eg0*uI~8pZG0w^=ZUTl^wFF%Yu?y@I)W12a=@D*6KI7#W#7dr3<3No5&os zbb>sO@2+%D)USIt!~mJE&YIvZ;Wt+5O2}9ye1Y*5rp*r7a+h7-o*nq^ZYWU5Lu#SO za+jzR+i>z8C}J6kl!g_ALNON5wx@;@n+5^*>tWnLASSQgclNAih z<%fzLXYU1%LQ2#bBCDk!Vl$rJ3pozWc z0UNPvAEd{SO{!C($rE_%gZXi@%(EsO+|CbJn5$-sbpE&p>o99SxD?`1*=Vppw@}La zG-3q4brA&3>sUOyAELupTrwwuxrlG@+za&=`yoytrD}#|HkhBaxcdUcV9^e+D+v$P|q~B%Smo zF~k@`4bx4Znm#doWt?t|l)ds^t8Bbsykfk|t>&t^^~ztATUb*Av+>(C@B~JAAZCf1 zOW8vm=o!);( z(O+hgf%EzyW$~8 zlF5(98G7G&rk_n2D-MCfz+nA{V3vWrhG!2!F};MJ9%2LRMNA%GllBE%H^8RwSMm7) zD5U4{L+$GvIu5fb>J{`Jh8Jl7L!N?X>C1TTDHx$I;bVhrdOwTD2U%zM5q><#Ci@>^ z96~ldgO4EO(9_t9Yp;>`AQDzP^urN7x&|i}>$HnB)uiw(GcM~o-3eothAyzx1cz1}o^F4g{D6{Zg>^;gLzk_2(A)kI5|9q4o zpTLx1=G8OUGz=~}g3k`KB_7A$48sw63_G8O!}MvCj=^3!j7N?!z+ZEe6+l#h!w$-*O+ZXSA|X;O&zXYr=^ zws=+?T_d8nPh2Bri=6O3!pFiD;pf5+gbrb?uu#YprV627yA8ts@z$z+29KfVpwlRf zkz}?R5~cu`U}*QZb=3Mh+PrQ*c}ol@@e1zrCfx}JbC*AB#DbQ z1m6$HfVKwhccH-9*$+?0#+9~xg#8PMU4cCp!9WeRpW=Z_P#9+W^6xqTUbzIZ4h6^q X|9a9aYSU$l(o5|9Wnq~78od9%9%iwo delta 7317 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 Date: Sun, 2 Aug 2026 13:58:28 -0500 Subject: [PATCH 20/23] Improve Mirror variable descriptions --- src/Algorithm/MirrorFunc.py | 3 +- src/accertdb.sqlite | Bin 1105920 -> 1110016 bytes src/accertdb_sqlite_schema_data.sql | 377 +++++++++--------- src/etc/accert.sch | 2 +- src/scripts/build_mirror_accert_tables.py | 187 ++++++++- test/test_mirror_model.py | 26 +- tutorial/accert/ref_tables/MirrorFunc.py | 3 +- .../accert/ref_tables/mirror_algorithm.csv | 2 +- .../accert/ref_tables/mirror_variable.csv | 375 +++++++++-------- 9 files changed, 564 insertions(+), 411 deletions(-) diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index e2a19f0..e30d482 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -202,8 +202,7 @@ def cal_P_Li(f_6Li): raise ValueError("Lithium pricing at this enrichment level is not supported") @staticmethod - def cal_P_PbLi(Pb_c_raw, P_Li): - f_Li = 0.17 + def cal_P_PbLi(Pb_c_raw, P_Li, f_Li): return (1 - f_Li) * Pb_c_raw + f_Li * P_Li @staticmethod diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index b259cba270335acacd406497a365c05ba5faa569..276130bd7d31e0a8e8fc8fc65df5ee810f7d67ba 100644 GIT binary patch delta 8628 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 diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 392c640..0dd0680 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -7016,7 +7016,7 @@ INSERT INTO mirror_alg VALUES(108,'cal_f_refrac','v','Mirror generated variable INSERT INTO mirror_alg VALUES(109,'cal_CF_magnet_number','v','Mirror generated variable calculation for CF_magnet_number','MirrorFunc','CF_magnet_number = L_CC / L_CF','1'); INSERT INTO mirror_alg VALUES(110,'cal_rho_PbLi','v','Mirror generated variable calculation for rho_PbLi','MirrorFunc','rho_PbLi = PbLi density corrected for lithium enrichment and temperature','kg/m3'); INSERT INTO mirror_alg VALUES(111,'cal_P_Li','v','Mirror generated variable calculation for P_Li','MirrorFunc','P_Li = lithium price as a function of 6Li enrichment','dollar/kg'); -INSERT INTO mirror_alg VALUES(112,'cal_P_PbLi','v','Mirror generated variable calculation for P_PbLi','MirrorFunc','P_PbLi = 0.83 * Pb_c_raw + 0.17 * P_Li','dollar/kg'); +INSERT INTO mirror_alg VALUES(112,'cal_P_PbLi','v','Mirror generated variable calculation for P_PbLi','MirrorFunc','P_PbLi = (1 - f_Li) * Pb_c_raw + f_Li * P_Li','dollar/kg'); INSERT INTO mirror_alg VALUES(113,'cal_central_cell_cylindrical_part_cost','v','Mirror generated variable calculation for central_cell_cylindrical_part_cost','MirrorFunc','central_cell_cylindrical_part_cost = legacy central-cell radial build material cost for L_CC','million'); INSERT INTO mirror_alg VALUES(114,'cal_end_plug_cylindrical_part_cost','v','Mirror generated variable calculation for end_plug_cylindrical_part_cost','MirrorFunc','end_plug_cylindrical_part_cost = legacy central-cell radial build material cost for L_EP','million'); INSERT INTO mirror_alg VALUES(115,'cal_expander_cell_cost_result','v','Mirror generated variable calculation for expander_cell_cost_result','MirrorFunc','expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6','million'); @@ -7033,201 +7033,186 @@ CREATE TABLE mirror_var ( user_input INTEGER DEFAULT NULL, PRIMARY KEY (var_name) ); -INSERT INTO mirror_var VALUES(1,'E_DT','str',2.818234619999999798e-12,'J','','','P_alpha',0); -INSERT INTO mirror_var VALUES(2,'E_alpha','str',5.639673600000000402e-13,'J','','','P_alpha',0); -INSERT INTO mirror_var VALUES(3,'Wh_to_BTU','float',3.412139999999999951,'1','','','',''); -INSERT INTO mirror_var VALUES(4,'indentation','int',0.0,'1','','','',''); -INSERT INTO mirror_var VALUES(5,'expander_cell_cost_result','Expander cell vacuum vessel cost from legacy Mirror geometry',0.003960744088457411084,'million','cal_expander_cell_cost_result','L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m','',0); -INSERT INTO mirror_var VALUES(6,'end_plug_cylindrical_part_cost','End plug cylindrical radial-build material cost',0.5031620991790028973,'million','cal_end_plug_cylindrical_part_cost','L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); -INSERT INTO mirror_var VALUES(7,'central_cell_cylindrical_part_cost','Central cell cylindrical radial-build material cost',-0.5031620991790028973,'million','cal_central_cell_cylindrical_part_cost','L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); -INSERT INTO mirror_var VALUES(8,'cost_factor','Cost scaling factor calculated from the unit number using an 0.80 learning factor',1.0,'1','cal_cost_factor','n_unit','',0); -INSERT INTO mirror_var VALUES(9,'cost_pump','Cost of one vacuum pump, scaled from 1985 dollars',40000.0,'dollar/pump','','','',0); -INSERT INTO mirror_var VALUES(10,'vpump_cap','Vacuum volume pumped by one vacuum pump in one second',4.166666666666666963,'m3/pump','','','no_vpumps',0); -INSERT INTO mirror_var VALUES(11,'no_vpumps','Number of vacuum pumps required to pump the full vacuum in one second',2.261946710584650689,'1','cal_no_vpumps','V_vac, vpump_cap','',0); -INSERT INTO mirror_var VALUES(12,'axis_t','PyFECONS radial build axis thickness',0.0,'m','','','',0); -INSERT INTO mirror_var VALUES(13,'C_22_1_11_8_in','int',0.0,'1','','','',''); -INSERT INTO mirror_var VALUES(14,'C_22_1_11_10_in','int',0.0,'1','','','',''); -INSERT INTO mirror_var VALUES(15,'inflation','float',1.429999999999999938,'1','','','',''); -INSERT INTO mirror_var VALUES(16,'lcredit','float',0.8000000000000000444,'1','','','',''); -INSERT INTO mirror_var VALUES(17,'f_cr','float',0.08999999999999999667,'1','','','',''); -INSERT INTO mirror_var VALUES(18,'f_6Li_natural','float',0.07499999999999999723,'1','','','',''); -INSERT INTO mirror_var VALUES(19,'rho_6Li','float',460.0,'1','','','',''); -INSERT INTO mirror_var VALUES(20,'rho_7Li','float',537.0,'1','','','',''); -INSERT INTO mirror_var VALUES(21,'rho_PbLi','PbLi density from legacy Mirror temperature/enrichment correlation',9838.00919350000003,'kg/m3','cal_rho_PbLi','T, f_6Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(22,'P_6Li075','float',15.15199999999999925,'1','','','',''); -INSERT INTO mirror_var VALUES(23,'P_6Li90','int',70.0,'1','','','',''); -INSERT INTO mirror_var VALUES(24,'f','list','(0.9, 0.99, 0.999, 0.9999, 0.99999)','1','','','',''); -INSERT INTO mirror_var VALUES(25,'Cf','list','(1, 2, 4, 8, 16)','1','','','',''); -INSERT INTO mirror_var VALUES(26,'f_Li','float',0.1700000000000000122,'1','','','',''); -INSERT INTO mirror_var VALUES(27,'P_Li','Lithium price from legacy Mirror enrichment pricing',15.15199999999999925,'dollar/kg','cal_P_Li','f_6Li','P_PbLi',0); -INSERT INTO mirror_var VALUES(28,'P_PbLi','PbLi price from legacy Mirror eutectic mixture pricing',4.567839999999999457,'dollar/kg','cal_P_PbLi','Pb_c_raw, P_Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(29,'P_f_CC','str',-1.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); -INSERT INTO mirror_var VALUES(30,'L_CC','str',-1.0,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L, central_cell_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(31,'L_CF','float',1.0,'m','cal_L_CF','','CF_magnet_number',0); -INSERT INTO mirror_var VALUES(32,'L','str',3.0,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); -INSERT INTO mirror_var VALUES(33,'V_vac','str',9.42477796076937935,'m3','cal_V_vac','L, a_EC','no_vpumps',0); -INSERT INTO mirror_var VALUES(34,'P_alpha','str',0.2001137009664582522,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); -INSERT INTO mirror_var VALUES(35,'P_n','str',0.7998862990335418033,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); -INSERT INTO mirror_var VALUES(36,'P_ine','str',70.0,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); -INSERT INTO mirror_var VALUES(37,'P_pump','str',0.02639624786810687921,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); -INSERT INTO mirror_var VALUES(38,'P_sub_cont','str',0.04000000000000000083,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); -INSERT INTO mirror_var VALUES(39,'P_cryo','str',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); -INSERT INTO mirror_var VALUES(40,'P_other','str',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); -INSERT INTO mirror_var VALUES(41,'P_in','str',35.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); -INSERT INTO mirror_var VALUES(42,'P_th','str',158.5050690819081751,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); -INSERT INTO mirror_var VALUES(43,'P_the','str',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); -INSERT INTO mirror_var VALUES(44,'P_DEC','str',70.01989764480569533,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); -INSERT INTO mirror_var VALUES(45,'P_DECe','str',63.0179078803251329,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); -INSERT INTO mirror_var VALUES(46,'P_egross','str',158.1209493283582219,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); -INSERT INTO mirror_var VALUES(47,'P_enet','str',94.9150046322633188,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); -INSERT INTO mirror_var VALUES(48,'f_aux','str',0.03156555460446152512,'1','cal_f_aux','P_aux, P_egross','',0); -INSERT INTO mirror_var VALUES(49,'Q_sci','str',0.02857142857142857054,'1','cal_Q_sci','P_f, P_in','',0); -INSERT INTO mirror_var VALUES(50,'Q_eng','str',0.4520795021880652519,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); -INSERT INTO mirror_var VALUES(51,'f_refrac','str',2.212000312245963496,'1','cal_f_refrac','Q_eng','',0); -INSERT INTO mirror_var VALUES(52,'T','Mean coolant temperature for legacy PbLi density correlation',300.0,'degC','','','rho_PbLi',0); -INSERT INTO mirror_var VALUES(53,'f_6Li','Lithium-6 enrichment fraction for legacy PbLi pricing',0.07499999999999999723,'1','','','P_Li, rho_PbLi',0); -INSERT INTO mirror_var VALUES(54,'cost','float',29.10000000000000142,'1','','','',''); -INSERT INTO mirror_var VALUES(55,'a_M','HF shield magnet bore/plasma radius from legacy Mirror geometry',0.1499999999999999945,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(56,'a_CC','Legacy Mirror central cell plasma radius',0.5400000000000000355,'m','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(57,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.6999999999999999556,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(58,'length','HF shield radially inner cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(59,'r_gap','HF shield radial gap',0.1000000000000000055,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(60,'r_vv','HF shield vacuum vessel radial thickness allowance',0.0100000000000000002,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(61,'r_magnet','HF shield magnet radius',1.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(62,'r_cryostat','HF shield cryostat radius allowance',1.0,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(63,'f_vol','HF shield volume fill fraction',0.9000000000000000222,'1','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(64,'length_cc_cylinder','HF shield central-cell-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(65,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(66,'application','Mirror input parameter','heat','1','','','P_egross',0); -INSERT INTO mirror_var VALUES(67,'P_f','Mirror input parameter',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); -INSERT INTO mirror_var VALUES(68,'P_f_L','Mirror input parameter',1.0,'MW/m','','','L_CC',0); -INSERT INTO mirror_var VALUES(69,'P_f_EP','Mirror input parameter',1.0,'MW','','','P_f_CC',0); -INSERT INTO mirror_var VALUES(70,'P_NBI','Mirror input parameter',15.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(71,'P_ECH','Mirror input parameter',10.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(72,'P_ICRH','Mirror input parameter',10.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(73,'M_n','Mirror input parameter',1.100000000000000089,'1','','','P_pump, P_th',0); -INSERT INTO mirror_var VALUES(74,'N_module','Mirror input parameter',1.0,'1','','','',0); -INSERT INTO mirror_var VALUES(75,'f_pump','Mirror input parameter',0.02999999999999999889,'1','','','P_pump',0); -INSERT INTO mirror_var VALUES(76,'f_sub','Mirror input parameter',0.04000000000000000083,'1','','','P_sub_cont',0); -INSERT INTO mirror_var VALUES(77,'f_cryo','Mirror input parameter',0.0100000000000000002,'1','','','P_cryo',0); -INSERT INTO mirror_var VALUES(78,'P_pfcool','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(79,'P_thcool','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(80,'P_coils','Mirror input parameter',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(81,'P_aux','Mirror input parameter',1.0,'MW','','','f_aux',0); -INSERT INTO mirror_var VALUES(82,'eta_th','Mirror input parameter',0.5,'1','','','P_the',0); -INSERT INTO mirror_var VALUES(83,'eta_DEC','Mirror input parameter',0.9000000000000000222,'1','','','P_DECe',0); -INSERT INTO mirror_var VALUES(84,'eta_pump','Mirror input parameter',0.979999999999999983,'1','','','P_th',0); -INSERT INTO mirror_var VALUES(85,'eta_NBI','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(86,'eta_ECH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(87,'eta_ICRH','Mirror input parameter',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(88,'NOAK','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(89,'n_unit','Mirror input parameter',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); -INSERT INTO mirror_var VALUES(90,'construction_time','Mirror input parameter',6.0,'years','','','',0); -INSERT INTO mirror_var VALUES(91,'lifetime','Mirror input parameter',30.0,'years','','','',0); -INSERT INTO mirror_var VALUES(92,'replacement','Mirror input parameter',10.0,'years','','','',0); -INSERT INTO mirror_var VALUES(93,'availability','Mirror input parameter',0.9000000000000000222,'1','','','',0); -INSERT INTO mirror_var VALUES(94,'discount','Mirror input parameter',0.02450000000000000094,'1','','','',0); -INSERT INTO mirror_var VALUES(95,'LSA','Mirror input parameter',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(96,'cost_file','Mirror input parameter','woodruff-data.csv','1','','','',0); -INSERT INTO mirror_var VALUES(97,'method','Mirror input parameter','new','1','','','',0); -INSERT INTO mirror_var VALUES(98,'include_decommissioning','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(99,'include_tax','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(100,'include_licensing','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(101,'include_contingency','Mirror input parameter',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(102,'hf_magnet_length','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(103,'hf_magnet_shielding_thickness','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(104,'a_EC','Mirror input parameter',1.0,'m','','','V_vac, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(105,'expander_cell_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(106,'expander_cell_vessel_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(107,'vacuum_gap_CC','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(108,'first_wall_material','Mirror input parameter','W','1','','','',0); -INSERT INTO mirror_var VALUES(109,'first_wall_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(110,'vacuum_vessel_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(111,'vacuum_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(112,'multiplier_material','Mirror input parameter','Pb','1','','','',0); -INSERT INTO mirror_var VALUES(113,'multiplier_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(114,'blanket_coolant_material','Mirror input parameter','Natural PbLi','1','','','',0); -INSERT INTO mirror_var VALUES(115,'blanket_thickness','Mirror input parameter',1.0,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(116,'blanket_coolant_fraction','Mirror input parameter',0.9000000000000000222,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(117,'blanket_structural_material','Mirror input parameter','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(118,'blanket_structural_fraction','Mirror input parameter',0.1000000000000000055,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(119,'outer_vessel_thickness','Mirror input parameter',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(120,'L_EP','Mirror input parameter',1.0,'m','','','L, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(121,'L_EC','Mirror input parameter',1.0,'m','','','L, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(122,'a_EP','Mirror input parameter',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(123,'HF_magnet_number','Mirror input parameter',4.0,'1','','','HF_magnet_cost',0); -INSERT INTO mirror_var VALUES(124,'LF_magnet_number','Mirror input parameter',2.0,'1','','','LF_magnet_cost',0); -INSERT INTO mirror_var VALUES(125,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); -INSERT INTO mirror_var VALUES(126,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); -INSERT INTO mirror_var VALUES(127,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); -INSERT INTO mirror_var VALUES(128,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); -INSERT INTO mirror_var VALUES(129,'HF_magnet_shield_cost','HF magnet shield cost per end plug',35.00849418659200297,'million','cal_HF_magnet_shield_cost','a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m','',0); -INSERT INTO mirror_var VALUES(130,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','',0); -INSERT INTO mirror_var VALUES(131,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','',0); -INSERT INTO mirror_var VALUES(132,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(133,'firstwall_t','PyFECONS radial build first wall thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(134,'blanket1_t','PyFECONS radial build blanket thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(135,'reflector_t','PyFECONS radial build reflector thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(136,'ht_shield_t','PyFECONS radial build high-temperature shield thickness',0.25,'m','','','',0); -INSERT INTO mirror_var VALUES(137,'structure_t','PyFECONS radial build support structure thickness',0.2000000000000000111,'m','','','',0); -INSERT INTO mirror_var VALUES(138,'gap1_t','PyFECONS radial build first gap thickness',0.5,'m','','','',0); -INSERT INTO mirror_var VALUES(139,'vessel_t','PyFECONS radial build vessel thickness',0.2000000000000000111,'m','','','',0); -INSERT INTO mirror_var VALUES(140,'coil_t','PyFECONS radial build coil thickness',1.760000000000000008,'m','','','',0); -INSERT INTO mirror_var VALUES(141,'gap2_t','PyFECONS radial build second gap thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(142,'lt_shield_t','PyFECONS radial build low-temperature shield thickness',0.2999999999999999889,'m','','','',0); -INSERT INTO mirror_var VALUES(143,'bioshield_t','PyFECONS radial build bioshield thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(144,'FS_rho','PyFECONS Ferritic Steel density',7470.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(145,'FS_c_raw','PyFECONS Ferritic Steel raw cost',10.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(146,'FS_m','PyFECONS Ferritic Steel manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(147,'FS_sigma','PyFECONS Ferritic Steel stress limit',450.0,'MPa','','','',0); -INSERT INTO mirror_var VALUES(148,'Pb_rho','PyFECONS Lead density',9400.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(149,'Pb_c_raw','PyFECONS Lead raw cost',2.399999999999999912,'dollar/kg','','','P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(150,'Pb_m','PyFECONS Lead manufacturing multiplier',1.5,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(151,'Li4SiO4_rho','PyFECONS Lithium Silicate density',2390.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(152,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw cost',1.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(153,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(154,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(155,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(156,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(157,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(158,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(159,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(160,'Li_c_raw','PyFECONS Lithium raw cost',70.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(161,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); -INSERT INTO mirror_var VALUES(162,'BFS_rho','PyFECONS BFS density',7800.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(163,'BFS_c_raw','PyFECONS BFS raw cost',30.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(164,'BFS_m','PyFECONS BFS manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(165,'SiC_rho','PyFECONS Silicon Carbide density',3200.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(166,'SiC_c_raw','PyFECONS Silicon Carbide raw cost',14.49000000000000021,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(167,'SiC_m','PyFECONS Silicon Carbide manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(168,'Inconel_rho','PyFECONS Inconel density',8440.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(169,'Inconel_c_raw','PyFECONS Inconel raw cost',46.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(170,'Inconel_m','PyFECONS Inconel manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(171,'Cu_rho','PyFECONS Copper density',7300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(172,'Cu_c_raw','PyFECONS Copper raw cost',10.19999999999999928,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(173,'Cu_m','PyFECONS Copper manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(174,'Polyimide_rho','PyFECONS Polyimide density',1430.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(175,'Polyimide_c_raw','PyFECONS Polyimide raw cost',100.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(176,'Polyimide_m','PyFECONS Polyimide manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(177,'YBCO_rho','PyFECONS YBCO density',6200.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(178,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(179,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(180,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(181,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(182,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(183,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(184,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(185,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); -INSERT INTO mirror_var VALUES(186,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(187,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(188,'Incoloy_c_raw','PyFECONS Incoloy raw cost',4.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(189,'Incoloy_m','PyFECONS Incoloy manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(190,'Be_rho','PyFECONS Beryllium density',1850.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(191,'Be_c_raw','PyFECONS Beryllium raw cost',5750.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(192,'Be_m','PyFECONS Beryllium manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(193,'Li2TiO3_rho','PyFECONS Lithium Titanate density',3430.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(194,'Li2TiO3_c_raw','PyFECONS Lithium Titanate raw cost',1297.049999999999955,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(195,'Li2TiO3_m','PyFECONS Lithium Titanate manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(1,'E_DT','Energy released per deuterium-tritium fusion reaction',2.818234619999999798e-12,'J','','','P_alpha',0); +INSERT INTO mirror_var VALUES(2,'E_alpha','Alpha-particle energy released per deuterium-tritium fusion reaction',5.639673600000000402e-13,'J','','','P_alpha',0); +INSERT INTO mirror_var VALUES(3,'expander_cell_cost_result','Expander cell vacuum vessel cost from legacy Mirror geometry',0.003960744088457411084,'million','cal_expander_cell_cost_result','L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m','',0); +INSERT INTO mirror_var VALUES(4,'end_plug_cylindrical_part_cost','End plug cylindrical radial-build material cost',0.5031620991790028973,'million','cal_end_plug_cylindrical_part_cost','L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); +INSERT INTO mirror_var VALUES(5,'central_cell_cylindrical_part_cost','Central cell cylindrical radial-build material cost',-0.5031620991790028973,'million','cal_central_cell_cylindrical_part_cost','L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); +INSERT INTO mirror_var VALUES(6,'cost_factor','Cost scaling factor calculated from the unit number using an 0.80 learning factor',1.0,'1','cal_cost_factor','n_unit','',0); +INSERT INTO mirror_var VALUES(7,'cost_pump','Cost of one vacuum pump, scaled from 1985 dollars',40000.0,'dollar/pump','','','',0); +INSERT INTO mirror_var VALUES(8,'vpump_cap','Vacuum volume pumped by one vacuum pump in one second',4.166666666666666963,'m3/pump','','','no_vpumps',0); +INSERT INTO mirror_var VALUES(9,'no_vpumps','Number of vacuum pumps required to pump the full vacuum in one second',2.261946710584650689,'1','cal_no_vpumps','V_vac, vpump_cap','',0); +INSERT INTO mirror_var VALUES(10,'axis_t','PyFECONS radial build axis thickness',0.0,'m','','','',0); +INSERT INTO mirror_var VALUES(11,'rho_PbLi','PbLi density from legacy Mirror temperature/enrichment correlation',9838.00919350000003,'kg/m3','cal_rho_PbLi','T, f_6Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(12,'f_Li','Lithium mass fraction in PbLi eutectic mixture',0.1700000000000000122,'1','','','P_PbLi',0); +INSERT INTO mirror_var VALUES(13,'P_Li','Lithium price from legacy Mirror enrichment pricing',15.15199999999999925,'dollar/kg','cal_P_Li','f_6Li','P_PbLi',0); +INSERT INTO mirror_var VALUES(14,'P_PbLi','PbLi price from legacy Mirror eutectic mixture pricing',4.567839999999999457,'dollar/kg','cal_P_PbLi','Pb_c_raw, P_Li, f_Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(15,'P_f_CC','Fusion power assigned to the central cell',-1.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); +INSERT INTO mirror_var VALUES(16,'L_CC','Calculated central cell length',-1.0,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L, central_cell_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(17,'L_CF','Central-field coil spacing',1.0,'m','cal_L_CF','','CF_magnet_number',0); +INSERT INTO mirror_var VALUES(18,'L','Overall axial length of the Mirror plant',3.0,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); +INSERT INTO mirror_var VALUES(19,'V_vac','Vacuum volume for the Mirror plant',9.42477796076937935,'m3','cal_V_vac','L, a_EC','no_vpumps',0); +INSERT INTO mirror_var VALUES(20,'P_alpha','Fusion alpha-particle power',0.2001137009664582522,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); +INSERT INTO mirror_var VALUES(21,'P_n','Fusion neutron power',0.7998862990335418033,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(22,'P_ine','Injected-power electrical input requirement',70.0,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(23,'P_pump','Pumping power requirement',0.02639624786810687921,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); +INSERT INTO mirror_var VALUES(24,'P_sub_cont','Subsystem control power requirement',0.04000000000000000083,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); +INSERT INTO mirror_var VALUES(25,'P_cryo','Cryogenic power requirement',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); +INSERT INTO mirror_var VALUES(26,'P_other','Total miscellaneous plant power requirement',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(27,'P_in','Total injected heating power',35.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); +INSERT INTO mirror_var VALUES(28,'P_th','Recoverable thermal power',158.5050690819081751,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); +INSERT INTO mirror_var VALUES(29,'P_the','Thermal-electric power contribution',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); +INSERT INTO mirror_var VALUES(30,'P_DEC','Power available to direct energy conversion',70.01989764480569533,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); +INSERT INTO mirror_var VALUES(31,'P_DECe','Electrical output from direct energy conversion',63.0179078803251329,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); +INSERT INTO mirror_var VALUES(32,'P_egross','Gross electric power',158.1209493283582219,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); +INSERT INTO mirror_var VALUES(33,'P_enet','Net electric power',94.9150046322633188,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); +INSERT INTO mirror_var VALUES(34,'f_aux','Auxiliary power fraction relative to gross electric power',0.03156555460446152512,'1','cal_f_aux','P_aux, P_egross','',0); +INSERT INTO mirror_var VALUES(35,'Q_sci','Scientific fusion gain',0.02857142857142857054,'1','cal_Q_sci','P_f, P_in','',0); +INSERT INTO mirror_var VALUES(36,'Q_eng','Engineering gain',0.4520795021880652519,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); +INSERT INTO mirror_var VALUES(37,'f_refrac','Recirculating power fraction',2.212000312245963496,'1','cal_f_refrac','Q_eng','',0); +INSERT INTO mirror_var VALUES(38,'T','Mean coolant temperature for legacy PbLi density correlation',300.0,'degC','','','rho_PbLi',0); +INSERT INTO mirror_var VALUES(39,'f_6Li','Lithium-6 enrichment fraction for legacy PbLi pricing',0.07499999999999999723,'1','','','P_Li, rho_PbLi',0); +INSERT INTO mirror_var VALUES(40,'a_M','HF shield magnet bore/plasma radius from legacy Mirror geometry',0.1499999999999999945,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(41,'a_CC','Legacy Mirror central cell plasma radius',0.5400000000000000355,'m','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(42,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.6999999999999999556,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(43,'length','HF shield radially inner cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(44,'r_gap','HF shield radial gap',0.1000000000000000055,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(45,'r_vv','HF shield vacuum vessel radial thickness allowance',0.0100000000000000002,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(46,'r_magnet','HF shield magnet radius',1.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(47,'r_cryostat','HF shield cryostat radius allowance',1.0,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(48,'f_vol','HF shield volume fill fraction',0.9000000000000000222,'1','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(49,'length_cc_cylinder','HF shield central-cell-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(50,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(51,'application','Mirror plant application mode used for gross-electric-power logic','heat','1','','','P_egross',0); +INSERT INTO mirror_var VALUES(52,'P_f','Total fusion power',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); +INSERT INTO mirror_var VALUES(53,'P_f_L','Fusion power per meter of central cell length',1.0,'MW/m','','','L_CC',0); +INSERT INTO mirror_var VALUES(54,'P_f_EP','Fusion power assigned to each end plug',1.0,'MW','','','P_f_CC',0); +INSERT INTO mirror_var VALUES(55,'P_NBI','Neutral beam injection power',15.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(56,'P_ECH','Electron cyclotron heating power',10.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(57,'P_ICRH','Ion cyclotron resonance heating power',10.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(58,'M_n','Neutron energy multiplication factor',1.100000000000000089,'1','','','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(59,'N_module','Number of Mirror plant modules',1.0,'1','','','',0); +INSERT INTO mirror_var VALUES(60,'f_pump','Fraction of neutron power used for pumping',0.02999999999999999889,'1','','','P_pump',0); +INSERT INTO mirror_var VALUES(61,'f_sub','Fraction of fusion power used for subsystem controls',0.04000000000000000083,'1','','','P_sub_cont',0); +INSERT INTO mirror_var VALUES(62,'f_cryo','Fraction of fusion power used for cryogenic load',0.0100000000000000002,'1','','','P_cryo',0); +INSERT INTO mirror_var VALUES(63,'P_pfcool','Plasma-facing-component cooling power',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(64,'P_thcool','Thermal-system cooling power',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(65,'P_coils','Coil power load',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(66,'P_aux','Auxiliary plant power',1.0,'MW','','','f_aux',0); +INSERT INTO mirror_var VALUES(67,'eta_th','Thermal conversion efficiency',0.5,'1','','','P_the',0); +INSERT INTO mirror_var VALUES(68,'eta_DEC','Direct energy conversion efficiency',0.9000000000000000222,'1','','','P_DECe',0); +INSERT INTO mirror_var VALUES(69,'eta_pump','Pump heat recovery efficiency',0.979999999999999983,'1','','','P_th',0); +INSERT INTO mirror_var VALUES(70,'eta_NBI','Neutral beam injection wall-plug efficiency',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(71,'eta_ECH','Electron cyclotron heating wall-plug efficiency',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(72,'eta_ICRH','Ion cyclotron resonance heating wall-plug efficiency',0.5,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(73,'NOAK','Nth-of-a-kind plant flag',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(74,'n_unit','Plant unit number for learning-curve cost scaling',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); +INSERT INTO mirror_var VALUES(75,'construction_time','Construction duration',6.0,'years','','','',0); +INSERT INTO mirror_var VALUES(76,'lifetime','Plant operating lifetime',30.0,'years','','','',0); +INSERT INTO mirror_var VALUES(77,'replacement','Major component replacement interval',10.0,'years','','','',0); +INSERT INTO mirror_var VALUES(78,'availability','Plant availability factor',0.9000000000000000222,'1','','','',0); +INSERT INTO mirror_var VALUES(79,'discount','Real discount rate',0.02450000000000000094,'1','','','',0); +INSERT INTO mirror_var VALUES(80,'LSA','Licensing safety analysis level',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(81,'cost_file','PyFECONS cost data file name','woodruff-data.csv','1','','','',0); +INSERT INTO mirror_var VALUES(82,'method','PyFECONS costing method selector','new','1','','','',0); +INSERT INTO mirror_var VALUES(83,'include_decommissioning','Flag to include decommissioning cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(84,'include_tax','Flag to include tax cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(85,'include_licensing','Flag to include licensing cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(86,'include_contingency','Flag to include contingency cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(87,'hf_magnet_length','High-field magnet axial length',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(88,'hf_magnet_shielding_thickness','High-field magnet shielding thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(89,'a_EC','Expander cell plasma radius',1.0,'m','','','V_vac, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(90,'expander_cell_vessel_thickness','Expander cell vessel wall thickness',0.0100000000000000002,'m','','','expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(91,'expander_cell_vessel_material','Expander cell vessel material','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(92,'vacuum_gap_CC','Central cell radial vacuum gap',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(93,'first_wall_material','Central cell first wall material','W','1','','','',0); +INSERT INTO mirror_var VALUES(94,'first_wall_thickness','Central cell first wall thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(95,'vacuum_vessel_material','Central cell vacuum vessel material','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(96,'vacuum_vessel_thickness','Central cell vacuum vessel thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(97,'multiplier_material','Central cell neutron multiplier material','Pb','1','','','',0); +INSERT INTO mirror_var VALUES(98,'multiplier_thickness','Central cell neutron multiplier thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(99,'blanket_coolant_material','Central cell blanket coolant material','Natural PbLi','1','','','',0); +INSERT INTO mirror_var VALUES(100,'blanket_thickness','Central cell blanket radial thickness',1.0,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(101,'blanket_coolant_fraction','Central cell blanket coolant volume fraction',0.9000000000000000222,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(102,'blanket_structural_material','Central cell blanket structural material','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(103,'blanket_structural_fraction','Central cell blanket structural volume fraction',0.1000000000000000055,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(104,'outer_vessel_thickness','Central cell outer vessel thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(105,'L_EP','End plug axial length',1.0,'m','','','L, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(106,'L_EC','Expander cell axial length',1.0,'m','','','L, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(107,'a_EP','End plug plasma radius',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(108,'HF_magnet_number','Number of high-field magnets',4.0,'1','','','HF_magnet_cost',0); +INSERT INTO mirror_var VALUES(109,'LF_magnet_number','Number of low-field magnets',2.0,'1','','','LF_magnet_cost',0); +INSERT INTO mirror_var VALUES(110,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); +INSERT INTO mirror_var VALUES(111,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); +INSERT INTO mirror_var VALUES(112,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); +INSERT INTO mirror_var VALUES(113,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); +INSERT INTO mirror_var VALUES(114,'HF_magnet_shield_cost','HF magnet shield cost per end plug',35.00849418659200297,'million','cal_HF_magnet_shield_cost','a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m','',0); +INSERT INTO mirror_var VALUES(115,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','',0); +INSERT INTO mirror_var VALUES(116,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','',0); +INSERT INTO mirror_var VALUES(117,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(118,'firstwall_t','PyFECONS radial build first wall thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(119,'blanket1_t','PyFECONS radial build blanket thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(120,'reflector_t','PyFECONS radial build reflector thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(121,'ht_shield_t','PyFECONS radial build high-temperature shield thickness',0.25,'m','','','',0); +INSERT INTO mirror_var VALUES(122,'structure_t','PyFECONS radial build support structure thickness',0.2000000000000000111,'m','','','',0); +INSERT INTO mirror_var VALUES(123,'gap1_t','PyFECONS radial build first gap thickness',0.5,'m','','','',0); +INSERT INTO mirror_var VALUES(124,'vessel_t','PyFECONS radial build vessel thickness',0.2000000000000000111,'m','','','',0); +INSERT INTO mirror_var VALUES(125,'coil_t','PyFECONS radial build coil thickness',1.760000000000000008,'m','','','',0); +INSERT INTO mirror_var VALUES(126,'gap2_t','PyFECONS radial build second gap thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(127,'lt_shield_t','PyFECONS radial build low-temperature shield thickness',0.2999999999999999889,'m','','','',0); +INSERT INTO mirror_var VALUES(128,'bioshield_t','PyFECONS radial build bioshield thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(129,'FS_rho','PyFECONS Ferritic Steel density',7470.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(130,'FS_c_raw','PyFECONS Ferritic Steel raw cost',10.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(131,'FS_m','PyFECONS Ferritic Steel manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(132,'FS_sigma','PyFECONS Ferritic Steel stress limit',450.0,'MPa','','','',0); +INSERT INTO mirror_var VALUES(133,'Pb_rho','PyFECONS Lead density',9400.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(134,'Pb_c_raw','PyFECONS Lead raw cost',2.399999999999999912,'dollar/kg','','','P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(135,'Pb_m','PyFECONS Lead manufacturing multiplier',1.5,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(136,'Li4SiO4_rho','PyFECONS Lithium Silicate density',2390.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(137,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw cost',1.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(138,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(139,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(140,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(141,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(142,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(143,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(144,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(145,'Li_c_raw','PyFECONS Lithium raw cost',70.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(146,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); +INSERT INTO mirror_var VALUES(147,'BFS_rho','PyFECONS BFS density',7800.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(148,'BFS_c_raw','PyFECONS BFS raw cost',30.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(149,'BFS_m','PyFECONS BFS manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(150,'SiC_rho','PyFECONS Silicon Carbide density',3200.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(151,'SiC_c_raw','PyFECONS Silicon Carbide raw cost',14.49000000000000021,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(152,'SiC_m','PyFECONS Silicon Carbide manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(153,'Inconel_rho','PyFECONS Inconel density',8440.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(154,'Inconel_c_raw','PyFECONS Inconel raw cost',46.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(155,'Inconel_m','PyFECONS Inconel manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(156,'Cu_rho','PyFECONS Copper density',7300.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(157,'Cu_c_raw','PyFECONS Copper raw cost',10.19999999999999928,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(158,'Cu_m','PyFECONS Copper manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(159,'Polyimide_rho','PyFECONS Polyimide density',1430.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(160,'Polyimide_c_raw','PyFECONS Polyimide raw cost',100.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(161,'Polyimide_m','PyFECONS Polyimide manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(162,'YBCO_rho','PyFECONS YBCO density',6200.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(163,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(164,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(165,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(166,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(167,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(168,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(169,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(170,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); +INSERT INTO mirror_var VALUES(171,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(172,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(173,'Incoloy_c_raw','PyFECONS Incoloy raw cost',4.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(174,'Incoloy_m','PyFECONS Incoloy manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(175,'Be_rho','PyFECONS Beryllium density',1850.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(176,'Be_c_raw','PyFECONS Beryllium raw cost',5750.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(177,'Be_m','PyFECONS Beryllium manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(178,'Li2TiO3_rho','PyFECONS Lithium Titanate density',3430.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(179,'Li2TiO3_c_raw','PyFECONS Lithium Titanate raw cost',1297.049999999999955,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(180,'Li2TiO3_m','PyFECONS Lithium Titanate manufacturing multiplier',3.0,'1','','','',0); CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.54000000284,0,'','Unchanged',0.004687831810420024433,'','million',''); INSERT INTO mirror_acco VALUES(2,'11','Land_and_Land_Rights',1186117.539999999804,1,'1','Unchanged',0.0002298971517736676198,'','million',''); diff --git a/src/etc/accert.sch b/src/etc/accert.sch index 83b76fd..c233d9a 100644 --- a/src/etc/accert.sch +++ b/src/etc/accert.sch @@ -798,7 +798,7 @@ fusion_var_names = ['a' 'acptmax' 'admvol' 'afuel' 'ai' 'aintmass' 'akappa' 'ann stellarator_var_names = ['st_f_b' 'denstl' 'intercoil_surface' 'stella_config_coilsurface' 'st_f_r' 'tftort' 'stella_config_coillength' 'st_f_n'] mirror_alg_names = ['Account_C21_1' 'Account_C21_2' 'Account_C21_3' 'Account_C21_4' 'Account_C21_5' 'Account_C21_6' 'Account_C21_7' 'Account_C21_8' 'Account_C21_9' 'Account_C21_10' 'Account_C21_11' 'Account_C21_12' 'Account_C21_13' 'Account_C21_14' 'Account_C21_15' 'Account_C21_16' 'Account_C21_17' 'Account_C22_1_1' 'Account_C22_1_2' 'Account_C22_1_3_1' 'Account_C22_1_3_2' 'Account_C22_1_3_3' 'Account_C22_1_4_1' 'Account_C22_1_4_2' 'Account_C22_1_4_3' 'Account_C22_1_5' 'Account_C22_1_6_2' 'Account_C22_1_6_3' 'Account_C22_1_6_4' 'Account_C22_1_7' 'Account_C22_1_8' 'Account_C22_1_9' 'Account_C22_1_11' 'Account_C22_3' 'Account_C22_4' 'Account_C22_5' 'Account_C22_6' 'Account_C22_7' 'Account_C23' 'Account_C24' 'Account_C25' 'Account_C26' 'Account_C27' 'Account_C28' 'cal_P_f_CC' 'cal_L_CC' 'cal_L_CF' 'cal_L' 'cal_V_vac' 'cal_no_vpumps' 'cal_cost_factor' 'cal_HF_magnet_cost' 'cal_LF_magnet_cost' 'cal_CF_magnet_cost' 'cal_P_alpha' 'cal_P_n' 'cal_P_ine' 'cal_P_pump' 'cal_P_sub_cont' 'cal_P_cryo' 'cal_P_other' 'cal_P_in' 'cal_P_th' 'cal_P_the' 'cal_P_DEC' 'cal_P_DECe' 'cal_P_egross' 'cal_P_enet' 'cal_f_aux' 'cal_Q_sci' 'cal_Q_eng' 'cal_f_refrac' 'cal_CF_magnet_number' 'cal_rho_PbLi' 'cal_P_Li' 'cal_P_PbLi' 'cal_central_cell_cylindrical_part_cost' 'cal_end_plug_cylindrical_part_cost' 'cal_expander_cell_cost_result' 'cal_HF_magnet_shield_cost'] -mirror_var_names = ['E_DT' 'E_alpha' 'Wh_to_BTU' 'indentation' 'expander_cell_cost_result' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'C_22_1_11_8_in' 'C_22_1_11_10_in' 'inflation' 'lcredit' 'f_cr' 'f_6Li_natural' 'rho_6Li' 'rho_7Li' 'rho_PbLi' 'P_6Li075' 'P_6Li90' 'f' 'Cf' 'f_Li' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'T' 'f_6Li' 'cost' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'length_cc_cylinder' 'length_ep_cylinder' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number' 'HF_magnet_shield_cost' 'chamber_length' 'plasma_t' 'vacuum_t' 'firstwall_t' 'blanket1_t' 'reflector_t' 'ht_shield_t' 'structure_t' 'gap1_t' 'vessel_t' 'coil_t' 'gap2_t' 'lt_shield_t' 'bioshield_t' 'FS_rho' 'FS_c_raw' 'FS_m' 'FS_sigma' 'Pb_rho' 'Pb_c_raw' 'Pb_m' 'Li4SiO4_rho' 'Li4SiO4_c_raw' 'Li4SiO4_m' 'FLiBe_rho' 'FLiBe_c' 'W_rho' 'W_c_raw' 'W_m' 'Li_rho' 'Li_c_raw' 'Li_m' 'BFS_rho' 'BFS_c_raw' 'BFS_m' 'SiC_rho' 'SiC_c_raw' 'SiC_m' 'Inconel_rho' 'Inconel_c_raw' 'Inconel_m' 'Cu_rho' 'Cu_c_raw' 'Cu_m' 'Polyimide_rho' 'Polyimide_c_raw' 'Polyimide_m' 'YBCO_rho' 'YBCO_c' 'Concrete_rho' 'Concrete_c_raw' 'Concrete_m' 'SS316_rho' 'SS316_c_raw' 'SS316_m' 'SS316_sigma' 'Nb3Sn_c' 'Incoloy_rho' 'Incoloy_c_raw' 'Incoloy_m' 'Be_rho' 'Be_c_raw' 'Be_m' 'Li2TiO3_rho' 'Li2TiO3_c_raw' 'Li2TiO3_m'] +mirror_var_names = ['E_DT' 'E_alpha' 'expander_cell_cost_result' 'end_plug_cylindrical_part_cost' 'central_cell_cylindrical_part_cost' 'cost_factor' 'cost_pump' 'vpump_cap' 'no_vpumps' 'axis_t' 'rho_PbLi' 'f_Li' 'P_Li' 'P_PbLi' 'P_f_CC' 'L_CC' 'L_CF' 'L' 'V_vac' 'P_alpha' 'P_n' 'P_ine' 'P_pump' 'P_sub_cont' 'P_cryo' 'P_other' 'P_in' 'P_th' 'P_the' 'P_DEC' 'P_DECe' 'P_egross' 'P_enet' 'f_aux' 'Q_sci' 'Q_eng' 'f_refrac' 'T' 'f_6Li' 'a_M' 'a_CC' 'a_0' 'length' 'r_gap' 'r_vv' 'r_magnet' 'r_cryostat' 'f_vol' 'length_cc_cylinder' 'length_ep_cylinder' 'application' 'P_f' 'P_f_L' 'P_f_EP' 'P_NBI' 'P_ECH' 'P_ICRH' 'M_n' 'N_module' 'f_pump' 'f_sub' 'f_cryo' 'P_pfcool' 'P_thcool' 'P_coils' 'P_aux' 'eta_th' 'eta_DEC' 'eta_pump' 'eta_NBI' 'eta_ECH' 'eta_ICRH' 'NOAK' 'n_unit' 'construction_time' 'lifetime' 'replacement' 'availability' 'discount' 'LSA' 'cost_file' 'method' 'include_decommissioning' 'include_tax' 'include_licensing' 'include_contingency' 'hf_magnet_length' 'hf_magnet_shielding_thickness' 'a_EC' 'expander_cell_vessel_thickness' 'expander_cell_vessel_material' 'vacuum_gap_CC' 'first_wall_material' 'first_wall_thickness' 'vacuum_vessel_material' 'vacuum_vessel_thickness' 'multiplier_material' 'multiplier_thickness' 'blanket_coolant_material' 'blanket_thickness' 'blanket_coolant_fraction' 'blanket_structural_material' 'blanket_structural_fraction' 'outer_vessel_thickness' 'L_EP' 'L_EC' 'a_EP' 'HF_magnet_number' 'LF_magnet_number' 'HF_magnet_cost' 'LF_magnet_cost' 'CF_magnet_cost' 'CF_magnet_number' 'HF_magnet_shield_cost' 'chamber_length' 'plasma_t' 'vacuum_t' 'firstwall_t' 'blanket1_t' 'reflector_t' 'ht_shield_t' 'structure_t' 'gap1_t' 'vessel_t' 'coil_t' 'gap2_t' 'lt_shield_t' 'bioshield_t' 'FS_rho' 'FS_c_raw' 'FS_m' 'FS_sigma' 'Pb_rho' 'Pb_c_raw' 'Pb_m' 'Li4SiO4_rho' 'Li4SiO4_c_raw' 'Li4SiO4_m' 'FLiBe_rho' 'FLiBe_c' 'W_rho' 'W_c_raw' 'W_m' 'Li_rho' 'Li_c_raw' 'Li_m' 'BFS_rho' 'BFS_c_raw' 'BFS_m' 'SiC_rho' 'SiC_c_raw' 'SiC_m' 'Inconel_rho' 'Inconel_c_raw' 'Inconel_m' 'Cu_rho' 'Cu_c_raw' 'Cu_m' 'Polyimide_rho' 'Polyimide_c_raw' 'Polyimide_m' 'YBCO_rho' 'YBCO_c' 'Concrete_rho' 'Concrete_c_raw' 'Concrete_m' 'SS316_rho' 'SS316_c_raw' 'SS316_m' 'SS316_sigma' 'Nb3Sn_c' 'Incoloy_rho' 'Incoloy_c_raw' 'Incoloy_m' 'Be_rho' 'Be_c_raw' 'Be_m' 'Li2TiO3_rho' 'Li2TiO3_c_raw' 'Li2TiO3_m'] lpsr_var_names = ['adm_bldg_bldg_vol' 'S' 'bldg_V' 'cont_D_D' 'cont_hatch_ms_bldg_vol' 'cont_H_H' 'cont_V' 'cr_dg_bldg_bldg_vol' 'cr_dg_bldg_sub_S' 'cr_dg_bldg_sub_vol' 'cr_dg_bldg_sup_S' 'cr_dg_bldg_sup_vol' 'elec_P' 'elec_tunnel_bldg_vol' 'frm_flow' 'frm_fuel_cask_cap' 'frm_fuel_crane_cap' 'frm_ht_S' 'frm_prz_M' 'frm_S' 'frm_S_9_71886e_06' 'frm_vsl_M' 'fuel_stor_bldg_bldg_vol' 'fuel_stor_bldg_sub_S' 'fuel_stor_bldg_sub_vol' 'fuel_stor_bldg_sup_S' 'fuel_stor_bldg_sup_vol' 'mc_piping_M' 'non_ess_swgr_bldg_bldg_vol' 'n_crs' 'pri_aux_bldg_bldg_vol' 'pri_aux_bldg_sub_S' 'pri_aux_bldg_sub_vol' 'pri_aux_bldg_sup_S' 'pri_aux_bldg_sup_vol' 'pri_flow' 'rx_D' 'rej_th_P' 'rx_P' 'sfp_V' 'sub_str_S' 'sub_str_V' 'sup_const' 'sup_str_S' 'turb_gen_bldg_sub_vol' 'turb_gen_bldg_sup_S' 'turb_gen_bldg_sup_vol' 'uc_frm_flow' 'uc_frm_fuel_cap' 'uc_frm_ht_S' 'uc_frm_prz_M' 'uc_frm_S' 'uc_frm_S_9_71886e_06' 'uc_frm_vsl_M' 'V_of_212_213_215_216_217' 'waste_bldg_bldg_vol' 'waste_bldg_sub_S' 'waste_bldg_sub_vol' 'waste_bldg_sup_S' 'waste_bldg_sup_vol' 'wwt_bldg_bldg_vol' 'adj_212_14112_lab' 'adj_212_14122_lab' 'adj_cont_mat_1_48' 'adj_half' 'adj_none' 'adj_rx_aux_0_25' 'count_222_11' 'count_222_13' 'exp_lin' 'exp_elec_P' 'exp_P' 'exp_pri_flow' 'exp_rx_D' 'exp_sfp_V' 'exp_tur_plant_equip_elec_P' 'f_elec_P_ctrl_wir' 'f_elec_prot' 'f_elec_st_serv' 'f_elec_str_wir_cont' 'f_elec_switchboards' 'f_elec_swgr' 'f_simp_fuel_hndl' 'f_simp_other_rx_equip' 'f_simp_radw' 'f_simp_sfgd' 'f_ss_cont_fac' 'f_ss_cont_lab' 'f_ss_cont_mat' 'lrn_222_11_fac' 'lrn_222_11_lab' 'lrn_222_11_mat' 'lrn_222_13_fac' 'lrn_222_13_lab' 'lrn_222_13_mat' 'ref_211_1_fac' 'ref_211_1_lab' 'ref_211_1_mat' 'ref_211_4_lab' 'ref_211_4_mat' 'ref_211_711_lab' 'ref_211_711_mat' 'ref_211_712_fac' 'ref_211_712_lab' 'ref_211_712_mat' 'ref_212_13_lab' 'ref_212_13_mat' 'ref_212_140_fac' 'ref_212_140_lab' 'ref_212_140_mat' 'ref_212_14111_lab' 'ref_212_14111_mat' 'ref_212_14112_lab' 'ref_212_14112_mat' 'ref_212_14113_lab' 'ref_212_14113_mat' 'ref_212_14114_lab' 'ref_212_14114_mat' 'ref_212_14115_lab' 'ref_212_14115_mat' 'ref_212_14116_lab' 'ref_212_14116_mat' 'ref_212_14117_lab' 'ref_212_14117_mat' 'ref_212_14118_lab' 'ref_212_14118_mat' 'ref_212_14121_lab' 'ref_212_14121_mat' 'ref_212_14122_lab' 'ref_212_14122_mat' 'ref_212_14123_lab' 'ref_212_14123_mat' 'ref_212_14125_lab' 'ref_212_14125_mat' 'ref_212_14127_lab' 'ref_212_14127_mat' 'ref_212_14128_lab' 'ref_212_14128_mat' 'ref_212_1419_lab' 'ref_212_1419_mat' 'ref_212_142_lab' 'ref_212_142_mat' 'ref_212_149_lab' 'ref_212_149_mat' 'ref_212_15_fac' 'ref_212_15_lab' 'ref_212_15_mat' 'ref_212_21_fac' 'ref_212_21_lab' 'ref_212_21_mat' 'ref_212_22_fac' 'ref_212_22_lab' 'ref_212_22_mat' 'ref_212_23_fac' 'ref_212_23_lab' 'ref_212_23_mat' 'ref_212_24_lab' 'ref_212_24_mat' 'ref_212_25_fac' 'ref_212_25_lab' 'ref_212_25_mat' 'ref_212_3_lab' 'ref_212_3_mat' 'ref_213_13_lab' 'ref_213_13_mat' 'ref_213_141_lab' 'ref_213_141_mat' 'ref_213_142_lab' 'ref_213_142_mat' 'ref_213_143_lab' 'ref_213_143_mat' 'ref_213_144_lab' 'ref_213_144_mat' 'ref_213_145_lab' 'ref_213_145_mat' 'ref_213_146_lab' 'ref_213_146_mat' 'ref_213_147_lab' 'ref_213_147_mat' 'ref_213_149_lab' 'ref_213_149_mat' 'ref_213_21_fac' 'ref_213_21_lab' 'ref_213_21_mat' 'ref_213_22_fac' 'ref_213_22_lab' 'ref_213_22_mat' 'ref_213_24_lab' 'ref_213_24_mat' 'ref_213_25_fac' 'ref_213_25_lab' 'ref_213_25_mat' 'ref_214_fac' 'ref_214_lab' 'ref_214_mat' 'ref_215_13_lab' 'ref_215_13_mat' 'ref_215_141_lab' 'ref_215_141_mat' 'ref_215_142_lab' 'ref_215_142_mat' 'ref_215_145_lab' 'ref_215_145_mat' 'ref_215_146_lab' 'ref_215_146_mat' 'ref_215_147_lab' 'ref_215_147_mat' 'ref_215_149_lab' 'ref_215_149_mat' 'ref_215_21_fac' 'ref_215_21_lab' 'ref_215_21_mat' 'ref_215_221_fac' 'ref_215_221_lab' 'ref_215_221_mat' 'ref_215_222_fac' 'ref_215_222_lab' 'ref_215_222_mat' 'ref_215_223_fac' 'ref_215_223_lab' 'ref_215_223_mat' 'ref_215_224_fac' 'ref_215_224_lab' 'ref_215_224_mat' 'ref_215_225_fac' 'ref_215_225_lab' 'ref_215_225_mat' 'ref_215_226_fac' 'ref_215_226_lab' 'ref_215_226_mat' 'ref_215_227_fac' 'ref_215_228_fac' 'ref_215_228_lab' 'ref_215_228_mat' 'ref_215_23_fac' 'ref_215_23_lab' 'ref_215_23_mat' 'ref_215_24_lab' 'ref_215_24_mat' 'ref_215_25_fac' 'ref_215_25_lab' 'ref_215_25_mat' 'ref_216_13_lab' 'ref_216_13_mat' 'ref_216_141_lab' 'ref_216_141_mat' 'ref_216_142_lab' 'ref_216_142_mat' 'ref_216_143_lab' 'ref_216_143_mat' 'ref_216_144_lab' 'ref_216_144_mat' 'ref_216_145_lab' 'ref_216_145_mat' 'ref_216_146_lab' 'ref_216_146_mat' 'ref_216_147_lab' 'ref_216_147_mat' 'ref_216_148_lab' 'ref_216_148_mat' 'ref_216_149_lab' 'ref_216_149_mat' 'ref_216_21_lab' 'ref_216_21_mat' 'ref_216_22_fac' 'ref_216_22_lab' 'ref_216_22_mat' 'ref_216_24_lab' 'ref_216_24_mat' 'ref_216_25_fac' 'ref_216_25_lab' 'ref_216_25_mat' 'ref_217_13_lab' 'ref_217_13_mat' 'ref_217_141_lab' 'ref_217_141_mat' 'ref_217_142_lab' 'ref_217_142_mat' 'ref_217_145_lab' 'ref_217_145_mat' 'ref_217_147_lab' 'ref_217_147_mat' 'ref_217_149_lab' 'ref_217_149_mat' 'ref_217_21_fac' 'ref_217_21_lab' 'ref_217_21_mat' 'ref_217_22_fac' 'ref_217_22_lab' 'ref_217_22_mat' 'ref_217_23_fac' 'ref_217_23_lab' 'ref_217_23_mat' 'ref_217_24_lab' 'ref_217_24_mat' 'ref_217_3_lab' 'ref_217_3_mat' 'ref_218A_13_lab' 'ref_218A_13_mat' 'ref_218A_141_lab' 'ref_218A_141_mat' 'ref_218A_142_lab' 'ref_218A_142_mat' 'ref_218A_145_lab' 'ref_218A_145_mat' 'ref_218A_146_lab' 'ref_218A_146_mat' 'ref_218A_147_lab' 'ref_218A_147_mat' 'ref_218A_148_lab' 'ref_218A_148_mat' 'ref_218A_149_lab' 'ref_218A_149_mat' 'ref_218A_21_lab' 'ref_218A_21_mat' 'ref_218A_231_fac' 'ref_218A_231_lab' 'ref_218A_231_mat' 'ref_218A_232_fac' 'ref_218A_232_lab' 'ref_218A_232_mat' 'ref_218A_233_fac' 'ref_218A_233_lab' 'ref_218A_233_mat' 'ref_218A_234_fac' 'ref_218A_234_lab' 'ref_218A_234_mat' 'ref_218A_235_fac' 'ref_218A_235_lab' 'ref_218A_235_mat' 'ref_218A_236_fac' 'ref_218A_236_lab' 'ref_218A_236_mat' 'ref_218A_237_fac' 'ref_218A_238_fac' 'ref_218A_238_lab' 'ref_218A_238_mat' 'ref_218A_24_lab' 'ref_218A_24_mat' 'ref_218B_22_fac' 'ref_218B_22_lab' 'ref_218B_22_mat' 'ref_218B_23_fac' 'ref_218B_23_lab' 'ref_218B_23_mat' 'ref_218B_24_lab' 'ref_218B_24_mat' 'ref_218B_25_fac' 'ref_218B_25_lab' 'ref_218B_25_mat' 'ref_218D_fac' 'ref_218D_lab' 'ref_218D_mat' 'ref_218E_fac' 'ref_218E_lab' 'ref_218E_mat' 'ref_218F_lab' 'ref_218F_mat' 'ref_218G_fac' 'ref_218G_lab' 'ref_218G_mat' 'ref_218H_fac' 'ref_218H_lab' 'ref_218H_mat' 'ref_218J_fac' 'ref_218J_lab' 'ref_218J_mat' 'ref_218K_lab' 'ref_218K_mat' 'ref_218L_fac' 'ref_218L_lab' 'ref_218L_mat' 'ref_218P_lab' 'ref_218P_mat' 'ref_218S_fac' 'ref_218S_lab' 'ref_218S_mat' 'ref_218T_fac' 'ref_218T_lab' 'ref_218T_mat' 'ref_218V_lab' 'ref_218V_mat' 'ref_221_1_fac' 'ref_221_1_lab' 'ref_221_1_mat' 'ref_221_2_fac' 'ref_221_2_lab' 'ref_221_2_mat' 'ref_221_3_fac' 'ref_221_3_lab' 'ref_221_3_mat' 'ref_222_111_fac' 'ref_222_111_lab' 'ref_222_111_mat' 'ref_222_119_fac' 'ref_222_119_lab' 'ref_222_119_mat' 'ref_222_12_fac' 'ref_222_12_lab' 'ref_222_12_mat' 'ref_222_132_fac' 'ref_222_132_lab' 'ref_222_132_mat' 'ref_222_139_fac' 'ref_222_139_lab' 'ref_222_139_mat' 'ref_222_14_fac' 'ref_222_14_lab' 'ref_222_14_mat' 'ref_223_1_fac' 'ref_223_1_lab' 'ref_223_1_mat' 'ref_223_3_fac' 'ref_223_3_lab' 'ref_223_3_mat' 'ref_223_4_fac' 'ref_223_4_lab' 'ref_223_4_mat' 'ref_223_5_fac' 'ref_223_5_lab' 'ref_223_5_mat' 'ref_224_1_fac' 'ref_224_1_lab' 'ref_224_1_mat' 'ref_224_2_fac' 'ref_224_2_lab' 'ref_224_2_mat' 'ref_224_3_fac' 'ref_224_3_lab' 'ref_224_3_mat' 'ref_225_111_fac' 'ref_225_111_lab' 'ref_225_111_mat' 'ref_225_112_fac' 'ref_225_112_lab' 'ref_225_112_mat' 'ref_225_113_fac' 'ref_225_113_lab' 'ref_225_113_mat' 'ref_225_114_fac' 'ref_225_114_lab' 'ref_225_114_mat' 'ref_225_12_fac' 'ref_225_12_lab' 'ref_225_12_mat' 'ref_225_13_fac' 'ref_225_13_lab' 'ref_225_13_mat' 'ref_225_3_fac' 'ref_225_3_lab' 'ref_225_3_mat' 'ref_225_4_fac' 'ref_225_4_lab' 'ref_225_4_mat' 'ref_226_1_fac' 'ref_226_1_lab' 'ref_226_1_mat' 'ref_226_3_fac' 'ref_226_3_lab' 'ref_226_3_mat' 'ref_226_4_fac' 'ref_226_4_lab' 'ref_226_4_mat' 'ref_226_6_fac' 'ref_226_6_lab' 'ref_226_6_mat' 'ref_226_71_fac' 'ref_226_71_lab' 'ref_226_71_mat' 'ref_226_72_fac' 'ref_226_72_lab' 'ref_226_72_mat' 'ref_226_8_fac' 'ref_226_8_lab' 'ref_226_8_mat' 'ref_226_9_fac' 'ref_226_9_lab' 'ref_226_9_mat' 'ref_227_11_fac' 'ref_227_11_lab' 'ref_227_11_mat' 'ref_227_15_fac' 'ref_227_15_lab' 'ref_227_15_mat' 'ref_227_16_fac' 'ref_227_16_lab' 'ref_227_16_mat' 'ref_227_17_fac' 'ref_227_17_lab' 'ref_227_17_mat' 'ref_227_18_fac' 'ref_227_18_lab' 'ref_227_18_mat' 'ref_227_19_fac' 'ref_227_19_lab' 'ref_227_19_mat' 'ref_227_2_fac' 'ref_227_2_lab' 'ref_227_2_mat' 'ref_227_3_fac' 'ref_227_3_lab' 'ref_227_3_mat' 'ref_227_4_fac' 'ref_227_4_lab' 'ref_227_4_mat' 'ref_227_5_fac' 'ref_227_5_lab' 'ref_227_5_mat' 'ref_227_9_fac' 'ref_227_9_lab' 'ref_227_9_mat' 'ref_228_lab' 'ref_228_mat' 'ref_23_fac' 'ref_23_lab' 'ref_23_mat' 'ref_241_fac' 'ref_241_lab' 'ref_241_mat' 'ref_242_fac' 'ref_242_lab' 'ref_242_mat' 'ref_243_fac' 'ref_243_lab' 'ref_243_mat' 'ref_244_lab' 'ref_244_mat' 'ref_245_lab' 'ref_245_mat' 'ref_246_fac' 'ref_246_lab' 'ref_246_mat' 'ref_251_11_fac' 'ref_251_11_lab' 'ref_251_11_mat' 'ref_251_12_fac' 'ref_251_12_lab' 'ref_251_12_mat' 'ref_251_16_fac' 'ref_251_16_lab' 'ref_251_16_mat' 'ref_251_17_fac' 'ref_251_17_lab' 'ref_251_17_mat' 'ref_252_1_fac' 'ref_252_1_lab' 'ref_252_1_mat' 'ref_252_2_fac' 'ref_252_2_lab' 'ref_252_2_mat' 'ref_252_3_fac' 'ref_252_3_lab' 'ref_252_3_mat' 'ref_252_4_lab' 'ref_252_4_mat' 'ref_253_fac' 'ref_253_lab' 'ref_253_mat' 'ref_254_fac' 'ref_254_lab' 'ref_254_mat' 'ref_255_fac' 'ref_255_lab' 'ref_255_mat' 'ref_261_fac' 'ref_261_lab' 'ref_261_mat' 'ref_262_11_fac' 'ref_262_11_lab' 'ref_262_11_mat' 'ref_262_12_fac' 'ref_262_12_lab' 'ref_262_12_mat' 'ref_262_13_fac' 'ref_262_13_lab' 'ref_262_13_mat' 'ref_262_14_lab' 'ref_262_14_mat' 'ref_262_15_fac' 'ref_262_15_lab' 'ref_262_15_mat' 'ref_S' 'ref_bldg_V' 'ref_cmn_bldg_vol' 'ref_cr_dg_bldg_bldg_vol' 'ref_cr_dg_bldg_sub_S' 'ref_cr_dg_bldg_sub_vol' 'ref_cr_dg_bldg_sup_S' 'ref_cr_dg_bldg_sup_vol' 'ref_direct_cost_frm_flow' 'ref_direct_cost_frm_fuel_cask_cap' 'ref_direct_cost_frm_fuel_crane_cap' 'ref_direct_cost_frm_ht_S' 'ref_direct_cost_frm_prz_M' 'ref_direct_cost_frm_S' 'ref_direct_cost_frm_S_9_71886e_06' 'ref_direct_cost_frm_vsl_M' 'ref_elec_P' 'ref_fuel_stor_bldg_bldg_vol' 'ref_fuel_stor_bldg_sub_S' 'ref_fuel_stor_bldg_sub_vol' 'ref_fuel_stor_bldg_sup_S' 'ref_fuel_stor_bldg_sup_vol' 'ref_mc_piping_M' 'ref_n_crs' 'ref_pri_aux_bldg_bldg_vol' 'ref_pri_aux_bldg_sub_S' 'ref_pri_aux_bldg_sub_vol' 'ref_pri_aux_bldg_sup_S' 'ref_pri_aux_bldg_sup_vol' 'ref_pri_flow' 'ref_rx_D' 'ref_rej_th_P' 'ref_rx_P' 'ref_sfp_V' 'ref_sub_str_S' 'ref_sub_str_V' 'ref_sup_str_S' 'ref_sup_str_V' 'ref_turb_gen_bldg_sub_vol' 'ref_turb_gen_bldg_sup_S' 'ref_turb_gen_bldg_sup_vol' 'ref_V_of_212_213_215_216_217' 'ref_waste_bldg_bldg_vol' 'ref_waste_bldg_sub_S' 'ref_waste_bldg_sub_vol' 'ref_waste_bldg_sup_S' 'ref_waste_bldg_sup_vol' 'scale_adm_bldg_bldg_vol' 'scale_S' 'scale_bldg_V' 'scale_cont_hatch_ms_bldg_vol' 'scale_cont_V' 'scale_cr_dg_bldg_bldg_vol' 'scale_cr_dg_bldg_sub_S' 'scale_cr_dg_bldg_sub_vol' 'scale_cr_dg_bldg_sup_S' 'scale_cr_dg_bldg_sup_vol' 'scale_elec_P' 'scale_elec_tunnel_bldg_vol' 'scale_frm_flow' 'scale_frm_fuel_cask_cap' 'scale_frm_fuel_crane_cap' 'scale_frm_ht_S' 'scale_frm_prz_M' 'scale_frm_S' 'scale_frm_S_9_71886e_06' 'scale_frm_vsl_M' 'scale_fuel_stor_bldg_bldg_vol' 'scale_fuel_stor_bldg_sub_S' 'scale_fuel_stor_bldg_sub_vol' 'scale_fuel_stor_bldg_sup_S' 'scale_fuel_stor_bldg_sup_vol' 'scale_mc_piping_M' 'scale_non_ess_swgr_bldg_bldg_vol' 'scale_n_crs' 'scale_P' 'scale_pri_aux_bldg_bldg_vol' 'scale_pri_aux_bldg_sub_S' 'scale_pri_aux_bldg_sub_vol' 'scale_pri_aux_bldg_sup_S' 'scale_pri_aux_bldg_sup_vol' 'scale_pri_flow' 'scale_rx_D' 'scale_rej_th_P' 'scale_sfp_V' 'scale_sub_str_S' 'scale_sub_str_V' 'scale_sup_const' 'scale_sup_str_S' 'scale_sup_str_V' 'scale_turb_gen_bldg_sub_vol' 'scale_turb_gen_bldg_sup_S' 'scale_turb_gen_bldg_sup_vol' 'scale_tur_plant_equip_elec_P' 'scale_V_of_212_213_215_216_217' 'scale_waste_bldg_bldg_vol' 'scale_waste_bldg_sub_S' 'scale_waste_bldg_sub_vol' 'scale_waste_bldg_sup_S' 'scale_waste_bldg_sup_vol' 'scale_wwt_bldg_bldg_vol' 'ce_211_711_fac' 'ce_211_711_mat' 'ce_211_711_lab' 'ce_211_712_fac' 'ce_211_712_mat' 'ce_211_712_lab' 'ce_212_141_fac' 'ce_212_141_mat' 'ce_212_141_lab' 'ce_212_1411_fac' 'ce_212_1411_mat' 'ce_212_1411_lab' 'ce_212_14111_fac' 'ce_212_14111_mat' 'ce_212_14111_lab' 'ce_212_14112_fac' 'ce_212_14112_mat' 'ce_212_14112_lab' 'ce_212_14113_fac' 'ce_212_14113_mat' 'ce_212_14113_lab' 'ce_212_14114_fac' 'ce_212_14114_mat' 'ce_212_14114_lab' 'ce_212_14115_fac' 'ce_212_14115_mat' 'ce_212_14115_lab' 'ce_212_14116_fac' 'ce_212_14116_mat' 'ce_212_14116_lab' 'ce_212_14117_fac' 'ce_212_14117_mat' 'ce_212_14117_lab' 'ce_212_14118_fac' 'ce_212_14118_mat' 'ce_212_14118_lab' 'ce_212_1412_fac' 'ce_212_1412_mat' 'ce_212_1412_lab' 'ce_212_14121_fac' 'ce_212_14121_mat' 'ce_212_14121_lab' 'ce_212_14122_fac' 'ce_212_14122_mat' 'ce_212_14122_lab' 'ce_212_14123_fac' 'ce_212_14123_mat' 'ce_212_14123_lab' 'ce_212_14125_fac' 'ce_212_14125_mat' 'ce_212_14125_lab' 'ce_212_14127_fac' 'ce_212_14127_mat' 'ce_212_14127_lab' 'ce_212_14128_fac' 'ce_212_14128_mat' 'ce_212_14128_lab' 'ce_212_140_fac' 'ce_212_140_mat' 'ce_212_140_lab' 'ce_212_1419_fac' 'ce_212_1419_mat' 'ce_212_1419_lab' 'ce_212_142_fac' 'ce_212_142_mat' 'ce_212_142_lab' 'ce_212_149_fac' 'ce_212_149_mat' 'ce_212_149_lab' 'ce_213_141_fac' 'ce_213_141_mat' 'ce_213_141_lab' 'ce_213_142_fac' 'ce_213_142_mat' 'ce_213_142_lab' 'ce_213_143_fac' 'ce_213_143_mat' 'ce_213_143_lab' 'ce_213_144_fac' 'ce_213_144_mat' 'ce_213_144_lab' 'ce_213_145_fac' 'ce_213_145_mat' 'ce_213_145_lab' 'ce_213_146_fac' 'ce_213_146_mat' 'ce_213_146_lab' 'ce_213_147_fac' 'ce_213_147_mat' 'ce_213_147_lab' 'ce_213_149_fac' 'ce_213_149_mat' 'ce_213_149_lab' 'ce_215_141_fac' 'ce_215_141_mat' 'ce_215_141_lab' 'ce_215_142_fac' 'ce_215_142_mat' 'ce_215_142_lab' 'ce_215_145_fac' 'ce_215_145_mat' 'ce_215_145_lab' 'ce_215_146_fac' 'ce_215_146_mat' 'ce_215_146_lab' 'ce_215_147_fac' 'ce_215_147_mat' 'ce_215_147_lab' 'ce_215_149_fac' 'ce_215_149_mat' 'ce_215_149_lab' 'ce_215_221_fac' 'ce_215_221_mat' 'ce_215_221_lab' 'ce_215_222_fac' 'ce_215_222_mat' 'ce_215_222_lab' 'ce_215_223_fac' 'ce_215_223_mat' 'ce_215_223_lab' 'ce_215_224_fac' 'ce_215_224_mat' 'ce_215_224_lab' 'ce_215_225_fac' 'ce_215_225_mat' 'ce_215_225_lab' 'ce_215_226_fac' 'ce_215_226_mat' 'ce_215_226_lab' 'ce_215_227_fac' 'ce_215_227_mat' 'ce_215_227_lab' 'ce_215_228_fac' 'ce_215_228_mat' 'ce_215_228_lab' 'ce_216_141_fac' 'ce_216_141_mat' 'ce_216_141_lab' 'ce_216_142_fac' 'ce_216_142_mat' 'ce_216_142_lab' 'ce_216_143_fac' 'ce_216_143_mat' 'ce_216_143_lab' 'ce_216_144_fac' 'ce_216_144_mat' 'ce_216_144_lab' 'ce_216_145_fac' 'ce_216_145_mat' 'ce_216_145_lab' 'ce_216_146_fac' 'ce_216_146_mat' 'ce_216_146_lab' 'ce_216_147_fac' 'ce_216_147_mat' 'ce_216_147_lab' 'ce_216_148_fac' 'ce_216_148_mat' 'ce_216_148_lab' 'ce_216_149_fac' 'ce_216_149_mat' 'ce_216_149_lab' 'ce_217_141_fac' 'ce_217_141_mat' 'ce_217_141_lab' 'ce_217_142_fac' 'ce_217_142_mat' 'ce_217_142_lab' 'ce_217_145_fac' 'ce_217_145_mat' 'ce_217_145_lab' 'ce_217_147_fac' 'ce_217_147_mat' 'ce_217_147_lab' 'ce_217_149_fac' 'ce_217_149_mat' 'ce_217_149_lab' 'ce_218A_13_fac' 'ce_218A_13_mat' 'ce_218A_13_lab' 'ce_218A_14_fac' 'ce_218A_14_mat' 'ce_218A_14_lab' 'ce_218A_141_fac' 'ce_218A_141_mat' 'ce_218A_141_lab' 'ce_218A_142_fac' 'ce_218A_142_mat' 'ce_218A_142_lab' 'ce_218A_145_fac' 'ce_218A_145_mat' 'ce_218A_145_lab' 'ce_218A_146_fac' 'ce_218A_146_mat' 'ce_218A_146_lab' 'ce_218A_147_fac' 'ce_218A_147_mat' 'ce_218A_147_lab' 'ce_218A_148_fac' 'ce_218A_148_mat' 'ce_218A_148_lab' 'ce_218A_149_fac' 'ce_218A_149_mat' 'ce_218A_149_lab' 'ce_218A_21_fac' 'ce_218A_21_mat' 'ce_218A_21_lab' 'ce_218A_23_fac' 'ce_218A_23_mat' 'ce_218A_23_lab' 'ce_218A_231_fac' 'ce_218A_231_mat' 'ce_218A_231_lab' 'ce_218A_232_fac' 'ce_218A_232_mat' 'ce_218A_232_lab' 'ce_218A_233_fac' 'ce_218A_233_mat' 'ce_218A_233_lab' 'ce_218A_234_fac' 'ce_218A_234_mat' 'ce_218A_234_lab' 'ce_218A_235_fac' 'ce_218A_235_mat' 'ce_218A_235_lab' 'ce_218A_236_fac' 'ce_218A_236_mat' 'ce_218A_236_lab' 'ce_218A_237_fac' 'ce_218A_237_mat' 'ce_218A_237_lab' 'ce_218A_238_fac' 'ce_218A_238_mat' 'ce_218A_238_lab' 'ce_218A_24_fac' 'ce_218A_24_mat' 'ce_218A_24_lab' 'ce_218B_21_fac' 'ce_218B_21_mat' 'ce_218B_21_lab' 'ce_218B_22_fac' 'ce_218B_22_mat' 'ce_218B_22_lab' 'ce_218B_23_fac' 'ce_218B_23_mat' 'ce_218B_23_lab' 'ce_218B_24_fac' 'ce_218B_24_mat' 'ce_218B_24_lab' 'ce_218B_25_fac' 'ce_218B_25_mat' 'ce_218B_25_lab' 'ce_222_111_fac' 'ce_222_111_mat' 'ce_222_111_lab' 'ce_222_119_fac' 'ce_222_119_mat' 'ce_222_119_lab' 'ce_222_132_fac' 'ce_222_132_mat' 'ce_222_132_lab' 'ce_222_139_fac' 'ce_222_139_mat' 'ce_222_139_lab' 'ce_225_111_fac' 'ce_225_111_mat' 'ce_225_111_lab' 'ce_225_112_fac' 'ce_225_112_mat' 'ce_225_112_lab' 'ce_225_113_fac' 'ce_225_113_mat' 'ce_225_113_lab' 'ce_225_114_fac' 'ce_225_114_mat' 'ce_225_114_lab'] user_defined_names = [N/A] total_cost_unit = ['million' 'dollar'] diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index e786e35..b1767f9 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -208,6 +208,116 @@ "run_name": "1", } +MIRROR_INPUT_DESCRIPTIONS = { + "application": "Mirror plant application mode used for gross-electric-power logic", + "P_f": "Total fusion power", + "P_f_L": "Fusion power per meter of central cell length", + "P_f_EP": "Fusion power assigned to each end plug", + "P_NBI": "Neutral beam injection power", + "P_ECH": "Electron cyclotron heating power", + "P_ICRH": "Ion cyclotron resonance heating power", + "M_n": "Neutron energy multiplication factor", + "N_module": "Number of Mirror plant modules", + "f_pump": "Fraction of neutron power used for pumping", + "f_sub": "Fraction of fusion power used for subsystem controls", + "f_cryo": "Fraction of fusion power used for cryogenic load", + "P_pump": "Reference pumping power", + "P_sub_cont": "Reference subsystem control power", + "P_cryo": "Reference cryogenic power", + "P_pfcool": "Plasma-facing-component cooling power", + "P_thcool": "Thermal-system cooling power", + "P_coils": "Coil power load", + "P_aux": "Auxiliary plant power", + "eta_th": "Thermal conversion efficiency", + "eta_DEC": "Direct energy conversion efficiency", + "eta_pump": "Pump heat recovery efficiency", + "eta_NBI": "Neutral beam injection wall-plug efficiency", + "eta_ECH": "Electron cyclotron heating wall-plug efficiency", + "eta_ICRH": "Ion cyclotron resonance heating wall-plug efficiency", + "NOAK": "Nth-of-a-kind plant flag", + "n_unit": "Plant unit number for learning-curve cost scaling", + "construction_time": "Construction duration", + "lifetime": "Plant operating lifetime", + "replacement": "Major component replacement interval", + "availability": "Plant availability factor", + "discount": "Real discount rate", + "LSA": "Licensing safety analysis level", + "cost_file": "PyFECONS cost data file name", + "method": "PyFECONS costing method selector", + "include_decommissioning": "Flag to include decommissioning cost", + "include_tax": "Flag to include tax cost", + "include_licensing": "Flag to include licensing cost", + "include_contingency": "Flag to include contingency cost", + "hf_magnet_length": "High-field magnet axial length", + "hf_magnet_shielding_thickness": "High-field magnet shielding thickness", + "a_EC": "Expander cell plasma radius", + "expander_cell_vessel_thickness": "Expander cell vessel wall thickness", + "expander_cell_vessel_material": "Expander cell vessel material", + "vacuum_gap_CC": "Central cell radial vacuum gap", + "first_wall_material": "Central cell first wall material", + "first_wall_thickness": "Central cell first wall thickness", + "vacuum_vessel_material": "Central cell vacuum vessel material", + "vacuum_vessel_thickness": "Central cell vacuum vessel thickness", + "multiplier_material": "Central cell neutron multiplier material", + "multiplier_thickness": "Central cell neutron multiplier thickness", + "blanket_coolant_material": "Central cell blanket coolant material", + "blanket_thickness": "Central cell blanket radial thickness", + "blanket_coolant_fraction": "Central cell blanket coolant volume fraction", + "blanket_structural_material": "Central cell blanket structural material", + "blanket_structural_fraction": "Central cell blanket structural volume fraction", + "outer_vessel_thickness": "Central cell outer vessel thickness", + "L_EP": "End plug axial length", + "L_EC": "Expander cell axial length", + "a_CC": "Central cell plasma radius", + "a_EP": "End plug plasma radius", + "HF_magnet_number": "Number of high-field magnets", + "LF_magnet_number": "Number of low-field magnets", +} + +MIRROR_GENERATED_VAR_DESCRIPTIONS = { + "P_f_CC": "Fusion power assigned to the central cell", + "L_CC": "Calculated central cell length", + "L_CF": "Central-field coil spacing", + "L": "Overall axial length of the Mirror plant", + "V_vac": "Vacuum volume for the Mirror plant", + "no_vpumps": "Number of vacuum pumps required for the default pump-down assumption", + "cost_factor": "Learning-curve cost multiplier based on plant unit number", + "HF_magnet_cost": "Cost per high-field magnet", + "LF_magnet_cost": "Cost per low-field magnet", + "CF_magnet_cost": "Cost per central-field magnet", + "P_alpha": "Fusion alpha-particle power", + "P_n": "Fusion neutron power", + "P_ine": "Injected-power electrical input requirement", + "P_pump": "Pumping power requirement", + "P_sub_cont": "Subsystem control power requirement", + "P_cryo": "Cryogenic power requirement", + "P_other": "Total miscellaneous plant power requirement", + "P_in": "Total injected heating power", + "P_th": "Recoverable thermal power", + "P_the": "Thermal-electric power contribution", + "P_DEC": "Power available to direct energy conversion", + "P_DECe": "Electrical output from direct energy conversion", + "P_egross": "Gross electric power", + "P_enet": "Net electric power", + "f_aux": "Auxiliary power fraction relative to gross electric power", + "Q_sci": "Scientific fusion gain", + "Q_eng": "Engineering gain", + "f_refrac": "Recirculating power fraction", + "CF_magnet_number": "Calculated number of central-field magnets", + "rho_PbLi": "PbLi density corrected for coolant temperature and lithium enrichment", + "P_Li": "Lithium price from enrichment level", + "P_PbLi": "PbLi coolant price from lead and lithium prices", + "central_cell_cylindrical_part_cost": "Central cell cylindrical radial-build material cost", + "end_plug_cylindrical_part_cost": "End plug cylindrical radial-build material cost", + "expander_cell_cost_result": "Expander cell vacuum vessel cost", + "HF_magnet_shield_cost": "High-field magnet shield cost per end plug", +} + +MIRROR_CONSTANT_DESCRIPTIONS = { + "E_DT": "Energy released per deuterium-tritium fusion reaction", + "E_alpha": "Alpha-particle energy released per deuterium-tritium fusion reaction", +} + MIRROR_GENERATED_VAR_NEEDS = { "P_f_CC": "P_f, P_f_EP", "L_CC": "P_f_CC, P_f_L", @@ -240,7 +350,7 @@ "CF_magnet_number": "L_CC, L_CF", "rho_PbLi": "T, f_6Li", "P_Li": "f_6Li", - "P_PbLi": "Pb_c_raw, P_Li", + "P_PbLi": "Pb_c_raw, P_Li, f_Li", "central_cell_cylindrical_part_cost": ( "L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, " "multiplier_thickness, blanket_thickness, blanket_coolant_fraction, " @@ -306,7 +416,7 @@ "CF_magnet_number": ("CF_magnet_number = L_CC / L_CF", "1"), "rho_PbLi": ("rho_PbLi = PbLi density corrected for lithium enrichment and temperature", "kg/m3"), "P_Li": ("P_Li = lithium price as a function of 6Li enrichment", "dollar/kg"), - "P_PbLi": ("P_PbLi = 0.83 * Pb_c_raw + 0.17 * P_Li", "dollar/kg"), + "P_PbLi": ("P_PbLi = (1 - f_Li) * Pb_c_raw + f_Li * P_Li", "dollar/kg"), "central_cell_cylindrical_part_cost": ( "central_cell_cylindrical_part_cost = legacy central-cell radial build material cost for L_CC", "million", @@ -384,6 +494,7 @@ "rho_PbLi": ("PbLi density from legacy Mirror temperature/enrichment correlation", None, "kg/m3"), "P_Li": ("Lithium price from legacy Mirror enrichment pricing", None, "dollar/kg"), "P_PbLi": ("PbLi price from legacy Mirror eutectic mixture pricing", None, "dollar/kg"), + "f_Li": ("Lithium mass fraction in PbLi eutectic mixture", 0.17, "1"), "T": ("Mean coolant temperature for legacy PbLi density correlation", 300, "degC"), "f_6Li": ("Lithium-6 enrichment fraction for legacy PbLi pricing", 0.075, "1"), "central_cell_cylindrical_part_cost": ( @@ -685,7 +796,7 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) rho_6li * values["f_6Li"] + rho_7li * (1 - values["f_6Li"]) ) / (rho_6li * f_6li_natural + rho_7li * (1 - f_6li_natural)) generated["P_Li"] = 15.152 - generated["P_PbLi"] = 0.83 * values["Pb_c_raw"] + 0.17 * generated["P_Li"] + generated["P_PbLi"] = (1 - values["f_Li"]) * values["Pb_c_raw"] + values["f_Li"] * generated["P_Li"] def central_cell_cylindrical_cost(length: float) -> float: radius = values["a_CC"] + values["vacuum_gap_CC"] @@ -864,6 +975,20 @@ def _split_vars(value: str | None) -> list[str]: return [part.strip() for part in str(value).split(",") if part.strip() and part.strip() != "TODO"] +def _mirror_var_description(var_name: str, fallback: str = "") -> str: + if var_name in MIRROR_VARIABLE_OVERRIDES: + return MIRROR_VARIABLE_OVERRIDES[var_name][0] + if var_name in MIRROR_GENERATED_VAR_DESCRIPTIONS: + return MIRROR_GENERATED_VAR_DESCRIPTIONS[var_name] + if var_name in MIRROR_INPUT_DESCRIPTIONS: + return MIRROR_INPUT_DESCRIPTIONS[var_name] + if var_name in MIRROR_CONSTANT_DESCRIPTIONS: + return MIRROR_CONSTANT_DESCRIPTIONS[var_name] + if fallback and fallback not in {"str", "int", "float", "list"}: + return fallback + return var_name.replace("_", " ") + + def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: input_defaults = _mirror_input_defaults(algorithm_source) generated_values = _mirror_generated_var_values(input_defaults) @@ -874,6 +999,14 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: conn.execute("UPDATE mirror_var SET var_unit = 'm' WHERE var_name = 'r_magnet'") for var_name, (value, unit) in input_defaults.items(): if conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): + conn.execute( + """ + UPDATE mirror_var + SET var_description = ?, var_value = ?, var_unit = ?, user_input = 0 + WHERE var_name = ? + """, + (_mirror_var_description(var_name), value, unit, var_name), + ) continue next_ind = conn.execute("SELECT COALESCE(MAX(ind), 0) + 1 FROM mirror_var").fetchone()[0] conn.execute( @@ -882,7 +1015,7 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) VALUES (?, ?, ?, ?, ?, '', '', '', 0) """, - (next_ind, var_name, "Mirror input parameter", value, unit), + (next_ind, var_name, _mirror_var_description(var_name), value, unit), ) for var_name, (value, unit) in MIRROR_REFERENCE_VAR_OVERRIDES.items(): if not conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): @@ -893,16 +1026,16 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) VALUES (?, ?, ?, ?, ?, '', '', '', 0) """, - (next_ind, var_name, "Mirror reference parameter", value, unit), + (next_ind, var_name, _mirror_var_description(var_name), value, unit), ) continue conn.execute( """ UPDATE mirror_var - SET var_value = ?, var_unit = ?, user_input = 0 + SET var_description = ?, var_value = ?, var_unit = ?, user_input = 0 WHERE var_name = ? """, - (value, unit, var_name), + (_mirror_var_description(var_name), value, unit, var_name), ) for var_name, var_need in MIRROR_GENERATED_VAR_NEEDS.items(): if not conn.execute("SELECT 1 FROM mirror_var WHERE var_name = ?", (var_name,)).fetchone(): @@ -913,17 +1046,17 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) VALUES (?, ?, ?, '', '1', '', ?, '', 0) """, - (next_ind, var_name, "Mirror generated parameter", var_need), + (next_ind, var_name, _mirror_var_description(var_name), var_need), ) conn.execute("UPDATE mirror_var SET var_need = ? WHERE var_name = ?", (var_need, var_name)) _formulation, unit = MIRROR_GENERATED_VAR_FORMULAS.get(var_name, ("", "1")) conn.execute( """ UPDATE mirror_var - SET var_value = ?, var_alg = ?, var_unit = ?, user_input = 0 + SET var_description = ?, var_value = ?, var_alg = ?, var_unit = ?, user_input = 0 WHERE var_name = ? """, - (generated_values.get(var_name), f"cal_{var_name}", unit, var_name), + (_mirror_var_description(var_name), generated_values.get(var_name), f"cal_{var_name}", unit, var_name), ) for var_name, (value, unit) in MIRROR_CONSTANT_DEFAULTS.items(): @@ -935,12 +1068,16 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: (ind, var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked, user_input) VALUES (?, ?, ?, ?, ?, '', '', '', 0) """, - (next_ind, var_name, "Mirror physical constant", value, unit), + (next_ind, var_name, _mirror_var_description(var_name), value, unit), ) else: conn.execute( - "UPDATE mirror_var SET var_value = ?, var_unit = ?, user_input = 0 WHERE var_name = ?", - (value, unit, var_name), + """ + UPDATE mirror_var + SET var_description = ?, var_value = ?, var_unit = ?, user_input = 0 + WHERE var_name = ? + """, + (_mirror_var_description(var_name), value, unit, var_name), ) for var_name, (description, value, unit) in MIRROR_VARIABLE_OVERRIDES.items(): @@ -1005,6 +1142,30 @@ def _normalize_mirror_variable_table(conn: sqlite3.Connection, algorithm_source: AND COALESCE(v_linked, '') = '' """ ) + classified_variables = ( + set(input_defaults) + | set(MIRROR_REFERENCE_VAR_OVERRIDES) + | set(MIRROR_GENERATED_VAR_NEEDS) + | set(MIRROR_CONSTANT_DEFAULTS) + | set(MIRROR_VARIABLE_OVERRIDES) + ) + for (var_name,) in conn.execute( + """ + SELECT var_name + FROM mirror_var + WHERE COALESCE(var_alg, '') = '' + AND COALESCE(var_need, '') = '' + AND COALESCE(v_linked, '') = '' + """ + ).fetchall(): + if var_name not in classified_variables: + conn.execute("DELETE FROM mirror_var WHERE var_name = ?", (var_name,)) + for var_name, description in conn.execute("SELECT var_name, var_description FROM mirror_var").fetchall(): + if description in {"str", "int", "float", "list", "Mirror input parameter", "Mirror generated parameter"}: + conn.execute( + "UPDATE mirror_var SET var_description = ? WHERE var_name = ?", + (_mirror_var_description(var_name, description), var_name), + ) conn.executemany( "DELETE FROM mirror_var WHERE var_name = ?", [(var_name,) for var_name in sorted(MIRROR_UNUSED_C2211_FRAME_VARIABLES)], diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index 03826bf..bf8dee9 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -82,6 +82,30 @@ def test_mirror_variables_do_not_keep_blank_legacy_temporaries(cursor): assert cursor.fetchall() == [] +def test_mirror_variable_descriptions_are_human_readable(cursor): + generic_descriptions = { + "", + "str", + "int", + "float", + "list", + "Mirror input parameter", + "Mirror generated parameter", + "Mirror reference parameter", + } + placeholders = ", ".join("?" for _ in generic_descriptions) + cursor.execute( + f""" + SELECT var_name, var_description + FROM mirror_var + WHERE COALESCE(var_description, '') IN ({placeholders}) + ORDER BY var_name; + """, + tuple(sorted(generic_descriptions)), + ) + assert cursor.fetchall() == [] + + def test_mirror_func_does_not_keep_legacy_dataframe_helpers(): removed_helpers = { "PbLi_density", @@ -616,7 +640,7 @@ def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor) assert rows["P_Li"][0] == pytest.approx(15.152) assert rows["P_Li"][1:] == ("dollar/kg", "cal_P_Li", "f_6Li") assert rows["P_PbLi"][0] == pytest.approx(4.56784) - assert rows["P_PbLi"][1:] == ("dollar/kg", "cal_P_PbLi", "Pb_c_raw, P_Li") + assert rows["P_PbLi"][1:] == ("dollar/kg", "cal_P_PbLi", "Pb_c_raw, P_Li, f_Li") assert rows["rho_PbLi"][0] == pytest.approx(9838.0091935) assert rows["rho_PbLi"][1:] == ("kg/m3", "cal_rho_PbLi", "T, f_6Li") diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index e2a19f0..e30d482 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -202,8 +202,7 @@ def cal_P_Li(f_6Li): raise ValueError("Lithium pricing at this enrichment level is not supported") @staticmethod - def cal_P_PbLi(Pb_c_raw, P_Li): - f_Li = 0.17 + def cal_P_PbLi(Pb_c_raw, P_Li, f_Li): return (1 - f_Li) * Pb_c_raw + f_Li * P_Li @staticmethod diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index b63431e..b100f82 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -74,7 +74,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 109,cal_CF_magnet_number,v,Mirror generated variable calculation for CF_magnet_number,MirrorFunc,CF_magnet_number = L_CC / L_CF,1 110,cal_rho_PbLi,v,Mirror generated variable calculation for rho_PbLi,MirrorFunc,rho_PbLi = PbLi density corrected for lithium enrichment and temperature,kg/m3 111,cal_P_Li,v,Mirror generated variable calculation for P_Li,MirrorFunc,P_Li = lithium price as a function of 6Li enrichment,dollar/kg -112,cal_P_PbLi,v,Mirror generated variable calculation for P_PbLi,MirrorFunc,P_PbLi = 0.83 * Pb_c_raw + 0.17 * P_Li,dollar/kg +112,cal_P_PbLi,v,Mirror generated variable calculation for P_PbLi,MirrorFunc,P_PbLi = (1 - f_Li) * Pb_c_raw + f_Li * P_Li,dollar/kg 113,cal_central_cell_cylindrical_part_cost,v,Mirror generated variable calculation for central_cell_cylindrical_part_cost,MirrorFunc,central_cell_cylindrical_part_cost = legacy central-cell radial build material cost for L_CC,million 114,cal_end_plug_cylindrical_part_cost,v,Mirror generated variable calculation for end_plug_cylindrical_part_cost,MirrorFunc,end_plug_cylindrical_part_cost = legacy central-cell radial build material cost for L_EP,million 115,cal_expander_cell_cost_result,v,Mirror generated variable calculation for expander_cell_cost_result,MirrorFunc,expander_cell_cost_result = (pi * L_EC * ((a_EC + expander_cell_vessel_thickness)**2 - a_EC**2) + 2 * pi * expander_cell_vessel_thickness * a_EC**2) * SS316_rho * SS316_c_raw * SS316_m / 1e6,million diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index 4b1b9cb..044a1e4 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -1,196 +1,181 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_input -1,E_DT,str,2.8182346199999998e-12,J,,,P_alpha,0 -2,E_alpha,str,5.6396736e-13,J,,,P_alpha,0 -3,Wh_to_BTU,float,3.41214,1,,,, -4,indentation,int,0.0,1,,,, -5,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 -6,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,0.5031620991790029,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 -7,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,-0.5031620991790029,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 -8,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 -9,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 -10,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 -11,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 -12,axis_t,PyFECONS radial build axis thickness,0.0,m,,,,0 -13,C_22_1_11_8_in,int,0.0,1,,,, -14,C_22_1_11_10_in,int,0.0,1,,,, -15,inflation,float,1.43,1,,,, -16,lcredit,float,0.8,1,,,, -17,f_cr,float,0.09,1,,,, -18,f_6Li_natural,float,0.075,1,,,, -19,rho_6Li,float,460.0,1,,,, -20,rho_7Li,float,537.0,1,,,, -21,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9838.0091935,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -22,P_6Li075,float,15.152,1,,,, -23,P_6Li90,int,70.0,1,,,, -24,f,list,"(0.9, 0.99, 0.999, 0.9999, 0.99999)",1,,,, -25,Cf,list,"(1, 2, 4, 8, 16)",1,,,, -26,f_Li,float,0.17,1,,,, -27,P_Li,Lithium price from legacy Mirror enrichment pricing,15.152,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 -28,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,4.5678399999999995,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -29,P_f_CC,str,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 -30,L_CC,str,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 -31,L_CF,float,1.0,m,cal_L_CF,,CF_magnet_number,0 -32,L,str,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 -33,V_vac,str,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 -34,P_alpha,str,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 -35,P_n,str,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 -36,P_ine,str,70.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 -37,P_pump,str,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 -38,P_sub_cont,str,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 -39,P_cryo,str,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 -40,P_other,str,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 -41,P_in,str,35.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 -42,P_th,str,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 -43,P_the,str,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 -44,P_DEC,str,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 -45,P_DECe,str,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 -46,P_egross,str,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 -47,P_enet,str,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 -48,f_aux,str,0.031565554604461525,1,cal_f_aux,"P_aux, P_egross",,0 -49,Q_sci,str,0.02857142857142857,1,cal_Q_sci,"P_f, P_in",,0 -50,Q_eng,str,0.45207950218806525,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 -51,f_refrac,str,2.2120003122459635,1,cal_f_refrac,Q_eng,,0 -52,T,Mean coolant temperature for legacy PbLi density correlation,300.0,degC,,,rho_PbLi,0 -53,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.075,1,,,"P_Li, rho_PbLi",0 -54,cost,float,29.1,1,,,, -55,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 -56,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -57,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 -58,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -59,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 -60,r_vv,HF shield vacuum vessel radial thickness allowance,0.01,m,,,HF_magnet_shield_cost,0 -61,r_magnet,HF shield magnet radius,1.5,m,,,HF_magnet_shield_cost,0 -62,r_cryostat,HF shield cryostat radius allowance,1.0,m,,,HF_magnet_shield_cost,0 -63,f_vol,HF shield volume fill fraction,0.9,1,,,HF_magnet_shield_cost,0 -64,length_cc_cylinder,HF shield central-cell-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -65,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -66,application,Mirror input parameter,heat,1,,,P_egross,0 -67,P_f,Mirror input parameter,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 -68,P_f_L,Mirror input parameter,1.0,MW/m,,,L_CC,0 -69,P_f_EP,Mirror input parameter,1.0,MW,,,P_f_CC,0 -70,P_NBI,Mirror input parameter,15.0,MW,,,"P_in, P_ine",0 -71,P_ECH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 -72,P_ICRH,Mirror input parameter,10.0,MW,,,"P_in, P_ine",0 -73,M_n,Mirror input parameter,1.1,1,,,"P_pump, P_th",0 -74,N_module,Mirror input parameter,1.0,1,,,,0 -75,f_pump,Mirror input parameter,0.03,1,,,P_pump,0 -76,f_sub,Mirror input parameter,0.04,1,,,P_sub_cont,0 -77,f_cryo,Mirror input parameter,0.01,1,,,P_cryo,0 -78,P_pfcool,Mirror input parameter,0.0,MW,,,,0 -79,P_thcool,Mirror input parameter,0.0,MW,,,,0 -80,P_coils,Mirror input parameter,0.0,MW,,,,0 -81,P_aux,Mirror input parameter,1.0,MW,,,f_aux,0 -82,eta_th,Mirror input parameter,0.5,1,,,P_the,0 -83,eta_DEC,Mirror input parameter,0.9,1,,,P_DECe,0 -84,eta_pump,Mirror input parameter,0.98,1,,,P_th,0 -85,eta_NBI,Mirror input parameter,0.5,1,,,P_ine,0 -86,eta_ECH,Mirror input parameter,0.5,1,,,P_ine,0 -87,eta_ICRH,Mirror input parameter,0.5,1,,,P_ine,0 -88,NOAK,Mirror input parameter,0.0,1,,,,0 -89,n_unit,Mirror input parameter,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 -90,construction_time,Mirror input parameter,6.0,years,,,,0 -91,lifetime,Mirror input parameter,30.0,years,,,,0 -92,replacement,Mirror input parameter,10.0,years,,,,0 -93,availability,Mirror input parameter,0.9,1,,,,0 -94,discount,Mirror input parameter,0.0245,1,,,,0 -95,LSA,Mirror input parameter,2.0,1,,,,0 -96,cost_file,Mirror input parameter,woodruff-data.csv,1,,,,0 -97,method,Mirror input parameter,new,1,,,,0 -98,include_decommissioning,Mirror input parameter,0.0,1,,,,0 -99,include_tax,Mirror input parameter,0.0,1,,,,0 -100,include_licensing,Mirror input parameter,0.0,1,,,,0 -101,include_contingency,Mirror input parameter,0.0,1,,,,0 -102,hf_magnet_length,Mirror input parameter,1.0,m,,,,0 -103,hf_magnet_shielding_thickness,Mirror input parameter,1.0,m,,,,0 -104,a_EC,Mirror input parameter,1.0,m,,,"V_vac, expander_cell_cost_result",0 -105,expander_cell_vessel_thickness,Mirror input parameter,0.01,m,,,expander_cell_cost_result,0 -106,expander_cell_vessel_material,Mirror input parameter,SS316,1,,,,0 -107,vacuum_gap_CC,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -108,first_wall_material,Mirror input parameter,W,1,,,,0 -109,first_wall_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -110,vacuum_vessel_material,Mirror input parameter,SS316,1,,,,0 -111,vacuum_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -112,multiplier_material,Mirror input parameter,Pb,1,,,,0 -113,multiplier_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -114,blanket_coolant_material,Mirror input parameter,Natural PbLi,1,,,,0 -115,blanket_thickness,Mirror input parameter,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -116,blanket_coolant_fraction,Mirror input parameter,0.9,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -117,blanket_structural_material,Mirror input parameter,SS316,1,,,,0 -118,blanket_structural_fraction,Mirror input parameter,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -119,outer_vessel_thickness,Mirror input parameter,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -120,L_EP,Mirror input parameter,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 -121,L_EC,Mirror input parameter,1.0,m,,,"L, expander_cell_cost_result",0 -122,a_EP,Mirror input parameter,1.0,m,,,,0 -123,HF_magnet_number,Mirror input parameter,4.0,1,,,HF_magnet_cost,0 -124,LF_magnet_number,Mirror input parameter,2.0,1,,,LF_magnet_cost,0 -125,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 -126,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 -127,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 -128,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 -129,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 -130,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 -131,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 -132,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 -133,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 -134,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 -135,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 -136,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 -137,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 -138,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 -139,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 -140,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 -141,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 -142,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 -143,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 -144,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 -145,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 -146,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 -147,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 -148,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -149,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -150,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -151,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 -152,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 -153,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 -154,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 -155,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 -156,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -157,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -158,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -159,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 -160,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 -161,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 -162,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 -163,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 -164,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 -165,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 -166,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 -167,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 -168,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 -169,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 -170,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 -171,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 -172,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 -173,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 -174,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 -175,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 -176,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 -177,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 -178,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 -179,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 -180,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 -181,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 -182,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -183,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -184,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -185,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 -186,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 -187,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 -188,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 -189,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 -190,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 -191,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 -192,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 -193,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 -194,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 -195,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 +1,E_DT,Energy released per deuterium-tritium fusion reaction,2.8182346199999998e-12,J,,,P_alpha,0 +2,E_alpha,Alpha-particle energy released per deuterium-tritium fusion reaction,5.6396736e-13,J,,,P_alpha,0 +3,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 +4,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,0.5031620991790029,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 +5,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,-0.5031620991790029,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 +6,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 +7,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 +8,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 +9,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 +10,axis_t,PyFECONS radial build axis thickness,0.0,m,,,,0 +11,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9838.0091935,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +12,f_Li,Lithium mass fraction in PbLi eutectic mixture,0.17,1,,,P_PbLi,0 +13,P_Li,Lithium price from legacy Mirror enrichment pricing,15.152,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 +14,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,4.5678399999999995,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li, f_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +15,P_f_CC,Fusion power assigned to the central cell,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 +16,L_CC,Calculated central cell length,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 +17,L_CF,Central-field coil spacing,1.0,m,cal_L_CF,,CF_magnet_number,0 +18,L,Overall axial length of the Mirror plant,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 +19,V_vac,Vacuum volume for the Mirror plant,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 +20,P_alpha,Fusion alpha-particle power,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 +21,P_n,Fusion neutron power,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 +22,P_ine,Injected-power electrical input requirement,70.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 +23,P_pump,Pumping power requirement,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 +24,P_sub_cont,Subsystem control power requirement,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 +25,P_cryo,Cryogenic power requirement,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 +26,P_other,Total miscellaneous plant power requirement,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 +27,P_in,Total injected heating power,35.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 +28,P_th,Recoverable thermal power,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 +29,P_the,Thermal-electric power contribution,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 +30,P_DEC,Power available to direct energy conversion,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 +31,P_DECe,Electrical output from direct energy conversion,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 +32,P_egross,Gross electric power,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 +33,P_enet,Net electric power,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 +34,f_aux,Auxiliary power fraction relative to gross electric power,0.031565554604461525,1,cal_f_aux,"P_aux, P_egross",,0 +35,Q_sci,Scientific fusion gain,0.02857142857142857,1,cal_Q_sci,"P_f, P_in",,0 +36,Q_eng,Engineering gain,0.45207950218806525,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 +37,f_refrac,Recirculating power fraction,2.2120003122459635,1,cal_f_refrac,Q_eng,,0 +38,T,Mean coolant temperature for legacy PbLi density correlation,300.0,degC,,,rho_PbLi,0 +39,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.075,1,,,"P_Li, rho_PbLi",0 +40,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 +41,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +42,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 +43,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +44,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 +45,r_vv,HF shield vacuum vessel radial thickness allowance,0.01,m,,,HF_magnet_shield_cost,0 +46,r_magnet,HF shield magnet radius,1.5,m,,,HF_magnet_shield_cost,0 +47,r_cryostat,HF shield cryostat radius allowance,1.0,m,,,HF_magnet_shield_cost,0 +48,f_vol,HF shield volume fill fraction,0.9,1,,,HF_magnet_shield_cost,0 +49,length_cc_cylinder,HF shield central-cell-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +50,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +51,application,Mirror plant application mode used for gross-electric-power logic,heat,1,,,P_egross,0 +52,P_f,Total fusion power,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 +53,P_f_L,Fusion power per meter of central cell length,1.0,MW/m,,,L_CC,0 +54,P_f_EP,Fusion power assigned to each end plug,1.0,MW,,,P_f_CC,0 +55,P_NBI,Neutral beam injection power,15.0,MW,,,"P_in, P_ine",0 +56,P_ECH,Electron cyclotron heating power,10.0,MW,,,"P_in, P_ine",0 +57,P_ICRH,Ion cyclotron resonance heating power,10.0,MW,,,"P_in, P_ine",0 +58,M_n,Neutron energy multiplication factor,1.1,1,,,"P_pump, P_th",0 +59,N_module,Number of Mirror plant modules,1.0,1,,,,0 +60,f_pump,Fraction of neutron power used for pumping,0.03,1,,,P_pump,0 +61,f_sub,Fraction of fusion power used for subsystem controls,0.04,1,,,P_sub_cont,0 +62,f_cryo,Fraction of fusion power used for cryogenic load,0.01,1,,,P_cryo,0 +63,P_pfcool,Plasma-facing-component cooling power,0.0,MW,,,,0 +64,P_thcool,Thermal-system cooling power,0.0,MW,,,,0 +65,P_coils,Coil power load,0.0,MW,,,,0 +66,P_aux,Auxiliary plant power,1.0,MW,,,f_aux,0 +67,eta_th,Thermal conversion efficiency,0.5,1,,,P_the,0 +68,eta_DEC,Direct energy conversion efficiency,0.9,1,,,P_DECe,0 +69,eta_pump,Pump heat recovery efficiency,0.98,1,,,P_th,0 +70,eta_NBI,Neutral beam injection wall-plug efficiency,0.5,1,,,P_ine,0 +71,eta_ECH,Electron cyclotron heating wall-plug efficiency,0.5,1,,,P_ine,0 +72,eta_ICRH,Ion cyclotron resonance heating wall-plug efficiency,0.5,1,,,P_ine,0 +73,NOAK,Nth-of-a-kind plant flag,0.0,1,,,,0 +74,n_unit,Plant unit number for learning-curve cost scaling,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 +75,construction_time,Construction duration,6.0,years,,,,0 +76,lifetime,Plant operating lifetime,30.0,years,,,,0 +77,replacement,Major component replacement interval,10.0,years,,,,0 +78,availability,Plant availability factor,0.9,1,,,,0 +79,discount,Real discount rate,0.0245,1,,,,0 +80,LSA,Licensing safety analysis level,2.0,1,,,,0 +81,cost_file,PyFECONS cost data file name,woodruff-data.csv,1,,,,0 +82,method,PyFECONS costing method selector,new,1,,,,0 +83,include_decommissioning,Flag to include decommissioning cost,0.0,1,,,,0 +84,include_tax,Flag to include tax cost,0.0,1,,,,0 +85,include_licensing,Flag to include licensing cost,0.0,1,,,,0 +86,include_contingency,Flag to include contingency cost,0.0,1,,,,0 +87,hf_magnet_length,High-field magnet axial length,1.0,m,,,,0 +88,hf_magnet_shielding_thickness,High-field magnet shielding thickness,1.0,m,,,,0 +89,a_EC,Expander cell plasma radius,1.0,m,,,"V_vac, expander_cell_cost_result",0 +90,expander_cell_vessel_thickness,Expander cell vessel wall thickness,0.01,m,,,expander_cell_cost_result,0 +91,expander_cell_vessel_material,Expander cell vessel material,SS316,1,,,,0 +92,vacuum_gap_CC,Central cell radial vacuum gap,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +93,first_wall_material,Central cell first wall material,W,1,,,,0 +94,first_wall_thickness,Central cell first wall thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +95,vacuum_vessel_material,Central cell vacuum vessel material,SS316,1,,,,0 +96,vacuum_vessel_thickness,Central cell vacuum vessel thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +97,multiplier_material,Central cell neutron multiplier material,Pb,1,,,,0 +98,multiplier_thickness,Central cell neutron multiplier thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +99,blanket_coolant_material,Central cell blanket coolant material,Natural PbLi,1,,,,0 +100,blanket_thickness,Central cell blanket radial thickness,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +101,blanket_coolant_fraction,Central cell blanket coolant volume fraction,0.9,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +102,blanket_structural_material,Central cell blanket structural material,SS316,1,,,,0 +103,blanket_structural_fraction,Central cell blanket structural volume fraction,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +104,outer_vessel_thickness,Central cell outer vessel thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +105,L_EP,End plug axial length,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 +106,L_EC,Expander cell axial length,1.0,m,,,"L, expander_cell_cost_result",0 +107,a_EP,End plug plasma radius,1.0,m,,,,0 +108,HF_magnet_number,Number of high-field magnets,4.0,1,,,HF_magnet_cost,0 +109,LF_magnet_number,Number of low-field magnets,2.0,1,,,LF_magnet_cost,0 +110,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 +111,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 +112,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 +113,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 +114,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 +115,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 +116,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 +117,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 +118,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 +119,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 +120,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 +121,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 +122,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 +123,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 +124,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 +125,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 +126,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 +127,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 +128,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 +129,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 +130,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 +131,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 +132,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 +133,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +134,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +135,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +136,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 +137,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 +138,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 +139,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 +140,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 +141,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +142,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +143,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +144,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 +145,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 +146,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 +147,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 +148,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 +149,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 +150,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 +151,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 +152,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 +153,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 +154,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 +155,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 +156,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 +157,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 +158,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 +159,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 +160,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 +161,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 +162,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 +163,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 +164,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 +165,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 +166,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 +167,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +168,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +169,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +170,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 +171,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 +172,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 +173,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 +174,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 +175,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 +176,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 +177,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 +178,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 +179,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 +180,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 From cf5d91f81d08bc72f979d41264c0634f9030937c Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Wed, 5 Aug 2026 16:59:44 -0500 Subject: [PATCH 21/23] Validate Mirror ACCERT defaults against TEAm --- ...r_account_cost_difference_new_defaults.csv | 92 +++++ src/Algorithm/MirrorFunc.py | 135 +++++-- src/accertdb.sqlite | Bin 1110016 -> 1110016 bytes src/scripts/build_mirror_accert_tables.py | 217 +++++++---- test/test_mirror_model.py | 76 ++-- tutorial/accert/Mirror.son | 1 - tutorial/accert/ref_tables/MirrorFunc.py | 135 +++++-- tutorial/accert/ref_tables/mirror_account.csv | 124 +++---- .../accert/ref_tables/mirror_algorithm.csv | 7 +- .../ref_tables/mirror_default_inputs.csv | 32 +- .../accert/ref_tables/mirror_variable.csv | 336 +++++++++--------- 11 files changed, 759 insertions(+), 396 deletions(-) create mode 100644 doc_work/mirror_matt_comparison/mirror_account_cost_difference_new_defaults.csv diff --git a/doc_work/mirror_matt_comparison/mirror_account_cost_difference_new_defaults.csv b/doc_work/mirror_matt_comparison/mirror_account_cost_difference_new_defaults.csv new file mode 100644 index 0000000..d4cb38d --- /dev/null +++ b/doc_work/mirror_matt_comparison/mirror_account_cost_difference_new_defaults.csv @@ -0,0 +1,92 @@ +account,account_name,accert_cost_musd,legacy_cost_musd,difference_musd,relative_difference_percent,status +10,Pre-Construction Costs,24.186117539999998,24.18611754015809,-1.580922059929435e-10,-6.536485474795643e-10,match +11,Land and Land Rights,1.18611754,1.186117540158087,-1.5808709896703022e-10,-1.3328114087745485e-08,match +12,Site Permits,10.0,10.0,0.0,0.0,match +13,Plant Licensing,0.0,0.0,0.0,0.0,match +14,Plant Permits,5.0,5.0,0.0,0.0,match +15,Plant Studies,5.0,5.0,0.0,0.0,match +16,Plant Reports,2.0,2.0,0.0,0.0,match +17,Other Pre-Construction Costs,1.0,1.0,0.0,0.0,match +19,Contingency on Pre-Construction Costs,0.0,0.0,0.0,0.0,match +20,Capitalized Direct Costs (CDC),1474.1300122589957,1474.130012258995,6.821210263296962e-13,4.6272786026817015e-14,match +21,Structures and Improvements,100.08839411800456,100.0883941180045,5.684341886080802e-14,5.6793216997556644e-14,match +21.1,Site Preparation/Yard Work,37.55241442478681,37.55241442478681,0.0,0.0,match +21.2,Heat Island Building,26.174593337873794,26.17459333787379,3.552713678800501e-15,1.3573138015710216e-14,match +21.3,Turbine Generator Building,7.5665312646958505,7.56653126469585,8.881784197001252e-16,1.1738250839512355e-14,match +21.4,Heat Exchanger Building,5.296571885287096,5.296571885287095,8.881784197001252e-16,1.676892977073193e-14,match +21.5,Power Supply and Energy Storage,1.51330625293917,1.51330625293917,0.0,0.0,match +21.6,Reactor Auxiliaries,0.756653126469585,0.756653126469585,0.0,0.0,match +21.7,Hot Cell,13.087296668936895,13.0872966689369,-5.329070518200751e-15,-4.071941404713063e-14,match +21.8,Reactor Services,2.620261752774304,2.620261752774304,0.0,0.0,match +21.9,Service Water,0.04203628480386583,0.04203628480386583,0.0,0.0,match +21.10,Fuel Storage,0.1541330442808414,0.1541330442808414,0.0,0.0,match +21.11,Control Room,0.1261088544115975,0.1261088544115975,0.0,0.0,match +21.12,Onsite AC Power,0.11209675947697556,0.1120967594769756,-4.163336342344337e-17,-3.7140559296894536e-14,match +21.13,Administration,0.6165321771233656,0.6165321771233656,0.0,0.0,match +21.14,Site Services,0.22419351895395118,0.2241935189539511,8.326672684688674e-17,3.7140559296894555e-14,match +21.15,Cryogenics,0.3362902784309266,0.3362902784309266,0.0,0.0,match +21.16,Security,0.1261088544115975,0.1261088544115975,0.0,0.0,match +21.17,Ventilation Stack,3.7832656323479252,3.783265632347925,4.440892098500626e-16,1.1738250839512355e-14,match +22,Heat Island Plant Equipment,1306.0449137280875,1306.044913728087,4.547473508864641e-13,3.481866098987317e-14,match +22.1,Heat Island Components,1098.858920919871,1098.858920919871,0.0,0.0,match +22.1.1,First Wall and Blanket,446.188406030979,446.1884060309789,1.1368683772161603e-13,2.547955890044412e-14,match +22.1.2,Magnet Radiation Shield,41.347938004038724,41.34793800403872,7.105427357601002e-15,1.7184478115709105e-14,match +22.1.3,Coils,272.03997684210526,272.0399768421053,-5.684341886080802e-14,-2.0895244706552997e-14,match +22.1.3.1,HF Coils,116.4,116.4,0.0,0.0,match +22.1.3.2,LF Coils,12.50524,12.50524,0.0,0.0,match +22.1.3.3,CC Coils,143.13473684210524,143.1347368421053,-5.684341886080802e-14,-3.971322413755725e-14,match +22.1.4,Supplemental Heating,105.963,105.963,0.0,0.0,match +22.1.4.1,NBI,105.963,105.963,0.0,0.0,match +22.1.4.2,ICRH,0.0,0.0,0.0,0.0,match +22.1.4.3,ECH,0.0,0.0,0.0,0.0,match +22.1.5,Primary Structure and Support,0.0,0.0,0.0,0.0,match +22.1.6,Vacuum System,2.0318272568698563,2.031827256869856,4.440892098500626e-16,2.1856642012678137e-14,match +22.1.6.2,Vessel Refrigerators,0.0,0.0,0.0,0.0,match +22.1.6.3,Primary Vacuum Pumps,1.6898272568698565,1.689827256869856,4.440892098500626e-16,2.6280154261014185e-14,match +22.1.6.4,Backing Vacuum Pumps,0.342,0.342,0.0,0.0,match +22.1.7,Power Supplies,0.0,0.0,0.0,0.0,match +22.1.8,Divertor,0.0,0.0,0.0,0.0,match +22.1.9,Direct Energy Convertor,78.09256483797613,78.09256483797611,1.4210854715202004e-14,1.8197449071734573e-14,match +22.1.11,Assembly and Installation Costs,153.19520794790242,153.1952079479024,2.842170943040401e-14,1.855260997463411e-14,match +22.2,Main and Secondary Coolant,30.661451500676122,30.66145150067612,3.552713678800501e-15,1.158690637565596e-14,match +22.3,Auxiliary Cooling Systems,0.3521982634809552,0.3521982634809552,0.0,0.0,match +22.4,Radioactive Waste Treatment,0.6275532694751564,0.6275532694751564,0.0,0.0,match +22.5,Fuel Handling and Storage,88.65405229068641,88.65405229068641,0.0,0.0,match +22.6,Other Heat Island Equipment,1.8907374838973947,1.890737483897395,-2.220446049250313e-16,-1.1743809323932623e-14,match +22.7,Instrumentation and Control,85.0,85.0,0.0,0.0,match +23,Turbine Plant Equipment,35.289461092845364,35.28946109284536,7.105427357601002e-15,2.0134700665750794e-14,match +24,Electric Plant Equipment,8.701510954400227,8.701510954400227,0.0,0.0,match +25,Miscellaneous Plant Equipment,6.123285486429789,6.123285486429789,0.0,0.0,match +26,Heat Rejection,12.88244687922834,12.88244687922834,0.0,0.0,match +27,Special Materials,0.0,0.0,0.0,0.0,match +28,Digital Twin/Simulator,5.0,5.0,0.0,0.0,match +29,Contingency on Direct Capital Costs,0.0,0.0,0.0,0.0,match +30,Capitalized Indirect Service Costs (CISC),75.18916312710233,75.18916312710233,0.0,0.0,match +31,Field Indirect Costs,15.037832625420467,15.03783262542047,-3.552713678800501e-15,-2.3625171042234314e-14,match +32,Construction Supervision,37.594581563551166,37.59458156355117,-7.105427357601002e-15,-1.8900136833787453e-14,match +33,Commissioning and Start-Up Costs,0.0,0.0,0.0,0.0,match +34,Demonstration Test Run,0.0,0.0,0.0,0.0,match +35,Design Services Offsite,22.5567489381307,22.5567489381307,0.0,0.0,match +36,PM/CM Services Offsite,0.0,0.0,0.0,0.0,match +37,Design Servies Offsite,0.0,0.0,0.0,0.0,match +38,PM/CM Services Onsite,0.0,0.0,0.0,0.0,match +39,Contingency on Support Services,0.0,0.0,0.0,0.0,match +40,Capitalized Owner's Cost (COC),176.8956014710795,176.8956014710794,8.526512829121202e-14,4.820081877793439e-14,match +50,Capitalized Supplementary Costs (CSC),39.53003446099854,39.53003446099854,0.0,0.0,match +51,Shipping and Transportation Costs,8.0,8.0,0.0,0.0,match +52,Spare Parts,6.799670441290373,6.799670441290371,1.7763568394002505e-15,2.6124160791874378e-14,match +53,Taxes,0.0,0.0,0.0,0.0,match +54,Insurance,1.0,1.0,0.0,0.0,match +55,Initial Fuel Load,23.73036401970817,23.73036401970817,0.0,0.0,match +58,Decommissioning Costs,0.0,0.0,0.0,0.0,match +59,Contingency on Supplementary Costs,0.0,0.0,0.0,0.0,match +60,Capitalized Financial Costs (CFC),217.75192444411263,217.7519244441301,-1.7479351299698465e-11,-8.027185681283495e-12,match +61,Escalation,20.125,20.125,0.0,0.0,match +62,Fees,0.0,0.0,0.0,0.0,match +63,Interest During Construction (IDC),197.62692444411263,197.6269244441301,-1.7479351299698465e-11,-8.844620412356791e-12,match +69,Contingency on Capitalized Financial Costs,0.0,0.0,0.0,0.0,match +OCC,Overnight Capital Cost (OCC),1789.9309288581762,1789.930928858334,-1.5779733075760305e-10,-8.815833517008973e-12,match +TCC,Total Capital Cost (TCC),2007.682853302289,2007.682853302464,-1.7507773009128869e-10,-8.72038777455817e-12,match +O&M,Operations and Maintenance,6.281566946393339,6.281566946393339,0.0,0.0,match +Fuel,Fuel,0.1090042081,0.1090042082757512,-1.7575120525581411e-10,-1.61233412944215e-07,match +81,Deuterium,0.047391176570000006,0.04739117663471425,-6.47142409104795e-11,-1.3655335340012648e-07,match diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index e30d482..613bb06 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -90,16 +90,16 @@ def cal_cost_factor(n_unit): return 0.80 ** (np.log(n_unit) / np.log(2)) @staticmethod - def cal_HF_magnet_cost(n_unit, HF_magnet_number): - return MirrorFunc.HF_magnet_cost(n_unit, HF_magnet_number) + def cal_HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale): + return MirrorFunc.HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale) @staticmethod - def cal_LF_magnet_cost(n_unit, LF_magnet_number): - return MirrorFunc.LF_magnet_cost(n_unit, LF_magnet_number) + def cal_LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale): + return MirrorFunc.LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale) @staticmethod - def cal_CF_magnet_cost(n_unit, CF_magnet_number): - return MirrorFunc.CF_magnet_cost(n_unit, CF_magnet_number) + def cal_CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale): + return MirrorFunc.CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale) @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): @@ -193,12 +193,11 @@ def cal_rho_PbLi(T, f_6Li): @staticmethod def cal_P_Li(f_6Li): if f_6Li == 0.075: - return 15.152 - if f_6Li >= 0.90: - points = [(0.90, 1), (0.99, 2), (0.999, 4), (0.9999, 8), (0.99999, 16)] - for (x0, y0), (x1, y1) in zip(points, points[1:]): - if x0 <= f_6Li <= x1: - return (y0 + (y1 - y0) * (f_6Li - x0) / (x1 - x0)) * 70 + return 29.53 + if 0.075 <= f_6Li <= 0.975: + enrichments = [0.075, 0.80, 0.90, 0.95, 0.975] + prices = [29.53, 2000.0, 4000.0, 8000.0, 16000.0] + return float(np.interp(f_6Li, enrichments, prices)) raise ValueError("Lithium pricing at this enrichment level is not supported") @staticmethod @@ -369,7 +368,7 @@ def cal_expander_cell_cost_result( @staticmethod def cal_HF_magnet_shield_cost( a_M, - a_CC, + a_CC_shield, a_0, length, r_gap, @@ -379,6 +378,8 @@ def cal_HF_magnet_shield_cost( f_vol, length_cc_cylinder, length_ep_cylinder, + r_out_cc, + r_out_ep, W_rho, W_c_raw, W_m, @@ -387,13 +388,11 @@ def cal_HF_magnet_shield_cost( r_out = r_magnet - r_cryostat v_inner = np.pi * length * (r_out**2 - r_in**2) * f_vol - r_in_cc = a_CC + r_gap + r_vv - r_out_cc = r_in_cc + 0.5 + r_in_cc = a_CC_shield + r_gap + r_vv v_cc_cylinder = np.pi * length_cc_cylinder * (r_out_cc**2 - r_in_cc**2) * f_vol v_cc_triangle = np.pi * length_cc_cylinder / 3 * (r_in_cc - r_in) * (r_in + 2 * r_in_cc) * f_vol r_in_ep = a_0 + r_gap + r_vv - r_out_ep = r_in_ep + 0.5 v_ep_cylinder = np.pi * length_ep_cylinder * (r_out_ep**2 - r_in_ep**2) * f_vol v_ep_triangle = np.pi * length_ep_cylinder / 3 * (r_in_ep - r_in) * (r_in + 2 * r_in_ep) * f_vol @@ -644,6 +643,11 @@ def Account_C22_2_3(): # Tertiary Coolant return(0) + @staticmethod + def Account_C22_2(N_module, P_egross, P_th): + # Main and Secondary Coolant + return 166 * (N_module * P_egross / 1000) + 40.6 * (P_th / 3500) ** 0.55 + @staticmethod def Account_C22_3(N_module, P_th): # Auxiliary Cooling Systems @@ -723,6 +727,86 @@ def Account_C28(): # Digital Twin return(5) + @staticmethod + def Account_C31(P_enet, construction_time): + # Field Indirect Costs + if P_enet > 0: + return (max(P_enet / 150, 0)) ** -0.5 * P_enet * 0.02 * construction_time + return 0 + + @staticmethod + def Account_C32(P_enet, construction_time): + # Construction Supervision + if P_enet > 0: + return (P_enet / 150) ** -0.5 * P_enet * 0.05 * construction_time + return 0 + + @staticmethod + def Account_C35(P_enet, construction_time, n_unit): + # Design Services Offsite + if P_enet > 0: + cost_factor = 0.70 ** (np.log(n_unit) / np.log(2)) + return (P_enet / 150) ** -0.5 * P_enet * 0.03 * construction_time * cost_factor + return 0 + + @staticmethod + def Account_C51(): + # Shipping and Transportation Costs + return 8 + + @staticmethod + def Account_C52(N_module, P_egross, P_enet): + # Spare Parts + return 0.1 * ( + MirrorFunc.Account_C23(N_module, P_egross) + + MirrorFunc.Account_C24(N_module, P_egross) + + MirrorFunc.Account_C25(N_module, P_egross) + + MirrorFunc.Account_C26(N_module, P_enet) + + MirrorFunc.Account_C27() + + MirrorFunc.Account_C28() + ) + + @staticmethod + def Account_C53(include_tax): + # Taxes + return 100 if bool(include_tax) else 0 + + @staticmethod + def Account_C54(): + # Insurance + return 1 + + @staticmethod + def Account_C55(P_enet): + # Initial Fuel Load + return P_enet / 150 * 34 + + @staticmethod + def Account_C58(include_decommissioning): + # Decommissioning Costs + return 200 if bool(include_decommissioning) else 0 + + @staticmethod + def Account_C61(N_module, P_f, NOAK): + # Escalation + learning_credit = 0.0 if bool(NOAK) else 1.0 + return N_module * P_f / 1000 * 115 * learning_credit + + @staticmethod + def Account_C62(): + # Fees + return 0 + + @staticmethod + def Account_C69(include_contingency, NOAK): + # Contingency on Capitalized Financial Costs + return 0 + + @staticmethod + def Account_OM(P_enet): + # Annualized O&M Cost + return 60 * P_enet * 1000 / 1e6 + ### MNyberg's Magnet Methods ### # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 @@ -811,33 +895,32 @@ def HTS_storedEnergy(field, inner_rad, HTS_temp=20): @staticmethod - def HF_magnet_cost(n_unit, HF_magnet_number, HF_field=25.0, inner_rad=50): + def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): # This is the HF cost per magnet [MUSD], not for all four - # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit - cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) + cost = 29.10 cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) - return(cost * cost_factor) + return(cost * cost_factor * sc_mat_scale) @staticmethod - def LF_magnet_cost(n_unit, LF_magnet_number, LF_field=10.0, inner_rad=50): + def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): # This is the LF cost per magnet [MUSD] - cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) + cost = 6.25262 cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) - return(cost * cost_factor) + return(cost * cost_factor * sc_mat_scale) @staticmethod - def CF_magnet_cost(n_unit, CF_magnet_number, CF_field=3.0): + def CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale=1.0): # This is the CF cost per magnet [MUSD] convert_to_currentDollar = 1.31 - cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS + cost = 0.7*3.0*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS cost_factor = (0.70)**(np.log((n_unit - 1) * CF_magnet_number + 1)/np.log(2)) - return(cost * cost_factor) + return(cost * cost_factor * sc_mat_scale) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 276130bd7d31e0a8e8fc8fc65df5ee810f7d67ba..979ba44b8d3f95be6ab289e1f30d72d428f83f35 100644 GIT binary patch delta 8408 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 delta 7723 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 int: def _mirror_method_name(code_of_account: str) -> str: if code_of_account in {"OCC", "TCC"}: return f"Account_{code_of_account}" + if code_of_account == "O&M": + return "Account_OM" if re.fullmatch(r"[0-9.]+", code_of_account): return "Account_C" + code_of_account.replace(".", "_") return "" @@ -720,6 +713,37 @@ def _account_variables(input_keys: list[str], account_calls: list[str]) -> str: return ", ".join(HUMAN_INPUT_TO_VAR.get(key, key) for key in input_keys) +def _load_mirror_algorithm_class(algorithm_source: Path): + src_path = str(ROOT / "src") + if src_path not in sys.path: + sys.path.insert(0, src_path) + from Algorithm.MirrorFunc import MirrorFunc + + return MirrorFunc + + +def _account_input_values(input_defaults: dict[str, tuple[object, str]], generated_values: dict[str, float]) -> dict[str, object]: + values: dict[str, object] = {name: value for name, (value, _unit) in input_defaults.items()} + values.update({name: value for name, (value, _unit) in MIRROR_CONSTANT_DEFAULTS.items()}) + values.update( + { + name: value + for name, (_description, value, _unit) in MIRROR_VARIABLE_OVERRIDES.items() + if value is not None + } + ) + values.update(generated_values) + return values + + +def _calculate_account_musd(algorithm_class, alg_name: str, variables: str, values: dict[str, object]) -> float | None: + if not alg_name or not hasattr(algorithm_class, alg_name): + return None + args = _split_vars(variables) + kwargs = {arg: values[arg] for arg in args} + return float(getattr(algorithm_class, alg_name)(**kwargs)) + + def _mirror_input_defaults(_algorithm_source: Path | None = None) -> dict[str, tuple[object, str]]: values = {} for name, value in MIRROR_INPUT_DEFAULTS.items(): @@ -752,15 +776,17 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) values["vpump_cap"] = MIRROR_VARIABLE_OVERRIDES["vpump_cap"][1] generated["no_vpumps"] = generated["V_vac"] / values["vpump_cap"] generated["cost_factor"] = 0.80 ** (math.log(values["n_unit"]) / math.log(2)) + generated["CF_magnet_number"] = generated["L_CC"] / generated["L_CF"] + values["CF_magnet_number"] = generated["CF_magnet_number"] generated["HF_magnet_cost"] = 29.1 * 0.70 ** ( math.log((values["n_unit"] - 1) * values["HF_magnet_number"] + 1) / math.log(2) - ) + ) * values["sc_mat_scale"] generated["LF_magnet_cost"] = 6.25262 * 0.70 ** ( math.log((values["n_unit"] - 1) * values["LF_magnet_number"] + 1) / math.log(2) - ) + ) * values["sc_mat_scale"] generated["CF_magnet_cost"] = 2.751 * 0.70 ** ( math.log((values["n_unit"] - 1) * values["CF_magnet_number"] + 1) / math.log(2) - ) + ) * values["sc_mat_scale"] generated["P_alpha"] = values["P_f"] * values["E_alpha"] / values["E_DT"] generated["P_n"] = values["P_f"] - generated["P_alpha"] generated["P_ine"] = ( @@ -786,7 +812,6 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) generated["Q_sci"] = values["P_f"] / generated["P_in"] generated["Q_eng"] = generated["P_egross"] / (generated["P_ine"] + generated["P_other"]) generated["f_refrac"] = 1 / generated["Q_eng"] - generated["CF_magnet_number"] = generated["L_CC"] / generated["L_CF"] T_K = values["T"] + 273.15 f_6li_natural = 0.075 rho_6li = 460.0 @@ -795,7 +820,19 @@ def _mirror_generated_var_values(input_defaults: dict[str, tuple[object, str]]) generated["rho_PbLi"] = rho_pbli * ( rho_6li * values["f_6Li"] + rho_7li * (1 - values["f_6Li"]) ) / (rho_6li * f_6li_natural + rho_7li * (1 - f_6li_natural)) - generated["P_Li"] = 15.152 + if values["f_6Li"] == 0.075: + generated["P_Li"] = 29.53 + elif 0.075 <= values["f_6Li"] <= 0.975: + enrichments = [0.075, 0.80, 0.90, 0.95, 0.975] + prices = [29.53, 2000.0, 4000.0, 8000.0, 16000.0] + for idx in range(len(enrichments) - 1): + x0, x1 = enrichments[idx], enrichments[idx + 1] + if x0 <= values["f_6Li"] <= x1: + y0, y1 = prices[idx], prices[idx + 1] + generated["P_Li"] = y0 + (y1 - y0) * (values["f_6Li"] - x0) / (x1 - x0) + break + else: + raise ValueError("Lithium pricing at this enrichment level is not supported") generated["P_PbLi"] = (1 - values["f_Li"]) * values["Pb_c_raw"] + values["f_Li"] * generated["P_Li"] def central_cell_cylindrical_cost(length: float) -> float: @@ -857,8 +894,8 @@ def central_cell_cylindrical_cost(length: float) -> float: v_radially_inner_cylinder = ( math.pi * values["length"] * (shield_r_out**2 - shield_r_in**2) * values["f_vol"] ) - shield_r_in_cc = values["a_CC"] + values["r_gap"] + values["r_vv"] - shield_r_out_cc = shield_r_in_cc + 0.5 + shield_r_in_cc = values["a_CC_shield"] + values["r_gap"] + values["r_vv"] + shield_r_out_cc = values["r_out_cc"] v_cc_cylinder = ( math.pi * values["length_cc_cylinder"] @@ -874,7 +911,7 @@ def central_cell_cylindrical_cost(length: float) -> float: * values["f_vol"] ) shield_r_in_ep = values["a_0"] + values["r_gap"] + values["r_vv"] - shield_r_out_ep = shield_r_in_ep + 0.5 + shield_r_out_ep = values["r_out_ep"] v_ep_cylinder = ( math.pi * values["length_ep_cylinder"] @@ -904,6 +941,8 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: dependencies = _account_method_dependencies(algorithm_source) input_defaults = _mirror_input_defaults(algorithm_source) generated_values = _mirror_generated_var_values(input_defaults) + account_values = _account_input_values(input_defaults, generated_values) + algorithm_class = _load_mirror_algorithm_class(algorithm_source) methods = set(dependencies) conn.execute("ALTER TABLE mirror_acco RENAME TO mirror_acco_raw") conn.execute( @@ -937,14 +976,9 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: if is_rollup or account_calls or alg_name not in methods: alg_name = "" normalized_total_cost = _dollar_value(total_cost) - if code == "2211": - normalized_total_cost = ( - generated_values["central_cell_cylindrical_part_cost"] - + 2 * generated_values["end_plug_cylindrical_part_cost"] - + 2 * generated_values["expander_cell_cost_result"] - ) * 1e6 - elif code == "2212": - normalized_total_cost = 2 * generated_values["HF_magnet_shield_cost"] * 1e6 + calculated = _calculate_account_musd(algorithm_class, alg_name, variables, account_values) + if calculated is not None: + normalized_total_cost = calculated * 1e6 conn.execute( """ INSERT INTO mirror_acco @@ -966,9 +1000,64 @@ def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: variables, ), ) + _refresh_mirror_rollups(conn, account_values) conn.execute("DROP TABLE mirror_acco_raw") +def _sum_accounts(conn: sqlite3.Connection, accounts: list[str]) -> float: + placeholders = ", ".join("?" for _ in accounts) + row = conn.execute( + f"SELECT COALESCE(SUM(total_cost), 0) FROM mirror_acco WHERE code_of_account IN ({placeholders})", + accounts, + ).fetchone() + return float(row[0] or 0.0) + + +def _set_account_total(conn: sqlite3.Connection, code: str, total_cost: float) -> None: + conn.execute( + "UPDATE mirror_acco SET total_cost = ? WHERE code_of_account = ?", + (float(total_cost), code), + ) + + +def _refresh_mirror_rollups(conn: sqlite3.Connection, values: dict[str, object]) -> None: + rollups = { + "2213": ["22131", "22132", "22133"], + "2214": ["22141", "22142", "22143"], + "2216": ["22162", "22163", "22164"], + "221": ["2211", "2212", "2213", "2214", "2215", "2216", "2217", "2218", "2219", "22111"], + "22": ["221", "222", "223", "224", "225", "226", "227"], + "21": [ + "211", "212", "213", "214", "215", "216", "217", "218", "219", + "2110", "2111", "2112", "2113", "2114", "2115", "2116", "2117", + ], + "20": ["21", "22", "23", "24", "25", "26", "27", "28", "29"], + "10": ["11", "12", "13", "14", "15", "16", "17", "19"], + "30": ["31", "32", "33", "34", "35", "36", "37", "38", "39"], + "50": ["51", "52", "53", "54", "55", "58", "59"], + } + for code, children in rollups.items(): + _set_account_total(conn, code, _sum_accounts(conn, children)) + + _set_account_total(conn, "52", 0.1 * _sum_accounts(conn, ["23", "24", "25", "26", "27", "28"])) + _set_account_total(conn, "50", _sum_accounts(conn, ["51", "52", "53", "54", "55", "58", "59"])) + + lsa = int(float(values.get("LSA", 2))) + owner_factors = [0.1130, 0.1200, 0.1280, 0.1510] + account_20 = _sum_accounts(conn, ["20"]) + _set_account_total(conn, "40", owner_factors[lsa - 1] * account_20) + + occ = _sum_accounts(conn, ["10", "20", "30", "40", "50"]) + _set_account_total(conn, "OCC", occ) + + discount = float(values["discount"]) + construction_time = float(values["construction_time"]) + idcm = ((1 + discount) ** (1 + construction_time) - (1 + discount)) / (discount * construction_time) + _set_account_total(conn, "63", (idcm - 1) * occ) + _set_account_total(conn, "60", _sum_accounts(conn, ["61", "62", "63", "69"])) + _set_account_total(conn, "TCC", _sum_accounts(conn, ["OCC", "60"])) + + def _split_vars(value: str | None) -> list[str]: if value is None: return [] diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py index bf8dee9..80f527b 100644 --- a/test/test_mirror_model.py +++ b/test/test_mirror_model.py @@ -36,9 +36,14 @@ def test_mirror_default_inputs_are_exported_from_builder_defaults(): for row in csv.DictReader(handle) } - assert defaults["application"] == ("heat", "1") - assert defaults["P_f"] == ("1", "MW") - assert defaults["n_unit"] == ("0", "1") + assert defaults["application"] == ("electricity", "1") + assert defaults["P_f"] == ("175", "MW") + assert defaults["P_f_L"] == ("3.325", "MW/m") + assert defaults["P_ECH"] == ("0", "MW") + assert defaults["P_ICRH"] == ("0", "MW") + assert defaults["blanket_coolant_material"] == ("40% PbLi", "1") + assert defaults["blanket_thickness"] == ("0.75", "m") + assert defaults["n_unit"] == ("1", "1") assert defaults["HF_magnet_number"] == ("4", "1") assert defaults["LF_magnet_number"] == ("2", "1") @@ -69,8 +74,6 @@ def test_mirror_variables_do_not_keep_blank_legacy_temporaries(cursor): "r_in_cc", "r_in_ep", "r_out", - "r_out_cc", - "r_out_ep", "radial_build", "total", } @@ -203,7 +206,7 @@ def test_mirror_accounts_use_fusion_style_structure(cursor): """, ("OCC",), ) - assert cursor.fetchone()[0] == 1587572359.0 + assert cursor.fetchone()[0] == pytest.approx(1789930928.8581762) def test_mirror_parent_accounts_are_rollups_without_algorithms(cursor): @@ -263,11 +266,11 @@ def test_mirror_reference_power_defaults_are_back_calculated(cursor): ) rows = {name: (value, unit) for name, value, unit in cursor.fetchall()} - assert rows["P_DEC"][0] == pytest.approx(70.0198976448057) - assert rows["P_DECe"][0] == pytest.approx(63.01790788032513) - assert rows["P_egross"][0] == pytest.approx(158.12094932835822) - assert rows["P_enet"][0] == pytest.approx(94.91500463226332) - assert rows["P_th"][0] == pytest.approx(158.50506908190818) + assert rows["P_DEC"][0] == pytest.approx(50.019897669130195) + assert rows["P_DECe"][0] == pytest.approx(45.017907902217175) + assert rows["P_egross"][0] == pytest.approx(140.12094934621945) + assert rows["P_enet"][0] == pytest.approx(104.69278243988899) + assert rows["P_th"][0] == pytest.approx(158.50506907333715) assert {unit for _value, unit in rows.values()} == {"MW"} @@ -308,7 +311,7 @@ def test_mirror_generated_variable_algorithms_are_loaded(cursor): ) rows = cursor.fetchall() assert rows[0][0] == "P_DEC" - assert rows[0][1] == pytest.approx(70.0198976448057) + assert rows[0][1] == pytest.approx(50.019897669130195) assert rows[0][2:] == ("MW", "P_DECe") assert rows[1] == ("eta_DEC", 0.9, "1", "P_DECe") @@ -411,7 +414,7 @@ def test_mirror_vacuum_pump_account_uses_deeper_variables(cursor): ) assert rows["no_vpumps"] == ( "Number of vacuum pumps required to pump the full vacuum in one second", - pytest.approx(9.42477796076938 / (200 / 48)), + pytest.approx(176.02367259061006 / (200 / 48)), "1", "cal_no_vpumps", "V_vac, vpump_cap", @@ -444,8 +447,8 @@ def test_mirror_vacuum_pump_account_uses_deeper_variables(cursor): variables="no_vpumps,cost_pump", constants="", ) - assert alg.run({"no_vpumps": 2.2619467105846507, "cost_pump": 40000}) == pytest.approx( - 0.09047786842338603 + assert alg.run({"no_vpumps": 42.24568142174641, "cost_pump": 40000}) == pytest.approx( + 1.6898272568698564 ) @@ -529,7 +532,7 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): """ SELECT var_name, var_description, var_value, var_unit, var_alg, var_need, v_linked FROM mirror_var - WHERE var_name IN (?, ?, ?, ?, ?, ?, ?) + WHERE var_name IN (?, ?, ?, ?, ?, ?, ?, ?) ORDER BY var_name; """, ( @@ -540,6 +543,7 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): "LF_magnet_cost", "LF_magnet_number", "n_unit", + "sc_mat_scale", ), ) rows = {row[0]: row[1:] for row in cursor.fetchall()} @@ -549,7 +553,7 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): 29.1, "million", "cal_HF_magnet_cost", - "n_unit, HF_magnet_number", + "n_unit, HF_magnet_number, sc_mat_scale", "", ) assert rows["LF_magnet_cost"] == ( @@ -557,7 +561,7 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): 6.25262, "million", "cal_LF_magnet_cost", - "n_unit, LF_magnet_number", + "n_unit, LF_magnet_number, sc_mat_scale", "", ) assert rows["CF_magnet_cost"] == ( @@ -565,9 +569,17 @@ def test_mirror_magnet_accounts_use_explicit_cost_variables(cursor): 2.751, "million", "cal_CF_magnet_cost", - "n_unit, CF_magnet_number", + "n_unit, CF_magnet_number, sc_mat_scale", "", ) + assert rows["sc_mat_scale"] == ( + "Superconductor material cost scaling factor", + 1.0, + "1", + "", + "", + "CF_magnet_cost, HF_magnet_cost, LF_magnet_cost", + ) assert rows["HF_magnet_number"][5] == "HF_magnet_cost" assert rows["LF_magnet_number"][5] == "LF_magnet_cost" assert rows["CF_magnet_number"][5] == "CF_magnet_cost" @@ -596,7 +608,7 @@ def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor) ("2211",), ) total_cost, alg_name, variables = cursor.fetchone() - assert total_cost / 1e6 == pytest.approx(0.5110835873559177) + assert total_cost / 1e6 == pytest.approx(446.188406030979) assert alg_name == "Account_C22_1_1" assert variables == ( "central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result" @@ -619,13 +631,13 @@ def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor) ), ) rows = {row[0]: row[1:] for row in cursor.fetchall()} - assert rows["central_cell_cylindrical_part_cost"][0] == pytest.approx(-0.5031620991790029) + assert rows["central_cell_cylindrical_part_cost"][0] == pytest.approx(429.6644799660716) assert rows["central_cell_cylindrical_part_cost"][1:] == ( "million", "cal_central_cell_cylindrical_part_cost", "L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi", ) - assert rows["end_plug_cylindrical_part_cost"][0] == pytest.approx(0.5031620991790029) + assert rows["end_plug_cylindrical_part_cost"][0] == pytest.approx(8.258002288365251) assert rows["end_plug_cylindrical_part_cost"][1:] == ( "million", "cal_end_plug_cylindrical_part_cost", @@ -637,11 +649,11 @@ def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor) "cal_expander_cell_cost_result", "L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m", ) - assert rows["P_Li"][0] == pytest.approx(15.152) + assert rows["P_Li"][0] == pytest.approx(912.8441379310344) assert rows["P_Li"][1:] == ("dollar/kg", "cal_P_Li", "f_6Li") - assert rows["P_PbLi"][0] == pytest.approx(4.56784) + assert rows["P_PbLi"][0] == pytest.approx(157.17550344827586) assert rows["P_PbLi"][1:] == ("dollar/kg", "cal_P_PbLi", "Pb_c_raw, P_Li, f_Li") - assert rows["rho_PbLi"][0] == pytest.approx(9838.0091935) + assert rows["rho_PbLi"][0] == pytest.approx(9374.559280436162) assert rows["rho_PbLi"][1:] == ("kg/m3", "cal_rho_PbLi", "T, f_6Li") cursor.execute( @@ -676,11 +688,11 @@ def test_mirror_first_wall_and_blanket_use_legacy_scalar_super_variables(cursor) ) assert alg.run( { - "central_cell_cylindrical_part_cost": -0.5031620991790029, - "end_plug_cylindrical_part_cost": 0.5031620991790029, + "central_cell_cylindrical_part_cost": 429.6644799660716, + "end_plug_cylindrical_part_cost": 8.258002288365251, "expander_cell_cost_result": 0.003960744088457411, } - ) == pytest.approx(0.5110835873559177) + ) == pytest.approx(446.188406030979) def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): @@ -693,7 +705,7 @@ def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): ("2212",), ) total_cost, variables = cursor.fetchone() - assert total_cost / 1e6 == pytest.approx(70.016988373184) + assert total_cost / 1e6 == pytest.approx(41.34793800403872) assert variables == "HF_magnet_shield_cost" cursor.execute( @@ -707,11 +719,11 @@ def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): ) rows = {row[0]: row[1:] for row in cursor.fetchall()} assert rows["HF_magnet_shield_cost"][0] == "HF magnet shield cost per end plug" - assert rows["HF_magnet_shield_cost"][1] == pytest.approx(35.008494186592) + assert rows["HF_magnet_shield_cost"][1] == pytest.approx(20.67396900201936) assert rows["HF_magnet_shield_cost"][2:] == ( "million", "cal_HF_magnet_shield_cost", - "a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m", + "a_M, a_CC_shield, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, r_out_cc, r_out_ep, W_rho, W_c_raw, W_m", ) assert rows["expander_cell_cost_result"][0] == "Expander cell vacuum vessel cost from legacy Mirror geometry" assert rows["expander_cell_cost_result"][1] == pytest.approx(0.003960744088457411) @@ -731,7 +743,7 @@ def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): variables="HF_magnet_shield_cost", constants="", ) - assert alg.run({"HF_magnet_shield_cost": 35.008494186592}) == pytest.approx(70.016988373184) + assert alg.run({"HF_magnet_shield_cost": 20.67396900201936}) == pytest.approx(41.34793800403872) accert = Accert.__new__(Accert) accert.var_tabl = "mirror_var" diff --git a/tutorial/accert/Mirror.son b/tutorial/accert/Mirror.son index 627db26..31095db 100644 --- a/tutorial/accert/Mirror.son +++ b/tutorial/accert/Mirror.son @@ -5,5 +5,4 @@ accert{ ref_model = "mirror" - var("r_magnet"){value = 2.0 unit = "m"} } diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index e30d482..613bb06 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -90,16 +90,16 @@ def cal_cost_factor(n_unit): return 0.80 ** (np.log(n_unit) / np.log(2)) @staticmethod - def cal_HF_magnet_cost(n_unit, HF_magnet_number): - return MirrorFunc.HF_magnet_cost(n_unit, HF_magnet_number) + def cal_HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale): + return MirrorFunc.HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale) @staticmethod - def cal_LF_magnet_cost(n_unit, LF_magnet_number): - return MirrorFunc.LF_magnet_cost(n_unit, LF_magnet_number) + def cal_LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale): + return MirrorFunc.LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale) @staticmethod - def cal_CF_magnet_cost(n_unit, CF_magnet_number): - return MirrorFunc.CF_magnet_cost(n_unit, CF_magnet_number) + def cal_CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale): + return MirrorFunc.CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale) @staticmethod def cal_P_alpha(E_DT, E_alpha, P_f): @@ -193,12 +193,11 @@ def cal_rho_PbLi(T, f_6Li): @staticmethod def cal_P_Li(f_6Li): if f_6Li == 0.075: - return 15.152 - if f_6Li >= 0.90: - points = [(0.90, 1), (0.99, 2), (0.999, 4), (0.9999, 8), (0.99999, 16)] - for (x0, y0), (x1, y1) in zip(points, points[1:]): - if x0 <= f_6Li <= x1: - return (y0 + (y1 - y0) * (f_6Li - x0) / (x1 - x0)) * 70 + return 29.53 + if 0.075 <= f_6Li <= 0.975: + enrichments = [0.075, 0.80, 0.90, 0.95, 0.975] + prices = [29.53, 2000.0, 4000.0, 8000.0, 16000.0] + return float(np.interp(f_6Li, enrichments, prices)) raise ValueError("Lithium pricing at this enrichment level is not supported") @staticmethod @@ -369,7 +368,7 @@ def cal_expander_cell_cost_result( @staticmethod def cal_HF_magnet_shield_cost( a_M, - a_CC, + a_CC_shield, a_0, length, r_gap, @@ -379,6 +378,8 @@ def cal_HF_magnet_shield_cost( f_vol, length_cc_cylinder, length_ep_cylinder, + r_out_cc, + r_out_ep, W_rho, W_c_raw, W_m, @@ -387,13 +388,11 @@ def cal_HF_magnet_shield_cost( r_out = r_magnet - r_cryostat v_inner = np.pi * length * (r_out**2 - r_in**2) * f_vol - r_in_cc = a_CC + r_gap + r_vv - r_out_cc = r_in_cc + 0.5 + r_in_cc = a_CC_shield + r_gap + r_vv v_cc_cylinder = np.pi * length_cc_cylinder * (r_out_cc**2 - r_in_cc**2) * f_vol v_cc_triangle = np.pi * length_cc_cylinder / 3 * (r_in_cc - r_in) * (r_in + 2 * r_in_cc) * f_vol r_in_ep = a_0 + r_gap + r_vv - r_out_ep = r_in_ep + 0.5 v_ep_cylinder = np.pi * length_ep_cylinder * (r_out_ep**2 - r_in_ep**2) * f_vol v_ep_triangle = np.pi * length_ep_cylinder / 3 * (r_in_ep - r_in) * (r_in + 2 * r_in_ep) * f_vol @@ -644,6 +643,11 @@ def Account_C22_2_3(): # Tertiary Coolant return(0) + @staticmethod + def Account_C22_2(N_module, P_egross, P_th): + # Main and Secondary Coolant + return 166 * (N_module * P_egross / 1000) + 40.6 * (P_th / 3500) ** 0.55 + @staticmethod def Account_C22_3(N_module, P_th): # Auxiliary Cooling Systems @@ -723,6 +727,86 @@ def Account_C28(): # Digital Twin return(5) + @staticmethod + def Account_C31(P_enet, construction_time): + # Field Indirect Costs + if P_enet > 0: + return (max(P_enet / 150, 0)) ** -0.5 * P_enet * 0.02 * construction_time + return 0 + + @staticmethod + def Account_C32(P_enet, construction_time): + # Construction Supervision + if P_enet > 0: + return (P_enet / 150) ** -0.5 * P_enet * 0.05 * construction_time + return 0 + + @staticmethod + def Account_C35(P_enet, construction_time, n_unit): + # Design Services Offsite + if P_enet > 0: + cost_factor = 0.70 ** (np.log(n_unit) / np.log(2)) + return (P_enet / 150) ** -0.5 * P_enet * 0.03 * construction_time * cost_factor + return 0 + + @staticmethod + def Account_C51(): + # Shipping and Transportation Costs + return 8 + + @staticmethod + def Account_C52(N_module, P_egross, P_enet): + # Spare Parts + return 0.1 * ( + MirrorFunc.Account_C23(N_module, P_egross) + + MirrorFunc.Account_C24(N_module, P_egross) + + MirrorFunc.Account_C25(N_module, P_egross) + + MirrorFunc.Account_C26(N_module, P_enet) + + MirrorFunc.Account_C27() + + MirrorFunc.Account_C28() + ) + + @staticmethod + def Account_C53(include_tax): + # Taxes + return 100 if bool(include_tax) else 0 + + @staticmethod + def Account_C54(): + # Insurance + return 1 + + @staticmethod + def Account_C55(P_enet): + # Initial Fuel Load + return P_enet / 150 * 34 + + @staticmethod + def Account_C58(include_decommissioning): + # Decommissioning Costs + return 200 if bool(include_decommissioning) else 0 + + @staticmethod + def Account_C61(N_module, P_f, NOAK): + # Escalation + learning_credit = 0.0 if bool(NOAK) else 1.0 + return N_module * P_f / 1000 * 115 * learning_credit + + @staticmethod + def Account_C62(): + # Fees + return 0 + + @staticmethod + def Account_C69(include_contingency, NOAK): + # Contingency on Capitalized Financial Costs + return 0 + + @staticmethod + def Account_OM(P_enet): + # Annualized O&M Cost + return 60 * P_enet * 1000 / 1e6 + ### MNyberg's Magnet Methods ### # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 @@ -811,33 +895,32 @@ def HTS_storedEnergy(field, inner_rad, HTS_temp=20): @staticmethod - def HF_magnet_cost(n_unit, HF_magnet_number, HF_field=25.0, inner_rad=50): + def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): # This is the HF cost per magnet [MUSD], not for all four - # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit - cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) + cost = 29.10 cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) - return(cost * cost_factor) + return(cost * cost_factor * sc_mat_scale) @staticmethod - def LF_magnet_cost(n_unit, LF_magnet_number, LF_field=10.0, inner_rad=50): + def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): # This is the LF cost per magnet [MUSD] - cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) + cost = 6.25262 cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) - return(cost * cost_factor) + return(cost * cost_factor * sc_mat_scale) @staticmethod - def CF_magnet_cost(n_unit, CF_magnet_number, CF_field=3.0): + def CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale=1.0): # This is the CF cost per magnet [MUSD] convert_to_currentDollar = 1.31 - cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS + cost = 0.7*3.0*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS cost_factor = (0.70)**(np.log((n_unit - 1) * CF_magnet_number + 1)/np.log(2)) - return(cost * cost_factor) + return(cost * cost_factor * sc_mat_scale) diff --git a/tutorial/accert/ref_tables/mirror_account.csv b/tutorial/accert/ref_tables/mirror_account.csv index abd3ab3..a134221 100644 --- a/tutorial/accert/ref_tables/mirror_account.csv +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -1,5 +1,5 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_status,prn,alg_name,fun_unit,variables -1,10,Pre-Construction_Costs,24186117.540000003,0,,Unchanged,0.0046878318104200244,,million, +1,10,Pre-Construction_Costs,24186117.54,0,,Unchanged,0.0046878318104200244,,million, 2,11,Land_and_Land_Rights,1186117.5399999998,1,1,Unchanged,0.00022989715177366762,,million, 3,12,Site_Permits,10000000.0,1,1,Unchanged,0.0019382324602810245,,million, 4,13,Plant_Licensing,0.0,1,1,Unchanged,0.0,,million, @@ -8,85 +8,85 @@ ind,code_of_account,account_description,total_cost,level,supaccount,review_statu 7,16,Plant_Reports,2000000.0,1,1,Unchanged,0.00038764649205620487,,million, 8,17,Other_Pre-Construction_Costs,1000000.0,1,1,Unchanged,0.00019382324602810244,,million, 9,19,Contingency_on_Pre-Construction_Costs,0.0,1,1,Unchanged,0.0,,million, -10,20,Capitalized_Direct_Costs_(CDC),1298175963.0,0,,Unchanged,0.2516166790643178,,million,rollup -11,21,Structures_and_Improvements,112945794.1,1,20,Unchanged,0.021891520437683703,,million,rollup -12,211,Site_Preparation/Yard_Work,42376414.42,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross -13,212,Heat_Island_Building,29536993.34,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross -14,213,Turbine_Generator_Building,8538531.264999999,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" -15,214,Heat_Exchanger_Building,5976971.885,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross -16,215,Power_Supply_and_Energy_Storage,1707706.253,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross -17,216,Reactor_Auxiliaries,853853.1265,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross -18,217,Hot_Cell,14768496.67,2,21,Unchanged,0.0028624779635346214,Account_C21_7,million,P_egross -19,218,Reactor_Services,2956861.753,2,21,Unchanged,0.0005731085430228053,Account_C21_8,million,P_egross -20,219,Service_Water,47436.2848,2,21,Unchanged,9.194254699449537e-06,Account_C21_9,million,P_egross -21,2110,Fuel_Storage,173933.0443,2,21,Unchanged,3.3712267237775744e-05,Account_C21_10,million,P_egross -22,2111,Control_Room,142308.85439999998,2,21,Unchanged,2.7582764098348607e-05,Account_C21_11,million,P_egross -23,2112,Onsite_AC_Power,126496.7595,2,21,Unchanged,2.4518012538326203e-05,Account_C21_12,million,P_egross -24,2113,Administration,695732.1771,2,21,Unchanged,0.00013484906893172064,Account_C21_13,million,P_egross -25,2114,Site_Services,252993.519,2,21,Unchanged,4.903602507665241e-05,Account_C21_14,million,P_egross -26,2115,Cryogenics,379490.2784,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross -27,2116,Security,142308.85439999998,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross -28,2117,Ventilation_Stack,4269265.632,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross -29,22,Heat_Island_Plant_Equipment,1111998920.0,1,20,Unchanged,0.21553124025414422,,million,rollup -30,221,Heat_Island_Components,901967566.8,2,22,Unchanged,0.17482228160924532,,million,rollup -31,2211,First_Wall_and_Blanket,511083.5873559177,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result" -32,2212,Magnet_Radiation_Shield,70016988.37318401,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost -33,2213,Coils,272039976.79999995,3,221,Unchanged,0.05272767135278568,,million,rollup +10,20,Capitalized_Direct_Costs_(CDC),1474130012.2589958,0,,Unchanged,0.2516166790643178,,million,rollup +11,21,Structures_and_Improvements,100088394.11800456,1,20,Unchanged,0.021891520437683703,,million,rollup +12,211,Site_Preparation/Yard_Work,37552414.42478681,2,21,Unchanged,0.008213534197916489,Account_C21_1,million,P_egross +13,212,Heat_Island_Building,26174593.337873794,2,21,Unchanged,0.005724955927069243,Account_C21_2,million,P_egross +14,213,Turbine_Generator_Building,7566531.26469585,2,21,Unchanged,0.0016549658460947396,Account_C21_3,million,"application, P_egross" +15,214,Heat_Exchanger_Building,5296571.885287096,2,21,Unchanged,0.0011584760921694063,Account_C21_4,million,P_egross +16,215,Power_Supply_and_Energy_Storage,1513306.25293917,2,21,Unchanged,0.00033099316921894796,Account_C21_5,million,P_egross +17,216,Reactor_Auxiliaries,756653.126469585,2,21,Unchanged,0.00016549658460947398,Account_C21_6,million,P_egross +18,217,Hot_Cell,13087296.668936897,2,21,Unchanged,0.0028624779635346214,Account_C21_7,million,P_egross +19,218,Reactor_Services,2620261.7527743033,2,21,Unchanged,0.0005731085430228053,Account_C21_8,million,P_egross +20,219,Service_Water,42036.28480386583,2,21,Unchanged,9.194254699449537e-06,Account_C21_9,million,P_egross +21,2110,Fuel_Storage,154133.0442808414,2,21,Unchanged,3.3712267237775744e-05,Account_C21_10,million,P_egross +22,2111,Control_Room,126108.8544115975,2,21,Unchanged,2.7582764098348607e-05,Account_C21_11,million,P_egross +23,2112,Onsite_AC_Power,112096.75947697557,2,21,Unchanged,2.4518012538326203e-05,Account_C21_12,million,P_egross +24,2113,Administration,616532.1771233656,2,21,Unchanged,0.00013484906893172064,Account_C21_13,million,P_egross +25,2114,Site_Services,224193.51895395113,2,21,Unchanged,4.903602507665241e-05,Account_C21_14,million,P_egross +26,2115,Cryogenics,336290.2784309266,2,21,Unchanged,7.35540375955963e-05,Account_C21_15,million,P_egross +27,2116,Security,126108.8544115975,2,21,Unchanged,2.7582764098348607e-05,Account_C21_16,million,P_egross +28,2117,Ventilation_Stack,3783265.632347925,2,21,Unchanged,0.0008274829229504582,Account_C21_17,million,P_egross +29,22,Heat_Island_Plant_Equipment,1306044913.7280874,1,20,Unchanged,0.21553124025414422,,million,rollup +30,221,Heat_Island_Components,1098858920.9198713,2,22,Unchanged,0.17482228160924532,,million,rollup +31,2211,First_Wall_and_Blanket,446188406.03097904,3,221,Unchanged,0.008371891625683487,Account_C22_1_1,million,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result" +32,2212,Magnet_Radiation_Shield,41347938.004038714,3,221,Unchanged,0.01836222428034747,Account_C22_1_2,million,HF_magnet_shield_cost +33,2213,Coils,272039976.84210527,3,221,Unchanged,0.05272767135278568,,million,rollup 34,22131,HF_Coils,116400000.0,4,2213,Unchanged,0.022561025837671125,Account_C22_1_3_1,million,"HF_magnet_number, HF_magnet_cost" 35,22132,LF_Coils,12505240.0,4,2213,Unchanged,0.0024238062091604677,Account_C22_1_3_2,million,"LF_magnet_number, LF_magnet_cost" -36,22133,CC_Coils,143134736.8,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,"CF_magnet_number, CF_magnet_cost" -37,2214,Supplemental_Heating,227453000.0,3,221,Unchanged,0.04408567877882998,,million,rollup +36,22133,CC_Coils,143134736.84210524,4,2213,Unchanged,0.02774283930595409,Account_C22_1_3_3,million,"CF_magnet_number, CF_magnet_cost" +37,2214,Supplemental_Heating,105963000.0,3,221,Unchanged,0.04408567877882998,,million,rollup 38,22141,NBI,105963000.0,4,2214,Unchanged,0.02053809261887582,Account_C22_1_4_1,million,"P_NBI, cost_factor" -39,22142,ICRH,41490000.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, cost_factor" -40,22143,ECH,80000000.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, cost_factor" +39,22142,ICRH,0.0,4,2214,Unchanged,0.008041726477705971,Account_C22_1_4_2,million,"P_ICRH, cost_factor" +40,22143,ECH,0.0,4,2214,Unchanged,0.015505859682248196,Account_C22_1_4_3,million,"P_ECH, cost_factor" 41,2215,Primary_Structure_and_Support,0.0,3,221,Unchanged,0.0,Account_C22_1_5,million, -42,2216,Vacuum_System,2031827.2570000002,3,221,Unchanged,0.00039381535432011556,,million,rollup +42,2216,Vacuum_System,2031827.2568698565,3,221,Unchanged,0.00039381535432011556,,million,rollup 43,22162,Vessel_Refrigerators,0.0,4,2216,Unchanged,0.0,Account_C22_1_6_2,million, -44,22163,Primary_Vacuum_Pumps,1689827.257,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,"no_vpumps, cost_pump" +44,22163,Primary_Vacuum_Pumps,1689827.2568698565,4,2216,Unchanged,0.0003275278041785045,Account_C22_1_6_3,million,"no_vpumps, cost_pump" 45,22164,Backing_Vacuum_Pumps,342000.0,4,2216,Unchanged,6.628755014161104e-05,Account_C22_1_6_4,million, 46,2217,Power_Supplies,0.0,3,221,Unchanged,0.0,Account_C22_1_7,million, 47,2218,Divertor,0.0,3,221,Unchanged,0.0,Account_C22_1_8,million, -48,2219,Direct_Energy_Convertor,109317164.8,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, cost_factor" -49,22111,Assembly_and_Installation_Costs,153195207.9,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, cost_factor" -50,222,Main_and_Secondary_Coolant,33649451.5,2,22,Unchanged,0.0065220459167952,,million, -51,223,Auxiliary_Cooling_Systems,352198.2635,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" -52,224,Radioactive_Waste_Treatment,627553.2695,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th -53,225,Fuel_Handling_and_Storage,88654052.28999999,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,cost_factor -54,226,Other_Heat_Island_Equipment,1748097.852,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet +48,2219,Direct_Energy_Convertor,78092564.83797613,3,221,Unchanged,0.02118820772812502,Account_C22_1_9,million,"P_DECe, cost_factor" +49,22111,Assembly_and_Installation_Costs,153195207.9479024,3,221,Unchanged,0.029692792471128007,Account_C22_1_11,million,"L, N_module, construction_time, cost_factor" +50,222,Main_and_Secondary_Coolant,30661451.50067612,2,22,Unchanged,0.0065220459167952,Account_C22_2,million,"N_module, P_egross, P_th" +51,223,Auxiliary_Cooling_Systems,352198.26348095515,2,22,Unchanged,6.826421067703095e-05,Account_C22_3,million,"N_module, P_th" +52,224,Radioactive_Waste_Treatment,627553.2694751564,2,22,Unchanged,0.00012163441175003857,Account_C22_4,million,P_th +53,225,Fuel_Handling_and_Storage,88654052.29068641,2,22,Unchanged,0.017183216188392927,Account_C22_5,million,cost_factor +54,226,Other_Heat_Island_Equipment,1890737.4838973947,2,22,Unchanged,0.0003388220000493934,Account_C22_6,million,P_enet 55,227,Instrumentation_and_Control,85000000.0,2,22,Unchanged,0.01647497591238871,Account_C22_7,million, -56,23,Turbine_Plant_Equipment,39822761.09,1,20,Unchanged,0.007718576820265415,Account_C23,million,"N_module, P_egross" -57,24,Electric_Plant_Equipment,9819310.954,1,20,Unchanged,0.0019032107228635835,Account_C24,million,"N_module, P_egross" -58,25,Miscellaneous_Plant_Equipment,6909885.4860000005,1,20,Unchanged,0.0013392964345789922,Account_C25,million,"N_module, P_egross" -59,26,Heat_Rejection,11679291.32,1,20,Unchanged,0.0022637181549502415,Account_C26,million,"N_module, P_enet" +56,23,Turbine_Plant_Equipment,35289461.092845365,1,20,Unchanged,0.007718576820265415,Account_C23,million,"N_module, P_egross" +57,24,Electric_Plant_Equipment,8701510.954400226,1,20,Unchanged,0.0019032107228635835,Account_C24,million,"N_module, P_egross" +58,25,Miscellaneous_Plant_Equipment,6123285.486429789,1,20,Unchanged,0.0013392964345789922,Account_C25,million,"N_module, P_egross" +59,26,Heat_Rejection,12882446.879228339,1,20,Unchanged,0.0022637181549502415,Account_C26,million,"N_module, P_enet" 60,27,Special_Materials,0.0,1,20,Unchanged,0.0,Account_C27,million, 61,28,Digital_Twin/Simulator,5000000.0,1,20,Unchanged,0.0009691162301405122,Account_C28,million, 62,29,Contingency_on_Direct_Capital_Costs,0.0,1,20,Unchanged,0.0,,million, -63,30,Capitalized_Indirect_Service_Costs_(CISC),71591970.58,0,,Unchanged,0.013876188127364011,,million, -64,31,Field_Indirect_Costs,14318394.120000001,1,3,Unchanged,0.0027752376262480953,,million, -65,32,Construction_Supervision,35795985.29,1,3,Unchanged,0.0069380940636820055,,million, +63,30,Capitalized_Indirect_Service_Costs_(CISC),75189163.12710233,0,,Unchanged,0.013876188127364011,,million, +64,31,Field_Indirect_Costs,15037832.625420468,1,3,Unchanged,0.0027752376262480953,Account_C31,million,"P_enet, construction_time" +65,32,Construction_Supervision,37594581.563551165,1,3,Unchanged,0.0069380940636820055,Account_C32,million,"P_enet, construction_time" 66,33,Commissioning_and_Start-Up_Costs,0.0,1,3,Unchanged,0.0,,million, 67,34,Demonstration_Test_Run,0.0,1,3,Unchanged,0.0,,million, -68,35,Design_Services_Offsite,21477591.17,1,3,Unchanged,0.004162856437433911,,million, +68,35,Design_Services_Offsite,22556748.9381307,1,3,Unchanged,0.004162856437433911,Account_C35,million,"P_enet, construction_time, n_unit" 69,36,PM/CM_Services_Offsite,0.0,1,3,Unchanged,0.0,,million, 70,37,Design_Servies_Offsite,0.0,1,3,Unchanged,0.0,,million, 71,38,PM/CM_Services_Onsite,0.0,1,3,Unchanged,0.0,,million, 72,39,Contingency_on_Support_Services,0.0,1,3,Unchanged,0.0,,million, -73,40,Capitalized_Owner's_Cost_(COC),155781115.6,0,,Unchanged,0.030194001495471065,,million, -74,50,Capitalized_Supplementary_Costs_(CSC),37837192.61,0,,Unchanged,0.00733372749226073,,million, -75,51,Shipping_and_Transportation_Costs,8000000.0,1,5,Unchanged,0.0015505859682248195,,million, -76,52,Spare_Parts,7323124.886,1,5,Unchanged,0.0014193918364736975,,million, -77,53,Taxes,0.0,1,5,Unchanged,0.0,,million, -78,54,Insurance,1000000.0,1,5,Unchanged,0.00019382324602810244,,million, -79,55,Initial_Fuel_Load,21514067.72,1,5,Unchanged,0.004169926440758817,,million, -80,58,Decommissioning_Costs,0.0,1,5,Unchanged,0.0,,million, +73,40,Capitalized_Owner's_Cost_(COC),176895601.4710795,0,,Unchanged,0.030194001495471065,,million, +74,50,Capitalized_Supplementary_Costs_(CSC),39530034.46099854,0,,Unchanged,0.00733372749226073,,million, +75,51,Shipping_and_Transportation_Costs,8000000.0,1,5,Unchanged,0.0015505859682248195,Account_C51,million, +76,52,Spare_Parts,6799670.441290373,1,5,Unchanged,0.0014193918364736975,,million,rollup +77,53,Taxes,0.0,1,5,Unchanged,0.0,Account_C53,million,include_tax +78,54,Insurance,1000000.0,1,5,Unchanged,0.00019382324602810244,Account_C54,million, +79,55,Initial_Fuel_Load,23730364.019708168,1,5,Unchanged,0.004169926440758817,Account_C55,million,P_enet +80,58,Decommissioning_Costs,0.0,1,5,Unchanged,0.0,Account_C58,million,include_decommissioning 81,59,Contingency_on_Supplementary_Costs,0.0,1,5,Unchanged,0.0,,million, -82,60,Capitalized_Financial_Costs_(CFC),195409441.20000002,0,,Unchanged,0.03787489219792162,,million, -83,61,Escalation,20125000.0,1,6,Unchanged,0.003900692826315562,,million, -84,62,Fees,0.0,1,6,Unchanged,0.0,,million, -85,63,Interest_During_Construction_(IDC),175284441.20000002,1,6,Unchanged,0.033974199371606055,,million, -86,69,Contingency_on_Capitalized_Financial_Costs,0.0,1,6,Unchanged,0.0,,million, -87,OCC,Overnight_Capital_Cost_(OCC),1587572359.0,0,,Unchanged,0.307708427925872,,million, -88,TCC,Total_Capital_Cost_(TCC),1782981801.0,0,,Unchanged,0.3455833202788522,,million, -89,O&M,Operations_and_Maintenance,5694900.279999999,0,,Unchanged,0.0011038040580759493,,million, +82,60,Capitalized_Financial_Costs_(CFC),217751924.44411266,0,,Unchanged,0.03787489219792162,,million, +83,61,Escalation,20125000.0,1,6,Unchanged,0.003900692826315562,Account_C61,million,"N_module, P_f, NOAK" +84,62,Fees,0.0,1,6,Unchanged,0.0,Account_C62,million, +85,63,Interest_During_Construction_(IDC),197626924.44411266,1,6,Unchanged,0.033974199371606055,,million, +86,69,Contingency_on_Capitalized_Financial_Costs,0.0,1,6,Unchanged,0.0,Account_C69,million,"include_contingency, NOAK" +87,OCC,Overnight_Capital_Cost_(OCC),1789930928.8581762,0,,Unchanged,0.307708427925872,,million, +88,TCC,Total_Capital_Cost_(TCC),2007682853.302289,0,,Unchanged,0.3455833202788522,,million, +89,O&M,Operations_and_Maintenance,6281566.946393339,0,,Unchanged,0.0011038040580759493,Account_OM,million,P_enet 90,Fuel,Fuel,109004.2081,0,,Unchanged,2.1127549444664777e-05,,million, 91,81,Deuterium,47391.176569999996,1,8,Unchanged,9.185511675888353e-06,,million, diff --git a/tutorial/accert/ref_tables/mirror_algorithm.csv b/tutorial/accert/ref_tables/mirror_algorithm.csv index b100f82..f8ea9fd 100644 --- a/tutorial/accert/ref_tables/mirror_algorithm.csv +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -32,6 +32,7 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 42,Account_C22_1_8,c,Account C2218 Rollup,MirrorFunc,reference value,million 43,Account_C22_1_9,c,Account C2219 Rollup,MirrorFunc,"P_DECe, cost_factor",million 44,Account_C22_1_11,c,Account C22111 Rollup,MirrorFunc,"L, N_module, construction_time, cost_factor",million +45,Account_C22_2,c,Account C222 Rollup,MirrorFunc,"N_module, P_egross, P_th",million 49,Account_C22_3,c,Account C223 Rollup,MirrorFunc,"N_module, P_th",million 50,Account_C22_4,c,Account C224 Rollup,MirrorFunc,P_th,million 51,Account_C22_5,c,Account C225 Rollup,MirrorFunc,cost_factor,million @@ -50,9 +51,9 @@ ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units 85,cal_V_vac,v,Mirror generated variable calculation for V_vac,MirrorFunc,V_vac = L * pi * a_EC**2,m3 86,cal_no_vpumps,v,Mirror generated variable calculation for no_vpumps,MirrorFunc,no_vpumps = V_vac / vpump_cap,1 87,cal_cost_factor,v,Mirror generated variable calculation for cost_factor,MirrorFunc,cost_factor = 0.80 ** (log(n_unit) / log(2)),1 -88,cal_HF_magnet_cost,v,Mirror generated variable calculation for HF_magnet_cost,MirrorFunc,"HF_magnet_cost = HTS_storedEnergy(25.0, 50) * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2))",million -89,cal_LF_magnet_cost,v,Mirror generated variable calculation for LF_magnet_cost,MirrorFunc,"LF_magnet_cost = HTS_storedEnergy(10.0, 50) * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2))",million -90,cal_CF_magnet_cost,v,Mirror generated variable calculation for CF_magnet_cost,MirrorFunc,CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2)),million +88,cal_HF_magnet_cost,v,Mirror generated variable calculation for HF_magnet_cost,MirrorFunc,HF_magnet_cost = 29.10 * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2)) * sc_mat_scale,million +89,cal_LF_magnet_cost,v,Mirror generated variable calculation for LF_magnet_cost,MirrorFunc,LF_magnet_cost = 6.25262 * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2)) * sc_mat_scale,million +90,cal_CF_magnet_cost,v,Mirror generated variable calculation for CF_magnet_cost,MirrorFunc,CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2)) * sc_mat_scale,million 91,cal_P_alpha,v,Mirror generated variable calculation for P_alpha,MirrorFunc,P_alpha = P_f * E_alpha / E_DT,MW 92,cal_P_n,v,Mirror generated variable calculation for P_n,MirrorFunc,P_n = P_f - P_alpha,MW 93,cal_P_ine,v,Mirror generated variable calculation for P_ine,MirrorFunc,P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH,MW diff --git a/tutorial/accert/ref_tables/mirror_default_inputs.csv b/tutorial/accert/ref_tables/mirror_default_inputs.csv index d01d78c..a45aa57 100644 --- a/tutorial/accert/ref_tables/mirror_default_inputs.csv +++ b/tutorial/accert/ref_tables/mirror_default_inputs.csv @@ -7,15 +7,15 @@ L_EP,1,m M_n,1.1,1 NOAK,0,1 N_module,1,1 -P_ECH,1,MW -P_ICRH,1,MW -P_NBI,1,MW +P_ECH,0,MW +P_ICRH,0,MW +P_NBI,15,MW P_aux,1,MW P_coils,0,MW P_cryo,1,MW -P_f,1,MW +P_f,175,MW P_f_EP,1,MW -P_f_L,1,MW/m +P_f_L,3.325,MW/m P_pfcool,0,MW P_pump,1,MW P_sub_cont,1,MW @@ -23,22 +23,22 @@ P_thcool,0,MW a_CC,1,m a_EC,1,m a_EP,1,m -application,heat,1 +application,electricity,1 availability,0.9,1 -blanket_coolant_fraction,0.9,1 -blanket_coolant_material,Natural PbLi,1 +blanket_coolant_fraction,0.8,1 +blanket_coolant_material,40% PbLi,1 blanket_structural_fraction,0.1,1 blanket_structural_material,SS316,1 -blanket_thickness,1.0,m +blanket_thickness,0.75,m construction_time,6,years -cost_file,woodruff-data.csv,1 -discount,0.0245,1 +cost_file,woodruff-data_edited.csv,1 +discount,0.03,1 eta_DEC,0.9,1 -eta_ECH,0.5,1 -eta_ICRH,0.5,1 -eta_NBI,0.5,1 +eta_ECH,0.6,1 +eta_ICRH,0.9,1 +eta_NBI,0.68,1 eta_pump,0.98,1 -eta_th,0.5,1 +eta_th,0.6,1 expander_cell_vessel_material,SS316,1 expander_cell_vessel_thickness,0.01,m f_cryo,0.01,1 @@ -57,7 +57,7 @@ lifetime,30,years method,new,1 multiplier_material,Pb,1 multiplier_thickness,0.01,m -n_unit,0,1 +n_unit,1,1 outer_vessel_thickness,0.01,m replacement,10,years run_name,,1 diff --git a/tutorial/accert/ref_tables/mirror_variable.csv b/tutorial/accert/ref_tables/mirror_variable.csv index 044a1e4..9940c28 100644 --- a/tutorial/accert/ref_tables/mirror_variable.csv +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -2,180 +2,184 @@ ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_i 1,E_DT,Energy released per deuterium-tritium fusion reaction,2.8182346199999998e-12,J,,,P_alpha,0 2,E_alpha,Alpha-particle energy released per deuterium-tritium fusion reaction,5.6396736e-13,J,,,P_alpha,0 3,expander_cell_cost_result,Expander cell vacuum vessel cost from legacy Mirror geometry,0.003960744088457411,million,cal_expander_cell_cost_result,"L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m",,0 -4,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,0.5031620991790029,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 -5,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,-0.5031620991790029,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 +4,end_plug_cylindrical_part_cost,End plug cylindrical radial-build material cost,8.258002288365251,million,cal_end_plug_cylindrical_part_cost,"L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 +5,central_cell_cylindrical_part_cost,Central cell cylindrical radial-build material cost,429.6644799660716,million,cal_central_cell_cylindrical_part_cost,"L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi",,0 6,cost_factor,Cost scaling factor calculated from the unit number using an 0.80 learning factor,1.0,1,cal_cost_factor,n_unit,,0 7,cost_pump,"Cost of one vacuum pump, scaled from 1985 dollars",40000.0,dollar/pump,,,,0 8,vpump_cap,Vacuum volume pumped by one vacuum pump in one second,4.166666666666667,m3/pump,,,no_vpumps,0 -9,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,2.2619467105846507,1,cal_no_vpumps,"V_vac, vpump_cap",,0 +9,no_vpumps,Number of vacuum pumps required to pump the full vacuum in one second,42.24568142174641,1,cal_no_vpumps,"V_vac, vpump_cap",,0 10,axis_t,PyFECONS radial build axis thickness,0.0,m,,,,0 -11,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9838.0091935,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +11,rho_PbLi,PbLi density from legacy Mirror temperature/enrichment correlation,9374.559280436162,kg/m3,cal_rho_PbLi,"T, f_6Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 12,f_Li,Lithium mass fraction in PbLi eutectic mixture,0.17,1,,,P_PbLi,0 -13,P_Li,Lithium price from legacy Mirror enrichment pricing,15.152,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 -14,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,4.5678399999999995,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li, f_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -15,P_f_CC,Fusion power assigned to the central cell,-1.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 -16,L_CC,Calculated central cell length,-1.0,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 +13,P_Li,Lithium price from legacy Mirror enrichment pricing,912.8441379310344,dollar/kg,cal_P_Li,f_6Li,P_PbLi,0 +14,P_PbLi,PbLi price from legacy Mirror eutectic mixture pricing,157.17550344827586,dollar/kg,cal_P_PbLi,"Pb_c_raw, P_Li, f_Li","central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +15,P_f_CC,Fusion power assigned to the central cell,173.0,MW,cal_P_f_CC,"P_f, P_f_EP",L_CC,0 +16,L_CC,Calculated central cell length,52.03007518796992,m,cal_L_CC,"P_f_CC, P_f_L","CF_magnet_number, L, central_cell_cylindrical_part_cost",0 17,L_CF,Central-field coil spacing,1.0,m,cal_L_CF,,CF_magnet_number,0 -18,L,Overall axial length of the Mirror plant,3.0,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 -19,V_vac,Vacuum volume for the Mirror plant,9.42477796076938,m3,cal_V_vac,"L, a_EC",no_vpumps,0 -20,P_alpha,Fusion alpha-particle power,0.20011370096645825,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 -21,P_n,Fusion neutron power,0.7998862990335418,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 -22,P_ine,Injected-power electrical input requirement,70.0,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 -23,P_pump,Pumping power requirement,0.02639624786810688,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 -24,P_sub_cont,Subsystem control power requirement,0.04,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 -25,P_cryo,Cryogenic power requirement,0.01,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 -26,P_other,Total miscellaneous plant power requirement,0.07639624786810688,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 -27,P_in,Total injected heating power,35.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 -28,P_th,Recoverable thermal power,158.50506908190818,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 -29,P_the,Thermal-electric power contribution,0.45287162592382035,MW,cal_P_the,"eta_th, P_th",P_egross,0 -30,P_DEC,Power available to direct energy conversion,70.0198976448057,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 -31,P_DECe,Electrical output from direct energy conversion,63.01790788032513,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 -32,P_egross,Gross electric power,158.12094932835822,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 -33,P_enet,Net electric power,94.91500463226332,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 -34,f_aux,Auxiliary power fraction relative to gross electric power,0.031565554604461525,1,cal_f_aux,"P_aux, P_egross",,0 -35,Q_sci,Scientific fusion gain,0.02857142857142857,1,cal_Q_sci,"P_f, P_in",,0 -36,Q_eng,Engineering gain,0.45207950218806525,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 -37,f_refrac,Recirculating power fraction,2.2120003122459635,1,cal_f_refrac,Q_eng,,0 +18,L,Overall axial length of the Mirror plant,56.03007518796992,m,cal_L,"L_CC, L_EP, L_EC",V_vac,0 +19,V_vac,Vacuum volume for the Mirror plant,176.02367259061006,m3,cal_V_vac,"L, a_EC",no_vpumps,0 +20,P_alpha,Fusion alpha-particle power,35.019897669130195,MW,cal_P_alpha,"E_DT, E_alpha, P_f","P_DEC, P_n",0 +21,P_n,Fusion neutron power,139.9801023308698,MW,cal_P_n,"P_f, P_alpha","P_pump, P_th",0 +22,P_ine,Injected-power electrical input requirement,22.058823529411764,MW,cal_P_ine,"P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH","P_enet, Q_eng",0 +23,P_pump,Pumping power requirement,4.619343376918704,MW,cal_P_pump,"f_pump, M_n, P_n","P_other, P_th",0 +24,P_sub_cont,Subsystem control power requirement,7.0,MW,cal_P_sub_cont,"f_sub, P_f",P_other,0 +25,P_cryo,Cryogenic power requirement,1.75,MW,cal_P_cryo,"f_cryo, P_f",P_other,0 +26,P_other,Total miscellaneous plant power requirement,13.369343376918703,MW,cal_P_other,"P_pump, P_sub_cont, P_cryo","P_enet, Q_eng",0 +27,P_in,Total injected heating power,15.0,MW,cal_P_in,"P_NBI, P_ICRH, P_ECH","P_DEC, Q_sci",0 +28,P_th,Recoverable thermal power,158.50506907333715,MW,cal_P_th,"M_n, P_n, P_pump, eta_pump",P_the,0 +29,P_the,Thermal-electric power contribution,95.10304144400229,MW,cal_P_the,"eta_th, P_th",P_egross,0 +30,P_DEC,Power available to direct energy conversion,50.019897669130195,MW,cal_P_DEC,"P_in, P_alpha",P_DECe,0 +31,P_DECe,Electrical output from direct energy conversion,45.017907902217175,MW,cal_P_DECe,"eta_DEC, P_DEC",P_egross,0 +32,P_egross,Gross electric power,140.12094934621945,MW,cal_P_egross,"application, P_DECe, P_the","P_enet, Q_eng, f_aux",0 +33,P_enet,Net electric power,104.69278243988899,MW,cal_P_enet,"P_egross, P_ine, P_other",,0 +34,f_aux,Auxiliary power fraction relative to gross electric power,0.007136691584419248,1,cal_f_aux,"P_aux, P_egross",,0 +35,Q_sci,Scientific fusion gain,11.666666666666666,1,cal_Q_sci,"P_f, P_in",,0 +36,Q_eng,Engineering gain,3.955071954941648,1,cal_Q_eng,"P_egross, P_ine, P_other",f_refrac,0 +37,f_refrac,Recirculating power fraction,0.25283990061180917,1,cal_f_refrac,Q_eng,,0 38,T,Mean coolant temperature for legacy PbLi density correlation,300.0,degC,,,rho_PbLi,0 -39,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.075,1,,,"P_Li, rho_PbLi",0 +39,f_6Li,Lithium-6 enrichment fraction for legacy PbLi pricing,0.4,1,,,"P_Li, rho_PbLi",0 40,a_M,HF shield magnet bore/plasma radius from legacy Mirror geometry,0.15,m,,,HF_magnet_shield_cost,0 -41,a_CC,Legacy Mirror central cell plasma radius,0.54,m,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -42,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.7,m,,,HF_magnet_shield_cost,0 -43,length,HF shield radially inner cylinder length,0.5,m,,,HF_magnet_shield_cost,0 +41,a_CC,Legacy Mirror central cell plasma radius,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +42,a_0,HF shield end plug plasma radius from legacy Mirror geometry,0.47,m,,,HF_magnet_shield_cost,0 +43,length,HF shield radially inner cylinder length,1.5,m,,,HF_magnet_shield_cost,0 44,r_gap,HF shield radial gap,0.1,m,,,HF_magnet_shield_cost,0 45,r_vv,HF shield vacuum vessel radial thickness allowance,0.01,m,,,HF_magnet_shield_cost,0 -46,r_magnet,HF shield magnet radius,1.5,m,,,HF_magnet_shield_cost,0 -47,r_cryostat,HF shield cryostat radius allowance,1.0,m,,,HF_magnet_shield_cost,0 +46,r_magnet,HF shield magnet radius,0.5,m,,,HF_magnet_shield_cost,0 +47,r_cryostat,HF shield cryostat radius allowance,0.4,m,,,HF_magnet_shield_cost,0 48,f_vol,HF shield volume fill fraction,0.9,1,,,HF_magnet_shield_cost,0 -49,length_cc_cylinder,HF shield central-cell-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -50,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.5,m,,,HF_magnet_shield_cost,0 -51,application,Mirror plant application mode used for gross-electric-power logic,heat,1,,,P_egross,0 -52,P_f,Total fusion power,1.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 -53,P_f_L,Fusion power per meter of central cell length,1.0,MW/m,,,L_CC,0 -54,P_f_EP,Fusion power assigned to each end plug,1.0,MW,,,P_f_CC,0 -55,P_NBI,Neutral beam injection power,15.0,MW,,,"P_in, P_ine",0 -56,P_ECH,Electron cyclotron heating power,10.0,MW,,,"P_in, P_ine",0 -57,P_ICRH,Ion cyclotron resonance heating power,10.0,MW,,,"P_in, P_ine",0 -58,M_n,Neutron energy multiplication factor,1.1,1,,,"P_pump, P_th",0 -59,N_module,Number of Mirror plant modules,1.0,1,,,,0 -60,f_pump,Fraction of neutron power used for pumping,0.03,1,,,P_pump,0 -61,f_sub,Fraction of fusion power used for subsystem controls,0.04,1,,,P_sub_cont,0 -62,f_cryo,Fraction of fusion power used for cryogenic load,0.01,1,,,P_cryo,0 -63,P_pfcool,Plasma-facing-component cooling power,0.0,MW,,,,0 -64,P_thcool,Thermal-system cooling power,0.0,MW,,,,0 -65,P_coils,Coil power load,0.0,MW,,,,0 -66,P_aux,Auxiliary plant power,1.0,MW,,,f_aux,0 -67,eta_th,Thermal conversion efficiency,0.5,1,,,P_the,0 -68,eta_DEC,Direct energy conversion efficiency,0.9,1,,,P_DECe,0 -69,eta_pump,Pump heat recovery efficiency,0.98,1,,,P_th,0 -70,eta_NBI,Neutral beam injection wall-plug efficiency,0.5,1,,,P_ine,0 -71,eta_ECH,Electron cyclotron heating wall-plug efficiency,0.5,1,,,P_ine,0 -72,eta_ICRH,Ion cyclotron resonance heating wall-plug efficiency,0.5,1,,,P_ine,0 -73,NOAK,Nth-of-a-kind plant flag,0.0,1,,,,0 -74,n_unit,Plant unit number for learning-curve cost scaling,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 -75,construction_time,Construction duration,6.0,years,,,,0 -76,lifetime,Plant operating lifetime,30.0,years,,,,0 -77,replacement,Major component replacement interval,10.0,years,,,,0 -78,availability,Plant availability factor,0.9,1,,,,0 -79,discount,Real discount rate,0.0245,1,,,,0 -80,LSA,Licensing safety analysis level,2.0,1,,,,0 -81,cost_file,PyFECONS cost data file name,woodruff-data.csv,1,,,,0 -82,method,PyFECONS costing method selector,new,1,,,,0 -83,include_decommissioning,Flag to include decommissioning cost,0.0,1,,,,0 -84,include_tax,Flag to include tax cost,0.0,1,,,,0 -85,include_licensing,Flag to include licensing cost,0.0,1,,,,0 -86,include_contingency,Flag to include contingency cost,0.0,1,,,,0 -87,hf_magnet_length,High-field magnet axial length,1.0,m,,,,0 -88,hf_magnet_shielding_thickness,High-field magnet shielding thickness,1.0,m,,,,0 -89,a_EC,Expander cell plasma radius,1.0,m,,,"V_vac, expander_cell_cost_result",0 -90,expander_cell_vessel_thickness,Expander cell vessel wall thickness,0.01,m,,,expander_cell_cost_result,0 -91,expander_cell_vessel_material,Expander cell vessel material,SS316,1,,,,0 -92,vacuum_gap_CC,Central cell radial vacuum gap,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -93,first_wall_material,Central cell first wall material,W,1,,,,0 -94,first_wall_thickness,Central cell first wall thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -95,vacuum_vessel_material,Central cell vacuum vessel material,SS316,1,,,,0 -96,vacuum_vessel_thickness,Central cell vacuum vessel thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -97,multiplier_material,Central cell neutron multiplier material,Pb,1,,,,0 -98,multiplier_thickness,Central cell neutron multiplier thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -99,blanket_coolant_material,Central cell blanket coolant material,Natural PbLi,1,,,,0 -100,blanket_thickness,Central cell blanket radial thickness,1.0,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -101,blanket_coolant_fraction,Central cell blanket coolant volume fraction,0.9,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -102,blanket_structural_material,Central cell blanket structural material,SS316,1,,,,0 -103,blanket_structural_fraction,Central cell blanket structural volume fraction,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -104,outer_vessel_thickness,Central cell outer vessel thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -105,L_EP,End plug axial length,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 -106,L_EC,Expander cell axial length,1.0,m,,,"L, expander_cell_cost_result",0 -107,a_EP,End plug plasma radius,1.0,m,,,,0 -108,HF_magnet_number,Number of high-field magnets,4.0,1,,,HF_magnet_cost,0 -109,LF_magnet_number,Number of low-field magnets,2.0,1,,,LF_magnet_cost,0 -110,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number",,0 -111,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number",,0 -112,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number",,0 -113,CF_magnet_number,One CF coil every L_CF m of central cell,52.0300751726645,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 -114,HF_magnet_shield_cost,HF magnet shield cost per end plug,35.008494186592,million,cal_HF_magnet_shield_cost,"a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m",,0 -115,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 -116,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 -117,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 -118,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 -119,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 -120,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 -121,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 -122,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 -123,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 -124,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 -125,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 -126,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 -127,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 -128,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 -129,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 -130,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 -131,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 -132,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 -133,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -134,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -135,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -136,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 -137,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 -138,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 -139,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 -140,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 -141,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -142,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -143,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 -144,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 -145,Li_c_raw,PyFECONS Lithium raw cost,70.0,dollar/kg,,,,0 -146,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 -147,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 -148,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 -149,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 -150,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 -151,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 -152,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 -153,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 -154,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 -155,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 -156,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 -157,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 -158,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 -159,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 -160,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 -161,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 -162,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 -163,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 -164,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 -165,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 -166,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 -167,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -168,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -169,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 -170,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 -171,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 -172,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 -173,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 -174,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 -175,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 -176,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 -177,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 -178,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 -179,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 -180,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 +49,length_cc_cylinder,HF shield central-cell-facing cylinder length,2.0,m,,,HF_magnet_shield_cost,0 +50,r_out_cc,HF shield central-cell-facing outer radius,0.85,m,,,HF_magnet_shield_cost,0 +51,length_ep_cylinder,HF shield end-plug-facing cylinder length,0.4,m,,,HF_magnet_shield_cost,0 +52,r_out_ep,HF shield end-plug-facing outer radius,0.85,m,,,HF_magnet_shield_cost,0 +53,application,Mirror plant application mode used for gross-electric-power logic,electricity,1,,,P_egross,0 +54,P_f,Total fusion power,175.0,MW,,,"P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci",0 +55,P_f_L,Fusion power per meter of central cell length,3.325,MW/m,,,L_CC,0 +56,P_f_EP,Fusion power assigned to each end plug,1.0,MW,,,P_f_CC,0 +57,P_NBI,Neutral beam injection power,15.0,MW,,,"P_in, P_ine",0 +58,P_ECH,Electron cyclotron heating power,0.0,MW,,,"P_in, P_ine",0 +59,P_ICRH,Ion cyclotron resonance heating power,0.0,MW,,,"P_in, P_ine",0 +60,M_n,Neutron energy multiplication factor,1.1,1,,,"P_pump, P_th",0 +61,N_module,Number of Mirror plant modules,1.0,1,,,,0 +62,f_pump,Fraction of neutron power used for pumping,0.03,1,,,P_pump,0 +63,f_sub,Fraction of fusion power used for subsystem controls,0.04,1,,,P_sub_cont,0 +64,f_cryo,Fraction of fusion power used for cryogenic load,0.01,1,,,P_cryo,0 +65,P_pfcool,Plasma-facing-component cooling power,0.0,MW,,,,0 +66,P_thcool,Thermal-system cooling power,0.0,MW,,,,0 +67,P_coils,Coil power load,0.0,MW,,,,0 +68,P_aux,Auxiliary plant power,1.0,MW,,,f_aux,0 +69,eta_th,Thermal conversion efficiency,0.6,1,,,P_the,0 +70,eta_DEC,Direct energy conversion efficiency,0.9,1,,,P_DECe,0 +71,eta_pump,Pump heat recovery efficiency,0.98,1,,,P_th,0 +72,eta_NBI,Neutral beam injection wall-plug efficiency,0.68,1,,,P_ine,0 +73,eta_ECH,Electron cyclotron heating wall-plug efficiency,0.6,1,,,P_ine,0 +74,eta_ICRH,Ion cyclotron resonance heating wall-plug efficiency,0.9,1,,,P_ine,0 +75,NOAK,Nth-of-a-kind plant flag,0.0,1,,,,0 +76,n_unit,Plant unit number for learning-curve cost scaling,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor",0 +77,construction_time,Construction duration,6.0,years,,,,0 +78,lifetime,Plant operating lifetime,30.0,years,,,,0 +79,replacement,Major component replacement interval,10.0,years,,,,0 +80,availability,Plant availability factor,0.9,1,,,,0 +81,discount,Real discount rate,0.03,1,,,,0 +82,LSA,Licensing safety analysis level,2.0,1,,,,0 +83,cost_file,PyFECONS cost data file name,woodruff-data_edited.csv,1,,,,0 +84,method,PyFECONS costing method selector,new,1,,,,0 +85,include_decommissioning,Flag to include decommissioning cost,0.0,1,,,,0 +86,include_tax,Flag to include tax cost,0.0,1,,,,0 +87,include_licensing,Flag to include licensing cost,0.0,1,,,,0 +88,include_contingency,Flag to include contingency cost,0.0,1,,,,0 +89,hf_magnet_length,High-field magnet axial length,1.0,m,,,,0 +90,hf_magnet_shielding_thickness,High-field magnet shielding thickness,1.0,m,,,,0 +91,a_EC,Expander cell plasma radius,1.0,m,,,"V_vac, expander_cell_cost_result",0 +92,expander_cell_vessel_thickness,Expander cell vessel wall thickness,0.01,m,,,expander_cell_cost_result,0 +93,expander_cell_vessel_material,Expander cell vessel material,SS316,1,,,,0 +94,vacuum_gap_CC,Central cell radial vacuum gap,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +95,first_wall_material,Central cell first wall material,W,1,,,,0 +96,first_wall_thickness,Central cell first wall thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +97,vacuum_vessel_material,Central cell vacuum vessel material,SS316,1,,,,0 +98,vacuum_vessel_thickness,Central cell vacuum vessel thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +99,multiplier_material,Central cell neutron multiplier material,Pb,1,,,,0 +100,multiplier_thickness,Central cell neutron multiplier thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +101,blanket_coolant_material,Central cell blanket coolant material,40% PbLi,1,,,,0 +102,blanket_thickness,Central cell blanket radial thickness,0.75,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +103,blanket_coolant_fraction,Central cell blanket coolant volume fraction,0.8,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +104,blanket_structural_material,Central cell blanket structural material,SS316,1,,,,0 +105,blanket_structural_fraction,Central cell blanket structural volume fraction,0.1,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +106,outer_vessel_thickness,Central cell outer vessel thickness,0.01,m,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +107,L_EP,End plug axial length,1.0,m,,,"L, end_plug_cylindrical_part_cost",0 +108,L_EC,Expander cell axial length,1.0,m,,,"L, expander_cell_cost_result",0 +109,a_EP,End plug plasma radius,1.0,m,,,,0 +110,HF_magnet_number,Number of high-field magnets,4.0,1,,,HF_magnet_cost,0 +111,LF_magnet_number,Number of low-field magnets,2.0,1,,,LF_magnet_cost,0 +112,HF_magnet_cost,"HF cost per magnet, not for all four",29.1,million,cal_HF_magnet_cost,"n_unit, HF_magnet_number, sc_mat_scale",,0 +113,LF_magnet_cost,LF cost per magnet,6.25262,million,cal_LF_magnet_cost,"n_unit, LF_magnet_number, sc_mat_scale",,0 +114,CF_magnet_cost,CF cost per magnet,2.751,million,cal_CF_magnet_cost,"n_unit, CF_magnet_number, sc_mat_scale",,0 +115,CF_magnet_number,One CF coil every L_CF m of central cell,52.03007518796992,1,cal_CF_magnet_number,"L_CC, L_CF",CF_magnet_cost,0 +116,HF_magnet_shield_cost,HF magnet shield cost per end plug,20.67396900201936,million,cal_HF_magnet_shield_cost,"a_M, a_CC_shield, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, r_out_cc, r_out_ep, W_rho, W_c_raw, W_m",,0 +117,a_CC_shield,HF shield central-cell plasma radius from legacy Mirror geometry,0.54,m,,,HF_magnet_shield_cost,0 +118,chamber_length,PyFECONS magnetic mirror chamber length,12.0,m,,,,0 +119,plasma_t,PyFECONS radial build plasma thickness,4.9,m,,,,0 +120,vacuum_t,PyFECONS radial build vacuum thickness,0.1,m,,,,0 +121,firstwall_t,PyFECONS radial build first wall thickness,0.1,m,,,,0 +122,blanket1_t,PyFECONS radial build blanket thickness,1.0,m,,,,0 +123,reflector_t,PyFECONS radial build reflector thickness,0.1,m,,,,0 +124,ht_shield_t,PyFECONS radial build high-temperature shield thickness,0.25,m,,,,0 +125,structure_t,PyFECONS radial build support structure thickness,0.2,m,,,,0 +126,gap1_t,PyFECONS radial build first gap thickness,0.5,m,,,,0 +127,vessel_t,PyFECONS radial build vessel thickness,0.2,m,,,,0 +128,coil_t,PyFECONS radial build coil thickness,1.76,m,,,,0 +129,gap2_t,PyFECONS radial build second gap thickness,1.0,m,,,,0 +130,lt_shield_t,PyFECONS radial build low-temperature shield thickness,0.3,m,,,,0 +131,bioshield_t,PyFECONS radial build bioshield thickness,1.0,m,,,,0 +132,FS_rho,PyFECONS Ferritic Steel density,7470.0,kg/m3,,,,0 +133,FS_c_raw,PyFECONS Ferritic Steel raw cost,10.0,dollar/kg,,,,0 +134,FS_m,PyFECONS Ferritic Steel manufacturing multiplier,3.0,1,,,,0 +135,FS_sigma,PyFECONS Ferritic Steel stress limit,450.0,MPa,,,,0 +136,Pb_rho,PyFECONS Lead density,9400.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +137,Pb_c_raw,PyFECONS Lead raw cost,2.4,dollar/kg,,,"P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +138,Pb_m,PyFECONS Lead manufacturing multiplier,1.5,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +139,Li4SiO4_rho,PyFECONS Lithium Silicate density,2390.0,kg/m3,,,,0 +140,Li4SiO4_c_raw,PyFECONS Lithium Silicate raw cost,1.0,dollar/kg,,,,0 +141,Li4SiO4_m,PyFECONS Lithium Silicate manufacturing multiplier,2.0,1,,,,0 +142,FLiBe_rho,PyFECONS FLiBe density,1900.0,kg/m3,,,,0 +143,FLiBe_c,PyFECONS FLiBe cost,40.0,dollar/m3,,,,0 +144,W_rho,PyFECONS Tungsten density,19300.0,kg/m3,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +145,W_c_raw,PyFECONS Tungsten raw cost,100.0,dollar/kg,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +146,W_m,PyFECONS Tungsten manufacturing multiplier,3.0,1,,,"HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost",0 +147,Li_rho,PyFECONS Lithium density,534.0,kg/m3,,,,0 +148,Li_c_raw,PyFECONS Lithium raw cost,29.53,dollar/kg,,,,0 +149,Li_m,PyFECONS Lithium manufacturing multiplier,1.5,1,,,,0 +150,sc_mat_scale,Superconductor material cost scaling factor,1.0,1,,,"CF_magnet_cost, HF_magnet_cost, LF_magnet_cost",0 +151,BFS_rho,PyFECONS BFS density,7800.0,kg/m3,,,,0 +152,BFS_c_raw,PyFECONS BFS raw cost,30.0,dollar/kg,,,,0 +153,BFS_m,PyFECONS BFS manufacturing multiplier,2.0,1,,,,0 +154,SiC_rho,PyFECONS Silicon Carbide density,3200.0,kg/m3,,,,0 +155,SiC_c_raw,PyFECONS Silicon Carbide raw cost,14.49,dollar/kg,,,,0 +156,SiC_m,PyFECONS Silicon Carbide manufacturing multiplier,3.0,1,,,,0 +157,Inconel_rho,PyFECONS Inconel density,8440.0,kg/m3,,,,0 +158,Inconel_c_raw,PyFECONS Inconel raw cost,46.0,dollar/kg,,,,0 +159,Inconel_m,PyFECONS Inconel manufacturing multiplier,3.0,1,,,,0 +160,Cu_rho,PyFECONS Copper density,7300.0,kg/m3,,,,0 +161,Cu_c_raw,PyFECONS Copper raw cost,10.2,dollar/kg,,,,0 +162,Cu_m,PyFECONS Copper manufacturing multiplier,3.0,1,,,,0 +163,Polyimide_rho,PyFECONS Polyimide density,1430.0,kg/m3,,,,0 +164,Polyimide_c_raw,PyFECONS Polyimide raw cost,100.0,dollar/kg,,,,0 +165,Polyimide_m,PyFECONS Polyimide manufacturing multiplier,3.0,1,,,,0 +166,YBCO_rho,PyFECONS YBCO density,6200.0,kg/m3,,,,0 +167,YBCO_c,PyFECONS YBCO cost,55.0,dollar/m3,,,,0 +168,Concrete_rho,PyFECONS Concrete density,2300.0,kg/m3,,,,0 +169,Concrete_c_raw,PyFECONS Concrete raw cost,0.52,dollar/kg,,,,0 +170,Concrete_m,PyFECONS Concrete manufacturing multiplier,2.0,1,,,,0 +171,SS316_rho,PyFECONS Stainless Steel 316 density,7860.0,kg/m3,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +172,SS316_c_raw,PyFECONS Stainless Steel 316 raw cost,2.0,dollar/kg,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +173,SS316_m,PyFECONS Stainless Steel 316 manufacturing multiplier,2.0,1,,,"central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result",0 +174,SS316_sigma,PyFECONS Stainless Steel 316 stress limit,900.0,MPa,,,,0 +175,Nb3Sn_c,PyFECONS Niobium-Tin cost,5.0,dollar/m3,,,,0 +176,Incoloy_rho,PyFECONS Incoloy density,8170.0,kg/m3,,,,0 +177,Incoloy_c_raw,PyFECONS Incoloy raw cost,4.0,dollar/kg,,,,0 +178,Incoloy_m,PyFECONS Incoloy manufacturing multiplier,2.0,1,,,,0 +179,Be_rho,PyFECONS Beryllium density,1850.0,kg/m3,,,,0 +180,Be_c_raw,PyFECONS Beryllium raw cost,5750.0,dollar/kg,,,,0 +181,Be_m,PyFECONS Beryllium manufacturing multiplier,3.0,1,,,,0 +182,Li2TiO3_rho,PyFECONS Lithium Titanate density,3430.0,kg/m3,,,,0 +183,Li2TiO3_c_raw,PyFECONS Lithium Titanate raw cost,1297.05,dollar/kg,,,,0 +184,Li2TiO3_m,PyFECONS Lithium Titanate manufacturing multiplier,3.0,1,,,,0 From 795f51ed6079df332c2e3f3bdd741a61f3a22b9b Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Wed, 5 Aug 2026 17:26:52 -0500 Subject: [PATCH 22/23] clean up --- src/Algorithm/MirrorFunc.py | 94 - src/Algorithm/MirrorFunc_splitInputs.py | 1557 ----------------- src/scripts/build_mirror_accert_tables.py | 10 - tutorial/accert/Mirror.son | 21 + tutorial/accert/ref_tables/MirrorFunc.py | 94 - .../ref_tables/MirrorFunc_splitInputs.py | 1557 ----------------- 6 files changed, 21 insertions(+), 3312 deletions(-) delete mode 100644 src/Algorithm/MirrorFunc_splitInputs.py delete mode 100644 tutorial/accert/ref_tables/MirrorFunc_splitInputs.py diff --git a/src/Algorithm/MirrorFunc.py b/src/Algorithm/MirrorFunc.py index 613bb06..91aa487 100644 --- a/src/Algorithm/MirrorFunc.py +++ b/src/Algorithm/MirrorFunc.py @@ -1,5 +1,4 @@ import numpy as np -import math import inspect from .Algorithm import Algorithm @@ -807,97 +806,8 @@ def Account_OM(P_enet): # Annualized O&M Cost return 60 * P_enet * 1000 / 1e6 - ### MNyberg's Magnet Methods ### - - # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 - # Table 2 should give good general information - # Critical current density from PROCESS - @staticmethod - def jcrit_rebco(temperature, b): - """Critical current density for "REBCO" 2nd generation HTS superconductor - temperature : input real : superconductor temperature (K) - b : input real : Magnetic field at superconductor (T) - jcrit : output real : Critical current density in superconductor (A/m2) - - Will return a negative number if the temperature is greater than Tc0, the - zero-field critical temperature. - """ - tc0 = 90.0 # (K) - birr0 = 132.5 # (T) - a = 1.82962e8 # scaling constant - # exponents - p = 0.5875 - q = 1.7 - alpha = 1.54121 - beta = 1.96679 - oneoveralpha = 1 / alpha - - validity = True - - if (temperature < 4.2) or (temperature > 72.0): - validity = False - if temperature < 65: - if (b < 0.0) or (b > 15.0): - validity = False - else: - if (b < 0.0) or (b > 11.5): - validity = False - - if not validity: - print( - # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" - ) - - if temperature < tc0: - # Normal case - birr = birr0 * (1 - temperature / tc0) ** alpha - else: - # If temp is greater than critical temp, ensure result is real but negative. - birr = birr0 * (1 - temperature / tc0) - - if b < birr: - # Normal case - factor = (b / birr) ** p * (1 - b / birr) ** q - jcrit = (a / b) * (birr**beta) * factor - else: - # Field is too high - # Ensure result is real but negative, and varies with temperature. - # tcb = critical temperature at field b - tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) - jcrit = -(temperature - tcb) - - return jcrit, validity - - @staticmethod - def HTS_storedEnergy(field, inner_rad, HTS_temp=20): - radius_in_wham = 6.65 # cm - radius_out_wham = 31.85 # cm - B_wham = 17 # T - cost_wham = 2.3/2 # MUSD - mew_0=1 # TODO if I value is needed change this to be the real constant value - width_ratio = 5 # TODO update - volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) - - j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] - - # Equation taking into account width and critical current ratios - I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) - outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) - # Old simple equation - # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) - volume_2 = math.pi*(outer_rad**2-inner_rad**2) - ratioOfVols=volume_2/volume_1 - - # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 - E_ratio=(field/B_wham)**2*ratioOfVols - cost_ratio=E_ratio**0.6 - return cost_ratio*cost_wham - - @staticmethod def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): - # This is the HF cost per magnet [MUSD], not for all four - cost = 29.10 cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) @@ -905,8 +815,6 @@ def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): @staticmethod def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): - # This is the LF cost per magnet [MUSD] - cost = 6.25262 cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) @@ -914,8 +822,6 @@ def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): @staticmethod def CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale=1.0): - # This is the CF cost per magnet [MUSD] - convert_to_currentDollar = 1.31 cost = 0.7*3.0*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS cost_factor = (0.70)**(np.log((n_unit - 1) * CF_magnet_number + 1)/np.log(2)) diff --git a/src/Algorithm/MirrorFunc_splitInputs.py b/src/Algorithm/MirrorFunc_splitInputs.py deleted file mode 100644 index e438257..0000000 --- a/src/Algorithm/MirrorFunc_splitInputs.py +++ /dev/null @@ -1,1557 +0,0 @@ -import numpy as np -import pandas as pd -import scipy -import json -import math -import pkg_resources -from .Algorithm import Algorithm - -### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples -class MirrorFunc(Algorithm): - - # Physical constants - E_DT = 17.59e6 * 1.60218*10**-19 # J - E_alpha = 3.52e6 * 1.60218*10**-19 # J - E_n = E_DT - E_alpha # J - m_T = 3.01604928 * 1.66053907*10**-27 # kg, triton mass - m_D = 2.01410177811 * 1.66053907*10**-27 # kg, deuteron mass - m_6Li = 6.0151228874 * 1.66053907*10**-27 # kg, lithium-6 mass - - # Conversion factors - Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU - - def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): - super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) - - def run(self, inputs: dict) -> float: - """ - Executes the algorithm specified by the name in the instance variables. - - Parameters: - inputs (dict): Dictionary of input variables required for the algorithm. - - Returns: - float: Result of the algorithm computation. - """ - # run the algorithm use self.name not self.alg_name - return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) - - def _run_algorithm(self, alg_name: str, variables: list) -> float: - """ - Runs the specified algorithm with given variables. - - Parameters: - alg_name (str): The name of the algorithm to run. - variables (list): List of input variables for the algorithm. - - Returns: - float: Result of the algorithm computation. - """ - try: - algorithm = getattr(self, alg_name) - return algorithm(*variables) - except AttributeError: - raise ValueError(f"Algorithm {alg_name} not found") - - ### Account Methods: ### - @staticmethod - def Account_C20(inputs): - return( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs) + - MirrorFunc.Account_C29(inputs) - ) - - @staticmethod - def Account_C21(inputs): - return( - MirrorFunc.Account_C21_1(inputs) + - MirrorFunc.Account_C21_2(inputs) + - MirrorFunc.Account_C21_3(inputs) + - MirrorFunc.Account_C21_4(inputs) + - MirrorFunc.Account_C21_5(inputs) + - MirrorFunc.Account_C21_6(inputs) + - MirrorFunc.Account_C21_7(inputs) + - MirrorFunc.Account_C21_8(inputs) + - MirrorFunc.Account_C21_9(inputs) + - MirrorFunc.Account_C21_10(inputs) + - MirrorFunc.Account_C21_11(inputs) + - MirrorFunc.Account_C21_12(inputs) + - MirrorFunc.Account_C21_13(inputs) + - MirrorFunc.Account_C21_14(inputs) + - MirrorFunc.Account_C21_15(inputs) + - MirrorFunc.Account_C21_16(inputs) + - MirrorFunc.Account_C21_17(inputs) - ) - - @staticmethod - def Account_C21_1(inputs): - # Site Preparation/Yard Work - return(inputs['Gross Electric Power'] * 268/1e3) - - @staticmethod - def Account_C21_2(inputs): - # Heat Island Building - return(inputs['Gross Electric Power'] * 186.8/1e3) - - @staticmethod - def Account_C21_3(inputs): - # Turbine Generator Building - if inputs['Application'].lower()=='electricity': - return(inputs['Gross Electric Power'] * 54.0/1e3) - else: - return(0) - - @staticmethod - def Account_C21_4(inputs): - # Heat Exchanger Building - return(37.8/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, - def Account_C21_5(inputs): - # Power Supply and Energy Storage - return(10.8/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, - def Account_C21_6(inputs): - # Reactor Auxiliaries - return(5.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, - def Account_C21_7(inputs): - # Hot Cell - return(93.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, - def Account_C21_8(inputs): - # Reactor Services - return(18.7/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, - def Account_C21_9(inputs): - # Service Water - return(0.3/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, - def Account_C21_10(inputs): - # Fuel Storage - return(1.1/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_11(inputs): - # Control Room - return(0.9/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, - def Account_C21_12(inputs): - # Onsite AC Power - return(0.8/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, - def Account_C21_13(inputs): - # Administration - return(4.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, - def Account_C21_14(inputs): - # Site Services - return(1.6/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, - def Account_C21_15(inputs): - # Cyrogenics - return(2.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_16(inputs): - # Security - return(0.9/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, - def Account_C21_17(inputs): - # Ventilation Stack - return(27.0/1e3 * inputs['Gross Electric Power']) - - - @staticmethod - def Account_C22(inputs): - # Rollup - return( - MirrorFunc.Account_C22_1(inputs) + - MirrorFunc.Account_C22_2(inputs) + - MirrorFunc.Account_C22_3(inputs) + - MirrorFunc.Account_C22_4(inputs) + - MirrorFunc.Account_C22_5(inputs) + - MirrorFunc.Account_C22_6(inputs) + - MirrorFunc.Account_C22_7(inputs) - ) - - - @staticmethod - def Account_C22_1(inputs): - # This is a special case and is NOT calculated using Woodruff's model, - # However, I maintained the naming convention for convenience - # Rollup - return( - MirrorFunc.Account_C22_1_1(inputs) + - MirrorFunc.Account_C22_1_2(inputs) + - MirrorFunc.Account_C22_1_3(inputs) + - MirrorFunc.Account_C22_1_4(inputs) + - MirrorFunc.Account_C22_1_5(inputs) + - MirrorFunc.Account_C22_1_6(inputs) + - MirrorFunc.Account_C22_1_7(inputs) + - MirrorFunc.Account_C22_1_8(inputs) + - MirrorFunc.Account_C22_1_9(inputs) + - MirrorFunc.Account_C22_1_11(inputs) - ) - - @staticmethod - def Account_C22_1_1(inputs): - # First Wall and Blanket (and vacuum vessel) - - L_magnet_to_magnet = inputs['End Plug Length'] - - L_cylinder = L_magnet_to_magnet - - expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) - - end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) - end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() - - central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) - central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() - - total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result - - return(total_cost/1e6) - - @staticmethod - def Account_C22_1_2(inputs): - # Magnet Radiation Shield - # Factor of two for each end plug - return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) - - @staticmethod - def Account_C22_1_3(inputs): - # Coils - # Rollup - return( - MirrorFunc.Account_C22_1_3_1(inputs) + - MirrorFunc.Account_C22_1_3_2(inputs) + - MirrorFunc.Account_C22_1_3_3(inputs) - ) - - # @staticmethod - def Account_C22_1_3_1(inputs): - # HF Coils - Quantity 4 - # 2 per end cell - # 2 end cells per tandem - return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) - - @staticmethod - def Account_C22_1_3_2(inputs): - # LF Coils - Quantity 8 - # 4 per end cell - # 2 end cells per tandem - return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) - - @staticmethod - def Account_C22_1_3_3(inputs): - # CF Coils - # One coil every L_CF m of Central Cell - return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) - - @staticmethod - def Account_C22_1_4(inputs): - # Supplemenatry Heating - # Rollup - return( - MirrorFunc.Account_C22_1_4_1(inputs) + - MirrorFunc.Account_C22_1_4_2(inputs) + - MirrorFunc.Account_C22_1_4_3(inputs) - ) - - @staticmethod - def Account_C22_1_4_1(inputs): - # NBI - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(7.0642 * inputs['NBI Power'] * cost_factor) - - @staticmethod - def Account_C22_1_4_2(inputs): - # ICRH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(4.149 * inputs['ICRH Power'] * cost_factor) - - @staticmethod - def Account_C22_1_4_3(inputs): - # ECH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(8.0 * inputs['ECH Power'] * cost_factor) - - @staticmethod - def Account_C22_1_5(inputs): - # Primary Structure and Support - return(0) - - @staticmethod - def Account_C22_1_6(inputs): - # Vacuum Systems - # Rollup - return( - # Account_C22_1_6_1(inputs) + - MirrorFunc.Account_C22_1_6_2(inputs) + - MirrorFunc.Account_C22_1_6_3(inputs) + - MirrorFunc.Account_C22_1_6_4(inputs) - ) - - - # def Account_C22_1_6_1(inputs): - # Vacuum Vessel - # Tracked in radial builds and folded into blanket - # return(0) - - - @staticmethod - def Account_C22_1_6_2(inputs): - # Helium Liquefier-Refrigerators (not for magnets) - # Presumably for a full vessel cryostat? - return(0) - - @staticmethod - def Account_C22_1_6_3(inputs): - - #VACUUM PUMPING 22.1.6.3 - #assume 1 second vac rate - #cost of 1 vacuum pump, scaled from 1985 dollars - cost_pump = 40000 - #48 pumps needed for 200^3 system - vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump - no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second - return(no_vpumps*cost_pump/1e6) - - - @staticmethod - def Account_C22_1_6_4(inputs): - # Roughing Pump - return(120000*2.85/1e6) - - @staticmethod - def Account_C22_1_7(inputs): - # Power Supplies - - # Not using Woodruff 2024 as that is based on ITER fusion power - # Heating and magnets are tracked elsewhere - - # #Scaled relative to ITER for a 500MW fusion power syste - # lcredit = 0.5# learning credit. - # C220107 = 269.6 * PNRL/500*lcredit #cost in kIUA - # C220107 = C220107*2 #assuming 1kIUA equals $2 M - - return(0) - - @staticmethod - def Account_C22_1_8(inputs): - # Divertor - return(0) - - @staticmethod - def Account_C22_1_9(inputs): - # Direct Energy Convertor - # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) - - @staticmethod - def Account_C22_1_11(inputs): - # Assembly and Installation Costs - - #Cost Category 22.1.11 Installation costs - axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius - axis_ir = axis_t - - # Define labor rate - lr = 1600 / 1e6 # 1600 dollars per day for skilled labor - - # Calculations - constructionworker = 20 * axis_ir / 4 - C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) - C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket - C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield - C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils - C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating - C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure - C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system - C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies - C_22_1_11_8_in = 0 # guns or divertor - C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter - C_22_1_11_10_in = 0 # ECRH - - # Total cost calculations - C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - - return(C220111 * cost_factor) - - @staticmethod - def Account_C22_2(inputs): - # Main and Secondary Coolant - return( - MirrorFunc.Account_C22_2_1(inputs) + - MirrorFunc.Account_C22_2_2(inputs) + - MirrorFunc.Account_C22_2_3(inputs) - ) - - @staticmethod - def Account_C22_2_1(inputs): - # Primary Coolant - return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) - - @staticmethod - def Account_C22_2_2(inputs): - # Secondary Coolant - return(40.6 * (inputs['Thermal Power']/3500)**0.55) - - @staticmethod - def Account_C22_2_3(inputs): - # Tertiary Coolant - return(0) - - @staticmethod - def Account_C22_3(inputs): - # Auxiliary Cooling Systems - return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) - - @staticmethod - def Account_C22_4(inputs): - # Radioactive Waste Treatment - return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) - - @staticmethod - def Account_C22_5(inputs): - # Cost Category 22.5 Fuel Handling and Storage - - inflation = 1.43 - C2205010ITER = 20.465 * inflation - C2205020ITER = 7 * inflation - C2205030ITER = 22.511 * inflation - C2205040ITER = 9.76 * inflation - C2205050ITER = 22.826 * inflation - C2205060ITER = 47.542 * inflation - # C22050ITER = C2205010ITER + C2205020ITER + C2205030ITER + C2205040ITER + C2205050ITER + C2205060ITER #ITER inflation cost - - - lcredit = 0.8 # learning curve - ltoak = 10**(np.log10(lcredit) / np.log10(2)) - - - C220501 = C2205010ITER * ltoak - C220502 = C2205020ITER * ltoak - C220503 = C2205030ITER * ltoak - C220504 = C2205040ITER * ltoak - C220505 = C2205050ITER * ltoak - C220506 = C2205060ITER * ltoak - C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - - return(C220500 * cost_factor) - - @staticmethod - def Account_C22_6(inputs): - # Cost Category 22.6 Other Reactor Plant Equipment - return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) - - @staticmethod - def Account_C22_7(inputs): - # Cost Category 22.7 Instrumentation and Control - return(85) - - @staticmethod - def Account_C23(inputs): - # Turbine Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) - - @staticmethod - def Account_C24(inputs): - # Electric Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) - - @staticmethod - def Account_C25(inputs): - # Miscellaneous Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) - - @staticmethod - def Account_C26(inputs): - # Heat Rejection - return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) - - @staticmethod - def Account_C27(inputs): - # Special Materials - # Total elsewhere, implement later - return(0) - - @staticmethod - def Account_C28(inputs): - # Digital Twin - return(5) - - @staticmethod - def Account_C29(inputs): - # Contingency on Direct Capital Costs - - # I may have to change the way that I do sums as this must be done separately? - # C21 = sum(C21.1 + C21.2 + ...) - - # Rollup - - if not(inputs['NOAK']) and inputs['Contingency']: - return(0.1 * ( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs))) - else: - return(0) - - - ### Other Methods: ### - @staticmethod - def PbLi_density(f_6Li=0.075, T=300): - """ - Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has - roughly 83% Pb and 17% Li. - - Parameters - ---------- - f_6Li : float, optional - Fraction of 6Li to all Li, aka enrichment. The default is 0.075. - T : float, optional - Temperature. Units are °C. The default is 300. - - Returns - ------- - Density of PbLi at selected parameters. - - """ - - f_6Li_natural = 0.075 - rho_6Li = 0.460e3 # kg/m^3 - rho_7Li = 0.537e3 # kg/m^3 - - T_K = T + 273.15 # K - - # Use equation for density as function of temperature from below, Table 1 - # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) - # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF - rho_PbLi = 10520.35 - 1.19051 * T_K - - - # Correct calculated density for enrichment - rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) - - return(rho_PbLi) - - @staticmethod - def Li_price(f_6Li=0.075): - """ - Return Li price (USD/kg) for enrichment levels above 90% 6Li - - Parameters - ---------- - f_6Li : TYPE, optional - DESCRIPTION. The default is 0.075. - - Returns - ------- - None. - - """ - - # https://www.dailymetalprice.com/lithium.html - # From 2024-04-01 - P_6Li075 = 15.152 # USD/kg - - if f_6Li == 0.075: - return(P_6Li075) - - elif f_6Li >= 0.90: - # From Woodruff for 90% 6Li - P_6Li90 = 70 # USD/kg - - # El-Guebaly 2011 (AIRES-AT UK Study) - # P_6Li90 = 2400.0 #USD/kg - - - f = [0.90, 0.99, 0.999, 0.9999, 0.99999] - Cf = [1, 2, 4, 8, 16] - - f_interp = scipy.interpolate.interp1d(f, Cf) - return(f_interp(f_6Li) * P_6Li90) - - else: - print('Lithium pricing at this enrichment level not supported') - return() - - @staticmethod - def PbLi_price(f_6Li, P_Pb): - - # Assuming eutectic fractions - f_Li = 0.17 - f_Pb = 1 - f_Li - - P_Li = MirrorFunc.Li_price(f_6Li) - - P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg - - return(P_PbLi) - @staticmethod - def V_cylindrical_shell(r_in, r_out, L): - """ - Return volume of a cylindrical shell - - Parameters - ---------- - r_in : float, inner radius - r_out : float, outer radius - L : float, length - - Returns - ------- - Volume (float). - - """ - return(np.pi * L * (r_out**2 - r_in**2)) - - @staticmethod - def V_inverse_triangular_washer(z, r_in, r_out): - """ - Return volume of cylindrical inverse triangular washer. - From the ASCII art below you can see how this is used for magnet shielding. - - ^ z - | - | z - |\ | /| - | \ | / | - | \ | / | - | \ | / | - | \ | / | - | \ | / | - ------------------------------------> r - r_in r_out - - Parameters - ---------- - z : float, z extent of triangle - r_in : float, inner radius of triangle - r_out : float, outer radius of triangle - - Returns - ------- - Volume (float). - - """ - - - # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b - - return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) - @staticmethod - def generate_inputs( - - application='heat', - - P_f=1, P_f_L=1, P_f_EP=1, - P_NBI=1, P_ECH=1, P_ICRH=1, - M_n=1.1, - - N_module=1, - - f_pump=0.03, f_sub=0.04, f_cryo=0.01, - - # Obsolete but kept for backwards compatibility - P_pump=1, P_sub_cont=1, P_cryo=1, - P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, - - eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, - eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, - - verbose=False, exact=False, - NOAK=False, n_unit=False, - construction_time=6, - lifetime=30, replacement=10, availability=0.90, - discount=0.0245, - LSA=2, - cost_file='woodruff-data.csv', method='new', - include_decommissioning=False, include_tax=False, - include_licensing=False, include_contingency=False, - - hf_magnet_length=1, - hf_magnet_shielding_thickness=1, - - a_EC=1, - expander_cell_vessel_thickness=0.01, - expander_cell_vessel_material='SS316', - - vacuum_gap_CC=0.01, - first_wall_material='W', - first_wall_thickness=0.01, - vacuum_vessel_material='SS316', - vacuum_vessel_thickness=0.01, - multiplier_material='Pb', - multiplier_thickness=0.01, - blanket_coolant_material='Natural PbLi', - blanket_thickness=1.00, - blanket_coolant_fraction=0.90, - blanket_structural_material='SS316', - blanket_structural_fraction=0.10, - outer_vessel_thickness=0.01, - - L_EP=1, - L_EC=1, - a_CC=1, - a_EP=1, - - save=True, - load=False, - filename=None, - run_name=None - - ): - - """ - Return a dict containing all inputs for a techno-economic analysis. - - Parameters - ---------- - application : str, optional - The application, either 'electricity' or 'heat'. - This changes the power balance and some reporting. The default - is 'heat'. - P_f : float - The total fusion power in MW. The length of the central cell - is scaled to achieve this value. This is not the net electrical power! - P_f_L : float - The central cell linear fusion power in MW/m. - P_f_EP : float - The fusion power in each of two end plugs in MW. - P_NBI : float - The applied NBI power in MW. - P_ECH : float - The applied ECH power in MW. - P_ICRH : float - The applied ICRH power in MW. - M_n : float - The neutron power multiplication factor from the blanket. - The default is 1.1. - N_module : int - The number of modules (fusion machines) per facility. - This is deprecated. The default is 1. - f_pump : float - The pumping power fraction (of M_n * P_fusion). The default is 0.03. - f_sub : float - The subsystem power fraction (of fusion power). The default is 0.04. - f_cryo : float - The cryogenic power fraction (of fusion power). The default is 0.01. - P_pump : float - The pumping power in MW. This is deprecated. - P_sub_cont : float - The subsystem and control power in MW. This is deprecated. - P_cryo: float - The cryo power in MW. The default is 0.5 MW. This is deprecated. - P_pfcool : float - The PF cooling power in MW. The default is 0. This is deprecated. - P_thcool : float - The thermal cooling power in MW. The default is 0. This is deprecated. - P_coils : float - The magnetic coil power in MW. The default is 0. - P_aux : float - The auxiliary power in MW. The default is 9.4. - - eta_th : float - The thermal conversion efficiency. - eta_DEC : float - The DEC conversion efficiency. The default is 0.90. - eta_pump : float - The pumping efficiency. The default is 0.98. - eta_NBI : float - The NBI electrical efficiency. - eta_ECH : float - The ECH electrical efficiency. - eta_ICRH : float - The ICRH electrical efficiency. - - LSA : int - The level of safey assurance. The default is 2. This is deprecated. - - construction_time : int - The construction time in years. The default is 6. - NOAK : bool - Whether this is an NOAK device. The default is False. - This will probably be deprecated soon. - n_unit : int or bool - The number of the tandem unit, in terms of first of a kind (1), - second of a kind (2), etc. When this is False, the FOAK cost is used. - The default is False. - lifetime : int - The lifetime of the tandem in years. This is used for LCOE and LCOH - calcualtions. The default is 30. - replacement : int - The replacement interval of the magnets in years. The default is 10. - availability : float - The facility availability. The range is between 0 and 1, inclusive. - The default is 0.90. - cost_file : str - The filename of the cost file. The default is 'woodruff-data.csv'. - method : str - The power balance method. The default is 'new'. - This will be deprecated soon. - include_tax : bool - Whether to include tax. The default is False. - include_decommissioning : bool - Whether to include decommissioning. The default is False. - include_licensing : bool - Whether to include licensing. The default is False. - include_contingency : bool - Whether to include continency. The default is False. - verbose : bool - Whether to print a lot. The default is False. - vacuum_gap_CC : float - The vacuum gap in the central cell, in meters. The default is 0.01. - first_wall_material : str - The first wall material. The default is 'W'. - first_wall_thickness : float - The first wall thickness, in meters. The default is 0.01. - vacuum_vessel_material : str - The vacuum vessel material. The default is 'SS316'. - vacuum_vessel_thickness : float - The vacuum vessel thickness, in meters. The default is 0.01 - multiplier_material : str - The muliplier material. The default is 'Pb' - multiplier_thickness : float - The multiplier thickness, in meters. The default is 0.01. - blanket_coolant_material : str - The blanket coolant material. The default is 'Natural PbLi'. - blanket_thickness : float - The blanket thickness, in meters. The default is 1.00. - blanket_coolant_fraction : float - The blanket coolant fraction, from 0 to 1. The default is 0.90. - blanket_structural_material : str - The blanket structural material. The default is 'SS316'. - blanket_structural_fraction : float - The blanket structural fraction, from 0 to 1. The default is 0.10. - outer_vessel_thickness : float - The outer vessel thickness, in meters. The default is 0.01. - contours : bool - Whether to plot contours of discount rates and build time. - The default is False. - tornadoes : bool - Whether to plot tornado plots. These take a while to make. - The default is False. - - hf_magnet_length : float - The axial length of the HF magnet, in meters. The default is 1.0. - hf_magnet_shielding_thickness : - The default is 1.0, - - a_EC : float - The expander cell radius, in meters. The default is 1.0. - expander_cell_vessel_thickness : float - The expander cell vessel thickness, in meters. The default is 0.01. - expander_cell_vessel_material : str - The expander cell vessel material. The default is 'SS316'. - - - - L_EP : float - The length of each end plug, in meters. The default is 1. - L_EC : float - The length of each expander cell, in meters, measured from the - centers of the HF coils. The default is 1. - a_CC : float - The central cell plasma radius, in meters. The default is 15. - a_EP : float - The end plug plasma radius, in meters. The default is 1. - - - - - save : bool - Whether to save the results. The default is True. - load : bool - Whether to load results. The default is False. - filename : str - The filename loading. The default is None. - run_name : str - A run name for saving results. The default is None. - - - """ - - if load: - with open(filename) as file: - inputs = json.load(file) - - else: - - # Fusion Power in Central Cell - P_f_CC = P_f - 2 * P_f_EP - - # Central Cell Length - L_CC = P_f_CC/P_f_L - - # Central Field Coil Spacing - L_CF = 1.0 - - # Overall Device Length - L = L_CC + 2 * L_EP + 2 * L_EC - - # Vacuum Volume - Not precise, but also not important - # Should be updated - V_vac = L * np.pi * a_EC**2 - - - # Power Balance - P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power - P_n = P_f - P_alpha # MW, neutron power - - # Input electrical power - P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH - - # Balance of Plant - P_pump = f_pump * M_n * P_n - P_sub_cont = f_sub * P_f - P_cryo = f_cryo * P_f - P_other = P_pump + P_sub_cont + P_cryo - - # Total heating input power applied to plasma - P_in = P_NBI + P_ICRH + P_ECH - - # Heat in blanket including neutron multiplication - # P_thermal_only = M_n * P_n - - # Thermal power - # No P_in term as that goes to DEC - P_th = M_n * P_n + eta_pump * P_pump - - # Thermal electric power - P_the = eta_th * P_th - - # DEC receives all charged particle exhaust, so is the sum of - # both the input power and alpha power - P_DEC = P_in + P_alpha - - # DEC electrical power - P_DECe = eta_DEC * P_DEC - - # Gross electrical power - # Differs for application - if application.lower()=='electricity': - # Electrical application uses thermal power to create electricity - P_egross = P_DECe + P_the - elif application.lower()=='heat': - # Heat application only uses DEC to create electricity - P_egross = P_DECe - - # Net electrical power - P_enet = P_egross - (P_ine + P_other) - - f_aux = P_aux / P_egross - # P_loss = P_th - P_the - P_DECe - # P_sub = f_sub * P_the - - # Scientific Q - Q_sci = P_f / P_in - - # Engineering Q - Q_eng = P_egross / (P_ine + P_other) - - # Recirculating power - f_refrac = 1 / Q_eng - if run_name==None: - run_name = '{:.1f}-MW'.format(float(P_f)) - - - cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) - - inputs = { - - # Application (heat or electricity) - 'Application':application, - 'Method':method, - - # Power Balance - 'Fusion Power': P_f, - 'Alpha Power': P_alpha, - 'Neutron Power': P_n, - 'Neutron Energy Multiplication': M_n, - # 'Thermal Only Power': P_thermal_only, - 'Thermal Power': P_th, - 'Thermal Conversion Efficiency': eta_th, - - # DEC - 'DEC Efficiency': eta_DEC, - 'DEC Electrical Power': P_DECe, - 'DEC Input Power': P_DEC, - - # Balance - 'Thermal Electric Power': P_the, - 'Gross Electric Power': P_egross, - 'Net Electric Power': P_enet, - - # Other Power - 'Other Power': P_other, - 'Pumping Power Fraction': f_pump, - 'Pumping Power': P_pump, - 'Subsystem and Control Power': P_sub_cont, - 'Auxiliary Power Fraction': f_aux, - 'Auxiliary Power': P_aux, - - # Input Power - 'Applied Heating Power': P_in, - 'Applied Heating Power Electrical Use': P_ine, - 'NBI Power': P_NBI, - 'ICRH Power': P_ICRH, - 'ECH Power': P_ECH, - 'NBI Electrical Efficiency': eta_NBI, - 'ICRH Electrical Efficiency': eta_ICRH, - 'ECH Electrical Efficiency': eta_ECH, - - # Q - 'Scientific Q': Q_sci, - 'Engineering Q': Q_eng, - 'Recirculating Power Fraction': f_refrac, - - # Don't use this - it is probably not implemented well here - 'Number of Modules': N_module, - - # Time Intervals - 'Construction Time':construction_time, - 'Lifetime':lifetime, - 'Replacement Time':replacement, - 'Level of Safety Assurance':LSA, - - # Geometry - 'Overall Length':L, - 'Central Cell Length':L_CC, - 'End Plug Length':L_EP, - 'Expander Length':L_EC, - 'Vacuum Volume':V_vac, - - # Number of Magnets - 'HF Magnet Number':4, # Always 4 for a tandem - 'LF Magnet Number':2, # Set to what you need! - 'CF Magnet Spacing':L_CF, - 'CF Magnet Number':L_CC/L_CF, # Calcuated - - 'HF Magnet Length':hf_magnet_length, - 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, - - 'End Plug Plasma Radius':a_EP, - - 'Expander Cell Length':L_EC, - 'Expander Cell Radius':a_EC, - 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, - 'Expander Cell Vessel Material':expander_cell_vessel_material, - - 'Central Cell Plasma Radius':a_CC, - 'Central Cell Vacuum Gap':vacuum_gap_CC, - 'First Wall Material':first_wall_material, - 'First Wall Thickness':first_wall_thickness, - 'Vacuum Vessel Material':vacuum_vessel_material, - 'Vacuum Vessel Thickness':vacuum_vessel_thickness, - 'Multiplier Material':multiplier_material, - 'Multiplier Thicnkess':multiplier_thickness, - 'Blanket Coolant Material':blanket_coolant_material, - 'Blanket Thickness':blanket_thickness, - 'Blanket Coolant Fraction':blanket_coolant_fraction, - 'Blanket Structural Material':blanket_structural_material, - 'Blanket Structrual Fraction':blanket_structural_fraction, - 'Outer Vessel Thickness':outer_vessel_thickness, - - # Economic Factors - 'Availability':availability, - 'Discount':discount, - 'NOAK': NOAK, - 'Unit Number':n_unit, - # 'Cost File':cost_file, - 'Cost File':cost_file_full, - 'Licensing':include_licensing, - 'Tax':include_tax, - 'Decommissioning':include_decommissioning, - 'Contingency':include_contingency, - - # File Prefix - 'Run Name':run_name - - } - - if save: - # import csv - - filename = 'inputs-'+inputs['Run Name']+'.json' - - - with open(filename, 'w') as file: - json.dump(inputs, file) - - if verbose: - - format_string = '{:35s} {:8.2f}' - - print('{:35s} {:8s}'.format('Parameter', 'Value')) - - for key in inputs: - print(format_string.format(key, inputs[key])) - - return(inputs) - @staticmethod - def create_radial_build(name, material, thickness, f_vol=1.00): - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[0.0], - 'r_out':[thickness], - 'f_vol':[f_vol]}) - - return(new_data) - @staticmethod - def add_new_layer(data, name, material, thickness, f_vol=1.00): - - # Inner radius is outer radius from last row - r_in = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_in+thickness], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def add_fractional_layer(data, name, material, f_vol=1.00): - - # Inner radius is inner radius from last row - r_in = data['r_in'].values[-1] - r_out = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_out], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def build_central_cell(inputs): - - radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) - radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) - - return(radial_build) - - @staticmethod - def central_cell_cost(inputs, L=1.0): - return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) - - @staticmethod - def central_cell(inputs, L=1.0): - - filename = inputs['Cost File'] - - cost_data = pd.read_csv(filename, index_col=0) - - radial_build = MirrorFunc.build_central_cell(inputs) - - - - T = 300 # °C, mean coolant temperture - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - # print(radial_build.to_string()) - - # print(radial_build) - - # Iterate over layer in radial build and calculate volume and cost - for i in range(len(radial_build)): - - material = radial_build['material'][i] - # print(material) - - ''' - PbLi is a special case as the enrichment and temperature affect - the density and cost. Here the code expects a percent enrichment as - shown here: - 'Natural PbLi' meaning '7.5% PbLi' - '93% PbLi' or similar - ''' - if 'PbLi' in material: - - if 'Natural' in material: - f_6Li = 0.075 - elif '% ' in material: - f_6Li = float(material.split('% ')[0])/100 - else: - print('Unable to parse coolant', material) - - radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) - radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) - radial_build.loc[i, 'manufacturing_factor'] = 1.0 - - - else: - - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - - - - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})], ignore_index=True) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - # print() - # print('Radial build for L =', L) - # print(radial_build.to_string()) - - return(radial_build) - - # Return total cost only - # return(radial_build['cost'].max()) - - @staticmethod - def expander_cell_cost(inputs): - """ - Each expander cell is made up of: - A cylindrical vessel - A DEC convertor - - - Returns - ------- - None. - - """ - - # print('Expander Cell') - - L = inputs['Expander Cell Length'] - radius = inputs['Expander Cell Radius'] - thickness = inputs['Expander Cell Vessel Thickness'] - vv_material = inputs['Expander Cell Vessel Material'] - - filename = inputs['Cost File'] - - cost_data = pd.read_csv(filename, index_col=0) - - # Cylindrical shell - - radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - for i in range(len(radial_build)): - - material = radial_build['material'][i] - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})]) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - - # print(radial_build.to_string()) - - # End cap - V_end_cap = np.pi * thickness * radius**2 - M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] - C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] - - # print('End Cap: $', C_end_cap) - # print('Cylindrical Part: $', radial_build['cost'].max()) - - total = 2*C_end_cap + radial_build['cost'].max() - - # print('Total: $', total) - - return(total) - - @staticmethod - def HF_magnet_shield_cost(inputs, verbose=False): - """ - The HF coils have annular shield with a U-shaped cross section: - - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - \ | | / - \ | | / - \ | | / - \| |/ - +--------+ - - - - - - - - - - - - - - Center Line - - - +--------+ - /| |\ - / | | \ - / | | \ - / | | \ - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - - - """ - - # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) - # It's a reasonable assumption to say that all axial widths/layers will be the same - - - filename = inputs['Cost File'] - cost_data = pd.read_csv(filename, index_col=0) - - # Eventually these will be arguments - material = 'W' - a_M = 0.15 # From Frank - a_CC = 0.54 # From Frank - a_0 = 0.7 - - # Radially Inner Cylinder - # length = 4.5 # End plug length from Frank - length = 0.5 # Is this the required shielding thickness? - a_M = 0.15 - r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding - r_vv = 0.01 # Reduced from 0.1 to 0.01 - - # r_magnet = 1.0 # original - r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses - r_cryostat = 1.0 - - f_vol = 0.90 - - - r_in = a_M + r_gap + r_vv - r_out = r_magnet - r_cryostat - - V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol - - # Central Cell Cylinder - # length_cc_cylinder = 50.0 - length_cc_cylinder = 0.5 - r_in_cc = a_CC + r_gap + r_vv - # r_out_cc = 1.0 - r_out_cc = r_in_cc+0.5 - - V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol - - # Central Cell Triangular Washer - V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol - - # End Plug Cylinder - length_ep_cylinder = 0.5 # From Frank - r_in_ep = a_0 + r_gap + r_vv - r_out_ep = r_in_ep + 0.5 - - V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol - - # End Cell Triangular Washer - V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol - - # For central cell facing magnet, add up all five regions - V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle - - # For expander cell facing magnet, only add up three regions - # No neutrons come from the expander cell - V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle - - # Summary information - V_total = V_total_cc_facing + V_total_ec_facing - mass = cost_data.loc[material]['density'] * V_total - cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass - - return(cost) - - - ### MNyberg's Magnet Methods ### - - # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 - # Table 2 should give good general information - # Critical current density from PROCESS - @staticmethod - def jcrit_rebco(temperature, b): - """Critical current density for "REBCO" 2nd generation HTS superconductor - temperature : input real : superconductor temperature (K) - b : input real : Magnetic field at superconductor (T) - jcrit : output real : Critical current density in superconductor (A/m2) - - Will return a negative number if the temperature is greater than Tc0, the - zero-field critical temperature. - """ - tc0 = 90.0 # (K) - birr0 = 132.5 # (T) - a = 1.82962e8 # scaling constant - # exponents - p = 0.5875 - q = 1.7 - alpha = 1.54121 - beta = 1.96679 - oneoveralpha = 1 / alpha - - validity = True - - if (temperature < 4.2) or (temperature > 72.0): - validity = False - if temperature < 65: - if (b < 0.0) or (b > 15.0): - validity = False - else: - if (b < 0.0) or (b > 11.5): - validity = False - - if not validity: - print( - # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" - ) - - if temperature < tc0: - # Normal case - birr = birr0 * (1 - temperature / tc0) ** alpha - else: - # If temp is greater than critical temp, ensure result is real but negative. - birr = birr0 * (1 - temperature / tc0) - - if b < birr: - # Normal case - factor = (b / birr) ** p * (1 - b / birr) ** q - jcrit = (a / b) * (birr**beta) * factor - else: - # Field is too high - # Ensure result is real but negative, and varies with temperature. - # tcb = critical temperature at field b - tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) - jcrit = -(temperature - tcb) - - return jcrit, validity - - @staticmethod - def HTS_storedEnergy(field, inner_rad, HTS_temp=20): - radius_in_wham = 6.65 # cm - radius_out_wham = 31.85 # cm - B_wham = 17 # T - cost_wham = 2.3/2 # MUSD - mew_0=1 # TODO if I value is needed change this to be the real constant value - width_ratio = 5 # TODO update - volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) - - j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] - - # Equation taking into account width and critical current ratios - I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) - outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) - # Old simple equation - # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) - volume_2 = math.pi*(outer_rad**2-inner_rad**2) - ratioOfVols=volume_2/volume_1 - - # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 - E_ratio=(field/B_wham)**2*ratioOfVols - cost_ratio=E_ratio**0.6 - return cost_ratio*cost_wham - - - @staticmethod - def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): - # This is the HF cost per magnet [MUSD], not for all four - - # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit - cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) - - return(cost * cost_factor) - - @staticmethod - def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): - # This is the LF cost per magnet [MUSD] - - cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) - - return(cost * cost_factor) - - @staticmethod - def CF_magnet_cost(inputs, CF_field=3.0): - # This is the CF cost per magnet [MUSD] - - convert_to_currentDollar = 1.31 - cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) - - return(cost * cost_factor) - - - - - diff --git a/src/scripts/build_mirror_accert_tables.py b/src/scripts/build_mirror_accert_tables.py index 5f11a87..60ded46 100644 --- a/src/scripts/build_mirror_accert_tables.py +++ b/src/scripts/build_mirror_accert_tables.py @@ -22,9 +22,7 @@ DEFAULT_REF_DIR = ROOT / "tutorial" / "accert" / "ref_tables" DEFAULT_SQL = DEFAULT_REF_DIR / "mirror_accertdb.sql" DEFAULT_ALG_SRC = DEFAULT_REF_DIR / "MirrorFunc.py" -DEFAULT_SPLIT_ALG_SRC = DEFAULT_REF_DIR / "MirrorFunc_splitInputs.py" DEFAULT_ALG_DST = ROOT / "src" / "Algorithm" / "MirrorFunc.py" -DEFAULT_SPLIT_ALG_DST = ROOT / "src" / "Algorithm" / "MirrorFunc_splitInputs.py" TABLES = { "mirror_acco": "mirror_account.csv", @@ -1343,8 +1341,6 @@ def load_mirror_tables( sql_path: Path, algorithm_source: Path, algorithm_dest: Path, - split_algorithm_source: Path, - split_algorithm_dest: Path, ) -> None: mysql_sql = sql_path.read_text(encoding="utf-8") conn = sqlite3.connect(db_path) @@ -1371,9 +1367,7 @@ def load_mirror_tables( algorithm_dest.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(algorithm_source, algorithm_dest) - shutil.copy2(split_algorithm_source, split_algorithm_dest) print(f"Copied {algorithm_source} to {algorithm_dest}.") - print(f"Copied {split_algorithm_source} to {split_algorithm_dest}.") def main() -> None: @@ -1383,8 +1377,6 @@ def main() -> None: parser.add_argument("--sql", default=str(DEFAULT_SQL)) parser.add_argument("--algorithm-source", default=str(DEFAULT_ALG_SRC)) parser.add_argument("--algorithm-dest", default=str(DEFAULT_ALG_DST)) - parser.add_argument("--split-algorithm-source", default=str(DEFAULT_SPLIT_ALG_SRC)) - parser.add_argument("--split-algorithm-dest", default=str(DEFAULT_SPLIT_ALG_DST)) args = parser.parse_args() load_mirror_tables( Path(args.db).resolve(), @@ -1392,8 +1384,6 @@ def main() -> None: Path(args.sql).resolve(), Path(args.algorithm_source).resolve(), Path(args.algorithm_dest).resolve(), - Path(args.split_algorithm_source).resolve(), - Path(args.split_algorithm_dest).resolve(), ) diff --git a/tutorial/accert/Mirror.son b/tutorial/accert/Mirror.son index 31095db..9165753 100644 --- a/tutorial/accert/Mirror.son +++ b/tutorial/accert/Mirror.son @@ -1,8 +1,29 @@ % ACCERT Test input file % Author: J. Zhou (jia.zhou@anl.gov) % Last updated: 08/08/2024 +% Mirror reference model using the runFOAK.py baseline: +% P_f=175, P_NBI=15, P_ICRH=0, P_ECH=0, n_unit=1, +% construction_time=6, discount=0.03, P_f_L=175*0.95/50, +% eta_th=0.60, eta_NBI=0.68, eta_ECH=0.60, eta_ICRH=0.90, +% eta_DEC=0.90, blanket_coolant_material="40% PbLi", +% blanket_coolant_fraction=0.80, blanket_thickness=0.75. accert{ ref_model = "mirror" + var("P_f"){value = 175 unit = MW} + var("P_NBI"){value = 15 unit = MW} + var("P_ICRH"){value = 0 unit = MW} + var("P_ECH"){value = 0 unit = MW} + var("n_unit"){value = 1 unit = N/A} + var("construction_time"){value = 6 unit = years} + var("discount"){value = 0.03 unit = N/A} + var("P_f_L"){value = 3.325 unit = N/A} + var("eta_th"){value = 0.60 unit = N/A} + var("eta_NBI"){value = 0.68 unit = N/A} + var("eta_ECH"){value = 0.60 unit = N/A} + var("eta_ICRH"){value = 0.90 unit = N/A} + var("eta_DEC"){value = 0.90 unit = N/A} + var("blanket_coolant_fraction"){value = 0.80 unit = N/A} + var("blanket_thickness"){value = 0.75 unit = m} } diff --git a/tutorial/accert/ref_tables/MirrorFunc.py b/tutorial/accert/ref_tables/MirrorFunc.py index 613bb06..91aa487 100644 --- a/tutorial/accert/ref_tables/MirrorFunc.py +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -1,5 +1,4 @@ import numpy as np -import math import inspect from .Algorithm import Algorithm @@ -807,97 +806,8 @@ def Account_OM(P_enet): # Annualized O&M Cost return 60 * P_enet * 1000 / 1e6 - ### MNyberg's Magnet Methods ### - - # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 - # Table 2 should give good general information - # Critical current density from PROCESS - @staticmethod - def jcrit_rebco(temperature, b): - """Critical current density for "REBCO" 2nd generation HTS superconductor - temperature : input real : superconductor temperature (K) - b : input real : Magnetic field at superconductor (T) - jcrit : output real : Critical current density in superconductor (A/m2) - - Will return a negative number if the temperature is greater than Tc0, the - zero-field critical temperature. - """ - tc0 = 90.0 # (K) - birr0 = 132.5 # (T) - a = 1.82962e8 # scaling constant - # exponents - p = 0.5875 - q = 1.7 - alpha = 1.54121 - beta = 1.96679 - oneoveralpha = 1 / alpha - - validity = True - - if (temperature < 4.2) or (temperature > 72.0): - validity = False - if temperature < 65: - if (b < 0.0) or (b > 15.0): - validity = False - else: - if (b < 0.0) or (b > 11.5): - validity = False - - if not validity: - print( - # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" - ) - - if temperature < tc0: - # Normal case - birr = birr0 * (1 - temperature / tc0) ** alpha - else: - # If temp is greater than critical temp, ensure result is real but negative. - birr = birr0 * (1 - temperature / tc0) - - if b < birr: - # Normal case - factor = (b / birr) ** p * (1 - b / birr) ** q - jcrit = (a / b) * (birr**beta) * factor - else: - # Field is too high - # Ensure result is real but negative, and varies with temperature. - # tcb = critical temperature at field b - tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) - jcrit = -(temperature - tcb) - - return jcrit, validity - - @staticmethod - def HTS_storedEnergy(field, inner_rad, HTS_temp=20): - radius_in_wham = 6.65 # cm - radius_out_wham = 31.85 # cm - B_wham = 17 # T - cost_wham = 2.3/2 # MUSD - mew_0=1 # TODO if I value is needed change this to be the real constant value - width_ratio = 5 # TODO update - volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) - - j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] - - # Equation taking into account width and critical current ratios - I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) - outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) - # Old simple equation - # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) - volume_2 = math.pi*(outer_rad**2-inner_rad**2) - ratioOfVols=volume_2/volume_1 - - # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 - E_ratio=(field/B_wham)**2*ratioOfVols - cost_ratio=E_ratio**0.6 - return cost_ratio*cost_wham - - @staticmethod def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): - # This is the HF cost per magnet [MUSD], not for all four - cost = 29.10 cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) @@ -905,8 +815,6 @@ def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): @staticmethod def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): - # This is the LF cost per magnet [MUSD] - cost = 6.25262 cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) @@ -914,8 +822,6 @@ def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): @staticmethod def CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale=1.0): - # This is the CF cost per magnet [MUSD] - convert_to_currentDollar = 1.31 cost = 0.7*3.0*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS cost_factor = (0.70)**(np.log((n_unit - 1) * CF_magnet_number + 1)/np.log(2)) diff --git a/tutorial/accert/ref_tables/MirrorFunc_splitInputs.py b/tutorial/accert/ref_tables/MirrorFunc_splitInputs.py deleted file mode 100644 index e438257..0000000 --- a/tutorial/accert/ref_tables/MirrorFunc_splitInputs.py +++ /dev/null @@ -1,1557 +0,0 @@ -import numpy as np -import pandas as pd -import scipy -import json -import math -import pkg_resources -from .Algorithm import Algorithm - -### MNyberg TEAm-based Mirror algorithms based on Tokamak/Ste examples -class MirrorFunc(Algorithm): - - # Physical constants - E_DT = 17.59e6 * 1.60218*10**-19 # J - E_alpha = 3.52e6 * 1.60218*10**-19 # J - E_n = E_DT - E_alpha # J - m_T = 3.01604928 * 1.66053907*10**-27 # kg, triton mass - m_D = 2.01410177811 * 1.66053907*10**-27 # kg, deuteron mass - m_6Li = 6.0151228874 * 1.66053907*10**-27 # kg, lithium-6 mass - - # Conversion factors - Wh_to_BTU = 3.41214 # 1 Wh = 3.41214 BTU - - def __init__(self, ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants): - super().__init__(ind, alg_name, alg_for, alg_description, alg_formulation, alg_units, variables, constants) - - def run(self, inputs: dict) -> float: - """ - Executes the algorithm specified by the name in the instance variables. - - Parameters: - inputs (dict): Dictionary of input variables required for the algorithm. - - Returns: - float: Result of the algorithm computation. - """ - # run the algorithm use self.name not self.alg_name - return self._run_algorithm(self.name, [inputs[var] for var in self.variables.split(",")]) - - def _run_algorithm(self, alg_name: str, variables: list) -> float: - """ - Runs the specified algorithm with given variables. - - Parameters: - alg_name (str): The name of the algorithm to run. - variables (list): List of input variables for the algorithm. - - Returns: - float: Result of the algorithm computation. - """ - try: - algorithm = getattr(self, alg_name) - return algorithm(*variables) - except AttributeError: - raise ValueError(f"Algorithm {alg_name} not found") - - ### Account Methods: ### - @staticmethod - def Account_C20(inputs): - return( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs) + - MirrorFunc.Account_C29(inputs) - ) - - @staticmethod - def Account_C21(inputs): - return( - MirrorFunc.Account_C21_1(inputs) + - MirrorFunc.Account_C21_2(inputs) + - MirrorFunc.Account_C21_3(inputs) + - MirrorFunc.Account_C21_4(inputs) + - MirrorFunc.Account_C21_5(inputs) + - MirrorFunc.Account_C21_6(inputs) + - MirrorFunc.Account_C21_7(inputs) + - MirrorFunc.Account_C21_8(inputs) + - MirrorFunc.Account_C21_9(inputs) + - MirrorFunc.Account_C21_10(inputs) + - MirrorFunc.Account_C21_11(inputs) + - MirrorFunc.Account_C21_12(inputs) + - MirrorFunc.Account_C21_13(inputs) + - MirrorFunc.Account_C21_14(inputs) + - MirrorFunc.Account_C21_15(inputs) + - MirrorFunc.Account_C21_16(inputs) + - MirrorFunc.Account_C21_17(inputs) - ) - - @staticmethod - def Account_C21_1(inputs): - # Site Preparation/Yard Work - return(inputs['Gross Electric Power'] * 268/1e3) - - @staticmethod - def Account_C21_2(inputs): - # Heat Island Building - return(inputs['Gross Electric Power'] * 186.8/1e3) - - @staticmethod - def Account_C21_3(inputs): - # Turbine Generator Building - if inputs['Application'].lower()=='electricity': - return(inputs['Gross Electric Power'] * 54.0/1e3) - else: - return(0) - - @staticmethod - def Account_C21_4(inputs): - # Heat Exchanger Building - return(37.8/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.05.00,,Power supply & energy storage,Concrete & Steel,9.1,9.7,9.7,6.0,560,2019,1.19, - def Account_C21_5(inputs): - # Power Supply and Energy Storage - return(10.8/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.06.00,,Reactor auxiliaries,Concrete & Steel,4.5,4.8,4.8,3.0,70,2019,1.19, - def Account_C21_6(inputs): - # Reactor Auxiliaries - return(5.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.07.00,,Hot cell,Concrete & Steel,65.8,24.2,24.2,60,35000,2013,1.42, - def Account_C21_7(inputs): - # Hot Cell - return(93.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.08.00,,Reactor services,Steel frame,13.2,4.8,4.8,10,233,2013,1.42, - def Account_C21_8(inputs): - # Reactor Services - return(18.7/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.09.00,,Service water,Steel frame,0.2,1.3,4.0,4.0,21,2019,1.19, - def Account_C21_9(inputs): - # Service Water - return(0.3/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.10.00,,Fuel storage,Steel frame,0.9,5.0,15.0,2.5,188,2019,1.19, - def Account_C21_10(inputs): - # Fuel Storage - return(1.1/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.11.00,,Control room,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_11(inputs): - # Control Room - return(0.9/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.12.00,,Onsite AC inputs,Steel frame,0.7,3.6,10.8,1.8,70,2019,1.19, - def Account_C21_12(inputs): - # Onsite AC Power - return(0.8/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.13.00,,Administration,Steel frame,3.7,20.0,60.0,10,12000,2019,1.19, - def Account_C21_13(inputs): - # Administration - return(4.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.14.00,,Site services,Steel frame,1.3,7.3,22.0,3.7,593,2019,1.19, - def Account_C21_14(inputs): - # Site Services - return(1.6/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.15.00,,Cryogenics,Steel frame,2.0,11.0,33.0,5.5,2003,2019,1.19, - def Account_C21_15(inputs): - # Cyrogenics - return(2.4/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.16.00,,Security,Steel frame,0.7,4.0,12.0,2,96,2019,1.19, - def Account_C21_16(inputs): - # Security - return(0.9/1e3 * inputs['Gross Electric Power']) - - @staticmethod - #21.17.00,,Ventilation stack,Steel cylinder & concrete foundation,22.7,,,120,,2019,1.19, - def Account_C21_17(inputs): - # Ventilation Stack - return(27.0/1e3 * inputs['Gross Electric Power']) - - - @staticmethod - def Account_C22(inputs): - # Rollup - return( - MirrorFunc.Account_C22_1(inputs) + - MirrorFunc.Account_C22_2(inputs) + - MirrorFunc.Account_C22_3(inputs) + - MirrorFunc.Account_C22_4(inputs) + - MirrorFunc.Account_C22_5(inputs) + - MirrorFunc.Account_C22_6(inputs) + - MirrorFunc.Account_C22_7(inputs) - ) - - - @staticmethod - def Account_C22_1(inputs): - # This is a special case and is NOT calculated using Woodruff's model, - # However, I maintained the naming convention for convenience - # Rollup - return( - MirrorFunc.Account_C22_1_1(inputs) + - MirrorFunc.Account_C22_1_2(inputs) + - MirrorFunc.Account_C22_1_3(inputs) + - MirrorFunc.Account_C22_1_4(inputs) + - MirrorFunc.Account_C22_1_5(inputs) + - MirrorFunc.Account_C22_1_6(inputs) + - MirrorFunc.Account_C22_1_7(inputs) + - MirrorFunc.Account_C22_1_8(inputs) + - MirrorFunc.Account_C22_1_9(inputs) + - MirrorFunc.Account_C22_1_11(inputs) - ) - - @staticmethod - def Account_C22_1_1(inputs): - # First Wall and Blanket (and vacuum vessel) - - L_magnet_to_magnet = inputs['End Plug Length'] - - L_cylinder = L_magnet_to_magnet - - expander_cell_cost_result = MirrorFunc.expander_cell_cost(inputs) - - end_plug_cylindrical_part = MirrorFunc.central_cell(inputs, L_cylinder) - end_plug_cylindrical_part_cost = end_plug_cylindrical_part['cost'].max() - - central_cell_cylindrical_part = MirrorFunc.central_cell(inputs, inputs['Central Cell Length']) - central_cell_cylindrical_part_cost = central_cell_cylindrical_part['cost'].max() - - total_cost = central_cell_cylindrical_part_cost + 2 * end_plug_cylindrical_part_cost + 2 * expander_cell_cost_result - - return(total_cost/1e6) - - @staticmethod - def Account_C22_1_2(inputs): - # Magnet Radiation Shield - # Factor of two for each end plug - return(2 * MirrorFunc.HF_magnet_shield_cost(inputs) / 1e6) - - @staticmethod - def Account_C22_1_3(inputs): - # Coils - # Rollup - return( - MirrorFunc.Account_C22_1_3_1(inputs) + - MirrorFunc.Account_C22_1_3_2(inputs) + - MirrorFunc.Account_C22_1_3_3(inputs) - ) - - # @staticmethod - def Account_C22_1_3_1(inputs): - # HF Coils - Quantity 4 - # 2 per end cell - # 2 end cells per tandem - return(inputs['HF Magnet Number'] * MirrorFunc.HF_magnet_cost(inputs)) - - @staticmethod - def Account_C22_1_3_2(inputs): - # LF Coils - Quantity 8 - # 4 per end cell - # 2 end cells per tandem - return(inputs['LF Magnet Number'] * MirrorFunc.LF_magnet_cost(inputs)) - - @staticmethod - def Account_C22_1_3_3(inputs): - # CF Coils - # One coil every L_CF m of Central Cell - return(inputs['CF Magnet Number'] * MirrorFunc.CF_magnet_cost(inputs)) - - @staticmethod - def Account_C22_1_4(inputs): - # Supplemenatry Heating - # Rollup - return( - MirrorFunc.Account_C22_1_4_1(inputs) + - MirrorFunc.Account_C22_1_4_2(inputs) + - MirrorFunc.Account_C22_1_4_3(inputs) - ) - - @staticmethod - def Account_C22_1_4_1(inputs): - # NBI - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(7.0642 * inputs['NBI Power'] * cost_factor) - - @staticmethod - def Account_C22_1_4_2(inputs): - # ICRH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(4.149 * inputs['ICRH Power'] * cost_factor) - - @staticmethod - def Account_C22_1_4_3(inputs): - # ECH - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(8.0 * inputs['ECH Power'] * cost_factor) - - @staticmethod - def Account_C22_1_5(inputs): - # Primary Structure and Support - return(0) - - @staticmethod - def Account_C22_1_6(inputs): - # Vacuum Systems - # Rollup - return( - # Account_C22_1_6_1(inputs) + - MirrorFunc.Account_C22_1_6_2(inputs) + - MirrorFunc.Account_C22_1_6_3(inputs) + - MirrorFunc.Account_C22_1_6_4(inputs) - ) - - - # def Account_C22_1_6_1(inputs): - # Vacuum Vessel - # Tracked in radial builds and folded into blanket - # return(0) - - - @staticmethod - def Account_C22_1_6_2(inputs): - # Helium Liquefier-Refrigerators (not for magnets) - # Presumably for a full vessel cryostat? - return(0) - - @staticmethod - def Account_C22_1_6_3(inputs): - - #VACUUM PUMPING 22.1.6.3 - #assume 1 second vac rate - #cost of 1 vacuum pump, scaled from 1985 dollars - cost_pump = 40000 - #48 pumps needed for 200^3 system - vpump_cap = 200/48 #m^3 capable of beign pumped by 1 pump - no_vpumps = inputs['Vacuum Volume']/vpump_cap#Number of vacuum pumps required to pump the full vacuum in 1 second - return(no_vpumps*cost_pump/1e6) - - - @staticmethod - def Account_C22_1_6_4(inputs): - # Roughing Pump - return(120000*2.85/1e6) - - @staticmethod - def Account_C22_1_7(inputs): - # Power Supplies - - # Not using Woodruff 2024 as that is based on ITER fusion power - # Heating and magnets are tracked elsewhere - - # #Scaled relative to ITER for a 500MW fusion power syste - # lcredit = 0.5# learning credit. - # C220107 = 269.6 * PNRL/500*lcredit #cost in kIUA - # C220107 = C220107*2 #assuming 1kIUA equals $2 M - - return(0) - - @staticmethod - def Account_C22_1_8(inputs): - # Divertor - return(0) - - @staticmethod - def Account_C22_1_9(inputs): - # Direct Energy Convertor - # Not using Woodruff 2024 numbers here, but instead Woodruff 2022 - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - return(1.7347 * inputs['DEC Electrical Power'] * cost_factor) - - @staticmethod - def Account_C22_1_11(inputs): - # Assembly and Installation Costs - - #Cost Category 22.1.11 Installation costs - axis_t = inputs['Overall Length']/(2*np.pi) #[m] distance from r=0 to plasma central axis - effectively major radius - axis_ir = axis_t - - # Define labor rate - lr = 1600 / 1e6 # 1600 dollars per day for skilled labor - - # Calculations - constructionworker = 20 * axis_ir / 4 - C_22_1_11_in = inputs['Number of Modules'] * inputs['Construction Time'] * (lr * 20 * 300) - C_22_1_11_1_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # 22.1 first wall blanket - C_22_1_11_2_in = inputs['Number of Modules'] * ((lr * 150 * constructionworker) + 0) # 22.2 shield - C_22_1_11_3_in = inputs['Number of Modules'] * ((lr * 100 * constructionworker) + 0) # coils - C_22_1_11_4_in = inputs['Number of Modules'] * ((lr * 30 * constructionworker) + 0) # supplementary heating - C_22_1_11_5_in = inputs['Number of Modules'] * ((lr * 60 * constructionworker) + 0) # primary structure - C_22_1_11_6_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # vacuum system - C_22_1_11_7_in = inputs['Number of Modules'] * ((lr * 400 * constructionworker) + 0) # power supplies - C_22_1_11_8_in = 0 # guns or divertor - C_22_1_11_9_in = inputs['Number of Modules'] * ((lr * 200 * constructionworker) + 0) # direct energy converter - C_22_1_11_10_in = 0 # ECRH - - # Total cost calculations - C220111 = (C_22_1_11_in + C_22_1_11_1_in + C_22_1_11_2_in + C_22_1_11_3_in + C_22_1_11_4_in + C_22_1_11_5_in + C_22_1_11_6_in + C_22_1_11_7_in + C_22_1_11_8_in + C_22_1_11_9_in + C_22_1_11_10_in) - - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - - return(C220111 * cost_factor) - - @staticmethod - def Account_C22_2(inputs): - # Main and Secondary Coolant - return( - MirrorFunc.Account_C22_2_1(inputs) + - MirrorFunc.Account_C22_2_2(inputs) + - MirrorFunc.Account_C22_2_3(inputs) - ) - - @staticmethod - def Account_C22_2_1(inputs): - # Primary Coolant - return(166 * (inputs['Number of Modules'] * inputs['Gross Electric Power']/1000)) - - @staticmethod - def Account_C22_2_2(inputs): - # Secondary Coolant - return(40.6 * (inputs['Thermal Power']/3500)**0.55) - - @staticmethod - def Account_C22_2_3(inputs): - # Tertiary Coolant - return(0) - - @staticmethod - def Account_C22_3(inputs): - # Auxiliary Cooling Systems - return(1.10 * 1e-3 * inputs['Number of Modules'] * inputs['Thermal Power'] * 2.02) - - @staticmethod - def Account_C22_4(inputs): - # Radioactive Waste Treatment - return(1.96 * 1e-3 * inputs['Thermal Power'] * 2.02) - - @staticmethod - def Account_C22_5(inputs): - # Cost Category 22.5 Fuel Handling and Storage - - inflation = 1.43 - C2205010ITER = 20.465 * inflation - C2205020ITER = 7 * inflation - C2205030ITER = 22.511 * inflation - C2205040ITER = 9.76 * inflation - C2205050ITER = 22.826 * inflation - C2205060ITER = 47.542 * inflation - # C22050ITER = C2205010ITER + C2205020ITER + C2205030ITER + C2205040ITER + C2205050ITER + C2205060ITER #ITER inflation cost - - - lcredit = 0.8 # learning curve - ltoak = 10**(np.log10(lcredit) / np.log10(2)) - - - C220501 = C2205010ITER * ltoak - C220502 = C2205020ITER * ltoak - C220503 = C2205030ITER * ltoak - C220504 = C2205040ITER * ltoak - C220505 = C2205050ITER * ltoak - C220506 = C2205060ITER * ltoak - C220500 = C220501 + C220502 + C220503 + C220504 + C220505 + C220506 #ITER inflation cost - - cost_factor = (0.80)**(np.log(inputs['Unit Number'])/np.log(2)) - - return(C220500 * cost_factor) - - @staticmethod - def Account_C22_6(inputs): - # Cost Category 22.6 Other Reactor Plant Equipment - return(11.5*(np.max((inputs['Net Electric Power'],0))/1000)**(0.8)) - - @staticmethod - def Account_C22_7(inputs): - # Cost Category 22.7 Instrumentation and Control - return(85) - - @staticmethod - def Account_C23(inputs): - # Turbine Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.219 *1.15) - - @staticmethod - def Account_C24(inputs): - # Electric Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.054 * 1.15) - - @staticmethod - def Account_C25(inputs): - # Miscellaneous Plant Equipment - return(inputs['Number of Modules'] * inputs['Gross Electric Power'] * 0.038 * 1.15) - - @staticmethod - def Account_C26(inputs): - # Heat Rejection - return(inputs['Number of Modules'] * inputs['Net Electric Power'] * 0.107 * 1.15 ) - - @staticmethod - def Account_C27(inputs): - # Special Materials - # Total elsewhere, implement later - return(0) - - @staticmethod - def Account_C28(inputs): - # Digital Twin - return(5) - - @staticmethod - def Account_C29(inputs): - # Contingency on Direct Capital Costs - - # I may have to change the way that I do sums as this must be done separately? - # C21 = sum(C21.1 + C21.2 + ...) - - # Rollup - - if not(inputs['NOAK']) and inputs['Contingency']: - return(0.1 * ( - MirrorFunc.Account_C21(inputs) + - MirrorFunc.Account_C22(inputs) + - MirrorFunc.Account_C23(inputs) + - MirrorFunc.Account_C24(inputs) + - MirrorFunc.Account_C25(inputs) + - MirrorFunc.Account_C26(inputs) + - MirrorFunc.Account_C27(inputs) + - MirrorFunc.Account_C28(inputs))) - else: - return(0) - - - ### Other Methods: ### - @staticmethod - def PbLi_density(f_6Li=0.075, T=300): - """ - Returns PbLi density [kg/m^3]. Assumes the PbLi is a eutectic, which has - roughly 83% Pb and 17% Li. - - Parameters - ---------- - f_6Li : float, optional - Fraction of 6Li to all Li, aka enrichment. The default is 0.075. - T : float, optional - Temperature. Units are °C. The default is 300. - - Returns - ------- - Density of PbLi at selected parameters. - - """ - - f_6Li_natural = 0.075 - rho_6Li = 0.460e3 # kg/m^3 - rho_7Li = 0.537e3 # kg/m^3 - - T_K = T + 273.15 # K - - # Use equation for density as function of temperature from below, Table 1 - # Note this is valid only from 508 K to 880 K (234.85 °C to 606.85 °C) - # https://pubs.aip.org/aip/jcp/article-abstract/27/5/1033/204623/Bulk-Density-of-Separated-Lithium-Isotopes?redirectedFrom=PDF - rho_PbLi = 10520.35 - 1.19051 * T_K - - - # Correct calculated density for enrichment - rho_PbLi = rho_PbLi * (rho_6Li * f_6Li + rho_7Li * (1-f_6Li)) / (rho_6Li * f_6Li_natural + rho_7Li * (1-f_6Li_natural)) - - return(rho_PbLi) - - @staticmethod - def Li_price(f_6Li=0.075): - """ - Return Li price (USD/kg) for enrichment levels above 90% 6Li - - Parameters - ---------- - f_6Li : TYPE, optional - DESCRIPTION. The default is 0.075. - - Returns - ------- - None. - - """ - - # https://www.dailymetalprice.com/lithium.html - # From 2024-04-01 - P_6Li075 = 15.152 # USD/kg - - if f_6Li == 0.075: - return(P_6Li075) - - elif f_6Li >= 0.90: - # From Woodruff for 90% 6Li - P_6Li90 = 70 # USD/kg - - # El-Guebaly 2011 (AIRES-AT UK Study) - # P_6Li90 = 2400.0 #USD/kg - - - f = [0.90, 0.99, 0.999, 0.9999, 0.99999] - Cf = [1, 2, 4, 8, 16] - - f_interp = scipy.interpolate.interp1d(f, Cf) - return(f_interp(f_6Li) * P_6Li90) - - else: - print('Lithium pricing at this enrichment level not supported') - return() - - @staticmethod - def PbLi_price(f_6Li, P_Pb): - - # Assuming eutectic fractions - f_Li = 0.17 - f_Pb = 1 - f_Li - - P_Li = MirrorFunc.Li_price(f_6Li) - - P_PbLi = f_Pb * P_Pb + f_Li * P_Li # USD/kg - - return(P_PbLi) - @staticmethod - def V_cylindrical_shell(r_in, r_out, L): - """ - Return volume of a cylindrical shell - - Parameters - ---------- - r_in : float, inner radius - r_out : float, outer radius - L : float, length - - Returns - ------- - Volume (float). - - """ - return(np.pi * L * (r_out**2 - r_in**2)) - - @staticmethod - def V_inverse_triangular_washer(z, r_in, r_out): - """ - Return volume of cylindrical inverse triangular washer. - From the ASCII art below you can see how this is used for magnet shielding. - - ^ z - | - | z - |\ | /| - | \ | / | - | \ | / | - | \ | / | - | \ | / | - | \ | / | - ------------------------------------> r - r_in r_out - - Parameters - ---------- - z : float, z extent of triangle - r_in : float, inner radius of triangle - r_out : float, outer radius of triangle - - Returns - ------- - Volume (float). - - """ - - - # https://www.wolframalpha.com/input?i=integral+of+2+pi+r+%28+z*r+%2F+%28b-a%29++-+z*a+%2F+%28b-a%29+%29+dr+from+a+to+b - - return(np.pi * z / 3 * (r_out - r_in) * (r_in + 2 * r_out)) - @staticmethod - def generate_inputs( - - application='heat', - - P_f=1, P_f_L=1, P_f_EP=1, - P_NBI=1, P_ECH=1, P_ICRH=1, - M_n=1.1, - - N_module=1, - - f_pump=0.03, f_sub=0.04, f_cryo=0.01, - - # Obsolete but kept for backwards compatibility - P_pump=1, P_sub_cont=1, P_cryo=1, - P_pfcool=0, P_thcool=0, P_coils=0, P_aux=1, - - eta_th=0.50, eta_DEC=0.90, eta_pump=0.98, - eta_NBI=0.50, eta_ECH=0.50, eta_ICRH=0.50, - - verbose=False, exact=False, - NOAK=False, n_unit=False, - construction_time=6, - lifetime=30, replacement=10, availability=0.90, - discount=0.0245, - LSA=2, - cost_file='woodruff-data.csv', method='new', - include_decommissioning=False, include_tax=False, - include_licensing=False, include_contingency=False, - - hf_magnet_length=1, - hf_magnet_shielding_thickness=1, - - a_EC=1, - expander_cell_vessel_thickness=0.01, - expander_cell_vessel_material='SS316', - - vacuum_gap_CC=0.01, - first_wall_material='W', - first_wall_thickness=0.01, - vacuum_vessel_material='SS316', - vacuum_vessel_thickness=0.01, - multiplier_material='Pb', - multiplier_thickness=0.01, - blanket_coolant_material='Natural PbLi', - blanket_thickness=1.00, - blanket_coolant_fraction=0.90, - blanket_structural_material='SS316', - blanket_structural_fraction=0.10, - outer_vessel_thickness=0.01, - - L_EP=1, - L_EC=1, - a_CC=1, - a_EP=1, - - save=True, - load=False, - filename=None, - run_name=None - - ): - - """ - Return a dict containing all inputs for a techno-economic analysis. - - Parameters - ---------- - application : str, optional - The application, either 'electricity' or 'heat'. - This changes the power balance and some reporting. The default - is 'heat'. - P_f : float - The total fusion power in MW. The length of the central cell - is scaled to achieve this value. This is not the net electrical power! - P_f_L : float - The central cell linear fusion power in MW/m. - P_f_EP : float - The fusion power in each of two end plugs in MW. - P_NBI : float - The applied NBI power in MW. - P_ECH : float - The applied ECH power in MW. - P_ICRH : float - The applied ICRH power in MW. - M_n : float - The neutron power multiplication factor from the blanket. - The default is 1.1. - N_module : int - The number of modules (fusion machines) per facility. - This is deprecated. The default is 1. - f_pump : float - The pumping power fraction (of M_n * P_fusion). The default is 0.03. - f_sub : float - The subsystem power fraction (of fusion power). The default is 0.04. - f_cryo : float - The cryogenic power fraction (of fusion power). The default is 0.01. - P_pump : float - The pumping power in MW. This is deprecated. - P_sub_cont : float - The subsystem and control power in MW. This is deprecated. - P_cryo: float - The cryo power in MW. The default is 0.5 MW. This is deprecated. - P_pfcool : float - The PF cooling power in MW. The default is 0. This is deprecated. - P_thcool : float - The thermal cooling power in MW. The default is 0. This is deprecated. - P_coils : float - The magnetic coil power in MW. The default is 0. - P_aux : float - The auxiliary power in MW. The default is 9.4. - - eta_th : float - The thermal conversion efficiency. - eta_DEC : float - The DEC conversion efficiency. The default is 0.90. - eta_pump : float - The pumping efficiency. The default is 0.98. - eta_NBI : float - The NBI electrical efficiency. - eta_ECH : float - The ECH electrical efficiency. - eta_ICRH : float - The ICRH electrical efficiency. - - LSA : int - The level of safey assurance. The default is 2. This is deprecated. - - construction_time : int - The construction time in years. The default is 6. - NOAK : bool - Whether this is an NOAK device. The default is False. - This will probably be deprecated soon. - n_unit : int or bool - The number of the tandem unit, in terms of first of a kind (1), - second of a kind (2), etc. When this is False, the FOAK cost is used. - The default is False. - lifetime : int - The lifetime of the tandem in years. This is used for LCOE and LCOH - calcualtions. The default is 30. - replacement : int - The replacement interval of the magnets in years. The default is 10. - availability : float - The facility availability. The range is between 0 and 1, inclusive. - The default is 0.90. - cost_file : str - The filename of the cost file. The default is 'woodruff-data.csv'. - method : str - The power balance method. The default is 'new'. - This will be deprecated soon. - include_tax : bool - Whether to include tax. The default is False. - include_decommissioning : bool - Whether to include decommissioning. The default is False. - include_licensing : bool - Whether to include licensing. The default is False. - include_contingency : bool - Whether to include continency. The default is False. - verbose : bool - Whether to print a lot. The default is False. - vacuum_gap_CC : float - The vacuum gap in the central cell, in meters. The default is 0.01. - first_wall_material : str - The first wall material. The default is 'W'. - first_wall_thickness : float - The first wall thickness, in meters. The default is 0.01. - vacuum_vessel_material : str - The vacuum vessel material. The default is 'SS316'. - vacuum_vessel_thickness : float - The vacuum vessel thickness, in meters. The default is 0.01 - multiplier_material : str - The muliplier material. The default is 'Pb' - multiplier_thickness : float - The multiplier thickness, in meters. The default is 0.01. - blanket_coolant_material : str - The blanket coolant material. The default is 'Natural PbLi'. - blanket_thickness : float - The blanket thickness, in meters. The default is 1.00. - blanket_coolant_fraction : float - The blanket coolant fraction, from 0 to 1. The default is 0.90. - blanket_structural_material : str - The blanket structural material. The default is 'SS316'. - blanket_structural_fraction : float - The blanket structural fraction, from 0 to 1. The default is 0.10. - outer_vessel_thickness : float - The outer vessel thickness, in meters. The default is 0.01. - contours : bool - Whether to plot contours of discount rates and build time. - The default is False. - tornadoes : bool - Whether to plot tornado plots. These take a while to make. - The default is False. - - hf_magnet_length : float - The axial length of the HF magnet, in meters. The default is 1.0. - hf_magnet_shielding_thickness : - The default is 1.0, - - a_EC : float - The expander cell radius, in meters. The default is 1.0. - expander_cell_vessel_thickness : float - The expander cell vessel thickness, in meters. The default is 0.01. - expander_cell_vessel_material : str - The expander cell vessel material. The default is 'SS316'. - - - - L_EP : float - The length of each end plug, in meters. The default is 1. - L_EC : float - The length of each expander cell, in meters, measured from the - centers of the HF coils. The default is 1. - a_CC : float - The central cell plasma radius, in meters. The default is 15. - a_EP : float - The end plug plasma radius, in meters. The default is 1. - - - - - save : bool - Whether to save the results. The default is True. - load : bool - Whether to load results. The default is False. - filename : str - The filename loading. The default is None. - run_name : str - A run name for saving results. The default is None. - - - """ - - if load: - with open(filename) as file: - inputs = json.load(file) - - else: - - # Fusion Power in Central Cell - P_f_CC = P_f - 2 * P_f_EP - - # Central Cell Length - L_CC = P_f_CC/P_f_L - - # Central Field Coil Spacing - L_CF = 1.0 - - # Overall Device Length - L = L_CC + 2 * L_EP + 2 * L_EC - - # Vacuum Volume - Not precise, but also not important - # Should be updated - V_vac = L * np.pi * a_EC**2 - - - # Power Balance - P_alpha = P_f * MirrorFunc.E_alpha / MirrorFunc.E_DT # MW, alpha power - P_n = P_f - P_alpha # MW, neutron power - - # Input electrical power - P_ine = P_NBI/eta_NBI + P_ICRH/eta_ICRH + P_ECH/eta_ECH - - # Balance of Plant - P_pump = f_pump * M_n * P_n - P_sub_cont = f_sub * P_f - P_cryo = f_cryo * P_f - P_other = P_pump + P_sub_cont + P_cryo - - # Total heating input power applied to plasma - P_in = P_NBI + P_ICRH + P_ECH - - # Heat in blanket including neutron multiplication - # P_thermal_only = M_n * P_n - - # Thermal power - # No P_in term as that goes to DEC - P_th = M_n * P_n + eta_pump * P_pump - - # Thermal electric power - P_the = eta_th * P_th - - # DEC receives all charged particle exhaust, so is the sum of - # both the input power and alpha power - P_DEC = P_in + P_alpha - - # DEC electrical power - P_DECe = eta_DEC * P_DEC - - # Gross electrical power - # Differs for application - if application.lower()=='electricity': - # Electrical application uses thermal power to create electricity - P_egross = P_DECe + P_the - elif application.lower()=='heat': - # Heat application only uses DEC to create electricity - P_egross = P_DECe - - # Net electrical power - P_enet = P_egross - (P_ine + P_other) - - f_aux = P_aux / P_egross - # P_loss = P_th - P_the - P_DECe - # P_sub = f_sub * P_the - - # Scientific Q - Q_sci = P_f / P_in - - # Engineering Q - Q_eng = P_egross / (P_ine + P_other) - - # Recirculating power - f_refrac = 1 / Q_eng - if run_name==None: - run_name = '{:.1f}-MW'.format(float(P_f)) - - - cost_file_full = pkg_resources.resource_filename('TEAm_public', cost_file) - - inputs = { - - # Application (heat or electricity) - 'Application':application, - 'Method':method, - - # Power Balance - 'Fusion Power': P_f, - 'Alpha Power': P_alpha, - 'Neutron Power': P_n, - 'Neutron Energy Multiplication': M_n, - # 'Thermal Only Power': P_thermal_only, - 'Thermal Power': P_th, - 'Thermal Conversion Efficiency': eta_th, - - # DEC - 'DEC Efficiency': eta_DEC, - 'DEC Electrical Power': P_DECe, - 'DEC Input Power': P_DEC, - - # Balance - 'Thermal Electric Power': P_the, - 'Gross Electric Power': P_egross, - 'Net Electric Power': P_enet, - - # Other Power - 'Other Power': P_other, - 'Pumping Power Fraction': f_pump, - 'Pumping Power': P_pump, - 'Subsystem and Control Power': P_sub_cont, - 'Auxiliary Power Fraction': f_aux, - 'Auxiliary Power': P_aux, - - # Input Power - 'Applied Heating Power': P_in, - 'Applied Heating Power Electrical Use': P_ine, - 'NBI Power': P_NBI, - 'ICRH Power': P_ICRH, - 'ECH Power': P_ECH, - 'NBI Electrical Efficiency': eta_NBI, - 'ICRH Electrical Efficiency': eta_ICRH, - 'ECH Electrical Efficiency': eta_ECH, - - # Q - 'Scientific Q': Q_sci, - 'Engineering Q': Q_eng, - 'Recirculating Power Fraction': f_refrac, - - # Don't use this - it is probably not implemented well here - 'Number of Modules': N_module, - - # Time Intervals - 'Construction Time':construction_time, - 'Lifetime':lifetime, - 'Replacement Time':replacement, - 'Level of Safety Assurance':LSA, - - # Geometry - 'Overall Length':L, - 'Central Cell Length':L_CC, - 'End Plug Length':L_EP, - 'Expander Length':L_EC, - 'Vacuum Volume':V_vac, - - # Number of Magnets - 'HF Magnet Number':4, # Always 4 for a tandem - 'LF Magnet Number':2, # Set to what you need! - 'CF Magnet Spacing':L_CF, - 'CF Magnet Number':L_CC/L_CF, # Calcuated - - 'HF Magnet Length':hf_magnet_length, - 'HF Magnet Shielding Thickness':hf_magnet_shielding_thickness, - - 'End Plug Plasma Radius':a_EP, - - 'Expander Cell Length':L_EC, - 'Expander Cell Radius':a_EC, - 'Expander Cell Vessel Thickness':expander_cell_vessel_thickness, - 'Expander Cell Vessel Material':expander_cell_vessel_material, - - 'Central Cell Plasma Radius':a_CC, - 'Central Cell Vacuum Gap':vacuum_gap_CC, - 'First Wall Material':first_wall_material, - 'First Wall Thickness':first_wall_thickness, - 'Vacuum Vessel Material':vacuum_vessel_material, - 'Vacuum Vessel Thickness':vacuum_vessel_thickness, - 'Multiplier Material':multiplier_material, - 'Multiplier Thicnkess':multiplier_thickness, - 'Blanket Coolant Material':blanket_coolant_material, - 'Blanket Thickness':blanket_thickness, - 'Blanket Coolant Fraction':blanket_coolant_fraction, - 'Blanket Structural Material':blanket_structural_material, - 'Blanket Structrual Fraction':blanket_structural_fraction, - 'Outer Vessel Thickness':outer_vessel_thickness, - - # Economic Factors - 'Availability':availability, - 'Discount':discount, - 'NOAK': NOAK, - 'Unit Number':n_unit, - # 'Cost File':cost_file, - 'Cost File':cost_file_full, - 'Licensing':include_licensing, - 'Tax':include_tax, - 'Decommissioning':include_decommissioning, - 'Contingency':include_contingency, - - # File Prefix - 'Run Name':run_name - - } - - if save: - # import csv - - filename = 'inputs-'+inputs['Run Name']+'.json' - - - with open(filename, 'w') as file: - json.dump(inputs, file) - - if verbose: - - format_string = '{:35s} {:8.2f}' - - print('{:35s} {:8s}'.format('Parameter', 'Value')) - - for key in inputs: - print(format_string.format(key, inputs[key])) - - return(inputs) - @staticmethod - def create_radial_build(name, material, thickness, f_vol=1.00): - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[0.0], - 'r_out':[thickness], - 'f_vol':[f_vol]}) - - return(new_data) - @staticmethod - def add_new_layer(data, name, material, thickness, f_vol=1.00): - - # Inner radius is outer radius from last row - r_in = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_in+thickness], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def add_fractional_layer(data, name, material, f_vol=1.00): - - # Inner radius is inner radius from last row - r_in = data['r_in'].values[-1] - r_out = data['r_out'].values[-1] - - new_data = pd.DataFrame(data={ - 'name':[name], - 'material':[material], - 'r_in':[r_in], - 'r_out':[r_out], - 'f_vol':[f_vol]}) - - return(pd.concat([data, new_data], ignore_index=True)) - @staticmethod - def build_central_cell(inputs): - - radial_build = MirrorFunc.create_radial_build('Plasma', 'DT', inputs['Central Cell Plasma Radius']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Gap', 'vacuum', inputs['Central Cell Vacuum Gap']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'First Wall', inputs['First Wall Material'], inputs['First Wall Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', inputs['Vacuum Vessel Material'], inputs['Vacuum Vessel Thickness']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Multiplier', inputs['Multiplier Material'], inputs['Multiplier Thicnkess']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Blanket Coolant', inputs['Blanket Coolant Material'], inputs['Blanket Thickness'], inputs['Blanket Coolant Fraction']) - radial_build = MirrorFunc.add_fractional_layer(radial_build, 'Blanket Structure', inputs['Blanket Structural Material'], inputs['Blanket Structrual Fraction']) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Outer Vessel', inputs['Vacuum Vessel Material'], inputs['Outer Vessel Thickness']) - - return(radial_build) - - @staticmethod - def central_cell_cost(inputs, L=1.0): - return(MirrorFunc.central_cell(inputs, L=L)['cost'].max()) - - @staticmethod - def central_cell(inputs, L=1.0): - - filename = inputs['Cost File'] - - cost_data = pd.read_csv(filename, index_col=0) - - radial_build = MirrorFunc.build_central_cell(inputs) - - - - T = 300 # °C, mean coolant temperture - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - # print(radial_build.to_string()) - - # print(radial_build) - - # Iterate over layer in radial build and calculate volume and cost - for i in range(len(radial_build)): - - material = radial_build['material'][i] - # print(material) - - ''' - PbLi is a special case as the enrichment and temperature affect - the density and cost. Here the code expects a percent enrichment as - shown here: - 'Natural PbLi' meaning '7.5% PbLi' - '93% PbLi' or similar - ''' - if 'PbLi' in material: - - if 'Natural' in material: - f_6Li = 0.075 - elif '% ' in material: - f_6Li = float(material.split('% ')[0])/100 - else: - print('Unable to parse coolant', material) - - radial_build.loc[i, 'density'] = MirrorFunc.PbLi_density(f_6Li=f_6Li, T=T) - radial_build.loc[i, 'price'] = MirrorFunc.PbLi_price(f_6Li, cost_data.loc['Pb']['price']) - radial_build.loc[i, 'manufacturing_factor'] = 1.0 - - - else: - - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - - - - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})], ignore_index=True) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - # print() - # print('Radial build for L =', L) - # print(radial_build.to_string()) - - return(radial_build) - - # Return total cost only - # return(radial_build['cost'].max()) - - @staticmethod - def expander_cell_cost(inputs): - """ - Each expander cell is made up of: - A cylindrical vessel - A DEC convertor - - - Returns - ------- - None. - - """ - - # print('Expander Cell') - - L = inputs['Expander Cell Length'] - radius = inputs['Expander Cell Radius'] - thickness = inputs['Expander Cell Vessel Thickness'] - vv_material = inputs['Expander Cell Vessel Material'] - - filename = inputs['Cost File'] - - cost_data = pd.read_csv(filename, index_col=0) - - # Cylindrical shell - - radial_build = MirrorFunc.create_radial_build('Gap', 'vacuum', radius) - radial_build = MirrorFunc.add_new_layer(radial_build, 'Vacuum Vessel', vv_material, thickness) - - radial_build['volume'] = np.pi * L * (radial_build['r_out']**2 - radial_build['r_in']**2) * radial_build['f_vol'] - - for i in range(len(radial_build)): - - material = radial_build['material'][i] - radial_build.loc[i, 'density'] = cost_data.loc[material]['density'] - radial_build.loc[i, 'price'] = cost_data.loc[material]['price'] - radial_build.loc[i, 'manufacturing_factor'] = cost_data.loc[material]['manufacturing_factor'] - radial_build.loc[i, 'mass'] = radial_build['volume'][i] * radial_build['density'][i] - radial_build.loc[i, 'cost'] = radial_build['price'][i] * radial_build['mass'][i] * radial_build['manufacturing_factor'][i] - - # Add totals to last row - radial_build = pd.concat([radial_build, pd.DataFrame(data={ - 'name':['Total'], - 'cost':[radial_build['cost'].sum()], - 'mass':[radial_build['mass'].sum()]})]) - - radial_build['cost_percent'] = 100 * radial_build['cost'] / radial_build['cost'].max() - - # print(radial_build.to_string()) - - # End cap - V_end_cap = np.pi * thickness * radius**2 - M_end_cap = V_end_cap * cost_data.loc[vv_material]['density'] - C_end_cap = M_end_cap * cost_data.loc[vv_material]['price'] * cost_data.loc[vv_material]['manufacturing_factor'] - - # print('End Cap: $', C_end_cap) - # print('Cylindrical Part: $', radial_build['cost'].max()) - - total = 2*C_end_cap + radial_build['cost'].max() - - # print('Total: $', total) - - return(total) - - @staticmethod - def HF_magnet_shield_cost(inputs, verbose=False): - """ - The HF coils have annular shield with a U-shaped cross section: - - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - \ | | / - \ | | / - \ | | / - \| |/ - +--------+ - - - - - - - - - - - - - - Center Line - - - +--------+ - /| |\ - / | | \ - / | | \ - / | | \ - +----+--------+----+ - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - | |xxxxxxxx| | - +----+--------+----+ - - - """ - - # Shielding thickness should be on the same order as the bore radius (~30 cm - 1m) - # It's a reasonable assumption to say that all axial widths/layers will be the same - - - filename = inputs['Cost File'] - cost_data = pd.read_csv(filename, index_col=0) - - # Eventually these will be arguments - material = 'W' - a_M = 0.15 # From Frank - a_CC = 0.54 # From Frank - a_0 = 0.7 - - # Radially Inner Cylinder - # length = 4.5 # End plug length from Frank - length = 0.5 # Is this the required shielding thickness? - a_M = 0.15 - r_gap = 0.1 # General advice via Hitarth: lower inner radius -> thicker shielding - r_vv = 0.01 # Reduced from 0.1 to 0.01 - - # r_magnet = 1.0 # original - r_magnet = 1.5 # From Frank and confirmed (1.45) in magnet cost guesses - r_cryostat = 1.0 - - f_vol = 0.90 - - - r_in = a_M + r_gap + r_vv - r_out = r_magnet - r_cryostat - - V_radially_inner_cylinder = MirrorFunc.V_cylindrical_shell(r_in, r_out, length) * f_vol - - # Central Cell Cylinder - # length_cc_cylinder = 50.0 - length_cc_cylinder = 0.5 - r_in_cc = a_CC + r_gap + r_vv - # r_out_cc = 1.0 - r_out_cc = r_in_cc+0.5 - - V_cc_cylinder = MirrorFunc.V_cylindrical_shell(r_in_cc, r_out_cc, length_cc_cylinder) * f_vol - - # Central Cell Triangular Washer - V_cc_triangle = MirrorFunc.V_inverse_triangular_washer(length_cc_cylinder, r_in, r_in_cc) * f_vol - - # End Plug Cylinder - length_ep_cylinder = 0.5 # From Frank - r_in_ep = a_0 + r_gap + r_vv - r_out_ep = r_in_ep + 0.5 - - V_ep_cylinder = MirrorFunc.V_cylindrical_shell(r_in_ep, r_out_ep, length_ep_cylinder) * f_vol - - # End Cell Triangular Washer - V_ep_triangle = MirrorFunc.V_inverse_triangular_washer(length_ep_cylinder, r_in, r_in_ep) * f_vol - - # For central cell facing magnet, add up all five regions - V_total_cc_facing = V_radially_inner_cylinder + V_cc_cylinder + V_cc_triangle + V_ep_cylinder + V_ep_triangle - - # For expander cell facing magnet, only add up three regions - # No neutrons come from the expander cell - V_total_ec_facing = V_radially_inner_cylinder + V_ep_cylinder + V_ep_triangle - - # Summary information - V_total = V_total_cc_facing + V_total_ec_facing - mass = cost_data.loc[material]['density'] * V_total - cost = cost_data.loc[material]['price'] * cost_data.loc[material]['manufacturing_factor'] * mass - - return(cost) - - - ### MNyberg's Magnet Methods ### - - # Possibly integrate details from this paper: https://ieeexplore.ieee.org/document/10027193 - # Table 2 should give good general information - # Critical current density from PROCESS - @staticmethod - def jcrit_rebco(temperature, b): - """Critical current density for "REBCO" 2nd generation HTS superconductor - temperature : input real : superconductor temperature (K) - b : input real : Magnetic field at superconductor (T) - jcrit : output real : Critical current density in superconductor (A/m2) - - Will return a negative number if the temperature is greater than Tc0, the - zero-field critical temperature. - """ - tc0 = 90.0 # (K) - birr0 = 132.5 # (T) - a = 1.82962e8 # scaling constant - # exponents - p = 0.5875 - q = 1.7 - alpha = 1.54121 - beta = 1.96679 - oneoveralpha = 1 / alpha - - validity = True - - if (temperature < 4.2) or (temperature > 72.0): - validity = False - if temperature < 65: - if (b < 0.0) or (b > 15.0): - validity = False - else: - if (b < 0.0) or (b > 11.5): - validity = False - - if not validity: - print( - # f"jcrit_rebco: input out of range temperature: {temperature} Field: {b}" - ) - - if temperature < tc0: - # Normal case - birr = birr0 * (1 - temperature / tc0) ** alpha - else: - # If temp is greater than critical temp, ensure result is real but negative. - birr = birr0 * (1 - temperature / tc0) - - if b < birr: - # Normal case - factor = (b / birr) ** p * (1 - b / birr) ** q - jcrit = (a / b) * (birr**beta) * factor - else: - # Field is too high - # Ensure result is real but negative, and varies with temperature. - # tcb = critical temperature at field b - tcb = tc0 * (1 - (b / birr0) ** oneoveralpha) - jcrit = -(temperature - tcb) - - return jcrit, validity - - @staticmethod - def HTS_storedEnergy(field, inner_rad, HTS_temp=20): - radius_in_wham = 6.65 # cm - radius_out_wham = 31.85 # cm - B_wham = 17 # T - cost_wham = 2.3/2 # MUSD - mew_0=1 # TODO if I value is needed change this to be the real constant value - width_ratio = 5 # TODO update - volume_1 = math.pi*(radius_out_wham**2-radius_in_wham**2) - - j_crit_ratio = MirrorFunc.jcrit_rebco(HTS_temp,25*(20/17))[0]/MirrorFunc.jcrit_rebco(15,20)[0] - - # Equation taking into account width and critical current ratios - I_star = B_wham*2*math.pi/(mew_0*(math.log(radius_out_wham)-math.log(radius_in_wham))) - outer_rad=math.exp(field*2*math.pi/(mew_0*I_star*width_ratio*j_crit_ratio)+math.log(inner_rad)) - # Old simple equation - # outer_rad=math.exp((field/(B_wham/(math.log(radius_out_wham)-math.log(radius_in_wham))))+math.log(inner_rad)) - volume_2 = math.pi*(outer_rad**2-inner_rad**2) - ratioOfVols=volume_2/volume_1 - - # From BL paper: https://doi.org/10.1016/j.enpol.2023.113511 - E_ratio=(field/B_wham)**2*ratioOfVols - cost_ratio=E_ratio**0.6 - return cost_ratio*cost_wham - - - @staticmethod - def HF_magnet_cost(inputs, HF_field=25.0, inner_rad=50): - # This is the HF cost per magnet [MUSD], not for all four - - # cost = 29.10 # Assuming ARPA number for WHAM magnet cost, 5x width, using PROCESS J_crit - cost = MirrorFunc.HTS_storedEnergy(HF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['HF Magnet Number'] + 1)/np.log(2)) - - return(cost * cost_factor) - - @staticmethod - def LF_magnet_cost(inputs, LF_field=10.0, inner_rad=50): - # This is the LF cost per magnet [MUSD] - - cost = MirrorFunc.HTS_storedEnergy(LF_field, inner_rad) - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['LF Magnet Number'] + 1)/np.log(2)) - - return(cost * cost_factor) - - @staticmethod - def CF_magnet_cost(inputs, CF_field=3.0): - # This is the CF cost per magnet [MUSD] - - convert_to_currentDollar = 1.31 - cost = 0.7*CF_field*convert_to_currentDollar # Assuming 700k/Tesla in 2016 dollars with 3T LTS - cost_factor = (0.70)**(np.log((inputs['Unit Number']-1)*inputs['CF Magnet Number'] + 1)/np.log(2)) - - return(cost * cost_factor) - - - - - From ce5d51cc4b0ea11cdc360556c94caaab9c8f9079 Mon Sep 17 00:00:00 2001 From: "jia.zhou" <48254033+JiaZhou-PU@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:34:27 -0500 Subject: [PATCH 23/23] Refresh Mirror SQLite database defaults --- src/accertdb.sqlite | Bin 1110016 -> 1110016 bytes src/accertdb_sqlite_schema_data.sql | 467 ++++++++++++++-------------- 2 files changed, 236 insertions(+), 231 deletions(-) diff --git a/src/accertdb.sqlite b/src/accertdb.sqlite index 979ba44b8d3f95be6ab289e1f30d72d428f83f35..6581d517206f2df55da7004a73a19a434048da40 100644 GIT binary patch delta 349 zcmY+9yGjE=6o&WAW;dB+lR1Hy6c$F(7*w*7ODzORCHMdq12#5dti5FegCtc%a9%*P z)xw=Nk04^BV2r)mh&GDxB!%FC?{EJ9+*-qWYgq41r%RRv!ul&{950li6i6jONv5Q& zWJF0vNmt3JlCf*aUrKPOSAAXpTkrV%o3$;yy~L|dlx97fbe}y!q+Ja5O}EVF!98$u zjajDicXm$yRC!e2S9k_?^;?C%yLtaEHlm{!MY;*j^sK`h`48|H4gYiALf`O}1Va9wui75oQYIej)v$qk0Qvrx!h51g1AV{>A)#y)naUwnMX?OeSCt5N((J9dlUW6X5JR z`Gqm23%6EYf7f_S-&J`Qw)AV2zd76gi+O;9T%8jMB1yPJib$JWUA%W7ZQMZIi}9qt zPU~WRksSBu$<|u<#<0xDAo`(Q(GTyr5e&G-Wz3q7M=^pBJ#TizakIM`htvx7+2x*x xcv8TmCB&!6csuBp1~ZFBzgvxa434GSh(u`76L>AgD`iE_yg?NS`z>O diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 0dd0680..052ab39 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6974,6 +6974,7 @@ INSERT INTO mirror_alg VALUES(41,'Account_C22_1_7','c','Account C2217 Rollup','M INSERT INTO mirror_alg VALUES(42,'Account_C22_1_8','c','Account C2218 Rollup','MirrorFunc','reference value','million'); INSERT INTO mirror_alg VALUES(43,'Account_C22_1_9','c','Account C2219 Rollup','MirrorFunc','P_DECe, cost_factor','million'); INSERT INTO mirror_alg VALUES(44,'Account_C22_1_11','c','Account C22111 Rollup','MirrorFunc','L, N_module, construction_time, cost_factor','million'); +INSERT INTO mirror_alg VALUES(45,'Account_C22_2','c','Account C222 Rollup','MirrorFunc','N_module, P_egross, P_th','million'); INSERT INTO mirror_alg VALUES(49,'Account_C22_3','c','Account C223 Rollup','MirrorFunc','N_module, P_th','million'); INSERT INTO mirror_alg VALUES(50,'Account_C22_4','c','Account C224 Rollup','MirrorFunc','P_th','million'); INSERT INTO mirror_alg VALUES(51,'Account_C22_5','c','Account C225 Rollup','MirrorFunc','cost_factor','million'); @@ -6992,9 +6993,9 @@ INSERT INTO mirror_alg VALUES(84,'cal_L','v','Mirror generated variable calculat INSERT INTO mirror_alg VALUES(85,'cal_V_vac','v','Mirror generated variable calculation for V_vac','MirrorFunc','V_vac = L * pi * a_EC**2','m3'); INSERT INTO mirror_alg VALUES(86,'cal_no_vpumps','v','Mirror generated variable calculation for no_vpumps','MirrorFunc','no_vpumps = V_vac / vpump_cap','1'); INSERT INTO mirror_alg VALUES(87,'cal_cost_factor','v','Mirror generated variable calculation for cost_factor','MirrorFunc','cost_factor = 0.80 ** (log(n_unit) / log(2))','1'); -INSERT INTO mirror_alg VALUES(88,'cal_HF_magnet_cost','v','Mirror generated variable calculation for HF_magnet_cost','MirrorFunc','HF_magnet_cost = HTS_storedEnergy(25.0, 50) * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2))','million'); -INSERT INTO mirror_alg VALUES(89,'cal_LF_magnet_cost','v','Mirror generated variable calculation for LF_magnet_cost','MirrorFunc','LF_magnet_cost = HTS_storedEnergy(10.0, 50) * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2))','million'); -INSERT INTO mirror_alg VALUES(90,'cal_CF_magnet_cost','v','Mirror generated variable calculation for CF_magnet_cost','MirrorFunc','CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2))','million'); +INSERT INTO mirror_alg VALUES(88,'cal_HF_magnet_cost','v','Mirror generated variable calculation for HF_magnet_cost','MirrorFunc','HF_magnet_cost = 29.10 * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2)) * sc_mat_scale','million'); +INSERT INTO mirror_alg VALUES(89,'cal_LF_magnet_cost','v','Mirror generated variable calculation for LF_magnet_cost','MirrorFunc','LF_magnet_cost = 6.25262 * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2)) * sc_mat_scale','million'); +INSERT INTO mirror_alg VALUES(90,'cal_CF_magnet_cost','v','Mirror generated variable calculation for CF_magnet_cost','MirrorFunc','CF_magnet_cost = 0.7 * 3.0 * 1.31 * 0.70 ** (log((n_unit - 1) * CF_magnet_number + 1) / log(2)) * sc_mat_scale','million'); INSERT INTO mirror_alg VALUES(91,'cal_P_alpha','v','Mirror generated variable calculation for P_alpha','MirrorFunc','P_alpha = P_f * E_alpha / E_DT','MW'); INSERT INTO mirror_alg VALUES(92,'cal_P_n','v','Mirror generated variable calculation for P_n','MirrorFunc','P_n = P_f - P_alpha','MW'); INSERT INTO mirror_alg VALUES(93,'cal_P_ine','v','Mirror generated variable calculation for P_ine','MirrorFunc','P_ine = P_NBI / eta_NBI + P_ICRH / eta_ICRH + P_ECH / eta_ECH','MW'); @@ -7036,185 +7037,189 @@ CREATE TABLE mirror_var ( INSERT INTO mirror_var VALUES(1,'E_DT','Energy released per deuterium-tritium fusion reaction',2.818234619999999798e-12,'J','','','P_alpha',0); INSERT INTO mirror_var VALUES(2,'E_alpha','Alpha-particle energy released per deuterium-tritium fusion reaction',5.639673600000000402e-13,'J','','','P_alpha',0); INSERT INTO mirror_var VALUES(3,'expander_cell_cost_result','Expander cell vacuum vessel cost from legacy Mirror geometry',0.003960744088457411084,'million','cal_expander_cell_cost_result','L_EC, a_EC, expander_cell_vessel_thickness, SS316_rho, SS316_c_raw, SS316_m','',0); -INSERT INTO mirror_var VALUES(4,'end_plug_cylindrical_part_cost','End plug cylindrical radial-build material cost',0.5031620991790028973,'million','cal_end_plug_cylindrical_part_cost','L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); -INSERT INTO mirror_var VALUES(5,'central_cell_cylindrical_part_cost','Central cell cylindrical radial-build material cost',-0.5031620991790028973,'million','cal_central_cell_cylindrical_part_cost','L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); +INSERT INTO mirror_var VALUES(4,'end_plug_cylindrical_part_cost','End plug cylindrical radial-build material cost',8.258002288365251076,'million','cal_end_plug_cylindrical_part_cost','L_EP, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); +INSERT INTO mirror_var VALUES(5,'central_cell_cylindrical_part_cost','Central cell cylindrical radial-build material cost',429.6644799660716103,'million','cal_central_cell_cylindrical_part_cost','L_CC, a_CC, vacuum_gap_CC, first_wall_thickness, vacuum_vessel_thickness, multiplier_thickness, blanket_thickness, blanket_coolant_fraction, blanket_structural_fraction, outer_vessel_thickness, W_rho, W_c_raw, W_m, SS316_rho, SS316_c_raw, SS316_m, Pb_rho, Pb_c_raw, Pb_m, rho_PbLi, P_PbLi','',0); INSERT INTO mirror_var VALUES(6,'cost_factor','Cost scaling factor calculated from the unit number using an 0.80 learning factor',1.0,'1','cal_cost_factor','n_unit','',0); INSERT INTO mirror_var VALUES(7,'cost_pump','Cost of one vacuum pump, scaled from 1985 dollars',40000.0,'dollar/pump','','','',0); INSERT INTO mirror_var VALUES(8,'vpump_cap','Vacuum volume pumped by one vacuum pump in one second',4.166666666666666963,'m3/pump','','','no_vpumps',0); -INSERT INTO mirror_var VALUES(9,'no_vpumps','Number of vacuum pumps required to pump the full vacuum in one second',2.261946710584650689,'1','cal_no_vpumps','V_vac, vpump_cap','',0); +INSERT INTO mirror_var VALUES(9,'no_vpumps','Number of vacuum pumps required to pump the full vacuum in one second',42.24568142174641139,'1','cal_no_vpumps','V_vac, vpump_cap','',0); INSERT INTO mirror_var VALUES(10,'axis_t','PyFECONS radial build axis thickness',0.0,'m','','','',0); -INSERT INTO mirror_var VALUES(11,'rho_PbLi','PbLi density from legacy Mirror temperature/enrichment correlation',9838.00919350000003,'kg/m3','cal_rho_PbLi','T, f_6Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(11,'rho_PbLi','PbLi density from legacy Mirror temperature/enrichment correlation',9374.55928043616223,'kg/m3','cal_rho_PbLi','T, f_6Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); INSERT INTO mirror_var VALUES(12,'f_Li','Lithium mass fraction in PbLi eutectic mixture',0.1700000000000000122,'1','','','P_PbLi',0); -INSERT INTO mirror_var VALUES(13,'P_Li','Lithium price from legacy Mirror enrichment pricing',15.15199999999999925,'dollar/kg','cal_P_Li','f_6Li','P_PbLi',0); -INSERT INTO mirror_var VALUES(14,'P_PbLi','PbLi price from legacy Mirror eutectic mixture pricing',4.567839999999999457,'dollar/kg','cal_P_PbLi','Pb_c_raw, P_Li, f_Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(15,'P_f_CC','Fusion power assigned to the central cell',-1.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); -INSERT INTO mirror_var VALUES(16,'L_CC','Calculated central cell length',-1.0,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L, central_cell_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(13,'P_Li','Lithium price from legacy Mirror enrichment pricing',912.8441379310344245,'dollar/kg','cal_P_Li','f_6Li','P_PbLi',0); +INSERT INTO mirror_var VALUES(14,'P_PbLi','PbLi price from legacy Mirror eutectic mixture pricing',157.1755034482758618,'dollar/kg','cal_P_PbLi','Pb_c_raw, P_Li, f_Li','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(15,'P_f_CC','Fusion power assigned to the central cell',173.0,'MW','cal_P_f_CC','P_f, P_f_EP','L_CC',0); +INSERT INTO mirror_var VALUES(16,'L_CC','Calculated central cell length',52.0300751879699206,'m','cal_L_CC','P_f_CC, P_f_L','CF_magnet_number, L, central_cell_cylindrical_part_cost',0); INSERT INTO mirror_var VALUES(17,'L_CF','Central-field coil spacing',1.0,'m','cal_L_CF','','CF_magnet_number',0); -INSERT INTO mirror_var VALUES(18,'L','Overall axial length of the Mirror plant',3.0,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); -INSERT INTO mirror_var VALUES(19,'V_vac','Vacuum volume for the Mirror plant',9.42477796076937935,'m3','cal_V_vac','L, a_EC','no_vpumps',0); -INSERT INTO mirror_var VALUES(20,'P_alpha','Fusion alpha-particle power',0.2001137009664582522,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); -INSERT INTO mirror_var VALUES(21,'P_n','Fusion neutron power',0.7998862990335418033,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); -INSERT INTO mirror_var VALUES(22,'P_ine','Injected-power electrical input requirement',70.0,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); -INSERT INTO mirror_var VALUES(23,'P_pump','Pumping power requirement',0.02639624786810687921,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); -INSERT INTO mirror_var VALUES(24,'P_sub_cont','Subsystem control power requirement',0.04000000000000000083,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); -INSERT INTO mirror_var VALUES(25,'P_cryo','Cryogenic power requirement',0.0100000000000000002,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); -INSERT INTO mirror_var VALUES(26,'P_other','Total miscellaneous plant power requirement',0.0763962478681068785,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); -INSERT INTO mirror_var VALUES(27,'P_in','Total injected heating power',35.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); -INSERT INTO mirror_var VALUES(28,'P_th','Recoverable thermal power',158.5050690819081751,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); -INSERT INTO mirror_var VALUES(29,'P_the','Thermal-electric power contribution',0.4528716259238203534,'MW','cal_P_the','eta_th, P_th','P_egross',0); -INSERT INTO mirror_var VALUES(30,'P_DEC','Power available to direct energy conversion',70.01989764480569533,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); -INSERT INTO mirror_var VALUES(31,'P_DECe','Electrical output from direct energy conversion',63.0179078803251329,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); -INSERT INTO mirror_var VALUES(32,'P_egross','Gross electric power',158.1209493283582219,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); -INSERT INTO mirror_var VALUES(33,'P_enet','Net electric power',94.9150046322633188,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); -INSERT INTO mirror_var VALUES(34,'f_aux','Auxiliary power fraction relative to gross electric power',0.03156555460446152512,'1','cal_f_aux','P_aux, P_egross','',0); -INSERT INTO mirror_var VALUES(35,'Q_sci','Scientific fusion gain',0.02857142857142857054,'1','cal_Q_sci','P_f, P_in','',0); -INSERT INTO mirror_var VALUES(36,'Q_eng','Engineering gain',0.4520795021880652519,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); -INSERT INTO mirror_var VALUES(37,'f_refrac','Recirculating power fraction',2.212000312245963496,'1','cal_f_refrac','Q_eng','',0); +INSERT INTO mirror_var VALUES(18,'L','Overall axial length of the Mirror plant',56.0300751879699206,'m','cal_L','L_CC, L_EP, L_EC','V_vac',0); +INSERT INTO mirror_var VALUES(19,'V_vac','Vacuum volume for the Mirror plant',176.0236725906100617,'m3','cal_V_vac','L, a_EC','no_vpumps',0); +INSERT INTO mirror_var VALUES(20,'P_alpha','Fusion alpha-particle power',35.01989766913019508,'MW','cal_P_alpha','E_DT, E_alpha, P_f','P_DEC, P_n',0); +INSERT INTO mirror_var VALUES(21,'P_n','Fusion neutron power',139.980102330869812,'MW','cal_P_n','P_f, P_alpha','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(22,'P_ine','Injected-power electrical input requirement',22.0588235294117645,'MW','cal_P_ine','P_NBI, eta_NBI, P_ICRH, eta_ICRH, P_ECH, eta_ECH','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(23,'P_pump','Pumping power requirement',4.619343376918704003,'MW','cal_P_pump','f_pump, M_n, P_n','P_other, P_th',0); +INSERT INTO mirror_var VALUES(24,'P_sub_cont','Subsystem control power requirement',7.0,'MW','cal_P_sub_cont','f_sub, P_f','P_other',0); +INSERT INTO mirror_var VALUES(25,'P_cryo','Cryogenic power requirement',1.75,'MW','cal_P_cryo','f_cryo, P_f','P_other',0); +INSERT INTO mirror_var VALUES(26,'P_other','Total miscellaneous plant power requirement',13.36934337691870311,'MW','cal_P_other','P_pump, P_sub_cont, P_cryo','P_enet, Q_eng',0); +INSERT INTO mirror_var VALUES(27,'P_in','Total injected heating power',15.0,'MW','cal_P_in','P_NBI, P_ICRH, P_ECH','P_DEC, Q_sci',0); +INSERT INTO mirror_var VALUES(28,'P_th','Recoverable thermal power',158.5050690733371539,'MW','cal_P_th','M_n, P_n, P_pump, eta_pump','P_the',0); +INSERT INTO mirror_var VALUES(29,'P_the','Thermal-electric power contribution',95.1030414440022867,'MW','cal_P_the','eta_th, P_th','P_egross',0); +INSERT INTO mirror_var VALUES(30,'P_DEC','Power available to direct energy conversion',50.01989766913019509,'MW','cal_P_DEC','P_in, P_alpha','P_DECe',0); +INSERT INTO mirror_var VALUES(31,'P_DECe','Electrical output from direct energy conversion',45.01790790221717487,'MW','cal_P_DECe','eta_DEC, P_DEC','P_egross',0); +INSERT INTO mirror_var VALUES(32,'P_egross','Gross electric power',140.1209493462194473,'MW','cal_P_egross','application, P_DECe, P_the','P_enet, Q_eng, f_aux',0); +INSERT INTO mirror_var VALUES(33,'P_enet','Net electric power',104.6927824398889868,'MW','cal_P_enet','P_egross, P_ine, P_other','',0); +INSERT INTO mirror_var VALUES(34,'f_aux','Auxiliary power fraction relative to gross electric power',0.007136691584419247933,'1','cal_f_aux','P_aux, P_egross','',0); +INSERT INTO mirror_var VALUES(35,'Q_sci','Scientific fusion gain',11.66666666666666607,'1','cal_Q_sci','P_f, P_in','',0); +INSERT INTO mirror_var VALUES(36,'Q_eng','Engineering gain',3.955071954941648205,'1','cal_Q_eng','P_egross, P_ine, P_other','f_refrac',0); +INSERT INTO mirror_var VALUES(37,'f_refrac','Recirculating power fraction',0.2528399006118091652,'1','cal_f_refrac','Q_eng','',0); INSERT INTO mirror_var VALUES(38,'T','Mean coolant temperature for legacy PbLi density correlation',300.0,'degC','','','rho_PbLi',0); -INSERT INTO mirror_var VALUES(39,'f_6Li','Lithium-6 enrichment fraction for legacy PbLi pricing',0.07499999999999999723,'1','','','P_Li, rho_PbLi',0); +INSERT INTO mirror_var VALUES(39,'f_6Li','Lithium-6 enrichment fraction for legacy PbLi pricing',0.4000000000000000222,'1','','','P_Li, rho_PbLi',0); INSERT INTO mirror_var VALUES(40,'a_M','HF shield magnet bore/plasma radius from legacy Mirror geometry',0.1499999999999999945,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(41,'a_CC','Legacy Mirror central cell plasma radius',0.5400000000000000355,'m','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(42,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.6999999999999999556,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(43,'length','HF shield radially inner cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(41,'a_CC','Legacy Mirror central cell plasma radius',1.0,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(42,'a_0','HF shield end plug plasma radius from legacy Mirror geometry',0.4699999999999999734,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(43,'length','HF shield radially inner cylinder length',1.5,'m','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(44,'r_gap','HF shield radial gap',0.1000000000000000055,'m','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(45,'r_vv','HF shield vacuum vessel radial thickness allowance',0.0100000000000000002,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(46,'r_magnet','HF shield magnet radius',1.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(47,'r_cryostat','HF shield cryostat radius allowance',1.0,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(46,'r_magnet','HF shield magnet radius',0.5,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(47,'r_cryostat','HF shield cryostat radius allowance',0.4000000000000000222,'m','','','HF_magnet_shield_cost',0); INSERT INTO mirror_var VALUES(48,'f_vol','HF shield volume fill fraction',0.9000000000000000222,'1','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(49,'length_cc_cylinder','HF shield central-cell-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(50,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.5,'m','','','HF_magnet_shield_cost',0); -INSERT INTO mirror_var VALUES(51,'application','Mirror plant application mode used for gross-electric-power logic','heat','1','','','P_egross',0); -INSERT INTO mirror_var VALUES(52,'P_f','Total fusion power',1.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); -INSERT INTO mirror_var VALUES(53,'P_f_L','Fusion power per meter of central cell length',1.0,'MW/m','','','L_CC',0); -INSERT INTO mirror_var VALUES(54,'P_f_EP','Fusion power assigned to each end plug',1.0,'MW','','','P_f_CC',0); -INSERT INTO mirror_var VALUES(55,'P_NBI','Neutral beam injection power',15.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(56,'P_ECH','Electron cyclotron heating power',10.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(57,'P_ICRH','Ion cyclotron resonance heating power',10.0,'MW','','','P_in, P_ine',0); -INSERT INTO mirror_var VALUES(58,'M_n','Neutron energy multiplication factor',1.100000000000000089,'1','','','P_pump, P_th',0); -INSERT INTO mirror_var VALUES(59,'N_module','Number of Mirror plant modules',1.0,'1','','','',0); -INSERT INTO mirror_var VALUES(60,'f_pump','Fraction of neutron power used for pumping',0.02999999999999999889,'1','','','P_pump',0); -INSERT INTO mirror_var VALUES(61,'f_sub','Fraction of fusion power used for subsystem controls',0.04000000000000000083,'1','','','P_sub_cont',0); -INSERT INTO mirror_var VALUES(62,'f_cryo','Fraction of fusion power used for cryogenic load',0.0100000000000000002,'1','','','P_cryo',0); -INSERT INTO mirror_var VALUES(63,'P_pfcool','Plasma-facing-component cooling power',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(64,'P_thcool','Thermal-system cooling power',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(65,'P_coils','Coil power load',0.0,'MW','','','',0); -INSERT INTO mirror_var VALUES(66,'P_aux','Auxiliary plant power',1.0,'MW','','','f_aux',0); -INSERT INTO mirror_var VALUES(67,'eta_th','Thermal conversion efficiency',0.5,'1','','','P_the',0); -INSERT INTO mirror_var VALUES(68,'eta_DEC','Direct energy conversion efficiency',0.9000000000000000222,'1','','','P_DECe',0); -INSERT INTO mirror_var VALUES(69,'eta_pump','Pump heat recovery efficiency',0.979999999999999983,'1','','','P_th',0); -INSERT INTO mirror_var VALUES(70,'eta_NBI','Neutral beam injection wall-plug efficiency',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(71,'eta_ECH','Electron cyclotron heating wall-plug efficiency',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(72,'eta_ICRH','Ion cyclotron resonance heating wall-plug efficiency',0.5,'1','','','P_ine',0); -INSERT INTO mirror_var VALUES(73,'NOAK','Nth-of-a-kind plant flag',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(74,'n_unit','Plant unit number for learning-curve cost scaling',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); -INSERT INTO mirror_var VALUES(75,'construction_time','Construction duration',6.0,'years','','','',0); -INSERT INTO mirror_var VALUES(76,'lifetime','Plant operating lifetime',30.0,'years','','','',0); -INSERT INTO mirror_var VALUES(77,'replacement','Major component replacement interval',10.0,'years','','','',0); -INSERT INTO mirror_var VALUES(78,'availability','Plant availability factor',0.9000000000000000222,'1','','','',0); -INSERT INTO mirror_var VALUES(79,'discount','Real discount rate',0.02450000000000000094,'1','','','',0); -INSERT INTO mirror_var VALUES(80,'LSA','Licensing safety analysis level',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(81,'cost_file','PyFECONS cost data file name','woodruff-data.csv','1','','','',0); -INSERT INTO mirror_var VALUES(82,'method','PyFECONS costing method selector','new','1','','','',0); -INSERT INTO mirror_var VALUES(83,'include_decommissioning','Flag to include decommissioning cost',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(84,'include_tax','Flag to include tax cost',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(85,'include_licensing','Flag to include licensing cost',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(86,'include_contingency','Flag to include contingency cost',0.0,'1','','','',0); -INSERT INTO mirror_var VALUES(87,'hf_magnet_length','High-field magnet axial length',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(88,'hf_magnet_shielding_thickness','High-field magnet shielding thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(89,'a_EC','Expander cell plasma radius',1.0,'m','','','V_vac, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(90,'expander_cell_vessel_thickness','Expander cell vessel wall thickness',0.0100000000000000002,'m','','','expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(91,'expander_cell_vessel_material','Expander cell vessel material','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(92,'vacuum_gap_CC','Central cell radial vacuum gap',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(93,'first_wall_material','Central cell first wall material','W','1','','','',0); -INSERT INTO mirror_var VALUES(94,'first_wall_thickness','Central cell first wall thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(95,'vacuum_vessel_material','Central cell vacuum vessel material','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(96,'vacuum_vessel_thickness','Central cell vacuum vessel thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(97,'multiplier_material','Central cell neutron multiplier material','Pb','1','','','',0); -INSERT INTO mirror_var VALUES(98,'multiplier_thickness','Central cell neutron multiplier thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(99,'blanket_coolant_material','Central cell blanket coolant material','Natural PbLi','1','','','',0); -INSERT INTO mirror_var VALUES(100,'blanket_thickness','Central cell blanket radial thickness',1.0,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(101,'blanket_coolant_fraction','Central cell blanket coolant volume fraction',0.9000000000000000222,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(102,'blanket_structural_material','Central cell blanket structural material','SS316','1','','','',0); -INSERT INTO mirror_var VALUES(103,'blanket_structural_fraction','Central cell blanket structural volume fraction',0.1000000000000000055,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(104,'outer_vessel_thickness','Central cell outer vessel thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(105,'L_EP','End plug axial length',1.0,'m','','','L, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(106,'L_EC','Expander cell axial length',1.0,'m','','','L, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(107,'a_EP','End plug plasma radius',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(108,'HF_magnet_number','Number of high-field magnets',4.0,'1','','','HF_magnet_cost',0); -INSERT INTO mirror_var VALUES(109,'LF_magnet_number','Number of low-field magnets',2.0,'1','','','LF_magnet_cost',0); -INSERT INTO mirror_var VALUES(110,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number','',0); -INSERT INTO mirror_var VALUES(111,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number','',0); -INSERT INTO mirror_var VALUES(112,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number','',0); -INSERT INTO mirror_var VALUES(113,'CF_magnet_number','One CF coil every L_CF m of central cell',52.03007517266450322,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); -INSERT INTO mirror_var VALUES(114,'HF_magnet_shield_cost','HF magnet shield cost per end plug',35.00849418659200297,'million','cal_HF_magnet_shield_cost','a_M, a_CC, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, W_rho, W_c_raw, W_m','',0); -INSERT INTO mirror_var VALUES(115,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','',0); -INSERT INTO mirror_var VALUES(116,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','',0); -INSERT INTO mirror_var VALUES(117,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(118,'firstwall_t','PyFECONS radial build first wall thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(119,'blanket1_t','PyFECONS radial build blanket thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(120,'reflector_t','PyFECONS radial build reflector thickness',0.1000000000000000055,'m','','','',0); -INSERT INTO mirror_var VALUES(121,'ht_shield_t','PyFECONS radial build high-temperature shield thickness',0.25,'m','','','',0); -INSERT INTO mirror_var VALUES(122,'structure_t','PyFECONS radial build support structure thickness',0.2000000000000000111,'m','','','',0); -INSERT INTO mirror_var VALUES(123,'gap1_t','PyFECONS radial build first gap thickness',0.5,'m','','','',0); -INSERT INTO mirror_var VALUES(124,'vessel_t','PyFECONS radial build vessel thickness',0.2000000000000000111,'m','','','',0); -INSERT INTO mirror_var VALUES(125,'coil_t','PyFECONS radial build coil thickness',1.760000000000000008,'m','','','',0); -INSERT INTO mirror_var VALUES(126,'gap2_t','PyFECONS radial build second gap thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(127,'lt_shield_t','PyFECONS radial build low-temperature shield thickness',0.2999999999999999889,'m','','','',0); -INSERT INTO mirror_var VALUES(128,'bioshield_t','PyFECONS radial build bioshield thickness',1.0,'m','','','',0); -INSERT INTO mirror_var VALUES(129,'FS_rho','PyFECONS Ferritic Steel density',7470.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(130,'FS_c_raw','PyFECONS Ferritic Steel raw cost',10.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(131,'FS_m','PyFECONS Ferritic Steel manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(132,'FS_sigma','PyFECONS Ferritic Steel stress limit',450.0,'MPa','','','',0); -INSERT INTO mirror_var VALUES(133,'Pb_rho','PyFECONS Lead density',9400.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(134,'Pb_c_raw','PyFECONS Lead raw cost',2.399999999999999912,'dollar/kg','','','P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(135,'Pb_m','PyFECONS Lead manufacturing multiplier',1.5,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(136,'Li4SiO4_rho','PyFECONS Lithium Silicate density',2390.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(137,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw cost',1.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(138,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(139,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(140,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(141,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(142,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(143,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); -INSERT INTO mirror_var VALUES(144,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(145,'Li_c_raw','PyFECONS Lithium raw cost',70.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(146,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); -INSERT INTO mirror_var VALUES(147,'BFS_rho','PyFECONS BFS density',7800.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(148,'BFS_c_raw','PyFECONS BFS raw cost',30.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(149,'BFS_m','PyFECONS BFS manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(150,'SiC_rho','PyFECONS Silicon Carbide density',3200.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(151,'SiC_c_raw','PyFECONS Silicon Carbide raw cost',14.49000000000000021,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(152,'SiC_m','PyFECONS Silicon Carbide manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(153,'Inconel_rho','PyFECONS Inconel density',8440.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(154,'Inconel_c_raw','PyFECONS Inconel raw cost',46.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(155,'Inconel_m','PyFECONS Inconel manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(156,'Cu_rho','PyFECONS Copper density',7300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(157,'Cu_c_raw','PyFECONS Copper raw cost',10.19999999999999928,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(158,'Cu_m','PyFECONS Copper manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(159,'Polyimide_rho','PyFECONS Polyimide density',1430.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(160,'Polyimide_c_raw','PyFECONS Polyimide raw cost',100.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(161,'Polyimide_m','PyFECONS Polyimide manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(162,'YBCO_rho','PyFECONS YBCO density',6200.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(163,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(164,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(165,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(166,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(167,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(168,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(169,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); -INSERT INTO mirror_var VALUES(170,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); -INSERT INTO mirror_var VALUES(171,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); -INSERT INTO mirror_var VALUES(172,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(173,'Incoloy_c_raw','PyFECONS Incoloy raw cost',4.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(174,'Incoloy_m','PyFECONS Incoloy manufacturing multiplier',2.0,'1','','','',0); -INSERT INTO mirror_var VALUES(175,'Be_rho','PyFECONS Beryllium density',1850.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(176,'Be_c_raw','PyFECONS Beryllium raw cost',5750.0,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(177,'Be_m','PyFECONS Beryllium manufacturing multiplier',3.0,'1','','','',0); -INSERT INTO mirror_var VALUES(178,'Li2TiO3_rho','PyFECONS Lithium Titanate density',3430.0,'kg/m3','','','',0); -INSERT INTO mirror_var VALUES(179,'Li2TiO3_c_raw','PyFECONS Lithium Titanate raw cost',1297.049999999999955,'dollar/kg','','','',0); -INSERT INTO mirror_var VALUES(180,'Li2TiO3_m','PyFECONS Lithium Titanate manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(49,'length_cc_cylinder','HF shield central-cell-facing cylinder length',2.0,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(50,'r_out_cc','HF shield central-cell-facing outer radius',0.8499999999999999778,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(51,'length_ep_cylinder','HF shield end-plug-facing cylinder length',0.4000000000000000222,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(52,'r_out_ep','HF shield end-plug-facing outer radius',0.8499999999999999778,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(53,'application','Mirror plant application mode used for gross-electric-power logic','electricity','1','','','P_egross',0); +INSERT INTO mirror_var VALUES(54,'P_f','Total fusion power',175.0,'MW','','','P_alpha, P_cryo, P_f_CC, P_n, P_sub_cont, Q_sci',0); +INSERT INTO mirror_var VALUES(55,'P_f_L','Fusion power per meter of central cell length',3.325000000000000177,'MW/m','','','L_CC',0); +INSERT INTO mirror_var VALUES(56,'P_f_EP','Fusion power assigned to each end plug',1.0,'MW','','','P_f_CC',0); +INSERT INTO mirror_var VALUES(57,'P_NBI','Neutral beam injection power',15.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(58,'P_ECH','Electron cyclotron heating power',0.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(59,'P_ICRH','Ion cyclotron resonance heating power',0.0,'MW','','','P_in, P_ine',0); +INSERT INTO mirror_var VALUES(60,'M_n','Neutron energy multiplication factor',1.100000000000000089,'1','','','P_pump, P_th',0); +INSERT INTO mirror_var VALUES(61,'N_module','Number of Mirror plant modules',1.0,'1','','','',0); +INSERT INTO mirror_var VALUES(62,'f_pump','Fraction of neutron power used for pumping',0.02999999999999999889,'1','','','P_pump',0); +INSERT INTO mirror_var VALUES(63,'f_sub','Fraction of fusion power used for subsystem controls',0.04000000000000000083,'1','','','P_sub_cont',0); +INSERT INTO mirror_var VALUES(64,'f_cryo','Fraction of fusion power used for cryogenic load',0.0100000000000000002,'1','','','P_cryo',0); +INSERT INTO mirror_var VALUES(65,'P_pfcool','Plasma-facing-component cooling power',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(66,'P_thcool','Thermal-system cooling power',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(67,'P_coils','Coil power load',0.0,'MW','','','',0); +INSERT INTO mirror_var VALUES(68,'P_aux','Auxiliary plant power',1.0,'MW','','','f_aux',0); +INSERT INTO mirror_var VALUES(69,'eta_th','Thermal conversion efficiency',0.5999999999999999778,'1','','','P_the',0); +INSERT INTO mirror_var VALUES(70,'eta_DEC','Direct energy conversion efficiency',0.9000000000000000222,'1','','','P_DECe',0); +INSERT INTO mirror_var VALUES(71,'eta_pump','Pump heat recovery efficiency',0.979999999999999983,'1','','','P_th',0); +INSERT INTO mirror_var VALUES(72,'eta_NBI','Neutral beam injection wall-plug efficiency',0.6800000000000000488,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(73,'eta_ECH','Electron cyclotron heating wall-plug efficiency',0.5999999999999999778,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(74,'eta_ICRH','Ion cyclotron resonance heating wall-plug efficiency',0.9000000000000000222,'1','','','P_ine',0); +INSERT INTO mirror_var VALUES(75,'NOAK','Nth-of-a-kind plant flag',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(76,'n_unit','Plant unit number for learning-curve cost scaling',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, cost_factor',0); +INSERT INTO mirror_var VALUES(77,'construction_time','Construction duration',6.0,'years','','','',0); +INSERT INTO mirror_var VALUES(78,'lifetime','Plant operating lifetime',30.0,'years','','','',0); +INSERT INTO mirror_var VALUES(79,'replacement','Major component replacement interval',10.0,'years','','','',0); +INSERT INTO mirror_var VALUES(80,'availability','Plant availability factor',0.9000000000000000222,'1','','','',0); +INSERT INTO mirror_var VALUES(81,'discount','Real discount rate',0.02999999999999999889,'1','','','',0); +INSERT INTO mirror_var VALUES(82,'LSA','Licensing safety analysis level',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(83,'cost_file','PyFECONS cost data file name','woodruff-data_edited.csv','1','','','',0); +INSERT INTO mirror_var VALUES(84,'method','PyFECONS costing method selector','new','1','','','',0); +INSERT INTO mirror_var VALUES(85,'include_decommissioning','Flag to include decommissioning cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(86,'include_tax','Flag to include tax cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(87,'include_licensing','Flag to include licensing cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(88,'include_contingency','Flag to include contingency cost',0.0,'1','','','',0); +INSERT INTO mirror_var VALUES(89,'hf_magnet_length','High-field magnet axial length',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(90,'hf_magnet_shielding_thickness','High-field magnet shielding thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(91,'a_EC','Expander cell plasma radius',1.0,'m','','','V_vac, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(92,'expander_cell_vessel_thickness','Expander cell vessel wall thickness',0.0100000000000000002,'m','','','expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(93,'expander_cell_vessel_material','Expander cell vessel material','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(94,'vacuum_gap_CC','Central cell radial vacuum gap',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(95,'first_wall_material','Central cell first wall material','W','1','','','',0); +INSERT INTO mirror_var VALUES(96,'first_wall_thickness','Central cell first wall thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(97,'vacuum_vessel_material','Central cell vacuum vessel material','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(98,'vacuum_vessel_thickness','Central cell vacuum vessel thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(99,'multiplier_material','Central cell neutron multiplier material','Pb','1','','','',0); +INSERT INTO mirror_var VALUES(100,'multiplier_thickness','Central cell neutron multiplier thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(101,'blanket_coolant_material','Central cell blanket coolant material','40% PbLi','1','','','',0); +INSERT INTO mirror_var VALUES(102,'blanket_thickness','Central cell blanket radial thickness',0.75,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(103,'blanket_coolant_fraction','Central cell blanket coolant volume fraction',0.8000000000000000444,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(104,'blanket_structural_material','Central cell blanket structural material','SS316','1','','','',0); +INSERT INTO mirror_var VALUES(105,'blanket_structural_fraction','Central cell blanket structural volume fraction',0.1000000000000000055,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(106,'outer_vessel_thickness','Central cell outer vessel thickness',0.0100000000000000002,'m','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(107,'L_EP','End plug axial length',1.0,'m','','','L, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(108,'L_EC','Expander cell axial length',1.0,'m','','','L, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(109,'a_EP','End plug plasma radius',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(110,'HF_magnet_number','Number of high-field magnets',4.0,'1','','','HF_magnet_cost',0); +INSERT INTO mirror_var VALUES(111,'LF_magnet_number','Number of low-field magnets',2.0,'1','','','LF_magnet_cost',0); +INSERT INTO mirror_var VALUES(112,'HF_magnet_cost','HF cost per magnet, not for all four',29.10000000000000142,'million','cal_HF_magnet_cost','n_unit, HF_magnet_number, sc_mat_scale','',0); +INSERT INTO mirror_var VALUES(113,'LF_magnet_cost','LF cost per magnet',6.252620000000000288,'million','cal_LF_magnet_cost','n_unit, LF_magnet_number, sc_mat_scale','',0); +INSERT INTO mirror_var VALUES(114,'CF_magnet_cost','CF cost per magnet',2.75099999999999989,'million','cal_CF_magnet_cost','n_unit, CF_magnet_number, sc_mat_scale','',0); +INSERT INTO mirror_var VALUES(115,'CF_magnet_number','One CF coil every L_CF m of central cell',52.0300751879699206,'1','cal_CF_magnet_number','L_CC, L_CF','CF_magnet_cost',0); +INSERT INTO mirror_var VALUES(116,'HF_magnet_shield_cost','HF magnet shield cost per end plug',20.6739690020193585,'million','cal_HF_magnet_shield_cost','a_M, a_CC_shield, a_0, length, r_gap, r_vv, r_magnet, r_cryostat, f_vol, length_cc_cylinder, length_ep_cylinder, r_out_cc, r_out_ep, W_rho, W_c_raw, W_m','',0); +INSERT INTO mirror_var VALUES(117,'a_CC_shield','HF shield central-cell plasma radius from legacy Mirror geometry',0.5400000000000000355,'m','','','HF_magnet_shield_cost',0); +INSERT INTO mirror_var VALUES(118,'chamber_length','PyFECONS magnetic mirror chamber length',12.0,'m','','','',0); +INSERT INTO mirror_var VALUES(119,'plasma_t','PyFECONS radial build plasma thickness',4.900000000000000355,'m','','','',0); +INSERT INTO mirror_var VALUES(120,'vacuum_t','PyFECONS radial build vacuum thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(121,'firstwall_t','PyFECONS radial build first wall thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(122,'blanket1_t','PyFECONS radial build blanket thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(123,'reflector_t','PyFECONS radial build reflector thickness',0.1000000000000000055,'m','','','',0); +INSERT INTO mirror_var VALUES(124,'ht_shield_t','PyFECONS radial build high-temperature shield thickness',0.25,'m','','','',0); +INSERT INTO mirror_var VALUES(125,'structure_t','PyFECONS radial build support structure thickness',0.2000000000000000111,'m','','','',0); +INSERT INTO mirror_var VALUES(126,'gap1_t','PyFECONS radial build first gap thickness',0.5,'m','','','',0); +INSERT INTO mirror_var VALUES(127,'vessel_t','PyFECONS radial build vessel thickness',0.2000000000000000111,'m','','','',0); +INSERT INTO mirror_var VALUES(128,'coil_t','PyFECONS radial build coil thickness',1.760000000000000008,'m','','','',0); +INSERT INTO mirror_var VALUES(129,'gap2_t','PyFECONS radial build second gap thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(130,'lt_shield_t','PyFECONS radial build low-temperature shield thickness',0.2999999999999999889,'m','','','',0); +INSERT INTO mirror_var VALUES(131,'bioshield_t','PyFECONS radial build bioshield thickness',1.0,'m','','','',0); +INSERT INTO mirror_var VALUES(132,'FS_rho','PyFECONS Ferritic Steel density',7470.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(133,'FS_c_raw','PyFECONS Ferritic Steel raw cost',10.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(134,'FS_m','PyFECONS Ferritic Steel manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(135,'FS_sigma','PyFECONS Ferritic Steel stress limit',450.0,'MPa','','','',0); +INSERT INTO mirror_var VALUES(136,'Pb_rho','PyFECONS Lead density',9400.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(137,'Pb_c_raw','PyFECONS Lead raw cost',2.399999999999999912,'dollar/kg','','','P_PbLi, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(138,'Pb_m','PyFECONS Lead manufacturing multiplier',1.5,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(139,'Li4SiO4_rho','PyFECONS Lithium Silicate density',2390.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(140,'Li4SiO4_c_raw','PyFECONS Lithium Silicate raw cost',1.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(141,'Li4SiO4_m','PyFECONS Lithium Silicate manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(142,'FLiBe_rho','PyFECONS FLiBe density',1900.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(143,'FLiBe_c','PyFECONS FLiBe cost',40.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(144,'W_rho','PyFECONS Tungsten density',19300.0,'kg/m3','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(145,'W_c_raw','PyFECONS Tungsten raw cost',100.0,'dollar/kg','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(146,'W_m','PyFECONS Tungsten manufacturing multiplier',3.0,'1','','','HF_magnet_shield_cost, central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost',0); +INSERT INTO mirror_var VALUES(147,'Li_rho','PyFECONS Lithium density',534.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(148,'Li_c_raw','PyFECONS Lithium raw cost',29.53000000000000113,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(149,'Li_m','PyFECONS Lithium manufacturing multiplier',1.5,'1','','','',0); +INSERT INTO mirror_var VALUES(150,'sc_mat_scale','Superconductor material cost scaling factor',1.0,'1','','','CF_magnet_cost, HF_magnet_cost, LF_magnet_cost',0); +INSERT INTO mirror_var VALUES(151,'BFS_rho','PyFECONS BFS density',7800.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(152,'BFS_c_raw','PyFECONS BFS raw cost',30.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(153,'BFS_m','PyFECONS BFS manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(154,'SiC_rho','PyFECONS Silicon Carbide density',3200.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(155,'SiC_c_raw','PyFECONS Silicon Carbide raw cost',14.49000000000000021,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(156,'SiC_m','PyFECONS Silicon Carbide manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(157,'Inconel_rho','PyFECONS Inconel density',8440.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(158,'Inconel_c_raw','PyFECONS Inconel raw cost',46.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(159,'Inconel_m','PyFECONS Inconel manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(160,'Cu_rho','PyFECONS Copper density',7300.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(161,'Cu_c_raw','PyFECONS Copper raw cost',10.19999999999999928,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(162,'Cu_m','PyFECONS Copper manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(163,'Polyimide_rho','PyFECONS Polyimide density',1430.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(164,'Polyimide_c_raw','PyFECONS Polyimide raw cost',100.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(165,'Polyimide_m','PyFECONS Polyimide manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(166,'YBCO_rho','PyFECONS YBCO density',6200.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(167,'YBCO_c','PyFECONS YBCO cost',55.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(168,'Concrete_rho','PyFECONS Concrete density',2300.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(169,'Concrete_c_raw','PyFECONS Concrete raw cost',0.5200000000000000177,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(170,'Concrete_m','PyFECONS Concrete manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(171,'SS316_rho','PyFECONS Stainless Steel 316 density',7860.0,'kg/m3','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(172,'SS316_c_raw','PyFECONS Stainless Steel 316 raw cost',2.0,'dollar/kg','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(173,'SS316_m','PyFECONS Stainless Steel 316 manufacturing multiplier',2.0,'1','','','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result',0); +INSERT INTO mirror_var VALUES(174,'SS316_sigma','PyFECONS Stainless Steel 316 stress limit',900.0,'MPa','','','',0); +INSERT INTO mirror_var VALUES(175,'Nb3Sn_c','PyFECONS Niobium-Tin cost',5.0,'dollar/m3','','','',0); +INSERT INTO mirror_var VALUES(176,'Incoloy_rho','PyFECONS Incoloy density',8170.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(177,'Incoloy_c_raw','PyFECONS Incoloy raw cost',4.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(178,'Incoloy_m','PyFECONS Incoloy manufacturing multiplier',2.0,'1','','','',0); +INSERT INTO mirror_var VALUES(179,'Be_rho','PyFECONS Beryllium density',1850.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(180,'Be_c_raw','PyFECONS Beryllium raw cost',5750.0,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(181,'Be_m','PyFECONS Beryllium manufacturing multiplier',3.0,'1','','','',0); +INSERT INTO mirror_var VALUES(182,'Li2TiO3_rho','PyFECONS Lithium Titanate density',3430.0,'kg/m3','','','',0); +INSERT INTO mirror_var VALUES(183,'Li2TiO3_c_raw','PyFECONS Lithium Titanate raw cost',1297.049999999999955,'dollar/kg','','','',0); +INSERT INTO mirror_var VALUES(184,'Li2TiO3_m','PyFECONS Lithium Titanate manufacturing multiplier',3.0,'1','','','',0); CREATE TABLE mirror_acco (ind INTEGER, code_of_account TEXT NOT NULL, account_description TEXT, total_cost REAL, level INTEGER, supaccount TEXT, review_status TEXT, prn REAL, alg_name TEXT, fun_unit TEXT, variables TEXT, PRIMARY KEY (code_of_account)); -INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.54000000284,0,'','Unchanged',0.004687831810420024433,'','million',''); +INSERT INTO mirror_acco VALUES(1,'10','Pre-Construction_Costs',24186117.53999999911,0,'','Unchanged',0.004687831810420024433,'','million',''); INSERT INTO mirror_acco VALUES(2,'11','Land_and_Land_Rights',1186117.539999999804,1,'1','Unchanged',0.0002298971517736676198,'','million',''); INSERT INTO mirror_acco VALUES(3,'12','Site_Permits',10000000.0,1,'1','Unchanged',0.001938232460281024469,'','million',''); INSERT INTO mirror_acco VALUES(4,'13','Plant_Licensing',0.0,1,'1','Unchanged',0.0,'','million',''); @@ -7223,86 +7228,86 @@ INSERT INTO mirror_acco VALUES(6,'15','Plant_Studies',5000000.0,1,'1','Unchanged INSERT INTO mirror_acco VALUES(7,'16','Plant_Reports',2000000.0,1,'1','Unchanged',0.0003876464920562048719,'','million',''); INSERT INTO mirror_acco VALUES(8,'17','Other_Pre-Construction_Costs',1000000.0,1,'1','Unchanged',0.0001938232460281024359,'','million',''); INSERT INTO mirror_acco VALUES(9,'19','Contingency_on_Pre-Construction_Costs',0.0,1,'1','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1298175963.0,0,'','Unchanged',0.2516166790643177831,'','million','rollup'); -INSERT INTO mirror_acco VALUES(11,'21','Structures_and_Improvements',112945794.0999999941,1,'20','Unchanged',0.02189152043768370289,'','million','rollup'); -INSERT INTO mirror_acco VALUES(12,'211','Site_Preparation/Yard_Work',42376414.42000000178,2,'21','Unchanged',0.008213534197916488519,'Account_C21_1','million','P_egross'); -INSERT INTO mirror_acco VALUES(13,'212','Heat_Island_Building',29536993.33999999986,2,'21','Unchanged',0.005724955927069242875,'Account_C21_2','million','P_egross'); -INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',8538531.264999998733,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','application, P_egross'); -INSERT INTO mirror_acco VALUES(15,'214','Heat_Exchanger_Building',5976971.884999999776,2,'21','Unchanged',0.001158476092169406302,'Account_C21_4','million','P_egross'); -INSERT INTO mirror_acco VALUES(16,'215','Power_Supply_and_Energy_Storage',1707706.253000000026,2,'21','Unchanged',0.0003309931692189479568,'Account_C21_5','million','P_egross'); -INSERT INTO mirror_acco VALUES(17,'216','Reactor_Auxiliaries',853853.1265000000131,2,'21','Unchanged',0.0001654965846094739784,'Account_C21_6','million','P_egross'); -INSERT INTO mirror_acco VALUES(18,'217','Hot_Cell',14768496.66999999993,2,'21','Unchanged',0.002862477963534621437,'Account_C21_7','million','P_egross'); -INSERT INTO mirror_acco VALUES(19,'218','Reactor_Services',2956861.753000000026,2,'21','Unchanged',0.0005731085430228053398,'Account_C21_8','million','P_egross'); -INSERT INTO mirror_acco VALUES(20,'219','Service_Water',47436.28480000000126,2,'21','Unchanged',9.194254699449536794e-06,'Account_C21_9','million','P_egross'); -INSERT INTO mirror_acco VALUES(21,'2110','Fuel_Storage',173933.0443000000086,2,'21','Unchanged',3.371226723777574368e-05,'Account_C21_10','million','P_egross'); -INSERT INTO mirror_acco VALUES(22,'2111','Control_Room',142308.8543999999819,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_11','million','P_egross'); -INSERT INTO mirror_acco VALUES(23,'2112','Onsite_AC_Power',126496.7595000000001,2,'21','Unchanged',2.45180125383262035e-05,'Account_C21_12','million','P_egross'); -INSERT INTO mirror_acco VALUES(24,'2113','Administration',695732.1770999999716,2,'21','Unchanged',0.0001348490689317206382,'Account_C21_13','million','P_egross'); -INSERT INTO mirror_acco VALUES(25,'2114','Site_Services',252993.5190000000002,2,'21','Unchanged',4.903602507665240699e-05,'Account_C21_14','million','P_egross'); -INSERT INTO mirror_acco VALUES(26,'2115','Cryogenics',379490.2784000000101,2,'21','Unchanged',7.355403759559629436e-05,'Account_C21_15','million','P_egross'); -INSERT INTO mirror_acco VALUES(27,'2116','Security',142308.8543999999819,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_16','million','P_egross'); -INSERT INTO mirror_acco VALUES(28,'2117','Ventilation_Stack',4269265.632000000216,2,'21','Unchanged',0.0008274829229504581827,'Account_C21_17','million','P_egross'); -INSERT INTO mirror_acco VALUES(29,'22','Heat_Island_Plant_Equipment',1111998920.0,1,'20','Unchanged',0.2155312402541442185,'','million','rollup'); -INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',901967566.7999999524,2,'22','Unchanged',0.1748222816092453169,'','million','rollup'); -INSERT INTO mirror_acco VALUES(31,'2211','First_Wall_and_Blanket',511083.5873559177271,3,'221','Unchanged',0.00837189162568348702,'Account_C22_1_1','million','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result'); -INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',70016988.37318401038,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million','HF_magnet_shield_cost'); -INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.7999999523,3,'221','Unchanged',0.05272767135278567941,'','million','rollup'); +INSERT INTO mirror_acco VALUES(10,'20','Capitalized_Direct_Costs_(CDC)',1474130012.258995771,0,'','Unchanged',0.2516166790643177831,'','million','rollup'); +INSERT INTO mirror_acco VALUES(11,'21','Structures_and_Improvements',100088394.1180045604,1,'20','Unchanged',0.02189152043768370289,'','million','rollup'); +INSERT INTO mirror_acco VALUES(12,'211','Site_Preparation/Yard_Work',37552414.42478681356,2,'21','Unchanged',0.008213534197916488519,'Account_C21_1','million','P_egross'); +INSERT INTO mirror_acco VALUES(13,'212','Heat_Island_Building',26174593.33787379413,2,'21','Unchanged',0.005724955927069242875,'Account_C21_2','million','P_egross'); +INSERT INTO mirror_acco VALUES(14,'213','Turbine_Generator_Building',7566531.2646958502,2,'21','Unchanged',0.001654965846094739622,'Account_C21_3','million','application, P_egross'); +INSERT INTO mirror_acco VALUES(15,'214','Heat_Exchanger_Building',5296571.885287095792,2,'21','Unchanged',0.001158476092169406302,'Account_C21_4','million','P_egross'); +INSERT INTO mirror_acco VALUES(16,'215','Power_Supply_and_Energy_Storage',1513306.252939169994,2,'21','Unchanged',0.0003309931692189479568,'Account_C21_5','million','P_egross'); +INSERT INTO mirror_acco VALUES(17,'216','Reactor_Auxiliaries',756653.1264695849969,2,'21','Unchanged',0.0001654965846094739784,'Account_C21_6','million','P_egross'); +INSERT INTO mirror_acco VALUES(18,'217','Hot_Cell',13087296.66893689706,2,'21','Unchanged',0.002862477963534621437,'Account_C21_7','million','P_egross'); +INSERT INTO mirror_acco VALUES(19,'218','Reactor_Services',2620261.752774303313,2,'21','Unchanged',0.0005731085430228053398,'Account_C21_8','million','P_egross'); +INSERT INTO mirror_acco VALUES(20,'219','Service_Water',42036.28480386582668,2,'21','Unchanged',9.194254699449536794e-06,'Account_C21_9','million','P_egross'); +INSERT INTO mirror_acco VALUES(21,'2110','Fuel_Storage',154133.0442808413937,2,'21','Unchanged',3.371226723777574368e-05,'Account_C21_10','million','P_egross'); +INSERT INTO mirror_acco VALUES(22,'2111','Control_Room',126108.8544115974946,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_11','million','P_egross'); +INSERT INTO mirror_acco VALUES(23,'2112','Onsite_AC_Power',112096.7594769755669,2,'21','Unchanged',2.45180125383262035e-05,'Account_C21_12','million','P_egross'); +INSERT INTO mirror_acco VALUES(24,'2113','Administration',616532.1771233655746,2,'21','Unchanged',0.0001348490689317206382,'Account_C21_13','million','P_egross'); +INSERT INTO mirror_acco VALUES(25,'2114','Site_Services',224193.5189539511338,2,'21','Unchanged',4.903602507665240699e-05,'Account_C21_14','million','P_egross'); +INSERT INTO mirror_acco VALUES(26,'2115','Cryogenics',336290.2784309266135,2,'21','Unchanged',7.355403759559629436e-05,'Account_C21_15','million','P_egross'); +INSERT INTO mirror_acco VALUES(27,'2116','Security',126108.8544115974946,2,'21','Unchanged',2.758276409834860699e-05,'Account_C21_16','million','P_egross'); +INSERT INTO mirror_acco VALUES(28,'2117','Ventilation_Stack',3783265.6323479251,2,'21','Unchanged',0.0008274829229504581827,'Account_C21_17','million','P_egross'); +INSERT INTO mirror_acco VALUES(29,'22','Heat_Island_Plant_Equipment',1306044913.728087426,1,'20','Unchanged',0.2155312402541442185,'','million','rollup'); +INSERT INTO mirror_acco VALUES(30,'221','Heat_Island_Components',1098858920.919871331,2,'22','Unchanged',0.1748222816092453169,'','million','rollup'); +INSERT INTO mirror_acco VALUES(31,'2211','First_Wall_and_Blanket',446188406.0309790372,3,'221','Unchanged',0.00837189162568348702,'Account_C22_1_1','million','central_cell_cylindrical_part_cost, end_plug_cylindrical_part_cost, expander_cell_cost_result'); +INSERT INTO mirror_acco VALUES(32,'2212','Magnet_Radiation_Shield',41347938.00403871387,3,'221','Unchanged',0.01836222428034747084,'Account_C22_1_2','million','HF_magnet_shield_cost'); +INSERT INTO mirror_acco VALUES(33,'2213','Coils',272039976.8421052695,3,'221','Unchanged',0.05272767135278567941,'','million','rollup'); INSERT INTO mirror_acco VALUES(34,'22131','HF_Coils',116400000.0,4,'2213','Unchanged',0.02256102583767112534,'Account_C22_1_3_1','million','HF_magnet_number, HF_magnet_cost'); INSERT INTO mirror_acco VALUES(35,'22132','LF_Coils',12505240.0,4,'2213','Unchanged',0.00242380620916046773,'Account_C22_1_3_2','million','LF_magnet_number, LF_magnet_cost'); -INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8000000119,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million','CF_magnet_number, CF_magnet_cost'); -INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',227453000.0,3,'221','Unchanged',0.04408567877882998281,'','million','rollup'); +INSERT INTO mirror_acco VALUES(36,'22133','CC_Coils',143134736.8421052397,4,'2213','Unchanged',0.02774283930595409022,'Account_C22_1_3_3','million','CF_magnet_number, CF_magnet_cost'); +INSERT INTO mirror_acco VALUES(37,'2214','Supplemental_Heating',105963000.0,3,'221','Unchanged',0.04408567877882998281,'','million','rollup'); INSERT INTO mirror_acco VALUES(38,'22141','NBI',105963000.0,4,'2214','Unchanged',0.0205380926188758195,'Account_C22_1_4_1','million','P_NBI, cost_factor'); -INSERT INTO mirror_acco VALUES(39,'22142','ICRH',41490000.0,4,'2214','Unchanged',0.008041726477705971043,'Account_C22_1_4_2','million','P_ICRH, cost_factor'); -INSERT INTO mirror_acco VALUES(40,'22143','ECH',80000000.0,4,'2214','Unchanged',0.01550585968224819574,'Account_C22_1_4_3','million','P_ECH, cost_factor'); +INSERT INTO mirror_acco VALUES(39,'22142','ICRH',0.0,4,'2214','Unchanged',0.008041726477705971043,'Account_C22_1_4_2','million','P_ICRH, cost_factor'); +INSERT INTO mirror_acco VALUES(40,'22143','ECH',0.0,4,'2214','Unchanged',0.01550585968224819574,'Account_C22_1_4_3','million','P_ECH, cost_factor'); INSERT INTO mirror_acco VALUES(41,'2215','Primary_Structure_and_Support',0.0,3,'221','Unchanged',0.0,'Account_C22_1_5','million',''); -INSERT INTO mirror_acco VALUES(42,'2216','Vacuum_System',2031827.257000000217,3,'221','Unchanged',0.0003938153543201155615,'','million','rollup'); +INSERT INTO mirror_acco VALUES(42,'2216','Vacuum_System',2031827.256869856501,3,'221','Unchanged',0.0003938153543201155615,'','million','rollup'); INSERT INTO mirror_acco VALUES(43,'22162','Vessel_Refrigerators',0.0,4,'2216','Unchanged',0.0,'Account_C22_1_6_2','million',''); -INSERT INTO mirror_acco VALUES(44,'22163','Primary_Vacuum_Pumps',1689827.256999999984,4,'2216','Unchanged',0.0003275278041785044783,'Account_C22_1_6_3','million','no_vpumps, cost_pump'); +INSERT INTO mirror_acco VALUES(44,'22163','Primary_Vacuum_Pumps',1689827.256869856501,4,'2216','Unchanged',0.0003275278041785044783,'Account_C22_1_6_3','million','no_vpumps, cost_pump'); INSERT INTO mirror_acco VALUES(45,'22164','Backing_Vacuum_Pumps',342000.0,4,'2216','Unchanged',6.628755014161104265e-05,'Account_C22_1_6_4','million',''); INSERT INTO mirror_acco VALUES(46,'2217','Power_Supplies',0.0,3,'221','Unchanged',0.0,'Account_C22_1_7','million',''); INSERT INTO mirror_acco VALUES(47,'2218','Divertor',0.0,3,'221','Unchanged',0.0,'Account_C22_1_8','million',''); -INSERT INTO mirror_acco VALUES(48,'2219','Direct_Energy_Convertor',109317164.7999999971,3,'221','Unchanged',0.02118820772812501919,'Account_C22_1_9','million','P_DECe, cost_factor'); -INSERT INTO mirror_acco VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9000000059,3,'221','Unchanged',0.02969279247112800724,'Account_C22_1_11','million','L, N_module, construction_time, cost_factor'); -INSERT INTO mirror_acco VALUES(50,'222','Main_and_Secondary_Coolant',33649451.5,2,'22','Unchanged',0.006522045916795200273,'','million',''); -INSERT INTO mirror_acco VALUES(51,'223','Auxiliary_Cooling_Systems',352198.2635000000009,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); -INSERT INTO mirror_acco VALUES(52,'224','Radioactive_Waste_Treatment',627553.269500000053,2,'22','Unchanged',0.0001216344117500385732,'Account_C22_4','million','P_th'); -INSERT INTO mirror_acco VALUES(53,'225','Fuel_Handling_and_Storage',88654052.28999999166,2,'22','Unchanged',0.01718321618839292741,'Account_C22_5','million','cost_factor'); -INSERT INTO mirror_acco VALUES(54,'226','Other_Heat_Island_Equipment',1748097.851999999956,2,'22','Unchanged',0.0003388220000493933943,'Account_C22_6','million','P_enet'); +INSERT INTO mirror_acco VALUES(48,'2219','Direct_Energy_Convertor',78092564.83797612786,3,'221','Unchanged',0.02118820772812501919,'Account_C22_1_9','million','P_DECe, cost_factor'); +INSERT INTO mirror_acco VALUES(49,'22111','Assembly_and_Installation_Costs',153195207.9479024113,3,'221','Unchanged',0.02969279247112800724,'Account_C22_1_11','million','L, N_module, construction_time, cost_factor'); +INSERT INTO mirror_acco VALUES(50,'222','Main_and_Secondary_Coolant',30661451.50067612157,2,'22','Unchanged',0.006522045916795200273,'Account_C22_2','million','N_module, P_egross, P_th'); +INSERT INTO mirror_acco VALUES(51,'223','Auxiliary_Cooling_Systems',352198.2634809551527,2,'22','Unchanged',6.826421067703095135e-05,'Account_C22_3','million','N_module, P_th'); +INSERT INTO mirror_acco VALUES(52,'224','Radioactive_Waste_Treatment',627553.2694751564414,2,'22','Unchanged',0.0001216344117500385732,'Account_C22_4','million','P_th'); +INSERT INTO mirror_acco VALUES(53,'225','Fuel_Handling_and_Storage',88654052.29068641364,2,'22','Unchanged',0.01718321618839292741,'Account_C22_5','million','cost_factor'); +INSERT INTO mirror_acco VALUES(54,'226','Other_Heat_Island_Equipment',1890737.483897394733,2,'22','Unchanged',0.0003388220000493933943,'Account_C22_6','million','P_enet'); INSERT INTO mirror_acco VALUES(55,'227','Instrumentation_and_Control',85000000.0,2,'22','Unchanged',0.01647497591238870906,'Account_C22_7','million',''); -INSERT INTO mirror_acco VALUES(56,'23','Turbine_Plant_Equipment',39822761.09000000358,1,'20','Unchanged',0.007718576820265415049,'Account_C23','million','N_module, P_egross'); -INSERT INTO mirror_acco VALUES(57,'24','Electric_Plant_Equipment',9819310.95399999992,1,'20','Unchanged',0.001903210722863583459,'Account_C24','million','N_module, P_egross'); -INSERT INTO mirror_acco VALUES(58,'25','Miscellaneous_Plant_Equipment',6909885.486000000499,1,'20','Unchanged',0.001339296434578992169,'Account_C25','million','N_module, P_egross'); -INSERT INTO mirror_acco VALUES(59,'26','Heat_Rejection',11679291.32000000029,1,'20','Unchanged',0.002263718154950241507,'Account_C26','million','N_module, P_enet'); +INSERT INTO mirror_acco VALUES(56,'23','Turbine_Plant_Equipment',35289461.0928453654,1,'20','Unchanged',0.007718576820265415049,'Account_C23','million','N_module, P_egross'); +INSERT INTO mirror_acco VALUES(57,'24','Electric_Plant_Equipment',8701510.954400226473,1,'20','Unchanged',0.001903210722863583459,'Account_C24','million','N_module, P_egross'); +INSERT INTO mirror_acco VALUES(58,'25','Miscellaneous_Plant_Equipment',6123285.486429789104,1,'20','Unchanged',0.001339296434578992169,'Account_C25','million','N_module, P_egross'); +INSERT INTO mirror_acco VALUES(59,'26','Heat_Rejection',12882446.8792283386,1,'20','Unchanged',0.002263718154950241507,'Account_C26','million','N_module, P_enet'); INSERT INTO mirror_acco VALUES(60,'27','Special_Materials',0.0,1,'20','Unchanged',0.0,'Account_C27','million',''); INSERT INTO mirror_acco VALUES(61,'28','Digital_Twin/Simulator',5000000.0,1,'20','Unchanged',0.000969116230140512235,'Account_C28','million',''); INSERT INTO mirror_acco VALUES(62,'29','Contingency_on_Direct_Capital_Costs',0.0,1,'20','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',71591970.57999999822,0,'','Unchanged',0.01387618812736401107,'','million',''); -INSERT INTO mirror_acco VALUES(64,'31','Field_Indirect_Costs',14318394.12000000104,1,'3','Unchanged',0.002775237626248095324,'','million',''); -INSERT INTO mirror_acco VALUES(65,'32','Construction_Supervision',35795985.28999999911,1,'3','Unchanged',0.006938094063682005535,'','million',''); +INSERT INTO mirror_acco VALUES(63,'30','Capitalized_Indirect_Service_Costs_(CISC)',75189163.12710233033,0,'','Unchanged',0.01387618812736401107,'','million',''); +INSERT INTO mirror_acco VALUES(64,'31','Field_Indirect_Costs',15037832.62542046792,1,'3','Unchanged',0.002775237626248095324,'Account_C31','million','P_enet, construction_time'); +INSERT INTO mirror_acco VALUES(65,'32','Construction_Supervision',37594581.56355116517,1,'3','Unchanged',0.006938094063682005535,'Account_C32','million','P_enet, construction_time'); INSERT INTO mirror_acco VALUES(66,'33','Commissioning_and_Start-Up_Costs',0.0,1,'3','Unchanged',0.0,'','million',''); INSERT INTO mirror_acco VALUES(67,'34','Demonstration_Test_Run',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(68,'35','Design_Services_Offsite',21477591.17000000179,1,'3','Unchanged',0.004162856437433910644,'','million',''); +INSERT INTO mirror_acco VALUES(68,'35','Design_Services_Offsite',22556748.93813069909,1,'3','Unchanged',0.004162856437433910644,'Account_C35','million','P_enet, construction_time, n_unit'); INSERT INTO mirror_acco VALUES(69,'36','PM/CM_Services_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); INSERT INTO mirror_acco VALUES(70,'37','Design_Servies_Offsite',0.0,1,'3','Unchanged',0.0,'','million',''); INSERT INTO mirror_acco VALUES(71,'38','PM/CM_Services_Onsite',0.0,1,'3','Unchanged',0.0,'','million',''); INSERT INTO mirror_acco VALUES(72,'39','Contingency_on_Support_Services',0.0,1,'3','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',155781115.5999999941,0,'','Unchanged',0.03019400149547106504,'','million',''); -INSERT INTO mirror_acco VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',37837192.60999999941,0,'','Unchanged',0.007333727492260730397,'','million',''); -INSERT INTO mirror_acco VALUES(75,'51','Shipping_and_Transportation_Costs',8000000.0,1,'5','Unchanged',0.001550585968224819487,'','million',''); -INSERT INTO mirror_acco VALUES(76,'52','Spare_Parts',7323124.885999999941,1,'5','Unchanged',0.001419391836473697482,'','million',''); -INSERT INTO mirror_acco VALUES(77,'53','Taxes',0.0,1,'5','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(78,'54','Insurance',1000000.0,1,'5','Unchanged',0.0001938232460281024359,'','million',''); -INSERT INTO mirror_acco VALUES(79,'55','Initial_Fuel_Load',21514067.71999999881,1,'5','Unchanged',0.004169926440758816612,'','million',''); -INSERT INTO mirror_acco VALUES(80,'58','Decommissioning_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); +INSERT INTO mirror_acco VALUES(73,'40','Capitalized_Owner''s_Cost_(COC)',176895601.4710794986,0,'','Unchanged',0.03019400149547106504,'','million',''); +INSERT INTO mirror_acco VALUES(74,'50','Capitalized_Supplementary_Costs_(CSC)',39530034.46099854261,0,'','Unchanged',0.007333727492260730397,'','million',''); +INSERT INTO mirror_acco VALUES(75,'51','Shipping_and_Transportation_Costs',8000000.0,1,'5','Unchanged',0.001550585968224819487,'Account_C51','million',''); +INSERT INTO mirror_acco VALUES(76,'52','Spare_Parts',6799670.441290372983,1,'5','Unchanged',0.001419391836473697482,'','million','rollup'); +INSERT INTO mirror_acco VALUES(77,'53','Taxes',0.0,1,'5','Unchanged',0.0,'Account_C53','million','include_tax'); +INSERT INTO mirror_acco VALUES(78,'54','Insurance',1000000.0,1,'5','Unchanged',0.0001938232460281024359,'Account_C54','million',''); +INSERT INTO mirror_acco VALUES(79,'55','Initial_Fuel_Load',23730364.01970816777,1,'5','Unchanged',0.004169926440758816612,'Account_C55','million','P_enet'); +INSERT INTO mirror_acco VALUES(80,'58','Decommissioning_Costs',0.0,1,'5','Unchanged',0.0,'Account_C58','million','include_decommissioning'); INSERT INTO mirror_acco VALUES(81,'59','Contingency_on_Supplementary_Costs',0.0,1,'5','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',195409441.2000000179,0,'','Unchanged',0.03787489219792161688,'','million',''); -INSERT INTO mirror_acco VALUES(83,'61','Escalation',20125000.0,1,'6','Unchanged',0.003900692826315561857,'','million',''); -INSERT INTO mirror_acco VALUES(84,'62','Fees',0.0,1,'6','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(85,'63','Interest_During_Construction_(IDC)',175284441.2000000179,1,'6','Unchanged',0.03397419937160605503,'','million',''); -INSERT INTO mirror_acco VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,1,'6','Unchanged',0.0,'','million',''); -INSERT INTO mirror_acco VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1587572359.0,0,'','Unchanged',0.3077084279258719967,'','million',''); -INSERT INTO mirror_acco VALUES(88,'TCC','Total_Capital_Cost_(TCC)',1782981801.0,0,'','Unchanged',0.3455833202788521908,'','million',''); -INSERT INTO mirror_acco VALUES(89,'O&M','Operations_and_Maintenance',5694900.279999999329,0,'','Unchanged',0.001103804058075949327,'','million',''); +INSERT INTO mirror_acco VALUES(82,'60','Capitalized_Financial_Costs_(CFC)',217751924.4441126586,0,'','Unchanged',0.03787489219792161688,'','million',''); +INSERT INTO mirror_acco VALUES(83,'61','Escalation',20125000.0,1,'6','Unchanged',0.003900692826315561857,'Account_C61','million','N_module, P_f, NOAK'); +INSERT INTO mirror_acco VALUES(84,'62','Fees',0.0,1,'6','Unchanged',0.0,'Account_C62','million',''); +INSERT INTO mirror_acco VALUES(85,'63','Interest_During_Construction_(IDC)',197626924.4441126586,1,'6','Unchanged',0.03397419937160605503,'','million',''); +INSERT INTO mirror_acco VALUES(86,'69','Contingency_on_Capitalized_Financial_Costs',0.0,1,'6','Unchanged',0.0,'Account_C69','million','include_contingency, NOAK'); +INSERT INTO mirror_acco VALUES(87,'OCC','Overnight_Capital_Cost_(OCC)',1789930928.858176232,0,'','Unchanged',0.3077084279258719967,'','million',''); +INSERT INTO mirror_acco VALUES(88,'TCC','Total_Capital_Cost_(TCC)',2007682853.302289009,0,'','Unchanged',0.3455833202788521908,'','million',''); +INSERT INTO mirror_acco VALUES(89,'O&M','Operations_and_Maintenance',6281566.946393338963,0,'','Unchanged',0.001103804058075949327,'Account_OM','million','P_enet'); INSERT INTO mirror_acco VALUES(90,'Fuel','Fuel',109004.2081000000034,0,'','Unchanged',2.112754944466477681e-05,'','million',''); INSERT INTO mirror_acco VALUES(91,'81','Deuterium',47391.17656999999599,1,'8','Unchanged',9.185511675888353413e-06,'','million',''); COMMIT;