Forum Message

 

 

We have moved the forum to https://forum.ngsolve.org . This is an archived version of the topics until 05/05/23. All the topics were moved to the new forum and conversations can be continued there. This forum is just kept as legacy to not invalidate old links. If you want to continue a conversation just look for the topic in the new forum.

Notice

The forum is in read only mode.

NgSolve object from function supporting (only) point evaluation

More
4 years 1 month ago #2477 by cpfeiler
Hello there,

Assuming I have a continuous function F represented as a Python function, which can be evaluated at any point (x, y, z) in space and returns the value F(x, y, z) --- i.e., point evaluation is availabe, but nothing else.

In theory, that's enough to do quadrature, integration, etc... . But I don't know how to do that in NgSolve with an object other than a CoefficientFunction...
So, is there a way in NgSolve to have a GridFunction (or CoefficientFunction) represent (a projection of) this function F?

* It's quite easy to get the desired nodal interpolant of that function F in NgSolve for first order elements H1(mesh, order=1) by just setting the nodal values accordingly.
* For general order > 1, it's not that obvious anymore; and potentially gets very messy.
* I guess there is some tool for this in NgSolve, which I just don't know about --> so I am thankful for any hints ;-)

Example code:
F = lambda px, py, pz: some_non_standard_formula(px, py, pz) # supports point evaluation

V = H1(mesh, order=5) # general order p > 1
Fh = GridFunction(V) # should represent a discretization of F

Best regards,
Carl
More
4 years 1 month ago #2479 by christopher
You cannot use python functions (As the evaluation would not be possible parallel and because of Python very slow). There are 3 options:
I guess you cannot create the function from the existing coefficientfunctions? Even not with the extension github.com/NGSolve/ngs-special-functions ?
This is an extension that makes it possible to easily put any function that is available in SLATEC into a NGSolve coefficient function.

Option 2 is to use a fine voxel grid as a representation of your function and use the "VoxelCoefficient" CoefficientFunction. This expects a bounding box and values on a voxel grid as a numpy array.

Option 3 is to write the function in C++ and export it to python. How to do this is described here
ngsolve.org/docu/latest/mylittlengs/1_Ba...FEM/coefficient.html
python export here
ngsolve.org/docu/latest/mylittlengs/1_Basic/pythonExport.html

Best
Christopher
More
4 years 1 month ago #2480 by cpfeiler
Dear Christopher,
thanks for the quick reply.

Option 1 is not possible. The function F is the result of some BEM computation.
Therefore, also option 3 is also out.

I will try option 2: As I see in git, this "VoxelCoefficient" was added just recently.
I can't find "VoxelCoefficient" in the Documentation; is there some MWE on how to use it?

Best, Carl
More
4 years 1 month ago #2485 by christopher
Yep it was. Attached is a small example
Attachments:
More
4 years 1 month ago #2488 by cpfeiler
Time to create page: 0.123 seconds