Télécharger prase3.eso

Retour à la liste

Numérotation des lignes :

prase3
  1. C PRASE3 SOURCE GOUNAND 25/04/30 21:15:29 12258
  2. SUBROUTINE PRASE3(MATELE,MRENU,MMULAG,METASS,
  3. $ KTYPI,IORINC,MLAG1,MLAG2,IPBLOC,
  4. $ KTIME,LTIME,IMPR,IRET)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. IMPLICIT INTEGER (I-N)
  7. C***********************************************************************
  8. C NOM : PRASE3
  9. C PROJET : Noyau linéaire NLIN
  10. C DESCRIPTION : On effectue l'assemblage d'un ensemble de matrices
  11. C élémentaires pour faire une matrice Morse.
  12. C
  13. C
  14. C Quelques commentaires sur la numérotation pour le placement des
  15. C multiplicateurs de Lagrange :
  16. C
  17. C * Au niveau des noms d'inconnues :
  18. C 1) Placement juste après un nom sur lequel porte la relation
  19. C 2) Placement après tous les noms sur lesquels porte la relation
  20. C * Au niveau des ddls :
  21. C a) Placement après tous les ddls sur lesquels porte la relation
  22. C b) Placement par points si le multiplicateur de Lagrange
  23. C est dans un espace d'éléments finis
  24. C 'APR2' = 1a ; 'APR3' = 1b ; 'APR4' = 2a ; 'APR5' = 2b
  25. C
  26. C
  27. C
  28. C LANGAGE : ESOPE
  29. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  30. C mél : gounand@semt2.smts.cea.fr
  31. C***********************************************************************
  32. C APPELES : FIXMEL, MLUNIQ, MKMPOS, MKNPOS, MAKPRM, MAKPMT
  33. C FUSPRM
  34. C APPELES (UTIL.) : FIMOTS, RSETXI, CUNIQ, CREPER, IUNIQ, ISETI
  35. C APPELES (STAT.) : INMSTA, PRMSTA
  36. C APPELE PAR : KRES2
  37. C***********************************************************************
  38. C ENTREES : MRENU, MMULAG
  39. C ENTREES/SORTIES : MATELE
  40. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  41. C***********************************************************************
  42. C VERSION : v1, 24/11/99, nouvelle version initiale
  43. C HISTORIQUE : v1, 30/09/99, création
  44. C HISTORIQUE : 05/01/00 : modif. appel fixmel
  45. C HISTORIQUE : 13/01/00 : Rajout d'une méthode de renumérotation avec
  46. C placement des multiplicateurs de Lagrange plus efficace
  47. C (cf. subroutine calnu2).
  48. C HISTORIQUE : 06/04/04 : Renumerotation
  49. C***********************************************************************
  50. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  51. C en cas de modification de ce sous-programme afin de faciliter
  52. C la maintenance !
  53. C***********************************************************************
  54. * MATASS est une matrice de préconditionnement déjà assemblée
  55. * permettant de sauter des étapes de l'assemblage
  56.  
  57. -INC PPARAM
  58. -INC CCOPTIO
  59. -INC SMCOORD
  60. character*(*) mrenu, mmulag
  61. -INC SMLENTI
  62. INTEGER JG
  63. POINTEUR KRSPGT.MLENTI
  64. POINTEUR KRSPGD.MLENTI
  65. C! POINTEUR KRILAG.MLENTI
  66. POINTEUR KRINCP.MLENTI
  67. POINTEUR KRINCD.MLENTI
  68. POINTEUR KRIPUN.MLENTI
  69. POINTEUR KRIDUN.MLENTI
  70. POINTEUR NEWNUM.MLENTI
  71. POINTEUR IWORK.MLENTI
  72. POINTEUR LDDLDU.MLENTI
  73. POINTEUR LDDLDT.MLENTI
  74. -INC SMLMOTS
  75. INTEGER JGM,JGN
  76. C! POINTEUR GPINCS.MLMOTS
  77. C! POINTEUR GPILAG.MLMOTS
  78. POINTEUR LITOT.MLMOTS
  79. C!*-INC SMLLOGI
  80. C! SEGMENT MLLOGI
  81. C! LOGICAL LOGI(JG)
  82. C! ENDSEGMENT
  83. C! POINTEUR LILAG.MLLOGI
  84. -INC SMELEME
  85. POINTEUR MELPRI.MELEME
  86. POINTEUR MELDUA.MELEME
  87. POINTEUR MELPR2.MELEME
  88. POINTEUR MELDU2.MELEME
  89. POINTEUR MLPPRI.MELEME
  90. POINTEUR MLPDUA.MELEME
  91. POINTEUR KJSPGT.MELEME
  92. POINTEUR MATELE.MATRIK
  93. POINTEUR IMATEL.IMATRI
  94. INTEGER NBI,NPT
  95. POINTEUR KMINCT.MINC
  96. INTEGER NTT,NJA
  97. POINTEUR PMTOT.PMORS
  98. INTEGER NBVA
  99. POINTEUR IZATOT.IZA
  100. POINTEUR PMTO2.PMORS
  101. POINTEUR IZATO2.IZA
  102. POINTEUR PMCOU.PMORS
  103. POINTEUR PMCO2.PMORS
  104. POINTEUR PMCOT.PMORS
  105. INTEGER NBLK
  106. POINTEUR IDMTOT.IDMAT
  107. -INC SMTABLE
  108. POINTEUR KTIME.MTABLE
  109. DIMENSION ITTIME(4)
  110. CHARACTER*8 CHARI
  111. LOGICAL LTIME
  112. *
  113. * Ensemble de profils morse
  114. *
  115. *
  116. * Includes persos
  117. *
  118. * Segment avec diverses statistiques mémoire et CPU
  119. *STAT -INC SMSTAT
  120. *STAT POINTEUR MSTOT.MSTAT
  121. *STAT POINTEUR MSPRM.MSTAT
  122. *STAT POINTEUR MSMAT.MSTAT
  123. * Liste de MELEME
  124. INTEGER NBMEL
  125. SEGMENT MELS
  126. POINTEUR LISMEL(NBMEL).MELEME
  127. ENDSEGMENT
  128. POINTEUR GPMELS.MELS
  129. POINTEUR GPMLPP.MELS
  130. POINTEUR GPMLPD.MELS
  131. *
  132. SEGMENT PMORSS
  133. POINTEUR LISDD(NBPM).MLENTI
  134. POINTEUR LISPM(NBPM).PMORS
  135. ENDSEGMENT
  136. *
  137. INTEGER IMPR,IRET
  138. *
  139. REAL*8 RDUMMY(1)
  140. INTEGER IBI
  141. C! INTEGER NBMTOT,NBM,NBM2
  142. INTEGER IMATE
  143. INTEGER NMATE
  144. INTEGER NPOPRI,NPODUA
  145. INTEGER ITTDDL
  146. INTEGER NTOGPO,NTOTPO,NTOTIN,NTTDDL
  147. INTEGER NNZTOT
  148. INTEGER LNM,NME
  149. INTEGER NMEUNI
  150. INTEGER IPROFI,JOB
  151. LOGICAL LASEM,LSYM,LOGII
  152. *
  153. C
  154. C Définition des options
  155. C
  156. C algorithmes utilisés pour la renumérotation
  157. C * 'RIEN' : pas de renumérotation
  158. C * 'SLOA' : algorithme de chez Sloan
  159. C * 'GIPR' : Gibbs-King (profile reduction)
  160. C * 'GIBA' : Gibbs-Poole-Stockmeyer (bandwidth reduction)
  161. PARAMETER (NRENU=4)
  162. CHARACTER*4 LRENU(NRENU)
  163. C algorithmes utilisés pour la prise en compte des mult.lag.
  164. C * 'RIEN' : on ne fait rien de particulier pour les
  165. C multiplicateurs de lagrange
  166. C * 'CORR' : correct
  167.  
  168. PARAMETER (NMULAG=2)
  169. CHARACTER*4 LMULAG(NMULAG)
  170.  
  171. IVALI=0
  172. XVALI=0.D0
  173. LOGII=.FALSE.
  174. IRETI=0
  175. XVALR=0.D0
  176. IRETR=0
  177.  
  178. DATA LRENU/'RIEN','SLOA','GIPR','GIBA'/
  179. DATA LMULAG/'RIEN','APR2'/
  180. *
  181. * Executable statements
  182. *
  183. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans prase3'
  184. IF (LTIME) THEN
  185. call timespv(ittime,oothrd)
  186. ITI1=(ITTIME(1)+ITTIME(2))/10
  187. ENDIF
  188. *
  189. * Lecture des données (options renumérotation et mult.lag)
  190. *
  191. CALL FICH4(MRENU,LRENU,NRENU,IRENU,IMPR,IRET)
  192. IF (IRET.NE.0) GOTO 9999
  193. CALL FICH4(MMULAG,LMULAG,NMULAG,IMULAG,IMPR,IRET)
  194. IF (IRET.NE.0) GOTO 9999
  195. *STAT CALL INMSTA(MSTAT,IMPR)
  196. *STAT CALL INMSTA(MSTOT,0)
  197. *
  198. * Quelques tests
  199. *
  200. SEGACT MATELE
  201. NMATE=MATELE.IRIGEL(/2)
  202. * WRITE(IOIMP,*) 'NMATE=',NMATE
  203. IF (NMATE.LE.0) THEN
  204. WRITE(IOIMP,*) 'Pas de matrices élémentaires à assembler'
  205. GOTO 9999
  206. ENDIF
  207. PMTOT=MATELE.KIDMAT(4)
  208. LASEM=(PMTOT.NE.0)
  209. IF (LASEM.AND.IMPR.GT.0) THEN
  210. WRITE(IOIMP,*) 'Les matrices élémentaires sont déjà assemblées'
  211. ENDIF
  212. IF (LASEM) GOTO 9998
  213. *STAT CALL PRMSTA(' Après les tests',MSTAT,IMPR)
  214. *
  215. * Correction des maillages (à supprimmer dès que possible)
  216. *
  217. SEGACT MATELE*MOD
  218. DO 11 IMATE=1,NMATE
  219. MELPRI=MATELE.IRIGEL(1,IMATE)
  220. MELDUA=MATELE.IRIGEL(2,IMATE)
  221. CALL FIXMEL(MELPRI,MELDUA,
  222. $ MELPR2,MELDU2,
  223. $ IMPR,IRET)
  224. IF (IRET.NE.0) GOTO 9999
  225. MATELE.IRIGEL(1,IMATE)=MELPR2
  226. MATELE.IRIGEL(2,IMATE)=MELDU2
  227. 11 CONTINUE
  228. *STAT CALL PRMSTA(' Après fixmel',MSTAT,IMPR)
  229. *
  230. * Construire l'ensemble des points primaux et duaux pour chaque
  231. * matrice élémentaire (on ne veut plus utiliser les KSPGPs et KSPGDs
  232. * des IMATRI).
  233. *
  234. NBMEL=NMATE
  235. SEGINI GPMLPP
  236. NBMEL=NMATE
  237. SEGINI GPMLPD
  238. NBMEL=1
  239. SEGINI GPMELS
  240. * In 12 : SEGINI GPMLPP.LISMEL(*)
  241. * In 12 : SEGINI GPMLPD.LISMEL(*)
  242. DO 12 IMATE=1,NMATE
  243. SEGACT GPMELS*MOD
  244. GPMELS.LISMEL(1)=MATELE.IRIGEL(1,IMATE)
  245. CALL MLUNIQ(GPMELS,MLPPRI,IMPR,IRET)
  246. IF (IRET.NE.0) GOTO 9999
  247. GPMLPP.LISMEL(IMATE)=MLPPRI
  248. SEGACT GPMELS*MOD
  249. GPMELS.LISMEL(1)=MATELE.IRIGEL(2,IMATE)
  250. CALL MLUNIQ(GPMELS,MLPDUA,IMPR,IRET)
  251. IF (IRET.NE.0) GOTO 9999
  252. GPMLPD.LISMEL(IMATE)=MLPDUA
  253. 12 CONTINUE
  254. SEGSUP GPMELS
  255. *
  256. * Construire l'ensemble des points sur lesquels sont localisées des
  257. * inconnues (KJSPGT).
  258. *
  259. NBMEL=NMATE*2
  260. SEGINI GPMELS
  261. DO 1 IMATE=1,NMATE
  262. GPMELS.LISMEL(2*IMATE-1)=GPMLPP.LISMEL(IMATE)
  263. GPMELS.LISMEL(2*IMATE) =GPMLPD.LISMEL(IMATE)
  264. 1 CONTINUE
  265. CALL MLUNIQ(GPMELS,KJSPGT,IMPR,IRET)
  266. IF (IRET.NE.0) GOTO 9999
  267. SEGSUP GPMELS
  268. IF (IMPR.GT.3) THEN
  269. WRITE(IOIMP,*) 'L''ensemble des points est :'
  270. SEGPRT,KJSPGT
  271. ENDIF
  272. * Construire la liste de correspondance pour KJSPGT
  273. SEGACT KJSPGT
  274. NTOTPO=KJSPGT.NUM(/2)
  275. NTOGPO=nbpts
  276. JG=NTOGPO
  277. SEGINI KRSPGT
  278. * SEGACT KRSPGT
  279. CALL RSETXI(KRSPGT.LECT,KJSPGT.NUM,NTOTPO)
  280. *STAT CALL PRMSTA(' Construction KJSPGT et KRSPGT',MSTAT,IMPR)
  281. *
  282. * Construction de l'ensemble des noms d'inconnues possibles LITOT
  283. * et attribution d'un ordre.
  284. * On voudra qu'un ddl d'ordre i soit après au moins un ddl d'ordre
  285. * i-1 avec lequel il a une relation
  286. * LITOT : liste des noms d'inconnues
  287. * In INCOR2 : SEGINI LITOT SEGDES LITOT
  288. C!* CALL INCORD(MATELE,LITOT,LIORD,IMPR,IRET)
  289. CALL INCOR2(MATELE,LITOT,MLAG1,MLAG2)
  290. IF (IERR.NE.0) GOTO 9999
  291. IF (IMPR.GT.2) THEN
  292. WRITE(IOIMP,*) 'L''ensemble des inconnues est :'
  293. SEGPRT,LITOT
  294. ENDIF
  295. *STAT CALL PRMSTA(' Construction LITOT',MSTAT,IMPR)
  296. *
  297. * Construire le repérage des inconnues KMINCT
  298. *
  299. SEGACT LITOT
  300. NTOTIN=LITOT.MOTS(/2)
  301. NPT=NTOTPO
  302. NBI=NTOTIN
  303. SEGINI KMINCT
  304. * Initialisation de la liste des noms d'inconnues (LISINC)
  305. DO 48 IBI=1,NBI
  306. KMINCT.LISINC(IBI)=LITOT.MOTS(IBI)(1:8)
  307. 48 CONTINUE
  308. SEGSUP LITOT
  309. * Construction de MPOS
  310. SEGACT KRSPGT
  311. SEGACT MATELE
  312. DO 5 IMATE=1,NMATE
  313. IMATEL=MATELE.IRIGEL(4,IMATE)
  314. SEGACT IMATEL
  315. * On parcourt la primale
  316. LNM=IMATEL.LISPRI(/1)
  317. NME=IMATEL.LISPRI(/2)
  318. JG=NME
  319. SEGINI KRINCP
  320. CALL CREPER(LNM,NME,NTOTIN,IMATEL.LISPRI,KMINCT.LISINC,
  321. $ KRINCP.LECT,
  322. $ IMPR,IRET)
  323. IF (IRET.NE.0) THEN
  324. WRITE(IOIMP,*) '1'
  325. GOTO 9999
  326. ENDIF
  327. * On supprimme les doublons dans KRINCP
  328. JG=NME
  329. SEGINI KRIPUN
  330. CALL IUNIQ(KRINCP.LECT,NME,
  331. $ KRIPUN.LECT,NMEUNI,
  332. $ IMPR,IRET)
  333. IF (IRET.NE.0) GOTO 9999
  334. SEGSUP KRINCP
  335. MLPPRI=GPMLPP.LISMEL(IMATE)
  336. SEGACT MLPPRI
  337. NPOPRI=MLPPRI.NUM(/2)
  338. CALL MKMPOS(NMEUNI,NPOPRI,NTOGPO,NTOTPO,NTOTIN,
  339. $ KRIPUN.LECT,MLPPRI.NUM,KRSPGT.LECT,
  340. $ KMINCT.MPOS,
  341. $ IMPR,IRET)
  342. SEGSUP KRIPUN
  343. * On parcourt la duale
  344. LNM=IMATEL.LISDUA(/1)
  345. NME=IMATEL.LISDUA(/2)
  346. JG=NME
  347. SEGINI KRINCD
  348. CALL CREPER(LNM,NME,NTOTIN,
  349. $ IMATEL.LISDUA,KMINCT.LISINC,
  350. $ KRINCD.LECT,
  351. $ IMPR,IRET)
  352. IF (IRET.NE.0) THEN
  353. WRITE(IOIMP,*) '2'
  354. GOTO 9999
  355. ENDIF
  356. * On supprime les doublons dans KRINCD
  357. JG=NME
  358. SEGINI KRIDUN
  359. CALL IUNIQ(KRINCD.LECT,NME,
  360. $ KRIDUN.LECT,NMEUNI,
  361. $ IMPR,IRET)
  362. IF (IRET.NE.0) GOTO 9999
  363. SEGSUP KRINCD
  364. MLPDUA=GPMLPD.LISMEL(IMATE)
  365. SEGACT MLPDUA
  366. NPODUA=MLPDUA.NUM(/2)
  367. CALL MKMPOS(NMEUNI,NPODUA,NTOGPO,NTOTPO,NTOTIN,
  368. $ KRIDUN.LECT,MLPDUA.NUM,KRSPGT.LECT,
  369. $ KMINCT.MPOS,
  370. $ IMPR,IRET)
  371. IF (IRET.NE.0) GOTO 9999
  372. SEGSUP KRIDUN
  373. 5 CONTINUE
  374. *
  375. * Remplissage de NPOS(IPT) repérage dans le nb. total de ddl
  376. *
  377. CALL MKNPOS(NTOTPO,NTOTIN,KMINCT.MPOS,
  378. $ KMINCT.NPOS,
  379. $ IMPR,IRET)
  380. IF (IRET.NE.0) GOTO 9999
  381. IF (IMPR.GT.3) THEN
  382. WRITE(IOIMP,*) 'Le repérage des inconnues est :'
  383. SEGPRT,KMINCT
  384. ENDIF
  385. *STAT CALL PRMSTA(' Construction KMINCT',MSTAT,IMPR)
  386. *
  387. * On change de stratégie : on construit d'abord le profil Morse total
  388. * Puis, on le remplit avec le contenu des matrices élémentaires
  389. * On construit le profil Morse diagonale pour initialiser
  390. *
  391. NBPM=1
  392. DO IMATE=1,NMATE
  393. ITYMAT=MATELE.IRIGEL(7,IMATE)
  394. * IF (ITYMAT.EQ.4.OR.ITYMAT.EQ.-4) THEN
  395. IF (ITYMAT.EQ.4) THEN
  396. NBPM=NBPM+2
  397. ELSE
  398. NBPM=NBPM+1
  399. ENDIF
  400. ENDDO
  401. SEGINI PMORSS
  402. IPM=0
  403. *
  404. NTTDDL=KMINCT.NPOS(NTOTPO+1)-1
  405. JG=NTTDDL
  406. SEGINI LDDLDU
  407. CALL ISETI(LDDLDU.LECT,NTTDDL)
  408. NTT=NTTDDL
  409. NJA=NTTDDL
  410. SEGINI PMTOT
  411. CALL ISETI(PMTOT.IA,NTTDDL+1)
  412. CALL ISETI(PMTOT.JA,NTTDDL)
  413. *
  414. IPM=IPM+1
  415. PMORSS.LISDD(IPM)=LDDLDU
  416. PMORSS.LISPM(IPM)=PMTOT
  417. *
  418. DO 7 IMATE=1,NMATE
  419. *STAT CALL INMSTA(MSPRM,0)
  420. MELPRI=MATELE.IRIGEL(1,IMATE)
  421. MELDUA=MATELE.IRIGEL(2,IMATE)
  422. IMATEL=MATELE.IRIGEL(4,IMATE)
  423. SEGACT IMATEL
  424. * repérage dans la primale
  425. LNM=IMATEL.LISPRI(/1)
  426. NME=IMATEL.LISPRI(/2)
  427. JG=NME
  428. SEGINI KRINCP
  429. CALL CREPER(LNM,NME,NTOTIN,
  430. $ IMATEL.LISPRI,KMINCT.LISINC,
  431. $ KRINCP.LECT,
  432. $ IMPR,IRET)
  433. IF (IRET.NE.0) THEN
  434. WRITE(IOIMP,*) '3'
  435. GOTO 9999
  436. ENDIF
  437. * repérage dans la duale
  438. LNM=IMATEL.LISDUA(/1)
  439. NME=IMATEL.LISDUA(/2)
  440. JG=NME
  441. SEGINI KRINCD
  442. CALL CREPER(LNM,NME,NTOTIN,
  443. $ IMATEL.LISDUA,KMINCT.LISINC,
  444. $ KRINCD.LECT,
  445. $ IMPR,IRET)
  446. IF (IRET.NE.0) THEN
  447. WRITE(IOIMP,*) '4'
  448. GOTO 9999
  449. ENDIF
  450. MLPDUA=GPMLPD.LISMEL(IMATE)
  451. SEGACT MLPDUA
  452. NPODUA=MLPDUA.NUM(/2)
  453. NTOGPO=nbpts
  454. JG=NTOGPO
  455. SEGINI KRSPGD
  456. CALL RSETXI(KRSPGD.LECT,MLPDUA.NUM,NPODUA)
  457. *
  458. * Construire le profil Morse
  459. *
  460. * SEGINI PMCOU
  461. CALL MAKPR2(MELPRI,KRINCP,
  462. $ MELDUA,NPODUA,MLPDUA,KRSPGD,KRINCD,
  463. $ KMINCT,KRSPGT,
  464. $ LDDLDU,PMCOU,
  465. $ IMPR,IRET)
  466. IF (IRET.NE.0) GOTO 9999
  467. IPM=IPM+1
  468. PMORSS.LISDD(IPM)=LDDLDU
  469. PMORSS.LISPM(IPM)=PMCOU
  470. * SEGPRT,LDDLDU
  471. * SEGPRT,PMCOU
  472. SEGSUP KRSPGD
  473. SEGSUP KRINCD
  474. SEGSUP KRINCP
  475. *
  476. * Cas particulier : celui des matrices CCt
  477. *
  478. ITYMAT=MATELE.IRIGEL(7,IMATE)
  479. * IF (ITYMAT.EQ.4.OR.ITYMAT.EQ.-4) THEN
  480. IF (ITYMAT.EQ.4) THEN
  481. * In MAKPMT : SEGINI PMCO2
  482. CALL TRPMO2(LDDLDU,PMCOU,NTTDDL,
  483. $ LDDLDT,PMCOT,
  484. $ IMPR,IRET)
  485. IPM=IPM+1
  486. PMORSS.LISDD(IPM)=LDDLDT
  487. PMORSS.LISPM(IPM)=PMCOT
  488. * SEGPRT,LDDLDT
  489. * SEGPRT,PMCOT
  490. ENDIF
  491. IF (IMPR.GT.3) THEN
  492. WRITE(IOIMP,*) 'Le ',IMATE,'eme profil Morse est :'
  493. SEGPRT,PMCOU
  494. ENDIF
  495. C CALL PRMSTA(' Assemblage profil Morse élémentaire',MSPRM
  496. C $ ,IMPR)
  497. 7 CONTINUE
  498. *STAT CALL PRMSTA(' Assemblage profils Morse élémentaire',MSPRM
  499. *STAT $ ,IMPR)
  500. *
  501. * on effectue le ET sur les profils Morse
  502. *
  503. * WRITE(IOIMP,*) 'Prase3 METASS,IMULAG=',METASS,IMULAG
  504. IF (METASS.EQ.3) THEN
  505. CALL FUSPR3(PMORSS,NTTDDL,
  506. $ PMTOT,
  507. $ IMPR,IRET)
  508. IF (IRET.NE.0) GOTO 9999
  509. ELSEIF (METASS.EQ.4) THEN
  510. CALL FUSPR4(PMORSS,NTTDDL,
  511. $ PMTOT,
  512. $ IMPR,IRET)
  513. IF (IRET.NE.0) GOTO 9999
  514. ELSEIF (METASS.EQ.5) THEN
  515. CALL FUSPR5(PMORSS,NTTDDL,
  516. $ PMTOT,
  517. $ IMPR,IRET)
  518. IF (IRET.NE.0) GOTO 9999
  519. ELSE
  520. WRITE(IOIMP,*) 'Programming error'
  521. GOTO 9999
  522. ENDIF
  523. * WRITE(IOIMP,*) 'Apres fuspr'
  524. *
  525. * Suppression de PMORSS
  526. *
  527. DO IPM=1,PMORSS.LISDD(/1)
  528. LDDLDU=PMORSS.LISDD(IPM)
  529. SEGSUP LDDLDU
  530. PMCOU=PMORSS.LISPM(IPM)
  531. SEGSUP PMCOU
  532. ENDDO
  533. SEGSUP PMORSS
  534. * In FUSPRM : SEGINI PMTO2
  535. C CALL FUSPRM(PMTOT,PMCOU,
  536. C $ PMTO2,
  537. C $ IMPR,IRET)
  538. C IF (IRET.NE.0) GOTO 9999
  539. * CALL FUSPR2(PMTOT,PMCOU,NTTDDL,
  540. * $ PMTO2,
  541. * $ IMPR,IRET)
  542. * IF (IRET.NE.0) GOTO 9999
  543. C SEGSUP PMCOU
  544. C SEGSUP PMTOT
  545. C PMTOT=PMTO2
  546. *STAT CALL PRMSTA(' Fusion des profils Morse élémentaire',MSPRM,IMPR)
  547. *STAT CALL PRMSTA(' Assemblage du profil Morse total',MSTAT,IMPR)
  548. *
  549. * Essai d'une matrice avec plusieurs colonnes égales
  550. *
  551. C NTT=5
  552. C NJA=5
  553. C SEGINI PMTOT
  554. C PMTOT.IA(1)=1
  555. C PMTOT.IA(2)=1+NJA
  556. C PMTOT.IA(3)=1+NJA
  557. C PMTOT.IA(4)=1+NJA
  558. C PMTOT.IA(5)=1+NJA
  559. C PMTOT.IA(6)=1+NJA
  560. C PMTOT.JA(1)=3
  561. C PMTOT.JA(2)=3
  562. C PMTOT.JA(3)=2
  563. C PMTOT.JA(4)=1
  564. C PMTOT.JA(5)=2
  565. *
  566. * Ordonnancement du profil Morse total
  567. *
  568. SEGACT PMTOT*MOD
  569. * WRITE (IOIMP,2020) (PMTOT.IA(I),I=1,PMTOT.IA(/1))
  570. * WRITE (IOIMP,2020) (PMTOT.JA(I),I=1,PMTOT.JA(/1))
  571. NTTDDL=PMTOT.IA(/1)-1
  572. NNZTOT=PMTOT.JA(/1)
  573. JG=MAX(NTTDDL+1,2*NNZTOT)
  574. SEGINI IWORK
  575. CALL CSORT(PMTOT.IA(/1)-1,RDUMMY,PMTOT.JA,PMTOT.IA,
  576. $ IWORK.LECT,.FALSE.)
  577. SEGSUP IWORK
  578. *STAT CALL PRMSTA(' Ordonnancement du profil Morse total',MSTAT,IMPR)
  579. * WRITE (IOIMP,2020) (PMTOT.IA(I),I=1,PMTOT.IA(/1))
  580. * WRITE (IOIMP,2020) (PMTOT.JA(I),I=1,PMTOT.JA(/1))
  581. * 2020 FORMAT (20(2X,I4) )
  582. *
  583. *
  584. *
  585. * Compactage du profil Morse
  586. *
  587. IF (METASS.EQ.5) THEN
  588. PMORS=PMTOT
  589. SEGACT PMORS*MOD
  590. INEW=1
  591. NTT=IA(/1)-1
  592. DO ITT=1,NTT
  593. IDEB=IA(ITT)
  594. IFIN=IA(ITT+1)-1
  595. JNEW=-1
  596. IA(ITT)=INEW
  597. DO IJA=IDEB,IFIN
  598. JOLD=JA(IJA)
  599. IF (JNEW.NE.JOLD) THEN
  600. JNEW=JOLD
  601. JA(INEW)=JNEW
  602. INEW=INEW+1
  603. ENDIF
  604. ENDDO
  605. ENDDO
  606. IA(NTT+1)=INEW
  607. * WRITE(IOIMP,*) 'Compactage 1'
  608. * WRITE (IOIMP,2020) (PMTOT.IA(I),I=1,PMTOT.IA(/1))
  609. * WRITE (IOIMP,2020) (PMTOT.JA(I),I=1,PMTOT.JA(/1))
  610. * WRITE(IOIMP,*) 'ICUR=',ICUR
  611. * WRITE(IOIMP,*) 'IDEC=',IDEC
  612. * IA(NTT+1)=IA(NTT+1)-IDEC
  613. NJA=INEW-1
  614. SEGADJ PMORS
  615. * WRITE(IOIMP,*) 'Compactage 2'
  616. * WRITE (IOIMP,2020) (PMTOT.IA(I),I=1,PMTOT.IA(/1))
  617. * WRITE (IOIMP,2020) (PMTOT.JA(I),I=1,PMTOT.JA(/1))
  618. ENDIF
  619. *
  620. * Assemblage des matrices élémentaires
  621. *
  622. NBVA=NNZTOT
  623. SEGINI IZATOT
  624. DO 77 IMATE=1,NMATE
  625. *STAT CALL INMSTA(MSMAT,0)
  626. MELPRI=MATELE.IRIGEL(1,IMATE)
  627. MELDUA=MATELE.IRIGEL(2,IMATE)
  628. IMATEL=MATELE.IRIGEL(4,IMATE)
  629. SEGACT IMATEL
  630. SEGACT KMINCT
  631. * repérage dans la primale
  632. LNM=IMATEL.LISPRI(/1)
  633. NME=IMATEL.LISPRI(/2)
  634. JG=NME
  635. SEGINI KRINCP
  636. CALL CREPER(LNM,NME,NTOTIN,
  637. $ IMATEL.LISPRI,KMINCT.LISINC,
  638. $ KRINCP.LECT,
  639. $ IMPR,IRET)
  640. IF (IRET.NE.0) THEN
  641. WRITE(IOIMP,*) '5'
  642. GOTO 9999
  643. ENDIF
  644. * repérage dans la duale
  645. LNM=IMATEL.LISDUA(/1)
  646. NME=IMATEL.LISDUA(/2)
  647. JG=NME
  648. SEGINI KRINCD
  649. CALL CREPER(LNM,NME,NTOTIN,
  650. $ IMATEL.LISDUA,KMINCT.LISINC,
  651. $ KRINCD.LECT,
  652. $ IMPR,IRET)
  653. IF (IRET.NE.0) THEN
  654. WRITE(IOIMP,*) '6'
  655. GOTO 9999
  656. ENDIF
  657. CALL MKIZA(MELDUA,MELPRI,IMATEL,
  658. $ KRINCD,KRINCP,KMINCT,KRSPGT,
  659. $ PMTOT,
  660. $ IZATOT,
  661. $ IMPR,IRET)
  662. * Gestion du CTRL-C
  663. if (ierr.NE.0) return
  664. IF (IRET.NE.0) GOTO 9999
  665. *
  666. * Cas particulier : celui des matrices CCt
  667. *
  668. ITYMAT=MATELE.IRIGEL(7,IMATE)
  669. * IF (ITYMAT.EQ.4.OR.ITYMAT.EQ.-4) THEN
  670. IF (ITYMAT.EQ.4) THEN
  671. CALL MKIZAT(MELDUA,MELPRI,IMATEL,
  672. $ KRINCD,KRINCP,KMINCT,KRSPGT,
  673. $ PMTOT,
  674. $ IZATOT,
  675. $ IMPR,IRET)
  676. IF (IRET.NE.0) GOTO 9999
  677. ENDIF
  678. SEGSUP KRINCD
  679. SEGSUP KRINCP
  680. * CALL PRMSTA(' Assemblage mat. élémentaire',MSMAT,IMPR)
  681. 77 CONTINUE
  682. SEGSUP KRSPGT
  683. *STAT CALL PRMSTA(' Assemblage mat. élém. total',MSTAT,IMPR)
  684. *
  685. * Renumérotation
  686. *
  687. IF (IMPR.GT.3) THEN
  688. CALL PROFI2(PMTOT,IPROFI,IMPR,IRET)
  689. IF (IRET.NE.0) GOTO 9999
  690. WRITE(IOIMP,*) 'Profil (tri. inf.) = ',IPROFI
  691. ENDIF
  692. *
  693. IF (LTIME) THEN
  694. call timespv(ittime,oothrd)
  695. ITI2=(ITTIME(1)+ITTIME(2))/10
  696. ENDIF
  697. IF (IMULAG.EQ.1) THEN
  698. CALL RENUME(PMTOT,IRENU,
  699. $ NEWNUM,
  700. $ IMPR,IRET)
  701. IF (IRET.NE.0) GOTO 9999
  702. ELSEIF (IMULAG.EQ.2) THEN
  703. CALL CALNU6(KMINCT,PMTOT,IZATOT,
  704. $ IRENU,
  705. $ KTYPI,IORINC,MLAG1,MLAG2,
  706. $ IPBLOC,
  707. $ NEWNUM,
  708. $ IMPR,IRET)
  709. IF (IRET.NE.0) GOTO 9999
  710. ELSE
  711. WRITE(IOIMP,*) 'Erreur dans la programmation'
  712. WRITE(IOIMP,*) 'IMULAG=',IMULAG
  713. ENDIF
  714. * Gestion du CTRL-C
  715. if (ierr.NE.0) return
  716. IF (LTIME) THEN
  717. call timespv(ittime,oothrd)
  718. ITI3=(ITTIME(1)+ITTIME(2))/10
  719. ENDIF
  720. *STAT CALL PRMSTA(' Calcul de la renumérotation',MSTAT,IMPR)
  721. * Permutation de la matrice
  722. SEGACT PMTOT
  723. SEGACT IZATOT
  724. NTT=PMTOT.IA(/1)-1
  725. NJA=PMTOT.JA(/1)
  726. SEGINI PMTO2
  727. NBVA=IZATOT.A(/1)
  728. SEGINI IZATO2
  729. SEGACT NEWNUM
  730. JOB=1
  731. CALL DPERM(PMTOT.IA(/1)-1,IZATOT.A,PMTOT.JA,PMTOT.IA,
  732. $ IZATO2.A,PMTO2.JA,PMTO2.IA,NEWNUM.LECT,NEWNUM.LECT,
  733. $ JOB)
  734. SEGSUP PMTOT
  735. SEGSUP IZATOT
  736. PMTOT=PMTO2
  737. IZATOT=IZATO2
  738. *STAT CALL PRMSTA(' Permutation de la matrice',MSTAT,IMPR)
  739. * Ordonnancement des colonnes
  740. SEGACT PMTOT*MOD
  741. SEGACT IZATOT*MOD
  742. JG=MAX(PMTOT.IA(/1),2*PMTOT.JA(/1))
  743. SEGINI IWORK
  744. CALL CSORT(PMTOT.IA(/1)-1,IZATOT.A,PMTOT.JA,PMTOT.IA,
  745. $ IWORK.LECT,.TRUE.)
  746. SEGSUP IWORK
  747. *STAT CALL PRMSTA(' Ordonnancement des colonnes',MSTAT,IMPR)
  748. * Sauvegarde de la renumérotation
  749. NTT=0
  750. NPT=NTTDDL
  751. NBLK=0
  752. SEGINI,IDMTOT
  753. DO 8 ITTDDL=1,NTTDDL
  754. IDMTOT.NUAN(ITTDDL)=NEWNUM.LECT(ITTDDL)
  755. 8 CONTINUE
  756. DO 9 ITTDDL=1,NTTDDL
  757. IDMTOT.NUNA(NEWNUM.LECT(ITTDDL))=ITTDDL
  758. 9 CONTINUE
  759. SEGSUP NEWNUM
  760. * Suppression des supports de points primaux et duaux
  761. SEGSUP,GPMLPD.LISMEL(*)
  762. SEGSUP,GPMLPP.LISMEL(*)
  763. SEGSUP GPMLPD
  764. SEGSUP GPMLPP
  765. *
  766. * Affichage des infos sur la Matrice Morse
  767. *
  768. IF (IMPR.GT.3) THEN
  769. CALL PROFI2(PMTOT,IPROFI,IMPR,IRET)
  770. IF (IRET.NE.0) GOTO 9999
  771. WRITE(IOIMP,*) 'Profil (tri. inf.) = ',IPROFI
  772. ENDIF
  773. *
  774. * Remplissage du chapeau
  775. *
  776. CALL ISMSYM(MATELE,
  777. $ LSYM,
  778. $ IMPR,IRET)
  779. IF (IRET.NE.0) GOTO 9999
  780. SEGACT MATELE*MOD
  781. IF (LSYM) THEN
  782. MATELE.KSYM=0
  783. ELSE
  784. MATELE.KSYM=2
  785. ENDIF
  786. MATELE.KMINC=KMINCT
  787. MATELE.KMINCP=KMINCT
  788. MATELE.KMINCD=KMINCT
  789. * MATELE.KIZM =MCONEC
  790. MATELE.KISPGT=KJSPGT
  791. MATELE.KISPGP=KJSPGT
  792. MATELE.KISPGD=KJSPGT
  793. SEGACT KMINCT
  794. NTTDDL=KMINCT.NPOS(NTOTPO+1)-1
  795. MATELE.KNTTT=NTTDDL
  796. MATELE.KNTTP=NTTDDL
  797. MATELE.KNTTD=NTTDDL
  798. MATELE.KIDMAT(1)=IDMTOT
  799. MATELE.KIDMAT(2)=IDMTOT
  800. MATELE.KIDMAT(4)=PMTOT
  801. MATELE.KIDMAT(5)=IZATOT
  802. IF (LTIME) THEN
  803. call timespv(ittime,oothrd)
  804. ITI4=(ITTIME(1)+ITTIME(2))/10
  805. ITN=ITI3-ITI2
  806. ITR=(ITI4-ITI1)-ITN
  807. CHARI='RENUMERO'
  808. CALL ECCTAB(KTIME,'MOT ',IVALI,XVALI,CHARI,LOGII,IRETI,
  809. $ 'ENTIER ',ITN,XVALR,CHARR,LOGIR,IRETR)
  810. CHARI='ASSEMBLA'
  811. CALL ECCTAB(KTIME,'MOT ',IVALI,XVALI,CHARI,LOGII,IRETI,
  812. $ 'ENTIER ',ITR,XVALR,CHARR,LOGIR,IRETR)
  813. ENDIF
  814. *STAT CALL PRMSTA(' Fin de l''assemblage',MSTAT,IMPR)
  815. *STAT CALL PRMSTA('Total de l''assemblage',MSTOT,IMPR)
  816. *
  817. * Normal termination
  818. *
  819. 9998 CONTINUE
  820. IRET=0
  821. RETURN
  822. *
  823. * Format handling
  824. *
  825. *
  826. * Error handling
  827. *
  828. 9999 CONTINUE
  829. IRET=1
  830. WRITE(IOIMP,*) 'An error was detected in subroutine prase3'
  831. RETURN
  832. *
  833. * End of subroutine PRASE3
  834. *
  835. END
  836.  
  837.  

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