1 : C ZLAP1C SOURCE MAGN 09/07/30 21:23:39 6458
2 : SUBROUTINE ZLAP1C(PROPHY,PROPH2,MPROC,MPTEMC,
3 : $ MPVOLU,MPNORM,MPSURF,MELEFL,
4 : $ KRFACE,KRCENT,
5 : $ LCLIMR,KRRIMP,MPRIMP,
6 : $ LCLIMT,KRTIMP,MPTIMP,
7 : $ NOMINC,
8 : $ IJACO,
9 : $ IMPR,IRET)
10 : IMPLICIT INTEGER(I-N)
11 : IMPLICIT REAL*8 (A-H,O-Z)
12 : C***********************************************************************
13 : C NOM : ZLAP1C
14 : C DESCRIPTION : Calcul de la matrice jacobienne du résidu du laplacien
15 : C VF 2D (termes multi-espèces).
16 : C Ici, on ne calcule que les contributions à la matrice
17 : C jacobienne faisant intervenir les coefficients pour le
18 : C calcul des gradients de Yk
19 : C (contributions à d Res_{\rho e_t} / d var
20 : C var prenant successivement les valeurs :
21 : C \rho, \rho Yk)
22 : C
23 : C
24 : C
25 : C
26 : C LANGAGE : ESOPE
27 : C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
28 : C mél : gounand@semt2.smts.cea.fr
29 : C***********************************************************************
30 : C APPELES (UTIL) : AJMTK : ajoute un objet de type MATSIM (non
31 : C standard) à un objet de type MATRIK.
32 : C APPELE PAR : ZLAP1A : Calcul de la matrice jacobienne du
33 : C résidu du laplacien VF 2D.
34 : C***********************************************************************
35 : C ENTREES : PROPHY (type PROPHY) : propriétés des espèces
36 : C PROPH2 (type PROPH2) : précond. de PROPHY
37 : C MPROC (type MPOVAL) : masse volumique par
38 : C élément.
39 : C MPVOLU (type MPOVAL) : volume des éléments.
40 : C MPNORM (type MPOVAL) : normale aux faces.
41 : C MPSURF (type MPOVAL) : surface des faces.
42 : C MELEFL (type MELEME) : connectivités face-(centre
43 : C gauche, centre droit).
44 : C KRFACE (type MLENTI) : tableau de repérage dans
45 : C le maillage des faces des éléments.
46 : C KRCENT (type MLENTI) : tableau de repérage dans
47 : C le maillage des centres des éléments.
48 : C NOMINC (type MLMOTS) : noms des inconnues.
49 : C LCLIMR (type logique) : .TRUE. => CL de Dirichlet
50 : C sur la densité.
51 : C KRRIMP (type MLENTI) : tableau de repérage dans
52 : C maillage des CL de Dirichlet sur la densité.
53 : C MPRIMP (type MPOVAL) : valeurs des CL de
54 : C Dirichlet sur la densité.
55 : C LCLIMT (type logique) : .TRUE. => CL de Dirichlet
56 : C sur la température.
57 : C KRTIMP (type MLENTI) : tableau de repérage dans
58 : C maillage des CL de Dirichlet sur la température.
59 : C MPTIMP (type MPOVAL) : valeurs des CL de
60 : C Dirichlet sur la température.
61 : C ENTREES/SORTIES : IJACO (type MATRIK) : matrice jacobienne du
62 : C résidu du laplacien VF 2D.
63 : C SORTIES : -
64 : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
65 : C***********************************************************************
66 : C VERSION : v1, 25/02/2002, version initiale
67 : C HISTORIQUE : v1, 25/02/2002, création
68 : C HISTORIQUE :
69 : C HISTORIQUE :
70 : C***********************************************************************
71 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
72 : C en cas de modification de ce sous-programme afin de faciliter
73 : C la maintenance !
74 : C***********************************************************************
75 : -INC CCOPTIO
76 : -INC SMCOORD
77 : -INC SMCHPOI
78 : POINTEUR MPDKC.MPOVAL,MPDNC.MPOVAL
79 : POINTEUR MPROC.MPOVAL,MPTEMC.MPOVAL,MPYKC.MPOVAL
80 : POINTEUR MPRIMP.MPOVAL,MPTIMP.MPOVAL
81 : POINTEUR MPSURF.MPOVAL,MPNORM.MPOVAL,MPVOLU.MPOVAL
82 : -INC SMCHAML
83 : POINTEUR ICOGRY.MCHELM,JCOGRY.MCHAML
84 : POINTEUR KDYKDX.MELVAL,KDYKDY.MELVAL
85 : -INC SMELEME
86 : POINTEUR MELEFL.MELEME
87 : POINTEUR MCOGRY.MELEME
88 : -INC SMLENTI
89 : POINTEUR KRYIMP.MLENTI,KRRIMP.MLENTI,KRTIMP.MLENTI
90 : POINTEUR KRCENT.MLENTI,KRFACE.MLENTI
91 : -INC SMLMOTS
92 : POINTEUR NOMINC.MLMOTS
93 : -INC SMMATRIK
94 : POINTEUR IJACO.MATRIK
95 : INTEGER NESP,IESP
96 : SEGMENT PROPHY
97 : CHARACTER*4 NOMESP(NESP+1)
98 : REAL*8 CV(NESP+1)
99 : REAL*8 R(NESP+1)
100 : REAL*8 H0K(NESP+1)
101 : POINTEUR CDIFF(NESP+1).MCHPOI
102 : POINTEUR YK(NESP+1).MCHPOI
103 : POINTEUR GRADYK(NESP+1).MCHPOI
104 : POINTEUR CGRYK(NESP+1).MCHELM
105 : POINTEUR CLYK(NESP+1).MCHPOI
106 : ENDSEGMENT
107 : SEGMENT PROPH2
108 : POINTEUR MPDIFF(NESP+1).MPOVAL
109 : POINTEUR MPVALY(NESP+1).MPOVAL
110 : POINTEUR MPGRAD(NESP+1).MPOVAL
111 : LOGICAL LCLIM(NESP+1)
112 : POINTEUR KRCLIM(NESP+1).MLENTI
113 : ENDSEGMENT
114 : *
115 : * Objet matrice élémentaire simplifié
116 : *
117 : SEGMENT GMATSI
118 : INTEGER POIPR1(NPP1,NEL1)
119 : INTEGER POIDU1(1,NEL1)
120 : INTEGER POIPR2(NPP2,NEL2)
121 : INTEGER POIDU2(2,NEL2)
122 : POINTEUR LMATSI(0).MATSIM
123 : ENDSEGMENT
124 : * Contributions de la part du gradient de YK (CTGRY)
125 : POINTEUR CTGRY.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 RETRYK.MATSIM
133 : *
134 : REAL*8 DKG,DKD,DKF,DNG,DND,DNF
135 : REAL*8 RHOG,RHOD,RHOF
136 : REAL*8 TEMG,TEMD,TEMF
137 : *
138 : INTEGER IMPR,IRET
139 : *
140 : LOGICAL LCLIMY,LCLIMT,LCLIMR
141 : LOGICAL LMUR
142 : LOGICAL LCTRB2
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,NLCLY,NLFRI,NLFTI
148 : INTEGER NPTEL
149 : *
150 : REAL*8 BETAX,BETAY,CNX,CNY
151 : REAL*8 SIGNOR,SURFFA,VOLUEL
152 : REAL*8 RHOP,YKP
153 : REAL*8 CPK,HKF,CPN,HNF
154 : REAL*8 FACTOR
155 : REAL*8 DYKDRO,DYKDRY
156 : *
157 : INTEGER ICOORX,NLCGAU,NLCDRO
158 : REAL*8 XF,YF,XG,YG,XFMXG,YFMYG,DRG
159 : & ,XD,YD,XFMXD,YFMYD,DRD,ALPHA,UMALPH
160 : C
161 : *
162 : * Executable statements
163 : *
164 : IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans zlap1c.eso'
165 : SEGACT PROPHY
166 : NESP=PROPHY.CV(/1)-1
167 : SEGACT PROPH2
168 : MPDNC=PROPH2.MPDIFF(NESP+1)
169 : SEGACT MPDNC
170 : DO IESP=1,NESP
171 : IF (LCLIMR) THEN
172 : SEGACT KRRIMP
173 : SEGACT MPRIMP
174 : ENDIF
175 : IF (LCLIMT) THEN
176 : SEGACT KRTIMP
177 : SEGACT MPTIMP
178 : ENDIF
179 : LCLIMY=PROPH2.LCLIM(IESP)
180 : IF (LCLIMY) THEN
181 : KRYIMP=PROPH2.KRCLIM(IESP)
182 : SEGACT KRYIMP
183 : ENDIF
184 : SEGACT NOMINC
185 : SEGACT KRCENT
186 : SEGACT KRFACE
187 : SEGACT MELEFL
188 : SEGACT MPSURF
189 : SEGACT MPNORM
190 : SEGACT MPVOLU
191 : MPDKC=PROPH2.MPDIFF(IESP)
192 : SEGACT MPDKC
193 : SEGACT MPROC
194 : SEGACT MPTEMC
195 : MPYKC=PROPH2.MPVALY(IESP)
196 : SEGACT MPYKC
197 : ICOGRY=PROPHY.CGRYK(IESP)
198 : SEGACT ICOGRY
199 : NSOUCH=ICOGRY.IMACHE(/1)
200 : DO 1 ISOUCH=1,NSOUCH
201 : MCOGRY=ICOGRY.IMACHE(ISOUCH)
202 : JCOGRY=ICOGRY.ICHAML(ISOUCH)
203 : SEGACT JCOGRY
204 : KDYKDX=JCOGRY.IELVAL(1)
205 : KDYKDY=JCOGRY.IELVAL(2)
206 : SEGDES JCOGRY
207 : SEGACT KDYKDX
208 : SEGACT KDYKDY
209 : SEGACT MCOGRY
210 : NELEM=MCOGRY.NUM(/2)
211 : NPTEL=MCOGRY.NUM(/1)
212 : NPP1=NPTEL-1
213 : NPP2=NPTEL-1
214 : NEL1=NELEM
215 : NEL2=NELEM
216 : IEL1=1
217 : IEL2=1
218 : SEGINI RETRHO
219 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
220 : SEGINI RETRYK
221 : ENDIF
222 : SEGINI CTGRY
223 : RETRHO.NOMPRI(1:4)=NOMINC.MOTS(1)
224 : RETRHO.NOMPRI(5:8)=' '
225 : RETRHO.NOMDUA(1:4)=NOMINC.MOTS(IDIM+2)
226 : RETRHO.NOMDUA(5:8)=' '
227 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
228 : RETRYK.NOMPRI(1:4)=NOMINC.MOTS(IDIM+2+IESP)
229 : RETRYK.NOMPRI(5:8)=' '
230 : RETRYK.NOMDUA(1:4)=NOMINC.MOTS(IDIM+2)
231 : RETRYK.NOMDUA(5:8)=' '
232 : ENDIF
233 : DO 12 IELEM=1,NELEM
234 : * Le premier point du support de ICOGRY est un point FACE
235 : NGFACE=MCOGRY.NUM(1,IELEM)
236 : NLFACE=KRFACE.LECT(NGFACE)
237 : IF (NLFACE.EQ.0) THEN
238 : WRITE(IOIMP,*) 'Erreur de programmation n°1'
239 : GOTO 9999
240 : ENDIF
241 : * On calcule la contribution à la matrice jacobienne IJACO de la face
242 : * NGFAC (points duaux : centres à gauche et à droite de la face)
243 : * (points primaux : une partie (bicoz conditions aux limites)
244 : * de ceux du stencil pour le calcul du gradient
245 : * à la face, ils doivent être des points centres)
246 : * Si le flux de chaleur sur la face est imposé par les conditions
247 : * aux limites, la contribution de la face à IJACO est nulle.
248 : NGCGAU=MELEFL.NUM(1,NLFACE)
249 : NGCDRO=MELEFL.NUM(3,NLFACE)
250 : NLCGAU=KRCENT.LECT(NGCGAU)
251 : NLCDRO=KRCENT.LECT(NGCDRO)
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 : ICOORX = ((IDIM + 1) * (NGFACE - 1))+1
258 : XF = MCOORD.XCOOR(ICOORX)
259 : YF = MCOORD.XCOOR(ICOORX+1)
260 : ICOORX = ((IDIM + 1) * (NGCGAU - 1))+1
261 : XG = MCOORD.XCOOR(ICOORX)
262 : YG = MCOORD.XCOOR(ICOORX+1)
263 : XFMXG = XF - XG
264 : YFMYG = YF - YG
265 : DRG=SQRT((XFMXG*XFMXG)+(YFMYG*YFMYG))
266 : ICOORX = ((IDIM + 1) * (NGCDRO - 1))+1
267 : XD = MCOORD.XCOOR(ICOORX)
268 : YD = MCOORD.XCOOR(ICOORX+1)
269 : XFMXD = XF - XD
270 : YFMYD = YF - YD
271 : DRD=SQRT((XFMXD*XFMXD)+(YFMYD*YFMYD))
272 : ALPHA=DRG/(DRG+DRD)
273 : UMALPH= 1.0D0 - ALPHA
274 : ELSE
275 : NPD=1
276 : ALPHA=0.0D0
277 : UMALPH=1.0D0
278 : ENDIF
279 : IF (LCLIMR) THEN
280 : NLFRI=KRRIMP.LECT(NGFACE)
281 : ELSE
282 : NLFRI=0
283 : ENDIF
284 : IF (NLFRI.GT.0) THEN
285 : RHOF=MPRIMP.VPOCHA(NLFRI,1)
286 : ELSE
287 : RHOG = MPROC.VPOCHA(NLCGAU,1)
288 : RHOD = MPROC.VPOCHA(NLCDRO,1)
289 : RHOF = UMALPH * RHOG + ALPHA * RHOD
290 : ENDIF
291 : IF (LCLIMT) THEN
292 : NLFTI=KRTIMP.LECT(NGFACE)
293 : ELSE
294 : NLFTI=0
295 : ENDIF
296 : IF (NLFTI.GT.0) THEN
297 : TEMF=MPTIMP.VPOCHA(NLFTI,1)
298 : ELSE
299 : TEMG = MPTEMC.VPOCHA(NLCGAU,1)
300 : TEMD = MPTEMC.VPOCHA(NLCDRO,1)
301 : TEMF = UMALPH * TEMG + ALPHA * TEMD
302 : ENDIF
303 : DKG = MPDKC.VPOCHA(NLCGAU,1)
304 : DKD = MPDKC.VPOCHA(NLCDRO,1)
305 : DKF = UMALPH * DKG + ALPHA * DKD
306 : DNG = MPDNC.VPOCHA(NLCGAU,1)
307 : DND = MPDNC.VPOCHA(NLCDRO,1)
308 : DNF = UMALPH * DNG + ALPHA * DND
309 : NPP=NPTEL-1
310 : * IPD=1 : point à gauche du point NGFACE
311 : * IPD=2 : point à droite du point NGFACE
312 : DO 122 IPD=1,NPD
313 : NPDUAL=MELEFL.NUM((2*IPD)-1,NLFACE)
314 : IF (.NOT.LMUR) THEN
315 : CTGRY.POIDU2(IPD,IEL2)=NPDUAL
316 : ELSE
317 : CTGRY.POIDU1(IPD,IEL1)=NPDUAL
318 : ENDIF
319 : NLCEND=KRCENT.LECT(NPDUAL)
320 : IF (NLCEND.EQ.0) THEN
321 : WRITE(IOIMP,*) 'Erreur grave n°1'
322 : GOTO 9999
323 : ENDIF
324 : DO 124 IPP=1,NPP
325 : NPPRIM=MCOGRY.NUM(IPP+1,IELEM)
326 : LCTRB2=.TRUE.
327 : IF (LCLIMY) THEN
328 : NLCLY=KRYIMP.LECT(NPPRIM)
329 : IF (NLCLY.NE.0) THEN
330 : LCTRB2=.FALSE.
331 : ENDIF
332 : ENDIF
333 : IF (.NOT.LCTRB2) THEN
334 : * Lorsque une contribution est nulle, on fixe artificiellement le
335 : * point primal égal au point dual.
336 : IF (.NOT.LMUR) THEN
337 : CTGRY.POIPR2(IPP,IEL2)=NPDUAL
338 : RETRHO.VALMA2(IPD,IPP,IEL2)=0.D0
339 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
340 : RETRYK.VALMA2(IPD,IPP,IEL2)=0.D0
341 : ENDIF
342 : ELSE
343 : CTGRY.POIPR1(IPP,IEL1)=NPDUAL
344 : RETRHO.VALMA1(IPD,IPP,IEL1)=0.D0
345 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
346 : RETRYK.VALMA1(IPD,IPP,IEL1)=0.D0
347 : ENDIF
348 : ENDIF
349 : ELSE
350 : * Les contributions valent :
351 : * (d Res_{\rho Yk})_d / (d var)_p =
352 : * +/-1 (normale sortante, rentrante) (1/V_d) * (S_f) * \rho_f * Dk_f
353 : * * [ ((n_x * \beta_x) +(n_y * \beta_y)) *
354 : * ((dYk)_p / (d var)_p)]
355 : * avec :
356 : * (dYk)_p / (d \rho)_p = - Yk_p / \rho_p
357 : * (dYk)_p / (d \rho Yk)_p = 1 / \rho_p
358 : * \beta_x : coefficients pour le calcul de dYk/dx
359 : * \beta_y : coefficients pour le calcul de dYk/dy
360 : *
361 : NLCENP=KRCENT.LECT(NPPRIM)
362 : IF (NLCENP.EQ.0) THEN
363 : WRITE(IOIMP,*) 'Erreur grave n°2'
364 : GOTO 9999
365 : ENDIF
366 : * normale sortante pour IPD=1, rentrante pour IPD=2
367 : SIGNOR=(-1.D0)**(IPD+1)
368 : VOLUEL=MPVOLU.VPOCHA(NLCEND,1)
369 : SURFFA=MPSURF.VPOCHA(NLFACE,1)
370 : CNX =MPNORM.VPOCHA(NLFACE,1)
371 : CNY =MPNORM.VPOCHA(NLFACE,2)
372 : BETAX =KDYKDX.VELCHE(IPP+1,IELEM)
373 : BETAY =KDYKDY.VELCHE(IPP+1,IELEM)
374 : RHOP =MPROC.VPOCHA(NLCENP,1)
375 : YKP =MPYKC.VPOCHA(NLCENP,1)
376 : * YKP =MPYKC.VPOCHA(NLCEND,1)
377 : CPK=PROPHY.CV(IESP)+PROPHY.R(IESP)
378 : CPN=PROPHY.CV(NESP+1)+PROPHY.R(NESP+1)
379 : HKF=(CPK*TEMF)+PROPHY.H0K(IESP)
380 : HNF=(CPN*TEMF)+PROPHY.H0K(NESP+1)
381 : FACTOR=SIGNOR*(1.D0/VOLUEL)*SURFFA*RHOF*
382 : $ ((HKF*DKF)-(HNF*DNF))
383 : $ *((CNX*BETAX)+(CNY*BETAY))
384 : DYKDRO=-YKP/RHOP
385 : DYKDRY=1.D0/RHOP
386 : C IF((NGCGAU.EQ.30).AND.(NGCDRO.EQ.30)) THEN
387 : C WRITE(IOIMP,*) 'NGFACE=',NGFACE
388 : C WRITE(IOIMP,*) 'NGCGAU=',NGCGAU
389 : C WRITE(IOIMP,*) 'NGCDRO=',NGCDRO
390 : C WRITE(IOIMP,*) 'IESP=',IESP
391 : C WRITE(IOIMP,*) 'JACO(RETRYK)=',
392 : C $ (FACTOR*DYKDRY)
393 : C ENDIF
394 : IF (.NOT.LMUR) THEN
395 : CTGRY.POIPR2(IPP,IEL2)=NPPRIM
396 : RETRHO.VALMA2(IPD,IPP,IEL2)=FACTOR*DYKDRO
397 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
398 : RETRYK.VALMA2(IPD,IPP,IEL2)=FACTOR*DYKDRY
399 : ENDIF
400 : ELSE
401 : CTGRY.POIPR1(IPP,IEL1)=NPPRIM
402 : RETRHO.VALMA1(IPD,IPP,IEL1)=FACTOR*DYKDRO
403 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
404 : RETRYK.VALMA1(IPD,IPP,IEL1)=FACTOR*DYKDRY
405 : ENDIF
406 : ENDIF
407 : ENDIF
408 : 124 CONTINUE
409 : 122 CONTINUE
410 : IF (.NOT.LMUR) THEN
411 : IEL2=IEL2+1
412 : ELSE
413 : IEL1=IEL1+1
414 : ENDIF
415 : 12 CONTINUE
416 : NPP1=NPTEL-1
417 : NPP2=NPTEL-1
418 : NEL1=IEL1-1
419 : NEL2=IEL2-1
420 : SEGADJ RETRHO
421 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
422 : SEGADJ RETRYK
423 : ENDIF
424 : SEGADJ CTGRY
425 : CTGRY.LMATSI(**)=RETRHO
426 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
427 : CTGRY.LMATSI(**)=RETRYK
428 : ENDIF
429 : * On accumule les matrices résultantes dans IJACO
429 : CALL AJMTK(CTGRY,IJACO,IMPR,IRET)
430 : IF (IRET.NE.0) GOTO 9999
431 : SEGSUP RETRHO
432 : IF ((IESP.GE.1).AND.(IESP.LE.NESP)) THEN
433 : SEGSUP RETRYK
434 : ENDIF
435 : SEGSUP CTGRY
436 : *
437 : SEGDES MCOGRY
438 : SEGDES KDYKDY
439 : SEGDES KDYKDX
440 : 1 CONTINUE
441 : SEGDES ICOGRY
442 : SEGDES MPYKC
443 : SEGDES MPTEMC
444 : SEGDES MPROC
445 : SEGDES MPDKC
446 : SEGDES MPVOLU
447 : SEGDES MPNORM
448 : SEGDES MPSURF
449 : SEGDES MELEFL
450 : SEGDES KRFACE
451 : SEGDES KRCENT
452 : SEGDES NOMINC
453 : IF (LCLIMY) THEN
454 : SEGDES KRYIMP
455 : ENDIF
456 : IF (LCLIMT) THEN
457 : SEGDES KRTIMP
458 : SEGDES MPTIMP
459 : ENDIF
460 : IF (LCLIMR) THEN
461 : SEGDES KRRIMP
462 : SEGDES MPRIMP
463 : ENDIF
464 : ENDDO
465 : SEGDES MPDNC
466 : SEGDES PROPH2
467 : SEGDES PROPHY
468 : *
469 : * Normal termination
470 : *
471 : IRET=0
472 : RETURN
473 : *
474 : * Format handling
475 : *
476 : *
477 : * Error handling
478 : *
479 : 9999 CONTINUE
480 : IRET=1
481 : WRITE(IOIMP,*) 'An error was detected in subroutine zlap1c'
482 : RETURN
483 : *
484 : * End of subroutine ZLAP1C
485 : *
486 : END
487 :
488 :
489 :
490 :
491 :
492 :
493 :
494 :
© Cast3M 2003 - All rights reserved.
Disclaimer