Dear GMSH user and developer,

I have a small example where some weird things are going on. We have a quadric box with a circle inside and interphase around it. For the FE simulation, it's sufficient to have a coarser mesh at the centre point of the circle. We increase here the computed mesh size by a factor (centreMeshFactor in the .geo-file). For some reasons, the resulting mesh has for the factor = 10 and > 15 not a good shape anymore and the elements kind of stretch up. Could you please tell me why this happens and how the mesh sizes are interpolated between two specified points. Our goal is here to understand the issue or interpolation. I agree that for an increasing factor the mesh size gets unproportional in comparison to the other mesh sizes on the circle, but why does this occur, that at some point the mesh breaks. It seems that the mesh generator could not interpolate the mesh sizes in a correct way at some point anymore, or am I wrong?

Thank you very much in advance.

Best regards,
Maurice Rohracker
Master Student, FAU Erlange-Nürnberg
// Set global parameters

DOM_SIZE          = 1000. ;
TRANS_LAYER_THICK = 5. ;
TRANS_LAYER_DIVS = 8 ;

// ------------------ // 
------------------------------------------------------------------------------- 
//
centreMeshFactor = 10; // default = 1, increase the factor to get a rougher 
mesh around the circle centre //
// ------------------ // 
------------------------------------------------------------------------------- 
//

// the mesh sizes are computed to satisfy two constraints (number of elements 
across interphase thickness (8) and
// number of elements on the circle arc (480))
centreMeshSize = 5.36688745;
outerMeshSize = 5.36688745;
innerMeshSize = 5.23598776;

// Lists of bubble center coordinates (x,y) and bubble radii

bubble_xs[] = { 0. } ;
bubble_ys[] = { 0. } ;
bubble_rs[] = { 200. } ;

// Definition of a macro generating a bubble and its interphase layer

Macro GenerateBubble
        
        pp = newp ;
        Point( pp   ) = { xc     , yc     , 0. , lc_centre} ;
        Point( pp+1 ) = { xc + rp, yc     , 0. , lc_inner} ;
        Point( pp+2 ) = { xc     , yc + rp, 0. , lc_inner} ;
        Point( pp+3 ) = { xc - rp, yc     , 0. , lc_inner} ;
        Point( pp+4 ) = { xc     , yc - rp, 0. , lc_inner} ;
        Point( pp+5 ) = { xc + rp + wt, yc          , 0. , lc_outer} ;
        Point( pp+6 ) = { xc          , yc + rp + wt, 0. , lc_outer} ;
        Point( pp+7 ) = { xc - rp - wt, yc          , 0. , lc_outer} ;
        Point( pp+8 ) = { xc          , yc - rp - wt, 0. , lc_outer} ;
        lp = newl ;
        Circle( lp   ) = { pp+1 , pp , pp+2 } ;
        Circle( lp+1 ) = { pp+2 , pp , pp+3 } ;
        Circle( lp+2 ) = { pp+3 , pp , pp+4 } ;
        Circle( lp+3 ) = { pp+4 , pp , pp+1 } ;
        lt = newl ;
        Circle( lt   ) = { pp+5 , pp , pp+6 } ;
        Circle( lt+1 ) = { pp+6 , pp , pp+7 } ;
        Circle( lt+2 ) = { pp+7 , pp , pp+8 } ;
        Circle( lt+3 ) = { pp+8 , pp , pp+5 } ;
        Line( lt+4 ) = { pp+1 , pp+5 } ;
        Line( lt+5 ) = { pp+2 , pp+6 } ;
        Line( lt+6 ) = { pp+3 , pp+7 } ;
        Line( lt+7 ) = { pp+4 , pp+8 } ;
        llp = newll ;
        Line Loop( llp ) = { lp:(lp+3) } ;
        llt = newll ;
        Line Loop( llt   ) = { lt:(lt+3) } ;
        Line Loop( llt+1 ) = { lt  , -(lt+5), -lp    , lt+4 } ;
        Line Loop( llt+2 ) = { lt+1, -(lt+6), -(lp+1), lt+5 } ;
        Line Loop( llt+3 ) = { lt+2, -(lt+7), -(lp+2), lt+6 } ;
        Line Loop( llt+4 ) = { lt+3, -(lt+4), -(lp+3), lt+7 } ;
        sp = news ;
        Plane Surface( sp ) = { llp } ;
        st = news ;
        Plane Surface( st   ) = { llt+1 } ;
        Plane Surface( st+1 ) = { llt+2 } ;
        Plane Surface( st+2 ) = { llt+3 } ;
        Plane Surface( st+3 ) = { llt+4 } ;

        Transfinite Line{ lp:(lp+3) } = 61; //Ceil[ ( ( nd + 1 ) * Pi  * rp ) / 
