Skip to content

Commit 69d0f8d

Browse files
committed
Modify tests and add documentation #99
1 parent 3ae0ed8 commit 69d0f8d

File tree

10 files changed

+141
-925
lines changed

10 files changed

+141
-925
lines changed

doc/content/bib/blackbear.bib

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,21 @@ @Article{wald_2017
7575
Title = {Development and multiaxial distribution of expansions in reinforced concrete elements affected by alkali--silica reaction},
7676
Volume = {18},
7777
Year = {2017}}
78+
79+
@article{bondlsip_adina_1985,
80+
Author = {Mehlhorn, G. and Kollegger, J. and Keuser, M. and Kolmar, W.},
81+
Journal = {Computers and Structures},
82+
Number = {},
83+
Pages = {69--80},
84+
Title = {Nonlinear Contact Problems - A Finite Element Approach Implemented in ADINA},
85+
Volume = {21},
86+
Year = {1985}}
87+
88+
@article{hameed_2013,
89+
Author = {Hameed, R. and Turatsinze, A. and Duprat, F. and Sellier A. },
90+
Journal = {KSCE:Journal of Civil Engineering},
91+
Month = jan,
92+
Pages = {1700--1701},
93+
Title = {Bond stress-slip Behavior of Reinforcing Bars Embedded in Hybrid Fiber-reinforced Concrete},
94+
Volume = {17},
95+
Year = {2013}}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# RebarBondSlipConstraint
2+
3+
!syntax description /Constraints/RebarBondSlipConstraint
4+
5+
`RebarBondSlipConstraint` implements a node-to-element constraint designed to apply the bond-slip relations between concrete and reinforcement bars. It uses a simplistic bond-slip model that assigns bond stress based on the slip values calculated as the relative displacement between concrete and rebar:
6+
\begin{equation}
7+
\begin{aligned}
8+
\sigma_s = & \sigma_{max} \left[ 0.5 \left(\frac{\Delta}{\Delta_1}\right) \, - \, 4.5 \, \left(\frac{\Delta}{\Delta_1}\right)^2 \, + \, 1.4 \, \left(\frac{\Delta}{\Delta_1}\right)^3 \right] \; \mathrm{for} \, \Delta < \Delta_1 \, \, \\
9+
= & 1.9 \, \sigma_{max} \; \mathrm{for} \, \Delta >= \Delta_1
10+
\end{aligned}
11+
\end{equation}
12+
Here, $\sigma_s$ is the bondstress, $\sigma_{max}$ is the maximum bondstress related to the compressive strength of the concrete, $\Delta$ is the slip calculated as the relative displacement between the concrete and rebar in the axial direction of the rebar, and $\Delta_1$ is the slip magnitude at which the maximum bondstress is reached. This model is similar to what was implemented in [!cite](bondlsip_adina_1985).
13+
14+
## Example Input File Syntax
15+
16+
!listing rebar_bondslip/RCBeam_constraint.i block=Constraints
17+
18+
!syntax parameters /Constraints/RebarBondSlipConstraint
19+
20+
!syntax inputs /Constraints/RebarBondSlipConstraint
21+
22+
!syntax children /Constraints/RebarBondSlipConstraint
23+
24+
!bibtex bibliography

include/constraints/RebarBondSlipConstraint.h

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ class RebarBondSlipConstraint;
1717

