diff --git a/demos/api/t1.cpp b/demos/api/t1.cpp index e0a848fc2aaa2e029e8b71f84285ff26b8067004..00a6d3d6189e1dc24b0b1b3f8645ed2b1030cadb 100644 --- a/demos/api/t1.cpp +++ b/demos/api/t1.cpp @@ -1,4 +1,4 @@ -// This reimplements gmsh/tutorial/t1.geo in C++. For all the elementary +// This file reimplements gmsh/tutorial/t1.geo in C++. For all the elementary // explanations about the general philosphy of entities in Gmsh, see the // comments in the .geo file. Comments here will focus on the specifics of the // C++ API. @@ -9,28 +9,34 @@ int main(int argc, char **argv) { // Before using any functions in the C++ API, Gmsh must be initialized. If - // argc/argv are passed, Gmsh will parse the commandline, in the same way as + // argc/argv are passed, Gmsh will parse the commandline in the same way as // the standalone Gmsh code. gmshInitialize(argc, argv); // By default Gmsh will not print out any messages: in order to output - // messages on the terminal, just set the standard Gmsh option (with the same - // format and meaning as in .geo files) using gmshOptionSetNumber(): + // messages on the terminal, just set the standard Gmsh option + // "General.Terminal" (same format and meaning as in .geo files) using + // gmshOptionSetNumber(): gmshOptionSetNumber("General.Terminal", 1); // This creates a new model, named "t1". If gmshModelCreate() is not called, a - // new default (unnamed) model will be created. + // new default (unnamed) model will be created on the fly, if necessary. gmshModelCreate("t1"); - // The C++ API provides direct access the internal CAD kernels. The built-in - // CAD kernel was used in t1.geo. To create geometrical points with the - // built-in CAD kernel, use gmshModelGeoAddPoint(): - // - the first argument is the point id (or "tag") ; if positive, the point - // is created with this tag ; if negative, a new tag will be returned - // (in the 5th argument) + // The C++ API provides direct access to the internal CAD kernels. The + // built-in CAD kernel was used in t1.geo: the corresponding API functions + // have the "gmshModeGeo" prefix. To create geometrical points with the + // built-in CAD kernel, one thus uses gmshModelGeoAddPoint(): + // + // - the first argument is the point tag ; if positive, the point is created + // with this tag ; if negative, a new (unused) tag will be assigned and + // returned (in the 5th argument) + // // - the next 3 arguments are the point coordinates (x, y, z) + // // - the fifth argument is the actual id of the point: equal to tag if tag > - // 0, or a new id if tag < 0 + // 0, or a new one if tag < 0 + // // - the last (optional) argument is the target mesh size close to the point double lc = 1e-2; int o; @@ -40,21 +46,21 @@ int main(int argc, char **argv) gmshModelGeoAddPoint(4, 0, .3, 0, o, lc); // The API to create lines with the built-in kernel follows the same - // conventions: first argument is a tag (here positive to force the id), - // followed by 2 point ids, followed by the actual (returned) id. + // conventions: the first argument is a tag (here positive to force it), + // followed by 2 point tags, followed by the actual (returned) tag. gmshModelGeoAddLine(1, 1, 2, o); gmshModelGeoAddLine(2, 3, 2, o); gmshModelGeoAddLine(3, 3, 4, o); gmshModelGeoAddLine(4, 4, 1, o); // The philosophy to construct line loops and surfaces is similar: the second - // arguments are now std::vectors of integers. + // arguments are now vectors of integers. gmshModelGeoAddLineLoop(1, {4, 1, -2, 3}, o); gmshModelGeoAddPlaneSurface(1, {1}, o); - // Physical groups ae defined by providing the dimension of the group (0 for + // Physical groups are defined by providing the dimension of the group (0 for // physical points, 1 for physical lines, 2 for physical surfaces and 3 for - // phsyical volumes) and its tag, folllowed by a std::vector of entitiy ids. + // phsyical volumes) and its tag, followed by a vector of entity tags. gmshModelAddPhysicalGroup(0, 1, {1, 2}); gmshModelAddPhysicalGroup(1, 2, {1, 2}); gmshModelAddPhysicalGroup(2, 6, {1}); @@ -63,17 +69,22 @@ int main(int argc, char **argv) // entity. gmshModelSetPhysicalName(2, 6, "My surface"); - // Before it can be meshed, the internal CAD representation (here in the - // built-in "Geo" CAD kernel) must be synchronized with the Gmsh model, which - // will create the relevant Gmsh data structure to represent the full topology - // of the model. This is achieved by the gmshModelGeoSynchronize() API call. + // Before it can be meshed, the internal CAD representation must be + // synchronized with the Gmsh model, which will create the relevant Gmsh data + // structures. This is achieved by the gmshModelGeoSynchronize() API call for + // the built-in CAD kernel. Synchronizations can be called at any time, but + // they involve a non trivial amount of processing; so while you could + // synchronize the internal CAD data after every CAD command, it is usually + // better to minimize the number of synchronization points. gmshModelGeoSynchronize(); - // We can then generate a 2D mesh, and save it to disk. + // We can then generate a 2D mesh... gmshModelMesh(2); + + // ... and save it to disk gmshExport("t1.msh"); - // Gmsh finalize should be called at the end. + // This should be called at the end: gmshFinalize(); return 0; } diff --git a/demos/api/t10.cpp b/demos/api/t10.cpp index 551d532ed399cf9d6f99bd3595b1f670db950a6c..183fa16441e219f1a71a57fa5833715f461729b9 100644 --- a/demos/api/t10.cpp +++ b/demos/api/t10.cpp @@ -1,8 +1,8 @@ +// This reimplements gmsh/tutorial/t10.geo in C++. + #include <gmsh.h> #include <sstream> -// this reimplements gmsh/tutorial/t10.geo - int main(int argc, char **argv) { gmshInitialize(argc, argv); @@ -26,30 +26,30 @@ int main(int argc, char **argv) gmshModelGeoAddLineLoop(5, {1,2,3,4}, o); gmshModelGeoAddPlaneSurface(6, {5}, o); - gmshModelFieldAdd(1, "Attractor"); + gmshModelFieldCreate(1, "Attractor"); gmshModelFieldSetNumbers(1, "NodesList", {5}); gmshModelFieldSetNumber(1, "NNodesByEdge", 100); gmshModelFieldSetNumbers(1, "EdgesList", {2}); - gmshModelFieldAdd(2, "Threshold"); + gmshModelFieldCreate(2, "Threshold"); gmshModelFieldSetNumber(2, "IField", 1); gmshModelFieldSetNumber(2, "LcMin", lc / 30); gmshModelFieldSetNumber(2, "LcMax", lc); gmshModelFieldSetNumber(2, "DistMin", 0.15); gmshModelFieldSetNumber(2, "DistMax", 0.5); - gmshModelFieldAdd(3, "MathEval"); + gmshModelFieldCreate(3, "MathEval"); gmshModelFieldSetString(3, "F", "Cos(4*3.14*x) * Sin(4*3.14*y) / 10 + 0.101"); - gmshModelFieldAdd(4, "Attractor"); + gmshModelFieldCreate(4, "Attractor"); gmshModelFieldSetNumbers(4, "NodesList", {1}); - gmshModelFieldAdd(5, "MathEval"); + gmshModelFieldCreate(5, "MathEval"); std::stringstream stream; stream << "F4^3 + " << lc / 100; gmshModelFieldSetString(5, "F", stream.str()); - gmshModelFieldAdd(6, "Box"); + gmshModelFieldCreate(6, "Box"); gmshModelFieldSetNumber(6, "VIn", lc / 15); gmshModelFieldSetNumber(6, "VOut", lc); gmshModelFieldSetNumber(6, "XMin", 0.3); @@ -57,7 +57,7 @@ int main(int argc, char **argv) gmshModelFieldSetNumber(6, "YMin", 0.3); gmshModelFieldSetNumber(6, "YMax", 0.6); - gmshModelFieldAdd(7, "Min"); + gmshModelFieldCreate(7, "Min"); gmshModelFieldSetNumbers(7, "FieldsList", {2, 3, 5, 6}); gmshModelFieldSetAsBackground(7); diff --git a/demos/api/t16.cpp b/demos/api/t16.cpp index 9d13e8175939ebdfe2543669444f992b9f0cffbe..d07b7d63d9361a35230f40359e2d1f5b1fbade12 100644 --- a/demos/api/t16.cpp +++ b/demos/api/t16.cpp @@ -1,6 +1,6 @@ -#include <gmsh.h> +// This file reimplements gmsh/tutorial/t16.geo in C++. -// this reimplements gmsh/tutorial/t16.geo +#include <gmsh.h> int main(int argc, char **argv) { @@ -49,4 +49,3 @@ int main(int argc, char **argv) gmshFinalize(); return 0; } - diff --git a/demos/api/t2.cpp b/demos/api/t2.cpp index 9e689f2c7b3a6b5bb8cdf377d861a73ff5665f06..7d78d5c5f259cc1471f99958e0a029316c32ed44 100644 --- a/demos/api/t2.cpp +++ b/demos/api/t2.cpp @@ -1,5 +1,5 @@ -// This reimplements gmsh/tutorial/t2.geo in C++. Comments focus on the new API -// functions used compared to t1.cpp. +// This file reimplements gmsh/tutorial/t2.geo in C++. Comments focus on the new +// API functions used, compared to the ones introduced in t1.cpp. #include <gmsh.h> @@ -10,7 +10,7 @@ int main(int argc, char **argv) gmshModelCreate("t2"); - // Copy/paste from t1.cpp + // Copied from t1.cpp... double lc = 1e-2; int o; gmshModelGeoAddPoint(1, 0, 0, 0, o, lc); @@ -29,20 +29,20 @@ int main(int argc, char **argv) gmshModelAddPhysicalGroup(1, 2, {1, 2}); gmshModelAddPhysicalGroup(2, 6, {1}); gmshModelSetPhysicalName(2, 6, "My surface"); - // End copy/paste + // ...end of copy gmshModelGeoAddPoint(5, 0, .4, 0, o, lc); gmshModelGeoAddLine(5, 4, 5, o); - // Geometrical transformations take a std::vector of std::pair<int, int> as - // first argument, which contains the list of entities, represented by - // (dimension,tag) pairs. Here we translate point 3 (dimension = 0, tag = 3), - // by dx=-0.05, dy=0, dz=0. + // Geometrical transformations take a vector of pairs of integers as first + // argument, which contains the list of entities, represented by (dimension, + // tag) pairs. Here we thus translate point 3 (dimension=0, tag=3), by + // dx=-0.05, dy=0, dz=0. gmshModelGeoTranslate({{0, 3}}, -0.05, 0, 0); // The "Duplicata" functionality in .geo files is handled by - // gmshModelGeoCopy(), which takes a vector of (dim,tag) pairs as input, and - // returns another vector of (dim,tag) pairs. + // gmshModelGeoCopy(), which takes a vector of (dim, tag) pairs as input, and + // returns another vector of (dim, tag) pairs. std::vector<std::pair<int, int> > ov, ov2; gmshModelGeoCopy({{0, 3}}, ov); gmshModelGeoTranslate(ov, 0, 0.1, 0); @@ -83,16 +83,16 @@ int main(int argc, char **argv) gmshModelGeoAddPlaneSurface(127, {126}, o); // The API to create surface loops ("shells") and volumes is similar to the - // one use to create line loops and surfaces. + // one used to create line loops and surfaces. gmshModelGeoAddSurfaceLoop(128, {127, 119, 121, 123, 125, 11}, o); gmshModelGeoAddVolume(129, {128}, o); - // Extrusion works as expected, by providing a vector of (dim,tag) pairs as - // input, the translation vector, and a vector of (dim,tag) pairs as output. + // Extrusion works as expected, by providing a vector of (dim, tag) pairs as + // input, the translation vector, and a vector of (dim, tag) pairs as output. gmshModelGeoExtrude({ov[1]}, 0, 0, 0.12, ov2); // Mesh sizes associated to geometrical points can be set by passing a vector - // of (dim,tag) pairs for the corresponding entities + // of (dim, tag) pairs for the corresponding points. gmshModelGeoSetMeshSize({{0,103}, {0,105}, {0,109}, {0,102}, {0,28}, {0, 24}, {0,6}, {0,5}}, lc * 3); diff --git a/demos/api/t3.cpp b/demos/api/t3.cpp index cc0440be9b8576704c3dd20f7542804fafa7d103..cb3d8024c5485946ce47fe47d4b1b3e96c65e01b 100644 --- a/demos/api/t3.cpp +++ b/demos/api/t3.cpp @@ -1,8 +1,8 @@ +// This files reimplements gmsh/tutorial/t3.geo in C++. + #include <cmath> #include <gmsh.h> -// this reimplements gmsh/tutorial/t3.geo - int main(int argc, char **argv) { gmshInitialize(argc, argv); @@ -10,7 +10,7 @@ int main(int argc, char **argv) gmshModelCreate("t3"); - // copy/paste from t1.cpp + // Copied from t1.cpp... double lc = 1e-2; int o; gmshModelGeoAddPoint(1, 0, 0, 0, o, lc); @@ -29,15 +29,24 @@ int main(int argc, char **argv) gmshModelAddPhysicalGroup(1, 2, {1, 2}); gmshModelAddPhysicalGroup(2, 6, {1}); gmshModelSetPhysicalName(2, 6, "My surface"); - // end copy/paste + // ... end of copy double h = 0.1, angle = 90.; std::vector<std::pair<int, int> > ov; + + // Extruding the mesh in addition to the geometry works as in .geo files: the + // number of elements for each layer and the (end) height of each layer are + // specified in two vectors. gmshModelGeoExtrude({{2,1}}, 0, 0, h, ov, {8,2}, {0.5,1}); + + // Rotational and twisted extrusions are available as well with the built-in + // CAD kernel. The last (optional) argument for the Extrude/Revolve/Twist + // commands specified whether the extruded mesh should be recombined or not. gmshModelGeoRevolve({{2,28}}, -0.1,0,0.1, 0,1,0, -M_PI/2, ov, {7}); gmshModelGeoTwist({{2,50}}, 0,0.15,0.25, -2*h,0,0, 1,0,0, angle*M_PI/180., ov, {10}, {}, true); + gmshModelAddPhysicalGroup(3, 101, {1, 2, ov[1].second}); gmshModelGeoSynchronize(); diff --git a/demos/api/t4.cpp b/demos/api/t4.cpp index 50eb3bc575b7180d16a2bd3687cf883a2ff62cd9..fd0955e3a21d8e5903fdb6bcb771edb652ae50d1 100644 --- a/demos/api/t4.cpp +++ b/demos/api/t4.cpp @@ -1,8 +1,8 @@ +// This file reimplements gmsh/tutorial/t4.geo in C++. + #include <math.h> #include <gmsh.h> -// this reimplements gmsh/tutorial/t4.geo - double hypoth(double a, double b){ return sqrt(a * a + b * b); } int main(int argc, char **argv) @@ -77,9 +77,11 @@ int main(int argc, char **argv) gmshModelGeoAddLineLoop(21, {17,-15,18,19,-20,16}, o); gmshModelGeoAddPlaneSurface(22, {21}, o); gmshModelGeoAddLineLoop(23, {11,-12,13,14,1,2,-3,4,5,6,7,-8,9,10}, o); + + // A surface with one hole is specified using 2 line loops: gmshModelGeoAddPlaneSurface(24, {23,21}, o); - // FIXME: this will be implemented through the gmshPost or gmshView API + // FIXME: this will be implemented through the gmshView API /* View "comments" { T2(10, -10, 0){ StrCat("Created on ", Today, " with Gmsh") }; @@ -90,6 +92,7 @@ int main(int argc, char **argv) T2(350, -7, 0){ "file://image.png@20x0" }; }; */ + gmshModelGeoSynchronize(); gmshModelMesh(2); diff --git a/demos/api/t5.cpp b/demos/api/t5.cpp index b5312ba84ec3ba8ae06223aabe848288878fe314..e031dc4e563865d961bd778baa77f2423146093c 100644 --- a/demos/api/t5.cpp +++ b/demos/api/t5.cpp @@ -1,11 +1,12 @@ +// This file reimplements gmsh/tutorial/t5.geo in C++. + #include <gmsh.h> #include <cstdio> -// this reimplements gmsh/tutorial/t5.geo - void cheeseHole(double x, double y, double z, double r, double lc, std::vector<int> &shells, std::vector<int> &volumes) { + // When the tag (first argument) is negative, the int p1; gmshModelGeoAddPoint(-1, x, y, z, p1, lc); int p2; gmshModelGeoAddPoint(-1, x+r,y, z, p2, lc); int p3; gmshModelGeoAddPoint(-1, x, y+r,z, p3, lc);