normat
C NORMAT SOURCE PV 20/09/26 21:19:01 10724 $ NORMP,NORMD, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : NORMAT C DESCRIPTION : C C Calcul des normes primales (colonnes) et duales (lignes) C de la matrice. C C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) C mél : gounand@semt2.smts.cea.fr C******************************************************** C*********************************************************************** C SYNTAXE GIBIANE : C ENTREES : C ENTREES/SORTIES : C SORTIES : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 26/04/2003, version initiale C HISTORIQUE : v1, 26/04/2003, 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 SMMATRIK POINTEUR AMORS.PMORS POINTEUR AISA.IZA POINTEUR NORMP.IZA POINTEUR NORMD.IZA * INTEGER IMPR,IRET * * Executable statements * IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans normat.eso' SEGACT AMORS SEGACT AISA NTTDDL=AMORS.IA(/1)-1 NBVA=NTTDDL SEGINI NORMP SEGINI NORMD DO ITTDDL=1,NTTDDL JSTRT=AMORS.IA(ITTDDL) JSTOP=AMORS.IA(ITTDDL+1)-1 DO J=JSTRT,JSTOP JTTDDL=AMORS.JA(J) VAL=AISA.A(J) IF (ISCAL.EQ.1) THEN VAL2=VAL*VAL ELSEIF (ISCAL.EQ.2) THEN VAL2=ABS(VAL) ELSE GOTO 9999 ENDIF NORMP.A(JTTDDL)= $ NORMP.A(JTTDDL)+VAL2 NORMD.A(ITTDDL)= $ NORMD.A(ITTDDL)+VAL2 ENDDO ENDDO SEGDES AISA SEGDES AMORS * Racine carrée IF (ISCAL.EQ.1) THEN DO ITTDDL=1,NTTDDL NORMP.A(ITTDDL)= $ SQRT(NORMP.A(ITTDDL)) NORMD.A(ITTDDL)= $ SQRT(NORMD.A(ITTDDL)) ENDDO ENDIF * Teste si une ligne ou une colonne de la matrice est nulle DO ITTDDL=1,NTTDDL VAL=NORMP.A(ITTDDL) IF(VAL.LE.SQRT(XPETIT)) THEN WRITE(IOIMP,*) 'La colonne ',ITTDDL, $ ' de la matrice est nulle : ', VAL GOTO 9999 ENDIF ENDDO DO ITTDDL=1,NTTDDL VAL=NORMD.A(ITTDDL) IF(VAL.LE.SQRT(XPETIT)) THEN WRITE(IOIMP,*) 'La ligne ',ITTDDL, $ ' de la matrice est nulle : ', VAL GOTO 9999 ENDIF ENDDO IF (IMPR.EQ.2) THEN WRITE(IOIMP,*) 'Scaling de la matrice' ELSEIF (IMPR.GE.3) THEN VMIP=NORMP.A(1) VMAP=NORMP.A(1) DO ITTDDL=2,NTTDDL VAL=NORMP.A(ITTDDL) VMIP=MIN(VMIP,VAL) VMAP=MAX(VMAP,VAL) ENDDO VMID=NORMD.A(1) VMAD=NORMD.A(1) DO ITTDDL=2,NTTDDL VAL=NORMD.A(ITTDDL) VMID=MIN(VMID,VAL) VMAD=MAX(VMAD,VAL) ENDDO WRITE(IOIMP,11) ' Scaling de la matrice : col(pri) min=', $ VMIP,' max=',VMAP WRITE(IOIMP,11) ' lig(dua) min=', $ VMID,' max=',VMAD ENDIF SEGDES NORMP SEGDES NORMD * * Normal termination * IRET=0 RETURN * * Format handling * 11 FORMAT (A,D9.2,A,D9.2) * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine normat' RETURN * * End of subroutine NORMAT * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales