NanoComp / meep

free finite-difference time-domain (FDTD) software for electromagnetic simulations
GNU General Public License v2.0
1.22k stars 621 forks source link

Simultaneously installing versions for both single- and double-precision floating point #1904

Open avpanov opened 2 years ago

avpanov commented 2 years ago

It can be done with suffices to library and pkgconfig file in a manner of fftw. The headers are the same excepting the definition of MEEP_SINGLE.

oskooi commented 2 years ago

Note that there is a compiler flag --enable-single which is used to specify the floating-point precision of the fields and materials as described in the user manual.

https://github.com/NanoComp/meep/blob/8f3d7ba9dace2a747862b86b8914d9114f2841b6/configure.ac#L22-L32

You should not need to modify the meep.hpp directly.

avpanov commented 2 years ago

I know about this option. It does not allow parallel installation of both single and double floating number versions of meep, either single or double accuracy.

stevengj commented 2 years ago

Yes, see also my comment here: https://github.com/NanoComp/meep/issues/1549#issuecomment-852316419

avpanov commented 2 years ago

This patch adds "s" suffix to installed library names (e.g. libmeeps.so), meep binary (meeps), pkg-config file (meeps.pc) when "--enable-single" is selected. The python package preserve "meep" name as it requires massive edition in *.py files due to "import meep as mp" used there. It is reasonable to add "-DMEEP_SINGLE" for meeps.pc but I do not know how to do it.

diff -Nuar meep-1.22.0/configure.ac meep-1.22.0.prec/configure.ac
--- meep-1.22.0/configure.ac    2022-01-12 12:04:46.000000000 +1000
+++ meep-1.22.0.prec/configure.ac   2022-02-22 21:19:53.129484849 +1000
@@ -26,10 +26,19 @@
                enable_single=$enableval, enable_single=no)
 if test "x$enable_single" = "xyes"; then
     MEEP_SINGLE=1
+    PRECISION=s
 else
     MEEP_SINGLE=0
+    PRECISION=d
 fi
 AC_SUBST(MEEP_SINGLE)
+AC_SUBST(PRECISION)
+
+case "$PRECISION" in
+     s) PREC_SUFFIX=s;;
+     d) PREC_SUFFIX=;;
+esac
+AC_SUBST(PREC_SUFFIX)

 ##############################################################################
 # build with SWIG threads for Python
@@ -614,6 +623,8 @@
         fi
       fi

+      #AC_SUBST(pkgpythondir,\${pythondir}/$PACKAGE$PREC_SUFFIX)
+      #AC_SUBST(pkgpyexecdir,\${pyexecdir}/$PACKAGE$PREC_SUFFIX)
       CPPFLAGS=$save_CPPFLAGS
     fi # have_python

diff -Nuar meep-1.22.0/libpympb/Makefile.am meep-1.22.0.prec/libpympb/Makefile.am
--- meep-1.22.0/libpympb/Makefile.am    2019-01-10 11:32:00.000000000 +1000
+++ meep-1.22.0.prec/libpympb/Makefile.am   2022-02-18 19:59:58.850964215 +1000
@@ -1,4 +1,4 @@
-LIBMEEP = $(top_builddir)/src/libmeep.la
+LIBMEEP = $(top_builddir)/src/libmeep@PREC_SUFFIX@.la

 AM_CPPFLAGS =                   \
     -Wfatal-errors              \
diff -Nuar meep-1.22.0/Makefile.am meep-1.22.0.prec/Makefile.am
--- meep-1.22.0/Makefile.am 2020-07-09 10:57:21.000000000 +1000
+++ meep-1.22.0.prec/Makefile.am    2022-02-18 19:59:33.431965348 +1000
@@ -20,12 +20,12 @@
 EXTRA_DIST = NEWS.md LICENSE COPYRIGHT m4 meep-pkgconfig.in doc

 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = meep.pc
+pkgconfig_DATA = meep@PREC_SUFFIX@.pc

-meep.pc: meep-pkgconfig
+meep@PREC_SUFFIX@.pc: meep-pkgconfig
    cp -f $(top_builddir)/meep-pkgconfig $@

