Télécharger chole5.eso

Retour à la liste

Numérotation des lignes :

chole5
  1. C CHOLE5 SOURCE MB234859 26/03/30 21:15:02 12509
  2. C----------------------------------------------------------------------
  3. C Finaliser les lignes inconnues du noeud courant LIGN
  4. C
  5. C Entrees :
  6. C ---------
  7. C LIG5 : Pointeur sur segment LIGN a traiter.
  8. C LIG6 : Pointeur sur segment LIGN a utiliser.
  9. C Pour le solveur symetrique, LIG6=LIG5
  10. C IDDL : Numero de l'inconnue du noeud courant que l'on traite
  11. C DAAG : Tableau contenant pour chaque ddl la valeur de l'inverse du
  12. C terme diagonal
  13. C NCOL : Nombre de colonne sur lesquelles s'etend le premier ddl du
  14. C noeud courant
  15. C ICLE : Entier pour unifier les solveurs symetrique et non symetrique
  16. C - ICLE = 1 si le terme diagonal doit etre calcule
  17. C - ICLE /= 1 si le terme diagonal ne doit pas etre calcule
  18. C NBO : Entier comptabilisant le nombre d'operations
  19. C
  20. C Sortie :
  21. C ---------
  22. C LIG5 : Pointeur sur segment LIGN finalise
  23. C----------------------------------------------------------------------
  24. FUNCTION CHOLE5(LIG5,LIG6,IDDL,DAAG,NCOL,ICLE,NBO)
  25. IMPLICIT INTEGER(I-N)
  26. IMPLICIT REAL*8 (A-H,O-Z)
  27. -INC SMMATRI
  28. -INC SMRIGID
  29. -INC CCHOLE
  30. -INC CCREEL
  31. POINTEUR LIG5.LIGN,LIG6.LIGN
  32. DIMENSION DAAG(*)
  33. C
  34. xmatri=matric
  35. nbnnma=nbnnmc
  36. C
  37. C Debut et fin des blocs de valeurs pour l'inconnue IDDL
  38. IDEBB=LIG5.IPPVV(IDDL)
  39. IFINB=LIG5.IPPVV(IDDL+1)
  40. NBLOC=IFINB-IDEBB
  41. ICDEB1=LIG5.IVPO(2*IDEBB-1)
  42. C
  43. C Colonne a partir de laquelle sont remplies les valeurs
  44. ICOL=LIG5.IPREL-NCOL+1
  45. INMA=NBNNMA-ICOL+1
  46. C
  47. C Colonne du terme diagonal pour l'inconnue IDDL
  48. IDIA=LIG5.IPREL-1+IDDL
  49. C
  50. IF (IDDL.EQ.1) GOTO 13
  51. C
  52. C Completer les termes manquants pour l'inconnue courante
  53. IDEBV=LIG5.IVPO(2*(IFINB-1))
  54. IIND1=IDIA-NBNNMA
  55. DO 10 IDDLJ=1,IDDL-1
  56. IDDL1=LIG6.IPPVV(IDDLJ)
  57. IDDL2=LIG5.IPPVV(IDDL)
  58. IVALJ=IDEBV+IDDLJ-1
  59. IIND2=LIG5.IPREL+IDDLJ-1-NBNNMA
  60. P=0.D0
  61. DO 11 IT2=1,NBLOC
  62. IPOS1=LIG6.IVPO(2*IDDL1)
  63. IPOS2=LIG6.IVPO(2*(IDDL1+1))
  64. LOND=IPOS2-IPOS1
  65. ICDEB=LIG5.IVPO(2*IDDL2-1)
  66. IF (ICDEB-ICDEB1+1.GT.INMA) GOTO 11
  67. ICFIN=ICDEB-ICDEB1+LOND
  68. LOND=MIN(LOND,LOND-ICFIN+INMA)
  69. IF (IT2.EQ.NBLOC) LOND=LOND-1
  70. IF (LOND.LE.0) GOTO 11
  71. IPOS2=LIG5.IVPO(2*IDDL2)
  72. IF (IPOS2.EQ.IVALJ) GOTO 11
  73. P=P+DDOTPV(LOND,LIG6.VAL(IPOS1),LIG5.VAL(IPOS2))
  74. IDDL1=IDDL1+1
  75. IDDL2=IDDL2+1
  76. nbo=nbo+lond
  77. 11 CONTINUE
  78. C WRITE(*,*) 'P=',P,LIG5.VAL(IVALJ),(LIG5.VAL(IVALJ)-P)
  79. LIG5.VAL(IVALJ)=LIG5.VAL(IVALJ)-P
  80. IF (XMATRI.NE.0.AND.IIND1.GE.1.AND.IIND2.GE.1) THEN
  81. RE(IIND1,IIND2,1)=LIG5.VAL(IVALJ)
  82. RE(IIND2,IIND1,1)=LIG5.VAL(IVALJ)
  83. ENDIF
  84. 10 CONTINUE
  85. C
  86. 13 CONTINUE
  87. C
  88. C Diviser chaque terme par la valeur du terme diagonal
  89. VALD=0.D0
  90. DO 1 IBL=IDEBB,IFINB-1
  91. IVDEB=LIG5.IVPO(2*IBL)
  92. IVFIN=LIG5.IVPO(2*(IBL+1))-1
  93. ICDEB=LIG5.IVPO(2*IBL-1)
  94. JCOL=ICOL+ICDEB-ICDEB1
  95. CCC IF (JCOL.GT.NBNNMA) GOTO 1
  96. JCOLV=JCOL-IVDEB
  97. ICFI2=MIN(JCOL+IVFIN-IVDEB+1,NBNNMA)
  98. IVFI2=MIN(IVFIN,IVDEB+ICFI2-JCOL)
  99. IF (JCOLV+IVFI2.EQ.IDIA) IVFI2=IVFI2-1
  100. DO 2 IV1=IVDEB,IVFI2
  101. VALK=LIG5.VAL(IV1)
  102. IF (VALK.EQ.0) GOTO 4
  103. nbo=nbo+1
  104. LIG5.VAL(IV1)=VALK*DAAG(JCOLV+IV1)
  105. IF (ICLE.NE.1) GOTO 4
  106. VALD=VALD+(LIG6.VAL(IV1)*VALK)
  107. 4 CONTINUE
  108. 2 CONTINUE
  109. 1 CONTINUE
  110. C
  111. C Terme diagonal
  112. CHOLE5=-VALD
  113. END
  114.  
  115.  

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