Beispiel #1
0
def get_sample():
    """
    Returns a sample with cylinders in a homogeneous medium ("Vacuum").
    The cylinders are a 95:5 mixture of two different size distributions.
    """
    # defining materials
    m_vacuum = ba.HomogeneousMaterial("Vacuum", 0.0, 0.0)
    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)

    # collection of particles #1
    radius1 = 5.0 * nm
    height1 = radius1
    sigma1 = radius1 * 0.2

    cylinder_ff1 = ba.FormFactorCylinder(radius1, height1)
    cylinder1 = ba.Particle(m_particle, cylinder_ff1)

    gauss_distr1 = ba.DistributionGaussian(radius1, sigma1)

    nparticles = 150
    sigma_factor = 3.0

    # limits will assure, that generated Radius'es are >=0
    limits = ba.RealLimits.nonnegative()

    par_distr1 = ba.ParameterDistribution("/Particle/Cylinder/Radius",
                                          gauss_distr1, nparticles,
                                          sigma_factor, limits)
    part_coll1 = ba.ParticleDistribution(cylinder1, par_distr1)

    # collection of particles #2
    radius2 = 10.0 * nm
    height2 = radius2
    sigma2 = radius2 * 0.02

    cylinder_ff2 = ba.FormFactorCylinder(radius2, height2)
    cylinder2 = ba.Particle(m_particle, cylinder_ff2)

    gauss_distr2 = ba.DistributionGaussian(radius2, sigma2)

    par_distr2 = ba.ParameterDistribution("/Particle/Cylinder/Radius",
                                          gauss_distr2, nparticles,
                                          sigma_factor, limits)
    part_coll2 = ba.ParticleDistribution(cylinder2, par_distr2)

    # assembling the sample
    particle_layout = ba.ParticleLayout()
    particle_layout.addParticle(part_coll1, 0.95)
    particle_layout.addParticle(part_coll2, 0.05)

    vacuum_layer = ba.Layer(m_vacuum)
    vacuum_layer.addLayout(particle_layout)

    multi_layer = ba.MultiLayer()
    multi_layer.addLayer(vacuum_layer)
    return multi_layer
def getSample():
    # Defining Materials
    material_2 = ba.HomogeneousMaterial("Si", 7.6e-06, 1.7e-07)
    material_1 = ba.HomogeneousMaterial("Air", 0.0, 0.0)

    # Defining Layers
    layer_1 = ba.Layer(material_1)
    layer_2 = ba.Layer(material_2)

    # Defining Form Factors
    formFactor_1 = ba.FormFactorCylinder(5.0 * nm, 5.0 * nm)

    # Defining Particles
    particle_1 = ba.Particle(material_2, formFactor_1)

    # Defining particles with parameter following a distribution
    distr_1 = ba.DistributionGaussian(5.0, 1.0)
    par_distr_1 = ba.ParameterDistribution("/Particle/Cylinder/Radius",
                                           distr_1, 10, 2.0)
    par_distr_1.linkParameter("/Particle/Cylinder/Height")
    particleDistribution_1 = ba.ParticleDistribution(particle_1, par_distr_1)

    # Defining Particle Layouts and adding Particles
    layout_1 = ba.ParticleLayout()
    layout_1.addParticle(particleDistribution_1, 1.0)
    layout_1.setTotalParticleSurfaceDensity(1)

    # Adding layouts to layers
    layer_1.addLayout(layout_1)

    # Defining Multilayers
    multiLayer_1 = ba.MultiLayer()
    multiLayer_1.addLayer(layer_1)
    multiLayer_1.addLayer(layer_2)
    return multiLayer_1
