Télécharger chole5.eso

Retour à la liste

Numérotation des lignes :

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

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