OOFEM 3.0
Loading...
Searching...
No Matches
microplanematerial_bazant.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
36#include "floatarray.h"
37
38namespace oofem {
39MicroplaneMaterial_Bazant :: MicroplaneMaterial_Bazant(int n, Domain *d) : MicroplaneMaterial(n, d)
40{ }
41
42
44MicroplaneMaterial_Bazant :: giveRealStressVector_3d(const FloatArrayF<6> &strain,
45 GaussPoint *gp, TimeStep *tStep) const
46{
47 double SvDash = 0., SvSum = 0.;
48 FloatArray mPlaneNormalStress(numberOfMicroplanes), mPlaneShear_L_Stress(numberOfMicroplanes),
49 mPlaneShear_M_Stress(numberOfMicroplanes);
50
51 auto status = static_cast< StructuralMaterialStatus * >( this->giveStatus(gp) );
52 this->initTempStatus(gp);
53
54 FloatArrayF<6> answer;
55
56 for ( int mPlaneIndex = 0; mPlaneIndex < numberOfMicroplanes; mPlaneIndex++ ) {
57 int mPlaneIndex1 = mPlaneIndex + 1;
58 // compute strain projections on mPlaneIndex-th microplane
59 auto mPlaneStrainCmpns = computeStrainVectorComponents(mPlaneIndex1, strain);
60 // compute real stresses on this microplane
61 auto mPlaneStressCmpns = giveRealMicroplaneStressVector(gp, mPlaneIndex1, mPlaneStrainCmpns, tStep);
62
63 mPlaneNormalStress.at(mPlaneIndex1) = mPlaneStressCmpns.n;
64 mPlaneShear_L_Stress.at(mPlaneIndex1) = mPlaneStressCmpns.l;
65 mPlaneShear_M_Stress.at(mPlaneIndex1) = mPlaneStressCmpns.m;
66 double mPlaneIntegrationWeight = this->giveMicroplaneIntegrationWeight(mPlaneIndex1);
67
68 SvSum += mPlaneNormalStress.at(mPlaneIndex1) * mPlaneIntegrationWeight;
69 double SD = mPlaneNormalStress.at(mPlaneIndex1) - mPlaneStressCmpns.v;
70 //SDSum += SD* mPlaneIntegrationWeight;
71
72 SvDash = mPlaneStressCmpns.v;
73 //volumetric stress is the same for all mplanes
74 //and does not need to be homogenized .
75 //Only updating accordinging to mean normal stress must be done.
76 //Use updateVolumetricStressTo() if necessary
77
78 // perform homogenization
79 // mPlaneStressCmpns.at(1) je SVdash
80 // mPlaneStressCmpns.at(2) je SN
81 // mPlaneStressCmpns.at(3) je SL
82 // mPlaneStressCmpns.at(4) je SM
83 // answer (1 az 6)
84
85 for ( int i = 0; i < 6; i++ ) {
86 answer.at(i + 1) += ( ( N [ mPlaneIndex ] [ i ] - Kronecker [ i ] / 3. ) * SD +
87 L [ mPlaneIndex ] [ i ] * mPlaneShear_L_Stress.at(mPlaneIndex1) +
88 M [ mPlaneIndex ] [ i ] * mPlaneShear_M_Stress.at(mPlaneIndex1) )
89 * mPlaneIntegrationWeight;
90 }
91 }
92
93 SvSum *= 6.;
94 //nakonec answer take *6
95
96 // sv=min(integr(sn)/2PI,SvDash)
97
98 if ( SvDash > SvSum / 3. ) {
99 SvDash = SvSum / 3.;
100 answer = zeros<6>();
101
102 for ( int mPlaneIndex = 0; mPlaneIndex < numberOfMicroplanes; mPlaneIndex++ ) {
103 int mPlaneIndex1 = mPlaneIndex + 1;
104
105 updateVolumetricStressTo(gp, mPlaneIndex1, SvDash);
106
107 double SD = mPlaneNormalStress.at(mPlaneIndex1) - SvDash;
108 double mPlaneIntegrationWeight = this->giveMicroplaneIntegrationWeight(mPlaneIndex1);
109
110 for ( int i = 0; i < 6; i++ ) {
111 answer.at(i + 1) += ( ( N [ mPlaneIndex ] [ i ] - Kronecker [ i ] / 3. ) * SD +
112 L [ mPlaneIndex ] [ i ] * mPlaneShear_L_Stress.at(mPlaneIndex1) +
113 M [ mPlaneIndex ] [ i ] * mPlaneShear_M_Stress.at(mPlaneIndex1) )
114 * mPlaneIntegrationWeight;
115 }
116 }
117 }
118
119 answer *= 6.0;
120
121 //2nd constraint, addition of volumetric part
122 answer.at(1) += SvDash;
123 answer.at(2) += SvDash;
124 answer.at(3) += SvDash;
125
126 status->letTempStrainVectorBe(strain);
127 status->letTempStressVectorBe(answer);
128 return answer;
129}
130} // end namespace oofem
double & at(std::size_t i)
double & at(Index i)
Definition floatarray.h:202
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
virtual void initTempStatus(GaussPoint *gp) const
Definition material.C:221
virtual MicroplaneState giveRealMicroplaneStressVector(GaussPoint *gp, int mnumber, const MicroplaneState &strain, TimeStep *tStep) const =0
virtual void updateVolumetricStressTo(GaussPoint *gp, int mnumber, double sigv) const =0
MicroplaneState computeStrainVectorComponents(int mnumber, const FloatArray &macroStrain) const
std::vector< FloatArrayF< 6 > > N
double giveMicroplaneIntegrationWeight(int mnumber) const
int numberOfMicroplanes
Number of microplanes.
FloatArrayF< 6 > Kronecker
Kronecker's delta.
std::vector< FloatArrayF< 6 > > M
std::vector< FloatArrayF< 6 > > L
MicroplaneMaterial(int n, Domain *d)
FloatArrayF< N > zeros()
For more readable code.

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011