fdsreader 1.10.2__tar.gz → 1.10.3__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.
Files changed (136) hide show
  1. fdsreader-1.10.3/.gitattributes +1 -0
  2. fdsreader-1.10.3/.github/workflows/joss.yml +36 -0
  3. fdsreader-1.10.3/.github/workflows/testsuite.yml +42 -0
  4. {fdsreader-1.10.2 → fdsreader-1.10.3}/PKG-INFO +2 -2
  5. {fdsreader-1.10.2 → fdsreader-1.10.3}/README.md +1 -1
  6. {fdsreader-1.10.2 → fdsreader-1.10.3}/RELEASE.md +3 -0
  7. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/bndf/bndf_example_anim.py +0 -2
  8. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/bndf/fds_data/wall_005.fds +4 -4
  9. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/devc/devc_example.py +1 -1
  10. fdsreader-1.10.3/examples/devc/fds_steckler/steckler.fds +43 -0
  11. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/geom/fds_data/sphere_radiate.fds +1 -1
  12. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/geom/geom_example.py +2 -0
  13. fdsreader-1.10.3/examples/isof/fds_steckler/input_steckler.fds +40 -0
  14. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/isof/isof_example.py +2 -0
  15. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/part/part_example.py +7 -10
  16. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/slcf/fds_steckler/input_steckler.fds +1 -1
  17. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/_version.py +1 -1
  18. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/evac/evac_collection.py +2 -1
  19. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/evac/evacuation.py +1 -0
  20. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/part/particle_collection.py +5 -7
  21. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader.egg-info/PKG-INFO +2 -2
  22. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader.egg-info/SOURCES.txt +21 -3
  23. fdsreader-1.10.3/paper.bib +18 -0
  24. fdsreader-1.10.3/paper.md +64 -0
  25. fdsreader-1.10.3/tests/acceptance_tests/test_bndf.py +9 -0
  26. fdsreader-1.10.3/tests/acceptance_tests/test_devc.py +6 -0
  27. fdsreader-1.10.3/tests/acceptance_tests/test_geom.py +9 -0
  28. fdsreader-1.10.3/tests/acceptance_tests/test_isof.py +10 -0
  29. fdsreader-1.10.3/tests/acceptance_tests/test_part.py +11 -0
  30. fdsreader-1.10.3/tests/acceptance_tests/test_pl3d.py +10 -0
  31. fdsreader-1.10.3/tests/acceptance_tests/test_slcf.py +8 -0
  32. fdsreader-1.10.3/tests/acceptance_tests/test_smoke3d.py +10 -0
  33. fdsreader-1.10.3/tests/cases/bndf_data.tgz +0 -0
  34. fdsreader-1.10.3/tests/cases/devc_data.tgz +0 -0
  35. fdsreader-1.10.3/tests/cases/geom_data.tgz +0 -0
  36. fdsreader-1.10.3/tests/cases/part_data.tgz +0 -0
  37. fdsreader-1.10.3/tests/cases/pl3d_data.tgz +0 -0
  38. fdsreader-1.10.3/tests/cases/steckler_data.tgz +0 -0
  39. fdsreader-1.10.2/examples/devc/fds_steckler/steckler.fds +0 -40
  40. fdsreader-1.10.2/examples/isof/fds_steckler/input_steckler.fds +0 -122
  41. fdsreader-1.10.2/examples/part/fds_data/impact.fds +0 -29
  42. {fdsreader-1.10.2 → fdsreader-1.10.3}/.gitignore +0 -0
  43. {fdsreader-1.10.2 → fdsreader-1.10.3}/.travis.yml +0 -0
  44. {fdsreader-1.10.2 → fdsreader-1.10.3}/Dockerfile +0 -0
  45. {fdsreader-1.10.2 → fdsreader-1.10.3}/LICENSE +0 -0
  46. {fdsreader-1.10.2 → fdsreader-1.10.3}/MANIFEST.in +0 -0
  47. {fdsreader-1.10.2 → fdsreader-1.10.3}/docker_deployment.sh +0 -0
  48. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/bndf.rst +0 -0
  49. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/conf.py +0 -0
  50. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/devc.rst +0 -0
  51. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/evac.rst +0 -0
  52. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/export.rst +0 -0
  53. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/fds_classes.rst +0 -0
  54. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/geom.rst +0 -0
  55. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/img/data-structure.drawio +0 -0
  56. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/img/data-structure.svg +0 -0
  57. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/index.rst +0 -0
  58. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/isof.rst +0 -0
  59. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/part.rst +0 -0
  60. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/pl3d.rst +0 -0
  61. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/quantity.rst +0 -0
  62. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/simulation.rst +0 -0
  63. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/slcf.rst +0 -0
  64. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/smoke3d.rst +0 -0
  65. {fdsreader-1.10.2 → fdsreader-1.10.3}/docs/utils.rst +0 -0
  66. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/evac/evac_example.py +0 -0
  67. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/evac/fds_fed/fed_verification_multi_mesh.fds +0 -0
  68. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/evac/fds_no_fed/stairs_evss_meshes.fds +0 -0
  69. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/export/export_all.py +0 -0
  70. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/export/obst_export.py +0 -0
  71. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/export/slcf_export.py +0 -0
  72. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/export/smoke3d_export.py +0 -0
  73. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/geom/fds_geomslices/PWB01_GEOM.fds +0 -0
  74. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/geom/geom_slices.py +0 -0
  75. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/pl3d/fds_data/vort3d_80.fds +0 -0
  76. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/pl3d/pl3d_example.py +0 -0
  77. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/slcf/fds_data/vort2d_80.fds +0 -0
  78. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/slcf/fds_multimesh/multimesh.fds +0 -0
  79. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/slcf/slcf_example_global.py +0 -0
  80. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/slcf/slcf_example_mask.py +0 -0
  81. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/smoke3d/fds_steckler/input_steckler.fds +0 -0
  82. {fdsreader-1.10.2 → fdsreader-1.10.3}/examples/smoke3d/smoke3d_example.py +0 -0
  83. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/__init__.py +0 -0
  84. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/bndf/__init__.py +0 -0
  85. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/bndf/obstruction.py +0 -0
  86. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/bndf/obstruction_collection.py +0 -0
  87. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/bndf/utils.py +0 -0
  88. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/devc/__init__.py +0 -0
  89. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/devc/device.py +0 -0
  90. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/devc/device_collection.py +0 -0
  91. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/evac/__init__.py +0 -0
  92. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/export/__init__.py +0 -0
  93. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/export/obst_exporter.py +0 -0
  94. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/export/sim_exporter.py +0 -0
  95. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/export/slcf_exporter.py +0 -0
  96. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/export/smoke3d_exporter.py +0 -0
  97. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/fds_classes/__init__.py +0 -0
  98. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/fds_classes/mesh.py +0 -0
  99. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/fds_classes/mesh_collection.py +0 -0
  100. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/fds_classes/surface.py +0 -0
  101. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/fds_classes/ventilation.py +0 -0
  102. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/geom/__init__.py +0 -0
  103. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/geom/geometry.py +0 -0
  104. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/geom/geometry_collection.py +0 -0
  105. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/isof/__init__.py +0 -0
  106. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/isof/isosurface.py +0 -0
  107. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/isof/isosurface_collection.py +0 -0
  108. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/part/__init__.py +0 -0
  109. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/part/particle.py +0 -0
  110. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/pl3d/__init__.py +0 -0
  111. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/pl3d/pl3d.py +0 -0
  112. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/pl3d/plot3D_collection.py +0 -0
  113. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/settings.py +0 -0
  114. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/simulation.py +1 -1
  115. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/slcf/__init__.py +0 -0
  116. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/slcf/geomslice.py +0 -0
  117. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/slcf/geomslice_collection.py +0 -0
  118. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/slcf/slice.py +0 -0
  119. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/slcf/slice_collection.py +0 -0
  120. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/smoke3d/__init__.py +0 -0
  121. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/smoke3d/smoke3D_collection.py +0 -0
  122. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/smoke3d/smoke3d.py +0 -0
  123. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/utils/__init__.py +0 -0
  124. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/utils/data.py +0 -0
  125. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/utils/dimension.py +0 -0
  126. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/utils/extent.py +0 -0
  127. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/utils/fortran_data.py +0 -0
  128. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader/utils/misc.py +0 -0
  129. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader.egg-info/dependency_links.txt +0 -0
  130. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader.egg-info/requires.txt +0 -0
  131. {fdsreader-1.10.2 → fdsreader-1.10.3}/fdsreader.egg-info/top_level.txt +0 -0
  132. {fdsreader-1.10.2 → fdsreader-1.10.3}/requirements.txt +0 -0
  133. {fdsreader-1.10.2 → fdsreader-1.10.3}/setup.cfg +0 -0
  134. {fdsreader-1.10.2 → fdsreader-1.10.3}/setup.py +0 -0
  135. {fdsreader-1.10.2 → fdsreader-1.10.3}/tests/test.smv +0 -0
  136. /fdsreader-1.10.2/tests/test.py → /fdsreader-1.10.3/tests/test_version_compatibility.py +0 -0
