Source code for femagtools.airgap
# -*- coding: utf-8 -*-
"""
femagtools.airgap
~~~~~~~~~~~~~~~~~
Read airgap dat file
"""
import numpy as np
import logging
logger = logging.getLogger(__name__)
[docs]def read(filename, pmod):
"""read dat file with columns (phi, Br, Bphi)
returns samples, values, amplitude and phase of base harmonic
Args:
filename: the name of the file to be processed
pmod: number of poles in model
"""
bag = np.loadtxt(filename).T
if len(bag) < 3:
logger.warn("%s has incomplete content", filename)
return(dict())
N = 2**10 # The DFT is most efficient when N is a power of 2
phi = np.linspace(0, 2*np.pi, N)
nphi = int(round(360/((bag[0][-1] - bag[0][0])/(len(bag[0]) - 1)))) + 1
ntiles = (nphi-1)//(len(bag[0]) - 1)
phitab = np.linspace(0, 2*np.pi, nphi)
if pmod % 2:
bx = np.append(
np.concatenate(
[n*bag[1][:-1]
for n in [m % 2 or -1
for m in range(1, ntiles+1)]]),
bag[1][0])
else:
bx = np.append(
np.tile(bag[1][:-1], ntiles),
bag[1][0])
br = np.interp(phi, phitab, bx)
npoles = ntiles*pmod
# compute DFT from induction
Y = np.fft.fft(br)
freq = np.fft.fftfreq(N, d=phi[1]-phi[0])
# find the peak (amplitude of base harmonic)
i = np.argmax(np.abs(Y[:N//2]))
a = 2*np.abs(Y[i])/N
T0 = np.abs(1/freq[i])
logger.info("%s: %s poles B amp %f ",
filename, npoles, a)
alfa0 = np.angle(Y[i])
alfa = bag[0]/180*np.pi
return dict(Bamp=a,
phi0=alfa0,
pos=bag[0].tolist(),
B=bag[1].tolist(),
nue=np.arange(0, 9*npoles).tolist(),
B_nue=(2*np.abs(Y[:9*npoles])/N).tolist(),
B_fft=(a*np.cos(2*np.pi*alfa/T0+alfa0)).tolist())