diff --git a/Pipfile.lock b/Pipfile.lock index 6920199acd6921b8aaad8d5c01345959dedecdf3..c3e6428aa31386f3f6d820e908fae7c7a3bc726d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -126,59 +126,59 @@ }, "fonttools": { "hashes": [ - "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e", - "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c", - "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f", - "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03", - "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c", - "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438", - "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998", - "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05", - "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60", - "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a", - "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189", - "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c", - "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6", - "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61", - "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd", - "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8", - "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a", - "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc", - "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b", - "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6", - "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81", - "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40", - "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71", - "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d", - "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9", - "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c", - "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7", - "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d", - "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f", - "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6", - "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18", - "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6", - "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b", - "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478", - "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967", - "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c", - "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69", - "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2", - "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4", - "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838", - "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6", - "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880", - "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe", - "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3", - "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2", - "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6", - "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246", - "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf", - "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c", - "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51" + "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7", + "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b", + "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261", + "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0", + "sha256:22f38464daa6cdb7b6aebd14ab06609328fe1e9705bb0fcc7d1e69de7109ee02", + "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841", + "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", + "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4", + "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b", + "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a", + "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048", + "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90", + "sha256:5e8d657cd7326eeaba27de2740e847c6b39dde2f8d7cd7cc56f6aad404ddf0bd", + "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674", + "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72", + "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c", + "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07", + "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b", + "sha256:86721fbc389ef5cc1e2f477019e5069e8e4421e8d9576e9c26f840dbb04678de", + "sha256:89bdc5d88bdeec1b15af790810e267e8332d92561dce4f0748c2b95c9bdf3926", + "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e", + "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628", + "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca", + "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29", + "sha256:a8c2794ded89399cc2169c4d0bf7941247b8d5932b2659e09834adfbb01589aa", + "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe", + "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427", + "sha256:aedbeb1db64496d098e6be92b2e63b5fac4e53b1b92032dfc6988e1ea9134a4d", + "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765", + "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5", + "sha256:b586ab5b15b6097f2fb71cafa3c98edfd0dba1ad8027229e7b1e204a58b0e09d", + "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314", + "sha256:bc5dbb4685e51235ef487e4bd501ddfc49be5aede5e40f4cefcccabc6e60fb4b", + "sha256:bdcc9f04b36c6c20978d3f060e5323a43f6222accc4e7fcbef3f428e216d96af", + "sha256:c3ca99e0d460eff46e033cd3992a969658c3169ffcd533e0a39c63a38beb6831", + "sha256:caf8230f3e10f8f5d7593eb6d252a37caf58c480b19a17e250a63dad63834cf3", + "sha256:cd70de1a52a8ee2d1877b6293af8a2484ac82514f10b1c67c1c5762d38073e56", + "sha256:cf4fe7c124aa3f4e4c1940880156e13f2f4d98170d35c749e6b4f119a872551e", + "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276", + "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0", + "sha256:dc5294a3d5c84226e3dbba1b6f61d7ad813a8c0238fceea4e09aa04848c3d851", + "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5", + "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54", + "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b", + "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f", + "sha256:ed63959d00b61959b035c7d47f9313c2c1ece090ff63afea702fe86de00dbed4", + "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", + "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f", + "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35", + "sha256:fb594b5a99943042c702c550d5494bdd7577f6ef19b0bc73877c948a63184a32" ], "markers": "python_version >= '3.8'", - "version": "==4.55.0" + "version": "==4.55.3" }, "kiwisolver": { "hashes": [ @@ -302,112 +302,113 @@ }, "matplotlib": { "hashes": [ - "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21", - "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5", - "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697", - "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9", - "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca", - "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64", - "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e", - "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03", - "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae", - "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa", - "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3", - "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e", - "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a", - "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc", - "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea", - "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b", - "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e", - "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447", - "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b", - "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92", - "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb", - "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66", - "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9", - "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7", - "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2", - "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30", - "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d", - "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7", - "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4", - "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41", - "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2", - "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556", - "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f", - "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772", - "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c", - "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a", - "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51", - "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49", - "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c", - "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413" + "sha256:026bdf3137ab6022c866efa4813b6bbeddc2ed4c9e7e02f0e323a7bca380dfa0", + "sha256:031b7f5b8e595cc07def77ec5b58464e9bb67dc5760be5d6f26d9da24892481d", + "sha256:0a0a63cb8404d1d1f94968ef35738900038137dab8af836b6c21bb6f03d75465", + "sha256:0a361bd5583bf0bcc08841df3c10269617ee2a36b99ac39d455a767da908bbbc", + "sha256:10d3e5c7a99bd28afb957e1ae661323b0800d75b419f24d041ed1cc5d844a764", + "sha256:1c40c244221a1adbb1256692b1133c6fb89418df27bf759a31a333e7912a4010", + "sha256:203d18df84f5288973b2d56de63d4678cc748250026ca9e1ad8f8a0fd8a75d83", + "sha256:213d6dc25ce686516208d8a3e91120c6a4fdae4a3e06b8505ced5b716b50cc04", + "sha256:3119b2f16de7f7b9212ba76d8fe6a0e9f90b27a1e04683cd89833a991682f639", + "sha256:3fb0b37c896172899a4a93d9442ffdc6f870165f59e05ce2e07c6fded1c15749", + "sha256:41b016e3be4e740b66c79a031a0a6e145728dbc248142e751e8dab4f3188ca1d", + "sha256:4a8d279f78844aad213c4935c18f8292a9432d51af2d88bca99072c903948045", + "sha256:4e6eefae6effa0c35bbbc18c25ee6e0b1da44d2359c3cd526eb0c9e703cf055d", + "sha256:5f2a4ea08e6876206d511365b0bc234edc813d90b930be72c3011bbd7898796f", + "sha256:66d7b171fecf96940ce069923a08ba3df33ef542de82c2ff4fe8caa8346fa95a", + "sha256:687df7ceff57b8f070d02b4db66f75566370e7ae182a0782b6d3d21b0d6917dc", + "sha256:6be0ba61f6ff2e6b68e4270fb63b6813c9e7dec3d15fc3a93f47480444fd72f0", + "sha256:6e9de2b390d253a508dd497e9b5579f3a851f208763ed67fdca5dc0c3ea6849c", + "sha256:760a5e89ebbb172989e8273024a1024b0f084510b9105261b3b00c15e9c9f006", + "sha256:816a966d5d376bf24c92af8f379e78e67278833e4c7cbc9fa41872eec629a060", + "sha256:87ad73763d93add1b6c1f9fcd33af662fd62ed70e620c52fcb79f3ac427cf3a6", + "sha256:896774766fd6be4571a43bc2fcbcb1dcca0807e53cab4a5bf88c4aa861a08e12", + "sha256:8e0143975fc2a6d7136c97e19c637321288371e8f09cff2564ecd73e865ea0b9", + "sha256:90a85a004fefed9e583597478420bf904bb1a065b0b0ee5b9d8d31b04b0f3f70", + "sha256:9b081dac96ab19c54fd8558fac17c9d2c9cb5cc4656e7ed3261ddc927ba3e2c5", + "sha256:9d6b2e8856dec3a6db1ae51aec85c82223e834b228c1d3228aede87eee2b34f9", + "sha256:9f459c8ee2c086455744723628264e43c884be0c7d7b45d84b8cd981310b4815", + "sha256:9fa6e193c14d6944e0685cdb527cb6b38b0e4a518043e7212f214113af7391da", + "sha256:a42b9dc42de2cfe357efa27d9c50c7833fc5ab9b2eb7252ccd5d5f836a84e1e4", + "sha256:b651b0d3642991259109dc0351fc33ad44c624801367bb8307be9bfc35e427ad", + "sha256:b6c12514329ac0d03128cf1dcceb335f4fbf7c11da98bca68dca8dcb983153a9", + "sha256:c52f48eb75fcc119a4fdb68ba83eb5f71656999420375df7c94cc68e0e14686e", + "sha256:c96eeeb8c68b662c7747f91a385688d4b449687d29b691eff7068a4602fe6dc4", + "sha256:cd1077b9a09b16d8c3c7075a8add5ffbfe6a69156a57e290c800ed4d435bef1d", + "sha256:cd5dbbc8e25cad5f706845c4d100e2c8b34691b412b93717ce38d8ae803bcfa5", + "sha256:cf2a60daf6cecff6828bc608df00dbc794380e7234d2411c0ec612811f01969d", + "sha256:d3c93796b44fa111049b88a24105e947f03c01966b5c0cc782e2ee3887b790a3", + "sha256:d796272408f8567ff7eaa00eb2856b3a00524490e47ad505b0b4ca6bb8a7411f", + "sha256:e0fcb7da73fbf67b5f4bdaa57d85bb585a4e913d4a10f3e15b32baea56a67f0a", + "sha256:e14485bb1b83eeb3d55b6878f9560240981e7bbc7a8d4e1e8c38b9bd6ec8d2de", + "sha256:edd14cf733fdc4f6e6fe3f705af97676a7e52859bf0044aa2c84e55be739241c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.9.2" + "version": "==3.9.3" }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.3" + "version": "==2.2.0" }, "openpyxl": { "hashes": [ @@ -604,7 +605,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytz": { @@ -663,19 +664,19 @@ }, "setuptools": { "hashes": [ - "sha256:5c4ccb41111392671f02bb5f8436dfc5a9a7185e80500531b133f5775c4163ef", - "sha256:87cb777c3b96d638ca02031192d40390e0ad97737e27b6b4fa831bea86f2f829" + "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", + "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" ], "markers": "python_version >= '3.9'", - "version": "==75.5.0" + "version": "==75.6.0" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.17.0" }, "soupsieve": { "hashes": [ diff --git a/libs b/libs index e999a694089e47c020248cad04fa7f8443fb51ab..2f58fd6bdf1896be9945b73ca9b36af322b84eb1 160000 --- a/libs +++ b/libs @@ -1 +1 @@ -Subproject commit e999a694089e47c020248cad04fa7f8443fb51ab +Subproject commit 2f58fd6bdf1896be9945b73ca9b36af322b84eb1 diff --git a/performance_assessment/CMakeLists.txt b/performance_assessment/CMakeLists.txt index c20a9dfcb05161392e012e8a14d2ccbace7d355d..7facc45b497306dbeef946bba4b6427d05cbabbd 100644 --- a/performance_assessment/CMakeLists.txt +++ b/performance_assessment/CMakeLists.txt @@ -38,6 +38,8 @@ add_executable(${MODULE_NAME} # Link the runtime libraries -> Use the actual needed libraries target_link_libraries(${MODULE_NAME} + PUBLIC + Matplot++::matplot PRIVATE UnicadoLibs::aixml UnicadoLibs::runtimeInfo diff --git a/performance_assessment/csv_filesperformance_assessment_fuelPayloadRange.csv b/performance_assessment/csv_filesperformance_assessment_fuelPayloadRange.csv new file mode 100644 index 0000000000000000000000000000000000000000..2197d9318abd2b517ed4cbf915c16c3086e752f0 --- /dev/null +++ b/performance_assessment/csv_filesperformance_assessment_fuelPayloadRange.csv @@ -0,0 +1,3901 @@ +# Range [NM]; Payload [kg]; Consumed Fuel [kg]; Time [h] +0; 0; 2769.14; 0 +0; 386; 2793.65; 0 +0; 772; 2818.16; 0 +0; 1158; 2842.67; 0 +0; 1544; 2867.18; 0 +0; 1930; 2891.7; 0 +0; 2316; 2916.21; 0 +0; 2702; 2940.72; 0 +0; 3088; 2965.23; 0 +0; 3474; 2989.74; 0 +0; 3860; 3014.25; 0 +0; 4246; 3038.76; 0 +0; 4632; 3063.27; 0 +0; 5018; 3087.78; 0 +0; 5404; 3112.3; 0 +0; 5790; 3136.81; 0 +0; 6176; 3161.32; 0 +0; 6562; 3185.83; 0 +0; 6948; 3210.34; 0 +0; 7334; 3234.85; 0 +0; 7720; 3259.36; 0 +0; 8106; 3283.87; 0 +0; 8492; 3308.39; 0 +0; 8878; 3332.9; 0 +0; 9264; 3357.41; 0 +0; 9650; 3381.92; 0 +0; 10036; 3406.43; 0 +0; 10422; 3430.94; 0 +0; 10808; 3455.45; 0 +0; 11194; 3479.96; 0 +0; 11580; 3504.47; 0 +0; 11966; 3528.99; 0 +0; 12352; 3553.5; 0 +0; 12738; 3578.01; 0 +0; 13124; 3602.52; 0 +0; 13510; 3627.03; 0 +0; 13896; 3651.54; 0 +0; 14282; 3676.05; 0 +0; 14668; 3700.56; 0 +0; 15054; 3725.08; 0 +0; 15440; 3749.59; 0 +0; 15826; 3774.1; 0 +0; 16212; 3798.61; 0 +0; 16598; 3823.12; 0 +0; 16984; 3847.63; 0 +0; 17370; 3872.14; 0 +0; 17756; 3896.65; 0 +0; 18142; 3921.16; 0 +0; 18528; 3945.68; 0 +0; 18914; 3970.19; 0 +0; 19300; 3994.7; 0 + +111380; 0; 3203.67; 272.499 +111380; 386; 3232.03; 272.499 +111380; 772; 3260.39; 272.499 +111380; 1158; 3288.74; 272.499 +111380; 1544; 3317.1; 272.499 +111380; 1930; 3345.46; 272.499 +111380; 2316; 3373.82; 272.499 +111380; 2702; 3402.17; 272.499 +111380; 3088; 3430.53; 272.499 +111380; 3474; 3458.89; 272.499 +111380; 3860; 3487.25; 272.499 +111380; 4246; 3515.6; 272.499 +111380; 4632; 3543.96; 272.499 +111380; 5018; 3572.32; 272.499 +111380; 5404; 3600.68; 272.499 +111380; 5790; 3629.03; 272.499 +111380; 6176; 3657.39; 272.499 +111380; 6562; 3685.75; 272.499 +111380; 6948; 3714.11; 272.499 +111380; 7334; 3742.46; 272.499 +111380; 7720; 3770.82; 272.499 +111380; 8106; 3799.18; 272.499 +111380; 8492; 3827.54; 272.499 +111380; 8878; 3855.89; 272.499 +111380; 9264; 3884.25; 272.499 +111380; 9650; 3912.61; 272.499 +111380; 10036; 3940.97; 272.499 +111380; 10422; 3969.32; 272.499 +111380; 10808; 3997.68; 272.499 +111380; 11194; 4026.04; 272.499 +111380; 11580; 4054.4; 272.499 +111380; 11966; 4082.75; 272.499 +111380; 12352; 4111.11; 272.499 +111380; 12738; 4139.47; 272.499 +111380; 13124; 4167.83; 272.499 +111380; 13510; 4196.18; 272.499 +111380; 13896; 4224.54; 272.499 +111380; 14282; 4252.9; 272.499 +111380; 14668; 4281.26; 272.499 +111380; 15054; 4309.61; 272.499 +111380; 15440; 4337.97; 272.499 +111380; 15826; 4366.33; 272.499 +111380; 16212; 4394.69; 272.499 +111380; 16598; 4423.04; 272.499 +111380; 16984; 4451.4; 272.499 +111380; 17370; 4479.76; 272.499 +111380; 17756; 4508.12; 272.499 +111380; 18142; 4536.47; 272.499 +111380; 18528; 4564.83; 272.499 +111380; 18914; 4593.19; 272.499 +111380; 19300; 4621.55; 272.499 + +222761; 0; 3641.87; 544.998 +222761; 386; 3674.1; 544.998 +222761; 772; 3706.34; 544.998 +222761; 1158; 3738.58; 544.998 +222761; 1544; 3770.81; 544.998 +222761; 1930; 3803.05; 544.998 +222761; 2316; 3835.29; 544.998 +222761; 2702; 3867.52; 544.998 +222761; 3088; 3899.76; 544.998 +222761; 3474; 3931.99; 544.998 +222761; 3860; 3964.23; 544.998 +222761; 4246; 3996.47; 544.998 +222761; 4632; 4028.7; 544.998 +222761; 5018; 4060.94; 544.998 +222761; 5404; 4093.17; 544.998 +222761; 5790; 4125.41; 544.998 +222761; 6176; 4157.65; 544.998 +222761; 6562; 4189.88; 544.998 +222761; 6948; 4222.12; 544.998 +222761; 7334; 4254.36; 544.998 +222761; 7720; 4286.59; 544.998 +222761; 8106; 4318.83; 544.998 +222761; 8492; 4351.06; 544.998 +222761; 8878; 4383.3; 544.998 +222761; 9264; 4415.54; 544.998 +222761; 9650; 4447.77; 544.998 +222761; 10036; 4480.01; 544.998 +222761; 10422; 4512.25; 544.998 +222761; 10808; 4544.48; 544.998 +222761; 11194; 4576.72; 544.998 +222761; 11580; 4608.95; 544.998 +222761; 11966; 4641.19; 544.998 +222761; 12352; 4673.43; 544.998 +222761; 12738; 4705.66; 544.998 +222761; 13124; 4737.9; 544.998 +222761; 13510; 4770.13; 544.998 +222761; 13896; 4802.37; 544.998 +222761; 14282; 4834.61; 544.998 +222761; 14668; 4866.84; 544.998 +222761; 15054; 4899.08; 544.998 +222761; 15440; 4931.32; 544.998 +222761; 15826; 4963.55; 544.998 +222761; 16212; 4995.79; 544.998 +222761; 16598; 5028.02; 544.998 +222761; 16984; 5060.26; 544.998 +222761; 17370; 5092.5; 544.998 +222761; 17756; 5124.73; 544.998 +222761; 18142; 5156.97; 544.998 +222761; 18528; 5189.21; 544.998 +222761; 18914; 5221.44; 544.998 +222761; 19300; 5253.68; 544.998 + +334141; 0; 4083.76; 817.498 +334141; 386; 4119.91; 817.498 +334141; 772; 4156.05; 817.498 +334141; 1158; 4192.2; 817.498 +334141; 1544; 4228.35; 817.498 +334141; 1930; 4264.5; 817.498 +334141; 2316; 4300.64; 817.498 +334141; 2702; 4336.79; 817.498 +334141; 3088; 4372.94; 817.498 +334141; 3474; 4409.09; 817.498 +334141; 3860; 4445.23; 817.498 +334141; 4246; 4481.38; 817.498 +334141; 4632; 4517.53; 817.498 +334141; 5018; 4553.68; 817.498 +334141; 5404; 4589.83; 817.498 +334141; 5790; 4625.97; 817.498 +334141; 6176; 4662.12; 817.498 +334141; 6562; 4698.27; 817.498 +334141; 6948; 4734.42; 817.498 +334141; 7334; 4770.56; 817.498 +334141; 7720; 4806.71; 817.498 +334141; 8106; 4842.86; 817.498 +334141; 8492; 4879.01; 817.498 +334141; 8878; 4915.15; 817.498 +334141; 9264; 4951.3; 817.498 +334141; 9650; 4987.45; 817.498 +334141; 10036; 5023.6; 817.498 +334141; 10422; 5059.74; 817.498 +334141; 10808; 5095.89; 817.498 +334141; 11194; 5132.04; 817.498 +334141; 11580; 5168.19; 817.498 +334141; 11966; 5204.33; 817.498 +334141; 12352; 5240.48; 817.498 +334141; 12738; 5276.63; 817.498 +334141; 13124; 5312.78; 817.498 +334141; 13510; 5348.92; 817.498 +334141; 13896; 5385.07; 817.498 +334141; 14282; 5421.22; 817.498 +334141; 14668; 5457.37; 817.498 +334141; 15054; 5493.52; 817.498 +334141; 15440; 5529.66; 817.498 +334141; 15826; 5565.81; 817.498 +334141; 16212; 5601.96; 817.498 +334141; 16598; 5638.11; 817.498 +334141; 16984; 5674.25; 817.498 +334141; 17370; 5710.4; 817.498 +334141; 17756; 5746.55; 817.498 +334141; 18142; 5782.7; 817.498 +334141; 18528; 5818.84; 817.498 +334141; 18914; 5854.99; 817.498 +334141; 19300; 5891.14; 817.498 + +445522; 0; 4529.37; 1090 +445522; 386; 4569.46; 1090 +445522; 772; 4609.56; 1090 +445522; 1158; 4649.65; 1090 +445522; 1544; 4689.74; 1090 +445522; 1930; 4729.83; 1090 +445522; 2316; 4769.92; 1090 +445522; 2702; 4810.02; 1090 +445522; 3088; 4850.11; 1090 +445522; 3474; 4890.2; 1090 +445522; 3860; 4930.29; 1090 +445522; 4246; 4970.38; 1090 +445522; 4632; 5010.48; 1090 +445522; 5018; 5050.57; 1090 +445522; 5404; 5090.66; 1090 +445522; 5790; 5130.75; 1090 +445522; 6176; 5170.84; 1090 +445522; 6562; 5210.94; 1090 +445522; 6948; 5251.03; 1090 +445522; 7334; 5291.12; 1090 +445522; 7720; 5331.21; 1090 +445522; 8106; 5371.3; 1090 +445522; 8492; 5411.4; 1090 +445522; 8878; 5451.49; 1090 +445522; 9264; 5491.58; 1090 +445522; 9650; 5531.67; 1090 +445522; 10036; 5571.76; 1090 +445522; 10422; 5611.86; 1090 +445522; 10808; 5651.95; 1090 +445522; 11194; 5692.04; 1090 +445522; 11580; 5732.13; 1090 +445522; 11966; 5772.22; 1090 +445522; 12352; 5812.32; 1090 +445522; 12738; 5852.41; 1090 +445522; 13124; 5892.5; 1090 +445522; 13510; 5932.59; 1090 +445522; 13896; 5972.68; 1090 +445522; 14282; 6012.78; 1090 +445522; 14668; 6052.87; 1090 +445522; 15054; 6092.96; 1090 +445522; 15440; 6133.05; 1090 +445522; 15826; 6173.14; 1090 +445522; 16212; 6213.24; 1090 +445522; 16598; 6253.33; 1090 +445522; 16984; 6293.42; 1090 +445522; 17370; 6333.51; 1090 +445522; 17756; 6373.6; 1090 +445522; 18142; 6413.7; 1090 +445522; 18528; 6453.79; 1090 +445522; 18914; 6493.88; 1090 +445522; 19300; 6533.97; 1090 + +556902; 0; 4978.74; 1362.5 +556902; 386; 5022.81; 1362.5 +556902; 772; 5066.88; 1362.5 +556902; 1158; 5110.95; 1362.5 +556902; 1544; 5155.02; 1362.5 +556902; 1930; 5199.09; 1362.5 +556902; 2316; 5243.16; 1362.5 +556902; 2702; 5287.23; 1362.5 +556902; 3088; 5331.3; 1362.5 +556902; 3474; 5375.37; 1362.5 +556902; 3860; 5419.44; 1362.5 +556902; 4246; 5463.51; 1362.5 +556902; 4632; 5507.58; 1362.5 +556902; 5018; 5551.65; 1362.5 +556902; 5404; 5595.72; 1362.5 +556902; 5790; 5639.78; 1362.5 +556902; 6176; 5683.85; 1362.5 +556902; 6562; 5727.92; 1362.5 +556902; 6948; 5771.99; 1362.5 +556902; 7334; 5816.06; 1362.5 +556902; 7720; 5860.13; 1362.5 +556902; 8106; 5904.2; 1362.5 +556902; 8492; 5948.27; 1362.5 +556902; 8878; 5992.34; 1362.5 +556902; 9264; 6036.41; 1362.5 +556902; 9650; 6080.48; 1362.5 +556902; 10036; 6124.55; 1362.5 +556902; 10422; 6168.62; 1362.5 +556902; 10808; 6212.69; 1362.5 +556902; 11194; 6256.76; 1362.5 +556902; 11580; 6300.83; 1362.5 +556902; 11966; 6344.9; 1362.5 +556902; 12352; 6388.97; 1362.5 +556902; 12738; 6433.04; 1362.5 +556902; 13124; 6477.11; 1362.5 +556902; 13510; 6521.18; 1362.5 +556902; 13896; 6565.25; 1362.5 +556902; 14282; 6609.32; 1362.5 +556902; 14668; 6653.39; 1362.5 +556902; 15054; 6697.45; 1362.5 +556902; 15440; 6741.52; 1362.5 +556902; 15826; 6785.59; 1362.5 +556902; 16212; 6829.66; 1362.5 +556902; 16598; 6873.73; 1362.5 +556902; 16984; 6917.8; 1362.5 +556902; 17370; 6961.87; 1362.5 +556902; 17756; 7005.94; 1362.5 +556902; 18142; 7050.01; 1362.5 +556902; 18528; 7094.08; 1362.5 +556902; 18914; 7138.15; 1362.5 +556902; 19300; 7182.22; 1362.5 + +668283; 0; 5431.89; 1635 +668283; 386; 5479.97; 1635 +668283; 772; 5528.05; 1635 +668283; 1158; 5576.13; 1635 +668283; 1544; 5624.21; 1635 +668283; 1930; 5672.3; 1635 +668283; 2316; 5720.38; 1635 +668283; 2702; 5768.46; 1635 +668283; 3088; 5816.54; 1635 +668283; 3474; 5864.62; 1635 +668283; 3860; 5912.7; 1635 +668283; 4246; 5960.78; 1635 +668283; 4632; 6008.86; 1635 +668283; 5018; 6056.94; 1635 +668283; 5404; 6105.02; 1635 +668283; 5790; 6153.1; 1635 +668283; 6176; 6201.18; 1635 +668283; 6562; 6249.26; 1635 +668283; 6948; 6297.34; 1635 +668283; 7334; 6345.43; 1635 +668283; 7720; 6393.51; 1635 +668283; 8106; 6441.59; 1635 +668283; 8492; 6489.67; 1635 +668283; 8878; 6537.75; 1635 +668283; 9264; 6585.83; 1635 +668283; 9650; 6633.91; 1635 +668283; 10036; 6681.99; 1635 +668283; 10422; 6730.07; 1635 +668283; 10808; 6778.15; 1635 +668283; 11194; 6826.23; 1635 +668283; 11580; 6874.31; 1635 +668283; 11966; 6922.39; 1635 +668283; 12352; 6970.47; 1635 +668283; 12738; 7018.55; 1635 +668283; 13124; 7066.64; 1635 +668283; 13510; 7114.72; 1635 +668283; 13896; 7162.8; 1635 +668283; 14282; 7210.88; 1635 +668283; 14668; 7258.96; 1635 +668283; 15054; 7307.04; 1635 +668283; 15440; 7355.12; 1635 +668283; 15826; 7403.2; 1635 +668283; 16212; 7451.28; 1635 +668283; 16598; 7499.36; 1635 +668283; 16984; 7547.44; 1635 +668283; 17370; 7595.52; 1635 +668283; 17756; 7643.6; 1635 +668283; 18142; 7691.68; 1635 +668283; 18528; 7739.76; 1635 +668283; 18914; 7787.85; 1635 +668283; 19300; 7835.93; 1635 + +779663; 0; 5888.93; 1907.49 +779663; 386; 5941.06; 1907.49 +779663; 772; 5993.19; 1907.49 +779663; 1158; 6045.31; 1907.49 +779663; 1544; 6097.44; 1907.49 +779663; 1930; 6149.56; 1907.49 +779663; 2316; 6201.69; 1907.49 +779663; 2702; 6253.82; 1907.49 +779663; 3088; 6305.94; 1907.49 +779663; 3474; 6358.07; 1907.49 +779663; 3860; 6410.19; 1907.49 +779663; 4246; 6462.32; 1907.49 +779663; 4632; 6514.45; 1907.49 +779663; 5018; 6566.57; 1907.49 +779663; 5404; 6618.7; 1907.49 +779663; 5790; 6670.83; 1907.49 +779663; 6176; 6722.95; 1907.49 +779663; 6562; 6775.08; 1907.49 +779663; 6948; 6827.2; 1907.49 +779663; 7334; 6879.33; 1907.49 +779663; 7720; 6931.46; 1907.49 +779663; 8106; 6983.58; 1907.49 +779663; 8492; 7035.71; 1907.49 +779663; 8878; 7087.84; 1907.49 +779663; 9264; 7139.96; 1907.49 +779663; 9650; 7192.09; 1907.49 +779663; 10036; 7244.21; 1907.49 +779663; 10422; 7296.34; 1907.49 +779663; 10808; 7348.47; 1907.49 +779663; 11194; 7400.59; 1907.49 +779663; 11580; 7452.72; 1907.49 +779663; 11966; 7504.85; 1907.49 +779663; 12352; 7556.97; 1907.49 +779663; 12738; 7609.1; 1907.49 +779663; 13124; 7661.22; 1907.49 +779663; 13510; 7713.35; 1907.49 +779663; 13896; 7765.48; 1907.49 +779663; 14282; 7817.6; 1907.49 +779663; 14668; 7869.73; 1907.49 +779663; 15054; 7921.85; 1907.49 +779663; 15440; 7973.98; 1907.49 +779663; 15826; 8026.11; 1907.49 +779663; 16212; 8078.23; 1907.49 +779663; 16598; 8130.36; 1907.49 +779663; 16984; 8182.49; 1907.49 +779663; 17370; 8234.61; 1907.49 +779663; 17756; 8286.74; 1907.49 +779663; 18142; 8338.86; 1907.49 +779663; 18528; 8390.99; 1907.49 +779663; 18914; 8443.12; 1907.49 +779663; 19300; 8495.24; 1907.49 + +891044; 0; 6349.78; 2179.99 +891044; 386; 6405.98; 2179.99 +891044; 772; 6462.19; 2179.99 +891044; 1158; 6518.39; 2179.99 +891044; 1544; 6574.6; 2179.99 +891044; 1930; 6630.8; 2179.99 +891044; 2316; 6687.01; 2179.99 +891044; 2702; 6743.21; 2179.99 +891044; 3088; 6799.42; 2179.99 +891044; 3474; 6855.63; 2179.99 +891044; 3860; 6911.83; 2179.99 +891044; 4246; 6968.04; 2179.99 +891044; 4632; 7024.24; 2179.99 +891044; 5018; 7080.45; 2179.99 +891044; 5404; 7136.65; 2179.99 +891044; 5790; 7192.86; 2179.99 +891044; 6176; 7249.06; 2179.99 +891044; 6562; 7305.27; 2179.99 +891044; 6948; 7361.47; 2179.99 +891044; 7334; 7417.68; 2179.99 +891044; 7720; 7473.88; 2179.99 +891044; 8106; 7530.09; 2179.99 +891044; 8492; 7586.3; 2179.99 +891044; 8878; 7642.5; 2179.99 +891044; 9264; 7698.71; 2179.99 +891044; 9650; 7754.91; 2179.99 +891044; 10036; 7811.12; 2179.99 +891044; 10422; 7867.32; 2179.99 +891044; 10808; 7923.53; 2179.99 +891044; 11194; 7979.73; 2179.99 +891044; 11580; 8035.94; 2179.99 +891044; 11966; 8092.14; 2179.99 +891044; 12352; 8148.35; 2179.99 +891044; 12738; 8204.55; 2179.99 +891044; 13124; 8260.76; 2179.99 +891044; 13510; 8316.97; 2179.99 +891044; 13896; 8373.17; 2179.99 +891044; 14282; 8429.38; 2179.99 +891044; 14668; 8485.58; 2179.99 +891044; 15054; 8541.79; 2179.99 +891044; 15440; 8597.99; 2179.99 +891044; 15826; 8654.2; 2179.99 +891044; 16212; 8710.4; 2179.99 +891044; 16598; 8766.61; 2179.99 +891044; 16984; 8822.81; 2179.99 +891044; 17370; 8879.02; 2179.99 +891044; 17756; 8935.22; 2179.99 +891044; 18142; 8991.43; 2179.99 +891044; 18528; 9047.64; 2179.99 +891044; 18914; 9103.84; 2179.99 +891044; 19300; 9160.05; 2179.99 + +1.00242e+06; 0; 6814.51; 2452.49 +1.00242e+06; 386; 6874.82; 2452.49 +1.00242e+06; 772; 6935.14; 2452.49 +1.00242e+06; 1158; 6995.46; 2452.49 +1.00242e+06; 1544; 7055.78; 2452.49 +1.00242e+06; 1930; 7116.1; 2452.49 +1.00242e+06; 2316; 7176.42; 2452.49 +1.00242e+06; 2702; 7236.74; 2452.49 +1.00242e+06; 3088; 7297.06; 2452.49 +1.00242e+06; 3474; 7357.38; 2452.49 +1.00242e+06; 3860; 7417.69; 2452.49 +1.00242e+06; 4246; 7478.01; 2452.49 +1.00242e+06; 4632; 7538.33; 2452.49 +1.00242e+06; 5018; 7598.65; 2452.49 +1.00242e+06; 5404; 7658.97; 2452.49 +1.00242e+06; 5790; 7719.29; 2452.49 +1.00242e+06; 6176; 7779.61; 2452.49 +1.00242e+06; 6562; 7839.93; 2452.49 +1.00242e+06; 6948; 7900.25; 2452.49 +1.00242e+06; 7334; 7960.57; 2452.49 +1.00242e+06; 7720; 8020.88; 2452.49 +1.00242e+06; 8106; 8081.2; 2452.49 +1.00242e+06; 8492; 8141.52; 2452.49 +1.00242e+06; 8878; 8201.84; 2452.49 +1.00242e+06; 9264; 8262.16; 2452.49 +1.00242e+06; 9650; 8322.48; 2452.49 +1.00242e+06; 10036; 8382.8; 2452.49 +1.00242e+06; 10422; 8443.12; 2452.49 +1.00242e+06; 10808; 8503.44; 2452.49 +1.00242e+06; 11194; 8563.75; 2452.49 +1.00242e+06; 11580; 8624.07; 2452.49 +1.00242e+06; 11966; 8684.39; 2452.49 +1.00242e+06; 12352; 8744.71; 2452.49 +1.00242e+06; 12738; 8805.03; 2452.49 +1.00242e+06; 13124; 8865.35; 2452.49 +1.00242e+06; 13510; 8925.67; 2452.49 +1.00242e+06; 13896; 8985.99; 2452.49 +1.00242e+06; 14282; 9046.31; 2452.49 +1.00242e+06; 14668; 9106.63; 2452.49 +1.00242e+06; 15054; 9166.94; 2452.49 +1.00242e+06; 15440; 9227.26; 2452.49 +1.00242e+06; 15826; 9287.58; 2452.49 +1.00242e+06; 16212; 9347.9; 2452.49 +1.00242e+06; 16598; 9408.22; 2452.49 +1.00242e+06; 16984; 9468.54; 2452.49 +1.00242e+06; 17370; 9528.86; 2452.49 +1.00242e+06; 17756; 9589.18; 2452.49 +1.00242e+06; 18142; 9649.5; 2452.49 +1.00242e+06; 18528; 9709.82; 2452.49 +1.00242e+06; 18914; 9770.13; 2452.49 +1.00242e+06; 19300; 9830.45; 2452.49 + +1.1138e+06; 0; 7283.15; 2724.99 +1.1138e+06; 386; 7347.62; 2724.99 +1.1138e+06; 772; 7412.08; 2724.99 +1.1138e+06; 1158; 7476.55; 2724.99 +1.1138e+06; 1544; 7541.02; 2724.99 +1.1138e+06; 1930; 7605.49; 2724.99 +1.1138e+06; 2316; 7669.95; 2724.99 +1.1138e+06; 2702; 7734.42; 2724.99 +1.1138e+06; 3088; 7798.89; 2724.99 +1.1138e+06; 3474; 7863.35; 2724.99 +1.1138e+06; 3860; 7927.82; 2724.99 +1.1138e+06; 4246; 7992.29; 2724.99 +1.1138e+06; 4632; 8056.76; 2724.99 +1.1138e+06; 5018; 8121.22; 2724.99 +1.1138e+06; 5404; 8185.69; 2724.99 +1.1138e+06; 5790; 8250.16; 2724.99 +1.1138e+06; 6176; 8314.63; 2724.99 +1.1138e+06; 6562; 8379.09; 2724.99 +1.1138e+06; 6948; 8443.56; 2724.99 +1.1138e+06; 7334; 8508.03; 2724.99 +1.1138e+06; 7720; 8572.49; 2724.99 +1.1138e+06; 8106; 8636.96; 2724.99 +1.1138e+06; 8492; 8701.43; 2724.99 +1.1138e+06; 8878; 8765.9; 2724.99 +1.1138e+06; 9264; 8830.36; 2724.99 +1.1138e+06; 9650; 8894.83; 2724.99 +1.1138e+06; 10036; 8959.3; 2724.99 +1.1138e+06; 10422; 9023.76; 2724.99 +1.1138e+06; 10808; 9088.23; 2724.99 +1.1138e+06; 11194; 9152.7; 2724.99 +1.1138e+06; 11580; 9217.17; 2724.99 +1.1138e+06; 11966; 9281.63; 2724.99 +1.1138e+06; 12352; 9346.1; 2724.99 +1.1138e+06; 12738; 9410.57; 2724.99 +1.1138e+06; 13124; 9475.03; 2724.99 +1.1138e+06; 13510; 9539.5; 2724.99 +1.1138e+06; 13896; 9603.97; 2724.99 +1.1138e+06; 14282; 9668.44; 2724.99 +1.1138e+06; 14668; 9732.9; 2724.99 +1.1138e+06; 15054; 9797.37; 2724.99 +1.1138e+06; 15440; 9861.84; 2724.99 +1.1138e+06; 15826; 9926.3; 2724.99 +1.1138e+06; 16212; 9990.77; 2724.99 +1.1138e+06; 16598; 10055.2; 2724.99 +1.1138e+06; 16984; 10119.7; 2724.99 +1.1138e+06; 17370; 10184.2; 2724.99 +1.1138e+06; 17756; 10248.6; 2724.99 +1.1138e+06; 18142; 10313.1; 2724.99 +1.1138e+06; 18528; 10377.6; 2724.99 +1.1138e+06; 18914; 10442; 2724.99 +1.1138e+06; 19300; 10506.5; 2724.99 + +1.22519e+06; 0; 7755.74; 2997.49 +1.22519e+06; 386; 7824.39; 2997.49 +1.22519e+06; 772; 7893.04; 2997.49 +1.22519e+06; 1158; 7961.69; 2997.49 +1.22519e+06; 1544; 8030.34; 2997.49 +1.22519e+06; 1930; 8099; 2997.49 +1.22519e+06; 2316; 8167.65; 2997.49 +1.22519e+06; 2702; 8236.3; 2997.49 +1.22519e+06; 3088; 8304.95; 2997.49 +1.22519e+06; 3474; 8373.6; 2997.49 +1.22519e+06; 3860; 8442.25; 2997.49 +1.22519e+06; 4246; 8510.9; 2997.49 +1.22519e+06; 4632; 8579.55; 2997.49 +1.22519e+06; 5018; 8648.2; 2997.49 +1.22519e+06; 5404; 8716.85; 2997.49 +1.22519e+06; 5790; 8785.5; 2997.49 +1.22519e+06; 6176; 8854.15; 2997.49 +1.22519e+06; 6562; 8922.8; 2997.49 +1.22519e+06; 6948; 8991.45; 2997.49 +1.22519e+06; 7334; 9060.1; 2997.49 +1.22519e+06; 7720; 9128.75; 2997.49 +1.22519e+06; 8106; 9197.4; 2997.49 +1.22519e+06; 8492; 9266.05; 2997.49 +1.22519e+06; 8878; 9334.7; 2997.49 +1.22519e+06; 9264; 9403.35; 2997.49 +1.22519e+06; 9650; 9472; 2997.49 +1.22519e+06; 10036; 9540.65; 2997.49 +1.22519e+06; 10422; 9609.3; 2997.49 +1.22519e+06; 10808; 9677.95; 2997.49 +1.22519e+06; 11194; 9746.6; 2997.49 +1.22519e+06; 11580; 9815.25; 2997.49 +1.22519e+06; 11966; 9883.9; 2997.49 +1.22519e+06; 12352; 9952.56; 2997.49 +1.22519e+06; 12738; 10021.2; 2997.49 +1.22519e+06; 13124; 10089.9; 2997.49 +1.22519e+06; 13510; 10158.5; 2997.49 +1.22519e+06; 13896; 10227.2; 2997.49 +1.22519e+06; 14282; 10295.8; 2997.49 +1.22519e+06; 14668; 10364.5; 2997.49 +1.22519e+06; 15054; 10433.1; 2997.49 +1.22519e+06; 15440; 10501.8; 2997.49 +1.22519e+06; 15826; 10570.4; 2997.49 +1.22519e+06; 16212; 10639.1; 2997.49 +1.22519e+06; 16598; 10707.7; 2997.49 +1.22519e+06; 16984; 10776.4; 2997.49 +1.22519e+06; 17370; 10845; 2997.49 +1.22519e+06; 17756; 10913.7; 2997.49 +1.22519e+06; 18142; 10982.3; 2997.49 +1.22519e+06; 18528; 11051; 2997.49 +1.22519e+06; 18914; 11119.6; 2997.49 +1.22519e+06; 19300; 11188.3; 2997.49 + +1.33657e+06; 0; 8232.32; 3269.99 +1.33657e+06; 386; 8305.19; 3269.99 +1.33657e+06; 772; 8378.05; 3269.99 +1.33657e+06; 1158; 8450.92; 3269.99 +1.33657e+06; 1544; 8523.79; 3269.99 +1.33657e+06; 1930; 8596.66; 3269.99 +1.33657e+06; 2316; 8669.53; 3269.99 +1.33657e+06; 2702; 8742.4; 3269.99 +1.33657e+06; 3088; 8815.27; 3269.99 +1.33657e+06; 3474; 8888.14; 3269.99 +1.33657e+06; 3860; 8961; 3269.99 +1.33657e+06; 4246; 9033.87; 3269.99 +1.33657e+06; 4632; 9106.74; 3269.99 +1.33657e+06; 5018; 9179.61; 3269.99 +1.33657e+06; 5404; 9252.48; 3269.99 +1.33657e+06; 5790; 9325.35; 3269.99 +1.33657e+06; 6176; 9398.22; 3269.99 +1.33657e+06; 6562; 9471.09; 3269.99 +1.33657e+06; 6948; 9543.95; 3269.99 +1.33657e+06; 7334; 9616.82; 3269.99 +1.33657e+06; 7720; 9689.69; 3269.99 +1.33657e+06; 8106; 9762.56; 3269.99 +1.33657e+06; 8492; 9835.43; 3269.99 +1.33657e+06; 8878; 9908.3; 3269.99 +1.33657e+06; 9264; 9981.17; 3269.99 +1.33657e+06; 9650; 10054; 3269.99 +1.33657e+06; 10036; 10126.9; 3269.99 +1.33657e+06; 10422; 10199.8; 3269.99 +1.33657e+06; 10808; 10272.6; 3269.99 +1.33657e+06; 11194; 10345.5; 3269.99 +1.33657e+06; 11580; 10418.4; 3269.99 +1.33657e+06; 11966; 10491.2; 3269.99 +1.33657e+06; 12352; 10564.1; 3269.99 +1.33657e+06; 12738; 10637; 3269.99 +1.33657e+06; 13124; 10709.9; 3269.99 +1.33657e+06; 13510; 10782.7; 3269.99 +1.33657e+06; 13896; 10855.6; 3269.99 +1.33657e+06; 14282; 10928.5; 3269.99 +1.33657e+06; 14668; 11001.3; 3269.99 +1.33657e+06; 15054; 11074.2; 3269.99 +1.33657e+06; 15440; 11147.1; 3269.99 +1.33657e+06; 15826; 11219.9; 3269.99 +1.33657e+06; 16212; 11292.8; 3269.99 +1.33657e+06; 16598; 11365.7; 3269.99 +1.33657e+06; 16984; 11438.5; 3269.99 +1.33657e+06; 17370; 11511.4; 3269.99 +1.33657e+06; 17756; 11584.3; 3269.99 +1.33657e+06; 18142; 11657.1; 3269.99 +1.33657e+06; 18528; 11730; 3269.99 +1.33657e+06; 18914; 11802.9; 3269.99 +1.33657e+06; 19300; 11875.8; 3269.99 + +1.44795e+06; 0; 8712.9; 3542.49 +1.44795e+06; 386; 8790.02; 3542.49 +1.44795e+06; 772; 8867.15; 3542.49 +1.44795e+06; 1158; 8944.27; 3542.49 +1.44795e+06; 1544; 9021.39; 3542.49 +1.44795e+06; 1930; 9098.52; 3542.49 +1.44795e+06; 2316; 9175.64; 3542.49 +1.44795e+06; 2702; 9252.76; 3542.49 +1.44795e+06; 3088; 9329.88; 3542.49 +1.44795e+06; 3474; 9407.01; 3542.49 +1.44795e+06; 3860; 9484.13; 3542.49 +1.44795e+06; 4246; 9561.25; 3542.49 +1.44795e+06; 4632; 9638.37; 3542.49 +1.44795e+06; 5018; 9715.5; 3542.49 +1.44795e+06; 5404; 9792.62; 3542.49 +1.44795e+06; 5790; 9869.74; 3542.49 +1.44795e+06; 6176; 9946.87; 3542.49 +1.44795e+06; 6562; 10024; 3542.49 +1.44795e+06; 6948; 10101.1; 3542.49 +1.44795e+06; 7334; 10178.2; 3542.49 +1.44795e+06; 7720; 10255.4; 3542.49 +1.44795e+06; 8106; 10332.5; 3542.49 +1.44795e+06; 8492; 10409.6; 3542.49 +1.44795e+06; 8878; 10486.7; 3542.49 +1.44795e+06; 9264; 10563.8; 3542.49 +1.44795e+06; 9650; 10641; 3542.49 +1.44795e+06; 10036; 10718.1; 3542.49 +1.44795e+06; 10422; 10795.2; 3542.49 +1.44795e+06; 10808; 10872.3; 3542.49 +1.44795e+06; 11194; 10949.5; 3542.49 +1.44795e+06; 11580; 11026.6; 3542.49 +1.44795e+06; 11966; 11103.7; 3542.49 +1.44795e+06; 12352; 11180.8; 3542.49 +1.44795e+06; 12738; 11258; 3542.49 +1.44795e+06; 13124; 11335.1; 3542.49 +1.44795e+06; 13510; 11412.2; 3542.49 +1.44795e+06; 13896; 11489.3; 3542.49 +1.44795e+06; 14282; 11566.4; 3542.49 +1.44795e+06; 14668; 11643.6; 3542.49 +1.44795e+06; 15054; 11720.7; 3542.49 +1.44795e+06; 15440; 11797.8; 3542.49 +1.44795e+06; 15826; 11874.9; 3542.49 +1.44795e+06; 16212; 11952.1; 3542.49 +1.44795e+06; 16598; 12029.2; 3542.49 +1.44795e+06; 16984; 12106.3; 3542.49 +1.44795e+06; 17370; 12183.4; 3542.49 +1.44795e+06; 17756; 12260.5; 3542.49 +1.44795e+06; 18142; 12337.7; 3542.49 +1.44795e+06; 18528; 12414.8; 3542.49 +1.44795e+06; 18914; 12491.9; 3542.49 +1.44795e+06; 19300; 12569; 3542.49 + +1.55933e+06; 0; 9197.53; 3814.99 +1.55933e+06; 386; 9278.94; 3814.99 +1.55933e+06; 772; 9360.36; 3814.99 +1.55933e+06; 1158; 9441.77; 3814.99 +1.55933e+06; 1544; 9523.18; 3814.99 +1.55933e+06; 1930; 9604.59; 3814.99 +1.55933e+06; 2316; 9686.01; 3814.99 +1.55933e+06; 2702; 9767.42; 3814.99 +1.55933e+06; 3088; 9848.83; 3814.99 +1.55933e+06; 3474; 9930.24; 3814.99 +1.55933e+06; 3860; 10011.7; 3814.99 +1.55933e+06; 4246; 10093.1; 3814.99 +1.55933e+06; 4632; 10174.5; 3814.99 +1.55933e+06; 5018; 10255.9; 3814.99 +1.55933e+06; 5404; 10337.3; 3814.99 +1.55933e+06; 5790; 10418.7; 3814.99 +1.55933e+06; 6176; 10500.1; 3814.99 +1.55933e+06; 6562; 10581.5; 3814.99 +1.55933e+06; 6948; 10663; 3814.99 +1.55933e+06; 7334; 10744.4; 3814.99 +1.55933e+06; 7720; 10825.8; 3814.99 +1.55933e+06; 8106; 10907.2; 3814.99 +1.55933e+06; 8492; 10988.6; 3814.99 +1.55933e+06; 8878; 11070; 3814.99 +1.55933e+06; 9264; 11151.4; 3814.99 +1.55933e+06; 9650; 11232.8; 3814.99 +1.55933e+06; 10036; 11314.3; 3814.99 +1.55933e+06; 10422; 11395.7; 3814.99 +1.55933e+06; 10808; 11477.1; 3814.99 +1.55933e+06; 11194; 11558.5; 3814.99 +1.55933e+06; 11580; 11639.9; 3814.99 +1.55933e+06; 11966; 11721.3; 3814.99 +1.55933e+06; 12352; 11802.7; 3814.99 +1.55933e+06; 12738; 11884.1; 3814.99 +1.55933e+06; 13124; 11965.6; 3814.99 +1.55933e+06; 13510; 12047; 3814.99 +1.55933e+06; 13896; 12128.4; 3814.99 +1.55933e+06; 14282; 12209.8; 3814.99 +1.55933e+06; 14668; 12291.2; 3814.99 +1.55933e+06; 15054; 12372.6; 3814.99 +1.55933e+06; 15440; 12454; 3814.99 +1.55933e+06; 15826; 12535.4; 3814.99 +1.55933e+06; 16212; 12616.9; 3814.99 +1.55933e+06; 16598; 12698.3; 3814.99 +1.55933e+06; 16984; 12779.7; 3814.99 +1.55933e+06; 17370; 12861.1; 3814.99 +1.55933e+06; 17756; 12942.5; 3814.99 +1.55933e+06; 18142; 13023.9; 3814.99 +1.55933e+06; 18528; 13105.3; 3814.99 +1.55933e+06; 18914; 13186.7; 3814.99 +1.55933e+06; 19300; 13268.2; 3814.99 + +1.67071e+06; 0; 9686.4; 4087.49 +1.67071e+06; 386; 9772.14; 4087.49 +1.67071e+06; 772; 9857.88; 4087.49 +1.67071e+06; 1158; 9943.62; 4087.49 +1.67071e+06; 1544; 10029.4; 4087.49 +1.67071e+06; 1930; 10115.1; 4087.49 +1.67071e+06; 2316; 10200.8; 4087.49 +1.67071e+06; 2702; 10286.6; 4087.49 +1.67071e+06; 3088; 10372.3; 4087.49 +1.67071e+06; 3474; 10458.1; 4087.49 +1.67071e+06; 3860; 10543.8; 4087.49 +1.67071e+06; 4246; 10629.5; 4087.49 +1.67071e+06; 4632; 10715.3; 4087.49 +1.67071e+06; 5018; 10801; 4087.49 +1.67071e+06; 5404; 10886.8; 4087.49 +1.67071e+06; 5790; 10972.5; 4087.49 +1.67071e+06; 6176; 11058.2; 4087.49 +1.67071e+06; 6562; 11144; 4087.49 +1.67071e+06; 6948; 11229.7; 4087.49 +1.67071e+06; 7334; 11315.5; 4087.49 +1.67071e+06; 7720; 11401.2; 4087.49 +1.67071e+06; 8106; 11486.9; 4087.49 +1.67071e+06; 8492; 11572.7; 4087.49 +1.67071e+06; 8878; 11658.4; 4087.49 +1.67071e+06; 9264; 11744.2; 4087.49 +1.67071e+06; 9650; 11829.9; 4087.49 +1.67071e+06; 10036; 11915.6; 4087.49 +1.67071e+06; 10422; 12001.4; 4087.49 +1.67071e+06; 10808; 12087.1; 4087.49 +1.67071e+06; 11194; 12172.9; 4087.49 +1.67071e+06; 11580; 12258.6; 4087.49 +1.67071e+06; 11966; 12344.3; 4087.49 +1.67071e+06; 12352; 12430.1; 4087.49 +1.67071e+06; 12738; 12515.8; 4087.49 +1.67071e+06; 13124; 12601.6; 4087.49 +1.67071e+06; 13510; 12687.3; 4087.49 +1.67071e+06; 13896; 12773; 4087.49 +1.67071e+06; 14282; 12858.8; 4087.49 +1.67071e+06; 14668; 12944.5; 4087.49 +1.67071e+06; 15054; 13030.3; 4087.49 +1.67071e+06; 15440; 13116; 4087.49 +1.67071e+06; 15826; 13201.7; 4087.49 +1.67071e+06; 16212; 13287.5; 4087.49 +1.67071e+06; 16598; 13373.2; 4087.49 +1.67071e+06; 16984; 13459; 4087.49 +1.67071e+06; 17370; 13544.7; 4087.49 +1.67071e+06; 17756; 13630.4; 4087.49 +1.67071e+06; 18142; 13716.2; 4087.49 +1.67071e+06; 18528; 13801.9; 4087.49 +1.67071e+06; 18914; 13887.6; 4087.49 +1.67071e+06; 19300; 13973.4; 4087.49 + +1.78209e+06; 0; 10179.3; 4359.99 +1.78209e+06; 386; 10269.4; 4359.99 +1.78209e+06; 772; 10359.5; 4359.99 +1.78209e+06; 1158; 10449.6; 4359.99 +1.78209e+06; 1544; 10539.7; 4359.99 +1.78209e+06; 1930; 10629.8; 4359.99 +1.78209e+06; 2316; 10719.9; 4359.99 +1.78209e+06; 2702; 10810; 4359.99 +1.78209e+06; 3088; 10900.1; 4359.99 +1.78209e+06; 3474; 10990.2; 4359.99 +1.78209e+06; 3860; 11080.3; 4359.99 +1.78209e+06; 4246; 11170.4; 4359.99 +1.78209e+06; 4632; 11260.5; 4359.99 +1.78209e+06; 5018; 11350.6; 4359.99 +1.78209e+06; 5404; 11440.7; 4359.99 +1.78209e+06; 5790; 11530.8; 4359.99 +1.78209e+06; 6176; 11620.9; 4359.99 +1.78209e+06; 6562; 11711; 4359.99 +1.78209e+06; 6948; 11801.1; 4359.99 +1.78209e+06; 7334; 11891.2; 4359.99 +1.78209e+06; 7720; 11981.3; 4359.99 +1.78209e+06; 8106; 12071.4; 4359.99 +1.78209e+06; 8492; 12161.5; 4359.99 +1.78209e+06; 8878; 12251.6; 4359.99 +1.78209e+06; 9264; 12341.7; 4359.99 +1.78209e+06; 9650; 12431.8; 4359.99 +1.78209e+06; 10036; 12521.9; 4359.99 +1.78209e+06; 10422; 12612; 4359.99 +1.78209e+06; 10808; 12702.1; 4359.99 +1.78209e+06; 11194; 12792.2; 4359.99 +1.78209e+06; 11580; 12882.3; 4359.99 +1.78209e+06; 11966; 12972.4; 4359.99 +1.78209e+06; 12352; 13062.5; 4359.99 +1.78209e+06; 12738; 13152.6; 4359.99 +1.78209e+06; 13124; 13242.8; 4359.99 +1.78209e+06; 13510; 13332.9; 4359.99 +1.78209e+06; 13896; 13423; 4359.99 +1.78209e+06; 14282; 13513.1; 4359.99 +1.78209e+06; 14668; 13603.2; 4359.99 +1.78209e+06; 15054; 13693.3; 4359.99 +1.78209e+06; 15440; 13783.4; 4359.99 +1.78209e+06; 15826; 13873.5; 4359.99 +1.78209e+06; 16212; 13963.6; 4359.99 +1.78209e+06; 16598; 14053.7; 4359.99 +1.78209e+06; 16984; 14143.8; 4359.99 +1.78209e+06; 17370; 14233.9; 4359.99 +1.78209e+06; 17756; 14324; 4359.99 +1.78209e+06; 18142; 14414.1; 4359.99 +1.78209e+06; 18528; 14504.2; 4359.99 +1.78209e+06; 18914; 14594.3; 4359.99 +1.78209e+06; 19300; 14684.4; 4359.99 + +1.89347e+06; 0; 10676.3; 4632.49 +1.89347e+06; 386; 10770.8; 4632.49 +1.89347e+06; 772; 10865.3; 4632.49 +1.89347e+06; 1158; 10959.8; 4632.49 +1.89347e+06; 1544; 11054.3; 4632.49 +1.89347e+06; 1930; 11148.8; 4632.49 +1.89347e+06; 2316; 11243.3; 4632.49 +1.89347e+06; 2702; 11337.8; 4632.49 +1.89347e+06; 3088; 11432.3; 4632.49 +1.89347e+06; 3474; 11526.8; 4632.49 +1.89347e+06; 3860; 11621.3; 4632.49 +1.89347e+06; 4246; 11715.8; 4632.49 +1.89347e+06; 4632; 11810.3; 4632.49 +1.89347e+06; 5018; 11904.8; 4632.49 +1.89347e+06; 5404; 11999.3; 4632.49 +1.89347e+06; 5790; 12093.8; 4632.49 +1.89347e+06; 6176; 12188.3; 4632.49 +1.89347e+06; 6562; 12282.8; 4632.49 +1.89347e+06; 6948; 12377.3; 4632.49 +1.89347e+06; 7334; 12471.8; 4632.49 +1.89347e+06; 7720; 12566.3; 4632.49 +1.89347e+06; 8106; 12660.8; 4632.49 +1.89347e+06; 8492; 12755.3; 4632.49 +1.89347e+06; 8878; 12849.8; 4632.49 +1.89347e+06; 9264; 12944.3; 4632.49 +1.89347e+06; 9650; 13038.8; 4632.49 +1.89347e+06; 10036; 13133.3; 4632.49 +1.89347e+06; 10422; 13227.8; 4632.49 +1.89347e+06; 10808; 13322.3; 4632.49 +1.89347e+06; 11194; 13416.8; 4632.49 +1.89347e+06; 11580; 13511.3; 4632.49 +1.89347e+06; 11966; 13605.8; 4632.49 +1.89347e+06; 12352; 13700.3; 4632.49 +1.89347e+06; 12738; 13794.9; 4632.49 +1.89347e+06; 13124; 13889.4; 4632.49 +1.89347e+06; 13510; 13983.9; 4632.49 +1.89347e+06; 13896; 14078.4; 4632.49 +1.89347e+06; 14282; 14172.9; 4632.49 +1.89347e+06; 14668; 14267.4; 4632.49 +1.89347e+06; 15054; 14361.9; 4632.49 +1.89347e+06; 15440; 14456.4; 4632.49 +1.89347e+06; 15826; 14550.9; 4632.49 +1.89347e+06; 16212; 14645.4; 4632.49 +1.89347e+06; 16598; 14739.9; 4632.49 +1.89347e+06; 16984; 14834.4; 4632.49 +1.89347e+06; 17370; 14928.9; 4632.49 +1.89347e+06; 17756; 15023.4; 4632.49 +1.89347e+06; 18142; 15117.9; 4632.49 +1.89347e+06; 18528; 15212.4; 4632.49 +1.89347e+06; 18914; 15306.9; 4632.49 +1.89347e+06; 19300; 15401.4; 4632.49 + +2.00485e+06; 0; 11177.5; 4904.99 +2.00485e+06; 386; 11276.4; 4904.99 +2.00485e+06; 772; 11375.4; 4904.99 +2.00485e+06; 1158; 11474.3; 4904.99 +2.00485e+06; 1544; 11573.3; 4904.99 +2.00485e+06; 1930; 11672.2; 4904.99 +2.00485e+06; 2316; 11771.1; 4904.99 +2.00485e+06; 2702; 11870.1; 4904.99 +2.00485e+06; 3088; 11969; 4904.99 +2.00485e+06; 3474; 12067.9; 4904.99 +2.00485e+06; 3860; 12166.9; 4904.99 +2.00485e+06; 4246; 12265.8; 4904.99 +2.00485e+06; 4632; 12364.8; 4904.99 +2.00485e+06; 5018; 12463.7; 4904.99 +2.00485e+06; 5404; 12562.6; 4904.99 +2.00485e+06; 5790; 12661.6; 4904.99 +2.00485e+06; 6176; 12760.5; 4904.99 +2.00485e+06; 6562; 12859.4; 4904.99 +2.00485e+06; 6948; 12958.4; 4904.99 +2.00485e+06; 7334; 13057.3; 4904.99 +2.00485e+06; 7720; 13156.3; 4904.99 +2.00485e+06; 8106; 13255.2; 4904.99 +2.00485e+06; 8492; 13354.1; 4904.99 +2.00485e+06; 8878; 13453.1; 4904.99 +2.00485e+06; 9264; 13552; 4904.99 +2.00485e+06; 9650; 13651; 4904.99 +2.00485e+06; 10036; 13749.9; 4904.99 +2.00485e+06; 10422; 13848.8; 4904.99 +2.00485e+06; 10808; 13947.8; 4904.99 +2.00485e+06; 11194; 14046.7; 4904.99 +2.00485e+06; 11580; 14145.6; 4904.99 +2.00485e+06; 11966; 14244.6; 4904.99 +2.00485e+06; 12352; 14343.5; 4904.99 +2.00485e+06; 12738; 14442.5; 4904.99 +2.00485e+06; 13124; 14541.4; 4904.99 +2.00485e+06; 13510; 14640.3; 4904.99 +2.00485e+06; 13896; 14739.3; 4904.99 +2.00485e+06; 14282; 14838.2; 4904.99 +2.00485e+06; 14668; 14937.2; 4904.99 +2.00485e+06; 15054; 15036.1; 4904.99 +2.00485e+06; 15440; 15135; 4904.99 +2.00485e+06; 15826; 15234; 4904.99 +2.00485e+06; 16212; 15332.9; 4904.99 +2.00485e+06; 16598; 15431.8; 4904.99 +2.00485e+06; 16984; 15530.8; 4904.99 +2.00485e+06; 17370; 15629.7; 4904.99 +2.00485e+06; 17756; 15728.7; 4904.99 +2.00485e+06; 18142; 15827.6; 4904.99 +2.00485e+06; 18528; 15926.5; 4904.99 +2.00485e+06; 18914; 16025.5; 4904.99 +2.00485e+06; 19300; 16124.4; 4904.99 + +2.11623e+06; 0; 11682.9; 5177.49 +2.11623e+06; 386; 11786.3; 5177.49 +2.11623e+06; 772; 11889.8; 5177.49 +2.11623e+06; 1158; 11993.2; 5177.49 +2.11623e+06; 1544; 12096.6; 5177.49 +2.11623e+06; 1930; 12200; 5177.49 +2.11623e+06; 2316; 12303.4; 5177.49 +2.11623e+06; 2702; 12406.8; 5177.49 +2.11623e+06; 3088; 12510.2; 5177.49 +2.11623e+06; 3474; 12613.6; 5177.49 +2.11623e+06; 3860; 12717; 5177.49 +2.11623e+06; 4246; 12820.5; 5177.49 +2.11623e+06; 4632; 12923.9; 5177.49 +2.11623e+06; 5018; 13027.3; 5177.49 +2.11623e+06; 5404; 13130.7; 5177.49 +2.11623e+06; 5790; 13234.1; 5177.49 +2.11623e+06; 6176; 13337.5; 5177.49 +2.11623e+06; 6562; 13440.9; 5177.49 +2.11623e+06; 6948; 13544.3; 5177.49 +2.11623e+06; 7334; 13647.8; 5177.49 +2.11623e+06; 7720; 13751.2; 5177.49 +2.11623e+06; 8106; 13854.6; 5177.49 +2.11623e+06; 8492; 13958; 5177.49 +2.11623e+06; 8878; 14061.4; 5177.49 +2.11623e+06; 9264; 14164.8; 5177.49 +2.11623e+06; 9650; 14268.2; 5177.49 +2.11623e+06; 10036; 14371.6; 5177.49 +2.11623e+06; 10422; 14475.1; 5177.49 +2.11623e+06; 10808; 14578.5; 5177.49 +2.11623e+06; 11194; 14681.9; 5177.49 +2.11623e+06; 11580; 14785.3; 5177.49 +2.11623e+06; 11966; 14888.7; 5177.49 +2.11623e+06; 12352; 14992.1; 5177.49 +2.11623e+06; 12738; 15095.5; 5177.49 +2.11623e+06; 13124; 15198.9; 5177.49 +2.11623e+06; 13510; 15302.4; 5177.49 +2.11623e+06; 13896; 15405.8; 5177.49 +2.11623e+06; 14282; 15509.2; 5177.49 +2.11623e+06; 14668; 15612.6; 5177.49 +2.11623e+06; 15054; 15716; 5177.49 +2.11623e+06; 15440; 15819.4; 5177.49 +2.11623e+06; 15826; 15922.8; 5177.49 +2.11623e+06; 16212; 16026.2; 5177.49 +2.11623e+06; 16598; 16129.6; 5177.49 +2.11623e+06; 16984; 16233.1; 5177.49 +2.11623e+06; 17370; 16336.5; 5177.49 +2.11623e+06; 17756; 16439.9; 5177.49 +2.11623e+06; 18142; 16543.3; 5177.49 +2.11623e+06; 18528; 16646.7; 5177.49 +2.11623e+06; 18914; 16750.1; 5177.49 +2.11623e+06; 19300; 16853.5; 5177.49 + +2.22761e+06; 0; 12192.6; 5449.98 +2.22761e+06; 386; 12300.5; 5449.98 +2.22761e+06; 772; 12408.5; 5449.98 +2.22761e+06; 1158; 12516.4; 5449.98 +2.22761e+06; 1544; 12624.3; 5449.98 +2.22761e+06; 1930; 12732.2; 5449.98 +2.22761e+06; 2316; 12840.2; 5449.98 +2.22761e+06; 2702; 12948.1; 5449.98 +2.22761e+06; 3088; 13056; 5449.98 +2.22761e+06; 3474; 13163.9; 5449.98 +2.22761e+06; 3860; 13271.8; 5449.98 +2.22761e+06; 4246; 13379.8; 5449.98 +2.22761e+06; 4632; 13487.7; 5449.98 +2.22761e+06; 5018; 13595.6; 5449.98 +2.22761e+06; 5404; 13703.5; 5449.98 +2.22761e+06; 5790; 13811.5; 5449.98 +2.22761e+06; 6176; 13919.4; 5449.98 +2.22761e+06; 6562; 14027.3; 5449.98 +2.22761e+06; 6948; 14135.2; 5449.98 +2.22761e+06; 7334; 14243.2; 5449.98 +2.22761e+06; 7720; 14351.1; 5449.98 +2.22761e+06; 8106; 14459; 5449.98 +2.22761e+06; 8492; 14566.9; 5449.98 +2.22761e+06; 8878; 14674.9; 5449.98 +2.22761e+06; 9264; 14782.8; 5449.98 +2.22761e+06; 9650; 14890.7; 5449.98 +2.22761e+06; 10036; 14998.6; 5449.98 +2.22761e+06; 10422; 15106.5; 5449.98 +2.22761e+06; 10808; 15214.5; 5449.98 +2.22761e+06; 11194; 15322.4; 5449.98 +2.22761e+06; 11580; 15430.3; 5449.98 +2.22761e+06; 11966; 15538.2; 5449.98 +2.22761e+06; 12352; 15646.2; 5449.98 +2.22761e+06; 12738; 15754.1; 5449.98 +2.22761e+06; 13124; 15862; 5449.98 +2.22761e+06; 13510; 15969.9; 5449.98 +2.22761e+06; 13896; 16077.9; 5449.98 +2.22761e+06; 14282; 16185.8; 5449.98 +2.22761e+06; 14668; 16293.7; 5449.98 +2.22761e+06; 15054; 16401.6; 5449.98 +2.22761e+06; 15440; 16509.6; 5449.98 +2.22761e+06; 15826; 16617.5; 5449.98 +2.22761e+06; 16212; 16725.4; 5449.98 +2.22761e+06; 16598; 16833.3; 5449.98 +2.22761e+06; 16984; 16941.2; 5449.98 +2.22761e+06; 17370; 17049.2; 5449.98 +2.22761e+06; 17756; 17157.1; 5449.98 +2.22761e+06; 18142; 17265; 5449.98 +2.22761e+06; 18528; 17372.9; 5449.98 +2.22761e+06; 18914; 17480.9; 5449.98 +2.22761e+06; 19300; 17588.8; 5449.98 + +2.33899e+06; 0; 12706.6; 5722.48 +2.33899e+06; 386; 12819.1; 5722.48 +2.33899e+06; 772; 12931.5; 5722.48 +2.33899e+06; 1158; 13044; 5722.48 +2.33899e+06; 1544; 13156.5; 5722.48 +2.33899e+06; 1930; 13269; 5722.48 +2.33899e+06; 2316; 13381.4; 5722.48 +2.33899e+06; 2702; 13493.9; 5722.48 +2.33899e+06; 3088; 13606.4; 5722.48 +2.33899e+06; 3474; 13718.8; 5722.48 +2.33899e+06; 3860; 13831.3; 5722.48 +2.33899e+06; 4246; 13943.8; 5722.48 +2.33899e+06; 4632; 14056.3; 5722.48 +2.33899e+06; 5018; 14168.7; 5722.48 +2.33899e+06; 5404; 14281.2; 5722.48 +2.33899e+06; 5790; 14393.7; 5722.48 +2.33899e+06; 6176; 14506.2; 5722.48 +2.33899e+06; 6562; 14618.6; 5722.48 +2.33899e+06; 6948; 14731.1; 5722.48 +2.33899e+06; 7334; 14843.6; 5722.48 +2.33899e+06; 7720; 14956; 5722.48 +2.33899e+06; 8106; 15068.5; 5722.48 +2.33899e+06; 8492; 15181; 5722.48 +2.33899e+06; 8878; 15293.5; 5722.48 +2.33899e+06; 9264; 15405.9; 5722.48 +2.33899e+06; 9650; 15518.4; 5722.48 +2.33899e+06; 10036; 15630.9; 5722.48 +2.33899e+06; 10422; 15743.4; 5722.48 +2.33899e+06; 10808; 15855.8; 5722.48 +2.33899e+06; 11194; 15968.3; 5722.48 +2.33899e+06; 11580; 16080.8; 5722.48 +2.33899e+06; 11966; 16193.2; 5722.48 +2.33899e+06; 12352; 16305.7; 5722.48 +2.33899e+06; 12738; 16418.2; 5722.48 +2.33899e+06; 13124; 16530.7; 5722.48 +2.33899e+06; 13510; 16643.1; 5722.48 +2.33899e+06; 13896; 16755.6; 5722.48 +2.33899e+06; 14282; 16868.1; 5722.48 +2.33899e+06; 14668; 16980.6; 5722.48 +2.33899e+06; 15054; 17093; 5722.48 +2.33899e+06; 15440; 17205.5; 5722.48 +2.33899e+06; 15826; 17318; 5722.48 +2.33899e+06; 16212; 17430.5; 5722.48 +2.33899e+06; 16598; 17542.9; 5722.48 +2.33899e+06; 16984; 17655.4; 5722.48 +2.33899e+06; 17370; 17767.9; 5722.48 +2.33899e+06; 17756; 17880.3; 5722.48 +2.33899e+06; 18142; 17992.8; 5722.48 +2.33899e+06; 18528; 18105.3; 5722.48 +2.33899e+06; 18914; 18217.8; 5722.48 +2.33899e+06; 19300; 18330.2; 5722.48 + +2.45037e+06; 0; 13224.9; 5994.98 +2.45037e+06; 386; 13341.9; 5994.98 +2.45037e+06; 772; 13459; 5994.98 +2.45037e+06; 1158; 13576.1; 5994.98 +2.45037e+06; 1544; 13693.1; 5994.98 +2.45037e+06; 1930; 13810.2; 5994.98 +2.45037e+06; 2316; 13927.2; 5994.98 +2.45037e+06; 2702; 14044.3; 5994.98 +2.45037e+06; 3088; 14161.4; 5994.98 +2.45037e+06; 3474; 14278.4; 5994.98 +2.45037e+06; 3860; 14395.5; 5994.98 +2.45037e+06; 4246; 14512.5; 5994.98 +2.45037e+06; 4632; 14629.6; 5994.98 +2.45037e+06; 5018; 14746.7; 5994.98 +2.45037e+06; 5404; 14863.7; 5994.98 +2.45037e+06; 5790; 14980.8; 5994.98 +2.45037e+06; 6176; 15097.9; 5994.98 +2.45037e+06; 6562; 15214.9; 5994.98 +2.45037e+06; 6948; 15332; 5994.98 +2.45037e+06; 7334; 15449; 5994.98 +2.45037e+06; 7720; 15566.1; 5994.98 +2.45037e+06; 8106; 15683.2; 5994.98 +2.45037e+06; 8492; 15800.2; 5994.98 +2.45037e+06; 8878; 15917.3; 5994.98 +2.45037e+06; 9264; 16034.3; 5994.98 +2.45037e+06; 9650; 16151.4; 5994.98 +2.45037e+06; 10036; 16268.5; 5994.98 +2.45037e+06; 10422; 16385.5; 5994.98 +2.45037e+06; 10808; 16502.6; 5994.98 +2.45037e+06; 11194; 16619.6; 5994.98 +2.45037e+06; 11580; 16736.7; 5994.98 +2.45037e+06; 11966; 16853.8; 5994.98 +2.45037e+06; 12352; 16970.8; 5994.98 +2.45037e+06; 12738; 17087.9; 5994.98 +2.45037e+06; 13124; 17204.9; 5994.98 +2.45037e+06; 13510; 17322; 5994.98 +2.45037e+06; 13896; 17439.1; 5994.98 +2.45037e+06; 14282; 17556.1; 5994.98 +2.45037e+06; 14668; 17673.2; 5994.98 +2.45037e+06; 15054; 17790.3; 5994.98 +2.45037e+06; 15440; 17907.3; 5994.98 +2.45037e+06; 15826; 18024.4; 5994.98 +2.45037e+06; 16212; 18141.4; 5994.98 +2.45037e+06; 16598; 18258.5; 5994.98 +2.45037e+06; 16984; 18375.6; 5994.98 +2.45037e+06; 17370; 18492.6; 5994.98 +2.45037e+06; 17756; 18609.7; 5994.98 +2.45037e+06; 18142; 18726.7; 5994.98 +2.45037e+06; 18528; 18843.8; 5994.98 +2.45037e+06; 18914; 18960.9; 5994.98 +2.45037e+06; 19300; 19077.9; 5994.98 + +2.56175e+06; 0; 13747.5; 6267.48 +2.56175e+06; 386; 13869.2; 6267.48 +2.56175e+06; 772; 13990.9; 6267.48 +2.56175e+06; 1158; 14112.6; 6267.48 +2.56175e+06; 1544; 14234.3; 6267.48 +2.56175e+06; 1930; 14356; 6267.48 +2.56175e+06; 2316; 14477.7; 6267.48 +2.56175e+06; 2702; 14599.3; 6267.48 +2.56175e+06; 3088; 14721; 6267.48 +2.56175e+06; 3474; 14842.7; 6267.48 +2.56175e+06; 3860; 14964.4; 6267.48 +2.56175e+06; 4246; 15086.1; 6267.48 +2.56175e+06; 4632; 15207.8; 6267.48 +2.56175e+06; 5018; 15329.5; 6267.48 +2.56175e+06; 5404; 15451.2; 6267.48 +2.56175e+06; 5790; 15572.8; 6267.48 +2.56175e+06; 6176; 15694.5; 6267.48 +2.56175e+06; 6562; 15816.2; 6267.48 +2.56175e+06; 6948; 15937.9; 6267.48 +2.56175e+06; 7334; 16059.6; 6267.48 +2.56175e+06; 7720; 16181.3; 6267.48 +2.56175e+06; 8106; 16303; 6267.48 +2.56175e+06; 8492; 16424.7; 6267.48 +2.56175e+06; 8878; 16546.3; 6267.48 +2.56175e+06; 9264; 16668; 6267.48 +2.56175e+06; 9650; 16789.7; 6267.48 +2.56175e+06; 10036; 16911.4; 6267.48 +2.56175e+06; 10422; 17033.1; 6267.48 +2.56175e+06; 10808; 17154.8; 6267.48 +2.56175e+06; 11194; 17276.5; 6267.48 +2.56175e+06; 11580; 17398.1; 6267.48 +2.56175e+06; 11966; 17519.8; 6267.48 +2.56175e+06; 12352; 17641.5; 6267.48 +2.56175e+06; 12738; 17763.2; 6267.48 +2.56175e+06; 13124; 17884.9; 6267.48 +2.56175e+06; 13510; 18006.6; 6267.48 +2.56175e+06; 13896; 18128.3; 6267.48 +2.56175e+06; 14282; 18250; 6267.48 +2.56175e+06; 14668; 18371.6; 6267.48 +2.56175e+06; 15054; 18493.3; 6267.48 +2.56175e+06; 15440; 18615; 6267.48 +2.56175e+06; 15826; 18736.7; 6267.48 +2.56175e+06; 16212; 18858.4; 6267.48 +2.56175e+06; 16598; 18980.1; 6267.48 +2.56175e+06; 16984; 19101.8; 6267.48 +2.56175e+06; 17370; 19223.5; 6267.48 +2.56175e+06; 17756; 19345.1; 6267.48 +2.56175e+06; 18142; 19466.8; 6267.48 +2.56175e+06; 18528; 19588.5; 6267.48 +2.56175e+06; 18914; 19710.2; 6267.48 +2.56175e+06; 19300; 19831.9; 6267.48 + +2.67313e+06; 0; 14274.9; 6539.98 +2.67313e+06; 386; 14401.3; 6539.98 +2.67313e+06; 772; 14527.6; 6539.98 +2.67313e+06; 1158; 14654; 6539.98 +2.67313e+06; 1544; 14780.3; 6539.98 +2.67313e+06; 1930; 14906.7; 6539.98 +2.67313e+06; 2316; 15033; 6539.98 +2.67313e+06; 2702; 15159.4; 6539.98 +2.67313e+06; 3088; 15285.8; 6539.98 +2.67313e+06; 3474; 15412.1; 6539.98 +2.67313e+06; 3860; 15538.5; 6539.98 +2.67313e+06; 4246; 15664.8; 6539.98 +2.67313e+06; 4632; 15791.2; 6539.98 +2.67313e+06; 5018; 15917.5; 6539.98 +2.67313e+06; 5404; 16043.9; 6539.98 +2.67313e+06; 5790; 16170.2; 6539.98 +2.67313e+06; 6176; 16296.6; 6539.98 +2.67313e+06; 6562; 16423; 6539.98 +2.67313e+06; 6948; 16549.3; 6539.98 +2.67313e+06; 7334; 16675.7; 6539.98 +2.67313e+06; 7720; 16802; 6539.98 +2.67313e+06; 8106; 16928.4; 6539.98 +2.67313e+06; 8492; 17054.7; 6539.98 +2.67313e+06; 8878; 17181.1; 6539.98 +2.67313e+06; 9264; 17307.4; 6539.98 +2.67313e+06; 9650; 17433.8; 6539.98 +2.67313e+06; 10036; 17560.2; 6539.98 +2.67313e+06; 10422; 17686.5; 6539.98 +2.67313e+06; 10808; 17812.9; 6539.98 +2.67313e+06; 11194; 17939.2; 6539.98 +2.67313e+06; 11580; 18065.6; 6539.98 +2.67313e+06; 11966; 18191.9; 6539.98 +2.67313e+06; 12352; 18318.3; 6539.98 +2.67313e+06; 12738; 18444.6; 6539.98 +2.67313e+06; 13124; 18571; 6539.98 +2.67313e+06; 13510; 18697.4; 6539.98 +2.67313e+06; 13896; 18823.7; 6539.98 +2.67313e+06; 14282; 18950.1; 6539.98 +2.67313e+06; 14668; 19076.4; 6539.98 +2.67313e+06; 15054; 19202.8; 6539.98 +2.67313e+06; 15440; 19329.1; 6539.98 +2.67313e+06; 15826; 19455.5; 6539.98 +2.67313e+06; 16212; 19581.8; 6539.98 +2.67313e+06; 16598; 19708.2; 6539.98 +2.67313e+06; 16984; 19834.5; 6539.98 +2.67313e+06; 17370; 19960.9; 6539.98 +2.67313e+06; 17756; 20087.3; 6539.98 +2.67313e+06; 18142; 20213.6; 6539.98 +2.67313e+06; 18528; 20340; 6539.98 +2.67313e+06; 18914; 20466.3; 6539.98 +2.67313e+06; 19300; 20592.7; 6539.98 + +2.78451e+06; 0; 14806.5; 6812.48 +2.78451e+06; 386; 14937.5; 6812.48 +2.78451e+06; 772; 15068.6; 6812.48 +2.78451e+06; 1158; 15199.7; 6812.48 +2.78451e+06; 1544; 15330.7; 6812.48 +2.78451e+06; 1930; 15461.8; 6812.48 +2.78451e+06; 2316; 15592.8; 6812.48 +2.78451e+06; 2702; 15723.9; 6812.48 +2.78451e+06; 3088; 15855; 6812.48 +2.78451e+06; 3474; 15986; 6812.48 +2.78451e+06; 3860; 16117.1; 6812.48 +2.78451e+06; 4246; 16248.1; 6812.48 +2.78451e+06; 4632; 16379.2; 6812.48 +2.78451e+06; 5018; 16510.3; 6812.48 +2.78451e+06; 5404; 16641.3; 6812.48 +2.78451e+06; 5790; 16772.4; 6812.48 +2.78451e+06; 6176; 16903.4; 6812.48 +2.78451e+06; 6562; 17034.5; 6812.48 +2.78451e+06; 6948; 17165.6; 6812.48 +2.78451e+06; 7334; 17296.6; 6812.48 +2.78451e+06; 7720; 17427.7; 6812.48 +2.78451e+06; 8106; 17558.7; 6812.48 +2.78451e+06; 8492; 17689.8; 6812.48 +2.78451e+06; 8878; 17820.9; 6812.48 +2.78451e+06; 9264; 17951.9; 6812.48 +2.78451e+06; 9650; 18083; 6812.48 +2.78451e+06; 10036; 18214; 6812.48 +2.78451e+06; 10422; 18345.1; 6812.48 +2.78451e+06; 10808; 18476.2; 6812.48 +2.78451e+06; 11194; 18607.2; 6812.48 +2.78451e+06; 11580; 18738.3; 6812.48 +2.78451e+06; 11966; 18869.3; 6812.48 +2.78451e+06; 12352; 19000.4; 6812.48 +2.78451e+06; 12738; 19131.5; 6812.48 +2.78451e+06; 13124; 19262.5; 6812.48 +2.78451e+06; 13510; 19393.6; 6812.48 +2.78451e+06; 13896; 19524.6; 6812.48 +2.78451e+06; 14282; 19655.7; 6812.48 +2.78451e+06; 14668; 19786.8; 6812.48 +2.78451e+06; 15054; 19917.8; 6812.48 +2.78451e+06; 15440; 20048.9; 6812.48 +2.78451e+06; 15826; 20179.9; 6812.48 +2.78451e+06; 16212; 20311; 6812.48 +2.78451e+06; 16598; 20442.1; 6812.48 +2.78451e+06; 16984; 20573.1; 6812.48 +2.78451e+06; 17370; 20704.2; 6812.48 +2.78451e+06; 17756; 20835.2; 6812.48 +2.78451e+06; 18142; 20966.3; 6812.48 +2.78451e+06; 18528; 21097.4; 6812.48 +2.78451e+06; 18914; 21228.4; 6812.48 +2.78451e+06; 19300; 21359.5; 6812.48 + +2.80165e+06; 0; 14888.7; 6854.41 +2.80165e+06; 384.654; 15020; 6854.41 +2.80165e+06; 769.308; 15151.3; 6854.41 +2.80165e+06; 1153.96; 15282.7; 6854.41 +2.80165e+06; 1538.62; 15414; 6854.41 +2.80165e+06; 1923.27; 15545.3; 6854.41 +2.80165e+06; 2307.92; 15676.6; 6854.41 +2.80165e+06; 2692.58; 15808; 6854.41 +2.80165e+06; 3077.23; 15939.3; 6854.41 +2.80165e+06; 3461.89; 16070.6; 6854.41 +2.80165e+06; 3846.54; 16202; 6854.41 +2.80165e+06; 4231.2; 16333.3; 6854.41 +2.80165e+06; 4615.85; 16464.6; 6854.41 +2.80165e+06; 5000.5; 16595.9; 6854.41 +2.80165e+06; 5385.16; 16727.3; 6854.41 +2.80165e+06; 5769.81; 16858.6; 6854.41 +2.80165e+06; 6154.47; 16989.9; 6854.41 +2.80165e+06; 6539.12; 17121.2; 6854.41 +2.80165e+06; 6923.77; 17252.6; 6854.41 +2.80165e+06; 7308.43; 17383.9; 6854.41 +2.80165e+06; 7693.08; 17515.2; 6854.41 +2.80165e+06; 8077.74; 17646.6; 6854.41 +2.80165e+06; 8462.39; 17777.9; 6854.41 +2.80165e+06; 8847.05; 17909.2; 6854.41 +2.80165e+06; 9231.7; 18040.5; 6854.41 +2.80165e+06; 9616.35; 18171.9; 6854.41 +2.80165e+06; 10001; 18303.2; 6854.41 +2.80165e+06; 10385.7; 18434.5; 6854.41 +2.80165e+06; 10770.3; 18565.9; 6854.41 +2.80165e+06; 11155; 18697.2; 6854.41 +2.80165e+06; 11539.6; 18828.5; 6854.41 +2.80165e+06; 11924.3; 18959.8; 6854.41 +2.80165e+06; 12308.9; 19091.2; 6854.41 +2.80165e+06; 12693.6; 19222.5; 6854.41 +2.80165e+06; 13078.2; 19353.8; 6854.41 +2.80165e+06; 13462.9; 19485.2; 6854.41 +2.80165e+06; 13847.5; 19616.5; 6854.41 +2.80165e+06; 14232.2; 19747.8; 6854.41 +2.80165e+06; 14616.9; 19879.1; 6854.41 +2.80165e+06; 15001.5; 20010.5; 6854.41 +2.80165e+06; 15386.2; 20141.8; 6854.41 +2.80165e+06; 15770.8; 20273.1; 6854.41 +2.80165e+06; 16155.5; 20404.5; 6854.41 +2.80165e+06; 16540.1; 20535.8; 6854.41 +2.80165e+06; 16924.8; 20667.1; 6854.41 +2.80165e+06; 17309.4; 20798.4; 6854.41 +2.80165e+06; 17694.1; 20929.8; 6854.41 +2.80165e+06; 18078.7; 21061.1; 6854.41 +2.80165e+06; 18463.4; 21192.4; 6854.41 +2.80165e+06; 18848.1; 21323.8; 6854.41 +2.80165e+06; 19232.7; 21455.1; 6854.41 + +2.81879e+06; 0; 14971; 6896.35 +2.81879e+06; 383.308; 15102.6; 6896.35 +2.81879e+06; 766.617; 15234.2; 6896.35 +2.81879e+06; 1149.92; 15365.7; 6896.35 +2.81879e+06; 1533.23; 15497.3; 6896.35 +2.81879e+06; 1916.54; 15628.9; 6896.35 +2.81879e+06; 2299.85; 15760.5; 6896.35 +2.81879e+06; 2683.16; 15892.1; 6896.35 +2.81879e+06; 3066.47; 16023.7; 6896.35 +2.81879e+06; 3449.77; 16155.3; 6896.35 +2.81879e+06; 3833.08; 16286.9; 6896.35 +2.81879e+06; 4216.39; 16418.5; 6896.35 +2.81879e+06; 4599.7; 16550.1; 6896.35 +2.81879e+06; 4983.01; 16681.7; 6896.35 +2.81879e+06; 5366.32; 16813.3; 6896.35 +2.81879e+06; 5749.62; 16944.9; 6896.35 +2.81879e+06; 6132.93; 17076.4; 6896.35 +2.81879e+06; 6516.24; 17208; 6896.35 +2.81879e+06; 6899.55; 17339.6; 6896.35 +2.81879e+06; 7282.86; 17471.2; 6896.35 +2.81879e+06; 7666.17; 17602.8; 6896.35 +2.81879e+06; 8049.47; 17734.4; 6896.35 +2.81879e+06; 8432.78; 17866; 6896.35 +2.81879e+06; 8816.09; 17997.6; 6896.35 +2.81879e+06; 9199.4; 18129.2; 6896.35 +2.81879e+06; 9582.71; 18260.8; 6896.35 +2.81879e+06; 9966.02; 18392.4; 6896.35 +2.81879e+06; 10349.3; 18524; 6896.35 +2.81879e+06; 10732.6; 18655.5; 6896.35 +2.81879e+06; 11115.9; 18787.1; 6896.35 +2.81879e+06; 11499.2; 18918.7; 6896.35 +2.81879e+06; 11882.6; 19050.3; 6896.35 +2.81879e+06; 12265.9; 19181.9; 6896.35 +2.81879e+06; 12649.2; 19313.5; 6896.35 +2.81879e+06; 13032.5; 19445.1; 6896.35 +2.81879e+06; 13415.8; 19576.7; 6896.35 +2.81879e+06; 13799.1; 19708.3; 6896.35 +2.81879e+06; 14182.4; 19839.9; 6896.35 +2.81879e+06; 14565.7; 19971.5; 6896.35 +2.81879e+06; 14949; 20103.1; 6896.35 +2.81879e+06; 15332.3; 20234.7; 6896.35 +2.81879e+06; 15715.6; 20366.2; 6896.35 +2.81879e+06; 16098.9; 20497.8; 6896.35 +2.81879e+06; 16482.3; 20629.4; 6896.35 +2.81879e+06; 16865.6; 20761; 6896.35 +2.81879e+06; 17248.9; 20892.6; 6896.35 +2.81879e+06; 17632.2; 21024.2; 6896.35 +2.81879e+06; 18015.5; 21155.8; 6896.35 +2.81879e+06; 18398.8; 21287.4; 6896.35 +2.81879e+06; 18782.1; 21419; 6896.35 +2.81879e+06; 19165.4; 21550.6; 6896.35 + +2.83593e+06; 0; 15053.4; 6938.28 +2.83593e+06; 381.962; 15185.2; 6938.28 +2.83593e+06; 763.925; 15317.1; 6938.28 +2.83593e+06; 1145.89; 15448.9; 6938.28 +2.83593e+06; 1527.85; 15580.8; 6938.28 +2.83593e+06; 1909.81; 15712.6; 6938.28 +2.83593e+06; 2291.77; 15844.5; 6938.28 +2.83593e+06; 2673.74; 15976.3; 6938.28 +2.83593e+06; 3055.7; 16108.2; 6938.28 +2.83593e+06; 3437.66; 16240; 6938.28 +2.83593e+06; 3819.62; 16371.9; 6938.28 +2.83593e+06; 4201.59; 16503.7; 6938.28 +2.83593e+06; 4583.55; 16635.6; 6938.28 +2.83593e+06; 4965.51; 16767.4; 6938.28 +2.83593e+06; 5347.47; 16899.3; 6938.28 +2.83593e+06; 5729.44; 17031.2; 6938.28 +2.83593e+06; 6111.4; 17163; 6938.28 +2.83593e+06; 6493.36; 17294.9; 6938.28 +2.83593e+06; 6875.32; 17426.7; 6938.28 +2.83593e+06; 7257.29; 17558.6; 6938.28 +2.83593e+06; 7639.25; 17690.4; 6938.28 +2.83593e+06; 8021.21; 17822.3; 6938.28 +2.83593e+06; 8403.17; 17954.1; 6938.28 +2.83593e+06; 8785.14; 18086; 6938.28 +2.83593e+06; 9167.1; 18217.8; 6938.28 +2.83593e+06; 9549.06; 18349.7; 6938.28 +2.83593e+06; 9931.02; 18481.5; 6938.28 +2.83593e+06; 10313; 18613.4; 6938.28 +2.83593e+06; 10694.9; 18745.2; 6938.28 +2.83593e+06; 11076.9; 18877.1; 6938.28 +2.83593e+06; 11458.9; 19008.9; 6938.28 +2.83593e+06; 11840.8; 19140.8; 6938.28 +2.83593e+06; 12222.8; 19272.6; 6938.28 +2.83593e+06; 12604.8; 19404.5; 6938.28 +2.83593e+06; 12986.7; 19536.3; 6938.28 +2.83593e+06; 13368.7; 19668.2; 6938.28 +2.83593e+06; 13750.6; 19800; 6938.28 +2.83593e+06; 14132.6; 19931.9; 6938.28 +2.83593e+06; 14514.6; 20063.7; 6938.28 +2.83593e+06; 14896.5; 20195.6; 6938.28 +2.83593e+06; 15278.5; 20327.5; 6938.28 +2.83593e+06; 15660.5; 20459.3; 6938.28 +2.83593e+06; 16042.4; 20591.2; 6938.28 +2.83593e+06; 16424.4; 20723; 6938.28 +2.83593e+06; 16806.3; 20854.9; 6938.28 +2.83593e+06; 17188.3; 20986.7; 6938.28 +2.83593e+06; 17570.3; 21118.6; 6938.28 +2.83593e+06; 17952.2; 21250.4; 6938.28 +2.83593e+06; 18334.2; 21382.3; 6938.28 +2.83593e+06; 18716.2; 21514.1; 6938.28 +2.83593e+06; 19098.1; 21646; 6938.28 + +2.85307e+06; 0; 15135.9; 6980.21 +2.85307e+06; 380.617; 15268; 6980.21 +2.85307e+06; 761.233; 15400.1; 6980.21 +2.85307e+06; 1141.85; 15532.2; 6980.21 +2.85307e+06; 1522.47; 15664.3; 6980.21 +2.85307e+06; 1903.08; 15796.4; 6980.21 +2.85307e+06; 2283.7; 15928.5; 6980.21 +2.85307e+06; 2664.32; 16060.6; 6980.21 +2.85307e+06; 3044.93; 16192.7; 6980.21 +2.85307e+06; 3425.55; 16324.9; 6980.21 +2.85307e+06; 3806.17; 16457; 6980.21 +2.85307e+06; 4186.78; 16589.1; 6980.21 +2.85307e+06; 4567.4; 16721.2; 6980.21 +2.85307e+06; 4948.02; 16853.3; 6980.21 +2.85307e+06; 5328.63; 16985.4; 6980.21 +2.85307e+06; 5709.25; 17117.5; 6980.21 +2.85307e+06; 6089.87; 17249.6; 6980.21 +2.85307e+06; 6470.48; 17381.7; 6980.21 +2.85307e+06; 6851.1; 17513.8; 6980.21 +2.85307e+06; 7231.72; 17645.9; 6980.21 +2.85307e+06; 7612.33; 17778; 6980.21 +2.85307e+06; 7992.95; 17910.1; 6980.21 +2.85307e+06; 8373.57; 18042.3; 6980.21 +2.85307e+06; 8754.18; 18174.4; 6980.21 +2.85307e+06; 9134.8; 18306.5; 6980.21 +2.85307e+06; 9515.42; 18438.6; 6980.21 +2.85307e+06; 9896.03; 18570.7; 6980.21 +2.85307e+06; 10276.6; 18702.8; 6980.21 +2.85307e+06; 10657.3; 18834.9; 6980.21 +2.85307e+06; 11037.9; 18967; 6980.21 +2.85307e+06; 11418.5; 19099.1; 6980.21 +2.85307e+06; 11799.1; 19231.2; 6980.21 +2.85307e+06; 12179.7; 19363.3; 6980.21 +2.85307e+06; 12560.3; 19495.4; 6980.21 +2.85307e+06; 12941; 19627.5; 6980.21 +2.85307e+06; 13321.6; 19759.6; 6980.21 +2.85307e+06; 13702.2; 19891.8; 6980.21 +2.85307e+06; 14082.8; 20023.9; 6980.21 +2.85307e+06; 14463.4; 20156; 6980.21 +2.85307e+06; 14844; 20288.1; 6980.21 +2.85307e+06; 15224.7; 20420.2; 6980.21 +2.85307e+06; 15605.3; 20552.3; 6980.21 +2.85307e+06; 15985.9; 20684.4; 6980.21 +2.85307e+06; 16366.5; 20816.5; 6980.21 +2.85307e+06; 16747.1; 20948.6; 6980.21 +2.85307e+06; 17127.7; 21080.7; 6980.21 +2.85307e+06; 17508.4; 21212.8; 6980.21 +2.85307e+06; 17889; 21344.9; 6980.21 +2.85307e+06; 18269.6; 21477; 6980.21 +2.85307e+06; 18650.2; 21609.2; 6980.21 +2.85307e+06; 19030.8; 21741.3; 6980.21 + +2.87021e+06; 0; 15218.5; 7022.14 +2.87021e+06; 379.271; 15350.9; 7022.14 +2.87021e+06; 758.542; 15483.2; 7022.14 +2.87021e+06; 1137.81; 15615.6; 7022.14 +2.87021e+06; 1517.08; 15747.9; 7022.14 +2.87021e+06; 1896.35; 15880.3; 7022.14 +2.87021e+06; 2275.62; 16012.7; 7022.14 +2.87021e+06; 2654.9; 16145; 7022.14 +2.87021e+06; 3034.17; 16277.4; 7022.14 +2.87021e+06; 3413.44; 16409.7; 7022.14 +2.87021e+06; 3792.71; 16542.1; 7022.14 +2.87021e+06; 4171.98; 16674.5; 7022.14 +2.87021e+06; 4551.25; 16806.8; 7022.14 +2.87021e+06; 4930.52; 16939.2; 7022.14 +2.87021e+06; 5309.79; 17071.5; 7022.14 +2.87021e+06; 5689.06; 17203.9; 7022.14 +2.87021e+06; 6068.33; 17336.2; 7022.14 +2.87021e+06; 6447.6; 17468.6; 7022.14 +2.87021e+06; 6826.87; 17601; 7022.14 +2.87021e+06; 7206.15; 17733.3; 7022.14 +2.87021e+06; 7585.42; 17865.7; 7022.14 +2.87021e+06; 7964.69; 17998; 7022.14 +2.87021e+06; 8343.96; 18130.4; 7022.14 +2.87021e+06; 8723.23; 18262.8; 7022.14 +2.87021e+06; 9102.5; 18395.1; 7022.14 +2.87021e+06; 9481.77; 18527.5; 7022.14 +2.87021e+06; 9861.04; 18659.8; 7022.14 +2.87021e+06; 10240.3; 18792.2; 7022.14 +2.87021e+06; 10619.6; 18924.6; 7022.14 +2.87021e+06; 10998.9; 19056.9; 7022.14 +2.87021e+06; 11378.1; 19189.3; 7022.14 +2.87021e+06; 11757.4; 19321.6; 7022.14 +2.87021e+06; 12136.7; 19454; 7022.14 +2.87021e+06; 12515.9; 19586.3; 7022.14 +2.87021e+06; 12895.2; 19718.7; 7022.14 +2.87021e+06; 13274.5; 19851.1; 7022.14 +2.87021e+06; 13653.7; 19983.4; 7022.14 +2.87021e+06; 14033; 20115.8; 7022.14 +2.87021e+06; 14412.3; 20248.1; 7022.14 +2.87021e+06; 14791.6; 20380.5; 7022.14 +2.87021e+06; 15170.8; 20512.9; 7022.14 +2.87021e+06; 15550.1; 20645.2; 7022.14 +2.87021e+06; 15929.4; 20777.6; 7022.14 +2.87021e+06; 16308.6; 20909.9; 7022.14 +2.87021e+06; 16687.9; 21042.3; 7022.14 +2.87021e+06; 17067.2; 21174.7; 7022.14 +2.87021e+06; 17446.5; 21307; 7022.14 +2.87021e+06; 17825.7; 21439.4; 7022.14 +2.87021e+06; 18205; 21571.7; 7022.14 +2.87021e+06; 18584.3; 21704.1; 7022.14 +2.87021e+06; 18963.5; 21836.5; 7022.14 + +2.88735e+06; 0; 15301.2; 7064.08 +2.88735e+06; 377.925; 15433.8; 7064.08 +2.88735e+06; 755.85; 15566.4; 7064.08 +2.88735e+06; 1133.77; 15699; 7064.08 +2.88735e+06; 1511.7; 15831.7; 7064.08 +2.88735e+06; 1889.62; 15964.3; 7064.08 +2.88735e+06; 2267.55; 16096.9; 7064.08 +2.88735e+06; 2645.47; 16229.5; 7064.08 +2.88735e+06; 3023.4; 16362.1; 7064.08 +2.88735e+06; 3401.32; 16494.7; 7064.08 +2.88735e+06; 3779.25; 16627.3; 7064.08 +2.88735e+06; 4157.17; 16759.9; 7064.08 +2.88735e+06; 4535.1; 16892.5; 7064.08 +2.88735e+06; 4913.02; 17025.1; 7064.08 +2.88735e+06; 5290.95; 17157.7; 7064.08 +2.88735e+06; 5668.87; 17290.3; 7064.08 +2.88735e+06; 6046.8; 17422.9; 7064.08 +2.88735e+06; 6424.72; 17555.5; 7064.08 +2.88735e+06; 6802.65; 17688.1; 7064.08 +2.88735e+06; 7180.57; 17820.7; 7064.08 +2.88735e+06; 7558.5; 17953.4; 7064.08 +2.88735e+06; 7936.42; 18086; 7064.08 +2.88735e+06; 8314.35; 18218.6; 7064.08 +2.88735e+06; 8692.27; 18351.2; 7064.08 +2.88735e+06; 9070.2; 18483.8; 7064.08 +2.88735e+06; 9448.12; 18616.4; 7064.08 +2.88735e+06; 9826.05; 18749; 7064.08 +2.88735e+06; 10204; 18881.6; 7064.08 +2.88735e+06; 10581.9; 19014.2; 7064.08 +2.88735e+06; 10959.8; 19146.8; 7064.08 +2.88735e+06; 11337.7; 19279.4; 7064.08 +2.88735e+06; 11715.7; 19412; 7064.08 +2.88735e+06; 12093.6; 19544.6; 7064.08 +2.88735e+06; 12471.5; 19677.2; 7064.08 +2.88735e+06; 12849.4; 19809.8; 7064.08 +2.88735e+06; 13227.4; 19942.4; 7064.08 +2.88735e+06; 13605.3; 20075.1; 7064.08 +2.88735e+06; 13983.2; 20207.7; 7064.08 +2.88735e+06; 14361.1; 20340.3; 7064.08 +2.88735e+06; 14739.1; 20472.9; 7064.08 +2.88735e+06; 15117; 20605.5; 7064.08 +2.88735e+06; 15494.9; 20738.1; 7064.08 +2.88735e+06; 15872.8; 20870.7; 7064.08 +2.88735e+06; 16250.8; 21003.3; 7064.08 +2.88735e+06; 16628.7; 21135.9; 7064.08 +2.88735e+06; 17006.6; 21268.5; 7064.08 +2.88735e+06; 17384.5; 21401.1; 7064.08 +2.88735e+06; 17762.5; 21533.7; 7064.08 +2.88735e+06; 18140.4; 21666.3; 7064.08 +2.88735e+06; 18518.3; 21798.9; 7064.08 +2.88735e+06; 18896.2; 21931.5; 7064.08 + +2.90449e+06; 0; 15384.1; 7106.01 +2.90449e+06; 376.579; 15516.9; 7106.01 +2.90449e+06; 753.158; 15649.8; 7106.01 +2.90449e+06; 1129.74; 15782.6; 7106.01 +2.90449e+06; 1506.32; 15915.5; 7106.01 +2.90449e+06; 1882.9; 16048.3; 7106.01 +2.90449e+06; 2259.47; 16181.2; 7106.01 +2.90449e+06; 2636.05; 16314; 7106.01 +2.90449e+06; 3012.63; 16446.9; 7106.01 +2.90449e+06; 3389.21; 16579.7; 7106.01 +2.90449e+06; 3765.79; 16712.6; 7106.01 +2.90449e+06; 4142.37; 16845.4; 7106.01 +2.90449e+06; 4518.95; 16978.3; 7106.01 +2.90449e+06; 4895.53; 17111.1; 7106.01 +2.90449e+06; 5272.11; 17243.9; 7106.01 +2.90449e+06; 5648.69; 17376.8; 7106.01 +2.90449e+06; 6025.27; 17509.6; 7106.01 +2.90449e+06; 6401.85; 17642.5; 7106.01 +2.90449e+06; 6778.42; 17775.3; 7106.01 +2.90449e+06; 7155; 17908.2; 7106.01 +2.90449e+06; 7531.58; 18041; 7106.01 +2.90449e+06; 7908.16; 18173.9; 7106.01 +2.90449e+06; 8284.74; 18306.7; 7106.01 +2.90449e+06; 8661.32; 18439.6; 7106.01 +2.90449e+06; 9037.9; 18572.4; 7106.01 +2.90449e+06; 9414.48; 18705.3; 7106.01 +2.90449e+06; 9791.06; 18838.1; 7106.01 +2.90449e+06; 10167.6; 18971; 7106.01 +2.90449e+06; 10544.2; 19103.8; 7106.01 +2.90449e+06; 10920.8; 19236.7; 7106.01 +2.90449e+06; 11297.4; 19369.5; 7106.01 +2.90449e+06; 11674; 19502.4; 7106.01 +2.90449e+06; 12050.5; 19635.2; 7106.01 +2.90449e+06; 12427.1; 19768.1; 7106.01 +2.90449e+06; 12803.7; 19900.9; 7106.01 +2.90449e+06; 13180.3; 20033.8; 7106.01 +2.90449e+06; 13556.8; 20166.6; 7106.01 +2.90449e+06; 13933.4; 20299.5; 7106.01 +2.90449e+06; 14310; 20432.3; 7106.01 +2.90449e+06; 14686.6; 20565.2; 7106.01 +2.90449e+06; 15063.2; 20698; 7106.01 +2.90449e+06; 15439.7; 20830.9; 7106.01 +2.90449e+06; 15816.3; 20963.7; 7106.01 +2.90449e+06; 16192.9; 21096.6; 7106.01 +2.90449e+06; 16569.5; 21229.4; 7106.01 +2.90449e+06; 16946.1; 21362.3; 7106.01 +2.90449e+06; 17322.6; 21495.1; 7106.01 +2.90449e+06; 17699.2; 21628; 7106.01 +2.90449e+06; 18075.8; 21760.8; 7106.01 +2.90449e+06; 18452.4; 21893.7; 7106.01 +2.90449e+06; 18829; 22026.5; 7106.01 + +2.92163e+06; 0; 15467; 7147.94 +2.92163e+06; 375.233; 15600.1; 7147.94 +2.92163e+06; 750.467; 15733.2; 7147.94 +2.92163e+06; 1125.7; 15866.3; 7147.94 +2.92163e+06; 1500.93; 15999.4; 7147.94 +2.92163e+06; 1876.17; 16132.4; 7147.94 +2.92163e+06; 2251.4; 16265.5; 7147.94 +2.92163e+06; 2626.63; 16398.6; 7147.94 +2.92163e+06; 3001.87; 16531.7; 7147.94 +2.92163e+06; 3377.1; 16664.8; 7147.94 +2.92163e+06; 3752.33; 16797.9; 7147.94 +2.92163e+06; 4127.57; 16931; 7147.94 +2.92163e+06; 4502.8; 17064.1; 7147.94 +2.92163e+06; 4878.03; 17197.1; 7147.94 +2.92163e+06; 5253.27; 17330.2; 7147.94 +2.92163e+06; 5628.5; 17463.3; 7147.94 +2.92163e+06; 6003.73; 17596.4; 7147.94 +2.92163e+06; 6378.97; 17729.5; 7147.94 +2.92163e+06; 6754.2; 17862.6; 7147.94 +2.92163e+06; 7129.43; 17995.7; 7147.94 +2.92163e+06; 7504.67; 18128.8; 7147.94 +2.92163e+06; 7879.9; 18261.9; 7147.94 +2.92163e+06; 8255.13; 18394.9; 7147.94 +2.92163e+06; 8630.37; 18528; 7147.94 +2.92163e+06; 9005.6; 18661.1; 7147.94 +2.92163e+06; 9380.83; 18794.2; 7147.94 +2.92163e+06; 9756.07; 18927.3; 7147.94 +2.92163e+06; 10131.3; 19060.4; 7147.94 +2.92163e+06; 10506.5; 19193.5; 7147.94 +2.92163e+06; 10881.8; 19326.6; 7147.94 +2.92163e+06; 11257; 19459.6; 7147.94 +2.92163e+06; 11632.2; 19592.7; 7147.94 +2.92163e+06; 12007.5; 19725.8; 7147.94 +2.92163e+06; 12382.7; 19858.9; 7147.94 +2.92163e+06; 12757.9; 19992; 7147.94 +2.92163e+06; 13133.2; 20125.1; 7147.94 +2.92163e+06; 13508.4; 20258.2; 7147.94 +2.92163e+06; 13883.6; 20391.3; 7147.94 +2.92163e+06; 14258.9; 20524.4; 7147.94 +2.92163e+06; 14634.1; 20657.4; 7147.94 +2.92163e+06; 15009.3; 20790.5; 7147.94 +2.92163e+06; 15384.6; 20923.6; 7147.94 +2.92163e+06; 15759.8; 21056.7; 7147.94 +2.92163e+06; 16135; 21189.8; 7147.94 +2.92163e+06; 16510.3; 21322.9; 7147.94 +2.92163e+06; 16885.5; 21456; 7147.94 +2.92163e+06; 17260.7; 21589.1; 7147.94 +2.92163e+06; 17636; 21722.1; 7147.94 +2.92163e+06; 18011.2; 21855.2; 7147.94 +2.92163e+06; 18386.4; 21988.3; 7147.94 +2.92163e+06; 18761.7; 22121.4; 7147.94 + +2.93877e+06; 0; 15550; 7189.87 +2.93877e+06; 373.887; 15683.4; 7189.87 +2.93877e+06; 747.775; 15816.7; 7189.87 +2.93877e+06; 1121.66; 15950; 7189.87 +2.93877e+06; 1495.55; 16083.3; 7189.87 +2.93877e+06; 1869.44; 16216.7; 7189.87 +2.93877e+06; 2243.32; 16350; 7189.87 +2.93877e+06; 2617.21; 16483.3; 7189.87 +2.93877e+06; 2991.1; 16616.6; 7189.87 +2.93877e+06; 3364.99; 16749.9; 7189.87 +2.93877e+06; 3738.87; 16883.3; 7189.87 +2.93877e+06; 4112.76; 17016.6; 7189.87 +2.93877e+06; 4486.65; 17149.9; 7189.87 +2.93877e+06; 4860.54; 17283.2; 7189.87 +2.93877e+06; 5234.42; 17416.6; 7189.87 +2.93877e+06; 5608.31; 17549.9; 7189.87 +2.93877e+06; 5982.2; 17683.2; 7189.87 +2.93877e+06; 6356.09; 17816.5; 7189.87 +2.93877e+06; 6729.97; 17949.9; 7189.87 +2.93877e+06; 7103.86; 18083.2; 7189.87 +2.93877e+06; 7477.75; 18216.5; 7189.87 +2.93877e+06; 7851.64; 18349.8; 7189.87 +2.93877e+06; 8225.52; 18483.1; 7189.87 +2.93877e+06; 8599.41; 18616.5; 7189.87 +2.93877e+06; 8973.3; 18749.8; 7189.87 +2.93877e+06; 9347.19; 18883.1; 7189.87 +2.93877e+06; 9721.07; 19016.4; 7189.87 +2.93877e+06; 10095; 19149.8; 7189.87 +2.93877e+06; 10468.8; 19283.1; 7189.87 +2.93877e+06; 10842.7; 19416.4; 7189.87 +2.93877e+06; 11216.6; 19549.7; 7189.87 +2.93877e+06; 11590.5; 19683.1; 7189.87 +2.93877e+06; 11964.4; 19816.4; 7189.87 +2.93877e+06; 12338.3; 19949.7; 7189.87 +2.93877e+06; 12712.2; 20083; 7189.87 +2.93877e+06; 13086.1; 20216.3; 7189.87 +2.93877e+06; 13459.9; 20349.7; 7189.87 +2.93877e+06; 13833.8; 20483; 7189.87 +2.93877e+06; 14207.7; 20616.3; 7189.87 +2.93877e+06; 14581.6; 20749.6; 7189.87 +2.93877e+06; 14955.5; 20883; 7189.87 +2.93877e+06; 15329.4; 21016.3; 7189.87 +2.93877e+06; 15703.3; 21149.6; 7189.87 +2.93877e+06; 16077.2; 21282.9; 7189.87 +2.93877e+06; 16451; 21416.3; 7189.87 +2.93877e+06; 16824.9; 21549.6; 7189.87 +2.93877e+06; 17198.8; 21682.9; 7189.87 +2.93877e+06; 17572.7; 21816.2; 7189.87 +2.93877e+06; 17946.6; 21949.5; 7189.87 +2.93877e+06; 18320.5; 22082.9; 7189.87 +2.93877e+06; 18694.4; 22216.2; 7189.87 + +2.95591e+06; 0; 15633.2; 7231.81 +2.95591e+06; 372.542; 15766.8; 7231.81 +2.95591e+06; 745.083; 15900.3; 7231.81 +2.95591e+06; 1117.62; 16033.9; 7231.81 +2.95591e+06; 1490.17; 16167.4; 7231.81 +2.95591e+06; 1862.71; 16301; 7231.81 +2.95591e+06; 2235.25; 16434.5; 7231.81 +2.95591e+06; 2607.79; 16568.1; 7231.81 +2.95591e+06; 2980.33; 16701.6; 7231.81 +2.95591e+06; 3352.87; 16835.2; 7231.81 +2.95591e+06; 3725.42; 16968.7; 7231.81 +2.95591e+06; 4097.96; 17102.3; 7231.81 +2.95591e+06; 4470.5; 17235.8; 7231.81 +2.95591e+06; 4843.04; 17369.4; 7231.81 +2.95591e+06; 5215.58; 17502.9; 7231.81 +2.95591e+06; 5588.12; 17636.5; 7231.81 +2.95591e+06; 5960.67; 17770.1; 7231.81 +2.95591e+06; 6333.21; 17903.6; 7231.81 +2.95591e+06; 6705.75; 18037.2; 7231.81 +2.95591e+06; 7078.29; 18170.7; 7231.81 +2.95591e+06; 7450.83; 18304.3; 7231.81 +2.95591e+06; 7823.37; 18437.8; 7231.81 +2.95591e+06; 8195.92; 18571.4; 7231.81 +2.95591e+06; 8568.46; 18704.9; 7231.81 +2.95591e+06; 8941; 18838.5; 7231.81 +2.95591e+06; 9313.54; 18972; 7231.81 +2.95591e+06; 9686.08; 19105.6; 7231.81 +2.95591e+06; 10058.6; 19239.1; 7231.81 +2.95591e+06; 10431.2; 19372.7; 7231.81 +2.95591e+06; 10803.7; 19506.2; 7231.81 +2.95591e+06; 11176.2; 19639.8; 7231.81 +2.95591e+06; 11548.8; 19773.4; 7231.81 +2.95591e+06; 11921.3; 19906.9; 7231.81 +2.95591e+06; 12293.9; 20040.5; 7231.81 +2.95591e+06; 12666.4; 20174; 7231.81 +2.95591e+06; 13039; 20307.6; 7231.81 +2.95591e+06; 13411.5; 20441.1; 7231.81 +2.95591e+06; 13784; 20574.7; 7231.81 +2.95591e+06; 14156.6; 20708.2; 7231.81 +2.95591e+06; 14529.1; 20841.8; 7231.81 +2.95591e+06; 14901.7; 20975.3; 7231.81 +2.95591e+06; 15274.2; 21108.9; 7231.81 +2.95591e+06; 15646.7; 21242.4; 7231.81 +2.95591e+06; 16019.3; 21376; 7231.81 +2.95591e+06; 16391.8; 21509.5; 7231.81 +2.95591e+06; 16764.4; 21643.1; 7231.81 +2.95591e+06; 17136.9; 21776.7; 7231.81 +2.95591e+06; 17509.5; 21910.2; 7231.81 +2.95591e+06; 17882; 22043.8; 7231.81 +2.95591e+06; 18254.5; 22177.3; 7231.81 +2.95591e+06; 18627.1; 22310.9; 7231.81 + +2.97305e+06; 0; 15716.5; 7273.74 +2.97305e+06; 371.196; 15850.2; 7273.74 +2.97305e+06; 742.392; 15984; 7273.74 +2.97305e+06; 1113.59; 16117.8; 7273.74 +2.97305e+06; 1484.78; 16251.6; 7273.74 +2.97305e+06; 1855.98; 16385.4; 7273.74 +2.97305e+06; 2227.17; 16519.1; 7273.74 +2.97305e+06; 2598.37; 16652.9; 7273.74 +2.97305e+06; 2969.57; 16786.7; 7273.74 +2.97305e+06; 3340.76; 16920.5; 7273.74 +2.97305e+06; 3711.96; 17054.3; 7273.74 +2.97305e+06; 4083.15; 17188; 7273.74 +2.97305e+06; 4454.35; 17321.8; 7273.74 +2.97305e+06; 4825.55; 17455.6; 7273.74 +2.97305e+06; 5196.74; 17589.4; 7273.74 +2.97305e+06; 5567.94; 17723.2; 7273.74 +2.97305e+06; 5939.13; 17856.9; 7273.74 +2.97305e+06; 6310.33; 17990.7; 7273.74 +2.97305e+06; 6681.52; 18124.5; 7273.74 +2.97305e+06; 7052.72; 18258.3; 7273.74 +2.97305e+06; 7423.92; 18392; 7273.74 +2.97305e+06; 7795.11; 18525.8; 7273.74 +2.97305e+06; 8166.31; 18659.6; 7273.74 +2.97305e+06; 8537.5; 18793.4; 7273.74 +2.97305e+06; 8908.7; 18927.2; 7273.74 +2.97305e+06; 9279.9; 19060.9; 7273.74 +2.97305e+06; 9651.09; 19194.7; 7273.74 +2.97305e+06; 10022.3; 19328.5; 7273.74 +2.97305e+06; 10393.5; 19462.3; 7273.74 +2.97305e+06; 10764.7; 19596.1; 7273.74 +2.97305e+06; 11135.9; 19729.8; 7273.74 +2.97305e+06; 11507.1; 19863.6; 7273.74 +2.97305e+06; 11878.3; 19997.4; 7273.74 +2.97305e+06; 12249.5; 20131.2; 7273.74 +2.97305e+06; 12620.7; 20265; 7273.74 +2.97305e+06; 12991.9; 20398.7; 7273.74 +2.97305e+06; 13363; 20532.5; 7273.74 +2.97305e+06; 13734.2; 20666.3; 7273.74 +2.97305e+06; 14105.4; 20800.1; 7273.74 +2.97305e+06; 14476.6; 20933.9; 7273.74 +2.97305e+06; 14847.8; 21067.6; 7273.74 +2.97305e+06; 15219; 21201.4; 7273.74 +2.97305e+06; 15590.2; 21335.2; 7273.74 +2.97305e+06; 15961.4; 21469; 7273.74 +2.97305e+06; 16332.6; 21602.8; 7273.74 +2.97305e+06; 16703.8; 21736.5; 7273.74 +2.97305e+06; 17075; 21870.3; 7273.74 +2.97305e+06; 17446.2; 22004.1; 7273.74 +2.97305e+06; 17817.4; 22137.9; 7273.74 +2.97305e+06; 18188.6; 22271.7; 7273.74 +2.97305e+06; 18559.8; 22405.4; 7273.74 + +2.99019e+06; 0; 15799.8; 7315.67 +2.99019e+06; 369.85; 15933.8; 7315.67 +2.99019e+06; 739.7; 16067.8; 7315.67 +2.99019e+06; 1109.55; 16201.8; 7315.67 +2.99019e+06; 1479.4; 16335.8; 7315.67 +2.99019e+06; 1849.25; 16469.8; 7315.67 +2.99019e+06; 2219.1; 16603.8; 7315.67 +2.99019e+06; 2588.95; 16737.8; 7315.67 +2.99019e+06; 2958.8; 16871.8; 7315.67 +2.99019e+06; 3328.65; 17005.8; 7315.67 +2.99019e+06; 3698.5; 17139.8; 7315.67 +2.99019e+06; 4068.35; 17273.8; 7315.67 +2.99019e+06; 4438.2; 17407.8; 7315.67 +2.99019e+06; 4808.05; 17541.8; 7315.67 +2.99019e+06; 5177.9; 17675.8; 7315.67 +2.99019e+06; 5547.75; 17809.8; 7315.67 +2.99019e+06; 5917.6; 17943.9; 7315.67 +2.99019e+06; 6287.45; 18077.9; 7315.67 +2.99019e+06; 6657.3; 18211.9; 7315.67 +2.99019e+06; 7027.15; 18345.9; 7315.67 +2.99019e+06; 7397; 18479.9; 7315.67 +2.99019e+06; 7766.85; 18613.9; 7315.67 +2.99019e+06; 8136.7; 18747.9; 7315.67 +2.99019e+06; 8506.55; 18881.9; 7315.67 +2.99019e+06; 8876.4; 19015.9; 7315.67 +2.99019e+06; 9246.25; 19149.9; 7315.67 +2.99019e+06; 9616.1; 19283.9; 7315.67 +2.99019e+06; 9985.95; 19417.9; 7315.67 +2.99019e+06; 10355.8; 19551.9; 7315.67 +2.99019e+06; 10725.6; 19685.9; 7315.67 +2.99019e+06; 11095.5; 19819.9; 7315.67 +2.99019e+06; 11465.3; 19953.9; 7315.67 +2.99019e+06; 11835.2; 20087.9; 7315.67 +2.99019e+06; 12205; 20221.9; 7315.67 +2.99019e+06; 12574.9; 20355.9; 7315.67 +2.99019e+06; 12944.7; 20489.9; 7315.67 +2.99019e+06; 13314.6; 20623.9; 7315.67 +2.99019e+06; 13684.4; 20757.9; 7315.67 +2.99019e+06; 14054.3; 20891.9; 7315.67 +2.99019e+06; 14424.1; 21025.9; 7315.67 +2.99019e+06; 14794; 21159.9; 7315.67 +2.99019e+06; 15163.8; 21293.9; 7315.67 +2.99019e+06; 15533.7; 21427.9; 7315.67 +2.99019e+06; 15903.5; 21561.9; 7315.67 +2.99019e+06; 16273.4; 21695.9; 7315.67 +2.99019e+06; 16643.2; 21829.9; 7315.67 +2.99019e+06; 17013.1; 21963.9; 7315.67 +2.99019e+06; 17382.9; 22097.9; 7315.67 +2.99019e+06; 17752.8; 22231.9; 7315.67 +2.99019e+06; 18122.6; 22365.9; 7315.67 +2.99019e+06; 18492.5; 22499.9; 7315.67 + +3.00732e+06; 0; 15883.3; 7357.6 +3.00732e+06; 368.504; 16017.5; 7357.6 +3.00732e+06; 737.008; 16151.7; 7357.6 +3.00732e+06; 1105.51; 16286; 7357.6 +3.00732e+06; 1474.02; 16420.2; 7357.6 +3.00732e+06; 1842.52; 16554.4; 7357.6 +3.00732e+06; 2211.02; 16688.6; 7357.6 +3.00732e+06; 2579.53; 16822.8; 7357.6 +3.00732e+06; 2948.03; 16957.1; 7357.6 +3.00732e+06; 3316.54; 17091.3; 7357.6 +3.00732e+06; 3685.04; 17225.5; 7357.6 +3.00732e+06; 4053.55; 17359.7; 7357.6 +3.00732e+06; 4422.05; 17493.9; 7357.6 +3.00732e+06; 4790.55; 17628.2; 7357.6 +3.00732e+06; 5159.06; 17762.4; 7357.6 +3.00732e+06; 5527.56; 17896.6; 7357.6 +3.00732e+06; 5896.07; 18030.8; 7357.6 +3.00732e+06; 6264.57; 18165; 7357.6 +3.00732e+06; 6633.07; 18299.2; 7357.6 +3.00732e+06; 7001.58; 18433.5; 7357.6 +3.00732e+06; 7370.08; 18567.7; 7357.6 +3.00732e+06; 7738.59; 18701.9; 7357.6 +3.00732e+06; 8107.09; 18836.1; 7357.6 +3.00732e+06; 8475.6; 18970.3; 7357.6 +3.00732e+06; 8844.1; 19104.6; 7357.6 +3.00732e+06; 9212.6; 19238.8; 7357.6 +3.00732e+06; 9581.11; 19373; 7357.6 +3.00732e+06; 9949.61; 19507.2; 7357.6 +3.00732e+06; 10318.1; 19641.4; 7357.6 +3.00732e+06; 10686.6; 19775.7; 7357.6 +3.00732e+06; 11055.1; 19909.9; 7357.6 +3.00732e+06; 11423.6; 20044.1; 7357.6 +3.00732e+06; 11792.1; 20178.3; 7357.6 +3.00732e+06; 12160.6; 20312.5; 7357.6 +3.00732e+06; 12529.1; 20446.8; 7357.6 +3.00732e+06; 12897.6; 20581; 7357.6 +3.00732e+06; 13266.1; 20715.2; 7357.6 +3.00732e+06; 13634.7; 20849.4; 7357.6 +3.00732e+06; 14003.2; 20983.6; 7357.6 +3.00732e+06; 14371.7; 21117.9; 7357.6 +3.00732e+06; 14740.2; 21252.1; 7357.6 +3.00732e+06; 15108.7; 21386.3; 7357.6 +3.00732e+06; 15477.2; 21520.5; 7357.6 +3.00732e+06; 15845.7; 21654.7; 7357.6 +3.00732e+06; 16214.2; 21789; 7357.6 +3.00732e+06; 16582.7; 21923.2; 7357.6 +3.00732e+06; 16951.2; 22057.4; 7357.6 +3.00732e+06; 17319.7; 22191.6; 7357.6 +3.00732e+06; 17688.2; 22325.8; 7357.6 +3.00732e+06; 18056.7; 22460.1; 7357.6 +3.00732e+06; 18425.2; 22594.3; 7357.6 + +3.02446e+06; 0; 15966.9; 7399.54 +3.02446e+06; 367.158; 16101.3; 7399.54 +3.02446e+06; 734.317; 16235.7; 7399.54 +3.02446e+06; 1101.47; 16370.2; 7399.54 +3.02446e+06; 1468.63; 16504.6; 7399.54 +3.02446e+06; 1835.79; 16639; 7399.54 +3.02446e+06; 2202.95; 16773.5; 7399.54 +3.02446e+06; 2570.11; 16907.9; 7399.54 +3.02446e+06; 2937.27; 17042.3; 7399.54 +3.02446e+06; 3304.42; 17176.8; 7399.54 +3.02446e+06; 3671.58; 17311.2; 7399.54 +3.02446e+06; 4038.74; 17445.6; 7399.54 +3.02446e+06; 4405.9; 17580.1; 7399.54 +3.02446e+06; 4773.06; 17714.5; 7399.54 +3.02446e+06; 5140.22; 17848.9; 7399.54 +3.02446e+06; 5507.37; 17983.4; 7399.54 +3.02446e+06; 5874.53; 18117.8; 7399.54 +3.02446e+06; 6241.69; 18252.2; 7399.54 +3.02446e+06; 6608.85; 18386.7; 7399.54 +3.02446e+06; 6976.01; 18521.1; 7399.54 +3.02446e+06; 7343.17; 18655.5; 7399.54 +3.02446e+06; 7710.32; 18790; 7399.54 +3.02446e+06; 8077.48; 18924.4; 7399.54 +3.02446e+06; 8444.64; 19058.8; 7399.54 +3.02446e+06; 8811.8; 19193.3; 7399.54 +3.02446e+06; 9178.96; 19327.7; 7399.54 +3.02446e+06; 9546.12; 19462.1; 7399.54 +3.02446e+06; 9913.27; 19596.6; 7399.54 +3.02446e+06; 10280.4; 19731; 7399.54 +3.02446e+06; 10647.6; 19865.4; 7399.54 +3.02446e+06; 11014.7; 19999.9; 7399.54 +3.02446e+06; 11381.9; 20134.3; 7399.54 +3.02446e+06; 11749.1; 20268.7; 7399.54 +3.02446e+06; 12116.2; 20403.2; 7399.54 +3.02446e+06; 12483.4; 20537.6; 7399.54 +3.02446e+06; 12850.5; 20672; 7399.54 +3.02446e+06; 13217.7; 20806.5; 7399.54 +3.02446e+06; 13584.9; 20940.9; 7399.54 +3.02446e+06; 13952; 21075.3; 7399.54 +3.02446e+06; 14319.2; 21209.8; 7399.54 +3.02446e+06; 14686.3; 21344.2; 7399.54 +3.02446e+06; 15053.5; 21478.6; 7399.54 +3.02446e+06; 15420.6; 21613.1; 7399.54 +3.02446e+06; 15787.8; 21747.5; 7399.54 +3.02446e+06; 16155; 21881.9; 7399.54 +3.02446e+06; 16522.1; 22016.4; 7399.54 +3.02446e+06; 16889.3; 22150.8; 7399.54 +3.02446e+06; 17256.4; 22285.2; 7399.54 +3.02446e+06; 17623.6; 22419.7; 7399.54 +3.02446e+06; 17990.8; 22554.1; 7399.54 +3.02446e+06; 18357.9; 22688.5; 7399.54 + +3.0416e+06; 0; 16050.6; 7441.47 +3.0416e+06; 365.812; 16185.2; 7441.47 +3.0416e+06; 731.625; 16319.9; 7441.47 +3.0416e+06; 1097.44; 16454.5; 7441.47 +3.0416e+06; 1463.25; 16589.1; 7441.47 +3.0416e+06; 1829.06; 16723.8; 7441.47 +3.0416e+06; 2194.87; 16858.4; 7441.47 +3.0416e+06; 2560.69; 16993.1; 7441.47 +3.0416e+06; 2926.5; 17127.7; 7441.47 +3.0416e+06; 3292.31; 17262.4; 7441.47 +3.0416e+06; 3658.12; 17397; 7441.47 +3.0416e+06; 4023.94; 17531.6; 7441.47 +3.0416e+06; 4389.75; 17666.3; 7441.47 +3.0416e+06; 4755.56; 17800.9; 7441.47 +3.0416e+06; 5121.37; 17935.6; 7441.47 +3.0416e+06; 5487.19; 18070.2; 7441.47 +3.0416e+06; 5853; 18204.9; 7441.47 +3.0416e+06; 6218.81; 18339.5; 7441.47 +3.0416e+06; 6584.62; 18474.1; 7441.47 +3.0416e+06; 6950.44; 18608.8; 7441.47 +3.0416e+06; 7316.25; 18743.4; 7441.47 +3.0416e+06; 7682.06; 18878.1; 7441.47 +3.0416e+06; 8047.87; 19012.7; 7441.47 +3.0416e+06; 8413.69; 19147.3; 7441.47 +3.0416e+06; 8779.5; 19282; 7441.47 +3.0416e+06; 9145.31; 19416.6; 7441.47 +3.0416e+06; 9511.12; 19551.3; 7441.47 +3.0416e+06; 9876.94; 19685.9; 7441.47 +3.0416e+06; 10242.7; 19820.6; 7441.47 +3.0416e+06; 10608.6; 19955.2; 7441.47 +3.0416e+06; 10974.4; 20089.8; 7441.47 +3.0416e+06; 11340.2; 20224.5; 7441.47 +3.0416e+06; 11706; 20359.1; 7441.47 +3.0416e+06; 12071.8; 20493.8; 7441.47 +3.0416e+06; 12437.6; 20628.4; 7441.47 +3.0416e+06; 12803.4; 20763.1; 7441.47 +3.0416e+06; 13169.2; 20897.7; 7441.47 +3.0416e+06; 13535.1; 21032.3; 7441.47 +3.0416e+06; 13900.9; 21167; 7441.47 +3.0416e+06; 14266.7; 21301.6; 7441.47 +3.0416e+06; 14632.5; 21436.3; 7441.47 +3.0416e+06; 14998.3; 21570.9; 7441.47 +3.0416e+06; 15364.1; 21705.5; 7441.47 +3.0416e+06; 15729.9; 21840.2; 7441.47 +3.0416e+06; 16095.7; 21974.8; 7441.47 +3.0416e+06; 16461.6; 22109.5; 7441.47 +3.0416e+06; 16827.4; 22244.1; 7441.47 +3.0416e+06; 17193.2; 22378.8; 7441.47 +3.0416e+06; 17559; 22513.4; 7441.47 +3.0416e+06; 17924.8; 22648; 7441.47 +3.0416e+06; 18290.6; 22782.7; 7441.47 + +3.05874e+06; 0; 16134.4; 7483.4 +3.05874e+06; 364.467; 16269.2; 7483.4 +3.05874e+06; 728.933; 16404.1; 7483.4 +3.05874e+06; 1093.4; 16538.9; 7483.4 +3.05874e+06; 1457.87; 16673.8; 7483.4 +3.05874e+06; 1822.33; 16808.6; 7483.4 +3.05874e+06; 2186.8; 16943.5; 7483.4 +3.05874e+06; 2551.27; 17078.3; 7483.4 +3.05874e+06; 2915.73; 17213.2; 7483.4 +3.05874e+06; 3280.2; 17348; 7483.4 +3.05874e+06; 3644.67; 17482.8; 7483.4 +3.05874e+06; 4009.13; 17617.7; 7483.4 +3.05874e+06; 4373.6; 17752.5; 7483.4 +3.05874e+06; 4738.07; 17887.4; 7483.4 +3.05874e+06; 5102.53; 18022.2; 7483.4 +3.05874e+06; 5467; 18157.1; 7483.4 +3.05874e+06; 5831.47; 18291.9; 7483.4 +3.05874e+06; 6195.93; 18426.8; 7483.4 +3.05874e+06; 6560.4; 18561.6; 7483.4 +3.05874e+06; 6924.87; 18696.5; 7483.4 +3.05874e+06; 7289.33; 18831.3; 7483.4 +3.05874e+06; 7653.8; 18966.2; 7483.4 +3.05874e+06; 8018.27; 19101; 7483.4 +3.05874e+06; 8382.73; 19235.9; 7483.4 +3.05874e+06; 8747.2; 19370.7; 7483.4 +3.05874e+06; 9111.67; 19505.6; 7483.4 +3.05874e+06; 9476.13; 19640.4; 7483.4 +3.05874e+06; 9840.6; 19775.2; 7483.4 +3.05874e+06; 10205.1; 19910.1; 7483.4 +3.05874e+06; 10569.5; 20044.9; 7483.4 +3.05874e+06; 10934; 20179.8; 7483.4 +3.05874e+06; 11298.5; 20314.6; 7483.4 +3.05874e+06; 11662.9; 20449.5; 7483.4 +3.05874e+06; 12027.4; 20584.3; 7483.4 +3.05874e+06; 12391.9; 20719.2; 7483.4 +3.05874e+06; 12756.3; 20854; 7483.4 +3.05874e+06; 13120.8; 20988.9; 7483.4 +3.05874e+06; 13485.3; 21123.7; 7483.4 +3.05874e+06; 13849.7; 21258.6; 7483.4 +3.05874e+06; 14214.2; 21393.4; 7483.4 +3.05874e+06; 14578.7; 21528.3; 7483.4 +3.05874e+06; 14943.1; 21663.1; 7483.4 +3.05874e+06; 15307.6; 21798; 7483.4 +3.05874e+06; 15672.1; 21932.8; 7483.4 +3.05874e+06; 16036.5; 22067.7; 7483.4 +3.05874e+06; 16401; 22202.5; 7483.4 +3.05874e+06; 16765.5; 22337.3; 7483.4 +3.05874e+06; 17129.9; 22472.2; 7483.4 +3.05874e+06; 17494.4; 22607; 7483.4 +3.05874e+06; 17858.9; 22741.9; 7483.4 +3.05874e+06; 18223.3; 22876.7; 7483.4 + +3.07588e+06; 0; 16218.3; 7525.33 +3.07588e+06; 363.121; 16353.3; 7525.33 +3.07588e+06; 726.242; 16488.4; 7525.33 +3.07588e+06; 1089.36; 16623.4; 7525.33 +3.07588e+06; 1452.48; 16758.5; 7525.33 +3.07588e+06; 1815.6; 16893.5; 7525.33 +3.07588e+06; 2178.72; 17028.6; 7525.33 +3.07588e+06; 2541.85; 17163.6; 7525.33 +3.07588e+06; 2904.97; 17298.7; 7525.33 +3.07588e+06; 3268.09; 17433.7; 7525.33 +3.07588e+06; 3631.21; 17568.8; 7525.33 +3.07588e+06; 3994.33; 17703.8; 7525.33 +3.07588e+06; 4357.45; 17838.9; 7525.33 +3.07588e+06; 4720.57; 17973.9; 7525.33 +3.07588e+06; 5083.69; 18109; 7525.33 +3.07588e+06; 5446.81; 18244; 7525.33 +3.07588e+06; 5809.93; 18379; 7525.33 +3.07588e+06; 6173.05; 18514.1; 7525.33 +3.07588e+06; 6536.17; 18649.1; 7525.33 +3.07588e+06; 6899.3; 18784.2; 7525.33 +3.07588e+06; 7262.42; 18919.2; 7525.33 +3.07588e+06; 7625.54; 19054.3; 7525.33 +3.07588e+06; 7988.66; 19189.3; 7525.33 +3.07588e+06; 8351.78; 19324.4; 7525.33 +3.07588e+06; 8714.9; 19459.4; 7525.33 +3.07588e+06; 9078.02; 19594.5; 7525.33 +3.07588e+06; 9441.14; 19729.5; 7525.33 +3.07588e+06; 9804.26; 19864.6; 7525.33 +3.07588e+06; 10167.4; 19999.6; 7525.33 +3.07588e+06; 10530.5; 20134.7; 7525.33 +3.07588e+06; 10893.6; 20269.7; 7525.33 +3.07588e+06; 11256.7; 20404.8; 7525.33 +3.07588e+06; 11619.9; 20539.8; 7525.33 +3.07588e+06; 11983; 20674.9; 7525.33 +3.07588e+06; 12346.1; 20809.9; 7525.33 +3.07588e+06; 12709.2; 20945; 7525.33 +3.07588e+06; 13072.3; 21080; 7525.33 +3.07588e+06; 13435.5; 21215.1; 7525.33 +3.07588e+06; 13798.6; 21350.1; 7525.33 +3.07588e+06; 14161.7; 21485.2; 7525.33 +3.07588e+06; 14524.8; 21620.2; 7525.33 +3.07588e+06; 14888; 21755.2; 7525.33 +3.07588e+06; 15251.1; 21890.3; 7525.33 +3.07588e+06; 15614.2; 22025.3; 7525.33 +3.07588e+06; 15977.3; 22160.4; 7525.33 +3.07588e+06; 16340.4; 22295.4; 7525.33 +3.07588e+06; 16703.6; 22430.5; 7525.33 +3.07588e+06; 17066.7; 22565.5; 7525.33 +3.07588e+06; 17429.8; 22700.6; 7525.33 +3.07588e+06; 17792.9; 22835.6; 7525.33 +3.07588e+06; 18156; 22970.7; 7525.33 + +3.09302e+06; 0; 16302.3; 7567.27 +3.09302e+06; 361.775; 16437.5; 7567.27 +3.09302e+06; 723.55; 16572.8; 7567.27 +3.09302e+06; 1085.32; 16708; 7567.27 +3.09302e+06; 1447.1; 16843.3; 7567.27 +3.09302e+06; 1808.87; 16978.5; 7567.27 +3.09302e+06; 2170.65; 17113.8; 7567.27 +3.09302e+06; 2532.42; 17249; 7567.27 +3.09302e+06; 2894.2; 17384.3; 7567.27 +3.09302e+06; 3255.97; 17519.5; 7567.27 +3.09302e+06; 3617.75; 17654.7; 7567.27 +3.09302e+06; 3979.52; 17790; 7567.27 +3.09302e+06; 4341.3; 17925.2; 7567.27 +3.09302e+06; 4703.07; 18060.5; 7567.27 +3.09302e+06; 5064.85; 18195.7; 7567.27 +3.09302e+06; 5426.62; 18331; 7567.27 +3.09302e+06; 5788.4; 18466.2; 7567.27 +3.09302e+06; 6150.17; 18601.5; 7567.27 +3.09302e+06; 6511.95; 18736.7; 7567.27 +3.09302e+06; 6873.72; 18871.9; 7567.27 +3.09302e+06; 7235.5; 19007.2; 7567.27 +3.09302e+06; 7597.27; 19142.4; 7567.27 +3.09302e+06; 7959.05; 19277.7; 7567.27 +3.09302e+06; 8320.82; 19412.9; 7567.27 +3.09302e+06; 8682.6; 19548.2; 7567.27 +3.09302e+06; 9044.37; 19683.4; 7567.27 +3.09302e+06; 9406.15; 19818.7; 7567.27 +3.09302e+06; 9767.92; 19953.9; 7567.27 +3.09302e+06; 10129.7; 20089.1; 7567.27 +3.09302e+06; 10491.5; 20224.4; 7567.27 +3.09302e+06; 10853.2; 20359.6; 7567.27 +3.09302e+06; 11215; 20494.9; 7567.27 +3.09302e+06; 11576.8; 20630.1; 7567.27 +3.09302e+06; 11938.6; 20765.4; 7567.27 +3.09302e+06; 12300.3; 20900.6; 7567.27 +3.09302e+06; 12662.1; 21035.9; 7567.27 +3.09302e+06; 13023.9; 21171.1; 7567.27 +3.09302e+06; 13385.7; 21306.3; 7567.27 +3.09302e+06; 13747.4; 21441.6; 7567.27 +3.09302e+06; 14109.2; 21576.8; 7567.27 +3.09302e+06; 14471; 21712.1; 7567.27 +3.09302e+06; 14832.8; 21847.3; 7567.27 +3.09302e+06; 15194.5; 21982.6; 7567.27 +3.09302e+06; 15556.3; 22117.8; 7567.27 +3.09302e+06; 15918.1; 22253.1; 7567.27 +3.09302e+06; 16279.9; 22388.3; 7567.27 +3.09302e+06; 16641.6; 22523.5; 7567.27 +3.09302e+06; 17003.4; 22658.8; 7567.27 +3.09302e+06; 17365.2; 22794; 7567.27 +3.09302e+06; 17727; 22929.3; 7567.27 +3.09302e+06; 18088.7; 23064.5; 7567.27 + +3.11016e+06; 0; 16386.4; 7609.2 +3.11016e+06; 360.429; 16521.9; 7609.2 +3.11016e+06; 720.858; 16657.3; 7609.2 +3.11016e+06; 1081.29; 16792.7; 7609.2 +3.11016e+06; 1441.72; 16928.2; 7609.2 +3.11016e+06; 1802.15; 17063.6; 7609.2 +3.11016e+06; 2162.57; 17199; 7609.2 +3.11016e+06; 2523; 17334.5; 7609.2 +3.11016e+06; 2883.43; 17469.9; 7609.2 +3.11016e+06; 3243.86; 17605.3; 7609.2 +3.11016e+06; 3604.29; 17740.8; 7609.2 +3.11016e+06; 3964.72; 17876.2; 7609.2 +3.11016e+06; 4325.15; 18011.7; 7609.2 +3.11016e+06; 4685.58; 18147.1; 7609.2 +3.11016e+06; 5046.01; 18282.5; 7609.2 +3.11016e+06; 5406.44; 18418; 7609.2 +3.11016e+06; 5766.87; 18553.4; 7609.2 +3.11016e+06; 6127.3; 18688.8; 7609.2 +3.11016e+06; 6487.72; 18824.3; 7609.2 +3.11016e+06; 6848.15; 18959.7; 7609.2 +3.11016e+06; 7208.58; 19095.2; 7609.2 +3.11016e+06; 7569.01; 19230.6; 7609.2 +3.11016e+06; 7929.44; 19366; 7609.2 +3.11016e+06; 8289.87; 19501.5; 7609.2 +3.11016e+06; 8650.3; 19636.9; 7609.2 +3.11016e+06; 9010.73; 19772.3; 7609.2 +3.11016e+06; 9371.16; 19907.8; 7609.2 +3.11016e+06; 9731.59; 20043.2; 7609.2 +3.11016e+06; 10092; 20178.6; 7609.2 +3.11016e+06; 10452.4; 20314.1; 7609.2 +3.11016e+06; 10812.9; 20449.5; 7609.2 +3.11016e+06; 11173.3; 20585; 7609.2 +3.11016e+06; 11533.7; 20720.4; 7609.2 +3.11016e+06; 11894.2; 20855.8; 7609.2 +3.11016e+06; 12254.6; 20991.3; 7609.2 +3.11016e+06; 12615; 21126.7; 7609.2 +3.11016e+06; 12975.4; 21262.1; 7609.2 +3.11016e+06; 13335.9; 21397.6; 7609.2 +3.11016e+06; 13696.3; 21533; 7609.2 +3.11016e+06; 14056.7; 21668.4; 7609.2 +3.11016e+06; 14417.2; 21803.9; 7609.2 +3.11016e+06; 14777.6; 21939.3; 7609.2 +3.11016e+06; 15138; 22074.8; 7609.2 +3.11016e+06; 15498.5; 22210.2; 7609.2 +3.11016e+06; 15858.9; 22345.6; 7609.2 +3.11016e+06; 16219.3; 22481.1; 7609.2 +3.11016e+06; 16579.7; 22616.5; 7609.2 +3.11016e+06; 16940.2; 22751.9; 7609.2 +3.11016e+06; 17300.6; 22887.4; 7609.2 +3.11016e+06; 17661; 23022.8; 7609.2 +3.11016e+06; 18021.5; 23158.3; 7609.2 + +3.1273e+06; 0; 16470.7; 7651.13 +3.1273e+06; 359.083; 16606.3; 7651.13 +3.1273e+06; 718.167; 16741.9; 7651.13 +3.1273e+06; 1077.25; 16877.5; 7651.13 +3.1273e+06; 1436.33; 17013.2; 7651.13 +3.1273e+06; 1795.42; 17148.8; 7651.13 +3.1273e+06; 2154.5; 17284.4; 7651.13 +3.1273e+06; 2513.58; 17420; 7651.13 +3.1273e+06; 2872.67; 17555.6; 7651.13 +3.1273e+06; 3231.75; 17691.3; 7651.13 +3.1273e+06; 3590.83; 17826.9; 7651.13 +3.1273e+06; 3949.92; 17962.5; 7651.13 +3.1273e+06; 4309; 18098.1; 7651.13 +3.1273e+06; 4668.08; 18233.8; 7651.13 +3.1273e+06; 5027.17; 18369.4; 7651.13 +3.1273e+06; 5386.25; 18505; 7651.13 +3.1273e+06; 5745.33; 18640.6; 7651.13 +3.1273e+06; 6104.42; 18776.3; 7651.13 +3.1273e+06; 6463.5; 18911.9; 7651.13 +3.1273e+06; 6822.58; 19047.5; 7651.13 +3.1273e+06; 7181.67; 19183.1; 7651.13 +3.1273e+06; 7540.75; 19318.8; 7651.13 +3.1273e+06; 7899.83; 19454.4; 7651.13 +3.1273e+06; 8258.92; 19590; 7651.13 +3.1273e+06; 8618; 19725.6; 7651.13 +3.1273e+06; 8977.08; 19861.3; 7651.13 +3.1273e+06; 9336.17; 19996.9; 7651.13 +3.1273e+06; 9695.25; 20132.5; 7651.13 +3.1273e+06; 10054.3; 20268.1; 7651.13 +3.1273e+06; 10413.4; 20403.8; 7651.13 +3.1273e+06; 10772.5; 20539.4; 7651.13 +3.1273e+06; 11131.6; 20675; 7651.13 +3.1273e+06; 11490.7; 20810.6; 7651.13 +3.1273e+06; 11849.7; 20946.3; 7651.13 +3.1273e+06; 12208.8; 21081.9; 7651.13 +3.1273e+06; 12567.9; 21217.5; 7651.13 +3.1273e+06; 12927; 21353.1; 7651.13 +3.1273e+06; 13286.1; 21488.8; 7651.13 +3.1273e+06; 13645.2; 21624.4; 7651.13 +3.1273e+06; 14004.2; 21760; 7651.13 +3.1273e+06; 14363.3; 21895.6; 7651.13 +3.1273e+06; 14722.4; 22031.3; 7651.13 +3.1273e+06; 15081.5; 22166.9; 7651.13 +3.1273e+06; 15440.6; 22302.5; 7651.13 +3.1273e+06; 15799.7; 22438.1; 7651.13 +3.1273e+06; 16158.7; 22573.8; 7651.13 +3.1273e+06; 16517.8; 22709.4; 7651.13 +3.1273e+06; 16876.9; 22845; 7651.13 +3.1273e+06; 17236; 22980.6; 7651.13 +3.1273e+06; 17595.1; 23116.3; 7651.13 +3.1273e+06; 17954.2; 23251.9; 7651.13 + +3.14444e+06; 0; 16555; 7693.06 +3.14444e+06; 357.737; 16690.8; 7693.06 +3.14444e+06; 715.475; 16826.6; 7693.06 +3.14444e+06; 1073.21; 16962.4; 7693.06 +3.14444e+06; 1430.95; 17098.2; 7693.06 +3.14444e+06; 1788.69; 17234; 7693.06 +3.14444e+06; 2146.42; 17369.8; 7693.06 +3.14444e+06; 2504.16; 17505.6; 7693.06 +3.14444e+06; 2861.9; 17641.5; 7693.06 +3.14444e+06; 3219.64; 17777.3; 7693.06 +3.14444e+06; 3577.37; 17913.1; 7693.06 +3.14444e+06; 3935.11; 18048.9; 7693.06 +3.14444e+06; 4292.85; 18184.7; 7693.06 +3.14444e+06; 4650.59; 18320.5; 7693.06 +3.14444e+06; 5008.32; 18456.3; 7693.06 +3.14444e+06; 5366.06; 18592.1; 7693.06 +3.14444e+06; 5723.8; 18727.9; 7693.06 +3.14444e+06; 6081.54; 18863.7; 7693.06 +3.14444e+06; 6439.27; 18999.5; 7693.06 +3.14444e+06; 6797.01; 19135.3; 7693.06 +3.14444e+06; 7154.75; 19271.2; 7693.06 +3.14444e+06; 7512.49; 19407; 7693.06 +3.14444e+06; 7870.22; 19542.8; 7693.06 +3.14444e+06; 8227.96; 19678.6; 7693.06 +3.14444e+06; 8585.7; 19814.4; 7693.06 +3.14444e+06; 8943.44; 19950.2; 7693.06 +3.14444e+06; 9301.17; 20086; 7693.06 +3.14444e+06; 9658.91; 20221.8; 7693.06 +3.14444e+06; 10016.6; 20357.6; 7693.06 +3.14444e+06; 10374.4; 20493.4; 7693.06 +3.14444e+06; 10732.1; 20629.2; 7693.06 +3.14444e+06; 11089.9; 20765; 7693.06 +3.14444e+06; 11447.6; 20900.9; 7693.06 +3.14444e+06; 11805.3; 21036.7; 7693.06 +3.14444e+06; 12163.1; 21172.5; 7693.06 +3.14444e+06; 12520.8; 21308.3; 7693.06 +3.14444e+06; 12878.5; 21444.1; 7693.06 +3.14444e+06; 13236.3; 21579.9; 7693.06 +3.14444e+06; 13594; 21715.7; 7693.06 +3.14444e+06; 13951.8; 21851.5; 7693.06 +3.14444e+06; 14309.5; 21987.3; 7693.06 +3.14444e+06; 14667.2; 22123.1; 7693.06 +3.14444e+06; 15025; 22258.9; 7693.06 +3.14444e+06; 15382.7; 22394.7; 7693.06 +3.14444e+06; 15740.4; 22530.5; 7693.06 +3.14444e+06; 16098.2; 22666.4; 7693.06 +3.14444e+06; 16455.9; 22802.2; 7693.06 +3.14444e+06; 16813.7; 22938; 7693.06 +3.14444e+06; 17171.4; 23073.8; 7693.06 +3.14444e+06; 17529.1; 23209.6; 7693.06 +3.14444e+06; 17886.9; 23345.4; 7693.06 + +3.16158e+06; 0; 16639.4; 7735 +3.16158e+06; 356.392; 16775.4; 7735 +3.16158e+06; 712.783; 16911.4; 7735 +3.16158e+06; 1069.17; 17047.4; 7735 +3.16158e+06; 1425.57; 17183.4; 7735 +3.16158e+06; 1781.96; 17319.4; 7735 +3.16158e+06; 2138.35; 17455.4; 7735 +3.16158e+06; 2494.74; 17591.4; 7735 +3.16158e+06; 2851.13; 17727.3; 7735 +3.16158e+06; 3207.52; 17863.3; 7735 +3.16158e+06; 3563.92; 17999.3; 7735 +3.16158e+06; 3920.31; 18135.3; 7735 +3.16158e+06; 4276.7; 18271.3; 7735 +3.16158e+06; 4633.09; 18407.3; 7735 +3.16158e+06; 4989.48; 18543.3; 7735 +3.16158e+06; 5345.87; 18679.3; 7735 +3.16158e+06; 5702.27; 18815.2; 7735 +3.16158e+06; 6058.66; 18951.2; 7735 +3.16158e+06; 6415.05; 19087.2; 7735 +3.16158e+06; 6771.44; 19223.2; 7735 +3.16158e+06; 7127.83; 19359.2; 7735 +3.16158e+06; 7484.22; 19495.2; 7735 +3.16158e+06; 7840.62; 19631.2; 7735 +3.16158e+06; 8197.01; 19767.2; 7735 +3.16158e+06; 8553.4; 19903.1; 7735 +3.16158e+06; 8909.79; 20039.1; 7735 +3.16158e+06; 9266.18; 20175.1; 7735 +3.16158e+06; 9622.57; 20311.1; 7735 +3.16158e+06; 9978.97; 20447.1; 7735 +3.16158e+06; 10335.4; 20583.1; 7735 +3.16158e+06; 10691.7; 20719.1; 7735 +3.16158e+06; 11048.1; 20855.1; 7735 +3.16158e+06; 11404.5; 20991; 7735 +3.16158e+06; 11760.9; 21127; 7735 +3.16158e+06; 12117.3; 21263; 7735 +3.16158e+06; 12473.7; 21399; 7735 +3.16158e+06; 12830.1; 21535; 7735 +3.16158e+06; 13186.5; 21671; 7735 +3.16158e+06; 13542.9; 21807; 7735 +3.16158e+06; 13899.3; 21942.9; 7735 +3.16158e+06; 14255.7; 22078.9; 7735 +3.16158e+06; 14612.1; 22214.9; 7735 +3.16158e+06; 14968.4; 22350.9; 7735 +3.16158e+06; 15324.8; 22486.9; 7735 +3.16158e+06; 15681.2; 22622.9; 7735 +3.16158e+06; 16037.6; 22758.9; 7735 +3.16158e+06; 16394; 22894.9; 7735 +3.16158e+06; 16750.4; 23030.8; 7735 +3.16158e+06; 17106.8; 23166.8; 7735 +3.16158e+06; 17463.2; 23302.8; 7735 +3.16158e+06; 17819.6; 23438.8; 7735 + +3.17872e+06; 0; 16724; 7776.93 +3.17872e+06; 355.046; 16860.2; 7776.93 +3.17872e+06; 710.092; 16996.3; 7776.93 +3.17872e+06; 1065.14; 17132.5; 7776.93 +3.17872e+06; 1420.18; 17268.7; 7776.93 +3.17872e+06; 1775.23; 17404.8; 7776.93 +3.17872e+06; 2130.27; 17541; 7776.93 +3.17872e+06; 2485.32; 17677.1; 7776.93 +3.17872e+06; 2840.37; 17813.3; 7776.93 +3.17872e+06; 3195.41; 17949.5; 7776.93 +3.17872e+06; 3550.46; 18085.6; 7776.93 +3.17872e+06; 3905.5; 18221.8; 7776.93 +3.17872e+06; 4260.55; 18357.9; 7776.93 +3.17872e+06; 4615.6; 18494.1; 7776.93 +3.17872e+06; 4970.64; 18630.3; 7776.93 +3.17872e+06; 5325.69; 18766.4; 7776.93 +3.17872e+06; 5680.73; 18902.6; 7776.93 +3.17872e+06; 6035.78; 19038.8; 7776.93 +3.17872e+06; 6390.82; 19174.9; 7776.93 +3.17872e+06; 6745.87; 19311.1; 7776.93 +3.17872e+06; 7100.92; 19447.2; 7776.93 +3.17872e+06; 7455.96; 19583.4; 7776.93 +3.17872e+06; 7811.01; 19719.6; 7776.93 +3.17872e+06; 8166.05; 19855.7; 7776.93 +3.17872e+06; 8521.1; 19991.9; 7776.93 +3.17872e+06; 8876.15; 20128.1; 7776.93 +3.17872e+06; 9231.19; 20264.2; 7776.93 +3.17872e+06; 9586.24; 20400.4; 7776.93 +3.17872e+06; 9941.28; 20536.5; 7776.93 +3.17872e+06; 10296.3; 20672.7; 7776.93 +3.17872e+06; 10651.4; 20808.9; 7776.93 +3.17872e+06; 11006.4; 20945; 7776.93 +3.17872e+06; 11361.5; 21081.2; 7776.93 +3.17872e+06; 11716.5; 21217.4; 7776.93 +3.17872e+06; 12071.6; 21353.5; 7776.93 +3.17872e+06; 12426.6; 21489.7; 7776.93 +3.17872e+06; 12781.6; 21625.8; 7776.93 +3.17872e+06; 13136.7; 21762; 7776.93 +3.17872e+06; 13491.7; 21898.2; 7776.93 +3.17872e+06; 13846.8; 22034.3; 7776.93 +3.17872e+06; 14201.8; 22170.5; 7776.93 +3.17872e+06; 14556.9; 22306.7; 7776.93 +3.17872e+06; 14911.9; 22442.8; 7776.93 +3.17872e+06; 15267; 22579; 7776.93 +3.17872e+06; 15622; 22715.1; 7776.93 +3.17872e+06; 15977.1; 22851.3; 7776.93 +3.17872e+06; 16332.1; 22987.5; 7776.93 +3.17872e+06; 16687.2; 23123.6; 7776.93 +3.17872e+06; 17042.2; 23259.8; 7776.93 +3.17872e+06; 17397.2; 23396; 7776.93 +3.17872e+06; 17752.3; 23532.1; 7776.93 + +3.19586e+06; 0; 16808.7; 7818.86 +3.19586e+06; 353.7; 16945; 7818.86 +3.19586e+06; 707.4; 17081.3; 7818.86 +3.19586e+06; 1061.1; 17217.7; 7818.86 +3.19586e+06; 1414.8; 17354; 7818.86 +3.19586e+06; 1768.5; 17490.3; 7818.86 +3.19586e+06; 2122.2; 17626.7; 7818.86 +3.19586e+06; 2475.9; 17763; 7818.86 +3.19586e+06; 2829.6; 17899.3; 7818.86 +3.19586e+06; 3183.3; 18035.7; 7818.86 +3.19586e+06; 3537; 18172; 7818.86 +3.19586e+06; 3890.7; 18308.3; 7818.86 +3.19586e+06; 4244.4; 18444.7; 7818.86 +3.19586e+06; 4598.1; 18581; 7818.86 +3.19586e+06; 4951.8; 18717.3; 7818.86 +3.19586e+06; 5305.5; 18853.7; 7818.86 +3.19586e+06; 5659.2; 18990; 7818.86 +3.19586e+06; 6012.9; 19126.3; 7818.86 +3.19586e+06; 6366.6; 19262.7; 7818.86 +3.19586e+06; 6720.3; 19399; 7818.86 +3.19586e+06; 7074; 19535.3; 7818.86 +3.19586e+06; 7427.7; 19671.7; 7818.86 +3.19586e+06; 7781.4; 19808; 7818.86 +3.19586e+06; 8135.1; 19944.3; 7818.86 +3.19586e+06; 8488.8; 20080.7; 7818.86 +3.19586e+06; 8842.5; 20217; 7818.86 +3.19586e+06; 9196.2; 20353.3; 7818.86 +3.19586e+06; 9549.9; 20489.7; 7818.86 +3.19586e+06; 9903.6; 20626; 7818.86 +3.19586e+06; 10257.3; 20762.3; 7818.86 +3.19586e+06; 10611; 20898.7; 7818.86 +3.19586e+06; 10964.7; 21035; 7818.86 +3.19586e+06; 11318.4; 21171.3; 7818.86 +3.19586e+06; 11672.1; 21307.7; 7818.86 +3.19586e+06; 12025.8; 21444; 7818.86 +3.19586e+06; 12379.5; 21580.3; 7818.86 +3.19586e+06; 12733.2; 21716.7; 7818.86 +3.19586e+06; 13086.9; 21853; 7818.86 +3.19586e+06; 13440.6; 21989.3; 7818.86 +3.19586e+06; 13794.3; 22125.7; 7818.86 +3.19586e+06; 14148; 22262; 7818.86 +3.19586e+06; 14501.7; 22398.3; 7818.86 +3.19586e+06; 14855.4; 22534.6; 7818.86 +3.19586e+06; 15209.1; 22671; 7818.86 +3.19586e+06; 15562.8; 22807.3; 7818.86 +3.19586e+06; 15916.5; 22943.6; 7818.86 +3.19586e+06; 16270.2; 23080; 7818.86 +3.19586e+06; 16623.9; 23216.3; 7818.86 +3.19586e+06; 16977.6; 23352.6; 7818.86 +3.19586e+06; 17331.3; 23489; 7818.86 +3.19586e+06; 17685; 23625.3; 7818.86 + +3.213e+06; 0; 16893.4; 7860.79 +3.213e+06; 352.354; 17029.9; 7860.79 +3.213e+06; 704.708; 17166.4; 7860.79 +3.213e+06; 1057.06; 17302.9; 7860.79 +3.213e+06; 1409.42; 17439.4; 7860.79 +3.213e+06; 1761.77; 17575.9; 7860.79 +3.213e+06; 2114.12; 17712.4; 7860.79 +3.213e+06; 2466.48; 17848.9; 7860.79 +3.213e+06; 2818.83; 17985.4; 7860.79 +3.213e+06; 3171.19; 18121.9; 7860.79 +3.213e+06; 3523.54; 18258.4; 7860.79 +3.213e+06; 3875.9; 18394.9; 7860.79 +3.213e+06; 4228.25; 18531.4; 7860.79 +3.213e+06; 4580.6; 18667.9; 7860.79 +3.213e+06; 4932.96; 18804.4; 7860.79 +3.213e+06; 5285.31; 18940.9; 7860.79 +3.213e+06; 5637.67; 19077.4; 7860.79 +3.213e+06; 5990.02; 19213.9; 7860.79 +3.213e+06; 6342.37; 19350.4; 7860.79 +3.213e+06; 6694.73; 19486.9; 7860.79 +3.213e+06; 7047.08; 19623.4; 7860.79 +3.213e+06; 7399.44; 19759.9; 7860.79 +3.213e+06; 7751.79; 19896.4; 7860.79 +3.213e+06; 8104.15; 20032.9; 7860.79 +3.213e+06; 8456.5; 20169.4; 7860.79 +3.213e+06; 8808.85; 20305.9; 7860.79 +3.213e+06; 9161.21; 20442.4; 7860.79 +3.213e+06; 9513.56; 20578.9; 7860.79 +3.213e+06; 9865.92; 20715.4; 7860.79 +3.213e+06; 10218.3; 20851.9; 7860.79 +3.213e+06; 10570.6; 20988.4; 7860.79 +3.213e+06; 10923; 21124.9; 7860.79 +3.213e+06; 11275.3; 21261.4; 7860.79 +3.213e+06; 11627.7; 21397.9; 7860.79 +3.213e+06; 11980; 21534.4; 7860.79 +3.213e+06; 12332.4; 21670.9; 7860.79 +3.213e+06; 12684.7; 21807.4; 7860.79 +3.213e+06; 13037.1; 21943.9; 7860.79 +3.213e+06; 13389.5; 22080.4; 7860.79 +3.213e+06; 13741.8; 22216.9; 7860.79 +3.213e+06; 14094.2; 22353.4; 7860.79 +3.213e+06; 14446.5; 22489.9; 7860.79 +3.213e+06; 14798.9; 22626.4; 7860.79 +3.213e+06; 15151.2; 22762.9; 7860.79 +3.213e+06; 15503.6; 22899.4; 7860.79 +3.213e+06; 15855.9; 23035.9; 7860.79 +3.213e+06; 16208.3; 23172.4; 7860.79 +3.213e+06; 16560.6; 23308.9; 7860.79 +3.213e+06; 16913; 23445.4; 7860.79 +3.213e+06; 17265.4; 23581.9; 7860.79 +3.213e+06; 17617.7; 23718.4; 7860.79 + +3.27037e+06; 0; 17178.1; 8001.17 +3.27037e+06; 338.26; 17311.3; 8001.17 +3.27037e+06; 676.52; 17444.5; 8001.17 +3.27037e+06; 1014.78; 17577.8; 8001.17 +3.27037e+06; 1353.04; 17711; 8001.17 +3.27037e+06; 1691.3; 17844.3; 8001.17 +3.27037e+06; 2029.56; 17977.5; 8001.17 +3.27037e+06; 2367.82; 18110.8; 8001.17 +3.27037e+06; 2706.08; 18244; 8001.17 +3.27037e+06; 3044.34; 18377.3; 8001.17 +3.27037e+06; 3382.6; 18510.5; 8001.17 +3.27037e+06; 3720.86; 18643.8; 8001.17 +3.27037e+06; 4059.12; 18777; 8001.17 +3.27037e+06; 4397.38; 18910.3; 8001.17 +3.27037e+06; 4735.64; 19043.5; 8001.17 +3.27037e+06; 5073.9; 19176.8; 8001.17 +3.27037e+06; 5412.16; 19310; 8001.17 +3.27037e+06; 5750.42; 19443.2; 8001.17 +3.27037e+06; 6088.68; 19576.5; 8001.17 +3.27037e+06; 6426.94; 19709.7; 8001.17 +3.27037e+06; 6765.2; 19843; 8001.17 +3.27037e+06; 7103.46; 19976.2; 8001.17 +3.27037e+06; 7441.72; 20109.5; 8001.17 +3.27037e+06; 7779.98; 20242.7; 8001.17 +3.27037e+06; 8118.24; 20376; 8001.17 +3.27037e+06; 8456.5; 20509.2; 8001.17 +3.27037e+06; 8794.76; 20642.5; 8001.17 +3.27037e+06; 9133.02; 20775.7; 8001.17 +3.27037e+06; 9471.28; 20909; 8001.17 +3.27037e+06; 9809.54; 21042.2; 8001.17 +3.27037e+06; 10147.8; 21175.5; 8001.17 +3.27037e+06; 10486.1; 21308.7; 8001.17 +3.27037e+06; 10824.3; 21441.9; 8001.17 +3.27037e+06; 11162.6; 21575.2; 8001.17 +3.27037e+06; 11500.8; 21708.4; 8001.17 +3.27037e+06; 11839.1; 21841.7; 8001.17 +3.27037e+06; 12177.4; 21974.9; 8001.17 +3.27037e+06; 12515.6; 22108.2; 8001.17 +3.27037e+06; 12853.9; 22241.4; 8001.17 +3.27037e+06; 13192.1; 22374.7; 8001.17 +3.27037e+06; 13530.4; 22507.9; 8001.17 +3.27037e+06; 13868.7; 22641.2; 8001.17 +3.27037e+06; 14206.9; 22774.4; 8001.17 +3.27037e+06; 14545.2; 22907.7; 8001.17 +3.27037e+06; 14883.4; 23040.9; 8001.17 +3.27037e+06; 15221.7; 23174.2; 8001.17 +3.27037e+06; 15560; 23307.4; 8001.17 +3.27037e+06; 15898.2; 23440.6; 8001.17 +3.27037e+06; 16236.5; 23573.9; 8001.17 +3.27037e+06; 16574.7; 23707.1; 8001.17 +3.27037e+06; 16913; 23840.4; 8001.17 + +3.32775e+06; 0; 17463.9; 8141.55 +3.32775e+06; 324.166; 17593.7; 8141.55 +3.32775e+06; 648.332; 17723.5; 8141.55 +3.32775e+06; 972.497; 17853.3; 8141.55 +3.32775e+06; 1296.66; 17983.2; 8141.55 +3.32775e+06; 1620.83; 18113; 8141.55 +3.32775e+06; 1944.99; 18242.8; 8141.55 +3.32775e+06; 2269.16; 18372.6; 8141.55 +3.32775e+06; 2593.33; 18502.4; 8141.55 +3.32775e+06; 2917.49; 18632.3; 8141.55 +3.32775e+06; 3241.66; 18762.1; 8141.55 +3.32775e+06; 3565.82; 18891.9; 8141.55 +3.32775e+06; 3889.99; 19021.7; 8141.55 +3.32775e+06; 4214.16; 19151.5; 8141.55 +3.32775e+06; 4538.32; 19281.4; 8141.55 +3.32775e+06; 4862.49; 19411.2; 8141.55 +3.32775e+06; 5186.65; 19541; 8141.55 +3.32775e+06; 5510.82; 19670.8; 8141.55 +3.32775e+06; 5834.98; 19800.6; 8141.55 +3.32775e+06; 6159.15; 19930.5; 8141.55 +3.32775e+06; 6483.32; 20060.3; 8141.55 +3.32775e+06; 6807.48; 20190.1; 8141.55 +3.32775e+06; 7131.65; 20319.9; 8141.55 +3.32775e+06; 7455.81; 20449.7; 8141.55 +3.32775e+06; 7779.98; 20579.6; 8141.55 +3.32775e+06; 8104.15; 20709.4; 8141.55 +3.32775e+06; 8428.31; 20839.2; 8141.55 +3.32775e+06; 8752.48; 20969; 8141.55 +3.32775e+06; 9076.64; 21098.8; 8141.55 +3.32775e+06; 9400.81; 21228.7; 8141.55 +3.32775e+06; 9724.97; 21358.5; 8141.55 +3.32775e+06; 10049.1; 21488.3; 8141.55 +3.32775e+06; 10373.3; 21618.1; 8141.55 +3.32775e+06; 10697.5; 21747.9; 8141.55 +3.32775e+06; 11021.6; 21877.8; 8141.55 +3.32775e+06; 11345.8; 22007.6; 8141.55 +3.32775e+06; 11670; 22137.4; 8141.55 +3.32775e+06; 11994.1; 22267.2; 8141.55 +3.32775e+06; 12318.3; 22397; 8141.55 +3.32775e+06; 12642.5; 22526.8; 8141.55 +3.32775e+06; 12966.6; 22656.7; 8141.55 +3.32775e+06; 13290.8; 22786.5; 8141.55 +3.32775e+06; 13615; 22916.3; 8141.55 +3.32775e+06; 13939.1; 23046.1; 8141.55 +3.32775e+06; 14263.3; 23175.9; 8141.55 +3.32775e+06; 14587.5; 23305.8; 8141.55 +3.32775e+06; 14911.6; 23435.6; 8141.55 +3.32775e+06; 15235.8; 23565.4; 8141.55 +3.32775e+06; 15560; 23695.2; 8141.55 +3.32775e+06; 15884.1; 23825; 8141.55 +3.32775e+06; 16208.3; 23954.9; 8141.55 + +3.38513e+06; 0; 17751; 8281.93 +3.38513e+06; 310.072; 17877.2; 8281.93 +3.38513e+06; 620.143; 18003.4; 8281.93 +3.38513e+06; 930.215; 18129.6; 8281.93 +3.38513e+06; 1240.29; 18255.8; 8281.93 +3.38513e+06; 1550.36; 18382; 8281.93 +3.38513e+06; 1860.43; 18508.3; 8281.93 +3.38513e+06; 2170.5; 18634.5; 8281.93 +3.38513e+06; 2480.57; 18760.7; 8281.93 +3.38513e+06; 2790.64; 18886.9; 8281.93 +3.38513e+06; 3100.72; 19013.1; 8281.93 +3.38513e+06; 3410.79; 19139.3; 8281.93 +3.38513e+06; 3720.86; 19265.6; 8281.93 +3.38513e+06; 4030.93; 19391.8; 8281.93 +3.38513e+06; 4341; 19518; 8281.93 +3.38513e+06; 4651.07; 19644.2; 8281.93 +3.38513e+06; 4961.15; 19770.4; 8281.93 +3.38513e+06; 5271.22; 19896.6; 8281.93 +3.38513e+06; 5581.29; 20022.9; 8281.93 +3.38513e+06; 5891.36; 20149.1; 8281.93 +3.38513e+06; 6201.43; 20275.3; 8281.93 +3.38513e+06; 6511.5; 20401.5; 8281.93 +3.38513e+06; 6821.58; 20527.7; 8281.93 +3.38513e+06; 7131.65; 20653.9; 8281.93 +3.38513e+06; 7441.72; 20780.1; 8281.93 +3.38513e+06; 7751.79; 20906.4; 8281.93 +3.38513e+06; 8061.86; 21032.6; 8281.93 +3.38513e+06; 8371.93; 21158.8; 8281.93 +3.38513e+06; 8682.01; 21285; 8281.93 +3.38513e+06; 8992.08; 21411.2; 8281.93 +3.38513e+06; 9302.15; 21537.4; 8281.93 +3.38513e+06; 9612.22; 21663.7; 8281.93 +3.38513e+06; 9922.29; 21789.9; 8281.93 +3.38513e+06; 10232.4; 21916.1; 8281.93 +3.38513e+06; 10542.4; 22042.3; 8281.93 +3.38513e+06; 10852.5; 22168.5; 8281.93 +3.38513e+06; 11162.6; 22294.7; 8281.93 +3.38513e+06; 11472.7; 22421; 8281.93 +3.38513e+06; 11782.7; 22547.2; 8281.93 +3.38513e+06; 12092.8; 22673.4; 8281.93 +3.38513e+06; 12402.9; 22799.6; 8281.93 +3.38513e+06; 12712.9; 22925.8; 8281.93 +3.38513e+06; 13023; 23052; 8281.93 +3.38513e+06; 13333.1; 23178.3; 8281.93 +3.38513e+06; 13643.2; 23304.5; 8281.93 +3.38513e+06; 13953.2; 23430.7; 8281.93 +3.38513e+06; 14263.3; 23556.9; 8281.93 +3.38513e+06; 14573.4; 23683.1; 8281.93 +3.38513e+06; 14883.4; 23809.3; 8281.93 +3.38513e+06; 15193.5; 23935.6; 8281.93 +3.38513e+06; 15503.6; 24061.8; 8281.93 + +3.44251e+06; 0; 18039.3; 8422.31 +3.44251e+06; 295.977; 18161.7; 8422.31 +3.44251e+06; 591.955; 18284.1; 8422.31 +3.44251e+06; 887.932; 18406.6; 8422.31 +3.44251e+06; 1183.91; 18529; 8422.31 +3.44251e+06; 1479.89; 18651.4; 8422.31 +3.44251e+06; 1775.86; 18773.9; 8422.31 +3.44251e+06; 2071.84; 18896.3; 8422.31 +3.44251e+06; 2367.82; 19018.8; 8422.31 +3.44251e+06; 2663.8; 19141.2; 8422.31 +3.44251e+06; 2959.77; 19263.6; 8422.31 +3.44251e+06; 3255.75; 19386.1; 8422.31 +3.44251e+06; 3551.73; 19508.5; 8422.31 +3.44251e+06; 3847.71; 19630.9; 8422.31 +3.44251e+06; 4143.68; 19753.4; 8422.31 +3.44251e+06; 4439.66; 19875.8; 8422.31 +3.44251e+06; 4735.64; 19998.2; 8422.31 +3.44251e+06; 5031.62; 20120.7; 8422.31 +3.44251e+06; 5327.59; 20243.1; 8422.31 +3.44251e+06; 5623.57; 20365.6; 8422.31 +3.44251e+06; 5919.55; 20488; 8422.31 +3.44251e+06; 6215.53; 20610.4; 8422.31 +3.44251e+06; 6511.5; 20732.9; 8422.31 +3.44251e+06; 6807.48; 20855.3; 8422.31 +3.44251e+06; 7103.46; 20977.7; 8422.31 +3.44251e+06; 7399.44; 21100.2; 8422.31 +3.44251e+06; 7695.41; 21222.6; 8422.31 +3.44251e+06; 7991.39; 21345; 8422.31 +3.44251e+06; 8287.37; 21467.5; 8422.31 +3.44251e+06; 8583.35; 21589.9; 8422.31 +3.44251e+06; 8879.32; 21712.3; 8422.31 +3.44251e+06; 9175.3; 21834.8; 8422.31 +3.44251e+06; 9471.28; 21957.2; 8422.31 +3.44251e+06; 9767.26; 22079.7; 8422.31 +3.44251e+06; 10063.2; 22202.1; 8422.31 +3.44251e+06; 10359.2; 22324.5; 8422.31 +3.44251e+06; 10655.2; 22447; 8422.31 +3.44251e+06; 10951.2; 22569.4; 8422.31 +3.44251e+06; 11247.1; 22691.8; 8422.31 +3.44251e+06; 11543.1; 22814.3; 8422.31 +3.44251e+06; 11839.1; 22936.7; 8422.31 +3.44251e+06; 12135.1; 23059.1; 8422.31 +3.44251e+06; 12431.1; 23181.6; 8422.31 +3.44251e+06; 12727; 23304; 8422.31 +3.44251e+06; 13023; 23426.5; 8422.31 +3.44251e+06; 13319; 23548.9; 8422.31 +3.44251e+06; 13615; 23671.3; 8422.31 +3.44251e+06; 13910.9; 23793.8; 8422.31 +3.44251e+06; 14206.9; 23916.2; 8422.31 +3.44251e+06; 14502.9; 24038.6; 8422.31 +3.44251e+06; 14798.9; 24161.1; 8422.31 + +3.49988e+06; 0; 18328.8; 8562.68 +3.49988e+06; 281.883; 18447.3; 8562.68 +3.49988e+06; 563.767; 18565.8; 8562.68 +3.49988e+06; 845.65; 18684.3; 8562.68 +3.49988e+06; 1127.53; 18802.7; 8562.68 +3.49988e+06; 1409.42; 18921.2; 8562.68 +3.49988e+06; 1691.3; 19039.7; 8562.68 +3.49988e+06; 1973.18; 19158.2; 8562.68 +3.49988e+06; 2255.07; 19276.6; 8562.68 +3.49988e+06; 2536.95; 19395.1; 8562.68 +3.49988e+06; 2818.83; 19513.6; 8562.68 +3.49988e+06; 3100.72; 19632.1; 8562.68 +3.49988e+06; 3382.6; 19750.5; 8562.68 +3.49988e+06; 3664.48; 19869; 8562.68 +3.49988e+06; 3946.37; 19987.5; 8562.68 +3.49988e+06; 4228.25; 20106; 8562.68 +3.49988e+06; 4510.13; 20224.5; 8562.68 +3.49988e+06; 4792.02; 20342.9; 8562.68 +3.49988e+06; 5073.9; 20461.4; 8562.68 +3.49988e+06; 5355.78; 20579.9; 8562.68 +3.49988e+06; 5637.67; 20698.4; 8562.68 +3.49988e+06; 5919.55; 20816.8; 8562.68 +3.49988e+06; 6201.43; 20935.3; 8562.68 +3.49988e+06; 6483.32; 21053.8; 8562.68 +3.49988e+06; 6765.2; 21172.3; 8562.68 +3.49988e+06; 7047.08; 21290.8; 8562.68 +3.49988e+06; 7328.97; 21409.2; 8562.68 +3.49988e+06; 7610.85; 21527.7; 8562.68 +3.49988e+06; 7892.73; 21646.2; 8562.68 +3.49988e+06; 8174.62; 21764.7; 8562.68 +3.49988e+06; 8456.5; 21883.1; 8562.68 +3.49988e+06; 8738.38; 22001.6; 8562.68 +3.49988e+06; 9020.27; 22120.1; 8562.68 +3.49988e+06; 9302.15; 22238.6; 8562.68 +3.49988e+06; 9584.03; 22357.1; 8562.68 +3.49988e+06; 9865.92; 22475.5; 8562.68 +3.49988e+06; 10147.8; 22594; 8562.68 +3.49988e+06; 10429.7; 22712.5; 8562.68 +3.49988e+06; 10711.6; 22831; 8562.68 +3.49988e+06; 10993.4; 22949.4; 8562.68 +3.49988e+06; 11275.3; 23067.9; 8562.68 +3.49988e+06; 11557.2; 23186.4; 8562.68 +3.49988e+06; 11839.1; 23304.9; 8562.68 +3.49988e+06; 12121; 23423.4; 8562.68 +3.49988e+06; 12402.9; 23541.8; 8562.68 +3.49988e+06; 12684.7; 23660.3; 8562.68 +3.49988e+06; 12966.6; 23778.8; 8562.68 +3.49988e+06; 13248.5; 23897.3; 8562.68 +3.49988e+06; 13530.4; 24015.7; 8562.68 +3.49988e+06; 13812.3; 24134.2; 8562.68 +3.49988e+06; 14094.2; 24252.7; 8562.68 + +3.55726e+06; 0; 18619.6; 8703.06 +3.55726e+06; 267.789; 18734; 8703.06 +3.55726e+06; 535.578; 18848.3; 8703.06 +3.55726e+06; 803.367; 18962.6; 8703.06 +3.55726e+06; 1071.16; 19077; 8703.06 +3.55726e+06; 1338.95; 19191.3; 8703.06 +3.55726e+06; 1606.73; 19305.7; 8703.06 +3.55726e+06; 1874.52; 19420; 8703.06 +3.55726e+06; 2142.31; 19534.3; 8703.06 +3.55726e+06; 2410.1; 19648.7; 8703.06 +3.55726e+06; 2677.89; 19763; 8703.06 +3.55726e+06; 2945.68; 19877.4; 8703.06 +3.55726e+06; 3213.47; 19991.7; 8703.06 +3.55726e+06; 3481.26; 20106; 8703.06 +3.55726e+06; 3749.05; 20220.4; 8703.06 +3.55726e+06; 4016.84; 20334.7; 8703.06 +3.55726e+06; 4284.63; 20449.1; 8703.06 +3.55726e+06; 4552.42; 20563.4; 8703.06 +3.55726e+06; 4820.2; 20677.7; 8703.06 +3.55726e+06; 5087.99; 20792.1; 8703.06 +3.55726e+06; 5355.78; 20906.4; 8703.06 +3.55726e+06; 5623.57; 21020.8; 8703.06 +3.55726e+06; 5891.36; 21135.1; 8703.06 +3.55726e+06; 6159.15; 21249.4; 8703.06 +3.55726e+06; 6426.94; 21363.8; 8703.06 +3.55726e+06; 6694.73; 21478.1; 8703.06 +3.55726e+06; 6962.52; 21592.4; 8703.06 +3.55726e+06; 7230.31; 21706.8; 8703.06 +3.55726e+06; 7498.1; 21821.1; 8703.06 +3.55726e+06; 7765.89; 21935.5; 8703.06 +3.55726e+06; 8033.67; 22049.8; 8703.06 +3.55726e+06; 8301.46; 22164.1; 8703.06 +3.55726e+06; 8569.25; 22278.5; 8703.06 +3.55726e+06; 8837.04; 22392.8; 8703.06 +3.55726e+06; 9104.83; 22507.2; 8703.06 +3.55726e+06; 9372.62; 22621.5; 8703.06 +3.55726e+06; 9640.41; 22735.8; 8703.06 +3.55726e+06; 9908.2; 22850.2; 8703.06 +3.55726e+06; 10176; 22964.5; 8703.06 +3.55726e+06; 10443.8; 23078.9; 8703.06 +3.55726e+06; 10711.6; 23193.2; 8703.06 +3.55726e+06; 10979.4; 23307.5; 8703.06 +3.55726e+06; 11247.1; 23421.9; 8703.06 +3.55726e+06; 11514.9; 23536.2; 8703.06 +3.55726e+06; 11782.7; 23650.6; 8703.06 +3.55726e+06; 12050.5; 23764.9; 8703.06 +3.55726e+06; 12318.3; 23879.2; 8703.06 +3.55726e+06; 12586.1; 23993.6; 8703.06 +3.55726e+06; 12853.9; 24107.9; 8703.06 +3.55726e+06; 13121.7; 24222.3; 8703.06 +3.55726e+06; 13389.5; 24336.6; 8703.06 + +3.61464e+06; 0; 18911.7; 8843.44 +3.61464e+06; 253.695; 19021.7; 8843.44 +3.61464e+06; 507.39; 19131.7; 8843.44 +3.61464e+06; 761.085; 19241.7; 8843.44 +3.61464e+06; 1014.78; 19351.8; 8843.44 +3.61464e+06; 1268.47; 19461.8; 8843.44 +3.61464e+06; 1522.17; 19571.8; 8843.44 +3.61464e+06; 1775.86; 19681.8; 8843.44 +3.61464e+06; 2029.56; 19791.8; 8843.44 +3.61464e+06; 2283.25; 19901.9; 8843.44 +3.61464e+06; 2536.95; 20011.9; 8843.44 +3.61464e+06; 2790.64; 20121.9; 8843.44 +3.61464e+06; 3044.34; 20231.9; 8843.44 +3.61464e+06; 3298.03; 20342; 8843.44 +3.61464e+06; 3551.73; 20452; 8843.44 +3.61464e+06; 3805.42; 20562; 8843.44 +3.61464e+06; 4059.12; 20672; 8843.44 +3.61464e+06; 4312.81; 20782; 8843.44 +3.61464e+06; 4566.51; 20892.1; 8843.44 +3.61464e+06; 4820.2; 21002.1; 8843.44 +3.61464e+06; 5073.9; 21112.1; 8843.44 +3.61464e+06; 5327.59; 21222.1; 8843.44 +3.61464e+06; 5581.29; 21332.1; 8843.44 +3.61464e+06; 5834.98; 21442.2; 8843.44 +3.61464e+06; 6088.68; 21552.2; 8843.44 +3.61464e+06; 6342.37; 21662.2; 8843.44 +3.61464e+06; 6596.07; 21772.2; 8843.44 +3.61464e+06; 6849.76; 21882.2; 8843.44 +3.61464e+06; 7103.46; 21992.3; 8843.44 +3.61464e+06; 7357.15; 22102.3; 8843.44 +3.61464e+06; 7610.85; 22212.3; 8843.44 +3.61464e+06; 7864.54; 22322.3; 8843.44 +3.61464e+06; 8118.24; 22432.3; 8843.44 +3.61464e+06; 8371.93; 22542.4; 8843.44 +3.61464e+06; 8625.63; 22652.4; 8843.44 +3.61464e+06; 8879.32; 22762.4; 8843.44 +3.61464e+06; 9133.02; 22872.4; 8843.44 +3.61464e+06; 9386.71; 22982.4; 8843.44 +3.61464e+06; 9640.41; 23092.5; 8843.44 +3.61464e+06; 9894.1; 23202.5; 8843.44 +3.61464e+06; 10147.8; 23312.5; 8843.44 +3.61464e+06; 10401.5; 23422.5; 8843.44 +3.61464e+06; 10655.2; 23532.6; 8843.44 +3.61464e+06; 10908.9; 23642.6; 8843.44 +3.61464e+06; 11162.6; 23752.6; 8843.44 +3.61464e+06; 11416.3; 23862.6; 8843.44 +3.61464e+06; 11670; 23972.6; 8843.44 +3.61464e+06; 11923.7; 24082.7; 8843.44 +3.61464e+06; 12177.4; 24192.7; 8843.44 +3.61464e+06; 12431.1; 24302.7; 8843.44 +3.61464e+06; 12684.7; 24412.7; 8843.44 + +3.67202e+06; 0; 19205.6; 8983.82 +3.67202e+06; 239.601; 19311.1; 8983.82 +3.67202e+06; 479.202; 19416.6; 8983.82 +3.67202e+06; 718.802; 19522.1; 8983.82 +3.67202e+06; 958.403; 19627.7; 8983.82 +3.67202e+06; 1198; 19733.2; 8983.82 +3.67202e+06; 1437.6; 19838.7; 8983.82 +3.67202e+06; 1677.21; 19944.2; 8983.82 +3.67202e+06; 1916.81; 20049.8; 8983.82 +3.67202e+06; 2156.41; 20155.3; 8983.82 +3.67202e+06; 2396.01; 20260.8; 8983.82 +3.67202e+06; 2635.61; 20366.3; 8983.82 +3.67202e+06; 2875.21; 20471.8; 8983.82 +3.67202e+06; 3114.81; 20577.4; 8983.82 +3.67202e+06; 3354.41; 20682.9; 8983.82 +3.67202e+06; 3594.01; 20788.4; 8983.82 +3.67202e+06; 3833.61; 20893.9; 8983.82 +3.67202e+06; 4073.21; 20999.5; 8983.82 +3.67202e+06; 4312.81; 21105; 8983.82 +3.67202e+06; 4552.42; 21210.5; 8983.82 +3.67202e+06; 4792.02; 21316; 8983.82 +3.67202e+06; 5031.62; 21421.6; 8983.82 +3.67202e+06; 5271.22; 21527.1; 8983.82 +3.67202e+06; 5510.82; 21632.6; 8983.82 +3.67202e+06; 5750.42; 21738.1; 8983.82 +3.67202e+06; 5990.02; 21843.6; 8983.82 +3.67202e+06; 6229.62; 21949.2; 8983.82 +3.67202e+06; 6469.22; 22054.7; 8983.82 +3.67202e+06; 6708.82; 22160.2; 8983.82 +3.67202e+06; 6948.42; 22265.7; 8983.82 +3.67202e+06; 7188.02; 22371.3; 8983.82 +3.67202e+06; 7427.63; 22476.8; 8983.82 +3.67202e+06; 7667.23; 22582.3; 8983.82 +3.67202e+06; 7906.83; 22687.8; 8983.82 +3.67202e+06; 8146.43; 22793.4; 8983.82 +3.67202e+06; 8386.03; 22898.9; 8983.82 +3.67202e+06; 8625.63; 23004.4; 8983.82 +3.67202e+06; 8865.23; 23109.9; 8983.82 +3.67202e+06; 9104.83; 23215.4; 8983.82 +3.67202e+06; 9344.43; 23321; 8983.82 +3.67202e+06; 9584.03; 23426.5; 8983.82 +3.67202e+06; 9823.63; 23532; 8983.82 +3.67202e+06; 10063.2; 23637.5; 8983.82 +3.67202e+06; 10302.8; 23743.1; 8983.82 +3.67202e+06; 10542.4; 23848.6; 8983.82 +3.67202e+06; 10782; 23954.1; 8983.82 +3.67202e+06; 11021.6; 24059.6; 8983.82 +3.67202e+06; 11261.2; 24165.2; 8983.82 +3.67202e+06; 11500.8; 24270.7; 8983.82 +3.67202e+06; 11740.4; 24376.2; 8983.82 +3.67202e+06; 11980; 24481.7; 8983.82 + +3.7294e+06; 0; 19500.2; 9124.19 +3.7294e+06; 225.507; 19601; 9124.19 +3.7294e+06; 451.013; 19701.9; 9124.19 +3.7294e+06; 676.52; 19802.7; 9124.19 +3.7294e+06; 902.027; 19903.6; 9124.19 +3.7294e+06; 1127.53; 20004.4; 9124.19 +3.7294e+06; 1353.04; 20105.2; 9124.19 +3.7294e+06; 1578.55; 20206.1; 9124.19 +3.7294e+06; 1804.05; 20306.9; 9124.19 +3.7294e+06; 2029.56; 20407.8; 9124.19 +3.7294e+06; 2255.07; 20508.6; 9124.19 +3.7294e+06; 2480.57; 20609.4; 9124.19 +3.7294e+06; 2706.08; 20710.3; 9124.19 +3.7294e+06; 2931.59; 20811.1; 9124.19 +3.7294e+06; 3157.09; 20912; 9124.19 +3.7294e+06; 3382.6; 21012.8; 9124.19 +3.7294e+06; 3608.11; 21113.6; 9124.19 +3.7294e+06; 3833.61; 21214.5; 9124.19 +3.7294e+06; 4059.12; 21315.3; 9124.19 +3.7294e+06; 4284.63; 21416.2; 9124.19 +3.7294e+06; 4510.13; 21517; 9124.19 +3.7294e+06; 4735.64; 21617.8; 9124.19 +3.7294e+06; 4961.15; 21718.7; 9124.19 +3.7294e+06; 5186.65; 21819.5; 9124.19 +3.7294e+06; 5412.16; 21920.4; 9124.19 +3.7294e+06; 5637.67; 22021.2; 9124.19 +3.7294e+06; 5863.17; 22122; 9124.19 +3.7294e+06; 6088.68; 22222.9; 9124.19 +3.7294e+06; 6314.19; 22323.7; 9124.19 +3.7294e+06; 6539.69; 22424.6; 9124.19 +3.7294e+06; 6765.2; 22525.4; 9124.19 +3.7294e+06; 6990.71; 22626.2; 9124.19 +3.7294e+06; 7216.21; 22727.1; 9124.19 +3.7294e+06; 7441.72; 22827.9; 9124.19 +3.7294e+06; 7667.23; 22928.8; 9124.19 +3.7294e+06; 7892.73; 23029.6; 9124.19 +3.7294e+06; 8118.24; 23130.4; 9124.19 +3.7294e+06; 8343.75; 23231.3; 9124.19 +3.7294e+06; 8569.25; 23332.1; 9124.19 +3.7294e+06; 8794.76; 23432.9; 9124.19 +3.7294e+06; 9020.27; 23533.8; 9124.19 +3.7294e+06; 9245.77; 23634.6; 9124.19 +3.7294e+06; 9471.28; 23735.5; 9124.19 +3.7294e+06; 9696.79; 23836.3; 9124.19 +3.7294e+06; 9922.29; 23937.1; 9124.19 +3.7294e+06; 10147.8; 24038; 9124.19 +3.7294e+06; 10373.3; 24138.8; 9124.19 +3.7294e+06; 10598.8; 24239.7; 9124.19 +3.7294e+06; 10824.3; 24340.5; 9124.19 +3.7294e+06; 11049.8; 24441.3; 9124.19 +3.7294e+06; 11275.3; 24542.2; 9124.19 + +3.78677e+06; 0; 19796.1; 9264.57 +3.78677e+06; 211.412; 19892.1; 9264.57 +3.78677e+06; 422.825; 19988.1; 9264.57 +3.78677e+06; 634.237; 20084; 9264.57 +3.78677e+06; 845.65; 20180; 9264.57 +3.78677e+06; 1057.06; 20276; 9264.57 +3.78677e+06; 1268.47; 20372; 9264.57 +3.78677e+06; 1479.89; 20467.9; 9264.57 +3.78677e+06; 1691.3; 20563.9; 9264.57 +3.78677e+06; 1902.71; 20659.9; 9264.57 +3.78677e+06; 2114.12; 20755.8; 9264.57 +3.78677e+06; 2325.54; 20851.8; 9264.57 +3.78677e+06; 2536.95; 20947.8; 9264.57 +3.78677e+06; 2748.36; 21043.8; 9264.57 +3.78677e+06; 2959.77; 21139.7; 9264.57 +3.78677e+06; 3171.19; 21235.7; 9264.57 +3.78677e+06; 3382.6; 21331.7; 9264.57 +3.78677e+06; 3594.01; 21427.6; 9264.57 +3.78677e+06; 3805.42; 21523.6; 9264.57 +3.78677e+06; 4016.84; 21619.6; 9264.57 +3.78677e+06; 4228.25; 21715.6; 9264.57 +3.78677e+06; 4439.66; 21811.5; 9264.57 +3.78677e+06; 4651.07; 21907.5; 9264.57 +3.78677e+06; 4862.49; 22003.5; 9264.57 +3.78677e+06; 5073.9; 22099.4; 9264.57 +3.78677e+06; 5285.31; 22195.4; 9264.57 +3.78677e+06; 5496.72; 22291.4; 9264.57 +3.78677e+06; 5708.14; 22387.4; 9264.57 +3.78677e+06; 5919.55; 22483.3; 9264.57 +3.78677e+06; 6130.96; 22579.3; 9264.57 +3.78677e+06; 6342.37; 22675.3; 9264.57 +3.78677e+06; 6553.79; 22771.2; 9264.57 +3.78677e+06; 6765.2; 22867.2; 9264.57 +3.78677e+06; 6976.61; 22963.2; 9264.57 +3.78677e+06; 7188.02; 23059.2; 9264.57 +3.78677e+06; 7399.44; 23155.1; 9264.57 +3.78677e+06; 7610.85; 23251.1; 9264.57 +3.78677e+06; 7822.26; 23347.1; 9264.57 +3.78677e+06; 8033.67; 23443.1; 9264.57 +3.78677e+06; 8245.09; 23539; 9264.57 +3.78677e+06; 8456.5; 23635; 9264.57 +3.78677e+06; 8667.91; 23731; 9264.57 +3.78677e+06; 8879.32; 23826.9; 9264.57 +3.78677e+06; 9090.74; 23922.9; 9264.57 +3.78677e+06; 9302.15; 24018.9; 9264.57 +3.78677e+06; 9513.56; 24114.9; 9264.57 +3.78677e+06; 9724.97; 24210.8; 9264.57 +3.78677e+06; 9936.39; 24306.8; 9264.57 +3.78677e+06; 10147.8; 24402.8; 9264.57 +3.78677e+06; 10359.2; 24498.7; 9264.57 +3.78677e+06; 10570.6; 24594.7; 9264.57 + +3.84415e+06; 0; 20093.3; 9404.95 +3.84415e+06; 197.318; 20184.2; 9404.95 +3.84415e+06; 394.637; 20275.2; 9404.95 +3.84415e+06; 591.955; 20366.1; 9404.95 +3.84415e+06; 789.273; 20457; 9404.95 +3.84415e+06; 986.592; 20547.9; 9404.95 +3.84415e+06; 1183.91; 20638.8; 9404.95 +3.84415e+06; 1381.23; 20729.8; 9404.95 +3.84415e+06; 1578.55; 20820.7; 9404.95 +3.84415e+06; 1775.86; 20911.6; 9404.95 +3.84415e+06; 1973.18; 21002.5; 9404.95 +3.84415e+06; 2170.5; 21093.4; 9404.95 +3.84415e+06; 2367.82; 21184.3; 9404.95 +3.84415e+06; 2565.14; 21275.3; 9404.95 +3.84415e+06; 2762.46; 21366.2; 9404.95 +3.84415e+06; 2959.77; 21457.1; 9404.95 +3.84415e+06; 3157.09; 21548; 9404.95 +3.84415e+06; 3354.41; 21638.9; 9404.95 +3.84415e+06; 3551.73; 21729.9; 9404.95 +3.84415e+06; 3749.05; 21820.8; 9404.95 +3.84415e+06; 3946.37; 21911.7; 9404.95 +3.84415e+06; 4143.68; 22002.6; 9404.95 +3.84415e+06; 4341; 22093.5; 9404.95 +3.84415e+06; 4538.32; 22184.4; 9404.95 +3.84415e+06; 4735.64; 22275.4; 9404.95 +3.84415e+06; 4932.96; 22366.3; 9404.95 +3.84415e+06; 5130.28; 22457.2; 9404.95 +3.84415e+06; 5327.59; 22548.1; 9404.95 +3.84415e+06; 5524.91; 22639; 9404.95 +3.84415e+06; 5722.23; 22730; 9404.95 +3.84415e+06; 5919.55; 22820.9; 9404.95 +3.84415e+06; 6116.87; 22911.8; 9404.95 +3.84415e+06; 6314.19; 23002.7; 9404.95 +3.84415e+06; 6511.5; 23093.6; 9404.95 +3.84415e+06; 6708.82; 23184.5; 9404.95 +3.84415e+06; 6906.14; 23275.5; 9404.95 +3.84415e+06; 7103.46; 23366.4; 9404.95 +3.84415e+06; 7300.78; 23457.3; 9404.95 +3.84415e+06; 7498.1; 23548.2; 9404.95 +3.84415e+06; 7695.41; 23639.1; 9404.95 +3.84415e+06; 7892.73; 23730.1; 9404.95 +3.84415e+06; 8090.05; 23821; 9404.95 +3.84415e+06; 8287.37; 23911.9; 9404.95 +3.84415e+06; 8484.69; 24002.8; 9404.95 +3.84415e+06; 8682.01; 24093.7; 9404.95 +3.84415e+06; 8879.32; 24184.7; 9404.95 +3.84415e+06; 9076.64; 24275.6; 9404.95 +3.84415e+06; 9273.96; 24366.5; 9404.95 +3.84415e+06; 9471.28; 24457.4; 9404.95 +3.84415e+06; 9668.6; 24548.3; 9404.95 +3.84415e+06; 9865.92; 24639.2; 9404.95 + +3.90153e+06; 0; 20391.8; 9545.33 +3.90153e+06; 183.224; 20477.5; 9545.33 +3.90153e+06; 366.448; 20563.2; 9545.33 +3.90153e+06; 549.672; 20648.8; 9545.33 +3.90153e+06; 732.897; 20734.5; 9545.33 +3.90153e+06; 916.121; 20820.2; 9545.33 +3.90153e+06; 1099.34; 20905.9; 9545.33 +3.90153e+06; 1282.57; 20991.6; 9545.33 +3.90153e+06; 1465.79; 21077.2; 9545.33 +3.90153e+06; 1649.02; 21162.9; 9545.33 +3.90153e+06; 1832.24; 21248.6; 9545.33 +3.90153e+06; 2015.47; 21334.3; 9545.33 +3.90153e+06; 2198.69; 21419.9; 9545.33 +3.90153e+06; 2381.91; 21505.6; 9545.33 +3.90153e+06; 2565.14; 21591.3; 9545.33 +3.90153e+06; 2748.36; 21677; 9545.33 +3.90153e+06; 2931.59; 21762.7; 9545.33 +3.90153e+06; 3114.81; 21848.3; 9545.33 +3.90153e+06; 3298.03; 21934; 9545.33 +3.90153e+06; 3481.26; 22019.7; 9545.33 +3.90153e+06; 3664.48; 22105.4; 9545.33 +3.90153e+06; 3847.71; 22191.1; 9545.33 +3.90153e+06; 4030.93; 22276.7; 9545.33 +3.90153e+06; 4214.16; 22362.4; 9545.33 +3.90153e+06; 4397.38; 22448.1; 9545.33 +3.90153e+06; 4580.6; 22533.8; 9545.33 +3.90153e+06; 4763.83; 22619.4; 9545.33 +3.90153e+06; 4947.05; 22705.1; 9545.33 +3.90153e+06; 5130.28; 22790.8; 9545.33 +3.90153e+06; 5313.5; 22876.5; 9545.33 +3.90153e+06; 5496.72; 22962.2; 9545.33 +3.90153e+06; 5679.95; 23047.8; 9545.33 +3.90153e+06; 5863.17; 23133.5; 9545.33 +3.90153e+06; 6046.4; 23219.2; 9545.33 +3.90153e+06; 6229.62; 23304.9; 9545.33 +3.90153e+06; 6412.85; 23390.5; 9545.33 +3.90153e+06; 6596.07; 23476.2; 9545.33 +3.90153e+06; 6779.29; 23561.9; 9545.33 +3.90153e+06; 6962.52; 23647.6; 9545.33 +3.90153e+06; 7145.74; 23733.3; 9545.33 +3.90153e+06; 7328.97; 23818.9; 9545.33 +3.90153e+06; 7512.19; 23904.6; 9545.33 +3.90153e+06; 7695.41; 23990.3; 9545.33 +3.90153e+06; 7878.64; 24076; 9545.33 +3.90153e+06; 8061.86; 24161.7; 9545.33 +3.90153e+06; 8245.09; 24247.3; 9545.33 +3.90153e+06; 8428.31; 24333; 9545.33 +3.90153e+06; 8611.54; 24418.7; 9545.33 +3.90153e+06; 8794.76; 24504.4; 9545.33 +3.90153e+06; 8977.98; 24590; 9545.33 +3.90153e+06; 9161.21; 24675.7; 9545.33 + +3.95891e+06; 0; 20691.6; 9685.7 +3.95891e+06; 169.13; 20771.8; 9685.7 +3.95891e+06; 338.26; 20852.1; 9685.7 +3.95891e+06; 507.39; 20932.3; 9685.7 +3.95891e+06; 676.52; 21012.6; 9685.7 +3.95891e+06; 845.65; 21092.8; 9685.7 +3.95891e+06; 1014.78; 21173.1; 9685.7 +3.95891e+06; 1183.91; 21253.3; 9685.7 +3.95891e+06; 1353.04; 21333.6; 9685.7 +3.95891e+06; 1522.17; 21413.8; 9685.7 +3.95891e+06; 1691.3; 21494.1; 9685.7 +3.95891e+06; 1860.43; 21574.3; 9685.7 +3.95891e+06; 2029.56; 21654.6; 9685.7 +3.95891e+06; 2198.69; 21734.8; 9685.7 +3.95891e+06; 2367.82; 21815.1; 9685.7 +3.95891e+06; 2536.95; 21895.3; 9685.7 +3.95891e+06; 2706.08; 21975.6; 9685.7 +3.95891e+06; 2875.21; 22055.8; 9685.7 +3.95891e+06; 3044.34; 22136.1; 9685.7 +3.95891e+06; 3213.47; 22216.3; 9685.7 +3.95891e+06; 3382.6; 22296.6; 9685.7 +3.95891e+06; 3551.73; 22376.8; 9685.7 +3.95891e+06; 3720.86; 22457.1; 9685.7 +3.95891e+06; 3889.99; 22537.3; 9685.7 +3.95891e+06; 4059.12; 22617.6; 9685.7 +3.95891e+06; 4228.25; 22697.8; 9685.7 +3.95891e+06; 4397.38; 22778.1; 9685.7 +3.95891e+06; 4566.51; 22858.3; 9685.7 +3.95891e+06; 4735.64; 22938.6; 9685.7 +3.95891e+06; 4904.77; 23018.8; 9685.7 +3.95891e+06; 5073.9; 23099.1; 9685.7 +3.95891e+06; 5243.03; 23179.3; 9685.7 +3.95891e+06; 5412.16; 23259.6; 9685.7 +3.95891e+06; 5581.29; 23339.8; 9685.7 +3.95891e+06; 5750.42; 23420.1; 9685.7 +3.95891e+06; 5919.55; 23500.3; 9685.7 +3.95891e+06; 6088.68; 23580.6; 9685.7 +3.95891e+06; 6257.81; 23660.8; 9685.7 +3.95891e+06; 6426.94; 23741.1; 9685.7 +3.95891e+06; 6596.07; 23821.3; 9685.7 +3.95891e+06; 6765.2; 23901.6; 9685.7 +3.95891e+06; 6934.33; 23981.8; 9685.7 +3.95891e+06; 7103.46; 24062.1; 9685.7 +3.95891e+06; 7272.59; 24142.3; 9685.7 +3.95891e+06; 7441.72; 24222.6; 9685.7 +3.95891e+06; 7610.85; 24302.8; 9685.7 +3.95891e+06; 7779.98; 24383.1; 9685.7 +3.95891e+06; 7949.11; 24463.3; 9685.7 +3.95891e+06; 8118.24; 24543.6; 9685.7 +3.95891e+06; 8287.37; 24623.8; 9685.7 +3.95891e+06; 8456.5; 24704.1; 9685.7 + +4.01628e+06; 0; 20992.7; 9826.08 +4.01628e+06; 155.036; 21067.3; 9826.08 +4.01628e+06; 310.072; 21141.9; 9826.08 +4.01628e+06; 465.107; 21216.6; 9826.08 +4.01628e+06; 620.143; 21291.2; 9826.08 +4.01628e+06; 775.179; 21365.8; 9826.08 +4.01628e+06; 930.215; 21440.5; 9826.08 +4.01628e+06; 1085.25; 21515.1; 9826.08 +4.01628e+06; 1240.29; 21589.7; 9826.08 +4.01628e+06; 1395.32; 21664.4; 9826.08 +4.01628e+06; 1550.36; 21739; 9826.08 +4.01628e+06; 1705.39; 21813.6; 9826.08 +4.01628e+06; 1860.43; 21888.3; 9826.08 +4.01628e+06; 2015.47; 21962.9; 9826.08 +4.01628e+06; 2170.5; 22037.5; 9826.08 +4.01628e+06; 2325.54; 22112.2; 9826.08 +4.01628e+06; 2480.57; 22186.8; 9826.08 +4.01628e+06; 2635.61; 22261.4; 9826.08 +4.01628e+06; 2790.64; 22336.1; 9826.08 +4.01628e+06; 2945.68; 22410.7; 9826.08 +4.01628e+06; 3100.72; 22485.3; 9826.08 +4.01628e+06; 3255.75; 22560; 9826.08 +4.01628e+06; 3410.79; 22634.6; 9826.08 +4.01628e+06; 3565.82; 22709.2; 9826.08 +4.01628e+06; 3720.86; 22783.9; 9826.08 +4.01628e+06; 3875.9; 22858.5; 9826.08 +4.01628e+06; 4030.93; 22933.1; 9826.08 +4.01628e+06; 4185.97; 23007.8; 9826.08 +4.01628e+06; 4341; 23082.4; 9826.08 +4.01628e+06; 4496.04; 23157; 9826.08 +4.01628e+06; 4651.07; 23231.7; 9826.08 +4.01628e+06; 4806.11; 23306.3; 9826.08 +4.01628e+06; 4961.15; 23380.9; 9826.08 +4.01628e+06; 5116.18; 23455.6; 9826.08 +4.01628e+06; 5271.22; 23530.2; 9826.08 +4.01628e+06; 5426.25; 23604.8; 9826.08 +4.01628e+06; 5581.29; 23679.5; 9826.08 +4.01628e+06; 5736.33; 23754.1; 9826.08 +4.01628e+06; 5891.36; 23828.7; 9826.08 +4.01628e+06; 6046.4; 23903.3; 9826.08 +4.01628e+06; 6201.43; 23978; 9826.08 +4.01628e+06; 6356.47; 24052.6; 9826.08 +4.01628e+06; 6511.5; 24127.2; 9826.08 +4.01628e+06; 6666.54; 24201.9; 9826.08 +4.01628e+06; 6821.58; 24276.5; 9826.08 +4.01628e+06; 6976.61; 24351.1; 9826.08 +4.01628e+06; 7131.65; 24425.8; 9826.08 +4.01628e+06; 7286.68; 24500.4; 9826.08 +4.01628e+06; 7441.72; 24575; 9826.08 +4.01628e+06; 7596.76; 24649.7; 9826.08 +4.01628e+06; 7751.79; 24724.3; 9826.08 + +4.07366e+06; 0; 21295; 9966.46 +4.07366e+06; 140.942; 21363.9; 9966.46 +4.07366e+06; 281.883; 21432.7; 9966.46 +4.07366e+06; 422.825; 21501.5; 9966.46 +4.07366e+06; 563.767; 21570.3; 9966.46 +4.07366e+06; 704.708; 21639.2; 9966.46 +4.07366e+06; 845.65; 21708; 9966.46 +4.07366e+06; 986.592; 21776.8; 9966.46 +4.07366e+06; 1127.53; 21845.6; 9966.46 +4.07366e+06; 1268.47; 21914.5; 9966.46 +4.07366e+06; 1409.42; 21983.3; 9966.46 +4.07366e+06; 1550.36; 22052.1; 9966.46 +4.07366e+06; 1691.3; 22120.9; 9966.46 +4.07366e+06; 1832.24; 22189.8; 9966.46 +4.07366e+06; 1973.18; 22258.6; 9966.46 +4.07366e+06; 2114.12; 22327.4; 9966.46 +4.07366e+06; 2255.07; 22396.2; 9966.46 +4.07366e+06; 2396.01; 22465.1; 9966.46 +4.07366e+06; 2536.95; 22533.9; 9966.46 +4.07366e+06; 2677.89; 22602.7; 9966.46 +4.07366e+06; 2818.83; 22671.5; 9966.46 +4.07366e+06; 2959.77; 22740.4; 9966.46 +4.07366e+06; 3100.72; 22809.2; 9966.46 +4.07366e+06; 3241.66; 22878; 9966.46 +4.07366e+06; 3382.6; 22946.8; 9966.46 +4.07366e+06; 3523.54; 23015.7; 9966.46 +4.07366e+06; 3664.48; 23084.5; 9966.46 +4.07366e+06; 3805.42; 23153.3; 9966.46 +4.07366e+06; 3946.37; 23222.1; 9966.46 +4.07366e+06; 4087.31; 23291; 9966.46 +4.07366e+06; 4228.25; 23359.8; 9966.46 +4.07366e+06; 4369.19; 23428.6; 9966.46 +4.07366e+06; 4510.13; 23497.4; 9966.46 +4.07366e+06; 4651.07; 23566.3; 9966.46 +4.07366e+06; 4792.02; 23635.1; 9966.46 +4.07366e+06; 4932.96; 23703.9; 9966.46 +4.07366e+06; 5073.9; 23772.8; 9966.46 +4.07366e+06; 5214.84; 23841.6; 9966.46 +4.07366e+06; 5355.78; 23910.4; 9966.46 +4.07366e+06; 5496.72; 23979.2; 9966.46 +4.07366e+06; 5637.67; 24048.1; 9966.46 +4.07366e+06; 5778.61; 24116.9; 9966.46 +4.07366e+06; 5919.55; 24185.7; 9966.46 +4.07366e+06; 6060.49; 24254.5; 9966.46 +4.07366e+06; 6201.43; 24323.4; 9966.46 +4.07366e+06; 6342.37; 24392.2; 9966.46 +4.07366e+06; 6483.32; 24461; 9966.46 +4.07366e+06; 6624.26; 24529.8; 9966.46 +4.07366e+06; 6765.2; 24598.7; 9966.46 +4.07366e+06; 6906.14; 24667.5; 9966.46 +4.07366e+06; 7047.08; 24736.3; 9966.46 + +4.13104e+06; 0; 21598.7; 10106.8 +4.13104e+06; 126.847; 21661.5; 10106.8 +4.13104e+06; 253.695; 21724.4; 10106.8 +4.13104e+06; 380.542; 21787.2; 10106.8 +4.13104e+06; 507.39; 21850; 10106.8 +4.13104e+06; 634.237; 21912.8; 10106.8 +4.13104e+06; 761.085; 21975.7; 10106.8 +4.13104e+06; 887.932; 22038.5; 10106.8 +4.13104e+06; 1014.78; 22101.3; 10106.8 +4.13104e+06; 1141.63; 22164.1; 10106.8 +4.13104e+06; 1268.47; 22227; 10106.8 +4.13104e+06; 1395.32; 22289.8; 10106.8 +4.13104e+06; 1522.17; 22352.6; 10106.8 +4.13104e+06; 1649.02; 22415.5; 10106.8 +4.13104e+06; 1775.86; 22478.3; 10106.8 +4.13104e+06; 1902.71; 22541.1; 10106.8 +4.13104e+06; 2029.56; 22603.9; 10106.8 +4.13104e+06; 2156.41; 22666.8; 10106.8 +4.13104e+06; 2283.25; 22729.6; 10106.8 +4.13104e+06; 2410.1; 22792.4; 10106.8 +4.13104e+06; 2536.95; 22855.2; 10106.8 +4.13104e+06; 2663.8; 22918.1; 10106.8 +4.13104e+06; 2790.64; 22980.9; 10106.8 +4.13104e+06; 2917.49; 23043.7; 10106.8 +4.13104e+06; 3044.34; 23106.5; 10106.8 +4.13104e+06; 3171.19; 23169.4; 10106.8 +4.13104e+06; 3298.03; 23232.2; 10106.8 +4.13104e+06; 3424.88; 23295; 10106.8 +4.13104e+06; 3551.73; 23357.8; 10106.8 +4.13104e+06; 3678.58; 23420.7; 10106.8 +4.13104e+06; 3805.42; 23483.5; 10106.8 +4.13104e+06; 3932.27; 23546.3; 10106.8 +4.13104e+06; 4059.12; 23609.2; 10106.8 +4.13104e+06; 4185.97; 23672; 10106.8 +4.13104e+06; 4312.81; 23734.8; 10106.8 +4.13104e+06; 4439.66; 23797.6; 10106.8 +4.13104e+06; 4566.51; 23860.5; 10106.8 +4.13104e+06; 4693.36; 23923.3; 10106.8 +4.13104e+06; 4820.2; 23986.1; 10106.8 +4.13104e+06; 4947.05; 24048.9; 10106.8 +4.13104e+06; 5073.9; 24111.8; 10106.8 +4.13104e+06; 5200.75; 24174.6; 10106.8 +4.13104e+06; 5327.59; 24237.4; 10106.8 +4.13104e+06; 5454.44; 24300.2; 10106.8 +4.13104e+06; 5581.29; 24363.1; 10106.8 +4.13104e+06; 5708.14; 24425.9; 10106.8 +4.13104e+06; 5834.98; 24488.7; 10106.8 +4.13104e+06; 5961.83; 24551.6; 10106.8 +4.13104e+06; 6088.68; 24614.4; 10106.8 +4.13104e+06; 6215.53; 24677.2; 10106.8 +4.13104e+06; 6342.37; 24740; 10106.8 + +4.18842e+06; 0; 21903.7; 10247.2 +4.18842e+06; 112.753; 21960.3; 10247.2 +4.18842e+06; 225.507; 22017; 10247.2 +4.18842e+06; 338.26; 22073.6; 10247.2 +4.18842e+06; 451.013; 22130.2; 10247.2 +4.18842e+06; 563.767; 22186.9; 10247.2 +4.18842e+06; 676.52; 22243.5; 10247.2 +4.18842e+06; 789.273; 22300.1; 10247.2 +4.18842e+06; 902.027; 22356.8; 10247.2 +4.18842e+06; 1014.78; 22413.4; 10247.2 +4.18842e+06; 1127.53; 22470; 10247.2 +4.18842e+06; 1240.29; 22526.7; 10247.2 +4.18842e+06; 1353.04; 22583.3; 10247.2 +4.18842e+06; 1465.79; 22639.9; 10247.2 +4.18842e+06; 1578.55; 22696.6; 10247.2 +4.18842e+06; 1691.3; 22753.2; 10247.2 +4.18842e+06; 1804.05; 22809.9; 10247.2 +4.18842e+06; 1916.81; 22866.5; 10247.2 +4.18842e+06; 2029.56; 22923.1; 10247.2 +4.18842e+06; 2142.31; 22979.8; 10247.2 +4.18842e+06; 2255.07; 23036.4; 10247.2 +4.18842e+06; 2367.82; 23093; 10247.2 +4.18842e+06; 2480.57; 23149.7; 10247.2 +4.18842e+06; 2593.33; 23206.3; 10247.2 +4.18842e+06; 2706.08; 23262.9; 10247.2 +4.18842e+06; 2818.83; 23319.6; 10247.2 +4.18842e+06; 2931.59; 23376.2; 10247.2 +4.18842e+06; 3044.34; 23432.8; 10247.2 +4.18842e+06; 3157.09; 23489.5; 10247.2 +4.18842e+06; 3269.85; 23546.1; 10247.2 +4.18842e+06; 3382.6; 23602.7; 10247.2 +4.18842e+06; 3495.35; 23659.4; 10247.2 +4.18842e+06; 3608.11; 23716; 10247.2 +4.18842e+06; 3720.86; 23772.6; 10247.2 +4.18842e+06; 3833.61; 23829.3; 10247.2 +4.18842e+06; 3946.37; 23885.9; 10247.2 +4.18842e+06; 4059.12; 23942.5; 10247.2 +4.18842e+06; 4171.87; 23999.2; 10247.2 +4.18842e+06; 4284.63; 24055.8; 10247.2 +4.18842e+06; 4397.38; 24112.4; 10247.2 +4.18842e+06; 4510.13; 24169.1; 10247.2 +4.18842e+06; 4622.89; 24225.7; 10247.2 +4.18842e+06; 4735.64; 24282.3; 10247.2 +4.18842e+06; 4848.39; 24339; 10247.2 +4.18842e+06; 4961.15; 24395.6; 10247.2 +4.18842e+06; 5073.9; 24452.2; 10247.2 +4.18842e+06; 5186.65; 24508.9; 10247.2 +4.18842e+06; 5299.41; 24565.5; 10247.2 +4.18842e+06; 5412.16; 24622.1; 10247.2 +4.18842e+06; 5524.91; 24678.8; 10247.2 +4.18842e+06; 5637.67; 24735.4; 10247.2 + +4.24579e+06; 0; 22210; 10387.6 +4.24579e+06; 98.6592; 22260.3; 10387.6 +4.24579e+06; 197.318; 22310.5; 10387.6 +4.24579e+06; 295.977; 22360.8; 10387.6 +4.24579e+06; 394.637; 22411; 10387.6 +4.24579e+06; 493.296; 22461.3; 10387.6 +4.24579e+06; 591.955; 22511.5; 10387.6 +4.24579e+06; 690.614; 22561.8; 10387.6 +4.24579e+06; 789.273; 22612; 10387.6 +4.24579e+06; 887.932; 22662.2; 10387.6 +4.24579e+06; 986.592; 22712.5; 10387.6 +4.24579e+06; 1085.25; 22762.7; 10387.6 +4.24579e+06; 1183.91; 22813; 10387.6 +4.24579e+06; 1282.57; 22863.2; 10387.6 +4.24579e+06; 1381.23; 22913.5; 10387.6 +4.24579e+06; 1479.89; 22963.7; 10387.6 +4.24579e+06; 1578.55; 23014; 10387.6 +4.24579e+06; 1677.21; 23064.2; 10387.6 +4.24579e+06; 1775.86; 23114.5; 10387.6 +4.24579e+06; 1874.52; 23164.7; 10387.6 +4.24579e+06; 1973.18; 23215; 10387.6 +4.24579e+06; 2071.84; 23265.2; 10387.6 +4.24579e+06; 2170.5; 23315.5; 10387.6 +4.24579e+06; 2269.16; 23365.7; 10387.6 +4.24579e+06; 2367.82; 23416; 10387.6 +4.24579e+06; 2466.48; 23466.2; 10387.6 +4.24579e+06; 2565.14; 23516.5; 10387.6 +4.24579e+06; 2663.8; 23566.7; 10387.6 +4.24579e+06; 2762.46; 23617; 10387.6 +4.24579e+06; 2861.12; 23667.2; 10387.6 +4.24579e+06; 2959.77; 23717.5; 10387.6 +4.24579e+06; 3058.43; 23767.7; 10387.6 +4.24579e+06; 3157.09; 23817.9; 10387.6 +4.24579e+06; 3255.75; 23868.2; 10387.6 +4.24579e+06; 3354.41; 23918.4; 10387.6 +4.24579e+06; 3453.07; 23968.7; 10387.6 +4.24579e+06; 3551.73; 24018.9; 10387.6 +4.24579e+06; 3650.39; 24069.2; 10387.6 +4.24579e+06; 3749.05; 24119.4; 10387.6 +4.24579e+06; 3847.71; 24169.7; 10387.6 +4.24579e+06; 3946.37; 24219.9; 10387.6 +4.24579e+06; 4045.03; 24270.2; 10387.6 +4.24579e+06; 4143.68; 24320.4; 10387.6 +4.24579e+06; 4242.34; 24370.7; 10387.6 +4.24579e+06; 4341; 24420.9; 10387.6 +4.24579e+06; 4439.66; 24471.2; 10387.6 +4.24579e+06; 4538.32; 24521.4; 10387.6 +4.24579e+06; 4636.98; 24571.7; 10387.6 +4.24579e+06; 4735.64; 24621.9; 10387.6 +4.24579e+06; 4834.3; 24672.2; 10387.6 +4.24579e+06; 4932.96; 24722.4; 10387.6 + +4.30317e+06; 0; 22517.6; 10528 +4.30317e+06; 84.565; 22561.3; 10528 +4.30317e+06; 169.13; 22605; 10528 +4.30317e+06; 253.695; 22648.6; 10528 +4.30317e+06; 338.26; 22692.3; 10528 +4.30317e+06; 422.825; 22736; 10528 +4.30317e+06; 507.39; 22779.6; 10528 +4.30317e+06; 591.955; 22823.3; 10528 +4.30317e+06; 676.52; 22867; 10528 +4.30317e+06; 761.085; 22910.6; 10528 +4.30317e+06; 845.65; 22954.3; 10528 +4.30317e+06; 930.215; 22998; 10528 +4.30317e+06; 1014.78; 23041.6; 10528 +4.30317e+06; 1099.34; 23085.3; 10528 +4.30317e+06; 1183.91; 23129; 10528 +4.30317e+06; 1268.47; 23172.6; 10528 +4.30317e+06; 1353.04; 23216.3; 10528 +4.30317e+06; 1437.6; 23260; 10528 +4.30317e+06; 1522.17; 23303.6; 10528 +4.30317e+06; 1606.73; 23347.3; 10528 +4.30317e+06; 1691.3; 23391; 10528 +4.30317e+06; 1775.86; 23434.6; 10528 +4.30317e+06; 1860.43; 23478.3; 10528 +4.30317e+06; 1944.99; 23522; 10528 +4.30317e+06; 2029.56; 23565.6; 10528 +4.30317e+06; 2114.12; 23609.3; 10528 +4.30317e+06; 2198.69; 23653; 10528 +4.30317e+06; 2283.25; 23696.6; 10528 +4.30317e+06; 2367.82; 23740.3; 10528 +4.30317e+06; 2452.38; 23784; 10528 +4.30317e+06; 2536.95; 23827.6; 10528 +4.30317e+06; 2621.51; 23871.3; 10528 +4.30317e+06; 2706.08; 23915; 10528 +4.30317e+06; 2790.64; 23958.6; 10528 +4.30317e+06; 2875.21; 24002.3; 10528 +4.30317e+06; 2959.77; 24046; 10528 +4.30317e+06; 3044.34; 24089.6; 10528 +4.30317e+06; 3128.9; 24133.3; 10528 +4.30317e+06; 3213.47; 24177; 10528 +4.30317e+06; 3298.03; 24220.6; 10528 +4.30317e+06; 3382.6; 24264.3; 10528 +4.30317e+06; 3467.16; 24308; 10528 +4.30317e+06; 3551.73; 24351.6; 10528 +4.30317e+06; 3636.29; 24395.3; 10528 +4.30317e+06; 3720.86; 24439; 10528 +4.30317e+06; 3805.42; 24482.6; 10528 +4.30317e+06; 3889.99; 24526.3; 10528 +4.30317e+06; 3974.55; 24570; 10528 +4.30317e+06; 4059.12; 24613.6; 10528 +4.30317e+06; 4143.68; 24657.3; 10528 +4.30317e+06; 4228.25; 24701; 10528 + +4.36055e+06; 0; 22826.6; 10668.3 +4.36055e+06; 70.4708; 22863.5; 10668.3 +4.36055e+06; 140.942; 22900.4; 10668.3 +4.36055e+06; 211.412; 22937.3; 10668.3 +4.36055e+06; 281.883; 22974.2; 10668.3 +4.36055e+06; 352.354; 23011.1; 10668.3 +4.36055e+06; 422.825; 23047.9; 10668.3 +4.36055e+06; 493.296; 23084.8; 10668.3 +4.36055e+06; 563.767; 23121.7; 10668.3 +4.36055e+06; 634.237; 23158.6; 10668.3 +4.36055e+06; 704.708; 23195.5; 10668.3 +4.36055e+06; 775.179; 23232.4; 10668.3 +4.36055e+06; 845.65; 23269.3; 10668.3 +4.36055e+06; 916.121; 23306.2; 10668.3 +4.36055e+06; 986.592; 23343; 10668.3 +4.36055e+06; 1057.06; 23379.9; 10668.3 +4.36055e+06; 1127.53; 23416.8; 10668.3 +4.36055e+06; 1198; 23453.7; 10668.3 +4.36055e+06; 1268.47; 23490.6; 10668.3 +4.36055e+06; 1338.95; 23527.5; 10668.3 +4.36055e+06; 1409.42; 23564.4; 10668.3 +4.36055e+06; 1479.89; 23601.3; 10668.3 +4.36055e+06; 1550.36; 23638.1; 10668.3 +4.36055e+06; 1620.83; 23675; 10668.3 +4.36055e+06; 1691.3; 23711.9; 10668.3 +4.36055e+06; 1761.77; 23748.8; 10668.3 +4.36055e+06; 1832.24; 23785.7; 10668.3 +4.36055e+06; 1902.71; 23822.6; 10668.3 +4.36055e+06; 1973.18; 23859.5; 10668.3 +4.36055e+06; 2043.65; 23896.4; 10668.3 +4.36055e+06; 2114.12; 23933.2; 10668.3 +4.36055e+06; 2184.6; 23970.1; 10668.3 +4.36055e+06; 2255.07; 24007; 10668.3 +4.36055e+06; 2325.54; 24043.9; 10668.3 +4.36055e+06; 2396.01; 24080.8; 10668.3 +4.36055e+06; 2466.48; 24117.7; 10668.3 +4.36055e+06; 2536.95; 24154.6; 10668.3 +4.36055e+06; 2607.42; 24191.5; 10668.3 +4.36055e+06; 2677.89; 24228.3; 10668.3 +4.36055e+06; 2748.36; 24265.2; 10668.3 +4.36055e+06; 2818.83; 24302.1; 10668.3 +4.36055e+06; 2889.3; 24339; 10668.3 +4.36055e+06; 2959.77; 24375.9; 10668.3 +4.36055e+06; 3030.25; 24412.8; 10668.3 +4.36055e+06; 3100.72; 24449.7; 10668.3 +4.36055e+06; 3171.19; 24486.6; 10668.3 +4.36055e+06; 3241.66; 24523.5; 10668.3 +4.36055e+06; 3312.13; 24560.3; 10668.3 +4.36055e+06; 3382.6; 24597.2; 10668.3 +4.36055e+06; 3453.07; 24634.1; 10668.3 +4.36055e+06; 3523.54; 24671; 10668.3 + +4.41793e+06; 0; 23136.9; 10808.7 +4.41793e+06; 56.3767; 23166.8; 10808.7 +4.41793e+06; 112.753; 23196.7; 10808.7 +4.41793e+06; 169.13; 23226.6; 10808.7 +4.41793e+06; 225.507; 23256.6; 10808.7 +4.41793e+06; 281.883; 23286.5; 10808.7 +4.41793e+06; 338.26; 23316.4; 10808.7 +4.41793e+06; 394.637; 23346.3; 10808.7 +4.41793e+06; 451.013; 23376.2; 10808.7 +4.41793e+06; 507.39; 23406.1; 10808.7 +4.41793e+06; 563.767; 23436; 10808.7 +4.41793e+06; 620.143; 23465.9; 10808.7 +4.41793e+06; 676.52; 23495.8; 10808.7 +4.41793e+06; 732.897; 23525.8; 10808.7 +4.41793e+06; 789.273; 23555.7; 10808.7 +4.41793e+06; 845.65; 23585.6; 10808.7 +4.41793e+06; 902.027; 23615.5; 10808.7 +4.41793e+06; 958.403; 23645.4; 10808.7 +4.41793e+06; 1014.78; 23675.3; 10808.7 +4.41793e+06; 1071.16; 23705.2; 10808.7 +4.41793e+06; 1127.53; 23735.1; 10808.7 +4.41793e+06; 1183.91; 23765; 10808.7 +4.41793e+06; 1240.29; 23795; 10808.7 +4.41793e+06; 1296.66; 23824.9; 10808.7 +4.41793e+06; 1353.04; 23854.8; 10808.7 +4.41793e+06; 1409.42; 23884.7; 10808.7 +4.41793e+06; 1465.79; 23914.6; 10808.7 +4.41793e+06; 1522.17; 23944.5; 10808.7 +4.41793e+06; 1578.55; 23974.4; 10808.7 +4.41793e+06; 1634.92; 24004.3; 10808.7 +4.41793e+06; 1691.3; 24034.2; 10808.7 +4.41793e+06; 1747.68; 24064.2; 10808.7 +4.41793e+06; 1804.05; 24094.1; 10808.7 +4.41793e+06; 1860.43; 24124; 10808.7 +4.41793e+06; 1916.81; 24153.9; 10808.7 +4.41793e+06; 1973.18; 24183.8; 10808.7 +4.41793e+06; 2029.56; 24213.7; 10808.7 +4.41793e+06; 2085.94; 24243.6; 10808.7 +4.41793e+06; 2142.31; 24273.5; 10808.7 +4.41793e+06; 2198.69; 24303.5; 10808.7 +4.41793e+06; 2255.07; 24333.4; 10808.7 +4.41793e+06; 2311.44; 24363.3; 10808.7 +4.41793e+06; 2367.82; 24393.2; 10808.7 +4.41793e+06; 2424.2; 24423.1; 10808.7 +4.41793e+06; 2480.57; 24453; 10808.7 +4.41793e+06; 2536.95; 24482.9; 10808.7 +4.41793e+06; 2593.33; 24512.8; 10808.7 +4.41793e+06; 2649.7; 24542.7; 10808.7 +4.41793e+06; 2706.08; 24572.7; 10808.7 +4.41793e+06; 2762.46; 24602.6; 10808.7 +4.41793e+06; 2818.83; 24632.5; 10808.7 + +4.4753e+06; 0; 23448.5; 10949.1 +4.4753e+06; 42.2825; 23471.3; 10949.1 +4.4753e+06; 84.565; 23494; 10949.1 +4.4753e+06; 126.847; 23516.7; 10949.1 +4.4753e+06; 169.13; 23539.5; 10949.1 +4.4753e+06; 211.412; 23562.2; 10949.1 +4.4753e+06; 253.695; 23585; 10949.1 +4.4753e+06; 295.977; 23607.7; 10949.1 +4.4753e+06; 338.26; 23630.4; 10949.1 +4.4753e+06; 380.542; 23653.2; 10949.1 +4.4753e+06; 422.825; 23675.9; 10949.1 +4.4753e+06; 465.107; 23698.6; 10949.1 +4.4753e+06; 507.39; 23721.4; 10949.1 +4.4753e+06; 549.672; 23744.1; 10949.1 +4.4753e+06; 591.955; 23766.8; 10949.1 +4.4753e+06; 634.237; 23789.6; 10949.1 +4.4753e+06; 676.52; 23812.3; 10949.1 +4.4753e+06; 718.802; 23835; 10949.1 +4.4753e+06; 761.085; 23857.8; 10949.1 +4.4753e+06; 803.367; 23880.5; 10949.1 +4.4753e+06; 845.65; 23903.3; 10949.1 +4.4753e+06; 887.932; 23926; 10949.1 +4.4753e+06; 930.215; 23948.7; 10949.1 +4.4753e+06; 972.497; 23971.5; 10949.1 +4.4753e+06; 1014.78; 23994.2; 10949.1 +4.4753e+06; 1057.06; 24016.9; 10949.1 +4.4753e+06; 1099.34; 24039.7; 10949.1 +4.4753e+06; 1141.63; 24062.4; 10949.1 +4.4753e+06; 1183.91; 24085.1; 10949.1 +4.4753e+06; 1226.19; 24107.9; 10949.1 +4.4753e+06; 1268.47; 24130.6; 10949.1 +4.4753e+06; 1310.76; 24153.3; 10949.1 +4.4753e+06; 1353.04; 24176.1; 10949.1 +4.4753e+06; 1395.32; 24198.8; 10949.1 +4.4753e+06; 1437.6; 24221.6; 10949.1 +4.4753e+06; 1479.89; 24244.3; 10949.1 +4.4753e+06; 1522.17; 24267; 10949.1 +4.4753e+06; 1564.45; 24289.8; 10949.1 +4.4753e+06; 1606.73; 24312.5; 10949.1 +4.4753e+06; 1649.02; 24335.2; 10949.1 +4.4753e+06; 1691.3; 24358; 10949.1 +4.4753e+06; 1733.58; 24380.7; 10949.1 +4.4753e+06; 1775.86; 24403.4; 10949.1 +4.4753e+06; 1818.15; 24426.2; 10949.1 +4.4753e+06; 1860.43; 24448.9; 10949.1 +4.4753e+06; 1902.71; 24471.6; 10949.1 +4.4753e+06; 1944.99; 24494.4; 10949.1 +4.4753e+06; 1987.28; 24517.1; 10949.1 +4.4753e+06; 2029.56; 24539.9; 10949.1 +4.4753e+06; 2071.84; 24562.6; 10949.1 +4.4753e+06; 2114.12; 24585.3; 10949.1 + +4.53268e+06; 0; 23761.5; 11089.5 +4.53268e+06; 28.1883; 23776.9; 11089.5 +4.53268e+06; 56.3767; 23792.2; 11089.5 +4.53268e+06; 84.565; 23807.6; 11089.5 +4.53268e+06; 112.753; 23823; 11089.5 +4.53268e+06; 140.942; 23838.3; 11089.5 +4.53268e+06; 169.13; 23853.7; 11089.5 +4.53268e+06; 197.318; 23869; 11089.5 +4.53268e+06; 225.507; 23884.4; 11089.5 +4.53268e+06; 253.695; 23899.8; 11089.5 +4.53268e+06; 281.883; 23915.1; 11089.5 +4.53268e+06; 310.072; 23930.5; 11089.5 +4.53268e+06; 338.26; 23945.8; 11089.5 +4.53268e+06; 366.448; 23961.2; 11089.5 +4.53268e+06; 394.637; 23976.6; 11089.5 +4.53268e+06; 422.825; 23991.9; 11089.5 +4.53268e+06; 451.013; 24007.3; 11089.5 +4.53268e+06; 479.202; 24022.6; 11089.5 +4.53268e+06; 507.39; 24038; 11089.5 +4.53268e+06; 535.578; 24053.4; 11089.5 +4.53268e+06; 563.767; 24068.7; 11089.5 +4.53268e+06; 591.955; 24084.1; 11089.5 +4.53268e+06; 620.143; 24099.4; 11089.5 +4.53268e+06; 648.332; 24114.8; 11089.5 +4.53268e+06; 676.52; 24130.1; 11089.5 +4.53268e+06; 704.708; 24145.5; 11089.5 +4.53268e+06; 732.897; 24160.9; 11089.5 +4.53268e+06; 761.085; 24176.2; 11089.5 +4.53268e+06; 789.273; 24191.6; 11089.5 +4.53268e+06; 817.462; 24206.9; 11089.5 +4.53268e+06; 845.65; 24222.3; 11089.5 +4.53268e+06; 873.838; 24237.7; 11089.5 +4.53268e+06; 902.027; 24253; 11089.5 +4.53268e+06; 930.215; 24268.4; 11089.5 +4.53268e+06; 958.403; 24283.7; 11089.5 +4.53268e+06; 986.592; 24299.1; 11089.5 +4.53268e+06; 1014.78; 24314.5; 11089.5 +4.53268e+06; 1042.97; 24329.8; 11089.5 +4.53268e+06; 1071.16; 24345.2; 11089.5 +4.53268e+06; 1099.34; 24360.5; 11089.5 +4.53268e+06; 1127.53; 24375.9; 11089.5 +4.53268e+06; 1155.72; 24391.3; 11089.5 +4.53268e+06; 1183.91; 24406.6; 11089.5 +4.53268e+06; 1212.1; 24422; 11089.5 +4.53268e+06; 1240.29; 24437.3; 11089.5 +4.53268e+06; 1268.47; 24452.7; 11089.5 +4.53268e+06; 1296.66; 24468.1; 11089.5 +4.53268e+06; 1324.85; 24483.4; 11089.5 +4.53268e+06; 1353.04; 24498.8; 11089.5 +4.53268e+06; 1381.23; 24514.1; 11089.5 +4.53268e+06; 1409.42; 24529.5; 11089.5 + +4.59006e+06; 0; 24075.9; 11229.9 +4.59006e+06; 14.0942; 24083.6; 11229.9 +4.59006e+06; 28.1883; 24091.4; 11229.9 +4.59006e+06; 42.2825; 24099.2; 11229.9 +4.59006e+06; 56.3767; 24107; 11229.9 +4.59006e+06; 70.4708; 24114.8; 11229.9 +4.59006e+06; 84.565; 24122.5; 11229.9 +4.59006e+06; 98.6592; 24130.3; 11229.9 +4.59006e+06; 112.753; 24138.1; 11229.9 +4.59006e+06; 126.847; 24145.9; 11229.9 +4.59006e+06; 140.942; 24153.7; 11229.9 +4.59006e+06; 155.036; 24161.4; 11229.9 +4.59006e+06; 169.13; 24169.2; 11229.9 +4.59006e+06; 183.224; 24177; 11229.9 +4.59006e+06; 197.318; 24184.8; 11229.9 +4.59006e+06; 211.412; 24192.6; 11229.9 +4.59006e+06; 225.507; 24200.4; 11229.9 +4.59006e+06; 239.601; 24208.1; 11229.9 +4.59006e+06; 253.695; 24215.9; 11229.9 +4.59006e+06; 267.789; 24223.7; 11229.9 +4.59006e+06; 281.883; 24231.5; 11229.9 +4.59006e+06; 295.977; 24239.3; 11229.9 +4.59006e+06; 310.072; 24247; 11229.9 +4.59006e+06; 324.166; 24254.8; 11229.9 +4.59006e+06; 338.26; 24262.6; 11229.9 +4.59006e+06; 352.354; 24270.4; 11229.9 +4.59006e+06; 366.448; 24278.2; 11229.9 +4.59006e+06; 380.542; 24285.9; 11229.9 +4.59006e+06; 394.637; 24293.7; 11229.9 +4.59006e+06; 408.731; 24301.5; 11229.9 +4.59006e+06; 422.825; 24309.3; 11229.9 +4.59006e+06; 436.919; 24317.1; 11229.9 +4.59006e+06; 451.013; 24324.9; 11229.9 +4.59006e+06; 465.107; 24332.6; 11229.9 +4.59006e+06; 479.202; 24340.4; 11229.9 +4.59006e+06; 493.296; 24348.2; 11229.9 +4.59006e+06; 507.39; 24356; 11229.9 +4.59006e+06; 521.484; 24363.8; 11229.9 +4.59006e+06; 535.578; 24371.5; 11229.9 +4.59006e+06; 549.672; 24379.3; 11229.9 +4.59006e+06; 563.767; 24387.1; 11229.9 +4.59006e+06; 577.861; 24394.9; 11229.9 +4.59006e+06; 591.955; 24402.7; 11229.9 +4.59006e+06; 606.049; 24410.4; 11229.9 +4.59006e+06; 620.143; 24418.2; 11229.9 +4.59006e+06; 634.237; 24426; 11229.9 +4.59006e+06; 648.332; 24433.8; 11229.9 +4.59006e+06; 662.426; 24441.6; 11229.9 +4.59006e+06; 676.52; 24449.4; 11229.9 +4.59006e+06; 690.614; 24457.1; 11229.9 +4.59006e+06; 704.708; 24464.9; 11229.9 + diff --git a/performance_assessment/performance_assessment_conf.xml b/performance_assessment/performance_assessment_conf.xml index 5f01be6a45d4c7f6d5db3f22dce5733a4f7ee1d7..4cc108306a1a207bdaa4fbba7d89bae598fc5b96 100644 --- a/performance_assessment/performance_assessment_conf.xml +++ b/performance_assessment/performance_assessment_conf.xml @@ -54,49 +54,52 @@ <performance_checks description="Settings that affect different functionalities!"> <payload_range_diagram description="Payload Range Diagram Calculation"> <switch description="On-Off-Switch for this method: 1:On, 0:Off" Unit="-" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> </payload_range_diagram> <engine_performance description="Engine power estimation"> <switch description="On-Off-Switch for this method: 1:On, 0:Off" Unit="-" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> </engine_performance> <flight_envelope_performance description="Estimation of flight range limits"> <switch description="On-Off-Switch for this method: 1:On, 0:Off" Unit="-" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> - <overwrite_initial_values>false</overwrite_initial_values> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> + <overwrite_initial_values>0</overwrite_initial_values> </flight_envelope_performance> <climb_performance description="Climb Performance (so far only for plots)" Default="1"> - <switch description="On-Off-Switch for this method: 1:On, 0:Off" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> + <switch description="On-Off-Switch for this method: 1:On, 0:Off" Default="1">0</switch> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> </climb_performance> - <to_performance description="Estimation of the starting distance"> + <takeoff_performance description="Estimation of the starting distance"> <switch description="On-Off-Switch for this method: 1:On, 0:Off" Unit="-" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> - <calculate_blfl_performance>true</calculate_blfl_performance> - </to_performance> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> + <calculate_blfl_performance>1</calculate_blfl_performance> + </takeoff_performance> <landing_performance description="Landing distance estimation" > <switch description="On-Off-Switch for this method: 1:On, 0:Off" Unit="-" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> </landing_performance> <vn_diagram description="Switch for calculation of V-n diagram 1: On, 0: Off"> <switch description="On-Off-Switch for this method: 1:On, 0:Off" Unit="-" Default="1">1</switch> - <fidelityLevel description="Fidelity level of calculation">low</fidelityLevel> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> </vn_diagram> + <sar_performance> + <fidelity_level>low</fidelity_level> + </sar_performance> </performance_checks> <constants_for_performance_checks> <engine_performance> <ratings> <rating ID="1"> - <value>Cruise</value> + <value>cruise</value> </rating> <rating ID="2"> - <value>Climb</value> + <value>climb</value> </rating> <rating ID="3"> - <value>MaxCont</value> + <value>maximum_continuous</value> </rating> <rating ID="4"> - <value>TO</value> + <value>takeoff</value> </rating> </ratings> </engine_performance> @@ -142,16 +145,17 @@ </vn_diagram> </constants_for_performance_checks> <modes description="other settings that influence different modes!"> - <fuel_planning description="Fuel estimation switch: 1:On, 0:Off" Default="0">0</fuel_planning> + <fuel_planning description="Fuel estimation switch: 1:On, 0:Off" Default="0">1</fuel_planning> <use_study_mission_for_analysis description="1: use missionStudy.xml, 0: use missionDesign.xml" Default="0">0</use_study_mission_for_analysis> <mtom_design description="Redetermination of the MTOM: 1:Yes (e.g. DesignLoop), 0:No (e.g. only analysis)" Default="0">0</mtom_design> </modes> <mission description="Specification of the mission"> <optimize_mission_profile description="Switch to optimize the mission profile" Unit="-" Default="0">0</optimize_mission_profile> + <fidelity_level>low</fidelity_level> </mission> <fuel_planning> - <switch>true</switch> - <fidelityLevel description="Fidelity level of calculation">lol</fidelityLevel> + <switch>1</switch> + <fidelity_level description="Fidelity level of calculation">low</fidelity_level> <contingency_fuel description="Relative percentage of Contigency Fuel in total Trip Fuel" Default="0.05"> <value>0.03</value> <unit>1</unit> diff --git a/performance_assessment/src/libs/multi_engine_propulsion.cpp b/performance_assessment/src/libs/multi_engine_propulsion.cpp index 47f360ec9a69999ade80aa75f47bb76c14e27139..88e28c21c56839bc1cf3a960d8769031dd8f1daf 100644 --- a/performance_assessment/src/libs/multi_engine_propulsion.cpp +++ b/performance_assessment/src/libs/multi_engine_propulsion.cpp @@ -20,6 +20,23 @@ Multi_engine_propulsion::Multi_engine_propulsion(const std::shared_ptr<RuntimeIO const node& tank_definition = rtIO->acxml.at("requirements_and_specifications/design_specification/configuration/tank_definition"); const node& tank_design = rtIO->acxml.at("component_design/tank/specific"); + /* Check if all tanks and engines need the same energy carriers and if they were defined */ + std::vector<int> propulsor_energy_carriers(propulsor_requirements.getIntVector("propulsor/energy_carrier_ID/value")); + std::vector<int> tank_energy_carriers(tank_definition.getIntVector("tank/energy_carrier_ID/value")); + std::vector<int> available_energy_carriers; + std::transform(rtIO->aircraft_energy_carriers().begin(), rtIO->aircraft_energy_carriers().end(), + std::back_inserter(available_energy_carriers), [](const std::pair<const int, std::tuple<std::string, double, double, double>>& energy_carrier) + { return energy_carrier.first; }); + if (!vector_check(propulsor_energy_carriers, tank_energy_carriers)) { + throwError(__FILE__, __func__, __LINE__, + "Check your energy carriers: Given energy carrier IDs for propulsion system and tanks do not match!"); + } + if (!vector_check(propulsor_energy_carriers, available_energy_carriers)) { + throwError(__FILE__, __func__, __LINE__, + "Check your energy carriers: Propulsion system and tanks contain energy carrier IDs which were not defined or you defined energy carriers that are not used!"); + } + + /* Get all propulsors */ for (uint16_t i(0); i < propulsor_design.getVector("propulsion").size(); i++) { // get the energy_carrier_id of the propulsor int id_tmp = EndnodeReadOnly<int>("/propulsor@" + num2Str(i) + "/energy_carrier_ID").read(propulsor_requirements).value(); @@ -29,20 +46,24 @@ Multi_engine_propulsion::Multi_engine_propulsion(const std::shared_ptr<RuntimeIO std::string name_tmp = EndnodeReadOnly<std::string>("/propulsion@" + num2Str(i) + "/engine/model").read(propulsor_design).value(); double thrust_share_tmp(EndnodeReadOnly<double>("/propulsor@" + num2Str(i) + "/thrust_share").read(propulsor_requirements).value()); - // Check if the energy_carrier_id is already used - if (this->propulsors.find(id_tmp) != this->propulsors.end()) { - // Check if the same engine already operates using that energy carrier + // Check if the energy_carrier_id is already used. If not, setup new propulsion system for it + if (this->propulsors.find(id_tmp) == this->propulsors.end()) { + Energy_consumption energy_tmp(rtIO->get_fuel_density(id_tmp), // initialize new energy carrier + rtIO->get_fuel_gravimetric_energy_density(id_tmp), + rtIO->get_fuel_volumetric_energy_density(id_tmp)); + this->energy_consumption[id_tmp] = energy_tmp; + Propulsor propulsor_tmp(name_tmp, Engine(rtIO->getEngineDataDir() + "/" + name_tmp, scale_tmp), i, thrust_share_tmp); + this->propulsors[id_tmp].push_back(propulsor_tmp); + } else { // If it already exists, add a new one or update ID vector for equal engines for (uint16_t j(0); j < this->propulsors[id_tmp].size(); j++) { if (this->propulsors[id_tmp][j].name == name_tmp // check for same name and scale factor && accuracyCheck(this->propulsors[id_tmp][j].engine.get_scale_factor(), scale_tmp, ACCURACY_LOW)) { - this->propulsors[id_tmp][j].engine.set_same_engine_type_quantity(1 + - this->propulsors[id_tmp][j].engine.get_same_engine_type_quantity()); // add them up - this->propulsors[id_tmp][j].thrust_share += thrust_share_tmp; // sum their thrust share + this->propulsors[id_tmp][j].engine_id.push_back(i); // Add the ID of the same engine to avoid double effort calculating engines + } else { + Propulsor propulsor_tmp(name_tmp, Engine(rtIO->getEngineDataDir() + "/" + name_tmp, scale_tmp), i, thrust_share_tmp); + this->propulsors[id_tmp].push_back(propulsor_tmp); } } - } else { // if not make a new one - Propulsor propulsor_tmp(name_tmp, Engine(rtIO->getEngineDataDir() + "/" + name_tmp, scale_tmp), thrust_share_tmp); - this->propulsors[id_tmp].push_back(propulsor_tmp); } } @@ -50,29 +71,20 @@ Multi_engine_propulsion::Multi_engine_propulsion(const std::shared_ptr<RuntimeIO // Read tank IDs and capacities from the aircraft XML std::map<int, double> total_capacity_per_id; for (int tank_id(0); tank_id < tank_design.getVector("tank").size(); tank_id++) { - int energy_carrier_id(EndnodeReadOnly<int>("energy_carrier_ID").read(tank_definition.at("tank@" + num2Str(tank_id))).value()); - check_energy_carrier_id(energy_carrier_id, "Problematic tank setup. "); - double tank_capacity(EndnodeReadOnly<double>("maximum_energy_capacity").read(tank_design.at("tank@" + num2Str(tank_id))).value()); - Tank tmp_tank(tank_id, tank_capacity, rtIO->get_fuel_density(energy_carrier_id), - rtIO->get_fuel_gravimetric_energy_density(energy_carrier_id), - rtIO->get_fuel_volumetric_energy_density(energy_carrier_id)); - this->tanks[energy_carrier_id].push_back(tmp_tank); - total_capacity_per_id[energy_carrier_id] += tank_capacity; // sum capacity of this energy carrier - } - - // Get the relative maximum capacity of each tank in comparison to other tanks using the same energy carrier ID - for (std::pair<int, std::vector<Tank>> tank : this->tanks) { - for (uint16_t i(0); i < tank.second.size(); i++) { - tank.second[i].relative_capacity = tank.second[i].capacity/total_capacity_per_id[tank.first]; + //Only take tanks into account that are used for the mission + if (EndnodeReadOnly<bool>("energy_capacity_required_for_mission").read(tank_design.at("tank@" + num2Str(tank_id))).value()) { + int energy_carrier_id(EndnodeReadOnly<int>("energy_carrier_ID").read(tank_definition.at("tank@" + num2Str(tank_id))).value()); + double tank_capacity(EndnodeReadOnly<double>("maximum_energy_capacity").read(tank_design.at("tank@" + num2Str(tank_id))).value()); + Tank tmp_tank(tank_id, tank_capacity); + this->energy_consumption.at(energy_carrier_id).tanks.push_back(tmp_tank); + total_capacity_per_id[energy_carrier_id] += tank_capacity; // sum capacity of this energy carrier } } - - // Final check if all propulsors will get energy from at least one tank - for (std::pair<int, std::vector<Propulsor>> tmp : propulsors) { - if (this->tanks.find(tmp.first) == tanks.end()) { - myRuntimeInfo->out << tmp.first << std::endl; - throwError(__FILE__, __func__, __LINE__, - std::format("No tank was designed containing the energy carrier {}: No fuel for engine {}!", tmp.first, tmp.second[0].name)); + // Get the relative maximum capacity of each tank in comparison to other tanks using the same energy carrier ID + for (std::pair<const int, Multi_engine_propulsion::Energy_consumption> energy_carrier : this->energy_consumption) { + for (uint16_t i(0); i < energy_carrier.second.tanks.size(); i++) { + this->energy_consumption.at(energy_carrier.first).tanks[i].relative_capacity = + energy_carrier.second.tanks[i].capacity/total_capacity_per_id[energy_carrier.first]; } } } @@ -82,36 +94,39 @@ Multi_engine_propulsion::~Multi_engine_propulsion() { } size_t Multi_engine_propulsion::unique_engines_per_id(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); return this->propulsors[energy_carrier_id].size(); } -std::vector<std::string> Multi_engine_propulsion::get_engine_names(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); - std::vector<std::string> names; - std::transform(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(names), - [](const auto& engines) { return engines.name; }); - return names; -} +// std::vector<std::string> Multi_engine_propulsion::get_engine_names(const int& energy_carrier_id) { +// std::vector<std::string> names; +// std::transform(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(names), +// [](const auto& engines) { return engines.name; }); +// return names; +// } -std::vector<Engine> Multi_engine_propulsion::get_engines(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); - std::vector<Engine> engines_objects; - std::transform(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(engines_objects), - [](const auto& engines) { return engines.engine; }); - return engines_objects; +uint16_t Multi_engine_propulsion::get_number_of_engines(const int& energy_carrier_id) { + uint16_t sum(0); + for (Multi_engine_propulsion::Propulsor propulsor : this->propulsors.at(energy_carrier_id)) { + sum += propulsor.engine_id.size(); + } + return sum; } -std::vector<double> Multi_engine_propulsion::get_thrust_shares(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); - std::vector<double> thrust_shares; - std::transform(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(thrust_shares), - [](const auto& engines) { return engines.thrust_share; }); - return thrust_shares; -} +// std::vector<Engine> Multi_engine_propulsion::get_engines(const int& energy_carrier_id) { +// std::vector<Engine> engines_objects; +// std::transform(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(engines_objects), +// [](const auto& engines) { return engines.engine; }); +// return engines_objects; +// } + +// std::vector<double> Multi_engine_propulsion::get_thrust_shares(const int& energy_carrier_id) { +// std::vector<double> thrust_shares; +// std::transform(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(thrust_shares), +// [](const auto& engines) { return engines.thrust_share; }); +// return thrust_shares; +// } std::vector<OperatingPoint> Multi_engine_propulsion::get_operating_points(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); std::vector<OperatingPoint> operating_points; for (uint16_t i(0); i < this->propulsors[energy_carrier_id].size(); i++) { operating_points.push_back(this->propulsors[energy_carrier_id][i].engine.get_operating_point()); @@ -119,28 +134,48 @@ std::vector<OperatingPoint> Multi_engine_propulsion::get_operating_points(const return operating_points; } +std::vector<Multi_engine_propulsion::Propulsor> Multi_engine_propulsion::get_propulsors(const int& energy_carrier_id) { + std::vector<Propulsor> propulsors_vector; + std::copy(this->propulsors[energy_carrier_id].begin(), this->propulsors[energy_carrier_id].end(), std::back_inserter(propulsors_vector)); + return propulsors_vector; +} + void Multi_engine_propulsion::set_operating_points(const int& energy_carrier_id, std::vector<OperatingPoint> operating_points) { - check_energy_carrier_id(energy_carrier_id); - for (uint16_t i(0); i < this->propulsors[energy_carrier_id].size(); i++) { - this->propulsors[energy_carrier_id][i].engine.set_operating_point(operating_points[i]); + for (std::pair<const int, std::vector<Multi_engine_propulsion::Propulsor>> energy_carrier : this->propulsors) { + for (uint16_t i(0); i < this->propulsors[energy_carrier.first].size(); i++) { + this->propulsors[energy_carrier_id][i].engine.set_operating_point(operating_points[i]); + if (energy_carrier.first != energy_carrier_id) { + OperatingPoint n0_operating_point(operating_points[i]); // Copy operating point since Mach number and altitude are euqal for all + n0_operating_point.N = 0.; // Set N1 for engines which are not running to 0 + this->propulsors[energy_carrier_id][i].engine.set_operating_point(n0_operating_point); + } + } } } double Multi_engine_propulsion::get_aircraft_fuelflow(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); double total_fuel_flow(0); // Loop through all propulsors running on that energy carrier for (uint16_t i(0); i < this->propulsors[energy_carrier_id].size(); i++) { - total_fuel_flow += this->propulsors[energy_carrier_id][i].engine.get_aircraft_fuelflow(); + // Trick: Propulsors with same engines have multiple IDs -> size() scales overall fuelflow acordingly + total_fuel_flow += this->propulsors[energy_carrier_id][i].engine.get_aircraft_fuelflow() * this->propulsors[energy_carrier_id][i].engine_id.size(); } return total_fuel_flow; } +double Multi_engine_propulsion::get_aircraft_energyflow(const int& energy_carrier_id) { + return this->get_aircraft_fuelflow(energy_carrier_id) * this->energy_consumption.at(energy_carrier_id).gravimetric_density; +} + +double Multi_engine_propulsion::get_aircraft_energyflow(const int& energy_carrier_id, const double& aircraft_fuelflow) { + return aircraft_fuelflow * this->energy_consumption.at(energy_carrier_id).gravimetric_density; +} + double Multi_engine_propulsion::get_thrust_aircraft(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); double total_thrust(0); for (uint16_t i(0); i < this->propulsors[energy_carrier_id].size(); i++) { - total_thrust += this->propulsors[energy_carrier_id][i].engine.get_thrust_aircraft(); + // Trick: Propulsors with same engines have multiple IDs -> size() scales overall thrust acordingly + total_thrust += this->propulsors[energy_carrier_id][i].engine.get_thrust() * this->propulsors[energy_carrier_id][0].engine_id.size(); } return total_thrust; } @@ -150,9 +185,11 @@ void Multi_engine_propulsion::calculate_N1_with_penalties(const int& energy_carr const double& derate, const std::string& thrust_rating, double bleed_air_offtake, double shaft_power_offtake) { for (uint16_t i(0); i < this->propulsors[energy_carrier_id].size(); i++) { + double shaft_power_offtake_share = this->propulsors[energy_carrier_id][i].thrust_share*shaft_power_offtake; + double bleed_air_offtake_share = this->propulsors[energy_carrier_id][i].thrust_share*bleed_air_offtake; this->propulsors[energy_carrier_id][i].engine.calculate_N1_with_penalties( altitude, mach_number, atm, derate, - thrust_rating, bleed_air_offtake, shaft_power_offtake); + thrust_rating, bleed_air_offtake_share, shaft_power_offtake_share); } } @@ -162,49 +199,78 @@ void Multi_engine_propulsion::calculate_N1_with_thrustlimit(const int& energy_ca double bleed_air_offtake, double shaft_power_offtake, double thrust_limit) { for (uint16_t i(0); i < this->propulsors[energy_carrier_id].size(); i++) { double thrust_limit_share = this->propulsors[energy_carrier_id][i].thrust_share*thrust_limit; + double shaft_power_offtake_share = this->propulsors[energy_carrier_id][i].thrust_share*shaft_power_offtake; + double bleed_air_offtake_share = this->propulsors[energy_carrier_id][i].thrust_share*bleed_air_offtake; this->propulsors[energy_carrier_id][i].engine.calculate_N1_with_thrustlimit( altitude, mach_number, atm, derate, thrust_rating, - bleed_air_offtake, shaft_power_offtake, thrust_limit_share); + bleed_air_offtake_share, shaft_power_offtake_share, thrust_limit_share); } } -std::vector<Multi_engine_propulsion::Tank> Multi_engine_propulsion::get_tanks_by_id(int energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); - return this->tanks[energy_carrier_id]; +std::vector<Multi_engine_propulsion::Tank> Multi_engine_propulsion::get_tanks_by_id(const int& energy_carrier_id) { + return this->energy_consumption.at(energy_carrier_id).tanks; } -void Multi_engine_propulsion::drain_tanks(const int& energy_carrier_id, const double& consumed_energy) { - check_energy_carrier_id(energy_carrier_id); - for (int i(0); i < this->tanks[energy_carrier_id].size(); i++) { - this->tanks[energy_carrier_id][i].used_energy -= this->tanks[energy_carrier_id][i].relative_capacity*consumed_energy; +std::map<int, double> Multi_engine_propulsion::get_consumed_energy_map() { + std::map<int, double> consumed_energy_map; + // energy_carrier.first = energy_carrier_id; energy_carrier.second = Energy_consumption class + for (std::pair<const int, Multi_engine_propulsion::Energy_consumption> energy_carrier : this->energy_consumption) { + consumed_energy_map[energy_carrier.first] = get_consumed_energy(energy_carrier.first); } + return consumed_energy_map; } -double Multi_engine_propulsion::get_consumed_fuel_mass() { - double total_fuel_mass(0); - for (std::pair<const int, std::vector<Multi_engine_propulsion::Tank>> id : this->tanks) { - total_fuel_mass += // id.first = energy_carrier_id - std::accumulate(this->tanks[id.first].begin(), this->tanks[id.first].end(), 0.0, - [](double sum, const Tank& tank) {return sum + (tank.used_energy / tank.gravimetric_density);}); +double Multi_engine_propulsion::get_consumed_energy(const int& energy_carrier_id) { + double total_consumed_energy = std::accumulate(this->energy_consumption.at(energy_carrier_id).tanks.begin(), this->energy_consumption.at(energy_carrier_id).tanks.end(), 0.0, + [](double sum, const Tank& tank) {return sum + tank.consumed_energy;}); + return total_consumed_energy; +} + +std::map<int, double> Multi_engine_propulsion::get_energyflow_map() { + std::map<int, double> energyflow_map; + // energy_carrier.first = energy_carrier_id; energy_carrier.second = Energy_consumption class + for (std::pair<const int, Multi_engine_propulsion::Energy_consumption> energy_carrier : this->energy_consumption) { + energyflow_map[energy_carrier.first] = + this->get_aircraft_fuelflow(energy_carrier.first) * this->energy_consumption.at(energy_carrier.first).gravimetric_density; } - return total_fuel_mass; + return energyflow_map; } -double Multi_engine_propulsion::get_total_energy_capacity(const int& energy_carrier_id) { - check_energy_carrier_id(energy_carrier_id); - double total_energy(0); - for (std::pair<const int, std::vector<Multi_engine_propulsion::Tank>> id : this->tanks) { - total_energy += // id.first = energy_carrier_id - std::accumulate(this->tanks[id.first].begin(), this->tanks[id.first].end(), 0.0, - [](double sum, const Tank& tank) {return sum + (tank.capacity);}); +void Multi_engine_propulsion::drain_tanks(const int& energy_carrier_id, const double& delta_t, const double& fuel_mass) { + // TODO(GErrit): lediglich anteilig an der Gesamtenergie wir die Energie abgefuehrt. Ggf. anderes Defueling vorsehen! + if (std::isnan(fuel_mass)) { + for (uint16_t i(0); i < this->energy_consumption.at(energy_carrier_id).tanks.size(); i++) { + this->energy_consumption.at(energy_carrier_id).tanks[i].consumed_energy -= delta_t * + get_aircraft_energyflow(energy_carrier_id) * this->energy_consumption.at(energy_carrier_id).tanks[i].relative_capacity; + } + } else { // If a given fuel mass is taken away, just use that one + for (uint16_t i(0); i < this->energy_consumption.at(energy_carrier_id).tanks.size(); i++) { + this->energy_consumption.at(energy_carrier_id).tanks[i].consumed_energy -= fuel_mass * + this->energy_consumption.at(energy_carrier_id).gravimetric_density * this->energy_consumption.at(energy_carrier_id).tanks[i].relative_capacity; + } } - return total_energy; +} + +double Multi_engine_propulsion::get_consumed_fuel_mass() { + std::map<int, double> consumed_energy_map(this->get_consumed_energy_map()); + double total_fuel_mass = std::accumulate(this->energy_consumption.begin(), this->energy_consumption.end(), 0.0, + [&consumed_energy_map](double sum, const std::pair<const int, Multi_engine_propulsion::Energy_consumption>& energy_carrier) { + return sum + consumed_energy_map.at(energy_carrier.first) / energy_carrier.second.gravimetric_density; + }); + return total_fuel_mass; +} + +double Multi_engine_propulsion::get_energy_carrier_capacity(const int& energy_carrier_id) { + double total_capacity = std::accumulate(this->energy_consumption.at(energy_carrier_id).tanks.begin(), this->energy_consumption.at(energy_carrier_id).tanks.end(), 0.0, + [](double sum, const Tank& tank) {return sum + tank.capacity;}); + return total_capacity; } /* Initialization of attributes of the Propulsor object with the constructor */ -Multi_engine_propulsion::Propulsor::Propulsor(const std::string& a_name, Engine an_engine, const double& a_thrust_share) : +Multi_engine_propulsion::Propulsor::Propulsor(const std::string& a_name, Engine an_engine, const uint16_t& an_id, const double& a_thrust_share) : name(a_name), engine(an_engine), + engine_id({an_id}), thrust_share(a_thrust_share) { } @@ -213,23 +279,40 @@ Multi_engine_propulsion::Propulsor::~Propulsor() { } /* Initialization of attributes of the Tank object with the constructor */ -Multi_engine_propulsion::Tank::Tank(uint16_t a_tank_id, double a_capacity, double a_density, double a_gravimetric_density, double a_volumetric_density) : +Multi_engine_propulsion::Tank::Tank(uint16_t a_tank_id, double a_capacity) : tank_id(a_tank_id), capacity(a_capacity), relative_capacity(0.), - used_energy(0.), - density(a_density), - gravimetric_density(a_gravimetric_density), - volumetric_density(a_volumetric_density) { + consumed_energy(0.) { } /* Destructor of the Tank object */ Multi_engine_propulsion::Tank::~Tank() { } -void Multi_engine_propulsion::check_energy_carrier_id(const int& energy_carrier_id, const std::string additional_info) { - if (this->propulsors.find(energy_carrier_id) == propulsors.end()) { - throwError(__FILE__, __func__, __LINE__, - std::format("{}Check yor energy carriers: Given energy carrier ID is not used for this propulsion system!", additional_info)); - } +/* Initialization of attributes of the Energy_consumption object with the constructor */ +Multi_engine_propulsion::Energy_consumption::Energy_consumption(double a_density, double a_gravimetric_density, double a_volumetric_density) : + density(a_density), + gravimetric_density(a_gravimetric_density), + volumetric_density(a_volumetric_density), + tanks() { +} + +/* Initialization of attributes of the Energy_consumption object with the constructor */ +Multi_engine_propulsion::Energy_consumption::Energy_consumption() : + density(0.), + gravimetric_density(0.), + volumetric_density(0.), + tanks() { +} + +/* Destructor of the Energy_consumption object */ +Multi_engine_propulsion::Energy_consumption::~Energy_consumption() { +} + +bool Multi_engine_propulsion::vector_check(const std::vector<int>& v1, const std::vector<int>& v2) { + std::set<int> set1(v1.begin(), v1.end()); + std::set<int> set2(v2.begin(), v2.end()); + + return set1 == set2; } diff --git a/performance_assessment/src/libs/multi_engine_propulsion.h b/performance_assessment/src/libs/multi_engine_propulsion.h index 3a27ed74540c515a96ecdde28c53f5f759e65b7f..87063222697b47bb214a2aa0d94b8d61356e48ac 100644 --- a/performance_assessment/src/libs/multi_engine_propulsion.h +++ b/performance_assessment/src/libs/multi_engine_propulsion.h @@ -9,11 +9,12 @@ * */ -#ifndef performanceAssessment_SRC_LIBS_MULTI_ENGINE_PROPULSION_H_ -#define performanceAssessment_SRC_LIBS_MULTI_ENGINE_PROPULSION_H_ +#ifndef MISSION_ANALYSIS_SRC_LIBS_MULTI_ENGINE_PROPULSION_MULTI_ENGINE_PROPULSION_H_ +#define MISSION_ANALYSIS_SRC_LIBS_MULTI_ENGINE_PROPULSION_MULTI_ENGINE_PROPULSION_H_ #include <map> #include <memory> +#include <set> #include <string> #include <tuple> #include <utility> @@ -39,11 +40,14 @@ class Multi_engine_propulsion { std::vector<std::string> get_engine_names(const int& energy_carrier_id); std::vector<Engine> get_engines(const int& energy_carrier_id); std::vector<double> get_thrust_shares(const int& energy_carrier_id); + uint16_t get_number_of_engines(const int& energy_carrier_id); std::vector<OperatingPoint> get_operating_points(const int& energy_carrier_id); void set_operating_points(const int& energy_carrier_id, std::vector<OperatingPoint> operating_points); double get_aircraft_fuelflow(const int& energy_carrier_id); + double get_aircraft_energyflow(const int& energy_carrier_id); + double get_aircraft_energyflow(const int& energy_carrier_id, const double& aircraft_fuelflow); double get_thrust_aircraft(const int& energy_carrier_id); void calculate_N1_with_penalties(const int& energy_carrier_id, @@ -68,11 +72,12 @@ class Multi_engine_propulsion { public: std::string name; Engine engine; + std::vector<uint16_t> engine_id; double thrust_share; /** \brief Constructor of used_components. */ - Propulsor(const std::string& a_name, Engine an_engine, const double& a_thrust_share); + Propulsor(const std::string& a_name, Engine an_engine, const uint16_t& an_id, const double& a_thrust_share); /** \brief Destructor of used_components */ @@ -84,32 +89,54 @@ class Multi_engine_propulsion { uint16_t tank_id; double capacity; double relative_capacity; - double used_energy; + double consumed_energy; + + /** \brief Constructor of used_components. + */ + Tank(uint16_t a_tank_id, double a_capacity); + + /** \brief Destructor of used_components + */ + virtual ~Tank(); + }; + + class Energy_consumption { + public: double density; double gravimetric_density; double volumetric_density; + std::vector<Tank> tanks; /** \brief Constructor of used_components. */ - Tank(uint16_t a_tank_id, double a_capacity, double a_density, double a_gravimetric_density, double a_volumetric_density); + Energy_consumption(); + + /** \brief Constructor of used_components. + */ + Energy_consumption(double a_density, double a_gravimetric_density, double a_volumetric_density); /** \brief Destructor of used_components */ - virtual ~Tank(); + virtual ~Energy_consumption(); }; - std::vector<Tank> get_tanks_by_id(int energy_carrier_id); + + std::map<int, double> get_consumed_energy_map(); + double get_consumed_energy(const int& energy_carrier_id); + std::map<int, double> get_energyflow_map(); + std::vector<Tank> get_tanks_by_id(const int& energy_carrier_id); void tank_setup(const node& tank_definition, const node& tank_design); - void drain_tanks(const int& energy_carrier_id, const double& consumed_energy); + void drain_tanks(const int& energy_carrier_id, const double& delta_t, const double& fuelflow = NAN); double get_consumed_fuel_mass(); - double get_total_energy_capacity(const int& energy_carrier_id); + double get_energy_carrier_capacity(const int& energy_carrier_id); + std::vector<Propulsor> get_propulsors(const int& energy_carrier_id); private: /* variables */ std::map<int, std::vector<Propulsor>> propulsors; - std::map<int, std::vector<Tank>> tanks; + std::map<int, Energy_consumption> energy_consumption; /* functions */ - void check_energy_carrier_id(const int& energy_carrier_id, const std::string additional_info = ""); + bool vector_check(const std::vector<int>& v1, const std::vector<int>& v2); }; -#endif // performanceAssessment_SRC_LIBS_MULTI_ENGINE_PROPULSION_H_ +#endif // MISSION_ANALYSIS_SRC_LIBS_MULTI_ENGINE_PROPULSION_MULTI_ENGINE_PROPULSION_H_ diff --git a/performance_assessment/src/performance_assessment.cpp b/performance_assessment/src/performance_assessment.cpp index 241e0db90d8d099b82808e6bb3f3061f51b02daa..0fafa3b07898556825c1f4ef162af7995fe93415 100644 --- a/performance_assessment/src/performance_assessment.cpp +++ b/performance_assessment/src/performance_assessment.cpp @@ -24,31 +24,8 @@ performance_assessment::performance_assessment(const int argc, char *argv[], const std::string& toolName, const std::string& toolVersion) : Module(argc, argv, toolName, toolVersion) { std::string configuration = rtIO_->aircraft_configuration_type(); - std::string strategySelectionByUser = rtIO_->moduleConfig.at("/module_configuration_file/program_settings/module_strategy"); - std::string fidelitySelectionByUser = rtIO_->moduleConfig.at("/module_configuration_file/program_settings/module_fidelity_level"); - route = {configuration, strategySelectionByUser, fidelitySelectionByUser}; - strategy.setStrategy(design_routing(route)(rtIO_)); -} - -strategyaccess performance_assessment::design_routing(const std::vector<std::string> &route) { - /* Routing table */ - std::map<std::string, std::map<std::string, std::map<std::string, strategyaccess>>> table = { - {"tube_and_wing", - std::map<std::string, std::map<std::string, strategyaccess>>{ - {"default_methods", - std::map<std::string, strategyaccess>{ - {"low", - [](const std::shared_ptr<RuntimeIO> &arg) { return std::make_unique<taw::performance_assessment_factory>(arg); }}, - }}, - }}, - {"blended_wing_body", - std::map<std::string, std::map<std::string, strategyaccess>>{ - {"default_methods", - std::map<std::string, strategyaccess>{ - {"low", - [](const std::shared_ptr<RuntimeIO> &arg) { return std::make_unique<taw::performance_assessment_factory>(arg); }}, - }}}}}; - - return table[route.at(0)][route.at(1)][route.at(2)]; + /* Register existing strategies */ + strategy.registerStrategy<taw::performance_assessment_factory>({"tube_and_wing"}); + strategy.setStrategy({configuration}, rtIO_); } diff --git a/performance_assessment/src/taw/defaultMethods/SARPerformance/low_fidelity/SARPerformance.cpp b/performance_assessment/src/taw/defaultMethods/SARPerformance/low_fidelity/SARPerformance.cpp index 09a95f0818dae537e335a1bb3056f50d7759b2c5..ba2fa8d97ae1e2b58512171ce604c125bfb4c61f 100644 --- a/performance_assessment/src/taw/defaultMethods/SARPerformance/low_fidelity/SARPerformance.cpp +++ b/performance_assessment/src/taw/defaultMethods/SARPerformance/low_fidelity/SARPerformance.cpp @@ -100,9 +100,13 @@ double SARPerformance::calculateSAR(double mass, double alt, double mach, string double SAR(0.0); double cruiseTAS = theAcftPt->atm.getSpeedOfSound(alt) * mach; double cruiseDrag = theAcftPt->aero.getCruiseDrag(mach, alt, 0., mass, configuration, theAcftPt->atm); + try { theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, alt, mach, theAcftPt->atm, 1., rating, theAcftPt->myMission.bleedOffCr, - theAcftPt->myMission.shaftOffCr, cruiseDrag / 1000.); - if (1000. * theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) >= 0.99 * cruiseDrag) { + theAcftPt->myMission.shaftOffCr, cruiseDrag); + } catch (int status) { + double current_ac_thrust = theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); //TODO(hansmann): Revise this section + } + if (theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) >= 0.99 * cruiseDrag) { SAR = cruiseTAS / theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise); } else { SAR = 0.0; diff --git a/performance_assessment/src/taw/defaultMethods/VnDiagram/low_fidelity/VnDiagram.cpp b/performance_assessment/src/taw/defaultMethods/VnDiagram/low_fidelity/VnDiagram.cpp index d0da5b2750b5cebbedd1f5e0431729c785e4f0f6..3a7a2d658a14f8a1bd9f2d8195a3b8eaf248ad2e 100644 --- a/performance_assessment/src/taw/defaultMethods/VnDiagram/low_fidelity/VnDiagram.cpp +++ b/performance_assessment/src/taw/defaultMethods/VnDiagram/low_fidelity/VnDiagram.cpp @@ -34,29 +34,29 @@ VnDiagram::VnDiagram(std::shared_ptr<aircraft> theAircraft, const std::shared_pt } void VnDiagram::doVnDiagram() { /* Calculation of the decisive coefficients, which define the shape of the first part of the V-n diagram (quadratic shape) Coeff*pow(v,2) */ - CleanCoefficientPos = (theAcftPt->aero.getCLmax(0., "Clean") * 0.5 * theAcftPt->atm.getDensity(0.) * theAcftPt->S_Wing) / (theAcftPt->MTOM * G_FORCE); + CleanCoefficientPos = (theAcftPt->aero.getCLmax(0., "clean") * 0.5 * theAcftPt->atm.getDensity(0.) * theAcftPt->S_Wing) / (theAcftPt->MTOM * G_FORCE); CleanCoefficientNeg = -CleanCoefficientPos; // Assumption: minimum lift coefficient is as high as positive one FlapsCoefficientTO = (theAcftPt->aero.CLmaxTakeoff * 0.5 * theAcftPt->atm.getDensity(0.) * theAcftPt->S_Wing) / (theAcftPt->MTOM * G_FORCE); // Note here the use of MLM instead of MTOM FlapsCoefficientLDG = (theAcftPt->aero.CLmaxLanding * 0.5 * theAcftPt->atm.getDensity(0.) * theAcftPt->S_Wing) / (theAcftPt->MLM * G_FORCE); /* Diagram for die Clean-configuration */ - for (int i = 0 ; i <= theAcftPt->VDive + 5; i += step) { + for (int i = 0 ; i <= theAcftPt->VDive + convertUnit(KNOTS, METERPERSECOND, 5); i += step) { tempValues.speed = i; - tempValues.n_upperBound = calc_upperBoundClean(CleanCoefficientPos, convertUnit(KNOTS, METERPERSECOND, tempValues.speed)); - tempValues.n_lowerBound = calc_lowerBoundClean(CleanCoefficientNeg, convertUnit(KNOTS, METERPERSECOND, tempValues.speed)); + tempValues.n_upperBound = calc_upperBoundClean(CleanCoefficientPos, tempValues.speed); + tempValues.n_lowerBound = calc_lowerBoundClean(CleanCoefficientNeg, tempValues.speed); myCleanDiagram.push_back(tempValues); } /* Diagram for the Takeoff configuration */ for (int i = 0 ; i <= theAcftPt->VDive + 5; i += step) { // TODO(Ufermann): Determine maximum speed for TakeOff configuration tempValues.speed = i; - tempValues.n_upperBound = calc_upperBoundFlaps("Takeoff", FlapsCoefficientTO, convertUnit(KNOTS, METERPERSECOND, tempValues.speed)); + tempValues.n_upperBound = calc_upperBoundFlaps("takeoff", FlapsCoefficientTO, tempValues.speed); tempValues.n_lowerBound = 0; myTakeoffDiagram.push_back(tempValues); } /* Diagram for the Landing configuration */ - for (int i = 0 ; i <= theAcftPt->VDive + 5; i += step) { // TODO(Ufermann): Determine maximum speed for landing configuration + for (int i = 0 ; i <= theAcftPt->VDive + convertUnit(KNOTS, METERPERSECOND, 5); i += step) { // TODO(Ufermann): Determine maximum speed for landing configuration tempValues.speed = i; - tempValues.n_upperBound = calc_upperBoundFlaps("Landing", FlapsCoefficientLDG, convertUnit(KNOTS, METERPERSECOND, tempValues.speed)); + tempValues.n_upperBound = calc_upperBoundFlaps("landing", FlapsCoefficientLDG, tempValues.speed); tempValues.n_lowerBound = 0; myLandingDiagram.push_back(tempValues); } @@ -71,7 +71,7 @@ double VnDiagram::calc_upperBoundClean(double Coefficient, double v) { // v in return 0; } // Upper v Limit - if (v >= convertUnit(KNOTS, METERPERSECOND, theAcftPt->VDive)) { + if (v >= theAcftPt->VDive) { return 0; } // maximum n from config @@ -90,14 +90,14 @@ double VnDiagram::calc_lowerBoundClean(double Coefficient, double v) { return 0; } // upper v limit - if (v >= convertUnit(KNOTS, METERPERSECOND, theAcftPt->VDive)) { + if (v >= theAcftPt->VDive) { return 0; } // If v is interpolated linearly between VMO and VDive - if (v >= convertUnit(KNOTS, METERPERSECOND, theAcftPt->VMO) && v <= convertUnit(KNOTS, METERPERSECOND, theAcftPt->VDive)) { + if (v >= theAcftPt->VMO && v <= theAcftPt->VDive) { return mySettingsPt->myVnDiagramConstants.minNClean + ((0 - mySettingsPt->myVnDiagramConstants.minNClean) / - (convertUnit(KNOTS, METERPERSECOND, theAcftPt->VDive) - convertUnit(KNOTS, METERPERSECOND, theAcftPt->VMO))) * - (v - convertUnit(KNOTS, METERPERSECOND, theAcftPt->VMO)); + (theAcftPt->VDive - theAcftPt->VMO)) * + (v - theAcftPt->VMO); } // n limit if (n <= mySettingsPt->myVnDiagramConstants.minNClean) { @@ -109,9 +109,9 @@ double VnDiagram::calc_lowerBoundClean(double Coefficient, double v) { double VnDiagram::calc_upperBoundFlaps(const string &configuration, double Coefficient, double v) { double n(Coefficient * pow(v, 2)); - if (configuration == "Takeoff") { + if (configuration == "takeoff") { // upper limit v - if (v >= convertUnit(KNOTS, METERPERSECOND, theAcftPt->VDive)) { + if (v >= theAcftPt->VDive) { return 0; } // lower limit v @@ -125,9 +125,9 @@ double VnDiagram::calc_upperBoundFlaps(const string &configuration, double Coeff return n; } } - if (configuration == "Landing") { + if (configuration == "landing") { // upper limit v - if (v >= convertUnit(KNOTS, METERPERSECOND, theAcftPt->VDive)) { + if (v >= theAcftPt->VDive) { return 0; } // lower limit v diff --git a/performance_assessment/src/taw/defaultMethods/aircraft.cpp b/performance_assessment/src/taw/defaultMethods/aircraft.cpp index ed3e5d15bcd587ef9a4d5a4091d9056469af6e9e..4877a530f0d5aff2154e7e45eda82483edbb7b16 100644 --- a/performance_assessment/src/taw/defaultMethods/aircraft.cpp +++ b/performance_assessment/src/taw/defaultMethods/aircraft.cpp @@ -34,102 +34,55 @@ using std::endl; -aircraft::aircraft(const std::shared_ptr<RuntimeIO>& rtIO, const performance_assessment_settings &mySettings) +aircraft::aircraft(const std::shared_ptr<RuntimeIO>& rtIO, const std::shared_ptr<performance_assessment_settings> mySettingsPt) : rtIO(rtIO), - mySettingsPt(&mySettings), // Pointer to the settings - polarXML(aixml::openDocument(rtIO->getIODir() + "/aeroData/" + rtIO->acxml.at("/aircraft_exchange_file/analysis/aerodynamics/polar/polar_file/value"))), - // acftName(rtIO->aircraft_type() + rtIO->aircraft_model()), - // MTOM(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_takeoff_mass/mass_properties/mass").read(rtIO->acxml).value()), - // MLM(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_landing_mass/mass_properties/mass").read(rtIO->acxml).value()), - // OME(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_zero_fuel_mass/mass_properties/mass").read(rtIO->acxml).value()), - // MFM(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_fuel_mass/mass_properties/mass").read(rtIO->acxml).value()), - // maxPayload(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_fuel_mass/mass_properties/mass").read(rtIO->acxml).value()), - // MMO(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_flight_envelopemaximum_operating_mach_number") - // .read(rtIO->acxml).value()), - // VMO(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_flight_envelope/maximum_operating_velocity") - // .read(rtIO->acxml).value()), - // MDive(EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/speed/dive_mach_number").read(rtIO->acxml).value()), - // VDive(EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/speed/dive_velocity").read(rtIO->acxml).value()), - // MInitialCruise(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission_requirements/initial_cruise_Mach_number") - // .read(rtIO->acxml).value()), - // hInitialCruise(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission_requirements/initial_cruise_altitude") - // .read(rtIO->acxml).value()), - // hMaxOperating(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_flight_envelope/maximum_operating_altitude") - // .read(rtIO->acxml).value()), - // timeToClimb(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission_requirements/time_to_climb") - // .read(rtIO->acxml).value()), - // designRange(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/analysis/mission/design_mission/range").read(rtIO->acxml).value()), - // designPayload(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/maximum_structrual_payload_mass") - // .read(rtIO->acxml).value()), - // rangeMaxPayload(EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_max_payload_at_maximum_takeoff_mass").read(rtIO->acxml).value()), - // rangeMaxFuel(EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_max_fuel_at_maximum_takeoff_mass").read(rtIO->acxml).value()), - // payloadRangeMaxfuel(EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/payload_maximum_fuel_at_maximum_takeoff_mass").read(rtIO->acxml).value()), - // rangeFerry(EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_maximum_fuel_empty").read(rtIO->acxml).value()), - // numberEngines(rtIO->acxml.getVector(("/aircraft_exchange_file/component_design/propulsion/specific/propulsion"), 1).size()), - // S_Wing(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/aerodynamics/reference_values/S_ref").read(rtIO->acxml).value()), - // optCL(EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/aerodynamics/lift_coefficients/C_LoptimumCruise").read(rtIO->acxml).value()), - // frictionCoefficient(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/additional_requirements/landing_gear/friction_coefficient").read(rtIO->acxml).value()), - // brakingCoefficient(EndnodeReadOnly<double>( - // "/aircraft_exchange_file/requirements_and_specifications/requirements/additional_requirements/landing_gear/breaking_coefficient").read(rtIO->acxml).value()), - // // myEngine(rtIO->getEngineDataDir()), - myEngines(rtIO), - aero(rtIO->acxml, polarXML), + mySettingsPt(mySettingsPt), // Pointer to the settings delta_isa(EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/" + this->getMissionType() + "/delta_ISA").read(rtIO->acxml).value()), - // myMission(string(rtIO->getIODir(), rtIO->acxml.at("/aircraft_exchange_file/requirements_and_specifications/mission_files/" + this->getMissionType() + "/value"))) - myMission(rtIO->getIODir() + "/missionData/" + rtIO->acxml.at("/aircraft_exchange_file/requirements_and_specifications/mission_files/" + this->getMissionType() + "/value"), - delta_isa) - // engineInletD(checkBoundaries(rtIO->acxml.at("AcftExchangeFile/Propulsion/Engine@1/EngineDimensions/w_Engine"), 0., true, 20., true)), //Todo - // factorVLOF(1.1), - // factorV2(1.1) - { - + "requirements_and_specifications/requirements/top_level_aircraft_requirements/" + this->getMissionType() + "/delta_ISA").read(rtIO->acxml).value()), + myMission(rtIO->getMissionDataDir() + "/" + rtIO->acxml.at("requirements_and_specifications/mission_files/" + this->getMissionType() + "_file/value"), delta_isa), + myEngines(rtIO), + polarXML(aixml::openDocument(rtIO->getAeroDataDir() + "/" + rtIO->acxml.at("analysis/aerodynamics/polar/polar_file/value"))), + aero(rtIO->acxml, polarXML) { + /* Constructor */ // polarXML = aixml::openDocument(rtIO->getIODir() + "/aeroData/" + rtIO->acxml.at("/aircraft_exchange_file/analysis/aerodynamics/polar/polar_file/value")); acftName = rtIO->aircraft_type() + rtIO->aircraft_model(); MTOM = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_takeoff_mass/mass_properties/mass").read(rtIO->acxml).value(); MLM = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_landing_mass/mass_properties/mass").read(rtIO->acxml).value(); - OME = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_zero_fuel_mass/mass_properties/mass").read(rtIO->acxml).value(); - MFM =EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_fuel_mass/mass_properties/mass").read(rtIO->acxml).value(); - maxPayload = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_fuel_mass/mass_properties/mass").read(rtIO->acxml).value(); + OME = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/operating_mass_empty/mass_properties/mass").read(rtIO->acxml).value(); + MFM = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_fuel_mass/mass_properties/mass").read(rtIO->acxml).value(); + maxPayload = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/masses_cg_inertia/maximum_payload_mass/mass_properties/mass").read(rtIO->acxml).value(); MMO = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_flight_envelopemaximum_operating_mach_number") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/flight_envelope/maximum_operating_mach_number") .read(rtIO->acxml).value(); VMO = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_flight_envelope/maximum_operating_velocity") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/flight_envelope/maximum_operating_velocity") .read(rtIO->acxml).value(); - MDive = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/speed/dive_mach_number").read(rtIO->acxml).value(); - VDive = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/speed/dive_velocity").read(rtIO->acxml).value(); + MDive = EndnodeReadOnly<double>("/assessment/performance/speed/dive_mach_number", 0.).read(rtIO->acxml).value(); + VDive = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/speed/dive_velocity", 0.).read(rtIO->acxml).value(); MInitialCruise = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission_requirements/initial_cruise_Mach_number") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/initial_cruise_mach_number") .read(rtIO->acxml).value(); hInitialCruise = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission_requirements/initial_cruise_altitude") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/initial_cruise_altitude") .read(rtIO->acxml).value(); hMaxOperating = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_flight_envelope/maximum_operating_altitude") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/flight_envelope/maximum_operating_altitude") .read(rtIO->acxml).value(); timeToClimb = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission_requirements/time_to_climb") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/design_mission/time_to_climb") .read(rtIO->acxml).value(); designRange = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/mission/design_mission/range").read(rtIO->acxml).value(); designPayload = EndnodeReadOnly<double>("/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/maximum_structrual_payload_mass") .read(rtIO->acxml).value(); - rangeMaxPayload = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_max_payload_at_maximum_takeoff_mass").read(rtIO->acxml).value(); - rangeMaxFuel = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_max_fuel_at_maximum_takeoff_mass").read(rtIO->acxml).value(); - payloadRangeMaxfuel = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/payload_maximum_fuel_at_maximum_takeoff_mass").read(rtIO->acxml).value(); - rangeFerry = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_maximum_fuel_empty").read(rtIO->acxml).value(); + rangeMaxPayload = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_max_payload_at_maximum_takeoff_mass", 0.).read(rtIO->acxml).value(); + rangeMaxFuel = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_max_fuel_at_maximum_takeoff_mass", 0.).read(rtIO->acxml).value(); + payloadRangeMaxfuel = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/payload_maximum_fuel_at_maximum_takeoff_mass", + 0.).read(rtIO->acxml).value(); + rangeFerry = EndnodeReadOnly<double>("/aircraft_exchange_file/assessment/performance/range/range_maximum_fuel_empty", 0.).read(rtIO->acxml).value(); numberEngines = rtIO->acxml.getVector(("/aircraft_exchange_file/component_design/propulsion/specific/propulsion"), 1).size(); S_Wing = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/aerodynamics/reference_values/S_ref").read(rtIO->acxml).value(); + span = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/aerodynamics/reference_values/b").read(rtIO->acxml).value(); optCL = EndnodeReadOnly<double>("/aircraft_exchange_file/analysis/aerodynamics/lift_coefficients/C_LoptimumCruise").read(rtIO->acxml).value(); frictionCoefficient = EndnodeReadOnly<double>( "/aircraft_exchange_file/requirements_and_specifications/requirements/additional_requirements/landing_gear/friction_coefficient").read(rtIO->acxml).value(); @@ -139,23 +92,24 @@ aircraft::aircraft(const std::shared_ptr<RuntimeIO>& rtIO, const performance_ass // myEngines(rtIO); // aero = aerodynamics(rtIO->acxml, polarXML); // myMission = string(rtIO->getIODir(), rtIO->acxml.at("/aircraft_exchange_file/requirements_and_specifications/mission_files/" + this->getMissionType() + "/value")); - engineInletD = checkBoundaries(rtIO->acxml.at("AcftExchangeFile/Propulsion/Engine@1/EngineDimensions/w_Engine"), 0., true, 20., true); //Todo + factorVLOF = 1.1; factorV2 = 1.1; - /* Constructor */ /* Requirements */ myReqs.OEICruiseAltitude = EndnodeReadOnly<double>( "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/flight_envelope/maximum_one_engine_operating_altitude") .read(rtIO->acxml).value(); - myReqs.TOFL = EndnodeReadOnly<double>("/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/takeoff_distance/value") + myReqs.TOFL = EndnodeReadOnly<double>("/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/takeoff_distance") .read(rtIO->acxml).value(); - myReqs.LDN = EndnodeReadOnly<double>("/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/landing_field_length/value") + myReqs.LDN = EndnodeReadOnly<double>("/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/landing_field_length") .read(rtIO->acxml).value(); myReqs.approachSpeed = EndnodeReadOnly<double>( - "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/flight_envelope/maximum_approach_speed/value") + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/flight_envelope/maximum_approach_speed") .read(rtIO->acxml).value(); - myReqs.setRequiredClimbGradients(rtIO->acxml.at("/AcftExchangeFile/Requirements/DesignMission/ClimbGradients/"), this->numberEngines); + myReqs.icao_aerodrome_reference_code = EndnodeReadOnly<std::string>( + "/aircraft_exchange_file/requirements_and_specifications/requirements/top_level_aircraft_requirements/icao_aerodrome_reference_code").read(rtIO->acxml).value(); + this->myReqs.setRequiredClimbGradients(this->numberEngines); myChecks.TOFL = false; myChecks.LDN = false; myChecks.vApproach = false; @@ -184,18 +138,23 @@ aircraft::aircraft(const std::shared_ptr<RuntimeIO>& rtIO, const performance_ass myEnergyProviders.energyCarrierID_landing = EndnodeReadOnly<int>("energy_carrier_ID").read(rtIO->acxml.at("requirements_and_specifications/design_specification/propulsion/energy_provider/landing")).value(); - - //Determination of V2 for minimum climb gradients + // Determination of V2 for minimum climb gradients factorV2 = this->getMinimumFactorForV2(); - if (factorV2 <= 1.128) { //Par CS25.107: v2 !> 1.2 * vS or 1.128 * vSR (vS1g) + if (factorV2 <= 1.128) { // Par CS25.107: v2 !> 1.2 * vS or 1.128 * vSR (vS1g) factorVLOF = factorV2; } else { factorVLOF = 1.128; } + // Span limit + decipher_icao_ref_code(myReqs.icao_aerodrome_reference_code); // TODO(hansmann): Move span check somewhere else (e.g into factory) + if (span < myReqs.span_limit) { + myChecks.span_limit = true; + } else { + myChecks.span_limit = false; + } + /* Set atmosphere */ this->atm.setAtmosphere(0., ISA_TEMPERATURE + myMission.deltaISA, ISA_PRESSURE); - - } aircraft::~aircraft() { @@ -205,9 +164,9 @@ aircraft::~aircraft() { string aircraft::getMissionType() { string missionType; if (!mySettingsPt->designForMTOM && (mySettingsPt->mySwitches.doFuelPlanning && mySettingsPt->useStudyMissionForAnalysis)) { - missionType = "study_mission_file"; + missionType = "study_mission"; } else { - missionType = "design_mission_file"; + missionType = "design_mission"; } return missionType; } @@ -217,7 +176,7 @@ double aircraft::getReferenceStallSpeed(const double& aircraftMass, const double } double aircraft::v1gS_Clean(double Mass, double Altitude) { - return 1.0 * this->getReferenceStallSpeed(Mass, Altitude, this->aero.getCLmax(0., "Clean")); + return 1.0 * this->getReferenceStallSpeed(Mass, Altitude, this->aero.getCLmax(0., "clean")); } double aircraft::v1gS_TO(double Mass, double Altitude) { @@ -244,14 +203,16 @@ double aircraft::ROC(double Mass, double Alt, double Mach, double fACC, string C const aerodynamics& thisAERO) { // s. Scheiderer P.230 ff. // Determine engine carrier for climb phase - int energy_carrier_id = // TODO(hansmann): Consideration of varying energy carriers and operating strategies (shall be covered by engine.lib or multi_engine_prop.lib) - EndnodeReadOnly<int>("energy_carrier_ID").read(rtIO->acxml.at("requirements_and_specifications/design_specification/propulsion/energy_provider/climb")).value(); + int energy_carrier_id = 0; // TODO(hansmann): Consideration of varying energy carriers and operating strategies (shall be covered by engine.lib or multi_engine_prop.lib) myEngines.calculate_N1_with_penalties(energy_carrier_id, Alt, Mach, atm, 1.0, Rating, bleedOff, shaftOff); // Set operating point double ac_thrust = myEngines.get_thrust_aircraft(energy_carrier_id); double tempDrag(thisAERO.getCruiseDrag(Mach, Alt, 0.0, Mass, Configuration, atm)); if (OEI == true) { ac_thrust = ac_thrust * static_cast<double>(numberEngines - 1) / static_cast<double>(numberEngines); - tempDrag += calcWindMillingDrag(Mach, Alt); + tempDrag += calcWindMillingDrag(0, 0, Mach, Alt); + } + if (std::isnan(tempDrag)) { + tempDrag = ac_thrust; // Hansmann: Temporary workaround in case the polars deliver a NaN because of missing data } double tempGamma = asin((ac_thrust - tempDrag) / (G_FORCE * Mass) / (1. + fACC)); // because not with const. TAS but with const. IAS or Ma is risen //--> Introduction of facc: Commutation factor: facc = V/g * dV/dh; see table 11.1 p.232 @@ -262,45 +223,83 @@ double aircraft::ROC(double Mass, double Alt, double Mach, double fACC, string C return tempROC; } -double aircraft::calcWindMillingDrag(double Mach, double Altitude) { +double aircraft::calcWindMillingDrag(int energy_carrier_id, int engine_id, double Mach, double Altitude) { + double engine_inlet_diameter = myEngines.get_propulsors(energy_carrier_id).at(engine_id).engine.get_engine_dimensions().diameter; double tempCdWMJ(0.0); - tempCdWMJ = 0.0785 * pow(engineInletD, 2.) / S_Wing - + 2. / (1. + 0.16 * pow(Mach, 2.)) * 0.92 * (1.0 - 0.92) * (PI / 4. * pow(engineInletD, 2.)) / S_Wing; + tempCdWMJ = 0.0785 * pow(engine_inlet_diameter, 2.) / S_Wing + + 2. / (1. + 0.16 * pow(Mach, 2.)) * 0.92 * (1.0 - 0.92) * (PI / 4. * pow(engine_inlet_diameter, 2.)) / S_Wing; // tempCdWMJ = 0.75 * tempCdWMJ; return 0.5 * atm.getDensity(Altitude) * pow(Mach * atm.getSpeedOfSound(Altitude), 2.) * S_Wing * tempCdWMJ; } double aircraft::getMinimumFactorForV2() { double altitude(convertUnit(FOOT, METER, 400.)); // End of 2nd climb segment for standard departure according to FAR - double factor(1.); // Start value + double factor(1.); // Start value double tempClimbGradient(NAN); do { factor += 0.0025; double Mach = factor * this->v1gS_TO(this->MTOM, altitude) / this->atm.getSpeedOfSound(altitude); double tempTAS = convertUnit(MACH, TRUEAIRSPEED, altitude, this->atm, Mach); //this->ROC(..., true, ...): OEI active, which is a requirement for minimum climb gradient in 2nd climb segment - double tempROC = this->ROC(this->MTOM, altitude, Mach, 0.0, "Climb", "TO", this->myMission.bleedOffTO, this->myMission.shaftOffTO, true, this->aero); + double tempROC = this->ROC(this->MTOM, altitude, Mach, 0.0, "climb", "takeoff", this->myMission.bleedOffTO, this->myMission.shaftOffTO, true, this->aero); tempClimbGradient = tempROC / tempTAS * 100.; } while (tempClimbGradient < myReqs.climbGradientSecondTOSegment); return factor; } -void aircraft::Requirements::setRequiredClimbGradients(const node& climbGradientRequirement, const uint16_t& numberOfEngines) { +void aircraft::Requirements::setRequiredClimbGradients(const uint16_t& numberOfEngines) { if (numberOfEngines == 1) { myRuntimeInfo->err << "Climbing requirements are invalid for a single engine aircraft!" << endl; exit(1); } else if (numberOfEngines == 2) { - this->climbGradientSecondTOSegment = checkBoundaries(climbGradientRequirement.at("secondTOsegment"), 2.4, true, 10., true); - this->climbGradientFinalTOSegment = checkBoundaries(climbGradientRequirement.at("finalTOsegment"), 1.2, true, 10., true); - this->climbGradientApproachOEI = checkBoundaries(climbGradientRequirement.at("approachOEI"), 2.1, true, 10., true); + // this->climbGradientSecondTOSegment = checkBoundaries(climbGradientRequirement.at("secondTOsegment"), 2.4, true, 10., true); + // this->climbGradientFinalTOSegment = checkBoundaries(climbGradientRequirement.at("finalTOsegment"), 1.2, true, 10., true); + // this->climbGradientApproachOEI = checkBoundaries(climbGradientRequirement.at("approachOEI"), 2.1, true, 10., true); + this->climbGradientSecondTOSegment = 2.4; + this->climbGradientFinalTOSegment = 1.2; + this->climbGradientApproachOEI = 2.1; } else if (numberOfEngines == 3) { - this->climbGradientSecondTOSegment = checkBoundaries(climbGradientRequirement.at("secondTOsegment"), 2.7, true, 10., true); - this->climbGradientFinalTOSegment = checkBoundaries(climbGradientRequirement.at("finalTOsegment"), 1.5, true, 10., true); - this->climbGradientApproachOEI = checkBoundaries(climbGradientRequirement.at("approachOEI"), 2.4, true, 10., true); + // this->climbGradientSecondTOSegment = checkBoundaries(climbGradientRequirement.at("secondTOsegment"), 2.7, true, 10., true); + // this->climbGradientFinalTOSegment = checkBoundaries(climbGradientRequirement.at("finalTOsegment"), 1.5, true, 10., true); + // this->climbGradientApproachOEI = checkBoundaries(climbGradientRequirement.at("approachOEI"), 2.4, true, 10., true); + this->climbGradientSecondTOSegment = 2.7; + this->climbGradientFinalTOSegment = 1.5; + this->climbGradientApproachOEI = 2.4; } else if (numberOfEngines >= 4) { - this->climbGradientSecondTOSegment = checkBoundaries(climbGradientRequirement.at("secondTOsegment"), 3.0, true, 10., true); - this->climbGradientFinalTOSegment = checkBoundaries(climbGradientRequirement.at("finalTOsegment"), 1.7, true, 10., true); - this->climbGradientApproachOEI = checkBoundaries(climbGradientRequirement.at("approachOEI"), 2.7, true, 10., true); + // this->climbGradientSecondTOSegment = checkBoundaries(climbGradientRequirement.at("secondTOsegment"), 3.0, true, 10., true); + // this->climbGradientFinalTOSegment = checkBoundaries(climbGradientRequirement.at("finalTOsegment"), 1.7, true, 10., true); + // this->climbGradientApproachOEI = checkBoundaries(climbGradientRequirement.at("approachOEI"), 2.7, true, 10., true); + this->climbGradientSecondTOSegment = 3.0; + this->climbGradientFinalTOSegment = 1.7; + this->climbGradientApproachOEI = 2.7; + } + this->climbGradientApproachAEO = 3.2; +} + +void aircraft::decipher_icao_ref_code(const std::string icao_ref_code) { + if (icao_ref_code.length() != 6) { // TODO(hansmann): Add checks for other letters + throw std::invalid_argument("ICAO ref code malformed (length)!"); + } + // First letter: Field length + // (...) + // Second letter: Wing span + if (icao_ref_code[1] == 'A') { + myReqs.span_limit = 15.; + } else if (icao_ref_code[1] == 'B') { + myReqs.span_limit = 24.; + } else if (icao_ref_code[1] == 'C') { + myReqs.span_limit = 36.; + } else if (icao_ref_code[1] == 'D') { + myReqs.span_limit = 52.; + } else if (icao_ref_code[1] == 'E') { + myReqs.span_limit = 65.; + } else if (icao_ref_code[1] == 'F') { + myReqs.span_limit = 80.; + } else { + throw std::invalid_argument("ICAO ref code pos 2 malformed!"); } - this->climbGradientApproachAEO = checkBoundaries(climbGradientRequirement.at("approachAEO"), 3.2, true, 10., true); + // Third letter: Tail height + // (...) + // Fourth letter: Approach speed + // (...) } diff --git a/performance_assessment/src/taw/defaultMethods/aircraft.h b/performance_assessment/src/taw/defaultMethods/aircraft.h index e621e65a5d9d12bdc00e8a52bb6ac5fe4af7333e..ee1204b0b40568791ae84c63085bf872af832099 100644 --- a/performance_assessment/src/taw/defaultMethods/aircraft.h +++ b/performance_assessment/src/taw/defaultMethods/aircraft.h @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with UNICADO. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef performance_assessment_SRC_TAW_DEFAULTMETHODS_AIRCRAFT_H_ -#define performance_assessment_SRC_TAW_DEFAULTMETHODS_AIRCRAFT_H_ +#ifndef PERFORMANCE_ASSESSMENT_SRC_TAW_DEFAULTMETHODS_AIRCRAFT_H_ +#define PERFORMANCE_ASSESSMENT_SRC_TAW_DEFAULTMETHODS_AIRCRAFT_H_ #include <string> #include <memory> @@ -39,7 +39,7 @@ using std::string; class aircraft { public: const std::shared_ptr<RuntimeIO>& rtIO; - const performance_assessment_settings *mySettingsPt; /**< pointer to the mySettings object */ + const std::shared_ptr<performance_assessment_settings> mySettingsPt; /**< pointer to the mySettings object */ node& polarXML; /**< Address of aixml object for the polar file */ string acftName;/**<Name of the aircraft*/ @@ -95,6 +95,7 @@ class aircraft { energyProvider myEnergyProviders; double S_Wing; /**< Wing reference area (m2) */ + double span; /**< Wing span (m) */ double optCL; /**< Aircraft lift coefficient at cruise Mach number and highest lift to drag ratio (-) */ /* Landing Gear Properties */ @@ -110,7 +111,7 @@ class aircraft { * \param climbGradientRequirement const node: constant reference to aircraft node of Requirement/ClimbGradients [-] * \param numberOfEngines const uint16_t: constant reference to aircraft numberEngines [-] */ - void setRequiredClimbGradients(const node& climbGradientRequirement, const uint16_t& numberOfEngines); + void setRequiredClimbGradients(const uint16_t& numberOfEngines); // Member variables double OEICruiseAltitude; /**< Maximum operating altitude with one engine inoperative (ft) */ double TOFL; /**< Take-off field length (m) */ @@ -120,6 +121,9 @@ class aircraft { double climbGradientApproachOEI; /**< Required climb gradient for go-around during approach and one engine inoperative(%) */ double climbGradientApproachAEO; /**< Required climb gradient for go-around during approach (%) */ double approachSpeed; /**< Design approach speed (kts) */ + string icao_aerodrome_reference_code; // ICAO reference code - code_number 1-4 (field length) + code_letter A-F (wing span limits) + + // faa ADG code number I-VI (wing span limits + tail height limits) + Aircraft Approach Category letter A-D */ + double span_limit; /**< Maximum span limit according to ICAO ref code */ }; Requirements myReqs; @@ -139,6 +143,7 @@ class aircraft { bool climbGradientFinalSegment; /**< Switch if landing field length can be maintained (-) */ bool climbGradientApproachOEI; /**< Switch if landing field length can be maintained (-) */ bool climbGradientApproachAEO; /**< Switch if landing field length can be maintained (-) */ + bool span_limit; /**< Switch indicating of span limit is maintained (-) */ }; requirementChecks myChecks; @@ -199,6 +204,7 @@ class aircraft { */ double vAPPR(double Mass, double Altitude); + void decipher_icao_ref_code(const std::string icao_ref_code); /** \brief Function to calculate the rate of climb * \param Mass Aircraft mass (kg) @@ -208,7 +214,7 @@ class aircraft { * \param Configuration Aerodynamic configuration (-) * \param Rating Engine rating (-) * \param bleedOff Current bleed air offtake (kg/s) - * \param shaftOff Current shaft power offtake (kW) + * \param shaftOff Current shaft power offtake (W) * \param OEI Switch if one engine is inoperative (-) * \param thisAERO object of the aerodynamics class * \return rate of climb (m/s) @@ -222,20 +228,18 @@ class aircraft { * \param Altitude Aircraft altitude (m) * \return wind milling drag (N) */ - double calcWindMillingDrag(double Mach, double Altitude); + double calcWindMillingDrag(int energy_carrier_id, int engine_id, double Mach, double Altitude); /** \brief Constructor for an aircraft object - * \param mySettings Address to the performance_assessment_settings object + * \param mySettingsPt Address to the performance_assessment_settings object */ - explicit aircraft(const std::shared_ptr<RuntimeIO>& rtIO, const performance_assessment_settings &mySettings); + explicit aircraft(const std::shared_ptr<RuntimeIO>& rtIO, const std::shared_ptr<performance_assessment_settings> mySettingsPt); /** \brief Destructor for an aircraft object */ virtual ~aircraft(); private: - double engineInletD; /**< Width of the engine (m) */ - double factorVLOF; /**< Factor to calculate the take-off safety speed (-) */ double factorV2; /**< Factor to calculate the final take-off speed (-) */ @@ -247,4 +251,4 @@ class aircraft { double getMinimumFactorForV2(); }; -#endif // performance_assessment_SRC_TAW_DEFAULTMETHODS_AIRCRAFT_H_ +#endif // PERFORMANCE_ASSESSMENT_SRC_TAW_DEFAULTMETHODS_AIRCRAFT_H_ diff --git a/performance_assessment/src/taw/defaultMethods/ceilingPerformance/low_fidelity/ceilingPerformance.cpp b/performance_assessment/src/taw/defaultMethods/ceilingPerformance/low_fidelity/ceilingPerformance.cpp index 2ada5578cd3a5e77a4566d3abdcc45cfa6362b64..7eecd3133088a4734a263bebf53eaceddbc9ef19 100644 --- a/performance_assessment/src/taw/defaultMethods/ceilingPerformance/low_fidelity/ceilingPerformance.cpp +++ b/performance_assessment/src/taw/defaultMethods/ceilingPerformance/low_fidelity/ceilingPerformance.cpp @@ -40,9 +40,9 @@ void ceilingPerformance::doCeilingCalculation() { double lastAltMax(0.0); double lastAltMaxOEI(0.0); if (i == 0) { - lastAltService = 15000.; - lastAltMax = 15000.; - lastAltMaxOEI = 15000.; + lastAltService = 0.; //15000.; + lastAltMax = 0.; //15000.; + lastAltMaxOEI = 0.; //15000.; } else { lastAltService = theCeiling.back().serviceCeiling; lastAltMax = theCeiling.back().maxCeiling; @@ -51,9 +51,9 @@ void ceilingPerformance::doCeilingCalculation() { theCeiling.push_back(dataCeiling()); theCeiling.back().Mass = grossMass; theCeiling.back().Mach = theAcftPt->MInitialCruise; - theCeiling.back().serviceCeiling = iterateForCeiling(grossMass, 500. * 0.3048 / 60., theCeiling.back().Mach, lastAltService, false); + theCeiling.back().serviceCeiling = iterateForCeiling(grossMass, convertUnit(FOOT, METER, 500.) / 60., theCeiling.back().Mach, lastAltService, false); theCeiling.back().maxCeiling = iterateForCeiling(grossMass, 0.0, theCeiling.back().Mach, lastAltMax, false); - theCeiling.back().maxCeilingOEI = iterateForCeiling(0.925 * grossMass, 500.0 * 0.3048 / 60., theCeiling.back().Mach, lastAltMaxOEI, true); + theCeiling.back().maxCeilingOEI = iterateForCeiling(0.925 * grossMass, convertUnit(FOOT, METER, 500.) / 60., theCeiling.back().Mach, lastAltMaxOEI, true); } theAcftPt->myChecks.initCruiseAlt = checkForInitialCruiseAlt(); theAcftPt->myChecks.initCruiseM = checkForInitialCruiseMach(); @@ -62,41 +62,46 @@ void ceilingPerformance::doCeilingCalculation() { } double ceilingPerformance::iterateForCeiling(double Mass, double ROC, double Mach, double startAlt, bool OEI) { - double maxROC(-10.0); - while (ROC > maxROC && startAlt >= 0.0) { + double maxROC(10.0); + double max_engine_deck_altitude = 14000.; // TODO(hansmann): Engine deck data not sufficient if ceiling height >14000m (especially relevant for very OME-like weight scenario) + double altitude_increment = 50.; + while (ROC < maxROC && startAlt <= max_engine_deck_altitude) { try { if (OEI == true) { Mach = sqrt((2.*Mass * G_FORCE) / (theAcftPt->atm.getDensity(startAlt) * theAcftPt->S_Wing * theAcftPt->aero.CLoptimumCruise)) / theAcftPt->atm.getSpeedOfSound(startAlt); - // cout << "Mach(Ceiling): " << Mach << "Startalt = "<<startAlt<<endl; if (Mach > theAcftPt->MMO) { Mach = theAcftPt->MMO; } maxROC = theAcftPt->ROC(Mass, startAlt, Mach, 0.0, - "Clean", "MaxCont", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, true, + "clean", "maximum_continuous", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, true, theAcftPt->aero); } else { maxROC = theAcftPt->ROC(Mass, startAlt, Mach, 0.0, - "Clean", "MaxCont", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, false, + "clean", "maximum_continuous", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, false, theAcftPt->aero); } - startAlt = startAlt - 50.; - } catch (const char * text) { + startAlt = startAlt + altitude_increment; + } catch (std::out_of_range e) { myRuntimeInfo->info << "CL_max reached. Stop Ceiling calculation" << endl; break; } } + if (startAlt >= max_engine_deck_altitude - altitude_increment) { + myRuntimeInfo->warn << "Ceiling_performance evaluation reached max altitude ("<< startAlt-altitude_increment <<" m) evaluable by the engine deck." << endl; + myRuntimeInfo->warn << "Ceiling height results might be questionable for the considered A/C mass = "<< Mass << " kg." << endl; + } return startAlt; } bool ceilingPerformance::checkForInitialCruiseAlt() { bool Check(false); // Check whether service ceiling is sufficient - if (theCeiling.back().serviceCeiling < theAcftPt->hInitialCruise * 0.3048) { + if (theCeiling.back().serviceCeiling < theAcftPt->hInitialCruise) { myRuntimeInfo->out << "Performance too low, Initial Cruise Altitude cannot be achieved with MTOM!" << endl; - myRuntimeInfo->out << "Initial Cruise Altitude: " << theAcftPt->hInitialCruise << " ft" << endl; - myRuntimeInfo->out << "Service Ceiling at MTOM: " << theCeiling.back().serviceCeiling / 0.3048 << " ft" << endl; + myRuntimeInfo->out << "Initial Cruise Altitude: " << theAcftPt->hInitialCruise << " m" << endl; + myRuntimeInfo->out << "Service Ceiling at MTOM: " << theCeiling.back().serviceCeiling << " m" << endl; Check = false; } else { Check = true; @@ -107,13 +112,13 @@ bool ceilingPerformance::checkForInitialCruiseAlt() { bool ceilingPerformance::checkForInitialCruiseMach() { bool Check(false); // Check if the flyable initial Cruise Mach number is sufficient - theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_cruise, theAcftPt->hInitialCruise * 0.3048, theAcftPt->MInitialCruise, - theAcftPt->atm, 1., "MaxCont", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr); - double tempDrag(theAcftPt->aero.getCruiseDrag(theAcftPt->MInitialCruise, theAcftPt->hInitialCruise * 0.3048, 0.0, theCeiling.back().Mass, "Clean", theAcftPt->atm)); - if (tempDrag / 1000. > theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise)) { + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_cruise, theAcftPt->hInitialCruise, theAcftPt->MInitialCruise, + theAcftPt->atm, 1., "maximum_continuous", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr); + double tempDrag(theAcftPt->aero.getCruiseDrag(theAcftPt->MInitialCruise, theAcftPt->hInitialCruise, 0.0, theCeiling.back().Mass, "clean", theAcftPt->atm)); + if (tempDrag > theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise)) { myRuntimeInfo->out << "Performance too low, Initital Cruise Mach number cannot be achieved with MTOM!" << endl; - myRuntimeInfo->out << "Missing engine power: " << tempDrag / 1000. - theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) - / 1000. << " kN" << endl; + myRuntimeInfo->out << "Missing engine power: " << tempDrag - theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) + << " N" << endl; Check = false; } else { Check = true; @@ -124,10 +129,10 @@ bool ceilingPerformance::checkForInitialCruiseMach() { bool ceilingPerformance::checkForMaxAlt() { bool Check(false); // Check whether the maximum flight altitude can be reached. - if (theCeiling.at(0).serviceCeiling < theAcftPt->hMaxOperating * 0.3048) { + if (theCeiling.at(0).serviceCeiling < theAcftPt->hMaxOperating) { myRuntimeInfo->err << "Performance too low, Max. Operating Altitude cannot be achieved!" << endl; - myRuntimeInfo->err << "Max. Operating Altitude: " << theAcftPt->hMaxOperating << " ft" << endl; - myRuntimeInfo->err << "Service Ceiling at MTOM: " << theCeiling.at(0).serviceCeiling / 0.3048 << " ft" << endl; + myRuntimeInfo->err << "Max. Operating Altitude: " << theAcftPt->hMaxOperating << " m" << endl; + myRuntimeInfo->err << "Service Ceiling at MTOM: " << theCeiling.at(0).serviceCeiling / 0.3048 << " m" << endl; Check = false; } else { Check = true; @@ -137,10 +142,10 @@ bool ceilingPerformance::checkForMaxAlt() { bool ceilingPerformance::checkForOEICruiseAlt() { bool Check(false); - if (theCeiling.back().maxCeilingOEI < theAcftPt->myReqs.OEICruiseAltitude * 0.3048) { + if (theCeiling.back().maxCeilingOEI < theAcftPt->myReqs.OEICruiseAltitude) { myRuntimeInfo->out << "Performance too low, OEI max. Altitude cannot be achieved with MTOM!" << endl; - myRuntimeInfo->out << "Req. OEI max. Altitude: " << theAcftPt->myReqs.OEICruiseAltitude << " ft" << endl; - myRuntimeInfo->out << "Service Ceiling at MTOM: " << theCeiling.back().maxCeilingOEI / 0.3048 << " ft" << endl; + myRuntimeInfo->out << "Req. OEI max. Altitude: " << theAcftPt->myReqs.OEICruiseAltitude << " m" << endl; + myRuntimeInfo->out << "Service Ceiling at MTOM: " << theCeiling.back().maxCeilingOEI / 0.3048 << " m" << endl; Check = false; } else { Check = true; diff --git a/performance_assessment/src/taw/defaultMethods/enginePerformance/low_fidelity/enginePerformance.cpp b/performance_assessment/src/taw/defaultMethods/enginePerformance/low_fidelity/enginePerformance.cpp index 97d8d7a6f3bf726e973562531153a12ad73d96e3..e65979f7fcdee479867ed54df25144cb6053c281 100644 --- a/performance_assessment/src/taw/defaultMethods/enginePerformance/low_fidelity/enginePerformance.cpp +++ b/performance_assessment/src/taw/defaultMethods/enginePerformance/low_fidelity/enginePerformance.cpp @@ -23,7 +23,8 @@ namespace low { enginePerformance::enginePerformance(std::shared_ptr<aircraft> theAircraftPt) : - maxThrust(0.0) { + maxThrust(0.0), + theAircraftPt(theAircraftPt) { // ctor } enginePerformance::~enginePerformance() { @@ -41,9 +42,8 @@ void enginePerformance::doEngineCalculation(vector<string> theRating) { theAircraftPt->myEngines.calculate_N1_with_penalties(theAircraftPt->myEnergyProviders.energyCarrierID_cruise, alt, mach, theAircraftPt->atm, 1., theRatingEngine.back().Rating, 0., 0.); theRatingEngine.back().theParameter.back().Mach.push_back(mach); - theRatingEngine.back().theParameter.back().Thrust.push_back(theAircraftPt->myEngines.get_thrust_aircraft(theAircraftPt->myEnergyProviders.energyCarrierID_cruise) - / 2); - theRatingEngine.back().theParameter.back().SFC.push_back(theAircraftPt->myEngines.get_thrust_aircraft(theAircraftPt->myEnergyProviders.energyCarrierID_cruise) + theRatingEngine.back().theParameter.back().Thrust.push_back(theAircraftPt->myEngines.get_thrust_aircraft(theAircraftPt->myEnergyProviders.energyCarrierID_cruise)); + theRatingEngine.back().theParameter.back().SFC.push_back(theAircraftPt->myEngines.get_aircraft_fuelflow(theAircraftPt->myEnergyProviders.energyCarrierID_cruise) / theAircraftPt->myEngines.get_thrust_aircraft(theAircraftPt->myEnergyProviders.energyCarrierID_cruise)); } } diff --git a/performance_assessment/src/taw/defaultMethods/fuelPlanning/abstractFuelPlanning.h b/performance_assessment/src/taw/defaultMethods/fuelPlanning/abstractFuelPlanning.h index 48758309b58dcf617dfda8e69fe3f2bd37d8d47a..0a2af3b8d146906a370cc0e088022b3e5c85ae49 100644 --- a/performance_assessment/src/taw/defaultMethods/fuelPlanning/abstractFuelPlanning.h +++ b/performance_assessment/src/taw/defaultMethods/fuelPlanning/abstractFuelPlanning.h @@ -28,7 +28,7 @@ class performance_assessment_factory; /* Abstract class of fuel planning */ // The purpose of this class is to be inherited by all "fuelPlanning" (high/mid/.../low) methods. -class abstractFuelPlanning { +class abstractFuelPlanning : public std::enable_shared_from_this<abstractFuelPlanning> { public: virtual ~abstractFuelPlanning() { } virtual void doFuelPlanning() = 0; diff --git a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.cpp b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.cpp index 04942411c82298b90b5c0d5e905959cdf4891e01..ecb47ebcbf2686b03fa36fbf3be3c616030ca721 100644 --- a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.cpp +++ b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.cpp @@ -14,16 +14,17 @@ You should have received a copy of the GNU General Public License along with UNICADO. If not, see <http://www.gnu.org/licenses/>. */ + #include "flightSimulator.h" using std::endl; using std::string; -flightSimulator::flightSimulator(aircraft *theAircraft) +flightSimulator::flightSimulator(std::shared_ptr<aircraft> anAcftPtr) : - theAcftPt(theAircraft), + theAcftPt(anAcftPtr), climbAltSteps(50.), - cruiseSteps(10.) { + cruiseSteps(10000.) { //ctor } @@ -32,8 +33,8 @@ flightSimulator::~flightSimulator() { } double flightSimulator::calcTaxiFuel(double taxiTime) { - double totalTaxiTime = convertUnit(MINUTE, SECOND, taxiTime); // in s - theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_taxi, 0., 0., theAcftPt->atm, 1., "Idle", theAcftPt->myMission.bleedOffTO, + double totalTaxiTime = taxiTime; // in s + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_taxi, 0., 0., theAcftPt->atm, 1., "idle", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO); double theTaxiFuel = totalTaxiTime * theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_taxi); return theTaxiFuel; @@ -68,17 +69,18 @@ void flightSimulator::getClimbFuel(double grossMass, double startAlt, double e void flightSimulator::calcClimbFuel(double massAC, double H0, double H1, double Mach0, double Mach1, const string& config, string rating, double bleed, double shaft, aerodynamics AERO, double *theTime, double *theFuel, double *theDistance) { /* minimum climb performance */ - double a_minROC = convertUnit(FOOT, METER, theAcftPt->hInitialCruise) / theAcftPt->timeToClimb; //minimum ROC to maintain TTC requirement [m/s] - double m_minROC = (a_minROC - convertUnit(FOOTPERMINUTE, METERPERSECOND, 500.)) / (0. - convertUnit(FOOT, METER, theAcftPt->hInitialCruise)); + double a_minROC = theAcftPt->hInitialCruise / theAcftPt->timeToClimb; //minimum ROC to maintain TTC requirement [m/s] + // double m_minROC = (a_minROC - convertUnit(FOOTPERMINUTE, METERPERSECOND, 500.)) / (0. - theAcftPt->hInitialCruise); + double m_minROC = (a_minROC - convertUnit(FOOTPERMINUTE, METERPERSECOND, 500.)) / (0. - theAcftPt->hInitialCruise); double minimumROC0 = m_minROC * H0 + a_minROC; double minimumROC1 = m_minROC * H1 + a_minROC; // estimate according to Raymer, p.463 and equation 17.48-17.49 double ROC0 = theAcftPt->ROC(massAC, H0, Mach0, 0.0, config, rating, bleed, shaft, false, AERO); double ROC1 = theAcftPt->ROC(massAC, H1, Mach1, 0.0, config, rating, bleed, shaft, false, AERO); - //Increase the setting to "MaxCont" + //Increase the setting to "maximum_continuous" if (ROC0 <= minimumROC0 || ROC1 <= minimumROC1) { - rating = "MaxCont"; + rating = "maximum_continuous"; ROC0 = theAcftPt->ROC(massAC, H0, Mach0, 0.0, config, rating, bleed, shaft, false, AERO); ROC1 = theAcftPt->ROC(massAC, H1, Mach1, 0.0, config, rating, bleed, shaft, false, AERO); if (ROC0 <= 0. || ROC1 <= 0.) { @@ -165,7 +167,7 @@ double flightSimulator::calcThrustForROC(double massOfAC, double H, double Mach, (theAcftPt->atm.getDensity(H) * pow(Mach * theAcftPt->atm.getSpeedOfSound(H), 2.) * theAcftPt->S_Wing); double reqDrag = theAERO.getCLDrag(Mach, H, regLiftCoefficient, theConfiguration, theAcftPt->atm); double reqThrust = reqDrag + (G_FORCE * massOfAC) * theROC / (Mach * theAcftPt->atm.getSpeedOfSound(H)); - return convertUnit(NEWTON, KILO, NEWTON, reqThrust); //kN + return reqThrust; //N } /* Accelerate Fuel */ @@ -180,19 +182,20 @@ void flightSimulator::getAccelerateFuel(double grossMass, double Altitude, doubl // assumption of a constant acceleration -> linear increase in velocity double avgMach = 0.5 * (startMach + endMach); theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_cruise, Altitude, avgMach, theAcftPt->atm, 1.0, Rating, bleedOff, shaftOff); - double avgAcc = (1. / grossMass) * (convertUnit(KILO, NEWTON, NEWTON, theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise)) - - theAero.getCruiseDrag(avgMach, Altitude, 0.0, grossMass, Config, theAcftPt->atm)); - if (avgAcc <= 0. && Rating == "Cruise") { - Rating = "Climb"; + double average_thrust = theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); + double average_drag = theAero.getCruiseDrag(avgMach, Altitude, 0.0, grossMass, Config, theAcftPt->atm); + double avgAcc = (1. / grossMass) * (average_thrust - average_drag); + if (avgAcc <= 0. && Rating == "cruise") { + Rating = "climb"; theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_cruise, Altitude, avgMach, theAcftPt->atm, 1.0, Rating, bleedOff, shaftOff); - avgAcc = (1. / grossMass) * (convertUnit(KILO, NEWTON, NEWTON, theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise)) - - theAero.getCruiseDrag(avgMach, Altitude, 0.0, grossMass, Config, theAcftPt->atm)); + avgAcc = (1. / grossMass) * (theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise)) + - theAero.getCruiseDrag(avgMach, Altitude, 0.0, grossMass, Config, theAcftPt->atm); } - if (avgAcc <= 0. && Rating == "Climb") { - Rating = "MaxCont"; + if (avgAcc <= 0. && Rating == "climb") { + Rating = "maximum_continuous"; theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_climb, Altitude, avgMach, theAcftPt->atm, 1.0, Rating, bleedOff, shaftOff); - avgAcc = (1. / grossMass) * (convertUnit(KILO, NEWTON, NEWTON, theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_climb)) - - theAero.getCruiseDrag(avgMach, Altitude, 0.0, grossMass, Config, theAcftPt->atm)); + avgAcc = (1. / grossMass) * (theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_climb)) + - theAero.getCruiseDrag(avgMach, Altitude, 0.0, grossMass, Config, theAcftPt->atm); } if (avgAcc <= 0.) { myRuntimeInfo->err << "No acceleration possible!" << endl; @@ -205,17 +208,17 @@ void flightSimulator::getAccelerateFuel(double grossMass, double Altitude, doubl exit(1); } *accTime = fabs(endMach - startMach) * theAcftPt->atm.getSpeedOfSound(Altitude) / avgAcc; - *accDistance = convertUnit(METER, KILO, METER, *accTime * fabs(endMach - startMach) * theAcftPt->atm.getSpeedOfSound(Altitude)); + *accDistance = *accTime * fabs(endMach - startMach) * theAcftPt->atm.getSpeedOfSound(Altitude); *accFuel = theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise) * *accTime;; } bool flightSimulator::checkForAcceleration(double grossMass, double Altitude, double Mach, string Config, string Rating, double Derate, double bleedOff, double shaftOff, aerodynamics theAero) { double theDrag = theAero.getCruiseDrag(Mach, Altitude, 0., grossMass, Config, theAcftPt->atm); - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, Altitude, Mach, theAcftPt->atm, Derate, Rating, bleedOff, shaftOff, - convertUnit(NEWTON, KILO, NEWTON, theDrag)); // TODO(hansmann): cuise is currently hardcoded here as energy carrier - - if (0.995 * convertUnit(NEWTON, KILO, NEWTON, theDrag) > theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise)) { + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_cruise, Altitude, Mach, theAcftPt->atm, Derate, Rating, bleedOff, shaftOff); + // TODO(hansmann): cuise energy_carrier is currently hardcoded here as energy carrier + double currentThrust = theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); + if (0.995 * theDrag > currentThrust) { return false; } else { return true; @@ -232,16 +235,16 @@ void flightSimulator::getCruiseFuel(double grossMass, double Altitude, double Ma do { double theDrag = theAero.getCruiseDrag(Mach, Altitude, 0., grossMass, Config, theAcftPt->atm); theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, Altitude, Mach, theAcftPt->atm, 1.0, Rating, bleedOff, shaftOff, - convertUnit(NEWTON, KILO, NEWTON, theDrag)); + theDrag); double theThrust = theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); - if (0.995 * convertUnit(NEWTON, KILO, NEWTON, theDrag) > theThrust) { + if (0.995 * theDrag > theThrust) { myRuntimeInfo->err << "Error in cruise calculation! Abort!!!" << endl; myRuntimeInfo->err << "Thrust is not equal to resistance:" << endl; - myRuntimeInfo->err << "-> Thrust: " << theThrust << " kN" << endl; - myRuntimeInfo->err << "-> Drag: " << convertUnit(NEWTON, KILO, NEWTON, theDrag) << " kN" << endl; + myRuntimeInfo->err << "-> Thrust: " << theThrust << " N" << endl; + myRuntimeInfo->err << "-> Drag: " << theDrag << " N" << endl; exit(1); } - double segTime = (cruiseSteps * 1000.) / (Mach * theAcftPt->atm.getSpeedOfSound(Altitude)); + double segTime = cruiseSteps / (Mach * theAcftPt->atm.getSpeedOfSound(Altitude)); double segFuel = segTime * theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise); *cruiseTime += segTime; *cruiseFuel += segFuel; @@ -258,9 +261,9 @@ bool flightSimulator::checkForSteadyLevelFlight(double grossMass, double Altitud aerodynamics theAero) { double theDrag = theAero.getCruiseDrag(Mach, Altitude, 0., grossMass, Config, theAcftPt->atm); theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, Altitude, Mach, theAcftPt->atm, 1.0, Rating, bleedOff, shaftOff, - convertUnit(NEWTON, KILO, NEWTON, theDrag)); + theDrag); double theThrust = theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); - if (0.995 * convertUnit(NEWTON, KILO, NEWTON, theDrag) > theThrust) { + if (0.995 * theDrag > theThrust) { return false; } else { return true; @@ -273,9 +276,9 @@ void flightSimulator::getDescendFuel(double startAltitude, double endAltitude, d double deltaAltitude = fabs(startAltitude - endAltitude); double avgTAS = 0.5 * (startMach * theAcftPt->atm.getSpeedOfSound(startAltitude) + endMach * theAcftPt->atm.getSpeedOfSound(endAltitude)); - *descendDistance = convertUnit(METER, KILO, METER, 1. / tan(convertUnit(DEGREE, RADIAN, 5.)) * deltaAltitude); - *descendTime = sqrt(pow(convertUnit(KILO, METER, METER, *descendDistance), 2.) + pow(deltaAltitude, 2)) / avgTAS; - theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_descent, startAltitude, startMach, theAcftPt->atm, 1., "Idle", bleedOff, + *descendDistance = 1. / tan(convertUnit(DEGREE, RADIAN, 5.)) * deltaAltitude; + *descendTime = sqrt(pow(*descendDistance, 2.) + pow(deltaAltitude, 2)) / avgTAS; + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_descent, startAltitude, startMach, theAcftPt->atm, 1., "idle", bleedOff, shaftOff); *descendFuel = *descendTime * theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_descent); } diff --git a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.h b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.h index 4c1728d78c271140ba69d3dec815528d688f13e3..cb0f1300ff9d3898fe91b94ae65cc8d7818956cf 100644 --- a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.h +++ b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/flightSimulator.h @@ -24,6 +24,7 @@ #include <unitConversion/unitConversion.h> #include <string> +#include <memory> class aircraft; class aerodynamics; @@ -50,7 +51,7 @@ class flightSimulator { *\param Config Flaps configuration (-) *\param Rating Engine rating (-) *\param bleedOff Current bleed air offtake (kg/s) - *\param shaftOff Shaft power offtake (kW) + *\param shaftOff Shaft power offtake (W) *\param theAero Object of the aerodynamics class *\param climbFuel Fuel needed during climb phase (kg) *\param climbDistance Distance covered during climb phase (km) @@ -73,7 +74,7 @@ class flightSimulator { *\param Config Flaps configuration (-) *\param Rating Engine rating (-) *\param bleedOff Current bleed air offtake (kg/s) - *\param shaftOff Current shaft power offtake (kW) + *\param shaftOff Current shaft power offtake (W) *\param theAero Object of the aerodynamics class *\param accFuel Fuel needed during acceleration phase (kg) *\param accDistance Distance covered during acceleration phase (km) @@ -95,7 +96,7 @@ class flightSimulator { *\param Rating Engine rating (-) *\param Derate Artificial constant to reduce the engine spool speed (between 0 and 1) *\param bleedOff Current bleed air offtake (kg/s) - *\param shaftOff Current shaft power offtake (kW) + *\param shaftOff Current shaft power offtake (W) *\param theAero Object of the aerodynamics class *\return True or false */ @@ -112,7 +113,7 @@ class flightSimulator { *\param Config Flaps configuration (-) *\param Rating Engine rating (-) *\param bleedOff Current bleed air offtake (kg/s) - *\param shaftOff Current shaft power offtake (kW) + *\param shaftOff Current shaft power offtake (W) *\param theAero Object of the aerodynamics class *\param cruiseFuel Fuel needed during the cruise phase (kg) *\param cruiseDistance Distance covered during cruise phase (km) @@ -132,7 +133,7 @@ class flightSimulator { *\param Config Flap configuration (-) *\param Rating Engine rating (-) *\param bleedOff Current bleed air offtake (kg/s) - *\param shaftOff Current shaft power offtake (kW) + *\param shaftOff Current shaft power offtake (W) *\param theAero Object of the aerodynamics class *\return True or false */ @@ -148,7 +149,7 @@ class flightSimulator { *\param startMach Mach number at the start of the descend segment (-) *\param endMach Mach number at the end of the descend segment (-) *\param bleedOff Current bleed air offtake (kg/s) - *\param shaftOff Shaft power offtake (kW) + *\param shaftOff Shaft power offtake (W) *\param descendFuel Fuel needed during descend phase (kg) *\param descendDistance Distance covered during descend phase (km) *\param descendTime Time spent for the descend phase (s) @@ -161,7 +162,7 @@ class flightSimulator { /**\brief Constructor flightSimulator *\param theAircraft Address to the aircraft object */ - explicit flightSimulator(aircraft *theAircraft); + explicit flightSimulator(std::shared_ptr<aircraft> anAcftPtr); /**\brief Destructor flightSimulator object * @@ -169,10 +170,10 @@ class flightSimulator { virtual ~flightSimulator(); private: - aircraft *theAcftPt; /**< Pointer to the aircraft object */ + std::shared_ptr<aircraft> theAcftPt; /**< Pointer to the aircraft object */ double climbAltSteps; /**< Climb altitude steps (m) */ - double cruiseSteps; /**< Cruise steps (km) */ + double cruiseSteps; /**< Cruise steps (m) */ /**\brief Function to compute the climb fuel needed *\param massAC Aircraft mass (kg) @@ -183,7 +184,7 @@ class flightSimulator { *\param config Flap configuration (-) *\param rating Engine rating (-) *\param bleed Current bleed air (kg/s) - *\param shaft Shaft power (kW) + *\param shaft Shaft power (W) *\param AERO Object of the aerodynamics class *\param theTime Time spent in the climb phase (s) *\param theFuel Average fuel needed (kg) diff --git a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelFromMassFraction.cpp b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelFromMassFraction.cpp index 5f02d0434bc9cf74325da7facb97c52b9ddf04dc..73d2255d4f29e195ddab4c2781e436a139e0dc34 100644 --- a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelFromMassFraction.cpp +++ b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelFromMassFraction.cpp @@ -103,7 +103,7 @@ void fuelFromMassFraction::calcFuelFromMassFractions(double missionPayload, doub } else if (i == 2) { /* Climb and Accelerate */ fraction = 1.0065 - 0.0325 * theCruiseMach; } else if (i == 3) { /* Cruise */ - double thisRange = (missionRange - 300.) * 1000.; // m + double thisRange = (missionRange - 300000.); fraction = pow(2.71828, (-1.) * thisRange * theBreguetFactor); } else if (i == 4) { /* Descent */ fraction = 0.992; @@ -126,6 +126,7 @@ void fuelFromMassFraction::calcFuelFromMassFractions(double missionPayload, doub missionFuel += segmentFuel.back(); } if (segmentMass.back() < 0.) { + myRuntimeInfo->err << "Error in calcFuelFromMassFractions" << std::endl; exit(1); } } diff --git a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.cpp b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.cpp index a29299577e40b132dafea6c8cfb999b8fffcde2b..df912230365bdbe26b2f077bcd7b74567fd361a7 100644 --- a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.cpp +++ b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.cpp @@ -20,12 +20,12 @@ namespace low { -fuelPlanning::fuelPlanning(aircraft *theAircraft, const performance_assessment_settings *theSettings, const std::shared_ptr<RuntimeIO>& rtIO) +fuelPlanning::fuelPlanning(std::shared_ptr<aircraft> anAcftPtr, const std::shared_ptr<performance_assessment_settings> aSettingsPt, const std::shared_ptr<RuntimeIO>& rtIO) : rtIO(rtIO), - theAcftPt(theAircraft), - theSettingsPt(theSettings), - myFlightSim(theAircraft), + theAcftPt(anAcftPtr), + theSettingsPt(aSettingsPt), + myFlightSim(anAcftPtr), myBreguet(theAcftPt->OME, theAcftPt->MInitialCruise), relConFuel(theSettingsPt->myFuelPlan.contingencyFuel), P(pointData()) { @@ -80,7 +80,7 @@ void fuelPlanning::doPayloadRangeOLD() { double tempBreguetFactor(0.); // where is theMissionFuel.at(i+1).consumedFuel (see below) set/calculated? for (unsigned int i(0); i <= theAcftPt->myMission.Steps.size() - 1; i++) { - if (theAcftPt->myMission.Steps.at(i).modeStep == "Cruise") { + if (theAcftPt->myMission.Steps.at(i).modeStep == "cruise") { if ((1. / (1. - theMissionFuel.at(i + 1).consumedFuel / theMissionFuel.at(i).Mass)) < 10e-8) { myRuntimeInfo->err << "Abort: Log-Argument becomes too small!!!" << std::endl; myRuntimeInfo->err << "1 / (1-f_consumed/f_mission) = " << (1. / (1. - theMissionFuel.at(i + 1).consumedFuel / theMissionFuel.at(i).Mass)) << std::endl; @@ -163,8 +163,7 @@ void fuelPlanning::doPayloadRangeOLD() { void fuelPlanning::doFuelPayloadRangeOLD() { if (!fileExists(rtIO->getCsvFilesDirTool())) { myRuntimeInfo->out << "Create csvOutput folder in program folder: " << rtIO->getCsvFilesDirTool() << std::endl; - CreateDirectory(rtIO->getCsvFilesDirTool().c_str(), NULL); //...Create folder - + CreateDirectory(rtIO->getCsvFilesDirTool().c_str(), NULL); // ...Create folder } std::ofstream plot; string plotFile(rtIO->getCsvFilesDirTool() + "performance_assessment" + "_fuelPayloadRange.csv"); // Replaced global variable "TOOLNAME" (?) @@ -261,7 +260,7 @@ void fuelPlanning::calcStandardFuelPlanning(double *theTaxiFuelTakeoff, double * exit(1); } *theTripFuel = this->fastFuelEstimate(myAERO); - *theMissionFuel = *theTripFuel;//initialization of the mission fuel + *theMissionFuel = *theTripFuel; // initialization of the mission fuel *theTaxiFuelTakeoff = myFlightSim.calcTaxiFuel(theAcftPt->myMission.taxiTimeOrigin); *theTaxiFuelLanding = myFlightSim.calcTaxiFuel(theAcftPt->myMission.taxiTimeDestination); double oldMissionFuel(0.); @@ -269,16 +268,16 @@ void fuelPlanning::calcStandardFuelPlanning(double *theTaxiFuelTakeoff, double * do { oldMissionFuel = *theMissionFuel; double acMass = theAcftPt->OME + thePayload + *theMissionFuel; - acMass -= *theTaxiFuelTakeoff; //Take-off mass + acMass -= *theTaxiFuelTakeoff; // Take-off mass *theTripFuel = this->calcMissionFuel(acMass, theRange, writingMissionData, myAERO); acMass -= *theTripFuel; *theAlternateFuel = this->calcAlternateFuel(acMass, myAERO); acMass -= *theAlternateFuel; *theFinalReserveFuel = this->calcFinalReserveFuel(acMass, myAERO); *theContigencyFuel = relConFuel * *theTripFuel; - //no taxi fuel at landing necessary if reserve fuel is used + // no taxi fuel at landing necessary if reserve fuel is used *theMissionFuel = *theTaxiFuelTakeoff + *theTripFuel + *theAlternateFuel + *theFinalReserveFuel + *theContigencyFuel; - //*theTripFuel = *theTaxiFuel + *theMissionFuel + *theAlternateFuel + *theFinalReserveFuel + *theContigencyFuel; + // *theTripFuel = *theTaxiFuel + *theMissionFuel + *theAlternateFuel + *theFinalReserveFuel + *theContigencyFuel; ID++; if (ID >= 30) { myRuntimeInfo->out << "Attention: No tank convergence could be achieved." << std::endl; @@ -318,26 +317,28 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss double time(0.); double Drag(0.); /* TakeOff, Climb, Accelerate, Cruise, Descend, Landing */ - if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "TakeOff") { + if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "takeoff") { time = convertUnit(MINUTE, SECOND, 1.); // Assumption that take-off lasts 1 minute - Drag = 0.0; - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_takeoff, P.Altitude, P.Mach, theAcftPt->atm, P.derate, P.rating, - P.bleedOff, P.shaftOff, convertUnit(NEWTON, KILO, NEWTON, Drag)); + // Drag = 0.0; // TODO(hansmann): Wechsel von Drag=0.0 & calculate_N1_with_thrustlimit auf calculate_N1_with_penalties mit vollschub abklären + // theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_takeoff, P.Altitude, P.Mach, theAcftPt->atm, P.derate, P.rating, + // P.bleedOff, P.shaftOff, convertUnit(NEWTON, KILO, NEWTON, Drag)); + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_takeoff, P.Altitude, P.Mach, theAcftPt->atm, P.derate, P.rating, + P.bleedOff, P.shaftOff); missionFuel.push_back(time * theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_takeoff)); - } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "Climb") { + } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "climb") { time = 0.0; distance = 0.; if (theAcftPt->myMission.Steps.at(i - 1).endAltitude < theAcftPt->myMission.Steps.at(i).endAltitude) { missionFuel.push_back(0.); - myFlightSim.getClimbFuel(acMass, convertUnit(FOOT, METER, theAcftPt->myMission.Steps.at(i - 1).endAltitude), - convertUnit(FOOT, METER, theAcftPt->myMission.Steps.at(i).endAltitude), theAcftPt->myMission.Steps.at(i - 1).endMach, + myFlightSim.getClimbFuel(acMass, theAcftPt->myMission.Steps.at(i - 1).endAltitude, + theAcftPt->myMission.Steps.at(i).endAltitude, theAcftPt->myMission.Steps.at(i - 1).endMach, theAcftPt->myMission.Steps.at(i).endMach, P.config, P.rating, P.bleedOff, P.shaftOff, theAERO, &missionFuel.back(), &distance, &time); } else { myRuntimeInfo->out << "... No change in altitude despite climb segment." << std::endl; missionFuel.push_back(0.0); } flownDistance += distance; - } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "Accelerate") { + } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "accelerate") { Drag = 0.0; time = 0.0; distance = 0.; @@ -348,8 +349,8 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss myRuntimeInfo->out << errMsg << std::endl; myRuntimeInfo->out << "Try to increase rating..." << std::endl; } - if (checkAcceleration == false && P.rating == "Cruise") { - P.rating = "Climb"; + if (checkAcceleration == false && P.rating == "cruise") { + P.rating = "climb"; try { checkAcceleration = myFlightSim.checkForAcceleration(acMass, P.Altitude, P.Mach, P.config, P.rating, P.derate, P.bleedOff, P.shaftOff, theAERO); @@ -358,8 +359,8 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss myRuntimeInfo->out << "Try to increase rating..." << std::endl; } } - if (checkAcceleration == false && P.rating == "Climb") { - P.rating = "MaxCont"; + if (checkAcceleration == false && P.rating == "climb") { + P.rating = "maximum_continuous"; try { checkAcceleration = myFlightSim.checkForAcceleration(acMass, P.Altitude, P.Mach, P.config, P.rating, P.derate, P.bleedOff, P.shaftOff, theAERO); @@ -379,9 +380,9 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss theAERO, &missionFuel.back(), &distance, &time); flownDistance += distance; - } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "Cruise") { + } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "cruise") { if (firstCruise == true) { - distanceCruise = Range - flownDistance - (convertUnit(METER, KILO, METER, 10000.)) / tan(convertUnit(DEGREE, RADIAN, 5.)); + distanceCruise = Range - flownDistance - 10000. / tan(convertUnit(DEGREE, RADIAN, 5.)); flownCruise = 0.; firstCruise = false; } @@ -391,8 +392,8 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss myRuntimeInfo->out << errMsg << std::endl; myRuntimeInfo->out << "Try to increase rating..." << std::endl; } - if (checkSteadyLevelFlight == false && P.rating == "Cruise") { - P.rating = "Climb"; + if (checkSteadyLevelFlight == false && P.rating == "cruise") { + P.rating = "climb"; try { checkSteadyLevelFlight = myFlightSim.checkForSteadyLevelFlight(acMass, P.Altitude, P.Mach, P.config, P.rating, P.bleedOff, P.shaftOff, theAERO); } catch (const std::string& errMsg) { @@ -400,8 +401,8 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss myRuntimeInfo->out << "Try to increase rating..." << std::endl; } } - if (checkSteadyLevelFlight == false && P.rating == "Climb") { - P.rating = "MaxCont"; + if (checkSteadyLevelFlight == false && P.rating == "climb") { + P.rating = "maximum_continuous"; try { checkSteadyLevelFlight = myFlightSim.checkForSteadyLevelFlight(acMass, P.Altitude, P.Mach, P.config, P.rating, P.bleedOff, P.shaftOff, theAERO); } catch (const std::string& errMsg) { @@ -430,19 +431,19 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss time = 0.; myFlightSim.getCruiseFuel(acMass, P.Altitude, P.Mach, P.config, P.rating, P.bleedOff, P.shaftOff, theAERO, &missionFuel.back(), cruiseRange, &time); - } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "Descend") { + } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "descend") { time = 0.; missionFuel.push_back(0.); - myFlightSim.getDescendFuel(convertUnit(FOOT, METER, theAcftPt->myMission.Steps.at(i - 1).endAltitude), - convertUnit(FOOT, METER, theAcftPt->myMission.Steps.at(i).endAltitude), theAcftPt->myMission.Steps.at(i - 1).endMach, + myFlightSim.getDescendFuel(theAcftPt->myMission.Steps.at(i - 1).endAltitude, + theAcftPt->myMission.Steps.at(i).endAltitude, theAcftPt->myMission.Steps.at(i - 1).endMach, theAcftPt->myMission.Steps.at(i).endMach, P.bleedOff, P.shaftOff, &missionFuel.back(), &distance, &time); flownDistance += distance; - } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "Landing") { + } else if (theAcftPt->myMission.Steps.at(i).Point.simplifiedMODE == "landing") { Drag = 0.0; time = convertUnit(MINUTE, SECOND, 2.0); // Assume the final approach and landing will take 2 minutes. distance = 0.; - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_landing, P.Altitude, P.Mach, theAcftPt->atm, P.derate, P.rating, P.bleedOff, P.shaftOff, - convertUnit(NEWTON, KILO, NEWTON, Drag)); + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_landing, P.Altitude, P.Mach, theAcftPt->atm, P.derate, P.rating, + P.bleedOff, P.shaftOff); missionFuel.push_back(time * theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_landing)); } else { myRuntimeInfo->err << "unknown simplified Mode !" << std::endl; @@ -454,7 +455,7 @@ double fuelPlanning::calcMissionFuel(double acMass, double Range, bool writeMiss double maxROC(0.); theMissionFuel.push_back(missionFuelData()); theMissionFuel.back().Time = time; - theMissionFuel.back().Range = convertUnit(KILO, METER, METER, distance); + theMissionFuel.back().Range = distance; theMissionFuel.back().Altitude = P.Altitude; theMissionFuel.back().TAS = P.TAS; theMissionFuel.back().Mach = P.Mach; @@ -474,7 +475,7 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { double Fuel(0.0); double alternateAlt = convertUnit(FOOT, METER, 27000.); double alternateMach = 0.95 * theAcftPt->MInitialCruise; - double tempAlternateRange = theAcftPt->myMission.alternateRange - 1. * convertUnit(METER, KILO, METER, alternateAlt) / tan(convertUnit(DEGREE, RADIAN, 5.)); + double tempAlternateRange = theAcftPt->myMission.alternateRange - 1. * alternateAlt / tan(convertUnit(DEGREE, RADIAN, 5.)); /* Climb */ double tempTime(0.); double climbFuel(0.); @@ -483,7 +484,7 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { double climbTAS = theAcftPt->v2(acMass, convertUnit(FOOT, METER, 750.)) + convertUnit(KNOTS, METERPERSECOND, 10.); myFlightSim.getClimbFuel(acMass, 0.0, convertUnit(FOOT, METER, 1500.), climbTAS / theAcftPt->atm.getSpeedOfSound(0.), climbTAS / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 1500.)), - "Climb", "TO", 0.0, 0.0, theAERO, + "climb", "takeoff", 0.0, 0.0, theAERO, &climbFuel, &climbDistance, &tempTime); Fuel += climbFuel; acMass -= climbFuel; @@ -495,7 +496,7 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { myFlightSim.getAccelerateFuel(acMass, convertUnit(FOOT, METER, 1500.), climbTAS / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 1500.)), convertUnit(KNOTS, METERPERSECOND, 250.) / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 1500.)), - "Clean", "TO", 0.0, 0.0, theAERO, + "clean", "takeoff", 0.0, 0.0, theAERO, &climbFuel, &climbDistance, &tempTime); Fuel += climbFuel; acMass -= climbFuel; @@ -504,11 +505,11 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { tempTime = 0.; climbFuel = 0.; climbDistance = 0.; - climbTAS = 250. * (1.852 / 3.6); - myFlightSim.getClimbFuel(acMass, 1500.*0.3048, 10000.*0.3048, - climbTAS / theAcftPt->atm.getSpeedOfSound(1500.*0.3048), climbTAS / theAcftPt->atm.getSpeedOfSound(10000.*0.3048), - "Clean", "MaxCont", 0.0, 0.0, theAERO, - &climbFuel, &climbDistance, &tempTime); + climbTAS = convertUnit(KNOTS, METERPERSECOND, 250); + myFlightSim.getClimbFuel(acMass, convertUnit(FOOT, METER, 1500.), convertUnit(FOOT, METER, 10000.), + climbTAS / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 1500.)), climbTAS / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 10000.)), + "clean", "maximum_continuous", 0.0, 0.0, theAERO, + &climbFuel, &climbDistance, &tempTime); Fuel += climbFuel; acMass -= climbFuel; tempAlternateRange -= climbDistance; @@ -516,10 +517,10 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { tempTime = 0.; climbFuel = 0.; climbDistance = 0.; - myFlightSim.getAccelerateFuel(acMass, 10000.*0.3048, - climbTAS / theAcftPt->atm.getSpeedOfSound(10000.*0.3048), - 300.* (1.852 / 3.6) / theAcftPt->atm.getSpeedOfSound(10000.*0.3048), - "Clean", "MaxCont", 0.0, 0.0, theAERO, + myFlightSim.getAccelerateFuel(acMass, convertUnit(FOOT, METER, 10000.), + climbTAS / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 10000.)), + convertUnit(KNOTS, METERPERSECOND, 300) / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 10000.)), + "clean", "maximum_continuous", 0.0, 0.0, theAERO, &climbFuel, &climbDistance, &tempTime); Fuel += climbFuel; acMass -= climbFuel; @@ -531,7 +532,7 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { climbTAS = 300. * (1.852 / 3.6); myFlightSim.getClimbFuel(acMass, 10000.*0.3048, alternateAlt, climbTAS / theAcftPt->atm.getSpeedOfSound(10000.*0.3048), climbTAS / theAcftPt->atm.getSpeedOfSound(alternateAlt), - "Clean", "Climb", 0.0, 0.0, theAERO, + "clean", "climb", 0.0, 0.0, theAERO, &climbFuel, &climbDistance, &tempTime); Fuel += climbFuel; acMass -= climbFuel; @@ -544,7 +545,7 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { myFlightSim.getAccelerateFuel(acMass, alternateAlt, climbTAS / theAcftPt->atm.getSpeedOfSound(10000.*0.3048), alternateMach, - "Clean", "MaxCont", 0.0, 0.0, theAERO, + "clean", "maximum_continuous", 0.0, 0.0, theAERO, &climbFuel, &climbDistance, &tempTime); Fuel += climbFuel; acMass -= climbFuel; @@ -557,7 +558,7 @@ double fuelPlanning::calcAlternateFuel(double acMass, aerodynamics theAERO) { tempTime = 0.; climbFuel = 0.; climbDistance = 0.; - myFlightSim.getCruiseFuel(acMass, alternateAlt, alternateMach, "Clean", "MaxCont", 0.0, 0.0, theAERO, + myFlightSim.getCruiseFuel(acMass, alternateAlt, alternateMach, "clean", "maximum_continuous", 0.0, 0.0, theAERO, &climbFuel, tempAlternateRange, &tempTime); Fuel += climbFuel; return Fuel; @@ -568,15 +569,16 @@ double fuelPlanning::calcFinalReserveFuel(double acMass, aerodynamics theAERO) { // SARPerformance SAR(*theAcftPt); // Determining the most effective speed via SAR double holdingM(0.); - double holdingSpeed = 1.05 * theAcftPt->v1gS_Clean(acMass, convertUnit(FOOT, METER, 1500.)); - holdingM = calcBestSARSpeed(convertUnit(FOOT, METER, 1500.), acMass, holdingSpeed, convertUnit(KNOTS, METERPERSECOND, 250.)); - double holdingDrag = theAERO.getCruiseDrag(holdingM, convertUnit(FOOT, METER, 1500.), 0., acMass, "Clean", theAcftPt->atm); - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, convertUnit(FOOT, METER, 1500.), holdingM, theAcftPt->atm, 1., - "MaxCont", 0.0, 0.0, convertUnit(NEWTON, KILO, NEWTON, holdingDrag)); + double holding_altitude = convertUnit(FOOT, METER, 1500.); + double holdingSpeed = 1.05 * theAcftPt->v1gS_Clean(acMass, holding_altitude); + holdingM = calcBestSARSpeed(holding_altitude, acMass, holdingSpeed, convertUnit(KNOTS, METERPERSECOND, 250.)); + double holdingDrag = theAERO.getCruiseDrag(holdingM, holding_altitude, 0., acMass, "clean", theAcftPt->atm); + theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, holding_altitude, holdingM, theAcftPt->atm, 1., + "maximum_continuous", 0.0, 0.0, holdingDrag); double LoverD = (G_FORCE * acMass) / holdingDrag; double SFC = theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise) - / theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise); - return acMass * (expm1(convertUnit(MINUTE, SECOND, 30.) * G_FORCE * SFC / 1000. * 1. / LoverD)); // return calcBreguet(acMass, 30.*60., SFC, LoverD); + / theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); + return acMass * (expm1(convertUnit(MINUTE, SECOND, 30.) * G_FORCE * SFC * 1. / LoverD)); // return calcBreguet(acMass, 30.*60., SFC, LoverD); } double fuelPlanning::calcBestSARSpeed(double alt, double mass, double lowerSpeed, double upperSpeed) { @@ -584,7 +586,7 @@ double fuelPlanning::calcBestSARSpeed(double alt, double mass, double lowerSpeed double tempSAR(0.); double tempMach(lowerSpeed / theAcftPt->atm.getSpeedOfSound(alt)); while (lowerSpeed < upperSpeed) { - if (tempSAR <= SAR.calculateSAR(mass, alt, lowerSpeed / theAcftPt->atm.getSpeedOfSound(alt), "Climb", "Clean")) { + if (tempSAR <= SAR.calculateSAR(mass, alt, lowerSpeed / theAcftPt->atm.getSpeedOfSound(alt), "climb", "clean")) { tempMach = lowerSpeed / theAcftPt->atm.getSpeedOfSound(convertUnit(FOOT, METER, 1500.)); } lowerSpeed += 0.5; @@ -593,7 +595,7 @@ double fuelPlanning::calcBestSARSpeed(double alt, double mass, double lowerSpeed } double fuelPlanning::calcBreguet(double W0, double Time, double theSFC, double theLoD) { - return W0 * (1. - 1. / exp(Time * G_FORCE * theSFC / 1000. * 1. / theLoD)); + return W0 * (1. - 1. / exp(Time * G_FORCE * theSFC * 1. / theLoD)); } //double fuelPlanning::calcRangeForMass(double Range0, double Range1, double Mass0, double Mass1, double targetMass) { @@ -606,9 +608,9 @@ double fuelPlanning::calcBreguet(double W0, double Time, double theSFC, double t void fuelPlanning::setP(int ID) { P.Mach = theAcftPt->myMission.Steps.at(ID).Point.Mach; - P.Altitude = convertUnit(FOOT, METER, theAcftPt->myMission.Steps.at(ID).Point.Altitude); - P.TAS = convertUnit(KNOTS, METERPERSECOND, theAcftPt->myMission.Steps.at(ID).Point.TAS); - P.ROC = convertUnit(FOOTPERMINUTE, METERPERSECOND, theAcftPt->myMission.Steps.at(ID).Point.ROC); + P.Altitude = theAcftPt->myMission.Steps.at(ID).Point.Altitude; + P.TAS = theAcftPt->myMission.Steps.at(ID).Point.TAS; + P.ROC = theAcftPt->myMission.Steps.at(ID).Point.ROC; P.derate = theAcftPt->myMission.Steps.at(ID).derating; P.bleedOff = theAcftPt->myMission.Steps.at(ID).Point.bleedOffTakes; P.shaftOff = theAcftPt->myMission.Steps.at(ID).Point.shaftOffTakes; @@ -634,14 +636,14 @@ void fuelPlanning::setP(int ID) { void low::fuelPlanning::exitAcceleration(int ID, pointData theP, double massAircraft) { double Drag = theAcftPt->aero.getCruiseDrag(theP.Mach, theP.Altitude, 0., massAircraft, theP.config, theAcftPt->atm); - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, theP.Altitude, theP.Mach, theAcftPt->atm, theP.derate, theP.rating, theP.bleedOff, theP.shaftOff, Drag / 1000.); + theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, theP.Altitude, theP.Mach, theAcftPt->atm, theP.derate, theP.rating, theP.bleedOff, theP.shaftOff, Drag); myRuntimeInfo->err << "Error in fuel estimation!" << std::endl; myRuntimeInfo->err << "Thrust does not allow acceleration!" << std::endl; myRuntimeInfo->err << "mission segment: " << ID << std::endl; myRuntimeInfo->err << "Mission mode: " << theAcftPt->myMission.Steps.at(ID).modeStep << std::endl; - myRuntimeInfo->err << "available thrust: " << theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) << " kN" << std::endl; - myRuntimeInfo->err << "drag: " << Drag / 1000. << " kN" << std::endl; - myRuntimeInfo->err << "flight altitude: " << theP.Altitude / 0.3048 << " ft" << std::endl; + myRuntimeInfo->err << "available thrust: " << theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) << " N" << std::endl; + myRuntimeInfo->err << "drag: " << Drag << " N" << std::endl; + myRuntimeInfo->err << "flight altitude: " << theP.Altitude << " m" << std::endl; myRuntimeInfo->err << "Mach number: " << theP.Mach << "" << std::endl; myRuntimeInfo->err << "Engine-Rating: " << theP.rating << std::endl; exit(1); @@ -652,21 +654,21 @@ void low::fuelPlanning::exitSteadyLevelFlight(int ID, pointData theP, double the myRuntimeInfo->err << "Thrust does not allow Steady Level Flight!" << std::endl; myRuntimeInfo->err << "Mission segment: " << ID << std::endl; myRuntimeInfo->err << "Mission mode: " << theAcftPt->myMission.Steps.at(ID).modeStep << std::endl; - myRuntimeInfo->err << "available thrust: " << theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise)/1000. << " kN" << std::endl; - myRuntimeInfo->err << "drag: " << theDrag / 1000. << " kN" << std::endl; - myRuntimeInfo->err << "flight altitude: " << theP.Altitude / 0.3048 << " ft" << std::endl; + myRuntimeInfo->err << "available thrust: " << theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) << " N" << std::endl; + myRuntimeInfo->err << "drag: " << theDrag << " N" << std::endl; + myRuntimeInfo->err << "flight altitude: " << theP.Altitude << " m" << std::endl; myRuntimeInfo->err << "Mach number: " << theP.Mach << "" << std::endl; myRuntimeInfo->err << "Engine-Rating: " << theP.rating << std::endl; exit(1); } double low::fuelPlanning::fastFuelEstimate(aerodynamics theAERO) { - double Time = convertUnit(KILO, METER, METER, theAcftPt->myMission.missionRange) / (theAcftPt->myMission.crMach * theAcftPt->atm.getSpeedOfSoundISA(10000.)); + double Time = theAcftPt->myMission.missionRange / (theAcftPt->myMission.crMach * theAcftPt->atm.getSpeedOfSoundISA(10000.)); double acMass = theAcftPt->MTOM; - double theLoverD = theAERO.getCruiseLoverD(theAcftPt->myMission.crMach, 10000., 0.0, acMass, "Clean", theAcftPt->atm); - double theDrag = theAERO.getCruiseDrag(theAcftPt->myMission.crMach, 10000., 0.0, acMass, "Clean", theAcftPt->atm); - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, 10000., theAcftPt->myMission.crMach, theAcftPt->atm, 1.0, "MaxCont", - 0., 0., convertUnit(NEWTON, KILO, NEWTON, theDrag)); + double theLoverD = theAERO.getCruiseLoverD(theAcftPt->myMission.crMach, 10000., 0.0, acMass, "clean", theAcftPt->atm); + double theDrag = theAERO.getCruiseDrag(theAcftPt->myMission.crMach, 10000., 0.0, acMass, "clean", theAcftPt->atm); + theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, 10000., theAcftPt->myMission.crMach, theAcftPt->atm, 1.0, + "maximum_continuous", 0., 0., theDrag); double theSFC = theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise) / theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); return this->calcBreguet(theAcftPt->MTOM, Time, theSFC, theLoverD); diff --git a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.h b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.h index 5d28f53783030750ddd1c72b3cedb3b143dbc13c..40cb29e6c1fbfa6a351d0b36c88804178643e94b 100644 --- a/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.h +++ b/performance_assessment/src/taw/defaultMethods/fuelPlanning/low_fidelity/fuelPlanning.h @@ -58,7 +58,7 @@ class fuelPlanning : public ::abstractFuelPlanning { *\param theAircraft Address to the aircraft object *\param rtIO pointer to the runtimeIO object */ - fuelPlanning(aircraft *theAircraft, const performance_assessment_settings *theSettings, const std::shared_ptr<RuntimeIO>& rtIO); + fuelPlanning(std::shared_ptr<aircraft> anAcftPtr, const std::shared_ptr<performance_assessment_settings> aSettingsPt, const std::shared_ptr<RuntimeIO>& rtIO); /**\brief Destructor fuelPlanning * @@ -104,7 +104,7 @@ class fuelPlanning : public ::abstractFuelPlanning { private: const std::shared_ptr<RuntimeIO>& rtIO; std::shared_ptr<aircraft> theAcftPt; /**< Pointer to aircraft object */ - const performance_assessment_settings *theSettingsPt; /**< Pointer to the performance_assessment_settings object */ + const std::shared_ptr<performance_assessment_settings> theSettingsPt; /**< Pointer to the performance_assessment_settings object */ flightSimulator myFlightSim; /**< flightSimulator object */ fuelFromMassFraction myBreguet; /**< fuelFromMassFraction object */ double relConFuel; /**< Relative amount of contingency fuel in reference to the total trip fuel (-) */ diff --git a/performance_assessment/src/taw/defaultMethods/landingPerformance/low_fidelity/landingPerformance.cpp b/performance_assessment/src/taw/defaultMethods/landingPerformance/low_fidelity/landingPerformance.cpp index 454fa757214b92910e3fc31add6f1bebd40e4e5b..51df25aec3d0f435cad17cd372bb2e6f1558a651 100644 --- a/performance_assessment/src/taw/defaultMethods/landingPerformance/low_fidelity/landingPerformance.cpp +++ b/performance_assessment/src/taw/defaultMethods/landingPerformance/low_fidelity/landingPerformance.cpp @@ -37,9 +37,9 @@ void landingPerformance::doLandingPerformance(double theRunwaySlope, double theG brakingFriction = theGroundFrictionBraking; windSpeed = theHeadWind; /* Calculation of landing distance as a function of mass and height */ - for (double elevation = 0.0; elevation <= 12000.; elevation += 2000.) { // calculation for several runway altitudes [ft] + for (double elevation = 0.0; elevation <= convertUnit(FOOT, METER, 12000.); convertUnit(FOOT, METER, elevation += 2000.)) { // calculation for several runway altitudes [ft] myLDNField.push_back(dataElevationLDN()); - myLDNField.back().elevation = convertUnit(FOOT, METER, elevation); + myLDNField.back().elevation = elevation; for (int i = 0; i <= 10; i++) { // calculation for several masses between OME and MLM myLDNField.back().myLDN.push_back(dataLDN()); myLDNField.back().myLDN.back().grossMass = theAcftPt->OME + static_cast<double>(i) / 10.*(theAcftPt->MLM - theAcftPt->OME); @@ -86,10 +86,8 @@ double landingPerformance::calcDeAccelerationGroundRoll(double mass, double alt, double tempThrust(0.0); double tempLift(0.0); double tempDrag(0.0); - tempDrag = theAcftPt->aero.getCLDrag(Mach, alt, theAcftPt->aero.CLgroundRoll, "Landing", theAcftPt->atm); - return 1.0 / mass * (1000.0 * tempThrust - - mass * G_FORCE * (brakingFriction + sin(runwaySlopeAngle)) - - (tempDrag - brakingFriction * tempLift)); + tempDrag = theAcftPt->aero.getCLDrag(Mach, alt, theAcftPt->aero.CLgroundRoll, "landing", theAcftPt->atm); + return 1.0 / mass * (tempThrust - mass * G_FORCE * (brakingFriction + sin(runwaySlopeAngle)) - (tempDrag - brakingFriction * tempLift)); } bool landingPerformance::checkForLDN() { @@ -107,10 +105,10 @@ bool landingPerformance::checkForLDN() { bool landingPerformance::checkForApproachSpeed() { bool Check(false); - if (theAcftPt->vAPPR(theAcftPt->MLM, 0.0) > theAcftPt->myReqs.approachSpeed * 0.51444) { + if (theAcftPt->vAPPR(theAcftPt->MLM, 0.0) > theAcftPt->myReqs.approachSpeed) { myRuntimeInfo->out << "The required approach speed cannot be maintained.!" << endl; - myRuntimeInfo->out << "Req. V_approach: " << theAcftPt->myReqs.approachSpeed << " kts" << endl; - myRuntimeInfo->out << "Calc. V_approach: " << theAcftPt->vAPPR(theAcftPt->MLM, 0.0) / 0.51444 << " kts" << endl; + myRuntimeInfo->out << "Req. V_approach: " << theAcftPt->myReqs.approachSpeed << " m/s" << endl; + myRuntimeInfo->out << "Calc. V_approach: " << theAcftPt->vAPPR(theAcftPt->MLM, 0.0) << " m/s" << endl; Check = false; } else { Check = true; @@ -131,12 +129,12 @@ void landingPerformance::checkForApproachClimb() { double tempMach(tempTAS / theAcftPt->atm.getSpeedOfSound(tempAlt)); double tempROC(0.0); tempROC = theAcftPt->ROC(theAcftPt->MLM, tempAlt, tempMach, 0.0, - "Landing", "TO", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); + "landing", "takeoff", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); if (tempGradientOEI > asin(tempROC / tempTAS)) { tempGradientOEI = 100. * asin(tempROC / tempTAS); } tempROC = theAcftPt->ROC(theAcftPt->MLM, tempAlt, tempMach, 0.0, - "Landing", "TO", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, false, theAcftPt->aero); + "landing", "takeoff", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, false, theAcftPt->aero); if (tempGradientAEO > asin(tempROC / tempTAS)) { tempGradientAEO = 100. * asin(tempROC / tempTAS); } diff --git a/performance_assessment/src/taw/defaultMethods/missionDefinition.cpp b/performance_assessment/src/taw/defaultMethods/missionDefinition.cpp index ce5b6dc485c645024ac4b3ae8563bd79a5110e63..a7e5d35e64a241d433522e32f17a303c88870b36 100644 --- a/performance_assessment/src/taw/defaultMethods/missionDefinition.cpp +++ b/performance_assessment/src/taw/defaultMethods/missionDefinition.cpp @@ -29,7 +29,7 @@ missionDefinition::missionDefinition(const string &fileNameAndDir, double delta_ missionXML(aixml::openDocument(fileNameAndDir)) { myRuntimeInfo->out << "Reading the Mission: " << fileNameAndDir << endl; missionPayload = EndnodeReadOnly<double>("/mission/payload").read(missionXML).value(); - missionPAX = EndnodeReadOnly<double>("mission/number_of_pax").read(missionXML).value(); + missionPAX = EndnodeReadOnly<int>("mission/number_of_pax").read(missionXML).value(); missionCargo = EndnodeReadOnly<double>("/mission/cargo_mass").read(missionXML).value(); missionRange = EndnodeReadOnly<double>("mission/range").read(missionXML).value(); alternateRange = EndnodeReadOnly<double>("mission/alternate_distance").read(missionXML).value(); @@ -65,7 +65,7 @@ void missionDefinition::readSteps(const string& missionPhase, const uint16_t& nu if (missionPhase == "departure") { xmlPath += "departure/departure_step@"; } else if (missionPhase == "cruise") { - xmlPath += "flight/flight_phase@"; + xmlPath += "cruise/cruise_step@"; } else { xmlPath += "approach/approach_step@"; } @@ -85,13 +85,26 @@ void missionDefinition::getMissionSegment(string XML) { Steps.back().derating = EndnodeReadOnly<double>(XML + "/derate").read(missionXML).value(); if (missionXML.find(XML+"/altitude")) { Steps.back().endAltitude = EndnodeReadOnly<double>(XML + "/altitude").read(missionXML).value(); + } else { + Steps.back().endAltitude = NAN; } if (missionXML.find(XML+"/calibrated_airspeed")) { Steps.back().endCAS = EndnodeReadOnly<double>(XML + "/calibrated_airspeed").read(missionXML).value(); + } else { + Steps.back().endCAS = NAN; } /* Off-Takes */ - Steps.back().shaftOffTakes = EndnodeReadOnly<double>(XML + "/shaft_power_takeoff_schedule/background_power_level").read(missionXML).value(); - Steps.back().bleedOffTakes = EndnodeReadOnly<double>(XML + "/bleed_air_takeoff_schedule/background_bleed_level").read(missionXML).value(); + if (missionXML.find(XML+"/shaft_power_takeoff_schedule/background_power_level")) { + Steps.back().shaftOffTakes = EndnodeReadOnly<double>(XML + "/shaft_power_takeoff_schedule/background_power_level").read(missionXML).value(); + } else { + Steps.back().shaftOffTakes = 0; + } + + if (missionXML.find(XML+"/bleed_air_takeoff_schedule/background_bleed_level")) { + Steps.back().bleedOffTakes = EndnodeReadOnly<double>(XML + "/bleed_air_takeoff_schedule/background_bleed_level").read(missionXML).value(); + } else { + Steps.back().bleedOffTakes = 0; + } /* Mission phase dependent parameters */ if (Steps.back().missionPhase == "departure") { @@ -105,7 +118,7 @@ void missionDefinition::getMissionSegment(string XML) { if (Steps.back().modeStep == "takeoff") { Steps.back().endAltitude = 0.0; Steps.back().endFL = 0.0; - Steps.back().endCAS = 160.0; + Steps.back().endCAS = 82.3; // =160.0 kts; // TODO(hansmann): Mildly illegal to assume 160 flat? } else if (Steps.back().modeStep == "climb") { if (Steps.back().endAltitude <= 0.0) { myRuntimeInfo->err << "flight phase: " << Steps.back().missionPhase << " | Step: " << Steps.back().modeStep << endl; @@ -127,14 +140,19 @@ void missionDefinition::getMissionSegment(string XML) { exit(1); } Steps.back().endFL = Steps.back().endAltitude / 100; - Steps.back().endTAS = convertUnit(METERPERSECOND, KNOTS, convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, - convertUnit(KNOTS, METERPERSECOND, Steps.back().endCAS))); - Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, convertUnit(KNOTS, METERPERSECOND, Steps.back().endTAS)); + Steps.back().endTAS = convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endCAS); + Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, Steps.back().endAltitude, myISA, Steps.back().endTAS); Steps.back().relSegmentLength = 0.0; } else if (Steps.back().missionPhase == "cruise") { - Steps.back().endMach = missionXML.at(XML + "/endMach"); - Steps.back().endFL = missionXML.at(XML + "/endFL"); - Steps.back().relSegmentLength = missionXML.at(XML + "/relSegmentLength"); + if (missionXML.find(XML+"/mach_number")) { + Steps.back().endMach = EndnodeReadOnly<double>(XML + "/mach_number").read(missionXML).value(); + } + if (missionXML.find(XML+"/altitude")) { + Steps.back().endFL = EndnodeReadOnly<double>(XML+"/altitude").read(missionXML).value() / 100; + } + if (missionXML.find(XML+"/relative_segment_length")) { + Steps.back().relSegmentLength = EndnodeReadOnly<double>(XML + "/relative_segment_length").read(missionXML).value(); + } /* Filling the unoccupied entries depending on the step */ if (Steps.back().modeStep == "change_speed_to_CAS") { if (Steps.back().endCAS <= 0.0) { @@ -144,10 +162,8 @@ void missionDefinition::getMissionSegment(string XML) { } Steps.back().endAltitude = Steps.at(Steps.size() - 2).endAltitude; Steps.back().endFL = Steps.back().endAltitude / 100; - Steps.back().endTAS = convertUnit(METERPERSECOND, KNOTS, convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, - convertUnit(KNOTS, METERPERSECOND, Steps.back().endCAS))); - Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, - convertUnit(KNOTS, METERPERSECOND, Steps.back().endTAS)); + Steps.back().endTAS = convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endCAS); + Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, Steps.back().endAltitude, myISA, Steps.back().endTAS); } else if (Steps.back().modeStep == "climb_to_cruise") { if (Steps.back().endFL <= 0.0) { myRuntimeInfo->err << "flight phase: " << Steps.back().missionPhase << " | Step: " << Steps.back().modeStep << endl; @@ -160,10 +176,8 @@ void missionDefinition::getMissionSegment(string XML) { exit(1); } Steps.back().endAltitude = 100 * Steps.back().endFL; - Steps.back().endTAS = convertUnit(METERPERSECOND, KNOTS, - convertUnit(MACH, TRUEAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, Steps.back().endMach)); - Steps.back().endCAS = convertUnit(METERPERSECOND, KNOTS, - convertUnit(MACH, CALIBRATEDAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, Steps.back().endMach)); + Steps.back().endTAS = convertUnit(MACH, TRUEAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endMach); + Steps.back().endCAS = convertUnit(MACH, CALIBRATEDAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endMach); cruiseAlt.push_back(Steps.back().endAltitude); //Steps.back().endROC = missionXML.at(XML + "/ROC"); } else if (Steps.back().modeStep == "change_speed_to_Mach") { @@ -174,10 +188,8 @@ void missionDefinition::getMissionSegment(string XML) { } Steps.back().endAltitude = Steps.at(Steps.size() - 2).endAltitude; Steps.back().endFL = Steps.at(Steps.size() - 2).endFL; - Steps.back().endTAS = convertUnit(METERPERSECOND, KNOTS, - convertUnit(MACH, TRUEAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, Steps.back().endMach)); - Steps.back().endCAS = convertUnit(METERPERSECOND, KNOTS, - convertUnit(MACH, CALIBRATEDAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, Steps.back().endMach)); + Steps.back().endTAS = convertUnit(MACH, TRUEAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endMach); + Steps.back().endCAS = convertUnit(MACH, CALIBRATEDAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endMach); } else if (Steps.back().modeStep == "cruise") { Steps.back().endAltitude = Steps.at(Steps.size() - 2).endAltitude; Steps.back().endFL = Steps.at(Steps.size() - 2).endFL; @@ -219,10 +231,8 @@ void missionDefinition::getMissionSegment(string XML) { exit(1); } Steps.back().endFL = Steps.back().endAltitude / 100; - Steps.back().endTAS = convertUnit(METERPERSECOND, KNOTS, convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, - convertUnit(KNOTS, METERPERSECOND, Steps.back().endCAS))); - Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, - convertUnit(KNOTS, METERPERSECOND, Steps.back().endTAS)); + Steps.back().endTAS = convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endCAS); + Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, Steps.back().endAltitude, myISA, Steps.back().endTAS); } else { myRuntimeInfo->err << "flight phase: " << Steps.back().missionPhase << " | Step: " << Steps.back().modeStep << endl; myRuntimeInfo->err << "Step in this flight phase is unknown! Abort!" << endl; @@ -255,9 +265,8 @@ void missionDefinition::getMissionSegment(string XML) { exit(1); } Steps.back().endFL = Steps.back().endAltitude / 100; - Steps.back().endTAS = convertUnit(METERPERSECOND, KNOTS, convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, - convertUnit(KNOTS, METERPERSECOND, Steps.back().endCAS))); - Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, convertUnit(FOOT, METER, Steps.back().endAltitude), myISA, convertUnit(KNOTS, METERPERSECOND, Steps.back().endTAS)); + Steps.back().endTAS = convertUnit(CALIBRATEDAIRSPEED, TRUEAIRSPEED, Steps.back().endAltitude, myISA, Steps.back().endCAS); + Steps.back().endMach = convertUnit(TRUEAIRSPEED, MACH, Steps.back().endAltitude, myISA, Steps.back().endTAS); Steps.back().relSegmentLength = 0.0; } else { myRuntimeInfo->err << "The mission segment cannot be determined!" << endl; @@ -269,7 +278,7 @@ void missionDefinition::getMissionSegment(string XML) { void missionDefinition::getMissionPoint() { if (Steps.size() == 1) { Steps.back().Point.Altitude = Steps.back().endAltitude; - Steps.back().Point.Temperature = myISA.getTemperature(convertUnit(FOOT, METER, Steps.back().Point.Altitude)); + Steps.back().Point.Temperature = myISA.getTemperature(Steps.back().Point.Altitude); Steps.back().Point.CAS = Steps.back().endCAS; Steps.back().Point.TAS = Steps.back().endTAS; Steps.back().Point.Mach = Steps.back().endMach; @@ -278,7 +287,7 @@ void missionDefinition::getMissionPoint() { } else { Steps.back().Point.Altitude = Steps.at(Steps.size() - 2).endAltitude + 0.5 * (Steps.back().endAltitude - Steps.at(Steps.size() - 2).endAltitude); - Steps.back().Point.Temperature = myISA.getTemperature(convertUnit(FOOT, METER, Steps.back().Point.Altitude)); + Steps.back().Point.Temperature = myISA.getTemperature(Steps.back().Point.Altitude); Steps.back().Point.CAS = Steps.at(Steps.size() - 2).endCAS + 0.5 * (Steps.back().endCAS - Steps.at(Steps.size() - 2).endCAS); Steps.back().Point.TAS = Steps.at(Steps.size() - 2).endTAS @@ -291,9 +300,8 @@ void missionDefinition::getMissionPoint() { + 0.5 * (Steps.back().bleedOffTakes - Steps.at(Steps.size() - 2).bleedOffTakes); } Steps.back().Point.ROC = Steps.back().endROC; - Steps.back().Point.density = myISA.getDensity(convertUnit(FOOT, METER, Steps.back().Point.Altitude)); - Steps.back().Point.dynamicPressure = 0.5 * myISA.getDensity(convertUnit(FOOT, METER, Steps.back().Point.Altitude)) * - pow(convertUnit(KNOTS, METERPERSECOND, Steps.back().Point.TAS), 2.); + Steps.back().Point.density = myISA.getDensity(Steps.back().Point.Altitude); + Steps.back().Point.dynamicPressure = 0.5 * myISA.getDensity(Steps.back().Point.Altitude) * pow(Steps.back().Point.TAS, 2.); if (Steps.back().modeStep == "takeoff") { Steps.back().Point.simplifiedMODE = "takeoff"; } else if (Steps.back().modeStep == "climb") { diff --git a/performance_assessment/src/taw/defaultMethods/missionDefinition.h b/performance_assessment/src/taw/defaultMethods/missionDefinition.h index 2d625297818215a2cfa6eb4dd41a872890a0ce92..8ca62a09d56ef6c01fb12694514848d4f096264f 100644 --- a/performance_assessment/src/taw/defaultMethods/missionDefinition.h +++ b/performance_assessment/src/taw/defaultMethods/missionDefinition.h @@ -43,21 +43,21 @@ class missionDefinition { string missionPhase; /**< name of the mission phase */ double missionPayload; /**< Payload during the mission (kg) */ - double missionPAX; /**< Number of passengers during the mission (kg) */ + double missionPAX; /**< Number of passengers during the mission (-) */ double missionCargo; /**< Cargo mass during the mission (kg) */ - double missionRange; /**< Range of the mission (km) */ + double missionRange; /**< Range of the mission (m) */ double alternateRange; /**< Distance to the alternate airport (km) */ double deltaISA; /**< Temperature delta to the ISA-Conditions (K) */ - double taxiTimeOrigin; /**< Time for taxiing at the origin (min) */ - double taxiTimeDestination; /**< Time for taxiing at the destination (min) */ + double taxiTimeOrigin; /**< Time for taxiing at the origin (s) */ + double taxiTimeDestination; /**< Time for taxiing at the destination (s) */ double crMach; /**< Desired cruise speed for the calculation of the fuel amount */ double bleedOffTO; /**< Bleed air off take at take-off (kg/s) */ - double shaftOffTO; /**< Shaft power off take at take-off (kW) */ + double shaftOffTO; /**< Shaft power off take at take-off (W) */ double bleedOffCr; /**< Bleed air off take at cruise(kg/s) */ - double shaftOffCr; /**< Shaft power off take at cruise (kW) */ + double shaftOffCr; /**< Shaft power off take at cruise (W) */ uint16_t numberDepartureSteps; /**< Number of steps during depature in the mission.xml (-) */ uint16_t numberCruiseSteps; /**< Number of steps during cruise in the mission.xml (-) */ @@ -70,17 +70,17 @@ class missionDefinition { public: string simplifiedMODE; /**< Mission phase (TakeOff, Climb, Accelerate, Cruise, Descend, Landing) */ - double Altitude; /**< Aircraft altitude (ft) */ + double Altitude; /**< Aircraft altitude (m) */ double Temperature; /**< Air temperature (K) */ - double CAS; /**< Calibrated air speed (kts) */ - double TAS; /**< True air speed (kts) */ + double CAS; /**< Calibrated air speed (m/s) */ + double TAS; /**< True air speed (m/s) */ double Mach; /**< Mach number (-) */ double density; /**< Air density (kg / pow(m,3)) */ double dynamicPressure; /**< Dynamic pressure (kg/m*pow(s,2))*/ - double ROC; /**< Rate of climb (ft / min)*/ + double ROC; /**< Rate of climb (m/s)*/ - double shaftOffTakes; /**< Shaft off take (kW)*/ + double shaftOffTakes; /**< Shaft off take (W)*/ double bleedOffTakes; /**< Bleed air off take (kg/s) */ averageMissionPoint() { diff --git a/performance_assessment/src/taw/defaultMethods/optimizeMissionProfile/low_fidelity/optimizeMissionProfile.cpp b/performance_assessment/src/taw/defaultMethods/optimizeMissionProfile/low_fidelity/optimizeMissionProfile.cpp index bb3f81767fb10635bb7bd1fbb88420a0dbd5a5bb..afa52d74db6920cd8374b9041c2a71ce2b4b1c1a 100644 --- a/performance_assessment/src/taw/defaultMethods/optimizeMissionProfile/low_fidelity/optimizeMissionProfile.cpp +++ b/performance_assessment/src/taw/defaultMethods/optimizeMissionProfile/low_fidelity/optimizeMissionProfile.cpp @@ -30,12 +30,12 @@ optimizeMissionProfile::~optimizeMissionProfile() { } void low::optimizeMissionProfile::doOptimizeMission(std::shared_ptr<abstractFuelPlanning>& myFuelPlanning, const std::shared_ptr<RuntimeIO>& rtIO, bool sizingForMTOM) { - double maxAltitudeForRange = 0.5 * (theAcftPt->designRange - 150.) * 1000. * tan(2.5 * 3.14159 / 180.) / 0.3048 / 100.; + double maxAltitudeForRange = 0.5 * (theAcftPt->designRange - 150.) * 1000. * tan(convertUnit(DEGREE, RADIAN, 2.5)) / 0.3048 / 100.; if (theAcftPt->hMaxOperating / 100. < maxAltitudeForRange) { maxAltitudeForRange = theAcftPt->hMaxOperating / 100.; } for (unsigned int i(0); i <= theAcftPt->myMission.Steps.size() - 1; i++) { - if (theAcftPt->myMission.Steps.at(i).modeStep == "Cruise") { + if (theAcftPt->myMission.Steps.at(i).modeStep == "cruise") { cruiseSteps.push_back(theCruiseSteps()); cruiseSteps.back().ID = i + 1; cruiseSteps.back().oldFL = theAcftPt->myMission.Steps.at(i).endFL; @@ -69,13 +69,13 @@ double optimizeMissionProfile::getNewFlightLevel(double theLift, double theMach) double targetFL(theAcftPt->hInitialCruise / 100.); double SAR = 0.; for (double i = theAcftPt->hInitialCruise; i <= theAcftPt->hMaxOperating; i = i + deltaStep) { - double theDrag = theAcftPt->aero.getCruiseDrag(theMach, i * 0.3048, 0., theLift / G_FORCE, "Clean", theAcftPt->atm); - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, i * 0.3048, theMach, theAcftPt->atm, 1., "MaxCont", - theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, theDrag / 1000.); - if (theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) < 0.99999 * theDrag / 1000.) { + double theDrag = theAcftPt->aero.getCruiseDrag(theMach, i * 0.3048, 0., theLift / G_FORCE, "clean", theAcftPt->atm); + theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, i * 0.3048, theMach, theAcftPt->atm, 1., "maximum_continuous", + theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, theDrag); + if (theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise) < 0.99999 * theDrag) { break; } - double tempROC = theAcftPt->ROC(theLift / G_FORCE, i * 0.3048, theMach, 1.0, "Clean", "MaxCont", + double tempROC = theAcftPt->ROC(theLift / G_FORCE, i * 0.3048, theMach, 1.0, "clean", "maximum_continuous", theAcftPt->myMission.bleedOffCr, theAcftPt->myMission.shaftOffCr, false, theAcftPt->aero) * (60. / 0.3048); if (tempROC < 300.) { diff --git a/performance_assessment/src/taw/defaultMethods/payloadRange/low_fidelity/payloadRange.cpp b/performance_assessment/src/taw/defaultMethods/payloadRange/low_fidelity/payloadRange.cpp index 487d201be532bf383f49061d4aea52167c2b7d73..ec0decdaab124b24a3258aa985471292b7acb036 100644 --- a/performance_assessment/src/taw/defaultMethods/payloadRange/low_fidelity/payloadRange.cpp +++ b/performance_assessment/src/taw/defaultMethods/payloadRange/low_fidelity/payloadRange.cpp @@ -46,11 +46,11 @@ void payloadRange::calcPayloadRange() { // myRuntimeInfo->out << "cruiseHeigth " << cruiseHeight << endl; // TODO(franz#1#): statt MTOM, MTOM reduziert um Massfractions Start, Climb // TODO(franz#1#): ggf. statt LoverD und SFC ausrechnen aus Aircraft XML holen und dann Drag ausrechnen - double theLoverD = theAcftPt->aero.getCruiseLoverD(theAcftPt->myMission.crMach, convertUnit(FOOT, METER, theAcftPt->hInitialCruise), 0.0, theAcftPt->MTOM, "Clean", + double theLoverD = theAcftPt->aero.getCruiseLoverD(theAcftPt->myMission.crMach, convertUnit(FOOT, METER, theAcftPt->hInitialCruise), 0.0, theAcftPt->MTOM, "clean", theAcftPt->atm); - double theDrag = theAcftPt->aero.getCruiseDrag(theAcftPt->myMission.crMach, convertUnit(FOOT, METER, theAcftPt->hInitialCruise), 0.0, theAcftPt->MTOM, "Clean", theAcftPt->atm); - theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, convertUnit(FOOT, METER, theAcftPt->hInitialCruise), theAcftPt->myMission.crMach, theAcftPt->atm, 1.0, "MaxCont", 0., 0., - theDrag / 1000.); + double theDrag = theAcftPt->aero.getCruiseDrag(theAcftPt->myMission.crMach, convertUnit(FOOT, METER, theAcftPt->hInitialCruise), 0.0, theAcftPt->MTOM, "clean", theAcftPt->atm); + theAcftPt->myEngines.calculate_N1_with_thrustlimit(theAcftPt->myEnergyProviders.energyCarrierID_cruise, theAcftPt->hInitialCruise, theAcftPt->myMission.crMach, theAcftPt->atm, 1.0, "maximum_continuous", 0., 0., + theDrag); double theSFC = theAcftPt->myEngines.get_aircraft_fuelflow(theAcftPt->myEnergyProviders.energyCarrierID_cruise) / theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_cruise); breguetFactor = (theAcftPt->myMission.crMach * theAcftPt->atm.getSpeedOfSound(cruiseHeight) * theLoverD) / (G_FORCE * theSFC); /* Determination of the 0.point */ diff --git a/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.cpp b/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.cpp index 8dca4f5d816fe662d570e235c576364ab3ec6be1..55ef4b7e637f3306bcc3bf5b8edd294bf992d537 100644 --- a/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.cpp +++ b/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.cpp @@ -25,46 +25,31 @@ performance_assessment_factory::performance_assessment_factory(const std::shared rtIO(rtIOin), mySettings(rtIOin), mySettingsPt(std::make_shared<performance_assessment_settings>(mySettings)), - myAcft(rtIO, mySettings), - myAcftPt(std::make_shared<aircraft>(myAcft)), - missionXML(aixml::openDocument(static_cast<std::string>(rtIO->acxml.at( - "/aircraft_exchange_file/requirements_and_specifications/mission_files/study_mission_file/value")))) { + myAcft(rtIO, mySettingsPt), + myAcftPt(std::make_shared<aircraft>(myAcft)) + // missionXML(aixml::openDocument(static_cast<std::string>(rtIO->acxml.at( + // "/aircraft_exchange_file/requirements_and_specifications/mission_files/study_mission_file/value")))) + { } void performance_assessment_factory::initialize() { /* Get desired fidelity level of methods*/ - throwError<std::string>(__FILE__, __func__, __LINE__, "Module is not finished yet."); - fidelityLevelFuelPlanning = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/PayloadRangeDiagram/fidelityLevel")); // PFADE ÜBERPRÜFEN - fidelityLevelOptimizeMission = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/PayloadRangeDiagram/fidelityLevel")); - fidelityLevelPayloadRangeDiagram = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/PayloadRangeDiagram/fidelityLevel")); - fidelityLevelEnginePerformance = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/EnginePerformance/fidelityLevel")); - fidelityLevelFlightEnvelopePerformance = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/FlightEnvelopePerformance/fidelityLevel")); - fidelityLevelClimbPerformance = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/ClimbPerformance/fidelityLevel")); - fidelityLevelTakeOffPerformance = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/TOPerformance/fidelityLevel")); - fidelityLevelLandingPerformance = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/LandingPerformance/fidelityLevel")); - fidelityLevelVnDiagram = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/VnDiagram/fidelityLevel")); - fidelityLevelSARPerformance = static_cast<std::string>(rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/SARPerformance/fidelityLevel")); - /* Other settings*/ - // doFuelPlanning = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/Modes/FuelPlanning"); - // doOptimizeMission = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/Mission/optimizeMissionProfile"); - // doPayloadRange = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/PayloadRangeDiagram"); - // doEnginePerformance = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/EnginePerformance"); - // doFlightEnvelopePerformance = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/FlightEnvelopePerformance"); - // overwriteInitialValues = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/FlightEnvelopePerformance").getIntAttrib("OverwriteInitialValues"); - // doClimbPerformance = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/ClimbPerformance"); - // doTOPerformance = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/TOPerformance"); - // if (doTOPerformance) { - // doBLFLPerformance = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/TOPerformance").getBoolAttrib("CalculateBLFLPerformance"); - // } else { - // doBLFLPerformance = false; - // } - // doLandingPerformance = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/LandingPerformance"); - // doVnDiagram = rtIO->moduleConfig.at("/ConfigFile/ProgramSettings/PerformanceChecks/VnDiagram"); - - // doFuelPlanning = mySettingsPt->mySwitches.doFuelPlanning; - - - + fidelityLevelFuelPlanning = static_cast<std::string>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/fuel_planning/fidelity_level")); + fidelityLevelOptimizeMission = static_cast<std::string>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/mission/fidelity_level")); + fidelityLevelPayloadRangeDiagram = static_cast<std::string>(rtIO->moduleConfig + .at("/module_configuration_file/program_settings/performance_checks/payload_range_diagram/fidelity_level")); + fidelityLevelEnginePerformance = static_cast<std::string>(rtIO->moduleConfig + .at("/module_configuration_file/program_settings/performance_checks/engine_performance/fidelity_level")); + fidelityLevelFlightEnvelopePerformance = static_cast<std::string>(rtIO->moduleConfig + .at("/module_configuration_file/program_settings/performance_checks/flight_envelope_performance/fidelity_level")); + fidelityLevelClimbPerformance = static_cast<std::string>(rtIO->moduleConfig + .at("/module_configuration_file/program_settings/performance_checks/climb_performance/fidelity_level")); + fidelityLevelTakeOffPerformance = static_cast<std::string>(rtIO->moduleConfig + .at("/module_configuration_file/program_settings/performance_checks/takeoff_performance/fidelity_level")); + fidelityLevelLandingPerformance = static_cast<std::string>(rtIO->moduleConfig + .at("/module_configuration_file/program_settings/performance_checks/landing_performance/fidelity_level")); + fidelityLevelVnDiagram = static_cast<std::string>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/vn_diagram/fidelity_level")); + fidelityLevelSARPerformance = static_cast<std::string>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/sar_performance/fidelity_level")); /* Initialization of performance_assessment objects */ /* Fuel Planning */ @@ -72,14 +57,13 @@ void performance_assessment_factory::initialize() { // Custom implementation here, e.g.: // abstractFuelPlanningPt = std::make_shared<high::fuelPlanning>(someArgs); // Create Object and puts it in interface class pointer } else if (fidelityLevelFuelPlanning == "low") { // low fidelity fuelPlanning - abstractFuelPlanningPt = std::make_shared<low::fuelPlanning>(&myAcft, &mySettings, rtIO); // Create Object and puts it in interface class pointer - abstractFuelPlanningPt->setFactory(shared_from_this()); // Enables Factory-Products to access the factory to check what fidelity levels other products are - // TODO(Hansmann): Currently unused + abstractFuelPlanningPt = std::make_shared<low::fuelPlanning>(myAcftPt, mySettingsPt, rtIO); // Create Object and puts it in interface class pointer + // abstractFuelPlanningPt->setFactory(shared_from_this()); // Enables Factory-Products to access the factory to check what fidelity levels other products are } else { - myRuntimeInfo->warn << "Unavailable fidelity level for FuelPlanning selected! Exiting"<< std::endl; + myRuntimeInfo->warn << "Unavailable fidelity level for 'FuelPlanning' selected! Exiting"<< std::endl; exit(1); } - /* MissionOptimization */ + /* Mission Optimization */ if (fidelityLevelOptimizeMission == "high") { // high fidelity optimizeMission // ... } else if (fidelityLevelFuelPlanning == "low") { // low fidelity optimizeMission @@ -137,7 +121,7 @@ void performance_assessment_factory::initialize() { if (fidelityLevelLandingPerformance == "high") { // ... } else if (fidelityLevelLandingPerformance == "low") { - theLandingPerformance = std::make_shared<low::landingPerformance>(myAcftPt); + abstractLandingPerformancePt = std::make_shared<low::landingPerformance>(myAcftPt); } else { myRuntimeInfo->warn << "Unavailable fidelity level for 'landingPerformance' selected! Exiting"<< std::endl; exit(1); @@ -146,7 +130,7 @@ void performance_assessment_factory::initialize() { if (fidelityLevelVnDiagram == "high") { // ... } else if (fidelityLevelVnDiagram == "low") { - theVnDiagram = std::make_shared<low::VnDiagram>(myAcftPt, mySettingsPt); + abstractVnDiagramPt = std::make_shared<low::VnDiagram>(myAcftPt, mySettingsPt); } else { myRuntimeInfo->warn << "Unavailable fidelity level for 'VnDiagram' selected! Exiting"<< std::endl; exit(1); @@ -158,7 +142,7 @@ void performance_assessment_factory::run() { if (mySettingsPt->mySwitches.doFuelPlanning == true) { myRuntimeInfo->out << " -> Fuel Planning" << std::endl; try { - theFuelPlanning->doFuelPlanning(); + abstractFuelPlanningPt->doFuelPlanning(); } catch (const int& errorCode) { throwError(__FILE__, __func__, __LINE__, "Error in fuel planning. Possibly thrust rating of engine could not be set correctly. See logLevel=2 (Info) for more details."); @@ -167,7 +151,7 @@ if (mySettingsPt->mySwitches.doFuelPlanning == true) { /* Optimize Mission */ if (mySettingsPt->optimizeMission == true) { try { - theOptimizeMission->doOptimizeMission(theFuelPlanning, rtIO, mySettingsPt->designForMTOM); + abstractOptimizeMissionProfilePt->doOptimizeMission(abstractFuelPlanningPt, rtIO, mySettingsPt->designForMTOM); // theOptimizeMission->doOptimizeMission(&theFuelPlanning, rtIO, mySettingsPt->designForMTOM); } catch (const int& errorCode) { throwError(__FILE__, __func__, __LINE__, @@ -177,16 +161,20 @@ if (mySettingsPt->optimizeMission == true) { /* PayloadRange */ if (mySettingsPt->mySwitches.doPayloadRange == true) { + if (mySettingsPt->mySwitches.doFuelPlanning == false) { + throwError(__FILE__, __func__, __LINE__, + "Error in payload range diagram calculation: Fuel planning needed for payload range calculation. Please turn on fuel planning."); + } if (!mySettingsPt->designForMTOM && mySettingsPt->useStudyMissionForAnalysis) { myRuntimeInfo->out << "Attention: Payload range diagram incorrect when MTOM Design off or StudyMission is used!" << std::endl; - theFuelPlanning->doPayloadRangeOLD(); + abstractFuelPlanningPt->doPayloadRangeOLD(); } else { myRuntimeInfo->out << " ... Payload Range using OLD method" << std::endl; - theFuelPlanning->doPayloadRangeOLD(); - theFuelPlanning->doFuelPayloadRangeOLD(); + abstractFuelPlanningPt->doPayloadRangeOLD(); + abstractFuelPlanningPt->doFuelPayloadRangeOLD(); } } else { - theFuelPlanning->payloadRangeFromAcftXML(); + abstractFuelPlanningPt->payloadRangeFromAcftXML(); } if (mySettingsPt->mySwitches.doPayloadRange == true && mySettingsPt->mySwitches.doFuelPlanning == false) { myRuntimeInfo->out << " ... Payload Range" << std::endl; @@ -237,14 +225,14 @@ if (mySettingsPt->mySwitches.doTOPerformance == true) { /* Landing Performance */ if (mySettingsPt->mySwitches.doLandingPerformance == true) { myRuntimeInfo->out << " -> Landing Performance" << std::endl; - theLandingPerformance->doLandingPerformance(mySettingsPt->myField.runwaySlope, + abstractLandingPerformancePt->doLandingPerformance(mySettingsPt->myField.runwaySlope, myAcftPt->brakingCoefficient, mySettingsPt->myField.headWind); } /* Vn-Diagram */ if (mySettingsPt->mySwitches.doVnDiagram == true) { myRuntimeInfo->out << " -> V-n Diagram" << std::endl; - theVnDiagram->doVnDiagram(); + abstractVnDiagramPt->doVnDiagram(); } } // end of run() @@ -253,10 +241,22 @@ void performance_assessment_factory::update() { } void performance_assessment_factory::report() { - performance_assessment_output theOutput(shared_from_this(), shared_from_this()->myAcftPt); + performance_assessment_output theOutput( + abstractFuelPlanningPt, + abstractOptimizeMissionProfilePt, + abstractPayloadRangePt, + abstractEnginePerformancePt, + abstractCeilingPerformancePt, + abstractFlightEnvelopesPt, + abstractSARPerformancePt, + abstractTakeOffPerformancePt, + abstractLandingPerformancePt, + abstractVnDiagramPt, + myAcftPt); theOutput.generateHtmlBody(); theOutput.writeXmlOutput(); + theOutput.generatePlotData(); // (...) } diff --git a/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.h b/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.h index 17293545bb7c4dcac5aeffb131a4607ff733982d..9bfdee03e737f65cbd633ede9231e04c7e139c0c 100644 --- a/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.h +++ b/performance_assessment/src/taw/defaultMethods/performance_assessment_factory.h @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with UNICADO. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef performance_assessment_SRC_TAW_DEFAULTMETHODS_performance_assessmentFactory_H_ -#define performance_assessment_SRC_TAW_DEFUALTMETHODS_performance_assessmentFactory_H_ +#ifndef PERFORMANCE_ASSESSMENT_SRC_TAW_DEFAULTMETHODS_PERFORMANCE_ASSESSMENT_Factory_H_ +#define PERFORMANCE_ASSESSMENT_SRC_TAW_DEFAULTMETHODS_PERFORMANCE_ASSESSMENT_Factory_H_ #include <moduleBasics/module.h> #include <moduleBasics/strategySelector.h> @@ -25,12 +25,12 @@ #include <functional> #include <map> #include <memory> +#include <utility> #include <string> #include "performance_assessment_settings.h" #include "../defaultMethods/aircraft.h" - /* Include custom implementation header files here */ // ... @@ -41,7 +41,7 @@ #include "enginePerformance/low_fidelity/enginePerformance.h" #include "SARPerformance/low_fidelity/SARPerformance.h" #include "ceilingPerformance/low_fidelity/ceilingPerformance.h" -#include "takeOffPerformance/low_fidelity/takeOffperformance.h" +#include "takeOffPerformance/low_fidelity/takeOffPerformance.h" #include "landingPerformance/low_fidelity/landingPerformance.h" #include "VnDiagram/low_fidelity/VnDiagram.h" @@ -53,7 +53,7 @@ #include "enginePerformance/abstractEnginePerformance.h" #include "SARPerformance/abstractSARPerformance.h" #include "flightEnvelopes/abstractFlightEnvelopes.h" -#include "takeOffperformance/abstractTakeOffPerformance.h" +#include "takeOffPerformance/abstractTakeOffPerformance.h" #include "landingPerformance/abstractLandingPerformance.h" #include "VnDiagram/abstractVnDiagram.h" @@ -77,20 +77,17 @@ class performance_assessment_factory : public Strategy, std::enable_shared_from_ std::shared_ptr<performance_assessment_settings> mySettingsPt; aircraft myAcft; std::shared_ptr<aircraft> myAcftPt; - node& missionXML; - std::shared_ptr<abstractFuelPlanning> abstractFuelPlanningPt; - std::shared_ptr<abstractFuelPlanning> theFuelPlanning; /**< fuelPlanning object */ - std::shared_ptr<abstractOptimizeMissionProfile> abstractOptimizeMissionProfilePt; - std::shared_ptr<abstractOptimizeMissionProfile> theOptimizeMission; /**< optimizeMissionProfile object */ + std::shared_ptr<abstractFuelPlanning> abstractFuelPlanningPt; /**< fuelPlanning object */ + std::shared_ptr<abstractOptimizeMissionProfile> abstractOptimizeMissionProfilePt; /**< optimizeMissionProfile object */ std::shared_ptr<abstractPayloadRange> abstractPayloadRangePt; /**< payloadRange object */ std::shared_ptr<abstractEnginePerformance> abstractEnginePerformancePt; /**< enginePerformance object */ std::shared_ptr<abstractCeilingPerformance> abstractCeilingPerformancePt; /**< ceilingPerformance object*/ std::shared_ptr<abstractFlightEnvelopes> abstractFlightEnvelopesPt; /**< flightEnvelopes object */ std::shared_ptr<abstractSARPerformance> abstractSARPerformancePt; /**< SARPerformance object */ std::shared_ptr<abstractTakeOffPerformance> abstractTakeOffPerformancePt; /**< takeOffPerformance object */ - std::shared_ptr<abstractLandingPerformance> theLandingPerformance; /**< landingPerformance object */ - std::shared_ptr<abstractVnDiagram> theVnDiagram; /**< VnDiagram object */ + std::shared_ptr<abstractLandingPerformance> abstractLandingPerformancePt; /**< landingPerformance object */ + std::shared_ptr<abstractVnDiagram> abstractVnDiagramPt; /**< VnDiagram object */ std::string fidelityLevelFuelPlanning; std::string fidelityLevelOptimizeMission; @@ -106,4 +103,5 @@ class performance_assessment_factory : public Strategy, std::enable_shared_from_ }; } // namespace taw -#endif // CALCULATEPERFORMANCE_SRC_TAW_DEFUALTMETHODS_LOW_FIDELITY_performance_assessment_Factory_H_ + +#endif // PERFORMANCE_ASSESSMENT_SRC_TAW_DEFAULTMETHODS_PERFORMANCE_ASSESSMENT_FACTORY_H_ diff --git a/performance_assessment/src/taw/defaultMethods/performance_assessment_output.cpp b/performance_assessment/src/taw/defaultMethods/performance_assessment_output.cpp index 76a1079294c6bf5d355681cf0bede86d688838f0..494d5178305f824954ddb8b4ac9bef181ef98a35 100644 --- a/performance_assessment/src/taw/defaultMethods/performance_assessment_output.cpp +++ b/performance_assessment/src/taw/defaultMethods/performance_assessment_output.cpp @@ -16,21 +16,40 @@ */ #include "performance_assessment_factory.h" - #include "performance_assessment_output.h" - - -performance_assessment_output::performance_assessment_output(std::shared_ptr<taw::performance_assessment_factory> aFactoryPt, std::shared_ptr<aircraft> anAcftPt) +performance_assessment_output::performance_assessment_output( + std::shared_ptr<abstractFuelPlanning> abstractFuelPlanningPt, + std::shared_ptr<abstractOptimizeMissionProfile> abstractOptimizeMissionProfilePt, + std::shared_ptr<abstractPayloadRange> abstractPayloadRangePt, + std::shared_ptr<abstractEnginePerformance> abstractEnginePerformancePt, + std::shared_ptr<abstractCeilingPerformance> abstractCeilingPerformancePt, + std::shared_ptr<abstractFlightEnvelopes> abstractFlightEnvelopesPt, + std::shared_ptr<abstractSARPerformance> abstractSARPerformancePt, + std::shared_ptr<abstractTakeOffPerformance> abstractTakeOffPerformancePt, + std::shared_ptr<abstractLandingPerformance> abstractLandingPerformancePt, + std::shared_ptr<abstractVnDiagram> abstractVnDiagramPt, + const std::shared_ptr<aircraft> anAcftPt) : - theFactoryPt(aFactoryPt), myAcftPt(anAcftPt), - theReport(aFactoryPt->rtIO) { + mySettingsPt(myAcftPt->mySettingsPt), + rtIO(myAcftPt->rtIO), + abstractFuelPlanningPt(abstractFuelPlanningPt), + abstractOptimizeMissionProfilePt(abstractOptimizeMissionProfilePt), + abstractPayloadRangePt(abstractPayloadRangePt), + abstractEnginePerformancePt(abstractEnginePerformancePt), + abstractCeilingPerformancePt(abstractCeilingPerformancePt), + abstractFlightEnvelopesPt(abstractFlightEnvelopesPt), + abstractSARPerformancePt(abstractSARPerformancePt), + abstractTakeOffPerformancePt(abstractTakeOffPerformancePt), + abstractLandingPerformancePt(abstractLandingPerformancePt), + abstractVnDiagramPt(abstractVnDiagramPt), + theReport(myAcftPt->rtIO) { // ctor - if (theFactoryPt->mySettings.mySwitches.doFuelPlanning && theFactoryPt->mySettings.useStudyMissionForAnalysis) { - theProgramName = theFactoryPt->rtIO->programname + "_study"; + if (mySettingsPt->mySwitches.doFuelPlanning && mySettingsPt->useStudyMissionForAnalysis) { + theProgramName = rtIO->programname + "_study"; } else { - theProgramName = theFactoryPt->rtIO->programname; + theProgramName = rtIO->programname; } } @@ -40,39 +59,39 @@ performance_assessment_output::~performance_assessment_output() { void performance_assessment_output::generateHtmlBody() { theReport.htmlReportStream() << "<h1>Report " << myAcftPt->acftName << "</h1>" << std::endl; - if (theFactoryPt->mySettingsPt->mySwitches.doFuelPlanning == true) { + if (mySettingsPt->mySwitches.doFuelPlanning == true) { theReport.htmlReportStream() << "<h2>Fuel Planning</h2>" << std::endl << "<table class=\"ceras\">" << std::endl << "<tr>" << std::endl - << "<td>Taxi Fuel: </td><td>" << theFactoryPt->theFuelPlanning->myFuel.taxiFuelTakeoff + theFactoryPt->theFuelPlanning->myFuel.taxiFuelLanding << " kg</td>" << std::endl + << "<td>Taxi Fuel: </td><td>" << abstractFuelPlanningPt->myFuel.taxiFuelTakeoff + abstractFuelPlanningPt->myFuel.taxiFuelLanding << " kg</td>" << std::endl << "</tr>" << std::endl << "<tr>" << std::endl - << "<td>Mission Fuel: </td><td>" << theFactoryPt->theFuelPlanning->myFuel.missionFuel << " kg</td>" << std::endl + << "<td>Mission Fuel: </td><td>" << abstractFuelPlanningPt->myFuel.missionFuel << " kg</td>" << std::endl << "</tr>" << std::endl << "<tr>" << std::endl - << "<td>Trip Fuel: </td><td>" << theFactoryPt->theFuelPlanning->myFuel.tripFuel << " kg</td>" << std::endl + << "<td>Trip Fuel: </td><td>" << abstractFuelPlanningPt->myFuel.tripFuel << " kg</td>" << std::endl << "</tr>" << std::endl << "<tr>" << std::endl << "<td>-> TOM: </td><td>" << Rounding(myAcftPt->OME + myAcftPt->myMission.missionPayload - + theFactoryPt->theFuelPlanning->myFuel.missionFuel - - theFactoryPt->theFuelPlanning->myFuel.taxiFuelTakeoff, 1) << " kg</td>" << std::endl + + abstractFuelPlanningPt->myFuel.missionFuel + - abstractFuelPlanningPt->myFuel.taxiFuelTakeoff, 1) << " kg</td>" << std::endl << "</tr>" << std::endl << "<tr>" << std::endl << "<td>-> MTOM: </td><td>" << myAcftPt->MTOM << " kg</td>" << std::endl << "</tr>" << std::endl << "</table>" << std::endl - << "<img class=\"ceras\" src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + << "<img class=\"ceras\" src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_Mission_plot.svg\">" << std::endl; } theReport.htmlReportStream() << "<h2>Payload Range</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doPayloadRange == true) { - if (theFactoryPt->mySettings.mySwitches.doFuelPlanning == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doPayloadRange == true) { + if (mySettingsPt->mySwitches.doFuelPlanning == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_payloadRange.svg\">" << std::endl; } else { - if (theFactoryPt->abstractPayloadRangePt->Range.at(2) > myAcftPt->designRange) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (abstractPayloadRangePt->Range.at(2) > myAcftPt->designRange) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_payloadRange.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -90,8 +109,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>Flight Envelope</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doFlightEnvelopePerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doFlightEnvelopePerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_FlightEnvelope.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -101,8 +120,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>Ceiling</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doFlightEnvelopePerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doFlightEnvelopePerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_Ceiling.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -112,13 +131,13 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>Specific Air Range (SAR)</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doFlightEnvelopePerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doFlightEnvelopePerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_SAR.svg\">" << std::endl << "<div id=\"wrapper\">" << std::endl << "<div id=\"leftCol\">" << std::endl << "<h2>Best Specific Air Range (SAR)</h2>" << std::endl - << "<img class=\"ceras\" src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + << "<img class=\"ceras\" src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_bestSAR.svg\">" << std::endl << "</div>" << std::endl << "</div>" << std::endl; @@ -130,8 +149,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>Takeoff Performance</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doTOPerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doTOPerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_TOFL.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -141,8 +160,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>BFL Performance</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doBLFLPerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doBLFLPerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_BLFL.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -152,8 +171,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>Landing Performance</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doLandingPerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doLandingPerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_LDN.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -163,8 +182,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>Engine Performance</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doEnginePerformance == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doEnginePerformance == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_EnginePerformance.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -174,8 +193,8 @@ void performance_assessment_output::generateHtmlBody() { << "</table>" << std::endl; } theReport.htmlReportStream() << "<h2>V-n-Diagram</h2>" << std::endl; - if (theFactoryPt->mySettings.mySwitches.doVnDiagram == true) { - theReport.htmlReportStream() << "<img src=\"" + relativePath(theFactoryPt->rtIO->getPlotDir(), theFactoryPt->rtIO->getReportDir()) + + if (mySettingsPt->mySwitches.doVnDiagram == true) { + theReport.htmlReportStream() << "<img src=\"" + relativePath(rtIO->getPlotDir(), rtIO->getReportDir()) + theProgramName + "_VnDiagram.svg\">" << std::endl; } else { theReport.htmlReportStream() << "<table>" << std::endl @@ -189,157 +208,323 @@ void performance_assessment_output::generateHtmlBody() { void performance_assessment_output::writeXmlOutput() { string subPath; /* MTOM */ - if (theFactoryPt->mySettings.designForMTOM == true && theFactoryPt->mySettings.mySwitches.doFuelPlanning == true) { - theFactoryPt->rtIO->acxml.at("AcftExchangeFile/MassesAndLoadings/MTOM") = myAcftPt->MTOM; + if (mySettingsPt->designForMTOM == true && mySettingsPt->mySwitches.doFuelPlanning == true) { + rtIO->acxml.at("analysis/masses_cg_inertia/maximum_takeoff_mass/mass_properties/mass/value") = myAcftPt->MTOM; } - if (theFactoryPt->mySettings.mySwitches.doFlightEnvelopePerformance == true) { + if (mySettingsPt->mySwitches.doFlightEnvelopePerformance == true) { /* Speeds */ - subPath = "/aircraft_exchange_file/assessment/performance/speed"; - theFactoryPt->rtIO->acxml.at(subPath + "/maximum_operating_mach_number") = myAcftPt->MMO; - theFactoryPt->rtIO->acxml.at(subPath + "/maximum_operating_velocity") = myAcftPt->VMO; - theFactoryPt->rtIO->acxml.at(subPath + "/dive_mach_number") = myAcftPt->MDive; - theFactoryPt->rtIO->acxml.at(subPath + "/dive_velocity") = myAcftPt->VDive; - theFactoryPt->rtIO->acxml.at(subPath + "/one_g_stall_speed_velocity") = myAcftPt->v1gS_Clean(myAcftPt->MTOM, 0.0); + subPath = "assessment/performance/speed"; + Endnode<double> MMO(subPath + "/maximum_operating_mach_number", "Maximum operating mach number"); + MMO.set_value(myAcftPt->MMO); + MMO.set_boundaries(0., 1.); + MMO.set_unit("1"); + MMO.update(rtIO->acxml); + Endnode<double> VMO(subPath + "/maximum_operating_velocity", "Maximum operating velocity"); + VMO.set_value(myAcftPt->VMO); + VMO.set_boundaries(0., 400.); + VMO.set_unit("m/s"); + VMO.update(rtIO->acxml); + Endnode<double> MDive(subPath + "/dive_mach_number", "Maximum dive mach number"); + MDive.set_value(myAcftPt->MDive); + MDive.set_boundaries(0., 1.); + MDive.set_unit("1"); + MDive.update(rtIO->acxml); + Endnode<double> VDive(subPath + "/dive_velocity", "Dive velocity"); + VDive.set_value(myAcftPt->VDive); + VDive.set_boundaries(0., 400.); + VDive.set_unit("m/s"); + VDive.update(rtIO->acxml); + Endnode<double> v1gsClean(subPath + "/one_g_stall_speed_velocity", "One g stall speed"); + v1gsClean.set_value(myAcftPt->v1gS_Clean(myAcftPt->MTOM, 0.0)); + v1gsClean.set_boundaries(0., 400.); + v1gsClean.set_unit("m/s"); + v1gsClean.update(rtIO->acxml); } /* Start */ - if (theFactoryPt->mySettings.mySwitches.doTOPerformance == true) { - subPath = "/aircraft_exchange_file/assessment/performance/takeoff"; - theFactoryPt->rtIO->acxml.at(subPath + "/takeoff_distance_normal_safety") = theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().TODR_AEO; - theFactoryPt->rtIO->acxml.at(subPath + "/lift_off_speed_velocity") = myAcftPt->vLOF(myAcftPt->MTOM, 0.0); - theFactoryPt->rtIO->acxml.at(subPath + "/decision_speed") = theFactoryPt->abstractTakeOffPerformancePt->myBLFL.v1; - theFactoryPt->rtIO->acxml.at(subPath + "/takeoff_safety_speed") = myAcftPt->v2(myAcftPt->MTOM, 0.0); - theFactoryPt->rtIO->acxml.at(subPath + "/final_takeoff_speed") = myAcftPt->vFTO(myAcftPt->MTOM, 0.0); - theFactoryPt->rtIO->acxml.at(subPath + "/time_to_screen_height") = theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().Time; - theFactoryPt->rtIO->acxml.at(subPath + "/climb_or_descend_segment_climb_gradient") = theFactoryPt->abstractTakeOffPerformancePt->scdSegmentGradient; - theFactoryPt->rtIO->acxml.at(subPath + "/final_segment_climb_gradient") = theFactoryPt->abstractTakeOffPerformancePt->finalSegmentGradient; + if (mySettingsPt->mySwitches.doTOPerformance == true) { + // subPath = "assessment/performance/takeoff"; + // Endnode<double> todns(subPath + "/takeoff_distance_normal_safety", "Takeoff distance normal safety"); + // todns.set_value(abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().TODR_AEO); + // todns.set_lower_boundary(0); + // todns.set_upper_boundary(20000); + // todns.set_unit("m"); + // todns.update(rtIO->acxml); + Endnode<double> vlof(subPath + "/lift_off_speed_velocity", "Lift off velocity"); + vlof.set_value(myAcftPt->vLOF(myAcftPt->MTOM, 0.0)); + vlof.set_lower_boundary(0); + vlof.set_upper_boundary(400); + vlof.set_unit("m/s"); + vlof.update(rtIO->acxml); + Endnode<double> decision_speed(subPath + "/decision_speed", "Take off decision speed (V1)"); + decision_speed.set_value(abstractTakeOffPerformancePt->myBLFL.v1); + decision_speed.set_lower_boundary(0); + decision_speed.set_upper_boundary(200); + decision_speed.set_unit("m/s"); + decision_speed.update(rtIO->acxml); + Endnode<double> v2(subPath + "/takeoff_safety_speed", "Take off safety speed (V2)"); + v2.set_value(myAcftPt->v2(myAcftPt->MTOM, 0.0)); + v2.set_boundaries(0, 200); + v2.set_unit("m/s"); + v2.update(rtIO->acxml); + Endnode<double> vfto(subPath + "/final_takeoff_speed", "Final take off speed"); + vfto.set_value(myAcftPt->vFTO(myAcftPt->MTOM, 0.0)); + vfto.set_boundaries(0, 200); + vfto.set_unit("m/s"); + vfto.update(rtIO->acxml); + Endnode<double> ttsh(subPath + "/time_to_screen_height", "Time to screen height"); + ttsh.set_value(abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().Time); + ttsh.set_boundaries(0, 3600); + ttsh.set_unit("s"); + ttsh.update(rtIO->acxml); + Endnode<double> climbDescendecondSegment(subPath + "/climb_or_descend_segment_climb_gradient", "Climb or descend in second segment"); + climbDescendecondSegment.set_value(abstractTakeOffPerformancePt->scdSegmentGradient); + climbDescendecondSegment.set_boundaries(0, 100); + climbDescendecondSegment.set_unit("m/s"); + climbDescendecondSegment.update(rtIO->acxml); + Endnode<double> finalSegmentGradient(subPath + "/final_segment_climb_gradient", "Climb gradient in final segment"); + finalSegmentGradient.set_value(abstractTakeOffPerformancePt->finalSegmentGradient); + finalSegmentGradient.set_boundaries(0, 100); + finalSegmentGradient.set_unit("m/s"); + finalSegmentGradient.update(rtIO->acxml); } /* BLFL */ - if (theFactoryPt->mySettings.mySwitches.doBLFLPerformance == true) { - subPath = "/aircraft_exchange_file/assessment/performance/takeoff"; - theFactoryPt->rtIO->acxml.at(subPath + "/balanced_field_length") = theFactoryPt->abstractTakeOffPerformancePt->myBLFL.BLFL; + if (mySettingsPt->mySwitches.doBLFLPerformance == true) { + subPath = "assessment/performance/takeoff"; + Endnode<double> BLFL(subPath + "/balanced_field_length", "Balanced field length"); + BLFL.set_value(abstractTakeOffPerformancePt->myBLFL.BLFL); + BLFL.set_boundaries(0, 100000); + BLFL.set_unit("m"); + BLFL.update(rtIO->acxml); } /* Landing */ - if (theFactoryPt->mySettings.mySwitches.doLandingPerformance == true) { - subPath = "/aircraft_exchange_file/assessment/performance/landing"; - theFactoryPt->rtIO->acxml.at(subPath + "/needed_runway_length") = theFactoryPt->theLandingPerformance->myLDNField.at(0).myLDN.back().ALD_AEO; - theFactoryPt->rtIO->acxml.at(subPath + "/approach_speed") = myAcftPt->vAPPR(myAcftPt->MLM, 0.0); - } - if (theFactoryPt->mySettings.mySwitches.doPayloadRange) { + if (mySettingsPt->mySwitches.doLandingPerformance == true) { + subPath = "assessment/performance/landing"; + Endnode<double> needed_runway_length(subPath + "/needed_runway_length", "Needed runway length"); + needed_runway_length.set_value(abstractLandingPerformancePt->myLDNField.at(0).myLDN.back().ALD_AEO); + needed_runway_length.set_boundaries(0, 100000); + needed_runway_length.set_unit("m"); + needed_runway_length.update(rtIO->acxml); + Endnode<double> vappr(subPath + "/approach_speed", "Approach speed"); + vappr.set_value(myAcftPt->vAPPR(myAcftPt->MLM, 0.0)); + vappr.set_boundaries(0, 1000); + vappr.set_unit("m/s"); + vappr.update(rtIO->acxml); + } + if (mySettingsPt->mySwitches.doPayloadRange) { /* Ranges */ - subPath = "/aircraft_exchange_file/assessment/performance/range"; - if (theFactoryPt->mySettings.mySwitches.doFuelPlanning == true) { - theFactoryPt->rtIO->acxml.at(subPath + "/range_max_payload_at_maximum_takeoff_mass") = theFactoryPt->theFuelPlanning->myPayloadRange.at(1).Range; - theFactoryPt->rtIO->acxml.at(subPath + "/range_max_fuel_at_maximum_takeoff_mass") = theFactoryPt->theFuelPlanning->myPayloadRange.at(2).Range; - theFactoryPt->rtIO->acxml.at(subPath + "/payload_maximum_fuel_at_maximum_takeoff_mass") = theFactoryPt->theFuelPlanning->myPayloadRange.at(2).Payload; - theFactoryPt->rtIO->acxml.at(subPath + "/range_maximum_fuel_empty") = theFactoryPt->theFuelPlanning->myPayloadRange.at(3).Range; + subPath = "assessment/performance/range"; + Endnode<double> range_max_payload_at_maximum_takeoff_mass(subPath + "/range_max_payload_at_maximum_takeoff_mass", "Range at max payload at maximum take off mass"); + Endnode<double> range_max_fuel_at_maximum_takeoff_mass(subPath + "/range_max_fuel_at_maximum_takeoff_mass", "Range at max fuel at maximum take off mass"); + Endnode<double> payload_maximum_fuel_at_maximum_takeoff_mass(subPath + "/payload_maximum_fuel_at_maximum_takeoff_mass", "Payload at maximum fuel at maximum takeoff mass"); + Endnode<double> range_maximum_fuel_empty(subPath + "/range_maximum_fuel_empty", "Range at maximum fuel empty"); + if (mySettingsPt->mySwitches.doFuelPlanning == true) { + range_max_payload_at_maximum_takeoff_mass.set_value(abstractFuelPlanningPt->myPayloadRange.at(1).Range); + range_max_fuel_at_maximum_takeoff_mass.set_value(abstractFuelPlanningPt->myPayloadRange.at(2).Range); + payload_maximum_fuel_at_maximum_takeoff_mass.set_value(abstractFuelPlanningPt->myPayloadRange.at(2).Payload); + range_maximum_fuel_empty.set_value(abstractFuelPlanningPt->myPayloadRange.at(3).Range); } else { - if (theFactoryPt->abstractPayloadRangePt->Range.at(2) > myAcftPt->designRange) { - theFactoryPt->rtIO->acxml.at(subPath + "/range_max_payload_at_maximum_takeoff_mass") = theFactoryPt->abstractPayloadRangePt->Range.at(1); - theFactoryPt->rtIO->acxml.at(subPath + "/range_max_fuel_at_maximum_takeoff_mass") = theFactoryPt->abstractPayloadRangePt->Range.at(2); - theFactoryPt->rtIO->acxml.at(subPath + "/payload_maximum_fuel_at_maximum_takeoff_mass") = theFactoryPt->abstractPayloadRangePt->Payload.at(2); - theFactoryPt->rtIO->acxml.at(subPath + "/range_maximum_fuel_empty") = theFactoryPt->abstractPayloadRangePt->Range.at(3); + if (abstractPayloadRangePt->Range.at(2) > myAcftPt->designRange) { + range_max_payload_at_maximum_takeoff_mass.set_value(abstractPayloadRangePt->Range.at(1)); + range_max_fuel_at_maximum_takeoff_mass.set_value(abstractPayloadRangePt->Range.at(2)); + payload_maximum_fuel_at_maximum_takeoff_mass.set_value(abstractPayloadRangePt->Payload.at(2)); + range_maximum_fuel_empty.set_value(abstractPayloadRangePt->Range.at(3)); } } - } - if (theFactoryPt->mySettings.mySwitches.doFuelPlanning == true) { + range_max_payload_at_maximum_takeoff_mass.set_boundaries(0, INFINITY); + range_max_payload_at_maximum_takeoff_mass.set_unit("m"); + range_max_payload_at_maximum_takeoff_mass.update(rtIO->acxml); + range_max_fuel_at_maximum_takeoff_mass.set_boundaries(0, INFINITY); + range_max_fuel_at_maximum_takeoff_mass.set_unit("m"); + range_max_fuel_at_maximum_takeoff_mass.update(rtIO->acxml); + payload_maximum_fuel_at_maximum_takeoff_mass.set_boundaries(0, INFINITY); + payload_maximum_fuel_at_maximum_takeoff_mass.set_unit("kg"); + payload_maximum_fuel_at_maximum_takeoff_mass.update(rtIO->acxml); + range_maximum_fuel_empty.set_boundaries(0, INFINITY); + range_maximum_fuel_empty.set_unit("m"); + range_maximum_fuel_empty.update(rtIO->acxml); + } + if (mySettingsPt->mySwitches.doFuelPlanning == true) { /* Mission Fuels */ - if (!theFactoryPt->mySettings.designForMTOM && theFactoryPt->mySettings.useStudyMissionForAnalysis) { - subPath = "/aircraft_exchange_file/analysis/mission/study_mission"; + if (!mySettingsPt->designForMTOM && mySettingsPt->useStudyMissionForAnalysis) { + subPath = "analysis/mission/study_mission"; } else { - subPath = "/aircraft_exchange_file/analysis/mission/design_mission"; + subPath = "analysis/mission/design_mission"; } - theFactoryPt->rtIO->acxml.at(subPath + "/range") = convertUnit(KILO, METER, NAUTICALMILE, myAcftPt->myMission.missionRange); + Endnode<double> missionRange(subPath + "/range", "Traveled range from break release to end of taxi at destination"); + missionRange.set_value(myAcftPt->myMission.missionRange); + missionRange.update(rtIO->acxml); + // rtIO->acxml.at(subPath + "/range") = myAcftPt->myMission.missionRange; // Fuel - theFactoryPt->rtIO->acxml.at(subPath + "/mission_energy") = std::to_string(theFactoryPt->theFuelPlanning->myFuel.missionFuel) + "<-Fuel[kg]"; // Total Tanked Fuel - theFactoryPt->rtIO->acxml.at(subPath + "/trip_energy") = theFactoryPt->theFuelPlanning->myFuel.tripFuel; // Tanked fuel - Reserve Fuel - Taxi Fuel - theFactoryPt->rtIO->acxml.at(subPath + "/taxi_energy") = theFactoryPt->theFuelPlanning->myFuel.taxiFuelTakeoff; // TODO(hansmann): xpath&fuel2energyconversion - theFactoryPt->rtIO->acxml.at(subPath + "/TaxifuelLdg") = theFactoryPt->theFuelPlanning->myFuel.taxiFuelLanding; // TODO(hansmann): xpath&fuel2energyconversion + // rtIO->acxml.at(subPath + "/mission_energy") = std::to_string(abstractFuelPlanningPt->myFuel.missionFuel) + "<-Fuel[kg]"; // Total Tanked Fuel + // rtIO->acxml.at(subPath + "/trip_energy") = abstractFuelPlanningPt->myFuel.tripFuel; // Tanked fuel - Reserve Fuel - Taxi Fuel + // rtIO->acxml.at(subPath + "/taxi_energy") = abstractFuelPlanningPt->myFuel.taxiFuelTakeoff; // TODO(hansmann): xpath&fuel2energyconversion + // rtIO->acxml.at(subPath + "/TaxifuelLdg") = abstractFuelPlanningPt->myFuel.taxiFuelLanding; // TODO(hansmann): xpath&fuel2energyconversion // Rest - theFactoryPt->rtIO->acxml.at(subPath + "/TOM") = myAcftPt->OME - + myAcftPt->myMission.missionPayload - + theFactoryPt->theFuelPlanning->myFuel.missionFuel - - theFactoryPt->theFuelPlanning->myFuel.taxiFuelTakeoff; - theFactoryPt->rtIO->acxml.at(subPath + "/payload_mass") = myAcftPt->myMission.missionPayload; - theFactoryPt->rtIO->acxml.at(subPath + "/number_of_pax") = myAcftPt->myMission.missionPAX; - theFactoryPt->rtIO->acxml.at(subPath + "/cargo_mass") = myAcftPt->myMission.missionCargo; - theFactoryPt->rtIO->acxml.at(subPath + "/takeoff_engine_derate") = myAcftPt->myMission.Steps.at(0).derating; - theFactoryPt->rtIO->acxml.at(subPath + "/block_time") = theFactoryPt->theFuelPlanning->blockTime; - theFactoryPt->rtIO->acxml.at(subPath + "/flight_time") = theFactoryPt->theFuelPlanning->tripTime; + Endnode<double> tom(subPath + "/takeoff_mass", "Take off mass"); + tom.set_value(myAcftPt->OME + myAcftPt->myMission.missionPayload + abstractFuelPlanningPt->myFuel.missionFuel - abstractFuelPlanningPt->myFuel.taxiFuelTakeoff); + tom.set_unit("kg"); + tom.set_boundaries(0, INFINITY); + tom.update(rtIO->acxml); + // rtIO->acxml.at(subPath + "/TOM") = myAcftPt->OME + // + myAcftPt->myMission.missionPayload + // + abstractFuelPlanningPt->myFuel.missionFuel + // - abstractFuelPlanningPt->myFuel.taxiFuelTakeoff; + Endnode<double> payload_mass(subPath + "/payload_mass", "Mission payload mass"); + payload_mass.set_value(myAcftPt->myMission.missionPayload); + payload_mass.set_boundaries(0, INFINITY); + payload_mass.set_unit("kg"); + payload_mass.update(rtIO->acxml); + Endnode<int> missionPax(subPath + "/number_of_pax", "Number of passengers considered for the mission"); + missionPax.set_value(myAcftPt->myMission.missionPAX); + missionPax.set_boundaries(0, INFINITY); + missionPax.set_unit("1"); + missionPax.update(rtIO->acxml); + Endnode<double> cargo_mass(subPath + "/cargo_mass", "Cargo mass considered for the mission"); + cargo_mass.set_value(myAcftPt->myMission.missionCargo); + cargo_mass.set_boundaries(0, INFINITY); + cargo_mass.set_unit("kg"); + cargo_mass.update(rtIO->acxml); + Endnode<double> takeoff_engine_derate(subPath + "/takeoff_engine_derate", "Engine power demand"); + takeoff_engine_derate.set_value(myAcftPt->myMission.Steps.at(0).derating); + takeoff_engine_derate.set_unit("1"); + takeoff_engine_derate.update(rtIO->acxml); + Endnode<double> block_time(subPath + "/block_time", "Block time for the whole mission: Time from break release to end of taxiing after landing"); + block_time.set_value(abstractFuelPlanningPt->blockTime); + block_time.set_unit("s"); + block_time.update(rtIO->acxml); + Endnode<double> flight_time(subPath + "/flight_time", "Flight time for the whole mission"); + flight_time.set_value(abstractFuelPlanningPt->tripTime); + flight_time.set_unit("s"); + flight_time.update(rtIO->acxml); } /* Requirements Checks */ // TLARS - subPath = "/aircraft_exchange_file/requirement_compliance/top_level_aircraft_requirements"; - if (theFactoryPt->mySettings.mySwitches.doTOPerformance == true) { - theFactoryPt->rtIO->acxml.at(subPath + "/design_takeoff_distance/maintainable") = myAcftPt->myChecks.TOFL; - theFactoryPt->rtIO->acxml.at(subPath + "/design_takeoff_distance/checked") = true; - } - if (theFactoryPt->mySettings.mySwitches.doLandingPerformance == true) { - theFactoryPt->rtIO->acxml.at(subPath + "/design_landing_field_length/maintainable") = myAcftPt->myChecks.LDN; - theFactoryPt->rtIO->acxml.at(subPath + "/design_landing_field_length/checked") = true; - theFactoryPt->rtIO->acxml.at(subPath + "/design_approach_speed/maintainable") = myAcftPt->myChecks.vApproach; - theFactoryPt->rtIO->acxml.at(subPath + "/design_approach_speed/checked") = true; - } + subPath = "aircraft_exchange_file/requirement_compliance/top_level_aircraft_requirements"; + Endnode<bool> design_takeoff_distance_checked(subPath + "/design_takeoff_distance/checked", "Indicates if the value has been checked against the requirement."); + design_takeoff_distance_checked.set_value(false); + if (mySettingsPt->mySwitches.doTOPerformance == true) { + Endnode<bool> design_takeoff_distance_maintainable(subPath + "/design_takeoff_distance/maintainable", + "Switch indicating if design takeoff distance can be maintained."); + design_takeoff_distance_maintainable.set_value(myAcftPt->myChecks.TOFL); + design_takeoff_distance_maintainable.update(rtIO->acxml); + design_takeoff_distance_checked.set_value(true); + } + design_takeoff_distance_checked.update(rtIO->acxml); + + Endnode<bool> design_landing_field_length_checked(subPath + "/design_landing_field_length/checked", "Indicates if the value has been checked against the requirement."); + design_landing_field_length_checked.set_value(false); + Endnode<bool> design_approach_speed_maintainable_checked(subPath + "/design_approach_speed/checked", "Indicates if the value has been checked against the requirement."); + design_approach_speed_maintainable_checked.set_value(false); + if (mySettingsPt->mySwitches.doLandingPerformance == true) { + Endnode<bool> design_landing_field_length_maintainable(subPath + "/design_landing_field_length/maintainable", + "Switch indicating if landing field length can be maintained."); + design_landing_field_length_maintainable.set_value(myAcftPt->myChecks.LDN); + design_landing_field_length_maintainable.update(rtIO->acxml); + design_landing_field_length_checked.set_value(true); + Endnode<bool> design_approach_speed_maintainable(subPath + "/design_approach_speed/maintainable", "Switch indicating if approach speed can be maintained."); + design_approach_speed_maintainable.set_value(myAcftPt->myChecks.vApproach); + design_approach_speed_maintainable.update(rtIO->acxml); + design_approach_speed_maintainable_checked.set_value(true); + } + design_landing_field_length_checked.update(rtIO->acxml); + design_approach_speed_maintainable_checked.update(rtIO->acxml); + + // Span limit + Endnode<bool> span_limit(subPath + "/span_limit/maintained", "Switch indicating if the span limit according to ICAO aerodrome ref code is maintained."); + span_limit.set_value(myAcftPt->myChecks.span_limit); + span_limit.update(rtIO->acxml); + Endnode<bool> span_limit_checked(subPath + "/span_limit/checked", "Indicates if the value has been checked against the requirement."); + span_limit_checked.set_value(true); + // Certification - subPath = "AcftExchangeFile/Performance/RequirementsChecks/Certification"; - if (theFactoryPt->mySettings.mySwitches.doTOPerformance == true) { //TODO - theFactoryPt->rtIO->acxml.at(subPath + "/climbGradientSecondTOSegment") = myAcftPt->myChecks.climbGradientSecondSegment; - theFactoryPt->rtIO->acxml.at(subPath + "/climbGradientSecondTOSegment").setAttrib("Checked", 1); - theFactoryPt->rtIO->acxml.at(subPath + "/climbGradientFinalTOSegment") = myAcftPt->myChecks.climbGradientFinalSegment; - theFactoryPt->rtIO->acxml.at(subPath + "/climbGradientFinalTOSegment").setAttrib("Checked", 1); - } - if (theFactoryPt->mySettings.mySwitches.doLandingPerformance == true) { - theFactoryPt->rtIO->acxml.at(subPath + "/climbGradientApproachOEI") = myAcftPt->myChecks.climbGradientApproachOEI; - theFactoryPt->rtIO->acxml.at("/" + subPath + "/climbGradientApproachOEI").setAttrib("Checked", 1); - theFactoryPt->rtIO->acxml.at(subPath + "/climbGradientApproachAEO") = myAcftPt->myChecks.climbGradientApproachAEO; - theFactoryPt->rtIO->acxml.at("/" + subPath + "/climbGradientApproachAEO").setAttrib("Checked", 1); - } - // aixml::saveDocument(theFactoryPt->rtIO->acxml, mySettingsPt->getToolLevel()); // TODO - // aixml::closeDocument(theFactoryPt->rtIO->acxml); + subPath = "aircraft_exchange_file/requirement_compliance/certification"; + Endnode<bool> climb_gradient_of_second_takeoff_segment_checked(subPath + "/climb_gradient_of_second_takeoff_segment/checked", + "Indicates if the value has been checked against the requirement."); + climb_gradient_of_second_takeoff_segment_checked.set_value(false); + Endnode<bool> climb_gradient_of_final_takeoff_segment_checked(subPath + "/climb_gradient_of_final_takeoff_segment/checked", + "Indicates if the value has been checked against the requirement."); + climb_gradient_of_final_takeoff_segment_checked.set_value(false); + + if (mySettingsPt->mySwitches.doTOPerformance == true) { + Endnode<bool> climb_gradient_of_second_takeoff_segment(subPath + "/climb_gradient_of_second_takeoff_segment/maintainable", + "Switch indicating if climb gradient of second takeoff segment can be maintained."); + climb_gradient_of_second_takeoff_segment.set_value(myAcftPt->myChecks.climbGradientSecondSegment); + climb_gradient_of_second_takeoff_segment.update(rtIO->acxml); + climb_gradient_of_second_takeoff_segment_checked.set_value(true); + Endnode<bool> climb_gradient_of_final_takeoff_segment(subPath + "/climb_gradient_of_final_takeoff_segment/maintainable", + "Switch indicating if climb gradient of final takeoff segment can be maintained."); + climb_gradient_of_final_takeoff_segment.set_value(myAcftPt->myChecks.climbGradientFinalSegment); + climb_gradient_of_final_takeoff_segment.update(rtIO->acxml); + climb_gradient_of_final_takeoff_segment_checked.set_value(true); + } + climb_gradient_of_second_takeoff_segment_checked.update(rtIO->acxml); + climb_gradient_of_final_takeoff_segment_checked.update(rtIO->acxml); + + Endnode<bool> climb_gradient_approach_one_engine_inoperative_checked(subPath + "/climb_gradient_approach_one_engine_inoperative/checked", + "Indicates if the value has been checked against the requirement."); + climb_gradient_approach_one_engine_inoperative_checked.set_value(false); + Endnode<bool> climb_gradient_all_engines_operative_checked(subPath + "/climb_gradient_all_engines_operative/checked", + "Indicates if the value has been checked against the requirement."); + climb_gradient_all_engines_operative_checked.set_value(false); + if (mySettingsPt->mySwitches.doLandingPerformance == true) { + Endnode<bool> climb_gradient_approach_one_engine_inoperative(subPath + "/climb_gradient_approach_one_engine_inoperative/maintainable", + "Switch indicating if climb gradient approach one engine inoperative can be maintained."); + climb_gradient_approach_one_engine_inoperative.set_value(myAcftPt->myChecks.climbGradientApproachOEI); + climb_gradient_approach_one_engine_inoperative.update(rtIO->acxml); + climb_gradient_approach_one_engine_inoperative_checked.set_value(true); + Endnode<bool> climb_gradient_all_engines_operative(subPath + "/climb_gradient_all_engines_operative/maintainable", + "Switch indicating if climb gradient with all engines operative can be maintained."); + climb_gradient_all_engines_operative.set_value(myAcftPt->myChecks.climbGradientApproachAEO); + climb_gradient_all_engines_operative.update(rtIO->acxml); + climb_gradient_all_engines_operative_checked.set_value(true); + } + climb_gradient_approach_one_engine_inoperative_checked.update(rtIO->acxml); + climb_gradient_all_engines_operative_checked.update(rtIO->acxml); } void performance_assessment_output::generatePlotData() { - if (theFactoryPt->mySettings.mySwitches.doFuelPlanning == true) { + if (mySettingsPt->mySwitches.doFuelPlanning == true) { generatePlotDataMission(); } - if (theFactoryPt->mySettings.mySwitches.doPayloadRange == true) { + if (mySettingsPt->mySwitches.doPayloadRange == true) { generatePlotDataPayloadRange(); } - if (theFactoryPt->mySettings.mySwitches.doEnginePerformance == true) { + if (mySettingsPt->mySwitches.doEnginePerformance == true) { generateEnginePerformanceData(); } - if (theFactoryPt->mySettings.mySwitches.doFlightEnvelopePerformance == true) { + if (mySettingsPt->mySwitches.doFlightEnvelopePerformance == true) { generateCeilingPlotData(); generateFlightEnvelopeData(); generateSARPlotData(); generateBestSARAltPlotData(); } - if (theFactoryPt->mySettings.mySwitches.doTOPerformance == true) { + if (mySettingsPt->mySwitches.doTOPerformance == true) { generateTOFLPlotData(); } - if (theFactoryPt->mySettings.mySwitches.doBLFLPerformance == true) { + if (mySettingsPt->mySwitches.doBLFLPerformance == true) { generateBLFLPlotData(); } - if (theFactoryPt->mySettings.mySwitches.doLandingPerformance == true) { + if (mySettingsPt->mySwitches.doLandingPerformance == true) { generateLDNPlotData(); } - if (theFactoryPt->mySettings.mySwitches.doVnDiagram == true) { + if (mySettingsPt->mySwitches.doVnDiagram == true) { generateVnPlotData(); } } void performance_assessment_output::generatePlotDataMission() { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Mission.csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Mission.csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << string(theProgramName) + "_Mission.csv could not be opened!" << std::endl; exit(1); } else { - csv << "# " + theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Mission.csv" << std::endl; + csv << "# " + mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Mission.csv" << std::endl; // Adjust data structure: - csv << "# (1) ID; (2) Time [min]; (3) Range [NM]; (4) Altitude [ft]; (5) TAS [kts]; (6) CAS [kts]; (7) Mach; "; - csv << "(8) A/C Mass [kg]; (9) consumed Fuel [kg]; (10) total consumed Fuel [kg]; (11) Thrust [kN]; "; + csv << "# (1) ID; (2) Time [s]; (3) Range [m]; (4) Altitude [m]; (5) TAS [m/s]; (6) CAS [m/s]; (7) Mach; "; + csv << "(8) A/C Mass [kg]; (9) consumed Fuel [kg]; (10) total consumed Fuel [kg]; (11) Thrust [N]; "; csv << "(12) Fuel Flow [kg/s]; (13) ROC [m/s]; (14) C_L" << std::endl; /*(1)*/ csv << "0; "; /*(1)*/ csv << "0; "; @@ -348,7 +533,7 @@ std::ofstream csv; /*(5)*/ csv << "0; "; /*(6)*/ csv << "0; "; /*(7)*/ csv << "0; "; - /*(8)*/ csv << theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(0).Mass << "; "; + /*(8)*/ csv << abstractFuelPlanningPt->theMissionFuel.at(0).Mass << "; "; /*(9)*/ csv << "0; "; /*(10)*/ csv << "0; "; /*(11)*/ csv << "0; "; @@ -359,26 +544,26 @@ std::ofstream csv; double range(0.); double fuel(0.); for (unsigned int i = 0; i <= myAcftPt->myMission.Steps.size() - 1; i++) { - time += theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).Time; - range += theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).Range; - fuel += theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).consumedFuel; - double C_L = (2. * G_FORCE * theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).Mass) - / (myAcftPt->atm.getDensity(convertUnit(FOOT, METER, myAcftPt->myMission.Steps.at(i).endAltitude)) - * pow(convertUnit(KNOTS, METERPERSECOND, myAcftPt->myMission.Steps.at(i).endTAS), 2.) + time += abstractFuelPlanningPt->theMissionFuel.at(i + 1).Time; + range += abstractFuelPlanningPt->theMissionFuel.at(i + 1).Range; + fuel += abstractFuelPlanningPt->theMissionFuel.at(i + 1).consumedFuel; + double C_L = (2. * G_FORCE * abstractFuelPlanningPt->theMissionFuel.at(i + 1).Mass) + / (myAcftPt->atm.getDensity(myAcftPt->myMission.Steps.at(i).endAltitude) + * pow(myAcftPt->myMission.Steps.at(i).endTAS, 2.) * myAcftPt->S_Wing); /*(1)*/ csv << i + 1 << "; "; - /*(1)*/ csv << convertUnit(MINUTE, HOUR, time) << "; "; - /*(3)*/ csv << convertUnit(METER, NAUTICALMILE, range) << "; "; + /*(1)*/ csv << time << "; "; + /*(3)*/ csv << range << "; "; /*(4)*/ csv << myAcftPt->myMission.Steps.at(i).endAltitude << "; "; /*(5)*/ csv << myAcftPt->myMission.Steps.at(i).endTAS << "; "; /*(6)*/ csv << myAcftPt->myMission.Steps.at(i).endCAS << "; "; /*(7)*/ csv << myAcftPt->myMission.Steps.at(i).endMach << "; "; - /*(8)*/ csv << theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).Mass << "; "; - /*(9)*/ csv << theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).consumedFuel << "; "; + /*(8)*/ csv << abstractFuelPlanningPt->theMissionFuel.at(i + 1).Mass << "; "; + /*(9)*/ csv << abstractFuelPlanningPt->theMissionFuel.at(i + 1).consumedFuel << "; "; /*(10)*/ csv << fuel << "; "; - /*(11)*/ csv << theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).Thrust << "; "; - /*(12)*/ csv << theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).fuelFlow << "; "; - /*(13)*/ csv << theFactoryPt->abstractFuelPlanningPt->theMissionFuel.at(i + 1).ROC << "; "; + /*(11)*/ csv << abstractFuelPlanningPt->theMissionFuel.at(i + 1).Thrust << "; "; + /*(12)*/ csv << abstractFuelPlanningPt->theMissionFuel.at(i + 1).fuelFlow << "; "; + /*(13)*/ csv << abstractFuelPlanningPt->theMissionFuel.at(i + 1).ROC << "; "; /*(14)*/ csv << C_L << std::endl; } csv.close(); @@ -387,32 +572,32 @@ std::ofstream csv; void performance_assessment_output::generatePlotDataPayloadRange() { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_payloadRange.csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_payloadRange.csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << string(theProgramName) + "_payloadRange.csv could not be opened!" << std::endl; exit(1); } else { - csv << "# " + theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_missionFuel.csv" << std::endl; + csv << "# " + mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_missionFuel.csv" << std::endl; // Adjust data structure: - csv << "# (1) Range [NM]; (2) Payload [kg]; (3) Fuel [kg]; (4) TOM [kg]; (5) OME [kg]" << std::endl; - if (theFactoryPt->mySettingsPt->mySwitches.doFuelPlanning == true) { - for (unsigned int i(0); i <= theFactoryPt->abstractFuelPlanningPt->myPayloadRange.size() - 1; i++) { - csv << convertUnit(KILO, METER, NAUTICALMILE, theFactoryPt->abstractFuelPlanningPt->myPayloadRange.at(i).Range) << "; "; - csv << theFactoryPt->abstractFuelPlanningPt->myPayloadRange.at(i).Payload << "; "; - // csv << myPerfPt->theFuelPlanning.myPayloadRange.at(i).Fuel << "; "; - // csv << myPerfPt->theFuelPlanning.myPayloadRange.at(i).TOM << "; "; + csv << "# (1) Range [m]; (2) Payload [kg]; (3) Fuel [kg]; (4) TOM [kg]; (5) OME [kg]" << std::endl; + if (mySettingsPt->mySwitches.doFuelPlanning == true) { + for (unsigned int i(0); i <= abstractFuelPlanningPt->myPayloadRange.size() - 1; i++) { + csv << abstractFuelPlanningPt->myPayloadRange.at(i).Range << "; "; + csv << abstractFuelPlanningPt->myPayloadRange.at(i).Payload << "; "; + // csv << myPerfPt->abstractFuelPlanning.myPayloadRange.at(i).Fuel << "; "; + // csv << myPerfPt->abstractFuelPlanning.myPayloadRange.at(i).TOM << "; "; // csv << myAcftPt->OME << "; "; csv << std::endl; } } else { - for (unsigned int i(0); i <= theFactoryPt->abstractPayloadRangePt->Range.size() - 1; i++) { - csv << convertUnit(KILO, METER, NAUTICALMILE, theFactoryPt->abstractPayloadRangePt->Range.at(i)) << "; "; - csv << theFactoryPt->abstractPayloadRangePt->Payload.at(i) << "; "; - csv << theFactoryPt->abstractPayloadRangePt->Fuel.at(i) << "; "; - csv << theFactoryPt->abstractPayloadRangePt->TOM.at(i) << "; "; - // csv << myPerfPt->theFuelPlanning.myPayloadRange.at(i).Fuel << "; "; - // csv << myPerfPt->theFuelPlanning.myPayloadRange.at(i).TOM << "; "; + for (unsigned int i(0); i <= abstractPayloadRangePt->Range.size() - 1; i++) { + csv << abstractPayloadRangePt->Range.at(i) << "; "; + csv << abstractPayloadRangePt->Payload.at(i) << "; "; + csv << abstractPayloadRangePt->Fuel.at(i) << "; "; + csv << abstractPayloadRangePt->TOM.at(i) << "; "; + // csv << myPerfPt->abstractFuelPlanning.myPayloadRange.at(i).Fuel << "; "; + // csv << myPerfPt->abstractFuelPlanning.myPayloadRange.at(i).TOM << "; "; // csv << myAcftPt->OME << "; "; csv << std::endl; } @@ -420,7 +605,7 @@ std::ofstream csv; csv << std::endl; csv << std::endl; csv << "# Design Point " << std::endl; - csv << convertUnit(KILO, METER, NAUTICALMILE, myAcftPt->designRange) << "; "; + csv << myAcftPt->designRange << "; "; csv << myAcftPt->designPayload << "; "; // csv << "N/A" << "; "; // csv << myAcftPt->MTOM << "; "; @@ -429,38 +614,37 @@ std::ofstream csv; csv << std::endl; csv << std::endl; csv << "# Mission Point" << std::endl; - csv << convertUnit(KILO, METER, NAUTICALMILE, myAcftPt->myMission.missionRange) << "; "; + csv << myAcftPt->myMission.missionRange << "; "; csv << myAcftPt->myMission.missionPayload << "; "; - // csv << myPerfPt->theFuelPlanning.myFuel.tripFuel << "; "; + // csv << myPerfPt->abstractFuelPlanning.myFuel.tripFuel << "; "; // csv << myAcftPt->MTOM << "; "; // csv << myAcftPt->OME << "; "; csv.close(); } - } void performance_assessment_output::generateEnginePerformanceData() { - for (unsigned int i(0); i <= theFactoryPt->abstractEnginePerformancePt->theRatingEngine.size() - 1; i++) { + for (unsigned int i(0); i <= abstractEnginePerformancePt->theRatingEngine.size() - 1; i++) { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_EnginePerformance_" + - theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).Rating + ".csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_EnginePerformance_" + + abstractEnginePerformancePt->theRatingEngine.at(i).Rating + ".csv"); csv.open(csvDataFile.c_str()); if (!csv) { - myRuntimeInfo->err << string(theProgramName) + "_EnginePerformance" + theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).Rating + myRuntimeInfo->err << string(theProgramName) + "_EnginePerformance" + abstractEnginePerformancePt->theRatingEngine.at(i).Rating + ".csv could not be opened!" << std::endl; exit(1); } else { - csv << "# " + theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_EnginePerformance" + - theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).Rating + ".csv" << std::endl; - csv << "# Rating: " + theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).Rating << std::endl; + csv << "# " + mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_EnginePerformance" + + abstractEnginePerformancePt->theRatingEngine.at(i).Rating + ".csv" << std::endl; + csv << "# Rating: " + abstractEnginePerformancePt->theRatingEngine.at(i).Rating << std::endl; /* Adjust data structure: */ - csv << "# (1) Mach; (2) Altitude [ft]; (3) Thrust per Engine [kN]; (4) SFC [mg/Ns]" << std::endl; - for (unsigned int j(0); j <= theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.size() - 1; j++) { - for (unsigned int n(0); n <= theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Mach.size() - 1; n++) { - csv << theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Mach.at(n) << "; "; - csv << (1. / 0.3048)*theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Altitude << "; "; - csv << theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Thrust.at(n) << "; "; - csv << 1000.*theFactoryPt->abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).SFC.at(n); + csv << "# (1) Mach; (2) Altitude [m]; (3) Thrust per Engine [N]; (4) SFC [g/Ns]" << std::endl; + for (unsigned int j(0); j <= abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.size() - 1; j++) { + for (unsigned int n(0); n <= abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Mach.size() - 1; n++) { + csv << abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Mach.at(n) << "; "; + csv << abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Altitude << "; "; + csv << abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).Thrust.at(n) << "; "; + csv << abstractEnginePerformancePt->theRatingEngine.at(i).theParameter.at(j).SFC.at(n); csv << std::endl; } csv << std::endl; @@ -472,21 +656,21 @@ void performance_assessment_output::generateEnginePerformanceData() { } void performance_assessment_output::generateCeilingPlotData() { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Ceiling.csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Ceiling.csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << string(theProgramName) + "_Ceiling.csv could not be opened!" << std::endl; exit(1); } else { - csv << "# " + theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Ceiling.csv" << std::endl; + csv << "# " + mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_Ceiling.csv" << std::endl; // Adjust data structure: - csv << "# (1) Mach; (2) Gross Mass [kg]; (3) Service Ceiling [ft]; (4) Max Ceiling [ft] ; (5) OEI max Ceiling [ft]; (6) Initial Cruise Altitude [ft]" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractCeilingPerformancePt->theCeiling.size() - 1; i++) { - csv << theFactoryPt->abstractCeilingPerformancePt->theCeiling.at(i).Mach << "; "; - csv << theFactoryPt->abstractCeilingPerformancePt->theCeiling.at(i).Mass << "; "; - csv << theFactoryPt->abstractCeilingPerformancePt->theCeiling.at(i).serviceCeiling * 3.2808 << "; "; - csv << theFactoryPt->abstractCeilingPerformancePt->theCeiling.at(i).maxCeiling * 3.2808 << "; "; - csv << theFactoryPt->abstractCeilingPerformancePt->theCeiling.at(i).maxCeilingOEI * 3.2808 << "; "; + csv << "# (1) Mach; (2) Gross Mass [kg]; (3) Service Ceiling [m]; (4) Max Ceiling [m] ; (5) OEI max Ceiling [m]; (6) Initial Cruise Altitude [m]" << std::endl; + for (unsigned int i(0); i <= abstractCeilingPerformancePt->theCeiling.size() - 1; i++) { + csv << abstractCeilingPerformancePt->theCeiling.at(i).Mach << "; "; + csv << abstractCeilingPerformancePt->theCeiling.at(i).Mass << "; "; + csv << abstractCeilingPerformancePt->theCeiling.at(i).serviceCeiling << "; "; + csv << abstractCeilingPerformancePt->theCeiling.at(i).maxCeiling << "; "; + csv << abstractCeilingPerformancePt->theCeiling.at(i).maxCeilingOEI << "; "; csv << myAcftPt->hInitialCruise << std::endl; } csv.close(); @@ -494,7 +678,7 @@ void performance_assessment_output::generateCeilingPlotData() { } void performance_assessment_output::generateFlightEnvelopeData() { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_FlightEnvelope.csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_FlightEnvelope.csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << string(theProgramName) + "_FlightEnvelope.csv could not be opened!" << std::endl; @@ -502,69 +686,69 @@ void performance_assessment_output::generateFlightEnvelopeData() { } else { csv << "# " + string(theProgramName) + "_FlightEnvelope.csv" << std::endl; // Adjust data structure: - csv << "# (1) Altitude [ft]; (2) TAS [kts]; (3) Gross Mass [kg]" <<std::endl; + csv << "# (1) Altitude [m]; (2) TAS [m/s]; (3) Gross Mass [kg]" <<std::endl; csv << "# Stall Limit" <<std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.size() - 1; i++) { - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.at(i).height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.at(i).speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + for (unsigned int i(0); i <= abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.size() - 1; i++) { + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.at(i).height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.at(i).speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv <<std::endl; } csv << std::endl; csv << std::endl; csv << "# VMO Limit" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vMO.size() - 1; i++) { - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vMO.at(i).height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vMO.at(i).speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + for (unsigned int i(0); i <= abstractFlightEnvelopesPt->myFlightEnvelope.back().vMO.size() - 1; i++) { + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vMO.at(i).height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vMO.at(i).speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv <<std::endl; } csv << std::endl; csv << std::endl; csv << "# MMO Limit" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MMO.size() - 1; i++) { - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MMO.at(i).height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MMO.at(i).speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + for (unsigned int i(0); i <= abstractFlightEnvelopesPt->myFlightEnvelope.back().MMO.size() - 1; i++) { + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().MMO.at(i).height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().MMO.at(i).speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv << std::endl; } csv <<std::endl; csv <<std::endl; csv << "# VDive Limit" <<std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vDive.size() - 1; i++) { - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vDive.at(i).height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vDive.at(i).speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + for (unsigned int i(0); i <= abstractFlightEnvelopesPt->myFlightEnvelope.back().vDive.size() - 1; i++) { + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vDive.at(i).height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vDive.at(i).speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv <<std::endl; } csv <<std::endl; csv <<std::endl; csv << "# MDive Limit" <<std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.size() - 1; i++) { - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.at(i).height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.at(i).speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + for (unsigned int i(0); i <= abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.size() - 1; i++) { + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.at(i).height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.at(i).speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv <<std::endl; } csv <<std::endl; csv <<std::endl; csv << "#Altitude Limit" <<std::endl; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.back().height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.back().speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.back().height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().vStall.back().speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv <<std::endl; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.back().height / 0.3048 << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.back().speed / (1.852 / 3.6) << "; "; - csv << theFactoryPt->abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.back().height << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().MDive.back().speed << "; "; + csv << abstractFlightEnvelopesPt->myFlightEnvelope.back().grossMass << "; "; csv.close(); } } void performance_assessment_output::generateSARPlotData() { std::ofstream csv; - for (unsigned int i(0); i < theFactoryPt->abstractSARPerformancePt->theSAR.size(); i++) { + for (unsigned int i(0); i < abstractSARPerformancePt->theSAR.size(); i++) { std::stringstream Number; Number << i; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_SAR_Mass" + Number.str() + ".csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_SAR_Mass" + Number.str() + ".csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << csvDataFile + " could not be opened!" <<std::endl; @@ -572,14 +756,14 @@ void performance_assessment_output::generateSARPlotData() { } else { csv << "# " + csvDataFile <<std::endl; // Adjust data structure: - csv << "# (1) Mach; (2) Gross Mass [kg]; (3) Altitude [ft]; (4) SAR [km/kg]" <<std::endl; - for (unsigned int j(0); j < theFactoryPt->abstractSARPerformancePt->theSAR.at(i).tabSAR.size(); j++) { - //csv << "# " << floor(myPerfPt->theSAR.at(i).Mass/1000)*1000 << " kg, " << floor(3.2808 * myPerfPt->theSAR.at(i).tabSAR.at(j).Altitude/100)*100<<std::endl; - for (unsigned int n(0); n < theFactoryPt->abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).Mach.size(); n++) { - csv << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).Mach.at(n) << "; "; - csv << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).Mass << "; "; - csv << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).Altitude / 0.3048 << "; "; - csv << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).SAR.at(n) / 1000. <<std::endl; + csv << "# (1) Mach; (2) Gross Mass [kg]; (3) Altitude [m]; (4) SAR [m/kg]" <<std::endl; + for (unsigned int j(0); j < abstractSARPerformancePt->theSAR.at(i).tabSAR.size(); j++) { + // csv << "# " << floor(myPerfPt->theSAR.at(i).Mass/1000)*1000 << " kg, " << floor(3.2808 * myPerfPt->theSAR.at(i).tabSAR.at(j).Altitude/100)*100<<std::endl; + for (unsigned int n(0); n < abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).Mach.size(); n++) { + csv << abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).Mach.at(n) << "; "; + csv << abstractSARPerformancePt->theSAR.at(i).Mass << "; "; + csv << abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).Altitude << "; "; + csv << abstractSARPerformancePt->theSAR.at(i).tabSAR.at(j).SAR.at(n) <<std::endl; } csv <<std::endl; csv <<std::endl; @@ -591,7 +775,7 @@ void performance_assessment_output::generateSARPlotData() { void performance_assessment_output::generateBestSARAltPlotData() { // TODO(franz#1#): kathi (18.11.2013): Plot seltsam -> reparieren std::ofstream plot; - string plotDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_bestSAR.csv"); + string plotDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_bestSAR.csv"); plot.open(plotDataFile.c_str()); if (!plot) { myRuntimeInfo->err << string(theProgramName) + "_bestSAR.csv could not be opened!" << std::endl; @@ -599,39 +783,39 @@ void performance_assessment_output::generateBestSARAltPlotData() { } else { plot << "# " + string(theProgramName) + "_bestSAR.csv" << std::endl; // Adjust data structure: - plot << "# (1) Mach; (2) Gross Mass [kg]; (3) Opt. Altitude [ft]; (4) Opt. SAR [km/kg]" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractSARPerformancePt->theSAR.size() - 1; i++) { - plot << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).bestSARMach << "; "; - plot << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).Mass << "; "; - plot << 3.2808 * theFactoryPt->abstractSARPerformancePt->theSAR.at(i).bestSARAlt << "; "; - plot << theFactoryPt->abstractSARPerformancePt->theSAR.at(i).bestSAR / 1000. << std::endl; + plot << "# (1) Mach; (2) Gross Mass [kg]; (3) Opt. Altitude [m]; (4) Opt. SAR [m/kg]" << std::endl; + for (unsigned int i(0); i <= abstractSARPerformancePt->theSAR.size() - 1; i++) { + plot << abstractSARPerformancePt->theSAR.at(i).bestSARMach << "; "; + plot << abstractSARPerformancePt->theSAR.at(i).Mass << "; "; + plot << 3.2808 * abstractSARPerformancePt->theSAR.at(i).bestSARAlt << "; "; + plot << abstractSARPerformancePt->theSAR.at(i).bestSAR << std::endl; } plot.close(); } } void performance_assessment_output::generateTOFLPlotData() { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_TOFL.csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_TOFL.csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << string(theProgramName) + "_TOFL.csv could not be opened!" << std::endl; exit(1); } else { csv << "# " + string(theProgramName) + "_TOFL.csv" << std::endl; - csv << "# (1) Altitude [ft]; (2) Gross Mass [kg]; (3) TODR_AEO [m]" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.size() - 1; i++) { - for (unsigned int j(0); j <= theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(i).myTOFL.size() - 1; j++) { - csv << theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(i).elevation * 1. / 0.3048 << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(i).myTOFL.at(j).grossMass << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(i).myTOFL.at(j).TODR_AEO << std::endl; + csv << "# (1) Altitude [m]; (2) Gross Mass [kg]; (3) TODR_AEO [m]" << std::endl; + for (unsigned int i(0); i <= abstractTakeOffPerformancePt->myTOFLField.size() - 1; i++) { + for (unsigned int j(0); j <= abstractTakeOffPerformancePt->myTOFLField.at(i).myTOFL.size() - 1; j++) { + csv << abstractTakeOffPerformancePt->myTOFLField.at(i).elevation * 1. / 0.3048 << "; "; + csv << abstractTakeOffPerformancePt->myTOFLField.at(i).myTOFL.at(j).grossMass << "; "; + csv << abstractTakeOffPerformancePt->myTOFLField.at(i).myTOFL.at(j).TODR_AEO << std::endl; } csv << std::endl; csv << std::endl; } // display TOFL - csv << theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(0).elevation * 1. / 0.3048 << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().grossMass << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().TODR_AEO << std::endl; + csv << abstractTakeOffPerformancePt->myTOFLField.at(0).elevation << "; "; + csv << abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().grossMass << "; "; + csv << abstractTakeOffPerformancePt->myTOFLField.at(0).myTOFL.back().TODR_AEO << std::endl; csv << std::endl; csv << std::endl; // Req TOFL @@ -643,48 +827,48 @@ std::ofstream csv; } void performance_assessment_output::generateBLFLPlotData() { std::ofstream csv; - string csvDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_BLFL.csv"); + string csvDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_BLFL.csv"); csv.open(csvDataFile.c_str()); if (!csv) { myRuntimeInfo->err << string(theProgramName) + "_BLFL.csv could not be opened!" << std::endl; exit(1); } else { csv << "# " + string(theProgramName) + "_BLFL.csv" << std::endl; - csv << "# (1) Altitude [ft]; (2) Gross Mass [kg]; (3) TODR_AEO [m]; (4) TODR_OEI [m]; (5) ASDR_OEI [m]; (6) v1 [m/s]" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->abstractTakeOffPerformancePt->myBLFL.vEF.size() - 1; i++) { + csv << "# (1) Altitude [m]; (2) Gross Mass [kg]; (3) TODR_AEO [m]; (4) TODR_OEI [m]; (5) ASDR_OEI [m]; (6) v1 [m/s]" << std::endl; + for (unsigned int i(0); i <= abstractTakeOffPerformancePt->myBLFL.vEF.size() - 1; i++) { csv << "0.0" << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myBLFL.grossMass << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myBLFL.TODR_AEO << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myBLFL.TODR_OEI.at(i) << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myBLFL.ASDR_OEI.at(i) << "; "; - csv << theFactoryPt->abstractTakeOffPerformancePt->myBLFL.vEF.at(i) << std::endl; + csv << abstractTakeOffPerformancePt->myBLFL.grossMass << "; "; + csv << abstractTakeOffPerformancePt->myBLFL.TODR_AEO << "; "; + csv << abstractTakeOffPerformancePt->myBLFL.TODR_OEI.at(i) << "; "; + csv << abstractTakeOffPerformancePt->myBLFL.ASDR_OEI.at(i) << "; "; + csv << abstractTakeOffPerformancePt->myBLFL.vEF.at(i) << std::endl; } csv.close(); } } void performance_assessment_output::generateLDNPlotData() { std::ofstream plot; - string plotDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_LDN.csv"); + string plotDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_LDN.csv"); plot.open(plotDataFile.c_str()); if (!plot) { myRuntimeInfo->err << string(theProgramName) + "_LDN.csv could not be opened!" << std::endl; exit(1); } else { - plot << "# " + theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_LDN.csv" << std::endl; - plot << "# (1) Altitude [ft]; (2) Gross Mass [kg]; (3) ALD_AEO [m]" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->theLandingPerformance->myLDNField.size() - 1; i++) { - for (unsigned int j(0); j <= theFactoryPt->theLandingPerformance->myLDNField.at(i).myLDN.size() - 1; j++) { - plot << theFactoryPt->theLandingPerformance->myLDNField.at(i).elevation * 1. / 0.3048 << "; "; - plot << theFactoryPt->theLandingPerformance->myLDNField.at(i).myLDN.at(j).grossMass << "; "; - plot << theFactoryPt->theLandingPerformance->myLDNField.at(i).myLDN.at(j).ALD_AEO << std::endl; + plot << "# " + mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_LDN.csv" << std::endl; + plot << "# (1) Altitude [m]; (2) Gross Mass [kg]; (3) ALD_AEO [m]" << std::endl; + for (unsigned int i(0); i <= abstractLandingPerformancePt->myLDNField.size() - 1; i++) { + for (unsigned int j(0); j <= abstractLandingPerformancePt->myLDNField.at(i).myLDN.size() - 1; j++) { + plot << abstractLandingPerformancePt->myLDNField.at(i).elevation << "; "; + plot << abstractLandingPerformancePt->myLDNField.at(i).myLDN.at(j).grossMass << "; "; + plot << abstractLandingPerformancePt->myLDNField.at(i).myLDN.at(j).ALD_AEO << std::endl; } plot << std::endl; plot << std::endl; } // display TOFL - plot << theFactoryPt->theLandingPerformance->myLDNField.at(0).elevation * 1. / 0.3048 << "; "; - plot << theFactoryPt->theLandingPerformance->myLDNField.at(0).myLDN.back().grossMass << "; "; - plot << theFactoryPt->theLandingPerformance->myLDNField.at(0).myLDN.back().ALD_AEO << std::endl; + plot << abstractLandingPerformancePt->myLDNField.at(0).elevation << "; "; + plot << abstractLandingPerformancePt->myLDNField.at(0).myLDN.back().grossMass << "; "; + plot << abstractLandingPerformancePt->myLDNField.at(0).myLDN.back().ALD_AEO << std::endl; plot << std::endl; plot << std::endl; // Req TOFL @@ -696,39 +880,74 @@ void performance_assessment_output::generateLDNPlotData() { } void performance_assessment_output::generateVnPlotData() { std::ofstream plot; - string plotDataFile(theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_VnDiagram.csv"); + string plotDataFile(mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_VnDiagram.csv"); plot.open(plotDataFile.c_str()); if (!plot) { myRuntimeInfo->err << string(theProgramName) + "_VnDiagram.csv could not be opened!" << std::endl; getchar(); exit(1); } else { - plot << "# " + theFactoryPt->mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_VnDiagram.csv" << std::endl; - plot << "# (1) v [kts]; (2) max n (pos.) [-]; (3) min n (neg.) [-]" << std::endl; + plot << "# " + mySettingsPt->rtIO->getCsvFilesDirTool() + theProgramName + "_VnDiagram.csv" << std::endl; + plot << "# (1) v [m]; (2) max n (pos.) [-]; (3) min n (neg.) [-]" << std::endl; plot << "#Clean configuration" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->theVnDiagram->myCleanDiagram.size() - 1; i++) { - plot << theFactoryPt->theVnDiagram->myCleanDiagram.at(i).speed << "; "; - plot << theFactoryPt->theVnDiagram->myCleanDiagram.at(i).n_upperBound << "; "; - plot << theFactoryPt->theVnDiagram->myCleanDiagram.at(i).n_lowerBound << std::endl; + for (unsigned int i(0); i <= abstractVnDiagramPt->myCleanDiagram.size() - 1; i++) { + plot << abstractVnDiagramPt->myCleanDiagram.at(i).speed << "; "; + plot << abstractVnDiagramPt->myCleanDiagram.at(i).n_upperBound << "; "; + plot << abstractVnDiagramPt->myCleanDiagram.at(i).n_lowerBound << std::endl; } plot << std::endl; plot << std::endl; plot << "#Takeoff configuration" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->theVnDiagram->myCleanDiagram.size() - 1; i++) { - plot << theFactoryPt->theVnDiagram->myTakeoffDiagram.at(i).speed << "; "; - plot << theFactoryPt->theVnDiagram->myTakeoffDiagram.at(i).n_upperBound << "; "; - plot << theFactoryPt->theVnDiagram->myTakeoffDiagram.at(i).n_lowerBound << std::endl; + for (unsigned int i(0); i <= abstractVnDiagramPt->myCleanDiagram.size() - 1; i++) { + plot << abstractVnDiagramPt->myTakeoffDiagram.at(i).speed << "; "; + plot << abstractVnDiagramPt->myTakeoffDiagram.at(i).n_upperBound << "; "; + plot << abstractVnDiagramPt->myTakeoffDiagram.at(i).n_lowerBound << std::endl; } plot << std::endl; plot << std::endl; plot << "#Landing configuration" << std::endl; - for (unsigned int i(0); i <= theFactoryPt->theVnDiagram->myCleanDiagram.size() - 1; i++) { - plot << theFactoryPt->theVnDiagram->myLandingDiagram.at(i).speed << "; "; - plot << theFactoryPt->theVnDiagram->myLandingDiagram.at(i).n_upperBound << "; "; - plot << theFactoryPt->theVnDiagram->myLandingDiagram.at(i).n_lowerBound << std::endl; + for (unsigned int i(0); i <= abstractVnDiagramPt->myCleanDiagram.size() - 1; i++) { + plot << abstractVnDiagramPt->myLandingDiagram.at(i).speed << "; "; + plot << abstractVnDiagramPt->myLandingDiagram.at(i).n_upperBound << "; "; + plot << abstractVnDiagramPt->myLandingDiagram.at(i).n_lowerBound << std::endl; } plot.close(); } +} + +void performance_assessment_output::generatePlots() { +// generate_plot_mission(); +// generate_plot_payload_range(); +// generate_plot_engine_performance_plot_script(); +// generate_plot_flight_envelope(); +// generate_plot_SAR(); +// generate_plot_takeoff_field_length(); +// generate_plot_balanced_field_length(); +// generate_plot_landing_performance(); +// generate_plot_Vn(); + +} + +void performance_assessment_output::generate_plot_mission() { + matplot::figure_handle fig = matplot::figure(true); + matplot::axes_handle ax = fig->current_axes(); + // (...) } + +void performance_assessment_output::generate_plot_payload_range() { + matplot::figure_handle fig = matplot::figure(true); + matplot::axes_handle ax = fig->current_axes(); + // Payload-range diagram + matplot::plot(abstractPayloadRangePt->Range, abstractPayloadRangePt->Payload); + matplot::title("Payload Range Diagram "); + ax->xlabel("Range [m]"); + ax->ylabel("Payload [kg]"); + // Design point + matplot::hold(matplot::on); + // matplot::plot() + // (...) + std::string plot_file_path = rtIO->getPlotDir() + "/" + std::string(TOOL_NAME) + "_payload_range.svg"; + matplot::save(plot_file_path); +} \ No newline at end of file diff --git a/performance_assessment/src/taw/defaultMethods/performance_assessment_output.h b/performance_assessment/src/taw/defaultMethods/performance_assessment_output.h index 6a00b2ad8b59af3c2748d362f7cd13528d51c95f..6455818e396ce5d098b12c66053c879ec785a860 100644 --- a/performance_assessment/src/taw/defaultMethods/performance_assessment_output.h +++ b/performance_assessment/src/taw/defaultMethods/performance_assessment_output.h @@ -19,21 +19,49 @@ #include <moduleBasics/report.h> #include <moduleBasics/module.h> +#include <matplot/matplot.h> +#include <moduleBasics/plot.h> #include <string> #include <memory> +#include "../../toolinfo.h" + namespace taw { class performance_assessment_factory; } class performance_assessment_output { public: - performance_assessment_output(std::shared_ptr<taw::performance_assessment_factory> aFactoryPt, std::shared_ptr<aircraft> anAcftPt); + performance_assessment_output( + std::shared_ptr<abstractFuelPlanning> abstractFuelPlanningPt, + std::shared_ptr<abstractOptimizeMissionProfile> abstractOptimizeMissionProfilePt, + std::shared_ptr<abstractPayloadRange> abstractPayloadRangePt, + std::shared_ptr<abstractEnginePerformance> abstractEnginePerformancePt, + std::shared_ptr<abstractCeilingPerformance> abstractCeilingPerformancePt, + std::shared_ptr<abstractFlightEnvelopes> abstractFlightEnvelopesPt, + std::shared_ptr<abstractSARPerformance> abstractSARPerformancePt, + std::shared_ptr<abstractTakeOffPerformance> abstractTakeOffPerformancePt, + std::shared_ptr<abstractLandingPerformance> abstractLandingPerformancePt, + std::shared_ptr<abstractVnDiagram> abstractVnDiagramPt, + std::shared_ptr<aircraft> anAcftPt); ~performance_assessment_output(); - std::shared_ptr<taw::performance_assessment_factory> theFactoryPt; - std::shared_ptr<aircraft> myAcftPt; + const std::shared_ptr<aircraft> myAcftPt; + const std::shared_ptr<performance_assessment_settings> mySettingsPt; + const std::shared_ptr<RuntimeIO>& rtIO; + + std::shared_ptr<abstractFuelPlanning> abstractFuelPlanningPt; + std::shared_ptr<abstractOptimizeMissionProfile> abstractOptimizeMissionProfilePt; + std::shared_ptr<abstractPayloadRange> abstractPayloadRangePt; + std::shared_ptr<abstractEnginePerformance> abstractEnginePerformancePt; + std::shared_ptr<abstractCeilingPerformance> abstractCeilingPerformancePt; + std::shared_ptr<abstractFlightEnvelopes> abstractFlightEnvelopesPt; + std::shared_ptr<abstractSARPerformance> abstractSARPerformancePt; + std::shared_ptr<abstractTakeOffPerformance> abstractTakeOffPerformancePt; + std::shared_ptr<abstractLandingPerformance> abstractLandingPerformancePt; + std::shared_ptr<abstractVnDiagram> abstractVnDiagramPt; + Report theReport; std::string theProgramName; @@ -57,30 +85,30 @@ class performance_assessment_output { */ void generatePlotDataMission(); - /** \brief Generate Plots scripts + /** \brief Generate all relevant Plots * \return void */ - void generatePlotScripts(); + void generatePlots(); - /** \brief Set the settings for the mission data plot + /** \brief Generate mission data plot */ - void generatePlotScriptDataMission(); + void generate_plot_mission(); /** \brief Generate the payload-range diagram */ void generatePlotDataPayloadRange(); - /** \brief Set the settings for the payload-range diagram + /** \brief Generate payload-range diagram */ - void generatePlotScriptPayloadRange(); + void generate_plot_payload_range(); /** \brief Generate the plot of the engine performance */ void generateEnginePerformanceData(); - /** \brief Set the settings for the engine performance plot - */ - void generateEnginePerformancePlotScript(); + // /** \brief Set the settings for the engine performance plot + // */ + // void generateEnginePerformancePlotScript(); /** \brief Generate the plot of the aircraft ceiling */ @@ -90,9 +118,9 @@ class performance_assessment_output { */ void generateFlightEnvelopeData(); - /** \brief Set the settings of the flight envelope plot - */ - void generateFlightEnvelopePlotScript(); + // /** \brief Set the settings of the flight envelope plot + // */ + // void generateFlightEnvelopePlotScript(); /** \brief Generate the specific air range plot */ @@ -102,45 +130,45 @@ class performance_assessment_output { */ void generateBestSARAltPlotData(); - /** \brief Set the settings for the specific air range plot - */ - void generateSARPlotScript(); + // /** \brief Set the settings for the specific air range plot + // */ + // void generateSARPlotScript(); - /** \brief Set the settings for the optimum specific air range plot - */ - void generateBestSARPlotScript(); + // /** \brief Set the settings for the optimum specific air range plot + // */ + // void generateBestSARPlotScript(); /** \brief Generate the plot of the take-off field length */ void generateTOFLPlotData(); - /** \brief Set the settings for the take-off field length plot - */ - void generateTOFLPlotScript(); + // /** \brief Set the settings for the take-off field length plot + // */ + // void generateTOFLPlotScript(); /** \brief Generate the plot of the balanced field length */ void generateBLFLPlotData(); - /** \brief Set the settings of the balanced field length plot - */ - void generateBLFLPlotScript(); + // /** \brief Set the settings of the balanced field length plot + // */ + // void generateBLFLPlotScript(); /** \brief Generate the plot for the landing field length */ void generateLDNPlotData(); - /** \brief Set the settings of the landing field length plot - */ - void generateLDNPlotScript(); + // /** \brief Set the settings of the landing field length plot + // */ + // void generateLDNPlotScript(); /** \brief Generate the V-n diagram */ void generateVnPlotData(); - /** \brief Set the settings of the V-n diagram - */ - void generateVnPlotScript(); + // /** \brief Set the settings of the V-n diagram + // */ + // void generateVnPlotScript(); }; diff --git a/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.cpp b/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.cpp index ad45e2fe90efa784084de9ae67d2fb6d720fc032..1c4d728e2b1cdfb507fa8698baf0675087f666ab 100644 --- a/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.cpp +++ b/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.cpp @@ -48,31 +48,25 @@ performance_assessment_settings::performance_assessment_settings(const std::shar enginePerformance.Rating.push_back(tempRating); } /* Switch for Performance Checks */ - mySwitches.doPayloadRange = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/payload_range_diagram/switch"); - mySwitches.doEnginePerformance = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/engine_performance/switch"); - mySwitches.doFlightEnvelopePerformance = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/flight_envelope_performance/switch"); - mySwitches.overwriteInitialValues = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/flight_envelope_performance/overwrite_initial_values"); - mySwitches.doClimbPerformance = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/climb_performance/switch"); - mySwitches.doTOPerformance = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/to_performance/switch"); + mySwitches.doPayloadRange = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/payload_range_diagram/switch")); + mySwitches.doEnginePerformance = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/engine_performance/switch")); + mySwitches.doFlightEnvelopePerformance = static_cast<bool>(rtIO->moduleConfig.at( + "/module_configuration_file/program_settings/performance_checks/flight_envelope_performance/switch")); + mySwitches.overwriteInitialValues = static_cast<bool>(rtIO->moduleConfig.at( + "/module_configuration_file/program_settings/performance_checks/flight_envelope_performance/overwrite_initial_values")); + mySwitches.doClimbPerformance = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/climb_performance/switch")); + mySwitches.doTOPerformance = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/takeoff_performance/switch")); if (mySwitches.doTOPerformance) { - mySwitches.doBLFLPerformance = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/to_performance/calculate_blfl_performance"); + mySwitches.doBLFLPerformance = static_cast<bool>(rtIO->moduleConfig.at( + "/module_configuration_file/program_settings/performance_checks/takeoff_performance/calculate_blfl_performance")); } else { mySwitches.doBLFLPerformance = false; } - mySwitches.doLandingPerformance = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/landing_performance/switch"); - mySwitches.doVnDiagram = rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/vn_diagram/switch"); - mySwitches.doFuelPlanning = rtIO->moduleConfig.at("/module_configuration_file/program_settings/fuel_planning/switch"); + mySwitches.doLandingPerformance = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/landing_performance/switch")); + mySwitches.doVnDiagram = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/performance_checks/vn_diagram/switch")); + mySwitches.doFuelPlanning = static_cast<bool>(rtIO->moduleConfig.at("/module_configuration_file/program_settings/fuel_planning/switch")); /* Fuel Planning */ myFuelPlan.contingencyFuel = EndnodeReadOnly<double>("/module_configuration_file/program_settings/fuel_planning/contingency_fuel").read(rtIO->moduleConfig).value(); - - /* Area 51 */ - node& polarXML = aixml::openDocument(rtIO->getIODir() + "/aeroData/" + rtIO->acxml.at("/aircraft_exchange_file/analysis/aerodynamics/polar/polar_file/value")); - std::string missionxmlPath = rtIO->acxml.at("/aircraft_exchange_file/requirements_and_specifications/mission_files/design_mission_file/value"); - std::string missionString = rtIO->getIODir() + "/missionData/" + rtIO->acxml.at( - "/aircraft_exchange_file/requirements_and_specifications/mission_files/design_mission_file/value"); - node& missionXMLnode = aixml::openDocument(missionString); - // std::string aaa = static_cast<std::string>(rtIO->acxml.at("/aircraft_exchange_file/requirements_and_specifications/mission_files/study_mission_file/value")); - // node& missionXMLtest = aixml::openDocument(aaa); } void performance_assessment_settings::checkForValidity(double Value, double lowerBound, double upperBound, const string &Text) { @@ -102,4 +96,4 @@ void performance_assessment_settings::checkForValidity(double Value, double lowe } performance_assessment_settings::~performance_assessment_settings() { -} \ No newline at end of file +} diff --git a/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.h b/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.h index c3d8f0c2a45086ec056a9da8046974d91a533c5e..0e96d27e563c62d0ac77ac952865800d888fe123 100644 --- a/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.h +++ b/performance_assessment/src/taw/defaultMethods/performance_assessment_settings.h @@ -21,7 +21,6 @@ #include <vector> #include <string> #include <memory> -#include <standardFiles/settings.h> using std::vector; using std::string; diff --git a/performance_assessment/src/taw/defaultMethods/takeOffPerformance/low_fidelity/takeOffPerformance.cpp b/performance_assessment/src/taw/defaultMethods/takeOffPerformance/low_fidelity/takeOffPerformance.cpp index f57d6b470807ac91b00e84a561751ec9579aaf2f..8ecbb2b8318e2ea86004da3b98d7fdec184e9b8b 100644 --- a/performance_assessment/src/taw/defaultMethods/takeOffPerformance/low_fidelity/takeOffPerformance.cpp +++ b/performance_assessment/src/taw/defaultMethods/takeOffPerformance/low_fidelity/takeOffPerformance.cpp @@ -49,9 +49,9 @@ void takeOffPerformance::doTakeOffPerformance(double theRunwaySlope, double theG windSpeed = theHeadWind; myRuntimeInfo->out << " ... Calculation of TOFL_AEO" << endl; /* Calculation of TOFL performance as a function of mass and height */ - for (double elevation(0.0); elevation <= 12000.; elevation += 2000.) { + for (double elevation(0.0); elevation <= convertUnit(FOOT, METER, 12000.); convertUnit(FOOT, METER, elevation += 2000.)) { myTOFLField.push_back(dataElevationTOFL()); - myTOFLField.back().elevation = convertUnit(FOOT, METER, elevation); + myTOFLField.back().elevation = elevation; for (int i(0); i <= 10; i++) { myTOFLField.back().myTOFL.push_back(dataTOFL()); myTOFLField.back().myTOFL.back().grossMass = theAcftPt->OME + static_cast<double>(i) / 10. * (theAcftPt->MTOM - theAcftPt->OME); @@ -69,7 +69,7 @@ void takeOffPerformance::doTakeOffPerformance(double theRunwaySlope, double theG void takeOffPerformance::calcTODR_AEO(double acMass, double Altitude) { tempTODR = 0.0; tempTime = 0.0; - calcGroundRun(theAcftPt->MTOM, 0.0, 0., theAcftPt->vLOF(acMass, Altitude) - windSpeed, &tempTODR, &tempTime, false); // Ground run until V_LOF + calcGroundRun(theAcftPt->MTOM, 0.0, 0., theAcftPt->vLOF(acMass, Altitude) - windSpeed, &tempTODR, &tempTime, false); // Ground run until V_LOF calcDistanceToScreenHeight(acMass, Altitude, &tempTODR, &tempTime, false); // Climb until screen height: 35 ft tempTODR = 1.15 * tempTODR; } @@ -153,20 +153,19 @@ void takeOffPerformance::calcGroundRun(double mass, double alt, double V0, doubl double takeOffPerformance::calcAccelerationGroundRoll(double mass, double alt, double Velocity, bool OEI) { double Mach = Velocity / theAcftPt->atm.getSpeedOfSound(alt); - theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_takeoff, alt, Mach, theAcftPt->atm, 1.0, "TO", theAcftPt->myMission.bleedOffTO, - theAcftPt->myMission.shaftOffTO); + theAcftPt->myEngines.calculate_N1_with_penalties(theAcftPt->myEnergyProviders.energyCarrierID_takeoff, alt, Mach, theAcftPt->atm, 1.0, "takeoff", + theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO); double tempDrag(0.0); double tempLift(0.0); double tempThrust(theAcftPt->myEngines.get_thrust_aircraft(theAcftPt->myEnergyProviders.energyCarrierID_takeoff)); - tempDrag = theAcftPt->aero.getCLDrag(Mach, alt, theAcftPt->aero.CLgroundRoll, "TakeOff", theAcftPt->atm); + tempDrag = theAcftPt->aero.getCLDrag(Mach, alt, theAcftPt->aero.CLgroundRoll, "takeoff", theAcftPt->atm); tempLift = theAcftPt->aero.CLgroundRoll * theAcftPt->S_Wing * 0.5 * theAcftPt->atm.getDensity(alt) * pow(Velocity, 2); if (OEI == true) { tempThrust = tempThrust * static_cast<double>(theAcftPt->numberEngines - 1) / static_cast<double>(theAcftPt->numberEngines); - tempDrag = tempDrag + theAcftPt->calcWindMillingDrag(Mach, alt); + tempDrag = tempDrag + theAcftPt->calcWindMillingDrag(0, 0, Mach, alt); } - return 1.0 / mass * (convertUnit(KILO, NEWTON, NEWTON, tempThrust) - - mass * G_FORCE * (runwayFriction + sin(runwaySlopeAngle)) + return 1.0 / mass * ( tempThrust - mass * G_FORCE * (runwayFriction + sin(runwaySlopeAngle)) - (tempDrag - runwayFriction * tempLift)); } @@ -175,9 +174,8 @@ double takeOffPerformance::calcDeAccelerationGroundRoll(double mass, double alt, double tempThrust(0.0); double tempLift(0.0); double tempDrag(0.0); - tempDrag = theAcftPt->aero.getCLDrag(Mach, alt, theAcftPt->aero.CLgroundRoll, "TakeOff", theAcftPt->atm); - return 1.0 / mass * (convertUnit(KILO, NEWTON, NEWTON, tempThrust) - - mass * G_FORCE * (brakingFriction + sin(runwaySlopeAngle)) + tempDrag = theAcftPt->aero.getCLDrag(Mach, alt, theAcftPt->aero.CLgroundRoll, "takeoff", theAcftPt->atm); + return 1.0 / mass * (tempThrust - mass * G_FORCE * (brakingFriction + sin(runwaySlopeAngle)) - (tempDrag - brakingFriction * tempLift)); } @@ -191,12 +189,12 @@ void takeOffPerformance::calcDistanceToScreenHeight(double mass, double alt, dou if (OEI == true) { fACC = (tempTAS / G_FORCE) * ((theAcftPt->v2(mass, alt + convertUnit(FOOT, METER, 35.)) - theAcftPt->vLOF(mass, alt)) / convertUnit(FOOT, METER, 35.)); tempROC = theAcftPt->ROC(mass, tempAlt, tempMach, fACC, - "TakeOff", "TO", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); + "takeoff", "takeoff", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); } else { fACC = (tempTAS / G_FORCE) * ((theAcftPt->v2(mass, alt + convertUnit(FOOT, METER, 35.)) + convertUnit(KNOTS, METERPERSECOND, 10.) - theAcftPt->vLOF(mass, alt)) / convertUnit(FOOT, METER, 35.)); tempROC = theAcftPt->ROC(mass, tempAlt, tempMach, fACC, - "TakeOff", "TO", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, false, theAcftPt->aero); + "takeoff", "takeoff", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, false, theAcftPt->aero); } if (tempROC <= 0.) { myRuntimeInfo->err << "No climbing ability to reach Screen Height!" << endl; @@ -212,7 +210,7 @@ void takeOffPerformance::calcDistanceToScreenHeight(double mass, double alt, dou bool takeOffPerformance::checkForTOFLReq() { bool Check(false); if (myTOFLField.at(0).myTOFL.back().TODR_AEO > theAcftPt->myReqs.TOFL) { - myRuntimeInfo->out << "The requirement regarding TOFL cannot be maintained.!" << endl; + myRuntimeInfo->out << "The required TOFL cannot be maintained!" << endl; myRuntimeInfo->out << "TOFL_req = " << theAcftPt->myReqs.TOFL << " m" << endl; myRuntimeInfo->out << "TOFL_calculated = " << myTOFLField.at(0).myTOFL.back().TODR_AEO << " m" << endl; Check = false; @@ -232,7 +230,7 @@ bool takeOffPerformance::checkForSecondSegment() { double tempTAS = theAcftPt->v2(theAcftPt->MTOM, tempAlt.at(i)); double tempMach = tempTAS / theAcftPt->atm.getSpeedOfSound(tempAlt.at(i)); double tempROC = theAcftPt->ROC(theAcftPt->MTOM, tempAlt.at(i), tempMach, 0.0, - "Climb", "TO", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); + "climb", "takeoff", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); if (tempClimbGradient > tempROC / tempTAS * 100.) { tempClimbGradient = tempROC / tempTAS * 100.; } @@ -266,7 +264,7 @@ bool takeOffPerformance::checkForFinalSegment() { // * fabs(theAcftPt->v2(theAcftPt->MTOM, tempAlt.at(i))-theAcftPt->vFTO(theAcftPt->MTOM, tempAlt.at(i)))/(1100.*0.3048); double tempMach = tempTAS / theAcftPt->atm.getSpeedOfSound(tempAlt.at(i)); double tempROC = theAcftPt->ROC(theAcftPt->MTOM, tempAlt.at(i), tempMach, 0.0, - "Climb", "TO", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); + "climb", "takeoff", theAcftPt->myMission.bleedOffTO, theAcftPt->myMission.shaftOffTO, true, theAcftPt->aero); if (tempClimbGradient > tempROC / tempTAS * 100.) { tempClimbGradient = 100. * tempROC / tempTAS; }