Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
dune-gfe
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Sander, Oliver
dune-gfe
Commits
095f2b96
Commit
095f2b96
authored
10 years ago
by
Andreas Fischle
Committed by
Oliver Sander
10 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Implement Neo-Hooke energy and exponential Hencky energy
parent
47ce740a
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
dune/gfe/exphenckyenergy.hh
+150
-0
150 additions, 0 deletions
dune/gfe/exphenckyenergy.hh
dune/gfe/neohookeenergy.hh
+140
-0
140 additions, 0 deletions
dune/gfe/neohookeenergy.hh
with
290 additions
and
0 deletions
dune/gfe/exphenckyenergy.hh
0 → 100644
+
150
−
0
View file @
095f2b96
#ifndef DUNE_GFE_EXPHENCKYENERGY_HH
#define DUNE_GFE_EXPHENCKYENERGY_HH
#include
<dune/common/fmatrix.hh>
#include
<dune/common/fmatrixev.hh>
#include
<dune/geometry/quadraturerules.hh>
#include
<dune/gfe/localfestiffness.hh>
namespace
Dune
{
template
<
class
GridView
,
class
LocalFiniteElement
,
class
field_type
=
double
>
class
ExpHenckyEnergy
:
public
LocalFEStiffness
<
GridView
,
LocalFiniteElement
,
std
::
vector
<
Dune
::
FieldVector
<
field_type
,
3
>
>
>
{
// grid types
typedef
typename
GridView
::
Grid
::
ctype
DT
;
typedef
typename
GridView
::
template
Codim
<
0
>
::
Entity
Entity
;
// some other sizes
enum
{
gridDim
=
GridView
::
dimension
};
enum
{
dim
=
GridView
::
dimension
};
public
:
/** \brief Constructor with a set of material parameters
* \param parameters The material parameters
*/
ExpHenckyEnergy
(
const
Dune
::
ParameterTree
&
parameters
)
{
// Lame constants
mu_
=
parameters
.
get
<
double
>
(
"mu"
);
lambda_
=
parameters
.
get
<
double
>
(
"lambda"
);
kappa_
=
(
2.0
*
mu_
+
3.0
*
lambda_
)
/
3.0
;
// Exponential Hencky constants with naming convention from Neff, Ghiba and Lankeit,
// "The exponentiated Hencky-logarithmic strain energy. Part I: Constitutive issues
// and rank one convexity"
k_
=
parameters
.
get
<
double
>
(
"k"
);
khat_
=
parameters
.
get
<
double
>
(
"khat"
);
// weights for distortion and dilatation parts of the energy
alpha_
=
mu_
/
k_
;
beta_
=
kappa_
/
(
2.0
*
khat_
);
}
/** \brief Assemble the energy for a single element */
field_type
energy
(
const
Entity
&
e
,
const
LocalFiniteElement
&
localFiniteElement
,
const
std
::
vector
<
Dune
::
FieldVector
<
field_type
,
gridDim
>
>&
localConfiguration
)
const
;
/** \brief Lame constants */
field_type
mu_
,
lambda_
,
kappa_
,
k_
,
khat_
,
alpha_
,
beta_
;
};
template
<
class
GridView
,
class
LocalFiniteElement
,
class
field_type
>
field_type
ExpHenckyEnergy
<
GridView
,
LocalFiniteElement
,
field_type
>::
energy
(
const
Entity
&
element
,
const
LocalFiniteElement
&
localFiniteElement
,
const
std
::
vector
<
Dune
::
FieldVector
<
field_type
,
gridDim
>
>&
localConfiguration
)
const
{
assert
(
element
.
type
()
==
localFiniteElement
.
type
());
typedef
typename
GridView
::
template
Codim
<
0
>
::
Entity
::
Geometry
Geometry
;
// store gradients of shape functions and base functions
std
::
vector
<
Dune
::
FieldMatrix
<
DT
,
1
,
gridDim
>
>
referenceGradients
(
localFiniteElement
.
size
());
std
::
vector
<
Dune
::
FieldVector
<
DT
,
gridDim
>
>
gradients
(
localFiniteElement
.
size
());
int
quadOrder
=
(
element
.
type
().
isSimplex
())
?
localFiniteElement
.
localBasis
().
order
()
:
localFiniteElement
.
localBasis
().
order
()
*
gridDim
;
const
Dune
::
QuadratureRule
<
DT
,
gridDim
>&
quad
=
Dune
::
QuadratureRules
<
DT
,
gridDim
>::
rule
(
element
.
type
(),
quadOrder
);
field_type
distortionEnergy
=
0
,
dilatationEnergy
=
0
;
for
(
size_t
pt
=
0
;
pt
<
quad
.
size
();
pt
++
)
{
// Local position of the quadrature point
const
Dune
::
FieldVector
<
DT
,
gridDim
>&
quadPos
=
quad
[
pt
].
position
();
const
DT
integrationElement
=
element
.
geometry
().
integrationElement
(
quadPos
);
const
typename
Geometry
::
JacobianInverseTransposed
&
jacobianInverseTransposed
=
element
.
geometry
().
jacobianInverseTransposed
(
quadPos
);
DT
weight
=
quad
[
pt
].
weight
()
*
integrationElement
;
// get gradients of shape functions
localFiniteElement
.
localBasis
().
evaluateJacobian
(
quadPos
,
referenceGradients
);
// compute gradients of base functions
for
(
size_t
i
=
0
;
i
<
gradients
.
size
();
++
i
)
jacobianInverseTransposed
.
mv
(
referenceGradients
[
i
][
0
],
gradients
[
i
]);
Dune
::
FieldMatrix
<
field_type
,
gridDim
,
gridDim
>
derivative
(
0
);
for
(
size_t
i
=
0
;
i
<
gradients
.
size
();
i
++
)
for
(
int
j
=
0
;
j
<
gridDim
;
j
++
)
derivative
[
j
].
axpy
(
localConfiguration
[
i
][
j
],
gradients
[
i
]);
/////////////////////////////////////////////////////////
// compute C = F^T F
/////////////////////////////////////////////////////////
Dune
::
FieldMatrix
<
field_type
,
gridDim
,
gridDim
>
C
(
0
);
for
(
int
i
=
0
;
i
<
gridDim
;
i
++
)
for
(
int
j
=
0
;
j
<
gridDim
;
j
++
)
for
(
int
k
=
0
;
k
<
gridDim
;
k
++
)
C
[
i
][
j
]
+=
derivative
[
k
][
i
]
*
derivative
[
k
][
j
];
//////////////////////////////////////////////////////////
// Eigenvalues of FTF
//////////////////////////////////////////////////////////
// compute eigenvalues of C, i.e., squared singular values \sigma_i of F
Dune
::
FieldVector
<
field_type
,
dim
>
sigmaSquared
;
FMatrixHelp
::
eigenValues
(
C
,
sigmaSquared
);
// logarithms of the singular values of F, i.e., eigenvalues of U
std
::
array
<
field_type
,
dim
>
lnSigma
;
for
(
int
i
=
0
;
i
<
dim
;
i
++
)
lnSigma
[
i
]
=
0.5
*
log
(
sigmaSquared
[
i
]);
field_type
trLogU
=
0
;
for
(
int
i
=
0
;
i
<
dim
;
i
++
)
trLogU
+=
lnSigma
[
i
];
field_type
normDevLogUSquared
=
0
;
for
(
int
i
=
0
;
i
<
dim
;
i
++
)
{
// the deviator shifts the
field_type
lnDevSigma_i
=
lnSigma
[
i
]
-
(
1.0
/
double
(
dim
))
*
trLogU
;
normDevLogUSquared
+=
lnDevSigma_i
*
lnDevSigma_i
;
}
// Add the local energy density
distortionEnergy
+=
weight
*
alpha_
*
exp
(
khat_
*
normDevLogUSquared
);
dilatationEnergy
+=
weight
*
beta_
*
exp
(
k_
*
(
trLogU
*
trLogU
));
}
return
distortionEnergy
+
dilatationEnergy
;
}
}
// namespace Dune
#endif //#ifndef DUNE_GFE_EXPHENCKYENERGY_HH
This diff is collapsed.
Click to expand it.
dune/gfe/neohookeenergy.hh
0 → 100644
+
140
−
0
View file @
095f2b96
#ifndef DUNE_GFE_NEOHOOKEENERGY_HH
#define DUNE_GFE_NEOHOOKEENERGY_HH
#include
<dune/common/fmatrix.hh>
#include
<dune/common/fmatrixev.hh>
#include
<dune/geometry/quadraturerules.hh>
#include
<dune/gfe/localfestiffness.hh>
namespace
Dune
{
template
<
class
GridView
,
class
LocalFiniteElement
,
class
field_type
=
double
>
class
NeoHookeEnergy
:
public
LocalFEStiffness
<
GridView
,
LocalFiniteElement
,
std
::
vector
<
Dune
::
FieldVector
<
field_type
,
3
>
>
>
{
// grid types
typedef
typename
GridView
::
Grid
::
ctype
DT
;
typedef
typename
GridView
::
template
Codim
<
0
>
::
Entity
Entity
;
// some other sizes
enum
{
gridDim
=
GridView
::
dimension
};
enum
{
dim
=
GridView
::
dimension
};
public
:
/** \brief Constructor with a set of material parameters
* \param parameters The material parameters
*/
NeoHookeEnergy
(
const
Dune
::
ParameterTree
&
parameters
)
{
// Lame constants
mu_
=
parameters
.
get
<
double
>
(
"mu"
);
lambda_
=
parameters
.
get
<
double
>
(
"lambda"
);
kappa_
=
(
2.0
*
mu_
+
3.0
*
lambda_
)
/
3.0
;
}
/** \brief Assemble the energy for a single element */
field_type
energy
(
const
Entity
&
e
,
const
LocalFiniteElement
&
localFiniteElement
,
const
std
::
vector
<
Dune
::
FieldVector
<
field_type
,
gridDim
>
>&
localConfiguration
)
const
;
/** \brief Lame constants */
field_type
mu_
,
lambda_
,
kappa_
;
};
template
<
class
GridView
,
class
LocalFiniteElement
,
class
field_type
>
field_type
NeoHookeEnergy
<
GridView
,
LocalFiniteElement
,
field_type
>::
energy
(
const
Entity
&
element
,
const
LocalFiniteElement
&
localFiniteElement
,
const
std
::
vector
<
Dune
::
FieldVector
<
field_type
,
gridDim
>
>&
localConfiguration
)
const
{
assert
(
element
.
type
()
==
localFiniteElement
.
type
());
typedef
typename
GridView
::
template
Codim
<
0
>
::
Entity
::
Geometry
Geometry
;
field_type
distortionEnergy
=
0
,
dilatationEnergy
=
0
;
// store gradients of shape functions and base functions
std
::
vector
<
Dune
::
FieldMatrix
<
DT
,
1
,
gridDim
>
>
referenceGradients
(
localFiniteElement
.
size
());
std
::
vector
<
Dune
::
FieldVector
<
DT
,
gridDim
>
>
gradients
(
localFiniteElement
.
size
());
int
quadOrder
=
(
element
.
type
().
isSimplex
())
?
localFiniteElement
.
localBasis
().
order
()
:
localFiniteElement
.
localBasis
().
order
()
*
gridDim
;
const
Dune
::
QuadratureRule
<
DT
,
gridDim
>&
quad
=
Dune
::
QuadratureRules
<
DT
,
gridDim
>::
rule
(
element
.
type
(),
quadOrder
);
for
(
size_t
pt
=
0
;
pt
<
quad
.
size
();
pt
++
)
{
// Local position of the quadrature point
const
Dune
::
FieldVector
<
DT
,
gridDim
>&
quadPos
=
quad
[
pt
].
position
();
const
DT
integrationElement
=
element
.
geometry
().
integrationElement
(
quadPos
);
const
typename
Geometry
::
JacobianInverseTransposed
&
jacobianInverseTransposed
=
element
.
geometry
().
jacobianInverseTransposed
(
quadPos
);
DT
weight
=
quad
[
pt
].
weight
()
*
integrationElement
;
// get gradients of shape functions
localFiniteElement
.
localBasis
().
evaluateJacobian
(
quadPos
,
referenceGradients
);
// compute gradients of base functions
for
(
size_t
i
=
0
;
i
<
gradients
.
size
();
++
i
)
jacobianInverseTransposed
.
mv
(
referenceGradients
[
i
][
0
],
gradients
[
i
]);
Dune
::
FieldMatrix
<
field_type
,
gridDim
,
gridDim
>
derivative
(
0
);
for
(
size_t
i
=
0
;
i
<
gradients
.
size
();
i
++
)
for
(
int
j
=
0
;
j
<
gridDim
;
j
++
)
derivative
[
j
].
axpy
(
localConfiguration
[
i
][
j
],
gradients
[
i
]);
/////////////////////////////////////////////////////////
// compute C = F^T F
/////////////////////////////////////////////////////////
Dune
::
FieldMatrix
<
field_type
,
gridDim
,
gridDim
>
C
(
0
);
for
(
int
i
=
0
;
i
<
gridDim
;
i
++
)
for
(
int
j
=
0
;
j
<
gridDim
;
j
++
)
for
(
int
k
=
0
;
k
<
gridDim
;
k
++
)
C
[
i
][
j
]
+=
derivative
[
k
][
i
]
*
derivative
[
k
][
j
];
//////////////////////////////////////////////////////////
// Eigenvalues of FTF
//////////////////////////////////////////////////////////
// eigenvalues of C, i.e., squared singular values \sigma_i of F
Dune
::
FieldVector
<
field_type
,
dim
>
sigmaSquared
;
FMatrixHelp
::
eigenValues
(
C
,
sigmaSquared
);
// singular values of F, i.e., eigenvalues of U
std
::
array
<
field_type
,
dim
>
sigma
;
for
(
int
i
=
0
;
i
<
dim
;
i
++
)
sigma
[
i
]
=
std
::
sqrt
(
sigmaSquared
[
i
]);
field_type
detC
=
1.0
;
for
(
int
i
=
0
;
i
<
dim
;
i
++
)
detC
*=
sigmaSquared
[
i
];
field_type
detF
=
std
::
sqrt
(
detC
);
// \tilde{C} = \tilde{F}^T\tilde{F} = \frac{1}{\det{F}^{2/3}}C
field_type
trCTilde
=
0
;
for
(
int
i
=
0
;
i
<
dim
;
i
++
)
trCTilde
+=
sigmaSquared
[
i
];
trCTilde
/=
pow
(
detC
,
1.0
/
3.0
);
// Add the local energy density
distortionEnergy
+=
weight
*
(
0.5
*
mu_
)
*
(
trCTilde
-
3
);
dilatationEnergy
+=
weight
*
(
0.5
*
kappa_
)
*
((
detF
-
1
)
*
(
detF
-
1
));
}
return
distortionEnergy
+
dilatationEnergy
;
}
}
// namespace Dune
#endif //#ifndef DUNE_GFE_NEOHOOKEENERGY_HH
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment