Télécharger impo32.eso

Retour à la liste

Numérotation des lignes :

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

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