Télécharger hhoelq.eso

Retour à la liste

Numérotation des lignes :

hhoelq
  1. C HHOELQ SOURCE MB234859 25/09/08 21:15:38 12358
  2.  
  3. C===== FORMULATION HHO =================================================
  4. C= Sous-programme HHOELQ =
  5. C= --------------------- =
  6. C= Ce sous programme est l'equivalent du sous programme ELQUOI pour la =
  7. C= formulation HHO. Il est appele par ELQUOI et s'en inspire fortement =
  8. C= =
  9. C= Entrees : =
  10. C= --------- =
  11. C= IMODEL : pointeur sur une zone elementaire d'un modele =
  12. C= SEGMENT ACTIF en entree et en sortie =
  13. C= INTTYP : type d'integration utilisee par l'operateur =
  14. C= Si l'on desire un segment d'integration pour un champ aux : =
  15. C= 1 = NOEUDS ( appel a RENOEU ) =
  16. C= 2 = points de GAUSS pour centre de GRAVITE et CHAMP CONSTANT =
  17. C= 3 = points de GAUSS pour la RIGIDITE =
  18. C= 4 = points de GAUSS pour la MASSE =
  19. C= 5 = points de GAUSS pour les CONTRAINTES =
  20. C -10= en mecanique on veut calculer les 5 premiers et on les met =
  21. C dans infmod(3 ...) =
  22. C= Sorties : =
  23. C= --------- =
  24. C= retourne IPTR pointeur sur un segment INFO ACTIF contenant : =
  25. C= La dimension de infele est fixee par NINFOS =
  26. C= infele( 1) numero de l'element fini =
  27. C= infele( 2) nombre de points d'integration en contraintes =
  28. C= multicouche =
  29. C= infele( 3) nombre de points d'integration pour la masse =
  30. C= infele( 4) nombre de points d'integration pour SIGMA =
  31. C= BSIGMA et KSIGMA =
  32. C= infele( 5) nombre de caracteristiques =
  33. C= infele( 6) nombre de points d'integration pour la RIGIDITE =
  34. C= infele( 7) longueur d'un tableau de travail pour l'element =
  35. C= infele( 8) nombre de fonctions de forme =
  36. C= infele( 9) nbre de d.d.l. dans la matrice de RIGIDITE =
  37. C= infele(10) taille de la matrice de Hooke =
  38. C= infele(11) pointeur sur le segment d'integration =
  39. C= infele(12) pointeur sur le 2nd segment d'integration des =
  40. C= elements homogeneises ou fluides (COQ6 ou COQ8) =
  41. C= infele(13) numero de la formulation de l'element fini =
  42. C= = 89 Formulation HHO
  43. C= infele(14) numero de l'element geometrique associe (NUMGEO) =
  44. C= infele(15) nombre maximal de d.d.l. par noeud =
  45. C= infele(16) nombre de composantes de contraintes ou de deform. =
  46. C=======================================================================
  47.  
  48. SUBROUTINE HHOELQ (IPMODL,INTTYP,IPTR)
  49.  
  50. IMPLICIT INTEGER(I-N)
  51. IMPLICIT REAL*8(A-H,O-Z)
  52.  
  53. -INC PPARAM
  54. -INC CCOPTIO
  55. -INC CCGEOME
  56.  
  57. -INC CCHHOPA
  58. -INC CCHHOPR
  59.  
  60. -INC SMMODEL
  61. -INC SMELEME
  62. -INC SMINTE
  63. -INC SMLENTI
  64.  
  65. C=======================================================================
  66. C= INTHHO : SAVE local des pointeurs sur les segments d'integration =
  67. C= NBMODE : Nombre de MODEs de calcul (= nb valeurs possibles IFOMOD) =
  68. C= NINFOS : Dimension (JG) du tableau infele (segment INFO) = 16 =
  69. C=======================================================================
  70. C IFOMOD : -1 0 1 2 3 4 5 6
  71. C PLAN AXIS FOUR TRID UNID UNID UNID FREQ
  72. C PLAN AXIS SPHE
  73. C NBMODE = IFOMOD + 2 mais on ne considere pas IFOMOD = 6
  74. C NTYNTE : 1 --> INTEGRATION aux NOEUDS
  75. C 2 --> INTEGRATION aux Points d'INTEGRATION
  76. C 3 --> INTEGRATION au centre de GRAVITE (champ constant par element)
  77. C NOFACE : pour ordre faces (+1 car ordre 0 accepte)
  78. C NNFACE : nombre de noeuds decrivant une face (2 en 2D, 3 a HHO_MAX_EDGE en 3D)
  79. C NOCELL : pour ordre cellules (+1 car ordre 0 accepte)
  80. C NNCELL : nombre de noeuds decrivant une cellule (3 a HHO_MAX_EDGE en 2D)
  81. C pour le 3D voir la remarque ci-dessous :
  82. C Il faudra revoir ce stockage quand on aura du 3D
  83. C en 2D --> on a des polygones definis par leur nombre de noeuds, ce
  84. C qui les rend unique !
  85.  
  86. PARAMETER ( NTYNTE = 3 , NBMODE = 7 )
  87. PARAMETER ( NOCELL = 6 , NNCELL = NFAMAX )
  88. PARAMETER ( NOFACE = 6 , NNFACE = NFAMAX )
  89. PARAMETER ( NINTEG = NNCELL*NOCELL*NTYNTE*NBMODE )
  90. PARAMETER ( NINFOS = 16 )
  91.  
  92. CHARACTER*(16) motHHO
  93. LOGICAL b_z
  94.  
  95. INTEGER INTHHO(NNCELL,NOCELL,NTYNTE,NBMODE)
  96. SAVE INTHHO
  97. DATA INTHHO / NINTEG*0 /
  98.  
  99. IPTR = 0
  100.  
  101. C On se place sur la bonne "tranche" du tableau INTHHO :
  102. IBMODE = IFOMOD + 2
  103.  
  104. IF (IBMODE.LT.1 .OR. IBMODE.GT.NBMODE) THEN
  105. WRITE(IOIMP,*)
  106. WRITE(IOIMP,*) 'HHOELQ : valeur de NBMODE incorrecte !'
  107. WRITE(IOIMP,*) ' IBMODE = ',IBMODE,NBMODE,IFOMOD
  108. CALL ERREUR(5)
  109. RETURN
  110. ENDIF
  111.  
  112. imodel = IPMODL
  113.  
  114. CALL HHONOB(IPMODL, nobHHO, iret)
  115. IF (nobHHO.LE.0)THEN
  116. write(ioimp,*) 'HHOELQ : IPMODL incorrect (not HHO)'
  117. CALL ERREUR(5)
  118. RETURN
  119. END IF
  120.  
  121. C Recuperation des donnees de infele en entree
  122. MELE = imodel.NEFMOD
  123. MFR = NUMMFR(MELE)
  124. meleme = imodel.IMAMOD
  125. IELE = meleme.itypel
  126.  
  127. mlenti = imodel.ivamod(nobhho+1)
  128. c* segact,mlenti
  129.  
  130. C Ordre des faces et des cellules :
  131. n_o_face = mlenti.lect(2)
  132. n_o_cell = mlenti.lect(4)
  133.  
  134. if (iimpi.eq.1972)
  135. & write(ioimp,*) 'HHOELQ : ordre face/cell',n_o_face,n_o_cell
  136.  
  137. IF (n_o_face .GT. NOFACE) THEN
  138. write(ioimp,*) 'HHOELQ : NOFACE incorrect'
  139. CALL ERREUR(5)
  140. RETURN
  141. END IF
  142. IF (n_o_cell .GT. NOCELL) THEN
  143. write(ioimp,*) 'HHOELQ : NOCELL incorrect'
  144. CALL ERREUR(5)
  145. RETURN
  146. END IF
  147.  
  148. C=---------------------------------------------------------------------=
  149. C= REMPLISSAGE DU TABLEAU infele
  150. C=---------------------------------------------------------------------=
  151. C Remplissage de infele(1) : numero de l'element fini
  152. C --------------------------
  153. imodel.infele(1) = MELE
  154.  
  155. C Remplissage de infele(8) :
  156. C --------------------------
  157. c faces imodel.infele(8) = -1 * imodel.INFMOD( 9)
  158. imodel.infele(8) = -1 * imodel.INFMOD(12)
  159.  
  160. C Remplissage de infele(13) et infele(14) :
  161. C -----------------------------------------
  162. C infele(13) : numero de la FORMULATION - MFR
  163. imodel.infele(13) = MFR
  164. C infele(14) : numero de l'element GEOMETRIQUE - IELE
  165. imodel.infele(14) = IELE
  166.  
  167. C Remplissage de infele(10), infele(15) et infele(16) :
  168. C -----------------------------------------------------
  169. C infele(10) : dimension de la matrice de Hooke
  170. C infele(15) : nombre maximal de ddl par noeud
  171. C infele(16) : nombre de composantes de contraintes et deformations
  172.  
  173. IF (IFOUR.EQ.2) THEN
  174. imodel.infele(10) = 6
  175. imodel.infele(16) = 6
  176. ELSE
  177. imodel.infele(10) = 4
  178. imodel.infele(16) = 4
  179. ENDIF
  180. idifo = mlenti.lect(9)
  181. imodel.infele(15) = idifo * MAX(mlenti.lect(3),mlenti.lect(5))
  182.  
  183. imodel.infele(2) = 0
  184.  
  185. NBPINT = mlenti.lect(8)
  186. imodel.infele(3) = NBPINT
  187. imodel.infele(4) = NBPINT
  188. imodel.infele(6) = NBPINT
  189. C= infele(5) = Nombre de caracteristiques : utilite ?
  190. imodel.infele(5) = 4
  191. C= infele(7) = Taille du segment de travail a recuperer !
  192. imodel.infele(7) = 100
  193.  
  194. imodel.infele(9) = mlenti.lect(11)
  195.  
  196. imodel.infele(12) = -9
  197.  
  198. nb_faces = mlenti.lect(7)
  199.  
  200. C Remplissage de infele(11) : INTEGRATION DE L'ELEMENT FINI
  201. C ---------------------------
  202. C Quel(s) type(s) de segment est(sont) a traiter ?
  203. C 1 = Champ aux noeuds
  204. IF (INTTYP.EQ.1) THEN
  205. itgdeb = 1
  206. itgfin = 1
  207. C 2 = Point de Gauss, centre de gravite et champ CONSTANT
  208. ELSE IF (INTTYP.EQ.2) THEN
  209. itgdeb = 2
  210. itgfin = 2
  211. C 3 = Point de Gauss pour la rigidite
  212. C 4 = Point de Gauss pour la masse
  213. C 5 = Point de Gauss - calcul des contraintes
  214. ELSE IF (INTTYP.GE.3.AND.INTTYP.LE.5) THEN
  215. itgdeb = 3
  216. itgfin = 3
  217. C -10 = on fait tous les segments
  218. ELSE IF (INTTYP.EQ.-10) THEN
  219. itgdeb = 1
  220. itgfin = 3
  221. C = Pas de segment d'integration
  222. ELSE
  223. itgdeb = 0
  224. itgfin = -1
  225. END IF
  226.  
  227. iin = 0
  228. DO itg = itgdeb, itgfin
  229. C Si le segment d'integration a deja ete rempli : iin est non nul ici !
  230. C Si le segment n'a pas deja ete rempli : iin = 0
  231. iin = INTHHO(nb_faces,n_o_cell+1,itg,IBMODE)
  232. IF (iin.EQ.0) THEN
  233. minte = 0
  234. ** nbno = nb_faces
  235. nbno = 0
  236. IF (itg.EQ.1) THEN
  237. nbpgau = nb_faces
  238. SEGINI,minte
  239. ELSE IF (itg.EQ.2) THEN
  240. nbpgau = 1
  241. SEGINI,minte
  242. ELSE IF (itg.EQ.3) THEN
  243. nbpgau = NBPINT
  244. SEGINI,minte
  245. ENDIF
  246. DO i = 1, nbpgau
  247. minte.POIGAU(i) = 1.D0 / REAL(nbpgau)
  248. END DO
  249. IPT1 = minte
  250. IF (IPT1.NE.0) CALL SAVSEG(IPT1)
  251. iin = IPT1
  252. INTHHO(nb_faces,n_o_cell+1,itg,IBMODE) = iin
  253. END IF
  254. imodel.infmod(2+itg) = iin
  255. END DO
  256.  
  257. IF (INTTYP.EQ.-10) THEN
  258. DO itg = 4,5
  259. imodel.infmod(2+itg) = imodel.infmod(2+3)
  260. END DO
  261. END IF
  262.  
  263. imodel.infele(11) = iin
  264. MINTE = iin
  265. IF (MINTE.GT.0) SEGACT,MINTE
  266.  
  267. C Sortie de HHOELQ : le segment IPTR=INFO est ACTIF.
  268. IPTR = INFO
  269. END
  270.  
  271.  

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