Hi all,
I started out trying meep on Linux to see if it would do what I wanted. At
first, I used the Scheme interface, but didn’t like it, so I followed the
instructions at http://www.fzu.cz/~dominecf/meep/index.html
<http://www.fzu.cz/~dominecf/meep/index.html> to install the python interface.
That works well, but my main OS is OS-X (Yosemite), so I worked at getting
python-meep working in that environment.This post details how I went about
getting that to work. In the end, I had an rich environment that I’m familiar
with and I don’t have to boot back and forth between OSes as I do my day’s
work. As a bonus, meep executes slightly faster on the identical hardware!
First, install Xcode from the App Store and command line tools using the
terminal: xcode-select --install
Next, install home-brew:
ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install
<https://raw.githubusercontent.com/Homebrew/install/master/install>)"
Finish the homebrew installation with:
brew doctor
brew update
Install packages needed to build meep:
brew install guile
brew install —with-mpi homebrew/science/hdf5
brew install homebrew/science/openblas fftw h5utils
brew install pkg-config
brew install swig
brew install automake
brew install autoconf
Log in as a user with admin privileges.
Download libctl library from ab-initio:
http://ab-initio.mit.edu/libctl/libctl-3.2.2.tar.gz
<http://ab-initio.mit.edu/libctl/libctl-3.2.2.tar.gz>.
Unpack that, cd into libctl-3.2.2 and do the usual
./configure
make
sudo make install
Get meep from github:
git clone https://github.com/stevengj/meep
<https://github.com/stevengj/meep>
In the cloned code (on 2/1/15), some files needed to be modified to get swig to
work properly. Specifically, the cloned libctl/Makefile.am caused broken
libctl/meep_swig_bug_workaround.i, libctl/meep_enum_renames.i and
libctl/meep_renames.i to be created.
To fix that I modified two lines in libctl/Makefile.am:
the line after “meep_swig_bug_workaround.i: $(LIBHDRS)” was changed from
-> (echo "// AUTOMATICALLY GENERATED -- DO NOT EDIT"; grep -h friend
$(LIBHDRS) | sed 's/^ *friend \+[A-Za-z_0-9:<>]\+[* ]\+\([A-Za-z_0-9:]*\)
*(.*$$/%ignore \1;/' | grep "%ignore" | sort -u;) > $@
to
-> (echo "// AUTOMATICALLY GENERATED -- DO NOT EDIT"; grep -h friend
$(LIBHDRS) | sed 's/^ *friend *[[:alpha:]_][[:alnum:]_]*
*\([[:alpha:]_][[:alnum:]_]*\) *(.*/%ignore \1;/' | grep "%ignore" | sort -u;)
> $@
the line after “meep_enum_renames.i: $(LIBHDRS)” was changed from
-> (echo "// AUTOMATICALLY GENERATED -- DO NOT EDIT"; for f in
$(LIBHDRS); do egrep "^enum" $$f | sed 's/enum \+\([A-Za-z_0-9:]\+\).*$$/\1/g'
| while read enum; do cat $$f | tr -d '\n' | sed 's/.*enum \+'$${enum}'
*{\([^}]*\)}.*/\1/g' | sed 's/= *[0-9]\+//g' |tr -d ' \t' | tr ',' '\n' | sed
's/^.*$$/'"%rename(meep_$${enum}_\0) meep::\0;/g"; echo; done; done;) > $@
to
-> (echo "// AUTOMATICALLY GENERATED -- DO NOT EDIT";for f in
$(LIBHDRS); do egrep "^enum" $$f | sed 's/enum *\([^}][^}]*\).*};/\1/g' | tr
-d "{" | sed 's/, */ /g' | sed 's/ *= *[[:digit:]][[:digit:]]*//g'| while read
-a array; do varname=$${array[0]};unset "array[0]";for varvalue in
$${array[@]};do echo "%rename(meep_$${varname}_$$varvalue) meep::$$varvalue;";
done;done;done;) > $@
That resulted in good libctl/meep_swig_bug_workaround.i and
libctl/meep_enum_renames.i when make was run, but to fix libctl/meep_renames.i,
I punted and just copied that file over from a meep 1.2.1 distribution.
For the instructions that follow, I used
http://www.fzu.cz/~dominecf/meep/index.html
<http://www.fzu.cz/~dominecf/meep/index.html> as a guide and made modifications
to get things to work on OS-X.
Cd into meep and execute
export CFLAGS=" -fPIC"; export CXXFLAGS=" -fPIC"; export FFLAGS="-fPIC"
export CPPFLAGS="-I/usr/local/include"
export LD_RUN_PATH="/usr/local/lib"
./autogen.sh —-with-mpi --enable-maintainer-mode --enable-shared
--prefix=/usr/local
make && sudo make install
That should take care of the basic meep, but I find it much more convenient to
deal with Python than Scheme, so I installed python-meep, which started with a
download of
https://launchpad.net/python-meep/1.4/1.4/+download/python-meep-1.4.2.tar
<https://launchpad.net/python-meep/1.4/1.4/+download/python-meep-1.4.2.tar>.
The resulting files seemed to require some modification to install in
/usr/local directories and to work properly:
in setup-mpi.py inserted after line 9: import numpy as np
in setup-mpi.py changed the last line to:
include_dirs=includeDir+[np.get_include()]
in setup-mpi.py changed line 16 to: includeDir = ["/usr/local/include”]
in setup-mpi.py changed line 17 to: includeDir = ["/usr/local/lib”]
in make-mpi inserted after line 5: export LD_RUN_PATH=/usr/local/lib
in meep_mpi.py changed line 4918 to: libmpi = CDLL('libmpi.0.dylib’,
RTLD_GLOBAL)
in meep_mpi.py changed line 4921 to: libmpi = CDLL('libmpi.dylib’,
RTLD_GLOBAL)
in meep-site-init.py replaced the # in the first line with //
With those modifications, the installation can proceed:
cd to python-meep directory
as a user with admin privileges execute: sudo ./make-mpi
-I/usr/local/include -L/usr/local/lib
If no errors or omissions have slipped by me, that should get python-meep
running on OS-X.
_______________________________________________
meep-discuss mailing list
meep-discuss@ab-initio.mit.edu
http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/meep-discuss