.geo File: Challenge Test#

“This example illustrates the process of generating a mesh for the Damage Mechanics Challenge. For more details, visit the Damage Mechanics Challenge Webpage

Note that Phasefieldx can import external meshes in the .msh format. This can be achieved by using Gmsh.

Files with the .geo format define both the geometry and the mesh parameters, such as element types and sizes. Gmsh can then generate the mesh based on the input from these .geo files.

Below is an example of the .geo file used for mesh generation.

.geo file#

// -----------------------------------------------------------------------------
//
//  Gmsh GEO
//
//  Mesh size fields
//
// -----------------------------------------------------------------------------

//                      <------------------------- 76.2--------------------------> 
//                                                                  <--- 24.96---> 
//                 /\   *---------------------||||-------------------------------*  /\
//                 /   /                 u    \/\/            _____            / |  |
//        12.7    /   /                     ||||             /<1> /|          /  |  | 
//               /   /                      \/\/            /    / |         /   |  | 25.4
//              \/  *-------------------------------------/-----/--|--------*    |  |
//                  |                                    /   /   /          |    |  \/ 
//                  |                                  /   /   /            |    *  
//                  |                                 /  /   /              |   /   
//                  |                                /__/  /                |  /   
//                  |                                | | /                  | /   
//           (0,0,0)*--------------------------------. .--------------------*  
//                         /_\/_\                    <1>            /_\/_\       
//                        ///////                                  oo  oo
//                  <--7.62-->                                    <--7.62-->
//                  <------------- 43.89 ----------> 
//    |Y            
//    ---X          
// Z /  

//Use the following line to generate the mesh
//gmsh file.geo  -3 -o mesh.msh

SetFactory("OpenCASCADE");

h      = 4.0;
hcrack = 0.6;


// ------------------------------------------------------
// ------------------------------------------------------
// A)Geometry Definition: 1)Points 
//                        2)Lines 
//                        3)Curve 
//                        4)Surface 

// ------------------------------------------------------
// A1)Points Definitions:                                  
//                                                     
//           4*-------------------------------*3
//            |                               | 
//            |                               |
//            |                               |
//            |                               |
//            |                               | 
//    (0,0,0) *-------------------------------*
//            1                               2                
//    |Y               
//    |                
//    ---X     
// Z /  

//           -----Coordinates--
//Points:    ----X,------Y,---Z,
Point(1)   ={  0.0,    0.0, 0.0,  h};
Point(2)   ={ 76.2,    0.0, 0.0,  h};
Point(3)   ={ 76.2,   25.4, 0.0,  h};
Point(4)   ={  0.0,   25.4, 0.0,  h};


//           
//                       * 7                         
//                   /   |                        
//                 /     |                          
//          8  * /       |                      
//             |         |      
//             |         |                     
//             *---------*
//            5          6                               
//    |Y               
//    |                
//    --- X   
// Z /  

//           -----Coordinates--
//Points:    ----X,------Y,-----Z,
Point(5)   ={50.24,    0.0,   0.0,  h};
Point(6)   ={43.89,    0.0,  12.7,  h};
Point(7)   ={43.89,   2.54,  12.7,  h};
Point(8)   ={50.24,   5.08,   0.0,  h};


// ------------------------------------------------------
// A2)Lines Definition
//
//                            <-L3
//            *-------------------------------* 
//            |                               | 
//            |                               | /\
//          L4|                               | L2
//          \/|                               |
//            |                               | 
//            *-------------------------------*
//                            L1->            
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};

//           
//                       *                          
//             L7\/  /   |                        
//                 /     |                          
//             * /       | /\                    
//           L8|         | L6       
//           \/|         |                     
//             *---------*
//                 L5->    
//
Line(5) = {5, 6};
Line(6) = {6, 7};
Line(7) = {7, 8};
Line(8) = {8, 5};


// ------------------------------------------------------
// A3)Curve Definition
//                            
//            *---------------<---------------* 
//            |                               | 
//            |                               | 
//           \/                               /\ 
//            |                               |
//            |                               | 
//            *---------------->--------------*
//                             C5 
Curve Loop(5) = {1,2,3,4}; //C5: through lines L1,L2,...,L4

//                       *                          
//                   /   |                        
//                 /     |                          
//             * /      /\                    
//             |         |       
//            \/         |  C6                   
//             *---->----*
//                   
Curve Loop(6) = {5,6,7,8}; //C6: through lines L5,L6,...,L8

// ------------------------------------------------------
// A4)Surface Definition
//                           
//            *-------------------------------* 
//            |                               | 
//            |                               | 
//            |      S6                       | 
//            |                               |
//            |                               | 
//            *-------------------------------*
//                  
Plane Surface(6) = {5};

//                       *                          
//                   /   |                        
//                 /     |                          
//             * /       |                    
//             |    S7   |       
//             |         |                    
//             *---------*
Plane Surface(7) = {6};

// Extrude the Surfaces to Create the Volumes
Extrude {0.0, 0.0, 12.7}{Surface{6};}
Extrude {1.0, 0.0, 0.00}{Surface{7};}

