Skip to content

Instantly share code, notes, and snippets.

@koverholt
Last active August 29, 2015 14:16
Show Gist options
  • Select an option

  • Save koverholt/f9805c53eee42f928168 to your computer and use it in GitHub Desktop.

Select an option

Save koverholt/f9805c53eee42f928168 to your computer and use it in GitHub Desktop.
Anaconda Cluster - FDS
from conda_cluster.config import get_cluster_list
import subprocess
SSH_KEY_LOCATION = '/Users/koverholt/.ssh/koverholt.pem'
CLUSTER_NAME = 'cluster_fds'
USER = 'ubuntu'
# List of cluster nodes from conda-cluster
clusters = get_cluster_list()
compute_nodes = clusters[CLUSTER_NAME]['machines']['compute']
# head_ip = clusters[CLUSTER_NAME]['machines']['head'][0]
# compute_ip = clusters[CLUSTER_NAME]['machines']['compute'][0]
# Template input file for FDS simulation software
fds_template = """&HEAD CHID='%(basename)s', TITLE='Test of VENT activation/deactivation' /
&MESH IJK=21,10,10, XB=0.0,2.1,0.0,1.0,0.0,1.0 /
&TIME DT=0.05, T_END=20. /
&SURF ID='BLOW 1', VEL=-0.2, COLOR='PURPLE', PART_ID='TRACER 1' /
&SURF ID='BLOW 2', VEL=-0.2, COLOR='RED', PART_ID='TRACER 2' /
&SURF ID='BLOW 3', VEL=-0.2, COLOR='ORANGE', PART_ID='TRACER 3' /
&SURF ID='BLOW 4', VEL=-0.2, COLOR='YELLOW', PART_ID='TRACER 4' /
&SURF ID='BLOW 5', VEL=-0.2, COLOR='GREEN', PART_ID='TRACER 5' /
&SURF ID='BLOW 6', VEL=-0.2, COLOR='CYAN', PART_ID='TRACER 6' /
&SURF ID='BLOW 7', VEL=-0.2, COLOR='BLUE', PART_ID='TRACER 7' /
&PART ID='TRACER 1', MASSLESS=.TRUE., COLOR='PURPLE' /
&PART ID='TRACER 2', MASSLESS=.TRUE., COLOR='RED' /
&PART ID='TRACER 3', MASSLESS=.TRUE., COLOR='ORANGE' /
&PART ID='TRACER 4', MASSLESS=.TRUE., COLOR='YELLOW' /
&PART ID='TRACER 5', MASSLESS=.TRUE., COLOR='GREEN' /
&PART ID='TRACER 6', MASSLESS=.TRUE., COLOR='CYAN' /
&PART ID='TRACER 7', MASSLESS=.TRUE., COLOR='BLUE', DEVC_ID='timer 7b' /
&VENT XB=0.10,0.20,0.40,0.60,0.00,0.00, SURF_ID='BLOW 1', COLOR='PURPLE', CTRL_ID='controller 1' /
&VENT XB=0.40,0.50,0.40,0.60,0.00,0.00, SURF_ID='BLOW 2', COLOR='RED', DEVC_ID='timer 2' /
&VENT XB=0.70,0.80,0.40,0.60,0.00,0.00, SURF_ID='BLOW 3', COLOR='ORANGE', CTRL_ID='controller 3' /
&VENT XB=1.00,1.10,0.40,0.60,0.00,0.00, SURF_ID='BLOW 4', COLOR='YELLOW', CTRL_ID='controller 4' /
&VENT XB=1.30,1.40,0.40,0.60,0.00,0.00, SURF_ID='BLOW 5', COLOR='GREEN', DEVC_ID='timer 5' /
&VENT XB=1.60,1.70,0.40,0.60,0.00,0.00, SURF_ID='BLOW 6', COLOR='CYAN', DEVC_ID='timer 6' /
&VENT XB=1.90,2.00,0.40,0.60,0.00,0.00, SURF_ID='BLOW 7', COLOR='BLUE', DEVC_ID='timer 7' /
&DEVC XYZ=0.1,0.1,0.1, ID='clock 1', QUANTITY='TIME' /
&DEVC XYZ=0.1,0.1,0.1, ID='timer 2', QUANTITY='TIME', SETPOINT= 5.0 /
&DEVC XYZ=0.1,0.1,0.1, ID='timer 5', QUANTITY='TIME', SETPOINT= 5.0 /
&DEVC XYZ=0.1,0.1,0.1, ID='timer 6', QUANTITY='TIME', SETPOINT= 6.0 /
&DEVC XYZ=0.1,0.1,0.1, ID='timer 7', QUANTITY='TIME', SETPOINT= 7.0 /
&DEVC XYZ=0.1,0.1,0.1, ID='timer 7b', QUANTITY='TIME', SETPOINT=11.0 /
&CTRL ID='controller 1', FUNCTION_TYPE='CUSTOM', INPUT_ID='clock 1', RAMP_ID='ramp 1' /
&RAMP ID='ramp 1', T= 0.00, F=-1. /
&RAMP ID='ramp 1', T= 2.99, F=-1. /
&RAMP ID='ramp 1', T= 3.01, F= 1. /
&RAMP ID='ramp 1', T= 5.99, F= 1. /
&RAMP ID='ramp 1', T= 6.01, F=-1. /
&RAMP ID='ramp 1', T=11.99, F=-1. /
&RAMP ID='ramp 1', T=12.01, F= 1. /
&CTRL ID='controller 3', FUNCTION_TYPE='TIME_DELAY', INPUT_ID='timer 2', DELAY=%(delay)i /
&CTRL ID='controller 4', FUNCTION_TYPE='ALL', INPUT_ID='controller 1','controller 3' /
&VENT MB='XMIN', SURF_ID='OPEN' /
&VENT MB='XMAX', SURF_ID='OPEN' /
&VENT MB='YMIN', SURF_ID='OPEN' /
&VENT MB='YMAX', SURF_ID='OPEN' /
&VENT MB='ZMAX', SURF_ID='OPEN' /
&TAIL /
"""
for i, node in enumerate(compute_nodes, start=1):
print '### Job: ' + str(i) + '; Node: ' + str(node) + ' ###'
# Create input file from template
basename = 'fds_input_' + str(i)
filename = basename + '.fds'
output = fds_template % {
'delay': i,
'basename': basename
}
f = open(filename, 'w')
f.write(output)
f.close()
# (1/3) scp copy input file from local machine to remote node
remote_location = USER + '@' + node + ':~/'
cmd_push = [
'scp',
'-i',
SSH_KEY_LOCATION,
filename,
remote_location
]
print '1/3) Pushing input file to Node ' + str(i) + ' (' + str(node) + ') ...'
subprocess.call(cmd_push)
# (2/3) Define env. variables and run simulation on input file
cmd_run = [
'conda',
'cluster',
'run.cmd',
CLUSTER_NAME,
'export PATH=/home/ubuntu/FDS/FDS6/bin:$PATH; ' +
'export LD_LIBRARY_PATH=/home/ubuntu/FDS/FDS6/bin/LIB64:$LD_LIBRARY_PATH; ' +
'fds ' + filename + ' &> ' + basename + '.err',
'--node=' + str(i),
'--home',
'-s'
]
print '2/3) Running simulation on Node ' + str(i) + ' (' + str(node) + ') ...'
subprocess.call(cmd_run)
# (3/3) scp copy output files from remote node to local machine
remote_files = USER + '@' + node + ':~/' + basename + '*'
local_files = '/Users/koverholt/Desktop/cluster_fds/'
print remote_files, local_files
cmd_get = [
'scp',
'-i',
SSH_KEY_LOCATION,
remote_files,
local_files
]
print '3/3) Getting output files from Node ' + str(i) + ' (' + str(node) + ') ...'
subprocess.call(cmd_get)
print
wget http://dl.bintray.com/nist-fire-research/releases/FDS_6.1.2-SMV_6.1.12_linux64.sh -O fds.sh
sudo apt-get install expect -y
cat > ~/inputs.sh << "EOF"
#!/usr/bin/expect
spawn bash fds.sh
expect "1) Press <Enter> to begin installation"
send "\r"
expect "Press 1 to install in"
send "1\r"
expect "Do you wish to begin the installation?"
send "yes\r"
expect "$ "
EOF
expect inputs.sh
rm fds.sh inputs.sh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment