ourocode 2.1.4__tar.gz → 2.1.6__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 (129) hide show
  1. {ourocode-2.1.4/ourocode.egg-info → ourocode-2.1.6}/PKG-INFO +1 -1
  2. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/model_result.py +5 -4
  3. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec1/neige.py +41 -1
  4. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/cvt.py +20 -6
  5. {ourocode-2.1.4 → ourocode-2.1.6/ourocode.egg-info}/PKG-INFO +1 -1
  6. {ourocode-2.1.4 → ourocode-2.1.6}/pyproject.toml +1 -1
  7. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC1_Neige.py +28 -0
  8. {ourocode-2.1.4 → ourocode-2.1.6}/LICENSE +0 -0
  9. {ourocode-2.1.4 → ourocode-2.1.6}/MANIFEST.in +0 -0
  10. {ourocode-2.1.4 → ourocode-2.1.6}/README.md +0 -0
  11. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/__init__.py +0 -0
  12. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/__version__.py +0 -0
  13. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/caracteristique_meca_acier.csv +0 -0
  14. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/caracteristique_meca_beton.csv +0 -0
  15. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/caracteristique_meca_bois.csv +0 -0
  16. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/caracteristique_meca_panel.csv +0 -0
  17. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/carte_action_region.csv +0 -0
  18. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/coeff_psy.csv +0 -0
  19. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/exploitation.csv +0 -0
  20. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/gammaM.csv +0 -0
  21. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/kdef.csv +0 -0
  22. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/kfi.csv +0 -0
  23. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/kmod.csv +0 -0
  24. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/limite_fleche.csv +0 -0
  25. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/profil_acier.csv +0 -0
  26. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/qualite_acier.csv +0 -0
  27. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/screenshot/C90_def.png +0 -0
  28. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/screenshot/CNC2M_4.3.3_tab15.png +0 -0
  29. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/screenshot/CNC2M_4.3.3_tab16.png +0 -0
  30. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/screenshot/EN1993-1-8_fig6_11.png +0 -0
  31. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/screenshot/Kv_def.png +0 -0
  32. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/screenshot/sign_convention.png +0 -0
  33. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/section_boulon.csv +0 -0
  34. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/sismique/categorie_importance.csv +0 -0
  35. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/sismique/categorie_importance_ns.csv +0 -0
  36. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/sismique/classe_sol.csv +0 -0
  37. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/sismique/spectre_eleastique_h_type1.csv +0 -0
  38. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/sismique/spectre_eleastique_h_type2.csv +0 -0
  39. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +0 -0
  40. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
  41. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +0 -0
  42. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
  43. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_mur_verticaux.csv +0 -0
  44. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
  45. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
  46. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +0 -0
  47. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +0 -0
  48. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +0 -0
  49. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
  50. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +0 -0
  51. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +0 -0
  52. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +0 -0
  53. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
  54. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/data/vent/vent_Ffr.png +0 -0
  55. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/__init__.py +0 -0
  56. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/__init__.py +0 -0
  57. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/_renderer.py +0 -0
  58. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/batiment.py +0 -0
  59. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/combinaison.py +0 -0
  60. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/model_generator.py +0 -0
  61. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/objet.py +0 -0
  62. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/core/projet.py +0 -0
  63. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec1/__init__.py +0 -0
  64. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec1/exploitation.py +0 -0
  65. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec1/vent.py +0 -0
  66. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/__init__.py +0 -0
  67. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/assemblage/__init__.py +0 -0
  68. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/assemblage/platine.py +0 -0
  69. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/assemblage/soudure.py +0 -0
  70. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/assemblage/tige.py +0 -0
  71. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/__init__.py +0 -0
  72. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/cisaillement.py +0 -0
  73. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/compression.py +0 -0
  74. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/flexion.py +0 -0
  75. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/plat.py +0 -0
  76. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/profil.py +0 -0
  77. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/element_droit/traction.py +0 -0
  78. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec3/feu.py +0 -0
  79. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/__init__.py +0 -0
  80. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/__init__.py +0 -0
  81. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/agrafe.py +0 -0
  82. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/assemblage.py +0 -0
  83. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/boulon.py +0 -0
  84. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/broche.py +0 -0
  85. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/embrevement.py +0 -0
  86. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/pointe.py +0 -0
  87. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/assemblage/tirefond.py +0 -0
  88. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/blc.py +0 -0
  89. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/__init__.py +0 -0
  90. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/barre.py +0 -0
  91. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/cisaillement.py +0 -0
  92. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/compression.py +0 -0
  93. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/flexion.py +0 -0
  94. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/traction.py +0 -0
  95. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/element_droit/verification_EC5.py +0 -0
  96. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/feu/__init__.py +0 -0
  97. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/feu/cisaillement_feu.py +0 -0
  98. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/feu/compression_feu.py +0 -0
  99. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/feu/feu.py +0 -0
  100. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/feu/flexion_feu.py +0 -0
  101. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec5/feu/traction_feu.py +0 -0
  102. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec8/__init__.py +0 -0
  103. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/ec8/sismique.py +0 -0
  104. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/mixins/__init__.py +0 -0
  105. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/mixins/data_loader.py +0 -0
  106. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/mixins/math_utils.py +0 -0
  107. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/mixins/serialization.py +0 -0
  108. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode/eurocode/mixins/synthese.py +0 -0
  109. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode.egg-info/SOURCES.txt +0 -0
  110. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode.egg-info/dependency_links.txt +0 -0
  111. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode.egg-info/requires.txt +0 -0
  112. {ourocode-2.1.4 → ourocode-2.1.6}/ourocode.egg-info/top_level.txt +0 -0
  113. {ourocode-2.1.4 → ourocode-2.1.6}/setup.cfg +0 -0
  114. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_A0_Projet.py +0 -0
  115. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC0_Combinaison.py +0 -0
  116. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC1_Exploitation.py +0 -0
  117. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC3_Assemblage.py +0 -0
  118. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC3_Element_droit.py +0 -0
  119. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC3_Feu.py +0 -0
  120. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC3_Platine.py +0 -0
  121. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_Assemblage.py +0 -0
  122. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_BLC.py +0 -0
  123. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_CVT.py +0 -0
  124. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_Element_droit.py +0 -0
  125. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_Embrevement.py +0 -0
  126. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_Feu.py +0 -0
  127. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC5_Verification.py +0 -0
  128. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_EC8_Sismique.py +0 -0
  129. {ourocode-2.1.4 → ourocode-2.1.6}/tests/test_model_generator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ourocode
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Ceci est un catalogue de fonction permettant une utilisation rapide pour la réalisation de note de calcul personnalisée.
5
5
  Author-email: Anthony PARISOT <contact@ourea-structure.fr>
