dune-grid-glue  2.4.0
gridglueamirawriter.hh
Go to the documentation of this file.
1 
6 #ifndef DUNE_GRIDGLUE_ADAPTER_GRIDGLUEAMIRAWRITER_HH
7 #define DUNE_GRIDGLUE_ADAPTER_GRIDGLUEAMIRAWRITER_HH
8 
9 #include <fstream>
10 #include <sstream>
11 #include <dune/common/typetraits.hh>
12 
13 namespace Dune {
14 namespace GridGlue {
15 
19 {
20 
24  template <class Glue, int side>
25  static void writeIntersections(const Glue& glue, const std::string& filename)
26  {
27  static_assert((side==0 || side==1), "'side' can only be 0 or 1");
28 
29  std::ofstream fgrid;
30 
31  fgrid.open(filename.c_str());
32 
33  typedef typename Dune::conditional<(side==0), typename Glue::Grid0View, typename Glue::Grid1View>::type GridView;
34  const int dim = GridView::dimension;
35  const int domdimw = GridView::dimensionworld;
36 
37  // coordinates have to be in R^3 in the VTK format
38  std::string coordinatePadding;
39  for (int i=domdimw; i<3; i++)
40  coordinatePadding += " 0";
41 
42  int overlaps = glue.size();
43 
44  if (dim==3) {
45 
46  fgrid << "# HyperSurface 0.1 ASCII \n" << std::endl;
47  fgrid<<"\n";
48  fgrid<<"Parameters {\n";
49  fgrid<<" Materials {\n";
50  fgrid<<" outside {\n";
51  fgrid<<" Id 0\n";
52  fgrid<<" }\n";
53  fgrid<<" inside {\n";
54  fgrid<<" Id 1\n";
55  fgrid<<" }\n";
56  fgrid<<" }\n";
57  fgrid<<"\n";
58  fgrid<<"}\n";
59 
60  // ////////////////////////////////////////////
61  // Write vertices
62  // ////////////////////////////////////////////
63 
64  //use dim and not dim+1
65  fgrid<<"\nVertices "<< overlaps*(dim)<<"\n";
66  auto isEnd = glue.template iend<side>();
67  for (auto isIt = glue.template ibegin<side>(); isIt != isEnd; ++isIt)
68  {
69  const auto& geometry = isIt->geometry();
70  for (int i = 0; i < geometry.corners(); ++i)
71  fgrid << geometry.corner(i) << coordinatePadding << std::endl;
72  }
73 
74  // ////////////////////////////////////////////
75  // Write triangles
76  // ////////////////////////////////////////////
77 
78  fgrid<<"NBranchingPoints 0\n";
79  fgrid<<"NVerticesOnCurves 0\n";
80  fgrid<<"BoundaryCurves 0\n";
81  fgrid<<"Patches 1\n";
82  fgrid<<"{\n";
83  fgrid<<"InnerRegion inside\n";
84  fgrid<<"OuterRegion outside\n";
85  fgrid<<"BoundaryID 0\n";
86  fgrid<<"BranchingPoints 0";
87  fgrid<<"\n";
88 
89  fgrid<<"Triangles "<<overlaps<<std::endl;
90 
91  for (int i=0;i<overlaps; i++)
92  fgrid<<i*dim+1<<" "<<i*dim+2<<" "<<i*dim+3<<std::endl;
93  fgrid<<"}\n";
94 
95  } else if (dim==2) {
96 
97  fgrid << "# AmiraMesh 3D ASCII 2.0 \n";
98  fgrid<<"\n";
99  fgrid<<"define Lines "<<3*overlaps<<"\n";
100  fgrid<<"nVertices "<<2*overlaps<<"\n";
101  fgrid<<"\n";
102  fgrid<<"Parameters {\n";
103  fgrid<<" ContentType \"HxLineSet\" \n";
104  fgrid<<"}\n";
105  fgrid<<"\n";
106  fgrid<<"Lines { int LineIdx } @1\n";
107  fgrid<<"Vertices { float[3] Coordinates } @2\n";
108  fgrid<<"\n";
109  fgrid<<"# Data section follows\n";
110  fgrid<<"@1 \n";
111  for (int i=0; i<overlaps;i++)
112  fgrid<<2*i<<"\n"<<2*i+1<<"\n"<<-1<<"\n";
113  fgrid<<"\n";
114  fgrid<<"@2 \n";
115 
116  auto isEnd = glue.template iend<side>();
117  for (auto isIt = glue.template ibegin<side>(); isIt != isEnd; ++isIt) {
118  const auto& geometry = isIt->geometry();
119  for (int i = 0; i <2; ++i)
120  fgrid << geometry.corner(i) <<" "<<0<<"\n";
121  }
122  }
123 
124  fgrid.close();
125  }
126 
127 public:
128  template<typename Glue>
129  static void write(const Glue& glue, const std::string& path, int appendix=1)
130  {
131  std::ostringstream name0;
132  name0 << path;
133  name0 << "/domain.surf" << std::setw(3) << std::setfill('0') << appendix;
134 
135  // Write extracted grid and remote intersection on the grid1-side
136  writeIntersections<Glue,0>(glue,name0.str());
137 
138  std::ostringstream name1;
139  name1 << path;
140  name1 << "/target.surf" << std::setw(3) << std::setfill('0') << appendix;
141 
142  writeIntersections<Glue,1>(glue, name1.str());
143  }
144 
145 };
146 
147 } // namespace GridGlue
148 } // namespace Dune
149 
150 #endif // DUNE_GRIDGLUE_ADAPTER_GRIDGLUEAMIRAWRITER_HH
Definition: gridglue.hh:33
static void write(const Glue &glue, const std::string &path, int appendix=1)
Definition: gridglueamirawriter.hh:129
Write remote intersections to a AmiraMesh file for debugging purposes.
Definition: gridglueamirawriter.hh:18