<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
    <debug>true</debug>

    <!-- Some filters are useful when tuning the parameters, but not needed in
         production aircraft. They're tagged DEVELOP and disabled by default. -->

    <!-- limit time step -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/delta-sec</output>
        <input>
            <property>/sim/time/delta-sec</property>
        </input>
        <max>0.05</max>
    </filter>

    <!-- fuselage z (up) acceleration in m/s^2
         we get -g in unaccelerated flight, and large negative numbers on touchdown -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/a-fuselage-mps2</output>
        <input>
            <expression>
                <product>
                    <property>/accelerations/pilot/z-accel-fps_sec</property>
                    <value>0.3048</value> <!-- FT2M -->
                </product>
            </expression>
        </input>
    </filter>

    <!-- compute k and d -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/k</output>
        <input>
            <expression>
                <product>
                    <property>/sim/systems/wingflexer/params/K</property>
                    <property>/sim/systems/wingflexer/params/m-wing-dry-kg</property>
                </product>
            </expression>
        </input>
    </filter>

    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/d</output>
        <input>
            <expression>
                <product>
                    <property>/sim/systems/wingflexer/params/D</property>
                    <property>/sim/systems/wingflexer/params/m-wing-dry-kg</property>
                </product>
            </expression>
        </input>
    </filter>


    <!-- lift force. Convert to N and use 1/2 (one wing only) -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/f-lift-N</output>
        <input>
            <expression>
                <product>
                    <property>/sim/systems/wingflexer/params/lift-node-lbs</property>
                    <product>
                        <property>/environment/gravitational-acceleration-mps2</property>
                        <value>0.226796</value> <!-- LB2KG / 2-->
                    </product>
                </product>
            </expression>
        </input>
    </filter>

    <!-- z_ofs = g * mass_dry_kg / k -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/z-ofs-m</output>
        <input>
            <expression>
                <div>
                    <product>
                        <property>/environment/gravitational-acceleration-mps2</property>
                        <property>/sim/systems/wingflexer/params/m-wing-dry-kg</property>
                    </product>
                    <property>/sim/systems/wingflexer/k</property>
                </div>
            </expression>
        </input>
    </filter>

    <!--
    compute total mass of one wing, using the average fuel mass in all wing tanks.
    The weighting factor should be lumped into fuel_frac.
      mass = mass_dry_kg + fuel_frac * sum_i (fuel_node_i_kg)
    -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/m-wing-kg</output>
        <input>
            <expression>
                <sum>
                    <property>/sim/systems/wingflexer/params/m-wing-dry-kg</property>
                    <product>
                        <property>/sim/systems/wingflexer/params/fuel-frac</property>
                        <sum>
                            <property>/sim/systems/wingflexer/params/fuel-node-1-kg</property>
                            <property>/sim/systems/wingflexer/params/fuel-node-2-kg</property>
                            <property>/sim/systems/wingflexer/params/fuel-node-3-kg</property>
                            <property>/sim/systems/wingflexer/params/fuel-node-4-kg</property>
                        </sum>
                    </product>
                </sum>
            </expression>
        </input>
    </filter>

    <!-- integrate the ODE -->
    <filter>
        <type>damped-oscillation</type>
	<output>/sim/systems/wingflexer/z-raw-m</output>
        <a>
	    <expression>
                <div>
		      <property>/sim/systems/wingflexer/d</property>
		      <property>/sim/systems/wingflexer/m-wing-kg</property>
                </div>
            </expression>
	</a>
        <b>
	    <expression>
                <div>
		      <property>/sim/systems/wingflexer/k</property>
		      <property>/sim/systems/wingflexer/m-wing-kg</property>
                </div>
            </expression>
	</b>
        <c>
	    <expression>
		<difference>
		    <div>
			<property>/sim/systems/wingflexer/f-lift-N</property>
			<property>/sim/systems/wingflexer/m-wing-kg</property>
		    </div>
		    <property>/sim/systems/wingflexer/a-fuselage-mps2</property>
		</difference>
            </expression>
	</c>
        <!-- DEVELOP: initialize the wing's vertical velocity to a given value,
                      overriding all previous computations -->
	<input>
            <expression>
                <product>
                    <property>/sim/systems/wingflexer/sink-rate-fps</property>
                    <value>0.3048</value> <!-- feet to meters -->
                </product>
            </expression>
        </input>
    </filter>

    <filter>
        <type>gain</type>
        <output>/sim/systems/wingflexer/z-m</output>
        <!--<gain>1.</gain> -->
        <!-- DEVELOP: scaled output. For production aircraft, this should be done in
                    the model animation. -->
        <gain><property>/sim/systems/wingflexer/params/z-fac</property></gain>
        
	<input>
            <expression>
                <sum>
                    <property>/sim/systems/wingflexer/z-raw-m</property>
                    <property>/sim/systems/wingflexer/z-ofs-m</property>
                </sum>
            </expression>
        </input>
    </filter>

    <!-- DEVELOP: reset sink rate -->
    <filter>
        <type>gain</type>
        <gain>0.</gain>
        <output>/sim/systems/wingflexer/sink-rate-fps</output>
    </filter>
    
    <!-- DEVELOP: log max z-m -->
    <filter>
        <type>gain</type>
        <gain>1.</gain>
        <output>/sim/systems/wingflexer/z-max-m</output>
        <input>
            <expression>
                <max>
                    <property>/sim/systems/wingflexer/z-max-m</property>
                    <abs>
                        <property>/sim/systems/wingflexer/z-m</property>
                    </abs>
                </max>
            </expression>
        </input>
    </filter>

</PropertyList>