TEST QUOTE FORM

 

table {
width: 100%;
border-collapse: collapse;
margin-top: 1em;
}
th, td {
border: 1px solid #ccc;
padding: 8px;
text-align: center;
}
th {
background: #5b9bd5;
color: white;
}
input[type=”number”] {
width: 80px;
}
tr.group-header td {
background: #fff2cc;
font-weight: bold;
text-align: left;
}

 

Compute Charges Estimator – estimate and output as pdf (confirmation needed with ICDS)

ICDS Services Quote – CY25
PI: Start
End
Service / Resources Academic Prices* (incur F&A)** Credit price: $
COMPUTE CREDITS Conversion Multiplier Cores / Job Hours / Job # of Jobs # Hours Required Unit Cost / Hr PI Cost ($) Credits Required
RC Basic Compute 0 0 0 0 0
RC Standard Compute 0 0 0 0 0
RC High Memory Cores 0 0 0 0 0
RC P100 Single GPU (ADD std cores) 0 0 0 0 0
RC A100 Single GPU (per card) (ADD std cores) 0 0 0 0 0
Half A100 GPU Card (per 1/2 card) (ADD std cores) 0 0 0 0 0
Multi-Instance A100 GPU Slice (ADD std cores) 0 0 0 0 0
RC GPU A40 (ADD std cores) 0 0 0 0 0
RC GPU V100 (ADD std cores) 0 0 0 0 0
TOTAL PI Funds $0.00

const compute_credit_price = 1.81;

function updateComputeCredits() {
const Conversion_mult = {
“RC Basic Compute”: 1.0,
“RC Standard Compute”: 1.86,
“RC High Memory Cores”: 3.24,
“RC P100 Single GPU (ADD std cores)”: 6.25,
“RC A100 Single GPU (per card) (ADD std cores)”: 62.5,
“Half A100 GPU Card (per 1/2 card) (ADD std cores)”: 31.23,
“Multi-Instance A100 GPU Slice (ADD std cores)”: 8.92,
“RC GPU A40 (ADD std cores)”: 73.33,
“RC GPU V100 (ADD std cores)”: 31.63,
};
const rows = document.querySelectorAll(“#compute-credits tr”);
rows.forEach(row => {
const labelCell = row.querySelector(“td”);
if (!labelCell) return;
const label = labelCell.textContent.trim();

const cores = parseFloat(row.querySelector(“.cores”)?.value) || 0;
const hours = parseFloat(row.querySelector(“.hours”)?.value) || 0;
const jobs = parseFloat(row.querySelector(“.jobs”)?.value) || 0;
const multiplier = Conversion_mult[label] || 0;

const totalHours = cores * hours * jobs;
const unitCostPerHour = (compute_credit_price * multiplier) / (30 * 24);
const piCost = unitCostPerHour * totalHours;
const credits = piCost / compute_credit_price;

row.querySelector(“.conversion_mult”).innerText = multiplier.toFixed(2);
row.querySelector(“.total_hours”).innerText = totalHours.toFixed(2);
row.querySelector(“.unit_cost”).innerText = unitCostPerHour.toFixed(4);
row.querySelector(“.pi_cost”).innerText = piCost.toFixed(2);
row.querySelector(“.credits”).innerText = credits.toFixed(2);
});
}

function updateAllCosts() {
updateComputeCredits();

}

document.querySelectorAll(“input”).forEach(input => {
input.addEventListener(“input”, updateAllCosts);
});
window.addEventListener(“DOMContentLoaded”, () => {
document.getElementById(“credit_price_display”).innerText = compute_credit_price.toFixed(2);
updateAllCosts();
});