Télécharger diagne.eso

Retour à la liste

Numérotation des lignes :

diagne
  1. C DIAGNE SOURCE PB245956 20/12/21 21:15:05 10747
  2. SUBROUTINE DIAGNE
  3. ************************************************************************
  4. *
  5. * D I A G N E
  6. * -----------
  7. *
  8. * SOUS-PROGRAMME ASSOCIE A L'OPERATEUR "DIAGNEG"
  9. *
  10. * FONCTION:
  11. * ---------
  12. * DONNER LE NOMBRE DE TERMES DIAGONAUX NEGATIFS DE LA MATICE
  13. * DIAGONALE "D" D'UNE 'RIGIDITE' DECOMPOSEE EN L.D.LT
  14. *
  15. * PHRASE D'APPEL (EN GIBIANE):
  16. * ----------------------------
  17. * NOMBRE = DIAGNEG RIGID ;
  18. *
  19. * ARGUMENTS (EN GIBIANE):
  20. * -----------------------
  21. * RIGID 'RIGIDITE' MATRICE DE RIGIDITE.
  22. * NOMBRE 'ENTIER ' NOMBRE DE TERMES DIAGONAUX NEGATIFS.
  23. *
  24. * DICTIONNAIRE DES VARIABLES: (ORDRE ALPHABETIQUE)
  25. * ---------------------------
  26. * IPRIGI ENTIER POINTEUR SUR "RIGID".
  27. * INFER0 ENTIER CONTENU DE "NOMBRE".
  28. *
  29. * SOUS-PROGRAMMES APPELES: LIRE, ECRIRE, DIAGN1.
  30. *
  31. * CREATION: PASCAL MANIGOT, 8 OCTOBRE 1984
  32. * MODIF : - correction bug si on utilise DIAG puis RESO (BP, 12/05/2011)
  33. * en utilisant syntaxe de RESOU
  34. * - idem mais en gardant la syntaxe d'origine (BP, 12/09/2011)
  35. * - grand menage: hormis la lecture des entrees, tout est
  36. * sous traite a diagn1 (pb, dec2020)
  37. * LANGAGE: FORTRAN77 + EXTENSION: CARACTERES MIS DANS DES ENTIERS
  38. *
  39. ************************************************************************
  40. *
  41. IMPLICIT INTEGER(I-N)
  42.  
  43. -INC PPARAM
  44. -INC CCOPTIO
  45. *-INC SMRIGID
  46. *-INC SMELEME
  47.  
  48. * INTEGER lagdu
  49. *
  50. *
  51. *
  52. cpb nov2020: variable denevue caduque
  53. c lagdu=0
  54. ICODE = 1
  55. CALL LIROBJ ('RIGIDITE',IPRIGI,ICODE,IRETOU)
  56. if (ierr.ne.0) return
  57.  
  58. c c bp: ancienne methode -----------------------------------------------*
  59. c call dbblx(iprigi,lagdu)
  60. c IF(IERR .NE. 0) RETURN
  61.  
  62. c c bp: nouvelle methode (basee sur RESOU) -----------------------------*
  63. c IPRIG0=IPRIGI
  64. c ipoiri=IPRIGI
  65. c * verification pas de blocage en double
  66. c call verlag(ipoiri)
  67. c if(ierr.ne.0) return
  68. c * y a t il des matrices de relations non unilaterales
  69. c ipoir0 = ipoiri
  70. c mrigid=ipoiri
  71. c segact mrigid
  72. c nrige= irigel(/1)
  73. c idepe=0
  74. c nbr = irigel(/2)
  75. c do 1000 irig = 1,nbr
  76. c meleme=irigel(1,irig)
  77. c segact meleme
  78. c if((irigel(6,irig).eq.0.or.nounil.eq.1).and.itypel.eq.22)
  79. c & idepe=idepe+1
  80. c if(irigel(6,irig).ne.0) iunil=1
  81. c segdes meleme
  82. c 1000 continue
  83. c * idepe=0
  84. c lagdua=0
  85. c
  86. c if (idepe.ne.0) then
  87. c
  88. c C on va separer les raideurs
  89. c if (jrcond.eq.0) then
  90. c call separm(mrigid,ri1,ri2,nounil,lagdua)
  91. c segact mrigid*mod
  92. c jrelim=ri1
  93. c jrgard=ri2
  94. c imlag=lagdua
  95. c call fusrig(ri1,ri2,ipoir0)
  96. c jrtot=ipoir0
  97. c else
  98. c ri1=jrelim
  99. c ri2=jrgard
  100. c ipoir0=jrtot
  101. c lagdua=imlag
  102. c ipt1=lagdua
  103. c if(ipt1.ne.0) segact ipt1
  104. c endif
  105. c iri1s=ri1
  106. c iri2s=ri2
  107. c C
  108. c 1010 continue
  109. c C
  110. c * mrigid matrice complete
  111. c * ri1 dependance
  112. c * ri2 les autres matrices
  113. c * ri6 matrice de transfert
  114. c * ri3 matrice reduite
  115. c * ri5 matrice de transfert transposee
  116. c C
  117. c C on va proceder a la condensation rigidite
  118. c if (jrcond.eq.0) then
  119. c CALL DEPEN3(RI1,RI6)
  120. c call scnd2 (ri2,ri6,ri3)
  121. c segact ri3
  122. c if (ierr.ne.0) then
  123. c segsup ri1,ri2,ri6
  124. c return
  125. c endif
  126. c segact mrigid*mod
  127. c jrcond=ri3
  128. c JRDEPP=RI6
  129. c C dualisation de la (les) matrice(s) de dependance
  130. c call dual00(ri6,ri5)
  131. c jrdepd=ri5
  132. c ipoiri = ri3
  133. c else
  134. c ipoiri= jrcond
  135. c RI6 = JRDEPP
  136. c ri5 = jrdepd
  137. c endif
  138. c * test si ri3 est vide
  139. c ri3=jrcond
  140. c segact ri3
  141. c if(ri3.irigel(/2).eq.0) imtvid=1
  142. c C
  143. c segdes ri1,ri2,mrigid
  144. c
  145. c noid = 1
  146. c endif
  147. c
  148. c * bp : on fournit ipoiri = jrcond de IPRIG0 a DIAGN1 qui fait le reste
  149. c IPRIGI=ipoiri
  150.  
  151. c bp: ancienne methode corrigée --------------------------------------*
  152. * on travaille desormais sur une copie locale du mrigid
  153. c
  154. c mrigid=IPRIGI
  155. c segini,RI1=mrigid
  156. c IPRIGI=RI1
  157. c
  158. *pb nov20: plus necessaire de dualiser grace a rigeli
  159. * segact ri1
  160. * imlagl = ri1.imlag
  161. * if (imlagl.eq.0) call dbblx(iprigi,lagdu)
  162. * IF(IERR .NE. 0) RETURN
  163. *
  164. c bp: fin de la distinction entre methodeS ----------------------------*
  165. *
  166. CALL DIAGN1 (IPRIGI,INFER0)
  167. IF(IERR.NE.0) RETURN
  168. *
  169. CALL ECRENT (INFER0)
  170. *
  171. c
  172. * destruction objets "locaux" (version ancienne methode corrigée)
  173. c SEGSUP RI1
  174. c pb aout20: plus necessaire car plus de dualisation
  175. c ipt1=lagdu
  176. c if(imlagl.eq.0.and.ipt1.ne.0) segsup,ipt1
  177. c*
  178. END
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  

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