Sompote commited on
Commit
445e063
·
verified ·
1 Parent(s): 44904b3

Upload app.py

Browse files
Files changed (1) hide show
  1. src/app.py +264 -0
src/app.py ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Streamlit App for PVD Consolidation Analysis
3
+ Shows settlement vs time curve
4
+ """
5
+
6
+ import streamlit as st
7
+ import numpy as np
8
+ import matplotlib.pyplot as plt
9
+ from pvd_consolidation import PVDConsolidation, SoilLayer, PVDProperties
10
+
11
+ # Page configuration
12
+ st.set_page_config(
13
+ page_title="PVD Consolidation Analysis", page_icon="📊", layout="wide"
14
+ )
15
+
16
+ # Title
17
+ st.title("🏗️ PVD Consolidation Analysis")
18
+ st.markdown("### Settlement vs Time Calculator")
19
+
20
+ # Sidebar for inputs
21
+ st.sidebar.header("Input Parameters")
22
+
23
+ # Soil Layer Inputs
24
+ st.sidebar.subheader("Soil Properties")
25
+ n_layers = st.sidebar.number_input(
26
+ "Number of Layers", min_value=1, max_value=10, value=1
27
+ )
28
+
29
+ layers = []
30
+ for i in range(n_layers):
31
+ st.sidebar.markdown(f"**Layer {i + 1}**")
32
+ col1, col2 = st.sidebar.columns(2)
33
+
34
+ with col1:
35
+ thickness = st.number_input(
36
+ f"Thickness (m)", min_value=0.1, value=10.0, step=0.5, key=f"thick_{i}"
37
+ )
38
+ Cv = st.number_input(
39
+ f"Cv (m²/yr)", min_value=0.01, value=0.5, step=0.1, key=f"cv_{i}"
40
+ )
41
+ Ch = st.number_input(
42
+ f"Ch (m²/yr)", min_value=0.01, value=2.0, step=0.1, key=f"ch_{i}"
43
+ )
44
+ RR = st.number_input(
45
+ f"RR", min_value=0.001, value=0.05, step=0.01, format="%.3f", key=f"rr_{i}"
46
+ )
47
+
48
+ with col2:
49
+ CR = st.number_input(
50
+ f"CR", min_value=0.001, value=0.30, step=0.01, format="%.3f", key=f"cr_{i}"
51
+ )
52
+ sigma_ini = st.number_input(
53
+ f"σ'ini (kPa)", min_value=1.0, value=50.0, step=5.0, key=f"sini_{i}"
54
+ )
55
+ sigma_p = st.number_input(
56
+ f"σ'p (kPa)", min_value=1.0, value=80.0, step=5.0, key=f"sp_{i}"
57
+ )
58
+
59
+ layers.append(
60
+ SoilLayer(
61
+ thickness=thickness,
62
+ Cv=Cv,
63
+ Ch=Ch,
64
+ RR=RR,
65
+ CR=CR,
66
+ sigma_ini=sigma_ini,
67
+ sigma_p=sigma_p,
68
+ )
69
+ )
70
+
71
+ st.sidebar.markdown("---")
72
+
73
+ # PVD Properties
74
+ st.sidebar.subheader("PVD Properties")
75
+ col1, col2 = st.sidebar.columns(2)
76
+
77
+ with col1:
78
+ dw = st.number_input(
79
+ "Drain diameter dw (m)", min_value=0.01, value=0.05, step=0.01, format="%.3f"
80
+ )
81
+ ds = st.number_input(
82
+ "Smear zone ds (m)", min_value=0.01, value=0.15, step=0.01, format="%.3f"
83
+ )
84
+ De = st.number_input("Unit cell De (m)", min_value=0.1, value=1.5, step=0.1)
85
+ L_drain = st.number_input("Drain length L (m)", min_value=1.0, value=10.0, step=1.0)
86
+
87
+ with col2:
88
+ kh = st.number_input("kh (m/yr)", min_value=0.1, value=2.0, step=0.1)
89
+ ks = st.number_input("ks (m/yr)", min_value=0.1, value=1.0, step=0.1)
90
+
91
+ well_resistance = st.selectbox(
92
+ "Well Resistance", ["Negligible (qw → ∞)", "Custom qw"]
93
+ )
94
+
95
+ if well_resistance == "Custom qw":
96
+ qw = st.number_input("qw (m³/yr)", min_value=1.0, value=100.0, step=10.0)
97
+ else:
98
+ qw = 1e12 # Very large value for negligible resistance
99
+
100
+ pvd = PVDProperties(dw=dw, ds=ds, De=De, L_drain=L_drain, kh=kh, ks=ks, qw=qw)
101
+
102
+ # Analysis Parameters
103
+ st.sidebar.subheader("Analysis Parameters")
104
+ surcharge = st.sidebar.number_input(
105
+ "Surcharge (kPa)", min_value=1.0, value=100.0, step=10.0
106
+ )
107
+ t_max = st.sidebar.number_input("Max Time (years)", min_value=0.1, value=2.0, step=0.1)
108
+ dt = st.sidebar.number_input(
109
+ "Time Step (years)", min_value=0.001, value=0.01, step=0.001, format="%.3f"
110
+ )
111
+
112
+ # Run Analysis Button
113
+ if st.sidebar.button("🚀 Run Analysis", type="primary"):
114
+ with st.spinner("Calculating consolidation..."):
115
+ try:
116
+ # Create analysis
117
+ analysis = PVDConsolidation(layers, pvd, surcharge, dt)
118
+
119
+ # Calculate settlement vs time
120
+ time, settlement = analysis.settlement_vs_time(t_max=t_max, n_points=200)
121
+ settlement_mm = settlement * 1000 # Convert to mm
122
+
123
+ # Get PVD factors
124
+ Fn, Fs, Fr = analysis.calculate_pvd_factors()
125
+ F_total = Fn + Fs + Fr
126
+
127
+ # Store results in session state
128
+ st.session_state.time = time
129
+ st.session_state.settlement = settlement_mm
130
+ st.session_state.Fn = Fn
131
+ st.session_state.Fs = Fs
132
+ st.session_state.Fr = Fr
133
+ st.session_state.F_total = F_total
134
+ st.session_state.analysis_done = True
135
+
136
+ except Exception as e:
137
+ st.error(f"Error in analysis: {str(e)}")
138
+ st.session_state.analysis_done = False
139
+
140
+ # Display Results
141
+ if hasattr(st.session_state, "analysis_done") and st.session_state.analysis_done:
142
+ # Main plot - Settlement vs Time
143
+ st.subheader("Settlement vs Time")
144
+
145
+ fig, ax = plt.subplots(figsize=(12, 6))
146
+ ax.plot(st.session_state.time, st.session_state.settlement, "b-", linewidth=2.5)
147
+ ax.set_xlabel("Time (years)", fontsize=14, fontweight="bold")
148
+ ax.set_ylabel("Settlement (mm)", fontsize=14, fontweight="bold")
149
+ ax.set_title(
150
+ "PVD Consolidation - Settlement vs Time", fontsize=16, fontweight="bold"
151
+ )
152
+ ax.grid(True, alpha=0.3, linestyle="--")
153
+ ax.tick_params(labelsize=12)
154
+
155
+ # Add final settlement annotation
156
+ final_settlement = st.session_state.settlement[-1]
157
+ ax.axhline(
158
+ y=final_settlement,
159
+ color="r",
160
+ linestyle="--",
161
+ alpha=0.5,
162
+ label=f"Final Settlement = {final_settlement:.1f} mm",
163
+ )
164
+ ax.legend(fontsize=12)
165
+
166
+ st.pyplot(fig)
167
+
168
+ # Summary statistics
169
+ st.subheader("Analysis Summary")
170
+
171
+ col1, col2, col3, col4 = st.columns(4)
172
+
173
+ with col1:
174
+ st.metric("Final Settlement", f"{final_settlement:.1f} mm")
175
+
176
+ with col2:
177
+ # Find time to 90% consolidation
178
+ target_settlement = 0.9 * final_settlement
179
+ idx_90 = np.argmax(st.session_state.settlement >= target_settlement)
180
+ t_90 = (
181
+ st.session_state.time[idx_90] if idx_90 > 0 else st.session_state.time[-1]
182
+ )
183
+ st.metric("Time to 90% U", f"{t_90:.2f} years")
184
+
185
+ with col3:
186
+ # Find time to 50% consolidation
187
+ target_settlement = 0.5 * final_settlement
188
+ idx_50 = np.argmax(st.session_state.settlement >= target_settlement)
189
+ t_50 = (
190
+ st.session_state.time[idx_50] if idx_50 > 0 else st.session_state.time[-1]
191
+ )
192
+ st.metric("Time to 50% U", f"{t_50:.2f} years")
193
+
194
+ with col4:
195
+ st.metric("Total Resistance F", f"{st.session_state.F_total:.2f}")
196
+
197
+ # PVD Factors
198
+ st.subheader("PVD Influence Factors")
199
+
200
+ col1, col2, col3 = st.columns(3)
201
+
202
+ with col1:
203
+ st.metric("Geometric Factor (Fn)", f"{st.session_state.Fn:.3f}")
204
+
205
+ with col2:
206
+ st.metric("Smear Factor (Fs)", f"{st.session_state.Fs:.3f}")
207
+
208
+ with col3:
209
+ st.metric("Well Resistance (Fr)", f"{st.session_state.Fr:.3f}")
210
+
211
+ # Download data
212
+ st.subheader("Download Results")
213
+
214
+ # Prepare CSV data
215
+ csv_data = "Time (years),Settlement (mm)\n"
216
+ for t, s in zip(st.session_state.time, st.session_state.settlement):
217
+ csv_data += f"{t:.4f},{s:.2f}\n"
218
+
219
+ st.download_button(
220
+ label="📥 Download Settlement Data (CSV)",
221
+ data=csv_data,
222
+ file_name="settlement_data.csv",
223
+ mime="text/csv",
224
+ )
225
+
226
+ else:
227
+ # Initial instructions
228
+ st.info(
229
+ "👈 Configure your parameters in the sidebar and click **Run Analysis** to see results"
230
+ )
231
+
232
+ st.markdown("""
233
+ ### Instructions:
234
+
235
+ 1. **Soil Properties**: Enter the properties for each soil layer
236
+ - Thickness (m)
237
+ - Cv: Vertical coefficient of consolidation (m²/year)
238
+ - Ch: Horizontal coefficient of consolidation (m²/year)
239
+ - RR: Recompression ratio
240
+ - CR: Compression ratio
241
+ - σ'ini: Initial effective stress (kPa)
242
+ - σ'p: Preconsolidation pressure (kPa)
243
+
244
+ 2. **PVD Properties**: Configure the drain installation
245
+ - dw: Equivalent drain diameter (m)
246
+ - ds: Smear zone diameter (m)
247
+ - De: Equivalent unit cell diameter (m)
248
+ - L: Drain length (m)
249
+ - kh: Horizontal permeability (m/year)
250
+ - ks: Smear zone permeability (m/year)
251
+ - qw: Well discharge capacity (m³/year)
252
+
253
+ 3. **Analysis Parameters**:
254
+ - Surcharge: Applied load (kPa)
255
+ - Max Time: Analysis duration (years)
256
+ - Time Step: Calculation step size (years)
257
+
258
+ 4. Click **Run Analysis** to calculate and visualize results
259
+ """)
260
+
261
+ # Footer
262
+ st.sidebar.markdown("---")
263
+ st.sidebar.markdown("**PVD Consolidation Calculator**")
264
+ st.sidebar.markdown("Version 1.0")