Télécharger kres24.eso

Retour à la liste

Numérotation des lignes :

kres24
  1. C KRES24 SOURCE GOUNAND 25/04/30 21:15:13 12258
  2. SUBROUTINE KRES24(KMINCT,KMORS,NNUTOT,MLAG1,MLAG2,
  3. $ IPERM)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. IMPLICIT INTEGER (I-N)
  6. C***********************************************************************
  7. C NOM : KRES24
  8. C DESCRIPTION : - Placer correctement les multiplicateurs de
  9. C Lagrange dans le MATRIK
  10. C
  11. C Ce source est une adaptation de KRES14
  12. C
  13. C LANGAGE : ESOPE
  14. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
  15. C mél : gounand@semt2.smts.cea.fr
  16. C***********************************************************************
  17. C VERSION : v1, 22/04/2025, version initiale
  18. C HISTORIQUE : v1, 22/04/2025, création
  19. C HISTORIQUE :
  20. C HISTORIQUE :
  21. C***********************************************************************
  22.  
  23. -INC PPARAM
  24. -INC CCOPTIO
  25. -INC CCREEL
  26. POINTEUR KMINCT.MINC
  27. POINTEUR KMORS.PMORS
  28.  
  29. -INC SMLENTI
  30. POINTEUR KTYP.MLENTI
  31. POINTEUR KRINC.MLENTI
  32. POINTEUR IWORK.MLENTI
  33. POINTEUR LAGRAN.MLENTI
  34. POINTEUR JORDRE.MLENTI,JORTMP.MLENTI
  35. POINTEUR IPERM.MLENTI,JPETMP.MLENTI
  36. POINTEUR JPERM.MLENTI,NNUTOT.MLENTI
  37. -INC SMLMOTS
  38. POINTEUR IORINC.MLMOTS
  39. POINTEUR IORINU.MLMOTS
  40. POINTEUR MLAG1.MLMOTS,MLAG2.MLMOTS
  41. -INC SMTABLE
  42. POINTEUR KTIME.MTABLE
  43. DIMENSION ITTIME(4)
  44. CHARACTER*(LOCHPO) CHCOMP
  45. CHARACTER*16 CHARI
  46. CHARACTER*1 CCOMP
  47. LOGICAL LTIME,LDBNUM,LVERIF
  48. REAL*8 GNRM2
  49. C
  50. C Executable statements
  51. C
  52. LDBNUM=.FALSE.
  53. LVERIF=.FALSE.
  54. * Pour un non multigrille, il faut quand même placer les
  55. * multiplicateurs correctement avant et après les inconnues
  56. * KTYP=-1 multiplicateurs avant
  57. * KTYP=0 inconnues normales
  58. * KTYP=+1 multiplicateurs apres
  59. * IL faut distinguer les 'LX' qui ont deja ete renumerotes et les
  60. * LXP, MXP
  61. SEGACT KMINCT
  62. NCOMP=KMINCT.LISINC(/2)
  63. NNOE=KMINCT.MPOS(/1)
  64. INC=KMINCT.NPOS(NNOE+1)-1
  65. JG=INC
  66. SEGINI KTYP
  67. * SEGPRT,KMINCT
  68. NBLAG=0
  69. NBNLA=0
  70. if (mlag1.ne.0) segact mlag1
  71. if (mlag2.ne.0) segact mlag2
  72. *
  73. DO ICOMP=1,NCOMP
  74. CHCOMP=KMINCT.LISINC(ICOMP)
  75. JTYP=0
  76. IF (CHCOMP(1:8).EQ.'LX ') THEN
  77. * Avec les MATRIK, on ne gère que les simples multiplicateurs
  78. JTYP=2
  79. ELSE
  80. if (mlag1.ne.0) then
  81. CALL PLACE(mlag1.mots,mlag1.mots(/2),imot,chcomp)
  82. if (imot.ne.0) then
  83. JTYP=1
  84. GOTO 33
  85. endif
  86. else
  87. IF (CHCOMP(1:2).EQ.'LX') THEN
  88. JTYP=1
  89. GOTO 33
  90. endif
  91. endif
  92. if (mlag2.ne.0) then
  93. CALL PLACE(mlag2.mots,mlag2.mots(/2),imot,chcomp)
  94. if (imot.ne.0) then
  95. JTYP=-1
  96. GOTO 33
  97. endif
  98. else
  99. IF (CHCOMP(1:2).EQ.'MX') THEN
  100. JTYP=-1
  101. GOTO 33
  102. endif
  103. endif
  104. ENDIF
  105. 33 CONTINUE
  106. DO INOE=1,NNOE
  107. IPOS=KMINCT.MPOS(INOE,ICOMP)
  108. IF (IPOS.NE.0) THEN
  109. JPOS=KMINCT.NPOS(INOE)+IPOS-1
  110. KTYP.LECT(JPOS)=JTYP
  111. IF (JTYP.NE.0) THEN
  112. NBLAG=NBLAG+1
  113. ELSE
  114. NBNLA=NBNLA+1
  115. ENDIF
  116. ENDIF
  117. ENDDO
  118. ENDDO
  119. *
  120. if (ldbnum) write(ioimp,*) 'avant tri ktyp=-3'
  121. if (ldbnum) segprt,ktyp
  122. *
  123. IF (NBLAG.EQ.0) THEN
  124. IPERM=NNUTOT
  125. RETURN
  126. ENDIF
  127. NBDDL=NBLAG+NBNLA
  128. JG=NBLAG
  129. SEGINI LAGRAN
  130. ILAG=0
  131. DO IDDL=1,NBDDL
  132. ITYP=KTYP.LECT(IDDL)
  133. IF (ITYP.NE.0) THEN
  134. ILAG=ILAG+1
  135. LAGRAN.LECT(ILAG)=IDDL
  136. ENDIF
  137. ENDDO
  138. if (ldbnum) write(ioimp,*) 'apres tri ktyp=-3'
  139. if (ldbnum) SEGPRT,KTYP
  140. IF (NBLAG.NE.ILAG) GOTO 9999
  141. *
  142. * Placement des multiplicateurs inspiré de NUMOP2
  143. *
  144. segact nnutot
  145. JG=NBDDL
  146. SEGINI,JPERM
  147. DO I=1,NBDDL
  148. JPERM.LECT(NNUTOT.LECT(I))=I
  149. ENDDO
  150. * SEGINI,JPERM=NNUTOT
  151. * Il y a cinq types différents de -2 à 2 : il faut pouvoir placer
  152. * les multiplicateurs de lagrange entre les autres noeuds
  153. NTYP=5
  154. JG=NBDDL
  155. SEGINI JORDRE
  156. DO I=1,NBDDL
  157. JORDRE.LECT(I)=I*NTYP
  158. ENDDO
  159. JORMAX= (NBDDL+1)*NTYP
  160.  
  161. if (ldbnum) write(ioimp,*) 'Avant mise a la bonne place'
  162. if (ldbnum) segprt,jordre
  163. * mise a la bonne place des multiplicateurs de Lagrange
  164. SEGACT KMORS
  165. NTT=KMORS.IA(/1)-1
  166. IF (NTT.NE.NBDDL) THEN
  167. write(ioimp,*) 'Pas egaux NTT,NBDDL=',NTT,NBDDL
  168. GOTO 9999
  169. ENDIF
  170. do 700 J=1,NBLAG
  171. IDDL=LAGRAN.LECT(J)
  172. ITYP=KTYP.LECT(IDDL)
  173. ICOLD=KMORS.IA(IDDL)
  174. ICOLF=KMORS.IA(IDDL+1)-1
  175. iddln=nnutot.lect(iddl)
  176. * if (ldbnum)write(ioimp,*) 'iddl,ityp,iddln=',iddl,ityp,iddln
  177. * write (6,*) 'kres24 ',(kmors.JA(icol),icol=icold,icolf)
  178. ipaur=-igrand
  179. ipaus=igrand
  180. do 800 ICOL=ICOLD,ICOLF
  181. JDDL=KMORS.JA(ICOL)
  182. JTYP=KTYP.LECT(JDDL)
  183. IF (ABS(ITYP).NE.ABS(JTYP)) THEN
  184. JDDLN=NNUTOT.LECT(JDDL)
  185. * write(ioimp,*) ' jddl,jtyp,jddln=',jddl,jtyp,jddln
  186. * deplacer les noeuds en relation en fin de zone
  187. jordre.lect(jddln)=-abs(jordre.lect(jddln))
  188. ipaur=max(ipaur,jordre.lect(jddln))
  189. ipaus=min(ipaus,jordre.lect(jddln))
  190. else
  191. * write(ioimp,*) ' jddl,jtyp=',jddl,jtyp
  192. endif
  193. 800 continue
  194. *
  195. * On va laisser comme ça
  196. * Ce cas peut arriver après élimination
  197. * Cela devrait revenir à placer les multiplicateurs en fin ou début
  198. * de matrice
  199. if (ipaur.eq.-igrand.or.ipaus.eq.igrand) then
  200. * Write(ioimp,*) 'mulag sans relations pas ok'
  201. * goto 9999
  202. ipaur=0
  203. ipaus=-jormax
  204. endif
  205. if (ldbnum) write(ioimp,*) 'iddl,ipaur,ipaus=',iddl,ipaur
  206. $ ,ipaus
  207. *
  208. * le premier mult avant le premier noeud
  209. IF (ITYP.EQ.-2) THEN
  210. JORDRE.LECT(IDDLN)=ipaur+2
  211. ELSEIF (ITYP.EQ.-1) THEN
  212. JORDRE.LECT(IDDLN)=ipaur+1
  213. *
  214. * le deuxieme mult apres le dernier noeud
  215. ELSEIF (ITYP.EQ.1) THEN
  216. JORDRE.LECT(IDDLN)= ipaus-1
  217. ELSEIF (ITYP.EQ.2) THEN
  218. JORDRE.LECT(IDDLN)= ipaus-2
  219. ELSEIF (ITYP.NE.0) THEN
  220. write(ioimp,*) 'ityp=',ityp,' non prevu'
  221. goto 9999
  222. ENDIF
  223. *
  224. 700 continue
  225. * WRITE(IOIMP,*) 'Avant chgt signe'
  226. * segprt,jordre
  227. DO I=1,NBDDL
  228. JORDRE.LECT(I)=-JORDRE.LECT(I)
  229. ENDDO
  230. * Avant tri
  231. if (ldbnum) WRITE(IOIMP,*) 'Avant TRIFUS'
  232. if (ldbnum) SEGPRT,JPERM
  233. if (ldbnum) SEGPRT,JORDRE
  234. JG=NBDDL
  235. SEGINI JORTMP
  236. SEGINI JPETMP
  237. * ok maintenant on trie
  238. CALL TRIFUS(NBDDL,JORDRE.LECT,JPERM.LECT,JORTMP.LECT
  239. $ ,JPETMP.LECT)
  240. SEGSUP JPETMP
  241. SEGSUP JORTMP
  242. * Apres tri
  243. if (ldbnum) WRITE(IOIMP,*) 'Apres TRIFUS'
  244. if (ldbnum) SEGPRT,JPERM
  245. if (ldbnum) SEGPRT,JORDRE
  246. * permutation inverse
  247. JG=NBDDL
  248. SEGINI IPERM
  249. DO I=1,NBDDL
  250. IPERM.LECT(JPERM.LECT(I))=I
  251. ENDDO
  252. * Verification que dans la nouvelle numerotation les multiplicateurs
  253. * sont correctement places...
  254. IF (LVERIF) THEN
  255. write(ioimp,*) 'VERIF KRES24'
  256. do 1700 J=1,NBLAG
  257. IDDL=LAGRAN.LECT(J)
  258. ITYP=KTYP.LECT(IDDL)
  259. ICOLD=KMORS.IA(IDDL)
  260. ICOLF=KMORS.IA(IDDL+1)-1
  261. iddln=iperm.lect(iddl)
  262. ipaur=-igrand
  263. ipaus=igrand
  264. do 1800 ICOL=ICOLD,ICOLF
  265. JDDL=KMORS.JA(ICOL)
  266. JTYP=KTYP.LECT(JDDL)
  267. IF (ABS(ITYP).NE.ABS(JTYP)) THEN
  268. JDDLN=IPERM.LECT(JDDL)
  269. ipaur=max(ipaur,jddln)
  270. ipaus=min(ipaus,jddln)
  271. endif
  272. 1800 continue
  273. if (ldbnum) write(ioimp,*) 'iddl,ipaur,ipaus=',iddl,ipaur
  274. $ ,ipaus
  275. if (ipaur.eq.-igrand.or.ipaus.eq.igrand) then
  276. goto 1700
  277. * Write(ioimp,*) 'mulag sans relations pas ok'
  278. * goto 9999
  279. endif
  280. if (ityp.lt.0) THEN
  281. if (ipaus.le.iddln) then
  282. write(ioimp,*) 'Erreur numerotation'
  283. write(ioimp,*) 'iddl,iddln,ipaus=',iddl,iddln,ipaus
  284. goto 9999
  285. endif
  286. elseif (ityp.gt.0) THEN
  287. if (ipaur.ge.iddln) then
  288. write(ioimp,*) 'Erreur numerotation'
  289. write(ioimp,*) 'iddl,iddln,ipaur=',iddl,iddln,ipaur
  290. goto 9999
  291. endif
  292. else
  293. write(ioimp,*) 'ityp=0 pas normal pour un lagrange'
  294. goto 9999
  295. endif
  296. 1700 continue
  297. ENDIF
  298. *
  299. * Menage
  300. *
  301. SEGSUP JORDRE
  302. SEGSUP LAGRAN
  303. SEGSUP KTYP
  304. SEGSUP,JPERM
  305. * iperm=jperm
  306. write(ioimp,*) 'FIN KRES24'
  307. if (ldbnum) segprt,nnutot
  308. if (ldbnum) segprt,iperm
  309. C
  310. C Normal termination
  311. C
  312. RETURN
  313. C
  314. C Error Handling
  315. C
  316. 9999 CONTINUE
  317. MOTERR(1:8)='KRES24 '
  318. CALL ERREUR(1127)
  319. RETURN
  320. C
  321. C Format handling
  322. C
  323. 2022 FORMAT(10(1X,1PG12.5))
  324. C
  325. C End of subroutine KRES24
  326. C
  327. END
  328.  
  329.  

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