Télécharger xlap1b.eso

Retour à la liste

Numérotation des lignes :

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

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