Télécharger scnd3.eso

Retour à la liste

Numérotation des lignes :

scnd3
  1. C SCND3 SOURCE MB234859 25/02/17 21:15:14 12155
  2. C
  3. subroutine scnd3(mrigid,ri1,ri4)
  4. C----------------------------------------------------------------------
  5. C Eliminer les inconnues dependantes des matrices elementaires
  6. C
  7. C Entrees :
  8. C ---------
  9. C MRIGID : pointeur MRIGID sur les rigidites elementaires a conserver.
  10. C ri1 : pointeur MRIGID sur les rigidites elementaires reecrites
  11. C sous forme de dependance : indique les noeuds a eliminer.
  12. C
  13. C Sortie :
  14. C ---------
  15. C ri4 : pointeur MRIGID sur les rigidites elementaires a conserver
  16. C ou ont ete eliminees les inconnues dependantes.
  17. C
  18. C Remarque : Le(s) ddl(s) dont dependantes les ddls a eliminer ne sont
  19. C pas eliminables dans la meme passe.
  20. C----------------------------------------------------------------------
  21. IMPLICIT INTEGER(I-N)
  22. IMPLICIT REAL*8 (A-H,O-Z)
  23. C
  24. -INC PPARAM
  25. -INC CCOPTIO
  26. -INC CCHAMP
  27. -INC CCREEL
  28. -INC SMCOORD
  29. -INC SMRIGID
  30. -INC SMELEME
  31. C
  32. segment icpr(nbno)
  33. segment trav1
  34. character*4 compd(nbincl),compdd(nbincl)
  35. endsegment
  36. segment trav2
  37. integer irigd(nbnoc,nbincd),nelrigd(nbnoc,nbincd)
  38. endsegment
  39. segment trav3
  40. integer cor1p(nligrp5),cor1d(nligrd5)
  41. endsegment
  42. C
  43. segment ldesc(6,ndes)
  44. segment lrigi(nbrig)
  45. segment lelem(3,nelem)
  46. segment ltrav
  47. integer iporig(ncomp),ipnouv(ncomp),iligne(nlr,ncomp)
  48. integer ipinco(ncomp),ipnode(ncomp),innode(ncomp),nbrel(ncomp)
  49. real*8 xcoeff(nlr,ncomp)
  50. endsegment
  51. pointeur ltravp.ltrav,ltravd.ltrav
  52. segment linco(nnoeud)
  53. segment xrela(nligrm5)
  54. segment lincp(nligrp5)
  55. segment lincd(nligrd5)
  56. character*(LOCHPO) coelim,coelid
  57. logical bvu,bnew,bnsym,bok
  58. C =================================================================
  59. C Segments trav1 (noms de composantes) et icpr (numero de noeuds)
  60. C =================================================================
  61. xzref=5.d-12
  62. nde0=8
  63. nbdeg=0
  64. nbincd=0
  65. nbincl=8
  66. segini trav1
  67. nbno=nbpts
  68. segini icpr
  69. nbnoc=0
  70. nrigto=0
  71. C
  72. C Rigidite contenant les inconnues a eliminer
  73. segact ri1
  74. nri1=ri1.irigel(/2)
  75. do 10 irig=1,nri1
  76. descr=ri1.irigel(3,irig)
  77. segact descr
  78. C
  79. C Composante a eliminer (lisdua(/2)=1)
  80. coelim=lisdua(1)
  81. do 50 inc=1,nbincd
  82. if (compd(inc).eq.coelim) goto 40
  83. 50 continue
  84. C
  85. C Ajout de la composante
  86. nbincd=nbincd+1
  87. if(nbincd.gt.nbincl) then
  88. nbincl=nbincd+8
  89. segadj trav1
  90. endif
  91. compd(nbincd)=coelim
  92. C
  93. 40 continue
  94. C
  95. C Identifier les noeuds presents
  96. meleme=ri1.irigel(1,irig)
  97. segact meleme
  98. do j=1,num(/2)
  99. do k=1,num(/1)
  100. ip=num(k,j)
  101. if(icpr(ip).eq.0) then
  102. nbnoc=nbnoc+1
  103. icpr(ip)=nbnoc
  104. endif
  105. enddo
  106. enddo
  107. C
  108. C Boucle sur les composantes dont peut dependre l'inc eliminee
  109. do 45 iligrd=1,lisinc(/2)
  110. do 55 inc=1,nbincd
  111. if (compd(inc).eq.lisinc(iligrd)) goto 45
  112. 55 continue
  113. C
  114. C Ajout de la composante
  115. nbincd=nbincd+1
  116. inc=nbincd
  117. if(nbincd.gt.nbincl) then
  118. nbincl=nbincd+8
  119. segadj trav1
  120. endif
  121. compd(nbincd)=lisinc(iligrd)
  122. C
  123. 45 continue
  124. 10 continue
  125. * write (6,*) ' scnd3 - 1 ',(compd(i),i=1,nbincd)
  126. C
  127. C Rigidite contenant les matrices elementaires a conserver
  128. segact mrigid
  129. nbrig=mrigid.irigel(/2)
  130. nnoeud=0
  131. nligrp5=0
  132. nligrd5=0
  133. do 110 irig=1,nbrig
  134. descr=irigel(3,irig)
  135. segact descr
  136. lpri=lisinc(/2)
  137. ldua=lisdua(/2)
  138. nligrp5=max(nligrp5,lpri)
  139. nligrd5=max(nligrd5,ldua)
  140. do 140 iprim=1,lpri
  141. do 150 ico=1,nbincd
  142. if (compd(ico).eq.lisinc(iprim)) goto 140
  143. 150 continue
  144. C
  145. C Ajout de la composante
  146. nbincd=nbincd+1
  147. ico=nbincd
  148. if(nbincd.gt.nbincl) then
  149. nbincl=nbincd+8
  150. segadj trav1
  151. endif
  152. compd(nbincd)=lisinc(iprim)
  153. C
  154. 140 continue
  155. C
  156. C Identifier les noeuds presents
  157. meleme=irigel(1,irig)
  158. segact meleme
  159. nnoeud=max(nnoeud,num(/1))
  160. do j=1,num(/2)
  161. do i=1,num(/1)
  162. ip=num(i,j)
  163. if(icpr(ip).eq.0) then
  164. nbnoc=nbnoc+1
  165. icpr(ip)=nbnoc
  166. endif
  167. enddo
  168. enddo
  169. 110 continue
  170. nligrm5=max(nligrp5,nligrd5)
  171. segini,linco,xrela,lincp,lincd,trav3
  172. * write (6,*) ' scnd3 - 2 ',(compd(i),i=1,nbincd)
  173. C
  174. C Noms des composantes duales : recuperer dans nomdu
  175. C eventuellement surcharger/completer par l'utilisateur (opti inco)
  176. do 300 i=1,nbincd
  177. do 310 j=1,lnomdd
  178. if (compd(i).eq.nomdd(j)) goto 320
  179. 310 continue
  180. C
  181. C write (6,*) 'Inco. non definie ',compd(i),' ',compdd(i)
  182. moterr(1:LOCHPO)=compd(i)
  183. call erreur(1150)
  184. return
  185. C
  186. 320 continue
  187. compdd(i)=nomdu(j)
  188. ** write (6,*) ' correspondance ', compd(i), compdd(i)
  189. 300 continue
  190. * write (6,*) ' scnd3 - 3 ',compd(/2),(compd(i),i=1,compd(/2))
  191. * write (6,*) ' scnd3 - 3 ',compdd(/2),(compdd(i),i=1,compdd(/2))
  192. C =================================================================
  193. C Segment trav2 : identifier les numeros des noeuds a eliminer
  194. C =================================================================
  195. segini trav2
  196. do 200 irig=1,nri1
  197. meleme=ri1.irigel(1,irig)
  198. descr =ri1.irigel(3,irig)
  199. do 250 ico=1,nbincd
  200. if (compd(ico).eq.lisdua(1)) goto 260
  201. 250 continue
  202. call erreur(5)
  203. 260 continue
  204. do 240 i=1,num(/2)
  205. ip=num(noeled(1),i)
  206. irigd(icpr(ip),ico)=irig
  207. nelrigd(icpr(ip),ico)=i
  208. 240 continue
  209. 200 continue
  210. C
  211. C Nombre max de relations dans lesquelles intervient un ddl donne
  212. nlr=0
  213. do 201 irig=1,nri1
  214. meleme=ri1.irigel(1,irig)
  215. descr =ri1.irigel(3,irig)
  216. lpri=noelep(/1)
  217. do 241 i=1,num(/2)
  218. do 242 j=1,lpri
  219. ip=num(noelep(j),i)
  220. do 252 ico=1,nbincd
  221. if (compd(ico).eq.lisinc(j)) goto 262
  222. 252 continue
  223. call erreur(5)
  224. 262 continue
  225. if (nelrigd(icpr(ip),ico).gt.0) goto 242
  226. nelrigd(icpr(ip),ico)=nelrigd(icpr(ip),ico)-1
  227. nlr=max(nlr,abs(nelrigd(icpr(ip),ico)))
  228. 242 continue
  229. 241 continue
  230. 201 continue
  231. C =================================================================
  232. C Eliminer des matrices elementaires les inc qui doivent l'etre
  233. C =================================================================
  234. ndes=nde0
  235. segini,lrigi,ldesc
  236. krigel=0
  237. C ----------------------------
  238. C Boucle sur les sous-matrices
  239. do 1000 irig=1,nbrig
  240. ipt4 =mrigid.irigel(1,irig)
  241. des4 =mrigid.irigel(3,irig)
  242. xmatr4=mrigid.irigel(4,irig)
  243. segact,ipt4,des4,xmatr4
  244. C
  245. C La matrice est-elle symetrique
  246. bnsym=(xmatr4.symre.ne.0)
  247. C
  248. nelrig=xmatr4.re(/3)
  249. nligrp4=des4.lisinc(/2)
  250. nligrd4=des4.lisdua(/2)
  251. C
  252. C Correspondance lisinc, lisdua, numero ico dans trav1
  253. do 410 iprim=1,nligrp4
  254. cor1p(iprim)=0
  255. do 420 ico=1,nbincd
  256. if (compd(ico).eq.des4.lisinc(iprim)) then
  257. cor1p(iprim)=ico
  258. goto 410
  259. endif
  260. 420 continue
  261. ** write(6,*) 'cor1p pas de correspondance'
  262. ** call erreur(5)
  263. 410 continue
  264. C
  265. do 510 idua=1,nligrd4
  266. cor1d(idua)=0
  267. do 520 ico=1,nbincd
  268. if (compdd(ico).eq.des4.lisdua(idua)) then
  269. cor1d(idua)=ico
  270. goto 510
  271. endif
  272. 520 continue
  273. ** call erreur(5)
  274. 510 continue
  275. C
  276. nnoeu=ipt4.num(/1)
  277. nelem=ipt4.num(/2)
  278. segini,lelem
  279. lrigi(irig)=lelem
  280. bvu=.false.
  281. C
  282. C ===============================================================
  283. C Boucle sur les elements
  284. C ===============================================================
  285. do 1040 iel=1,nelem
  286. C
  287. C Reinitialiser linco, lincp et lincd
  288. do inn=1,nnoeu
  289. linco(inn)=0
  290. enddo
  291. do inn=1,nligrp4
  292. lincp(inn)=0
  293. enddo
  294. if (bnsym) then
  295. do inn=1,nligrd4
  296. lincd(inn)=0
  297. enddo
  298. endif
  299. ipass=1
  300. C
  301. icpt=0
  302. kelimp=0
  303. ncor=0
  304. do 1009 iligri=1,nligrp4
  305. incp=cor1p(iligri)
  306. ip=ipt4.num(des4.noelep(iligri),iel)
  307. inn=des4.noelep(iligri)
  308. linco(inn)=linco(inn)+1
  309. C
  310. C Ce ddl est-il a eliminer
  311. if (nelrigd(icpr(ip),incp).le.0) then
  312. icpt=icpt+1
  313. lincp(iligri)=icpt
  314. goto 1009
  315. endif
  316. C
  317. linco(inn)=linco(inn)-1
  318. irig1=irigd(icpr(ip),incp)
  319. i1 =nelrigd(icpr(ip),incp)
  320. des1 =ri1.irigel(3,irig1)
  321. ncor=ncor+des1.lisinc(/2)
  322. kelimp=kelimp+1
  323. 1009 continue
  324. C
  325. C Matrice non symetrique : verifier si la duale de l'inconnue
  326. C eliminee n'est pas presente
  327. kelimd=kelimp
  328. if (bnsym) then
  329. icpt=0
  330. kelimd=0
  331. do 1010 iligrd=1,nligrd4
  332. incd=cor1d(iligrd)
  333. ip=ipt4.num(des4.noeled(iligrd),iel)
  334. inn=des4.noeled(iligrd)
  335. linco(inn)=linco(inn)+1
  336. C
  337. C L'inconnue primale associee est-il eliminee
  338. if (nelrigd(icpr(ip),incd).le.0) then
  339. icpt=icpt+1
  340. lincd(iligrd)=icpt
  341. goto 1010
  342. endif
  343. C
  344. linco(inn)=linco(inn)-1
  345. irig1=irigd(icpr(ip),incd)
  346. i1 =nelrigd(icpr(ip),incd)
  347. des1 =ri1.irigel(3,irig1)
  348. ncor=ncor+des1.lisinc(/2)
  349. kelimd=kelimd+1
  350. 1010 continue
  351. endif
  352. C
  353. C -------------------------------------------------------------
  354. C Pas de modification a apporter, passer a l'element suivant
  355. if ((kelimp+kelimd).eq.0) then
  356. if (.not.bvu) then
  357. krigel=krigel+1
  358. jdori=krigel
  359. isizz=ldesc(/2)
  360. if (isizz.lt.jdori) then
  361. ndes=jdori+nde0
  362. segadj,ldesc
  363. endif
  364. ldesc(1,jdori)=des4
  365. ldesc(2,jdori)=0
  366. ldesc(3,jdori)=mrigid.irigel(2,irig)
  367. ldesc(4,jdori)=mrigid.irigel(5,irig)
  368. ldesc(5,jdori)=mrigid.irigel(6,irig)
  369. ldesc(6,jdori)=mrigid.irigel(7,irig)
  370. bvu=.true.
  371. endif
  372. lelem(1,iel)=ipt4
  373. lelem(2,iel)=jdori
  374. lelem(3,iel)=-1*xmatr4
  375. ldesc(2,jdori)=ldesc(2,jdori)+1
  376. goto 1040
  377. endif
  378. C
  379. C -------------------------------------------------------------
  380. C Modifications de la matrice elementraire
  381. C
  382. C Les noeuds sont-ils toujours presents
  383. nbn1=0
  384. do ind=1,nnoeu
  385. if (linco(ind).gt.0) then
  386. nbn1=nbn1+1
  387. linco(ind)=nbn1
  388. endif
  389. enddo
  390. C
  391. ncomp=nligrp4+ncor
  392. segini,ltravp
  393. ltrav=ltravp
  394. nbcomp=nligrp4
  395. ncompp=ncomp
  396. kelim=kelimp
  397. kno=0
  398. C
  399. 1111 continue
  400. C
  401. if (ipass.eq.2) then
  402. ncomp=nligrd4+ncor
  403. segini,ltravd
  404. ltrav=ltravd
  405. nbcomp=nligrd4
  406. ncompd=ncomp
  407. kelim=kelimd
  408. endif
  409. C
  410. do icc=1,nbcomp
  411. ltrav.iporig(icc)=icc
  412. if (ipass.eq.1) then
  413. ipn=des4.noelep(icc)
  414. incp=cor1p(icc)
  415. else
  416. ipn=des4.noeled(icc)
  417. incp=cor1d(icc)
  418. endif
  419. if (linco(ipn).ne.0) then
  420. ip=ipt4.num(ipn,iel)
  421. ltrav.innode(icc)=ip
  422. ltrav.ipnode(icc)=linco(ipn)
  423. ltrav.ipinco(icc)=incp
  424. C Ce ddl est-il a eliminer
  425. if (nelrigd(icpr(ip),incp).le.0) then
  426. if (ipass.eq.1) ltrav.ipnouv(icc)=lincp(icc)
  427. if (ipass.eq.2) ltrav.ipnouv(icc)=lincd(icc)
  428. endif
  429. endif
  430. enddo
  431. C
  432. kligrp4=0
  433. kcomp=nbcomp
  434. do 1011 iligri=1,nbcomp
  435. C
  436. if (ipass.eq.1) then
  437. ipn=des4.noelep(iligri)
  438. incp=cor1p(iligri)
  439. else
  440. ipn=des4.noeled(iligri)
  441. incp=cor1d(iligri)
  442. endif
  443. ip=ipt4.num(ipn,iel)
  444. C
  445. C Ce ddl est-il a eliminer
  446. if (nelrigd(icpr(ip),incp).le.0) goto 1011
  447. C
  448. C Le(s) ddl(s) lie(s) au ddl elimine exite(nt)-il(s)
  449. irig1=irigd(icpr(ip),incp)
  450. i1 =nelrigd(icpr(ip),incp)
  451. ipt1 =ri1.irigel(1,irig1)
  452. des1 =ri1.irigel(3,irig1)
  453. xmatr1=ri1.irigel(4,irig1)
  454. segact,xmatr1
  455. C
  456. xvalm=0.d0
  457. do icoel=1,des1.lisinc(/2)
  458. xvalm=max(xvalm,abs(xmatr1.re(1,icoel,i1)))
  459. enddo
  460. xvalm=xvalm*xzref
  461. C
  462. C -----------------------------------------------------------
  463. do 1012 icoel=1,des1.lisinc(/2)
  464. C
  465. C Coefficient de la relation non significatif : iterer
  466. if (abs(xmatr1.re(1,icoel,i1)).le.xvalm) goto 1012
  467. C
  468. ipl=ipt1.num(des1.noelep(icoel),i1)
  469. C
  470. do 1420 ico=1,nbincd
  471. if (compd(ico).eq.des1.lisinc(icoel)) then
  472. iprim=ico
  473. goto 1410
  474. endif
  475. 1420 continue
  476. 1410 continue
  477. C
  478. C Noeuds deja presents dans l'element
  479. ino=0
  480. ipo=0
  481. do 1013 idq=1,ncomp
  482. if (ltrav.innode(idq).ne.ipl) goto 1013
  483. ino=ltrav.ipnode(idq)
  484. if (ltrav.ipinco(idq).ne.iprim) goto 1013
  485. ipo=idq
  486. goto 1014
  487. 1013 continue
  488. C
  489. C Il faut ajouter un noeud au segment descripteur
  490. if (ino.eq.0) then
  491. kno=kno+1
  492. ino=nbn1+kno
  493. endif
  494. C
  495. C Il faut completer le segment descripteur
  496. kligrp4=kligrp4+1
  497. C
  498. 1014 continue
  499. C
  500. if (ipo.eq.0) then
  501. C Conserver les informations du nouveau ddl
  502. kcomp=kcomp+1
  503. ltrav.innode(kcomp)=ipl
  504. ltrav.ipnode(kcomp)=ino
  505. ltrav.ipinco(kcomp)=iprim
  506. ltrav.ipnouv(kcomp)=nbcomp-kelim+kligrp4
  507. ipo=kcomp
  508. endif
  509. C
  510. ltrav.nbrel(ipo)=ltrav.nbrel(ipo)+1
  511. ltrav.xcoeff(ltrav.nbrel(ipo),ipo)=xmatr1.re(1,icoel,i1)
  512. ltrav.iligne(ltrav.nbrel(ipo),ipo)=ltrav.iporig(iligri)
  513. C
  514. 1012 continue
  515. C -----------------------------------------------------------
  516. C
  517. 1011 continue
  518. C
  519. C Cas d'une matrice vide
  520. if (ipass.eq.1) then
  521. nligrp=nligrp4-kelimp+kligrp4
  522. if (nligrp.eq.0) goto 1040
  523. C
  524. C Matrice non-symetrique : refaire le travail sur les duales
  525. if (bnsym) then
  526. ipass=2
  527. goto 1111
  528. endif
  529. C
  530. C Matrice symetrique : infos duals identiques
  531. ltravd=ltravp
  532. ncompd=ncompp
  533. nligrd=nligrp
  534. else
  535. nligrd=nligrd4-kelimd+kligrp4
  536. if (nligrd.eq.0) goto 1040
  537. endif
  538. C
  539. C Matrice de relation vide car tout a ete elimine
  540. ityp4=28
  541. if ((ipt4.itypel.eq.49).or.(ipt4.itypel.eq.22)) then
  542. iid=1
  543. if (ipt4.itypel.eq.49) iid=2
  544. if (nligrp.le.iid) then
  545. nbdeg=nbdeg+1
  546. goto 1040
  547. endif
  548. ityp4=ipt4.itypel
  549. endif
  550. C
  551. C Creation du nouveau maillage, descripteur, matrice
  552. C
  553. nbnn=nbn1+kno
  554. nbelem=1
  555. nbref=0
  556. nbsous=0
  557. segini,ipt2
  558. ipt2.itypel=ityp4
  559. C
  560. segini,des2
  561. C
  562. nelrig=1
  563. segini,xmatr2
  564. xmatr2.symre=xmatr4.symre
  565. C
  566. C Renseigner le maillage et le descripteur
  567. do 1021 ic=1,ncompp
  568. inew=ltravp.ipnouv(ic)
  569. if (inew.ne.0) then
  570. des2.noelep(inew)=ltravp.ipnode(ic)
  571. des2.lisinc(inew)=compd(ltravp.ipinco(ic))
  572. ipt2.num(ltravp.ipnode(ic),1)=ltravp.innode(ic)
  573. endif
  574. 1021 continue
  575. do 1022 ic=1,ncompd
  576. inew=ltravd.ipnouv(ic)
  577. if (inew.ne.0) then
  578. des2.noeled(inew)=ltravd.ipnode(ic)
  579. des2.lisdua(inew)=compdd(ltravd.ipinco(ic))
  580. ipt2.num(ltravd.ipnode(ic),1)=ltravd.innode(ic)
  581. endif
  582. 1022 continue
  583. C
  584. C Renseigner la matrice
  585. do 1024 ic=1,ncompp
  586. iori=ltravp.iporig(ic)
  587. inew=ltravp.ipnouv(ic)
  588. if (inew.ne.0) then
  589. C
  590. C Reinitialiser xrela
  591. if (iori.ne.0) then
  592. do il=1,nligrd4
  593. xrela(il)=xmatr4.re(il,iori,iel)
  594. enddo
  595. else
  596. do il=1,nligrd4
  597. xrela(il)=0.D0
  598. enddo
  599. endif
  600. C
  601. do inr=1,ltravp.nbrel(ic)
  602. xtmp=ltravp.xcoeff(inr,ic)
  603. ilig=ltravp.iligne(inr,ic)
  604. do il=1,nligrd4
  605. xval=xmatr4.re(il,ilig,iel)*xtmp
  606. xrela(il)=xrela(il)+xval
  607. enddo
  608. enddo
  609. C
  610. do ie=1,ncompd
  611. knew=ltravd.ipnouv(ie)
  612. if (knew.ne.0) then
  613. xval=0.D0
  614. if (ie.le.nligrd4) xval=xrela(ie)
  615. do inr=1,ltravd.nbrel(ie)
  616. xtmp=ltravd.xcoeff(inr,ie)
  617. ilig=ltravd.iligne(inr,ie)
  618. xval=xval+xtmp*xrela(ilig)
  619. enddo
  620. xmatr2.re(knew,inew,1)=xmatr2.re(knew,inew,1)+xval
  621. endif
  622. enddo
  623. C
  624. endif
  625. 1024 continue
  626. C
  627. C Supprimer les segments de travail
  628. segsup,ltravp
  629. if (bnsym) segsup,ltravd
  630. C
  631. C Recyclage eventuel du descripteur
  632. jdes=0
  633. if (krigel.ge.1) then
  634. do 1031 ides=1,krigel
  635. des3=ldesc(1,ides)
  636. C
  637. C A-t-on les memes caracteristiques?
  638. if (ldesc(3,ides).ne.mrigid.irigel(2,irig)) goto 1030
  639. if (ldesc(4,ides).ne.mrigid.irigel(5,irig)) goto 1030
  640. if (ldesc(5,ides).ne.mrigid.irigel(6,irig)) goto 1030
  641. if (ldesc(6,ides).ne.mrigid.irigel(7,irig)) goto 1030
  642. C
  643. if (nligrd.ne.des3.noeled(/1)) goto 1030
  644. if (nligrp.ne.des3.noelep(/1)) goto 1030
  645. do id1=1,nligrd
  646. if (des2.noeled(id1).ne.des3.noeled(id1)) goto 1030
  647. if (des2.lisdua(id1).ne.des3.lisdua(id1)) goto 1030
  648. enddo
  649. do id1=1,nligrp
  650. if (des2.noelep(id1).ne.des3.noelep(id1)) goto 1030
  651. if (des2.lisinc(id1).ne.des3.lisinc(id1)) goto 1030
  652. enddo
  653. C
  654. jdes=ides
  655. ldesc(2,jdes)=ldesc(2,jdes)+1
  656. segsup,des2
  657. goto 1032
  658. 1030 continue
  659. 1031 continue
  660. 1032 continue
  661. endif
  662. C
  663. if (jdes.eq.0) then
  664. krigel=krigel+1
  665. jdes=krigel
  666. isizz=ldesc(/2)
  667. if (isizz.lt.jdes) then
  668. ndes=jdes+nde0
  669. segadj,ldesc
  670. endif
  671. ldesc(1,jdes)=des2
  672. ldesc(2,jdes)=1
  673. ldesc(3,jdes)=mrigid.irigel(2,irig)
  674. ldesc(4,jdes)=mrigid.irigel(5,irig)
  675. ldesc(5,jdes)=mrigid.irigel(6,irig)
  676. ldesc(6,jdes)=mrigid.irigel(7,irig)
  677. endif
  678. C
  679. lelem(1,iel)=ipt2
  680. lelem(2,iel)=jdes
  681. lelem(3,iel)=xmatr2
  682. C
  683. 1040 continue
  684. C ===============================================================
  685. C
  686. 1000 continue
  687. C Fin de boucle sur les sous-matrices
  688. C -----------------------------------
  689. segsup,linco,xrela,lincp,lincd,trav3
  690. C =================================================================
  691. C Construire la rigidite ou les inconnues ont ete eliminees
  692. C =================================================================
  693. nrigel=krigel
  694. segini,ri4
  695. ri4.mtymat='TEMPORAI'
  696. ri4.iforig=mrigid.iforig
  697. do ibr=1,nbrig
  698. lelem=lrigi(ibr)
  699. ipt4 =mrigid.irigel(1,ibr)
  700. C
  701. C Renseigner les matrices elementaires
  702. do 1042 iel=1,ipt4.num(/2)
  703. ipt6=lelem(1,iel)
  704. if (ipt6.eq.0) goto 1042
  705. kdes=lelem(2,iel)
  706. xmatr6=lelem(3,iel)
  707. C
  708. itmp=1
  709. bnew=.true.
  710. if (xmatr6.lt.0) then
  711. bnew=.false.
  712. xmatr6=abs(xmatr6)
  713. itmp=iel
  714. endif
  715. C
  716. des3=ldesc(1,kdes)
  717. nelt=ldesc(2,kdes)
  718. ipt5=ri4.irigel(1,kdes)
  719. C
  720. C Creation de la sous-matrice
  721. if (ipt5.eq.0) then
  722. ldesc(2,kdes)=1
  723. C
  724. nligrp=des3.noelep(/1)
  725. nligrd=des3.noeled(/1)
  726. nelrig=nelt
  727. C
  728. bok=(nelrig.eq.xmatr6.re(/3).and.bnew)
  729. if (bok) then
  730. xmatr5=xmatr6
  731. ipt5=ipt6
  732. goto 1041
  733. endif
  734. C
  735. segini,xmatr5
  736. xmatr5.symre=xmatr6.symre
  737. C
  738. nbnn=ipt6.num(/1)
  739. nbelem=nelt
  740. nbref=0
  741. nbsous=0
  742. segini,ipt5
  743. if (bnew) then
  744. ipt5.itypel=28
  745. if ((ipt6.itypel.eq.49).or.(ipt6.itypel.eq.22)) then
  746. ipt5.itypel=ipt6.itypel
  747. endif
  748. else
  749. ipt5.itypel=ipt6.itypel
  750. endif
  751. C
  752. 1041 continue
  753. C
  754. ri4.coerig(kdes)=mrigid.coerig(ibr)
  755. ri4.irigel(1,kdes)=ipt5
  756. ri4.irigel(2,kdes)=mrigid.irigel(2,ibr)
  757. ri4.irigel(3,kdes)=des3
  758. ri4.irigel(4,kdes)=xmatr5
  759. ri4.irigel(5,kdes)=mrigid.irigel(5,ibr)
  760. ri4.irigel(6,kdes)=mrigid.irigel(6,ibr)
  761. ri4.irigel(7,kdes)=mrigid.irigel(7,ibr)
  762. ri4.irigel(8,kdes)=mrigid.irigel(8,ibr)
  763. C
  764. if (bok) goto 1042
  765. endif
  766. C
  767. ielmt=ldesc(2,kdes)
  768. do inn=1,ipt6.num(/1)
  769. ipt5.num(inn,ielmt)=ipt6.num(inn,itmp)
  770. enddo
  771. C
  772. xcoer=mrigid.coerig(ibr)/ri4.coerig(kdes)
  773. xmatr5=ri4.irigel(4,kdes)
  774. do ilc=1,xmatr5.re(/2)
  775. do ili=1,xmatr5.re(/1)
  776. xmatr5.re(ili,ilc,ielmt)=xcoer*xmatr6.re(ili,ilc,itmp)
  777. enddo
  778. enddo
  779. C
  780. ldesc(2,kdes)=ldesc(2,kdes)+1
  781. if (bnew) segsup,ipt6,xmatr6
  782. 1042 continue
  783. segsup,lelem
  784. enddo
  785. segsup,icpr,trav1,trav2,lrigi,ldesc
  786. C
  787. CCC WRITE(*,*) 'MRIGID'
  788. CCC call prrigi(MRIGID,0)
  789. CCC WRITE(*,*) 'RI1'
  790. CCC call prrigi(ri1,0)
  791. CCC WRITE(*,*) 'RI4'
  792. CCC call prrigi(ri4,0)
  793. C =================================================================
  794. C Desactivation generale
  795. C =================================================================
  796. segact mrigid
  797. do irig=1,nbrig
  798. xmatri=irigel(4,irig)
  799. meleme=irigel(1,irig)
  800. descr=irigel(3,irig)
  801. segdes xmatri,descr
  802. enddo
  803. segact ri4
  804. do irig=1,ri4.irigel(/2)
  805. xmatri=ri4.irigel(4,irig)
  806. meleme=ri4.irigel(1,irig)
  807. descr=ri4.irigel(3,irig)
  808. segdes xmatri,descr
  809. enddo
  810. segact ri1
  811. do irig=1,nri1
  812. xmatri=ri1.irigel(4,irig)
  813. meleme=ri1.irigel(1,irig)
  814. descr=ri1.irigel(3,irig)
  815. segdes xmatri,descr
  816. enddo
  817. if(iimpi.ne.0.and.nbdeg.ne.0)
  818. > write (6,*) ' nombre de relations degenerees'//
  819. > ' apres elimination ',nbdeg
  820. * write(6,*) 'nbincl nligrp5 nnoeud ndes nlr',
  821. * > nbincl,nligrp5,nnoeud,ndes,nlr
  822. end
  823.  
  824.  

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