예제 #1
0
파일: mcv.py 프로젝트: kurhar/femagtools
 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']
예제 #2
0
파일: tks.py 프로젝트: psiehr/femagtools
    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))
예제 #3
0
    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