Télécharger resou.eso

Retour à la liste

Numérotation des lignes :

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

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