Télécharger volshb.eso

Retour à la liste

Numérotation des lignes :

volshb
  1. C VOLSHB SOURCE CB215821 20/11/25 13:42:36 10792
  2. subroutine volshb(ipt1,epai,mchpoi,ip1,meleme)
  3. implicit real*8(a-h,o-z)
  4. implicit integer(i-n)
  5.  
  6. -INC PPARAM
  7. -INC CCOPTIO
  8. -INC SMCHPOI
  9. -INC SMELEME
  10. -INC SMCOORD
  11. segment icpr(nbpts)
  12. segment ipos(nbp)
  13. segment vec(3,nbp)
  14. segment icprp(nbpts)
  15. segact ipt1
  16. if( ipt1.lisous(/1).ne.0.or.ipt1.itypel.ne.8) then
  17. call erreur (1002)
  18. return
  19. endif
  20. icle=1
  21. if(mchpoi.ne.0) then
  22. icle=2
  23. segact mchpoi
  24. if(ipchp(/1).ne.1) then
  25. call erreur(180)
  26. return
  27. endif
  28. msoupo=ipchp(1)
  29. segact msoupo
  30. if(nocomp(/2).ne.1) then
  31. call erreur(180)
  32. return
  33. endif
  34. mpoval=ipoval
  35. ipt2=igeoc
  36. segact ipt2,mpoval
  37. segini icprp
  38. do i=1,ipt2.num(/2)
  39. ia=ipt2.num(1,i)
  40. icprp(ia)=i
  41. enddo
  42. segdes ipt2
  43. endif
  44. *
  45. * pour chaque point on regarde quels sont les éléments qui le touchent
  46. *
  47. xp1=xcoor((ip1-1)*(idim+1)+1)
  48. yp1=xcoor((ip1-1)*(idim+1)+2)
  49. zp1=xcoor((ip1-1)*(idim+1)+3)
  50. nbp=0
  51. segini icpr
  52. do i=1,ipt1.num(/2)
  53. do j=1,4
  54. ia= ipt1.num(j,i)
  55. if(icpr(ia).eq.0) then
  56. nbp=nbp+1
  57. icpr(ia)=nbp
  58. endif
  59. enddo
  60. enddo
  61. segini ipos,vec
  62. *
  63. * on calcule pour chaque point le vecteur normale
  64. *
  65. isens=0
  66. do i=1,ipt1.num(/2)
  67. ia=(ipt1.num(1,i)-1)*4
  68. ib=(ipt1.num(2,i)-1)*4
  69. ic=(ipt1.num(3,i)-1)*4
  70. xa=xcoor(ia+1)
  71. ya=xcoor(ia+2)
  72. za=xcoor(ia+3)
  73. xb=xcoor(ib+1)
  74. yb=xcoor(ib+2)
  75. zb=xcoor(ib+3)
  76. xc=xcoor(ic+1)
  77. yc=xcoor(ic+2)
  78. zc=xcoor(ic+3)
  79. xn=(yb-ya)*(zc-za)-(yc-ya)*(zb-za)
  80. yn=(zb-za)*(xc-xa)-(zc-za)*(xb-xa)
  81. zn=(xb-xa)*(yc-ya)-(xc-xa)*(yb-ya)
  82. xyz=sqrt(xn*xn+yn*yn+zn*zn)
  83. xn=xn/xyz
  84. yn=yn/xyz
  85. zn=zn/xyz
  86. do j=1,4
  87. ia=ipt1.num(j,i)
  88. ib=icpr(ia)
  89. ipos(ib)=ipos(ib)+1
  90. vec(1,ib)=vec(1,ib)+xn
  91. vec(2,ib)=vec(2,ib)+yn
  92. vec(3,ib)=vec(3,ib)+zn
  93. enddo
  94. enddo
  95. do i=1,nbp
  96. na= ipos(i)
  97. ipos(i)=0
  98. vec(1,i)=vec(1,i)/na
  99. vec(2,i)=vec(2,i)/na
  100. vec(3,i)=vec(3,i)/na
  101. xv= vec(1,i)*vec(1,i)+vec(2,i)*vec(2,i)+vec(3,i)*vec(3,i)
  102. xv=sqrt(xv)
  103. vec(1,i)=vec(1,i)/xv
  104. vec(2,i)=vec(2,i)/xv
  105. vec(3,i)=vec(3,i)/xv
  106. xps= vec(1,i)*xp1+vec(2,i)*yp1+vec(3,i)*zp1
  107. if(xps.ge.0.d0) then
  108. if( isens.lt.0) then
  109. call erreur (19)
  110. return
  111. endif
  112. isens=1
  113. elseif(xps.le.0.d0) then
  114. if( isens.gt.0) then
  115. call erreur (19)
  116. return
  117. endif
  118. isens=-1
  119. endif
  120. enddo
  121. *
  122. * il faut maintenant créer le maillage
  123. *
  124. nbnn=8
  125. nbelem=ipt1.num(/2)
  126. nbref=2
  127. nbsous=0
  128. segini meleme
  129. itypel=14
  130. ep=epai
  131. segact mcoord*mod
  132. nbpini=nbpts
  133. nbpts=nbpts+2*nbp
  134. segadj mcoord
  135. nbnn=4
  136. nbref=0
  137. segini ipt5,ipt6
  138. lisref(1)=ipt5
  139. lisref(2)=ipt6
  140. ipt5.itypel=8
  141. ipt6.itypel=8
  142. do i=1,ipt1.num(/2)
  143. do j=1,4
  144. ia=ipt1.num(j,i)
  145. ib=icpr(ia)
  146. * faut-il créer les points ?
  147. if( ipos(ib).eq.0) then
  148. iadec=(ia-1)*(idim+1)
  149. if(icle.eq.2) then
  150. ic=icprp(ia)
  151. if(ic.eq.0) then
  152. meleme=0
  153. call erreur(19)
  154. return
  155. endif
  156. ep=vpocha(ic,1)
  157. endif
  158. nbpini=nbpini+1
  159. nbpdec=(nbpini-1)*(idim+1)
  160. ie=nbpini
  161. eps=ep*isens
  162. do k=1,3
  163. xcoor(nbpdec+k)= xcoor(iadec+k)-vec(k,ib)*eps
  164. enddo
  165. nbpini=nbpini+1
  166. nbpdec=nbpdec+4
  167. do k=1,3
  168. xcoor(nbpdec+k)= xcoor(iadec+k)+vec(k,ib)*eps
  169. enddo
  170. ipos(ib)=ie
  171. else
  172. ie=ipos(ib)
  173. endif
  174. num(J,i)=ie
  175. num(J+4,i)=ie+1
  176. ipt5.num(j,i)=ie
  177. ipt6.num(j,i)=ie+1
  178. enddo
  179. enddo
  180. if( icle.eq.2)then
  181. segdes mpoval,ipt2,msoupo,mchpoi
  182. segsup icprp
  183. endif
  184. segsup icpr,ipos,vec
  185. segdes ipt1
  186. segdes meleme,ipt5,ipt6
  187. return
  188. end
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  

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