Télécharger kfnrff.eso

Retour à la liste

Numérotation des lignes :

kfnrff
  1. C KFNRFF SOURCE GOUNAND 21/06/02 21:17:08 11022
  2. SUBROUTINE KFNRFF(LRFVOL,JXCOPG,
  3. $ FNPG,DFNPG,
  4. $ IMPR,IRET)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. IMPLICIT INTEGER (I-N)
  7. C***********************************************************************
  8. C NOM : KFNRFF
  9. C PROJET : Noyau linéaire NLIN
  10. C DESCRIPTION : Calcul des fonctions de forme et de leurs
  11. C dérivées aux points de Gauss sur l'élément
  12. C de référence.
  13. C Le but avoué de ce sous-programme est d'effectuer
  14. C toutes les opérations de pré-traitement sur un élément
  15. C de référence donné.
  16. C
  17. C LANGAGE : ESOPE
  18. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  19. C mél : gounand@semt2.smts.cea.fr
  20. C***********************************************************************
  21. C APPELES : CALPN, IVMAT, NI
  22. C APPELE PAR : KALPBG
  23. C***********************************************************************
  24. C ENTREES : LRFVOL, MYPG
  25. C ENTREES/SORTIES : -
  26. C SORTIES : FNPG, DFNPG
  27. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  28. C***********************************************************************
  29. C VERSION : v1, 26/07/99, version initiale
  30. C HISTORIQUE : v1, 26/07/99, création
  31. C HISTORIQUE : v1.1 16/09/99, remaniement pour que la base polynômiale
  32. C puisse contenir des polynômes au lieu de
  33. C monômes exclusivement...
  34. C HISTORIQUE : v2, 10/05/00, modif. du segment ELREF
  35. C HISTORIQUE : v2.1 02/10/03 ajout d'astuces
  36. C HISTORIQUE :
  37. C***********************************************************************
  38. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  39. C en cas de modification de ce sous-programme afin de faciliter
  40. C la maintenance !
  41. C***********************************************************************
  42.  
  43. -INC PPARAM
  44. -INC CCOPTIO
  45. -INC CCREEL
  46. -INC TNLIN
  47. *-INC SELREF
  48. POINTEUR LRFVOL.ELREF
  49. *-INC SMCHAEL
  50. POINTEUR JXCOPG.MCHEVA
  51. POINTEUR FNPG.MCHEVA
  52. POINTEUR DFNPG.MCHEVA
  53. -INC SMLENTI
  54. INTEGER JG
  55. POINTEUR IVTMP.MLENTI
  56. -INC TMXMAT
  57. POINTEUR PN.MXMAT
  58. POINTEUR PNM1.MXMAT
  59. POINTEUR ID.MXMAT
  60. *
  61. INTEGER IMPR,IRET
  62. *
  63. LOGICAL LLAHE,LCAST
  64. LOGICAL LCSTE,LLINE,LEGAL
  65. INTEGER NDFN
  66. REAL*8 DETPN
  67. *
  68. * Executable statements
  69. *
  70. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans kfnrff'
  71. SEGACT LRFVOL
  72. *
  73. LCAST=(LRFVOL.NOMLRF.EQ.'H1D1PY5'.OR.LRFVOL.NOMLRF.EQ.'H1D2PY13'
  74. $ .OR.LRFVOL.NOMLRF.EQ.'H1D2PR15'
  75. $ .OR.LRFVOL.NOMLRF.EQ.'H1D2CU20')
  76. *
  77. NDIML=LRFVOL.ORDDER(/1)
  78. NBDDL=LRFVOL.ORDDER(/2)
  79. LLAHE=(LRFVOL.TYPEL.EQ.'LAGRANGE'.OR.LRFVOL.TYPEL.EQ.'HERMITE')
  80. * On fait un cas particulier aux éléments de Lagrange
  81. * à un ddl : dans ce cas-la, la fonction de forme
  82. * est constante et sa dérivée est nulle
  83. LCSTE=(LRFVOL.TYPEL.EQ.'LAGRANGE'.AND.NBDDL.EQ.1)
  84. * On fait un cas particulier aux éléments de Lagrange
  85. * linéaire (simplex) : dans ce cas-la, les dérivées des fonctions de
  86. * forme sont constantes
  87. LLINE=(LRFVOL.TYPEL.EQ.'LAGRANGE'.AND.NBDDL.EQ.(NDIML+1))
  88. SEGDES LRFVOL
  89. *
  90. * On repique les éléments dans SHAPE
  91. *
  92. IF (LCAST) THEN
  93. CALL SH2FNF(LRFVOL,JXCOPG,
  94. $ FNPG,DFNPG,
  95. $ IMPR,IRET)
  96. IF (IRET.NE.0) GOTO 9999
  97. *
  98. * Astuce foireuse
  99. *
  100. ELSEIF (LCSTE) THEN
  101. NBLIG=1
  102. NBCOL=1
  103. N2LIG=1
  104. N2COL=1
  105. NBPOI=1
  106. NBELM=1
  107. SEGINI FNPG
  108. FNPG.WELCHE(1,1,1,1,1,1)=1.D0
  109. SEGDES FNPG
  110. NBLIG=1
  111. NBCOL=1
  112. N2LIG=1
  113. N2COL=NDIML
  114. NBPOI=1
  115. NBELM=1
  116. SEGINI DFNPG
  117. DO IDIML=1,NDIML
  118. DFNPG.WELCHE(1,1,1,IDIML,1,1)=0.D0
  119. ENDDO
  120. SEGDES DFNPG
  121. * Cas des éléments de Lagrange et Hermite
  122. ELSEIF (LLAHE) THEN
  123. *
  124. * Construisons la Matrice [PN] à l'aide de la base polynômiale :
  125. * et des coordonnées de noeuds d'approximation
  126. **
  127. CALL CALPN(LRFVOL,
  128. $ PN,
  129. $ IMPR,IRET)
  130. IF (IRET.NE.0) GOTO 9999
  131. *
  132. * Inversons la Matrice [PN]
  133. *
  134. C SEGACT PN
  135. C JLIG=PN.MAT(/1)
  136. C JCOL=PN.MAT(/2)
  137. C xsom=0
  138. C do icol=1,jcol
  139. C do ilig=1,jlig
  140. C xsom=xsom+ABS(PN.MAT(ilig,icol))
  141. C enddo
  142. C enddo
  143. C write(ioimp,*) 'xsom=',xsom
  144.  
  145.  
  146. SEGACT PN
  147. SEGINI,PNM1=PN
  148. NDFN=PN.XMAT(/1)
  149. JG=NDFN
  150. SEGINI IVTMP
  151. IIMPR=1
  152. * IIMPR=5
  153. CALL IVMAT(NDFN,PN.XMAT,
  154. $ IVTMP.LECT,
  155. $ PNM1.XMAT,DETPN,
  156. $ IIMPR,IRET)
  157. IF (IRET.NE.0) GOTO 9999
  158. C* Vérif à la con
  159. C JLIG=NDFN
  160. C JCOL=NDFN
  161. C SEGINI ID
  162. C DO i = 1,NDFN
  163. C DO k = 1,NDFN
  164. C val = 0.D0
  165. C DO j = 1,NDFN
  166. C val = val + (PN.XMAT(i,j)*PNM1.XMAT(j,k))
  167. C ENDDO
  168. C ID.MAT(i,k)=val
  169. C enddo
  170. C enddo
  171. C segprt,ID
  172. C xsom=0.D0
  173. C do icol=1,jcol
  174. C do ilig=1,jlig
  175. C xsom=xsom+ABS(ID.MAT(ilig,icol))
  176. C enddo
  177. C enddo
  178. C write(ioimp,*) 'xsom=',xsom
  179. C write(ioimp,*) 'diagonale'
  180. C WRITE(IOIMP,*) (ID.MAT(I,I),I=1,NDFN)
  181. C xsom=0
  182. C do icol=1,jcol
  183. C do ilig=1,jlig
  184. C xsom=xsom+ABS(PNM1.MAT(ilig,icol))
  185. C enddo
  186. C enddo
  187. C write(ioimp,*) 'xsom=',xsom
  188. SEGSUP IVTMP
  189. SEGSUP PN
  190. *
  191. * On peut maintenant calculer les valeurs des fonctions de forme
  192. * et leurs dérivées premières (par rapport aux coordonnées de l'espace
  193. * de référence) aux points de Gauss sur l'élément de référence
  194. *
  195. IIMPR=IMPR
  196. CALL NIF(LRFVOL,JXCOPG,PNM1,
  197. $ FNPG,DFNPG,
  198. $ IIMPR,IRET)
  199. IF (IRET.NE.0) GOTO 9999
  200. SEGSUP PNM1
  201. ELSE
  202. WRITE(IOIMP,*) 'Le type d''élément ',LRFVOL.TYPEL
  203. WRITE(IOIMP,*) 'n''est pas reconnu.'
  204. GOTO 9999
  205. ENDIF
  206. *
  207. * Astuce foireuse (mais on fait quand même des
  208. * vérifications) On ne la fait pas pour les intégrations de surface
  209. *
  210. C IF (LLINE) THEN
  211. C SEGACT DFNPG*MOD
  212. C NBPOGO=DFNPG.WELCHE(/5)
  213. C NBELFV=DFNPG.WELCHE(/6)
  214. C DO IDIML=1,NDIML
  215. C DO IDDL=1,NBDDL
  216. C VALDF=DFNPG.WELCHE(1,IDDL,1,IDIML,1,1)
  217. C DO IBELFV=2,NBELFV
  218. C DO IPOGO=2,NBPOGO
  219. C VALDF2=DFNPG.WELCHE(1,IDDL,1,IDIML,IPOGO,1)
  220. C LEGAL=(ABS(VALDF2-VALDF).LE.100.D0*XZPREC)
  221. C IF (.NOT.LEGAL) THEN
  222. C WRITE(IOIMP,*) 'Houston, on a un probleme'
  223. C* SEGPRT,DFNPG
  224. C GOTO 9999
  225. C ENDIF
  226. C ENDDO
  227. C ENDDO
  228. C ENDDO
  229. C ENDDO
  230. C NBLIG=1
  231. C NBCOL=NBDDL
  232. C N2LIG=1
  233. C N2COL=NDIML
  234. C NBPOI=1
  235. C NBELM=1
  236. C SEGADJ,DFNPG
  237. C SEGDES DFNPG
  238. C ENDIF
  239. *
  240. * Normal termination
  241. *
  242. IRET=0
  243. RETURN
  244. *
  245. * Error handling
  246. *
  247. 9999 CONTINUE
  248. IRET=1
  249. WRITE(IOIMP,*) 'An error was detected in subroutine kfnrff'
  250. RETURN
  251. *
  252. * End of subroutine KFNRFF
  253. *
  254. END
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  

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