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