1 package com.billkuker.rocketry.motorsim.io;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.text.DecimalFormat;
8 import java.text.NumberFormat;
10 import javax.measure.quantity.Duration;
11 import javax.measure.quantity.Force;
12 import javax.measure.quantity.Mass;
13 import javax.measure.unit.SI;
15 import org.jscience.physics.amount.Amount;
17 import com.billkuker.rocketry.motorsim.Burn;
18 import com.billkuker.rocketry.motorsim.GraphSimplifier;
19 import com.billkuker.rocketry.motorsim.ICylindricalChamber;
21 public class ENGExporter {
23 public static void export(Iterable<Burn> bb, File f) throws IOException {
24 export(bb, new FileOutputStream(f));
27 public static void export(Iterable<Burn> bb, OutputStream os) throws IOException {
33 public static void export(Burn b, OutputStream os) throws IOException {
35 ICylindricalChamber cha = (ICylindricalChamber) b.getMotor().getChamber();
37 NumberFormat nf = new DecimalFormat("0.####");
39 StringBuffer out = new StringBuffer();
41 out.append(";Output from Motorsim, motorsim@billkuker.com\n");
42 out.append(";You must fill in Delays and Total Weight\n");
43 out.append(";Name Diameter Length Delays ProWt Wt Manufacturer\n");
44 out.append(b.getMotor().getName().replace(" ", "-") + " ");
46 double dia = cha.getOD().doubleValue(SI.MILLIMETER);
47 double len = cha.getLength().doubleValue(SI.MILLIMETER);
49 Amount<Mass> prop = b.getMotor().getGrain().volume(
50 Amount.valueOf(0, SI.MILLIMETER)).times(
51 b.getMotor().getFuel().getIdealDensity().times(
52 b.getMotor().getFuel().getDensityRatio())).to(
54 double wt = prop.doubleValue(SI.KILOGRAM);
56 out.append(nf.format(dia) + " " + nf.format(len) + " 0-0-0 "
57 + nf.format(wt) + " " + nf.format(wt + 0.1) + " MF\n");
59 GraphSimplifier<Duration, Force> gs = null;
61 gs = new GraphSimplifier<Duration, Force>(b, "thrust", b.getData()
62 .keySet().iterator());
63 } catch (Exception e) {
69 for (Amount<Duration> t : gs.getDomain()) {
71 double thrust = gs.value(t).doubleValue(SI.NEWTON);
72 if (cnt < 10 && thrust == 0.0) {
73 continue; // This is a hack to ignore 0 thrust early in burn
76 out.append(nf.format(t.doubleValue(SI.SECOND)));
78 out.append(nf.format(thrust));
83 os.write(out.toString().getBytes());