IonizationChamber/simulation/Electric/upperview.py

124 wiersze
4.4 KiB
Python

import math
import agros2d as a2d
def initProblem():
problem = a2d.problem(clear = True)
problem.coordinate_type = "planar"
problem.mesh_type = "triangle"
return problem
def initSimulatedField():
electrostatic = a2d.field("electrostatic")
electrostatic.analysis_type = "steadystate"
electrostatic.matrix_solver = "mumps"
electrostatic.number_of_refinements = 1
electrostatic.polynomial_order = 2
electrostatic.adaptivity_type = "disabled"
electrostatic.solver = "linear"
return electrostatic
def setBoundaries(field):
field.add_boundary("Source", "electrostatic_potential", {"electrostatic_potential" : 20})
field.add_boundary("Ground", "electrostatic_potential", {"electrostatic_potential" : 0})
field.add_boundary("Border", "electrostatic_surface_charge_density", {"electrostatic_surface_charge_density" : 0})
def setMaterials(field):
field.add_material("Air", {"electrostatic_permittivity" : 1, "electrostatic_charge_density" : 0})
field.add_material("Antena", {"electrostatic_permittivity" : 10, "electrostatic_charge_density" : 0})
class ElectrodeShape:
def __init__(self, **kwds):
self.__dict__.update(kwds)
def addElectrodeToSimulation(electrode, boundary, material):
a2d.geometry.add_rect(electrode.x, electrode.y, electrode.dx, electrode.dy, boundaries = {"electrostatic" : boundary})
labelx = electrode.x + (electrode.dx / 2)
labely = electrode.y + (electrode.dy / 2)
a2d.geometry.add_label(labelx, labely, materials = {"electrostatic" : material})
def main():
problem = problemToSolve = initProblem()
field = initSimulatedField()
setBoundaries(field)
setMaterials(field)
chamberHeight = 1.0
chamberLength = 4.0
copperPlateThickness =0.01
electrodeLeft = ElectrodeShape(x = 0, y = 0, dx = -copperPlateThickness, dy = chamberHeight)
electrodeRight = ElectrodeShape(x = chamberLength, y = 0, dx = copperPlateThickness, dy = chamberHeight)
electrodeTop = ElectrodeShape(x = 0, y = chamberHeight, dx = chamberLength, dy = copperPlateThickness)
addElectrodeToSimulation(electrodeLeft, "Ground", "Antena")
addElectrodeToSimulation(electrodeRight, "Ground", "Antena")
addElectrodeToSimulation(electrodeTop, "Ground", "Antena")
guardWidth = 0.2
guardDistance = 0.2
boardDistance = 0.2
xoffset = 0.0
electrodeBottom1 = ElectrodeShape(x=xoffset, y=0, dx=boardDistance, dy=-copperPlateThickness)
xoffset+=boardDistance
electrodeBottom2 = ElectrodeShape(x=xoffset, y=0, dx=guardDistance, dy=-copperPlateThickness)
xoffset+=guardDistance
electrodeBottom3 = ElectrodeShape(x=xoffset, y=0, dx=guardWidth, dy=-copperPlateThickness)
xoffset+=guardWidth
electrodeBottom4 = ElectrodeShape(x=xoffset, y=0, dx=guardDistance, dy=-copperPlateThickness)
# middle
xoffset+=guardDistance
electrodeBottom5 = ElectrodeShape(x=xoffset, y=0, dx=(chamberLength-2*xoffset), dy=-copperPlateThickness)
xoffset+=(chamberLength-2*xoffset)
electrodeBottom6 = ElectrodeShape(x=xoffset, y=0, dx=guardDistance, dy=-copperPlateThickness)
xoffset+=guardDistance
electrodeBottom7 = ElectrodeShape(x=xoffset, y=0, dx=guardWidth, dy=-copperPlateThickness)
xoffset+=guardWidth
electrodeBottom8 = ElectrodeShape(x=xoffset, y=0, dx=guardDistance, dy=-copperPlateThickness)
xoffset+=guardDistance
electrodeBottom9 = ElectrodeShape(x=xoffset, y=0, dx=boardDistance, dy=-copperPlateThickness)
addElectrodeToSimulation(electrodeBottom1, "Ground", "Antena") # electrode A
addElectrodeToSimulation(electrodeBottom2, "Border", "Air")
addElectrodeToSimulation(electrodeBottom3, "Source", "Antena")
addElectrodeToSimulation(electrodeBottom4, "Border", "Air")
addElectrodeToSimulation(electrodeBottom5, "Source", "Antena") # electrode B
addElectrodeToSimulation(electrodeBottom6, "Border", "Air")
addElectrodeToSimulation(electrodeBottom7, "Source", "Antena")
addElectrodeToSimulation(electrodeBottom8, "Border", "Air")
addElectrodeToSimulation(electrodeBottom9, "Ground", "Antena") # electrode A
a2d.geometry.add_label(0.1, 0.1, materials = {"electrostatic" : "Air"})
a2d.view.zoom_best_fit()
problem.solve()
if __name__ == "__main__":
main()