1 | /*************************************** 2 | $Header$ 3 | 4 | This file contains functions for importing and exporting data to/from foreign 5 | file formats. Thus far only .tiff images are supported. 6 | ***************************************/ 7 | 8 | 9 | #include "illuminator.h" /* Also includes petscda.h */ 10 | 11 | /* Build with -DDEBUG for debugging output */ 12 | #undef DPRINTF 13 | #ifdef DEBUG 14 | #define DPRINTF(fmt, args...) ierr = PetscPrintf (comm, "%s: " fmt, __FUNCT__, args); CHKERRQ (ierr) 15 | #else 16 | #define DPRINTF(fmt, args...) 17 | #endif 18 | 19 | 20 | #undef __FUNCT__ 21 | #define __FUNCT__ "IllImageWrite" 22 | 23 | 24 | /*++++++++++++++++++++++++++++++++++++++ 25 | This writes a single monochrome .tif image from a double array for IllImageSave(). 26 | 27 | inline int IllImageWrite It returns zero or an error code. 28 | 29 | double *array Array of values to use as intensity values in the image, 30 | pointing to first red value. 31 | 32 | int xm Width of the array rows. 33 | 34 | int ym Number of rows in the array. 35 | 36 | int stride Number of doubles per point. 37 | 38 | int gxm Number of points between row starts. 39 | 40 | int goff Offest for green field. 41 | 42 | int boff Offest for blue field. 43 | 44 | char *basename Base file name; if the last four chars aren't ".tif" this 45 | appends that. 46 | 47 | PetscScalar minval Array value mapping to black. 48 | 49 | PetscScalar maxval Array value mapping to white. 50 | ++++++++++++++++++++++++++++++++++++++*/ 51 | 52 | static inline int IllImageWrite 53 | (double *array, int xm,int ym,int stride,int gxm, int goff,int boff, 54 | char *basename, PetscScalar minval,PetscScalar maxval) 55 | { 56 | /* Make the file name */ 57 | /* Open the file */ 58 | /* Make the header */ 59 | /* Loop through and write the data */ 60 | /* Close everything */ 61 | } 62 | 63 | 64 | #undef __FUNCT__ 65 | #define __FUNCT__ "IllImageSave" 66 | 67 | /*++++++++++++++++++++++++++++++++++++++ 68 | This function stores one field as an image. In 2-D, it stores the whole 69 | thing; in 3-D, it stores one image per layer. 70 | 71 | int IllImageSave It returns zero or an error code. 72 | 73 | MPI_COMM comm MPI communicator, if NULL it uses PETSC_COMM_WORLD. 74 | 75 | DA theda Distributed array object controlling data saved. 76 | 77 | Vec X Vector whose data are actually being saved. 78 | 79 | char *basename Base file name. 80 | 81 | int field Field index. 82 | 83 | PetscScalar *rgbmin Field values to use for image R,G,B zero. 84 | 85 | PetscScalar *rgbmax Field values to use for image R,G,B max. 86 | 87 | int *coordrange Minimum and maximum x, y, z to store (PETSC_NULL for the 88 | whole thing). 89 | 90 | IllLayerStyle layer Layer style to use for 3-D DA. 91 | 92 | IllImageFormat format Image format. 93 | ++++++++++++++++++++++++++++++++++++++*/ 94 | 95 | int IllImageSave 96 | (MPI_Comm comm, DA theda, Vec X, char *basename, 97 | int redfield,int greenfield,int bluefield, 98 | PetscScalar *rgbmin,PetscScalar *rgbmax, int *coordrange, 99 | IllLayerStyle layer, IllImageFormat format) 100 | { 101 | 102 | /* Get size, if > 1 then SETERRQ only one processor for now */ 103 | /* Get array */ 104 | /* Get dimensions, if 2 then fall through to IllImageWrite */ 105 | /* If layer isn't DEFAULT or Z_UP then SETERRQ only Z_UP for now */ 106 | /* For 3-D: loop through planes, calling IllImageWrite for each */ 107 | 108 | /* if (snprintf (filename, 999, "%s.cpu%.4d.data", basename, rank) > 999) 109 | SETERRQ1 (PETSC_ERR_ARG_SIZ, 110 | "Base file name too long (%d chars, 960 max)", 111 | strlen (basename)); 112 | if (!(outfile = fopen (filename, "w"))) 113 | SETERRQ4 (PETSC_ERR_FILE_OPEN, 114 | "CPU %d: error %d (%s) opening output file \"%s\"", 115 | rank, errno, strerror (errno), filename); 116 | 117 | switch (compressed & COMPRESS_INT_MASK) 118 | { 119 | case COMPRESS_INT_LONG: 120 | { 121 | guint32 *storage; 122 | if (!(storage = (guint32 *) malloc 123 | (gridpoints * dof * sizeof (guint32)))) 124 | SETERRQ (PETSC_ERR_MEM, "Can't allocate data compression buffer"); 125 | for (i=0; i<gridpoints*dof; i++) 126 | storage [i] = (guint32) 127 | (4294967295. * (globalarray [i] - fieldmin [i%dof]) / 128 | (fieldmax [i%dof] - fieldmin [i%dof])); 129 | writeout = fwrite (storage, sizeof (guint32), gridpoints*dof, outfile); 130 | free (storage); 131 | break; 132 | } 133 | case COMPRESS_INT_SHORT: 134 | { 135 | guint16 *storage; 136 | if (!(storage = (guint16 *) malloc 137 | (gridpoints * dof * sizeof (guint16)))) 138 | SETERRQ (PETSC_ERR_MEM, "Can't allocate data compression buffer"); 139 | for (i=0; i<gridpoints*dof; i++) 140 | storage [i] = (guint16) 141 | (65535. * (globalarray [i] - fieldmin [i%dof]) / 142 | (fieldmax [i%dof] - fieldmin [i%dof])); 143 | writeout = fwrite (storage, sizeof (guint16), gridpoints*dof,outfile); 144 | free (storage); 145 | break; 146 | } 147 | case COMPRESS_INT_CHAR: 148 | { 149 | guint8 *storage; 150 | if (!(storage = (guint8 *) malloc 151 | (gridpoints * dof * sizeof (guint8)))) 152 | SETERRQ (PETSC_ERR_MEM, "Can't allocate data compression buffer"); 153 | for (i=0; i<gridpoints*dof; i++) 154 | storage [i] = (guint8) 155 | (255. * (globalarray [i] - fieldmin [i%dof]) / 156 | (fieldmax [i%dof] - fieldmin [i%dof])); 157 | writeout = fwrite (storage, sizeof (guint8), gridpoints*dof, outfile); 158 | free (storage); 159 | break; 160 | } 161 | default: 162 | writeout = fwrite (globalarray, sizeof (PetscScalar), gridpoints*dof, 163 | outfile); 164 | } 165 | 166 | if (compressed & COMPRESS_GZIP_MASK) 167 | pclose (outfile); 168 | else 169 | fclose (outfile); 170 | 171 | if (writeout < gridpoints*dof) 172 | { 173 | int writerr = ferror (outfile); 174 | SETERRQ5 (PETSC_ERR_FILE_READ, 175 | "CPU %d: error %d (%s) during write, sent %d of %d items", 176 | rank, writerr, strerror (writerr), writeout, gridpoints*dof); 177 | } */ 178 | 179 | return 0; 180 | }