Télécharger shole3.eso

Retour à la liste

Numérotation des lignes :

shole3
  1. C SHOLE3 SOURCE MB234859 26/01/26 21:15:12 12460
  2. SUBROUTINE SHOLE3(IPREL,IDERL,LPL,KIDEPN,IMASQ,
  3. & IPPR,IDDR,NBG1,IVPO1)
  4. C
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8(A-H,O-Z)
  7. -INC SMRIGID
  8. -INC CCHOLE
  9. -INC CCREEL
  10. DIMENSION IVPO1(*),IMASQ(*)
  11. C
  12. C Recuperer en cas de super element dans cchole
  13. nbnnma=nbnnmc
  14. C
  15. C Nombre de ddl sur chaque ligne
  16. NA=IDERL-IPREL+1
  17. NA1=IDDR-IPPR+1
  18. C Nombre de termes sur la ligne
  19. nval=lpl
  20. C Colonne de la premiere valeur non nulle
  21. idepv=iprel-nval+1
  22. C
  23. C Ne faire les operations que si le masque est nul
  24. kidepg=kidepn
  25. icpt=0
  26. do 121 im1=1,na1
  27. icmv=ippr+im1-idepv
  28. if(icmv.le.0) goto 121
  29. imsq=imasq(masqa(icmv))
  30. if (imsq.le.0) goto 121
  31. imh=masqh(imsq)+masqd(icmv)-1
  32. if ((imh+IDEPV-1).lt.ippr) goto 121
  33. imh=masqb(imsq)+masqd(icmv)-1
  34. if ((imh+IDEPV-1).gt.iddr) goto 121
  35. C
  36. IPOSI=ICMV-MASQD(ICMV)+1
  37. IF (IMSQ.LE.0) THEN
  38. msqb=iposi
  39. msqh=iposi
  40. ELSE
  41. MSQH=MAX(MASQH(IMSQ),IPOSI)
  42. MSQB=MIN(MASQB(IMSQ),IPOSI)
  43. ENDIF
  44. IMASQ(MASQA(ICMV))=MASQV(MSQB,MSQH)
  45. C
  46. kidepg=max(kidepg,icmv)
  47. icpt=icpt+1
  48. 121 continue
  49. C
  50. if (icpt.eq.na1) then
  51. kidepn=max(kidepn,ippr+na1-1-idepv+1)
  52. goto 998
  53. endif
  54. C
  55. nval1=ivpo1(2*(nbg1+1)-1)-1
  56. idepv1=ippr-nval1+1
  57. imb=idepv1-idepv
  58. C
  59. C Boucles sur les groupes de valeurs (hors groupe diagonal)
  60. DO 10 IG1=1,NBG1-1
  61. ildeb1=ivpo1(2*ig1)
  62. ilfin1=ivpo1(2*(ig1+1))-1
  63. ideb1=ivpo1(2*ig1-1)
  64. ifin1=ideb1+ilfin1-ildeb1
  65. ifin1=min(ifin1,nbnnma-idepv1+1)
  66. C
  67. ideb1n=max(1-imb,ideb1)
  68. long=ifin1-ideb1n+1
  69. lond=min(long,kidepg-imb-ideb1n+1)
  70. ifin1=lond+ideb1n-1
  71. C
  72. IF (IFIN1.LT.1-IMB) GOTO 10
  73. IF (IDEB1N.GT.IFIN1) GOTO 10
  74. IF (LOND.LE.0) GOTO 10
  75. C
  76. MIPOSR=MASQA(IDEB1N+IMB)
  77. MIFIN1=MASQA(IFIN1 +IMB)
  78. 15 CONTINUE
  79. IF (MIPOSR.GT.MIFIN1) GOTO 10
  80. IMSQ=IMASQ(MIPOSR)
  81. IF (IMSQ.LE.0) THEN
  82. IMSQ=-IMSQ
  83. IF (IMSQ.GT.(IFIN1+IMB)) GOTO 10
  84. ELSE
  85. **msq
  86. IMSQ=masqh(imsq)+(miposr-1)*masdim
  87. IF (IMSQ.LT.(IDEB1N+IMB)) THEN
  88. MIPOSR=MIPOSR+1
  89. GOTO 15
  90. ENDIF
  91. ENDIF
  92. C
  93. IVAB=IPPR-IDEPV+1
  94. DO 300 IA1=0,NA1-1
  95. IVAD=IVAB+IA1
  96. IPOSI=IVAD-MASQD(IVAD)+1
  97. MVAD=MASQA(IVAD)
  98. IMSQ=IMASQ(MVAD)
  99. IF (IMSQ.LE.0) THEN
  100. MSQH=IPOSI
  101. MSQB=IPOSI
  102. ELSE
  103. MSQH=MAX(MASQH(IMSQ),IPOSI)
  104. MSQB=MIN(MASQB(IMSQ),IPOSI)
  105. ENDIF
  106. IMASQ(MVAD)=MASQV(MSQB,MSQH)
  107. 300 CONTINUE
  108. C
  109. C Mise a jour du masque
  110. IUY=MASQB(IMASQ(MASQA(IVAB)))+MASQD(IVAB)-1
  111. DO IMT=MASQA(IVAB)-1,1,-1
  112. IF (IMASQ(IMT).GT.0) GOTO 215
  113. C IMASQ(IMT)=-IVAB
  114. IMASQ(IMT)=-IUY
  115. ENDDO
  116. 215 CONTINUE
  117. C
  118. kidepn=max(kidepn,ivad)
  119. C
  120. GOTO 999
  121. 10 CONTINUE
  122. C
  123. 999 CONTINUE
  124. C
  125. C Le groupe diagonal
  126. ivadb=ippr-idepv+1
  127. do 210 im=1,na
  128. ivac=(im-1)*lpl+((im-2)*(im-1))/2
  129. do 220 im1=1,na1
  130. ideb1=ivpo1(2*nbg1-1)
  131. ideb1n=max(1-imb,ideb1)
  132. ifin1=ideb1+im1-2
  133. ifin1=min(ifin1,nbnnma-idepv1+1)
  134. C
  135. if (ifin1-ideb1n.ge.0) then
  136. ivad=ippr-idepv+im1+ivac
  137. if (ivad.lt.1) goto 220
  138. ivadb=ippr-idepv+im1
  139. if (ivadb.lt.1) goto 220
  140. C
  141. iposr=ideb1n+imb
  142. do 200 ipos=ideb1n,ifin1
  143. miposr=masqa(iposr)
  144. imsq=imasq(miposr)
  145. if (imsq.le.0) goto 217
  146. **msq
  147. msqh=MASQH(IMSQ)
  148. msqb=MASQB(IMSQ)
  149. if (msqh.eq.0) then
  150. write(*,*) 'erreur interne shole3'
  151. call erreur(5)
  152. endif
  153. imsq=msqh+MASQD(IPOSR)-1
  154. if (imsq.lt.(IDEB1N+IMB)) goto 217
  155. C if (imsq.ge.(IFIN1+IMB)) goto 217
  156. imsq=msqb+MASQD(IPOSR)-1
  157. if (imsq.gt.(IFIN1+IMB)) goto 217
  158. C
  159. iadd=masqa(ivadb)
  160. iposi=ivadb-masqd(ivadb)+1
  161. IMSQ=IMASQ(iadd)
  162. IF (IMSQ.LE.0) THEN
  163. MSQH=IPOSI
  164. MSQB=IPOSI
  165. ELSE
  166. MSQH=MAX(MASQH(IMSQ),IPOSI)
  167. MSQB=MIN(MASQB(IMSQ),IPOSI)
  168. ENDIF
  169. IMASQ(IADD)=MASQV(MSQB,MSQH)
  170. C
  171. IUY=MASQB(IMASQ(IADD))+MASQD(IVADB)-1
  172. do imt=iadd-1,1,-1
  173. if (imasq(imt).gt.0) goto 213
  174. C imasq(imt)=-IVADB
  175. imasq(imt)=-IUY
  176. enddo
  177. 217 continue
  178. iposr=iposr+1
  179. 200 continue
  180. goto 220
  181. 213 continue
  182. kidepn=max(kidepn,ivadb)
  183. endif
  184. 220 continue
  185. 210 continue
  186. C
  187. 998 CONTINUE
  188. END
  189.  
  190.  

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