Example #1
0
def test5():
    sim = bfdtd.BFDTDobject()
    RCD = bfdtd.RCD.RCD_HexagonalLattice()
    RCD.setUnitCellType(2)
    sim.appendGeometryObject(RCD)

    RCD.setOuterRadius(0.1)
    RCD.setRefractiveIndex(2)
    RCD.createRectangularArraySymmetrical(1, 1, 1)
    sim.writeGeoFile(tempfile.gettempdir() + os.sep + 'RCD111_1x1x1.geo')

    RCD.clearGeoList()
    RCD.setOuterRadius(0.05)
    RCD.setRefractiveIndex(3)
    RCD.createRectangularArraySymmetrical(3, 3, 3)

    sim.writeGeoFile(tempfile.gettempdir() + os.sep + 'RCD111_3x3x3.geo')

    (u, v, w) = RCD.getLatticeVectors()
    U = bfdtd.Excitation()
    U.setExtension([0, 0, 0], u)
    V = bfdtd.Excitation()
    V.setExtension([0, 0, 0], v)
    W = bfdtd.Excitation()
    W.setExtension([0, 0, 0], w)

    sim.appendExcitation(U)
    sim.appendExcitation(V)
    sim.appendExcitation(W)

    sim.writeInpFile(tempfile.gettempdir() + os.sep + 'RCD111_E.inp')
    return
Example #2
0
    def test_EpsilonBox(self):
        with tempfile.TemporaryDirectory(
                prefix='testSnapshotBoxVolume-') as outdir:

            #outdir = '/tmp/testSnapshotBoxVolume'

            sim = bfdtd.BFDTDobject()
            sim.setSizeAndResolution([10, 11, 12], [41, 42, 43])

            b = bfdtd.Block()
            b.setSize([1, 2, 3])
            b.setLocation([4, 5, 6])
            sim.appendGeometryObject(b)

            mybox = bfdtd.EpsilonBox()
            mybox.setPlaneOrientationY()
            mybox.setExtension(*b.getExtension())
            mybox.setFullExtensionOff()

            sim.appendSnapshot(mybox)

            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_epsbox.inp'))

        return
def test1():
    # effect of dipole length
    sim = bfdtd.BFDTDobject()

    S = 3
    N = 30
    sim.setSizeAndResolution([S, S, S], [N, N, N])
    c = sim.getCentro()

    E = sim.appendExcitation(bfdtd.Excitation())
    E.setEx()
    E.setLocation(c)

    dt = sim.getTimeStep()
    T = 10 * dt
    f0 = 1 / T
    Q = 100
    df = f0 / Q

    #E.setTimeOffset(100*T)
    #E.setFrequency(10/T)
    #E.setTimeConstant(20*T)
    #E.setFrequency(10/E.getTimeConstant())
    #E.setFrequency(f0)
    #E.setFrequencyRange(f0-df, f0+df)
    print(E.setFrequencyRange(5e8, 5.5e8))

    E.setTimeOffset(20 * E.getTimeConstant())
    E.setAmplitude(1)

    p = sim.appendProbe(bfdtd.Probe())
    p.setLocation(c)
    p.setStep(1)

    print(T)
    print(1 / T)
    print(100 * T)
    sim.setTimeStep((1 / E.getFrequency()) / 100)
    #sim.setSimulationTime(1e-7)
    sim.setSimulationTime(E.getTimeOffset() + 20 * E.getTimeConstant())
    #sim.setIterations(1)

    for L in linspace(0, 1, 10):
        outdir = 'LX_{:.3f}'.format(L)
        print('outdir =', outdir)
        E.setSize([L, 0, 0])
        sim.runSimulation(outdir)

        outdir = 'LY_{:.3f}'.format(L)
        print('outdir =', outdir)
        E.setSize([0, L, 0])
        sim.runSimulation(outdir)

        outdir = 'LZ_{:.3f}'.format(L)
        print('outdir =', outdir)
        E.setSize([0, 0, L])
        sim.runSimulation(outdir)

    return
Example #4
0
def test2():
    sim = bfdtd.BFDTDobject()
    sim.setVerbosity(2)
    RCD = bfdtd.RCD.RCD_HexagonalLattice()
    sim.appendGeometryObject(RCD)
    sim.appendGeometryObject(RCD.getUnitCell())
    sim.appendGeometryObject(RCD.getCubicUnitCell())
    sim.writeGeoFile(tempfile.gettempdir() + os.sep + 'RCD.geo')
def test0():
    # create files
    sim = bfdtd.BFDTDobject()
    S = 3
    N = 30
    sim.setSizeAndResolution([S, S, S], [N, N, N])
    c = sim.getCentro()

    #sim.setBoundaryConditionsToPML()

    E = sim.appendExcitation(bfdtd.Excitation())
    #E.setExtension(c-array([0.25,0,0]),c+array([0.25,0,0]))
    E.setExtension(c, c)
    E.setEx()

    dt = sim.getTimeStep()
    T = 10 * dt

    #E.setTimeOffset(100*T)
    #E.setFrequency(10/T)
    #E.setTimeConstant(20*T)
    #E.setFrequency(10/E.getTimeConstant())
    f0 = 1 / T
    Q = 100
    df = f0 / Q
    #E.setFrequency(f0)
    #E.setFrequencyRange(f0-df, f0+df)
    print(E.setFrequencyRange(5e8, 5.5e8))

    E.setTimeOffset(20 * E.getTimeConstant())
    E.setAmplitude(1)

    p = sim.appendProbe(bfdtd.Probe())
    p.setPosition(c)
    p.setStep(1)

    print(T)
    print(1 / T)
    print(100 * T)
    sim.setTimeStep((1 / E.getFrequency()) / 100)
    #sim.setSimulationTime(1e-7)
    sim.setSimulationTime(E.getTimeOffset() + 20 * E.getTimeConstant())

    print(sim.getIterations())
    print(E.getFrequencyRange())
    print('A={}; tau={}; w={}; f={}; fmin={}; fmax={};'.format(
        E.getAmplitude(), E.getTimeOffset(), E.getTimeConstant(),
        E.getFrequency(), *E.getFrequencyRange()))

    # run simulation
    sim.setExecutable('fdtd64_2013')
    sim.runSimulation('.')
Example #6
0
    def test_ModeVolumeBox(self):
        with tempfile.TemporaryDirectory(
                prefix='testSnapshotBoxVolume-') as outdir:
            #outdir = '/tmp/testSnapshotBoxVolume'

            sim = bfdtd.BFDTDobject()
            sim.setSizeAndResolution([10, 11, 12], [41, 42, 43])

            b = bfdtd.Block()
            b.setSize([1, 2, 3])
            b.setLocation([4, 5, 6])
            sim.appendGeometryObject(b)

            MV = bfdtd.ModeVolumeBox()

            MV.setFullExtensionOff()

            MV.setPlaneOrientationZ()
            MV.setExtension(*b.getExtension())

            MV.epsilon_repetition = 456

            MV.name = 'myname'
            MV.layer = 'mylayer'
            MV.group = 'mygroup'

            MV.first = 11
            MV.repetition = 1337
            MV.starting_sample = 789

            MV.frequency_vector = [22, 33]

            MV.interpolate = 45
            MV.mod_only = 46
            MV.mod_all = 47
            MV.real_dft = 123

            MV.useForMeshing = False

            MV.E = [1, 2, 3]
            MV.H = [4, 5, 6]
            MV.J = [7, 8, 9]

            sim.appendSnapshot(MV)

            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_MV.inp'))

        return
Example #7
0
    def test_SnapshotBoxXYZ(self):
        with tempfile.TemporaryDirectory(
                prefix='testSnapshotBoxVolume-') as outdir:
            #outdir = '/tmp/testSnapshotBoxVolume'

            sim = bfdtd.BFDTDobject()
            sim.setSizeAndResolution([10, 11, 12], [41, 42, 43])

            b = bfdtd.Block()
            b.setSize([1, 2, 3])
            b.setLocation([4, 5, 6])
            sim.appendGeometryObject(b)

            tsnap = bfdtd.TimeSnapshot()
            tsnap.setExtension(*b.getExtension())
            esnap = bfdtd.EpsilonSnapshot()
            esnap.setExtension(*b.getExtension())
            mfp = bfdtd.ModeFilteredProbe()
            mfp.setExtension(*b.getExtension())
            fsnap = bfdtd.FrequencySnapshot()
            fsnap.setExtension(*b.getExtension())

            MV = bfdtd.SnapshotBoxXYZ()
            MV.setIntersectionPoint([3.75, 5.5, 7])

            sim.appendSnapshot(MV)

            sim.writeGeoFile(os.path.join(outdir, 'testSnapshotBoxVolume.geo'))

            MV.setBaseSnapshot(tsnap)
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_tsnap_xyz.inp'))

            MV.setBaseSnapshot(esnap)
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_esnap_xyz.inp'))

            MV.setBaseSnapshot(mfp)
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_mfp_xyz.inp'))

            MV.setBaseSnapshot(fsnap)
            fsnap.setFullExtensionOff()
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_fsnap_xyz.inp'))

        return
