GeoTessJavaExamples  2.0
PopulateModel3D.java
Go to the documentation of this file.
1 //- ****************************************************************************
2 //-
3 //- Copyright 2009 Sandia Corporation. Under the terms of Contract
4 //- DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
5 //- retains certain rights in this software.
6 //-
7 //- BSD Open Source License.
8 //- All rights reserved.
9 //-
10 //- Redistribution and use in source and binary forms, with or without
11 //- modification, are permitted provided that the following conditions are met:
12 //-
13 //- * Redistributions of source code must retain the above copyright notice,
14 //- this list of conditions and the following disclaimer.
15 //- * Redistributions in binary form must reproduce the above copyright
16 //- notice, this list of conditions and the following disclaimer in the
17 //- documentation and/or other materials provided with the distribution.
18 //- * Neither the name of Sandia National Laboratories nor the names of its
19 //- contributors may be used to endorse or promote products derived from
20 //- this software without specific prior written permission.
21 //-
22 //- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 //- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 //- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 //- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
26 //- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 //- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 //- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 //- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 //- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 //- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 //- POSSIBILITY OF SUCH DAMAGE.
33 //-
34 //- ****************************************************************************
35 
36 package gov.sandia.geotess.examples;
37 
38 import gov.sandia.geotess.GeoTessMetaData;
39 import gov.sandia.geotess.GeoTessModel;
40 import gov.sandia.geotess.GeoTessModelUtils;
41 import gov.sandia.gmp.util.globals.DataType;
42 import gov.sandia.gmp.util.numerical.vector.VectorGeo;
43 
44 import java.io.File;
45 import java.util.Date;
46 
47 /**
48  * An example of how to generate a 3D GeoTessModel and populate it with data.
49  * The data are stored on a GeoTessGrid comprised of 3 multi-level
50  * tessellations, one for the core, one for the mantle and one for the crust.
51  * The GeoTessGrid is not generated by this example. It was previously
52  * computed using the GeoTessBuilder software and delivered as part of the
53  * GeoTess package in the GeoTessModels directory.
54  * <p>The data used to populate the model come from the ak135 model,
55  * which is hardcoded into the source code for the example.
56  *
57  * @author sballar
58  *
59  */
60 public class PopulateModel3D
61 {
62 /**
63  * An example of how to generate a 3D GeoTessModel and populate it with data.
64  * The data are stored on a GeoTessGrid comprised of 3 multi-level
65  * tessellations, one for the core, one for the mantle and one for the crust.
66  * The GeoTessGrid is not generated by this example. It was previously
67  * computed using the GeoTessBuilder software and delivered as part of the
68  * GeoTess package in the GeoTessModels directory.
69  * <p>The data used to populate the model come from the ak135 model,
70  * which is hardcoded into the source code for the example.
71  *
72  * @param args this example requires a single command line argument
73  * that specifies the full path of the grid file. The file is called
74  * small_model_grid.ascii and was delivered with the GeoTess package in
75  * the GeoTessModels directory.
76  */
77  public static void main(String[] args)
78  {
79  try
80  {
81  if (args.length == 0)
82  throw new Exception(
83  "\nMust specify a single command line argument specifying " +
84  "the path to the file small_model_grid.geotess\n");
85 
86  System.out.println("Example that illustrates how to populate a 3D model.");
87  System.out.println();
88 
89  // Create a MetaData object in which we can specify information
90  // needed for model construction.
91  GeoTessMetaData metaData = new GeoTessMetaData();
92 
93  // Specify a description of the model. This information is not
94  // processed in any way by GeoTess. It is carried around for
95  // information purposes.
96  metaData.setDescription(String
97  .format("Simple example of populating a 3D GeoTess model%n" +
98  "comprised of 3 multi-level tessellations%n"
99  + "author: Sandy Ballard%n"
100  + "contact: sballar@sandia.gov"));
101 
102  // Specify a list of layer names delimited by semi-colons
103  metaData.setLayerNames("INNER_CORE; OUTER_CORE; LOWER_MANTLE; " +
104  "TRANSITION_ZONE; UPPER_MANTLE; LOWER_CRUST; UPPER_CRUST");
105 
106  // Specify the relationship between grid tessellations and model layers.
107  // the list has nLayers elements where each element specifies the
108  // index of the multilevel tessellation that supports the
109  // corresponding layer. In this example, the model has
110  // 7 layers and 3 multi-level tessellations. The first
111  // tessellation (index 0) supports the core layers (layers
112  // 0 and 1). The second tessellation (index 1) supports the
113  // three mantle layers (layer indices 2, 3 and 4). The third
114  // and final tessellation (index 2) supports the two crustal
115  // layers (layer indices 5 and 6).
116  metaData.setLayerTessIds(new int[] {0, 0, 1, 1, 1, 2, 2});
117 
118  // specify the names of the attributes and the units of the
119  // attributes in two Strings delimited by semi-colons.
120  metaData.setAttributes("Vp; Vs; rho", "km/sec; km/sec; g/cc");
121 
122  // specify the DataType for the data. All attributes, in all
123  // profiles, will have the same data type. Note that this
124  // applies only to the data; radii are always stored as floats.
125  metaData.setDataType(DataType.FLOAT);
126 
127  // specify the name of the software that is going to generate
128  // the model. This gets stored in the model for future reference.
129  metaData.setModelSoftwareVersion("PopulateModel3D 1.0.0");
130 
131  // specify the date when the model was generated. This gets
132  // stored in the model for future reference.
133  metaData.setModelGenerationDate(new Date().toString());
134 
135  // specify the path to the file containing the grid to be used for
136  // this test. This information was passed in as a command line
137  // argument. Grids were included in the software delivery and
138  // are available from the GeoTess website. Grids can also be
139  // constructed using the GeoTessBuilder software. The grid
140  // required for this example is in a file called
141  // small_model_grid.ascii which is in the GeoTessModels
142  // directory delivered with GeoTess.
143  File gridFile = new File(args[0]);
144 
145  // call a GeoTessModel constructor to build the model. This will
146  // load the grid, and initialize all the data structures to null.
147  // To be useful, we will have to populate the data structures.
148  GeoTessModel model = new GeoTessModel(gridFile.getCanonicalPath(), metaData);
149 
150  // Now we will populate the model with Profiles. At this point, the
151  // model has a 2D array of Profile objects with dimensions
152  // nVertices x nLayers with all the elements of the array initialized
153  // to null. We will now populate the Profiles array.
154  //
155  // now loop over every vertex in the grid, connected and not-connected.
156  for (int vtx = 0; vtx < model.getNVertices(); ++vtx)
157  {
158  // retrieve the unit vector corresponding to the i'th vertex
159  double[] vertex = model.getGrid().getVertex(vtx);
160 
161  // find the latitude and longitude of vertex, in degrees
162  double lat = VectorGeo.getLatDegrees(vertex);
163  double lon = VectorGeo.getLonDegrees(vertex);
164 
165  // loop over the 7 layers of the model (inner_core, outer_core, etc)
166  for (int layer=0; layer<model.getNLayers(); ++layer)
167  {
168  // get the profile radii for the current lat, lon, and layer.
169  // This is a 1D array of radius values where the first radius is
170  // the radius at the bottom of the layer, the last radius is the
171  // radius of the top of the layer and there can be as many in between
172  // as desired. This function will be different for every real-life
173  // application.
174  float[] radii = getRadii(lat, lon, layer);
175 
176  // get the profile data values for current lat, lon, layer.
177  // This is a 2D array of values, nNodes by nAttributes.
178  // In this example, nAttributes is 3 corresponding to
179  // attributes vp, vs and rho. The number of nodes can
180  // vary as a function of vertex and layer.
181  float[][] rawData = getRawData(lat, lon, layer);
182 
183  model.setProfile(vtx, layer, radii, rawData);
184  }
185  }
186 
187 
188 
189  // At this point, we have a fully functional GeoTessModel object
190  // that we can work with.
191 
192  // print a bunch of information about the model to the screen.
193  System.out.println(model.toString());
194 
195  // print a profile for a single vertex, spanning all layers.
196  System.out.println(GeoTessModelUtils.profileToString(model, 1));
197 
198  //model.writeModel(new File(gridFile.getParentFile(), "small_model.ascii"), "*");
199 
200  System.out.println("Done.");
201  }
202  catch (Exception ex)
203  {
204  ex.printStackTrace();
205  }
206 
207  }
208 
209  /**
210  * Returns a 1D profile of monotonically increasing radius values
211  * that define the radial positions of nodes along a radial
212  * profile through a single layer in the model.
213  * <p>
214  * For this example, we will return the radius positions of the
215  * nodes in the AK135 model, stretched a little bit so that
216  * the top of the model will coincide with the radius of the
217  * WGS84 ellipsoid instead of the ak135 value of 6371 km.
218  * @param lat the latitude of the profile
219  * @param lon the longitude of the profile
220  * @param layer the index of the layer.
221  * @return 1D array of radius values, in km.
222  */
223  protected static float[] getRadii(double lat, double lon, int layer)
224  {
225  // convert lat, lon in degrees to unit vector.
226  double[] vertex = VectorGeo.getVectorDegrees(lat, lon);
227 
228  // find the radius of the WGS84 ellipsoid at the latitude of vertex.
229  double earthRadius = VectorGeo.getEarthRadius(vertex);
230 
231  // find a stretching factor that will stretch the radius values so that they
232  // span the range from zero at the center of the earth to the radius of the
233  // WGS84 ellipsoid at the surface of the Earth. This is not geophysically
234  // realistic, but sufficient for this simplistic example.
235  float stretch = (float)(earthRadius / 6371.);
236 
237  float[] radii = new float[ak135[layer].length];
238  for (int i=0; i<radii.length; ++i)
239  radii[i] = ak135[layer][i][0] * stretch;
240 
241  return radii;
242  }
243 
244  /**
245  * Retrieve a 2D array of floats with nNodes x nAttributes elements.
246  * The number of attributes is 3, for the vp, vs and rho. nDataArrays
247  * varies in the different layers. For core and mantle layers,
248  * nNodes will equal the number of radii in the corresponding
249  * layers of the AK135 model. For the crustal layers, nNodes
250  * will be one, reflecting the fact that the attribute values are
251  * constant in the crustal layers of the ak135 model.
252  * <p>
253  * In this example, the data returned are independent of latitude and
254  * longitude since ak135 is a '1D' model, but this will not generally
255  * be true for real 3D models.
256  * @param lat
257  * @param lon
258  * @param layer
259  * @return
260  */
261  protected static float[][] getRawData(double lat, double lon, int layer)
262  {
263  // get a reference to the ak135 model values for the layer of interest.
264  float[][] ak135Layer = ak135[layer];
265 
266  // nNodes is the number of radial positions defined in this layer in the
267  // ak135 model.
268  int nNodes = ak135Layer.length;
269 
270  // data is the nNodes x nAttributes array that will be returned.
271  float[][] data = null;
272 
273  if (nNodes == 2 && ak135Layer[0][1] == ak135Layer[1][1])
274  {
275  // this layer consists of only two nodes and the vp values are equal,
276  // which is true from the two crustal layers. Make a float[1][3] array
277  // containing the values from only the first node.
278  data = new float[1][3];
279  data[0][0] = ak135Layer[0][1];
280  data[0][1] = ak135Layer[0][2];
281  data[0][2] = ak135Layer[0][3];
282  }
283  else
284  {
285  // this layer has more than 2 nodes or maybe it has two
286  // nodes but the vp values are not equal. Make an nNodes
287  // by 3 array of data values.
288  data = new float[nNodes][3];
289  for (int i=0; i<nNodes; ++i)
290  {
291  data[i][0] = ak135Layer[i][1];
292  data[i][1] = ak135Layer[i][2];
293  data[i][2] = ak135Layer[i][3];
294  }
295  }
296  return data;
297  }
298 
299  /**
300  * A 3D array of floats with nLayers x nNodes x nAttributes+1
301  * elements. The attributes are radius in km,
302  * vp in km/sec, vs in km/sec and density in g/cc.
303  * There are 7 layers corresponding to the inner core,
304  * outer core, lower mantle, transition zone, upper mantle,
305  * lower crust and upper crust. The number of nodes in
306  * each layer is variable by layer.
307  */
308  static float[][][] ak135 = new float[][][] {{
309  // inner core:
310  // radius vp vs density
311  { 0.000F, 11.2622F, 3.6678F, 13.0122F},
312  { 50.710F, 11.2618F, 3.6675F, 13.0117F},
313  { 101.430F, 11.2606F, 3.6667F, 13.0100F},
314  { 152.140F, 11.2586F, 3.6653F, 13.0074F},
315  { 202.850F, 11.2557F, 3.6633F, 13.0036F},
316  { 253.560F, 11.2521F, 3.6608F, 12.9988F},
317  { 304.280F, 11.2477F, 3.6577F, 12.9929F},
318  { 354.990F, 11.2424F, 3.6540F, 12.9859F},
319  { 405.700F, 11.2364F, 3.6498F, 12.9779F},
320  { 456.410F, 11.2295F, 3.6450F, 12.9688F},
321  { 507.130F, 11.2219F, 3.6396F, 12.9586F},
322  { 557.840F, 11.2134F, 3.6337F, 12.9474F},
323  { 659.260F, 11.1941F, 3.6202F, 12.9217F},
324  { 709.980F, 11.1832F, 3.6126F, 12.9072F},
325  { 760.690F, 11.1715F, 3.6044F, 12.8917F},
326  { 811.400F, 11.1590F, 3.5957F, 12.8751F},
327  { 862.110F, 11.1457F, 3.5864F, 12.8574F},
328  { 912.830F, 11.1316F, 3.5765F, 12.8387F},
329  { 963.540F, 11.1166F, 3.5661F, 12.8188F},
330  {1014.250F, 11.0983F, 3.5551F, 12.7980F},
331  {1064.960F, 11.0850F, 3.5435F, 12.7760F},
332  {1115.680F, 11.0718F, 3.5314F, 12.7530F},
333  {1166.390F, 11.0585F, 3.5187F, 12.7289F},
334  {1217.500F, 11.0427F, 3.5043F, 12.7037F}
335  },
336  {
337  // outer core:
338  // radius vp vs density
339  {1217.500F, 10.2890F, 0.0000F, 12.1391F},
340  {1267.430F, 10.2854F, 0.0000F, 12.1133F},
341  {1317.760F, 10.2745F, 0.0000F, 12.0867F},
342  {1368.090F, 10.2565F, 0.0000F, 12.0593F},
343  {1418.420F, 10.2329F, 0.0000F, 12.0311F},
344  {1468.760F, 10.2049F, 0.0000F, 12.0001F},
345  {1519.090F, 10.1739F, 0.0000F, 11.9722F},
346  {1569.420F, 10.1415F, 0.0000F, 11.9414F},
347  {1670.080F, 10.0768F, 0.0000F, 11.8772F},
348  {1720.410F, 10.0439F, 0.0000F, 11.8437F},
349  {1770.740F, 10.0103F, 0.0000F, 11.8092F},
350  {1821.070F, 9.9761F, 0.0000F, 11.7737F},
351  {1871.400F, 9.9410F, 0.0000F, 11.7373F},
352  {1921.740F, 9.9051F, 0.0000F, 11.6998F},
353  {1972.070F, 9.8682F, 0.0000F, 11.6612F},
354  {2022.400F, 9.8304F, 0.0000F, 11.6216F},
355  {2072.730F, 9.7914F, 0.0000F, 11.5809F},
356  {2123.060F, 9.7513F, 0.0000F, 11.5391F},
357  {2173.390F, 9.7100F, 0.0000F, 11.4962F},
358  {2223.720F, 9.6673F, 0.0000F, 11.4521F},
359  {2274.050F, 9.6232F, 0.0000F, 11.4069F},
360  {2324.380F, 9.5777F, 0.0000F, 11.3604F},
361  {2374.720F, 9.5306F, 0.0000F, 11.3127F},
362  {2425.050F, 9.4814F, 0.0000F, 11.2639F},
363  {2475.380F, 9.4297F, 0.0000F, 11.2137F},
364  {2525.710F, 9.3760F, 0.0000F, 11.1623F},
365  {2576.040F, 9.3205F, 0.0000F, 11.1095F},
366  {2626.370F, 9.2634F, 0.0000F, 11.0555F},
367  {2676.700F, 9.2042F, 0.0000F, 11.0001F},
368  {2727.030F, 9.1426F, 0.0000F, 10.9434F},
369  {2777.360F, 9.0792F, 0.0000F, 10.8852F},
370  {2827.700F, 9.0138F, 0.0000F, 10.8257F},
371  {2878.030F, 8.9461F, 0.0000F, 10.7647F},
372  {2928.360F, 8.8761F, 0.0000F, 10.7023F},
373  {2978.690F, 8.8036F, 0.0000F, 10.6385F},
374  {3029.020F, 8.7283F, 0.0000F, 10.5731F},
375  {3079.350F, 8.6496F, 0.0000F, 10.5062F},
376  {3129.680F, 8.5692F, 0.0000F, 10.4378F},
377  {3180.010F, 8.4861F, 0.0000F, 10.3679F},
378  {3230.340F, 8.4001F, 0.0000F, 10.2964F},
379  {3280.680F, 8.3122F, 0.0000F, 10.2233F},
380  {3331.010F, 8.2213F, 0.0000F, 10.1485F},
381  {3381.340F, 8.1283F, 0.0000F, 10.0722F},
382  {3431.670F, 8.0382F, 0.0000F, 9.9942F},
383  {3479.500F, 8.0000F, 0.0000F, 9.9145F}
384  },
385  {
386  // lower mantle:
387  // radius vp vs density
388  {3479.500F, 13.6602F, 7.2811F, 5.5515F},
389  {3531.670F, 13.6566F, 7.2704F, 5.5284F},
390  {3581.330F, 13.6530F, 7.2597F, 5.5051F},
391  {3631.000F, 13.6494F, 7.2490F, 5.4817F},
392  {3681.000F, 13.5900F, 7.2258F, 5.4582F},
393  {3731.000F, 13.5312F, 7.2031F, 5.4345F},
394  {3779.500F, 13.4741F, 7.1807F, 5.4108F},
395  {3829.000F, 13.4156F, 7.1586F, 5.3869F},
396  {3878.500F, 13.3585F, 7.1369F, 5.3628F},
397  {3928.000F, 13.3018F, 7.1144F, 5.3386F},
398  {3977.500F, 13.2465F, 7.0931F, 5.3142F},
399  {4027.000F, 13.1894F, 7.0720F, 5.2898F},
400  {4076.500F, 13.1336F, 7.0500F, 5.2651F},
401  {4126.000F, 13.0783F, 7.0281F, 5.2403F},
402  {4175.500F, 13.0222F, 7.0063F, 5.2154F},
403  {4225.000F, 12.9668F, 6.9855F, 5.1904F},
404  {4274.500F, 12.9096F, 6.9627F, 5.1652F},
405  {4324.000F, 12.8526F, 6.9418F, 5.1398F},
406  {4373.500F, 12.7956F, 6.9194F, 5.1143F},
407  {4423.000F, 12.7382F, 6.8972F, 5.0887F},
408  {4472.500F, 12.6804F, 6.8742F, 5.0629F},
409  {4522.000F, 12.6221F, 6.8515F, 5.0370F},
410  {4571.500F, 12.5631F, 6.8286F, 5.0109F},
411  {4621.000F, 12.5031F, 6.8052F, 4.9847F},
412  {4670.500F, 12.4426F, 6.7815F, 4.9584F},
413  {4720.000F, 12.3819F, 6.7573F, 4.9319F},
414  {4769.500F, 12.3185F, 6.7326F, 4.9052F},
415  {4819.000F, 12.2550F, 6.7073F, 4.8785F},
416  {4868.500F, 12.1912F, 6.6815F, 4.8515F},
417  {4918.000F, 12.1245F, 6.6555F, 4.8245F},
418  {4967.500F, 12.0577F, 6.6285F, 4.7973F},
419  {5017.000F, 11.9895F, 6.6008F, 4.7699F},
420  {5066.500F, 11.9200F, 6.5727F, 4.7424F},
421  {5116.000F, 11.8491F, 6.5439F, 4.7148F},
422  {5165.500F, 11.7766F, 6.5138F, 4.6870F},
423  {5215.000F, 11.7026F, 6.4828F, 4.6591F},
424  {5264.500F, 11.6269F, 6.4510F, 4.6310F},
425  {5314.000F, 11.5495F, 6.4187F, 4.6028F},
426  {5363.500F, 11.4705F, 6.3854F, 4.5744F},
427  {5413.000F, 11.3896F, 6.3512F, 4.5459F},
428  {5462.500F, 11.3068F, 6.3160F, 4.5173F},
429  {5512.000F, 11.2221F, 6.2798F, 4.4885F},
430  {5561.500F, 11.1353F, 6.2426F, 4.4596F},
431  {5611.000F, 11.0558F, 6.2095F, 4.4305F},
432  {5661.000F, 10.9229F, 6.0897F, 4.4010F},
433  {5711.000F, 10.7900F, 5.9600F, 4.3714F}
434  },
435  {
436  // transition zone:
437  // radius vp vs density
438  {5711.000F, 10.2000F, 5.6100F, 4.0646F},
439  {5761.000F, 10.0320F, 5.5040F, 4.0028F},
440  {5811.000F, 9.8640F, 5.3980F, 3.9410F},
441  {5861.000F, 9.6960F, 5.2920F, 3.8793F},
442  {5911.000F, 9.5280F, 5.1860F, 3.8175F},
443  {5961.000F, 9.3600F, 5.0800F, 3.7557F}
444  },
445  {
446  // upper mantle:
447  // radius vp vs density
448  {5961.000F, 9.0300F, 4.8700F, 3.5470F},
449  {6011.000F, 8.8475F, 4.7830F, 3.5167F},
450  {6061.000F, 8.6650F, 4.6960F, 3.4864F},
451  {6111.000F, 8.4825F, 4.6090F, 3.4561F},
452  {6161.000F, 8.3000F, 4.5230F, 3.4258F},
453 // {6161.000F, 8.3000F, 4.5180F, 3.4258F}, // ignore small S discontinuity at 210 km depth
454  {6206.000F, 8.1750F, 4.5090F, 3.3985F},
455  {6251.000F, 8.0500F, 4.5000F, 3.3713F},
456  {6293.500F, 8.0450F, 4.4900F, 3.3455F},
457  {6336.000F, 8.0400F, 4.4800F, 3.3198F}
458  },
459  {
460  // lower crust:
461  // radius vp vs density
462  {6336.000F, 6.5000F, 3.8500F, 2.9200F},
463  {6351.000F, 6.5000F, 3.8500F, 2.9200F}
464  },
465  {
466  // upper crust:
467  // radius vp vs density
468  {6351.000F, 5.8000F, 3.4600F, 2.7200F},
469  {6371.000F, 5.8000F, 3.4600F, 2.7200F}}};
470 }
gov.sandia.geotess.examples.PopulateModel3D.getRawData
static float[][] getRawData(double lat, double lon, int layer)
Retrieve a 2D array of floats with nNodes x nAttributes elements.
Definition: PopulateModel3D.java:261
gov
gov.sandia.geotess.examples.PopulateModel3D
An example of how to generate a 3D GeoTessModel and populate it with data.
Definition: PopulateModel3D.java:61
gov.sandia.geotess
gov.sandia.geotess.examples.PopulateModel3D.main
static void main(String[] args)
An example of how to generate a 3D GeoTessModel and populate it with data.
Definition: PopulateModel3D.java:77
gov.sandia
gov.sandia.geotess.examples.PopulateModel3D.getRadii
static float[] getRadii(double lat, double lon, int layer)
Returns a 1D profile of monotonically increasing radius values that define the radial positions of no...
Definition: PopulateModel3D.java:223