varica
C VARICA SOURCE OF166741 24/10/03 21:15:41 12022 *____________________________________________________________________ * * Calcul d'un champ variable appele par VARI * * ENTREES : * --------- * * IPOI1 Pointeur sur un MCHAML ou un CHPOINT * IPOI2 Pointeur sur un EVOLUTIO * IPMODL Pointeur sur un MMODEL * MICHE = 1 si on a lu un CHPOINT * JEMIL = 1 A 5 selon le support choisi * * SORTIE : * -------- * * IRET Pointeur sur le MCHAML resultat * =0 si operation impossible * * Passage aux nouveaux CHAMELEMs par JM CAMPENON LE 05/91 * *____________________________________________________________________ IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCHAML -INC SMCHPOI -INC SMMODEL -INC SMEVOLL -INC SMLREEL -INC SMELEME -INC SMINTE -INC SMCOORD SEGMENT SWORK REAL*8 VAL1(NBPGA1),VAL2(NBPGAU),VALN(NBNN) REAL*8 SHP(6,NBNN) ,XE(3,NBNN) ENDSEGMENT SEGMENT INFO INTEGER INFELL(JG) ENDSEGMENT CHARACTER*(LOCOMP) MOTREF,MOTABS IRET = 0 IPOIN1= 0 * * On recupere l'objet evolution * MEVOLL = IPOI2 SEGACT,MEVOLL KEVOLL = mevoll.IEVOLL(1) SEGACT,KEVOLL IF (kevoll.TYPX .NE. 'LISTREEL' .OR. & kevoll.TYPY .NE. 'LISTREEL') THEN MOTERR= 'LISTREEL' RETURN ENDIF MLREE1 = kevoll.IPROGX MLREE2 = kevoll.IPROGY MOTABS = kevoll.NOMEVX * SEGACT,MLREE1,MLREE2 * Petites verifications sur le contenu de l'evolution IF (NBPOIX.NE.NBPOIY) THEN RETURN ENDIF JORDO = 0 IF (JORDO.EQ.0) THEN RETURN ENDIF * IPOIC = IPOI1 IF (MICHE.EQ.0) GO TO 231 * * Traitement du CHPOINT - Recherche du nombre de composantes * MOTREF = MOTABS MCHPO1 = IPOIC SEGACT,MCHPO1 NSOUP1 = MCHPO1.IPCHP(/1) * DO 329 IA = 1, NSOUP1 MSOUP1 = MCHPO1.IPCHP(IA) SEGACT,MSOUP1 NC1 = MSOUP1.NOCOMP(/2) IF (NC1.EQ.1) GO TO 321 * 325 CONTINUE GOTO 320 * 321 CONTINUE IF (IA.EQ.1) THEN MOTREF = MSOUP1.NOCOMP(1) GOTO 330 ENDIF * IF (MOTREF.NE.MSOUP1.NOCOMP(1)) GOTO 325 * 330 CONTINUE * 329 CONTINUE * 320 CONTINUE IF (MOTREF.EQ.MOTABS) THEN IVID = 0 IF (IERR.NE.0) RETURN ELSE IVID = 1 IPOI11 = IPOIC ENDIF * * On convertit le CHPOINT en MCHAML * IF (IERR.NE.0) RETURN * * Poursuite du traitement pour un MCHAML * 231 CONTINUE * MCHEL1 = IPOIC SEGACT,MCHEL1 NINF = MCHEL1.INFCHE(/2) * * Activation du modele : * MMODEL = IPMODL SEGACT,MMODEL NSOUS = mmodel.KMODEL(/1) DO ISOUS = 1, NSOUS IMODEL = mmodel.KMODEL(ISOUS) SEGACT,IMODEL ENDDO * * Creation du MCHAML * N1 = NSOUS N3 = 6 L1 = 8 SEGINI,MCHELM mchelm.IFOCHE = IFOUR mchelm.TITCHE = 'SCALAIRE' * * Boucle sur les sous zone du MCHAML * DO 100 ISOUS = 1, NSOUS * * Mise en concordance des pointeurs de maillage * MELEME = MCHEL1.IMACHE(ISOUS) DO 150 IO = 1, NSOUS imodel = mmodel.KMODEL(IO) IF (imodel.IMAMOD.EQ.MELEME .AND. & imodel.CONMOD.EQ.MCHEL1.CONCHE(ISOUS)) GOTO 160 150 CONTINUE GOTO 9910 * 160 CONTINUE * * Recherche de la composante * MCHAM1 = MCHEL1.ICHAML(ISOUS) SEGACT,MCHAM1 * * Recherche du nom MOTABS * pour les champ a une composante pas de verif. de MOTABS * ncomp1 = MCHAM1.NOMCHE(/2) IF (ncomp1.EQ.1) THEN IPLAC = 1 ELSE IPLAC = 0 * * On a pas trouve la composante * IF (IPLAC.EQ.0) THEN MOTERR(1:8) = MOTABS GOTO 9920 ENDIF ENDIF * IF (MCHAM1.TYPCHE(IPLAC).NE.'REAL*8') THEN MOTERR(1:4) = 'VARI' MOTERR(5:8) = MCHAM1.NOMCHE(IPLAC) GOTO 9920 ENDIF * * Information sur l'element fini * MELE = imodel.NEFMOD * * On recupere le nombre de points support NBPGA1 pour l'ancien ch * MINTE1 = 0 IF (MCHEL1.INFCHE(ISOUS,4).EQ.0) THEN * * La sous zone est aux noeuds * if (infmod(/1).lt.3) then IPTR1 = 0 IF (IERR.NE.0) GOTO 9920 info = IPTR1 MINTE1 = info.INFELL(11) segsup info else MINTE1 = imodel.INFMOD(3) endif ELSE MINTE1 = MCHEL1.INFCHE(ISOUS,4) ENDIF SEGACT,MINTE1 NBPGA1 = MINTE1.SHPTOT(/3) * * On recupere le nombre de points support NBPGAU du nouveau champ * MINTE = 0 if (infmod(/1).lt.2+jemil)then IPTR1 = 0 IF (IERR.NE.0) GOTO 9930 info = IPTR1 MINTE = info.INFELL(11) MELGEO = info.INFELL(14) segsup info else MINTE = imodel.INFMOD(2+JEMIL) MELGEO = imodel.INFELE(14) endif SEGACT,MINTE NBPGAU = minte.SHPTOT(/3) * ** IMACHE(ISOUS) = MELEME IMACHE(ISOUS) = MCHEL1.IMACHE(ISOUS) CONCHE(ISOUS) = MCHEL1.CONCHE(ISOUS) DO 191 IP = 1,NINF INFCHE(ISOUS,IP) = MCHEL1.INFCHE(ISOUS,IP) 191 CONTINUE INFCHE(ISOUS,4) = MINTE INFCHE(ISOUS,6) = JEMIL * * Creation du MCHAML de la sous zone * N2 = 1 SEGINI,MCHAML ICHAML(ISOUS) = MCHAML mchaml.TYPCHE(1) = 'REAL*8' mchaml.NOMCHE(1) = 'SCAL' * MELVA1 = MCHAM1.IELVAL(IPLAC) SEGACT,MELVA1 N1PTE1 = MELVA1.VELCHE(/1) N1EL1 = MELVA1.VELCHE(/2) * * taille du nouveau melval/chamelem * IF (N1PTE1.EQ.1) THEN N1PTEL = 1 ELSE N1PTEL = NBPGAU ENDIF N1EL = N1EL1 N2PTEL = 0 N2EL = 0 SEGINI,MELVAL mchaml.IELVAL(1) = MELVAL * * Traitement immediat si champ constant * IF (N1PTE1.EQ.1) THEN DO 4120 IEL = 1, N1EL XTT1 = MELVA1.VELCHE(1,IEL) & XTT1, YTT1) melval.VELCHE(1,IEL) = YTT1 4120 CONTINUE * ELSE * * Meme support (N1PTEL = NBPGAU = NBPGA1 = N1PTE1) * IF (MINTE.EQ.MINTE1) THEN * DO 3120 IEL = 1, N1EL DO 3121 IGAU = 1, N1PTE1 XTT1 = MELVA1.VELCHE(IGAU,IEL) & XTT1,YTT1) melval.VELCHE(IGAU,IEL) = YTT1 3121 CONTINUE 3120 CONTINUE * * Support different * ELSE * IF (JDIM.EQ.0) THEN GOTO 9940 ENDIF * N1PAUX = N1PTE1 * Pour les COQ4, le nb de pt de GAUSS vaut 5, mais on * ne prend que les 4 premiers (le 5ieme sert uniquement * au cisaillement) IF (MELE.EQ.49.AND.N1PAUX.EQ.5) N1PAUX = 4 * * On recupere le nombre d'elements * SEGACT,MELEME NBNN = meleme.NUM(/1) NBELEM = meleme.NUM(/2) * SEGINI,SWORK DO 3130 IEL = 1, NBELEM DO 3131 IGAU = 1, N1PTE1 XTT1 = MELVA1.VELCHE(IGAU,IEL) & XTT1,YTT1) VAL1(IGAU) = YTT1 3131 CONTINUE KERRE = JDIM & IPOIN1,KERRE) IF (KERRE.NE.0) THEN GOTO 9950 ENDIF * DO 3132 IGAU = 1, N1PTEL melval.VELCHE(IGAU,IEL) = VAL2(IGAU) 3132 CONTINUE 3130 CONTINUE SEGSUP,SWORK * ENDIF * ENDIF * 100 CONTINUE * IRET = MCHELM RETURN * * Erreur dans une sous zone / desactivation et retour * 9950 CONTINUE SEGSUP,SWORK 9940 CONTINUE SEGSUP,MELVAL,MCHAML 9930 CONTINUE * 9920 CONTINUE * 9910 CONTINUE SEGSUP,MCHELM IRET = 0 END
© Cast3M 2003 - Tous droits réservés.
Mentions légales