From 0b0dfa81b3b213f5881c330447aee3ecbc992cc0 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Wed, 4 Sep 2024 11:03:55 +0100 Subject: [PATCH 1/9] changes to blanket library and dcll model to allow for WCLL blanket setups and to use primary_pumping=3 --- process/blanket_library.py | 1041 +++++++++++++++++++----------------- process/dcll.py | 4 +- 2 files changed, 557 insertions(+), 488 deletions(-) diff --git a/process/blanket_library.py b/process/blanket_library.py index eba9e64dc2..4d03249f3a 100644 --- a/process/blanket_library.py +++ b/process/blanket_library.py @@ -204,47 +204,17 @@ def primary_coolant_properties(self, output: bool): "OP ", ) - def thermo_hydraulic_model(self, output: bool): - """Thermo-hydraulic model for first wall and blanket - ONLY CALLED if primary_pumping = 2 - - Calculations for detailed powerflow model secondary_cycle > 1 - - original author: J. Morris, CCFE, Culham Science Centre - Dual-coolant modifications and generalisation refactor: G. Graham, CCFE - - Three options: - 1. Solid breeder - nuclear heating in the blanket is exctrated by the primary coolant. - 2. Liquid metal breeder, single-coolant - - nuclear heating in the blanket is exctrated by the primary coolant. - - liquid metal is circulated for tritium extraction, specified by number of circulations/day. - 3. Liquid metal breeder, dual-coolant - - - nuclear heating in the liquid breeder/coolant is extracted by the liquid breeder/coolant. - - nuclear heating in the blanket structure is extracted by the primary coolant - - Flow Channel and Coolant Input Info: - - N.B. Primary coolant applies to single-coolant BB, or structural cooling of dual-coolant BB. - Secondary coolant applies to self-cooled breeder material. - - Coolant Channels FW BB primary BB Liquid Breeder/Coolant - - length (m) fw_channel_length - width (m) afw (radius, cicular) afw a_bz_liq, b_bz_liq (rectangular) - wall thickness (m) fw_wall fw_wall th_wall_secondary - pitch (m) pitch - roughness epsilon roughness - peak FW temp (K) tpeak - maximum temp (K) tfwmatmax - FCI switch --- --- ifci + def thermo_hydraulic_model_pressure_drop_calculations(self, output: bool): + """ + Function that calculates the pressure drops for the thermo-hydraulic model + when primary_pumping = 2. - Coolant FW BB primary BB secondary + Within are calculations necessary for the deltap_tot function but not required + for other calculations within the thermo-hydraulic model as then they are just + included there. - primary coolant switch fwcoolant coolwh --- - secondary coolant switch --- --- i_bb_liq - inlet temp (K) fwinlet inlet_temp inlet_temp_liq - outlet temp (K) fwoutlet outlet_temp outlet_temp_liq - pressure (Pa) fwpressure blpressure blpressure_liq + Returns the pressure drops as a list with the number of entries dependent upon + the switches icooldual and iblnkith. """ npoltoti = 0 npoltoto = 0 @@ -310,74 +280,474 @@ def thermo_hydraulic_model(self, output: bool): ) / fwbs_variables.nopipes ) - # Poloidal - if (blanket_library.bllengi < (fwbs_variables.b_bz_liq * 3)) or ( - blanket_library.bllengo < (fwbs_variables.b_bz_liq * 3) - ): - eh.report_error(278) + # Poloidal + if (blanket_library.bllengi < (fwbs_variables.b_bz_liq * 3)) or ( + blanket_library.bllengo < (fwbs_variables.b_bz_liq * 3) + ): + eh.report_error(278) + + # Unless there is no IB blanket... + else: + # Radial direction + fwbs_variables.b_bz_liq = ( + blanket_library.bldepto * fwbs_variables.r_f_liq_ob + ) / fwbs_variables.nopol + # Toroidal direction + fwbs_variables.a_bz_liq = ( + blanket_library.blwidto * fwbs_variables.w_f_liq_ob + ) / fwbs_variables.nopipes + # Poloidal + if blanket_library.bllengo < (fwbs_variables.b_bz_liq * 3): + eh.report_error(278) + + # Calculate total flow lengths, used for pressure drop calculation + # Blanket primary coolant flow + blanket_library.bzfllengi = ( + fwbs_variables.bzfllengi_n_rad * blanket_library.bldepti + + fwbs_variables.bzfllengi_n_pol * blanket_library.bllengi + ) + blanket_library.bzfllengo = ( + fwbs_variables.bzfllengo_n_rad * blanket_library.bldepto + + fwbs_variables.bzfllengo_n_pol * blanket_library.bllengo + ) + # Blanket secondary coolant/breeder flow + pollengi = blanket_library.bllengi + pollengo = blanket_library.bllengo + fwbs_variables.nopol = 2 + fwbs_variables.nopipes = 4 + bzfllengi_liq = ( + fwbs_variables.bzfllengi_n_rad_liq * blanket_library.bldepti + + fwbs_variables.bzfllengi_n_pol_liq * blanket_library.bllengi + ) + bzfllengo_liq = ( + fwbs_variables.bzfllengo_n_rad_liq * blanket_library.bldepto + + fwbs_variables.bzfllengo_n_pol_liq * blanket_library.bllengo + ) + + # Coolant channel bends ######### + + # Number of angle turns in FW and blanket flow channels, n.b. these are the + # same for ccfe hcpb and kit hcll. FW is also be the same for DCLL MMS ans SMS. + no90fw = 2 + no180fw = 0 + + # N.B. This is for BZ only, does not include MF/BSS. + if fwbs_variables.icooldual == 2: + no90bz = 4 + no180bz = 1 + no90bz_liq = 2 + no180bz_liq = 1 + elif fwbs_variables.icooldual == 1: + no90bz = 4 + no180bz = 1 + no90bz_liq = 2 + no180bz_liq = 1 + else: + no90bz = 4 + no180bz = 1 + + # FW Pipe Flow and Velocity ###### + + # Total number of first wall pipes from channel length and pitch (02/12/2015) + blanket_library.npfwi = build_variables.fwareaib / ( + fwbs_variables.fw_channel_length * fwbs_variables.pitch + ) + blanket_library.npfwo = build_variables.fwareaob / ( + fwbs_variables.fw_channel_length * fwbs_variables.pitch + ) + + # Mass flow rate per FW coolant pipe (kg/s): + blanket_library.mffwpi = blanket_library.mffwi / blanket_library.npfwi + blanket_library.mffwpo = blanket_library.mffwo / blanket_library.npfwo + + # Coolant velocite in FW (m/s) + velfwi = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mffwpi, + flow_density=fwbs_variables.rhof_fw, + ) + velfwo = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mffwpo, + flow_density=fwbs_variables.rhof_fw, + ) + + # If the blanket is dual-coolant... + if fwbs_variables.icooldual == 2: + # Calc total num of pipes (in all inboard modules) from + # coolant frac and channel dimensions + # Assumes up/down flow, two 90 deg bends per length + blanket_library.npblkto = ( + fwbs_variables.vfblkt * fwbs_variables.volblkto + ) / ( + np.pi + * fwbs_variables.afw + * fwbs_variables.afw + * blanket_library.bzfllengo + ) + npblkto_liq = ( + fwbs_variables.nopipes + * fwbs_variables.nblktmodto + * fwbs_variables.nblktmodpo + ) + + # Mass flow rate per coolant pipe + blanket_library.mfblktpo = blanket_library.mfblkto / blanket_library.npblkto + mfblktpo_liq = blanket_library.mfblkto_liq / npblkto_liq + # Coolant velocites in blanket (m/s) + # Assume BZ structure has same channel width as FW + blanket_library.velblkto = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mfblktpo, + flow_density=fwbs_variables.rhof_bl, + ) + velblkto_liq = blanket_library.flow_velocity( + i_channel_shape=2, + mass_flow_rate=mfblktpo_liq, + flow_density=fwbs_variables.den_liq, + ) + + if fwbs_variables.iblnkith == 1: + # Calc total num of pipes (in all inboard modules) from + # coolant frac and channel dimensions + # Assumes up/down flow, two 90 deg bends per length + blanket_library.npblkti = ( + fwbs_variables.vfblkt * fwbs_variables.volblkti + ) / ( + np.pi + * fwbs_variables.afw + * fwbs_variables.afw + * blanket_library.bzfllengi + ) + # Have DEMO DCLL set here for now + npblkti_liq = ( + fwbs_variables.nopipes + * fwbs_variables.nblktmodti + * fwbs_variables.nblktmodpi + ) + + # Mass flow rate per coolant pipe + blanket_library.mfblktpi = ( + blanket_library.mfblkti / blanket_library.npblkti + ) + blanket_library.mfblktpi_liq = blanket_library.mfblkti_liq / npblkti_liq + + # Coolant velocites in blanket (m/s) + # Assume BZ structure has same channel width as FW + blanket_library.velblkti = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mfblktpi, + flow_density=fwbs_variables.rhof_bl, + ) + velblkti_liq = blanket_library.flow_velocity( + i_channel_shape=2, + mass_flow_rate=blanket_library.mfblktpi_liq, + flow_density=fwbs_variables.den_liq, + ) + + # If the blanket is single-coolant with liquid metal breeder... + elif fwbs_variables.icooldual == 1: + # Calc total num of pipes (in all inboard modules) from + # coolant frac and channel dimensions + # Assumes up/down flow, two 90 deg bends per length + blanket_library.npblkto = ( + fwbs_variables.vfblkt * fwbs_variables.volblkto + ) / ( + np.pi + * fwbs_variables.afw + * fwbs_variables.afw + * blanket_library.bzfllengo + ) + npblkto_liq = ( + fwbs_variables.nopipes + * fwbs_variables.nblktmodto + * fwbs_variables.nblktmodpo + ) + + # Mass flow rate per coolant pipe + blanket_library.mfblktpo = blanket_library.mfblkto / blanket_library.npblkto + + # Coolant velocity in blanket (m/s) + # Assume BZ structure has same channel width as FW + blanket_library.velblkto = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mfblktpo, + flow_density=fwbs_variables.rhof_bl, + ) + + # Get mass flow rate etc. for inboard blanket breeder flow for tritium extraction + # Use the number of desired recirculations ([Aub2013]=10) and mass from dcll_masses + # N.B. wht_liq is BZ mass, does not include manifold. + blanket_library.mfblkto_liq = ( + fwbs_variables.n_liq_recirc * fwbs_variables.wht_liq_ob + ) / (24 * 3600) + blanket_library.mfblktpo_liq = blanket_library.mfblkto_liq / npblkto_liq + velblkto_liq = blanket_library.flow_velocity( + i_channel_shape=2, + mass_flow_rate=blanket_library.mfblktpo_liq, + flow_density=fwbs_variables.den_liq, + ) + + if fwbs_variables.iblnkith == 1: + # Calc total num of pipes (in all inboard modules) from + # coolant frac and channel dimensions + # Assumes up/down flow, two 90 deg bends per length + blanket_library.npblkti = ( + fwbs_variables.vfblkt * fwbs_variables.volblkti + ) / ( + np.pi + * fwbs_variables.afw + * fwbs_variables.afw + * blanket_library.bzfllengi + ) + # Have DEMO DCLL set here for now + npblkti_liq = ( + fwbs_variables.nopipes + * fwbs_variables.nblktmodti + * fwbs_variables.nblktmodpi + ) + + # Mass flow rate per coolant pipe + blanket_library.mfblktpi = ( + blanket_library.mfblkti / blanket_library.npblkti + ) + + # Coolant velocity in blanket (m/s) + # Assume BZ structure has same channel width as FW + blanket_library.velblkti = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mfblktpi, + flow_density=fwbs_variables.rhof_bl, + ) + + # Get mass flow rate etc. for inboard blanket breeder flow for tritium extraction + # Use the number of desired recirculations ([Aub2013]=10) and mass from dcll_masses + # N.B. wht_liq is BZ mass, does not include manifold. + blanket_library.mfblkti_liq = ( + fwbs_variables.n_liq_recirc * fwbs_variables.wht_liq_ib + ) / (24 * 3600) + blanket_library.mfblktpi_liq = fwbs_variables.mfblkti_liq / npblkti_liq + velblkti_liq = blanket_library.flow_velocity( + i_channel_shape=2, + mass_flow_rate=blanket_library.mfblktpi_liq, + flow_density=fwbs_variables.den_liq, + ) + + # If the blanket is single-coolant with solid breeder... + else: + # Calculate total number of pipes (in all outboard modules) from coolant fraction and + # channel dimensions (assumes up/down flow, two 90 deg bends per length) + blanket_library.npblkto = ( + fwbs_variables.vfblkt * fwbs_variables.volblkto + ) / ( + np.pi + * fwbs_variables.afw + * fwbs_variables.afw + * blanket_library.bzfllengo + ) + + # Mass flow rate per coolant pipe + blanket_library.mfblktpo = blanket_library.mfblkto / blanket_library.npblkto + + # Coolant velocity in blanket (m/s) + # Assume BZ structure has same channel width as FW + blanket_library.velblkto = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mfblktpo, + flow_density=fwbs_variables.rhof_bl, + ) + + if fwbs_variables.iblnkith == 1: + # Calc total num of pipes (in all inboard modules) from + # coolant frac and channel dimensions + # Assumes up/down flow, two 90 deg bends per length + blanket_library.npblkti = ( + fwbs_variables.vfblkt * fwbs_variables.volblkti + ) / ( + np.pi + * fwbs_variables.afw + * fwbs_variables.afw + * blanket_library.bzfllengi + ) + + # Mass flow rate per coolant pipe + blanket_library.mfblktpi = ( + blanket_library.mfblkti / blanket_library.npblkti + ) + + # Coolant velocity in blanket (m/s) + # Assume BZ structure has same channel width as FW + blanket_library.velblkti = blanket_library.flow_velocity( + i_channel_shape=1, + mass_flow_rate=blanket_library.mfblktpi, + flow_density=fwbs_variables.rhof_bl, + ) + + # FW Presure Drops ############### + + deltap_fwi = self.deltap_tot( + output, + icoolpump=1, + flow_velocity=velfwi, + flleng=fwbs_variables.fw_channel_length, + no90=no90fw, + no180=no180fw, + coolant_density=fwbs_variables.rhof_fw, + coolant_dynamic_viscosity=fwbs_variables.visc_fw, + coolant_electrical_conductivity=0.0e0, + pol_channel_length=pollengi, + nopolchan=npoltoti, + label="Inboard first wall", + ) + + deltap_fwo = self.deltap_tot( + output, + icoolpump=1, + flow_velocity=velfwo, + flleng=fwbs_variables.fw_channel_length, + no90=no90fw, + no180=no180fw, + coolant_density=fwbs_variables.rhof_fw, + coolant_dynamic_viscosity=fwbs_variables.visc_fw, + coolant_electrical_conductivity=0.0e0, + pol_channel_length=pollengo, + nopolchan=npoltoto, + label="Outboard first wall", + ) + + # BB Presure Drops ############### + + # Long polodal flows + if fwbs_variables.iblnkith == 1: + npoltoti = fwbs_variables.nopol * npblkti_liq + npoltoto = fwbs_variables.nopol * npblkto_liq + + deltap_blo = self.deltap_tot( + output, + icoolpump=1, + flow_velocity=blanket_library.velblkto, + flleng=blanket_library.bzfllengo, + no90=no90bz, + no180=no180bz, + coolant_density=fwbs_variables.rhof_bl, + coolant_dynamic_viscosity=fwbs_variables.visc_bl, + coolant_electrical_conductivity=0.0e0, + pol_channel_length=pollengo, + nopolchan=npoltoto, + label="Outboard blanket", + ) + + if fwbs_variables.iblnkith == 1: + deltap_bli = self.deltap_tot( + output, + icoolpump=1, + flow_velocity=blanket_library.velblkti, + flleng=blanket_library.bzfllengi, + no90=no90bz, + no180=no180bz, + coolant_density=fwbs_variables.rhof_bl, + coolant_dynamic_viscosity=fwbs_variables.visc_bl, + coolant_electrical_conductivity=0.0e0, + pol_channel_length=pollengi, + nopolchan=npoltoti, + label="Inboard blanket", + ) + + # If the blanket has a liquid metal breeder... + if fwbs_variables.icooldual > 0: + deltap_blo_liq = self.deltap_tot( + output, + icoolpump=2, + flow_velocity=velblkto_liq, + flleng=bzfllengo_liq, + no90=no90bz_liq, + no180=no180bz_liq, + coolant_density=fwbs_variables.den_liq, + coolant_dynamic_viscosity=fwbs_variables.dynamic_viscosity_liq, + coolant_electrical_conductivity=fwbs_variables.electrical_conductivity_liq, + pol_channel_length=pollengo, + nopolchan=npoltoto, + label="Outboard blanket breeder liquid", + ) + if fwbs_variables.iblnkith == 1: + deltap_bli_liq = self.deltap_tot( + output, + icoolpump=2, + flow_velocity=velblkti_liq, + flleng=bzfllengi_liq, + no90=no90bz_liq, + no180=no180bz_liq, + coolant_density=fwbs_variables.den_liq, + coolant_dynamic_viscosity=fwbs_variables.dynamic_viscosity_liq, + coolant_electrical_conductivity=fwbs_variables.electrical_conductivity_liq, + pol_channel_length=pollengi, + nopolchan=npoltoti, + label="Inboard blanket breeder liquid", + ) - # Unless there is no IB blanket... + return [ + deltap_fwi, + deltap_fwo, + deltap_blo, + deltap_bli, + deltap_blo_liq, + deltap_bli_liq, + ] else: - # Radial direction - fwbs_variables.b_bz_liq = ( - blanket_library.bldepto * fwbs_variables.r_f_liq_ob - ) / fwbs_variables.nopol - # Toroidal direction - fwbs_variables.a_bz_liq = ( - blanket_library.blwidto * fwbs_variables.w_f_liq_ob - ) / fwbs_variables.nopipes - # Poloidal - if blanket_library.bllengo < (fwbs_variables.b_bz_liq * 3): - eh.report_error(278) + return [deltap_fwi, deltap_fwo, deltap_blo, deltap_blo_liq] - # Calculate total flow lengths, used for pressure drop calculation - # Blanket primary coolant flow - blanket_library.bzfllengi = ( - fwbs_variables.bzfllengi_n_rad * blanket_library.bldepti - + fwbs_variables.bzfllengi_n_pol * blanket_library.bllengi - ) - blanket_library.bzfllengo = ( - fwbs_variables.bzfllengo_n_rad * blanket_library.bldepto - + fwbs_variables.bzfllengo_n_pol * blanket_library.bllengo - ) - # Blanket secondary coolant/breeder flow - pollengi = blanket_library.bllengi - pollengo = blanket_library.bllengo - fwbs_variables.nopol = 2 - fwbs_variables.nopipes = 4 - bzfllengi_liq = ( - fwbs_variables.bzfllengi_n_rad_liq * blanket_library.bldepti - + fwbs_variables.bzfllengi_n_pol_liq * blanket_library.bllengi - ) - bzfllengo_liq = ( - fwbs_variables.bzfllengo_n_rad_liq * blanket_library.bldepto - + fwbs_variables.bzfllengo_n_pol_liq * blanket_library.bllengo - ) + else: + if fwbs_variables.iblnkith == 1: + return [deltap_fwi, deltap_fwo, deltap_blo, deltap_bli] + else: + return [deltap_fwi, deltap_fwo, deltap_blo] - # Coolant channel bends ######### + def thermo_hydraulic_model(self, output: bool): + """ + Thermo-hydraulic model for first wall and blanket + ONLY CALLED if primary_pumping = 2 or 3 - # Number of angle turns in FW and blanket flow channels, n.b. these are the - # same for ccfe hcpb and kit hcll. FW is also be the same for DCLL MMS ans SMS. - no90fw = 2 - no180fw = 0 + Calculations for detailed powerflow model secondary_cycle > 1 - # N.B. This is for BZ only, does not include MF/BSS. - if fwbs_variables.icooldual == 2: - no90bz = 4 - no180bz = 1 - no90bz_liq = 2 - no180bz_liq = 1 - elif fwbs_variables.icooldual == 1: - no90bz = 4 - no180bz = 1 - no90bz_liq = 2 - no180bz_liq = 1 - else: - no90bz = 4 - no180bz = 1 + original author: J. Morris, CCFE, Culham Science Centre + Dual-coolant modifications and generalisation refactor: G. Graham, CCFE + + Three options: + 1. Solid breeder - nuclear heating in the blanket is exctrated by the primary coolant. + 2. Liquid metal breeder, single-coolant + - nuclear heating in the blanket is exctrated by the primary coolant. + - liquid metal is circulated for tritium extraction, specified by number of circulations/day. + 3. Liquid metal breeder, dual-coolant - + - nuclear heating in the liquid breeder/coolant is extracted by the liquid breeder/coolant. + - nuclear heating in the blanket structure is extracted by the primary coolant + + Flow Channel and Coolant Input Info: + + N.B. Primary coolant applies to single-coolant BB, or structural cooling of dual-coolant BB. + Secondary coolant applies to self-cooled breeder material. + + Coolant Channels FW BB primary BB Liquid Breeder/Coolant + + length (m) fw_channel_length + width (m) afw (radius, cicular) afw a_bz_liq, b_bz_liq (rectangular) + wall thickness (m) fw_wall fw_wall th_wall_secondary + pitch (m) pitch + roughness epsilon roughness + peak FW temp (K) tpeak + maximum temp (K) tfwmatmax + FCI switch --- --- ifci - # Nuclear Power Deposited ####### + Coolant FW BB primary BB secondary + primary coolant switch fwcoolant coolwh --- + secondary coolant switch --- --- i_bb_liq + inlet temp (K) fwinlet inlet_temp inlet_temp_liq + outlet temp (K) fwoutlet outlet_temp outlet_temp_liq + pressure (Pa) fwpressure blpressure blpressure_liq + """ + ###################################################### + # Pre calculations needed for thermo-hydraulic model # + ###################################################### # IB/OB FW (MW) blanket_library.pnucfwi = ( fwbs_variables.pnucfw * build_variables.fwareaib / build_variables.fwarea @@ -586,184 +956,11 @@ def thermo_hydraulic_model(self, output: bool): # If the blanket is single-coolant with liquid metal breeder... elif fwbs_variables.icooldual == 1: - # Mass flow rate for outboard blanket coolant (kg/s) - blanket_library.mfblkto = ( - 1.0e6 - * (blanket_library.pnucblkto) - / (fwbs_variables.cp_bl * (fwbs_variables.outlet_temp - inlet_tempo)) - ) - - # Get mass flow rate etc. for inboard blanket breeder flow for tritium extraction - # Use the number of desired recirculations ([Aub2013]=10) and mass from dcll_masses - # N.B. wht_liq is BZ mass, does not include manifold. - blanket_library.mfblkto_liq = ( - fwbs_variables.n_liq_recirc * fwbs_variables.wht_liq_ob - ) / (24 * 3600) - - # If there is an IB blanket... - if fwbs_variables.iblnkith == 1: - # Mass flow rate for inboard blanket coolant (kg/s) - blanket_library.mfblkti = ( - 1.0e6 - * (blanket_library.pnucblkti) - / ( - fwbs_variables.cp_bl - * (fwbs_variables.outlet_temp - inlet_tempi) - ) - ) - # Mass flow rate for inboard breeder flow (kg/s) - fwbs_variables.mfblkti_liq = ( - fwbs_variables.n_liq_recirc * fwbs_variables.wht_liq_ib - ) / (24 * 3600) - - # If the blanket is single-coolant with solid breeder... - else: - # Mass flow rate for inboard blanket coolant (kg/s) - blanket_library.mfblkto = ( - 1.0e6 - * (blanket_library.pnucblkto) - / (fwbs_variables.cp_bl * (fwbs_variables.outlet_temp - inlet_tempo)) - ) - - # If there is an IB blanket... - # Mass flow rate for inboard blanket coolant (kg/s) - if fwbs_variables.iblnkith == 1: - blanket_library.mfblkti = ( - 1.0e6 - * (blanket_library.pnucblkti) - / ( - fwbs_variables.cp_bl - * (fwbs_variables.outlet_temp - inlet_tempi) - ) - ) - - # FW Pipe Flow and Velocity ###### - - # Total number of first wall pipes from channel length and pitch (02/12/2015) - blanket_library.npfwi = build_variables.fwareaib / ( - fwbs_variables.fw_channel_length * fwbs_variables.pitch - ) - blanket_library.npfwo = build_variables.fwareaob / ( - fwbs_variables.fw_channel_length * fwbs_variables.pitch - ) - - # Mass flow rate per FW coolant pipe (kg/s): - blanket_library.mffwpi = blanket_library.mffwi / blanket_library.npfwi - blanket_library.mffwpo = blanket_library.mffwo / blanket_library.npfwo - - # Coolant velocite in FW (m/s) - velfwi = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mffwpi, - flow_density=fwbs_variables.rhof_fw, - ) - velfwo = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mffwpo, - flow_density=fwbs_variables.rhof_fw, - ) - - # If the blanket is dual-coolant... - if fwbs_variables.icooldual == 2: - # Calc total num of pipes (in all inboard modules) from - # coolant frac and channel dimensions - # Assumes up/down flow, two 90 deg bends per length - blanket_library.npblkto = ( - fwbs_variables.vfblkt * fwbs_variables.volblkto - ) / ( - np.pi - * fwbs_variables.afw - * fwbs_variables.afw - * blanket_library.bzfllengo - ) - npblkto_liq = ( - fwbs_variables.nopipes - * fwbs_variables.nblktmodto - * fwbs_variables.nblktmodpo - ) - - # Mass flow rate per coolant pipe - blanket_library.mfblktpo = blanket_library.mfblkto / blanket_library.npblkto - mfblktpo_liq = blanket_library.mfblkto_liq / npblkto_liq - # Coolant velocites in blanket (m/s) - # Assume BZ structure has same channel width as FW - blanket_library.velblkto = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mfblktpo, - flow_density=fwbs_variables.rhof_bl, - ) - velblkto_liq = blanket_library.flow_velocity( - i_channel_shape=2, - mass_flow_rate=mfblktpo_liq, - flow_density=fwbs_variables.den_liq, - ) - - if fwbs_variables.iblnkith == 1: - # Calc total num of pipes (in all inboard modules) from - # coolant frac and channel dimensions - # Assumes up/down flow, two 90 deg bends per length - blanket_library.npblkti = ( - fwbs_variables.vfblkt * fwbs_variables.volblkti - ) / ( - np.pi - * fwbs_variables.afw - * fwbs_variables.afw - * blanket_library.bzfllengi - ) - # Have DEMO DCLL set here for now - npblkti_liq = ( - fwbs_variables.nopipes - * fwbs_variables.nblktmodti - * fwbs_variables.nblktmodpi - ) - - # Mass flow rate per coolant pipe - blanket_library.mfblktpi = ( - blanket_library.mfblkti / blanket_library.npblkti - ) - blanket_library.mfblktpi_liq = blanket_library.mfblkti_liq / npblkti_liq - - # Coolant velocites in blanket (m/s) - # Assume BZ structure has same channel width as FW - blanket_library.velblkti = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mfblktpi, - flow_density=fwbs_variables.rhof_bl, - ) - velblkti_liq = blanket_library.flow_velocity( - i_channel_shape=2, - mass_flow_rate=blanket_library.mfblktpi_liq, - flow_density=fwbs_variables.den_liq, - ) - - # If the blanket is single-coolant with liquid metal breeder... - elif fwbs_variables.icooldual == 1: - # Calc total num of pipes (in all inboard modules) from - # coolant frac and channel dimensions - # Assumes up/down flow, two 90 deg bends per length - blanket_library.npblkto = ( - fwbs_variables.vfblkt * fwbs_variables.volblkto - ) / ( - np.pi - * fwbs_variables.afw - * fwbs_variables.afw - * blanket_library.bzfllengo - ) - npblkto_liq = ( - fwbs_variables.nopipes - * fwbs_variables.nblktmodto - * fwbs_variables.nblktmodpo - ) - - # Mass flow rate per coolant pipe - blanket_library.mfblktpo = blanket_library.mfblkto / blanket_library.npblkto - - # Coolant velocity in blanket (m/s) - # Assume BZ structure has same channel width as FW - blanket_library.velblkto = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mfblktpo, - flow_density=fwbs_variables.rhof_bl, + # Mass flow rate for outboard blanket coolant (kg/s) + blanket_library.mfblkto = ( + 1.0e6 + * (blanket_library.pnucblkto) + / (fwbs_variables.cp_bl * (fwbs_variables.outlet_temp - inlet_tempo)) ) # Get mass flow rate etc. for inboard blanket breeder flow for tritium extraction @@ -772,220 +969,78 @@ def thermo_hydraulic_model(self, output: bool): blanket_library.mfblkto_liq = ( fwbs_variables.n_liq_recirc * fwbs_variables.wht_liq_ob ) / (24 * 3600) - blanket_library.mfblktpo_liq = blanket_library.mfblkto_liq / npblkto_liq - velblkto_liq = blanket_library.flow_velocity( - i_channel_shape=2, - mass_flow_rate=blanket_library.mfblktpo_liq, - flow_density=fwbs_variables.den_liq, - ) + # If there is an IB blanket... if fwbs_variables.iblnkith == 1: - # Calc total num of pipes (in all inboard modules) from - # coolant frac and channel dimensions - # Assumes up/down flow, two 90 deg bends per length - blanket_library.npblkti = ( - fwbs_variables.vfblkt * fwbs_variables.volblkti - ) / ( - np.pi - * fwbs_variables.afw - * fwbs_variables.afw - * blanket_library.bzfllengi - ) - # Have DEMO DCLL set here for now - npblkti_liq = ( - fwbs_variables.nopipes - * fwbs_variables.nblktmodti - * fwbs_variables.nblktmodpi - ) - - # Mass flow rate per coolant pipe - blanket_library.mfblktpi = ( - blanket_library.mfblkti / blanket_library.npblkti - ) - - # Coolant velocity in blanket (m/s) - # Assume BZ structure has same channel width as FW - blanket_library.velblkti = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=fwbs_variables.mfblktpi, - flow_density=fwbs_variables.rhof_bl, + # Mass flow rate for inboard blanket coolant (kg/s) + blanket_library.mfblkti = ( + 1.0e6 + * (blanket_library.pnucblkti) + / ( + fwbs_variables.cp_bl + * (fwbs_variables.outlet_temp - inlet_tempi) + ) ) - - # Get mass flow rate etc. for inboard blanket breeder flow for tritium extraction - # Use the number of desired recirculations ([Aub2013]=10) and mass from dcll_masses - # N.B. wht_liq is BZ mass, does not include manifold. - blanket_library.mfblkti_liq = ( + # Mass flow rate for inboard breeder flow (kg/s) + fwbs_variables.mfblkti_liq = ( fwbs_variables.n_liq_recirc * fwbs_variables.wht_liq_ib ) / (24 * 3600) - blanket_library.mfblktpi_liq = fwbs_variables.mfblkti_liq / npblkti_liq - velblkti_liq = blanket_library.flow_velocity( - i_channel_shape=2, - mass_flow_rate=blanket_library.mfblktpi_liq, - flow_density=fwbs_variables.den_liq, - ) # If the blanket is single-coolant with solid breeder... else: - # Calculate total number of pipes (in all outboard modules) from coolant fraction and - # channel dimensions (assumes up/down flow, two 90 deg bends per length) - blanket_library.npblkto = ( - fwbs_variables.vfblkt * fwbs_variables.volblkto - ) / ( - np.pi - * fwbs_variables.afw - * fwbs_variables.afw - * blanket_library.bzfllengo - ) - - # Mass flow rate per coolant pipe - blanket_library.mfblktpo = blanket_library.mfblkto / blanket_library.npblkto - - # Coolant velocity in blanket (m/s) - # Assume BZ structure has same channel width as FW - blanket_library.velblkto = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mfblktpo, - flow_density=fwbs_variables.rhof_bl, + # Mass flow rate for inboard blanket coolant (kg/s) + blanket_library.mfblkto = ( + 1.0e6 + * (blanket_library.pnucblkto) + / (fwbs_variables.cp_bl * (fwbs_variables.outlet_temp - inlet_tempo)) ) + # If there is an IB blanket... + # Mass flow rate for inboard blanket coolant (kg/s) if fwbs_variables.iblnkith == 1: - # Calc total num of pipes (in all inboard modules) from - # coolant frac and channel dimensions - # Assumes up/down flow, two 90 deg bends per length - blanket_library.npblkti = ( - fwbs_variables.vfblkt * fwbs_variables.volblkti - ) / ( - np.pi - * fwbs_variables.afw - * fwbs_variables.afw - * blanket_library.bzfllengi - ) - - # Mass flow rate per coolant pipe - blanket_library.mfblktpi = ( - blanket_library.mfblkti / blanket_library.npblkti - ) - - # Coolant velocity in blanket (m/s) - # Assume BZ structure has same channel width as FW - blanket_library.velblkti = blanket_library.flow_velocity( - i_channel_shape=1, - mass_flow_rate=blanket_library.mfblktpi, - flow_density=fwbs_variables.rhof_bl, + blanket_library.mfblkti = ( + 1.0e6 + * (blanket_library.pnucblkti) + / ( + fwbs_variables.cp_bl + * (fwbs_variables.outlet_temp - inlet_tempi) + ) ) - # FW Presure Drops ############### - - deltap_fwi = self.deltap_tot( - output, - icoolpump=1, - flow_velocity=velfwi, - flleng=fwbs_variables.fw_channel_length, - no90=no90fw, - no180=no180fw, - coolant_density=fwbs_variables.rhof_fw, - coolant_dynamic_viscosity=fwbs_variables.visc_fw, - coolant_electrical_conductivity=0.0e0, - pol_channel_length=pollengi, - nopolchan=npoltoti, - label="Inboard first wall", - ) - - deltap_fwo = self.deltap_tot( - output, - icoolpump=1, - flow_velocity=velfwo, - flleng=fwbs_variables.fw_channel_length, - no90=no90fw, - no180=no180fw, - coolant_density=fwbs_variables.rhof_fw, - coolant_dynamic_viscosity=fwbs_variables.visc_fw, - coolant_electrical_conductivity=0.0e0, - pol_channel_length=pollengo, - nopolchan=npoltoto, - label="Outboard first wall", - ) - - # BB Presure Drops ############### - - # Long polodal flows - if fwbs_variables.iblnkith == 1: - npoltoti = fwbs_variables.nopol * npblkti_liq - npoltoto = fwbs_variables.nopol * npblkto_liq - - deltap_blo = self.deltap_tot( - output, - icoolpump=1, - flow_velocity=blanket_library.velblkto, - flleng=blanket_library.bzfllengo, - no90=no90bz, - no180=no180bz, - coolant_density=fwbs_variables.rhof_bl, - coolant_dynamic_viscosity=fwbs_variables.visc_bl, - coolant_electrical_conductivity=0.0e0, - pol_channel_length=pollengo, - nopolchan=npoltoto, - label="Outboard blanket", - ) - - if fwbs_variables.iblnkith == 1: - deltap_bli = self.deltap_tot( - output, - icoolpump=1, - flow_velocity=blanket_library.velblkti, - flleng=blanket_library.bzfllengi, - no90=no90bz, - no180=no180bz, - coolant_density=fwbs_variables.rhof_bl, - coolant_dynamic_viscosity=fwbs_variables.visc_bl, - coolant_electrical_conductivity=0.0e0, - pol_channel_length=pollengi, - nopolchan=npoltoti, - label="Inboard blanket", - ) + ######################################################## + # Handling of pressure drops and coolant pumping power # + ######################################################## - # If the blanket has a liquid metal breeder... - if fwbs_variables.icooldual > 0: - deltap_blo_liq = self.deltap_tot( - output, - icoolpump=2, - flow_velocity=velblkto_liq, - flleng=bzfllengo_liq, - no90=no90bz_liq, - no180=no180bz_liq, - coolant_density=fwbs_variables.den_liq, - coolant_dynamic_viscosity=fwbs_variables.dynamic_viscosity_liq, - coolant_electrical_conductivity=fwbs_variables.electrical_conductivity_liq, - pol_channel_length=pollengo, - nopolchan=npoltoto, - label="Outboard blanket breeder liquid", + # load in pressures if primary pumping == 2 + if fwbs_variables.primary_pumping == 2: + deltap = self.thermo_hydraulic_model_pressure_drop_calculations( + output=output ) - if fwbs_variables.iblnkith == 1: - deltap_bli_liq = self.deltap_tot( - output, - icoolpump=2, - flow_velocity=velblkti_liq, - flleng=bzfllengi_liq, - no90=no90bz_liq, - no180=no180bz_liq, - coolant_density=fwbs_variables.den_liq, - coolant_dynamic_viscosity=fwbs_variables.dynamic_viscosity_liq, - coolant_electrical_conductivity=fwbs_variables.electrical_conductivity_liq, - pol_channel_length=pollengi, - nopolchan=npoltoti, - label="Inboard blanket breeder liquid", - ) + deltap_fwi = deltap[0] + deltap_fwo = deltap[1] + deltap_blo = deltap[2] + if fwbs_variables.icooldual > 0: + if fwbs_variables.iblnkith == 1: + deltap_bli = deltap[3] + deltap_blo_liq = deltap[4] + deltap_bli_liq = deltap[5] + else: + deltap_blo_liq = deltap[3] + else: + if fwbs_variables.iblnkith == 1: + deltap_bli = deltap[3] # Pumping Power - # If FW and BB have the same coolant... if fwbs_variables.ipump == 0: # Total pressure drop in the first wall/blanket (Pa) - if fwbs_variables.iblnkith == 1: - deltap_fw_blkt = deltap_fwi + deltap_bli + deltap_fwo + deltap_blo - if fwbs_variables.iblnkith == 0: - deltap_fw_blkt = deltap_fwi + deltap_fwo + deltap_blo - + if fwbs_variables.primary_pumping == 2: + if fwbs_variables.iblnkith == 1: + deltap_fw_blkt = deltap_fwi + deltap_bli + deltap_fwo + deltap_blo + if fwbs_variables.iblnkith == 0: + deltap_fw_blkt = deltap_fwi + deltap_fwo + deltap_blo + elif fwbs_variables.primary_pumping == 3: + deltap_fw_blkt = primary_pumping_variables.dp_fw_blkt # Total coolant mass flow rate in the first wall/blanket (kg/s) blanket_library.mftotal = blanket_library.mffwi + blanket_library.mffwo @@ -1007,14 +1062,18 @@ def thermo_hydraulic_model(self, output: bool): # If FW and BB have different coolants... elif fwbs_variables.ipump == 1: - # Total pressure drop in the first wall (Pa) - deltap_fw = deltap_fwi + deltap_fwo - - # Total pressure drop in the blanket (Pa) - if fwbs_variables.iblnkith == 1: - deltap_blkt = deltap_bli + deltap_blo - if fwbs_variables.iblnkith == 0: - deltap_blkt = deltap_blo + if fwbs_variables.primary_pumping == 2: + # Total pressure drop in the first wall (Pa) + deltap_fw = deltap_fwi + deltap_fwo + + # Total pressure drop in the blanket (Pa) + if fwbs_variables.iblnkith == 1: + deltap_blkt = deltap_bli + deltap_blo + if fwbs_variables.iblnkith == 0: + deltap_blkt = deltap_blo + elif fwbs_variables.primary_pumping == 3: + deltap_fw = primary_pumping_variables.dp_fw + deltap_blkt = primary_pumping_variables.dp_blkt # Total coolant mass flow rate in the first wall (kg/s) blanket_library.mffw = blanket_library.mffwi + blanket_library.mffwo @@ -1061,11 +1120,13 @@ def thermo_hydraulic_model(self, output: bool): # If the blanket has a liquid metal breeder... if fwbs_variables.icooldual > 0: # Total pressure drop in the blanket (Pa) - if fwbs_variables.iblnkith == 1: - deltap_bl_liq = deltap_bli_liq + deltap_blo_liq - if fwbs_variables.iblnkith == 0: - deltap_bl_liq = deltap_blo_liq - + if fwbs_variables.primary_pumping == 2: + if fwbs_variables.iblnkith == 1: + deltap_bl_liq = deltap_bli_liq + deltap_blo_liq + if fwbs_variables.iblnkith == 0: + deltap_bl_liq = deltap_blo_liq + elif fwbs_variables.primary_pumping == 3: + deltap_bl_liq = primary_pumping_variables.dp_liq # Total liquid metal breeder/coolant mass flow rate in the blanket (kg/s) fwbs_variables.mfblkt_liq = ( blanket_library.mfblkti_liq + blanket_library.mfblkto_liq @@ -1427,6 +1488,14 @@ def pumppower( # Inlet pressure (Pa) coolpin = pressure + pdrop + # Adiabatic index for + if fwbs_variables.coolwh == 1: + # helium + gamma = 5 / 3 + else: + # water + gamma = 4 / 3 + # If caculating for primary coolant... if icoolpump == 1: # Comments from original pumppower function: @@ -1453,7 +1522,7 @@ def pumppower( # the isentropic efficiency of the pump. fp = ( temp_in - * (1 - (coolpin / pressure) ** -0.4) + * (1 - (coolpin / pressure) ** -((gamma - 1) / gamma)) / (fwbs_variables.etaiso * (temp_out - temp_in)) ) pumppower = ( @@ -1472,7 +1541,7 @@ def pumppower( # the isentropic efficiency of the pump. fp = ( temp_in - * (1 - (coolpin / pressure) ** -0.4) + * (1 - (coolpin / pressure) ** -((gamma - 1) / gamma)) / (fwbs_variables.etaiso_liq * (temp_out - temp_in)) ) pumppower = (1e-6 * mf * spec_vol * pdrop / fwbs_variables.etaiso_liq) / ( diff --git a/process/dcll.py b/process/dcll.py index c48cd20980..bc11c5cee3 100644 --- a/process/dcll.py +++ b/process/dcll.py @@ -296,10 +296,10 @@ def dcll_power_and_heating(self, output: bool): + fwbs_variables.praddiv ) - elif fwbs_variables.primary_pumping == 2: + elif fwbs_variables.primary_pumping in [2, 3]: + # elif fwbs_variables.primary_pumping == 2: # Mechanical pumping power is calculated for first wall and blanket self.blanket_library.thermo_hydraulic_model(output=output) - # For divertor,mechanical pumping power is a fraction of thermal power removed by coolant heat_transport_variables.htpmw_div = heat_transport_variables.fpumpdiv * ( physics_variables.pdivt From 1039460bc0e482e36e355ad17759c06268127616 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Wed, 4 Sep 2024 11:07:48 +0100 Subject: [PATCH 2/9] added 4 pressure drop variables with defaults to primary_pumping_variables for use in DCLL model with primary_pumping=3 --- source/fortran/primary_pumping_variables.f90 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/fortran/primary_pumping_variables.f90 b/source/fortran/primary_pumping_variables.f90 index 13cab1904f..9ca8823d0c 100644 --- a/source/fortran/primary_pumping_variables.f90 +++ b/source/fortran/primary_pumping_variables.f90 @@ -34,6 +34,18 @@ module primary_pumping_variables real(dp) :: dp_he !! pressure drop in FW and blanket coolant including heat exchanger and pipes (`primary_pumping=3`) [Pa] + real(dp) :: dp_fw_blkt + !! pressure drop in FW and blanket coolant including heat exchanger and pipes (`primary_pumping=3`) [Pa] + + real(dp) :: dp_fw + !! pressure drop in FW coolant including heat exchanger and pipes (`primary_pumping=3`) [Pa] + + real(dp) :: dp_blkt + !! pressure drop in blanket coolant including heat exchanger and pipes (`primary_pumping=3`) [Pa] + + real(dp) :: dp_liq + !! pressure drop in liquid metal blanket coolant including heat exchanger and pipes (`primary_pumping=3`) [Pa] + real(dp) :: htpmw_fw_blkt !! mechanical pumping power for FW and blanket including heat exchanger and !! pipes (`primary_pumping=3`) [MW] @@ -51,6 +63,10 @@ subroutine init_primary_pumping_variables t_out_bb = 773.13D0 ! K p_he = 8.0D6 ! Pa dp_he = 5.5D5 ! Pa + dp_fw_blkt = 1.5D5 ! Pa + dp_fw = 1.5D5 ! Pa + dp_blkt = 3.5D3 ! Pa + dp_liq = 1.0D7 ! Pa htpmw_fw_blkt = 0.0D0 end subroutine init_primary_pumping_variables From da9ac03ce20eeeece2d3308eedd4c926df062df0 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Wed, 4 Sep 2024 11:09:33 +0100 Subject: [PATCH 3/9] added coolwh and emult as input variables as well as new pressure drop variables --- source/fortran/input.f90 | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/source/fortran/input.f90 b/source/fortran/input.f90 index c1d79dcaed..d45617e22d 100644 --- a/source/fortran/input.f90 +++ b/source/fortran/input.f90 @@ -279,7 +279,8 @@ subroutine parse_input_file(in_file,out_file,show_changes) denstl, declfw, nphcdout, iblnkith, vfpblkt, fwinlet, wallpf, fblbe, & fhole, fwbsshape, coolp, tfwmatmax, irefprop, fw_channel_length, & li6enrich, etaiso, nblktmodto, fvoldw, i_shield_mat, i_bb_liq, & - icooldual, ifci, inlet_temp_liq, outlet_temp_liq, bz_channel_conduct_liq, ipump, ims + icooldual, ifci, inlet_temp_liq, outlet_temp_liq, bz_channel_conduct_liq, ipump, ims, & + coolwh, emult use heat_transport_variables, only: htpmw_fw, baseel, fmgdmw, htpmw_div, & pwpm2, etath, vachtmw, iprimshld, fpumpdiv, pinjmax, htpmw_blkt, etatf, & htpmw_min, fpumpblkt, ipowerflow, htpmw_shld, fpumpshld, trithtmw, & @@ -316,7 +317,8 @@ subroutine parse_input_file(in_file,out_file,show_changes) use pf_power_variables, only: iscenr, maxpoloidalpower use pulse_variables, only: lpulse, dtstor, itcycl, istore, bctmp - use primary_pumping_variables, only: t_in_bb, t_out_bb, dp_he, p_he, gamma_he + use primary_pumping_variables, only: t_in_bb, t_out_bb, dp_he, p_he, gamma_he, & + dp_fw_blkt, dp_fw, dp_blkt, dp_liq use scan_module, only: isweep_2, nsweep, isweep, scan_dim, nsweep_2, & sweep_2, sweep, ipnscns, ipnscnv @@ -2037,6 +2039,9 @@ subroutine parse_input_file(in_file,out_file,show_changes) case ('ims') call parse_int_variable('ims', ims, 0, 1, & ' Switch for Multi or Single Modle Segment (MMS or SMS)') + case ('coolwh') + call parse_int_variable('coolwh', coolwh, 1, 2, & + ' Blanket coolant type (1=He, 2=H20)') case ('secondary_cycle') call parse_int_variable('secondary_cycle', secondary_cycle, 0, 4, & @@ -2321,6 +2326,18 @@ subroutine parse_input_file(in_file,out_file,show_changes) case ('dp_he') call parse_real_variable('dp_he', dp_he, 0.0D0, 10.0D6, & 'Helium Pressure drop or Gas Pressure drop (Pa)') + case ('dp_fw_blkt') + call parse_real_variable('dp_fw_blkt', dp_fw_blkt, 0.0D0, 10.0D6, & + 'Pressure drop across FW and blanket (Pa)') + case ('dp_fw') + call parse_real_variable('dp_fw', dp_fw, 0.0D0, 10.0D6, & + 'Pressure drop across FW (Pa)') + case ('dp_blkt') + call parse_real_variable('dp_blkt', dp_blkt, 0.0D0, 10.0D6, & + 'Pressure drop across blanket (Pa)') + case ('dp_liq') + call parse_real_variable('dp_liq', dp_liq, 0.0D0, 10.0D6, & + 'Pressure drop across liquid metal blanket (Pa)') case ('p_he') call parse_real_variable('p_he', p_he, 0.0D0, 100.0D6, & 'Pressure in FW and blanket coolant at pump exit') From a1637afdf56ddcb056b16a5126006b0a4d17136a Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Fri, 6 Sep 2024 14:18:12 +0100 Subject: [PATCH 4/9] removal of KIT blanket options since they are no longer in PROCESS --- .../proc-pages/eng-models/fw-blanket.md | 102 ------------------ 1 file changed, 102 deletions(-) diff --git a/documentation/proc-pages/eng-models/fw-blanket.md b/documentation/proc-pages/eng-models/fw-blanket.md index bde0183557..daf53308b2 100644 --- a/documentation/proc-pages/eng-models/fw-blanket.md +++ b/documentation/proc-pages/eng-models/fw-blanket.md @@ -44,11 +44,6 @@ electricity have been revised extensively. using parametric fits to an MCNP neutron and photon transport model of a sector of a tokamak. The blanket contains lithium orthosilicate Li$_4$SiO$_4$, titanium beryllide TiBe$_{12}$, helium and Eurofer steel. -- `== 2` -- KIT HCPB model. It allows the energy multiplication factor `emult`, - the shielding requirements and tritium breeding ratio to be calculated - self-consistently with the blanket and shielding materials and sub-assembly - thicknesses, and for constraints to be applied to satisfy the engineering - requirements. For further details of this model. - `== 3` -- CCFE HCPB model with tritium breeding ratio. It has the features of the CCFE HCPB model above, with a set of fitting functions for calculating tritium breeding ratio (TBR). It requires a choice of `iblanket_thickness`, @@ -70,103 +65,6 @@ first wall and blanket is determined, and also how the calculation of the plant' thermal to electric conversion efficiency (the secondary cycle thermal efficiency) proceeds. -### KIT Blanket Neutronics Model - -The model used if `blktmodel = 1` is based on the Helium-Cooled Pebble -Bed (HCPB) blanket concept developed by KIT (a second advanced model -- -Helium-Cooled Lithium Lead, HCLL -- will be implemented in due course). The -blanket, shield and vacuum vessel are segmented radially into a number of -sub-assemblies. Moving in the direction away from the plasma/first wall, these -are: - -Breeding Zone (BZ) (which includes the first wall), with radial -thicknesses (inboard and outboard, respectively) `fwith + blbuith`, -`fwoth+blbuoth`. This consists of beryllium (with fraction by volume `fblbe`), -breeder material (`fblbreed`), steel (`fblss`) and helium coolant. Three -forms of breeder material are available: - -| `breedmat` | Description | -| :--------: | ------------------------------------- | -| 1 | lithium orthosilicate (Li$_4$SiO$_4$) | -| 2 | lithium metatitanate (Li$_2$TiO$_3$) | -| 3 | lithium zirconate (Li$_2$ZrO$_3$) | - -The $^6$Li enrichment percentage may be modified from the default 30% using -input parameter `li6enrich`. - -- Box Manifold (BM), with radial thicknesses (inboard and outboard, - respectively) `blbmith`, `blbmoth` and helium fractions `fblhebmi`, `fblhebmo` - (the rest being steel). -- Back Plate (BP), with radial thicknesses (inboard and outboard, - respectively) `blbpith`, `blbpoth` and helium fractions `fblhebpi`, `fblhebpo` - (the rest being steel). - -Together, the BZ, BM and BP make up the `blanket`, with total radial -thicknesses `blnkith` (inboard) and `blnkoth` (outboard), and void (coolant) -fraction `vfblkt`; Note that these quantities are `calculated` from the -sub-assembly values if `blktmodel > 0`, rather than being input parameters. - -Low Temperature Shield and Vacuum Vessel (lumped together for these -calculations), with radial thicknesses (inboard and outboard, respectively) -`shldith + d_vv_in`, `shldoth + d_vv_out` and **water** coolant fraction -`vfshld` (the rest being assumed to be steel for its mass calculation; the -neutronics model assumes that the shield contains 2% boron as a neutron absorber, -but this material is not explicitly mentioned elsewhere in the code -- so -its cost is not calculated, for example). - -!!! Note "Note" - The fact that water is assumed to be the coolant in the shield, whereas - helium is the coolant in the blanket, leads to an inconsistency when - specifying the coolant type via switch `coolwh`. At present we mitigate this - by forcing `coolwh=2` (making water the coolant), as in this case the - coolant mass and pumping costs are higher, giving the more pessimistic - solution with regards to costs. - -A few other input parameters are useful for tuning purposes, as follows: - -| Parameter | Description | -| :----------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `fvolsi/fvolso` | area (and volume) coverage factors for the inboard and outboard shields, respectively. | -| `fvoldw` | multiplier for volume of vacuum vessel, used in mass calculations to account for ports, etc. | -| `npdiv` | number of divertor ports, used in the calculation of the tritium breeding ratio. | -| `nphcdin/nphcdout` | number of heating/current drive ports on the inboard and outboard sides, respectively, used in the calculation of the tritium breeding ratio. These may be either 'small' (`hcdportsize = 1`) or 'large' (`hcdportsize = 2`). | -| `wallpf` | neutron wall load peaking factor (maximum/mean), used in the calculation of the blanket lifetime. | -| `ucblbreed` | unit cost (\$/kg) of the breeder material | - -#### KIT model outputs and available constraints - -The KIT blanket model has the following available constraints - -| Constraint No. | F-value | F-value No. | Limit | Description | -| :------------: | :-------: | :---------: | :---------: | ---------------------------------- | -| 52 | `ftbr` | 89 | `tbrmin` | Min required `tbr` | -| 53 | `fflutf` | 92 | `nflutfmax` | Max allowed TF fluence | -| 54 | `fptfnuc` | 95 | `ptfnucmax` | Max allowed heating of TF coils | -| 55 | `fvvhe` | 96 | `vvhealw` | Max allowed He concentration in VV | - -The KIT blanket neutronics model provides the following outputs: - -| Output | Units | Itvar. | Description | -| :---------: | :------: | ------ | ------------------------------------------------------------------------ | -| `pnucblkt` | MW | - | Total nuclear power deposited in blanket | -| `pnucshld` | MW | - | Total nuclear power deposited in shield | -| `emult` | - | - | The energy multiplication factor in the blanket | -| `tbr` | - | - | Tritium breeding ratio | -| `blbuith` | m | 90 | Inboard blanket thickness | -| `blbuoth` | m | 91 | Outboard blanket thickness | -| `tritprate` | - | - | The tritium production rate in grammes/day is calculated. | -| `nflutfi` | n/m$^2$ | - | The fast neutron fluence on the inboard TF coils | -| `nflutfo` | n/m$^2$ | - | The fast neutron fluence on the inboard TF coils | -| `shldith` | m | 93 | Inboard shield thickness | -| `shldoth` | m | 94 | Outboard shield thickness | -| `pnuctfi` | MW/m$^3$ | - | Nuclear heating power on inboard TF coil | -| `pnuctfo` | MW/m$^3$ | - | Nuclear heating power on outboard TF coil | -| `vvhemini` | appm | - | Min He concentration in the inboard VV at the end of the plant lifetime | -| `vvhemaxi` | appm | - | Max He concentration in the inboard VV at the end of the plant lifetime | -| `vvhemino` | appm | - | Min He concentration in the outboard VV at the end of the plant lifetime | -| `vvhemaxo` | appm | - | Max He concentration in the outboard VV at the end of the plant lifetime | -| `bktlife` | fp-yrs | - | Blanket lifetime in full power years assuming max damage ~60 dpa | - ## Thermo-hydraulic model for first wall and blanket !!! Note "Note" From e67363f6097d6a5602628f3b30cb8cf5c1a10680 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Fri, 6 Sep 2024 14:40:06 +0100 Subject: [PATCH 5/9] update to docs to show change to thermo-hydraulic model to allow primary_pumping=3 --- documentation/proc-pages/eng-models/fw-blanket.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/proc-pages/eng-models/fw-blanket.md b/documentation/proc-pages/eng-models/fw-blanket.md index daf53308b2..1672b102f9 100644 --- a/documentation/proc-pages/eng-models/fw-blanket.md +++ b/documentation/proc-pages/eng-models/fw-blanket.md @@ -68,7 +68,7 @@ efficiency) proceeds. ## Thermo-hydraulic model for first wall and blanket !!! Note "Note" - This is only called for primary_pumping = 2 + This is called for primary_pumping = 2 and 3 Summary of key variables and switches: @@ -142,6 +142,8 @@ where $\texttt{tkfw}$ is the thermal conductivity of the first wall material and The temperature difference between the channel inner wall (film temperature) and the bulk coolant is calculated using the heat transfer coefficient, which is derived using the [Gnielinski correlation](https://en.wikipedia.org/wiki/Nusselt_number#Gnielinski_correlation). The pressure drop is based on the Darcy fraction factor, using the [Haaland equation](https://en.wikipedia.org/wiki/Darcy_friction_factor_formulae#Haaland_equation), an approximation to the implicit Colebrook–White equation. The thermal conductivity of Eurofer is used, from "Fusion Demo Interim Structural Design Criteria - Appendix A Material Design Limit Data", F. Tavassoli, TW4-TTMS-005-D01, 2004" +!!! Note "Note" + The pressure drop calculation is only performed for primary_pumping = 2, as for 3 it is used as an input. ### Model Switches From c6f6accdc2d6a70aa7b5596b4f99afc30191f7b7 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Fri, 6 Sep 2024 14:47:49 +0100 Subject: [PATCH 6/9] point towards heat transport section when talking about primary pumping in docs --- documentation/proc-pages/eng-models/fw-blanket.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/proc-pages/eng-models/fw-blanket.md b/documentation/proc-pages/eng-models/fw-blanket.md index 1672b102f9..80e8481354 100644 --- a/documentation/proc-pages/eng-models/fw-blanket.md +++ b/documentation/proc-pages/eng-models/fw-blanket.md @@ -143,7 +143,7 @@ where $\texttt{tkfw}$ is the thermal conductivity of the first wall material and The temperature difference between the channel inner wall (film temperature) and the bulk coolant is calculated using the heat transfer coefficient, which is derived using the [Gnielinski correlation](https://en.wikipedia.org/wiki/Nusselt_number#Gnielinski_correlation). The pressure drop is based on the Darcy fraction factor, using the [Haaland equation](https://en.wikipedia.org/wiki/Darcy_friction_factor_formulae#Haaland_equation), an approximation to the implicit Colebrook–White equation. The thermal conductivity of Eurofer is used, from "Fusion Demo Interim Structural Design Criteria - Appendix A Material Design Limit Data", F. Tavassoli, TW4-TTMS-005-D01, 2004" !!! Note "Note" - The pressure drop calculation is only performed for primary_pumping = 2, as for 3 it is used as an input. + The pressure drop calculation is only performed for primary_pumping = 2, as for 3 it is used as an input, as explained in the heat transport section. ### Model Switches From e39448c5741f3d5cfc8816f82dcde8fd09af7a81 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Fri, 6 Sep 2024 14:49:38 +0100 Subject: [PATCH 7/9] removes commented out line that is not needed in dcll.py --- process/dcll.py | 1 - 1 file changed, 1 deletion(-) diff --git a/process/dcll.py b/process/dcll.py index bc11c5cee3..b059cf4dac 100644 --- a/process/dcll.py +++ b/process/dcll.py @@ -297,7 +297,6 @@ def dcll_power_and_heating(self, output: bool): ) elif fwbs_variables.primary_pumping in [2, 3]: - # elif fwbs_variables.primary_pumping == 2: # Mechanical pumping power is calculated for first wall and blanket self.blanket_library.thermo_hydraulic_model(output=output) # For divertor,mechanical pumping power is a fraction of thermal power removed by coolant From fd7b45960d606987ab6046a70bc38907a85104bd Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Fri, 6 Sep 2024 15:07:42 +0100 Subject: [PATCH 8/9] addition to heat transport section for new pressure drop variables --- ...power-conversion-and-heat-dissipation-systems.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md b/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md index 7316c2503f..6089e675e8 100644 --- a/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md +++ b/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md @@ -62,7 +62,18 @@ for the primary coolant. mechanical power used) is specified by the parameter `etaiso`. Note that the mechanical pumping power for the shield and divertor are still calculated using the simplified method (a fixed fraction of the heat transported). - - If `primary_pumping` = 3, the mechanical pumping power is calculated using specified pressure drop. The pressures and temperatures are set by the user. + - If `primary_pumping` = 3, the mechanical pumping power is calculated using specified pressure drop. + The pressures and temperatures are set by the user. + - When used with the DCLL model a different set of pressure drop variables are used, which are outlined below: + + | Variable | Units | Itvar. | Default | Description | + | :----------: | :---: | ------ | ------- | -------------------------------------------------------------------------------- | + | `dp_fw_blnkt` | Pa | | 1.5D5 | Pressure drop in FW and blanket coolant including heat exchanger and pipes | + | `dp_fw` | Pa | | 1.5D5 | Pressure drop in FW coolant including heat exchanger and pipes | + | `dp_blkt` | Pa | | 3.5D3 | Pressure drop in blanket coolant including heat exchanger and pipes | + | `dp_liq` | Pa | | 1.0D7 | Pressure drop in liquid metal blanket coolant including heat exchanger and pipes | + + - The defaults for these variables are geared towards a WCLL concept, so different values should be used with Helium cooling. `secondary_cycle` : This switch controls the calculation of the thermal to electric conversion efficiency in the secondary cycle. From dda56e4fcacf9b0162f4837dd3f236c326ea6a26 Mon Sep 17 00:00:00 2001 From: Jonathan Matthews Date: Fri, 6 Sep 2024 15:16:30 +0100 Subject: [PATCH 9/9] remove table column in heat transport docs --- .../power-conversion-and-heat-dissipation-systems.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md b/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md index 6089e675e8..e00c351e48 100644 --- a/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md +++ b/documentation/proc-pages/eng-models/power-conversion-and-heat-dissipation-systems.md @@ -66,12 +66,12 @@ for the primary coolant. The pressures and temperatures are set by the user. - When used with the DCLL model a different set of pressure drop variables are used, which are outlined below: - | Variable | Units | Itvar. | Default | Description | - | :----------: | :---: | ------ | ------- | -------------------------------------------------------------------------------- | - | `dp_fw_blnkt` | Pa | | 1.5D5 | Pressure drop in FW and blanket coolant including heat exchanger and pipes | - | `dp_fw` | Pa | | 1.5D5 | Pressure drop in FW coolant including heat exchanger and pipes | - | `dp_blkt` | Pa | | 3.5D3 | Pressure drop in blanket coolant including heat exchanger and pipes | - | `dp_liq` | Pa | | 1.0D7 | Pressure drop in liquid metal blanket coolant including heat exchanger and pipes | + | Variable | Units | Default | Description | + | :----------: | :---: | ------- | -------------------------------------------------------------------------------- | + | `dp_fw_blnkt` | Pa | 1.5D5 | Pressure drop in FW and blanket coolant including heat exchanger and pipes | + | `dp_fw` | Pa | 1.5D5 | Pressure drop in FW coolant including heat exchanger and pipes | + | `dp_blkt` | Pa | 3.5D3 | Pressure drop in blanket coolant including heat exchanger and pipes | + | `dp_liq` | Pa | 1.0D7 | Pressure drop in liquid metal blanket coolant including heat exchanger and pipes | - The defaults for these variables are geared towards a WCLL concept, so different values should be used with Helium cooling.