Télécharger geoli2.eso

Retour à la liste

Numérotation des lignes :

geoli2
  1. C GEOLI2 SOURCE GOUNAND 05/12/21 21:27:00 5281
  2. SUBROUTINE GEOLI2(IESREF,NDPOGO,NDELEM,JMAJAC,
  3. $ JMIJAC,JDTJAC,LERJ,
  4. $ IMPR,IRET)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. IMPLICIT INTEGER (I-N)
  7. C***********************************************************************
  8. C NOM : GEOLI2
  9. C PROJET : Noyau linéaire NLIN
  10. C DESCRIPTION : Calcul de l'inverse et du déterminant d'une matrice
  11. C jacobienne dans le cas où celle-ci est carrée.
  12. C Ceci est effectué pour chaque point de Gauss d'un
  13. C élément.
  14. C On teste également si le déterminant s'annule ou change
  15. C de signe sur l'élément auxquels cas on génère une
  16. C erreur.
  17. C
  18. C LANGAGE : Fortran 77 (sauf E/S)
  19. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  20. C mél : gounand@semt2.smts.cea.fr
  21. C***********************************************************************
  22. C APPELES : -
  23. C APPELE PAR : GEOLIN
  24. C***********************************************************************
  25. C ENTREES : * IESREF (type entier) : dimension de l'espace de
  26. C référence.
  27. C * NDPOGO (type entier) : nombre de points
  28. C d'intégration.
  29. C * NDELEM (type entier) : nombre d'éléments du
  30. C maillage élémentaire courant.
  31. C * JMAJAC (type MCHEVA) : valeurs de la matrice
  32. C jacobienne aux points de Gauss sur le maillage
  33. C élémentaire courant.
  34. C ENTREES/SORTIES : * JMIJAC (type MCHEVA) : valeurs de l'inverse de
  35. C la matrice jacobienne aux points de Gauss sur
  36. C le maillage élémentaire courant.
  37. C JMIJAC n'existe que si dim.esp.réf=dim.esp.réel
  38. C * JDTJAC (type MCHEVA) : valeurs du déterminant
  39. C de la matrice jacobienne aux points de Gauss
  40. C sur le maillage élémentaire courant.
  41. C Si la matrice jacobienne n'est pas carrée, on
  42. C a calculé sqrt(det(trans(J).J))
  43. C SORTIES : -
  44. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  45. C***********************************************************************
  46. C VERSION : v1, 10/08/99, version initiale
  47. C HISTORIQUE : v1, 10/08/99, création
  48. C HISTORIQUE :
  49. C HISTORIQUE :
  50. C***********************************************************************
  51. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  52. C en cas de modification de ce sous-programme afin de faciliter
  53. C la maintenance !
  54. C***********************************************************************
  55. -INC CCREEL
  56.  
  57. -INC PPARAM
  58. -INC CCOPTIO
  59. INTEGER IESREF,NDPOGO,NDELEM
  60. REAL*8 JMAJAC(IESREF,IESREF,NDPOGO,NDELEM)
  61. REAL*8 JMIJAC(IESREF,IESREF,NDPOGO,NDELEM)
  62. REAL*8 JDTJAC(NDPOGO,NDELEM)
  63. *
  64. INTEGER IMPR,IRET
  65. *
  66. REAL*8 ZERO,UN
  67. PARAMETER (ZERO=0.D0,UN=1.D0)
  68. *
  69. REAL*8 DET,INVDET
  70. INTEGER IELEM,IPOGO,IREFER,JREFER
  71. LOGICAL LSIGN,LERJ
  72. *
  73. * Executable statements
  74. *
  75. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans geoli2'
  76. IF (IESREF.EQ.1) THEN
  77. DO 1 IELEM=1,NDELEM
  78. DO 12 IPOGO=1,NDPOGO
  79. DET=JMAJAC(1,1,IPOGO,IELEM)
  80. IF (DET.NE.ZERO) THEN
  81. INVDET=UN/DET
  82. JDTJAC(IPOGO,IELEM)=DET
  83. JMIJAC(1,1,IPOGO,IELEM)=INVDET
  84. ELSE
  85. GOTO 9998
  86. ENDIF
  87. 12 CONTINUE
  88. 1 CONTINUE
  89. ELSEIF (IESREF.EQ.2) THEN
  90. DO 3 IELEM=1,NDELEM
  91. DO 32 IPOGO=1,NDPOGO
  92. DET=(JMAJAC(1,1,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  93. $ - (JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(1,2,IPOGO,IELEM))
  94. IF (DET.NE.ZERO) THEN
  95. IF (IPOGO.EQ.1) THEN
  96. LSIGN=(DET.GT.ZERO)
  97. ELSE
  98. IF (LSIGN.NEQV.(DET.GT.ZERO)) GOTO 9997
  99. ENDIF
  100. INVDET=UN/DET
  101. JDTJAC(IPOGO,IELEM)=DET
  102. JMIJAC(1,1,IPOGO,IELEM)=
  103. $ (+JMAJAC(2,2,IPOGO,IELEM))*INVDET
  104. JMIJAC(2,1,IPOGO,IELEM)=
  105. $ (-JMAJAC(2,1,IPOGO,IELEM))*INVDET
  106. JMIJAC(1,2,IPOGO,IELEM)=
  107. $ (-JMAJAC(1,2,IPOGO,IELEM))*INVDET
  108. JMIJAC(2,2,IPOGO,IELEM)=
  109. $ (+JMAJAC(1,1,IPOGO,IELEM))*INVDET
  110. ELSE
  111. GOTO 9998
  112. ENDIF
  113. 32 CONTINUE
  114. 3 CONTINUE
  115. ELSEIF (IESREF.EQ.3) THEN
  116. DO 5 IELEM=1,NDELEM
  117. DO 52 IPOGO=1,NDPOGO
  118. JMIJAC(1,1,IPOGO,IELEM)=
  119. $ (JMAJAC(2,2,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  120. $ -(JMAJAC(3,2,IPOGO,IELEM)*JMAJAC(2,3,IPOGO,IELEM))
  121. JMIJAC(2,1,IPOGO,IELEM)=
  122. $ (JMAJAC(3,1,IPOGO,IELEM)*JMAJAC(2,3,IPOGO,IELEM))
  123. $ -(JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  124. JMIJAC(3,1,IPOGO,IELEM)=
  125. $ (JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(3,2,IPOGO,IELEM))
  126. $ -(JMAJAC(3,1,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  127. JMIJAC(1,2,IPOGO,IELEM)=
  128. $ (JMAJAC(1,3,IPOGO,IELEM)*JMAJAC(3,2,IPOGO,IELEM))
  129. $ -(JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  130. JMIJAC(2,2,IPOGO,IELEM)=
  131. $ (JMAJAC(1,1,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  132. $ -(JMAJAC(1,3,IPOGO,IELEM)*JMAJAC(3,1,IPOGO,IELEM))
  133. JMIJAC(3,2,IPOGO,IELEM)=
  134. $ (JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(3,1,IPOGO,IELEM))
  135. $ -(JMAJAC(3,2,IPOGO,IELEM)*JMAJAC(1,1,IPOGO,IELEM))
  136. JMIJAC(1,3,IPOGO,IELEM)=
  137. $ (JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(2,3,IPOGO,IELEM))
  138. $ -(JMAJAC(1,3,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  139. JMIJAC(2,3,IPOGO,IELEM)=
  140. $ (JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(1,3,IPOGO,IELEM))
  141. $ -(JMAJAC(2,3,IPOGO,IELEM)*JMAJAC(1,1,IPOGO,IELEM))
  142. JMIJAC(3,3,IPOGO,IELEM)=
  143. $ (JMAJAC(1,1,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  144. $ -(JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(2,1,IPOGO,IELEM))
  145. DET=(JMAJAC(1,1,IPOGO,IELEM)*JMIJAC(1,1,IPOGO,IELEM))
  146. $ +(JMAJAC(1,2,IPOGO,IELEM)*JMIJAC(2,1,IPOGO,IELEM))
  147. $ +(JMAJAC(1,3,IPOGO,IELEM)*JMIJAC(3,1,IPOGO,IELEM))
  148. * IF (DET.NE.ZERO) THEN
  149. IF (ABS(DET).GT.(SQRT(XPETIT))) THEN
  150. IF (IPOGO.EQ.1) THEN
  151. LSIGN=(DET.GT.ZERO)
  152. ELSE
  153. IF (LSIGN.NEQV.(DET.GT.ZERO)) GOTO 9997
  154. ENDIF
  155. INVDET=UN/DET
  156. JDTJAC(IPOGO,IELEM)=DET
  157. DO 522 JREFER=1,IESREF
  158. DO 5222 IREFER=1,IESREF
  159. JMIJAC(IREFER,JREFER,IPOGO,IELEM)=
  160. $ JMIJAC(IREFER,JREFER,IPOGO,IELEM)
  161. $ * INVDET
  162. 5222 CONTINUE
  163. 522 CONTINUE
  164. ELSE
  165. GOTO 9998
  166. ENDIF
  167. 52 CONTINUE
  168. 5 CONTINUE
  169. ELSE
  170. WRITE(IOIMP,*) 'Je ne sais pas calculer l''inverse d''une'
  171. WRITE(IOIMP,*) 'matrice jacobienne de dimension '
  172. WRITE(IOIMP,*) 'IESREF=',IESREF
  173. ENDIF
  174. *
  175. * Normal termination
  176. *
  177. IRET=0
  178. RETURN
  179. *
  180. * Format handling
  181. *
  182. *
  183. * Error handling
  184. *
  185. 9997 CONTINUE
  186. IF (LERJ) THEN
  187. IRET=666
  188. CALL ECRENT(IRET)
  189. RETURN
  190. ENDIF
  191. WRITE(IOIMP,*) 'Le déterminant de la matrice jacobienne'
  192. WRITE(IOIMP,*) 'change de signe sur l''élément.'
  193. WRITE(IOIMP,*) 'IELEM=',IELEM,' IPOGO=',IPOGO
  194. GOTO 9999
  195. 9998 CONTINUE
  196. IF (LERJ) THEN
  197. IRET=667
  198. CALL ECRENT(IRET)
  199. RETURN
  200. ENDIF
  201. WRITE(IOIMP,*) 'Déterminant de la matrice jacobienne nul'
  202. WRITE(IOIMP,*) 'IELEM=',IELEM,' IPOGO=',IPOGO
  203. GOTO 9999
  204. 9999 CONTINUE
  205. IRET=1
  206. WRITE(IOIMP,*) 'An error was detected in subroutine geoli2'
  207. RETURN
  208. *
  209. * End of subroutine GEOLI2
  210. *
  211. END
  212.  
  213.  
  214.  

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