Télécharger geolin.eso

Retour à la liste

Numérotation des lignes :

geolin
  1. C GEOLIN SOURCE GOUNAND 21/06/02 21:16:11 11022
  2. SUBROUTINE GEOLIN(DFFPG,JCOOR,NBELEM,
  3. $ JMAJAC,JMIJAC,JDTJAC,LERJ,
  4. $ IMPR,IRET)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. IMPLICIT INTEGER (I-N)
  7. C***********************************************************************
  8. C NOM : GEOLIN
  9. C PROJET : Noyau linéaire NLIN
  10. C DESCRIPTION : Calcul de la matrice jacobienne d'une transformation
  11. C géométrique aux points de Gauss d'un élément de
  12. C référence pour chaque élément réel.
  13. C On a :
  14. C Fonction f : R^m -> R^n
  15. C a=(a1...am) |-> f(a)=(f1(a)...fn(a)
  16. C => matjac(i,j)(a)=Dj fi (a) = dfi / dxj (a)
  17. C
  18. C Par exemple, pour une surface en 3D, la matrice jacobienne
  19. C s'exprime comme :
  20. C
  21. C [ <xn> ]
  22. C [J] = [ <yn> ] . [ { dNg/d(ksi) } { dNg/d(eta) } ]
  23. C [ <zn> ]
  24. C
  25. C (3x2) (3 x Nnoeuds) (Nnoeuds x 2)
  26. C
  27. C Ici, le nb de ddl est égal aux nbs de noeuds car l'interpolation
  28. C pour la géométrie est de type nodale.
  29. C
  30. C Si la matrice jacobienne J est carrée, on calcule
  31. C également l'inverse de la matrice jacobienne j ainsi que
  32. C son déterminant : det J (appelé Jacobien).
  33. C Si la matrice jacobienne n'est pas carrée, le Jacobien
  34. C est calculé comme :
  35. C sqrt(det(transpose(J)*J))
  36. C Le but de ce sous-programme est d'effectuer toutes les
  37. C opérations de calcul dépendant uniquement de la
  38. C géométrie (ie de la variable : coordonnées des points).
  39. C
  40. C LANGAGE : ESOPE
  41. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  42. C mél : gounand@semt2.smts.cea.fr
  43. C***********************************************************************
  44. C APPELES : PRCHVA (impression d'un segment de type MCHEVA)
  45. C GEOLI1 (calcul de la matrice jacobienne (fortran 77
  46. C ))
  47. C GEOLI2 (calcul de l'inverse et du déterminant de la
  48. C matrice jacobienne (fortran 77))
  49. C GEOLI3 (calcul de sqrt(det(transpose(J)*J)), J
  50. C étant la matrice jacobienne (fortran 77))
  51. C APPELE PAR : NLIN
  52. C***********************************************************************
  53. C ENTREES : * DFFPG (type MCHEVA) : valeurs des dérivées
  54. C premières des fonctions d'interpolation de la
  55. C transformation géométrique aux points de gauss
  56. C sur l'élément de référence.
  57. C Structure (cf.include SMCHAEL) :
  58. C (1, nb. ddl, 1, dim.esp.réf, nb. poi. gauss, 1)
  59. C * JCOOR (type MCHEVA) : valeurs des ddl de la
  60. C transformation géométrique sur le maillage
  61. C élémentaire courant.
  62. C Structure (cf.include SMCHAEL) :
  63. C (1, nb. ddl, 1, dim. esp. réel,
  64. C 1, nb. éléments)
  65. C * NBELEM (type entier) : nombre d'éléments du
  66. C maillage élémentaire courant.
  67. C ENTREES/SORTIES : -
  68. C SORTIES : * JMAJAC (type MCHEVA) : valeurs de la matrice
  69. C jacobienne aux points de Gauss sur le maillage
  70. C élémentaire courant.
  71. C Structure (cf.include SMCHAEL) :
  72. C (1, 1, dim. esp. réel, dim. esp. référence,
  73. C nb. poi. gauss, nb. éléments)
  74. C * JMIJAC (type MCHEVA) : valeurs de l'inverse de
  75. C la matrice jacobienne aux points de Gauss sur
  76. C le maillage élémentaire courant.
  77. C Structure (cf.include SMCHAEL) :
  78. C (1, 1, dim. esp. référence, dim. esp. réel,
  79. C nb. poi. gauss, nb. éléments)
  80. C JMIJAC n'existe que si dim.esp.réf=dim.esp.réel
  81. C * JDTJAC (type MCHEVA) : valeurs du déterminant
  82. C de la matrice jacobienne aux points de Gauss
  83. C sur le maillage élémentaire courant.
  84. C Structure (cf.include SMCHAEL) :
  85. C (1, 1, 1, 1, nb. poi. gauss, nb. éléments)
  86. C Si la matrice jacobienne n'est pas carrée, on
  87. C a calculé sqrt(det(trans(J).J))
  88. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  89. C***********************************************************************
  90. C VERSION : v1, 09/08/99, version initiale
  91. C HISTORIQUE : v1, 09/08/99, création
  92. C HISTORIQUE :
  93. C HISTORIQUE :
  94. C***********************************************************************
  95. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  96. C en cas de modification de ce sous-programme afin de faciliter
  97. C la maintenance !
  98. C***********************************************************************
  99.  
  100. -INC PPARAM
  101. -INC CCOPTIO
  102. -INC TNLIN
  103. *-INC SMCHAEL
  104. INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM
  105. POINTEUR JCOOR.MCHEVA
  106. POINTEUR JMAJAC.MCHEVA
  107. POINTEUR JMIJAC.MCHEVA
  108. POINTEUR JDTJAC.MCHEVA
  109. POINTEUR JJTJ.MCHEVA
  110. POINTEUR JJTJM1.MCHEVA
  111. * Valeur des fns d'interpolation de l'espace géométrique aux pts de Gauss
  112. POINTEUR DFFPG.MCHEVA
  113. *
  114. INTEGER NBELEM
  115. INTEGER IMPR,IRET
  116. *
  117. LOGICAL LCARRE,LERJ
  118. INTEGER IESREF,IESREL,NDNOEU,NDCOL,NDPOGO,NDELEM
  119. *
  120. * Executable statements
  121. *
  122. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans geolin'
  123. SEGACT DFFPG
  124. NDNOEU=DFFPG.WELCHE(/2)
  125. IESREF=DFFPG.WELCHE(/4)
  126. NDPOGO=DFFPG.WELCHE(/5)
  127. SEGACT JCOOR
  128. NDCOL=JCOOR.WELCHE(/2)
  129. IESREL=JCOOR.WELCHE(/4)
  130. NDELEM=JCOOR.WELCHE(/6)
  131. IF (NDCOL.NE.NDNOEU) THEN
  132. WRITE(IOIMP,*) 'Incompatibilité fns d''interpolation-géométrie'
  133. WRITE(IOIMP,*) 'NDNOEU=',NDNOEU,' NDCOL=',NDCOL
  134. GOTO 9999
  135. ENDIF
  136. * On pourrait envisager un cas où tous les éléments seraient
  137. * identiques (ex. carré) NDELEM=1
  138. IF (NDELEM.NE.NBELEM) THEN
  139. WRITE(IOIMP,*) 'Incompatibilité coordonnées-géométrie'
  140. WRITE(IOIMP,*) 'NDELEM=',NDELEM,' NBELEM=',NBELEM
  141. GOTO 9999
  142. ENDIF
  143. IF (IESREF.LT.IESREL) THEN
  144. LCARRE=.FALSE.
  145. ELSEIF (IESREF.EQ.IESREL) THEN
  146. LCARRE=.TRUE.
  147. ELSE
  148. WRITE(IOIMP,*) 'Dim. esp. ref. > dim. esp. reel ???'
  149. WRITE(IOIMP,*) 'IESREF=',IESREF,' IESREL=',IESREL
  150. GOTO 9999
  151. ENDIF
  152. *
  153. * Initialisations...
  154. *
  155. NBLIG=1
  156. NBCOL=1
  157. N2LIG=IESREL
  158. N2COL=IESREF
  159. NBPOI=NDPOGO
  160. NBELM=NDELEM
  161. SEGINI JMAJAC
  162. *
  163. * On effectue le calcul de la matrice jacobienne aux points de Gauss
  164. *
  165. CALL GEOLI1(IESREL,IESREF,NDNOEU,NDPOGO,NDELEM,
  166. $ DFFPG.WELCHE,JCOOR.WELCHE,
  167. $ JMAJAC.WELCHE,
  168. $ IMPR,IRET)
  169. IF (IRET.NE.0) GOTO 9999
  170. IF (IMPR.GT.4) THEN
  171. WRITE(IOIMP,*) 'On a créé',
  172. $ ' JMAJAC(élément , poi.gauss ,',
  173. $ ' dksi(i) , dx(j) ,1,1)'
  174. CALL PRCHVA(JMAJAC,IMPR,IRET)
  175. IF (IRET.NE.0) GOTO 9999
  176. ENDIF
  177. *
  178. * Si la matrice est carrée, on tente de calculer
  179. * son inverse et son déterminant...
  180. *
  181. IF (LCARRE) THEN
  182. NBLIG=1
  183. NBCOL=1
  184. N2LIG=IESREF
  185. N2COL=IESREL
  186. NBPOI=NDPOGO
  187. NBELM=NDELEM
  188. SEGINI JMIJAC
  189. NBLIG=1
  190. NBCOL=1
  191. N2LIG=1
  192. N2COL=1
  193. NBPOI=NDPOGO
  194. NBELM=NDELEM
  195. SEGINI JDTJAC
  196. CALL GEOLI2(IESREF,NDPOGO,NDELEM,JMAJAC.WELCHE,
  197. $ JMIJAC.WELCHE,JDTJAC.WELCHE,LERJ,
  198. $ IMPR,IRET)
  199. IF (IRET.NE.0) THEN
  200. IF (LERJ) GOTO 9666
  201. GOTO 9999
  202. ENDIF
  203. SEGDES JDTJAC
  204. SEGDES JMIJAC
  205. IF (IMPR.GT.4) THEN
  206. WRITE(IOIMP,*) 'On a créé',
  207. $ ' JMIJAC(élément , poi.gauss ,',
  208. $ ' dx(i) , dksi(j) ,1,1)'
  209. CALL PRCHVA(JMIJAC,IMPR,IRET)
  210. IF (IRET.NE.0) GOTO 9999
  211. ENDIF
  212. ELSE
  213. *
  214. * Sinon on calcule : SQRT ( det (transpose(A) * A))
  215. * et la pseudo-inverse (JtJ)^-1 Jt
  216. *
  217. NBLIG=1
  218. NBCOL=1
  219. N2LIG=IESREF
  220. N2COL=IESREL
  221. NBPOI=NDPOGO
  222. NBELM=NDELEM
  223. SEGINI JMIJAC
  224. *
  225. NBLIG=1
  226. NBCOL=1
  227. N2LIG=1
  228. N2COL=1
  229. NBPOI=NDPOGO
  230. NBELM=NDELEM
  231. SEGINI JDTJAC
  232. * Objets temporaire
  233. NBLIG=1
  234. NBCOL=1
  235. N2LIG=IESREF
  236. N2COL=IESREF
  237. NBPOI=NDPOGO
  238. NBELM=NDELEM
  239. SEGINI JJTJ
  240. SEGINI JJTJM1
  241. CALL GEOLI4(IESREL,IESREF,NDPOGO,NDELEM,JMAJAC.WELCHE,
  242. $ JJTJ.WELCHE,JJTJM1.WELCHE,
  243. $ JMIJAC.WELCHE,JDTJAC.WELCHE,LERJ,
  244. $ IMPR,IRET)
  245. IF (IRET.NE.0) GOTO 9999
  246. SEGSUP JJTJM1
  247. SEGSUP JJTJ
  248. SEGDES JMIJAC
  249. SEGDES JDTJAC
  250. ENDIF
  251. SEGDES JMAJAC
  252. SEGDES JCOOR
  253. SEGDES DFFPG
  254. IF (IMPR.GT.3) THEN
  255. WRITE(IOIMP,*) 'On a créé',
  256. $ ' JDTJAC(élément , poi.gauss ,',
  257. $ '1,1,1,1)'
  258. CALL PRCHVA(JDTJAC,IMPR,IRET)
  259. IF (IRET.NE.0) GOTO 9999
  260. ENDIF
  261. *
  262. * Normal termination
  263. *
  264. IRET=0
  265. RETURN
  266. *
  267. * Format handling
  268. *
  269. *
  270. * Error handling
  271. *
  272. 9666 CONTINUE
  273. IRET=666
  274. RETURN
  275. 9999 CONTINUE
  276. IRET=1
  277. WRITE(IOIMP,*) 'An error was detected in subroutine geolin'
  278. RETURN
  279. *
  280. * End of subroutine GEOLIN
  281. *
  282. END
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  

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