quick way of defining a constant strain(tensor_mechanics) in a block

211 views
Skip to first unread message

john.m...@uconn.edu

unread,
Jul 13, 2015, 10:42:54 PM7/13/15
to moose...@googlegroups.com
I'm sure you can do this quite easily but I haven't been able to find this in the tests or examples.

For example I'd like to set strain_xx = strain_yy = 0.02 or -0.02 in a material block or on a boundary. How?

Thanks!

John

Andrew....@csiro.au

unread,
Jul 13, 2015, 10:56:01 PM7/13/15
to moose...@googlegroups.com

Hi John,

 

I reckon this might be quite tricky, depending on exactly what you want to do.  The simplest situation is that you just want to set strain_xx=0.02 in a rectilinear region and you can achieve that by setting appropriate BCs (disp_x = something on the xmin boundary, and disp_x = something else on the xmax boundary).

 

However, with complicated domains and boundaries, and anisotropic and inhomogeneous Material properties, and different forcing functions, etc, i think you might have to use some sort of Constraints.   You essentially want to demand that

 

disp_x = x*s + g(y, z)

 

This is setting strain_xx = s, similar equations for other constraints.  I don’t think TensorMechanics is really set up to do this.  Writing this, I’m hoping I’m missing something obvious, and it all turns out to be easy.

 

a

 

 

Ph: +61 7 3327 4497.  Fax: +61 7 3327 4666
Queensland Centre for Advanced Technologies
PO Box 883, Kenmore, Qld, 4069 
 

--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users...@googlegroups.com.
Visit this group at http://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/8ec4f37c-3be7-40bc-96a9-ee60dbfc8e83%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Tonks, Michael R

unread,
Jul 13, 2015, 11:40:01 PM7/13/15
to moose...@googlegroups.com
In tensor mechanics, we solve a boundary value problem to identify the displacement vector throughout the domain. This means we can set up various boundary conditions, mainly dictating the displacements or the stress (tractions). But, like Andy said, you can't easily define just a strain on a boundary.

If you want to constrain your system to have a uniform strain throughout your body, things are easier. You don't need to solve for the displacements because your are essentially dictating them. The stress is just a dependent tensor that you obtain by applying your constitutive law to the uniform strain. To accomplish this in tensor mechanics would be fairly straight forward with the plug and play mechanics approach http://mooseframework.org/wiki/PhysicsModules/TensorMechanics/PlugAndPlayMechanicsApproach/
You would need to write a material class that defined a constant strain (maybe ComputeConstantStrain). Then you would use a version of ComputeElasticityTensor and ComputeStress to define your stress.


For more options, visit https://groups.google.com/d/optout.



--

*************************

Michael R. Tonks

Fuel Modeling and Simulation Department

Idaho National Laboratory

208-526-6319

michae...@inl.gov

john.m...@uconn.edu

unread,
Jul 14, 2015, 12:33:43 AM7/14/15
to moose...@googlegroups.com
Ah, so I would just do something like

ComputeConstant::computeQpStress()
{
  _elastic_strain
[_qp] = _total_strain[_qp] + _const_strain;
}

?

Sounds simple enough. I'll try this approach. The boundary idea is far ahead of what I need right now but I suppose I'm still curious:

Is computeQpStress not called on the boundary quadrature points and that is why it can't be easily boundary restrictable? I'm a bit confused as to what the difference is between computeSomething and computeQpSomething anyway. Anyone have a quick explanation on those?

Thanks.

John

Tonks, Michael R

unread,
Jul 14, 2015, 11:11:30 AM7/14/15
to moose...@googlegroups.com
John,

The difficulty with proscribing a strain boundary condition has nothing to do with MOOSE but rather with the nature of the boundary value problem.

The residual equation in strong form is div(stress) = 0. In weak form, it becomes (stress, grad(phi)) - <traction, phi> = 0.

The weak form is a vector equation, so it is sufficient to solve for a vector but not a rank two tensor like the strain. So, we solve for the displacement vector with a constitutive model relating the stress to the strain and a strain definition relating the strain to the displacement.

Since we are solving for the displacement, we can use Dirichlet boundary conditions to proscribe values for displacements or natural boundary conditions to proscribe tractions (as shown in the weak form), but there is not easy way to proscribe a strain.

As for my thoughts on a material object that computes a constant strain, you would use a simple line like this:

_total_strain[_qp] = _const_strain;

Mike


For more options, visit https://groups.google.com/d/optout.

Dmitry Karpeyev

unread,
Jul 14, 2015, 2:19:17 PM7/14/15
to moose...@googlegroups.com
If you are prescribing uniform strain, then, as Mike points out, you cannot be solving a PDE for displacements.
In fact, I'm not sure you could back out displacements from this and you definitely cannot prescribe BCs on the displacements
at the same time, since they will conflict with the condition of uniform strain.




John Mangeri

unread,
Jul 14, 2015, 2:31:53 PM7/14/15
to moose...@googlegroups.com
Right,

yeah having exactly constant strain isn't really what I want. I want to apply a constant strain + whatever strain arises from the boundary conditions which I why I thought

_elastic_strain[_qp] = _total_strain[_qp] + _const_strain;
 
in computeQpStress might work but I don't really know if this would feed back into the displacements?

--
You received this message because you are subscribed to a topic in the Google Groups "moose-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/moose-users/bMzLT8DMq2c/unsubscribe.
To unsubscribe from this group and all its topics, send an email to moose-users...@googlegroups.com.

Dmitry Karpeyev

unread,
Jul 14, 2015, 2:38:43 PM7/14/15
to moose...@googlegroups.com
To do this you would have to cook up the rhs for the equations of elasticity that achieve this effect. 
Note that adding a constant to stresses won't do the trick since the constant will be annihilated by the divergence.
Where are your stresses used?  If you use them as a coupled variable in another, non-elastic kernel, then, I guess, it will work. 
But to feed it back to the displacements you would have to do something else.


Andrew....@csiro.au

unread,
Jul 14, 2015, 6:29:19 PM7/14/15
to moose...@googlegroups.com

Hi John,

 

Maybe you could describe your actual model, because i’m having trouble understanding why you’re doing this “const strain” thing.

 

In geomechanics we always have a similar situation.  We know there are pre-existing geomechanical strains, caused by tectonic movement.  We then desire to perturb the system (by digging holes, or whatever else we’re trying to model), and solve for the resulting displacements.  The latter can depend quite strongly on the insitu strains.  How we model this is to work out the insitu *stresses* that result from those strains (and indeed, these stresses are what are measured in field measurements).  Some Materials in TensorMechanics have an “initial_stress” input, and that’s used to set these initial stresses.

 

a

 

 

Ph: +61 7 3327 4497.  Fax: +61 7 3327 4666
Queensland Centre for Advanced Technologies
PO Box 883, Kenmore, Qld, 4069 
 

John Mangeri

unread,
Jul 14, 2015, 6:39:29 PM7/14/15
to moose...@googlegroups.com
Yeah, so in ferroelectric thin films, they are generally grown epitaxially which is done by a lattice mismatch. This causes the material to have a (1-3)% biaxial strain that couples to the polar order parameter. Ideally we would like to have this in our code but also be able to have the system respond to boundary conditions on the displacement like clamping or a body force.

John

John Mangeri

unread,
Jul 14, 2015, 6:40:03 PM7/14/15
to moose...@googlegroups.com
Perhaps the initial stress is what we want.

Tonks, Michael R

unread,
Jul 14, 2015, 6:58:41 PM7/14/15
to moose...@googlegroups.com
It sounds to me like you want to use a stress free strain (or Eigen strain). It is a way of introducing an internal strain that can be coupled to other variables.




