OOFEM 3.0
Loading...
Searching...
No Matches
termlibrary.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
35#include "mpm.h"
36#include "termlibrary.h"
37#include "element.h"
38#include "material.h"
39#include "materialmode.h"
40#include "crosssection.h"
41
42namespace oofem {
43
47
48
49
50
51BTSigTerm::BTSigTerm (const Variable *testField, const Variable* unknownField) : Term(testField, unknownField) {}
52
53
54void BTSigTerm::evaluate_lin (FloatMatrix& answer, MPElement& e, GaussPoint* gp, TimeStep* tstep) const {
55 FloatMatrix D, B, DB;
56 e.giveCrossSection()->giveMaterial(gp)->giveCharacteristicMatrix(D, TangentStiffness, gp, tstep);
57 this->grad(B, this->field, this->field->interpolation, e, gp->giveNaturalCoordinates(), gp->giveMaterialMode());
58 DB.beProductOf(D, B);
59 //answer.plusProductSymmUpper(B, DB, 1.0);
60 answer.beTProductOf(B,DB);
61}
62
63void BTSigTerm::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tstep) const {
64 FloatArray u, eps, sig;
66 cell.getUnknownVector(u, this->field, VM_TotalIntrinsic, tstep);
67 this->grad(B, this->field, this->field->interpolation, cell, gp->giveNaturalCoordinates(), gp->giveMaterialMode());
68 eps.beProductOf(B, u);
69 cell.giveCrossSection()->giveMaterial(gp)->giveCharacteristicVector(sig, eps, Stress, gp, tstep);
70 answer.beTProductOf(B, sig);
71}
72
74 //int nnodes = interpol.giveNumberOfNodes();
75 //int ndofs = v.size;
76 //return nnodes*ndofs;
77}
79
80void BTSigTerm::grad(FloatMatrix& answer, const Variable *v, const FEInterpolation* interpol, const Element& cell, const FloatArray& coords, const MaterialMode mmode) const {
81 FloatMatrix dndx;
82 int nnodes = interpol->giveNumberOfNodes(cell.giveGeometryType());
83 int ndofs = v->size;
84 // evaluate matrix of derivatives, the member at i,j position contains value of dNi/dxj
85 interpol->evaldNdx(dndx, coords, FEIElementGeometryWrapper(&cell));
86
87 if ((mmode == _3dMat)|| (mmode == _3dUP) || (mmode == _3dUPV)) {
88 // 3D mode only now
89 answer.resize(6, nnodes*ndofs);
90 for (int i = 0; i< nnodes; i++) {
91 answer(0, i*ndofs+0) = dndx(i, 0);
92 answer(1, i*ndofs+1) = dndx(i, 1);
93 answer(2, i*ndofs+2) = dndx(i, 2);
94
95 answer(3, i*ndofs+1) = dndx(i, 2);
96 answer(3, i*ndofs+2) = dndx(i, 1);
97
98 answer(4, i*ndofs+0) = dndx(i, 2);
99 answer(4, i*ndofs+2) = dndx(i, 0);
100
101 answer(5, i*ndofs+0) = dndx(i, 1);
102 answer(5, i*ndofs+1) = dndx(i, 0);
103 }
104 } else if ((mmode == _2dUP) || (mmode == _2dUPV)) {
105 answer.resize(6, nnodes*ndofs);
106 for (int i = 0; i< nnodes; i++) {
107 answer(0, i*ndofs+0) = dndx(i, 0);
108 answer(1, i*ndofs+1) = dndx(i, 1);
109
110 answer(5, i*ndofs+0) = dndx(i, 1);
111 answer(5, i*ndofs+1) = dndx(i, 0);
112 }
113 }
114}
115
116//wTgNTfTerm class (H)
117
118
119gNTfTerm::gNTfTerm (const Variable *testField, const Variable* unknownField, MatResponseMode lhst, MatResponseMode rtype) : Term(testField, unknownField), lhsType(lhst), rhsType(rtype) {}
120
121
122void gNTfTerm::evaluate_lin (FloatMatrix& answer, MPElement& e, GaussPoint* gp, TimeStep* tstep) const {
123 FloatMatrix D, B, DB;
124 e.giveCrossSection()->giveMaterial(gp)->giveCharacteristicMatrix(D, lhsType, gp, tstep); // update
125 this->grad(B, this->field, this->field->interpolation, e, gp->giveNaturalCoordinates());
126 DB.beProductOf(D, B);
127 answer.beTProductOf(B, DB);
128}
129
130void gNTfTerm::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tstep) const {
131 FloatArray p, gradp, fp;
132 FloatMatrix B;
133 cell.getUnknownVector(p, this->field, VM_TotalIntrinsic, tstep);
134 this->grad(B, this->field, this->field->interpolation, cell, gp->giveNaturalCoordinates());
135 gradp.beProductOf(B, p);
136 cell.giveCrossSection()->giveMaterial(gp)->giveCharacteristicVector(fp, gradp, rhsType, gp, tstep); // update
137 answer.beTProductOf(B, fp);
138}
139
141 //int nnodes = interpol.giveNumberOfNodes();
142 //int ndofs = v.size;
143 //return nnodes*ndofs;
144}
146
147void gNTfTerm::grad(FloatMatrix& answer, const Variable *v, const FEInterpolation* interpol, const Element& cell, const FloatArray& coords) const {
148 FloatMatrix at;
149 // evaluate matrix of derivatives, the member at i,j position contains value of dNi/dxj
150 interpol->evaldNdx(at, coords, FEIElementGeometryWrapper(&cell));
151 answer.beTranspositionOf(at);
152}
153
154// BTamN Term (Qp)
155
156BTamNTerm::BTamNTerm (const Variable *testField, const Variable* unknownField, MatResponseMode at) : MPMSymbolicTerm(testField, unknownField, _Unknown), aType(at) {}
157
158void BTamNTerm::evaluate_lin (FloatMatrix& answer, MPElement& e, GaussPoint* gp, TimeStep* tstep) const {
159 FloatMatrix B, mn;
160 FloatArray m({1,1,1,0,0,0}), Np;
161 MaterialMode mmode = (mode==0)?gp->giveMaterialMode():mode;
162 this->field->interpolation->evalN(Np, gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(&e));
163 m.times(e.giveCrossSection()->giveMaterial(gp)->giveCharacteristicValue(aType, gp, tstep));
164 mn.beDyadicProductOf(m, Np);
165 this->grad(B, this->testField, this->testField->interpolation, e, gp->giveNaturalCoordinates(), mmode);
166 answer.beTProductOf(B, mn);
167}
168
169void BTamNTerm::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tstep) const {
170 FloatArray p;
171 FloatMatrix Q;
172 cell.getUnknownVector(p, this->field, VM_TotalIntrinsic, tstep);
173 this->evaluate_lin (Q, cell,gp, tstep);
174 answer.beProductOf(Q,p);
175}
176
178 //int nnodes = interpol.giveNumberOfNodes();
179 //int ndofs = v.size;
180 //return nnodes*ndofs;
181}
182
183void BTamNTerm::grad(FloatMatrix& answer, const Variable *v, const FEInterpolation* interpol, const Element& cell, const FloatArray& coords, const MaterialMode mmode) const {
184 FloatMatrix dndx;
185 int nnodes = interpol->giveNumberOfNodes(cell.giveGeometryType());
186 int ndofs = v->size;
187 // evaluate matrix of derivatives, the member at i,j position contains value of dNi/dxj
188 interpol->evaldNdx(dndx, coords, FEIElementGeometryWrapper(&cell));
189
190 if ((mmode == _3dUP) || (mmode == _3dMat)) {
191 // 3D mode only now
192 answer.resize(6, nnodes*ndofs);
193 for (int i = 0; i< nnodes; i++) {
194 answer(0, i*ndofs+0) = dndx(i, 0);
195 answer(1, i*ndofs+1) = dndx(i, 1);
196 answer(2, i*ndofs+2) = dndx(i, 2);
197
198 answer(3, i*ndofs+1) = dndx(i, 2);
199 answer(3, i*ndofs+2) = dndx(i, 1);
200
201 answer(4, i*ndofs+0) = dndx(i, 2);
202 answer(4, i*ndofs+2) = dndx(i, 0);
203
204 answer(5, i*ndofs+0) = dndx(i, 1);
205 answer(5, i*ndofs+1) = dndx(i, 0);
206 }
207 } else if ((mmode == _2dUP)||(mmode == _PlaneStress)||(mmode == _PlaneStrain)) {
208 answer.resize(6, nnodes*ndofs);
209 for (int i = 0; i< nnodes; i++) {
210 answer(0, i*ndofs+0) = dndx(i, 0);
211 answer(1, i*ndofs+1) = dndx(i, 1);
212
213 answer(5, i*ndofs+0) = dndx(i, 1);
214 answer(5, i*ndofs+1) = dndx(i, 0);
215 }
216 }
217}
218
219// NTamTBTerm Term (Q^T du/dt)
220
221NTamTBTerm::NTamTBTerm (const Variable *testField, const Variable* unknownField, MatResponseMode at, ValueModeType ufieldVM) : MPMSymbolicTerm(testField, unknownField, _Unknown), aType(at), unknownFieldVMT(ufieldVM) {}
222
223void NTamTBTerm::evaluate_lin (FloatMatrix& answer, MPElement& e, GaussPoint* gp, TimeStep* tstep) const {
224 FloatMatrix B, mb;
225 FloatArray m({1,1,1,0,0,0}), Np;
226 MaterialMode mmode = (mode==0)?gp->giveMaterialMode():mode;
227 this->testField->interpolation->evalN(Np, gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(&e));
228 m.times(e.giveCrossSection()->giveMaterial(gp)->giveCharacteristicValue(aType, gp, tstep));
229 this->grad(B, this->field, this->field->interpolation, e, gp->giveNaturalCoordinates(), mmode);
232 answer.beProductOf(Npm, mb);
233}
234
235void NTamTBTerm::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tstep) const {
236 FloatArray ut;
237 FloatMatrix Q;
238 cell.getUnknownVector(ut, this->field, unknownFieldVMT ,tstep);
239 this->evaluate_lin (Q, cell,gp, tstep);
240 answer.beProductOf(Q,ut);
241}
242
244 //int nnodes = interpol.giveNumberOfNodes();
245 //int ndofs = v.size;
246 //return nnodes*ndofs;
247}
248
249void NTamTBTerm::grad(FloatMatrix& answer, const Variable *v, const FEInterpolation* interpol, const Element& cell, const FloatArray& coords, const MaterialMode mmode) const {
250 FloatMatrix dndx;
251 int nnodes = interpol->giveNumberOfNodes(cell.giveGeometryType());
252 int ndofs = v->size;
253 // evaluate matrix of derivatives, the member at i,j position contains value of dNi/dxj
254 interpol->evaldNdx(dndx, coords, FEIElementGeometryWrapper(&cell));
255
256 if ((mmode == _3dUP) || (mmode == _3dMat)) {
257 // 3D mode only now
258 answer.resize(6, nnodes*ndofs);
259 for (int i = 0; i< nnodes; i++) {
260 answer(0, i*ndofs+0) = dndx(i, 0);
261 answer(1, i*ndofs+1) = dndx(i, 1);
262 answer(2, i*ndofs+2) = dndx(i, 2);
263
264 answer(3, i*ndofs+1) = dndx(i, 2);
265 answer(3, i*ndofs+2) = dndx(i, 1);
266
267 answer(4, i*ndofs+0) = dndx(i, 2);
268 answer(4, i*ndofs+2) = dndx(i, 0);
269
270 answer(5, i*ndofs+0) = dndx(i, 1);
271 answer(5, i*ndofs+1) = dndx(i, 0);
272 }
273 } else if ((mmode == _2dUP) || (mmode == _PlaneStress)||(mmode == _PlaneStrain)) {
274 answer.resize(6, nnodes*ndofs);
275 for (int i = 0; i< nnodes; i++) {
276 answer(0, i*ndofs+0) = dndx(i, 0);
277 answer(1, i*ndofs+1) = dndx(i, 1);
278
279 answer(5, i*ndofs+0) = dndx(i, 1);
280 answer(5, i*ndofs+1) = dndx(i, 0);
281 }
282 }
283}
284
285
286// NTcN Term (S(dp/dt))
287
288NTcN::NTcN (const Variable *testField, const Variable* unknownField, MatResponseMode ctype, ValueModeType uFieldVMT) : MPMSymbolicTerm(testField, unknownField, _Unknown), ctype(ctype), unknownFieldVMT(uFieldVMT) {}
289
290void NTcN::evaluate_lin (FloatMatrix& answer, MPElement& e, GaussPoint* gp, TimeStep* tstep) const {
291 FloatArray Np;
292 this->field->interpolation->evalN(Np, gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(&e));
293 answer.beDyadicProductOf(Np, Np);
295}
296
297void NTcN::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tstep) const {
298 FloatArray p;
300 cell.getUnknownVector(p, this->field, unknownFieldVMT, tstep);
301 this->evaluate_lin (S, cell,gp, tstep);
302 answer.beProductOf(S,p);
303}
304
305void NTcN::getDimensions(Element& cell) const {
306 //int nnodes = interpol.giveNumberOfNodes();
307 //int ndofs = v.size;
308 //return nnodes*ndofs;
309}
310
311// A external flux term $S=(N)^T f$, where $f$ is functor evaluating the flux.
313
314void
315NTf_Surface::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tStep) const {
316 FloatArray nvec, flux;
318 const FloatArray& lc = gp->giveNaturalCoordinates();
319
320 this->f.evaluate(flux, lc, cell, this->testField, tStep);
321
322 this->testField->interpolation->boundarySurfaceEvalN(nvec, isurf, lc, FEIElementGeometryWrapper(&cell));
323 N.beNMatrixOf(nvec, testField->size);
324 answer.beTProductOf(N, flux);
325
326}
327
328// A external flux term $S=(N)^T f$, where $f$ is functor evaluating the flux.
329NTf_Edge::NTf_Edge (const Variable *testField, const NTfFunctor& f, int surf) : Term (testField, testField), f(f), isurf(surf) {}
330
331void
332NTf_Edge::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tStep) const {
333 FloatArray nvec, flux;
335 const FloatArray& lc = gp->giveNaturalCoordinates();
336
337 this->f.evaluate(flux, lc, cell, this->testField, tStep);
338
339 this->testField->interpolation->boundaryEdgeEvalN(nvec, isurf, lc, FEIElementGeometryWrapper(&cell));
340 N.beNMatrixOf(nvec, testField->size);
341 answer.beTProductOf(N, flux);
342
343}
344
345
346// A external flux term $S=(N)^T f$, where $f$ is functor evaluating the flux.
348
349void
350NTf_Body::evaluate (FloatArray& answer, MPElement& cell, GaussPoint* gp, TimeStep* tStep) const {
351 FloatArray nvec, flux;
353 const FloatArray& lc = gp->giveNaturalCoordinates();
354
355 this->f.evaluate(flux, lc, cell, this->testField, tStep);
356
357 this->testField->interpolation->evalN(nvec, lc, FEIElementGeometryWrapper(&cell));
358 N.beNMatrixOf(nvec, testField->size);
359 answer.beTProductOf(N, flux);
360
361}
362
363
364} // end namespace oofem
#define N(a, b)
#define REGISTER_Term(class)
void initializeCell(Element &cell) const override
Definition termlibrary.C:78
void evaluate_lin(FloatMatrix &answer, MPElement &e, GaussPoint *gp, TimeStep *tstep) const override
Evaluates the linearization of $B^T\sigma(u)$, i.e. $B^TDBu$.
Definition termlibrary.C:54
BTSigTerm(const Variable *testField, const Variable *unknownField)
void getDimensions(Element &cell) const override
Definition termlibrary.C:73
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $b^T\sigma(u)$.
Definition termlibrary.C:63
void grad(FloatMatrix &answer, const Variable *v, const FEInterpolation *interpol, const Element &cell, const FloatArray &coords, const MaterialMode mmode) const
Evaluates B matrix; i.e. $LN$ where $L$ is operator matrix and $N$ is interpolation matrix of unknown...
Definition termlibrary.C:80
A continuity equation term $Qp=(B)^T \alpha\bf{m}N_p$.
MatResponseMode aType
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
void getDimensions(Element &cell) const override
void grad(FloatMatrix &answer, const Variable *v, const FEInterpolation *interpol, const Element &cell, const FloatArray &coords, const MaterialMode mmode) const
Evaluates B matrix; i.e. $\grad N$ where $N$ is interpolation matrix of unknown (p).
void evaluate_lin(FloatMatrix &answer, MPElement &e, GaussPoint *gp, TimeStep *tstep) const override
Evaluates the linearization of receiver, i.e. the LHS term.
virtual Material * giveMaterial(IntegrationPoint *ip) const =0
hidden by virtual oofem::Material* TransportCrossSection::giveMaterial() const
CrossSection * giveCrossSection()
Definition element.C:534
virtual Element_Geometry_Type giveGeometryType() const =0
virtual int giveNumberOfNodes(const Element_Geometry_Type) const
Definition feinterpol.h:557
virtual double evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:721
void times(double f)
static FloatMatrix fromArray(const FloatArray &vector, bool transpose=false)
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void beTranspositionOf(const FloatMatrix &src)
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
Definition gausspoint.h:138
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
Base class for elements based on mp (multi-physics) concept.
Definition mpm.h:282
virtual const void getUnknownVector(FloatArray &answer, const Variable *field, ValueModeType mode, TimeStep *tstep)
Returns vector of nodal unknowns for given Variable.
Definition mpm.h:473
virtual void giveCharacteristicVector(FloatArray &answer, FloatArray &flux, MatResponseMode type, GaussPoint *gp, TimeStep *tStep) const
Returns characteristic vector of the receiver.
Definition material.h:145
virtual void giveCharacteristicMatrix(FloatMatrix &answer, MatResponseMode type, GaussPoint *gp, TimeStep *tStep) const
Returns characteristic matrix of the receiver.
Definition material.h:140
virtual double giveCharacteristicValue(MatResponseMode type, GaussPoint *gp, TimeStep *tStep) const
Returns characteristic value of the receiver.
Definition material.C:68
A continuity equation term $Q^T(du\over dt)=(N)^T \alpha\bf{m}^TB du\over dt$.
void evaluate_lin(FloatMatrix &answer, MPElement &e, GaussPoint *gp, TimeStep *tstep) const override
Evaluates the linearization of receiver, i.e. the LHS term.
void grad(FloatMatrix &answer, const Variable *v, const FEInterpolation *interpol, const Element &cell, const FloatArray &coords, const MaterialMode mmode) const
Evaluates B matrix; i.e. $\grad N$ where $N$ is interpolation matrix of unknown (p).
MatResponseMode aType
void getDimensions(Element &cell) const override
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
ValueModeType unknownFieldVMT
A continuity equation compressibility matrix $S=(N_p)^T c\ N_p$, where $c=({\alpha-n}...
MatResponseMode ctype
ValueModeType unknownFieldVMT
void evaluate_lin(FloatMatrix &answer, MPElement &e, GaussPoint *gp, TimeStep *tstep) const override
Evaluates the linearization of term (the lhs contribution).
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
void getDimensions(Element &cell) const override
An external flux functor.
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
const NTfFunctor & f
NTf_Body(const Variable *testField, const NTfFunctor &f)
NTf_Edge(const Variable *testField, const NTfFunctor &f, int surf)
const NTfFunctor & f
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
const NTfFunctor & f
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
NTf_Surface(const Variable *testField, const NTfFunctor &f, int surf)
Class representing a weak form expression to be evaluated (integrated). It defines two key methods:
Definition mpm.h:134
MaterialMode mode
Definition mpm.h:138
const Variable * field
Definition mpm.h:136
const Variable * testField
Definition mpm.h:137
MatResponseMode lhsType
Definition termlibrary.h:94
gNTfTerm(const Variable *testField, const Variable *unknownField, MatResponseMode lhsType, MatResponseMode rhsType)
void grad(FloatMatrix &answer, const Variable *v, const FEInterpolation *interpol, const Element &cell, const FloatArray &coords) const
Evaluates B matrix; i.e. $\grad N$ where $N$ is interpolation matrix of unknown (p).
MatResponseMode rhsType
Definition termlibrary.h:94
void getDimensions(Element &cell) const override
void evaluate(FloatArray &, MPElement &cell, GaussPoint *gp, TimeStep *tstep) const override
Evaluates Internal forces vector, i.e. $w^T(\grad N)^T f(p)$.
void initializeCell(Element &cell) const override
void evaluate_lin(FloatMatrix &answer, MPElement &e, GaussPoint *gp, TimeStep *tstep) const override
Evaluates $\bf{H}$ matrix, the linearization of $w^T(\grad N)^T f(p)$, i.e. $(\grad N)^T \bf{k}...
#define S(p)
Definition mdm.C:469

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