예제 #1
0
    def __init__(self,
                 structures,
                 SA,
                 periods,
                 magnitudes,
                 csm_use_variability,
                 csm_standard_deviation,
                 csm_params=None):
        """Class to determine the damage and economic loss.

        structures  a Structures instance - But what is actually needed from it?
        SA          array of Spectral Acceleration, in g, with axis;
                        sites, pseudo_events, atten_periods
                    the site axis usually has a size of 1
        periods     array, 1 axis
        magnitudes  array, 1 axis
        csm_params  capacity spectrum method params

        One Damage_model instance is created for each site, in
        calc_total_loss().  The structures value will be different for each
        site.
        """

        self.structures = structures
        self.periods = periods
        self.magnitudes = magnitudes
        self.SA = SA
        self.csm_use_variability = csm_use_variability
        self.csm_standard_deviation = csm_standard_deviation

        if csm_params is None:
            csm_params = {
                'csm_damping_regimes': CSM_DAMPING_REGIMES_USE_ALL,
                'csm_damping_modify_Tav': CSM_DAMPING_MODIFY_TAV,
                'csm_damping_use_smoothing': CSM_DAMPING_USE_SMOOTHING,
                'rtol': 0.01,
                'csm_damping_max_iterations': 7,
                'sdtcap': 0.3,
                'csm_use_variability': False,
                'csm_variability_method': None,
                'csm_hysteretic_damping': 'trapezoidal',
                'atten_override_RSA_shape': None,
                'atten_cutoff_max_spectral_displacement': False,
                'loss_min_pga': 0.0
            }

        csm_params['periods'] = periods
        csm_params['building_parameters'] = structures.building_parameters
        csm_params['magnitudes'] = magnitudes
        self.capacity_spectrum_model = Capacity_spectrum_model(**csm_params)
    def test_OS_bug_search(self):
        """
        Used to trackdown ticket #98
        """
        SA = array([[[
            0.14210731, 0.29123634, 0.23670422, 0.13234554, 0.08648546,
            0.06338455, 0.04945741, 0.04140068, 0.03497466, 0.02969136,
            0.02525473, 0.02151188, 0.018371, 0.01571802, 0.01344816,
            0.01148438, 0.00980236, 0.00836594, 0.00714065, 0.00609482
        ],
                     [
                         0.2093217, 0.30976405, 0.16232743, 0.06989206,
                         0.03216174, 0.01945677, 0.01347719, 0.00987403,
                         0.00799221, 0.00660128, 0.00547129, 0.0045463,
                         0.0042072, 0.00418348, 0.0041599, 0.00413222,
                         0.00410333, 0.00407463, 0.00404614, 0.00401785
                     ],
                     [
                         0.01450217, 0.02750284, 0.02231209, 0.01127933,
                         0.00793098, 0.00621618, 0.0051103, 0.00430777,
                         0.00364714, 0.0031542, 0.00279411, 0.00247654,
                         0.0022153, 0.001994, 0.0017948, 0.00161223,
                         0.00144737, 0.00129929, 0.00117312, 0.00105988
                     ]]])
        csm_params = {
            'building_parameters': {
                'residential_drift_threshold':
                array([[21.9456, 43.8912, 109.728, 164.592]]),
                'design_strength':
                array([0.033]),
                'height':
                array([7315.2]),
                'ultimate_to_yield':
                array([3.]),
                'structure_class':
                array(['BUILDING'], dtype='|S8'),
                'non_residential_drift_threshold':
                array([[5.4864, 43.8912, 82.296, 137.16]]),
                'damping_Be':
                array([0.1]),
                'fraction_in_first_mode':
                array([0.8]),
                'nsd_a_ratio':
                array([0.7254902]),
                'acceleration_threshold':
                array([[0.2, 0.4, 0.8, 1.6]]),
                'nsd_d_ratio':
                array([0.11764706]),
                'structure_ratio':
                array([0.15686275]),
                'structural_damage_threshold':
                array([[26.33472, 41.69664, 88.87968, 219.456]]),
                'natural_elastic_period':
                array([0.5]),
                'damping_s':
                array([0.4]),
                'drift_threshold':
                array([[5.4864, 43.8912, 82.296, 137.16]]),
                'yield_to_design':
                array([1.5]),
                'structure_classification':
                array(['S1L'], dtype='|S13'),
                'height_to_displacement':
                array([0.75]),
                'ductility':
                array([5.]),
                'damping_l':
                array([0.]),
                'damping_m':
                array([0.2])
            },
            'loss_min_pga':
            0.050000000000000003,
            'csm_hysteretic_damping':
            'trapezoidal',
            'csm_use_variability':
            1,
            'sdtcap':
            0.29999999999999999,
            'csm_variability_method':
            3,
            'rtol':
            0.01,
            'csm_damping_regimes':
            CSM_DAMPING_REGIMES_USE_ALL,
            'csm_damping_modify_Tav':
            CSM_DAMPING_MODIFY_TAV,
            'csm_damping_use_smoothing':
            CSM_DAMPING_USE_SMOOTHING,
            'magnitudes':
            array([6.0201519, 6.0201519, 6.0201519]),
            'periods':
            array([
                0., 0.17544, 0.35088, 0.52632, 0.70175, 0.87719, 1.0526,
                1.2281, 1.4035, 1.5789, 1.7544, 1.9298, 2.1053, 2.2807, 2.4561,
                2.6316, 2.807, 2.9825, 3.1579, 3.3333
            ]),
            'atten_override_RSA_shape':
            None,
            'atten_cutoff_max_spectral_displacement':
            False,
            'csm_damping_max_iterations':
            7
        }

        reset_seed(True)
        capacity_spectrum_model = Capacity_spectrum_model(**csm_params)
        point = capacity_spectrum_model.building_response(SA)
        point_windows = (array([[0.11670333, 0.06428497,
                                 0.]]), array([[7.35287023, 3.98947559, 0.]]))
        assert allclose(asarray(point), asarray(point_windows))
