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/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..0eefa2f --- /dev/null +++ b/docs/source/reference/table/Mirrortables.rst @@ -0,0 +1,39 @@ +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. + +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 +-------------------- + +.. 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 + +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/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..91aa487 --- /dev/null +++ b/src/Algorithm/MirrorFunc.py @@ -0,0 +1,834 @@ +import numpy as np +import inspect +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. + """ + 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") + 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: + """ + 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") + + @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_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_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, 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, 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): + 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 + + @staticmethod + 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 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 + def cal_P_PbLi(Pb_c_raw, P_Li, f_Li): + 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 + + r_in = radius + radius += first_wall_thickness + total += np.pi * length * (radius**2 - r_in**2) * W_rho * W_c_raw * W_m + + r_in = radius + radius += vacuum_vessel_thickness + total += np.pi * length * (radius**2 - r_in**2) * SS316_rho * SS316_c_raw * SS316_m + + 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( + 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_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, + ): + 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_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 + 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: ### + + @staticmethod + def Account_C21_1(P_egross): + # Site Preparation/Yard Work + return(P_egross * 268/1e3) + + @staticmethod + def Account_C21_2(P_egross): + # Heat Island Building + return(P_egross * 186.8/1e3) + + @staticmethod + def Account_C21_3(application, P_egross): + # Turbine Generator Building + if application.lower()=='electricity': + return(P_egross * 54.0/1e3) + else: + return(0) + + @staticmethod + def Account_C21_4(P_egross): + # Heat Exchanger Building + 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(P_egross): + # Power Supply and Energy Storage + 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(P_egross): + # Reactor Auxiliaries + 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(P_egross): + # Hot Cell + 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(P_egross): + # Reactor Services + 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(P_egross): + # Service Water + 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(P_egross): + # Fuel Storage + 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(P_egross): + # Control Room + 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(P_egross): + # Onsite AC Power + 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(P_egross): + # Administration + 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(P_egross): + # Site Services + 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(P_egross): + # Cyrogenics + 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(P_egross): + # Security + 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(P_egross): + # Ventilation Stack + return(27.0/1e3 * P_egross) + + + @staticmethod + 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 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): + # Magnet Radiation Shield + # Factor of two for each end plug + return(2 * HF_magnet_shield_cost) + + @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(HF_magnet_number * HF_magnet_cost) + + @staticmethod + 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(LF_magnet_number * LF_magnet_cost) + + @staticmethod + def Account_C22_1_3_3(CF_magnet_number, CF_magnet_cost): + # CF Coils + # One coil every L_CF m of Central Cell + return(CF_magnet_number * CF_magnet_cost) + + @staticmethod + def Account_C22_1_4_1(P_NBI, cost_factor): + # NBI + return(7.0642 * P_NBI * cost_factor) + + @staticmethod + def Account_C22_1_4_2(P_ICRH, cost_factor): + # ICRH + return(4.149 * P_ICRH * cost_factor) + + @staticmethod + def Account_C22_1_4_3(P_ECH, cost_factor): + # ECH + return(8.0 * P_ECH * cost_factor) + + @staticmethod + def Account_C22_1_5(): + # Primary Structure and Support + return(0) + + @staticmethod + 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(no_vpumps, cost_pump): + + #VACUUM PUMPING 22.1.6.3 + return(no_vpumps * cost_pump / 1e6) + + + @staticmethod + def Account_C22_1_6_4(): + # Roughing Pump + return(120000*2.85/1e6) + + @staticmethod + def Account_C22_1_7(): + # 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(): + # Divertor + return(0) + + @staticmethod + 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 * P_DECe * cost_factor) + + @staticmethod + 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 = L/(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 = 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 = 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 * cost_factor) + + @staticmethod + def Account_C22_2_1(N_module, P_egross): + # Primary Coolant + return(166 * (N_module * P_egross/1000)) + + @staticmethod + def Account_C22_2_2(P_th): + # Secondary Coolant + return(40.6 * (P_th/3500)**0.55) + + @staticmethod + 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 + return(1.10 * 1e-3 * N_module * P_th * 2.02) + + @staticmethod + def Account_C22_4(P_th): + # Radioactive Waste Treatment + return(1.96 * 1e-3 * P_th * 2.02) + + @staticmethod + def Account_C22_5(cost_factor): + # 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 + + return(C220500 * cost_factor) + + @staticmethod + def Account_C22_6(P_enet): + # Cost Category 22.6 Other Reactor Plant Equipment + return(11.5*(np.max((P_enet,0))/1000)**(0.8)) + + @staticmethod + def Account_C22_7(): + # Cost Category 22.7 Instrumentation and Control + return(85) + + @staticmethod + def Account_C23(N_module, P_egross): + # Turbine Plant Equipment + return(N_module * P_egross * 0.219 *1.15) + + @staticmethod + def Account_C24(N_module, P_egross): + # Electric Plant Equipment + return(N_module * P_egross * 0.054 * 1.15) + + @staticmethod + def Account_C25(N_module, P_egross): + # Miscellaneous Plant Equipment + return(N_module * P_egross * 0.038 * 1.15) + + @staticmethod + def Account_C26(N_module, P_enet): + # Heat Rejection + return(N_module * P_enet * 0.107 * 1.15 ) + + @staticmethod + def Account_C27(): + # Special Materials + # Total elsewhere, implement later + return(0) + + @staticmethod + 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 + + @staticmethod + def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): + cost = 29.10 + cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) + + return(cost * cost_factor * sc_mat_scale) + + @staticmethod + def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): + cost = 6.25262 + cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) + + return(cost * cost_factor * sc_mat_scale) + + @staticmethod + def CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale=1.0): + 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)) + + return(cost * cost_factor * sc_mat_scale) + + + + + 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..5472fcf 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' @@ -1833,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 792498c..6581d51 100644 Binary files a/src/accertdb.sqlite and b/src/accertdb.sqlite differ diff --git a/src/accertdb_sqlite_schema_data.sql b/src/accertdb_sqlite_schema_data.sql index 8479a17..052ab39 100644 --- a/src/accertdb_sqlite_schema_data.sql +++ b/src/accertdb_sqlite_schema_data.sql @@ -6931,4 +6931,383 @@ 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_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(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(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'); +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(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(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'); +INSERT INTO mirror_alg VALUES(35,'Account_C22_1_4_3','c','Account C22143 Rollup','MirrorFunc','P_ECH, cost_factor','million'); +INSERT INTO mirror_alg VALUES(36,'Account_C22_1_5','c','Account C2215 Rollup','MirrorFunc','reference value','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','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'); +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'); +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','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(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_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 = 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'); +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'); +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 = (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'); +INSERT INTO mirror_alg VALUES(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'); +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','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',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',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',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',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',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.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',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',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',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.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',''); +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)',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.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',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.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.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',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',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)',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',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)',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)',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; diff --git a/src/etc/accert.sch b/src/etc/accert.sch index 63526c3..c233d9a 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 = ['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' '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 new file mode 100644 index 0000000..60ded46 --- /dev/null +++ b/src/scripts/build_mirror_accert_tables.py @@ -0,0 +1,1391 @@ +"""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 ast +import csv +import math +import re +import shutil +import sqlite3 +import sys +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_ALG_DST = ROOT / "src" / "Algorithm" / "MirrorFunc.py" + +TABLES = { + "mirror_acco": "mirror_account.csv", + "mirror_alg": "mirror_algorithm.csv", + "mirror_var": "mirror_variable.csv", +} +DEFAULT_INPUT_FILE = "mirror_default_inputs.csv" + +MIRROR_INPUT_DEFAULTS = { + "application": "electricity", + "P_f": 175, + "P_f_L": 175 * 0.95 / 50, + "P_f_EP": 1, + "P_NBI": 15, + "P_ECH": 0, + "P_ICRH": 0, + "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.60, + "eta_DEC": 0.90, + "eta_pump": 0.98, + "eta_NBI": 0.68, + "eta_ECH": 0.60, + "eta_ICRH": 0.90, + "verbose": 0, + "exact": 0, + "NOAK": 0, + "n_unit": 1, + "construction_time": 6, + "lifetime": 30, + "replacement": 10, + "availability": 0.90, + "discount": 0.03, + "LSA": 2, + "cost_file": "woodruff-data_edited.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": "40% PbLi", + "blanket_thickness": 0.75, + "blanket_coolant_fraction": 0.80, + "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_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"), + ("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_REFERENCE_VAR_OVERRIDES = {} + +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_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", + "L_CF": "", + "L": "L_CC, L_EP, L_EC", + "V_vac": "L, a_EC", + "no_vpumps": "V_vac, vpump_cap", + "cost_factor": "n_unit", + "HF_magnet_cost": "n_unit, HF_magnet_number, sc_mat_scale", + "LF_magnet_cost": "n_unit, LF_magnet_number, sc_mat_scale", + "CF_magnet_cost": "n_unit, CF_magnet_number, sc_mat_scale", + "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", + "rho_PbLi": "T, f_6Li", + "P_Li": "f_6Li", + "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, " + "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" + ), + "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" + ), + "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_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" + ), +} + +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"), + "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 = 29.10 * 0.70 ** (log((n_unit - 1) * HF_magnet_number + 1) / log(2)) * sc_mat_scale", + "million", + ), + "LF_magnet_cost": ( + "LF_magnet_cost = 6.25262 * 0.70 ** (log((n_unit - 1) * LF_magnet_number + 1) / log(2)) * sc_mat_scale", + "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)) * sc_mat_scale", + "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"), + "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"), + "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 = (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", + ), + "end_plug_cylindrical_part_cost": ( + "end_plug_cylindrical_part_cost = legacy central-cell radial build material cost for L_EP", + "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 = { + "E_DT": (17.59e6 * 1.60218e-19, "J"), + "E_alpha": (3.52e6 * 1.60218e-19, "J"), +} + +MIRROR_VARIABLE_OVERRIDES = { + "cost_pump": ( + "Cost of one vacuum pump, scaled from 1985 dollars", + 40000, + "dollar/pump", + ), + "vpump_cap": ( + "Vacuum volume pumped by one vacuum pump in one second", + 200 / 48, + "m3/pump", + ), + "no_vpumps": ( + "Number of vacuum pumps required to pump the full vacuum in one second", + None, + "1", + ), + "cost_factor": ( + "Cost scaling factor calculated from the unit number using an 0.80 learning factor", + 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", + ), + "HF_magnet_shield_cost": ( + "HF magnet shield cost per end plug", + None, + "million", + ), + "expander_cell_cost_result": ( + "Expander cell vacuum vessel cost from legacy Mirror geometry", + None, + "million", + ), + "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.40, "1"), + "central_cell_cylindrical_part_cost": ( + "Central cell cylindrical radial-build material cost", + None, + "million", + ), + "end_plug_cylindrical_part_cost": ( + "End plug cylindrical radial-build material cost", + None, + "million", + ), + "a_CC": ("Legacy Mirror central cell plasma radius", 1.0, "m"), + "a_M": ("HF shield magnet bore/plasma radius from legacy Mirror geometry", 0.15, "m"), + "a_CC_shield": ("HF shield central-cell plasma radius from legacy Mirror geometry", 0.54, "m"), + "a_0": ("HF shield end plug plasma radius from legacy Mirror geometry", 0.47, "m"), + "length": ("HF shield radially inner cylinder length", 1.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", 0.5, "m"), + "r_cryostat": ("HF shield cryostat radius allowance", 0.4, "m"), + "f_vol": ("HF shield volume fill fraction", 0.9, "1"), + "length_cc_cylinder": ("HF shield central-cell-facing cylinder length", 2.0, "m"), + "length_ep_cylinder": ("HF shield end-plug-facing cylinder length", 0.4, "m"), + "r_out_cc": ("HF shield central-cell-facing outer radius", 0.85, "m"), + "r_out_ep": ("HF shield end-plug-facing outer radius", 0.85, "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"), + "vacuum_t": ("PyFECONS radial build vacuum thickness", 0.1, "m"), + "firstwall_t": ("PyFECONS radial build first wall thickness", 0.1, "m"), + "blanket1_t": ("PyFECONS radial build blanket thickness", 1, "m"), + "reflector_t": ("PyFECONS radial build reflector thickness", 0.1, "m"), + "ht_shield_t": ("PyFECONS radial build high-temperature shield thickness", 0.25, "m"), + "structure_t": ("PyFECONS radial build support structure thickness", 0.2, "m"), + "gap1_t": ("PyFECONS radial build first gap thickness", 0.5, "m"), + "vessel_t": ("PyFECONS radial build vessel thickness", 0.2, "m"), + "coil_t": ("PyFECONS radial build coil thickness", 1.76, "m"), + "gap2_t": ("PyFECONS radial build second gap thickness", 1, "m"), + "lt_shield_t": ("PyFECONS radial build low-temperature shield thickness", 0.3, "m"), + "bioshield_t": ("PyFECONS radial build bioshield thickness", 1, "m"), + "FS_rho": ("PyFECONS Ferritic Steel density", 7470, "kg/m3"), + "FS_c_raw": ("PyFECONS Ferritic Steel raw cost", 10, "dollar/kg"), + "FS_m": ("PyFECONS Ferritic Steel manufacturing multiplier", 3, "1"), + "FS_sigma": ("PyFECONS Ferritic Steel stress limit", 450, "MPa"), + "Pb_rho": ("PyFECONS Lead density", 9400, "kg/m3"), + "Pb_c_raw": ("PyFECONS Lead raw cost", 2.4, "dollar/kg"), + "Pb_m": ("PyFECONS Lead manufacturing multiplier", 1.5, "1"), + "Li4SiO4_rho": ("PyFECONS Lithium Silicate density", 2390, "kg/m3"), + "Li4SiO4_c_raw": ("PyFECONS Lithium Silicate raw cost", 1, "dollar/kg"), + "Li4SiO4_m": ("PyFECONS Lithium Silicate manufacturing multiplier", 2, "1"), + "FLiBe_rho": ("PyFECONS FLiBe density", 1900, "kg/m3"), + "FLiBe_c": ("PyFECONS FLiBe cost", 40, "dollar/m3"), + "W_rho": ("PyFECONS Tungsten density", 19300, "kg/m3"), + "W_c_raw": ("PyFECONS Tungsten raw cost", 100, "dollar/kg"), + "W_m": ("PyFECONS Tungsten manufacturing multiplier", 3, "1"), + "Li_rho": ("PyFECONS Lithium density", 534, "kg/m3"), + "Li_c_raw": ("PyFECONS Lithium raw cost", 29.53, "dollar/kg"), + "Li_m": ("PyFECONS Lithium manufacturing multiplier", 1.5, "1"), + "sc_mat_scale": ("Superconductor material cost scaling factor", 1, "1"), + "BFS_rho": ("PyFECONS BFS density", 7800, "kg/m3"), + "BFS_c_raw": ("PyFECONS BFS raw cost", 30, "dollar/kg"), + "BFS_m": ("PyFECONS BFS manufacturing multiplier", 2, "1"), + "SiC_rho": ("PyFECONS Silicon Carbide density", 3200, "kg/m3"), + "SiC_c_raw": ("PyFECONS Silicon Carbide raw cost", 14.49, "dollar/kg"), + "SiC_m": ("PyFECONS Silicon Carbide manufacturing multiplier", 3, "1"), + "Inconel_rho": ("PyFECONS Inconel density", 8440, "kg/m3"), + "Inconel_c_raw": ("PyFECONS Inconel raw cost", 46, "dollar/kg"), + "Inconel_m": ("PyFECONS Inconel manufacturing multiplier", 3, "1"), + "Cu_rho": ("PyFECONS Copper density", 7300, "kg/m3"), + "Cu_c_raw": ("PyFECONS Copper raw cost", 10.2, "dollar/kg"), + "Cu_m": ("PyFECONS Copper manufacturing multiplier", 3, "1"), + "Polyimide_rho": ("PyFECONS Polyimide density", 1430, "kg/m3"), + "Polyimide_c_raw": ("PyFECONS Polyimide raw cost", 100, "dollar/kg"), + "Polyimide_m": ("PyFECONS Polyimide manufacturing multiplier", 3, "1"), + "YBCO_rho": ("PyFECONS YBCO density", 6200, "kg/m3"), + "YBCO_c": ("PyFECONS YBCO cost", 55, "dollar/m3"), + "Concrete_rho": ("PyFECONS Concrete density", 2300, "kg/m3"), + "Concrete_c_raw": ("PyFECONS Concrete raw cost", 13 / 25, "dollar/kg"), + "Concrete_m": ("PyFECONS Concrete manufacturing multiplier", 2, "1"), + "SS316_rho": ("PyFECONS Stainless Steel 316 density", 7860, "kg/m3"), + "SS316_c_raw": ("PyFECONS Stainless Steel 316 raw cost", 2, "dollar/kg"), + "SS316_m": ("PyFECONS Stainless Steel 316 manufacturing multiplier", 2, "1"), + "SS316_sigma": ("PyFECONS Stainless Steel 316 stress limit", 900, "MPa"), + "Nb3Sn_c": ("PyFECONS Niobium-Tin cost", 5, "dollar/m3"), + "Incoloy_rho": ("PyFECONS Incoloy density", 8170, "kg/m3"), + "Incoloy_c_raw": ("PyFECONS Incoloy raw cost", 4, "dollar/kg"), + "Incoloy_m": ("PyFECONS Incoloy manufacturing multiplier", 2, "1"), + "Be_rho": ("PyFECONS Beryllium density", 1850, "kg/m3"), + "Be_c_raw": ("PyFECONS Beryllium raw cost", 5750, "dollar/kg"), + "Be_m": ("PyFECONS Beryllium manufacturing multiplier", 3, "1"), + "Li2TiO3_rho": ("PyFECONS Lithium Titanate density", 3430, "kg/m3"), + "Li2TiO3_c_raw": ("PyFECONS Lithium Titanate raw cost", 1297.05, "dollar/kg"), + "Li2TiO3_m": ("PyFECONS Lithium Titanate manufacturing multiplier", 3, "1"), +} + +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, + ) + 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)}" + 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 _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})")] + + +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 _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 "" + + +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 _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 + 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") + 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() + 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) + 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] = (explicit_args or sorted(input_keys), sorted(account_calls)) + 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 _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(): + if name in MIRROR_DEFAULT_EXPORT_EXCLUDE: + continue + values[name] = (value, MIRROR_INPUT_UNITS.get(name, "1")) + values["HF_magnet_number"] = (4, "1") + values["LF_magnet_number"] = (2, "1") + 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()}) + values.update({name: value for name, (value, _unit) in MIRROR_REFERENCE_VAR_OVERRIDES.items()}) + values.update( + { + name: value + for name, (_description, value, _unit) in MIRROR_VARIABLE_OVERRIDES.items() + if value is not None + } + ) + 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 + 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"] = ( + 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"] + T_K = values["T"] + 273.15 + f_6li_natural = 0.075 + rho_6li = 460.0 + rho_7li = 537.0 + rho_pbli = 10520.35 - 1.19051 * T_K + 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)) + 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: + 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 + 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_shield"] + values["r_gap"] + values["r_vv"] + shield_r_out_cc = values["r_out_cc"] + 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 = values["r_out_ep"] + 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 + + +def _normalize_mirror_account_table(conn: sqlite3.Connection, algorithm_source: Path) -> None: + 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( + "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_dollars, level, + prn, fun_unit + FROM mirror_acco_raw + 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, ([], [])) + 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 = "" + normalized_total_cost = _dollar_value(total_cost) + 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 + (ind, code_of_account, account_description, total_cost, level, + supaccount, review_status, prn, alg_name, fun_unit, variables) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + ind, + code, + description, + normalized_total_cost, + level, + _mirror_parent_code_for_table(raw_code, int(level or 0), codes), + "Unchanged", + prn, + alg_name, + fun_unit or "million", + 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 [] + 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) + 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 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( + """ + 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_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(): + 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_var_description(var_name), value, unit), + ) + continue + 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), + ) + 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_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_description = ?, var_value = ?, var_alg = ?, var_unit = ?, user_input = 0 + WHERE 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(): + 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_var_description(var_name), value, unit), + ) + else: + 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), + ) + + for var_name, (description, value, unit) in MIRROR_VARIABLE_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, description, value, unit), + ) + continue + if value is None: + conn.execute( + """ + UPDATE mirror_var + SET var_description = ?, var_unit = ?, user_input = 0 + WHERE var_name = ? + """, + (description, unit, var_name), + ) + else: + conn.execute( + """ + UPDATE mirror_var + SET var_description = ?, var_value = ?, var_unit = ?, user_input = 0 + WHERE var_name = ? + """, + (description, value, unit, var_name), + ) + + valid_variable_algorithms = {f"cal_{var_name}" for var_name in MIRROR_GENERATED_VAR_FORMULAS} + placeholders = ", ".join("?" for _ in valid_variable_algorithms) + conn.execute( + f""" + UPDATE mirror_var + SET var_alg = '' + WHERE COALESCE(var_alg, '') != '' + AND var_alg NOT IN ({placeholders}) + """, + tuple(sorted(valid_variable_algorithms)), + ) + + 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), + ) + conn.execute( + """ + DELETE FROM mirror_var + WHERE COALESCE(var_value, '') = '' + AND COALESCE(var_alg, '') = '' + AND COALESCE(var_need, '') = '' + 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)], + ) + 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: + rows = [ + (name, value, unit) + 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: + 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) + 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 = ?", + (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 + + used_variable_algorithms = { + row[0] + for row in conn.execute("SELECT DISTINCT var_alg FROM mirror_var WHERE COALESCE(var_alg, '') != ''") + } + for (alg_name,) in conn.execute("SELECT alg_name FROM mirror_alg WHERE alg_for = 'v'").fetchall(): + if alg_name not in used_variable_algorithms: + conn.execute("DELETE FROM mirror_alg WHERE alg_name = ?", (alg_name,)) + + +def load_mirror_tables( + db_path: Path, + ref_dir: Path, + sql_path: Path, + algorithm_source: Path, + 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)) + 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, 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() + + algorithm_dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(algorithm_source, algorithm_dest) + print(f"Copied {algorithm_source} to {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)) + 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(), + ) + + +if __name__ == "__main__": + main() diff --git a/test/test_mirror_model.py b/test/test_mirror_model.py new file mode 100644 index 0000000..80f527b --- /dev/null +++ b/test/test_mirror_model.py @@ -0,0 +1,817 @@ +import csv +from pathlib import Path +from types import SimpleNamespace + +import pytest + +from Main import Accert +from Algorithm.MirrorFunc import MirrorFunc + + +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_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 = { + row["var_name"]: (row["default_value"], row["var_unit"]) + for row in csv.DictReader(handle) + } + + 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") + + +def test_mirror_func_does_not_keep_legacy_generate_inputs(): + assert not hasattr(MirrorFunc, "generate_inputs") + + +def test_mirror_variables_do_not_keep_blank_legacy_temporaries(cursor): + cursor.execute("SELECT var_name FROM mirror_var WHERE COALESCE(var_value, '') = '' ORDER BY var_name") + assert cursor.fetchall() == [] + + temporary_locals = { + "C_end_cap", + "M_end_cap", + "T_K", + "V_cc_cylinder", + "V_cc_triangle", + "V_end_cap", + "V_ep_cylinder", + "V_ep_triangle", + "V_radially_inner_cylinder", + "V_total", + "V_total_cc_facing", + "V_total_ec_facing", + "f_interp", + "r_in", + "r_in_cc", + "r_in_ep", + "r_out", + "radial_build", + "total", + } + placeholders = ", ".join("?" for _ in temporary_locals) + cursor.execute( + f"SELECT var_name FROM mirror_var WHERE var_name IN ({placeholders}) ORDER BY var_name", + tuple(sorted(temporary_locals)), + ) + 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", + "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 + 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) + + +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( + """ + 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") + + cursor.execute( + """ + SELECT total_cost + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("OCC",), + ) + assert cursor.fetchone()[0] == pytest.approx(1789930928.8581762) + + +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; + """, + ("20", "21", "22", "221", "2213"), + ) + assert cursor.fetchall() == [ + ("20", "", "rollup"), + ("21", "", "rollup"), + ("22", "", "rollup"), + ("221", "", "rollup"), + ("2213", "", "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( + """ + 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_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(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"} + + +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(50.019897669130195) + assert rows[0][2:] == ("MW", "P_DECe") + assert rows[1] == ("eta_DEC", 0.9, "1", "P_DECe") + + +def test_mirror_algorithm_table_only_keeps_referenced_variable_algorithms(cursor): + cursor.execute("SELECT COUNT(*) FROM mirror_alg WHERE alg_name = '__init__';") + assert cursor.fetchone()[0] == 0 + + cursor.execute( + """ + SELECT COUNT(*) + FROM mirror_alg + WHERE alg_for = 'v' + AND alg_name NOT IN ( + SELECT var_alg + FROM mirror_var + WHERE COALESCE(var_alg, '') != '' + ); + """ + ) + assert cursor.fetchone()[0] == 0 + + cursor.execute( + """ + SELECT COUNT(*) + FROM mirror_var + WHERE COALESCE(var_alg, '') != '' + AND var_alg NOT IN (SELECT alg_name FROM mirror_alg); + """ + ) + assert cursor.fetchone()[0] == 0 + + +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) + + 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( + """ + SELECT variables + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("22163",), + ) + assert cursor.fetchone()[0] == "no_vpumps, cost_pump" + + 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; + """, + ("V_vac", "cost_pump", "no_vpumps", "vpump_cap"), + ) + rows = {row[0]: row[1:] for row in cursor.fetchall()} + + assert rows["cost_pump"] == ( + "Cost of one vacuum pump, scaled from 1985 dollars", + 40000.0, + "dollar/pump", + "", + "", + "", + ) + assert rows["vpump_cap"] == ( + "Vacuum volume pumped by one vacuum pump in one second", + pytest.approx(200 / 48), + "m3/pump", + "", + "", + "no_vpumps", + ) + assert rows["no_vpumps"] == ( + "Number of vacuum pumps required to pump the full vacuum in one second", + pytest.approx(176.02367259061006 / (200 / 48)), + "1", + "cal_no_vpumps", + "V_vac, vpump_cap", + "", + ) + assert rows["V_vac"][5] == "no_vpumps" + + cursor.execute( + """ + SELECT alg_for, alg_python, alg_formulation, alg_units + FROM mirror_alg + WHERE alg_name = ?; + """, + ("cal_no_vpumps",), + ) + assert cursor.fetchone() == ( + "v", + "MirrorFunc", + "no_vpumps = V_vac / vpump_cap", + "1", + ) + + alg = MirrorFunc( + ind=1, + alg_name="Account_C22_1_6_3", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="no_vpumps,cost_pump", + constants="", + ) + assert alg.run({"no_vpumps": 42.24568142174641, "cost_pump": 40000}) == pytest.approx( + 1.6898272568698564 + ) + + +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", + "", + "", + "CF_magnet_cost, HF_magnet_cost, LF_magnet_cost, 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_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", + "sc_mat_scale", + ), + ) + 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, sc_mat_scale", + "", + ) + assert rows["LF_magnet_cost"] == ( + "LF cost per magnet", + 6.25262, + "million", + "cal_LF_magnet_cost", + "n_unit, LF_magnet_number, sc_mat_scale", + "", + ) + assert rows["CF_magnet_cost"] == ( + "CF cost per magnet", + 2.751, + "million", + "cal_CF_magnet_cost", + "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" + 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_first_wall_and_blanket_use_legacy_scalar_super_variables(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(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" + ) + + cursor.execute( + """ + SELECT var_name, var_value, var_unit, var_alg, var_need + FROM mirror_var + WHERE var_name IN (?, ?, ?, ?, ?, ?) + ORDER BY var_name; + """, + ( + "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["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(8.258002288365251) + assert rows["end_plug_cylindrical_part_cost"][1:] == ( + "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", + ) + 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(912.8441379310344) + assert rows["P_Li"][1:] == ("dollar/kg", "cal_P_Li", "f_6Li") + 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(9374.559280436162) + 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", + "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 + + alg = MirrorFunc( + ind=1, + alg_name="Account_C22_1_1", + alg_for="c", + alg_description="", + alg_formulation="", + alg_units="million", + variables="central_cell_cylindrical_part_cost,end_plug_cylindrical_part_cost,expander_cell_cost_result", + constants="", + ) + assert alg.run( + { + "central_cell_cylindrical_part_cost": 429.6644799660716, + "end_plug_cylindrical_part_cost": 8.258002288365251, + "expander_cell_cost_result": 0.003960744088457411, + } + ) == pytest.approx(446.188406030979) + + +def test_mirror_magnet_shield_and_expander_costs_are_super_variables(cursor): + cursor.execute( + """ + SELECT total_cost, variables + FROM mirror_acco + WHERE code_of_account = ?; + """, + ("2212",), + ) + total_cost, variables = cursor.fetchone() + assert total_cost / 1e6 == pytest.approx(41.34793800403872) + assert variables == "HF_magnet_shield_cost" + + cursor.execute( + """ + SELECT var_name, var_description, var_value, var_unit, var_alg, var_need + FROM mirror_var + WHERE var_name IN (?, ?) + ORDER BY var_name; + """, + ("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(20.67396900201936) + assert rows["HF_magnet_shield_cost"][2:] == ( + "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", + ) + 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", + ) + + 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": 20.67396900201936}) == pytest.approx(41.34793800403872) + + 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): + 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" + 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 144c065..c409886 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,39 @@ def test_table_columns(cursor): "escalation_name", "escalation_factorsValue", }, + "mirror_acco": { + "ind", + "code_of_account", + "account_description", + "total_cost", + "level", + "supaccount", + "review_status", + "prn", + "alg_name", + "fun_unit", + "variables", + }, + "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..9165753 --- /dev/null +++ b/tutorial/accert/Mirror.son @@ -0,0 +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 new file mode 100644 index 0000000..91aa487 --- /dev/null +++ b/tutorial/accert/ref_tables/MirrorFunc.py @@ -0,0 +1,834 @@ +import numpy as np +import inspect +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. + """ + 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") + 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: + """ + 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") + + @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_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_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, 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, 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): + 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 + + @staticmethod + 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 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 + def cal_P_PbLi(Pb_c_raw, P_Li, f_Li): + 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 + + r_in = radius + radius += first_wall_thickness + total += np.pi * length * (radius**2 - r_in**2) * W_rho * W_c_raw * W_m + + r_in = radius + radius += vacuum_vessel_thickness + total += np.pi * length * (radius**2 - r_in**2) * SS316_rho * SS316_c_raw * SS316_m + + 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( + 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_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, + ): + 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_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 + 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: ### + + @staticmethod + def Account_C21_1(P_egross): + # Site Preparation/Yard Work + return(P_egross * 268/1e3) + + @staticmethod + def Account_C21_2(P_egross): + # Heat Island Building + return(P_egross * 186.8/1e3) + + @staticmethod + def Account_C21_3(application, P_egross): + # Turbine Generator Building + if application.lower()=='electricity': + return(P_egross * 54.0/1e3) + else: + return(0) + + @staticmethod + def Account_C21_4(P_egross): + # Heat Exchanger Building + 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(P_egross): + # Power Supply and Energy Storage + 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(P_egross): + # Reactor Auxiliaries + 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(P_egross): + # Hot Cell + 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(P_egross): + # Reactor Services + 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(P_egross): + # Service Water + 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(P_egross): + # Fuel Storage + 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(P_egross): + # Control Room + 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(P_egross): + # Onsite AC Power + 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(P_egross): + # Administration + 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(P_egross): + # Site Services + 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(P_egross): + # Cyrogenics + 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(P_egross): + # Security + 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(P_egross): + # Ventilation Stack + return(27.0/1e3 * P_egross) + + + @staticmethod + 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 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): + # Magnet Radiation Shield + # Factor of two for each end plug + return(2 * HF_magnet_shield_cost) + + @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(HF_magnet_number * HF_magnet_cost) + + @staticmethod + 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(LF_magnet_number * LF_magnet_cost) + + @staticmethod + def Account_C22_1_3_3(CF_magnet_number, CF_magnet_cost): + # CF Coils + # One coil every L_CF m of Central Cell + return(CF_magnet_number * CF_magnet_cost) + + @staticmethod + def Account_C22_1_4_1(P_NBI, cost_factor): + # NBI + return(7.0642 * P_NBI * cost_factor) + + @staticmethod + def Account_C22_1_4_2(P_ICRH, cost_factor): + # ICRH + return(4.149 * P_ICRH * cost_factor) + + @staticmethod + def Account_C22_1_4_3(P_ECH, cost_factor): + # ECH + return(8.0 * P_ECH * cost_factor) + + @staticmethod + def Account_C22_1_5(): + # Primary Structure and Support + return(0) + + @staticmethod + 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(no_vpumps, cost_pump): + + #VACUUM PUMPING 22.1.6.3 + return(no_vpumps * cost_pump / 1e6) + + + @staticmethod + def Account_C22_1_6_4(): + # Roughing Pump + return(120000*2.85/1e6) + + @staticmethod + def Account_C22_1_7(): + # 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(): + # Divertor + return(0) + + @staticmethod + 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 * P_DECe * cost_factor) + + @staticmethod + 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 = L/(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 = 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 = 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 * cost_factor) + + @staticmethod + def Account_C22_2_1(N_module, P_egross): + # Primary Coolant + return(166 * (N_module * P_egross/1000)) + + @staticmethod + def Account_C22_2_2(P_th): + # Secondary Coolant + return(40.6 * (P_th/3500)**0.55) + + @staticmethod + 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 + return(1.10 * 1e-3 * N_module * P_th * 2.02) + + @staticmethod + def Account_C22_4(P_th): + # Radioactive Waste Treatment + return(1.96 * 1e-3 * P_th * 2.02) + + @staticmethod + def Account_C22_5(cost_factor): + # 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 + + return(C220500 * cost_factor) + + @staticmethod + def Account_C22_6(P_enet): + # Cost Category 22.6 Other Reactor Plant Equipment + return(11.5*(np.max((P_enet,0))/1000)**(0.8)) + + @staticmethod + def Account_C22_7(): + # Cost Category 22.7 Instrumentation and Control + return(85) + + @staticmethod + def Account_C23(N_module, P_egross): + # Turbine Plant Equipment + return(N_module * P_egross * 0.219 *1.15) + + @staticmethod + def Account_C24(N_module, P_egross): + # Electric Plant Equipment + return(N_module * P_egross * 0.054 * 1.15) + + @staticmethod + def Account_C25(N_module, P_egross): + # Miscellaneous Plant Equipment + return(N_module * P_egross * 0.038 * 1.15) + + @staticmethod + def Account_C26(N_module, P_enet): + # Heat Rejection + return(N_module * P_enet * 0.107 * 1.15 ) + + @staticmethod + def Account_C27(): + # Special Materials + # Total elsewhere, implement later + return(0) + + @staticmethod + 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 + + @staticmethod + def HF_magnet_cost(n_unit, HF_magnet_number, sc_mat_scale=1.0): + cost = 29.10 + cost_factor = (0.70)**(np.log((n_unit - 1) * HF_magnet_number + 1)/np.log(2)) + + return(cost * cost_factor * sc_mat_scale) + + @staticmethod + def LF_magnet_cost(n_unit, LF_magnet_number, sc_mat_scale=1.0): + cost = 6.25262 + cost_factor = (0.70)**(np.log((n_unit - 1) * LF_magnet_number + 1)/np.log(2)) + + return(cost * cost_factor * sc_mat_scale) + + @staticmethod + def CF_magnet_cost(n_unit, CF_magnet_number, sc_mat_scale=1.0): + 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)) + + return(cost * cost_factor * sc_mat_scale) + + + + + 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..a134221 --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_account.csv @@ -0,0 +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,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, +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),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.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,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.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.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,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,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),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,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),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),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 new file mode 100644 index 0000000..f8ea9fd --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_algorithm.csv @@ -0,0 +1,82 @@ +ind,alg_name,alg_for,alg_description,alg_python,alg_formulation,alg_units +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 +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 +31,Account_C22_1_3_3,c,Account C22133 Rollup,MirrorFunc,"CF_magnet_number, CF_magnet_cost",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 +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 +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, 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 +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 +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 +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_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 = 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 +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 +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 = (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 +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_default_inputs.csv b/tutorial/accert/ref_tables/mirror_default_inputs.csv new file mode 100644 index 0000000..a45aa57 --- /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,0,MW +P_ICRH,0,MW +P_NBI,15,MW +P_aux,1,MW +P_coils,0,MW +P_cryo,1,MW +P_f,175,MW +P_f_EP,1,MW +P_f_L,3.325,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,electricity,1 +availability,0.9,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,0.75,m +construction_time,6,years +cost_file,woodruff-data_edited.csv,1 +discount,0.03,1 +eta_DEC,0.9,1 +eta_ECH,0.6,1 +eta_ICRH,0.9,1 +eta_NBI,0.68,1 +eta_pump,0.98,1 +eta_th,0.6,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,1,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 new file mode 100644 index 0000000..9940c28 --- /dev/null +++ b/tutorial/accert/ref_tables/mirror_variable.csv @@ -0,0 +1,185 @@ +ind,var_name,var_description,var_value,var_unit,var_alg,var_need,v_linked,user_input +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,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,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,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,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,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.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,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,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,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