From 525651cf2f1826bdb52cdc4e6043d8a0aa801255 Mon Sep 17 00:00:00 2001 From: heister Date: Fri, 1 Feb 2013 23:19:03 +0000 Subject: [PATCH] starting step-49: more complex meshes git-svn-id: https://svn.dealii.org/trunk@28211 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/examples/step-49/Makefile | 144 ++++++++++++ deal.II/examples/step-49/doc/builds-on | 1 + deal.II/examples/step-49/doc/intro.dox | 157 +++++++++++++ deal.II/examples/step-49/doc/kind | 1 + deal.II/examples/step-49/doc/results.dox | 79 +++++++ .../examples/step-49/doc/step-1.grid-1.png | Bin 0 -> 9111 bytes .../examples/step-49/doc/step-1.grid-2.png | Bin 0 -> 29392 bytes deal.II/examples/step-49/doc/tooltip | 1 + deal.II/examples/step-49/step-49.cc | 209 ++++++++++++++++++ 9 files changed, 592 insertions(+) create mode 100644 deal.II/examples/step-49/Makefile create mode 100644 deal.II/examples/step-49/doc/builds-on create mode 100644 deal.II/examples/step-49/doc/intro.dox create mode 100644 deal.II/examples/step-49/doc/kind create mode 100644 deal.II/examples/step-49/doc/results.dox create mode 100644 deal.II/examples/step-49/doc/step-1.grid-1.png create mode 100644 deal.II/examples/step-49/doc/step-1.grid-2.png create mode 100644 deal.II/examples/step-49/doc/tooltip create mode 100644 deal.II/examples/step-49/step-49.cc diff --git a/deal.II/examples/step-49/Makefile b/deal.II/examples/step-49/Makefile new file mode 100644 index 0000000000..41c0fb67bc --- /dev/null +++ b/deal.II/examples/step-49/Makefile @@ -0,0 +1,144 @@ +# $Id: Makefile 25724 2012-07-24 23:35:36Z bangerth $ + + +# For the small projects Makefile, you basically need to fill in only +# four fields. +# +# The first is the name of the application. It is assumed that the +# application name is the same as the base file name of the single C++ +# file from which the application is generated. +target = step-49 + +# The second field determines whether you want to run your program in +# debug or optimized mode. The latter is significantly faster, but no +# run-time checking of parameters and internal states is performed, so +# you should set this value to `on' while you develop your program, +# and to `off' when running production computations. +debug-mode = on + + +# As third field, we need to give the path to the top-level deal.II +# directory. You need to adjust this to your needs. Since this path is +# probably the most often needed one in the Makefile internals, it is +# designated by a single-character variable, since that can be +# reference using $D only, i.e. without the parentheses that are +# required for most other parameters, as e.g. in $(target). +D = ../../ + + +# The last field specifies the names of data and other files that +# shall be deleted when calling `make clean'. Object and backup files, +# executables and the like are removed anyway. Here, we give a list of +# files in the various output formats that deal.II supports. +clean-up-files = *gmv *gnuplot *gpl *eps *pov *vtk *ucd *.d2 + + + + +# +# +# Usually, you will not need to change anything beyond this point. +# +# +# The next statement tells the `make' program where to find the +# deal.II top level directory and to include the file with the global +# settings +include $D/common/Make.global_options + + +# Since the whole project consists of only one file, we need not +# consider difficult dependencies. We only have to declare the +# libraries which we want to link to the object file. deal.II has two +# libraries: one for the debug mode version of the +# application and one for optimized mode. +libs.g := $(lib-deal2.g) +libs.o := $(lib-deal2.o) + + +# We now use the variable defined above to switch between debug and +# optimized mode to select the set of libraries to link with. Included +# in the list of libraries is the name of the object file which we +# will produce from the single C++ file. Note that by default we use +# the extension .g.o for object files compiled in debug mode and .o for +# object files in optimized mode (or whatever local default on your +# system is instead of .o) +ifeq ($(debug-mode),on) + libraries = $(target).g.$(OBJEXT) $(libs.g) +else + libraries = $(target).$(OBJEXT) $(libs.o) +endif + + +# Now comes the first production rule: how to link the single object +# file produced from the single C++ file into the executable. Since +# this is the first rule in the Makefile, it is the one `make' selects +# if you call it without arguments. +all: $(target)$(EXEEXT) +$(target)$(EXEEXT) : $(libraries) + @echo ============================ Linking $@ + @$(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) + + +# To make running the application somewhat independent of the actual +# program name, we usually declare a rule `run' which simply runs the +# program. You can then run it by typing `make run'. This is also +# useful if you want to call the executable with arguments which do +# not change frequently. You may then want to add them to the +# following rule: +run: $(target)$(EXEEXT) + @echo ============================ Running $< + @./$(target)$(EXEEXT) + + +# As a last rule to the `make' program, we define what to do when +# cleaning up a directory. This usually involves deleting object files +# and other automatically created files such as the executable itself, +# backup files, and data files. Since the latter are not usually quite +# diverse, you needed to declare them at the top of this file. +clean: + -rm -f *.$(OBJEXT) *~ Makefile.dep $(target)$(EXEEXT) $(clean-up-files) + + +# Since we have not yet stated how to make an object file from a C++ +# file, we should do so now. Since the many flags passed to the +# compiler are usually not of much interest, we suppress the actual +# command line using the `at' sign in the first column of the rules +# and write the string indicating what we do instead. +./%.g.$(OBJEXT) : + @echo "==============debug========= $( $@" + @$(CXX) $(CXXFLAGS.g) -c $< -o $@ +./%.$(OBJEXT) : + @echo "==============optimized===== $( $@" + @$(CXX) $(CXXFLAGS.o) -c $< -o $@ + + +# The following statement tells make that the rules `run' and `clean' +# are not expected to produce files of the same name as Makefile rules +# usually do. +.PHONY: all run clean + + +# Finally there is a rule which you normally need not care much about: +# since the executable depends on some include files from the library, +# besides the C++ application file of course, it is necessary to +# re-generate the executable when one of the files it depends on has +# changed. The following rule creates a dependency file +# `Makefile.dep', which `make' uses to determine when to regenerate +# the executable. This file is automagically remade whenever needed, +# i.e. whenever one of the cc-/h-files changed. Make detects whether +# to remake this file upon inclusion at the bottom of this file. +# +# If the creation of Makefile.dep fails, blow it away and fail +Makefile.dep: $(target).cc Makefile \ + $(shell echo $D/include/deal.II/*/*.h) + @echo ============================ Remaking $@ + @$D/common/scripts/make_dependencies $(INCLUDE) -B. $(target).cc \ + > $@ \ + || (rm -f $@ ; false) + @if test -s $@ ; then true ; else rm $@ ; false ; fi + +# To make the dependencies known to `make', we finally have to include +# them: +include Makefile.dep + + diff --git a/deal.II/examples/step-49/doc/builds-on b/deal.II/examples/step-49/doc/builds-on new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/deal.II/examples/step-49/doc/builds-on @@ -0,0 +1 @@ + diff --git a/deal.II/examples/step-49/doc/intro.dox b/deal.II/examples/step-49/doc/intro.dox new file mode 100644 index 0000000000..c3629d2973 --- /dev/null +++ b/deal.II/examples/step-49/doc/intro.dox @@ -0,0 +1,157 @@ + +

