OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
simplevitrificationmaterial.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 "gausspoint.h"
37 #include "dynamicinputrecord.h"
38 #include "classfactory.h"
39 
40 namespace oofem {
41 REGISTER_Material(SimpleVitrificationMaterial);
42 
44 
45 
47 {
48  IRResultType result;
49 
51 
56 
61 
63 }
64 
65 
67 {
69 
71 
76 
81 }
82 
83 
85 {
86  return true;
87 }
88 
89 
90 
92  MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
93 {
94  double eksi, nxz, nyz, nxy, nzx, nzy, nyx;
95  bool vitr = tStep->giveIntrinsicTime() < this->vitrTime;
96  const FloatArray &activeNu = vitr ? this->nu_r : this->nu;
97  const FloatArray &activeE = vitr ? this->E_r : this->E;
98  const FloatArray &activeG = vitr ? this->G_r : this->G;
99 
100  nyz = nzy = activeNu.at(1);
101  nxz = nzx = activeNu.at(2);
102  nxy = nyx = activeNu.at(3);
103 
104  eksi = 1. - ( nxy * nyx + nyz * nzy + nzx * nxz ) - ( nxy * nyz * nzx + nyx * nzy * nxz );
105 
106  answer.resize(6, 6);
107  answer.zero();
108  // switched letters from original oofem -> now produces same material stiffness matrix as Abaqus method
109  answer.at(1, 1) = activeE.at(1) * ( 1. - nyz * nzy ) / eksi;
110  answer.at(1, 2) = activeE.at(2) * ( nxy + nxz * nzy ) / eksi;
111  answer.at(1, 3) = activeE.at(3) * ( nxz + nyz * nxy ) / eksi;
112  answer.at(2, 2) = activeE.at(2) * ( 1. - nxz * nzx ) / eksi;
113  answer.at(2, 3) = activeE.at(3) * ( nyz + nyx * nxz ) / eksi;
114  answer.at(3, 3) = activeE.at(3) * ( 1. - nyx * nxy ) / eksi;
115 
116  // define the lower triangle
117  for ( int i = 1; i < 4; i++ ) {
118  for ( int j = 1; j < i; j++ ) {
119  answer.at(i, j) = answer.at(j, i);
120  }
121  }
122 
123  answer.at(4, 4) = activeG.at(1);
124  answer.at(5, 5) = activeG.at(2);
125  answer.at(6, 6) = activeG.at(3);
126 }
127 
128 
130  const FloatArray &reducedStrain, TimeStep *tStep)
131 {
132  FloatArray strainVector;
133  FloatMatrix d;
134  FloatArray deltaStrain;
135 
136  StructuralMaterialStatus *status = dynamic_cast< StructuralMaterialStatus * >( this->giveStatus(gp) );
137 
138  this->giveStressDependentPartOfStrainVector(strainVector, gp, reducedStrain, tStep, VM_Total);
139 
140  deltaStrain.beDifferenceOf( strainVector, status->giveStrainVector() );
141 
142  this->give3dMaterialStiffnessMatrix(d, TangentStiffness, gp, tStep);
143 
144  FloatArray deltaStress;
145  deltaStress.beProductOf(d, deltaStrain);
146 
147  answer = status->giveStressVector();
148  answer.add(deltaStress);
149 
150  // update gp
151  status->letTempStrainVectorBe(reducedStrain);
152  status->letTempStressVectorBe(answer);
153 }
154 
155 
157  GaussPoint *gp, TimeStep *tStep)
158 {
159  bool vitr = tStep->giveIntrinsicTime() < this->vitrTime;
160  answer.resize(6);
161  answer.at(1) = vitr ? this->alpha_r.at(1) : this->alpha.at(1);
162  answer.at(2) = vitr ? this->alpha_r.at(2) : this->alpha.at(2);
163  answer.at(3) = vitr ? this->alpha_r.at(3) : this->alpha.at(3);
164 }
165 
166 
168 {
169  return new StructuralMaterialStatus(1, domain, gp);
170 }
171 } // end namespace oofem
void setField(int item, InputFieldType id)
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
Definition: structuralms.h:137
#define _IFT_SimpleVitrificationMaterial_G
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
Definition: material.C:244
#define _IFT_SimpleVitrificationMaterial_vitrificationTime
Describes the time where the material switches response.
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition: femcmpnn.h:82
virtual void giveThermalDilatationVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Returns a vector of coefficients of thermal dilatation in direction of each material principal (local...
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
virtual int checkConsistency()
Allows programmer to test some internal data, before computation begins.
This class implements a structural material status information.
Definition: structuralms.h:65
virtual void give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes full 3d material stiffness matrix at given integration point, time, respecting load history ...
virtual void giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
#define _IFT_SimpleVitrificationMaterial_alpha
void giveStressDependentPartOfStrainVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrainVector, TimeStep *tStep, ValueModeType mode)
Method for subtracting from reduced space strain vector its stress-independent parts (caused by tempe...
MatResponseMode
Describes the character of characteristic material matrix.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
Definition: floatarray.C:341
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
#define _IFT_SimpleVitrificationMaterial_nu_r
double vitrTime
Vitrification time (when equal or larger than this time the material changes response).
FloatArray E_r
Material parameters for the rubbery part of the model (before vitrification).
#define _IFT_SimpleVitrificationMaterial_nu
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
Definition: floatarray.C:676
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
Definition: timestep.h:148
#define _IFT_SimpleVitrificationMaterial_E_r
Abstract base class representing a material status information.
Definition: matstatus.h:84
Class representing vector of real numbers.
Definition: floatarray.h:82
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
Definition: structuralms.h:135
const FloatArray & giveStressVector() const
Returns the const pointer to receiver&#39;s stress vector.
Definition: structuralms.h:107
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Definition: floatmatrix.C:1358
Class representing the general Input Record.
Definition: inputrecord.h:101
FloatArray E
Material parameters for the glassy part of the model (after vitrification).
Class representing the a dynamic Input Record.
#define _IFT_SimpleVitrificationMaterial_G_r
void zero()
Zeroes all coefficient of receiver.
Definition: floatmatrix.C:1326
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
#define _IFT_SimpleVitrificationMaterial_alpha_r
REGISTER_Material(DummyMaterial)
the oofem namespace is to define a context or scope in which all oofem names are defined.
#define IR_GIVE_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:69
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver&#39;s strain vector.
Definition: structuralms.h:105
#define _IFT_SimpleVitrificationMaterial_E
Class representing integration point in finite element program.
Definition: gausspoint.h:93
Class representing solution step.
Definition: timestep.h:80
void add(const FloatArray &src)
Adds array src to receiver.
Definition: floatarray.C:156
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:31 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011