コード例 #1
0
def TaskSetup(timestep):
    """Setup the task."""

    vd_r = LinearVertexDistribution(
        int((r_out_domain - r_in_domain) * grid_division_r) + 1)
    vd_phi = LinearVertexDistribution(int(phi_domain * grid_division_phi) + 1)

    p0 = (r_in_domain, Qty('0deg'))
    p1 = (r_out_domain, phi_domain)

    grid = GridPatchPolar(p0, p1, vd_r, vd_phi)

    grid.SetMaterial(
        Rectangle((r_in_iron, Qty("0deg")), (r_out_iron, phi_domain)), mat)

    potential_out = flux_density * (r_out_iron - r_in_iron)

    grid.west_boundary.SetBoundaryCondition(
        DirichletCondition(lambda position, time: potential_out * sin(
            2. * pi * (time * frequency))))
    grid.east_boundary.SetBoundaryCondition(DirichletCondition())

    grid_compiler = GridCompiler(grid)

    return grid_compiler(timestep)
コード例 #2
0
ファイル: simple_iron_core.py プロジェクト: pbuettgen/ulphi
def TaskSetup():
    """Setup the task."""

    ndx = LinearVertexDistribution(int(domain_width * grid_division) + 1)
    ndy = LinearVertexDistribution(int(domain_height * grid_division) + 1)

    p0 = (Qty('0m'), Qty('0m'))
    p1 = (domain_width, domain_height)

    grid = GridPatchCartesian(p0, p1, ndx, ndy)

    grid.SetLoad(c_geo.Rectangle(coil1_llc, coil_dim_x, coil_dim_y),
                 current_density)
    grid.SetLoad(c_geo.Rectangle(coil2_llc, coil_dim_x, coil_dim_y),
                 -current_density)

    grid.SetMaterial(
        c_geo.Rectangle(iron1_llc, iron_width, iron1_height + .1 * iron_width),
        mat)
    grid.SetMaterial(c_geo.Rectangle(iron2_llc, iron2_width, iron_width), mat)

    dbc = DirichletCondition()

    grid.north_boundary.SetBoundaryCondition(dbc)
    grid.east_boundary.SetBoundaryCondition(dbc)

    grid_compiler = GridCompiler(grid)

    return grid_compiler()
コード例 #3
0
ファイル: wound_iron_core.py プロジェクト: pbuettgen/ulphi
def TaskSetup():
    # Grid definitions

    gp1_width = gp1_urc[0] - gp1_llc[0]
    gp1_height = gp1_urc[1] - gp1_llc[1]
    gp1_ndx = LinearVertexDistribution(int(gp1_width * grid_division) + 1)
    gp1_ndy = LinearVertexDistribution(int(gp1_height * grid_division) + 1)
    gp1 = GridPatchCartesian(gp1_llc, gp1_urc, gp1_ndx, gp1_ndy)

    gp2_nd_phi = LinearVertexDistribution(30)
    gp2 = GridPatchPolar(gp2_llc, gp2_urc, gp1_ndx, gp2_nd_phi)

    gp3_ndx = LinearVertexDistribution(int(iron_len_2 * grid_division) + 1)
    gp3 = GridPatchCartesian(gp3_llc, gp3_urc, gp3_ndx, gp1_ndx)

    # Grid couplings
    gp2.south_boundary.SetBoundaryCoupling(gp1.north_boundary)
    gp3.east_boundary.SetBoundaryCoupling(gp2.north_boundary)

    # Boundary condition
    bc_dc0 = DirichletCondition()
    gp1.east_boundary.SetBoundaryCondition(bc_dc0)
    gp2.east_boundary.SetBoundaryCondition(bc_dc0)
    gp3.north_boundary.SetBoundaryCondition(bc_dc0)
    gp3.south_boundary.SetBoundaryCondition(bc_dc0)

    # Load definition
    a_amplitude = peak_flux_density * iron_width
    bc_source_field = DirichletCondition(
        lambda pos, t: a_amplitude * cos(2 * pi * (frequency * t)))
    gp1.west_boundary.SetBoundaryCondition(bc_source_field)
    gp2.west_boundary.SetBoundaryCondition(bc_source_field)
    gp3.south_boundary.SetBoundaryCondition(bc_source_field)

    # Material definition
    gp1.SetMaterial(
        c_geo.Rectangle((iron_r_in, -iron_len_1), iron_width, iron_len_1),
        mat1)
    gp2.SetMaterial(
        p_geo.Rectangle((iron_r_in, Qty("0rad")), iron_width,
                        Qty(pi / 2, "rad")), mat1)
    gp3.SetMaterial(
        c_geo.Rectangle((-iron_len_2, iron_r_in), iron_len_2 * 1.1,
                        iron_width), mat2)

    grid_assembly = GridAssembly([gp1, gp2, gp3])
    grid_compiler = GridCompiler(grid_assembly)

    return grid_compiler(time_step)
