#!/bin/bash

export ROOT_DIR=$HOME/NAMD_BUILD
export LIBRARY_PATH=$LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$C_INCLUDE_PATH
export C_COMP=icc
export F_COMP=ifort
export CXX_COMP=icpc
export MPIC_COMP=mpiicc
export MPICXX_COMP=mpiicpc
export MPIF_COMP=mpiifort
export MPIF77_COMP=mpiifort

export LIBRARY_PATH=$ROOT_DIR/common_dependencies/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=$ROOT_DIR/common_dependencies/lib:$LD_LIBRARY_PATH
export PATH=$ROOT_DIR/common_dependencies/bin:$PATH
export C_INCLUDE_PATH=$ROOT_DIR/common_dependencies/include:$C_INCLUDE_PATH

if [ ! -d $ROOT_DIR ]; then
	mkdir -p $ROOT_DIR/common_dependencies
	mkdir -p $ROOT_DIR/logs
fi

cd $ROOT_DIR


if [ ! -f tcl8.5.18-src.tar.gz ]; then
	wget http://downloads.sourceforge.net/project/tcl/Tcl/8.5.18/tcl8.5.18-src.tar.gz?r=&ts=1437718859&use_mirror=liquidtelecom 
fi
if [ ! -f tk8.5.18-src.tar.gz ]; then
	wget http://downloads.sourceforge.net/project/tcl/Tcl/8.5.18/tk8.5.18-src.tar.gz?r=&ts=1437718913&use_mirror=liquidtelecom
fi

if [ ! -f fftw-2.1.5.tar.gz ]; then
	wget http://www.fftw.org/fftw-2.1.5.tar.gz
fi

if [ ! -f fftw-3.3.4.tar.gz ]; then

	wget http://www.fftw.org/fftw-3.3.4.tar.gz
fi
if [ ! -f NAMD_2.10_Source.tar.gz ]; then
	wget http://www.ks.uiuc.edu/Research/namd/2.10/download/578621/NAMD_2.10_Source.tar.gz
fi
if [ ! -f apoa1.tar.gz ]; then
	wget http://www.ks.uiuc.edu/Research/namd/utilities/apoa1.tar.gz
fi

	tar -xzvf tk8.5.18-src.tar.gz
	tar -xzvf tcl8.5.18-src.tar.gz
	tar -xzvf fftw-2.1.5.tar.gz
	tar -xzvf fftw-3.3.4.tar.gz
	tar -xzvf NAMD_2.10_Source.tar.gz


echo "#################| TCL 8.5  |##########################"
if [ ! -f $ROOT_DIR/common_dependencies/lib/libtcl8.5.so ]; then

	cd $ROOT_DIR/tcl8.5.18/unix
	CC=$MPIC_COMP CFLAGS="-fPIC" ./configure --prefix="$ROOT_DIR/common_dependencies" --enable-threads --enable-64bit |tee $ROOT_DIR/logs/tcl_8.5_config.log 
	make| tee $ROOT_DIR/logs/tcl_8.5_make.log 
	make install
fi


echo "#################| TK 8.5  |#########################"
if [ ! -f $ROOT_DIR/common_dependencies/lib/libtk8.5.so ]; then

	cd $ROOT_DIR/tk8.5.18/unix
	CC=$MPIC_COMP CFLAGS="-fPIC" LDFLAGS="-L$ROOT_DIR/common_dependencies/lib" ./configure --prefix="$ROOT_DIR/common_dependencies" --enable-threads --enable-64bit|tee $ROOT_DIR/logs/tk_8.5_config.log
	make|tee $ROOT_DIR/logs/tk_8.5_make.log
	make install
fi

echo "################| FFTW 2 installation |####################"
if [ ! -f $ROOT_DIR/common_dependencies/lib/libfftw.a ]; then
	cd $ROOT_DIR/fftw-2.1.5
	MPICC=$MPIC_COMP CC=$C_COMP CFLAGS="-fPIC" F77=$F_COMP FFLAGS="-fPIC" ./configure --prefix="$ROOT_DIR/common_dependencies" --enable-type-prefix --enable-float --with-openmp  --enable-mpi
	make
	make install
	make clean
	./configure --prefix="$ROOT_DIR/common_dependencies" 
	make
	make install	