6
6
  License-Expression: Apache-2.0
@@ -834,9 +834,10 @@ class Model_result(Projet):
834
834
  Un glisseur retournera une force nulle dans la direction libre.
835
835
  """
836
836
  reaction = {}
837
- supports = self._model_generator.get_all_supports()
838
- for support_id, support in supports.items():
839
- node_id = support["Noeud"]
840
- reaction[support_id] = self._get_node_reaction(node_id, combination)
837
+ all_supports = self._model_generator.get_all_supports()
838
+ for support_type, supports in all_supports.items():
839
+ for support_id, support in supports.items():
840
+ node_id = support["Noeud"]
841
+ reaction[support_id] = self._get_node_reaction(node_id, combination)
841
842
  return reaction
842
843
 
@@ -455,7 +455,7 @@ class Neige(Batiment):
455
455
  """Retourne la charge de neige en kN/m sur un obstacle ou une barre à neige
456
456
 
457
457
  Args:
458
- Sn (float): la charge de neige en kN/m²
458
+ Sn (float): la charge de neige normale au sol en kN/m²
459
459
  entraxe (int): entraxe horizontal entre deux obstacle à la neige en m
460
460
  alpha (float): angle du versant considéré.
461
461
 
@@ -470,6 +470,46 @@ class Neige(Batiment):
470
470
  return F_s
471
471
  return val()
472
472
 
