#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
import tempfile
import argparse
import textwrap
from utilities.getuserdir import *
from utilities.common import *
########################
# GENERATOR FUNCTIONS
########################
# mandatory objects
# geometry objects
# measurement objects
# files
[docs]def GEOcommand(filename, BASENAME):
''' CMD file generation '''
#open file
with open(filename, 'w') as FILE:
#~ FILE = fopen(strcat(filename,'.cmd'),'wt')
# Executable = 'D:\fdtd\source\latestfdtd02_03\subgrid\Fdtd32.exe'
Executable = os.path.join(getuserdir(),'bin','fdtd.exe')
#write file
FILE.write("Executable = %s\n" % Executable)
FILE.write("\n")
FILE.write("input = %s.in\n" % BASENAME)
FILE.write("\n")
FILE.write("output = fdtd.out\n")
FILE.write("\n")
FILE.write("error = error.log\n")
FILE.write("\n")
FILE.write("Universe = vanilla\n")
FILE.write("\n")
FILE.write("transfer_files = ALWAYS\n")
FILE.write("\n")
FILE.write("transfer_input_files = entity.lst, %s.geo, %s.inp\n" % (BASENAME, BASENAME))
FILE.write("\n")
FILE.write("Log = foo.log\n")
FILE.write("\n")
FILE.write("Rank = Memory >= 1000\n")
FILE.write("\n")
FILE.write("LongRunJob = TRUE\n")
FILE.write("\n")
FILE.write("###Requirements = (LongRunMachine =?= TRUE)\n")
FILE.write("\n")
FILE.write("queue\n")
#close file
FILE.close()
[docs]def GEOin(filename, file_list, overwrite=True, use_relpath=False):
''' IN file generation '''
# check if file already exists
if not overwrite and os.path.exists(filename):
raise UserWarning('File already exists: ' + filename)
dstdir = os.path.dirname(os.path.abspath(filename))
#write file
with open(filename, 'w') as FILE:
for f in file_list:
f_final = f
if use_relpath:
f_final = os.path.relpath(os.path.abspath(f), start=dstdir)
FILE.write('{}\n'.format(f_final))
[docs]def GEOshellscript(filename, BASENAME, EXE = 'fdtd', WORKDIR = '$JOBDIR', WALLTIME = 12, overwrite=True, PPN=1):
'''
.. todo:: simplify it + merge with GEOshellscript_advanced by adding options
.. todo:: Test if cd ${PBS_O_WORKDIR} also works if the job is not submitted from the directory containing the script.
'''
# check if file already exists
if not overwrite and os.path.exists(filename):
raise UserWarning('File already exists: ' + filename)
#open file
with open(filename, 'w') as FILE:
FILE.write(textwrap.dedent('''\
#!/bin/bash
#
#PBS -l nodes=1:ppn={:d}
#PBS -l walltime={:d}:00:00
#PBS -mabe
#PBS -joe
#
export WORKDIR={}
export EXE={}
if [ -z ${{PBS_O_WORKDIR+x}} ]
then
echo "PBS_O_WORKDIR is unset"
export WORKDIR="$(readlink -f $(dirname "${{0}}"))"
else
echo "PBS_O_WORKDIR is set"
# on compute node, change directory to 'submission directory':
# cd ${{PBS_O_WORKDIR}}
fi
cd ${{WORKDIR}}
echo "WORKDIR = ${{WORKDIR}}"
echo "pwd = $(pwd)"
$EXE {}.in > {}.out
'''.format(PPN, WALLTIME, WORKDIR, EXE, BASENAME, BASENAME) ))
##write file
#FILE.write("#!/bin/bash\n")
#FILE.write("#\n")
#FILE.write("#PBS -l walltime=%d:00:00\n" % WALLTIME)
#FILE.write("#PBS -mabe\n")
#FILE.write("#PBS -joe\n")
#FILE.write("#\n")
#FILE.write("\n")
#FILE.write("\n")
#FILE.write("export WORKDIR=%s\n" % WORKDIR)
#FILE.write("export EXE=%s\n" % EXE)
#FILE.write("\n")
#FILE.write("cd $WORKDIR\n")
#FILE.write("\n")
#FILE.write("$EXE %s.in > %s.out\n" % (BASENAME, BASENAME))
##FILE.write("fix_filenames.py -v .\n")
##close file
#FILE.close()
[docs]def GEOshellscript_advanced(filename, BASENAME, probe_col, EXE = 'fdtd', WORKDIR = '$JOBDIR', WALLTIME = 12):
'''
.. todo:: maybe create a submission function in python...
'''
#open file
with open(filename, 'w') as FILE:
#write file
FILE.write("#!/bin/bash\n")
FILE.write("#\n")
FILE.write("#PBS -l walltime=%d:00:00\n" % WALLTIME)
FILE.write("#PBS -mabe\n")
FILE.write("#PBS -joe\n")
FILE.write("#\n")
FILE.write("\n")
FILE.write("set -eux\n")
FILE.write("\n")
FILE.write('if [ -n "${JOBDIR+x}" ]; then\n')
FILE.write(' echo JOBDIR is set\n')
FILE.write('else\n')
FILE.write(' echo JOBDIR is not set\n')
FILE.write(' JOBDIR="$(readlink -f $(dirname "$0"))"\n')
FILE.write('fi\n')
FILE.write("\n")
FILE.write("export WORKDIR=%s\n" % WORKDIR)
FILE.write("export EXE=%s\n" % EXE)
FILE.write("\n")
FILE.write("cd $WORKDIR\n")
FILE.write("\n")
FILE.write("$EXE %s.in > %s.out\n" % (BASENAME, BASENAME))
FILE.write("fix_filenames.py -v .\n")
FILE.write("matlab_batcher.sh getResonanceFrequencies2 \"'$WORKDIR/p001id.prn',%d,'$WORKDIR/freq_list.txt'\"\n" % probe_col)
FILE.write("resonance_run.py $WORKDIR $WORKDIR/resonance $WORKDIR/freq_list.txt\n")
FILE.write("cd resonance/ && $EXE %s.in >> %s.out\n" % (BASENAME, BASENAME))
FILE.write("fix_filenames.py -v .\n")
FILE.write("plotAll.sh .\n")
#close file
FILE.close()
def main(argv=None):
return
[docs]def main():
parser = argparse.ArgumentParser()
parser.add_argument('DSTDIR', default=tempfile.gettempdir(), nargs='?')
parser.add_argument('-v', '--verbose', action="count", dest="verbosity", default=0, help='verbosity level')
args = parser.parse_args()
print(args)
DSTDIR = args.DSTDIR
if not os.path.isdir(DSTDIR):
os.mkdir(DSTDIR)
print('Writing into: ' + args.DSTDIR)
GEOcommand(os.path.join(args.DSTDIR, 'tmp.bat'), 'BASENAME')
GEOin(os.path.join(args.DSTDIR, 'tmp.in'), ['file','list'])
GEOshellscript(os.path.join(args.DSTDIR, 'tmp.sh'), 'BASENAME', '/usr/bin/superexe', '/work/todo', 999)
return 0
if __name__ == "__main__":
main()