def testDebugLvl(self): fdm = CreateFDM(self.sandbox) fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml')) fdm.run_ic() ExecuteUntil(fdm, 1000.) ref = pd.read_csv('BallOut.csv', index_col=0) del fdm os.environ["JSBSIM_DEBUG"] = str(0) fdm = CreateFDM(self.sandbox) fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml')) fdm.run_ic() ExecuteUntil(fdm, 1000.) current = pd.read_csv('BallOut.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-8 between the # two data sets. diff = FindDifferences(ref, current, 1E-8) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
def test_model_loading(self): self.longMessage = True self.BuildReference('c1724.xml') output_ref = pd.read_csv('JSBout172B.csv', index_col=0) self.ProcessAndCompare('aerodynamics') self.ProcessAndCompare('autopilot') self.ProcessAndCompare('flight_control') self.ProcessAndCompare('ground_reactions') self.ProcessAndCompare('mass_balance') self.ProcessAndCompare('metrics') self.ProcessAndCompare('propulsion') self.ProcessAndCompare('system') # The <output> section needs special handling. In addition to the check # conducted by ProcessAndCompare with a directive file, we need to # verify that the <output> tag has been correctly executed by JSBSim. # In the case of the script c1724.xml, this means that the data output # in JSBout172B.csv is the same between the reference 'output_ref' and # the result 'mod' below where the <output> tag was moved in a separate # file. self.ProcessAndCompare('output') mod = pd.read_csv('JSBout172B.csv', index_col=0) self.assertTrue(isDataMatching(output_ref, mod)) diff = FindDifferences(output_ref, mod, 0.0) self.assertEqual(len(diff), 0, msg='\nTesting section "output"\n' + diff.to_string()) self.BuildReference('weather-balloon.xml') self.ProcessAndCompare('buoyant_forces') self.BuildReference('Concorde_runway_test.xml') self.ProcessAndCompare('external_reactions')
def test_gust_reset(self): fdm = CreateFDM(self.sandbox) fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'c172_cruise_8K.xml')) fdm['simulation/randomseed'] = 0.0 fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.run_ic() ExecuteUntil(fdm, 15.5) ref = pd.read_csv('output.csv', index_col=0) fdm['simulation/randomseed'] = 0.0 fdm.reset_to_initial_conditions(1) ExecuteUntil(fdm, 15.5) current = pd.read_csv('output_0.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-8 between the # two data sets. diff = FindDifferences(ref, current, 1E-8) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
def testDebugLvl(self): fdm = self.create_fdm() fdm.load_script( self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml')) fdm.run_ic() ExecuteUntil(fdm, 1000.) ref = pd.read_csv('BallOut.csv', index_col=0) os.environ["JSBSIM_DEBUG"] = str(0) fdm = self.create_fdm() fdm.load_script( self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml')) fdm.run_ic() ExecuteUntil(fdm, 1000.) current = pd.read_csv('BallOut.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-8 between the # two data sets. diff = FindDifferences(ref, current, 1E-8) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n' + diff.to_string())
def test_output(self): tree = et.parse(self.script_path) output_tag = et.SubElement(tree.getroot(), 'output') output_tag.attrib['name'] = 'test.csv' output_tag.attrib['type'] = 'CSV' output_tag.attrib['rate'] = '10' property_tag = et.SubElement(output_tag, 'property') property_tag.text = 'position/vrp-radius-ft' tree.write('c1722_0.xml') fdm = CreateFDM(self.sandbox) fdm.load_script('c1722_0.xml') fdm.run_ic() ExecuteUntil(fdm, 10.) self.assertTrue(self.sandbox.exists(output_tag.attrib['name']), msg="The file 'output.csv' has not been created") orig = pd.read_csv('JSBout172B.csv', index_col=0) test = pd.read_csv('test.csv', index_col=0) pname = '/fdm/jsbsim/' + property_tag.text ref = orig[pname] mod = test[pname] # Check the data are matching i.e. the time steps are the same between # the two data sets. self.assertTrue(isDataMatching(ref, mod)) # Find all the data that are differing by more than 1E-8 between the # two data sets. delta = pd.concat([np.abs(ref - mod), ref, mod], axis=1) delta.columns = ['delta', 'ref value', 'value'] diff = delta[delta['delta'] > 1E-8] self.longMessage = True self.assertEqual(len(diff), 0, msg='\n' + diff.to_string())
def Compare(self, section): # Rerun the script with the modified aircraft definition self.sandbox.delete_csv_files() fdm = CreateFDM(self.sandbox) # We need to tell JSBSim that the aircraft definition is located in the # directory build/.../aircraft fdm.set_aircraft_path('aircraft') fdm.set_output_directive( self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.load_script(self.script) fdm['simulation/randomseed'] = 0.0 fdm.run_ic() ExecuteUntil(fdm, 50.0) mod = pd.read_csv('output.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(self.ref, mod)) # Whether the data is read from the aircraft definition file or from an # external file, the results shall be exactly identical. Hence the # precision set to 0.0. diff = FindDifferences(self.ref, mod, 0.0) self.assertEqual(len(diff), 0, msg='\nTesting section "' + section + '"\n' + diff.to_string())
def Compare(self, section): # Rerun the script with the modified aircraft definition self.sandbox.delete_csv_files() fdm = CreateFDM(self.sandbox) # We need to tell JSBSim that the aircraft definition is located in the # directory build/.../aircraft fdm.set_aircraft_path('aircraft') fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.load_script(self.script) fdm['simulation/randomseed'] = 0.0 fdm.run_ic() ExecuteUntil(fdm, 50.0) mod = pd.read_csv('output.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(self.ref, mod)) # Whether the data is read from the aircraft definition file or from an # external file, the results shall be exactly identical. Hence the # precision set to 0.0. diff = FindDifferences(self.ref, mod, 0.0) self.assertEqual(len(diff), 0, msg='\nTesting section "'+section+'"\n'+diff.to_string())
def test_model_loading(self): self.longMessage = True self.BuildReference('c1724.xml') output_ref = pd.read_csv('JSBout172B.csv', index_col=0) self.ProcessAndCompare('aerodynamics') self.ProcessAndCompare('autopilot') self.ProcessAndCompare('flight_control') self.ProcessAndCompare('ground_reactions') self.ProcessAndCompare('mass_balance') self.ProcessAndCompare('metrics') self.ProcessAndCompare('propulsion') self.ProcessAndCompare('system') # The <output> section needs special handling. In addition to the check # conducted by ProcessAndCompare with a directive file, we need to # verify that the <output> tag has been correctly executed by JSBSim. # In the case of the script c1724.xml, this means that the data output # in JSBout172B.csv is the same between the reference 'output_ref' and # the result 'mod' below where the <output> tag was moved in a separate # file. self.ProcessAndCompare('output') mod = pd.read_csv('JSBout172B.csv', index_col=0) self.assertTrue(isDataMatching(output_ref, mod)) diff = FindDifferences(output_ref, mod, 0.0) self.assertEqual(len(diff), 0, msg='\nTesting section "output"\n'+diff.to_string()) self.BuildReference('weather-balloon.xml') self.ProcessAndCompare('buoyant_forces') self.BuildReference('Concorde_runway_test.xml') self.ProcessAndCompare('external_reactions')
def test_output(self): tree = et.parse(self.script_path) output_tag = et.SubElement(tree.getroot(), 'output') output_tag.attrib['name'] = 'test.csv' output_tag.attrib['type'] = 'CSV' output_tag.attrib['rate'] = '10' property_tag = et.SubElement(output_tag, 'property') property_tag.text = 'position/vrp-radius-ft' tree.write('c1722_0.xml') fdm = CreateFDM(self.sandbox) fdm.load_script('c1722_0.xml') fdm.run_ic() ExecuteUntil(fdm, 10.) self.assertTrue(self.sandbox.exists(output_tag.attrib['name']), msg="The file 'output.csv' has not been created") orig = pd.read_csv('JSBout172B.csv', index_col=0) test = pd.read_csv('test.csv', index_col=0) pname = '/fdm/jsbsim/' + property_tag.text ref = orig[pname] mod = test[pname] # Check the data are matching i.e. the time steps are the same between # the two data sets. self.assertTrue(isDataMatching(ref, mod)) # Find all the data that are differing by more than 1E-8 between the # two data sets. delta = pd.concat([np.abs(ref - mod), ref, mod], axis=1) delta.columns = ['delta', 'ref value', 'value'] diff = delta[delta['delta'] > 1E-8] self.longMessage = True self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
def testEnginePowerVC(self): # Check that the same results are obtained whether the engine power # velocity correction is given in a <table> or <function> fdm = self.create_fdm() fdm.load_script( self.sandbox.path_to_jsbsim_file('scripts', 'L4102.xml')) fdm.run_ic() while fdm.run(): pass # Kill the fdm so that Windows do not block further access to L410.csv. fdm = None self.delete_fdm() ref = pd.read_csv('L410.csv', index_col=0) tree = et.parse( self.sandbox.path_to_jsbsim_file('engine', 'engtm601.xml')) # Modify the engine definition to use a <function> rather than a # <table> component. root = tree.getroot() engPowVC_tag = root.find("table/[@name='EnginePowerVC']") root.remove(engPowVC_tag) del engPowVC_tag.attrib['name'] func_engPowVC = et.SubElement(root, 'function') func_engPowVC.attrib['name'] = 'EnginePowerVC' func_engPowVC.append(engPowVC_tag) tree.write('engtm601.xml') # Copy the propeller file. shutil.copy(self.sandbox.path_to_jsbsim_file('engine', 'vrtule2.xml'), '.') self.sandbox.delete_csv_files() fdm = self.create_fdm() fdm.set_engine_path('.') fdm.load_script( self.sandbox.path_to_jsbsim_file('scripts', 'L4102.xml')) fdm.run_ic() while fdm.run(): pass current = pd.read_csv('L410.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-5 between the # two data sets. diff = FindDifferences(ref, current, 0.0) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n' + diff.to_string())
def testEnginePowerVC(self): # Check that the same results are obtained whether the engine power # velocity correction is given in a <table> or <function> fdm = CreateFDM(self.sandbox) fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'L4102.xml')) fdm.run_ic() while fdm.run(): pass del fdm ref = pd.read_csv('L410.csv', index_col=0) tree = et.parse(self.sandbox.path_to_jsbsim_file('engine', 'engtm601.xml')) # Modify the engine definition to use a <function> rather than a # <table> component. root = tree.getroot() engPowVC_tag = root.find("table/[@name='EnginePowerVC']") root.remove(engPowVC_tag) del engPowVC_tag.attrib['name'] func_engPowVC = et.SubElement(root, 'function') func_engPowVC.attrib['name'] = 'EnginePowerVC' func_engPowVC.append(engPowVC_tag) tree.write('engtm601.xml') # Copy the propeller file. shutil.copy(self.sandbox.path_to_jsbsim_file('engine', 'vrtule2.xml'), '.') self.sandbox.delete_csv_files() fdm = CreateFDM(self.sandbox) fdm.set_engine_path('.') fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'L4102.xml')) fdm.run_ic() while fdm.run(): pass current = pd.read_csv('L410.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-5 between the # two data sets. diff = FindDifferences(ref, current, 0.0) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
def testOrbitCheckCase(self): os.environ['JSBSIM_DEBUG'] = str(0) fdm = CreateFDM(self.sandbox) fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml')) fdm.run_ic() while fdm.run(): pass ref = pd.read_csv(self.sandbox.path_to_jsbsim_file('logged_data', 'BallOut.csv'), index_col=0) current = pd.read_csv('BallOut.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-5 between the # two data sets. diff = FindDifferences(ref, current, 1E-5) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
def testOrbitCheckCase(self): os.environ['JSBSIM_DEBUG'] = str(0) fdm = CreateFDM(self.sandbox) fdm.load_script( self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml')) fdm.run_ic() while fdm.run(): pass ref = pd.read_csv(self.sandbox.path_to_jsbsim_file( 'logged_data', 'BallOut.csv'), index_col=0) current = pd.read_csv('BallOut.csv', index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, current)) # Find all the data that are differing by more than 1E-5 between the # two data sets. diff = FindDifferences(ref, current, 1E-5) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n' + diff.to_string())
def test_point_mass_inertia(self): script_path = self.sandbox.path_to_jsbsim_file('scripts', 'J2460.xml') fdm = CreateFDM(self.sandbox) fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.load_script(script_path) fdm.run_ic() ExecuteUntil(fdm, 50.0) ref = pd.read_csv("output.csv", index_col=0) tree, aircraft_name, path_to_jsbsim_aircrafts = CopyAircraftDef(script_path, self.sandbox) pointmass_element = tree.getroot().find('mass_balance/pointmass//form/..') weight_element = pointmass_element.find('weight') weight = float(weight_element.text) form_element = pointmass_element.find('form') radius_element = form_element.find('radius') radius, length = (0.0, 0.0) if radius_element is not None: radius = float(radius_element.text) length_element = form_element.find('length') if length_element is not None: length = float(length_element.text) shape = form_element.attrib['shape'] pointmass_element.remove(form_element) inertia = np.zeros((3, 3)) if string.strip(shape) == 'tube': inertia[0, 0] = radius * radius inertia[1, 1] = (6.0 * inertia[0, 0] + length * length) / 12.0 inertia[2, 2] = inertia[1, 1] inertia = inertia * weight / 32.174049 # converting slugs to lbs ixx_element = et.SubElement(pointmass_element, 'ixx') ixx_element.text = str(inertia[0, 0]) iyy_element = et.SubElement(pointmass_element, 'iyy') iyy_element.text = str(inertia[1, 1]) izz_element = et.SubElement(pointmass_element, 'izz') izz_element.text = str(inertia[2, 2]) tree.write(self.sandbox('aircraft', aircraft_name, aircraft_name+'.xml')) # Because JSBSim internals use static pointers, we cannot rely on # Python garbage collector to decide when the FDM is destroyed # otherwise we can get dangling pointers. del fdm fdm = CreateFDM(self.sandbox) fdm.set_aircraft_path('aircraft') fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.load_script(script_path) fdm.run_ic() ExecuteUntil(fdm, 50.0) mod = pd.read_csv("output.csv", index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, mod)) # Find all the data that are differing by more than 1E-8 between the # two data sets. diff = FindDifferences(ref, mod, 1E-8) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
def test_point_mass_inertia(self): script_path = self.sandbox.path_to_jsbsim_file('scripts', 'J2460.xml') fdm = CreateFDM(self.sandbox) fdm.set_output_directive( self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.load_script(script_path) fdm.run_ic() ExecuteUntil(fdm, 50.0) ref = pd.read_csv("output.csv", index_col=0) tree, aircraft_name, path_to_jsbsim_aircrafts = CopyAircraftDef( script_path, self.sandbox) pointmass_element = tree.getroot().find( 'mass_balance/pointmass//form/..') weight_element = pointmass_element.find('weight') weight = float(weight_element.text) form_element = pointmass_element.find('form') radius_element = form_element.find('radius') radius, length = (0.0, 0.0) if radius_element is not None: radius = float(radius_element.text) length_element = form_element.find('length') if length_element is not None: length = float(length_element.text) shape = form_element.attrib['shape'] pointmass_element.remove(form_element) inertia = np.zeros((3, 3)) if string.strip(shape) == 'tube': inertia[0, 0] = radius * radius inertia[1, 1] = (6.0 * inertia[0, 0] + length * length) / 12.0 inertia[2, 2] = inertia[1, 1] inertia = inertia * weight / 32.174049 # converting slugs to lbs ixx_element = et.SubElement(pointmass_element, 'ixx') ixx_element.text = str(inertia[0, 0]) iyy_element = et.SubElement(pointmass_element, 'iyy') iyy_element.text = str(inertia[1, 1]) izz_element = et.SubElement(pointmass_element, 'izz') izz_element.text = str(inertia[2, 2]) tree.write( self.sandbox('aircraft', aircraft_name, aircraft_name + '.xml')) # Because JSBSim internals use static pointers, we cannot rely on # Python garbage collector to decide when the FDM is destroyed # otherwise we can get dangling pointers. del fdm fdm = CreateFDM(self.sandbox) fdm.set_aircraft_path('aircraft') fdm.set_output_directive( self.sandbox.path_to_jsbsim_file('tests', 'output.xml')) fdm.load_script(script_path) fdm.run_ic() ExecuteUntil(fdm, 50.0) mod = pd.read_csv("output.csv", index_col=0) # Check the data are matching i.e. the time steps are the same between # the two data sets and that the output data are also the same. self.assertTrue(isDataMatching(ref, mod)) # Find all the data that are differing by more than 1E-8 between the # two data sets. diff = FindDifferences(ref, mod, 1E-8) self.longMessage = True self.assertEqual(len(diff), 0, msg='\n' + diff.to_string())