weac 2.6.3__tar.gz → 3.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {weac-2.6.3 → weac-3.0.0}/CITATION.cff +1 -1
- {weac-2.6.3/weac.egg-info → weac-3.0.0}/PKG-INFO +194 -62
- {weac-2.6.3 → weac-3.0.0}/README.md +160 -50
- weac-3.0.0/pyproject.toml +141 -0
- weac-3.0.0/tests/test_comparison_results.py +557 -0
- weac-3.0.0/tests/test_regression_simulation.py +450 -0
- weac-3.0.0/weac/__init__.py +5 -0
- weac-3.0.0/weac/constants.py +37 -0
- weac-3.0.0/weac/logging_config.py +39 -0
- {weac-2.6.3 → weac-3.0.0/weac.egg-info}/PKG-INFO +194 -62
- {weac-2.6.3 → weac-3.0.0}/weac.egg-info/SOURCES.txt +4 -11
- weac-3.0.0/weac.egg-info/requires.txt +42 -0
- weac-2.6.3/pyproject.toml +0 -101
- weac-2.6.3/tests/test_eigensystem.py +0 -467
- weac-2.6.3/tests/test_layered.py +0 -191
- weac-2.6.3/tests/test_mixins.py +0 -184
- weac-2.6.3/tests/test_plot.py +0 -124
- weac-2.6.3/tests/test_tools.py +0 -41
- weac-2.6.3/weac/__init__.py +0 -17
- weac-2.6.3/weac/eigensystem.py +0 -658
- weac-2.6.3/weac/inverse.py +0 -51
- weac-2.6.3/weac/layered.py +0 -64
- weac-2.6.3/weac/mixins.py +0 -2083
- weac-2.6.3/weac/plot.py +0 -675
- weac-2.6.3/weac/tools.py +0 -334
- weac-2.6.3/weac.egg-info/requires.txt +0 -23
- {weac-2.6.3 → weac-3.0.0}/LICENSE +0 -0
- {weac-2.6.3 → weac-3.0.0}/MANIFEST.in +0 -0
- {weac-2.6.3 → weac-3.0.0}/img/bc.png +0 -0
- {weac-2.6.3 → weac-3.0.0}/img/layering.png +0 -0
- {weac-2.6.3 → weac-3.0.0}/img/logo.png +0 -0
- {weac-2.6.3 → weac-3.0.0}/img/model.png +0 -0
- {weac-2.6.3 → weac-3.0.0}/img/profiles.png +0 -0
- {weac-2.6.3 → weac-3.0.0}/img/systems.png +0 -0
- {weac-2.6.3 → weac-3.0.0}/setup.cfg +0 -0
- {weac-2.6.3 → weac-3.0.0}/weac.egg-info/dependency_links.txt +0 -0
- {weac-2.6.3 → weac-3.0.0}/weac.egg-info/top_level.txt +0 -0
|
@@ -8,7 +8,7 @@ authors:
|
|
|
8
8
|
- family-names: "Weissgraeber"
|
|
9
9
|
given-names: "Philipp"
|
|
10
10
|
orcid: "https://orcid.org/0000-0001-8320-8672"
|
|
11
|
-
version:
|
|
11
|
+
version: 3.0.0
|
|
12
12
|
date-released: 2021-12-30
|
|
13
13
|
identifiers:
|
|
14
14
|
- description: Collection of archived snapshots of all versions of WEAC
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: weac
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Weak layer anticrack nucleation model
|
|
5
5
|
Author-email: 2phi GbR <mail@2phi.de>
|
|
6
6
|
License: Proprietary
|
|
@@ -9,31 +9,53 @@ Project-URL: Demo, https://github.com/2phi/weac/blob/main/demo/demo.ipynb
|
|
|
9
9
|
Project-URL: Documentation, https://2phi.github.io/weac
|
|
10
10
|
Project-URL: Issues and feature requests, https://github.com/2phi/weac/issues
|
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
12
14
|
Classifier: License :: Other/Proprietary License
|
|
13
15
|
Classifier: Operating System :: OS Independent
|
|
14
16
|
Classifier: Topic :: Scientific/Engineering
|
|
15
|
-
Requires-Python: >=3.
|
|
17
|
+
Requires-Python: >=3.12
|
|
16
18
|
Description-Content-Type: text/markdown
|
|
17
19
|
License-File: LICENSE
|
|
18
20
|
Requires-Dist: matplotlib>=3.9.1
|
|
19
21
|
Requires-Dist: numpy>=2.0.1
|
|
20
22
|
Requires-Dist: scipy>=1.14.0
|
|
23
|
+
Requires-Dist: pydantic>=2.11.7
|
|
24
|
+
Requires-Dist: snowpylot>=1.1.3
|
|
21
25
|
Provides-Extra: interactive
|
|
22
26
|
Requires-Dist: jupyter; extra == "interactive"
|
|
23
|
-
Requires-Dist: ipython>=8.
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
27
|
+
Requires-Dist: ipython>=8.37.0; extra == "interactive"
|
|
28
|
+
Requires-Dist: ipykernel>=6.30.1; extra == "interactive"
|
|
29
|
+
Requires-Dist: jupyter_client>=8.6.3; extra == "interactive"
|
|
30
|
+
Requires-Dist: jupyter_core>=5.8.1; extra == "interactive"
|
|
31
|
+
Requires-Dist: matplotlib-inline>=0.1.7; extra == "interactive"
|
|
32
|
+
Requires-Dist: nest-asyncio>=1.6.0; extra == "interactive"
|
|
33
|
+
Requires-Dist: pyzmq>=27.0.1; extra == "interactive"
|
|
34
|
+
Requires-Dist: tornado>=6.5.2; extra == "interactive"
|
|
35
|
+
Requires-Dist: traitlets>=5.14.3; extra == "interactive"
|
|
26
36
|
Provides-Extra: docs
|
|
27
37
|
Requires-Dist: sphinx; extra == "docs"
|
|
28
38
|
Requires-Dist: sphinxawesome-theme; extra == "docs"
|
|
29
|
-
Provides-Extra: test
|
|
30
|
-
Requires-Dist: pytest>=7.0.0; extra == "test"
|
|
31
|
-
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
|
|
32
39
|
Provides-Extra: dev
|
|
33
|
-
Requires-Dist:
|
|
34
|
-
Requires-Dist:
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
40
|
+
Requires-Dist: nbclient>=0.10.0; extra == "dev"
|
|
41
|
+
Requires-Dist: nbconvert>=7.16.4; extra == "dev"
|
|
42
|
+
Requires-Dist: nbformat>=5.10.0; extra == "dev"
|
|
43
|
+
Requires-Dist: jupyter; extra == "dev"
|
|
44
|
+
Requires-Dist: ipython>=8.37.0; extra == "dev"
|
|
45
|
+
Requires-Dist: ipykernel>=6.30.1; extra == "dev"
|
|
46
|
+
Requires-Dist: jupyter_client>=8.6.3; extra == "dev"
|
|
47
|
+
Requires-Dist: jupyter_core>=5.8.1; extra == "dev"
|
|
48
|
+
Requires-Dist: matplotlib-inline>=0.1.7; extra == "dev"
|
|
49
|
+
Requires-Dist: nest-asyncio>=1.6.0; extra == "dev"
|
|
50
|
+
Requires-Dist: pyzmq>=27.0.1; extra == "dev"
|
|
51
|
+
Requires-Dist: tornado>=6.5.2; extra == "dev"
|
|
52
|
+
Requires-Dist: traitlets>=5.14.3; extra == "dev"
|
|
53
|
+
Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
54
|
+
Requires-Dist: pylint>=3.2.0; extra == "dev"
|
|
55
|
+
Requires-Dist: pycodestyle>=2.11.1; extra == "dev"
|
|
56
|
+
Requires-Dist: black>=24.4.0; extra == "dev"
|
|
57
|
+
Requires-Dist: isort>=5.13.0; extra == "dev"
|
|
58
|
+
Requires-Dist: bump2version>=1.0.1; extra == "dev"
|
|
37
59
|
Dynamic: license-file
|
|
38
60
|
|
|
39
61
|
<!-- LOGO AND TITLE-->
|
|
@@ -72,7 +94,7 @@ Dynamic: license-file
|
|
|
72
94
|
<a href="https://github.com/2phi/weac/issues">Report a bug</a> ·
|
|
73
95
|
<a href="https://github.com/2phi/weac/issues">Request a feature</a> ·
|
|
74
96
|
<a href="https://2phi.github.io/weac/">Read the docs</a> ·
|
|
75
|
-
<a href="https://github.com/2phi/weac/blob/main/CITATION.cff
|
|
97
|
+
<a href="https://github.com/2phi/weac/blob/main/CITATION.cff">Cite the software</a>
|
|
76
98
|
<br>
|
|
77
99
|
<br>
|
|
78
100
|
<br>
|
|
@@ -103,6 +125,7 @@ Dynamic: license-file
|
|
|
103
125
|
|
|
104
126
|
<!-- TABLE OF CONTENTS -->
|
|
105
127
|
## Contents
|
|
128
|
+
|
|
106
129
|
1. [About the project](#about-the-project)
|
|
107
130
|
2. [Installation](#installation)
|
|
108
131
|
3. [Usage](#usage)
|
|
@@ -112,8 +135,6 @@ Dynamic: license-file
|
|
|
112
135
|
7. [License](#license)
|
|
113
136
|
8. [Contact](#contact)
|
|
114
137
|
|
|
115
|
-
|
|
116
|
-
|
|
117
138
|
<!-- ABOUT THE PROJECT -->
|
|
118
139
|
## About the project
|
|
119
140
|
|
|
@@ -158,11 +179,15 @@ git clone https://github.com/2phi/weac
|
|
|
158
179
|
```
|
|
159
180
|
for local use.
|
|
160
181
|
|
|
161
|
-
Needs (
|
|
162
|
-
|
|
163
|
-
- [
|
|
164
|
-
- [
|
|
165
|
-
- [
|
|
182
|
+
Needs (runtime dependencies are declared in [pyproject.toml](https://github.com/2phi/weac/blob/main/pyproject.toml)):
|
|
183
|
+
|
|
184
|
+
- [Python](https://www.python.org/downloads/release/python-3120/) ≥ 3.12
|
|
185
|
+
- [Numpy](https://numpy.org/) ≥ 2.0.1
|
|
186
|
+
- [Scipy](https://www.scipy.org/) ≥ 1.14.0
|
|
187
|
+
- [Matplotlib](https://matplotlib.org/) ≥ 3.9.1
|
|
188
|
+
- [Pydantic](https://docs.pydantic.dev/latest/) ≥ 2.11.7
|
|
189
|
+
- [Snowpylot](https://github.com/connellymk/snowpylot) ≥ 1.1.3
|
|
190
|
+
|
|
166
191
|
|
|
167
192
|
<!-- USAGE EXAMPLES -->
|
|
168
193
|
## Usage
|
|
@@ -170,55 +195,141 @@ Needs (see also [requirements.txt](https://github.com/2phi/weac/blob/main/weac/r
|
|
|
170
195
|
The following describes the basic usage of WEAC. Please refer to the [demo](https://github.com/2phi/weac/blob/main/demo/demo.ipynb) for more examples and read the [documentation](https://2phi.github.io/weac/) for details.
|
|
171
196
|
|
|
172
197
|
Load the module.
|
|
198
|
+
|
|
173
199
|
```python
|
|
174
200
|
import weac
|
|
175
201
|
```
|
|
176
|
-
|
|
202
|
+
|
|
203
|
+
Choose a snow profile from the preconfigured profiles (see `dummy_profiles` in [demo](https://github.com/2phi/weac/blob/main/demo/demo.ipynb)) or create your own using the `Layer` Pydantic class. One row corresponds to one layer counted from top (below surface) to bottom (above weak layer).
|
|
204
|
+
|
|
177
205
|
```python
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
206
|
+
from weac.components import Layer
|
|
207
|
+
|
|
208
|
+
layers = [
|
|
209
|
+
Layer(rho=170, h=100), # (1) surface layer
|
|
210
|
+
Layer(rho=190, h=40), # (2)
|
|
211
|
+
Layer(rho=230, h=130), # :
|
|
212
|
+
Layer(rho=250, h=20),
|
|
213
|
+
Layer(rho=210, h=70),
|
|
214
|
+
Layer(rho=380, h=20), # :
|
|
215
|
+
Layer(rho=280, h=100) # (N) last slab layer above weak layer
|
|
216
|
+
]
|
|
185
217
|
```
|
|
186
|
-
|
|
218
|
+
|
|
219
|
+
Create a WeakLayer instance that lies underneath the slab.
|
|
220
|
+
|
|
187
221
|
```python
|
|
188
|
-
|
|
222
|
+
from weac.components import WeakLayer
|
|
223
|
+
|
|
224
|
+
weak_layer = WeakLayer(rho=125, h=20)
|
|
189
225
|
```
|
|
190
|
-
|
|
226
|
+
|
|
227
|
+
Create a Scenario that defines the environment and setup that the slab and weak layer will be evaluated in.
|
|
228
|
+
|
|
191
229
|
```python
|
|
192
|
-
|
|
230
|
+
from weac.components import ScenarioConfig, Segment
|
|
231
|
+
|
|
232
|
+
# Example 1: SKIER
|
|
233
|
+
skier_config = ScenarioConfig(
|
|
234
|
+
system_type='skier',
|
|
235
|
+
phi=30,
|
|
236
|
+
)
|
|
237
|
+
skier_segments = [
|
|
238
|
+
Segment(length=5000, has_foundation=True, m=0),
|
|
239
|
+
Segment(length=0, has_foundation=False, m=80),
|
|
240
|
+
Segment(length=0, has_foundation=False, m=0),
|
|
241
|
+
Segment(length=5000, has_foundation=True, m=0),
|
|
242
|
+
] # Scenario is a skier of 80 kg standing on a 10 meter long slab at a 30 degree angle
|
|
243
|
+
|
|
244
|
+
# Exampel 2: PST
|
|
245
|
+
pst_config = ScenarioConfig(
|
|
246
|
+
system_type='pst-', # Downslope cut
|
|
247
|
+
phi=30, # (counterclockwise positive)
|
|
248
|
+
cut_length=300,
|
|
249
|
+
)
|
|
250
|
+
pst_segments = [
|
|
251
|
+
Segment(length=5000, has_foundation=True, m=0),
|
|
252
|
+
Segment(length=300, has_foundation=False, m=0), # Crack Segment
|
|
253
|
+
] # Scenario is Downslope PST with a 300mm cut
|
|
193
254
|
```
|
|
194
|
-
|
|
255
|
+
|
|
256
|
+
Create a SystemModel instance that combines the inputs and handles system solving and field-quantity extraction.
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
from weac.components import Config, ModelInput
|
|
260
|
+
from weac.core.system_model import SystemModel
|
|
261
|
+
|
|
262
|
+
# Example: build a model for the skier scenario defined above
|
|
263
|
+
model_input = ModelInput(
|
|
264
|
+
weak_layer=weak_layer,
|
|
265
|
+
scenario_config=skier_config,
|
|
266
|
+
layers=custom_layers,
|
|
267
|
+
segments=skier_segments,
|
|
268
|
+
)
|
|
269
|
+
system_config = Config(
|
|
270
|
+
touchdown=True
|
|
271
|
+
)
|
|
272
|
+
skier_system = SystemModel(
|
|
273
|
+
model_input=model_input,
|
|
274
|
+
config=system_config,
|
|
275
|
+
)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Unknown constants are cached_properties; calling `skier_system.unknown_constants` solves the system of linear equations and extracts the constants.
|
|
279
|
+
|
|
195
280
|
```python
|
|
196
|
-
C =
|
|
281
|
+
C = skier_system.unknown_constants
|
|
197
282
|
```
|
|
283
|
+
|
|
284
|
+
Analyzer handles rasterization + computation of involved slab and weak-layer properties `Sxx`, `Sxz`, etc.
|
|
198
285
|
Prepare the output by rasterizing the solution vector at all horizontal positions `xsl` (slab). The result is returned in the form of the ndarray `z`. We also get `xwl` (weak layer) that only contains x-coordinates that are supported by a foundation.
|
|
286
|
+
|
|
199
287
|
```python
|
|
200
|
-
|
|
288
|
+
from weac.analysis.analyzer import Analyzer
|
|
289
|
+
|
|
290
|
+
skier_analyzer = Analyzer(skier_system)
|
|
291
|
+
xsl_skier, z_skier, xwl_skier = skier_analyzer.rasterize_solution(mode="cracked")
|
|
292
|
+
Gdif, GdifI, GdifII = skier_analyzer.differential_ERR()
|
|
293
|
+
Ginc, GincI, GincII = skier_analyzer.incremental_ERR()
|
|
294
|
+
# and Sxx, Sxz, Tzz, principal stress, incremental_potential, ...
|
|
201
295
|
```
|
|
296
|
+
|
|
202
297
|
Visualize the results.
|
|
298
|
+
|
|
203
299
|
```python
|
|
300
|
+
from weac.analysis.plotter import Plotter
|
|
301
|
+
|
|
302
|
+
plotter = Plotter()
|
|
303
|
+
# Visualize slab profile
|
|
304
|
+
fig = plotter.plot_slab_profile(
|
|
305
|
+
weak_layers=weak_layer,
|
|
306
|
+
slabs=skier_system.slab,
|
|
307
|
+
)
|
|
308
|
+
|
|
204
309
|
# Visualize deformations as a contour plot
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
310
|
+
fig = plotter.plot_deformed(
|
|
311
|
+
xsl_skier, xwl_skier, z_skier, skier_analyzer, scale=200, window=200, aspect=2, field="Sxx"
|
|
312
|
+
)
|
|
208
313
|
|
|
209
314
|
# Plot slab displacements (using x-coordinates of all segments, xsl)
|
|
210
|
-
|
|
211
|
-
|
|
315
|
+
plotter.plot_displacements(skier_analyzer, x=xsl_skier, z=z_skier)
|
|
212
316
|
# Plot weak-layer stresses (using only x-coordinates of bedded segments, xwl)
|
|
213
|
-
|
|
317
|
+
plotter.plot_stresses(skier_analyzer, x=xwl_skier, z=z_skier)
|
|
214
318
|
```
|
|
215
|
-
Compute output quantities for exporting or plotting.
|
|
216
|
-
```python
|
|
217
|
-
# Slab deflections (using x-coordinates of all segments, xsl)
|
|
218
|
-
x_cm, w_um = skier.get_slab_deflection(x=xsl, z=z, unit='um')
|
|
219
319
|
|
|
220
|
-
|
|
221
|
-
|
|
320
|
+
Compute output/field quantities for exporting or plotting.
|
|
321
|
+
|
|
322
|
+
```python
|
|
323
|
+
# Compute stresses in kPa in the weaklayer
|
|
324
|
+
tau = skier_system.fq.tau(Z=z_skier, unit='kPa')
|
|
325
|
+
sig = skier_system.fq.sig(Z=z_skier, unit='kPa')
|
|
326
|
+
|
|
327
|
+
w = skier_system.fq.w(Z=z_skier, unit='um')
|
|
328
|
+
# Example evaluation vertical displacement at top/mid/bottom of the slab
|
|
329
|
+
u_top = skier_system.fq.u(Z=z_skier, h0=top, unit='um')
|
|
330
|
+
u_mid = skier_system.fq.u(Z=z_skier, h0=mid, unit='um')
|
|
331
|
+
u_bot = skier_system.fq.u(Z=z_skier, h0=bot, unit='um')
|
|
332
|
+
psi = skier_system.fq.psi(Z=z_skier, unit='deg')
|
|
222
333
|
```
|
|
223
334
|
|
|
224
335
|
<!-- ROADMAP -->
|
|
@@ -226,33 +337,50 @@ x_cm, tau_kPa = skier.get_weaklayer_shearstress(x=xwl, z=z, unit='kPa')
|
|
|
226
337
|
|
|
227
338
|
See the [open issues](https://github.com/2phi/weac/issues) for a list of proposed features and known issues.
|
|
228
339
|
|
|
229
|
-
###
|
|
340
|
+
### v4.0
|
|
230
341
|
|
|
231
|
-
- [ ]
|
|
342
|
+
- [ ] Change to scenario & scenario_config: InfEnd/Cut/Segment/Weight
|
|
343
|
+
|
|
344
|
+
### v3.2
|
|
345
|
+
<!-- - [ ] New mathematical foundation to improve the weak-layer representation -->
|
|
232
346
|
- [ ] Complex terrain through the addition of out-of-plane tilt
|
|
233
347
|
- [ ] Up, down, and cross-slope cracks
|
|
234
348
|
|
|
235
|
-
###
|
|
236
|
-
- [ ] Finite fracture mechanics implementation for layered snow covers
|
|
349
|
+
### v3.1
|
|
237
350
|
|
|
238
|
-
|
|
239
|
-
- [ ] Implement anistropic weak layer
|
|
240
|
-
- [ ] Add demo gif
|
|
351
|
+
- [ ] Improved CriteriaEvaluator Optimization (x2 time reduction)
|
|
241
352
|
|
|
242
353
|
## Release history
|
|
243
354
|
|
|
355
|
+
### v3.0
|
|
356
|
+
|
|
357
|
+
- Refactored the codebase for improved structure and maintainability
|
|
358
|
+
- Added property caching for improved efficiency
|
|
359
|
+
- Added input validation
|
|
360
|
+
- Adopted a new, modular, and object-oriented design
|
|
361
|
+
|
|
362
|
+
### v2.6
|
|
363
|
+
|
|
364
|
+
- Introduced test suite
|
|
365
|
+
- Mitraged from `setup.cfg` to `pyproject.toml`
|
|
366
|
+
- Added parametrization for collaps heights
|
|
367
|
+
|
|
244
368
|
### v2.5
|
|
369
|
+
|
|
245
370
|
- Analyze slab touchdown in PST experiments by setting `touchdown=True`
|
|
246
371
|
- Completely redesigned and significantly improved API documentation
|
|
247
372
|
|
|
248
373
|
### v2.4
|
|
249
|
-
|
|
374
|
+
|
|
375
|
+
- Choose between slope-normal (`'-pst'`, `'pst-'`) or vertical (`'-vpst'`, `'vpst-'`) PST boundary conditions
|
|
250
376
|
|
|
251
377
|
### v2.3
|
|
378
|
+
|
|
252
379
|
- Stress plots on deformed contours
|
|
253
380
|
- PSTs now account for slab touchdown
|
|
254
381
|
|
|
255
382
|
### v2.2
|
|
383
|
+
|
|
256
384
|
- Sign of inclination `phi` consistent with the coordinate system (positive counterclockwise)
|
|
257
385
|
- Dimension arguments to field-quantity methods added
|
|
258
386
|
- Improved aspect ratio of profile views and contour plots
|
|
@@ -262,11 +390,13 @@ See the [open issues](https://github.com/2phi/weac/issues) for a list of propose
|
|
|
262
390
|
- Now allows for distributed surface loads
|
|
263
391
|
|
|
264
392
|
### v2.1
|
|
393
|
+
|
|
265
394
|
- Consistent use of coordinate system with downward pointing z-axis
|
|
266
395
|
- Consitent top-to-bottom numbering of slab layers
|
|
267
396
|
- Implementation of PSTs cut from either left or right side
|
|
268
397
|
|
|
269
398
|
### v2.0
|
|
399
|
+
|
|
270
400
|
- Completely rewritten in 🐍 Python
|
|
271
401
|
- Coupled bending-extension ODE solver implemented
|
|
272
402
|
- Stress analysis of arbitrarily layered snow slabs
|
|
@@ -286,24 +416,26 @@ See the [open issues](https://github.com/2phi/weac/issues) for a list of propose
|
|
|
286
416
|
- Finite fracture mechanics implementation
|
|
287
417
|
- Prediction of anticrack nucleation
|
|
288
418
|
|
|
289
|
-
|
|
290
419
|
<!-- CONTRIBUTING -->
|
|
291
420
|
## How to contribute
|
|
292
421
|
|
|
293
422
|
1. Fork the project
|
|
294
|
-
2.
|
|
295
|
-
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
|
|
296
|
-
4. Push to the branch (`git push origin feature/amazingfeature`)
|
|
297
|
-
5. Open a pull request
|
|
423
|
+
2. Initialize submodules
|
|
298
424
|
|
|
425
|
+
```bash
|
|
426
|
+
git submodule update --init --recursive
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
3. Create your feature branch (`git checkout -b feature/amazingfeature`)
|
|
430
|
+
4. Commit your changes (`git commit -m 'Add some amazing feature'`)
|
|
431
|
+
5. Push to the branch (`git push origin feature/amazingfeature`)
|
|
432
|
+
6. Open a pull request
|
|
299
433
|
|
|
300
434
|
<!-- WORKFLOWS -->
|
|
301
435
|
## Workflows
|
|
302
436
|
[](https://github.com/2phi/weac/actions/workflows/release.yml)<br>
|
|
303
437
|
[](https://github.com/2phi/weac/actions/workflows/docs.yml)
|
|
304
438
|
|
|
305
|
-
|
|
306
|
-
|
|
307
439
|
<!-- LICENSE -->
|
|
308
440
|
## License
|
|
309
441
|
|