Télécharger yla1bt.eso

Retour à la liste

Numérotation des lignes :

yla1bt
  1. C YLA1BT SOURCE CB215821 20/11/25 13:43:59 10792
  2. C YLAP1B SOURCE LEPOTIER 02/12/17 21:19:20 4510
  3. SUBROUTINE YLA1BT(ICOGRT,MPTEMC,
  4. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  5. $ KRFACE,KRCENT,LCLIMT,KRTIMP,LCLIMQ,KRQIMP,
  6. $ LMIXT,KRMIXT,IJACO,
  7. $ IMPR,IRET)
  8. IMPLICIT INTEGER(I-N)
  9. IMPLICIT REAL*8 (A-H,O-Z)
  10. C***********************************************************************
  11. C NOM : YLA1BT
  12. C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien
  13. C VF 2D.
  14. C Ici, on ne calcule que les contributions à la matrice
  15. C jacobienne faisant intervenir les coefficients pour le
  16. C calcul des gradients de température (ICOGRT).
  17. C (contributions à d Res_{\rho e_t} / d var
  18. C var prenant successivement les valeurs :
  19. C \rho, \rho u, \rho v, \rho e_t)
  20. C
  21. C
  22. C
  23. C
  24. C LANGAGE : ESOPE
  25. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
  26. C mél : gounand@semt2.smts.cea.fr
  27. C***********************************************************************
  28. C APPELES (UTIL) : AJMTK : ajoute un objet de type MATSIM (non
  29. C standard) à un objet de type MATRIK.
  30. C APPELE PAR : YLAP1A : Calcul de la matrice jacobienne du
  31. C résidu du laplacien VF 2D.
  32. C***********************************************************************
  33. C ENTREES : ICOGRT (type MCHELM) : coefficients pour le
  34. C calcul du gradient de la température aux
  35. C interfaces.
  36. C MPROC (type MPOVAL) : masse volumique par
  37. C élément.
  38. C MPVITC (type MPOVAL) : vitesse par élément.
  39. C MPTEMC (type MPOVAL) : température par élément.
  40. C MPVOLU (type MPOVAL) : volume des éléments.
  41. C MPNORM (type MPOVAL) : normale aux faces.
  42. C MPSURF (type MPOVAL) : surface des faces.
  43. C MELEFL (type MELEME) : connectivités face-(centre
  44. C gauche, centre droit).
  45. C KRFACE (type MLENTI) : tableau de repérage dans
  46. C le maillage des faces des éléments.
  47. C KRCENT (type MLENTI) : tableau de repérage dans
  48. C le maillage des centres des éléments.
  49. C LCLIMT (type logique) : .TRUE. => CL de Dirichlet
  50. C sur la température.
  51. C KRTIMP (type MLENTI) : tableau de repérage dans
  52. C maillage des CL de Dirichlet sur la
  53. C température.
  54. C LCLIMQ (type logique) : .TRUE. => CL de Dirichlet
  55. C sur le flux de chaleur.
  56. C KRTIMP (type MLENTI) : tableau de repérage dans
  57. C maillage des CL de Dirichlet sur la
  58. C température.
  59. C KRQIMP (type MLENTI) : tableau de repérage dans
  60. C maillage des CL de Dirichlet sur le flux de
  61. C chaleur.
  62. C LMIXT (type logique) : .TRUE. => CL mixtes
  63. C KRMIXT (type MLENTI) : tableau de repérage dans
  64. C maillage des CL mixtes.
  65. C NOMINC (type MLMOTS) : noms des inconnues.
  66. C ICLAU : option pour ne calculer
  67. C que la thermique
  68. C KAPPA (type réel) : conductivité thermique (SI)
  69. C CV (type réel) : chaleur spécifique à volume
  70. C constant (SI).
  71. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  72. C résidu du laplacien VF 2D.
  73. C SORTIES : -
  74. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  75. C***********************************************************************
  76. C VERSION : v1, 08/08/2001, version initiale
  77. C HISTORIQUE : v1, 08/08/2001, création
  78. C HISTORIQUE : 11/02/2003, ajout de l'option 'MIXT'
  79. C HISTORIQUE :
  80. C***********************************************************************
  81. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  82. C en cas de modification de ce sous-programme afin de faciliter
  83. C la maintenance !
  84. C***********************************************************************
  85.  
  86. -INC PPARAM
  87. -INC CCOPTIO
  88. -INC SMCHPOI
  89. POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL,MPTEMC.MPOVAL
  90. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  91. -INC SMCHAML
  92. POINTEUR ICOGRT.MCHELM,JCOGRT.MCHAML
  93. POINTEUR KCDTDX.MELVAL,KCDTDY.MELVAL
  94. -INC SMELEME
  95. POINTEUR MELEFL.MELEME
  96. POINTEUR MCOGRT.MELEME
  97. -INC SMLENTI
  98. POINTEUR KRTIMP.MLENTI,KRQIMP.MLENTI,KRMIXT.MLENTI
  99. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  100. -INC SMLMOTS
  101. POINTEUR NOMINC.MLMOTS
  102. POINTEUR IJACO.MATRIK
  103. *
  104. * Objet matrice élémentaire simplifié
  105. *
  106. SEGMENT GMATSI
  107. INTEGER POIPR1(NPP1,NEL1)
  108. INTEGER POIDU1(1,NEL1)
  109. INTEGER POIPR2(NPP2,NEL2)
  110. INTEGER POIDU2(2,NEL2)
  111. POINTEUR LMATSI(0).MATSIM
  112. ENDSEGMENT
  113. * Contributions de la part du gradient de température (CTGRT)
  114. POINTEUR CTGRT.GMATSI
  115. SEGMENT MATSIM
  116. CHARACTER*8 NOMPRI,NOMDUA
  117. REAL*8 VALMA1(1,NPP1,NEL1)
  118. REAL*8 VALMA2(2,NPP2,NEL2)
  119. ENDSEGMENT
  120. POINTEUR RETRET.MATSIM
  121. *
  122. REAL*8 KAPPA,CV
  123. *
  124. INTEGER IMPR,IRET,ICLAU
  125. *
  126. LOGICAL LCLIMT,LCLIMQ,LMIXT
  127. LOGICAL LMUR
  128. LOGICAL LCTRB1,LCTRB2
  129. *
  130. INTEGER IELEM,IPD,IPP,ISOUCH,IEL1,IEL2
  131. INTEGER NELEM,NPD,NPP,NSOUCH,NEL1,NEL2,NPP1,NPP2
  132. INTEGER NGCDRO,NGCGAU,NGFACE,NPPRIM,NPDUAL
  133. INTEGER NLCENP,NLCEND,NLFACE,NLCLQ,NLCLT
  134. INTEGER NPTEL
  135. *
  136. REAL*8 BETAX,BETAY,CNX,CNY
  137. REAL*8 SIGNOR,SURFFA,VOLUEL
  138. REAL*8 RHOP,UP,VP,TP
  139. REAL*8 FACTOR
  140. REAL*8 DTDRHO,DTDROU,DTDROV,DTDRET
  141. C
  142. *
  143. * Executable statements
  144. *
  145. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans ylap1b.eso'
  146. * On calcule la partie de d Res_{\rho e_t} / d var
  147. * (var prend successivement les valeurs :
  148. * \rho, \rho u, \rho v, \rho e_t)
  149. * faisant intervenir les coefficients pour le calcul des gradients de
  150. * température (ICOGRT).
  151. * C'est la partie contenant le terme : - \vect{q} \pscal \vect{n}
  152. * Les noms de matrices élémentaires (type MATSIM) associées sont :
  153. * RETRHO, RETROU, RETROV, RETRET
  154. IF (LCLIMT) THEN
  155. SEGACT KRTIMP
  156. ENDIF
  157. IF (LCLIMQ) THEN
  158. SEGACT KRQIMP
  159. ENDIF
  160. IF (LMIXT) THEN
  161. SEGACT KRMIXT
  162. ENDIF
  163. SEGACT KRCENT
  164. SEGACT KRFACE
  165. SEGACT MELEFL
  166. SEGACT MPSURF
  167. SEGACT MPNORM
  168. SEGACT MPVOLU
  169. SEGACT MPTEMC
  170. SEGACT ICOGRT
  171. NSOUCH=ICOGRT.IMACHE(/1)
  172. DO 1 ISOUCH=1,NSOUCH
  173. MCOGRT=ICOGRT.IMACHE(ISOUCH)
  174. JCOGRT=ICOGRT.ICHAML(ISOUCH)
  175. SEGACT JCOGRT
  176. KCDTDX=JCOGRT.IELVAL(1)
  177. SEGDES JCOGRT
  178. SEGACT KCDTDX
  179. SEGACT MCOGRT
  180. NELEM=MCOGRT.NUM(/2)
  181. NPTEL=MCOGRT.NUM(/1)
  182. NPP1=NPTEL-1
  183. NPP2=NPTEL-1
  184. NEL1=NELEM
  185. NEL2=NELEM
  186. IEL1=1
  187. IEL2=1
  188.  
  189.  
  190. c BOUCLE POUR EVALUER LE NOMBRE DE FACES FRONTIERES
  191. c POUR CHAQUE SOUS DOMAINE
  192. NFRON = 1
  193. DO 1200 IELEM=1,NELEM
  194. NGFACE=MCOGRT.NUM(1,IELEM)
  195. NLFACE=KRFACE.LECT(NGFACE)
  196. IF (NLFACE.EQ.0) THEN
  197. WRITE(IOIMP,*) 'Erreur de programmation n1'
  198. GOTO 9999
  199. ENDIF
  200. NGCGAU=MELEFL.NUM(1,NLFACE)
  201. NGCDRO=MELEFL.NUM(3,NLFACE)
  202. IF ( NGCGAU.EQ.NGCDRO) THEN
  203. NFRON = NFRON + 1
  204. ENDIF
  205. 1200 CONTINUE
  206. c WRITE(6,*) 'NFRON= ',NFRON
  207. NEL1 = NFRON
  208. c WRITE(6,*) 'NPP1= ',NPP1,'NPP2= ',NPP2
  209. c WRITE(6,*) 'NEL1= ',NEL1,'NEL2= ',NEL2
  210.  
  211. SEGINI RETRET
  212. SEGINI CTGRT
  213. RETRET.NOMPRI(1:4)='RETN'
  214. RETRET.NOMPRI(5:8)=' '
  215. RETRET.NOMDUA(1:4)='RETN'
  216. RETRET.NOMDUA(5:8)=' '
  217. DO 12 IELEM=1,NELEM
  218. * Le premier point du support de ICOGRT est un point FACE
  219. NGFACE=MCOGRT.NUM(1,IELEM)
  220. NLFACE=KRFACE.LECT(NGFACE)
  221. IF (NLFACE.EQ.0) THEN
  222. WRITE(IOIMP,*) 'Erreur de programmation n1'
  223. GOTO 9999
  224. ENDIF
  225. * On calcule la contribution à la matrice jacobienne IJACO de la face
  226. * NGFAC (points duaux : centres à gauche et à droite de la face)
  227. * (points primaux : une partie (bicoz conditions aux limites)
  228. * de ceux du stencil pour le calcul du gradient
  229. * à la face, ils doivent être des points centres)
  230. * Si le flux de chaleur sur la face est imposé par les conditions
  231. * aux limites, la contribution de la face à IJACO est nulle.
  232. LCTRB1=.TRUE.
  233. c IF (LCLIMQ) THEN
  234. c NLCLQ=KRQIMP.LECT(NGFACE)
  235. c IF (NLCLQ.NE.0) THEN
  236. c LCTRB1=.FALSE.
  237. c ENDIF
  238. c ENDIF
  239. * WRITE(6,*) 'NGFACE= ',NGFACE,'LCTRB1= ', LCTRB1
  240. IF (LCTRB1) THEN
  241. NGCGAU=MELEFL.NUM(1,NLFACE)
  242. NGCDRO=MELEFL.NUM(3,NLFACE)
  243. LMUR=(NGCGAU.EQ.NGCDRO)
  244. * On distingue le cas où la face est un bord du maillage (mur)
  245. * du cas où la face est interne au maillage
  246. IF (.NOT.LMUR) THEN
  247. NPD=2
  248. ELSE
  249. NPD=1
  250. ENDIF
  251. NPP=NPTEL-1
  252. * IPD=1 : point à gauche du point NGFACE
  253. * IPD=2 : point à droite du point NGFACE
  254. DO 122 IPD=1,NPD
  255. NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE)
  256. IF (.NOT.LMUR) THEN
  257. CTGRT.POIDU2(IPD,IEL2)=NPDUAL
  258. ELSE
  259. CTGRT.POIDU1(IPD,IEL1)=NPDUAL
  260. ENDIF
  261. NLCEND=KRCENT.LECT(NPDUAL)
  262. IF (NLCEND.EQ.0) THEN
  263. WRITE(IOIMP,*) 'Erreur grave n1'
  264. GOTO 9999
  265. ENDIF
  266. DO 124 IPP=1,NPP
  267. NPPRIM=MCOGRT.NUM(IPP+1,IELEM)
  268. LCTRB2=.TRUE.
  269. IF (LCLIMT) THEN
  270. NLCLT=KRTIMP.LECT(NPPRIM)
  271. IF (NLCLT.NE.0) THEN
  272. LCTRB2=.FALSE.
  273. ENDIF
  274. ENDIF
  275. IF (LCLIMQ) THEN
  276. NLCLQ=KRQIMP.LECT(NPPRIM)
  277. IF (NLCLQ.NE.0) THEN
  278. LCTRB2=.FALSE.
  279. ENDIF
  280. ENDIF
  281. IF (LMIXT) THEN
  282. NLCLM=KRMIXT.LECT(NPPRIM)
  283. IF (NLCLM.NE.0) THEN
  284. LCTRB2=.FALSE.
  285. ENDIF
  286. ENDIF
  287. IF (.NOT.LCTRB2) THEN
  288. * Lorsque une contribution est nulle, on fixe artificiellement le
  289. * point primal égal au point dual.
  290. IF (.NOT.LMUR) THEN
  291. CTGRT.POIPR2(IPP,IEL2)=NPDUAL
  292. RETRET.VALMA2(IPD,IPP,IEL2)=0.D0
  293. ELSE
  294. CTGRT.POIPR1(IPP,IEL1)=NPDUAL
  295. RETRET.VALMA1(IPD,IPP,IEL1)=0.D0
  296. ENDIF
  297. ELSE
  298. * Les contributions valent :
  299. * (d Res_{\rho e_t})_d / (d var)_p =
  300. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \kappa
  301. * * [ ((n_x * \beta_x) +(n_y * \beta_y)) *
  302. * ((dT)_p / (d var)_p)]
  303. * avec :
  304. * (dT)_p / (d \rho)_p = (1 / \rho_p) *
  305. * ( (((u_p)^2 + (v_p)^2) / (2 * c_v)) - T )
  306. * (dT)_p / (d \rho u)_p = - u_p / (\rho_p * c_v)
  307. * (dT)_p / (d \rho v)_p = - v_p / (\rho_p * c_v)
  308. * (dT)_p / (d \rho e_t)_p = 1 / (\rho_p * c_v)
  309. * \beta_x : coefficients pour le calcul de dT/dx
  310. * \beta_y : coefficients pour le calcul de dT/dy
  311. *
  312. NLCENP=KRCENT.LECT(NPPRIM)
  313. IF (NLCENP.EQ.0) THEN
  314. WRITE(IOIMP,*) 'Erreur grave n2'
  315. GOTO 9999
  316. ENDIF
  317. * normale sortante pour IPD=1, rentrante pour IPD=2
  318. SIGNOR=(-1.D0)**(IPD+1)
  319. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  320. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  321. CNX =MPNORM.VPOCHA(NLFACE,1)
  322. CNY =MPNORM.VPOCHA(NLFACE,2)
  323. BETAX =KCDTDX.VELCHE(IPP+1,IELEM)
  324. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA
  325. $ *(BETAX)
  326. DTDRET=1.D0
  327. IF (.NOT.LMUR) THEN
  328. CTGRT.POIPR2(IPP,IEL2)=NPPRIM
  329. RETRET.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRET
  330. c WRITE(6,*) 'IPD=',IPD,'IPP=',IPP,'IEL2=',IEL2
  331. c WRITE(6,*) 'FACT=',FACTOR*DTDRET
  332. c WRITE(6,*) 'SIGNOR=',SIGNOR,'VOLUEL=',VOLUEL,
  333. c & 'SURFFA=',SURFFA,'BETAX= ',BETAX
  334. ELSE
  335. CTGRT.POIPR1(IPP,IEL1)=NPPRIM
  336. RETRET.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRET
  337. c WRITE(6,*) 'IPD=',IPD,'IPP=',IPP,'IEL1=',IEL1
  338. c WRITE(6,*) 'FACT=',FACTOR*DTDRET
  339. c WRITE(6,*) 'SIGNOR=',SIGNOR,'VOLUEL=',VOLUEL,
  340. c & 'SURFFA=',SURFFA,'BETAX= ',BETAX
  341. ENDIF
  342.  
  343. ENDIF
  344. 124 CONTINUE
  345. 122 CONTINUE
  346. IF (.NOT.LMUR) THEN
  347. IEL2=IEL2+1
  348. ELSE
  349. IEL1=IEL1+1
  350. ENDIF
  351. ENDIF
  352. 12 CONTINUE
  353. NPP1=NPTEL-1
  354. NPP2=NPTEL-1
  355. NEL1=IEL1-1
  356. NEL2=IEL2-1
  357.  
  358. c WRITE(6,*) 'APRES SEGADJ'
  359. c WRITE(6,*) 'NPP1= ',NPP1,'NPP2= ',NPP2
  360. c WRITE(6,*) 'NEL1= ',NEL1,'NEL2= ',NEL2
  361. SEGDES MCOGRT
  362. SEGDES KCDTDX
  363.  
  364. SEGADJ RETRET
  365. SEGADJ CTGRT
  366. CTGRT.LMATSI(**)=RETRET
  367. * On accumule les matrices résultantes dans IJACO
  368. CALL AJMTK(CTGRT,IJACO,IMPR,IRET)
  369. IF (IRET.NE.0) GOTO 9999
  370. SEGSUP RETRET
  371. SEGSUP CTGRT
  372. *
  373. 1 CONTINUE
  374. SEGDES ICOGRT
  375. SEGDES MPTEMC
  376. SEGDES MPVOLU
  377. SEGDES MPNORM
  378. SEGDES MPSURF
  379. SEGDES MELEFL
  380. SEGDES KRFACE
  381. SEGDES KRCENT
  382. IF (LCLIMQ) THEN
  383. SEGDES KRQIMP
  384. ENDIF
  385. IF (LCLIMT) THEN
  386. SEGDES KRTIMP
  387. ENDIF
  388. IF (LMIXT) THEN
  389. SEGDES KRMIXT
  390. ENDIF
  391. *
  392. * Normal termination
  393. *
  394. IRET=0
  395. RETURN
  396. *
  397. * Format handling
  398. *
  399. *
  400. * Error handling
  401. *
  402. 9999 CONTINUE
  403. IRET=1
  404. WRITE(IOIMP,*) 'An error was detected in subroutine ylap1b'
  405. RETURN
  406. *
  407. * End of subroutine YLAP1B
  408. *
  409. END
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  

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