Télécharger impo32.eso

Retour à la liste

Numérotation des lignes :

impo32
  1. C IMPO32 SOURCE PV090527 24/11/19 21:15:02 11829
  2.  
  3. * impo bloc en 3D
  4.  
  5. SUBROUTINE IMPO32(ipt6,ipt8,itcont)
  6.  
  7. IMPLICIT INTEGER(I-N)
  8. IMPLICIT REAL*8 (A-H,O-Z)
  9.  
  10.  
  11. -INC PPARAM
  12. -INC CCOPTIO
  13. -INC CCREEL
  14. -INC CCGEOME
  15.  
  16. -INC SMCOORD
  17. -INC SMELEME
  18. -INC SMRIGID
  19. -INC SMCHPOI
  20. -INC SMCHAML
  21.  
  22. * Contact en formulation forte :
  23. * Segments utiles dans les cas dits pathologiques
  24. segment mfopa1
  25. integer lpoin(nfopa1,3)
  26. real*8 xpoin(nfopa1,3)
  27. real*8 zje1(nfopa1)
  28. endsegment
  29. segment mfopa2
  30. integer lsegm(nfopa2,4)
  31. real*8 xsegm(nfopa2,3)
  32. real*8 zje2(nfopa2)
  33. endsegment
  34. * directions moyennes aux sommets
  35. segment mfopa3
  36. real*8 xms(nbpts),yms(nbpts),zms(nbpts)
  37. endsegment
  38. * positions compressees
  39. segment mfopa4
  40. real*8 tco(nbel1),xw(nbel1)
  41. integer ipnum(nbel1),ico(nbel1),iw(nbel1)
  42. endsegment
  43. segment mfopa5
  44. integer ind(indt)
  45. endsegment
  46.  
  47. * Contact en formulation faible :
  48. * Segment utile pour le calcul de l'intersection des 2 triangles
  49. * projetes dans le plan de contact intermediaire
  50. segment mfaible
  51. real*8 cPT1C(3,3),cPT2C(3,3), cPT1A(4,2),cPT2A(4,2)
  52. real*8 cPIn0(6,2), cPIn(6,2), test(6)
  53. real*8 vT1A(3,2), vT2A(3,2)
  54. real*8 SuT1A, SuT2A, SuPIn
  55. *DBG-F real*8 xGIn,yGIn, b1T1,b2T1,b3T1, b1T2,b2T2,b3T2
  56. endsegment
  57.  
  58. PARAMETER ( X1s3=0.333333333333333333333333333333333333333333D0 )
  59. PARAMETER ( sqr3=sqrt(3.d0))
  60.  
  61. character*4 modepl(3),moforc(3)
  62.  
  63. data modepl /'UX ','UY ','UZ '/
  64. data moforc /'FX ','FY ','FZ '/
  65. *
  66.  
  67. idimp1 = IDIM + 1
  68. *
  69. * Lecture du maillage support des conditions de contact
  70. * il s(agit la du premier maillage de contact, de type tri3
  71. *
  72. *
  73. call lirobj('MAILLAGE',ipt1,1,iretou)
  74. call actobj('MAILLAGE',ipt1,1)
  75. ** write(6,*) ' ipt1 dans impo32 ',ipt1
  76. ** write(6,*) ' ipt6 dans impo32 ',ipt6
  77. ** write(6,*) ' ipt8 dans impo32 ',ipt8
  78. isous=0
  79. call lirent(isous,0,iretou)
  80. mchel1=0
  81. call lirent(mchel1,0,iretou)
  82. C
  83. if (ierr.ne.0) return
  84. *
  85. * Activation du maillage et petites verifications
  86. *
  87. segact ipt8
  88. segact ipt6
  89. segact ipt1
  90. ** write(6,*) ' ipt1 2 dans impo32 ',ipt1
  91. nbno6 = ipt6.num(/1)
  92. nbel6 = ipt6.num(/2)
  93. nbno8 = ipt8.num(/1)
  94. nbel8 = ipt8.num(/2)
  95. nbel1 = ipt1.num(/2)
  96. ** write(6,*) 'nbel6 ',nbel6
  97. ** write(6,*) 'nbel1 ',nbel1
  98. if (ipt1.lisous(/1).ne.0) call erreur(25)
  99. if (ipt6.itypel.ne.4) call erreur(16)
  100. if (nbno6.ne.3 ) call erreur(16)
  101. if (ierr.ne.0) goto 900
  102. *
  103. * Increment sur le nombre d'elements de contact retenus et utilises
  104. * dans le chpoint (mpoval et igeoc) et rigidite pour agrandir les
  105. * longueurs des segments adequats
  106. incnel = 2000
  107. *
  108. * Creation de la raideur des conditions de contact
  109. * Remplissage de l'entete commun
  110. *
  111. nrigel = 1
  112. segini,mrigid
  113. ichole = 0
  114. imgeo1 = 0
  115. imgeo2 = 0
  116. isupeq = 0
  117. iforig = ifour
  118. coerig(1) = 1.
  119. mtymat='RIGIDITE'
  120. *
  121. * MCHAML materiau associe au MMODEL
  122. MELVA1 = 0
  123. MELVA2 = 0
  124. IF (MCHEL1.NE.0) THEN
  125. SEGACT, MCHEL1
  126. * recherche rapide d'un maillage correspondant dans le mchaml
  127. DO 210 n2 = 1,mchel1.imache(/1)
  128. * write(ioimp,*) ' n2 imache(n2) ipt1 ',n2,mchel1.imache(n2),ipt1
  129. if (mchel1.imache(n2).eq.ipt1) goto 220
  130. 210 continue
  131.  
  132. goto 230
  133. 220 continue
  134. MCHAM1 = MCHEL1.ICHAML(n2)
  135. SEGACT, MCHAM1
  136. NBCO = MCHAM1.NOMCHE(/2)
  137. DO JCMP = 1,NBCO
  138. IF (MCHAM1.NOMCHE(JCMP).EQ.'JEU') THEN
  139. MELVA1 = MCHAM1.IELVAL(JCMP)
  140. SEGACT, MELVA1
  141. NELJ = MELVA1.VELCHE(/2)
  142. NPTELJ = min(MELVA1.VELCHE(/1),4)
  143. C
  144. C Utilise pour le zonage
  145. xjmax = -xpetit
  146. xjmin = xpetit
  147. DO IJI2=1,NELJ
  148. DO IJI1=1,MELVA1.VELCHE(/1)
  149. xjmax=max(xjmax,MELVA1.VELCHE(IJI1,IJI2))
  150. xjmin=min(xjmin,MELVA1.VELCHE(IJI1,IJI2))
  151. ENDDO
  152. ENDDO
  153. C
  154. ENDIF
  155. IF (MCHAM1.NOMCHE(JCMP).EQ.'ADHE') THEN
  156. MELVA2 = MCHAM1.IELVAL(JCMP)
  157. SEGACT, MELVA2
  158. NELA = MELVA2.VELCHE(/2)
  159. NPTELA = min(MELVA2.VELCHE(/1),4)
  160. ENDIF
  161. ENDDO
  162. ENDIF
  163. 230 continue
  164. *
  165. * Creation du chpoint de depi
  166. *
  167. nat=1
  168. nsoupo=1
  169. segini mchpoi
  170. mtypoi='DEPIMP'
  171. mochde='engendré par impose'
  172. ifopoi=ifour
  173. jattri(1)=2
  174. *
  175. nc=2
  176. IF (MELVA2.NE.0) nc=3
  177. segini msoupo
  178. ipchp(1)=msoupo
  179. nocomp(1)='FLX '
  180. nocomp(2)='SCAL'
  181. IF (MELVA2.NE.0) THEN
  182. nocomp(3)='FADH'
  183. ENDIF
  184. *
  185. nbnn =1
  186. nbelem=incnel
  187. nbref =0
  188. nbsous=0
  189. segini ipt7
  190. ipt7.itypel=1
  191. igeoc=ipt7
  192. *
  193. n=incnel
  194. segini mpoval
  195. ipoval=mpoval
  196. *
  197. * Nombre de noeuds dans le chpoint (en totalite) : ipt7 et mpoval
  198. nelch = 0
  199.  
  200. *=======================================================================
  201. * Formulation "forte" (standard) du contact :
  202. *=======================================================================
  203. * Element de contact 3D a 3 noeuds
  204. ** write(6,*) ' itcont dans impo32 ',itcont
  205. * itcont 2: formulation faible
  206. if (itcont.eq.2) goto 500
  207.  
  208. * Calcul des directions moyennes de la boite d'encadrement, et de la taille max
  209. segact mcoord
  210. segini mfopa3
  211.  
  212. xmin=xgrand
  213. xmax=-xgrand
  214. ymin=xgrand
  215. ymax=-xgrand
  216. zmin=xgrand
  217. zmax=-xgrand
  218. tamax=0.d0
  219.  
  220. do 820 iel6=1,nbel6
  221. *
  222. ip1=ipt6.num(1,iel6)
  223. ip2=ipt6.num(2,iel6)
  224. ip3=ipt6.num(3,iel6)
  225. ipv1 = (ip1-1)*idimp1
  226. xp1 = xcoor(ipv1+1)
  227. yp1 = xcoor(ipv1+2)
  228. zp1 = xcoor(ipv1+3)
  229. ipv2 = (ip2-1)*idimp1
  230. xp2 = xcoor(ipv2+1)
  231. yp2 = xcoor(ipv2+2)
  232. zp2 = xcoor(ipv2+3)
  233. ipv3 = (ip3-1)*idimp1
  234. xp3 = xcoor(ipv3+1)
  235. yp3 = xcoor(ipv3+2)
  236. zp3 = xcoor(ipv3+3)
  237.  
  238. xmin=min(xmin,xp1,xp2,xp3)
  239. xmax=max(xmax,xp1,xp2,xp3)
  240. ymin=min(ymin,yp1,yp2,yp3)
  241. ymax=max(ymax,yp1,yp2,yp3)
  242. zmin=min(zmin,zp1,zp2,zp3)
  243. zmax=max(zmax,zp1,zp2,zp3)
  244.  
  245. *
  246. * normale au plan (123)
  247. *
  248. x12 = xp2 - xp1
  249. y12 = yp2 - yp1
  250. z12 = zp2 - zp1
  251. x23 = xp3 - xp2
  252. y23 = yp3 - yp2
  253. z23 = zp3 - zp2
  254. xn = y12*z23 - z12*y23
  255. yn = z12*x23 - x12*z23
  256. zn = x12*y23 - y12*x23
  257. sn = xn*xn + yn*yn + zn*zn
  258. sn = max(sqrt(abs(sn)),xpetit*1d10)
  259. tamax=max(sn,tamax)
  260.  
  261. xn = xn/sn
  262. yn = yn/sn
  263. zn = zn/sn
  264. xms(ip1)=xms(ip1)+xn
  265. yms(ip1)=yms(ip1)+yn
  266. zms(ip1)=zms(ip1)+zn
  267. xms(ip2)=xms(ip2)+xn
  268. yms(ip2)=yms(ip2)+yn
  269. zms(ip2)=zms(ip2)+zn
  270. xms(ip3)=xms(ip3)+xn
  271. yms(ip3)=yms(ip3)+yn
  272. zms(ip3)=zms(ip3)+zn
  273. 820 continue
  274. tamax = tamax * 5.
  275.  
  276. do 822 iel8=1,nbel8
  277. *
  278. ip1=ipt8.num(1,iel8)
  279. ip2=ipt8.num(2,iel8)
  280. ip3=ipt8.num(3,iel8)
  281. ipv1 = (ip1-1)*idimp1
  282. xp1 = xcoor(ipv1+1)
  283. yp1 = xcoor(ipv1+2)
  284. zp1 = xcoor(ipv1+3)
  285. ipv2 = (ip2-1)*idimp1
  286. xp2 = xcoor(ipv2+1)
  287. yp2 = xcoor(ipv2+2)
  288. zp2 = xcoor(ipv2+3)
  289. ipv3 = (ip3-1)*idimp1
  290. xp3 = xcoor(ipv3+1)
  291. yp3 = xcoor(ipv3+2)
  292. zp3 = xcoor(ipv3+3)
  293. *
  294. * normale au plan (123)
  295. *
  296. x12 = xp2 - xp1
  297. y12 = yp2 - yp1
  298. z12 = zp2 - zp1
  299. x23 = xp3 - xp2
  300. y23 = yp3 - yp2
  301. z23 = zp3 - zp2
  302. xn = y12*z23 - z12*y23
  303. yn = z12*x23 - x12*z23
  304. zn = x12*y23 - y12*x23
  305. sn = xn*xn + yn*yn + zn*zn
  306. sn = max(sqrt(abs(sn)),xpetit*1d10)
  307. xn = xn/sn
  308. yn = yn/sn
  309. zn = zn/sn
  310. xms(ip1)=xms(ip1)+xn
  311. yms(ip1)=yms(ip1)+yn
  312. zms(ip1)=zms(ip1)+zn
  313. xms(ip2)=xms(ip2)+xn
  314. yms(ip2)=yms(ip2)+yn
  315. zms(ip2)=zms(ip2)+zn
  316. xms(ip3)=xms(ip3)+xn
  317. yms(ip3)=yms(ip3)+yn
  318. zms(ip3)=zms(ip3)+zn
  319. 822 continue
  320. do 821 ip = 1,nbpts
  321. sn = xms(ip)*xms(ip)+yms(ip)*yms(ip)+zms(ip)*zms(ip)
  322. sn = max(sqrt(abs(sn)),xpetit*1d10)
  323. xms(ip)=xms(ip)/sn
  324. yms(ip)=yms(ip)/sn
  325. zms(ip)=zms(ip)/sn
  326. ** write(6,*) 'ip ',ip,xms(ip),yms(ip),zms(ip)
  327. 821 continue
  328. if(ipt1.itypel.ne.22) call erreur(16)
  329. ** write(6,*) 'ipt8.itypel ',ipt8.itypel, ipt7
  330. if(ierr.ne.0) return
  331. *
  332. * Nombre d'iterations pour la detection de la direction du contact
  333. nbiter=16
  334. *
  335. * Relation du type 3 : noeud-triangle
  336. *-------------------------------------
  337. *
  338. * creation du meleme associe a la relation
  339. *
  340. nbsous=0
  341. nbref =0
  342. nbnn =5
  343. nbelem=incnel
  344. segini meleme
  345. itypel=22
  346. irigel(1,nrigel)=meleme
  347. *
  348. * creation du descriptif commun a toutes les raideurs
  349. *
  350. nligrp = 13
  351. nligrd = nligrp
  352. segini,descr
  353. lisinc(1)='LX '
  354. lisdua(1)='FLX '
  355. noelep(1)=1
  356. noeled(1)=1
  357. do 10 i=2, nligrp, 3
  358. lisinc(i) =modepl(1)
  359. lisinc(i+1)=modepl(2)
  360. lisinc(i+2)=modepl(3)
  361. lisdua(i) =moforc(1)
  362. lisdua(i+1)=moforc(2)
  363. lisdua(i+2)=moforc(3)
  364. noelep(i) =(i+4)/3
  365. noelep(i+1)=noelep(i)
  366. noelep(i+2)=noelep(i)
  367. noeled(i) =noelep(i)
  368. noeled(i+1)=noelep(i)
  369. noeled(i+2)=noelep(i)
  370. 10 continue
  371. segdes,descr
  372. irigel(3,nrigel) = descr
  373. *
  374. * creation du segment xmatri
  375. *
  376. nelrig = incnel
  377. segini,xmatri
  378. irigel(4,nrigel) = xmatri
  379. *
  380. * ce qu'on cree est unilateral
  381. *
  382. irigel(6,nrigel)=1
  383. *
  384. * ce qu'on cree est symetrique
  385. *
  386. irigel(7,nrigel)=0
  387. *
  388. * Nombre d'elements dans la rigidite du type 3
  389. nelri3 = 0
  390. *
  391. * Preparation du zonage de ipt1
  392. *
  393. nbzx=(xmax-xmin)/tamax
  394. nbzy=(ymax-ymin)/tamax
  395. nbzz=(zmax-zmin)/tamax
  396. *
  397. * preconditionnement de ipt1: mfopa4
  398. *
  399. segini mfopa4
  400. xmult=3.1415926*(xmax-xmin)
  401. ymult=2.7182818*(ymax-ymin)
  402. zmult=1.*(zmax-zmin)
  403. tmult=sqrt(xmult**2+ymult**2+zmult**2)
  404. xmult=xmult/tmult
  405. ymult=ymult/tmult
  406. zmult=zmult/tmult
  407. tmin=xgrand
  408. tmax=-xgrand
  409. do j=1,nbel1
  410. ip=ipt1.num(2,j)
  411. ipv = (ip-1)*idimp1
  412. xp = xcoor(ipv+1)
  413. yp = xcoor(ipv+2)
  414. zp = xcoor(ipv+3)
  415. tco(j)=xp*xmult+yp*ymult+zp*zmult
  416. tmin=min(tco(j),tmin)
  417. tmax=max(tco(j),tmax)
  418. ipnum(j)=ip
  419. ico(j)=j
  420. enddo
  421. nbzt=(tmax-tmin)/tamax
  422. nbzt=max(nbzt,1)
  423. nbzt=min(nbel1,nbzt)
  424. ** write(6,*) ' nbzt ',nbzt
  425.  
  426. *
  427. * trier selon x
  428. *
  429. call triflo(tco,xw,ico,iw,nbel1)
  430. *
  431. * indexer
  432. *
  433. indt=nbzt+1
  434. segini mfopa5
  435. do i=nbel1,1,-1
  436. id=nbzt*(tco(i)-tmin)/(tmax-tmin)+1
  437. ind(id)=i
  438. enddo
  439. do i=1,nbzt
  440. if (ind(i+1).eq.0) ind(i+1)=ind(i)
  441. if(ind(i+1).lt.ind(i)) call erreur(5)
  442. enddo
  443.  
  444.  
  445. * Boucle sur le maillage support du contact(frottement)
  446. *
  447. ** write(6,*) ' boucle 19 nbel6 ',nbel6
  448. DO 19 iel6=1,nbel6
  449. *
  450. xjr = 0d0
  451. ip1=ipt6.num(1,iel6)
  452. ip2=ipt6.num(2,iel6)
  453. ip3=ipt6.num(3,iel6)
  454. * Recuperation des coordonees des noeuds du triangle
  455. ipv = (ip1-1)*idimp1
  456. xp1 = xcoor(ipv+1)
  457. yp1 = xcoor(ipv+2)
  458. zp1 = xcoor(ipv+3)
  459. ipv = (ip2-1)*idimp1
  460. xp2 = xcoor(ipv+1)
  461. yp2 = xcoor(ipv+2)
  462. zp2 = xcoor(ipv+3)
  463. ipv = (ip3-1)*idimp1
  464. xp3 = xcoor(ipv+1)
  465. yp3 = xcoor(ipv+2)
  466. zp3 = xcoor(ipv+3)
  467. * Centre de gravite du triangle
  468. xg = (xp1+xp2+xp3) /3.d0
  469. yg = (yp1+yp2+yp3) /3.d0
  470. zg = (zp1+zp2+zp3) /3.d0
  471. * critere de distance
  472. d1 = (xg-xp1)**2 + (yg-yp1)**2 + (zg-zp1)**2
  473. d2 = (xg-xp2)**2 + (yg-yp2)**2 + (zg-zp2)**2
  474. d3 = (xg-xp3)**2 + (yg-yp3)**2 + (zg-zp3)**2
  475. * Triangle un peu plus grand pour les tests
  476. ** scale=1.00 + xszpre
  477. scale=1.00 + 1D-4
  478. dist2 = max(d1,d2,d3)
  479. dist = sqrt(dist2)*scale
  480. sqdist4 = dist * 4
  481. xp1e=xg+(xp1-xg)*scale
  482. yp1e=yg+(yp1-yg)*scale
  483. zp1e=zg+(zp1-zg)*scale
  484. xp2e=xg+(xp2-xg)*scale
  485. yp2e=yg+(yp2-yg)*scale
  486. zp2e=zg+(zp2-zg)*scale
  487. xp3e=xg+(xp3-xg)*scale
  488. yp3e=yg+(yp3-yg)*scale
  489. zp3e=zg+(zp3-zg)*scale
  490. 25 continue
  491. * rechercher le noeud a tester dans le deuxieme maillage qui est sous forme mult avec en
  492. * deuxieme position le point physique
  493. ** write(6,*) ' boucle 20 ipt1 ',ipt1.num(/2)
  494. xgm = xg -sqdist4
  495. xgp = xg +sqdist4
  496. ygm = yg -sqdist4
  497. ygp = yg +sqdist4
  498. zgm = zg -sqdist4
  499. zgp = zg +sqdist4
  500. *
  501. * calcul zone du centre de gravite
  502. *
  503. tc=xg*xmult+yg*ymult+zg*zmult
  504. *
  505. xmn = (xms(ip1)+xms(ip2)+xms(ip3))*X1s3
  506. ymn = (yms(ip1)+yms(ip2)+yms(ip3))*X1s3
  507. zmn = (zms(ip1)+zms(ip2)+zms(ip3))*X1s3
  508. xzonag = sqdist4*sqr3
  509. tjeup=0.d0
  510. tjeum=0.d0
  511.  
  512. if (MELVA1.ne.0) then
  513. tjeup=xmult*(xjmax*xmn)+ymult*(xjmax*ymn)+zmult*(xjmax*zmn)
  514. tjeum=xmult*(xjmin*xmn)+ymult*(xjmin*ymn)+zmult*(xjmin*zmn)
  515. endif
  516. *
  517. izg=nbzt*((tc-xzonag-tjeup)-tmin)/(tmax-tmin)+1
  518. izg=max(izg,1)
  519. izg=min(izg,indt)
  520. * debut de zone
  521. indb=ind(izg)
  522. indb=1
  523. do 20 iz=indb,nbel1
  524. *** if(tco(iz).lt.(tc-xzonag-tjeup)) goto 20
  525. *** if(tco(iz).gt.(tc+xzonag-tjeum)) then
  526. * write(6,*) ' sortie pour ',iz, ' en ',iz-indb+1
  527. *** goto 18
  528. *** endif
  529. iel1 = ico(iz)
  530. jp = ipnum(iel1)
  531. * Verification que pas relation du point sur lui meme
  532. if (jp.eq.ip1) goto 20
  533. if (jp.eq.ip2) goto 20
  534. if (jp.eq.ip3) goto 20
  535. * verification rapide en norme L1 d'abord
  536. ipv = (jp-1)*idimp1
  537. xp = xcoor(ipv+1)
  538. yp = xcoor(ipv+2)
  539. zp = xcoor(ipv+3)
  540. *
  541. xpp=xp
  542. ypp=yp
  543. zpp=zp
  544. if (MELVA1.ne.0) then
  545. nel1 = min (iel1,nelj)
  546. xjr = melva1.velche(nptelj,nel1)
  547. xpp=xpp-xjr*xmn
  548. ypp=ypp-xjr*ymn
  549. zpp=zpp-xjr*zmn
  550. endif
  551. if(xpp.lt.xgm.or.xpp.gt.xgp) goto 20
  552. if(ypp.lt.ygm.or.ypp.gt.ygp) goto 20
  553. if(zpp.lt.zgm.or.zpp.gt.zgp) goto 20
  554. *
  555. * Verification si autre point dans la zone de selection
  556. * verif distance au centre de gravite
  557. dp = ((xg-xpp)**2 + (yg-ypp)**2 + (zg-zpp)**2)
  558. ** write(6,*) 'dp dist2',dp,dist2,xjr
  559. *** if (dp.gt.xzonag**2) then
  560. *** goto 20
  561. *** endif
  562. C*DBG write(ioimp,*) 'contact test distance ok',dp,d1,d2,d3
  563.  
  564. * verif position par rapport aux cotes
  565.  
  566. * cote 1 2
  567. x12 = xp2 - xp1
  568. y12 = yp2 - yp1
  569. z12 = zp2 - zp1
  570. sv = sqrt(x12**2+y12**2+z12**2)
  571. xv=x12/sv
  572. yv=y12/sv
  573. zv=z12/sv
  574. * normale locale (1 et 2)
  575. xnl=xms(ip1)+xms(ip2)
  576. ynl=yms(ip1)+yms(ip2)
  577. znl=zms(ip1)+zms(ip2)
  578.  
  579. * vecteur reference
  580. xn=y12*znl-z12*ynl
  581. yn=z12*xnl-x12*znl
  582. zn=x12*ynl-y12*xnl
  583. dn = sqrt(xn*xn+yn*yn+zn*zn)
  584. scal = (xpp-xp1e)*xv + (ypp-yp1e)*yv + (zpp-zp1e)*zv
  585. xm = xp1e + scal*xv
  586. ym = yp1e + scal*yv
  587. zm = zp1e + scal*zv
  588. dpm = sqrt(abs((xpp-xm)**2+(ypp-ym)**2+(zpp-zm)**2))
  589. scal = (xpp-xm)*xn + (ypp-ym)*yn + (zpp-zm)*zn
  590. ** if (dpm.lt.dist*xszpre) write(6,*) ' pt sur 1 2',dpm
  591. if (dpm.gt.dist*xszpre.and.scal.gt.0.707d0*dn*dpm) then
  592. * write(6,*) ' 1 dpm scal ',dpm,scal
  593. goto 20
  594. endif
  595. dpm=max(xpetit,dpm)
  596. * write(ioimp,*) 'contact test position 1 ok',
  597. * & scal/(dn*dpm),scal,dn,dpm
  598. *
  599. * cote 2 3
  600. x23 = xp3 - xp2
  601. y23 = yp3 - yp2
  602. z23 = zp3 - zp2
  603. sv = sqrt(x23**2+y23**2+z23**2)
  604. xv=x23/sv
  605. yv=y23/sv
  606. zv=z23/sv
  607. * normale locale (2 et 3)
  608. xnl=xms(ip2)+xms(ip3)
  609. ynl=yms(ip2)+yms(ip3)
  610. znl=zms(ip2)+zms(ip3)
  611.  
  612. * vecteur reference
  613. xn=y23*znl-z23*ynl
  614. yn=z23*xnl-x23*znl
  615. zn=x23*ynl-y23*xnl
  616. dn = sqrt(xn*xn+yn*yn+zn*zn)
  617. scal = (xpp-xp2e)*xv + (ypp-yp2e)*yv + (zpp-zp2e)*zv
  618. xm = xp2e + scal*xv
  619. ym = yp2e + scal*yv
  620. zm = zp2e + scal*zv
  621. dpm = sqrt(abs((xpp-xm)**2+(ypp-ym)**2+(zpp-zm)**2))
  622. scal = (xpp-xm)*xn + (ypp-ym)*yn + (zpp-zm)*zn
  623. ** if (dpm.lt.dist*xszpre) write(6,*) ' pt sur 2 3',dpm
  624. if (dpm.gt.dist*xszpre.and.scal.gt.0.707d0*dn*dpm) then
  625. * write(6,*) ' 2 dpm scal ',dpm,scal
  626. goto 20
  627. endif
  628. dpm=max(xpetit,dpm)
  629. * write(ioimp,*) 'contact test position 2 ok',
  630. * & scal/(dn*dpm),scal,dn,dpm
  631. *
  632. * cote 3 1
  633. x31 = xp1 - xp3
  634. y31 = yp1 - yp3
  635. z31 = zp1 - zp3
  636. sv = sqrt(x31**2+y31**2+z31**2)
  637. xv=x31/sv
  638. yv=y31/sv
  639. zv=z31/sv
  640. * normale locale (3 et 1)
  641. xnl=xms(ip3)+xms(ip1)
  642. ynl=yms(ip3)+yms(ip1)
  643. znl=zms(ip3)+zms(ip1)
  644. * vecteur reference
  645. xn=y31*znl-z31*ynl
  646. yn=z31*xnl-x31*znl
  647. zn=x31*ynl-y31*xnl
  648. dn = sqrt(xn*xn+yn*yn+zn*zn)
  649. scal = (xpp-xp3e)*xv + (ypp-yp3e)*yv + (zpp-zp3e)*zv
  650. xm = xp3e + scal*xv
  651. ym = yp3e + scal*yv
  652. zm = zp3e + scal*zv
  653. dpm = sqrt(abs((xpp-xm)**2+(ypp-ym)**2+(zpp-zm)**2))
  654. scal = (xpp-xm)*xn + (ypp-ym)*yn + (zpp-zm)*zn
  655. ** if (dpm.lt.dist*xszpre) write(6,*) ' pt sur 3 1',dpm
  656. if (dpm.gt.dist*xszpre.and.scal.gt.0.707d0*dn*dpm) then
  657. * write(6,*) ' 3 dpm scal ',dpm,scal
  658. goto 20
  659. endif
  660. dpm=max(xpetit,dpm)
  661. * write(ioimp,*) 'contact test position 2 ok',
  662. * & scal/(dn*dpm),scal,dn,dpm
  663. *
  664. * on a un point ou imposer la relation
  665. C*DBG write(ioimp,*) 'contact potentiel '
  666. * Quelle est la relation ???
  667. *
  668. * direction de la relation = normale au plan (123)
  669. *
  670. * normale reelle
  671. xnr = y12*z23 - z12*y23
  672. ynr = z12*x23 - x12*z23
  673. znr = x12*y23 - y12*x23
  674. dnr = sqrt(xnr*xnr+ynr*ynr+znr*znr)
  675. if (dnr.lt.dist*xszpre.AND.iimpi.ne.0) write(ioimp,*) ' pb dnr'
  676. xnr = xnr / dnr
  677. ynr = ynr / dnr
  678. znr = znr / dnr
  679. * normale ponderee
  680. xn=xms(ip1)+xms(ip2)+xms(ip3)
  681. yn=yms(ip1)+yms(ip2)+yms(ip3)
  682. zn=zms(ip1)+zms(ip2)+zms(ip3)
  683. dn = sqrt(xn*xn+yn*yn+zn*zn)
  684. if (.not.(dn.lt.1d-10).and. .not.(dn.gt.1d-10).AND.iimpi.ne.0)
  685. & write(ioimp,*) 'Prob 4.1 - impo32'
  686. if (abs(dn).le.xpetit.AND.iimpi.ne.0)
  687. & write(ioimp,*) 'Prob 4.2 - impo32'
  688. xn = xn / dn
  689. yn = yn / dn
  690. zn = zn / dn
  691. *
  692. * Distance (jeu) du point jp au plan de contact
  693. * Puis calcul de la projection sur le plan de contact
  694. *
  695. ** write(6,*) 'ip1 xms ',ip1,xms(ip1),yms(ip1),zms(ip1)
  696. ** write(6,*) 'ip2 xms ',ip2,xms(ip2),yms(ip2),zms(ip2)
  697. ** write(6,*) 'ip3 xms ',ip3,xms(ip3),yms(ip3),zms(ip3)
  698. ** write(6,*) 'xn ',xn,yn,zn
  699. iter = 0
  700. xjeu = (xp-xg)*xnr + (yp-yg)*ynr + (zp-zg)*znr
  701. 21 continue
  702. angn = xn * xnr + yn*ynr + zn*znr
  703. if (angn.le.xpetit.AND.iimpi.ne.-1)
  704. & write(ioimp,*) 'angn negatif ',angn
  705. if(angn.le.xpetit) goto 20
  706. xjeuv = xjeu / angn
  707. *
  708. * Recherche de ses coordonnées barycentriques
  709. * qui sont les surfaces des sous triangles
  710. *
  711. xq = xp - xjeuv*xn
  712. yq = yp - xjeuv*yn
  713. zq = zp - xjeuv*zn
  714. xb1 = (yq-yp2)*(zq-zp3)-(zq-zp2)*(yq-yp3)
  715. yb1 = (zq-zp2)*(xq-xp3)-(xq-xp2)*(zq-zp3)
  716. zb1 = (xq-xp2)*(yq-yp3)-(yq-yp2)*(xq-xp3)
  717. xb2 = (yq-yp3)*(zq-zp1)-(zq-zp3)*(yq-yp1)
  718. yb2 = (zq-zp3)*(xq-xp1)-(xq-xp3)*(zq-zp1)
  719. zb2 = (xq-xp3)*(yq-yp1)-(yq-yp3)*(xq-xp1)
  720. xb3 = (yq-yp1)*(zq-zp2)-(zq-zp1)*(yq-yp2)
  721. yb3 = (zq-zp1)*(xq-xp2)-(xq-xp1)*(zq-zp2)
  722. zb3 = (xq-xp1)*(yq-yp2)-(yq-yp1)*(xq-xp2)
  723. b1 = xb1*xnr + yb1*ynr + zb1*znr
  724. b2 = xb2*xnr + yb2*ynr + zb2*znr
  725. b3 = xb3*xnr + yb3*ynr + zb3*znr
  726. bt = b1 + b2 + b3
  727. * normalement pas utile
  728. * element retourne a cause des grands deplacements
  729. if (bt.lt.xpetit) then
  730. write (ioimp,*) ' bt negatif dans impo32 '
  731. call soucis(719)
  732. ** bt=xpetit*2.d0
  733. goto 20
  734. endif
  735. if (bt.lt.0.d0.AND.iimpi.ne.0) then
  736. write (ioimp,*) ' bt negatif dans impo32 '
  737. print *,'xp1 yp1 zp1',xp1,yp1,zp1
  738. print *,'xp2 yp2 zp2',xp2,yp2,zp2
  739. print *,'xp3 yp3 zp3',xp3,yp3,zp3
  740. print *,'xp yp zp',xp,yp,zp
  741. print *,'xn yn zn',xn,yn,zn
  742. print *,'b1 b2 b3 bt',b1,b2,b3,bt
  743. * goto 20
  744. endif
  745. bsurf = bt / 2
  746. if (.not.(bt.lt.1d-10) .and. .not.(bt.gt.1d-10).AND.iimpi.ne.0)
  747. & write(ioimp,*) 'Prob 5.1 - impo32'
  748. if (abs(bt).le.xpetit) write(ioimp,*) 'Prob 5.2 - impo32'
  749. b1 = b1 / bt
  750. b2 = b2 / bt
  751. b3 = b3 / bt
  752. * recalcul de la direction et du jeu en fonction des normales aux sommets
  753. * on arete l'interpolation de la normale au bord de l'element
  754. bb1=max(b1,0.d0)
  755. bb2=max(b2,0.d0)
  756. bb3=max(b3,0.d0)
  757. bm = bb1 + bb2 + bb3
  758. bb1 = bb1 / bm
  759. bb2 = bb2 / bm
  760. bb3 = bb3 / bm
  761. xnp = xn
  762. ynp = yn
  763. znp = zn
  764. xn = bb1*xms(ip1)+ bb2*xms(ip2)+ bb3*xms(ip3)
  765. yn = bb1*yms(ip1)+ bb2*yms(ip2)+ bb3*yms(ip3)
  766. zn = bb1*zms(ip1)+ bb2*zms(ip2)+ bb3*zms(ip3)
  767. sn = sqrt (xn*xn + yn*yn + zn*zn)
  768. xn=xn/sn
  769. yn=yn/sn
  770. zn=zn/sn
  771. diff=abs(xn-xnp)+abs(yn-ynp)+abs(zn-znp)
  772. * write (6,*) ' iter b* *n ',iter,b1,b2,b3,xn,yn,zn
  773. * recalcul en fonction de la nouvelle normale
  774. iter=iter+1
  775. if (iter.gt.64) then
  776. ** write(6,*) ' impo32 diff ',diff
  777. goto 20
  778. endif
  779. if (diff.gt.1d-10) goto 21
  780. ** write(6,*) ' impo32 iter ',iter
  781. ** write (6,*) ' iter b* *n ',iter,b1,b2,b3,xn,yn,zn
  782.  
  783.  
  784. * si on a deja traverse, les trois coordonnees barycentriques doivent etre positives
  785. ** if (xjeuv-xjr.lt.-xszpre*dist) then
  786. ** if (b1.lt.-xszpre) goto 20
  787. ** if (b2.lt.-xszpre) goto 20
  788. ** if (b3.lt.-xszpre) goto 20
  789. ** endif
  790. * Si on est en dehors, on projette sur l'arete (ou pas)
  791. ** if (b1.lt.0.d0.or.b2.lt.0.d0.or.b3.lt.0.d0) then
  792. ** xq=xp1*bb1+xp2*bb2+xp3*bb3
  793. ** yq=yp1*bb1+yp2*bb2+yp3*bb3
  794. ** zq=zp1*bb1+zp2*bb2+zp3*bb3
  795. ** xnn=xp-xq
  796. ** ynn=yp-yq
  797. ** znn=zp-zq
  798. ** snn=sqrt(abs(xnn*xnn+ynn*ynn+znn*znn))
  799. ** if (snn.lt.xszpre*dist) write (6,*) ' snn petit ',snn
  800. * sinon on prend la direction reelle
  801. ** if (snn.gt.xszpre*dist) then
  802. ** xn=xnn/sn
  803. ** yn=ynn/sn
  804. ** zn=znn/sn
  805. ** endif
  806. ** endif
  807. xjeu1 = (xp-xp1)*xn + (yp-yp1)*yn + (zp-zp1)*zn
  808. xjeu2 = (xp-xp2)*xn + (yp-yp2)*yn + (zp-zp2)*zn
  809. xjeu3 = (xp-xp3)*xn + (yp-yp3)*yn + (zp-zp3)*zn
  810. *****pv xjeuv = xjeu1 * bb1 + xjeu2 * bb2 + xjeu3 * bb3
  811. ** write (6,*) 'b1 b2 b3',b1,b2,b3
  812. ** write (6,*) 'xjeu xjeuv ',xjeu,xjeuv,xjeu1,xjeu2,xjeu3
  813. xjeu = xjeuv - xjr
  814. ** write (6,*) ' normale ',xn,yn,zn,' jeu ',xjeu1,xjeu2,xjeu3
  815. * verif bon cote (a la tolerance pres)
  816. ** write (6,*) ' xjeu ',xjeu,dist,iel6
  817. ** if (xjeu.lt.-1*dist) goto 20
  818. ** if (xjeu.gt.3*dist) goto 20
  819. * verif compatibilite avec la normale au poin impactant
  820. if (xms(jp)*xn+yms(jp)*yn+zms(jp)*zn.gt. -0.0d0) then
  821. * write (6,*) ' impo32 normales incompatibes 1 ',
  822. * > jp,xjeu,dpm,dist
  823. goto 20
  824. endif
  825.  
  826.  
  827.  
  828. C*DBG write(ioimp,*) ' b1 b2 b3 ',b1,b2,b3
  829. 1954 continue
  830. * points a l'exterieur?
  831. * on met une ponderation et un rayon d'acceptation
  832. pond = (1D4+1) - 1D4 * bm
  833. if (pond.le.0.d0) goto 20
  834. pond=max(pond,0.d0)
  835. pond=min(pond,1.d0)
  836.  
  837. ** if (xjeu.lt.0.d0)
  838. ** > write (6,*) 'pt traverse',jp,b1,b2,b3,xjeuv-xjr,dist
  839.  
  840. *
  841. * Ajout d'une relation noeud-triangle
  842. *
  843. nelri3 = nelri3 + 1
  844. nelch = nelch + 1
  845. *
  846. * on ajuste les differents segments si necesaire
  847. *
  848. if (nelri3.gt.nelrig) then
  849. nelrig = nelrig + incnel
  850. segadj,xmatri
  851. nbelem = nbelem + incnel
  852. nbnn = 5
  853. segadj,meleme
  854. nbnn = 1
  855. segadj,ipt7
  856. n = n + incnel
  857. segadj,mpoval
  858. endif
  859. *
  860. * Mise a jour du meleme
  861. ** write(6,*) 'ipt8.num(/2)',ipt8.num(/2)
  862. num(1,nelri3) = ipt1.num(1,iel1)
  863. num(2,nelri3) = ip1
  864. num(3,nelri3) = ip2
  865. num(4,nelri3) = ip3
  866. num(5,nelri3) = jp
  867. ** write(6,*) ' nouveau meleme',num(1,nelri3),num(2,nelri3),
  868. ** > num(3,nelri3),num(4,nelri3),num(5,nelri3) *
  869. * Mise a jour de xmatri
  870. * lambda
  871. re( 1,1,nelri3) = 0d0
  872. * ip1
  873. re( 2,1,nelri3) = xn * bb1 * bsurf * pond
  874. re( 3,1,nelri3) = yn * bb1 * bsurf * pond
  875. re( 4,1,nelri3) = zn * bb1 * bsurf * pond
  876. * ip2
  877. re( 5,1,nelri3) = xn * bb2 * bsurf * pond
  878. re( 6,1,nelri3) = yn * bb2 * bsurf * pond
  879. re( 7,1,nelri3) = zn * bb2 * bsurf * pond
  880. * ip3
  881. re( 8,1,nelri3) = xn * bb3 * bsurf * pond
  882. re( 9,1,nelri3) = yn * bb3 * bsurf * pond
  883. re(10,1,nelri3) = zn * bb3 * bsurf * pond
  884. * jp
  885. re(11,1,nelri3) = -xn * bsurf * pond
  886. re(12,1,nelri3) = -yn * bsurf * pond
  887. re(13,1,nelri3) = -zn * bsurf * pond
  888. * on transpose
  889. do 30 ic = 2, nligrp
  890. re(1,ic,nelri3) = re(ic,1,nelri3)
  891. 30 continue
  892. * le reste est nul
  893. *
  894. * remplissage du champoint de depi (jeu)
  895. *
  896. ipt7.num(1,nelch) = ipt1.num(1,iel1)
  897. ** write(6,*) ' ipt1.num(1,iel1) ',ipt1.num(1,iel1)
  898. vpocha(nelch,1) = xjeu * bsurf * pond
  899. vpocha(nelch,2) = bsurf * pond
  900. IF (MELVA2.NE.0) THEN
  901. NEL2 = min (iel1,NELA)
  902. VPOCHA(nelch,3) = max(MELVA2.VELCHE(NPTELA,NEL2),0.D0)*
  903. > bsurf * pond
  904. ENDIF
  905. ** write(ioimp,*) ' jeu ',xjeu,ip1,ip2,ip3,jp,b1,b2,b3,xn,yn,zn
  906. *
  907. 20 CONTINUE
  908. 18 CONTINUE
  909. 19 CONTINUE
  910. *
  911. * Ajustement au plus juste puis desactivation des segments lies
  912. * a la rigidite du type 3
  913. if (nelri3.ne.nelrig) then
  914. nelrig = nelri3
  915. segadj,xmatri
  916. nbelem = nelri3
  917. nbnn = 5
  918. segadj,meleme
  919. endif
  920. segdes,xmatri
  921. *
  922. ** write(ioimp,*) ' nb relation type 3 ',nelri3
  923. ** write(6,fmt='(10i8)') (num(5,nelr),nelr=1,nelri3)
  924.  
  925.  
  926.  
  927.  
  928.  
  929. C*DBG if (nelri3.eq.0) irigel(6,nrigel)=0
  930. *
  931. * Fin du traitement de la formulation standard/forte
  932. * ----------------------------------------------------
  933. 300 CONTINUE
  934. * Destruction des segments locaux devenus inutiles
  935. segsup mfopa3,mfopa4,mfopa5
  936.  
  937. GOTO 1000
  938.  
  939. *=======================================================================
  940. *= Formulation "faible" 3D : relation triangle-triangle
  941. *=======================================================================
  942. * Element de contact 3D a 7 noeuds (1+6)
  943. 500 CONTINUE
  944. *
  945. * Petit segment de travail
  946. segini,mfaible
  947. *
  948. * Relation du type 0 : triangle-triangle (faible)
  949. *---------------------------------------
  950. *
  951. * Creation du meleme associe a la relation
  952. *
  953. nbnn = 7
  954. nbelem = incnel
  955. nbsous = 0
  956. nbref = 0
  957. segini,meleme
  958. itypel = 22
  959. irigel(1,nrigel) = meleme
  960. *
  961. * Creation du descriptif commun a toutes les raideurs
  962. *
  963. nligrp = 19
  964. nligrd = nligrp
  965. segini,descr
  966. lisinc(1) = 'LX '
  967. lisdua(1) = 'FLX '
  968. noelep(1) = 1
  969. noeled(1) = 1
  970. do 510 i = 2, nligrp, 3
  971. lisinc(i ) = modepl(1)
  972. lisinc(i+1) = modepl(2)
  973. lisinc(i+2) = modepl(3)
  974. lisdua(i ) = moforc(1)
  975. lisdua(i+1) = moforc(2)
  976. lisdua(i+2) = moforc(3)
  977. noelep(i ) = (i+5)/3
  978. noelep(i+1) = noelep(i)
  979. noelep(i+2) = noelep(i)
  980. noeled(i ) = noelep(i)
  981. noeled(i+1) = noelep(i)
  982. noeled(i+2) = noelep(i)
  983. 510 continue
  984. segdes,descr
  985. irigel(3,nrigel) = descr
  986. *
  987. * creation du segment xmatri
  988. *
  989. nelrig = incnel
  990. segini,xmatri
  991. irigel(4,nrigel) = xmatri
  992. *
  993. * ce qu'on cree est unilateral
  994. *
  995. irigel(6,nrigel) = 1
  996. *
  997. * ce qu'on cree est symetrique
  998. *
  999. irigel(7,nrigel) = 0
  1000. *
  1001. * Nombre d'elements crees dans meleme=irigel(1,nrigel), ipt7 et mpoval
  1002. nelri0 = 0
  1003. *
  1004. * Boucle sur les elements du maillage de contact/frottement "faible"
  1005. *
  1006. DO 519 iel1 = 1, nbel1
  1007. *
  1008. xjr = 0d0
  1009. ip1 = ipt1.num(2,iel1)
  1010. ip2 = ipt1.num(3,iel1)
  1011. ip3 = ipt1.num(4,iel1)
  1012. * Definition du triangle T1(ip1,ip2,ip3)
  1013. * - Coordonnees des noeuds de T1
  1014. ipv = (ip1-1)*idimp1
  1015. xp1 = xcoor(ipv+1)
  1016. yp1 = xcoor(ipv+2)
  1017. zp1 = xcoor(ipv+3)
  1018. ipv = (ip2-1)*idimp1
  1019. xp2 = xcoor(ipv+1)
  1020. yp2 = xcoor(ipv+2)
  1021. zp2 = xcoor(ipv+3)
  1022. ipv = (ip3-1)*idimp1
  1023. xp3 = xcoor(ipv+1)
  1024. yp3 = xcoor(ipv+2)
  1025. zp3 = xcoor(ipv+3)
  1026. * - Barycentre de T1
  1027. xgT1 = (xp1 + xp2 + xp3) * X1s3
  1028. ygT1 = (yp1 + yp2 + yp3) * X1s3
  1029. zgT1 = (zp1 + zp2 + zp3) * X1s3
  1030. * - Normale au triangle T1
  1031. xnT1 = (yp1-yp2)*(zp2-zp3) - (zp1-zp2)*(yp2-yp3)
  1032. ynT1 = (zp1-zp2)*(xp2-xp3) - (xp1-xp2)*(zp2-zp3)
  1033. znT1 = (xp1-xp2)*(yp2-yp3) - (yp1-yp2)*(xp2-xp3)
  1034. dnT1 = SQRT(xnT1*xnT1+ynT1*ynT1+znT1*znT1)
  1035. IF (.not.(dnT1.lt.1d-10) .and. .not.(dnT1.gt.1d-10).AND.
  1036. & iimpi.ne.0) write(ioimp,*) 'FAIBle - 1.1 - impo32'
  1037. IF (abs(dnT1).le.xpetit) write(ioimp,*) 'FAIBle - 1.2 - impo32'
  1038. xnT1 = xnT1 / dnT1
  1039. ynT1 = ynT1 / dnT1
  1040. znT1 = znT1 / dnT1
  1041. C*DBG write(ioimp,*) 'Normale au plan T1',xnT1,ynT1,znT1,dnT1
  1042. * - Rayon de la sphere "englobante" de l'element (centre=barycentre)
  1043. d1 = (xgT1-xp1)**2 + (ygT1-yp1)**2 + (zgT1-zp1)**2
  1044. d2 = (xgT1-xp2)**2 + (ygT1-yp2)**2 + (zgT1-zp2)**2
  1045. d3 = (xgT1-xp3)**2 + (ygT1-yp3)**2 + (zgT1-zp3)**2
  1046. RayT1 = SQRT(max(d1,d2,d3))
  1047. DO 520 iel6 = 1, nbel6
  1048. if (MELVA1.ne.0) then
  1049. nel1 = min (iel6,nelj)
  1050. xjr = melva1.velche(nptelj,nel1)
  1051. endif
  1052. jp1 = ipt6.num(1,iel6)
  1053. * - Les noeuds 2 et 3 sont intervertis (fait aupravant dans impo31)
  1054. * Cela permet aux triangles T1 et T2 d etre orientes dans le meme sens.
  1055. jp3 = ipt6.num(2,iel6)
  1056. jp2 = ipt6.num(3,iel6)
  1057. C*DBG write(ioimp,*) iel,ip1,ip2,ip3,jp1,jp2,jp3,ipt1.num(1,iel)
  1058. *
  1059. * Verification (provisoire) qu'il n'y a pas de noeud double
  1060. if (ip1.eq.jp1) goto 520
  1061. if (ip1.eq.jp2) goto 520
  1062. if (ip1.eq.jp3) goto 520
  1063. if (ip2.eq.jp1) goto 520
  1064. if (ip2.eq.jp2) goto 520
  1065. if (ip2.eq.jp3) goto 520
  1066. if (ip3.eq.jp1) goto 520
  1067. if (ip3.eq.jp2) goto 520
  1068. if (ip3.eq.jp3) goto 520
  1069. *
  1070. *
  1071. * Definition du triangle T2(jp1,jp2,jp3)
  1072. * - Coordonnees des noeuds de T2
  1073. ipv = (jp1-1)*idimp1
  1074. xq1 = xcoor(ipv+1)
  1075. yq1 = xcoor(ipv+2)
  1076. zq1 = xcoor(ipv+3)
  1077. ipv = (jp2-1)*idimp1
  1078. xq2 = xcoor(ipv+1)
  1079. yq2 = xcoor(ipv+2)
  1080. zq2 = xcoor(ipv+3)
  1081. ipv = (jp3-1)*idimp1
  1082. xq3 = xcoor(ipv+1)
  1083. yq3 = xcoor(ipv+2)
  1084. zq3 = xcoor(ipv+3)
  1085. * - Barycentre de T2
  1086. xgT2 = (xq1 + xq2 + xq3) * X1s3
  1087. ygT2 = (yq1 + yq2 + yq3) * X1s3
  1088. zgT2 = (zq1 + zq2 + zq3) * X1s3
  1089. * - Normale au triangle T2
  1090. xnT2 = (yq1-yq2)*(zq2-zq3) - (zq1-zq2)*(yq2-yq3)
  1091. ynT2 = (zq1-zq2)*(xq2-xq3) - (xq1-xq2)*(zq2-zq3)
  1092. znT2 = (xq1-xq2)*(yq2-yq3) - (yq1-yq2)*(xq2-xq3)
  1093. dnT2 = SQRT(xnT2*xnT2+ynT2*ynT2+znT2*znT2)
  1094. IF (.not.(dnT2.lt.1d-10) .and. .not.(dnT2.gt.1d-10).AND.
  1095. & iimpi.ne.0) write(ioimp,*) 'FAIBle - 2.1 - impo32'
  1096. IF (abs(dnT2).le.xpetit.AND.iimpi.ne.0)
  1097. & write(ioimp,*) 'FAIBle - 2.2 - impo32'
  1098. xnT2 = xnT2 / dnT2
  1099. ynT2 = ynT2 / dnT2
  1100. znT2 = znT2 / dnT2
  1101. C*DBG write(ioimp,*) 'Normale au plan T2',xnT2,ynT2,znT2,dnT2
  1102. * - Rayon de la sphere "englobante" de l'element (centre=barycentre)
  1103. d1 = (xgT2-xq1)**2 + (ygT2-yq1)**2 + (zgT2-zq1)**2
  1104. d2 = (xgT2-xq2)**2 + (ygT2-yq2)**2 + (zgT2-zq2)**2
  1105. d3 = (xgT2-xq3)**2 + (ygT2-yq3)**2 + (zgT2-zq3)**2
  1106. RayT2 = SQRT(max(d1,d2,d3))
  1107.  
  1108. * Orientation respective correcte des 2 normales
  1109. * Les triangles T1 et T2 etant decrits dans le meme sens ("prisme"),
  1110. * le produit scalaire de leur normale doit etre positif ou nul !
  1111. scal = xnT1 * xnT2 + ynT1 * ynT2 + znT1 * znT2
  1112. C*DBG write(ioimp,*) 'Prod.scal des normales',scal
  1113. if (scal.lt.0.) goto 520
  1114. *
  1115. * Distance entre les centres de gravite
  1116. * Les spheres "englobantes" doivent s'intersecter pour contact potentiel
  1117. dist = SQRT((xgT2-xgT1)**2 + (ygT2-ygT1)**2 + (zgT2-zgT1)**2)
  1118. * IF (dist*4.GT.RayT1+RayT2) goto 520
  1119. *
  1120. * Definition du plan de contact (surface intermediaire)
  1121. * - Normale (unitaire) du plan de contact
  1122. xnC = xnT1 + xnT2
  1123. ynC = ynT1 + ynT2
  1124. znC = znT1 + znT2
  1125. dnC = SQRT(xnC*xnC + ynC*ynC + znC*znC)
  1126. IF (.not.(dnC.lt.1d-10).and. .not.(dnC.GT.1D-10).AND.iimpi.ne.0)
  1127. & write(ioimp,*) 'FAIBle - 3.1 - impo32'
  1128. IF (abs(dnC).le.xpetit.AND.iimpi.ne.0)
  1129. & write(ioimp,*) 'FAIBle - 3.2 - impo32'
  1130. xnC = xnC / dnC
  1131. ynC = ynC / dnC
  1132. znC = znC / dnC
  1133. C*DBG write(ioimp,*) 'Normale au plan Contact',xnC,ynC,znC,dnC
  1134. *
  1135. * Criteres d'acceptation de l'element de contact
  1136. RayTT = RayT1 + RayT2
  1137. * - Les barycentres des triangles T1 et T2 sont-ils suffisamment proches :
  1138. * distance suivant la direction de contact (prise en compte du jeu)
  1139. VXB12 = xgT2 - xgT1
  1140. VYB12 = ygT2 - ygT1
  1141. VZB12 = zgT2 - zgT1
  1142. distn = (VXB12*xnC)+(VYB12*ynC)+(VZB12*znC)
  1143. test1 = distn
  1144. if (MELVA1.NE.0) then
  1145. test1 = test1 - xjr
  1146. endif
  1147. if (test1.GT.RayTT) GOTO 520
  1148. *
  1149. * distance dans un plan dont la normale est la direction de contact
  1150. distt = SQRT(dist**2 - distn**2)
  1151. if (distt.GT.RayTT) GOTO 520
  1152.  
  1153. * - Point definissant le plan de contact
  1154. * = milieu des barycentres des triangles T1 et T2
  1155. xgC = (xgT1 + xgT2) * 0.5
  1156. ygC = (ygT1 + ygT2) * 0.5
  1157. zgC = (zgT1 + zgT2) * 0.5
  1158. * - "Distance" de reference au plan de contact
  1159. dgC = xgC*xnC + ygC*ynC + zgC*znC
  1160. *
  1161. * Distance "signee" des triangles T1 et T2 au plan de contact
  1162. dp1C = (xp1*xnC + yp1*ynC + zp1*znC) - dgC
  1163. dp2C = (xp2*xnC + yp2*ynC + zp2*znC) - dgC
  1164. dp3C = (xp3*xnC + yp3*ynC + zp3*znC) - dgC
  1165. dq1C = (xq1*xnC + yq1*ynC + zq1*znC) - dgC
  1166. dq2C = (xq2*xnC + yq2*ynC + zq2*znC) - dgC
  1167. dq3C = (xq3*xnC + yq3*ynC + zq3*znC) - dgC
  1168. * Projection des triangles T1 et T2 sur le plan de contact
  1169. * T1C = triangle T1 projete sur plan de Contact
  1170. cPT1C(1,1) = xp1 - dp1C * xnC
  1171. cPT1C(1,2) = yp1 - dp1C * ynC
  1172. cPT1C(1,3) = zp1 - dp1C * znC
  1173. cPT1C(2,1) = xp2 - dp2C * xnC
  1174. cPT1C(2,2) = yp2 - dp2C * ynC
  1175. cPT1C(2,3) = zp2 - dp2C * znC
  1176. cPT1C(3,1) = xp3 - dp3C * xnC
  1177. cPT1C(3,2) = yp3 - dp3C * ynC
  1178. cPT1C(3,3) = zp3 - dp3C * znC
  1179. * T2C = triangle T2 projete sur plan de Contact
  1180. cPT2C(1,1) = xq1 - dq1C * xnC
  1181. cPT2C(1,2) = yq1 - dq1C * ynC
  1182. cPT2C(1,3) = zq1 - dq1C * znC
  1183. cPT2C(2,1) = xq2 - dq2C * xnC
  1184. cPT2C(2,2) = yq2 - dq2C * ynC
  1185. cPT2C(2,3) = zq2 - dq2C * znC
  1186. cPT2C(3,1) = xq3 - dq3C * xnC
  1187. cPT2C(3,2) = yq3 - dq3C * ynC
  1188. cPT2C(3,3) = zq3 - dq3C * znC
  1189. *
  1190. * On determine quelle est la composante maximale de la normale pour
  1191. * projeter les triangles T1C et T2C sur un plan parallele aux axes
  1192. * ("le plus orthogonal" a cette normale), ce qui maximise leur aire.
  1193. r_x = abs(xnC)
  1194. r_y = abs(ynC)
  1195. r_z = abs(znC)
  1196. if (r_x.gt.r_y) then
  1197. inC = 1
  1198. if (r_x.lt.r_z) inC = 3
  1199. else
  1200. inC = 2
  1201. if (r_y.lt.r_z) inC = 3
  1202. endif
  1203. * Projection des triangles T1C et T2C sur ce plan // aux axes (A)
  1204. * T1A = triangle T1C projete sur ce plan (A)
  1205. * T2A = triangle T2C projete sur ce plan (A)
  1206. * On prend soin d'orienter les triangles T1A et T2A dans le sens
  1207. * direct (en tenant compte du signe de la composante normale !)
  1208. GOTO (531,532,533), inC
  1209. call erreur(5)
  1210. return
  1211. * Normale NC selon "x" : A =(y,z)
  1212. 531 if (xnC.lt.0.) inC = -inC
  1213. inX = 2
  1214. inY = 3
  1215. goto 534
  1216. * Normale NC selon "y" : A =(x,z)
  1217. 532 if (ynC.lt.0.) inC = -inC
  1218. inX = 1
  1219. inY = 3
  1220. goto 534
  1221. * Normale NC selon "z" : A =(x,y)
  1222. 533 if (znC.lt.0.) inC = -inC
  1223. inX = 1
  1224. inY = 2
  1225. goto 534
  1226. 534 continue
  1227. cPT1A(1,1) = cPT1C(1,inX)
  1228. cPT1A(1,2) = cPT1C(1,inY)
  1229. cPT2A(1,1) = cPT2C(1,inX)
  1230. cPT2A(1,2) = cPT2C(1,inY)
  1231. if (inC.gt.0) then
  1232. cPT1A(2,1) = cPT1C(2,inX)
  1233. cPT1A(2,2) = cPT1C(2,inY)
  1234. cPT2A(2,1) = cPT2C(2,inX)
  1235. cPT2A(2,2) = cPT2C(2,inY)
  1236. cPT1A(3,1) = cPT1C(3,inX)
  1237. cPT1A(3,2) = cPT1C(3,inY)
  1238. cPT2A(3,1) = cPT2C(3,inX)
  1239. cPT2A(3,2) = cPT2C(3,inY)
  1240. else
  1241. cPT1A(2,1) = cPT1C(3,inX)
  1242. cPT1A(2,2) = cPT1C(3,inY)
  1243. cPT2A(2,1) = cPT2C(3,inX)
  1244. cPT2A(2,2) = cPT2C(3,inY)
  1245. cPT1A(3,1) = cPT1C(2,inX)
  1246. cPT1A(3,2) = cPT1C(2,inY)
  1247. cPT2A(3,1) = cPT2C(2,inX)
  1248. cPT2A(3,2) = cPT2C(2,inY)
  1249. endif
  1250. cPT1A(4,1) = cPT1A(1,1)
  1251. cPT1A(4,2) = cPT1A(1,2)
  1252. * Calcul des cotes des triangles T1A et T2A (12,23,31)
  1253. * Utile pour connaitre ensuite la normale aux cotes des triangles
  1254. vT1A(1,1) = cPT1A(2,1) - cPT1A(1,1)
  1255. vT1A(1,2) = cPT1A(2,2) - cPT1A(1,2)
  1256. vT1A(2,1) = cPT1A(3,1) - cPT1A(2,1)
  1257. vT1A(2,2) = cPT1A(3,2) - cPT1A(2,2)
  1258. vT1A(3,1) = cPT1A(1,1) - cPT1A(3,1)
  1259. vT1A(3,2) = cPT1A(1,2) - cPT1A(3,2)
  1260. C*nu vT2A(1,1) = cPT2A(2,1) - cPT2A(1,1)
  1261. vT2A(1,2) = cPT2A(2,2) - cPT2A(1,2)
  1262. C*nu vT2A(2,1) = cPT2A(3,1) - cPT2A(2,1)
  1263. vT2A(2,2) = cPT2A(3,2) - cPT2A(2,2)
  1264. C*nu vT2A(3,1) = cPT2A(1,1) - cPT2A(3,1)
  1265. vT2A(3,2) = cPT2A(1,2) - cPT2A(3,2)
  1266. * Calcul de la surface de chacun des triangles T1A et T2A
  1267. * (en fait, on calcule le double, mais par la suite on ne considere que
  1268. * des rapports de surfaces de triangle)
  1269. SuT1A = (cPT1A(2,1)+cPT1A(1,1)) * vT1A(1,2)
  1270. & + (cPT1A(3,1)+cPT1A(2,1)) * vT1A(2,2)
  1271. & + (cPT1A(1,1)+cPT1A(3,1)) * vT1A(3,2)
  1272. SuT2A = (cPT2A(2,1)+cPT2A(1,1)) * vT2A(1,2)
  1273. & + (cPT2A(3,1)+cPT2A(2,1)) * vT2A(2,2)
  1274. & + (cPT2A(1,1)+cPT2A(3,1)) * vT2A(3,2)
  1275. C*DBG write(ioimp,*) 'Surfaces T1A - T2A :', 0.5*SuT1A,0.5*SuT2A
  1276. C*DBG if (SuT1A.gt.100.*SuT2A .or. SuT2A.gt.100.*SuT1A)
  1277. C*DBG & write(ioimp,*) 'Rapport des surfaces tres important !'
  1278.  
  1279. * On initialise l'intersection des triangles avec T2A
  1280. nPIn0 = 3
  1281. do 540 i = 1, nPIn0
  1282. cPIn0(i,1) = cPT2A(i,1)
  1283. cPIn0(i,2) = cPT2A(i,2)
  1284. 540 continue
  1285. * Determination de l'intersection des triangles T1A et T2A
  1286. * en regardant progressivement l'intersection avec les cotes de T1A
  1287. * Note : On utilise le fait que les polygones traites sont convexes !
  1288. DO 550 i = 1, 3
  1289. vN1x = -vT1A(i,2)
  1290. vN1y = vT1A(i,1)
  1291. scal = vN1x * cPT1A(i,1) + vN1y * cPT1A(i,2)
  1292. *
  1293. ipos = 0
  1294. ineg = 0
  1295. jpos = 0
  1296. jneg = 0
  1297. do 551 j = 1, nPIn0
  1298. test(j) = (vN1x * cPIn0(j,1) + vN1y * cPIn0(j,2)) - scal
  1299. if (test(j).gt.1.d-10) then
  1300. * if (test(j).gt.0.) then
  1301. ipos = ipos + 1
  1302. if (jneg.ne.0 .and. jpos.eq.0) jpos = j
  1303. else if (test(j).lt.-1.d-10) then
  1304. * else if (test(j).lt.0.) then
  1305. ineg = ineg + 1
  1306. if (jneg.eq.0) jneg = j
  1307. else
  1308. test(j) = 0.
  1309. endif
  1310. 551 continue
  1311. *
  1312. * 1) Cas ou ipos = 0 :
  1313. * 1.1) il n'y pas d'intersection (ineg=nPIn0)
  1314. * 1.2) l'intersection se limite a 1 point (ineg=nPIn0-1)
  1315. * 1.3) l'intersection a 1 segment sur une frontiere (ineg=nPIn0-2)
  1316. * La surface correspondante est nulle et il n'y a donc pas de contact !
  1317. if (ipos.eq.0) then
  1318. C*DBG write(ioimp,*) 'Intersection a ',nPIn0-ineg,' points'
  1319. goto 520
  1320. endif
  1321. * 2) Cas ou ipos > 0 : Il y a une intersection a calculer
  1322. * 2.1) ineg = 0 : Tous les points sont "du bon cote" et l'intersection
  1323. * correspond au polygone de depart !
  1324. if (ineg.eq.0) then
  1325. C*DBG write(ioimp,*) 'Intersection du bon cote - rien a faire'
  1326. goto 550
  1327. endif
  1328. * 2.2) ineg > 0 : Il y a deux intersections a determiner car il y a
  1329. * au moins un point du "mauvais cote"
  1330. jpos = max(1,jpos)
  1331. jpr = jpos - 1
  1332. if (jpos.eq.1) jpr = nPIn0
  1333. nPIn = 1
  1334. if (test(jpr).lt.0.) then
  1335. r_z = test(jpos) / (test(jpos) - test(jpr))
  1336. cPIn(nPIn,1) = cPIn0(jpos,1)
  1337. & + r_z*(cPIn0(jpr,1) - cPIn0(jpos,1))
  1338. cPIn(nPIn,2) = cPIn0(jpos,2)
  1339. & + r_z*(cPIn0(jpr,2) - cPIn0(jpos,2))
  1340. else
  1341. cPIn(nPIn,1) = cPIn0(jpr,1)
  1342. cPIn(nPIn,2) = cPIn0(jpr,2)
  1343. endif
  1344. do 552 j = 1, ipos
  1345. nPIn = nPIn + 1
  1346. cPIn(nPIn,1) = cPIn0(jpos,1)
  1347. cPIn(nPIn,2) = cPIn0(jpos,2)
  1348. jpr = jpos
  1349. jpos = jpos + 1
  1350. if (jpos.gt.nPIn0) jpos = 1
  1351. 552 continue
  1352. nPIn = nPIn + 1
  1353. if (test(jpos).lt.0.) then
  1354. r_z = test(jpr) / (test(jpr) - test(jpos))
  1355. cPIn(nPIn,1) = cPIn0(jpr,1)
  1356. & + r_z*(cPIn0(jpos,1) - cPIn0(jpr,1))
  1357. cPIn(nPIn,2) = cPIn0(jpr,2)
  1358. & + r_z*(cPIn0(jpos,2) - cPIn0(jpr,2))
  1359. else
  1360. cPIn(nPIn,1) = cPIn0(jpos,1)
  1361. cPIn(nPIn,2) = cPIn0(jpos,2)
  1362. endif
  1363. * Mise a jour cPIn0 pour la suite du traitement des intersections...
  1364. nPIn0 = nPIn
  1365. do 554 j = 1, nPIn0
  1366. cPIn0(j,1) = cPIn(j,1)
  1367. cPIn0(j,2) = cPIn(j,2)
  1368. 554 continue
  1369. C*DBG-F write(ioimp,*) 'Intersection ',i,' a ',nPIn0,' points'
  1370. C*DBG-F do j = 1, nPIn0
  1371. C*DBG-F write(ioimp,*) ' ',j,nbpts0+6+j,cPIn0(j,1),cPIn0(j,2)
  1372. C*DBG-F enddo
  1373. *
  1374. 550 CONTINUE
  1375. *
  1376. * Calcul de la surface de l'intersection et de son centre de gravite
  1377. r_z = cPIn0(nPIn0,1)*cPIn0(1,2) - cPIn0(1,1)*cPIn0(nPIn0,2)
  1378. SuPIn = r_z
  1379. xGIn = (cPIn0(nPIn0,1)+cPIn0(1,1)) * r_z
  1380. yGIn = (cPIn0(nPIn0,2)+cPIn0(1,2)) * r_z
  1381. do 560 i = 1, nPIn0-1
  1382. j = i + 1
  1383. r_z = cPIn0(i,1)*cPIn0(j,2) - cPIn0(j,1)*cPIn0(i,2)
  1384. SuPIn = SuPIn + r_z
  1385. xGIn = xGIn + (cPIn0(i,1)+cPIn0(j,1)) * r_z
  1386. yGIn = yGIn + (cPIn0(i,2)+cPIn0(j,2)) * r_z
  1387. 560 continue
  1388. if (SuPIn .lt. 1.E-7*max(SuT1A,SuT2A) ) then
  1389. C*DBG write(ioimp,*) 'Intersection a une surface negligeable !'
  1390. goto 520
  1391. endif
  1392. r_z = X1s3 / SupIn
  1393. SuPIn = 0.5 * SupIn
  1394. xGIn = xGIn * r_z
  1395. yGIn = yGIn * r_z
  1396. C*DBG write(ioimp,*) 'Surface Intersection :',SuPIn
  1397. *
  1398. * Calcul des coordonnees barycentriques du centre de gravite
  1399. * pour le triangle T1A
  1400. xpip1 = xGIn - cPT1A(1,1)
  1401. ypip1 = yGIn - cPT1A(1,2)
  1402. xpip2 = xGIn - cPT1A(2,1)
  1403. ypip2 = yGIn - cPT1A(2,2)
  1404. xpip3 = xGIn - cPT1A(3,1)
  1405. ypip3 = yGIn - cPT1A(3,2)
  1406. b1T1 = xpip2 * ypip3 - ypip2 * xpip3
  1407. b2T1 = xpip3 * ypip1 - ypip3 * xpip1
  1408. b3T1 = xpip1 * ypip2 - ypip1 * xpip2
  1409. bt = b1T1 + b2T1 + b3T1
  1410. if (abs(bt-SuT1A) .gt. 1.E-3)
  1411. & write(ioimp,*) 'Prob bt-SuT1A',bt,SuT1A
  1412. b1T1 = b1T1 / SuT1A
  1413. b2T1 = b2T1 / SuT1A
  1414. b3T1 = b3T1 / SuT1A
  1415. *
  1416. * pour le triangle T2A
  1417. xpip1 = xGIn - cPT2A(1,1)
  1418. ypip1 = yGIn - cPT2A(1,2)
  1419. xpip2 = xGIn - cPT2A(2,1)
  1420. ypip2 = yGIn - cPT2A(2,2)
  1421. xpip3 = xGIn - cPT2A(3,1)
  1422. ypip3 = yGIn - cPT2A(3,2)
  1423. b1T2 = xpip2 * ypip3 - ypip2 * xpip3
  1424. b2T2 = xpip3 * ypip1 - ypip3 * xpip1
  1425. b3T2 = xpip1 * ypip2 - ypip1 * xpip2
  1426. bt = b1T2 + b2T2 + b3T2
  1427. if (abs(bt-SuT2A) .gt. 1.E-3)
  1428. & write(ioimp,*) 'Prob bt-SuT2A',bt,SuT2A
  1429. b1T2 = b1T2 / SuT2A
  1430. b2T2 = b2T2 / SuT2A
  1431. b3T2 = b3T2 / SuT2A
  1432. *
  1433. * Calcul du jeu
  1434. xjeu = (b1T2*dq1C + b2T2*dq2C + b3T2*dq3C)
  1435. & - (b1T1*dp1C + b2T1*dp2C + b3T1*dp3C)
  1436. C*DBG write(ioimp,*) 'Jeu =',xjeu
  1437. *
  1438. * Ajout d'une relation triangle-triangle
  1439. *
  1440. nelri0 = nelri0 + 1
  1441. nelch = nelch + 1
  1442. *
  1443. * on ajuste les differents segments si necesaire
  1444. *
  1445. if (nelri0.gt.nelrig) then
  1446. nelrig = nelrig + incnel
  1447. segadj,xmatri
  1448. nbelem = nbelem + incnel
  1449. nbnn = 7
  1450. segadj,meleme
  1451. nbnn = 1
  1452. segadj,ipt7
  1453. n = n + incnel
  1454. segadj,mpoval
  1455. endif
  1456. *
  1457. * Mise a jour du meleme
  1458. *
  1459. num(1,nelri0) = ipt1.num(1,iel1)
  1460. num(2,nelri0) = ip1
  1461. num(3,nelri0) = ip2
  1462. num(4,nelri0) = ip3
  1463. num(5,nelri0) = jp1
  1464. num(6,nelri0) = jp2
  1465. num(7,nelri0) = jp3
  1466. icolor(nelri0) = 1
  1467. *$
  1468. * Mise a jour de xmatri
  1469. *
  1470. * lambda
  1471. re( 1,1,nelri0) = 0.d0
  1472. * ip1
  1473. re( 2,1,nelri0) = xnC * b1T1 * SuPIn
  1474. re( 3,1,nelri0) = ynC * b1T1 * SuPIn
  1475. re( 4,1,nelri0) = znC * b1T1 * SuPIn
  1476. * ip2
  1477. re( 5,1,nelri0) = xnC * b2T1 * SuPIn
  1478. re( 6,1,nelri0) = ynC * b2T1 * SuPin
  1479. re( 7,1,nelri0) = znC * b2T1 * SuPIn
  1480. * ip3
  1481. re( 8,1,nelri0) = xnC * b3T1 * SuPIn
  1482. re( 9,1,nelri0) = ynC * b3T1 * SuPIn
  1483. re(10,1,nelri0) = znC * b3T1 * SuPIn
  1484. * jp1
  1485. re(11,1,nelri0) = -xnC * b1T2 * SuPIn
  1486. re(12,1,nelri0) = -ynC * b1T2 * SuPIn
  1487. re(13,1,nelri0) = -znC * b1T2 * SuPIn
  1488. * jp2
  1489. re(14,1,nelri0) = -xnC * b2T2 * SuPIn
  1490. re(15,1,nelri0) = -ynC * b2T2 * SuPIn
  1491. re(16,1,nelri0) = -znC * b2T2 * SuPIn
  1492. * jp3
  1493. re(17,1,nelri0) = -xnC * b3T2 * SuPIn
  1494. re(18,1,nelri0) = -ynC * b3T2 * SuPIn
  1495. re(19,1,nelri0) = -znC * b3T2 * SuPIn
  1496. * on transpose
  1497. do 580 ic = 2, nligrp
  1498. re(1,ic,nelri0) = re(ic,1,nelri0)
  1499. 580 continue
  1500. * le reste est nul
  1501. *
  1502. * remplissage du champoint de depi (jeu)
  1503. *
  1504. ipt7.num(1,nelch) = ipt1.num(1,iel1)
  1505. vpocha(nelch,1) = (xjeu - xjr) * SuPIn
  1506. vpocha(nelch,2) = SuPIn
  1507. IF (MELVA2.NE.0) THEN
  1508. NEL2 = min (iel1,NELA)
  1509. VPOCHA(nelch,3) = max(MELVA2.VELCHE(NPTELA,NEL2),0.D0)*SuPIn
  1510. ENDIF
  1511. C*DBG-F call prfaible(ipt1,iel,nPIn0,mfaible)
  1512. *
  1513. 520 CONTINUE
  1514. 519 CONTINUE
  1515. *
  1516. * Ajustement au plus juste puis desactivation des segments lies
  1517. * a la rigidite du type 0
  1518. if (nelri0.ne.nelrig) then
  1519. nelrig = nelri0
  1520. segadj,xmatri
  1521. nbelem = nelri0
  1522. nbnn = 7
  1523. segadj,meleme
  1524. endif
  1525. segdes,xmatri
  1526. *
  1527. ** write(ioimp,*) ' nb relation type 0 ',nelri0
  1528. * if (nelri0.eq.0) irigel(6,nrigel)=0
  1529. *
  1530. * Destruction des segments locaux devenus inutiles
  1531. segsup,mfaible
  1532. *
  1533. C* GOTO 1000
  1534.  
  1535. *=======================================================================
  1536. *= Fin du sous-programme :
  1537. *=======================================================================
  1538. 1000 CONTINUE
  1539. *
  1540. * Ajustement au plus juste du chpoint de depi (jeu) : mpoval et ipt7
  1541. * puis desactivation du chpoint
  1542. if (vpocha(/1).ne.nelch) then
  1543. n = nelch
  1544. nc=vpocha(/2)
  1545. segadj,mpoval
  1546. nbnn = 1
  1547. nbelem = nelch
  1548. nbsous = 0
  1549. nbref = 0
  1550. segadj,ipt7
  1551. ** write(6,*) ' ipt7 dans impo32 '
  1552. endif
  1553. * Desctivation de la matrice de raideur de contact
  1554. segdes,mrigid
  1555. *
  1556. * Reunion des relations portant sur le meme multiplicateur de lagrange
  1557. *
  1558. call impofu(MRIGID,MCHPOI)
  1559. * write(6,*) ' apres impofu dans impo32 '
  1560. * call ecchpo(mchpoi,1)
  1561. * call prrigi(mrigid,1)
  1562.  
  1563.  
  1564. *
  1565. * Nettoyage eventuel des termes petits dans les relations
  1566. *
  1567. * A voir plus tard. Frig3c suppose que la relation est complete.
  1568. *
  1569. ** call relasi(mrigid)
  1570. *
  1571. * Ecriture des resultats de l'operateur :
  1572. call ecrobj('RIGIDITE',mrigid)
  1573. call actobj('CHPOINT ',mchpoi,1)
  1574. call ecrobj('CHPOINT ',mchpoi)
  1575. *
  1576. 900 CONTINUE
  1577. end
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595.  
  1596.  
  1597.  
  1598.  
  1599.  
  1600.  
  1601.  
  1602.  
  1603.  
  1604.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales