tadve1
C TADVE1 SOURCE CB215821 24/04/12 21:17:18 11897 ************************************************************************ * * T A D V E 1 * ----------- * * FONCTION: * --------- * CREATION DE LA MATRICE DE ADVECTION * GESTION DES SEGMENTS ET TESTS DE COMPATIBILITE * * PARAMETRES: (E)=ENTREE (S)=SORTIE * ----------- * MMODEL (E) POINTEUR SUR LE SEGMENT MMODEL * IPCHEL (E) POINTEUR SUR LE SEGMENT MCHELM * IPRIGI (S) POINTEUR SUR LE SEGMENT MRIGID * * AUTEUR, DATE DE CREATION: * ------------------------- * MARINO ARROYO, 18 MAI 1999 * * LANGAGE: * -------- * ESOPE + FORTRAN77 * ************************************************************************ * IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCHAMP -INC SMCHAML -INC SMELEME -INC SMINTE -INC SMMODEL POINTEUR nomid1.NOMID -INC SMRIGID INTEGER OOOVAL SEGMENT NOTYPE CHARACTER*16 TYPE(NBTYPE) ENDSEGMENT SEGMENT MPTVAL INTEGER IPOS(NS),NSOF(NS), IVAL(NCOSOU) CHARACTER*16 TYVAL(NCOSOU) ENDSEGMENT PARAMETER ( NINF=3 ) INTEGER INFOS(NINF) CHARACTER*8 CMATE CHARACTER*(LCONMO) CONM CHARACTER*10 PEAU CHARACTER*4 MOTADV PARAMETER ( NFO1=3 ) CHARACTER*16 MOTFOR,MOTFO1(NFO1) DATA MOTFO1 /'THERMIQUE' , 'DIFFUSION','NAVIER_STOKES'/ MACRO,(THERMIQUE,DIFFUSION) DATA MOTADV /'ADVE'/ PARAMETER ( LNUCOQ=5 , LINUM=14 , LINUC=12 ) INTEGER INUCOQ(LNUCOQ), INUMA(LINUM), INUCO(LINUC) * * TRI3 TRI6 QUA4 QUA8 CUB8 CU20 PRI6 PR15 DATA INUMA/ 4, 6, 8, 10, 14, 15, 16, 17, * TET4 TET10 PYR5 PY13 TRI7 QUA9 & 23, 24, 25, 26, 144, 145/ * SEG2 SEG3 TRI3 TRI6 QUA4 QUA8 DATA INUCO / 2, 3, 4, 6, 8, 10, * RAC2 RAC3 LIA3 LIA6 LIA4 LIA8 & 12, 13, 18, 19, 20, 21 / * COQ2 COQ3 COQ6 COQ4 COQ8 DATA INUCOQ / 44 , 27 , 56 , 49 ,41 / IPRIGI = 0 C--- C Verification du lieu support du MCHAML de caracteristiques C--- IF (ISUPCH.GT.1) RETURN C--- C Initialisation de la matrice d'ADVECTION (chapeau de l'objet RIGIDITE) C--- NRIGEL = 0 SEGINI,MRIGID MTYMAT = 'RIGIDITE' ICHOLE = 0 IMGEO1 = 0 IMGEO2 = 0 IFORIG = IFOUR ISUPEQ = 0 c en cas de besoin L1 = 8 n1 = 1 segini mmode1 mchelm = ipchel n3 = infche(/2) segini mchel1 mchel1.ifoche = ifoche n2 = 1 segini mcham1 mchel1.ichaml(1) = mcham1 C--- C BOUCLE SUR LES MODELES ELEMENTAIRES C--- NB_OK = 0 DO 10 III = 1, MMODEL.KMODEL(/1) IPINTE = 0 IPINT1 = 0 MOMATE = 0 MOTYPE = 0 C- Recuperation du sous-modele et de la zone elementaire associee IMODEL = MMODEL.KMODEL(III) MOTFOR = IMODEL.FORMOD(1) NMAT = IMODEL.MATMOD(/2) C- Selection uniquement des SOUS-MODELES qui nous interessent IF (ityp1 .EQ. 0) GOTO 10 if (ityp1.le.2) then else endif IF (iok3 .EQ. 0) GOTO 10 NB_OK = NB_OK + 1 C- Recuperation d'informations sur le maillage elementaire IPT1 = IMAMOD NBNOE1 = IPT1.NUM(/1) NBELE1 = IPT1.NUM(/2) IF(NEFMOD.EQ.269 .OR. NEFMOD.EQ.270) THEN ITUY = 1 ELSE ITUY = 0 ENDIF C- Quelques informations et verifications sur le modele elementaire CONM = CONMOD CMATE = CMATEE MATE = IMATEE C Seule l'isotropie est disponible en 2D PLAN et AXISYMETRIQUE if(ituy.ne.1.and.ityp1.lt.3) then IF (MATE.EQ.1) THEN IF (IFOMOD.EQ.1) THEN WRITE(IOIMP,*) '### ERREUR DANS ADVE : ', & 'LE CAS FOURIER N''EST PAS PRIS EN COMPTE' GOTO 1999 ENDIF C ELSE C WRITE(IOIMP,*) '### ERREUR DANS ADVE : ', C & 'SEULEMENT LE CAS ISOTROPE EST ENVISAGE' C CALL ERREUR(19) C GOTO 1999 ENDIF endif * IRET = 1 IF (IRET.EQ.0) GOTO 1999 * NEF = NEFMOD ICOQ = 0 IMAS = 0 IF (IMAS.EQ.0.and . ituy.eq.0) THEN WRITE(IOIMP,*) '### ERREUR DANS ADVE : ', & 'SEULS LES ELEMENTS FINIS MASSIFS SONT ENVISAGES' GOTO 1999 ENDIF C- Recuperation des noms des composantes du champ vectoriel (obligatoires) if( ituy.eq.0) then if (ityp1.eq.3) then nbrobl = 1 nbrfac = 0 segini,nomid lesobl(1) = motadv else C Curieux ici on ne tient pas compte en AXISYMETRIE et autres cas nbrobl = IDIM nbrfac = 0 SEGINI,nomid IF (IDIM.EQ.1) THEN lesobl(1) = 'VITX' ELSE IF (IDIM.EQ.2) THEN lesobl(1) = 'VITX' lesobl(2) = 'VITY' c* ELSE IF (IDIM.EQ.3) THEN ELSE lesobl(1) = 'VITX' lesobl(2) = 'VITY' lesobl(3) = 'VITZ' ENDIF endif else CASE, ityp1 WHEN,THERMIQUE nbrobl = 4 nbrfac = 0 SEGINI,nomid lesobl(1)='VITE' lesobl(2)='RHO' lesobl(3)='C' lesobl(4)='SECT' WHEN,DIFFUSION nbrobl = 3 nbrfac = 0 SEGINI,nomid lesobl(1)='VITE' lesobl(2)='CDIF' lesobl(3)='SECT' ENDCASE endif NMATO = lesobl(/2) NMATF = lesfac(/2) NMATT = NMATO + NMATF MOMATE = nomid nbtype = 1 SEGINI,notype if (ityp1.eq.3) then type(1) = 'POINTEURCHPOINT' else type(1)='REAL*8' endif MOTYPE = notype if (ityp1.lt.3) then C- Recuperation d'informations sur l'element fini IF (IERR.NE.0) GOTO 1999 MINTE = IPINTE SEGACT,MINTE C- Definition du descripteur IDESCR IDESCR = 0 IF (ICOQ.NE.0 .AND. IF1.NE.0) THEN PEAU = ' ' IF (MATMOD(/1) .NE. 0) PEAU = MATMOD(1) ELSE NOMPRI = LNOMID(1) NOMDUA = LNOMID(2) ENDIF descr = IDESCR SEGACT,descr NLIGRD = LISDUA(/2) NLIGRP = LISINC(/2) SEGDES,descr LRE = NLIGRP else LRE = 3*NBNOE1 endif C- Partionnement si necessaire de la matrice de conductivite C- determinant ainsi le nombre d'objets elementaires de MRIGID LTRK = oooval(1,4) IF (LTRK.EQ.0) LTRK = oooval(1,1) LTRK=MAX(LTRK,2**24) * Ajout a la taille en mots de la matrice des infos du segment LSEG = LRE*LRE*NBELE1 + 16 NBLPRT = (LSEG-1)/LTRK + 1 NBLMAX = (NBELE1-1)/NBLPRT + 1 NBLPRT = (NBELE1-1)/NBLMAX + 1 * write(ioimp,*) ' tadve1 : nblprt nblmax = ',nblprt,nblmax,nbele1 C- Ajout de la matrice d'ADVECTION a la matrice globale NRIGE0 = IRIGEL(/2) NRIGEL = NRIGE0 + NBLPRT if (ityp1.eq.3) nrigel = nrigel + (idim - 1)*nblprt SEGADJ,MRIGID descr = IDESCR meleme = IPT1 nbnn = NBNOE1 nbelem = NBELE1 nbsous = 0 nbref = 0 C==== C Boucle sur les PARTITIONS elementaires de la matrice C==== DO 200 irige = 1, NBLPRT IF (NBLPRT.GT.1) THEN C-- Partitionnement du maillage support de la matrice elementaire ielem = (irige-1)*NBLMAX nbelem = MIN(NBLMAX,NBELE1-ielem) * write(ioimp,*) 'tadve1 : creation segment ',nbnn,nbelem SEGINI,meleme itypel = IPT1.itypel DO ielt = 1, nbelem jelt = ielt + ielem DO inoe = 1, nbnn num(inoe,ielt) = IPT1.NUM(inoe,jelt) ENDDO icolor(ielt) = IPT1.ICOLOR(jelt) ENDDO C-- Recopie du descripteur des1 = IDESCR SEGINI,descr=des1 SEGDES,descr ENDIF ipmail = meleme ipdesc = descr C-- Recuperation des valeurs des caracteristiques necessaires IVAMAT = 0 IF (IERR.NE.0) GOTO 2999 IF (ISUPCH.EQ.1) THEN IF (IERR.NE.0) THEN ISUPCH = 0 GOTO 2999 ENDIF ENDIF if (ityp1.eq.3) then segact mmode1*mod mmode1.kmodel(1) = imodel mchel1.conche(1) = conm mchel1.imache(1) = ipmail mptval = ivamat do jj = 1,n2 mcham1.nomche(1) = motadv mcham1.typche(1) = tyval(1) mcham1.ielval(1) = ival(1) enddo ipmons = mmode1 ipchns = mchel1 call go2nli(ipmons,ipchns,iprins,4) if (ierr.ne.0) return goto 2999 endif C-- Initialisation de la matrice de rigidite elementaire (xmatri) NELRIG = nbelem SEGINI,xmatri ipmatr = xmatri C-- Calcul de la matrice elementaire pour la zone irige (ipmail) et C-- Remplissage de la matrice globale (ipmatr) C Note : actuellement uniquement les elements massifs if(imas.ne.0) then & ipmatr,LRE) elseif(ituy.ne.0) then & lre) else endif C-- Un peu de menage dans les segments 2999 CONTINUE IF (ISUPCH.EQ.1 .OR. NBLPRT.NE.1) THEN ELSE ENDIF C-- Sortie prematuree en cas d'erreur IF (IERR.NE.0) GOTO 1999 xmatri = ipmatr IF (NBLPRT.GT.1) THEN meleme = ipmail ENDIF if (ityp1.eq.3) then RI3 = iprins segact ri3 if (ri3.coerig(/1).ne.idim) then return endif do kige = 1,IDIM ipdesc = ri3.IRIGEL(3,kige) ipmatr = ri3.IRIGEL(4,kige) isymm = ri3.irigel(7,kige) jrige = NRIGE0 + kige COERIG(jrige) = ri3.coerig(kige) IRIGEL(1,jrige) = ipmail IRIGEL(2,jrige) = 0 IRIGEL(3,jrige) = ipdesc IRIGEL(4,jrige) = ipmatr IRIGEL(5,jrige) = NIFOUR IRIGEL(6,jrige) = 0 IRIGEL(7,jrige) = 0 IRIGEL(7,jrige) = ri3.irigel(7,kige) IRIGEL(8,jrige) = 0 enddo else C-- Stockage de la matrice jrige = NRIGE0 + irige COERIG(jrige) = 1. IRIGEL(1,jrige) = ipmail IRIGEL(2,jrige) = 0 IRIGEL(3,jrige) = ipdesc IRIGEL(4,jrige) = ipmatr IRIGEL(5,jrige) = NIFOUR IRIGEL(6,jrige) = 0 IRIGEL(7,jrige) = 0 IF (ISYMM.NE.1) IRIGEL(7,jrige) = 2 xmatri.symre=irigel(7,jrige) SEGDES,xmatri IRIGEL(8,jrige) = 0 endif 200 CONTINUE C==== C FIN DE LA BOUCLE SUR LES PARTITIONS C==== C- Un peu de menage dans les segments 1999 CONTINUE IF (MOMATE.NE.0) THEN nomid = MOMATE SEGSUP,nomid ENDIF IF (MOTYPE.NE.0) THEN notype = MOTYPE SEGSUP,notype ENDIF IF (IERR.NE.0) GOTO 999 10 CONTINUE C--- C FIN DE LA BOUCLE SUR LES MODELES ELEMENTAIRES C--- IF(NB_OK .EQ. 0)THEN MOTERR='ADVECTION' RETURN ENDIF IPRIGI = MRIGID SEGDES,MRIGID segsup mmode1,mchel1,mcham1 999 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales