[Gmsh] Composite RVE
Hossam Ragheb
har1g15 at soton.ac.uk
Thu Dec 10 14:34:34 CET 2020
Hi,
I am new to gmsh, so apologies if the answer to my question is obvious.
I coded a .geo file (Attached) to create 3D RVE with fibers in a matrix
that includes voids.
The process simply is :
1- Create box of the matrix material.
2- Create voids using Sphere command and BooleanDifference to
remove these from the matrix material.
3- Create fibers as Cylinders and and utilise BooleanFragments to
include the cylinders in the matrix.
I have one persistent problem, once the mesh is created the fibers are
meshed as hollow cylinders, however i need them to be solid.
Its interesting behavior. Last thing to note that mesh size affects the
outcome, for example when the min/max mesh size is 2, the result is
solid cylinders, but with mesh size of 1, it becomes hollow.
It there a way to force the meshing algorithm to mesh the cylinder as
solid object?
I have attached the .geo file, please let me know if you can help.
Any suggestions?
Thanks,
Hossam Ragheb
-------------- next part --------------
//------------------------------------------------------------------------------
//
// Gmsh Stochastic Composite RVE
//
// Constructive Solid Geometry, OpenCASCADE geometry kernel
//
//------------------------------------------------------------------------------
SetFactory("OpenCASCADE");
Mesh.Tetrahedra = 1;
Mesh.Triangles = 1;
fac = 1;
Mesh.CharacteristicLengthMin = 2*fac;
Mesh.CharacteristicLengthMax = 2*fac;
voiden = 0.01;
Vf = 0.7;
// Coefficent of variation of the fibre diameter
cvf = 0.17;
Vlratio = 20;
Cube = 75*fac;
frmean = 5.0 * fac;
frmin = frmean - (frmean*cvf);
frmax = frmean + (frmean*cvf);
vrmin = 2.5*fac;
vrmax = 5.0*fac;
R = Cube;
nSvoid = Floor((voiden*2*R*2*R*2*R)/((4/3)*3.1415926*vrmax*vrmax*vrmax));
nFibre = Floor((Vf*2*R*2*R*2*R)/(3.1415926*frmax*frmax*2*R));
dims = Floor(Sqrt(nFibre));
Box(1) = {-R,-R,-R, 2*R,2*R,2*R};
For s In {2:nSvoid}
If (s < nSvoid)
r = vrmin +Rand(vrmax-vrmin);
x = -R + Rand(2*R);
y = -R + Rand(2*R);
z = -R + Rand(2*R);
Sphere(s) = {x, y, z, r};
EndIf
If (s == nSvoid)
r = vrmin +Rand(vrmax-vrmin);
x = -R + Rand(2*R);
y = -R + Rand(2*R);
z = -R + Rand(2*R);
Sphere(s) = {x, y, z, r};
Dilate {{x, y, z}, {Vlratio, 1, 0.5}} { Volume{s}; }
EndIf
Physical Volume(s) = {s};
EndFor
BooleanDifference(nSvoid+1) = { Volume{1}; Delete; }{ Volume{2:nSvoid}; Delete; };
dx = (2*R)/dims;
count = 0;
For i In {0:dims-1}
For j In {0:dims-1}
// Fibre diameter
Fr = frmin +Rand(frmax-frmin);
// Center of grid box in the RVE
cgx = (-R + 0.5*dx) + j * dx;
cgy = (-R + 0.5*dx) + i * dx;
// Center of cylinder base
xF = (cgx - 0.5*dx + Fr) + Rand(dx-2*Fr);
yF = (cgy - 0.5*dx + Fr) + Rand(dx-2*Fr);
zF = -R;
// Cylinder axis dx,dy,dz
dxF = 0;
dyF = 0;
dzF = 2*R;
Cylinder(nSvoid+2+count) = {xF,yF,zF,dxF,dyF,dzF,Fr};
Physical Volume(nSvoid+2+count) = {nSvoid+2+count};
count = count +1;
EndFor
EndFor
BooleanDifference(1000) = {Volume{nSvoid+1};Delete;}{Volume{nSvoid+2:nSvoid+1+count};};
Physical Volume("Matrix") = {1000};
Physical Volume("Fibres") = {nSvoid+2:nSvoid+1+count};
f() = BooleanFragments{Volume{1000};Delete;}{Volume{nSvoid+2:nSvoid+1+count};Delete;};
More information about the gmsh
mailing list