long cfits_optimal_numrows (cfitsfile *fptr) { int status = 0; long nrows; (void) fits_get_rowsize ((fitsfile *) fptr, &nrows, &status); cfits_report_error (status); if (status != 0) return -1; return nrows; }
/* does the actual write of the file */ static void file_write_rays2fits(long fileNum, long firstTask, long lastTask, MPI_Comm fileComm) { const char *ttype[] = { "nest", "ra", "dec", "A00", "A01", "A10", "A11" #ifdef OUTPUTRAYDEFLECTIONS , "alpha0", "alpha1" #endif #ifdef OUTPUTPHI , "phi" #endif }; const char *tform[] = { "K", "D", "D", "D", "D", "D", "D" #ifdef OUTPUTRAYDEFLECTIONS , "D", "D" #endif #ifdef OUTPUTPHI , "D" #endif }; char name[MAX_FILENAME]; char bangname[MAX_FILENAME]; long NumRaysInFile,i,j; long *NumRaysInPeanoCell,*StartRaysInPeanoCell,peano; fitsfile *fptr; int status = 0; int naxis = 1; long naxes[1],fpixel[1]; LONGLONG nrows; int tfields,colnum; long k,chunkInd,firstInd,lastInd,NumRaysInChunkBase,NumRaysInChunk,NumChunks; LONGLONG firstrow,firstelem,nelements; double *darr; long *larr; char *buff; double ra,dec; long nwc=0,NtotToRecv,nw=0,nwg=0,rpeano,rowloc; MPI_Status mpistatus; double t0 = 0.0; sprintf(name,"%s/%s%04ld.%04ld",rayTraceData.OutputPath,rayTraceData.RayOutputName,rayTraceData.CurrentPlaneNum,fileNum); sprintf(bangname,"!%s",name); /* build fits table layout*/ tfields = 7; #ifdef OUTPUTRAYDEFLECTIONS tfields += 2; #endif #ifdef OUTPUTPHI tfields += 1; #endif /* build file layout*/ NumRaysInPeanoCell = (long*)malloc(sizeof(long)*NbundleCells); assert(NumRaysInPeanoCell != NULL); StartRaysInPeanoCell = (long*)malloc(sizeof(long)*NbundleCells); assert(StartRaysInPeanoCell != NULL); for(i=0;i<NbundleCells;++i) StartRaysInPeanoCell[i] = 0; for(i=0;i<NbundleCells;++i) { if(ISSETBITFLAG(bundleCells[i].active,PRIMARY_BUNDLECELL)) { peano = nest2peano(bundleCells[i].nest,rayTraceData.bundleOrder); StartRaysInPeanoCell[peano] = bundleCells[i].Nrays; nwc += bundleCells[i].Nrays; } } MPI_Allreduce(StartRaysInPeanoCell,NumRaysInPeanoCell,(int) NbundleCells,MPI_LONG,MPI_SUM,fileComm); j = 0; for(i=0;i<NbundleCells;++i) { StartRaysInPeanoCell[i] = j; j += NumRaysInPeanoCell[i]; } NumRaysInFile = j; /* make the file and write header info */ if(ThisTask == firstTask) { t0 = -MPI_Wtime(); remove(name); fits_create_file(&fptr,bangname,&status); if(status) fits_report_error(stderr,status); naxes[0] = 2l*NbundleCells; fits_create_img(fptr,LONGLONG_IMG,naxis,naxes,&status); if(status) fits_report_error(stderr,status); fpixel[0] = 0+1; fits_write_pix(fptr,TLONG,fpixel,(LONGLONG) (NbundleCells),NumRaysInPeanoCell,&status); if(status) fits_report_error(stderr,status); fpixel[0] = NbundleCells+1; fits_write_pix(fptr,TLONG,fpixel,(LONGLONG) (NbundleCells),StartRaysInPeanoCell,&status); if(status) fits_report_error(stderr,status); fits_write_key(fptr,TLONG,"NumFiles",&(rayTraceData.NumRayOutputFiles),"number of files that rays are split into",&status); if(status) fits_report_error(stderr,status); fits_write_key(fptr,TLONG,"PeanoCellHEALPixOrder",&(rayTraceData.bundleOrder),"HEALPix order of peano indexed cells rays are organized into",&status); if(status) fits_report_error(stderr,status); fits_write_key(fptr,TLONG,"RayHEALPixOrder",&(rayTraceData.rayOrder),"HEALPix order of ray grid",&status); if(status) fits_report_error(stderr,status); nrows = (LONGLONG) (NumRaysInFile); fits_create_tbl(fptr,BINARY_TBL,nrows,tfields,ttype,tform,NULL,"Rays",&status); if(status) fits_report_error(stderr,status); fits_get_rowsize(fptr,&NumRaysInChunkBase,&status); if(status) fits_report_error(stderr,status); } MPI_Bcast(&NumRaysInChunkBase,1,MPI_LONG,0,fileComm); if(sizeof(long) > sizeof(double)) buff = (char*)malloc(sizeof(long)*NumRaysInChunkBase); else buff = (char*)malloc(sizeof(double)*NumRaysInChunkBase); assert(buff != NULL); darr = (double*) buff; larr = (long*) buff; for(i=firstTask;i<=lastTask;++i) { if(ThisTask == i) { #ifdef DEBUG #if DEBUG_LEVEL > 0 fprintf(stderr,"%d: fileNum = %ld, first,last = %ld|%ld\n",ThisTask,fileNum,firstTask,lastTask); #endif #endif if(ThisTask != firstTask) MPI_Send(&nwc,1,MPI_LONG,(int) firstTask,TAG_RAYIO_TOTNUM,MPI_COMM_WORLD); for(rpeano=0;rpeano<NrestrictedPeanoInd;++rpeano) { j = bundleCellsRestrictedPeanoInd2Nest[rpeano]; if(ISSETBITFLAG(bundleCells[j].active,PRIMARY_BUNDLECELL)) { peano = nest2peano(bundleCells[j].nest,rayTraceData.bundleOrder); assert(NumRaysInPeanoCell[peano] == ((1l) << (2*(rayTraceData.rayOrder-rayTraceData.bundleOrder)))); assert((StartRaysInPeanoCell[peano] - ((StartRaysInPeanoCell[peano])/(((1l) << (2*(rayTraceData.rayOrder-rayTraceData.bundleOrder))))) *(((1l) << (2*(rayTraceData.rayOrder-rayTraceData.bundleOrder))))) == 0); NumChunks = NumRaysInPeanoCell[peano]/NumRaysInChunkBase; if(NumChunks*NumRaysInChunkBase < NumRaysInPeanoCell[peano]) NumChunks += 1; firstrow = (LONGLONG) (StartRaysInPeanoCell[peano]) + (LONGLONG) 1; firstelem = 1; for(chunkInd=0;chunkInd<NumChunks;++chunkInd) { firstInd = chunkInd*NumRaysInChunkBase; lastInd = (chunkInd+1)*NumRaysInChunkBase-1; if(lastInd >= NumRaysInPeanoCell[peano]-1) lastInd = NumRaysInPeanoCell[peano]-1; NumRaysInChunk = lastInd - firstInd + 1; nelements = (LONGLONG) NumRaysInChunk; nw += NumRaysInChunk; if(ThisTask != firstTask) { rowloc = firstrow; MPI_Send(&rowloc,1,MPI_LONG,(int) firstTask,TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD); MPI_Send(&NumRaysInChunk,1,MPI_LONG,(int) firstTask,TAG_RAYIO_NUMCHUNK,MPI_COMM_WORLD); colnum = TAG_RAYIO_CHUNKDATA+1; for(k=firstInd;k<=lastInd;++k) larr[k-firstInd] = bundleCells[j].rays[k].nest; MPI_Ssend(larr,(int) NumRaysInChunk,MPI_LONG,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) { vec2radec(bundleCells[j].rays[k].n,&ra,&dec); darr[k-firstInd] = ra; } MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) { vec2radec(bundleCells[j].rays[k].n,&ra,&dec); darr[k-firstInd] = dec; } MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*0+0]; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*0+1]; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*1+0]; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*1+1]; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; #ifdef OUTPUTRAYDEFLECTIONS for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].alpha[0]; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].alpha[1]; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; #endif #ifdef OUTPUTPHI for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].phi; MPI_Ssend(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) firstTask,colnum,MPI_COMM_WORLD); ++colnum; #endif firstrow += nelements; } else { colnum = 1; for(k=firstInd;k<=lastInd;++k) larr[k-firstInd] = bundleCells[j].rays[k].nest; fits_write_col(fptr,TLONG,colnum,firstrow,firstelem,nelements,larr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) { vec2radec(bundleCells[j].rays[k].n,&ra,&dec); darr[k-firstInd] = ra; } fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) { vec2radec(bundleCells[j].rays[k].n,&ra,&dec); darr[k-firstInd] = dec; } fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*0+0]; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*0+1]; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*1+0]; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].A[2*1+1]; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; #ifdef OUTPUTRAYDEFLECTIONS for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].alpha[0]; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].alpha[1]; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; #endif #ifdef OUTPUTPHI for(k=firstInd;k<=lastInd;++k) darr[k-firstInd] = bundleCells[j].rays[k].phi; fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; #endif firstrow += nelements; } }// for(chunkInd=0;chunkInd<NumChunks;++chunkInd) } //if(ISSETBITFLAG(bundleCells[j].active,PRIMARY_BUNDLECELL)). } //for(j=0;j<NbundleCells;++j) } //if(ThisTask == i) if(i != firstTask && ThisTask == firstTask) { MPI_Recv(&NtotToRecv,1,MPI_LONG,(int) i,TAG_RAYIO_TOTNUM,MPI_COMM_WORLD,&mpistatus); firstelem = 1; while(NtotToRecv > 0) { MPI_Recv(&rowloc,1,MPI_LONG,(int) i,TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); MPI_Recv(&NumRaysInChunk,1,MPI_LONG,(int) i,TAG_RAYIO_NUMCHUNK,MPI_COMM_WORLD,&mpistatus); firstrow = (LONGLONG) (rowloc); nelements = (LONGLONG) NumRaysInChunk; colnum = 1; MPI_Recv(larr,(int) NumRaysInChunk,MPI_LONG,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TLONG,colnum,firstrow,firstelem,nelements,larr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; #ifdef OUTPUTRAYDEFLECTIONS MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; #endif #ifdef OUTPUTPHI MPI_Recv(darr,(int) NumRaysInChunk,MPI_DOUBLE,(int) i,colnum+TAG_RAYIO_CHUNKDATA,MPI_COMM_WORLD,&mpistatus); fits_write_col(fptr,TDOUBLE,colnum,firstrow,firstelem,nelements,darr,&status); if(status) fits_report_error(stderr,status); ++colnum; #endif nwg += NumRaysInChunk; NtotToRecv -= NumRaysInChunk; } } ////////////////////////////// MPI_Barrier(fileComm); ////////////////////////////// } if(ThisTask == firstTask) { fits_close_file(fptr,&status); if(status) fits_report_error(stderr,status); t0 += MPI_Wtime(); #ifdef DEBUG fprintf(stderr,"writing %ld rays to file '%s' took %g seconds.\n",NumRaysInFile,name,t0); #endif assert(nwg == NumRaysInFile-nw); //error check # of rays recvd } //error check # of rays written MPI_Allreduce(&nw,&nwg,1,MPI_LONG,MPI_SUM,fileComm); assert(nw == nwc); assert(nwg == NumRaysInFile); //clean up and close files for this task free(buff); free(StartRaysInPeanoCell); free(NumRaysInPeanoCell); }
str FITSexportTable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { str msg = MAL_SUCCEED; str tname = *(str*) getArgReference(stk, pci, 1); mvc *m = NULL; sql_trans *tr; sql_schema *sch; sql_table *tbl, *column, *tables = NULL; sql_column *col; oid rid = oid_nil; str type, name, *colname, *tform; fitsfile *fptr; char filename[BUFSIZ]; long nrows = 0, optimal; rids * rs; int tm0, texportboolean=0, texportchar=0, texportstring=0, texportshort=0, texportint=0, texportlong=0, texportfloat=0, texportdouble=0; int numberrow = 0, cc = 0, status = 0, j = 0, columns, fid, dimension = 0, block = 0; int boolcols = 0, charcols = 0, strcols = 0, shortcols = 0, intcols = 0, longcols = 0, floatcols = 0, doublecols = 0; int hdutype; char charvalue, *readcharrows; str strvalue; char **readstrrows; short shortvalue, *readshortrows; int intvalue, *readintrows; long longvalue, *readlongrows; float realvalue, *readfloatrows; double doublevalue, *readdoublerows; _Bool boolvalue, *readboolrows; struct list * set; msg = getSQLContext(cntxt, mb, &m, NULL); if (msg) return msg; tr = m->session->tr; sch = mvc_bind_schema(m, "sys"); /* First step: look if the table exists in the database. If the table is not in the database, the export function cannot continue */ tbl = mvc_bind_table(m, sch, tname); if (tbl == NULL) { msg = createException (MAL, "fits.exporttable", "Table %s is missing.\n", tname); return msg; } set = (*tbl).columns.set; columns = list_length(set); colname = (str *) GDKmalloc(columns * sizeof(str)); tform = (str *) GDKmalloc(columns * sizeof(str)); /* mnstr_printf(GDKout,"Number of columns: %d\n", columns);*/ tables = mvc_bind_table(m, sch, "_tables"); col = mvc_bind_column(m, tables, "name"); rid = table_funcs.column_find_row(m->session->tr, col, tname, NULL); col = mvc_bind_column(m, tables, "id"); fid = *(int*) table_funcs.column_find_value(m->session->tr, col, rid); column = mvc_bind_table(m, sch, "_columns"); col = mvc_bind_column(m, column, "table_id"); rs = table_funcs.rids_select(m->session->tr, col, (void *) &fid, (void *) &fid, NULL); while ((rid = table_funcs.rids_next(rs)) != oid_nil) { col = mvc_bind_column(m, column, "name"); name = (char *) table_funcs.column_find_value(m->session->tr, col, rid); colname[j] = toLower(name); col = mvc_bind_column(m, column, "type"); type = (char *) table_funcs.column_find_value(m->session->tr, col, rid); if (strcmp(type,"boolean")==0) tform[j] = "1L"; if (strcmp(type,"char")==0) tform[j] = "1S"; if (strcmp(type,"varchar")==0) tform[j] = "8A"; if (strcmp(type,"smallint")==0) tform[j] = "1I"; if (strcmp(type,"int")==0) tform[j] = "1J"; if (strcmp(type,"bigint")==0) tform[j] = "1K"; if (strcmp(type,"real")==0) tform[j] = "1E"; if (strcmp(type,"double")==0) tform[j] = "1D"; j++; } col = mvc_bind_column(m, tbl, colname[0]); nrows = store_funcs.count_col(tr, col, 1); snprintf(filename,BUFSIZ,"\n%s.fit",tname); mnstr_printf(GDKout, "Filename: %s\n", filename); remove(filename); status=0; fits_create_file(&fptr, filename, &status); fits_create_img(fptr, USHORT_IMG, 0, NULL, &status); fits_close_file(fptr, &status); fits_open_file(&fptr, filename, READWRITE, &status); fits_movabs_hdu(fptr, 1, &hdutype, &status); fits_create_tbl( fptr, BINARY_TBL, 0, columns, colname, tform, NULL, tname, &status); for (cc = 0; cc < columns; cc++) { char * columntype; col = mvc_bind_column(m, tbl, colname[cc]); columntype = col -> type.type->sqlname; if (strcmp(columntype,"boolean")==0) { boolcols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readboolrows = (_Bool *) GDKmalloc (sizeof(_Bool) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { boolvalue = *(_Bool*) table_funcs.column_find_value(m->session->tr, col, numberrow); readboolrows[dimension] = boolvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TLOGICAL, cc+1, (optimal*block)+1, 1, optimal, readboolrows, &status); texportboolean += GDKms() - tm0; GDKfree(readboolrows); readboolrows = (_Bool *) GDKmalloc (sizeof(_Bool) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TLOGICAL, cc+1, (optimal*block)+1, 1, dimension, readboolrows, &status); texportboolean += GDKms() - tm0; GDKfree(readboolrows); } if (strcmp(columntype,"char")==0) { charcols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readcharrows = (char *) GDKmalloc (sizeof(char) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { charvalue = *(char*) table_funcs.column_find_value(m->session->tr, col, numberrow); readcharrows[dimension] = charvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TBYTE, cc+1, (optimal*block)+1, 1, optimal, readcharrows, &status); texportchar += GDKms() - tm0; GDKfree(readcharrows); readcharrows = (char *) GDKmalloc (sizeof(char) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TBYTE, cc+1, (optimal*block)+1, 1, dimension, readcharrows, &status); texportchar += GDKms() - tm0; GDKfree(readcharrows); } if (strcmp(columntype,"varchar")==0) { strcols++; dimension=0; block=0; fits_get_rowsize(fptr,&optimal,&status); readstrrows = (char **) GDKmalloc (sizeof(char *) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { strvalue = (char *) table_funcs.column_find_value(m->session->tr, col, numberrow); readstrrows[dimension] = strvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col_str(fptr, cc+1, (optimal*block)+1, 1, optimal, readstrrows, &status); texportstring += GDKms() - tm0; GDKfree(readstrrows); readstrrows = (char **) GDKmalloc(sizeof(char *) * optimal); block++; } } tm0 = GDKms(); fits_write_col_str(fptr, cc+1, (optimal*block)+1, 1, dimension, readstrrows, &status); texportstring += GDKms() - tm0; GDKfree(readstrrows); } if (strcmp(columntype,"smallint")==0) { shortcols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readshortrows = (short *) GDKmalloc (sizeof(short) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { shortvalue = *(short*) table_funcs.column_find_value(m->session->tr, col, numberrow); readshortrows[dimension] = shortvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TSHORT, cc+1, (optimal*block)+1, 1, optimal, readshortrows, &status); texportshort += GDKms() - tm0; GDKfree(readshortrows); readshortrows = (short *) GDKmalloc (sizeof(short) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TSHORT, cc+1, (optimal*block)+1, 1, dimension, readshortrows, &status); texportshort += GDKms() - tm0; GDKfree(readshortrows); } if (strcmp(columntype,"int")==0) { intcols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readintrows = (int *) GDKmalloc (sizeof(int) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { intvalue = *(int*) table_funcs.column_find_value(m->session->tr, col, numberrow); readintrows[dimension] = intvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TINT, cc+1, (optimal*block)+1, 1, optimal, readintrows, &status); texportint += GDKms() - tm0; GDKfree(readintrows); readintrows = (int *) GDKmalloc (sizeof(int) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TINT, cc+1, (optimal*block)+1, 1, dimension, readintrows, &status); texportint += GDKms() - tm0; GDKfree(readintrows); } if (strcmp(columntype,"bigint")==0) { longcols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readlongrows = (long *) GDKmalloc (sizeof(long) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { longvalue = *(long*) table_funcs.column_find_value(m->session->tr, col, numberrow); readlongrows[dimension] = longvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TLONG, cc+1, (optimal*block)+1, 1, optimal, readlongrows, &status); texportlong += GDKms() - tm0; GDKfree(readlongrows); readlongrows = (long *) GDKmalloc (sizeof(long) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TLONG, cc+1, (optimal*block)+1, 1, dimension, readlongrows, &status); texportlong += GDKms() - tm0; GDKfree(readlongrows); } if (strcmp(columntype,"real")==0) { floatcols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readfloatrows = (float *) GDKmalloc (sizeof(float) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { realvalue = *(float*) table_funcs.column_find_value(m->session->tr, col, numberrow); readfloatrows[dimension] = realvalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TFLOAT, cc+1, (optimal*block)+1, 1, optimal, readfloatrows, &status); texportfloat += GDKms() - tm0; GDKfree(readfloatrows); readfloatrows = (float *) GDKmalloc (sizeof(float) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TFLOAT, cc+1, (optimal*block)+1, 1, dimension, readfloatrows, &status); texportfloat += GDKms() - tm0; GDKfree(readfloatrows); } if (strcmp(columntype,"double")==0) { doublecols++; dimension = 0; block = 0; fits_get_rowsize(fptr,&optimal,&status); readdoublerows = (double *) GDKmalloc (sizeof(double) * optimal); for (numberrow = 0; numberrow < nrows ; numberrow++) { doublevalue = *(double*) table_funcs.column_find_value(m->session->tr, col, numberrow); readdoublerows[dimension] = doublevalue; dimension++; if (dimension == optimal) { dimension = 0; tm0 = GDKms(); fits_write_col(fptr, TDOUBLE, cc+1, (optimal*block)+1, 1, optimal, readdoublerows, &status); texportdouble += GDKms() - tm0; GDKfree(readdoublerows); readdoublerows = (double *) GDKmalloc (sizeof(double) * optimal); block++; } } tm0 = GDKms(); fits_write_col(fptr, TDOUBLE, cc+1, (optimal*block)+1, 1, optimal, readdoublerows, &status); texportdouble += GDKms() - tm0; GDKfree(readdoublerows); } } /* print all the times that were needed to export each one of the columns mnstr_printf(GDKout, "\n\n"); if (texportboolean > 0) mnstr_printf(GDKout, "%d Boolean\tcolumn(s) exported in %d ms\n", boolcols, texportboolean); if (texportchar > 0) mnstr_printf(GDKout, "%d Char\t\tcolumn(s) exported in %d ms\n", charcols, texportchar); if (texportstring > 0) mnstr_printf(GDKout, "%d String\tcolumn(s) exported in %d ms\n", strcols, texportstring); if (texportshort > 0) mnstr_printf(GDKout, "%d Short\t\tcolumn(s) exported in %d ms\n", shortcols, texportshort); if (texportint > 0) mnstr_printf(GDKout, "%d Integer\tcolumn(s) exported in %d ms\n", intcols, texportint); if (texportlong > 0) mnstr_printf(GDKout, "%d Long\t\tcolumn(s) exported in %d ms\n", longcols, texportlong); if (texportfloat > 0) mnstr_printf(GDKout, "%d Float\t\tcolumn(s) exported in %d ms\n", floatcols, texportfloat); if (texportdouble > 0) mnstr_printf(GDKout, "%d Double\tcolumn(s) exported in %d ms\n", doublecols, texportdouble); */ fits_close_file(fptr, &status); return msg; }