* fichier :  excel2.dgibi
************************************************************************
* Section : Mathematiques Fonctions
* Section : Mecanique Elastique
************************************************************************
optio echo 0;
* excel2.dgibi
*
*  deux methode sont proposees dans l'opérateur exce :
*  la methode standard ( minimisation convexe) avec t0 = 0.6;
*  la methode move limite;
* analyse de fiabilite. on est deja passe dans l'espace centre reduit
* et on cherche le min de la distance a l'origine sur les variables
* 
* la contrainte est que f0-vonmises<0
* 
*
* min de (  (SOMME ( Ui**2)  )**0.5)
* avec Ui =( Xi - mxi) /sxi   et xi = P0 r0 r1 f0
*     sachant que f0 -VMISES(p0 ,r0,r1) =<0
*
message ' fichier de donnees : excel2.dgibi';
xr0 = 55.;
xr1 = 95.;
xf0 = 290.;
xp0 = 180.;
*
* donnée des constantes
*
graph=faux;
mr0= 50.; sr0=2.5;
mr1=100.; sr1=5.;
mf0=300.; sf0=20.;
mp0=130.; sp0=8.;
*
*  procedur e de maillage
*
debproc cunu r0*flottant r1*flottant p0*flottant desine*logique;
opti dime 2 elem qua8 mode axis;
p1 = r0 0; p2 = r1 0;
li= p1 droi 4 p2;
su = li rota 4 90. ( 0. 0.);
lip = cote 4 su;
mo = model su mecanique elastique ;
ma = mate mo young 200000. nu 0.3;
ri = rigi mo ma;
bl = bloquer  uz li;
ff = pression massif mo lip p0;
de = resou ( ri et bl) ff;
ss = sigma de mo ma;
se = changer noeud mo ss;
vm = vmis se mo ;
sr = maxi vm;
si desine;
 trac su vm mo;
finsi;
finproc sr;
*
*  petite procedur pour calculer les conditions et les derivees
*  les inconnues r0 r1 f0 p0 sont dans la table tvx0
debproc intmci tmci txv0;
desi = faux; si graph;desi=vrai;finsi;

tmci . 0 = txv0 . 3 - (cunu txv0.1 tvx0.2 tvx0.4 desi );
tmci . 3 = 1.;desi=faux;
tmci . 1 =(( cunu  (txv0.1 - 1.) tvx0.2 tvx0.4  desi) -
( cunu  (txv0.1 + 1.) tvx0.2 tvx0.4 desi )) / 2.;
tmci . 2 =(( cunu  txv0.1  (tvx0.2 - 1.) tvx0.4 desi) -
( cunu  txv0.1 ( tvx0.2 + 1.) tvx0.4 desi )) / 2.;
tmci . 4 =(( cunu  txv0.1  tvx0.2( tvx0.4 - 1.) desi) -
( cunu  txv0.1  tvx0.2 (tvx0.4 + 1.) desi)) / 2.;
finproc;
*
* procedur pour calculer la fonction et ses derivees
*  les inconnues X1 et X2 sont dans la table tvx0
* 1=r0 2=r1 3=f0 4=P0
debpro intvf tvf*table tvx0*table;
xx = ( tvx0 . 1 - mr0 )*( tvx0 . 1 - mr0 ) /sr0 /sr0
 +( ( tvx0 . 2 - mr1 )*( tvx0 . 2 - mr1 ) /sr1 /sr1)
 +( ( tvx0 . 3 - mf0 )*( tvx0 . 3 - mf0 ) /sf0 /sf0)
 +( ( tvx0 . 4 - mp0 )*( tvx0 . 4 - mp0 ) /sp0 /sp0);
yy = 2. * ( tvx0 . 1 - mr0 )/ Sr0/Sr0;
zz =  2. * ( tvx0 . 2 - mr1 )/ Sr1 / sr1;
vv =  2. * ( tvx0 . 3 - mf0 )/ Sf0 / sf0;
ww = 2. * ( tvx0 . 4 - mp0 )/ Sp0 / sp0;
tvf . 0 = xx ** 0.5;
tvf . 1 = 0.5 * yy / tvf . 0;
tvf. 2 =  zz * 0.5 / tvf . 0;
tvf. 3 =  vv * 0.5 / tvf . 0;
tvf. 4 =  ww * 0.5 / tvf . 0;
finproc;

