pron
C PRON SOURCE OF166741 24/10/07 21:15:42 12016 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) *-------------------------------------------------------------------- * * * * Sous-programme appelé par l'opérateur PROI * * * * Projection d'un chamelem aux noeuds ou aux points d'integration * * des elements support du modele * * Evaluation faite au point courant par utilisation des fonctions * * de formes du modele associe au champ d origine (lu en option * * dans PRO2) ou par defaut a partir des fonctions geometriques * * associées à l'élément d origine * * * * __________________________________________________________________* * * * ENTREE : * * IPMODE modele sur lequel on va projeter * * IPCHE MCHAML de caracteristiques (si le modele comprend * * des coques) * * IPCHT MCHAML a projeter (obligatoirement defini aux noeuds) * ISUP support du resultat 1 noeuds * * 2 pts d integration contraintes* * SORTIE : * * IPOUT MCHAML resultat * * * * Projection d'un chamelem sur le support d un modele * * * *---------------------------------------------------------------------* * -INC PPARAM -INC CCOPTIO -INC CCREEL * -INC SMCOORD -INC SMMODEL -INC SMCHAML -INC SMELEME -INC SMCHPOI -INC SMLCHPO -INC SMLMOTS -INC TMTRAV -INC SMINTE character*(LOCOMP) nomm segment snomip character*(LOCOMP) nomip(0) endsegment segment ipcb(nsschp) segment icpr(2,nbpts) C segment info integer infell(JG) endsegment C segment sicoq integer icocoq(nbsous),imfr(nbsous),iiele(nbsous) integer iminte(nbsous),imint1(nbsous),ibnap(nbsous) integer inbg(nbsous),ibbas(nbsous) endsegment C SEGMENT WRK4 REAL*8 BPSS(3,3),XEL(3,NBN1) ,XU(3),SHP(6,NBN1),S(6) REAL*8 TXR(3,3,NBN1),XE(3,NBG),XEG(3,NBG3) ENDSEGMENT SEGMENT VECT REAL*8 VEC1(IDIM) REAL*8 VEC2(IDIM) REAL*8 VECN(IDIM,NBN1*2) ENDSEGMENT segment phachm integer iphach(nsouz) integer mphach(nsouz) endsegment LOGICAL logach c Compteur du nombre de sous modeles de sure ISURE = 0 IPOUT = 0 MMODEL=IPMODE NSOUS=KMODEL(/1) * if(IPCHE.NE.0) THEN MCHELM=IPCHE NCHAM=ICHAML(/1) endif * segact mcoord*mod NBNOE = nbpts * * Création du maillage provisoire support pour interpolation * C ipt2 contiendra les super couche au point de gauss NBSOUS = NSOUS NBREF = 0 NBELEM = 0 NBNN = 0 SEGINI IPT2 SEGINI SICOQ c listmots des phases ilphmo = -1 jgn = 8 jgm = nsous segini mlmots ilphmo = mlmots jgm = 1 * * Boucle sur l'ensemble des sous zones du modeles sur lequel on va * projetter pour initialisations nponou=0 npcoq =0 * DO 30 ISOUS = 1, NSOUS * IMODEL = KMODEL(ISOUS) * MELE = NEFMOD MELEME = IMAMOD NBELE1= NUM(/2) NBN1 = NUM(/1) IF(INFMOD(/1).NE.0)THEN IF(INFMOD(1).NE.0)THEN NPINT=INFMOD(1) IBNAP(isous) =NPINT ELSE NPINT=0 ibnap(isous)=1 ENDIF ELSE NPINT=0 ibnap(isous)=1 ENDIF C if(INFMOD(/1).lt.2+isup) then if (ierr.ne.0) return info=ipinf mfr =infell(13) iele =infell(14) minte=infell(11) minte1=infELL(12) nbg=nbn1 if(isup.eq.2) then nbg=shptot(/3) elseif(isup.eq.3) then nbg=infell(6) elseif(isup.eq.4) then nbg=infell(3) elseif(isup.eq.5) then nbg=infell(4) endif segsup info else mfr =infele(13) iele =infele(14) minte=infmod(2+isup) minte1=infmod(8) nbg=nbn1 if(isup.eq.2) then nbg=shptot(/3) elseif(isup.eq.3) then nbg=infele(6) elseif(isup.eq.4) then nbg=infele(3) elseif(isup.eq.5) then nbg=infele(4) endif endif C imfr(isous)=mfr iiele(isous)=iele iminte(isous)=minte imint1(isous)=minte1 inbg(isous)=nbg NBSOUS = 0 NBREF = 0 NBELEM = NBELE1 IF (mfr.EQ.3.OR.mfr.EQ.5.OR.mfr.EQ.9) THEN C if(IPCHE.eq.0) then return endif C C----------------------------coque --------------------- icocoq(isous) = 1 npcoq = npcoq + 1 C nombre de points par nappes if(isup.GT.2) then if(mfr.eq.5) then C ----------------- cas des coques epaisses if(nbg.eq.8.or.nbg.eq.6) then IBNAP(isous)=2 ibbas(isous)=nbg/2 else IBNAP(isous)=nbg/nbn1*2 endif else ibbas(isous) = nbg/ibnap(isous) endif elseif(isup.eq.1) then ibnap(isous)=1 ibbas(isous) = nbn1 elseif(isup.eq.2) then ibnap(isous)= 1 ibbas(isous) = 1 endif * * write(6,*) 'nombre de noeuds par nappe ', * & ibbas(isous),' nappes ',ibnap(isous) * * création du maillage des points supports pour cette sz * NBNN = ibbas(isous)*ibnap(isous) nponou = nponou + nbnn*nbele1 SEGINI IPT1 IPT1.ITYPEL = 28 ipt2.lisous(isous) = ipt1 *write(6,*) 'sz ',isous ,'nbnn nbelem ipt1' ,nbnn,nbelem,ipt1 ELSE C-----------------------------massif ------------------------ if(isup.GT.2) then NBNN = NBG elseif(isup.eq.2) then NBNN=1 else NBNN= nbn1 endif C SEGINI IPT1 if(isup.eq.2) then else IPT1.ITYPEL = 28 endif ipt2.lisous(isous) = ipt1 nponou=nponou+nbnn*nbele1 C ENDIF if (isous.eq.1) then else do ipl = 1,jgm enddo jgm = jgm + 1 27 continue endif C * segsup info 30 CONTINUE segadj mlmots C----------------------------------------------------------- C C si il y a des coques ou si l'on veut le champ aux points C d integration, on va fabriquer des points support provisoires C C---------------------------------------------------------- C write(6,*) ' nombre de points crees ' ,nponou C (fdp) ajustement de MCOORD pour les noeuds provisoires C il sera remis a sa taille initiale a la fin du programme NBPTS = NBNOE + nponou SEGADJ MCOORD *----------------------------------------------------------- * Boucle sur l'ensemble des sous zones du modeles *------------------------------------------------------------ inupo =NBNOE DO 100 ISOUS = 1,NSOUS IMODEL = KMODEL(ISOUS) MELEME = IMAMOD IF (itypel.eq.48) then ISURE = ISURE+1 goto 100 ENDIF nbele1= num(/2) nbn1 = num(/1) ipt1=ipt2.lisous(isous) segact ipt1*mod NNB = ibbas(isous) NBG =inbg(isous) NBG3=NBG*3 SEGINI WRK4 SEGINI VECT IF(ICOCOQ(ISOUS).NE.0) THEN C----------------------------------------------------------- C -------------------------------LA SZ EST UNE COQUE ------ C----------------------------------------------------------- NUCHA = 0 DO 15, NUCH = 1, NCHAM * IF ( CONCHE(NUCH).EQ.CONMOD.AND. & IMACHE(NUCH).EQ.IMAMOD) NUCHA = NUCH * 15 CONTINUE * IF (NUCHA.NE.0) THEN MCHAML=ICHAML(NUCHA) * MELVA1 = 0 MELVA2 = 0 NCOMP = IELVAL(/1) DO 20, I = 1, NCOMP IF (NOMCHE(I).EQ.'EPAI') THEN MELVA1 = IELVAL(I) ELSEIF (NOMCHE(I).EQ.'EXCE') THEN MELVA2 = IELVAL(I) ENDIF 20 CONTINUE ENDIF C MELE = NEFMOD c coque integree ou pas ? npint=infmod(1) nbnap=ibnap(isous) mfr =imfr(isous) iele =iiele(isous) minte=iminte(isous) minte1=imint1(isous) nbg = inbg(isous) nnb = ibbas(isous) *------------------------------------------------------------------- * Boucle sur les elements de la sous zone du modele (c est une coque) *------------------------------------------------------------------- DO 95 iel=1, NBELE1 ipo=0 * write(6,*) ' coordonnees des noeuds ' * write(6,2000) ((xel(ik,jk),ik=1,idim),jk=1,nbn1) * write(6,*) '-------------------- ' 2000 format(3E12.5) * on veut les coordonnees aux point d integration et normales * IF(ISUP.GT.1) THEN C --- projection des points d'integration sur la surface moyenne-- DO 601 ip=1,nnb do 600 ik=1,idim xe(ik,ip)=0.D0 DO 602 jk = 1,NBN1 XE(Ik,ip) = XE(Ik,ip) + SHPTOT(1,JK,ip)*(XEL(IK,jk)) 602 CONTINUE 600 CONTINUE 601 CONTINUE do i=1,nnb do j=1,idim xeg(j,i)=xe(j,i) enddo enddo C ELSEIF(isup.eq.2) THEN C---------------------------- on travaille aux CDG C do ik=1,idim C xeg(ik,1)=0.D0 C do ip=1,nbg C DO jk = 1,NBN1 C XEG(Ik,1) = XEG(Ik,jk) + SHPTOT(1,JK,ip)*(XEL(IK,jk)) C enddo C enddo C enddo ELSE C ------- on travaille aux noeuds do i=1,nbn1 do j=1,idim xeg(j,i)=xel(j,i) enddo enddo ENDIF C write(6,*) ' coordonnes des points de base ' C write(6,2576) (ip,(xeg(il,ip),il=1,3),ip=1,nnb) C write(6,*) ' ----------------- ' 2576 format(I4,2X,3E12.5) C----------- les normales aux points ad hoc ------------------ C *--------------- coque minces 3 noeuds --------------- if(iele.eq.4) then C --------coq3 dkt dst ---------------- do 98 i=1,idim VEC1(i)=xel(i,2)-xel(i,1) 98 VEC2(i)=xel(i,3)-xel(i,1) vecn(1,1) = vec1(2)*vec2(3)-vec1(3)*vec2(2) vecn(2,1) = vec1(3)*vec2(1)-vec1(1)*vec2(3) vecn(3,1) = vec1(1)*vec2(2)-vec1(2)*vec2(1) vnor =sqrt(vecn(1,1)*vecn(1,1)+vecn(2,1)*vecn(2,1) & +vecn(3,1)*vecn(3,1)) do 91 i=1,idim 91 vecn(i,1)=vecn(i,1)/vnor do 99 j=2,nbn1 do 99 i=1,idim 99 vecn(i,j)=vecn(i,1) C petite rectif necessaire pour le tri3 if(isup.eq.2) then do j=1,idim xeg(j,1) = XZERO do ip=1,3 xeg(j,1) = xeg(j,1) + xel(j,ip) enddo xeg(j,1)=xeg(j,1)/3.D0 enddo endif elseif (iele.eq.8) then C --------------- coq4 ---------------- C ici c est une estimation du plan moyen * write(6,fmt='(3E12.5)') ((bpss(i,j),i=1,3),j=1,3) do ip=1,ibbas(isous) do i=1,3 vecn(i,ip)=bpss(3,i) enddo enddo elseif (iele.eq.2) then C ---------------- coq2 -------------- vnor=0.D0 do 92 i=1,idim VEC1(i)=xel(i,2)-xel(i,1) 92 vnor=vnor + vec1(i)*vec1(i) vnor = sqrt(vnor) vecn(1,1)=-vec1(2)/vnor vecn(2,1)=vec1(1)/vnor vecn(1,2)=vecn(1,1) vecn(2,2)=vecn(2,1) C elseif (iele.eq.5.or.iele.eq.10) then *----------- coques epaisses coq8 coq6 if(isup.eq.1) then else endif C write(6,*) ' normales aux points ad hoc coques epaisses' do i=1,nbn1 do k=1,3 vecn(k,i)=txr(k,3,i) enddo enddo 2222 format(I4,3E12.5) 2001 format(3E10.3) endif C-------------------------------------------------- * write(6,*) ' normales a l element ' * write(6,fmt='(3E12.5)') ((vecn(l,ip),l=1,3),ip=1,nbn1) C-------------------------------------------------- C do 603 ipoi=1,nnb if(melva1.ne.0) then ibmn =MIN(iel,melva1.velche(/2)) igmn =MIN(ipoi,melva1.velche(/1)) epai = melva1.velche(igmn,ibmn) else epai=0.D0 endif C if(melva2.ne.0) then ibmn =MIN(iel,melva2.velche(/2)) igmn =MIN(ipoi,melva2.velche(/1)) exce = melva2.velche(igmn,ibmn) else exce =0.D0 endif C si on projette aux points d integration calcul des coordonnes C sur l element reel * on range les points sur les normales et non pas par nappes * pour ne pas chercher n fois exce et epai attention au MCHAML * do 603 inap =1,ibnap(isous) ipo=ipo+1 inupo = inupo+1 if(ibnap(isous).gt.1) then C if(npint.ne.0.or.mfr.eq.5) then igau=(inap-1)*inbg(isous)/ibnap(isous)+1 zzz = dzegau(igau) else C zzz = (1.D0*inap-2.D0) zzz = XZERO endif dnor=exce+epai*zzz/2.D0 ipt1.num(ipo,iel) =inupo do 97 i=1,idim 97 XCOOR((inupo-1)*(IDIM+1)+i) = xeg(i,ipoi)+vecn(i,ipoi)*dnor C write(6,2003) iel,ipoi,inupo-nbnoe, C & ( XCOOR((inupo-1)*(IDIM+1)+i),i=1,3),dnor,igau 603 continue C write(6,*) 'ipt1 iel ipo nbp crees ' , C & ipt1,iel,inap,(inupo-nbnoe) 95 CONTINUE 2003 format(3I4,2X,4e12.5,I4) C C ELSEIF(ICOCOQ(ISOUS).EQ.0) THEN C--------------------------------------------------------- C ---------------------------- LA SZ EST UN MASSIF ------ C--------------------------------------------------------- IF(ISUP.GT.1) THEN C ---------------- on travaille aux points d integration minte=iminte(isous) 2234 format(6e12.5) C DO 195 iel=1,nbele1 C ------ PROJECTION DO 700 ip=1,shptot(/3) DO ik=1,idim XU(ik)=0.D0 DO jk = 1,NBN1 XU(Ik) = XU(Ik) + SHPTOT(1,JK,ip)*(XEL(IK,jk)) ENDDO ENDDO inupo=inupo+1 ipt1.num(ip,iel) = inupo do i=1,idim XCOOR((inupo-1)*(IDIM+1)+i) = xu(i) enddo C write(6,2223) inupo,(xu(i),i=1,idim) 700 CONTINUE 195 CONTINUE 2223 format(I6,2X,3E12.5) ELSE C on travaille aux noeuds do 197 iel=1,nbele1 do j=1,nbn1 inupo=inupo+1 ipt1.num(j,iel) = inupo do i=1,idim XCOOR((inupo-1)*(IDIM+1)+i) = xel(i,j) enddo enddo 197 continue ENDIF C fin de l'alternative coques ou massifs ENDIF C-------------------------------- SEGSUP WRK4,VECT * segsup info * 100 CONTINUE C fin de creation des noeuds supports provisoires C ENDIF C--------------//////////////////////////////////------------------ C maintenant il faut un meleme poi1 de tous les points sur lesquels C on doit interpoler une valeur segini,ipt4=ipt2 ipgeom=ipt4 if( isup.ne.2) then segsup ipt4 endif C call ecrobj('MAILLAGE',ipgeom) C---------------------------------------------------------------- C---------------------------------------------------------------- *-------------on est pret a faire l interpolation sur ipgeom ---- C *write(6,*) ' maillage apres changer poi1 ' ,ipgeom C call ecmail(ipgeom) isort=0 * write(6,*) ' dans pron appel a pro2' * write(6,*) ' dans pron sortie de pro2',nsous,ilphmo if (ierr.ne.0) return C---------------------------------------------------------------- C---------------------------------------------------------------- C---------------------------------------------------------------- C --- il faut maintenant reconstituer les MCHAML C --- a partir du chpo construit sur ipgeom ---------------- C------------ INITIALISATION du MCHAML RESULTAT ------------------ mlchpo = ipout nsouz = nsous segini phachm N1=NSOUS - ISURE L1=12 N3=6 SEGINI MCHEL1 MCHEL1.TITCHE='SCALAIRE' MCHEL1.IFOCHE=IFOUR * boucle phases modele DO 7000 IPHAS = 1,JGM * write(6,*) 'iphas ',jgm,iphas, ' mots ',mots(iphas),ichpoi(/1) segini icpr,snomip * mdata=isort mchpoi=ichpoi(iphas) if (mchpoi.le.0) goto 7000 nsschp=ipchp(/1) segini ipcb C do i=1,nsschp * mchpoi=ipca(i) C call ecchpo( mchpoi) msoupo=ipchp(i) ipcb(i)=msoupo C write(6,*) i,ipca(i),msoupo mpoval=ipoval nc = nocomp(/2) C C tableau des general des composantes do ic = 1,nc nomm= nocomp(ic) if(nomip(/2).eq.0) then nomip(**)=nomm else do k=1,nomip(/2) if(nomm.eq.nomip(k)) goto 4322 enddo nomip(**)=nomm 4322 continue endif enddo * write(6,*) (nomip(l),l=1,nomip(/2)) * reperage de la position ses points dans le chpo ipt5=igeoc do j=1,ipt5.num(/2) icpr(1,ipt5.num(1,j))=j icpr(2,ipt5.num(1,j))= i enddo enddo C i=icpr(2,k) point k venant du msoupo du msoupo i dans ipcb kphach = 0 inupo=0 DO 2100 isous = 1,nsous imodel= KMODEL(isous) meleme = imamod if (itypel.eq.48) goto 2100; C ipt5=ipt2.lisous(isous) N2 = nomip(/2) mfr=imfr(isous) * pour une phase donnée ne cree le mchaml qu une fois par maillage * distinct if (kphach.gt.0) then do kpha = 1,kphach if (imamod.eq.iphach(kpha)) then mchaml = mphach(kpha) logach = .true. goto 2105 endif enddo * création du nouveau segment MCHAML SEGINI MCHAML kphach = kphach + 1 iphach(kphach) = imamod mphach(kphach) = mchaml logach = .false. else * création du nouveau segment MCHAML SEGINI MCHAML kphach = kphach + 1 iphach(kphach) = imamod mphach(kphach) = mchaml logach = .false. endif 2105 MCHEL1.IMACHE(isous)=MELEME MCHEL1.ICHAML(isous)=MCHAML MCHEL1.CONCHE(isous)=CONMOD MCHEL1.INFCHE(isous,1)=0 MCHEL1.INFCHE(isous,2)=0 MCHEL1.INFCHE(isous,3)=NIFOUR IF(isup.eq.1) then MCHEL1.INFCHE(isous,4)=0 MCHEL1.INFCHE(isous,5)=0 MCHEL1.INFCHE(isous,6)=1 ELSE MCHEL1.INFCHE(isous,4)=iminte(isous) MCHEL1.INFCHE(isous,5)=0 MCHEL1.INFCHE(isous,6)=isup ENDIF * if (logach) goto 2100 N1EL=NUM(/2) N2PTEL=0 N2EL=0 C IF(ICOCOQ(ISOUS).EQ.1) THEN C-------------------------------------------------------- C boucle sur les composantes et c est une coque C-------------------------------------------------------- inocom=0 DO 2200 icomp=1,nomip(/2) inocom=inocom+1 *write(6,*) 'composante ', nomip(icomp) idebco = inupo C N1PTEL= NUM(/1)*nbnap N1PTEL= nnb*nbnap SEGINI MELVAL IELVAL(inocom)= MELVAL NOMCHE(inocom)= NOCOMP(icomp) TYPCHE(inocom)= 'REAL*8' C DO 162 NUEL=1,num(/2) DO 162 NUPT=1,nnb DO 172 IPOS = 1,nbnap ipop = (ipos-1)*nnb+nupt inupo = ipt5.num(ipop,nuel) jh=icpr (1,inupo) ipa=icpr(2,inupo) if(jh.eq.0) go to 172 C il faut verifier si vpocha existe pour ce point msoupo = ipcb(ipa) mpoval=ipoval do l=1,nocomp(/2) if(nocomp(l).eq.nomip(icomp)) then vvv=vpocha(jh,icomp) goto 4557 endif enddo vvv=XZERO 4557 continue C write(6,2004) NUEL,inupo,jh,ipop, C & ( XCOOR((inupo+nbnoe-1)*(IDIM+1)+i),i=1,3),vvv VELCHE(ipop,NUEL) = vvv 172 CONTINUE 162 CONTINUE if(icomp.lt.nocomp(/2)) inupo =idebco 2200 continue ELSE C-------------------------------------------------------- C boucle sur les composantes et c est un massif C-------------------------------------------------------- if(isup.eq.1) then N1PTEL=NUM(/1) elseif(isup.eq.2) then N1PTEL=1 else N1PTEL= inbg(isous) endif C DO 2220 icomp=1,NOMIP(/2) * write(6,*) 'composante ', nomip(icomp) idebco = inupo C SEGINI MELVAL NOMCHE(icomp)=nomip(icomp) TYPCHE(icomp)='REAL*8' IELVAL(icomp)=MELVAL C DO 163 NUEL=1,N1EL DO 163 NUPT=1,N1PTEL inupo=ipt5.num(nupt,nuel) jh=icpr(1,inupo) ipa=icpr(2,inupo) if(jh.eq.0) go to 163 C il faut verifier si vpocha existe pour ce point msoupo = ipcb(ipa) mpoval=ipoval do l=1,nocomp(/2) if(nocomp(l).eq.nomip(icomp)) then vvv=vpocha(jh,icomp) goto 4558 endif enddo vvv=XZERO 4558 continue C write(6,2003) NUEL,inupo,jh, C & ( XCOOR((inupo+nbnoe-1)*(IDIM+1)+i),i=1,3),vvv VELCHE(NUPT,NUEL) = vvv 163 CONTINUE ipcham= mchaml ipc1 = melval IELVAL(icomp)=ipc1 melval = ipc1 if(icomp.lt.nocomp(/2)) inupo =idebco C ---- fin de la boucle sur les composantes 2220 continue C---------------- fin du traitement des massifs ENDIF segsup ipt5 C fin de la boucle sur les sous zones du modele 2100 continue C destruction des chpo intermediaires do i=1,ipcb(/1) msoupo=ipcb(i) cgf ipt5= igeoc (correction 7284) mpoval= ipoval * mchpoi=ipca(i) segsup mpoval,msoupo cgf segsup ipt5 (correction 7284) enddo segsup mchpoi segsup ipcb,snomip segsup icpr 7000 CONTINUE C (fdp) re-ajustement de MCOORD a sa taille initiale NBPTS = NBNOE SEGADJ MCOORD C retrait des maillages temporaires du pre-conditionnement c (leurs numero de noeuds depasse la taille de MCOOR) call crech1b C (fdp) suppression du maillage temporaire IPT1 ipt1=ipgeom segsup ipt1 segsup ipt2 segsup phachm IPOUT=MCHEL1 segsup sicoq return END
© Cast3M 2003 - Tous droits réservés.
Mentions légales