OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
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 - 2013 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 "microplane.h"
37 #include "floatarray.h"
38 
39 namespace oofem {
41 { }
42 
43 
44 void
46  GaussPoint *gp,
47  const FloatArray &totalStrain,
48  TimeStep *tStep)
49 {
50  double SvDash, SvSum = 0.;
51  double SD;
52  FloatArray mPlaneNormalStress(numberOfMicroplanes), mPlaneShear_L_Stress(numberOfMicroplanes),
53  mPlaneShear_M_Stress(numberOfMicroplanes);
54  double mPlaneIntegrationWeight;
55 
56  FloatArray mPlaneStressCmpns, mPlaneStrainCmpns;
57 
58  answer.resize(6);
59  answer.zero();
60 
61  StructuralMaterialStatus *status = static_cast< StructuralMaterialStatus * >( this->giveStatus(gp) );
62  this->initTempStatus(gp);
63 
64 
65  for ( int mPlaneIndex = 0; mPlaneIndex < numberOfMicroplanes; mPlaneIndex++ ) {
66  Microplane *mPlane = this->giveMicroplane(mPlaneIndex, gp);
67  int mPlaneIndex1 = mPlaneIndex + 1;
68  // compute strain projections on mPlaneIndex-th microplane
69  computeStrainVectorComponents(mPlaneStrainCmpns, mPlane, totalStrain);
70  // compute real stresses on this microplane
71  giveRealMicroplaneStressVector(mPlaneStressCmpns, mPlane, mPlaneStrainCmpns, tStep);
72 
73  mPlaneNormalStress.at(mPlaneIndex1) = mPlaneStressCmpns.at(2);
74  mPlaneShear_L_Stress.at(mPlaneIndex1) = mPlaneStressCmpns.at(3);
75  mPlaneShear_M_Stress.at(mPlaneIndex1) = mPlaneStressCmpns.at(4);
76  mPlaneIntegrationWeight = this->giveMicroplaneIntegrationWeight(mPlane);
77 
78  SvSum += mPlaneNormalStress.at(mPlaneIndex1) * mPlaneIntegrationWeight;
79  SD = mPlaneNormalStress.at(mPlaneIndex1) - mPlaneStressCmpns.at(1);
80  //SDSum += SD* mPlaneIntegrationWeight;
81 
82 
83  // perform homogenization
84  // mPlaneStressCmpns.at(1) je SVdash
85  // mPlaneStressCmpns.at(2) je SN
86  // mPlaneStressCmpns.at(3) je SL
87  // mPlaneStressCmpns.at(4) je SM
88  // answer (1 az 6)
89 
90  for ( int i = 0; i < 6; i++ ) {
91  answer.at(i + 1) += ( ( N [ mPlaneIndex ] [ i ] - Kronecker [ i ] / 3. ) * SD +
92  L [ mPlaneIndex ] [ i ] * mPlaneShear_L_Stress.at(mPlaneIndex1) +
93  M [ mPlaneIndex ] [ i ] * mPlaneShear_M_Stress.at(mPlaneIndex1) )
94  * mPlaneIntegrationWeight;
95  }
96  }
97 
98  SvSum = SvSum * 6.;
99  //nakonec answer take *6
100 
101  SvDash = mPlaneStressCmpns.at(1);
102  //volumetric stress is the same for all mplanes
103  //and does not need to be homogenized .
104  //Only updating accordinging to mean normal stress must be done.
105  //Use updateVolumetricStressTo() if necessary
106 
107  // sv=min(integr(sn)/2PI,SvDash)
108 
109  if ( SvDash > SvSum / 3. ) {
110  SvDash = SvSum / 3.;
111  answer.zero();
112 
113  for ( int mPlaneIndex = 0; mPlaneIndex < numberOfMicroplanes; mPlaneIndex++ ) {
114  Microplane *mPlane = this->giveMicroplane(mPlaneIndex, gp);
115  int mPlaneIndex1 = mPlaneIndex + 1;
116 
117  updateVolumetricStressTo(mPlane, SvDash);
118 
119  SD = mPlaneNormalStress.at(mPlaneIndex1) - SvDash;
120  mPlaneIntegrationWeight = this->giveMicroplaneIntegrationWeight(mPlane);
121 
122  for ( int i = 0; i < 6; i++ ) {
123  answer.at(i + 1) += ( ( N [ mPlaneIndex ] [ i ] - Kronecker [ i ] / 3. ) * SD +
124  L [ mPlaneIndex ] [ i ] * mPlaneShear_L_Stress.at(mPlaneIndex1) +
125  M [ mPlaneIndex ] [ i ] * mPlaneShear_M_Stress.at(mPlaneIndex1) )
126  * mPlaneIntegrationWeight;
127  }
128  }
129  }
130 
131  answer.times(6.0);
132 
133  //2nd constraint, addition of volumetric part
134  answer.at(1) += SvDash;
135  answer.at(2) += SvDash;
136  answer.at(3) += SvDash;
137 
138  status->letTempStrainVectorBe(totalStrain);
139  status->letTempStressVectorBe(answer);
140 }
141 } // end namespace oofem
int numberOfMicroplanes
Number of microplanes.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
Definition: structuralms.h:137
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
Definition: material.C:244
double L[MAX_NUMBER_OF_MICROPLANES][6]
Shear projection tensors (l direction) for all microplanes.
Class and object Domain.
Definition: domain.h:115
double M[MAX_NUMBER_OF_MICROPLANES][6]
Shear projection tensors (m direction) for all microplanes.
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
This class implements a structural material status information.
Definition: structuralms.h:65
Microplane * giveMicroplane(int i, GaussPoint *masterGp)
Returns i-th microplane belonging to master-macro-integration point. )-based indexing.
virtual void giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
virtual void giveRealMicroplaneStressVector(FloatArray &answer, Microplane *mplane, const FloatArray &strain, TimeStep *tStep)=0
Computes real stress vector on given microplane (the meaning of values depends on particular implemen...
virtual void initTempStatus(GaussPoint *gp)
Initializes temporary variables stored in integration point status at the beginning of new time step...
Abstract base class for all microplane models.
virtual void updateVolumetricStressTo(Microplane *mPlane, double sigv)=0
Updates the volumetric stress component after computing real stress microplane vectors.
Class representing microplane integration point in finite element program.
Definition: microplane.h:74
virtual double giveMicroplaneIntegrationWeight(Microplane *mplane)
Returns microplane integration weight.
Class representing vector of real numbers.
Definition: floatarray.h:82
double N[MAX_NUMBER_OF_MICROPLANES][6]
Normal projection tensors for all microplanes.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
Definition: structuralms.h:135
void zero()
Zeroes all coefficients of receiver.
Definition: floatarray.C:658
MicroplaneMaterial_Bazant(int n, Domain *d)
Constructor.
void times(double s)
Multiplies receiver with scalar.
Definition: floatarray.C:818
the oofem namespace is to define a context or scope in which all oofem names are defined.
Class representing integration point in finite element program.
Definition: gausspoint.h:93
Class representing solution step.
Definition: timestep.h:80
double Kronecker[6]
Kronecker&#39;s delta.
void computeStrainVectorComponents(FloatArray &answer, Microplane *mplane, const FloatArray &macroStrain)
Computes the vector of all micro stress components (Ev, En, Em, El) of macro strain vector on given m...
void resize(int s)
Resizes receiver towards requested size.
Definition: floatarray.C:631

This page is part of the OOFEM documentation. Copyright (c) 2011 Borek Patzak
Project e-mail: info@oofem.org
Generated at Tue Jan 2 2018 20:07:30 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011