Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix possible problem with finite strain #1249

Merged
merged 1 commit into from Jan 23, 2017

Conversation

gassmoeller
Copy link
Member

After reading somewhat more into the topic, I suspect the finite strain computation we currently use is intuitive, but might be wrong. I base this on the study of the papers: Becker et. al 2003, GJI ("Comparison of azimuthal seismic anisotropy from surface waves and finite strain from global mantle-circulation models") and McKenzie & Jackson, 1983, EPSL ("The relationship between strain rates, crustal thickening, paleomagnetism, finite strain and fault movements within a deforming zone"). If somebody has suggestions for other helpful studies about finite strain, I would be happy to get suggestions (@naliboff, you probably know more about this than I do). Further down L means the vector gradient of the velocity (a full tensor) and I follow the notation of the McKenzie paper.
What we did so far was:

  1. Rotate the existing strain with the rotational part of the velocity gradient W (i.e. I + 0.5 (L - L^T), or the rotation an infinitely small hard particle would experience in this flow field).
  2. Add the deformational part of the current velocity gradient (i.e. the symmetric part, 0.5(L+L^T)).

The Tensor was initialized with zeroes, which was wrong in itself (it should be initialized with a identity tensor).
However, I think the whole approach above is different from the mentioned papers. They track the deformation tensor F by solving the differential equation d/dt (F) = L * F, i.e. they track a full (non-symmetric) tensor, and then afterwards split the full tensor into a symmetric (V) and antisymmetric (R) part as F = V*R. V then represents the finite deformation we are interested in. McKenzie mentions in the appendix explicitly that one has to be careful not mixing the non-deformed rotation W with the deformed rotation R, because they are essentially only the same, when nothing deforms (sounds simple, if you write it like this 😄). I have tested both approaches, and can only recover the analytical solutions of the McKenzie paper with their approach. However, if someone has suggestions for good test cases or other analytical solutions, I would be happy to take a look, to feel more confident about what I wrote above.

About the code below: It is a bit harder to read, because I now use an RK4 scheme to solve the ODE, but essentially it just says the new strain is the old strain multiplied by the current velocity_gradient tensor times the time step length.

@bangerth
Copy link
Contributor

The two new tests seem to run in 3d but the stored output files were generated in 2d, or the other way around. Can you update them?

@bangerth
Copy link
Contributor

In your description above, you state the ODE d/dt (F) = L * F but this is only an evolution -- where does the accumulation of new strain come in? Should there be an additional term on the right? Or is this part of L?

@@ -31,8 +31,9 @@ namespace aspect
IntegratedStrain<dim>::initialize_one_particle_property(const Point<dim> &,
std::vector<double> &data) const
{
for (unsigned int i = 0; i < SymmetricTensor<2,dim>::n_independent_components ; ++i)
data.push_back(0.0);
const Tensor<2,dim> identity = Tensor<2,dim>(unit_symmetric_tensor<dim>());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need the extra cast on the rhs, or do you? In either case, you can probably make the variable static.

// (= time step * (velocity gradient tensor - symmetric_part))
// + unit tensor
const Tensor<2,dim> rotation (dt * (grad_u - deformation_rate) + unit_symmetric_tensor<dim>());
const Tensor<2,dim> k1 = grad_u * old_strain * dt;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you add a comment before this block that (i) states the ODE you are integrating, and (ii) just says that you are using an RK4 integrator?

@naliboff
Copy link
Contributor

@gassmoeller - Thanks for catching this! At this point you know as much or more than I do. I am going through other codes to exactly how others have done it and so far (one code) it appears slightly different than the new approach you've outlined. It would not surprise me if different groups are not calculating exactly the same quantity. I'll come back to this first thing next week after I have a chance to write things out.

@gassmoeller gassmoeller changed the title Fix possible problem with finite strain [WIP] Fix possible problem with finite strain Oct 31, 2016
@bangerth
Copy link
Contributor

Any news?

@naliboff
Copy link
Contributor

@bangerth - yes and thanks for the reminder. I'll post comments this weekend.

@naliboff
Copy link
Contributor

naliboff commented Dec 5, 2016

@gassmoeller - sorry of the long delay in replying. I took a look at a different code I use and their approach involves calculating the new strain by adding the (current_strain_rate_tensor * current_time_ step) to the old strain. With this approach they can match an analytical solution for rotation of a circle undergoing pure or simple shear. So, very similar to the new approach but it is not clear to me why they do not need to solve the ODE? Perhaps I'm just overlooking something very basic here. In your method above, I'm also not clear as to where you are separating V (finite strain) from the full deformation tensor F.

@gassmoeller
Copy link
Member Author

Do not worry, I will take a look later this week. Concerning the analytical solution: Does the code reproduce each tensor component or just the second invariant?
I also think we should introduce at some point a particle property (or field model) that only tracks the second invariant of the strain. This will reduce computational cost for your material model (which only uses the second invariant anyway), and we circumvent for now the problem of the full tensor definition.

@bangerth
Copy link
Contributor

bangerth commented Dec 6, 2016

I don't think you can do that, can you? I mean, think about a flow that shears a volume, but then you reverse the flow and it undoes all of the shearing. At the end, the accumulated strain is zero, as is its second invariant. Can you express this kind of thing as an evolution equation on only the second invariant?

@naliboff
Copy link
Contributor

naliboff commented Dec 6, 2016

@gassmoeller - I almost positive that the test is for the strain axes and not just the invariant. As @bangerth mentioned, I'm not sure if one could test rotation with just the invariant.

I just went through a second code and their method of calculating finite strain is slightly different as well. In this case, the authors simply calculate the invariant directly (second_strain_rate_invariant * time_step) rather than calculate the individual strain tensor components and then calculate the invariant. All of this is somewhat disconcerting given that the accumulated strain can play a large role in deformation patterns through strain softening.

I've forwarded this discussion to Cedric Thieulot ( @cedrict ) and Susanne Buiter, who each have written their own codes. Susanne Buiter and Susan Ellis' code (SULEC) is the first code I have been referring to. More to follow.

@gassmoeller
Copy link
Member Author

I have confirmed that the new way of calculating finite strain gives correct analytical results for pure shear. Will check tomorrow for simple shear and our old formulation, and if necessary update the cookbook.

@gassmoeller
Copy link
Member Author

I can confirm that the new formulation matches analytical expressions for finite strain in simple and pure shear as described in McKenzie & Jackson 1983, and I have added the according benchmark (including analytical expressions) to this PR. On Monday I will modify and add the compositional field calculation method and the cookbook.
@naliboff in your comment from Dec 4 you mentioned that one of the other codes also passed this (or a slightly different) benchmark? Could you give me a reference to that? All I can see for now is that the two approaches are only identical for very small accumulated strains, because then F is approximately the identity tensor (i.e. in the first timestep both approaches reproduce the analytical result, but subsequently the old version goes off). Maybe that happened to the other code?

@gassmoeller gassmoeller force-pushed the fix_finite_strain branch 3 times, most recently from 6928a2c to 63c4fe5 Compare January 18, 2017 19:02
@gassmoeller gassmoeller changed the title [WIP] Fix possible problem with finite strain Fix possible problem with finite strain Jan 18, 2017
@gassmoeller
Copy link
Member Author

I think this PR is ready for a review. The new finite strain implementation passes the benchmarks, the particle and compositional field implementations produce identical results, and I updated the cookbook with a more detailed description about the math, and a new figure.

Copy link
Contributor

@bangerth bangerth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few comments. More when I get home.

#
# where u is the velocity, t is time, and a comma represents a derivative
# in that particular direction. u_x,x in this example is equivalent to
# -u_y,y so that also: F_11 = e^(u_y,y * t) which is intuitive.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-> F_xx

# -u_y,y so that also: F_11 = e^(u_y,y * t) which is intuitive.
# For this benchmark it is important to recognize that the deformation in
# this model is actually only "pure" pure shear at the origin, since the
# the deformation field around is a mixture of pure shear and a rotational
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the the -> the

@@ -0,0 +1,5 @@
# This is testdata for the Ascii file tracer generator
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-> test data

# The last line is outside of the test domain and tests
# that plugins simply ignore points outside of the domain
# Columns: x_coordinate y_coordinate
0.0 0.0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment is puzzling since there is only one line, so to talk about the "last line" requires deeper thought than I can offer right now :-)