예제 #3
0
    def test_building_response(self):
        #Test that building response is the same as matlab

        periods=array([0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5,
                       0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7,
                       1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9,
                       3])

        SA = array([0.017553049, 0.028380350, 0.036142210, 0.037701113,
                    0.039325398, 0.038083417, 0.036880517, 0.036190107,
                    0.035512489, 0.035088679, 0.034669917, 0.033162774,
                    0.030871523, 0.027841184, 0.025094836, 0.022850476,
                    0.021322256, 0.019895084, 0.018562342, 0.017317833,
                    0.016160874, 0.015195155, 0.014287144, 0.013433394,
                    0.012630662, 0.011875899, 0.011166239, 0.010498986,
                    0.009871606, 0.009281717, 0.008727078, 0.008140645,
                    0.007593619, 0.007083352, 0.006607374, 0.006163380])

        SA = SA[newaxis, newaxis, :]

        magnitudes = array([6.5])

        Btype = 'RM2L'

        eqrm_dir = determine_eqrm_path()
        default_input_dir = join(eqrm_dir, 'resources', 'data', '')
        building_parameters = \
            building_params_from_csv(building_classification_tag = '',
                                     damage_extent_tag = '',
                                     default_input_dir=default_input_dir)

        # Pull the parameters out:
        b_index = where([(bt == Btype) for bt in
                             building_parameters['structure_classification']])
        new_bp = {}
        for key in building_parameters:
            try:
                new_bp[key] = building_parameters[key][b_index]
            except:
                new_bp[key] = building_parameters[key]

        structures = Structures(latitude=[-31], longitude=[150],
                                building_parameters=new_bp,
                                #bridge_parameters={},
                                FCB_USAGE=array([111]),
                                STRUCTURE_CLASSIFICATION=array([Btype]),
                                STRUCTURE_CATEGORY=array(['BUILDING']))
        building_parameters = structures.building_parameters

        # All the same for this type anyway
        csm_use_variability = None
        csm_standard_deviation = None
        damage_model = Damage_model(structures, SA, periods, magnitudes,
                                    csm_use_variability, csm_standard_deviation)

        # set up the capacity model
        capacity_spectrum_model = Capacity_spectrum_model(periods, magnitudes,
                                                          building_parameters)

        capacity_spectrum_model.smooth_damping = True
        capacity_spectrum_model.use_displacement_corner_period = True
        capacity_spectrum_model.damp_corner_periods = True
        capacity_spectrum_model.use_exact_area = True
        capacity_spectrum_model.rtol = 0.01
        capacity_spectrum_model.csm_damping_max_iterations = 7

        ###########################################################

        damage_model.capacity_spectrum_model = capacity_spectrum_model

        # Warning, point is not used
        point = damage_model.get_building_displacement()

        # matlab values
        SAcr = 0.032208873
        SDcr = 0.97944026
        assert allclose(point[0], SAcr)
        assert allclose(point[1], SDcr)
        assert allclose(point, [[[SAcr]], [[SDcr]]])
예제 #4
0
    def test_capacity_method(self):
        #in
        (Ay, Dy, Au, Du) =(0.13417, 2.9975, 0.26833, 41.964)
        (aa, bb, cc, kappa) =(-0.3647, 0.33362, 0.26833, 0.001)
        capacity_parameters = (Dy, Ay, Du, Au, aa, bb, cc)

        SA_Regolith = array([0.342012967618843, 0.763365709250557,
                             0.653837319165796, 0.530630921234538,
                             0.442943423800148, 0.383969335597378,
                             0.344524949645552, 0.321240620786007,
                             0.302941865445212, 0.27664105478319,
                             0.248309353527187, 0.15957588550857,
                             0.110047888697209, 0.0801793140567643,
                             0.0550935180421332, 0.0397236036505722,
                             0.0291049436633207, 0.0214091242649845,
                             0.0157482043977009])
        SA_Regolith.shape = (1, 1, -1)

        params = (0.069, 13, 0.3, 0.9, 0.7, 1.75, 2, 7)
        dparams = (0.001, 0.001, 0.001, 0.08)

        (C, height, T, a1, a2, y, h, u) =params
        magnitudes = array([7.2])
        (damping_s, damping_m, damping_l, initial_damping) = dparams

        periods = array([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8,
                         0.9, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5])

        building_parameters = {}

        building_parameters['design_strength'] = array([C])
        building_parameters['natural_elastic_period'] = array([T])
        building_parameters['fraction_in_first_mode'] = array([a1])
        building_parameters['height_to_displacement'] = array([a2])
        building_parameters['yield_to_design'] = array([y])
        building_parameters['ultimate_to_yield'] = array([h])
        building_parameters['ductility'] = array([u])
        building_parameters['damping_s'] = array([damping_s])
        building_parameters['damping_m'] = array([damping_m])
        building_parameters['damping_l'] = array([damping_l])
        building_parameters['damping_Be'] = array([initial_damping])
        building_parameters['structure_classification'] = ['test_blg']
        
        csm = Capacity_spectrum_model(periods, magnitudes, building_parameters)
        csm.rtol = 0.01
        csm.csm_damping_max_iterations = 7
        csm.use_displacement_corner_period = True
        csm.use_exact_area = True
        csm.damp_corner_periods = True
        point = csm.building_response(SA_Regolith)

        #final
        SDnew = [0, 1.6012, 5.486, 10.017, 15.022, 20.783, 27.144, 34.449,
                 42.431, 49.04, 54.342, 78.577, 96.336, 109.67, 108.51, 106.5,
                 101.91, 94.879, 86.162]

        SAnew = [0, 1.6012, 5.486, 10.017, 15.022, 20.783, 27.144, 34.449,
                 42.431, 49.04, 54.342, 78.577, 96.336, 109.67, 108.51, 106.5,
                 101.91, 94.879, 86.162]

        SDcr = 41.810644943005

        SAcr = 0.26833301410569

        assert allclose(SAcr, point[0])
        assert allclose(SDcr, point[1])
예제 #5
0
    def BROKEN_test_find_intersection(self):
        # An error in the hysteresis area calc means the results
        # from Matlab are wrong.
        SA = array([
            0.21604198097920, 0.49383398471879, 0.35207861448168,
            0.28146561293471, 0.24663798021059, 0.18607106822206,
            0.12461515892587, 0.08879073656528, 0.06464645061910,
            0.04893110975922, 0.03794974804020, 0.02998618121319,
            0.02404471425307, 0.01947448758241, 0.01577287001015,
            0.01292966840312, 0.01064323885374, 0.00876012522030,
            0.00721096310143, 0.00593573499178
        ])
        SA.shape = 1, 1, -1
        periods = array([
            0, 0.17544, 0.35088, 0.52632, 0.70175, 0.87719, 1.0526, 1.2281,
            1.4035, 1.5789, 1.7544, 1.9298, 2.1053, 2.2807, 2.4561, 2.6316,
            2.807, 2.9825, 3.1579, 3.3333
        ])
        magnitudes = array([5.6])

        building_parameters = {
            'height': array([4572.]),
            'ultimate_to_yield': array([2.]),
            'design_strength': array([0.2]),
            'fraction_in_first_mode': array([0.75]),
            'natural_elastic_period': array([0.13]),
            'yield_to_design': array([1.5]),
            'height_to_displacement': array([0.75]),
            'ductility': array([2.]),
            'damping_s': array([0.001]),
            'damping_m': array([0.001]),
            'damping_l': array([0.001]),
            'damping_Be': array([0.05])
        }

        csm_hysteretic_damping = 'curve'
        rtol = 1 / 100.0
        csm_damping_max_iterations = 7
        sdtcap = 0.3
        csm_use_variability = False
        csm_variability_method = 3
        csm_variability_method = 3
        atten_override_RSA_shape = 0
        capacity_spectrum_model = Capacity_spectrum_model(
            periods,
            magnitudes,
            building_parameters,
            csm_damping_regimes=CSM_DAMPING_REGIMES_USE_ALL,
            csm_damping_modify_Tav=CSM_DAMPING_MODIFY_TAV,
            csm_damping_use_smoothing=CSM_DAMPING_USE_SMOOTHING,
            csm_hysteretic_damping=csm_hysteretic_damping,
            rtol=rtol,
            csm_damping_max_iterations=csm_damping_max_iterations,
            sdtcap=sdtcap,
            csm_use_variability=csm_use_variability,
            atten_override_RSA_shape=atten_override_RSA_shape,
            csm_variability_method=csm_variability_method)
        SAcr, SDcr = capacity_spectrum_model.building_response(SA)
        #print SDcr
        #print SAcr

        assert allclose(1.99087165775938, SDcr[0, 0])
        assert allclose(0.46802255489563, SAcr)