Télécharger gaus3d.eso

Retour à la liste

Numérotation des lignes :

gaus3d
  1. C GAUS3D SOURCE PV090527 23/04/20 21:15:09 11655
  2. subroutine gaus3d(n,a,x,b,ngf,err1,ipzero)
  3.  
  4. c resolution d un systeme lineaire
  5. c n taille du syteme a resoudre
  6. c ngf taille fixe de la matrice
  7.  
  8. c ************************************************************************
  9. implicit real*8 (a-h,o-z)
  10. implicit integer (i-n)
  11.  
  12. integer ngf,n,err1
  13. real*8 a(ngf,ngf+1),b(ngf),x(ngf)
  14. integer ipzero(ngf)
  15.  
  16. integer i,j,k,l,ipmax
  17. real*8 aux,s
  18. real*8 pmax
  19. real*8 epsilon1
  20.  
  21. logical affiche_local
  22. parameter (affiche_local=.true.)
  23.  
  24. c------sauvegarde de la matrice initiale---------
  25. c indispensable en cas de mise a zero des multiplicateurs
  26. c plastiques dans fldo3d
  27. integer ngf2
  28. parameter(ngf2=65)
  29. real*8 aa(ngf2,ngf2),bb(ngf2)
  30. if(ngf2.lt.ngf) then
  31. print*,'pb de dimension de matrice dans model sellier gaus3d'
  32. err1=1
  33. return
  34. else
  35. err1=0
  36. end if
  37.  
  38. do i=1,n
  39. do j=1,n
  40. aa(i,j)=a(i,j)
  41. end do
  42. bb(i)=b(i)
  43. end do
  44. c------------------------------------------------
  45.  
  46.  
  47. c test taille du pb
  48. if (n.gt.ngf) then
  49. print*,'n .gt. ngf dans dans gauss_3d'
  50. print*,'n',n,'ngf',ngf
  51. read*
  52. err1=1
  53. return
  54. end if
  55.  
  56. c precision pivot nul
  57. epsilon1=1.0d-14
  58.  
  59. do i=1,n
  60. a(i,n+1)=b(i)
  61. end do
  62.  
  63. c print*, 'debut gauss_3d'
  64. c do i=1,n
  65. c do j=1,n+1
  66. c print *,'a(',i,j,')=',a(i,j)
  67. c end do
  68. c print*,'b(',i,')=',b(i)
  69. c end do
  70. c read*
  71.  
  72. do i=1,n
  73. c recherche du pivot dmax1
  74. pmax=0.d0
  75. ipmax=i
  76. do j=i,n
  77. if (dabs(a(j,i)).gt.pmax) then
  78. pmax=dabs(a(j,i))
  79. ipmax=j
  80. end if
  81. end do
  82. if(pmax.lt.epsilon1) then
  83. c test pivot nul
  84. if(affiche_local) then
  85. print*,'Pivot nul dans gauss_3d '
  86. print*,'pivot maxi',pmax,'ligne:',i
  87. ipzero(i)=1
  88. ipmax=i
  89. write(*,'(1X,A2)',advance='no') 'aa'
  90. do m=1,n
  91. write(*,'(8X,I3)',advance='no') m
  92. end do
  93. write(*,'(9X,A2)') 'bb'
  94. do l=1,n
  95. write(*,'(1X,I2)',advance='no') l
  96. do m=1,n
  97. write(*,'(1x,e10.3)',advance='no') aa(l,m)
  98. end do
  99. c read*
  100. write(*,'(1x,e10.3)') bb(l)
  101. end do
  102. end if
  103. c read*
  104. err1=1
  105. c recuperation de la matrice
  106. do l=1,n
  107. do j=1,n
  108. a(l,j)=aa(l,j)
  109. end do
  110. b(l)=bb(l)
  111. end do
  112. return
  113. else
  114. err1=0
  115. ipzero(i)=0
  116. c ipmax=i
  117. end if
  118.  
  119. c intervertion des lignes si necessaire
  120. if(ipmax.ne.i) then
  121. c print*,'inversion de ligne',i,'<->',ipmax
  122. do j=1,n+1
  123. aux=a(i,j)
  124. a(i,j)=a(ipmax,j)
  125. a(ipmax,j)=aux
  126. end do
  127. end if
  128.  
  129. if(ipzero(i).ne.1) then
  130. c calcul ligne i utile si pmax ne 1, si non on fait rien et on mettra l inconnue a zero
  131. c lors de la resolution
  132. do j=i+1,n+1
  133. a(i,j)=a(i,j)/a(i,i)
  134. end do
  135.  
  136. c calcul des autres lignes
  137. do k=(i+1),n
  138. do j=(i+1),(n+1)
  139. a(k,j)=a(k,j)-a(k,i)*a(i,j)
  140. end do
  141. end do
  142. end if
  143.  
  144. c fin de la boucle sur les lignes
  145. end do
  146.  
  147. c sortie des inconnues
  148. if(ipzero(n).ne.1) then
  149. x(n)=a(n,n+1)
  150. else
  151. x(n)=0.d0
  152. end if
  153.  
  154. do i=(n-1),1,-1
  155. if(ipzero(i).ne.1) then
  156. s=a(i,n+1)
  157. do j=i+1,n
  158. s=s-a(i,j)*x(j)
  159. end do
  160. a(i,n+1)=s
  161. x(i)=s
  162. else
  163. print*,'mise a zero de x',i,'ds gauss 3d'
  164. x(i)=0.d0
  165. end if
  166. end do
  167.  
  168. c print*, 'fin gauss_3d'
  169. c do i=1,n
  170. c do j=1,(n+1)
  171. c print *,'a(',i,j,')=',a(i,j)
  172. c end do
  173. c print*,'b(',i,')=',b(i)
  174. c end do
  175.  
  176. c------recuperation de la matrice initiale---------
  177. do i=1,n
  178. do j=1,n
  179. a(i,j)=aa(i,j)
  180. end do
  181. b(i)=bb(i)
  182. end do
  183. c--------------------------------------------------
  184.  
  185.  
  186.  
  187. c-------test de la solution --------------
  188. c do i=1,n
  189. c s=0.d0
  190. c do j=1,n
  191. c s=s+aa(i,j)*x(j)
  192. c end do
  193. c print*,'ax',i,'=',s,'=?=',bb(i)
  194. c end do
  195. c read*
  196. c-----------------------------------------
  197.  
  198.  
  199. return
  200. end
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  

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