tgrad
C TGRAD SOURCE FANDEUR 22/01/03 21:15:52 11237 C C*********************************************************************** C C FONCTION: C --------- C C Calcul de grad en "0D/1D" sur des éléments de type POINT. C C C ENTREE : C -------- C C IPTAB1 : TABLE de soustype 'OPER_0D' contenant les indices suivants C (pointeur, type ENTIER) C C 'GEOINF' : TABLE de soustype 'GEOINF', info. géométriques C 'INCO' : TABLE de soustype 'INCO', champs instanciés à C l'itéré précédent C ('POTENTIA') : Champ potentiel (par exemple g*(z-zref)) C (type CHPOINT de support PRIMAL(z) et DUAL(zref)). C ('MULT1') : Champ multiplicateur C (type FLOTTANT, CHPOINT de support DUAL ou MOT). C 'DUAL' : Nom de l'inconnue duale C (type MOT, indice de la table 'INCO'). C 'PRIMAL' : Nom de l'inconnue primale C (type MOT, indice de la table 'INCO'). C C C RESULTAT : C ---------- C C 'LHS' : Matrice élémentaire associée à l'opération C (type RIGIDITE). C C C AUTEUR, DATE DE CREATION: C ------------------------- C C 1996/12 Laurent DADA : Création C 2014/10 Frédéric DABBENE : Ajout du champ multiplicateur C C C LANGAGE: C -------- C C ESOPE + FORTRAN77 C C*********************************************************************** C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMCOORD -INC SMTABLE POINTEUR MTABG.MTABLE,MTABS.MTABLE,IPTABI.MTABLE -INC SMCHPOI -INC SMELEME POINTEUR IPTD1.MELEME,IPTP1.MELEME,IPJUCE.MELEME -INC SMRIGID C SEGMENT REDI INTEGER ORDR1(NNGOT) INTEGER ORDR2(NNGOT) INTEGER ORDR3(NNGOT) INTEGER ORDR4(NNGOT) ENDSEGMENT C CHARACTER*8 TYPE,MOTI,MOT1,NOMPR1,NOMDU1,NOSUP1,NOSUD1 CHARACTER*7 NAMT1 LOGICAL LPOT,LMULT,LCOEF C C Lecture de la table GEOINF de la table OPER_0D C TYPE = 'TABLE ' IF (IERR.NE.0) RETURN C MOTI = 'SOUSTYPE' IF (IERR.NE.0) RETURN IF (MOT1(1:6).NE.'GEOINF') THEN MOTERR(1:8) = 'GEOINF ' MOTERR(9:16) = 'GEOINF ' RETURN ENDIF C C Lecture de la table INCO dans la table OPER_0D C TYPE = 'TABLE ' IF (IERR.NE.0) RETURN C MOTI = 'SOUSTYPE' IF (IERR.NE.0) RETURN IF (MOT1(1:4).NE.'INCO') THEN MOTERR(1:8) = 'INCO ' MOTERR(9:16) = 'INCO ' RETURN ENDIF C C Lecture de la table SUPPORT dans la table INCO C TYPE = 'TABLE ' IF (IERR.NE.0) RETURN C C Lecture du MAILLAGE des connectivités 'JUNCEL' de la table GEOINF C Arrêt si les éléments ne sont pas des SEG3 C TYPE = 'MAILLAGE' IF (IERR.NE.0) RETURN SEGACT IPJUCE IF ((IPJUCE.ITYPEL).NE.3) THEN MOTERR(1:8) = 'JUNCEL ' MOTERR(9:16) = 'MAILLAGE' SEGDES IPJUCE RETURN ENDIF NBEJC1 = IPJUCE.NUM(/2) C C Lecture du nom de l'inconnue PRIMAL C TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'MOT ') THEN IF (IERR.NE.0) RETURN ELSE MOTERR(1:8) = 'PRIMAL ' MOTERR(9:16) = TYPE RETURN ENDIF C C Lecture du nom de l'inconnue DUAL C TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'MOT ') THEN IF (IERR.NE.0) RETURN ELSE MOTERR(1:8) = 'DUAL ' MOTERR(9:16) = TYPE RETURN ENDIF C C Lecture éventuelle du champ POTENTIA C (CHPOINT à une composante) C LPOT = .FALSE. TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'CHPOINT ') THEN LPOT = .TRUE. MCHPOI = IPCHP1 SEGACT MCHPOI MSOUPO = IPCHP(1) SEGDES MCHPOI SEGACT MSOUPO NC = NOHARM(/1) IF (NC.NE.1) THEN MOTERR(1:8) = 'POTENTIA' MOTERR(9:16) = 'CHPOINT ' SEGDES MSOUPO RETURN ENDIF IPT1 = IGEOC MPOVA1 = IPOVAL SEGDES MSOUPO ENDIF C C Lecture éventuelle du champ MULT1 (CHPO ou FLOTTANT ou MOT) C (si MOT, c'est l'indice de la table INCO ou le CHPO est stocké) C LMULT = .FALSE. LCOEF = .FALSE. VAL1 = 1.D0 TYPE = ' ' IF (IERR.NE.0) RETURN IF ((TYPE.EQ.'CHPOINT ') .OR. (TYPE.EQ.'MOT ')) THEN IF (TYPE.EQ.'MOT ') THEN IF (IERR.NE.0) RETURN TYPE = 'CHPOINT ' IF (IERR.NE.0) RETURN ENDIF LMULT = .TRUE. MCHPOI = IPCHP1 SEGACT MCHPOI MSOUPO = IPCHP(1) SEGDES MCHPOI SEGACT MSOUPO NC = NOHARM(/1) IF (NC.NE.1) THEN MOTERR(1:8) = 'MULT ' MOTERR(9:16) = 'CHPOINT ' SEGDES MSOUPO RETURN ENDIF IPT2 = IGEOC MPOVA2 = IPOVAL SEGDES MSOUPO ENDIF IF (TYPE.EQ.'FLOTTANT') THEN LCOEF = .TRUE. IF (IERR.NE.0) RETURN ENDIF C C Lecture du nom du support de l'inconnue PRIMAL C Lecture du MAILLAGE de l'inconnue PRIMAL C TYPE = ' ' IF (IERR.NE.0) RETURN IF (TYPE.EQ.'MOT ') THEN IF (IERR.NE.0) RETURN ENDIF TYPE = 'MAILLAGE' IF (IERR.NE.0) RETURN C C Lecture du nom du support de l'inconnue DUAL C Arrêt si différent de 'JUNCTION' C Lecture du MAILLAGE de l'inconnue DUAL C TYPE = ' ' IF (TYPE.EQ.'MOT ') THEN IF (IERR.NE.0) RETURN IF (NOSUD1.NE.'JUNCTION') THEN MOTERR(1:8) = 'DUAL ' MOTERR(9:16) = 'CHPOINT ' RETURN ENDIF ENDIF TYPE = 'MAILLAGE' IF (IERR.NE.0) RETURN C C Création du support géométrique pour la RIGIDITE C (maillage de type SUPER-ELEMENT). C NNGOT = nbpts SEGINI REDI C C On fusionne les maillages de POI1 des supports des inconnues PRIMAL C et DUAL en un maillage de type SUPER-ELEMENT. C SEGACT IPTD1 SEGACT IPTD1 SEGACT IPTP1 SEGACT IPTP1 NBNNP1 = IPTP1.NUM(/2) NBNND1 = IPTD1.NUM(/2) NBNN = NBNNP1 + NBNND1 NBSOUS = 0 NBREF = 0 NBELEM = 1 SEGINI MELEME ICOLOR(1) = IDCOUL ITYPEL = 28 DO 50 I50=1,NBNNP1 NUM(I50,1) = IPTP1.NUM(1,I50) ORDR2(NUM(I50,1)) = I50 50 CONTINUE DO 60 I60=1,NBNND1 NUM(I60+NBNNP1,1) = IPTD1.NUM(1,I60) ORDR1(NUM(I60+NBNNP1,1)) = I60 60 CONTINUE C C On crée le tableau de redirection des CHPO POTENTIA et MULT C On vérifie qu'on a les informations pour tous les noeuds C IF (LPOT) THEN SEGACT IPT1 NBIPT1 = IPT1.NUM(/2) DO 65 I65=1,NBIPT1 ORDR3(IPT1.NUM(1,I65)) = I65 65 CONTINUE SEGDES IPT1 DO 655 I655=1,NBNN IF (ORDR3(NUM(I655,1)).EQ.0) THEN MOTERR(1:8) = 'POTENTIA' MOTERR(9:16) = 'CHPOINT ' SEGDES IPJUCE SEGSUP MELEME SEGDES IPTP1 SEGDES IPTD1 SEGSUP REDI RETURN ENDIF 655 CONTINUE ENDIF IF (LMULT) THEN SEGACT IPT2 NBIPT2 = IPT2.NUM(/2) DO 66 I66=1,NBIPT2 ORDR4(IPT2.NUM(1,I66)) = I66 66 CONTINUE SEGDES IPT2 DO 675 I675=1,NBNND1 IF (ORDR4(IPTD1.NUM(I675,1)).EQ.0) THEN MOTERR(1:8) = 'MULT1' MOTERR(9:16) = 'CHPOINT ' SEGDES IPJUCE SEGSUP MELEME SEGDES IPTP1 SEGDES IPTD1 SEGSUP REDI RETURN ENDIF 675 CONTINUE ENDIF SEGDES IPTP1 SEGDES IPTD1 C C Création de la RIGIDITE C NRIGE = 7 NRIGEL = 1 SEGINI MRIGID C MTYMAT = 'RIGIDITE' IFORIG = IFOUR ICHOLE = 0 IMGEO1 = 0 IMGEO2 = 0 ISUPEQ = 0 COERIG(1) = 1.D0 IRIGEL(1,1) = MELEME IRIGEL(2,1) = 0 IRIGEL(5,1) = NIFOUR IRIGEL(6,1) = 0 IRIGEL(7,1) = 2 C SEGDES MELEME C C Remplissage du descripteur de l'objet RIGIDITE C NLIGRP = NBNNP1 NLIGRD = NBNND1 SEGINI DESCR IRIGEL(3,1) = DESCR DO 10 I10=1,NBNNP1 NOELEP(I10) = I10 LISINC(I10) = NOMPR1 10 CONTINUE DO 11 I11=1,NBNND1 NOELED(I11) = I11+NBNNP1 LISDUA(I11) = NOMDU1 11 CONTINUE C SEGDES DESCR C NELRIG = 1 SEGINI XMATRI C IRIGEL(4,1) = XMATRI xmatri.symre=2 C C Calcul de la matrice élémentaire C c DO 70 I70=1,NBNND1 c DO 701 I701=1,NBNNP1 c RE(I70,I701,1) = 0.D0 c 701 CONTINUE c 70 CONTINUE C IF (LMULT) THEN SEGACT MPOVA2 ENDIF C IF (LPOT) THEN SEGACT MPOVA1 DO 72 I72=1,NBEJC1 NPT1 = IPJUCE.NUM(1,I72) NPTF1 = IPJUCE.NUM(2,I72) NPT2 = IPJUCE.NUM(3,I72) XGZP1 = MPOVA1.VPOCHA(ordr3(npt1),1) XGZP2 = MPOVA1.VPOCHA(ordr3(npt2),1) XGZD1 = MPOVA1.VPOCHA(ordr3(nptf1),1) IF (LMULT) THEN VAL1 = MPOVA2.VPOCHA(ordr4(nptf1),1) ENDIF IPRI1 = ORDR2(NPT1) IDUA1 = ORDR1(NPTF1) IPRI2 = ORDR2(NPT2) RE(IDUA1,IPRI1,1) = -1.D0 * (XGZP1 - XGZD1) * VAL1 RE(IDUA1,IPRI2,1) = (XGZP2 - XGZD1) * VAL1 72 CONTINUE SEGDES MPOVA1 ELSE DO 82 I82=1,NBEJC1 NPT1 = IPJUCE.NUM(1,I82) NPTF1 = IPJUCE.NUM(2,I82) NPT2 = IPJUCE.NUM(3,I82) IF (LMULT) THEN VAL1 = MPOVA2.VPOCHA(ordr4(nptf1),1) ENDIF IPRI1 = ORDR2(NPT1) IDUA1 = ORDR1(NPTF1) IPRI2 = ORDR2(NPT2) RE(IDUA1,IPRI1,1) = -1.D0 * VAL1 RE(IDUA1,IPRI2,1) = 1.D0 * VAL1 82 CONTINUE ENDIF C IF (LMULT) THEN SEGDES MPOVA2 ENDIF SEGDES IPJUCE SEGDES XMATRI SEGSUP REDI C C Ecriture du résultat C TYPE = 'RIGIDITE' IF (IERR.NE.0) RETURN C SEGDES MRIGID C END
© Cast3M 2003 - Tous droits réservés.
Mentions légales