[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fast computation of a quantity

From: Konstantinos Poulios
Subject: Re: Fast computation of a quantity
Date: Fri, 30 Sep 2022 16:22:49 +0200

oh, I just noticed that u and phi are defined in the same space, so this is even simpler. Basically you just need to do

grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*sign(u)*pow(abs(u), 1+2*p)*Test_u", -1, md)
grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*u*pow(abs(u), 2*p)*Test_u", -1, md)
grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*u*pow(sqr(u), p)*Test_u", -1, md)

without defining phi at all.

On Fri, Sep 30, 2022 at 3:58 PM Konstantinos Poulios <> wrote:
actually the last one should be

grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*u*pow(abs(u), 2*p)*Test_phi", -1, md, "select_output", "phi")
grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*u*pow(sqr(u), p)*Test_phi", -1, md, "select_output", "phi")

On Fri, Sep 30, 2022 at 3:55 PM Konstantinos Poulios <> wrote:
this is a minor problem, try:

grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*sign(u)*pow(abs(u), 1+2*p)*Test_phi", -1, md, "select_output", "phi")

or even better:

grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*u*pow(u, 2*p)*Test_phi", -1, md, "select_output", "phi")


On Fri, Sep 30, 2022 at 2:05 PM Eloi Martinet <> wrote:
I actually tried it, but the problem was that u was declared as a fem_variable and not fem_data and getfem kept telling me "Cannot derive function sign. No derivative provided or not derivable function."
Could you explain this behaviour to me? I would like to understand what happens when u is declared as a variable.
Thank you for your help and kindness.

Le ven. 30 sept. 2022 à 11:16, Konstantinos Poulios <> a écrit :
ok, what you are doing is equivalent to

grad_norm = gf.asm_generic(self.IM, 1, "(2+2*p)*sign(u)*pow(abs(u), 1+2*p)*Test_phi", -1, md)

This is the definition of assembling a residual vector, assembling the product with each basis function.


On Fri, Sep 30, 2022 at 10:01 AM Eloi Martinet <> wrote:
Here is what I do currently :

md = gf.Model("real")
md.add_fem_variable("u", self.V)  
md.add_fem_variable("phi", self.V) # Represents a basis function
md.add_data("p", 1)
md.set_variable("p", p)
md.set_variable("u", u)

grad_norm = np.zeros(nbdof_V)

for i in tqdm(range(nbdof_V)):
            phi = np.zeros(self.nbdof_V)
            phi[i] = 1
  "phi", phi)

            grad_norm[i] = (2+2*p)*gf.asm_generic(self.IM, 0, "sign(u)*pow(abs(u), 1+2*p)*phi", -1, md)

Sorry I should have included this snippet from the beginning.
Have a great day.

Le jeu. 29 sept. 2022 à 21:39, Konstantinos Poulios <> a écrit :
Hello, would you like to send us a naive implementation of your assembly with asm_generic (and a loop) to take it from there?


On Thu, Sep 29, 2022 at 6:27 PM Eloi Martinet <> wrote:
Hello everyone,
My problem is the following : I have a FE space V with basis phi_i. Let u be a function on V and f a real valued function. What is the quickest way to compute the vector (\int f(u)*phi_i)_i ? I would like to use asm_generic but I don't see how to do it without looping on i and computing it for all i, which is way too long.

Thank you, have a good day.
Best regards,

reply via email to

[Prev in Thread] Current Thread [Next in Thread]