Rufineer v0.43.0
Account
Browse the docs

Example 8 of 13

Oriole solar and storage, Mozambique

Based on oriole-solar-storage-model.xlsm

A 50 MWp build-out in three phases, the first with 7.5 MW of battery storage. Each phase has its own financial close, S-curve, tranches and returns, copied across three model sheets. A state utility holds a carried 5%, and a Parallel Model sheet uses a VBA function to size debt without a circular reference. Design example: written in the full v0.5 language. The compiler builds the working core today, so this one doesn't compile yet. Source: examples/design/oriole/.

Workbook
14 sheets: three copies of a 450-row phase model, a Parallel Model driven by a VBA function, EPC quotes in English and Chinese
Timeline
Rulers from Jan 2019, monthly until phase 1 COD (Aug 2021), six-monthly after; phases reach FC Aug 2020, Aug 2021 and Aug 2022
Plant
15 + 15 + 20 MWp single-axis tracking, P50 1,902 kWh/kWp; phase 1 adds 7.5 MW / 30 MWh of storage
Capital
Phase 1 EPC USD 29.1m (USD 1,940/kW with storage); 40% of equity up front, then pro rata; senior debt 75%
Debt
Three senior tranches and a mezzanine: 16 to 22 years, 6.5% to 8.5% all-in, 1% commitment, 1.25% front-end, 360-day interest
Rebuild shown
6 files, 181 lines

Where each sheet goes

Workbook sheetsRufineer
Inputs (timing, operations, capex, opex, PPA, tax, financing for three phases)inputs.rfn, and sheets of oriole_inputs.xlsx keyed by stage
Phase 1 Model, Phase 2 Model, Phase 3 Modelone module for s in stages: three sheets from one source
Parallel Model (VBA user-defined function)one solve per stage; debt sizing written as ordinary lines
Summarythe dashboard with a column per stage
Scenarios, No Tracking, Two Axis Tracking, Performance Ratio, Yield Back-upthe Tracking sheet and a yield_case option
EPC Proposal, EPC Backupthe EPC sheet, one column per stage

Source 6 files shown, 181 lines

model.rfn
model "Oriole Solar and Storage, Mozambique" {
  currency   USD
  display    thousands
  day_count  act/360                  // every tranche accrues on 360 days
  data       "oriole_inputs.xlsx"
}

list stages = inputs.stages.rows      // phase_1, phase_2, phase_3

timeline {
  start   2019-01-01
  step    month until operations[phase_1].start, then half
  for s in stages {
    construction[s]  from inputs.stages[s].financial_close for inputs.stages[s].build
    operations[s]    inputs.stages[s].life
  }
}

What this model needed from the language

  • Stages. Three phases with their own dates become construction[s] and operations[s], and one module for s in stages replaces three hand-copied 450-row sheets.
  • A switch point in the ruler. Monthly until the first phase starts operating, six-monthly after: step month until operations[phase_1].start, then half.
  • Tranches from a table. Senior 1, 2 and 3 and the mezzanine loan are rows of one sheet. The loop builds a loan per row, each with its own repayment profile and political risk cover.
  • Up-front equity, then pro rata. first … then pro_rata { … } in the funding block.
  • A carried partner. split with carried gives EDM 5% of distributions while the main investor funds everything, which is why its IRR sits below the overall equity IRR.
  • A beta S-curve. The workbook's alpha and beta inputs become profile: beta(9, 2).
  • No VBA. The Parallel Model sheet's user-defined function becomes one visible solve per phase.