#!/usr/bin/env perl
# CONFIGURE FILE FOR SAGUARO3.3
#
# WRITTEN: October 1st 2010
# LAST UPDATE: October 1st 2010
#

# ---------------------------------------------------------------------
# User defined installation parameters
# ---------------------------------------------------------------------

# INSTALL_DIR is where you want binaries installed

$INSTALL_DIR = "~/Saguaro3.3/exe/";

# INSTALL_NAME is what you want to name Saguaro executable

$INSTALL_NAME = "Saguaro3.x";

# COMPILER is what compiler you want to use

$COMPILER = "ifort";

# PARALLEL is the type of parallel coding used (blank means none)
# Options are MPI and MPICH

$PARALLEL = "";

# EXTRA is the location of the extra subroutine used for
# SPECIAL SAGUARO SIMULATIONS (blank means none)
# e.g. $EXTRA = EXTRA/ISRS

$EXTRA = "";

# ---------------------------------------------------------------------
# YOU SHOULD NOT HAVE TO CHANGE ANYTHING BELOW THIS LINE
# ---------------------------------------------------------------------

# START CONFIGURE SCRIPT

# Define Subroutines

sub makefile_line {

   local($a,$i);
   $i = 0;
   $a = "";

   foreach $elem (@_) {

      if ($i == 5){
      $i = 0;
      $a .= "\\\n\t";
      }

      $i = $i + 1;
      $a .= $elem;
      $a .= " ";
   }
   $a;
}

# Get Current Date

($SEC,$MIN,$HR,$MDAY,$MON,$YEAR,$WDAY,$YDAY,$ISDST) = localtime();
$YEAR += 1900;
$DATE = ('January','February','March','April','May','June','July',
'August','September','October','November','December')[$MON] .
" $MDAY, $YEAR";

# Get Tool Locations

@TOOL_DIR = ('analysis','convert','nanalyze','pdb4jmol','pepalyze');

# Write Makefile(s) for tools

foreach $TOOL (@TOOL_DIR) {

open(INFILE, "<tools/$TOOL/Makefile.in") ||
    die "Cannot open tools/$TOOL/Makefile.in: $!\n";

open(OUTFILE, ">tools/$TOOL/Makefile") ||
    die "Cannot open tools/$TOOL/Makefile: $!\n";

print OUTFILE<<EOM;
# $TOOL Makefile
# Written: $DATE

F90 = $COMPILER
FFLAGS =

INSTALL_DIR = $INSTALL_DIR

EOM

while (<INFILE>){
print OUTFILE;
}

close(INFILE);
close(OUTFILE);

}

# Makefile for Saguaro

# SAGUARO Default dependancies

@MAIN = ('saguaro.o');

@MODULES = ('systemparam.o');

@ENERGY = ('bond.o', 'angle.o', 'dihedral.o', 'estatic.o', 'vdw.o',
           'ewald_dir.o', 'ewald_rec.o', 'ewald_pm.o', 'ecavity.o',
           'gborn.o', 'excluded.o', 'scaled.o', 'energy.o');

@HESSIAN = ('bonddu.o', 'angledu.o', 'dihedraldu.o', 'gbornh.o','estatich.o',
            'excludedh.o', 'scaledh.o', 'hessiannbp.o', 'dynamicalu.o',
            'gdynamicalu.o');

@SIMS = ('minimize.o', 'mdynamics.o', 'vibes.o');

@MPI = ('setupnompi.o', 'closenompi.o', 'getmyjobs.o');

@SETUP = ('ewaldbeta.o', 'ewaldsetup.o', 'pmesetup.o', 'setuptpc.o',
          'setupgb.o', 'setupgt.o');

@MAPPING = ('neighbormap.o', 'symmetrymap.o', 'getbasis.o');

@CONSTRAINTS = ('shake.o', 'rattle.o', 'scaler.o', 'scalev.o');

@INOUT = ('getoptions.o', 'getparams.o', 'getgtparams.o', 'chkoptions.o',
          'outputmin.o', 'outputmd.o', 'outputvibe.o');

@MISC = ('random.o', 'cross.o', 'dierfc.o', 'derfc.o', 'bspline.o', 
         'maxwelldist.o', 'rvector.o', 'linemin.o', 'dlapack.o',
         'fft3d.o', 'smooth.o', 'zerop.o', 'matinv.o');

# Make Makefile lines

$MAIN        = &makefile_line(@MAIN);
$MODULES     = &makefile_line(@MODULES);
$ENERGY      = &makefile_line(@ENERGY);
$HESSIAN     = &makefile_line(@HESSIAN);
$SIMS        = &makefile_line(@SIMS);
$MPI         = &makefile_line(@MPI);
$SETUP       = &makefile_line(@SETUP);
$MAPPING     = &makefile_line(@MAPPING);
$CONSTRAINTS = &makefile_line(@CONSTRAINTS);
$INOUT       = &makefile_line(@INOUT);
$MISC        = &makefile_line(@MISC);

# CHECK FOR PARALLEL

$CFLAGS = "";
$PTYPE = 'SERIAL';

if (($PARALLEL =~ /MPI/) || ($PARALLEL =~ /MPICH/)){

$ENERGY =~ s/gborn.o/gborn_mpi.o/;
$ENERGY =~ s/energy.o/energy_mpi.o/;

$HESSIAN =~ s/gbornh.o/gbornh_mpi.o/;
$HESSIAN =~ s/dynamicalu.o/dynamicalu_mpi.o/;
$HESSIAN =~ s/gdynamicalu.o/gdynamicalu_mpi.o/;

$MPI =~ s/setupnompi.o/setupmpi.o/;
$MPI =~ s/closenompi.o/closempi.o/;

}

if (($PARALLEL =~ /MPI/) && ($PARALLEL !~ /MPICH/)){

$CFLAGS = '-lmpi';
$PTYPE = 'PARALLEL (MPI)';

}

if ($PARALLEL =~ /MPICH/){

$COMPILER = 'mpif90';
$PTYPE = 'PARALLEL (MPICH)';

}

# Finally write out Makefile for Saguaro

open(INFILE, "<src/$EXTRA/Makefile.in") ||
    die "Cannot open src/$EXTRA/Makefile.in: $!\n";

open(OUTFILE, ">src/Makefile") ||
    die "Cannot open src/Makefile: $!\n";

print OUTFILE<<EOM;
# Saguaro Makefile
# Written: $DATE
# SERIAL/PARALLEL: $PTYPE
# EXTRAS: $EXTRA

F90 = $COMPILER
FFLAGS = $CFLAGS

INSTALL_DIR = $INSTALL_DIR
INSTALL_NAME = $INSTALL_NAME

# ------- SAGUARO DEPENDANCIES --------

MAIN    = $MAIN

MODULES = $MODULES

ENERGY  = $ENERGY

HESSIAN = $HESSIAN

SIMS    = $SIMS

MPI     = $MPI

SETUP   = $SETUP

MAPPING = $MAPPING

CONSTRAINTS = $CONSTRAINTS

INOUT   = $INOUT

MISC    = $MISC

EOM

while (<INFILE>){
print OUTFILE;
}

close(INFILE);
close(OUTFILE);

#END OF CONFIGURE
