#define _XOPEN_SOURCE #define PRAG 0.6 #define KOLNAZ 30 #include #include #include #include #include #include #include struct meritev { int t_alpha; /* milisekunde */ long double F_m; long double h_alpha; long double F_alpha; long double V_alpha; /* litri */ long double F_g; long double F_teor; }; struct poskus { int id; struct tm cas; struct meritev meritev[256]; /* maks 256 meritev */ int meritevn; long double t_m; /* milisekunde */ long double F_alpha_avg; long double a_k; int P_0; long double V_0; long double t_0; /* čas, ko je prvič F_m > PRAG N */ long double F_alpha_max; }; long double /* liter */ h2v (long double /* meter */ x) { if (x > 0.245) return 1; if (x < 0.055) return 0; return 0.106 + (1000*(0.001459010809 /* r^2 */ * 3.14159265 * (x - 0.055))); } int main (int argc, char ** argv) { DIR /* * videod, */ * vagad; struct dirent * dir; struct poskus poskus[256]; /* maks 256 poskusov */ int i = 0; /* videod = opendir("../podatki-video"); */ vagad = opendir("../podatki-vaga"); if (/* !videod || */ !vagad) { fprintf(stderr, "ni uspelo odpreti direktorija!\n"); /* closedir(videod); */ closedir(vagad); return 1; } fprintf(stderr, "berem direktorij ... \n"); while ((dir = readdir(vagad)) != NULL) { strptime(dir->d_name, "%m%d%H%M", &poskus[i].cas); sscanf(dir->d_name, "%d-%LfL-%dbar", &poskus[i].id, &poskus[i].V_0, &poskus[i].P_0); char videofn[256], vagafn[256], buf[256], outfn[256]; snprintf(videofn, 256, "../podatki-video/za-%08d.csv", poskus[i].id); snprintf(vagafn, 256, "../podatki-vaga/%s", dir->d_name); if (strstr(dir->d_name, "slabfilm") || strstr(dir->d_name, "brezfilma") || dir->d_name[3] == '0') continue; FILE * vagaf = fopen(vagafn, "r"); FILE * videof = fopen(videofn, "r"); if (!vagaf || !videof) { fprintf(stderr, "ni uspelo odpreti %s ali %s\n", vagafn, videofn); if (vagaf) fclose(vagaf); if (videof) fclose(videof); continue; } int t0; long double ldbuf; char * cp; fgets(buf, 256, vagaf); poskus[i].meritevn = 0; poskus[i].F_alpha_max = 0; while (!feof(vagaf)) { #define nmer poskus[i].meritev[poskus[i].meritevn] ldbuf = strtold(buf, &cp); if (!poskus[i].meritevn) t0 = ldbuf; nmer.t_alpha = ldbuf - t0; cp++; ldbuf = strtold(cp, &cp); nmer.F_m = ldbuf*9.81; nmer.F_alpha = -1; nmer.F_teor = -1; fgets(buf, 256, vagaf); poskus[i].meritevn++; } fgets(buf, 256, videof); while (!feof(videof)) { ldbuf = strtold(buf, &cp); ldbuf = (ldbuf*1000); int j = 0; #define omer poskus[i].meritev[j] for (j = 0; j < poskus[i].meritevn - 1; j++) if (poskus[i].meritev[j].t_alpha <= ldbuf && poskus[i].meritev[j+1].t_alpha > ldbuf) break; cp++; omer.h_alpha = strtold(cp, &cp); omer.V_alpha = h2v(omer.h_alpha); omer.F_g = 0.0005*9.81 /* teža plastenke */ + omer.V_alpha*9.81 /* teža vode */; omer.F_alpha = omer.F_m > PRAG ? omer.F_m + omer.F_g : 0; if (omer.F_alpha > poskus[i].F_alpha_max) poskus[i].F_alpha_max = omer.F_alpha; omer.F_teor = poskus[i].P_0*20000*pow((poskus[i].P_0*20000*((poskus[i].V_0+(poskus[i].V_0+0.005)*1)/poskus[i].V_0)), -1.4); omer.F_teor = 1*3.141592*0.000016*(omer.F_teor-10000); fgets(buf, 256, videof); } int intbuf = -1; poskus[i].t_0 = 0; for (int j = 0; j < poskus[i].meritevn; j++) { if (intbuf != -1 && poskus[i].meritev[j].F_m < PRAG) { poskus[i].t_m = poskus[i].meritev[j].t_alpha - poskus[i].meritev[intbuf].t_alpha; poskus[i].F_alpha_avg = 0; for (int k = intbuf; k <= j; k++) { poskus[i].F_alpha_avg += poskus[i].meritev[k].F_alpha; } poskus[i].F_alpha_avg /= ((j-intbuf)+1) ? (j-intbuf)+1 : fprintf(stderr, "deljenje z nič pri %s\n", vagafn); } if (poskus[i].meritev[j].F_m > PRAG) { intbuf /* pričetek intervala */ = j ? j - KOLNAZ : j; poskus[i].t_0 = poskus[i].meritev[j].t_alpha; } if (poskus[i].meritev[j].F_alpha == -1) { poskus[i].meritev[j].F_alpha = poskus[i].meritev[j].F_m - 0.0005*9.81; poskus[i].meritev[j].F_g = 0.0005*9.81; } } poskus[i].a_k = 0; for (int j = 0; j < poskus[i].meritevn; j++) /* poor man's integral function */ poskus[i].a_k += poskus[i].meritev[j].F_alpha/(poskus[i].meritev[j].F_g/9.81); for (int odmislimo = 0; odmislimo < 2; odmislimo ++) { snprintf(outfn, 256, "%08d-%.1LfL-%dbar%s.csv", poskus[i].id, poskus[i].V_0, poskus[i].P_0, odmislimo ? "-odmislimo" : ""); FILE * outf = fopen(outfn, "w"); if (!outf) { fprintf(stderr, "ni uspelo odpreti za pisanje datoteke %s\n", outfn); continue; } t0 = -1; for (int j = 0; j < poskus[i].meritevn; j++) { if (poskus[i].meritev[j].F_m >= PRAG || (!odmislimo && (t0 != -1 && poskus[i].meritev[j].V_alpha > 0))) { if (t0 == -1) t0 = poskus[i].meritev[j].t_alpha; fprintf(outf, "%d,%Lf,%Lf,%Lf,%Lf,%Lf,%Lf,%d\n", poskus[i].meritev[j].t_alpha - t0, poskus[i].meritev[j].F_m, poskus[i].meritev[j].h_alpha, poskus[i].meritev[j].F_alpha, poskus[i].meritev[j].V_alpha, poskus[i].meritev[j].F_g, poskus[i].meritev[j].F_teor, poskus[i].meritev[j].t_alpha ); /* else fprintf(outf, "%d,,,,,,,\n", poskus[i].meritev[j].t_alpha); */ } } fclose(outf); } fclose(vagaf); fclose(videof); fprintf(stdout, "%d,%.1Lf,%d,%Lf,%Lf,%Lf,%Lf\n", poskus[i].id, poskus[i].V_0, poskus[i].P_0, poskus[i].a_k, poskus[i].t_m, poskus[i].F_alpha_avg, poskus[i].F_alpha_max); i++; } /* closedir(videod); */ closedir(vagad); }