Home Forums Nazca Questions and Answers Direction for building spiral Bragg gratings

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #6207
    AlexChen93
    Participant

    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.

    #6209
    Ronald
    Keymaster

    Dear Alex,

    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?

    Ronald

    #6210
    AlexChen93
    Participant

    Dear Ronald,

    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.

    Thank you,

    Alex

    #6211
    AlexChen93
    Participant

    Dear Ronald,

    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).

     

    Thanks,

     

    Alex

    #6212
    AlexChen93
    Participant

    Dear Ronald,

    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?

    Thank you,

    Alex

Viewing 5 posts - 1 through 5 (of 5 total)
  • You must be logged in to reply to this topic.