Télécharger exdiag.eso

Retour à la liste

Numérotation des lignes :

exdiag
  1. C EXDIAG SOURCE GOUNAND 25/04/30 21:15:04 12258
  2. SUBROUTINE EXDIAG(IOPT)
  3. IMPLICIT REAL*8 (A-H,O-Z)
  4. IMPLICIT INTEGER (I-N)
  5. C*************************************************************************
  6. C Operateur EXDIAG
  7. C
  8. C OBJET : Extrait une diagonale d'une matrice au format
  9. C MATRIK
  10. C Pour cela, on doit l'assembler.
  11. C L'assemblage se fait comme dans KRES2.
  12. C Si IOPT=1, on renvoie la diagonale de la matrice.
  13. C Si IOPT=2, on renvoie un inverse approché (SPAI)
  14. C diagonal de la matrice entrée.
  15. C Son expression est :
  16. C m_ii = a_ii / \sum_{j=1,n} aij^2
  17. C
  18. C Voir aussi la notice de KOPS
  19. C
  20. C***********************************************************************
  21. C HISTORIQUE : 21/03/08 : Première version
  22. C
  23. C***********************************************************************
  24. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  25. C en cas de modification de ce sous-programme afin de faciliter
  26. C la maintenance !
  27. C***********************************************************************
  28.  
  29. -INC PPARAM
  30. -INC CCOPTIO
  31. -INC CCREEL
  32. -INC SMCHPOI
  33. POINTEUR MCHDIA.MCHPOI
  34. POINTEUR MATRI2.MATRIK
  35. POINTEUR AMORS.PMORS
  36. POINTEUR AISA.IZA
  37. POINTEUR IDIAGO.IZA
  38. POINTEUR ISCAR.IZA
  39. INTEGER IMPR,IRET
  40. C
  41. CHARACTER*4 MRENU,MMULAG
  42. CHARACTER*8 TYPE
  43. CHARACTER*8 TYMATK,TYRIGI,BLAN
  44. DATA TYMATK,TYRIGI,BLAN/'MATRIK ','RIGIDITE',' '/
  45. *
  46. IMPR=0
  47. *
  48. * Lecture de la matrice
  49. *
  50. TYPE=BLAN
  51. CALL QUETYP(TYPE,1,IRET)
  52. IF (IRET.EQ.0) GOTO 9999
  53. IF (TYPE.EQ.TYRIGI) THEN
  54. IF (IOPT.EQ.2) THEN
  55. * Transformation en matrik en changement de noms d'inconnues
  56. CALL RIMA
  57. IF (IERR.NE.0) RETURN
  58. CALL MACHI2(1)
  59. IF (IERR.NE.0) RETURN
  60. ELSE
  61. CALL LIROBJ('RIGIDITE',IRIG,1,IRET)
  62. IF (IERR.NE.0) RETURN
  63. *
  64. CALL EXDIAR(IRIG,ICHP)
  65. IF (IERR.NE.0) RETURN
  66. *
  67. CALL ECROBJ('CHPOINT ',ICHP)
  68. RETURN
  69. ENDIF
  70. ENDIF
  71. TYPE=TYMATK
  72. CALL LIROBJ(TYPE,MATRIK,1,IRET)
  73. IF(IRET.EQ.0) GOTO 9999
  74. C
  75. C Assemblage proprement dit
  76. C
  77. C Attention, on effectue une recopie du chapeau pour ne garder
  78. C aucune information de préconditionnement (assemblage, numérotation)
  79. C dans la matrice originale sinon une résolution subséquente poserait
  80. C problème !!!!!!
  81. C
  82. SEGINI,MATRI2=MATRIK
  83. MATRIK=MATRI2
  84. MATASS=MATRIK
  85. MRENU='RIEN'
  86. MMULAG='RIEN'
  87. * SG 2016/02/09 : non à la ligne suivante : il faut que METASS soit
  88. * égale à 5 (voir remarque dans makpr2)
  89. * METASS=4
  90. METASS=5
  91. *
  92. CALL KRES3(MATRIK,MATASS,MRENU,MMULAG,METASS,
  93. $ 0,0,0,0,0,
  94. $ 0,.FALSE.,
  95. $ IMPR,IRET)
  96. IF (IRET.NE.0) GOTO 9999
  97. C
  98. C Extraction de la diagonale
  99. C
  100. SEGACT MATRIK
  101. AMORS=MATRIK.KIDMAT(4)
  102. AISA=MATRIK.KIDMAT(5)
  103. *
  104. SEGACT AMORS
  105. SEGACT AISA
  106. NTTDDL=AMORS.IA(/1)-1
  107. NBVA=NTTDDL
  108. SEGINI IDIAGO
  109. IF (IOPT.EQ.2) THEN
  110. SEGINI ISCAR
  111. ENDIF
  112. DO ITTDDL=1,NTTDDL
  113. JSTRT=AMORS.IA(ITTDDL)
  114. JSTOP=AMORS.IA(ITTDDL+1)-1
  115. DO J=JSTRT,JSTOP
  116. JTTDDL=AMORS.JA(J)
  117. IF (JTTDDL.EQ.ITTDDL) THEN
  118. IDIAGO.A(ITTDDL)=AISA.A(J)
  119. ENDIF
  120. IF (IOPT.EQ.2) THEN
  121. VAL=AISA.A(J)
  122. ISCAR.A(ITTDDL)=ISCAR.A(ITTDDL)+(VAL*VAL)
  123. ENDIF
  124. ENDDO
  125. ENDDO
  126. SEGSUP AISA
  127. SEGSUP AMORS
  128. *
  129. IF (IOPT.EQ.2) THEN
  130. DO ITTDDL=1,NTTDDL
  131. VAL=ISCAR.A(ITTDDL)
  132. IF (VAL.LE.SQRT(XPETIT)) THEN
  133. WRITE(IOIMP,*) 'La ligne ',ITTDDL,
  134. $ ' de la matrice est nulle : ', VAL
  135. GOTO 9999
  136. ENDIF
  137. IDIAGO.A(ITTDDL)=IDIAGO.A(ITTDDL)/VAL
  138. ENDDO
  139. ENDIF
  140. IF (IOPT.EQ.2) THEN
  141. SEGSUP ISCAR
  142. ENDIF
  143. C
  144. C Transformation en chpoint
  145. C
  146. CALL XDISP(MATRIK,IDIAGO,MCHDIA,IMPR,IRET)
  147. IF (IRET.NE.0) GOTO 9999
  148. SEGSUP IDIAGO
  149. SEGSUP MATRIK
  150. CALL ECROBJ('CHPOINT ',MCHDIA)
  151. *
  152. * Normal termination
  153. *
  154. RETURN
  155. *
  156. * Format handling
  157. *
  158. *
  159. * Error handling
  160. *
  161. 9999 CONTINUE
  162. WRITE(IOIMP,*) 'An error was detected in exdiag.eso'
  163. * 153 2
  164. * Opération illicite dans ce contexte
  165. CALL ERREUR(153)
  166. RETURN
  167. *
  168. * End of EXDIAG
  169. *
  170. END
  171.  
  172.  

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