22
33# 3rd party libraries
44import numpy as np
5+ import pandas as pd
56
67# own libraries
8+ from pecst .resistor .read_resistor_database import load_resistors
79
810def generate_resistor_list (e_series_basic_list , potency_list ):
911 """
@@ -63,6 +65,24 @@ def look_for_closest_smaller_resistance(r_max: float, resistor_list: list) -> fl
6365 r_closest = resistor_list [index_r_closest ]
6466 return float (r_closest )
6567
68+
69+ def look_for_closest_higher_power (power : float , power_list : list ) -> float :
70+ """
71+ Look for the closest higher power in power_list than the given power.
72+
73+ :param power: power in W
74+ :type power: float
75+ :param power_list: list of power
76+ :type power_list: list
77+ :return: closest and higher power in the list
78+ """
79+ if np .isnan (power ):
80+ return np .nan
81+ else :
82+ index_r_closest = np .searchsorted (power_list , [power , ], side = 'right' )[0 ]
83+ p_closest = power_list [index_r_closest ]
84+ return float (p_closest )
85+
6686def loss_per_resistor (voltage_per_capacitor : float , resistance : float ) -> float :
6787 """
6888 Calculate the power loss per resistor.
@@ -79,7 +99,40 @@ def loss_per_resistor(voltage_per_capacitor: float, resistance: float) -> float:
7999 else :
80100 return voltage_per_capacitor ** 2 / resistance
81101
102+ def select_resistor_area_volume (power_loss : float , ambient_temperature : float ,
103+ r_df : pd .DataFrame ) -> pd .Series [float ]:
104+ """
105+ Select the resistor area and volume for a given resistor power dissipation.
106+
107+ :param power_loss: resistor power loss in W
108+ :type power_loss: float
109+ :param ambient_temperature: ambient temperature in °C
110+ :type ambient_temperature: float
111+ :param r_df: resistor database
112+ :type r_df: pd.Dataframe
113+ :return: area, volume
114+ """
115+ if power_loss == 0 :
116+ area = 0.0
117+ volume = 0.0
118+ else :
119+ # interpolate power due to ambient temperature
120+ r_df ["power_rating_at_ambient_temperature" ] = r_df .apply (lambda x : np .interp (
121+ ambient_temperature , [- 40 , 40 , 70 ], [x ["power_40_degree" ], x ["power_40_degree" ], x ["power_70_degree" ]]), axis = 1 )
122+
123+ # look for the closest higher temperature
124+ higher_rated_power = look_for_closest_higher_power (power_loss , r_df ["power_rating_at_ambient_temperature" ].to_list ())
125+
126+ # select resistor area and volume
127+ area = r_df .loc [r_df ["power_rating_at_ambient_temperature" ] == higher_rated_power ]["area" ].values [0 ]
128+ volume = r_df .loc [r_df ["power_rating_at_ambient_temperature" ] == higher_rated_power ]["volume" ].values [0 ]
129+ return pd .Series ([area , volume ])
130+
82131
83132if __name__ == "__main__" :
84133 r_closest = look_for_closest_smaller_resistance (r_max = 105 , resistor_list = [80 , 90 , 100 , 110 , 120 ])
85134 print (f"{ r_closest = } " )
135+ resistor_df = load_resistors ("ac" )
136+ [area , volume ] = select_resistor_area_volume (2.5 , 70 , resistor_df )
137+ print (f"{ area = } " )
138+ print (f"{ volume = } " )
0 commit comments