Télécharger zlap1b.eso

Retour à la liste

Numérotation des lignes :

zlap1b
  1. C ZLAP1B SOURCE CB215821 20/11/25 13:45:05 10792
  2. SUBROUTINE ZLAP1B(PROPHY,PROPH2,MPROC,
  3. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  4. $ KRFACE,KRCENT,LCLIMR,KRRIMP,MPRIMP,
  5. $ NOMINC,
  6. $ IJACO,
  7. $ IMPR,IRET)
  8. IMPLICIT INTEGER(I-N)
  9. IMPLICIT REAL*8 (A-H,O-Z)
  10. C***********************************************************************
  11. C NOM : ZLAP1B
  12. C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien
  13. C VF 2D (termes multi-espèces).
  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 Yk
  17. C (contributions à d Res_{\rho Yk} / d var
  18. C var prenant successivement les valeurs :
  19. C \rho, \rho Yk)
  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 : ZLAP1A : Calcul de la matrice jacobienne du
  31. C résidu du laplacien VF 2D.
  32. C***********************************************************************
  33. C ENTREES : PROPHY (type PROPHY) : propriétés des espèces
  34. C PROPH2 (type PROPH2) : précond. de PROPHY
  35. C MPROC (type MPOVAL) : masse volumique par
  36. C élément.
  37. C MPVOLU (type MPOVAL) : volume des éléments.
  38. C MPNORM (type MPOVAL) : normale aux faces.
  39. C MPSURF (type MPOVAL) : surface des faces.
  40. C MELEFL (type MELEME) : connectivités face-(centre
  41. C gauche, centre droit).
  42. C KRFACE (type MLENTI) : tableau de repérage dans
  43. C le maillage des faces des éléments.
  44. C KRCENT (type MLENTI) : tableau de repérage dans
  45. C le maillage des centres des éléments.
  46. C LCLIMR (type logique) : .TRUE. => CL de Dirichlet
  47. C sur la densité.
  48. C KRRIMP (type MLENTI) : tableau de repérage dans
  49. C maillage des CL de Dirichlet sur la densité.
  50. C MPRIMP (type MPOVAL) : valeurs des CL de
  51. C Dirichlet sur la densité.
  52. C NOMINC (type MLMOTS) : noms des inconnues.
  53. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  54. C résidu du laplacien VF 2D.
  55. C SORTIES : -
  56. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  57. C***********************************************************************
  58. C VERSION : v1, 22/02/2002, version initiale
  59. C HISTORIQUE : v1, 22/02/2002, création
  60. C HISTORIQUE :
  61. C HISTORIQUE :
  62. C***********************************************************************
  63. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  64. C en cas de modification de ce sous-programme afin de faciliter
  65. C la maintenance !
  66. C***********************************************************************
  67.  
  68. -INC PPARAM
  69. -INC CCOPTIO
  70. -INC SMCOORD
  71. -INC SMCHPOI
  72. POINTEUR MPDKC.MPOVAL
  73. POINTEUR MPROC.MPOVAL,MPYKC.MPOVAL
  74. POINTEUR MPRIMP.MPOVAL
  75. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  76. -INC SMCHAML
  77. POINTEUR ICOGRY.MCHELM,JCOGRY.MCHAML
  78. POINTEUR KDYKDX.MELVAL,KDYKDY.MELVAL
  79. -INC SMELEME
  80. POINTEUR MELEFL.MELEME
  81. POINTEUR MCOGRY.MELEME
  82. -INC SMLENTI
  83. POINTEUR KRYIMP.MLENTI,KRRIMP.MLENTI
  84. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  85. -INC SMLMOTS
  86. POINTEUR NOMINC.MLMOTS
  87. POINTEUR IJACO.MATRIK
  88. INTEGER NESP,IESP
  89. SEGMENT PROPHY
  90. CHARACTER*4 NOMESP(NESP+1)
  91. REAL*8 CV(NESP+1)
  92. REAL*8 R(NESP+1)
  93. REAL*8 H0K(NESP+1)
  94. POINTEUR CDIFF(NESP+1).MCHPOI
  95. POINTEUR YK(NESP+1).MCHPOI
  96. POINTEUR GRADYK(NESP+1).MCHPOI
  97. POINTEUR CGRYK(NESP+1).MCHELM
  98. POINTEUR CLYK(NESP+1).MCHPOI
  99. ENDSEGMENT
  100. SEGMENT PROPH2
  101. POINTEUR MPDIFF(NESP+1).MPOVAL
  102. POINTEUR MPVALY(NESP+1).MPOVAL
  103. POINTEUR MPGRAD(NESP+1).MPOVAL
  104. LOGICAL LCLIM(NESP+1)
  105. POINTEUR KRCLIM(NESP+1).MLENTI
  106. ENDSEGMENT
  107. *
  108. * Objet matrice élémentaire simplifié
  109. *
  110. SEGMENT GMATSI
  111. INTEGER POIPR1(NPP1,NEL1)
  112. INTEGER POIDU1(1,NEL1)
  113. INTEGER POIPR2(NPP2,NEL2)
  114. INTEGER POIDU2(2,NEL2)
  115. POINTEUR LMATSI(0).MATSIM
  116. ENDSEGMENT
  117. * Contributions de la part du gradient de YK (CTGRY)
  118. POINTEUR CTGRY.GMATSI
  119. SEGMENT MATSIM
  120. CHARACTER*8 NOMPRI,NOMDUA
  121. REAL*8 VALMA1(1,NPP1,NEL1)
  122. REAL*8 VALMA2(2,NPP2,NEL2)
  123. ENDSEGMENT
  124. POINTEUR RYKRHO.MATSIM
  125. POINTEUR RYKRYK.MATSIM
  126. *
  127. REAL*8 DKG,DKD,DKF,RHOG,RHOD,RHOF
  128. *
  129. INTEGER IMPR,IRET
  130. *
  131. LOGICAL LCLIMY,LCLIMR
  132. LOGICAL LMUR
  133. LOGICAL LCTRB2
  134. *
  135. INTEGER IELEM,IPD,IPP,ISOUCH,IEL1,IEL2
  136. INTEGER NELEM,NPD,NPP,NSOUCH,NEL1,NEL2,NPP1,NPP2
  137. INTEGER NGCDRO,NGCGAU,NGFACE,NPPRIM,NPDUAL
  138. INTEGER NLCENP,NLCEND,NLFACE,NLCLY,NLFRI
  139. INTEGER NPTEL
  140. *
  141. REAL*8 BETAX,BETAY,CNX,CNY
  142. REAL*8 SIGNOR,SURFFA,VOLUEL
  143. REAL*8 RHOP,YKP
  144. REAL*8 FACTOR
  145. REAL*8 DYKDRO,DYKDRY
  146. *
  147. INTEGER ICOORX,NLCGAU,NLCDRO
  148. REAL*8 XF,YF,XG,YG,XFMXG,YFMYG,DRG
  149. & ,XD,YD,XFMXD,YFMYD,DRD,ALPHA,UMALPH
  150. C
  151. *
  152. * Executable statements
  153. *
  154. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans zlap1b.eso'
  155. SEGACT PROPHY
  156. NESP=PROPHY.CV(/1)-1
  157. SEGACT PROPH2
  158. DO IESP=1,NESP
  159. IF (LCLIMR) THEN
  160. SEGACT KRRIMP
  161. SEGACT MPRIMP
  162. ENDIF
  163. LCLIMY=PROPH2.LCLIM(IESP)
  164. IF (LCLIMY) THEN
  165. KRYIMP=PROPH2.KRCLIM(IESP)
  166. SEGACT KRYIMP
  167. ENDIF
  168. SEGACT NOMINC
  169. SEGACT KRCENT
  170. SEGACT KRFACE
  171. SEGACT MELEFL
  172. SEGACT MPSURF
  173. SEGACT MPNORM
  174. SEGACT MPVOLU
  175. MPDKC=PROPH2.MPDIFF(IESP)
  176. SEGACT MPDKC
  177. SEGACT MPROC
  178. MPYKC=PROPH2.MPVALY(IESP)
  179. SEGACT MPYKC
  180. ICOGRY=PROPHY.CGRYK(IESP)
  181. SEGACT ICOGRY
  182. NSOUCH=ICOGRY.IMACHE(/1)
  183. DO 1 ISOUCH=1,NSOUCH
  184. MCOGRY=ICOGRY.IMACHE(ISOUCH)
  185. JCOGRY=ICOGRY.ICHAML(ISOUCH)
  186. SEGACT JCOGRY
  187. KDYKDX=JCOGRY.IELVAL(1)
  188. KDYKDY=JCOGRY.IELVAL(2)
  189. SEGDES JCOGRY
  190. SEGACT KDYKDX
  191. SEGACT KDYKDY
  192. SEGACT MCOGRY
  193. NELEM=MCOGRY.NUM(/2)
  194. NPTEL=MCOGRY.NUM(/1)
  195. NPP1=NPTEL-1
  196. NPP2=NPTEL-1
  197. NEL1=NELEM
  198. NEL2=NELEM
  199. IEL1=1
  200. IEL2=1
  201. SEGINI RYKRHO
  202. SEGINI RYKRYK
  203. SEGINI CTGRY
  204. RYKRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  205. RYKRHO.NOMPRI(5:8)=' '
  206. RYKRHO.NOMDUA(1:4)=NOMINC.MOTS(IDIM+2+IESP)
  207. RYKRHO.NOMDUA(5:8)=' '
  208. RYKRYK.NOMPRI(1:4)=NOMINC.MOTS(IDIM+2+IESP)
  209. RYKRYK.NOMPRI(5:8)=' '
  210. RYKRYK.NOMDUA(1:4)=NOMINC.MOTS(IDIM+2+IESP)
  211. RYKRYK.NOMDUA(5:8)=' '
  212. DO 12 IELEM=1,NELEM
  213. * Le premier point du support de ICOGRY est un point FACE
  214. NGFACE=MCOGRY.NUM(1,IELEM)
  215. NLFACE=KRFACE.LECT(NGFACE)
  216. IF (NLFACE.EQ.0) THEN
  217. WRITE(IOIMP,*) 'Erreur de programmation n°1'
  218. GOTO 9999
  219. ENDIF
  220. * On calcule la contribution à la matrice jacobienne IJACO de la face
  221. * NGFAC (points duaux : centres à gauche et à droite de la face)
  222. * (points primaux : une partie (bicoz conditions aux limites)
  223. * de ceux du stencil pour le calcul du gradient
  224. * à la face, ils doivent être des points centres)
  225. * Si le flux de chaleur sur la face est imposé par les conditions
  226. * aux limites, la contribution de la face à IJACO est nulle.
  227. NGCGAU=MELEFL.NUM(1,NLFACE)
  228. NGCDRO=MELEFL.NUM(3,NLFACE)
  229. NLCGAU=KRCENT.LECT(NGCGAU)
  230. NLCDRO=KRCENT.LECT(NGCDRO)
  231. LMUR=(NGCGAU.EQ.NGCDRO)
  232. * On distingue le cas où la face est un bord du maillage (mur)
  233. * du cas où la face est interne au maillage
  234. IF (.NOT.LMUR) THEN
  235. NPD=2
  236. ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
  237. XF = MCOORD.XCOOR(ICOORX)
  238. YF = MCOORD.XCOOR(ICOORX+1)
  239. ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
  240. XG = MCOORD.XCOOR(ICOORX)
  241. YG = MCOORD.XCOOR(ICOORX+1)
  242. XFMXG = XF - XG
  243. YFMYG = YF - YG
  244. DRG=SQRT((XFMXG*XFMXG)+(YFMYG*YFMYG))
  245. ICOORX = ((IDIM + 1) * (NGCDRO - 1))+1
  246. XD = MCOORD.XCOOR(ICOORX)
  247. YD = MCOORD.XCOOR(ICOORX+1)
  248. XFMXD = XF - XD
  249. YFMYD = YF - YD
  250. DRD=SQRT((XFMXD*XFMXD)+(YFMYD*YFMYD))
  251. ALPHA=DRG/(DRG+DRD)
  252. UMALPH= 1.0D0 - ALPHA
  253. ELSE
  254. NPD=1
  255. ALPHA=0.0D0
  256. UMALPH=1.0D0
  257. ENDIF
  258. IF (LCLIMR) THEN
  259. NLFRI=KRRIMP.LECT(NGFACE)
  260. ELSE
  261. NLFRI=0
  262. ENDIF
  263. IF (NLFRI.GT.0) THEN
  264. RHOF=MPRIMP.VPOCHA(NLFRI,1)
  265. ELSE
  266. RHOG = MPROC.VPOCHA(NLCGAU,1)
  267. RHOD = MPROC.VPOCHA(NLCDRO,1)
  268. RHOF = UMALPH * RHOG + ALPHA * RHOD
  269. ENDIF
  270. DKG = MPDKC.VPOCHA(NLCGAU,1)
  271. DKD = MPDKC.VPOCHA(NLCDRO,1)
  272. DKF = UMALPH * DKG + ALPHA * DKD
  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. CTGRY.POIDU2(IPD,IEL2)=NPDUAL
  280. ELSE
  281. CTGRY.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=MCOGRY.NUM(IPP+1,IELEM)
  290. LCTRB2=.TRUE.
  291. IF (LCLIMY) THEN
  292. NLCLY=KRYIMP.LECT(NPPRIM)
  293. IF (NLCLY.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. CTGRY.POIPR2(IPP,IEL2)=NPDUAL
  302. RYKRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  303. RYKRYK.VALMA2(IPD,IPP,IEL2)=0.D0
  304. ELSE
  305. CTGRY.POIPR1(IPP,IEL1)=NPDUAL
  306. RYKRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  307. RYKRYK.VALMA1(IPD,IPP,IEL1)=0.D0
  308. ENDIF
  309. ELSE
  310. * Les contributions valent :
  311. * (d Res_{\rho Yk})_d / (d var)_p =
  312. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \rho_f * Dk_f
  313. * * [ ((n_x * \beta_x) +(n_y * \beta_y)) *
  314. * ((dYk)_p / (d var)_p)]
  315. * avec :
  316. * (dYk)_p / (d \rho)_p = - Yk_p / \rho_p
  317. * (dYk)_p / (d \rho Yk)_p = 1 / \rho_p
  318. * \beta_x : coefficients pour le calcul de dYk/dx
  319. * \beta_y : coefficients pour le calcul de dYk/dy
  320. *
  321. NLCENP=KRCENT.LECT(NPPRIM)
  322. IF (NLCENP.EQ.0) THEN
  323. WRITE(IOIMP,*) 'Erreur grave n°2'
  324. GOTO 9999
  325. ENDIF
  326. * normale sortante pour IPD=1, rentrante pour IPD=2
  327. SIGNOR=(-1.D0)**(IPD+1)
  328. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  329. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  330. CNX =MPNORM.VPOCHA(NLFACE,1)
  331. CNY =MPNORM.VPOCHA(NLFACE,2)
  332. BETAX =KDYKDX.VELCHE(IPP+1,IELEM)
  333. BETAY =KDYKDY.VELCHE(IPP+1,IELEM)
  334. RHOP =MPROC.VPOCHA(NLCENP,1)
  335. YKP =MPYKC.VPOCHA(NLCENP,1)
  336. * YKP =MPYKC.VPOCHA(NLCEND,1)
  337. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*RHOF*DKF
  338. $ *((CNX*BETAX)+(CNY*BETAY))
  339. DYKDRO=-YKP/RHOP
  340. DYKDRY=1.D0/RHOP
  341. IF (.NOT.LMUR) THEN
  342. CTGRY.POIPR2(IPP,IEL2)=NPPRIM
  343. RYKRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DYKDRO
  344. RYKRYK.VALMA2(IPD,IPP,IEL2)=FACTOR*DYKDRY
  345. ELSE
  346. CTGRY.POIPR1(IPP,IEL1)=NPPRIM
  347. RYKRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DYKDRO
  348. RYKRYK.VALMA1(IPD,IPP,IEL1)=FACTOR*DYKDRY
  349. ENDIF
  350. ENDIF
  351. 124 CONTINUE
  352. 122 CONTINUE
  353. IF (.NOT.LMUR) THEN
  354. IEL2=IEL2+1
  355. ELSE
  356. IEL1=IEL1+1
  357. ENDIF
  358. 12 CONTINUE
  359. NPP1=NPTEL-1
  360. NPP2=NPTEL-1
  361. NEL1=IEL1-1
  362. NEL2=IEL2-1
  363. SEGADJ RYKRHO
  364. SEGADJ RYKRYK
  365. SEGADJ CTGRY
  366. CTGRY.LMATSI(**)=RYKRHO
  367. CTGRY.LMATSI(**)=RYKRYK
  368. * On accumule les matrices résultantes dans IJACO
  369. CALL AJMTK(CTGRY,IJACO,IMPR,IRET)
  370. IF (IRET.NE.0) GOTO 9999
  371. SEGSUP RYKRHO
  372. SEGSUP RYKRYK
  373. SEGSUP CTGRY
  374. *
  375. SEGDES MCOGRY
  376. SEGDES KDYKDY
  377. SEGDES KDYKDX
  378. 1 CONTINUE
  379. SEGDES ICOGRY
  380. SEGDES MPYKC
  381. SEGDES MPROC
  382. SEGDES MPDKC
  383. SEGDES MPVOLU
  384. SEGDES MPNORM
  385. SEGDES MPSURF
  386. SEGDES MELEFL
  387. SEGDES KRFACE
  388. SEGDES KRCENT
  389. SEGDES NOMINC
  390. IF (LCLIMY) THEN
  391. SEGDES KRYIMP
  392. ENDIF
  393. IF (LCLIMR) THEN
  394. SEGDES KRRIMP
  395. SEGDES MPRIMP
  396. ENDIF
  397. ENDDO
  398. SEGDES PROPH2
  399. SEGDES PROPHY
  400. *
  401. * Normal termination
  402. *
  403. IRET=0
  404. RETURN
  405. *
  406. * Format handling
  407. *
  408. *
  409. * Error handling
  410. *
  411. 9999 CONTINUE
  412. IRET=1
  413. WRITE(IOIMP,*) 'An error was detected in subroutine zlap1b'
  414. RETURN
  415. *
  416. * End of subroutine ZLAP1B
  417. *
  418. END
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  

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