Elements de réduction d'un tenseur de contraintes

Soyez le premier à donner votre avis sur cette source.

Vue 1 651 fois - Téléchargée 132 fois

Description


Derrière ce truc peu bandant se cache un outil qui peut intéresser les ingénieurs
Mécaniciens spécialistes de la Mécanique des Fluides et/ou de la Mécanique des
milieux continus en général.

Le tenseur des contraintes étant représenté par une matrice symétrique, seuls
6 paramètres indépendants sont à rentrer: ceux de la diagonale, et les 3 autres
suivant la notation du tenseur déroulé.

En retour, ce script fournit les 3 contraintes principales, et, cerise sur le
gâteau, les 3 vecteurs unitaires propres associés.

En espérant que cet outil puisse servir au moins à une personne autre que moi.

Bien à vous,

<head><title>Calcul des éléments de réduction d'un tenseur de contraintes</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type=text/javascript>

function deter(M) {
return M[0]*(M[4]*M[8]-M[7]*M[5])-M[1]*(M[3]*M[8]-M[5]*M[6])+M[2]*(M[3]*M[7]-M[4]*M[6]);
}

function notinv(A,Eps) {
var M=new Array();

M[0]=A[0]; M[1]=A[5]; M[2]=A[4]; M[4]=A[1]; M[5]=A[3]; M[8]=A[2]; M[3]=M[1]; M[6]=M[2]; M[7]=M[5];

return (Math.abs(deter(M))<Eps) 
}

function vecp(M,Mu,Eps) {
var delta,S;
var U=new Array();
var W=new Array();
var A1,A2,A3,A4,B1,B2;

M[0] -= Mu; M[1] -= Mu; M[2] -= Mu;

if (!notinv(M,Eps)) { alert('Ca ne va pas!!'); return; }

A1= M[5]*M[5]+M[1]*M[1]+M[3]*M[3];
A2= M[5]*M[4]+M[1]*M[3]+M[3]*M[2];
A3= A2;
A4= M[4]*M[4]+M[3]*M[3]+M[2]*M[2];

B1= M[5]*M[0]+M[1]*M[5]+M[3]*M[4];
B2= M[4]*M[0]+M[3]*M[5]+M[2]*M[4];

if (Math.abs(delta=A1*A4-A2*A3) > Eps) {
W[0] = 1;
W[1]= (A2*B2 - B1*A4 ) / delta;
W[2]= (A3*B1 - B2*A1) / delta;
} 
else { 
A1= M[0]*M[0]+M[5]*M[5]+M[4]*M[4];
A2= M[0]*M[4]+M[5]*M[3]+M[4]*M[2];
A3 = A2;
A4= M[4]*M[4]+M[3]*M[3]+M[2]*M[2];

B1= M[0]*M[5]+M[5]*M[1]+M[4]*M[3];
B2= M[4]*M[5]+M[3]*M[1]+M[2]*M[3];

if (Math.abs(delta=A1*A4-A2*A3) > Eps) {
W[0] = (A2*B2 - B1*A4) / delta;
W[1]= 1;
W[2]= (A3*B1 - B2*A1) / delta;
}  else { 
A1= M[0]*M[0]+M[5]*M[5]+M[4]*M[4];
A2= M[0]*M[5]+M[5]*M[1]+M[4]*M[3];
A3 = A2;
A4= M[5]*M[5]+M[1]*M[1]+M[3]*M[3];

B1= M[0]*M[4]+M[5]*M[3]+M[4]*M[2];
B2= M[5]*M[4]+M[1]*M[3]+M[3]*M[2];

if (Math.abs(delta=A1*A4-A2*A3) > Eps) {
W[0] = (A2*B2 - B1*A4) / delta;
W[1]= (A3*B1 - B2*A1) / delta;
W[2]= 1;
  } else alert( "Matrice nulle?\n") 
 } 
}
S=Math.sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]);
U[0]=W[0]/S;
U[1]=W[1]/S;
U[2]=W[2]/S;

M[0] += Mu; M[1] += Mu; M[2] += Mu;

return U
}

