00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <WriterRaw.hpp>
00021 #include <Mesh.hpp>
00022
00023 #include <fstream>
00024
00025 #include <ScalarFunctionBase.hpp>
00026 #include <FieldOfScalarFunction.hpp>
00027
00028 #include <FEMFunction.hpp>
00029
00030 #include <config.h>
00031 #include <EndianConverter.hpp>
00032
00033 void WriterRaw::
00034 __saveScalarFunction(std::ostream& file,
00035 const ScalarFunctionBase& f) const
00036 {
00037 Vector<double> values(__mesh->numberOfVertices());
00038
00039 switch (f.type()) {
00040 case ScalarFunctionBase::femfunction: {
00041 const FEMFunctionBase& fem
00042 = static_cast<const FEMFunctionBase&>(f);
00043 if (fem.baseMesh() == __mesh) {
00044 for (size_t i=0; i<values.size(); ++i) {
00045 values[i] = static_cast<double>(fem[i]);
00046 }
00047 break;
00048 }
00049 }
00050 default: {
00051 for (size_t i=0; i<values.size(); ++i) {
00052 const TinyVector<3,real_t>& X = __mesh->vertex(i);
00053 values[i] = f(X);
00054 }
00055 }
00056 }
00057
00058 switch (__fileDescriptor.type()) {
00059 case FileDescriptor::binary: {
00060
00061 #ifdef WORDS_BIGENDIAN
00062 littleEndianize(values);
00063 #endif // WORDS_BIGENDIAN
00064
00065 file.write(reinterpret_cast<char*>(&values[0]),
00066 values.size()*sizeof(double)/sizeof(char));
00067 break;
00068 }
00069 case FileDescriptor::formatDefault:
00070 case FileDescriptor::dos:
00071 case FileDescriptor::mac:
00072 case FileDescriptor::unices: {
00073 for (size_t i=0; i<values.size(); ++i) {
00074 file << values[i] << __CR;
00075 }
00076 break;
00077 }
00078 default: {
00079 throw ErrorHandler(__FILE__,__LINE__,
00080 "unexpected file type",
00081 ErrorHandler::unexpected);
00082 }
00083 }
00084 }
00085
00086
00087 void WriterRaw::
00088 proceed() const
00089 {
00090 std::ofstream file(__filename.c_str());
00091 if (file.bad()) {
00092 throw ErrorHandler(__FILE__,__LINE__,
00093 "cannot open file '"
00094 +stringify(__filename)+"'",
00095 ErrorHandler::normal);
00096 }
00097
00098 if (__fieldList.size() + __scalarFunctionList.size() == 0) {
00099 throw ErrorHandler(__FILE__,__LINE__,
00100 "cannot save mesh in raw format: '"
00101 +stringify(__filename)+"'",
00102 ErrorHandler::normal);
00103 }
00104
00105 if (__fieldList.size() + __scalarFunctionList.size() > 1) {
00106 throw ErrorHandler(__FILE__,__LINE__,
00107 "cannot save more than one field or function in raw format: '"
00108 +stringify(__filename)+"'",
00109 ErrorHandler::normal);
00110 }
00111
00112 if (__fieldList.size() > 0) {
00113 const FieldOfScalarFunction& field = *__fieldList[0];
00114 for (size_t i = 0; i<field.numberOfComponents(); ++i) {
00115 const ScalarFunctionBase& f = *field.function(i);
00116 __saveScalarFunction(file,f);
00117 }
00118 }
00119
00120
00121 if (__scalarFunctionList.size() > 0) {
00122 const ScalarFunctionBase& f = *__scalarFunctionList[0];
00123 __saveScalarFunction(file,f);
00124 }
00125 }
00126
00127 WriterRaw::
00128 WriterRaw(ConstReferenceCounting<Mesh> mesh,
00129 const std::string& filename,
00130 const FileDescriptor& fileDescriptor)
00131 : WriterBase(mesh,
00132 filename,
00133 fileDescriptor)
00134 {
00135 ;
00136 }
00137
00138 WriterRaw::
00139 ~WriterRaw()
00140 {
00141 ;
00142 }