def fitLossCoeffs(self): for m in self.mcv: if 'losses' not in self.mcv[m]: continue losses = self.mcv[m]['losses'] cw, alfa, beta = lc.fitsteinmetz(losses['f'], losses['B'], losses['pfe'], self.mcv[m]['Bo'], self.mcv[m]['fo']) losses['cw'] = cw losses['alfa'] = alfa losses['beta'] = beta losses['Bo'] = self.mcv[m]['Bo'] losses['fo'] = self.mcv[m]['fo']
def __init__(self, filename): self.version_mc_curve = 0 self.mc1_type = femagtools.mcv.MAGCRV self.curve = [] self.name = os.path.splitext(os.path.basename(filename))[0] self.mc1_title = 'ThyssenKrupp Steel' self.curve = [{}] self.curve[0]['hi'] = [] self.curve[0]['bi'] = [] self.fo = fo self.Bo = Bo self.ch = 0.0 self.ch_freq = 0.0 self.cw = None self.cw_freq = None self.b_coeff = None self.rho = 7.6 self.losses = dict(f=[], B=[], pfe=[]) with codecs.open(filename, encoding='utf-8', errors='ignore') as f: while True: l = f.readline().strip() if not l: if not self.losses['B']: self.losses = dict() break if l.startswith('H(A/m) B(T)') or l.startswith('H[A/m] B[T]'): h, b, j = readlist(f) self.curve[0]['hi'] = h self.curve[0]['bi'] = b elif l.startswith('Comment'): self.mc1_title = l.split(':')[1].strip() elif l.startswith('Mass Density'): d = numPattern.findall(l.replace(',', '.')) self.rho = float(d[0]) if l.split()[-1] == 'kg/m^3': self.rho /= 1e3 elif l.startswith('f='): fref = numPattern.findall(l.replace(',', '.')) fxref = float(fref[0]) b, p = readlist(f) self.losses['f'].append(fxref) self.losses['B'].append(b) self.losses['pfe'].append(p) logger.info("%s Bmax %3.2f", filename, max(self.curve[0]['bi'])) if self.losses and not np.isscalar(self.losses['B'][0]): import scipy.interpolate as ip z = lc.fitjordan(self.losses['f'], self.losses['B'], self.losses['pfe'], self.Bo, self.fo) logger.info("Jordan loss coeffs %s", z) self.ch = z[2] self.ch_freq = z[3] self.cw = z[0] self.cw_freq = z[1] self.b_coeff = z[4] z = lc.fitsteinmetz(self.losses['f'], self.losses['B'], self.losses['pfe'], self.Bo, self.fo) logger.info("Steinmeth loss coeffs %s", z) self.losses['cw'] = z[0] self.losses['cw_freq'] = z[1] self.losses['b_coeff'] = z[2] self.losses['Bo'] = self.Bo self.losses['fo'] = self.fo # must normalize pfe matrix: bmin = max(list(zip(*(self.losses['B'])))[0]) bmax = max([bx[-1] for bx in self.losses['B']]) Bv = np.arange( np.ceil(10 * bmin) / 10.0, (np.floor(10 * bmax) + 1) / 10.0, 0.1) m = [] for i, b in enumerate(self.losses['B']): pfunc = ip.interp1d(b, self.losses['pfe'][i], kind='cubic') bx = [x for x in Bv if x < b[-1]] m.append(pfunc(bx).tolist() + (len(Bv) - len(bx)) * [None]) self.losses['B'] = Bv.tolist() self.losses['pfe'] = list(zip(*m))
def __init__(self, filename): self.version_mc_curve = 0 self.mc1_type = femagtools.mcv.MAGCRV self.curve = [] self.name = os.path.splitext(os.path.basename(filename))[0] self.mc1_title = 'ThyssenKrupp Steel' self.curve = [{}] self.curve[0]['hi'] = [] self.curve[0]['bi'] = [] self.fo = fo self.Bo = Bo self.ch = 0.0 self.ch_freq = 0.0 self.cw = None self.cw_freq = None self.b_coeff = None self.rho = 7.6 self.losses = dict(f=[], B=[]) pfe = [] with codecs.open(filename, encoding='utf-8', errors='ignore') as f: content = [l.strip() for l in f.readlines()] for i, l in enumerate(content): if l.startswith('H(A/m) B(T)') or l.startswith('H[A/m] B[T]'): h, b, j = readlist(content[i + 1:]) self.curve[0]['hi'] = h self.curve[0]['bi'] = b elif l.startswith('Comment'): self.mc1_title = l.split(':')[1].strip() elif l.startswith('Mass Density'): d = numPattern.findall(l.replace(',', '.')) self.rho = float(d[0]) if l.split()[-1] == 'kg/m^3': self.rho /= 1e3 elif l.startswith('f='): fref = numPattern.findall(l.replace(',', '.')) fxref = float(fref[0]) b, p = readlist(content[i + 2:]) self.losses['f'].append(fxref) self.losses['B'].append(b) pfe.append(p) logger.info("%s Bmax %3.2f", filename, max(self.curve[0]['bi'])) if pfe and not np.isscalar(self.losses['B'][0]): import scipy.interpolate as ip colsize = max([len(p) for p in pfe]) losses = np.array( [list(p) + [0] * (colsize - len(p)) for p in pfe]).T z = lc.fitjordan(self.losses['f'], self.losses['B'], losses, self.Bo, self.fo) logger.info("Jordan loss coeffs %s", z) self.ch = z[0] self.ch_freq = z[1] self.cw = z[2] self.cw_freq = z[3] self.b_coeff = z[4] z = lc.fitsteinmetz(self.losses['f'], self.losses['B'], losses, self.Bo, self.fo) logger.info("Steinmetz loss coeffs %s", z) self.losses['cw'] = z[0] self.losses['cw_freq'] = z[1] self.losses['b_coeff'] = z[2] self.losses['Bo'] = self.Bo self.losses['fo'] = self.fo # must normalize pfe matrix: bmin = np.ceil(10 * max([min(b) for b in self.losses['B']])) / 10.0 bmax = round(10 * max([max(b) for b in self.losses['B']])) / 10.0 Bv = np.arange(bmin, bmax + 0.01, 0.1) m = [] for i, b in enumerate(self.losses['B']): n = len([x for x in Bv if x < b[-1]]) if n < len(b) and n < len(Bv): if Bv[n] < b[-1] + 0.1: b = list(b) b[-1] = Bv[n] n += 1 pfunc = ip.interp1d(b, pfe[i], kind='cubic') m.append([float(pfunc(x)) for x in Bv[:n]] + [None] * (len(Bv) - n)) self.losses['B'] = Bv.tolist() self.losses['pfe'] = m