diff --git a/README.md b/README.md index 522c352..263dee6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Bu repoda TS500 ve TBDY2018 deki konuların python yardımı ile kodlaması yap - [x] Dikdörtgen kolonlarda sargı donatısı tasarımı. - [x] TBDY-2018 deprem yönetmeliğinde EK5-A da belirtilen sargılı ve sargısız mander beton modeli ile çelik modelinin python yardımı ile oluşturulması. - [x] TBDY2018 bölüm 3'te verilen spektrum grafiklerinin çıkarılması. -- [ ] Verilen bilgilere göre BYS sınıfı ve yapılabilecek maximum bina yüksekliğinin bulunması +- [x] Verilen bilgilere göre BYS sınıfı ve yapılabilecek maximum bina yüksekliğinin bulunması - [ ] Verilen bilgilere göre performans hedeflerinin bulunması - [ ] TBDY2018' e uygun R ve D katsayıları önermesi @@ -14,7 +14,7 @@ Bu repoda TS500 ve TBDY2018 deki konuların python yardımı ile kodlaması yap ```python from TSCMaterialModels import Mander from TSCConfimentBarsRules import ConfimentDesign as cd -from TSCResponseSpectra import SeismicInputs,SeismicTSC +from TSCResponseSpectra import SeismicInputs,SeismicTSC,SeismicResistanceBuildingInputs ``` ## 2- Kullanılacak değerler @@ -55,7 +55,7 @@ s = ConfinmentDesign.s_OptEndConfArea 52 ## 4- TBDY2018 malzeme modelleri -![Mander](Resource/TBDY_Mander_part.png) +![Mander](src/Resource/TBDY_Mander_part.png) ```python mander = Mander(B = B, H = H, @@ -77,7 +77,7 @@ mander = Mander(B = B, mander.Plot_Manders() ``` -![ManderPlot](Resource/ExampleManderPlot.png) +![ManderPlot](src/Resource/ExampleManderPlot.png) ## 5-TBDY2018 Hedef Spektrumların Elde Edilmesi TBDY2018 de verilen spektrumları elde etmek için sismik girdiler için oluşturulan `SeismicInputs` sınıfından faydalanıyoruz. Bu sınıfı spektrum değerlerini hesaplaması için oluşturulmuş `SeismicTSC` sınıfının girdisi olarak verildiğinde tüm değerler hesaplanmış olacak. @@ -92,20 +92,44 @@ SeismicVariables = SeismicInputs(lat = 39.85, rs = SeismicTSC(Variables = SeismicVariables) rs.plot_HorizontalElasticSpectrum() ``` -![ElasticResponseSpectrums](Resource/ElasticResponseSpectrums.png) +![ElasticResponseSpectrums](src/Resource/ElasticResponseSpectrums.png) `SeismicTSC` içerisindeki `ElasticSpectrums` değişkeninden periyotlar,spektral ivmeler, spektral deplasmanlar,düşey spektral ivmeler, deprem yükü azaltma katsayıları ve azaltılmış spektral ivmeleri içeren pandas DataFrame yapısına erişilebilir. ```python rs.ElasticSpectrums.head(10) ``` -![df_Spectrums](Resource/df_Spectrums.png) +![df_Spectrums](src/Resource/df_Spectrums.png) Bu sınıfın referansını `SeismicTSC` sınıfına girdi olarak verdiğimizden dolayı bu referans üzerinden hesaplanan tüm değerler `SeismicVariables` sınıfında da saklanmış olur. Formatlanmış bir şekilde tüm sismik girdiler görüntülenebilir. ```python SeismicVariables ``` -![SeismicVariables](Resource/SeismicVariables.png) +![SeismicVariables](src/Resource/SeismicVariables.png) + +```python +StructureVariables +``` +
Hn : 70
+R : 8.0
+D : 3.0
+I : 1.0
+DTS : 1a
+BYS : 2
Afaddan alınan gerçek değerler aşağıdaki gibidir. Yaklaşık olarak hesaplanan değerlere çok yakın çıkmaktadır. -![TDTH_Spectrum](Resource/TDTH_Spectrum.png) \ No newline at end of file +![TDTH_Spectrum](src/Resource/TDTH_Spectrum.png) + +Verilen doğal titreşim periyoduna karşılık gelen elastik spektral ivme +```python +Sae_Tp = rs.Get_Sae_Tp(T=1.2) +Sae_Tp +``` +0.2438 + +Verilen doğal titreşim periyoduna karşılık gelen azaltılmış elastik spektral ivme +```python +Sar_Tp = rs.Get_SaR_Tp(T=1.2) +Sar_Tp +``` +0.0305 \ No newline at end of file diff --git a/src/TSCResponseSpectra.py b/src/TSCResponseSpectra.py index d277756..5d8660e 100644 --- a/src/TSCResponseSpectra.py +++ b/src/TSCResponseSpectra.py @@ -14,9 +14,6 @@ class SeismicInputs: soil : soil class intensity : intensity level options: DD1, DD2, DD3, DD4 - R : Yapi davranis katsayisi - D : Overstrength factor (Dayanim fazlalagi katsayisi) - I : Building important factor (Bina onem katsayisi) Ss : Kisa periyot harita katsayisi S1 : 1 sn periyot harita katsayisi soil : Zemin sinifi @@ -37,12 +34,6 @@ class SeismicInputs: lon : float = field(default_factory=float) soil : str = field(default_factory=str) intensity : str = field(default_factory=str) - Hn : float = field(default=10) - R : float = field(default=8.) - D : float = field(default=3.) - I : float = field(default=1.) - DTS : str = field(default="1") - BYS : int = field(default=1) Ss : float = field(default=0.) S1 : float = field(default=0.) PGA : float = field(default=0.) @@ -56,7 +47,7 @@ class SeismicInputs: TL : float = field(default=6.) def __repr__(self) -> str: - return f"Latitude :{self.lat}\nLongitude :{self.lon}\nSoil Class :{self.soil}\nIntensity:{self.intensity}\nR :{self.R}\nD :{self.D}\nI :{self.I}\nDTS :{self.DTS}\nBYS :{self.BYS}\nSs :{self.Ss}\nS1 :{self.S1}\nPGA :{self.PGA}\nPGV :{self.PGV}\nFs :{self.Fs}\nF1 :{self.F1 }\nSDs :{self.SDs}\nSD1 :{self.SD1}\nTA :{self.TA}\nTB :{self.TB}\nTL :{self.TL}" + return f"Latitude :{self.lat}\nLongitude :{self.lon}\nSoil Class :{self.soil}\nIntensity:{self.intensity}\nSs :{self.Ss}\nS1 :{self.S1}\nPGA :{self.PGA}\nPGV :{self.PGV}\nFs :{self.Fs}\nF1 :{self.F1 }\nSDs :{self.SDs}\nSD1 :{self.SD1}\nTA :{self.TA}\nTB :{self.TB}\nTL :{self.TL}" def dict(self) -> dict: """Class property lerini sözlük olarak döndürür. @@ -79,23 +70,59 @@ def convert_dataframe(self) -> pd.DataFrame: @dataclass class SeismicResistanceBuildingInputs: + """ + Args: + Hn : Bina serbest yüksekliği [m] + R : Yapi davranis katsayisi + D : Overstrength factor (Dayanim fazlalagi katsayisi) + I : Building important factor (Bina onem katsayisi) + DTS : Deprem tasarim sinifi + BYS : Bina yükseklik sinifi + """ + Hn : float = field(default=10) R : float = field(default=8.) D : float = field(default=3.) I : float = field(default=1.) DTS : str = field(default="1") BYS : int = field(default=1) + def __repr__(self) -> str: + return f"Hn :{self.Hn}\nR :{self.R}\nD :{self.D}\nI :{self.I}\nDTS :{self.DTS}\nBYS :{self.BYS}" + + def dict(self) -> dict: + """Class property lerini sözlük olarak döndürür. + + Returns: + dict: Class propertylerini içeren sözlük + """ + return asdict(self) + + def convert_dataframe(self) -> pd.DataFrame: + """Class property lerini pandas DataFrame olarak döndürür. + + Returns: + dict: Class propertylerini içeren DataFrame + """ + dumy = self.dict() + dumy_df = pd.DataFrame([dumy.keys(),dumy.values()]).T + del dumy + return dumy_df + @dataclass class SeismicTSC: - Variables : SeismicInputs = field(default_factory=SeismicInputs) - + SeismicVariables : SeismicInputs = field(default_factory=SeismicInputs) + BuildingVariables : SeismicResistanceBuildingInputs = field(default_factory=SeismicResistanceBuildingInputs) def __post_init__(self) -> None: - self.__GetSpectralMapVariables(self.Variables.lat , self.Variables.lon) + self.SetVariables() + + def SetVariables(self) ->None: + """Hesaplanmasi gereken değerleri hesaplar ve set eder.""" + self.__GetSpectralMapVariables() self.__Get_SpectrumCoefficients() self.__GetDTS() - self.__GetMaxBYS(Hn=self.Variables.Hn,Dts=self.Variables.DTS) + self.__GetMaxBYS() self.__Get_TA() self.__Get_TB() self.ElasticSpectrums = self.__HorizontalElasticSpectrum() @@ -103,13 +130,8 @@ def __post_init__(self) -> None: self.__VerticalElasticSpektrum() self.__ReducedTargetSpectrum() - def __GetSpectralMapVariables(self, Latitude : float, Longitude : float) -> None: - """Spektrum haritasinda verilen koordinatlara göre spektral harita değerlerini bulur - - Args: - Latitude (float): Enlem - Longitude (float): Boylam - """ + def __GetSpectralMapVariables(self) -> dict: + """Spektrum haritasinda verilen koordinatlara göre spektral harita değerlerini bulur""" afad_spectra_params_df = pd.read_csv("Resource\AFAD_TDTH_parametre.csv") # grid locattions @@ -120,19 +142,17 @@ def __GetSpectralMapVariables(self, Latitude : float, Longitude : float) -> None spectral_value_dict = {} for column_name in ["Ss","S1","PGA","PGV"]: - z = afad_spectra_params_df[ f"{column_name}-{self.Variables.intensity}"].to_list() + z = afad_spectra_params_df[ f"{column_name}-{self.SeismicVariables.intensity}"].to_list() interpolator = sc.interpolate.CloughTocher2DInterpolator( array([x,y]).T , z) - spectral_value = round( interpolator( self.Variables.lat, self.Variables.lon) , 3 ) + spectral_value = round( interpolator( self.SeismicVariables.lat, self.SeismicVariables.lon) , 3 ) spectral_value_dict[column_name] = spectral_value - self.Variables.Ss = spectral_value_dict["Ss"] - self.Variables.S1 = spectral_value_dict["S1"] - self.Variables.PGA = spectral_value_dict["PGA"] - self.Variables.PGV = spectral_value_dict["PGV"] - - del afad_spectra_params_df,spectral_value_dict + self.SeismicVariables.Ss = spectral_value_dict["Ss"] + self.SeismicVariables.S1 = spectral_value_dict["S1"] + self.SeismicVariables.PGA = spectral_value_dict["PGA"] + self.SeismicVariables.PGV = spectral_value_dict["PGV"] def __Get_SpectrumCoefficients(self)->None: # Spectral values @@ -152,63 +172,61 @@ def __Get_SpectrumCoefficients(self)->None: "ZD": [2.4 , 2.2 , 2.0 , 1.9 , 1.8 , 1.7], "ZE": [4.2 , 3.3 , 2.8 , 2.4 , 2.2 , 2.0]} + + # Short period - if self.Variables.Ss < Ss_range[0]: - self.Variables.Fs = FS_table[self.Variables.soil][0] - self.Variables.SDs = self.Variables.Ss * self.Variables.Fs - elif self.Variables.Ss > Ss_range[-1]: - self.Variables.Fs = FS_table[self.Variables.soil][-1] - self.Variables.SDs = self.Variables.Ss * self.Variables.Fs + if self.SeismicVariables.Ss < Ss_range[0]: + self.SeismicVariables.Fs = FS_table[self.SeismicVariables.soil][0] + self.SeismicVariables.SDs = self.SeismicVariables.Ss * self.SeismicVariables.Fs + elif self.SeismicVariables.Ss > Ss_range[-1]: + self.SeismicVariables.Fs = FS_table[self.SeismicVariables.soil][-1] + self.SeismicVariables.SDs = self.SeismicVariables.Ss * self.SeismicVariables.Fs else: - self.Variables.Fs = round( interp(self.Variables.Ss,Ss_range, FS_table[self.Variables.soil]) , 3) - self.Variables.SDs = self.Variables.Ss * self.Variables.Fs + self.SeismicVariables.Fs = round( interp(self.SeismicVariables.Ss,Ss_range, FS_table[self.SeismicVariables.soil]) , 3) + self.SeismicVariables.SDs = self.SeismicVariables.Ss * self.SeismicVariables.Fs # 1sec period - if self.Variables.S1 < S1_range[0] : - self.Variables.F1 = F1_table[self.Variables.soil][0] - self.Variables.SD1 = self.Variables.S1 * self.Variables.F1 - elif self.Variables.S1 > S1_range[-1]: - self.Variables.F1 = F1_table[self.Variables.soil][-1] - self.Variables.SD1 = self.Variables.S1 * self.Variables.F1 + if self.SeismicVariables.S1 < S1_range[0] : + self.SeismicVariables.F1 = F1_table[self.SeismicVariables.soil][0] + self.SeismicVariables.SD1 = self.SeismicVariables.S1 * self.SeismicVariables.F1 + elif self.SeismicVariables.S1 > S1_range[-1]: + self.SeismicVariables.F1 = F1_table[self.SeismicVariables.soil][-1] + self.SeismicVariables.SD1 = self.SeismicVariables.S1 * self.SeismicVariables.F1 else: - self.Variables.F1 = round(interp(self.Variables.S1, S1_range, F1_table[self.Variables.soil]), 3) - self.Variables.SD1 = self.Variables.S1 * self.Variables.F1 - + self.SeismicVariables.F1 = round(interp(self.SeismicVariables.S1, S1_range, F1_table[self.SeismicVariables.soil]), 3) + self.SeismicVariables.SD1 = self.SeismicVariables.S1 * self.SeismicVariables.F1 + + del Ss_range,FS_table,S1_range,F1_table def __GetDTS(self) -> None: """Deprem tasarim sinifini bulur.""" - if self.Variables.SDs < .33 : - self.Variables.DTS = "4a" - if self.Variables.I ==2 or self.Variables.I == 3: - self.Variables.DTS = "4" + if self.SeismicVariables.SDs < .33 : + self.BuildingVariables.DTS = "4a" + if self.BuildingVariables.I ==2 or self.BuildingVariables.I == 3: + self.BuildingVariables.DTS = "4" - if self.Variables.SDs >= 0.33 and self.Variables.SDs < 0.50 : - self.Variables.DTS = "3a" - if self.Variables.I ==2 or self.Variables.I == 3: - self.Variables.DTS = "3" + if self.SeismicVariables.SDs >= 0.33 and self.SeismicVariables.SDs < 0.50 : + self.BuildingVariables.DTS = "3a" + if self.BuildingVariables.I ==2 or self.BuildingVariables.I == 3: + self.BuildingVariables.DTS = "3" - if self.Variables.SDs >= 0.50 and self.Variables.SDs < 0.75 : - self.Variables.DTS = "2a" - if self.Variables.I ==2 or self.Variables.I == 3: - self.Variables.DTS = "2" - if self.Variables.SDs >= 0.75 : - self.Variables.DTS = "1a" - if self.Variables.I ==2 or self.Variables.I == 3: - self.Variables.DTS = "1" - # BUG BYS sınır değerlerinde hatalı veriyor kontrol edilmeli - def __GetMaxBYS(self,Hn : float, Dts : str): - """TBDY2018 Tablo 3.3 e göre BYS sinifini bulur. - - Args: - Hn (float): Bina Toplam Yüksekliği [m] - Dts (str): Deprem tasarim sinifi - """ - if Dts in ["1","1a","2","2a"]: + if self.SeismicVariables.SDs >= 0.50 and self.SeismicVariables.SDs < 0.75 : + self.BuildingVariables.DTS = "2a" + if self.BuildingVariables.I ==2 or self.BuildingVariables.I == 3: + self.BuildingVariables.DTS = "2" + if self.SeismicVariables.SDs >= 0.75 : + self.BuildingVariables.DTS = "1a" + if self.BuildingVariables.I ==2 or self.BuildingVariables.I == 3: + self.BuildingVariables.DTS = "1" + + def __GetMaxBYS(self): + """TBDY2018 Tablo 3.3 e göre BYS sinifini bulur.""" + if self.BuildingVariables.DTS in ["1","1a","2","2a"]: dts = 0 - if Dts in ["3","3a"]: + if self.BuildingVariables.DTS in ["3","3a"]: dts = 1 - if Dts in ["4","4a"]: + if self.BuildingVariables.DTS in ["4","4a"]: dts = 1 BYS = { @@ -222,38 +240,37 @@ def __GetMaxBYS(self,Hn : float, Dts : str): 8 : [0,0,0] } df_bys = pd.DataFrame(BYS).T - self.BYS = df_bys[dts][df_bys[dts] < Hn].index[0] + self.BuildingVariables.BYS = df_bys[dts][df_bys[dts] < self.BuildingVariables.Hn].index[0] del BYS,dts,df_bys - def __Get_TA(self) -> float: """Yatay elastik tasarim spektrum sol köşe periyodu.""" - self.Variables.TA = 0.2 * self.Variables.SD1 / self.Variables.SDs + self.SeismicVariables.TA = 0.2 * self.SeismicVariables.SD1 / self.SeismicVariables.SDs def __Get_TB(self) -> float: """Yatay elastik tasarim elastik spektrum sağ köşe periyodu""" - self.Variables.TB = self.Variables.SD1 / self.Variables.SDs + self.SeismicVariables.TB = self.SeismicVariables.SD1 / self.SeismicVariables.SDs def __HorizontalElasticSpectrum(self)-> pd.DataFrame: """TBDY yatay elastik tasarim spektrumu""" - T_list = arange(0.0, self.Variables.TL,.005) + T_list = arange(0.0, self.SeismicVariables.TL,.005) Sa = [] for i in T_list: - if i