On Thu, 25 Aug 2011, rochan wrote:

> Before trying the L2 projection I am trying to understand how get the 
> gradient of my solution at a particular point (where it is defined even for a 
> piecewise linear basis function of the original variable). The solution is 
> correctly obtained using the following:
>
> int main (int argc, char** argv)
> {
>       LibMeshInit init (argc, argv);
>
>       Mesh mesh(2);
>
>    GmshIO(mesh).read("gmsh_ex3.1a.msh");
>    mesh.prepare_for_use();
>    mesh.print_info();
>
>       EquationSystems equation_systems(mesh);
>       equation_systems.add_system<LinearImplicitSystem> ("Elasticity");
>       LinearImplicitSystem& system_elasticity = 
> equation_systems.get_system<LinearImplicitSystem>("Elasticity");
>
>       system_elasticity.add_variable("u1", FIRST);
>       system_elasticity.add_variable("u2", FIRST);
>
>       system_elasticity.attach_assemble_function(assemble_elasticity);
>       system_elasticity.init();
>
>       equation_systems.parameters.set<unsigned int>("linear solver maximum 
> iterations") = 1500;
>       equation_systems.parameters.set<Real>("linear solver tolerance") = 
> 1.0e-10;
>       equation_systems.print_info();
>       system_elasticity.solve();
>
>       printf("Solution_complete");
>
> Now I want the global solution in a vector,

// Use:

NumericVector<Number> &distributed_solution_vector =
    *system_elasticity.solution;

// or:

std::vector<Number> serializing_your_solution_is_inefficient;
system_elasticity.update_global_solution(serializing_your_solution_is_inefficient,
 0);
if (libMesh::processor_id == 0)
   Rochan::use_solution();
else
   Rochan::twiddle_thumbs();

> but the following is not working
>
>    std::vector<Number> global_soln;
>    std::vector<std::string> names;
>    equation_systems.get_solution( global_soln, names );
>    printf("%d",global_soln.size());

Wow, that's kind of a misleading API name, isn't it?  Jason was
writing a "get_discontinuous_constant_solution_components_only()",
which if given such a name would have been more clearly identifiable
as a super-specialized API that nobody would want to use directly.  I
wasn't watching the svn diffs closely, so I didn't notice that he'd
called it "get_solution" instead...

> Supppose I can get the solution vector, would the following that
> uses Meshfunction work?
>
>       AutoPtr<NumericVector<Number> > fine_soln = 
> NumericVector<Number>::build();
>       AutoPtr<MeshFunction> gradient_values_u1;
>       fine_soln->init (global_soln.size(), true, SERIAL);
>       (*fine_soln) = global_soln;
>       gradient_values_u1 = AutoPtr<MeshFunction>
>         (new MeshFunction(equation_systems,
>                           *fine_soln,
>                           system_elasticity.get_dof_map(),
>                           system_elasticity.variable_number("u1")));
>       Gradient sol_gradient;
>       gradient_values_u1->init();
>
> then later when looping over quadrature points
>
> sol_gradient = gradient_values_u1->gradient(gp_face_xyz[gp]);

This is closer, but is unnecessary.  It's even less efficient under
the hood than the simplest API, the one I was trying to suggest on
Wednesday:

// outside your loops
unsigned int u1_var = system_elasticity.variable_number("u1");

// when looping over quadrature points
Gradient sol_gradient = system_elasticity.point_gradient(u1_var, your_xyz[qp]);
---
Roy

------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified management 
Up to 160% more powerful than alternatives and 25% more efficient. 
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to