I wanted to define a measure on a subdomain by imitating this:
https://jsdokken.com/dolfinx-tutorial/chapter3/robin_neumann_dirichlet.html
For example
boundaries = [(1, lambda x: np.isclose(x[0], 0) or np.isclose(x[1], 0))]
Then plug in to locate_entities function.
It tells me
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Of course, in this case, I can use two segments to represent it. In my case, I want a more complicated boolean expression to express the boundary and mark it, mixing and, or, not…
What should I do in this case?
Hi,
Have you tried using np.logical_or
instead of or
?
As stated by @adeebkor you can use either np.logical_or or the np.bitwise or numpy.bitwise_or — NumPy v1.26 Manual which in shorthand can be written as
boundaries = [(1, lambda x: np.isclose(x[0], 0) | np.isclose(x[1], 0))]
Thank you very much for helping me out of this stupid problem.
Before I also tried the operators “|” as well as “&”. It seems they do the same thing. However, there was an error. I also figured out. Because the condition I wrote was like
lambda x: x[0] + 1 >= r | x[1]-1 <= 2 * x[0]
This was apparently wrong as well, because python computes | and & first than ==, <= or >=
This is purely a python grammar issue. I am also a bit new to python
If you use brackets
lambda x: (x[0] + 1 >= r) | (x[1]-1 <= 2 * x[0])
this should also work.