Télécharger rlexfi.eso

Retour à la liste

Numérotation des lignes :

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

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