"# **2.1 Pull-out of elastic fiber from rigid matrix**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setting up a stage: What is a developing displacement discontinuity?\n",
"\n",
"To stimulate our thinking about the behavior of the brittle-matrix composites, we need to learn about evolution of displacement discontinuities in the material structure. Assuming that the material structure can be regarded as continuous in an initial state, we introduce the notion of displacement discontinuity as jumps in the displacement field that have developed during the loading process. In other words, we do not consider initial flaws and cracks. The material components are regarded as homogeneous and flawless. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The most obvious example of a displacement discontinuity is a crack evolving in a tensile zone of bended specimen. In this case, the displacement discontinuity is represented by a crack opening \n",
"that is obtained as the difference between the displacement of the crack faces. This displacement can be expressed as a vector that can be expressed ans a normal and tangential displacement jump in each point of the crack path. In fracture mechanics, cracks with dominant normal or tangential displacement jump are distinguished as mode I or mode II cracks, respectively. In simple terms, mode I represents a tensile crack and mode II a shear crack."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Besides the displacement discontinuities developing in an original homogeneous material that we denoted as cracks, we can also recognize displacement jumps developing along interfaces between two material components. In brittle-matrix composites considered here, this is the case between the reinforcement and matrix. Also here, the displacement jump is a vector with normal and tangential components. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our primary focus in this explanation is on the **evolution and propagation** disconstinuities. To show this propagation in a most simple setting, we will consider the pull-out problem, in which only the tangential displacement appears and the normal displacement jump can be neglected. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Assumptions made to describe the pull-out behavior:** \n",
" - For the explanatory purpose, it is sufficient to consider only the tangential displacement jump along an interface, or simply speaking the *slip* between the matrix and reinforcement evolving.\n",
" - The stress distribution over the cross section of the reinforcement will be considered uniform. Therefore, a uni-axial idealization of the pulled-out bar is justified.\n",
" - For simplicity, we will also first consider the matrix as rigid, i.e. infinitely stiff first.\n",
" - The shear stress between the reinforcement and matrix will be considered constant"
]
},
{
"cell_type": "markdown",
"metadata": {},
...
...
@@ -34,27 +76,39 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# The simplest possible pull-out model"
"# The simplest possible frictional pull-out model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An analytical solution of the pull-out problem is obtained by \n",
"An analytical solution of the pull-out problem is obtained by combining the (1) equilibrium condition, (2) constitutive assumption and (3) kinematic relation. These conditions must be fullfilled **at any point** along the interface, or more generally, in the whole material domain under consideration. Besides these three **local** conditions, **global** conditions (4) must be introduced to reflect the supports and the loads of the so called **initial boundary value problem**. \n",
"\n",
"Let us consider a fiber with the cross-sectional area $A_\\mathrm{f}$ and perimeter $p_\\mathrm{f}$. The stress in the fiber at each point $x$ along the bond zone is denoted as $\\sigma_\\mathrm{f}(x)$ and the shear stress between the fiber as $\\tau(x)$. As specified in the assumption (4) above, for simplicity, we will first explicitly set $\\tau(x) = \\bar{\\tau}$ constant in the debonded zone $x \\in (0, a)$ with $a$ represents the debonded length. The parameter $\\bar{\\tau}$ represents the frictional (or yield) stress. Then, a mathematical model of a pullout can be exemplified using the four introduced model ingredients as follows:\n",
"\n",
"1. Integrate the differential equilibrium equation relating the shear flow with the change of the normal force \n",
"1. **Equilibrium condition:** Differential equilibrium equation relates the shear flow $p_\\mathrm{f} \\tau$ to the change of the normal force \n",
"$A_\\mathrm{f} \\mathrm{d}\\sigma_\\mathrm{f}$ in the fiber on an infinitesimal element $\\mathrm{d}x$\n",
"2. **Constitutive law:** Let the reinforcement fiber behave linear-elastically with the material stiffness (Young's modulus) $E_\\mathrm{f}$, i.e.\n",
"3. Substitute the result into the kinematic relation stating that the pull-out displacement is equal to the integral of fiber strain along the debonded length\n",
"4. Identify the integration constants by applying boundary conditions: equilibrium at loaded end and compatibility and smoothness at the end of the debonded zone $x = a$\n",
"3. **Kinematic relation:** Local strain in the fiber $\\varepsilon_\\mathrm{f}(x)$ is given as a derivative of the displacement field $u_\\mathrm{f}(x)$ of the pulled fiber, i.e. \n",
"4. **Boundary conditions:** At the loaded end $x = 0$, the equilibrium between the applied load and the force in the fiber must be satisfied, i.e. \n",
"$$\n",
" P = A_\\mathrm{f} \\sigma_\\mathrm{f}(0)\n",
"$$\n",
"Further, displacement compatibility and smoothness of strain represent the other two conditions needed to solve the boundary problem analytically\n",
"P = \\sqrt{2 p \\bar{\\tau} E_\\mathrm{f} A_\\mathrm{f} w}\n",
"\\end{align}"
]
},
...
...
@@ -230,7 +284,7 @@
"source": [
"# Further material showing the sympy derivation \n",
"(not necessary for the BMCS exam)\n",
"- 2.1.2 [EXTRA - Pull-out of elastic long fiber from rigid long matrix](2_1_2_PO_ELF_RLM.ipynb)</br>\n",
"- 2.1.2 [EXTRA - Pull-out of elastic long fiber from rigid long matrix](2_1_2_PO_ELF_RLM_CAS.ipynb)</br>\n",
" How to use the symbolic computer algebra system (CAS) to derive a symbolic model and make it executable. "
]
},
...
...
%% Cell type:markdown id: tags:
<aid="top"></a>
# **2.1 Pull-out of elastic fiber from rigid matrix**
%% Cell type:markdown id: tags:
## Setting up a stage: What is a developing displacement discontinuity?
To stimulate our thinking about the behavior of the brittle-matrix composites, we need to learn about evolution of displacement discontinuities in the material structure. Assuming that the material structure can be regarded as continuous in an initial state, we introduce the notion of displacement discontinuity as jumps in the displacement field that have developed during the loading process. In other words, we do not consider initial flaws and cracks. The material components are regarded as homogeneous and flawless.
%% Cell type:markdown id: tags:
The most obvious example of a displacement discontinuity is a crack evolving in a tensile zone of bended specimen. In this case, the displacement discontinuity is represented by a crack opening
that is obtained as the difference between the displacement of the crack faces. This displacement can be expressed as a vector that can be expressed ans a normal and tangential displacement jump in each point of the crack path. In fracture mechanics, cracks with dominant normal or tangential displacement jump are distinguished as mode I or mode II cracks, respectively. In simple terms, mode I represents a tensile crack and mode II a shear crack.
%% Cell type:markdown id: tags:
Besides the displacement discontinuities developing in an original homogeneous material that we denoted as cracks, we can also recognize displacement jumps developing along interfaces between two material components. In brittle-matrix composites considered here, this is the case between the reinforcement and matrix. Also here, the displacement jump is a vector with normal and tangential components.
%% Cell type:markdown id: tags:
Our primary focus in this explanation is on the **evolution and propagation** disconstinuities. To show this propagation in a most simple setting, we will consider the pull-out problem, in which only the tangential displacement appears and the normal displacement jump can be neglected.
%% Cell type:markdown id: tags:
**Assumptions made to describe the pull-out behavior:**
- For the explanatory purpose, it is sufficient to consider only the tangential displacement jump along an interface, or simply speaking the *slip* between the matrix and reinforcement evolving.
- The stress distribution over the cross section of the reinforcement will be considered uniform. Therefore, a uni-axial idealization of the pulled-out bar is justified.
- For simplicity, we will also first consider the matrix as rigid, i.e. infinitely stiff first.
- The shear stress between the reinforcement and matrix will be considered constant
An analytical solution of the pull-out problem is obtained by
An analytical solution of the pull-out problem is obtained by combining the (1) equilibrium condition, (2) constitutive assumption and (3) kinematic relation. These conditions must be fullfilled **at any point** along the interface, or more generally, in the whole material domain under consideration. Besides these three **local** conditions, **global** conditions (4) must be introduced to reflect the supports and the loads of the so called **initial boundary value problem**.
Let us consider a fiber with the cross-sectional area $A_\mathrm{f}$ and perimeter $p_\mathrm{f}$. The stress in the fiber at each point $x$ along the bond zone is denoted as $\sigma_\mathrm{f}(x)$ and the shear stress between the fiber as $\tau(x)$. As specified in the assumption (4) above, for simplicity, we will first explicitly set $\tau(x) = \bar{\tau}$ constant in the debonded zone $x \in (0, a)$ with $a$ represents the debonded length. The parameter $\bar{\tau}$ represents the frictional (or yield) stress. Then, a mathematical model of a pullout can be exemplified using the four introduced model ingredients as follows:
1.Integrate the differential equilibrium equation relating the shear flow with the change of the normal force
1.**Equilibrium condition:** Differential equilibrium equation relates the shear flow $p_\mathrm{f} \tau$ to the change of the normal force
$A_\mathrm{f} \mathrm{d}\sigma_\mathrm{f}$ in the fiber on an infinitesimal element $\mathrm{d}x$
3. Substitute the result into the kinematic relation stating that the pull-out displacement is equal to the integral of fiber strain along the debonded length
4. Identify the integration constants by applying boundary conditions: equilibrium at loaded end and compatibility and smoothness at the end of the debonded zone $x = a$
3.**Kinematic relation:** Local strain in the fiber $\varepsilon_\mathrm{f}(x)$ is given as a derivative of the displacement field $u_\mathrm{f}(x)$ of the pulled fiber, i.e.
Let us utilize the the derived model to simulate the test results of the RILEM pull-out test

%% Cell type:markdown id: tags:
| Symbol | Unit |Description |
|:- |:- |:- |
| $E_\mathrm{f}$ | MPa | Young's modulus of reinforcement |
| $\bar{\tau}$ | MPa | Bond stress |
| $A_\mathrm{f}$ | mm$^2$ | Cross-sectional area of reinforcement |
| $p$ | mm | Perimeter of contact between concrete and reinforcement |
%% Cell type:markdown id: tags:
### **Observation**
%% Cell type:markdown id: tags:
- The measured displament at the loaded and unloaded end are different
- Their difference increases with increasing bond length $L_\mathrm{b}$
- The shape of the pull-out curve has a shape of a square root function
%% Cell type:markdown id: tags:
### **Question**
%% Cell type:markdown id: tags:
- Can the above derived model describe the debonding process correctly?
%% Cell type:markdown id: tags:
# Look inside the specimen using the model
%% Cell type:markdown id: tags:
The parameters of the above experiment are specified as follows
%% Cell type:code id: tags:
``` python
ds=16
A_f=(ds/2)**2*3.14# mm^2 - reinforcement area
L_b=5*ds# mm - bond length
E_f=210000# MPa - reinforcement stiffness
p_b=3.14*ds# mm - bond perimeter
w_max=0.12# mm - maximum displacement
```
%% Cell type:markdown id: tags:
**Construct the model:** To study the model behavior import the class `PO_ELF_RLM`, construct it with the defined parameters and run the `interact` method
**Remark:** that the length $L_b$ is not the end of the bond zone. It only measures the slip at the position $x = L_\mathrm{b}$ from the loadedend. However, the debonding process can continue beyond this length.
%% Cell type:code id: tags:
``` python
po.interact()
```
%% Cell type:markdown id: tags:
## Let's learn from the model
Exercise the relation between $P$ and $\tau(x)$ and between $w$ and $\varepsilon(x)$.
1. What is the meaning of the green area?
2. What is the meaning of the red area?
3. What is the meaning of the slope of the green curve?
4. Is it possible to reproduce the shown RILEM test response using this "frictional" model?
4. What is the role of debonded length $a$ in view of general non-linear simulation?
5. When does the pull-out fail?
5. What happends with $a$ upon unloading?
%% Cell type:markdown id: tags:
# Further material showing the sympy derivation
(not necessary for the BMCS exam)
- 2.1.2 [EXTRA - Pull-out of elastic long fiber from rigid long matrix](2_1_2_PO_ELF_RLM.ipynb)</br>
- 2.1.2 [EXTRA - Pull-out of elastic long fiber from rigid long matrix](2_1_2_PO_ELF_RLM_CAS.ipynb)</br>
How to use the symbolic computer algebra system (CAS) to derive a symbolic model and make it executable.
"po = PullOutAModel(symb_class=PO_ELF_RLM_Symb)\n",
"po.interact()"
...
...
@@ -357,7 +358,7 @@
}
},
"source": [
"### Equilibrium \n",
"### 1 Equilibrium \n",
"In the halfspace $x \\in (-\\infty, 0)$ the governing equations take the folowing form:<br>\n",
"\n",
"The equilibrium equation along the free length of the bar introduces the equivalence between the normal force in the reinforcement $\\sigma_\\mathrm{f} A_\\mathrm{f}$ and and the bond intensity within an ifinitesimal element $\\mathrm{d}x$\n",
...
...
@@ -418,7 +419,7 @@
}
},
"source": [
"### Constitutive laws: \n",
"### 2 Constitutive laws: \n",
"Assuming linear elastic behavior with the Young's modulus $E_\\mathrm{f}$ we obtain the strain $\\varepsilon$ as\n",
"\\begin{align}\n",
"\\varepsilon_\\mathrm{f}(x) = \\frac{1}{E_\\mathrm{f}} \\sigma_{\\mathrm{f}} = \\frac{1}{E_\\mathrm{f}} \\left(\\frac{p \\tau}{A_\\mathrm{f}} x + C \\right).\n",
"## Boundary and Continuity conditions resolving integration constants \n",
"### Equilibrium at the loaded end\n",
"\n",
"\n",
...
...
@@ -1060,28 +1061,6 @@
"To make the code for plotting shorter let us define a general procedure plotting and filling the curves and attaching the labels to a specified subplot in one call "
"Now that we have finished the construction of the model we can track the process and explore the correspondence between the internal state and externally observed response"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import bmcs_pullout_ui as poui\n",
"po = poui.ModelInteract(\n",
" models=[PO_LF_LM_RG],\n",
" w_max = 1.0,\n",
" py_vars=list(py_vars),\n",
" map_py2sp=map_py2sp\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"po.interact_fields()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Let's learn from the model\n",
"\n",
"Exercise the relation between $P$ and $\\tau(x)$ and between $w$ and $\\varepsilon(x)$.\n",
"\n",
" 1. What is the meaning of the green area?\n",
" 2. What is the meaning of the red area?\n",
" 3. What is the meaning of the slope of the green curve?\n",
" 4. Is it possible to reproduce the shown RILEM test response using this \"frictional\" model?\n",
" 4. What is the role of debonded length $a$ in view of general non-linear simulation?\n",
Pull-out (PO) of a elastic long fiber (ELF) from rigid long matrix (RLG)
[Video - pullout with constant bond](https://moodle.rwth-aachen.de/mod/page/view.php?id=551807)
%% Cell type:markdown id: tags:
# Observation
Let us try to utilize the depicted idealization for the derivation of a model that can help us simulate the test results of the RILEM pull-out test

%% Cell type:markdown id: tags:
# A look inside the specimen using the model
%% Cell type:code id: tags:
``` python
%matplotlibwidget
frompull_outimportPullOutAModel,PO_ELF_RLM_Symb
po=PullOutAModel(symb_class=PO_ELF_RLM_Symb)
po.interact()
```
%% Cell type:markdown id: tags:
# Idealization of the pull-out problem
This notebook explains the derivation of the pullout model and provides also its executable form.
The one-dimensional idealization of the pull-out is introduced in the figure

**Remark**: The origin of the coordinate system is placed at the transition between the bond zone and free zone of the fiber. The domain in the bond zone is defined as $x \in (-L_\mathrm{b},0)$. As a result, in the bond domain $x < 0$.
%% Cell type:markdown id: tags:
The meaning of the variables defining the idealization is summarized in the table
%% Cell type:markdown id: tags:

%% Cell type:markdown id: tags:
The pull-out test is controlled by the displacement at the end of the fiber $w$.
The force $P$ is measured to obtain the pull-out curve $P(w)$
**Simple and trivial question:** What is the purpose of measuring the pull-out curve?
%% Cell type:markdown id: tags:
### Simplifications
Before referring to advanced possibilities how to solve this problem, let us show that we can derive a rather simple, yet useful model by putting together the conditions of
* local equilibrium, kinematics and the constitutive laws, and
* boundary and compatibility conditions
to analytically solve the pull-out problem.

%% Cell type:markdown id: tags:
**Simplification 1: Matrix ridigity**
The dimensions of the concrete block are 100 $\times$ 100 mm so that $A_\mathrm{m} = $10000 mm. Let us consider the diameter of the steel rebar 16 mm so that we get $A_\mathrm{f}$ = 201 mm. Considering Young's modulus of concrete $E_\mathrm{m}=$ 28 GPa and of steel $E_\mathrm{f} = $ 210 GPa we see that the effective tensile stiffness of these components in the test reads
The stiffness of concrete cross section is thus almost seven times larger than that of concrete. To simplify the construction of the model, let us assume that its stiffness infinite, i.e. $E_\mathrm{m} A_\mathrm{m} = \infty$. This means that the matrix displacement is zero everywhere, i.e. $u_\mathrm{m}(x) = 0, \forall x \in (-L_\mathrm{b}, 0)$.
%% Cell type:markdown id: tags:
**Simplification 2: Constant bond stress**
Further, we assume that the interface between steel and concrete transfers a constant shear stress independently on the amount of slip, i.e.
\begin{align}
\tau(s) = \bar{\tau}
\end{align}
were $\tau$ is a constant material parameter.
%% Cell type:markdown id: tags:
**Simplification 3: Infinite bond length**
We consider $L_\mathrm{b} = \infty$. Thus, the pull-out process can continue infinitely.
%% Cell type:markdown id: tags:

## Boundary value problem
This example shows the analytically solvable model - the simplest possible configuration of the pullout test.
By applying the simplifying assumptions, the model parameters specified in the table above reduce to the following symbols that we now define as variables within the `sympy` package. This will allow us to apply the `sympy` package to perform algebraic manipulation, to integrate and to differentiate automatically and concentrate on the model construction instead.
%% Cell type:markdown id: tags:
It is convenient to classify the parameters and variables involved in the model into the groups related to parameters describing the geometry, material behavior, measured response, internal state and subsidiary integration parameters that will be resolved during the model derivation. In this classification we also associate the mathematical symbols with the Python variable name introduced in the next cell.
%% Cell type:markdown id: tags:
**Geometrical variables:**
| Python | Parameter | Description |
| :- | :-: | :- |
| `A_f` | $A_\mathrm{f}$ | Cross section area modulus of the reinforcement |
| `p` | $p$ | Perimeter of the reinforcement |
| `L_b` | $L_\mathrm{b}$ | Length of the bond zone of the pulled-out bar |
| `x` | $x$ | Longitudinal coordinate |
**Material parameters:**
| Python | Parameter | Description |
| :- | :-: | :- |
| `E_f` | $E_\mathrm{f}$ | Young's modulus of the reinforcement |
| `tau_bar` | $\bar{\tau}$ | Frictional bond stress |
%% Cell type:markdown id: tags:
**Control parameter:**
| Python | Parameter | Description |
| :- | :-: | :- |
| `P` | $P$ | Pullout force |
| `w` | $w$ | pullout control displacement
**State parameter:**
| Python | Parameter | Description |
| :- | :-: | :- |
| `a` | $a$ | Length of the debonded zone |
**Integration constants:**
| Python | Parameter | Description |
| :- | :-: | :- |
| `C`, `D` | $C,D$ | Integration constants to be resolved through boundary and continuity conditions |
%% Cell type:markdown id: tags:
**Let's import the packages:**
%% Cell type:code id: tags:
``` python
%matplotlibwidget
importsympyassp# symbolic algebra package
importnumpyasnp# numerical package
importmatplotlib.pyplotasplt# plotting package
sp.init_printing()# enable nice formating of the derived expressions
```
%% Cell type:markdown id: tags:
Here we tell `sympy` to remember these variables for further use. The parameter of the `symbols( str )` is a string that contains comma-separated printable symbol definition. One can use latex commands in this string to introduce e.g. Greek symbols like `\gamma, \beta`, etc. The number of symbols in `str` must be equal to the number of variables assigned on the left hand side of the `=` sign
Let us now consider an infinitely small segment of the bond zone and employ the usual model ingredients, i.e. equilibrium, constitutive laws of the components and then the kinematics

\begin{align}
\mathrm{d} \sigma_\mathrm{f} A_\mathrm{f} = p \bar{\tau} \,\mathrm{d}x
\end{align}
%% Cell type:markdown id: tags:
### Equilibrium
### 1 Equilibrium
In the halfspace $x \in (-\infty, 0)$ the governing equations take the folowing form:<br>
The equilibrium equation along the free length of the bar introduces the equivalence between the normal force in the reinforcement $\sigma_\mathrm{f} A_\mathrm{f}$ and and the bond intensity within an ifinitesimal element $\mathrm{d}x$
we obtain the displacement of the bar as an integral
\begin{align}
u_\mathrm{f}(x) &=
\int
\frac{1}{E_\mathrm{f}} \left(\frac{p \tau}{A_\mathrm{f}} x + C \right) \;\mathrm{d}x =
\frac{p \tau x^{2}}{2 A_\mathrm{f} E_\mathrm{f}} + \frac{C x}{E_{\mathrm{f}}} + D
\end{align}
%% Cell type:code id: tags:
``` python
u_f=sp.integrate(eps_f,x)+D
u_f
```
%% Cell type:markdown id: tags:
**What's next?**
We obtained a function that describes the displacement along the bond zone $x < 0$. Moreover, it implicitly satisfies the local equilibrium conditions and constitutive laws in each material point.
However, there are still two unknown integration constants $C$ and $D$. Thus, our local solution can be fulfilled for various boundary conditions. In other words, the obtained solution is valid no matter if we load the pull-out specimen on right or on the left hand side. To resolve these constants we have to find further equilibrium or compatibility conditions.
%% Cell type:markdown id: tags:
## Resolving integration constants
## Boundary and Continuity conditions resolving integration constants
### Equilibrium at the loaded end

__Condition 1__: Stress in the free length must be equal to load over area: $\sigma_\mathrm{f}(0) = P/A_\mathrm{f} \;\implies \; P - \sigma_\mathrm{f}(0) A_\mathrm{f} = 0 \implies C = P / A_\mathrm{f}$
%% Cell type:code id: tags:
``` python
eq_C={P-sig_f.subs({x:0})*A_f}
C_subs=sp.solve(eq_C,C)
C_subs# display the result
```
%% Cell type:markdown id: tags:
**`sympy` explanation**: Let us explain the two lines
__Line 1__: Defines the equation to solve $P - \sigma_\mathrm{f}(x=0) A_\mathrm{f} = 0$ in curly braces `{}`. The resulting data type is a set. Set is an unordered container. The set was assigned to a variable `eq_C`.
__Line 2__: Then we used the `sp.solve` method available in `sympy` package with two parameters. The first parameter is the equation to solve `eq_C` and the second is the variable `C` that we want to resolve. The result is obtained in form of a dictionary defining a key-value pair of the variable and the resolved expression.
%% Cell type:markdown id: tags:
### Compatibility condition requiring the continuity of slip

The solution for the integration constant $D$ requires a second thought. Can we say something about how does the displacement approach zero within the embedded length? The figure shows the geometrical meaning of the applied conditions. With condition 1 we required that the slope of the curve $u_\mathrm{f}$, i.e the stress must be equal to the external load. Thus all the parabolic curves must have the same slope at the point $x = 0$. Now the parameter $D$ can stretch and scale the curve along the $x$ axis.
%% Cell type:markdown id: tags:
__Condition 2__: We can postulate, that at some unknown position $a < 0$, the slip between the reinforcement and the matrix will be zero, i.e. $u_\mathrm{f}(a) = 0$.
%% Cell type:code id: tags:
``` python
eqns_D={u_f.subs(C_subs).subs(x,a)}
D_subs=sp.solve(eqns_D,D)
D_subs
```
%% Cell type:markdown id: tags:
**`sympy` explanation:** The function `u_f` still contains the unknown parameter $C$. Therefore, we substitute the solution from step 1 using the method `.subs` that replaces `C` by the solution. Let us do this step separately
%% Cell type:code id: tags:
``` python
u_f.subs(C_subs).subs(D_subs)
```
%% Cell type:markdown id: tags:
Thus, only $D$ remained to be resolved. Then, we substituted $x = a$ using again the `.subs` method with the first argument specifying the variable to be substituted and the second argument the value to substitute. Finally, the `sp.solve` method is used to get the resolved integration constant $D$.
%% Cell type:markdown id: tags:
### Compatibility condition requiring the continuity of slip
Well, we could get rid of $D$ but a new unknown appeared in form of $a$. Thus, the continuity postulate did not solve the problem. Another condition must be found to get rid of parameter $a$. Still, there is a subtle difference. We can associate $a$ with clear meaning that represents the state of our pull-out problem. It is the **debonded length**. Knowing this, it is easier to find the last condition: can we say something about how does the displacement approach zero at the end of the debonded length?
__Condition 3__: We postulate, that also the strain $\varepsilon$ vanishes at the same distance $a$ as displacement reaches zero. i.e. $\varepsilon_\mathrm{f}(a) = 0$.
**sympy explanation:** The same methods of substitution and algebraic resolution were applied in the last step to resolve $a$
Now all the unknown parameters are resolved. Lets put them all into a single dictionary called var_subs for convenience to avoid long substitution expressions to derive $u_\mathrm{f}$, $\varepsilon_\mathrm{f}$ and $\sigma_\mathrm{f}$.
%% Cell type:code id: tags:
``` python
var_subs={**C_subs,**D_subs,**a_subs}
var_subs
```
%% Cell type:markdown id: tags:
With the known values of integration parameters we can resolve the sought displacement fields and plot it
%% Cell type:code id: tags:
``` python
u_f_x=u_f.subs(var_subs)
u_f_x
```
%% Cell type:markdown id: tags:
## Visualization of results
We have derived a symbolic expression. But how to efficiently quantify it?
### Substitute for material parameters
Substitute for all the material and geometry parameters and the load P the value 1 and plot the curve
%% Cell type:code id: tags:
``` python
data_f={L_b:1,p:1,E_f:1,A_f:1,tau:1}
u_f_x.subs(data_f)
```
%% Cell type:markdown id: tags:
Let us now prepare this function for interactive visualization
%% Cell type:code id: tags:
``` python
get_u_f_x=sp.lambdify((x,P),u_f_x.subs(data_f))
x_range=np.linspace(-1,0,11)
get_u_f_x(x_range,1)
```
%% Cell type:markdown id: tags:
**`sympy` explanation:** The obtained expression `u_f_x` contains symbols. To plot a function, the symbolic expression must be transformed to a quantifiable procedure. This is what `sp.lambdify` is doing. Its first argument specifies the input variables for the generated "lambdified" function. In our case, it is `x` and `P`. The second argument is the expression to be evaluated, i.e. our solution with substituted data parameters `u_f_x.subs(data_f)`.
%% Cell type:code id: tags:
``` python
x_range=np.linspace(-2,0,100)
u_f_x_range=get_u_f_x(x_range,1)
```
%% Cell type:markdown id: tags:
**`numpy` explanation:** To prepare an array of data we first generated an array `x_range` with 100 values in the range from (-2,0). Then the newly generated function `get_u_f_x` was called with these 100 values to get the corresponding value of displacement.
%% Cell type:markdown id: tags:
**`matplotlib` explanation:** Let us plot the result using the matplotlib package. It is possible to invoke simply the method
`plt.plot(x_range, u_f_range)`
with the first argument specifying the data points along the horizontal and second argument along the vertical axis, respectively.
But to prepare the later interaction with the model we directly use a more flexible plotting area with two subplots called `axes`. Such area is prepared using the function `plt.subplots(rows, cols)` which returns a figure and the `axes` for specified number of `rows` and `cols`. The returned `axes` objects can then be used to insert the data arrays as in the above `plt.plot` method. Below we construct a figure with two axes and plot into our displacement profile into the left diagram. We insert also a legend and fill the area between zero level and the data points with a value of opacity $0.2$. The second subplot axes is empty. It is prepared for the next diagram explained below.
The plot looks fine, but why do we get the displacement for $x < -1$? Let us recall that the debonded length was
%% Cell type:code id: tags:
``` python
a_subs
```
%% Cell type:markdown id: tags:
so that $a = -1$. The range $x < a$ is beyond our applied model assumptions. We explicitly treated only the range $x \in (a, 0)$. Thus for nicer postprocessing we have to set $u_f(x) = 0, \;\forall x < a$
%% Cell type:markdown id: tags:
This can be readily done using the piecewise covering the domain of $x$ piece by piece.
\begin{align}
u_\mathrm{fa} & = \left\{
\begin{array}{ll}
u_\mathrm{f}(x) & \iff x <0\landx> a, \;\mathrm{where} \; a = -\frac{P}{p\tau}, \\
0 & \mathrm{otherwise}
\end{array}
\right.
\end{align}
%% Cell type:code id: tags:
``` python
u_fa_x=sp.Piecewise((u_f_x,x>var_subs[a]),
(0,x<=var_subs[a]))
u_fa_x
```
%% Cell type:code id: tags:
``` python
get_u_fa_x=sp.lambdify((x,P),u_fa_x.subs(data_f))
```
%% Cell type:markdown id: tags:
Plot the result in the right subplot `ax_u2` in the figure above
To make the code for plotting shorter let us define a general procedure plotting and filling the curves and attaching the labels to a specified subplot in one call
%% Cell type:code id: tags:
``` python
importbmcs_pullout_uiaspoui
```
%% Cell type:code id: tags:
``` python
frompull_outimportPullOutAModel,CB_ELF_RLM_Symb
po=PullOutAModel(symb_class=CB_ELF_RLM_Symb)
po.interact()
```
%% Cell type:markdown id: tags:
## Pull-out curve
We have expressed the solution to find out what is the stress state within the bond zone $x \in L_\mathrm{b}$. However, to relate the test to the experimental observation we need to find the relation $P(w)$. Thus, we evaluate
\begin{align}
w = u(x=0)
= \displaystyle \frac{P^{2}}{2 A_\mathrm{f} E_\mathrm{f} p \tau}
\end{align}
Resolving this equation with respect to $P$ we obtain
\begin{align}
P_{\mathrm{push}, \mathrm{pull}} = \pm \sqrt{ 2 A_\mathrm{f} E_\mathrm{f} p \tau w }
\end{align}
%% Cell type:markdown id: tags:
**`sympy` explanation:** In parallel let us use again the `subs` and `solve` provided in `sympy` to define the `P_push` and `P_pull` variables in the running `jupyter` kernel. As `solve` searches for zero point of the supplied equation we must transform the above equation into
%% Cell type:code id: tags:
``` python
u_f_x.subs(x,0)-w
```
%% Cell type:markdown id: tags:
and then send it to `sp.solve`
%% Cell type:code id: tags:
``` python
Pw_pull=sp.solve(u_f_x.subs({x:0})-w,P)[0]
Pw_pull
```
%% Cell type:markdown id: tags:
Note that the obtained $P(w)$ covers both the pull-out and push-in case. If we supply the parameters defined above with unit stiffness, area and perimeter we obtain
%% Cell type:code id: tags:
``` python
data_f
```
%% Cell type:code id: tags:
``` python
Pw_pull.subs(data_f)
```
%% Cell type:markdown id: tags:
### Plot the pull-out curve
The symbolic expression must be transformed into a quantifiable form using `sp.lambdify`
To see the difference between the displacement measured at $x = 0$ and $x = -L_\mathrm{b}$ let us provide a callable function evaluating $u_\mathrm{f}(x = -L_\mathrm{b})$
Now that we have finished the construction of the model we can track the process and explore the correspondence between the internal state and externally observed response
%% Cell type:code id: tags:
``` python
importbmcs_pullout_uiaspoui
po=poui.ModelInteract(
models=[PO_LF_LM_RG],
w_max=1.0,
py_vars=list(py_vars),
map_py2sp=map_py2sp
)
```
%% Cell type:code id: tags:
``` python
po.interact_fields()
```
%% Cell type:markdown id: tags:
## Let's learn from the model
Exercise the relation between $P$ and $\tau(x)$ and between $w$ and $\varepsilon(x)$.
1. What is the meaning of the green area?
2. What is the meaning of the red area?
3. What is the meaning of the slope of the green curve?
4. Is it possible to reproduce the shown RILEM test response using this "frictional" model?
4. What is the role of debonded length $a$ in view of general non-linear simulation?
5. When does the pull-out fail?
5. What happends with $a$ upon unloading?
%% Cell type:markdown id: tags:
## Let's make a prediction
What happens if we substitute the parameters from the RILEM pull-out test?