コード例 #4
0
    def target_func(b):
        b = Qty(b, "T")
        reluct = mat.EvaluateReluctivity(b, Axis.first)[0]

        return (reluct*b
                -current_density*coil_area/average_iron_path_length
        ).to_base_units().magnitude
コード例 #5
0
ファイル: coaxial_line.py プロジェクト: pbuettgen/ulphi
def AnalyticalSolution(radius):
    I = Qty(2*pi, "rad")/domain_phi*current
    J1 = I/r1/r1/pi
    mu0 = Qty(1., "mu_0")

    A1 = lambda r: mu0*J1/4.*r*r
    A2 = lambda r: mu0*J1*r1*r1/2*(.5+log(r/r1))
    A3 = lambda r: mu0*J1*r1*r1/2*(
        .5+log(r2/r1)+log(r/r2)*(1+r2*r2/(r3*r3-r2*r2))+(
        r2*r2-r*r)/(2.*(r3*r3-r2*r2)))

    A0 = A3(r3)

    if radius <= r1:
        return A0-A1(radius)
    elif radius > r1 and radius <= r2:
        return A0-A2(radius)
    elif radius > r2 and radius <= r3:
        return A0-A3(radius)
    else:
        return A0-A3(r3)
コード例 #6
0
ファイル: simple_iron_core.py プロジェクト: pbuettgen/ulphi
def PlotMaterialCharaceristic():
    """Plot the material's characteristic."""

    mu0 = Qty(1., "mu0").inBaseUnits()
    nu0 = 1. / mu0

    brange = [Qty(x, "T") for x in sp.arange(.2, 3.8, .02)]
    nurange = [mat.EvaluateReluctivity1(x)[0] for x in brange]
    diff_nu = [mat.EvaluateReluctivity1(x)[1] for x in brange]

    plt.subplot(2, 1, 1)
    plt.semilogy([x.getValue() for x in brange],
                 [y.getValue() for y in nurange],
                 label="Interp. Data")

    m400_50A_B = [x[1] + mu0 * x[0] for x in sp.c_[m400_50A_H, m400_50A_J]]
    m400_50A_nu = [
        x[0] / (x[1] + mu0 * x[0]) for x in sp.c_[m400_50A_H, m400_50A_J]
    ]
    nu_eff = [
        x * nu0 / (iron_fill_factor * nu0 - iron_fill_factor * x + x)
        for x in m400_50A_nu
    ]

    plt.semilogy([x.getValue() for x in m400_50A_B],
                 [y.getValue() for y in nu_eff],
                 "*",
                 label="Orig. Data")

    plt.legend(loc=2)
    plt.ylabel(u"ν*H/m")
    plt.grid()

    plt.subplot(2, 1, 2)
    plt.semilogy([x.getValue() for x in brange],
                 [y.getValue() + 200. for y in diff_nu])
    plt.xlabel("B/T")
    plt.ylabel(u"ν'*H/m + 200")
    plt.grid()
    plt.show()