473
+ def poussee_hydrostatique(self, h: si.m):
474
+ """Retourne la poussée horizontale de neige "hydrostatique" selon l'EN 1991-1-3 §6.2.
475
+
476
+ Modélise l'action horizontale due à une accumulation de neige contre un obstacle
477
+ vertical (parapet, écran, mur...) par une charge triangulaire :
478
+ pression nulle au sommet de la couche de neige et maximale à la base.
479
+
480
+ Formules :
481
+
482
+ - hauteur de neige : h_n = S_n / γ
483
+ - pression maximale à la base : q_h = γ × h_n
484
+ - résultante horizontale par mètre linéaire : F_hl = 0.5 × q_h × h
485
+ - hauteur équivalente d'application de la résultante: h_eq = 1/3 * h_n
486
+
487
+ Args:
488
+ h (float): Hauteur de la paroi verticale en m.
489
+
490
+ Returns:
491
+ tuple: (latex_string, dict) avec :
492
+ - "q_h" : pression horizontale maximale à la base en kN/m².
493
+ - "F_hl" : résultante horizontale par unité de largeur en kN/m.
494
+ - "h_neige" : hauteur de neige en m.
495
+ """
496
+ h = h * si.m
497
+ gamma = 2 * si.kN/si.m**3
498
+ Sk_alt = self.Sk_alt[1]
499
+ C_e = self.C_e
500
+ C_t = self.C_t
501
+
502
+ @handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
503
+ def val():
504
+ mu_i = min(max(gamma * h / Sk_alt, 0.8), 2)
505
+ S_n = Sk_alt * mu_i * C_e * C_t
506
+ h_neige = S_n / gamma # hauteur de neige
507
+ h_eq = h_neige * 1/3 # hauteur équivalente d'application de la résultante
508
+ q_h = gamma * h_neige # pression maximale à la base
509
+ F_hl = 0.5 * q_h * h_neige # résultante horizontale par mètre linéaire
510
+ return q_h, F_hl, h_neige, h_eq
511
+ latex, (q_h, F_hl, h_neige, h_eq) = val()
512
+ return latex, {"q_h": q_h, "F_hl": F_hl, "h_neige": h_neige, "h_equivalent": h_eq}
473
513
 
474
514
 
475
515
  if __name__ == "__main__":
@@ -379,11 +379,11 @@ class MOB(Batiment):
379
379
  if couturage_ext_rive:
380
380
  wall['Couturage ext. rive'] = couturage_ext_rive * si.mm
381
381
  wall['Couturage ext. intermédiaire'] = couturage_ext_inter * si.mm
382
- if Ff_Rk_ext is None:
382
+ if Ff_Rk_ext is None or Ff_Rk_ext == 0 * si.N:
383
383
  wall['Ff,Rk ext'] = self._data_connecteurs['Extérieur']['Ff,Rk']
384
384
  else:
385
385
  wall['Ff,Rk ext'] = Ff_Rk_ext * si.N
386
- if Kser_ext is None:
386
+ if Kser_ext is None or Kser_ext == 0 * si.N/si.mm:
387
387
  wall['Kser ext'] = self._data_connecteurs['Extérieur']['Kser']
388
388
  else:
389
389
  wall['Kser ext'] = Kser_ext * si.N / si.mm
@@ -391,11 +391,11 @@ class MOB(Batiment):
391
391
  if couturage_int_rive:
392
392
  wall['Couturage int. rive'] = couturage_int_rive * si.mm
393
393
  wall['Couturage int. intermédiaire'] = couturage_int_inter * si.mm
394
- if Ff_Rk_int is None:
394
+ if Ff_Rk_int is None or Ff_Rk_int == 0 * si.N:
395
395
  wall['Ff,Rk int'] = self._data_connecteurs['Intérieur']['Ff,Rk']
396
396
  else:
397
397
  wall['Ff,Rk int'] = Ff_Rk_int * si.N
398
- if Kser_int is None:
398
+ if Kser_int is None or Kser_int == 0 * si.N/si.mm:
399
399
  wall['Kser int'] = self._data_connecteurs['Intérieur']['Kser']
400
400
  else:
401
401
  wall['Kser int'] = Kser_int * si.N / si.mm
@@ -529,6 +529,10 @@ class MOB(Batiment):
529
529
  k_ser_r (float): raideur du panneau.
530
530
  k_ser_i (float): raideur du panneau.