Introduction

+ +

About the tutorial

+ +Since this is the first tutorial program, let us comment first on how +this tutorial and the rest of the deal.II documentation is supposed to +work. The documentation for deal.II comes essentially at three +different levels: +- The tutorial: This is a collection of programs that shows how + deal.II is used in practice. It doesn't typically discuss individual + functions at the level of individual arguments, but rather wants to + give the big picture of how things work together. In other words, it + discusses "concepts": what are the building blocks of deal.II and + how are they used together in finite element programs. +- The manual: This is the documentation of every single class and + every single (member) function in deal.II. You get there if, for + example, you click on the "Main page" or "Classes" tab at the top of + this page. This is the place where you would look up what the second + argument of Triangulation::create_triangulation_compatibility means, + to give just one slightly obscure example. You need this level of + documentation for when you know what you want to do, but forgot how + exactly the function was named, what its arguments are, or what it + returns. Note that you also get into the manual whenever you read + through the tutorial and click on any of the class or function + names, i.e. the tutorial contains a great many links into the manual + for whenever you need a more detailed description of a function or + class. On the other hand, the manual is not a good place to learn + deal.II since it gives you a microscopic view of things without + telling you how a function might fit into the bigger picture. +- Modules: These are groups of classes and functions that work + together or have related functionality. If you click on the + "Modules" tab at the top of this page, you end up on a page that + lists a number of such groups. Each module discusses the underlying + principles of these classes; for example, the @ref Sparsity module + talks about all sorts of different issues related to storing + sparsity patterns of matrices. This is documentation at an + intermediate level: they give you an overview of what's there in a + particular area. For example when you wonder what finite element + classes exist, you would take a look at the @ref fe module. The + modules are, of course, also cross-linked to the manual (and, at + times, to the tutorial); if you click on a class name, say on + Triangulation, would will also at the very top right under the class + name get a link to the modules this class is a member of if you want + to learn more about its context. + +Let's come back to the tutorial, since you are looking at the first program +(or "step") of it. Each tutorial program is subdivided into the following +sections: +
    +
  1. Introduction: This is a discussion of what the program + does, including the mathematical model, and + what programming techniques are new compared to previous + tutorial programs. +
  2. The commented program: An extensively documented listing of the + source code. Here, we often document individual lines, or + blocks of code, and discuss what they do, how they do it, and + why. The comments frequently reference the introduction, + i.e. you have to understand what the program wants to achieve + (a goal discussed in the introduction) before you can + understand how it intends to get there. +
  3. Results: The output of the program, with comments and + interpretation. This section also frequently has a subsection + that gives suggestions on how to extend the program in various + direction; in the earlier programs, this is intended to give + you directions for little experiments designed to make your + familiar with deal.II, while in later programs it is more about + how to use more advanced numerical techniques. +
  4. The plain program: The source code stripped of + all comments. This is useful if you want to see the "big + picture" of the code, since the commented version of the + program has so much text in between that it is often difficult + to see the entire code of a single function on the screen at + once. +
+ +The tutorials are not only meant to be static documentation, but you +should play with them. To this end, go to the +examples/step-1 directory (or whatever the number of the +tutorial is that you're interested in) and type +@code + make + make run +@endcode +The first command compiles the sources into an executable, while the +second executes it (strictly speaking, make run will also +compile the code if the executable doesn't exist yet, so you could +have skipped the first command if you wanted). This is all that's +needed to run the code and produce the output that is discussed in the +"Results" section of the tutorial programs. + +When learning the library, you need to play with it and see what +happens. To this end, open the examples/step-1/step-1.cc +source file with your favorite editor and modify it in some way, save it and +run it as above. A few suggestions for possibly modifications are given at the +end of the results section of this program, where we also provide a few links +to other useful pieces of information. + + +

What this program does

+ +Let's come back to step-1, the current program. +In this first example, we don't actually do very much, but show two +techniques: what is the syntax to generate triangulation objects, and +some elements of simple loops over all cells. We create two grids, one +which is a regularly refined square (not very exciting, but a common +starting grid for some problems), and one more geometric attempt: a +ring-shaped domain, which is refined towards the inner edge. Through +this, you will get to know three things every finite element program +will have to have somewhere: An object of type Triangulation for the +mesh; a call to the GridGenerator functions to generate a mesh; and +loops over all cells that involve iterators (iterators are a +generalization of pointers and are frequently used in the C++ standard +library; in the context of deal.II, the @ref Iterators module talks +about them). + +The program is otherwise small enough that it doesn't need a whole lot +of introduction. Let us just continue with its commented source. + + +

About scientific computing in general