For more options, visit https://groups.google.com/d/optout.

john.m...@uconn.edu

unread,
Jul 20, 2015, 6:06:35 PM7/20/15
to moose...@googlegroups.com
Yes that is what we want. Sorry, not really sure I'm comfortable with the lingo here. We are trying to follow along with a group's work in a paper and they are implementing a stress-free strain.

I'm looking at ComputeEigenstrain here which wants an eigenvector of the strains so

  [./eigen_strain]
    type = ComputeEigenstrain
    block = 0
    eigen_base = '1 0 0 1 0 0'
  [../]

would be along e_xx = e_yy = 1? for eigen_base = 'exx exy exz eyy eyz ezz'

How exactly would I make sure this strain is in percent form?  Surely it couldn't be eigen_base = '0.02 0.02 0 0 0 0'?  (not really an eigenvector...)

Tonks, Michael R

unread,
Jul 20, 2015, 6:26:59 PM7/20/15
to moose...@googlegroups.com
First, let me say that Eigenstrains aren't related to Eigenvalues and Eigenvectors. See: https://en.wikipedia.org/wiki/Eigenstrain

ComputeEigenStrain creates a stress free strain that is a product of a scalar material property or constant (passed in using the "prefactor" parameter) and a tensor set by "eigen_base". The actual tensor value is prefactor*eigen_base.

If you pass in a length 9 vector, you specify every component of the rank 2 tensor. If you pass in a length 6 vector, you assume symmetry and pass in the unique components (11, 22, 33, 23, 13, 12). If you pass in a length 3 vector, you assume a diagonal tensor (11, 22, 33). If you pass in a length vector, you assume a diagonal tensor with the diagonal terms being equal (11).

If you want to have your Eigenstrain be a function of a variable, you should use ComputeVariableEigenstrain and use a DerivativeParsedMaterial to set the dependence on the variable.

Mike


For more options, visit https://groups.google.com/d/optout.

john.m...@uconn.edu

unread,
Jul 21, 2015, 4:33:26 PM7/21/15
to moose-users
Ok. ComputeEigenstrain is definitely what we want but when I pick

prefactor = 0.02

eigen_base = '1 0 0 1 0 0'
block = '2'

with no boundary conditions on the displacement.

I get something where the mesh block is displaced thousands of units away(always in the -[111] direction from where it was initially) which does not mimic a 2% strain in the xx and yy directions(see picture). My elastic constants are in [nm].

I'm sure I'm missing something here.

Thanks
Screenshot from 2015-07-21 15:31:17.png

Tonks, Michael R

unread,
Jul 21, 2015, 5:02:37 PM7/21/15
to moose...@googlegroups.com
You always need to have a BC to restrict rigid body motion. Try to anchor one surface with zero displacement preset BCs or something like that.


For more options, visit https://groups.google.com/d/optout.

patrick....@gmail.com

unread,
Aug 16, 2016, 8:08:24 AM8/16/16
to moose-users, michae...@inl.gov
Hey Mike,

I was reading through your description of Eigenstrain and it was very helpful. I just want to make sure I have a few things straight:

-Does Eigenstrain by itself contribute to the energy of the system?

-If not, would anything other than a stiffness tensor (and boundary conditions and a derivative parsed material for the prefactor) be required to generate a local free energy contribution?

-In some papers, it looks like the Eigenstrain doesn't actually displace the mesh points, it just adds to the local bulk free energy (like the equations below). Is there any difference between MOOSE's energy formulations and these? Because I'd be happy to use either MOOSE's approach or the approach from the litereature but I don't fully understand either of them yet.


From the looks of it, I could add (something like) the last term in this equation (the derivative of elastic energy with respect to order parameter) into my materials block in a similar way to a free energy curve with respect to composition.












And that final term from the equation above might be calculated like this (although I'm still working out what all these terms mean):




























Many thanks,
Patrick
Reply all
Reply to author
Forward
0 new messages