*==========================================================
*
* Simulation de torsion et/ou traction d'un cylindre
* en fatigue
* stage Bowen LIU (ENSTAPARISTECH) ete 2022
* revu jk148537 automne 2024
*==========================================================

opti dime 3 elem cub8 echo 1;
graph = faux ;

*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*   Fonctions personnalisées
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*   Indice du point de gauss qui a la valeur maximale pour
*   un critère : 
*   indice = ind_max(mchaml de fatigue,
*                    critère utilisé
*                    nombre de points)

debp ind_max mc*mchaml critere*mot nbpt*entier ;    
*   Position actuelle
    pos = 1 ;
*   Position où la valeur est maximale
    pos_max = 1 ;
*   Initialisation de la comparaison
    val_max = extr mc critere 1 1 1 ; 
    
    repeter etape nbpt ;
*       Valeur actuelle
        val = extr mc critere 1 1 pos ;

*       Mettre à jour l'indice et la valeur si une plus 
*       grande valeur est trouvée.
        si (val >eg val_max);
            pos_max = pos ;
            val_max = val ;
        finsi;
        
        pos = pos + 1 ;
        
    fin etape ;
        
finp pos_max ;
        

*==========================================================
*   Construction de l'éprouvette
*==========================================================

* Nombre d'éléments
*   Nombre circulaire
nc = 20 ;
* nc = 30 ;
nc = 10 ;

*   Nombre de hauteur
nh = 100 ;
 nh = 50 ;

* Géométrie (en m)
p0 = 0. 0. 0. ;
p1 = 0.01 0. 0.;
p2 = 0. 0.01 0. ;
p3 = -0.01 0. 0. ;
p4 = 0. -0.01 0. ;
h = 0. 0. 0.2 ;
r1 = 1.d-2 ;

* Arc "supérieure" passant par p1 p2 p3
arc1 = cerc nc 'PASS' p1 p2 p3 ;
* Arc "inférieure"
arc2 = cerc nc 'PASS' p3 p4 p1 ;
* Deux arcs pour former un cercle
s = (arc1 et arc2) ;

* Section inférieure du cylindre
*   Plane : maillage d'une surface en cas de 3D
sec_inf = surf plane s;

p00 = point sec_inf proc p0 ;
depl p00 moins p00 ;

si (graph) ;
    trac sec_inf ;
finsi ;

cylindre = sec_inf volu tran h nh;

si (graph) ;
     trac cach cylindre titr 'Cylindre' ;
finsi ;

*==========================================================
*   Définition du matériau
*==========================================================

* Comportement élastique linéaire isotrope
mo1 = mode cylindre mecanique elastique isotrope ;
ma1 = mate mo1 youn 2.e11 nu 0.3 ;

* Limite d'endurance en fatigue selon TD4
*   m1 = moins 1
fm1 = 410.e6 ;
*f0 = 376.e6 ;
tm1 = 260.e6 ;

*==========================================================
*   Définition du chargement
*==========================================================

*==========================================================
*   Conditions aux limites

* Points de la surface supérieure
sec_sup = (cylindre coor 3) point maxi ;

* Conditions limites

*   Mouvement selon uz de la surface inférieure
cl_inf = bloq uz sec_inf ;

*   Blocage de la surface supérieure
p1h = point sec_sup proc (p1 plus h) ;
p2h = point sec_sup proc (p2 plus h) ;
p3h = point sec_sup proc (p3 plus h) ;
p4h = point sec_sup proc (p4 plus h) ;
cl_sup = bloq depl sec_sup ;
cl_sup = (bloq uz sec_sup) et (bloq (p1h et p3h) uy) et 
       (bloq (p2h et p4h) ux);
       
*==========================================================
*   Liste de chargement
       
* Angle de décalage entre la torsion et la traction
*   sig_xy(t) = Ta * cos(t)
*   sig_11(t) = Siga * cos(t + decalage)
decalage = 90. ;

