Honeycomb Structures and Resolution in FEM

AI Thread Summary
The discussion centers on an engineering student's challenges with implementing wave propagation in honeycomb structures using Python, specifically through the finite element method (FEM) and Bloch's theory. The student has self-taught the concepts but lacks formal education in these areas, leading to difficulties in achieving accurate results. They provided a code snippet that initializes mass and stiffness matrices but noted that their results differ significantly from established research. The student seeks suggestions or assistance to improve their implementation and achieve more reliable outcomes. Overall, the thread highlights the complexities of applying FEM to periodic structures and the need for guidance in mastering these advanced topics.
ShashankanB
Messages
1
Reaction score
0
TL;DR Summary
I struggle to implement the perturbation of a wave in a Honeycomb structure : i can't have the results which can be find on internet.
Hi,
I am a engineering student and I am in apprenticeship with a mechanics lab : I am studying about Honeycomb propagation and periodic structures. I hadn't have any courses in FEM or in Bloch's theory, I've done all by myself : but there is the problem, i didn't practice or use viable courses. I tired to implement the propagation in 2D of a wave in these honeycombs, with the following code in Python :

[CODE lang="python" title="Honeycomb wave propagation (function names are in french)"]from Matrices import mass_matrix,stiffness_matrix
from Maillage import Elements_decoupe_unique
from Maillage import Affiche_elements_decoupe as AED
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import eig

rayon = 0.01
element = Elements_decoupe_unique(2, 1, rayon, opt = False, offset = True)
periode = np.array([element[5]] + [element[7]] + [element[3]] + [element[6]] + [element[4]])
nb = len(periode) #Nombre d'elements
nn = nb + 1 #Nombre de noeuds

#Initialisation
h = rayon*np.array([0.5,0.5,0.5,0.5,1])
K = np.zeros((2*len(h)+2,2*len(h)+2)) #Matrice de Raideur
F = np.zeros(2*len(h)+2) #Matrice des forces
M = np.zeros((2*len(h)+2,2*len(h)+2)) #Matrice des masses

L = np.sqrt((periode[0,1] - periode[1,1])[0] ** 2 + (periode[0,1] - periode[1,1])[1] ** 2)
#Valeurs tabulées
E = 71e9
I_zz = 1e-6
r = 2700
s = 1e-4

for i in range(len(h)):
K[i*2 : 2*i + 4,2*i : 2*i + 4] += stiffness_matrix(E,I_zz,h)
M[i*2 : 2*i + 4,2*i : 2*i + 4] += mass_matrix(r,s,h)

def Porpagation2D():
"""
Effectue la méthode de Bloch-Floquet sur un maillage hexagonal avec une perturbation bidimensionnelle

Argument :

Retoune:
- plot : affichage de la courbe de dispersion

"""
a = h[-1]
t0,L0 = 0.005, rayon
w0 = np.pi**2*t0/L0**2*np.sqrt(E/(12*r))

# Reciprocal lattice basis vectors
b1 = (2 * np.pi / a) * np.array([1, -1 / np.sqrt(3)])
b2 = (2 * np.pi / a) * np.array([0, 2 / np.sqrt(3)])

# Define high-symmetry points in reduced coordinates
P_G = np.array([0, 0])
P_K = np.array([2/3, 1/3])
P_M = np.array([1/2, 0])

# Chemin de la zone de Brillouin
num_points = 100
path = np.vstack([
np.linspace(P_G, P_K, num_points),
np.linspace(P_K, P_M, num_points),
np.linspace(P_M, P_G, num_points)
])


kx_ky = path @ np.array([b1, b2])
omega_values = np.zeros((len(kx_ky), 2 * nn), dtype=complex)
for i,(k1, k2) in enumerate(kx_ky):
# Construct the transformation matrix T
T = np.eye(2 * nn, dtype = complex)

T[0,2] = np.exp(1j*(k1*L))
T[1,3] = np.exp(1j*(k1*L))
T[2,0] = np.exp(-1j*(k1*L))
T[3,1] = np.exp(-1j*(k1*L))

T[4,6] = np.exp(1j*(k2*L*np.sqrt(3)/2 + k1*L/2))
T[5,7] = np.exp(1j*(k2*L*np.sqrt(3)/2 + k1*L/2))
T[6,4] = np.exp(-1j*(k2*L*np.sqrt(3)/2 + k1*L/2))
T[7,5] = np.exp(-1j*(k2*L*np.sqrt(3)/2 + k1*L/2))

K_transformed = np.dot(np.conj(T).T, np.dot(K, T))
M_transformed = np.dot(np.conj(T).T, np.dot(M, T))

eigenvalues, _ = eig(K_transformed, M_transformed)
omega_values[i, :] = np.sqrt(eigenvalues)/w0

distances = np.sqrt(np.sum(np.diff(kx_ky, axis=0) ** 2, axis=1))
k_path = np.insert(np.cumsum(distances), 0, 0)
for i in range(omega_values.shape[1]):
plt.plot(k_path, np.real(omega_values[:, i]),'.', lw = 0, ms = 5, c = 'black')

plt.grid()
plt.xlabel(r"Vecteur d'onde réduit (k) $m^{-1}$")
plt.xticks([0, k_path[num_points-1], k_path[2*num_points-1], k_path[-1]], ["Γ", "K", "M", "Γ"])
plt.ylabel(r"Pulsation temporelle normalisée ($\Omega$) rad/s ")
plt.title("Courbe de dispersion")
plt.show()

Porpagation2D()[/CODE]

But the result is absurd (left, mine and right from a research paper):
1741268410707.png
VS
1741268425774.png

If you have any suggestion or help, I am thanking you in advance,

P.S. : Please don't mind any English errors.
 
How did you find PF?: Via Google search Hi, I have a vessel I 3D printed to investigate single bubble rise. The vessel has a 4 mm gap separated by acrylic panels. This is essentially my viewing chamber where I can record the bubble motion. The vessel is open to atmosphere. The bubble generation mechanism is composed of a syringe pump and glass capillary tube (Internal Diameter of 0.45 mm). I connect a 1/4” air line hose from the syringe to the capillary The bubble is formed at the tip...
Thread 'Physics of Stretch: What pressure does a band apply on a cylinder?'
Scenario 1 (figure 1) A continuous loop of elastic material is stretched around two metal bars. The top bar is attached to a load cell that reads force. The lower bar can be moved downwards to stretch the elastic material. The lower bar is moved downwards until the two bars are 1190mm apart, stretching the elastic material. The bars are 5mm thick, so the total internal loop length is 1200mm (1190mm + 5mm + 5mm). At this level of stretch, the load cell reads 45N tensile force. Key numbers...
I'd like to create a thread with links to 3-D Printer resources, including printers and software package suggestions. My motivations are selfish, as I have a 3-D printed project that I'm working on, and I'd like to buy a simple printer and use low cost software to make the first prototype. There are some previous threads about 3-D printing like this: https://www.physicsforums.com/threads/are-3d-printers-easy-to-use-yet.917489/ but none that address the overall topic (unless I've missed...
Back
Top