00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "MeshalyzerMeshWriter.hpp"
00030 #include "Version.hpp"
00031
00032
00033 #include "AbstractTetrahedralMesh.hpp"
00034 #include "DistributedTetrahedralMesh.hpp"
00035
00036
00038
00040
00041 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00042 MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::MeshalyzerMeshWriter(const std::string &rDirectory,
00043 const std::string &rBaseName,
00044 const bool &rCleanDirectory,
00045 const bool &rSetCoolGraphics)
00046 : AbstractTetrahedralMeshWriter<ELEMENT_DIM, SPACE_DIM>(rDirectory, rBaseName, rCleanDirectory)
00047 {
00048
00049
00050
00051
00052
00053 if (rSetCoolGraphics)
00054 {
00055 this->mIndexFromZero = false;
00056 this->mWriteMetaFile = true;
00057 }
00058 else
00059 {
00060 this->mIndexFromZero = true;
00061 this->mWriteMetaFile = false;
00062 }
00063 }
00064
00065 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00066 void MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::WriteFiles()
00067 {
00068 std::string comment = "# " + ChasteBuildInfo::GetProvenanceString();
00069
00070
00071 out_stream p_node_file = OpenNodeFile();
00072
00073
00074 unsigned num_nodes = this->GetNumNodes();
00075 *p_node_file << num_nodes << "\n";
00076
00077
00078 for (unsigned item_num=0; item_num<num_nodes; item_num++)
00079 {
00080 std::vector<double> current_item = this->GetNextNode();
00081 for (unsigned i=0; i<SPACE_DIM; i++)
00082 {
00083 *p_node_file << current_item[i] << "\t";
00084 }
00085 if (SPACE_DIM==2)
00086 {
00087 *p_node_file << 0 << "\t";
00088 }
00089 if (SPACE_DIM==1)
00090 {
00091 *p_node_file << 0 << "\t" << 0 << "\t";
00092 }
00093 *p_node_file << "\n";
00094
00095 }
00096 *p_node_file << comment;
00097 p_node_file->close();
00098
00099
00100 std::string element_file_name;
00101
00102 if (ELEMENT_DIM == 3)
00103 {
00104 element_file_name = this->mBaseName + ".tetras";
00105 }
00106 else if (ELEMENT_DIM == 2)
00107 {
00108 element_file_name = this->mBaseName + ".tri";
00109 }
00110 else
00111 {
00112 element_file_name = this->mBaseName + ".cnnx";
00113 }
00114
00115 out_stream p_element_file = OpenElementFile();
00116
00117
00118 unsigned num_elements = this->GetNumElements();
00119
00120 *p_element_file << num_elements << "\n";
00121
00122
00123 unsigned nodes_per_element = ELEMENT_DIM+1;
00124 for (unsigned item_num=0; item_num<num_elements; item_num++)
00125 {
00126 ElementData element_data = this->GetNextElement();
00127
00128 std::vector<unsigned> current_item = element_data.NodeIndices;
00129 for (unsigned i=0; i<nodes_per_element; i++)
00130 {
00131 if (this->mIndexFromZero)
00132 {
00133 *p_element_file << current_item[i] << "\t";
00134 }
00135 else
00136 {
00137 *p_element_file << current_item[i]+1 << "\t";
00138 }
00139 }
00140
00141 *p_element_file << element_data.AttributeValue << "\n";
00142 }
00143 *p_element_file << comment;
00144 p_element_file->close();
00145
00146 if (ELEMENT_DIM==3)
00147 {
00148
00149 out_stream p_face_file = OpenFaceFile();
00150
00151
00152 unsigned num_faces = this->GetNumBoundaryFaces();
00153
00154 *p_face_file << num_faces << "\n";
00155
00156
00157 double material_property = 0.0;
00158 for (unsigned item_num=0; item_num<num_faces; item_num++)
00159 {
00160 ElementData current_item = this->GetNextBoundaryElement();
00161 for (unsigned i=0; i<ELEMENT_DIM; i++)
00162 {
00163 if (this->mIndexFromZero)
00164 {
00165 *p_face_file << current_item.NodeIndices[i] << "\t";
00166 }
00167 else
00168 {
00169 *p_face_file << current_item.NodeIndices[i]+1 <<"\t";
00170 }
00171 }
00172 *p_face_file << material_property << "\n";
00173 }
00174 *p_face_file << comment;
00175 p_face_file->close();
00176
00177 WriteMetaFile();
00178 }
00179 }
00180
00181 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00182 MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::~MeshalyzerMeshWriter()
00183 {
00184 }
00185
00186
00187
00188 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00189 void MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::WriteMetaFile()
00190 {
00191 if (this->mWriteMetaFile)
00192 {
00193 std::string meta_file_name = this->mBaseName + ".cg_in";
00194 out_stream p_meta_file = this->mpOutputFileHandler->OpenOutputFile(meta_file_name);
00195
00196 *p_meta_file << "1\n" << "0\n";
00197 std::string face_file_name = this->mBaseName + ".tri";
00198 *p_meta_file << face_file_name <<"\n";
00199 std::string comment = "# " + ChasteBuildInfo::GetProvenanceString();
00200 *p_meta_file << comment;
00201 p_meta_file->close();
00202 }
00203 }
00204
00205 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00206 std::ios_base::openmode MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::GetOpenMode(bool append)
00207 {
00208 std::ios_base::openmode mode = std::ios::out;
00209 if (append)
00210 {
00211 mode |= std::ios::app;
00212 }
00213 else
00214 {
00215 mode |= std::ios::trunc;
00216 }
00217 return mode;
00218 }
00219
00220 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00221 out_stream MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::OpenNodeFile(bool append)
00222 {
00223 std::string node_file_name = this->mBaseName + ".pts";
00224 return this->mpOutputFileHandler->OpenOutputFile(node_file_name, GetOpenMode(append));
00225 }
00226
00227 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00228 out_stream MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::OpenElementFile(bool append)
00229 {
00230 std::string element_file_name;
00231
00232 if (ELEMENT_DIM == 3)
00233 {
00234 element_file_name = this->mBaseName + ".tetras";
00235 }
00236 else if (ELEMENT_DIM == 2)
00237 {
00238 element_file_name = this->mBaseName + ".tri";
00239 }
00240 else
00241 {
00242 element_file_name = this->mBaseName + ".cnnx";
00243 }
00244
00245 return this->mpOutputFileHandler->OpenOutputFile(element_file_name, GetOpenMode(append));
00246 }
00247
00248 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00249 out_stream MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::OpenFaceFile(bool append)
00250 {
00251 std::string face_file_name = this->mBaseName + ".tri";
00252 return this->mpOutputFileHandler->OpenOutputFile(face_file_name, GetOpenMode(append));
00253 }
00254
00255 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00256 void MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::CreateFilesWithHeaders()
00257 {
00258
00259
00260
00261 out_stream p_node_file = OpenNodeFile();
00262
00263
00264 unsigned num_nodes = this->GetNumNodes();
00265 *p_node_file << num_nodes << "\n";
00266
00267 p_node_file->close();
00268
00269
00270
00271
00272
00273 out_stream p_element_file = OpenElementFile();
00274
00275
00276 unsigned num_elements = this->GetNumElements();
00277 *p_element_file << num_elements << "\n";
00278
00279 p_element_file->close();
00280
00281
00282
00283
00284 if (ELEMENT_DIM==3)
00285 {
00286
00287 out_stream p_face_file = OpenFaceFile();
00288
00289
00290 unsigned num_faces = this->GetNumBoundaryFaces();
00291 *p_face_file << num_faces << "\n";
00292
00293 p_face_file->close();
00294
00295 WriteMetaFile();
00296 }
00297
00298 }
00299
00300 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00301 void MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::AppendLocalDataToFiles()
00302 {
00303 out_stream p_node_file = OpenNodeFile(true);
00304
00305 typedef typename AbstractMesh<ELEMENT_DIM,SPACE_DIM>::NodeIterator NodeIterType;
00306
00307 for (NodeIterType iter = this->mpDistributedMesh->GetNodeIteratorBegin();
00308 iter != this->mpDistributedMesh->GetNodeIteratorEnd();
00309 ++iter)
00310 {
00311 const c_vector<double, SPACE_DIM>& r_current_item = iter->rGetLocation();
00312 for (unsigned i=0; i<SPACE_DIM; i++)
00313 {
00314 *p_node_file << r_current_item[i] << "\t";
00315 }
00316 if (SPACE_DIM==2)
00317 {
00318 *p_node_file << 0 << "\t";
00319 }
00320 if (SPACE_DIM==1)
00321 {
00322 *p_node_file << 0 << "\t" << 0 << "\t";
00323 }
00324 *p_node_file << "\n";
00325 }
00326 p_node_file->close();
00327
00328 out_stream p_element_file = OpenElementFile(true);
00329
00330 typedef typename AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>::ElementIterator ElemIterType;
00331
00332 for (ElemIterType iter = this->mpDistributedMesh->GetElementIteratorBegin();
00333 iter != this->mpDistributedMesh->GetElementIteratorEnd();
00334 ++iter)
00335 {
00336 if ( this->mpDistributedMesh->CalculateDesignatedOwnershipOfElement(iter->GetIndex()))
00337 {
00338 for (unsigned i=0; i<this->mNodesPerElement; i++)
00339 {
00340 if (this->mIndexFromZero)
00341 {
00342 *p_element_file << iter->GetNodeGlobalIndex(i) << "\t";
00343 }
00344 else
00345 {
00346 *p_element_file << iter->GetNodeGlobalIndex(i)+1 << "\t";
00347 }
00348 }
00349
00350 *p_element_file << iter->GetRegion() << "\n";
00351 }
00352 }
00353 p_element_file->close();
00354
00355
00356 if (ELEMENT_DIM == 3)
00357 {
00358 out_stream p_face_file = OpenFaceFile(true);
00359
00360 typedef typename AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>::BoundaryElementIterator BoundaryElemIterType;
00361
00362 for (BoundaryElemIterType iter = this->mpDistributedMesh->GetBoundaryElementIteratorBegin();
00363 iter != this->mpDistributedMesh->GetBoundaryElementIteratorEnd();
00364 ++iter)
00365 {
00366 if ( this->mpDistributedMesh->CalculateDesignatedOwnershipOfBoundaryElement((*iter)->GetIndex()))
00367 {
00368 for (unsigned i=0; i<ELEMENT_DIM; i++)
00369 {
00370 if (this->mIndexFromZero)
00371 {
00372 *p_face_file << (*iter)->GetNodeGlobalIndex(i) << "\t";
00373 }
00374 else
00375 {
00376 *p_face_file << (*iter)->GetNodeGlobalIndex(i)+1 << "\t";
00377 }
00378 }
00379
00380 *p_face_file << (*iter)->GetRegion() << "\n";
00381 }
00382 }
00383 p_face_file->close();
00384 }
00385 }
00386
00387 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00388 void MeshalyzerMeshWriter<ELEMENT_DIM, SPACE_DIM>::WriteFilesFooter()
00389 {
00390 std::string comment = "# " + ChasteBuildInfo::GetProvenanceString();
00391
00392 out_stream p_node_file = OpenNodeFile(true);
00393 *p_node_file << comment;
00394 p_node_file->close();
00395
00396 out_stream p_element_file = OpenElementFile(true);
00397 *p_element_file << comment;
00398 p_element_file->close();
00399
00400 if (ELEMENT_DIM == 3)
00401 {
00402 out_stream p_face_file = OpenFaceFile(true);
00403 *p_face_file << comment;
00404 p_face_file->close();
00405 }
00406 }
00407
00408
00410
00412
00413 template class MeshalyzerMeshWriter<1,1>;
00414 template class MeshalyzerMeshWriter<1,2>;
00415 template class MeshalyzerMeshWriter<1,3>;
00416 template class MeshalyzerMeshWriter<2,2>;
00417 template class MeshalyzerMeshWriter<2,3>;
00418 template class MeshalyzerMeshWriter<3,3>;