30 July 2020 at 08:50 #6207
I’m interested in overlaying a Bragg grating onto a spiral to make a spiral Bragg grating (similar to page 22 of the thesis paper “Spiral Bragg Gratings for TM Mode Silicon Photonics” by Zhitian Chen). The structure will be long (>10 cm) with a large number of periods (on the order of 100,000).
Currently, I can use bends from interconnect to make a spiral waveguide consisting of straight waveguides, but I’m unsure of how to impose a Bragg grating design onto the waveguides. Current thoughts are to use a parametric curve similar to the free form curve tutorial using tp_viper or to build a polygon for the grating (what I’m currently doing for a straight Bragg grating) and have the polygon points follow a curve. I talked with a group member who briefly touched upon this but never fully built one out and points out that there might be a memory problem with how the structure is defined (due to the number of unique points) and suggests the latter option of a polygon following a curve since the current iteration of code we are using to build the Bragg grating will cut off after a certain number of periods to ensure that the total vertex count is bounded.
I was wondering if this is indeed the case and that the curved polygon method would be better suited for my application. Any information or direction would be appreciated, and if a sample of the code for the grating is needed, I can provide some. Thank you.30 July 2020 at 09:11 #6209RonaldKeymaster
Define a single polygon for the grating element and place that element repeatedly on the spine of the spiral waveguide curve at the right intervals. Would that work for your use case?
Ronald30 July 2020 at 15:38 #6210
Unfortunately, I plan to have the grating elements change in size to introduce a super Gaussian apodization to the whole Bragg grating structure so I would need to define multiple polygons for my structure.
Alex30 July 2020 at 18:37 #6211
I figured I should be a bit more clear on my structure.
Attached is a picture of a single period element of my Bragg grating. What is labeled as wmin and period will stay constant (for now) and wmax’s height at the midpoint will follow a super Gaussian apodization as it travels along the grating length.
What it would look like for 2 periods. I’ll post what I’m using to make a straight, apodized Bragg grating after this post (I’m not sure how the forum will post it if I switch between the visual and text tab).
Alex30 July 2020 at 18:48 #6212
The pictures above didn’t seem to post, so I’ll attach an imgur link of the pictures: https://imgur.com/a/NEC8ubq
Regarding the code I’m considering modifying with the polygons:
def MEMSGSLBG(N=1000,per=0.300,duty=0.5,width=0.5,wmin=0.5,wmax=1.5,layer=1,alph=0.39,n=8,wsleeve=5,layerp=2):#memory efficient super gaussian #name = 'SGSLBG' name = 'SGSLBG_N'+str(int(N))+"_P"+str(int(1000*per))+"_D"+str(int(100*duty))+"W"+str(int(width*1000))+"_WX"+str(int(wmax*1000))+"_WM"+str(int(wmin*1000)); #build from (0,0) maxpg =500 #maximum periods per polygon object L = N*per; tooth = per*duty; gap = per*(1-duty); bH = wmin/2.; with nd.Cell(name=name) as cell: for k in range(0,N): if k==0: #initialze polypts= polypts_sleeve_L=#initialize sleeve polygons polypts_sleeve_R= elif k%maxpg == 0: #close polygon exceeding maximum periods per polygon and start new polygon nd.Polygon(points=polypts,layer=layer).put(0,0,0)#place at true coordinates nd.Polygon(points=polypts_sleeve_L,layer=layerp).put(0,0,0) nd.Polygon(points=polypts_sleeve_R,layer=layerp).put(0,0,0) polypts= polypts_sleeve_L= polypts_sleeve_R= z = per*(k+duty/2.) #eval at major element midpoint fz = math.exp(-.5*pow(((z/L)-.5)/alph,n)) fzx = (wmax-width)*fz; fzm = (width-wmin)*fz; rectx = nd.geometries.transform(points=nd.geometries.box(length=tooth,width=width+fzx),move=(k*per,0,0)) polypts[int(len(polypts)/2):int(len(polypts)/2)] = rectx #insert into polygon list rectm = nd.geometries.transform(points=nd.geometries.box(length=gap,width=width-fzm),move=((k+duty)*per,0,0)) polypts[int(len(polypts)/2):int(len(polypts)/2)] = rectm #insert into polygon list nd.Polygon(points=polypts,layer=layer).put(0,0,0)#place at true coordinates any remainder shape nd.Pin('a0',width=width).put(0,0,180) nd.Pin('b0',width=width).put(L,0,0) return cell
I would like to have the grating elements (rectx and rectm) follow a curve, and after talking it over with a colleague, he suggested changing the move part of the code to follow a curve, calculating the points necessary for x, y, and angle. Based off this, we think there will be a problem where the interface where two differently angled elements will have a “dip” in the resulting layout and believe that adding another point on the larger rectangle should do the trick.
Do you think this is similar to the direction you proposed? Is the fix we proposed the correct way to go about it?
- You must be logged in to reply to this topic.