Interior + Boundary CVT
is a FORTRAN90 program which
creates a Centroidal Voronoi Tessellation
of N points in an M-dimensional region, in which points are
also placed along the boundary.
The standard CVT algorithm will tend to place points uniformly
inside the region, but will never place points on the boundary.
However, in many cases, it would be very desirable to smoothly
modify the set of points so that some of them fall on the boundary.
This is the case, for instance, when the points are to be used to
triangulate the region and define a finite element grid.
The method for doing this relies on the observation that the
generator points become uniformly distributed because they
"push" each other away, by grabbing sample points. The generator
points do not approach the boundary too closely, because there
are no sample points on the other side of the boundary. In essence,
the boundary also "pushes" the generator points away.
By making "reflected" sample points whenever a generator is near
the boundary, we essentially neutralize the boundary effect, allowing
the generator points in the interior to push a layer of generators
onto the boundary. In most cases, once a point hits the boundary,
it will not leave, although it may continue to adjust its position
on the boundary itself.
This program was a "work in progress", until progress was halted.
So a number of ideas were started, and only some completed.
For the program as it stands now, only a simple 2D box region
has been examined. A next logical step would be to work on
more general 2D regions; then to make the natural extension to
3D or arbitrary dimension.
CCVT_REFLECT is an experimental code; so far, the experiment
is not doing well. I haven't figured out yet how to make the
points behave as well as they do for CCVT_BOX. The idea is,
though, that the method of pulling points to the boundary seems
fairly natural and flexible to me, so maybe I just need to
find the right way to implement it.
The computer code and data files made available on this web page
are distributed under
the GNU LGPL license.
CCVT_REFLECT is available in
a FORTRAN90 version.
Related Data and Programs:
a FORTRAN90 program which
is similar to CCVT_REFLECT, but which works in a 2D box.
Voronoi diagrams -
a study of a fundamental geometric data structure,
ACM Computing Surveys,
Volume 23, Number 3, pages 345-405, September 1991.
John Burkardt, Max Gunzburger, Janet Peterson, Rebecca Brannon,
User Manual and Supporting Information for Library of Codes
for Centroidal Voronoi Placement and Associated Zeroth,
First, and Second Moment Determination,
Sandia National Laboratories Technical Report SAND2002-0099,
Qiang Du, Vance Faber, Max Gunzburger,
Centroidal Voronoi Tessellations: Applications and Algorithms,
SIAM Review, Volume 41, 1999, pages 637-676.
Qiang Du, Max Gunzburger, Lili Ju,
Meshfree, Probabilistic Determination of Point Sets and Support
Regions for Meshfree Computing,
Computer Methods in Applied Mechanics in Engineering,
Volume 191, 2002, pages 1349-1366;
Lili Ju, Qiang Du, Max Gunzburger,
Probabilistic Methods for Centroidal Voronoi Tessellations and
their Parallel Implementations,
Parallel Computing, Volume 28, 2002, pages 1477-1500.
Examples and Tests:
List of Routines:
MAIN is the main program for CCVT_REFLECT.
CH_CAP capitalizes a single character.
CVT_ENERGY computes the CVT energy of a dataset.
CVT_SAMPLE returns sample points.
CVT_WRITE writes a CVT dataset to a file.
FIND_CLOSEST finds the nearest R point to each S point.
GET_UNIT returns a free FORTRAN unit number.
HALHAM_LEAP_CHECK checks LEAP for a Halton or Hammersley sequence.
HALHAM_N_CHECK checks N for a Halton or Hammersley sequence.
HALHAM_DIM_NUM_CHECK checks DIM_NUM for a Halton or Hammersley sequence.
HALHAM_SEED_CHECK checks SEED for a Halton or Hammersley sequence.
HALHAM_STEP_CHECK checks STEP for a Halton or Hammersley sequence.
HALTON_BASE_CHECK checks BASE for a Halton sequence.
I4_TO_HALTON_SEQUENCE computes N elements of a leaped Halton subsequence.
I4VEC_TRANSPOSE_PRINT prints an I4VEC "transposed".
MPB projects generators onto the boundary of the region.
POINTS_EPS creates an EPS file image of a set of points.
PRIME returns any of the first PRIME_MAX prime numbers.
R8MAT_UNIFORM_01 returns a unit pseudorandom R8MAT.
RANDOM_INITIALIZE initializes the FORTRAN90 random number seed.
S_EQI is a case insensitive comparison of two strings for equality.
TIMESTAMP prints the current YMDHMS date as a time stamp.
TIMESTRING writes the current YMDHMS date into a string.
TUPLE_NEXT_FAST computes the next element of a tuple space, "fast".
You can go up one level to
the FORTRAN90 source codes.
Last revised on 26 November 2006.