// AMRwriter.cc #include #include #include "AMRwriter.hh" #include void AMRwriter::writeAMRattributes(){ double origin[5],delta[5],ext[5],currenttime; // OK, now we get to do the attribs thang... // first compute the coorect origin and delta for this level. //int i; int level_timestep,persistence; /***** Must compute the floating point time from the integer timestep. The timestep is based on the finest computational level. Should compute from level_timestep for less numerical error *****/ currenttime = (double)currentstep*basetimestep/(double)(levels[levels.getSize()-1].trefine); // compute persistence persistence = levels[levels.getSize()-currentlevel-1].trefine; if(persistence<=0) { fprintf(stderr,"Refinement *must* be >1... this isn't right!!!\n"); persistence=1;} level_timestep = currentstep/persistence; // compute from min-ext... // y-know... there is more point density near 0 in the float // representation... so having sizes instead of extents would // be smarter.... But viz systems generally use the extent... :( // this is VERY inaccurate... Have to think about this more... // Its OK for small subgrids, but inaccuracy is unbearable past // 128 elements. Need to compute relative to basegrid extents!, // but that isn't possible without dims for the basegrid! // IObase::setOrigin(origin);// this will set the IObase:: basegrid origin :( // IObase::setDelta(delta); // Storage is in order of liklihood of that param being accessed. // Less-frequently accessed params go to the end. for(int i=0;i=levels.getSize()) levels.setSize(level+1); levels[level].trefine=timerefinement; for(int i=0;i0) (levels[level]).prefine[i]=gridplacementrefinement[i]; else (levels[level]).prefine[i]=spatialrefinement[i]; } } void AMRwriter::setLevelRefinement(int level,int timerefinement, int spatialrefinement, int gridplacementrefinement){ if(level>=levels.getSize()) levels.setSize(level+1); levels[level].trefine=timerefinement; for(int i=0;i0) (levels[level]).prefine[i]=gridplacementrefinement; else (levels[level]).prefine[i]=spatialrefinement; } } void AMRwriter::setOrigin(int *origin){ for(int i=0;isetType(IObase::Int2DataType(numbertype)); } void AMRsetTopLevelParameters(AMRFile afile,int rank, double *origin, double *delta, double timestep,int maxdepth){ AMRwriter *w = (AMRwriter*)afile; w->setTopLevelParameters(rank,origin,delta,timestep,maxdepth); } void AMRsetRefinement(AMRFile afile, int timerefinement, int *spatialrefinement, int *gridplacementrefinement){ AMRwriter *w = (AMRwriter*)afile; w->setRefinement(timerefinement,spatialrefinement,gridplacementrefinement); } void AMRsetScalarRefinement(AMRFile afile, int timerefinement, int spatialrefinement, int gridplacementrefinement){ AMRwriter *w = (AMRwriter*)afile; w->setRefinement(timerefinement,spatialrefinement,gridplacementrefinement); } void AMRsetLevelRefinement(AMRFile afile,int level, int timerefinement, int *spatialrefinement, int *gridplacementrefinement){ AMRwriter *w = (AMRwriter*)afile; w->setLevelRefinement(level,timerefinement,spatialrefinement,gridplacementrefinement); } /* using scalar values) */ void AMRsetScalarLevelRefinement(AMRFile afile,int level, int timerefinement, int spatialrefinement, int gridplacementrefinement){ AMRwriter *w = (AMRwriter*)afile; w->setLevelRefinement(level,timerefinement,spatialrefinement,gridplacementrefinement); } void AMRsetLevel(AMRFile afile,int level){ AMRwriter *w = (AMRwriter*)afile; w->setLevel(level); } void AMRsetTime(AMRFile afile,int time){ AMRwriter *w = (AMRwriter*)afile; w->setTime(time); } void AMRincrementTime(AMRFile afile){ AMRwriter *w = (AMRwriter*)afile; w->incrementTime(); } void AMRwrite(AMRFile afile,int *origin,int *dims,void *data){ AMRwriter *w = (AMRwriter*)afile; w->write(origin,dims,data); } void AMRwriteFloat(AMRFile afile,float *origin,int *dims,void *data){ AMRwriter *w = (AMRwriter*)afile; w->write(origin,dims,data); } void AMRwriteDouble(AMRFile afile,double *origin,int *dims,void *data){ AMRwriter *w = (AMRwriter*)afile; w->write(origin,dims,data); } fAMRFile fAMRbeginFile(IOFile *descriptor){ IObase *io = (IObase*)descriptor; return (fAMRFile)(new FrameworkAMRwriter(*io)); } void fAMRendFile(fAMRFile afile){ FrameworkAMRwriter *w = (FrameworkAMRwriter*)afile; delete w; } void fAMRinit(fAMRFile afile, int datatype, int rank, double *origin, double *delta, double timestep, int interlevelRefinementRatio, int nlevels){ FrameworkAMRwriter *w = (FrameworkAMRwriter*)afile; IObase::DataType dt = IObase::Int2DataType(datatype); w->init(dt,rank,origin,delta,timestep,interlevelRefinementRatio,nlevels); } void fAMRsetParameters(fAMRFile afile, int datatype, int rank, double *origin, double *delta, double timestep, int interlevelRefinementRatio, int nlevels){ fAMRinit(afile,datatype,rank,origin,delta,timestep,interlevelRefinementRatio,nlevels); } inline void fAMRsetLevelParameters(fAMRFile afile, int datatype, int rank, double *origin, double *delta, double timestep, int interlevelRefinementRatio, int nlevels){ fAMRinit(afile,datatype,rank,origin,delta,timestep,interlevelRefinementRatio,nlevels); } void fAMRwrite(fAMRFile afile, int level, int globaltimestep, int *origin, int *dims, void *data){ FrameworkAMRwriter *w = (FrameworkAMRwriter*)afile; w->write(level,globaltimestep,origin,dims,data); } //===========F77/F90 Interface================================== Long8 f_amr_begin(Long8 *descriptor){ IObase *io = (IObase*)descriptor; return (Long8)(new AMRwriter(*io)); } int f_amr_end(Long8 *afile){ AMRwriter *w = (AMRwriter*)afile; delete w; return 1; } int f_amr_settype(Long8 *afile,int *numbertype){ AMRwriter *w = (AMRwriter*)afile; w->setType(IObase::Int2DataType(*numbertype)); return 1; } int f_amr_setparams(Long8 *afile,int *rank,double *origin, double *delta, double *timestep,int *maxdepth){ AMRwriter *w = (AMRwriter*)afile; w->setTopLevelParameters(*rank,origin,delta,*timestep,*maxdepth); return 1; } int f_amr_setref(Long8 *afile,int *veclen, int *timerefinement, int *spatialrefinement, int *gridplacementrefinement){ AMRwriter *w = (AMRwriter*)afile; if(*veclen==1) w->setRefinement(*timerefinement, *spatialrefinement,*gridplacementrefinement); else w->setRefinement(*timerefinement, spatialrefinement,gridplacementrefinement); return 1; } int f_amr_setlref(Long8 *afile,int *level,int *veclen, int *timerefinement, int *spatialrefinement, int *gridplacementrefinement){ AMRwriter *w = (AMRwriter*)afile; if(*veclen==1) w->setLevelRefinement(*level,*timerefinement, *spatialrefinement,*gridplacementrefinement); else w->setLevelRefinement(*level,*timerefinement, spatialrefinement,gridplacementrefinement); return 1; } int f_amr_setlevel (Long8 *afile,int *level){ AMRwriter *w = (AMRwriter*)afile; w->setLevel(*level); return 1; } int f_amr_settime (Long8 *afile,int *timestep){ AMRwriter *w = (AMRwriter*)afile; w->setTime(*timestep); return 1; } int f_amr_incrtime(Long8 *afile){ AMRwriter *w = (AMRwriter*)afile; w->incrementTime(); return 1; } int f_amr_write(Long8 *afile,int *origin, int *dims, void *data){ AMRwriter *w = (AMRwriter*)afile; w->write(origin,dims,data); return 1; } int f_amr_writef(Long8 *afile,float *origin, int *dims, void *data){ AMRwriter *w = (AMRwriter*)afile; w->write(origin,dims,data); return 1; } int f_amr_writed(Long8 *afile,double *origin, int *dims, void *data){ AMRwriter *w = (AMRwriter*)afile; w->write(origin,dims,data); return 1; }