1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
#ifndef NETGEN_MESHING_PYTHON_MESH_HPP
#define NETGEN_MESHING_PYTHON_MESH_HPP
#include <core/python_ngcore.hpp>
#include "meshing.hpp"
namespace netgen
{
// TODO: Clarify a lot of these parameters
static string meshingparameter_description = R"delimiter(
Meshing Parameters
-------------------
maxh: float = 1e10
Global upper bound for mesh size.
grading: float = 0.3
Mesh grading how fast the local mesh size can change.
meshsizefilename: str = None
Load meshsize from file. Can set local mesh size for points
and along edges. File must have the format:
nr_points
x1, y1, z1, meshsize
x2, y2, z2, meshsize
...
xn, yn, zn, meshsize
nr_edges
x11, y11, z11, x12, y12, z12, meshsize
...
xn1, yn1, zn1, xn2, yn2, zn2, meshsize
segmentsperedge: float = 1.
Minimal number of segments per edge.
quad_dominated: bool = False
Quad-dominated surface meshing.
blockfill: bool = True
Do fast blockfilling.
filldist: float = 0.1
Block fill up to distance
delaunay: bool = True
Use delaunay meshing.
delaunay2d : bool = True
Use delaunay meshing for 2d geometries.
Optimization Parameters
-----------------------
optimize3d: str = "cmdmustm"
3d optimization strategy:
m .. move nodes
M .. move nodes, cheap functional
s .. swap faces
c .. combine elements
d .. divide elements
p .. plot, no pause
P .. plot, Pause
h .. Histogramm, no pause
H .. Histogramm, pause
optsteps3d: int = 3
Number of 3d optimization steps.
optimize2d: str = "smcmSmcmSmcm"
2d optimization strategy:
s .. swap, opt 6 lines/node
S .. swap, optimal elements
m .. move nodes
p .. plot, no pause
P .. plot, pause
c .. combine
optsteps2d: int = 3
Number of 2d optimization steps.
elsizeweight: float = 0.2
Weight of element size w.r.t. element shape in optimization.
)delimiter";
inline void CreateMPfromKwargs(MeshingParameters& mp, py::kwargs kwargs, bool throw_if_not_all_parsed=true)
{
if(kwargs.contains("optimize3d"))
mp.optimize3d = py::cast<string>(kwargs.attr("pop")("optimize3d"));
if(kwargs.contains("optsteps3d"))
mp.optsteps3d = py::cast<int>(kwargs.attr("pop")("optsteps3d"));
if(kwargs.contains("optimize2d"))
mp.optimize2d = py::cast<string>(kwargs.attr("pop")("optimize2d"));
if(kwargs.contains("optsteps2d"))
mp.optsteps2d = py::cast<int>(kwargs.attr("pop")("optsteps2d"));
if(kwargs.contains("opterrpow"))
mp.opterrpow = py::cast<double>(kwargs.attr("pop")("opterrpow"));
if(kwargs.contains("blockfill"))
mp.blockfill = py::cast<bool>(kwargs.attr("pop")("blockfill"));
if(kwargs.contains("filldist"))
mp.filldist = py::cast<double>(kwargs.attr("pop")("filldist"));
if(kwargs.contains("safety"))
mp.safety = py::cast<double>(kwargs.attr("pop")("safety"));
if(kwargs.contains("relinnersafety"))
mp.relinnersafety = py::cast<double>(kwargs.attr("pop")("relinnersafety"));
if(kwargs.contains("uselocalh"))
mp.uselocalh = py::cast<bool>(kwargs.attr("pop")("uselocalh"));
if(kwargs.contains("grading"))
mp.grading = py::cast<double>(kwargs.attr("pop")("grading"));
if(kwargs.contains("delaunay"))
mp.delaunay = py::cast<bool>(kwargs.attr("pop")("delaunay"));
if(kwargs.contains("delaunay2d"))
mp.delaunay2d = py::cast<bool>(kwargs.attr("pop")("delaunay2d"));
if(kwargs.contains("maxh"))
mp.maxh = py::cast<double>(kwargs.attr("pop")("maxh"));
if(kwargs.contains("minh"))
mp.minh = py::cast<double>(kwargs.attr("pop")("minh"));
if(kwargs.contains("meshsizefilename"))
mp.meshsizefilename = py::cast<string>(kwargs.attr("pop")("meshsizefilename"));
if(kwargs.contains("startinsurface"))
mp.startinsurface = py::cast<bool>(kwargs.attr("pop")("startinsurface"));
if(kwargs.contains("checkoverlap"))
mp.checkoverlap = py::cast<bool>(kwargs.attr("pop")("checkoverlap"));
if(kwargs.contains("checkoverlappingboundary"))
mp.checkoverlappingboundary = py::cast<bool>(kwargs.attr("pop")("checkoverlappingboundary"));
if(kwargs.contains("checkchartboundary"))
mp.checkchartboundary = py::cast<bool>(kwargs.attr("pop")("checkchartboundary"));
if(kwargs.contains("curvaturesafety"))
mp.curvaturesafety = py::cast<double>(kwargs.attr("pop")("curvaturesafety"));
if(kwargs.contains("segmentsperedge"))
mp.segmentsperedge = py::cast<double>(kwargs.attr("pop")("segmentsperedge"));
if(kwargs.contains("parthread"))
mp.parthread = py::cast<bool>(kwargs.attr("pop")("parthread"));
if(kwargs.contains("elsizeweight"))
mp.elsizeweight = py::cast<double>(kwargs.attr("pop")("elsizeweight"));
if(kwargs.contains("perfstepsstart"))
mp.perfstepsstart = py::cast<int>(kwargs.attr("pop")("perfstepsstart"));
if(kwargs.contains("perfstepsend"))
mp.perfstepsend = py::cast<int>(kwargs.attr("pop")("perfstepsend"));
if(kwargs.contains("giveuptol2d"))
mp.giveuptol2d = py::cast<int>(kwargs.attr("pop")("giveuptol2d"));
if(kwargs.contains("giveuptol"))
mp.giveuptol = py::cast<int>(kwargs.attr("pop")("giveuptol"));
if(kwargs.contains("giveuptolopenquads"))
mp.giveuptolopenquads = py::cast<int>(kwargs.attr("pop")("giveuptolopenquads"));
if(kwargs.contains("maxoutersteps"))
mp.maxoutersteps = py::cast<int>(kwargs.attr("pop")("maxoutersteps"));
if(kwargs.contains("starshapeclass"))
mp.starshapeclass = py::cast<int>(kwargs.attr("pop")("starshapeclass"));
if(kwargs.contains("baseelnp"))
mp.baseelnp = py::cast<int>(kwargs.attr("pop")("baseelnp"));
if(kwargs.contains("sloppy"))
mp.sloppy = py::cast<int>(kwargs.attr("pop")("sloppy"));
if(kwargs.contains("badellimit"))
mp.badellimit = py::cast<double>(kwargs.attr("pop")("badellimit"));
if(kwargs.contains("check_impossible"))
mp.check_impossible = py::cast<bool>(kwargs.attr("pop")("check_impossible"));
if(kwargs.contains("only3D_domain_nr"))
mp.only3D_domain_nr = py::cast<int>(kwargs.attr("pop")("only3D_domain_nr"));
if(kwargs.contains("secondorder"))
mp.secondorder = py::cast<bool>(kwargs.attr("pop")("secondorder"));
if(kwargs.contains("elementorder"))
mp.elementorder = py::cast<int>(kwargs.attr("pop")("elementorder"));
if(kwargs.contains("quad"))
{
cout << "WARNING: Meshing parameter 'quad' is deprecated, use 'quad_dominated' instead!" << endl;
mp.quad = py::cast<bool>(kwargs.attr("pop")("quad"));
}
if(kwargs.contains("quad_dominated"))
mp.quad = py::cast<bool>(kwargs.attr("pop")("quad_dominated"));
if(kwargs.contains("try_hexes"))
mp.try_hexes = py::cast<bool>(kwargs.attr("pop")("try_hexes"));
if(kwargs.contains("inverttets"))
mp.inverttets = py::cast<bool>(kwargs.attr("pop")("inverttets"));
if(kwargs.contains("inverttrigs"))
mp.inverttrigs = py::cast<bool>(kwargs.attr("pop")("inverttrigs"));
if(kwargs.contains("autozrefine"))
mp.autozrefine = py::cast<bool>(kwargs.attr("pop")("autozrefine"));
if(kwargs.contains("parallel_meshing"))
mp.parallel_meshing = py::cast<bool>(kwargs.attr("pop")("parallel_meshing"));
if(kwargs.contains("nthreads"))
mp.nthreads = py::cast<int>(kwargs.attr("pop")("nthreads"));
if(kwargs.contains("closeedgefac"))
mp.closeedgefac = py::cast<optional<double>>(kwargs.attr("pop")("closeedgefac"));
if(kwargs.contains("boundary_layers"))
{
auto layers = py::list(kwargs.attr("pop")("boundary_layers"));
for(auto layer : layers)
mp.boundary_layers.Append(py::cast<BoundaryLayerParameters>(layer));
}
if(kwargs.size())
{
if(throw_if_not_all_parsed)
throw Exception(string("Not all kwargs given to GenerateMesh could be parsed:") + string(py::str(kwargs)));
mp.geometrySpecificParameters = CreateFlagsFromKwArgs(kwargs);
}
}
} // namespace netgen
#endif // NETGEN_MESHING_PYTHON_MESH_HPP
|