|
EpetraExt Development
|
00001 #include "EpetraExt_ConfigDefs.h" 00002 #ifdef HAVE_MPI 00003 #include "Epetra_MpiComm.h" 00004 #include "mpi.h" 00005 #else 00006 #include "Epetra_SerialComm.h" 00007 #endif 00008 #include "EpetraExt_XMLWriter.h" 00009 #include "Epetra_Map.h" 00010 #include "Epetra_CrsGraph.h" 00011 #include "Epetra_CrsMatrix.h" 00012 #include "Epetra_MultiVector.h" 00013 #include "Teuchos_ParameterList.hpp" 00014 #include "Teuchos_XMLParameterListWriter.hpp" 00015 #include "Teuchos_TestForException.hpp" 00016 00017 using namespace Teuchos; 00018 00019 // ============================================================================ 00020 EpetraExt::XMLWriter:: 00021 XMLWriter(const Epetra_Comm& comm, const std::string& FileName) : 00022 Comm_(comm), 00023 FileName_(FileName), 00024 IsOpen_(false) 00025 {} 00026 00027 // ============================================================================ 00028 void EpetraExt::XMLWriter:: 00029 Create(const std::string& Label) 00030 { 00031 if (Comm_.MyPID() == 0) 00032 { 00033 std::ofstream of(FileName_.c_str()); 00034 of << "<ObjectCollection Label=\"" << Label << "\">" << std::endl; 00035 of.close(); 00036 } 00037 00038 IsOpen_ = true; 00039 } 00040 00041 // ============================================================================ 00042 void EpetraExt::XMLWriter:: Close() 00043 { 00044 if (Comm_.MyPID() == 0) 00045 { 00046 std::ofstream of(FileName_.c_str(), std::ios::app); 00047 of << "</ObjectCollection>" << std::endl; 00048 of.close(); 00049 } 00050 00051 IsOpen_ = false; 00052 } 00053 00054 // ============================================================================ 00055 void EpetraExt::XMLWriter:: 00056 Write(const std::string& Label, const std::vector<std::string>& Content) 00057 { 00058 TEST_FOR_EXCEPTION(IsOpen_ == false, std::logic_error, 00059 "No file has been opened"); 00060 00061 if (Comm_.MyPID()) return; 00062 00063 std::ofstream of(FileName_.c_str(), std::ios::app); 00064 00065 of << "<Text Label=\"" << Label << "\">" << std::endl; 00066 int Csize = (int) Content.size(); 00067 for (int i = 0; i < Csize; ++i) 00068 of << Content[i] << std::endl; 00069 00070 of << "</Text>" << std::endl; 00071 00072 of.close(); 00073 } 00074 00075 // ============================================================================ 00076 void EpetraExt::XMLWriter:: 00077 Write(const std::string& Label, const Epetra_RowMatrix& Matrix) 00078 { 00079 TEST_FOR_EXCEPTION(IsOpen_ == false, std::logic_error, 00080 "No file has been opened"); 00081 00082 int Rows = Matrix.NumGlobalRows(); 00083 int Cols = Matrix.NumGlobalRows(); 00084 int Nonzeros = Matrix.NumGlobalNonzeros(); 00085 00086 if (Comm_.MyPID() == 0) 00087 { 00088 std::ofstream of(FileName_.c_str(), std::ios::app); 00089 of << "<PointMatrix Label=\"" << Label << '"' 00090 << " Rows=\"" << Rows << '"' 00091 << " Columns=\"" << Cols<< '"' 00092 << " Nonzeros=\"" << Nonzeros << '"' 00093 << " Type=\"double\" StartingIndex=\"0\">" << std::endl; 00094 } 00095 00096 int Length = Matrix.MaxNumEntries(); 00097 std::vector<int> Indices(Length); 00098 std::vector<double> Values(Length); 00099 00100 for (int iproc = 0; iproc < Comm_.NumProc(); iproc++) 00101 { 00102 if (iproc == Comm_.MyPID()) 00103 { 00104 std::ofstream of(FileName_.c_str(), std::ios::app); 00105 of.precision(15); 00106 00107 for (int i = 0; i < Matrix.NumMyRows(); ++i) 00108 { 00109 int NumMyEntries; 00110 Matrix.ExtractMyRowCopy(i, Length, NumMyEntries, &Values[0], &Indices[0]); 00111 00112 int GRID = Matrix.RowMatrixRowMap().GID(i); 00113 00114 for (int j = 0; j < NumMyEntries; ++j) 00115 of << GRID << " " << Matrix.RowMatrixColMap().GID(Indices[j]) 00116 << " " << std::setiosflags(std::ios::scientific) << Values[j] << std::endl; 00117 } 00118 of.close(); 00119 } 00120 Comm_.Barrier(); 00121 } 00122 00123 if (Comm_.MyPID() == 0) 00124 { 00125 std::ofstream of(FileName_.c_str(), std::ios::app); 00126 of << "</PointMatrix>" << std::endl; 00127 of.close(); 00128 } 00129 } 00130 00131 // ============================================================================ 00132 void EpetraExt::XMLWriter:: 00133 Write(const std::string& Label, const Epetra_MultiVector& MultiVector) 00134 { 00135 TEST_FOR_EXCEPTION(IsOpen_ == false, std::logic_error, 00136 "No file has been opened"); 00137 00138 int Length = MultiVector.GlobalLength(); 00139 int NumVectors = MultiVector.NumVectors(); 00140 00141 if (Comm_.MyPID() == 0) 00142 { 00143 std::ofstream of(FileName_.c_str(), std::ios::app); 00144 00145 of << "<MultiVector Label=\"" << Label 00146 << "\" Length=\"" << Length << '"' 00147 << " NumVectors=\"" << NumVectors << '"' 00148 << " Type=\"double\">" << std::endl; 00149 } 00150 00151 00152 for (int iproc = 0; iproc < Comm_.NumProc(); iproc++) 00153 { 00154 if (iproc == Comm_.MyPID()) 00155 { 00156 std::ofstream of(FileName_.c_str(), std::ios::app); 00157 00158 of.precision(15); 00159 for (int i = 0; i < MultiVector.MyLength(); ++i) 00160 { 00161 for (int j = 0; j < NumVectors; ++j) 00162 of << std::setiosflags(std::ios::scientific) << MultiVector[j][i] << " "; 00163 of << std::endl; 00164 } 00165 of.close(); 00166 } 00167 Comm_.Barrier(); 00168 } 00169 00170 if (Comm_.MyPID() == 0) 00171 { 00172 std::ofstream of(FileName_.c_str(), std::ios::app); 00173 of << "</MultiVector>" << std::endl; 00174 of.close(); 00175 } 00176 } 00177 00178 // ============================================================================ 00179 void EpetraExt::XMLWriter:: 00180 Write(const std::string& Label, const Epetra_Map& Map) 00181 { 00182 TEST_FOR_EXCEPTION(IsOpen_ == false, std::logic_error, 00183 "No file has been opened"); 00184 00185 int NumGlobalElements = Map.NumGlobalElements(); 00186 int* MyGlobalElements = Map.MyGlobalElements(); 00187 00188 if (Comm_.MyPID() == 0) 00189 { 00190 std::ofstream of(FileName_.c_str(), std::ios::app); 00191 00192 of << "<Map Label=\"" << Label 00193 << "\" NumElements=\"" << NumGlobalElements << '"' 00194 << " IndexBase=\"" << Map.IndexBase() << '"' 00195 << " NumProc=\"" << Comm_.NumProc() << '"'; 00196 00197 of.close(); 00198 } 00199 00200 for (int iproc = 0; iproc < Comm_.NumProc(); ++iproc) 00201 { 00202 if (iproc == Comm_.MyPID()) 00203 { 00204 std::ofstream of(FileName_.c_str(), std::ios::app); 00205 00206 of << " ElementsOnProc" << iproc << "=\"" << Map.NumMyElements() << '"'; 00207 of.close(); 00208 } 00209 Comm_.Barrier(); 00210 } 00211 00212 if (Comm_.MyPID() == 0) 00213 { 00214 std::ofstream of(FileName_.c_str(), std::ios::app); 00215 of << '>' << std::endl; 00216 of.close(); 00217 } 00218 00219 for (int iproc = 0; iproc < Comm_.NumProc(); iproc++) 00220 { 00221 if (iproc == Comm_.MyPID()) 00222 { 00223 std::ofstream of(FileName_.c_str(), std::ios::app); 00224 00225 of << "<Proc ID=\"" << Comm_.MyPID() << "\">" << std::endl; 00226 00227 for (int i = 0; i < Map.NumMyElements(); ++i) 00228 { 00229 of << MyGlobalElements[i] << std::endl; 00230 } 00231 00232 of << "</Proc>" << std::endl; 00233 of.close(); 00234 } 00235 Comm_.Barrier(); 00236 } 00237 00238 if (Comm_.MyPID() == 0) 00239 { 00240 std::ofstream of(FileName_.c_str(), std::ios::app); 00241 of << "</Map>" << std::endl; 00242 of.close(); 00243 } 00244 } 00245 00246 // ============================================================================ 00247 void EpetraExt::XMLWriter:: 00248 Write(const std::string& Label, Teuchos::ParameterList& List) 00249 { 00250 TEST_FOR_EXCEPTION(IsOpen_ == false, std::logic_error, 00251 "No file has been opened"); 00252 00253 if (Comm_.MyPID()) return; 00254 00255 std::ofstream of(FileName_.c_str(), std::ios::app); 00256 00257 of << "<List Label=\"" << Label << "\">" << std::endl; 00258 00259 XMLParameterListWriter Writer; 00260 XMLObject Obj = Writer.toXML(List); 00261 00262 of << Obj.toString(); 00263 00264 of << "</List>" << std::endl; 00265 00266 of.close(); 00267 }
1.7.4