Cruciform specimen#

Note

Read first: Simple simulation.

The domain is a polycrystalline specimen of 88 grains for biaxial loading, generated and meshed by Neper: a square plate whose corners are cut out by circular arcs, which leaves four arms, with a central hole:

../../_images/mesh.png

Fig. 14 The mesh (12737 10-node tetrahedra), colored by grain.#

The specimen’s (maximal) dimensions are 1, 1 and 0.1 mm along \(x\), \(y\) and \(z\). The material is that of Simple simulation:

Table 11 Single-crystal elastic constants and plasticity parameters (saturation_isotropic hardening).#

\(c_{11}\) [MPa]

\(c_{12}\) [MPa]

\(c_{44}\) [MPa]

\(m\) [-]

\(\dot{\gamma}_0\) [1/s]

\(\tau_0\) [MPa]

\(h_0\) [MPa]

\(\tau_s\) [MPa]

\(n\) [-]

\(245.0 \times 10^3\)

\(155.0 \times 10^3\)

\(62.5 \times 10^3\)

0.05

1.0

210.0

200.0

330.0

1.0

The specimen is loaded biaxially by opposite velocities on its opposite arms: 0.01 mm/s along \(x\) on faces x0 and x1, and half of it, 0.005 mm/s, along \(y\) on faces y0 and y1 (a strain biaxiality ratio of 0.5); the motion along \(z\) of the nodes of the edge x0z0cut1 is blocked against rigid-body motion. The loading lasts 1 s, in increments of 0.01 s. The ratio is set by the velocities along \(y\) (lines 24 and 25): equal velocities give equal-biaxial loading, zero velocities uniaxial loading in \(x\) with the \(y\) arms held in place. To let the \(y\) arms move freely while their faces stay plane, replace the two \(y\) lines with multi-point constraints (Multi-point constraints):

set_mpc1 vel y0 y
set_mpc1 vel y1 y

This simulation takes about 1.5 h on 4 processes; it is not run by the test suite.

Input files#

## FEPX tutorial "Cruciform specimen": a 98-grain fcc cruciform specimen (1 x 1 x 0.1 mm)
## under biaxial loading, the velocities along y half those along x (biaxiality 0.5).

## Material
number_of_phases 1
phase 1
  crystal_type FCC
  model crystal_plasticity
  c11 245.0e3
  c12 155.0e3
  c44 62.5e3
  m 0.05
  gammadot_0 1.0
  tau_0 210.0
  hardening saturation_isotropic
  h_0 200.0
  tau_s 330.0
  n 1.0

## Loading
boundary_conditions general
set_bc vel x0 x -0.01
set_bc vel x1 x  0.01
set_bc vel y0 y -0.005
set_bc vel y1 y  0.005
set_bc vel x0z0cut1 z 0
number_of_steps 1
target_time 1.0
dtime       0.01

## Output
print coo
print ori
print stress
print strain
print forces

Execution#

