> On 21 May 2019, at 20:19, Sergej Tarasov <[email protected]> wrote: > > Hello Christophe, > > Saturday, May 18, 2019, 2:43:04 PM, you wrote: > > > >>> On 17 May 2019, at 23:56, Sergej Tarasov <[email protected]> wrote: >>> >>> Hi, >>> I need to create cubic unit cell containing many particles crossing the >>> walls >>> with periodic mesh (the geometry itself is periodic). I do it like this: >>> >>> SetFactory("OpenCASCADE"); >>> Mesh.MinimumCurvePoints = 2; >>> Box(1) = { 0, 0, 0, 1, 1, 1 }; >>> Cylinder(2) = { 0.669103076524392, 0.926238630543764, 0.380445067549797, >>> -0.00436647701608499, -0.00549592479612254, 0.0071224075356137, 0.25, 2*Pi >>> }; >>> Cylinder(3) = { 0.669103076524392, -0.0737613694562362, 0.380445067549797, >>> -0.00436647701608499, -0.00549592479612254, 0.0071224075356137, 0.25, 2*Pi >>> }; >>> BooleanIntersection{ Volume{ 2:3 }; Delete; } { Volume{ 1 }; } >>> BooleanDifference{ Volume{ 1 }; Delete; } { Volume{ 2:3 }; } >>> >>> Periodic Surface{ 21 } = { 16 } Translate{ 1,0,0 }; >>> Periodic Surface{ 9, 19 } = { 14, 17 } Translate{ 0,1,0 }; >>> Periodic Surface{ 18 } = { 20 } Translate{ 0,0,1 }; >>> >>> >>> which works perfectly. But in case of many particles (50-100) I need >>> to know the ID of each opposite surface. What is the best way to do it in >>> Gmsh? >>> Or there is better way to achieve this? > > CG> In this case I would use > > CG> e = 1e-6; > CG> left_surface() = Surface In BoundingBox{-e,-e,-e, e,1+e,1+e}; > CG> right_surface() = Surface In BoundingBox{1-e,-e,-e, 1+e,1+e,1+e}; > CG> Periodic Surface{ right_surface() } = { left_surface() } Translate{ 1,0,0 > }; > > CG> etc. > > CG> If there are multiple sub-surfaces, you can compare their > CG> bounding boxes (b() = BoundingBox Surface{...};) to find the > CG> corresponding pairs. > > CG> Christophe > > > Thank you very much. The first method you suggested doesn't work with complex > shapes, > so I tried to compare bounding boxes, which works perfectly, but unfortunately > not always. It fails in one specific situation, which occurs quite often in > my case. > Below is sample code that fails to generate periodic mesh. > > ------------------------------------------------------------------- > SetFactory("OpenCASCADE"); > Box(1) = { 0, 0, 0, 1, 1, 1 }; > > Cylinder(2) = { 0.58, 0.917, 0.689, -0.004387, 0.006, 0.00668, 0.1, 2*Pi }; > Cylinder(3) = { 0.58, -0.083, 0.689, -0.004387, 0.006, 0.00668, 0.1, 2*Pi }; > BooleanIntersection{ Volume{ 2:3 }; Delete; } { Volume{ 1 }; } > BooleanDifference{ Volume{ 1 }; Delete; } { Volume{ 2:3 }; } > > Periodic Surface{ 17 } = { 15 } Translate{ 0,1,0 }; > Mesh 3; > ------------------------------------------------------------------- > > > Is there any way to avoid this? Thanks! >
Indeed, it's a known limitation of the current periodic implementation: matching curves are identified using their bounding points - and in this case the two periodic curves have the same bounding points. The routine to generalize is GFace::setMeshMaster(). Can you open an issue in the gitlab so we don't forget about it? Thanks, Christophe > > -- > Best regards, > Sergej Tarasov mailto:[email protected] — Prof. Christophe Geuzaine University of Liege, Electrical Engineering and Computer Science http://www.montefiore.ulg.ac.be/~geuzaine _______________________________________________ gmsh mailing list [email protected] http://onelab.info/mailman/listinfo/gmsh
