Spaces:
Running
Running
File size: 6,192 Bytes
bea302b 7d9b2c8 039fea5 ef4ee0c bea302b 7d9b2c8 ef4ee0c 7d9b2c8 b23002b 7d9b2c8 ef4ee0c 7d9b2c8 bea302b 7d9b2c8 bea302b b8d83bb 33cf126 bea302b 7d9b2c8 bea302b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | {% extends "base.html" %}
{% block content %}
<div class="container py-4">
<div class="mb-4">
<h2 class="fw-bold mb-2">Binary Blending Tool</h2>
<p class="page-intro-text mb-0">
Sweep a single additive across a base fuel and predict how mixture CN and YSI change with blend ratio.
</p>
</div>
{% if error %}
<div class="alert alert-danger">
<i class="bi bi-exclamation-triangle me-2"></i>{{ error }}
</div>
{% endif %}
{% if warning %}
<div class="alert alert-warning">
<i class="bi bi-exclamation-circle me-2"></i>{{ warning }}
</div>
{% endif %}
<div class="row g-4">
<!-- Input -->
<div class="col-lg-5">
<div class="card card-metric p-4 h-100">
<h5 class="fw-bold mb-3">Blend Sweep Configuration</h5>
<form method="POST">
<div class="mb-3">
<label class="form-label fw-semibold">Additive SMILES</label>
<input
type="text"
name="additive_smiles"
class="form-control"
value="{{ form_values.additive_smiles }}"
placeholder="e.g. CCCCCCCCCC"
required
>
<div class="form-text">
Enter the SMILES of the additive to blend into the base fuel.
</div>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Base Fuel</label>
<select name="base_fuel_type" class="form-select">
<option value="fossil_diesel" {% if form_values.base_fuel_type == "fossil_diesel" %}selected{% endif %}>
Fossil diesel
</option>
<option value="biodiesel" {% if form_values.base_fuel_type == "biodiesel" %}selected{% endif %}>
Biodiesel
</option>
</select>
</div>
<div class="row g-3">
<div class="col-md-4">
<label class="form-label small fw-semibold">Min fraction</label>
<input
type="number"
step="0.01"
min="0"
max="1"
name="min_fraction"
class="form-control"
value="{{ form_values.min_fraction }}"
>
</div>
<div class="col-md-4">
<label class="form-label small fw-semibold">Max fraction</label>
<input
type="number"
step="0.01"
min="0"
max="1"
name="max_fraction"
class="form-control"
value="{{ form_values.max_fraction }}"
>
</div>
<div class="col-md-4">
<label class="form-label small fw-semibold">Steps</label>
<input
type="number"
min="2"
max="50"
name="n_steps"
class="form-control"
value="{{ form_values.n_steps }}"
>
</div>
</div>
<button type="submit" class="btn btn-primary mt-4 w-100">
Run Blend Sweep
</button>
</form>
</div>
</div>
<!-- Result Summary -->
<div class="col-lg-7">
<div class="card card-metric p-4 h-100">
<h5 class="fw-bold mb-3">Sweep Output</h5>
{% if result %}
<div class="row g-3 mb-3">
<div class="col-md-6">
<div class="border rounded-3 p-3 bg-white">
<p class="text-muted small mb-1">Additive</p>
<code>{{ result.additive_smiles }}</code>
</div>
</div>
<div class="col-md-6">
<div class="border rounded-3 p-3 bg-white">
<p class="text-muted small mb-1">Base fuel</p>
<h6 class="fw-bold mb-0">{{ result.base_fuel_type }}</h6>
</div>
</div>
<div class="col-md-3">
<div class="border rounded-3 p-3 bg-white">
<p class="text-muted small mb-1">Points</p>
<h5 class="fw-bold mb-0">{{ result.n_points }}</h5>
</div>
</div>
<div class="col-md-3">
<div class="border rounded-3 p-3 bg-white">
<p class="text-muted small mb-1">CN range</p>
<h6 class="fw-bold mb-0">{{ result.min_dcn }} – {{ result.max_dcn }}</h6>
</div>
</div>
<div class="col-md-3">
<div class="border rounded-3 p-3 bg-white">
<p class="text-muted small mb-1">YSI range</p>
<h6 class="fw-bold mb-0">{{ result.min_ysi }} – {{ result.max_ysi }}</h6>
</div>
</div>
<div class="col-md-3">
<div class="border rounded-3 p-3 bg-white text-center">
<form method="POST" action="{{ url_for('download_binary_blending') }}">
<input type="hidden" name="results_data" value='{{ download_records | tojson }}'>
<button type="submit" class="btn btn-outline-success btn-sm mt-1">
Download CSV
</button>
</form>
</div>
</div>
</div>
<div class="alert alert-info small mb-0">
CN is predicted using the mixture GNN model. YSI is estimated from pure-component YSI values
using a mass-fraction blending law.
</div>
{% else %}
<div class="text-center text-muted py-5">
<i class="bi bi-sliders display-5 d-block mb-3"></i>
<p class="fw-semibold mb-1">No blend sweep yet</p>
<p class="small mb-0">Enter an additive and sweep range, then run the prediction.</p>
</div>
{% endif %}
</div>
</div>
</div>
{% if result_table %}
<div class="card card-metric p-4 mt-4">
<h5 class="fw-bold mb-3">Blend Sweep Results</h5>
<div class="table-responsive app-table-wrap numeric-table">
{{ result_table | safe }}
</div>
</div>
{% endif %}
</div>
{% endblock %} |