Télécharger hhoelq.eso

Retour à la liste

Numérotation des lignes :

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

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