main(int argc, char **argv) { Compressor::SetErrMsgFilePtr(stderr); int bx = 64; int by = 64; int bz = 64; int nx = 512; int ny = 512; int nz = 512; string wname("bior3.3"); string mode("symh"); bool swapbytes = false; argv++; vector <string> myargv; while (*argv) { int rc; string arg(*argv); if (arg.compare("-dim") == 0) { argv++; assert(*argv); rc = sscanf(*argv, "%dx%dx%d", &nx, &ny, &nz); assert(rc==3); } else if (arg.compare("-bs") == 0) { argv++; assert(*argv); rc = sscanf(*argv, "%dx%dx%d", &bx, &by, &bz); assert(rc==3); } else if (arg.compare("-wname") == 0) { argv++; assert(*argv); wname.assign(*argv); } else if (arg.compare("-mode") == 0) { argv++; assert(*argv); mode.assign(*argv); } else if (arg.compare("-swapbytes") == 0) { swapbytes = true; } else { myargv.push_back(*argv); } argv++; } assert(myargv.size() >= 3); string srcfile(myargv.front()); myargv.erase(myargv.begin()); string dstbase(myargv.front()); myargv.erase(myargv.begin()); cout << "nx = " << nx << endl; cout << "ny = " << ny << endl; cout << "nz = " << nz << endl; cout << "bx = " << bx << endl; cout << "by = " << by << endl; cout << "bz = " << bz << endl; cout << "wavelet = " << wname << endl; cout << "mode = " << mode << endl; cout << "srcfile = " << srcfile << endl; cout << "dstbase = " << dstbase << endl; int n = myargv.size(); SignificanceMap **sigmaps = new SignificanceMap* [n+1]; vector <size_t> dst_arr_lens; float *data; float *brick, *cvector; assert(nx%bx == 0); assert(ny%by == 0); assert(nz%bz == 0); data = new float[nx*ny*nz]; brick = new float [bx*by*bz]; vector <size_t> dims; dims.push_back(bx); if (by>1) dims.push_back(by); if (by>1 && bz>1) dims.push_back(bz); size_t cvectorlen = 0; for (int i=0; i<n; i++) { sigmaps[i] = new SignificanceMap(); dst_arr_lens.push_back(atoi(myargv[i].c_str())); cvectorlen += dst_arr_lens[i]; } assert(cvectorlen <= bx*by*bz); Compressor *cmp = new Compressor(dims, wname, mode); if (Compressor::GetErrCode() != 0) exit(1); //cmp->KeepAppOnOff() = false; // Add final sigmap // vector <size_t> sigmapshape; cmp->GetSigMapShape(sigmapshape); assert(sigmapshape.size() == 1); dst_arr_lens.push_back(sigmapshape[0] - cvectorlen); cvectorlen = sigmapshape[0]; sigmaps[n] = new SignificanceMap(); cvector = new float [cvectorlen]; FILE *fp; fp = fopen(srcfile.c_str(), "r"); assert(fp != NULL); int rc = fread(data, sizeof(data[0]), nx*ny*nz, fp); fclose(fp); assert (rc == nx*ny*nz); ostringstream oss; oss << dstbase << "_w=" << wname << "_m=" << mode; oss << "_bs=" << bx; string logfile(oss.str() + ".log"); cout << "logfile = " << logfile << endl; FILE *cdatafps[16]; FILE *sigfps[16]; for (int i=0; i<n+1; i++) { ostringstream sigmapfile; ostringstream cdatafile; sigmapfile << oss.str() << ".sig" << "." << i; cdatafile << oss.str() << "." << i; cout << "cdatafile = " << cdatafile.str() << endl; cout << "sigmapfile = " << sigmapfile.str() << endl; cdatafps[i] = fopen(cdatafile.str().c_str(), "w"); assert(cdatafps[i] != NULL); sigfps[i] = fopen(sigmapfile.str().c_str(), "w"); assert(sigfps[i] != NULL); } TIMER_START(t0); double time_compress = 0.0; double time_brick = 0.0; DecTime = 0.0; BrickTime = 0.0; for (int z=0; z<nz; z+= bz) { for (int y=0; y<ny; y+= by) { for (int x=0; x<nx; x+= bx) { //cout << "Compress " << x << " " << y << " " << z << endl; fetch_brick(data, nx, ny, nz, x, y, z, brick, bx, by, bz, swapbytes); cerr << "Processing " << z << " " << y << " " << x << endl; TIMER_START(t1); cmp->Decompose(brick, cvector, dst_arr_lens, sigmaps, n+1); if (Compressor::GetErrCode() != 0) exit(1); TIMER_STOP(t1, DecTime); float *cvectorptr = cvector; for (int i=0; i<n+1; i++) { // // write the coefficients // int rc = fwrite( cvectorptr, sizeof(cvectorptr[0]), dst_arr_lens[i], cdatafps[i] ); assert (rc == dst_arr_lens[i]); cvectorptr += dst_arr_lens[i]; // // write the maps // const unsigned char *map; size_t maplen; sigmaps[i]->GetMap(&map, &maplen); rc = fwrite( (const void *) &maplen, sizeof(maplen), 1, sigfps[i] ); assert (rc == 1); // write the map rc = fwrite(map, sizeof(map[0]), maplen, sigfps[i]); assert (rc == maplen); } } } } for (int i=0; i<n+1; i++) { fclose(cdatafps[i]); fclose(sigfps[i]); } delete cmp; TIMER_STOP(t0, time_compress); ofstream fout(logfile.c_str()); fout << "nx = " << nx << endl; fout << "ny = " << ny << endl; fout << "nz = " << nz << endl; fout << "bx = " << bx << endl; fout << "by = " << by << endl; fout << "bz = " << bz << endl; fout << "wavelet = " << wname << endl; fout << "mode = " << mode << endl; fout << "num coefficients per brick: "; for (int i=0;i<n+1; i++) { fout << dst_arr_lens[i] << " "; } fout << endl; fout << "total compress time = " << time_compress << endl; fout << " decomposition time = " << DecTime << endl; fout << " brick time = " << BrickTime << endl; for (int i=0; i<n+1; i++) { delete sigmaps[i]; } delete [] sigmaps; delete [] data; delete [] cvector; delete [] brick; fout.close(); }