fi
<<comment
echo "#################| FFTW3 installation |####################"
if [ ! -f $ROOT_DIR/common_dependencies/lib/libfftw3f.a ]; then
        cd $ROOT_DIR/fftw-3.3.4
        sed  -i '13042s/mpicc/mpiicc/' configure
        CC=$MPIC_COMP CXX=$MPICXX_COMP F77=$MPIF77_COMP CFLAGS="-fPIC" FFLAGS="-fPIC" LDFLAGS="-L$ROOT_DIR/common_dependencies/lib" LIBS="-lifcore -lifport" ./configure --prefix=$ROOT_DIR/common_dependencies --enable-openmp --enable-mpi --enable-single|tee $ROOT_DIR/logs/fftw3.3.4_config.log
        make |tee $ROOT_DIR/logs/fftw3.3.4_make.log
        make install
	make clean
        CC=$MPIC_COMP CXX=$MPICXX_COMP F77=$MPIF77_COMP CFLAGS="-fPIC" FFLAGS="-fPIC" LDFLAGS="-L$ROOT_DIR/common_dependencies/lib" LIBS="-lifcore -lifport" ./configure --prefix=$ROOT_DIR/common_dependencies --enable-openmp --enable-mpi |tee $ROOT_DIR/logs/fftw3.3.4_config.log
        make |tee $ROOT_DIR/logs/fftw3.3.4_make.log
        make install
fi
comment

#read namd

echo "################| Charm 6.6 installation |##################"

export MY_CHARM_ARCH=mpi-linux-x86_64

if [ ! -f $ROOT_DIR/NAMD_2.10_Source/charm-6.6.1/$MY_CHARM_ARCH-ifort-mpicxx/bin/charmrun ]; then
	cd $ROOT_DIR/NAMD_2.10_Source
	tar -xvf charm-6.6.1.tar
	cd charm-6.6.1/

	sed -i "s/mpicxx/mpiicpc/g" $ROOT_DIR/NAMD_2.10_Source/charm-6.6.1/smart-build.pl
	export CHARM_CONFIG_FILES=$ROOT_DIR/NAMD_2.10_Source/charm-6.6.1/src/arch/$MY_CHARM_ARCH


	sed -i "/^g++/a mpiicc\) CMK_AMD64=\"-O3 -fPIC\" ;;" $CHARM_CONFIG_FILES/conv-mach.sh
	sed -i "/^CMK_NATIVE_[CC|LD]/ s/gcc/$C_COMP/g" $CHARM_CONFIG_FILES/conv-mach.sh
	sed -i "/^CMK_NATIVE_[CXX|LDXX]/ s/g++/$CXX_COMP/g" $CHARM_CONFIG_FILES/conv-mach.sh
	sed -i "/^CMK_CF90/ s/f95/$F_COMP/g" $CHARM_CONFIG_FILES/conv-mach.sh
	sed -i "s/conv-mach-gfortran.sh/conv-mach-ifort.sh/g" $CHARM_CONFIG_FILES/conv-mach.sh


	sed -i "/^CMK_CF77/a CMK_CF77=\"$MPIF_COMP -auto -fPIC \"" $CHARM_CONFIG_FILES/cc-mpicxx.sh
	sed -i "/^CMK_CF90/a CMK_CF90=\"$MPIF_COMP -auto -fPIC \"" $CHARM_CONFIG_FILES/cc-mpicxx.sh
	sed -i "s/^MPICXX_DEF/MPICXX_DEF=$MPICXX_COMP/g" $CHARM_CONFIG_FILES/cc-mpicxx.sh
	sed -i "s/^MPICC_DEF/MPICC_DEF=$MPIC_COMP/g" $CHARM_CONFIG_FILES/cc-mpicxx.sh


#why mpicxx needed hete?
	MPICXX=$MPICXX_COMP CXX=$CXX_COMP ./build charm++  $MY_CHARM_ARCH mpicxx $F_COMP --with-production --no-shared -O3 -DCMK_OPTIMIZE=1 -j8 | tee $ROOT_DIR/logs/charmm6.6_build.log
	##./build charm++ mpi-linux-x86_64 smp mpicxx --with-production -DCMK_OPTIMIZE -DMPICH_IGNORE_CXX_SEEK
	#cd $MY_CHARM_ARCH-ifort-mpicxx/tests/charm++/megatest
	cd $MY_CHARM_ARCH-ifort-mpicxx/tests/charm++/megatest
	make pgm|tee $ROOT_DIR/logs/charmm6.6_testmake.log
	mpirun -n 4 ./pgm
	if [ $(echo $?) == "0" ]; then
		echo "CHARM++ installed properly"
	else
		echo "CHARM++:some error occured "
		read namd_err
	fi
fi

echo "#############| NAMD |###############"
export MY_NAMD_ARCH=Linux-x86_64-icc