# F_xx = 1.0
# F_xy = u_x,y * t
# F_yx = 0
# F_yy = 1.0,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it correct that the finite strain becomes non-symmetric?

# The last line is outside of the test domain and tests
# that plugins simply ignore points outside of the domain
# Columns: x_coordinate y_coordinate
0.5 0.5
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@@ -1,70 +1,61 @@
# Listing of Parameters
# ---------------------
# Model for melting at a mid-ocean ridge
# Model for global mantle convection with tracking of the finite strain tensor.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for cleaning this file up a bit!

Copy link
Contributor

@jdannberg jdannberg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I only read the manual changes. Very nice!

The first one, $R e^{n-1} R^T$, rotates $e^{n-1}$, the accumulated strain from all the previous time steps;
and the second part adds the strain of the current time step.
Let us denote the accumulated strain at time step $n$ as $\mathbf E^n$. We can calculate its time derivative
as the tensor product of the current velocity gradient $\mathbf G = \frac{\partial u_i}{\partial x_j}$ and the accumulated strain $\mathbf E^{n-1}$ at the previous time step.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be $\mathbf G_{ij}$?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"and the strain $\mathbf E^{n-1}$ accumulated up to the previous time step"?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the term "tensor product" typically means something different; I think you want to say something like "the product of two tensors, namely the current velocity gradient ... and the ...."

Let us denote the accumulated strain at time step $n$ as $\mathbf E^n$. We can calculate its time derivative
as the tensor product of the current velocity gradient $\mathbf G = \frac{\partial u_i}{\partial x_j}$ and the accumulated strain $\mathbf E^{n-1}$ at the previous time step.
While we refer to other studies \cite{McKenzie1983, dahlen1998theoretical, Becker2003} for a derivation of
this relationship, we can give an intuitive example for the necessity to apply the velocity gradient to the already accumulated strain, instead of simply integrating the velocity gradient over time. Consider a simple one-dimensional ``grain'', where the strain tensor only has one component, the compression in x-direction. If one applies a convergent velocity gradient of 0.5 to it (e.g. a velocity of zero at its left end at $x=0.0$, and a velocity of $-0.5$ at $x=1.0$), integrating the velocity gradient would suggest that the grain reaches a length of zero after two units of time, and would then ``flip'' its orientation, which is clearly non-physical. Instead what happens is its length is cut in half in one unit of time, and continues two be halved per unit of time, which is identical to $\mathbf E^n = 0.5 \cdot \mathbf E^{n-1}$, or $\mathbf E^n = \mathbf G \cdot \mathbf E^{n-1}$.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$\mathbf E^n = 0.5 \mathbf E^{n-1}$ (without the \cdot)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

x-direction -> $x$-direction

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

continues two -> continues to

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I stumbled about the fact that this velocity field is not incompressible and tried to come up with a complicated scheme of this being the axis of a 2d flow. But it doesn't have to be incompressible. Maybe just say something like "If one embed this grain into a convergent flow field for a compressible medium where the velocity gradient is..."

@@ -5983,19 +5979,25 @@ \subsubsection{Tracking finite strain}

\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{cookbooks/finite_strain/finite_strain.pdf}
\includegraphics[width=0.75\textwidth]{cookbooks/finite_strain/finite_strain.pdf}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very cool!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, really nicely done picture. How did you do this?

It would have been feasible to run the same model with tracer particles that track the finite strain, as
additionally implemented and tested in the simple shear and pure shear benchmarks mentioned in this section.
Both approaches have specific advantages, and for scientific computations one needs to evaluate the more suitable
strategy. Compositional fields cover the whole domain, but contain numerical diffusion, effectively reducing the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"are affected by numerical diffusion"?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-> other purposes than

