Télécharger ylap1c.eso

Retour à la liste

Numérotation des lignes :

ylap1c
  1. C YLAP1C SOURCE CB215821 20/11/25 13:44:06 10792
  2. SUBROUTINE YLAP1C(ICOGRV,MPROC,MPVITC,
  3. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  4. $ KRFACE,KRCENT,LCLIMV,KRVIMP,LCLITO,KRTOIM,
  5. $ NOMINC,
  6. $ MU,
  7. $ IJACO,
  8. $ IMPR,IRET)
  9. IMPLICIT INTEGER(I-N)
  10. IMPLICIT REAL*8 (A-H,O-Z)
  11. C***********************************************************************
  12. C NOM : YLAP1C
  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 'simples'
  16. C à la matrice jacobienne faisant intervenir les
  17. C coefficients pour le calcul des gradients de vitesse
  18. C (ICOGRV).
  19. C (contributions à (d Res_{\rho u} / d var) et (d
  20. C Res_{\rho v} / d var)
  21. C var prenant successivement les valeurs :
  22. C \rho, \rho u, \rho v, \rho e_t )
  23. C
  24. C
  25. C NOTE PERSO : On pourrait programmer ça plus lisiblement en stockant
  26. C les contributions dans un tableau de pointeurs (2
  27. C indices, c'est possible ?) et en effectuant des produits
  28. C matriciels (coeff. x matrices de dérivées).
  29. C On n'y coupera pas si on veut regrouper 2D et 3D...
  30. C On ne va pas le faire.
  31. C
  32. C
  33. C LANGAGE : ESOPE
  34. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
  35. C mél : gounand@semt2.smts.cea.fr
  36. C***********************************************************************
  37. C APPELES (UTIL) : AJMTK : ajoute un objet de type MATSIM (non
  38. C standard) à un objet de type MATRIK.
  39. C APPELE PAR : YLAP1A : Calcul de la matrice jacobienne du
  40. C résidu du laplacien VF 2D.
  41. C***********************************************************************
  42. C ENTREES : ICOGRV (type MCHELM) : coefficients pour le
  43. C calcul du gradient de la vitesse aux
  44. C interfaces.
  45. C MPROC (type MPOVAL) : masse volumique par
  46. C élément.
  47. C MPVITC (type MPOVAL) : vitesse par élément.
  48. C MPVOLU (type MPOVAL) : volume des éléments.
  49. C MPNORM (type MPOVAL) : normale aux faces.
  50. C MPSURF (type MPOVAL) : surface des faces.
  51. C MELEFL (type MELEME) : connectivités face-(centre
  52. C gauche, centre droit).
  53. C KRFACE (type MLENTI) : tableau de repérage dans
  54. C le maillage des faces des éléments.
  55. C KRCENT (type MLENTI) : tableau de repérage dans
  56. C le maillage des centres des éléments.
  57. C LCLIMV (type logique) : .TRUE. => CL de Dirichlet
  58. C sur la vitesse.
  59. C KRVIMP (type MLENTI) : tableau de repérage dans
  60. C maillage des CL de Dirichlet sur la
  61. C vitesse.
  62. C LCLITO (type logique) : .TRUE. => CL de Dirichlet
  63. C sur le tenseur des contraintes.
  64. C KRTOIM (type MLENTI) : tableau de repérage dans
  65. C maillage des CL de Dirichlet sur le tenseur des
  66. C contraintes
  67. C NOMINC (type MLMOTS) : noms des inconnues.
  68. C MU (type réel) : viscosité dynamique (SI).
  69. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  70. C résidu du laplacien VF 2D.
  71. C SORTIES : -
  72. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  73. C***********************************************************************
  74. C VERSION : v1, 08/08/2001, version initiale
  75. C HISTORIQUE : v1, 08/08/2001, création
  76. C HISTORIQUE :
  77. C HISTORIQUE :
  78. C***********************************************************************
  79. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  80. C en cas de modification de ce sous-programme afin de faciliter
  81. C la maintenance !
  82. C***********************************************************************
  83.  
  84. -INC PPARAM
  85. -INC CCOPTIO
  86. -INC SMCHPOI
  87. POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL
  88. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  89. -INC SMCHAML
  90. POINTEUR ICOGRV.MCHELM,JCOGRV.MCHAML
  91. POINTEUR KDUNDX.MELVAL,KDUNDY.MELVAL
  92. -INC SMELEME
  93. POINTEUR MELEFL.MELEME
  94. POINTEUR MCOGRV.MELEME
  95. -INC SMLENTI
  96. POINTEUR KRVIMP.MLENTI,KRTOIM.MLENTI
  97. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  98. -INC SMLMOTS
  99. POINTEUR NOMINC.MLMOTS
  100. POINTEUR IJACO.MATRIK
  101. *
  102. * Objet matrice élémentaire simplifié
  103. *
  104. SEGMENT GMATSI
  105. INTEGER POIPR1(NPP1,NEL1)
  106. INTEGER POIDU1(1,NEL1)
  107. INTEGER POIPR2(NPP2,NEL2)
  108. INTEGER POIDU2(2,NEL2)
  109. POINTEUR LMATSI(0).MATSIM
  110. ENDSEGMENT
  111. * Contributions simples de la part du gradient de
  112. * vitesse (CTSGRV)
  113. POINTEUR CTSGRV.GMATSI
  114. SEGMENT MATSIM
  115. CHARACTER*8 NOMPRI,NOMDUA
  116. REAL*8 VALMA1(1,NPP1,NEL1)
  117. REAL*8 VALMA2(2,NPP2,NEL2)
  118. ENDSEGMENT
  119. POINTEUR ROURHO.MATSIM
  120. POINTEUR ROVRHO.MATSIM
  121. POINTEUR ROUROU.MATSIM
  122. POINTEUR ROUROV.MATSIM
  123. POINTEUR ROVROU.MATSIM
  124. POINTEUR ROVROV.MATSIM
  125. *
  126. REAL*8 MU
  127. *
  128. INTEGER IMPR,IRET
  129. *
  130. LOGICAL LCLIMV,LCLITO
  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,NLCLTO,NLCLV
  138. INTEGER NPTEL
  139. *
  140. REAL*8 ALPHAX,ALPHAY,CNX,CNY
  141. REAL*8 SIGNOR,SURFFA,VOLUEL
  142. REAL*8 RHOP,UP,VP
  143. REAL*8 FACTOR
  144. REAL*8 DUDRHO,DUDROU,DVDRHO,DVDROV
  145. REAL*8 BROUDU,BROUDV,BROVDU,BROVDV
  146. C
  147. *
  148. * Executable statements
  149. *
  150. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans ylap1c.eso'
  151. * On calcule les contributions à (d Res_{\rho u} / d var) et (d
  152. * Res_{\rho v} / d var) ; var prenant successivement les valeurs :
  153. * \rho, \rho u, \rho v, \rho e_t
  154. * Note :
  155. * - (d Res_{\rho u} / d \rho e_t) = 0
  156. * - (d Res_{\rho v} / d \rho e_t) = 0
  157. * On dérive les termes : \tens{\tau} \prod \vect{n}
  158. * Les noms de matrices élémentaires (type MATSIM) associées sont :
  159. * ROURHO, ROUROU, ROUROV, ROVRHO, ROVROU, ROVROV
  160. IF (LCLIMV) THEN
  161. SEGACT KRVIMP
  162. ENDIF
  163. IF (LCLITO) THEN
  164. SEGACT KRTOIM
  165. ENDIF
  166. SEGACT NOMINC
  167. SEGACT KRCENT
  168. SEGACT KRFACE
  169. SEGACT MELEFL
  170. SEGACT MPSURF
  171. SEGACT MPNORM
  172. SEGACT MPVOLU
  173. SEGACT MPROC
  174. SEGACT MPVITC
  175. SEGACT ICOGRV
  176. NSOUCH=ICOGRV.IMACHE(/1)
  177. DO 1 ISOUCH=1,NSOUCH
  178. MCOGRV=ICOGRV.IMACHE(ISOUCH)
  179. JCOGRV=ICOGRV.ICHAML(ISOUCH)
  180. SEGACT JCOGRV
  181. KDUNDX=JCOGRV.IELVAL(1)
  182. KDUNDY=JCOGRV.IELVAL(2)
  183. SEGDES JCOGRV
  184. SEGACT KDUNDX
  185. SEGACT KDUNDY
  186. SEGACT MCOGRV
  187. NELEM=MCOGRV.NUM(/2)
  188. NPTEL=MCOGRV.NUM(/1)
  189. NPP1=NPTEL-1
  190. NPP2=NPTEL-1
  191. NEL1=NELEM
  192. NEL2=NELEM
  193. IEL1=1
  194. IEL2=1
  195. SEGINI ROURHO
  196. SEGINI ROVRHO
  197. SEGINI ROUROU
  198. SEGINI ROVROU
  199. SEGINI ROUROV
  200. SEGINI ROVROV
  201. SEGINI CTSGRV
  202. ROURHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  203. ROURHO.NOMPRI(5:8)=' '
  204. ROURHO.NOMDUA(1:4)=NOMINC.MOTS(2)
  205. ROURHO.NOMDUA(5:8)=' '
  206. ROVRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  207. ROVRHO.NOMPRI(5:8)=' '
  208. ROVRHO.NOMDUA(1:4)=NOMINC.MOTS(3)
  209. ROVRHO.NOMDUA(5:8)=' '
  210. ROUROU.NOMPRI(1:4)=NOMINC.MOTS(2)
  211. ROUROU.NOMPRI(5:8)=' '
  212. ROUROU.NOMDUA(1:4)=NOMINC.MOTS(2)
  213. ROUROU.NOMDUA(5:8)=' '
  214. ROVROU.NOMPRI(1:4)=NOMINC.MOTS(2)
  215. ROVROU.NOMPRI(5:8)=' '
  216. ROVROU.NOMDUA(1:4)=NOMINC.MOTS(3)
  217. ROVROU.NOMDUA(5:8)=' '
  218. ROUROV.NOMPRI(1:4)=NOMINC.MOTS(3)
  219. ROUROV.NOMPRI(5:8)=' '
  220. ROUROV.NOMDUA(1:4)=NOMINC.MOTS(2)
  221. ROUROV.NOMDUA(5:8)=' '
  222. ROVROV.NOMPRI(1:4)=NOMINC.MOTS(3)
  223. ROVROV.NOMPRI(5:8)=' '
  224. ROVROV.NOMDUA(1:4)=NOMINC.MOTS(3)
  225. ROVROV.NOMDUA(5:8)=' '
  226. DO 12 IELEM=1,NELEM
  227. * Le premier point du support de ICOGRV est un point FACE
  228. NGFACE=MCOGRV.NUM(1,IELEM)
  229. NLFACE=KRFACE.LECT(NGFACE)
  230. IF (NLFACE.EQ.0) THEN
  231. WRITE(IOIMP,*) 'Erreur de programmation n°1'
  232. GOTO 9999
  233. ENDIF
  234. * On calcule la contribution à la matrice jacobienne IJACO de la face
  235. * NGFAC (points duaux : centres à gauche et à droite de la face)
  236. * (points primaux : une partie (bicoz conditions aux limites)
  237. * de ceux du stencil pour le calcul du gradient
  238. * à la face, ils doivent être des points centres)
  239. * Si le tenseur des contraintes sur la face est imposé par les
  240. * conditions aux limites, la contribution de la face à IJACO est
  241. * nulle.
  242. LCTRB1=.TRUE.
  243. IF (LCLITO) THEN
  244. NLCLTO=KRTOIM.LECT(NGFACE)
  245. IF (NLCLTO.NE.0) THEN
  246. LCTRB1=.FALSE.
  247. ENDIF
  248. ENDIF
  249. IF (LCTRB1) THEN
  250. NGCGAU=MELEFL.NUM(1,NLFACE)
  251. NGCDRO=MELEFL.NUM(3,NLFACE)
  252. LMUR=(NGCGAU.EQ.NGCDRO)
  253. * On distingue le cas où la face est un bord du maillage (mur)
  254. * du cas où la face est interne au maillage
  255. IF (.NOT.LMUR) THEN
  256. NPD=2
  257. ELSE
  258. NPD=1
  259. ENDIF
  260. NPP=NPTEL-1
  261. * IPD=1 : point à gauche du point NGFACE
  262. * IPD=2 : point à droite du point NGFACE
  263. DO 122 IPD=1,NPD
  264. NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE)
  265. IF (.NOT.LMUR) THEN
  266. CTSGRV.POIDU2(IPD,IEL2)=NPDUAL
  267. ELSE
  268. CTSGRV.POIDU1(IPD,IEL1)=NPDUAL
  269. ENDIF
  270. NLCEND=KRCENT.LECT(NPDUAL)
  271. IF (NLCEND.EQ.0) THEN
  272. WRITE(IOIMP,*) 'Erreur grave n°1'
  273. GOTO 9999
  274. ENDIF
  275. DO 124 IPP=1,NPP
  276. NPPRIM=MCOGRV.NUM(IPP+1,IELEM)
  277. C
  278. C* Modif AB: elimination du test condition limite
  279. C
  280. NLCENP=KRCENT.LECT(NPPRIM)
  281. IF(NLCENP .EQ. 0) THEN
  282. * Lorsque une contribution est nulle, on fixe artificiellement le
  283. * point primal égal au point dual.
  284. IF (.NOT.LMUR) THEN
  285. CTSGRV.POIPR2(IPP,IEL2)=NPDUAL
  286. ROURHO.VALMA2(IPD,IPP,IEL2)=0.D0
  287. ROVRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  288. ROUROU.VALMA2(IPD,IPP,IEL2)=0.D0
  289. ROVROU.VALMA2(IPD,IPP,IEL2)=0.D0
  290. ROUROV.VALMA2(IPD,IPP,IEL2)=0.D0
  291. ROVROV.VALMA2(IPD,IPP,IEL2)=0.D0
  292. ELSE
  293. CTSGRV.POIPR1(IPP,IEL1)=NPDUAL
  294. ROURHO.VALMA1(IPD,IPP,IEL1)=0.D0
  295. ROVRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  296. ROUROU.VALMA1(IPD,IPP,IEL1)=0.D0
  297. ROVROU.VALMA1(IPD,IPP,IEL1)=0.D0
  298. ROUROV.VALMA1(IPD,IPP,IEL1)=0.D0
  299. ROVROV.VALMA1(IPD,IPP,IEL1)=0.D0
  300. ENDIF
  301. ELSE
  302. * Les contributions valent :
  303. * 1. (d Res_{\rho u})_d / (d var)_p =
  304. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \mu
  305. * * [ [ ( 4/3 (n_x * \alpha_x) + (n_y * \alpha_y)) *
  306. * ((du)_p / (d var)_p)]
  307. * + [ (-2/3 (n_x * \alpha_y) + (n_y * \alpha_x)) *
  308. * ((dv)_p / (d var)_p)]
  309. * ]
  310. * 2. (d Res_{\rho v})_d / (d var)_p =
  311. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \mu
  312. * * [ [ (-2/3 (n_y * \alpha_x) + (n_x * \alpha_y)) *
  313. * ((du)_p / (d var)_p)]
  314. * + [ ( 4/3 (n_y * \alpha_y) + (n_x * \alpha_x)) *
  315. * ((dv)_p / (d var)_p)]
  316. * ]
  317. *
  318. * avec :
  319. * (du)_p / (d \rho)_p = - u / \rho_p
  320. * (du)_p / (d \rho u)_p = 1 / \rho_p
  321. * (du)_p / (d \rho v)_p = 0
  322. * (dv)_p / (d \rho)_p = - v / \rho_p
  323. * (dv)_p / (d \rho u)_p = 0
  324. * (dv)_p / (d \rho v)_p = 1 / \rho_p
  325. *
  326. IF (NLCENP.EQ.0) THEN
  327. WRITE(IOIMP,*) 'Erreur grave n°2'
  328. GOTO 9999
  329. ENDIF
  330. * normale sortante pour IPD=1, rentrante pour IPD=2
  331. SIGNOR=(-1.D0)**(IPD+1)
  332. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  333. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  334. CNX =MPNORM.VPOCHA(NLFACE,1)
  335. CNY =MPNORM.VPOCHA(NLFACE,2)
  336. ALPHAX=KDUNDX.VELCHE(IPP+1,IELEM)
  337. ALPHAY=KDUNDY.VELCHE(IPP+1,IELEM)
  338. RHOP =MPROC.VPOCHA(NLCENP,1)
  339. UP =MPVITC.VPOCHA(NLCENP,1)
  340. VP =MPVITC.VPOCHA(NLCENP,2)
  341. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*MU
  342. BROUDU=(( 4.D0/3.D0)*(CNX*ALPHAX))
  343. $ + (CNY*ALPHAY)
  344. BROUDV=((-2.D0/3.D0)*(CNX*ALPHAY))
  345. $ + (CNY*ALPHAX)
  346. BROVDU=((-2.D0/3.D0)*(CNY*ALPHAX))
  347. $ + (CNX*ALPHAY)
  348. BROVDV=(( 4.D0/3.D0)*(CNY*ALPHAY))
  349. $ + (CNX*ALPHAX)
  350. DUDRHO=-UP /RHOP
  351. DUDROU=1.D0/RHOP
  352. DVDRHO=-VP /RHOP
  353. DVDROV=1.D0/RHOP
  354. IF (.NOT.LMUR) THEN
  355. CTSGRV.POIPR2(IPP,IEL2)=NPPRIM
  356. ROURHO.VALMA2(IPD,IPP,IEL2)=
  357. $ FACTOR*((BROUDU*DUDRHO)+(BROUDV*DVDRHO))
  358. ROVRHO.VALMA2(IPD,IPP,IEL2)=
  359. $ FACTOR*((BROVDU*DUDRHO)+(BROVDV*DVDRHO))
  360. ROUROU.VALMA2(IPD,IPP,IEL2)=
  361. $ FACTOR* (BROUDU*DUDROU)
  362. ROVROU.VALMA2(IPD,IPP,IEL2)=
  363. $ FACTOR* (BROVDU*DUDROU)
  364. ROUROV.VALMA2(IPD,IPP,IEL2)=
  365. $ FACTOR* (BROUDV*DVDROV)
  366. ROVROV.VALMA2(IPD,IPP,IEL2)=
  367. $ FACTOR* (BROVDV*DVDROV)
  368. ELSE
  369. CTSGRV.POIPR1(IPP,IEL1)=NPPRIM
  370. ROURHO.VALMA1(IPD,IPP,IEL1)=
  371. $ FACTOR*((BROUDU*DUDRHO)+(BROUDV*DVDRHO))
  372. ROVRHO.VALMA1(IPD,IPP,IEL1)=
  373. $ FACTOR*((BROVDU*DUDRHO)+(BROVDV*DVDRHO))
  374. ROUROU.VALMA1(IPD,IPP,IEL1)=
  375. $ FACTOR* (BROUDU*DUDROU)
  376. ROVROU.VALMA1(IPD,IPP,IEL1)=
  377. $ FACTOR* (BROVDU*DUDROU)
  378. ROUROV.VALMA1(IPD,IPP,IEL1)=
  379. $ FACTOR* (BROUDV*DVDROV)
  380. ROVROV.VALMA1(IPD,IPP,IEL1)=
  381. $ FACTOR* (BROVDV*DVDROV)
  382. ENDIF
  383. ENDIF
  384. 124 CONTINUE
  385. 122 CONTINUE
  386. IF (.NOT.LMUR) THEN
  387. IEL2=IEL2+1
  388. ELSE
  389. IEL1=IEL1+1
  390. ENDIF
  391. ENDIF
  392. 12 CONTINUE
  393. NPP1=NPTEL-1
  394. NPP2=NPTEL-1
  395. NEL1=IEL1-1
  396. NEL2=IEL2-1
  397. SEGADJ ROURHO
  398. SEGADJ ROVRHO
  399. SEGADJ ROUROU
  400. SEGADJ ROVROU
  401. SEGADJ ROUROV
  402. SEGADJ ROVROV
  403. SEGADJ CTSGRV
  404. CTSGRV.LMATSI(**)=ROURHO
  405. CTSGRV.LMATSI(**)=ROVRHO
  406. CTSGRV.LMATSI(**)=ROUROU
  407. CTSGRV.LMATSI(**)=ROVROU
  408. CTSGRV.LMATSI(**)=ROUROV
  409. CTSGRV.LMATSI(**)=ROVROV
  410. * On accumule les matrices résultantes dans IJACO
  411. CALL AJMTK(CTSGRV,IJACO,IMPR,IRET)
  412. IF (IRET.NE.0) GOTO 9999
  413. SEGSUP ROURHO
  414. SEGSUP ROVRHO
  415. SEGSUP ROUROU
  416. SEGSUP ROVROU
  417. SEGSUP ROUROV
  418. SEGSUP ROVROV
  419. SEGSUP CTSGRV
  420. *
  421. SEGDES MCOGRV
  422. SEGDES KDUNDY
  423. SEGDES KDUNDX
  424. 1 CONTINUE
  425. SEGDES ICOGRV
  426. SEGDES MPVITC
  427. SEGDES MPROC
  428. SEGDES MPVOLU
  429. SEGDES MPNORM
  430. SEGDES MPSURF
  431. SEGDES MELEFL
  432. SEGDES KRFACE
  433. SEGDES KRCENT
  434. SEGDES NOMINC
  435. IF (LCLITO) THEN
  436. SEGDES KRTOIM
  437. ENDIF
  438. IF (LCLIMV) THEN
  439. SEGDES KRVIMP
  440. ENDIF
  441. *
  442. * Normal termination
  443. *
  444. IRET=0
  445. RETURN
  446. *
  447. * Format handling
  448. *
  449. *
  450. * Error handling
  451. *
  452. 9999 CONTINUE
  453. IRET=1
  454. WRITE(IOIMP,*) 'An error was detected in subroutine ylap1c'
  455. RETURN
  456. *
  457. * End of subroutine YLAP1C
  458. *
  459. END
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  

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