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 - - - - - - - - - - - - - - - - - - - - - - -
- -
Tensile test quasi-static

-
-
- -
Tensile test dynamic

-
-
- -
Tension with predefined crack

-
-
- -
The old logo

-
-
- -
Kalthoff Winkler


-
-
- -
Fragmenting cylinder

-
- -
Wave propagation


-
-
- -
Wave propagation across interface

-
- ## 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. + + +
+
+ +## 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) ORCID logo 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 +
+ +
Brazilian test

+
+
+``` + ```@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