| 57 | } |
| 58 | |
| 59 | void MshSaver::save_nodes(const VectorF& nodes) { |
| 60 | // Save nodes. |
| 61 | m_num_nodes = nodes.size() / m_dim; |
| 62 | fout << "$Nodes" << std::endl; |
| 63 | fout << m_num_nodes << std::endl; |
| 64 | if (!m_binary) { |
| 65 | for (size_t i=0; i<nodes.size(); i+=m_dim) { |
| 66 | const VectorF& v = nodes.segment(i,m_dim); |
| 67 | int node_idx = i/m_dim+1; |
| 68 | fout << node_idx << " " << v[0] << " " << v[1] << " "; |
| 69 | if (m_dim == 2) { |
| 70 | fout << 0.0 << std::endl; |
| 71 | } else { |
| 72 | fout << v[2] << std::endl; |
| 73 | } |
| 74 | } |
| 75 | } else { |
| 76 | for (size_t i=0; i<nodes.size(); i+=m_dim) { |
| 77 | const VectorF& v = nodes.segment(i,m_dim); |
| 78 | int node_idx = i/m_dim+1; |
| 79 | fout.write((char*)&node_idx, sizeof(int)); |
| 80 | fout.write((char*)v.data(), sizeof(Float)*m_dim); |
| 81 | |
| 82 | // for 2D shapes, z coordinate is always 0. |
| 83 | if (m_dim == 2) { |
| 84 | const Float zero = 0.0; |
| 85 | fout.write((char*)&zero, sizeof(Float)); |
| 86 | } |
| 87 | } |
| 88 | } |
| 89 | fout << "$EndNodes" << std::endl; |
| 90 | fout.flush(); |
| 91 | } |
| 92 | |
| 93 | void MshSaver::save_elements( |
| 94 | const VectorI& elements, MshSaver::ElementType type) { |