*
*  debut de l'optimisation
*  boucle pour les 2 methodes
 repeter met 2;
ta = table;
* definition d'un point de depart
tvx0 = table vecteur;
tvx0.1 = xr0;
tvx0 . 2 = xr1;
tvx0 . 3 = xf0;
tvx0 . 4 = xp0;
*
* tvf contiendra la valeur de la fonction et les derivees
* calculées au point de depart
*
tvf = table vecteur;
*
* tmci contient la ieme condition et les derivees calculees
* au point de départ
*
tmc = table ; tmci=table vecteur; tmc . 1 = tmci;
*
* def de la valeur min des variables dans tvxmin
*
tvxmin = table vecteur;
tvxmin . 1 =1.;
tvxmin . 2 = 1.;
tvxmin . 3 = 1.;
tvxmin . 4 = 1.;
*
* def de la valeur max des variables dans tvxmax
*
tvxmax = table vecteur;
tvxmax. 1 = 1000.;
tvxmax . 2 = 1000.;
tvxmax . 3 = 1000.;
tvxmax . 4 = 1000.;
*
* definition des valeurs au second membre des conditions
*
tvcmax= table vecteur; tvcmax . 1 = 0.;
*
* choix de la méthode et remplissage de la table argument de exce
*
ta . mc = tmc;
ta.vxmin = tvxmin; ta . vxmax = tvxmax;
ta.vcmax = tvcmax;
si (ega  &met  1) ;
ta . methode = sta; ta . t0 = 0.6;
titi = mot  'cas 3 methode sta';
 sinon;
ta.methode = mov;
titi = mot 'cas 3 methode mov';
finsi;
titre titi ' point de depart';
* calcul de la fonction et de ses derivees
intvf tvf tvx0;
* calcul des conditions et de leurs dérivées
intmci tmci tvx0;
*
* preparation des listreel pour stocker les résultats 
* intermediaires de la fonction est des variables
ff = prog tvf.0; x1 = prog tvx0.1; x2 = prog tvx0.2;
x3=prog tvx0.3; x4 = prog tvx0.4;
*
*   boucle d'optimisation
*

repeter bouc 6;

* on remplit la partie changeante de ta
ta . vx0 = tvx0;
ta. vf = tvf;
ta . mc . 1 = tmci;
*
* appel à exce  
*
*opti impi 1799;
               ta = exce ta;
*
*  recuperation des variables dans ta.VX0
tvx0 = ta . vx0;
* calcul de la fonction et des dérivées
intvf tvf tvx0;
titre titi ' iteration ' &bouc;
* calcul des conditions et de leurs dérivées
intmci tmci tvx0;

* remplissage des listreels pour visualition des itérations
ff = ff et ( prog tvf.0);
x1 = x1 et ( prog tvx0 . 1);
x2 = x2 et ( prog tvx0 . 2);
x3 = x3 et ( prog tvx0 . 3);
x4 = x4 et ( prog tvx0 . 4);
fin bouc;

*opti donn 5;
*
*  visualisation des résultats 
*
aa = dime ff;
ll = prog 0 pas 1 (aa - 1) ;
titre titi 'fonction :'  ( extr ff ( dime ff));
ev1 = evol manu iteration ll ffff ff;
si graph; dess ev1;finsi;
titre titi ' r01 final :'( extr x1 ( dime x1));
ev2 = evol manu iteration ll xxx1 x1;
si graph;  dess ev2;finsi;
ch = chain  titi ' r1 final :'( extr x2 ( dime x2));
titre ch;
ev3 = evol manu iteration ll xxx2 x2;
si graph; dess ev3;finsi;
ch = chain  titi ' f0 final :'( extr x3 ( dime x3));
titre ch;
ev4 = evol manu iteration ll 'F0' x3;
si graph; dess ev4;finsi;
ch = chain  titi ' P0 final :'( extr x4 ( dime x4));
titre ch;
ev5 = evol manu iteration ll 'P0' x4;
si graph; dess ev5; finsi;


fin met;
aa = ( extr ff ( dime ff));
*
*on ne fait les terst que sur resultat des move limits car
* l'autre n'est pas stabilise
* 
 si ( ( (aa -  3.1604 ) / 3.1604) > 0.001 ); 
 mess ' on trouve ' aa 'au lieu de 3.1603' ;
erreur 5;
sinon;
mess   ' le cas test est correct';
finsi;

fin;
 

