Télécharger hhoelq.eso

Retour à la liste

Numérotation des lignes :

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

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