$ mpirun -np 4 fepx
========================    F   E   P   X    ===========================
Info   : A finite element software package for polycrystal plasticity.
Info   : Version 3.0.0-dev (git 755da754, 11-06-2026)
Info   : Built with: GCC 15.2.0|Open MPI 5.0.10|HDF5 1.14.6
Info   : Running on 4 ranks.
Info   : <https://fepx.info>
Info   : Copyright (C) 1996-2026, and MIT licensed, by the FEPX authors.
Info   : ---------------------------------------------------------------
Info   : Loading simulation...
Info   :   [i] Parsing file `simulation.cfg'...
Info   :   [i] Parsed file `simulation.cfg'.
Info   :   [i] Parsing file `simulation.msh'...
Info   :   [i] Parsed file `simulation.msh'.
Info   :   - Material parameters:
Info   :     > Number of phases: 1
Info   :     > Phase 1: fcc, crystal_plasticity
Info   :       . c11:                       2.4500E+05 MPa
Info   :       . c12:                       1.5500E+05 MPa
Info   :       . c44:                       6.2500E+04 MPa
Info   :       . m:                         5.0000E-02
Info   :       . gammadot_0:                1.0000E+00 1/s
Info   :       . hardening:                 saturation_isotropic
Info   :       . tau_0:                     2.1000E+02 MPa
Info   :       . h_0:                       2.0000E+02 MPa
Info   :       . tau_s:                     3.3000E+02 MPa
Info   :       . n:                         1.0000E+00
Info   :       . saturation_evolution:      off (def.)
Info   :       . cyclic_hardening:          off (def.)
Info   :       . precipitate_strengthening: off (def.)
Info   :   - Loading: boundary_conditions general, 1 step
Info   :     > Step 1: t = 0.0000E+00 -> 1.0000E+00 s, 100 increments
Info   :   - Options other than the defaults: (none)
Info   :   - Output: coo ori stress strain forces (format ascii)
Info   :   - Mesh parameters:
Info   :     > Node number: 20315
Info   :     > Elt  number: 12737 (10-node tetrahedra)
Info   :     > Elsets: 88; partitions: 4
Info   :   - Partitioning: 4 ranks
Info   :     > Elements per rank: 3182 to 3186
Info   :     > Ghost nodes per rank: 40 to 339 (758 in total)
Info   :     > Neighbors per rank: 2 to 2
Info   :   [o] Writing results to `simulation.sim'...
Info   : Initializing simulation...
Info   :   - Elastic step of 1.1351E-04 s (step 1)
Info   :     > Iteration 1 (SA): R = 3.8091E+00 (2730 CG iterations)
Info   :     > Iteration 2 (SA): R = 4.6417E-05 (2692 CG iterations)
Info   :     > Converged in 2 iterations (17.540 s)
Info   : Running step 1...
Info   :   - Increment 1: t = 1.0000E-02 s, dt = 9.8865E-03 s
Info   :     > Iteration 1 (SA): R = 3.0105E-03 (2758 CG iterations)
Info   :     > Iteration 2 (NR): R = 6.0979E-05 (2750 CG iterations)
Info   :     > Converged in 2 iterations (16.788 s)
  [...]
Info   : Final step terminated. Simulation completed successfully.
Info   :   [o] Wrote results to `simulation.sim'.
Info   :   - Increments: 100
Info   :   - Global iterations: 440 (314 NR)
Info   :   - CG iterations: 1330601
Info   :   - Warnings issued: 0
Info   :   - Wall time per phase:
Info   :     > Input and setup:                      0.261 s
Info   :     > Initialization:                      17.565 s
Info   :     > Increments:                        3022.335 s
Info   :       . Element and material work:        421.621 s
Info   :       . CG:                              2597.110 s
Info   :       . Other:                              3.605 s
Info   :     > Output:                               0.593 s
Info   : Elapsed time:                            3040.754 s
========================================================================
simulation.sim
|-- inputs
|   |-- simulation.cfg
|   `-- simulation.msh
`-- results
    |-- elts
    |   |-- ori
    |   |   |-- ori.step0
    |   |   `-- ori.step1
    |   |-- strain
    |   |   |-- strain.step0
    |   |   `-- strain.step1
    |   `-- stress
    |       |-- stress.step0
    |       `-- stress.step1
    |-- forces
    |   |-- cut1
    |   |-- cut2
    |   |-- cut3
    |   |-- cut4
    |   |-- cut5
    |   |-- x0
    |   |-- x1
    |   |-- y0
    |   |-- y1
    |   |-- z0
    |   `-- z1
    |-- mesh
    |   |-- strain
    |   |   |-- strain.step0
    |   |   `-- strain.step1
    |   `-- stress
    |       |-- stress.step0
    |       `-- stress.step1
    `-- nodes
        `-- coo
            |-- coo.step0
            `-- coo.step1

Simulation results#

../../_images/curves.png

Fig. 15 (left) Volume-averaged stresses 11 and 22 against the strains 11 and 22 (initial and final states); (right) normal stresses of faces x1 and y1 (force over current area) at every increment.#

../../_images/stress11.png

Fig. 16 Stress field \(\sigma_{11}\) (displacements magnified 3 times).#

../../_images/stress22.png

Fig. 17 Stress field \(\sigma_{22}\) (displacements magnified 3 times).#

../../_images/stress12.png

Fig. 18 Stress field \(\sigma_{12}\) (displacements magnified 3 times).#

The commands:

$ neper -S simulation.sim -resmesh stress,strain
$ neper -V simulation.msh -showelt1d all -dataelt1drad 0.004 -dataelt3dedgerad 0.0015 \
    -dataelt3dedgecol 32:32:32 -cameraangle 13.5 -imagesize 800:800 -dataelsetcol id \
    -cameraprojection orthographic -cameralookat 0.6:0.6:0.05 -cameraangle 18 -print \
    img_mesh
$ convert img_mesh.png -trim -bordercolor white -border 20 -resize 600x600 -strip \
    PNG8:mesh.png
$ neper -V simulation.sim -step 1 -datanodecoo coo -datanodecoofact 3 -showelt1d all \
    -dataelt1drad 0.004 -dataelt3dedgerad 0.0015 -dataelt3dedgecol 32:32:32 -cameraangle \
    13.5 -imagesize 800:800 -dataeltcol stress11 -dataeltscale \
    -600:-400:-200:0:200:400:600 -cameraprojection orthographic -cameralookat \
    0.6:0.6:0.05 -cameraangle 18 -print img_stress11
$ convert "(" img_stress11.png -trim ")" "(" -size 40x1 xc:white ")" "(" -size 240x \
    -background white -font DejaVu-Serif -pointsize 30 "caption:Stress 11 [MPa]" \
    -bordercolor white -border 0x12 "(" img_stress11-scale3d.png -trim ")" -gravity west \
    -append ")" -background white -gravity center +append -bordercolor white -border 20 \
    -resize 600x600 -strip PNG8:stress11.png
$ neper -V simulation.sim -step 1 -datanodecoo coo -datanodecoofact 3 -showelt1d all \
    -dataelt1drad 0.004 -dataelt3dedgerad 0.0015 -dataelt3dedgecol 32:32:32 -cameraangle \
    13.5 -imagesize 800:800 -dataeltcol stress22 -dataeltscale \
    -600:-400:-200:0:200:400:600 -cameraprojection orthographic -cameralookat \
    0.6:0.6:0.05 -cameraangle 18 -print img_stress22
$ convert "(" img_stress22.png -trim ")" "(" -size 40x1 xc:white ")" "(" -size 240x \
    -background white -font DejaVu-Serif -pointsize 30 "caption:Stress 22 [MPa]" \
    -bordercolor white -border 0x12 "(" img_stress22-scale3d.png -trim ")" -gravity west \
    -append ")" -background white -gravity center +append -bordercolor white -border 20 \
    -resize 600x600 -strip PNG8:stress22.png
$ neper -V simulation.sim -step 1 -datanodecoo coo -datanodecoofact 3 -showelt1d all \
    -dataelt1drad 0.004 -dataelt3dedgerad 0.0015 -dataelt3dedgecol 32:32:32 -cameraangle \
    13.5 -imagesize 800:800 -dataeltcol stress12 -dataeltscale \
    -300:-200:-100:0:100:200:300 -cameraprojection orthographic -cameralookat \
    0.6:0.6:0.05 -cameraangle 18 -print img_stress12
$ convert "(" img_stress12.png -trim ")" "(" -size 40x1 xc:white ")" "(" -size 240x \
    -background white -font DejaVu-Serif -pointsize 30 "caption:Stress 12 [MPa]" \
    -bordercolor white -border 0x12 "(" img_stress12-scale3d.png -trim ")" -gravity west \
    -append ")" -background white -gravity center +append -bordercolor white -border 20 \
    -resize 600x600 -strip PNG8:stress12.png
$ python3 tutorial_pages.py plot cruciform . simulation.sim