← Back to team overview

dolfin team mailing list archive

Re: recompute& evaluate a function/vector

 

On Fri, Mar 06, 2009 at 04:30:56PM +0100, Patrick Riesen wrote:
> Anders Logg wrote:
> > On Thu, Mar 05, 2009 at 04:55:38PM +0100, Patrick Riesen wrote:
> >> hi all
> >>
> >> i'm stuck on the following problem:
> >>
> >> i'd like to compute a term as
> >>
> >> eta = (gamma)^(-2/3), or general eta = gamma^(n) and n is real
> >>
> >>
> >> in my code, gamma is dependent on a velocity function from a previous 
> >> interation, so gamma = gamma(u0), and how to compute gamma stems from a 
> >> form-file, so i do:
> >>
> >> _M_gamma = new gammaFunctional(u0);
> >>
> >> Function  f_gamma(&mesh, *M_gamma, 0);
> >>
> >>
> >> my question is now
> >>
> >> how can i create the other function f_eta = f_gamma^(2/3) in a nice way?
> >>
> >> what i thought about is to create a derived function class Eta where 
> >> overload the evaluation function in a way as
> >>
> >> double eval(const double* x) const
> >> {
> >>    return (gamma.eval(x)*gamma.eval(x))^(-1/3)
> >> }
> >>
> >> please tell me if this is a possible approach, or else advise me how to 
> >> handle this :-)
> >>
> >>
> >> thanks a lot for the support,
> >>
> >> patrick
> >>
> >> (btw i do this together with dolfin-grade2 so i use dolfin0.8.1 )
> > 
> > I'd suggest operating on the vectors of dofs. Send in the gamma
> > function to the constructor of your Function subclass, pick out the
> > vector of dofs, iterate over the dofs and just insert the values into
> > the vector using pow(x[i], 2.0/3.0).
> > 
> > Use the get/set methods in Vector to first pick out arrays, operate on
> > the arrays and then put them back.
> >  
> 
> hi anders,
> i understand how to create the f_eta class and hand in the f_gamma but 
> i'm uncertain on what to do inside f_eta exactly. can you give me some 
> more help, e.g. in a few pseudocode statements?
> thanks a lot for the help,
> patrick

In the constructor of EtaFunction, do something like this:

  const Vector& gamma_vector = gamma.vector();
  const Vector& eta_vector = vector();

  for (uint i = 0; i < eta_vector.size(); i++)
    eta_vector.setitem(i, pow(gamma_vector[i], 3.0));

-- 
Anders

Attachment: signature.asc
Description: Digital signature


Follow ups

References