98 sprintf(fichier,
"%s/.magic",getenv(
"HOME"));
101 char c=(param.
get_nom(
"Separateur_decimale").c_str())[0];
105 int MG_CALCUL_FATIGUE::cycle_jump(
MG_GESTIONNAIRE &gest,
MG_GEOMETRIE *geo,
int &Njump,
char *fichierparam,
int numchamps,
int N,
int niveaumax,
char *file,std::vector<FEM_ELEMENT3*> *lst,std::vector<double>& tableau_D,
int nombre_classe,
double &max_damage_element,FILE *strength,
double x,
double y,
double z,
char *fichiercalcul,
int pos,
double val_pos,
int num_noeud)
107 double alpha,beta,epsilonint,sigma,
epsilon,D,E,val_CM,varD,coef1,coef2,coef3,coef4,coef5,rapport,sigmamax,Njump_Gauss,deltaD,coef_model;
108 int nomb,l,coord,col1,s,ll,l1,lo;
116 parametre->
lire(fichiercalcul);
117 sigmamax= parametre->
get_valeur((
char*)
"sigmamax");
120 epsilonint= parametre->
get_valeur((
char*)
"epsilonint");
126 FILE *coefficient_optim = NULL;
127 coefficient_optim= fopen((
char*)
"resistance.coe",
"r");
128 while (fgets(ligne,100,coefficient_optim) !=NULL)
130 sscanf (ligne,
"%s %lf",ligne1,&coef_model);
134 fclose(coefficient_optim);
141 param_aster.
lire(fichierparam);
144 LISTE_FEM_ELEMENT3::iterator it;
146 int nombre_Gauss_max=15;
147 std::vector<double> tableau_Njump_Gauss;
148 std::vector<double> tableau_varD;
149 std::vector<double> tableau_freq;
150 int taille=element*nombre_Gauss_max;
151 tableau_Njump_Gauss.reserve(taille);
152 tableau_varD.reserve(taille);
153 tableau_freq.reserve(taille);
157 unsigned long id1=ele->get_id();
159 for (
int r=0;r<nbgauss;r++)
166 else {D=tableau_D[s];}
167 double valeur=sol->
lire(l,numchamps,coord,r);
169 rapport=fabs(valeur/sigmamax);
172 varD=coef[0]*rapport*exp(-coef[1]*(D/
sqrt(rapport)))+coef[2]*D*pow(rapport,coef[3]);
174 tableau_varD[s]=varD;
193 Njump_Gauss=round(deltaD/varD);
194 tableau_Njump_Gauss[s]=Njump_Gauss;
202 fprintf(strength,
"%d %lf\n",N,valeur_element);
208 double max_Njump_Gauss,freq_relative,freq_cumulative,low_freq,classe;
215 if(tableau_Njump_Gauss[j]>co1)
217 max_Njump_Gauss=tableau_Njump_Gauss[j];
218 co1=tableau_Njump_Gauss[j];
227 classe=max_Njump_Gauss/nombre_classe;
230 for(
int m=0;
m<nombre_classe;
m++)
233 for(
int jj=0;jj<s;jj++)
235 if (((classe*
m)<=tableau_Njump_Gauss[jj]) && (tableau_Njump_Gauss[jj]<(classe*(
m+1))))
239 if ((
m==nombre_classe-1) && (tableau_Njump_Gauss[jj]==max_Njump_Gauss))
245 freq_relative=(double)nomb_jump/s;
246 freq_cumulative=freq_cumulative+freq_relative;
247 tableau_freq[
m+1]=freq_cumulative;
249 low_freq=0.1*freq_cumulative;
250 for(
int m=0;
m<nombre_classe;
m++)
252 if ((low_freq>tableau_freq[
m]) && (low_freq<tableau_freq[
m+1]))
254 Njump=(int)round(((
m+1)*classe)-((tableau_freq[
m+1]-low_freq)*((((
m+1)*classe)-(
m*classe))/(tableau_freq[
m+1]-tableau_freq[
m])))+1);
258 double damage_element,co2,co3,min_damage_element;
264 sprintf(message1,
"endommagement.sol");
265 sprintf(message2,
"Nom");
268 std::vector<DAMAGE_FEM3*> lst_damage_fem3;
272 for (
int r=0;r<nbgauss;r++)
274 tableau_D[n]=tableau_D[n]+(tableau_varD[n]*Njump);
275 sol1->
ecrire(tableau_D[n],ll,0);
279 if(damage_element>co2)
281 max_damage_element=damage_element;
286 max_damage_element=co2;
288 if(damage_element<co3)
290 min_damage_element=damage_element;
295 min_damage_element=co3;
299 lst_damage_fem3.push_back(damagefem3);
303 std::vector<FEM_ELEMENT3*> *lstniveau=
new std::vector<FEM_ELEMENT3*>[niveaumax+1];
304 std::vector<DAMAGE_FEM3*>::iterator it_damage_ele;
306 for(it_damage_ele=lst_damage_fem3.begin();it_damage_ele!=lst_damage_fem3.end();it_damage_ele++)
319 if (max_damage_element<=0.99999)
321 for(
int l3=1;l3<=niveaumax;l3++)
323 Dzone=((((l3*(max_damage_element-min_damage_element))/niveaumax)+(((l3-1)*(max_damage_element-min_damage_element))/niveaumax))/2)+min_damage_element;
326 for(
int k=0;k<nomb;k++)
329 sigma=exp(alpha*log(
epsilon)+log(fabs(E*(1-Dzone)))+beta);
360 double distance_min=std::numeric_limits<double>::max();
361 LISTE_FEM_ELEMENT3::iterator it_ele;
364 BOITE_3D boite = ele->get_boite_3D();
367 double distance =
sqrt((centre[0]-x)*(centre[0]-x)+(centre[1]-y)*(centre[1]-y)+(centre[2]-z)*(centre[2]-z));
368 if(distance<distance_min)
370 distance_min=distance;
380 double distance_min=std::numeric_limits<double>::max();
381 LISTE_FEM_ELEMENT3::iterator it_ele;
384 BOITE_3D boite = ele->get_boite_3D();
387 double distance =
sqrt((centre[0]-x)*(centre[0]-x)+(centre[1]-y)*(centre[1]-y)+(centre[2]-z)*(centre[2]-z));
390 int cmax=ele->get_nb_fem_noeud();
392 for(
int c=0;c<cmax;c++)
394 noeud=ele->get_fem_noeud(c);
396 if (corr[position]==valeur_position){compteur++;};
398 if((distance<distance_min) && (compteur==nomb_noeud))
400 distance_min=distance;
415 double val1,val2,val4,val5;
416 FILE *strength_exp = NULL;
417 strength_exp = fopen((
char*)
"resistanceavantmodif.exp",
"r");
418 while((c=fgetc(strength_exp)) != EOF)
420 if (c ==
'\n') {nbligne++;}
423 double vec1[nbligne];
425 fclose(strength_exp);
426 strength_exp = fopen((
char*)
"resistanceavantmodif.exp",
"r");
427 fgets(ligne2,100,strength_exp);
428 sscanf (ligne2,
"%s %s",mot1,mot2);
429 while (fgets(ligne2,100,strength_exp) !=NULL)
431 sscanf (ligne2,
"%lf %lf",&val1,&val2);
436 fclose(strength_exp);
437 FILE *strength_exp_modif = NULL;
438 strength_exp_modif = fopen((
char*)
"resistance.exp",
"w");
439 strength = fopen((
char*)
"resistancenum.txt",
"r");
440 fprintf(strength_exp_modif,
"%s %s\n",mot1,mot2);
441 while (fgets(ligne3,100,strength) !=NULL)
443 sscanf (ligne3,
"%d %lf",&val3,&val4);
444 double val=(double)val3;
445 for(
f=0;
f<nbligne;
f++)
447 if ((val3>vec[
f]) && (val3<vec[
f+1]))
449 val5=((vec1[
f]-vec1[
f+1])/(vec[
f]-vec[
f+1]))*(val3-vec[
f+1])+vec1[
f+1];
450 fprintf(strength_exp_modif,
"%lf %lf\n",val,val5);
455 fprintf(strength_exp_modif,
"%lf %lf\n",val,val5);
461 fclose(strength_exp_modif);
478 params->
ajouter(
"position",
"2.0",
OT_PARAMETRES::DOUBLE,
"Coordonnee du noeud selon laxe perpendiculaire au plan qui contient une face de l element se trouvant dans la boite");
479 params->
ajouter(
"valeur_position",
"0.0",
OT_PARAMETRES::DOUBLE,
"Position du plan contenant une face de l element se trouvant dans la boite");
480 params->
ajouter(
"nomb_noeud",
"6.0",
OT_PARAMETRES::DOUBLE,
"Nombre de noeuds appartenant au plan qui contient une face de l element se trouvant dans la boite");