Beispiel #3
0
    def multilayer(self):
        """
        Constructs the sample from current parameter values.
        """

        # defining materials
        m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
        m_Si = ba.HomogeneousMaterial("Si", 5.78164736e-6, 1.02294578e-7)
        m_Ag = ba.HomogeneousMaterial("Ag", 2.24749529E-5, 1.61528396E-6)
        m_PTFE = ba.HomogeneousMaterial("PTFE", 5.20508729E-6, 1.96944292E-8)
        m_HMDSO = ba.HomogeneousMaterial("HMDSO", 2.0888308E-6, 1.32605651E-8)

        # collection of particles with size distribution
        nparticles = 20
        nfwhm = 2.0
        sphere_ff = ba.FormFactorFullSphere(self.radius)

        sphere = ba.Particle(m_Ag, sphere_ff)
        position = ba.kvector_t(0 * ba.nm, 0 * ba.nm,
                                -1.0 * self.hmdso_thickness)
        sphere.setPosition(position)
        ln_distr = ba.DistributionLogNormal(self.radius, self.sigma)
        par_distr = ba.ParameterDistribution(
            "/Particle/FullSphere/Radius", ln_distr, nparticles, nfwhm,
            ba.RealLimits.limited(0.0, self.hmdso_thickness / 2.0))
        part_coll = ba.ParticleDistribution(sphere, par_distr)

        # interference function
        interference = ba.InterferenceFunctionRadialParaCrystal(
            self.distance, 1e6 * ba.nm)
        interference.setKappa(self.kappa)
        interference.setDomainSize(20000.0)
        pdf = ba.FTDistribution1DGauss(self.disorder)
        interference.setProbabilityDistribution(pdf)

        # assembling particle layout
        layout = ba.ParticleLayout()
        layout.addParticle(part_coll, 1.0)
        layout.setInterferenceFunction(interference)
        layout.setTotalParticleSurfaceDensity(1)

        # roughness
        r_ptfe = ba.LayerRoughness(2.3 * ba.nm, 0.3, 5.0 * ba.nm)
        r_hmdso = ba.LayerRoughness(1.1 * ba.nm, 0.3, 5.0 * ba.nm)

        # layers
        air_layer = ba.Layer(m_air)
        hmdso_layer = ba.Layer(m_HMDSO, self.hmdso_thickness)
        hmdso_layer.addLayout(layout)
        ptfe_layer = ba.Layer(m_PTFE, self.ptfe_thickness)
        substrate_layer = ba.Layer(m_Si)

        # assembling multilayer
        multi_layer = ba.MultiLayer()
        multi_layer.addLayer(air_layer)
        multi_layer.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
        multi_layer.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
        multi_layer.addLayer(substrate_layer)

        return multi_layer
    def create_layout(self, particle_material):
        layout = ba.ParticleLayout()
        radius = 5.02
        nparticles = 100
        sigma = 0.3
        gauss_distr = ba.DistributionGaussian(radius, sigma)
        # scale_param = math.sqrt(math.log((sigma / radius) ** 2 + 1.0))
        # gauss_distr = ba.DistributionLogNormal(radius, scale_param)

        particle = ba.Particle(particle_material,
                               ba.FormFactorFullSphere(radius))

        sigma_factor = 2.0
        par_distr = ba.ParameterDistribution("/Particle/FullSphere/Radius",
                                             gauss_distr, nparticles,
                                             sigma_factor)
        part_coll = ba.ParticleDistribution(particle, par_distr)
        layout.addParticle(part_coll, 1.0,
                           ba.kvector_t(0, 0, -self.m_average_layer_thickness))

        for i in range(0, 100):
            radius = npr.normal(5.0, 0.3)
            if radius < 4.0 or radius > 6.0:
                pass
            particle = ba.Particle(particle_material,
                                   ba.FormFactorFullSphere(radius))
            zbot = -self.m_average_layer_thickness
            pos = random_gate(zbot, zbot + 50)
            layout.addParticle(particle, 0.05, ba.kvector_t(0, 0, pos))

        layout.setTotalParticleSurfaceDensity(0.002)
        return layout
def create_diffuse_layout(particle_material, average_layer_thickness):
    """
    Createss layout with mesocrystal collection.
    """

    m_radius = 5.02
    m_nparticles = 100
    m_sigma = 0.5
    m_diffuse_surface_density = 1e-2

    layout = ba.ParticleLayout()

    distr = ba.DistributionGaussian(m_radius, m_sigma)
    # scale_param = math.sqrt(math.log((m_sigma / m_radius) ** 2 + 1.0))
    # distr = ba.DistributionLogNormal(m_radius, scale_param)
    particle = ba.Particle(particle_material,
                           ba.FormFactorFullSphere(m_radius))

    sigma_factor = 3.0
    par_distr = ba.ParameterDistribution("/Particle/FullSphere/Radius", distr,
                                         m_nparticles, sigma_factor)
    part_coll = ba.ParticleDistribution(particle, par_distr)
    layout.addParticle(part_coll, 1.0,
                       ba.kvector_t(0, 0, -average_layer_thickness + 10))

    layout.setTotalParticleSurfaceDensity(m_diffuse_surface_density)

    return layout
