diff --git a/README.md b/README.md index 9c0b42aa..7f4f7bce 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ -# Detailed installation instructions (64-bit Ubuntu 16 or 18): +# Installation instructions: +In principle you should be able to install this on Windows / OS X / Linux using conda and 'conda install -c marcus-o s4'. +Install in a new environment to avoid incompatabilities. +I don't have a large test base, so I would appreciate if you let me know if it works (marcus.ossiander at gmail) or not, then I'll try to help). +# Detailed installation instructions (64-bit Ubuntu 16 or 18): ## Key steps: ``` diff --git a/S4/RNP/Eigensystems.h b/S4/RNP/Eigensystems.h index eee2560c..f5950b1d 100644 --- a/S4/RNP/Eigensystems.h +++ b/S4/RNP/Eigensystems.h @@ -1,6 +1,10 @@ #ifndef _RNP_EIGENSYSTEMS_H_ #define _RNP_EIGENSYSTEMS_H_ +#ifdef _MSC_VER +#include +#endif + #include #include diff --git a/S4/S4.cpp b/S4/S4.cpp index d0ac9dfe..6297aa1a 100644 --- a/S4/S4.cpp +++ b/S4/S4.cpp @@ -61,7 +61,7 @@ namespace bs = boost::serialization; void* S4_malloc(size_t size){ // for debugging - void* ret = malloc_aligned(size, 16); + void* ret = malloc_aligned(size, 128); // memset(ret, 0x0, size); return ret; } @@ -2939,7 +2939,8 @@ int Simulation_GetField(Simulation *S, const double r[3], double fE[6], double f } std::complex *work = ab + n4; - RNP::TBLAS::Copy(n4, Lsoln->ab,1, ab,1); + memcpy(ab, Lsoln->ab, sizeof(std::complex) * n4); + //RNP::TBLAS::Copy(n4, Lsoln->ab,1, ab,1); //RNP::IO::PrintVector(n4, ab, 1); TranslateAmplitudes(S->n_G, Lbands->q, L->thickness, dz, ab); std::complex efield[3], hfield[3]; @@ -3051,7 +3052,8 @@ int Simulation_GetFieldPlane(Simulation *S, int nxy[2], double zz, double *E, do } std::complex *work = ab + n4; - RNP::TBLAS::Copy(n4, Lsoln->ab,1, ab,1); + memcpy(ab, Lsoln->ab, sizeof(std::complex) * n4); + //RNP::TBLAS::Copy(n4, Lsoln->ab,1, ab,1); //RNP::IO::PrintVector(n4, ab, 1); TranslateAmplitudes(S->n_G, Lbands->q, L->thickness, dz, ab); size_t snxy[2] = { nxy[0], nxy[1] }; diff --git a/S4/config.h b/S4/config.h index 87dbdc38..53b55b4b 100644 --- a/S4/config.h +++ b/S4/config.h @@ -8,3 +8,7 @@ #define PACKAGE_URL "" #define PACKAGE_VERSION "1.1.1" #define VERSION "1.1.1" + +#ifdef _MSC_VER +#define strcasecmp _stricmp +#endif \ No newline at end of file diff --git a/S4/fmm/fft_iface.cpp b/S4/fmm/fft_iface.cpp index 187a145e..e354e02d 100644 --- a/S4/fmm/fft_iface.cpp +++ b/S4/fmm/fft_iface.cpp @@ -20,7 +20,7 @@ #include "fft_iface.h" #include -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 #include #else #include @@ -46,7 +46,7 @@ int fft_next_fast_size(int n){ } std::complex *fft_alloc_complex(size_t n){ -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 return (std::complex*)(fftw_complex*)fftw_malloc(sizeof(fftw_complex) * n); #else return (std::complex*)KISS_FFT_MALLOC(sizeof(std::complex) * n); @@ -54,7 +54,7 @@ std::complex *fft_alloc_complex(size_t n){ } void fft_free(void *p){ -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 fftw_free(p); #else KISS_FFT_FREE(p); @@ -62,7 +62,7 @@ void fft_free(void *p){ } struct tag_fft_plan{ -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 fftw_plan plan; #else kiss_fftnd_cfg cfg; @@ -76,7 +76,7 @@ fft_plan fft_plan_dft_2d( int sign ){ fft_plan plan = NULL; -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 # ifdef HAVE_LIBPTHREAD pthread_mutex_lock(&mutex); # endif @@ -103,7 +103,7 @@ fft_plan fft_plan_dft_2d( } void fft_plan_exec(const fft_plan plan){ -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 fftw_execute(plan->plan); #else kiss_fftnd(plan->cfg, (const kiss_fft_cpx *)plan->in, (kiss_fft_cpx *)plan->out); @@ -112,7 +112,7 @@ void fft_plan_exec(const fft_plan plan){ void fft_plan_destroy(fft_plan plan){ if(NULL == plan){ return; } -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 # ifdef HAVE_LIBPTHREAD pthread_mutex_lock(&mutex); # endif @@ -135,7 +135,7 @@ void fft_init(){ } void fft_destroy(){ -#ifdef HAVE_LIBFFTW3 +#ifdef HAVE_FFTW3 fftw_cleanup(); #endif #ifdef HAVE_LIBPTHREAD diff --git a/S4/fmm/fmm_FFT.cpp b/S4/fmm/fmm_FFT.cpp index e54e0b8f..c9ee7388 100644 --- a/S4/fmm/fmm_FFT.cpp +++ b/S4/fmm/fmm_FFT.cpp @@ -32,8 +32,8 @@ #include "fmm.h" #include -#include -#include +//#include +//#include #include "fft_iface.h" int FMMGetEpsilon_FFT(const Simulation *S, const Layer *L, const int n, std::complex *Epsilon2, std::complex *Epsilon_inv){ diff --git a/S4/fmm/fmm_PolBasisJones.cpp b/S4/fmm/fmm_PolBasisJones.cpp index e9389ad6..0a95d685 100644 --- a/S4/fmm/fmm_PolBasisJones.cpp +++ b/S4/fmm/fmm_PolBasisJones.cpp @@ -19,6 +19,7 @@ #include +#define _USE_MATH_DEFINES #include #include #include "../RNP/TBLAS.h" diff --git a/S4/fmm/fmm_PolBasisVL.cpp b/S4/fmm/fmm_PolBasisVL.cpp index c84f8b50..de9e2afa 100644 --- a/S4/fmm/fmm_PolBasisVL.cpp +++ b/S4/fmm/fmm_PolBasisVL.cpp @@ -238,7 +238,7 @@ int FMMGetEpsilon_PolBasisVL(const Simulation *S, const Layer *L, const int n, s } - fft_plan plan = fft_plan_dft_2d(ngrid, Ffrom, Fto, -1); + fft_plan plan = fft_plan_dft_2d(ngrid, Ffrom, Fto, 1); // We fill in the quarter blocks of F in Fortran order for(int w = 0; w < 4; ++w){ diff --git a/S4/main_python.c b/S4/main_python.c index 376f6bbc..8f9a366a 100644 --- a/S4/main_python.c +++ b/S4/main_python.c @@ -30,7 +30,7 @@ #include #include -#ifdef WIN32 +#ifdef _WIN32 #define _USE_MATH_DEFINES #endif @@ -2169,7 +2169,7 @@ static PyObject *S4_NewInterpolator(PyObject *self, PyObject *args, PyObject *kw static PyObject *S4_SolveInParallel(PyObject *Self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"Layer", "Simulations", NULL}; - const char *layerName; + //const char *layerName; //S4_solve_in Py_RETURN_NONE; } diff --git a/S4/numalloc.c b/S4/numalloc.c index c753b532..94bc9cc5 100644 --- a/S4/numalloc.c +++ b/S4/numalloc.c @@ -20,10 +20,10 @@ #include #include -#ifdef WIN32 +#ifdef _WIN32 # include -void * _aligned_malloc(size_t size, size_t alignment); -void _aligned_free(void *ptr); +// void * _aligned_malloc(size_t size, size_t alignment); +// void _aligned_free(void *ptr); #else #include typedef uintptr_t malloc_aligned_ULONG_PTR; @@ -33,7 +33,7 @@ typedef uintptr_t malloc_aligned_ULONG_PTR; // The actual size of allocation will be greater than this size. // alignment : the alignment boundary void *malloc_aligned(size_t size, size_t alignment){ -#ifdef WIN32 +#ifdef _WIN32 return (void*)_aligned_malloc(size, alignment); #else void *pa, *ptr; @@ -51,7 +51,7 @@ void *malloc_aligned(size_t size, size_t alignment){ } void free_aligned(void *ptr){ -#ifdef WIN32 +#ifdef _WIN32 _aligned_free(ptr); #else if(ptr){ diff --git a/S4/pattern/predicates.c b/S4/pattern/predicates.c index e0a65339..e7d1a193 100644 --- a/S4/pattern/predicates.c +++ b/S4/pattern/predicates.c @@ -116,7 +116,9 @@ #include #include #include +#ifndef _MSC_VER #include +#endif /* On some machines, the exact arithmetic routines might be defeated by the */ /* use of internal extended precision floating-point registers. Sometimes */ diff --git a/S4/rcwa.cpp b/S4/rcwa.cpp index 1c7a8f8d..7c9ce5ce 100644 --- a/S4/rcwa.cpp +++ b/S4/rcwa.cpp @@ -50,7 +50,7 @@ #include static inline void* rcwa_malloc(size_t size){ - void *ret = malloc_aligned(size, 16); + void *ret = malloc_aligned(size, 128); //memset(ret, 0x0, size); return ret; } diff --git a/S4/sort.c b/S4/sort.c index 00b0c369..a82dc5ae 100644 --- a/S4/sort.c +++ b/S4/sort.c @@ -209,7 +209,9 @@ sort (void *const pbase, size_t total_elems, size_t size, of the array to sort, and END_PTR points at the very last element in the array (*not* one beyond it!). */ +#ifndef _MSC_VER #define min(x, y) ((x) < (y) ? (x) : (y)) +#endif { char *const end_ptr = &base_ptr[size * (total_elems - 1)]; diff --git a/conda_recipe/s4/Makefile b/conda_recipe/s4/Makefile new file mode 100644 index 00000000..ed9c37f0 --- /dev/null +++ b/conda_recipe/s4/Makefile @@ -0,0 +1,182 @@ +CONDA_INC = $(CONDA_PREFIX)/lib/ +CONDA_LIB = $(CONDA_PREFIX)/lib/ + +# BLAS_LIB = -L$(CONDA_LIB) -lmkl_core_dll -lmkl_rt +# LAPACK_LIB = -L$(CONDA_LIB) -lmkl_core_dll -lmkl_rt + +BLAS_LIB = -L$(CONDA_LIB) -lopenblas +LAPACK_LIB = -L$(CONDA_LIB) -lopenblas + +# FFTW3_INC = -I$(CONDA_INC)/include/ +# FFTW3_LIB = -L$(CONDA_LIB) -lfftw3 + +PTHREAD_INC = -DHAVE_UNISTD_H +# PTHREAD_LIB = -lpthread + +CHOLMOD_INC = -I$(CONDA_INC) +CHOLMOD_LIB = -L$(CONDA_LIB) -lcholmod -lamd -lcolamd -lcamd -lccolamd + +BOOST_INC = -I$(CONDA_PREFIX)/include +BOOST_LIBS = -L$(CONDA_LIB) -lboost_serialization + +# Specify custom compilers if needed +CXX = g++ +CC = gcc + +#CFLAGS += -O3 -fPIC +CFLAGS = -Wall -O3 -m64 -msse3 -msse2 -msse -fPIC + +OPTFLAGS = -O3 + +OBJDIR = ./build +S4_BINNAME = $(OBJDIR)/S4 +S4_LIBNAME = $(OBJDIR)/libS4.a +S4r_LIBNAME = $(OBJDIR)/libS4r.a + +CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft + +ifdef BOOST_INC + CPPFLAGS += $(BOOST_INC) $(BOOST_LIBS) +endif + +ifdef BLAS_LIB +CPPFLAGS += -DHAVE_BLAS +endif + +ifdef LAPACK_LIB +CPPFLAGS += -DHAVE_LAPACK +endif + +ifdef FFTW3_LIB +CPPFLAGS += -DHAVE_FFTW3 $(FFTW3_INC) +endif + +ifdef PTHREAD_LIB +CPPFLAGS += -DHAVE_LIBPTHREAD $(PTHREAD_INC) +endif + +ifdef CHOLMOD_LIB +CPPFLAGS += -DHAVE_LIBCHOLMOD $(CHOLMOD_INC) +endif + +ifdef MPI_LIB +CPPFLAGS += -DHAVE_MPI $(MPI_INC) +endif + +LIBS = $(BLAS_LIB) $(LAPACK_LIB) $(FFTW3_LIB) $(PTHREAD_LIB) $(CHOLMOD_LIB) $(MPI_LIB) $(BOOST_LIBS) + +#### Compilation targets + +all: $(S4_LIBNAME) + +objdir: + mkdir -p $(OBJDIR) + mkdir -p $(OBJDIR)/S4k + mkdir -p $(OBJDIR)/S4r + mkdir -p $(OBJDIR)/modules + +S4_LIBOBJS = \ + $(OBJDIR)/S4k/S4.o \ + $(OBJDIR)/S4k/rcwa.o \ + $(OBJDIR)/S4k/fmm_common.o \ + $(OBJDIR)/S4k/fmm_FFT.o \ + $(OBJDIR)/S4k/fmm_kottke.o \ + $(OBJDIR)/S4k/fmm_closed.o \ + $(OBJDIR)/S4k/fmm_PolBasisNV.o \ + $(OBJDIR)/S4k/fmm_PolBasisVL.o \ + $(OBJDIR)/S4k/fmm_PolBasisJones.o \ + $(OBJDIR)/S4k/fmm_experimental.o \ + $(OBJDIR)/S4k/fft_iface.o \ + $(OBJDIR)/S4k/pattern.o \ + $(OBJDIR)/S4k/intersection.o \ + $(OBJDIR)/S4k/predicates.o \ + $(OBJDIR)/S4k/numalloc.o \ + $(OBJDIR)/S4k/gsel.o \ + $(OBJDIR)/S4k/sort.o \ + $(OBJDIR)/S4k/kiss_fft.o \ + $(OBJDIR)/S4k/kiss_fftnd.o \ + $(OBJDIR)/S4k/SpectrumSampler.o \ + $(OBJDIR)/S4k/cubature.o \ + $(OBJDIR)/S4k/Interpolator.o \ + $(OBJDIR)/S4k/convert.o + +S4r_LIBOBJS = \ + $(OBJDIR)/S4r/Material.o \ + $(OBJDIR)/S4r/LatticeGridRect.o \ + $(OBJDIR)/S4r/LatticeGridArb.o \ + $(OBJDIR)/S4r/POFF2Mesh.o \ + $(OBJDIR)/S4r/PeriodicMesh.o \ + $(OBJDIR)/S4r/Shape.o \ + $(OBJDIR)/S4r/Simulation.o \ + $(OBJDIR)/S4r/Layer.o \ + $(OBJDIR)/S4r/Pseudoinverse.o \ + $(OBJDIR)/S4r/Eigensystems.o \ + $(OBJDIR)/S4r/IRA.o \ + $(OBJDIR)/S4r/intersection.o \ + $(OBJDIR)/S4r/predicates.o \ + $(OBJDIR)/S4r/periodic_off2.o + +ifndef LAPACK_LIB + S4_LIBOBJS += $(OBJDIR)/S4k/Eigensystems.o +endif + +$(S4_LIBNAME): objdir $(S4_LIBOBJS) + $(AR) crvs $@ $(S4_LIBOBJS) + +$(OBJDIR)/S4k/S4.o: S4/S4.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/rcwa.o: S4/rcwa.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_common.o: S4/fmm/fmm_common.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_FFT.o: S4/fmm/fmm_FFT.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_kottke.o: S4/fmm/fmm_kottke.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_closed.o: S4/fmm/fmm_closed.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_PolBasisNV.o: S4/fmm/fmm_PolBasisNV.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_PolBasisVL.o: S4/fmm/fmm_PolBasisVL.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_PolBasisJones.o: S4/fmm/fmm_PolBasisJones.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fmm_experimental.o: S4/fmm/fmm_experimental.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/fft_iface.o: S4/fmm/fft_iface.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/pattern.o: S4/pattern/pattern.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/intersection.o: S4/pattern/intersection.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/predicates.o: S4/pattern/predicates.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/numalloc.o: S4/numalloc.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/gsel.o: S4/gsel.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/sort.o: S4/sort.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/kiss_fft.o: S4/kiss_fft/kiss_fft.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/kiss_fftnd.o: S4/kiss_fft/tools/kiss_fftnd.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/SpectrumSampler.o: S4/SpectrumSampler.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/cubature.o: S4/cubature.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/Interpolator.o: S4/Interpolator.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/convert.o: S4/convert.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4k/Eigensystems.o: S4/RNP/Eigensystems.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + +#### Python extension + +S4_pyext: objdir $(S4_LIBNAME) + sh conda_recipe/s4/gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(CONDA_LIB) + $(PYTHON) setup.py install + +clean: + rm -rf $(OBJDIR) diff --git a/conda_recipe/s4/bld.bat b/conda_recipe/s4/bld.bat new file mode 100644 index 00000000..7dd00058 --- /dev/null +++ b/conda_recipe/s4/bld.bat @@ -0,0 +1,130 @@ +@echo on + +setlocal EnableDelayedExpansion + +::if "%PY_VER%"=="2.7" ( +:: set MSVC_VER=9.0 +:: set LIB_VER=90 +::) else if "%PY_VER%"=="3.4" ( +:: set MSVC_VER=10.0 +:: set LIB_VER=100 +::) else ( +:: set MSVC_VER=14.0 +:: set LIB_VER=140 +::) + +set DISTUTILS_USE_SDK=1 +::CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 +CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build/vcvarsall.bat" amd64 -vcvars_ver=14.0 +@echo on + +set "BLAS_PATH=%CONDA_PREFIX%/Library/lib/" +set "BLAS_LIB=mkl_rt" +set "LAPACK_PATH=%CONDA_PREFIX%/Library/lib/" +set "LAPACK_LIB=mkl_rt" + +set "FFTW3_INC=-I%CONDA_PREFIX%/Library/include/fftw" +set "FFTW3_PATH=%CONDA_PREFIX%/Library/lib/" +set "FFTW3_LIB=mkl_rt" + +::set "PTHREAD_PATH=%CONDA_PREFIX%/Library/lib/" +::set "PTHREAD_LIB=pthread" + +set "CHOLMOD_INC=-I%CONDA_PREFIX%\Library\include\suitesparse" +set "CHOLMOD_PATH=%CONDA_PREFIX%\Library\lib\" +set "CHOLMOD_LIB=cholmod amd colamd camd ccolamd suitesparseconfig metis" + +set "BOOST_INC=-I%CONDA_PREFIX%\Library\include\" +set "BOOST_PATH=%CONDA_PREFIX%\Library\lib\" +set "BOOST_LIB=" + +:: Specify custom compilers if needed +set "CXX=cl" +set "CC=cl" + +set "OBJDIR=build" +set "S4_LIBNAME=%OBJDIR%/S4.lib" + +set "CPPFLAGS=-O2 -W2 -EHs -LD -MD -DCPU86 -I. -IS4 -IS4/RNP -IS4/kiss_fft" +::enable debug output +::set "CPPFLAGS=%CPPFLAGS% -DENABLE_S4_TRACE" +set "CPPFLAGS=%CPPFLAGS% %BOOST_INC%" +IF DEFINED BLAS_LIB (set "CPPFLAGS=%CPPFLAGS% -DHAVE_BLAS") +IF DEFINED LAPACK_LIB (set "CPPFLAGS=%CPPFLAGS% -DHAVE_LAPACK") +IF DEFINED FFTW3_LIB (set "CPPFLAGS=%CPPFLAGS% -DHAVE_FFTW3 %FFTW3_INC%") +IF DEFINED PTHREAD_LIB (set "CPPFLAGS=%CPPFLAGS% -DHAVE_LIBPTHREAD %PTHREAD_INC%") +IF DEFINED CHOLMOD_LIB (set "CPPFLAGS=%CPPFLAGS% -DHAVE_LIBCHOLMOD %CHOLMOD_INC%") + +set "LIBS=%BLAS_LIB% %LAPACK_LIB% %FFTW3_LIB% %PTHREAD_LIB% %CHOLMOD_LIB% %BOOST_LIB%" +set "LIBPATHS=%BLAS_PATH% %LAPACK_PATH% %FFTW3_PATH% %PTHREAD_PATH% %CHOLMOD_PATH% %BOOST_PATH%" + +:: Make a build folder and change to it. +rmdir /Q /s %OBJDIR% +mkdir %OBJDIR% +cd %OBJDIR% +mkdir S4k +cd .. +%CXX% -c %CPPFLAGS% S4/S4.cpp -Fo%OBJDIR%/S4k/S4.obj +%CXX% -c %CPPFLAGS% S4/rcwa.cpp -Fo%OBJDIR%/S4k/rcwa.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_common.cpp -Fo%OBJDIR%/S4k/fmm_common.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_FFT.cpp -Fo%OBJDIR%/S4k/fmm_FFT.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_kottke.cpp -Fo%OBJDIR%/S4k/fmm_kottke.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_closed.cpp -Fo%OBJDIR%/S4k/fmm_closed.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_PolBasisNV.cpp -Fo%OBJDIR%/S4k/fmm_PolBasisNV.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_PolBasisVL.cpp -Fo%OBJDIR%/S4k/fmm_PolBasisVL.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_PolBasisJones.cpp -Fo%OBJDIR%/S4k/fmm_PolBasisJones.obj +%CXX% -c %CPPFLAGS% S4/fmm/fmm_experimental.cpp -Fo%OBJDIR%/S4k/fmm_experimental.obj +%CXX% -c %CPPFLAGS% S4/fmm/fft_iface.cpp -Fo%OBJDIR%/S4k/fft_iface.obj +%CC% -c %CPPFLAGS% S4/pattern/pattern.c -Fo%OBJDIR%/S4k/pattern.obj +%CC% -c %CPPFLAGS% S4/pattern/intersection.c -Fo%OBJDIR%/S4k/intersection.obj +%CC% -c %CPPFLAGS% S4/pattern/predicates.c -Fo%OBJDIR%/S4k/predicates.obj +%CC% -c %CPPFLAGS% S4/numalloc.c -Fo%OBJDIR%/S4k/numalloc.obj +%CC% -c %CPPFLAGS% S4/gsel.c -Fo%OBJDIR%/S4k/gsel.obj +%CC% -c %CPPFLAGS% S4/sort.c -Fo%OBJDIR%/S4k/sort.obj +IF DEFINED FFTW3_LIB (echo "using fftw") ELSE (%CC% -c %CPPFLAGS% S4/kiss_fft/kiss_fft.c -Fo%OBJDIR%/S4k/kiss_fft.obj) +IF DEFINED FFTW3_LIB (echo "using fftw") ELSE (%CC% -c %CPPFLAGS% S4/kiss_fft/tools/kiss_fftnd.c -Fo%OBJDIR%/S4k/kiss_fftnd.obj) +%CC% -c %CPPFLAGS% S4/SpectrumSampler.c -Fo%OBJDIR%/S4k/SpectrumSampler.obj +::%CC% -c %CPPFLAGS% S4/cubature.c -Fo%OBJDIR%/S4k/cubature.obj +%CC% -c %CPPFLAGS% S4/Interpolator.c -Fo%OBJDIR%/S4k/Interpolator.obj +::%CC% -c %CPPFLAGS% S4/convert.c -Fo%OBJDIR%/S4k/convert.obj +IF DEFINED LAPACK_LIB (echo "using lapack") ELSE (%CXX% -c %CPPFLAGS% S4/RNP/Eigensystems.cpp -Fo%OBJDIR%/S4k/Eigensystems.obj) + +lib.exe %OBJDIR%/S4k/* /out:%S4_LIBNAME% + + +set "LIBS=%LIBS:\=/%" +set "LIBPATHS=%LIBPATHS:\=/%" +set "OBJDIR=%OBJDIR:\=/%" +set "S4_LIBNAME=%S4_LIBNAME:\=/%" + +(echo:from distutils.core import setup, Extension +echo:import numpy as np +echo: +echo:lib_dirs = ['%OBJDIR%'] +echo:lib_dirs.extend^([libpath for libpath in '%LIBPATHS%'.split^(^)]^) +echo:libs = ['S4'] +echo:libs.extend^([lib for lib in '%LIBS%'.split^(^)]^) +echo:include_dirs = [np.get_include^(^)] +echo:extra_compile_args = ["-LD", "-MD"] +echo:extra_link_args = [] +::echo:extra_link_args = ["/DEBUG", "/verbose:lib"] +echo:print^(lib_dirs^) +echo:print^(libs^) +echo:print^(include_dirs^) +echo:S4module = Extension^('S4', +echo: sources = ['S4/main_python.c'], +echo: libraries = libs, +echo: library_dirs = lib_dirs, +echo: include_dirs = include_dirs, +echo: extra_objects = ['%S4_LIBNAME%'], +echo: extra_compile_args = extra_compile_args, +echo: extra_link_args = extra_link_args +echo:^) +echo: +echo:setup^(name = 'S4', +echo: version = '1.1', +echo: description = 'Stanford Stratified Structure Solver ^(S4^): Fourier Modal Method', +echo: ext_modules = [S4module] +echo:^))>setup.py + +IF DEFINED PYTHON ("%PYTHON%" setup.py install) ELSE (python setup.py install) \ No newline at end of file diff --git a/conda_recipe/s4/build.sh b/conda_recipe/s4/build.sh new file mode 100644 index 00000000..55382e3d --- /dev/null +++ b/conda_recipe/s4/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash +make -f conda_recipe/s4/Makefile clean +make -f conda_recipe/s4/Makefile S4_pyext \ No newline at end of file diff --git a/conda_recipe/s4/conda_build_config.yaml b/conda_recipe/s4/conda_build_config.yaml new file mode 100644 index 00000000..07b65fe8 --- /dev/null +++ b/conda_recipe/s4/conda_build_config.yaml @@ -0,0 +1,5 @@ +python: + - 3.7 + - 3.8 +numpy: + - 1.18 \ No newline at end of file diff --git a/conda_recipe/s4/gensetup.py.sh b/conda_recipe/s4/gensetup.py.sh new file mode 100644 index 00000000..88d9a459 --- /dev/null +++ b/conda_recipe/s4/gensetup.py.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +OBJDIR="$1" +LIBFILE="$2" +LIBS="$3" +BOOST_LIBS="$4" + +echo "LIBFILE: $LIBFILE" + +cat < setup.py +from distutils.core import setup, Extension +import numpy as np +#import os +#os.environ["CC"] = "g++" +#os.environ["CXX"] = "g++" + +libs = ['S4', 'stdc++'] +lib_dirs = ['$OBJDIR', '$BOOST_LIBS'] +libs.extend([lib[2::] for lib in '$LIBS'.split()]) +include_dirs = ['$BOOST_PREFIX/include', np.get_include()] +extra_link_args = ['$LIBFILE'] + +S4module = Extension('S4', + sources = ['S4/main_python.c'], + libraries = libs, + library_dirs = lib_dirs, + include_dirs = include_dirs, + extra_objects = ['$LIBFILE'], + # extra_link_args = extra_link_args, + runtime_library_dirs=['$BOOST_PREFIX/lib'], + extra_compile_args=['-std=gnu99'] +) + +setup(name = 'S4', + version = '1.1', + description = 'Stanford Stratified Structure Solver (S4): Fourier Modal Method', + ext_modules = [S4module] +) +SETUPPY diff --git a/conda_recipe/s4/meta.yaml b/conda_recipe/s4/meta.yaml new file mode 100644 index 00000000..f6dd4fd6 --- /dev/null +++ b/conda_recipe/s4/meta.yaml @@ -0,0 +1,67 @@ + +package: + name: s4 + version: 1.1 + +source: + path: ../../ + +build: + number: 5 + +requirements: + build: + - {{ compiler('c') }} + - {{ compiler('cxx') }} + - python + - setuptools + - numpy + - libboost + - suitesparse + - mkl-devel [win] + - openblas [unix] + + host: + - python + - numpy + - libboost + - suitesparse + - mkl-devel [win] + - openblas [unix] + + run: + - python + - {{ pin_compatible('numpy') }} + - {{ pin_compatible('libboost') }} + - {{ pin_compatible('suitesparse') }} + - {{ pin_compatible('mkl') }} [win] + - {{ pin_compatible('openblas') }} [unix] + +test: + imports: + - S4 + +about: + home: https://web.stanford.edu/group/fan/S4/index.html + license: GPL-2.0 + license_family: GPL + # license_file: LICENSE.txt + summary: 'S4 (Stanford Stratified Structure Solver) Conda Package' + + # The remaining entries in this section are optional, but recommended. + description: | + These are conda packages of the below software. + Victor Liu wrote the initial code but is not responsible for these packages. + A program for computing electromagnetic fields in periodic, layered + structures, developed by Victor Liu (victorliu@alumni.stanford.edu) of the + Fan group in the Stanford Electrical Engineering Department. + See the S4 manual, in doc/index.html, for a complete + description of the package and its user interface, as well as + installation instructions, the license and copyright, contact + addresses, and other important information. + doc_url: https://web.stanford.edu/group/fan/S4/index.html + dev_url: https://web.stanford.edu/group/fan/S4/index.html + +extra: + recipe-maintainers: + - marcus-o \ No newline at end of file diff --git a/examples/C_api/spec.awk b/examples/C_api/spec.awk old mode 100755 new mode 100644