diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/atragmx.c | 137 | ||||
| -rw-r--r-- | src/ballistics.c | 38 | ||||
| -rw-r--r-- | src/main.c | 2 |
3 files changed, 177 insertions, 0 deletions
diff --git a/src/atragmx.c b/src/atragmx.c new file mode 100644 index 0000000..af68b2c --- /dev/null +++ b/src/atragmx.c @@ -0,0 +1,137 @@ +#include <stdlib.h> +#include <stdio.h> +#include <math.h> +#include <string.h> + +#include "ballistics.h" +#include "constants.h" +#include "atragmx.h" +#include "ace.h" + +ATragMXSolution *ATragMXCalcSolution(ATragMXContext *ctx, ace_config *ace) { + + // + // init section + // + + ATragMXSolution *sln = NULL; + + if ((sln = calloc(1, sizeof(ATragMXSolution))) == NULL) { + perror("ATragMXSolution: malloc failed"); + return NULL; + } + + // local data + + struct { + double speed1; + double speed2; + } wind = { + .speed1 = ctx->atmosphere.wind_speed[0], + .speed2 = ctx->atmosphere.wind_speed[1], + }; + + struct { + double tx; + double tz; + double last_pos[3]; + double pos[3]; + double velocity[3]; + double accel[3]; + double speed; + double gravity[3]; + double deltaT; + } bullet = { + .gravity = { + [0] = 0.0, + [1] = sin(ctx->gun.scope_angle + ctx->target.inclination_angle) + * -GRAVITY, + [2] = cos(ctx->gun.scope_angle + ctx->target.inclination_angle) + * -GRAVITY + }, + .deltaT = 1.0 / ctx->sim_steps, + }; + + struct { + double elevation; + Windage windage; + double lead; + double time_of_flight; + double true_velocity[3]; + double true_speed; + double v_coriolis; + double v_coriolis_deflection; + double h_coriolis; + double h_coriolis_deflection; + double spin_drift; + double spin_deflection; + } local_solution = {0}; + + struct { + double range; + double true_range; + double range_factor; + double *range_card; + } ctx_range = { + .range_factor = ctx->store_range_card ? 1.0936133 : 1, + .range_card = NULL, + }; + + double wind1[3] = { + [0] = cos(270 - ctx->atmosphere.wind_dir * 30) + * ctx->atmosphere.wind_speed[0], + [1] = sin(270 - ctx->atmosphere.wind_dir * 30) + * ctx->atmosphere.wind_speed[0], + [2] = 0 + }; + + double wind2[3] = { + [0] = cos(270 - ctx->atmosphere.wind_dir * 30) + * ctx->atmosphere.wind_speed[1], + [1] = sin(270 - ctx->atmosphere.wind_dir * 30) + * ctx->atmosphere.wind_speed[1], + [2] = 0 + }; + + double wind_drift = 0.0; + + if (ace->ballistics->enabled) + ctx->gun.ballistic_coef + = atmospheric_correction( + ctx->gun.ballistic_coef, + ctx->atmosphere.temperature, + ctx->atmosphere.barometric_pressure, + ctx->atmosphere.relative_humidity, + ctx->atmosphere.atmosphere_model); + + double eoetvoes_multiplier = 0.0; + if (ace->ballistics->enabled) { + eoetvoes_multiplier = 2 + * (0.0000729 * ctx->gun.muzzle_velocity / -GRAVITY) + * cos(ctx->target.latitude) + * sin(ctx->target.direction); + } + + memcpy(bullet.pos, + (double[3]){0.0, + 0.0, + -(ctx->gun.bore_height / 100.0)}, + sizeof(bullet.pos)); + + memcpy(bullet.velocity, + (double[3]){0.0, + cos(ctx->gun.scope_angle) * ctx->gun.muzzle_velocity, + sin(ctx->gun.scope_angle) * ctx->gun.muzzle_velocity}, + sizeof(bullet.pos)); + + while (local_solution.time_of_flight < 15 + && bullet.pos[1] < ctx->target.range) { + // calculate magnitude of bullet.velocity + bullet.speed = hypot(bullet.velocity[0], + hypot(bullet.velocity[1], bullet.velocity[2])); + + + } + + return sln; +} diff --git a/src/ballistics.c b/src/ballistics.c new file mode 100644 index 0000000..10d97da --- /dev/null +++ b/src/ballistics.c @@ -0,0 +1,38 @@ +#include <math.h> + +#include "ballistics.h" +#include "constants.h" +#include "context.h" + +double atmospheric_correction(double ballistic_coefficient, + double temperature, + double pressure, + double relative_humidity, + AtmosphereModel atmosphere_model) { + double air_density = calculate_air_density(temperature, pressure, relative_humidity); + + if (atmosphere_model == ICAO) + return (STD_AIR_DENSITY_ICAO / air_density) * ballistic_coefficient; + else + return (STD_AIR_DENSITY_ASM / air_density) * ballistic_coefficient; +} + +double calculate_air_density(double temperature, + double pressure, + double relative_humidity) { + pressure = pressure * 100; + + if (relative_humidity > 0.0) { + double p_sat = 610.78 * pow(10, (7.5 * temperature - 273.15) / + (temperature - 273.15 + 237.3)); + double vapor_pressure = relative_humidity * p_sat; + double partial_pressure = pressure - vapor_pressure; + + return fma(partial_pressure, + DRY_AIR_MOLAR_MASS, + vapor_pressure * WATOR_VAPOR_MOLAR_MASS) + / (UNIVERSAL_GAS_CONSTANT * temperature); + } + else + return pressure / (SPECIFIC_GAST_CONSTANT_DRY_AIR * temperature); +} @@ -2,7 +2,9 @@ #include <stdlib.h> #include "context.h" +#include "atragmx.h" int main(int argc, char** argv) { printf("Hello, %s\n", argv[0]); + exit(EXIT_SUCCESS); } |
