python: add some initial automesh features
Signed-off-by: Thorsten Liebig <Thorsten.Liebig@gmx.de>pull/29/head
parent
963aa39ed4
commit
c8049af005
|
@ -58,7 +58,7 @@ mesh_res = C0/(f0+fc)/1e-3/20
|
||||||
|
|
||||||
### Generate properties, primitives and mesh-grid
|
### Generate properties, primitives and mesh-grid
|
||||||
#initialize the mesh with the "air-box" dimensions
|
#initialize the mesh with the "air-box" dimensions
|
||||||
mesh.AddLine('x', [-SimBox[0]/2, feed_pos, SimBox[0]/2])
|
mesh.AddLine('x', [-SimBox[0]/2, SimBox[0]/2])
|
||||||
mesh.AddLine('y', [-SimBox[1]/2, SimBox[1]/2] )
|
mesh.AddLine('y', [-SimBox[1]/2, SimBox[1]/2] )
|
||||||
mesh.AddLine('z', [-SimBox[2]/3, SimBox[2]*2/3] )
|
mesh.AddLine('z', [-SimBox[2]/3, SimBox[2]*2/3] )
|
||||||
|
|
||||||
|
@ -66,14 +66,14 @@ mesh.AddLine('z', [-SimBox[2]/3, SimBox[2]*2/3] )
|
||||||
patch = CSX.AddMetal( 'patch' ) # create a perfect electric conductor (PEC)
|
patch = CSX.AddMetal( 'patch' ) # create a perfect electric conductor (PEC)
|
||||||
start = [-patch_width/2, -patch_length/2, substrate_thickness]
|
start = [-patch_width/2, -patch_length/2, substrate_thickness]
|
||||||
stop = [ patch_width/2 , patch_length/2, substrate_thickness]
|
stop = [ patch_width/2 , patch_length/2, substrate_thickness]
|
||||||
pb=patch.AddBox(priority=10, start=start, stop=stop) # add a box-primitive to the metal property 'patch'
|
patch.AddBox(priority=10, start=start, stop=stop) # add a box-primitive to the metal property 'patch'
|
||||||
pb.AddEdges2Grid('xy', metal_edge_res=mesh_res/2)
|
FDTD.AddEdges2Grid(dirs='xy', properties=patch, metal_edge_res=mesh_res/2)
|
||||||
|
|
||||||
# create substrate
|
# create substrate
|
||||||
substrate = CSX.AddMaterial( 'substrate', epsilon=substrate_epsR, kappa=substrate_kappa)
|
substrate = CSX.AddMaterial( 'substrate', epsilon=substrate_epsR, kappa=substrate_kappa)
|
||||||
start = [-substrate_width/2, -substrate_length/2, 0]
|
start = [-substrate_width/2, -substrate_length/2, 0]
|
||||||
stop = [ substrate_width/2, substrate_length/2, substrate_thickness]
|
stop = [ substrate_width/2, substrate_length/2, substrate_thickness]
|
||||||
sb=substrate.AddBox( priority=0, start=start, stop=stop )
|
substrate.AddBox( priority=0, start=start, stop=stop )
|
||||||
|
|
||||||
# add extra cells to discretize the substrate thickness
|
# add extra cells to discretize the substrate thickness
|
||||||
mesh.AddLine('z', linspace(0,substrate_thickness,substrate_cells+1))
|
mesh.AddLine('z', linspace(0,substrate_thickness,substrate_cells+1))
|
||||||
|
@ -82,12 +82,14 @@ mesh.AddLine('z', linspace(0,substrate_thickness,substrate_cells+1))
|
||||||
gnd = CSX.AddMetal( 'gnd' ) # create a perfect electric conductor (PEC)
|
gnd = CSX.AddMetal( 'gnd' ) # create a perfect electric conductor (PEC)
|
||||||
start[2]=0
|
start[2]=0
|
||||||
stop[2] =0
|
stop[2] =0
|
||||||
gb=gnd.AddBox(start, stop, priority=10, edges2grid='all')
|
gnd.AddBox(start, stop, priority=10)
|
||||||
|
|
||||||
|
FDTD.AddEdges2Grid(dirs='xy', properties=gnd)
|
||||||
|
|
||||||
# apply the excitation & resist as a current source
|
# apply the excitation & resist as a current source
|
||||||
start = [feed_pos, 0, 0]
|
start = [feed_pos, 0, 0]
|
||||||
stop = [feed_pos, 0, substrate_thickness]
|
stop = [feed_pos, 0, substrate_thickness]
|
||||||
port = FDTD.AddLumpedPort(1 ,feed_R, start, stop, 'z', 1.0, priority=5, edges2grid='all')
|
port = FDTD.AddLumpedPort(1, feed_R, start, stop, 'z', 1.0, priority=5, edges2grid='xy')
|
||||||
|
|
||||||
mesh.SmoothMeshLines('all', mesh_res, 1.4)
|
mesh.SmoothMeshLines('all', mesh_res, 1.4)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Created on Sun Feb 19 20:29:25 2017
|
||||||
|
|
||||||
|
@author: thorsten
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from CSXCAD import CSPrimitives
|
||||||
|
from CSXCAD.Utilities import CheckNyDir, GetMultiDirs
|
||||||
|
|
||||||
|
def mesh_hint_from_primitive(primitive, dirs, **kw):
|
||||||
|
if primitive.GetType() is CSPrimitives.POINT:
|
||||||
|
return mesh_hint_from_point(primitive, dirs, **kw)
|
||||||
|
if primitive.GetType() is CSPrimitives.BOX:
|
||||||
|
return mesh_hint_from_box(primitive, dirs, **kw)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def mesh_hint_from_point(point, dirs, **kw):
|
||||||
|
""" mesh_hint_from_point(point, dirs)
|
||||||
|
|
||||||
|
Get a grid hint for the coordinates of the point.
|
||||||
|
|
||||||
|
:param dirs: str -- 'x','y','z' or 'xy', 'yz' or 'xyz' or 'all'
|
||||||
|
:returns: (3,) list of mesh hints
|
||||||
|
"""
|
||||||
|
hint = [None, None, None]
|
||||||
|
coord = point.GetCoord()
|
||||||
|
for ny in GetMultiDirs(dirs):
|
||||||
|
hint[ny] = [coord[ny],]
|
||||||
|
return hint
|
||||||
|
|
||||||
|
def mesh_hint_from_box(box, dirs, **kw):
|
||||||
|
""" mesh_hint_from_box(box, dirs, metal_edge_res=None, **kw)
|
||||||
|
|
||||||
|
Get a grid hint for the edges of the given box with an an optional 2D metal
|
||||||
|
edge resolution.
|
||||||
|
|
||||||
|
:param dirs: str -- 'x','y','z' or 'xy', 'yz' or 'xyz' or 'all'
|
||||||
|
:param metal_edge_res: float -- 2D flat edge resolution
|
||||||
|
:returns: (3,) list of mesh hints
|
||||||
|
"""
|
||||||
|
metal_edge_res = kw.get('metal_edge_res', None)
|
||||||
|
up_dir = kw.get('up_dir' , True)
|
||||||
|
down_dir = kw.get('down_dir', True)
|
||||||
|
|
||||||
|
if metal_edge_res is None:
|
||||||
|
mer = 0
|
||||||
|
else:
|
||||||
|
mer = np.array([-1.0, 2.0])/3 * metal_edge_res
|
||||||
|
if box.HasTransform():
|
||||||
|
sys.stderr.write('FDTD::automesh: Warning, cannot add edges to grid with transformations enabled\n')
|
||||||
|
return
|
||||||
|
hint = [None, None, None]
|
||||||
|
start = np.fmin(box.GetStart(), box.GetStop())
|
||||||
|
stop = np.fmax(box.GetStart(), box.GetStop())
|
||||||
|
for ny in GetMultiDirs(dirs):
|
||||||
|
hint[ny] = []
|
||||||
|
if metal_edge_res is not None and stop[ny]-start[ny]>metal_edge_res:
|
||||||
|
if down_dir:
|
||||||
|
hint[ny].append(start[ny]-mer[0])
|
||||||
|
hint[ny].append(start[ny]-mer[1])
|
||||||
|
if up_dir:
|
||||||
|
hint[ny].append(stop[ny]+mer[0])
|
||||||
|
hint[ny].append(stop[ny]+mer[1])
|
||||||
|
elif stop[ny]-start[ny]:
|
||||||
|
if down_dir:
|
||||||
|
hint[ny].append(start[ny])
|
||||||
|
if up_dir:
|
||||||
|
hint[ny].append(stop[ny])
|
||||||
|
else:
|
||||||
|
hint[ny].append(start[ny])
|
||||||
|
return hint
|
||||||
|
|
|
@ -19,7 +19,9 @@
|
||||||
import os, sys, shutil
|
import os, sys, shutil
|
||||||
import numpy as np
|
import numpy as np
|
||||||
cimport openEMS
|
cimport openEMS
|
||||||
from . import ports, nf2ff
|
from . import ports, nf2ff, automesh
|
||||||
|
|
||||||
|
from CSXCAD.Utilities import GetMultiDirs
|
||||||
|
|
||||||
cdef class openEMS:
|
cdef class openEMS:
|
||||||
""" openEMS
|
""" openEMS
|
||||||
|
@ -267,7 +269,15 @@ cdef class openEMS:
|
||||||
openEMS.ports.LumpedPort
|
openEMS.ports.LumpedPort
|
||||||
"""
|
"""
|
||||||
assert self.__CSX is not None, 'AddLumpedPort: CSX is not set!'
|
assert self.__CSX is not None, 'AddLumpedPort: CSX is not set!'
|
||||||
return ports.LumpedPort(self.__CSX, port_nr, R, start, stop, p_dir, excite, **kw)
|
port = ports.LumpedPort(self.__CSX, port_nr, R, start, stop, p_dir, excite, **kw)
|
||||||
|
edges2grid = kw.get('edges2grid', None)
|
||||||
|
if edges2grid is not None:
|
||||||
|
grid = self.__CSX.GetGrid()
|
||||||
|
for n in GetMultiDirs(edges2grid):
|
||||||
|
grid.AddLine(n, start[n])
|
||||||
|
if start[n] != stop[n]:
|
||||||
|
grid.AddLine(n, stop[n])
|
||||||
|
return port
|
||||||
|
|
||||||
def AddWaveGuidePort(self, port_nr, start, stop, p_dir, E_func, H_func, kc, excite=0, **kw):
|
def AddWaveGuidePort(self, port_nr, start, stop, p_dir, E_func, H_func, kc, excite=0, **kw):
|
||||||
""" AddWaveGuidePort(self, port_nr, start, stop, p_dir, E_func, H_func, kc, excite=0, **kw)
|
""" AddWaveGuidePort(self, port_nr, start, stop, p_dir, E_func, H_func, kc, excite=0, **kw)
|
||||||
|
@ -364,6 +374,42 @@ cdef class openEMS:
|
||||||
self.__CSX = CSX
|
self.__CSX = CSX
|
||||||
self.thisptr.SetCSX(CSX.thisptr)
|
self.thisptr.SetCSX(CSX.thisptr)
|
||||||
|
|
||||||
|
def GetCSX(self):
|
||||||
|
return self.__CSX
|
||||||
|
|
||||||
|
def AddEdges2Grid(self, dirs, primitives=None, properties=None, **kw):
|
||||||
|
""" AddEdges2Grid(primitives, dirs, **kw)
|
||||||
|
|
||||||
|
Add the edges of the given primitives to the FDTD grid.
|
||||||
|
|
||||||
|
:param dirs: primitives -- one or more primitives
|
||||||
|
:param dirs: str -- 'x','y','z' or 'xy', 'yz' or 'xyz' or 'all'
|
||||||
|
"""
|
||||||
|
csx = self.GetCSX()
|
||||||
|
if csx is None:
|
||||||
|
raise Exception('AddEdges2Grid: Unable to access CSX!')
|
||||||
|
prim_list = []
|
||||||
|
if primitives is not None and type(primitives) is not list:
|
||||||
|
prim_list.append(primitives)
|
||||||
|
elif primitives is not None:
|
||||||
|
prim_list += primitives
|
||||||
|
|
||||||
|
if properties is not None and type(properties) is not list:
|
||||||
|
prim_list += properties.GetAllPrimitives()
|
||||||
|
elif primitives is not None:
|
||||||
|
for prop in properties:
|
||||||
|
prim_list += prop.GetAllPrimitives()
|
||||||
|
|
||||||
|
grid = csx.GetGrid()
|
||||||
|
for prim in prim_list:
|
||||||
|
hint = automesh.mesh_hint_from_primitive(prim, dirs, **kw)
|
||||||
|
if hint is None:
|
||||||
|
continue
|
||||||
|
for n in range(3):
|
||||||
|
if hint[n] is None:
|
||||||
|
continue
|
||||||
|
grid.AddLine(n, hint[n])
|
||||||
|
|
||||||
def Run(self, sim_path, cleanup=False, setup_only=False, verbose=None):
|
def Run(self, sim_path, cleanup=False, setup_only=False, verbose=None):
|
||||||
""" Run(sim_path, cleanup=False, setup_only=False, verbose=None)
|
""" Run(sim_path, cleanup=False, setup_only=False, verbose=None)
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ class LumpedPort(Port):
|
||||||
elif self.R==0:
|
elif self.R==0:
|
||||||
lumped_R = CSX.AddMetal(self.lbl_temp.format('resist'))
|
lumped_R = CSX.AddMetal(self.lbl_temp.format('resist'))
|
||||||
|
|
||||||
lumped_R.AddBox(self.start, self.stop, priority=self.priority, edges2grid=kw.get('edges2grid', None))
|
lumped_R.AddBox(self.start, self.stop, priority=self.priority)
|
||||||
|
|
||||||
if excite!=0:
|
if excite!=0:
|
||||||
exc_vec = np.zeros(3)
|
exc_vec = np.zeros(3)
|
||||||
|
|
Loading…
Reference in New Issue