Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
095a1f4
Move elbow coeffieicnt calc from blanket to pumping
chris-ashe Jun 4, 2026
3c6c1ec
Add coolant properties to BlanketData class
chris-ashe Jun 4, 2026
ea69715
Add coolant friction loss parameters and output functions for blanket…
chris-ashe Jun 4, 2026
dd1779a
Add function to plot blanket coolant channel structure and update mai…
chris-ashe Jun 4, 2026
f1dd90d
Refactor pressure drop assertions in blanket tests for clarity and co…
chris-ashe Jun 5, 2026
1fd6bc0
Add function to plot outboard blanket coolant properties along the po…
chris-ashe Jun 5, 2026
336d33e
Tidy some variable names to match style guide
chris-ashe Jun 5, 2026
48e26e8
Create mass flow required function and implement
chris-ashe Jun 5, 2026
78352ac
🔄 Rename FW and Blkt heat capacity variables
chris-ashe Jun 5, 2026
244dc59
Add output for outboard blanket piping
chris-ashe Jun 5, 2026
566a920
Add output table for outboard blanket
chris-ashe Jun 5, 2026
1c1666f
Refactor coolant friction loss parameters and update related tests
chris-ashe Jun 7, 2026
5f030f3
Enhance inboard blanket coolant channel output and pressure drop calc…
chris-ashe Jun 7, 2026
e32fffd
Move FW number of bends to FW file
chris-ashe Jun 8, 2026
1f43d47
Remove pipe plotting
chris-ashe Jun 8, 2026
bba36de
Update summary positions of tables
chris-ashe Jun 8, 2026
39bd360
Post rebase fixes
chris-ashe Jun 11, 2026
cb5f145
Remove unused CoolProp imports and related plotting functions for out…
chris-ashe Jun 23, 2026
843e6da
Post merge coflict fixes
chris-ashe Jul 2, 2026
95ca6b9
Move all of the pumping related function from `BlanketLibrary` into t…
chris-ashe Jul 2, 2026
300ff55
Update some output formatting
chris-ashe Jul 3, 2026
a7e09c7
Fix some coolant pumping power function imports
chris-ashe Jul 3, 2026
9e7f961
Refactor pumping outputs to be specifically for inboard and outboard …
chris-ashe Jul 3, 2026
caf239e
Add coolant mass flow rate output
chris-ashe Jul 15, 2026
c49eaa8
Refactor coolant pumping power types to use CALCULATE_PRESSURE_DROP a…
chris-ashe Jul 15, 2026
b66dfec
Rename mass flow rate variables for clarity in blanket model
chris-ashe Jul 15, 2026
b6dabed
Add coolant mass flow rate and velocity outputs for single channels i…
chris-ashe Jul 15, 2026
4db51ce
Post rebase fixes
chris-ashe Aug 3, 2026
4d245fc
Only output pumping variables if pressure drop is calculated
chris-ashe Aug 3, 2026
f490d43
Add pumping power calculation option output in first wall pumping det…
chris-ashe Aug 5, 2026
095ba18
Update process/models/blankets/blanket_library.py
chris-ashe Aug 21, 2026
f060e26
Refactor blanket models to use pipe_hydraulic_diameter function and a…
chris-ashe Aug 25, 2026
ddedc01
Remove unnecessary @staticmethod decorators from calculate_reynolds_n…
chris-ashe Aug 25, 2026
42a80d1
Update process/models/engineering/pumping.py
chris-ashe Sep 2, 2026
7e8e0d6
Refactor pressure drop output formatting in plot_blanket_coolant_prop…
chris-ashe Sep 2, 2026
f11c93a
Calculate adiabatic index directly from CoolProp properties. and catc…
chris-ashe Sep 14, 2026
8d193fc
Clarify explanation of specific heat capacity usage in pumping system…
chris-ashe Sep 14, 2026
9096884
:bug: Fix haaland equation not using the full pipe hydraulic diameter
chris-ashe Sep 30, 2026
c63ddfa
Tidy some docstrings
chris-ashe Sep 30, 2026
8eca27e
Refactor blanket coolant properties plotting to reduce code duplicati…
chris-ashe Oct 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions documentation/source/development/standards.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,14 @@ This should be used for units of $\text{kg} \cdot \text{m}^{-2}\text{s}^{-1}$

---------------------

##### Specific Heat Capacities

- Specific heat capacities for materials $[\text{J/kg/K}]$ should start with the `heatcap_` prefix
- Specific heat capacities at constant volume should start with the `heatcap_vol_` pefix
- Specific heat capacities at constant pressure should start with the `heatcap_pres_` pefix

---------------------

##### Pressures

- Pressures should start with the `pres_` prefix
Expand Down
97 changes: 0 additions & 97 deletions documentation/source/eng-models/blanket_overview.md

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you have completely moved the documentation, this file should be deleted, No?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This just removes the generic pumping equations and puts them into the pumping file. The blanket overview page will still be needed

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, then could you please write here something like "To be written" or similar? File with just a heading and section heading but no text looks odd

Original file line number Diff line number Diff line change
Expand Up @@ -5,100 +5,3 @@

--------------------

### Coolant mechanical pumping power | `coolant_pumping_power()`

To calculate the coolant pumping power we use the change in enthalpies of the coolant as it goes through the pump.
**We assume the pump is isentropic so the entropy change of the coolant is 0**.

The mechanical pumping power is defined as:

$$
P = \frac{\frac{\dot{m} \times \left(H_{\text{out}}-H_{\text{in}}\right)}{\eta}}{\left(1-fp\right)}
$$

where $\dot{m}$ is the coolant mass flow rate, $H$ is the coolant enthalpy, $\eta$ is the isentropic efficiency of the pump and $\gamma$ is the adiabatic index of the coolant.

$$
fp = \frac{T_{\text{pump,out}}\left(\frac{P_{\text{pump,out}}}{P_{\text{pump,in}}}\right)^{-\frac{\gamma -1}{\gamma}}}{\eta \left(T_{\text{pump,in}}-T_{\text{pump,out}}\right)}
$$

------------------

### Coolant pressure drop | `coolant_friction_pressure_drop()`

The pressure drop in the coolant is given by the [Darcy-Weisbach Equation](https://en.wikipedia.org/wiki/Darcy%E2%80%93Weisbach_equation)

For a cylindrical pipe of uniform diameter the pressure loss due to viscous effects can be characterized by:

$$
\Delta P = L\left[f_{\text{D}}\frac{\rho}{2}\frac{\langle v \rangle^2}{D_{\text{H}}}\right]
$$

where $L$ is the pipe length, $f_{\text{D}}$ is the [Darcy friction factor](https://en.wikipedia.org/wiki/Darcy_friction_factor_formulae), $\rho$ is the coolant density, $\langle v \rangle$ is the mean flow coolant velocity and $D_{\text{H}}$ is the hydraulic diameter or the pipe diameter in this case.

To find the Darcy friction factor we need to know the Reynolds number given by:

$$
\text{Re} = \frac{\rho v L}{\mu}
$$

here $L$ is the characteristic length which we set to be the pipe diameter and $\mu$ is the coolant dynamic viscosity.

Using the Reynolds number we calculate the Darcy friction factor using the Haaland approximation calculated by [`darcy_friction_haaland()`](../eng-models/generic_methods/pumping.md#pumping-coolant-friction--darcy_friction_haaland).

For the radius of the pipe bend we assume it to be 3 times the radius of the coolant channel.

The elbow coefficients for the 90 and 180 degree bends $\left(f_{\text{90,elbow}}, f_{\text{180,elbow}}\right)$ are calculated via [`elbow_coeff()`](#pipe-bend-elbow-coefficient--elbow_coeff).

The pressure drop for the straights along the entire pipe length is the same as above:

$$
\Delta P = L\left[f_{\text{D}}\frac{\rho}{2}\frac{\langle v \rangle^2}{D_{\text{H}}}\right]
$$

where we define $\frac{f_{\text{D}}L}{D_{\text{H}}}$ as our straight section coefficient.

The pressure drop for the 90 and 180 degree bends are:

$$
\Delta P = N_{\text{90}} \left[f_{\text{90,elbow}} \frac{\rho \langle v \rangle^2}{2}\right]
$$

$$
\Delta P = N_{\text{180}} \left[f_{\text{180,elbow}} \frac{\rho \langle v \rangle^2}{2}\right]
$$

where $N_{\text{90}}$ and $N_{\text{180}}$ are the number of 90 and 180 degree bends in the system.

The total returned pressure drop is simply:

$$
\Delta P = L\left[f_{\text{D}}\frac{\rho}{2}\frac{\langle v \rangle^2}{D_{\text{H}}}\right] + N_{\text{90}} \left[f_{\text{90,elbow}} \frac{\rho \langle v \rangle^2}{2}\right] + N_{\text{180}} \left[f_{\text{180,elbow}} \frac{\rho \langle v \rangle^2}{2}\right]
$$

-------------------

### Pipe bend elbow coefficient | `elbow_coeff()`

This function calculates the elbow bend coefficients for pressure drop calculations.

$$
a = 1.0 \quad \text{if} \ \theta = 90^{\circ} \\
a = 0.9 \times \sin{\left(\frac{\theta \pi}{180^{\circ}}\right)} \quad \text{if} \ \theta < 70^{\circ} \\
a = 0.7 + 0.35 \times \sin{\left(\frac{\theta}{90^{\circ}} \times \frac{\pi}{180^{\circ}}\right)} \quad \text{if} \ \theta > 90^{\circ} \\
$$

where $\theta$ is the angle of the pipe bend.

$$
b = \frac{0.21}{\sqrt{\frac{R_{\text{elbow}}}{D_{\text{pipe}}}}}\quad \text{if} \ \frac{R_{\text{elbow}}}{D_{\text{pipe}}} \ge 1 \\
b = \frac{0.21}{\left(\frac{R_{\text{elbow}}}{D_{\text{pipe}}}\right)^{2.5}}\quad \text{if} \ \frac{R_{\text{elbow}}}{D_{\text{pipe}}} \le 1 \\
\text{else} \quad b =0.21
$$

The elbow coefficient is given by:

$$
ab + \left( f_{\text{D}} \times \frac{R_{\text{elbow}}}{D_{\text{pipe}}}\right) \times \theta \times \left(\frac{\pi}{180^{\circ}}\right)
$$

137 changes: 136 additions & 1 deletion documentation/source/eng-models/generic_methods/pumping.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,82 @@
# Pumping Methods


## Coolant mechanical pumping power | `coolant_pumping_power()`

To calculate the coolant pumping power we use the change in enthalpies of the coolant as it goes through the pump.
**We assume the pump is isentropic so the entropy change of the coolant is 0**.

The mechanical pumping power is defined as:

$$
P = \frac{\frac{\dot{m} \times \left(H_{\text{out}}-H_{\text{in}}\right)}{\eta}}{\left(1-f_p\right)}
$$

where $\dot{m}$ is the coolant mass flow rate, $H$ is the coolant enthalpy, $\eta$ is the isentropic efficiency of the pump and $\gamma$ is the adiabatic index of the coolant.

$f_p$ is a seocondary correction accounting for the fact that some of the pump's mechanical work reheats the coolant, and that reheat is already implicitly present in the prescribed $\left(T_{\text{pump,in}}-T_{\text{pump,out}}\right)$ used elsewhere in the plant energy balance, without this correction that portion of the pump work would be double counted. The term uses the classical isentropic ideal-gas relation $T_2/T_1 = (P_2/P_1)^{(\gamma-1)/\gamma}$

$$
f_p = \frac{T_{\text{pump,out}}\left(\frac{P_{\text{pump,out}}}{P_{\text{pump,in}}}\right)^{-\frac{\gamma -1}{\gamma}}}{\eta \left(T_{\text{pump,in}}-T_{\text{pump,out}}\right)}
$$
Comment thread
chris-ashe marked this conversation as resolved.

------------------

## Coolant pressure drop | `coolant_friction_pressure_drop()`

The pressure drop in the coolant is given by the [Darcy-Weisbach Equation](https://en.wikipedia.org/wiki/Darcy%E2%80%93Weisbach_equation)

For a cylindrical pipe of uniform diameter the pressure loss due to viscous effects can be characterized by:

$$
\Delta P = L\left[f_{\text{D}}\frac{\rho}{2}\frac{\langle v \rangle^2}{D_{\text{H}}}\right]
$$

where $L$ is the pipe length, $f_{\text{D}}$ is the [Darcy friction factor](https://en.wikipedia.org/wiki/Darcy_friction_factor_formulae), $\rho$ is the coolant density, $\langle v \rangle$ is the mean flow coolant velocity and $D_{\text{H}}$ is the hydraulic diameter or the pipe diameter in this case.

To find the Darcy friction factor we need to know the Reynolds number given by:

$$
\text{Re} = \frac{\rho v L}{\mu}
$$

here $L$ is the characteristic length which we set to be the pipe diameter and $\mu$ is the coolant dynamic viscosity.

Using the Reynolds number we calculate the Darcy friction factor using the Haaland approximation calculated by [`darcy_friction_haaland()`](../eng-models/generic_methods/pumping.md#pumping-coolant-friction--darcy_friction_haaland).

For the radius of the pipe bend we assume it to be 3 times the radius of the coolant channel.

The elbow coefficients for the 90 and 180 degree bends $\left(f_{\text{90,elbow}}, f_{\text{180,elbow}}\right)$ are calculated via [`elbow_coeff()`](#pipe-bend-elbow-coefficient--elbow_coeff).

The pressure drop for the straights along the entire pipe length is the same as above:

$$
\Delta P = L\left[f_{\text{D}}\frac{\rho}{2}\frac{\langle v \rangle^2}{D_{\text{H}}}\right]
$$

where we define $\frac{f_{\text{D}}L}{D_{\text{H}}}$ as our straight section coefficient.

The pressure drop for the 90 and 180 degree bends are:

$$
\Delta P = N_{\text{90}} \left[f_{\text{90,elbow}} \frac{\rho \langle v \rangle^2}{2}\right]
$$

$$
\Delta P = N_{\text{180}} \left[f_{\text{180,elbow}} \frac{\rho \langle v \rangle^2}{2}\right]
$$

where $N_{\text{90}}$ and $N_{\text{180}}$ are the number of 90 and 180 degree bends in the system.

The total returned pressure drop is simply:

$$
\Delta P = L\left[f_{\text{D}}\frac{\rho}{2}\frac{\langle v \rangle^2}{D_{\text{H}}}\right] + N_{\text{90}} \left[f_{\text{90,elbow}} \frac{\rho \langle v \rangle^2}{2}\right] + N_{\text{180}} \left[f_{\text{180,elbow}} \frac{\rho \langle v \rangle^2}{2}\right]
$$

-------------------


## Pumping coolant friction | `darcy_friction_haaland()`

The pressure drop is based on the Darcy friction factor, using the [Haaland equation](https://en.wikipedia.org/wiki/Darcy_friction_factor_formulae#Haaland_equation), an approximation to the implicit Colebrook–White equation.
Expand Down Expand Up @@ -61,4 +138,62 @@ where $\rho$ is the coolant density and $\mu$ is the coolant viscosity.

$$
h = \frac{\mathrm{Nu_D}k}{2r_{\text{channel}}}
$$
$$

-------------------------

## Pipe bend elbow coefficient | `elbow_coeff()`

This function calculates the elbow bend coefficients for pressure drop calculations.

$$
a = 1.0 \quad \text{if} \ \theta = 90^{\circ} \\
a = 0.9 \times \sin{\left(\frac{\theta \pi}{180^{\circ}}\right)} \quad \text{if} \ \theta < 70^{\circ} \\
a = 0.7 + 0.35 \times \sin{\left(\frac{\theta}{90^{\circ}} \times \frac{\pi}{180^{\circ}}\right)} \quad \text{if} \ \theta > 90^{\circ} \\
$$

where $\theta$ is the angle of the pipe bend.

$$
b = \frac{0.21}{\sqrt{\frac{R_{\text{elbow}}}{D_{\text{pipe}}}}}\quad \text{if} \ \frac{R_{\text{elbow}}}{D_{\text{pipe}}} \ge 1 \\
b = \frac{0.21}{\left(\frac{R_{\text{elbow}}}{D_{\text{pipe}}}\right)^{2.5}}\quad \text{if} \ \frac{R_{\text{elbow}}}{D_{\text{pipe}}} \le 1 \\
\text{else} \quad b =0.21
$$

The elbow coefficient is given by:

$$
ab + \left( f_{\text{D}} \times \frac{R_{\text{elbow}}}{D_{\text{pipe}}}\right) \times \theta \times \left(\frac{\pi}{180^{\circ}}\right)
$$

--------------

## Required mass flow rate | `calculate_required_mass_flow_rate()`

The required mass flow rate of a coolant is given simply by the fundamental heat transfer equation:

$$
\dot{m} = \frac{P}{c_{\text{p}}(T)\times \Delta T}
$$

where $\dot{m}$ is the required mass flow rate in, $P$ is the heating power to be removed, $c_{\text{p}}$ is the coolant specific heat capacity for constant pressure and $\Delta T$ is the temperature change in the coolant.

!!! note "Variation specific heat capacity"

The heat capacity itself is a function of temperature. Therefore it is common to use the heat capacity value at the simple average between the initial and final temperature.
This however assumes a linear relationship. Ideally the equation should be solves as:

$$
\dot{m} = \frac{P}{\int_{T_{\text{in}}}^{T_{\text{in}}}c_{\text{p}}(T) dT}
Comment thread
chris-ashe marked this conversation as resolved.
$$
Comment thread
athoynilimanew marked this conversation as resolved.


!!! info "Choice of specific heat capacity"

For pumping, the specific heat capacity for constant pressure $(c_{\text{p}})$ is used because
cooling loops are open, steady-flow systems: coolant flows continuously through pipes, heat
exchangers and pumps at a system pressure that is actively maintained by the pump's operating
point and any pressure-control components (e.g. pressurisers, control valves), rather than
varying freely with the coolant's volume.

You would only use the specific heat capacity for constant volume $(c_{\text{v}})$ if the coolant was completely sealed inside a rigid, unyielding container with zero flow, where heating it would cause the pressure to spike but the volume to stay exactly the same.
Comment on lines +170 to +199

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this bit of doc is new, so probably worth an @ukaea/process-model-review looking at it

Comment thread
athoynilimanew marked this conversation as resolved.
69 changes: 59 additions & 10 deletions process/core/io/plot/summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
PlasmaProfileShapeType,
calculate_profile_shell_contributions,
)
from process.models.power import PumpingPowerModelTypes
from process.models.pulse import PulseTimings
from process.models.superconductors import SuperconductorModel
from process.models.tfcoil.base import (
Expand Down Expand Up @@ -16813,6 +16814,55 @@ def plot_cumulative_plasma_thermal_energy_profiles(axis, m_file: MFile, scan: in
)


def plot_blanket_coolant_properties(fig: plt.Figure, m_file: MFile, scan: int):
Comment thread
je-cook marked this conversation as resolved.
"""Combined plot of blanket coolant channel structure and properties."""
for side, x_position in (("inboard", 0.1), ("outboard", 0.5)):

def get(variable: str):
return m_file.get(variable, scan=scan)

text = (
f"$\\mathbf{{{side.capitalize()} \\ blanket:}}$\n \n"
f"Radius of blanket channel: {m_file.get('radius_blkt_channel', scan=scan):.4f} m\n"
f"Channel roughness ($\\epsilon$): {m_file.get('roughness_fw_channel', scan=scan):.4e} m\n\n"
f"Radial coolant channel length: {get(f'len_blkt_{side}_coolant_channel_radial'):.4f} m\n"
f"Poloidal coolant channel length: {get(f'len_blkt_{side}_segment_poloidal'):.4f} m\n"
f"Number of radial channels: {get(f'n_blkt_{side}_module_coolant_sections_radial')}\n"
f"Number of poloidal channels: {get(f'n_blkt_{side}_module_coolant_sections_poloidal')}\n"
f"Total length of coolant channel straight sections: {get(f'len_blkt_{side}_channel_total'):.4f} m\n\n"
f"Pressure drop for straight sections: {get(f'dpres_blkt_{side}_coolant_channel_straight_total'):,.2f} Pa\n"
f"Pressure drop for 90° bends: {get(f'dpres_blkt_{side}_coolant_channel_90_bend'):,.2f} Pa\n"
f"Total pressure drop for 90° bends: {get(f'dpres_blkt_{side}_coolant_channel_90_bends_total'):,.2f} Pa\n"
f"Pressure drop for 180° bends: {get(f'dpres_blkt_{side}_coolant_channel_180_bend'):,.2f} Pa\n"
f"Total pressure drop for 180° bends: {get(f'dpres_blkt_{side}_coolant_channel_180_bends_total'):,.2f} Pa\n"
f"Total pressure drop for all bends: {get(f'dpres_blkt_{side}_bends_total'):,.2f} Pa\n\n"
f"Reynolds number ($Re$): {get(f'reynolds_blkt_{side}_coolant'):,.4f}\n"
f"Darcy Friction factor ($f$): {get(f'darcy_frict_blkt_{side}_coolant'):.4f}\n\n"
f"Friction drop coefficient for straight sections: {get(f'f_straight_blkt_{side}_coolant'):.4f}\n"
f"Friction drop coefficient for 90° bends: {get(f'f_elbow_blkt_{side}_90_bend'):.4f}\n"
f"Friction drop coefficient for 180° bends: {get(f'f_elbow_blkt_{side}_180_bend'):.4f}\n\n"
f"Total coolant mass flow rate: {get(f'mflow_blkt_{side}_coolant'):.4f} kg/s\n"
f"Coolant mass flow rate in single channel: {get(f'mflow_blkt_{side}_coolant_channel'):.4f} kg/s\n"
f"Coolant velocity in single channel: {get(f'vel_blkt_{side}_coolant'):.4f} m/s"
)

fig.text(
x_position,
0.5,
text,
fontsize=9,
verticalalignment="top",
horizontalalignment="left",
transform=fig.transFigure,
bbox={
"boxstyle": "round",
"facecolor": "wheat",
"alpha": 1.0,
"linewidth": 2,
},
)


def main_plot(
m_file: MFile,
scan: int,
Expand Down Expand Up @@ -17449,17 +17499,18 @@ def _add_page(name: str | None = None):
)
plot_fw_90_deg_pipe_bend(pages["fw_td_cross_section"].add_subplot(337), m_file, scan)

plot_blkt_pipe_bends(_add_page("blkt_pipe_bends"), m_file, scan)
ax_blanket = pages["blkt_pipe_bends"].add_subplot(122, aspect="equal")
ax_blanket = _add_page("blkt_structure").add_subplot(122, aspect="equal")
plot_blkt_structure(
ax_blanket,
pages["blkt_pipe_bends"],
m_file,
scan,
radial_build,
colour_scheme,
ax_blanket, pages["blkt_structure"], m_file, scan, radial_build, colour_scheme
)

plot_blkt_pipe_bends(_add_page("blkt_cooling"), m_file, scan)
if (
m_file.get("i_p_coolant_pumping", scan=scan)
== PumpingPowerModelTypes.CALCULATE_PRESSURE_DROP
Comment thread
timothy-nunn marked this conversation as resolved.
):
plot_blanket_coolant_properties(pages["blkt_cooling"], m_file, scan)

plot_main_power_flow(
_add_page("main_power_flow").add_subplot(111, aspect="equal"),
m_file,
Expand Down Expand Up @@ -17578,8 +17629,6 @@ def add_page_footer(
color="dimgray",
)

# create main plot
# Increase range when adding new page
# run main_plot
mfile_obj = MFile(mfile) if mfile else MFile("MFILE.DAT")
run_label = f"{mfile_obj.get('fileprefix', scan=-1)} | scan {scan or -1} | {mfile_obj.get('date', scan=-1)} {mfile_obj.get('time', scan=-1)} | {mfile_obj.get('tagno', scan=-1)} | Branch: {mfile_obj.get('branch_name', scan=-1)} "
Expand Down
Loading
Loading