function traite() {
var x1,x2,x3;

var B4= f.s11.value;
var C5= f.s22.value;
var D6= f.s33.value;
var D5= f.s23.value;
var D4= f.s13.value;
var C4= f.s12.value;

var Vm= Math.sqrt((B4-C5)*(B4-C5)+(C5-D6)*(C5-D6)+(D6-B4)*(D6-B4)+6*(C4*C4+D4*D4+D5*D5))/Math.sqrt(2);

var X3= -1;
var X2= B4*1+C5*1+D6*1;
var X1= D4*D4+D5*D5+C4*C4-B4*C5-B4*D6-C5*D6;
var X0= 2*D4*C4*D5-D4*D4*C5-D5*D5*B4-C4*C4*D6+B4*C5*D6;

var C43= X2/X3;
var C44= X1/X3;
var C45 = X0/X3;

var C47= C44-C43*C43/3;
var F47= C45-C44*C43/3+2*C43*C43*C43/27; 
var C49= 4*C47*C47*C47/27+F47*F47;
// if (C49<0) E49= -1; else if (C49>0) E49=1; else E49=0;

var C60= Math.acos(3*F47/2/C47*Math.sqrt(-3/C47))/3;

if (C49<0) { // Il y a 3 solutions réelles

x1= Math.sqrt(-4*C47/3)*Math.cos(C60)-C43/3;
x2= Math.sqrt(-4*C47/3)*Math.cos(C60+2*Math.PI/3)-C43/3;
x3= Math.sqrt(-4*C47/3)*Math.cos(C60+4*Math.PI/3)-C43/3;
}

else if (C49>0) { // Il n'y a qu'une seule solution réelle

var B53= (Math.sqrt(C49)-F47)/2;
var B54= -(F47+Math.sqrt(C49))/2;

x1= Math.exp(Math.log(Math.abs(B53))/3)*signe(B53)+Math.exp(Math.log(Math.abs(B54))/3)*signe(B54)-C43/3;
x2= '';
x3= '';
}

else { // Il y a 2 solutions réelles
x1= Math.exp(Math.log(Math.abs(F47/2))/3)*signe(-F47)*2-C43/3;
x2= -Math.exp(Math.log(Math.abs(F47/2))/3)*signe(-F47)-C43/3;
x3= '';
}

document.getElementById("vm").innerHTML = Math.round(Vm*1000)/1000;
document.getElementById("vap1").innerHTML = x1!=''? Math.round(x1*100000)/100000 : 'Pas de solution';
document.getElementById("vap2").innerHTML = x2!=''? Math.round(x2*100000)/100000 : 'Pas de solution';
document.getElementById("vap3").innerHTML = x3!=''? Math.round(x3*100000)/100000 : 'Pas de solution';

var A=new Array(B4,C5,D6,D5,D4,C4);
U= vecp(A,x1,1e-5);

document.getElementById("vep1").innerHTML = Math.round(U[0]*100000)/100000;
document.getElementById("vep2").innerHTML = Math.round(U[1]*100000)/100000;
document.getElementById("vep3").innerHTML = Math.round(U[2]*100000)/100000;

var A=new Array(B4,C5,D6,D5,D4,C4);
V= vecp(A,x2,1e-5);

document.getElementById("vep4").innerHTML = Math.round(V[0]*100000)/100000;
document.getElementById("vep5").innerHTML = Math.round(V[1]*100000)/100000;
document.getElementById("vep6").innerHTML = Math.round(V[2]*100000)/100000;

var A=new Array(B4,C5,D6,D5,D4,C4);
W= vecp(A,x3,1e-5);

document.getElementById("vep7").innerHTML = Math.round(W[0]*100000)/100000;
document.getElementById("vep8").innerHTML = Math.round(W[1]*100000)/100000;
document.getElementById("vep9").innerHTML = Math.round(W[2]*100000)/100000;

return false;
}

function verifvap(A,L) { // Vérifie si L est bien une valeur propre de A. Ne sert pas.

A[0]-= L; A[1]-= L; A[2] -= L;

return notinv(A,1e-5);
}

function signe(x) {
return x>0? 1 : x<0? -1 : 0;
}

</script></head>

<body><br><br><form onsubmit="return traite()" name=f>
<center><table border=0>
<tr><td>Sigma 1.1 <td><input name=s11 value=-1021>
<tr><td>Sigma 2.2 <td><input name=s22 value=8.275>
<tr><td>Sigma 3.3 <td><input name=s33 value=1383.4>
<tr><td>Sigma 2.3 <td><input name=s23 value=0.65566>
<tr><td>Sigma 1.3 <td><input name=s13 value=4.8896>
<tr><td>Sigma 1.2 <td><input name=s12 value=27.672>
<tr><td colspan=2 align=middle><br><input type=submit>
</table>
<br><table border=1 width=70%>
<tr><td colspan=3>Max Stress Von-Misès: <td colspan=4><div id=vm></div>
<tr><td colspan=1>Contraintes principales<td colspan=6>Vecteurs propres
<tr><td>Max principal 1: <td><div id=vap1></div> <td>(<td><div id=vep1></div><td><div id=vep2></div><td><div id=vep3></div><td>)
<tr><td>Max principal 2: <td><div id=vap2></div> <td>(<td><div id=vep4></div><td><div id=vep5></div><td><div id=vep6></div><td>)
<tr><td>Max principal 3: <td><div id=vap3></div> <td>(<td><div id=vep7></div><td><div id=vep8></div><td><div id=vep9></div><td>)
</table></center></body>

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

cs_Averell
Messages postés
48
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 juin 2016

vous n'êtes pas obligé de ne pas me dire qu'on peut faire la même chose avec la fonction eig() de Matlab. Sauf que tout le monde n'a pas Matlab :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.