159 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			V
		
	
	
module args
 | 
						|
 | 
						|
import flag
 | 
						|
import os
 | 
						|
import runtime
 | 
						|
import sim
 | 
						|
import math
 | 
						|
 | 
						|
// customisable through setting VJOBS
 | 
						|
const max_parallel_workers = runtime.nr_jobs()
 | 
						|
 | 
						|
[params]
 | 
						|
pub struct ParserSettings {
 | 
						|
	sequential    bool
 | 
						|
	img           bool
 | 
						|
	extra_workers int
 | 
						|
}
 | 
						|
 | 
						|
pub struct SequentialArgs {
 | 
						|
pub:
 | 
						|
	params   sim.SimParams
 | 
						|
	grid     sim.GridSettings
 | 
						|
	filename string
 | 
						|
}
 | 
						|
 | 
						|
pub struct ParallelArgs {
 | 
						|
	SequentialArgs
 | 
						|
pub:
 | 
						|
	workers int = args.max_parallel_workers
 | 
						|
}
 | 
						|
 | 
						|
pub type SimArgs = ParallelArgs | SequentialArgs
 | 
						|
 | 
						|
pub fn parse_args(config ParserSettings) ?SimArgs {
 | 
						|
	if config.sequential {
 | 
						|
		args := parse_sequential_args() ?
 | 
						|
		return SimArgs(args)
 | 
						|
	} else {
 | 
						|
		args := parse_parallel_args(config.extra_workers) ?
 | 
						|
		return SimArgs(args)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
fn parse_sequential_args() ?SequentialArgs {
 | 
						|
	mut fp := flag.new_flag_parser(os.args)
 | 
						|
	fp.application('vps')
 | 
						|
	fp.version('v0.1.0')
 | 
						|
	fp.limit_free_args(0, 0) ?
 | 
						|
	fp.description('This is a pendulum simulation written in pure V')
 | 
						|
	fp.skip_executable()
 | 
						|
 | 
						|
	// output parameters
 | 
						|
	width := fp.int('width', `w`, sim.default_width, 'width of the image output. Defaults to $sim.default_width')
 | 
						|
	height := fp.int('height', `h`, sim.default_height, 'height of the image output. Defaults to $sim.default_height')
 | 
						|
	filename := fp.string('output', `o`, 'out.ppm', 'name of the image output. Defaults to out.ppm')
 | 
						|
 | 
						|
	// simulation parameters
 | 
						|
	rope_length := fp.float('rope-length', 0, sim.default_rope_length, 'rope length to use on simulation. Defaults to $sim.default_rope_length')
 | 
						|
	bearing_mass := fp.float('bearing-mass', 0, sim.default_bearing_mass, 'bearing mass to use on simulation. Defaults to $sim.default_bearing_mass')
 | 
						|
	magnet_spacing := fp.float('magnet-spacing', 0, sim.default_magnet_spacing, 'magnet spacing to use on simulation. Defaults to $sim.default_magnet_spacing')
 | 
						|
	magnet_height := fp.float('magnet-height', 0, sim.default_magnet_height, 'magnet height to use on simulation. Defaults to $sim.default_magnet_height')
 | 
						|
	magnet_strength := fp.float('magnet-strength', 0, sim.default_magnet_strength, 'magnet strength to use on simulation. Defaults to $sim.default_magnet_strength')
 | 
						|
	gravity := fp.float('gravity', 0, sim.default_gravity, 'gravity to use on simulation. Defaults to $sim.default_gravity')
 | 
						|
 | 
						|
	fp.finalize() or {
 | 
						|
		println(fp.usage())
 | 
						|
		return none
 | 
						|
	}
 | 
						|
 | 
						|
	params := sim.sim_params(
 | 
						|
		rope_length: rope_length
 | 
						|
		bearing_mass: bearing_mass
 | 
						|
		magnet_spacing: magnet_spacing
 | 
						|
		magnet_height: magnet_height
 | 
						|
		magnet_strength: magnet_strength
 | 
						|
		gravity: gravity
 | 
						|
	)
 | 
						|
 | 
						|
	grid := sim.new_grid_settings(
 | 
						|
		width: width
 | 
						|
		height: height
 | 
						|
	)
 | 
						|
 | 
						|
	args := SequentialArgs{
 | 
						|
		params: params
 | 
						|
		filename: filename
 | 
						|
		grid: grid
 | 
						|
	}
 | 
						|
 | 
						|
	sim.log('$args')
 | 
						|
 | 
						|
	return args
 | 
						|
}
 | 
						|
 | 
						|
fn parse_parallel_args(extra_workers int) ?ParallelArgs {
 | 
						|
	mut fp := flag.new_flag_parser(os.args)
 | 
						|
	fp.application('vps')
 | 
						|
	fp.version('v0.1.0')
 | 
						|
	fp.limit_free_args(0, 0) ?
 | 
						|
	fp.description('This is a pendulum simulation written in pure V')
 | 
						|
	fp.skip_executable()
 | 
						|
 | 
						|
	workers := fp.int('workers', 0, args.max_parallel_workers, 'amount of workers to use on simulation. Defaults to $args.max_parallel_workers')
 | 
						|
 | 
						|
	// output parameters
 | 
						|
	width := fp.int('width', `w`, sim.default_width, 'width of the image output. Defaults to $sim.default_width')
 | 
						|
	height := fp.int('height', `h`, sim.default_height, 'height of the image output. Defaults to $sim.default_height')
 | 
						|
	filename := fp.string('output', `o`, 'out.ppm', 'name of the image output. Defaults to out.ppm')
 | 
						|
 | 
						|
	// simulation parameters
 | 
						|
	rope_length := fp.float('rope-length', 0, sim.default_rope_length, 'rope length to use on simulation. Defaults to $sim.default_rope_length')
 | 
						|
	bearing_mass := fp.float('bearing-mass', 0, sim.default_bearing_mass, 'bearing mass to use on simulation. Defaults to $sim.default_bearing_mass')
 | 
						|
	magnet_spacing := fp.float('magnet-spacing', 0, sim.default_magnet_spacing, 'magnet spacing to use on simulation. Defaults to $sim.default_magnet_spacing')
 | 
						|
	magnet_height := fp.float('magnet-height', 0, sim.default_magnet_height, 'magnet height to use on simulation. Defaults to $sim.default_magnet_height')
 | 
						|
	magnet_strength := fp.float('magnet-strength', 0, sim.default_magnet_strength, 'magnet strength to use on simulation. Defaults to $sim.default_magnet_strength')
 | 
						|
	gravity := fp.float('gravity', 0, sim.default_gravity, 'gravity to use on simulation. Defaults to $sim.default_gravity')
 | 
						|
 | 
						|
	fp.finalize() or {
 | 
						|
		println(fp.usage())
 | 
						|
		return none
 | 
						|
	}
 | 
						|
 | 
						|
	params := sim.sim_params(
 | 
						|
		rope_length: rope_length
 | 
						|
		bearing_mass: bearing_mass
 | 
						|
		magnet_spacing: magnet_spacing
 | 
						|
		magnet_height: magnet_height
 | 
						|
		magnet_strength: magnet_strength
 | 
						|
		gravity: gravity
 | 
						|
	)
 | 
						|
 | 
						|
	grid := sim.new_grid_settings(
 | 
						|
		width: width
 | 
						|
		height: height
 | 
						|
	)
 | 
						|
 | 
						|
	args := ParallelArgs{
 | 
						|
		params: params
 | 
						|
		filename: filename
 | 
						|
		grid: grid
 | 
						|
		workers: get_workers(workers, extra_workers)
 | 
						|
	}
 | 
						|
 | 
						|
	sim.log('$args')
 | 
						|
 | 
						|
	return args
 | 
						|
}
 | 
						|
 | 
						|
[inline]
 | 
						|
fn get_workers(workers int, extra_workers int) int {
 | 
						|
	result := if workers + extra_workers <= args.max_parallel_workers {
 | 
						|
		workers
 | 
						|
	} else {
 | 
						|
		args.max_parallel_workers - extra_workers
 | 
						|
	}
 | 
						|
 | 
						|
	return math.max(1, result)
 | 
						|
}
 |