Fetching contributors…
Cannot retrieve contributors at this time
179 lines (146 sloc) 6.52 KB
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
PortSystem 1.0
PortGroup mpi 1.0
PortGroup linear_algebra 1.0
name berkeleygw
version 2.0.0
categories science
platforms darwin
license BSD
maintainers {dstrubbe @dstrubbe}
description GW/Bethe-Salpeter equation
long_description BerkeleyGW is a set of computer codes that calculate the quasiparticle properties \
and the optical responses of a large variety of materials from bulk periodic crystals \
to nanostructures such as slabs, wires and molecules, using many-body perturbation theory \
(the GW approximation and Bethe-Salpeter equation).
checksums rmd160 56c3330b9f8928439b04b503f56a3df6dc3a32f0 \
sha256 887146cc6598a509a6d2a7b5044d12ebc5a4a2c7b028513f247fe62cf0861563 \
size 71864027
distfiles wkqu37wu77tll53r8t1soe6ozqja67yy.gz
# needed for case-sensitive filesystems
worksrcdir BGW-${version}
depends_lib port:fftw-3
if {![variant_isset fftw2]} {
compilers.enforce_some_fortran fftw-3
# May fail with +mpich +gcc5. Use +mpich +gfortran instead.
# In file included from /opt/local/include/mpich-gcc5/mpi.h:2231:0,
# from icm.cpp:86:
# /opt/local/include/mpich-gcc5/mpicxx.h:22:4: error: #error 'Please use the same version of GCC and g++ for compiling MPICH and user MPI programs'
# # error 'Please use the same version of GCC and g++ for compiling MPICH and user MPI programs'
# ^
# WHAT DO WE DO WHEN meaning of 'gfortran' is updated? No record... Maybe rename to gfortran5 etc. ?
compilers.choose fc cc cxx cpp
mpi.setup require_fortran -g95
# won't compile with g95
#In file Common/timing.p.f:289
# contains
# 1
#Error: Unexpected CONTAINS statement at (1)
if {[mpi_variant_isset]} {
depends_lib-append port:scalapack
#FIXME: this unnecessarily enforces scalapack also had same C compiler as we are using.
# Without this MPI consistency, a seg fault may occur.
mpi.enforce_variant scalapack
# fftw is not universal
universal_variant no
configure {
system -W ${worksrcpath} "sed 's|/opt/local|${prefix}|' < config/ >"
reinplace -W ${worksrcpath} "s|MATHFLAG += -DHDF5||"
# fix changed path, otherwise destroot would fail
patchfiles patch-Makefile.diff all-flavors
use_parallel_build yes
destroot.post_args INSTDIR=${destroot}${prefix} yes
# BN.test will fail because it is written assuming h5
#depends_build port:gsed
pre-test {
reinplace -W ${worksrcpath}/testsuite "s|sed|gsed|" Graphene/Graphene.test Graphene/Graphene_3D.test \
Si-EPM/Si.test Si-EPM/Si_cplx_spin.test
if {[mpi_variant_isset]} {
test.args-append TESTSCRIPT="MPIEXEC=${prefix}/bin/${mpi.exec} make check-parallel" check-jobscript
# FIXME: what about with threads? set OMP_NUM_THREADS=2 and divide ncpus by 2.
if {![catch {sysctl hw.ncpu} ncpus]} {
test.env-append BGW_TEST_MPI_NPROCS=$ncpus
ui_msg "Running testsuite in parallel with $ncpus MPI tasks"
} else { check
notes {
For the purposes of record-keeping and support, please register an account at
pre-build {
build.args-append LINK="${configure.fc}" CC_COMP=${configure.cxx} C_COMP=${} C_LINK=${configure.cxx} \
LAPACKLIB="-L${prefix}/lib/ ${linalglib}"
set mathflag ""
if {[variant_isset hdf5]} {
set mathflag "${mathflag} -DHDF5"
reinplace -W ${worksrcpath} "s|\#HDF5|HDF5|g"
if {[variant_isset fftw2]} {
build.args-append FFTWLIB="-L${prefix}/lib/ -ldfftw"
} else {
if {[variant_isset threads]} {
build.args-append FFTWLIB="-L${prefix}/lib/ -lfftw3 -lfftw3_threads"
} else {
build.args-append FFTWLIB="-L${prefix}/lib/ -lfftw3"
set mathflag "${mathflag} -DUSEFFTW3"
if {[variant_isset g95]} {
build.args-append COMPFLAG="-DG95" FCPP="${} -E -x c -P -ansi" MOD_OPT="-fmod=" \
F90free="${prefix}/bin/g95 -ffree-form -ffree-line-length-huge -fno-second-underscore"
# test, destroot args needed just to avoid trying to build in the test/openmp directory unnecessarily
test.args-append COMPFLAG="-DG95"
destroot.args-append COMPFLAG="-DG95"
} else {
if {[gcc_variant_isset]} {
build.args-append FCPP="${configure.cpp} -C"
} else {
# for clang. Could be wrong in odd situation where no C variant is set, and default is not clang.
build.args-append FCPP="${} -E -x c -ansi"
# gcc is default in so most things do not need to be modified
build.args-append F90free="${configure.fc} -ffree-form -ffree-line-length-none -fno-second-underscore"
if {[variant_isset threads]} {
set paraflag "-DOMP"
} else {
set paraflag ""
if {[mpi_variant_isset]} {
set mathflag "${mathflag} -DUSESCALAPACK"
set paraflag "${paraflag} -DMPI"
build.args-append C_PARAFLAG="-DPARA" SCALAPACKLIB="-L${prefix}/lib/ -lscalapack"
build.args-append MATHFLAG="${mathflag}" PARAFLAG="${paraflag}"
test.args-append MATHFLAG="${mathflag}" PARAFLAG="${paraflag}"
variant threads description {Build with OpenMP support} conflicts g95 {
set configure.fc "${configure.fc} -fopenmp"
variant debug description {Add debug flags for more checking and output, but slower runs.} {
build.args-append DEBUGFLAG="-DDEBUG -DVERBOSE"
variant hdf5 description {Build with HDF5 support for faster epsmat I/O} {
depends_lib-append port:hdf5
require_active_variants port:hdf5 hl
compilers.enforce_fortran hdf5
mpi.enforce_variant hdf5
# if MPI, hdf5 must have MPI
variant fftw2 description {Build with FFTW-2} {
depends_lib-replace port:fftw-3 port:fftw
# fftw port always has a Fortran variant
livecheck.type regex
livecheck.regex BGW-(\[0-9.\]+).tar.gz