Télécharger ylap2b.eso

Retour à la liste

Numérotation des lignes :

ylap2b
  1. C YLAP2B SOURCE CB215821 20/11/25 13:44:14 10792
  2. SUBROUTINE YLAP2B(ICOGRT,MPROC,MPVITC,MPTEMC,
  3. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  4. $ KRFACE,KRCENT,LCLIMT,KRTIMP,LCLIMQ,KRQIMP,
  5. $ NOMINC,
  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 : YLAP2B
  13. C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien
  14. C VF 3D.
  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 w, \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 : YLAP2A : Calcul de la matrice jacobienne du
  32. C résidu du laplacien VF 3D.
  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 NOMINC (type MLMOTS) : noms des inconnues.
  64. C KAPPA (type réel) : conductivité thermique (SI)
  65. C CV (type réel) : chaleur spécifique à volume
  66. C constant (SI).
  67. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  68. C résidu du laplacien VF 3D.
  69. C SORTIES : -
  70. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  71. C***********************************************************************
  72. C VERSION : v1, 28/08/2001, version initiale
  73. C HISTORIQUE : v1, 28/08/2001, création
  74. C HISTORIQUE :
  75. C HISTORIQUE :
  76. C***********************************************************************
  77. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  78. C en cas de modification de ce sous-programme afin de faciliter
  79. C la maintenance !
  80. C***********************************************************************
  81.  
  82. -INC PPARAM
  83. -INC CCOPTIO
  84. -INC SMCHPOI
  85. POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL,MPTEMC.MPOVAL
  86. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  87. -INC SMCHAML
  88. POINTEUR ICOGRT.MCHELM,JCOGRT.MCHAML
  89. POINTEUR KCDTDX.MELVAL,KCDTDY.MELVAL,KCDTDZ.MELVAL
  90. -INC SMELEME
  91. POINTEUR MELEFL.MELEME
  92. POINTEUR MCOGRT.MELEME
  93. -INC SMLENTI
  94. POINTEUR KRTIMP.MLENTI,KRQIMP.MLENTI
  95. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  96. -INC SMLMOTS
  97. POINTEUR NOMINC.MLMOTS
  98. POINTEUR IJACO.MATRIK
  99. *
  100. * Objet matrice élémentaire simplifié
  101. *
  102. SEGMENT GMATSI
  103. INTEGER POIPR1(NPP1,NEL1)
  104. INTEGER POIDU1(1,NEL1)
  105. INTEGER POIPR2(NPP2,NEL2)
  106. INTEGER POIDU2(2,NEL2)
  107. POINTEUR LMATSI(0).MATSIM
  108. ENDSEGMENT
  109. * Contributions de la part du gradient de température (CTGRT)
  110. POINTEUR CTGRT.GMATSI
  111. SEGMENT MATSIM
  112. CHARACTER*8 NOMPRI,NOMDUA
  113. REAL*8 VALMA1(1,NPP1,NEL1)
  114. REAL*8 VALMA2(2,NPP2,NEL2)
  115. ENDSEGMENT
  116. POINTEUR RETRHO.MATSIM
  117. POINTEUR RETROU.MATSIM
  118. POINTEUR RETROV.MATSIM
  119. POINTEUR RETROW.MATSIM
  120. POINTEUR RETRET.MATSIM
  121. *
  122. REAL*8 KAPPA,CV
  123. *
  124. INTEGER IMPR,IRET
  125. *
  126. LOGICAL LCLIMT,LCLIMQ
  127. LOGICAL LMUR
  128. LOGICAL LCTRB1
  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,BETAZ,CNX,CNY,CNZ
  137. REAL*8 SIGNOR,SURFFA,VOLUEL
  138. REAL*8 RHOP,UP,VP,WP,TP
  139. REAL*8 FACTOR
  140. REAL*8 DTDRHO,DTDROU,DTDROV,DTDROW,DTDRET
  141. C
  142. *
  143. * Executable statements
  144. *
  145. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans ylap2b.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 w, \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, RETROW, RETRET
  154. IF (LCLIMT) THEN
  155. SEGACT KRTIMP
  156. ENDIF
  157. IF (LCLIMQ) THEN
  158. SEGACT KRQIMP
  159. ENDIF
  160. SEGACT NOMINC
  161. SEGACT KRCENT
  162. SEGACT KRFACE
  163. SEGACT MELEFL
  164. SEGACT MPSURF
  165. SEGACT MPNORM
  166. SEGACT MPVOLU
  167. SEGACT MPROC
  168. SEGACT MPVITC
  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. KCDTDY=JCOGRT.IELVAL(2)
  178. KCDTDZ=JCOGRT.IELVAL(3)
  179. SEGDES JCOGRT
  180. SEGACT KCDTDX
  181. SEGACT KCDTDY
  182. SEGACT KCDTDZ
  183. SEGACT MCOGRT
  184. NELEM=MCOGRT.NUM(/2)
  185. NPTEL=MCOGRT.NUM(/1)
  186. NPP1=NPTEL-1
  187. NPP2=NPTEL-1
  188. NEL1=NELEM
  189. NEL2=NELEM
  190. IEL1=1
  191. IEL2=1
  192. SEGINI RETRHO
  193. SEGINI RETROU
  194. SEGINI RETROV
  195. SEGINI RETROW
  196. SEGINI RETRET
  197. SEGINI CTGRT
  198. RETRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  199. RETRHO.NOMPRI(5:8)=' '
  200. RETRHO.NOMDUA(1:4)=NOMINC.MOTS(5)
  201. RETRHO.NOMDUA(5:8)=' '
  202. RETROU.NOMPRI(1:4)=NOMINC.MOTS(2)
  203. RETROU.NOMPRI(5:8)=' '
  204. RETROU.NOMDUA(1:4)=NOMINC.MOTS(5)
  205. RETROU.NOMDUA(5:8)=' '
  206. RETROV.NOMPRI(1:4)=NOMINC.MOTS(3)
  207. RETROV.NOMPRI(5:8)=' '
  208. RETROV.NOMDUA(1:4)=NOMINC.MOTS(5)
  209. RETROV.NOMDUA(5:8)=' '
  210. RETROW.NOMPRI(1:4)=NOMINC.MOTS(4)
  211. RETROW.NOMPRI(5:8)=' '
  212. RETROW.NOMDUA(1:4)=NOMINC.MOTS(5)
  213. RETROW.NOMDUA(5:8)=' '
  214. RETRET.NOMPRI(1:4)=NOMINC.MOTS(5)
  215. RETRET.NOMPRI(5:8)=' '
  216. RETRET.NOMDUA(1:4)=NOMINC.MOTS(5)
  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. C
  269. C AB : we do not check the BC anymore
  270. C
  271. NLCENP=KRCENT.LECT(NPPRIM)
  272. IF (NLCENP .EQ. 0) THEN
  273. * Lorsque une contribution est nulle, on fixe artificiellement le
  274. * point primal égal au point dual.
  275. IF (.NOT.LMUR) THEN
  276. CTGRT.POIPR2(IPP,IEL2)=NPDUAL
  277. RETRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  278. RETROU.VALMA2(IPD,IPP,IEL2)=0.D0
  279. RETROV.VALMA2(IPD,IPP,IEL2)=0.D0
  280. RETROW.VALMA2(IPD,IPP,IEL2)=0.D0
  281. RETRET.VALMA2(IPD,IPP,IEL2)=0.D0
  282. ELSE
  283. CTGRT.POIPR1(IPP,IEL1)=NPDUAL
  284. RETRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  285. RETROU.VALMA1(IPD,IPP,IEL1)=0.D0
  286. RETROV.VALMA1(IPD,IPP,IEL1)=0.D0
  287. RETROW.VALMA1(IPD,IPP,IEL1)=0.D0
  288. RETRET.VALMA1(IPD,IPP,IEL1)=0.D0
  289. ENDIF
  290. ELSE
  291. * Les contributions valent :
  292. * (d Res_{\rho e_t})_d / (d var)_p =
  293. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \kappa
  294. * * [ ((n_x * \beta_x) + (n_y * \beta_y) + (n_z * \beta_z)) *
  295. * ((dT)_p / (d var)_p)]
  296. * avec :
  297. * (dT)_p / (d \rho)_p = (1 / \rho_p) *
  298. * ( (((u_p)^2 + (v_p)^2 + (w_p)^2) / (2 * c_v)) - T )
  299. * (dT)_p / (d \rho u)_p = - u_p / (\rho_p * c_v)
  300. * (dT)_p / (d \rho v)_p = - v_p / (\rho_p * c_v)
  301. * (dT)_p / (d \rho w)_p = - w_p / (\rho_p * c_v)
  302. * (dT)_p / (d \rho e_t)_p = 1 / (\rho_p * c_v)
  303. * \beta_x : coefficients pour le calcul de dT/dx
  304. * \beta_y : coefficients pour le calcul de dT/dy
  305. * \beta_z : coefficients pour le calcul de dT/dz
  306. *
  307. * normale sortante pour IPD=1, rentrante pour IPD=2
  308. SIGNOR=(-1.D0)**(IPD+1)
  309. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  310. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  311. CNX =MPNORM.VPOCHA(NLFACE,1)
  312. CNY =MPNORM.VPOCHA(NLFACE,2)
  313. CNZ =MPNORM.VPOCHA(NLFACE,3)
  314. BETAX =KCDTDX.VELCHE(IPP+1,IELEM)
  315. BETAY =KCDTDY.VELCHE(IPP+1,IELEM)
  316. BETAZ =KCDTDZ.VELCHE(IPP+1,IELEM)
  317. RHOP =MPROC.VPOCHA(NLCENP,1)
  318. UP =MPVITC.VPOCHA(NLCENP,1)
  319. VP =MPVITC.VPOCHA(NLCENP,2)
  320. WP =MPVITC.VPOCHA(NLCENP,3)
  321. TP =MPTEMC.VPOCHA(NLCENP,1)
  322. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*KAPPA
  323. $ *((CNX*BETAX)+(CNY*BETAY)+(CNZ*BETAZ))
  324. DTDRHO=((((UP*UP)+(VP*VP)+(WP*WP))
  325. $ /(2.D0*CV))-TP)/RHOP
  326. DTDROU=-UP/(RHOP*CV)
  327. DTDROV=-VP/(RHOP*CV)
  328. DTDROW=-WP/(RHOP*CV)
  329. DTDRET=1.D0/(RHOP*CV)
  330. IF (.NOT.LMUR) THEN
  331. CTGRT.POIPR2(IPP,IEL2)=NPPRIM
  332. RETRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRHO
  333. RETROU.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROU
  334. RETROV.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROV
  335. RETROW.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROW
  336. RETRET.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRET
  337. ELSE
  338. CTGRT.POIPR1(IPP,IEL1)=NPPRIM
  339. RETRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRHO
  340. RETROU.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROU
  341. RETROV.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROV
  342. RETROW.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROW
  343. RETRET.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRET
  344. ENDIF
  345. ENDIF
  346. 124 CONTINUE
  347. 122 CONTINUE
  348. IF (.NOT.LMUR) THEN
  349. IEL2=IEL2+1
  350. ELSE
  351. IEL1=IEL1+1
  352. ENDIF
  353. ENDIF
  354. 12 CONTINUE
  355. NPP1=NPTEL-1
  356. NPP2=NPTEL-1
  357. NEL1=IEL1-1
  358. NEL2=IEL2-1
  359. SEGADJ RETRHO
  360. SEGADJ RETROU
  361. SEGADJ RETROV
  362. SEGADJ RETROW
  363. SEGADJ RETRET
  364. SEGADJ CTGRT
  365. CTGRT.LMATSI(**)=RETRHO
  366. CTGRT.LMATSI(**)=RETROU
  367. CTGRT.LMATSI(**)=RETROV
  368. CTGRT.LMATSI(**)=RETROW
  369. CTGRT.LMATSI(**)=RETRET
  370. * On accumule les matrices résultantes dans IJACO
  371. CALL AJMTK(CTGRT,IJACO,IMPR,IRET)
  372. IF (IRET.NE.0) GOTO 9999
  373. SEGSUP RETRHO
  374. SEGSUP RETROU
  375. SEGSUP RETROV
  376. SEGSUP RETROW
  377. SEGSUP RETRET
  378. SEGSUP CTGRT
  379. *
  380. SEGDES MCOGRT
  381. SEGDES KCDTDZ
  382. SEGDES KCDTDY
  383. SEGDES KCDTDX
  384. 1 CONTINUE
  385. SEGDES ICOGRT
  386. SEGDES MPTEMC
  387. SEGDES MPVITC
  388. SEGDES MPROC
  389. SEGDES MPVOLU
  390. SEGDES MPNORM
  391. SEGDES MPSURF
  392. SEGDES MELEFL
  393. SEGDES KRFACE
  394. SEGDES KRCENT
  395. SEGDES NOMINC
  396. IF (LCLIMQ) THEN
  397. SEGDES KRQIMP
  398. ENDIF
  399. IF (LCLIMT) THEN
  400. SEGDES KRTIMP
  401. ENDIF
  402. *
  403. * Normal termination
  404. *
  405. IRET=0
  406. RETURN
  407. *
  408. * Format handling
  409. *
  410. *
  411. * Error handling
  412. *
  413. 9999 CONTINUE
  414. IRET=1
  415. WRITE(IOIMP,*) 'An error was detected in subroutine ylap2b'
  416. RETURN
  417. *
  418. * End of subroutine YLAP2B
  419. *
  420. END
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  

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