Circle packing with fixed radius and fixed number of circle for each radius

It looks like in that image they’ve used a compact circle packing (each gap between the circles has 3 sides)
In general this will mean the circles are all of slightly different sizes.
You can pack circles of predefined sizes on a surface with the definitions I posted above, just adding an OnMesh goal with your target surface, but it won’t be as neat - many of the spaces between the circles will have 4 or more sides.
Here’s an example for a compact circle packing on a surface: (40.9 KB)

For more about compact circle packings, see this paper
or Mathias Höbinger’s thesis