adding tordoidal simulator and drawing
This commit is contained in:
207
core.py
Normal file
207
core.py
Normal file
@@ -0,0 +1,207 @@
|
||||
import numpy as np
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 1. Put your digitized data here
|
||||
# Units:
|
||||
# - B in Tesla
|
||||
# - frequency in kHz (x-axis of your plot)
|
||||
# - Pv in kW/m^3 (y-axis of your plot)
|
||||
#
|
||||
# IMPORTANT:
|
||||
# The numbers below are ONLY EXAMPLES / PLACEHOLDERS.
|
||||
# Replace each "f_khz" and "Pv_kW_m3" array with points
|
||||
# read from your datasheet plot (solid 25 °C lines).
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
core_loss_data_25C = {
|
||||
0.025: { # 25 mT
|
||||
"f_khz": np.array([2.93084374470676,
|
||||
8.7361542468832,
|
||||
44.706096185109,
|
||||
125.963436020903,
|
||||
193.225112880907,
|
||||
], dtype=float),
|
||||
"Pv_kW_m3": np.array([0.177193262696068,
|
||||
0.679670055798598,
|
||||
5.03342212801684,
|
||||
17.4677120801992,
|
||||
30.0788251804309,
|
||||
], dtype=float),
|
||||
},
|
||||
0.050: { # 50 mT
|
||||
"f_khz": np.array([2.9975926563905,
|
||||
9.24208952674728,
|
||||
38.618648046052,
|
||||
188.92247157063,
|
||||
], dtype=float),
|
||||
"Pv_kW_m3": np.array([0.917768017464649,
|
||||
3.47034515205292,
|
||||
19.0328184767803,
|
||||
123.927503749051,
|
||||
], dtype=float),
|
||||
},
|
||||
0.100: { # 100 mT
|
||||
"f_khz": np.array([2.48,
|
||||
8.84,
|
||||
34.12,
|
||||
87.85,
|
||||
193.23,
|
||||
], dtype=float),
|
||||
"Pv_kW_m3": np.array([3.14,
|
||||
13.89,
|
||||
69.94,
|
||||
216.47,
|
||||
564.36,
|
||||
], dtype=float),
|
||||
},
|
||||
0.200: { # 200 mT
|
||||
"f_khz": np.array([2.14,
|
||||
8.64,
|
||||
32.25,
|
||||
83.05,
|
||||
195.41,
|
||||
], dtype=float),
|
||||
"Pv_kW_m3": np.array([10.44,
|
||||
56.44,
|
||||
276.05,
|
||||
891.89,
|
||||
2497.56,
|
||||
], dtype=float),
|
||||
},
|
||||
0.300: { # 300 mT
|
||||
"f_khz": np.array([2.19,
|
||||
5.03,
|
||||
12.39,
|
||||
24.89,
|
||||
49.47,
|
||||
], dtype=float),
|
||||
"Pv_kW_m3": np.array([26.83,
|
||||
67.97,
|
||||
193.07,
|
||||
442.55,
|
||||
1000,
|
||||
], dtype=float),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 2. Helper: 1-D log-log interpolation in frequency
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
def _loglog_interp(x, xp, fp):
|
||||
"""
|
||||
Log-log interpolation: fp vs xp, evaluated at x.
|
||||
|
||||
All arguments are assumed > 0.
|
||||
"""
|
||||
x = np.asarray(x, dtype=float)
|
||||
xp = np.asarray(xp, dtype=float)
|
||||
fp = np.asarray(fp, dtype=float)
|
||||
|
||||
logx = np.log10(x)
|
||||
logxp = np.log10(xp)
|
||||
logfp = np.log10(fp)
|
||||
|
||||
logy = np.interp(logx, logxp, logfp)
|
||||
return 10.0 ** logy
|
||||
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 3. Main function: Pv(B, f) interpolation
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
def core_loss_Pv(B_T, f_Hz, data=core_loss_data_25C):
|
||||
"""
|
||||
Interpolate core loss density P_v for given flux density and frequency.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
B_T : float
|
||||
Peak flux density in Tesla (e.g. 0.05 for 50 mT).
|
||||
f_Hz : float or array_like
|
||||
Frequency in Hz.
|
||||
data : dict
|
||||
Dict mapping B_T -> {"f_khz": array, "Pv_kW_m3": array}.
|
||||
|
||||
Returns
|
||||
-------
|
||||
Pv_kW_m3 : float or ndarray
|
||||
Core loss density in kW/m^3 at 25 °C.
|
||||
"""
|
||||
B_T = float(B_T)
|
||||
f_khz = np.asarray(f_Hz, dtype=float) / 1e3 # plot uses kHz
|
||||
|
||||
if np.any(f_khz <= 0):
|
||||
raise ValueError("Frequency must be > 0 Hz")
|
||||
|
||||
# Sorted list of available B values from your digitized curves
|
||||
B_list = np.array(sorted(data.keys()))
|
||||
|
||||
# Handle out-of-range B values
|
||||
if B_T < B_list.min():
|
||||
raise ValueError(
|
||||
f"B={B_T:.3f} T is below available range "
|
||||
f"[{B_list.min():.3f}, {B_list.max():.3f}] T"
|
||||
)
|
||||
|
||||
# For B > max data (0.3T), extrapolate up to 0.4T using two highest curves
|
||||
# If B > 0.4T, clamp to the extrapolated value at 0.4T
|
||||
if B_T > B_list.max():
|
||||
# Use the two highest B values for extrapolation
|
||||
B1 = B_list[-2] # 0.2T
|
||||
B2 = B_list[-1] # 0.3T
|
||||
|
||||
d1 = data[B1]
|
||||
d2 = data[B2]
|
||||
|
||||
# Interpolate along frequency (log-log) on each B curve
|
||||
Pv1 = _loglog_interp(f_khz, d1["f_khz"], d1["Pv_kW_m3"])
|
||||
Pv2 = _loglog_interp(f_khz, d2["f_khz"], d2["Pv_kW_m3"])
|
||||
|
||||
# Extrapolate in log(Pv) vs B (Pv ~ B^b approximately)
|
||||
logPv1 = np.log10(Pv1)
|
||||
logPv2 = np.log10(Pv2)
|
||||
|
||||
# Clamp B_T to 0.4T for extrapolation calculation
|
||||
B_T_clamped = min(B_T, 0.4)
|
||||
alpha = (B_T_clamped - B1) / (B2 - B1)
|
||||
logPv = (1.0 - alpha) * logPv1 + alpha * logPv2
|
||||
|
||||
return 10.0 ** logPv
|
||||
|
||||
# If B_T is (approximately) one of the tabulated curves, just interpolate in f
|
||||
idx_match = np.where(np.isclose(B_list, B_T, rtol=1e-4, atol=1e-6))[0]
|
||||
if idx_match.size:
|
||||
B_key = B_list[idx_match[0]]
|
||||
d = data[B_key]
|
||||
return _loglog_interp(f_khz, d["f_khz"], d["Pv_kW_m3"])
|
||||
|
||||
# Otherwise, find the two B curves that bracket B_T
|
||||
idx = np.searchsorted(B_list, B_T)
|
||||
B1 = B_list[idx - 1]
|
||||
B2 = B_list[idx]
|
||||
|
||||
d1 = data[B1]
|
||||
d2 = data[B2]
|
||||
|
||||
# Interpolate along frequency (log-log) on each B curve
|
||||
Pv1 = _loglog_interp(f_khz, d1["f_khz"], d1["Pv_kW_m3"])
|
||||
Pv2 = _loglog_interp(f_khz, d2["f_khz"], d2["Pv_kW_m3"])
|
||||
|
||||
# Now interpolate between B1 and B2.
|
||||
# Do it in log(Pv) vs B (Pv ~ B^b approximately).
|
||||
logPv1 = np.log10(Pv1)
|
||||
logPv2 = np.log10(Pv2)
|
||||
|
||||
alpha = (B_T - B1) / (B2 - B1)
|
||||
logPv = (1.0 - alpha) * logPv1 + alpha * logPv2
|
||||
|
||||
return 10.0 ** logPv
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
p = core_loss_Pv(0.2, 25_000)
|
||||
print (p)
|
||||
|
||||
Reference in New Issue
Block a user