Télécharger acheck.eso

Retour à la liste

Numérotation des lignes :

acheck
  1. C ACHECK SOURCE BP208322 19/04/29 21:15:01 10213
  2. SUBROUTINE ACHECK (IPRIGI,IPMASS,QUAD,SYM,SHIFT,N,FLAG,
  3. & INVER,PIRE,CHOLE,EPSI)
  4.  
  5.  
  6. ***********************************************************************
  7. *
  8. * A C H E C K
  9. *
  10. * FONCTION:
  11. * ---------
  12. *
  13. * VERIFICATION DE LA POSSIBILITE POUR ARPACK DE RESOUDRE +
  14. * CHOIX DE LA MATRICE QUI DEFINIRA LE PRODUIT SCALAIRE DANS ARPACK
  15. * + EVENTUELLE(S) SIMPLIFICATION(S) (CHOLESKY, PROBLEME SYM)
  16. *
  17. *
  18. * PARAMETRES: (E)=ENTREE (S)=SORTIE
  19. * -----------
  20. *
  21. * IPRIGI ENTIER (E) POINTEUR D'UNE RIGIDITE
  22. * IPMASS ENTIER (E) POINTEUR D'UNE MASSE
  23. * QUAD LOGIQUE (E) PROBLEME QUADRATIQUE OU NON
  24. * SYM LOGIQUE (S) PROBLEME SYMETRIQUE OU NON
  25. * SHIFT COMPLEX DP (E) FREQUENCE DE SHIFT
  26. * N ENTIER (E) DIMENSION DU PROBLEME
  27. * FLAG LOGIQUE (S) PROBLEME SOLVABLE OU NON
  28. * INVER LOGIQUE (S) .TRUE. -> PRODUIT SCALAIRE X'KX
  29. * .FALSE. -> PRODUIT SCALAIRE X'MX
  30. * CHOLE LOGIQUE (S) CHOLESKY NON ALTERNATIVE POSSIBLE
  31. * EPSI REEL DP (E) ZERO DE TOLERANCE
  32. *
  33. *
  34. * SOUS-PROGRAMMES APPELES:
  35. * ------------------------
  36. *
  37. * DIAGN1
  38. *
  39. * AUTEUR, DATE DE CREATION:
  40. * -------------------------
  41. *
  42. * PASCAL BOUDA 29 JUIN 2015
  43. *
  44. ***********************************************************************
  45.  
  46. IMPLICIT INTEGER(I-N)
  47. IMPLICIT REAL*8 (A-H,O-Z)
  48.  
  49.  
  50. -INC PPARAM
  51. -INC CCOPTIO
  52. -INC SMRIGID
  53.  
  54. INTEGER IPRIGI,IPMASS
  55. INTEGER N
  56. LOGICAL QUAD
  57. LOGICAL SYM,INVER,POSITI
  58. LOGICAL FLAG,PIRE
  59. LOGICAL CHOLE
  60. COMPLEX*16 SHIFT
  61.  
  62.  
  63. INTEGER IPCHOI
  64. INTEGER nvp0K,nvp0M
  65. INTEGER NRG,NBR,IANTI
  66. COMPLEX*16 ZERO
  67.  
  68.  
  69. ZERO=CMPLX(0.D0,0.D0)
  70.  
  71. * La decomposition de Cholesky n'est pas codee --> CHOLE toujours false
  72. CHOLE=.FALSE.
  73.  
  74. *** Cas lineaire:
  75. * Si le shift est nul, on peut resoudre tous les problemes (matrice de
  76. * masse ou rig utilisée pour le produit scalaire,
  77. * sinon matrice identité)
  78. * Sinon, par defaut, la matrice utilisee pour le produit scalaire est la
  79. * matrice de masse
  80. * Calcul du nombre de termes diagonaux negatifs:
  81. * -si nul, ok
  82. * -sinon on essaie d'echanger les roles
  83. * (-> K pour le produit scalaire)
  84. * -si nouvel echec,le probleme n'est pas solvable
  85. *
  86. *** Cas quadratique:
  87. * K ou M doit être symetrique semi-definie positive pour le produit
  88. *scalaire.
  89. * Plus precisement, il s'agit de la matrice par blocs
  90. * | M 0 | | K 0 |
  91. * | 0 M | ou | 0 K |
  92. * Il n'y a pas de conditions sur les autres matrices
  93.  
  94. FLAG=.FALSE.
  95. INVER=.FALSE.
  96. PIRE=.FALSE.
  97. POSITI=.TRUE.
  98.  
  99. c --on va tester M--
  100. MRIGID=IPMASS
  101. SEGACT MRIGID
  102. NRG = IRIGEL(/1)
  103. NBR = IRIGEL(/2)
  104.  
  105. IF (NRG .GE. 7) THEN
  106. DO i=1,NBR
  107. IANTI=IRIGEL(7,i)
  108. IF (IANTI .GT. 0) THEN
  109. SEGDES MRIGID
  110. GOTO 101
  111. ENDIF
  112. ENDDO
  113. ENDIF
  114.  
  115. SEGDES MRIGID
  116.  
  117. CALL DIAGN1(IPMASS,nvp0M)
  118. * M def >0 ou semi-def >0
  119. IF (nvp0M .EQ. 0) THEN
  120. FLAG=.TRUE.
  121. GOTO 200
  122. ENDIF
  123.  
  124. 101 CONTINUE
  125.  
  126.  
  127. c cas M non-symetrique ou M non semi-def >0
  128.  
  129. c IF (SHIFT .NE. ZERO) THEN
  130.  
  131. c --on va tester K--
  132. MRIGID=IPRIGI
  133. SEGACT MRIGID
  134. NRG = IRIGEL(/1)
  135. NBR = IRIGEL(/2)
  136.  
  137. IF (NRG .GE. 7) THEN
  138. DO i=1,NBR
  139. IANTI=IRIGEL(7,i)
  140. IF (IANTI .GT. 0) THEN
  141. SEGDES MRIGID
  142. GOTO 102
  143. ENDIF
  144. ENDDO
  145. ENDIF
  146.  
  147. SEGDES MRIGID
  148.  
  149. CALL DIAGN1(IPRIGI,nvp0K)
  150. * K def >0 ou semi-def >0
  151. IF (nvp0K .EQ. 0) THEN
  152. FLAG=.TRUE.
  153. INVER=.TRUE.
  154. GOTO 200
  155. ENDIF
  156.  
  157. c ENDIF
  158.  
  159. 102 CONTINUE
  160. c --cas M et K non-symetrique ou non semi-def >0 --
  161.  
  162.  
  163. *-- cas 'desespere' : aucune matrice n'est bien conditionnee;
  164. * on ne peut resoudre que pour des problemes lineaires a shift nul --
  165. * bp, 2019 : a tester ...
  166. *
  167. * le probleme (matrice A=M^-1*K) n'est (probablement) pas symetrique
  168.  
  169. IF (.NOT. FLAG) THEN
  170. c on peut resoudre avec un shift nul
  171. IF (.NOT. QUAD) THEN
  172. IF (SHIFT .EQ. ZERO) THEN
  173. SYM=.FALSE.
  174. PIRE=.TRUE.
  175. FLAG=.TRUE.
  176. GOTO 300
  177. ENDIF
  178. ENDIF
  179. ENDIF
  180.  
  181.  
  182. 200 CONTINUE
  183. c --on a M ou K symetrique semi-def>0 --
  184.  
  185. * Identification du type de probleme :
  186. * -symetrique -> modes propres reels
  187. * -non symetrique -> modes propres reels ou complexes
  188.  
  189. IF (QUAD) THEN
  190. *Le probleme n'est jamais symetrique
  191. SYM=.FALSE.
  192.  
  193. ELSE
  194. *On regarde la symetrie de la matrice non utilisee pour le ps
  195. SYM=.TRUE.
  196.  
  197. c M utilisee pour le ps : on regarde K
  198. IF (.NOT. INVER) THEN
  199. MRIGID=IPRIGI
  200. SEGACT MRIGID
  201. NRG = IRIGEL(/1)
  202. NBR = IRIGEL(/2)
  203. IF (NRG .GE. 7) THEN
  204. DO i=1,NBR
  205. IANTI=IRIGEL(7,i)
  206. IF (IANTI .GT. 0) THEN
  207. SYM=.FALSE.
  208. ENDIF
  209. ENDDO
  210. ENDIF
  211.  
  212. ELSE
  213. c K utilisee pour le ps : on regarde M
  214. * La matrice M doit etre symetrique si on a inverse les roles
  215. MRIGID=IPMASS
  216. SEGACT MRIGID
  217. NRG = IRIGEL(/1)
  218. NBR = IRIGEL(/2)
  219. IF (NRG .GE. 7) THEN
  220. DO i=1,NBR
  221. IANTI=IRIGEL(7,i)
  222. IF (IANTI .GT. 0) THEN
  223. FLAG=.FALSE.
  224. INVER=.FALSE.
  225. PIRE=.FALSE.
  226. GOTO 102
  227. ENDIF
  228. ENDDO
  229. ENDIF
  230.  
  231. ENDIF
  232.  
  233. SEGDES MRIGID
  234.  
  235. ENDIF
  236.  
  237.  
  238.  
  239. 300 CONTINUE
  240.  
  241. c ERREUR !
  242. IF (.NOT.FLAG) THEN
  243.  
  244. cbp, 2019: "Au moins l'une des matrices doit etre sym. definie positive"
  245. CALL ERREUR(1097)
  246.  
  247. c WRITE(IOIMP,*) 'VIBR ne peut pas resoudre ce probleme :'
  248. IF(QUAD) THEN
  249. c WRITE(IOIMP,*) 'M n est pas symetrique semi-definie positive !'
  250. ELSE
  251. IF(INVER) THEN
  252. IF(SHIFT .NE. ZERO) THEN
  253. c WRITE(IOIMP,*) 'K n est pas symetrique semi-definie positive'
  254. c WRITE(IOIMP,*) 'ou M n est pas symetrique !'
  255. ELSE
  256. c WRITE(IOIMP,*) 'on ne doit pas passer par la !'
  257. CALL ERREUR(5)
  258. ENDIF
  259. ELSE
  260. c WRITE(IOIMP,*) 'on ne doit pas passer par la !'
  261. CALL ERREUR(5)
  262. ENDIF
  263. ENDIF
  264. ENDIF
  265.  
  266.  
  267. END
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  

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