rtens
C RTENS SOURCE OF166741 24/10/07 21:15:46 12016 *-----------------------------------------------------------------------* * Operateur RTENS * * * * IPCHE (e) pointeur sur un MCHAML (CONTRAINTES ou DEFORMATIONS * * ou DEFORMATIONS INELASTIQUES) * * IPMODL (e) pointeur sur un MMODEL * * IMOT (e) 0 : repere cartesien ou repere d'orthotropie * * 1 : repere en coordonnees polaires * * 2 : repere en coordonnees cylindriques * * 3 : repere en coordonnees spheriques * * 4 : repere en coordonnees toriques circulaires * * 5 : repere en coordonnees toriques cartesiennes * * KMOT (e) 1 : transformation RT*A*R * * 2 : transformation R*A*RT * * utilisé avec le champ de gradient * IPTV1 (e) 1er vecteur (IMOT = 0) ou 1er point (IMOT <> 0) * * IPTV2 (e) 2eme vecteur (IMOT = 0) ou 2eme point (IMOT <> 0) * * IPTV3 (e) 3eme point (IMOT <> 0) * * IPCHE1 (e) pointeur sur un MCHAML de CARACTERISTIQUES * * ICAS (e) distingue les differents cas * * 1 = * 2 = * 3 = * 4 = option CHAM2 champ de gradient * IPCHAM (s) pointeur sur un MCHAML (CONTRAINTES ou DEFORMATIONS) * * (ou VARIABLES INTERNES ) * * * * Passage aux nouveaux Chamelem par S.RAMAHANDRY le 28/10/90 * * Corrections / redecoupage / ajouts D. R.-M. le 18/3/94 * *-----------------------------------------------------------------------* & IPTV1,IPTV2,IPTV3,IPCHE1,ICAS,IPCHAM) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCHAMP -INC SMCHAML -INC SMMODEL -INC SMINTE -INC SMCOORD -INC SMELEME SEGMENT NOTYPE CHARACTER*16 TYPE(NBTYPE) ENDSEGMENT SEGMENT MPTVAL INTEGER IPOS(NS) , NSOF(NS) INTEGER IVAL(NCOSOU) CHARACTER*16 TYVAL(NCOSOU) ENDSEGMENT POINTEUR MPTVA1.MPTVAL DIMENSION V1(4),V2(4),W2(3),W3(3) DIMENSION CENTR1(3),CENTR2(3),AXEI1(3) PARAMETER ( NINF=3 ) INTEGER INFOS(NINF) CHARACTER*(NCONCH) CONM CHARACTER*8 CMATE LOGICAL lsupgd lsupgd=.true. NHRM=NIFOUR * Activation du MMODEL MMODEL=IPMODL NSOUS=KMODEL(/1) ICONT=0 IDEFO=0 IDEF = 0 IVARI=0 MOCOMP = 0 MOEP = 0 MOVEC = 0 MCHELM=IPCHE IFOMEM=IFOCHE IF (TITCHE .EQ.'CONTRAINTES') ICONT = 1 IF (TITCHE .EQ.'DEFORMATIONS') IDEFO = 1 IF (TITCHE .EQ.'DEFORMATIONS INELASTIQUES') IDEFO = 2 if (idefo.gt.0) idef= 1 IF (TITCHE .EQ.'VARIABLES INTERNES') IVARI = 1 * Le sous-type du MCHAML doit etre CONTRAINTES ou DEFORMATIONS * sauf dans le cas gradient pour le moment IF (ICAS.NE.4.AND.ICONT.NE.1.AND.IDEFO.NE.1.AND.IDEFO.NE.2) THEN MOTERR(1:24) ='CONTRAINTES' MOTERR(25:48)='DEFORMATIONS' RETURN ENDIF * Verification du lieu support du MCHAML de contraintes *** CALL QUESUP (IPMODL,IPCHE,5,0,ISUP,IRETCO) ISUP = 5 IF (IRET.NE.0) RETURN IPCHE=IPPV * Verification du lieu support du MCHAML de caracteristiques IF (IPCHE1.NE.0) THEN ** CALL QUESUP (IPMODL,IPCHE1,5,1,ISUP1,IRETCA) ** IF (ISUP1.NE.0) RETURN ISUP1 = 5 IF (IRET.NE.0) RETURN IPCHE1=IPPV ENDIF * Creation du MCHAML resultat (apres rotation) * cas des champs de contraintes ou de deformations N1=NSOUS L1=12 IF (IVARI.EQ.1) L1=18 if (idefo.eq.2) L1=25 N3=6 SEGINI MCHELM IF (ICONT.EQ.1) THEN TITCHE='CONTRAINTES' ELSE IF (IDEFO.EQ.1) THEN TITCHE='DEFORMATIONS' ELSE IF (IDEFO.EQ.2) THEN TITCHE='DEFORMATIONS INELASTIQUES' ELSE IF (IVARI.EQ.1) THEN TITCHE='VARIABLES INTERNES' ENDIF IFOCHE=IFOUR IPCHAM=MCHELM NBTYPE=1 SEGINI NOTYPE TYPE(1)='REAL*8' MOTYR8 = NOTYPE * Boucle sur les zones du MMODEL ISOUSS = 0 DO 500 ISOUS=1,NSOUS ISOUSS = ISOUSS + 1 * compteurs de sous champs de lobjet rasutlat * Initialisations IVACOM=0 IVARES=0 IMODEL=0 NCOMP=0 MOCOMP=0 IVAVEC=0 MOVEC=0 NVEC=0 * >>> Recuparation des informations generiques <<< IMODEL=KMODEL(ISOUS) IPMAIL=IMAMOD CONM =CONMOD IMACHE(ISOUSS)=IPMAIL CONCHE(ISOUSS)=CONMOD * Informations contenues dans le MMODEL MELE=NEFMOD MELEME=IMAMOD * Nature et formulation du materiau CMATE = CMATEE MATE = IMATEE INAT = INATUU c GG : si le sous modele est un sure rien a faire ne cree pas de sous champs IF (NEFMOD.EQ.259) THEN ISOUSS = ISOUSS - 1 GOTO 500 ENDIF IF (IVARI.EQ.1) THEN * test sur le type de modele de materiau * en cas de variables internes en attendant que * tous les modeles soient branches * on admet actuellement les modeles ou toutes * les variables internes sont scalaires LEPROB=2 * cas des materiaux ou on n'a rien a faire IF(INAT.EQ. 0.OR.INAT.EQ. 1.OR.INAT.EQ. 3.OR. & INAT.EQ. 5.OR.INAT.EQ.15.OR.INAT.EQ.33.OR. & INAT.EQ.48) THEN LEPROB=0 ENDIF * cas des materiaux a traiter ( A FAIRE ) * IF(INAT.EQ. 4) THEN * LEPROB=1 * .......... * ENDIF * cas des materiaux non prevus IF(LEPROB.EQ.2) THEN SEGSUP MCHELM RETURN ENDIF ENDIF * Informations concernant l'element-fini * Coque integree ou non ? NPINT = INFMOD(1) MFR = INFELE(13) NBGS = INFELE(4) NSTRS = INFELE(16) MINTE = INFMOD(7) c* MINTE = INFELE(11) IPMINT = MINTE MINTE1 = INFELE(12) c* MINTE1 = INFMOD(8) <- pas toujours defini * Test presence MCHAML CARACTERISTIQUES si MFR=5 et IMOT<>0 IF (MFR.EQ.5.AND.ICAS.NE.1.AND.ICAS.NE.4 & .AND.IPCHE1.EQ.0) THEN MOTERR(1:32) = 'CARACTERISTIQUES' RETURN ENDIF * L'option GRADIENT ne fonctionne qu'en massif actuellement IF (ICAS.EQ.4.AND.MFR.NE.1.AND.MFR.NE.31.AND.MFR.NE.63) THEN RETURN ENDIF * Creation du tableau INFOS IF (IRTD.EQ.0) GOTO 9990 INFCHE(ISOUSS,1)=0 INFCHE(ISOUSS,2)=0 INFCHE(ISOUSS,3)=NHRM INFCHE(ISOUSS,4)=MINTE INFCHE(ISOUSS,5)=0 INFCHE(ISOUSS,6)=5 * Activation du segment MINTE NBPGAU=POIGAU(/1) * Activation du segment MELEME NBNN =NUM(/1) NBELEM=NUM(/2) IPPORE=0 IF(MFR.EQ.33) IPPORE=NBNN * Recherche des noms de composantes IF (ICONT.EQ.1) THEN nomid=lnomid(4) if (nomid.eq.0) then write(ioimp,*) 'ICONT : nomid = 0' endif ELSE IF (IDEFO.EQ.1) THEN nomid = lnomid(5) if (nomid.eq.0) then write(ioimp,*) 'IDEFO(1): nomid = 0' endif ELSE IF (IDEFO.EQ.2) THEN nomid=lnomid(13) if (nomid.eq.0) then write(ioimp,*) 'IDEFO(2): nomid = 0' endif ELSE IF (IVARI.EQ.1) THEN nomid=lnomid(10) if (nomid.eq.0) then write(ioimp,*) 'IVARI : nomid = 0' endif ENDIF ncomp = nomid.lesobl(/2) nfac = nomid.lesfac(/2) mocomp = nomid * Verification de leur presence IF(IVARI.EQ.1.AND.LEPROB.EQ.0) THEN NBTYPE=0 SEGINI NOTYPE ELSE NOTYPE=MOTYR8 ENDIF IF (NOTYPE.NE.MOTYR8) SEGSUP,NOTYPE IF (IERR.NE.0) GOTO 9990 IF (ISUP.EQ.1) THEN ENDIF * Cas des variables internes * Si rien a faire, on se contente de recopier la * zone elementaire du MCHAML IF(IVARI.EQ.1.AND.LEPROB.EQ.0) THEN MPTVAL=IVACOM NCOS=IVAL(/1) IE=0 DO 1021 ICOMP=1,NCOS IF(IVAL(ICOMP).NE.0) IE=IE+1 1021 CONTINUE N2=IE SEGINI MCHAML ICHAML(ISOUSS)=MCHAML NCOSOU=N2 NS=1 SEGINI MPTVA1 IVARES=MPTVA1 NOMID=MOCOMP NBROBL=LESOBL(/2) NBRFAC=LESFAC(/2) IE=0 DO 1022 ICOMP=1,NCOMP IF(IVAL(ICOMP).NE.0) THEN IE=IE+1 IF(ICOMP.LE.NBROBL) THEN NOMCHE(IE)=LESOBL(ICOMP) ELSE NOMCHE(IE)=LESFAC(ICOMP-NBROBL) ENDIF TYPCHE(IE)=TYVAL(ICOMP) MELVA1=IVAL(ICOMP) SEGINI,MELVAL=MELVA1 IELVAL(IE)=MELVAL MPTVA1.IVAL(IE)=MELVAL ENDIF 1022 CONTINUE GO TO 510 ENDIF * Taille des MELVAL a allouer (champ non constant a priori) N1PTEL=NBGS N1EL =NBELEM NBPTEL=N1PTEL NEL =N1EL * Creation du MCHAML pour la zone ISOUS N2=NCOMP SEGINI MCHAML ICHAML(ISOUSS)=MCHAML NS=1 NCOSOU=NCOMP SEGINI MPTVAL IVARES=MPTVAL NOMID=MOCOMP DO 102 ICOMP=1,NCOMP NOMCHE(ICOMP)=LESOBL(ICOMP) TYPCHE(ICOMP)='REAL*8' N2PTEL=0 N2EL=0 SEGINI MELVAL IELVAL(ICOMP)=MELVAL IVAL(ICOMP)=MELVAL 102 CONTINUE * Coordonnees des points caracterisant les * reperes choisis (spherique, cylindrique, ...) lsupgd=.true. IF (IMOT.NE.0) THEN IF (IMOT.EQ.1) THEN * Coordonnees POLAIRES IF (IDIM.EQ.2) THEN IREF=(IPTV1-1)*(IDIM+1) CENTR1(1)=XCOOR(IREF+1) CENTR1(2)=XCOOR(IREF+2) DO 12 II=1,4 V1(II)=0.D0 12 CONTINUE ELSE GOTO 9990 ENDIF ELSE IF (IDIM.EQ.3) THEN * Autres coordonnees IREF1=(IPTV1-1)*(IDIM+1) CENTR1(1)=XCOOR(IREF1+1) CENTR1(2)=XCOOR(IREF1+2) CENTR1(3)=XCOOR(IREF1+3) IREF2=(IPTV2-1)*(IDIM+1) AXEI1(1)=XCOOR(IREF2+1) AXEI1(2)=XCOOR(IREF2+2) AXEI1(3)=XCOOR(IREF2+3) DO 103 IC=1,IDIM V1(IC)=AXEI1(IC)-CENTR1(IC) 103 CONTINUE V1(4)=SQRT(V1(1)**2+V1(2)**2+V1(3)**2) IF (V1(4).EQ.0.D0) THEN GOTO 9990 ENDIF DO 104 IC=1,IDIM V1(IC) = V1(IC) / V1(4) 104 CONTINUE IF (IPTV3.NE.0) THEN IREF3=(IPTV3-1)*(IDIM+1) CENTR2(1)=XCOOR(IREF3+1) CENTR2(2)=XCOOR(IREF3+2) CENTR2(3)=XCOOR(IREF3+3) ENDIF ENDIF ELSE IF (ICAS.EQ.2) THEN * Repere cartesien (IPCHE1 = 0 et IMOT = 0) IF (IDIM.EQ.2) THEN IREF=(IPTV1-1)*(IDIM+1) V1(1)=XCOOR(IREF+1) V1(2)=XCOOR(IREF+2) V1(4)=SQRT(V1(1)**2+V1(2)**2) IF (V1(4).EQ.0.) THEN GOTO 9990 ENDIF ELSE IF (IDIM.EQ.3) THEN IREF1=(IPTV1-1)*(IDIM+1) V1(1)=XCOOR(IREF1+1) V1(2)=XCOOR(IREF1+2) V1(3)=XCOOR(IREF1+3) V1(4)=SQRT(V1(1)**2+V1(2)**2+V1(3)**2) IF (V1(4).EQ.0.D0) THEN GOTO 9990 ENDIF IF (IPTV2.NE.0) THEN IREF2=(IPTV2-1)*(IDIM+1) V2(1)=XCOOR(IREF2+1) V2(2)=XCOOR(IREF2+2) V2(3)=XCOOR(IREF2+3) V2(4)=SQRT(V2(1)**2+V2(2)**2+V2(3)**2) IF (V2(4).EQ.0.D0) THEN GOTO 9990 ENDIF W3(1)=(V1(2)*V2(3)-V1(3)*V2(2))/(V1(4)*V2(4)) W3(2)=(V1(3)*V2(1)-V1(1)*V2(3))/(V1(4)*V2(4)) W3(3)=(V1(1)*V2(2)-V1(2)*V2(1))/(V1(4)*V2(4)) W2(1)=(W3(2)*V1(3)-W3(3)*V1(2))/V1(4) W2(2)=(W3(3)*V1(1)-W3(1)*V1(3))/V1(4) W2(3)=(W3(1)*V1(2)-W3(2)*V1(1))/V1(4) ENDIF ENDIF ELSEIF (ICAS.EQ.1) THEN * On veut le tenseur dans le repere d'orthotropie. Il est * stocke pour chaque element dans un MCHAML de CARACTERISTIQUES * (IMOT = 0 et IPCHE1 <> 0) IF (MFR.EQ.1 .OR. MFR.EQ.31) THEN IF (IDIM.EQ.2) THEN NBROBL=2 NBRFAC=0 SEGINI NOMID MOVEC=NOMID LESOBL(1)='V1X ' LESOBL(2)='V1Y ' ELSE NBROBL=6 NBRFAC=0 SEGINI NOMID MOVEC=NOMID LESOBL(1)='V1X ' LESOBL(2)='V1Y ' LESOBL(3)='V1Z ' LESOBL(4)='V2X ' LESOBL(5)='V2Y ' LESOBL(6)='V2Z ' ENDIF ELSE IF (MFR.EQ.3.OR.MFR.EQ.5.OR.MFR.EQ.9) THEN NBROBL=2 NBRFAC=0 SEGINI NOMID MOVEC=NOMID LESOBL(1)='V1X ' LESOBL(2)='V1Y ' ENDIF NVEC = NBROBL+NBRFAC & 1,INFOS,3,IVAVEC) IF (IERR.NE.0) GOTO 9990 * cas du champ de gradient ELSE IF (ICAS.EQ.4) THEN * On veut tourner le tenseur la matrice contenue dans * un MCHAML de GRADIENT ( IPCHE1 ) nomid=lnomid(3) if (nomid.eq.0) then write(ioimp,*) 'ICAS : nomid = 0' endif movec=nomid nvec=lesobl(/2) nfac=lesfac(/2) lsupgd=.false. * VERIFICATION DE LEUR PRESENCE & 1,INFOS,3,IVAVEC) IF (IERR.NE.0) GOTO 9990 ENDIF IF (ICAS.NE.1.AND.MFR.EQ.5) THEN * Caracteristiques pour les coques epaisses NBROBL = 1 NBRFAC = 0 SEGINI NOMID MOEP = NOMID LESOBL(1) = 'EPAI' NVEC = NBROBL + NBRFAC & 1,INFOS,3,IVAEP) IF (IERR.NE.0) GOTO 9990 ENDIF * MASSI COQUE COQEP POUT CIST THER TUYAU LISP GOTO (10,66,30,66,50,66,66,66,90,66,66,66,66,66,66),MFR IF (MFR.EQ.31.or.MFR.EQ.63) GOTO 10 66 CONTINUE MOTERR(1:8)=NOMFR(MFR) GOTO 9990 10 CONTINUE * Formulations massive et incompressible IF (ICAS.EQ.4) THEN * cas du champ de gradient & IDEF,MINTE,MELE,NPINT,NVEC,KMOT) IF(IERR.NE.0) GO TO 9990 ELSE * autres cas & IVAVEC,IVACOM,IVARES,IDEF,MINTE,MELE,NPINT, & NVEC,V1,V2,W2,W3,CENTR1,CENTR2,AXEI1,IER1) IF (IER1.NE.0) GOTO 9990 ENDIF GOTO 510 30 CONTINUE * Formulation coque (COQ2, COQ3, DKT ...) IF (IFOMEM.LT.2) THEN GOTO 9990 ENDIF & IVARES,IDEF,MINTE,MELE,NPINT,NVEC,V1,V2,W2,W3, & CENTR1,CENTR2,AXEI1,IER1) IF (IER1.NE.0) GOTO 9990 GOTO 510 50 CONTINUE * Formulation coque epaisse (COQ6, COQ8 ...) & IVARES,IVAEP,IDEF,MINTE,MINTE1,MELE,NPINT,NVEC, & V1,V2,W2,W3,CENTR1,CENTR2,AXEI1,ICAS,IER1) IF (IER1.NE.0) GOTO 9990 GOTO 510 90 CONTINUE * Formulation coque avec cisaillement transverse * (COQ4, DST ...) IF (IFOMEM.LT.2) THEN GOTO 9990 ENDIF & IVARES,IDEF,MINTE,MELE,NPINT,NVEC,V1,V2,W2,W3, & CENTR1,CENTR2,AXEI1,ICAS,IER1) IF (IER1.NE.0) GOTO 9990 GOTO 510 * Desactivation des segments de la zone ISOUS 510 CONTINUE IF (ISUP.EQ.1) THEN ELSE ENDIF NOMID=MOVEC IF (NOMID.NE.0.and.lsupgd) SEGSUP NOMID NOMID = MOEP IF (NOMID.NE.0) SEGSUP NOMID * Fin de la boucle sur les zones du MCHAML 500 CONTINUE IF (N1.NE.ISOUSS) then N1=ISOUSS SEGADJ MCHELM ENDIF RETURN 9990 CONTINUE * Erreur dans une zone : desactivation puis retour IF (ISUP.EQ.1) THEN ELSE ENDIF NOMID=MOVEC IF (NOMID.NE.0.and.lsupgd) SEGSUP NOMID NOMID = MOEP IF (NOMID.NE.0) SEGSUP NOMID IF (ISOUS.GT.1) SEGSUP MCHAML SEGSUP MCHELM RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales