Télécharger ylap1b.eso

Retour à la liste

Numérotation des lignes :

ylap1b
  1. C YLAP1B SOURCE CB215821 20/11/25 13:44:05 10792
  2. SUBROUTINE YLAP1B(ICOGRT,MPROC,MPVITC,MPTEMC,
  3. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  4. $ KRFACE,KRCENT,LCLIMT,KRTIMP,LCLIMQ,KRQIMP,
  5. $ LMIXT,KRMIXT,NOMINC,ICLAU,
  6. $ KAPPA,CV,
  7. $ IJACO,
  8. $ IMPR,IRET)
  9. IMPLICIT INTEGER(I-N)
  10. IMPLICIT REAL*8 (A-H,O-Z)
  11. C***********************************************************************
  12. C NOM : YLAP1B
  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 : YLAP1A : 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 KRTIMP (type MLENTI) : tableau de repérage dans
  58. C maillage des CL de Dirichlet sur la
  59. C température.
  60. C KRQIMP (type MLENTI) : tableau de repérage dans
  61. C maillage des CL de Dirichlet sur le flux de
  62. C chaleur.
  63. C LMIXT (type logique) : .TRUE. => CL mixtes
  64. C KRMIXT (type MLENTI) : tableau de repérage dans
  65. C maillage des CL mixtes.
  66. C NOMINC (type MLMOTS) : noms des inconnues.
  67. C ICLAU : option pour ne calculer
  68. C que la thermique
  69. C KAPPA (type réel) : conductivité thermique (SI)
  70. C CV (type réel) : chaleur spécifique à volume
  71. C constant (SI).
  72. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  73. C résidu du laplacien VF 2D.
  74. C SORTIES : -
  75. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  76. C***********************************************************************
  77. C VERSION : v1, 08/08/2001, version initiale
  78. C HISTORIQUE : v1, 08/08/2001, création
  79. C HISTORIQUE : 11/02/2003, ajout de l'option 'MIXT'
  80. C HISTORIQUE :
  81. C***********************************************************************
  82. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  83. C en cas de modification de ce sous-programme afin de faciliter
  84. C la maintenance !
  85. C***********************************************************************
  86.  
  87. -INC PPARAM
  88. -INC CCOPTIO
  89. -INC SMCHPOI
  90. POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL,MPTEMC.MPOVAL
  91. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  92. -INC SMCHAML
  93. POINTEUR ICOGRT.MCHELM,JCOGRT.MCHAML
  94. POINTEUR KCDTDX.MELVAL,KCDTDY.MELVAL
  95. -INC SMELEME
  96. POINTEUR MELEFL.MELEME
  97. POINTEUR MCOGRT.MELEME
  98. -INC SMLENTI
  99. POINTEUR KRTIMP.MLENTI,KRQIMP.MLENTI,KRMIXT.MLENTI
  100. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  101. -INC SMLMOTS
  102. POINTEUR NOMINC.MLMOTS
  103. POINTEUR IJACO.MATRIK
  104. *
  105. * Objet matrice élémentaire simplifié
  106. *
  107. SEGMENT GMATSI
  108. INTEGER POIPR1(NPP1,NEL1)
  109. INTEGER POIDU1(1,NEL1)
  110. INTEGER POIPR2(NPP2,NEL2)
  111. INTEGER POIDU2(2,NEL2)
  112. POINTEUR LMATSI(0).MATSIM
  113. ENDSEGMENT
  114. * Contributions de la part du gradient de température (CTGRT)
  115. POINTEUR CTGRT.GMATSI
  116. SEGMENT MATSIM
  117. CHARACTER*8 NOMPRI,NOMDUA
  118. REAL*8 VALMA1(1,NPP1,NEL1)
  119. REAL*8 VALMA2(2,NPP2,NEL2)
  120. ENDSEGMENT
  121. POINTEUR RETRHO.MATSIM
  122. POINTEUR RETROU.MATSIM
  123. POINTEUR RETROV.MATSIM
  124. POINTEUR RETRET.MATSIM
  125. *
  126. REAL*8 KAPPA,CV
  127. *
  128. INTEGER IMPR,IRET,ICLAU
  129. *
  130. LOGICAL LCLIMT,LCLIMQ,LMIXT
  131. LOGICAL LMUR
  132. LOGICAL LCTRB1,LCTRB2
  133. *
  134. INTEGER IELEM,IPD,IPP,ISOUCH,IEL1,IEL2
  135. INTEGER NELEM,NPD,NPP,NSOUCH,NEL1,NEL2,NPP1,NPP2
  136. INTEGER NGCDRO,NGCGAU,NGFACE,NPPRIM,NPDUAL
  137. INTEGER NLCENP,NLCEND,NLFACE,NLCLQ,NLCLT
  138. INTEGER NPTEL
  139. *
  140. REAL*8 BETAX,BETAY,CNX,CNY
  141. REAL*8 SIGNOR,SURFFA,VOLUEL
  142. REAL*8 RHOP,UP,VP,TP
  143. REAL*8 FACTOR
  144. REAL*8 DTDRHO,DTDROU,DTDROV,DTDRET
  145. C
  146. *
  147. * Executable statements
  148. *
  149. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans ylap1b.eso'
  150. * On calcule la partie de d Res_{\rho e_t} / d var
  151. * (var prend successivement les valeurs :
  152. * \rho, \rho u, \rho v, \rho e_t)
  153. * faisant intervenir les coefficients pour le calcul des gradients de
  154. * température (ICOGRT).
  155. * C'est la partie contenant le terme : - \vect{q} \pscal \vect{n}
  156. * Les noms de matrices élémentaires (type MATSIM) associées sont :
  157. * RETRHO, RETROU, RETROV, RETRET
  158. IF (LCLIMT) THEN
  159. SEGACT KRTIMP
  160. ENDIF
  161. IF (LCLIMQ) THEN
  162. SEGACT KRQIMP
  163. ENDIF
  164. IF (LMIXT) THEN
  165. SEGACT KRMIXT
  166. ENDIF
  167. SEGACT NOMINC
  168. SEGACT KRCENT
  169. SEGACT KRFACE
  170. SEGACT MELEFL
  171. SEGACT MPSURF
  172. SEGACT MPNORM
  173. SEGACT MPVOLU
  174. SEGACT MPROC
  175. SEGACT MPVITC
  176. SEGACT MPTEMC
  177. SEGACT ICOGRT
  178. NSOUCH=ICOGRT.IMACHE(/1)
  179. DO 1 ISOUCH=1,NSOUCH
  180. MCOGRT=ICOGRT.IMACHE(ISOUCH)
  181. JCOGRT=ICOGRT.ICHAML(ISOUCH)
  182. SEGACT JCOGRT
  183. KCDTDX=JCOGRT.IELVAL(1)
  184. KCDTDY=JCOGRT.IELVAL(2)
  185. SEGDES JCOGRT
  186. SEGACT KCDTDX
  187. SEGACT KCDTDY
  188. SEGACT MCOGRT
  189. NELEM=MCOGRT.NUM(/2)
  190. NPTEL=MCOGRT.NUM(/1)
  191. NPP1=NPTEL-1
  192. NPP2=NPTEL-1
  193. NEL1=NELEM
  194. NEL2=NELEM
  195. IEL1=1
  196. IEL2=1
  197. SEGINI RETRHO
  198. SEGINI RETROU
  199. SEGINI RETROV
  200. SEGINI RETRET
  201. SEGINI CTGRT
  202. RETRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  203. RETRHO.NOMPRI(5:8)=' '
  204. RETRHO.NOMDUA(1:4)=NOMINC.MOTS(4)
  205. RETRHO.NOMDUA(5:8)=' '
  206. RETROU.NOMPRI(1:4)=NOMINC.MOTS(2)
  207. RETROU.NOMPRI(5:8)=' '
  208. RETROU.NOMDUA(1:4)=NOMINC.MOTS(4)
  209. RETROU.NOMDUA(5:8)=' '
  210. RETROV.NOMPRI(1:4)=NOMINC.MOTS(3)
  211. RETROV.NOMPRI(5:8)=' '
  212. RETROV.NOMDUA(1:4)=NOMINC.MOTS(4)
  213. RETROV.NOMDUA(5:8)=' '
  214. RETRET.NOMPRI(1:4)=NOMINC.MOTS(4)
  215. RETRET.NOMPRI(5:8)=' '
  216. RETRET.NOMDUA(1:4)=NOMINC.MOTS(4)
  217. RETRET.NOMDUA(5:8)=' '
  218. DO 12 IELEM=1,NELEM
  219. * Le premier point du support de ICOGRT est un point FACE
  220. NGFACE=MCOGRT.NUM(1,IELEM)
  221. NLFACE=KRFACE.LECT(NGFACE)
  222. IF (NLFACE.EQ.0) THEN
  223. WRITE(IOIMP,*) 'Erreur de programmation n°1'
  224. GOTO 9999
  225. ENDIF
  226. * On calcule la contribution à la matrice jacobienne IJACO de la face
  227. * NGFAC (points duaux : centres à gauche et à droite de la face)
  228. * (points primaux : une partie (bicoz conditions aux limites)
  229. * de ceux du stencil pour le calcul du gradient
  230. * à la face, ils doivent être des points centres)
  231. * Si le flux de chaleur sur la face est imposé par les conditions
  232. * aux limites, la contribution de la face à IJACO est nulle.
  233. LCTRB1=.TRUE.
  234. IF (LCLIMQ) THEN
  235. NLCLQ=KRQIMP.LECT(NGFACE)
  236. IF (NLCLQ.NE.0) THEN
  237. LCTRB1=.FALSE.
  238. ENDIF
  239. ENDIF
  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 n°1'
  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. RETRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  293. RETROU.VALMA2(IPD,IPP,IEL2)=0.D0
  294. RETROV.VALMA2(IPD,IPP,IEL2)=0.D0
  295. RETRET.VALMA2(IPD,IPP,IEL2)=0.D0
  296. ELSE
  297. CTGRT.POIPR1(IPP,IEL1)=NPDUAL
  298. RETRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  299. RETROU.VALMA1(IPD,IPP,IEL1)=0.D0
  300. RETROV.VALMA1(IPD,IPP,IEL1)=0.D0
  301. RETRET.VALMA1(IPD,IPP,IEL1)=0.D0
  302. ENDIF
  303. ELSE
  304. * Les contributions valent :
  305. * (d Res_{\rho e_t})_d / (d var)_p =
  306. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \kappa
  307. * * [ ((n_x * \beta_x) +(n_y * \beta_y)) *
  308. * ((dT)_p / (d var)_p)]
  309. * avec :
  310. * (dT)_p / (d \rho)_p = (1 / \rho_p) *
  311. * ( (((u_p)^2 + (v_p)^2) / (2 * c_v)) - T )
  312. * (dT)_p / (d \rho u)_p = - u_p / (\rho_p * c_v)
  313. * (dT)_p / (d \rho v)_p = - v_p / (\rho_p * c_v)
  314. * (dT)_p / (d \rho e_t)_p = 1 / (\rho_p * c_v)
  315. * \beta_x : coefficients pour le calcul de dT/dx
  316. * \beta_y : coefficients pour le calcul de dT/dy
  317. *
  318. NLCENP=KRCENT.LECT(NPPRIM)
  319. IF (NLCENP.EQ.0) THEN
  320. WRITE(IOIMP,*) 'Erreur grave n°2'
  321. GOTO 9999
  322. ENDIF
  323. * normale sortante pour IPD=1, rentrante pour IPD=2
  324. SIGNOR=(-1.D0)**(IPD+1)
  325. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  326. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  327. CNX =MPNORM.VPOCHA(NLFACE,1)
  328. CNY =MPNORM.VPOCHA(NLFACE,2)
  329. BETAX =KCDTDX.VELCHE(IPP+1,IELEM)
  330. BETAY =KCDTDY.VELCHE(IPP+1,IELEM)
  331. RHOP =MPROC.VPOCHA(NLCENP,1)
  332. UP =MPVITC.VPOCHA(NLCENP,1)
  333. VP =MPVITC.VPOCHA(NLCENP,2)
  334. TP =MPTEMC.VPOCHA(NLCENP,1)
  335. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*KAPPA
  336. $ *((CNX*BETAX)+(CNY*BETAY))
  337. DTDRHO=((((UP*UP)+(VP*VP))/(2.D0*CV))-TP)/RHOP
  338. DTDROU=-UP/(RHOP*CV)
  339. DTDROV=-VP/(RHOP*CV)
  340. DTDRET=1.D0/(RHOP*CV)
  341. IF (.NOT.LMUR) THEN
  342. CTGRT.POIPR2(IPP,IEL2)=NPPRIM
  343. RETRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRHO
  344. RETROU.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROU
  345. RETROV.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROV
  346. RETRET.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRET
  347. ELSE
  348. CTGRT.POIPR1(IPP,IEL1)=NPPRIM
  349. RETRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRHO
  350. RETROU.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROU
  351. RETROV.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROV
  352. RETRET.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRET
  353. ENDIF
  354. ENDIF
  355. 124 CONTINUE
  356. 122 CONTINUE
  357. IF (.NOT.LMUR) THEN
  358. IEL2=IEL2+1
  359. ELSE
  360. IEL1=IEL1+1
  361. ENDIF
  362. ENDIF
  363. 12 CONTINUE
  364. NPP1=NPTEL-1
  365. NPP2=NPTEL-1
  366. NEL1=IEL1-1
  367. NEL2=IEL2-1
  368. SEGADJ RETRHO
  369. SEGADJ RETROU
  370. SEGADJ RETROV
  371. SEGADJ RETRET
  372. SEGADJ CTGRT
  373. IF (ICLAU.EQ.0) THEN
  374. CTGRT.LMATSI(**)=RETRHO
  375. CTGRT.LMATSI(**)=RETROU
  376. CTGRT.LMATSI(**)=RETROV
  377. ENDIF
  378. CTGRT.LMATSI(**)=RETRET
  379. * On accumule les matrices résultantes dans IJACO
  380. CALL AJMTK(CTGRT,IJACO,IMPR,IRET)
  381. IF (IRET.NE.0) GOTO 9999
  382. SEGSUP RETRHO
  383. SEGSUP RETROU
  384. SEGSUP RETROV
  385. SEGSUP RETRET
  386. SEGSUP CTGRT
  387. *
  388. SEGDES MCOGRT
  389. SEGDES KCDTDY
  390. SEGDES KCDTDX
  391. 1 CONTINUE
  392. SEGDES ICOGRT
  393. SEGDES MPTEMC
  394. SEGDES MPVITC
  395. SEGDES MPROC
  396. SEGDES MPVOLU
  397. SEGDES MPNORM
  398. SEGDES MPSURF
  399. SEGDES MELEFL
  400. SEGDES KRFACE
  401. SEGDES KRCENT
  402. SEGDES NOMINC
  403. IF (LCLIMQ) THEN
  404. SEGDES KRQIMP
  405. ENDIF
  406. IF (LCLIMT) THEN
  407. SEGDES KRTIMP
  408. ENDIF
  409. IF (LMIXT) THEN
  410. SEGDES KRMIXT
  411. ENDIF
  412. *
  413. * Normal termination
  414. *
  415. IRET=0
  416. RETURN
  417. *
  418. * Format handling
  419. *
  420. *
  421. * Error handling
  422. *
  423. 9999 CONTINUE
  424. IRET=1
  425. WRITE(IOIMP,*) 'An error was detected in subroutine ylap1b'
  426. RETURN
  427. *
  428. * End of subroutine YLAP1B
  429. *
  430. END
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  

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