Example #8
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile')
    parser.add_argument('-v',
                        '--verbose',
                        action="count",
                        dest="verbosity",
                        default=0,
                        help='verbosity level')
    args = parser.parse_args()

    print('=== {} ==='.format(args.infile))
    sim = bfdtd.BFDTDobject()
    sim.setVerbosity(args.verbosity)
    sim.readBristolFDTD(args.infile)
    m = sim.getMesh()
    print(m.getMinDeltas())

    return 0
def test2():
    sim = bfdtd.BFDTDobject()
    S = 1
    N = 30
    sim.setSizeAndResolution([S, S, S], [N, N, N])

    c = sim.getCentro()

    E = sim.appendExcitation(bfdtd.Excitation())
    E.setEx()
    E.setLocation(c)
    E.setSize([0, 0, 0])

    dt_max = sim.getTimeStepMax()
    T_max = 10 * dt_max
    f_min = 1 / T_max
    Q = 100
    #df = f0_min/Q
    f_max = ((Q + 1 / 2) / (Q - 1 / 2)) * f_min

    print(E.setFrequencyRange(f_min, f_max))

    E.setTimeOffset(1 * E.getTimeConstant())
    E.setAmplitude(1)

    p = sim.appendProbe(bfdtd.Probe())
    p.setLocation(c)
    p.setStep(1)

    sim.setTimeStep((1 / E.getFrequency()) / 100)
    #sim.setSimulationTime(E.getTimeOffset()+10*E.getTimeConstant())

    sim.setIterations(ceil(E.getTimeOffset() / sim.getTimeStep()) + 99)

    Tbox = sim.appendSnapshot(bfdtd.TimeSnapshotBoxFull())
    Tbox.setFirst(sim.getIterations() - 99)
    Tbox.setRepetition(1)

    print(E.getTimeOffset() / sim.getTimeStep())
    print(sim.getIterations())

    sim.runSimulation('/tmp/dipole-test2', verbosity=2)
    return
Example #10
0
def test3():
    sim = bfdtd.BFDTDobject()
    sim.setVerbosity(2)

    RCD = bfdtd.RCD.RCD_HexagonalLattice()
    sim.appendGeometryObject(RCD)

    RCD.setLocation([0, 0, 0])

    RCD.setUnitCellType(1)
    RCD.createGeoList()
    sim.writeGeoFile(tempfile.gettempdir() + os.sep +
                     'RCD_type{}.geo'.format(RCD.getUnitCellType()))

    RCD.setUnitCellType(2)
    RCD.createGeoList()
    sim.writeGeoFile(tempfile.gettempdir() + os.sep +
                     'RCD_type{}.geo'.format(RCD.getUnitCellType()))

    return
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('ctlfile', default='test.geo.ctl', nargs='?')
    parser.add_argument('geofile', default='test.geo', nargs='?')
    parser.add_argument('-v',
                        '--verbose',
                        action="count",
                        dest="verbosity",
                        default=0,
                        help='verbosity level')
    args = parser.parse_args()

    if args.verbosity > 0:
        print(args)

    sim = bfdtd.BFDTDobject()
    sim.setSizeAndResolution([1, 2, 4], [10, 10, 10], True)

    c = sim.appendGeometryObject(bfdtd.Cylinder())
    c.setLocation([1 / 2, 2 / 2, 1])
    c.setOuterRadius(0.25)
    c.setAxis([1, 1, 1])
    c.setHeight(1)
    c.setRelativePermittivity(2)

    s = sim.appendGeometryObject(bfdtd.Sphere())
    s.setLocation([1 / 2, 2 / 2, 2])
    s.setOuterRadius(0.25)
    s.setRelativePermittivity(3)

    b = sim.appendGeometryObject(bfdtd.Block())
    b.setLocation([1 / 2, 2 / 2, 3])
    b.setSize([1 / 8, 1 / 4, 1 / 2])
    b.setRelativePermittivity(4)

    sim.writeCtlFile(args.ctlfile)
    sim.writeGeoFile(args.geofile)

    return 0
Example #12
0
def test4():
    sim = bfdtd.BFDTDobject()
    sim.setVerbosity(2)
    obj = bfdtd.RCD.FRD_HexagonalLattice()
    obj.setUnitCellType(2)
    sim.appendGeometryObject(obj)

    obj.RCD_on = False
    obj.refractive_index_RCD = 1
    obj.FRD_on = True
    obj.refractive_index_FRD = 10

    obj.setOuterRadius(0.01)

    obj.use_spheres = True
    obj.use_cylinders = True
    obj.add_bottom_sphere = True
    obj.relative_sphere_radius = 2
    obj.relative_sphere_index = 2

    sim.writeGeoFile(tempfile.gettempdir() + os.sep + 'tmp.geo')
    return
Example #13
0
def test1():
    sim = bfdtd.BFDTDobject()
    RCD = bfdtd.RCD.RCD_HexagonalLattice()
    sim.appendGeometryObject(RCD)

    N = 1

    RCD.setLocation(RCD.__offset1__)
    RCD.createRectangularArray(N, N, N)
    RCD.setUnitCellType(1)
    RCD.createGeoList()
    sim.writeGeoFile(
        tempfile.gettempdir() + os.sep +
        'RCD_rect_{}x{}x{}_type{}.geo'.format(N, N, N, RCD.getUnitCellType()))

    RCD.setLocation(RCD.__offset2__)
    RCD.createRectangularArray(N, N, N)
    RCD.setUnitCellType(2)
    RCD.createGeoList()
    sim.writeGeoFile(
        tempfile.gettempdir() + os.sep +
        'RCD_rect_{}x{}x{}_type{}.geo'.format(N, N, N, RCD.getUnitCellType()))

    RCD.setLocation(RCD.__offset1__)
    RCD.createRectangularArraySymmetrical(N, N, N)
    RCD.setUnitCellType(1)
    RCD.createGeoList()
    sim.writeGeoFile(
        tempfile.gettempdir() + os.sep +
        'RCD_sym_{}x{}x{}_type{}.geo'.format(N, N, N, RCD.getUnitCellType()))

    RCD.setLocation(RCD.__offset2__)
    RCD.createRectangularArraySymmetrical(N, N, N)
    RCD.setUnitCellType(2)
    RCD.createGeoList()
    sim.writeGeoFile(
        tempfile.gettempdir() + os.sep +
        'RCD_sym_{}x{}x{}_type{}.geo'.format(N, N, N, RCD.getUnitCellType()))
Example #14
0
    def test_EnergySnapshot(self):
        with tempfile.TemporaryDirectory(
                prefix='testSnapshotBoxVolume-') as outdir:
            #outdir = '/tmp/testSnapshotBoxVolume'

            sim = bfdtd.BFDTDobject()
            sim.setSizeAndResolution([10, 11, 12], [41, 42, 43])

            E = bfdtd.EnergySnapshot()
            E.setPlaneOrientationY()
            E.setExtensionX(5, 6)
            E.setExtensionY(4, 4)
            E.setExtensionZ(7, 9)
            E.setFrequencies([11, 22, 33])

            E.setFullExtensionOff()

            sim.appendSnapshot(E)

            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_energy.inp'))

        return
