Télécharger tnupot.eso

Retour à la liste

Numérotation des lignes :

tnupot
  1. C TNUPOT SOURCE PV 22/04/19 21:15:05 11344
  2. SUBROUTINE TNUPOT(COORD,NBN,ITRNOE,NBNMAX,ITRTRI,NBCMAX,
  3. > NOETRI,NBE,ITVL,IMAX,RTVL,iarr)
  4. C **********************************************************************
  5. C OBJET : TRIANGULATION D'UN NUAGE DE POINTS
  6. C
  7. C EN ENTREE :
  8. C COORD : COORDONNEES DES POINTS
  9. C NBN : NOMBRE DE POINTS
  10. C ITVL : TABLEAU DE TRAVAIL. ON EMPILE SUCCESSIVEMENT :
  11. C LA TRIANGULATION INITIALE QUI NECESSITE : 3 * 50
  12. C PUIS SIMULTANEMENT LE NOMBRE DE NOEUDS REJETES, ET
  13. C LE TABLEAU DE TRAVAIL POUR TAJPOT = (6*NBADET +10)
  14. C D'OU IMAX > MAX(150,(6*NBADET+10)+NREJET)
  15. C
  16. C IMAX : TAILLE DU TABLEAU DE TRAVAIL
  17. C RTVL : TABLEAU DE TRAVAIL DE (8*NBN+244)
  18. C
  19. C EN SORTIE : LA TRIANGULATION MISE A JOUR
  20. C
  21. C ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI : LA TRIANGULATION
  22. C NBNMAX : =3 A MOINS D'ETRE DONNE (NBNMAX != 0 EN ENTREE)
  23. C NBCMAX : =3 A MOINS D'ETRE DONNE (NBCMAX != 0 EN ENTREE)
  24. C
  25. C iarr : CODE D'ERREUR
  26. C -1 TRIANGULATION INCOMPLETE : TOUS LES POINTS N'ONT PAS
  27. C PU ETRE AJOUTES
  28. C -2 ITVL TROP PETIT
  29. C **********************************************************************
  30. IMPLICIT INTEGER(I-N)
  31. REAL*8 COORD(*)
  32. INTEGER NBN
  33. INTEGER ITRNOE(*),NBNMAX,ITRTRI(*),NBCMAX
  34. INTEGER NOETRI(*),NBE,ITVL(*),IMAX,iarr
  35. REAL*8 RTVL(*)
  36. C
  37. C --- POUR LE DEBUG ---
  38. C
  39. C COMMON /DEBUG/ ITRACE, ITEST, IERROR, IMESS
  40. C INTEGER ITRACE, ITEST, IERROR
  41. C CHARACTER*256 IMESS
  42. C
  43. C --- POUR LES STATS ---
  44. C
  45. C COMMON /STATS/ ICARD(100), TEMPSCPU(100)
  46. C INTEGER ICARD
  47. C REAL TEMPSCPU
  48. C --- CONSTANTES ---
  49. INTEGER NADMAX
  50. PARAMETER ( NADMAX = 50 )
  51. REAL*8 ZEROTR, SZERO
  52. PARAMETER ( ZEROTR = 1.D-30, SZERO = 1.D-8 )
  53. C --- VARIABLES INTERNES ---
  54. REAL*8 BOITE(6)
  55. INTEGER IDIMC,IDE,NBC,NCOORD, NBFNOE, NOEMAX, ISENS
  56. INTEGER ITRI,NBPB,ITRAV,NBTRAV,I,J,IPT,ITC,IF2,NP(2),NCC
  57. INTEGER ISOMP,NBSOMP,ISPH,NTMEM
  58. INTEGER NCFMAX,NREJET,NBP,ICOORD,NPASSE
  59. INTEGER ITD,NBSMAX,NBTNEW
  60. INTEGER NOP, ITRACE
  61. C
  62. ITRACE = 0
  63. IDIMC = 2
  64. IF( NBN .EQ. 0 )THEN
  65. iarr = -1
  66. GO TO 999
  67. ENDIF
  68. IF( NBNMAX.EQ.0 )NBNMAX = 3
  69. IF( NBCMAX.EQ.0 )NBCMAX = 3
  70. IF(( NBNMAX.LT.3 ).OR.(NBCMAX.LT.3))THEN
  71. iarr = -1
  72. GOTO 999
  73. ENDIF
  74. IF( IDIMC .EQ. 2 )THEN
  75. C NBE = (2*(NBN+4)) + 2 - 4
  76. C NTMEM =(NBE*3)+((NBE+2)*2)+(NBE*3)+((NBN*7)+NBE)
  77. C NBE = 2*NBN + 6
  78. C NTMEM = 27 * NBN
  79. NTMEM = MAX(150,(6*NADMAX+10))
  80. IF( NTMEM.GT.IMAX )THEN
  81. iarr = -2
  82. GO TO 999
  83. ENDIF
  84. ENDIF
  85. C
  86. C ---- 1. INITIALISATION -----------------------------------------
  87. C NORMALISATION DES POINTS (PTINIT)
  88. C CALCUL DU MAILLAGE INITIAL ENGLOBANT (T2INIT)
  89. C CALCUL DES SPHERES CIRCONSCRITES
  90. C ----------------------------------------------------------------
  91. NBE = 0
  92. IDE = IDIMC
  93. NBC = IDIMC + 1
  94. NCOORD = NBN
  95. C ISPH = 1
  96. ISPH = IDIMC * ( NBN + 50 ) + 1
  97. ICOORD = 1
  98. ITRI = 1
  99. DO 5 I=1,IDIMC
  100. BOITE(I) = -1.0D0
  101. BOITE(IDIMC+I) = 1.0D0
  102. 5 CONTINUE
  103. CALL PTINIT(COORD,IDIMC,NBN,ZEROTR,RTVL(ICOORD),iarr)
  104. C CALL PTBOITENC(COORD,IDIMC,NBN,BOITE)
  105. C ITRI = 1
  106. C
  107. C --- TRIANGULATION DE LA BOITE D'ENCOMBREMENT --------------------
  108. C
  109. C CALL TRI2DBOITE(BOITE,ITVL(ITRI),NBE,
  110. C > COORD((NBN*IDIMC)+1),NBPB)
  111. C
  112. CALL T2INIT(BOITE,(1-NBN),ITVL(ITRI),NBE,
  113. > RTVL((NBN*IDIMC)+ICOORD),NBPB)
  114. C
  115. IPT = 2
  116. DO 10 I=0,(NBE*(IDIMC+1))-1
  117. ITVL(ITRI+I) = ITVL(ITRI+I) + NBN
  118. 10 CONTINUE
  119. NCOORD = NCOORD + NBPB
  120. NOEMAX = NCOORD
  121. ITRAV = ITRI + (NBE * NBC)
  122. NBTRAV = IMAX - ITRAV
  123. CALL SMAOCR(IDE,ITVL(ITRI),NBE,RTVL(ICOORD),NCOORD,
  124. > IDIMC,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,NOEMAX,
  125. > ITVL(ITRAV),NBTRAV,NCC,iarr)
  126. DO 20 I=1,NBE
  127. CALL SPCREE(IDIMC,I,ITRNOE((I-1)*NBNMAX+1),RTVL(ICOORD),
  128. > RTVL(ISPH),ZEROTR,iarr)
  129. IF( iarr .NE. 0 )THEN
  130. CALL DSERRE(1,iarr,'TNUPOT','CALCUL DES SPHERES')
  131. GOTO 999
  132. ENDIF
  133. 20 CONTINUE
  134. C -------- POUR LE DEBUG ---------------
  135. NCFMAX = IDE
  136. IF( ITRACE.NE.0 )THEN
  137. C PRINT *,'VERIF TRIANGULATION INITIALE'
  138. C CALL DEBSTRF1(IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,
  139. C > NBE,NCFMAX,ITRACE,iarr)
  140. C CALL DEBORIEN(IDE,IDIMC,ITRNOE,NBNMAX,ITRTRI,NBCMAX,
  141. C > NOETRI,NBE,RTVL(ICOORD),ITRACE,iarr)
  142. C CALL DEBDELF1(IDE,IDIMC,ITRNOE,NBNMAX,ITRTRI,NBCMAX,
  143. C > NOETRI,NBE,RTVL(ICOORD),RTVL(ISPH),
  144. C > ITRACE,ZEROTR,iarr)
  145. IF( iarr .NE. 0 )THEN
  146. C CALL DEBTABIPR(ITRNOE,NBE,3,1)
  147. C CALL DEBTABRPR(RTVL(ISPH),NBE,3,1)
  148. GO TO 999
  149. ENDIF
  150. ENDIF
  151. C
  152. C ---- 2. AJOUT DES NOEUDS ----------------------------------------
  153. C
  154. NPASSE = 0
  155. DO 25 I=IPT,NBN
  156. ITVL(I)=I
  157. 25 CONTINUE
  158. C
  159. ITD = 0
  160. NBP = NBN
  161. NBSMAX = 3
  162. C IPT = 1
  163. NREJET = 0
  164. 30 iarr = 0
  165. IF( ITRACE .NE. 0 )THEN
  166. C PRINT *,'*********************'
  167. C PRINT *,'AJOUT DU POINT :',IPT
  168. ENDIF
  169. CALL TAJPOT(ITVL(IPT),ITD,ITRNOE,NBNMAX,ITRTRI,
  170. > NBCMAX,NOETRI,NBE,RTVL(ICOORD),RTVL(ISPH),
  171. > NBSMAX,ITVL(NBP+1), (IMAX-NBP),SZERO,
  172. > NBTNEW,iarr)
  173. IF( iarr.NE.0 )THEN
  174. C IF( ITRACE .EQ. 1 )PRINT *,'ERREUR A L AJOUT DU POINT :',IPT
  175. C ----- PERMUTATION : EN FIN -------
  176. NREJET = NREJET + 1
  177. ITVL(NREJET) = ITVL(IPT)
  178. ENDIF
  179. C -------- POUR LE DEBUG ---------------
  180. NCFMAX = IDE
  181. IF((ITRACE .NE. 0 ).AND.( iarr .NE. 0 ))GOTO 999
  182. C -------- FIN POUR DEBUG ---------------
  183. IPT = IPT+1
  184. IF( IPT .LE. NBP )GO TO 30
  185. C -------- ON PASSE AU REJETES ---------
  186. C -------- TOUS LES POINTS REJETES -----
  187. IF( NREJET .GE. NBP )THEN
  188. IF( NPASSE .LT. 10 )THEN
  189. NPASSE = NPASSE + 1
  190. NBP = NREJET
  191. IPT = 1
  192. NREJET = 0
  193. iarr = 0
  194. GOTO 30
  195. ELSE
  196. iarr = -1
  197. CALL DSERRE(1,iarr,'TNUPOT','BOUCLE REJET')
  198. C ---- ON CONTINUE QUAND MEME POUR VERIFICATION ----
  199. iarr = 0
  200. GO TO 35
  201. C ENDIF
  202. ENDIF
  203. ENDIF
  204. C
  205. IF( NREJET .NE. 0 )THEN
  206. NPASSE = 0
  207. NBP = NREJET
  208. IPT = 1
  209. NREJET = 0
  210. GO TO 30
  211. ENDIF
  212. C
  213. C ---- 3. DESTRUCTION DES ELEMENTS BIDON --------------------------
  214. C
  215. 35 CONTINUE
  216. ITRACE = 0
  217. ISENS = 1
  218. NBFNOE = 1
  219. DO 50 I=1,NBPB
  220. NP(1) = NBN + I
  221. 40 CALL SESFR2(NP,ISENS,IDE,ITRNOE,NBNMAX,ITRTRI,
  222. > NBCMAX,NOETRI,ITC,IF2)
  223. C --- DE LA PREMIERE ARETE DE FRONTIERE ---
  224. IF( ITC.EQ. 0 )GO TO 50
  225. IF( ITRTRI((ITC-1)*NBCMAX+IF2) .NE. 0 )THEN
  226. iarr = -1
  227. CALL DSERRE(1,iarr,'TNUPOT','DESTRUCTION FINALE')
  228. GO TO 999
  229. ENDIF
  230. C --- L'ELEMENT EST MIS A LA FIN : PERMUTE ITC ET NBE ---------
  231. IF( ITRACE .NE. 0 )THEN
  232. C PRINT *,'DESTRUCTION DE ',ITC
  233. C PRINT *,(ITRNOE((ITC-1)*NBNMAX+J),J=1,NBNMAX)
  234. ENDIF
  235. CALL NUPERM(IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,
  236. > NBFNOE,NBE,ITC,NBE,iarr)
  237. C --- LE DERNIER ELEMENT EST DETRUIT --------------------------
  238. ISOMP = 1
  239. NBSOMP = 0
  240. CALL SMADET(IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NBE,NOETRI,
  241. > NBFNOE,NBE,NBC,ITVL(ISOMP),NBSOMP,iarr)
  242. NBE = NBE-1
  243. IF( iarr .NE. 0 )THEN
  244. iarr = -1
  245. CALL DSERRE(1,iarr,'TNUPOT','DESTRUCTION FINALE')
  246. GO TO 999
  247. ENDIF
  248. IF( NBSOMP .EQ. 0 )GO TO 40
  249. C --- LE NOEUD (NBN + I) EST DECONNECTE ----------------------
  250. 50 CONTINUE
  251. C ==================================
  252. C --- MISE A JOUR DE NOETRI : O(3*NBE) ---
  253. C ==================================
  254. DO 70 I=1,NBE
  255. DO 60 J=1,3
  256. NOP = ITRNOE((I-1)*NBNMAX+J)
  257. IF((NOP.GT.NBN).OR.(NOP.LE.0))THEN
  258. iarr = -1
  259. GOTO 999
  260. ENDIF
  261. NOETRI(NOP) = I
  262. 60 CONTINUE
  263. 70 CONTINUE
  264. C
  265. IF( NREJET.NE. 0 )iarr = -1
  266. 999 END
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  

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