Skip to main content
Validate your turbulence intensity adjustments against industry-standard DNV RP-0661 criteria.

Quick Validation

from tact.validation import validate_dnv_rp0661

# After running adjustment
validation = validate_dnv_rp0661(
    adjusted_data=results["adjusted_data"],
    reference_col="ref_ti",
    adjusted_col="adjTI_RSD_TI",
    wind_speed_col="ref_ws",
    bin_col="bins",
    criteria_type="LV"  # Load Verification
)

# Check results
print(f"MRBE: {validation['overall']['MRBE_%'].iloc[0]:.2f}%")
print(f"RRMSE: {validation['overall']['RRMSE_%'].iloc[0]:.2f}%")
print(f"Pass: {validation['overall']['pass'].iloc[0]}")

Understanding DNV Criteria

Load Verification CriteriaUsed for turbine load calculations and site assessments.Acceptance Criteria:
  • MRBE (Mean Relative Bias Error) ≤ 5%
  • RRMSE (Relative Root Mean Square Error) ≤ 15%
validation = validate_dnv_rp0661(
    adjusted_data=results["adjusted_data"],
    reference_col="ref_ti",
    adjusted_col="adjTI_RSD_TI",
    wind_speed_col="ref_ws",
    bin_col="bins",
    criteria_type="LV"
)
When to use:
  • Site assessment studies
  • Turbulence load calculations
  • Due diligence evaluations

Validation Workflow

1

Run Adjustment

First, complete your turbulence adjustment:
from tact import TACT
from tact.utils.load_data import load_data
from tact.utils.setup_processors import setup_processors

data = load_data("data.csv")
bp, tp, sp = setup_processors("config.json")
data = bp.process(tp.process(data))

tact = TACT()
results = tact.adjust(data, "ss-sf", {"split": True, "config_path": "config.json"})
2

Run Validation

Validate the adjusted results:
from tact.validation import validate_dnv_rp0661

validation = validate_dnv_rp0661(
    adjusted_data=results["adjusted_data"],
    reference_col="ref_ti",
    adjusted_col="adjTI_RSD_TI",
    wind_speed_col="ref_ws",
    bin_col="bins",
    criteria_type="LV"
)
3

Check Results

Review overall and per-bin validation:
# Overall metrics
print("Overall Validation:")
print(validation['overall'])

# Per-bin details
print("\nPer-Bin Validation:")
print(validation['by_bin'])
4

Generate Plots

Create professional validation visualizations:
from tact.visualization import plot_dnv_validation

plot_dnv_validation(
    validation_results=validation,
    adjusted_data=results["adjusted_data"],
    reference_col="ref_ti",
    adjusted_col="adjTI_RSD_TI",
    unadjusted_col="rsd_ti",
    wind_speed_col="ref_ws",
    bin_col="bins",
    method_name="SS-SF",
    output_dir="output/plots"
)

Validation Output

Overall Metrics

The validation['overall'] DataFrame contains:
MetricDescriptionTarget (LV)
MRBE_%Mean Relative Bias Error≤ 5%
RRMSE_%Relative Root Mean Square Error≤ 15%
passWhether criteria are metTrue
NNumber of observations-

Per-Bin Metrics

The validation['by_bin'] DataFrame shows results for each wind speed bin:
# Example output
   bin  N  MRBE_%  RRMSE_%  pass
0  4-5  120   3.2    12.1   True
1  5-6  245   4.1    13.5   True
2  6-7  312   2.8    11.2   True
...

Complete Example

from tact import TACT
from tact.utils.load_data import load_data
from tact.utils.setup_processors import setup_processors
from tact.validation import validate_dnv_rp0661
from tact.visualization import plot_dnv_validation

# 1. Load and process
data = load_data("data.csv")
bp, tp, sp = setup_processors("config.json")
data = bp.process(tp.process(data))

# 2. Run adjustment
tact = TACT()
results = tact.adjust(data, "ss-sf", {"split": True, "config_path": "config.json"})

# 3. Validate
validation = validate_dnv_rp0661(
    adjusted_data=results["adjusted_data"],
    reference_col="ref_ti",
    adjusted_col="adjTI_RSD_TI",
    wind_speed_col="ref_ws",
    bin_col="bins",
    criteria_type="LV"
)

# 4. Print results
overall = validation['overall']
print(f"\n{'='*50}")
print(f"DNV RP-0661 LV Validation Results")
print(f"{'='*50}")
print(f"MRBE:  {overall['MRBE_%'].iloc[0]:6.2f}% (target: ≤5%)")
print(f"RRMSE: {overall['RRMSE_%'].iloc[0]:6.2f}% (target: ≤15%)")
print(f"Pass:  {overall['pass'].iloc[0]}")
print(f"N:     {overall['N'].iloc[0]}")
print(f"{'='*50}\n")

# 5. Generate plots
plot_dnv_validation(
    validation_results=validation,
    adjusted_data=results["adjusted_data"],
    reference_col="ref_ti",
    adjusted_col="adjTI_RSD_TI",
    unadjusted_col="rsd_ti",
    wind_speed_col="ref_ws",
    bin_col="bins",
    method_name="SS-SF",
    output_dir="output/plots"
)
print("Validation plots saved to output/plots/")

# 6. Save validation results
validation['overall'].to_csv("validation_overall.csv", index=False)
validation['by_bin'].to_csv("validation_per_bin.csv", index=False)

Visualization

The plot_dnv_validation function generates:
  • Before vs after adjustment comparison
  • 1:1 reference line
  • Regression fit line
  • R² correlation coefficient
  • MRBE and RRMSE per wind speed bin
  • Acceptance criteria threshold lines
  • Pass/fail indication by color
  • Residual plots
  • Bias distribution
  • Error by wind speed bin

Interpreting Results

Both MRBE and RRMSE meet criteria
MRBE:  3.21% (target: ≤5%)   ✅
RRMSE: 12.45% (target: ≤15%) ✅
Pass: True
What this means:
  • Adjustment is successful
  • Results meet DNV standards
  • Data suitable for its intended use
Next steps:
  • Generate final report
  • Save validated results
  • Proceed with site assessment

Next Steps