Télécharger resou.eso

Retour à la liste

Numérotation des lignes :

resou
  1. C RESOU SOURCE MB234859 25/01/03 21:15:26 12105
  2.  
  3. SUBROUTINE RESOU
  4. C----------------------------------------------------------------------
  5. C **** CET OPERATEUR SERT A RESOUDRE UN SYSTEME D EQUATIONS LINEAIRES
  6. C **** CHPOINT = RESOU RIGIDITE CHPOINT
  7. C----------------------------------------------------------------------
  8. IMPLICIT INTEGER(I-N)
  9. IMPLICIT REAL*8 (A-H,O-Z)
  10. C
  11. -INC PPARAM
  12. -INC CCOPTIO
  13. -INC SMRIGID
  14. -INC SMTEXTE
  15. -INC SMTABLE
  16. -INC SMCHPOI
  17. -INC SMELEME
  18. -INC SMLCHPO
  19. -INC CCREEL
  20. C
  21. PARAMETER(ZERO=0.D0)
  22. SEGMENT IDEMEM(0)
  23. segment ideme0(idemem(/1),30)
  24. segment ideme1(idemem(/1),30)
  25. segment idnote(0)
  26. C
  27. CHARACTER*4 LISM(9)
  28. CHARACTER*72 CHARRE
  29. REAL*8 XVA
  30. LOGICAL ILOG,ILUG,casfimp,notok,bdblx
  31. DATA LISM/'NOID','NOUN','ENSE','GRAD','CHOL','STAB','ELIM',
  32. >'NOST','SOUC'/
  33. DATA ILOG/.FALSE./
  34. C
  35. XVA=REAL(0.D0)
  36. IOB=0
  37. C
  38. * sauvegarde norinc
  39. * write(6,*) 'norinc norind ',norinc,norind
  40. norins=norinc
  41. iverif=1
  42. ipt8=0
  43. iunil=0
  44. * le defaut est de faire une passe d'elimination
  45. nelim=30
  46. * experimentalement 2 passes est mieux
  47. nelim=2
  48. IMTVID=0
  49. NOUNIL=0
  50. NOID=0
  51. NOEN=1
  52. IGRADJ = 0
  53. ICHSKI = 0
  54. INSYM = 0
  55. KIKI=0
  56. KSYMET = 0
  57. IPSHPO = 0
  58. ISTAB=0
  59. ISOUCI = 0
  60. ifochs = -99
  61. NDEMEM=0
  62. C----------------------------------------------------------------------
  63. C LECTURE DES ARGUMENTS DE L'OPERATEUR RESOU
  64. C----------------------------------------------------------------------
  65. C LECTURE DES OPTIONS/MOTS-CLES
  66. 5 CONTINUE
  67. CALL LIRMOT(LISM,9,KIKI,0)
  68. IF (KIKI.EQ.1) NOID=1
  69. IF (KIKI.EQ.2) NOUNIL=1
  70. IF (KIKI.EQ.3) NOEN=0
  71. * IF (KIKI.EQ.4) IGRADJ = 1
  72. * IF (KIKI.EQ.5) ICHSKI = 1
  73. * IF (KIKI.EQ.4.OR.KIKI.EQ.5) KSYMET = 1
  74. IF (KIKI.EQ.6) ISTAB=1
  75. IF (KIKI.EQ.7) then
  76. call lirent(nelim,1,iretou)
  77. nelim=min(30,max(0,nelim))
  78. endif
  79. IF (KIKI.EQ.8) ISTAB=0
  80. IF (KIKI.EQ.9) ISOUCI=1
  81. IF (KIKI.NE.0) GOTO 5
  82. C
  83. if (noid.eq.1) iverif=0
  84. IF(NUCROU.EQ.0) THEN
  85. ICHSKI=1
  86. ELSEIF(NUCROU.EQ.1) THEN
  87. IGRADJ=1
  88. KSYMET=1
  89. ENDIF
  90. * WRITE(6,*) ' nucrou', nucrou
  91. * IF ( IGRADJ + ICHSKI .EQ. 0 ) ICHSKI = 1
  92. C
  93. C LECTURE DE LA RIGIDITE
  94. CALL LIROBJ('RIGIDITE',IPOIRI,1,IRETOU)
  95. IF(IERR.NE.0) GO TO 5000
  96. IPRIGO=IPOIRI
  97. C
  98. C LECTURE DE LA PRECISION
  99. PREC=REAL(xspeti)
  100. CALL LIRREE(PREC,0,IRETOU)
  101. IF(IERR.NE.0) GO TO 5000
  102. C
  103. C REMPLISSAGE DU 2ND MEMBRE IDEMEM(**) A PARTIR DE
  104. C ... CHPOINT
  105. SEGINI IDEMEM
  106. 1 CONTINUE
  107. CALL LIROBJ('CHPOINT ',ISECO,0,IRETOU)
  108. IF(IRETOU.NE.0) THEN
  109. IDEMEM(**)=ISECO
  110. NDEMEM=NDEMEM+1
  111. mchpoi=iseco
  112. segact mchpoi
  113. if (mchpoi.jattri(/1).ge.1) then
  114. notok=(mchpoi.jattri(1).ne.2)
  115. else
  116. notok=.true.
  117. endif
  118. if (notok) then
  119. INTERR=mchpoi
  120. CALL ERREUR(-387)
  121. endif
  122. GOTO 1
  123. ENDIF
  124. C
  125. C ... LISTCHPO
  126. CALL LIROBJ('LISTCHPO',ISECO,0,IRETOU)
  127. IF(IRETOU.NE.0) THEN
  128. mlchpo=ISECO
  129. segact mlchpo
  130. NDEMEM = ichpoi(/1)
  131. do iu = 1,NDEMEM
  132. idemem(**) = ichpoi(iu)
  133. * write(6,*) ' extension idemem 2 ',idemem(/1)
  134. enddo
  135. segdes mlchpo
  136. n1 = ndemem
  137. segini mlchpo
  138. ipshpo = mlchpo
  139. ENDIF
  140. IF (IERR.NE.0) RETURN
  141. C
  142. C ... TABLE DE SOUS-TYPE LIAISONS_STATIQUES
  143. CALL LIRTAB('LIAISONS_STATIQUES',ITBAS,0,IRET)
  144. IF (ITBAS.EQ.0) GOTO 90
  145. C
  146. IF (IIMPI.EQ.333) THEN
  147. WRITE(IOIMP,*) 'on a lu la table des conditions aux limites'
  148. ENDIF
  149. mtab1 = itbas
  150. segact mtab1
  151. ima = mtab1.mlotab - 1
  152. segini idnote
  153. im = 0
  154. segdes mtab1
  155. 80 CONTINUE
  156. im = im + 1
  157. itmod = 0
  158. ichp0 = 0
  159. if (im.gt.ima) then
  160. IF (NDEMEM.GT.0) GOTO 90
  161. * pas de champs de force
  162. CALL ERREUR(1)
  163. return
  164. endif
  165. CALL ACCTAB(ITBAS,'ENTIER',IM,0.d0,' ',.true.,IP0,
  166. & 'TABLE',I1,X1,CHARRE,.true.,ITMOD)
  167. if (ierr.ne.0) return
  168. c table itmod trouvee --> on recupere la force
  169. if (itmod.gt.0) then
  170. CALL ACCTAB(ITMOD,'MOT',0,0.d0,'FORCE',.true.,IP0,
  171. & 'CHPOINT',I1,X1,CHARRE,.true.,ICHP0)
  172. if (ierr.ne.0) return
  173. if (ichp0.gt.0) then
  174. idemem(**) = ichp0
  175. NDEMEM=NDEMEM+1
  176. * write(6,*) ' extension idemem 3 ',idemem(/1)
  177. idnote(**) = im
  178. else
  179. call erreur(1)
  180. return
  181. endif
  182. c on cree le point repere ici
  183. CALL CREPO1 (ZERO, ZERO, ZERO, IPOIN)
  184. CALL ECCTAB(ITMOD,'MOT',0,0.0D0,'POINT_REPERE',.TRUE.,0,
  185. & 'POINT',0,0.0D0,' ',.TRUE.,IPOIN)
  186. endif
  187. GOTO 80
  188. IF (IERR.NE.0) RETURN
  189. C----------------------------------------------------------------------
  190. C DEBUT DU TRAVAIL
  191. 90 CONTINUE
  192. SEGINI IDEME0,IDEME1
  193. C
  194. C Verifier qu'il n'y a pas de blocage en double
  195. *** call verlag(ipoiri)
  196. if (ierr.ne.0) return
  197. * y a t il des matrices de relations non unilaterales
  198. mrigid=ipoiri
  199. C call prrigi(ipoiri,1)
  200. segact mrigid
  201. ifochs=iforig
  202. idepe=0
  203. * write(ioimp,*) 'dans resou mrigid iforig ',mrigid,iforig
  204. C
  205. nbr = irigel(/2)
  206. if (jrcond.ne.0) nelim=30
  207. do 1000 irig = 1,nbr
  208. meleme=irigel(1,irig)
  209. segact meleme
  210. if ((irigel(6,irig).eq.0.or.nounil.eq.1).and.itypel.eq.22)
  211. > idepe=idepe+num(/2)
  212. if (irigel(6,irig).ne.0) iunil=1
  213. if (irigel(6,irig).eq.2) nelim=30
  214. if (irigel(7,irig).ne.0) then
  215. insym=1
  216. ichski=0
  217. endif
  218. 1000 continue
  219. C
  220. C Elimination recursive des conditions aux limites
  221. * on la fait en gradient conjugue ou en appel de unilater
  222. if (igradj.eq.1.or.(iunil.eq.1.and.nounil.eq.0)) nelim=30
  223. nfois=nelim-1
  224. bdblx=.false.
  225. imult=1
  226. icond=idepe
  227. icondi=(icond*10)/9+1
  228. if=0
  229. do ifois=1,nfois
  230. if(imult.ne.0.and.icond.ne.0.and.(icond*10)/9.lt.icondi.and.
  231. > (icondi-icond.gt.0.or.igradj.eq.1)) then
  232. icondi=icond
  233. if=if+1
  234. if(ierr.ne.0) return
  235. call resouc(mrigid,mrigic,idemem,ideme0,ideme1,
  236. > nounil,bdblx,icond,imult,if,imtvid,nelim)
  237. C write(ioimp,*) ' passe ',if,' condition ',icond,ifois
  238. if(ierr.ne.0) return
  239. mrigid=mrigic
  240. endif
  241. enddo
  242. C
  243. C S'il reste des conditions : dedoubler les mult de Lagrange restants
  244. C -> nouvel appel pour creer lagdua et adapter les seconds membres
  245. if (iunil.eq.0.or.nounil.eq.1) then
  246. if (icond.ne.0) then
  247. if=if+1
  248. bdblx=.true.
  249. if(ierr.ne.0) return
  250. call resouc(mrigid,mrigic,idemem,ideme0,ideme1,
  251. > nounil,bdblx,icond,imult,if,imtvid,nelim)
  252. * write(ioimp,*) ' passe ','finale',' condition ',icond
  253. if(ierr.ne.0) return
  254. mrigid=mrigic
  255. endif
  256. endif
  257. * write (ioimp,*) 'nombre de passes',if,mrigid.imlag
  258. if (idepe.ne.0) noid=1
  259. C
  260. C Rigidite reduite aux inconnues independantes
  261. ipoiri=mrigid
  262. * call prrigi(ipoiri,1)
  263. C-------------------------------------------------------
  264. *
  265. * Si au moins une des matrices n'est pas symétrique, on passera
  266. * par le solveur non-symétrique LDMT.
  267. *
  268. SEGACT MRIGID*MOD
  269. NRG = IRIGEL(/1)
  270. NBR = IRIGEL(/2)
  271. C ... Ceci peut arriver si par exemple on extrait la partie
  272. C symétrique d'une matrice purement antisymétrique ...
  273. * IF(NBR.EQ.0) THEN
  274. * SEGDES MRIGID
  275. * CALL ERREUR(727)
  276. * RETURN
  277. * ENDIF
  278. C ... Mais avant on va tester si la normalisation des variables
  279. C primales et duales a été demandée - ceci entraîne la perte
  280. C de la symétrie ...
  281. IF(NORINC.GT.0 .AND. NORIND.GT.0) THEN
  282. IF(KSYMET.EQ.1) THEN
  283. CALL ERREUR(19)
  284. SEGDES,MRIGID
  285. RETURN
  286. ENDIF
  287. INSYM = 1
  288. IGRADJ = 0
  289. ICHSKI = 0
  290. GOTO 15
  291. ENDIF
  292.  
  293. C ... On teste si la matrice contient des matrices non symétriques ...
  294. C ... Si OUI, ce n'est pas la peine de faire les autres tests ...
  295. DO 9 IN = 1,NBR
  296. IF(IRIGEL(7,IN).GT.0) THEN
  297. C ... On vérifie si l'utilisateur n'a pas demandé explicitement
  298. C la résolution par Choleski ou gradient conjugué,
  299. C si OUI on râle puis on s'en va !!! ...
  300. IF(KSYMET.EQ.1) THEN
  301. CALL ERREUR(1126)
  302. SEGDES,MRIGID
  303. RETURN
  304. ENDIF
  305. IF(NORINC.NE.0.AND.NORIND.EQ.0) THEN
  306. * on supprime la normalisation au lieu de faire une erreur
  307. norinc=0
  308. ** CALL ERREUR(760)
  309. ** SEGDES,MRIGID
  310. ** RETURN
  311. ENDIF
  312. INSYM = 1
  313. IGRADJ = 0
  314. ICHSKI = 0
  315. GOTO 15
  316. ENDIF
  317. 9 CONTINUE
  318. 15 CONTINUE
  319. C
  320. C **** ON S'ASSURE QU'IL N'Y A PAS D'APPUIS UNILATERAUX
  321. C
  322. IF (IUNIL.EQ.0.OR.NOUNIL.EQ.1) GOTO 30
  323. C
  324. C **** EXISTENCE DES APPUIS UNILATERAUX
  325. C **** SI ON EST DEJA PASSE DANS LES APPUIS UNILATERAUX
  326. C ISUPEQ POINTE SUR UNE TABLE CONTENANT LES DONNEES A PASSER
  327. C A LA PROCEDURE UNILATER
  328. C
  329. ISUPLO=ISUPEQ
  330. IF (ISUPLO.NE.0) GOTO 27
  331. C
  332. C Distinguer ce qui est unilateral (RI2) du reste (RI1)
  333. NNOR=0
  334. DO 22 I=1,IRIGEL(/2)
  335. IF(IRIGEL(6,I).EQ.0) NNOR=NNOR+1
  336. 22 CONTINUE
  337. IF(NNOR.EQ.0) THEN
  338. CALL ERREUR(312)
  339. GOTO 5000
  340. ENDIF
  341. C
  342. NRIGE=IRIGEL(/1)
  343. NRIGEL=NNOR
  344. SEGINI RI1
  345. RI1.IFORIG = IFORIG
  346. c* RI1.MTYMAT = MTYMAT <- type TEMPORAI(RE) plantage severe
  347. RI1.MTYMAT = ' '
  348. NRIGEL=IRIGEL(/2)-NNOR
  349. SEGINI RI2
  350. RI2.IFORIG = IFORIG
  351. c* RI2.MTYMAT = MTYMAT <- type TEMPORAI(RE) plantage severe
  352. RI2.MTYMAT = ' '
  353. II1=0
  354. II2=0
  355. DO 23 I=1,IRIGEL(/2)
  356. IF(IRIGEL(6,I).NE.0) THEN
  357. RI3=RI2
  358. II2=II2+1
  359. II=II2
  360. ELSE
  361. RI3=RI1
  362. II1=II1+1
  363. II=II1
  364. ENDIF
  365. DO 24 J=1,NRIGE
  366. RI3.IRIGEL(J,II) = IRIGEL(J,I)
  367. 24 CONTINUE
  368. RI3.COERIG(II)=COERIG(I)
  369. 23 CONTINUE
  370. C
  371. C Creation de la table a transmettre a UNILATER (stockee dans la
  372. C raideur initiale)
  373. CALL CRTABL(MTABLE)
  374. ISUPEQ=MTABLE
  375. MRIGID=IPRIGO
  376. SEGACT MRIGID*MOD
  377. ISUPEQ=MTABLE
  378. CALL ECCTAB(MTABLE,'ENTIER ',1 ,XVA,' ',ILOG,IOB,
  379. $ 'RIGIDITE',IOB,XVA,' ',ILOG,RI1)
  380. CALL ECCTAB(MTABLE,'ENTIER ',2 ,XVA,' ',ILOG,IOB,
  381. $ 'RIGIDITE',IOB,XVA,' ',ILOG,RI2)
  382. CALL ECCTAB(MTABLE,'ENTIER ',3 ,XVA,' ',ILOG,IOB,
  383. $ 'LOGIQUE ',IOB,XVA,' ',ILOG,IOB)
  384.  
  385. ISUPLO=MTABLE
  386. SEGDES RI1,RI2,MTABLE
  387. C
  388. C Recuperer la table a transmettre a UNILATER
  389. 27 CONTINUE
  390. MTABLE=ISUPLO
  391. SEGACT MTABLE
  392. ILUG=(INSYM.EQ.1)
  393. C
  394. CALL ECCTAB(MTABLE,'MOT ',4 ,XVA,'NSYM',ILOG,IOB,
  395. $ 'LOGIQUE ',IOB,XVA,' ' ,ILUG,IOB)
  396. if(idepe.ne.0) then
  397. * on passe les ideme* a mrem sous forme de listchpo
  398. n1=if
  399. segini mlchpo,mlchp1
  400. do i=1,if
  401. mlchpo.ichpoi(i)=ideme0(1,i)
  402. mlchp1.ichpoi(i)=ideme1(1,i)
  403. enddo
  404. CALL ECCTAB(MTABLE,'ENTIER ',10 ,XVA,' ',ILOG,IOB,
  405. $ 'LISTCHPO',IOB,XVA,' ',ILOG,mlchpo)
  406. CALL ECCTAB(MTABLE,'ENTIER ',11 ,XVA,' ',ILOG,IOB,
  407. $ 'LISTCHPO',IOB,XVA,' ',ILOG,mlchp1)
  408. * pour mrem on met la derniere raideur condensee. Elle contient les pointeurs pour remonter
  409. CALL ECCTAB(MTABLE,'ENTIER ',50 ,XVA,' ',ILOG,IOB,
  410. $ 'RIGIDITE',IOB,XVA,' ',ILOG,ipoiri)
  411. endif
  412. SEGDES MRIGID
  413. DO 26 I=NDEMEM,1,-1
  414. ISECO=IDEMEM(I)
  415. CALL ACTOBJ ('CHPOINT ',ISECO,1)
  416. CALL ECROBJ ('CHPOINT ',ISECO)
  417. 26 CONTINUE
  418. SEGSUP IDEMEM
  419. CALL ECROBJ ('TABLE ',ISUPLO)
  420. SEGINI MTEXTE
  421. LTT=8
  422. MTEXT(1:LTT) ='UNILATER'
  423. NCART=8
  424. SEGDES MTEXTE
  425. CALL ECROBJ('TEXTE',MTEXTE)
  426. mrigid=iprigo
  427. segdes mrigid
  428. GOTO 5000
  429. C
  430. C ... On arrive ici dans le cas où il n'y a pas d'appuis unilatéraux ...
  431. 30 CONTINUE
  432. * il se peut que le dernier chp soit du frottement
  433. * on l'enleve car il ne sert a rien si on n'appele pas unilater
  434. if (NDEMEM.gt.1.and.idepe.ne.0) then
  435. mchpoi=ideme0(NDEMEM,if)
  436. segact MCHPOI
  437. if (mtypoi.eq.'LX ') NDEMEM=NDEMEM-1
  438. endif
  439. C
  440. * write(6,*) ' ichski, igradj,insym ',ichski, igradj,insym
  441. * write (6,*) ' imtvid ',imtvid
  442. C
  443. C Cas matrice vide
  444. if (imtvid.eq.1) then
  445. *** write(6,*) ' attention matrice vide. Système surcontraint '
  446. call erreur(-364)
  447. *
  448. nsoupo=0
  449. nat=0
  450. segact idemem*mod
  451.  
  452. do i=1,idemem(/1)
  453. segini mchpoi
  454. mchpoi.ifopoi = ifochs
  455. idemem(i)=mchpoi
  456. enddo
  457. if (noen.eq.0) then
  458. nat=2
  459. nsoupo=0
  460. segini mchpo4
  461. call ecrobj('CHPOINT ',mchpo4)
  462. call ecrent(0)
  463. endif
  464. else
  465. * write(6,*) ' appel resou1 -- idemem(1)'
  466. * segact idemem
  467. * idesec= idemem(1)
  468. * call ecchpo(idesec,0)
  469. * write(6,*) ' appel resou1 -- ipoiri'
  470. * call prrigi ( ipoiri,1)
  471. * write(6,*) ' ichski insym ', ichski, insym
  472. IF(ICHSKI.EQ.1) CALL RESOU1(IPOIRI,IDEMEM,NOID,NOEN,PREC,
  473. > ISTAB,ISOUCI)
  474. IF(IGRADJ.EQ.1) CALL GRACO0(IPOIRI,IDEMEM,NOID,NOEN)
  475. IF(INSYM .EQ.1) CALL LDMT (IPOIRI,IDEMEM,NOID,NOEN,PREC,ISOUCI)
  476. IF(IERR.NE.0) GO TO 5000
  477. ENDIF
  478. C
  479. C -----------------------------------------------------------------
  480. C Reintroduire les inconnues eliminees
  481. do 2010 ifois=1,30
  482. segact mrigid
  483. mrigid=jrsup
  484. if (mrigid.eq.0) goto 2011
  485. if(ierr.ne.0) GOTO 5000
  486. call resour(idemem,ideme0,ideme1,mrigid,if,ipt8,isouci,iverif)
  487. if(ierr.ne.0) GOTO 5000
  488. if=if-1
  489. 2010 continue
  490. 2011 continue
  491. C
  492. C -----------------------------------------------------------------
  493. C ECRITURE DES OBJETS RESULTATS
  494. SEGACT IDEMEM
  495. do 3 i=1,NDEMEM
  496. il = NDEMEM + 1 - i
  497. iret=idemem(il)
  498. C
  499. mchpoi=iret
  500. segact mchpoi*mod
  501. mchpoi.jattri(1)=1
  502. C
  503. if (itbas.ne.0) then
  504. ilo = idnote(il)
  505. CALL ACCTAB(ITBAS,'ENTIER',ILO,0.d0,' ',.true.,IP0,
  506. & 'TABLE',I1,X1,CHARRE,.true.,ITMOD)
  507. if (ierr.ne.0) GOTO 5000
  508.  
  509. CALL ECCTAB(ITMOD,'MOT',0,0.D0,'DEFORMEE',
  510. & .TRUE.,0,'CHPOINT',0,0.D0,' ',.TRUE.,IRET)
  511.  
  512. if (i.EQ.NDEMEM) then
  513. segdes mtab1
  514. segsup idnote
  515. CALL ECROBJ ('TABLE ',itbas)
  516. endif
  517. else if (ipshpo.gt.0) then
  518. mlchpo = ipshpo
  519. ichpoi(il) = iret
  520. if (i.EQ.NDEMEM) then
  521. mlchpo = ipshpo
  522. CALL ACTOBJ ('LISTCHPO ',ipshpo,1)
  523. CALL ECROBJ ('LISTCHPO ',ipshpo)
  524. endif
  525. else
  526. CALL ACTOBJ ('CHPOINT ',IRET,1)
  527. CALL ECROBJ ('CHPOINT ',IRET)
  528. endif
  529.  
  530. 3 CONTINUE
  531. SEGSUP IDEMEM
  532. C
  533. 5000 CONTINUE
  534. norinc=norins
  535. END
  536.  
  537.  

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