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.
 
Thread 'What type of toilet do I have?'
I was enrolled in an online plumbing course at Stratford University. My plumbing textbook lists four types of residential toilets: 1# upflush toilets 2# pressure assisted toilets 3# gravity-fed, rim jet toilets and 4# gravity-fed, siphon-jet toilets. I know my toilet is not an upflush toilet because my toilet is not below the sewage line, and my toilet does not have a grinder and a pump next to it to propel waste upwards. I am about 99% sure that my toilet is not a pressure assisted...
After over 25 years of engineering, designing and analyzing bolted joints, I just learned this little fact. According to ASME B1.2, Gages and Gaging for Unified Inch Screw Threads: "The no-go gage should not pass over more than three complete turns when inserted into the internal thread of the product. " 3 turns seems like way to much. I have some really critical nuts that are of standard geometry (5/8"-11 UNC 3B) and have about 4.5 threads when you account for the chamfers on either...
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...
Back
Top