diff --git a/docs/src/continuumbased.md b/docs/src/continuumbased.md index f2986904..aed50e4c 100644 --- a/docs/src/continuumbased.md +++ b/docs/src/continuumbased.md @@ -10,7 +10,7 @@ The internal force density is calculated as the sum of three types of point inte ## One-neighbor interactions ```@raw html - + ``` One-neighbor interactions in CPD correspond to the bonds in [bond-based](@ref bondbased) peridynamics, but there is a slightly different way to calculate the internal forces. @@ -23,7 +23,7 @@ V_\mathcal{H}^i = \beta^i \cdot \frac {4} {3} \cdot\pi\cdot\delta^3 Here $\beta^i\in [0,1]$ is a factor for the completeness of the neighborhood that takes incomplete point families at the surface into account (see figure 1). ```@raw html - + ``` Now, the effective one-neighbor volume can be calculated @@ -52,7 +52,7 @@ with the parameters: ## Two-neighbor interactions ```@raw html - + ``` For two-neighbor interactions, the deformation of the area spanned by point $i$ and two of its neighbors $j$ and $k$ is analyzed to calculate the internal force density. For this, relative area measures are defined: @@ -86,7 +86,7 @@ The internal force density induced by two-neighbor interactions is ## Three-neighbor interactions ```@raw html - + ``` Three-neighbor interactions regard the volume defined by the bond vectors between point $i$ and its three neighbors $j$, $k$ and $l$: diff --git a/docs/src/general_pd.md b/docs/src/general_pd.md index 60d38e4e..0d2cb1d5 100644 --- a/docs/src/general_pd.md +++ b/docs/src/general_pd.md @@ -5,7 +5,7 @@ The basic idea is that each point interacts with any other point within the dist These interactions called *bonds* provoke forces between points which can be calculated and result in internal forces. ```@raw html - + ``` Each point $i$ of the body $\mathcal{B}_0$ in initial configuration is characterized by the vector $\boldsymbol{X}^{i}$. The neighborhood $\mathcal{H}^i$ of $i$ contains all points $j$ that are within the distance of horizon $\delta$ to $i$: diff --git a/docs/src/literate/tutorial_wave_in_bar.jl b/docs/src/literate/tutorial_wave_in_bar.jl index 5b71ff7d..34ea8d2a 100644 --- a/docs/src/literate/tutorial_wave_in_bar.jl +++ b/docs/src/literate/tutorial_wave_in_bar.jl @@ -1,73 +1,63 @@ -# # Pressure wave through bar +# # Pressure wave in bar -# First, import the Peridynamics.jl package: +# In this tutorial, a cuboid bar is created. +# A velocity pulse in the form of one period of a sine wave is applied to create +# a pressure wave that propagates through the bar. +# +# First import the Peridynamics.jl package: using Peridynamics -# To start off, we define the geometry of the simulated bar: -# - Length $l_x = 0.2\,\text{m}$ -# - Width $l_y = 0.05\,\text{m}$ -# - Height $l_z = 0.05\,\text{m}$ -# With the point spacing $Δx = \frac{l_x}{60}$, we can create a point cloud. -length_x = 0.2 # [m] -length_y = 0.05 # [m] -length_z = 0.05 # [m] -Δx = length_x / 60 # point spacing -pc = PointCloud(length_x, length_y, length_z, Δx) - -# Now we characterize the material model as bond-based with the -# - Horizon $ δ = 3.015 \cdot Δx$ -# and the material parameters -# - Density $ρ = 7850\,\mathrm{kg}\,\mathrm{m}^{-3}$ -# - Young's modulus $E = 2 10 \, \mathrm{GPa}$ -# - Griffith's parameter $G_c = 1000 \, \mathrm{N} \, \mathrm{m}^{-1}$ -mat = BondBasedMaterial(; - horizon=3.015Δx, # [m] - rho=7850.0, # [kg/m^3] - E=210e9, # [N/m^2] - Gc=1000.0, # [N/m] -) - -# Then we define the boundary conditions, which apply a velocity to the body. -# Since the velocity is supposed to be applied on the left end of the bar, we first -# define the set of points that represent the outermost layer in x-direction of the -# points contained in the point cloud $pc$. -point_set_bc = findall(pc.position[1,:] .< - length_x / 2 + 1.2 * Δx) -# The applied velocity is represented by one sine oscillation with the period -# $T = 0.00002\,\mathrm{s}$ and the amplitude -# $v_\mathrm{max} = 0.5\,\mathrm{m}\,\mathrm{s}^{-1}$. -# Afterwards, the velocity is $0$. (see Figure) +# To get started, some parameters used to for this simulation are defined. +# These are the length of the bar `lx`, the width and height `lyz` and the number of +# points in the width `npyz`. + +lx = 0.2 +lyz = 0.002 +npyz = 4 + +# With these parameters the point spacing can be calculated: +Δx = lyz / npyz +# A cuboid body according to the ordinary state-based model with the specified dimensions +# and point spacing is then created: +pos, vol = uniform_box(lx, lyz, lyz, Δx) +body = Body(OSBMaterial(), pos, vol) +# Failure is prohibited throughout the body: +failure_permit!(body, false) +# Following material parameters are specified: + +# | material parameter | value | +# |:--------|:-------------| +# | Horizon $ δ $ | $3.015 \cdot Δx$ | +# | Density $ρ$ | $ 7850\,\mathrm{kg}\,\mathrm{m}^{-3}$ | +# | Young's modulus $E$ | $ 210 \, \mathrm{GPa}$ | +# | Poisson's ratio $ν$ | $0.25$ | +# | critical strain $ε_c$ | $0.01$ | +material!(body, horizon=3.015Δx, rho=7850.0, E=210e9, nu=0.25, epsilon_c=0.01) +# Point set `:left` including the first row of points in x-direction is created: +point_set!(x -> x < -lx / 2 + 1.2Δx, body, :left) +# The velocity boundary condition of the form +# ```math +# {v}_x (t) = +# \begin{cases} +# v_\mathrm{max} \cdot \sin(2\pi \cdot \frac{t}{T}) \qquad +# & \forall \; 0 \leq t \leq T \\ +# 0 &\text{else} +# \end{cases} +# ``` +# is applied to point set `:left`. The parameters used for this excitation are period +# length `T` and amplitude `vmax`. +T, vmax = 1.0e-5, 2.0 +velocity_bc!(t -> t < T ? vmax * sin(2π / T * t) : 0.0, body, :left, :x) # ![](../assets/impact_velocity.png) -T = 0.00002 # [s] -vmax = 0.5 # [m/s] -vwave(t) = t < T ? vmax * sin(2π/T * t) : 0 -# Now we submit these conditions. The number indicates the dimension in which the velocity -# is applied, which in this case is the x-dimension signified by 1. -boundary_conditions = [VelocityBC(vwave, point_set_bc, 1)] - -# Then we define the time discretization. We calculate 2000 time steps with the -# Velocity Verlet algorithm: -td = VelocityVerlet(2000) - -# We assign a name and specify the export settings such as the folder that the data -# will be saved in. Here, 10 determines that every 10th time step -# will be exported. -simulation_name = "PressureWave" -resfolder = joinpath(@__DIR__, "results", simulation_name) -mkpath(resfolder) -es = ExportSettings(resfolder, 10) - -# We define a job and pass along the previously set attributes. -job = PDSingleBodyAnalysis(; - name=simulation_name, - pc=pc, - mat=mat, - bcs=boundary_conditions, - td=td, - es=es, -) +# The Velocity Verlet algorithm is used as time integration method and 2000 time steps +# are calculated: +vv = VelocityVerlet(steps=2000) +# Then the storage path is defined: +path = joinpath(@__DIR__, "results", "xwave", "xwave_osb") +# The job is now defined and returned with the specified settings and parameters. +job = Job(body, vv; path=path) # The last step is submitting the job to start the simulation. #md # ```julia -#md # results = submit(job); +#md # submit(job); #md # ``` -