Dear James,

When you speak about  this linear ooperator, do you imply element level or
the global mesh level?
Basically, there are several ways to do this.
If you want to calculate strain in integration points (element by element)
please see calculation in
getfem_nonlinear_elasticty.h  elasticity_nonlinear_term::compute.

Below there is simple function, that extracts individual linear strain
components into a global vector that can be postprocessed.

The code:

//
gefem::mesh m; //
getfem::mesh_fem mf_u(m); // the mesh_fem used to describe the
approximation of the displacements
set_classical_finite_element(approximation_order_U);
...

// compute displacement U from elastic problem

....
getfem::mesh_fem mf_strain(m);
mf_strain.set_classical_discontinuous_finite_element(approximation_order_U -1);
//approximation of strain has to be discontinous and one order lower
plain_vector STRAIN_VECTOR(mf_strain.nb_dof()*6); /assuming 3D with 6
components of strain in Voight notation
compute_strain(mf_u,mf_strain,U,STRAIN_VECTOR);

// now STRAIN_VECTOR can be exported to VTK component by component on
mf_strain if you want to


.......
//function compute_strain
void compute_strain(const getfem::mesh_fem& mf_u, const getfem::mesh_fem&
mf_strain, const plain_vector& U,
plain_vector& strain)
{
unsigned N = mf_u.linked_mesh().dim();
GMM_ASSERT1(N==3,"This function is written as a demo only for 3D");
GMM_ASSERT1(gmm::vect_size(strain) == 6*mf_strain.nb_dof(),
"compute_strain: wrong size");

plain_vector GRAD(mf_strain.nb_dof() * N * N);

    //compute gradient of displacement on the whole mesh
getfem::compute_gradient(mf_u, mf_strain, U, GRAD);

base_matrix E(N, N), gradU(N, N);
for (size_type i = 0; i < mf_strain.nb_dof(); i+=6)
{
//extract the gradient in the node
std::copy(GRAD.begin() + i * N*N, GRAD.begin()+(i + 1) * N*N,
gradU.begin());

// compute strain from the gradient
gmm::add(gradU,gmm::transposed(gradU),E);
gmm::scale(E, scalar_type(0.5));

        //using Voight notation to convert the strain tensor into a vector
// in 3D
strain[6*i  ]=E(0,0);
strain[6*i+1]=E(1,1);
strain[6*i+2]=E(2,2);
strain[6*i+3]=E(0,1);
strain[6*i+4]=E(1,2);
strain[6*i+5]=E(0,2);
}
}






On 10 May 2012 21:26, James Zhou <[email protected]> wrote:

> Dear GetFEM++ users,
>
> In the context of solving a linear elasticity problem, is there a way to
> extract the linear operator that converts displacement into strain tensor?
> For example, if there are n nodes, we would have a displacement vector of
> size 3*n, if the strain tensors are reshaped into a 6*n vector (assuming
> isotropic material), I would like to build the 6*n x 3*n matrix that
> convert displacement into strain.
>
> I have tried a finite difference approach where strain is written as the
> symmetric gradient of displacement, and the gradient of displacement is
> approximated by finite difference.  However, this does not yield the same
> result as the stress tensor computed in src/getfem/getfem_derivatives.h
>
> Thanks!
>
> James
>
> _______________________________________________
> Getfem-users mailing list
> [email protected]
> https://mail.gna.org/listinfo/getfem-users
>
>
_______________________________________________
Getfem-users mailing list
[email protected]
https://mail.gna.org/listinfo/getfem-users

Reply via email to