コード例 #7
0
ファイル: coaxial_line.py プロジェクト: pbuettgen/ulphi
def NumericalSolution():
    nd_r = LinearVertexDistribution(51)
    nd_phi = LinearVertexDistribution(13)

    p1 = (r1/(nd_r.number_of_vertices-1), Qty("0rad"))
    p2 = (r1, domain_phi)
    gp1 = GridPatchPolar(p1, p2, nd_r, nd_phi)
    gp1.SetLoad(PRectangle(p1, p2), current)

    gp2 = GridPatchPolar(
        (r1, Qty("0rad")), (r2, domain_phi), nd_r, nd_phi)

    p3 = (r2, Qty("0rad"))
    p4 = (r3, domain_phi)
    gp3 = GridPatchPolar(p3, p4, nd_r, nd_phi)
    gp3.SetLoad(PRectangle(p3, p4), -current)

    gp4 = GridPatchPolar(
        (r3, Qty("0rad")), (r4, domain_phi), nd_r, nd_phi)
    gp4.east_boundary.SetBoundaryCondition(DirichletCondition())

    gp1.east_boundary.SetBoundaryCoupling(gp2.west_boundary)
    gp2.east_boundary.SetBoundaryCoupling(gp3.west_boundary)
    gp3.east_boundary.SetBoundaryCoupling(gp4.west_boundary)

    grid_assembly = GridAssembly( [gp1, gp2, gp3, gp4] )
    grid_compiler = GridCompiler(grid_assembly)
    grid_graph = grid_compiler()
    LinearSolve(grid_graph)

    return PathInGridGraph(
        grid_graph, ((r1/10., Qty("0m")), (r4, Qty("0m"))))
コード例 #8
0
def VerifyResult():
    """Use a simple model to verify the result."""

    average_iron_path_length = (r_in_iron + r_out_iron) / 2 * phi_domain

    def target_func(b):
        b = Qty(b, "T")
        reluct = mat.EvaluateReluctivity(b, Axis.second)[0]

        return (reluct * b - current_density * coil_area /
                average_iron_path_length).to_base_units().magnitude

    def target_func_deriv(b):
        b = Qty(b, "T")
        rrd = mat.EvaluateReluctivity(b, Axis.second)

        return (rrd[0] + b * rrd[1]).to_base_units().magnitude

    return Qty(opt.newton(target_func, 1., target_func_deriv), "T")
コード例 #9
0
ファイル: simple_iron_core.py プロジェクト: pbuettgen/ulphi
def VerifyResult():
    """Use a simple model to verify the result."""

    average_iron_path_length = (coil_dim_x + 2 * coil_space_side + iron_width +
                                coil_dim_y + coil_space_top)

    def target_func(b):
        b = Qty(b, "T")
        reluct = mat.EvaluateReluctivity(b, Axis.first)[0]

        return (reluct * b - current_density * coil_area /
                average_iron_path_length).to_base_units().magnitude

    def target_func_deriv(b):
        b = Qty(b, "T")
        rrd = mat.EvaluateReluctivity(b, Axis.first)

        return (rrd[0] + b * rrd[1]).to_base_units().magnitude

    return Qty(opt.newton(target_func, 1., target_func_deriv), "T")
コード例 #10
0
ファイル: coaxial_line.py プロジェクト: pbuettgen/ulphi
def main(options, args):
    path = NumericalSolution()

    path_x = sp.array(
        [x[0].to("m").magnitude for x in path.positions])
    num_solution = sp.array(
        [x.to("Wb/m").magnitude for x in path.potentials])
    interpolator = Spline(path_x, num_solution)
    x_values = sp.linspace(path_x[0], path_x[-1], 13)
    y_values = interpolator(x_values)
    sym_solution = sp.array(
        [AnalyticalSolution(Qty(x, "m")).to("Wb/m").magnitude
         for x in x_values])

    if options.plot:
        PlotResult(x_values, y_values, sym_solution)

    if options.filename:
        SaveData(
            options.filename,
            sp.c_[1e3*x_values, 1e6*interpolator(x_values), 1e6*sym_solution],
             ["x", "NumA", "SymA"])
