divs
C DIVS SOURCE CB215821 20/11/25 13:25:40 10792 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C************************************************************************ C Operateur KMAC C C OBJET : Cree un objet de type MATRIK C C C IKAS=1 KMAB calcul de B (DIV U) C IKAS=2 KMBT calcul de Bt uniquement (GRAD P) C IKAS=3 KBBT calcul de B assemblage pour B et Bt C C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC CCREEL -INC SMCOORD -INC SIZFFB -INC SMCHPOI POINTEUR IZCH2.MCHPOI,IZCCH2.MPOVAL POINTEUR IZDV.MCHPOI,IZDDV.MPOVAL,IZTU1.MPOVAL,TETAN.MPOVAL POINTEUR IZTG1.MCHPOI,IZTGG1.MPOVAL,IZBETA.MPOVAL POINTEUR IZTGG.MCHPOI,IZANU.MPOVAL -INC SMMATRIK -INC SMLENTI POINTEUR IZIPAD.MLENTI,MLENTI1.MLENTI,MLENTI2.MLENTI,IPADU.MLENTI -INC SMLMOTS POINTEUR LINCO.MLMOTS -INC SMELEME POINTEUR MELEMZ.MELEME,MELEMB.MELEME,MELSTB.MELEME POINTEUR MELEM1.MELEME,MELES1.MELEME,MCTREI.MELEME POINTEUR IGEOM.MELEME,MELEMA.MELEME POINTEUR IZLEMC.MELEME,MELEMS.MELEME,MELEMC.MELEME POINTEUR MELEMI.MELEME,MELEMP.MELEME POINTEUR MACRO1.MELEME CHARACTER*8 TYPE,TYPC,NOMZ,NOMP,NOMD,NOM0 CHARACTER*8 NOMPP,NOMDD CHARACTER*4 NOM INTEGER IPAD,IPAD2,IK REAL*8 KAUX,TETA1 DIMENSION IXV(5) C C************************************************************************* CKMIC C WRITE(6,*)' Operateur KMIC MTABX=',MTABX C/MELEMS C- Récupération de la table EQEX (pointeur MTAB1) C IF(MTAB1.EQ.0)THEN C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24 MOTERR( 1: 8) = ' EQEX ' MOTERR( 9:16) = ' EQEX ' MOTERR(17:24) = ' KIZX ' RETURN ENDIF IF(NASTOK.EQ.0)THEN RETURN ENDIF C C- Récupération de la table INCO (pointeur KINC) C IF(KINC.EQ.0)THEN C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24 MOTERR( 1: 8) = ' INCO ' MOTERR( 9:16) = ' INCO ' MOTERR(17:24) = ' EQEX ' RETURN ENDIF C************************************************************************* C OPTIONS C KIMPL = 0 -> EXPL 1 -> IMPL 2 -> CN C KFORM = 0 -> EFSI 1 -> EF 2 -> VF 3 -> EFMC C KPRE=3 pression P0 KPRE=4 pression P1 KPRE=2 cas macro 1ère génération C KPRE=5 pression MSOMMET IAXI=0 IK=0 IF(IFOMOD.EQ.0)IAXI=2 C C- Récupération de la table des options KOPT (pointeur KOPTI) C IF (KOPTI.EQ.0) THEN C Indice %m1:8 : Indice %m9:16 non trouvé dans la table %m17:24 MOTERR( 1: 8) = ' KOPT ' MOTERR( 9:16) = ' KOPT ' MOTERR(17:24) = ' KIZX ' RETURN ENDIF C gbm rajoute option décentrement 18/10/99 C gbm rajoute IKOMP = 2 pour l'opérateur (div) et C on ne modifie pas IKOMP pour grad C pour appel ultérieur à SUPGEF. C IKOMP = 2 veut dire conservatif mais on a div(flux) C au lieu de div(ro*U). if (IKAS .EQ. 1 .OR. IKAS .EQ. 3) THEN IKOMP = 2 endif * GBM modif 22/11/99 IF (IERR.NE.0) RETURN C WRITE(6,*)' Apres les options ' C************************************************************************* C C- Récupération de la table DOMAINE associée au domaine local C TYPE=' ' IF(TYPE.NE.'MMODEL')THEN C On attend un des objets : %m1:8 %m9:16 %m17:24 %m25:32 %m33:40 MOTERR( 1: 8) = ' MMODEL ' MOTERR( 8:16) = ' MMODEL ' MOTERR(17:24) = ' MMODEL ' MOTERR(25:32) = ' MMODEL ' MOTERR(33:40) = ' MMODEL ' RETURN ENDIF C?? CALL LEKTAB(MTABZ,'MACRO',MACRO) MACRO1=0 C?? IF(INEFMD.EQ.3)CALL LEKTAB(MTABZ,'QUADRATI',MQUAD) IF (IERR.NE.0) RETURN IF(INEFMD.EQ.4.AND.KPRE.NE.5)THEN C% Données incompatibles RETURN ENDIF MELEMI=MELEME IF(MACRO1.NE.0.AND.KPRE.NE.2)THEN MELEMI=MELEME ENDIF IF(KPRE.EQ.2.AND.INEFMD.EQ.3)KPRE=3 IF(INEFMD.EQ.1)KPRE=2 * ON MODIFIE POUR SOMMET -> SOMMET GBM 18/10/99 MELEMP=MELEME C************************************************************************* C VERIFICATIONS SUR LES INCONNUES C WRITE(6,*)' Verification sur les inconnues ' TYPE='LISTMOTS' IF (IERR.NE.0) RETURN SEGACT LINCO WRITE(IOIMP,*)'Operateur KMAC ' $ ' On attend 2' C Indice %m1:8 : contient plus de %i1 %m9:16 MOTERR( 1:8) = 'LISTINCO' INTERR(1) = 2 MOTERR(9:16) = ' MOTS ' RETURN ENDIF C On recupere PHI n et TETA n pour Cranck-Nicholson TYPE=' ' IF(TYPE.NE.'CHPOINT ')THEN WRITE(IOIMP,*)' Opérateur KMAC :' WRITE(IOIMP,*)' L objet CHPOINT ',NOMP, & ' n existe pas dans la table' C Indice %m1:8 : ne contient pas un objet de type %m9:16 MOTERR( 1: 8) = 'INC '//NOMP MOTERR( 9:16) = 'CHPOINT ' RETURN ELSE ENDIF C************************************************************************* C Le domaine de definition est donne par le SPG de la premiere inconnue C Les inconnues suivantes devront posseder ce meme pointeur C On verifie que les points de la zone sont tous inclus dans ce SPG C Inconnue Primale C WRITE(6,*)' Verification inconnue primale ' IF(IKAS.EQ.1.OR.IKAS.EQ.3)THEN MELEMK=MELEMS ELSE MELEMK=MELEMC ENDIF IF(IRET.NE.0)THEN WRITE(IOIMP,*)' Opérateur KMAC ' WRITE(IOIMP,*)' La zone ',NOMZ, $ ' n''est pas incluse dans le domaine' & , ' de définition de l''inconnue ',NOMP WRITE(IOIMP,*)' MELEMK=',melemk,' IGEOM0=',IGEOM0 C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique MOTERR(1: 8) = 'INC '//NOMP MOTERR(9:16) = 'CHPOINT ' IPAS=0 RETURN ENDIF C************************************************************************* TYPE=' ' IF(TYPE.NE.'CHPOINT ')THEN WRITE(IOIMP,*)' Opérateur KMAC :' WRITE(IOIMP,*)' L objet CHPOINT ',NOMD, & ' n existe pas dans la table' C Indice %m1:8 : ne contient pas un objet de type %m9:16 MOTERR( 1: 8) = 'INC '//NOMD MOTERR( 9:16) = 'CHPOINT ' RETURN ELSE ENDIF NC=TETAN.VPOCHA(/2) C************************************************************************* C Le domaine de definition est donne par le SPG de la premiere inconnue C Les inconnues suivantes devront posseder ce meme pointeur C On verifie que les points de la zone sont tous inclus dans ce SPG C Inconnue Duale C WRITE(6,*)' IGEOM0=',igeom0 IF(IKAS.EQ.1.OR.IKAS.EQ.3)THEN C ON MODIFIE POUR CAS MEME ESPACE DIV U SOMMET -> SOMMET GBM 18/10 MELEMK=MELEMS ELSE MELEMK=MELEMK ENDIF C WRITE(6,*)' Verification inconnue duale ',MELEMK IF(IRET.NE.0)THEN WRITE(IOIMP,*)' Opérateur KMAC ' WRITE(IOIMP,*)' La zone ',NOMZ, $ ' n''est pas incluse dans le domaine' & ,' de définition de l''inconnue ',NOMD WRITE(IOIMP,*)' MELEMK=',melemk,' IGEOM0=',IGEOM0 C Indice %m1:8 : L'objet %m9:16 n'a pas le bon support géométrique MOTERR(1: 8) = 'INC '//NOMD MOTERR(9:16) = 'CHPOINT ' IPAS=0 RETURN ENDIF C GBM rajoute NPTU 18/10 NPTU = IZTU1.VPOCHA(/1) C************************************************************************* C Lecture du ou des coefficients C Type du coefficient : C IK1=0 CHPOINT IK1=1 scalaire IK1=2 vecteur C WRITE(6,*)' Verification sur les coefficients ' C WRITE(6,*)' IARG=',iarg IF(MACRO1.NE.0.AND.IKAS.NE.2.AND.KPRE.EQ.2)THEN TYPE=' ' SEGACT MELSTB IF(IDIM.EQ.2)NBELEM=MELSTB.NUM(/2)/4 IF(IDIM.EQ.3)NBELEM=MELSTB.NUM(/2)/8 NBNN=MELSTB.NUM(/1) NBSOUS=0 NBREF=0 SEGINI MELEMA MELEMA.ITYPEL=MELSTB.ITYPEL NKPE=4 IF(IDIM.EQ.3)NKPE=8 do 4878 k=1,nbelem mi=(k-1)*NKPE+1 do 4879 i=1,nbnn MELEMA.num(i,k)=melstb.num(i,mi) 4879 continue C WRITE(6,*)k,(MELEMA.num(i,k),i=1,nbnn) 4878 continue TYPE=' ' TYPE=' ' ENDIF C 1er COEF IXV(1)=MELEMC IXV(2)=1 IXV(3)=0 IXV(4)=MELEMS IXV(5)=-MELEMS IRET=5 & MTABX,KINC,1,IXV,IZTG1,IZTGG1,NPT1,NC1,IK1,IRET) IF(IRET.EQ.0)RETURN BETA0=1.D-1 IF(IARG.EQ.2)THEN C 2ème COEF IXV(1)=0 IXV(2)=1 IXV(3)=0 & MTABX,KINC,2,IXV,IZTG2,IZBETA,NPT2,NC2,IK2,IRET) IF(IRET.EQ.0)RETURN BETA0=IZBETA.VPOCHA(1,1) ENDIF C GBM rajoute 3eme coef mot clef 'SOMM' C GBM rajoute 4eme coef viscosité pour SUPGEF ANUK=1.D-15 IF(IARG.EQ.4)THEN C 4ème COEF IXV(1)=0 IXV(2)=1 IXV(3)=0 & MTABX,KINC,4,IXV,IZTGG,IZANU,NPT3,NC3,IK3,IRET) IF(IRET.EQ.0)RETURN ANUK=IZANU.VPOCHA(1,1) ENDIF NRIGE=7 NKID =9 NKMT =7 NMATRI=1 IF(MACRO1.NE.0.AND.IKAS.NE.2.AND.KPRE.EQ.2)NMATRI=2 IF(MACRO1.NE.0.AND.IKAS.NE.2.AND.KPRE.EQ.4.AND.IDIM.EQ.2)NMATRI=2 SEGINI MATRIK C Fin Stabilisation de toutes sortes C WRITE(6,*)'C Fin Stabilisation de toutes sortes' NBME=IDIM SEGACT MELEMI NBSOUS=MELEMI.LISOUS(/1) IF(NBSOUS.EQ.0)NBSOUS=1 SEGINI IMATRI IF(IKAS.EQ.2)THEN KSPGD=MELEMS KSPGP=MELEMC IRIGEL(2,1)=MELEME IRIGEL(1,1)=MELEME ELSE KSPGP=MELEMS KSPGD=MELEMS IRIGEL(1,1)=MELEME IRIGEL(2,1)=MELEME ENDIF SEGACT MELEMP C WRITE(6,*)' ds kmac melemp=',IRIGEL(1,1) C WRITE(6,*)' ds kmac melemd=',IRIGEL(2,1) IRIGEL(4,1)=IMATRI * je modifie celui là pour retirer les multiplicateurs IF(IKAS.EQ.1)IRIGEL(7,1)= 5 IF(IKAS.EQ.2)IRIGEL(7,1)=5 IF(IKAS.EQ.3)IRIGEL(7,1)=5 K0=0 DO 11 L=1,NBSOUS IPT1=MELEMI IF(NBSOUS.NE.1)IPT1=MELEMI.LISOUS(L) SEGACT IPT1 IF(IKAS.EQ.2)THEN MP=IPT1.NUM(/1) NP=MELEMP.NUM(/1) ELSE NP=IPT1.NUM(/1) MP=MELEMP.NUM(/1) ENDIF DO 12 I=1,NBME SEGINI IZAFM C WRITE(6,*)' ni izafm np=',np,' mp=',mp,' nbel=',nbel,izafm,l,i LIZAFM(L,I)=IZAFM IF(IKAS.EQ.2)THEN WRITE(NOM,FMT='(I1,A3)')I,NOMD(1:3) LISDUA(I)=NOM//' ' ELSE WRITE(NOM,FMT='(I1,A3)')I,NOMP(1:3) LISDUA(I)=NOMD ENDIF 12 CONTINUE IPM1=LIZAFM(L,1) IPM2=LIZAFM(L,2) IPM3=LIZAFM(L,2) IF(IDIM.EQ.3)IPM3=LIZAFM(L,3) IF (IKAS .EQ. 1 .OR. IKAS .EQ. 3) THEN c on code div roU -> T, IF(IK1.LT.4)THEN c cas où le coef multiplicateur est scalaire, point c ou champ au centre. CALL KSPRUS & (IPT1,IPM1,IPM2,IPM3,IAXI,IKAS,INEFMD,KPRE,IZTGG1,IK1,K0, ELSE C MODIFé par GBM, cas coef au sommet. CALL KSPRJS & (IPT1,IPM1,IPM2,IPM3,IAXI,IKAS,INEFMD,KPRE,IZTGG1 & ,IPADU,IK1) ENDIF ELSE c on code gradT -> U c on inverse la place de IZTU1 et de TETAN dans les arguments c ca l'utilisateur rentre la pression en premier, IZTU1 est donc c une pression (nom mal choisi). GBM 18/10/99 IF(IK1.LT.4)THEN c cas où le coef multiplicateur est scalaire, point c ou champ au centre. CALL KSPRUS & (IPT1,IPM1,IPM2,IPM3,IAXI,IKAS,INEFMD,KPRE,IZTGG1,IK1,K0, ELSE C MODIFé par GBM, cas coef au sommet. CALL KSPRJS & (IPT1,IPM1,IPM2,IPM3,IAXI,IKAS,INEFMD,KPRE,IZTGG1, & IPADU,IK1) ENDIF ENDIF C SEGDES IPM1,IPM2,IPM3 SEGDES IPT1 11 CONTINUE SEGDES MELEMI IF(IK1.EQ.4)SEGSUP MLENTI NAT=2 NSOUPO=0 SEGINI MCHPOI JATTRI(1)=2 C WRITE(6,*)' Fin operateur KMIC' SEGDES IMATRI,MATRIK RETURN 1001 FORMAT(20(1X,I5)) END
© Cast3M 2003 - Tous droits réservés.
Mentions légales