Télécharger xlap2e.eso

Retour à la liste

Numérotation des lignes :

xlap2e
  1. C XLAP2E SOURCE CB215821 20/11/25 13:43:24 10792
  2. SUBROUTINE XLAP2E(ICOGRV,MPGRVF,MPROC,MPVITC,
  3. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  4. $ KRFACE,KRCENT,
  5. $ LCLIMV,KRVIMP,MPVIMP,
  6. $ LCLITO,KRTOIM,
  7. $ NOMINC,
  8. $ MPMUC,
  9. $ IJACO,
  10. $ IMPR,IRET)
  11. IMPLICIT INTEGER(I-N)
  12. IMPLICIT REAL*8 (A-H,O-Z)
  13. C***********************************************************************
  14. C NOM : XLAP2E
  15. C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien
  16. C VF 3D.
  17. C Ici, on ne calcule que des contributions 'compliquées' à
  18. C la matrice jacobienne faisant intervenir les
  19. C coefficients pour le calcul des gradients de vitesse
  20. C (ICOGRV)
  21. C (contributions à (d Res_{\rho e_t} / d var)
  22. C var prenant successivement les valeurs :
  23. C \rho, \rho u, \rho v, \rho w, \rho e_t )
  24. C Les contributions sont plus "compliquées" à calculer que
  25. C les simples (cf. xlap2c) car on a à dériver des produits
  26. C de fonctions de la vitesse.
  27. C xlap2d calcule aussi une partie des contributions
  28. C 'compliquées'.
  29. C
  30. C NOTE PERSO : On pourrait programmer ça plus lisiblement en stockant
  31. C les contributions dans un tableau de pointeurs (2
  32. C indices, c'est possible ?) et en effectuant des produits
  33. C matriciels (coeff. x matrices de dérivées).
  34. C On n'y coupera pas si on veut regrouper 2D et 3D...
  35. C On ne va pas le faire.
  36. C
  37. C LANGAGE : ESOPE
  38. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
  39. C mél : gounand@semt2.smts.cea.fr
  40. C***********************************************************************
  41. C APPELES (UTIL) : AJMTK : ajoute un objet de type MATSIM (non
  42. C standard) à un objet de type MATRIK.
  43. C APPELE PAR : XLAP2A : Calcul de la matrice jacobienne du
  44. C résidu du laplacien VF 3D.
  45. C***********************************************************************
  46. C ENTREES : ICOGRV (type MCHELM) : coefficients pour le
  47. C calcul du gradient de la vitesse aux
  48. C interfaces.
  49. C MPGRVF (type MPOVAL) : gradient de la vitesse
  50. C aux interfaces.
  51. C MPROC (type MPOVAL) : masse volumique par
  52. C élément.
  53. C MPVITC (type MPOVAL) : vitesse par élément.
  54. C MPVOLU (type MPOVAL) : volume des éléments.
  55. C MPNORM (type MPOVAL) : normale aux faces.
  56. C MPSURF (type MPOVAL) : surface des faces.
  57. C MELEFL (type MELEME) : connectivités face-(centre
  58. C gauche, centre droit).
  59. C KRFACE (type MLENTI) : tableau de repérage dans
  60. C le maillage des faces des éléments.
  61. C KRCENT (type MLENTI) : tableau de repérage dans
  62. C le maillage des centres des éléments.
  63. C LCLIMV (type logique) : .TRUE. => CL de Dirichlet
  64. C sur la vitesse.
  65. C KRVIMP (type MLENTI) : tableau de repérage dans
  66. C maillage des CL de Dirichlet sur la
  67. C vitesse.
  68. C MPVIMP (type MPOVAL) : valeurs des CL de
  69. C Dirichlet sur la vitesse.
  70. C LCLITO (type logique) : .TRUE. => CL de Dirichlet
  71. C sur le tenseur des contraintes.
  72. C KRTOIM (type MLENTI) : tableau de repérage dans
  73. C maillage des CL de Dirichlet sur le tenseur des
  74. C contraintes
  75. C NOMINC (type MLMOTS) : noms des inconnues.
  76. C MPMUC (type MPOVAL) : viscosité dynamique (SI).
  77. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  78. C résidu du laplacien VF 3D.
  79. C SORTIES : -
  80. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  81. C***********************************************************************
  82. C VERSION : v1, 08/03/2002, version initiale
  83. C HISTORIQUE : v1, 08/03/2002, création
  84. C HISTORIQUE :
  85. C HISTORIQUE :
  86. C***********************************************************************
  87. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  88. C en cas de modification de ce sous-programme afin de faciliter
  89. C la maintenance !
  90. C***********************************************************************
  91.  
  92. -INC PPARAM
  93. -INC CCOPTIO
  94. -INC SMCOORD
  95. -INC SMCHPOI
  96. POINTEUR MPGRVF.MPOVAL
  97. POINTEUR MPMUC.MPOVAL
  98. POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL
  99. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  100. POINTEUR MPVIMP.MPOVAL
  101. -INC SMCHAML
  102. POINTEUR ICOGRV.MCHELM,JCOGRV.MCHAML
  103. POINTEUR KDUNDX.MELVAL,KDUNDY.MELVAL,KDUNDZ.MELVAL
  104. -INC SMELEME
  105. POINTEUR MELEFL.MELEME
  106. POINTEUR MCOGRV.MELEME
  107. -INC SMLENTI
  108. POINTEUR KRVIMP.MLENTI,KRTOIM.MLENTI
  109. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  110. -INC SMLMOTS
  111. POINTEUR NOMINC.MLMOTS
  112. POINTEUR IJACO.MATRIK
  113. *
  114. * Objet matrice élémentaire simplifié
  115. *
  116. SEGMENT GMATSI
  117. INTEGER POIPR1(NPP1,NEL1)
  118. INTEGER POIDU1(1,NEL1)
  119. INTEGER POIPR2(NPP2,NEL2)
  120. INTEGER POIDU2(2,NEL2)
  121. POINTEUR LMATSI(0).MATSIM
  122. ENDSEGMENT
  123. * Contributions compliquées 1 de la part du gradient de
  124. * vitesse (CCGRV1)
  125. POINTEUR CCGRV1.GMATSI
  126. SEGMENT MATSIM
  127. CHARACTER*8 NOMPRI,NOMDUA
  128. REAL*8 VALMA1(1,NPP1,NEL1)
  129. REAL*8 VALMA2(2,NPP2,NEL2)
  130. ENDSEGMENT
  131. POINTEUR RETRHO.MATSIM
  132. POINTEUR RETROU.MATSIM
  133. POINTEUR RETROV.MATSIM
  134. POINTEUR RETROW.MATSIM
  135. *
  136. REAL*8 MU
  137. *
  138. INTEGER IMPR,IRET
  139. *
  140. LOGICAL LCLIMV,LCLITO
  141. LOGICAL LMUR
  142. LOGICAL LCTR1A,LCTR1B
  143. *
  144. INTEGER IELEM,IPD,IPP,ISOUCH,IEL1,IEL2
  145. INTEGER NELEM,NPD,NPP,NSOUCH,NEL1,NEL2,NPP1,NPP2
  146. INTEGER NGCDRO,NGCGAU,NGFACE,NPPRIM,NPDUAL
  147. INTEGER NLCENP,NLCEND,NLFACE,NLCLTO,NLCLV
  148. INTEGER NLCED,NLCEG,NLFVI
  149. INTEGER NPTEL
  150. INTEGER ICOORX,NLCGAU,NLCDRO
  151. *
  152. REAL*8 ALPHA,UMALPH
  153. REAL*8 DRD,DRG
  154. REAL*8 DUXXF,DUXYF,DUXZF
  155. REAL*8 DUYXF,DUYYF,DUYZF
  156. REAL*8 DUZXF,DUZYF,DUZZF
  157. REAL*8 UXD,UXF,UXG
  158. REAL*8 UYD,UYF,UYG
  159. REAL*8 UZD,UZF,UZG
  160. REAL*8 XD,XF,XG,XFMXD,XFMXG
  161. REAL*8 YD,YF,YG,YFMYD,YFMYG
  162. REAL*8 ZD,ZF,ZG,ZFMZD,ZFMZG
  163. REAL*8 ALPHAX,ALPHAY,ALPHAZ
  164. REAL*8 CNX,CNY,CNZ
  165. REAL*8 SIGNOR,SURFFA,VOLUEL
  166. REAL*8 RHOP,UP,VP,WP
  167. REAL*8 FACTOR,FACTDU,FACTDV,FACTDW
  168. REAL*8 DUDRHO,DUDROU
  169. REAL*8 DVDRHO,DVDROV
  170. REAL*8 DWDRHO,DWDROW
  171. *
  172. * Executable statements
  173. *
  174. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans xlap2e.eso'
  175. * On calcule les contributions à (d Res_{\rho e_t} / d var) ; var
  176. * prenant successivement les valeurs :
  177. * \rho, \rho u, \rho v, \rho w, \rho e_t
  178. * On dérive les termes : (\tens{\tau(\grad{u})} \prod \vect{u})
  179. * \pscal \vect{n}
  180. * ce qui donne deux contributions.
  181. * Contribution 1 :
  182. * ( (d \tens{\tau} / d var) \prod \vect{u}) \pscal \vect{n}
  183. * Contribution 2 :
  184. * ( \tens{\tau} \prod (d \vect{u} / d var)) \pscal \vect{n}
  185. * Note :
  186. * pas de contribution à (d Res_{\rho e_t} / d \rho e_t).
  187. * Les noms de matrices élémentaires (type MATSIM) associées sont :
  188. * RETRHO, RETROU, RETROV, RETROW
  189. IF (LCLIMV) THEN
  190. SEGACT KRVIMP
  191. SEGACT MPVIMP
  192. ENDIF
  193. IF (LCLITO) THEN
  194. SEGACT KRTOIM
  195. ENDIF
  196. SEGACT NOMINC
  197. SEGACT KRCENT
  198. SEGACT KRFACE
  199. SEGACT MELEFL
  200. SEGACT MPSURF
  201. SEGACT MPNORM
  202. SEGACT MPVOLU
  203. SEGACT MPMUC
  204. SEGACT MPROC
  205. SEGACT MPVITC
  206. SEGACT MPGRVF
  207. SEGACT ICOGRV
  208. NSOUCH=ICOGRV.IMACHE(/1)
  209. DO 1 ISOUCH=1,NSOUCH
  210. MCOGRV=ICOGRV.IMACHE(ISOUCH)
  211. JCOGRV=ICOGRV.ICHAML(ISOUCH)
  212. SEGACT JCOGRV
  213. KDUNDX=JCOGRV.IELVAL(1)
  214. KDUNDY=JCOGRV.IELVAL(2)
  215. KDUNDZ=JCOGRV.IELVAL(3)
  216. SEGDES JCOGRV
  217. SEGACT KDUNDX
  218. SEGACT KDUNDY
  219. SEGACT KDUNDZ
  220. SEGACT MCOGRV
  221. NELEM=MCOGRV.NUM(/2)
  222. NPTEL=MCOGRV.NUM(/1)
  223. NPP1=NPTEL-1
  224. NPP2=NPTEL-1
  225. NEL1=NELEM
  226. NEL2=NELEM
  227. IEL1=1
  228. IEL2=1
  229. SEGINI RETRHO
  230. SEGINI RETROU
  231. SEGINI RETROV
  232. SEGINI RETROW
  233. SEGINI CCGRV1
  234. RETRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  235. RETRHO.NOMPRI(5:8)=' '
  236. RETRHO.NOMDUA(1:4)=NOMINC.MOTS(5)
  237. RETRHO.NOMDUA(5:8)=' '
  238. RETROU.NOMPRI(1:4)=NOMINC.MOTS(2)
  239. RETROU.NOMPRI(5:8)=' '
  240. RETROU.NOMDUA(1:4)=NOMINC.MOTS(5)
  241. RETROU.NOMDUA(5:8)=' '
  242. RETROV.NOMPRI(1:4)=NOMINC.MOTS(3)
  243. RETROV.NOMPRI(5:8)=' '
  244. RETROV.NOMDUA(1:4)=NOMINC.MOTS(5)
  245. RETROV.NOMDUA(5:8)=' '
  246. RETROW.NOMPRI(1:4)=NOMINC.MOTS(4)
  247. RETROW.NOMPRI(5:8)=' '
  248. RETROW.NOMDUA(1:4)=NOMINC.MOTS(5)
  249. RETROW.NOMDUA(5:8)=' '
  250. DO 12 IELEM=1,NELEM
  251. * Le premier point du support de ICOGRV est un point FACE
  252. NGFACE=MCOGRV.NUM(1,IELEM)
  253. NLFACE=KRFACE.LECT(NGFACE)
  254. IF (NLFACE.EQ.0) THEN
  255. WRITE(IOIMP,*) 'Erreur de programmation n°1'
  256. GOTO 9999
  257. ENDIF
  258. * On calcule la contribution 1 à la matrice jacobienne IJACO de la
  259. * face NGFACE
  260. * (points duaux : centres à gauche et à droite de la face)
  261. * (points primaux : une partie (bicoz conditions aux limites)
  262. * de ceux du stencil pour le calcul du gradient
  263. * à la face, ils doivent être des points centres)
  264. * Si le tenseur des contraintes sur la face est imposé par les
  265. * conditions aux limites, la contribution 1 de la face à IJACO est
  266. * nulle.
  267. LCTR1A=.TRUE.
  268. IF (LCLITO) THEN
  269. NLCLTO=KRTOIM.LECT(NGFACE)
  270. IF (NLCLTO.NE.0) THEN
  271. LCTR1A=.FALSE.
  272. ENDIF
  273. ENDIF
  274. IF (LCTR1A) THEN
  275. NGCGAU=MELEFL.NUM(1,NLFACE)
  276. NGCDRO=MELEFL.NUM(3,NLFACE)
  277. NLCGAU=KRCENT.LECT(NGCGAU)
  278. NLCDRO=KRCENT.LECT(NGCDRO)
  279. LMUR=(NGCGAU.EQ.NGCDRO)
  280. * On distingue le cas où la face est un bord du maillage (mur)
  281. * du cas où la face est interne au maillage
  282. IF (.NOT.LMUR) THEN
  283. ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
  284. XF = MCOORD.XCOOR(ICOORX)
  285. YF = MCOORD.XCOOR(ICOORX+1)
  286. ZF = MCOORD.XCOOR(ICOORX+2)
  287. ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
  288. XG = MCOORD.XCOOR(ICOORX)
  289. YG = MCOORD.XCOOR(ICOORX+1)
  290. ZG = MCOORD.XCOOR(ICOORX+2)
  291. XFMXG = XF - XG
  292. YFMYG = YF - YG
  293. ZFMZG = ZF - ZG
  294. DRG=SQRT((XFMXG*XFMXG)+(YFMYG*YFMYG)+(ZFMZG*ZFMZG))
  295. ICOORX = ((IDIM + 1) * (NGCDRO - 1))+1
  296. XD = MCOORD.XCOOR(ICOORX)
  297. YD = MCOORD.XCOOR(ICOORX+1)
  298. ZD = MCOORD.XCOOR(ICOORX+2)
  299. XFMXD = XF - XD
  300. YFMYD = YF - YD
  301. ZFMZD = ZF - ZD
  302. DRD=SQRT((XFMXD*XFMXD)+(YFMYD*YFMYD)+(ZFMZD*ZFMZD))
  303. ALPHA=DRG/(DRG+DRD)
  304. UMALPH= 1.0D0 - ALPHA
  305. ELSE
  306. ALPHA=0.0D0
  307. UMALPH=1.0D0
  308. ENDIF
  309. MU=UMALPH*MPMUC.VPOCHA(NLCGAU,1) +
  310. & ALPHA*MPMUC.VPOCHA(NLCDRO,1)
  311. * On calcule tout d'abord une interpolation de la vitesse sur la
  312. * face NGFACE de la même manière que dans xlap12.eso.
  313. IF (LCLIMV) THEN
  314. NLFVI=KRVIMP.LECT(NGFACE)
  315. ELSE
  316. NLFVI=0
  317. ENDIF
  318. * La vitesse est imposée sur la face, rien à calculer
  319. IF (NLFVI.NE.0) THEN
  320. UXF=MPVIMP.VPOCHA(NLFVI,1)
  321. UYF=MPVIMP.VPOCHA(NLFVI,2)
  322. UZF=MPVIMP.VPOCHA(NLFVI,3)
  323. ELSE
  324. NLCEG=KRCENT.LECT(NGCGAU)
  325. NLCED=KRCENT.LECT(NGCDRO)
  326. * Cas non au bord
  327. IF (.NOT.LMUR) THEN
  328. * Paramètres géométriques
  329. ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
  330. XF = MCOORD.XCOOR(ICOORX)
  331. YF = MCOORD.XCOOR(ICOORX+1)
  332. ZF = MCOORD.XCOOR(ICOORX+2)
  333. ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
  334. XG = MCOORD.XCOOR(ICOORX)
  335. YG = MCOORD.XCOOR(ICOORX+1)
  336. ZG = MCOORD.XCOOR(ICOORX+2)
  337. XFMXG = XF - XG
  338. YFMYG = YF - YG
  339. ZFMZG = ZF - ZG
  340. DRG=SQRT((XFMXG*XFMXG)+(YFMYG*YFMYG)+(ZFMZG*ZFMZG))
  341. ICOORX = ((IDIM + 1) * (NGCDRO - 1))+1
  342. XD = MCOORD.XCOOR(ICOORX)
  343. YD = MCOORD.XCOOR(ICOORX+1)
  344. ZD = MCOORD.XCOOR(ICOORX+2)
  345. XFMXD = XF - XD
  346. YFMYD = YF - YD
  347. ZFMZD = ZF - ZD
  348. DRD=SQRT((XFMXD*XFMXD)+(YFMYD*YFMYD)+(ZFMZD*ZFMZD))
  349. ALPHA=DRG/(DRG+DRD)
  350. UMALPH= 1.0D0 - ALPHA
  351. DUXXF = MPGRVF.VPOCHA(NLFACE,1)
  352. DUXYF = MPGRVF.VPOCHA(NLFACE,2)
  353. DUXZF = MPGRVF.VPOCHA(NLFACE,3)
  354. DUYXF = MPGRVF.VPOCHA(NLFACE,4)
  355. DUYYF = MPGRVF.VPOCHA(NLFACE,5)
  356. DUYZF = MPGRVF.VPOCHA(NLFACE,6)
  357. DUZXF = MPGRVF.VPOCHA(NLFACE,7)
  358. DUZYF = MPGRVF.VPOCHA(NLFACE,8)
  359. DUZZF = MPGRVF.VPOCHA(NLFACE,9)
  360. * Calcul de la vitesse
  361. UXG = MPVITC.VPOCHA(NLCEG,1)
  362. UYG = MPVITC.VPOCHA(NLCEG,2)
  363. UZG = MPVITC.VPOCHA(NLCEG,3)
  364. UXD = MPVITC.VPOCHA(NLCED,1)
  365. UYD = MPVITC.VPOCHA(NLCED,2)
  366. UZD = MPVITC.VPOCHA(NLCED,3)
  367. UXF = UMALPH * UXG + ALPHA * UXD
  368. UYF = UMALPH * UYG + ALPHA * UYD
  369. UZF = UMALPH * UZG + ALPHA * UZD
  370. * Correction de la vitesse lineaire exacte
  371. UXF = UXF +
  372. & (DUXXF * ((XFMXG * UMALPH)+ (XFMXD * ALPHA))) +
  373. & (DUXYF * ((YFMYG * UMALPH)+ (YFMYD * ALPHA))) +
  374. & (DUXZF * ((ZFMZG * UMALPH)+ (ZFMZD * ALPHA)))
  375. UYF = UYF +
  376. & (DUYXF * ((XFMXG * UMALPH)+ (XFMXD * ALPHA))) +
  377. & (DUYYF * ((YFMYG * UMALPH)+ (YFMYD * ALPHA))) +
  378. & (DUYZF * ((ZFMZG * UMALPH)+ (ZFMZD * ALPHA)))
  379. UZF = UZF +
  380. & (DUZXF * ((XFMXG * UMALPH)+ (XFMXD * ALPHA))) +
  381. & (DUZYF * ((YFMYG * UMALPH)+ (YFMYD * ALPHA))) +
  382. & (DUZZF * ((ZFMZG * UMALPH)+ (ZFMZD * ALPHA)))
  383.  
  384. * Cas au bord
  385. ELSE
  386. * Parametres geometriques
  387. ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
  388. XF = MCOORD.XCOOR(ICOORX)
  389. YF = MCOORD.XCOOR(ICOORX+1)
  390. ZF = MCOORD.XCOOR(ICOORX+2)
  391. ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
  392. XG = MCOORD.XCOOR(ICOORX)
  393. YG = MCOORD.XCOOR(ICOORX+1)
  394. ZG = MCOORD.XCOOR(ICOORX+2)
  395. XFMXG = XF - XG
  396. YFMYG = YF - YG
  397. ZFMZG = ZF - ZG
  398. DUXXF = MPGRVF.VPOCHA(NLFACE,1)
  399. DUXYF = MPGRVF.VPOCHA(NLFACE,2)
  400. DUXZF = MPGRVF.VPOCHA(NLFACE,3)
  401. DUYXF = MPGRVF.VPOCHA(NLFACE,4)
  402. DUYYF = MPGRVF.VPOCHA(NLFACE,5)
  403. DUYZF = MPGRVF.VPOCHA(NLFACE,6)
  404. DUZXF = MPGRVF.VPOCHA(NLFACE,7)
  405. DUZYF = MPGRVF.VPOCHA(NLFACE,8)
  406. DUZZF = MPGRVF.VPOCHA(NLFACE,9)
  407. * Calcul de la vitesse
  408. UXF = MPVITC.VPOCHA(NLCEG,1)
  409. UYF = MPVITC.VPOCHA(NLCEG,2)
  410. UZF = MPVITC.VPOCHA(NLCEG,3)
  411. * Correction de la vitesse lineaire exacte
  412. UXF = UXF +
  413. & (DUXXF * XFMXG ) +
  414. & (DUXYF * YFMYG ) +
  415. & (DUXZF * ZFMZG )
  416. UYF = UYF +
  417. & (DUYXF * XFMXG ) +
  418. & (DUYYF * YFMYG ) +
  419. & (DUYZF * ZFMZG )
  420. UZF = UZF +
  421. & (DUZXF * XFMXG ) +
  422. & (DUZYF * YFMYG ) +
  423. & (DUZZF * ZFMZG )
  424. ENDIF
  425. ENDIF
  426. * On distingue le cas où la face est un bord du maillage (mur)
  427. * du cas où la face est interne au maillage
  428. IF (.NOT.LMUR) THEN
  429. NPD=2
  430. ELSE
  431. NPD=1
  432. ENDIF
  433. NPP=NPTEL-1
  434. * IPD=1 : point à gauche du point NGFACE
  435. * IPD=2 : point à droite du point NGFACE
  436. DO 122 IPD=1,NPD
  437. NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE)
  438. IF (.NOT.LMUR) THEN
  439. CCGRV1.POIDU2(IPD,IEL2)=NPDUAL
  440. ELSE
  441. CCGRV1.POIDU1(IPD,IEL1)=NPDUAL
  442. ENDIF
  443. NLCEND=KRCENT.LECT(NPDUAL)
  444. IF (NLCEND.EQ.0) THEN
  445. WRITE(IOIMP,*) 'Erreur grave n°1'
  446. GOTO 9999
  447. ENDIF
  448. DO 124 IPP=1,NPP
  449. NPPRIM=MCOGRV.NUM(IPP+1,IELEM)
  450. LCTR1B=.TRUE.
  451. IF (LCLIMV) THEN
  452. NLCLV=KRVIMP.LECT(NPPRIM)
  453. IF (NLCLV.NE.0) THEN
  454. LCTR1B=.FALSE.
  455. ENDIF
  456. ENDIF
  457. IF (.NOT.LCTR1B) THEN
  458. * Lorsque une contribution est nulle, on fixe artificiellement le
  459. * point primal égal au point dual.
  460. IF (.NOT.LMUR) THEN
  461. CCGRV1.POIPR2(IPP,IEL2)=NPDUAL
  462. RETRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  463. RETROU.VALMA2(IPD,IPP,IEL2)=0.D0
  464. RETROV.VALMA2(IPD,IPP,IEL2)=0.D0
  465. RETROW.VALMA2(IPD,IPP,IEL2)=0.D0
  466. ELSE
  467. CCGRV1.POIPR1(IPP,IEL1)=NPDUAL
  468. RETRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  469. RETROU.VALMA1(IPD,IPP,IEL1)=0.D0
  470. RETROV.VALMA1(IPD,IPP,IEL1)=0.D0
  471. RETROW.VALMA1(IPD,IPP,IEL1)=0.D0
  472. ENDIF
  473. ELSE
  474. * Les contributions 1 valent :
  475. * (d Res_{\rho e_t})_d / (d var)_p =
  476. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \mu
  477. * * [ [ [ (n_x * (( 4/3 * u_f * \alpha_x) + (v_f * \alpha_y)
  478. * + (w_f * \alpha_z)))
  479. * + (n_y * ((u_f * \alpha_y) + (-2/3 * v_f * \alpha_x)))
  480. * + (n_z * ((u_f * \alpha_z) + (-2/3 * w_f * \alpha_x)))
  481. * ]
  482. * * ((du)_p / (d var)_p)
  483. * ]
  484. * + [ [ (n_x * ((-2/3 * u_f * \alpha_y) + (v_f * \alpha_x)))
  485. * + (n_y * ((u_f * \alpha_x) + ( 4/3 * v_f * \alpha_y)
  486. * + (w_f * \alpha_z)))
  487. * + (n_z * ((v_f * \alpha_z) + (-2/3 * w_f * \alpha_y)))
  488. * ]
  489. * * ((dv)_p / (d var)_p)
  490. * ]
  491. * + [ [ (n_x * ((-2/3 * u_f * \alpha_z) + (w_f * \alpha_x)))
  492. * + (n_y * ((-2/3 * v_f * \alpha_z) + (w_f * \alpha_y)))
  493. * + (n_z * ((u_f * \alpha_x) + (v_f * \alpha_y)
  494. * + ( 4/3 * w_f * \alpha_z)))
  495. * ]
  496. * * ((dw)_p / (d var)_p)
  497. * ]
  498. * ]
  499. NLCENP=KRCENT.LECT(NPPRIM)
  500. IF (NLCENP.EQ.0) THEN
  501. WRITE(IOIMP,*) 'Erreur grave n°2'
  502. GOTO 9999
  503. ENDIF
  504. * normale sortante pour IPD=1, rentrante pour IPD=2
  505. SIGNOR=(-1.D0)**(IPD+1)
  506. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  507. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  508. CNX =MPNORM.VPOCHA(NLFACE,1)
  509. CNY =MPNORM.VPOCHA(NLFACE,2)
  510. CNZ =MPNORM.VPOCHA(NLFACE,3)
  511. ALPHAX=KDUNDX.VELCHE(IPP+1,IELEM)
  512. ALPHAY=KDUNDY.VELCHE(IPP+1,IELEM)
  513. ALPHAZ=KDUNDZ.VELCHE(IPP+1,IELEM)
  514. RHOP =MPROC.VPOCHA(NLCENP,1)
  515. UP =MPVITC.VPOCHA(NLCENP,1)
  516. VP =MPVITC.VPOCHA(NLCENP,2)
  517. WP =MPVITC.VPOCHA(NLCENP,3)
  518. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*MU
  519. FACTDU=(CNX*((( 4.D0/3.D0)*UXF*ALPHAX)
  520. $ +(UYF*ALPHAY)
  521. $ +(UZF*ALPHAZ)))
  522. $ + (CNY*((UXF*ALPHAY)
  523. $ +((-2.D0/3.D0)*UYF*ALPHAX)))
  524. $ + (CNZ*((UXF*ALPHAZ)
  525. $ +((-2.D0/3.D0)*UZF*ALPHAX)))
  526. FACTDV=(CNX*(((-2.D0/3.D0)*UXF*ALPHAY)
  527. $ +(UYF*ALPHAX)))
  528. $ + (CNY*((UXF*ALPHAX)
  529. $ +(( 4.D0/3.D0)*UYF*ALPHAY)
  530. $ +(UZF*ALPHAZ)))
  531. $ + (CNZ*((UYF*ALPHAZ)
  532. $ +((-2.D0/3.D0)*UZF*ALPHAY)))
  533. FACTDW=(CNX*(((-2.D0/3.D0)*UXF*ALPHAZ)
  534. $ +(UZF*ALPHAX)))
  535. $ + (CNY*(((-2.D0/3.D0)*UYF*ALPHAZ)
  536. $ +(UZF*ALPHAY)))
  537. $ + (CNZ*((UXF*ALPHAX)
  538. $ +(UYF*ALPHAY)
  539. $ +(( 4.D0/3.D0)*UZF*ALPHAZ)))
  540. DUDRHO=-UP /RHOP
  541. DUDROU=1.D0/RHOP
  542. DVDRHO=-VP /RHOP
  543. DVDROV=1.D0/RHOP
  544. DWDRHO=-WP /RHOP
  545. DWDROW=1.D0/RHOP
  546. IF (.NOT.LMUR) THEN
  547. CCGRV1.POIPR2(IPP,IEL2)=NPPRIM
  548. RETRHO.VALMA2(IPD,IPP,IEL2)=
  549. $ FACTOR*( (FACTDU*DUDRHO)
  550. $ +(FACTDV*DVDRHO)
  551. $ +(FACTDW*DWDRHO))
  552. RETROU.VALMA2(IPD,IPP,IEL2)=
  553. $ FACTOR* (FACTDU*DUDROU)
  554. RETROV.VALMA2(IPD,IPP,IEL2)=
  555. $ FACTOR* (FACTDV*DVDROV)
  556. RETROW.VALMA2(IPD,IPP,IEL2)=
  557. $ FACTOR* (FACTDW*DWDROW)
  558. ELSE
  559. CCGRV1.POIPR1(IPP,IEL1)=NPPRIM
  560. RETRHO.VALMA1(IPD,IPP,IEL1)=
  561. $ FACTOR*( (FACTDU*DUDRHO)
  562. $ +(FACTDV*DVDRHO)
  563. $ +(FACTDW*DWDRHO))
  564. RETROU.VALMA1(IPD,IPP,IEL1)=
  565. $ FACTOR* (FACTDU*DUDROU)
  566. RETROV.VALMA1(IPD,IPP,IEL1)=
  567. $ FACTOR* (FACTDV*DVDROV)
  568. RETROW.VALMA1(IPD,IPP,IEL1)=
  569. $ FACTOR* (FACTDW*DWDROW)
  570. ENDIF
  571. ENDIF
  572. 124 CONTINUE
  573. 122 CONTINUE
  574. IF (.NOT.LMUR) THEN
  575. IEL2=IEL2+1
  576. ELSE
  577. IEL1=IEL1+1
  578. ENDIF
  579. ENDIF
  580. 12 CONTINUE
  581. NPP1=NPTEL-1
  582. NPP2=NPTEL-1
  583. NEL1=IEL1-1
  584. NEL2=IEL2-1
  585. SEGADJ RETRHO
  586. SEGADJ RETROU
  587. SEGADJ RETROV
  588. SEGADJ RETROW
  589. SEGADJ CCGRV1
  590. CCGRV1.LMATSI(**)=RETRHO
  591. CCGRV1.LMATSI(**)=RETROU
  592. CCGRV1.LMATSI(**)=RETROV
  593. CCGRV1.LMATSI(**)=RETROW
  594. * On accumule les matrices résultantes dans IJACO
  595. CALL AJMTK(CCGRV1,IJACO,IMPR,IRET)
  596. IF (IRET.NE.0) GOTO 9999
  597. SEGSUP RETRHO
  598. SEGSUP RETROU
  599. SEGSUP RETROV
  600. SEGSUP RETROW
  601. SEGSUP CCGRV1
  602. *
  603. SEGDES MCOGRV
  604. SEGDES KDUNDZ
  605. SEGDES KDUNDY
  606. SEGDES KDUNDX
  607. 1 CONTINUE
  608. SEGDES ICOGRV
  609. SEGDES MPGRVF
  610. SEGDES MPVITC
  611. SEGDES MPMUC
  612. SEGDES MPROC
  613. SEGDES MPVOLU
  614. SEGDES MPNORM
  615. SEGDES MPSURF
  616. SEGDES MELEFL
  617. SEGDES KRFACE
  618. SEGDES KRCENT
  619. SEGDES NOMINC
  620. IF (LCLITO) THEN
  621. SEGDES KRTOIM
  622. ENDIF
  623. IF (LCLIMV) THEN
  624. SEGDES KRVIMP
  625. SEGDES MPVIMP
  626. ENDIF
  627. *
  628. * Normal termination
  629. *
  630. IRET=0
  631. RETURN
  632. *
  633. * Format handling
  634. *
  635. *
  636. * Error handling
  637. *
  638. 9999 CONTINUE
  639. IRET=1
  640. WRITE(IOIMP,*) 'An error was detected in subroutine xlap2e'
  641. RETURN
  642. *
  643. * End of subroutine XLAP2E
  644. *
  645. END
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  

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