if [ ! -f $ROOT_DIR/NAMD_2.10_Source/$MY_NAMD_ARCH/namd2 ]; then

	cd $ROOT_DIR/NAMD_2.10_Source
	sed -i  "/^CHARMBASE/c CHARMBASE=$ROOT_DIR/NAMD_2.10_Source/charm-6.6.1" Make.charm
	sed -i  "/^CHARMARCH/c CHARMARCH=mpi-linux-x86_64-ifort-smp-mpicxx" arch/$MY_NAMD_ARCH.arch
#	sed -i  "/^FLOATOPTS/c FLOATOPTS=-ip -fno-rtti -no-vec" arch/$MY_NAMD_ARCH.arch
	sed -i  "/^FLOATOPTS/c FLOATOPTS= -fomit-frame-pointer -fp-model fast=2 -xHost -ipo " arch/$MY_NAMD_ARCH.arch
	sed -i  "/^CXXOPTS/c CXXOPTS= -static-intel -Ofast \$\(FLOATOPTS\)" arch/$MY_NAMD_ARCH.arch
	sed -i  "/^COPTS/c COPTS= -static-intel -Ofast \$\(FLOATOPTS\)" arch/$MY_NAMD_ARCH.arch

	sed -i  "/^FFTDIR/c FFTDIR=$ROOT_DIR/common_dependencies" arch/Linux-x86_64.fftw3
	sed -i  "/^FFTINCL/c FFTINCL=-I\$\(FFTDIR\)/include" arch/Linux-x86_64.fftw3
	sed -i  "/^FFTLIB/c FFTLIB=-L\$\(FFTDIR\)/lib -lsrfftw -lsfftw " arch/Linux-x86_64.fftw3
	sed -i  "/^FFTFLAGS/c FFTFLAGS=-DNAMD_FFTW" arch/Linux-x86_64.fftw3


	sed -i  "/^TCLDIR/c TCLDIR=$ROOT_DIR/common_dependencies" arch/Linux-x86_64.tcl
	sed -i  "/^TCLLIB/c TCLLIB=-L\$\(TCLDIR\)/lib64 -ltcl8.5 -ldl " arch/Linux-x86_64.tcl
	sed -i  "/^TCLFLAGS/c  TCLFLAGS=-DNAMD_TCL" arch/Linux-x86_64.tcl
#	if [ $# == "1" -a $1 == "mic-enable" ] ; then
#		sed -i "/^CXXMICOPTS/c CXXMICOPTS= -offload-option,mic,compiler,-vec -offload-option,mic,compiler,-restrict -qopenmp" arch/Linux-x86_64.mic
#	fi
# mpi-linux-x86_64-ifort-mpicxx ?
	./config $MY_NAMD_ARCH --charm-base ./charm-6.6.1 --charm-arch $MY_CHARM_ARCH-ifort-mpicxx --with-fftw --fftw-prefix $ROOT_DIR/common_dependencies  --cxx $MPICXX_COMP  --cxx-opts " -Ofast -fomit-frame-pointer -fp-model fast=2 -xHost -ipo  "  --cc $MPIC_COMP --cc-opts "-Ofast -fomit-frame-pointer -fp-model fast=2 -xHost -ipo  "  --with-tcl  --tcl-prefix $ROOT_DIR/common_dependencies | tee $ROOT_DIR/logs/NAMD_config.log
	cd $MY_NAMD_ARCH
	make VERBOSE=1 all | tee $ROOT_DIR/logs/NAMD_make.log
fi
	cd $ROOT_DIR/NAMD_2.10_Source/$MY_NAMD_ARCH/
	cp $ROOT_DIR/apoa1.tar.gz .
	tar -xzvf apoa1.tar.gz
	time mpirun -np 1 ./namd2 +ppn 23 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with1_procs_23ppn.log
#	time mpirun -np 1 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with1_procs.log
#	time mpiexec.hydra -perhost 1 -n 1 ./namd2 +ppn 4 ./apoa1/apoa1.namd |tee $ROOT_DIR/namd_with1_procs_hydra.log
	#time mpirun -np 2 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with2_procs.log
	#time mpirun -np 4 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with4_procs.log
	#time mpirun -np 8 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with8_procs.log
#	time mpirun -np 16 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with16_procs.log
#	time mpirun -np 23 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with23_procs.log
	
#	time mpirun -np 32 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with32_procs.log
#	time mpirun -np 64 ./namd2 ./apoa1/apoa1.namd | tee $ROOT_DIR/namd_with64_procs.log
# GCC VERSION:
# ./build charm++ net-linux-x86_64
# net-linux-x86_64/
#./build charm++ mpi-linux-x86_64   $MPIC_COMP tcp
# mpi-linux-x86_64


