/*@@ @file Write2D.c @date @author Gabrielle Allen @desc @enddesc @version $Header$ @@*/ #include "cctk.h" #include #include #ifdef HAVE_UNISTD_H #include #endif #include "cctk_Parameters.h" #include "CactusBase/IOUtil/src/ioutil_AdvertisedFiles.h" #include "IOJpeg.h" static char *rcsid = "$Header$"; CCTK_FILEVERSION(DevThorns_IOJpeg_Write2D_c) /******************************************************************** ********************* Local Data Types *********************** ********************************************************************/ /******************************************************************** ********************* Local Routine Prototypes ********************* ********************************************************************/ int IOJpeg_NumDirection(int sdim, int vdim); int IOJpeg_SetDirection(int vdim, int sdim, int ci, int *direction); /******************************************************************** ********************* Other Routine Prototypes ********************* ********************************************************************/ /******************************************************************** ********************* Local Data ***************************** ********************************************************************/ static int **advertised; #ifdef _WIN32 #define FILEOPENSTRING "wb" #else #define FILEOPENSTRING "w" #endif /******************************************************************** ********************* External Routines ********************** ********************************************************************/ /*@@ @routine IOJpeg_Write2D @date @author Gabrielle Allen @desc @enddesc @calls @calledby @history @endhistory @@*/ int IOJpeg_Write2D (cGH *GH, int index, const char *alias) { DECLARE_CCTK_PARAMETERS int timelevel; IOJpegGH *ssGH; IOJpegGeo_t geo; FILE **fdset_2D; /* array of output file pointers */ int SDIM; int si,max_slabs; int ierr=0; /* Get the handle for IO extensions */ ssGH = (IOJpegGH *) GH->extensions [CCTK_GHExtensionHandle ("IOJpeg")]; /* The dimension of the slab - HARDCODED */ SDIM = 2; /* Get the slab geometry for 2D slabs */ geo = ssGH->out_geo[index][SDIM]; /* Set geo.sdim to announce 2D output */ geo.sdim = SDIM; /* get the dimension of the variable */ geo.vdim = CCTK_GroupDimFromVarI(index); if (!CCTK_Equals(verbose,"no")) CCTK_VInfo (CCTK_THORNSTRING, "IOJpeg %dD-output of variable '%s', " "downsampling parameters (%d, %d, %d)", SDIM, alias, geo.downs[0], geo.downs [1], geo.downs [2]); /* get the current timelevel */ timelevel = CCTK_NumTimeLevelsFromVarI (index) - 1; if (timelevel > 0) timelevel--; /* Maximal number of slabs (dimension sdim) in given volume (dimension vdim) */ if ((max_slabs=IOJpeg_NumDirection(SDIM, geo.vdim))<0) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Cannot get valid number of slabs (%d) for given volume (%d).\n", SDIM, geo.vdim); return(-1); } /* see if output file for this alias name was already created */ fdset_2D = (FILE **) GetNamedData (ssGH->fileList_2D, alias); { char *fname; if (!fdset_2D) { fdset_2D = (FILE **) malloc (max_slabs * sizeof (FILE *)); } fname = (char *) malloc ((strlen (ssGH->outdir2D) + strlen (alias) + 20)*sizeof(char)); /* Set flags for remembering if files have been advertised */ if (!advertised) { int i; advertised = (int **)malloc(max_slabs*sizeof(int *)); for (si=0;sioutdir2D,alias, extensions [si]); } else { sprintf (fname, "%s/%s_2d_%s.%d.jpeg", ssGH->outdir2D,alias, extensions [si],GH->cctk_iteration); } fdset_2D [si] = fopen (fname, FILEOPENSTRING); if (! fdset_2D [si]) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Cannot open 2D output file '%s'", fname); return (-1); } /* advertise the file for downloading */ if (CCTK_Equals(mode,"remove") && advertised[si][index]==0) { advertised_file.slice = (char *) extensions [si]; advertised_file.thorn = CCTK_THORNSTRING; advertised_file.varname = CCTK_FullName (index); advertised_file.description = "Jpegs of slices"; advertised_file.mimetype = "image/jpeg"; IOUtil_AdvertiseFile (GH, fname, &advertised_file); advertised[si][index] = 1; free (advertised_file.varname); } } /* store file desriptors in database */ StoreNamedData (&ssGH->fileList_2D, alias, fdset_2D); /* ********************************************** The call to the actual data collection and lowlevel output routine. ********************************************** */ ierr = IOJpeg_DumpVar(GH, index, timelevel, &geo, fdset_2D[si]); if (ierr<0) CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "IOJpeg_DumpVar failed for GF index: %d\n", index); /* ********************************************** File close procedures which are more complex, like for HDF5 can go here. ********************************************** */ if(CCTK_MyProc(GH) == 0) { /* Close the file */ fclose (fdset_2D [si]); } } free(fname); } return(ierr); } /******************************************************************** ********************* Local Routines ************************* ********************************************************************/