Source code for new_case_setup
# -*- coding: utf-8 -*-
"""
Created on Thu May 23 11:06:19 2019
@author: Lee
"""
# Following the post processing efforts, create new case files for the next round of simulations
# Feed the new cases into the create block mesh, run surrounding cases, and post_processor for iteration
import numpy as np
import os
from shutil import copytree
[docs]def define_new_case_names(v_cases_total_vector):
"""
Create new case_ folders in the foamfiles folder. Named based on velocities computed in post_processor
Args:
v_cases_total_vector (array): Numpy array listing four velocities to be added to the case queue
Returns:
case_name_list (dict): List of strings each corresponding to a new case file. Named based on velocity values converted to string.
v_cases_total_vector_string (dict): Velocities converted to string dtype
v_boundary_strings (dict): Velocty data converted to string compatible with boundary condition file
"""
# Algorithm ==>
# Pull in the new velocities vector
# convert the vector to a string of length 6.
# delete the "." periods from the string vector
# Empty np array with datatype string
v_cases_total_vector_string = [] # empty list
v_boundary_strings = [] # empty list for strings used in editing the boundary condition files
y = 0 # Looping index
while y < len(v_cases_total_vector):
v_string = str(v_cases_total_vector[y])
v_string_stripped = v_string.strip("[")
v_string_stripped_velocity_strs = v_string_stripped.strip("]")
v_string_stripped = v_string_stripped_velocity_strs.replace(".", "") # replace period with nothing
print("velocity value as string stripped")
print(v_string_stripped)
# eliminate the first and last character of each string (the brackets)
print("y value")
print(y)
# Add string to a list
v_cases_total_vector_string.append(v_string_stripped)
v_boundary_strings.append(v_string_stripped_velocity_strs)
print("v vector string for case titles")
print(v_cases_total_vector_string)
print("velocity numbers for the boundary condition files")
print(v_boundary_strings)
#v_cases_total_vector_string[y] = v_string
#print("v cases total vector string")
#print(v_cases_total_vector_string)
y = y + 1
# add "case_" to the front of each string
prepend = "case_"
case_name_list = []
x = 0
while x < len(v_cases_total_vector):
# extract the non prepended string from the v_cases_total_vector_string
vel_string = v_cases_total_vector_string[x]
case_name = prepend + vel_string
print("case name")
print(case_name)
case_name_list.append(case_name)
x = x + 1
print("case name list")
print(case_name_list)
return case_name_list, v_cases_total_vector_string, v_boundary_strings
[docs]def create_case_directories(case_name_list):
"""Create the directories for next batch of simulations within the foamfiles dir
Args:
case_name_list (dict): List of strings each corresponding to a new case file. Named based on velocity values converted to string.
Returns:
full_case_paths (dict): List of full paths for new cases to be added. Compatible with windows os.
"""
# Current working directory
current_dir = os.getcwd()
print("current working directory")
# Directory steps for foamfiles
directory_steps = "\\foamfiles\\counterFlowFlame2D\\"
# Full root path
full_root_path = current_dir + directory_steps
print("full_path")
print(full_root_path)
# Empty full path vector
full_case_paths = []
x = 0
while x < len(case_name_list):
# add path root the case names based on index x, use mkdir command to make directories
# if directories exist already do nothing and move to next x
case_name = case_name_list[x]
full_path_x = full_root_path + case_name
print("iterative full path")
print(full_path_x)
# Append the full paths vector
full_case_paths.append(full_path_x)
# Check directory existence
# Create new path if the directory doesn't exist, print and move on if it does
exists = os.path.isdir(full_path_x)
if exists == True:
print("case folder ALREADY EXISTS")
else:
print("creating path: ")
print(full_path_x)
os.mkdir(full_path_x)
x = x + 1
return full_case_paths
[docs]def add_templates(full_case_paths):
"""Add the template files to the new case directories
Args:
full_case_paths (dict): List of full paths for new cases to be added. Compatible with windows os.
Returns:
zero_file_paths (dict): List of paths leading to initial condition files for each newly added case
constant_file_paths (dict): List of paths leading to solver files for each newly added case
system_file_paths (dict): List of paths leading to mesh, schemes, time step and outfil writing files for each newly added case
"""
current_dir = os.getcwd()
template_dir_steps = "\\foamfiles\\counterFlowFlame2D\\template_case\\" # template case folder
step_0 = "0" # zero folder
step_system = "system"
step_constant = "constant"
template_case_directory = current_dir + template_dir_steps
zero_folder = template_case_directory + step_0
system_folder = template_case_directory + step_system
constant_folder = template_case_directory + step_constant
# Empty file paths within new case directories
zero_file_paths = []
constant_file_paths = []
system_file_paths = []
# Loop through case paths, and copy/paste into the
x = 0 # looping index
while x < len(full_case_paths):
# Template source directories
zero_source = zero_folder
system_source = system_folder
constant_source = constant_folder
# destination files---copy the entire tree into the new case file folders
zero_destination = full_case_paths[x] + "\\" + step_0
system_destination = full_case_paths[x] + "\\" + step_system
constant_destination = full_case_paths[x] + "\\" + step_constant
copytree(zero_source, zero_destination) # copying file to cases
copytree(system_source, system_destination)
copytree(constant_source, constant_destination)
# Append file path lists
zero_file_paths.append(zero_destination)
system_file_paths.append(system_destination)
constant_file_paths.append(constant_destination)
x = x + 1
print('zero file paths')
print(zero_file_paths)
print('constant file paths')
print(constant_file_paths)
print('system file paths')
print(system_file_paths)
return zero_file_paths, constant_file_paths, system_file_paths
[docs]def edit_details_files(zero_file_paths, v_boundary_strings):
"""
Open and edit the newly created 0 case files. Edit the empty details file with the velocity strings
Args:
zero_file_paths (dict): List of paths leading to initial condition files for each newly added case
v_boundary_strings (dict): Velocity strings to be added to details files for respective case
Returns:
None
"""
details_step = "\\details" # step from zero folder to details file
x = 0 # looping index
while x < len(zero_file_paths):
# loop through the details files and and write the corresponding v_boundary_strings
details_file = zero_file_paths[x] + details_step
with open(details_file, 'w+') as f:
f.write('Velocity' +'\n')
f.write(v_boundary_strings[x])
x = x + 1
[docs]def edit_iterative_boundary_conditions(zero_file_paths, constant_file_paths, system_file_paths, v_boundary_strings):
"""
Args:
zero_file_paths (dict): List of paths leading to initial condition files for each newly added case
v_boundary_strings (dict): Velocity strings to be added to details files for respective case
constant_file_paths (dict): List of paths leading to solver files for each newly added case
system_file_paths (dict): List of paths leading to mesh, schemes, time step and outfil writing files for each newly added case
"""
# comparable to edit_boundary_conditions from the run_surrounding_cases module
# NEGATIVE data for the LHS
# The position for the beginning of the secondary air condition RHS (0 0.1 0) is 986
RHS_pos = 893
U_step = "\\U" # step from zero folder to details file
x = 0 # looping index
while x < len(zero_file_paths):
# loop through the details files and and write the corresponding v_boundary_strings
U_file = zero_file_paths[x] + U_step
U_RHS_str = "(0 " + v_boundary_strings[x] + " 0);"
U_LHS_str = "(0 " + "-" + v_boundary_strings[x] + " 0);"
with open(U_file, '+r') as f:
f.seek(RHS_pos)
f.write(" ")
f.write("Secondary_air_RHS" +'\n')
f.write(" ")
f.write("{" + '\n')
f.write(" ")
f.write("type" + " " + "fixedValue;" + '\n')
f.write(" ")
f.write("value" + " " + "uniform" + " " + U_RHS_str + '\n')
f.write(" ")
f.write("}" + '\n')
f.write('\n')
f.write(" ")
f.write("Secondary_air_LHS" +'\n')
f.write(" ")
f.write("{" + '\n')
f.write(" ")
f.write("type" + " " + "fixedValue;" + '\n')
f.write(" ")
f.write("value" + " " + "uniform" + " " + U_LHS_str + '\n')
f.write(" ")
f.write("}" + '\n')
x = x + 1