Skip to content

Commit

Permalink
Merge 5cd9a34 into 6268d27
Browse files Browse the repository at this point in the history
  • Loading branch information
gbarter committed Dec 5, 2020
2 parents 6268d27 + 5cd9a34 commit a76f272
Show file tree
Hide file tree
Showing 5 changed files with 168 additions and 96 deletions.
11 changes: 7 additions & 4 deletions wisdem/commonse/fileIO.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import os
import pickle

import numpy as np
import scipy.io as sio
import pandas as pd
import scipy.io as sio


def save_data(fname, prob, npz_file=True, mat_file=True, xls_file=True):
# Remove file extension
froot = os.path.splitext(fname)[0]

# Get all OpenMDAO inputs and outputs into a dictionary
var_dict = prob.model.list_inputs(values=True, prom_name=False, units=True, out_stream=None)
out_dict = prob.model.list_outputs(values=True, prom_name=False, units=True, out_stream=None)
var_dict = prob.model.list_inputs(values=True, prom_name=True, units=True, out_stream=None)
out_dict = prob.model.list_outputs(values=True, prom_name=True, units=True, out_stream=None)
var_dict.extend(out_dict)

# Pickle the full archive so that we can load it back in if we need
Expand Down Expand Up @@ -81,7 +82,9 @@ def load_data(fname, prob):
# Store into Problem object
for k in range(len(var_dict)):
iname = var_dict[k][0]
iname2 = var_dict[k][1]["prom_name"]
value = var_dict[k][1]["value"]
prob[iname] = value
prob.set_val(iname, value)
prob.set_val(iname2, value)

return prob
9 changes: 7 additions & 2 deletions wisdem/glue_code/gc_LoadInputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ class WindTurbineOntologyPython(object):
def __init__(self, fname_input_wt, fname_input_modeling, fname_input_analysis):

self.modeling_options = sch.load_modeling_yaml(fname_input_modeling)
self.wt_init = sch.load_geometry_yaml(fname_input_wt)
self.analysis_options = sch.load_analysis_yaml(fname_input_analysis)
self.defaults = sch.load_default_geometry_yaml()
if fname_input_wt is None:
self.wt_init = None
else:
self.wt_init = sch.load_geometry_yaml(fname_input_wt)
self.set_run_flags()
self.set_openmdao_vectors()
self.set_opt_flags()
Expand Down Expand Up @@ -964,5 +967,7 @@ def write_ontology(self, wt_opt, fname_output):
if self.modeling_options["flags"]["control"]:
self.wt_init["control"]["tsr"] = float(wt_opt["control.rated_TSR"])

# Write yaml with updated values
# Write yamls with updated values
sch.write_geometry_yaml(self.wt_init, fname_output)
sch.write_modeling_yaml(self.modeling_options, fname_output)
sch.write_analysis_yaml(self.analysis_options, fname_output)
20 changes: 19 additions & 1 deletion wisdem/glue_code/runWISDEM.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import sys

import numpy as np

import openmdao.api as om
from wisdem.commonse import fileIO
from wisdem.commonse.mpi_tools import MPI
Expand Down Expand Up @@ -124,3 +123,22 @@ def run_wisdem(fname_wt_input, fname_modeling_options, fname_opt_options, overri
return wt_opt, modeling_options, opt_options
else:
return [], [], []


def load_wisdem(frootin):
froot = os.path.splitext(frootin)[0]
fgeom = froot + ".yaml"
fmodel = froot + "-modeling.yaml"
fopt = froot + "-analysis.yaml"
fpkl = froot + ".pkl"

# Load all yaml inputs and validate (also fills in defaults)
wt_initial = WindTurbineOntologyPython(fgeom, fmodel, fopt)
wt_init, modeling_options, opt_options = wt_initial.get_input_data()

wt_opt = om.Problem(model=WindPark(modeling_options=modeling_options, opt_options=opt_options))
wt_opt.setup()

wt_opt = fileIO.load_data(fpkl, wt_opt)

return wt_opt, modeling_options, opt_options
43 changes: 32 additions & 11 deletions wisdem/inputs/validation.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import os

import jsonschema as json

try:
Expand All @@ -8,7 +10,6 @@
except:
raise ImportError("No module named ruamel.yaml or ruamel_yaml")

import os

fdefaults_geom = os.path.join(os.path.dirname(os.path.realpath(__file__)), "geometry_defaults.yaml")
fschema_geom = os.path.join(os.path.dirname(os.path.realpath(__file__)), "geometry_schema.yaml")
Expand Down Expand Up @@ -79,6 +80,18 @@ def integrate_defaults(instance, defaults, yaml_schema):
return instance


def simple_types(indict):
rv = indict
for k in rv.keys():
if not type(rv[k]) in [float, int, list, dict, bool, str]:
rv[k] = ""
try:
simple_types(rv[k])
except:
continue
return rv


# ---------------------
# See: https://python-jsonschema.readthedocs.io/en/stable/faq/#why-doesn-t-my-schema-s-default-property-set-the-default-on-my-instance
def extend_with_default(validator_class):
Expand Down Expand Up @@ -121,6 +134,14 @@ def load_geometry_yaml(finput):
return validate_with_defaults(finput, fschema_geom)


def load_modeling_yaml(finput):
return validate_with_defaults(finput, fschema_model)


def load_analysis_yaml(finput):
return validate_with_defaults(finput, fschema_opt)


def write_geometry_yaml(instance, foutput):
validate_without_defaults(instance, fschema_geom)
sfx_str = ".yaml"
Expand All @@ -129,27 +150,27 @@ def write_geometry_yaml(instance, foutput):
write_yaml(instance, foutput + sfx_str)


def load_modeling_yaml(finput):
return validate_with_defaults(finput, fschema_model)


def write_modeling_yaml(instance, foutput):
validate_without_defaults(instance, fschema_model)
sfx_str = ".yaml"
if foutput[-5:] == sfx_str:
sfx_str = ""
write_yaml(instance, foutput + sfx_str)

foutput = foutput[-5:]
elif foutput[-4:] == ".yml":
foutput = foutput[-4:]
sfx_str = "-modeling.yaml"

def load_analysis_yaml(finput):
return validate_with_defaults(finput, fschema_opt)
instance2 = simple_types(instance)
write_yaml(instance2, foutput + sfx_str)


def write_analysis_yaml(instance, foutput):
validate_without_defaults(instance, fschema_opt)
sfx_str = ".yaml"
if foutput[-5:] == sfx_str:
sfx_str = ""
foutput = foutput[-5:]
elif foutput[-4:] == ".yml":
foutput = foutput[-4:]
sfx_str = "-analysis.yaml"
write_yaml(instance, foutput + sfx_str)


Expand Down

0 comments on commit a76f272

Please sign in to comment.