Example #15
0
    def test_All(self):
        with tempfile.TemporaryDirectory(
                prefix='snapshot_class_test-') as outdir:
            sim = bfdtd.BFDTDobject()

            #sim.appendSnapshot(Snapshot)
            sim.appendSnapshot(bfdtd.FrequencySnapshot())
            sim.appendSnapshot(bfdtd.TimeSnapshot())
            sim.appendSnapshot(bfdtd.EpsilonSnapshot())
            sim.appendSnapshot(bfdtd.ModeFilteredProbe())

            #sim.appendSnapshot(SnapshotBox())
            sim.appendSnapshot(bfdtd.SnapshotBoxXYZ())
            sim.appendSnapshot(bfdtd.SnapshotBoxSurface())
            sim.appendSnapshot(bfdtd.SnapshotBoxVolume())

            sim.appendSnapshot(bfdtd.EnergySnapshot())
            sim.appendSnapshot(bfdtd.EpsilonBox())
            sim.appendSnapshot(bfdtd.EpsilonBoxFull())
            sim.appendSnapshot(bfdtd.ModeVolumeBox())

            #sim.writeAll('/tmp/snapshot_class_test')
            sim.writeAll(outdir)
        return
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('DSTDIR', default=tempfile.gettempdir(), nargs='?')
    args = parser.parse_args()
    print(args.DSTDIR)

    pillar = bfdtd.BFDTDobject()

    # constants
    n_air = 1
    n_diamond = 2.4
    Lambda_mum = 0.637
    delta = Lambda_mum / (10 * n_diamond)
    freq = constants.get_c0() / Lambda_mum
    k = 1
    radius = k * Lambda_mum / (4 * n_diamond)
    Nbottom = 30
    Ntop = 30
    h_air = Lambda_mum / (4 * n_air)
    h_diamond = Lambda_mum / (4 * n_diamond)
    h_cavity = Lambda_mum / (n_diamond)
    height = Nbottom * (h_air + h_diamond) + h_cavity + Ntop * (h_air +
                                                                h_diamond)
    buffer = 0.25
    FullBox_upper = [
        height + 2 * buffer, 2 * (radius + buffer), 2 * (radius + buffer)
    ]
    P_centre = [
        buffer + Nbottom * (h_air + h_diamond) + 0.5 * h_cavity,
        0.5 * FullBox_upper[1], 0.5 * FullBox_upper[2]
    ]

    # define flag
    pillar.flag.iterations = 100000

    # define boundary conditions
    pillar.boundaries.Xpos_bc = 2
    pillar.boundaries.Ypos_bc = 1  #2
    pillar.boundaries.Zpos_bc = 2

    # define box
    pillar.box.lower = [0, 0, 0]
    if pillar.boundaries.Ypos_bc == 2:
        pillar.box.upper = FullBox_upper
    else:
        pillar.box.upper = [
            FullBox_upper[0], 0.5 * FullBox_upper[1], FullBox_upper[2]
        ]

    # define geometry
    block = bfdtd.Block()
    block.setLowerAbsolute([
        P_centre[0] - 0.5 * height, P_centre[1] - radius, P_centre[2] - radius
    ])
    block.setUpperAbsolute([
        P_centre[0] + 0.5 * height, P_centre[1] + radius, P_centre[2] + radius
    ])
    block.setRefractiveIndex(n_diamond)
    pillar.setGeometryObjects([block])

    # define excitation
    excitation = bfdtd.Excitation()
    P1 = [P_centre[0], P_centre[1] - 1 * delta, P_centre[2]]
    P2 = P_centre
    excitation.setExtension(P1, P2)
    excitation.setFrequency(freq)
    excitation.setEy()
    pillar.appendExcitation(excitation)

    # define probe
    if pillar.boundaries.Ypos_bc == 2:
        probe = bfdtd.Probe(
            position=[buffer + height + delta, P_centre[1], P_centre[2]])
    else:
        probe = bfdtd.Probe(position=[
            buffer + height + delta, P_centre[1] - delta, P_centre[2]
        ])
    pillar.probe_list = [probe]

    # define frequency snapshots
    first = min(65400, pillar.flag.iterations)
    frequency_vector = [freq]
    F = pillar.addFrequencySnapshot('x', P_centre[0])
    F.first = first
    F.frequency_vector = frequency_vector
    if pillar.boundaries.Ypos_bc == 2:
        F = pillar.addFrequencySnapshot('y', P_centre[1])
        F.first = first
        F.frequency_vector = frequency_vector
    else:
        F = pillar.addFrequencySnapshot('y', P_centre[1] - delta)
        F.first = first
        F.frequency_vector = frequency_vector
    F = pillar.addFrequencySnapshot('z', P_centre[2])
    F.first = first
    F.frequency_vector = frequency_vector
    F = pillar.addBoxFrequencySnapshots()
    F.first = first
    F.frequency_vector = frequency_vector

    # define mesh
    thicknessVector_X = [
        block.getLowerAbsolute()[0] - pillar.box.lower[0],
        P_centre[0] - block.getLowerAbsolute()[0],
        block.getUpperAbsolute()[0] - P_centre[0], delta,
        pillar.box.upper[0] - (block.getUpperAbsolute()[0] + delta)
    ]
    if pillar.boundaries.Ypos_bc == 2:
        thicknessVector_Y = [
            block.getLowerAbsolute()[1] - pillar.box.lower[1],
            (P_centre[1] - delta) - block.getLowerAbsolute()[1], delta, delta,
            block.getUpperAbsolute()[1] - (P_centre[1] + delta),
            pillar.box.upper[1] - block.getUpperAbsolute()[1]
        ]
    else:
        thicknessVector_Y = [
            block.getLowerAbsolute()[1] - pillar.box.lower[1],
            (P_centre[1] - delta) - block.getLowerAbsolute()[1], delta
        ]
    thicknessVector_Z = LimitsToThickness([
        pillar.box.lower[2],
        block.getLowerAbsolute()[2], P_centre[2],
        block.getUpperAbsolute()[2], pillar.box.upper[2]
    ])
    max_delta_Vector_X = [delta] * len(thicknessVector_X)
    max_delta_Vector_Y = [delta] * len(thicknessVector_Y)
    max_delta_Vector_Z = [delta] * len(thicknessVector_Z)
    delta_X_vector, local_delta_X_vector = subGridMultiLayer(
        max_delta_Vector_X, thicknessVector_X)
    delta_Y_vector, local_delta_Y_vector = subGridMultiLayer(
        max_delta_Vector_Y, thicknessVector_Y)
    delta_Z_vector, local_delta_Z_vector = subGridMultiLayer(
        max_delta_Vector_Z, thicknessVector_Z)
    pillar.getMesh().setXmeshDelta(delta_X_vector)
    pillar.getMesh().setYmeshDelta(delta_Y_vector)
    pillar.getMesh().setZmeshDelta(delta_Z_vector)

    # write
    #DSTDIR = os.getenv('DATADIR')
    #DSTDIR = os.getenv('TESTDIR')
    #DSTDIR = os.getenv('DATADIR')+os.sep+'run_20110602'
    #DSTDIR = tempfile.mkdtemp()
    BASENAME = 'simple_pillar'
    pillar.writeAll(args.DSTDIR + os.sep + BASENAME, BASENAME)
    GEOshellscript_advanced(args.DSTDIR + os.sep + BASENAME + os.sep +
                            BASENAME + '.sh',
                            BASENAME,
                            getProbeColumnFromExcitation(excitation.E),
                            '$HOME/bin/fdtd',
                            '$JOBDIR',
                            WALLTIME=360)
    print(pillar.getNcells())
    print('DSTDIR = {}'.format(args.DSTDIR))
def rectangularYagiWithTaper(DSTDIR, BASENAME, nHigh, nLow, Lambda_mum,
                             layer_size, excitation_array, PML,
                             pillar_diametro, defect_type):
    '''
  layer_size : list of layer sizes, including the cavity
  excitation_array : list of zeros and ones, the same length as layer_size. A source will be placed into the layer with the corresponding index if excitation_array[idx]==1
  PML : true/false, use Perfect Matching Layers or not?
  '''
    #denominator_factor = numpy.array(denominator_factor)
    #n = numpy.array(n)

    hole_length = 2 * pillar_diametro

    pillar = bfdtd.BFDTDobject()

    # calculate layer height
    #layer_size = Lambda_mum/(denominator_factor*n)
    #print(layer_size)

    # pillar parameters
    pillar_height = sum(layer_size)
    #print('pillar_height = '+str(pillar_height))
    #pillar_radius = 0.5*0.340
    pillar_radius = 0.5 * pillar_diametro
    bufferSpace = 1
    FullBox_upper = [
        pillar_height + 2 * bufferSpace, 2 * (pillar_radius + bufferSpace),
        2 * (pillar_radius + bufferSpace)
    ]
    #FullBox_upper = [ 10, 10, 4 ]
    #grating_depth = 3*0.100
    grating_depth = 0.100
    freq = constants.get_c0() / Lambda_mum
    delta = Lambda_mum / (10 * nHigh)

    # define flag
    pillar.flag.iterations = 1048000
    #pillar.flag.iterations = 100000
    #pillar.flag.iterations = 10

    # define boundary conditions
    #pillar.boundaries.Xpos_bc = 2
    #pillar.boundaries.Ypos_bc = 1 #1
    #pillar.boundaries.Zpos_bc = 2

    # default excitation location
    P_excitation = pillar.getCentro()

    if PML:
        # PML
        pillar.boundaries.Xpos_bc = 10
        pillar.boundaries.Ypos_bc = 1
        pillar.boundaries.Zpos_bc = 10
        pillar.boundaries.Xneg_bc = 10
        pillar.boundaries.Yneg_bc = 10
        pillar.boundaries.Zneg_bc = 10

        pillar.boundaries.Xpos_param = [8, 2, 1e-3]
        pillar.boundaries.Ypos_param = [1, 1, 0]
        pillar.boundaries.Zpos_param = [8, 2, 1e-3]
        pillar.boundaries.Xneg_param = [8, 2, 1e-3]
        pillar.boundaries.Yneg_param = [8, 2, 1e-3]
        pillar.boundaries.Zneg_param = [8, 2, 1e-3]
    else:
        # no PML
        pillar.boundaries.Xpos_bc = 2
        pillar.boundaries.Ypos_bc = 2
        pillar.boundaries.Zpos_bc = 2
        pillar.boundaries.Xneg_bc = 2
        pillar.boundaries.Yneg_bc = 2
        pillar.boundaries.Zneg_bc = 2

        pillar.boundaries.Xpos_param = [1, 1, 0]
        pillar.boundaries.Ypos_param = [1, 1, 0]
        pillar.boundaries.Zpos_param = [1, 1, 0]
        pillar.boundaries.Xneg_param = [1, 1, 0]
        pillar.boundaries.Yneg_param = [1, 1, 0]
        pillar.boundaries.Zneg_param = [1, 1, 0]

    # define box
    pillar.box.lower = [0, 0, 0]
    if pillar.boundaries.Ypos_bc == 2:
        pillar.box.upper = FullBox_upper
        P_centre = pillar.box.getCentro()
    else:
        pillar.box.upper = [
            FullBox_upper[0], 0.5 * FullBox_upper[1], FullBox_upper[2]
        ]
        P_centre = pillar.box.getCentro()
        P_centre[1] = 0.5 * FullBox_upper[1]

    # define main pillar
    main_pillar = bfdtd.Block()
    main_pillar.setLowerAbsolute([
        P_centre[0] - 0.5 * pillar_height, P_centre[1] - pillar_radius,
        P_centre[2] - pillar_radius
    ])
    main_pillar.setUpperAbsolute([
        P_centre[0] + 0.5 * pillar_height, P_centre[1] + pillar_radius,
        P_centre[2] + pillar_radius
    ])
    #main_pillar.setLowerAbsolute([  0, P_centre[1]-pillar_radius, P_centre[2]-pillar_radius ])
    #main_pillar.setUpperAbsolute([ 10, P_centre[1]+pillar_radius, P_centre[2]+pillar_radius ])
    main_pillar.setRefractiveIndex(nHigh)
    main_pillar.setName('main_pillar')
    if defect_type != 'cylinder_layers':
        pillar.setGeometryObjects([main_pillar])

    # define defects
    N = len(layer_size)
    #print('N = '+str(N))
    lower_x = main_pillar.getLowerAbsolute()[0]

    if defect_type == 'cylinder_holes':
        # .. todo:: fix mesh (i.e. replace MeshBox with latest meshing system...)
        #mesh_box = bfdtd.MeshBox()
        #mesh_box.lower = [ pillar.box.lower[0], P_centre[1]-pillar_radius, P_centre[2]-0.5*max(layer_size) ]
        #mesh_box.upper = [ pillar.box.upper[0], P_centre[1]+pillar_radius, P_centre[2]+0.5*max(layer_size) ]
        #mesh_box.permittivity3D = [1e-3, 1e-3, pow(2*nHigh,2)]
        #pillar.mesh_object_list.append(mesh_box)
        pass

    for idx in range(N):
        if defect_type == 'cylinder_holes':
            if idx % 2 == 1:
                #print layer_size[idx]
                defect = bfdtd.Cylinder()
                defect.setName('Cylinder_{}'.format(idx))
                defect.setDiametre(layer_size[idx])
                defect.setLocation([
                    lower_x + 0.5 * layer_size[idx], P_centre[1], P_centre[2]
                ])
                defect.setHeight(hole_length)
                defect.setRefractiveIndex(nLow)
                pillar.appendGeometryObject(defect)
            #print 'idx = ',idx, 'excitation_array = ', excitation_array
            if excitation_array[idx] == 1:
                L = numpy.array([
                    lower_x, P_centre[1] - pillar_radius - grating_depth,
                    P_centre[2] - pillar_radius - grating_depth
                ])
                U = numpy.array([
                    lower_x + layer_size[idx],
                    P_centre[1] + pillar_radius + grating_depth,
                    P_centre[2] + pillar_radius + grating_depth
                ])
                P_excitation = 0.5 * (L + U)
            lower_x = lower_x + layer_size[idx]
        elif defect_type == 'block_holes':
            if idx % 2 == 1:
                #print layer_size[idx]
                defect = bfdtd.Block()
                defect.setName('Block_{}'.format(idx))
                defect.setLowerAbsolute([
                    lower_x, P_centre[1] - 0.5 * hole_length,
                    P_centre[2] - pillar_radius + grating_depth
                ])
                defect.setUpperAbsolute([
                    lower_x + layer_size[idx], P_centre[1] + 0.5 * hole_length,
                    P_centre[2] + pillar_radius - grating_depth
                ])
                defect.setRefractiveIndex(nLow)
                pillar.geometry_object_list.append(defect)
            #print 'idx = ',idx, 'excitation_array = ', excitation_array
            if excitation_array[idx] == 1:
                L = numpy.array([
                    lower_x, P_centre[1] - pillar_radius - grating_depth,
                    P_centre[2] - pillar_radius - grating_depth
                ])
                U = numpy.array([
                    lower_x + layer_size[idx],
                    P_centre[1] + pillar_radius + grating_depth,
                    P_centre[2] + pillar_radius + grating_depth
                ])
                P_excitation = 0.5 * (L + U)
            lower_x = lower_x + layer_size[idx]
        elif defect_type == 'cylinder_layers':
            # TODO: finish implementing this. Also see pillar_1D.py and similar scripts to reduce code duplication.
            defect = bfdtd.Cylinder()
            defect.setName('Cylinder_{}'.format(idx))
            lower = numpy.array([
                lower_x, P_centre[1] - pillar_radius,
                P_centre[2] - pillar_radius + grating_depth
            ])
            upper = numpy.array([
                lower_x + layer_size[idx], P_centre[1] + pillar_radius,
                P_centre[2] + pillar_radius - grating_depth
            ])
            defect.setLocation(0.5 * (lower + upper))
            defect.setOuterRadius(pillar_radius)
            if idx % 2 == 0:
                defect.setRefractiveIndex(nHigh)
            else:
                defect.setRefractiveIndex(nLow)
            defect.setHeight(layer_size[idx])
            defect.setAxis([1, 0, 0])
            pillar.geometry_object_list.append(defect)
            #print 'idx = ',idx, 'excitation_array = ', excitation_array
            if excitation_array[idx] == 1:
                L = numpy.array([
                    lower_x, P_centre[1] - pillar_radius - grating_depth,
                    P_centre[2] - pillar_radius - grating_depth
                ])
                U = numpy.array([
                    lower_x + layer_size[idx],
                    P_centre[1] + pillar_radius + grating_depth,
                    P_centre[2] + pillar_radius + grating_depth
                ])
                P_excitation = 0.5 * (L + U)
            lower_x = lower_x + layer_size[idx]
        elif defect_type == 'grating':
            if idx % 2 == 0:
                #print layer_size[idx]
                defect = bfdtd.Block()
                defect.setName('Block_{}'.format(idx))
                defect.setLowerAbsolute([
                    lower_x, P_centre[1] - pillar_radius - grating_depth,
                    P_centre[2] - pillar_radius - grating_depth
                ])
                defect.setUpperAbsolute([
                    lower_x + layer_size[idx],
                    P_centre[1] + pillar_radius + grating_depth,
                    P_centre[2] + pillar_radius + grating_depth
                ])
                defect.setRefractiveIndex(nHigh)
                pillar.geometry_object_list.append(defect)
            #print 'idx = ',idx, 'excitation_array = ', excitation_array
            if excitation_array[idx] == 1:
                L = numpy.array([
                    lower_x, P_centre[1] - pillar_radius - grating_depth,
                    P_centre[2] - pillar_radius - grating_depth
                ])
                U = numpy.array([
                    lower_x + layer_size[idx],
                    P_centre[1] + pillar_radius + grating_depth,
                    P_centre[2] + pillar_radius + grating_depth
                ])
                P_excitation = 0.5 * (L + U)
            lower_x = lower_x + layer_size[idx]
            #if lower_x > 10:
            #break
        else:
            print('unknown defect type: ' + defect_type)
            sys.exit(1)

    #print(pillar.getGeometryObjects())

    ################
    # define excitation
    ################
    if pillar.boundaries.Ypos_bc == 2:
        Ysym = False
    else:
        Ysym = True

    template_radius = 0
    QuadrupleExcitation(Ysym, pillar, P_excitation, 'x', delta,
                        template_radius, freq, 0)
    ################

    ################
    # define frequency snapshots and probes
    ################
    first = min(65400, pillar.flag.iterations)
    frequency_vector = [freq]

    # define probe
    P = [main_pillar.getUpperAbsolute()[0] + delta, P_centre[1], P_centre[2]]
    if Ysym:
        P[1] = P[1] - delta
    probe = bfdtd.Probe(position=P)
    probe.name = 'resonance_probe'
    pillar.appendProbe(probe)

    P = [P_excitation[0] + delta, P_centre[1], P_centre[2]]
    if Ysym:
        P[1] = P[1] - delta
    probe = bfdtd.Probe(position=P)
    probe.name = 'resonance_probe'
    pillar.appendProbe(probe)

    # define snapshots around probe
    #F = pillar.addFrequencySnapshot(1,P[0]); F.first = first; F.frequency_vector = frequency_vector; F.name='x_'+str(0)
    #F = pillar.addFrequencySnapshot(2,P[1]); F.first = first; F.frequency_vector = frequency_vector; F.name='y_'+str(0)
    #F = pillar.addFrequencySnapshot(3,P[2]); F.first = first; F.frequency_vector = frequency_vector; F.name='z_'+str(0)

    # define central snapshots
    F = pillar.addFrequencySnapshot('x', P_excitation[0])
    F.first = first
    F.frequency_vector = frequency_vector
    if pillar.boundaries.Ypos_bc == 2:
        F = pillar.addFrequencySnapshot('y', P_excitation[1])
        F.first = first
        F.frequency_vector = frequency_vector
    else:
        F = pillar.addFrequencySnapshot('y', P_excitation[1] - delta)
        F.first = first
        F.frequency_vector = frequency_vector
    F = pillar.addFrequencySnapshot('z', P_excitation[2])
    F.first = first
    F.frequency_vector = frequency_vector

    F = pillar.addTimeSnapshot('x', P_excitation[0])
    F.first = first
    if pillar.boundaries.Ypos_bc == 2:
        F = pillar.addTimeSnapshot('y', P_excitation[1])
        F.first = first
    else:
        F = pillar.addTimeSnapshot('y', P_excitation[1] - delta)
        F.first = first
    F = pillar.addTimeSnapshot('z', P_excitation[2])
    F.first = first

    # box frequency snapshots
    #F = pillar.addBoxFrequencySnapshots(); F.first = first; F.frequency_vector = frequency_vector

    # efficiency snapshots around structure
    ## TODO: write function to do this
    #L = [ main_pillar.lower[0], main_pillar.lower[1]-grating_depth, main_pillar.lower[2]-grating_depth ] - delta*numpy.array([1,1,1])
    #U = [ main_pillar.upper[0], main_pillar.upper[1]+grating_depth, main_pillar.upper[2]+grating_depth ] + delta*numpy.array([1,1,1])
    #if pillar.boundaries.Ypos_bc == 1:
    #U[1] = min(U[1],pillar.box.upper[1])
    #F = Frequency_snapshot(name='Efficiency box frequency snapshot', P1=L, P2=U); F.first = first; F.frequency_vector = frequency_vector;
    #pillar.snapshot_list.append(F)

    lower_wall = bfdtd.Block()
    lower_wall.setName('lower_wall')
    lower_wall.setLowerAbsolute([0, 0, 0])
    lower_wall.setUpperAbsolute(
        [0.5, pillar.box.upper[1], pillar.box.upper[2]])
    lower_wall.setRefractiveIndex(nHigh)
    lower_wall.setRelativeConductivity(0)
    #pillar.appendGeometryObject(lower_wall)

    upper_wall = bfdtd.Block()
    upper_wall.setName('upper_wall')
    upper_wall.setLowerAbsolute([pillar.box.upper[0] - 0.5, 0, 0])
    upper_wall.setUpperAbsolute(
        [pillar.box.upper[0], pillar.box.upper[1], pillar.box.upper[2]])
    upper_wall.setRefractiveIndex(nHigh)
    upper_wall.setRelativeConductivity(0)
    #pillar.appendGeometryObject(upper_wall)

    # define mesh
    a = 20
    pillar.autoMeshGeometry(0.637 / a)
    while (pillar.getNcells() > 8000000 and a > 1):
        a = a - 1
        pillar.autoMeshGeometry(0.637 / a)

    #pillar.autoMeshGeometry(1000)

    # write pillar
    #pillar.writeAll(DSTDIR+os.sep+BASENAME, BASENAME)
    ##GEOshellscript(DSTDIR+os.sep+BASENAME+os.sep+BASENAME+'.sh', BASENAME,'$HOME/bin/fdtd', '$JOBDIR', WALLTIME = 360)
    #GEOshellscript_advanced(DSTDIR+os.sep+BASENAME+os.sep+BASENAME+'.sh', BASENAME, getProbeColumnFromExcitation(pillar.excitation_list[0].E),'$HOME/bin/fdtd', '$JOBDIR', WALLTIME = 360)

    pillar.writeAll(DSTDIR, BASENAME)
    GEOshellscript(DSTDIR + os.sep + BASENAME + '.sh',
                   BASENAME,
                   '$HOME/bin/fdtd',
                   '$JOBDIR',
                   WALLTIME=360)
    #GEOshellscript_advanced(DSTDIR+os.sep+BASENAME+os.sep+BASENAME+'.sh', BASENAME, getProbeColumnFromExcitation(pillar.excitation_list[0].E),'$HOME/bin/fdtd', '$JOBDIR', WALLTIME = 360)

    print('pillar.getNcells() = ' + str(pillar.getNcells()))
    if pillar.getNcells() > 8000000:
        sys.exit(-1)
