128 static const char* label_variant [] = {
129 "nodes",
"edges",
"triangles",
"quadrangles",
"tetrahedra",
"prisms",
"hexahedra" };
133 check_macro (version == 4,
"mesh format version 4 expected, but format version " << version <<
" founded");
135 check_macro (
scatch(in,
"header",
true),
"geo file format version 4: \"header\" keyword not found");
137 omega.size_by_dimension.fill (0);
141 if (label ==
"end")
break;
142 if (label ==
"dimension") { in >> omega.dimension; }
143 else if (label ==
"order") { in >> omega.order; }
144 else if (label ==
"coordinate_system") { in >> omega.sys_coord; }
147 for (; variant < reference_element__max_variant; variant++) {
148 if (label == label_variant[variant])
break;
150 check_macro (variant < reference_element__max_variant,
"unexpected header member: \""<<label<<
"\"");
151 in >> omega.size_by_variant [variant];
152 size_t dim = reference_element_dimension_by_variant(variant);
153 omega.size_by_dimension [dim] += omega.size_by_variant [variant];
156 check_macro (omega.order == 1,
"unsupported geo order = "<<omega.order<<
" > 1");
157 for (omega.map_dimension = 3; omega.map_dimension + 1 >= 1; omega.map_dimension--) {
158 if (omega.size_by_dimension [omega.map_dimension] != 0)
break;
161 check_macro (label ==
"header",
"geo file format version 4: \"end header\" keyword not found");
163 omega.node.resize (omega.size_by_variant[reference_element__p]);
164 for (
size_t inod = 0; inod < omega.node.size(); ++inod) {
165 for (
size_t i = 0; i < omega.dimension; ++i) {
166 in >> omega.node[inod][i];
170 omega.resize (omega.size_by_dimension[omega.map_dimension]);
171 for (
size_t ie = 0; ie < omega.size(); ++ie) {
174 omega[ie].setname(name);
175 for (
size_t j = 0; j < omega[ie].size(); ++j) {
184 scatch (cin,
"field",
true);
187 check_macro (version == 1,
"version " << version <<
" field format not yet supported");
194 check_macro (approx ==
"P1",
"approx " << approx <<
" field not yet supported");
195 vector<double> uh (nbpts);
196 for (
size_t i=0; i<nbpts; i++) {
204 ifstream in ((geo_name +
".geo").c_str());
209 bool do_verbose =
true;
210 string fifo_name = tmpnam(0);
212 string command =
"rm -f " + fifo_name;
213 if (do_verbose) cerr <<
"! " << command << endl;
214 check_macro (system (command.c_str()) == 0,
"adapt: unix command failed");
216 unlink (fifo_name.c_str());
217 mkfifo (fifo_name.c_str(), S_IWUSR | S_IRUSR);
218 string command =
"zcat " + geo_name +
".geo.gz > " + fifo_name +
" &";
219 if (do_verbose) cerr <<
"! " << command << endl;
220 check_macro (system (command.c_str()) == 0,
"adapt: unix command failed");
221 ifstream in (fifo_name.c_str());
223 unlink (fifo_name.c_str());
225 command =
"rm -f " + fifo_name;
226 if (do_verbose) cerr <<
"! " << command << endl;
227 check_macro (system (command.c_str()) == 0,
"adapt: unix command failed");
230 error_macro (
"file \""<<geo_name<<
".geo[.gz]\" not found");
263 cout << setprecision(numeric_limits<double>::digits10)
264 <<
"View \"scalar\" {" << endl;
265 static char gmsh_pos_type [reference_element__max_variant];
266 gmsh_pos_type [reference_element__p] =
'P';
267 gmsh_pos_type [reference_element__e] =
'L';
268 gmsh_pos_type [reference_element__t] =
'T';
269 gmsh_pos_type [reference_element__q] =
'Q';
270 gmsh_pos_type [reference_element__T] =
'S';
271 gmsh_pos_type [reference_element__H] =
'H';
272 gmsh_pos_type [reference_element__P] =
'I';
274 switch (uh.get_space().valued_tag()) {
279 for (
size_t ie = 0, ne = omega.size(); ie < ne; ie++) {
281 cout <<
"S" << gmsh_pos_type[K.
variant()] <<
"(";
282 for (
size_t iloc = 0, nloc = K.
size(); iloc < nloc; iloc++) {
283 const point& x = omega.node[K[iloc]];
284 for (
size_t i_comp = 0; i_comp < 3; i_comp++) {
286 if (i_comp != 2) cout <<
",";
288 if (iloc != nloc-1) cout <<
",";
291 for (
size_t iloc = 0, nloc = K.
size(); iloc < nloc; iloc++) {
293 if (iloc != nloc-1) cout <<
",";
295 cout <<
"};" << endl;
307 field_component_const<T,sequential> uh_comp [3][3];
308 size_t d = uh.get_geo().dimension();
309 for (
size_t i_comp = 0; i_comp <
d; i_comp++) {
310 for (
size_t j_comp = 0; j_comp <
d; j_comp++) {
311 uh_comp[i_comp][j_comp].proxy_assign(uh(i_comp,j_comp));
314#define HAVE_ID_DEFAULT_TENSOR
315#ifdef HAVE_ID_DEFAULT_TENSOR
317 value (0,0) = value (1,1) = value (2,2) = 1;
319 for (
size_t ie = 0, ne = omega.size(); ie < ne; ie++) {
322 for (
size_t iloc = 0, nloc = K.
size(); iloc < nloc; iloc++) {
324 for (
size_t i_comp = 0; i_comp < 3; i_comp++) {
326 if (i_comp != 2)
gmsh <<
",";
328 if (iloc != nloc-1)
gmsh <<
",";
331 for (
size_t iloc = 0, nloc = K.
size(); iloc < nloc; iloc++) {
332 size_t inod = K[iloc];
334 for (
size_t i_comp = 0; i_comp <
d; i_comp++) {
335 for (
size_t j_comp = 0; j_comp <
d; j_comp++) {
336 value(i_comp,j_comp) = uh_comp [i_comp][j_comp].dof (inod);
338 for (
size_t i_comp = 0; i_comp < 3; i_comp++) {
339 for (
size_t j_comp = 0; j_comp < 3; j_comp++) {
340 gmsh << value(i_comp,j_comp);
341 if (i_comp != 2 || j_comp != 2 || iloc != nloc-1)
gmsh <<
",";
344 gmsh <<
"};" << endl;
348 default:
error_macro (
"put_gmsh: do not known how to print " << uh.valued() <<
"-valued field");
351 cout <<
"};" << endl;
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
bool scatch(std::istream &in, const std::string &ch, bool full_match=true)
scatch: see the rheostream page for the full documentation