Télécharger geoli2.eso

Retour à la liste

Numérotation des lignes :

  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. -INC CCOPTIO
  57. INTEGER IESREF,NDPOGO,NDELEM
  58. REAL*8 JMAJAC(IESREF,IESREF,NDPOGO,NDELEM)
  59. REAL*8 JMIJAC(IESREF,IESREF,NDPOGO,NDELEM)
  60. REAL*8 JDTJAC(NDPOGO,NDELEM)
  61. *
  62. INTEGER IMPR,IRET
  63. *
  64. REAL*8 ZERO,UN
  65. PARAMETER (ZERO=0.D0,UN=1.D0)
  66. *
  67. REAL*8 DET,INVDET
  68. INTEGER IELEM,IPOGO,IREFER,JREFER
  69. LOGICAL LSIGN,LERJ
  70. *
  71. * Executable statements
  72. *
  73. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans geoli2'
  74. IF (IESREF.EQ.1) THEN
  75. DO 1 IELEM=1,NDELEM
  76. DO 12 IPOGO=1,NDPOGO
  77. DET=JMAJAC(1,1,IPOGO,IELEM)
  78. IF (DET.NE.ZERO) THEN
  79. INVDET=UN/DET
  80. JDTJAC(IPOGO,IELEM)=DET
  81. JMIJAC(1,1,IPOGO,IELEM)=INVDET
  82. ELSE
  83. GOTO 9998
  84. ENDIF
  85. 12 CONTINUE
  86. 1 CONTINUE
  87. ELSEIF (IESREF.EQ.2) THEN
  88. DO 3 IELEM=1,NDELEM
  89. DO 32 IPOGO=1,NDPOGO
  90. DET=(JMAJAC(1,1,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  91. $ - (JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(1,2,IPOGO,IELEM))
  92. IF (DET.NE.ZERO) THEN
  93. IF (IPOGO.EQ.1) THEN
  94. LSIGN=(DET.GT.ZERO)
  95. ELSE
  96. IF (LSIGN.NEQV.(DET.GT.ZERO)) GOTO 9997
  97. ENDIF
  98. INVDET=UN/DET
  99. JDTJAC(IPOGO,IELEM)=DET
  100. JMIJAC(1,1,IPOGO,IELEM)=
  101. $ (+JMAJAC(2,2,IPOGO,IELEM))*INVDET
  102. JMIJAC(2,1,IPOGO,IELEM)=
  103. $ (-JMAJAC(2,1,IPOGO,IELEM))*INVDET
  104. JMIJAC(1,2,IPOGO,IELEM)=
  105. $ (-JMAJAC(1,2,IPOGO,IELEM))*INVDET
  106. JMIJAC(2,2,IPOGO,IELEM)=
  107. $ (+JMAJAC(1,1,IPOGO,IELEM))*INVDET
  108. ELSE
  109. GOTO 9998
  110. ENDIF
  111. 32 CONTINUE
  112. 3 CONTINUE
  113. ELSEIF (IESREF.EQ.3) THEN
  114. DO 5 IELEM=1,NDELEM
  115. DO 52 IPOGO=1,NDPOGO
  116. JMIJAC(1,1,IPOGO,IELEM)=
  117. $ (JMAJAC(2,2,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  118. $ -(JMAJAC(3,2,IPOGO,IELEM)*JMAJAC(2,3,IPOGO,IELEM))
  119. JMIJAC(2,1,IPOGO,IELEM)=
  120. $ (JMAJAC(3,1,IPOGO,IELEM)*JMAJAC(2,3,IPOGO,IELEM))
  121. $ -(JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  122. JMIJAC(3,1,IPOGO,IELEM)=
  123. $ (JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(3,2,IPOGO,IELEM))
  124. $ -(JMAJAC(3,1,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  125. JMIJAC(1,2,IPOGO,IELEM)=
  126. $ (JMAJAC(1,3,IPOGO,IELEM)*JMAJAC(3,2,IPOGO,IELEM))
  127. $ -(JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  128. JMIJAC(2,2,IPOGO,IELEM)=
  129. $ (JMAJAC(1,1,IPOGO,IELEM)*JMAJAC(3,3,IPOGO,IELEM))
  130. $ -(JMAJAC(1,3,IPOGO,IELEM)*JMAJAC(3,1,IPOGO,IELEM))
  131. JMIJAC(3,2,IPOGO,IELEM)=
  132. $ (JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(3,1,IPOGO,IELEM))
  133. $ -(JMAJAC(3,2,IPOGO,IELEM)*JMAJAC(1,1,IPOGO,IELEM))
  134. JMIJAC(1,3,IPOGO,IELEM)=
  135. $ (JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(2,3,IPOGO,IELEM))
  136. $ -(JMAJAC(1,3,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  137. JMIJAC(2,3,IPOGO,IELEM)=
  138. $ (JMAJAC(2,1,IPOGO,IELEM)*JMAJAC(1,3,IPOGO,IELEM))
  139. $ -(JMAJAC(2,3,IPOGO,IELEM)*JMAJAC(1,1,IPOGO,IELEM))
  140. JMIJAC(3,3,IPOGO,IELEM)=
  141. $ (JMAJAC(1,1,IPOGO,IELEM)*JMAJAC(2,2,IPOGO,IELEM))
  142. $ -(JMAJAC(1,2,IPOGO,IELEM)*JMAJAC(2,1,IPOGO,IELEM))
  143. DET=(JMAJAC(1,1,IPOGO,IELEM)*JMIJAC(1,1,IPOGO,IELEM))
  144. $ +(JMAJAC(1,2,IPOGO,IELEM)*JMIJAC(2,1,IPOGO,IELEM))
  145. $ +(JMAJAC(1,3,IPOGO,IELEM)*JMIJAC(3,1,IPOGO,IELEM))
  146. * IF (DET.NE.ZERO) THEN
  147. IF (ABS(DET).GT.(SQRT(XPETIT))) THEN
  148. IF (IPOGO.EQ.1) THEN
  149. LSIGN=(DET.GT.ZERO)
  150. ELSE
  151. IF (LSIGN.NEQV.(DET.GT.ZERO)) GOTO 9997
  152. ENDIF
  153. INVDET=UN/DET
  154. JDTJAC(IPOGO,IELEM)=DET
  155. DO 522 JREFER=1,IESREF
  156. DO 5222 IREFER=1,IESREF
  157. JMIJAC(IREFER,JREFER,IPOGO,IELEM)=
  158. $ JMIJAC(IREFER,JREFER,IPOGO,IELEM)
  159. $ * INVDET
  160. 5222 CONTINUE
  161. 522 CONTINUE
  162. ELSE
  163. GOTO 9998
  164. ENDIF
  165. 52 CONTINUE
  166. 5 CONTINUE
  167. ELSE
  168. WRITE(IOIMP,*) 'Je ne sais pas calculer l''inverse d''une'
  169. WRITE(IOIMP,*) 'matrice jacobienne de dimension '
  170. WRITE(IOIMP,*) 'IESREF=',IESREF
  171. ENDIF
  172. *
  173. * Normal termination
  174. *
  175. IRET=0
  176. RETURN
  177. *
  178. * Format handling
  179. *
  180. *
  181. * Error handling
  182. *
  183. 9997 CONTINUE
  184. IF (LERJ) THEN
  185. IRET=666
  186. CALL ECRENT(IRET)
  187. RETURN
  188. ENDIF
  189. WRITE(IOIMP,*) 'Le déterminant de la matrice jacobienne'
  190. WRITE(IOIMP,*) 'change de signe sur l''élément.'
  191. WRITE(IOIMP,*) 'IELEM=',IELEM,' IPOGO=',IPOGO
  192. GOTO 9999
  193. 9998 CONTINUE
  194. IF (LERJ) THEN
  195. IRET=667
  196. CALL ECRENT(IRET)
  197. RETURN
  198. ENDIF
  199. WRITE(IOIMP,*) 'Déterminant de la matrice jacobienne nul'
  200. WRITE(IOIMP,*) 'IELEM=',IELEM,' IPOGO=',IPOGO
  201. GOTO 9999
  202. 9999 CONTINUE
  203. IRET=1
  204. WRITE(IOIMP,*) 'An error was detected in subroutine geoli2'
  205. RETURN
  206. *
  207. * End of subroutine GEOLI2
  208. *
  209. END
  210.  
  211.  
  212.  

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