matcar
C MATCAR SOURCE OF166741 24/05/06 21:15:22 11082 *--------------------------------------------------------------------* * * * Sous-programme associe @ l'operateur MATR et CARB * * __________________________________________________ * * * * Creation d'un champ de caracteristiques materielles et/ou * * geometriques. * * * * Commentaire : * * * * - En utilisant MATR : On est autorise a donner des caracteristi-* * ques materielles et geometriques. * * MONCAS = 'MATERIAU' * * Toutes les autres composantes ne seront * * pas prises en comptes. * * * * - En utilisant CARB : On est autorise a donner des caracteristi-* * ques geometriques. * * MONCAS = 'CARACTER' * * Toutes les autres composantes ne seront * * pas prise en comptes. * * * * Remarque importante: * * * * Un certain nombre de composantes par defaut est requis lors * * d'un processus de calcul. Il est possible d'en definir d'autres * * @ la convenance de l'utilisateur.(l'appel a matcar devra alors * * se faire avec MONCAS <> 'CARACTER' et MONCAS <> 'MATERIAU' * * * * Auteur, date de creation: * * ------------------------- * * * * Denis ROBERT-MOUGIN, le 21 decembre 1987. * * * * - Mise a niveau avec MATE pour les materiaux ORTHOTROPES par : * * jm CAMPENON le 29 08 90 * * * * - Autoriser uniquement la prise en compte des : * * - carac. geom. quand provenance de CARB (MONCAS = 'CARACTER') * * - carac. geom. et mater. quand provenance de MATR * * (MONCAS = 'MATERIAU') * * jm CAMPENON le 23 10 90 * * * * -MISE A NIVEAU POUR L'ANISOTROPIE ET L'ORTHOTROPIE DANS LES * * ELEMENTS MASSIFS PAR P. DOWLATYARI OCT. 90 * *--------------------------------------------------------------------* IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC CCHAMP -INC SMLMOTS -INC SMLREEL -INC SMLENTI -INC SMMODEL POINTEUR NOMID1.NOMID C-INC SMLCHPO -INC SMTABLE -INC SMELEME * MOMATR pointera sur la liste des caracteristiques materielles * MOCARA pointera sur la liste des caracteristiques geometriques PARAMETER ( JER1=16 ) REAL*8 RECOM,RECOM2 LOGICAL RFLAG,lsupma,lsupca,d_mela,d_nast CHARACTER*(LOCOMP) MOCHOI,MOBUF CHARACTER*8 CAR,MONCAS,CMATE CHARACTER*16 LETYP LOGICAL L0,L1 CHARACTER*8 TYPRET,CHARRE C Tableau fixe pour appel a LIRMOT sans ARGUMENT ELEMENT DE SEGMENT PARAMETER ( NMOT1=500 ) CHARACTER*(LOCOMP) CMOTS1(NMOT1) EXTERNAL LONG * * MONCAS='MATERIAU' --> IFLAG=1 (SEULEMENT LES CARAC. GEOM. ET * MATER. : MATE) * MONCAS='CARACTER' --> IFLAG=2 (SEULEMENT LES CARAC. GEOM. : CARA) * IFLAG=0 tous les noms composantes voulues * IFLAG=0 IF(MONCAS.EQ.'CARACTER') IFLAG=2 IF(MONCAS.EQ.'MATERIAU') IFLAG=1 * * Lecture d'un MODELE : * MOTERR =' MODELE ' IF(IERR.NE.0) RETURN * * Initialisation des segments * JG =0 JGN=LOCOMP JGM=0 SEGINI,MLMOTS SEGINI,MLMOT1 SEGINI,MLMOT2 SEGINI,MLMOT3 SEGINI,MLREE1 SEGINI,MLENT2 * ICARA = 0 IVECT=0 * NUDIR1=0 NUDIR2=0 NUMP1=0 NUMP2=0 NUMP3=0 ANG=0.D0 ANG2=0.D0 IPLIQU=0 IRACOR=0 ITHER = 0 IDIFF = 0 IMETA = 0 ICHPH = 0 ICONT = 0 IMELA = 0 ** ILIMA = 0 ICOUD = 0 RFLAG = .FALSE. ITBAS = 0 ITMOD = 0 * MOMATR = 0 lsupma = .false. MOCARA = 0 lsupca = .false. MMODEL = IPMODE c debut romain AM sellier SEGACT,MMODEL N1 = mmodel.KMODEL(/1) DO I = 1, N1 IMODEL = mmodel.KMODEL(I) SEGACT,IMODEL ENDDO c fin romain AM sellier * * QUID ici si N1 = 0 : mmodel VIDE ? * IF(N1.EQ.0)THEN * CALL ERREUR(xx) * GOTO 99 * ENDIF * Ici on ne travaille que sur le 1er sous-modele ! * Ce qui suppose que tous les autres sont identiques au 1er !!! Aie ou Ouille ? IMODEL = mmodel.KMODEL(1) NFOR = imodel.FORMOD(/2) NMAT = imodel.MATMOD(/2) if (CMATEE.NE.' ') then CMATE = CMATEE MATE = IMATEE INAT = INATUU else endif * Normalement ici, pas de souci ? IF(CMATE.EQ.' ')THEN GOTO 99 ENDIF IF(NFOR.EQ.2)THEN IF((FORMOD(1).EQ.'MECANIQUE '.AND. 1 FORMOD(2).EQ.'LIQUIDE ').OR. 2 (FORMOD(1).EQ.'LIQUIDE '.AND. 3 FORMOD(2).EQ.'MECANIQUE '))IRACOR=1 ENDIF * ** CALL PLACE(FORMOD,NFOR,ILIMA,'LIAISON_MATERIELLE') C Modele METALLURGIE, cree par T.L. en mai 2018 * C= Element fini et formulation associee C= En DIMEnsion 1, on force formulation MASSIVE pour les elements POI1 C= (utilises en convection et en rayonnement). MELE = imodel.NEFMOD IF(IDIM.EQ.1.AND.MELE.EQ.45) MFR1=1 * IF(lnomid(6).ne.0.and.imela.eq.0)THEN lsupma=.false. momatr = lnomid(6) nomid = momatr segact nomid nbrmat=lesobl(/2) nbrmatf=lesfac(/2) else lsupma=.true. NOMID=MOMATR SEGACT NOMID endif IF(nbrmat+nbrmatf .EQ. 0)THEN MOTERR ='MATE' MOTERR(5:8)=NOMTP(MELE) GO TO 99 ENDIF * if(lnomid(7).ne.0)THEN lsupca=.false. mocara=lnomid(7) nomid = mocara segact nomid nbrcar = lesobl(/2) nbrcarf = lesfac(/2) else lsupca=.true. NOMID = MOCARA SEGACT NOMID endif * write(6,*) 'matcar nbrcar,nbrcarf',nbrcar,nbrcarf * MOCHOI = ' ' * IMIL = 1 10 CONTINUE INCM1 = 0 INCM2 = 0 INCM3 = 0 INCM4 = 0 * IRBUF = 0 IRCHOI = 0 C Concaténation des MOTS attendus pour le LIRMOT discriminant NOMID = MOMATR NBOBL1 = NOMID.LESOBL(/2) NBFAC1 = NOMID.LESFAC(/2) NOMID1 = MOCARA NBOBL2 = NOMID1.LESOBL(/2) NBFAC2 = NOMID1.LESFAC(/2) JGM = NBOBL1 + NBFAC1 + NBOBL2 + NBFAC2 IF(JGM .GT. NMOT1)THEN WRITE(*,*)'AUGMENTER LA TAILLE DE CMOTS1 DANS MATCAR.ESO' ENDIF DO IOBL=1,NBOBL1 CMOTS1(IOBL)=NOMID.LESOBL(IOBL) ENDDO DO IFAC=1,NBFAC1 CMOTS1(NBOBL1+IFAC)=NOMID.LESFAC(IFAC) ENDDO DO IOBL=1,NBOBL2 CMOTS1(NBOBL1+NBFAC1+IOBL)=NOMID1.LESOBL(IOBL) ENDDO DO IFAC=1,NBFAC2 CMOTS1(NBOBL1+NBFAC1+NBOBL2+IFAC)=NOMID1.LESFAC(IFAC) ENDDO MJGM=-JGM C LIRMOT appele avec MJGM<0 => on utilise des abreviations IF(IERR.NE.0) GOTO 99 ** write(6,*) 'matcar apres lirmot ',iplace IF(IPLACE .EQ. 0)THEN MOBUF=MOBUF(1:4) IF(IERR .NE.0) GOTO 99 IF(IRBUF.EQ.0) GOTO 20 MOCHOI=MOBUF IRCHOI=IRBUF ELSE IF (IPLACE.GT.0 .AND. IPLACE.LE.NBOBL1)THEN INCM1 = IPLACE ELSEIF(IPLACE.GT.NBOBL1 .AND. IPLACE.LE.NBOBL1+NBFAC1)THEN INCM3 = IPLACE - NBOBL1 ELSEIF(IPLACE.GT.NBOBL1+NBFAC1 .AND. & IPLACE.LE.NBOBL1+NBFAC1+NBOBL2)THEN INCM2 = IPLACE - NBOBL1 - NBFAC1 ELSE INCM4 = IPLACE - NBOBL1 - NBFAC1 - NBOBL2 ENDIF MOBUF=CMOTS1(IPLACE) ** write(6,*) 'matcar 305 ',mobuf if (mobuf(1:4).eq.'VECT') ivect=1 ENDIF * IMIL=0 * * PETIT TEST POUR COQ3 NON EXCENTRABLE MILL 21 / 2 /92 * IF(MELE.EQ.27.AND.MFR1.EQ.3)THEN IF(MOBUF.EQ.'EXCE')THEN GOTO 99 ENDIF ENDIF * * On desire lire une composante "quelconque": * IF(IPLACE .EQ. 0)THEN IF(MOCHOI.EQ.'PARA'.AND.IRCHOI.NE.0)THEN NUDIR2=1 GOTO 10 ENDIF IF(MOCHOI.EQ.'PERP'.AND.IRCHOI.NE.0)THEN NUDIR2=2 GOTO 10 ENDIF ENDIF * * kich test mot cle * IF(MOBUF.EQ.'REND'.AND.IRBUF.NE.0)THEN RFLAG = .TRUE. ENDIF * * Lecture eventuelle d'un flottant * IF(IRET2.EQ.1)THEN * * kich rendement cas isotrope * IF(RFLAG.AND.MOBUF.EQ.'REND'.AND.IRBUF.NE.0) RFLAG = .FALSE. * * Dans le cas ou on lit le mot incline on peut eventuellement trouver * en plus de l'angle un point donnant la direction de la normal * exterieur @ la coque * IF(MOCHOI.EQ.'INCL'.AND.IRCHOI.NE.0)THEN NUDIR2=3 ANG=RECOM*XPI/180.D0 IF((IDIM.EQ.3.AND.MFR1.EQ.3).OR.MFR1.EQ.9.OR. . MFR1.EQ.5.OR.(IDIM.EQ.3.AND.MFR1.EQ.35))THEN IF(IERR.NE.0) GOTO 99 ENDIF * en 2D, 2eme angle possible pour rotation hors plan IF(IFOUR.EQ.1)THEN IF(IRET22.NE.0) ANG2=RECOM2*XPI/180.D0 ENDIF GOTO 10 ENDIF IF(IFLAG.NE.2)THEN NOMID=MOMATR ELSE IF(INCM1.NE.0)THEN MOTERR =LESOBL(INCM1) GOTO 99 ELSE IF(INCM3.NE.0)THEN MOTERR =LESFAC(INCM3) GOTO 99 ENDIF ENDIF ENDIF * NOMID=MOCARA * IF(IFLAG.EQ.0)THEN ELSE IF(IRCHOI.NE.0)THEN MOTERR =MOCHOI GOTO 99 ENDIF ENDIF * SEGADJ MLREE1 ELSE IF(IERR.NE.0) GO TO 99 IF(RFLAG)THEN IF(CAR.EQ.'MOT ')THEN GOTO 10 ELSE * kich matrice rendement IF(MOCHOI.EQ.'REND'.AND.IRCHOI.NE.0) RFLAG = .FALSE. ENDIF ENDIF IF(IERR.NE.0) GO TO 99 * * On a lu un objet de type autre qu' un flottant * IF(IRACOR.EQ.1.AND.MOCHOI.EQ.'LIQU' .AND.IRCHOI.NE.0)THEN IF(CAR.NE.'MAILLAGE')THEN MOTERR ='MAILLAGE' GOTO 99 ELSE IPLIQU=IPTRUC GOTO 10 ENDIF ELSEIF (MOCHOI.EQ.'DIRE'.AND.IRCHOI.NE.0)THEN IF(MATE.NE.1.AND.MATE.NE.2.AND.MATE.NE.3.AND.MATE.NE.4.AND. > .NOT.RFLAG)THEN GOTO 99 ENDIF IF(CAR.NE.'POINT')THEN MOTERR ='POINT' GOTO 99 ELSE NUDIR1=1 NUMP1=IPTRUC ENDIF * * DANS LE CAS DES ELEMENTS MASSIFS 3D IL FAUT DEUX POINTS * IF ((MFR1.EQ.1 .OR. MFR1.EQ.31 .OR. & MFR1.EQ.33 .OR. MFR1.EQ.45.OR. MFR1.EQ.75) S .AND. IDIM.EQ.3)THEN IF(IERR.NE.0.OR.IRET.EQ.0)GO TO 99 ENDIF GOTO 10 ELSEIF (MOCHOI.EQ.'RADI'.AND.IRCHOI.NE.0)THEN IF(CAR.NE.'POINT')THEN MOTERR ='POINT' GOTO 99 ELSE NUDIR1=2 NUMP1=IPTRUC ENDIF * * DANS LE CAS DES ELEMENTS MASSIFS 3D IL FAUT DEUX POINTS * IF ((MFR1.EQ.1 .OR. MFR1.EQ.31 .OR. & MFR1.EQ.33 .OR. MFR1.EQ.45.OR. MFR1.EQ.75) S .AND. IDIM.EQ.3)THEN IF(IERR.NE.0.OR.IRET.EQ.0)GO TO 99 ENDIF GOTO 10 ENDIF * IF(IFLAG.NE.2)THEN NOMID=MOMATR ELSE IF(INCM1.NE.0)THEN MOTERR =LESOBL(INCM1) GOTO 99 ELSE IF(INCM3.NE.0)THEN MOTERR =LESFAC(INCM3) GOTO 99 ENDIF ENDIF ENDIF * NOMID=MOCARA * IF(IFLAG.EQ.0)THEN ELSE IF(IRCHOI.NE.0)THEN MOTERR =MOCHOI GOTO 99 ENDIF ENDIF * JG=MLENT2.LECT(/1)+1 SEGADJ MLENT2 MLENT2.LECT(JG)=IPTRUC ENDIF GOTO 10 * END DO * 20 CONTINUE * * DANS LE CAS DES TUYAUX 3D ,ON REGARDE SI LES CARACTERISTIQUES * GEOMETRIQUES ONT ETE DONNEES ,SI OUI ON VERIFIE SI ON EST * DANS LE CAS DES COUDES * IF(MFR1.EQ.13.AND.IDIM.EQ.3)THEN IF(IGEO.NE.0)THEN ENDIF ENDIF * * DANS LE CAS DES POUTRES 3D ,ON REGARDE SI LES CARACTERISTIQUES * GEOMETRIQUES ONT ETE DONNEES * IF(MFR1.EQ.7)THEN ENDIF * * TRAITEMENT MODELE DDI * IF(INAT.EQ.63)THEN & THEN RETURN ENDIF & THEN RETURN ENDIF & THEN RETURN ENDIF & THEN RETURN ENDIF ENDIF * VERIFICATIONS CAS D'UN MODELE MODAL IF(MFR1.EQ.27.AND.MELE.EQ.45)THEN MOTERR ='FREQ ' RETURN ENDIF ENDIF MOTERR ='MASS ' RETURN ENDIF ENDIF ENDIF * * tri redondance mlmot1 IF(jgm.ge.2)THEN segini mlmot5 ik5 = 1 do 151 jj = 2, jgm do jj5 = 1, ik5 return endif enddo ik5 = ik5 + 1 151 continue segsup mlmot5 endif C Traitement particulier pour le modele de Gurson2 IF(INAT.EQ.64)THEN IF(IQ2.EQ.0)THEN SEGADJ MLREE1 SEGADJ MLMOT1 ENDIF IF(IQ3.EQ.0)THEN SEGADJ MLREE1 SEGADJ MLMOT1 ENDIF ENDIF IF((IRACOR.EQ.0.AND.IPLIQU.EQ.0.and.nefmod.ne.45).OR. IF(ITHER.NE.0 .OR. IDIFF.NE.0 .OR. IMETA.NE.0)THEN IF(MFR1 .EQ. 75)THEN C Cas des JOI1 (MFR=75) ==> Ressorts THERMIQUES C ==================== ISUP=1 ELSE C Support 6 SAUF pour le RAYONNEMENT... C Les cas-tests de RAYONNEMENT sont en erreur sans ca... IF(iray.EQ.0)THEN ISUP = 6 ELSE ISUP = 3 ENDIF ENDIF ELSEIF(ICONT.NE.0 .OR. ICHPH.NE.0)THEN ISUP=1 ELSE ISUP=3 ENDIF LETYP ='CARACTERISTIQUES' itart=0 & MLENT2,LETYP,JER1,ISUP,ICARA,itart) IF(IERR.NE.0) GO TO 99 ENDIF * * TRAITEMENT POUR LES ELEMENTS RACCORDS FLUIDE/STRUCTURE * IF(IRACOR.NE.0.AND.IPLIQU.NE.0)THEN IF(IERR.NE.0)GOTO 99 ENDIF * * TRAITEMENT PARTICULIER POUR LES POUTRES ET TUYAUX * PB DU VECTEUR LOCAL - MILL FEV 92 * ** write(6,*) 'matcar avant pouvlo',mfr1,icoud,igeo ** IF((MFR1.EQ.7.OR.(MFR1.EQ.13.AND.ICOUD.EQ.0)) IF((MFR1.EQ.7.OR.(MFR1.EQ.13 )) & .and.(ivect.ne.0.or.IGEO.NE.0).AND.IDIM.EQ.3)THEN ** & .AND.IDIM.EQ.3)THEN IF(IERR.NE.0) GO TO 99 ENDIF * * Traitement pour les materiaux orthotropes * C= Dans le cas IDIM=1, on ne traite pas les mots cles PARA,DIRE,PERP... C= car les directions d'orthotropie correspondent au repere global d_mela = formod(1).ne.'MELANGE' d_nast = formod(1).ne.'NAVIER_STOKES' IF(IFLAG.NE.2.and.nefmod.ne.45.and.d_mela.and.d_nast.and. & IMETA.eq.0.AND.ICHPH.EQ.0) THEN IF(IDIM.NE.1)THEN & NUMP3,ANG,ANG2,IPCARA,RFLAG) IF(IERR.NE.0) GO TO 99 IF(IPCARA.NE.0)THEN ICARA=IPCARA ENDIF ENDIF * romain gontero & sellier * preconditionnement pour modele de fibres dans FLDO3D * tester si on a un modele de fibre * extraire variable prefibr dans fluendo si=1 IF((IFLAG.NE.2).and.(formod(1).eq.'MECANIQUE').and.(INAT.eq.187)) # THEN CALL CPREFIB (IPMODE,MLMOT2,ISUP,ICARA) * IERR=0 IF(IERR.NE.0) GO TO 99 ENDIF * fin Romain & sellier ENDIF * * MODAL - traitement direct a partir de la table BASE MODALE * IF(nefmod.eq.45.and.MFR1.EQ.27.and.icara.eq.0)THEN IF(itbas.eq.0)THEN IF(IRETOU.NE.0)THEN & 'TABLE',I1,X1,CHARRE,L1,ITMOD) itbas = itmod ELSE ENDIF endif jg = 0 segini mlreel,mlree1,mlree2,mlenti,mlent2 n1 = 1 segini mmode1 C segini mlchpo do 49 ii = 1, kmodel(/1) IMODEL=KMODEL(ii) mmode1.kmodel(1) = imodel segact imodel meleme = imamod segact meleme do 48 jj = 1,num(/2) ipoi1 = num(1,jj) * de quel mode s agit-il ? mtable = itbas segact mtable mlo = mlotab IM = 0 40 CONTINUE IM = IM + 1 TYPRET = ' ' & TYPRET,I1,X1,CHARRE,L1,ITMOD) IF(ITMOD.NE.0 .AND. TYPRET.EQ.'TABLE ')THEN & 'POINT',I1,X1,' ' ,L1,IPTS) IF(ipts.eq.ipoi1) goto 45 ENDIF IF(im.lt.mlo) goto 40 interr(1) = ipoi1 * pas trouve de caracteristiques pour le point support return 45 continue & 'FLOTTANT',I1,XFREQ,' ',L1,IP1) if(xfreq.lt.0.D0)THEN MOTERR ='FREQ ' RETURN endif & 'FLOTTANT',I1,XMGEN,' ',L1,IP1) & 'CHPOINT ',I1,X1,' ',L1,ITDEPL) lect(**) = itdepl 48 continue 49 continue NOMID=MOMATR * voir aussi idmatr * IF(INCM3.NE.0) MLMOT2.MOTS(**) = LESFAC(INCM3) JG=MLENT2.LECT(/1)+3 SEGADJ MLENT2 MLENT2.LECT(JG-2) = mlree1 MLENT2.LECT(JG-1) = mlree2 MLENT2.LECT(JG) = mlenti ISUP=3 LETYP ='CARACTERISTIQUES' itart = 1 & MLENT2,LETYP, JER1, ISUP, ICARA, itart) IF(IERR.NE.0) GO TO 99 segsup mlreel,mlent2 ENDIF C=DEB==== FORMULATION HHO ==== Ajout de composantes ==================== CALL HHOMAT(IPMODE,ICARA,iret) IF (iret.ne.0) GOTO 99 C=FIN==== FORMULATION HHO ============================================== IF(IERR.EQ.0)THEN ENDIF 99 CONTINUE * Suppression des segments * SEGSUP,MLMOTS,MLMOT1,MLMOT2,MLMOT3,MLREE1,MLENT2 IF(MOMATR.NE.0)THEN NOMID = MOMATR IF(lsupma) SEGSUP,NOMID ENDIF IF(MOCARA.NE.0)THEN NOMID = MOCARA IF(lsupca) SEGSUP,NOMID ENDIF END
© Cast3M 2003 - Tous droits réservés.
Mentions légales