Source code for extrucal.tube_extrusion

import pandas as pd
import numpy as np
import altair as alt
from extrucal.extrusion import throughput_cal


[docs]def tube_cal(outer_d, inner_d, l_speed, s_density): """ Calculates the required throughput for tubes given the outer diameter, inner diameter, line speed, and solid polymer density Parameters ---------- outer_d : int or float Outer diameter [mm] inner_d : int or float Inner diameter [mm] l_speed : int or float Line speed [mpm] s_density : int or float Solid density of polymeric material [kg/m^3] Returns ------- throughput : float required exturion throughput [kg/hr] Examples -------- >>> tube_cal(outer_d=10, inner_d=6, l_speed = 10, s_density=1000) """ # Test input type if not isinstance(outer_d, int): if not isinstance(outer_d, float): raise TypeError("'outer_d' should be either integer or float") if not isinstance(inner_d, int): if not isinstance(inner_d, float): raise TypeError("'inner_d' should be either integer or float") if not isinstance(l_speed, int): if not isinstance(l_speed, float): raise TypeError("'l_speed' should be either integer or float") if not isinstance(s_density, int): if not isinstance(s_density, float): raise TypeError("'s_density' should be either integer or float") # Test input value if inner_d > outer_d: raise ValueError("'inner_d' can't be greater than 'outer_d'") if s_density < 300: raise ValueError("This is not solid density for polymers. Too low!!") if s_density > 3000: raise ValueError("This is not solid density for polymers. Too high!!") # Calculate basic variables outer_r = outer_d / 2 inner_r = inner_d / 2 insul_area = np.pi*((outer_r**2)-(inner_r**2)) / 1000000 req_throughput = l_speed * insul_area * 60 * s_density return round(req_throughput, 3)
[docs]def tube_table( outer_d, inner_d, s_density, density_ratio=0.85, min_l_speed=1, max_l_speed=10, delta_l_speed=1, min_size=20, max_size=100, delta_size=20, depth_percent=0.05 ): """ Generate a table containing the required screw RPM with respect to line speed and extruder size Parameters ---------- outer_d : int or float Outer diameter [mm] inner_d : int or float Inner diameter [mm] s_density : int or float Solid density of polymeric material [kg/m^3] density_ratio : int or float Ratio b/w solid and melt density min_l_speed : int or float Minimum line speed for calculation [mm] Default value is 1 (1mpm) max_l_speed : int or float Maximum line speed for calculation [mpm] Default value is 10 (10mpm) delta_l_speed : int or float Amount of increment in line speed for calculation [mpm] Default value is 1 (1mpm) min_size : int or float Minimum extruder size for calculation [mm] Default value is 20 (20mm) max_size : int or float Maximum extruder size for calculation [mm] Default value is 100 (100mm) delta_size : int or float Amount of increment in extruder size for calculation [mm] Default value is 20 (20mm) depth_percent : int or float Percentage of the depth of metering channel compared to extruder size Default value is 0.05 Returns ------- table : pandas.DataFrame dataframe containing the required screw RPM as a function of line speed and extruder size Examples -------- >>> tube_table(outer_d=10, inner_d=6, s_density=1000) """ # Test input type if not isinstance(outer_d, int): if not isinstance(outer_d, float): raise TypeError("'outer_d' should be either integer or float") if not isinstance(inner_d, int): if not isinstance(inner_d, float): raise TypeError("'inner_d' should be either integer or float") if not isinstance(s_density, int): if not isinstance(s_density, float): raise TypeError("'s_density' should be either integer or float") if not isinstance(density_ratio, int): if not isinstance(density_ratio, float): raise TypeError("'density_ratio' should be either integer or float") if not isinstance(min_l_speed, int): if not isinstance(min_l_speed, float): raise TypeError("'min_l_speed' should be either integer or float") if not isinstance(max_l_speed, int): if not isinstance(max_l_speed, float): raise TypeError("'max_l_speed' should be either integer or float") if not isinstance(delta_l_speed, int): if not isinstance(delta_l_speed, float): raise TypeError("'delta_l_speed' should be either integer or float") if not isinstance(min_size, int): if not isinstance(min_size, float): raise TypeError("'min_size' should be either integer or float") if not isinstance(max_size, int): if not isinstance(max_size, float): raise TypeError("'max_size' should be either integer or float") if not isinstance(delta_size, int): if not isinstance(delta_size, float): raise TypeError("'delta_size' should be either integer or float") if not isinstance(depth_percent, int): if not isinstance(depth_percent, float): raise TypeError("'depth_percent' should be either integer or float") # Test input value if inner_d > outer_d: raise ValueError("'inner_d' can't be greater than 'outer_d'") if s_density < 300: raise ValueError("This is not solid density for polymers. Too low!!") if s_density > 3000: raise ValueError("This is not solid density for polymers. Too high!!") if density_ratio > 1: raise ValueError("Melt density can't be greater than solid density") if density_ratio < 0.5: raise ValueError("Melt density is too low (<50% of solid density)") if delta_l_speed > max_l_speed-min_l_speed: raise ValueError("'delta_l_speed' can not be greater than 'max_l_speed - min_l_speed'") if delta_size > max_size-min_size: raise ValueError("'delta_size' can not be greater than 'max_size - min_size'") if depth_percent < 0.01: raise ValueError("Channel depth is too shallow(<1% of screw size) to be used for extrusion screw") if depth_percent > 0.3: raise ValueError("Channel depth is too deep(>30% of screw size) to be used for extrusion screw") # Generates table table = dict() rpm_list = list() l_speed = [round(i, 2) for i in np.arange(min_l_speed, max_l_speed+0.001, delta_l_speed)] size = [j for j in np.arange(min_size, max_size+0.1, delta_size)] size_title = [f"{k}mm Ext" for k in np.arange(min_size, max_size+0.1, delta_size)] for l in l_speed: for s in size: rpm_list.append( round( (tube_cal(outer_d, inner_d, l, s_density)/ throughput_cal(s, s*depth_percent, s_density*density_ratio)), 2)) table[f"{l}mpm"] = rpm_list rpm_list = [] table_df = pd.DataFrame(table, index=size_title) return table_df
[docs]def tube_plot( outer_d, inner_d, s_density, density_ratio=0.85, min_l_speed=1, max_l_speed=10, delta_l_speed=1, min_size=20, max_size=100, delta_size=1, depth_percent=0.05 ): """ Generate a plot containing the required screw RPM with respect to line speed and extruder size Parameters ---------- outer_d : int or float Outer diameter [mm] inner_d : int or float Inner diameter [mm] s_density : int or float Solid density of polymeric material [kg/m^3] density_ratio : int or float Ratio b/w solid and melt density min_l_speed : int or float Minimum line speed for calculation [mm] Default value is 0 (0mpm) max_l_speed : int or float Maximum line speed for calculation [mpm] Default value is 10 (10mpm) delta_l_speed : int or float Amount of increment in line speed for calculation [mpm] Default value is 1 (1mpm) min_size : int or float Minimum extruder size for calculation [mm] Default value is 20 (20mm) max_size : int or float Maximum extruder size for calculation [mm] Default value is 100 (100mm) delta_size : int or float Amount of increment in extruder size for calculation [mm] Default value is 5 (5mm) depth_percent : int or float Percentage of the depth of metering channel compared to extruder size Default value is 0.05 Returns ------- plot : altair.Chart object a line chart showing the required screw RPM as a function of line speed and extruder size Examples -------- >>> tube_plot(outer_d=10, thickness=2, s_density=1000) """ # Test input type if not isinstance(outer_d, int): if not isinstance(outer_d, float): raise TypeError("'outer_d' should be either integer or float") if not isinstance(inner_d, int): if not isinstance(inner_d, float): raise TypeError("'inner_d' should be either integer or float") if not isinstance(s_density, int): if not isinstance(s_density, float): raise TypeError("'s_density' should be either integer or float") if not isinstance(density_ratio, int): if not isinstance(density_ratio, float): raise TypeError("'density_ratio' should be either integer or float") if not isinstance(min_l_speed, int): if not isinstance(min_l_speed, float): raise TypeError("'min_l_speed' should be either integer or float") if not isinstance(max_l_speed, int): if not isinstance(max_l_speed, float): raise TypeError("'max_l_speed' should be either integer or float") if not isinstance(delta_l_speed, int): if not isinstance(delta_l_speed, float): raise TypeError("'delta_l_speed' should be either integer or float") if not isinstance(min_size, int): if not isinstance(min_size, float): raise TypeError("'min_size' should be either integer or float") if not isinstance(max_size, int): if not isinstance(max_size, float): raise TypeError("'max_size' should be either integer or float") if not isinstance(delta_size, int): if not isinstance(delta_size, float): raise TypeError("'delta_size' should be either integer or float") if not isinstance(depth_percent, int): if not isinstance(depth_percent, float): raise TypeError("'depth_percent' should be either integer or float") # Test input value if inner_d > outer_d: raise ValueError("'inner_d' can't be greater than 'outer_d'") if s_density < 300: raise ValueError("This is not solid density for polymers. Too low!!") if s_density > 3000: raise ValueError("This is not solid density for polymers. Too high!!") if density_ratio > 1: raise ValueError("Melt density can't be greater than solid density") if density_ratio < 0.5: raise ValueError("Melt density is too low (<50% of solid density)") if delta_l_speed > max_l_speed-min_l_speed: raise ValueError("'delta_l_speed' can not be greater than 'max_l_speed - min_l_speed'") if delta_size > max_size-min_size: raise ValueError("'delta_size' can not be greater than 'max_size - min_size'") if depth_percent < 0.01: raise ValueError("Channel depth is too shallow(<1% of screw size) to be used for extrusion screw") if depth_percent > 0.3: raise ValueError("Channel depth is too deep(>30% of screw size) to be used for extrusion screw") # Generate table for plot table = dict() rpm_list = list() l_speed = [round(i, 2) for i in np.arange(min_l_speed, max_l_speed+0.001, delta_l_speed)] size = [j for j in np.arange(min_size, max_size+0.1, delta_size)] for l in l_speed: for s in size: rpm_list.append(tube_cal(outer_d, inner_d, l, s_density)/ throughput_cal(s, s*depth_percent, s_density*density_ratio)) table[l] = rpm_list rpm_list = [] table_df = pd.DataFrame(table, index=size) table_for_plot = table_df.reset_index() table_for_plot = table_for_plot.rename(columns={"index": "size"}) table_for_plot = table_for_plot.melt(id_vars="size", var_name="speed", value_name="rpm") table_for_plot["speed"] = table_for_plot["speed"].astype('category') # Generate plot plot = alt.Chart(table_for_plot, title='Screw RPM vs Extruder Size & Line Speed').mark_line().encode( alt.X("size", title="Extruder Size", scale=alt.Scale(domain=(min_size, max_size))), alt.Y("rpm", title="Screw RPM"), alt.Color( "speed", title="Line Speed [mpm]", sort=alt.EncodingSortField('rpm', op='mean', order='descending') ), tooltip=["size", "speed", "rpm"] ).configure_axis( labelFontSize=14, titleFontSize=16 ).configure_legend( labelFontSize=16, titleFontSize=14 ).configure_title( fontSize=18 ) return plot