void update_alpha(void) { char label[100]; char label1[100],label2[100],label3[100]; float depth; float factor; factor = 1.0 - exp(-smoke_extinct*smoke_dens*smoke_pathlength); smoke_alpha = (int)(255*factor); if(smoke_alpha<0)smoke_alpha=0; if(smoke_alpha>255)smoke_alpha=255; sprintf(label1,"%f",smoke_extinct); trimzeros(label1); sprintf(label2,"%f",smoke_dens); trimzeros(label2); sprintf(label3,"%f",smoke_pathlength); trimzeros(label3); sprintf(label,"alpha=%i=255*(1.0-exp(-%s*%s*%s))",smoke_alpha,label1,label2,label3); if(PANEL_testsmoke!=NULL) { TEXT_smokealpha->set_text(label); } if(smoke_extinct!=0.0&&smoke_dens!=0) { depth=0.693147/(smoke_extinct*smoke_dens); sprintf(label,"50%s smoke depth=%f","%",depth); } else { sprintf(label,"50%s smoke depth=***","%"); } if(PANEL_testsmoke!=NULL) { TEXT_smokedepth->set_text(label); } }
int convert_slice(slice *slicei, int *thread_index) { char slicefile_svz[1024], slicesizefile_svz[1024]; int fileversion, one, zero; char *slice_file; int version_local; char filetype[1024]; char *shortlabel, *unit; char units[256]; int ijkbar[6]; uLong framesize; float *sliceframe_data=NULL; unsigned char *sliceframe_compressed=NULL, *sliceframe_uncompressed=NULL; unsigned char *sliceframe_compressed_rle=NULL, *sliceframe_uncompressed_rle=NULL; char cval[256]; int sizebefore, sizeafter; int returncode; float minmax[2]; float time_local; LINT data_loc; int percent_done; int percent_next=10; float valmin, valmax, denom; int chop_min, chop_max; uLongf ncompressed_zlib; int ncompressed_save; #ifndef pp_THREAD int count=0; #endif int ncol, nrow, idir; float time_max; int itime; LINT file_loc; FILE *SLICEFILE; FILE *slicestream,*slicesizestream; #ifdef pp_THREAD if(GLOBcleanfiles==0) { int fileindex; fileindex = slicei + 1 - sliceinfo; sprintf(threadinfo[*thread_index].label,"sf %i",fileindex); } #endif slice_file=slicei->file; version_local=slicei->version; fileversion = 1; one = 1; zero=0; // check if slice file is accessible strcpy(filetype,""); shortlabel=slicei->label.shortlabel; if(strlen(shortlabel)>0)strcat(filetype,shortlabel); trim(filetype); if(getfileinfo(slice_file,NULL,NULL)!=0) { fprintf(stderr,"*** Warning: The file %s does not exist\n",slice_file); return 0; } SLICEFILE=fopen(slice_file,"rb"); if(SLICEFILE==NULL) { fprintf(stderr,"*** Warning: The file %s could not be opened\n",slice_file); return 0; } // set up slice compressed file if(GLOBdestdir!=NULL) { strcpy(slicefile_svz,GLOBdestdir); strcat(slicefile_svz,slicei->filebase); } else { strcpy(slicefile_svz,slicei->file); } { char *ext; int lensvz; lensvz = strlen(slicefile_svz); if(lensvz>4) { ext = slicefile_svz + lensvz - 4; if(strcmp(ext,".rle")==0) { slicefile_svz[lensvz-4]=0; } strcat(slicefile_svz,".svz"); } } if(GLOBdestdir!=NULL) { strcpy(slicesizefile_svz,GLOBdestdir); strcat(slicesizefile_svz,slicei->filebase); } else { strcpy(slicesizefile_svz,slicei->file); } { char *ext; int lensvz; lensvz = strlen(slicesizefile_svz); if(lensvz>4) { ext = slicesizefile_svz + lensvz - 4; if(strcmp(ext,".rle")==0) { slicesizefile_svz[lensvz-4]=0; } strcat(slicesizefile_svz,".sz"); } } if(GLOBcleanfiles==1) { slicestream=fopen(slicefile_svz,"rb"); if(slicestream!=NULL) { fclose(slicestream); PRINTF(" Removing %s\n",slicefile_svz); UNLINK(slicefile_svz); LOCK_COMPRESS; GLOBfilesremoved++; UNLOCK_COMPRESS; } slicesizestream=fopen(slicesizefile_svz,"rb"); if(slicesizestream!=NULL) { fclose(slicesizestream); PRINTF(" Removing %s\n",slicesizefile_svz); UNLINK(slicesizefile_svz); LOCK_COMPRESS; GLOBfilesremoved++; UNLOCK_COMPRESS; } return 0; } if(GLOBoverwrite_slice==0) { slicestream=fopen(slicefile_svz,"rb"); if(slicestream!=NULL) { fclose(slicestream); fprintf(stderr,"*** Warning: %s exists.\n",slicefile_svz); fprintf(stderr," Use the -f option to overwrite smokezip compressed files\n"); return 0; } } slicestream=fopen(slicefile_svz,"wb"); slicesizestream=fopen(slicesizefile_svz,"w"); if(slicestream==NULL||slicesizestream==NULL) { if(slicestream==NULL) { fprintf(stderr,"*** Warning: The file %s could not be opened for writing\n",slicefile_svz); } if(slicesizestream==NULL) { fprintf(stderr," %s could not be opened for writing\n",slicesizefile_svz); } if(slicestream!=NULL)fclose(slicestream); if(slicesizestream!=NULL)fclose(slicesizestream); fclose(SLICEFILE); return 0; } // read and write slice header strcpy(units,""); unit=slicei->label.unit; if(strlen(unit)>0)strcat(units,unit); trim(units); sprintf(cval,"%f",slicei->valmin); trimzeros(cval); #ifndef pp_THREAD if(GLOBcleanfiles==0) { PRINTF("Compressing %s (%s)\n",slice_file,filetype); PRINTF(" using min=%s %s",cval,units); } #endif sprintf(cval,"%f",slicei->valmax); trimzeros(cval); #ifndef pp_THREAD if(GLOBcleanfiles==0) { PRINTF(" max=%s %s\n",cval,units); PRINTF(" "); } #endif valmin=slicei->valmin; valmax=slicei->valmax; denom = valmax-valmin; if(denom==0.0)denom=1.0; chop_min=0; chop_max=255; if(GLOBno_chop==0) { if(slicei->setchopvalmax==1) { chop_max = 255*(slicei->chopvalmax-valmin)/denom; if(chop_max<0)chop_max=0; if(chop_max>255)chop_max=255; } if(slicei->setchopvalmin==1) { chop_min = 255*(slicei->chopvalmin-valmin)/denom; if(chop_min<0)chop_min=0; if(chop_min>255)chop_min=255; } } fwrite(&one,4,1,slicestream); // write out a 1 to determine "endianness" when file is read in later fwrite(&zero,4,1,slicestream); // write out a zero now, then a one just before file is closed fwrite(&fileversion,4,1,slicestream); // write out compressed fileversion in case file format changes later fwrite(&version_local,4,1,slicestream); // fds slice file version sizeafter=16; //*** SLICE FILE FORMATS //*** FDS FORMAT (FORTRAN - each FORTRAN record has a 4 byte header and a 4 byte trailer surrounding the data) // 30 byte long label // 30 byte short label // 30 byte unit // i1,i2,j1,j2,k1,k2 // for each time step: // time, compressed frame size // qq(1,nbuffer) where nbuffer = (i2+1-i1)*(j2+1-j1)*(k2+1-k1) //*** ZLIB format (C - no extra bytes surrounding data) //*** header // endian // completion (0/1) // fileversion (compressed format) // version_local (slicef version) // global min max (used to perform conversion) // i1,i2,j1,j2,k1,k2 //*** frame // time, compressed frame size for each frame // compressed buffer //*** RLE format (FORTRAN) //*** header // endian // fileversion, slice version // global min max (used to perform conversion) // i1,i2,j1,j2,k1,k2 //*** frame // time // compressed frame size for each frame // compressed buffer { int skip; skip = 3*(4+30+4); // skip over 3 records each containing a 30 byte FORTRAN character string returncode=FSEEK(SLICEFILE,skip,SEEK_CUR); sizebefore=skip; } FORTSLICEREAD(ijkbar,6); sizebefore+=8+6*4; framesize = (ijkbar[1]+1-ijkbar[0]); framesize *= (ijkbar[3]+1-ijkbar[2]); framesize *= (ijkbar[5]+1-ijkbar[4]); minmax[0]=slicei->valmin; minmax[1]=slicei->valmax; fwrite(minmax,4,2,slicestream); // min max vals fwrite(ijkbar,4,6,slicestream); sizeafter+=(8+24); ncompressed_save=1.02*framesize+600; if(NewMemory((void **)&sliceframe_data,ncompressed_save*sizeof(float))==0)goto wrapup; if(NewMemory((void **)&sliceframe_compressed,ncompressed_save*sizeof(unsigned char))==0)goto wrapup; if(NewMemory((void **)&sliceframe_uncompressed,ncompressed_save*sizeof(unsigned char))==0)goto wrapup; fprintf(slicesizestream,"%i %i %i %i %i %i\n",ijkbar[0],ijkbar[1],ijkbar[2],ijkbar[3],ijkbar[4],ijkbar[5]); fprintf(slicesizestream,"%f %f\n",minmax[0],minmax[1]); idir=0; if(ijkbar[0]==ijkbar[1]) { idir=1; ncol = ijkbar[3] + 1 - ijkbar[2]; nrow = ijkbar[5] + 1 - ijkbar[4]; } else if(ijkbar[2]==ijkbar[3]) { idir=2; ncol = ijkbar[1] + 1 - ijkbar[0]; nrow = ijkbar[5] + 1 - ijkbar[4]; } else if(ijkbar[4]==ijkbar[5]) { idir=3; ncol = ijkbar[1] + 1 - ijkbar[0]; nrow = ijkbar[3] + 1 - ijkbar[2]; } if(idir==0) { idir=1; ncol = ijkbar[3] + 1 - ijkbar[2]; nrow = ijkbar[5] + 1 - ijkbar[4]; } { int ni, nj, nk; ni = ijkbar[1]+1-ijkbar[0]; nj = ijkbar[3]+1-ijkbar[2]; nk = ijkbar[5]+1-ijkbar[4]; time_max=-1000000.0; itime=-1; for(;;) { int i; FORTSLICEREAD(&time_local,1); sizebefore+=12; if(returncode==0)break; FORTSLICEREAD(sliceframe_data,framesize); //--------------- if(returncode==0)break; sizebefore+=(8+framesize*4); if(time_local<time_max)continue; time_max=time_local; #ifndef pp_THREAD count++; #endif data_loc=FTELL(SLICEFILE); percent_done=100.0*(float)data_loc/(float)slicei->filesize; #ifdef pp_THREAD threadinfo[*thread_index].stat=percent_done; if(percent_done>percent_next) { LOCK_PRINT; print_thread_stats(); UNLOCK_PRINT; percent_next+=10; } #else if(percent_done>percent_next) { PRINTF(" %i%s",percent_next,GLOBpp); FFLUSH(); percent_next+=10; } #endif for(i=0; i<framesize; i++) { int ival; int icol, jrow, index2; int ii,jj,kk; // val_in(i,j,k) = i + j*ni + k*ni*nj if(framesize<=ncol*nrow) { // only one slice plane // i = jrow*ncol + icol; icol = i%ncol; jrow = i/ncol; index2 = icol*nrow + jrow; } else { ii = i%ni; jj = (i/ni)%nj; kk = i/(ni*nj); index2 = ii*nj*nk + jj*nk + kk; } { float val; val = sliceframe_data[i]; if(val<valmin) { ival=0; } else if(val>valmax) { ival=255; } else { ival = 1 + 253*(val-valmin)/denom; } if(ival<chop_min)ival=0; if(ival>chop_max)ival=255; sliceframe_uncompressed[index2] = ival; } } itime++; if(itime%GLOBslicezipstep!=0)continue; //int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); ncompressed_zlib=ncompressed_save; returncode=compress(sliceframe_compressed,&ncompressed_zlib,sliceframe_uncompressed,framesize); file_loc=FTELL(slicestream); fwrite(&time_local,4,1,slicestream); fwrite(&ncompressed_zlib,4,1,slicestream); fwrite(sliceframe_compressed,1,ncompressed_zlib,slicestream); sizeafter+=(8+ncompressed_zlib); fprintf(slicesizestream,"%f %i, %li\n",time_local,(int)ncompressed_zlib,(long)file_loc); } if(returncode!=0) { fprintf(stderr,"*** Error: compress returncode=%i\n",returncode); } } wrapup: #ifndef pp_THREAD PRINTF(" 100%s completed\n",GLOBpp); #endif FREEMEMORY(sliceframe_data); FREEMEMORY(sliceframe_compressed); FREEMEMORY(sliceframe_uncompressed); FREEMEMORY(sliceframe_compressed_rle); FREEMEMORY(sliceframe_uncompressed_rle); fclose(SLICEFILE); FSEEK(slicestream,4,SEEK_SET); fwrite(&one,4,1,slicestream); // write completion code fclose(slicestream); fclose(slicesizestream); { char before_label[256],after_label[256]; getfilesizelabel(sizebefore,before_label); getfilesizelabel(sizeafter,after_label); #ifdef pp_THREAD slicei->compressed=1; sprintf(slicei->summary,"compressed from %s to %s (%4.1f%s reduction)",before_label,after_label,(float)sizebefore/(float)sizeafter,GLOBx); threadinfo[*thread_index].stat=-1; #else PRINTF(" records=%i, ",count); PRINTF("Sizes: original=%s, ",before_label); PRINTF("compressed=%s (%4.1f%s reduction)\n\n",after_label,(float)sizebefore/(float)sizeafter,GLOBx); #endif } return 1; }
void update_unit_defs(void){ int i, j; if(smokediff==0)return; for(i=0;i<nunitclasses;i++){ float valmin, valmax, diff_maxmin; int firstslice, firstpatch, firstplot3d, diff_index; firstpatch=1; for(j=0;j<npatchinfo;j++){ patchdata *patchj; patchj = patchinfo + j; if(patchj->loaded==0||patchj->display==0)continue; if(unit_type_match(patchj->label.unit,unitclasses+i)!=0)continue; if(firstpatch==1){ firstpatch=0; valmin=patchj->diff_valmin; valmax=patchj->diff_valmax; } else{ if(patchj->diff_valmin<valmin)valmin=patchj->diff_valmin; if(patchj->diff_valmax>valmax)valmax=patchj->diff_valmax; } } firstslice=1; for(j=0;j<nsliceinfo;j++){ slicedata *slicej; slicej = sliceinfo + j; if(slicej->loaded==0||slicej->display==0)continue; if(unit_type_match(slicej->label.unit,unitclasses+i)!=0)continue; if(firstslice==1){ firstslice=0; valmin=slicej->diff_valmin; valmax=slicej->diff_valmax; } else{ if(slicej->diff_valmin<valmin)valmin=slicej->diff_valmin; if(slicej->diff_valmax>valmax)valmax=slicej->diff_valmax; } } firstplot3d=1; for(j=0;j<nplot3dinfo;j++){ plot3ddata *plot3dj; int n; plot3dj = plot3dinfo + j; if(plot3dj->loaded==0||plot3dj->display==0)continue; for(n=0;n<5;n++){ if(unit_type_match(plot3dj->label[n].unit,unitclasses+i)!=0)continue; if(firstplot3d==1){ firstplot3d=0; valmin=plot3dj->diff_valmin[n]; valmax=plot3dj->diff_valmax[n]; } else{ if(plot3dj->diff_valmin[n]<valmin)valmin=plot3dj->diff_valmin[n]; if(plot3dj->diff_valmax[n]>valmax)valmax=plot3dj->diff_valmax[n]; } } } diff_index=unitclasses[i].diff_index; if(diff_index!=-1&&(firstslice==0||firstpatch==0||firstplot3d==0)){ int idiff; diff_maxmin=valmax-valmin; if(diff_maxmin!=0.0){ unitclasses[i].units[diff_index].scale[0]=100.0/diff_maxmin; idiff = diff_maxmin + 0.5; diff_maxmin=idiff; sprintf(unitclasses[i].units[diff_index].rel_val,"%f",diff_maxmin); trimzeros(unitclasses[i].units[diff_index].rel_val); unitclasses[i].units[diff_index].rel_defined=1; } } } }