1818
template <>
1919
InputParameters validParams<RebarBondSlipConstraint>();
20-
21-
/// A RebarBondSlipConstraint enforces concrete-rebar constraint
20+
/**
21+
* A RebarBondSlipConstraint enforces the constraint between concrete and
22+
* reinforcing bars establishing a slip vs. bondstress relationship
23+
*/
2224
class RebarBondSlipConstraint : public EqualValueEmbeddedConstraint
2325
{
2426
public:
@@ -40,14 +42,24 @@ class RebarBondSlipConstraint : public EqualValueEmbeddedConstraint
4042
bool getCoupledVarComponent(unsigned int var_num, unsigned int & component);
4143

4244
protected:
45+
/// method to calculate the tangential and the normal direction for the rebars
4346
virtual void computeTangent();
47+
4448
virtual Real computeQpResidual(Moose::ConstraintType type) override;
4549
virtual Real computeQpJacobian(Moose::ConstraintJacobianType type) override;
4650
virtual Real computeQpOffDiagJacobian(Moose::ConstraintJacobianType type,
4751
unsigned int jvar) override;
4852

4953
/**
50-
* Struct designed to hold info about the bonds slip history
54+
* Struct designed to hold info about the bond-slip history
55+
* slip_min miminum slip value at the current step
56+
* slip_max maximum slip value at the current step
57+
* slip_min_old minimum slip value from the history
58+
* slip_max_old maximum slip value from the history
59+
* bondstress_min miminum bondstress value at the current step
60+
* bondstress_max maximum bondstress value at the current step
61+
* bondstress_min_old minimum bondstress value from the history
62+
* bondstress_max_old maximum bondstress value from the history
5163
*/
5264
struct bondSlipData
5365
{
@@ -60,6 +72,7 @@ class RebarBondSlipConstraint : public EqualValueEmbeddedConstraint
6072
Real bondstress_min_old;
6173
Real bondstress_max_old;
6274

75+
/// initializing the bond-slip data
6376
bondSlipData()
6477
: slip_min(0.0),
6578
slip_max(0.0),
@@ -73,29 +86,55 @@ class RebarBondSlipConstraint : public EqualValueEmbeddedConstraint
7386
}
7487
};
7588

76-
// Bond-slip data
89+
/// storing the bond-slip history values for each of the nodes
7790
std::map<dof_id_type, bondSlipData> _bondslip;
7891

92+
/// the direction in which the constraint works
7993
const unsigned _component;
94+
95+
/// problem dimesion
8096
const unsigned int _mesh_dimension;
97+
98+
/// displacement variables
8199
std::vector<unsigned int> _var_nums;
82100
std::vector<MooseVariable *> _vars;
83101

102+
/// flag to turn on printing values for debugging
84103
const bool _debug;
85104

105+
/// maximum bond stress
86106
const Real _max_bondstress;
107+
108+
/// residual bond stress due to friction after joint failure
87109
const Real _frictional_bondstress;
110+
111+
/// ultimate slip value attainable before failure
88112
const Real _ultimate_slip;
113+
114+
/// radius of the reinforcing bars
89115
const Real _bar_radius;
116+
117+
/// slip values at the transition points of the bond-slip curve
90118
std::vector<Real> _transitional_slip;
119+
91120
/// constraint force needed to enforce the constraint
92121
RealVectorValue _constraint_residual;
122+
123+
/// constraint force needed to enforce the constraint
93124
RealVectorValue _constraint_jacobian_axial;
125+
94126
/// penalty force for the current constraint
95127
RealVectorValue _pen_force;
128+
129+
/// tangent direction for the rebars
96130
RealVectorValue _secondary_tangent;
131+
132+
/// current element volume/length for the rabar
97133
Real _current_elem_volume;
98-
bool _bond;
134+
135+
/// bond stress value
99136
Real _bond_stress;
137+
138+
/// redivative of the bond stress function w.r.t slip
100139
Real _bond_stress_deriv;
101140
};