+ +If you are reading through this tutorial program, chances are that you are +interested in continuing to use deal.II for your own projects. Thus, you are +about to embark on an exercise in programming using a large-scale scientific +computing library. Unless you are already an experienced user of large-scale +programming methods, this may be new territory for you — with all the +new rules that go along with it such as the fact that you will have to deal +with code written by others, that you may have to think about documenting your +own code because you may not remember what exactly it is doing a year down the +road (or because others will be using it as well), or coming up with ways to +test that your program is doing the right thing. None of this is something +that we typically train mathematicians, engineers, or scientists in but that +is important when you start writing software of more than a few hundred +lines. Remember: Producing software is not the same as just writing code. + +To make your life easier on this journey let us point to two resources that +are worthwhile browsing through before you start any large-scale programming: + +- The deal.II + Frequently Asked Questions: This page has a good number of questions + that pertain to particular aspects of deal.II, but also to more general + questions such as "How do I debug scientific computing codes?" or "Can I + train myself to write code that has fewer bugs?". + +- The Software Carpentry project + that provides introductions to many topics that are important to dealing + with software, such as version control, make files, testing, etc. It is + specifically written for scientists and engineers, not for computer + scientists, and has a focus on short, practical lessons. + +As a general recommendation: If you expect to spend more than a few days +writing software in the future, do yourself the favor of learning tools that +can make your life more productive, in particular debuggers and integrated +development environments. You will find that you will get the time spent +learning these tools back severalfold soon by being more productive! diff --git a/deal.II/examples/step-49/doc/kind b/deal.II/examples/step-49/doc/kind new file mode 100644 index 0000000000..15a13db451 --- /dev/null +++ b/deal.II/examples/step-49/doc/kind @@ -0,0 +1 @@ +basic diff --git a/deal.II/examples/step-49/doc/results.dox b/deal.II/examples/step-49/doc/results.dox new file mode 100644 index 0000000000..595a388fa6 --- /dev/null +++ b/deal.II/examples/step-49/doc/results.dox @@ -0,0 +1,79 @@ +

Results

+ +The program has, after having been run, produced two grids, which look +like this: + + + + + + + +
+ @image html step-1.grid-1.png + + @image html step-1.grid-2.png +
+ +The left one, well, is not very exciting. The right one is — at least +— unconventional. + +While the second mesh is entirely artificial and made-up, and +certainly not very practical in applications, to everyone's surprise it +has found its way into the literature: see the paper by M. Mu +titled "PDE.MART: A network-based problem-solving environment", ACM +Trans. Math. Software, vol. 31, pp. 508-531, 2005. Apparently it is +good for some things at least. + + +

Possible extensions

+ +

Different adaptive refinement strategies

+ +This program obviously does not have a whole lot of functionality, but +in particular the second_grid function has a bunch of +places where you can play with it. For example, you could modify the +criterion by which we decide which cells to refine. An example would +be to change the condition to this: +@code + for (; cell!=endc; ++cell) + if (cell->center()[1] > 0) + cell->set_refine_flag (); +@endcode +This would refine all cells for which the $y$-coordinate of the cell's +center is greater than zero (the TriaAccessor::center +function that we call by dereferencing the cell iterator +returns a Point<2> object; subscripting [0] would give +the $x$-coordinate, subscripting [1] the +$y$-coordinate). By looking at the functions that TriaAccessor +provides, you can also use more complicated criteria for refinement. + +

Different geometries

+ +Another possibility would be to generate meshes of entirely different +geometries altogether. While for complex geometries there is no way around +using meshes obtained from mesh generators, there is a good number of +geometries for which deal.II can create meshes using the functions in the +GridGenerator namespace. Take a look at what it provides and see how it could +be used in a program like this. + +

Comments about programming and debugging

+ +We close with a comment about modifying or writing programs with deal.II in +general. When you start working with tutorial programs or your own +applications, you will find that mistakes happen: your program will contain +code that either aborts the program right away or bugs that simply lead to +wrong results. In either case, you will find it extremely helpful to know how +to work with a debugger: you may get by for a while by just putting debug +output into your program, compiling it, and running it, but ultimately finding +bugs with a debugger is much faster, much more convenient, and more reliable +because you don't have to recompile the program all the time and because you +can inspect the values of variables and how they change. + +Rather than postponing learning how to use a debugger till you really can't +see any other way to find a bug, here's the one piece of +advice we will provide in this program: learn how to use a debugger as soon as +possible. It will be time well invested. The deal.II Frequently Asked +Questions (FAQ) page linked to from the top-level deal.II webpage also provides a good number +of hints on debugging deal.II programs. diff --git a/deal.II/examples/step-49/doc/step-1.grid-1.png b/deal.II/examples/step-49/doc/step-1.grid-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7edc253dde0b6809e55bcf1160f7c937fca5f58 GIT binary patch literal 9111 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 literal 0 HcmV?d00001 diff --git a/deal.II/examples/step-49/doc/step-1.grid-2.png b/deal.II/examples/step-49/doc/step-1.grid-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc1d31d6ace2f9e4447b8fbf2b5a56d7f9f2b59 GIT binary patch literal 29392 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 literal 0 HcmV?d00001 diff --git a/deal.II/examples/step-49/doc/tooltip b/deal.II/examples/step-49/doc/tooltip new file mode 100644 index 0000000000..71927bda1d --- /dev/null +++ b/deal.II/examples/step-49/doc/tooltip @@ -0,0 +1 @@ +Creating a grid. Refining it. Writing it to a file diff --git a/deal.II/examples/step-49/step-49.cc b/deal.II/examples/step-49/step-49.cc new file mode 100644 index 0000000000..2da4f71da2 --- /dev/null +++ b/deal.II/examples/step-49/step-49.cc @@ -0,0 +1,209 @@ +/* $Id: step-1.cc 27657 2012-11-21 13:19:08Z bangerth $ + * + * Copyright (C) 1999-2003, 2005-2007, 2009, 2011-2012 by the deal.II authors + * + * This file is subject to QPL and may not be distributed + * without copyright and license information. Please refer + * to the file deal.II/doc/license.html for the text and + * further information on this license. + */ + +// @sect3{Include files} + +// The most fundamental class in the library is the Triangulation class, which +// is declared here: +#include +// We need the following two includes for loops over cells and/or faces: +#include +#include +// Here are some functions to generate standard grids: +#include +// We would like to use boundaries which are not straight lines, so we import +// some classes which predefine some boundary descriptions: +#include +// Output of grids in various graphics formats: +#include + +// This is needed for C++ output: +#include +// And this for the declarations of the `sqrt' and `fabs' functions: +#include + +// The final step in importing deal.II is this: All deal.II functions and +// classes are in a namespace dealii, to make sure they don't +// clash with symbols from other libraries you may want to use in conjunction +// with deal.II. One could use these functions and classes by prefixing every +// use of these names by dealii::, but that would quickly become +// cumbersome and annoying. Rather, we simply import the entire deal.II +// namespace for general use: +using namespace dealii; + +// @sect3{Creating the first mesh} + +// In the following, first function, we simply use the unit square as domain +// and produce a globally refined grid from it. +void first_grid () +{ + // The first thing to do is to define an object for a triangulation of a + // two-dimensional domain: + Triangulation<2> triangulation; + // Here and in many following cases, the string "<2>" after a class name + // indicates that this is an object that shall work in two space + // dimensions. Likewise, there are versions of the triangulation class that + // are working in one ("<1>") and three ("<3>") space dimensions. The way + // this works is through some template magic that we will investigate in + // some more detail in later example programs; there, we will also see how + // to write programs in an essentially dimension independent way. + + // Next, we want to fill the triangulation with a single cell for a square + // domain. The triangulation is the refined four times, to yield 4^4=256 + // cells in total: + GridGenerator::hyper_cube (triangulation); + triangulation.refine_global (4); + + // Now we want to write a graphical representation of the mesh to an output + // file. The GridOut class of deal.II can do that in a number of different + // output formats; here, we choose encapsulated postscript (eps) format: + std::ofstream out ("grid-1.eps"); + GridOut grid_out; + grid_out.write_eps (triangulation, out); +} + + + +// @sect3{Creating the second mesh} + +// The grid in the following, second function is slightly more complicated in +// that we use a ring domain and refine the result once globally. +void second_grid () +{ + // We start again by defining an object for a triangulation of a + // two-dimensional domain: + Triangulation<2> triangulation; + + // We then fill it with a ring domain. The center of the ring shall be the + // point (1,0), and inner and outer radius shall be 0.5 and 1. The number of + // circumferential cells could be adjusted automatically by this function, + // but we choose to set it explicitely to 10 as the last argument: + const Point<2> center (1,0); + const double inner_radius = 0.5, + outer_radius = 1.0; + GridGenerator::hyper_shell (triangulation, + center, inner_radius, outer_radius, + 10); + // By default, the triangulation assumes that all boundaries are straight + // and given by the cells of the coarse grid (which we just created). It + // uses this information when cells at the boundary are refined and new + // points need to be introduced on the boundary; if the boundary is assumed + // to be straight, then new points will simply be in the middle of the + // surrounding ones. + // + // Here, however, we would like to have a curved boundary. Fortunately, some + // good soul implemented an object which describes the boundary of a ring + // domain; it only needs the center of the ring and automatically figures + // out the inner and outer radius when needed. Note that we associate this + // boundary object with that part of the boundary that has the "boundary + // indicator" zero. By default (at least in 2d and 3d, the 1d case is + // slightly different), all boundary parts have this number, but you can + // change this number for some parts of the boundary. In that case, the + // curved boundary thus associated with number zero will not apply on those + // parts with a non-zero boundary indicator, but other boundary description + // objects can be associated with those non-zero indicators. If no boundary + // description is associated with a particular boundary indicator, a + // straight boundary is implied. + const HyperShellBoundary<2> boundary_description(center); + triangulation.set_boundary (0, boundary_description); + + // In order to demonstrate how to write a loop over all cells, we will + // refine the grid in five steps towards the inner circle of the domain: + for (unsigned int step=0; step<5; ++step) + { + // Next, we need an iterator which points to a cell and which we will + // move over all active cells one by one (active cells are those that + // are not further refined, and the only ones that can be marked for + // further refinement, obviously). By convention, we almost always use + // the names cell and endc for the iterator + // pointing to the present cell and to the one-past-the-end + // iterator: + Triangulation<2>::active_cell_iterator + cell = triangulation.begin_active(), + endc = triangulation.end(); + + // The loop over all cells is then rather trivial, and looks like any + // loop involving pointers instead of iterators: + for (; cell!=endc; ++cell) + // Next, we want to loop over all vertices of the cells. Since we are + // in 2d, we know that each cell has exactly four vertices. However, + // instead of penning down a 4 in the loop bound, we make a first + // attempt at writing it in a dimension-independent way by which we + // find out about the number of vertices of a cell. Using the + // GeometryInfo class, we will later have an easier time getting the + // program to also run in 3d: we only have to change all occurrences + // of <2> to <3>, and do not + // have to audit our code for the hidden appearance of magic numbers + // like a 4 that needs to be replaced by an 8: + for (unsigned int v=0; + v < GeometryInfo<2>::vertices_per_cell; + ++v) + { + // If this cell is at the inner boundary, then at least one of its + // vertices must sit on the inner ring and therefore have a radial + // distance from the center of exactly 0.5, up to floating point + // accuracy. Compute this distance, and if we have found a vertex + // with this property flag this cell for later refinement. We can + // then also break the loop over all vertices and move on to the + // next cell. + const double distance_from_center + = center.distance (cell->vertex(v)); + + if (std::fabs(distance_from_center - inner_radius) < 1e-10) + { + cell->set_refine_flag (); + break; + } + } + + // Now that we have marked all the cells that we want refined, we let + // the triangulation actually do this refinement. The function that does + // so owes its long name to the fact that one can also mark cells for + // coarsening, and the function does coarsening and refinement all at + // once: + triangulation.execute_coarsening_and_refinement (); + } + + + // Finally, after these five iterations of refinement, we want to again + // write the resulting mesh to a file, again in eps format. This works just + // as above: + std::ofstream out ("grid-2.eps"); + GridOut grid_out; + grid_out.write_eps (triangulation, out); + + + // At this point, all objects created in this function will be destroyed in + // reverse order. Unfortunately, we defined the boundary object after the + // triangulation, which still has a pointer to it and the library will + // produce an error if the boundary object is destroyed before the + // triangulation. We therefore have to release it, which can be done as + // follows. Note that this sets the boundary object used for part "0" of the + // boundary back to a default object, over which the triangulation has full + // control. + triangulation.set_boundary (0); + // An alternative to doing so, and one that is frequently more convenient, + // would have been to declare the boundary object before the triangulation + // object. In that case, the triangulation would have let lose of the + // boundary object upon its destruction, and everything would have been + // fine. +} + + + +// @sect3{The main function} + +// Finally, the main function. There isn't much to do here, only to call the +// two subfunctions, which produce the two grids. +int main () +{ + first_grid (); + second_grid (); +} -- 2.39.5