Télécharger manur4.eso

Retour à la liste

Numérotation des lignes :

manur4
  1. C MANUR4 SOURCE PV090527 26/04/30 21:15:51 12529
  2. SUBROUTINE MANUR4 (IPELEM,IPDESC,MTEMP4,IPMATR,IANTI)
  3. ************************************************************************
  4. *
  5. * M A N U R 4
  6. * -----------
  7. *
  8. * FONCTION:
  9. * ---------
  10. *
  11. * CONSTRUCTION DES MATRICES ELEMENTAIRES DE RIGIDITE POUR UN OBJET
  12. * 'RIGIDITE' CREE MANUELLEMENT.
  13. * L'UTILISATION DE CE SOUS-PROGRAMME N'EST PAS UNIVERSELLE.
  14. *
  15. * MODE D'APPEL:
  16. * -------------
  17. *
  18. * CALL MANUR4 (IPELEM,IPDESC,MTEMP4,IPMATR,IANTI)
  19. *
  20. * PARAMETRES: (E)=ENTREE (S)=SORTIE
  21. * -----------
  22. *
  23. * IPELEM ENTIER (E) POINTEUR DE L'OBJET 'MAILLAGE' SUR LEQUEL
  24. * VA S'APPUYER LA 'RIGIDITE'.
  25. * IPDESC ENTIER (E) POINTEUR SUR LE SEGMENT DESCRIPTEUR DE
  26. * L'OBJET 'RIGIDITE'.
  27. * MTEMP4 SEGMENT (E) REGROUPEMENT DE POINTEURS SUR DES
  28. * 'LISTREEL'.
  29. * SOIT IL N'Y A QU'1 'LISTREEL', QUI CONTIENT
  30. * TOUS LES TERMES DE LA
  31. * MATRICE ELEMENTAIRE DE RIGIDITE, ECRITS
  32. * LIGNE PAR LIGNE,
  33. * SOIT IL Y A AUTANT DE 'LISTREEL' QUE DE
  34. * LIGNES DANS LA MATRICE ELEMENTAIRE DE
  35. * RIGIDITE, LE N-IEME 'LISTREEL' DECRIVANT LA
  36. * N-IEME LIGNE DE LA MATRICE .
  37. * IPMATR ENTIER (S) POINTEUR SUR LE SEGMENT CONTENANT LA LISTE
  38. * DES POINTEURS DES MATRICES ELEMENTAIRES DE
  39. * RIGIDITE.
  40. *
  41. * EXEMPLE DE PRESENTATION DE LA MATRICE ELEMENTAIRE :
  42. * | A B C |
  43. * | D E F |
  44. * | G H I |
  45. * Elle peut etre donnee par: (PROG A B C D E F G H I )
  46. * ou bien par : (PROG A B C ) (PROG D E F) (PROG G H I )
  47. * si la matrice est symetrique ou antisymetrique on peut aussi
  48. * la decrire par 1 LISTREEEL : (PROG A D E G H I )
  49. * ou bien par plusieurs LISTREEL : (PROG A ) (PROG D E) (PROG G H I)
  50. *
  51. * LEXIQUE: (ORDRE ALPHABETIQUE)
  52. * --------
  53. *
  54. * LONG ENTIER LONGUEUR DU 'LISTREEL' TRAITE.
  55. * NBLREE ENTIER NOMBRE DE 'LISTREEL' REFERENCES PAR "MTEMP4".
  56. *
  57. * LES AUTRES VARIABLES IMPORTANTES SONT EXPLIQUEES DANS LES MODULES
  58. * INCLUS.
  59. *
  60. ************************************************************************
  61. *
  62. IMPLICIT INTEGER(I-N)
  63. LOGICAL ZTRI
  64. -INC PPARAM
  65. -INC CCOPTIO
  66. -INC SMELEME
  67. -INC SMLREEL
  68. -INC SMRIGID
  69. -INC CCREEL
  70. *
  71. SEGMENT /MTEMP4/ (ILREEL(0))
  72.  
  73. ************************************************************************
  74. * INITIALISATIONS ET OUVERTURE
  75. ************************************************************************
  76.  
  77. *
  78. MELEME = IPELEM
  79. SEGACT,MELEME
  80. NELRIG = NUM(/2)
  81. SEGDES,MELEME
  82. *
  83. DESCR = IPDESC
  84. SEGACT,DESCR
  85. C ... La distinction entre les deux nombres est un peu artificielle,
  86. C car manur3 vérifie si les listmots sont de longueurs égales,
  87. C on en a juste besoin pour initialiser XMATRI ...
  88. NLIGRP = NOELEP(/1)
  89. NLIGRD = NOELED(/1)
  90. C ... LVAL = nombre de termes d'une matrice pleine ...
  91. LVAL = NLIGRP * NLIGRD
  92. SEGDES,DESCR
  93. *
  94. rigrel=0
  95. SEGINI,xMATRI
  96. IPMATR = xMATRI
  97. * SEGINI,XMATRI
  98. * DO 100 IB100=1,NELRIG
  99. * IMATTT(IB100) = XMATRI
  100. * 100 CONTINUE
  101. * END DO
  102. * SEGDES,IMATRI
  103. *
  104. * RQ: "XMATRI" EST GARDE ACTIF.
  105. *
  106. SEGACT,MTEMP4
  107. NBLREE = ILREEL(/1)
  108. *
  109. ************************************************************************
  110. * Cas 1 seul LISTREEL
  111. ************************************************************************
  112. IF (NBLREE .EQ. 1) THEN
  113. *
  114. MLREEL = ILREEL(1)
  115. SEGACT,MLREEL
  116. C ... LVA1 = nombre de termes d'une matrice carrée défini par
  117. C sa moitié ...
  118. LVA1=NLIGRP*(NLIGRP+1)/2
  119. IF (LVAL .NE. PROG(/1).AND.PROG(/1).NE.LVA1 ) THEN
  120. NUMERR = 199
  121. PRINT *,'On attend ',LVAL, ' termes',NLIGRP
  122. CALL ERREUR (NUMERR)
  123. RETURN
  124. END IF
  125. *
  126. C ... ILA = N° de ligne de la matrice élémentaire ...
  127. ILA=1
  128. C ... ILC = N° de colonne de la matrice élémentaire ...
  129. ILC=1
  130.  
  131. C ... ZTRI dit si toutes les composantes ont été données ou
  132. C juste le triangle inférieur ...
  133. ZTRI=.FALSE.
  134. cbp IF(PROG(/1).EQ.LVA1) ZTRI=.TRUE.
  135. IF(PROG(/1).EQ.LVA1.AND.PROG(/1).NE.LVAL) ZTRI=.TRUE.
  136. IF(ZTRI .AND. IANTI.EQ.2) THEN
  137. CALL ERREUR(731)
  138. C ... On laisse les cochonneries dans XMATRI ...
  139. * SEGDES,XMATRI
  140. C ... puis on s'en va ...
  141. RETURN
  142. ENDIF
  143.  
  144. DO 200 IB200=1,PROG(/1)
  145.  
  146. RE(ILA,ILC,1) = PROG(IB200)
  147.  
  148. IF(ZTRI) THEN
  149. IF(IANTI.EQ.1) THEN
  150. RE(ILC,ILA,1)=-PROG(IB200)
  151. ELSE
  152. RE(ILC,ILA,1)=PROG(IB200)
  153. ENDIF
  154. ENDIF
  155.  
  156. ILC=ILC+1
  157. C ... On passe à la ligne si on a traversé la diagonale (cas triangulaire) ...
  158. IF(ILC.GT.ILA.AND. ZTRI) THEN
  159. ILC=1
  160. ILA=ILA+1
  161. ENDIF
  162.  
  163. C ... On passe à la ligne si on est au bout (cas plein) ...
  164. IF(ILC.GT.NLIGRP) THEN
  165. ILC=1
  166. ILA=ILA+1
  167. ENDIF
  168.  
  169. 200 CONTINUE
  170. do ib=2,nelrig
  171. do io=1,nligrp
  172. do iu=1,nligrd
  173. re(iu,io,ib)=re(iu,io,1)
  174. enddo
  175. enddo
  176. enddo
  177. * END DO
  178. *
  179. SEGDES,MLREEL
  180.  
  181.  
  182. ************************************************************************
  183. * Cas plusieurs LISTREEL
  184. ************************************************************************
  185. ELSE IF (NBLREE .GT. 1) THEN
  186. *
  187. IF (NBLREE .EQ. NLIGRD) THEN
  188. *
  189. MLREEL=ILREEL(1)
  190. SEGACT MLREEL
  191.  
  192. C ... Cas triangulaire ? ...
  193. ZTRI=.FALSE.
  194. IF(PROG(/1).EQ.1) ZTRI=.TRUE.
  195. IF(ZTRI .AND. IANTI.EQ.2) THEN
  196. CALL ERREUR(731)
  197. C ... On laisse les cochonneries dans XMATRI ...
  198. * SEGDES,XMATRI
  199. C ... puis on s'en va ...
  200. RETURN
  201. ENDIF
  202.  
  203. C ... Boucle sur les lignes (IB300 = N° de la ligne) ...
  204. DO 300 IB300=1,NBLREE
  205. *
  206. MLREEL = ILREEL(IB300)
  207. SEGACT,MLREEL
  208. LONG = PROG(/1)
  209. C ... Cas lignes pleines : longueur doit être NLIGRP ...
  210. IF (.not.ZTRI .AND. LONG.NE.NLIGRP) THEN
  211. NUMERR = 200
  212. CALL ERREUR (NUMERR)
  213. RETURN
  214. END IF
  215. C ... Cas triangulaire : longueur doit être N° de la ligne ...
  216. IF (ZTRI .AND. LONG.NE.IB300) THEN
  217. NUMERR = 200
  218. CALL ERREUR (NUMERR)
  219. RETURN
  220. END IF
  221.  
  222. C ... Boucle sur les colonnes (IB310 = N° de la colonne) ...
  223. DO 310 IB310=1,LONG
  224.  
  225. RE(IB300,IB310,1) = PROG(IB310)
  226. IF(IANTI.EQ.1.AND.ZTRI) RE(IB310,IB300,1)=-RE(IB300,IB310,1)
  227. IF(IANTI.EQ.0.AND.ZTRI) RE(IB310,IB300,1)=RE(IB300,IB310,1)
  228.  
  229. 310 CONTINUE
  230. * END DO
  231. *
  232. SEGDES,MLREEL
  233. *
  234. 300 CONTINUE
  235. do ib=2,nelrig
  236. do io=1,nligrp
  237. do iu=1,nligrd
  238. re(iu,io,ib)=re(iu,io,1)
  239. enddo
  240. enddo
  241. enddo
  242. * END DO
  243.  
  244. C ... c.à.d. le nombre de LISTREEL est différent du nombre de variables duales ...
  245. ELSE
  246. *
  247. NUMERR = 201
  248. CALL ERREUR (NUMERR)
  249. RETURN
  250. *
  251. END IF
  252.  
  253.  
  254. ************************************************************************
  255. * Cas aucun LISTREEL !
  256. ************************************************************************
  257. ELSE
  258. *
  259. * AUCUN 'LISTREEL' N'A ETE FOURNI EN DONNEE.
  260. MOTERR(1:8) = 'LISTREEL'
  261. NUMERR = 37
  262. CALL ERREUR (NUMERR)
  263. RETURN
  264. *
  265. END IF
  266.  
  267.  
  268. ************************************************************************
  269. * VERIFICATION EN FONCTION DES CAS (ajout, bp 2020)
  270. ************************************************************************
  271.  
  272. IF(IANTI.EQ.0) THEN
  273. XMATRI.SYMRE=0
  274. IF(.NOT.ZTRI) THEN
  275. * SI SYM ET COMPLET : VERIF DES TERMES EXTRA-DIAGONAUX Aij=Aji
  276. call versym(re,re(/1),re(/2),re(/3),IANTI)
  277. if (ierr.ne.0) return
  278.  
  279. * ELSE
  280. * SI SYM ET TRIANGULAIRE : PAS DE VERIF
  281. ENDIF
  282.  
  283. ELSEIF(IANTI.EQ.1) THEN
  284. XMATRI.SYMRE=1
  285. IF(ZTRI) THEN
  286. * SI ANTI-SYM ET TRIANGULAIRE : VERIF DE LA DIAGONALE
  287. xzref=(xpetit/xzprec)
  288. do iel=1,re(/3)
  289. do ir=1,re(/1)
  290. re1=re(ir,ir,iel)
  291. if (abs(re1).gt.xzref) then
  292. MOTERR(1:15)='ANTI-SYMETRIQUE'
  293. reaerr(1)=re1
  294. reaerr(2)=0.D0
  295. reaerr(3)=abs(re1)
  296. call erreur(1044)
  297. return
  298. endif
  299. enddo
  300. enddo
  301.  
  302. ELSE
  303. * SI ANTI-SYM ET COMPLET : VERIF DE TOUS LES TERMES Aij=-Aji
  304. call versym(re,re(/1),re(/2),re(/3),IANTI)
  305. if (ierr.ne.0) return
  306. ENDIF
  307.  
  308. ELSE
  309. * SI QUELCONQUE : On place SYMRE
  310. XMATRI.SYMRE=2
  311. ENDIF
  312.  
  313. SEGDES,XMATRI
  314. SEGDES,MTEMP4
  315.  
  316. END
  317.  
  318.  
  319.  
  320.  

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