additionally implemented and tested in the simple shear and pure shear benchmarks mentioned in this section.
Both approaches have specific advantages, and for scientific computations one needs to evaluate the more suitable
strategy. Compositional fields cover the whole domain, but contain numerical diffusion, effectively reducing the
maximum accumulated strain. Tracers only present finite strain values at discrete position, but can be used in
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provide or represent instead of "present"?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

positions

Both approaches have specific advantages, and for scientific computations one needs to evaluate the more suitable
strategy. Compositional fields cover the whole domain, but contain numerical diffusion, effectively reducing the
maximum accumulated strain. Tracers only present finite strain values at discrete position, but can be used in
restricted domains (and are much faster in this case). If however
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you mean by that? Something like: "but can, if this is desired, used in only a part of the domain"?

Copy link
Contributor

@bangerth bangerth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fantastic, thanks for writing up the detailed derivation in the manual!

$e_{ij} = \frac{1}{2}\left(\frac{\partial d_i}{\partial x_j} + \frac{\partial d_j}{\partial x_i}\right)$
with the displacement $\mathbf d$ the difference between a point's
position at time $t$ and at time zero.}
\note{In this section, following \cite{Becker2003, dahlen1998theoretical} we denote the velocity gradient tensor as $\mathbf G$, where $\mathbf G = \nabla \mathbf u^T$,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

put a comma after the reference

The first one, $R e^{n-1} R^T$, rotates $e^{n-1}$, the accumulated strain from all the previous time steps;
and the second part adds the strain of the current time step.
Let us denote the accumulated strain at time step $n$ as $\mathbf E^n$. We can calculate its time derivative
as the tensor product of the current velocity gradient $\mathbf G = \frac{\partial u_i}{\partial x_j}$ and the accumulated strain $\mathbf E^{n-1}$ at the previous time step.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the term "tensor product" typically means something different; I think you want to say something like "the product of two tensors, namely the current velocity gradient ... and the ...."

Let us denote the accumulated strain at time step $n$ as $\mathbf E^n$. We can calculate its time derivative
as the tensor product of the current velocity gradient $\mathbf G = \frac{\partial u_i}{\partial x_j}$ and the accumulated strain $\mathbf E^{n-1}$ at the previous time step.
While we refer to other studies \cite{McKenzie1983, dahlen1998theoretical, Becker2003} for a derivation of
this relationship, we can give an intuitive example for the necessity to apply the velocity gradient to the already accumulated strain, instead of simply integrating the velocity gradient over time. Consider a simple one-dimensional ``grain'', where the strain tensor only has one component, the compression in x-direction. If one applies a convergent velocity gradient of 0.5 to it (e.g. a velocity of zero at its left end at $x=0.0$, and a velocity of $-0.5$ at $x=1.0$), integrating the velocity gradient would suggest that the grain reaches a length of zero after two units of time, and would then ``flip'' its orientation, which is clearly non-physical. Instead what happens is its length is cut in half in one unit of time, and continues two be halved per unit of time, which is identical to $\mathbf E^n = 0.5 \cdot \mathbf E^{n-1}$, or $\mathbf E^n = \mathbf G \cdot \mathbf E^{n-1}$.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

x-direction -> $x$-direction

Let us denote the accumulated strain at time step $n$ as $\mathbf E^n$. We can calculate its time derivative
as the tensor product of the current velocity gradient $\mathbf G = \frac{\partial u_i}{\partial x_j}$ and the accumulated strain $\mathbf E^{n-1}$ at the previous time step.
While we refer to other studies \cite{McKenzie1983, dahlen1998theoretical, Becker2003} for a derivation of
this relationship, we can give an intuitive example for the necessity to apply the velocity gradient to the already accumulated strain, instead of simply integrating the velocity gradient over time. Consider a simple one-dimensional ``grain'', where the strain tensor only has one component, the compression in x-direction. If one applies a convergent velocity gradient of 0.5 to it (e.g. a velocity of zero at its left end at $x=0.0$, and a velocity of $-0.5$ at $x=1.0$), integrating the velocity gradient would suggest that the grain reaches a length of zero after two units of time, and would then ``flip'' its orientation, which is clearly non-physical. Instead what happens is its length is cut in half in one unit of time, and continues two be halved per unit of time, which is identical to $\mathbf E^n = 0.5 \cdot \mathbf E^{n-1}$, or $\mathbf E^n = \mathbf G \cdot \mathbf E^{n-1}$.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

continues two -> continues to

Let us denote the accumulated strain at time step $n$ as $\mathbf E^n$. We can calculate its time derivative
as the tensor product of the current velocity gradient $\mathbf G = \frac{\partial u_i}{\partial x_j}$ and the accumulated strain $\mathbf E^{n-1}$ at the previous time step.
While we refer to other studies \cite{McKenzie1983, dahlen1998theoretical, Becker2003} for a derivation of
this relationship, we can give an intuitive example for the necessity to apply the velocity gradient to the already accumulated strain, instead of simply integrating the velocity gradient over time. Consider a simple one-dimensional ``grain'', where the strain tensor only has one component, the compression in x-direction. If one applies a convergent velocity gradient of 0.5 to it (e.g. a velocity of zero at its left end at $x=0.0$, and a velocity of $-0.5$ at $x=1.0$), integrating the velocity gradient would suggest that the grain reaches a length of zero after two units of time, and would then ``flip'' its orientation, which is clearly non-physical. Instead what happens is its length is cut in half in one unit of time, and continues two be halved per unit of time, which is identical to $\mathbf E^n = 0.5 \cdot \mathbf E^{n-1}$, or $\mathbf E^n = \mathbf G \cdot \mathbf E^{n-1}$.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I stumbled about the fact that this velocity field is not incompressible and tried to come up with a complicated scheme of this being the axis of a 2d flow. But it doesn't have to be incompressible. Maybe just say something like "If one embed this grain into a convergent flow field for a compressible medium where the velocity gradient is..."

@@ -5983,19 +5979,25 @@ \subsubsection{Tracking finite strain}

\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{cookbooks/finite_strain/finite_strain.pdf}
\includegraphics[width=0.75\textwidth]{cookbooks/finite_strain/finite_strain.pdf}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, really nicely done picture. How did you do this?

\ref{sec:finite-strain}.}
\ref{sec:finite-strain} at a time of 67.6~Ma. Top panel: Temperature distribution. Bottom panel:
Natural strain distribution. Additional black crosses are the scaled eigenvectors of the
stretching tensor $\mathbf L$, showing the direction of stretching and compression.}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the rotation matrix is effectively unimportant to find the major stress axes?

\label{fig:finite_strain}
\end{figure}

The plugin was tested against analytical solutions for the finite strain tensor in simple and pure shear as described in \url{../benchmark/finite_strain/pure_shear.prm} and \url{../benchmark/finite_strain/simple_shear.prm}.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIRC, you shouldn't need the ../ at the beginning of the paths, right?

direction (short vertical lines) and stretched in horizontal direction (long horizontal lines).
The sides of the plume head show the opposite effect. Shear occurs mostly at the
edges of the plume head, in the plume tail, and in the bottom boundary layer
(black areas in the natural strain distribution).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So is it ok that unstrained material would have a cross with equal length arms?

It would have been feasible to run the same model with tracer particles that track the finite strain, as
additionally implemented and tested in the simple shear and pure shear benchmarks mentioned in this section.
Both approaches have specific advantages, and for scientific computations one needs to evaluate the more suitable
strategy. Compositional fields cover the whole domain, but contain numerical diffusion, effectively reducing the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-> other purposes than

@gassmoeller
Copy link
Member Author

I have addressed all comments, and reformulated things a bit (also the example calculation in the manual was intuitive, but wrong, I fixed that). I now consistently use F instead of E (to stay consistent with the papers from where I got the derivation). This also makes more clear that F is the (non-symmetric) deformation gradient tensor, while L is the symmetric stretching tensor, one would associate with the finite strain tensor.