Example #18
0
    def test_SnapshotBoxVolume(self):
        with tempfile.TemporaryDirectory(
                prefix='testSnapshotBoxVolume-') as outdir:

            #outdir = '/tmp/testSnapshotBoxVolume'

            sim = bfdtd.BFDTDobject()
            sim.setSizeAndResolution([10, 11, 12], [41, 42, 43])

            b = bfdtd.Block()
            b.setSize([1, 2, 3])
            b.setLocation([4, 5, 6])
            sim.appendGeometryObject(b)

            tsnap = bfdtd.TimeSnapshot()
            tsnap.setExtension(*b.getExtension())
            esnap = bfdtd.EpsilonSnapshot()
            esnap.setExtension(*b.getExtension())
            mfp = bfdtd.ModeFilteredProbe()
            mfp.setExtension(*b.getExtension())
            fsnap = bfdtd.FrequencySnapshot()
            fsnap.setExtension(*b.getExtension())

            MV = bfdtd.SnapshotBoxVolume()
            sim.appendSnapshot(MV)

            #code.interact(local=locals())

            sim.writeGeoFile(os.path.join(outdir, 'testSnapshotBoxVolume.geo'))

            tsnap.setPlaneLetter('x')
            MV.setBaseSnapshot(tsnap)
            sim.setFileBaseName('tsnap_x')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_tsnap_x.inp'))

            tsnap.setPlaneLetter('y')
            MV.setBaseSnapshot(tsnap)
            sim.setFileBaseName('tsnap_y')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_tsnap_y.inp'))

            tsnap.setPlaneLetter('z')
            MV.setBaseSnapshot(tsnap)
            sim.setFileBaseName('tsnap_z')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_tsnap_z.inp'))

            esnap.setPlaneLetter('x')
            MV.setBaseSnapshot(esnap)
            sim.setFileBaseName('esnap_x')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_esnap_x.inp'))

            esnap.setPlaneLetter('y')
            MV.setBaseSnapshot(esnap)
            sim.setFileBaseName('esnap_y')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_esnap_y.inp'))

            esnap.setPlaneLetter('z')
            MV.setBaseSnapshot(esnap)
            sim.setFileBaseName('esnap_z')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_esnap_z.inp'))

            mfp.setPlaneLetter('x')
            MV.setBaseSnapshot(mfp)
            sim.setFileBaseName('mfp_x')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_mfp_x.inp'))

            mfp.setPlaneLetter('y')
            MV.setBaseSnapshot(mfp)
            sim.setFileBaseName('mfp_y')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_mfp_y.inp'))

            mfp.setPlaneLetter('z')
            MV.setBaseSnapshot(mfp)
            sim.setFileBaseName('mfp_z')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_mfp_z.inp'))

            fsnap.setPlaneLetter('x')
            MV.setBaseSnapshot(fsnap)
            sim.setFileBaseName('fsnap_x')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_fsnap_x.inp'))

            fsnap.setPlaneLetter('y')
            MV.setBaseSnapshot(fsnap)
            sim.setFileBaseName('fsnap_y')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_fsnap_y.inp'))

            fsnap.setPlaneLetter('z')
            MV.setBaseSnapshot(fsnap)
            sim.setFileBaseName('fsnap_z')
            sim.writeInpFile(
                os.path.join(outdir, 'testSnapshotBoxVolume_fsnap_z.inp'))

        return
Example #19
0
def prismPillar(DSTDIR, BASENAME, pos, exc):
    sim = bfdtd.BFDTDobject()

    # constants
    n_air = 1
    n_diamond = 2.4
    Lambda_mum = 0.637
    delta = Lambda_mum / (10 * n_diamond)
    freq = constants.get_c0() / Lambda_mum
    k = 4
    radius = k * Lambda_mum / (4 * n_diamond)
    Nbottom = 3
    Ntop = 3
    h_air = Lambda_mum / (4 * n_air)
    h_diamond = Lambda_mum / (4 * n_diamond)
    h_cavity = Lambda_mum / (n_diamond)
    height = Nbottom * (h_air + h_diamond) + h_cavity + Ntop * (h_air +
                                                                h_diamond)
    print('height = ', height)
    buffer = 0.05
    FullBox_upper = [
        height + 2 * buffer, 2 * (radius + buffer), 2 * (radius + buffer)
    ]

    P_centre = [
        buffer + Nbottom * (h_air + h_diamond) + 0.5 * h_cavity,
        0.5 * FullBox_upper[1], 0.5 * FullBox_upper[2]
    ]

    # define flag
    sim.flag.iterations = 100000
    #sim.flag.iterations = 1

    # define boundary conditions
    sim.boundaries.Xpos_bc = 2
    sim.boundaries.Ypos_bc = 2  #1
    sim.boundaries.Zpos_bc = 2

    # define box
    sim.box.lower = [0, 0, 0]
    if sim.boundaries.Ypos_bc == 2:
        sim.box.upper = FullBox_upper
    else:
        sim.box.upper = [
            FullBox_upper[0], 0.5 * FullBox_upper[1], FullBox_upper[2]
        ]

    #P_centre = sim.box.getCenter()

    ## define geometry

    #prism = TriangularPrism()
    prism = SpecialTriangularPrism()
    prism.lower = [0, 0, 0]
    prism.upper = [
        height, 2 * 3. / 2. * radius * 1.0 / numpy.sqrt(3), 3. / 2. * radius
    ]
    #prism.lower = [1,1,1]
    #prism.upper = [1,10,1]
    #prism.lower = [1,2,3]
    #prism.upper = [3,7,13]
    prism.orientation = [2, 0, 1]
    #prism.orientation = [2,1,0]
    prism.permittivity = pow(n_diamond, 2)
    prism.conductivity = 0
    prism.NvoxelsX = 30
    prism.NvoxelsY = 30
    prism.NvoxelsZ = 30

    prismPos = numpy.copy(sim.box.getCentro())
    if sim.boundaries.Ypos_bc == 1:
        prismPos[1] = sim.box.upper[1]
    prism.setGeoCentre(prismPos)
    #sim.probe_list.append(Probe(position = prism.getGeoCentre()))
    #prism.setGeoCentre([0,0,0])
    #sim.probe_list.append(Probe(position = prism.getGeoCentre()))

    sim.geometry_object_list.append(prism)

    buffersize = 10 * delta
    n_meshblock = 2.4

    # X buffers
    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setLowerAbsolute(
        [prism.lower[0] - buffersize, prism.lower[1], prism.lower[2]])
    block.setUpperAbsolute([prism.lower[0], prism.upper[1], prism.upper[2]])
    sim.mesh_object_list.append(block)

    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setLowerAbsolute([prism.upper[0], prism.lower[1], prism.lower[2]])
    block.setUpperAbsolute(
        [prism.upper[0] + buffersize, prism.upper[1], prism.upper[2]])
    sim.mesh_object_list.append(block)

    # Y buffers
    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setLowerAbsolute(
        [prism.lower[0], prism.lower[1] - buffersize, prism.lower[2]])
    block.setUpperAbsolute([prism.upper[0], prism.lower[1], prism.upper[2]])
    sim.mesh_object_list.append(block)

    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setLowerAbsolute([prism.lower[0], prism.upper[1], prism.lower[2]])
    block.setUpperAbsolute(
        [prism.upper[0], prism.upper[1] + buffersize, prism.upper[2]])
    sim.mesh_object_list.append(block)

    # Z buffers
    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setLowerAbsolute(
        [prism.lower[0], prism.lower[1], prism.lower[2] - buffersize])
    block.setUpperAbsolute([prism.upper[0], prism.upper[1], prism.lower[2]])
    sim.mesh_object_list.append(block)

    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setLowerAbsolute([prism.lower[0], prism.lower[1], prism.upper[2]])
    block.setUpperAbsolute(
        [prism.upper[0], prism.upper[1], prism.upper[2] + buffersize])
    sim.mesh_object_list.append(block)

    #sim.autoMeshGeometry(0.637/10)
    #print sim.getNcells()

    ##################################
    # prepare some points

    (A1_global, B1_global, C1_global, A2_global, B2_global,
     C2_global) = prism.getGlobalEnvelopPoints()
    #sim.probe_list.append(Probe(position = A1_global))
    #sim.probe_list.append(Probe(position = B1_global))
    #sim.probe_list.append(Probe(position = C1_global))
    #sim.probe_list.append(Probe(position = A2_global))
    #sim.probe_list.append(Probe(position = B2_global))
    #sim.probe_list.append(Probe(position = C2_global))

    bottom_centre = (A1_global + B1_global + C1_global) / 3.0
    print('bottom_centre = ', bottom_centre)
    top_centre = (A2_global + B2_global + C2_global) / 3.0

    P_centre = prism.getGeoCentre()

    template_radius = prism.getInscribedSquarePlaneRadius(P_centre)
    print('template_radius = ', template_radius)

    P3 = numpy.array(P_centre)

    prism_height = prism.upper[0] - prism.lower[0]
    prism_bottom = prism.lower[1]

    P1 = numpy.copy(bottom_centre)
    P1[0] = A1_global[0] - delta
    P2 = numpy.copy(bottom_centre)
    P2[2] = A1_global[2] - delta

    P4 = numpy.copy(top_centre)
    P4[2] = A2_global[2] - delta
    P5 = numpy.copy(top_centre)
    P5[0] = A2_global[0] + delta

    sim.autoMeshGeometry(0.637 / 10)
    # define excitation
    ################
    if sim.boundaries.Ypos_bc == 2:
        Ysym = False
    else:
        Ysym = True

    if pos == 0:
        QuadrupleExcitation(Ysym, sim, P1, 'x', delta, template_radius, freq,
                            exc)
    elif pos == 1:
        QuadrupleExcitation(Ysym, sim, P2 + 2 * delta * numpy.array([0, 0, 1]),
                            'z', delta, template_radius, freq, exc)
    elif pos == 2:
        QuadrupleExcitation(Ysym, sim, P3, 'x', delta, template_radius, freq,
                            exc)
    elif pos == 3:
        QuadrupleExcitation(Ysym, sim, P4, 'z', delta, template_radius, freq,
                            exc)
    elif pos == 4:
        QuadrupleExcitation(Ysym, sim, P5, 'x', delta, template_radius, freq,
                            exc)
    else:
        raise Exception('Invalid value for pos.')
    ################

    # create template
    #x_min = 0.0
    #x_max = 4.00
    #y_min = 0.0
    #y_max = 4.00
    #step_x = 2.00e-2
    #step_y = 2.00e-1
    #x_list = arange(x_min,x_max,step_x)
    #y_list = arange(y_min,y_max,step_y)

    #probe_X = [ P_centre[0]-(0.5*height+delta), P_centre[0], P_centre[0]+(0.5*height+delta) ]

    #if sim.boundaries.Ypos_bc == 2:
    #probe_Y = [ P_centre[1] ]
    #else:
    #probe_Y = [ P_centre[1]-delta ]

    #probe_Z = [ P_centre[2]-radius-delta, P_centre[2] ]

    #for x in probe_X:
    #for y in probe_Y:
    #for z in probe_Z:
    #probe = Probe(position = [ x,y,z ])
    #sim.probe_list.append(probe)

    # define frequency snapshots and probes
    first = min(65400, sim.flag.iterations)
    frequency_vector = [freq]

    P1_m = numpy.copy(P1)
    P2_m = numpy.copy(P2)
    P3_m = numpy.copy(P3)
    P4_m = numpy.copy(P4)
    P5_m = numpy.copy(P5)
    if sim.boundaries.Ypos_bc == 1:
        voxeldim_global = prism.getVoxelDimensions()
        P1_m[1] = P1_m[1] - voxeldim_global[1]
        P2_m[1] = P2_m[1] - voxeldim_global[1]
        P3_m[1] = P3_m[1] - voxeldim_global[1]
        P4_m[1] = P4_m[1] - voxeldim_global[1]
        P5_m[1] = P5_m[1] - voxeldim_global[1]

    Plist = [P1_m, P2_m, P3_m, P4_m, P5_m]
    for idx in range(len(Plist)):
        P = Plist[idx]
        F = sim.addFrequencySnapshot('x', P[0])
        F.first = first
        F.frequency_vector = frequency_vector
        F.name = 'x_' + str(idx)
        F = sim.addFrequencySnapshot('y', P[1])
        F.first = first
        F.frequency_vector = frequency_vector
        F.name = 'y_' + str(idx)
        F = sim.addFrequencySnapshot('z', P[2])
        F.first = first
        F.frequency_vector = frequency_vector
        F.name = 'z_' + str(idx)
        probe = bfdtd.Probe(position=P)
        probe.name = 'p_' + str(idx)
        sim.probe_list.append(probe)

    #F = sim.addFrequencySnapshot(1,P_centre[0]); F.first = first; F.frequency_vector = frequency_vector
    #if sim.boundaries.Ypos_bc == 2:
    #F = sim.addFrequencySnapshot(2,P_centre[1]); F.first = first; F.frequency_vector = frequency_vector
    #else:
    #F = sim.addFrequencySnapshot(2,P_centre[1]-delta); F.first = first; F.frequency_vector = frequency_vector
    #F = sim.addFrequencySnapshot(3,P_centre[2]); F.first = first; F.frequency_vector = frequency_vector

    F = sim.addBoxFrequencySnapshots()
    F.first = first
    F.frequency_vector = frequency_vector

    L = [prism.lower[0], prism.lower[1], prism.lower[2]
         ] - delta * numpy.array([1, 1, 1])
    U = [prism.upper[0], prism.upper[1], prism.upper[2]
         ] + delta * numpy.array([1, 1, 1])
    F = bfdtd.FrequencySnapshot()
    F.setName('Efficiency box frequency snapshot')
    F.setExtension(L, U)
    F.setFirst(first)
    F.setFrequencies(frequency_vector)
    sim.appendSnapshot(F)

    print('==========================================')
    L = P2 - template_radius * numpy.array([1, 1, 0])
    U = P2 + template_radius * numpy.array([1, 1, 0])
    print(('L=', L))
    print(('U=', U))
    F = bfdtd.FrequencySnapshot()
    F.setName('Efficiency input frequency snapshot')
    F.setExtension(L, U)
    F.setPlaneOrientationZ()
    F.setFirst(first)
    F.setFrequencies(frequency_vector)
    sim.appendSnapshot(F)
    print('==========================================')

    print('==========================================')
    L = P4 - template_radius * numpy.array([1, 1, 0])
    U = P4 + template_radius * numpy.array([1, 1, 0])
    print(('L=', L))
    print(('U=', U))
    F = bfdtd.FrequencySnapshot()
    F.setName('Efficiency output frequency snapshot')
    F.setExtension(L, U)
    F.setPlaneOrientationZ()
    F.setFirst(first)
    F.setFrequencies(frequency_vector)
    sim.appendSnapshot(F)
    print('==========================================')

    F = sim.addTimeSnapshot('z', P1[2])
    F.first = first

    ## define mesh
    #sim.addMeshingBox(lower,upper,)
    #sim.autoMeshGeometry(0.637/10)

    # write
    #DSTDIR = os.getenv('DATADIR')
    #DSTDIR = os.getenv('TESTDIR')
    #DSTDIR = os.getenv('TESTDIR')+os.sep+'triangle_pillar'
    #DSTDIR = os.getenv('DATADIR')+os.sep+'triangle_pillar'
    dest = DSTDIR + os.sep + BASENAME
    sim.writeAll(dest, BASENAME)
    GEOshellscript(dest + os.sep + BASENAME + '.sh',
                   BASENAME,
                   '$HOME/bin/fdtd',
                   '$JOBDIR',
                   WALLTIME=360)
    newdest = dest + os.sep + 'nogeometry'
    efficiency_run(dest, newdest)
    GEOshellscript(newdest + os.sep + BASENAME + '.sh',
                   BASENAME,
                   '$HOME/bin/fdtd',
                   '$JOBDIR',
                   WALLTIME=360)

    template = dest + os.sep + 'template.dat'
    try:
        shutil.copyfile(template, newdest + os.sep + 'template.dat')
    except IOError as e:
        print('File not found : ' + template)

    #GEOshellscript_advanced(DSTDIR+os.sep+BASENAME+os.sep+BASENAME+'.sh', BASENAME, getProbeColumnFromExcitation(excitation.E),'$HOME/bin/fdtd', '$JOBDIR', WALLTIME = 360)
    print(sim.getNcells())
#!/usr/bin/env python3

import os
import sys
import random
import tempfile

from utilities.brisFDTD_ID_info import FREQUENCYSNAPSHOT_MAX, TIMESNAPSHOT_MAX, MODEFILTEREDPROBE_MAX

import bfdtd

#tmp = tempfile.mkdtemp()
tmp = '/tmp/test/'
print('simdir = {}'.format(tmp))

sim = bfdtd.BFDTDobject()

sim.setSizeAndResolution([3,3,3], [30,40,50])

b = bfdtd.Block()
b.setSize([1,1,1])
b.setLocation(sim.getCentro())
b.setRelativePermittivity(2)
sim.appendGeometryObject(b)

#t = sim.appendSnapshot(TimeSnapshot())
#t.setEpsilon(True)

#sim.appendSnapshot(TimeSnapshot())

for s in [bfdtd.EpsilonSnapshot, bfdtd.FrequencySnapshot]:
def semi_loncar(DSTDIR, BASENAME, pos, exc):
    pillar = bfdtd.BFDTDobject()

    # constants
    n_air = 1
    n_diamond = 2.4
    Lambda_mum = 0.637
    delta = Lambda_mum / (10 * n_diamond)
    freq = constants.get_c0() / Lambda_mum
    cylinder_radius = 0.300
    pillar_radius = 0.500
    inter_centre_distance = 1.111
    h_air = Lambda_mum / (4 * n_air)
    h_diamond = Lambda_mum / (4 * n_diamond)
    h_cavity = Lambda_mum / (n_diamond)
    pillar_height = 7 + 3 * inter_centre_distance
    print('pillar_height = {}'.format(pillar_height))
    buffer = 0.05
    FullBox_upper = [
        pillar_height + 2 * buffer, 2 * (pillar_radius + buffer),
        2 * (pillar_radius + buffer)
    ]

    P_centre = [
        buffer + 0.5 * pillar_height, 0.5 * FullBox_upper[1],
        0.5 * FullBox_upper[2]
    ]
    pillar_bottom_centre = P_centre - array([0.5 * pillar_height, 0, 0])

    # define flag
    pillar.flag.iterations = 100000
    #pillar.flag.iterations = 1

    # define boundary conditions
    pillar.boundaries.Xpos_bc = 2
    pillar.boundaries.Ypos_bc = 2  #1
    pillar.boundaries.Zpos_bc = 2

    # define box
    pillar.box.lower = [0, 0, 0]
    if pillar.boundaries.Ypos_bc == 2:
        pillar.box.upper = FullBox_upper
    else:
        pillar.box.upper = [
            FullBox_upper[0], 0.5 * FullBox_upper[1], FullBox_upper[2]
        ]

    #P_centre = pillar.box.getCenter()

    ## define geometry

    block = bfdtd.Block()
    block.lower = [
        P_centre[0] - 0.5 * pillar_height, P_centre[1] - pillar_radius,
        P_centre[2] - pillar_radius
    ]
    block.upper = [
        P_centre[0] + 0.5 * pillar_height, P_centre[1] + pillar_radius,
        P_centre[2] + pillar_radius
    ]
    block.setRefractiveIndex(n_diamond)
    block.conductivity = 0
    pillar.setGeometryObjects([block])

    cylinder = bfdtd.Cylinder()
    cylinder.centre = pillar_bottom_centre + array(
        [inter_centre_distance - cylinder_radius, 0, 0])
    cylinder.outer_radius = 0.5 * cylinder_radius
    cylinder.height = 2 * pillar_radius
    cylinder.setRefractiveIndex(n_air)
    cylinder.conductivity = 0

    cylinder1 = copy.deepcopy(cylinder)
    cylinder1.centre = cylinder.centre + array(
        [0 * inter_centre_distance, 0, 0])
    cylinder2 = copy.deepcopy(cylinder)
    cylinder2.centre = cylinder.centre + array(
        [1 * inter_centre_distance, 0, 0])
    cylinder3 = copy.deepcopy(cylinder)
    cylinder3.centre = cylinder.centre + array(
        [2 * inter_centre_distance, 0, 0])

    pillar.appendGeometryObject(block)
    pillar.appendGeometryObject(cylinder1)
    pillar.appendGeometryObject(cylinder2)
    pillar.appendGeometryObject(cylinder3)

    buffersize = 10 * delta
    n_meshblock = 2.4

    # X buffers
    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setRelativeConductivity(0)
    block.lower = [
        block.getLowerAbsolute()[0] - buffersize,
        block.getLowerAbsolute()[1],
        block.getLowerAbsolute()[2]
    ]
    block.upper = [
        block.getLowerAbsolute()[0],
        block.getUpperAbsolute()[1],
        block.getUpperAbsolute()[2]
    ]
    pillar.mesh_object_list.append(block)

    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setRelativeConductivity(0)
    block.lower = [
        block.getUpperAbsolute()[0],
        block.getLowerAbsolute()[1],
        block.getLowerAbsolute()[2]
    ]
    block.upper = [
        block.getUpperAbsolute()[0] + buffersize,
        block.getUpperAbsolute()[1],
        block.getUpperAbsolute()[2]
    ]
    pillar.mesh_object_list.append(block)

    # Y buffers
    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setRelativeConductivity(0)
    block.lower = [
        block.getLowerAbsolute()[0],
        block.getLowerAbsolute()[1] - buffersize,
        block.getLowerAbsolute()[2]
    ]
    block.upper = [
        block.getUpperAbsolute()[0],
        block.getLowerAbsolute()[1],
        block.getUpperAbsolute()[2]
    ]
    pillar.mesh_object_list.append(block)

    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setRelativeConductivity(0)
    block.lower = [
        block.getLowerAbsolute()[0],
        block.getUpperAbsolute()[1],
        block.getLowerAbsolute()[2]
    ]
    block.upper = [
        block.getUpperAbsolute()[0],
        block.getUpperAbsolute()[1] + buffersize,
        block.getUpperAbsolute()[2]
    ]
    pillar.mesh_object_list.append(block)

    # Z buffers
    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setRelativeConductivity(0)
    block.lower = [
        block.getLowerAbsolute()[0],
        block.getLowerAbsolute()[1],
        block.getLowerAbsolute()[2] - buffersize
    ]
    block.upper = [
        block.getUpperAbsolute()[0],
        block.getUpperAbsolute()[1],
        block.getLowerAbsolute()[2]
    ]
    pillar.mesh_object_list.append(block)

    block = bfdtd.Block()
    block.setRefractiveIndex(n_meshblock)
    block.setRelativeConductivity(0)
    block.lower = [
        block.getLowerAbsolute()[0],
        block.getLowerAbsolute()[1],
        block.getUpperAbsolute()[2]
    ]
    block.upper = [
        block.getUpperAbsolute()[0],
        block.getUpperAbsolute()[1],
        block.getUpperAbsolute()[2] + buffersize
    ]
    pillar.mesh_object_list.append(block)

    #pillar.autoMeshGeometry(0.637/10)
    #print pillar.getNcells()

    ##################################
    # prepare some points

    #(A1_global,B1_global,C1_global,A2_global,B2_global,C2_global) = block.getGlobalEnvelopPoints()
    #pillar.probe_list.append(Probe(position = A1_global))
    #pillar.probe_list.append(Probe(position = B1_global))
    #pillar.probe_list.append(Probe(position = C1_global))
    #pillar.probe_list.append(Probe(position = A2_global))
    #pillar.probe_list.append(Probe(position = B2_global))
    #pillar.probe_list.append(Probe(position = C2_global))

    #bottom_centre = (A1_global+B1_global+C1_global)/3.0
    #print('bottom_centre = ',bottom_centre)
    #top_centre = (A2_global+B2_global+C2_global)/3.0

    P_centre = block.getCentro()

    #template_radius = block.getInscribedSquarePlaneRadius(P_centre)
    #print('template_radius = ',template_radius)

    #P3 = array(P_centre)

    #prism_height = block.getUpperAbsolute()[0] - block.getLowerAbsolute()[0]
    #prism_bottom = block.getLowerAbsolute()[1]

    #P1 = copy(bottom_centre)
    #P1[0] = A1_global[0] - delta
    #P2 = copy(bottom_centre)
    #P2[2] = A1_global[2] - delta

    #P4 = copy(top_centre)
    #P4[2] = A2_global[2] - delta
    #P5 = copy(top_centre)
    #P5[0] = A2_global[0] + delta

    #pillar.autoMeshGeometry(0.637/10)
    # define excitation
    ################
    if pillar.boundaries.Ypos_bc == 2:
        Ysym = False
    else:
        Ysym = True

    #if pos == 0:
    #QuadrupleExcitation(Ysym,pillar,P1,'x',delta,template_radius,freq,exc)
    #elif pos == 1:
    #QuadrupleExcitation(Ysym,pillar,P2,'z',delta,template_radius,freq,exc)
    #elif pos == 2:
    #QuadrupleExcitation(Ysym,pillar,P3,'x',delta,template_radius,freq,exc)
    #elif pos == 3:
    #QuadrupleExcitation(Ysym,pillar,P4,'z',delta,template_radius,freq,exc)
    #elif pos == 4:
    #QuadrupleExcitation(Ysym,pillar,P5,'x',delta,template_radius,freq,exc)
    #else:
    #sys.exit(-1)
    ################

    # create template
    #x_min = 0.0
    #x_max = 4.00
    #y_min = 0.0
    #y_max = 4.00
    #step_x = 2.00e-2
    #step_y = 2.00e-1
    #x_list = arange(x_min,x_max,step_x)
    #y_list = arange(y_min,y_max,step_y)

    #probe_X = [ P_centre[0]-(0.5*height+delta), P_centre[0], P_centre[0]+(0.5*height+delta) ]

    #if pillar.boundaries.Ypos_bc == 2:
    #probe_Y = [ P_centre[1] ]
    #else:
    #probe_Y = [ P_centre[1]-delta ]

    #probe_Z = [ P_centre[2]-radius-delta, P_centre[2] ]

    #for x in probe_X:
    #for y in probe_Y:
    #for z in probe_Z:
    #probe = Probe(position = [ x,y,z ])
    #pillar.probe_list.append(probe)

    # define frequency snapshots and probes
    first = min(65400, pillar.flag.iterations)
    frequency_vector = [freq]

    #P1_m = copy(P1)
    #P2_m = copy(P2)
    #P3_m = copy(P3)
    #P4_m = copy(P4)
    #P5_m = copy(P5)
    #if pillar.boundaries.Ypos_bc == 1:
    #voxeldim_global = block.getVoxelDimensions()
    #P1_m[1] = P1_m[1] - voxeldim_global[1]
    #P2_m[1] = P2_m[1] - voxeldim_global[1]
    #P3_m[1] = P3_m[1] - voxeldim_global[1]
    #P4_m[1] = P4_m[1] - voxeldim_global[1]
    #P5_m[1] = P5_m[1] - voxeldim_global[1]

    #Plist = [P1_m,P2_m,P3_m,P4_m,P5_m]
    #for idx in range(len(Plist)):
    #P = Plist[idx]
    #F = pillar.addFrequencySnapshot(1,P[0]); F.first = first; F.frequency_vector = frequency_vector; F.name='x_'+str(idx)
    #F = pillar.addFrequencySnapshot(2,P[1]); F.first = first; F.frequency_vector = frequency_vector; F.name='y_'+str(idx)
    #F = pillar.addFrequencySnapshot(3,P[2]); F.first = first; F.frequency_vector = frequency_vector; F.name='z_'+str(idx)
    #probe = Probe(position = P); probe.name = 'p_'+str(idx)
    #pillar.probe_list.append(probe)

    #F = pillar.addFrequencySnapshot(1,P_centre[0]); F.first = first; F.frequency_vector = frequency_vector
    #if pillar.boundaries.Ypos_bc == 2:
    #F = pillar.addFrequencySnapshot(2,P_centre[1]); F.first = first; F.frequency_vector = frequency_vector
    #else:
    #F = pillar.addFrequencySnapshot(2,P_centre[1]-delta); F.first = first; F.frequency_vector = frequency_vector
    #F = pillar.addFrequencySnapshot(3,P_centre[2]); F.first = first; F.frequency_vector = frequency_vector

    F = pillar.addBoxFrequencySnapshots()
    F.first = first
    F.frequency_vector = frequency_vector

    ## define mesh
    #pillar.addMeshingBox(lower,upper,)
    #pillar.autoMeshGeometry(0.637/10)

    # write
    #DSTDIR = os.getenv('DATADIR')
    #DSTDIR = os.getenv('TESTDIR')
    #DSTDIR = os.path.join(os.getenv('TESTDIR'), 'triangle_pillar')
    #DSTDIR = os.path.join(os.getenv('DATADIR'), 'triangle_pillar')
    pillar.writeAll(os.path.join(DSTDIR, BASENAME), BASENAME)
    GEOshellscript(os.path.join(DSTDIR, BASENAME, BASENAME + '.sh'),
                   BASENAME,
                   '$HOME/bin/fdtd',
                   '$JOBDIR',
                   WALLTIME=360)
    #GEOshellscript_advanced(os.path.join(DSTDIR, BASENAME, BASENAME+'.sh'), BASENAME, getProbeColumnFromExcitation(excitation.E),'$HOME/bin/fdtd', '$JOBDIR', WALLTIME = 360)
    print(pillar.getNcells())
Example #22
0
def test0():
    parser = argparse.ArgumentParser()
    parser.add_argument('DSTDIR', default=tempfile.gettempdir(), nargs='?')
    parser.add_argument('-v',
                        '--verbose',
                        action="count",
                        dest="verbosity",
                        default=0,
                        help='verbosity level')
    parser.add_argument('-r', '--run', action="store_true")
    args = parser.parse_args()
    print(args)

    sim = bfdtd.BFDTDobject()
    sim.setVerbosity(args.verbosity)
    sim.setSizeAndResolution([1, 2, 3], [32, 32, 32], True)

    E = bfdtd.Excitation()
    E.setTimeConstant(1e-8)
    E.setPeriod(E.getTimeConstant() / 10)
    E.setStartTime(0)
    E.setLocation(sim.getCentro())
    E.setEx()
    #E.setSize([2*1/32,0,0])
    sim.appendExcitation(E)

    print(E)

    p = bfdtd.Probe()
    p.setStep(1)
    p.setLocation(E.getLocation())
    sim.appendProbe(p)

    n = 5
    bsize = [0.5, 2 * 0.5, 3 * 0.5]  # E.getLambda()/(2*n)

    b = bfdtd.Block()
    b.setLocation(sim.getCentro())
    b.setRefractiveIndex(n)
    b.setSize(bsize)
    sim.appendGeometryObject(b)

    energy_snapshot = bfdtd.EnergySnapshot()
    energy_snapshot.setFrequencies(E.getFrequency())

    f = bfdtd.SnapshotBoxXYZ()
    f.setBaseSnapshot(energy_snapshot)
    f.setIntersectionPoint(sim.getCentro())
    sim.appendSnapshot(f)

    #sim.appendSnapshot(bfdtd.EpsilonSnapshot())

    sim.setSimulationTime(2 * E.getEndTime())
    sim.setAutosetNFrequencySnapshots(10)

    if args.run:
        sim.runSimulation(args.DSTDIR)

    print('------------')
    E.printInfo()
    print('------------')
    sim.printInfo()
    print('------------')

    # default
    #------------
    #self.getStartTime() = 0.0
    #self.getPeakTime() = 2e-08
    #self.getEndTime() = 4e-08
    #self.getPeriod() = 3.3356409519815204e-09
    #------------
    #self.getNcells() = 32768
    #self.getIterations() = 739
    #self.getSimulationTime() = 4.002723944839243e-08
    #self.getTimeStep() = 5.416405879349449e-11 -> mus
    #------------

    return 0