vmagnin / forcolormap Goto Github PK
View Code? Open in Web Editor NEWA Fortran library for colormaps
Home Page: https://vmagnin.github.io/forcolormap/
License: MIT License
A Fortran library for colormaps
Home Page: https://vmagnin.github.io/forcolormap/
License: MIT License
Move the following colormaps as subroutines to a new module to organize all colormaps in separate modules:
Colormaps_info
class: the categorical colormaps of the Scientific colour maps collection (name terminated by a S
) should not have 256 levels, but 100.Dear @vmagnin,
Thank you for this project and for mentioning ForImage in the Discourse forum.
I forked ForColormap to add and test ForImage functionality in your project. The PNM functionality of ForImage enables the import and export of PNM files in both binary and ASCII encodings. I have provided an example for your reference.
To review the modifications, kindly visit the GitHub repository at: https://github.com/gha3mi/forcolormap
Best regards,
Ali
I am trying to use ForColormap as a shared library (.so
under Linux). I have written a toy.f90
minimalist program:
use forcolormap, only: Colormap, wp
type(Colormap) :: cmap
call cmap%set("cubehelix", 0.0_wp, 1.0_wp, 1024)
end
but the shared library libforimage.so
is not found at runtime:
$ gfortran toy.f90 -Xlinker -rpath=/usr/local/lib $(pkg-config --cflags --libs forimage forcolormap)
$ ./a.out
./a.out: error while loading shared libraries: libforimage.so.0: cannot open shared object file: No such file or directory
System: Ubuntu 23.10
Compiler: GFortran 13.2.0
The -Xlinker -rpath=/usr/local/lib
option allows the compiler to pass to the linker the runtime library search path.
The ForColormap project was built with the command cmake -D BUILD_SHARED_LIBS=true ..
, then make
, and installed in the system with:
$ sudo make install
[ 46%] Built target forimage
[100%] Built target forcolormap
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/lib/libforimage.so.0.3.0
-- Installing: /usr/local/lib/libforimage.so.0
-- Installing: /usr/local/lib/libforimage.so
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/lut.mod
-- Installing: /usr/local/include/pnm.mod
-- Installing: /usr/local/include/forimage_parameters.mod
-- Installing: /usr/local/include/forcolor.mod
-- Installing: /usr/local/include/forimage.mod
-- Installing: /usr/local/lib/cmake/forimage/forimageTargets.cmake
-- Installing: /usr/local/lib/cmake/forimage/forimageTargets-release.cmake
-- Installing: /usr/local/lib/cmake/forimage/forimageConfig.cmake
-- Installing: /usr/local/lib/cmake/forimage/forimageConfigVersion.cmake
-- Installing: /usr/local/lib/pkgconfig/forimage.pc
-- Installing: /usr/local/lib/libforcolormap.so.0.8.0
-- Installing: /usr/local/lib/libforcolormap.so.0
-- Set runtime path of "/usr/local/lib/libforcolormap.so.0.8.0" to ""
-- Installing: /usr/local/lib/libforcolormap.so
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/miscellaneous_colormaps.mod
-- Installing: /usr/local/include/matplotlib_colormaps.mod
-- Installing: /usr/local/include/colormap_parameters.mod
-- Installing: /usr/local/include/forcolormap.mod
-- Installing: /usr/local/include/forcolormap_info.mod
-- Installing: /usr/local/include/scientific_colour_maps.mod
-- Installing: /usr/local/lib/cmake/forcolormap/forcolormapTargets.cmake
-- Installing: /usr/local/lib/cmake/forcolormap/forcolormapTargets-release.cmake
-- Installing: /usr/local/lib/cmake/forcolormap/forcolormapConfig.cmake
-- Installing: /usr/local/lib/cmake/forcolormap/forcolormapConfigVersion.cmake
-- Installing: /usr/local/lib/pkgconfig/forcolormap.pc
We can see that the libforimage.so
and libforcolormap.so
shared libraries are installed.
But we can notice a difference between ForImage and ForColormap, the following line is present only for ForColormap:
-- Set runtime path of "/usr/local/lib/libforcolormap.so.0.8.0" to ""
Files in the libraries directory:
$ ls -thor /usr/local/lib/libfor*
-rw-r--r-- 1 root 145K janv. 11 14:12 /usr/local/lib/libforimage.a
-rw-r--r-- 1 root 116K janv. 24 11:08 /usr/local/lib/libforimage.so.0.3.0
-rw-r--r-- 1 root 509K janv. 24 11:08 /usr/local/lib/libforcolormap.so.0.8.0
lrwxrwxrwx 1 root 20 janv. 24 11:08 /usr/local/lib/libforimage.so.0 -> libforimage.so.0.3.0
lrwxrwxrwx 1 root 16 janv. 24 11:08 /usr/local/lib/libforimage.so -> libforimage.so.0
lrwxrwxrwx 1 root 23 janv. 24 11:08 /usr/local/lib/libforcolormap.so.0 -> libforcolormap.so.0.8.0
lrwxrwxrwx 1 root 19 janv. 24 11:08 /usr/local/lib/libforcolormap.so -> libforcolormap.so.0
We can also see that the system knows the path to ForImage:
$ whereis libforimage.so.0
libforimage.so.0: /usr/local/lib/libforimage.so.0
But if we used the command ldd to print shared object dependencies:
$ ldd ./a.out
linux-vdso.so.1 (0x00007ffc20faa000)
libforcolormap.so.0 => /usr/local/lib/libforcolormap.so.0 (0x00007f4a2ef85000)
libgfortran.so.5 => /lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f4a2ec00000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4a2eb15000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4a2ef37000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4a2e800000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4a2f006000)
libforimage.so.0 => not found
we see that ForImage is not found.
$ pkg-config --cflags --libs forimage forcolormap
-I/usr/local/include -L/usr/local/lib -lforimage -lforcolormap
The discrete versions of the "bamako" scientific colormaps have been put in the "Diverging" category:
https://github.com/gha3mi/forcolormap/tree/dev
but they should be in the "Sequential" category with the continuous version.
When compiling with GFortran -std=f2018
options, access='append'
is not accepted.
$ fpm build --flag "-Ofast -march=native -mtune=native -Wall -Wextra -std=f2018"
...
colormaps_info.f90 failed.
[ 39%] Compiling...
build/dependencies/forcolormap/src/colormaps_info.f90:319:61:
319 | open(newunit=nunit, file=trim(file_name), access='append', status='unknown', action='write')
| 1
Error: GNU Extension: ACCESS specifier in OPEN statement at (1) has value ‘APPEND’
build/dependencies/forcolormap/src/colormaps_info.f90:338:61:
338 | open(newunit=nunit, file=trim(file_name), access='append', status='unknown', action='write')
| 1
Error: GNU Extension: ACCESS specifier in OPEN statement at (1) has value ‘APPEND’
...
Indeed, access
should be sequential
(default), direct
or stream
. We should use instead the specifier position='append'
:
open(newunit=nunit, file=trim(file_name), position='append', status='unknown', action='write')
Ìn MSYS2/Windows 10, CMake 3.28.3 has problems with ForImage:
$ cmake -G "MSYS Makefiles" -D BUILD_SHARED_LIBS=true ..
-- The Fortran compiler identification is GNU 13.2.0
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Check for working Fortran compiler: D:/Logiciels/MSYS2/ucrt64/bin/gfortran.exe - skipped
-- Setting build type to 'Release' as none was specified.
-- Build FORIMAGE tests: OFF
-- Build FORIMAGE examples: OFF
CMake Error at cmake/dependencies/forimage/CMakeLists.txt:15 (add_custom_command):
No TARGET 'forcolormap' has been created in this directory.
-- Build FORCOLORMAP tests: OFF
-- Build FORCOLORMAP examples: OFF
-- Configuring incomplete, errors occurred!
Note: no problem with fpm.
$ fpm build --verbose
...
[ 41%] colormap_class.f90
+ gfortran -c ././src/colormap_class.f90 -Wall -Wextra -fPIC -fmax-errors=1 -g -fcheck=bounds -fcheck=array-temps -fbacktrace -fcoarray=single -fimplicit-none -Werror=implicit-interface -ffree-form -J build/gfortran_87E2AE0597D39913 -Ibuild/gfortran_87E2AE0597D39913 -o build/gfortran_87E2AE0597D39913/forcolormap/src_colormap_class.f90.o
././src/colormap_class.f90:1109:65:
1109 | pure subroutine check(self,check_name, check_zmin, check_zmax, check_levels)
| 1
Warning: Unused dummy argument ‘check_zmax’ at (1) [-Wunused-dummy-argument]
[ 44%] colormap_class.f90 done.
...
if (present(check_zmin)) then
if (check_zmin) then
! Check validity of zmin and zmax
if (self%zmin > self%zmax) status(2) = .false.
! Fix zmin and zmax if they are not valid
if (status(2) .eqv. .false.) then
temp = self%zmin
self%zmin = self%zmax
self%zmax = temp
end if
end if
end if
Should we write something like:
if (present(check_zmin).or.present(check_zmax)) then
if (check_zmin.or.check_zmax) then
?
Or replace check_zmin
and check_zmax
by only one optional argument check_bounds
? Because if both are present but check_zmin=.true.
and check_zmax=.false.
, what would it mean?
https://github.com/vmagnin/forcolormap/blob/main/test/check.f90
The link to the cubehelix colormap in the README is broken. It currently points to https://www.mrao.cam.ac.uk/~dag/CUBEHELIX/.
The subroutine test_colormap()
is duplicated in these examples:
It could be included into the Colormap class. Another solution could be to create a Colormap_test class.
demo
folder to keep the main directory clean.write_ppm_file_colorbar
subroutine as a type-bound procedure for the Colormap
type. Move write_ppm_file_test
to demo.f90
since it's a specific subroutine for the demo.I noticed the idea of lut files in the TODO list. I have added support for the lut file format in ForImage. Examples of this functionality can be found at the following links: example15 and example16.
If you believe ForColormap is the appropriate place for this functionality, I can move it there.
Now, it is possible to import and export lut files. We can implement support for importing and exporting lut files in ForColormap by adding two type-bound procedures. What's your opinion?
After installing ForColormap in Ubuntu 23.04:
$ pkg-config --cflags --libs forcolormap
-I/usr/local/include -L/usr/local/usr/local/lib -lforcolormap
The path /usr/local/usr/local/lib
should be /usr/local/lib
instead.
In the install/template.pc
file we have:
prefix = @CMAKE_INSTALL_PREFIX@
libdir = ${prefix}/@CMAKE_INSTALL_FULL_LIBDIR@
includedir = ${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
...
Libs: -L${libdir} -l@PROJECT_NAME@
Cflags: -I${includedir}
We can write libdir = ${prefix}/@CMAKE_INSTALL_LIBDIR@
but we could also delete the prefix
variable and use the CMAKE_INSTALL_FULL_
version for both directories.
What solution should we use? @jchristopherson
https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
I have added an uninstall target to CMake, providing the ability to use
make uninstall
. Perhaps you could also add it for forcolormap. See gha3mi/forimage#17 and the corresponding changes: gha3mi/forimage@f1b4056. The same approach can be applied to forcolormap.
Originally posted by @gha3mi in #21 (comment)
System: Ubuntu 23.10, FreeBSD 14.0
Compiler: GFortran 13.2.0
I am now trying to use ForColormap as a static library (.a
under Linux). I have written a toy.f90
minimalist program:
use forcolormap, only: Colormap, wp
type(Colormap) :: cmap
call cmap%set("cubehelix", 0.0_wp, 1.0_wp, 1024)
print *, "test"
end
ForColormap was configured with cmake -D BUILD_SHARED_LIBS=false ..
before building and installing.
The .mod
files are all in /usr/local/include/
and the two .a
are in /usr/local/lib/
.
But I can not compile my toy program with the -static
option:
$ gfortran -static toy.f90 $(pkg-config --cflags --libs forcolormap)
/usr/local/bin/ld: /usr/local/lib/libforcolormap.a(colormap_class.f90.o): in function `__forcolormap_MOD_write_ppm_colorbar':
colormap_class.f90:(.text+0xc10): undefined reference to `__pnm_MOD___vtab_pnm_Format_pnm'
/usr/local/bin/ld: colormap_class.f90:(.text+0xf38): undefined reference to `__pnm_MOD_set_format'
/usr/local/bin/ld: colormap_class.f90:(.text+0xf90): undefined reference to `__pnm_MOD_set_pnm'
/usr/local/bin/ld: colormap_class.f90:(.text+0xfbe): undefined reference to `__pnm_MOD_export_pnm'
/usr/local/bin/ld: colormap_class.f90:(.text+0x10a7): undefined reference to `__pnm_MOD_set_format'
collect2: error: ld returned 1 exit status
The check()
procedure has been added to the colormap_class
, as suggested by @vmagnin at https://github.com/vmagnin/forcolormap/tree/ali-dev. Tests have also been updated. @vmagnin, please test the validity of check().
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.