src/constraints/RebarBondSlipConstraint.C

Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ RebarBondSlipConstraint::validParams()
2525
{
2626
InputParameters params = EqualValueEmbeddedConstraint::validParams();
2727
params.addClassDescription(
28-
"This is a constraint enforcing the bodslip behavior between concrete and rebar");
28+
"This is a constraint enforcing the bod-slip behavior between concrete and rebar");
2929
params.addRequiredParam<unsigned int>("component",
3030
"An integer corresponding to the direction "
3131
"the variable this kernel acts in. (0 for x, "
@@ -100,12 +100,11 @@ bool
100100
RebarBondSlipConstraint::shouldApply()
101101
{
102102
if (_debug)
103-
if (_current_node->id() == 144)
104-
{
105-
std::cout << "===========================================\n";
106-
std::cout << "node id: " << _current_node->id() << std::endl;
107-
std::cout << "at coord: " << (Point)*_current_node << std::endl;
108-
}
103+
{
104+
std::cout << "===========================================\n";
105+
std::cout << "node id: " << _current_node->id() << std::endl;
106+
std::cout << "at coord: " << (Point)*_current_node << std::endl;
107+
}
109108
auto it = _secondary_to_primary_map.find(_current_node->id());
110109

111110
if (it != _secondary_to_primary_map.end())
@@ -157,8 +156,7 @@ RebarBondSlipConstraint::computeTangent()
157156
_current_elem_volume /= elems.size();
158157

159158
if (_debug)
160-
if (_current_node->id() == 144)
161-
std::cout << "tangent: " << _secondary_tangent << std::endl;
159+
std::cout << "tangent: " << _secondary_tangent << std::endl;
162160
}
163161

164162
void
@@ -176,10 +174,9 @@ RebarBondSlipConstraint::reinitConstraint()
176174
RealVectorValue slip_axial = slip * _secondary_tangent;
177175
RealVectorValue slip_normal = relative_disp - slip_axial;
178176
Real slip_ratio = std::abs(slip) / _transitional_slip[0];
179-
// Real bond_stress;
177+
180178
if (_debug)
181-
if (_current_node->id() == 144)
182-
std::cout << "Slip = " << slip << ".\n";
179+
std::cout << "Slip = " << slip << ".\n";
183180

184181
const Node * node = _current_node;
185182
auto it = _bondslip.find(node->id());
@@ -190,17 +187,16 @@ RebarBondSlipConstraint::reinitConstraint()
190187
bond_slip.slip_max = std::max(bond_slip.slip_max_old, slip);
191188

192189
if (_debug)
193-
if (_current_node->id() == 144)
194-
{
195-
std::cout << "Slip_min = " << bond_slip.slip_min << ".\n";
196-
std::cout << "Slip_min_old = " << bond_slip.slip_min_old << ".\n";
197-
std::cout << "Slip_max = " << bond_slip.slip_max << ".\n";
198-
std::cout << "Slip_max_old = " << bond_slip.slip_max_old << ".\n";
199-
std::cout << "Bondstress_min = " << bond_slip.bondstress_min << ".\n";
200-
std::cout << "Bondstress_min_old = " << bond_slip.bondstress_min_old << ".\n";
201-
std::cout << "Bondstress_max = " << bond_slip.bondstress_max << ".\n";
202-
std::cout << "Bondstress_max_old = " << bond_slip.bondstress_max_old << ".\n";
203-
}
190+
{
191+
std::cout << "Slip_min = " << bond_slip.slip_min << ".\n";
192+
std::cout << "Slip_min_old = " << bond_slip.slip_min_old << ".\n";
193+
std::cout << "Slip_max = " << bond_slip.slip_max << ".\n";
194+
std::cout << "Slip_max_old = " << bond_slip.slip_max_old << ".\n";
195+
std::cout << "Bondstress_min = " << bond_slip.bondstress_min << ".\n";
196+
std::cout << "Bondstress_min_old = " << bond_slip.bondstress_min_old << ".\n";
197+
std::cout << "Bondstress_max = " << bond_slip.bondstress_max << ".\n";
198+
std::cout << "Bondstress_max_old = " << bond_slip.bondstress_max_old << ".\n";
199+
}
204200

205201
Real slope = 5.0 * _max_bondstress / _transitional_slip[0];
206202
Real plastic_slip_max = bond_slip.slip_max - bond_slip.bondstress_max / slope;
@@ -213,9 +209,8 @@ RebarBondSlipConstraint::reinitConstraint()
213209
if (std::abs(slip) < _transitional_slip[0])
214210
{
215211
if (_debug)
216-
if (_current_node->id() == 144)
217-
std::cout << "Calculating bondstress for Case Ia"
218-
<< ".\n";
212+
std::cout << "Calculating bondstress for Case Ia"
213+
<< ".\n";
219214
_bond_stress = _max_bondstress * MathUtils::sign(slip) *
220215
(5.0 * slip_ratio - 4.5 * slip_ratio * slip_ratio +
221216
1.4 * slip_ratio * slip_ratio * slip_ratio);
@@ -227,34 +222,30 @@ RebarBondSlipConstraint::reinitConstraint()
227222
else if (slip >= _transitional_slip[0] && slip < _ultimate_slip)
228223
{
229224
if (_debug)
230-
if (_current_node->id() == 144)
231-
std::cout << "Calculating bondstress for Case Ib"
232-
<< ".\n";
225+
std::cout << "Calculating bondstress for Case Ib"
226+
<< ".\n";
233227
_bond_stress = 1.9 * _max_bondstress;
234228
}
235229
else if (slip <= -_transitional_slip[0] && slip > -_ultimate_slip)
236230
{
237231
if (_debug)
238-
if (_current_node->id() == 144)
239-
std::cout << "Calculating bondstress for Case Ic"
240-
<< ".\n";
232+
std::cout << "Calculating bondstress for Case Ic"
233+
<< ".\n";
241234
_bond_stress = -1.9 * _max_bondstress;
242235
}
243236
else
244237
{
245238
if (_debug)
246-
if (_current_node->id() == 144)
247-
std::cout << "Calculating bondstress for Case Id"
248-
<< ".\n";
239+
std::cout << "Calculating bondstress for Case Id"
240+
<< ".\n";
249241
_bond_stress = _frictional_bondstress * MathUtils::sign(slip);
250242
}
251243
}
252244
else if (slip > plastic_slip_max && slip < bond_slip.slip_max)
253245
{
254246
if (_debug)
255-
if (_current_node->id() == 144)
256-
std::cout << "Calculating bondstress for Case II"
257-
<< ".\n";
247+
std::cout << "Calculating bondstress for Case II"
248+
<< ".\n";
258249

259250
_bond_stress = (slip - plastic_slip_max) * bond_slip.bondstress_max /
260251
(bond_slip.slip_max - plastic_slip_max);
@@ -264,9 +255,8 @@ RebarBondSlipConstraint::reinitConstraint()
264255
else if (slip < plastic_slip_min && slip > bond_slip.slip_min)
265256
{
266257
if (_debug)
267-
if (_current_node->id() == 144)
268-
std::cout << "Calculating bondstress for Case III"
269-
<< ".\n";
258+
std::cout << "Calculating bondstress for Case III"
259+
<< ".\n";
270260

271261
_bond_stress = (slip - plastic_slip_min) * bond_slip.bondstress_min /
272262
(bond_slip.slip_min - plastic_slip_min);
@@ -276,11 +266,10 @@ RebarBondSlipConstraint::reinitConstraint()
276266
_bond_stress = _frictional_bondstress;
277267

278268
if (_debug)
279-
if (_current_node->id() == 144)
280-
{
281-
std::cout << "Bondstress = " << _bond_stress << "\n";
282-
std::cout << "Bondstress Derivative = " << _bond_stress_deriv << "\n";
283-
}
269+
{
270+
std::cout << "Bondstress = " << _bond_stress << "\n";
271+
std::cout << "Bondstress Derivative = " << _bond_stress_deriv << "\n";
272+
}
284273

285274
Real bond_force = 2.0 * libMesh::pi * _bar_radius * _current_elem_volume * _bond_stress;
286275
Real bond_force_deriv =
@@ -293,12 +282,11 @@ RebarBondSlipConstraint::reinitConstraint()
293282
_constraint_jacobian_axial = bond_force_deriv * _secondary_tangent;
294283

295284
if (_debug)
296-
if (_current_node->id() == 144)
297-
{
298-
std::cout << "Constraint Residual Axial = " << constraint_force_axial << "\n";
299-
std::cout << "Constraint Residual Normal = " << constraint_force_normal << "\n";
300-
std::cout << "Constraint Residual = " << _constraint_residual << "\n";
301-
}
285+
{
286+
std::cout << "Constraint Residual Axial = " << constraint_force_axial << "\n";
287+
std::cout << "Constraint Residual Normal = " << constraint_force_normal << "\n";
288+
std::cout << "Constraint Residual = " << _constraint_residual << "\n";
289+
}
302290

303291
bond_slip.bondstress_min = std::min(bond_slip.bondstress_min_old, _bond_stress);
304292
bond_slip.bondstress_max = std::max(bond_slip.bondstress_max_old, _bond_stress);

test/tests/rebar_bondslip/RCBeam_constraint.i

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,29 +76,29 @@
7676
type = RebarBondSlipConstraint
7777
secondary = 2
7878
primary = 1
79-
penalty = 1e6
79+
penalty = 1e12
8080
variable = 'disp_x'
8181
primary_variable = 'disp_x'
8282
component = 0
8383
max_bondstress = 100
8484
transitional_slip_values = 0.0005
8585
ultimate_slip = 0.1
8686
rebar_radius = 7.98e-3
87-
debug = true
87+
# debug = true
8888
[]
8989
[rebar_y]
9090
type = RebarBondSlipConstraint
9191
secondary = 2
9292
primary = 1
93-
penalty = 1e6
93+
penalty = 1e12
9494
variable = 'disp_y'
9595
primary_variable = 'disp_y'
9696
component = 1
9797
max_bondstress = 100
9898
transitional_slip_values = 0.0005
9999
ultimate_slip = 0.1
100100
rebar_radius = 7.98e-3
101-
debug = true
101+
# debug = true
102102
[]
103103
[]
104104

0 commit comments

Comments
 (0)