/[ascend]/trunk/models/johnpye/fprops/test.c
ViewVC logotype

Contents of /trunk/models/johnpye/fprops/test.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2670 - (show annotations) (download) (as text)
Wed Jan 23 05:58:37 2013 UTC (5 years, 7 months ago) by jpye
File MIME type: text/x-csrc
File size: 15246 byte(s)
Add test of saturation curve convergence for all helmholtz fluids.
1 #include "test.h"
2 #include "fprops.h"
3 #include "sat.h"
4 #include "rundata.h"
5 #include "ideal.h"
6
7 #include <assert.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <math.h>
11
12 #ifdef __WIN32__
13 # include <windows.h>
14 #endif
15
16 void test_init(){
17 #ifdef __WIN32__
18 SetErrorMode(SEM_NOGPFAULTERRORBOX);
19 #endif
20 }
21
22 int helm_run_test_cases(const PureFluid *P, unsigned ntd, const TestData *td, int temp_unit){
23 FpropsError fprops_err = FPROPS_NO_ERROR;
24
25 double rho, T, p, u, h, a, s, cp0, T_adj = 0;
26
27 if(temp_unit=='C')T_adj = 273.15;
28
29 double maxerr = 0;
30 //double se = 0, sse = 0;
31
32 unsigned i;
33 const unsigned n = ntd;
34
35 fprintf(stderr,"Running through %d test points...\n",n);
36
37 //PureFluid *P = ideal_prepare(eos,NULL);
38 /* Checking CP0 values */
39
40 #define CP0_TEMP(T,RHO,DATA, ERROR) ideal_cp(T,RHO,DATA, ERROR)
41 fprintf(stderr,"CP0 TESTS\n");
42 for(i=0; i<n;++i){
43 cp0 = td[i].cp0*1e3;
44 ASSERT_TOL(CP0_TEMP, td[i].T+T_adj, td[i].rho, P->data, &fprops_err, cp0, cp0*1e-6);
45 }
46 #undef CP0_TEMP
47
48 /* Checking pressure values (proves phir_delta) */
49 fprintf(stderr,"PRESSURE TESTS\n");
50 for(i=0; i<n;++i){
51 T = td[i].T+T_adj;
52 rho = td[i].rho;
53 FluidState S1 = fprops_set_Trho(T,rho,P,&fprops_err);
54 p = td[i].p*1e6;
55 ASSERT_PROP(p, S1, &fprops_err, p, p*1e-3);
56 }
57
58 /* checking enthalpy values */
59 fprintf(stderr,"ENTHALPY TESTS\n");
60 //se = 0, sse = 0;
61 for(i=0; i<n;++i){
62 T = td[i].T+T_adj;
63 rho = td[i].rho;
64 FluidState S1 = fprops_set_Trho(T,rho,P,&fprops_err);
65 h = td[i].h*1e3;
66 ASSERT_PROP(h, S1, &fprops_err, h, 1e-4*h);
67 }
68
69 /* Checking internal energy values (proves phi0_tau, phir_tau) */
70 fprintf(stderr,"INTERNAL ENERGY TESTS\n");
71 for(i=0; i<n;++i){
72 T = td[i].T+T_adj;
73 rho = td[i].rho;
74 FluidState S1 = fprops_set_Trho(T,rho,P,&fprops_err);
75 u = td[i].u*1e3;
76 ASSERT_PROP(u, S1, &fprops_err, u, 1e3*u);
77 }
78
79 /* Checking entropy values */
80
81 fprintf(stderr,"ENTROPY TESTS\n");
82 //se = 0, sse = 0;
83 for(i=0; i<n;++i){
84 T = td[i].T+T_adj;
85 rho = td[i].rho;
86 FluidState S1 = fprops_set_Trho(T,rho,P,&fprops_err);
87 s = td[i].s*1e3;
88 ASSERT_PROP(s, S1, &fprops_err, s, 1e-4*s);
89 }
90
91
92 /* Checking helmholtz energy values */
93
94 fprintf(stderr,"HELMHOLTZ ENERGY TESTS\n");
95 for(i=0; i<n;++i){
96 T = td[i].T+T_adj;
97 rho = td[i].rho;
98 FluidState S1 = fprops_set_Trho(T,rho,P,&fprops_err);
99 a = td[i].a*1e3;
100 //fprintf(stderr,"%.20e\t%.20e\t%.20e\n",T,rho,(a - fprops_a(T,rho,fluid)));
101 ASSERT_PROP(a, S1, &fprops_err, a, a*1e-3);
102 }
103
104 /* TRIPLE POINT PROPERTY CALCULATION */
105
106 fprintf(stderr,"\nTRIPLE POINT PROPERTIES\n\n");
107 assert(P->data->T_t != 0);
108 fprintf(stderr,"T_t = %f K\n", P->data->T_t);
109 double pt,rhoft,rhogt;
110 fprops_triple_point(&pt, &rhoft, &rhogt, P, &fprops_err);
111 assert(fprops_err == FPROPS_NO_ERROR);
112 fprintf(stderr,"p_t = %.12e Pa\n", pt);
113 fprintf(stderr,"rhof_t = %.12e kg/m^3\n", rhoft);
114 fprintf(stderr,"rhog_t = %.12e kg/m^3\n\n", rhogt);
115
116 /* Check convergence along saturation curve */
117
118 fprintf(stderr,"SATURATION CURVE CONVERGENCE TEST\n");
119 if(P->data->T_t != 0){
120 double n1 = 200;
121 /* space point linearly in 1/T, cf Sandler 5e fig 7.7-1. */
122 double rT = 1./P->data->T_t;
123 double drT = (1./P->data->T_c - 1./P->data->T_t) / (n1 - 1);
124 fprintf(stderr,"\t%10s\t%10s\t%10s\t%10s\n","T","psat", "rhof", "rhog");
125 for(i = 0; i < n1; i++){
126 T = 1/rT;
127 double psat1, rhof1, rhog1;
128 fprops_sat_T(T, &psat1, &rhof1, &rhog1, P, &fprops_err);
129 assert(fprops_err == FPROPS_NO_ERROR);
130 fprintf(stderr,"\t%10.3f\t%10.3f\t%10.5f\t%10.5f\n",T,psat1, rhof1, rhog1);
131 rT += drT;
132 }
133 }else{
134 fprintf(stderr,"NOT POSSIBLE due to missing T_t\n");
135 }
136 fprintf(stderr,"\n");
137
138 fprintf(stderr,"Tests completed OK (maximum error = %0.5f%%)\n",maxerr);
139 return 0;
140 }
141
142 int helm_check_u(const PureFluid *fluid, unsigned ntd, const TestData *td){
143 //TODO: Use this enum:
144 FpropsError fprops_err = FPROPS_NO_ERROR;
145 unsigned i;
146 double T,rho,u,err,se = 0,sse = 0;
147 unsigned n = ntd;
148 //double tol = 1e-1;
149
150 fprintf(stderr,"INTERNAL ENERGY VALUES\n\n");
151 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\n","T","rho","u","du","%err");
152 for(i=0; i<n;++i){
153 T = td[i].T+273.15;
154 rho = td[i].rho;
155 u = td[i].u*1e3;
156 FluidState S1 = fprops_set_Trho(T,rho,fluid,&fprops_err);
157 err = u - fprops_u(S1,&fprops_err);
158 se += err;
159 sse += err*err;
160 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.6f\n",T,rho,u,err,err/u*100.);
161 }
162 fprintf(stderr,"average error = %.10e\n",se/n);
163 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
164 return 0;
165 }
166
167 int helm_check_s(const PureFluid *fluid, unsigned ntd, const TestData *td){
168 //TODO: Use this enum:
169 FpropsError fprops_err=FPROPS_NO_ERROR;
170 unsigned i;
171 double T,rho,s,err,se = 0,sse = 0;
172 unsigned n = ntd;
173 //double tol = 1e-1;
174
175 fprintf(stderr,"ENTROPY VALUES\n\n");
176 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\n","T","rho","s","ds","%err");
177 for(i=0; i<n;++i){
178 T = td[i].T + 273.15;
179 rho = td[i].rho;
180 s = td[i].s*1e3;
181 FluidState S1 = fprops_set_Trho(T,rho,fluid,&fprops_err);
182 err = s - fprops_s(S1,&fprops_err);
183 se += err;
184 sse += err*err;
185 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.6f\n",T,rho,s,err,err/s*100.);
186 }
187 fprintf(stderr,"average error = %.10e\n",se/n);
188 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
189 return 0;
190 }
191
192 /* check derivatives of p */
193
194 #if 0
195 int helm_check_dpdT_rho(const PureFluid *fluid, unsigned ntd, const TestData *td){
196 //TODO: Use this enum:
197 FpropsError fprops_err=FPROPS_NO_ERROR;
198 unsigned i;
199 double T,rho,p,T1,p1,dpdT,dpdT_est,err,se = 0,sse = 0;
200 unsigned n = ntd;
201 //double tol = 1e-1;
202
203 double dT = 0.0001 /* finite difference in temperature, in K */;
204
205 fprintf(stderr,"(dp/dT)_rho RESULTS\n\n");
206 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\n","T","rho","p","dp/dT","dp/dT est","err","%err");
207 for(i=0; i<n;++i){
208 T = td[i].T + 273.15;
209 rho = td[i].rho;
210 p = fprops_p(T,rho,fluid,&fprops_err);
211 dpdT = fprops_dpdT_rho(T,rho,fluid,&fprops_err);
212 assert(!isinf(dpdT));
213 T1 = T + dT;
214 p1 = fprops_p(T1, rho, fluid,&fprops_err);
215 dpdT_est = (p1 - p)/dT;
216 err = (dpdT_est - dpdT);
217 se += err;
218 sse += err*err;
219 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.2e\n",T,rho,p,dpdT,dpdT_est,err,err/dpdT*100 );
220 }
221 fprintf(stderr,"average error = %.10e\n",se/n);
222 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
223 return 0;
224 }
225
226 int helm_check_dpdrho_T(const PureFluid *fluid, unsigned ntd, const TestData *td){
227 //TODO: Use this enum:
228 FpropsError fprops_err=FPROPS_NO_ERROR;
229 unsigned i;
230 double T,rho,p,rho1,p1,dpdrho,dpdrho_est,err,se = 0,sse = 0;
231 unsigned n = ntd;
232 //TODO: tol unused. Delete?
233 // double tol = 1e-1;
234
235 double drho = 0.0001 /* finite difference in temperature, in K */;
236
237 fprintf(stderr,"(dp/drho)_T RESULTS\n\n");
238 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\n","T","rho","p","dp/drho","dp/drho est","err","%err");
239 for(i=0; i<n;++i){
240 T = td[i].T + 273.15;
241 rho = td[i].rho;
242 p = fprops_p(T,rho,fluid,&fprops_err);
243 dpdrho = fprops_dpdrho_T(T,rho,fluid,&fprops_err);
244 assert(!isinf(dpdrho));
245 rho1 = rho + drho;
246 p1 = fprops_p(T, rho1, fluid,&fprops_err);
247 dpdrho_est = (p1 - p)/drho;
248 err = (dpdrho_est - dpdrho);
249 se += err;
250 sse += err*err;
251 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.6f\n",T,rho,p,dpdrho,dpdrho_est,err,err/dpdrho*100);
252 }
253 fprintf(stderr,"average error = %.10e\n",se/n);
254 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
255 return 0;
256 }
257
258
259 int helm_check_d2pdrho2_T(const PureFluid *fluid, unsigned ntd, const TestData *td){
260 //TODO: Use this enum:
261 FpropsError fprops_err=FPROPS_NO_ERROR;
262 unsigned i;
263 double T,rho,p,dpdrho,rho1,dpdrho1,d2pdrho2,d2pdrho2_est,err,se = 0,sse = 0;
264 unsigned n = ntd;
265 //double tol = 1e-1;
266
267 double drho = 0.0001 /* finite difference in temperature, in K */;
268
269 fprintf(stderr,"\n(d2p/drho2)_T RESULTS\n\n");
270 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\t%12s\n","T","rho","p","dp/drho","d2p/drho2 est","d2p/drho2 calc","err","rel err");
271 for(i=0; i<n;++i){
272 T = td[i].T + 273.15;
273 rho = td[i].rho;
274 p = fprops_p(T,rho,fluid,&fprops_err);
275 dpdrho = fprops_dpdrho_T(T,rho,fluid,&fprops_err);
276 d2pdrho2 = fprops_d2pdrho2_T(T, rho, fluid,&fprops_err);
277 assert(!isinf(d2pdrho2));
278 rho1 = rho + drho;
279 dpdrho1 = fprops_dpdrho_T(T, rho1, fluid,&fprops_err);
280 d2pdrho2_est = (dpdrho1 - dpdrho)/drho;
281 err = (d2pdrho2_est - d2pdrho2);
282 se += err;
283 sse += err*err;
284 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.2e\t%12.3e\n",T,rho,p,dpdrho,d2pdrho2_est,d2pdrho2,err,err/d2pdrho2_est);
285 }
286 fprintf(stderr,"average error = %.10e\n",se/n);
287 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
288 return 0;
289 }
290
291 /* check derivatives of h */
292
293 int helm_check_dhdT_rho(const PureFluid *fluid, unsigned ntd, const TestData *td){
294 //TODO: Use this enum:
295 FpropsError fprops_err=FPROPS_NO_ERROR;
296 unsigned i;
297 double T,rho,h,T1,h1,dhdT,dhdT_est,err,se = 0,sse = 0;
298 unsigned n = ntd;
299 //double tol = 1e-1;
300 double dT = 1e-6 /* finite difference in temperature, in K */;
301
302 fprintf(stderr,"(dh/dT)_rho RESULTS\n\n");
303 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\n","T","rho","h","dh/dT","dh/dT est","err","%err");
304 for(i=0; i<n;++i){
305 T = td[i].T + 273.15;
306 rho = td[i].rho;
307 h = fprops_h(T,rho,fluid,&fprops_err);
308 dhdT = fprops_dhdT_rho(T,rho,fluid,&fprops_err);
309 assert(!isinf(dhdT));
310 T1 = T + dT;
311 h1 = fprops_h(T1, rho, fluid,&fprops_err);
312 dhdT_est = (h1 - h)/dT;
313 err = (dhdT_est - dhdT);
314 se += err;
315 sse += err*err;
316 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.2e\n",T,rho,h,dhdT,dhdT_est,err,err/dhdT*100 );
317 }
318 fprintf(stderr,"average error = %.10e\n",se/n);
319 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
320 return 0;
321 }
322
323
324 int helm_check_dhdrho_T(const PureFluid *fluid, unsigned ntd, const TestData *td){
325 //TODO: Use this enum:
326 FpropsError fprops_err=FPROPS_NO_ERROR;
327 unsigned i;
328 double T,rho,h,rho1,h1,dhdrho,dhdrho_est,err,se = 0,sse = 0;
329 unsigned n = ntd;
330
331 double drho = 1e-6 /* finite difference in temperature, in K */;
332
333 fprintf(stderr,"(dh/drho)_T RESULTS\n\n");
334 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\n","T","rho","h","dh/drho","dh/drho est","err","%err");
335 for(i=0; i<n;++i){
336 T = td[i].T + 273.15;
337 rho = td[i].rho;
338 h = fprops_h(T,rho,fluid,&fprops_err);
339 dhdrho = fprops_dhdrho_T(T,rho,fluid,&fprops_err);
340 assert(!isinf(dhdrho));
341 rho1 = rho + drho;
342 h1 = fprops_h(T, rho1, fluid,&fprops_err);
343 dhdrho_est = (h1 - h)/drho;
344 err = (dhdrho_est - dhdrho);
345 se += err;
346 sse += err*err;
347 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.2e\n",T,rho,h,dhdrho,dhdrho_est,err,err/dhdrho*100 );
348 }
349 fprintf(stderr,"average error = %.10e\n",se/n);
350 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
351 return 0;
352 }
353
354 /* check derivatives of u */
355
356 int helm_check_dudT_rho(const PureFluid *fluid, unsigned ntd, const TestData *td){
357 //TODO: Use this enum:
358 FpropsError fprops_err=FPROPS_NO_ERROR;
359 unsigned i;
360 double T,rho,u,T1,u1,dudT,dudT_est,err,se = 0,sse = 0;
361 unsigned n = ntd;
362
363 double dT = 1e-3 /* finite difference in temperature, in K */;
364
365 fprintf(stderr,"(du/dT)_rho RESULTS\n\n");
366 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\n","T","rho","h","du/dT","du/dT est","err","%err");
367 for(i=0; i<n;++i){
368 T = td[i].T + 273.15;
369 rho = td[i].rho;
370 u = fprops_u(T,rho,fluid,&fprops_err);
371 dudT = fprops_dudT_rho(T,rho,fluid,&fprops_err);
372 assert(!isinf(dudT));
373 T1 = T + dT;
374 u1 = fprops_u(T1, rho, fluid,&fprops_err);
375 dudT_est = (u1 - u)/dT;
376 err = (dudT_est - dudT);
377 se += err;
378 sse += err*err;
379 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.2e\n",T,rho,u,dudT,dudT_est,err,err/dudT*100 );
380 }
381 fprintf(stderr,"average error = %.10e\n",se/n);
382 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
383 return 0;
384 }
385
386
387 int helm_check_dudrho_T(const PureFluid *fluid, unsigned ntd, const TestData *td){
388 //TODO: Use this enum:
389 FpropsError fprops_err=FPROPS_NO_ERROR;
390
391 unsigned i;
392 double T,rho,u,rho1,u1,dudrho,dudrho_est,err,se = 0,sse = 0;
393 unsigned n = ntd;
394 //double tol = 1e-1;
395
396 double drho = 1e-6 /* finite difference in temperature, in K */;
397
398 fprintf(stderr,"(du/drho)_T RESULTS\n\n");
399 fprintf(stderr,"%-18s\t%-18s\t%-18s\t%-18s\t%-18s\t%12s\t%12s\n","T","rho","h","du/drho","du/drho est","err","%err");
400 for(i=0; i<n;++i){
401 T = td[i].T + 273.15;
402 rho = td[i].rho;
403 u = fprops_u(T,rho,fluid,&fprops_err);
404 dudrho = fprops_dudrho_T(T,rho,fluid,&fprops_err);
405 assert(!isinf(dudrho));
406 rho1 = rho + drho;
407 u1 = fprops_u(T, rho1, fluid,&fprops_err);
408 dudrho_est = (u1 - u)/drho;
409 err = (dudrho_est - dudrho);
410 se += err;
411 sse += err*err;
412 fprintf(stderr,"%.12e\t%.12e\t%.12e\t%.12e\t%.12e\t%12.4e\t%12.2e\n",T,rho,u,dudrho,dudrho_est,err,err/dudrho*100 );
413 }
414 fprintf(stderr,"average error = %.10e\n",se/n);
415 fprintf(stderr,"sse - n se^2 = %.3e\n",sse - n*se*se);
416 return 0;
417 }
418
419 #endif
420
421 int helm_calc_offsets(double Tref, double rhoref, double href, double sref, const PureFluid *fluid){
422 //TODO: Use this enum:
423 FpropsError fprops_err=FPROPS_NO_ERROR;
424 FluidState S1 = fprops_set_Trho(Tref,rhoref,fluid,&fprops_err);
425 double h = fprops_h(S1,&fprops_err);
426 double s = fprops_s(S1,&fprops_err);
427
428 fprintf(stderr,"\nH,S REFERENCE STATE CALCULATION\n\n");
429
430 fprintf(stderr,"Tref = %f\n",Tref);
431 fprintf(stderr,"rhoref = %f\n",rhoref);
432 fprintf(stderr,"--> h(Tref,rhoref) = %.14e (wanted %.14e)\n",h, href);
433 fprintf(stderr,"--> s(Tref,rhoref) = %.14e (wanted %.14e)\n",s, sref);
434
435 double m_new = fluid->data->cp0->m + (href - h)/fluid->data->R/fluid->data->corr.helm->T_star;
436
437 double c_new = fluid->data->cp0->c - (sref - s)/fluid->data->R;
438
439 fprintf(stderr,"c_new = %.20e\n",c_new);
440 fprintf(stderr,"m_new = %.20e\n\n",m_new);
441
442 return 0;
443 }
444
445
446
447 int helm_run_saturation_tests(const PureFluid *fluid, unsigned nsd, const TestDataSat *td, int temp_unit){
448 //TODO: Use this enum:
449 FpropsError fprops_err=FPROPS_NO_ERROR;
450 double T, p, rhof, rhog, hf, hg, sf, sg, T_adj = 0;
451 if(temp_unit=='C')T_adj = 273.15;
452
453 double maxerr = 0;
454
455 unsigned i;
456 const unsigned n = nsd;
457
458 fprintf(stderr,"\nSATURATION TESTS\n\n");
459
460 fprintf(stderr,"Running through %d saturation-region points...\n",n);
461 double tol = 1e5;
462 for(i=0; i<n;++i){
463 T = td[i].T+T_adj;
464 //TODO: res unused. Delete?
465 fprops_sat_T(T, &p, &rhof, &rhog, fluid, &fprops_err);
466 assert(FPROPS_NO_ERROR == fprops_err);
467 double p_tab = td[i].p*1e6;
468 ASSERT_TOL_VAL(p,p_tab,p_tab*tol);
469 double rhof_tab = td[i].rhof;
470 ASSERT_TOL_VAL(rhof,rhof_tab,rhof_tab*tol);
471 double rhog_tab = td[i].rhog;
472 ASSERT_TOL_VAL(rhog,rhog_tab,rhog_tab*tol);
473 hf = td[i].hf*1e3;
474 FluidState Sf = fprops_set_Trho(T,rhof,fluid,&fprops_err);
475 FluidState Sg = fprops_set_Trho(T,rhog,fluid,&fprops_err);
476 ASSERT_PROP(h,Sf, &fprops_err, hf, hf*tol);
477 hg = td[i].hg*1e3;
478 ASSERT_PROP(h,Sg, &fprops_err, hg, hg*tol);
479 sf = td[i].sf*1e3;
480 ASSERT_PROP(s,Sf, &fprops_err, sf, sf*tol);
481 sg = td[i].sg*1e3;
482 ASSERT_PROP(s,Sg, &fprops_err, sg, sg*tol);
483 }
484
485 fprintf(stderr,"Tests completed OK (maximum error = %0.5f%%)\n",maxerr);
486 return 0;
487 }
488

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22