===== Building ALPGEN =====
==== Machine dependent compile time changes ====
===For BG/Q===
----
On the command line, run \\
''soft add +mpiwrapper-xl'' \\
and change the following in the file ''compile.mk'' \\
ifeq ($(shell uname),Linux)
# FFF = gfortran -fno-automatic
# FF90 = gfortran -fno-automatic
FFF = mpif77 -fno-automatic
FF90 = mpif90 -fno-automatic
# Or if you want optimization use this
# FFF = mpixlf77 -O5 -qarch=qp -qtune=qp -qsave -qsimd=auto -qhot=level=1 -qprefetch -qunroll=yes -qnoipa -qfloat=rsqrt:hssngl:fltint
# FF90 = mpixlf90 -O5 -qarch=qp -qtune=qp -qsave -qsimd=auto -qhot=level=1 -qprefetch -qunroll=yes -qnoipa -qfloat=rsqrt:hssngl:fltint
#FFF = g77 -O1 -Wall -fno-automatic -Wno-globals -fno-backslash \
# -ffast-math
endif
On line 182 of the file ''alplib/alpgen.f'' change \\
''access='append' '' \\
to \\
''position='append' '' \\
Now, Alpgen creates its own ''asinh()'' function. Alternating versions of Fortran have an asinh() function or does not have it. The version installed on the BGP does not have it, so there is no conflict. However, the BGQ version has the ''asinh()'' defined so we need to replace every mention of ''asinh()'' in Alpgen to some unique name. In this case, we chose ''argsignh()''. Use this command:
find . -exec grep -l "asinh" {} \; | xargs -I GGGG sh -c 'sed "s/asinh/argsinh/g" GGGG > GGGG.tmp; mv GGGG.tmp GGGG'
You will get error: \\
''ld: -f may not be used without -shared'' \\
to fix it one needs to do the following: \\
mpixlf77 -o wqqgen ./wqqusr.o ../wqqlib/wqq.o \
../alplib/alpgen.o ../alplib/alputi.o ../alplib/alppdf.o \
../alplib/Acp.o ../alplib/Asu3.o ../alplib/Aint.o
(or similar) to pass the linking phase.
=== Carver ===
----
Change ''compile.mk'' to have the following changes:
module swap pgi gcc
module swap openmpi openmpi-gcc
Then everything is fine.
=== Hopper ===
----
Run \\
''module swap PrgEnv-pgi PrgEnv-gnu'' \\
That requires ''compile.mk'' to have the following changes
ifeq ($(shell uname),Linux)
# FFF = gfortran -fno-automatic
# FF90 = gfortran -fno-automatic
FFF = ftn
FF90 = ftn
#FFF = g77 -O1 -Wall -fno-automatic -Wno-globals -fno-backslash \
# -ffast-math
endif
=== Edison ===
----
Run \\
''module swap PrgEnv-intel PrgEnv-gnu'' \\
That requires ''compile.mk'' to have the following changes
ifeq ($(shell uname),Linux)
# FFF = gfortran -fno-automatic
# FF90 = gfortran -fno-automatic
FFF = ftn
FF90 = ftn
#FFF = g77 -O1 -Wall -fno-automatic -Wno-globals -fno-backslash \
# -ffast-math
endif
==== Introduce MPI to Alpgen ====
=== Edits to ''alplib/alpgen.f'' ===
----
In subroutine ''alsdef'' in file ''alplib/alpgen.f'' near line 209, just after \\
''c common declarations'' \\
add/merge these lines
integer mpirank
character*5 rankstring
common/mpi/mpirank,rankstring
c local variables
double precision dummy,ranset,ranset2
integer i,retval,chdir
c
----
Near line 230, just before \\
''c list processes'' \\
add the lines
C MPI variables
include 'mpif.h'
integer rank, size, ierror, tag, status(MPI_STATUS_SIZE)
Following the remaining variable definitions, add this code
c beginning of MPI block
c retrieve MPI rank information
call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
mpirank = rank
call MPI_FINALIZE(ierror)
write(6,*) 'MPI finalized: rank ', mpirank
write( rankstring, '(i8.8)' ) mpirank
c work in a unique directory ./work/rankstring
retval = chdir('work/'//rankstring//CHAR(0))
if(retval.ne.0) then
write(6,*) 'Error changing directory to "work/rankstring" '
endif
c end of MPI block
----
Just after the lines (near line 338)
c save parameter values to relative variables in common blocks
call alspar
Add the lines
c beginning of MPI block
iseed(1)=iseed(1)+mod(mpirank,65536)
iseed(2)=iseed(2)+int(mpirank/65536)
print*, 'Seeds and mpirank', iseed(1),iseed(2),mpirank
c end of MPI block
----
In subroutine ''alstio'', just after
include 'alpgen.inc'
(near line 4584) add the lines:
integer mpirank
character*5 rankstring
common/mpi/mpirank,rankstring
----
Near line 4588, replace
call alustc(fname,'.wgt',tmpstr)
with
call alustc('../../'//fname,'.'//rankstring//'.wgt',tmpstr)
immediately after
write(6,*) 'Run parameters and diagnostics written to '
$ ,tmpstr(1:l)
This outputs the weighted event files in a common directory
----
Replace unit ''5'' with unit ''9'' for input near line 306, after \\
''C MANDATORY INPUTS add'' \\
For BlueGene
open(9,file='../../input.1',action='read')
For Carver
open(9,file='../../input.1',access='read')
This reads the input configuration from file, instead of from the command line input via a redirect as in the tutorial.
Then replace all \\
''READ(5,'' \\
with \\
''READ(9,''
This ensures everywhere is reading from the input file instead of ''stdin''. Only change this in the ''alplib/alpgen.f'' file.