-libmeep:
+libmeep@PREC_SUFFIX@:
    cd src && $(MAKE)

 # Generate the Python API Document
@@ -55,4 +55,4 @@
        rm -rf doc; \
    fi

-DISTCLEANFILES = meep.pc
+DISTCLEANFILES = meep@PREC_SUFFIX@.pc
diff -Nuar meep-1.22.0/meep-pkgconfig.in meep-1.22.0.prec/meep-pkgconfig.in
--- meep-1.22.0/meep-pkgconfig.in   2018-02-23 11:50:19.000000000 +1000
+++ meep-1.22.0.prec/meep-pkgconfig.in  2022-02-19 00:02:02.549651404 +1000
@@ -6,5 +6,5 @@
 Name: MEEP
 Description: time-domain electromagnetic simulation
 Version: @VERSION@
-Libs: -L${libdir} -lmeep @MEEPLIBS@
+Libs: -L${libdir} -lmeep@PREC_SUFFIX@ @MEEPLIBS@
 Cflags: -I${includedir} @ARCHFLAG@
diff -Nuar meep-1.22.0/python/Makefile.am meep-1.22.0.prec/python/Makefile.am
--- meep-1.22.0/python/Makefile.am  2022-01-12 12:03:42.000000000 +1000
+++ meep-1.22.0.prec/python/Makefile.am 2022-02-20 18:34:56.788668961 +1000
@@ -116,7 +116,7 @@
               -I$(top_srcdir)/libpympb     \
               -I$(top_builddir) # for config.h

-LIBMEEP = $(top_builddir)/src/libmeep.la
+LIBMEEP = $(top_builddir)/src/libmeep@PREC_SUFFIX@.la

 _meep_la_SOURCES = meep-python.cxx
 _meep_la_LIBADD = $(LIBMEEP) $(PYTHON_LIBS)
diff -Nuar meep-1.22.0/scheme/Makefile.am meep-1.22.0.prec/scheme/Makefile.am
--- meep-1.22.0/scheme/Makefile.am  2022-01-12 12:03:42.000000000 +1000
+++ meep-1.22.0.prec/scheme/Makefile.am 2022-02-18 23:51:24.876679834 +1000
@@ -1,19 +1,19 @@
-bin_PROGRAMS = meep
+bin_PROGRAMS = meep@PREC_SUFFIX@
 EXTRA_DIST = meep.scm.in meep-enums.scm casimir.scm materials.scm meep_wrap.patch examples

-LIBMEEP = $(top_builddir)/src/libmeep.la
+LIBMEEP = $(top_builddir)/src/libmeep@PREC_SUFFIX@.la

 HDRS = meep-ctl.hpp meep-ctl-const.hpp meep-ctl-swig.hpp

 LIBHDRS = $(top_srcdir)/src/meep.hpp $(top_srcdir)/src/meep/vec.hpp $(top_srcdir)/src/meep/mympi.hpp
 CTLHDRS = $(LIBHDRS) $(srcdir)/meep-ctl.hpp $(top_builddir)/config.h $(srcdir)/meep-ctl-const.hpp ctl-io.h

-meep_SOURCES = meep.cpp structure.cpp meep_wrap.cxx $(HDRS) meep.i meep_op_renames.i meep_renames.i meep_enum_renames.i meep_swig_bug_workaround.i
-nodist_meep_SOURCES = main.cpp geom.cpp ctl-io.cpp ctl-io.h ctl-io.i
-meep_LDADD = $(LIBMEEP) @LIBCTL_LIBS@
-meep_CPPFLAGS = $(AM_CPPFLAGS) -Wno-unused-parameter -Wno-unused-variable -Wno-empty-body
+meep@PREC_SUFFIX@_SOURCES = meep.cpp structure.cpp meep_wrap.cxx $(HDRS) meep.i meep_op_renames.i meep_renames.i meep_enum_renames.i meep_swig_bug_workaround.i
+nodist_meep@PREC_SUFFIX@_SOURCES = main.cpp geom.cpp ctl-io.cpp ctl-io.h ctl-io.i
+meep@PREC_SUFFIX@_LDADD = $(LIBMEEP) @LIBCTL_LIBS@
+meep@PREC_SUFFIX@_CPPFLAGS = $(AM_CPPFLAGS) -Wno-unused-parameter -Wno-unused-variable -Wno-empty-body

