Télécharger rlexce.eso

Retour à la liste

Numérotation des lignes :

rlexce
  1. C RLEXCE SOURCE OF166741 24/12/13 21:17:29 12097
  2. SUBROUTINE RLEXCE(MELEME,MELCEN,MELFAC,INORM,ICHCL,MLECOE)
  3. C************************************************************************
  4. C
  5. C PROJET : CASTEM 2000
  6. C
  7. C NOM : RLEXCE
  8. C
  9. C DESCRIPTION : Appelle par GRADGE
  10. C
  11. C LANGAGE : FORTRAN 77 + ESOPE 2000 (avec extensions CISI)
  12. C
  13. C AUTEUR : A. BECCANTINI
  14. C
  15. C************************************************************************
  16. C
  17. C This subroutine computes the coefficients which allow to perform
  18. C a linear exact reconstruction of each 'CENTRE' value.
  19. C Indeed, given the i-th centre (NC=MELEME.NUM(NBNN,i)), given the list
  20. C of its neighbors MELEME.NUM(j,i),j=1,NBNN-1,
  21. C we have to compute the matrix of coefficients a(i,j) such that
  22. C
  23. C VAL(MELEME.NUM(NBNN,i)) = \sum_{neig1} a(i,neig1) * VAL(neig1)
  24. C
  25. C where neig1 is a 'CENTRE' point or a 'wall boundary condition'
  26. C point.
  27. C
  28. C To compute these coefficients, we impose that VAL is linear with
  29. C respect to the coordinates of NC and its neighbor. Then, since
  30. C there are less unknowns than equations, we use a least square
  31. C method. We impose that
  32. C
  33. C A + B (x_{neig} - x_NC) + C (y_{neig} - y_NC) + D (z_{neig} - z_NC)
  34. C = VAL(neig)
  35. C
  36. C To determine A, B, C, D we have to solve
  37. C
  38. C MATA . tran(A, B, C, D) = tran(VAL(1), VAL(2), ... , VALNOR(j) /
  39. C (r_{j} - r_NC)
  40. C
  41. C with MATA(1,*) = (1,x_1-x_NC,y_1-y_NC,z_1-z_NC)
  42. C MATA(2,*) = (1,x_2-x_NC,y_2-y_NC,z_2-z_NC)
  43. C ...
  44. C
  45. C To determine a(i,neig) we have to solve a linear system (for each
  46. C neig). If the neighbor is a 'CENTRE' point or a 'wall boundary
  47. C condition' point we solve
  48. C
  49. C MATA . tran(a(i,neig), b(i,neig), c(i,neig), d(i,neig)) = e_{neig}
  50. C
  51. C with e_{neig} = tran (0,0,...,0,1,0,...) (1 in the neig position)
  52. C
  53. C N.B. Concerning the neighbor, two different cases are taken into
  54. C account.
  55. C 1) Reflecting boundary conditions:
  56. C The neighbor does not belong to the geometrical support of
  57. C ICHCL -> It is a wall point
  58. C Then the reconstruction is performed on a virtual point,
  59. C the symmetric point of the centre with respect to the wall
  60. C 2) Non_reflecting boundary conditions:
  61. C The neighbor belongs to the geometrical support of ICHCL
  62. C -> The reconstruction is performed on such FACE point
  63. C
  64. C**** Inputs:
  65. C
  66. C MELEME = the MELEME which contains the stencil of the gradient
  67. C molecule
  68. C MELCEN = the 'CENTRE' meleme
  69. C MELFAC = the 'FACE' meleme
  70. C INORM = the CHAMPOINT containing the face normals
  71. C ICHCL = the CHAMPOINT containing the non-reflecting boundary
  72. C conditions
  73. C
  74. C**** Output:
  75. C
  76. C MLECOE = list of integers.
  77. C
  78. C MLECOE.LECT(i) points to the MLREEL MATCOE which
  79. C contain the a(i,neig)
  80. C
  81. C***********************************************************************
  82. C
  83. C Modified the 25-th of february to take into account the 'MODE' 'AXIS'
  84.  
  85. IMPLICIT INTEGER(I-N)
  86. INTEGER INORM, ICHCL, IGEOM, NSOU, JG, NTCEN, NVMAX, NVMIN
  87. & ,NBNN, NBELEM, NGV
  88. & , NGC, IPCOOR, NLV, NLV1, NLF, IERSVD, IERR0
  89. & ,ISOUS , ICEN, IELEM, IVOI, I1, I2, I3, I4, NAXI
  90. REAL*8 XC ,YC, ZC, XV, YV, ZV, DX, DY, DZ, ERRTOL, SMAX, SMIN
  91. & ,RNX, RNY, RNZ, ALPHA
  92. PARAMETER(ERRTOL=1.0D-16)
  93. CHARACTER*8 TYPE
  94. LOGICAL LOGSVD, LOGAXI
  95.  
  96. -INC PPARAM
  97. -INC CCOPTIO
  98. -INC SMCOORD
  99. -INC SMELEME
  100. -INC SMLREEL
  101. -INC SMLENTI
  102. -INC SMCHPOI
  103. C
  104. INTEGER N1,N2
  105. SEGMENT MATRIX
  106. REAL*8 MAT(N1,N2)
  107. ENDSEGMENT
  108. C
  109. POINTEUR MELFAC.MELEME, MLEFAC.MLENTI, MLEBC.MLENTI, MPNORM.MPOVAL
  110. & ,MLESOU.MLENTI, MELCEN.MELEME ,MLECEN.MLENTI
  111. & ,MLECOE.MLENTI, MATCOE.MATRIX
  112. & ,MATA.MATRIX,MATU.MATRIX,MATV.MATRIX,MLRB.MLREEL
  113. & ,MLRSIG.MLREEL,MLRTRA.MLREEL,MTAA.MATRIX, MINTAA.MATRIX
  114. & ,MLRIN1.MLREEL,MLRIN2.MLREEL
  115. & ,MLRIN3.MLREEL
  116. C
  117. C**** Axis-symmetrical case
  118. C
  119. IF((IFOMOD .EQ. 0) .AND. (IDIM .EQ. 2))THEN
  120. LOGAXI=.TRUE.
  121. NAXI=2
  122. ELSE
  123. NAXI=0
  124. LOGAXI=.FALSE.
  125. ENDIF
  126. C
  127. C**** We create the MLENTI for the centers
  128. C
  129. CALL KRIPAD(MELCEN,MLECEN)
  130. IF(IERR .NE. 0)GOTO 9999
  131. C En KRIPAD
  132. C SEGINI MLECEN
  133. C
  134. C**** We create the MLENTI for the faces
  135. C
  136. CALL KRIPAD(MELFAC,MLEFAC)
  137. IF(IERR .NE. 0)GOTO 9999
  138. C En KRIPAD
  139. C SEGINI MLEFAC
  140. C
  141. C**** We create the MLENTI for the BC
  142. C
  143. IF(ICHCL.NE.0)THEN
  144. CALL LICHT(ICHCL,MPOVAL,TYPE,IGEOM)
  145. C In LICHT
  146. C SEGACT MPOVAL*MOD
  147. SEGDES MPOVAL
  148. ELSE
  149. IGEOM=0
  150. ENDIF
  151. CALL KRIPAD(IGEOM,MLEBC)
  152. IF(IERR .NE. 0)GOTO 9999
  153. C SEGINI MLEBC
  154. C
  155. C**** Le MPOVAL des normales
  156. C
  157. CALL LICHT(INORM,MPNORM,TYPE,IGEOM)
  158. C SEGACT MPNORM
  159. C
  160. C**** We recover the elemenary mesh of MELEME
  161. C We compute the number of maximum number of neighbors
  162. C We compute the number of centers
  163. C
  164. SEGACT MELEME
  165. NSOU=MAX(MELEME.LISOUS(/1),1)
  166. JG=NSOU
  167. SEGINI MLESOU
  168. IF (NSOU.EQ.1)THEN
  169. MLESOU.LECT(1)=MELEME
  170. NBNN=MELEME.NUM(/1)
  171. NTCEN=MELEME.NUM(/2)
  172. NVMAX=NBNN
  173. ELSE
  174. NVMAX=0
  175. NTCEN=0
  176. DO ISOUS=1,NSOU,1
  177. IPT1=MELEME.LISOUS(ISOUS)
  178. MLESOU.LECT(ISOUS)=IPT1
  179. SEGACT IPT1
  180. NBNN=IPT1.NUM(/1)
  181. NVMAX=MAX(NVMAX,NBNN)
  182. NTCEN=NTCEN+IPT1.NUM(/2)
  183. ENDDO
  184. ENDIF
  185. NVMAX=NVMAX+NAXI
  186. C
  187. C**** The output
  188. C
  189. JG=NTCEN
  190. SEGINI MLECOE
  191. C
  192. C MATA = matrix to "pseudoinvert" (NVMAX,IDIM+1)
  193. C MATU = matrix of the singular right eigenvectors of MATA
  194. C (NVMAX,IDIM+1)
  195. C MATV = matrix of the singular left eigenvectors of MATA
  196. C (IDIM+1,IDIM+1)
  197. C But in invsvd.eso, MATV dimensions are NVMAX,IDIM+1
  198. C MLRSIG = singular values of MATA (IDIM+1)
  199. C MLRB = vector (NVMAX)
  200. C MLRB.PROG(j) = 1
  201. C
  202. C N.B. MATA = MATU MATSIG t(MATV)
  203. C If MATA is non singular,
  204. C inv(MATA) = MATV inv(MATSIG) t(MATU)
  205. C
  206. C MLRTRA temporary vector of invsvd.eso
  207. C NVMIN = IDIM + 1 (the most little dimension of the matrices)
  208. C
  209. N1=NVMAX
  210. N2=IDIM+1
  211. SEGINI MATA
  212. SEGINI MATU
  213. SEGINI MATV
  214. JG=NVMAX
  215. SEGINI MLRB
  216. JG=IDIM+1
  217. SEGINI MLRSIG
  218. SEGINI MLRTRA
  219. NVMIN=N2
  220. C
  221. C MTAA : [t(MATA).MATA]
  222. C MINTAA : [inve(t(MATA) MATA)]
  223. C MLRIN1,2,3 : "temporary vectors"
  224. C
  225. N1=NVMIN
  226. N2=NVMIN
  227. SEGINI MTAA
  228. SEGINI MINTAA
  229. JG=NVMIN
  230. SEGINI MLRIN1
  231. SEGINI MLRIN2
  232. SEGINI MLRIN3
  233. C
  234. C**** Loop on the sommet to compute the coefficient
  235. C
  236. ICEN=0
  237. DO ISOUS=1,NSOU,1
  238. IPT1=MLESOU.LECT(ISOUS)
  239. NBNN=IPT1.NUM(/1)
  240. NBELEM=IPT1.NUM(/2)
  241. DO IELEM=1,NBELEM,1
  242. C
  243. NGC=IPT1.NUM(NBNN,IELEM)
  244. IPCOOR=((NGC-1)*(IDIM+1))+1
  245. XC=MCOORD.XCOOR(IPCOOR)
  246. YC=MCOORD.XCOOR(IPCOOR+1)
  247. IF(IDIM.EQ.3) ZC=MCOORD.XCOOR(IPCOOR+2)
  248. C
  249. C********** We create the matrix of coefficients.
  250. C
  251. N2=NBNN+NAXI
  252. N1=NVMIN
  253. ICEN=ICEN+1
  254. SEGINI MATCOE
  255. MLECOE.LECT(ICEN)=MATCOE
  256. C
  257. C********** Loop involving the neighbors (and the centre itself)
  258. C We create the matrix to "pseudoinvert"
  259. C
  260. DO IVOI=1,NBNN,1
  261. NGV=IPT1.NUM(IVOI,IELEM)
  262. NLV=MLECEN.LECT(NGV)
  263. NLV1=MLEBC.LECT(NGV)
  264. IF((NLV .NE. 0) .OR. (NLV1 .NE. 0))THEN
  265. C
  266. C**************** NGV is a 'centre' point or a ICHCL point
  267. C
  268. IPCOOR=((NGV-1)*(IDIM+1))+1
  269. XV=MCOORD.XCOOR(IPCOOR)
  270. YV=MCOORD.XCOOR(IPCOOR+1)
  271. MATA.MAT(IVOI,1)=1
  272. MATA.MAT(IVOI,2)=XV
  273. MATA.MAT(IVOI,3)=YV
  274. IF(IDIM.EQ.3)THEN
  275. ZV=MCOORD.XCOOR(IPCOOR+2)
  276. MATA.MAT(IVOI,4)=ZV
  277. ENDIF
  278. ELSE
  279. C
  280. C**************** Reflecting BC reconstruction
  281. C
  282. NLF=MLEFAC.LECT(NGV)
  283. RNX=MPNORM.VPOCHA(NLF,1)
  284. RNY=MPNORM.VPOCHA(NLF,2)
  285. IPCOOR=((NGV-1)*(IDIM+1))+1
  286. XV=MCOORD.XCOOR(IPCOOR)
  287. YV=MCOORD.XCOOR(IPCOOR+1)
  288. ALPHA=(XV-XC)*RNX+(YV-YC)*RNY
  289. DX=ALPHA*2.0D0*RNX
  290. DY=ALPHA*2.0D0*RNY
  291. MATA.MAT(IVOI,1)=1
  292. MATA.MAT(IVOI,2)=XC+DX
  293. MATA.MAT(IVOI,3)=YC+DY
  294. IF(IDIM.EQ.3)THEN
  295. RNZ=MPNORM.VPOCHA(NLF,3)
  296. ZV=MCOORD.XCOOR(IPCOOR+2)
  297. ALPHA=ALPHA+(ZV-ZC)*RNZ
  298. DZ=ALPHA*2.0D0*RNZ
  299. MATA.MAT(IVOI,4)=ZC+DZ
  300. ENDIF
  301. ENDIF
  302. MLRB.PROG(IVOI)=1.0D0
  303. ENDDO
  304. C
  305. DO IVOI=NBNN+1,NBNN+NAXI,1
  306. MATA.MAT(IVOI,1)=1
  307. MATA.MAT(IVOI,2)=XC
  308. MATA.MAT(IVOI,3)=YC
  309. MLRB.PROG(IVOI)=1.0D0
  310. ENDDO
  311. C
  312. CC
  313. CC TEST
  314. CC
  315. C do ivoi=1,nbnn,1
  316. C write(*,*) 'ngv =', ipt1.num(ivoi,ielem)
  317. C write(*,*)
  318. C & 'mata.mat(',ivoi,')=',(mata.mat(ivoi,i1),i1=1,nvmin
  319. C $ ,1)
  320. C write(*,*) 'b(',ivoi,')=',mlrb.prog(ivoi)
  321. C enddo
  322. C
  323. C
  324. C********** Now we have to invert this matrix
  325. C
  326. LOGSVD=.TRUE.
  327. CALL INVSVD( NVMAX, NBNN+NAXI, NVMIN, MATA.MAT,
  328. & MLRSIG.PROG,.TRUE.,MATU.MAT,.TRUE.,MATV.MAT,IERSVD,
  329. & MLRTRA.PROG)
  330. IF(IERSVD.NE.0)THEN
  331. C
  332. C************* SVD decomposition of the matrix does not work
  333. C
  334. LOGSVD=.FALSE.
  335. ELSE
  336. C
  337. C************ We check the condition number of MATA
  338. C
  339. SMAX=0.0D0
  340. DO I1=1,NVMIN,1
  341. SMAX=MAX(SMAX,MLRSIG.PROG(I1))
  342. ENDDO
  343. SMIN=SMAX
  344. DO I1=1,NVMIN,1
  345. SMIN=MIN(SMIN,MLRSIG.PROG(I1))
  346. ENDDO
  347. IF((SMIN/SMAX) .LT. ERRTOL)THEN
  348. LOGSVD=.FALSE.
  349. ENDIF
  350. ENDIF
  351. C
  352. C TEST
  353. C write(*,*) 'LOGSVD=.FALSE.'
  354. C LOGSVD=.FALSE.
  355. C
  356. IF(LOGSVD)THEN
  357. C
  358. C********** INVSVD worked
  359. C
  360. C MATA = MATU MATSIG t(MATV)
  361. C inv(MATA) = MATV inv(MATSIG) t(MATU)
  362. C
  363. DO I4=1,NVMIN,1
  364. DO IVOI=1,NBNN+NAXI,1
  365. DO I2=1,IDIM+1,1
  366. C I2=1 is the only coefficient we are not interested
  367. C in. But we computed it to verify that
  368. C sum_ivoi MATCOE.MAT(ivoi,1) = 1
  369. MATCOE.MAT(I2,IVOI)=MATCOE.MAT(I2,IVOI)+
  370. & (MATV.MAT(I2,I4)*MATU.MAT(IVOI,I4)
  371. & /MLRSIG.PROG(I4))
  372. ENDDO
  373. ENDDO
  374. ENDDO
  375. ELSE
  376. WRITE (IOIMP,*) 'rlexce.eso'
  377. C 22 0
  378. C Opération malvenue. Résultat douteux
  379. CALL ERREUR(22)
  380. C
  381. C************* INVSVD does not worked
  382. C For each neighbor k we have to compute the solution
  383. C of
  384. C
  385. C t(MATA) MATA x = t(MATA) * b
  386. C
  387. C where b= \sum_l e_l \delta(k,l) = e_k
  388. C
  389. C To do that, we compute
  390. C
  391. C X_0 = [inve(t(MATA) MATA)] [t(MATA) * b]
  392. C
  393. C X_1 = X_0 + [inve(t(MATA) MATA)] [t(MATA) * b -
  394. C [t(MATA) MATA] X_0]
  395. C
  396. C
  397. C********** We compute [t(MATA) MATA]
  398. C We store it in the upper triangle of MTAA(NVMIN,NVMIN)
  399. C
  400. DO I1=1,NVMIN,1
  401. DO I2=I1,NVMIN,1
  402. MTAA.MAT(I1,I2)=0.0D0
  403. ENDDO
  404. ENDDO
  405. C
  406. DO I1=1,NVMIN,1
  407. DO I2=I1,NVMIN,1
  408. DO I3=1,NBNN+NAXI,1
  409. MTAA.MAT(I1,I2)=MTAA.MAT(I1,I2)+
  410. & (MATA.MAT(I3,I1)*MATA.MAT(I3,I2))
  411. ENDDO
  412. ENDDO
  413. ENDDO
  414. C
  415. C************* We compute [inve(t(MATA) MATA)]
  416. C CHOLDC stores it in the upper trianle of MINTAA(NVMIN,NVMIN)
  417. C
  418. CALL CHOLDC(NVMIN,NVMIN,MTAA.MAT,MLRIN1.PROG,MINTAA.MAT,
  419. & MLRIN2.PROG,IERR0)
  420. IF(IERR0.NE.0)THEN
  421. WRITE(IOIMP,*) 'subroutine rlexce.eso.'
  422. C 26 2
  423. C Tache impossible. Probablement données erronées
  424. CALL ERREUR(26)
  425. GOTO 9999
  426. ENDIF
  427. C
  428. C************* We complete MTAA and MINTAA
  429. C
  430. DO I1=1,NVMIN,1
  431. DO I2=I1+1,NVMIN,1
  432. MINTAA.MAT(I2,I1)=MINTAA.MAT(I1,I2)
  433. MTAA.MAT(I2,I1)=MTAA.MAT(I1,I2)
  434. ENDDO
  435. ENDDO
  436. C
  437. DO IVOI=1,NBNN+NAXI,1
  438. C
  439. C************* We compute [t(MATA) . b] and we store it in MLRIN1.PROG
  440. C
  441. DO I1=1,NVMIN,1
  442. MLRIN1.PROG(I1)=MATA.MAT(IVOI,I1)*MLRB.PROG(IVOI)
  443. MLRIN2.PROG(I1)=0.0D0
  444. MLRIN3.PROG(I1)=0.0D0
  445. ENDDO
  446. C
  447. C**************** X_0 = [inve(t(MATA) MATA)] [t(MATA) * b]
  448. C X_0(i1) into MLRIN2.PROG(I1)
  449. C
  450. DO I2=1,NVMIN,1
  451. DO I1=1,NVMIN,1
  452. MLRIN2.PROG(I1)=MLRIN2.PROG(I1)+
  453. & (MINTAA.MAT(I1,I2)*MLRIN1.PROG(I2))
  454. ENDDO
  455. ENDDO
  456. C
  457. C*************** X_1 = X_0 + [inve(t(MATA) MATA)] [t(MATA) * b -
  458. C [t(MATA) MATA] X_0]
  459. C
  460. C [t(MATA) MATA] X_0 into MLRIN3.PROG
  461. C
  462. DO I2=1,NVMIN,1
  463. DO I1=1,NVMIN,1
  464. MLRIN3.PROG(I1)=MLRIN3.PROG(I1)+
  465. & (MTAA.MAT(I1,I2)*MLRIN2.PROG(I2))
  466. ENDDO
  467. ENDDO
  468. C
  469. C**************** Now we have
  470. C [t(MATA) . b] in MLRIN1.PROG
  471. C X_0(i1) in MLRIN2.PROG(I1)
  472. C [t(MATA) MATA] X_0 in MLRIN3.PROG
  473. C
  474. C X_1(i1) in MLRCOE.MAT(i1,IVOI)
  475. C
  476. DO I1=1,IDIM+1,1
  477. C The only unuseful one is I1=1
  478. DO I2=1,NVMIN,1
  479. MATCOE.MAT(I1,IVOI)=MATCOE.MAT(I1,IVOI)+
  480. & (MINTAA.MAT(I1,I2)*
  481. & (MLRIN1.PROG(I2)-MLRIN3.PROG(I2)))
  482. ENDDO
  483. MATCOE.MAT(I1,IVOI)=MATCOE.MAT(I1,IVOI)+
  484. & MLRIN2.PROG(I1)
  485. ENDDO
  486. ENDDO
  487. ENDIF
  488. C
  489. C LOGAXI -> We eliminate the false neighbors
  490. C
  491. IF(LOGAXI)THEN
  492. DO I1=1,NVMIN,1
  493. MATCOE.MAT(I1,NBNN)=MATCOE.MAT(I1,NBNN)+
  494. & MATCOE.MAT(I1,NBNN+1)+MATCOE.MAT(I1,NBNN+2)
  495. ENDDO
  496. N2=NBNN
  497. N1=NVMIN
  498. SEGADJ MATCOE
  499. ENDIF
  500. CC
  501. CC TEST
  502. C write(*,*) 'ngc =', NGC
  503. C write(*,*) 'invide',LOGSVD
  504. C write(*,*) 'nvois =',(ipt1.num(ivoi,ielem),ivoi=1,nbnn,1)
  505. C write(*,*) 'coeff(1) =',(matcoe.mat(1,ivoi),ivoi=1,nbnn,1)
  506. C write(*,*) 'coeff(2) =',(matcoe.mat(2,ivoi),ivoi=1,nbnn,1)
  507. C write(*,*) 'coeff(3) =',(matcoe.mat(3,ivoi),ivoi=1,nbnn,1)
  508. C if(idim.eq.3) write(*,*) 'coeff(4)=',
  509. C & (matcoe.mat(4,ivoi),ivoi=1,nbnn,1)
  510. C xv=0.0D0
  511. C yv=0.0D0
  512. C zv=0.0D0
  513. C xc=0.0D0
  514. C do ivoi=1,nbnn,1
  515. C xv=xv+matcoe.mat(1,ivoi)
  516. C yv=yv+matcoe.mat(2,ivoi)
  517. C zv=zv+matcoe.mat(3,ivoi)
  518. C if(idim.eq.3) xc=xc+matcoe.mat(4,ivoi)
  519. C enddo
  520. C write(*,*) 'sum_1=',xv
  521. C write(*,*) 'sum_2=',yv
  522. C write(*,*) 'sum_3=',zv
  523. C if(idim.eq.3) write(*,*) 'sum_4=',xc
  524. CC
  525. SEGDES MATCOE
  526. ENDDO
  527. SEGDES IPT1
  528. ENDDO
  529. C
  530. SEGSUP MLECEN
  531. SEGSUP MLEFAC
  532. SEGSUP MLEBC
  533. C
  534. SEGDES MPNORM
  535. IF(NSOU .GT. 1) SEGDES MELEME
  536. SEGSUP MLESOU
  537. C
  538. SEGDES MLECOE
  539. C
  540. SEGSUP MATA
  541. SEGSUP MATU
  542. SEGSUP MATV
  543. SEGSUP MLRSIG
  544. SEGSUP MLRTRA
  545. SEGSUP MLRB
  546. C
  547. SEGSUP MTAA
  548. SEGSUP MINTAA
  549. SEGSUP MLRIN1
  550. SEGSUP MLRIN2
  551. SEGSUP MLRIN3
  552. C
  553. C write(ioimp,*) 'FINITO'
  554. C stop
  555. C
  556. 9999 CONTINUE
  557. RETURN
  558. END
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  

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