diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 9a2a852c..4ed0716f 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -37,7 +37,7 @@ jobs:
- uses: julia-actions/julia-buildpkg@v1
- uses: julia-actions/julia-runtest@v1
- uses: julia-actions/julia-processcoverage@v1
- - uses: codecov/codecov-action@v4
+ - uses: codecov/codecov-action@v5
with:
files: lcov.info
env:
diff --git a/CITATION.cff b/CITATION.cff
index b6caf96b..3f04e13b 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -13,4 +13,23 @@ authors:
title: "Peridynamics.jl"
doi: 10.5281/zenodo.8187477
date-released: 2023-07-26
-url: "https://github.com/kaipartmann/Peridynamics.jl"
\ No newline at end of file
+url: "https://github.com/kaipartmann/Peridynamics.jl"
+preferred-citation:
+ title: "Simulation of fracture and damage with Peridynamics.jl"
+ type: article
+ authors:
+ - family-names: "Partmann"
+ given-names: "Kai"
+ - family-names: "Dienst"
+ given-names: "Manuel"
+ - family-names: "Weinberg"
+ given-names: "Kerstin"
+ doi: "10.21105/jcon.00165"
+ journal: "Proceedings of the JuliaCon Conferences"
+ start: 165 # First page number
+ end: 165 # Last page number
+ volume: 6
+ number: 64
+ publisher: "The Open Journal"
+ url: "https://doi.org/10.21105/jcon.00165"
+ year: 2024
\ No newline at end of file
diff --git a/README.md b/README.md
index 58f016c4..53389b41 100644
--- a/README.md
+++ b/README.md
@@ -41,63 +41,8 @@ add Peridynamics
```
in the julia package manager. Please take a look at the [documentation](https://kaipartmann.github.io/Peridynamics.jl/stable/index#Installation) for more details on the installation.
-## Tutorials
-
-
-
## Usage
-To run the dynamic tensile test simulation shown above, just 7 lines of code are needed:
+To run the [dynamic tensile test simulation](https://kaipartmann.github.io/Peridynamics.jl/stable/generated/tutorial_tension_dynfrac), just 7 lines of code are needed:
```julia
body = Body(BBMaterial(), "TensileTestMesh.inp")
material!(body; horizon=0.01, rho=2700, E=70e9, Gc=100)
@@ -116,6 +61,31 @@ mpiexec -n 6 julia --project path/to/script.jl
```
Please take a look at the [how-to guide on MPI](https://kaipartmann.github.io/Peridynamics.jl/dev/howto_mpi/) for more details.
+## Tutorials
+
+Please click the image below to see the [Tutorial overview](https://github.com/user-attachments/assets/f69ec7f5-2deb-4328-bfab-05cc15508af2) in the documentation.
+
+
+ ![](https://github.com/user-attachments/assets/f69ec7f5-2deb-4328-bfab-05cc15508af2)
+
+
+## Cite Us
+
+If you use Peridynamics.jl in your own research or write a paper using results obtained
+with the help of Peridynamics.jl, please cite it as
+```bibtex
+@article{Partmann2024JuliaCon,
+ author = {Partmann, Kai and Dienst, Manuel and Weinberg, Kerstin},
+ doi = {10.21105/jcon.00165},
+ journal = {Proceedings of the JuliaCon Conferences},
+ pages = {165},
+ title = {{Simulation of fracture and damage with Peridynamics.jl}},
+ url = {https://doi.org/10.21105/jcon.00165},
+ volume = {6},
+ year = {2024}
+}
+```
+
## Authors
- Kai Partmann (University of Siegen)
diff --git a/benchmark/benchmarks.jl b/benchmark/benchmarks.jl
index f25dfb87..37bf6e22 100644
--- a/benchmark/benchmarks.jl
+++ b/benchmark/benchmarks.jl
@@ -8,6 +8,7 @@ const SUITE = BenchmarkGroup()
include(joinpath(@__DIR__, "mode_i.jl"))
SUITE["mode_i"] = BenchmarkGroup()
+
SUITE["mode_i"]["BBMaterial, 40"] = @benchmarkable submit(mode_i(BBMaterial(), 40))
SUITE["mode_i"]["OSBMaterial, 40"] = @benchmarkable submit(mode_i(OSBMaterial(), 40))
SUITE["mode_i"]["CMaterial, 40"] = @benchmarkable submit(mode_i(CMaterial(), 40))
diff --git a/docs/make.jl b/docs/make.jl
index 35bfa7e9..2f41889e 100644
--- a/docs/make.jl
+++ b/docs/make.jl
@@ -35,7 +35,8 @@ LIT_TUTORIALS_IN = [
"tutorial_kalthoff-winkler_dynfrac.jl",
"tutorial_logo.jl",
"tutorial_cylinder.jl",
- "tutorial_wave_interface.jl"
+ "tutorial_wave_interface.jl",
+ "tutorial_brazilian_test.jl",
]
LIT_TUTORIALS_IN .= joinpath.(@__DIR__, "src", "literate", LIT_TUTORIALS_IN)
Literate.markdown.(LIT_TUTORIALS_IN, LIT_MD_OUT; credit=false)
@@ -81,6 +82,7 @@ makedocs(;
joinpath("generated", "tutorial_kalthoff-winkler_dynfrac.md"),
joinpath("generated", "tutorial_logo.md"),
joinpath("generated", "tutorial_cylinder.md"),
+ joinpath("generated", "tutorial_brazilian_test.md"),
],
"API Reference" => "api_reference.md",
],
diff --git a/docs/src/index.md b/docs/src/index.md
index 68041552..0f2a3c45 100644
--- a/docs/src/index.md
+++ b/docs/src/index.md
@@ -104,6 +104,14 @@ To install `Peridynamics.jl`, follow these steps:
```
+```@raw html
+
+```
+
```@raw html
```
diff --git a/docs/src/literate/tutorial_brazilian_test.jl b/docs/src/literate/tutorial_brazilian_test.jl
new file mode 100644
index 00000000..2025a889
--- /dev/null
+++ b/docs/src/literate/tutorial_brazilian_test.jl
@@ -0,0 +1,57 @@
+# # [Brazilian Test](@id tutorial_brazilian_test)
+
+# This tutorial sets up the Brazilian Test experiment, commonly used to investigate fracture
+# of brittle materials like ultra-high performance concrete.
+# Therefore a cylindrical specimen is
+# loaded by two opposing forces applying pressure on the cross section of the specimen.
+
+# To start, we import the package.
+using Peridynamics
+
+# Then we define the geometrical parameters of the specimen which are the diameter `Ø` and
+# the length `l` as well as the point spacing `Δx` of the model.
+# The parameter `b` is used later defining point sets for the boundary conditions.
+Ø = 0.05 # [m]
+l = 0.015 # [m]
+Δx = Ø/61 # [m]
+b = 0.017 # [m]
+
+# With the diameter, length and point spacing, we create the cylindrical body.
+pos, vol = uniform_cylinder(Ø, l, Δx)
+cyl = Body(BBMaterial(), pos, vol)
+
+# The horizon is specified in relation to the point spacing.
+δ = 3.015Δx
+# Then the material parameters are set.
+material!(cyl; horizon=δ, E=50e9, rho=2400, Gc=140)
+
+# To apply the opposing forces, two point sets are generated.
+point_set!(p -> p[1] ≥ Ø/2-3Δx && abs(p[2]) ≤ 1.1*b/2, cyl, :set_1)
+point_set!(p -> p[1] ≤ -Ø/2+3Δx && abs(p[2]) ≤ 1.1*b/2, cyl, :set_2)
+
+# The functions for the velocity boundary conditions, that have the same value but act in
+# different directions, are defined next.
+v_set1(p, t) = - 2 * exp(-t/0.00002) * (-1/0.02^2 * p[2]^2 + 1)
+v_set2(p, t) = 2 * exp(-t/0.00002) * (-1/0.02^2 * p[2]^2 + 1)
+
+# Then these functions are set as the boundary conditions in x-direction, while the
+# velocites of the points in y- and z-direction are 0.
+velocity_bc!(v_set1, cyl, :set_1, :x)
+velocity_bc!(t -> 0, cyl, :set_1, :y)
+velocity_bc!(t -> 0, cyl, :set_1, :z)
+velocity_bc!(v_set2, cyl, :set_2, :x)
+velocity_bc!(t -> 0, cyl, :set_2, :y)
+velocity_bc!(t -> 0, cyl, :set_2, :z)
+
+# The Velocity Verlet algotihm is employed as time integration method where 6000 time steps
+# are calculated.
+vv = VelocityVerlet(steps=6000)
+
+# Finally the job is defined and submitted.
+
+#md # ```julia
+#md # job = Job(cyl, vv; path="results/brazilian_bb_uniform")
+#md # submit(job)
+#md # ```
+
+# ![](https://github.com/user-attachments/assets/2f78a983-98d5-42eb-bc32-4fb270238ceb)
diff --git a/src/discretization/point_generators.jl b/src/discretization/point_generators.jl
index a1f0353b..221e3ed9 100644
--- a/src/discretization/point_generators.jl
+++ b/src/discretization/point_generators.jl
@@ -261,7 +261,7 @@ of the cylinder.
# Examples
```julia-repl
-julia> position, volume = uniform_cylinder(5, 10, 2);
+julia> position, volume = round_cylinder(5, 10, 2);
julia> position
3×30 Matrix{Float64}:
@@ -281,6 +281,7 @@ julia> volume
13.089969389957473
13.089969389957473
13.089969389957473
+```
"""
function round_cylinder(diameter::Real, height::Real, ΔX0::Real; center=(0, 0, 0))
radius = diameter / 2