To your questions:

  • As mentioned above F is generally non-symmetric, while L is.
  • I made the figure with a lot of visit expressions, forming tensor variables from components, calculating products of tensors, then calculating eigenvalues and eigenvectors, and then visualize everything as two vector properties. Internally each cross consists of two line vectors with the same center instead of one cross. For complicated things like this Visit really convinced me to be the better alternative to Paraview (where I would have needed to write a python script for doing this).
  • The rotation matrix is unimportant in our case, because we assume the initial shape to be a sphere (or the identity matrix), therefore rotating it by whatever degree has no effect. If we would assume a different initial shape this might be different. This might also be influenced by our choice to decompose F into LQ instead of QR, which is equally possible.
  • Yes unstrained material is represented by a cross with equally long arms, which is equivalent to a strain ellipsoid that is still spherical.

It would be nice if someone could read over the new text again, but apart from this this should be ready from my side (I can squash the commits if requested, just leaving them there to make it easier to review).

@bangerth
Copy link
Contributor

I'll read through the text again as requested if you take care of #1254 :-)

@gassmoeller
Copy link
Member Author

deal 😄

@naliboff
Copy link
Contributor

@gassmoeller - sorry, missed your note until now. I never heard back regarding the details of the test the other code did, but I believe they tracked the rotation of the finite strain axes for a case of simple shear or pure shear. They certainly could have not gone to large enough strains to see the difference. Thank you for adding the benchmarks!

Copy link
Contributor

@bangerth bangerth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this looks fantastic! Think about the two comments and then merge yourself.

The first one, $R e^{n-1} R^T$, rotates $e^{n-1}$, the accumulated strain from all the previous time steps;
and the second part adds the strain of the current time step.
Let us denote the accumulated deformation at time step $n$ as $\mathbf F^n$. We can calculate its time derivative
as the product of two tensors, namely the current velocity gradient $\mathbf G_{ij} = \frac{\partial u_i}{\partial x_j}$ and the deformation gradient $\mathbf F^{n-1}$ accumulated up to the previous time step, in other words $\frac{\partial \mathbf F}{\partial t} = \mathbf G \mathbf F$, and $\mathbf F_0 = \mathbf I$, with $\mathbf I$ being the identity tensor.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you will want to call it F^0 since you've had the time step as an upper index above.

Let us denote the accumulated deformation at time step $n$ as $\mathbf F^n$. We can calculate its time derivative
as the product of two tensors, namely the current velocity gradient $\mathbf G_{ij} = \frac{\partial u_i}{\partial x_j}$ and the deformation gradient $\mathbf F^{n-1}$ accumulated up to the previous time step, in other words $\frac{\partial \mathbf F}{\partial t} = \mathbf G \mathbf F$, and $\mathbf F_0 = \mathbf I$, with $\mathbf I$ being the identity tensor.
While we refer to other studies \cite{McKenzie1983, dahlen1998theoretical, Becker2003} for a derivation of
this relationship, we can give an intuitive example for the necessity to apply the velocity gradient to the already accumulated deformation, instead of simply integrating the velocity gradient over time. Consider a simple one-dimensional ``grain'', where the deformation tensor only has one component, the compression in $x$-direction. If one embeds this grain into a convergent flow field for a compressible medium where the dimensionless velocity gradient is $-0.5$ (e.g. a velocity of zero at its left end at $x=0.0$, and a velocity of $-0.5$ at its right end at $x=1.0$), simply integrating the velocity gradient would suggest that the grain reaches a length of zero after two units of time, and would then ``flip'' its orientation, which is clearly non-physical.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you want to imply that the grain has size one? Or is it infinitesimal?

@gassmoeller gassmoeller merged commit 553a9b0 into geodynamics:master Jan 23, 2017
@gassmoeller gassmoeller deleted the fix_finite_strain branch January 23, 2017 17:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants