From c8265648b4b68a2dce2b9cb30604b65afef841ad Mon Sep 17 00:00:00 2001 From: sajidmc Date: Mon, 11 Feb 2019 17:39:56 -0500 Subject: [PATCH 01/55] MKL compliant code to mimic the instructions from RNP::Eigensystem in file Eigensystems.cpp because MKL lapack cannot handle NULL pointer for the matrix RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, work_, NULL, lwork); //M.P --- S4/rcwa.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/S4/rcwa.cpp b/S4/rcwa.cpp index 7ee621c7..d199e667 100644 --- a/S4/rcwa.cpp +++ b/S4/rcwa.cpp @@ -325,8 +325,11 @@ void SolveLayerEigensystem( const size_t n2 = 2*n; if((size_t)-1 == lwork){ - RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, work_, NULL, lwork); - work_[0] += n2*n2; + //M.P. (Michael Povolotskyi) Bellow I have to mimic the instructions from RNP::Eigensystem in file Eigensystems.cpp + // because MKL lapack cannot handle NULL pointer for the matrix + // RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, work_, NULL, lwork); //M.P + work_[0] = double(2*n2); //M.P. + work_[0] += n2*n2; return; }else if(0 == lwork){ lwork = n2*n2+2*n2; @@ -336,7 +339,9 @@ void SolveLayerEigensystem( size_t eigenlwork; if(NULL == work_ || lwork < n2*n2+2*n2){ lwork = (size_t)-1; - RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, q, NULL, lwork); + //M.P. Same as above + // RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, q, NULL, lwork); //M.P. + q[0] = (double)(2*n2); //M.P eigenlwork = (size_t)q[0].real(); work = (std::complex*)rcwa_malloc(sizeof(std::complex)*(eigenlwork + n2*n2)); }else{ From d29c6567c093435e8d53066e28115ca60ea919cf Mon Sep 17 00:00:00 2001 From: sajidmc Date: Mon, 11 Feb 2019 17:41:05 -0500 Subject: [PATCH 02/55] Purdue HPC compliant make files please edit for the library locations first --- MakefileHPC | 251 ++++++++++++++++++++++++++++++++++++++++++++++ gensetupHPC.py.sh | 32 ++++++ 2 files changed, 283 insertions(+) create mode 100644 MakefileHPC create mode 100644 gensetupHPC.py.sh diff --git a/MakefileHPC b/MakefileHPC new file mode 100644 index 00000000..c6bef7b5 --- /dev/null +++ b/MakefileHPC @@ -0,0 +1,251 @@ +# to find path to openmpi, type mpiexec --test , the error messege reveals path +MKL_HOME = /apps/cent7/intel/compilers_and_libraries_2017.1.132/linux/mkl +BROWN_MPI_HOME = /apps/brown/openmpi/2.1.0/gcc-5.2.0 +SNYDER_MPI_HOME = /apps/snyder7/openmpi/2.1.0_gcc-5.2.0 +MPI_HOME = $(SNYDER_MPI_HOME) + +BLAS_LIB = -L$(MKL_HOME)/lib/intel64 -Wl,-rpath=$(MKL_HOME)/lib/intel64 -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp +LAPACK_LIB = -L$(MKL_HOME)/lib/intel64 -Wl,-rpath=$(MKL_HOME)/lib/intel64 -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core + +EXTRA_FLAGS = '-Wl,-rpath=$(MKL_HOME)/lib/intel64' , '-Wl,-rpath=$(MPI_HOME)/lib' + +EXTRA_DIRS = '$(MKL_HOME)/lib/intel64' , '$(MPI_HOME)/lib' + +#BLAS_LIB = -lblas +#LAPACK_LIB = -llapack + +# OPTIONAL +# Typically if installed, +# FFTW3_INC can be left empty +# FFTW3_LIB = -lfftw3 +# or, if Fedora and/or fftw is version 3 but named fftw rather than fftw3 +# FTW3_LIB = -lfftw +# May need to link libraries properly as with blas and lapack above +FFTW3_INC = -I$(MLK_HOME)/include/fftw/ +FFTW3_LIB = $(BLAS_LIB) + +# Typically, +# PTHREAD_INC = -DHAVE_UNISTD_H +# PTHREAD_LIB = -lpthread +PTHREAD_INC = -DHAVE_UNISTD_H +PTHREAD_LIB = -lpthread + +# OPTIONAL +# If not installed: +# Fedora: dnf install libsuitsparse-devel +# Typically, if installed: +#CHOLMOD_INC = -I/usr/include/suitesparse +#CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd +#CHOLMOD_INC = -I/usr/include/suitesparse +#CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd + +# Specify the MPI library +# For example, on Fedora: dnf install openmpi-devel +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi/ompi +#MPI_LIB = -lmpi +# or, explicitly link to the library with -L, example below +MPI_LIB = -L$(MPI_HOME)/lib -Wl,-rpath=$(MPI_HOME)/lib -lmpi +MPI_INC = -I$(MPI_HOME)/include +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so + +# Specify custom compilers if needed +CXX = $(MPI_HOME)/bin/mpic++ +CC = $(MPI_HOME)/bin/mpicc + +#CFLAGS += -O3 -fPIC +CFLAGS = -O3 -msse3 -msse2 -msse -fPIC + +# options for Sampler module +OPTFLAGS = -O3 + +OBJDIR = ./build +S4_BINNAME = $(OBJDIR)/S4 +S4_LIBNAME = $(OBJDIR)/libS4.a +S4r_LIBNAME = $(OBJDIR)/libS4r.a + +##################### DO NOT EDIT BELOW THIS LINE ##################### + +#### Set the compilation flags + +CPPFLAGS = -I. -IS4 -IS4/RNP -IS4/kiss_fft + +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) + +#### 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) +$(S4r_LIBNAME): objdir $(S4r_LIBOBJS) + $(AR) crvs $@ $(S4r_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 $@ + + +$(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/LatticeGridRect.o: S4r/LatticeGridRect.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/LatticeGridArb.o: S4r/LatticeGridArb.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/POFF2Mesh.o: S4r/POFF2Mesh.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/PeriodicMesh.o: S4r/PeriodicMesh.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Shape.o: S4r/Shape.cpp S4r/Shape.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Simulation.o: S4r/Simulation.cpp S4r/Simulation.hpp S4r/StarProduct.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Layer.o: S4r/Layer.cpp S4r/Layer.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Pseudoinverse.o: S4r/Pseudoinverse.cpp S4r/Pseudoinverse.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Eigensystems.o: S4r/Eigensystems.cpp S4r/Eigensystems.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/IRA.o: S4r/IRA.cpp S4r/IRA.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/intersection.o: S4r/intersection.c S4r/intersection.h + $(CC) -c -O3 $< -o $@ +$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4r/predicates.o: S4r/predicates.c + $(CC) -c -O3 $< -o $@ + +#### Python extension + +check: + @echo $(LIBS) + +S4_pyext: objdir $(S4_LIBNAME) + echo "Linking...." + echo $(EXTRA_FLAGS) $(EXTRA_DIRS) + sh gensetupHPC.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" "$(EXTRA_FLAGS)" "$(EXTRA_DIRS)" + python setup.py build + #pip3 install --upgrade ./ + +clean: + rm S4.so + rm -rf $(OBJDIR) diff --git a/gensetupHPC.py.sh b/gensetupHPC.py.sh new file mode 100644 index 00000000..6cf65b2c --- /dev/null +++ b/gensetupHPC.py.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +OBJDIR="$1" +LIBFILE="$2" +LIBS="$3" +x1="$4" +x2="$5" + +cat < setup.py +from distutils.core import setup, Extension + +libs = ['S4', 'stdc++'] +libs.extend( [lib[2::] for lib in '$LIBS'.split()]) + +S4module = Extension('S4', + sources = [ + 'S4/main_python.c' + ], + libraries = libs, + library_dirs = ['$OBJDIR', $x2], + extra_link_args = [ + '$LIBFILE', $x1 + ], + extra_compile_args=['-std=gnu99'] +) + +setup(name = 'S4', + version = '1.1', + description = 'Stanford Stratified Structure Solver (S4): Fourier Modal Method', + ext_modules = [S4module] +) +SETUPPY From e2ed5e78cae5cd592609b4dd3cf63878a2871e06 Mon Sep 17 00:00:00 2001 From: sajidmc Date: Mon, 11 Feb 2019 17:42:10 -0500 Subject: [PATCH 03/55] Test file for the python extension --- PythonTest.py | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 PythonTest.py diff --git a/PythonTest.py b/PythonTest.py new file mode 100644 index 00000000..681d145d --- /dev/null +++ b/PythonTest.py @@ -0,0 +1,122 @@ + +# all lengths normalized in terms of a +# frequency normalized in terms of 2*pi*c/a + +# this test file plots a frequency spectrum and field plot for the python extension + +import S4 +import numpy as np +import matplotlib.pyplot as plt + +a = 1e-6; #1nm +c_const = 3e8; +print('Bontempi, Kivshar et al. \"Highly sensitive biosensors based on all-dielectric nanoresonator\"') +p = 0.96 +d = 0.73 +h = 0.22 +period = [p,p] +S = S4.New(Lattice=((period[0],0),(0,period[1])),NumBasis=20) +S.SetMaterial(Name = 'SiO2',Epsilon = (1.45 + 0.0j)**2) +S.SetMaterial(Name = 'Si',Epsilon = (3.487+0.0j)**2) +S.SetMaterial(Name = 'Vacuum',Epsilon = (1 + 0j)**2) + +S.AddLayer(Name = 'AirAbove',Thickness = 0, Material = 'Vacuum') +S.AddLayer(Name = 'AirDisp',Thickness = 1, Material = 'Vacuum') +S.AddLayer(Name = 'Si_disks',Thickness = h,Material = 'Vacuum') + +S.SetRegionCircle( + Layer = 'Si_disks', + Material = 'Si', + Center = (0,0), + Radius = d/2 +) + +S.AddLayer(Name = 'Glass_Below',Thickness = 2, Material = 'SiO2') +#S.AddLayerCopy(Name = 'AirBelow',Thickness = 0, Layer = 'AirAbove') +S.AddLayer(Name = 'AirBelow',Thickness = 0,Material = 'Vacuum') + +S.SetExcitationPlanewave( + IncidenceAngles=( + 0,# polar angle in [0,180) + 0 # azimuthal angle in [0,360) + ), + sAmplitude = 0, + pAmplitude = 1, + Order = 0 +) + +S.SetOptions( + PolarizationDecomposition = True +) + +wavelength_um = float(wavelength_p_nm)/1000; # [8.0,14.0] +freq = 1 / float(wavelength_um); +S.SetFrequency(freq) #unit 2*pi*c_const / a +forward,backward = S.GetPowerFlux(Layer = 'AirAbove', zOffset = 0) # reflected power +forward = S.GetPowerFlux(Layer = 'AirBelow',zOffset = 0) +print('f='+str(1/freq)+', Power_forward= '+str(forward[0].real)+', Power_backward='+str(backward.real)) + +# get fields at points + + + + +# frequency sweep +wavelength_space = np.linspace(1.3, 1.7, 200) + +R = wavelength_space * 0 +T=R +i=0 +for lam in wavelength_space: + f = 1 / float(lam) + S.SetFrequency(f) + (forw,back) = S.GetPowerFlux(Layer = 'AirAbove', zOffset = 0) + forw = S.GetPowerFlux(Layer = 'AirBelow', zOffset = 0) + R[i] = np.abs(forw[0]) + #T[i] = np.abs(back) + i +=1 + +plt.plot(wavelength_space, R) +#plt.hold +#plt.plot(wavelength_space, T) +plt.xlabel('Wavelength (um)') +plt.ylabel('T') +plt.title('Figure 3(a)') + +#field map + +wavelength_p_nm = 1400; +wavelength_um = float(wavelength_p_nm)/1000; # [8.0,14.0] +freq = 1 / float(wavelength_um); +S.SetFrequency(freq) #unit 2*pi*c_const / a +x_space = np.linspace(-p/2,p/2,300) +z_space = np.linspace(0.8,1.4,300) + +X,Z = np.meshgrid(x_space,z_space) +Ey = np.zeros((X.shape[0], X.shape[1])) +xc = 0 +zc = 0 + +for x in x_space: + zc=0 + #print('x='+str(x)+'\n') + for z in z_space: + #print('z='+str(z)+'\tzc='+str(zc)+'\n') + E,H = S.GetFields(x,0,z) + Ey[zc,xc] = np.abs(H[1]) ** 2 + np.abs(H[2]) ** 2 + np.abs(H[0]) ** 2 + #print(str(x)+'\t'+str(z)+'\t'+str(abs(E[1]))) + zc += 1 + xc += 1 + +fig = plt.figure() +cm = np.linspace(np.min(Ey),np.max(Ey), 100) +plt.contourf(x_space, z_space, Ey, cm) +plt.plot([-p/2, p/2], [1, 1], color='w', linestyle='-', linewidth=2) +plt.plot([-d/2, d/2], [1+h, 1+h], color='w', linestyle='-', linewidth=2) +plt.plot([-d/2, -d/2], [1, 1+h], color='w', linestyle='-', linewidth=2) +plt.plot([d/2, d/2], [1, 1+h], color='w', linestyle='-', linewidth=2) +plt.title('Figure 3(c) - |H|^2 - lam = ' + str(wavelength_p_nm)) +plt.show(block=True) + + +print('If you can read this, the configuration work is finished!') From 57eacbc6e9d5475c225701dedcb4507c04133f1a Mon Sep 17 00:00:00 2001 From: sajidmc Date: Mon, 11 Feb 2019 17:53:26 -0500 Subject: [PATCH 04/55] Update PythonTest.py fixed bug of undeclared variable --- PythonTest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonTest.py b/PythonTest.py index 681d145d..126f823e 100644 --- a/PythonTest.py +++ b/PythonTest.py @@ -49,7 +49,7 @@ PolarizationDecomposition = True ) -wavelength_um = float(wavelength_p_nm)/1000; # [8.0,14.0] +wavelength_um = 1; freq = 1 / float(wavelength_um); S.SetFrequency(freq) #unit 2*pi*c_const / a forward,backward = S.GetPowerFlux(Layer = 'AirAbove', zOffset = 0) # reflected power From 66dc25efed1984a696d611221d9783303fd45e05 Mon Sep 17 00:00:00 2001 From: sajidmc Date: Mon, 11 Feb 2019 18:03:45 -0500 Subject: [PATCH 05/55] example figure --- examples/bontempi_et_al_Nanoscale_2017.png | Bin 0 -> 48058 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/bontempi_et_al_Nanoscale_2017.png diff --git a/examples/bontempi_et_al_Nanoscale_2017.png b/examples/bontempi_et_al_Nanoscale_2017.png new file mode 100644 index 0000000000000000000000000000000000000000..049e56847fc7d0ca2a519f56a9a06160db071b87 GIT binary patch literal 48058 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 literal 0 HcmV?d00001 From 2cb92b9b4594fa6eab34735082f91158e6128e5b Mon Sep 17 00:00:00 2001 From: sajidmc Date: Mon, 11 Feb 2019 18:06:11 -0500 Subject: [PATCH 06/55] Update README --- README | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README b/README index 59691825..b78a5517 100644 --- a/README +++ b/README @@ -8,3 +8,8 @@ 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. + +sajidmc: The MakefileHPC is created to compile the S4 in HPC environment without +root access. Also added an example for python extension testing: + +![Example script](https://raw.githubusercontent.com/sajidmc/S4/master/examples/bontempi_et_al_Nanoscale_2017.png) From 5c8c9d5fe6004a899ca13f8f1a2a3d74b2080e38 Mon Sep 17 00:00:00 2001 From: Sajid Choudhury Date: Tue, 12 Feb 2019 15:08:59 -0500 Subject: [PATCH 07/55] Updated the PythonTest.py to quickly give results and output a POV file --- PythonTest.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/PythonTest.py b/PythonTest.py index 126f823e..a3678a41 100644 --- a/PythonTest.py +++ b/PythonTest.py @@ -7,6 +7,9 @@ import S4 import numpy as np import matplotlib.pyplot as plt +import time + +t = time.time() a = 1e-6; #1nm c_const = 3e8; @@ -56,13 +59,13 @@ forward = S.GetPowerFlux(Layer = 'AirBelow',zOffset = 0) print('f='+str(1/freq)+', Power_forward= '+str(forward[0].real)+', Power_backward='+str(backward.real)) -# get fields at points - +# output POV file +S.OutputStructurePOVRay(Filename = 'output_PythonTest.pov') # frequency sweep -wavelength_space = np.linspace(1.3, 1.7, 200) +wavelength_space = np.linspace(1.3, 1.7, 100) R = wavelength_space * 0 T=R @@ -89,8 +92,8 @@ wavelength_um = float(wavelength_p_nm)/1000; # [8.0,14.0] freq = 1 / float(wavelength_um); S.SetFrequency(freq) #unit 2*pi*c_const / a -x_space = np.linspace(-p/2,p/2,300) -z_space = np.linspace(0.8,1.4,300) +x_space = np.linspace(-p/2,p/2,200) +z_space = np.linspace(0.8,1.4,200) X,Z = np.meshgrid(x_space,z_space) Ey = np.zeros((X.shape[0], X.shape[1])) @@ -118,5 +121,6 @@ plt.title('Figure 3(c) - |H|^2 - lam = ' + str(wavelength_p_nm)) plt.show(block=True) - +elapsed = time.time()-t; +print('Elapsed time = '+str(elapsed)+'s') print('If you can read this, the configuration work is finished!') From 6e3113ffce64a096404e856624cd7de3932f6199 Mon Sep 17 00:00:00 2001 From: sajidmc Date: Tue, 12 Feb 2019 15:15:17 -0500 Subject: [PATCH 08/55] Update README --- README | 1 + 1 file changed, 1 insertion(+) diff --git a/README b/README index b78a5517..ccdcf00a 100644 --- a/README +++ b/README @@ -12,4 +12,5 @@ addresses, and other important information. sajidmc: The MakefileHPC is created to compile the S4 in HPC environment without root access. Also added an example for python extension testing: +Check Wiki for details: https://github.com/sajidmc/S4/wiki ![Example script](https://raw.githubusercontent.com/sajidmc/S4/master/examples/bontempi_et_al_Nanoscale_2017.png) From f677db233c30b6db464d165c35a247841856ddff Mon Sep 17 00:00:00 2001 From: sajidmc Date: Tue, 12 Feb 2019 15:15:52 -0500 Subject: [PATCH 09/55] Update README --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index ccdcf00a..01463429 100644 --- a/README +++ b/README @@ -13,4 +13,4 @@ sajidmc: The MakefileHPC is created to compile the S4 in HPC environment without root access. Also added an example for python extension testing: Check Wiki for details: https://github.com/sajidmc/S4/wiki -![Example script](https://raw.githubusercontent.com/sajidmc/S4/master/examples/bontempi_et_al_Nanoscale_2017.png) +Example result: https://raw.githubusercontent.com/sajidmc/S4/master/examples/bontempi_et_al_Nanoscale_2017.png From 501df2662113485288cda7d485bb1ca3dc245166 Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Fri, 12 Jul 2019 13:08:24 +0100 Subject: [PATCH 10/55] fix ordered comparison between pointer and zero error when compiling --- S4/S4.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/S4/S4.cpp b/S4/S4.cpp index 3fab8afd..d0ac9dfe 100644 --- a/S4/S4.cpp +++ b/S4/S4.cpp @@ -1072,7 +1072,7 @@ int Simulation_ChangeLayerThickness(Simulation *S, Layer *layer, const double *t int ret = 0; if(NULL == S){ ret = -1; } if(NULL == layer){ ret = -2; } - if(thick < 0){ ret = -3; } + if(NULL == thick || *thick < 0){ ret = -3; } if(0 != ret){ S4_TRACE("< Simulation_RemoveLayerPatterns (failed; ret = %d) [omega=%f]\n", ret, S->omega[0]); return ret; From 0fa13cd0602934bbff2b0f37ff7ea53bb8525967 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Sun, 28 Jul 2019 14:47:00 +0100 Subject: [PATCH 11/55] Update README --- README | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README b/README index 59691825..a563f4c4 100644 --- a/README +++ b/README @@ -1,3 +1,22 @@ +INSTALLATION INSTRUCTIONS (64-bit Ubuntu): +---- + +git clone https://github.com/phoebe-p/S4 +cd S4 +make clean +make boost +make +make S4_pyext + +If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile: +pip3 install --upgrade ./ + +to e.g.: +[path of target python] setup.py install + +------------------------------------- + + S4: Stanford Stratified Structure Solver (http://fan.group.stanford.edu/S4/) A program for computing electromagnetic fields in periodic, layered @@ -8,3 +27,4 @@ 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. + From 011c068e259dcb1537fe57e73d7c827b3bbda8f1 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 29 Jul 2019 09:12:22 +0100 Subject: [PATCH 12/55] Update README --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index a563f4c4..a48c58c9 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -INSTALLATION INSTRUCTIONS (64-bit Ubuntu): +INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16.04): ---- git clone https://github.com/phoebe-p/S4 From bce9c42279bc82ba157887913a4c9f40d5ca2c5e Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Tue, 30 Jul 2019 21:40:21 +0100 Subject: [PATCH 13/55] fix call to Eigensystem which causes segmentation faults on some operating systems --- S4/rcwa.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/S4/rcwa.cpp b/S4/rcwa.cpp index 7b4c2632..f2ddf4bd 100644 --- a/S4/rcwa.cpp +++ b/S4/rcwa.cpp @@ -325,7 +325,8 @@ void SolveLayerEigensystem( const size_t n2 = 2*n; if((size_t)-1 == lwork){ - RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, work_, NULL, lwork); + double dum; + RNP::Eigensystem(n2, NULL, n2, q, NULL, 1, phi, n2, work_, &dum, lwork); work_[0] += n2*n2; return; }else if(0 == lwork){ From 9ff7e1e62db27cfb33be7c1aa545476f29c4ceb3 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 15 Aug 2019 12:46:03 +0100 Subject: [PATCH 14/55] Update README --- README | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README b/README index 0f40b899..1ffceb26 100644 --- a/README +++ b/README @@ -1,12 +1,16 @@ -INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16.04): +DETAILED INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16 or 18): ---- +Key steps: + +``` git clone https://github.com/phoebe-p/S4 cd S4 make clean make boost make make S4_pyext +``` If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile: pip3 install --upgrade ./ From 2ab822422cb476009b0570c3194e172607cc7afa Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 15 Aug 2019 12:48:49 +0100 Subject: [PATCH 15/55] Update README --- README | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README b/README index 1ffceb26..5ba33f11 100644 --- a/README +++ b/README @@ -3,15 +3,25 @@ DETAILED INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16 or 18): Key steps: -``` -git clone https://github.com/phoebe-p/S4 +```git clone https://github.com/phoebe-p/S4 cd S4 -make clean make boost -make make S4_pyext ``` +To install all the relevant libraries: + +```sudo apt-get update +sudo apt install make +sudo apt install git +sudo apt install python3-pip +sudo pip3 install numpy matplotlib scipy +sudo apt-get install python3-tk +sudo apt-get install libopenblas-dev +sudo apt-get install libfftw3-dev +sudo apt-get install libsuitesparse-dev +``` + If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile: pip3 install --upgrade ./ From 0a74f1f208741f86eff21b8fba5c06a3f1e6dfa0 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 15 Aug 2019 12:52:01 +0100 Subject: [PATCH 16/55] Update README --- README | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README b/README index 5ba33f11..dc8a68c7 100644 --- a/README +++ b/README @@ -1,15 +1,15 @@ -DETAILED INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16 or 18): ----- +#DETAILED INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16 or 18): -Key steps: +##Key steps: -```git clone https://github.com/phoebe-p/S4 +``` +git clone https://github.com/phoebe-p/S4 cd S4 make boost make S4_pyext ``` -To install all the relevant libraries: +##Installing relevant libraries etc.: ```sudo apt-get update sudo apt install make @@ -30,7 +30,6 @@ to e.g.: ------------------------------------- - S4: Stanford Stratified Structure Solver (http://fan.group.stanford.edu/S4/) A program for computing electromagnetic fields in periodic, layered @@ -42,6 +41,7 @@ description of the package and its user interface, as well as installation instructions, the license and copyright, contact addresses, and other important information. +--------------------------------------- sajidmc: The MakefileHPC is created to compile the S4 in HPC environment without root access. Also added an example for python extension testing: From 8db930b3d0e87cd29bd71c8aaeeeba27ac0368db Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 15 Aug 2019 12:52:32 +0100 Subject: [PATCH 17/55] Rename README to README.md --- README => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README => README.md (100%) diff --git a/README b/README.md similarity index 100% rename from README rename to README.md From ce899b8d9dabb9b7dbb765bf9bc18947e7c5f911 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 15 Aug 2019 12:55:49 +0100 Subject: [PATCH 18/55] Update README.md --- README.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dc8a68c7..abd4a33c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -#DETAILED INSTALLATION INSTRUCTIONS (64-bit Ubuntu 16 or 18): +# Details installation instructions (64-bit Ubuntu 16 or 18): -##Key steps: +## Key steps: ``` git clone https://github.com/phoebe-p/S4 @@ -9,7 +9,7 @@ make boost make S4_pyext ``` -##Installing relevant libraries etc.: +## Installing relevant libraries etc.: ```sudo apt-get update sudo apt install make @@ -22,11 +22,20 @@ sudo apt-get install libfftw3-dev sudo apt-get install libsuitesparse-dev ``` -If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile: +- libopenblas installs OpenBLAS, to satisfy the LAPACK and BLAS requirements +- lib fftw3 install FFTW3, to satisfy the FFTW requirements +- libsuitesparse install libraries to satisdy CHOLMOD & related requirements + +*If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile:* + +```` pip3 install --upgrade ./ +```` to e.g.: -[path of target python] setup.py install +``` +[path of target python or virtual environment] setup.py install +``` ------------------------------------- From c7b98829cf664b8c3f52b5749699534908a5a1a3 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 15 Aug 2019 12:56:12 +0100 Subject: [PATCH 19/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index abd4a33c..9c0b42aa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Details installation instructions (64-bit Ubuntu 16 or 18): +# Detailed installation instructions (64-bit Ubuntu 16 or 18): ## Key steps: From 08aaebf29687a0bc912bd905a9c6569d81a84cb9 Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Tue, 13 Oct 2020 13:00:12 +0100 Subject: [PATCH 20/55] Update MacOS/OSX Makefile to include fftw and suitesparse libraries, assuming installation via Homebrew --- Makefile.osx | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/Makefile.osx b/Makefile.osx index 1e761a01..ae787226 100644 --- a/Makefile.osx +++ b/Makefile.osx @@ -6,12 +6,6 @@ # Set these to the flags needed to link against BLAS and Lapack. # If left blank, then performance may be very poor. -# On Mac OS, -# BLAS_LIB = -framework vecLib -# LAPACK_LIB = -framework vecLib -# On Debian, with reference BLAS and Lapack (slow) -# BLAS_LIB = -lblas -# LAPACK_LIB = -llapack BLAS_LIB = -framework Accelerate LAPACK_LIB = -framework Accelerate @@ -19,14 +13,14 @@ LAPACK_LIB = -framework Accelerate # Recommended: build lua in the current directory, and link against this local version # LUA_INC = -I./lua-5.2.4/install/include # LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -LUA_INC = -I./lua-5.2.4/install/include -LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl +# LUA_INC = -I./lua-5.2.4/install/include +# LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -# Typically if installed, +# Typically if installed (use Homebrew, brew install fifth), # FFTW3_INC can be left empty # FFTW3_LIB = -lfftw3 -FFTW3_INC = -FFTW3_LIB = +FFTW3_INC = -I/usr/local/include +FFTW3_LIB = -lfftw3 # Typically, # PTHREAD_INC = -DHAVE_UNISTD_H -lpthread @@ -34,11 +28,9 @@ FFTW3_LIB = PTHREAD_INC = -DHAVE_UNISTD_H PTHREAD_LIB = -lpthread -# Typically if installed, -# CHOLMOD_INC = -I/usr/local/include -# CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd -CHOLMOD_INC = -CHOLMOD_LIB = +# Typically if installed (use Home-brew, brew install suite-sparse), +CHOLMOD_INC = -I/usr/local/include +CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd # Specify the MPI library MPI_INC = From d89d4b7905a8f292f5c73b38d1767c81a096b44b Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Tue, 13 Oct 2020 13:05:15 +0100 Subject: [PATCH 21/55] Update MacOS/OSX Makefile to include fftw and suitesparse libraries, assuming installation via Homebrew (fix typo) --- Makefile.osx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.osx b/Makefile.osx index ae787226..856fd68e 100644 --- a/Makefile.osx +++ b/Makefile.osx @@ -16,7 +16,7 @@ LAPACK_LIB = -framework Accelerate # LUA_INC = -I./lua-5.2.4/install/include # LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -# Typically if installed (use Homebrew, brew install fifth), +# Typically if installed (use Homebrew, brew install fftw), # FFTW3_INC can be left empty # FFTW3_LIB = -lfftw3 FFTW3_INC = -I/usr/local/include From 7320712037fb279a04682879b5210c915576ed5d Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Tue, 13 Oct 2020 13:27:27 +0100 Subject: [PATCH 22/55] add boost library stuff to Makefile.osx --- Makefile.osx | 90 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 20 deletions(-) diff --git a/Makefile.osx b/Makefile.osx index 856fd68e..bb009590 100644 --- a/Makefile.osx +++ b/Makefile.osx @@ -32,6 +32,13 @@ PTHREAD_LIB = -lpthread CHOLMOD_INC = -I/usr/local/include CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd + +BOOST_PREFIX=-I/usr/local +BOOST_INC = -I$(BOOST_PREFIX)/include +BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization +boost: $(BOOST_PREFIX)/lib + + # Specify the MPI library MPI_INC = MPI_LIB = @@ -50,16 +57,72 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a +#### Download, compile, and install boost serialization lib. +#### This should all work fine, you must modify BOOST_INC, BOOST_LIBS, +#### and PREFIX if you want to install boost to a different location + +# Specify the paths to the boost include and lib directories +BOOST_PREFIX=${CURDIR}/S4 +BOOST_INC = -I$(BOOST_PREFIX)/include +BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization +BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz +BOOST_FILE=boost.tar.gz +# Target for downloading boost from above URL +$(BOOST_FILE): + wget $(BOOST_URL) -O $(BOOST_FILE) + +# Target for extracting boost from archive and compiling. Depends on download target above +${CURDIR}/S4/lib: $(BOOST_FILE) + $(eval BOOST_DIR := $(shell tar tzf $(BOOST_FILE) | sed -e 's@/.*@@' | uniq)) + @echo Boost dir is $(BOOST_DIR) + tar -xzvf $(BOOST_FILE) + mv $(BOOST_DIR) boost_src + cd boost_src && ./bootstrap.sh --with-libraries=serialization --prefix=$(BOOST_PREFIX) && ./b2 install +# Final target which pulls everything together +boost: $(BOOST_PREFIX)/lib + ##################### DO NOT EDIT BELOW THIS LINE ##################### + #### Set the compilation flags -CPPFLAGS = -I. -IS4 -IS4/RNP -IS4/kiss_fft +CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft + +ifeq ($(S4_PROF), 1) +CPPFLAGS += -g -pg +endif + +ifeq ($(S4_DEBUG), 1) +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 2) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 3) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -DDUMP_MATRICES +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 4) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -DDUMP_MATRICES +CPPFLAGS += -DDUMP_MATRICES_LARGE +CPPFLAGS += -ggdb +endif + +ifdef BOOST_INC + CPPFLAGS += $(BOOST_INC) $(BOOST_LIBS) +endif ifdef BLAS_LIB CPPFLAGS += -DHAVE_BLAS endif + ifdef LAPACK_LIB CPPFLAGS += -DHAVE_LAPACK endif @@ -80,7 +143,7 @@ ifdef MPI_LIB CPPFLAGS += -DHAVE_MPI $(MPI_INC) endif -LIBS = $(BLAS_LIB) $(LAPACK_LIB) $(FFTW3_LIB) $(PTHREAD_LIB) $(CHOLMOD_LIB) +LIBS = $(BLAS_LIB) $(LAPACK_LIB) $(FFTW3_LIB) $(PTHREAD_LIB) $(CHOLMOD_LIB) $(MPI_LIB) $(BOOST_LIBS) #### Compilation targets @@ -91,7 +154,7 @@ objdir: mkdir -p $(OBJDIR)/S4k mkdir -p $(OBJDIR)/S4r mkdir -p $(OBJDIR)/modules - + S4_LIBOBJS = \ $(OBJDIR)/S4k/S4.o \ $(OBJDIR)/S4k/rcwa.o \ @@ -227,7 +290,6 @@ $(OBJDIR)/S4r/predicates.o: S4r/predicates.c $(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ - S4lua: $(OBJDIR)/S4k/main_lua.o $(S4_LIBNAME) sampler $(CXX) $(CFLAGS) $(CPPFLAGS) $< -o $(S4_BINNAME) $(S4_LIBNAME) $(LIBS) $(LUA_LIB) @@ -243,29 +305,17 @@ S4rlua: objdir $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/ sampler: FunctionSampler1D.so FunctionSampler2D.so FunctionSampler1D.so: modules/function_sampler_1d.c modules/function_sampler_1d.h modules/lua_function_sampler_1d.c gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_1d.c -o $(OBJDIR)/modules/function_sampler_1d.o - gcc $(OPTFLAGS) -bundle -undefined dynamic_lookup -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler1D.so $(OBJDIR)/modules/function_sampler_1d.o modules/lua_function_sampler_1d.c + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler1D.so $(OBJDIR)/modules/function_sampler_1d.o modules/lua_function_sampler_1d.c $(LUA_LIB) FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d.h modules/lua_function_sampler_2d.c gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_2d.c -o $(OBJDIR)/modules/function_sampler_2d.o gcc -c -O2 -fpic -Wall -I. modules/predicates.c -o $(OBJDIR)/modules/mod_predicates.o - gcc $(OPTFLAGS) -bundle -undefined dynamic_lookup -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler2D.so $(OBJDIR)/modules/function_sampler_2d.o $(OBJDIR)/modules/mod_predicates.o modules/lua_function_sampler_2d.c - - + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler2D.so $(OBJDIR)/modules/function_sampler_2d.o $(OBJDIR)/modules/mod_predicates.o modules/lua_function_sampler_2d.c $(LUA_LIB) #### Python extension S4_pyext: objdir $(S4_LIBNAME) - echo "$(LIBS)" > $(OBJDIR)/tmp.txt - sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) - python setup.py build - -#### R extension - -S4_R_frontend: objdir $(S4_LIBNAME) - R CMD BUILD RCWA - R CMD INSTALL RCWA - -################################################# + sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) + pip3 install --upgrade ./ clean: rm -rf $(OBJDIR) - From 05cd540836ac3c059ef0576490e53f711b14318d Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Tue, 13 Oct 2020 16:33:02 +0100 Subject: [PATCH 23/55] update boost download to newest version@ --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1b305a7c..79db193f 100644 --- a/Makefile +++ b/Makefile @@ -99,7 +99,7 @@ S4r_LIBNAME = $(OBJDIR)/libS4r.a BOOST_PREFIX=${CURDIR}/S4 BOOST_INC = -I$(BOOST_PREFIX)/include BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization -BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz +BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.74.0/boost_1_74_0.tar.gz BOOST_FILE=boost.tar.gz # Target for downloading boost from above URL $(BOOST_FILE): From 4c26146e606a6741e7761c4966047ff21f70f2e5 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 14 Oct 2020 12:12:17 +0100 Subject: [PATCH 24/55] Update README.md --- README.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9c0b42aa..b8cb5f02 100644 --- a/README.md +++ b/README.md @@ -11,21 +11,26 @@ make S4_pyext ## Installing relevant libraries etc.: -```sudo apt-get update -sudo apt install make -sudo apt install git -sudo apt install python3-pip -sudo pip3 install numpy matplotlib scipy -sudo apt-get install python3-tk -sudo apt-get install libopenblas-dev -sudo apt-get install libfftw3-dev -sudo apt-get install libsuitesparse-dev +**On Ubuntu (with a working version of Python3):** + +``` +sudo apt-get update +sudo apt install make git gcc g++ +sudo apt-get install libopenblas-dev libfftw3-dev libsuitesparse-dev ``` - libopenblas installs OpenBLAS, to satisfy the LAPACK and BLAS requirements - lib fftw3 install FFTW3, to satisfy the FFTW requirements - libsuitesparse install libraries to satisdy CHOLMOD & related requirements +**On MacOS using Homebrew:** + +``` +brew install fftw suite-sparse openblas lapack +``` + +You can get the make and git commands from homebrew, or through Apple Developer Tools. If the packages are installed/symlinked by Homebrew to the default location (/usr/local/include) you should not have to modify the Makefile, and you should be able to use the same Makefile as Ubuntu/Linux (i.e. no need to use Makefile.osx). + *If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile:* ```` @@ -37,6 +42,10 @@ to e.g.: [path of target python or virtual environment] setup.py install ``` +You can install S4 into a vitual environment automatically by just activating that environment in your terminal before running `make S4_pyext`. + +See [here](https://rayflare.readthedocs.io/en/latest/Installation/installation.html) for more extensive instructions. + ------------------------------------- S4: Stanford Stratified Structure Solver (http://fan.group.stanford.edu/S4/) From 9cffe4f18dac0a61a92fa8625a75398643dd0069 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 14 Oct 2020 12:15:47 +0100 Subject: [PATCH 25/55] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b8cb5f02..a409ba44 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Detailed installation instructions (64-bit Ubuntu 16 or 18): +# Installation instructions (64-bit Ubuntu 16/18/20 or MacOS): ## Key steps: @@ -9,6 +9,9 @@ make boost make S4_pyext ``` +Make boost automatically downloads and compiles the relevant Boost libraries in the local S4 directory. This version of boost will be automatically linked when +compiling during `make S4_pyext`. If you want to use Boost libraries in a different location you will have to edit the Makefile. + ## Installing relevant libraries etc.: **On Ubuntu (with a working version of Python3):** From c37ae141bdc29ffcff92b86b11144966deb409c7 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 14 Oct 2020 12:16:04 +0100 Subject: [PATCH 26/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a409ba44..e3b439d3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ make boost make S4_pyext ``` -Make boost automatically downloads and compiles the relevant Boost libraries in the local S4 directory. This version of boost will be automatically linked when +`make boost` automatically downloads and compiles the relevant Boost libraries in the local S4 directory. This version of boost will be automatically linked when compiling during `make S4_pyext`. If you want to use Boost libraries in a different location you will have to edit the Makefile. ## Installing relevant libraries etc.: From 69aac7ad4285d0aaa201ebb77a7aeb12839bfdd6 Mon Sep 17 00:00:00 2001 From: phoebe-p Date: Thu, 22 Apr 2021 20:18:40 +0100 Subject: [PATCH 27/55] This commit significantly changes the behaviour of the Lanczos smoothing parameters. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ‘mp1’ is proportional to the ’Width’ option​. ’Jinc’ calculates J1(2 π z)/(π z) where z is the argument passed into the function. The Bessel function itself is 0 at z = 0, but because of the division by π z is 1 when the argument z is zero.​ ‘fr’ is calculated from the G-vectors describing the different diffraction orders in reciprocal space and is thus of the same order of magnitude as the G-vectors, which have an order of magnitude of 1/(length scale of unit cell), so if everything is specified in nm, a typical unit cell of e.g. 500 nm gives: 1/500 = order of 1 x 10-3. So in this case, the argument going into the Jinc function will always be << 1; the numerator (fr) is of the order 1 x 10-3, and is always divided by at least 1 because the denominator is ‘2*mp1 + 1’. This means the Bessel function always returns 1, or something extremely close to 1 (so the ‘power’ parameter, which just takes the calculated smoothing factor and raises it to the power specified, also does nothing, because 1 to any power is still 1). This meant that regardless of which options you choose to pass for LanczosSmoothing, nothing really happens, because all you are doing is pre-multiplying things by 1.​ In any case, the inclusion of the constant ‘1’ makes no sense to me because it clearly ruins the scale-insensitivity of the implementation. I “fixed” the problem by simply removing the ‘+1’. This seems like a minor change but it significantly affects the behaviour of the LanczosSmoothing parameters passed to S4. --- S4/fmm/fmm_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/S4/fmm/fmm_common.cpp b/S4/fmm/fmm_common.cpp index 858834c9..1716fde7 100644 --- a/S4/fmm/fmm_common.cpp +++ b/S4/fmm/fmm_common.cpp @@ -52,7 +52,7 @@ double GetLanczosSmoothingFactor(double mp1, int power, double f[2]){ double GetLanczosSmoothingFactor(double mp1, int power, double f[2]){ double fr = hypot(f[0],f[1]); //fprintf(stderr, "%f\t%f\t%f\t%f\t%f\n", f[0], f[1], fr, mp1, 2*mp1+1-fr); - double j = Jinc(fr/(2*mp1+1)); + double j = Jinc(fr/(2*mp1)); return pow(j, power); } From 37999d5569a9166f5bf173db7d83d7276c51e8df Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 12 Oct 2021 15:26:28 +0200 Subject: [PATCH 28/55] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3b439d3..8e6b87da 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +If you are looking for a more user-friendly interface to S4 (wavelength-dependent calculations, material management etc.), check out my Python3 package [RayFlare](https://rayflare.readthedocs.io) + # Installation instructions (64-bit Ubuntu 16/18/20 or MacOS): ## Key steps: @@ -45,7 +47,7 @@ to e.g.: [path of target python or virtual environment] setup.py install ``` -You can install S4 into a vitual environment automatically by just activating that environment in your terminal before running `make S4_pyext`. +You can install S4 into a virtual environment automatically by just activating that environment in your terminal before running `make S4_pyext`. See [here](https://rayflare.readthedocs.io/en/latest/Installation/installation.html) for more extensive instructions. From 394d5232dd58fa824310ccd2e0b6fd6d2bba7c68 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 21 Dec 2021 18:44:02 +0100 Subject: [PATCH 29/55] remove lines causing implicit function declaration errors --- S4/main_python.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/S4/main_python.c b/S4/main_python.c index 376f6bbc..6cd3637b 100644 --- a/S4/main_python.c +++ b/S4/main_python.c @@ -664,14 +664,16 @@ static PyObject *S4Sim_Clone(S4Sim *self, PyObject *args){ } return (PyObject*)cpy; } + static PyObject *S4Sim_LoadSolution(S4Sim *self, PyObject *args, PyObject *kwds){ //printf"Inside S4Sim_LoadSolution\n"); static char *kwlist[] = { "Filename", NULL }; const char *fname; - if(!PyArg_ParseTupleAndKeywords(args, kwds, "s:LoadSolution", kwlist, &fname)){ return NULL; } + // int err; + + if(!PyArg_ParseTupleAndKeywords(args, kwds, "s:LoadSolution", kwlist, &fname)){ return NULL; } //printf"Parsed args!\n"); - int err; - err = Simulation_LoadSolution(&(self->S), fname); + // err = Simulation_LoadSolution(&(self->S), fname); // if (err != 0){ // HandleSolutionErrorCode("Simulation_LoadSolution", err); // } @@ -682,11 +684,11 @@ static PyObject *S4Sim_SaveSolution(S4Sim *self, PyObject *args, PyObject *kwds) static char *kwlist[] = { "Filename", NULL }; const char *fname; if(!PyArg_ParseTupleAndKeywords(args, kwds, "s:SaveSolution", kwlist, &fname)){ return NULL; } - int err; - err = Simulation_SaveSolution(&(self->S), fname); - if (err != 0){ - HandleSolutionErrorCode("Simulation_SaveSolution", err); - } + // int err; + // err = Simulation_SaveSolution(&(self->S), fname); + // if (err != 0){ + // HandleSolutionErrorCode("Simulation_SaveSolution", err); + // } Py_RETURN_NONE; } From ee52adb92de81dc02272a9384dd77ef3f355a7fb Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 21 Dec 2021 22:11:25 +0100 Subject: [PATCH 30/55] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8e6b87da..3b781e9b 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,10 @@ If you are looking for a more user-friendly interface to S4 (wavelength-dependen ``` git clone https://github.com/phoebe-p/S4 cd S4 -make boost make S4_pyext ``` -`make boost` automatically downloads and compiles the relevant Boost libraries in the local S4 directory. This version of boost will be automatically linked when -compiling during `make S4_pyext`. If you want to use Boost libraries in a different location you will have to edit the Makefile. +Running the `make boost` command before `make S4_pyext` should automatically download and compile the relevant Boost libraries in the local S4 directory. HOWEVER, this appears to cause problems on macOS, so if you are installing on macOS you should install the boost libraries using Homebrew (see below). If you want to use Boost libraries in a different location you will have to edit the Makefile. ## Installing relevant libraries etc.: @@ -21,22 +19,24 @@ compiling during `make S4_pyext`. If you want to use Boost libraries in a differ ``` sudo apt-get update sudo apt install make git gcc g++ -sudo apt-get install libopenblas-dev libfftw3-dev libsuitesparse-dev +sudo apt install libopenblas-dev libfftw3-dev libsuitesparse-dev ``` - libopenblas installs OpenBLAS, to satisfy the LAPACK and BLAS requirements - lib fftw3 install FFTW3, to satisfy the FFTW requirements - libsuitesparse install libraries to satisdy CHOLMOD & related requirements +If you want, you can also install the boost libraries using `sudo apt install libboost-all-dev` instead of running `make boost`. + **On MacOS using Homebrew:** ``` -brew install fftw suite-sparse openblas lapack +brew install fftw suite-sparse openblas lapack boost ``` You can get the make and git commands from homebrew, or through Apple Developer Tools. If the packages are installed/symlinked by Homebrew to the default location (/usr/local/include) you should not have to modify the Makefile, and you should be able to use the same Makefile as Ubuntu/Linux (i.e. no need to use Makefile.osx). -*If you have multiple Python versions, you make need to modify the S4_pyext part of the Makefile:* +*If you have multiple Python versions, you may need to modify the S4_pyext part of the Makefile:* ```` pip3 install --upgrade ./ From 069a7952f893475f88246eb9c6ba14f552cd6e6d Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 22 Feb 2022 11:41:06 +1100 Subject: [PATCH 31/55] add new Makefile.m1 for compiling on new Apple silicon (ARM) chips --- Makefile | 28 ++++----- Makefile.osx => Makefile.m1 | 118 ++++++++++++++++++++---------------- 2 files changed, 80 insertions(+), 66 deletions(-) rename Makefile.osx => Makefile.m1 (77%) diff --git a/Makefile b/Makefile index 79db193f..f7b9b17e 100644 --- a/Makefile +++ b/Makefile @@ -91,9 +91,9 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -#### Download, compile, and install boost serialization lib. +#### Download, compile, and install boost serialization lib. #### This should all work fine, you must modify BOOST_INC, BOOST_LIBS, -#### and PREFIX if you want to install boost to a different location +#### and PREFIX if you want to install boost to a different location # Specify the paths to the boost include and lib directories BOOST_PREFIX=${CURDIR}/S4 @@ -106,7 +106,7 @@ $(BOOST_FILE): wget $(BOOST_URL) -O $(BOOST_FILE) # Target for extracting boost from archive and compiling. Depends on download target above -${CURDIR}/S4/lib: $(BOOST_FILE) +${CURDIR}/S4/lib: $(BOOST_FILE) $(eval BOOST_DIR := $(shell tar tzf $(BOOST_FILE) | sed -e 's@/.*@@' | uniq)) @echo Boost dir is $(BOOST_DIR) tar -xzvf $(BOOST_FILE) @@ -120,32 +120,32 @@ boost: $(BOOST_PREFIX)/lib #### Set the compilation flags -CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft - +CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft + ifeq ($(S4_PROF), 1) CPPFLAGS += -g -pg endif ifeq ($(S4_DEBUG), 1) -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifeq ($(S4_DEBUG), 2) CPPFLAGS += -DENABLE_S4_TRACE -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifeq ($(S4_DEBUG), 3) CPPFLAGS += -DENABLE_S4_TRACE CPPFLAGS += -DDUMP_MATRICES -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifeq ($(S4_DEBUG), 4) CPPFLAGS += -DENABLE_S4_TRACE CPPFLAGS += -DDUMP_MATRICES CPPFLAGS += -DDUMP_MATRICES_LARGE -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifdef BOOST_INC @@ -188,7 +188,7 @@ objdir: mkdir -p $(OBJDIR)/S4k mkdir -p $(OBJDIR)/S4r mkdir -p $(OBJDIR)/modules - + S4_LIBOBJS = \ $(OBJDIR)/S4k/S4.o \ $(OBJDIR)/S4k/rcwa.o \ @@ -288,7 +288,7 @@ $(OBJDIR)/S4k/convert.o: S4/convert.c $(OBJDIR)/S4k/Eigensystems.o: S4/RNP/Eigensystems.cpp $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - + $(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp @@ -315,11 +315,11 @@ $(OBJDIR)/S4r/IRA.o: S4r/IRA.cpp S4r/IRA.hpp S4r/Types.hpp $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ $(OBJDIR)/S4r/intersection.o: S4r/intersection.c S4r/intersection.h $(CC) -c -O3 $< -o $@ -$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h +$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ $(OBJDIR)/S4r/predicates.o: S4r/predicates.c $(CC) -c -O3 $< -o $@ - + #### Lua Frontend $(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir @@ -352,4 +352,4 @@ S4_pyext: objdir $(S4_LIBNAME) pip3 install --upgrade ./ clean: - rm -rf $(OBJDIR) + rm -rf $(OBJDIR) \ No newline at end of file diff --git a/Makefile.osx b/Makefile.m1 similarity index 77% rename from Makefile.osx rename to Makefile.m1 index bb009590..2c3ab4ad 100644 --- a/Makefile.osx +++ b/Makefile.m1 @@ -1,53 +1,87 @@ # To build: # make -# Use either 'S4lua' for Lua, or 'python_ext' for Python. -# S4lua also builds FunctionSampler1D and FunctionSampler2D, in modules. -# You can build the sampler seperately with 'make sampler' +# Use the 'lib' target first to build the library, then either the Lua +# or Python targets are 'S4lua' and 'python_ext', respectively. # Set these to the flags needed to link against BLAS and Lapack. # If left blank, then performance may be very poor. -BLAS_LIB = -framework Accelerate -LAPACK_LIB = -framework Accelerate +# On Mac OS, +# BLAS_LIB = -framework vecLib +# LAPACK_LIB = -framework vecLib +# On Fedora: dnf install openblas-devel +# On Debian and Fedora, with reference BLAS and Lapack (slow) +# BLAS_LIB = -lblas +# LAPACK_LIB = -llapack +# NOTE: on Fedora, need to link blas and lapack properly, where X.X.X is some version numbers +# Linking Command Example: sudo ln -s /usr/lib64/liblapack.so.X.X.X /usr/lib64/liblapack.so +# blas Example: sudo ln -s /usr/lib64/libopeblas64.so.X.X.X /usr/lib64/libblas.so +# Can also use -L to link to the explicit libary path +# For example to use blas/lapack or even mkl installed in a anaconda conda environment: +# BLAS_LIB = -L$(CONDA_PREFIX)/lib/ -lmkl_core -lmkl_rt -lstdc++ -lpthread -lm -ldl +# LAPACK_LIB = -L$(CONDA_PREFIX)/lib/ -lmkl_core -lmkl_rt -lstdc++ -lpthread -lm -ldl +BLAS_LIB = -lblas +LAPACK_LIB = -llapack # Specify the flags for Lua headers and libraries (only needed for Lua frontend) # Recommended: build lua in the current directory, and link against this local version # LUA_INC = -I./lua-5.2.4/install/include -# LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -# LUA_INC = -I./lua-5.2.4/install/include -# LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl +# LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm +LUA_INC = -I./lua-5.2.4/install/include +LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm -# Typically if installed (use Homebrew, brew install fftw), +# OPTIONAL +# Typically if installed, # FFTW3_INC can be left empty -# FFTW3_LIB = -lfftw3 -FFTW3_INC = -I/usr/local/include +# FFTW3_LIB = -lfftw3 +# or, if Fedora and/or fftw is version 3 but named fftw rather than fftw3 +# FTW3_LIB = -lfftw +# May need to link libraries properly as with blas and lapack above +# FFTW3_INC = -I$(CONDA_PREFIX)/include/ +# FFTW3_LIB = -L$(CONDA_PREFIX)/lib/ -lfftw3 +FFTW3_INC = FFTW3_LIB = -lfftw3 # Typically, -# PTHREAD_INC = -DHAVE_UNISTD_H -lpthread +# PTHREAD_INC = -DHAVE_UNISTD_H # PTHREAD_LIB = -lpthread -PTHREAD_INC = -DHAVE_UNISTD_H -PTHREAD_LIB = -lpthread - -# Typically if installed (use Home-brew, brew install suite-sparse), -CHOLMOD_INC = -I/usr/local/include +# If conda env +# PTHREAD_LIB = -L$(CONDA_PREFIX)/lib/ -lpthread +PTHREAD_INC = -DHAVE_UNISTD_H +#PTHREAD_LIB = -lpthread + +# OPTIONAL +# If not installed: +# Fedora: dnf install libsuitsparse-devel +# Typically, if installed: +#CHOLMOD_INC = -I/usr/include/suitesparse +#CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd +# Alternate Example: I compiled and istalled SuiteSpares in the directory above this S4 directory +# CHOLMOD_INC = -I../SuiteSparse/include/ +# CHOLMOD_LIB = -L../SuiteSparse/lib/ -lcholmod -lamd -lcolamd -lcamd -lccolamd +CHOLMOD_INC = -I/usr/include/suitesparse CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd - -BOOST_PREFIX=-I/usr/local -BOOST_INC = -I$(BOOST_PREFIX)/include -BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization -boost: $(BOOST_PREFIX)/lib - - # Specify the MPI library -MPI_INC = -MPI_LIB = +# For example, on Fedora: dnf install openmpi-devel +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi/ompi +#MPI_LIB = -lmpi +# or, explicitly link to the library with -L, example below +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so + +# Enable S4_TRACE debugging +# values of 1, 2, 3 enable debugging, with verbosity increasing as +# value increases. 0 to disable +S4_DEBUG = 0 +S4_PROF = 0 # Specify custom compilers if needed -CXX = c++ -CC = cc +CXX = g++ +CC = gcc -CFLAGS = -O3 -fPIC +#CFLAGS += -O3 -fPIC +CFLAGS = -Wall -O3 -m64 -mcpu=apple-m1 -mtune=native -fPIC # options for Sampler module OPTFLAGS = -O3 @@ -57,29 +91,9 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -#### Download, compile, and install boost serialization lib. -#### This should all work fine, you must modify BOOST_INC, BOOST_LIBS, -#### and PREFIX if you want to install boost to a different location - -# Specify the paths to the boost include and lib directories -BOOST_PREFIX=${CURDIR}/S4 -BOOST_INC = -I$(BOOST_PREFIX)/include -BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization -BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz -BOOST_FILE=boost.tar.gz -# Target for downloading boost from above URL -$(BOOST_FILE): - wget $(BOOST_URL) -O $(BOOST_FILE) - -# Target for extracting boost from archive and compiling. Depends on download target above -${CURDIR}/S4/lib: $(BOOST_FILE) - $(eval BOOST_DIR := $(shell tar tzf $(BOOST_FILE) | sed -e 's@/.*@@' | uniq)) - @echo Boost dir is $(BOOST_DIR) - tar -xzvf $(BOOST_FILE) - mv $(BOOST_DIR) boost_src - cd boost_src && ./bootstrap.sh --with-libraries=serialization --prefix=$(BOOST_PREFIX) && ./b2 install -# Final target which pulls everything together -boost: $(BOOST_PREFIX)/lib +BOOST_INC = +BOOST_LIBS = -lboost_serialization + ##################### DO NOT EDIT BELOW THIS LINE ##################### From 5b1d10ccd2f38617d64d9897c2eefde384c1f97b Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 22 Feb 2022 11:48:03 +1100 Subject: [PATCH 32/55] Update readme with instructions for Apple M1 chips --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b781e9b..547ac923 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,12 @@ cd S4 make S4_pyext ``` -Running the `make boost` command before `make S4_pyext` should automatically download and compile the relevant Boost libraries in the local S4 directory. HOWEVER, this appears to cause problems on macOS, so if you are installing on macOS you should install the boost libraries using Homebrew (see below). If you want to use Boost libraries in a different location you will have to edit the Makefile. +Running the `make boost` command before `make S4_pyext` should automatically download and compile the relevant Boost libraries in the local S4 directory. +HOWEVER, this appears to cause problems on macOS, so if you are installing on macOS you should install the boost libraries +using Homebrew (see below). If you want to use Boost libraries in a different location you will have to edit the Makefile. + +**Note for users of new (late 2020 onwards) Apple machines with M1/Apple silicon/ARM chips: you will need to use Makefile.m1 +to compile successfully, see notes below on how to do this.** ## Installing relevant libraries etc.: @@ -51,6 +56,19 @@ You can install S4 into a virtual environment automatically by just activating t See [here](https://rayflare.readthedocs.io/en/latest/Installation/installation.html) for more extensive instructions. + +**On MacOS with M1/ARM chips:** + +Some of the flags used in the default Makefile cause issues with the new chip architecture. Run the following instead: + +``` +git clone https://github.com/phoebe-p/S4 +cd S4 +make S4_pyext --file="Makefile.m1" +``` + +Installing the libraries with Homebrew should work as expected. + ------------------------------------- S4: Stanford Stratified Structure Solver (http://fan.group.stanford.edu/S4/) From 247bac95d77896ed9d070cd9f0cb9bb0c5f7b348 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 31 Jan 2023 16:59:45 +1100 Subject: [PATCH 33/55] create Makefile.test checking which flags are necessary for compilation --- Makefile.test | 355 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 Makefile.test diff --git a/Makefile.test b/Makefile.test new file mode 100644 index 00000000..65f3c93b --- /dev/null +++ b/Makefile.test @@ -0,0 +1,355 @@ +# To build: +# make +# Use the 'lib' target first to build the library, then either the Lua +# or Python targets are 'S4lua' and 'python_ext', respectively. + +# Set these to the flags needed to link against BLAS and Lapack. +# If left blank, then performance may be very poor. +# On Mac OS, +# BLAS_LIB = -framework vecLib +# LAPACK_LIB = -framework vecLib +# On Fedora: dnf install openblas-devel +# On Debian and Fedora, with reference BLAS and Lapack (slow) +# BLAS_LIB = -lblas +# LAPACK_LIB = -llapack +# NOTE: on Fedora, need to link blas and lapack properly, where X.X.X is some version numbers +# Linking Command Example: sudo ln -s /usr/lib64/liblapack.so.X.X.X /usr/lib64/liblapack.so +# blas Example: sudo ln -s /usr/lib64/libopeblas64.so.X.X.X /usr/lib64/libblas.so +# Can also use -L to link to the explicit libary path +# For example to use blas/lapack or even mkl installed in a anaconda conda environment: +# BLAS_LIB = -L$(CONDA_PREFIX)/lib/ -lmkl_core -lmkl_rt -lstdc++ -lpthread -lm -ldl +# LAPACK_LIB = -L$(CONDA_PREFIX)/lib/ -lmkl_core -lmkl_rt -lstdc++ -lpthread -lm -ldl +BLAS_LIB = -lblas +LAPACK_LIB = -llapack + +# Specify the flags for Lua headers and libraries (only needed for Lua frontend) +# Recommended: build lua in the current directory, and link against this local version +# LUA_INC = -I./lua-5.2.4/install/include +# LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm +LUA_INC = -I./lua-5.2.4/install/include +LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm + +# OPTIONAL +# Typically if installed, +# FFTW3_INC can be left empty +# FFTW3_LIB = -lfftw3 +# or, if Fedora and/or fftw is version 3 but named fftw rather than fftw3 +# FTW3_LIB = -lfftw +# May need to link libraries properly as with blas and lapack above +# FFTW3_INC = -I$(CONDA_PREFIX)/include/ +# FFTW3_LIB = -L$(CONDA_PREFIX)/lib/ -lfftw3 +FFTW3_INC = +FFTW3_LIB = -lfftw3 + +# Typically, +# PTHREAD_INC = -DHAVE_UNISTD_H +# PTHREAD_LIB = -lpthread +# If conda env +# PTHREAD_LIB = -L$(CONDA_PREFIX)/lib/ -lpthread +PTHREAD_INC = -DHAVE_UNISTD_H +#PTHREAD_LIB = -lpthread + +# OPTIONAL +# If not installed: +# Fedora: dnf install libsuitsparse-devel +# Typically, if installed: +#CHOLMOD_INC = -I/usr/include/suitesparse +#CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd +# Alternate Example: I compiled and istalled SuiteSpares in the directory above this S4 directory +# CHOLMOD_INC = -I../SuiteSparse/include/ +# CHOLMOD_LIB = -L../SuiteSparse/lib/ -lcholmod -lamd -lcolamd -lcamd -lccolamd +CHOLMOD_INC = -I/usr/include/suitesparse +CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd + +# Specify the MPI library +# For example, on Fedora: dnf install openmpi-devel +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi/ompi +#MPI_LIB = -lmpi +# or, explicitly link to the library with -L, example below +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so + +# Enable S4_TRACE debugging +# values of 1, 2, 3 enable debugging, with verbosity increasing as +# value increases. 0 to disable +S4_DEBUG = 0 +S4_PROF = 0 + +# Specify custom compilers if needed +CXX = g++ +CC = gcc + +CFLAGS += -O3 -fPIC +#CFLAGS = -Wall -O2 -m64 -march=native -mtune=native -fPIC + +# options for Sampler module +OPTFLAGS = -O3 + +OBJDIR = ./build +S4_BINNAME = $(OBJDIR)/S4 +S4_LIBNAME = $(OBJDIR)/libS4.a +S4r_LIBNAME = $(OBJDIR)/libS4r.a + +#### Download, compile, and install boost serialization lib. +#### This should all work fine, you must modify BOOST_INC, BOOST_LIBS, +#### and PREFIX if you want to install boost to a different location + +# Specify the paths to the boost include and lib directories +BOOST_PREFIX=${CURDIR}/S4 +BOOST_INC = -I$(BOOST_PREFIX)/include +BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization +BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.74.0/boost_1_74_0.tar.gz +BOOST_FILE=boost.tar.gz +# Target for downloading boost from above URL +$(BOOST_FILE): + wget $(BOOST_URL) -O $(BOOST_FILE) + +# Target for extracting boost from archive and compiling. Depends on download target above +${CURDIR}/S4/lib: $(BOOST_FILE) + $(eval BOOST_DIR := $(shell tar tzf $(BOOST_FILE) | sed -e 's@/.*@@' | uniq)) + @echo Boost dir is $(BOOST_DIR) + tar -xzvf $(BOOST_FILE) + mv $(BOOST_DIR) boost_src + cd boost_src && ./bootstrap.sh --with-libraries=serialization --prefix=$(BOOST_PREFIX) && ./b2 install +# Final target which pulls everything together +boost: $(BOOST_PREFIX)/lib + +##################### DO NOT EDIT BELOW THIS LINE ##################### + + +#### Set the compilation flags + +CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft + +ifeq ($(S4_PROF), 1) +CPPFLAGS += -g -pg +endif + +ifeq ($(S4_DEBUG), 1) +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 2) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 3) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -DDUMP_MATRICES +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 4) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -DDUMP_MATRICES +CPPFLAGS += -DDUMP_MATRICES_LARGE +CPPFLAGS += -ggdb +endif + +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) +$(S4r_LIBNAME): objdir $(S4r_LIBOBJS) + $(AR) crvs $@ $(S4r_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 $@ + + + + +$(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/LatticeGridRect.o: S4r/LatticeGridRect.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/LatticeGridArb.o: S4r/LatticeGridArb.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/POFF2Mesh.o: S4r/POFF2Mesh.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/PeriodicMesh.o: S4r/PeriodicMesh.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Shape.o: S4r/Shape.cpp S4r/Shape.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Simulation.o: S4r/Simulation.cpp S4r/Simulation.hpp S4r/StarProduct.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Layer.o: S4r/Layer.cpp S4r/Layer.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Pseudoinverse.o: S4r/Pseudoinverse.cpp S4r/Pseudoinverse.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Eigensystems.o: S4r/Eigensystems.cpp S4r/Eigensystems.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/IRA.o: S4r/IRA.cpp S4r/IRA.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/intersection.o: S4r/intersection.c S4r/intersection.h + $(CC) -c -O3 $< -o $@ +$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4r/predicates.o: S4r/predicates.c + $(CC) -c -O3 $< -o $@ + +#### Lua Frontend + +$(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +S4lua: $(OBJDIR)/S4k/main_lua.o $(S4_LIBNAME) sampler + $(CXX) $(CFLAGS) $(CPPFLAGS) $< -o $(S4_BINNAME) $(S4_LIBNAME) $(LIBS) $(LUA_LIB) + +$(OBJDIR)/S4r/main_lua.o: S4r/main_lua.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +$(OBJDIR)/S4r/lua_named_arg.o: S4r/lua_named_arg.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +$(OBJDIR)/S4r/S4r.o: S4r/S4r.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +S4rlua: objdir $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o $(S4r_LIBNAME) + $(CXX) $(CFLAGS) $(CPPFLAGS) $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o -o $@ $(S4r_LIBNAME) $(LIBS) $(LUA_LIB) + +sampler: FunctionSampler1D.so FunctionSampler2D.so +FunctionSampler1D.so: modules/function_sampler_1d.c modules/function_sampler_1d.h modules/lua_function_sampler_1d.c + gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_1d.c -o $(OBJDIR)/modules/function_sampler_1d.o + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler1D.so $(OBJDIR)/modules/function_sampler_1d.o modules/lua_function_sampler_1d.c $(LUA_LIB) +FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d.h modules/lua_function_sampler_2d.c + gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_2d.c -o $(OBJDIR)/modules/function_sampler_2d.o + gcc -c -O2 -fpic -Wall -I. modules/predicates.c -o $(OBJDIR)/modules/mod_predicates.o + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler2D.so $(OBJDIR)/modules/function_sampler_2d.o $(OBJDIR)/modules/mod_predicates.o modules/lua_function_sampler_2d.c $(LUA_LIB) + +#### Python extension + +S4_pyext: objdir $(S4_LIBNAME) + sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) + pip3 install --upgrade ./ + +clean: + rm -rf $(OBJDIR) From 937b040749997fae492d89ecca4421a8dd500db8 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Tue, 31 Jan 2023 17:02:06 +1100 Subject: [PATCH 34/55] update makefile.test --- Makefile.test | 46 ---------------------------------------------- 1 file changed, 46 deletions(-) diff --git a/Makefile.test b/Makefile.test index 65f3c93b..0ee42946 100644 --- a/Makefile.test +++ b/Makefile.test @@ -95,29 +95,9 @@ S4r_LIBNAME = $(OBJDIR)/libS4r.a #### This should all work fine, you must modify BOOST_INC, BOOST_LIBS, #### and PREFIX if you want to install boost to a different location -# Specify the paths to the boost include and lib directories -BOOST_PREFIX=${CURDIR}/S4 -BOOST_INC = -I$(BOOST_PREFIX)/include -BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization -BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.74.0/boost_1_74_0.tar.gz -BOOST_FILE=boost.tar.gz -# Target for downloading boost from above URL -$(BOOST_FILE): - wget $(BOOST_URL) -O $(BOOST_FILE) - -# Target for extracting boost from archive and compiling. Depends on download target above -${CURDIR}/S4/lib: $(BOOST_FILE) - $(eval BOOST_DIR := $(shell tar tzf $(BOOST_FILE) | sed -e 's@/.*@@' | uniq)) - @echo Boost dir is $(BOOST_DIR) - tar -xzvf $(BOOST_FILE) - mv $(BOOST_DIR) boost_src - cd boost_src && ./bootstrap.sh --with-libraries=serialization --prefix=$(BOOST_PREFIX) && ./b2 install -# Final target which pulls everything together -boost: $(BOOST_PREFIX)/lib ##################### DO NOT EDIT BELOW THIS LINE ##################### - #### Set the compilation flags CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft @@ -290,7 +270,6 @@ $(OBJDIR)/S4k/Eigensystems.o: S4/RNP/Eigensystems.cpp - $(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ $(OBJDIR)/S4r/LatticeGridRect.o: S4r/LatticeGridRect.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp @@ -320,31 +299,6 @@ $(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h $(OBJDIR)/S4r/predicates.o: S4r/predicates.c $(CC) -c -O3 $< -o $@ -#### Lua Frontend - -$(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir - $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ -S4lua: $(OBJDIR)/S4k/main_lua.o $(S4_LIBNAME) sampler - $(CXX) $(CFLAGS) $(CPPFLAGS) $< -o $(S4_BINNAME) $(S4_LIBNAME) $(LIBS) $(LUA_LIB) - -$(OBJDIR)/S4r/main_lua.o: S4r/main_lua.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ -$(OBJDIR)/S4r/lua_named_arg.o: S4r/lua_named_arg.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ -$(OBJDIR)/S4r/S4r.o: S4r/S4r.cpp - $(CXX) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ -S4rlua: objdir $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o $(S4r_LIBNAME) - $(CXX) $(CFLAGS) $(CPPFLAGS) $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o -o $@ $(S4r_LIBNAME) $(LIBS) $(LUA_LIB) - -sampler: FunctionSampler1D.so FunctionSampler2D.so -FunctionSampler1D.so: modules/function_sampler_1d.c modules/function_sampler_1d.h modules/lua_function_sampler_1d.c - gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_1d.c -o $(OBJDIR)/modules/function_sampler_1d.o - gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler1D.so $(OBJDIR)/modules/function_sampler_1d.o modules/lua_function_sampler_1d.c $(LUA_LIB) -FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d.h modules/lua_function_sampler_2d.c - gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_2d.c -o $(OBJDIR)/modules/function_sampler_2d.o - gcc -c -O2 -fpic -Wall -I. modules/predicates.c -o $(OBJDIR)/modules/mod_predicates.o - gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler2D.so $(OBJDIR)/modules/function_sampler_2d.o $(OBJDIR)/modules/mod_predicates.o modules/lua_function_sampler_2d.c $(LUA_LIB) - #### Python extension S4_pyext: objdir $(S4_LIBNAME) From c535c8081e5def55ee7bb18fb103a81b7feefd28 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 1 Feb 2023 13:10:20 +1100 Subject: [PATCH 35/55] Update and rename Makefile.aarch64 --- Makefile.test => Makefile.aarch64 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename Makefile.test => Makefile.aarch64 (99%) diff --git a/Makefile.test b/Makefile.aarch64 similarity index 99% rename from Makefile.test rename to Makefile.aarch64 index 0ee42946..e28f081c 100644 --- a/Makefile.test +++ b/Makefile.aarch64 @@ -80,8 +80,7 @@ S4_PROF = 0 CXX = g++ CC = gcc -CFLAGS += -O3 -fPIC -#CFLAGS = -Wall -O2 -m64 -march=native -mtune=native -fPIC +CFLAGS = -O3 -fPIC -march=native -mtune=native # options for Sampler module OPTFLAGS = -O3 From 22b8f4f3e03d78c0cdfd6bc107ee28673356c7c1 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 1 Feb 2023 13:35:33 +1100 Subject: [PATCH 36/55] Update Makefile.aarch64 --- Makefile.aarch64 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Makefile.aarch64 b/Makefile.aarch64 index e28f081c..28c4ce02 100644 --- a/Makefile.aarch64 +++ b/Makefile.aarch64 @@ -94,9 +94,29 @@ S4r_LIBNAME = $(OBJDIR)/libS4r.a #### This should all work fine, you must modify BOOST_INC, BOOST_LIBS, #### and PREFIX if you want to install boost to a different location +# Specify the paths to the boost include and lib directories +BOOST_PREFIX=${CURDIR}/S4 +BOOST_INC = -I$(BOOST_PREFIX)/include +BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization +BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.74.0/boost_1_74_0.tar.gz +BOOST_FILE=boost.tar.gz +# Target for downloading boost from above URL +$(BOOST_FILE): + wget $(BOOST_URL) -O $(BOOST_FILE) + +# Target for extracting boost from archive and compiling. Depends on download target above +${CURDIR}/S4/lib: $(BOOST_FILE) + $(eval BOOST_DIR := $(shell tar tzf $(BOOST_FILE) | sed -e 's@/.*@@' | uniq)) + @echo Boost dir is $(BOOST_DIR) + tar -xzvf $(BOOST_FILE) + mv $(BOOST_DIR) boost_src + cd boost_src && ./bootstrap.sh --with-libraries=serialization --prefix=$(BOOST_PREFIX) && ./b2 install +# Final target which pulls everything together +boost: $(BOOST_PREFIX)/lib ##################### DO NOT EDIT BELOW THIS LINE ##################### + #### Set the compilation flags CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft @@ -269,6 +289,7 @@ $(OBJDIR)/S4k/Eigensystems.o: S4/RNP/Eigensystems.cpp + $(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ $(OBJDIR)/S4r/LatticeGridRect.o: S4r/LatticeGridRect.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp @@ -298,6 +319,31 @@ $(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h $(OBJDIR)/S4r/predicates.o: S4r/predicates.c $(CC) -c -O3 $< -o $@ +#### Lua Frontend + +$(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +S4lua: $(OBJDIR)/S4k/main_lua.o $(S4_LIBNAME) sampler + $(CXX) $(CFLAGS) $(CPPFLAGS) $< -o $(S4_BINNAME) $(S4_LIBNAME) $(LIBS) $(LUA_LIB) + +$(OBJDIR)/S4r/main_lua.o: S4r/main_lua.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +$(OBJDIR)/S4r/lua_named_arg.o: S4r/lua_named_arg.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +$(OBJDIR)/S4r/S4r.o: S4r/S4r.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +S4rlua: objdir $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o $(S4r_LIBNAME) + $(CXX) $(CFLAGS) $(CPPFLAGS) $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o -o $@ $(S4r_LIBNAME) $(LIBS) $(LUA_LIB) + +sampler: FunctionSampler1D.so FunctionSampler2D.so +FunctionSampler1D.so: modules/function_sampler_1d.c modules/function_sampler_1d.h modules/lua_function_sampler_1d.c + gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_1d.c -o $(OBJDIR)/modules/function_sampler_1d.o + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler1D.so $(OBJDIR)/modules/function_sampler_1d.o modules/lua_function_sampler_1d.c $(LUA_LIB) +FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d.h modules/lua_function_sampler_2d.c + gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_2d.c -o $(OBJDIR)/modules/function_sampler_2d.o + gcc -c -O2 -fpic -Wall -I. modules/predicates.c -o $(OBJDIR)/modules/mod_predicates.o + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler2D.so $(OBJDIR)/modules/function_sampler_2d.o $(OBJDIR)/modules/mod_predicates.o modules/lua_function_sampler_2d.c $(LUA_LIB) + #### Python extension S4_pyext: objdir $(S4_LIBNAME) From ad4f128c8b988768ba5a765d1d68b6c467c0b7ec Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Fri, 10 Nov 2023 16:08:54 +1100 Subject: [PATCH 37/55] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 547ac923..c0d384ad 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,13 @@ -If you are looking for a more user-friendly interface to S4 (wavelength-dependent calculations, material management etc.), check out my Python3 package [RayFlare](https://rayflare.readthedocs.io) +If you are looking for a more user-friendly interface to S4 (wavelength-dependent calculations, material management etc.), check out my Python3 package [RayFlare](https://rayflare.readthedocs.io). # Installation instructions (64-bit Ubuntu 16/18/20 or MacOS): +## Python prerequisites + +``` +pip install numpy wheel setuptools +``` + ## Key steps: ``` From 1b001065bb4172b6aa581b93ff4a50121da66820 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 14:13:50 +1100 Subject: [PATCH 38/55] fix issues with M1 Makefile and CHOLMOD_INTLONG --- Makefile.m1 | 2 +- S4/pattern/pattern.c | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Makefile.m1 b/Makefile.m1 index 2c3ab4ad..9e35a145 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -58,7 +58,7 @@ PTHREAD_INC = -DHAVE_UNISTD_H # Alternate Example: I compiled and istalled SuiteSpares in the directory above this S4 directory # CHOLMOD_INC = -I../SuiteSparse/include/ # CHOLMOD_LIB = -L../SuiteSparse/lib/ -lcholmod -lamd -lcolamd -lcamd -lccolamd -CHOLMOD_INC = -I/usr/include/suitesparse +CHOLMOD_INC = -I/opt/homebrew/include/suitesparse CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd # Specify the MPI library diff --git a/S4/pattern/pattern.c b/S4/pattern/pattern.c index 7e449e00..a6e9e5a0 100644 --- a/S4/pattern/pattern.c +++ b/S4/pattern/pattern.c @@ -1337,10 +1337,10 @@ static void sparse_linsolve_d(int n, const double *M, const int *Mcol, int Mnd, ((int*)A->p)[i] = nnz; ((int*)A->i)[nnz] = i; break; - case CHOLMOD_INTLONG: - ((SuiteSparse_long*)A->p)[i] = nnz; - ((int*)A->i)[nnz] = i; - break; +// case CHOLMOD_INTLONG: +// ((SuiteSparse_long*)A->p)[i] = nnz; +// ((int*)A->i)[nnz] = i; +// break; case CHOLMOD_LONG: ((SuiteSparse_long*)A->p)[i] = nnz; ((SuiteSparse_long*)A->i)[nnz] = i; @@ -1356,9 +1356,9 @@ static void sparse_linsolve_d(int n, const double *M, const int *Mcol, int Mnd, case CHOLMOD_INT: ((int*)A->i)[nnz] = Mcol[Mnd*i+j]; break; - case CHOLMOD_INTLONG: - ((int*)A->i)[nnz] = Mcol[Mnd*i+j]; - break; +// case CHOLMOD_INTLONG: +// ((int*)A->i)[nnz] = Mcol[Mnd*i+j]; +// break; case CHOLMOD_LONG: ((SuiteSparse_long*)A->i)[nnz] = Mcol[Mnd*i+j]; break; @@ -1371,9 +1371,9 @@ static void sparse_linsolve_d(int n, const double *M, const int *Mcol, int Mnd, case CHOLMOD_INT: ((int*)A->p)[i] = nnz; break; - case CHOLMOD_INTLONG: - ((SuiteSparse_long*)A->p)[i] = nnz; - break; +// case CHOLMOD_INTLONG: +// ((SuiteSparse_long*)A->p)[i] = nnz; +// break; case CHOLMOD_LONG: ((SuiteSparse_long*)A->p)[i] = nnz; break; From 2acf9710cc2b9def22ddc6c016440dfed5eb4030 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 15:51:48 +1100 Subject: [PATCH 39/55] remove Boost from Makefile.m1, since it does not seem to actually link to compiler --- Makefile.m1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Makefile.m1 b/Makefile.m1 index 9e35a145..d98d51a5 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,9 +91,8 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -BOOST_LIBS = -lboost_serialization - +# BOOST_INC = -I/opt/homebrew/Cellar/boost/1.84.0_1/include/boost +# BOOST_LIBS = -lboost_serialization ##################### DO NOT EDIT BELOW THIS LINE ##################### From d669d4631a6ae1399e494145d007e03f90ef1cd8 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 15:59:55 +1100 Subject: [PATCH 40/55] try to fix boost issue --- Makefile.m1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.m1 b/Makefile.m1 index d98d51a5..29927c0f 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,8 +91,9 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -# BOOST_INC = -I/opt/homebrew/Cellar/boost/1.84.0_1/include/boost +BOOST_INC = -I/opt/homebrew/include/boost # BOOST_LIBS = -lboost_serialization +BOOST_LIBS = ##################### DO NOT EDIT BELOW THIS LINE ##################### From d2bf1f839a202a982b47d65aee5586ad0cdc0240 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 16:05:12 +1100 Subject: [PATCH 41/55] try to fix boost issue --- Makefile.m1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.m1 b/Makefile.m1 index 29927c0f..f93bfc60 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -92,8 +92,8 @@ S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a BOOST_INC = -I/opt/homebrew/include/boost -# BOOST_LIBS = -lboost_serialization -BOOST_LIBS = +BOOST_LIBS = -lboost_serialization +# BOOST_LIBS = ##################### DO NOT EDIT BELOW THIS LINE ##################### From a1ee39e5d5c0dd3f21fd847e7678e2b1c43c785b Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 16:30:00 +1100 Subject: [PATCH 42/55] try to fix boost issue --- Makefile.m1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.m1 b/Makefile.m1 index f93bfc60..6e87e47b 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,7 +91,7 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/include/boost +BOOST_INC = -I/opt/homebrew/Cellar/boost BOOST_LIBS = -lboost_serialization # BOOST_LIBS = From b52efa88a5979cebb89db072a8c9ad2251a2961c Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 16:36:57 +1100 Subject: [PATCH 43/55] try to fix boost issue --- Makefile.m1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.m1 b/Makefile.m1 index 6e87e47b..92a3320a 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,7 +91,7 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/Cellar/boost +BOOST_INC = -I/opt/homebrew/Cellar/boost/1.83.0_1/include BOOST_LIBS = -lboost_serialization # BOOST_LIBS = From c8cc5361c9ab291697af9840c2f433bb558cceed Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 16:38:42 +1100 Subject: [PATCH 44/55] try to fix boost issue --- Makefile.m1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.m1 b/Makefile.m1 index 92a3320a..f6bf585f 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,7 +91,7 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/Cellar/boost/1.83.0_1/include +BOOST_INC = -I/opt/homebrew/Cellar/boost/1.84.0_1/include BOOST_LIBS = -lboost_serialization # BOOST_LIBS = From 2486a8a69bfa8ed1a9619338968fdc1b99b74e2d Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 16:53:24 +1100 Subject: [PATCH 45/55] try to fix boost issue --- Makefile.m1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.m1 b/Makefile.m1 index f6bf585f..f93bfc60 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,7 +91,7 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/Cellar/boost/1.84.0_1/include +BOOST_INC = -I/opt/homebrew/include/boost BOOST_LIBS = -lboost_serialization # BOOST_LIBS = From 530abeb543a28c0a1b0c835d424c89f780b856b1 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 19:34:53 +1100 Subject: [PATCH 46/55] new Mac (intel) makefile --- Makefile | 4 +- Makefile.mac_intel | 335 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 Makefile.mac_intel diff --git a/Makefile b/Makefile index f7b9b17e..b995dd6d 100644 --- a/Makefile +++ b/Makefile @@ -96,9 +96,9 @@ S4r_LIBNAME = $(OBJDIR)/libS4r.a #### and PREFIX if you want to install boost to a different location # Specify the paths to the boost include and lib directories -BOOST_PREFIX=${CURDIR}/S4 +BOOST_-L$(BOOST_PREFIX)/lib/PREFIX=${CURDIR}/S4 BOOST_INC = -I$(BOOST_PREFIX)/include -BOOST_LIBS = -L$(BOOST_PREFIX)/lib/ -lboost_serialization +BOOST_LIBS = -lboost_serialization BOOST_URL=https://sourceforge.net/projects/boost/files/boost/1.74.0/boost_1_74_0.tar.gz BOOST_FILE=boost.tar.gz # Target for downloading boost from above URL diff --git a/Makefile.mac_intel b/Makefile.mac_intel new file mode 100644 index 00000000..f93bfc60 --- /dev/null +++ b/Makefile.mac_intel @@ -0,0 +1,335 @@ +# To build: +# make +# Use the 'lib' target first to build the library, then either the Lua +# or Python targets are 'S4lua' and 'python_ext', respectively. + +# Set these to the flags needed to link against BLAS and Lapack. +# If left blank, then performance may be very poor. +# On Mac OS, +# BLAS_LIB = -framework vecLib +# LAPACK_LIB = -framework vecLib +# On Fedora: dnf install openblas-devel +# On Debian and Fedora, with reference BLAS and Lapack (slow) +# BLAS_LIB = -lblas +# LAPACK_LIB = -llapack +# NOTE: on Fedora, need to link blas and lapack properly, where X.X.X is some version numbers +# Linking Command Example: sudo ln -s /usr/lib64/liblapack.so.X.X.X /usr/lib64/liblapack.so +# blas Example: sudo ln -s /usr/lib64/libopeblas64.so.X.X.X /usr/lib64/libblas.so +# Can also use -L to link to the explicit libary path +# For example to use blas/lapack or even mkl installed in a anaconda conda environment: +# BLAS_LIB = -L$(CONDA_PREFIX)/lib/ -lmkl_core -lmkl_rt -lstdc++ -lpthread -lm -ldl +# LAPACK_LIB = -L$(CONDA_PREFIX)/lib/ -lmkl_core -lmkl_rt -lstdc++ -lpthread -lm -ldl +BLAS_LIB = -lblas +LAPACK_LIB = -llapack + +# Specify the flags for Lua headers and libraries (only needed for Lua frontend) +# Recommended: build lua in the current directory, and link against this local version +# LUA_INC = -I./lua-5.2.4/install/include +# LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm +LUA_INC = -I./lua-5.2.4/install/include +LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm + +# OPTIONAL +# Typically if installed, +# FFTW3_INC can be left empty +# FFTW3_LIB = -lfftw3 +# or, if Fedora and/or fftw is version 3 but named fftw rather than fftw3 +# FTW3_LIB = -lfftw +# May need to link libraries properly as with blas and lapack above +# FFTW3_INC = -I$(CONDA_PREFIX)/include/ +# FFTW3_LIB = -L$(CONDA_PREFIX)/lib/ -lfftw3 +FFTW3_INC = +FFTW3_LIB = -lfftw3 + +# Typically, +# PTHREAD_INC = -DHAVE_UNISTD_H +# PTHREAD_LIB = -lpthread +# If conda env +# PTHREAD_LIB = -L$(CONDA_PREFIX)/lib/ -lpthread +PTHREAD_INC = -DHAVE_UNISTD_H +#PTHREAD_LIB = -lpthread + +# OPTIONAL +# If not installed: +# Fedora: dnf install libsuitsparse-devel +# Typically, if installed: +#CHOLMOD_INC = -I/usr/include/suitesparse +#CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd +# Alternate Example: I compiled and istalled SuiteSpares in the directory above this S4 directory +# CHOLMOD_INC = -I../SuiteSparse/include/ +# CHOLMOD_LIB = -L../SuiteSparse/lib/ -lcholmod -lamd -lcolamd -lcamd -lccolamd +CHOLMOD_INC = -I/opt/homebrew/include/suitesparse +CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd + +# Specify the MPI library +# For example, on Fedora: dnf install openmpi-devel +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi/ompi +#MPI_LIB = -lmpi +# or, explicitly link to the library with -L, example below +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so + +# Enable S4_TRACE debugging +# values of 1, 2, 3 enable debugging, with verbosity increasing as +# value increases. 0 to disable +S4_DEBUG = 0 +S4_PROF = 0 + +# Specify custom compilers if needed +CXX = g++ +CC = gcc + +#CFLAGS += -O3 -fPIC +CFLAGS = -Wall -O3 -m64 -mcpu=apple-m1 -mtune=native -fPIC + +# options for Sampler module +OPTFLAGS = -O3 + +OBJDIR = ./build +S4_BINNAME = $(OBJDIR)/S4 +S4_LIBNAME = $(OBJDIR)/libS4.a +S4r_LIBNAME = $(OBJDIR)/libS4r.a + +BOOST_INC = -I/opt/homebrew/include/boost +BOOST_LIBS = -lboost_serialization +# BOOST_LIBS = + +##################### DO NOT EDIT BELOW THIS LINE ##################### + + +#### Set the compilation flags + +CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft + +ifeq ($(S4_PROF), 1) +CPPFLAGS += -g -pg +endif + +ifeq ($(S4_DEBUG), 1) +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 2) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 3) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -DDUMP_MATRICES +CPPFLAGS += -ggdb +endif + +ifeq ($(S4_DEBUG), 4) +CPPFLAGS += -DENABLE_S4_TRACE +CPPFLAGS += -DDUMP_MATRICES +CPPFLAGS += -DDUMP_MATRICES_LARGE +CPPFLAGS += -ggdb +endif + +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) +$(S4r_LIBNAME): objdir $(S4r_LIBOBJS) + $(AR) crvs $@ $(S4r_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 $@ + + + + +$(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/LatticeGridRect.o: S4r/LatticeGridRect.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/LatticeGridArb.o: S4r/LatticeGridArb.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/POFF2Mesh.o: S4r/POFF2Mesh.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/PeriodicMesh.o: S4r/PeriodicMesh.cpp S4r/PeriodicMesh.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Shape.o: S4r/Shape.cpp S4r/Shape.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Simulation.o: S4r/Simulation.cpp S4r/Simulation.hpp S4r/StarProduct.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Layer.o: S4r/Layer.cpp S4r/Layer.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Pseudoinverse.o: S4r/Pseudoinverse.cpp S4r/Pseudoinverse.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/Eigensystems.o: S4r/Eigensystems.cpp S4r/Eigensystems.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/IRA.o: S4r/IRA.cpp S4r/IRA.hpp S4r/Types.hpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ +$(OBJDIR)/S4r/intersection.o: S4r/intersection.c S4r/intersection.h + $(CC) -c -O3 $< -o $@ +$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ +$(OBJDIR)/S4r/predicates.o: S4r/predicates.c + $(CC) -c -O3 $< -o $@ + +#### Lua Frontend + +$(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +S4lua: $(OBJDIR)/S4k/main_lua.o $(S4_LIBNAME) sampler + $(CXX) $(CFLAGS) $(CPPFLAGS) $< -o $(S4_BINNAME) $(S4_LIBNAME) $(LIBS) $(LUA_LIB) + +$(OBJDIR)/S4r/main_lua.o: S4r/main_lua.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +$(OBJDIR)/S4r/lua_named_arg.o: S4r/lua_named_arg.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +$(OBJDIR)/S4r/S4r.o: S4r/S4r.cpp + $(CXX) -c $(CFLAGS) $(CPPFLAGS) $(LUA_INC) $< -o $@ +S4rlua: objdir $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o $(S4r_LIBNAME) + $(CXX) $(CFLAGS) $(CPPFLAGS) $(OBJDIR)/S4r/main_lua.o $(OBJDIR)/S4r/lua_named_arg.o $(OBJDIR)/S4r/S4r.o -o $@ $(S4r_LIBNAME) $(LIBS) $(LUA_LIB) + +sampler: FunctionSampler1D.so FunctionSampler2D.so +FunctionSampler1D.so: modules/function_sampler_1d.c modules/function_sampler_1d.h modules/lua_function_sampler_1d.c + gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_1d.c -o $(OBJDIR)/modules/function_sampler_1d.o + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler1D.so $(OBJDIR)/modules/function_sampler_1d.o modules/lua_function_sampler_1d.c $(LUA_LIB) +FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d.h modules/lua_function_sampler_2d.c + gcc -c $(OPTFLAGS) -fpic -Wall -I. modules/function_sampler_2d.c -o $(OBJDIR)/modules/function_sampler_2d.o + gcc -c -O2 -fpic -Wall -I. modules/predicates.c -o $(OBJDIR)/modules/mod_predicates.o + gcc $(OPTFLAGS) -shared -fpic -Wall $(LUA_INC) -o $(OBJDIR)/FunctionSampler2D.so $(OBJDIR)/modules/function_sampler_2d.o $(OBJDIR)/modules/mod_predicates.o modules/lua_function_sampler_2d.c $(LUA_LIB) + +#### Python extension + +S4_pyext: objdir $(S4_LIBNAME) + sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) + pip3 install --upgrade ./ + +clean: + rm -rf $(OBJDIR) From 527a039f9eb77a994d861eec41fc2307f22e0829 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 19:37:05 +1100 Subject: [PATCH 47/55] new Mac (intel) makefile --- Makefile.mac_intel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.mac_intel b/Makefile.mac_intel index f93bfc60..4e21318d 100644 --- a/Makefile.mac_intel +++ b/Makefile.mac_intel @@ -91,8 +91,8 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/include/boost -BOOST_LIBS = -lboost_serialization +# BOOST_INC = -I/opt/homebrew/include/boost +# BOOST_LIBS = -lboost_serialization # BOOST_LIBS = ##################### DO NOT EDIT BELOW THIS LINE ##################### From 2f8afee3f4f40c144a90399b7db3caf61e925e77 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 19:43:31 +1100 Subject: [PATCH 48/55] update Homebrew path for Intel macos: --- Makefile.mac_intel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.mac_intel b/Makefile.mac_intel index 4e21318d..5a8bae4c 100644 --- a/Makefile.mac_intel +++ b/Makefile.mac_intel @@ -58,7 +58,7 @@ PTHREAD_INC = -DHAVE_UNISTD_H # Alternate Example: I compiled and istalled SuiteSpares in the directory above this S4 directory # CHOLMOD_INC = -I../SuiteSparse/include/ # CHOLMOD_LIB = -L../SuiteSparse/lib/ -lcholmod -lamd -lcolamd -lcamd -lccolamd -CHOLMOD_INC = -I/opt/homebrew/include/suitesparse +CHOLMOD_INC = -I/usr/local/include/suitesparse CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd # Specify the MPI library From 4b67fee1368f0f9d72539c956440e96fbce81468 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 19:55:05 +1100 Subject: [PATCH 49/55] update mac_intel Makefile --- Makefile.mac_intel | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/Makefile.mac_intel b/Makefile.mac_intel index 5a8bae4c..3cc45773 100644 --- a/Makefile.mac_intel +++ b/Makefile.mac_intel @@ -61,14 +61,6 @@ PTHREAD_INC = -DHAVE_UNISTD_H CHOLMOD_INC = -I/usr/local/include/suitesparse CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd -# Specify the MPI library -# For example, on Fedora: dnf install openmpi-devel -#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi/ompi -#MPI_LIB = -lmpi -# or, explicitly link to the library with -L, example below -#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so -#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi -#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so # Enable S4_TRACE debugging # values of 1, 2, 3 enable debugging, with verbosity increasing as @@ -81,7 +73,7 @@ CXX = g++ CC = gcc #CFLAGS += -O3 -fPIC -CFLAGS = -Wall -O3 -m64 -mcpu=apple-m1 -mtune=native -fPIC +CFLAGS = -Wall -O3 -m64 -march=native -mtune=native -msse3 -msse2 -msse -fPIC # options for Sampler module OPTFLAGS = -O3 @@ -91,10 +83,6 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -# BOOST_INC = -I/opt/homebrew/include/boost -# BOOST_LIBS = -lboost_serialization -# BOOST_LIBS = - ##################### DO NOT EDIT BELOW THIS LINE ##################### From cd2653efa8654fd0c0c8bc4373bb04f5398025f5 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 20:19:47 +1100 Subject: [PATCH 50/55] explictly set clang as compiler --- Makefile.mac_intel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.mac_intel b/Makefile.mac_intel index 3cc45773..6eae3227 100644 --- a/Makefile.mac_intel +++ b/Makefile.mac_intel @@ -69,8 +69,8 @@ S4_DEBUG = 0 S4_PROF = 0 # Specify custom compilers if needed -CXX = g++ -CC = gcc +CXX = clang++ +CC = clang #CFLAGS += -O3 -fPIC CFLAGS = -Wall -O3 -m64 -march=native -mtune=native -msse3 -msse2 -msse -fPIC From f076f15714c3cdbb41ff5bb00372859e548d198a Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 20:25:46 +1100 Subject: [PATCH 51/55] try M1 with clang --- Makefile.m1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.m1 b/Makefile.m1 index f93bfc60..ec6fa0a8 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -77,8 +77,8 @@ S4_DEBUG = 0 S4_PROF = 0 # Specify custom compilers if needed -CXX = g++ -CC = gcc +CXX = clang++ +CC = clang #CFLAGS += -O3 -fPIC CFLAGS = -Wall -O3 -m64 -mcpu=apple-m1 -mtune=native -fPIC From dd383c23131897f4584edd391c85e58faf40edcc Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Mon, 11 Mar 2024 20:25:46 +1100 Subject: [PATCH 52/55] Fixed S4 build for macOS on arm64 --- Makefile.m1 | 11 ++++++----- Makefile.mac_intel | 38 +++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Makefile.m1 b/Makefile.m1 index f93bfc60..c593798c 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -38,7 +38,7 @@ LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm # May need to link libraries properly as with blas and lapack above # FFTW3_INC = -I$(CONDA_PREFIX)/include/ # FFTW3_LIB = -L$(CONDA_PREFIX)/lib/ -lfftw3 -FFTW3_INC = +FFTW3_INC = -I/opt/homebrew/include/ FFTW3_LIB = -lfftw3 # Typically, @@ -77,8 +77,8 @@ S4_DEBUG = 0 S4_PROF = 0 # Specify custom compilers if needed -CXX = g++ -CC = gcc +CXX = clang++ +CC = clang #CFLAGS += -O3 -fPIC CFLAGS = -Wall -O3 -m64 -mcpu=apple-m1 -mtune=native -fPIC @@ -91,9 +91,8 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/include/boost +BOOST_INC = -I/opt/homebrew/include/ BOOST_LIBS = -lboost_serialization -# BOOST_LIBS = ##################### DO NOT EDIT BELOW THIS LINE ##################### @@ -327,6 +326,8 @@ FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d. #### Python extension +BOOST_PREFIX = /opt/homebrew/ + S4_pyext: objdir $(S4_LIBNAME) sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) pip3 install --upgrade ./ diff --git a/Makefile.mac_intel b/Makefile.mac_intel index 6eae3227..34b883f4 100644 --- a/Makefile.mac_intel +++ b/Makefile.mac_intel @@ -38,7 +38,7 @@ LUA_LIB = -L./lua-5.2.4/install/lib -llua -ldl -lm # May need to link libraries properly as with blas and lapack above # FFTW3_INC = -I$(CONDA_PREFIX)/include/ # FFTW3_LIB = -L$(CONDA_PREFIX)/lib/ -lfftw3 -FFTW3_INC = +FFTW3_INC = -I/opt/homebrew/include/ FFTW3_LIB = -lfftw3 # Typically, @@ -58,9 +58,17 @@ PTHREAD_INC = -DHAVE_UNISTD_H # Alternate Example: I compiled and istalled SuiteSpares in the directory above this S4 directory # CHOLMOD_INC = -I../SuiteSparse/include/ # CHOLMOD_LIB = -L../SuiteSparse/lib/ -lcholmod -lamd -lcolamd -lcamd -lccolamd -CHOLMOD_INC = -I/usr/local/include/suitesparse +CHOLMOD_INC = -I/opt/homebrew/include/suitesparse CHOLMOD_LIB = -lcholmod -lamd -lcolamd -lcamd -lccolamd +# Specify the MPI library +# For example, on Fedora: dnf install openmpi-devel +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi/ompi +#MPI_LIB = -lmpi +# or, explicitly link to the library with -L, example below +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so +#MPI_INC = -I/usr/include/openmpi-x86_64/openmpi +#MPI_LIB = -L/usr/lib64/openmpi/lib/libmpi.so # Enable S4_TRACE debugging # values of 1, 2, 3 enable debugging, with verbosity increasing as @@ -83,37 +91,39 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a +BOOST_INC = -I/opt/homebrew/include/ +BOOST_LIBS = -lboost_serialization ##################### DO NOT EDIT BELOW THIS LINE ##################### #### Set the compilation flags -CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft - +CPPFLAGS = -Wall -I. -IS4 -IS4/RNP -IS4/kiss_fft + ifeq ($(S4_PROF), 1) CPPFLAGS += -g -pg endif ifeq ($(S4_DEBUG), 1) -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifeq ($(S4_DEBUG), 2) CPPFLAGS += -DENABLE_S4_TRACE -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifeq ($(S4_DEBUG), 3) CPPFLAGS += -DENABLE_S4_TRACE CPPFLAGS += -DDUMP_MATRICES -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifeq ($(S4_DEBUG), 4) CPPFLAGS += -DENABLE_S4_TRACE CPPFLAGS += -DDUMP_MATRICES CPPFLAGS += -DDUMP_MATRICES_LARGE -CPPFLAGS += -ggdb +CPPFLAGS += -ggdb endif ifdef BOOST_INC @@ -156,7 +166,7 @@ objdir: mkdir -p $(OBJDIR)/S4k mkdir -p $(OBJDIR)/S4r mkdir -p $(OBJDIR)/modules - + S4_LIBOBJS = \ $(OBJDIR)/S4k/S4.o \ $(OBJDIR)/S4k/rcwa.o \ @@ -256,7 +266,7 @@ $(OBJDIR)/S4k/convert.o: S4/convert.c $(OBJDIR)/S4k/Eigensystems.o: S4/RNP/Eigensystems.cpp $(CXX) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - + $(OBJDIR)/S4r/Material.o: S4r/Material.cpp S4r/Material.hpp S4r/Types.hpp @@ -283,11 +293,11 @@ $(OBJDIR)/S4r/IRA.o: S4r/IRA.cpp S4r/IRA.hpp S4r/Types.hpp $(CXX) -c $(CFLAGS) $(CPPFLAGS) -I. $< -o $@ $(OBJDIR)/S4r/intersection.o: S4r/intersection.c S4r/intersection.h $(CC) -c -O3 $< -o $@ -$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h +$(OBJDIR)/S4r/periodic_off2.o: S4r/periodic_off2.c S4r/periodic_off2.h $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ $(OBJDIR)/S4r/predicates.o: S4r/predicates.c $(CC) -c -O3 $< -o $@ - + #### Lua Frontend $(OBJDIR)/S4k/main_lua.o: S4/main_lua.c objdir @@ -315,9 +325,11 @@ FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d. #### Python extension +BOOST_PREFIX = /opt/homebrew/ + S4_pyext: objdir $(S4_LIBNAME) sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) pip3 install --upgrade ./ clean: - rm -rf $(OBJDIR) + rm -rf $(OBJDIR) \ No newline at end of file From 8aa265b2bd1aad7ae1b369cae79c6298d1ce2260 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 26 Jun 2024 15:40:57 +1000 Subject: [PATCH 53/55] Rename interpolator (#10) * avoid variable name I in Interpolator.h and main_python.c --- Makefile.m1 | 3 ++- S4/Interpolator.c | 4 ++-- S4/Interpolator.h | 4 ++-- S4/main_python.c | 20 ++++++++++---------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Makefile.m1 b/Makefile.m1 index c593798c..96b03ea2 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,8 +91,9 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/include/ +BOOST_INC = -I/opt/homebrew/include/boost -I/opt/homebrew/include/boost/serialization BOOST_LIBS = -lboost_serialization +# will say -lboost_serialization is unused but this is A LIE, get "flat namespace" error without it!!! ##################### DO NOT EDIT BELOW THIS LINE ##################### diff --git a/S4/Interpolator.c b/S4/Interpolator.c index 7504b332..6754345b 100644 --- a/S4/Interpolator.c +++ b/S4/Interpolator.c @@ -54,7 +54,7 @@ double* Interpolator_Get(const Interpolator I, double x, int *ny){ if(I->n < 1){ return NULL; } const int ld = 1+I->ny; int i, j; - + *ny = I->ny; switch(I->type){ case Interpolator_CUBIC_SPLINE: @@ -114,4 +114,4 @@ double* Interpolator_Get(const Interpolator I, double x, int *ny){ } } return NULL; -} +} \ No newline at end of file diff --git a/S4/Interpolator.h b/S4/Interpolator.h index 702328dc..3ef4e0b6 100644 --- a/S4/Interpolator.h +++ b/S4/Interpolator.h @@ -28,7 +28,7 @@ typedef enum Interpolator_type_{ } Interpolator_type; Interpolator Interpolator_New(int n, int ny, double *xy, Interpolator_type type); -void Interpolator_Destroy(Interpolator I); -double* Interpolator_Get(const Interpolator I, double x, int *ny); +void Interpolator_Destroy(Interpolator intp); +double* Interpolator_Get(const Interpolator intp, double x, int *ny); #endif /* _INTERPOLATOR_H_ */ diff --git a/S4/main_python.c b/S4/main_python.c index 6cd3637b..adac9b8d 100644 --- a/S4/main_python.c +++ b/S4/main_python.c @@ -187,7 +187,7 @@ typedef struct{ typedef struct { PyObject_HEAD - Interpolator I; + Interpolator intp; }S4Interpolator; typedef struct @@ -566,7 +566,7 @@ static PyObject *S4Interpolator_new(PyTypeObject *type, PyObject *args, PyObject free(interData.xy); interData.xy = NULL; return NULL; } - self->I = Interpolator_New(interData.n, interData.ny, interData.xy, inter_type); + self->intp = Interpolator_New(interData.n, interData.ny, interData.xy, inter_type); } free(interData.xy); interData.xy = NULL; return (PyObject*)self; @@ -581,7 +581,7 @@ static PyObject *S4Interpolator_Get(S4Interpolator *self, PyObject *args, PyObje PyObject *ret; if(!PyArg_ParseTupleAndKeywords(args, kwds, "d:Get", kwlist, &x)) return NULL; - ys = Interpolator_Get(self->I, x, &ny); + ys = Interpolator_Get(self->intp, x, &ny); if(NULL == ys) Py_RETURN_NONE; ret = PyTuple_New(ny); @@ -645,7 +645,7 @@ static void S4Sim_dealloc(S4Sim* self){ static void S4Interpolator_dealloc(S4Interpolator *self) { - Interpolator_Destroy(self->I); + Interpolator_Destroy(self->intp); Py_TYPE(self)->tp_free((PyObject*) self); } @@ -1205,9 +1205,9 @@ static PyObject *S4Sim_GetPropagationConstants(S4Sim *self, PyObject *args, PyOb return NULL; } n = Simulation_GetNumG(&(self->S), &G); - int n2 = 2*n; + int n2 = 2*n; // q vector in S4 contains 2*n complex doubles, meaning we need a memory - // space that can accomodate 4*n doubles + // space that can accomodate 4*n doubles q = (double*)malloc(sizeof(double)*2*n2); ret = Simulation_GetPropagationConstants(&(self->S), layer, q); if(0 != ret){ @@ -1478,12 +1478,12 @@ static PyObject *S4Sim_GetFieldsOnGridNumpy(S4Sim *self, PyObject *args, PyObjec /* PyArray_Descr* desc = PyArray_DescrFromType(NPY_COMPLEX128); */ Earr = PyArray_SimpleNewFromData(3, dims, NPY_COMPLEX128, Efields); /* PyArray_Dims new_dims; */ - /* npy_intp tmp[3] = {1, 0, 2}; */ + /* npy_intp tmp[3] = {1, 0, 2}; */ /* new_dims.ptr = tmp; */ /* new_dims.len = 3; */ /* Earr = PyArray_Transpose(Earr, &new_dims); */ /* npy_intp *strides = PyArray_STRIDES(Earr); */ - /* npy_intp temp; */ + /* npy_intp temp; */ /* temp = strides[0]; */ /* strides[0] = strides[1]; */ /* strides[1] = temp; */ @@ -1511,7 +1511,7 @@ static PyObject *S4Sim_GetFieldsOnGridNumpy(S4Sim *self, PyObject *args, PyObjec /* if (!(EHfields = PyArray_Zeros(4, &dims, desc, 0))) { */ /* goto fail; */ /* } */ - + /* return EHfields; */ /* return Py_BuildValue("(OO)", Earr, Harr); */ return Py_BuildValue("(NN)", Earr, Harr); @@ -2244,4 +2244,4 @@ PyMODINIT_FUNC initS4(void) #ifdef __cplusplus } -#endif +#endif \ No newline at end of file From c1b835758f31907bfd0eefa81e5b84e67fb6df27 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Thu, 27 Jun 2024 14:40:37 +1000 Subject: [PATCH 54/55] simplify boost linking paths again --- Makefile.m1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.m1 b/Makefile.m1 index 96b03ea2..c3e3d1e6 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -91,7 +91,7 @@ S4_BINNAME = $(OBJDIR)/S4 S4_LIBNAME = $(OBJDIR)/libS4.a S4r_LIBNAME = $(OBJDIR)/libS4r.a -BOOST_INC = -I/opt/homebrew/include/boost -I/opt/homebrew/include/boost/serialization +BOOST_INC = -I/opt/homebrew/include/ BOOST_LIBS = -lboost_serialization # will say -lboost_serialization is unused but this is A LIE, get "flat namespace" error without it!!! From 9569f5e555b967a4324eb1ea593d0f9f40761a61 Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Wed, 11 Jun 2025 16:47:27 +1000 Subject: [PATCH 55/55] fix clang 17 issues, add flags for old setup.py build system: --- Makefile | 2 +- Makefile.m1 | 2 +- Makefile.mac_intel | 2 +- S4/S4.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index b995dd6d..257783af 100644 --- a/Makefile +++ b/Makefile @@ -349,7 +349,7 @@ FunctionSampler2D.so: modules/function_sampler_2d.c modules/function_sampler_2d. S4_pyext: objdir $(S4_LIBNAME) sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) - pip3 install --upgrade ./ + pip3 install --upgrade --use-pep517 --no-build-isolation ./ clean: rm -rf $(OBJDIR) \ No newline at end of file diff --git a/Makefile.m1 b/Makefile.m1 index c3e3d1e6..156f5e5e 100644 --- a/Makefile.m1 +++ b/Makefile.m1 @@ -331,7 +331,7 @@ BOOST_PREFIX = /opt/homebrew/ S4_pyext: objdir $(S4_LIBNAME) sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) - pip3 install --upgrade ./ + pip3 install --upgrade --use-pep517 --no-build-isolation ./ clean: rm -rf $(OBJDIR) diff --git a/Makefile.mac_intel b/Makefile.mac_intel index 34b883f4..ffd132e5 100644 --- a/Makefile.mac_intel +++ b/Makefile.mac_intel @@ -329,7 +329,7 @@ BOOST_PREFIX = /opt/homebrew/ S4_pyext: objdir $(S4_LIBNAME) sh gensetup.py.sh $(OBJDIR) $(S4_LIBNAME) "$(LIBS)" $(BOOST_PREFIX) - pip3 install --upgrade ./ + pip3 install --upgrade --use-pep517 --no-build-isolation ./ clean: rm -rf $(OBJDIR) \ No newline at end of file diff --git a/S4/S4.cpp b/S4/S4.cpp index d0ac9dfe..566ab7aa 100644 --- a/S4/S4.cpp +++ b/S4/S4.cpp @@ -3054,7 +3054,7 @@ int Simulation_GetFieldPlane(Simulation *S, int nxy[2], double zz, double *E, do 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] }; + size_t snxy[2] = { static_cast(nxy[0]), static_cast(nxy[1]) }; std::complex *P = NULL; std::complex *W = NULL; std::complex *epsilon = NULL;