test(validation): Added validation suite
Added the framework and some basic tests for a validation suite which automatically tests against pynucastro results
This commit is contained in:
77
validation/vv/logger.py
Normal file
77
validation/vv/logger.py
Normal file
@@ -0,0 +1,77 @@
|
||||
from enum import Enum
|
||||
|
||||
from typing import Dict, List, Any, SupportsFloat
|
||||
import json
|
||||
from datetime import datetime
|
||||
import os
|
||||
import sys
|
||||
|
||||
from gridfire.solver import CVODETimestepContext
|
||||
import gridfire
|
||||
|
||||
class LogEntries(Enum):
|
||||
Step = "Step"
|
||||
t = "t"
|
||||
dt = "dt"
|
||||
eps = "eps"
|
||||
Composition = "Composition"
|
||||
ReactionContributions = "ReactionContributions"
|
||||
|
||||
|
||||
class StepLogger:
|
||||
def __init__(self):
|
||||
self.num_steps : int = 0
|
||||
self.steps : List[Dict[LogEntries, Any]] = []
|
||||
|
||||
def log_step(self, ctx : CVODETimestepContext):
|
||||
comp_data: Dict[str, SupportsFloat] = {}
|
||||
for species in ctx.engine.getNetworkSpecies():
|
||||
sid = ctx.engine.getSpeciesIndex(species)
|
||||
comp_data[species.name()] = ctx.state[sid]
|
||||
entry : Dict[LogEntries, Any] = {
|
||||
LogEntries.Step: ctx.num_steps,
|
||||
LogEntries.t: ctx.t,
|
||||
LogEntries.dt: ctx.dt,
|
||||
LogEntries.Composition: comp_data,
|
||||
}
|
||||
self.steps.append(entry)
|
||||
self.num_steps += 1
|
||||
|
||||
def to_json(self, filename: str, **kwargs):
|
||||
serializable_steps : List[Dict[str, Any]] = [
|
||||
{
|
||||
LogEntries.Step.value: step[LogEntries.Step],
|
||||
LogEntries.t.value: step[LogEntries.t],
|
||||
LogEntries.dt.value: step[LogEntries.dt],
|
||||
LogEntries.Composition.value: step[LogEntries.Composition],
|
||||
}
|
||||
for step in self.steps
|
||||
]
|
||||
out_data : Dict[str, Any] = {
|
||||
"Metadata": {
|
||||
"NumSteps": self.num_steps,
|
||||
**kwargs,
|
||||
"DateCreated": datetime.now().isoformat(),
|
||||
"GridFireVersion": gridfire.__version__,
|
||||
"Author": "Emily M. Boudreaux",
|
||||
"OS": os.uname().sysname,
|
||||
"ClangVersion": os.popen("clang --version").read().strip(),
|
||||
"GccVersion": os.popen("gcc --version").read().strip(),
|
||||
"PythonVersion": sys.version,
|
||||
},
|
||||
"Steps": serializable_steps
|
||||
}
|
||||
with open(filename, 'w') as f:
|
||||
json.dump(out_data, f, indent=4)
|
||||
|
||||
|
||||
def summary(self) -> Dict[str, Any]:
|
||||
if not self.steps:
|
||||
return {}
|
||||
final_step = self.steps[-1]
|
||||
summary_data : Dict[str, Any] = {
|
||||
"TotalSteps": self.num_steps,
|
||||
"FinalTime": final_step[LogEntries.t],
|
||||
"FinalComposition": final_step[LogEntries.Composition],
|
||||
}
|
||||
return summary_data
|
||||
Reference in New Issue
Block a user