-BUILT_SOURCES = $(nodist_meep_SOURCES) meep_renames.i meep_enum_renames.i meep_swig_bug_workaround.i meep-enums.scm meep_wrap.cxx
+BUILT_SOURCES = $(nodist_meep@PREC_SUFFIX@_SOURCES) meep_renames.i meep_enum_renames.i meep_swig_bug_workaround.i meep-enums.scm meep_wrap.cxx

 # manual dependency hack to force the build order in certain cases
 # ... for some reason automake's automatic dependencies are not working here
@@ -60,8 +60,9 @@

 MY_DEFS = -DHAVE_CTL_HOOKS=1 -DHAVE_CTL_EXPORT_HOOK=1

-PROGRAM_NAME = meep
-SPECIFICATION_FILE = $(PROGRAM_NAME).scm
+PROGRAM_NAME = meep@PREC_SUFFIX@
+#SPECIFICATION_FILE = $(PROGRAM_NAME).scm
+SPECIFICATION_FILE = meep.scm
 nodist_pkgdata_DATA = $(SPECIFICATION_FILE) meep-enums.scm casimir.scm materials.scm

 ##############################################################################
@@ -99,7 +100,7 @@
    cp -f $(LIBCTL_DIR)/utils/geom.c $@

 clean-local:
-   rm -f $(nodist_meep_SOURCES) meep-enums.scm ctl-io.* main.* geom.*
+   rm -f $(nodist_meep@PREC_SUFFIX@_SOURCES) meep-enums.scm ctl-io.* main.* geom.*

 maintainer-clean-local:
    rm -f $(BUILT_SOURCES)
diff -Nuar meep-1.22.0/src/Makefile.am meep-1.22.0.prec/src/Makefile.am
--- meep-1.22.0/src/Makefile.am 2021-10-13 11:45:06.000000000 +1000
+++ meep-1.22.0.prec/src/Makefile.am    2022-02-18 20:01:08.051295847 +1000
@@ -1,4 +1,4 @@
-lib_LTLIBRARIES = libmeep.la
+lib_LTLIBRARIES = libmeep@PREC_SUFFIX@.la
 include_HEADERS = meep.hpp
 pkginclude_HEADERS = meep/mympi.hpp meep/vec.hpp meep/meep-config.h meepgeom.hpp material_data.hpp adjust_verbosity.hpp

@@ -9,7 +9,7 @@
 HDRS = meep.hpp meep_internals.hpp meep/mympi.hpp meep/vec.hpp \
 bicgstab.hpp meepgeom.hpp material_data.hpp adjust_verbosity.hpp

-libmeep_la_SOURCES = array_slice.cpp anisotropic_averaging.cpp         \
+libmeep@PREC_SUFFIX@_la_SOURCES = array_slice.cpp anisotropic_averaging.cpp        \
 bands.cpp boundaries.cpp bicgstab.cpp casimir.cpp  \
 cw_fields.cpp dft.cpp dft_ldos.cpp energy_and_flux.cpp     \
 fields.cpp fields_dump.cpp loop_in_chunks.cpp h5fields.cpp h5file.cpp  \
@@ -20,9 +20,9 @@
 vec.cpp step_generic.cpp meepgeom.cpp GDSIIgeom.cpp $(HDRS) $(BUILT_SOURCES)

 SUBDIRS = support
-libmeep_la_LIBADD = support/libsupport.la
+libmeep@PREC_SUFFIX@_la_LIBADD = support/libsupport.la

-libmeep_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
+libmeep@PREC_SUFFIX@_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@

 PRELUDE = "/* This file was automatically generated --- DO NOT EDIT */"