@@ -0,0 +1 @@
1
+ *.tgz filter=lfs diff=lfs merge=lfs -text
@@ -0,0 +1,36 @@
1
+ name: FDSreader JOSS submission paper
2
+
3
+ on:
4
+ workflow_dispatch: {}
5
+ push:
6
+ branches:
7
+ - master
8
+ paths:
9
+ - 'paper.md'
10
+ - 'paper.bib'
11
+ pull_request:
12
+ paths:
13
+ - 'paper.md'
14
+ - 'paper.bib'
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ paper:
21
+ runs-on: ubuntu-latest
22
+ name: Paper Draft
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@v4
26
+ - name: Build draft PDF
27
+ uses: openjournals/openjournals-draft-action@master
28
+ with:
29
+ journal: joss
30
+ # This should be the path to the paper within your repo.
31
+ paper-path: paper.md
32
+ - name: Upload
33
+ uses: actions/upload-artifact@v1
34
+ with:
35
+ name: paper
36
+ path: paper.pdf
@@ -0,0 +1,42 @@
1
+ # This workflow will install Python dependencies, run tests and lint with a single version of Python
2
+ # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
3
+
4
+ name: FDSreader testsuite
5
+
6
+ on:
7
+ workflow_dispatch: {}
8
+ push:
9
+ branches:
10
+ - master
11
+ paths:
12
+ - 'fdsreader/**'
13
+ pull_request:
14
+ paths:
15
+ - 'fdsreader/**'
16
+
17
+ permissions:
18
+ contents: read
19
+
20
+ jobs:
21
+ run-tests:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ with:
26
+ lfs: true
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: '3.10'
30
+ - name: Install dependencies
31
+ run: |
32
+ python -m pip install --upgrade pip
33
+ pip install pytest numpy
34
+ pip install ${{ github.workspace }}
35
+ - name: Prepare test cases
36
+ run: |
37
+ cd ${{ github.workspace }}/tests/cases/
38
+ for f in *.tgz; do tar -xzvf "$f"; done
39
+ - name: Test with pytest
40
+ run: |
41
+ cd ${{ github.workspace }}/tests/cases
42
+ pytest ../acceptance_tests/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdsreader
3
- Version: 1.10.2
3
+ Version: 1.10.3
4
4
  Summary: Python reader for data generated by FDS.
