ccgnor
C CCGNOR SOURCE PV 22/04/22 21:15:03 11344 $ FC, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : CCGNOR C DESCRIPTION : Calcul des composantes d'un vecteur normal C 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 APPELE PAR : C*********************************************************************** C ENTREES : C ENTREES/SORTIES : C SORTIES : - C TRAVAIL : C*********************************************************************** C VERSION : v1, 09/03/07, version initiale C HISTORIQUE : v1, 09/03/07, 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 SMCHAEL INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM,N1 POINTEUR FC.MCHEVA POINTEUR LCOF.LCHEVA POINTEUR JMAJAC.MCHEVA POINTEUR JMIJAC.MCHEVA POINTEUR JDTJAC.MCHEVA CHARACTER*8 NOMLOI INTEGER ICOF * -INC TMXMAT * Objets temporaires POINTEUR JAC.MXMAT,JT.MXMAT,JP.MXMAT POINTEUR G.MXMAT,IG.MXMAT * SEGMENT MIMAT2 INTEGER IMAT2(2,2) ENDSEGMENT POINTEUR EIJ.MIMAT2 SEGMENT MIMAT3 INTEGER IMAT3(3,3,3) ENDSEGMENT POINTEUR EIJK.MIMAT3 * LOGICAL LBID INTEGER LAXSP * INTEGER IMPR,IRET REAL*8 DETG(1) * * Executable statements * * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans ccgnor' * WRITE(IOIMP,*) 'Entrée dans ccgnor' * WRITE(IOIMP,*) 'NOMLOI=',NOMLOI C IF (.NOT.(IDIM.EQ.1)) THEN C WRITE(IOIMP,*) 'IDIM=',IDIM,' ?' C GOTO 9999 C ENDIF NLFC=FC.WELCHE(/6) NPFC=FC.WELCHE(/5) ICOF=0 * ICOF=ICOF+1 JMAJAC=LCOF.LISCHE(ICOF) NLJA=JMAJAC.WELCHE(/6) NPJA=JMAJAC.WELCHE(/5) IREF=JMAJAC.WELCHE(/4) IREL=JMAJAC.WELCHE(/3) * SEGPRT,JMAJAC * * WRITE(IOIMP,*) 'IREL=',IREL * WRITE(IOIMP,*) 'IREF=',IREF IF (IREL.NE.IDIM) THEN WRITE(IOIMP,*) 'Erreur dims JMAJAC' GOTO 9999 ENDIF IF (IREL.NE.IREF+1) THEN WRITE(IOIMP,*) 'Le maillage donne nest pas une surface' GOTO 9999 ENDIF IF ((IREL.NE.2).AND.(IREL.NE.3)) THEN WRITE(IOIMP,*) 'Ne marche quen dimension despace 2 ou 3' GOTO 9999 ENDIF * * Objets temporaires et à préconditionner * LDIM1=IREL LDIM2=IREF SEGINI,JAC LDIM1=IREF LDIM2=IREL SEGINI,JT * SEGINI,JP LDIM1=IREF LDIM2=IREF SEGINI,G SEGINI,IG * * Initialisation des tenseurs de permutation * SEGINI,EIJ IMULT=1 ICPT=0 DO I=1,2 DO J=1,2 IF (I.NE.J) THEN ICPT=ICPT+1 IF (ICPT.EQ.2) THEN ICPT=0 IMULT=IMULT*(-1) ENDIF EIJ.IMAT2(I,J)=IMULT ENDIF ENDDO ENDDO SEGINI,EIJK IMULT=1 ICPT=0 DO I=1,3 DO J=1,3 IF (I.NE.J) THEN DO K=1,3 IF ((K.NE.I).AND.(K.NE.J)) THEN ICPT=ICPT+1 IF (ICPT.EQ.2) THEN ICPT=0 IMULT=IMULT*(-1) ENDIF EIJK.IMAT3(I,J,K)=IMULT ENDIF ENDDO ENDIF ENDDO ENDDO * SEGPRT,EIJ * SEGPRT,EIJK * DO ILFC=1,NLFC IF (NLJA.EQ.1) THEN ILJA=1 ELSE ILJA=ILFC ENDIF DO IPFC=1,NPFC IF (NPJA.EQ.1) THEN IPJA=1 ELSE IPJA=IPFC ENDIF * * Copie du jacobien * $ 'COPIE ', $ JAC.XMAT,IREL,IREF, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * Calcul de Jt $ 'TRANSPOS',JT.XMAT,IREF,IREL, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * Calcul de G=JtJ $ 'FOIS ',G.XMAT,IREF,IREF, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * Calcul de l'inverse, du déterminant et trace de l'inverse de g LBID=.FALSE. IF (IRET.NE.0) GOTO 9999 XM=SQRT(DETG(1)) ** ** Calcul de la pseudo-inverse J+ = g-1 Jt ** * CALL MAMAMA(IG.XMAT,IREF,IREF,JT.XMAT,IREF,IREL, * $ 'FOIS ',JP.XMAT,IREF,IREL, * $ IMPR,IRET) * IF (IRET.NE.0) GOTO 9999 IF (NOMLOI(1:4).EQ.'VNOR') THEN IF (IRET.NE.0) GOTO 9999 ** ** Calcul de la pseudo-inverse J+ = g-1 Jt ** * CALL MAMAMA(IG.XMAT,IREF,IREF,JT.XMAT,IREF,IREL, * $ 'FOIS ',JP.XMAT,IREF,IREL, * $ IMPR,IRET) * IF (IRET.NE.0) GOTO 9999 * IF (IREL.EQ.2) THEN CONTRI=0.D0 DO J=1,2 CONTRI=CONTRI-(EIJ.IMAT2(I,J)* $ JMAJAC.WELCHE(1,1,J,1,IPJA,ILJA)) ENDDO CONTRI=CONTRI/XM ELSEIF (IREL.EQ.3) THEN C XNUM=XM C XDENO=0.D0 C* C'est louche parce que II ne varie pas de 1 à IREL C DO II=1,IREF C DO IJ=1,IREF C* DO IN=1,IREF C* DO IO=1,IREF C XDENO=XDENO+ C $ (EIJ.IMAT2(II,IJ)* C $ JAC.XMAT(II,1)*JAC.XMAT(IJ,2))**2 CC $ (EIJ.IMAT2(II,IJ)*EIJ.IMAT2(IN,IO)* CC $ JAC.XMAT(II,1)*JAC.XMAT(IJ,2)* CC $ JAC.XMAT(IN,1)*JAC.XMAT(IO,2)) CC ENDDO CC ENDDO C ENDDO C ENDDO C XAL=XNUM/XDENO C CONTRI=0.D0 C DO J=1,IREL C DO K=1,IREL C CONTRI=CONTRI+ C $ (EIJK.IMAT3(I,J,K)* C $ JAC.XMAT(J,1)*JAC.XMAT(K,2)) C ENDDO C ENDDO C CONTRI=CONTRI*XAL CONTRI=0.D0 DO IA=1,IREF DO IB=1,IREF DO J=1,IREL DO K=1,IREL CONTRI=CONTRI+(EIJ.IMAT2(IA,IB)* $ EIJK.IMAT3(I,J,K)* $ JMAJAC.WELCHE(1,1,J,IA,IPJA,ILJA)* $ JMAJAC.WELCHE(1,1,K,IB,IPJA,ILJA)) C $ JP.XMAT(IA,J)*JP.XMAT(IB,K)) ENDDO ENDDO ENDDO ENDDO * SEGPRT,JAC * SEGPRT,JP * WRITE(IOIMP,*) 'XM=',XM CONTRI=CONTRI/(2.D0*XM) * WRITE(IOIMP,*) 'CONTRI=',CONTRI ELSE WRITE(IOIMP,*) 'Erreur grave IREL=',IREL GOTO 9999 ENDIF ELSEIF (NOMLOI(1:4).EQ.'VNOJ') THEN IF (IRET.NE.0) GOTO 9999 IF (IRET.NE.0) GOTO 9999 IF (IRET.NE.0) GOTO 9999 IF (IREL.EQ.2) THEN CONTRI=0.D0 CONTRI=CONTRI-(EIJ.IMAT2(I,J)* $ JMAJAC.WELCHE(1,1,L,1,IPJA,ILJA)) CONTRI=CONTRI/XM ELSEIF (IREL.EQ.3) THEN CONTRI=0.D0 DO IA=1,IREF DO IB=1,IREF * DO J=1,IREL DO K=1,IREL CONTRI=CONTRI+(EIJ.IMAT2(IA,IB)* $ EIJK.IMAT3(I,J,K)* $ JMAJAC.WELCHE(1,1,L,IA,IPJA,ILJA)* $ JMAJAC.WELCHE(1,1,K,IB,IPJA,ILJA)) CONTRI=CONTRI+(EIJ.IMAT2(IA,IB)* $ EIJK.IMAT3(I,K,J)* $ JMAJAC.WELCHE(1,1,K,IA,IPJA,ILJA)* $ JMAJAC.WELCHE(1,1,L,IB,IPJA,ILJA)) ENDDO * ENDDO ENDDO ENDDO * SEGPRT,JAC * SEGPRT,JP * WRITE(IOIMP,*) 'XM=',XM CONTRI=CONTRI/(2.D0*XM) * WRITE(IOIMP,*) 'CONTRI=',CONTRI ELSE WRITE(IOIMP,*) 'Erreur grave IREL=',IREL GOTO 9999 ENDIF ELSE WRITE(IOIMP,*) 'Erreur grave NOMLOI=',NOMLOI GOTO 9999 ENDIF FC.WELCHE(1,1,1,1,IPFC,ILFC)= $ FC.WELCHE(1,1,1,1,IPFC,ILFC)+ $ CONTRI ENDDO ENDDO SEGSUP,EIJK SEGSUP,EIJ * SEGPRT,FC SEGSUP,JAC * SEGSUP,JP SEGSUP,JT SEGSUP,G SEGSUP,IG * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine ccgnor' RETURN * * End of subroutine CCGNOR * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales