I am trying to mesh a cylinder with a 2 m diameter and 3 meters height with 11000 tubes penetrations. About 5500 tubes are 1.1 cm diameter and another 5500 with 0.9 cm diameter.
I can successfully mesh the cylinder with 1357 tubes, but it does not seem to work with 5500 tubes.
I start by meshing one end of the cylinder to sweep to the other end, but the meshing does not work when I have large number of penetrations. I try to use small mesh size (0.15). but it is still not working.
What is the trick to mesh such complex model? The meshing I am doing is with Hex20.
Below are some of the pictures of the models that I was able to mesh.
The first thing I would suggest is using any symmetry you can in modeling and in your analysis as well if possible. In my example, I was able to use a 1/8th section. This is going to be a large model and memory will be the constraining factor. Working on a smaller section will allow you to iterate more quickly.
Second, I would recommend just focusing on meshing the surface to start with. You will need to get a small enough element size to allow for the surface mesher (the paving algorithm) to adjust elements within the constraints of all the holes. You may also need to set the number of intervals around the holes.
Third, it doesn’t really matter that you are using HEX20 elements in the end. You need to have a base linear element mesh before adding the higher order nodes. This will likely lead to more elements around the holes than you might have hoped for.
Finally, watch your element quality. It is likely that you will have a few poorly shaped elements unless you go to a very dense mesh. You will likely have to do some trial and error to find an element size that works for you. If you have an all positive Jacobian surface element mesh, the surface condition smoother will likely improve the quality.
The example below creates about 8500 penetrations in the complete circle with ~121000 quadrilaterals. You can use reflection and rotation to complete the top surface.
#!python
import numpy as np
cubit.cmd("undo off")
cubit.cmd('reset')
cubit.cmd('#{Units("si")}')
cubit.cmd('cylinder radius {2*m} z {3*m}')
cubit.cmd('cylinder radius {1.1*cm} z {4*m}') # hole size is 1.1 cm.
cubit.cmd('vol 2 copy move x {4*cm} repeat 48') # spacing is 4 cm.
cubit.cmd('vol 2 to 50 copy move y {4*cm} repeat 48')
last_id = cubit.get_last_id("volume")
for v in range(2, last_id+1):
center = cubit.get_center_point("volume", v)
x = center[0]
y = center[1]
if ( x*x + y*y) > 1.95*1.95:
cubit.cmd(f"delete volume {v}")
cubit.cmd(f"unite vol 2 to {last_id}")
cubit.cmd("subtract body all except 1 from body 1")
cubit.cmd("compress") # compress the id space so that the volumes are 1 and 2
cubit.cmd("webcut vol 1 plane yplane")
cubit.cmd("webcut volume 2 with plane yplane offset 0 rotate 45 about z")
cubit.cmd("delete vol 1 3")
cubit.cmd(f"curve with length={2*.011*np.pi} and with z_coord=1.5 int 8")
cubit.cmd(f"curve with length={.011*np.pi} and with z_coord=1.5 int 4")
cubit.cmd("surface with z_coord=1.5 size .008") # this is the size of curve edge length
cubit.cmd("mesh surf with z_coord=1.5")
cubit.cmd("surface 2153 smooth scheme condition number beta 2.0 cpu 0.5")
cubit.cmd("undo on")