コード例 #11
0
def TaskSetup(time_step):
    """Setup the task."""

    ndx = LinearVertexDistribution(int(domain_width*grid_division)+1)
    ndy = LinearVertexDistribution(int(domain_height*grid_division)+1)

    p0 = (Qty('0m'), Qty('0m'))
    p1 = (domain_width, domain_height)

    grid = GridPatchCartesian(p0, p1, ndx, ndy)

    coil_llc = (iron_width+coil_space_left_side, Qty("0 m"))
    grid.SetLoad(
        c_geo.Rectangle(coil_llc, coil_dim_x, coil_dim_y),
        lambda t: current_density*sin(2*pi*(frequency*t)))

    iron_height_in = coil_dim_y + coil_space_top
    iron_width_total = (2*iron_width+ coil_space_left_side
                        +coil_space_right_side+coil_dim_x)
    iron_rects =[
        c_geo.Rectangle(
            (Qty("0m"), Qty("0m")), iron_width, iron_height_in),
        c_geo.Rectangle(
            (iron_width+coil_dim_x+coil_space_left_side
             +coil_space_right_side, Qty("0m")), iron_width, iron_height_in),
        c_geo.Rectangle(
            (Qty("0m"), iron_height_in), iron_width_total, iron_width)]

    for rect in iron_rects:
        grid.SetMaterial(rect, mat)

    dbc = DirichletCondition()

    grid.west_boundary.SetBoundaryCondition(dbc)
    grid.north_boundary.SetBoundaryCondition(dbc)
    grid.east_boundary.SetBoundaryCondition(dbc)

    grid_compiler = GridCompiler(grid)

    return grid_compiler(time_step)
コード例 #12
0
ファイル: simple_iron_core.py プロジェクト: pbuettgen/ulphi
from ulphi import Qty
from ulphi.geometry import cartesian as c_geo
from ulphi.analysis.magnetostatic import *
from ulphi.materials import Material, ComboReluctivityFluxPar, ConstantReluctivity, SplineReluctivity as NonlinearReluctivity, Axis
import scipy as sp
from scipy import interpolate as ip
from scipy import optimize as opt
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import csv
from optparse import OptionParser

### Parameters

# Geometry
domain_depth = Qty(3., "cm")
coil_dim_x = Qty(5., "mm")
coil_dim_y = Qty(2.4, "cm")
coil_area = coil_dim_x * coil_dim_y
iron_width = Qty(2.5, "cm")
coil_space_top = Qty(5., "mm")
coil_space_side = Qty(5., "mm")
coil1_llc = (coil_space_side, Qty("0 m"))
coil2_llc = (3 * coil_space_side + iron_width + coil_dim_x, Qty('0m'))
iron1_llc = (2 * coil_space_side + coil_dim_x, Qty('0m'))
iron1_height = coil_dim_y + coil_space_top
iron2_llc = (Qty('0m'), coil_dim_y + coil_space_top)
iron2_width = 2 * coil_space_side + coil_dim_x + iron_width
domain_height = coil_dim_y + coil_space_top + 2 * iron_width
domain_width = 3 * coil_space_side + 2 * coil_dim_x + 2 * iron_width
grid_division = Qty(20, "1/cm")
コード例 #13
0
ファイル: coaxial_line.py プロジェクト: pbuettgen/ulphi
# <http://www.gnu.org/licenses/>.
#

from ulphi import Qty
from ulphi.geometry.polar import Rectangle as PRectangle
from ulphi.analysis.magnetostatic import *
import scipy as sp
from scipy.interpolate import InterpolatedUnivariateSpline as Spline
import matplotlib.pyplot as plt
from math import pi, log
import csv
from optparse import OptionParser


# outer radius inner conductor
r1 = Qty(5., "mm")
# inner radius outer conductor
r2 = 2.5*r1
# outer radius outer conductor
r3 = 3.5*r1
# outer domain radius
r4 = 4*r1
# angle
domain_phi = Qty(pi/8, "rad")

