Télécharger kres24.eso

Retour à la liste

Numérotation des lignes :

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

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