* fichier : INTG_test.dgibi
************************************************************************
* Section : Langage Objets
************************************************************************


************************************************************************
* Ce Cas-Test permet de tester l'operateur INTG dans differentes
* configurations d'options
************************************************************************

OPTI DIME 3 ELEM 'CUB8';
XZPREC = (VALE 'PREC') * 100.D0;

************************************************************************
*  MAILLAGE d'un CUBE de cote L
************************************************************************
L  = 2.D0 ;
NBE1 = 10 ;

P1 = 0. 0. 0. ;
P2 = L  0. 0. ;

L1 = DROI NBE1 P1 P2;
L2 = L1 PLUS (0. L  0.);

S1 = L1 REGL NBE1 L2;
S2 = S1 PLUS (0. 0. L);

V1 = S1 VOLU NBE1 S2;

*TRAC CACH V1;


************************************************************************
*  MODELE et MCHAML
************************************************************************
MOD1 = MODE V1 'MECANIQUE' 'ELASTIQUE';
MCH1 = MANU 'CHML' MOD1 'VOL1' 1.D0   ; COMM 'MCHAML CONSTANT';

MOD2 = REDU MOD1 (VIDE 'MAILLAGE');


************************************************************************
*  INTEGRALES
************************************************************************
INTG11 = INTG MOD1 MCH1;

TEST = ABS (INTG11 - (L ** 3)) ;
MESS TEST XZPREC;
SI (TEST > XZPREC);
  MESS 'ERREUR 1 DANS INTG';
  ERRE 5;
FINS;


INTG12 = INTG MOD1 MCH1 'ELEM';
MIN12  = MINI INTG12;
MAX12  = MAXI INTG12;
DELTA  = MAX12 - MIN12;
TEST   = MAX12 - (INTG11 / (NBE1 **3));
MESS MIN12 MAX12 DELTA TEST;
SI ((DELTA > XZPREC) OU (TEST > XZPREC));
  MESS 'ERREUR 2 DANS INTG';
  ERRE 5;
FINS;


INTG21 = INTG MOD2 MCH1;
MESS INTG21;
SI (INTG21 > 0.D0);
  MESS 'ERREUR 3 DANS INTG';
  ERRE 5;
FINS;


INTG22 = INTG MOD2 MCH1 'ELEM';
MAIL22 = EXTR INTG22 'MAIL';
TEST   = NBEL MAIL22;
SI (TEST NEG 0);
  MESS 'ERREUR 4 DANS INTG';
  ERRE 5;
FINS;

*----------------------------------------------------------------------*
*                  INTEGRATION DE COURBES D'EVOLUTION                  *
*----------------------------------------------------------------------*


* COURBES MONOTONES :
*--------------------

* Definition de 2 evolutions :
ev1 = evol manu 'x' (prog 1. pas 1. 10.) 'y' (prog 1. pas 1. 10.) ;
ev1 = 3. * ev1 ;
ev2 = ev1 ** 2 ;
ev0 = ev1 et ev2 ;

zp1 = 2.e4 * (vale prec) ;

*-------------- Integration de 1 courbe sur 1 intervalle --------------*

xx = intg ev1 ;
list xx ;
* 'Resultat doit etre' : 148.5 ;
yy = 148.5 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

*--- Option INDI :
xx = intg ev1 indi 1 2 ;
list xx ;
* 'Resultat doit etre' : 4.5 ;
yy = 4.5 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

xx = intg ev1 indi 2 4 ;
list xx ;
* 'Resultat doit etre' : 18. ;
yy = 18.0 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

*--- Option BORN :
* Pour les bornes reelles, je cree une evol + raffinee
ev3 = evol manu 'x' (prog 1. pas 0.1 10.) 'y' (prog 1. pas 0.1 10.) ;
ev3 = 3. * ev3 ;
xx  = intg ev1 born 1.2 5.3 ;
list xx ;
* 'Resultat doit etre' : 39.975 ;
* (6. + 3.6) * 0.5 * 0.8 + (2.5 + 10.5 + 13.5) + ((15.9 + 15.) * 0.5 * 0.3) 
yy  = 39.975 ;
zz  = intg ev3 indi 3 44 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;
si ((zz - yy) > zp1) ; erre 21 ; fins ;

* Bornes en dehores de l'intervalle de definition :
* On prolonge avec la valeur a droite eou a gauche :
xx  = intg ev1 born 0. 10. ;
list xx ;
* 'Resultat doit etre' : 15.5*9.+1. = 151.5
yy  = 151.5 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

xx  = intg ev1 born 0. 15. ;
list xx ;
* 'Resultat doit etre' : 15.5*9.+1.+30.*5. = 301.5
yy  = 301.5 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Bornes inversees :
xx  = intg ev1 born 11.2 1.7 ;
list xx ;
* 'Resultat doit etre' : -1.*xx
yy  = -1. * (intg ev1 born 1.7 11.2) ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Intervalle de largeur nulle ;
xx  = intg ev1 born 2.5 2.5 ;
list xx ;
* 'Resultat doit etre' : 0.
yy  = 0. ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;


*----------------- 1 evolution, plusieurs intervalles -----------------*

*--- Option INDI :
xx = intg ev1 indi (lect 1 2) (lect 2 4) ;
list xx ;
* 'Resultat doit etre' : {0. 3.5 18.}
yy = prog 4.5 18. ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

*--- Option BORN :
xx = intg ev1 born (prog 1.2 2.) (prog 5.3 7.7) ;
list xx ;
* 'Resultat doit etre' : {39.975 82.935}
* (7.5 + 10.5 + 13.5 + 16.5 + 19.5) + ((21.+23.1)*0.5*0.7) ;
yy = prog 39.975 82.935 ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

* En dehors de l'intervalle de definition :
xx = intg ev1 born (prog 1.2 0.) (prog 5.3 11.) ;
list xx ;
* 'Resultat doit etre' : {39.975 181.5}
* 148.5 + 3. + 30. = 181.5
yy = prog 39.975 181.5 ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

* Bornes "inversees" :
xx = intg ev1 born (prog 1.2 11.) (prog 5.3 0.) ;
list xx ;
* 'Resultat doit etre' : {39.975 -181.5}
* 148.5 + 3. + 30. = -181.5
yy = prog 39.975 -181.5 ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

* 1 intervalle de largeur nulle :
xx = intg ev1 born (prog 1.2 11.) (prog 1.2 0.) ;
list xx ;
* 'Resultat doit etre' : {0. -181.5}
* 148.5 + 3. + 30. = -181.5
yy = prog 0. -181.5 ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

*---------- Integration de plusieurs courbes sur 1 intervalle ---------*
xx = intg ev0 ;
list xx ;
* 'Resultat doit etre' (148.5 3010.5) ;
yy = prog 148.5 3010.5 ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

*--- Option INDI :
xx = intg ev0 indi 1 2 ;
list xx ;
* 'Resultat doit etre' (4.5 22.5)
yy = prog 4.5 22.5 ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

xx = intg ev0 indi 2 4 ;
list xx ;
* 'Resultat doit etre' : {18. 171.}
yy = prog 18. 171. ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

*--- Option BORN :
ev4 = ipol (prog 1. pas 0.1 10.) ev2 ;
ev4 = evol manu (prog 1. pas 0.1 10.) ev4 ;
ev5 = ev3 et ev4 ;
xx  = intg ev0 born 1.2 5.3 ;
list xx ;
yy  = intg ev5 indi 3 44 ;
list yy ;
si ((xx - yy maxi abs) > zp1) ; erre 21 ; fins ;

*----- Integration de plusieurs courbes sur plusieurs intervalles -----*

*--- Option INDI :
xx = intg ev0 indi (lect 1 2) (lect 2 4) ;
list xx ;
* 'Resultat doit etre' : 1 NUAGE avec 2 LISTREEL, 1 par courbe
* {4.5 18.000} {22.5 171.}
yy1 = prog 4.5 18. ;
yy2 = prog 22.5 171. ;
* Extraction LISTREEL du NUAGE :
xx1 = extr xx 'IE1' ;
ii  = 2 ;
xx2 = extr xx (chai 'IE' ii) ;
si ((xx1 - yy1 maxi abs) > zp1) ; erre 21 ; fins ;
si ((xx2 - yy2 maxi abs) > zp1) ; erre 21 ; fins ;

*--- Option BORN :

* Plusieurs evolutions, plusieurs intervalles :
xx  = intg ev0 born (prog 1.2 1.7) (prog 5.3 7.1) ;
yy  = intg ev5 indi (lect 3 8) (lect 44 62) ;
xx1 = extr xx IE1 ;
yy1 = extr yy IE1 ;
xx2 = extr xx IE2 ;
yy2 = extr yy IE2 ;
list xx1 ;
list yy1 ;
list xx2 ;
list yy2 ;
si ((xx1 - yy1 maxi abs) > zp1) ; erre 21 ; fins ;
si ((xx2 - yy2 maxi abs) > zp1) ; erre 21 ; fins ;

* FONCTIONS MULTIVALUEES :
* ------------------------

* Cercle :
* --------

lx1 = prog 0. pas 0.05 2. ;
lx1 = 180. * lx1 ;
ly1 = cos lx1 ;
ly2 = sin lx1 ;
evx = evol manu ly1 ly2 ;
*dess evx ;

xx  = intg evx ;
list xx ;
* 'Resultat doit etre' : approximation de -pi
yy  = intg evx indi 1 41 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Valeur absolu, resultat doit etre : 0.
xx  = intg evx abso ;
list xx ;
* 'Resultat doit etre' : 0.
yy  = 0. ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Avec INDI et borne :
xx  = intg evx born 1. 0. ;
list xx ;
yy  = intg evx indi 41 1 ;
* 'Resultat doit etre' : moitie integrale totale
yy  = 0.5 * yy ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Sinus "vertical" :
* ------------------

* Integrale sur tout le domaine :
lx1 = prog 0. pas 0.05 2. ;
lx1 = 180. * lx1 ;
ly2 = sin lx1 ;
evx = evol manu ly2 lx1 ;
*dess evx ;

xx  = intg evx ;
list xx ;
* 'Resultat doit etre' : 0.
yy  = 0. ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* En donnant les bornes :
xx  = intg evx born 0. 1. ;
list xx ;
yy  = intg evx indi 1 21 ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* "S" :
lx1 = prog 1.1 pas 1. 5.1 5.1 5.1 pas -1. 1.1 1.1 1.1 pas 1. 5.1 ;
ly1 = prog 5*0          1. 5*2         3. 5*4 ;
evx = evol roug manu 'x' lx1 'y' ly1 ;
*dess evx ;

xx  = intg evx ;
list xx ;
* 'Resultat doit etre' : 8.
yy  = 8. ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Moitie intervalle :
xx  = intg evx born 1.1 3.1 ;
list xx ;
* 'Resultat doit etre' : 4.
yy  = 4. ;
si ((xx - yy) > zp1) ; erre 21 ; fins ;

* Cas pathologique signale au support :
* -------------------------------------
lra      = prog 0 pas 0.5 2;
lro      = prog 5*1;
ev1      = evol manu lra lro;

int1     = intg ev1 borne 1. 1.3 ;
list int1 ;

si (int1 neg 0.3 (vale prec)) ; erre 21 ; fins ;

fin ;


 

 

 

