This guide explains how to generate reference output from the original VOACAP FORTRAN implementation for validation testing.
DVOACAP-Python validation requires reference output from the original VOACAP engine. Test cases are defined in test_config.json, and we need to run each through VOACAP to generate baseline data.
| Test Case | Status | Reference File | Priority |
|---|---|---|---|
| ref_001_medium_path | ✓ Active | SampleIO/voacapx.out | Baseline |
| short_001_us_east | Pending | SampleIO/ref_short_001.out | High |
| short_002_europe | Pending | SampleIO/ref_short_002.out | Medium |
| medium_001_transatlantic | Pending | SampleIO/ref_medium_001.out | High |
| medium_002_us_japan | Pending | SampleIO/ref_medium_002.out | Medium |
| long_001_antipodal | Pending | SampleIO/ref_long_001.out | High |
| long_002_australia | Pending | SampleIO/ref_long_002.out | Medium |
| polar_001_arctic | Pending | SampleIO/ref_polar_001.out | Low |
| equatorial_001 | Pending | SampleIO/ref_equatorial_001.out | Medium |
| solar_min_001 | Pending | SampleIO/ref_solar_min_001.out | High |
| solar_max_001 | Pending | SampleIO/ref_solar_max_001.out | High |
- Windows PC or Wine on Linux/Mac
- VOACAPW.exe (in
reference/voacap_original/) - Input file generator
For test case short_001_us_east (Philadelphia → Boston):
LINEMAX 20
COEFFS CCIR
TIME 4 0 6 12 18 ! UTC hours to test
MONTH 3 3 ! March
SUNSPOT 100 100 ! SSN=100
LABEL Short Path: Philadelphia to Boston
CIRCUIT 1 Philly-Boston
TRANSMIT 39.95 -75.17 ! Philadelphia
RECEIVE 42.36 -71.06 ! Boston
SYSTEM 100 73 3.00 ! 100W, SNR requirement
FREQUENCY 5 3.5 7.0 14.0 21.0 28.0
FPROB 1.00 0.10 0.90 0.10 0.90
METHOD 30
EXECUTE
QUIT
Save as SampleIO/input_short_001.voa
On Windows:
cd reference\voacap_original
voacapw.exe ..\..\SampleIO\input_short_001.voaOn Linux with Wine:
cd reference/voacap_original
wine voacapw.exe ../../SampleIO/input_short_001.voaVOACAP will generate voacapx.out. Rename and move it:
mv voacapx.out ../../SampleIO/ref_short_001.outChange the test case status from "pending_reference" to "active":
{
"id": "short_001_us_east",
"status": "active"
}As an alternative, you can use the web-based VOACAP service:
- Visit http://www.voacap.com/prediction.html
- Enter parameters from test_config.json
- Run prediction
- Download output file
- Convert to voacapx.out format if needed
Create generate_voa_inputs.py:
#!/usr/bin/env python3
"""Generate VOACAP input files from test_config.json"""
import json
from pathlib import Path
def generate_voa_input(test_case):
"""Generate VOACAP .voa input file from test case config"""
tx = test_case['tx_location']
rx = test_case['rx_location']
# Format UTC hours
hours_str = ' '.join(str(h) for h in test_case['utc_hours'])
# Format frequencies
freqs_str = ' '.join(f"{f:.2f}" for f in test_case['frequencies_mhz'])
voa_content = f'''LINEMAX 20
COEFFS CCIR
TIME {len(test_case['utc_hours'])} {hours_str}
MONTH {test_case['month']} {test_case['month']}
SUNSPOT {test_case['ssn']} {test_case['ssn']}
LABEL {test_case['name']}
CIRCUIT 1 {test_case['id']}
TRANSMIT {tx['lat']:.2f} {tx['lon']:.2f}
RECEIVE {rx['lat']:.2f} {rx['lon']:.2f}
SYSTEM 100 73 3.00
FREQUENCY {len(test_case['frequencies_mhz'])} {freqs_str}
FPROB 1.00 0.10 0.90 0.10 0.90
METHOD 30
EXECUTE
QUIT
'''
return voa_content
def main():
# Load test config
with open('test_config.json') as f:
config = json.load(f)
# Generate input file for each pending test case
for tc in config['test_cases']:
if tc['status'] == 'pending_reference':
input_file = Path('SampleIO') / f"input_{tc['id']}.voa"
content = generate_voa_input(tc)
with open(input_file, 'w') as f:
f.write(content)
print(f"Generated: {input_file}")
if __name__ == '__main__':
main()Create run_all_voacap.sh:
#!/bin/bash
# Run VOACAP for all pending test cases
cd reference/voacap_original
for input in ../../SampleIO/input_*.voa; do
basename=$(basename "$input" .voa)
testid=${basename#input_}
echo "Running VOACAP for $testid..."
# Run VOACAP (adjust for Wine if needed)
./voacapw.exe "$input"
# Move output to correct location
if [ -f voacapx.out ]; then
mv voacapx.out "../../SampleIO/ref_${testid}.out"
echo " ✓ Generated ref_${testid}.out"
else
echo " ✗ Failed to generate output"
fi
done
cd ../..
echo "Done!"After generating a new reference file, validate it:
# Test specific case
python test_voacap_reference.py --test-id short_001_us_east
# Run all active tests
python test_voacap_reference.py --allBased on NEXT_STEPS.md goals, generate in this order:
- short_001_us_east - Short path validation
- long_001_antipodal - Long path validation
- medium_001_transatlantic - Additional medium path
- solar_min_001 - Low solar activity
- solar_max_001 - High solar activity
- medium_002_us_japan
- long_002_australia
- equatorial_001
- short_002_europe
- polar_001_arctic
Once all reference files are generated:
- 11 test cases covering diverse propagation scenarios
- ~400-500 total comparisons (frequencies × hours × test cases)
- Target: >80% pass rate across all tests
- Excellent: >90% pass rate
- Ensure all coefficient files (CCIR*.BIN) are in same directory
- Check that voacap.dat configuration file exists
- Try running with Wine if on Linux/Mac
- Original VOACAP output format may vary by version
- May need to update VoacapReferenceParser in test_voacap_reference.py
- Check that voacapx.out contains all required metrics (SNR, REL, MODE, etc.)
- Verify input parameters match test_config.json exactly
- Check VOACAP version (should be VOACAPW v15 or later)
- Ensure CCIR coefficient files are correct version
If you don't have access to run VOACAP locally:
-
VOACAP Online Services:
-
Ham Radio Tools:
- VOACAP GUI tools (Windows)
- PropNET (has VOACAP backend)
-
Contact Authors:
- Request help from VOACAP community
- Amateur radio propagation groups
- Original VOACAP manual:
docs/Original_VOACAP_Manual.pdf - Input file format: VOACAP documentation Chapter 3
- Output file format: VOACAP documentation Chapter 5
Note: Once reference files are generated, update test_config.json to mark tests as "active" so they run automatically in CI/CD.