Télécharger mondes.eso

Retour à la liste

Numérotation des lignes :

  1. C MONDES SOURCE PV 17/03/22 21:15:07 9370
  2. SUBROUTINE MONDES(MMATRX,MVECTX,NOEN)
  3. C
  4. C **** EXECUTE LA SOLUTION X DE (Lt D L) X=F
  5. C
  6. CMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMB
  7. CMB
  8. CMB Plutot la solution de L.D.Lt ou L.D.Mt (cas non symétrique)
  9. CMB Elle devrait dons s'appeller DESMON et non MONDES.
  10. CMB
  11. CMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMBCMB
  12. C
  13. IMPLICIT INTEGER(I-N)
  14. IMPLICIT REAL*8(A-H,O-Z)
  15. PARAMETER (LPCRAY=10000)
  16. INTEGER OOOVAL
  17.  
  18. C ... Variable décrivant l'EXIStence du Triangle Supérieur différent
  19. C de l'inférieur (cas non symétrique) ...
  20. LOGICAL EXISTS
  21.  
  22. -INC SMMATRI
  23. -INC SMELEME
  24. -INC SMVECTD
  25. -INC CCOPTIO
  26. -INC CCREEL
  27.  
  28. SEGMENT ITTRV(MULRE)
  29. SEGMENT,ITRAA(NENS)
  30. SEGMENT/BID/(BIDON(IIMAX+10)*D)
  31.  
  32. DNORMA=0.D0
  33. DNORMB=0.D0
  34. if (noen.eq.0) then
  35. nbelem=0
  36. nbnn=1
  37. nbsous=0
  38. nbref=0
  39. segini ipt8
  40. ipt8.itypel=1
  41. endif
  42. CALL OOOMRU(1)
  43. IVALMA=0
  44. IF(IIMPI.EQ.3) WRITE(IOIMP,1000)MMATRX,MVECTX
  45. 1000 FORMAT(' SUBROUTINE MONDES : POINTEUR DE LA MATRICE=',I5,
  46. 1 ' POINTEUR DU VECTEUR=',I5)
  47. C
  48. C **** ACTIVATION DES SEGMENTS
  49. C
  50. MMATRI=MMATRX
  51. SEGACT,MMATRI*MOD
  52. * BEC00SE OPTIMISEUR
  53. ITRAA=MMATRI
  54. IF(NENS.NE.0) SEGINI,ITRAA
  55. NE1=NENS
  56. IAA=0
  57.  
  58. EXISTS=.FALSE.
  59. IF(IILIGS.NE.0) THEN
  60. MILIGN=IILIGS
  61. SEGACT MILIGN
  62. IF(ILIGN(/1).GT.0) EXISTS=.TRUE.
  63. ENDIF
  64.  
  65. MILIGN=IILIGN
  66. SEGACT,MILIGN
  67. INC=IPNO(/1)
  68.  
  69. MVECTD=MVECTX
  70. SEGACT MVECTD*MOD
  71.  
  72. MDNOR=IDNORM
  73. SEGACT MDNOR
  74. IF(IDNORD.GT.0) THEN
  75. MDNO1=IDNORD
  76. SEGACT MDNO1
  77. ELSE
  78. MDNO1=MDNOR
  79. ENDIF
  80.  
  81. MDIAG=IDIAG
  82. SEGACT,MDIAG
  83.  
  84. C ... MULRE = nombre de seconds membres ...
  85. MULRE = VECTBB(/1)/INC
  86. C ... MUINC ne servira que comme une borne sur les indices de boucles ...
  87. MUINC = ( MULRE-1)*INC
  88. SEGINI ITTRV
  89.  
  90. C ... Multiplication du second membre par les DNOR(.) (à cause du
  91. C conditionnement des matrices de blocages) ...
  92. DNORMA=0.D0
  93. DO 450 K=0,MUINC,INC
  94. DO 45 I=1,INC
  95. VECTBB(I+K)=VECTBB(I+K)*MDNO1.DNOR(I)
  96. DNORMA=MAX(DNORMA,ABS(VECTBB(I+K)))
  97. 45 CONTINUE
  98. 450 CONTINUE
  99. DNORMA=DNORMA*xzprec*xzprec
  100.  
  101. C ... Détection du premier terme important du second membre ...
  102. II=0
  103. DO 451 K=0,MUINC,INC
  104. II=II+1
  105. DO 452 I=1,INC
  106. IF(ABS(VECTBB(I+K)).LT.DNORMA) GO TO 452
  107. C ... Le numéro du noeud concerné par le premier terme important va à ITTRV ...
  108. ITTRV(II)=IPNO(I)
  109. GO TO 451
  110. 452 CONTINUE
  111. 451 CONTINUE
  112.  
  113. C ... NNOE = nombre de noeuds concernés ...
  114. NNOE=ILIGN(/1)
  115. IDEP=NNOE
  116. C ... On cherche le minimum (non nul) des ITTRV que l'on met dans IDEP ...
  117. DO 453 I=1,MULRE
  118. IF(ITTRV(I).LT.IDEP) THEN
  119. IF(ITTRV(I).NE.0) THEN
  120. IDEP=ITTRV(I)
  121. ELSE
  122. IDEP=1
  123. GO TO 4530
  124. ENDIF
  125. ENDIF
  126. 453 CONTINUE
  127. 4530 CONTINUE
  128. SEGDES MDNOR
  129. C
  130. C **** DESCENTE: ON RESOU L*C=B. EN FAIT ON STOCKE C DANS B
  131. C
  132. LTRK=MAX(1+LPCRAY,OOOVAL(1,4))
  133. IIMAX=(((IJMAX +LTRK)/LTRK)+1)*LTRK
  134. * test si la place disponible permet de tout mettre en memoire
  135. xplds=oooval(1,1)-oooval(2,3)
  136. if (real(nnoe)*ijmax.lt.xplds) iimax=0
  137. SEGINI BID
  138. C ... IDEP : on commence par ce noeud car le second membre est nul pour
  139. C tous les précédents ...
  140. DO 610 IVS=IDEP,NNOE
  141. LIGN=ILIGN(IVS)
  142. SEGACT /ERR=50/ LIGN
  143. IVALMA=IVALMA+VAL(/1)
  144. *pvpv IF (IVALMA.GT.NGMAXY) GOTO 50
  145. NA=IMMM(/1)
  146. IPRELL=IPREL
  147. DO 611 IA=1,NA
  148. C ... Si l'inconnue présente un mode d'ensemble ...
  149. IF(IMMM(IA).NE.0) THEN
  150. C ... On incrémente le compteur et
  151. IAA=IAA+1
  152. C ... on met le N° de la ligne dans ITRAA ...
  153. ITRAA(IAA)=IPRELL+IA-1
  154. ENDIF
  155. 611 CONTINUE
  156. C ... IFIB sera vu dans MONDE2 par le COMMON/CMOND2/ ...
  157. IFIB=IVPO(/1)
  158. ibid=ittrv(1)
  159. ibid=ippvv(1)
  160. ibid=vectbb(1)
  161. segact lign
  162. ibid=val(1)
  163. ibid=ivpo(1)
  164. CALL MONDE2(ITTRV(1),IPPVV(1),VECTBB(1),VAL(1),IVPO(1),
  165. > NA,IPREL,MULRE,INC,IVS,LLOM,IFIB,dnorma)
  166. 610 CONTINUE
  167. C ... Si on n'a pas eu de pb de mémoire on passe par là ...
  168. SEGSUP BID
  169. C ... ILMAX vaut le dernier noeud qui a pu être traité ...
  170. ILMAX=NNOE
  171. C ... On va à la division par la diagonale ...
  172. GOTO 55
  173.  
  174. 50 CONTINUE
  175. C ... Si on est là, c'est à cause des pb de mémoire ...
  176. SEGSUP BID
  177. C ... IVS est le N° du LIGN qui n'a pas pu être traité ...
  178. C ... ILMAX = N° du dernier traité ...
  179. ILMAX=IVS-1
  180. C ... IILMAX = N° du premier à traiter ...
  181. IILMAX=IVS
  182. DO 54 IVS=IILMAX,NNOE
  183. 58 CONTINUE
  184. LIGN=ILIGN(IVS)
  185. C ... Même si tout à l'heure SEGACT n'a pas marché, maintenant on a supprimé BID ...
  186. SEGACT /ERR=56/ LIGN
  187. GOTO 57
  188. 56 CONTINUE
  189. * EN CAS DE PROBLEME ON FAIT UN PEU DE PLACE
  190. C ... Si on a toujours des pb de mémoire, on désactive le LIGN N° ILMAX,
  191. LIGN=ILIGN(ILMAX)
  192. SEGDES LIGN*(NOMOD,MRU)
  193. C ... puis ce dernier est décrémenté ...
  194. ILMAX=ILMAX-1
  195. IF (ILMAX.EQ.1) CALL ERREUR(5)
  196. C ... et on recommence ...
  197. GOTO 58
  198. C ... On est là si tout s'est bien passé avec SEGACT ...
  199. 57 CONTINUE
  200. NA=IMMM(/1)
  201. IPRELL=IPREL
  202. DO 612 IA=1,NA
  203. IF(IMMM(IA).EQ.0) GOTO 612
  204. IAA=IAA+1
  205. ITRAA(IAA)=IPRELL+IA-1
  206. 612 CONTINUE
  207. IFIB = IVPO(/1)
  208. CALL MONDE2(ITTRV(1),IPPVV(1),VECTBB(1),VAL(1),IVPO(1),
  209. > NA,IPREL,MULRE,INC,IVS,LLOM,IFIB,dnorma)
  210. SEGDES,LIGN*(NOMOD,MRU)
  211. 54 CONTINUE
  212. 55 CONTINUE
  213. C
  214. C ... À cet endroit la descente est finie. L'état des LIGN est le suivant :
  215. C ... Ceux de IDEP à ILMAX sont actifs, les autres (si ILMAX < NNOE) sont désactivés ...
  216. C
  217. C **** DIVISION PAR LE TERME DIAGONAL ****
  218. C
  219. dnorma=0.d0
  220. idenorm=0
  221. DO 120 K=0,MUINC,INC
  222. DO 12 I=1,INC
  223. J=I+K
  224. if (2*abs(diag(i)).gt.abs(diag(i))) goto 122
  225. idenorm=1
  226. 122 continue
  227. VECTBB(J)=VECTBB(J)/DIAG(I)
  228. dnorma=max(dnorma,abs(vectbb(j)))
  229. 12 CONTINUE
  230.  
  231. 120 CONTINUE
  232. dnorma=dnorma*xzprec*xzprec
  233. SEGDES,MDIAG
  234.  
  235. C
  236. C **** MONTEE ****
  237. C
  238. C ... Si la matrice est asymétrique ...
  239. IF(EXISTS) THEN
  240.  
  241. C ... On commence par désactiver les LIGN qui sont restés actifs ...
  242. DO 2000 I=IDEP,ILMAX
  243. LIGN=ILIGN(I)
  244. SEGDES,LIGN*(NOMOD,MRU)
  245. 2000 CONTINUE
  246.  
  247. C ... Puis on désactive MILIGN ...
  248. SEGDES,MILIGN
  249.  
  250. C ... On change de MILIGN ...
  251. MILIGN=IILIGS
  252. SEGACT,MILIGN
  253.  
  254. C ... Et on active des LIGN pointés par ce dernier ...
  255. ILMAX=IDEP-1
  256. DO 2100 I=IDEP,NNOE
  257. LIGN=ILIGN(I)
  258. SEGACT /ERR=2110/ LIGN
  259. ILMAX = I
  260. 2100 CONTINUE
  261. C ... Et on passe à la montée ...
  262. GOTO 3000
  263.  
  264. C ... Si on n'a même pas activé le premier, alors ADIOS ...
  265. 2110 IF(ILMAX.EQ.IDEP-1) CALL ERREUR(5)
  266.  
  267. 3000 CONTINUE
  268. ENDIF
  269.  
  270.  
  271. J=NNOE
  272. C ... Début de la pseudo boucle sur les LIGN qui sont restés désactivés ...
  273. 70 CONTINUE
  274. IF (J.EQ.ILMAX) GOTO 72
  275. LIGN=ILIGN(J)
  276. SEGACT /ERR=68/ LIGN
  277. GO TO 67
  278. C ... Si on a des pb avec activation, on désactive et on diminue ILMAX ...
  279. 68 CONTINUE
  280. LIGN = ILIGN( ILMAX)
  281. SEGDES LIGN*(NOMOD,MRU)
  282. ILMAX=ILMAX-1
  283. IF(ILMAX.EQ.1) CALL ERREUR (5)
  284. C ... puis on recommence la tentative ...
  285. GO TO 70
  286. C ... On a réussi à activer ...
  287. 67 CONTINUE
  288. NA=IMMM(/1)
  289. IPRELL=IPREL
  290. IFIB=IVPO(/1)
  291. CALL MONDE1(IPPVV(1),VECTBB(1),VAL(1),IVPO(1),
  292. > NA,IPREL,MULRE,INC,IFIB,dnorma)
  293. SEGDES,LIGN*(NOMOD,MRU)
  294. J = J-1
  295. GO TO 70
  296. 72 CONTINUE
  297. CC FIN DE PSEUDO BOUCLE J = INC ,ILMAX+1,-1 - Vieux commentaire et Faux !!!
  298. CC FIN DE PSEUDO BOUCLE J = NNOE ,ILMAX+1,-1
  299.  
  300. C ... Dans cette boucle on parcourt les LIGN qui sont restés actifs ...
  301. DO 13 J=ILMAX,IDEP,-1
  302. LIGN=ILIGN(J)
  303. NA=IMMM(/1)
  304. IPRELL=IPREL
  305. IFIB=IVPO(/1)
  306. CALL MONDE1(IPPVV(1),VECTBB(1),VAL(1),IVPO(1),
  307. > NA,IPREL,MULRE,INC,IFIB,dnorma)
  308. SEGDES,LIGN*(NOMOD,MRU)
  309. 13 CONTINUE
  310.  
  311. C ... On n'avait même pas essayé d'activer les IDEP-1 premiers LIGN ...
  312. DO 113 J=IDEP-1,1,-1
  313. LIGN=ILIGN(J)
  314. SEGACT LIGN
  315. NA=IMMM(/1)
  316. IPRELL=IPREL
  317. DO 1131 ILM=1,NA
  318. IF(IMMM(ILM).EQ.0) GO TO 1131
  319. IAA=IAA+1
  320. ITRAA(IAA)=IPRELL+ILM-1
  321. 1131 CONTINUE
  322. IFIB=IVPO(/1)
  323. CALL MONDE1(IPPVV(1),VECTBB(1),VAL(1),IVPO(1),
  324. > NA,IPREL,MULRE,INC,IFIB,dnorma)
  325. SEGDES,LIGN*(NOMOD,MRU)
  326. 113 CONTINUE
  327.  
  328. if (idenorm.eq.1) then
  329. call erreur(1049)
  330. do k=0,muinc,inc
  331. do i=1,inc
  332. vectbb(i+k)=0.d0
  333. enddo
  334. enddo
  335. endif
  336. C
  337. C **** ON VERIFIE QUE PAS DE MODE RIGIDE ACTIVE
  338. C
  339. C ... IAA = nombre de modes d'ensemble (selon les indications dans IMMM) ...
  340. NENS=IAA
  341. NBEN=0
  342. IF(NENS.EQ.0) GO TO 26
  343.  
  344. MINCPO=IINCPO
  345. MIMIK=IIMIK
  346. SEGACT,MINCPO,MIMIK
  347. MELEME=IGEOMA
  348. SEGACT,MELEME
  349. NNOE=INCPO(/2)
  350. IINC1=INCPO(/1)
  351.  
  352. C ... Boucle sur les seconds membres ...
  353. DO 300 KI=0,MUINC,INC
  354. C ... XMA et XMAL seront le maximum des val. abs. des termes
  355. C du résultat partiel (avant la multiplication par MDNOR)
  356. C N° KI+1 multiplié par 1.e-10 ...
  357. XMA=xpetit/xzprec
  358. XMAL=xpetit/xzprec
  359. DO 30 KK=1,INC
  360. I=KK+KI
  361. if (ittr(kk).eq.0) then
  362. XMA=MAX(XMA,ABS(VECTBB(I)))
  363. else
  364. XMAL=MAX(XMAL,ABS(VECTBB(I)))
  365. endif
  366. 30 CONTINUE
  367. XMA=XMA*1.d-10
  368. XMAL=XMAL*1.d-10
  369. xmal=max(xma*1d-2,xmal)
  370. * write (6,*) ' mondes xma xmal ',xma,xmal
  371.  
  372. C ... Boucle sur les modes d'ensemble ...
  373. * write (6,*) ' nombre de modes d ensemble',nens
  374. iwrite = 0
  375. DO 21 IA=1,NENS
  376. I1=ITRAA(IA)
  377. J=IPNO(I1)
  378. DO 22 K=1,IINC1
  379. IF(INCPO(K,J).EQ.I1) GO TO 23
  380. 22 CONTINUE
  381. CALL ERREUR(5)
  382. RETURN
  383.  
  384. 23 CONTINUE
  385. C ... Si ce n'est pas un multiplicateur, le déplacement doit être
  386. C < à XMA, sinon ERREUR ...
  387. * write (6,*) ' mondes i1 ittr vect xma ',
  388. * > i1,ittr(i1),vectbb(i1+ki),xma
  389. IF(ITTR(I1).EQ.0.AND.ABS(VECTBB(I1+KI)).LE.XMA ) then
  390. vectbb(i1+ki)=0.d0
  391. GO TO 20
  392. endif
  393. C ... Si c'est un multiplicateur, le multiplicateur doit être
  394. C < à XMAL sinon ERREUR ...
  395. if (ittr(i1).ne.0) then
  396. i2=ittr(i1)
  397. if (abs(vectbb(i1+ki)+vectbb(i2+ki)).le.xmal) then
  398. vectbb(i1+ki)=0.d0
  399. vectbb(i2+ki)=0.d0
  400. goto 20
  401. endif
  402. endif
  403. * write (6,*) ' ittr vect ',ittr(i1),vectbb(i1+ki),
  404. * > vectbb(i2+ki),xmal
  405.  
  406.  
  407. C ... Si option NOEN on ne fait pas d'erreur, on accumule les pts dans un meleme
  408. C ... Si option NOEN on accumule les pts dans un meleme
  409. IF(NOEN.EQ.0) THEN
  410. nbelem=ipt8.num(/2)+1
  411. segadj ipt8
  412. ipt8.num(1,nbelem)=num(1,j)
  413. ENDIF
  414. NBEN=NBEN+1
  415. MOTERR(1:4)=IMIK(K)
  416. INTERR(1)=NUM(1,J)
  417. IF(NOEN.EQ.0) THEN
  418. GO TO 21
  419. ENDIF
  420. ITY=149
  421. CALL ERREUR(ITY)
  422. RETURN
  423.  
  424. 20 CONTINUE
  425. C ... Messages d'information ...
  426. JJK=NUM(1,J)
  427. KIK=KI/INC +1
  428.  
  429.  
  430. * on n'ecrit qu'une seule fois le message indetermination
  431. IF(ITTR(I1).EQ.0 .AND. MULRE.EQ.1.and.iwrite.eq.0) then
  432. if (imik(k).ne.'LX ')
  433. > WRITE(IOIMP,41) JJK,IMIK(K)
  434. iwrite=iwrite+1
  435. endif
  436.  
  437. IF (IIMPI.NE.0.AND. ITTR(I1).NE.0.AND.MULRE.EQ.1) then
  438. WRITE(IOIMP,42) JJK,IMIK(K)
  439. endif
  440.  
  441. IF(ITTR(I1).eq.0 .AND. MULRE.NE.1.and.iwrite.eq.0) then
  442. WRITE(IOIMP,410)KIK,JJK,IMIK(K)
  443. iwrite=iwrite+1
  444. endif
  445. IF (IIMPI.NE.0 .AND. ITTR(I1).NE.0.AND.MULRE.NE.1)
  446. & WRITE(IOIMP,420)KIK,JJK,IMIK(K)
  447.  
  448. 21 CONTINUE
  449.  
  450. 300 CONTINUE
  451.  
  452. 41 FORMAT(' INDETERMINATION DETECTEE AU NOEUD ',I6,' INCONNUE ',
  453. * A4,/,' INDETERMINATION LEVEE PAR LA MISE A ZERO DE ',
  454. * 'LA SUSDITE dans mondes')
  455. 42 FORMAT(' INDETERMINATION ENTRE CONDITIONS IMPOSEES DETECTEE ',
  456. * 'AU NOEUD ',I6,' INCONNUE ',A4,/,' INDETERMINATION LEVEE ',
  457. * 'PAR LA SUPPRESSION DE LA CONDITION REDONDANTE dans mondes')
  458. 410 FORMAT(' VECTEUR NUMERO',I3,' INDETERMINATION DETECTE AU NOEUD '
  459. *,I6,' INCONNUE ',
  460. * A4,/,' INDETERMINATION LEVEE PAR LA MISE A ZERO DE ',
  461. * 'LA SUSDITE dans mondes')
  462. 420 FORMAT(' VECTEUR NUMERO ',I3,/,
  463. * ' INDETERMINATION ENTRE CONDITIONS IMPOSEES DETECTEE ',
  464. * 'AU NOEUD ',I6,' INCONNUE ',A4,/,' INDETERMINATION LEVEE ',
  465. * 'PAR LA SUPPRESSION DE LA CONDITION REDONDANTE dans mondes')
  466.  
  467. SEGDES,MELEME
  468. SEGDES,MINCPO
  469. SEGDES,MIMIK
  470. 26 CONTINUE
  471. if (noen.eq.0) then
  472. * test si nan ou inf dans le resultat
  473. inan = 0
  474. DO 500 KI=0,MUINC,INC
  475. DO 500 KK=1,INC
  476. i = kk + ki
  477. if (abs(vectbb(i)).lt.xgrand) goto 500
  478. inan = inan + 1
  479. vectbb(i)=xgrand
  480. 500 continue
  481. if (inan.ne.0) nben = -inan
  482. endif
  483. * indiquer si besoin le nombre de modes d'ensemble excites
  484. * et le maillage des noeuds freinés
  485. IF (NOEN.EQ.0) then
  486. * write (6,*) ' mondes nben ',nben
  487. CALL ECRENT(NBEN)
  488. call ecrobj('MAILLAGE',ipt8)
  489. segdes ipt8
  490. endif
  491. MDNOR=IDNORM
  492. SEGACT,MDNOR
  493. DO 350 K=0,MUINC,INC
  494. DO 35 I = 1, INC
  495. VECTBB(I+K)=VECTBB(I+K)*DNOR(I)
  496. 35 CONTINUE
  497. * on force l'egalite des multiplicateurs de lagrange
  498. DO 36 I = 1, INC
  499. if (ITTR(I).ne.0) then
  500. * write (6,*) ' dans mondes ',i,ittr(i)
  501. if (vectbb(i+k).eq.0.d0.or.vectbb(ittr(i)+k).eq.0.d0) then
  502. * write (6,*) ' mondes vectbbs ',vectbb(i+k),vectbb(ittr(i)+k)
  503. vectbb(i+k)=0.d0
  504. vectbb(ittr(i)+k)=0.d0
  505. goto 36
  506. endif
  507. vectbb(i+k)=(vectbb(i+k)+vectbb(ittr(i)+k))/2
  508. vectbb(ittr(i)+k)=vectbb(i+k)
  509. endif
  510. 36 CONTINUE
  511. 350 CONTINUE
  512. SEGDES,MDNOR
  513. C ... On ne désactive MDNO1 que dans le cas où il est
  514. C différent de MDNOR ...
  515. IF(IDNORD.GT.0) THEN
  516. SEGDES,MDNO1
  517. ENDIF
  518. SEGDES MMATRI
  519. SEGDES,MILIGN
  520. SEGDES,MVECTD
  521. SEGSUP ITTRV
  522. IF(NE1.NE.0) SEGSUP,ITRAA
  523.  
  524. IF(IIMPI.EQ.3) WRITE(IOIMP,1001) MVECTD
  525. 1001 FORMAT(' SUBROUTINE MONDES : POINTEUR DU VECTEUR EN SORTIE=',I5)
  526.  
  527. CALL OOOMRU(0)
  528. RETURN
  529. END
  530. C
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  

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