deal.II version GIT relicensing-6842-g793a97d2aa 2026-10-02 14:00:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
utilities.cc
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2018 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
14
16
19
21
22#include <cstdio>
23
24#ifdef DEAL_II_WITH_GMSH
25# ifdef DEAL_II_WITH_OPENCASCADE
26# include <TopoDS_Edge.hxx>
27# endif
28#endif
29
30
31
33
34#ifdef DEAL_II_WITH_GMSH
35namespace Gmsh
36{
38 const double characteristic_length,
39 const std::string &output_base_name)
40 : characteristic_length(characteristic_length)
41 , output_base_name(output_base_name)
42 {}
43
44
45
46 void
48 {
49 prm.add_parameter("Characteristic length", characteristic_length);
50 prm.add_parameter("Intermediate file name base",
52 "Keep empty, if you want the program to generate "
53 "temporary files, and then remove them when they "
54 "are no longer used.");
55 }
56
57
58
59# ifdef DEAL_II_WITH_OPENCASCADE
60 template <int spacedim>
61 void
62 create_triangulation_from_boundary_curve(const TopoDS_Edge &boundary,
64 const AdditionalParameters &prm)
65 {
66 std::string base_name = prm.output_base_name;
67
68 // If necessary, create a temp directory to put files into. The
69 // following variable will hold the name of the tmp dir; it is
70 // initialized with a template, and 'mkdtemp' then overwrites it
71 // with the name of the directory it creates.
72 char tmp_dir_name[] = "ctfbc-XXXXXX";
73 if (prm.output_base_name.empty())
74 {
75 const char *temp = mkdtemp(tmp_dir_name);
76 AssertThrow(temp != nullptr,
77 ExcMessage("Creating temporary directory failed!"));
78 base_name = temp;
79 base_name += "tmp";
80 }
81
82 const std::string iges_file_name = base_name + ".iges";
83 const std::string geo_file_name = base_name + ".geo";
84 const std::string msh_file_name = base_name + ".msh";
85 const std::string log_file_name = base_name + ".log";
86 const std::string warnings_file_name = base_name + "_warn.log";
87
88 ::OpenCASCADE::write_IGES(boundary, iges_file_name);
89
90 std::ofstream geofile;
91 geofile.open(geo_file_name);
92 geofile << "Merge \"" << iges_file_name << "\";" << std::endl
93 << "Line Loop (2) = {1};" << std::endl
94 << "Plane Surface (3) = {2};" << std::endl
95 << "Characteristic Length { 1 } = " << prm.characteristic_length
96 << ";" << std::endl
97 << "Mesh.RecombineAll = 1;" << std::endl
98 << "Mesh.SubdivisionAlgorithm = 1;" << std::endl;
99 geofile.close();
100
101 std::stringstream command;
102 command << DEAL_II_GMSH_EXECUTABLE_PATH << " -2 " << geo_file_name << " 1> "
103 << log_file_name << " 2> " << warnings_file_name;
104
105 const auto ret_value = std::system(command.str().c_str());
106 AssertThrow(ret_value == 0,
107 ExcMessage("Gmsh failed to run. Check the " + log_file_name +
108 " file."));
109
110 std::ifstream grid_file(msh_file_name);
111 Assert(grid_file.fail() == false, ExcIO());
112
113 GridIn<2, spacedim> gridin;
114 gridin.attach_triangulation(tria);
115 gridin.read_msh(grid_file);
116
117 // Clean up files if a tmp directory was used:
118 if (prm.output_base_name.empty())
119 {
120 // declaring the list without a type, i.e.,
121 //
122 // auto filenames = {{iges_file_name, geo_file_name, ...}})
123 //
124 // causes internal compiler errors with GCC's concepts implementation,
125 // so give it an explicit type:
126 const std::array<const std::string *, 5> filenames{
127 {&iges_file_name,
128 &geo_file_name,
129 &msh_file_name,
130 &log_file_name,
131 &warnings_file_name}};
132 for (const std::string *filename : filenames)
133 {
134 const auto ret_value = std::remove(filename->c_str());
135 AssertThrow(ret_value == 0,
136 ExcMessage("Failed to remove " + *filename));
137 }
138
139 // Finally also remove the tmp directory:
140 const auto ret_value = std::remove(tmp_dir_name);
141 AssertThrow(ret_value == 0,
142 ExcMessage("Failed to remove " +
143 std::string(tmp_dir_name)));
144 }
145 }
146# endif
147
148 // explicit instantiations
149// We don't build the utilities.inst file if deal.II isn't configured
150// with GMSH, but doxygen doesn't know that and tries to find that
151// file anyway for parsing -- which then of course it fails on. So
152// exclude the following from doxygen consideration.
153# ifndef DOXYGEN
154# include "gmsh/utilities.inst"
155# endif
156} // namespace Gmsh
157#endif
158
159
void add_parameters(ParameterHandler &prm)
Definition utilities.cc:47
std::string output_base_name
Definition utilities.h:81
AdditionalParameters(const double characteristic_length=1.0, const std::string &output_base_name="")
Definition utilities.cc:37
void attach_triangulation(Triangulation< dim, spacedim > &tria)
Definition grid_in.cc:155
void read_msh(std::istream &in)
Definition grid_in.cc:2199
void add_parameter(const std::string &entry, ParameterType &parameter, const std::string &documentation="", const Patterns::PatternBase &pattern= *Patterns::Tools::Convert< ParameterType >::to_pattern(), const bool has_to_be_set=false)
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_GMSH_EXECUTABLE_PATH
Definition config.h:453
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
static ::ExceptionBase & ExcIO()
#define Assert(cond, exc)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
void create_triangulation_from_boundary_curve(const TopoDS_Edge &boundary, Triangulation< 2, spacedim > &tria, const AdditionalParameters &prm=AdditionalParameters())
Definition utilities.cc:62
void write_IGES(const TopoDS_Shape &shape, const std::string &filename)
Definition utilities.cc:289