Télécharger progcs.eso

Retour à la liste

Numérotation des lignes :

progcs
  1. C PROGCS SOURCE CHAT 05/01/13 02:31:16 5004
  2. SUBROUTINE PROGCS
  3. C************************************************************************
  4. C
  5. C CE SOUS PROGRAMME RANGE DANS LES TABLES MATAP, MATAP.METHODE ET
  6. C MATAP.MATRIS LES POINTEURS SUR LES LISTENTI D'ADRESSAGE.
  7. C
  8. C KTYPI= 2,3,4 METHODE DE GRADIENT CONJUGUE AVEC CALCUL
  9. C EXPLICITE DE LA MATRICE DE PRESSION. DANS CE CAS
  10. C PROGCS CONSTRUIT LES TABLEAUX D'INDEXAGE EN
  11. C FONCTION DU MODE DE STOCKAGE DEMANDE : MORSE OU
  12. C COMPRESSE.
  13. C
  14. C SYNTAXE : MTABM = PROGCS MTABP <IMPR> IMPR
  15. C
  16. C************************************************************************
  17. IMPLICIT INTEGER(I-N)
  18. IMPLICIT REAL*8 (A-H,O-Z)
  19. CHARACTER*8 TYPE
  20.  
  21. C***
  22.  
  23.  
  24. -INC PPARAM
  25. -INC CCOPTIO
  26. C*************************************************************************
  27. C
  28. C REPERAGE ET STOKAGE DES MATRICES ELEMENTAIRES puis assemblees
  29. C
  30.  
  31. * LGEOC SPG de la pression et/ou des multiplicateurs de Lagrange
  32. * (points CENTRE ) pour chaque operateur de contrainte
  33. * KGEOC SPG pour la totalite des points CENTRE.
  34. * KGEOS SPG pour la totalite des points SOMMET (Diagonale vitesse)
  35. * KLEMC Connectivites de l'ensemble des contraintes
  36. * LIZAFM(NBSOUS) contient les pointeurs IZAFM des sous-zones
  37.  
  38. SEGMENT MATRAK
  39. INTEGER LGEOC(NBOP),IDEBS(NBOP),IFINS(NBOP)
  40. INTEGER LIZAFM(NBSOUS)
  41. INTEGER IKAM0 (NBSOUS)
  42. INTEGER IMEM (NBELC)
  43. INTEGER KLEMC,KGEOS,KGEOC,KDIAG,KCAC,KIZCL,KIZGC
  44. ENDSEGMENT
  45.  
  46. SEGMENT IZAFM
  47. REAL*8 AM(NNELP,NP,IESP),RPGI(NELAX)
  48. ENDSEGMENT
  49.  
  50. POINTEUR IPMJ.IZAFM,IPMK.IZAFM
  51.  
  52. C*******************************************************************
  53. -INC SMCOORD
  54. -INC SMTABLE
  55. POINTEUR MTABP.MTABLE
  56. POINTEUR MTABM.MTABLE
  57. -INC SMLENTI
  58. POINTEUR IZIPAD.MLENTI
  59. POINTEUR KA.MLENTI
  60. POINTEUR IA.MLENTI
  61. POINTEUR ITAB.MLENTI
  62. -INC SMELEME
  63. POINTEUR IZK.MELEME
  64.  
  65. C
  66. C IVK = Tableau de travail
  67. PARAMETER (MAXIVK=100)
  68. INTEGER IVK(MAXIVK)
  69. C
  70. C MTABP : TABLE MATAP
  71. C MTABM : SOUS-TABLE MATRICE
  72. C MTAB2 : SOUS-TABLE METHODE
  73. C
  74. CHARACTER*4 LMOT(1)
  75.  
  76. PARAMETER (NTB=1)
  77. CHARACTER*8 LTAB(NTB)
  78. DIMENSION KTAB(NTB)
  79. DATA LTAB/'EQPR '/
  80. DATA LMOT/'IMPR'/
  81. C***
  82.  
  83. NTO=1
  84. CALL LITABS(LTAB,KTAB,NTB,NTO,IRET)
  85. IF(IRET.EQ.0)THEN
  86. WRITE(6,*)' On attend une table soustype EQPR'
  87. RETURN
  88. ENDIF
  89.  
  90. IMPR=0
  91. CALL LIRMOT(LMOT,1,IP,0)
  92. IF(IP.NE.0)THEN
  93. CALL LIRENT(IMPR,1,IRET)
  94. IF(IRET.EQ.0)RETURN
  95. ENDIF
  96.  
  97. MTABP=KTAB(1)
  98. SEGACT MTABP
  99.  
  100. TYPE=' '
  101. CALL ACMO(MTABP,'MATC',TYPE,MATRAK)
  102. IF(TYPE.NE.'MATRAK')THEN
  103. WRITE(6,*)' Il n''y a pas d''entree MATRAK dans la table'
  104. RETURN
  105. ENDIF
  106.  
  107. SEGACT MATRAK
  108. KGEO=KGEOC
  109. CALL KNBEL(KGEO,NBELC)
  110. MELEME=KLEMC
  111.  
  112. C--- CALNOE renvoie dans IZTKB un tableau contenant pour chaque noeud
  113. C du domaine la liste des {l{ments poss{dant ce noeud. Les noeuds
  114. C sont rep{r{s dans la num{rotation locale(domaniale), les {l{ments
  115. C sont pris dans l'ordre fourni par la num{rotation naturelle.
  116. C Il est possible, partant de ce tableau, de construire pour chaque
  117. C {l{ment la liste des {l{ments voisins. Ceci est tr}s utile pour
  118. C le calcul de la matrice de pression ou Akl.ne.0 si k et l sont
  119. C deux {l{ments voisins.
  120. C
  121. C Cette technique n'est pas (encore) utilis{e si KTYPI = 1 ou 5.
  122. C Les maillages trait{s dans ce cas {tant "petits", ce n'est pas
  123. C trop grave. Par contre lorsque KTYPI=2,3,4, c'est @ dire pour les
  124. C tr}s gros maillages, son emploi est obligatoire.
  125. C
  126. C Cet appel ne doit etre fait que si on stocke la matrice de
  127. C pression (KTPI.LE.5).
  128. C
  129. CALL KALNO0(MELEME,IZK,MLENTI,IZIPAD,IRET)
  130. IF(IRET.EQ.0)GO TO 90
  131. C
  132. C Creation de la table MATRIS
  133. C
  134. CALL CRTABL(MTABM)
  135. CALL ECMM(MTABM,'SOUSTYPE','MATRIS')
  136.  
  137. C--- Activation de tous les MELEMEs du domaine
  138.  
  139. SEGACT MELEME,IZK,MLENTI
  140. NBSOUS=LISOUS(/1)
  141. IF(NBSOUS.EQ.0)NBSOUS=1
  142. DO 400 NS=1,NBSOUS
  143. IF(NBSOUS.EQ.1)IPT1=MELEME
  144. IF(NBSOUS.NE.1)IPT1=LISOUS(NS)
  145. SEGACT IPT1
  146. 400 CONTINUE
  147.  
  148. * METHODE
  149. TYPE=' '
  150. CALL ACMO(MTABP,'METHODE',TYPE,MTAB2)
  151. SEGACT MTAB2
  152. * KTYPI
  153. CALL ACME(MTAB2,'KTYPI',KTPI)
  154. * KSTOCK
  155. CALL ACME(MTAB2,'KSTOCK',KSTOCK)
  156. C
  157. C---- CALCUL DES TABLEAUX DE VOISINAGE
  158. C
  159. IF(KSTOCK.EQ.0) THEN
  160. JG=NBELC+1
  161. SEGINI IA
  162. ENDIF
  163. C
  164. C---- Le premier travail consiste a fabriquer la liste des voisins de
  165. C chaque element a partir du travail effectue par CALNOE.
  166. C On a la liste des elements auquel appartient chaque noeud. Il faut
  167. C consolider ces informations pour tous les noeuds. Si un noeud
  168. C appartient a l'element k et a l'element l, k et l sont voisins.
  169. C On remplit une table IVK par element. Les tableaux IVK sont
  170. C reunis dans un segment de travail ITAB.
  171. C
  172.  
  173. IF(IDIM.EQ.2) MAJOR=20
  174. IF(IDIM.EQ.3) MAJOR=40
  175. JG=MAJOR*NBELC
  176. SEGINI ITAB
  177.  
  178. MAXVOI=0
  179. LA=0
  180. K=0
  181. IF(KSTOCK.EQ.0) IA.LECT(1)=1
  182. DO 401 NS=1,NBSOUS
  183. IF(NBSOUS.EQ.1)IPT1=MELEME
  184. IF(NBSOUS.NE.1)IPT1=LISOUS(NS)
  185. NP=IPT1.NUM(/1)
  186. NEL=IPT1.NUM(/2)
  187. DO 1000 KK=1,NEL
  188. K=K+1
  189. IVK(1)=1
  190. IVK(2)=K
  191. DO 101 I=1,NP
  192. IU=IZIPAD.LECT(IPT1.NUM(I,KK))
  193. NELV=LECT(IU)
  194. DO 102 KAP=1,NELV
  195. KN=IZK.NUM(KAP,IU)
  196. C
  197. C KN appartient il deja a la liste ? Si oui sauter au KN suivant
  198. C Si non l'ajouter
  199. DO 103 J=1,IVK(1)
  200. IF(IVK(J+1).EQ.KN) GOTO 102
  201. 103 CONTINUE
  202. IVK(1)=IVK(1)+1
  203. IVK(IVK(1)+1)=KN
  204. 102 CONTINUE
  205. 101 CONTINUE
  206.  
  207. C--- LA contient le nombre d'elements de la matrice en morse
  208. C--- MAXVOI est le nombre maxi d'elements voisins d'un element donne
  209. C--- On les remet e jour.
  210.  
  211. IF(IVK(1).GT.MAJOR) THEN
  212. PRINT *,'PROGCS : L''element ',KK,' du sous objet ',NS
  213. PRINT *,' i.e. ',K ,' dans la num. naturelle'
  214. PRINT *,'a un nombre de voisins',ivk(1),
  215. & 'superieur au maxi prevu'
  216. PRINT *,'Est-ce bien raisonnable ?'
  217. PRINT *,'Revoyez votre maillage |'
  218. STOP
  219. END IF
  220. IF(IVK(1).GT.MAXVOI) MAXVOI=IVK(1)
  221. LA=LA+IVK(1)
  222.  
  223. C--- Le tableau IVK contient les connectivites. Il faut le reordonner
  224. C en fonction du mode de stockage demande et stocker dans IA et
  225. C ITAB pour le morse et ITAB seulement pour le mode compresse.
  226. C Pour le morse, comme pour le mode compresse on met en premier l'elt
  227. C lui-meme, puis on range dans l'ordre croissant On complete la table
  228. C jusqu'a MAJOR avec le numero de l'element dans le cas compresse.
  229.  
  230. IF(KSTOCK.EQ.0) THEN
  231. C--- Cas du stockage morse
  232. IA.LECT(K+1)=IA.LECT(K)+IVK(1)
  233. C CALL ITRI(IVK(3),IVK(1)-1)
  234. CALL ORDOTA(IVK(3),IVK(1)-1)
  235. C--- On positionne dans ITAB le tableau IVK
  236. C CALL MOVMEM(IVK(2),IVK(1),ITAB.LECT(IA.LECT(K)))
  237. CALL RSETI(ITAB.LECT(IA.LECT(K)),IVK(2),IVK(1))
  238.  
  239. ELSEIF(KSTOCK.EQ.1) THEN
  240. C--- Cas du stockage compresse
  241. C--- On place en premier dans IVK le terme diagonal
  242. DO 121 I=1,IVK(1)
  243. IF(IVK(I+1).EQ.K) THEN
  244. ID=I+1
  245. GOTO 122
  246. ENDIF
  247. 121 CONTINUE
  248. 122 CONTINUE
  249. C--- On echange
  250. CALL ISWAP(IVK,2,ID,IVK(1)+1)
  251. C--- On r{ordonne le reste du tableau IVK
  252. C CALL ITRI(IVK(3),IVK(1)-1)
  253. CALL ORDOTA(IVK(3),IVK(1)-1)
  254. C--- On comble jusqu'a MAJOR avec le premier numero
  255. IF(IVK(1).LT.MAJOR) THEN
  256. DO 124 I=IVK(1)+1,MAJOR
  257. IVK(I+1)=IVK(2)
  258. 124 CONTINUE
  259. ENDIF
  260. C--- On positionne IVK dans le tableau ITAB (Indexage). ITAB
  261. C est stocke comme s'il etait declare ITAB(NBELC,MAJOR)
  262. DO 125 I=1,MAJOR
  263. IOFF=K+(I-1)*NBELC
  264. ITAB.LECT(IOFF)=IVK(I+1)
  265. 125 CONTINUE
  266. ENDIF
  267.  
  268. 1000 CONTINUE
  269. SEGDES IPT1
  270. 401 CONTINUE
  271. SEGDES MELEME
  272.  
  273. C--- Nous pouvons proceder a l'ajustement de la longueur du segment
  274. C ITAB : LA pour le morse, NEL*MAXVOI pour le mode compresse.
  275.  
  276. IF(KSTOCK.EQ.0) JG=LA
  277. IF(KSTOCK.EQ.1) JG=NBELC*MAXVOI
  278. SEGADJ ITAB
  279.  
  280. IF(KSTOCK.EQ.0) JA=ITAB
  281. IF(KSTOCK.EQ.1) KA=ITAB
  282.  
  283. C!
  284. C Impression de controle
  285. C
  286. IF(IMPR.GE.2) THEN
  287. IF(KSTOCK.EQ.0) THEN
  288. WRITE(6,555) (IA.LECT(K),K=1,NBELC+1)
  289. DO 2345 K=1,NBELC
  290. WRITE(6,555) (ITAB.LECT(I),I=IA.LECT(K),IA.LECT(K+1)-1)
  291. 2345 CONTINUE
  292. ELSE
  293. DO 1234 K=1,NBELC
  294. WRITE(6,555) (ITAB.LECT(K+(I-1)*NBELC),I=1,MAXVOI)
  295. 555 FORMAT(1X,12(1X,i4))
  296. 1234 CONTINUE
  297. ENDIF
  298. ENDIF
  299. C!
  300. SEGDES ITAB
  301. IF(KSTOCK.EQ.0) SEGDES IA
  302. IF(KSTOCK.EQ.0) LONG=LA
  303. IF(KSTOCK.EQ.1) LONG=NBELC*MAXVOI
  304. IF(IMPR.GE.1) WRITE(6,200)LONG
  305. C
  306. CALL ECME(MTABM,'NL',NBELC)
  307. CALL ECME(MTAB2,'NL',NBELC)
  308. CALL ECME(MTAB2,'NPTC',NPTC)
  309. TYPE=' '
  310.  
  311. IF(KSTOCK.EQ.0) THEN
  312. CALL ECMO(MTABM,'IA','LISTENTI',IA)
  313. CALL ECMO(MTABM,'JA','LISTENTI',JA)
  314. CALL ECME(MTABM,'LA',LA)
  315. CALL ECME(MTABM,'ILG',LA)
  316. ELSE
  317. SEGACT KA
  318. NNZ=KA.LECT(/1)/NBELC
  319. CALL ECMO(MTABM,'KA','LISTENTI',KA)
  320. CALL ECME(MTABM,'NNZ',NNZ)
  321. CALL ECME(MTABM,'ILG',NNZ)
  322. SEGDES KA
  323. ENDIF
  324.  
  325. SEGSUP IZK,IZIPAD,MLENTI
  326.  
  327. CALL ECROBJ('TABLE',MTABM)
  328.  
  329. RETURN
  330. 90 CONTINUE
  331. WRITE(6,*)' Retour anormal de PROGCS'
  332. RETURN
  333. 200 FORMAT(10X,1H*,9X,'.... TAILLE DE LA MATRICE DE PRESSION ',I7,
  334. *' MOTS',13X,1H*)
  335. END
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  

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