current = Qty(16, "A")


def PlotResult(x, y1, y2):
    plt.plot(x*1e3, y1*1e6, label="num. solution")
    plt.plot(x*1e3, y2*1e6, label="sym. solution")
コード例 #14
0
from ulphi.materials import Material, ComboReluctivityFluxPar, ConstantReluctivity, SplineReluctivity as NonlinearReluctivity, Axis
import scipy as sp
from scipy import interpolate as ip
from scipy import optimize as opt
from scipy.fftpack import fft, fftshift
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import csv
from optparse import OptionParser
from math import pi, sin


### Parameters

# Geometry
domain_depth = Qty(3., "cm")
air_surround = Qty(2., "cm")
coil_dim_x = Qty(10., "mm")
coil_dim_y = Qty(4, "cm")
coil_area = coil_dim_x*coil_dim_y
iron_width = Qty(2., "cm")
coil_space_top = Qty(5., "mm")
coil_space_left_side = Qty(3., "mm")
coil_space_right_side = Qty(7., "mm")
domain_height = coil_dim_y+coil_space_top+iron_width+air_surround
domain_width = (2*iron_width+coil_dim_x+coil_space_left_side
                +coil_space_right_side+air_surround)
grid_division = Qty(12, "1/cm")

# Electro - magnetic
current_density = Qty(2.5, 'MA/m**2')
コード例 #15
0
    def target_func_deriv(b):
        b = Qty(b, "T")
        rrd = mat.EvaluateReluctivity(b, Axis.second)

        return (rrd[0] + b * rrd[1]).to_base_units().magnitude
コード例 #16
0
from ulphi.geometry.polar import *
from ulphi.analysis.magnetostatic import *
from ulphi.materials import Material, ComboReluctivityFluxPar, ComboReluctivityFluxPerp, ConstantReluctivity, SplineReluctivity as NonlinearReluctivity, Axis
from math import pi, sin
import scipy as sp
from scipy import interpolate as ip
from scipy import optimize as opt
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import csv
from optparse import OptionParser

### Parameters

# Geometry
r_in_iron = Qty("9cm")
r_out_iron = Qty("12cm")
r_in_domain = r_in_iron - Qty("5mm")
r_out_domain = r_out_iron + Qty("5mm")
phi_domain = Qty("90deg")
grid_division_r = Qty(24, "1/cm")
grid_division_phi = Qty(.1, "1/deg")

# Electro - magnetic
flux_density = Qty("1.65T")
frequency = Qty("50Hz")
m400_50A_H = [
    Qty(x, 'A/m') for x in [
        75., 84., 93., 104., 117., 134., 159., 199., 282., 505., 1284., 3343.,
        6787., 11712., 19044
    ]
コード例 #17
0
ファイル: wound_iron_core.py プロジェクト: pbuettgen/ulphi
from ulphi.geometry import polar as p_geo
from ulphi.analysis.magnetostatic import *
from ulphi.materials import *
from math import pi, sin, cos

import scipy as sp
from scipy import interpolate as ip
from scipy import optimize as opt
from scipy.fftpack import fft, fftshift
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from optparse import OptionParser
import csv

# Geometry
iron_r_in = Qty(1., "cm")
iron_width = Qty(2.2, "cm")
iron_len_1 = Qty(5., "cm")
iron_len_2 = Qty(3., "cm")
space_out = 1 * iron_width
grid_division = Qty(15, "1/cm")

gp1_llc = (iron_r_in / 2., -iron_len_1)
gp1_urc = (iron_r_in + iron_width + space_out, Qty("0m"))
gp2_llc = (iron_r_in / 2., Qty("0 rad"))
gp2_urc = (iron_r_in + iron_width + space_out, Qty("90deg"))
gp3_llc = (-iron_len_2, iron_r_in / 2)
gp3_urc = (Qty("0m"), iron_r_in + iron_width + space_out)

# Electro - magnetic
peak_flux_density = Qty(1.85, "T")