Télécharger manur4.eso

Retour à la liste

Numérotation des lignes :

manur4
  1. C MANUR4 SOURCE CB215821 22/12/14 12:37:37 11527
  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. SEGINI,xMATRI
  95. IPMATR = xMATRI
  96. * SEGINI,XMATRI
  97. * DO 100 IB100=1,NELRIG
  98. * IMATTT(IB100) = XMATRI
  99. * 100 CONTINUE
  100. * END DO
  101. * SEGDES,IMATRI
  102. *
  103. * RQ: "XMATRI" EST GARDE ACTIF.
  104. *
  105. SEGACT,MTEMP4
  106. NBLREE = ILREEL(/1)
  107. *
  108. ************************************************************************
  109. * Cas 1 seul LISTREEL
  110. ************************************************************************
  111. IF (NBLREE .EQ. 1) THEN
  112. *
  113. MLREEL = ILREEL(1)
  114. SEGACT,MLREEL
  115. C ... LVA1 = nombre de termes d'une matrice carrée défini par
  116. C sa moitié ...
  117. LVA1=NLIGRP*(NLIGRP+1)/2
  118. IF (LVAL .NE. PROG(/1).AND.PROG(/1).NE.LVA1 ) THEN
  119. NUMERR = 199
  120. PRINT *,'On attend ',LVAL, ' termes',NLIGRP
  121. CALL ERREUR (NUMERR)
  122. RETURN
  123. END IF
  124. *
  125. C ... ILA = N° de ligne de la matrice élémentaire ...
  126. ILA=1
  127. C ... ILC = N° de colonne de la matrice élémentaire ...
  128. ILC=1
  129.  
  130. C ... ZTRI dit si toutes les composantes ont été données ou
  131. C juste le triangle inférieur ...
  132. ZTRI=.FALSE.
  133. cbp IF(PROG(/1).EQ.LVA1) ZTRI=.TRUE.
  134. IF(PROG(/1).EQ.LVA1.AND.PROG(/1).NE.LVAL) ZTRI=.TRUE.
  135. IF(ZTRI .AND. IANTI.EQ.2) THEN
  136. CALL ERREUR(731)
  137. C ... On laisse les cochonneries dans XMATRI ...
  138. * SEGDES,XMATRI
  139. C ... puis on s'en va ...
  140. RETURN
  141. ENDIF
  142.  
  143. DO 200 IB200=1,PROG(/1)
  144.  
  145. RE(ILA,ILC,1) = PROG(IB200)
  146.  
  147. IF(ZTRI) THEN
  148. IF(IANTI.EQ.1) THEN
  149. RE(ILC,ILA,1)=-PROG(IB200)
  150. ELSE
  151. RE(ILC,ILA,1)=PROG(IB200)
  152. ENDIF
  153. ENDIF
  154.  
  155. ILC=ILC+1
  156. C ... On passe à la ligne si on a traversé la diagonale (cas triangulaire) ...
  157. IF(ILC.GT.ILA.AND. ZTRI) THEN
  158. ILC=1
  159. ILA=ILA+1
  160. ENDIF
  161.  
  162. C ... On passe à la ligne si on est au bout (cas plein) ...
  163. IF(ILC.GT.NLIGRP) THEN
  164. ILC=1
  165. ILA=ILA+1
  166. ENDIF
  167.  
  168. 200 CONTINUE
  169. do ib=2,nelrig
  170. do io=1,nligrp
  171. do iu=1,nligrd
  172. re(iu,io,ib)=re(iu,io,1)
  173. enddo
  174. enddo
  175. enddo
  176. * END DO
  177. *
  178. SEGDES,MLREEL
  179.  
  180.  
  181. ************************************************************************
  182. * Cas plusieurs LISTREEL
  183. ************************************************************************
  184. ELSE IF (NBLREE .GT. 1) THEN
  185. *
  186. IF (NBLREE .EQ. NLIGRD) THEN
  187. *
  188. MLREEL=ILREEL(1)
  189. SEGACT MLREEL
  190.  
  191. C ... Cas triangulaire ? ...
  192. ZTRI=.FALSE.
  193. IF(PROG(/1).EQ.1) ZTRI=.TRUE.
  194. IF(ZTRI .AND. IANTI.EQ.2) THEN
  195. CALL ERREUR(731)
  196. C ... On laisse les cochonneries dans XMATRI ...
  197. * SEGDES,XMATRI
  198. C ... puis on s'en va ...
  199. RETURN
  200. ENDIF
  201.  
  202. C ... Boucle sur les lignes (IB300 = N° de la ligne) ...
  203. DO 300 IB300=1,NBLREE
  204. *
  205. MLREEL = ILREEL(IB300)
  206. SEGACT,MLREEL
  207. LONG = PROG(/1)
  208. C ... Cas lignes pleines : longueur doit être NLIGRP ...
  209. IF (.not.ZTRI .AND. LONG.NE.NLIGRP) THEN
  210. NUMERR = 200
  211. CALL ERREUR (NUMERR)
  212. RETURN
  213. END IF
  214. C ... Cas triangulaire : longueur doit être N° de la ligne ...
  215. IF (ZTRI .AND. LONG.NE.IB300) THEN
  216. NUMERR = 200
  217. CALL ERREUR (NUMERR)
  218. RETURN
  219. END IF
  220.  
  221. C ... Boucle sur les colonnes (IB310 = N° de la colonne) ...
  222. DO 310 IB310=1,LONG
  223.  
  224. RE(IB300,IB310,1) = PROG(IB310)
  225. IF(IANTI.EQ.1.AND.ZTRI) RE(IB310,IB300,1)=-RE(IB300,IB310,1)
  226. IF(IANTI.EQ.0.AND.ZTRI) RE(IB310,IB300,1)=RE(IB300,IB310,1)
  227.  
  228. 310 CONTINUE
  229. * END DO
  230. *
  231. SEGDES,MLREEL
  232. *
  233. 300 CONTINUE
  234. do ib=2,nelrig
  235. do io=1,nligrp
  236. do iu=1,nligrd
  237. re(iu,io,ib)=re(iu,io,1)
  238. enddo
  239. enddo
  240. enddo
  241. * END DO
  242.  
  243. C ... c.à.d. le nombre de LISTREEL est différent du nombre de variables duales ...
  244. ELSE
  245. *
  246. NUMERR = 201
  247. CALL ERREUR (NUMERR)
  248. RETURN
  249. *
  250. END IF
  251.  
  252.  
  253. ************************************************************************
  254. * Cas aucun LISTREEL !
  255. ************************************************************************
  256. ELSE
  257. *
  258. * AUCUN 'LISTREEL' N'A ETE FOURNI EN DONNEE.
  259. MOTERR(1:8) = 'LISTREEL'
  260. NUMERR = 37
  261. CALL ERREUR (NUMERR)
  262. RETURN
  263. *
  264. END IF
  265.  
  266.  
  267. ************************************************************************
  268. * VERIFICATION EN FONCTION DES CAS (ajout, bp 2020)
  269. ************************************************************************
  270.  
  271. IF(IANTI.EQ.0) THEN
  272. XMATRI.SYMRE=0
  273. IF(.NOT.ZTRI) THEN
  274. * SI SYM ET COMPLET : VERIF DES TERMES EXTRA-DIAGONAUX Aij=Aji
  275. call versym(re,re(/1),re(/2),re(/3),IANTI)
  276. if (ierr.ne.0) return
  277.  
  278. * ELSE
  279. * SI SYM ET TRIANGULAIRE : PAS DE VERIF
  280. ENDIF
  281.  
  282. ELSEIF(IANTI.EQ.1) THEN
  283. XMATRI.SYMRE=1
  284. IF(ZTRI) THEN
  285. * SI ANTI-SYM ET TRIANGULAIRE : VERIF DE LA DIAGONALE
  286. xzref=(xpetit/xzprec)
  287. do iel=1,re(/3)
  288. do ir=1,re(/1)
  289. re1=re(ir,ir,iel)
  290. if (abs(re1).gt.xzref) then
  291. MOTERR(1:15)='ANTI-SYMETRIQUE'
  292. reaerr(1)=re1
  293. reaerr(2)=0.D0
  294. reaerr(3)=abs(re1)
  295. call erreur(1044)
  296. return
  297. endif
  298. enddo
  299. enddo
  300.  
  301. ELSE
  302. * SI ANTI-SYM ET COMPLET : VERIF DE TOUS LES TERMES Aij=-Aji
  303. call versym(re,re(/1),re(/2),re(/3),IANTI)
  304. if (ierr.ne.0) return
  305. ENDIF
  306.  
  307. ELSE
  308. * SI QUELCONQUE : On place SYMRE
  309. XMATRI.SYMRE=2
  310. ENDIF
  311.  
  312. SEGDES,XMATRI
  313. SEGDES,MTEMP4
  314.  
  315. END
  316.  
  317.  

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