def _damped_response(self, non_linear_damping=0.0): SA0, SD0 = self.undamped_response # retrieve undamped response assert len(SA0.shape) == 3 initial_damping = self.initial_damping # get initial damping damping_factor = non_linear_damping + initial_damping # get the reduction factors: Ra, Rv, Rd = calculate_reduction_factors(damping_factor) # maybe treat displacement sensitive as velocity sensitive: if self.csm_damping_regimes == CSM_DAMPING_REGIMES_USE_ALL: pass elif self.csm_damping_regimes == CSM_DAMPING_REGIMES_USE_RA_RV: Rd = Rv elif self.csm_damping_regimes == CSM_DAMPING_REGIMES_USE_RV: Ra = Rv Rd = Rv else: raise ValueError TAV, TVD = self.corner_periods # get corner periods assert len(TAV.shape) == 2 assert len(TVD.shape) == 2 # damp the corner periods is flag is set: # (note this does not affect the original corner periods) assert Ra.shape[-1] == 1 assert Rv.shape[-1] == 1 assert len(Ra.shape) == 3 assert len(Rv.shape) == 3 if self.csm_damping_modify_Tav == CSM_DAMPING_MODIFY_TAV: # print 'damping',damping_factor # print 'TAV',TAV[:,0:5] # print 'Ra,Rv',Ra[:,0:5],Rv[:,0:5] TAV = TAV * (Ra[..., 0] / Rv[..., 0]) # print 'TAV',TAV[:,0:5] periods = self.periods # update SA: SA, SD = calculate_updated_demand( periods, SA0, SD0, Ra, Rv, Rd, TAV, TVD, csm_damping_use_smoothing=self.csm_damping_use_smoothing) # update capacity: SAcap = calculate_capacity(SD, self.capacity_parameters) return SA, SD, SAcap
def building_response(self, SA): """Use the equivilant linear solver to solve """ rtol, maxits = self.rtol, self.csm_damping_max_iterations periods = self.periods magnitudes = self.magnitudes # building_parameters should already be compressed, or expanded. if True: # TODO: Allow hazus and aus standard response curves. # TODO: Allow cutoff after max. SA, surface_displacement = undamped_response( SA, periods, self.atten_override_RSA_shape, self.atten_cutoff_max_spectral_displacement, self.loss_min_pga, magnitude=magnitudes) self.undamped_response = SA, surface_displacement else: raise ValueError self.corner_periods = calculate_corner_periods(periods, SA, magnitudes) # set up initial conditions: update_function = self.updated_response SA, SD, SAcap = self._damped_response(non_linear_damping=0) assert len(SA.shape) == 3 # print "self.capacity_parameters", self.capacity_parameters # print "SAcap.tolist()[0][0]", SAcap.tolist()[0][0] # print "SA.tolist()[0][0]", SA.tolist()[0][0] # print "SD.tolist()[0][0]", SD.tolist()[0][0] # now solve SD_building, non_convergant = solve(SA, SD, SAcap, update_function, rtol=rtol, maxits=maxits) SA_building = calculate_capacity(SD_building[:, :, newaxis], self.capacity_parameters) assert SA_building.shape[-1] == 1 # should not have periods assert len(SA_building.shape) == 3 # should not have periods assert len(SD_building.shape) == 2 # should not have periods SA_building = SA_building[..., 0] # collapse out periods # print "cap_spec_mod SA_building,SD_building", SA_building,SD_building return SA_building, SD_building
def _non_linear_damping(self, displacement): # Calculate the acceleration of the intersect point. displacement = displacement[:, :, newaxis] acceleration = calculate_capacity(displacement, self.capacity_parameters) assert acceleration.shape[-1] == 1 # should not have periods # Get the right damping function. if self.csm_hysteretic_damping is 'trapeziodal': damping_function = trapazoid_damp else: damping_function = nonlin_damp SA, SD = acceleration, displacement # calculate damping damping = damping_function(self.capacity_parameters, self.kappa, SA, SD, self.csm_hysteretic_damping) damping[where(SA < 0.00000000001)] = 0 return damping