testpg
C TESTPG SOURCE GOUNAND 23/07/31 21:15:06 11713 IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : TESTPG C PROJET : Noyau linéaire NLIN C DESCRIPTION : On vérifie les méthodes d'intégration numériques. On C vérifie l'exactitude de l'intégration des monomes C d'ordre inférieur ou égal à celui de la méthode. C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES : C APPELES (E/S) : C APPELES (BLAS) : C APPELES (CALCUL) : C APPELE PAR : PILOT C*********************************************************************** C SYNTAXE GIBIANE : C ENTREES : C ENTREES/SORTIES : C SORTIES : C*********************************************************************** C VERSION : v1, 22/07/99, version initiale C HISTORIQUE : v1, 22/07/99, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** C Prière de PRENDRE LE TEMPS de compléter les commentaires C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC CCREEL -INC TNLIN *-INC SPOGAU POINTEUR MYPGS.POGAUS POINTEUR PGCOUR.POGAU * * Exposant des monomes * SEGMENT XPMONO INTEGER EXPOSA(NDESP) ENDSEGMENT INTEGER NDESP POINTEUR MYMONO.XPMONO * INTEGER IMPR,IRET * INTEGER NBMETH,I,J,K INTEGER NORDM,NESREF,NPOGAU INTEGER IMETH,IORD,IEXP,IEXP1,IEXP2,IPG,ICOOR REAL*8 XFACT REAL*8 XPRMON,SOLEX,SOLAPP,SERR * * Executable statements * * * Initialisation du segment contenant les informations sur les * méthodes d'intégration (type Gauss). * IMPR=0 IF (IRET.NE.0) GOTO 9999 * * Puis on teste chacune de méthodes * IMPR=0 SEGACT MYPGS NBMETH=MYPGS.LISPG(/1) DO 1 IMETH=1,NBMETH PGCOUR=MYPGS.LISPG(IMETH) SEGACT PGCOUR WRITE(IOIMP,*) 'Methode d''integration ',IMETH,' : ' $ ,PGCOUR.NOMPG IF (IMPR.GT.1) THEN IF (IRET.NE.0) GOTO 9999 ENDIF NORDM=PGCOUR.NORDPG NESREF=PGCOUR.XCOPG(/1) NPOGAU=PGCOUR.XCOPG(/2) XYZMAX=XZERO DO IPG=1,NPOGAU DO ICOOR=1,NESREF XYZMAX=MAX(abs(PGCOUR.XCOPG(ICOOR,IPG)),xyzmax) ENDDO ENDDO * Le monôme 1 intègre à 2 ** d sur un element de refernce xtprec=max(((XYZMAX*2)**NESREF)*xzprec*3,sqrt(xpetit)) write(ioimp,*) 'xtprec=',xtprec * DO 2 IORD=0,NORDM+1 IF (PGCOUR.FORLPG.EQ.'SEGMENT') THEN NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=IORD I=MYMONO.EXPOSA(1) IF (PGCOUR.TYPMPG.EQ.'GAUSS'.OR. $ PGCOUR.TYPMPG.EQ.'NEWTON-COTES') THEN IF (MOD(I,2).EQ.0) THEN SOLEX=2.D0/(DBLE(I)+1.D0) ELSE SOLEX=0.D0 ENDIF ELSEIF (PGCOUR.TYPMPG.EQ.'GAUSS-JACOBI10') THEN SOLEX=(1.D0/(DBLE(I+1))) $ -(1.D0/(DBLE(I+2))) ELSEIF (PGCOUR.TYPMPG.EQ.'GAUSS-JACOBI20') THEN SOLEX=(1.D0/(DBLE(I+1))) $ -(2.D0/(DBLE(I+2))) $ +(1.D0/(DBLE(I+3))) ELSE WRITE(IOIMP,*) 'Type de méthode non reconnue' GOTO 9999 ENDIF SOLAPP=0.D0 DO 22 IPG=1,NPOGAU XPRMON=1.D0 DO 222 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 222 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 22 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF IF (SERR.GT.XTPREC.AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF ELSEIF (PGCOUR.FORLPG.EQ.'TRIANGLE') THEN DO 26 IEXP=IORD,0,-1 NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=IEXP MYMONO.EXPOSA(2)=IORD-IEXP I=MYMONO.EXPOSA(1) J=MYMONO.EXPOSA(2) SOLAPP=0.D0 DO 262 IPG=1,NPOGAU XPRMON=1.D0 DO 2622 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 2622 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 262 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' eta**',J,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF IF (SERR.GT.XTPREC.AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF 26 CONTINUE ELSEIF (PGCOUR.FORLPG.EQ.'CARRE') THEN DO 24 IEXP=IORD,0,-1 NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=IEXP MYMONO.EXPOSA(2)=IORD-IEXP I=MYMONO.EXPOSA(1) J=MYMONO.EXPOSA(2) IF (MOD(I,2).EQ.0.AND.MOD(J,2).EQ.0) THEN SOLEX=4.D0/((DBLE(I)+1.D0)*(DBLE(J)+1.D0)) ELSE SOLEX=0.D0 ENDIF SOLAPP=0.D0 DO 242 IPG=1,NPOGAU XPRMON=1.D0 DO 2422 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 2422 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 242 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' eta**',J,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF IF (SERR.GT.XTPREC.AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF 24 CONTINUE ELSEIF (PGCOUR.FORLPG.EQ.'TETRAEDRE') THEN DO 28 IEXP1=IORD,0,-1 DO 282 IEXP2=IORD-IEXP1,0,-1 NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=IEXP1 MYMONO.EXPOSA(2)=IEXP2 MYMONO.EXPOSA(3)=IORD-IEXP1-IEXP2 I=MYMONO.EXPOSA(1) J=MYMONO.EXPOSA(2) K=MYMONO.EXPOSA(3) SOLAPP=0.D0 DO 2822 IPG=1,NPOGAU XPRMON=1.D0 DO 28222 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 28222 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 2822 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' eta**',J $ ,' :',' dzeta**',K,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF IF (SERR.GT.XTPREC.AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF 282 CONTINUE 28 CONTINUE ELSEIF (PGCOUR.FORLPG.EQ.'PYRAMIDE') THEN NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=0 MYMONO.EXPOSA(2)=0 MYMONO.EXPOSA(3)=IORD I=MYMONO.EXPOSA(1) J=MYMONO.EXPOSA(2) K=MYMONO.EXPOSA(3) SOLEX=2.D0*((1.D0/(DBLE(IORD+3))) $ +(-2.D0/(DBLE(IORD+2))) $ +(1.D0/(DBLE(IORD+1)))) SOLAPP=0.D0 DO 2922 IPG=1,NPOGAU XPRMON=1.D0 DO 29222 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 29222 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 2922 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' eta**',J $ ,' :',' dzeta**',K,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF * Intégration non exacte IF (SERR.GT.SQRT(XTPREC).AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF ELSEIF (PGCOUR.FORLPG.EQ.'PRISME') THEN DO 30 IEXP1=IORD,0,-1 DO 302 IEXP2=IORD-IEXP1,0,-1 NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=IEXP1 MYMONO.EXPOSA(2)=IEXP2 MYMONO.EXPOSA(3)=IORD-IEXP1-IEXP2 I=MYMONO.EXPOSA(1) J=MYMONO.EXPOSA(2) K=MYMONO.EXPOSA(3) IF (MOD(K,2).EQ.0) THEN $ (2.D0/(DBLE(K)+1.D0)) ELSE SOLEX=0.D0 ENDIF SOLAPP=0.D0 DO 3022 IPG=1,NPOGAU XPRMON=1.D0 DO 30222 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 30222 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 3022 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' eta**',J $ ,' :',' dzeta**',K,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF IF (SERR.GT.XTPREC.AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF 302 CONTINUE 30 CONTINUE ELSEIF (PGCOUR.FORLPG.EQ.'CUBE') THEN DO 32 IEXP1=IORD,0,-1 DO 322 IEXP2=IORD-IEXP1,0,-1 NDESP=NESREF SEGINI MYMONO MYMONO.EXPOSA(1)=IEXP1 MYMONO.EXPOSA(2)=IEXP2 MYMONO.EXPOSA(3)=IORD-IEXP1-IEXP2 I=MYMONO.EXPOSA(1) J=MYMONO.EXPOSA(2) K=MYMONO.EXPOSA(3) IF (MOD(I,2).EQ.0.AND.MOD(J,2).EQ.0 $ .AND.MOD(K,2).EQ.0) THEN SOLEX=8.D0/((DBLE(I)+1.D0)*(DBLE(J)+1.D0) $ *(DBLE(K)+1.D0)) ELSE SOLEX=0.D0 ENDIF SOLAPP=0.D0 DO 3222 IPG=1,NPOGAU XPRMON=1.D0 DO 32222 ICOOR=1,NDESP XPRMON=XPRMON*(PGCOUR.XCOPG(ICOOR,IPG) $ **MYMONO.EXPOSA(ICOOR)) 32222 CONTINUE SOLAPP=SOLAPP+(PGCOUR.XPOPG(IPG)*XPRMON) 3222 CONTINUE SEGSUP MYMONO SERR=ABS(SOLEX-SOLAPP) IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'Monome : ksi**',I,' eta**',J $ ,' :',' dzeta**',K,' :' WRITE(IOIMP,*) ' Solution exacte : ',SOLEX WRITE(IOIMP,*) ' Solution appr. : ',SOLAPP WRITE(IOIMP,*) ' Erreur relative : ',SERR ENDIF IF (SERR.GT.XTPREC.AND.IORD.LE.NORDM) THEN GOTO 9998 ENDIF 322 CONTINUE 32 CONTINUE ELSE WRITE(IOIMP,*) PGCOUR.FORLPG,' n''est pas une forme' WRITE(IOIMP,*) 'd''élément reconnue.' GOTO 9999 ENDIF 2 CONTINUE SEGDES PGCOUR WRITE(IOIMP,*) 'Ok' 1 CONTINUE SEGDES MYPGS * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9998 CONTINUE WRITE(IOIMP,*) 'SERR=',SERR,' => Pb. ds la méthode !!' 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine testpg' RETURN * * End of subroutine testpg * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales