Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

plot crashes when plotting arrows #406

Closed
seisman opened this issue Mar 30, 2020 · 3 comments · Fixed by #490
Closed

plot crashes when plotting arrows #406

seisman opened this issue Mar 30, 2020 · 3 comments · Fixed by #490
Labels
bug Something isn't working

Comments

@seisman
Copy link
Member

seisman commented Mar 30, 2020

Description of the problem

I'm trying to plot two vectors using the following script. It works well if pen is set to 1p,black (i.e. a simple line), but crashes if set to 1p,black+ve0.2c. Actually, the first plot works, but the second one crashes.

Full code that generated the error

import pygmt
import numpy as np

fig = pygmt.Figure()
fig.basemap(projection="X15c/10c", region="400/600/5/8", frame=True)
fig.plot(x=[530.0, 530.0], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.plot(x=[570.0, 570.0], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.savefig("map.pdf")

Full error message

python(64354,0x11ac3bdc0) malloc: *** error for object 0x7f8f28e50900: pointer being freed was not allocated
python(64354,0x11ac3bdc0) malloc: *** set a breakpoint in malloc_error_break to debug
[1]    64354 abort      python test.py

System information

  • Operating system: macOS
  • Python installation (Anaconda, system, ETS): Anaconda
  • Version of GMT: 6.1.0_e6eb3b9_2020.03.30
  • Version of Python: 3.7.4
  • Version of this package: 0.0.1a0+75.g088b0d1
  • If using conda, paste the output of conda list below:
output of conda list
PASTE OUTPUT OF CONDA LIST HERE
@seisman seisman changed the title pygmt crashes when plotting vectors plot crashes when plotting vectors Mar 30, 2020
@weiji14 weiji14 added the bug Something isn't working label Mar 31, 2020
@weiji14
Copy link
Member

weiji14 commented Mar 31, 2020

I can reproduce the same crash, with GMT 6.0 on Linux and using the pygmt master branch. The corresponding code in GMT works though:

gmt begin test png
gmt basemap -JX15c/10c -R400/600/5/8 -B
gmt plot -W1p,black+ve0.2c << EOF
530.0 6.0
530.0 7.0
EOF
gmt plot -W1p,black+ve0.2c << EOF
570.0 6.0
570.0 7.0
EOF
gmt end show

produces:

two vertical lines plotted successfully using gmt

Not much of a clue as to why it's crashing though 🤷‍♂️

@d-murashkin
Copy link

Also crushes on the second plot, but
does not crush if integer values are used.
That is

import pygmt
import numpy as np

fig = pygmt.Figure()
fig.basemap(projection="X15c/10c", region="400/600/5/8", frame=True)
fig.plot(x=[530, 530], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.plot(x=[570, 570], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.savefig("map.pdf")

works fine

fig.plot(x=[530, 530], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.plot(x=[570.0, 570.0], y=[6.0, 7.0], pen='1p,black+ve0.2c')

also works fine

fig.plot(x=[530.0, 530.0], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.plot(x=[570, 570], y=[6.0, 7.0], pen='1p,black+ve0.2c')

does not work

Seems like the issue is related to floating point numbers,
also the data for later plots is converted to the data type of the first plot.

@d-murashkin
Copy link

I might have found a solution:
convert all floating point numbers to float32 (float64 is default)
The following works with no error:

import pygmt
import numpy as np

fig = pygmt.Figure()
fig.basemap(projection="X15c/10c", region="400/600/5/8", frame=True)
fig.plot(x=[np.float32(530.0), np.float32(530.0)], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.plot(x=[np.float32(570.0), np.float32(570.0)], y=[6.0, 7.0], pen='1p,black+ve0.2c')
fig.savefig("map.pdf")

Could it be that GMT does not have good support for float64 and uses float32 by default?
Anyway, for plotting float64 values are probably not needed, so all float64 data should probably converted to float32 in the wrapper.

@seisman seisman changed the title plot crashes when plotting vectors plot crashes when plotting arrows Jun 24, 2020
seisman added a commit that referenced this issue Jun 24, 2020
External programs like PyGMT can pass dataset/momory to GMT. By default,
GMT can read, modify and free the momery, which sometimes can cause
crashes.

Issue #406 reports an example in which PyGMT crashes. The issue was reported
to the upstream (see GenericMappingTools/gmt#3515
and GenericMappingTools/gmt#3528). It turns out
to be a API user error (i.e., a PyGMT bug).

As per the explanation of Paul, external programs like PyGMT should
always use `GMT_IN|GMT_IS_REFERENCE` to tell GMT that the data is
read-only, so that GMT won't try to change and free the memory.

This PR makes the change from `GMT_IN` to `GMT_IN|GMT_IS_REFERENCE`
in the `Session.open_virtual_file()` function, updates a few docstrings,
and also adds the script in #406 as a test.
seisman added a commit that referenced this issue Jun 24, 2020
External programs like PyGMT can pass dataset/momory to GMT. By default,
GMT can read, modify and free the momery, which sometimes can cause
crashes.

Issue #406 reports an example in which PyGMT crashes. The issue was reported
to the upstream (see GenericMappingTools/gmt#3515
and GenericMappingTools/gmt#3528). It turns out
to be a API user error (i.e., a PyGMT bug).

As per the explanation of Paul, external programs like PyGMT should
always use `GMT_IN|GMT_IS_REFERENCE` to tell GMT that the data is
read-only, so that GMT won't try to change and free the memory.

This PR makes the change from `GMT_IN` to `GMT_IN|GMT_IS_REFERENCE`
in the `Session.open_virtual_file()` function, updates a few docstrings,
and also adds the script in #406 as a test.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants