Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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