BooleanDifference{Volume{1}; Delete;}{ Volume{2}; Delete; }

Physical Volume("speciment", 25) = {1};

// ------------------------------------------------------
// ------------------------------------------------------
// B)Mesh Definition: 1)Mesh size Box1 
//                    2)Mesh size Box2
//                    3)Mesh size Box3
//                    4)Mesh size Box4
//                    5)Mesh min(Box1,Box2)
//                    6)Mesh Algorithm  


// ------------------------------------------------------
// B1) Mesh size Box1
//
//            *-------------------------------* 
//            |                 |     |       |  
//            |                 |     |       |
//            |                 |     |       | 
//            |                 |     |       |
//            |                 |     |       | 
//            *-------------------------------*
//

Field[6]      =    Box;
Field[6].VIn  = hcrack;
Field[6].VOut =      h;

Field[6].XMin =  40.0;
Field[6].XMax =  60.0;
Field[6].YMin =  0.00;
Field[6].YMax =  25.4;
Field[6].ZMin =  0.00;
Field[6].ZMax =  12.7;

// ------------------------------------------------------
// B2) Mesh size Box2
//
//            *-------------------------------* 
//            |            |      |           |  
//            |            --------           | 
//            |                               | 
//            |                               |
//            |                               | 
//            *-------------------------------*
//
Field[7]      =       Box;
Field[7].VIn  =    hcrack;
Field[7].VOut =         h;

Field[7].XMin =       34.1;
Field[7].XMax =       42.1;
Field[7].YMin =       21.4;
Field[7].YMax =       25.4;
Field[7].ZMin =       0.00;
Field[7].ZMax =       12.7;

// ------------------------------------------------------
// B3) Mesh size Box3
//
//            *-------------------------------* 
//            |                               |  
//            |                               |  
//            |                               | 
//            |   ___                         |
//            |  | C |                        | 
//            *-------------------------------*
//
Field[8]      =       Box;
Field[8].VIn  =    hcrack;
Field[8].VOut =         h;

Field[8].XMin =      3.62;
Field[8].XMax =     11.62;
Field[8].YMin =       0.0;
Field[8].YMax =       4.0;
Field[8].ZMin =       0.0;
Field[8].ZMax =      12.7;

// ------------------------------------------------------
// B4) Mesh size Box4
//
//            *-------------------------------* 
//            |                               |  
//            |                               | 
//            |                               | 
//            |                         ___   |
//            |                        | D |  |
//            *-------------------------------*
//
Field[9]      =       Box;
Field[9].VIn  =    hcrack;
Field[9].VOut =         h;

Field[9].XMin =     64.58;
Field[9].XMax =     72.58;
Field[9].YMin =       0.0;
Field[9].YMax =       4.0;
Field[9].ZMin =       0.0;
Field[9].ZMax =      12.7;

// ------------------------------------------------------
// B5) Mesh min(Box1,Box2,Box3,Box4)
//
Field[10] = Min;
Field[10].FieldsList = {6,7,8,9};
Background Field = 10;


// ------------------------------------------------------
// B4)Mesh Algorithm

Geometry.Tolerance = 1e-12;
Mesh.Algorithm3D   = 1;

Physical Volume("speciment", 25) += {1};

For more information about Gmsh and the .geo file format, please refer to the official Gmsh website.

To generate the mesh in the .msh format from the terminal, use the following Gmsh command:

Here, -3 specifies that the mesh is 3-dimensional, and -o mesh.msh tells Gmsh to save the mesh to a file named mesh.msh with the .msh extension.

Alternatively, you can generate the mesh using the Gmsh Python API, which allows for programmatic mesh generation within Python scripts.

Mesh Visualization#

The purpose of this code is to visualize the mesh. The mesh is generated from the .geo file and saved as output_mesh_for_view.vtu. It is then loaded and visualized using PyVista.

import os
import gmsh
import pyvista as pv

folder = "9107_ChallengeTest"

Initialize Gmsh

gmsh.initialize()

Open the .geo file

geo_file = os.path.join(folder, "file.geo")
gmsh.open(geo_file)

Generate the mesh (2D example, for 3D use generate(3))

gmsh.model.mesh.generate(3)

Write the mesh to a .vtk file for visualization Note that the input mesh file for the phasefieldx simulation should have the .msh extension. Use “output_mesh_for_view.msh” to generate the mesh for the simulation input. In this case, the mesh is saved in .vtk format to facilitate visualization with PyVista.

vtu_file = os.path.join(folder, "output_mesh_for_view.vtk")
gmsh.write(vtu_file)

Finalize Gmsh

gmsh.finalize()

print(f"Mesh successfully written to {vtu_file}")


file_vtu = pv.read(vtu_file)
file_vtu.plot(cpos='xy', color='white', show_edges=True)
plot 9107
Mesh successfully written to 9107_ChallengeTest/output_mesh_for_view.vtk

Total running time of the script: (0 minutes 4.118 seconds)

Gallery generated by Sphinx-Gallery