00001
00002
00003
00004
00005
00006 FABio*
00007 FABio::read_header (std::istream& is,
00008 FArrayBox& f)
00009 {
00010 int nvar;
00011 Box bx;
00012 FABio* fio = 0;
00013 RealDescriptor* rd = 0;
00014 char c;
00015
00016 is >> c;
00017 if (c != 'F') BoxLib::Error("FABio::read_header(): expected \'F\'");
00018 is >> c;
00019 if (c != 'A') BoxLib::Error("FABio::read_header(): expected \'A\'");
00020 is >> c;
00021 if (c != 'B') BoxLib::Error("FABio::read_header(): expected \'B\'");
00022
00023 is >> c;
00024 if (c == ':')
00025 {
00026
00027
00028
00029 int typ_in, wrd_in;
00030 is >> typ_in;
00031 is >> wrd_in;
00032
00033 char machine[128];
00034 is >> machine;
00035 is >> bx;
00036 is >> nvar;
00037
00038
00039
00040 f.resize(bx,nvar);
00041 is.ignore(BL_IGNORE_MAX, '\n');
00042 switch (typ_in)
00043 {
00044 case FABio::FAB_ASCII: fio = new FABio_ascii; break;
00045 case FABio::FAB_8BIT: fio = new FABio_8bit; break;
00046 case FABio::FAB_NATIVE:
00047 case FABio::FAB_IEEE:
00048 rd = RealDescriptor::newRealDescriptor(typ_in,
00049 wrd_in,
00050 machine,
00051 FArrayBox::ordering);
00052 fio = new FABio_binary(rd);
00053 break;
00054 default:
00055 BoxLib::Error("FABio::read_header(): Unrecognized FABio header");
00056 }
00057 }
00058 else
00059 {
00060
00061
00062
00063 is.putback(c);
00064 rd = new RealDescriptor;
00065 is >> *rd;
00066 is >> bx;
00067 is >> nvar;
00068
00069
00070
00071 f.resize(bx,nvar);
00072 is.ignore(BL_IGNORE_MAX, '\n');
00073 fio = new FABio_binary(rd);
00074 }
00075
00076 if (is.fail())
00077 BoxLib::Error("FABio::read_header() failed");
00078
00079 return fio;
00080 }
00081
00082
00083 FABio*
00084 FABio::read_header (std::istream& is,
00085 FArrayBox& f,
00086 int compIndex,
00087 int& nCompAvailable)
00088 {
00089 int nvar;
00090 Box bx;
00091 FABio* fio = 0;
00092 RealDescriptor* rd = 0;
00093 char c;
00094
00095 is >> c;
00096 if (c != 'F') BoxLib::Error("FABio::read_header(): expected \'F\'");
00097 is >> c;
00098 if (c != 'A') BoxLib::Error("FABio::read_header(): expected \'A\'");
00099 is >> c;
00100 if (c != 'B') BoxLib::Error("FABio::read_header(): expected \'B\'");
00101
00102 is >> c;
00103 if (c == ':')
00104 {
00105
00106
00107
00108 int typ_in, wrd_in;
00109 is >> typ_in;
00110 is >> wrd_in;
00111
00112 char machine[128];
00113 is >> machine;
00114 is >> bx;
00115 is >> nvar;
00116 nCompAvailable = nvar;
00117 nvar = 1;
00118
00119
00120
00121 f.resize(bx,nvar);
00122 is.ignore(BL_IGNORE_MAX, '\n');
00123 switch (typ_in)
00124 {
00125 case FABio::FAB_ASCII: fio = new FABio_ascii; break;
00126 case FABio::FAB_8BIT: fio = new FABio_8bit; break;
00127 case FABio::FAB_NATIVE:
00128 case FABio::FAB_IEEE:
00129 rd = RealDescriptor::newRealDescriptor(typ_in,
00130 wrd_in,
00131 machine,
00132 FArrayBox::ordering);
00133 fio = new FABio_binary(rd);
00134 break;
00135 default:
00136 BoxLib::Error("FABio::read_header(): Unrecognized FABio header");
00137 }
00138 }
00139 else
00140 {
00141
00142
00143
00144 is.putback(c);
00145 rd = new RealDescriptor;
00146 is >> *rd;
00147 is >> bx;
00148 is >> nvar;
00149 nCompAvailable = nvar;
00150 nvar = 1;
00151
00152
00153
00154 f.resize(bx,nvar);
00155 is.ignore(BL_IGNORE_MAX, '\n');
00156 fio = new FABio_binary(rd);
00157 }
00158
00159 if (is.fail())
00160 BoxLib::Error("FABio::read_header() failed");
00161
00162 return fio;
00163 }
00164
00165 void
00166 FArrayBox::writeOn (std::ostream& os,
00167 int comp,
00168 int num_comp) const
00169 {
00170 BL_ASSERT(comp >= 0 && num_comp >= 1 && (comp+num_comp) <= nComp());
00171 fabio->write_header(os, *this, num_comp);
00172 fabio->write(os, *this, comp, num_comp);
00173 }
00174
00175 void
00176 FArrayBox::readFrom (std::istream& is)
00177 {
00178 FABio* fabrd = FABio::read_header(is, *this);
00179 fabrd->read(is, *this);
00180 delete fabrd;
00181 }
00182
00183
00184 int
00185 FArrayBox::readFrom (std::istream& is, int compIndex)
00186 {
00187 int nCompAvailable;
00188 FABio* fabrd = FABio::read_header(is, *this, compIndex, nCompAvailable);
00189 BL_ASSERT(compIndex >= 0 && compIndex < nCompAvailable);
00190
00191 fabrd->skip(is, *this, compIndex);
00192 fabrd->read(is, *this);
00193 int remainingComponents = nCompAvailable - compIndex - 1;
00194 fabrd->skip(is, *this, remainingComponents);
00195
00196 delete fabrd;
00197 return nCompAvailable;
00198 }
00199
00200
00201 Box
00202 FArrayBox::skipFAB (std::istream& is,
00203 int& num_comp)
00204 {
00205 FArrayBox f;
00206 FABio* fabrd = FABio::read_header(is, f);
00207 fabrd->skip(is, f);
00208 delete fabrd;
00209 num_comp = f.nComp();
00210 return f.box();
00211 }
00212
00213 void
00214 FABio_ascii::write (std::ostream& os,
00215 const FArrayBox& f,
00216 int comp,
00217 int num_comp) const
00218 {
00219 BL_ASSERT(comp >= 0 && num_comp >= 1 && (comp+num_comp) <= f.nComp());
00220
00221 const Box& bx = f.box();
00222
00223 IntVect sm = bx.smallEnd();
00224 IntVect bg = bx.bigEnd();
00225
00226 for (IntVect p = sm; p <= bg; bx.next(p))
00227 {
00228 os << p;
00229 for (int k=0; k < num_comp; k++)
00230 os << " " << f(p,k+comp);
00231 os << '\n';
00232 }
00233 os << '\n';
00234
00235 if (os.fail())
00236 BoxLib::Error("FABio_ascii::write() failed");
00237 }
00238
00239 void
00240 FABio_ascii::read (std::istream& is,
00241 FArrayBox& f) const
00242 {
00243 const Box& bx = f.box();
00244
00245 IntVect sm = bx.smallEnd();
00246 IntVect bg = bx.bigEnd();
00247 IntVect p, q;
00248 for (p = sm; p <= bg; bx.next(p))
00249 {
00250 is >> q;
00251 if (p != q)
00252 {
00253 std::cerr << "Error: read IntVect "
00254 << q
00255 << " should be "
00256 << p
00257 << '\n';
00258 BoxLib::Error("FABio_ascii::read() bad IntVect");
00259 }
00260 for (int k = 0; k < f.nComp(); k++)
00261 is >> f(p, k);
00262 }
00263
00264 if (is.fail())
00265 BoxLib::Error("FABio_ascii::read() failed");
00266 }
00267
00268 void
00269 FABio_ascii::skip (std::istream& is,
00270 FArrayBox& f) const
00271 {
00272 FABio_ascii::read(is, f);
00273 }
00274
00275 void
00276 FABio_ascii::skip (std::istream& is,
00277 FArrayBox& f,
00278 int nCompToSkip) const
00279 {
00280 BoxLib::Error("FABio_ascii::skip(..., int nCompToSkip) not implemented");
00281 }
00282
00283 void
00284 FABio_ascii::write_header (std::ostream& os,
00285 const FArrayBox& f,
00286 int nvar) const
00287 {
00288 os << "FAB: "
00289 << FABio::FAB_ASCII
00290 << ' '
00291 << 0
00292 << ' '
00293 << sys_name
00294 << '\n';
00295 FABio::write_header(os, f, nvar);
00296 }
00297
00298 void
00299 FABio_8bit::write (std::ostream& os,
00300 const FArrayBox& f,
00301 int comp,
00302 int num_comp) const
00303 {
00304 BL_ASSERT(comp >= 0 && num_comp >= 1 && (comp+num_comp) <= f.nComp());
00305
00306 const Real eps = Real(1.0e-8);
00307 const long siz = f.box().numPts();
00308
00309 unsigned char* c = new unsigned char[siz];
00310
00311 for (int k = 0; k < num_comp; k++)
00312 {
00313 const Real mn = f.min(k+comp);
00314 const Real mx = f.max(k+comp);
00315 const Real* dat = f.dataPtr(k+comp);
00316 Real rng = std::abs(mx-mn);
00317 rng = (rng < eps) ? 0.0 : 255.0/(mx-mn);
00318 for (long i = 0; i < siz; i++)
00319 {
00320 Real v = rng*(dat[i]-mn);
00321 int iv = (int) v;
00322 c[i] = (unsigned char) iv;
00323 }
00324 os << mn << " " << mx << '\n' << siz << '\n';
00325 os.write((char*)c,siz);
00326 }
00327
00328 delete [] c;
00329
00330 if (os.fail())
00331 BoxLib::Error("FABio_8bit::write() failed");
00332 }