Télécharger rlevb1.eso

Retour à la liste

Numérotation des lignes :

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

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