( 2. * wt ) ] ;
        Transfinite Line{ -lt:-(lt+3) } = 61; //Ceil[ ( ( nd + 1 ) * Pi  * rp ) 
/ ( 2. * wt ) ] ;
        Transfinite Line{ lt+4, -(lt+5), lt+6, -(lt+7) } = 5; //( nd + 1 ) ;
        Transfinite Surface{ st:(st+3) } ;
        Recombine Surface{ st:(st+3) } ;
        Hide { Line{ (lt+4):(lt+7) } ; }
        Recursive Hide { Line{ lt:(lt+3) } ; }

    // embed centre point into circle surface to get a rougher mesh size
        Point{ pp } In Surface{ sp };

        bubble_surfs[]     += { sp } ;
        interphase_surfs[] += { st:(st+3) } ;
        interphase_edges[] += { lt:(lt+3) } ;
        interphase_loops[] += { llt } ;

Return

// Domain construction

xd  = DOM_SIZE / 2.  ;
yd  = DOM_SIZE / 2.  ;
lcd = DOM_SIZE / 100. ;
pd = newp ;
Point( pd   ) = {  xd,  yd, 0., lcd } ;
Point( pd+1 ) = { -xd,  yd, 0., lcd } ;
Point( pd+2 ) = { -xd, -yd, 0., lcd } ;
Point( pd+3 ) = {  xd, -yd, 0., lcd } ;
ld = newl ;
Line( ld   ) = { pd   , pd+1 } ;
Line( ld+1 ) = { pd+1 , pd+2 } ;
Line( ld+2 ) = { pd+2 , pd+3 } ;
Line( ld+3 ) = { pd+3 , pd   } ;
lld = newll ;
Line Loop( lld ) = { ld:(ld+3) } ;

// Generate bubbles => ready storage lists

bubble_surfs[]     = {} ;
interphase_surfs[] = {} ;
interphase_edges[] = {} ;
interphase_loops[] = {} ;

// Generate bubbles => Loop on bubbles
For i_bubble In { 0:(#bubble_xs[] - 1) }

        // Generate bubbles => set bubble parameter
        xc = bubble_xs[ i_bubble ] ;
        yc = bubble_ys[ i_bubble ] ;
        rp = bubble_rs[ i_bubble ] ;
        wt = TRANS_LAYER_THICK ;
        nd = TRANS_LAYER_DIVS ;
        lc_centre = centreMeshFactor * centreMeshSize;
        lc_inner = innerMeshSize;
        lc_outer = outerMeshSize;

        // Generate bubbles => Call macro
        Call GenerateBubble ;

EndFor

// Finalize domain surface accounting for the holes created
// by the particles and their transition layers

sd = news ;
Plane Surface( sd ) = { lld, interphase_loops[] } ;

Recombine Surface{ bubble_surfs[], sd } ;

// Coloring

Recursive Color Gray { Surface{ bubble_surfs[] } ; }
Recursive Color SkyBlue { Surface{ interphase_surfs[] } ; }
Recursive Color DarkBlue { Surface{ sd } ; }

// Physical tags

Physical Surface( "bubbles", 1000 ) = { bubble_surfs[] } ;
Physical Surface( "interphase layers", 2000 ) = { interphase_surfs[] } ;
Physical Surface( "medium", 3000 ) = { sd } ;

Mesh.Algorithm = 8;
Mesh.SubdivisionAlgorithm = 1;
Mesh.RecombinationAlgorithm = 1;
Mesh.RecombineAll = 1;
Mesh.RecombineOptimizeTopology = 25;
_______________________________________________
gmsh mailing list
[email protected]
http://onelab.info/mailman/listinfo/gmsh

Reply via email to