531
531
  """
532
+ if b == 0 * si.mm or h == 0 * si.mm:
533
+ raise ValueError("Dimensions de panneau invalides: b et h doivent être non nulles.")
534
+ if k_ser_r == 0 * si.N / si.mm**2:
535
+ raise ValueError("Raideur linéique de rive nulle (k_ser_r): vérifier Kser et les couturages de rive.")
532
536
  K_p = (2 / (k_ser_r * (b + h/3) + k_ser_i * h/6) + 2*h**2 / (k_ser_r * b**2 * (h + b/3)))**-1
533
537
  return K_p
534
538
 
@@ -556,11 +560,11 @@ class MOB(Batiment):
556
560
  for sys_name, sys_wall in sys.items():
557
561
  h_sys = sys_wall['Hauteur du système de mur']
558
562
  for wall_name, wall in sys_wall['Murs'].items():
559
- if wall.get('Kser ext', None):
563
+ if wall.get('Kser ext', None) is not None:
560
564
  kser_ext = wall['Kser ext']
561
565
  couturage_ext_rive = wall['Couturage ext. rive']
562
566
  couturage_ext_inter = wall['Couturage ext. intermédiaire']
563
- if wall.get('Kser int', None):
567
+ if wall.get('Kser int', None) is not None:
564
568
  kser_int = wall['Kser int']
565
569
  couturage_int_rive = wall['Couturage int. rive']
566
570
  couturage_int_inter = wall['Couturage int. intermédiaire']
@@ -867,6 +871,16 @@ class MOB(Batiment):
867
871
  long_wall = self.data_walls[wall_name]['Longueur']
868
872
  nb_anc_lb = floor(long_wall / e_anc_lb)
869
873
  nb_anc_li = floor(long_wall / e_anc_li)
874
+ if nb_anc_lb == 0:
875
+ raise ValueError(
876
+ f"Mur '{wall_name}' (L={long_wall}) : e_anc_lb={e_anc_lb} est supérieur "
877
+ f"à la longueur du mur — aucun ancrage lisse basse possible (nb_anc_lb=0)."
878
+ )
879
+ if nb_anc_li == 0:
880
+ raise ValueError(
881
+ f"Mur '{wall_name}' (L={long_wall}) : e_anc_li={e_anc_li} est supérieur "
882
+ f"à la longueur du mur — aucun ancrage lisse d'implantation possible (nb_anc_li=0)."
883
+ )
870
884
  Ft_Rd_wood = (Ft_Rk_wood * K_mod_montant / Assemblage.GAMMA_M_ASS)
871
885
  Fv_Rd_anc_lb = (Fv_Rk_anc_lb * K_mod_lb / Assemblage.GAMMA_M_ASS) * nb_anc_lb
872
886
  Fv_Rd_anc_li = (Fv_Rk_anc_li * K_mod_li / Assemblage.GAMMA_M_ASS) * nb_anc_li
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ourocode
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Ceci est un catalogue de fonction permettant une utilisation rapide pour la réalisation de note de calcul personnalisée.
5
5
  Author-email: Anthony PARISOT <contact@ourea-structure.fr>
6
6
  License-Expression: Apache-2.0
@@ -8,7 +8,7 @@ include = ["ourocode*"]
8
8
 
9
9
  [project]
10
10
  name = "ourocode"
11
- version = "2.1.4"
11
+ version = "2.1.6"
12
12
  description = "Ceci est un catalogue de fonction permettant une utilisation rapide pour la réalisation de note de calcul personnalisée."
13
13
  readme = "README.md"
14
14
  authors = [{name = "Anthony PARISOT", email = "contact@ourea-structure.fr"}]
@@ -166,3 +166,31 @@ def test_fs():
166
166
  # F_s = S_n * entraxe * sin(alpha)
167
167
  expected = 1.0 * si.kN/si.m**2 * 1.5 * si.m * math.sin(math.radians(30))
168
168
  assert pytest.approx(out[1].value, rel=1e-6) == expected.value
169
+
170
+
171
+ def test_poussee_hydrostatique():
172
+ n = Neige(
173
+ exposition="Normal",
174
+ type_toit="1 versant",
175
+ blocage=False,
176
+ h_bat=5, d_bat=10, b_bat=10,
177
+ alpha_toit=10,
178
+ code_INSEE=1001,
179
+ alt=100,
180
+ )
181
+ h = 1 * si.m
182
+ latex, res = n.poussee_hydrostatique(h=h)
183
+ gamma = 2 * si.kN/si.m**3
184
+ Sk_alt = n.Sk_alt[1]
185
+ mu_i = min(max(gamma * h / Sk_alt, 0.8), 2)
186
+ S_n = Sk_alt * mu_i * n.C_e * n.C_t
187
+ h_neige_expected = S_n / gamma
188
+ q_expected = gamma * h_neige_expected
189
+ F_expected = 0.5 * q_expected * h_neige_expected
190
+ h_equivalent_expected = h_neige_expected / 3
191
+
192
+ assert set(res.keys()) == {"q_h", "F_hl", "h_neige", "h_equivalent"}
193
+ assert pytest.approx(res["h_neige"].value, rel=1e-6) == h_neige_expected.value
194
+ assert pytest.approx(res["h_equivalent"].value, rel=1e-6) == h_equivalent_expected.value
195
+ assert pytest.approx(res["q_h"].value, rel=1e-6) == q_expected.value
196
+ assert pytest.approx(res["F_hl"].value, rel=1e-6) == F_expected.value
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes