Yep - vector_mult, reciprocal, and pointwise_mult are how we do explicit
updating in MOOSE:

https://github.com/idaholab/moose/blob/next/framework/src/timeintegrators/ActuallyExplicitEuler.C#L182

Derek


On Mon, May 20, 2019 at 2:38 PM Yuxiang Wang <yw...@virginia.edu> wrote:

> Thank you Jed & John! That's extremely helpful.
>
> John - thank you so much for the insight and pointer to reciprocal() and
> pointwise_mult()! As for adding additional NumericVector to the system - do
> you happen to know any example or code snippet that did this? What I am
> doing now is creating a new ExplicitSystem and using its solution vector as
> the storage, which handles the initialization quite nicely but maybe is an
> overkill.
>
> Best,
> Shawn
>
> On Mon, May 20, 2019 at 7:11 AM Jed Brown <j...@jedbrown.org> wrote:
>
> > John Peterson <jwpeter...@gmail.com> writes:
> >
> > > On Sun, May 19, 2019 at 9:15 PM Yuxiang Wang <yw...@virginia.edu>
> wrote:
> > >
> > >> Dear all,
> > >>
> > >> Sorry for the spam and being new to the field.
> > >>
> > >> I am currently trying to implement an elastodynamics problem with
> > explicit
> > >> method (central difference method, to be specific). I am planning to
> use
> > >> lumped mass matrix (and Rayleigh damping when needed), so the system
> > matrix
> > >> will be simply a diagonal matrix. Solving is therefore trivial - I
> just
> > >> need to do per-element division of the rhs by the diagonal entries to
> > get
> > >> the solution vector.
> > >>
> > >> For this problem, I have the option of just treating it as an implicit
> > >> system - fill the system.matrix with only diagonal components and call
> > the
> > >> PETSc LU solver. This is very easy thanks to a lot of the libmesh
> > >> infrastructure available. If I do so, should I be concerned about a
> > >> significant slowdown? Or would PETSc be smart enough to realize that
> > this
> > >> is already diagonal matrix and be efficient in solving it?
> > >>
> > >
> > > Yes, I'm pretty sure this will be significantly slower than doing a
> > > "manual" inversion by taking the reciprocal of the matrix diagonal. I
> > don't
> > > know of anything in PETSc's LU solver that will detect this particular
> > > special case. For an explicit code where you want every timestep to be
> as
> > > fast as possible, it will likely be prohibitively slow.
> >
> > If you have a sparse matrix with only the diagonal nonzero, then LU will
> > create no fill and it'll actually be pretty fast (likely hard to measure
> > compared to the cost of evaluating the explicit part), but -pc_type
> > jacobi would also be an exact solver and is more precisely what you
> > need.  Note that the default bjacobi/ilu is also an exact solver in this
> > circumstance, as are many other preconditioners.
> >
> > > My other choice would be to create a NumericVector myself to store the
> > >> diagonal system matrix entries, and perform the per-element division.
> > This
> > >> would take more work and will not be using the already well-tested
> > libmesh
> > >> infrastructure, so I am trying to see whether I can get away with
> doing
> > >> this without compromising on the performance.
> > >
> > >
> > > This would probably work best. You can add additional vectors to
> Systems
> > > and assemble into them similarly to the way you assemble the right-hand
> > > side vector. Also note that NumericVectors have the reciprocal() API,
> > which
> > > will allow you to quickly compute the inverse, as well as
> > pointwise_mult()
> > > which should allow you to quickly apply it.
> > >
> > > --
> > > John
> > >
> > > _______________________________________________
> > > Libmesh-users mailing list
> > > Libmesh-users@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/libmesh-users
> >
>
>
> --
> Yuxiang "Shawn" Wang, PhD
> yw...@virginia.edu
> +1 (434) 284-0836
>
> _______________________________________________
> 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

Reply via email to