55 */
66import { CLASS } from "./class.js" ;
77import type { Config } from "./config.js" ;
8+ import { type FirePlume , calculatePlume } from "./fire.js" ;
89import {
910 type ClassOutput ,
1011 type OutputVariableKey ,
1112 outputVariables ,
1213} from "./output.js" ;
14+ import { type ClassProfile , generateProfiles } from "./profiles.js" ;
1315import { parse } from "./validate.js" ;
1416
17+ type ClassTimeSeries = Record < OutputVariableKey , number [ ] > ;
18+ type ClassProfiles = ClassProfile [ ] ;
19+ type ClassFirePlumes = FirePlume [ ] ;
20+ export type ClassData = [ ClassTimeSeries , ClassProfiles ?, ClassFirePlumes ?] ;
21+
1522/**
1623 * Runs the CLASS model with the given configuration and frequency.
1724 *
1825 * @param config - The configuration object for the CLASS model.
1926 * @param freq - The frequency in seconds at which to write output, defaults to 600.
2027 * @returns An object containing the output variables collected during the simulation.
2128 */
22- export function runClass ( config : Config , freq = 600 ) : ClassOutput {
29+ export function runClass ( config : Config , freq = 600 ) : ClassData {
2330 const validatedConfig = parse ( config ) ;
2431 const model = new CLASS ( validatedConfig ) ;
2532
26- const output_keys = Object . keys ( outputVariables ) as OutputVariableKey [ ] ;
33+ const outputKeys = Object . keys ( outputVariables ) as OutputVariableKey [ ] ;
2734
2835 const writeOutput = ( ) => {
29- for ( const key of output_keys ) {
36+ const output : Partial < ClassOutput > = { } ;
37+ for ( const key of outputKeys ) {
3038 const value = model . getValue ( key ) ;
3139 if ( value !== undefined ) {
32- ( output [ key ] as number [ ] ) . push ( value as number ) ;
40+ output [ key ] = model . getValue ( key ) ;
41+ timeSeries [ key ] . push ( value as number ) ;
42+ }
43+
44+ // Include profiles
45+ if ( config . sw_ml ) {
46+ const profile = generateProfiles ( config , output as ClassOutput ) ;
47+ profiles . push ( profile ) ;
48+
49+ // Include fireplumes
50+ if ( config . sw_fire ) {
51+ const plume = calculatePlume ( config , profile ) ;
52+ firePlumes . push ( plume ) ;
53+ }
3354 }
3455 }
3556 } ;
3657
37- const output = Object . fromEntries (
38- output_keys . map ( ( key ) => [ key , [ ] ] ) ,
39- ) as unknown as ClassOutput ;
58+ // Initialize output arrays
59+ const timeSeries = Object . fromEntries (
60+ outputKeys . map ( ( key ) => [ key , [ ] ] ) ,
61+ ) as unknown as ClassTimeSeries ;
62+ const profiles : ClassProfiles = [ ] ;
63+ const firePlumes : ClassFirePlumes = [ ] ;
4064
4165 // Initial time
4266 writeOutput ( ) ;
@@ -50,5 +74,12 @@ export function runClass(config: Config, freq = 600): ClassOutput {
5074 }
5175 }
5276
53- return output ;
54- }
77+ // Construct ClassData
78+ if ( config . sw_ml ) {
79+ if ( config . sw_fire ) {
80+ return [ timeSeries , profiles , firePlumes ] ;
81+ }
82+ return [ timeSeries , profiles ] ;
83+ }
84+ return [ timeSeries ] ;
85+ }
0 commit comments