[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