Télécharger rdct3d.eso

Retour à la liste

Numérotation des lignes :

rdct3d
  1. C RDCT3D SOURCE PV090527 23/01/27 21:16:01 11574
  2. subroutine rdct3d(a,x,b,ngf,ipzero,err1,nxn,lnxn,na,nc)
  3.  
  4. c reduction du systeme lineaire aux lignes dont les multiplicateurs
  5. c sont positifs (on eleve les nxn lignes dont le numero sont ds lnxn)
  6.  
  7. implicit real*8 (a-h,o-z)
  8. implicit integer (i-n)
  9.  
  10. integer ngf,n,err1
  11. integer ipzero(ngf)
  12. real*8 a(ngf,ngf+1),b(ngf),x(ngf)
  13. integer nxn,lnxn(nc)
  14.  
  15. integer dim1,inxn
  16. integer ns
  17. parameter(ns=40)
  18. real*8 as(ns,ns+1),bs(ns)
  19.  
  20. if(ns.ne.ngf) then
  21. print*,'ns.ne.ngf dans reduc3d'
  22. print*,'recompiler avec ns.eq.ngf dans rdct3d'
  23. err1=1
  24. return
  25. end if
  26.  
  27. c sauvegarde de la matrice initiale en cas de sous iteration
  28. do i=1,18+na
  29. do j=1,18+na+1
  30. as(i,j)=a(i,j)
  31. end do
  32. bs(i)=b(i)
  33. end do
  34.  
  35. c reduction de la matrice initiale
  36. dim1=18+na
  37. do i=1,nxn
  38. c numero de la ligne et colonne a supprimer
  39. c comme on a deja supprimer i-1 lignes et colonne la numerotation
  40. c est decallee d autant : numero de la ligne a supprimer
  41. j=lnxn(i)+18-(i-1)
  42. if(j.lt.dim1) then
  43. c on remonte les lignes inferieures et colonnes suivantes
  44. do k=j,dim1-1
  45. do l=1,dim1
  46. a(k,l)=a(k+1,l)
  47. end do
  48. b(k)=b(k+1)
  49. end do
  50. do k=j,dim1-1
  51. do l=1,dim1
  52. a(l,k)=a(l,k+1)
  53. end do
  54. end do
  55. dim1=dim1-1
  56. else
  57. c pas de lignes inferieures il suffit de reduire la taille
  58. dim1=dim1-1
  59. end if
  60. end do
  61.  
  62. c resolution du systeme reduit
  63. call gaus3d(dim1,a,x,b,ngf,err1,ipzero)
  64. if(err1.eq.1) then
  65. print*,'Pb avec gaus3d dans reduc3d'
  66. return
  67. end if
  68. c affectation de la nouvelle solution dans x
  69. c print*,'apres rdct3d'
  70. inxn=1
  71. do i=1,na
  72. if(i.eq.lnxn(inxn)) then
  73. c on decalle vers le bas les suivants si on est pas au dernier
  74. if(i.lt.na) then
  75. c on commence par le bas car les plus bas sont inutiles
  76. do k=na,i+1,-1
  77. x(18+k)=x(18+k-1)
  78. end do
  79. end if
  80. c et comme il s agit d un multiplicateur mis a zero, on met a zero
  81. x(18+i)=0.d0
  82. c on incremente le nombre de critere mis a zero
  83. inxn=inxn+1
  84. end if
  85. end do
  86. c print*,'a la fin de rdct3d'
  87. c do i=1,na
  88. c do j=1,nxn
  89. c if(i.eq.lnxn(j)) then
  90. c print*,i,'a ete mis a zero'
  91. c end if
  92. c end do
  93. c print*,'xn',i,'=',x(18+i)
  94. c end do
  95. c read*
  96.  
  97. c restitution de la matrice initiale
  98. do i=1,18+na
  99. do j=1,18+na+1
  100. a(i,j)=as(i,j)
  101. end do
  102. b(i)=bs(i)
  103. end do
  104.  
  105. c test de la solution obtenue si necessaire
  106. c print*,'test de la solution reduite dans rdct3d'
  107. c do i=1,na
  108. c s=0.d0
  109. c do j=1,18+na
  110. c s=s+a(18+i,j)*x(j)
  111. c end do
  112. c print*,'bx',18+i,'=',s,'=?=',b(18+i)
  113. c end do
  114. c read*
  115.  
  116.  
  117. return
  118. end
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  

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