* Liste d'étape
*   Valeur d'abscisse initiale
abs0 = prog -15. ;

*   Amplitude initiale
amp0 = prog 0. ; 

*   Axe x original (0 15 30 ... 360)
abs1 = prog 0. pas 15. 360. ;

*   Amplitude originale de la torsion
amp_tor = cos abs1 ;
amp_t2 = abs (amp_tor) ;

*   Amplitude originale de la traction
amp_tra = cos (abs1 + decalage) ;

*   Ajout de l'étape initiale
abs1 = abs0 et abs1 ;
amp_tor = amp0 et amp_tor ; amp_t2 = amp0 et amp_t2 ;
amp_tra = amp0 et amp_tra ;

*==========================================================
*   Torsion



t3 = acos (1. - 2.d-4) ; xt3 = r1 * (1. - (cos t3)) ; yt3 = r1 * (sin t3) ;
mess 't3 : ' t3 ;

bl_P1_x = bloq p1 ux ; bl_P1_y = bloq P1 uy ;
bl_P3_x = bloq p3 ux ; bl_P3_y = bloq P3 uy ;

ch_P1_x = depi bl_P1_x (xt3 * (-1.))  ; ch_P1_y = depi bl_P1_y yt3 ;
ch_P3_x = depi bl_P3_x  xt3           ; ch_P3_y = depi bl_P3_y (yt3 * (-1.)) ;

* Evolution des points x axe abs1 et y axe (prog...)
ev_tor = evol manu abs1 amp_tor ;
ev_t2 = evol manu abs1 amp_t2 ;

si (graph) ;
    titr 'Torsion' ;
    dess (ev_tor et (ev_t2 coul jaune)) ;
finsi ;



*==========================================================
*   Traction

* Traction

bl_z = bloq sec_inf uz ;
chp_inf = depi bl_z -2.e-4 ;
    
* Evolution des points x axe abs1 et y axe (prog...)
ev_tra = evol manu abs1 amp_tra ;

si (graph) ;
    titr 'Traction' ;
    dess ev_tra ;
finsi;

*==========================================================
*   Application du chargement
*==========================================================

* Chargement de la torsion : amplitude * variation en temps
ctor = (char dimp ev_t2 (ch_P1_x et ch_P3_x))
     et (char dimp ev_tor (ch_P1_y et ch_P3_y)) ;


* Chargement de la traction
ctra = char dimp ev_tra chp_inf ;

* Routine pas a pas
trasi = table 'pasapas' ;
trasi.modele = mo1 ;
trasi.caracteristiques = ma1;
trasi.blocages_mecaniques = cl_sup ;
trasi.blocages_mecaniques = cl_sup et bl_z et bl_P1_x et bl_P3_x et bl_P1_y et bl_P3_y;
trasi.chargement = ctor et ctra ;
trasi.temps_calcules = abs1 ;

pasapas trasi ;

* Analyser graphiquement les résultats d'une table pasapas
si (graph) ;
    titr 'Exploration' ;
    explorer trasi ;
finsi;
*==========================================================
*   Tableau de dessin pour Sines, Crossland et Deperrois

* Chargement en X
tab_dess = 'TABLE' ;
tab_dess.1 = mot 'MARQ CROI' ;

*==========================================================
*   Extraire l'élément à étudier

* Définir un point proche de la surface latérale
mx = 1.1 * (coor 1 p1) ;
mz = (coor 3 h) / 2. ;
m = mx 0. mz ;

* Un point sur la surface du cylindre
m_cylin = cylindre poin proc m ;

* Elément contenant ce point
el_cylin = cylindre elem contenant m_cylin;

* Nombre de point de gauss de cet élément
nbpg = nbno el_cylin ;

mo_el = redu mo1 el_cylin ;


si (graph) ;
    titr 'Element choisi' ;
    trac el_cylin ;
    trac mo_el (redu trasi . contraintes . 2 mo_el) ;
finsi;

*==========================================================
*   Comparaison avec les critères de fatigue
*==========================================================

* Supprimer l'étape initiale
*   Nombre d'étapes "effectives" par DIMEsion d'une liste
mess (dime trasi . contraintes) ;
nb = (dime trasi . temps) - 1  ;

*   Une boucle pour mettre à jour les deux listes
*       Position dans la liste destinataire
pos_des = 0 ;

repeter etape nb ;
*       Position dans la liste originale
    pos_ori = pos_des + 1 ;

*       Décalage d'une étape vers l'arrière    
    trasi.temps.pos_des = trasi.temps.pos_ori ;
    trasi.contraintes.pos_des = redu trasi.contraintes.pos_ori mo_el;

*       Prochaine position
    pos_des = pos_des + 1 ;
    
fin etape ;

* CHargement SImple 1    
chasi1 = char trasi.temps trasi.contraintes ;
*graph = vrai ;
*==========================================================
*   Critère de Dang Van

beta_dv = tm1 ;
alpha_dv = (tm1 - (fm1 / 2)) / (fm1 / 3) ;

* alpha = alpha_dv beta = beta_dv
cafa_dv = manu chml mo_el 'ADVK' (-1. * alpha_dv) 'BDVK' beta_dv
    type 'caracteristiques' stresses ;
* CHargement FAtigue Dang Van
chfa_dv = FATI mo_el chasi1 cafa_dv 'DVKP' ;
* Réduire le résultat au élément à étudier
chfa_dv = redu chfa_dv el_cylin ;
* Indice où la valeur est maximale
ind_dv = ind_max chfa_dv dvkp nbpg;
* VALeur de Dang Van
val_dv = extr chfa_dv dvkp 1 1 ind_dv ;
* TRAJectoir Dang Van
traj_dv = extr chfa_dv 'PTAU' 1 1 ind_dv ;

opti echo 0 ;
mess ' ' ;
mess '##################################################' ;
mess '# Critère de Dang Van :' ;
mess '# alpha = ' alpha_dv ' beta = ' beta_dv ;
mess '# Cast3m donne : ' val_dv ;
mess '##################################################' ;
mess ' ' ;
opti echo 1 ;

si (graph) ;
    titr 'Dang Van' ;
    dess traj_dv posx 'EXCE' posy 'EXCE' ;
finsi;

* 11/2024 Cast3m donne :
v0_dv = 1.16725E-02 ;
 er1 = abs((v0_dv - val_dv)/v0_dv) ;
*==========================================================
* Critère de Papadopoulos

beta_pa = tm1 ;
alpha_pa = (tm1 - (fm1 / 1.732)) / (fm1 / 3) ;

cafa_pa = manu chml mo_el 'APAP' (-1. * alpha_pa) 'BPAP' beta_pa
    type 'caracteristiques' stresses ;

chfa_pa = FATI mo_el chasi1 cafa_pa 'PAPA';

chfa_pa = redu chfa_pa el_cylin ;

ind_pa = ind_max chfa_pa papa nbpg;

val_pa = extr chfa_pa papa 1 1 ind_pa ;
traj_pa = extr chfa_pa ptau 1 1 ind_pa ;

opti echo 0 ;
mess ' ' ;
mess '##################################################' ;
mess '# Critère de Papadopoulos :' ;
mess '# alpha = ' alpha_pa ' beta = ' beta_pa ;
mess '# Cast3m donne : ' val_pa ;
mess '##################################################' ;
mess ' ' ;
opti echo 1 ;
* 11/2024 v0_pa = 6.26156E-03
si (graph) ;
    titr 'Papadopoulos' ;
    dess traj_pa posx 'EXCE' posy 'EXCE' ;
finsi;

*==========================================================
*   Critère de Sines

* Détermination de f0 à partir de tm1 et fm1 par Dang Van
f0 = (2 * tm1 * fm1) / (4 * tm1 - fm1) ;

beta_si = tm1 ;
alpha_si = (tm1 - (f0 / 1.732)) / (f0 / 3) ;

cafa_si = manu chml mo_el 'ASIN' (-1. * alpha_si) 'BSIN' beta_si
    type 'caracteristiques' stresses ;

chfa_si = FATI mo_el chasi1 cafa_si 'SINE' ;

chfa_si = redu chfa_si el_cylin ;

ind_si = ind_max chfa_si sine nbpg;

val_si = extr chfa_si sine 1 1 ind_si ;
traj_si = extr chfa_si ptau 1 1 ind_si ;

si (graph) ;
    titr 'Sines' ;
    dess traj_si tab_dess posx 'EXCE' posy 'EXCE' ;
finsi ;
    
opti echo 0 ;
mess ' ' ;
mess '##################################################' ;
mess '# Critère de Sines :' ;
mess '# Attention ! ' ;
mess '# - f0 est ici est approximé à partir des ' ;
mess '#   coefficients du critère de Dang Van !' ;
mess '# ' ;
mess '# alpha = ' alpha_si ' beta = ' beta_si ;
mess '# Cast3m donne : ' val_si ;
mess '##################################################' ;
mess ' ' ;
opti echo 1 ;
* 11/2024 v0_si = -6.76817E-02
*==========================================================
*   Critère de Crossland

beta_cr = tm1 ;
alpha_cr = (tm1 - (fm1 / 1.732)) / (fm1 / 3) ;

cafa_cr = manu chml mo_el 'ACRO' (-1. * alpha_cr) 'BCRO' beta_cr
    type 'caracteristiques' stresses ;
    
chfa_cr = FATI mo_el chasi1 cafa_cr 'CROS' ;

chfa_cr = redu chfa_cr el_cylin ;

ind_cr = ind_max chfa_cr cros nbpg;

val_cr = extr chfa_cr cros 1 1 ind_cr ;
traj_cr = extr chfa_cr ptau 1 1 ind_cr ;

si (graph) ;
    titr 'Crossland' ;
    dess traj_cr tab_dess posx 'EXCE' posy 'EXCE' ;
finsi ;

opti echo 0 ;
mess ' ' ;
mess '##################################################' ;
mess '# Critère de Crossland :' ;
mess '# alpha = ' alpha_cr ' beta = ' beta_cr ;
mess '# Cast3m donne : ' val_cr ;
mess '##################################################' ;
mess ' ' ;
opti echo 1 ;
* 11/2024 v0_cr = 6.26156E-03    
*==========================================================
*   Critère de Deperrois (à vérifier s'il existe)

beta_dc = tm1 ;
alpha_dc = (tm1 - (fm1 / 1.732)) / (fm1 / 3) ;

cafa_dc = manu chml mo_el 'A_DC' (-1. * alpha_dc) 'B_DC' beta_dc
    type 'caracteristiques' stresses ;

chfa_dc = FATI mo_el chasi1 cafa_dc 'DC' ;

chfa_dc = redu chfa_dc el_cylin ;

ind_dc = ind_max chfa_dc dc nbpg;

val_dc = extr chfa_dc dc 1 1 ind_dc ;
traj_dc = extr chfa_dc ptau 1 1 ind_dc ;

si (graph) ;
    titr 'Deperrois' ;
    dess traj_dc tab_dess posx 'EXCE' posy 'EXCE' ;
finsi ;
    
opti echo 0 ;
mess ' ' ;
mess '##################################################' ;
mess '# Critère de Deperrois :' ;
mess '# alpha = ' alpha_dc ' beta = ' beta_dc ;
mess '# Cast3m donne : ' val_dc ;
mess '##################################################' ;
mess ' ' ;
opti echo 1 ;

* 11/2024 Cast3m donne :
v0_dc = 9.69946E-02 ;
er5 = abs((v0_dc - val_dc)/v0_dc) ;
 si ((er1 < 0.05 ) et (er5 < 0.05)) ;
     erre 0 ;
sinon ;
    erre 5 ;
finsi ;

    
*opti donn 5 ;


fin;
 

 