5
5
  Home-page: https://github.com/FireDynamics/fdsreader
6
6
  Author: FZJ IAS-7 (Jan Vogelsang, Prof. Dr. Lukas Arnold, Tristan Hehnen)
@@ -89,7 +89,7 @@ It is also possible to deploy to PyPI and Github pages manually using the follow
89
89
  3. sphinx-build -b html docs docs/build
90
90
  4. cd .. && mkdir gh-pages && cd gh-pages
91
91
  5. git init && git remote add origin git@github.com:FireDynamics/fdsreader.git
92
- 6. git fetch --all
92
+ 6. git fetch origin gh-pages:gh-pages
93
93
  7. git checkout gh-pages
94
94
  8. cp -r ../fdsreader/docs/build/* .
95
95
  9. git add . && git commit -m "..." && git push origin HEAD:gh-pages
@@ -72,7 +72,7 @@ It is also possible to deploy to PyPI and Github pages manually using the follow
72
72
  3. sphinx-build -b html docs docs/build
73
73
  4. cd .. && mkdir gh-pages && cd gh-pages
74
74
  5. git init && git remote add origin git@github.com:FireDynamics/fdsreader.git
75
- 6. git fetch --all
75
+ 6. git fetch origin gh-pages:gh-pages
76
76
  7. git checkout gh-pages
77
77
  8. cp -r ../fdsreader/docs/build/* .
78
78
  9. git add . && git commit -m "..." && git push origin HEAD:gh-pages
@@ -1,4 +1,7 @@
1
1
  ## Release History
2
+ * 1.10.3
3
+ * Fixed particle documentation
4
+ * Fixed bug for particles when using more than one quantity
2
5
  * 1.10.2
3
6
  * Fixed to_global function for Plot3D data with obstruction masks
4
7
  * Fixed to_global function for Smoke3D data with obstruction masks
@@ -2,9 +2,7 @@ import matplotlib.pyplot as plt
2
2
  import matplotlib.animation as animation
3
3
  import numpy as np
4
4
 
5
- import fdsreader.settings
6
5
  from fdsreader import Simulation
7
- from fdsreader.bndf.utils import sort_patches_cartesian
8
6
 
9
7
 
10
8
  def main():
@@ -1,6 +1,6 @@
1
- &HEAD CHID='wall_test'
2
- /
3
- &TIME T_END=20.0
1
+ &HEAD CHID='wall_test' /
2
+
3
+ &TIME T_END=20.0, TIME_SHRINK_FACTOR=10./
4
4
 
5
5
  &MULT ID='mesh', DX=1, DY=0.8, I_UPPER=3, J_UPPER=5,/
6
6
 
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
  &VENT XB=-0.3,1.1,0.4,1.7,0.45,0.45 SURF_ID='Brandfläche'/
89
- &REAC ID='Brandfläche', FUEL='PUR', SPEC_ID_NU = 'PUR','AIR','PRODUCTS', NU= -1,-4.043567,1./
89
+ &REAC ID='Brandfläche', FUEL='PUR', SPEC_ID_NU = 'PUR','AIR','PRODUCTS', NU= -1,-4.043567,1., HEAT_OF_COMBUSTION=40000 /
90
90
  &SURF ID='Brandfläche',SPEC_ID='PUR', HRRPUA=2823.129, COLOR='RED', RAMP_Q='fire_ramp'/
91
91
 
92
92
  /Vorgabe der Brandkurve
@@ -4,7 +4,7 @@ import fdsreader as fds
4
4
  def main():
5
5
  sim = fds.Simulation("./fds_steckler")
6
6
 
7
- print(sim.devices["TC_Door_Single"].data)
7
+ print(sim.devices["TC_Door"][0].data)
8
8
 
9
9
  try:
10
10
  df = sim.devices.to_pandas_dataframe()
@@ -0,0 +1,43 @@
1
+ &HEAD CHID='Steckler', TITLE='Steckler Compartment'/
2
+
3
+ &MESH IJK=36,28,22, XB=0.00,3.60,-1.40,1.40,0.00,2.13 /
4
+
5
+ &TIME T_END=100.0, TIME_SHRINK_FACTOR=10. /
6
+ &DUMP NFRAMES=100, DT_DEVC=10., DT_HRR=10., SIG_FIGS=4, SIG_FIGS_EXP=2 /
7
+
8
+ &MISC TMPA=22. /
9
+
10
+ &SURF ID='BURNER',HRRPUA=1048.3,TMP_FRONT=100.,COLOR='ORANGE' / 62.9 kW
11
+
12
+ &HOLE XB=2.75,2.95,-0.10,0.15,0.00,1.83 / 2/6 Door
13
+
14
+ &VENT XB=1.30,1.50,-0.10,0.10,0.00,0.00, SURF_ID='BURNER' / Position A
15
+ &VENT XB=1.25,1.30,-0.05,0.05,0.00,0.00, SURF_ID='BURNER' /
16
+ &VENT XB=1.50,1.55,-0.05,0.05,0.00,0.00, SURF_ID='BURNER' /
17
+ &VENT XB=1.35,1.45,-0.15,-.10,0.00,0.00, SURF_ID='BURNER' /
18
+ &VENT XB=1.35,1.45, 0.10,0.15,0.00,0.00, SURF_ID='BURNER' /
19
+
20
+ &SURF ID='FIBER BOARD', DEFAULT=.TRUE., MATL_ID='INSULATION', THICKNESS=0.013, COLOR='BEIGE' /
21
+
22
+ &REAC FUEL='METHANE',SOOT_YIELD=0. /
23
+
24
+ &OBST XB=2.80,2.90,-1.40,1.40,0.00,2.13 / Wall with door or window
25
+
26
+ &VENT MB='XMAX',SURF_ID='OPEN'/
27
+ &VENT XB= 2.90,3.60,-1.40,-1.40,0.00,2.13, SURF_ID='OPEN'/
28
+ &VENT XB= 2.90,3.60, 1.40, 1.40,0.00,2.13, SURF_ID='OPEN'/
29
+ &VENT XB= 2.90,3.60,-1.40, 1.40,2.13,2.13, SURF_ID='OPEN'/
30
+
31
+ &MATL ID = 'INSULATION'
32
+ DENSITY = 200.
33
+ CONDUCTIVITY = 0.1
34
+ SPECIFIC_HEAT = 1. /
35
+
36
+ &DEVC ID='TC_Room', POINTS=44, XB=2.50,2.50,1.10,1.10,0.02,2.11, QUANTITY='TEMPERATURE', Z_ID='Room_z' /
37
+ &DEVC ID='TC_Door', POINTS=38, XB=2.85,2.85,0.00,0.00,0.02,1.82, QUANTITY='TEMPERATURE', Z_ID='Door_z' /
38
+ &DEVC ID='BP_Door', POINTS=38, XB=2.85,2.85,0.00,0.00,0.02,1.82, QUANTITY='VELOCITY', VELO_INDEX=1, HIDE_COORDINATES=.TRUE. /
39
+
40
+ &DEVC ID='HGL Temp', XB=2.50,2.50,1.10,1.10,0.00,2.13, QUANTITY='UPPER TEMPERATURE' /
41
+ &DEVC ID='HGL Height', XB=2.50,2.50,1.10,1.10,0.00,2.13, QUANTITY='LAYER HEIGHT' /
42
+
43
+ &TAIL /
@@ -2,7 +2,7 @@
2
2
 
3
3
  &MESH IJK=64,64,64, XB=-2.0,2.0,-2.0,2.0,0.0,4.0 /
4
4
 
5
- &TIME T_END=10 /
5
+ &TIME T_END=10, TIME_SHRINK_FACTOR=50. /
6
6
  &PRES SOLVER='UGLMAT' /
7
7
 
8
8
  &SPEC ID='NITROGEN', BACKGROUND=.TRUE. /
@@ -9,6 +9,8 @@ def main():
9
9
  sim = Simulation("./fds_data")
10
10
 
11
11
  geom = sim.geom_data.filter_by_quantity("Radiative Heat Flux")[0]
12
+ print(len(geom.data[-1]))
13
+ exit()
12
14
 
13
15
  faces = np.hstack(np.append(np.full((geom.faces.shape[0], 1), 3), geom.faces, axis=1))
14
16
  pv.PolyData(geom.vertices, faces).plot(scalars=geom.data[0])
@@ -0,0 +1,40 @@
1
+ &HEAD CHID='Steckler_010', TITLE='Steckler Compartment, Test 10'/
2
+
3
+ &MESH IJK=36,28,22, XB=0.00,3.60,-1.40,1.40,0.00,2.13 /
4
+
5
+ &TIME T_END=100.0, TIME_SHRINK_FACTOR=10. /
6
+ &DUMP NFRAMES=100, DT_DEVC=10., DT_HRR=10., SIG_FIGS=4, SIG_FIGS_EXP=2 /
7
+
8
+ &MISC TMPA=22. /
9
+
10
+ &SURF ID='BURNER',HRRPUA=1048.3,TMP_FRONT=100.,COLOR='ORANGE' / 62.9 kW
11
+
12
+ &HOLE XB=2.75,2.95,-0.10,0.15,0.00,1.83 / 2/6 Door
13
+
14
+ &VENT XB=1.30,1.50,-0.10,0.10,0.00,0.00, SURF_ID='BURNER' / Position A
15
+ &VENT XB=1.25,1.30,-0.05,0.05,0.00,0.00, SURF_ID='BURNER' /
16
+ &VENT XB=1.50,1.55,-0.05,0.05,0.00,0.00, SURF_ID='BURNER' /
17
+ &VENT XB=1.35,1.45,-0.15,-.10,0.00,0.00, SURF_ID='BURNER' /
18
+ &VENT XB=1.35,1.45, 0.10,0.15,0.00,0.00, SURF_ID='BURNER' /
19
+
20
+ &SURF ID='FIBER BOARD', DEFAULT=.TRUE., MATL_ID='INSULATION', THICKNESS=0.013, COLOR='BEIGE' /
21
+
22
+ &REAC FUEL='METHANE',SOOT_YIELD=0. /
23
+
24
+ &OBST XB=2.80,2.90,-1.40,1.40,0.00,2.13 / Wall with door or window
25
+
26
+ &VENT MB='XMAX',SURF_ID='OPEN'/
27
+ &VENT XB= 2.90,3.60,-1.40,-1.40,0.00,2.13, SURF_ID='OPEN'/
28
+ &VENT XB= 2.90,3.60, 1.40, 1.40,0.00,2.13, SURF_ID='OPEN'/
29
+ &VENT XB= 2.90,3.60,-1.40, 1.40,2.13,2.13, SURF_ID='OPEN'/
30
+
31
+ &MATL ID = 'INSULATION'
32
+ DENSITY = 200.
33
+ CONDUCTIVITY = 0.1
34
+ SPECIFIC_HEAT = 1. /
35
+
36
+
37
+ &ISOF QUANTITY='TEMPERATURE', VALUE(1)=10., VALUE(2)=30., VALUE(3)=60. /
38
+ &ISOF QUANTITY='U-VELOCITY' , VALUE(1)=0.08, QUANTITY2='TEMPERATURE' /
39
+
40
+ &TAIL /
@@ -9,6 +9,8 @@ def main():
9
9
 
10
10
  vertices, triangles, _ = isosurface.to_global(len(isosurface.times) - 1)
11
11
 
12
+ print(triangles[-1][-1])
13
+ exit()
12
14
  # We ignore level 1 as it does not contain any vertices
13
15
  # level1 = isosurface.get_pyvista_mesh(vertices, triangles[0])
14
16
  level2 = isosurface.get_pyvista_mesh(vertices, triangles[1])
@@ -6,35 +6,32 @@ def main():
6
6
  sim = fds.Simulation("./fds_data")
7
7
 
8
8
  # Get all particles with specified id
9
- particles = sim.particles["water droplets"]
9
+ particles = sim.particles["WATER PARTICLES"]
10
10
 
11
11
  # Get all data for the specified quantity
12
- # quantity = "PARTICLE TEMPERATURE"
12
+ # quantity = "PARTICLE VELOCITY"
13
13
  quantity = "PARTICLE DIAMETER"
14
14
  color_data = particles.data[quantity]
15
-
16
15
  t_0 = next(i for i, pos in enumerate(particles.positions) if pos.shape[0] != 0)
17
16
 
18
17
  # Create PyVista animation
19
- plotter = pv.Plotter()
18
+ plotter = pv.Plotter(notebook=False, off_screen=True)
20
19
  plotter.open_movie("anim.mp4")
21
20
 
22
21
  actor = plotter.add_mesh(pv.PolyData(particles.positions[t_0]), scalars=color_data[t_0],
23
22
  render_points_as_spheres=True, point_size=15)
24
23
  plotter.add_scalar_bar(title=quantity)
25
- plotter.show(auto_close=False)
26
- plotter.write_frame()
24
+
25
+ # Open a gif
26
+ plotter.open_gif("particles.gif")
27
27
 
28
28
  for t in range(t_0 + 1, len(color_data)):
29
- if particles.positions[t].shape[0] == 0:
30
- continue
31
29
  plotter.remove_actor(actor)
32
30
  actor = plotter.add_mesh(pv.PolyData(particles.positions[t]), scalars=color_data[t],
33
31
  render_points_as_spheres=True, point_size=15)
34
- plotter.remove_scalar_bar()
35
- plotter.add_scalar_bar(title=quantity)
36
32
  plotter.write_frame()
37
33
 
34
+ # Closes and finalizes movie
38
35
  plotter.close()
39
36
 
40
37
 
@@ -3,7 +3,7 @@
3
3
  &MESH IJK=36,28,22, XB=0.00,3.60,-1.40,1.40,0.00,2.13 /
4
4
 
5
5
  &TIME T_END=100.0, TIME_SHRINK_FACTOR=10. /
6
- &DUMP NFRAMES=100, DT_DEVC=10., DT_DEVC_LINE=10., DT_HRR=10., SIG_FIGS=4, SIG_FIGS_EXP=2 /
6
+ &DUMP NFRAMES=100, DT_DEVC=10., DT_HRR=10., SIG_FIGS=4, SIG_FIGS_EXP=2 /
7
7
 
8
8
  &MISC TMPA=22. /
9
9
 
@@ -7,5 +7,5 @@ Provides fdsreader version information.
7
7
 
8
8
  from incremental import Version
9
9
 
10
- __version__ = Version("fdsreader", 1, 10, 2)
10
+ __version__ = Version("fdsreader", 1, 10, 3)
11
11
  __all__ = ["__version__"]
@@ -12,7 +12,8 @@ from fdsreader import settings
12
12
 
13
13
  class EvacCollection(FDSDataCollection):
14
14
  """Collection of :class:`Evacuation` objects. Next to agent-class specific data (such as
15
- trajectories) lots of other data such as FED-data is provided via this class.
15
+ trajectories) lots of other data such as FED-data is provided via this class.
16
+ Note: Evac support was removed from FDS in all versions after 6.7.7!
16
17
 
17
18
  :ivar times: List of all time steps of the simulation.
18
19
  :ivar z_offsets: The offset in z-direction for each mesh where the evac plane lays.
@@ -39,6 +39,7 @@ from fdsreader.utils import Quantity
39
39
 
40
40
  class Evacuation:
41
41
  """Container to store evac data from evac simulations with FDS.
42
+ Note: Evac support was removed from FDS in all versions after 6.7.7!
42
43
 
43
44
  :ivar class_name: Name of the evac class defined in the FDS input-file.
44
45
  :ivar quantities: List of all quantities for which data has been written out.
@@ -9,8 +9,7 @@ from fdsreader import settings
9
9
 
10
10
 
11
11
  class ParticleCollection(FDSDataCollection):
12
- """Collection of :class:`Plot3D` objects. Offers extensive functionality for filtering and
13
- using plot3Ds as well as its subclasses such as :class:`SubPlot3D`.
12
+ """Collection of :class:`Particle` objects.
14
13
  """
15
14
 
16
15
  def __init__(self, times: Iterable[float], particles: Iterable[Particle]):
@@ -83,19 +82,18 @@ class ParticleCollection(FDSDataCollection):
83
82
 
84
83
  # Read tags
85
84
  dtype_tags = fdtype.new((('i', n_particles),))
86
- particle._tags[t][offset: offset + n_particles] = \
87
- fdtype.read(infile, dtype_tags, 1)[0][0]
85
+ particle._tags[t][offset: offset + n_particles] = fdtype.read(infile, dtype_tags, 1)[0][0]
88
86
 
89
87
  # Read actual quantity values
90
88
  if len(particle.quantities) > 0:
91
89
  dtype_data = fdtype.new(
92
- (('f', str((n_particles, len(particle.quantities)))),))
90
+ (('f', str((len(particle.quantities), n_particles))),))
93
91
  data_raw = fdtype.read(infile, dtype_data, 1)[0][0].reshape(
94
- (n_particles, len(particle.quantities)), order='F')
92
+ (len(particle.quantities), n_particles), order='F')
95
93
 
96
94
  for q, quantity in enumerate(particle.quantities):
97
95
  particle._data[quantity.name][t][
98
- offset:offset + n_particles] = data_raw[:, q].astype(float)
96
+ offset:offset + n_particles] = data_raw[q, :].astype(float)
99
97
 
100
98
  pointer_location[particle][t] += particle.n_particles[mesh][t]
101
99
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdsreader
3
- Version: 1.10.2
3
+ Version: 1.10.3
4
4
  Summary: Python reader for data generated by FDS.
5
5
  Home-page: https://github.com/FireDynamics/fdsreader
6
6
  Author: FZJ IAS-7 (Jan Vogelsang, Prof. Dr. Lukas Arnold, Tristan Hehnen)
@@ -89,7 +89,7 @@ It is also possible to deploy to PyPI and Github pages manually using the follow
89
89
  3. sphinx-build -b html docs docs/build
90
90
  4. cd .. && mkdir gh-pages && cd gh-pages
91
91
  5. git init && git remote add origin git@github.com:FireDynamics/fdsreader.git
92
- 6. git fetch --all
92
+ 6. git fetch origin gh-pages:gh-pages
93
93
  7. git checkout gh-pages
94
94
  8. cp -r ../fdsreader/docs/build/* .
95
95
  9. git add . && git commit -m "..." && git push origin HEAD:gh-pages
@@ -1,3 +1,4 @@
1
+ .gitattributes
1
2
  .gitignore
2
3
  .travis.yml
3
4
  Dockerfile
@@ -6,8 +7,12 @@ MANIFEST.in
6
7
  README.md
7
8
  RELEASE.md
8
9
  docker_deployment.sh
10
+ paper.bib
11
+ paper.md
9
12
  requirements.txt
10
13
  setup.py
14
+ .github/workflows/joss.yml
15
+ .github/workflows/testsuite.yml
11
16
  docs/bndf.rst
12
17
  docs/conf.py
13
18
  docs/devc.rst
@@ -44,7 +49,6 @@ examples/geom/fds_geomslices/PWB01_GEOM.fds
44
49
  examples/isof/isof_example.py
45
50
  examples/isof/fds_steckler/input_steckler.fds
46
51
  examples/part/part_example.py
47
- examples/part/fds_data/impact.fds
48
52
  examples/pl3d/pl3d_example.py
49
53
  examples/pl3d/fds_data/vort3d_80.fds
50
54
  examples/slcf/slcf_example_global.py
@@ -109,5 +113,19 @@ fdsreader/utils/dimension.py
109
113
  fdsreader/utils/extent.py
110
114
  fdsreader/utils/fortran_data.py
111
115
  fdsreader/utils/misc.py
112
- tests/test.py
113
- tests/test.smv
116
+ tests/test.smv
117
+ tests/test_version_compatibility.py
118
+ tests/acceptance_tests/test_bndf.py
119
+ tests/acceptance_tests/test_devc.py
120
+ tests/acceptance_tests/test_geom.py
121
+ tests/acceptance_tests/test_isof.py
122
+ tests/acceptance_tests/test_part.py
123
+ tests/acceptance_tests/test_pl3d.py
124
+ tests/acceptance_tests/test_slcf.py
125
+ tests/acceptance_tests/test_smoke3d.py
126
+ tests/cases/bndf_data.tgz
127
+ tests/cases/devc_data.tgz
128
+ tests/cases/geom_data.tgz
129
+ tests/cases/part_data.tgz
130
+ tests/cases/pl3d_data.tgz
131
+ tests/cases/steckler_data.tgz
@@ -0,0 +1,18 @@
1
+ @misc{FDS,
2
+ author = {Kevin McGrattan and Randall McDermott and Craig Weinschenk and Glenn Forney},
3
+ title = {Fire Dynamics Simulator Users Guide, Sixth Edition},
4
+ year = {2013},
5
+ month = {2013-11-04},
6
+ publisher = {Special Publication (NIST SP), National Institute of Standards and Technology, Gaithersburg, MD},
7
+ doi = {https://doi.org/10.6028/NIST.sp.1019},
8
+ language = {en},
9
+ }
10
+
11
+ @misc{SMV,
12
+ author = {Glenn Forney},
13
+ title = {Smokeview (Version 5) - A Tool for Visualizing Fire Dynamics Simulation Data, Volume I: User's Guide},
14
+ year = {2017},
15
+ month = {2017-02-19 20:02:57},
16
+ publisher = {Special Publication (NIST SP), National Institute of Standards and Technology, Gaithersburg, MD},
17
+ language = {en},
18
+ }
@@ -0,0 +1,64 @@
1
+ ---
2
+ title: 'FDSReader'
3
+ tags:
4
+ - Python
5
+ - TODO
6
+ authors:
7
+ - name: Jan Niklas Vogelsang
8
+ orcid: 0000-0003-2336-6630
9
+ affiliation: 1
10
+ - name: Prof. Dr. Lukas Arnold
11
+ orcid: TODO
12
+ affiliation: 2
13
+ affiliations:
14
+ - name: PGI-15, Forschungszentrum Jülich, Germany
15
+ index: 1
16
+ - name: IAS-7, Forschungszentrum Jülich, Germany
17
+ index: 2
18
+ date: 15 March 2024
19
+ bibliography: paper.bib
20
+ ---
21
+
22
+ # Summary
23
+
24
+ In recent years, Python has become the most popular programming language in the scientific community. It offers
25
+ extensive functionality for preparing, post-processing and visualising data of all types and origins. By
26
+ a large number of freely available packages, the programming environment can be flexibly adapted to your own
27
+ needs. However, until now it was not possible to automatically import and process fire simulation data as
28
+ produced by the fire dynamics simulator (FDS) [@FDS] for example. Using SmokeView [@SMV], it was
29
+ already possible to visualize generated data, but it was not possible to process it directly or perform detailed
30
+ analysis on the data itself. The introduction of the fdsreader made this possible in an uncomplicated and efficient way.
31
+
32
+ # Statement of need
33
+
34
+ Up until now, most working groups in both industry and research have had no solution for efficiently and
35
+ automatically reading the binary data output by FDS to process it further. One would either have to use Fds2Ascii, a
36
+ Fortran program to manually convert the binary output of FDS into a text file and read in the text file with their
37
+ preferred language or write their own scripts to read the binary data output of FDS and further process the data. Many
38
+ groups did end up with their own set of, typically Python-based, scripts to read the various types of data an FDS
39
+ simulation can produce, e.g. slices, boundary data, etc.
40
+ As the internal data structures of FDS are non-trivial and the source code is not trivial to understand for an outsider,
41
+ the scripts usually require lots of time to write, ended up having strict limitations to the simulation parameters,
42
+ e.g. only single mesh based simulations, and could not process all types of data. In addition, new versions of FDS
43
+ often meant that some scripts no longer worked as expected, requiring even more time investment to maintain these scripts.
44
+ The fdsreader Python package provides functionality to automatically import the full set of FDS outputs for both old and
45
+ new versions of FDS.
46
+ When first loading a simulation, all metadata is collected and cached to reduce subsequent load times. The actual
47
+ data produced during the simulation such as the slice data for each time step, is not loaded until the data is accessed by the
48
+ user via Python, which then triggers loading the data into memory in the background and converting it to equivalent
49
+ Python datastructures. This method minimizes initial loading time without sacrificing the ability to easily filter and
50
+ select the desired data. The fdsreader collects all data of the same type into one collection and offers its own set
51
+ functions for each type to easily select the data which should be further processed. These functions can even be called
52
+ in an automated fashion, to run some predefined postprocessing routines on simulation data without having to manually
53
+ interact with the data, as one would have to do when using SmokeView or Fds2Ascii.
54
+ The fdsreader is able to read all data types available in FDS including most of the additional metadata. To be concrete,
55
+ the package contains modules for slices (slcf), boundary data (bndf), volumes (plot3d, smoke3d) particles (part),
56
+ isosurfaces (isof), evacuations (evac), complex geometry boundary data (geom), devices (devc) and meshes. Slices,
57
+ boundary data, isosurfaces and volumes are each respectively seperated into multiple parts, one for each mesh. While FDS
58
+ outputs the data separately for each mesh, the fdsreader provides methods to combine all these parts automatically and
59
+ operate on data across meshes.
60
+
61
+ # Acknowledgements
62
+ TODO
63
+
64
+ # References
@@ -0,0 +1,9 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_bndf():
5
+ sim = Simulation("./bndf_data")
6
+ obst = sim.obstructions.get_nearest(-0.8, 1, 1)
7
+ face = obst.get_global_boundary_data_arrays("Wall Temperature")[1]
8
+
9
+ assert len(face[-1]) == 68
@@ -0,0 +1,6 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_devc():
5
+ sim = Simulation("./steckler_data")
6
+ assert abs(sim.devices["TC_Door"][0].data - 23.58) < 1e-6
@@ -0,0 +1,9 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_geom():
5
+ sim = Simulation("./geom_data")
6
+ geom = sim.geom_data.filter_by_quantity("Radiative Heat Flux")[0]
7
+
8
+ assert len(geom.faces) == len(geom.data[-1]) == 19816
9
+ assert len(geom.vertices) == 40624
@@ -0,0 +1,10 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_isof():
5
+ sim = Simulation("./steckler_data")
6
+ isosurface = sim.isosurfaces.filter_by_quantity("TEMP")[0]
7
+ vertices, triangles, _ = isosurface.to_global(len(isosurface.times) - 1)
8
+
9
+ assert abs(vertices[-1][0] - 2.80595016) < 1e-6 and abs(vertices[-1][1] - 0.1) < 1e-6 and abs(vertices[-1][2] - 1.83954549) < 1e-6
10
+ assert abs(triangles[-1][-1][0] - 4625) < 1e-6 and abs(triangles[-1][-1][1] - 4627) < 1e-6 and abs(triangles[-1][-1][2] - 4708) < 1e-6
@@ -0,0 +1,11 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_part():
5
+ sim = Simulation("./part_data")
6
+ particles = sim.particles["WATER PARTICLES"]
7
+ position = particles.positions[-1][-1]
8
+ color_data = particles.data["PARTICLE DIAMETER"]
9
+
10
+ assert abs(position[0] + 0.04036335) < 1e-6 and abs(position[1] - 0.05389348) < 1e-6 and abs(position[2] - 13.596354) < 1e-6
11
+ assert abs(color_data[-1][-1] - 321.1149902) < 1e-6
@@ -0,0 +1,10 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_pl3d():
5
+ sim = Simulation("./pl3d_data")
6
+ pl_t1 = sim.data_3d.get_by_quantity("Temperature")
7
+ data, coordinates = pl_t1.to_global(masked=True, return_coordinates=True)
8
+
9
+ assert abs(data[-1, 41, 27, 0] - 55.85966110229492) < 1e-6
10
+ assert abs(coordinates['x'][41] - 9.25) < 1e-6
@@ -0,0 +1,8 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_slcf():
5
+ sim = Simulation("./steckler_data")
6
+ data, coordinates = sim.slices[0].to_global(masked=True, return_coordinates=True)
7
+ assert abs(data[-1, -1, -1] - 33.311744689941406) < 1e-6
8
+ assert abs(coordinates['x'][0] - 0.) < 1e-6 and abs(coordinates['x'][-1] - 3.6) < 1e-6
@@ -0,0 +1,10 @@
1
+ from fdsreader import Simulation
2
+
3
+
4
+ def test_smoke3d():
5
+ sim = Simulation("./steckler_data")
6
+ smoke = sim.smoke_3d.get_by_quantity("Temperature")
7
+ data, coordinates = smoke.to_global(masked=True, return_coordinates=True)
8
+
9
+ assert abs(data[-1, 13, 13, 1] - 77.) < 1e-6
10
+ assert abs(coordinates['x'][13] - 1.3) < 1e-6