Télécharger rlevb1.eso

Retour à la liste

Numérotation des lignes :

rlevb1
  1. C RLEVB1 SOURCE OF166741 24/12/13 21:17:27 12097
  2. SUBROUTINE RLEVB1(MELSOM,MELCEN,MLELSC,MLELSB,MLESBC,MLRDIS)
  3. C
  4. IMPLICIT INTEGER(I-N)
  5. INTEGER NCEN,I1,NMAXCE,ICEL,NMAXS,LAST,IPLSB1,IPLSB2
  6. & ,NGS,NLS,NSVOI,IPLSC1,IPLSC2,NGS1,ICEL1,NCVOI,NGC,NLC
  7. & ,I2,IPOS,NLS1,NTOTCV,NGS2,IPCOOR,I3,NCMIS
  8. REAL*8 XS,YS,ZS,DXC,DYC,DZC, DIST2, DIST21
  9. C
  10. -INC SMELEME
  11. INTEGER JG
  12. -INC SMLENTI
  13. -INC SMLREEL
  14.  
  15. -INC PPARAM
  16. -INC CCOPTIO
  17. -INC SMCOORD
  18. C
  19. INTEGER NBL, NBTPOI
  20. SEGMENT MLELEM
  21. INTEGER INDEX(NBL+1)
  22. INTEGER LESPOI(NBTPOI)
  23. ENDSEGMENT
  24. POINTEUR MLELSC.MLELEM, MLELSB.MLELEM, MLESBC.MLELEM
  25. C
  26. POINTEUR MELSOM.MELEME, MELCEN.MELEME
  27. C
  28. POINTEUR MLESOM.MLENTI, MLECEN.MLENTI
  29. & ,MLECVO.MLENTI
  30. POINTEUR MLRDIS.MLREEL
  31. C
  32. C**** Le MELEME SOMMET
  33. C
  34. CALL KRIPAD(MELSOM,MLESOM)
  35. C
  36. C MLESOM: numerotation globale -> locale
  37. C
  38. C**** En KRIPAD
  39. C SEGACT MELSOM
  40. C SEGINI MLESOM
  41. C
  42. C**** Le MELEME CENTRE
  43. C
  44. CALL KRIPAD(MELCEN,MLECEN)
  45. C
  46. C MLECEN: numerotation globale -> locale
  47. C
  48. C**** En KRIPAD
  49. C SEGACT MELCEN
  50. C SEGINI MLECEN
  51. C
  52. NCEN=MELCEN.NUM(/2)
  53. C
  54. NMAXCE=0
  55. SEGACT MLELSC
  56. NBL=MLELSC.INDEX(/1)-1
  57. DO I1 = 1, NBL, 1
  58. ICEL=MLELSC.INDEX(I1+1)-MLELSC.INDEX(I1)-1
  59. NMAXCE=MAX(NMAXCE,ICEL)
  60. ENDDO
  61. C
  62. SEGACT MLELSB
  63. NMAXS=0
  64. NBL=MLELSB.INDEX(/1)-1
  65. DO I1 = 1, NBL, 1
  66. ICEL=MLELSB.INDEX(I1+1)-MLELSB.INDEX(I1)-1
  67. NMAXS=MAX(NMAXS,ICEL)
  68. ENDDO
  69. C
  70. C**** NBL de MLELSB = NBL de MLESBC
  71. C Surestimation des noeuds en MLESBC
  72. C
  73. NBTPOI=(NBL+1)*(NMAXCE*NMAXS)
  74. SEGINI MLESBC
  75. JG=NBTPOI
  76. SEGINI MLRDIS
  77. C
  78. C**** MLRDIS = dedans la structure MLESBC, distance (au carre)
  79. C premier noeud et ses voisins
  80. C
  81. C
  82. C**** MLECVO + LAST = liste chaînée des centres voisins
  83. C d'un sommet au bord
  84. JG=NCEN
  85. SEGINI MLECVO
  86. LAST=-1
  87. C
  88. C**** Soit NGS un sommet sur le bord.
  89. C Je dois créer la liste des centres voisins
  90. C des sommets voisins à NGS
  91. C Cette liste est ordonnée par rapport à la distance
  92. C centre-NGS
  93. C Cette liste ne doit pas contenir la liste des centres
  94. C voisins à NGS
  95. C
  96. C
  97. C NBTPOI = le vrai nombre de point de MLESBC
  98. NBTPOI=0
  99. C
  100. C**** IPLSB1 (IPLSB2) = position de NGS dans la structure MLELSB
  101. C IPOS = position de NGS dans la structure MLESBC
  102. C
  103. IPLSB2=1
  104. IPOS=1
  105. DO I1 = 1, NBL, 1
  106. C
  107. C******* Les sommets voisins de NGS
  108. C
  109. IPLSB1=IPLSB2
  110. IPLSB2=MLELSB.INDEX(I1+1)
  111. NSVOI=IPLSB2-IPLSB1-1
  112. C
  113. C******* Numero global et local du sommets NGS
  114. C
  115. NGS=MLELSB.LESPOI(IPLSB1)
  116. NLS=MLESOM.LECT(NGS)
  117. MLESBC.INDEX(I1)=IPOS
  118. MLESBC.LESPOI(IPOS)=NGS
  119. MLRDIS.PROG(IPOS)=0.0D0
  120. C
  121. C******* On remplie la liste chaînée avec les centres voisins de NGS
  122. C Ces centres ne doivent pas apparaitre dedans MLESBC
  123. C
  124. IPLSC1=MLELSC.INDEX(NLS)
  125. IPLSC2=MLELSC.INDEX(NLS+1)
  126. NGS1=MLELSC.LESPOI(IPLSC1)
  127. IF(NGS1 .NE. NGS)THEN
  128. C
  129. C********** Erreur de programmation
  130. C En effet, par construction, le position de NGS dans la
  131. C structure MLELSC est la meme que dans MELSOM
  132. C
  133. WRITE(IOIMP,*) 'Subroutine rlevb1.eso'
  134. CALL ERREUR(5)
  135. GOTO 9999
  136. ENDIF
  137. NCVOI=IPLSC2-IPLSC1-1
  138. DO I2 = 1, NCVOI, 1
  139. NGC=MLELSC.LESPOI(IPLSC1+I2)
  140. NLC=MLECEN.LECT(NGC)
  141. IF((NLC.EQ.0).OR.(MLECVO.LECT(NLC).NE.0))THEN
  142. C
  143. C********** Erreur de programmation
  144. C
  145. WRITE(IOIMP,*) 'Subroutine rlevb1.eso'
  146. CALL ERREUR(5)
  147. GOTO 9999
  148. ELSE
  149. MLECVO.LECT(NLC)=LAST
  150. LAST=NLC
  151. ENDIF
  152. ENDDO
  153. C
  154. C******* Les centre voisins de sommets voisins
  155. C
  156. NTOTCV=0
  157. C
  158. C******* Boucle sur les sommets voisins
  159. C
  160. DO I2 = 1, NSVOI, 1
  161. NGS1=MLELSB.LESPOI(IPLSB1+I2)
  162. NLS1=MLESOM.LECT(NGS1)
  163. IPLSC1=MLELSC.INDEX(NLS1)
  164. IPLSC2=MLELSC.INDEX(NLS1+1)
  165. NGS2=MLELSC.LESPOI(IPLSC1)
  166. IF(NGS1 .NE. NGS2)THEN
  167. WRITE(IOIMP,*) 'Subroutine rlevb1.eso'
  168. CALL ERREUR(5)
  169. GOTO 9999
  170. ENDIF
  171. NCVOI=IPLSC2-IPLSC1-1
  172. DO I3 = 1, NCVOI, 1
  173. NGC=MLELSC.LESPOI(IPLSC1+I3)
  174. NLC=MLECEN.LECT(NGC)
  175. IF(NLC.EQ.0)THEN
  176. C
  177. C************* Erreur de programmation
  178. C
  179. WRITE(IOIMP,*) 'Subroutine rlevb1.eso'
  180. CALL ERREUR(5)
  181. GOTO 9999
  182. ELSEIF(MLECVO.LECT(NLC).EQ.0)THEN
  183. MLECVO.LECT(NLC)=LAST
  184. LAST=NLC
  185. NTOTCV=NTOTCV+1
  186. ENDIF
  187. ENDDO
  188. ENDDO
  189. C
  190. C******* La structure MLECVO + LAST contient NTOTCV centres voisins
  191. C des sommets sommets voisins à NGS + les centres de NGS
  192. C Il faut le mettre en ordre par raport à la distance
  193. C
  194. IPCOOR=(IDIM+1)*(NGS-1)+1
  195. XS=MCOORD.XCOOR(IPCOOR)
  196. YS=MCOORD.XCOOR(IPCOOR+1)
  197. IF(IDIM.EQ.3) ZS=MCOORD.XCOOR(IPCOOR+2)
  198. NCMIS=0
  199. DO I2 = 1, NTOTCV, 1
  200. NLC=LAST
  201. LAST=MLECVO.LECT(NLC)
  202. MLECVO.LECT(NLC)=0
  203. NGC=MELCEN.NUM(1,NLC)
  204. IPCOOR=(IDIM+1)*(NGC-1)+1
  205. DXC=MCOORD.XCOOR(IPCOOR)-XS
  206. DYC=MCOORD.XCOOR(IPCOOR+1)-YS
  207. DZC=0.0D0
  208. IF(IDIM.EQ.3) DZC=MCOORD.XCOOR(IPCOOR+2)-ZS
  209. DIST2=(DXC*DXC)+(DYC*DYC)+(DZC*DZC)
  210. C
  211. C********** Position avec la methode directe
  212. C
  213. ICEL=1
  214. 10 CONTINUE
  215. IF(ICEL .GT. NCMIS)THEN
  216. NCMIS=NCMIS+1
  217. MLESBC.LESPOI(IPOS+ICEL)=NGC
  218. MLRDIS.PROG(IPOS+ICEL)=DIST2
  219. ELSE
  220. DIST21=MLRDIS.PROG(IPOS+ICEL)
  221. IF(DIST21 .GT. DIST2)THEN
  222. NCMIS=NCMIS+1
  223. ICEL1=IPOS+NCMIS
  224. DO I3 = 0, NCMIS - ICEL - 1
  225. MLESBC.LESPOI(ICEL1-I3)=MLESBC.LESPOI(ICEL1-I3-1)
  226. MLRDIS.PROG(ICEL1-I3)=MLRDIS.PROG(ICEL1-I3-1)
  227. ENDDO
  228. MLESBC.LESPOI(IPOS+ICEL)=NGC
  229. MLRDIS.PROG(IPOS+ICEL)=DIST2
  230. ELSE
  231. ICEL=ICEL+1
  232. GOTO 10
  233. ENDIF
  234. ENDIF
  235. ENDDO
  236. IF(NCMIS .NE. NTOTCV)THEN
  237. CALL ERREUR(5)
  238. GOTO 9999
  239. ENDIF
  240. C
  241. C******* On nettoie MLECVO
  242. C
  243. 20 CONTINUE
  244. IF(LAST.GT.0)THEN
  245. NLC=LAST
  246. LAST=MLECVO.LECT(NLC)
  247. MLECVO.LECT(NLC)=0
  248. GOTO 20
  249. ELSEIF(LAST .NE. -1)THEN
  250. CALL ERREUR(5)
  251. GOTO 9999
  252. ENDIF
  253. C
  254. C******* Mise a jour de NBTPOI
  255. C
  256. NBTPOI=NBTPOI+NCMIS
  257. IPOS=IPOS+NCMIS+1
  258. ENDDO
  259. NBTPOI=NBTPOI+NBL
  260. MLESBC.INDEX(NBL+1)=IPOS
  261. C
  262. C**** MLESBC surdimensionné
  263. C
  264. SEGADJ MLESBC
  265. JG=NBTPOI
  266. SEGADJ MLRDIS
  267. C
  268. SEGDES MLESBC
  269. SEGDES MLELSC
  270. SEGSUP MLELSB
  271. C
  272. SEGDES MLESOM
  273. SEGSUP MLESOM
  274. SEGDES MELCEN
  275. SEGSUP MLECEN
  276. C
  277. SEGSUP MLECVO
  278. SEGDES MLRDIS
  279.  
  280. 9999 RETURN
  281. END
  282.  
  283.  
  284.  
  285.  

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