C FRIG3C SOURCE CB215821 23/01/25 21:15:15 11573 SUBROUTINE FRIG3C (maifro,IPRIGI,IPCHJE,IPRIG2) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) * Ce sous-programme calcule la raideur de frottement en 3D. * il a besoin pour cela du maillage de frottement et de la raideur * de contact (ou la raideur totale si c'est plus simple) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC CCGEOME -INC SMCHPOI -INC SMELEME -INC SMRIGID -INC SMCOORD * icpr lx du contact ==> lx du frottement segment icpr1(nbpts) segment icpr2(nbpts) * xjeu champs de jeux initiaux segment xjeu(nbpts) * * * creation et remplissage de icpr * segini icpr1,icpr2 nbp=0 meleme=maifro segact meleme ipt1=meleme do is=1,max(1,lisous(/1)) if (lisous(/1).ne.0) ipt1=lisous(is) segact ipt1 if (ipt1.itypel.ne.22) then write (6,*) ' ipt1.itypel ',ipt1.itypel call erreur(16) endif if (ierr.ne.0) return do iel=1,ipt1.num(/2) il=ipt1.num(1,iel) if (icpr1(il).eq.0) then nbp=nbp+1 icpr1(il)=ipt1.num(ipt1.num(/1)-1,iel) icpr2(il)=ipt1.num(ipt1.num(/1),iel) endif if(icpr1(il).ne.ipt1.num(ipt1.num(/1)-1,iel)) call erreur(5) enddo enddo * remplissage du champ de jeux (demi-frottement si jeu non nul) segini xjeu mchpoi = IPCHJE segact mchpoi iOK=0 do 15 isoupo = 1, ipchp(/1) msoupo = ipchp(isoupo) segact msoupo DO 16 i=1,nocomp(/2) IF (NOCOMP(i).NE.'FLX ') GOTO 16 mpoval=ipoval segact mpoval ipt8=igeoc segact ipt8 DO 17 j=1,vpocha(/1) xjeu(ipt8.num(1,j))=vpocha(j,i) 17 CONTINUE iOK=1 16 CONTINUE 15 continue IF (iOK.NE.1) THEN MOTERR(1:4)='FLX ' MOTERR(5:8)='DEPI' CALL ERREUR(77) ENDIF IF (ierr.ne.0) return * * boucle sur les raideurs de contact pour les transformer en frottement * mrigid=iprigi segact mrigid segini,ri1=mrigid er1 = 1.d0 er2 = 2.71828182845904523536 er3 = xpi sr=sqrt(er1**2+er2**2+er3**2) er1=er1/sr er2=er2/sr er3=er3/sr do 10 ir=1,irigel(/2) ri1.irigel(1,ir)=0 ri1.irigel(4,ir)=0 meleme=irigel(1,ir) segact meleme ipt1=0 if (itypel.ne.22) goto 10 if (irigel(6,ir).eq.0) goto 10 nbsous=0 nbref=0 nbnn=num(/1) nbelem=num(/2)*2 segini,ipt1 ipt1.itypel=22 xmatri=irigel(4,ir) segact xmatri nligrd=re(/1) nligrp=re(/2) nelrig=re(/3)*2 segini,xmatr1 do iel=1,num(/2) il=num(1,iel) * coefficient multiplicateur suivant le jeu par rapport a la taille de l'element * taille de l'element au carre iel1=2*iel-1 if1=icpr1(il) ipt1.num(1,iel1)=if1 ipt1.icolor(iel1)=icolor(iel) do in=2,ipt1.num(/1) ipt1.num(in,iel1)=num(in,iel) enddo sre=sqrt(re(1,nligrp-2,iel)**2+re(1,nligrp-1,iel)**2+ > re(1,nligrp,iel)**2) do ic=2,re(/2),3 srev=sqrt(re(1,ic,iel)**2+re(1,ic+1,iel)**2+re(1,ic+2,iel)**2) xmatr1.re(1,ic,iel1)=(er2*re(1,ic+2,iel)-er3*re(1,ic+1,iel)) xmatr1.re(1,ic+1,iel1)=(er3*re(1,ic,iel)-er1*re(1,ic+2,iel)) xmatr1.re(1,ic+2,iel1)=(er1*re(1,ic+1,iel)-er2*re(1,ic,iel)) srep=sqrt(xmatr1.re(1,ic,iel1)**2+xmatr1.re(1,ic+1,iel1)**2+ > xmatr1.re(1,ic+2,iel1)**2) if (srep.ne.srep) write(6,*) ' frig3c ',re(1,ic,iel), > re(1,ic+1,iel),re(1,ic+2,iel) * iel1 orthogonal a iel et a 1 e pi if (srep/srev.gt.1d-3) then xmatr1.re(1,ic,iel1)=xmatr1.re(1,ic,iel1)*srev/srep xmatr1.re(1,ic+1,iel1)=xmatr1.re(1,ic+1,iel1)*srev/srep xmatr1.re(1,ic+2,iel1)=xmatr1.re(1,ic+2,iel1)*srev/srep else write(6,*) ' frig3c second choix ',srep,srev srev=sqrt(re(1,ic,iel)**2+re(1,ic+1,iel)**2+re(1,ic+2,iel)**2) srep=sqrt(re(1,ic+2,iel)**2+re(1,ic,iel)**2) if (srep.lt.xpetit) srep=1.d0 xmatr1.re(1,ic,iel1)=-re(1,ic+2,iel)*srev/srep xmatr1.re(1,ic+1,iel1)=0.d0 xmatr1.re(1,ic+2,iel1)=re(1,ic,iel)*srev/srep endif * write(6,*) ' re ',re(1,ic,iel),re(1,ic+1,iel),re(1,ic+2,iel) * write(6,*) xmatr1.re(1,ic,iel1),xmatr1.re(1,ic+1,iel1), * > xmatr1.re(1,ic+2,iel1) enddo ** xmatr1.re(1,ic,iel1)=-re(1,ic+1,iel)*srev/srep ** xmatr1.re(1,ic+1,iel1)=re(1,ic,iel)*srev/srep ** xmatr1.re(1,ic+2,iel1)=0.d0 ** enddo do ic=2,re(/1) xmatr1.re(ic,1,iel1)=xmatr1.re(1,ic,iel1) enddo iel2=2*iel if2=icpr2(il) ipt1.num(1,iel2)=if2 ipt1.icolor(iel2)=icolor(iel) do in=2,ipt1.num(/1) ipt1.num(in,iel2)=num(in,iel) enddo sre=sqrt(re(1,nligrp-2,iel)**2+re(1,nligrp-1,iel)**2+ > re(1,nligrp,iel)**2) do ic=2,re(/2),3 if (sre.lt.xpetit) sre=1.d0 * iel2 orthogonal a iel et iel1 xmatr1.re(1,ic,iel2)= > (re(1,nligrp-1,iel)*xmatr1.re(1,ic+2,iel1)- > re(1,nligrp ,iel)*xmatr1.re(1,ic+1,iel1))/sre xmatr1.re(1,ic+1,iel2)= > (re(1,nligrp ,iel)*xmatr1.re(1,ic ,iel1)- > re(1,nligrp-2,iel)*xmatr1.re(1,ic+2,iel1))/sre xmatr1.re(1,ic+2,iel2)= > (re(1,nligrp-2,iel)*xmatr1.re(1,ic+1,iel1)- > re(1,nligrp-1,iel)*xmatr1.re(1,ic, iel1))/sre enddo do ic=2,re(/1) xmatr1.re(ic,1,iel2)=xmatr1.re(1,ic,iel2) enddo enddo segdes xmatri ri1.irigel(1,ir)=ipt1 ri1.irigel(4,ir)=xmatr1 ri1.irigel(6,ir)=2 10 continue segdes mrigid * * boucle de compaction du resultat * mrigid=ri1 irr=0 do 100 ir=1,irigel(/2) meleme=irigel(1,ir) xmatri=irigel(4,ir) if (meleme.eq.0) goto 100 ill=0 do iel=1,num(/2) if (num(1,iel).ne.0) then ill=ill+1 if (ill.ne.0) then do in=1,num(/1) num(in,ill)=num(in,iel) enddo icolor(ill)=icolor(iel) do ic=1,re(/1) re(1,ic,ill)=re(1,ic,iel) re(ic,1,ill)=re(ic,1,iel) enddo endif endif enddo if (ill.eq.0) goto 100 if (ill.ne.num(/2)) then nbsous=0 nbref=0 nbnn=num(/1) nbelem=ill segadj meleme endif ** write (6,*) ' meleme sortie dans frig2c ' ** call ecmail(meleme,0) irr=irr+1 if (irr.ne.ir) then do ir1=1,irigel(/1) irigel(ir1,irr)=irigel(ir1,ir) enddo coerig(irr)=coerig(ir) endif 100 continue nrigel=irr if (irigel(/2).ne.irr) segadj mrigid iprig2=mrigid ** call prrigi(mrigid,1) segsup icpr1,icpr2,xjeu return end