Télécharger hhoelq.eso

Retour à la liste

Numérotation des lignes :

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

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