|
try: |
|
# Calculation of polarization curve for each dataset |
|
if isinstance(check_calc_ui, list): |
|
if "calc_ui" in check_calc_ui: |
|
ui_calculation = True |
|
else: |
|
ui_calculation = False |
|
else: |
|
ui_calculation = False |
|
|
|
# Number of refinement steps for ui calculation |
|
n_refinements = 10 |
|
|
|
mode = check_study_type |
|
|
|
# Progress bar init |
|
std_err_backup = sys.stderr |
|
file_prog = open('progress.txt', 'w') |
|
sys.stderr = file_prog |
|
|
|
# Read pemfc settings.json from store |
|
settings = dc.read_data(settings) |
|
|
|
# Read data from input fields and save input in dict (legacy) |
|
# / pd.DataDrame (one row with index "nominal") |
|
df_input = dc.process_inputs( |
|
inputs, inputs2, ids, ids2, returntype="DataFrame") |
|
df_input_backup = df_input.copy() |
|
|
|
# Create multiple parameter sets |
|
if variation_mode == "dash_table": |
|
data = sf.variation_parameter( |
|
df_input, keep_nominal=False, mode=mode, table_input=tabledata) |
|
else: |
|
data = sf.variation_parameter( |
|
df_input, keep_nominal=False, mode=mode, table_input=None) |
|
|
|
if not ui_calculation: |
|
# Create complete setting dict & append it in additional column |
|
# "settings" to df_input |
|
data = dc.create_settings( |
|
data, settings, input_cols=df_input.columns) |
|
# Run Simulation |
|
results, success, err_modal, err_msg = sim.run_simulation(data) |
|
|
|
# Add parameter set name(s) |
|
results["set_name"] = \ |
|
results.apply(lambda row: ', '.join(f"{varpar}: " + |
|
str(float(row[varpar])) for varpar in |
|
row['variation_parameter']), |
|
axis=1) |
|
|
|
else: # ... calculate pol. curve for each parameter set |
|
results = pd.DataFrame(columns=data.columns) |
|
|
|
for i in range(0, len(data)): |
|
try: |
|
# Ensure DataFrame with double bracket |
|
# https://stackoverflow.com/questions/20383647/pandas-selecting-by-label-sometimes-return-series-sometimes-returns-dataframe |
|
# df_input_single = df_input.loc[[:], :] |
|
max_i = sf.find_max_current_density( |
|
data.iloc[[i]], df_input, settings) |
|
|
|
# # Reset solver settings |
|
# df_input = df_input_backup.copy() |
|
|
|
success = False |
|
|
|
# Prepare & calculate initial points |
|
df_results = sf.uicalc_prepare_initcalc( |
|
input_df=data.iloc[[i]], i_limits=[1, max_i], |
|
settings=settings, input_cols=df_input.columns) |
|
df_results, success, _, _ = sim.run_simulation(df_results) |
|
|
|
if not success: |
|
continue |
|
|
|
# First refinement steps |
|
for _ in range(n_refinements): |
|
df_refine = sf.uicalc_prepare_refinement( |
|
input_df=df_input, data_df=df_results, |
|
settings=settings) |
|
df_refine, success, _, _ = sim.run_simulation( |
|
df_refine, return_unsuccessful=False) |
|
df_results = pd.concat( |
|
[df_results, df_refine], ignore_index=True) |
|
|
|
results = pd.concat([results, df_results], |
|
ignore_index=True) |
|
|
|
except Exception as E: |
|
err_modal = "generic-study-error" |
|
pass |
|
|
|
# Add parameter set name(s) |
|
results["set_name"] = \ |
|
results.apply(lambda row: ', '.join(f"{varpar}: " + |
|
str(float(row[varpar])) for |
|
varpar in |
|
row['variation_parameter']) + |
|
", Current Density: " + |
|
str(round(float( |
|
row['simulation-current_density']), |
|
1)) + " A/m²", |
|
axis=1) |
|
|
|
results = dc.store_data(results) |
|
|
|
df_input_store = dc.store_data(df_input_backup) |
|
|
|
file_prog.close() |
|
sys.stderr = std_err_backup |
|
except Exception as E: |
|
modal_state = not modal_state |
|
modal_title, modal_body = \ |
|
mf.modal_process("generic-study-error", error=repr(E)) |
|
# Save modal input in a dict |
|
modal_input = {'modal_title': modal_title, |
|
'modal_body': modal_body, |
|
'modal_state': modal_state} |
|
return None, None, "", modal_input |