Télécharger zlap2b.eso

Retour à la liste

Numérotation des lignes :

zlap2b
  1. C ZLAP2B SOURCE CB215821 20/11/25 13:45:09 10792
  2. SUBROUTINE ZLAP2B(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 : ZLAP2B
  12. C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien
  13. C VF 3D (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 : ZLAP2A : Calcul de la matrice jacobienne du
  31. C résidu du laplacien VF 3D.
  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 3D.
  55. C SORTIES : -
  56. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  57. C***********************************************************************
  58. C VERSION : v1, 08/03/2002, version initiale
  59. C HISTORIQUE : v1, 08/03/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,KDYKDZ.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,BETAZ,CNX,CNY,CNZ
  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,ZF,XG,YG,ZG,XFMXG,YFMYG,ZFMZG,DRG
  149. & ,XD,YD,ZD,XFMXD,YFMYD,ZFMZD,DRD,ALPHA,UMALPH
  150. C
  151. *
  152. * Executable statements
  153. *
  154. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans zlap2b.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. KDYKDZ=JCOGRY.IELVAL(3)
  190. SEGDES JCOGRY
  191. SEGACT KDYKDX
  192. SEGACT KDYKDY
  193. SEGACT KDYKDZ
  194. SEGACT MCOGRY
  195. NELEM=MCOGRY.NUM(/2)
  196. NPTEL=MCOGRY.NUM(/1)
  197. NPP1=NPTEL-1
  198. NPP2=NPTEL-1
  199. NEL1=NELEM
  200. NEL2=NELEM
  201. IEL1=1
  202. IEL2=1
  203. SEGINI RYKRHO
  204. SEGINI RYKRYK
  205. SEGINI CTGRY
  206. RYKRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  207. RYKRHO.NOMPRI(5:8)=' '
  208. RYKRHO.NOMDUA(1:4)=NOMINC.MOTS(IDIM+2+IESP)
  209. RYKRHO.NOMDUA(5:8)=' '
  210. RYKRYK.NOMPRI(1:4)=NOMINC.MOTS(IDIM+2+IESP)
  211. RYKRYK.NOMPRI(5:8)=' '
  212. RYKRYK.NOMDUA(1:4)=NOMINC.MOTS(IDIM+2+IESP)
  213. RYKRYK.NOMDUA(5:8)=' '
  214. DO 12 IELEM=1,NELEM
  215. * Le premier point du support de ICOGRY est un point FACE
  216. NGFACE=MCOGRY.NUM(1,IELEM)
  217. NLFACE=KRFACE.LECT(NGFACE)
  218. IF (NLFACE.EQ.0) THEN
  219. WRITE(IOIMP,*) 'Erreur de programmation n°1'
  220. GOTO 9999
  221. ENDIF
  222. * On calcule la contribution à la matrice jacobienne IJACO de la face
  223. * NGFAC (points duaux : centres à gauche et à droite de la face)
  224. * (points primaux : une partie (bicoz conditions aux limites)
  225. * de ceux du stencil pour le calcul du gradient
  226. * à la face, ils doivent être des points centres)
  227. * Si le flux de chaleur sur la face est imposé par les conditions
  228. * aux limites, la contribution de la face à IJACO est nulle.
  229. NGCGAU=MELEFL.NUM(1,NLFACE)
  230. NGCDRO=MELEFL.NUM(3,NLFACE)
  231. NLCGAU=KRCENT.LECT(NGCGAU)
  232. NLCDRO=KRCENT.LECT(NGCDRO)
  233. LMUR=(NGCGAU.EQ.NGCDRO)
  234. * On distingue le cas où la face est un bord du maillage (mur)
  235. * du cas où la face est interne au maillage
  236. IF (.NOT.LMUR) THEN
  237. NPD=2
  238. ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
  239. XF = MCOORD.XCOOR(ICOORX)
  240. YF = MCOORD.XCOOR(ICOORX+1)
  241. ZF = MCOORD.XCOOR(ICOORX+2)
  242. ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
  243. XG = MCOORD.XCOOR(ICOORX)
  244. YG = MCOORD.XCOOR(ICOORX+1)
  245. ZG = MCOORD.XCOOR(ICOORX+2)
  246. XFMXG = XF - XG
  247. YFMYG = YF - YG
  248. ZFMZG = ZF - ZG
  249. DRG=SQRT((XFMXG*XFMXG)+(YFMYG*YFMYG)+(ZFMZG*ZFMZG))
  250. ICOORX = ((IDIM + 1) * (NGCDRO - 1))+1
  251. XD = MCOORD.XCOOR(ICOORX)
  252. YD = MCOORD.XCOOR(ICOORX+1)
  253. ZD = MCOORD.XCOOR(ICOORX+2)
  254. XFMXD = XF - XD
  255. YFMYD = YF - YD
  256. ZFMZD = ZF - ZD
  257. DRD=SQRT((XFMXD*XFMXD)+(YFMYD*YFMYD)+(ZFMZD*ZFMZD))
  258. ALPHA=DRG/(DRG+DRD)
  259. UMALPH= 1.0D0 - ALPHA
  260. ELSE
  261. NPD=1
  262. ALPHA=0.0D0
  263. UMALPH=1.0D0
  264. ENDIF
  265. IF (LCLIMR) THEN
  266. NLFRI=KRRIMP.LECT(NGFACE)
  267. ELSE
  268. NLFRI=0
  269. ENDIF
  270. IF (NLFRI.GT.0) THEN
  271. RHOF=MPRIMP.VPOCHA(NLFRI,1)
  272. ELSE
  273. RHOG = MPROC.VPOCHA(NLCGAU,1)
  274. RHOD = MPROC.VPOCHA(NLCDRO,1)
  275. RHOF = UMALPH * RHOG + ALPHA * RHOD
  276. ENDIF
  277. DKG = MPDKC.VPOCHA(NLCGAU,1)
  278. DKD = MPDKC.VPOCHA(NLCDRO,1)
  279. DKF = UMALPH * DKG + ALPHA * DKD
  280. NPP=NPTEL-1
  281. * IPD=1 : point à gauche du point NGFACE
  282. * IPD=2 : point à droite du point NGFACE
  283. DO 122 IPD=1,NPD
  284. NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE)
  285. IF (.NOT.LMUR) THEN
  286. CTGRY.POIDU2(IPD,IEL2)=NPDUAL
  287. ELSE
  288. CTGRY.POIDU1(IPD,IEL1)=NPDUAL
  289. ENDIF
  290. NLCEND=KRCENT.LECT(NPDUAL)
  291. IF (NLCEND.EQ.0) THEN
  292. WRITE(IOIMP,*) 'Erreur grave n°1'
  293. GOTO 9999
  294. ENDIF
  295. DO 124 IPP=1,NPP
  296. NPPRIM=MCOGRY.NUM(IPP+1,IELEM)
  297. LCTRB2=.TRUE.
  298. IF (LCLIMY) THEN
  299. NLCLY=KRYIMP.LECT(NPPRIM)
  300. IF (NLCLY.NE.0) THEN
  301. LCTRB2=.FALSE.
  302. ENDIF
  303. ENDIF
  304. IF (.NOT.LCTRB2) THEN
  305. * Lorsque une contribution est nulle, on fixe artificiellement le
  306. * point primal égal au point dual.
  307. IF (.NOT.LMUR) THEN
  308. CTGRY.POIPR2(IPP,IEL2)=NPDUAL
  309. RYKRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  310. RYKRYK.VALMA2(IPD,IPP,IEL2)=0.D0
  311. ELSE
  312. CTGRY.POIPR1(IPP,IEL1)=NPDUAL
  313. RYKRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  314. RYKRYK.VALMA1(IPD,IPP,IEL1)=0.D0
  315. ENDIF
  316. ELSE
  317. * Les contributions valent :
  318. * (d Res_{\rho Yk})_d / (d var)_p =
  319. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \rho_f * Dk_f
  320. * * [ ((n_x * \beta_x) +(n_y * \beta_y) +(n_z * \beta_z)) *
  321. * ((dYk)_p / (d var)_p)]
  322. * avec :
  323. * (dYk)_p / (d \rho)_p = - Yk_p / \rho_p
  324. * (dYk)_p / (d \rho Yk)_p = 1 / \rho_p
  325. * \beta_x : coefficients pour le calcul de dYk/dx
  326. * \beta_y : coefficients pour le calcul de dYk/dy
  327. * \beta_z : coefficients pour le calcul de dYk/dz
  328. *
  329. NLCENP=KRCENT.LECT(NPPRIM)
  330. IF (NLCENP.EQ.0) THEN
  331. WRITE(IOIMP,*) 'Erreur grave n°2'
  332. GOTO 9999
  333. ENDIF
  334. * normale sortante pour IPD=1, rentrante pour IPD=2
  335. SIGNOR=(-1.D0)**(IPD+1)
  336. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  337. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  338. CNX =MPNORM.VPOCHA(NLFACE,1)
  339. CNY =MPNORM.VPOCHA(NLFACE,2)
  340. CNZ =MPNORM.VPOCHA(NLFACE,3)
  341. BETAX =KDYKDX.VELCHE(IPP+1,IELEM)
  342. BETAY =KDYKDY.VELCHE(IPP+1,IELEM)
  343. BETAZ =KDYKDZ.VELCHE(IPP+1,IELEM)
  344. RHOP =MPROC.VPOCHA(NLCENP,1)
  345. YKP =MPYKC.VPOCHA(NLCENP,1)
  346. * YKP =MPYKC.VPOCHA(NLCEND,1)
  347. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*RHOF*DKF
  348. $ *((CNX*BETAX)+(CNY*BETAY)+(CNZ*BETAZ))
  349. DYKDRO=-YKP/RHOP
  350. DYKDRY=1.D0/RHOP
  351. IF (.NOT.LMUR) THEN
  352. CTGRY.POIPR2(IPP,IEL2)=NPPRIM
  353. RYKRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DYKDRO
  354. RYKRYK.VALMA2(IPD,IPP,IEL2)=FACTOR*DYKDRY
  355. ELSE
  356. CTGRY.POIPR1(IPP,IEL1)=NPPRIM
  357. RYKRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DYKDRO
  358. RYKRYK.VALMA1(IPD,IPP,IEL1)=FACTOR*DYKDRY
  359. ENDIF
  360. ENDIF
  361. 124 CONTINUE
  362. 122 CONTINUE
  363. IF (.NOT.LMUR) THEN
  364. IEL2=IEL2+1
  365. ELSE
  366. IEL1=IEL1+1
  367. ENDIF
  368. 12 CONTINUE
  369. NPP1=NPTEL-1
  370. NPP2=NPTEL-1
  371. NEL1=IEL1-1
  372. NEL2=IEL2-1
  373. SEGADJ RYKRHO
  374. SEGADJ RYKRYK
  375. SEGADJ CTGRY
  376. CTGRY.LMATSI(**)=RYKRHO
  377. CTGRY.LMATSI(**)=RYKRYK
  378. * On accumule les matrices résultantes dans IJACO
  379. CALL AJMTK(CTGRY,IJACO,IMPR,IRET)
  380. IF (IRET.NE.0) GOTO 9999
  381. SEGSUP RYKRHO
  382. SEGSUP RYKRYK
  383. SEGSUP CTGRY
  384. *
  385. SEGDES MCOGRY
  386. SEGDES KDYKDZ
  387. SEGDES KDYKDY
  388. SEGDES KDYKDX
  389. 1 CONTINUE
  390. SEGDES ICOGRY
  391. SEGDES MPYKC
  392. SEGDES MPROC
  393. SEGDES MPDKC
  394. SEGDES MPVOLU
  395. SEGDES MPNORM
  396. SEGDES MPSURF
  397. SEGDES MELEFL
  398. SEGDES KRFACE
  399. SEGDES KRCENT
  400. SEGDES NOMINC
  401. IF (LCLIMY) THEN
  402. SEGDES KRYIMP
  403. ENDIF
  404. IF (LCLIMR) THEN
  405. SEGDES KRRIMP
  406. SEGDES MPRIMP
  407. ENDIF
  408. ENDDO
  409. SEGDES PROPH2
  410. SEGDES PROPHY
  411. *
  412. * Normal termination
  413. *
  414. IRET=0
  415. RETURN
  416. *
  417. * Format handling
  418. *
  419. *
  420. * Error handling
  421. *
  422. 9999 CONTINUE
  423. IRET=1
  424. WRITE(IOIMP,*) 'An error was detected in subroutine zlap2b'
  425. RETURN
  426. *
  427. * End of subroutine ZLAP2B
  428. *
  429. END
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  

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