libMesh / libmesh

libMesh github repository
http://libmesh.github.io
GNU Lesser General Public License v2.1
652 stars 286 forks source link

Enhance MeshFunction to handle vector variables #3714

Open lindsayad opened 11 months ago

lindsayad commented 11 months ago

We would resize the output vector to be equal to vec_dim * n_vector_vars + n_scalar_vars

andcarl1364 commented 5 months ago

so we can easily get the vec_dim using this->_system_vars.size() as already implemented, however which specific vector vars are we counting to calculate n_vector_vars and the same for scaler vars with n_scalar_vars?

roystgnr commented 5 months ago

vec_dim isn't _system_vars.size(); it would be the dimensionality of the vector variables, not the total number of variables.

_system_vars is a vector of variable indices; vector variables with any of those indices would be included in n_vector_vars and scalar variables with any of those indices would be included in n_scalar_vars.

andcarl1364 commented 5 months ago

thank you! I guess what i'm confused about is which specific variables am I checking for having those indices, are they in the mesh_function.C file? and is there some sort of map of vector variables and their dimensionality in order to calculate vec_dim?

roystgnr commented 5 months ago

Variables are added dynamically to a System; DofMap::n_variables() returns the total count of them for its associated system. Each variable's information is available from DofMap::variable(i); that information includes a FEType, and FEInterface::n_vec_dim(mesh, fe_type) indicates how many dimensions a particular non-SCALAR variable has.

You might want to consider looking through some of the libMesh example programs; e.g. the distinction between variables in the C++ (might be named in a library .C file) context versus variables in the mathematical (added and named by an application) context is shown in introduction_ex2.C; later introduction_ex4.C is the first to use the returned index of a newly-added variable.