Skip to content
Snippets Groups Projects
add_mesh_cluster.py 41.4 KiB
Newer Older
  • Learn to ignore specific revisions
  •         # size = height, skin = diameter
            number_x = int(skin/(2*e))+4
            number_y = int(skin/(2*f))+4
            number_z = int(size/(2*g))
        else:
            number_x = int(size/(2*e))+4
            number_y = int(size/(2*f))+4
            number_z = int(size/(2*g))+1+4
    
    
        for k in range(-number_z,number_z+1):
            for j in range(-number_y,number_y+1):
                for i in range(-number_x,number_x+1):
                    atom = Vector((float(i)*e,float(j)*f,float(k)*g)) 
    
                    if y_displ == 1:
                        if z_displ == 1:
                            atom[0] += e/2.0  
                        else:
                            atom[0] -= e/2.0
                    if z_displ == 1:
                        atom[0] -= e/2.0
                        atom[1] += df1
                    if z_displ == 2:
                        atom[0] += 0.0
                        atom[1] += df2
    
                    if ctype == "sphere_hex_abc":
                        message = vec_in_sphere(atom, size, skin)
                    elif ctype == "pyramide_hex_abc":
                        # size = height, skin = diameter
                        message = vec_in_pyramide_hex_abc(atom, size, skin)
                    elif ctype == "parabolid_abc":
                        message = vec_in_parabole(atom, size, skin)          
    
                    if message[0] == True and message[1] == True:
                        atom_add = CLASS_atom_cluster_atom(atom)
                        ATOM_CLUSTER_ALL_ATOMS.append(atom_add)
                        atom_number_total += 1
                        atom_number_drawn += 1
                    if message[0] == True and message[1] == False:
                        atom_number_total += 1                 
              
                if y_displ == 1:
                    y_displ = 0
                else:
                    y_displ = 1
    
            y_displ = 0
            if z_displ == 0:
               z_displ = 1
            elif z_displ == 1:
               z_displ = 2
            else:
               z_displ = 0
    
    
    Clemens Barth's avatar
     
    Clemens Barth committed
        print("Atom positions calculated")
    
    
        return (atom_number_total, atom_number_drawn)
    
    
    def create_hexagonal_abab_lattice(ctype, size, skin, lattice):
    
        atom_number_total = 0
        atom_number_drawn = 0
        y_displ = "even"
        z_displ = "even"
    
        """
        e = (1/sqrt(2.0)) * lattice
        f = sqrt(3.0/4.0) * e
        df = (e/2.0) * tan((30.0/360.0)*2*pi)
        g = sqrt(2.0/3.0) * e
        """
    
        e = 0.7071067814 * lattice
        f = 0.8660254038 * e
        df = 0.2886751348 * e
        g = 0.8164965810 * e
    
    
        if ctype == "parabolid_ab":
            # size = height, skin = diameter
            number_x = int(skin/(2*e))+4
            number_y = int(skin/(2*f))+4
            number_z = int(size/(2*g))
        else:
            number_x = int(size/(2*e))+4
            number_y = int(size/(2*f))+4
            number_z = int(size/(2*g))+1+4
    
    
        for k in range(-number_z,number_z+1):
            for j in range(-number_y,number_y+1):
                for i in range(-number_x,number_x+1):
    
                    atom = Vector((float(i)*e,float(j)*f,float(k)*g))
              
                    if "odd" in y_displ:
                        if "odd" in z_displ:
                            atom[0] += e/2.0  
                        else:
                            atom[0] -= e/2.0
                    if "odd" in z_displ:
                        atom[0] -= e/2.0
                        atom[1] += df
    
                    if ctype == "sphere_hex_ab":
                        message = vec_in_sphere(atom, size, skin)
                    elif ctype == "parabolid_ab":
                        # size = height, skin = diameter
                        message = vec_in_parabole(atom, size, skin)          
              
                    if message[0] == True and message[1] == True:
                        atom_add = CLASS_atom_cluster_atom(atom)
                        ATOM_CLUSTER_ALL_ATOMS.append(atom_add)
                        atom_number_total += 1
                        atom_number_drawn += 1
                    if message[0] == True and message[1] == False:
                        atom_number_total += 1  
              
                if "even" in y_displ:
                    y_displ = "odd"
                else:
                    y_displ = "even"
    
            y_displ = "even"
            if "even" in z_displ:
                z_displ = "odd"
            else:
                z_displ = "even"
    
    
    Clemens Barth's avatar
     
    Clemens Barth committed
        print("Atom positions calculated")
    
    
        return (atom_number_total, atom_number_drawn)
    
    
    def create_square_lattice(ctype, size, skin, lattice):
    
        atom_number_total = 0
        atom_number_drawn = 0
        
        if ctype == "parabolid_square":
            # size = height, skin = diameter
            number_k = int(size/(2.0*lattice))
            number_j = int(skin/(2.0*lattice)) + 5
            number_i = int(skin/(2.0*lattice)) + 5
        else:
            number_k = int(size/(2.0*lattice))
            number_j = int(size/(2.0*lattice))
            number_i = int(size/(2.0*lattice))       
    
    
        for k in range(-number_k,number_k):
            for j in range(-number_j,number_j+1):
                for i in range(-number_i,number_i+1):
    
                    atom = Vector((float(i),float(j),float(k))) * lattice 
    
                    if ctype == "sphere_square":
                        message = vec_in_sphere(atom, size, skin)
                    elif ctype == "pyramide_square":
                        message = vec_in_pyramide_square(atom, size, skin)
                    elif ctype == "parabolid_square":
                        # size = height, skin = diameter
                        message = vec_in_parabole(atom, size, skin)          
                    elif ctype == "octahedron":
                        message = vec_in_octahedron(atom, size, skin)            
                    elif ctype == "truncated_octahedron":
                        message = vec_in_truncated_octahedron(atom,size, skin)
    
                    if message[0] == True and message[1] == True:
                        atom_add = CLASS_atom_cluster_atom(atom)
                        ATOM_CLUSTER_ALL_ATOMS.append(atom_add)
                        atom_number_total += 1
                        atom_number_drawn += 1
                    if message[0] == True and message[1] == False:
                        atom_number_total += 1 
    
    
    Clemens Barth's avatar
     
    Clemens Barth committed
        print("Atom positions calculated")
    
    
        return (atom_number_total, atom_number_drawn)