Beispiel #6
0
def get_vertical_lamellar():
    mat_a = ba.HomogeneousMaterial("PTFE", 5.20508729E-6, 1.96944292E-8)
    mat_b = ba.HomogeneousMaterial("HMDSO", 2.0888308E-6, 1.32605651E-8)
    length = 30*nm
    width_a = 4*nm
    width_b = 8*nm
    height = 30*nm
    nstack = 5
    stack = ba.ParticleComposition()
    for i in range(0, nstack):
        box_a = ba.Particle(mat_a, ba.FormFactorBox(length, width_a, height))
        box_b = ba.Particle(mat_b, ba.FormFactorBox(length, width_b, height))
        stack.addParticle(box_a, ba.kvector_t(0.0, i*(width_a+width_b), 0.0))
        stack.addParticle(box_b, ba.kvector_t(0.0, (width_a + width_b)/2. + i*(width_a+width_b), 0.0))

    stack.rotate(ba.RotationEuler(45.0*deg, 90.*deg, 0.0))

    # Defining particles with parameter following a distribution
    gate = ba.DistributionGate(0.0*deg, 180.0*deg)
    par_distr = ba.ParameterDistribution("/ParticleComposition/EulerRotation/Alpha", gate, 60, 0.0)
    particles = ba.ParticleDistribution(stack, par_distr)

    stack.setPosition(0.0, 0.0, width_a/2.)

    return particles
Beispiel #7
0
def get_sample_rot_distr():
    # create materials
    substrate_material = ba.HomogeneousMaterial("Substrate", 6.05878e-6,
                                                6.94321e-11)
    particle_material = ba.HomogeneousMaterial("ParticleCore", -0.609e-6,
                                               0.183e-6)
    layer_material = ba.HomogeneousMaterial("D2O", 1.85762e-5, 3.31309e-11)

    # create mesocrystal
    # lattice
    lat = create_hex_lattice(distance, length)
    # basis particle
    ff = ba.FormFactorCylinder(radius, length)
    particle = ba.Particle(particle_material, ff)
    # rotate cylinder to make it parallel to the substrate
    rotation = ba.RotationY(90.0 * ba.degree)
    particle.setRotation(rotation)
    basis = ba.ParticleComposition(particle)

    # mesocrystal
    total_height = nbr_layers * distance * np.sin(hex_angle)
    # using a Gaussian form factor as the overall shape of where the cylinders are
    meso_ff = ba.FormFactorGauss(meso_width, total_height)
    # assemble them into mesocrystal
    npc = ba.Crystal(basis, lat)
    dw_factor = 0.2
    npc.setDWFactor(dw_factor)
    meso = ba.MesoCrystal(npc, meso_ff)
    # rotate mesocrystal
    rot_y = ba.RotationY(180.0 * ba.degree)
    meso.setRotation(rot_y)  # turn upside down
    rot_z = ba.RotationZ(0.1 * ba.degree)
    meso.applyRotation(rot_z)  # rotate around Z
    meso.setPosition(0.0, 0.0, 0.0)

    # add uniform distribution of the domain orientations
    rot_distr = ba.DistributionGate((90.0 - rz_range) * ba.degree,
                                    (90.0 + rz_range) * ba.degree)
    ang_distr = ba.ParameterDistribution("*MesoCrystal/EulerRotation/Gamma",
                                         rot_distr, rz_num)
    part_coll = ba.ParticleDistribution(meso, ang_distr)

    # Create multilayer
    multi_layer = ba.MultiLayer()
    d2o_layer = ba.Layer(layer_material)
    substrate_layer = ba.Layer(substrate_material)

    particle_layout = ba.ParticleLayout()
    particle_layout.addParticle(part_coll)
    d2o_layer.addLayout(particle_layout)

    # the sample is upside down
    multi_layer.addLayer(substrate_layer)
    multi_layer.addLayer(d2o_layer)

    return multi_layer
Beispiel #8
0
    def create_diffuse_layout(self):
        layout = ba.ParticleLayout()
        radius = 5.0
        nparticles = 100
        sigma = 0.3 * radius
        gauss_distr = ba.DistributionGaussian(radius, sigma)

        particle = ba.Particle(self.m_adapted_particle_material,
                               ba.FormFactorFullSphere(radius))

        sigma_factor = 2.0
        par_distr = ba.ParameterDistribution("/Particle/FullSphere/Radius",
                                             gauss_distr, nparticles,
                                             sigma_factor)
        part_coll = ba.ParticleDistribution(particle, par_distr)
        layout.addParticle(
            part_coll, 1.0,
            ba.kvector_t(
                0, 0, -self.m_average_layer_thickness + self.m_meso_elevation))

        layout.setTotalParticleSurfaceDensity(0.005)
        return layout
Beispiel #9
0
def get_sample():
    """
    Return a sample with cylinders on a substrate.
    The cylinders have a Gaussian size distribution.
    """
    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)

    # cylindrical particle
    radius = 5 * nm
    height = radius
    cylinder_ff = ba.FormFactorCylinder(radius, height)
    cylinder = ba.Particle(m_particle, cylinder_ff)

    # collection of particles with size distribution
    nparticles = 100
    sigma = 0.2 * radius

    gauss_distr = ba.DistributionGaussian(radius, sigma)

    sigma_factor = 2.0
    par_distr = ba.ParameterDistribution("/Particle/Cylinder/Radius",
                                         gauss_distr, nparticles, sigma_factor)
    # by uncommenting the line below, the height of the cylinders
    #   can be scaled proportionally to the radius:
    # par_distr.linkParameter("/Particle/Cylinder/Height")
    part_coll = ba.ParticleDistribution(cylinder, par_distr)

    # assembling the sample
    particle_layout = ba.ParticleLayout()
    particle_layout.addParticle(part_coll)

    air_layer = ba.Layer(m_ambience)
    air_layer.addLayout(particle_layout)
    multi_layer = ba.MultiLayer()
    multi_layer.addLayer(air_layer)
    return multi_layer
Beispiel #10
0
def get_sample():
    """
    Returns a sample
    """
    # defining materials
    m_si = ba.MaterialBySLD("Si", sld_Si, sld_Si_im)
    m_d2o = ba.MaterialBySLD("D2O", sld_D2O, sld_D2O_im)
    m_core = ba.MaterialBySLD("Me3O5:D2O2", 2.0 * 1.0e-06, 0.0)
    m_shell = ba.MaterialBySLD("Me3O5:D2O", 3.9 * 1.0e-06, 0.0)

    # layer with particles
    # calculate average SLD
    Vcore = vol(core_radius, core_height)
    Vshell = vol(radius, height) - Vcore
    f_d2o = 0.7
    f_core = (1.0 - f_d2o) / (1 + Vshell / Vcore)
    f_shell = (1.0 - f_d2o) / (1 + Vcore / Vshell)
    sld_mix = f_d2o * sld_D2O + f_shell * 3.9 * 1.0e-06 + f_core * 2.0 * 1.0e-06
    m_mix = ba.MaterialBySLD("mix", sld_mix, 0.0)

    # fluctuation component
    ff_microgel = FormFactorMicrogel(b, xi, xiz)
    microgel = ba.Particle(m_core, ff_microgel)
    microgel_layout = ba.ParticleLayout()
    microgel_layout.addParticle(microgel, 1.0)

    # collection of particles
    ff = ba.FormFactorTruncatedSphere(radius=radius, height=height)
    ff_core = ba.FormFactorTruncatedSphere(radius=core_radius,
                                           height=core_height)
    transform = ba.RotationY(180.0 * deg)
    shell_particle = ba.Particle(m_shell, ff)
    core_particle = ba.Particle(m_core, ff_core)
    core_position = ba.kvector_t(0.0, 0.0, 0.0)
    particle = ba.ParticleCoreShell(shell_particle, core_particle,
                                    core_position)
    particle.setPosition(ba.kvector_t(0.0, 0.0, 0.0))
    particle.setRotation(transform)

    nparticles = 2  # the larger is this number, the more slow will be the simulation. 10 is usually enough
    sigma = 0.2 * radius

    gauss_distr = ba.DistributionGaussian(radius, sigma)

    sigma_factor = 2.0
    par_distr = ba.ParameterDistribution(
        "/ParticleCoreShell/Particle1/TruncatedSphere/Radius",
        gauss_distr, nparticles, sigma_factor,
        ba.RealLimits.lowerLimited(core_radius + 1.0))
    par_distr.linkParameter(
        "/ParticleCoreShell/Particle1/TruncatedSphere/Height")
    par_distr.linkParameter(
        "/ParticleCoreShell/Particle0/TruncatedSphere/Height")
    par_distr.linkParameter(
        "/ParticleCoreShell/Particle0/TruncatedSphere/Radius")
    part_coll = ba.ParticleDistribution(particle, par_distr)

    microgel_layout.addParticle(part_coll, 1.2e-05)

    # interference can be neglected
    interference = ba.InterferenceFunctionNone()
    microgel_layout.setInterferenceFunction(interference)

    # describe layer roughness
    roughness = ba.LayerRoughness()
    roughness.setSigma(1.2 * ba.nm)
    roughness.setHurstParameter(0.8)
    roughness.setLatteralCorrLength(570.0 * ba.nm)

    # create layers
    d2o_layer = ba.Layer(m_d2o)
    mix_layer = ba.Layer(m_mix, 2.0 * height)
    mix_layer.addLayout(microgel_layout)
    si_layer = ba.Layer(m_si)
    multi_layer = ba.MultiLayer()
    multi_layer.addLayer(si_layer)
    multi_layer.addLayer(mix_layer)
    multi_layer.addLayerWithTopRoughness(d2o_layer, roughness)

    return multi_layer