Normally you don't need to "iterate over components". Normally you would just use the overloaded operators to do vector arithmetic.
For instance, for a PDE term that looks like "div grad u" the volume portion of the weak form looks like "grad u * grad phi_i" (where phi_i is your test function). In code... you simply write something like this: grad_u[qp] * grad_phi[i][qp] That automatically does a vector-vector dot product (inner product). It is also dimension (and element / shape function) independent. But, yes, if you do need to iterate over components (for some reason) just iterate to LIBMESH_DIM: for (unsigned int i = 0; i < LIBMESH_DIM; i++) std::cout<<grad_phi[i][qp](i)<<std::endl; Derek On Sun, Aug 21, 2016 at 11:51 AM Mike Marchywka <marchy...@hotmail.com> wrote: > > > > > > ---------------------------------------- > > Date: Sun, 21 Aug 2016 10:17:41 -0500 > > From: royst...@ices.utexas.edu > > To: marchy...@hotmail.com > > CC: libmesh-users@lists.sourceforge.net > > Subject: Re: [Libmesh-users] what is the deal with TypeVector size()? > > > > > > On Sun, 21 Aug 2016, Mike Marchywka wrote: > > > >> It apparently is a deprecated way to get a norm which would seem at odds > >> with both math and programming conventions. > > > > That is in fact why it's deprecated, yes. It's been deprecated long > > enough that we should probably remove it entirely in the next release; > > old users should have had time to change over by now and new users > > would be better served by a compile-time failure instead of a run-time > > warning. > > > >> Further, AFAICT, it is always 3D > > > > It's always LIBMESH_DIM dimensional; a constant defaulting to 3 and > > set at configure time. Usually 2D problems are cheap enough that > > people don't bother to worry about optimizing them, but there's > > occasionally someone who has to run a zillion 2D problems as the inner > > part of an optimization or uncertainty quantification loop and so we > > try to keep --enable-2D-only from regressing. > > > > Just offhand this seems like something suited for templates. While the > efficiency issue may be minor it seems more natural to use templates > here rather than sizes defined at lib build time. At least provide a loop > limit > that returns the constant where ever defined. size() const { return > LIBMESH_DIM; }? > But again templates are there and things like 2D cross products can assume > a zero z and return something with a 3rd component. I suppose a 3D vector > if constructed with a 2 D ctor could just consider itself 2D and anyone who > does not care can loop over the zero third D. > > The examples seem to use lots of compile time constants and AFAICT right > now, > I would not mind at all recompiling to add a new species to a simulation. > And the same > would be fine for dimensions just not rebuilding the whole lib or having a > second to > link against when I may want to mix and match. Say for example having a 2D > and 3D system that interact in some way that you may want to do them in > isolation > and then iterate until they are consistent with each other. Would this > never occur? > > >> forcing an anyone wanting to use it would have to know otherwise how > >> many matter or just loop over wasted zeroes. > > > > Right. > > So what is the best way to iterate over components? Use LIBMESH_DIM? > > Thanks. > > > --- > > Roy > > > ------------------------------------------------------------------------------ > _______________________________________________ > Libmesh-users mailing list > Libmesh-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libmesh-users > ------------------------------------------------------------------------------ _______________________________________________ Libmesh-users mailing list Libmesh-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libmesh-users