Télécharger rlexfi.eso

Retour à la liste

Numérotation des lignes :

rlexfi
  1. C RLEXFI SOURCE OF166741 24/12/13 21:17:32 12097
  2. SUBROUTINE RLEXFI(MLESCF,MATCOE,MLEFSC,MACOE1,MLEFC,MACOE2)
  3. C************************************************************************
  4. C
  5. C PROJET : CASTEM 2000
  6. C
  7. C NOM : RLEXFI
  8. C
  9. C DESCRIPTION : Appelle par GRADIA
  10. C
  11. C LANGAGE : FORTRAN 77 + ESOPE 2000 (avec extensions CISI)
  12. C
  13. C AUTEUR : A. BECCANTINI
  14. C
  15. C************************************************************************
  16. C
  17. C Inputs:
  18. C
  19. C MLESCF : list of SOMMET points and their CENTRE neighbors
  20. C
  21. C MATCOE : coeff. for linear exact reconstruction of MLESCF
  22. C
  23. C MLEFSC : list of FACES points and their neighbors (CENTRE and SOMMET
  24. C points)
  25. C
  26. C MACOE1 : coeff. for linear exact reconstruction of MLEFSC
  27. C
  28. C Output
  29. C
  30. C MLEFC : list of FACES points and their neighbors (CENTRE points only)
  31. C
  32. C MACOE2 : coeff. for linear exact reconstruction of MLEFC
  33. C
  34. IMPLICIT INTEGER(I-N)
  35.  
  36. -INC PPARAM
  37. -INC CCOPTIO
  38. -INC SMCOORD
  39. INTEGER JG
  40. -INC SMLENTI
  41. POINTEUR MLECEN.MLENTI, MLESOM.MLENTI, MCLEAR.MLENTI
  42. -INC SMLREEL
  43. POINTEUR MLRCOE.MLREEL
  44. C
  45. INTEGER NBL, NBTPOI
  46. SEGMENT MLELEM
  47. INTEGER INDEX(NBL+1)
  48. INTEGER LESPOI(NBTPOI)
  49. ENDSEGMENT
  50. POINTEUR MLESCF.MLELEM,MLEFSC.MLELEM, MLEFC.MLELEM
  51. C
  52. INTEGER N1,N2
  53. SEGMENT MATRIX
  54. REAL*8 MAT(N1,N2)
  55. ENDSEGMENT
  56. POINTEUR MATCOE.MATRIX, MACOE1.MATRIX, MACOE2.MATRIX
  57. C
  58. INTEGER NSOM, IPOS, IPOS1, NMAXVS, IELEM, NFAC, NGS, NMAXVF, I1
  59. & , NGF, IPOSF, NVOIF, NCEN, NGP, NLS, IPOSP, IPOSP1
  60. & , NVOI, I2 , IPOSV, NGC, NLC
  61. REAL*8 ERRO, VAL
  62. C
  63. C**** MLESCF = MLELEM sommet-centres voisins
  64. C NMAXVS = nombre max de voisins aux sommets
  65. C
  66. SEGACT MLESCF
  67. NSOM=MLESCF.INDEX(/1)-1
  68. IPOS1=MLESCF.INDEX(1)
  69. C
  70. C**** N.B. Le sommet n'a pas de voisins si il
  71. C appartient aux CL
  72. C
  73. NMAXVS=1
  74. DO IELEM = 1, NSOM, 1
  75. IPOS=IPOS1
  76. IPOS1=MLESCF.INDEX(1+IELEM)
  77. NMAXVS=MAX(NMAXVS,(IPOS1-IPOS-1))
  78. ENDDO
  79. C
  80. C**** MLEFSC = MLELEM face (sommets-centres) voisins
  81. C NMAXVF = nombre max de voisins sommets aux faces
  82. C (N.B: dedans MLEFSC, un/deux points sont des points centres)
  83. C
  84. SEGACT MLEFSC
  85. NFAC=MLEFSC.INDEX(/1)-1
  86. IPOS1=MLEFSC.INDEX(1)
  87. NMAXVF=0
  88. DO IELEM = 1, NSOM, 1
  89. IPOS=IPOS1
  90. IPOS1=MLEFSC.INDEX(1+IELEM)
  91. NMAXVF=MAX(NMAXVF,(IPOS1-IPOS-1))
  92. ENDDO
  93. C
  94. NBL=NFAC
  95. NBTPOI=NFAC*(NMAXVS*NMAXVF)+NFAC
  96. C
  97. C**** NBTPOI iper sur-dimensionné
  98. C
  99. SEGINI MLEFC
  100. N1=IDIM
  101. N2=NBTPOI
  102. SEGINI MACOE2
  103. C
  104. C
  105. C**** MLECEN.MLENTI = position du centre NGC dedans un elt
  106. C face -centres
  107. C
  108. C MCLEAR = liste des points centres (pour nettoyer MLECEN)
  109. C
  110. C
  111. C MLESOM = position du sommet dedans MLESCF
  112. C
  113. JG=nbpts
  114. SEGINI MLECEN
  115. SEGINI MLESOM
  116. C
  117. DO IELEM=1,NSOM,1
  118. IPOS=MLESCF.INDEX(IELEM)
  119. NGS=MLESCF.LESPOI(IPOS)
  120. MLESOM.LECT(NGS)=IELEM
  121. ENDDO
  122. C
  123. JG=NMAXVS*NMAXVF
  124. SEGINI MCLEAR
  125. C
  126. C**** On crée MLRCOE:
  127. C
  128. C IPOS = MLESCF.INDEX(NLS)
  129. C IPOS1 = MLESCF.INDEX(NLS+1)
  130. C NGS = MLESCF.LESPOI(IPOS)
  131. C
  132. C
  133. C**** N.B. If MATCOE is expressed in the absolute frame
  134. C
  135. C VAL_NGS = \sum_{J=IPOS+1,IPOS1-1) (MATCOE.MAT(1,J) +
  136. C MATCOE.MAT(2,J) * X_NGS + MATCOE.MAT(3,J) * YNGS)
  137. C * VAL_J
  138. C
  139. C MLRCOE.PROG(J) = (MATCOE.MAT(1,J) +
  140. C MATCOE.MAT(2,J) * X_NGS + MATCOE.MAT(3,J) * YNGS)
  141. C
  142. C If MATCOE is expressed in the relative frame
  143. C
  144. C MLRCOE.PROG(J) = MATCOE.MAT(1,J)
  145. C
  146. SEGACT MATCOE
  147. N2=MATCOE.MAT(/2)
  148. NBTPOI=MLESCF.LESPOI(/1)
  149. IF(N2 .NE. NBTPOI)THEN
  150. WRITE(IOIMP,*) 'Subroutine rlexfi.eso'
  151. CALL ERREUR(5)
  152. GOTO 9999
  153. ENDIF
  154. C
  155. JG=N2
  156. SEGINI MLRCOE
  157. IPOS1=MLESCF.INDEX(1)
  158. DO IELEM=1,NSOM,1
  159. IPOS=IPOS1
  160. IPOS1=MLESCF.INDEX(1+IELEM)
  161. NGS=MLESCF.LESPOI(IPOS)
  162. MLRCOE.PROG(IPOS)=MATCOE.MAT(1,IPOS)
  163. C
  164. C******* N.B. IPOS+1 peut etre plus grand que IPOS1-1
  165. C En ce cas, pas de boucle
  166. C
  167. DO I1 = (IPOS+1),(IPOS1-1),1
  168. MLRCOE.PROG(I1)=MATCOE.MAT(1,I1)
  169. ENDDO
  170. ENDDO
  171. C
  172. C**** On detrui MATCOE
  173. C On rempli MACOE2.MAT
  174. C MLEFC.MELEME : face - (voisins de type centre
  175. C + sommets appartenant
  176. C aux c.l.)
  177. C
  178. SEGSUP MATCOE
  179. SEGACT MACOE1
  180. C
  181. IPOS1=MLEFSC.INDEX(1)
  182. IPOSF=1
  183. MLEFC.INDEX(1)=IPOSF
  184. DO IELEM=1,NFAC,1
  185. IPOS=IPOS1
  186. IPOS1=MLEFSC.INDEX(1+IELEM)
  187. NGF=MLEFSC.LESPOI(IPOS)
  188. IPOSF=MLEFC.INDEX(IELEM)
  189. MLEFC.LESPOI(IPOSF)=NGF
  190. C
  191. C******* NGF a de voisins en MLEFSC.MLELEM:
  192. C a) de type centre (un ou deux)
  193. C b) de type sommet
  194. C
  195. NVOIF=0
  196. NCEN=0
  197. C
  198. C******* NVOIF = nombre de voisins de NGF dedans
  199. C MLEFC.MLELEM
  200. C NCEN = nombre de voisins de type CENTRE de NGF dedans
  201. C MLEFC.MLELEM
  202. C
  203. C
  204. C******* Boucle sur le voisins de NGF en MLEFSC.MLELEM
  205. C
  206. DO I1=(IPOS+1),(IPOS1-1),1
  207. NGP=MLEFSC.LESPOI(I1)
  208. NLS=MLESOM.LECT(NGP)
  209. C
  210. C********** Deux possibilité:
  211. C NLS > 0 -> NGP est un point sommet
  212. C Dans ce cas NLS=position de NGP
  213. C dedans MLESCF.MLELEM
  214. C NLS = 0 -> NGP est un point centre
  215. C
  216. IF(NLS.GT.0)THEN
  217. IPOSP=MLESCF.INDEX(NLS)
  218. IPOSP1=MLESCF.INDEX(NLS+1)
  219. NVOI=IPOSP1-IPOSP-1
  220. IF(NVOI.EQ.0)THEN
  221. C
  222. C**************** Le point sommet NGP n'a pas de voisins
  223. C Donc il appartient aux c.l.
  224. C
  225. C Sa position dedans MLEFSC est I1
  226. C Sa position dedans MLESCF est IPOSP
  227. C
  228. ERRO=ABS(MLRCOE.PROG(IPOSP) - 1.0D0)
  229. IF(ERRO .GT. 1.0D-6)THEN
  230. WRITE(IOIMP,*) 'Subroutine rlexfi.eso'
  231. CALL ERREUR(5)
  232. GOTO 9999
  233. ENDIF
  234. NVOIF=NVOIF+1
  235. IPOSV=IPOSF+NVOIF
  236. MLEFC.LESPOI(IPOSV)=NGP
  237. MACOE2.MAT(1,IPOSV)=MACOE1.MAT(2,I1)
  238. MACOE2.MAT(2,IPOSV)=MACOE1.MAT(3,I1)
  239. IF(IDIM.EQ.3) MACOE2.MAT(3,IPOSV)=
  240. & MACOE1.MAT(4,I1)
  241. ELSEIF(NVOI.GT.0)THEN
  242. C
  243. C**************** Boucle sur les voisins du point sommet NGP
  244. C dedans MLESCF.MLELEM
  245. C
  246. DO I2 = (IPOSP+1),(IPOSP1-1),1
  247. VAL=MLRCOE.PROG(I2)
  248. NGC=MLESCF.LESPOI(I2)
  249. NLC=MLECEN.LECT(NGC)
  250. C
  251. C******************* NLC = position de NGC dans la structure
  252. C NGF - se voisins en MLEFC.MLELEM
  253. C
  254. IF(NLC .EQ. 0)THEN
  255. C
  256. C********************** Nouveau voisin centre
  257. C
  258. NVOIF=NVOIF+1
  259. NCEN=NCEN+1
  260. MCLEAR.LECT(NCEN)=NGC
  261. MLECEN.LECT(NGC)=NVOIF
  262. IPOSV=IPOSF+NVOIF
  263. MLEFC.LESPOI(IPOSV)=NGC
  264. ELSE
  265. IPOSV=IPOSF+NLC
  266. ENDIF
  267. C
  268. C******************* I1 est la position du point sommet NGP dedans
  269. C MLEFSC.MLELEM, i.e.
  270. C MLEFSC.LESPOI(I1)=NGP
  271. C
  272. MACOE2.MAT(1,IPOSV)=MACOE2.MAT(1,IPOSV)+
  273. & (MACOE1.MAT(2,I1)*VAL)
  274. MACOE2.MAT(2,IPOSV)=MACOE2.MAT(2,IPOSV)+
  275. & (MACOE1.MAT(3,I1)*VAL)
  276. IF(IDIM.EQ.3) MACOE2.MAT(3,IPOSV)=
  277. & MACOE2.MAT(3,IPOSV)+
  278. & (MACOE1.MAT(4,I1)*VAL)
  279. ENDDO
  280. ELSEIF(NVOI.LT.0)THEN
  281. WRITE(IOIMP,*) 'Subroutine rlexfi.eso'
  282. CALL ERREUR(5)
  283. GOTO 9999
  284. ENDIF
  285. C
  286. ELSEIF(NLS.EQ.0)THEN
  287. C
  288. C************* NGP est un point centre
  289. C I1 = position de NGP dedans MLEFSC
  290. C i.e. MLEFSC.LESPOI(I1)=NGP
  291. C
  292. NLC=MLECEN.LECT(NGP)
  293. IF(NLC .EQ. 0)THEN
  294. C
  295. C******************* Nouveau point centre
  296. C
  297. NVOIF=NVOIF+1
  298. NCEN=NCEN+1
  299. MCLEAR.LECT(NCEN)=NGP
  300. MLECEN.LECT(NGP)=NVOIF
  301. IPOSV=IPOSF+NVOIF
  302. MLEFC.LESPOI(IPOSV)=NGP
  303. ELSE
  304. IPOSV=IPOSF+NLC
  305. ENDIF
  306. MACOE2.MAT(1,IPOSV)=MACOE2.MAT(1,IPOSV)+
  307. & MACOE1.MAT(2,I1)
  308. MACOE2.MAT(2,IPOSV)=MACOE2.MAT(2,IPOSV)+
  309. & MACOE1.MAT(3,I1)
  310. IF(IDIM.EQ.3) MACOE2.MAT(3,IPOSV)=
  311. & MACOE2.MAT(3,IPOSV)+
  312. & MACOE1.MAT(4,I1)
  313. ELSEIF(NLS.LT.0)THEN
  314. WRITE(IOIMP,*) 'Subroutine rlexfi.eso'
  315. CALL ERREUR(5)
  316. GOTO 9999
  317. ENDIF
  318. C
  319. C******* Fin boucle sur le voisins de NGF en MLEFSC.MLELEM
  320. C
  321. ENDDO
  322. C
  323. MLEFC.INDEX(IELEM+1)=IPOSF+NVOIF+1
  324. C
  325. C******* Nettoyage de MCLEAR et MLECEN
  326. C
  327. DO I1 = 1, NCEN , 1
  328. NGC=MCLEAR.LECT(I1)
  329. MLECEN.LECT(NGC)=0
  330. MCLEAR.LECT(I1)=0
  331. ENDDO
  332. C
  333. ENDDO
  334. NBTPOI=MLEFC.INDEX(NFAC+1)-1
  335. N2 = NBTPOI
  336. C
  337. SEGADJ MLEFC
  338. SEGADJ MACOE2
  339. SEGDES MLEFC
  340. SEGDES MACOE2
  341. C
  342. C**** On detrui tous les objet qui ne servent plus
  343. C
  344. SEGSUP MLEFSC
  345. SEGSUP MLESCF
  346. SEGSUP MATCOE
  347. SEGSUP MLRCOE
  348. SEGSUP MLESOM
  349. SEGSUP MLECEN
  350. SEGSUP MCLEAR
  351. C
  352. 9999 RETURN
  353. END
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  

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