Télécharger xlap2b.eso

Retour à la liste

Numérotation des lignes :

xlap2b
  1. C XLAP2B SOURCE CB215821 20/11/25 13:43:19 10792
  2. SUBROUTINE XLAP2B(ICOGRT,MPROC,MPVITC,MPTEMC,
  3. $ MPVOLU,MPNORM,MPSURF,MELEFL,
  4. $ KRFACE,KRCENT,LCLIMT,KRTIMP,LCLIMQ,KRQIMP,
  5. $ NOMINC,
  6. $ MPKAPC,MPCVC,
  7. $ IJACO,
  8. $ IMPR,IRET)
  9. IMPLICIT INTEGER(I-N)
  10. IMPLICIT REAL*8 (A-H,O-Z)
  11. C***********************************************************************
  12. C NOM : XLAP2B
  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 : XLAP2A : 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 KRQIMP (type MLENTI) : tableau de repérage dans
  58. C maillage des CL de Dirichlet sur le flux de
  59. C chaleur.
  60. C NOMINC (type MLMOTS) : noms des inconnues.
  61. C MPKAPC (type MPOVAL) : conductivité thermique (SI)
  62. C MPCVC (type MPOVAL) : chaleur spécifique à volume
  63. C constant (SI).
  64. C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
  65. C résidu du laplacien VF 3D.
  66. C SORTIES : -
  67. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  68. C***********************************************************************
  69. C VERSION : v1, 08/03/2002, version initiale
  70. C HISTORIQUE : v1, 08/03/2002, création
  71. C HISTORIQUE :
  72. C HISTORIQUE :
  73. C***********************************************************************
  74. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  75. C en cas de modification de ce sous-programme afin de faciliter
  76. C la maintenance !
  77. C***********************************************************************
  78.  
  79. -INC PPARAM
  80. -INC CCOPTIO
  81. -INC SMCOORD
  82. -INC SMCHPOI
  83. POINTEUR MPKAPC.MPOVAL,MPCVC.MPOVAL
  84. POINTEUR MPROC.MPOVAL ,MPVITC.MPOVAL,MPTEMC.MPOVAL
  85. POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
  86. -INC SMCHAML
  87. POINTEUR ICOGRT.MCHELM,JCOGRT.MCHAML
  88. POINTEUR KCDTDX.MELVAL,KCDTDY.MELVAL,KCDTDZ.MELVAL
  89. -INC SMELEME
  90. POINTEUR MELEFL.MELEME
  91. POINTEUR MCOGRT.MELEME
  92. -INC SMLENTI
  93. POINTEUR KRTIMP.MLENTI,KRQIMP.MLENTI
  94. POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
  95. -INC SMLMOTS
  96. POINTEUR NOMINC.MLMOTS
  97. POINTEUR IJACO.MATRIK
  98. *
  99. * Objet matrice élémentaire simplifié
  100. *
  101. SEGMENT GMATSI
  102. INTEGER POIPR1(NPP1,NEL1)
  103. INTEGER POIDU1(1,NEL1)
  104. INTEGER POIPR2(NPP2,NEL2)
  105. INTEGER POIDU2(2,NEL2)
  106. POINTEUR LMATSI(0).MATSIM
  107. ENDSEGMENT
  108. * Contributions de la part du gradient de température (CTGRT)
  109. POINTEUR CTGRT.GMATSI
  110. SEGMENT MATSIM
  111. CHARACTER*8 NOMPRI,NOMDUA
  112. REAL*8 VALMA1(1,NPP1,NEL1)
  113. REAL*8 VALMA2(2,NPP2,NEL2)
  114. ENDSEGMENT
  115. POINTEUR RETRHO.MATSIM
  116. POINTEUR RETROU.MATSIM
  117. POINTEUR RETROV.MATSIM
  118. POINTEUR RETROW.MATSIM
  119. POINTEUR RETRET.MATSIM
  120. *
  121. REAL*8 KAPPA,CV
  122. *
  123. INTEGER IMPR,IRET
  124. *
  125. LOGICAL LCLIMT,LCLIMQ
  126. LOGICAL LMUR
  127. LOGICAL LCTRB1,LCTRB2
  128. *
  129. INTEGER IELEM,IPD,IPP,ISOUCH,IEL1,IEL2
  130. INTEGER NELEM,NPD,NPP,NSOUCH,NEL1,NEL2,NPP1,NPP2
  131. INTEGER NGCDRO,NGCGAU,NGFACE,NPPRIM,NPDUAL
  132. INTEGER NLCENP,NLCEND,NLFACE,NLCLQ,NLCLT
  133. INTEGER NPTEL
  134. *
  135. REAL*8 BETAX,BETAY,BETAZ,CNX,CNY,CNZ
  136. REAL*8 SIGNOR,SURFFA,VOLUEL
  137. REAL*8 RHOP,UP,VP,WP,TP
  138. REAL*8 FACTOR
  139. REAL*8 DTDRHO,DTDROU,DTDROV,DTDROW,DTDRET
  140. *
  141. INTEGER ICOORX,NLCGAU,NLCDRO
  142. REAL*8 XF,YF,ZF,XG,YG,ZG,XFMXG,YFMYG,ZFMZG,DRG
  143. & ,XD,YD,ZD,XFMXD,YFMYD,ZFMZD,DRD,ALPHA,UMALPH
  144. C
  145. *
  146. * Executable statements
  147. *
  148. IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans xlap2b.eso'
  149. * On calcule la partie de d Res_{\rho e_t} / d var
  150. * (var prend successivement les valeurs :
  151. * \rho, \rho u, \rho v, \rho w, \rho e_t)
  152. * faisant intervenir les coefficients pour le calcul des gradients de
  153. * température (ICOGRT).
  154. * C'est la partie contenant le terme : - \vect{q} \pscal \vect{n}
  155. * Les noms de matrices élémentaires (type MATSIM) associées sont :
  156. * RETRHO, RETROU, RETROV, RETROW, RETRET
  157. IF (LCLIMT) THEN
  158. SEGACT KRTIMP
  159. ENDIF
  160. IF (LCLIMQ) THEN
  161. SEGACT KRQIMP
  162. ENDIF
  163. SEGACT NOMINC
  164. SEGACT KRCENT
  165. SEGACT KRFACE
  166. SEGACT MELEFL
  167. SEGACT MPSURF
  168. SEGACT MPNORM
  169. SEGACT MPVOLU
  170. SEGACT MPKAPC
  171. SEGACT MPCVC
  172. SEGACT MPROC
  173. SEGACT MPVITC
  174. SEGACT MPTEMC
  175. SEGACT ICOGRT
  176. NSOUCH=ICOGRT.IMACHE(/1)
  177. DO 1 ISOUCH=1,NSOUCH
  178. MCOGRT=ICOGRT.IMACHE(ISOUCH)
  179. JCOGRT=ICOGRT.ICHAML(ISOUCH)
  180. SEGACT JCOGRT
  181. KCDTDX=JCOGRT.IELVAL(1)
  182. KCDTDY=JCOGRT.IELVAL(2)
  183. KCDTDZ=JCOGRT.IELVAL(3)
  184. SEGDES JCOGRT
  185. SEGACT KCDTDX
  186. SEGACT KCDTDY
  187. SEGACT KCDTDZ
  188. SEGACT MCOGRT
  189. NELEM=MCOGRT.NUM(/2)
  190. NPTEL=MCOGRT.NUM(/1)
  191. NPP1=NPTEL-1
  192. NPP2=NPTEL-1
  193. NEL1=NELEM
  194. NEL2=NELEM
  195. IEL1=1
  196. IEL2=1
  197. SEGINI RETRHO
  198. SEGINI RETROU
  199. SEGINI RETROV
  200. SEGINI RETROW
  201. SEGINI RETRET
  202. SEGINI CTGRT
  203. RETRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
  204. RETRHO.NOMPRI(5:8)=' '
  205. RETRHO.NOMDUA(1:4)=NOMINC.MOTS(5)
  206. RETRHO.NOMDUA(5:8)=' '
  207. RETROU.NOMPRI(1:4)=NOMINC.MOTS(2)
  208. RETROU.NOMPRI(5:8)=' '
  209. RETROU.NOMDUA(1:4)=NOMINC.MOTS(5)
  210. RETROU.NOMDUA(5:8)=' '
  211. RETROV.NOMPRI(1:4)=NOMINC.MOTS(3)
  212. RETROV.NOMPRI(5:8)=' '
  213. RETROV.NOMDUA(1:4)=NOMINC.MOTS(5)
  214. RETROV.NOMDUA(5:8)=' '
  215. RETROW.NOMPRI(1:4)=NOMINC.MOTS(4)
  216. RETROW.NOMPRI(5:8)=' '
  217. RETROW.NOMDUA(1:4)=NOMINC.MOTS(5)
  218. RETROW.NOMDUA(5:8)=' '
  219. RETRET.NOMPRI(1:4)=NOMINC.MOTS(5)
  220. RETRET.NOMPRI(5:8)=' '
  221. RETRET.NOMDUA(1:4)=NOMINC.MOTS(5)
  222. RETRET.NOMDUA(5:8)=' '
  223. DO 12 IELEM=1,NELEM
  224. * Le premier point du support de ICOGRT est un point FACE
  225. NGFACE=MCOGRT.NUM(1,IELEM)
  226. NLFACE=KRFACE.LECT(NGFACE)
  227. IF (NLFACE.EQ.0) THEN
  228. WRITE(IOIMP,*) 'Erreur de programmation n°1'
  229. GOTO 9999
  230. ENDIF
  231. * On calcule la contribution à la matrice jacobienne IJACO de la face
  232. * NGFAC (points duaux : centres à gauche et à droite de la face)
  233. * (points primaux : une partie (bicoz conditions aux limites)
  234. * de ceux du stencil pour le calcul du gradient
  235. * à la face, ils doivent être des points centres)
  236. * Si le flux de chaleur sur la face est imposé par les conditions
  237. * aux limites, la contribution de la face à IJACO est nulle.
  238. LCTRB1=.TRUE.
  239. IF (LCLIMQ) THEN
  240. NLCLQ=KRQIMP.LECT(NGFACE)
  241. IF (NLCLQ.NE.0) THEN
  242. LCTRB1=.FALSE.
  243. ENDIF
  244. ENDIF
  245. IF (LCTRB1) THEN
  246. NGCGAU=MELEFL.NUM(1,NLFACE)
  247. NGCDRO=MELEFL.NUM(3,NLFACE)
  248. NLCGAU=KRCENT.LECT(NGCGAU)
  249. NLCDRO=KRCENT.LECT(NGCDRO)
  250. LMUR=(NGCGAU.EQ.NGCDRO)
  251. * On distingue le cas où la face est un bord du maillage (mur)
  252. * du cas où la face est interne au maillage
  253. IF (.NOT.LMUR) THEN
  254. NPD=2
  255. ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
  256. XF = MCOORD.XCOOR(ICOORX)
  257. YF = MCOORD.XCOOR(ICOORX+1)
  258. ZF = MCOORD.XCOOR(ICOORX+2)
  259. ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
  260. XG = MCOORD.XCOOR(ICOORX)
  261. YG = MCOORD.XCOOR(ICOORX+1)
  262. ZG = MCOORD.XCOOR(ICOORX+2)
  263. XFMXG = XF - XG
  264. YFMYG = YF - YG
  265. ZFMZG = ZF - ZG
  266. DRG=SQRT((XFMXG*XFMXG)+(YFMYG*YFMYG)+(ZFMZG*ZFMZG))
  267. ICOORX = ((IDIM + 1) * (NGCDRO - 1))+1
  268. XD = MCOORD.XCOOR(ICOORX)
  269. YD = MCOORD.XCOOR(ICOORX+1)
  270. ZD = MCOORD.XCOOR(ICOORX+2)
  271. XFMXD = XF - XD
  272. YFMYD = YF - YD
  273. ZFMZD = ZF - ZD
  274. DRD=SQRT((XFMXD*XFMXD)+(YFMYD*YFMYD)+(ZFMZD*ZFMZD))
  275. ALPHA=DRG/(DRG+DRD)
  276. UMALPH= 1.0D0 - ALPHA
  277. ELSE
  278. NPD=1
  279. ALPHA=0.0D0
  280. UMALPH=1.0D0
  281. ENDIF
  282. KAPPA=UMALPH*MPKAPC.VPOCHA(NLCGAU,1) +
  283. & ALPHA*MPKAPC.VPOCHA(NLCDRO,1)
  284. CV=UMALPH*MPCVC.VPOCHA(NLCGAU,1) +
  285. & ALPHA*MPCVC.VPOCHA(NLCDRO,1)
  286. NPP=NPTEL-1
  287. * IPD=1 : point à gauche du point NGFACE
  288. * IPD=2 : point à droite du point NGFACE
  289. DO 122 IPD=1,NPD
  290. NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE)
  291. IF (.NOT.LMUR) THEN
  292. CTGRT.POIDU2(IPD,IEL2)=NPDUAL
  293. ELSE
  294. CTGRT.POIDU1(IPD,IEL1)=NPDUAL
  295. ENDIF
  296. NLCEND=KRCENT.LECT(NPDUAL)
  297. IF (NLCEND.EQ.0) THEN
  298. WRITE(IOIMP,*) 'Erreur grave n°1'
  299. GOTO 9999
  300. ENDIF
  301. DO 124 IPP=1,NPP
  302. NPPRIM=MCOGRT.NUM(IPP+1,IELEM)
  303. LCTRB2=.TRUE.
  304. IF (LCLIMT) THEN
  305. NLCLT=KRTIMP.LECT(NPPRIM)
  306. IF (NLCLT.NE.0) THEN
  307. LCTRB2=.FALSE.
  308. ENDIF
  309. ENDIF
  310. IF (.NOT.LCTRB2) THEN
  311. * Lorsque une contribution est nulle, on fixe artificiellement le
  312. * point primal égal au point dual.
  313. IF (.NOT.LMUR) THEN
  314. CTGRT.POIPR2(IPP,IEL2)=NPDUAL
  315. RETRHO.VALMA2(IPD,IPP,IEL2)=0.D0
  316. RETROU.VALMA2(IPD,IPP,IEL2)=0.D0
  317. RETROV.VALMA2(IPD,IPP,IEL2)=0.D0
  318. RETROW.VALMA2(IPD,IPP,IEL2)=0.D0
  319. RETRET.VALMA2(IPD,IPP,IEL2)=0.D0
  320. ELSE
  321. CTGRT.POIPR1(IPP,IEL1)=NPDUAL
  322. RETRHO.VALMA1(IPD,IPP,IEL1)=0.D0
  323. RETROU.VALMA1(IPD,IPP,IEL1)=0.D0
  324. RETROV.VALMA1(IPD,IPP,IEL1)=0.D0
  325. RETROW.VALMA1(IPD,IPP,IEL1)=0.D0
  326. RETRET.VALMA1(IPD,IPP,IEL1)=0.D0
  327. ENDIF
  328. ELSE
  329. * Les contributions valent :
  330. * (d Res_{\rho e_t})_d / (d var)_p =
  331. * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \kappa
  332. * * [ ((n_x * \beta_x) + (n_y * \beta_y) + (n_z * \beta_z)) *
  333. * ((dT)_p / (d var)_p)]
  334. * avec :
  335. * (dT)_p / (d \rho)_p = (1 / \rho_p) *
  336. * ( (((u_p)^2 + (v_p)^2 + (w_p)^2) / (2 * c_v)) - T )
  337. * (dT)_p / (d \rho u)_p = - u_p / (\rho_p * c_v)
  338. * (dT)_p / (d \rho v)_p = - v_p / (\rho_p * c_v)
  339. * (dT)_p / (d \rho w)_p = - w_p / (\rho_p * c_v)
  340. * (dT)_p / (d \rho e_t)_p = 1 / (\rho_p * c_v)
  341. * \beta_x : coefficients pour le calcul de dT/dx
  342. * \beta_y : coefficients pour le calcul de dT/dy
  343. * \beta_z : coefficients pour le calcul de dT/dz
  344. *
  345. NLCENP=KRCENT.LECT(NPPRIM)
  346. IF (NLCENP.EQ.0) THEN
  347. WRITE(IOIMP,*) 'Erreur grave n°2'
  348. GOTO 9999
  349. ENDIF
  350. * normale sortante pour IPD=1, rentrante pour IPD=2
  351. SIGNOR=(-1.D0)**(IPD+1)
  352. VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
  353. SURFFA=MPSURF.VPOCHA(NLFACE,1)
  354. CNX =MPNORM.VPOCHA(NLFACE,1)
  355. CNY =MPNORM.VPOCHA(NLFACE,2)
  356. CNZ =MPNORM.VPOCHA(NLFACE,3)
  357. BETAX =KCDTDX.VELCHE(IPP+1,IELEM)
  358. BETAY =KCDTDY.VELCHE(IPP+1,IELEM)
  359. BETAZ =KCDTDZ.VELCHE(IPP+1,IELEM)
  360. RHOP =MPROC.VPOCHA(NLCENP,1)
  361. UP =MPVITC.VPOCHA(NLCENP,1)
  362. VP =MPVITC.VPOCHA(NLCENP,2)
  363. WP =MPVITC.VPOCHA(NLCENP,3)
  364. TP =MPTEMC.VPOCHA(NLCENP,1)
  365. FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*KAPPA
  366. $ *((CNX*BETAX)+(CNY*BETAY)+(CNZ*BETAZ))
  367. DTDRHO=((((UP*UP)+(VP*VP)+(WP*WP))
  368. $ /(2.D0*CV))-TP)/RHOP
  369. DTDROU=-UP/(RHOP*CV)
  370. DTDROV=-VP/(RHOP*CV)
  371. DTDROW=-WP/(RHOP*CV)
  372. DTDRET=1.D0/(RHOP*CV)
  373. IF (.NOT.LMUR) THEN
  374. CTGRT.POIPR2(IPP,IEL2)=NPPRIM
  375. RETRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRHO
  376. RETROU.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROU
  377. RETROV.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROV
  378. RETROW.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDROW
  379. RETRET.VALMA2(IPD,IPP,IEL2)=FACTOR*DTDRET
  380. ELSE
  381. CTGRT.POIPR1(IPP,IEL1)=NPPRIM
  382. RETRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRHO
  383. RETROU.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROU
  384. RETROV.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROV
  385. RETROW.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDROW
  386. RETRET.VALMA1(IPD,IPP,IEL1)=FACTOR*DTDRET
  387. ENDIF
  388. ENDIF
  389. 124 CONTINUE
  390. 122 CONTINUE
  391. IF (.NOT.LMUR) THEN
  392. IEL2=IEL2+1
  393. ELSE
  394. IEL1=IEL1+1
  395. ENDIF
  396. ENDIF
  397. 12 CONTINUE
  398. NPP1=NPTEL-1
  399. NPP2=NPTEL-1
  400. NEL1=IEL1-1
  401. NEL2=IEL2-1
  402. SEGADJ RETRHO
  403. SEGADJ RETROU
  404. SEGADJ RETROV
  405. SEGADJ RETROW
  406. SEGADJ RETRET
  407. SEGADJ CTGRT
  408. CTGRT.LMATSI(**)=RETRHO
  409. CTGRT.LMATSI(**)=RETROU
  410. CTGRT.LMATSI(**)=RETROV
  411. CTGRT.LMATSI(**)=RETROW
  412. CTGRT.LMATSI(**)=RETRET
  413. * On accumule les matrices résultantes dans IJACO
  414. CALL AJMTK(CTGRT,IJACO,IMPR,IRET)
  415. IF (IRET.NE.0) GOTO 9999
  416. SEGSUP RETRHO
  417. SEGSUP RETROU
  418. SEGSUP RETROV
  419. SEGSUP RETROW
  420. SEGSUP RETRET
  421. SEGSUP CTGRT
  422. *
  423. SEGDES MCOGRT
  424. SEGDES KCDTDZ
  425. SEGDES KCDTDY
  426. SEGDES KCDTDX
  427. 1 CONTINUE
  428. SEGDES ICOGRT
  429. SEGDES MPTEMC
  430. SEGDES MPVITC
  431. SEGDES MPROC
  432. SEGDES MPCVC
  433. SEGDES MPKAPC
  434. SEGDES MPVOLU
  435. SEGDES MPNORM
  436. SEGDES MPSURF
  437. SEGDES MELEFL
  438. SEGDES KRFACE
  439. SEGDES KRCENT
  440. SEGDES NOMINC
  441. IF (LCLIMQ) THEN
  442. SEGDES KRQIMP
  443. ENDIF
  444. IF (LCLIMT) THEN
  445. SEGDES KRTIMP
  446. ENDIF
  447. *
  448. * Normal termination
  449. *
  450. IRET=0
  451. RETURN
  452. *
  453. * Format handling
  454. *
  455. *
  456. * Error handling
  457. *
  458. 9999 CONTINUE
  459. IRET=1
  460. WRITE(IOIMP,*) 'An error was detected in subroutine xlap2b'
  461. RETURN
  462. *
  463. * End of subroutine XLAP2B
  464. *
  465. END
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  

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