7.7. Incremental Dynamic Analysis Postprocessing

postprocessor.process_ida_results(ansys_dict, im_matrix, damage_thresholds, edp_key, sigma_build2build=0.3, sigma_ds=0.3, intensities=np.round(np.geomspace(0.05, 10.0, 50), 3), edp_range=np.linspace(0.00, 0.05, 101), fragility_rotation=False, rotation_percentile=0.10)[source]

Perform fragility function fitting and statistical processing on Incremental Dynamic Analysis (IDA) results.

This method processes raw IDA data by interpolating individual record response curves to a continuous Engineering Demand Parameter (EDP) range. It accounts for “flatlining” (global dynamic instability) using Maximum Likelihood Estimation (MLE) for censored data to estimate the fragility parameters (median and dispersion) for multiple damage states. It also supports fragility curve rotation around a target percentile to account for modeling uncertainties.

Parameters:
  • ansys_dict (dict) –

    A dictionary containing the structural response data with keys:

    • 'max_peak_drift_list' or 'max_peak_accel_list': a list where each entry maps Scale Factors (SF) to peak drift or acceleration values.

    • 'sf_matrix': a 2D numpy array (n_records × max_runs) of scale factors used for each analysis run.

  • im_matrix (numpy.ndarray) – A 2D array of intensity measure levels corresponding to the ground motion records and number of runs carried out in IDA.

  • damage_thresholds (list of float) – A list of EDP-based damage thresholds (e.g., interstorey drift ratios) defining different limit states (e.g., Slight, Moderate, Extensive, Collapse).

  • edp_key (str, optional,) – default=’max_peak_drift_list’ (other: ‘max_peak_accel_list’) The key in ansys_dict used to retrieve the engineering demand parameter data.

  • sigma_build2build (float, optional, default=0.3) – The modeling uncertainty or building-to-building variability. This is combined with the record-to-record variability to calculate total fragility dispersion.

  • sigma_ds (float, optional) – The logarithmic standard deviation representing uncertainty in damage-state thresholds. Default value is 0.30.

  • intensities (numpy.ndarray, optional,) – default=np.geomspace(0.05, 10.0, 50) The array of intensity measure levels over which the final fragility functions (POEs) will be sampled.

  • edp_range (numpy.ndarray, optional,) – default=np.linspace(0.00, 0.05, 101) (0% to 5% drift) The array of engineering demand parameters over which the IDA curves will be evaluated.

  • fragility_rotation (bool, optional, default=False) – Flag to determine if the fragility curves should be rotated around a specific percentile to adjust for modeling bias or target reliability levels.

  • rotation_percentile (float, optional, default=0.10) – The target percentile (0.0 to 1.0) around which the fragility curve rotation is anchored if fragility_rotation is True.

Returns:

ida_dict – A nested dictionary with the following top-level keys:

’ida_inputs’dict

Raw IDA data and analysis configuration.

  • 'target_edps' : array — continuous EDP axis over which IM values are interpolated.

  • 'raw_curves' : list of dicts, one per record, each containing 'im' (sorted IM array) and 'edp' (monotonic EDP array).

  • 'damage_thresholds' : list — EDP values that define each damage state boundary.

  • 'im_matrix' : array — IM values applied to each record at each run.

  • 'n_records' : int — number of ground-motion records in the analysis.

  • 'im_max_analyzed' : float — maximum IM level reached across all records and runs.

’fragility’dict

MLE-fitted fragility parameters and PoEs.

  • 'fragility_method' : str — always ‘mle_ida_censored’.

  • 'intensities' : array — IM levels at which PoEs are evaluated.

  • 'poes' : ndarray, shape (n_IM, n_DS) — probabilities of exceedance per damage state.

  • 'medians' : list, length n_DS — median IM (theta) for each damage state.

  • 'sigma_record2record' : list, length n_DS — record-to-record dispersion per damage state, estimated via MLE on censored capacities.

  • 'sigma_build2build' : list, length n_DS — building-to-building modelling uncertainty.

  • 'sigma_ds' : list, length n_DS — uncertainty in the damage-state threshold definition.

  • 'betas_total' : list, length n_DS — total logarithmic standard deviation per damage state.

  • 'rotation_active' : bool — whether fragility rotation around a percentile was applied.

  • 'rotation_percentile' : float or None — the percentile used for rotation, or None if inactive.

’stats’dict

Statistical IDA curves across all records.

  • 'fitted_edps' : array — EDP axis shared with 'target_edps' in 'ida_inputs'.

  • 'median_im' : array — median IM across all records at each EDP level (50th percentile curve).

  • 'p16_im' : array — 16th percentile IM across records at each EDP level.

  • 'p84_im' : array — 84th percentile IM across records at each EDP level.

Return type:

dict

Notes

The method uses a log-likelihood minimization approach to handle records that do not reach a specific damage threshold within the analyzed range (right-censored data), ensuring the fragility curves remain statistically robust even near collapse.

Theoretical Background

Incremental Dynamic Analysis (IDA) scales each record to multiple intensity levels and traces the structural response from elastic behaviour to collapse, producing IDA curves and a statistical basis for fragility derivation (Vamvatsikos & Cornell, 2002).

IDA curves

For each ground-motion record \(r\) and scaling factor \(\lambda\), the scaled IM is \(\text{IM}_{r,\lambda} = \lambda \cdot \text{IM}_{r,1}\) and the resulting peak EDP is recorded. The full set of \((\text{IM}, \text{EDP})\) pairs for record \(r\) forms its IDA curve.

Limit-state capacity

The IM capacity \(C_i^{(r)}\) of record \(r\) for damage state \(i\) is the smallest IM at which the IDA curve first exceeds the threshold \(\delta_i\):

\[C_i^{(r)} = \inf\bigl\{\text{IM} : \text{EDP}(\text{IM}) \geq \delta_i\bigr\}\]

Lognormal fragility fitting

Across all records, the capacities \(\{C_i^{(r)}\}\) are assumed lognormally distributed. The median \(\theta_i\) and logarithmic standard deviation \(\beta_{\text{rr}}\) are estimated by maximum likelihood:

\[\theta_i = \exp\!\left(\frac{1}{N}\sum_{r=1}^{N} \ln C_i^{(r)}\right), \qquad \beta_{\text{r2r}} = \sqrt{\frac{1}{N-1}\sum_{r=1}^{N}\bigl(\ln C_i^{(r)} - \ln \theta_i\bigr)^2}\]

Total dispersion

Additional sources of uncertainty are combined in quadrature:

\[\beta_{\text{total}} = \sqrt{\beta_{\text{r2r}}^2 + \beta_{\text{b2b}}^2 + \beta_{\text{DS}}^2}\]

Fragility function

The probability of exceeding damage state \(i\) at a given IM is:

\[P(\text{DS} \geq ds_i \mid \text{IM}) = \Phi\!\left(\frac{\ln(\text{IM}/\theta_i)}{\beta_{\text{total}}}\right)\]