diff --git a/Manifest-v1.11.toml.default b/Manifest-v1.11.toml.default index 076203da..461b3127 100644 --- a/Manifest-v1.11.toml.default +++ b/Manifest-v1.11.toml.default @@ -1,13 +1,13 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.11.4" +julia_version = "1.11.6" manifest_format = "2.0" -project_hash = "8aabd59bb81f00c0149c8b45c84ed6c3038dd1c6" +project_hash = "af9326657e0997d9341c6ceac49c14579de5e965" [[deps.ADTypes]] -git-tree-sha1 = "e2478490447631aedba0823d4d7a80b2cc8cdb32" +git-tree-sha1 = "7927b9af540ee964cc5d1b73293f1eb0b761a3a1" uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" -version = "1.14.0" +version = "1.16.0" weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] [deps.ADTypes.extensions] @@ -41,9 +41,9 @@ version = "0.1.42" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "cd8b948862abee8f3d3e9b73a102a9ca924debb0" +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.2.0" +version = "4.3.0" weakdeps = ["SparseArrays", "StaticArrays"] [deps.Adapt.extensions] @@ -56,9 +56,9 @@ version = "1.1.2" [[deps.ArrayInterface]] deps = ["Adapt", "LinearAlgebra"] -git-tree-sha1 = "017fcb757f8e921fb44ee063a7aafe5f89b86dd1" +git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.18.0" +version = "7.19.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" @@ -87,10 +87,10 @@ version = "7.18.0" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" [[deps.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra"] -git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +deps = ["FillArrays", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "120e392af69350960b1d3b89d41dcc1d66543858" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "1.11.1" +version = "1.11.2" weakdeps = ["SparseArrays"] [deps.ArrayLayouts.extensions] @@ -118,12 +118,13 @@ version = "0.1.6" [[deps.BracketingNonlinearSolve]] deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "95cb19c37ea427617e9795655667712f03058d98" +git-tree-sha1 = "a9014924595b7a2c1dd14aac516e38fa10ada656" uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e" -version = "1.1.0" -weakdeps = ["ForwardDiff"] +version = "1.3.0" +weakdeps = ["ChainRulesCore", "ForwardDiff"] [deps.BracketingNonlinearSolve.extensions] + BracketingNonlinearSolveChainRulesCoreExt = ["ChainRulesCore", "ForwardDiff"] BracketingNonlinearSolveForwardDiffExt = "ForwardDiff" [[deps.CPUSummary]] @@ -134,9 +135,9 @@ version = "0.2.6" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +git-tree-sha1 = "06ee8d1aa558d2833aa799f6f0b31b30cada405f" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.25.1" +version = "1.25.2" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] @@ -150,9 +151,9 @@ version = "0.1.13" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "c7acce7a7e1078a20a285211dd73cd3941a871d6" +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.12.0" +version = "0.12.1" [deps.ColorTypes.extensions] StyledStringsExt = "StyledStrings" @@ -162,9 +163,9 @@ version = "0.12.0" [[deps.Colors]] deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.13.0" +version = "0.13.1" [[deps.CommonSolve]] git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" @@ -184,9 +185,9 @@ version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +git-tree-sha1 = "0037835448781bb46feb39866934e243886d756a" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.16.0" +version = "4.18.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -212,9 +213,9 @@ uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" version = "0.2.3" [[deps.ConstructionBase]] -git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.8" +version = "1.6.0" [deps.ConstructionBase.extensions] ConstructionBaseIntervalSetsExt = "IntervalSets" @@ -232,16 +233,21 @@ git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" uuid = "adafc99b-e345-5852-983c-f28acb93d879" version = "0.3.1" +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" version = "1.16.0" [[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +deps = ["OrderedCollections"] +git-tree-sha1 = "76b3b7c3925d943edf158ddb7f693ba54eb297a5" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.20" +version = "0.19.0" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -266,10 +272,10 @@ uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" version = "1.9.1" [[deps.DiffEqBase]] -deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "TruncatedStacktraces"] -git-tree-sha1 = "615e8358608628b9768275f4bd8c237724e72f08" +deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] +git-tree-sha1 = "c1ae1a949a95ee1895e3b48e11982f102152c3aa" uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.164.2" +version = "6.182.0" [deps.DiffEqBase.extensions] DiffEqBaseCUDAExt = "CUDA" @@ -282,6 +288,7 @@ version = "6.164.2" DiffEqBaseMPIExt = "MPI" DiffEqBaseMeasurementsExt = "Measurements" DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseMooncakeExt = "Mooncake" DiffEqBaseReverseDiffExt = "ReverseDiff" DiffEqBaseSparseArraysExt = "SparseArrays" DiffEqBaseTrackerExt = "Tracker" @@ -298,6 +305,7 @@ version = "6.164.2" MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -317,9 +325,9 @@ version = "1.15.1" [[deps.DifferentiationInterface]] deps = ["ADTypes", "LinearAlgebra"] -git-tree-sha1 = "479214d2988a837e6d21ac38afdcb03cb2d0994e" +git-tree-sha1 = "c8d85ecfcbaef899308706bebdd8b00107f3fb43" uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" -version = "0.6.43" +version = "0.6.54" [deps.DifferentiationInterface.extensions] DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" @@ -329,11 +337,13 @@ version = "0.6.43" DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" DifferentiationInterfaceGTPSAExt = "GTPSA" DifferentiationInterfaceMooncakeExt = "Mooncake" - DifferentiationInterfacePolyesterForwardDiffExt = "PolyesterForwardDiff" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" DifferentiationInterfaceStaticArraysExt = "StaticArrays" DifferentiationInterfaceSymbolicsExt = "Symbolics" @@ -350,11 +360,13 @@ version = "0.6.43" FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" @@ -367,10 +379,9 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" version = "1.11.0" [[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.3" +version = "0.9.5" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] @@ -378,14 +389,14 @@ uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" version = "1.6.0" [[deps.EnumX]] -git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.4" +version = "1.0.5" [[deps.EnzymeCore]] -git-tree-sha1 = "0cdb7af5c39e92d78a0ee8d0a447d32f7593137e" +git-tree-sha1 = "8272a687bca7b5c601c0c24fc0c71bff10aafdfd" uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" -version = "0.8.8" +version = "0.8.12" weakdeps = ["Adapt"] [deps.EnzymeCore.extensions] @@ -413,15 +424,16 @@ uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" version = "0.3.2" [[deps.FastPower]] -git-tree-sha1 = "58c3431137131577a7c379d00fea00be524338fb" +git-tree-sha1 = "5f7afd4b1a3969dc34d692da2ed856047325b06e" uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" -version = "1.1.1" +version = "1.1.3" [deps.FastPower.extensions] FastPowerEnzymeExt = "Enzyme" FastPowerForwardDiffExt = "ForwardDiff" FastPowerMeasurementsExt = "Measurements" FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerMooncakeExt = "Mooncake" FastPowerReverseDiffExt = "ReverseDiff" FastPowerTrackerExt = "Tracker" @@ -430,6 +442,7 @@ version = "1.1.1" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -479,9 +492,9 @@ version = "0.8.5" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853" +git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.38" +version = "1.0.1" weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] @@ -516,9 +529,9 @@ version = "0.1.1" [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.0.4+0" +version = "2025.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -527,14 +540,16 @@ version = "1.11.0" [[deps.Interpolations]] deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +git-tree-sha1 = "f2905febca224eade352a573e129ef43aa593354" uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" +version = "0.16.1" [deps.Interpolations.extensions] + InterpolationsForwardDiffExt = "ForwardDiff" InterpolationsUnitfulExt = "Unitful" [deps.Interpolations.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.InverseFunctions]] @@ -562,9 +577,9 @@ version = "1.0.0" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.0" +version = "1.7.1" [[deps.Jieko]] deps = ["ExproniconLite"] @@ -574,9 +589,9 @@ version = "0.2.1" [[deps.Krylov]] deps = ["LinearAlgebra", "Printf", "SparseArrays"] -git-tree-sha1 = "b29d37ce30fa401a4563b18880ab91f979a29734" +git-tree-sha1 = "b94257a1a8737099ca40bc7271a8b374033473ed" uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" -version = "0.9.10" +version = "0.10.1" [[deps.LaTeXStrings]] git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" @@ -591,9 +606,9 @@ version = "0.1.17" [[deps.LazyArrays]] deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "SparseArrays"] -git-tree-sha1 = "866ce84b15e54d758c11946aacd4e5df0e60b7a3" +git-tree-sha1 = "76627adb8c542c6b73f68d4bfd0aa71c9893a079" uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" -version = "2.6.1" +version = "2.6.2" [deps.LazyArrays.extensions] LazyArraysBandedMatricesExt = "BandedMatrices" @@ -641,6 +656,12 @@ version = "1.11.0+1" uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" version = "1.11.0" +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + [[deps.LineSearch]] deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"] git-tree-sha1 = "97d502765cc5cf3a722120f50da03c2474efce04" @@ -660,18 +681,21 @@ version = "1.11.0" [[deps.LinearSolve]] deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] -git-tree-sha1 = "6e975dea0fc1825ef3bc83c11281fdf745a69a43" +git-tree-sha1 = "4a7614717945ce05d1693192f399e3b258c60636" uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -version = "3.4.0" +version = "3.25.1" [deps.LinearSolve.extensions] + LinearSolveBLISExt = ["blis_jll", "LAPACK_jll"] LinearSolveBandedMatricesExt = "BandedMatrices" LinearSolveBlockDiagonalsExt = "BlockDiagonals" LinearSolveCUDAExt = "CUDA" LinearSolveCUDSSExt = "CUDSS" + LinearSolveCUSOLVERRFExt = ["CUSOLVERRF", "SparseArrays"] LinearSolveEnzymeExt = "EnzymeCore" LinearSolveFastAlmostBandedMatricesExt = "FastAlmostBandedMatrices" LinearSolveFastLapackInterfaceExt = "FastLapackInterface" + LinearSolveForwardDiffExt = "ForwardDiff" LinearSolveHYPREExt = "HYPRE" LinearSolveIterativeSolversExt = "IterativeSolvers" LinearSolveKernelAbstractionsExt = "KernelAbstractions" @@ -687,18 +711,22 @@ version = "3.4.0" BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + CUSOLVERRF = "a8cc9031-bad2-4722-94f5-40deabb4245c" EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" + LAPACK_jll = "51474c39-65e3-53ba-86ba-03b1b862ec14" Metal = "dde4c033-4e86-420c-a63e-0dd931031962" Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" + blis_jll = "6136c539-28a5-5bf0-87cc-b183200dce32" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] @@ -722,14 +750,14 @@ version = "1.11.0" [[deps.MKL_jll]] deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.0.1+1" +version = "2025.2.0+0" [[deps.MacroTools]] -git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.15" +version = "0.5.16" [[deps.ManualMemory]] git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" @@ -767,9 +795,9 @@ version = "1.11.0" [[deps.Moshi]] deps = ["ExproniconLite", "Jieko"] -git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +git-tree-sha1 = "53f817d3e84537d84545e0ad749e483412dd6b2a" uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" -version = "0.3.5" +version = "0.3.7" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" @@ -782,9 +810,9 @@ version = "0.2.4" [[deps.NaNMath]] deps = ["OpenLibm_jll"] -git-tree-sha1 = "cc0a5deefdb12ab3a096f00a6d42133af4560d71" +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.1.2" +version = "1.1.3" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" @@ -792,9 +820,9 @@ version = "1.2.0" [[deps.NonlinearSolve]] deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseMatrixColorings", "StaticArraysCore", "SymbolicIndexingInterface"] -git-tree-sha1 = "95def4e218a6832d158feafb9963be0337ea432c" +git-tree-sha1 = "d2ec18c1e4eccbb70b64be2435fc3b06fbcdc0a1" uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "4.4.0" +version = "4.10.0" [deps.NonlinearSolve.extensions] NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" @@ -824,9 +852,9 @@ version = "4.4.0" [[deps.NonlinearSolveBase]] deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "Compat", "ConcreteStructs", "DifferentiationInterface", "EnzymeCore", "FastClosures", "LinearAlgebra", "Markdown", "MaybeInplace", "Preferences", "Printf", "RecursiveArrayTools", "SciMLBase", "SciMLJacobianOperators", "SciMLOperators", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"] -git-tree-sha1 = "8a2437b5ead050301b6a6258f226e5137e511000" +git-tree-sha1 = "1d42a315ba627ca0027d49d0efb44e3d88db24aa" uuid = "be0214bd-f91f-a760-ac4e-3421ce2b2da0" -version = "1.5.0" +version = "1.14.0" [deps.NonlinearSolveBase.extensions] NonlinearSolveBaseBandedMatricesExt = "BandedMatrices" @@ -848,15 +876,15 @@ version = "1.5.0" [[deps.NonlinearSolveFirstOrder]] deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLJacobianOperators", "Setfield", "StaticArraysCore"] -git-tree-sha1 = "aade7ab02ee4c80ec30dc8a2874fc67155c935f1" +git-tree-sha1 = "3f1198ae5cbf21e84b8251a9e62fa1f888f3e4cb" uuid = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d" -version = "1.3.0" +version = "1.7.0" [[deps.NonlinearSolveQuasiNewton]] deps = ["ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLOperators", "StaticArraysCore"] -git-tree-sha1 = "44a132cb32aeafcb35a6238fd91a2f3f8ff5c5b0" +git-tree-sha1 = "40dfaf1bf74f1f700f81d0002d4dd90999598eb2" uuid = "9a2c21bd-3a47-402d-9113-8faf9a0ee114" -version = "1.2.0" +version = "1.8.0" weakdeps = ["ForwardDiff"] [deps.NonlinearSolveQuasiNewton.extensions] @@ -864,18 +892,18 @@ weakdeps = ["ForwardDiff"] [[deps.NonlinearSolveSpectralMethods]] deps = ["CommonSolve", "ConcreteStructs", "DiffEqBase", "LineSearch", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "f28b1ab17b5f15eb2b174eaf8813cf17f0b3e6c0" +git-tree-sha1 = "84de5a469e119eb2c22ae07c543dc4e7f7001ee7" uuid = "26075421-4e9a-44e1-8bd1-420ed7ad02b2" -version = "1.1.0" +version = "1.3.0" weakdeps = ["ForwardDiff"] [deps.NonlinearSolveSpectralMethods.extensions] NonlinearSolveSpectralMethodsForwardDiffExt = "ForwardDiff" [[deps.OffsetArrays]] -git-tree-sha1 = "5e1897147d1ff8d98883cda2be2187dcf57d8f0c" +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.15.0" +version = "1.17.0" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -889,7 +917,7 @@ version = "0.3.27+1" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+4" +version = "0.8.5+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -898,9 +926,9 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.6+0" [[deps.OrderedCollections]] -git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.0" +version = "1.8.1" [[deps.Parameters]] deps = ["OrderedCollections", "UnPack"] @@ -921,9 +949,9 @@ version = "1.11.0" [[deps.Polyester]] deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" +git-tree-sha1 = "6f7cd22a802094d239824c57d94c8e2d0f7cfc7d" uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.16" +version = "0.7.18" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] @@ -931,6 +959,20 @@ git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" version = "0.2.2" +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "ForwardDiff"] +git-tree-sha1 = "2cc315bb7f6e4d59081bad744cdb911d6374fc7f" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.29" + + [deps.PreallocationTools.extensions] + PreallocationToolsReverseDiffExt = "ReverseDiff" + PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer" + + [deps.PreallocationTools.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + [[deps.PrecompileTools]] deps = ["Preferences"] git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" @@ -943,6 +985,12 @@ git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" uuid = "21216c6a-2e73-6563-6e65-726566657250" version = "1.4.3" +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" @@ -971,13 +1019,14 @@ version = "1.3.4" [[deps.RecursiveArrayTools]] deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] -git-tree-sha1 = "e96b644f7bfbf1015f8e42a7c7abfae2a48fafbf" +git-tree-sha1 = "f8726bd5a8b7f5f5d3f6c0ce4793454a599b5243" uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "3.31.0" +version = "3.36.0" [deps.RecursiveArrayTools.extensions] RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions" RecursiveArrayToolsMeasurementsExt = "Measurements" RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] @@ -989,6 +1038,7 @@ version = "3.31.0" [deps.RecursiveArrayTools.weakdeps] FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" @@ -1010,9 +1060,9 @@ version = "1.3.1" [[deps.RuntimeGeneratedFunctions]] deps = ["ExprTools", "SHA", "Serialization"] -git-tree-sha1 = "04c968137612c4a5629fa531334bb81ad5680f00" +git-tree-sha1 = "86a8a8b783481e1ea6b9c91dd949cb32191f8ab4" uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" -version = "0.5.13" +version = "0.5.15" [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" @@ -1024,10 +1074,10 @@ uuid = "94e857df-77ce-4151-89e5-788b33177be4" version = "0.1.0" [[deps.SciMLBase]] -deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] -git-tree-sha1 = "ee305515b0946db5f56af699e8b5804fee04146c" +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "c056c723b68700fec386dfde8c577089df720c8e" uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "2.75.1" +version = "2.108.0" [deps.SciMLBase.extensions] SciMLBaseChainRulesCoreExt = "ChainRulesCore" @@ -1037,7 +1087,7 @@ version = "2.75.1" SciMLBasePyCallExt = "PyCall" SciMLBasePythonCallExt = "PythonCall" SciMLBaseRCallExt = "RCall" - SciMLBaseZygoteExt = "Zygote" + SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] [deps.SciMLBase.weakdeps] ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" @@ -1052,15 +1102,15 @@ version = "2.75.1" [[deps.SciMLJacobianOperators]] deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DifferentiationInterface", "FastClosures", "LinearAlgebra", "SciMLBase", "SciMLOperators"] -git-tree-sha1 = "f66048bb969e67bd7d1bdd03cd0b81219642bbd0" +git-tree-sha1 = "3414071e3458f3065de7fa5aed55283b236b4907" uuid = "19f34311-ddf3-4b8b-af20-060888a46c0e" -version = "0.1.1" +version = "0.1.8" [[deps.SciMLOperators]] deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] -git-tree-sha1 = "6149620767866d4b0f0f7028639b6e661b6a1e44" +git-tree-sha1 = "7d3a1519dc4d433a6b20035eaff20bde8be77c66" uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" -version = "0.3.12" +version = "1.4.0" weakdeps = ["SparseArrays", "StaticArraysCore"] [deps.SciMLOperators.extensions] @@ -1090,9 +1140,9 @@ version = "1.11.0" [[deps.SimpleNonlinearSolve]] deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "Setfield", "StaticArraysCore"] -git-tree-sha1 = "a3868a6add9f5989d1f4bd21de0333ef89fb9d9f" +git-tree-sha1 = "09d986e27a606f172c5b6cffbd8b8b2f10bf1c75" uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" -version = "2.1.0" +version = "2.7.0" [deps.SimpleNonlinearSolve.extensions] SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" @@ -1116,20 +1166,26 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.11.0" [[deps.SparseMatrixColorings]] -deps = ["ADTypes", "DataStructures", "DocStringExtensions", "LinearAlgebra", "Random", "SparseArrays"] -git-tree-sha1 = "e0ae9189392572abe85bc9fd4ce35e772b1e1e10" +deps = ["ADTypes", "DocStringExtensions", "LinearAlgebra", "PrecompileTools", "Random", "SparseArrays"] +git-tree-sha1 = "9de43e0b9b976f1019bf7a879a686c4514520078" uuid = "0a514795-09f3-496d-8182-132a7b665d35" -version = "0.4.14" -weakdeps = ["Colors"] +version = "0.4.21" [deps.SparseMatrixColorings.extensions] + SparseMatrixColoringsCUDAExt = "CUDA" + SparseMatrixColoringsCliqueTreesExt = "CliqueTrees" SparseMatrixColoringsColorsExt = "Colors" + [deps.SparseMatrixColorings.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" +git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.5.0" +version = "2.5.1" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] @@ -1137,9 +1193,9 @@ weakdeps = ["ChainRulesCore"] [[deps.Static]] deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] -git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603" +git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "1.1.1" +version = "1.2.0" [[deps.StaticArrayInterface]] deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] @@ -1154,9 +1210,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +git-tree-sha1 = "cbea8a6bd7bed51b1619658dec70035e07b8502f" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.13" +version = "1.9.14" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1184,16 +1240,33 @@ git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" version = "0.5.7" +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructMapping]] +git-tree-sha1 = "42f7869cc68f9a83e33ce6a3e408c774900a37e3" +uuid = "7c3b921d-20d6-4eba-ad57-605525e86ab2" +version = "0.2.3" + [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" version = "7.7.0+0" [[deps.SymbolicIndexingInterface]] -deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] -git-tree-sha1 = "d6c04e26aa1c8f7d144e1a8c47f1c73d3013e289" +deps = ["Accessors", "ArrayInterface", "PrettyTables", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "59ca6eddaaa9849e7de9fd1153b6faf0b1db7b80" uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" -version = "0.3.38" +version = "0.3.42" [[deps.TOML]] deps = ["Dates"] @@ -1208,9 +1281,9 @@ version = "1.0.1" [[deps.Tables]] deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.12.0" +version = "1.12.1" [[deps.Tar]] deps = ["ArgTools", "SHA"] @@ -1219,21 +1292,21 @@ version = "1.10.0" [[deps.TestEnv]] deps = ["Pkg"] -git-tree-sha1 = "2a57e05cb9854e7260c354f1bcdbe5190adba19f" +git-tree-sha1 = "aec63ef091b11d67040b8b35d2dcdfdc4567c4d0" uuid = "1e6cf692-eddd-4d53-88a5-2d735e33781b" -version = "1.102.0" +version = "1.102.2" [[deps.ThreadingUtilities]] deps = ["ManualMemory"] -git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" -version = "0.5.2" +version = "0.5.5" [[deps.TimerOutputs]] deps = ["ExprTools", "Printf"] -git-tree-sha1 = "f57facfd1be61c42321765d3551b3df50f7e09f6" +git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0" uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.28" +version = "0.5.29" [deps.TimerOutputs.extensions] FlameGraphsExt = "FlameGraphs" @@ -1279,6 +1352,12 @@ git-tree-sha1 = "752ff27037088b747d3138c828ffc0968d2e7766" uuid = "19641d66-a62d-11e8-2441-8f57a969a9c4" version = "0.5.0" +[[deps.YAML]] +deps = ["Base64", "Dates", "Printf", "StringEncodings"] +git-tree-sha1 = "2f58ac39f64b41fb812340347525be3b590cce3b" +uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" +version = "0.4.14" + [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" diff --git a/NEWS.md b/NEWS.md index fdab2a30..fac78b4d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,35 @@ +## VortexStepMethod v2.0.1 2025-08-08 +### Changed +#### 1. Core New Functionality: YAML Geometry Support +- **New file:** `yaml_geometry.jl` (290+ lines) — Complete YAML-based wing geometry loading. +- **New structs:** `WingSectionData`, `WingAirfoilData`, `WingAirfoilInfo` (with `@with_kw` macros). +- **New function:** `load_polar_data()` — Robust CSV polar data loading with error handling. +- **New constructors:** + - `Wing(geometry_file::String)` — Create wings from YAML files. + - `Wing(settings::VSMSettings)` — Create wings from settings. + +#### 2. Enhanced Settings System +- Renamed `vs()` to `VSMSettings()` constructor. +- Added convenience `Solver(body_aero, settings)` constructor. +- Improved settings structure and validation. + +#### 3. Comprehensive Test Infrastructure +- **Split tests:** Reorganized from monolithic files to modular structure (`test/module_name/test_*.jl`). +- **New test module:** `yaml_geometry` with `test_load_polar_data.jl` and `test_wing_constructor.jl`. +- **Test utilities:** `test_data_utils.jl` with shared helper functions. +- **Test data:** Extensive YAML and CSV test files in `data`. + +#### 4. Data and Examples +- **New data sets:** Complete `TUDELFT_V3_KITE` with CFD polars and literature results. +- **Enhanced examples:** Updated examples to use YAML geometry (e.g., `pyramid_model.jl`, `V3_kite.jl`). +- **Real-world configs:** Production-ready YAML geometry files for various kite configurations. + +#### 5. Core Module Improvements +- **Path handling:** Robust file path resolution for relative/absolute paths. +- **Error handling:** Comprehensive validation and graceful fallback to INVISCID mode. +- **Memory management:** Improved file I/O and cleanup in tests. +- **Documentation:** Added comprehensive docstrings and examples. + ## VortexStepMethod v2.0.0 2025-07-11 ### Changed - bump Interpolations to 0.16 diff --git a/Project.toml b/Project.toml index df34eed9..7f2dd4db 100644 --- a/Project.toml +++ b/Project.toml @@ -23,6 +23,7 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +StructMapping = "7c3b921d-20d6-4eba-ad57-605525e86ab2" Timers = "21f18d07-b854-4dab-86f0-c15a3821819a" Xfoil = "19641d66-a62d-11e8-2441-8f57a969a9c4" YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" @@ -55,10 +56,12 @@ Parameters = "0.12" Pkg = "1" PreallocationTools = "0.4.25" PrecompileTools = "1.2.1" +Random = "1.10.0" SciMLBase = "2.77.0" Serialization = "1" StaticArrays = "1" Statistics = "1" +StructMapping = "0.2.3" Test = "1" Timers = "0.1" Xfoil = "0.5" @@ -72,7 +75,8 @@ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" ControlPlots = "23c2ee80-7a9e-4350-b264-8e670f12517c" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "DataFrames", "CSV", "Documenter", "BenchmarkTools", "ControlPlots", "Aqua"] +test = ["Test", "DataFrames", "CSV", "Documenter", "BenchmarkTools", "ControlPlots", "Aqua", "Random"] diff --git a/data/TUDELFT_V3_KITE/literature_results/CFD_RANS_Rey_10e5_Poland2025_alpha_sweep_beta_0.csv b/data/TUDELFT_V3_KITE/literature_results/CFD_RANS_Rey_10e5_Poland2025_alpha_sweep_beta_0.csv new file mode 100644 index 00000000..f619300f --- /dev/null +++ b/data/TUDELFT_V3_KITE/literature_results/CFD_RANS_Rey_10e5_Poland2025_alpha_sweep_beta_0.csv @@ -0,0 +1,9 @@ +alpha,beta,CL,CD,CS,CMy +1.02,0,0.2278625272194466,0.0490919571607997,-0.028991478200473,-0.0971304889257096 +4.02,0,0.4610104802890269,0.0516566817024969,-0.06116291297791359,-0.177995425157634 +7.02,0,0.6748642166054709,0.0643789856608573,-0.09170612013580448,-0.2399628564061313 +10.02,0,0.8685945393341531,0.0841781647387978,-0.12014981939630065,-0.2873743657009342 +13.02,0,1.042518829707241,0.1099699784207837,-0.14632493718395287,-0.3234126609849657 +15.02,0,1.147266423064987,0.1293063892392999,-0.16260131332214534,-0.3422906659660041 +17.02,0,1.248363457881334,0.1505397278170317,-0.17819835351371366,-0.3593648645427019 +19.02,0,1.340909392696446,0.172443901716702,-0.19275273990602687,-0.3729793258363525 diff --git a/data/TUDELFT_V3_KITE/literature_results/CFD_RANS_Rey_5e5_Poland2025_alpha_sweep_beta_0_NoStruts.csv b/data/TUDELFT_V3_KITE/literature_results/CFD_RANS_Rey_5e5_Poland2025_alpha_sweep_beta_0_NoStruts.csv new file mode 100644 index 00000000..eed0a9c8 --- /dev/null +++ b/data/TUDELFT_V3_KITE/literature_results/CFD_RANS_Rey_5e5_Poland2025_alpha_sweep_beta_0_NoStruts.csv @@ -0,0 +1,19 @@ +CL,CD,alpha,CS +-0.133333333,0.0728,-3.98,0 +-0.066666667,0.0672,-2.98,0 +0.073015873,0.0552,-0.98,0 +0.225396825,0.051,1.02,0 +0.384126984,0.052,3.02,0 +0.46031746,0.0536,4.02,0 +0.536507937,0.06,5.02,0 +0.673015873,0.07,7.02,0 +0.803174603,0.075,9.02,0 +0.873015873,0.085,10.02,0 +0.93015873,0.09,11.02,0 +1.041269841,0.115,13.02,0 +1.146031746,0.135,15.02,0 +1.24,0.151,17.02,0 +1.342857143,0.171,19.02,0 +0.88,0.31,21.02,0 +0.91,0.34,23.02,0 +0.93,0.38,25.02,0 diff --git a/data/TUDELFT_V3_KITE/literature_results/Python_VSM_Rey_5e5_Poland2025_alpha_sweep_beta_0.csv b/data/TUDELFT_V3_KITE/literature_results/Python_VSM_Rey_5e5_Poland2025_alpha_sweep_beta_0.csv new file mode 100644 index 00000000..65726bed --- /dev/null +++ b/data/TUDELFT_V3_KITE/literature_results/Python_VSM_Rey_5e5_Poland2025_alpha_sweep_beta_0.csv @@ -0,0 +1,39 @@ +alpha,CL,CD,CL/CD,CS +-12.0,-0.2382871512913027,0.10555351086138359,-2.2575009523295666,8.493387378390686e-14 +-11.0,-0.23078413996904473,0.10186112684362705,-2.265674326608765,6.616874649497016e-14 +-10.0,-0.22230140038021914,0.09806363640487119,-2.266909616347621,4.373272668096159e-14 +-9.0,-0.21585315982172304,0.0931590398953698,-2.317039334713575,2.739682786368477e-14 +-8.0,-0.20625706590216833,0.08814998331707347,-2.339842370250558,1.1046588689401156e-14 +-7.0,-0.1998343140258721,0.08290261953105998,-2.410470442987666,-2.389661935808156e-14 +-6.0,-0.18199775713691974,0.07765158375393942,-2.343773923705537,-3.872611350474041e-14 +-5.0,-0.14850648581010087,0.07109437185188841,-2.0888641666246923,-3.2393754503524565e-14 +-4.0,-0.10858858872468641,0.06522454108866148,-1.6648425103839215,-3.0271060429342046e-14 +-3.0,-0.06288342322853809,0.06000714503007155,-1.0479322620168838,-2.895668145826433e-14 +-2.0,-0.007429949914950523,0.055498453779690086,-0.13387670122207165,-3.2169539191587655e-14 +-1.0,0.05656004203302359,0.05159811771021331,1.0961648320327801,-3.44716398526909e-14 +0.0,0.12392449645064037,0.04839062569141725,2.5609194896733913,-3.597944298611074e-14 +1.0,0.19309362003485317,0.04593968204080192,4.203198878550238,-3.699581064093612e-14 +2.0,0.2625331911314792,0.044328371503610776,5.922464151657241,-3.6349856219703554e-14 +3.0,0.3323792213186091,0.04356996032047687,7.628632637574346,-3.6413469417385087e-14 +4.0,0.40297413442239444,0.04359394940688724,9.243808829092464,-3.773253515649088e-14 +5.0,0.4734826904404322,0.04438413803893367,10.667835658430365,-3.826806223929053e-14 +6.0,0.5430144326845379,0.04590240400649957,11.829760214903983,-4.0253505670851383e-14 +7.0,0.610689137470121,0.04806877475261435,12.704487281255428,-4.406262078692334e-14 +8.0,0.6758859112182876,0.05085291168580261,13.290997286336015,-4.723118897422392e-14 +9.0,0.7383699770457292,0.054242295408895566,13.612439729544315,-5.20455622927876e-14 +10.0,0.7982179068869607,0.05807229829781809,13.74524395079696,-5.5385868816441935e-14 +11.0,0.8557802537306283,0.062209616690946774,13.756398114170796,-5.702371714996311e-14 +12.0,0.8988323082495834,0.0690977304744752,13.008130687904623,-6.141415623852904e-14 +13.0,0.9147135983203839,0.08124056010481986,11.259321663220728,6.491282774779828e-13 +14.0,0.9112748609115651,0.0966853408597458,9.425160554933385,4.54748749597064e-13 +15.0,0.9085348699441353,0.11140779158846578,8.155038862095148,3.3836985824286487e-13 +16.0,0.9062580847970818,0.1257712798490804,7.2056043787146695,2.6754981159878576e-13 +17.0,0.8882638215990443,0.13985252773614038,6.3514320118327126,4.0927876403191203e-13 +18.0,0.8801641114980264,0.15426592918480644,5.7054990440800015,2.5988028226070375e-13 +19.0,0.8799535802082414,0.16798064710830107,5.238422373982847,1.821903726884496e-13 +20.0,0.8812698509369349,0.18370556270697425,4.797186530179459,1.3007693874618696e-13 +21.0,0.871379428960392,0.198621428734149,4.387137050185641,5.975307998613411e-15 +22.0,0.8680573492907033,0.21572711063981947,4.023867685040394,-1.822880946847326e-15 +23.0,0.8639910136639356,0.23075669712075686,3.7441644140529626,-5.408316146275571e-16 +24.0,0.8613474653095494,0.24594284553183446,3.5022261511488364,-4.729369019706576e-15 +25.0,0.8583553232582976,0.2571571564052344,3.3378628666498424,-7.613518753563846e-15 diff --git a/data/TUDELFT_V3_KITE/literature_results/Python_VSM_Rey_5e5_n36_CFD_PCHIP_polars_alpha_sweep.csv b/data/TUDELFT_V3_KITE/literature_results/Python_VSM_Rey_5e5_n36_CFD_PCHIP_polars_alpha_sweep.csv new file mode 100644 index 00000000..b6f0c626 --- /dev/null +++ b/data/TUDELFT_V3_KITE/literature_results/Python_VSM_Rey_5e5_n36_CFD_PCHIP_polars_alpha_sweep.csv @@ -0,0 +1,63 @@ +alpha,CL,CD,CS,CMx,CMy,CMz +-5.0,-0.016639150841432696,0.06461257742824286,8.478187720501367e-17,-3.061887882386819e-16,0.28227103088648064,3.1640606750175953e-17 +-4.508196721311475,-0.15116141710337438,0.06813042331168648,1.6558287946512188e-16,-4.3472875316127167e-16,0.2448193040108129,2.741773931281523e-17 +-4.016393442622951,-0.12359435503424275,0.06467079023399522,2.22928996914706e-16,-5.896358903756748e-16,0.24394876629214812,1.3945762219966873e-17 +-3.5245901639344264,-0.0955075625757297,0.06140805998980694,2.3960563519741807e-16,-6.054561937507627e-16,0.2420546192298006,1.9095600558211657e-17 +-3.0327868852459017,-0.08614032786011963,0.059727576261926124,2.560670910506758e-16,-6.24901983315975e-16,0.24100968398007022,2.597578457810669e-17 +-2.540983606557377,-0.0552050539665637,0.05704706679467209,3.208907979237986e-16,-8.223261858509271e-16,0.23846691212426813,3.934476490419015e-17 +-2.0491803278688527,-0.023671564731756238,0.054662724982745055,2.9679036582491142e-16,-7.499812568752643e-16,0.23501881516673262,2.978666494840783e-17 +-1.557377049180328,0.008844196939017434,0.05251409193106237,3.002063868924993e-16,-7.601161387249302e-16,0.23045212739790363,2.5090012383928592e-17 +-1.0655737704918034,0.0415747891970653,0.05060381840435065,2.890169005608731e-16,-7.430804735020164e-16,0.22471056723584462,1.614989302873564e-17 +-0.5737704918032787,0.07502466254074833,0.04891798700234494,3.0738810047553817e-16,-7.754008589128406e-16,0.2177951282212764,2.830351150699333e-17 +-0.08196721311475397,0.10889694335333432,0.047464944609758454,2.84202193701832e-16,-7.096065243034252e-16,0.20978226669304198,2.2494493861453216e-17 +0.4098360655737707,0.14309203022027436,0.04622054569950249,2.4401687500123214e-16,-5.785946369784777e-16,0.20048986627783982,1.1103051457255748e-17 +0.9016393442622945,0.1780413579153343,0.04526384343079455,2.669338037381205e-16,-7.267451862931039e-16,0.19045131694925846,2.0985591228347496e-17 +1.3934426229508192,0.21395263479636484,0.04447997622080856,2.912494182664618e-16,-8.450678719526157e-16,0.17884135671129764,1.8766010904563983e-17 +1.885245901639344,0.250813572958965,0.04389188664361113,1.9097440614073512e-16,-4.643918219895616e-16,0.16568961707932453,1.408995769343773e-17 +2.3770491803278686,0.28895949644132035,0.04350125508066167,4.0626442680981155e-16,-1.014476953927516e-15,0.1508258269234812,4.0539527398662916e-17 +2.8688524590163933,0.3273497069332273,0.04329404509617653,1.2824872795479226e-16,-3.203611433455315e-16,0.1341391252119524,3.275297183123682e-17 +3.360655737704917,0.365700349792079,0.04337836667220271,1.9990447696309065e-16,-4.080319912158108e-16,0.11648263639587733,1.936339215180039e-17 +3.8524590163934427,0.40370330464829807,0.04368762204422157,2.816738001557434e-16,-7.916743480616941e-16,0.09735955183971143,1.9610584392036138e-17 +4.3442622950819665,0.4404116927505139,0.044306322502976996,1.6375382881475996e-16,-3.8232399823129283e-16,0.07791841285021213,2.315367316874855e-17 +4.836065573770492,0.4762504901989163,0.04515131620054717,2.369158548292387e-16,-6.24901983315975e-16,0.057514814009507295,2.0764148179802968e-17 +5.327868852459016,0.5109687991364886,0.04622052439565633,9.209807980646155e-17,-4.073728119085154e-16,0.03637335615544438,2.19177119675698e-17 +5.8196721311475414,0.5450872107517716,0.04742994878168534,2.5004198302595403e-16,-5.128415010757685e-16,0.013891257121196583,3.1640606750175953e-17 +6.311475409836065,0.578878803412755,0.04877085485214794,7.44531205912049e-17,-3.994626602209714e-16,-0.010208417088161864,9.558099955782319e-18 +6.803278688524589,0.6123151772132445,0.05025131667415033,7.316202601447877e-18,-2.412596264700915e-16,-0.03585800484077638,-1.153563787766831e-18 +7.295081967213115,0.6453702092431793,0.05185290775774244,1.441722277344141e-16,-2.9267561243912755e-16,-0.06310965707173499,2.6531967118637127e-17 +7.786885245901638,0.6779928516494528,0.053578842442153725,1.4115967372205322e-16,-4.60107156492142e-16,-0.09186632177777364,2.719114642593246e-17 +8.278688524590164,0.7101325624043433,0.055423228235985375,1.144770524697139e-16,-3.5991190178325145e-16,-0.12209448775203158,3.839719464995311e-17 +8.770491803278688,0.7417155678337713,0.057385003894413894,1.7386740299911437e-16,-5.840328662636646e-16,-0.15369844447316333,5.2075165276331265e-17 +9.262295081967213,0.7726715314550687,0.05945792991479041,-4.820086419777427e-17,1.4238273037579177e-16,-0.1866012863904165,4.7460910125263927e-17 +9.754098360655737,0.8029903119885894,0.06163976483762739,1.5364025463040542e-16,-5.589840525864415e-16,-0.2207509742279646,2.7026351599108612e-17 +10.245901639344263,0.8324426504335397,0.06391906277414598,6.842801256648311e-17,-1.8457020604269305e-17,-0.2559480287255108,6.92138272660099e-17 +10.737704918032787,0.8611093171365881,0.0662937719175855,1.4202040343987063e-17,-8.173823410462121e-17,-0.2921901366614442,5.899654800293225e-17 +11.229508196721312,0.8887836361849122,0.0687525912834733,-8.004786375701798e-17,3.4277323979357284e-17,-0.3292683490609791,3.065183778923295e-17 +11.721311475409834,0.9156238187652903,0.07131283332024405,2.1862534832561903e-16,-7.699214309209482e-16,-0.36712563062885384,7.481685137802022e-17 +12.21311475409836,0.9418984375156303,0.07399760347505731,-4.217575617305249e-17,1.6347646820924242e-16,-0.40580095808159955,4.218747566690127e-17 +12.704918032786885,0.9677215562567566,0.07682644632228418,-5.680816137594825e-17,6.328121350035191e-17,-0.4452567123584407,4.218747566690127e-17 +13.196721311475411,0.9931286743487212,0.0797870357773372,1.7386740299911434e-16,-2.794920262932209e-16,-0.48555212411561566,3.4277323979357284e-17 +13.688524590163933,0.9530080585289407,0.09372461800895182,2.0829659171181024e-16,-5.668942042739858e-16,-0.4388000351000014,2.900388952099462e-17 +14.180327868852459,0.9726783526633942,0.09816659918391062,-1.2910945767260968e-16,3.902341499188368e-16,-0.4701027130866711,5.471188250551259e-17 +14.672131147540984,0.9451834173522863,0.1086047928078909,9.667716190525011e-14,-2.2546832698452465e-13,-0.4434160867841825,2.5614389522882024e-14 +15.163934426229506,0.9274663982712807,0.1173860748560331,-1.4804551146459243e-16,1.318358614590665e-16,-0.42977676488265726,2.6696761945460965e-17 +15.655737704918032,0.9392161571013751,0.12364041059453318,3.5289918430513304e-17,-3.2431621918930353e-16,-0.4484146206820607,1.0217279263077651e-17 +16.147540983606557,0.917935061773152,0.13355092087700765,1.506277006180446e-16,-8.147456238170308e-16,-0.42684179208813605,1.100829443183205e-16 +16.639344262295083,0.9273175945900742,0.14012854861126456,-9.812318783118334e-17,1.7402333712596775e-16,-0.4427392153437181,1.4864493379509744e-16 +17.131147540983605,0.9372166929555599,0.14673903926860724,-1.2136289021225308e-15,2.6367172291813293e-15,-0.45960767742472114,-8.635248925568853e-17 +17.62295081967213,0.9212648752527602,0.15330902504856514,-7.40227557322962e-17,1.5556631652169844e-16,-0.45407537631807837,6.196285488576123e-17 +18.114754098360656,0.9042606944997617,0.1605440694312137,-5.164378306904386e-18,-2.2148424725123165e-16,-0.44298849768484955,8.701166856298387e-17 +18.606557377049178,0.9108034289591539,0.16749392814781805,1.3427383597951405e-16,-5.853512248782551e-16,-0.4553382010126988,9.492182025052785e-17 +19.098360655737704,0.8994884373576996,0.1727892443219773,7.74656746035658e-18,-2.3994126785550103e-16,-0.45765053247576365,1.1403802016209251e-16 +19.59016393442623,0.9044972557086793,0.18005479310901998,-1.7558886243474914e-16,9.492182025052785e-17,-0.4674021986963869,8.239741341191654e-17 +20.081967213114755,0.8880114648962718,0.1886092652486161,-4.2175756173052494e-17,-1.318358614590665e-16,-0.4503789890339498,1.1469719946938785e-16 +20.573770491803277,0.891661611947163,0.19581563053838055,1.7386740299911434e-16,-4.3505834281491935e-16,-0.4589643663993485,1.3315422007365713e-16 +21.065573770491802,0.8789204895652939,0.20176210132002587,2.3497921296414955e-16,-8.595698167131133e-16,-0.4538741523035905,1.9313953703753237e-16 +21.557377049180328,0.8817415797412202,0.20915497453029433,-6.283326940067003e-17,7.119136518789589e-17,-0.46087492648475836,5.5371061812807914e-17 +22.049180327868854,0.8849598383450349,0.21662460538438122,3.5289918430513304e-17,-2.610350056889516e-16,-0.46843312834521944,1.3513175799554314e-16 +22.540983606557376,0.8884516297495344,0.2240483324289815,1.807532407416535e-17,-2.610350056889516e-16,-0.47687031449324124,1.2919914422988513e-16 +23.0327868852459,0.8737106107104212,0.2339158168422375,-1.5837426807840117e-16,4.1660132221065e-16,-0.45610150036749486,7.053218588060056e-17 +23.524590163934427,0.8752551935225418,0.24200218248559524,-4.475794532650468e-17,1.2919914422988513e-16,-0.46002499798247176,2.0434558526155303e-17 +24.01639344262295,0.8768904716550766,0.24995893761794005,-8.349078262828758e-17,2.1357409556368767e-16,-0.46464194159845734,4.4824192896082596e-17 +24.508196721311474,0.8656263524743696,0.25664834099878914,-3.87328373017829e-17,4.218747566690127e-17,-0.4569579827789767,5.734859973469391e-17 +25.0,0.8663529251179094,0.2647858928603986,-1.101734038806269e-16,-5.273434458362659e-18,-0.45976462904136123,1.4567862691226844e-16 diff --git a/data/TUDELFT_V3_KITE/literature_results/WindTunnel_Re_5e5_Poland2025_alpha_sweep_beta_0.csv b/data/TUDELFT_V3_KITE/literature_results/WindTunnel_Re_5e5_Poland2025_alpha_sweep_beta_0.csv new file mode 100644 index 00000000..b2a2be53 --- /dev/null +++ b/data/TUDELFT_V3_KITE/literature_results/WindTunnel_Re_5e5_Poland2025_alpha_sweep_beta_0.csv @@ -0,0 +1,18 @@ +CL,CL_ci,CD,CD_ci,alpha +-0.28023315356081796,0.011070533538875897,0.09785297775939765,0.012935829196785585,-11.568121157001665 +-0.2144913736143728,0.012287227041809052,0.06853577957407217,0.015525138484707877,-6.099059501611582 +-0.0007680391233001299,0.01068508564308875,0.04885867739007862,0.0076696455159627275,-1.9996385577164184 +0.07398995139159774,0.00953159417113588,0.05739081465627228,0.008889911090057321,-1.3348199670846914 +0.46519267467797903,0.009475707060472788,0.05616787766119728,0.009084810793467887,3.0810784665258444 +0.610180915884597,0.0045250228316688484,0.07431024337243476,0.004621689815286087,5.412846420261046 +0.7430356350927991,0.009465755795905533,0.08664306372317211,0.009633413459228232,7.350324457982788 +0.887298865863501,0.010638047578235603,0.10233695227784106,0.00900521264610847,9.382433604529174 +0.9255655151637727,0.014238431399063743,0.17599439630813363,0.01507120428946693,11.464425166301869 +0.9327251987983486,0.015877506028324398,0.18888674805756867,0.01693686866633114,12.461055790544702 +0.9512282813613351,0.014573344990978988,0.2127454401843595,0.018047053186439406,13.352348165878231 +0.9770715203611249,0.018103047941433924,0.22788683966364287,0.0204637541133525,14.540186234231973 +1.008562675819161,0.016658847313704747,0.24447585438450992,0.018378234971297258,16.225366370508798 +1.0681034642531901,0.0154900038338791,0.319919197381967,0.02298889264565519,18.29734623730859 +1.0099938012961718,0.015447658557709807,0.3573016324548397,0.015144711790384626,20.224692877134817 +0.9979635604848679,0.01181112128634061,0.4199851182071093,0.011605298627928523,23.03035435658158 +0.9749275179241531,0.01301729603627638,0.43498425522432616,0.012174929509637398,24.54119521035482 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/1.csv b/data/TUDELFT_V3_KITE/polars_CFD/1.csv new file mode 100644 index 00000000..8e996699 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/1.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1759893858334057,2.963819078393553e-21,-0.7493726713784946,0.2323775006207747 +-9.5,0.16289734924603438,2.7877286866584314e-21,-0.6924217529040287,0.2150382675337481 +-9.0,0.1504301874457461,2.6166544368792525e-21,-0.6371323632116463,0.1982607529225381 +-8.5,0.13862765245364775,2.4505707167459407e-21,-0.583498032661642,0.182046261914037 +-8.0,0.1275294962908461,2.2894519139484196e-21,-0.5315122916143107,0.16639609963513724 +-7.5,0.11717547097844788,2.133272416176612e-21,-0.4811686704299467,0.15131157121273117 +-7.0,0.10760532853756002,1.9820066111204418e-21,-0.4324606994688453,0.13679398177371113 +-6.5,0.09885882098928928,1.8356288864698326e-21,-0.38538190909130093,0.12284463644496953 +-6.0,0.09097570035474245,1.694113629914708e-21,-0.3399258296576083,0.10946484035339869 +-5.5,0.08399571865502635,1.557435229144991e-21,-0.2960859915280623,0.09665589862589102 +-5.0,0.0779586279112478,1.4255680718506053e-21,-0.2538559250629577,0.0844191163893389 +-4.5,0.07276768079432067,1.304392579507697e-21,-0.21595504346747285,0.07305505165488536 +-4.0,0.06820918462412777,1.1952100521496464e-21,-0.18295885873231385,0.06261743540439639 +-3.5,0.06414747339522936,1.0911261953022303e-21,-0.15164504939606627,0.05273733222084856 +-3.0,0.06044688110218564,9.852467144912246e-22,-0.11879129399731583,0.0430458066872185 +-2.5,0.056971741739556846,8.706773152424055e-22,-0.08117527107464828,0.03317392338648285 +-2.0,0.0535863893019032,7.405237030815495e-22,-0.0355746591666493,0.0227527469016182 +-1.5,0.050350423572556896,5.856067102929198e-22,0.026226099750827674,0.011481449300827454 +-1.0,0.04735778299115752,4.0923582258582316e-22,0.10429086281980794,-0.00026565530478757544 +-0.5,0.04452430953672641,2.232497256236004e-22,0.189614400178524,-0.011844789267901869 +0.0,0.0417658451882849,3.948710506959264e-23,0.2731914819652083,-0.0226121749411904 +0.5,0.038938158507699175,-1.5308243840478701e-22,0.3557444890017091,-0.03336699893672287 +1.0,0.036117770291757965,-3.560898065690111e-22,0.4410912179803868,-0.0442048470204237 +1.5,0.03355165087186637,-5.435970674210673e-22,0.5248695628452424,-0.05342654027574999 +2.0,0.0314867705794295,-6.896662889589436e-22,0.6027174175402769,-0.0593328997861588 +2.5,0.029737782322488943,-8.01300470612271e-22,0.6754871235581754,-0.06287604536210906 +3.0,0.028000254685969946,-9.031057734401621e-22,0.7466883077319687,-0.06610779561686102 +3.5,0.026342531516603155,-9.955490078848253e-22,0.8159447920161751,-0.06897851983807372 +4.0,0.024832956661119197,-1.07909698438847e-21,0.882880398365313,-0.0714385873134062 +4.5,0.023539873966248726,-1.1542165133933057e-21,0.9471189487339009,-0.07343836733051758 +5.0,0.022531627278722356,-1.221374405341541e-21,1.0082842650764576,-0.07492822917706685 +5.5,0.021876560445270733,-1.2810374706753849e-21,1.0660001693475016,-0.07585854214071311 +6.0,0.0216430173126245,-1.3336725198370469e-21,1.1198904835015508,-0.0761796755091154 +6.5,0.021855502747260325,-1.3836048414175573e-21,1.1730032825989054,-0.07614317006852858 +7.0,0.022476813390075807,-1.4334901652977566e-21,1.2273051287313683,-0.07604692845243605 +7.5,0.023482730749432957,-1.4812909638545697e-21,1.280797574400714,-0.0759108627193397 +8.0,0.02484903633369378,-1.52496970946492e-21,1.3314821721087169,-0.07575488492774146 +8.5,0.026551511651220286,-1.5624888745057316e-21,1.3773604743571508,-0.07559890713614321 +9.0,0.028565938210374484,-1.5918109313539293e-21,1.4164340336477907,-0.07546284140304686 +9.5,0.030868097519518387,-1.610898352386437e-21,1.4467044024824103,-0.07536659978695433 +10.0,0.033433771087014,-1.6177136099801785e-21,1.4661731333627843,-0.0753300943463675 +10.5,0.03772956880131731,-1.6057175342808367e-21,1.4791075252059553,-0.07796780684956318 +11.0,0.04483478356085069,-1.573737170673408e-21,1.4901408957026034,-0.0844740956822261 +11.5,0.054144221388925814,-1.527784314393788e-21,1.4978238255149576,-0.09273868782897009 +12.0,0.0650526883088543,-1.473870760677872e-21,1.5007068953052467,-0.100651310274409 +12.5,0.0813064038148973,-1.376249216669895e-21,1.4478125078785742,-0.10828545090079453 +13.0,0.10393510413553603,-1.227647034548664e-21,1.327791188740308,-0.11661304574760116 +13.5,0.12825887039541226,-1.0767879771019317e-21,1.1986357026030765,-0.12487149403527704 +14.0,0.1495977837191678,-9.723958071174512e-22,1.1183388141795072,-0.1322981949842703 +14.5,0.16758478702300417,-9.126318501956502e-22,1.0836834275674483,-0.13916224193214982 +15.0,0.18464791495839383,-8.633432558691364e-22,1.0549329936239267,-0.14581097523802025 +15.5,0.20029988625288483,-8.247825228239323e-22,1.0353010972003385,-0.15159916465463338 +16.0,0.2140534196340252,-7.972021497460613e-22,1.028001323148079,-0.155881579934741 +16.5,0.22575911507873533,-7.765045354525572e-22,1.0279465928930964,-0.1588574292964903 +17.0,0.23609366837079485,-7.591163461883778e-22,1.0279074596231041,-0.1612711173409803 +17.5,0.24580894194804037,-7.460764817814329e-22,1.0278839558321435,-0.1632952083953905 +18.0,0.2556567982483086,-7.38423842059632e-22,1.0278761140142585,-0.1651022667869003 +18.5,0.265699815399311,-7.344986178163224e-22,1.0281104344749106,-0.16669752709328292 +19.0,0.27558646593010794,-7.316573885898107e-22,1.0287304726554904,-0.16807297439296806 +19.5,0.28544745388056003,-7.294636373254447e-22,1.0296118437539339,-0.1693812987641203 +20.0,0.2954134832905278,-7.274808469685726e-22,1.030630162968177,-0.1707751902849041 +20.5,0.3055500999908466,-7.253401091686849e-22,1.0321158975458387,-0.17232913459444757 +21.0,0.3157783912824044,-7.232601462733436e-22,1.034270073518937,-0.17395281724452416 +21.5,0.32601237341014067,-7.216858872750047e-22,1.036774144262008,-0.17555172818226641 +22.0,0.3361660626189948,-7.210622611661238e-22,1.039309563149587,-0.1770313573548068 +22.5,0.3462258406278082,-7.210927738558214e-22,1.0418506907541978,-0.17838813341813575 +23.0,0.35623515262436534,-7.213063626837044e-22,1.044574269637424,-0.17967706251871235 +23.5,0.36619361005701967,-7.21886103787958e-22,1.0474653261573934,-0.18089150083937203 +24.0,0.3761008243741252,-7.230150733067677e-22,1.0505088866722323,-0.18202480456295017 +24.5,0.38595640702403533,-7.248763473783189e-22,1.0536899775400672,-0.18307032987228236 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/10.csv b/data/TUDELFT_V3_KITE/polars_CFD/10.csv new file mode 100644 index 00000000..f2572032 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/10.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1301765524838856,1.5332052308649837e-21,-0.3263185917913435,0.0618002947702435 +-9.5,0.12578903604174424,1.5315041094699052e-21,-0.3261426062537052,0.06668926559457225 +-9.0,0.12128793407691554,1.5264915255975583e-21,-0.3256084156736321,0.07060405035058454 +-8.5,0.11667907968617204,1.518303649717276e-21,-0.32470666910038626,0.07365289193476003 +-8.0,0.11196830596628633,1.5070766522983917e-21,-0.3234280155832302,0.07594403324357829 +-7.5,0.10716144601403095,1.4929467038102383e-21,-0.32176310417142623,0.07758571717351893 +-7.0,0.10226433292617844,1.4760499747221491e-21,-0.31970258391423667,0.07868618662106157 +-6.5,0.09728279979950137,1.456522635503457e-21,-0.31723710386092374,0.07935368448268579 +-6.0,0.09222267973077232,1.4345008566234952e-21,-0.31435731306075,0.07969645365487119 +-5.5,0.0870898058167638,1.4101208085515971e-21,-0.3110538605629776,0.07982273703409738 +-5.0,0.0818900111542484,1.3835186617570953e-21,-0.307317395416869,0.079840777516844 +-4.5,0.07621039375979628,1.3350427543285605e-21,-0.2905836224593337,0.07751924102983763 +-4.0,0.06993985587472228,1.2522108476337967e-21,-0.25279761874231255,0.07134943164597013 +-3.5,0.06353693693291604,1.1459132470609897e-21,-0.20071409163761478,0.06252354948096889 +-3.0,0.05746017636826717,1.0270402579983243e-21,-0.1410877485170496,0.05223379465056129 +-2.5,0.05216811361466528,9.064821858339855e-22,-0.08067329675242618,0.041672367270474776 +-2.0,0.048119288106,7.951293359561587e-22,-0.0262254437155537,0.0320314674564367 +-1.5,0.04516043365350427,6.978484874280579e-22,0.021217042316403138,0.023148651914158252 +-1.0,0.04270433677023845,6.028368034533188e-22,0.06823705949476479,0.013911666244680229 +-0.5,0.04055861594283328,4.959801656307586e-22,0.11951240009044983,0.004087993906724489 +0.0,0.0385308896579195,3.631644555591945e-22,0.1797208563743769,-0.0065548816409871 +0.5,0.036565557862082196,1.6636646430106904e-22,0.2604641394126732,-0.020507044468101157 +1.0,0.03473462570328398,-9.386316150451564e-23,0.3597426714647984,-0.03701483187033973 +1.5,0.0330371194702219,-3.737777568937534e-22,0.4618323115916697,-0.05144514022809409 +2.0,0.031472065451593,-6.296306569028383e-22,0.5510089188542044,-0.0591648659217555 +2.5,0.029890530952414455,-8.59470295746127e-22,0.6266138097528258,-0.06181308418039997 +3.0,0.02820826116309837,-1.0887396156159015e-21,0.6985941374523601,-0.06411600382468814 +3.5,0.02652129920043421,-1.3147837135152445e-21,0.7671345160103298,-0.06607122162238828 +4.0,0.024925688181211422,-1.534947686447238e-21,0.8324195594842576,-0.06767633434126868 +4.5,0.023517471222219463,-1.7465766314149645e-21,0.8946338819316656,-0.06892893874909756 +5.0,0.022392691440247785,-1.9470156454215057e-21,0.9539620974100762,-0.06982663161364319 +5.5,0.021647391952085846,-2.133609825469944e-21,1.0105888199770119,-0.07036700970267386 +6.0,0.0213776158745231,-2.303704268563362e-21,1.064698663689995,-0.0705476697839578 +6.5,0.021565349979172525,-2.4718929102871923e-21,1.118203581827076,-0.07030374351390284 +7.0,0.022107794258325267,-2.6482527087552553e-21,1.1719886642554957,-0.06966066516557615 +7.5,0.022973811659788,-2.8233532947632123e-21,1.2246982299165625,-0.06875148543173494 +8.0,0.024132265131367403,-2.9877642991067235e-21,1.2749765977515843,-0.0677092550051365 +8.5,0.025552017620870168,-3.132055352581452e-21,1.3214680867018695,-0.06666702457853806 +9.0,0.027201932076102966,-3.2467960859830587e-21,1.3628170157087265,-0.06575784484469685 +9.5,0.02905087144487248,-3.3225561301072025e-21,1.3976677037134635,-0.06511476649637016 +10.0,0.0310676986749854,-3.3499051157495493e-21,1.424664469657389,-0.0648708402263152 +10.5,0.03394174484966652,-3.3359018846898896e-21,1.4474997440219783,-0.06601131649904603 +11.0,0.038303000433861464,-3.2985509227698455e-21,1.4683340630285993,-0.06895807480400823 +11.5,0.04403131744795809,-3.2448403268778196e-21,1.4835139042283982,-0.07299910937135624 +12.0,0.0510065479123443,-3.1817581939022146e-21,1.489385745172521,-0.0774224144312446 +12.5,0.061678588014282686,-3.0685621467505075e-21,1.4605924452307075,-0.08288378600495869 +13.0,0.07711627413483947,-2.8961351097154665e-21,1.3914894666970927,-0.09002026930017473 +13.5,0.09512786858510801,-2.7189031317634314e-21,1.3079921915094148,-0.0980917323266337 +14.0,0.1135216336761816,-2.591292261860741e-21,1.236016001605412,-0.1063580430940764 +14.5,0.133718133225711,-2.5065801357819803e-21,1.1707849756107886,-0.11579881684549981 +15.0,0.15646430185540838,-2.4302692478313836e-21,1.1020524991432321,-0.12649833129941465 +15.5,0.17855795808245903,-2.3751229347697626e-21,1.0475279146284566,-0.13637344817883246 +16.0,0.1967969204240483,-2.3539045333579308e-21,1.0249205644921762,-0.1433410292067649 +16.5,0.2107001646977124,-2.3626580948948774e-21,1.0242664903078942,-0.14757225172576002 +17.0,0.22263617133433966,-2.384009574927483e-21,1.0237968315491408,-0.15089123817926559 +17.5,0.23367701577114336,-2.4105951665883945e-21,1.0235135774916695,-0.15369426794164245 +18.0,0.244894773445337,-2.43505106301026e-21,1.0234187174112337,-0.1563776203872515 +18.5,0.25652377622469996,-2.4552931952201807e-21,1.0234346874528226,-0.15910940376114732 +19.0,0.2680164460499302,-2.475303391528144e-21,1.0234698215443183,-0.161702381971479 +19.5,0.27927199346761944,-2.4968166909911275e-21,1.0235049556358138,-0.16401981788724918 +20.0,0.2901896290243592,-2.521568132666108e-21,1.0235209256774027,-0.1659249743774606 +20.5,0.3007021482983167,-2.554083877563202e-21,1.0234132050654727,-0.16740914577029037 +21.0,0.31089744428201255,-2.5932407749648646e-21,1.0231762197192271,-0.16865092811621205 +21.5,0.32090737364356803,-2.632299896336581e-21,1.0229392343729815,-0.16979453686767298 +22.0,0.3308637930511045,-2.664522313143837e-21,1.0228315137610515,-0.1709841874771204 +22.5,0.34079119919261625,-2.6900748997074535e-21,1.023728034663366,-0.17224392478414238 +23.0,0.35062526773735947,-2.7131480478888714e-21,1.0261072582221118,-0.17350164674578133 +23.5,0.36036462382534823,-2.7330381054645046e-21,1.0295036757149931,-0.17475734849066632 +24.0,0.3700078925965967,-2.749041420210768e-21,1.0334517784197144,-0.1760110251474264 +24.5,0.3795536991911191,-2.7604543399040757e-21,1.0374860576139795,-0.17726267184469055 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/11.csv b/data/TUDELFT_V3_KITE/polars_CFD/11.csv new file mode 100644 index 00000000..7ce76468 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/11.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1234315714135491,-3.033774099896768e-22,-0.3359266089927624,0.0652339666544156 +-9.5,0.1162053701470857,-2.925115129765925e-22,-0.30809012613430375,0.060972241921841856 +-9.0,0.1093090300653182,-2.821962406123789e-22,-0.2816071957744715,0.05718850205159394 +-8.5,0.10275835655200842,-2.7250821891467473e-22,-0.25678436948895306,0.053875826428972984 +-8.0,0.09656915499091809,-2.6352407390111874e-22,-0.2339281988534362,0.051027294439280085 +-7.5,0.09075723076580895,-2.5532043158934978e-22,-0.21334523544360837,0.048635985467816355 +-7.0,0.08533838926044277,-2.4797391799700652e-22,-0.1953420308351571,0.04669497889988294 +-6.5,0.08032843585858125,-2.4156115914172784e-22,-0.18022513660377013,0.04519735412078092 +-6.0,0.0757431759439862,-2.3615878104115246e-22,-0.16830110432513493,0.04413619051581143 +-5.5,0.07159841490041934,-2.3184340971291915e-22,-0.15987648557493905,0.04350456747027558 +-5.0,0.0679099581116424,-2.286916711746667e-22,-0.1552578319288702,0.0432955643694745 +-4.5,0.06476390786289897,-2.266583778780869e-22,-0.15320994191166698,0.04396261053054119 +-4.0,0.06210021384618032,-2.25359876227284e-22,-0.15198707863602687,0.04563022593320789 +-3.5,0.05971545255536976,-2.243650931685158e-22,-0.1511299905595753,0.047798125956674604 +-3.0,0.05740620048435062,-2.2324295564803985e-22,-0.15017942613993782,0.04996602598014131 +-2.5,0.054969034127006204,-2.215623906121138e-22,-0.14867613383473996,0.05163364138280802 +-2.0,0.0522005299772198,-2.1889232500699537e-22,-0.1461608621016072,0.0523006875438747 +-1.5,0.0489010234997901,-1.9685103440890762e-22,-0.11375841403859197,0.04587908774636842 +-1.0,0.04525595867082686,-1.5266125407303205e-22,-0.03834246541128747,0.030432053553602456 +-0.5,0.04163957475118006,-1.0929860046406367e-22,0.05692292632136957,0.01168623276520615 +0.0,0.0384261110016997,-8.973869004669751e-23,0.1488737037004424,-0.0046317268191912 +0.5,0.0354956626884681,-1.1523890331386128e-22,0.23907762431276228,-0.019169509516978815 +1.0,0.032670281789753834,-1.713393725016216e-22,0.33810460252198726,-0.03430342989550007 +1.5,0.030237142634686288,-2.2743984168938188e-22,0.43629381603442086,-0.046899785530056796 +2.0,0.0284834195523948,-2.5294005495654563e-22,0.5239844425563664,-0.0538248739959508 +2.5,0.027188567083012,-2.3497639241444965e-22,0.6017947828865181,-0.05669549793866705 +3.0,0.025962028519990778,-1.8664741875524986e-22,0.6766702760416919,-0.05921176149931855 +3.5,0.024835961322440907,-1.1629615492957854e-22,0.748440807055374,-0.06136491449664926 +4.0,0.023842522949472148,-3.226562188806799e-23,0.8169362609610502,-0.06314620674940312 +4.5,0.023013870860194262,5.710115941864959e-23,0.8819865227922072,-0.06454688807632407 +5.0,0.022382162513717014,1.4346116803994185e-22,0.943421477582331,-0.06555820829615604 +5.5,0.021979555369150174,2.1847138302517656e-22,1.0010710103649074,-0.06617141722764301 +6.0,0.0218382068856035,2.737887834237215e-22,1.0547650061734235,-0.0663777646895289 +6.5,0.02196985080349623,3.1553114301940426e-22,1.1056826743993375,-0.06594587192075527 +7.0,0.022355255673131003,3.55126486150418e-22,1.1548717291437447,-0.06480724553035204 +7.5,0.022980131168442712,3.92197167697679e-22,1.201964812504584,-0.06319746339219576 +8.0,0.02383018696336624,4.263655425421032e-22,1.246594566579796,-0.06135210338016295 +8.5,0.024891132731836466,4.572539655646068e-22,1.28839363346732,-0.05950674336813014 +9.0,0.02614867814778828,4.844847916461061e-22,1.3269946552650953,-0.057896961229973856 +9.5,0.02758853288515656,5.076803756675169e-22,1.362030274071062,-0.05675833483957063 +10.0,0.0291964066178762,5.264630725097554e-22,1.39313313198316,-0.056326442070797 +10.5,0.031818770829838514,5.431488335696375e-22,1.4239463917110855,-0.0573882715992102 +11.0,0.036193197438599854,5.584720248911993e-22,1.4540173308320359,-0.06020848774418671 +11.5,0.04214204676859267,5.696826233261884e-22,1.4768347637452004,-0.06423918184533185 +12.0,0.0494876791442494,5.740306057263521e-22,1.4858875048497686,-0.068932445242251 +12.5,0.062293032728386724,5.6436365793740355e-22,1.4465265188722263,-0.07653893960390827 +13.0,0.08189893734445033,5.428260813909211e-22,1.3551696504873776,-0.0878557758564273 +13.5,0.10404459080781625,5.2061277631745e-22,1.2519060340168884,-0.10015471922515265 +14.0,0.1244691909338605,5.089186429475355e-22,1.1768248037824254,-0.1107075349354289 +14.5,0.14304529119642445,5.064771170348239e-22,1.1297753966963062,-0.11958458234226689 +15.0,0.1617215337698045,5.046195483671992e-22,1.0875124925895288,-0.12812902868668347 +15.5,0.17935124952005896,5.034377082265631e-22,1.0554830901617809,-0.13552185102303224 +16.0,0.1947877693132464,5.030233678948174e-22,1.0391341881127485,-0.1409440264056667 +16.5,0.20772062230977195,5.1506418242738265e-22,1.033109548321084,-0.1446149451583725 +17.0,0.2191754297510846,5.419897499381309e-22,1.0285258456394688,-0.14752705722976053 +17.5,0.23000966062480838,5.700047562966403e-22,1.0255394482286349,-0.15002092911142195 +18.0,0.2410807839185674,5.853138873724895e-22,1.0243067242493131,-0.1524371272949481 +18.5,0.25267149967648667,5.89288238577539e-22,1.0240926076607344,-0.15493988256029914 +19.0,0.26430702426012387,5.923667292202891e-22,1.0239867208052753,-0.15735303076913273 +19.5,0.27570860113325146,5.9435578101527785e-22,1.0238824644183875,-0.15950654603558648 +20.0,0.2865974737596425,5.9506181567704345e-22,1.0236732392355226,-0.1612304024737978 +20.5,0.29672436056955764,5.949869765432363e-22,1.0219972233912713,-0.16248129317198723 +21.0,0.3063347061131695,5.947649713365387e-22,1.0186964040036652,-0.16347522011132856 +21.5,0.31589184303411844,5.943995683490372e-22,1.0154698952833183,-0.16443112074538963 +22.0,0.3258591039760449,5.93894535872818e-22,1.0140168114408443,-0.165567932527738 +22.5,0.33633303311448015,5.878185924116574e-22,1.0144692153398562,-0.16695903039482352 +23.0,0.3470942599892227,5.727131841091183e-22,1.0158813807962217,-0.1685184181222247 +23.5,0.3581322452903136,5.51541170716967e-22,1.0183357384489344,-0.1702259764222024 +24.0,0.3694364497077941,5.272654119869695e-22,1.021914718936988,-0.17206158600701743 +24.5,0.3809963339317053,5.028487676708923e-22,1.0267007528993763,-0.17400512758893052 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/12.csv b/data/TUDELFT_V3_KITE/polars_CFD/12.csv new file mode 100644 index 00000000..e7290fc8 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/12.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1145642577313759,-1.0186945209532765e-21,-0.2989604670437933,0.0581854929136097 +-9.5,0.10213118374487679,-9.918217508383414e-22,-0.2245458665019229,0.04834194198419301 +-9.0,0.09069093549953688,-9.703037024437254e-22,-0.16227392109948904,0.04045983662742761 +-8.5,0.08031792364276491,-9.535454066893931e-22,-0.1111295740608856,0.03432123844635226 +-8.0,0.07108655882196964,-9.409518944953092e-22,-0.07009776861050662,0.029708209044005684 +-7.5,0.06307125168455985,-9.319281967814382e-22,-0.03816344797274604,0.02640281002342664 +-7.0,0.05634641287794432,-9.258793444677441e-22,-0.014311555371997943,0.024187102987653884 +-6.5,0.05098645304953179,-9.22210368474192e-22,0.002472965967343796,0.022843149539726142 +-6.0,0.04706578284673103,-9.203262997207466e-22,0.013205172820885264,0.022153011282682163 +-5.5,0.044658812916950806,-9.196321691273718e-22,0.018900121964232422,0.0218987498195607 +-5.0,0.0438399539075999,-9.195330076140325e-22,0.0205728701729912,0.0218624267534005 +-4.5,0.044844031373611516,-9.393769441147479e-22,2.1678654842578835e-05,0.025744786757205426 +-4.0,0.04735422503864055,-9.889867853665366e-22,-0.051356300140528985,0.03545068676671775 +-3.5,0.0506174768031783,-1.0534795789938619e-21,-0.11814767257451199,0.04806835677908375 +-3.0,0.05388072856771605,-1.1179723726211871e-21,-0.18493904500849503,0.06068602679144976 +-2.5,0.0563909222327451,-1.1675822138729757e-21,-0.23631702380386654,0.07039192680096207 +-2.0,0.0573949996987567,-1.1874261503736912e-21,-0.2568682153220152,0.074274286804767 +-1.5,0.05521334080373774,-1.169308304710011e-21,-0.2211436887229862,0.06662985899443337 +-1.0,0.05009105699670657,-1.12392710877403e-21,-0.1331855431596258,0.04823870980475276 +-0.5,0.04416218759470174,-1.0647410741483368e-21,-0.021816929982523853,0.025914040597705655 +0.0,0.0395607719147618,-1.005208712415521e-21,0.0841389994577299,0.0064690527352725 +0.5,0.03644960902071129,-9.405541181303599e-22,0.186078189420299,-0.010912169016384967 +1.0,0.03364809754142019,-8.646525121416996e-22,0.2969561760904909,-0.029040109106737266 +1.5,0.031275176141495296,-7.889390954732324e-22,0.4052891960069312,-0.04409341999725234 +2.0,0.0294497834855434,-7.248490691486498e-22,0.4995934857082457,-0.0522507541493981 +2.5,0.027946208534965336,-6.721555386453743e-22,0.5805866139919181,-0.055484426934010386 +3.0,0.026490753905199893,-6.228427445770576e-22,0.6568775651604449,-0.05830965248620302 +3.5,0.025130378741910778,-5.766625906717334e-22,0.7288196990099702,-0.060719431413861026 +4.0,0.02391204219076169,-5.333669806574363e-22,0.7967663753366386,-0.06270676432486941 +4.5,0.022882703397416326,-4.927078182622007e-22,0.8610709539365944,-0.06426465182711312 +5.0,0.022089321507538392,-4.544370072140609e-22,0.9220867946059814,-0.06538609452847724 +5.5,0.02157885566679158,-4.1830645124105116e-22,0.9801672571409449,-0.06606409303684668 +6.0,0.0213982650208396,-3.840680540712058e-22,1.0356657013376285,-0.0662916479601065 +6.5,0.021507656537742982,-3.5268318986602144e-22,1.0907625764896383,-0.06579135364463135 +7.0,0.02182989033247034,-3.245656758687173e-22,1.146344218813281,-0.06447239590383319 +7.5,0.022356055271047514,-2.9864608042991245e-22,1.2008228184887513,-0.06260766254615303 +8.0,0.023077240219500333,-2.7385497190022535e-22,1.252610565696244,-0.060470041380031904 +8.5,0.02398453404385463,-2.491229186302747e-22,1.3001196506159538,-0.05833242021391075 +9.0,0.025069025610136235,-2.2338048897067936e-22,1.3417622634280755,-0.05646768685623061 +9.5,0.026321803784370983,-1.955582512720579e-22,1.3759505943128036,-0.05514872911543246 +10.0,0.0277339574325847,-1.645867738850292e-22,1.4010968334503338,-0.0546484347999573 +10.5,0.03028862452429541,-1.2282620295319593e-22,1.4210744977898837,-0.055377010053799657 +11.0,0.034734092938444,-7.30801341953451e-23,1.4389006590156994,-0.05733382081640998 +11.5,0.04070917640519061,-2.994431032487165e-23,1.4517028394105165,-0.060175494589413195 +12.0,0.0478526886546954,-8.014474055170505e-24,1.4566085612570696,-0.0635586588744342 +12.5,0.05868930749961152,-2.178919681369906e-24,1.42679012875102,-0.0692861741708663 +13.0,0.0743444658648666,2.2592265733530785e-24,1.35596538095394,-0.07816276120376277 +13.5,0.09235811014903243,5.081974103530227e-24,1.2720801424474328,-0.0883478378132383 +14.0,0.1102701867506809,6.071332303693328e-24,1.2030802378131007,-0.0980008218394076 +14.5,0.128635074754194,-2.26723761795455e-23,1.1475531057212394,-0.10749406920948687 +15.0,0.14845849428729055,-8.80911454537924e-23,1.0924390297840534,-0.11752359119473167 +15.5,0.16795740331354728,-1.5896644125584297e-22,1.0482131019960097,-0.1267342886513159 +16.0,0.185348759796541,-2.0407972932249281e-22,1.0253504143515757,-0.1337710624354134 +16.5,0.2002117464095192,-2.235815983746027e-22,1.0182639159587872,-0.1387289037920892 +17.0,0.21375924606817004,-2.3885000982024793e-22,1.0135372691731261,-0.14281694563883054 +17.5,0.22665876709973146,-2.505074884270461e-22,1.0099016358602306,-0.14635130134044488 +18.0,0.2395778178314414,-2.591765589626148e-22,1.006088177885738,-0.1496480842617396 +18.5,0.25271103171975595,-2.6648067949459323e-22,1.0016739551713492,-0.15285667035667172 +19.0,0.26570472850492943,-2.729526574823713e-22,0.9973336776694284,-0.15585414518583077 +19.5,0.2784039459398967,-2.775790417811927e-22,0.9934449822916097,-0.15854818652397254 +20.0,0.2906537217775926,-2.7934638124630123e-22,0.9903855059495263,-0.1608464721458529 +20.5,0.30443322764906655,-2.7867561021000565e-22,0.9884932505887578,-0.1630366435914313 +21.0,0.31918271932259246,-2.766732182386906e-22,0.9872403209431975,-0.165164496976435 +21.5,0.3309388607569421,-2.733540870387135e-22,0.9857055081069499,-0.16677494193927164 +22.0,0.3357383159108872,-2.6873309831643198e-22,0.9829676031741192,-0.1674128881183488 +22.5,0.32639908579236976,-1.4447002329499006e-22,0.9435082240694782,-0.1639866666446524 +23.0,0.3007528292496125,1.7475157555413111e-22,0.8452830724456972,-0.1548046642146233 +23.5,0.2623566970018081,6.243811296520686e-22,0.7075820649887283,-0.14151187381485175 +24.0,0.2147678397681492,1.1398680704199594e-21,0.5496951183845231,-0.125753288431928 +24.5,0.16154340826782848,1.6566618292789405e-21,0.3909121493190337,-0.10917390105244226 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/13.csv b/data/TUDELFT_V3_KITE/polars_CFD/13.csv new file mode 100644 index 00000000..551a1596 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/13.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1262828136989528,-8.90890973272729e-22,-0.3618057217093356,0.0652837657478573 +-9.5,0.11304288521568887,-8.005712992452283e-22,-0.2848783004875012,0.05466337653779053 +-9.0,0.10069754455832569,-7.232286273831203e-22,-0.21925071686744477,0.04607815600349937 +-8.5,0.08936434571373618,-6.580457218216844e-22,-0.16416873028730544,0.03931206166870772 +-8.0,0.07916084266879322,-6.042053466961999e-22,-0.11887810018522227,0.03414905105713956 +-7.5,0.0702045894103697,-5.608902661419464e-22,-0.08262458599933437,0.03037308169251878 +-7.0,0.06261313992533853,-5.272832442942032e-22,-0.05465394716778091,0.027768111098569324 +-6.5,0.05650404820057258,-5.0256704528825e-22,-0.03421194312870082,0.02611809679901514 +-6.0,0.051994868222944746,-4.859244332593659e-22,-0.02054433332023335,0.02520699631758013 +-5.5,0.04920315397932791,-4.765381723428305e-22,-0.012896877180517477,0.024818767177988248 +-5.0,0.048246459456595,-4.735910266739232e-22,-0.0105153341476925,0.0247373669039634 +-4.5,0.048934196466045826,-4.9440478364657945e-22,-0.028822225215835943,0.028379107628998423 +-4.0,0.050653538989672876,-5.4643917607822e-22,-0.07458945288619455,0.03748345944158597 +-3.5,0.05288868427038805,-6.140838862393528e-22,-0.13408684885766076,0.0493191167979498 +-3.0,0.055123829551103225,-6.817285964004856e-22,-0.19358424482912692,0.06115477415431361 +-2.5,0.056843172074730275,-7.337629888321259e-22,-0.23935147249948552,0.07025912596690118 +-2.0,0.0575309090841811,-7.545767458047822e-22,-0.257658363567629,0.0739008666919362 +-1.5,0.05534424016878962,-7.226450311395619e-22,-0.2166627800827306,0.06506821585578282 +-1.0,0.05020304957785483,-6.430623231562405e-22,-0.1171155867805303,0.044129269345482156 +-0.5,0.0442355615442362,-5.401472758733277e-22,0.005823880610229537,0.019422536158273385 +0.0,0.0395700003007932,-4.38218543309333e-22,0.1169962863608067,-0.0007134747086043 +0.5,0.03635169412290441,-3.341647120526948e-22,0.21326261626848478,-0.01647149001444662 +1.0,0.033421359735121475,-2.161300968079546e-22,0.3112956434231583,-0.03187804852656176 +1.5,0.0309503040440634,-9.531694376777634e-23,0.405653713035001,-0.04434535925972918 +2.0,0.0291098339563492,1.7072500875176066e-23,0.4908951703141864,-0.0512856312287284 +2.5,0.02765989083631711,1.2474959110288278e-22,0.5682607929337151,-0.054415665872731105 +3.0,0.02627298337941483,2.363494158715772e-22,0.6425578421137709,-0.05716908997500104 +3.5,0.024989269488925596,3.48055331449975e-22,0.7136943883853029,-0.059533350566455735 +4.0,0.02384890706813262,4.560506941067921e-22,0.7815785022792597,-0.061495894678012704 +4.5,0.022892054020319148,5.565188601107438e-22,0.8461182543265907,-0.06304416934058947 +5.0,0.02215886824876838,6.456431857305465e-22,0.9072217150582446,-0.06416562158510355 +5.5,0.021689507656763557,7.196070272349154e-22,0.96479695500517,-0.06484769844247248 +6.0,0.0215241301475879,7.745937408925666e-22,1.0187520446983165,-0.0650778469436138 +6.5,0.02165411763893442,8.164868987086859e-22,1.0704458415395592,-0.06455656196963651 +7.0,0.022033107532964863,8.539492644032942e-22,1.120892328771565,-0.06318226522005999 +7.5,0.022644640959665528,8.873329818173593e-22,1.1694822656864685,-0.061239293953417304 +8.0,0.02347225904902272,9.169901947918499e-22,1.2156064115764043,-0.05901198542824155 +8.5,0.02449950293102275,9.432730471677336e-22,1.2586555257335075,-0.0567846769030658 +9.0,0.02570991373565192,9.665336827859786e-22,1.2980203674499124,-0.05484170563642313 +9.5,0.027087032592896534,9.871242454875525e-22,1.3330916960177543,-0.053467408886846604 +10.0,0.0286144006327429,1.005396879113424e-21,1.3632602707291677,-0.0529461239128693 +10.5,0.031027921829591777,1.0232344373427674e-21,1.3920791884568988,-0.05366950970658015 +11.0,0.034938473466339874,1.0400766999684776e-21,1.41971245464649,-0.05558944213872687 +11.5,0.04014205663571744,1.0526112000021016e-21,1.4404671914492702,-0.05833058378583077 +12.0,0.0464346724304547,1.0575254704551881e-21,1.448650521016568,-0.0615175972244131 +12.5,0.055741800114982906,1.0379754135030301e-21,1.4228369395708806,-0.06606214103381651 +13.0,0.06917968908334961,9.906878094350403e-22,1.3605781234604184,-0.07269575883093565 +13.5,0.08533049562270952,9.327065084339454e-22,1.2846469650250802,-0.08077294074861988 +14.0,0.1027763760202174,8.810753606824727e-22,1.217816356604766,-0.0896481769197185 +14.5,0.12392123715951814,8.341771078591854e-22,1.157248428098742,-0.10150823640546885 +15.0,0.14938374507961885,7.8494954237777105e-22,1.093667782204517,-0.1164579441676835 +15.5,0.17506819480071745,7.422690905236417e-22,1.0401910204593534,-0.13072887419007467 +16.0,0.196878881343012,7.150121785822103e-22,1.0099347444005136,-0.1405526004563546 +16.5,0.21452402904177353,6.992052784525968e-22,0.997986950424755,-0.14645407854911663 +17.0,0.23050912121854622,6.8599233135770905e-22,0.9895901191867438,-0.15135425985581047 +17.5,0.2449343413729379,6.769259675686408e-22,0.9830925786106045,-0.15507871206743296 +18.0,0.2578998730045564,6.735588173564861e-22,0.9768426566204622,-0.1574530028749809 +18.5,0.26975849293055637,6.750395731794148e-22,0.9703875573676783,-0.15901253326213705 +19.0,0.28067397821663753,6.798855058313571e-22,0.9644401514188011,-0.1603101143106181 +19.5,0.29046301273522535,6.887021130870468e-22,0.959097266320736,-0.16119742885847166 +20.0,0.2989422803587452,7.020948927212181e-22,0.9544557296203876,-0.1615261597437456 +20.5,0.3059284649596226,7.206693425086048e-22,0.9506123688646612,-0.16114798980448758 +21.0,0.311238250410283,7.450309602239411e-22,0.9476640116004615,-0.15991460187874534 +21.5,0.31468832058315177,7.75785243641961e-22,0.9457074853746941,-0.15767767880456665 +22.0,0.31609535935065436,8.135376905373984e-22,0.9448396177342633,-0.1542889034199992 +22.5,0.3152760505852163,8.588937986849874e-22,0.9451572362260746,-0.14959995856309077 +23.0,0.3120470781592629,9.124590658594618e-22,0.9467571683970328,-0.14346252707188903 +23.5,0.3062251259452196,9.748389898355561e-22,0.949736241794043,-0.13572829178444176 +24.0,0.29762687781551195,1.0466390683880038e-21,0.9541912839640102,-0.12624893553879668 +24.5,0.2860690176425653,1.128464799291539e-21,0.9602191224538394,-0.11487614117300157 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/14.csv b/data/TUDELFT_V3_KITE/polars_CFD/14.csv new file mode 100644 index 00000000..c6677eba --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/14.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1379732306581158,-4.769293038033376e-22,-0.4080362479970993,0.0674213058779759 +-9.5,0.13268414713046026,-4.75417641596303e-22,-0.4065829051789078,0.0680801363138168 +-9.0,0.12734677769483002,-4.709684480026902e-22,-0.4023810830160209,0.06860768688421344 +-8.5,0.12196318115457538,-4.637104125637368e-22,-0.39566809094596966,0.06901854424088175 +-8.0,0.11653541631304658,-4.537722248206797e-22,-0.38668123840628527,0.06932729503553783 +-7.5,0.11106554197359379,-4.412825743147561e-22,-0.3756578348344989,0.06954852591989769 +-7.0,0.1055556169395673,-4.263701505872032e-22,-0.36283518966814166,0.06969682354567738 +-6.5,0.10000770001431733,-4.091636431792582e-22,-0.34845061234474484,0.06978677456459294 +-6.0,0.09442385000119412,-3.8979174163215814e-22,-0.33274141230183957,0.06983296562836037 +-5.5,0.08880612570354791,-3.683831354871403e-22,-0.31594489897695693,0.06984998338869576 +-5.0,0.0831565859247289,-3.4506651428544187e-22,-0.2982983818076282,0.0698524144973151 +-4.5,0.07711517892920919,-3.0468109021438077e-22,-0.27505328354015257,0.06806491766875299 +-4.0,0.07059982910905979,-2.370540982568319e-22,-0.2426753016015593,0.0632867534153144 +-3.5,0.06402955945902943,-1.4979626214736736e-22,-0.2032231574504741,0.0563944110853709 +-3.0,0.057823392973866794,-5.051830562055942e-23,-0.1587555725455228,0.04826438002729407 +-2.5,0.05240035264832059,5.31690475890197e-23,-0.1113312683453313,0.03977314958945548 +-2.0,0.0481794614771395,1.5365507374679786e-22,-0.0630089663085254,0.0317972091202267 +-1.5,0.044854427908261434,2.554218718152482e-22,-0.011192561842120904,0.02332154267081676 +-1.0,0.04182733020799727,3.6638958919877897e-22,0.04709197942287028,0.013223786658730492 +-0.5,0.0390797460986552,4.841045748257206e-22,0.11035283069182807,0.002219408981783149 +0.0,0.0365932533025434,6.061131776244034e-22,0.17709816517013238,-0.008976122462209999 +0.5,0.034349429541970074,7.299617465231578e-22,0.24583615606316314,-0.019647339775433696 +1.0,0.032329852539243406,8.531966304503146e-22,0.3150749765763003,-0.029078775060072667 +1.5,0.030516100016671585,9.733641783342037e-22,0.38332279991492363,-0.036554960418311654 +2.0,0.0288897496965628,1.0880107391031554e-21,0.4490877992844132,-0.0413604279523354 +2.5,0.027323192765302866,1.206188356552083e-21,0.5141309595077769,-0.0445092753528612 +3.0,0.02574617150111474,1.3341515214204867e-21,0.580627776240876,-0.04744923189622379 +3.5,0.024226290264062315,1.4652502530535783e-21,0.6477081889383708,-0.05011527706303404 +4.0,0.02283115341420948,1.5928345707965697e-21,0.7145021370549218,-0.05244239033390286 +4.5,0.02162836531162013,1.7102544939946733e-21,0.780139560045189,-0.054365551189441155 +5.0,0.02068553031635815,1.8108600419931e-21,0.8437503973638328,-0.05581973911025977 +5.5,0.020070252788487442,1.8880012341370623e-21,0.9044645884655131,-0.05673993357696963 +6.0,0.0198501370880719,1.935028089771772e-21,0.9614120728048908,-0.0570611140701816 +6.5,0.019993747200714986,1.963757541640672e-21,1.0159846853392835,-0.056830638658244836 +7.0,0.020409491384349405,1.990135846958388e-21,1.0697748886429215,-0.05622302166313881 +7.5,0.0210747404075329,2.0137070117769047e-21,1.1222135635958328,-0.05536397694591997 +8.0,0.021966865038823218,2.0340150421482086e-21,1.1727315910780458,-0.0543792183676447 +8.5,0.023063236046778103,2.050603944124285e-21,1.2207598519695888,-0.05339445978936943 +9.0,0.0243412241999553,2.0630177237571194e-21,1.26572922715049,-0.052535415072150586 +9.5,0.025778200266912552,2.070800387098697e-21,1.3070705975007773,-0.05192779807704456 +10.0,0.0273515350162076,2.073495940201004e-21,1.3442148439004793,-0.0516973226651078 +10.5,0.029656827846329177,2.0722505052042996e-21,1.3817182169065856,-0.05236360991417095 +11.0,0.0332067364617409,2.068718799790762e-21,1.418912866053609,-0.0540973623682873 +11.5,0.03785421908996285,2.0632077233252513e-21,1.447393520687861,-0.05650091608784721 +12.0,0.0434522339585151,2.056024175172632e-21,1.4587549101556536,-0.059176607133241 +12.5,0.051064465818422826,2.025159928118171e-21,1.438637606857219,-0.06224029483963133 +13.0,0.061716679514646135,1.96755131406861e-21,1.388192873231594,-0.06624194317098496 +13.5,0.07520495341560753,1.9119220710710205e-21,1.3222814736832953,-0.07143504513089836 +14.0,0.0913253658897295,1.8869959371724746e-21,1.2557641726168405,-0.0780730937229681 +14.5,0.11761425817463131,2.028036293125909e-21,1.1714484583994988,-0.09242876819835062 +15.0,0.15461017384704182,2.348381292942474e-21,1.0663805499192498,-0.11476230247805443 +15.5,0.191612494784048,2.6938668345565635e-21,0.9767793073616737,-0.13630852157045412 +16.0,0.2179206028627367,2.9103288159025704e-21,0.9388635909123528,-0.1483022504839243 +16.5,0.2336670726857012,3.006007896257077e-21,0.940718319004933,-0.15137777307000874 +17.0,0.2465146027444974,3.0857710556898667e-21,0.9447987208086092,-0.15302364088604678 +17.5,0.25705776074965636,3.1403936733251324e-21,0.9488791226122855,-0.1547560804991065 +18.0,0.265891114411709,3.1606511282870666e-21,0.9507338507048656,-0.1580913184762559 +18.5,0.2722004041887416,2.9426568854618443e-21,0.8700606902517366,-0.18882342673677785 +19.0,0.27660688294742974,2.4630695512463557e-21,0.6925797372548527,-0.2503994050905774 +19.5,0.2818583870111884,1.983482217030867e-21,0.5150987842579688,-0.31081487194065605 +20.0,0.2907027527034328,1.7654879742056448e-21,0.4344256238048398,-0.3380654456900153 +20.5,0.3268068797947801,2.0646665900525184e-21,0.5538714194903712,-0.3217394158832974 +21.0,0.40356616733718964,2.8851184671506713e-21,0.8805082496363184,-0.2746077435016376 +21.5,0.5083212005760898,4.111217649836403e-21,1.3667852788767105,-0.19944005410277652 +22.0,0.6284125647569089,5.627338182446014e-21,1.9651516718455766,-0.09900597324445481 +22.5,0.7511808451250754,7.317854109315802e-21,2.6280565931769457,0.023924873515586774 +23.0,0.8639666269260176,9.067139474782067e-21,3.3079492075048487,0.16658286061960767 +23.5,0.9541104954051637,1.0759568323181111e-20,3.957278679463312,0.32619836250986706 +24.0,1.008953035807942,1.2279514698849226e-20,4.528494173686367,0.5000017536286244 +24.5,1.0158348333797813,1.3511352646122724e-20,4.974044854808042,0.6852234084181389 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/15.csv b/data/TUDELFT_V3_KITE/polars_CFD/15.csv new file mode 100644 index 00000000..d7918746 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/15.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.0940982450065733,-6.6387574576228175e-22,-0.2305337232124537,0.0463326586318861 +-9.5,0.08583444242247172,-6.254029935251643e-22,-0.18504587991858884,0.04112268748001128 +-9.0,0.0781658310151874,-5.915254158650829e-22,-0.14674316517662694,0.03695086556135136 +-8.5,0.07115710879474521,-5.621145481643996e-22,-0.11506101176468665,0.033701842961104705 +-8.0,0.06487297377117009,-5.370419258054769e-22,-0.08943485246088663,0.031260269764469634 +-7.5,0.0593781239544869,-5.161790841706766e-22,-0.0693001200433456,0.029510796056644514 +-7.0,0.05473725735472057,-4.993975586423611e-22,-0.05409224729018225,0.028338071922827668 +-6.5,0.051015071981896004,-4.865688846028927e-22,-0.043246666979515215,0.027626747448217442 +-6.0,0.048276265846038106,-4.775645974346335e-22,-0.0361988118894633,0.027261472718012204 +-5.5,0.04658553695717176,-4.722562325199457e-22,-0.032384114798145125,0.02712689781741027 +-5.0,0.0460075833253219,-4.7051532524119145e-22,-0.0312380084836793,0.02710767283161 +-4.5,0.04652320974023049,-4.771941467382019e-22,-0.04324372795059549,0.0292075390704142 +-4.0,0.047812275777501974,-4.938912004807278e-22,-0.07325802661788595,0.034457204667424704 +-3.5,0.0494880616259549,-5.155973703460114e-22,-0.11227661488536356,0.041281769943538354 +-3.0,0.051163847474407824,-5.373035402112951e-22,-0.15129520315284117,0.048106335219652 +-2.5,0.05245291351167931,-5.54000593953821e-22,-0.1813095018201316,0.0533560008166625 +-2.0,0.0529685399265879,-5.6067941545083135e-22,-0.1933152212870478,0.0554558670554667 +-1.5,0.05220922996446081,-5.463094868753852e-22,-0.17412976860746718,0.05138234162826029 +-1.0,0.05016728083794146,-5.070907610326474e-22,-0.12201190491091589,0.04062039578401084 +-0.5,0.04719666368682268,-4.488598277480185e-22,-0.045119371710679854,0.025357975178773022 +0.0,0.04365134965089734,-3.7745327684689967e-22,0.04839008947995503,0.007783025468601497 +0.5,0.039885309869958294,-2.9870769815469145e-22,0.15035873714770287,-0.009916507690449064 +1.0,0.03625251548379838,-2.184596814967948e-22,0.2526288297792776,-0.025552678642323995 +1.5,0.03310693763221047,-1.4254581669861038e-22,0.34704262586139345,-0.03693754173096861 +2.0,0.0308025474549874,-7.680269358553908e-23,0.4254423838807646,-0.0418831513003283 +2.5,0.029005165253380084,-1.7087007982122277e-23,0.4921926945745473,-0.0428248427362347 +3.0,0.027196244792051866,4.394280699451205e-23,0.5570869297644646,-0.043653921654866173 +3.5,0.025453207405914297,1.052475555800831e-22,0.6201105195640809,-0.044366397745688 +4.0,0.023853474429878906,1.657880420103101e-22,0.6812488940869604,-0.044958280698165494 +4.5,0.022474467198857224,2.2452507052091233e-22,0.7404874834466673,-0.04542558020176396 +5.0,0.021393607047760787,2.8041944534760876e-22,0.7978117177567657,-0.04576430594594867 +5.5,0.020688315311501136,3.3243197072611887e-22,0.8532070271308199,-0.04597046762018495 +6.0,0.0204360133249898,3.7952345089216177e-22,0.906658841682394,-0.0460400749139381 +6.5,0.020589580026134775,4.2340558918515234e-22,0.9592205604982088,-0.045773916346468206 +7.0,0.02103836003310536,4.661347323628927e-22,1.0114816395935013,-0.04507222557768394 +7.5,0.021764473201205028,5.071886497886821e-22,1.0627315944746099,-0.04408018000802343 +8.0,0.02275003938573726,5.460451108258204e-22,1.1122599406478724,-0.0429429570379248 +8.5,0.023977178442005538,5.821818848376072e-22,1.1593561936196268,-0.041805734067826165 +9.0,0.025428010225313335,6.150767411873423e-22,1.203309868896212,-0.040813688498165655 +9.5,0.02708465459096413,6.442074492383251e-22,1.2434104819839655,-0.04011199772938139 +10.0,0.0289292313942614,6.690517783538552e-22,1.2789475483892263,-0.0398458391619115 +10.5,0.0316783836333147,6.925365918586435e-22,1.3142656963029624,-0.041065755912463246 +11.0,0.03620192208212361,7.14917999969603e-22,1.3490416173438842,-0.04442700889897218 +11.5,0.04271171825982673,7.316676423883365e-22,1.375562922159941,-0.04948185222371885 +12.0,0.0514196436855626,7.38257158816447e-22,1.386117221399082,-0.0557825399889838 +12.5,0.08235704267055245,6.766959086551908e-22,1.3188986840828263,-0.07372130597546064 +13.0,0.13757842238122545,5.4126115830042735e-22,1.1568330033431473,-0.10437992138687346 +13.5,0.19033039861953216,4.0582640794566387e-22,0.9593050759936772,-0.13334494646004852 +14.0,0.2138595871874232,3.4426515778440774e-22,0.7856997988480475,-0.1462029414318122 +14.5,0.2052704662329156,4.9756537554412555e-22,0.6218757877044521,-0.14407290172440926 +15.0,0.18637440013299889,8.348258546155047e-22,0.445866645559457,-0.13938681436812278 +15.5,0.16747833403308213,1.172086333686884e-21,0.3053197500242533,-0.13470072701183633 +16.0,0.1588892130785745,1.3253865514466016e-21,0.2478824787100319,-0.1325706873044334 +16.5,0.19301557623710724,1.2666307893040179e-21,0.3662405024082153,-0.14187864629670435 +17.0,0.2842344057938947,1.0894310210721565e-21,0.690498413070199,-0.16672763487013192 +17.5,0.41580531187072056,7.923885240448519e-22,1.174431970047134,-0.202505320419638 +18.0,0.5709879045893688,3.741045755159386e-22,1.7718169326901698,-0.2445993703401445 +18.5,0.7330417940716232,-1.6681954722074887e-22,2.436429060350458,-0.28839745202657335 +19.0,0.8852265904392671,-8.317825668713759e-22,3.1220441123791494,-0.3292872328738464 +19.5,1.0108019038140852,-1.6221832061421082e-21,3.7824378481273926,-0.36265638027688585 +20.0,1.0930273443178606,-2.539420187739111e-21,4.37138602694634,-0.38389256163061325 +20.5,1.1151625220723775,-3.58489223436855e-21,4.842664408187141,-0.38838344432995064 +21.0,1.0604670471994195,-4.759998068736591e-21,5.150048751200946,-0.37151669576982005 +21.5,0.9122005298207698,-6.066136413549397e-21,5.247314815338907,-0.32867998334514326 +22.0,0.6536225800582134,-7.504705991513138e-21,5.088238359952173,-0.2552609744508423 +22.5,0.26799280803353387,-9.077105525333977e-21,4.626595144391892,-0.14664733648183947 +23.0,-0.261429176131486,-1.0784733737718078e-20,3.816160928009225,0.0017732631669442611 +23.5,-0.9513837623150625,-1.262898935137161e-20,2.6107114701553087,0.19461315710058624 +24.0,-1.8186113403954103,-1.4611271089000735e-20,0.9640225301813032,0.4364846779241649 +24.5,-2.8798523002507466,-1.6732977673311622e-20,-1.1701301325616456,0.7320001582427578 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/16.csv b/data/TUDELFT_V3_KITE/polars_CFD/16.csv new file mode 100644 index 00000000..3a50134a --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/16.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1231338580385625,1.7408115791459014e-21,-0.3787115745397631,0.0650817063396765 +-9.5,0.11943830815587407,1.8703962233746042e-21,-0.3975487386773425,0.07640319010670645 +-9.0,0.1157239164234697,1.9751938249796966e-21,-0.41263237195355906,0.08546873245890386 +-8.5,0.11199143851457048,2.0578298119123095e-21,-0.42437953335300893,0.09252899355347238 +-8.0,0.10824163010239754,2.1209296121235734e-21,-0.4332072818602878,0.09783463354761555 +-7.5,0.10447524686017197,2.167118653564618e-21,-0.4395326764599916,0.10163631259853706 +-7.0,0.10069304446111482,2.1990223641865743e-21,-0.44377277613671606,0.10418469086344047 +-6.5,0.09689577857844725,2.2192661719405724e-21,-0.44634463987505724,0.10573042849952945 +-6.0,0.09308420488539035,2.2304755047777427e-21,-0.4476653266596106,0.10652418566400756 +-5.5,0.0892590790551652,2.2352757906492163e-21,-0.4481518954749725,0.10681662251407845 +-5.0,0.0854211567609929,2.2362924575061226e-21,-0.4482214053057385,0.1068583992069457 +-4.5,0.08163301564674015,2.2081666261263625e-21,-0.43818829994216313,0.10397659190500223 +-4.0,0.077903476838766,2.1329910951266565e-21,-0.4109082221049922,0.09627496390587037 +-3.5,0.07415266123403014,2.0245688092163642e-21,-0.37061002917455876,0.08516920606959795 +-3.0,0.07030068972949226,1.8967027131048462e-21,-0.32152257853119554,0.07207500925623282 +-2.5,0.06626768322211206,1.7631957515014632e-21,-0.26787472755523556,0.05840806432582283 +-2.0,0.0619737626088492,1.637850869115575e-21,-0.2138953336270116,0.0455840621384158 +-1.5,0.0569703723547948,1.507810663180899e-21,-0.14922688589082425,0.031105028509893273 +-1.0,0.051393327191565905,1.3620725349859786e-21,-0.06883331433500563,0.014240514100711931 +-0.5,0.04603930341591112,1.2172216353224124e-21,0.015074362394063887,-0.0009425029622176506 +0.0,0.0417049773245791,1.0898431149817988e-21,0.0902851256500038,-0.0103770445519849 +0.5,0.03829847167481512,9.829151709170038e-22,0.153152582466517,-0.014713640767318537 +1.0,0.035265688689856405,8.857093936072657e-22,0.21098850366069166,-0.01780232090888724 +1.5,0.032709973865439425,7.942510241337392e-22,0.26801911626122554,-0.0203753556526904 +2.0,0.0307346726973007,7.045653035775799e-22,0.3284706472968163,-0.0231650156747274 +2.5,0.029092036856673133,6.1265116622114685e-22,0.39466781085114927,-0.026628032269878612 +3.0,0.027500022968284913,5.186591865708478e-22,0.46503601635920844,-0.030544835322696473 +3.5,0.026010533958115457,4.248420660439105e-22,0.5379525338766394,-0.03463324339368847 +4.0,0.02467547275214418,3.334525060575629e-22,0.6117946334590877,-0.0386110750433621 +4.5,0.0235467422763505,2.46743208029033e-22,0.6849395851621989,-0.04219614883222485 +5.0,0.02267624545671383,1.6696687337554866e-22,0.7557646590416187,-0.0451062833207842 +5.5,0.022115885219213594,9.63762035143379e-23,0.8226471251529928,-0.047059297069547666 +6.0,0.0219175644898292,3.722389986262844e-23,0.8839642535519665,-0.0477730086390227 +6.5,0.022037917066248976,-1.3185595683847989e-23,0.9415488306648759,-0.047572919588802484 +7.0,0.02238856185063743,-5.933515899032881e-23,0.997963081364459,-0.04704541209276737 +7.5,0.022953879425688214,-1.0165306528103955e-22,1.0526784333759636,-0.04629962563285566 +8.0,0.023718250374095008,-1.4056758978020571e-22,1.105166314424638,-0.045444699691005654 +8.5,0.024666055278551476,-1.7650700771205272e-22,1.1548981522357304,-0.04458977374915564 +9.0,0.025781674721751288,-2.0989959430080624e-22,1.2013453745344889,-0.04384398728924393 +9.5,0.027049489286388104,-2.411736247706916e-22,1.2439794090461622,-0.04331647979320881 +10.0,0.0284538795551556,-2.7075737434593453e-22,1.2822716834959982,-0.0431163907429886 +10.5,0.03049587635854482,-3.020476387878988e-22,1.3172681227000362,-0.04357993428981461 +11.0,0.03377878148675248,-3.3334044276342443e-22,1.3494518662840937,-0.04491770058300778 +11.5,0.038440381962030715,-3.5741290485495083e-22,1.3774501641880847,-0.0470503931016408 +12.0,0.0446184648066317,-3.670421436449176e-22,1.399890266351924,-0.0498987153247864 +12.5,0.059765326016202804,-3.0309152311341476e-22,1.4196029559779568,-0.06741745389941733 +13.0,0.08657792973635095,-1.4967450248219502e-22,1.4380064259327072,-0.10193451835132677 +13.5,0.11806106521426764,3.5556656803808714e-23,1.4516090406523574,-0.13593029647781799 +14.0,0.1472195216971444,1.9494969329966328e-22,1.4569191645730892,-0.1518851760761942 +14.5,0.17770480514643663,3.392165587918537e-22,1.3863484402873776,-0.15285041881139422 +15.0,0.21140873464679957,4.91170141869796e-22,1.2173289160210141,-0.15355102534872178 +15.5,0.23869656913022397,6.113095862929545e-22,1.0138995646601563,-0.15397799198602768 +16.0,0.2499335675287008,6.60134035820793e-22,0.8400993590909616,-0.1541223150211628 +16.5,0.2435279184344454,3.7983747169147836e-22,0.7061270139311068,-0.15024669262599213 +17.0,0.22759106445831925,-2.3681496939301385e-22,0.5790498890989269,-0.1416939903176794 +17.5,0.20704314556028258,-8.53467410477506e-22,0.4582099254315664,-0.13307545541202362 +18.0,0.1868043017002955,-1.1337639746068209e-21,0.3429490637661702,-0.1290023352248238 +18.5,0.16732325693801695,-8.992470377401775e-22,0.23247719136849695,-0.12877015889500856 +19.0,0.14590365994173887,-2.4020470394567187e-22,0.12669033296091176,-0.12860170047559896 +19.5,0.12274803758437097,7.766003115685592e-22,0.02595963556546829,-0.12849907465353236 +20.0,0.0980589167388229,2.0844052935943786e-21,-0.06934375379577962,-0.1284643961157463 +20.5,0.07203882427800441,3.616447526923649e-21,-0.1588486881007783,-0.1284997795491782 +21.0,0.04489028707482518,5.3059642963482374e-21,-0.24218402032747408,-0.1286073396407655 +21.5,0.016815832002194903,7.08619288666e-21,-0.31897860345381296,-0.12878919107744566 +22.0,-0.011982014066976715,8.890370582650808e-21,-0.3888612904577414,-0.12904744854615618 +22.5,-0.041300724259779986,1.0651734669112518e-20,-0.4514609343172057,-0.12938422673383446 +23.0,-0.07093777170330517,1.2303522430836996e-20,-0.5064063880101519,-0.12980164032741798 +23.5,-0.10069062952464264,1.3778971152616107e-20,-0.5533265045145265,-0.1303018040138442 +24.0,-0.1303567708508826,1.5011318119241708e-20,-0.5918501368082759,-0.13088683248005056 +24.5,-0.15973366880911544,1.593380061550567e-20,-0.6216061378693458,-0.13155884041297453 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/17.csv b/data/TUDELFT_V3_KITE/polars_CFD/17.csv new file mode 100644 index 00000000..48e40937 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/17.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1173361087348235,-5.7736750521880425e-22,-0.3582621464079576,0.0656443151844469 +-9.5,0.108551107621824,-5.433183423918373e-22,-0.3212594091978243,0.06564631541625518 +-9.0,0.1002287848530749,-5.16053883596812e-22,-0.2909643828536245,0.06565246781314978 +-8.5,0.09247797241640979,-4.948202728301795e-22,-0.26671457524272446,0.06566299992733529 +-8.0,0.08540750229966217,-4.788636540883906e-22,-0.24784749423249003,0.0656781393110163 +-7.5,0.07912620649066567,-4.674301713678962e-22,-0.2337006476902874,0.06569811351639747 +-7.0,0.07374291697725385,-4.597659686651471e-22,-0.22361154348348256,0.06572315009568333 +-6.5,0.06936646574726031,-4.551171899765944e-22,-0.2169176894794415,0.06575347660107853 +-6.0,0.06610568478851858,-4.527299792986889e-22,-0.2129565935455305,0.06578932058478765 +-5.5,0.06406940608886225,-4.518504806278818e-22,-0.21106576354911544,0.0658309095990153 +-5.0,0.0633664616361249,-4.517248379606235e-22,-0.2105827073575624,0.0658784711959661 +-4.5,0.06351579162887748,-5.072753009721692e-22,-0.22237258434123447,0.06725305419077315 +-4.0,0.0638891166107589,-6.461514585010337e-22,-0.25184727680041474,0.07061146674675965 +-3.5,0.06437443908720475,-8.266904632885572e-22,-0.290164376997349,0.07495757543841526 +-3.0,0.0648597615636506,-1.007229468076081e-21,-0.3284814771942833,0.07929524684022968 +-2.5,0.06523308654553203,-1.1461056256049454e-21,-0.3579561696534635,0.08262834752669257 +-2.0,0.0653824165382846,-1.201656088616491e-21,-0.3697460466371356,0.0839607440722936 +-1.5,0.06288170069168908,-1.1710167119960766e-21,-0.33326436027913586,0.07607144335365223 +-1.0,0.05697101447834535,-1.092122721455453e-21,-0.24419500526541935,0.057342231803168095 +-0.5,0.05003754988791759,-9.845103259755489e-22,-0.13310153768640978,0.035181145329001164 +0.0,0.04446849891007,-8.677157345372933e-22,-0.0305475136325313,0.0169962198393114 +0.5,0.0404275191138051,-7.21552828034642e-22,0.06128698198309963,0.0029319572058106903 +1.0,0.03666361065943336,-5.314596837916121e-22,0.15680135176132992,-0.010658760883041024 +1.5,0.03344197942358092,-3.254088054342248e-22,0.2503012708826814,-0.022055328793961652 +2.0,0.0310278312828739,-1.3137269658850109e-22,0.3360924145276756,-0.0295371408936691 +2.5,0.029125881267875287,5.33672906814087e-23,0.4152520089692776,-0.03431826946525486 +3.0,0.027300429826081253,2.462793449008121e-22,0.4923737032106342,-0.03870907147762871 +3.5,0.025606060959517722,4.41515273327875e-22,0.5670378065275394,-0.042633368326236 +4.0,0.02409735867021063,6.332268832207635e-22,0.6388246281957874,-0.04601498140652208 +4.5,0.022828906960185896,8.155659818376439e-22,0.7073144774911723,-0.04877773211393231 +5.0,0.021855289831469463,9.826843764366815e-22,0.7720876636894882,-0.05084544184391204 +5.5,0.021231091286087255,1.1287338742760427e-21,0.8327244960665292,-0.05214193199190662 +6.0,0.0210108953260652,1.247866282613894e-21,0.8888052838980895,-0.0525910239533614 +6.5,0.02117165052900163,1.3439974682155057e-21,0.9435185033316995,-0.052481443198430955 +7.0,0.02164539209542233,1.4271704646875023e-21,0.9990325907867571,-0.05219254848088707 +7.5,0.022419333961744392,1.5007278295500812e-21,1.0533977959468583,-0.05178411112160088 +8.0,0.023480690064384923,1.5680121203234389e-21,1.1046643684955992,-0.051315902441443545 +8.5,0.024816674339761015,1.632365894527772e-21,1.1508825581165747,-0.050847693761286214 +9.0,0.026414500724289774,1.6971317096832774e-21,1.190102614493381,-0.05043925640200003 +9.5,0.028261383154388302,1.7656521233101528e-21,1.2203747873096147,-0.05015036168445614 +10.0,0.0303445355664737,1.8412696929285936e-21,1.2397493262488704,-0.0500407809295257 +10.5,0.0341193030193567,1.9244991277715296e-21,1.2525429841251148,-0.05205691630425331 +11.0,0.0407086070309884,2.0115807835502557e-21,1.2634304846556312,-0.05730660900372182 +11.5,0.04960102622649645,2.0994456875025155e-21,1.2709990338789894,-0.06459178889085976 +12.0,0.0602851392310085,2.185024866866055e-21,1.27383583783376,-0.0727143858285956 +12.5,0.0782299249195464,2.2755510159964347e-21,1.2326444352123247,-0.08508819289325627 +13.0,0.10472299936543637,2.3700252891662183e-21,1.1390196962518826,-0.10238448238438279 +13.5,0.13298089699126267,2.453031403488657e-21,1.0378858243082287,-0.1192914029997249 +14.0,0.1562201522196095,2.509153076077001e-21,0.9741670227371588,-0.1304971034370324 +14.5,0.17401904084544187,2.5455379236503805e-21,0.9455316316667128,-0.13686588727772347 +15.0,0.19022038417914106,2.576781690325055e-21,0.9215812628244315,-0.1423173965054416 +15.5,0.20443753491641556,2.5986402843099667e-21,0.9051400269653621,-0.1461227874212747 +16.0,0.21628384575297402,2.606869613814061e-21,0.8990320348445507,-0.1475532163263107 +16.5,0.22537266938452488,2.5972255870462813e-21,0.9060813972170443,-0.14587983952163733 +17.0,0.23131735850677676,2.5654641122155714e-21,0.9291122248378891,-0.14037381330834256 +17.5,0.2337312658154383,2.5073410975308756e-21,0.9709486284621321,-0.13030629398751417 +18.0,0.23222774400621787,2.418612451201137e-21,1.0344147188448196,-0.11494843786024009 +18.5,0.22642014577482414,2.2950340814353002e-21,1.1223346067409983,-0.09357140122760814 +19.0,0.21592182381696567,2.1323618964423085e-21,1.237532402905715,-0.06544634039070614 +19.5,0.20034613082835095,1.9263518044311066e-21,1.3828322180940158,-0.029844411650622044 +20.0,0.17930641950468865,1.6727597136106373e-21,1.561058163060948,0.013963228691556334 +20.5,0.1524160425416872,1.3673415321898448e-21,1.7750343485615576,0.06670542433474119 +21.0,0.11928835263505527,1.0058531683776739e-21,2.0275848853508913,0.1291110189778446 +21.5,0.07953670248050135,5.840505303830672e-22,2.321533884183996,0.20190885631977867 +22.0,0.03277444477373398,9.76895264149695e-23,2.659705455815918,0.28582778005945564 +22.5,-0.021385067789538248,-4.574739353176755e-22,3.044923711001704,0.38159663389578763 +23.0,-0.0833284825136068,-1.085683946605924e-21,3.480012760496401,0.48994426152768666 +23.5,-0.15344244670276308,-1.7911845992408332e-21,3.967796715055055,0.6115995066540649 +24.0,-0.23211360766129857,-2.5782199850134575e-21,4.511099685432713,0.7472912129738347 +24.5,-0.31972861269350467,-3.451034195714854e-21,5.112745782384421,0.8977482241859079 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/18.csv b/data/TUDELFT_V3_KITE/polars_CFD/18.csv new file mode 100644 index 00000000..1006dc7e --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/18.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1028496958630713,-4.970266483175547e-24,-0.4060358502753723,0.0550990480582689 +-9.5,0.09718397464482088,-9.302148562803722e-24,-0.44385293131942416,0.05373034384880077 +-9.0,0.09161770067015865,-2.198289573554086e-23,-0.4741345054395691,0.051142423233670554 +-8.5,0.08614883239399174,-4.2540159402165874e-23,-0.4977178511829077,0.04746457914466703 +-8.0,0.08077532827122724,-7.050159096345767e-23,-0.5154402470965408,0.04282610451357895 +-7.5,0.07549514675677228,-1.053948418201952e-22,-0.5281389717275694,0.037356292272195106 +-7.0,0.07030624630553402,-1.4674756337315735e-22,-0.536651303623094,0.031184435352304266 +-6.5,0.0652065853724195,-1.94087407023123e-22,-0.5418145213302155,0.0244398266856952 +-6.0,0.0601941224123359,-2.4694202417087115e-22,-0.5444659033960346,0.017251759204156683 +-5.5,0.05526681588019032,-3.048390662171807e-22,-0.5454427283676522,0.009749525839477493 +-5.0,0.0504226242308899,-3.673061845628305e-22,-0.5455822747921689,0.0020624195234464 +-4.5,0.04545869302908035,-4.852772709800318e-22,-0.5164772120836574,-0.008610969179614437 +-4.0,0.0403444322748116,-6.841919162753791e-22,-0.4407589545148366,-0.023463020934474596 +-3.5,0.035336197076096976,-9.25336320401227e-22,-0.3358228979207768,-0.039950899652982895 +-3.0,0.030690342540949832,-1.1699966833099293e-21,-0.21906443813654838,-0.05553176924698816 +-2.5,0.026663223777383525,-1.3794592049538408e-21,-0.10787897099722171,-0.0676627936283392 +-2.0,0.0235111958934114,-1.5150100852853154e-21,-0.0196618923378672,-0.0738011367088848 +-1.5,0.020968129030845464,-1.593094370401261e-21,0.046979815213181356,-0.07586136438236886 +-1.0,0.018715346248367633,-1.6568047141524793e-21,0.10737788175953498,-0.07744631519450548 +-0.5,0.016930382029296108,-1.707398728122166e-21,0.1650449805640406,-0.0785455620350991 +0.0,0.0157907708569491,-1.7461340238935162e-21,0.2234937848895452,-0.079148677793954 +0.5,0.015069897202344137,-1.7793957856478226e-21,0.28376108109376574,-0.07947293908126997 +1.0,0.014469058596455508,-1.8093789788140737e-21,0.34394664603484254,-0.07972926704440202 +1.5,0.01405765911253655,-1.831055886847014e-21,0.4031576387262576,-0.07989770137888728 +2.0,0.0139051028238406,-1.8393987932013843e-21,0.4605012181814928,-0.079958281780263 +2.5,0.01396749043238531,-1.8315353606027955e-21,0.516687351824163,-0.07969968749033426 +3.0,0.01414662599466265,-1.8099484238780976e-21,0.57273004334973,-0.07900130796736232 +3.5,0.014430468615637434,-1.777643024633895e-21,0.6281925061794459,-0.07797924823156857 +4.0,0.014806977400274476,-1.7376242044767923e-21,0.6826379537345634,-0.07674961330317447 +4.5,0.015264111453538589,-1.6928970050133931e-21,0.7356295994363342,-0.07542850820240136 +5.0,0.01578982988039459,-1.646466467850302e-21,0.7867306567060111,-0.07413203794947074 +5.5,0.01637209178580729,-1.6013376345941228e-21,0.8355043389648463,-0.07297630756460392 +6.0,0.0169988562747415,-1.5605155468514597e-21,0.8815138596340918,-0.0720774220680224 +6.5,0.017799435656318363,-1.5175949498829897e-21,0.9288116136606078,-0.07131708154929928 +7.0,0.01891491736880297,-1.4669336832133196e-21,0.979706268880088,-0.07052660610605922 +7.5,0.020350923210876053,-1.412681429844948e-21,1.031145448047036,-0.06974653077060083 +8.0,0.02211307498121836,-1.358987872780374e-21,1.0800767739159551,-0.06901739057522278 +8.5,0.02420699447851064,-1.3100026950220963e-21,1.1234478692413494,-0.06837972055222372 +9.0,0.026638303501433622,-1.2698755795726137e-21,1.1582063567777219,-0.06787405573390225 +9.5,0.029412623848668065,-1.2427562094344249e-21,1.181299859279576,-0.06754093115255702 +10.0,0.0325355773188947,-1.232794267610029e-21,1.1896759995014154,-0.0674208818404867 +10.5,0.03720547442296395,-1.2470041563884788e-21,1.189133433306183,-0.06926799257142527 +11.0,0.04418321907887977,-1.2828706185025538e-21,1.1875712414485422,-0.07395317258364396 +11.5,0.05281832319605323,-1.3302488476203426e-21,1.1850876840205773,-0.08019219360624719 +12.0,0.0624602986838954,-1.3789940374099341e-21,1.1817810211143729,-0.0867008273683394 +12.5,0.07425662928034528,-1.433366612863428e-21,1.1679087624369973,-0.09414038496940347 +13.0,0.08890720354769406,-1.4986779338953496e-21,1.1392200860184896,-0.10324023424134397 +13.5,0.1050901406318811,-1.5663595965574256e-21,1.104050754435393,-0.1128182320118979 +14.0,0.1214835596788457,-1.6278431969013822e-21,1.0707365302642493,-0.1216922351088023 +14.5,0.13939683975521192,-1.6778081057743264e-21,1.0407056899781189,-0.12933055710680386 +15.0,0.15906505439755367,-1.722268328504924e-21,1.0096896000655085,-0.13646317069637642 +15.5,0.17755486445673516,-1.7696574128672416e-21,0.9774786581261287,-0.1438004213788477 +16.0,0.1919329307836206,-1.8284089066353454e-21,0.9438632617596906,-0.1520526546555453 +16.5,0.20323260609016608,-1.900079491549716e-21,0.9092321872293123,-0.16117875718311558 +17.0,0.21438892886492014,-1.9805971224651847e-21,0.8740961053107327,-0.17067076791950536 +17.5,0.22532108862363542,-2.0699522568273426e-21,0.8384282553725938,-0.180538760817993 +18.0,0.23594827488206474,-2.168135352081781e-21,0.8022018767835378,-0.190792809831857 +18.5,0.2461896771559607,-2.275136865674092e-21,0.7653902089122069,-0.2014429889143758 +19.0,0.2559644849610761,-2.3909472550498657e-21,0.7279664911272431,-0.21249937201882765 +19.5,0.26519188781316366,-2.515556977654694e-21,0.6899039627972886,-0.22397203309849115 +20.0,0.273791075227976,-2.6489564909341693e-21,0.6511758632909855,-0.23587104610664467 +20.5,0.281681236721266,-2.7911362523338815e-21,0.6117554319769761,-0.24820648499656658 +21.0,0.28878156180878634,-2.9420867192994227e-21,0.5716159082239023,-0.2609884237215353 +21.5,0.2950112400062896,-3.1017983492763852e-21,0.5307305314004064,-0.2742269362348293 +22.0,0.3002894608295286,-3.2702615997103588e-21,0.48907254087513036,-0.287932096489727 +22.5,0.304535413794256,-3.447466928046934e-21,0.4466151760167164,-0.30211397843950677 +23.0,0.30766828841622473,-3.633404791731706e-21,0.4033316761938067,-0.31678265603744704 +23.5,0.30960727421118717,-3.8280656482102625e-21,0.35919528077504337,-0.33194820323682633 +24.0,0.31027156069489625,-4.031439954928197e-21,0.3141792291290685,-0.3476206939909228 +24.5,0.30958033738310475,-4.2435181693311e-21,0.2682567606245242,-0.36381020225301514 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/19.csv b/data/TUDELFT_V3_KITE/polars_CFD/19.csv new file mode 100644 index 00000000..3dff7559 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/19.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.0249065318608897,-3.434761974054366e-21,-1.0732064541182402,0.0054067639622245 +-9.5,0.02368732717410199,-3.285535810591269e-21,-1.0370727681402365,0.005856429378175673 +-9.0,0.022526239330543277,-3.1355323293482928e-21,-0.9992907398617007,0.006221390021297906 +-8.5,0.021426932571819147,-2.9847827616087875e-21,-0.9599576821061372,0.0065104482864488155 +-8.0,0.020393071139535177,-2.833318338656105e-21,-0.9191709076970505,0.0067324065684860115 +-7.5,0.019428319275296937,-2.6811702917735944e-21,-0.8770277294579452,0.00689606726226711 +-7.0,0.01853634122071002,-2.5283698522446075e-21,-0.8336254602123256,0.007010232762649722 +-6.5,0.017720801217379997,-2.3749482513524935e-21,-0.7890614127836962,0.007083705464491463 +-6.0,0.01698536350691245,-2.2209367203806045e-21,-0.7434328999955613,0.0071252877626499485 +-5.5,0.016333692330912957,-2.06636649061229e-21,-0.6968372346714253,0.00714378205198279 +-5.0,0.0157694519309871,-1.9112687933309017e-21,-0.6493717296347931,0.0071479907273476 +-4.5,0.015264512821627229,-1.753587209885578e-21,-0.5997295153722275,0.007019656050549717 +-4.0,0.014795335035660093,-1.5927577702719893e-21,-0.5471734663994646,0.0066920925435352075 +-3.5,0.014372467092192868,-1.4310503787432801e-21,-0.4926555115837663,0.006251460991372781 +-3.0,0.014006457510332727,-1.270734939552596e-21,-0.4371275797923952,0.005783922179131149 +-2.5,0.013707854809186844,-1.1140813569530823e-21,-0.3815415998926136,0.005375636891879018 +-2.0,0.0134872075078624,-9.63359535197884e-22,-0.326849500751684,0.0051127659146851 +-1.5,0.013311001608156525,-8.1732760167012025e-22,-0.2729636358104737,0.004979180256224197 +-1.0,0.013154948085695,-6.747509165125448e-22,-0.21905465883191508,0.004881085033191886 +-0.5,0.013043432920327974,-5.379102331177564e-22,-0.16496194916636833,0.004788142192688031 +0.0,0.0130008420919056,-4.0908630487835364e-22,-0.1105248861641936,0.0046700136818125 +0.5,0.013008472038980978,-2.868074479317521e-22,-0.05531233073951359,0.004469827926878174 +1.0,0.013029472224410244,-1.6963327644127745e-22,0.00046483260117764075,0.0042125035054924945 +1.5,0.013061008164498086,-5.989149083839288e-23,0.05600418911896285,0.003990387591697167 +2.0,0.0131002453755492,4.009020844543824e-23,0.1105033240749248,0.0038958273595339 +2.5,0.013185614424258363,1.3202243421906704e-22,0.16450806207097474,0.003970882853718824 +3.0,0.013352844686835438,2.1941233713727904e-22,0.21880203583757452,0.004168756429297259 +3.5,0.013595049893857729,3.0262702353751317e-22,0.2729395428286329,0.004448508725804702 +4.0,0.01390534377590255,3.8203359975720814e-22,0.32647488049805873,0.00476920038277665 +4.5,0.014276840063547208,4.579991721338029e-22,0.37896234629976067,0.005089892039748598 +5.0,0.014702652487369012,5.308908470047359e-22,0.4299562376876474,0.00536964433625604 +5.5,0.015175894777945273,6.010757307074464e-22,0.47901085211562777,0.005567517911834477 +6.0,0.0156896806658533,6.6892092957937285e-22,0.5256804870376105,0.0056425734060194 +6.5,0.016341940804643375,7.3156512099210305e-22,0.5727462893873533,0.0056195012255208145 +7.0,0.017234713171497683,7.876526405209069e-22,0.621930082521374,0.005549483276391749 +7.5,0.01836727248244138,8.398090818087465e-22,0.6711971785277222,0.00543131744718224 +8.0,0.019738893453499624,8.906600384985838e-22,0.7185128894944469,0.005263801626442323 +8.5,0.02134885080069758,9.428311042333807e-22,0.7618425275095976,0.0050457337027220335 +9.0,0.0231964192400604,9.989478726560995e-22,0.7991514046612234,0.0047759115645714095 +9.5,0.025280873487613254,1.0616359374097021e-21,0.8284048330373738,0.004453133100540486 +10.0,0.0276014882593813,1.133520892137151e-21,0.8475681247260978,0.0040761961991793 +10.5,0.030975050921181396,1.2264041564916665e-21,0.8593005363065593,0.0027629989121379845 +11.0,0.03581847806179998,1.3389647073371338e-21,0.8683373609449135,6.549186061715782e-05 +11.5,0.04153123823171659,1.4541444741325102e-21,0.8757579656096959,-0.003366448212507423 +12.0,0.0475127999814107,1.5548853863367533e-21,0.8826417172694425,-0.00688294456436 +12.5,0.053571801638015296,1.635512500022655e-21,0.8901844683279677,-0.010397792492997496 +13.0,0.06018411355677091,1.707161865298813e-21,0.8977108722659604,-0.014341732275993314 +13.5,0.06775005233031844,1.777991902677891e-21,0.9034934976672677,-0.018840304639746397 +14.0,0.0766699345512988,1.856161032672556e-21,0.9058049131157374,-0.0240190503106557 +14.5,0.08866009838069593,1.954578481220623e-21,0.8829547896813587,-0.03087200721122547 +15.0,0.10378984545356934,2.066176426506049e-21,0.8310805080016944,-0.03937333265077761 +15.5,0.1199889375736733,2.1691477174107125e-21,0.7751962010119524,-0.04811874643593751 +16.0,0.135187136544762,2.241685202816492e-21,0.7403160016473408,-0.0557039683733306 +16.5,0.14905682221499592,2.2904946311980992e-21,0.7250755717384425,-0.06203650903058776 +17.0,0.16264419884911088,2.333059752262545e-21,0.7123987575512702,-0.06790859040127688 +17.5,0.17593976487572435,2.3637404167401576e-21,0.7037319686741754,-0.07324299943092888 +18.0,0.1889340187234538,2.376896475361265e-21,0.7005216146955101,-0.0779625230650747 +18.5,0.20161745882091656,2.366887778856196e-21,0.7042141052036259,-0.08198994824924521 +19.0,0.21398058359673008,2.328074177955278e-21,0.7162558497868752,-0.08524806192897134 +19.5,0.22601389147951179,2.2548155233888405e-21,0.738093258033609,-0.08765965104978403 +20.0,0.237707880897879,2.1414716658872103e-21,0.7711727395321798,-0.08914750255721415 +20.5,0.2490530502804493,1.9824024561807166e-21,0.816940703870939,-0.08963440339679263 +21.0,0.2600398980558399,1.771967744999687e-21,0.8768435606382389,-0.08904314051405038 +21.5,0.27065892265266833,1.5045273830744507e-21,0.9523277194224307,-0.08729650085451832 +22.0,0.28090062249955206,1.174441221135335e-21,1.0448395898118665,-0.08431727136372737 +22.5,0.29075549602510836,7.760691099126682e-22,1.1558255813948985,-0.08002823898720841 +23.0,0.3002140416579548,3.0377090013677857e-22,1.2867321037598782,-0.0743521906704924 +23.5,0.3092667578267086,-2.4809355746200518e-22,1.4390055664951573,-0.0672119133591102 +24.0,0.31790414295998726,-8.851644121533548e-22,1.6140923791890878,-0.05853019399859277 +24.5,0.3261166954864083,-1.613081813206943e-21,1.8134389514300215,-0.048229819534471 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/2.csv b/data/TUDELFT_V3_KITE/polars_CFD/2.csv new file mode 100644 index 00000000..4905b021 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/2.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1178787827507014,2.2656491307368418e-21,-0.2814872625103468,0.0602664033808302 +-9.5,0.11425070702325013,2.1965336476654047e-21,-0.28390112905595594,0.06969545594086327 +-9.0,0.11051217252803394,2.1307381956803045e-21,-0.2858340037437684,0.0772456566992661 +-8.5,0.10666907020883212,2.068483790282197e-21,-0.28733933011353946,0.083125766967331 +-8.0,0.10272729100942393,2.0099914469717408e-21,-0.28847055170502417,0.0875445480563502 +-7.5,0.0986927258735886,1.9554821812495914e-21,-0.28928111205797774,0.0907107612776159 +-7.0,0.0945712657451054,1.9051770086164073e-21,-0.28982445471215545,0.0928331679424204 +-6.5,0.09036880156775359,1.8592969445728453e-21,-0.2901540232073125,0.0941205293620559 +-6.0,0.08609122428531242,1.8180630046195626e-21,-0.29032326108320383,0.09478160684781467 +-5.5,0.08174442484156118,1.781696204257216e-21,-0.29038561187958495,0.09502516171098896 +-5.0,0.0773342941802791,1.7504175589864634e-21,-0.2903945191362108,0.095059955262871 +-4.5,0.07253031447556321,1.7253526692401192e-21,-0.2745948358205378,0.09167533293159699 +-4.0,0.06723758199264544,1.7056461348793126e-21,-0.23292329131324888,0.08279927138440048 +-3.5,0.06181540881200741,1.6885474705471688e-21,-0.17397114377393924,0.0703484787912198 +-3.0,0.056623107014130654,1.6713061908868147e-21,-0.10632965136220397,0.056239663321993275 +-2.5,0.052019988679496795,1.6511718105413758e-21,-0.038590072237638245,0.04238953314665919 +-2.0,0.0483653658885874,1.625393844153978e-21,0.0206563354401628,0.0307147964351559 +-1.5,0.045642053806600545,1.5902813989344427e-21,0.07051290167625157,0.02115302528836045 +-1.0,0.04339111841317892,1.5457961004140792e-21,0.11893654310024311,0.012046297952771883 +-0.5,0.04130924801047106,1.494666240718247e-21,0.17061638148938632,0.002918081816761451 +0.0,0.0390931309006255,1.4396201119723053e-21,0.2302415386209301,-0.0067081557312996 +0.5,0.036462423417599976,1.3736742329749775e-21,0.3060714613441239,-0.018083962671442286 +1.0,0.03364407781267026,1.296255999956878e-21,0.3960097443919017,-0.030615717640289385 +1.5,0.031095726263961898,1.2197100211912017e-21,0.48921173136703855,-0.042012199234357256 +2.0,0.0292750009496005,1.1563809049511437e-21,0.5748327658723098,-0.0499821860501623 +2.5,0.02799358779207589,1.1029276034293937e-21,0.6532385000149079,-0.05535670444683398 +3.0,0.02677938205997305,1.0491774469244461e-21,0.7313391037008331,-0.060412504674519786 +3.5,0.025664329950560255,9.972276108682038e-22,0.8081066972310716,-0.0650269511662631 +4.0,0.024680377661105767,9.491752706925688e-22,0.8825134009066102,-0.0690774083551073 +4.5,0.023859471388877878,9.07117601829444e-22,0.9535313350284356,-0.07244124067409578 +5.0,0.02323355733114485,8.731517797107315e-22,1.0201326198975342,-0.07499581255627194 +5.5,0.02283458168517497,8.49374979768334e-22,1.0812893758148927,-0.07661848843467914 +6.0,0.0226944906482365,8.378843774341533e-22,1.1359737230814977,-0.0771866327423608 +6.5,0.022893203611991576,8.340534714671192e-22,1.1884225553498546,-0.07701635802388944 +7.0,0.023476956661980564,8.315462014942222e-22,1.2420111644833516,-0.07656745194791952 +7.5,0.024427171036289122,8.298954042494568e-22,1.2944192680992985,-0.07593279163361719 +8.0,0.025725267973002897,8.286339164668178e-22,1.343326583815005,-0.07520525420014865 +8.5,0.027352668710207542,8.272945748802999e-22,1.3864128292477818,-0.07447771676668014 +9.0,0.029290794485988706,8.254102162238973e-22,1.4213577220149376,-0.07384305645237779 +9.5,0.03152106653843204,8.225136772316053e-22,1.4458409797337837,-0.07339415037640787 +10.0,0.0340249061056232,8.181377946374179e-22,1.457542320021629,-0.0732238756579365 +10.5,0.03849858183839283,7.9275456763298815e-22,1.4617528877090993,-0.0761492207035371 +11.0,0.04613539460875756,7.36526555847222e-22,1.4651180962766512,-0.08335533826277453 +11.5,0.056162313986581995,6.635224366699932e-22,1.4673490663163409,-0.09248735196930236 +12.0,0.0678063095417307,5.878108874911768e-22,1.4681569184202248,-0.1011903854567741 +12.5,0.08501082809500235,4.88558573628286e-22,1.4148850304856802,-0.1096983604071703 +13.0,0.10880087630697402,3.630471561533669e-22,1.2944012590266691,-0.11903372670223478 +13.5,0.13402576350717785,2.5251780608809346e-22,1.1657034425601276,-0.12802440027526601 +14.0,0.155534799025146,1.9821169445413952e-22,1.0877894196029902,-0.1354982970595625 +14.5,0.1727968353953193,1.8790460289143836e-22,1.0569838027259335,-0.14165399810879278 +15.0,0.18868905120004742,1.8095736859783313e-22,1.0318776476630602,-0.14725849486453269 +15.5,0.20317324484072613,1.759887459318623e-22,1.0148684576764448,-0.1519923188419416 +16.0,0.2162112147187511,1.7161748925206445e-22,1.0083537360281625,-0.1555360015561789 +16.5,0.22761979009035188,1.6790154963201164e-22,1.0079422100423099,-0.15798562518215736 +17.0,0.23778082594073893,1.650950477212625e-22,1.0076456685160524,-0.15988748491130844 +17.5,0.24750365926477927,1.6211099224233512e-22,1.0074662069210676,-0.1615974317835694 +18.0,0.2575976270573399,1.5786239191774787e-22,1.0074059207290331,-0.1634713168388777 +18.5,0.2683278487071045,1.4801805456464647e-22,1.0092813251643826,-0.16571087042326044 +19.0,0.27924894634246467,1.3317667651304118e-22,1.0136400584679663,-0.16809358626431037 +19.5,0.2901045110678487,1.1964609925474702e-22,1.018580900636086,-0.17033896047431304 +20.0,0.3006381339876852,1.13734164281579e-22,1.0222026316650434,-0.1721664891655542 +20.5,0.31077177760119146,1.176326755223857e-22,1.0241371724581798,-0.17352205362778814 +21.0,0.3206586887888566,1.2620940025216032e-22,1.02559927227967,-0.17464775348873388 +21.5,0.3303893852270171,1.3478612498193501e-22,1.0270619536670669,-0.1757074123676239 +22.0,0.340054384592009,1.3868463622274168e-22,1.0289982391579235,-0.1768648538836907 +22.5,0.3496712891607121,1.3680397007987672e-22,1.0317442024037942,-0.1781520924765998 +23.0,0.3591964411842704,1.3127879406820628e-22,1.0352270281298783,-0.17949021392963385 +23.5,0.3686284683004163,1.2228434181311712e-22,1.0393064054841965,-0.18087664887745095 +24.0,0.3779659981468824,1.099958469399959e-22,1.0438420236147694,-0.1823088279547092 +24.5,0.3872076583614013,9.458854307422935e-23,1.0486935716696177,-0.18378418179606673 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/3.csv b/data/TUDELFT_V3_KITE/polars_CFD/3.csv new file mode 100644 index 00000000..19ad454e --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/3.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1057662723266884,-5.817018081480684e-22,-0.2092124253447052,0.0469896304595866 +-9.5,0.10529570107159321,-4.7343894801723265e-22,-0.24661783481057126,0.06210020061946523 +-9.0,0.10424746743935359,-3.8497549958373854e-22,-0.2765697678515046,0.07419980845966324 +-8.5,0.10268430645370222,-3.1433216819484433e-22,-0.29989638851472,0.08362300534903407 +-8.0,0.10066895313837175,-2.595296591978084e-22,-0.3174258608474321,0.09070434265643106 +-7.5,0.09826414251709494,-2.1858867793988953e-22,-0.3299863488968558,0.09577837175070764 +-7.0,0.09553260961360444,-1.8952992976834585e-22,-0.33840601671020565,0.09917964400071722 +-6.5,0.09253708945163294,-1.7037412003043604e-22,-0.34351302833469666,0.10124271077531319 +-6.0,0.08934031705491317,-1.5914195407341858e-22,-0.3461355478175433,0.10230212344334895 +-5.5,0.08600502744717779,-1.5385413724455196e-22,-0.34710173920596055,0.10269243337367792 +-5.0,0.0825939556521595,-1.525313748910944e-22,-0.347239766547163,0.1027481919351535 +-4.5,0.0780802277541945,-1.7715964980900917e-22,-0.3269921175983495,0.09850291283585347 +-4.0,0.07195176440967913,-2.4181271019311396e-22,-0.27405300988443004,0.08745778522373591 +-3.5,0.06504349250043616,-3.326429094889496e-22,-0.200128202104186,0.07214887362747457 +-3.0,0.058190338908288466,-4.358026011420568e-22,-0.11692345295639879,0.05511224257574324 +-2.5,0.05222723051505886,-5.374441385979766e-22,-0.03614452113984987,0.03888395659721566 +-2.0,0.0479890942025702,-6.237198753022495e-22,0.0305028346466794,0.0260000802205656 +-1.5,0.045295039401955575,-6.912309635773826e-22,0.08162932095229189,0.016380384510995334 +-1.0,0.043167500593999146,-7.532405638757088e-22,0.12801556549953402,0.007750087004769375 +-0.5,0.04124639223500035,-8.208940418375085e-22,0.17621069134978953,-0.0006465780628451242 +0.0,0.0391716287812586,-9.053367631030614e-22,0.2327638215644422,-0.009565376456581 +0.5,0.03642940188045977,-1.0402747567809679e-21,0.30711745331395157,-0.02056006905153331 +1.0,0.033349608069086455,-1.2198188183473292e-21,0.39587409123442846,-0.032800154941242825 +1.5,0.030837719136633163,-1.3957214629936769e-21,0.4863228695857339,-0.043465007218110946 +2.0,0.0297992068725944,-1.5197352059115424e-21,0.5657529226277288,-0.0497339989745391 +2.5,0.02980998988951269,-1.5973290760615377e-21,0.6370590836514817,-0.052602187842040675 +3.0,0.02984394402196038,-1.6667461944836344e-21,0.71094935451362,-0.05498858738131882 +3.5,0.029903476892476678,-1.7289002144884052e-21,0.7864326223223443,-0.056958504578559534 +4.0,0.02999099612360081,-1.784704789386423e-21,0.8625177741858545,-0.05857724641994876 +4.5,0.030108909337871987,-1.8350735724882597e-21,0.9382136972123506,-0.05991011989167249 +5.0,0.030259624157829436,-1.8809202171044884e-21,1.0125292785100326,-0.061022431979916684 +5.5,0.030445548206012366,-1.923158376545682e-21,1.0844734051871012,-0.061979489670867326 +6.0,0.03066908910496001,-1.962701704122412e-21,1.1530549643517556,-0.06284659995071037 +6.5,0.03093265447721157,-2.0004638531452523e-21,1.2172828431121963,-0.06368906980563184 +7.0,0.031238651945306277,-2.0373584769247747e-21,1.2761659285766236,-0.06457220622181764 +7.5,0.03158948913178334,-2.0742992287715518e-21,1.3287131078532368,-0.06556131618545379 +8.0,0.031987573659181985,-2.1121997619961573e-21,1.373933268050237,-0.06672170668272624 +8.5,0.03243531315004142,-2.1519737299091618e-21,1.4108352962758237,-0.06811868469982096 +9.0,0.032935115226900874,-2.19453478582114e-21,1.438428079638197,-0.06981755722292396 +9.5,0.03348938751229956,-2.240796583042663e-21,1.4557205052455573,-0.0718836312382212 +10.0,0.0341005376287767,-2.2916727748843035e-21,1.4617214602061042,-0.0743822137318986 +10.5,0.03733550504497332,-2.3434292130928936e-21,1.461744757491489,-0.07813796049386265 +11.0,0.04480290005190655,-2.3954235734136498e-21,1.4617637082441663,-0.08355196244718711 +11.5,0.055067636505679696,-2.4532072451547243e-21,1.4617764468285421,-0.09005417927780897 +12.0,0.0666946282623961,-2.522331617624269e-21,1.4617811076090217,-0.0970745706716652 +12.5,0.08355085226389879,-2.614860625520905e-21,1.4114175215846507,-0.1056676106922879 +13.0,0.10700746125287143,-2.7305142046312962e-21,1.2976891723284676,-0.1160493485913485 +13.5,0.13188563278667828,-2.8563277458956573e-21,1.1766396730658673,-0.12639210683699287 +14.0,0.1530065444226835,-2.9793366402542048e-21,1.104312637022244,-0.1348682078973669 +14.5,0.1698995941636856,-3.120612174480387e-21,1.0768953912495134,-0.14187430883009425 +15.0,0.18545235611756133,-3.2789478048598956e-21,1.054647430582876,-0.14844293346555676 +15.5,0.1995232719992926,-3.4079621766013094e-21,1.039720619922656,-0.15370020443103777 +16.0,0.2119707835238612,-3.461273934913208e-21,1.0342668241691777,-0.1567722443538206 +16.5,0.22262036127321952,-3.456612597653176e-21,1.0343999125996097,-0.15809293224989276 +17.0,0.23196335603388718,-3.446357655681106e-21,1.0347635175358494,-0.15893857271286688 +17.5,0.24085702982769658,-3.436102713709036e-21,1.0353041484453118,-0.1596989267364638 +18.0,0.2501586446764804,-3.4314413764490035e-21,1.0359683147954128,-0.1607637553144044 +18.5,0.2600628495615518,-3.459426605366656e-21,1.037265142622223,-0.1625082716038648 +19.0,0.2701280358639625,-3.520994108985491e-21,1.0394223000891838,-0.1647594163216519 +19.5,0.2802570792051525,-3.582561612604327e-21,1.0419641098547676,-0.16708454180093277 +20.0,0.2903528552065619,-3.61054684152198e-21,1.044414894577446,-0.1690510003748744 +20.5,0.30045743551005827,-3.606852854843212e-21,1.0467983024546095,-0.17057845637463262 +21.0,0.3105999628368633,-3.598726084149923e-21,1.0493240161036845,-0.17193501740368347 +21.5,0.32066391942744904,-3.5905993134566336e-21,1.0517954098131994,-0.17321070070367428 +22.0,0.330532787522287,-3.5869053267778656e-21,1.054015857871682,-0.1744955235162524 +22.5,0.3401936295744865,-3.596203560991373e-21,1.055986702774631,-0.17580534221895908 +23.0,0.3497088294236191,-3.621254394707533e-21,1.0578279659352257,-0.17709569132983738 +23.5,0.3590748513898498,-3.6577920245397976e-21,1.0595210400185138,-0.17836610530128727 +24.0,0.36828815979334373,-3.701550647101624e-21,1.061047317689545,-0.1796161185857087 +24.5,0.37734521895426615,-3.748264459006463e-21,1.0623881916133682,-0.18084526563550166 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/4.csv b/data/TUDELFT_V3_KITE/polars_CFD/4.csv new file mode 100644 index 00000000..b82a2df1 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/4.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.0690531428236168,1.7060470918952625e-21,0.5968718755880111,0.1383778081326868 +-9.5,0.07311398140980711,1.4850715925359193e-21,0.4054991655282779,0.13458817044799098 +-9.0,0.07632254292937889,1.283057605587215e-21,0.24290186093748373,0.1302747918321246 +-8.5,0.07872629084433228,1.0993559208740259e-21,0.10722028682465073,0.12546077792777832 +-8.0,0.08037268861666734,9.33317328221228e-22,-0.003405231801199088,0.12016923437764282 +-7.5,0.08130919970838427,7.842926174536984e-22,-0.09083436993104349,0.11442326682440875 +-7.0,0.08158328758148317,6.516325783963129e-22,-0.15692680255586045,0.10824598091076676 +-6.5,0.08124241569796416,5.346880008739479e-22,-0.20354220466662795,0.10166048227940755 +-6.0,0.08033404751982738,4.3280967471147985e-22,-0.23254025125432382,0.09468987657302175 +-5.5,0.07890564650907296,3.453483897337849e-22,-0.24578061730992604,0.08735726943430007 +-5.0,0.077004676127701,2.7165493576573942e-22,-0.2451229778244124,0.0796857665059331 +-4.5,0.07467859983771165,2.1108010263221978e-22,-0.2324270077887609,0.07169847343061157 +-4.0,0.07197488110110505,1.6297468015810226e-22,-0.2095523821939495,0.06341849585102613 +-3.5,0.06894098337988129,1.2668945816826316e-22,-0.17835877603095598,0.054868939409867416 +-3.0,0.06562437013604053,1.0157522648757887e-22,-0.14070586429075838,0.04607290974982612 +-2.5,0.0620725048315829,8.698277494092565e-23,-0.09845332196433454,0.03705351251359289 +-2.0,0.0583328509285085,8.226289335317984e-23,-0.0534608240426624,0.0278338533438584 +-1.5,0.05366252752892914,9.283522014626436e-23,0.004490192559022277,0.0177188109770728 +-1.0,0.04810876031480703,1.1963431880783822e-22,0.07984550121881592,0.006842535343058792 +-0.5,0.042904172617917874,1.5528336676138185e-22,0.162086242385739,-0.0035279611254341392 +0.0,0.0392813877700374,1.9240554143037576e-22,0.2406935565088119,-0.0121256659956565 +0.5,0.03690849967217646,2.32387512576284e-22,0.31543122710568516,-0.019498881278790094 +1.0,0.03464426615927276,2.80582249815507e-22,0.39253641886198676,-0.026949301390745625 +1.5,0.032507306463992386,3.355623803539297e-22,0.4712003439787032,-0.034340002505866975 +2.0,0.030516239819001395,3.9590053139743702e-22,0.550614214656821,-0.041534060798498015 +2.5,0.02868968545696585,4.601693301519137e-22,0.6299692430973273,-0.04839455244298265 +3.0,0.02704626261055182,5.269414038232447e-22,0.7084566415012078,-0.05478455361366473 +3.5,0.02560459051242536,5.947893796173147e-22,0.7852676220694498,-0.060567140484888156 +4.0,0.024383288395252535,6.622858847400089e-22,0.8595933970030398,-0.06560538923099679 +4.5,0.023400975491699415,7.280035463972121e-22,0.9306251785029642,-0.06976237602633453 +5.0,0.022676271034432063,7.9051499179480905e-22,0.9975541787702098,-0.07290117704524528 +5.5,0.022227794256116536,8.483928481386846e-22,1.059571610005763,-0.07488486846207285 +6.0,0.0220741643894189,9.00209742634724e-22,1.1158686844106105,-0.0755765264511612 +6.5,0.022256400451788814,9.498418234839741e-22,1.1695545079659733,-0.07545029928026864 +7.0,0.022790541967794415,1.0008900220839118e-21,1.2232531771791701,-0.07511751855700644 +7.5,0.023657738930779503,1.0515141404350663e-21,1.2754283900403354,-0.07464703546549784 +8.0,0.02483914133408787,1.0998739805379663e-21,1.3245438445396018,-0.07410770118986601 +8.5,0.026315899171063306,1.1441293443931407e-21,1.3690632386671036,-0.07356836691423416 +9.0,0.028069162435049616,1.1824400340011183e-21,1.4074502704129743,-0.07309788382272554 +9.5,0.030080081119390582,1.2129658513624283e-21,1.438168637767348,-0.07276510309946335 +10.0,0.03232980521743,1.2338665984775992e-21,1.459682038720358,-0.0726388759285708 +10.5,0.03617566886002857,1.2490054142812487e-21,1.4757632581213835,-0.07486089422407734 +11.0,0.04264249013541113,1.2621935525926498e-21,1.4898234785965554,-0.08043663521685965 +11.5,0.05121264497296767,1.2715129877393148e-21,1.4997839948011342,-0.08773062806631185 +12.0,0.0613685093020882,1.275045694048756e-21,1.5035661013903805,-0.095107401931828 +12.5,0.0770437221946538,1.2330815881807417e-21,1.4498880332803852,-0.10321011122992224 +13.0,0.09935949611278709,1.1402207639235923e-21,1.3281749768720883,-0.11279234345570392 +13.5,0.12357956707124026,1.0460104612976493e-21,1.1974086540480253,-0.12238427738645988 +14.0,0.1449676710847656,9.999979203232537e-22,1.1165707866907306,-0.130516091799477 +14.5,0.16322744757848812,9.960896853374264e-22,1.0822788341424527,-0.13733631519338205 +15.0,0.1807416211367527,9.940374669322372e-22,1.0539135238982258,-0.14368125958143352 +15.5,0.1967925555131416,9.921562545106028e-22,1.0346014800697656,-0.14911277901286604 +16.0,0.2106626144612369,9.887610374754385e-22,1.0274693267687864,-0.1531927275369142 +16.5,0.22213394420521318,9.769596704473858e-22,1.027654024136537,-0.1561151840579266 +17.0,0.2320931853969268,9.571247193889144e-22,1.0281339426651053,-0.15848980671925134 +17.5,0.241479443431483,9.38468240715682e-22,1.0287978219924663,-0.16050181842862263 +18.0,0.2512318237039869,9.302022908433472e-22,1.0295344017565942,-0.1623364420937745 +18.5,0.26153744244155,9.424540120029199e-22,1.0304381991936706,-0.1639876534453794 +19.0,0.2719172962183954,9.6940779855398e-22,1.0316354911993009,-0.16543030457130745 +19.5,0.2823113109502947,9.9636158510504e-22,1.0330626569005965,-0.16682093291508907 +20.0,0.2926594125530201,1.0086133062646128e-21,1.0346560754246688,-0.1683160759202548 +20.5,0.3030060406069695,1.0051561843266777e-21,1.036574134028655,-0.1700189452655024 +21.0,0.31336325321744063,9.966755820737657e-22,1.0388958025813084,-0.17183081865112093 +21.5,0.32362240408755455,9.86007644847215e-22,1.0414383341271642,-0.17360533255302815 +22.0,0.3336748469204325,9.759885179883648e-22,1.044018981710757,-0.1751961234471417 +22.5,0.3435100188259235,9.67058911239337e-22,1.0466198746490467,-0.17660396001902423 +23.0,0.3531870442053736,9.57780400289762e-22,1.049340396419775,-0.17791803659832617 +23.5,0.36270180769914856,9.481704294022396e-22,1.0521736813086477,-0.17912462812709676 +24.0,0.3720501939476145,9.382464428393708e-22,1.055112863601373,-0.1802100095473852 +24.5,0.38122808759113735,9.28025884863756e-22,1.0581510775836567,-0.18116045580124074 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/5.csv b/data/TUDELFT_V3_KITE/polars_CFD/5.csv new file mode 100644 index 00000000..c87f9b7e --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/5.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1130805978335641,-6.487203008152812e-22,-0.2539629024495576,0.0578101742159575 +-9.5,0.11068018471092775,-7.492038958907563e-22,-0.271843172856166,0.06591341786504126 +-9.0,0.10800767416252526,-8.296649295858784e-22,-0.28616058495297053,0.07240199303792386 +-8.5,0.10508347478269478,-8.923281309429089e-22,-0.2973110118855049,0.07745530734307203 +-8.0,0.10192799516577444,-9.394182290041094e-22,-0.30569032679930297,0.08125276838895261 +-7.5,0.09856164390610238,-9.731599528117412e-22,-0.31169440283989835,0.0839737837840324 +-7.0,0.0950048295980167,-9.957780314080656e-22,-0.31571911315282497,0.0857977611367782 +-6.5,0.09127796083585557,-1.0094971938353445e-21,-0.31816033088361656,0.08690410805565678 +-6.0,0.08740144621395708,-1.0165421691358392e-21,-0.3194139291778068,0.08747223214913498 +-5.5,0.08339569432665939,-1.019137686351811e-21,-0.3198757811809295,0.08768154102567959 +-5.0,0.0792811137683006,-1.0195084745255212e-21,-0.3199417600385185,0.0877114422937574 +-4.5,0.07432355746908505,-9.883115263829659e-22,-0.3037392851146056,0.08529229364643422 +-4.0,0.0682764206649561,-9.049776902290699e-22,-0.2607608931452114,0.07876288896650077 +-3.5,0.06189142540886035,-7.848924784744874e-22,-0.19945013333385292,0.06921529014701112 +-3.0,0.05592029375374452,-6.43441403529873e-22,-0.12825055488404713,0.05774155908101942 +-2.5,0.05111474775255524,-4.960099778058811e-22,-0.055605706999310944,0.04543375766157974 +-2.0,0.0482265094582392,-3.5798371371316643e-22,0.0100408611168386,0.0333839477817462 +-1.5,0.04693175424544905,-2.0652291781113048e-22,0.07057931983626896,0.018739102305039158 +-1.0,0.046101100235593065,-3.2457261860086077e-23,0.13338687188722975,0.000806990316672803 +-0.5,0.0452779336017513,1.2832369392794618e-22,0.19825051660077736,-0.016079131957758 +0.0,0.0440056405170038,2.3993038934094543e-22,0.2649572533079684,-0.0275860082926584 +0.5,0.04094698491387268,3.01821575073578e-22,0.33427729045259275,-0.033967280097514756 +1.0,0.036241085759471846,3.4661999114892957e-22,0.40621166149438537,-0.038850696530193754 +1.5,0.03164586177876906,3.881820613476085e-22,0.47939360328832026,-0.042964162987671 +2.0,0.0289192316967321,4.403642094502228e-22,0.5524563526893713,-0.0470355848669221 +2.5,0.027771479562266912,5.147498064639335e-22,0.6274972160673782,-0.05160974922538335 +3.0,0.026747048852764313,6.085666053325525e-22,0.7061612843106606,-0.056546374926330835 +3.5,0.025855097435919322,7.14137602741665e-22,0.7864034710519127,-0.06154576507549985 +4.0,0.025104783179426982,8.237857953768568e-22,0.8661786899238287,-0.06630822277862569 +4.5,0.02450526395098233,9.29834179923713e-22,0.9434418545591029,-0.07053405114144361 +5.0,0.02406569761828039,1.0246057530678192e-21,1.0161478785904297,-0.07392355326968889 +5.5,0.023795242049016202,1.1004235114947612e-21,1.0822516756505025,-0.07617703226909688 +6.0,0.0237030551108848,1.1496104518901238e-21,1.139708159372016,-0.0769947912454028 +6.5,0.0238666704697505,1.1808664659138942e-21,1.1938921151335946,-0.07660645601969013 +7.0,0.02435129076664844,1.2082700975420015e-21,1.2497195301745294,-0.07558266315190215 +7.5,0.025147577332029884,1.2322123219339463e-21,1.304457120918516,-0.07413523185606401 +8.0,0.026246191496346095,1.2530841142492283e-21,1.3553716037892496,-0.07247598134620076 +8.5,0.027637794590048326,1.2712764496473475e-21,1.3997296952104246,-0.0708167308363375 +9.0,0.029313047943587852,1.2871803032878037e-21,1.4347981116057371,-0.06936929954049935 +9.5,0.03126261288741592,1.3011866503300976e-21,1.4578435693988814,-0.06834550667271137 +10.0,0.0334771507519838,1.3136864659337286e-21,1.4661327850135526,-0.0679571714469987 +10.5,0.03790798339348841,1.3259203593680718e-21,1.462789572735603,-0.07046048732367252 +11.0,0.04589460307416723,1.3373949875049206e-21,1.4533846163094069,-0.0767837570652558 +11.5,0.056509926733532376,1.345900396907403e-21,1.4388549363464433,-0.08514696383909116 +12.0,0.068826871311096,1.3492266341386465e-21,1.4201375534581917,-0.0937700908125213 +12.5,0.08754227066933279,1.3440310590325042e-21,1.3538072922142697,-0.10410770491089112 +13.0,0.1137409758132821,1.3315803130370195e-21,1.2323112924707567,-0.11687508272612436 +13.5,0.14107792939630315,1.3165783651366053e-21,1.110395047768825,-0.12918327192543191 +14.0,0.1632080740717549,1.303729184315675e-21,1.0428040516496464,-0.1381433201760246 +14.5,0.1793708305621238,1.2938251897885553e-21,1.0224732655449378,-0.14389994863208974 +15.0,0.19349576363539456,1.284438891893646e-21,1.0065793722895469,-0.14864520923010968 +15.5,0.2062730320131735,1.275444396301468e-21,0.9962304475293421,-0.15256114581073787 +16.0,0.2183927944170672,1.2667158086825418e-21,0.992534566910192,-0.1558298022146279 +16.5,0.22987187833455347,1.2583428477536553e-21,0.993511886146462,-0.15859471963678284 +17.0,0.24053284556883242,1.2503259488621979e-21,0.995929491112197,-0.16095610170036967 +17.5,0.2507744563150938,1.2424052926245944e-21,0.9990158526927851,-0.16303098588828752 +18.0,0.2609954707685274,1.2343210596572701e-21,1.0019994417736144,-0.1649364096834356 +18.5,0.2712559325619606,1.226248284313466e-21,1.004950331569794,-0.16673031790483214 +19.0,0.28136433572981306,1.2182421085487638e-21,1.0082189665682577,-0.1683844053696373 +19.5,0.29134211606966276,1.2098628743830997e-21,1.0114543745621312,-0.16988633455796334 +20.0,0.3012107093790877,1.20067092383641e-21,1.014305583344539,-0.1712237679499225 +20.5,0.3109625833476512,1.1879528056267136e-21,1.0166179410640466,-0.17237737125161817 +21.0,0.3205942300733652,1.1726412653817722e-21,1.0186517147303322,-0.17339531578531747 +21.5,0.33013312196648065,1.1597659404861367e-21,1.0206783104281902,-0.17436652245537826 +22.0,0.3396067314372485,1.1543564683243581e-21,1.022969134242415,-0.1753799121661584 +22.5,0.3490212004898601,1.154378278476221e-21,1.025615081731637,-0.17645073174682224 +23.0,0.35836378772683003,1.154530949539262e-21,1.0285095069878363,-0.1775347922678333 +23.5,0.3676336404558954,1.1549453424246585e-21,1.0316275038958327,-0.17863186099549808 +24.0,0.3768299059847928,1.1557523180435886e-21,1.0349441663404446,-0.1797417051961231 +24.5,0.385951731621259,1.1570827373072303e-21,1.0384345882064923,-0.1808640921360148 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/6.csv b/data/TUDELFT_V3_KITE/polars_CFD/6.csv new file mode 100644 index 00000000..b78dbb55 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/6.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1247963862531487,-8.263188570309638e-22,-0.4377847767021424,0.1291313592352408 +-9.5,0.12250276876005324,-8.251006484807764e-22,-0.43676316140494287,0.12873742621014575 +-9.0,0.1197867284636386,-8.214602594815178e-22,-0.433752535163911,0.12759646993836718 +-8.5,0.11668377413927401,-8.154190450101442e-22,-0.42883422745489697,0.12576975462516513 +-8.0,0.11322941456232868,-8.069983600436114e-22,-0.42208956775375095,0.12331854447579949 +-7.5,0.10945915850817185,-7.962195595588752e-22,-0.413599885536323,0.12030410369553028 +-7.0,0.10540851475217275,-7.831039985328916e-22,-0.40344651027846334,0.11678769648961745 +-6.5,0.1011129920697006,-7.676730319426165e-22,-0.391710771456022,0.11283058706332098 +-6.0,0.0966080992361246,-7.499480147650059e-22,-0.3784739985448493,0.10849403962190082 +-5.5,0.091929345026814,-7.299503019770155e-22,-0.36381752102079523,0.10383931837061694 +-5.0,0.087112238217138,-7.077012485556013e-22,-0.34782266835971,0.0989276875147293 +-4.5,0.08129782111669362,-6.488937178685686e-22,-0.31799837195505454,0.09185922122437297 +-4.0,0.07414070373003964,-5.332907702632524e-22,-0.2666828564668877,0.08148001886618222 +-3.5,0.06644674637498786,-3.8201905618590233e-22,-0.20120139127095704,0.06897038244016586 +-3.0,0.059021809369350135,-2.1620522608276884e-22,-0.12887924574300952,0.0555106139463327 +-2.5,0.05267175303093831,-5.697593040010157e-23,-0.057041689258792494,0.04228101538469155 +-2.0,0.0482024376775642,7.454218041584896e-23,0.0069860088059468,0.0304618887552512 +-1.5,0.04528253114705592,1.749031809499551e-22,0.06178853158460213,0.020140095969843876 +-1.0,0.04291905950461738,2.641083628223872e-22,0.11426717925365308,0.010263775876164788 +-0.5,0.04092542040912417,3.5620190113984314e-22,0.16957160800198115,0.00030514587801728013 +0.0,0.0391150115194519,4.652279710090204e-22,0.2328514740184679,-0.0102635766207953 +0.5,0.03746604740574006,6.084850061181858e-22,0.3127080581892902,-0.02332303776547913 +1.0,0.03601058212958641,7.794350854553734e-22,0.40636246796157033,-0.038065759761187035 +1.5,0.034642772587053866,9.563678520769307e-22,0.5018940993656077,-0.05098733929403566 +2.0,0.0332567756742054,1.1175729490392057e-21,0.5873823484317017,-0.0585833730501417 +2.5,0.031683897345946,1.2632267903712767e-21,0.6627729640342712,-0.06216174011328272 +3.0,0.029910334689253127,1.4070349588153766e-21,0.7357900118512681,-0.06534892988489376 +3.5,0.028062581298298455,1.5475808504975841e-21,0.8061803631182909,-0.06811845452757752 +4.0,0.026267130767253632,1.6834478615439786e-21,0.8736908890709383,-0.07044382620393685 +4.5,0.02465047669029033,1.8132193880806402e-21,0.9380684609448092,-0.07229855707657448 +5.0,0.023339112661580196,1.9354788262336477e-21,0.9990599499755022,-0.07365615930809317 +5.5,0.022459532275294902,2.0488095721290807e-21,1.056412227398616,-0.07449014506109569 +6.0,0.0221382291256061,2.1517950218930176e-21,1.1098721644497491,-0.0747740264981848 +6.5,0.0223314640591147,2.2531535594222814e-21,1.162780224196327,-0.07461787812657515 +7.0,0.02289629521479895,2.358874616778922e-21,1.2171567318066538,-0.07420621423778609 +7.5,0.023810412125396526,2.46344816233686e-21,1.2707683516676482,-0.07362420667087739 +8.0,0.025051504323645096,2.561364164470016e-21,1.321381748166228,-0.07295702726490891 +8.5,0.026597261342282335,2.6471125915523125e-21,1.3667635856893123,-0.07228984785894041 +9.0,0.028425372714045917,2.715183411957669e-21,1.4046805286238184,-0.07170784029203171 +9.5,0.030513527971673508,2.7600665940600077e-21,1.4328992413566646,-0.07129617640324265 +10.0,0.0328394166479028,2.776252106233249e-21,1.4491863882747698,-0.071140028031633 +10.5,0.03668108312711253,2.7516724629994485e-21,1.458269654582415,-0.07305635331355279 +11.0,0.04301983132163507,2.6896488391285578e-21,1.4658028460109478,-0.07792221728373849 +11.5,0.05138824005613844,2.607754193366343e-21,1.4709418077378877,-0.08441295212882967 +12.0,0.0613188881552907,2.52356148445857e-21,1.4728423849407524,-0.0912038900354658 +12.5,0.07656649189293317,2.418802429364716e-21,1.4283217006273068,-0.09925058752850047 +13.0,0.09822393113133426,2.2879711349020934e-21,1.326134507421061,-0.10923862127196161 +13.5,0.12183103007780262,2.167784144603219e-21,1.2133430949231514,-0.11943835366125047 +14.0,0.1429276129396469,2.094958002000613e-21,1.1370097527347138,-0.1281201470917682 +14.5,0.16117429011295045,2.0636849523562287e-21,1.0954905455944353,-0.1353749194140799 +15.0,0.17879099470936413,2.041039187530902e-21,1.0592498894840852,-0.14215377137883028 +15.5,0.1951565350095478,2.0230601709554725e-21,1.0335126008694253,-0.14801733973153997 +16.0,0.2096497192941613,2.00578736606078e-21,1.0235034962162166,-0.1525262612177296 +16.5,0.2221342774069432,1.987791519744247e-21,1.0231496124338484,-0.1558927542904056 +17.0,0.23330127234735598,1.970893655612006e-21,1.0228954974517024,-0.15869834312498637 +17.5,0.24377051212964546,1.956008652157962e-21,1.0227422342655308,-0.16105762305061047 +18.0,0.2541618047680573,1.944051387876018e-21,1.0226909058710845,-0.1630851893964166 +18.5,0.2645108913135349,1.9354579615808286e-21,1.0232537825522074,-0.16482503436613488 +19.0,0.27454884677720554,1.928789338035878e-21,1.0246194669746662,-0.1663195333469832 +19.5,0.28443848011359074,1.9221476946583116e-21,1.0263035407070953,-0.16768085644333225 +20.0,0.2943426002772124,1.9136352088652777e-21,1.0278215853181298,-0.1690211737595524 +20.5,0.3042872652961443,1.9014448525335593e-21,1.0289959236816688,-0.17033750663148114 +21.0,0.3141918464710955,1.8862250697618207e-21,1.030101121442468,-0.1715866752227217 +21.5,0.3240591226655399,1.869761246300029e-21,1.031331124325448,-0.17282054787929335 +22.0,0.3338918727429516,1.853838767898152e-21,1.0328798780555286,-0.1740909929472152 +22.5,0.34369090693736176,1.8387546628634716e-21,1.0350144626907467,-0.17540748723565275 +23.0,0.35345505669256333,1.8236158972400344e-21,1.0377872954044471,-0.17674462608012384 +23.5,0.36318413268667354,1.8084227633829577e-21,1.0410703275945115,-0.17810195561617637 +24.0,0.3728779455978093,1.7931755536473564e-21,1.0447355106588214,-0.1794790219793582 +24.5,0.3825363061040877,1.777874560388348e-21,1.0486547959952586,-0.1808753713052172 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/7.csv b/data/TUDELFT_V3_KITE/polars_CFD/7.csv new file mode 100644 index 00000000..bc35e978 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/7.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.122546573076266,1.242138678946769e-21,-0.3088564506446254,0.0605061143794596 +-9.5,0.11793215005532007,1.352532502194435e-21,-0.3195972925667664,0.06853693512084777 +-9.0,0.11339726709984428,1.440929032248839e-21,-0.32819789292508605,0.0749675185189335 +-8.5,0.10894026246304753,1.5097724127981215e-21,-0.3348960563377865,0.07997566872297261 +-8.0,0.10455947439813874,1.5615067875304229e-21,-0.33992958742307033,0.08373918988222094 +-7.5,0.1002532411583269,1.5985763001338827e-21,-0.34353629079913983,0.08643588614593431 +-7.0,0.09601990099682087,1.6234250942966414e-21,-0.3459539710841974,0.08824356166336855 +-6.5,0.09185779216682963,1.6384973137068396e-21,-0.3474204328964455,0.08934002058377948 +-6.0,0.0877652529215621,1.646237102052617e-21,-0.34817348085408634,0.08990306705642294 +-5.5,0.08374062151422722,1.6490886030221137e-21,-0.3484509195753224,0.09011050523055471 +-5.0,0.0797822361980339,1.6494959603034701e-21,-0.3484905536783562,0.0901401392554307 +-4.5,0.07599667907055532,1.6087886429285233e-21,-0.33631032535036154,0.08700926626035775 +-4.0,0.07241339064672912,1.498868465365949e-21,-0.3033345494286829,0.07868497395448944 +-3.5,0.06891499680581094,1.3380380894591469e-21,-0.2549105895067778,0.06676975235685156 +-3.0,0.06538412342705639,1.144600177051517e-21,-0.19638580917810414,0.05286609148646994 +-2.5,0.06170339638972111,9.368573899864587e-22,-0.1331075720361196,0.038576481362370345 +-2.0,0.0577554415730607,7.331123901073713e-22,-0.0704232416742819,0.0255034120035786 +-1.5,0.05316047980306258,5.020303235809399e-22,0.0003468957290770538,0.012382743097285607 +-1.0,0.048084497201263565,2.260627184766406e-22,0.0853369159166389,-0.0019441069590179511 +-0.5,0.043228767590243494,-5.580819050793926e-23,0.17538099817646624,-0.01571631008085663 +0.0,0.0392945647925822,-3.04600168675212e-22,0.2613133217966217,-0.027173038183755 +0.5,0.03618046504769321,-5.205207443065566e-22,0.34215774471468147,-0.03668093255139258 +1.0,0.03339804086680773,-7.244167815789623e-22,0.4223483431214091,-0.04537958571382546 +1.5,0.03106806048023208,-9.082650496382572e-22,0.5008346236846491,-0.052667596456143065 +2.0,0.0293112921182726,-1.06404231763027e-21,0.5765660930722456,-0.0579435635634348 +2.5,0.027896064658006682,-1.2057353083244287e-21,0.6513145206726397,-0.06193975761652965 +3.0,0.026537354942769983,-1.3486898403750462e-21,0.7267519365951786,-0.06572354398549875 +3.5,0.025275903152256193,-1.4869213267552796e-21,0.8016782385890648,-0.06919616363929476 +4.0,0.02415244946615903,-1.6144451804382847e-21,0.8748933244035018,-0.07225885754687035 +4.5,0.023207734064172196,-1.725276814397218e-21,0.9451970917876918,-0.07481286667717821 +5.0,0.02248249712598939,-1.813431641605237e-21,1.0113894384908382,-0.07675943199917099 +5.5,0.022017478831304324,-1.8729250750354975e-21,1.0722702622621434,-0.07799979448180136 +6.0,0.0218534193598107,-1.897772527661156e-21,1.1266394608508106,-0.078435195094022 +6.5,0.022031677868571256,-1.9023461452927038e-21,1.1766274443971825,-0.07808021077265075 +7.0,0.022551355338489922,-1.9053619702531364e-21,1.2248261333010515,-0.07714434301630836 +7.5,0.023389804685022216,-1.9073512602843643e-21,1.2707276907007947,-0.07582121963665188 +8.0,0.024524378823623644,-1.908845273128298e-21,1.3138242797347892,-0.07430446844533833 +8.5,0.025932430669749717,-1.910375266526849e-21,1.3536080635414114,-0.07278771725402482 +9.0,0.027591313138855943,-1.912472498221928e-21,1.3895712052590392,-0.07146459387436835 +9.5,0.029478379146397837,-1.915668225955447e-21,1.4212058680260498,-0.07052872611802595 +10.0,0.0315709816078309,-1.9204937074693146e-21,1.448004214980819,-0.0701737417966547 +10.5,0.034838080416009484,-1.937472669700719e-21,1.473105156331314,-0.07168087710203751 +11.0,0.04012627481874685,-1.9719703982356068e-21,1.4968530441791952,-0.07559149371278288 +11.5,0.04722937676393687,-2.0167804887890286e-21,1.5145482045033831,-0.08098940767078627 +12.0,0.0559411981994734,-2.0646965370760348e-21,1.5214909632827969,-0.0869584350179431 +12.5,0.07117468020265204,-2.1215385943236007e-21,1.4737154483014328,-0.09550176375546947 +13.0,0.09412468433191024,-2.19180119599984e-21,1.3637237027539288,-0.10719740773573572 +13.5,0.11900790325685462,-2.2662896641815126e-21,1.2415179257351672,-0.11899142177736868 +14.0,0.1400410296470918,-2.3358093209453768e-21,1.1571003163400304,-0.1278298606989952 +14.5,0.1565528283776633,-2.4052010530277332e-21,1.1087571060504857,-0.13371940477054658 +15.0,0.17173363824102073,-2.477072787214083e-21,1.065915007064027,-0.13872551377226022 +15.5,0.18559251278288622,-2.5388804056549854e-21,1.035286939548826,-0.14288241178822225 +16.0,0.1981385055489818,-2.5780797905010015e-21,1.0235858236730544,-0.1462243229025187 +16.5,0.2092172238849682,-2.5975433966448728e-21,1.027467172666207,-0.14883751124238132 +17.0,0.21914525794930542,-2.6111832169175686e-21,1.036421469243244,-0.15096932874815563 +17.5,0.2286381355069146,-2.6230144403769888e-21,1.046414087800535,-0.1528956312235985 +18.0,0.2384113843227168,-2.6370522560810336e-21,1.0534104027344486,-0.1548922744724667 +18.5,0.24860508308585524,-2.6544998888087336e-21,1.057245373355475,-0.15702517579340536 +19.0,0.2588549945995975,-2.6733262735026516e-21,1.0604431328030588,-0.15915032367075613 +19.5,0.269120172800051,-2.6926951644659886e-21,1.0630028162169998,-0.16122868068682064 +20.0,0.279359671623323,-2.711770316001944e-21,1.0649235587370989,-0.1632212094239005 +20.5,0.2896096180420362,-2.7308198637378527e-21,1.0663709390996075,-0.1651497032067279 +21.0,0.29987620559702677,-2.750126125915617e-21,1.0675518856890431,-0.16703059401090986 +21.5,0.3100735880767218,-2.7688741307602845e-21,1.0685275581176044,-0.16881680239506053 +22.0,0.3201159192695488,-2.7862489064969054e-21,1.0693591159974902,-0.1704612489177939 +22.5,0.3299931015740035,-2.8022748823807476e-21,1.0701085066211145,-0.17197728172424648 +23.0,0.339750737250688,-2.8174615265893766e-21,1.0707780845611055,-0.17340192808337537 +23.5,0.34938652988118885,-2.831721425731287e-21,1.071339620349982,-0.17472362723952556 +24.0,0.3588981830470925,-2.8449671664149728e-21,1.0717648845202643,-0.1759308184370421 +24.5,0.36828340032998563,-2.8571113352489288e-21,1.0720256476044712,-0.17701194092027006 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/8.csv b/data/TUDELFT_V3_KITE/polars_CFD/8.csv new file mode 100644 index 00000000..75c8a67b --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/8.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1108116522876312,-1.3318470367061016e-21,-0.2498681581466391,0.0544674891510176 +-9.5,0.11001261569632557,-1.349847415847465e-21,-0.2782826360085718,0.06262519539639742 +-9.0,0.10866132434337104,-1.3642610035732061e-21,-0.30103518839248095,0.06915738084011484 +-8.5,0.10681498032354729,-1.3754863322628385e-21,-0.31875491812925816,0.0742446589045768 +-8.0,0.10453078573163395,-1.383921934295876e-21,-0.3320709280497948,0.0780676430121902 +-7.5,0.10186594266241063,-1.3899663420518318e-21,-0.3416123209849826,0.08080694658536204 +-7.0,0.09887765321065702,-1.39401808791022e-21,-0.3480081997657128,0.08264318304649919 +-6.5,0.09562311947115275,-1.3964757042505538e-21,-0.35188766722287707,0.0837569658180086 +-6.0,0.09215954353867745,-1.3977377234523467e-21,-0.3538798261873668,0.08432890832229722 +-5.5,0.08854412750801083,-1.3982026778951125e-21,-0.3546137794900736,0.08453962398177199 +-5.0,0.0848340734739325,-1.3982690999583648e-21,-0.3547186299618888,0.0845697262188398 +-4.5,0.08008367292440584,-1.385002918189812e-21,-0.3390420721318088,0.08242023624034893 +-4.0,0.07382412947143416,-1.3496116879514008e-21,-0.2975984061101417,0.0766693384999171 +-3.5,0.06682801339585694,-1.2987063818440036e-21,-0.23876664309974693,0.06836339129010552 +-3.0,0.059867894978513664,-1.2388979724684924e-21,-0.1709257943034837,0.058548752903475436 +-2.5,0.05371634450024382,-1.176797432425739e-21,-0.1024548709242114,0.04827178163258802 +-2.0,0.0491459322418869,-1.1190157343166153e-21,-0.0417328841647893,0.0385788357700045 +-1.5,0.046019882417677245,-1.0626094085345267e-21,0.010801620142688347,0.028781842796043622 +-1.0,0.043466794633667545,-1.0015675739508945e-21,0.06291278368699849,0.017920673209182947 +-0.5,0.04115730225842487,-9.37900085883617e-22,0.1185256265465884,0.0066335998292219225 +0.0,0.0387620386605163,-8.736167996505914e-22,0.1815651687999054,-0.00444110452404 +0.5,0.03602774024191845,-8.026498932354608e-22,0.25939019372917516,-0.016178085949023892 +1.0,0.03318463158044664,-7.260537042627391e-22,0.3500935222692885,-0.028569472592497126 +1.5,0.03062857830842599,-6.565213275116307e-22,0.4437012309776902,-0.039653214707179696 +2.0,0.0287554460581816,-6.0674585776133935e-22,0.5302393964118252,-0.0474672625457916 +2.5,0.02737348776755632,-5.741403527997946e-22,0.6101476220352305,-0.0528786805729058 +3.0,0.026052400151053975,-5.468439547491756e-22,0.6898316789875413,-0.05797836353927631 +3.5,0.024830214505991134,-5.236388848900617e-22,0.7682668953403492,-0.06264000712689478 +4.0,0.02374496212968438,-5.033073645030322e-22,0.8444285991652458,-0.0667373070177529 +4.5,0.022834674319450275,-4.8463161486866655e-22,0.9172921185338228,-0.07014395889384228 +5.0,0.022137382372605395,-4.663938572675436e-22,0.9858327815176717,-0.07273365843715457 +5.5,0.021691117586466312,-4.473763129802429e-22,1.0490259161883841,-0.07438010132968138 +6.0,0.0215339112583496,-4.263612032873436e-22,1.1058468506175525,-0.0749569832534144 +6.5,0.021694386132951212,-4.0153280868077904e-22,1.1603543969572097,-0.07450773130957206 +7.0,0.022164722519717035,-3.7327264927237915e-22,1.2158127653632607,-0.07332333982126041 +7.5,0.02292828806308854,-3.4365880577256852e-22,1.2700053809131018,-0.07164885530330255 +8.0,0.023968450407507204,-3.1476935889177154e-22,1.320715668684131,-0.06972932427052159 +8.5,0.02526857719741451,-2.886823893404127e-22,1.365727053753745,-0.06780979323774065 +9.0,0.026812036077251925,-2.6747597782891667e-22,1.4028229611993408,-0.06613530871978279 +9.5,0.028582194691460932,-2.5322820506770768e-22,1.4297868160983158,-0.06495091723147114 +10.0,0.030562420684483,-2.4801715176721034e-22,1.444402043528067,-0.0645016652876288 +10.5,0.033947291609916073,-2.6676713907954114e-22,1.4516441332414538,-0.06593145120905256 +11.0,0.03963708546609779,-3.1292778860472998e-22,1.4575640586070187,-0.06963067316067775 +11.5,0.04717372056457916,-3.7136513172507164e-22,1.4615584701256823,-0.07471412742353521 +12.0,0.0560991152169112,-4.2694519982286085e-22,1.4630240182983656,-0.0802966102786558 +12.5,0.06934142709043745,-4.761379328064538e-22,1.4262343401997868,-0.08756634616277903 +13.0,0.08804752236802595,-5.27162377779413e-22,1.3403602522005649,-0.09723305038344486 +13.5,0.10908738213451455,-5.825082269168435e-22,1.242144173745472,-0.10769375552788468 +14.0,0.1293309874747411,-6.446651723938501e-22,1.16832852427928,-0.1173454941833299 +14.5,0.14930019287689317,-7.348212854597182e-22,1.1179442381309437,-0.12667597634389674 +15.0,0.1702213055110796,-8.470537482673554e-22,1.0709646503429533,-0.13625556288629745 +15.5,0.19002098548502,-9.431859193472993e-22,1.0355457814303837,-0.1446052627216575 +16.0,0.2066258929064338,-9.85041157230088e-22,1.0198436519083096,-0.1502460847611022 +16.5,0.2197502124794184,-9.867908450364604e-22,1.0170662874265097,-0.15355438259390994 +17.0,0.23109770302159996,-9.880515668444394e-22,1.0150186977848918,-0.15609654237453957 +17.5,0.24157938581099142,-9.888144826204874e-22,1.0137523797237242,-0.15817862186188744 +18.0,0.2521062821256056,-9.890707523310673e-22,1.0133188299832752,-0.16010667881485 +18.5,0.262809036793946,-9.82586357529844e-22,1.0136701316119383,-0.1619548396691582 +19.0,0.27325418910982124,-9.664075964789728e-22,1.0145356433442807,-0.163621088819349 +19.5,0.2835066020492019,-9.454461042076518e-22,1.0156327754498318,-0.16514727096252785 +20.0,0.2936311385880585,-9.24613515745079e-22,1.0166789381981205,-0.1665752307958001 +20.5,0.30358670764354606,-9.029996945776452e-22,1.0175624838015755,-0.16788038389476537 +21.0,0.3133637585369111,-8.782618862617954e-22,1.018452836011624,-0.1690705478946611 +21.5,0.3230744648502615,-8.531627989318095e-22,1.0194890124062952,-0.17023617058204973 +22.0,0.3328310001657054,-8.304651407219668e-22,1.020810030563618,-0.1714676997434936 +22.5,0.3426520800934332,-8.1040187969165465e-22,1.0227205256777256,-0.1727832632242773 +23.0,0.35248163057804616,-7.914468996760717e-22,1.025330103430928,-0.1741395800856049 +23.5,0.3623196407032684,-7.737242824732138e-22,1.0284852371335185,-0.17553498493791758 +24.0,0.372166099552824,-7.573581098810766e-22,1.0320324000957908,-0.1769678123916567 +24.5,0.382020996210437,-7.424724636976561e-22,1.0358180656280378,-0.1784363970572636 diff --git a/data/TUDELFT_V3_KITE/polars_CFD/9.csv b/data/TUDELFT_V3_KITE/polars_CFD/9.csv new file mode 100644 index 00000000..75c79256 --- /dev/null +++ b/data/TUDELFT_V3_KITE/polars_CFD/9.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.0960543185292821,1.893877927263632e-21,-0.1761399982678887,0.0431407405021115 +-9.5,0.08767960987171115,1.836113520681478e-21,-0.1266327311081181,0.03695589776357747 +-9.0,0.07991459974312787,1.7856100883133313e-21,-0.08539375457134189,0.032003459113164594 +-8.5,0.07282331886995015,1.742089576065367e-21,-0.051703031622221084,0.028146490763303875 +-8.0,0.06646979797859585,1.7052739298437612e-21,-0.024840525225416545,0.025248058926426297 +-7.5,0.06091806779548287,1.6748850955546891e-21,-0.004086198345589159,0.023171229814962835 +-7.0,0.05623215904702913,1.6506450191043272e-21,0.01127998605260009,0.021779069641344472 +-6.5,0.05247610245965247,1.6322756463988506e-21,0.021978065004490316,0.020934644618002186 +-6.0,0.0497139287597708,1.6194989233444356e-21,0.028728075545420693,0.020501020957366955 +-5.5,0.04800966867380202,1.6120367958472577e-21,0.032250054710730294,0.02034126487186977 +-5.0,0.047427352928164,1.6096112098134926e-21,0.0332640395357581,0.0203184425739416 +-4.5,0.04796518932738921,1.6204871115389689e-21,0.01914615959030865,0.023352598186936736 +-4.0,0.049309780325452225,1.6476768658526593e-21,-0.016148540273314978,0.030937987219424565 +-3.5,0.05105774862293415,1.6830235464604568e-21,-0.062031650096025695,0.04079899296165876 +-3.0,0.05280571692041607,1.718370227068254e-21,-0.1079147599187364,0.05065999870389293 +-2.5,0.05415030791847909,1.7455599813819444e-21,-0.14320945978236005,0.05824538773638078 +-2.0,0.0546881443177043,1.7564358831074206e-21,-0.1573273397278095,0.0612795433493759 +-1.5,0.05282635637487998,1.716783993924583e-21,-0.1264531711783452,0.05459481604853058 +-1.0,0.04841551930323815,1.6168861483585793e-21,-0.05033636311275925,0.0385775378438874 +-0.5,0.04321742323802555,1.485329079383173e-21,0.046264538094737934,0.019283064282285572 +0.0,0.0389938583144889,1.3506995199721277e-21,0.138590986069936,0.0027667509105643 +0.5,0.035804046673727434,1.1972120650216632e-21,0.226549505093624,-0.010905038342718942 +1.0,0.03276010253051799,1.0118684409345506e-21,0.3218143316305554,-0.02454100735830051 +1.5,0.030203154130623758,8.274360779443812e-22,0.4172784875824661,-0.03639840230328194 +2.0,0.0284743297198079,6.766824062847459e-22,0.5058349948510922,-0.0447344693447648 +2.5,0.027308895268387236,5.5531754774683815e-22,0.5877392958328286,-0.0505967466622603 +3.0,0.026229042375428818,4.384943634955126e-22,0.6678087447510133,-0.05610644559891464 +3.5,0.025256287729821157,3.281443928248529e-22,0.7457792312477971,-0.06113132206728177 +4.0,0.024412148020452773,2.261991750289428e-22,0.8213866449653306,-0.06553913197991568 +4.5,0.023718139936212166,1.3459024940186595e-22,0.8943668755457648,-0.06919763124937033 +5.0,0.023195780165987858,5.524915523770598e-23,0.9644558126312501,-0.0719745757881997 +5.5,0.022866585398668367,-9.892568169453393e-24,1.0313893458639372,-0.07373772150895773 +6.0,0.0227520723231422,-5.890338152552851e-23,1.0949033648859767,-0.0743548243241984 +6.5,0.02280442735743669,-9.598404147472143e-23,1.1604145381204665,-0.0740647717653586 +7.0,0.02296429714986182,-1.2742811130301984e-22,1.2307329849535322,-0.07330008774659912 +7.5,0.023235888734730047,-1.544432616790186e-22,1.301684771471867,-0.07221898275455982 +8.0,0.023623409146353844,-1.7823716327131238e-22,1.369095963762163,-0.07097966727588066 +8.5,0.02413106541904568,-2.0001748674849622e-22,1.428792627911113,-0.06974035179720148 +9.0,0.02476306458711802,-2.209919027791648e-22,1.47660083000541,-0.0686592468051622 +9.5,0.025523613684883338,-2.4236808203191287e-22,1.508346636131747,-0.06789456278640271 +10.0,0.0264169197466541,-2.6535369517533534e-22,1.5198561123768164,-0.0676045102275629 +10.5,0.029850145032033974,-2.933625055952802e-22,1.5126318511737011,-0.06840407287515514 +11.0,0.03724492679631078,-3.235311354473802e-22,1.4935365371715668,-0.07055835241590853 +11.5,0.04712718456732322,-3.4765154355490734e-22,1.4664363747812312,-0.073700736246788 +12.0,0.05802283787291,-3.5751568874113373e-22,1.435197568413511,-0.0774646117647585 +12.5,0.0717901486994252,-3.2170629331558913e-22,1.3852293556236515,-0.08431764327460943 +13.0,0.08969913295089875,-2.3480903136105498e-22,1.3120580550443797,-0.0951088471321668 +13.5,0.10939334103168333,-1.2762028936068072e-22,1.2347254927027373,-0.10704363881095033 +14.0,0.1285163233461315,-3.09364537976158e-23,1.1722734946257645,-0.1173274337844799 +14.5,0.147602248018499,5.74991695674654e-23,1.1207537918754786,-0.12605549804351557 +15.0,0.16752748931538472,1.5062349390053946e-22,1.0706742186078277,-0.13455914873698196 +15.5,0.1864489068546563,2.3366046110843334e-22,1.03276075549075,-0.1418978780756458 +16.0,0.2025233602541812,2.918340130979741e-22,1.0177393831921824,-0.1471311782702737 +16.5,0.21537983070889197,3.3186648309807113e-22,1.0178875975263486,-0.1504893307730128 +17.0,0.2265399019363336,3.6687647791085274e-22,1.018213669061514,-0.15308954885927617 +17.5,0.2369993373382921,3.916823498029745e-22,1.0185397405966792,-0.15532172247472922 +18.0,0.2477539003165535,4.0110245104109162e-22,1.0186879549308454,-0.1575757415650375 +18.5,0.25910477866129517,4.000274530733964e-22,1.0186749771005499,-0.16001901167877372 +19.0,0.2705093321234093,3.971921998642761e-22,1.0186464258738996,-0.16243347157693092 +19.5,0.2816975820457539,3.9318130245467873e-22,1.0186178746472492,-0.1646308110238051 +20.0,0.2923995497711874,3.8857937188555255e-22,1.0186048968169534,-0.1664227197836923 +20.5,0.3024568515553722,3.818173233398124e-22,1.018899070622947,-0.16777909979090752 +21.0,0.3120773057518812,3.7210185324492045e-22,1.0196767193441865,-0.16890175553075787 +21.5,0.3215402368504375,3.611812445086458e-22,1.02078053393556,-0.1699502305940275 +22.0,0.3311249693407643,3.5080378003875746e-22,1.0220532053519564,-0.1710840685715006 +22.5,0.34087829255865654,3.412603794300539e-22,1.0237895459228592,-0.1723324469289635 +23.0,0.35066069396645466,3.3167660793512267e-22,1.0262725023095218,-0.17361724005932017 +23.5,0.36047204524369986,3.2205271694841624e-22,1.0293269669644896,-0.1749370369440311 +24.0,0.3703122180699332,3.1238895786438725e-22,1.0327778323403065,-0.1762904265645569 +24.5,0.380181084124696,3.026855820774882e-22,1.036449990889516,-0.1776759979023581 diff --git a/data/TUDELFT_V3_KITE/vsm_settings.yaml b/data/TUDELFT_V3_KITE/vsm_settings.yaml new file mode 100644 index 00000000..4e6fda6d --- /dev/null +++ b/data/TUDELFT_V3_KITE/vsm_settings.yaml @@ -0,0 +1,80 @@ +# ============================================================================= +# VSM Settings Configuration File +# ============================================================================= +# +# This YAML file configures the Vortex Step Method (VSM) aerodynamic solver +# for wing analysis. All simulation parameters are centralized here. +# +# FILE STRUCTURE: +# ├── condition: Flight conditions (wind speed, angles, rates) +# ├── wings: Wing geometry and discretization settings +# └── solver_settings: Numerical solver parameters and convergence criteria +# +# AERODYNAMIC MODELS: +# VSM: Vortex Step Method - Full 3D potential flow with wake modeling +# LLT: Lifting Line Theory - Classical 1D approach for high aspect ratios +# +# PANEL DISTRIBUTIONS: +# LINEAR: Uniform panel spacing along wingspan +# COSINE: Cosine clustering (more panels at tips) +# COSINE_VAN_GARREL: Van Garrel's modified cosine distribution +# SPLIT_PROVIDED: Use predefined section splits from geometry +# UNCHANGED: Preserve original geometry discretization +# +# INITIAL CIRCULATION DISTRIBUTIONS: +# ELLIPTIC: Elliptical distribution (optimal for efficiency) +# ZEROS: Start with zero circulation (cold start) +# +# SOLVER TYPES: +# LOOP: Iterative fixed-point solver +# NEWTON: Newton-Raphson nonlinear solver +# +# USAGE NOTES: +# - n_panels should be divisible by n_groups for proper load balancing +# - Higher n_panels improves accuracy but increases computation time +# - Lower relaxation_factor if convergence issues occur + +# Define the flight state for the aerodynamic analysis +condition: + wind_speed: 10.0 # [m/s] Free stream velocity magnitude + alpha: 5.0 # [°] Angle of attack (pitch angle relative to flow) + beta: 0.0 # [°] Sideslip angle (yaw angle relative to flow) + yaw_rate: 0.0 # [°/s] Yaw rate (for dynamic analysis, 0 for static) + +# Define wing geometry files and discretization parameters +wings: + - name: V3_Kite # Wing identifier for output labeling + geometry_file: data/TUDELFT_V3_KITE/wing_geometry_polars_CFD.yaml + n_panels: 36 # Total number of panels along wingspan + n_groups: 1 # Number of panel groups (must divide n_panels) + spanwise_panel_distribution: LINEAR # Panel spacing algorithm + spanwise_direction: [0.0, 1.0, 0.0] # Unit vector defining wingspan direction + remove_nan: true # Remove NaN values from polar data + +# Numerical method settings and convergence criteria +solver_settings: + # --- Core Aerodynamic Model --- + aerodynamic_model_type: VSM # VSM=3D vortex method, LLT=lifting line theory + solver_type: LOOP # LOOP=fixed-point iteration, NEWTON=Newton-Raphson + + # --- Physical Properties --- + density: 1.225 # [kg/m³] Air density (ISA sea level) + mu: 1.81e-5 # [N·s/m²] Dynamic viscosity (ISA sea level) + + # --- Convergence Control --- + max_iterations: 5000 # Maximum solver iterations before timeout + rtol: 1e-6 # Relative tolerance for convergence + tol_reference_error: 0.001 # Reference error tolerance + relaxation_factor: 0.01 # [0.001-0.1] Under-relaxation for stability + + # --- Numerical Stability --- + artificial_damping: false # Enable artificial damping for unstable cases + k2: 0.1 # 2nd-order damping coefficient + k4: 0.0 # 4th-order damping coefficient + core_radius_fraction: 1e-20 # Vortex core radius (fraction of chord) + + # --- Initial Conditions --- + type_initial_gamma_distribution: ELLIPTIC # Starting circulation distribution + + # --- Output Control --- + calc_only_f_and_gamma: false # true=compute only forces & circulation diff --git a/data/TUDELFT_V3_KITE/wing_geometry_polars_CFD.yaml b/data/TUDELFT_V3_KITE/wing_geometry_polars_CFD.yaml new file mode 100644 index 00000000..fb1313c8 --- /dev/null +++ b/data/TUDELFT_V3_KITE/wing_geometry_polars_CFD.yaml @@ -0,0 +1,233 @@ +wing_sections: + # --------------------------------------------------------------- + # headers: + # - airfoil_id: integer, unique identifier for the airfoil (matches wing_airfoils) + # - LE_x: x-coordinate of leading edge + # - LE_y: y-coordinate of leading edge + # - LE_z: z-coordinate of leading edge + # - TE_x: x-coordinate of trailing edge + # - TE_y: y-coordinate of trailing edge + # - TE_z: z-coordinate of trailing edge + # --------------------------------------------------------------- + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [19, 0.10494809354160103, 4.110425010287237, 8.27069488190273, 0.9322352740642089, 4.136759541813347, 8.276769856483405] + - [18, -0.12594856150986303, 4.095312460948618, 8.381752674216157, 0.9480319715306028, 4.119176793915081, 8.387506882641508] + - [17, -0.415204088177974, 4.058392218797549, 8.602739816172805, 0.9806642670037444, 4.0661917809302714, 8.604784652851428] + - [16, -0.5839406178913704, 4.017404143963288, 8.823136130673557, 1.0133061573517872, 4.0126965083918655, 8.821802062421128] + - [15, -0.6731255454312801, 3.9710648600916856, 9.042296994306358, 1.0459407519807051, 3.959304771307195, 9.038711553698102] + - [14, -0.7630010692513897, 3.808661454565653, 9.461650307607462, 1.1148900094481449, 3.8099544198423287, 9.462462687618386] + - [13, -0.8034346573868656, 3.671721332477886, 9.640208096108445, 1.1590484514963157, 3.676560321852442, 9.644355401152323] + - [12, -0.8426236438512831, 3.5037765531662273, 9.793146879047017, 1.2069146554234733, 3.5081098865401383, 9.79813951074277] + - [11, -0.9107041725649544, 3.136094612354681, 10.04874447891271, 1.3282999037052468, 3.1343435230977734, 10.046504069372347] + - [10, -0.9734084029764644, 2.799119438334862, 10.344239736588595, 1.341651389866222, 2.7979060165852596, 10.342401274552168] + - [9, -1.0012604181004636, 2.60606743950073, 10.460915675643339, 1.3470535121521396, 2.607652208222479, 10.4640730423076] + - [8, -1.0255704673876633, 2.3933957820040352, 10.539222758944668, 1.3704766336634273, 2.3946575320852, 10.542717092764684] + - [7, -1.066808167099677, 1.9597511829533572, 10.648710571788577, 1.4286937460004634, 1.9587427796536303, 10.645858306351975] + - [6, -1.102721455861017, 1.5539231291222366, 10.837899390284646, 1.4218476587327253, 1.5529087742581646, 10.834735742551917] + - [5, -1.1174483964012778, 1.3372547196154843, 10.903130724885706, 1.4206278262933396, 1.337221665561774, 10.902962868560538] + - [4, -1.1290037004055944, 1.111273134975715, 10.922140965756022, 1.4350857915331694, 1.1111744842343718, 10.920881486234418] + - [3, -1.1448828836323988, 0.6642030404518473, 10.908203792543517, 1.4733964618305042, 0.6638228115665804, 10.903361447444984] + - [2, -1.1544229650457856, 0.22477286325409476, 10.989264150331223, 1.4484005139953104, 0.2247570459738744, 10.989096462216464] + - [1, -1.1557911914860979, 0.0, 11.00491618799836, 1.443146003226444, 0.0, 11.004972573823276] + - [2, -1.1544229650457856, -0.22477286325409476, 10.989264150331223, 1.4484005139953104, -0.2247570459738744, 10.989096462216464] + - [3, -1.1448828836323988, -0.6642030404518473, 10.908203792543517, 1.4733964618305042, -0.6638228115665804, 10.903361447444984] + - [4, -1.1290037004055944, -1.111273134975715, 10.922140965756022, 1.4350857915331694, -1.1111744842343718, 10.920881486234418] + - [5, -1.1174483964012778, -1.3372547196154843, 10.903130724885706, 1.4206278262933396, -1.337221665561774, 10.902962868560538] + - [6, -1.102721455861017, -1.5539231291222366, 10.837899390284646, 1.4218476587327253, -1.5529087742581646, 10.834735742551917] + - [7, -1.066808167099677, -1.9597511829533572, 10.648710571788577, 1.4286937460004634, -1.9587427796536303, 10.645858306351975] + - [8, -1.0255704673876633, -2.3933957820040352, 10.539222758944668, 1.3704766336634273, -2.3946575320852, 10.542717092764684] + - [9, -1.0012604181004636, -2.60606743950073, 10.460915675643339, 1.3470535121521396, -2.607652208222479, 10.4640730423076] + - [10, -0.9734084029764644, -2.799119438334862, 10.344239736588595, 1.341651389866222, -2.7979060165852596, 10.342401274552168] + - [11, -0.9107041725649544, -3.136094612354681, 10.04874447891271, 1.3282999037052468, -3.1343435230977734, 10.046504069372347] + - [12, -0.8426236438512831, -3.5037765531662273, 9.793146879047017, 1.2069146554234733, -3.5081098865401383, 9.79813951074277] + - [13, -0.8034346573868656, -3.671721332477886, 9.640208096108445, 1.1590484514963157, -3.676560321852442, 9.644355401152323] + - [14, -0.7630010692513897, -3.808661454565653, 9.461650307607462, 1.1148900094481449, -3.8099544198423287, 9.462462687618386] + - [15, -0.6731255454312801, -3.9710648600916856, 9.042296994306358, 1.0459407519807051, -3.959304771307195, 9.038711553698102] + - [16, -0.5839406178913704, -4.017404143963288, 8.823136130673557, 1.0133061573517872, -4.0126965083918655, 8.821802062421128] + - [17, -0.415204088177974, -4.058392218797549, 8.602739816172805, 0.9806642670037444, -4.0661917809302714, 8.604784652851428] + - [18, -0.12594856150986303, -4.095312460948618, 8.381752674216157, 0.9480319715306028, -4.119176793915081, 8.387506882641508] + - [19, 0.10494809354160103, -4.110425010287237, 8.27069488190273, 0.9322352740642089, -4.136759541813347, 8.276769856483405] + +wing_airfoils: + # --------------------------------------------------------------- + # headers: + # - airfoil_id: integer, unique identifier for the airfoil + # - type: one of [neuralfoil, breukels_regression, masure_regression, polars] + # - info_dict: dictionary with parameters depending on 'type' + # + # info_dict fields by type: + # - breukels_regression: + # t: Tube diameter non-dimensionalized by chord (required) + # kappa: Maximum camber height/magnitude, non-dimensionalized by chord (required) + # - neuralfoil: + # dat_file_path: Path to airfoil .dat file (x, y columns) + # model_size: NeuralFoil model size (e.g., "xxxlarge") + # xtr_lower: Lower transition location (0=forced, 1=free) + # xtr_upper: Upper transition location + # n_crit: Critical amplification factor (see guidelines below) + # n_crit guidelines: + # Sailplane: 12–14 + # Motorglider: 11–13 + # Clean wind tunnel: 10–12 + # Average wind tunnel: 9 (standard "e^9 method") + # Dirty wind tunnel: 4–8 + # - polars: + # csv_file_path: Path to polar CSV file (columns: alpha [rad], cl, cd, cm) + # - masure_regression: + # t, eta, kappa, delta, lamba, phi: Regression parameters + # - inviscid: + # no further data is required + # --------------------------------------------------------------- + alpha_range: [-10, 31, 0.5] # [deg], in this range the polars are calculated + reynolds: !!float 1e6 # Reynolds number + headers: [airfoil_id, type, info_dict] + data: + # The polars were generated using 2D RANS CFD simulations at Re=5e5 + # And fitted using PCHIP interpolation + # See --> https://repository.tudelft.nl/record/uuid:865d59fc-ccff-462e-9bac-e81725f1c0c9 + - [1, polars, {csv_file_path: "polars_CFD/1.csv"}] + - [2, polars, {csv_file_path: "polars_CFD/2.csv"}] + - [3, polars, {csv_file_path: "polars_CFD/3.csv"}] + - [4, polars, {csv_file_path: "polars_CFD/4.csv"}] + - [5, polars, {csv_file_path: "polars_CFD/5.csv"}] + - [6, polars, {csv_file_path: "polars_CFD/6.csv"}] + - [7, polars, {csv_file_path: "polars_CFD/7.csv"}] + - [8, polars, {csv_file_path: "polars_CFD/8.csv"}] + - [9, polars, {csv_file_path: "polars_CFD/9.csv"}] + - [10, polars, {csv_file_path: "polars_CFD/10.csv"}] + - [11, polars, {csv_file_path: "polars_CFD/11.csv"}] + - [12, polars, {csv_file_path: "polars_CFD/12.csv"}] + - [13, polars, {csv_file_path: "polars_CFD/13.csv"}] + - [14, polars, {csv_file_path: "polars_CFD/14.csv"}] + - [15, polars, {csv_file_path: "polars_CFD/15.csv"}] + - [16, polars, {csv_file_path: "polars_CFD/16.csv"}] + - [17, polars, {csv_file_path: "polars_CFD/17.csv"}] + - [18, polars, {csv_file_path: "polars_CFD/18.csv"}] + - [19, polars, {csv_file_path: "polars_CFD/19.csv"}] + + + +bridle_nodes: + # --------------------------------------------------------------- + # headers: + # - id: integer, unique identifier for the node + # - x: x-coordinate [m] + # - y: y-coordinate [m] + # - z: z-coordinate [m] + # - type: node type, either 'knot' or 'pulley' + # --------------------------------------------------------------- + headers: [id, x, y, z, type] + data: + - [21, -0.67653494, 2.10580567, 7.08413599, knot] + - [22, -0.79196791, 1.01882151, 7.57069579, knot] + - [23, -0.79196791, -1.01882151, 7.57069579, knot] + - [24, -0.67653494, -2.10580567, 7.08413599, knot] + - [25, -0.46444477, 0.77505128, 4.23316161, knot] + - [26, -0.46444477, -0.77505128, 4.23316161, knot] + - [27, 0.54344694, 1.57655435, 5.91086207, knot] + - [28, 0.62960591, 0.92728966, 6.64639402, knot] + - [29, 0.62960591, -0.92728966, 6.64639402, knot] + - [30, 0.54344694, -1.57655435, 5.91086207, knot] + - [31, 0.39092886, 0.71221536, 4.26118728, knot] + - [32, 0.39092886, -0.71221536, 4.26118728, knot] + - [33, 0.30679124, 0.49235914, 3.39885672, pulley] + - [34, 0.28625931, 0.0, 3.19030736, knot] + - [35, 0.30679124, -0.49235914, 3.39885672, pulley] + - [36, 0.13269336, 0.23394851, 1.48060245, knot] + - [37, 0.13269336, -0.23394851, 1.48060245, knot] + +bridle_lines: + # --------------------------------------------------------------- + # headers: + # - name: string, line name + # - rest_length: measured rest length [m] + # - diameter: line diameter [m] + # - material: string, material type (e.g., dyneema) + # - density: material density [kg/m^3] + # --------------------------------------------------------------- + headers: [name, rest_length, diameter, material, density] + data: + # front lines + - [a6, 11.790, 0.002, dyneema,970] + - [A5, 2.870, 0.002, dyneema,970] + - [A3, 3.450, 0.002, dyneema,970] + - [A2, 3.500, 0.002, dyneema,970] + - [A1, 3.690, 0.002, dyneema,970] + - [AII, 3.250, 0.002, dyneema,970] + - [AI, 3.620, 0.002, dyneema,970] + - [amain, 3.910, 0.002, dyneema,970] + # rear lines + - [br1, 4.410, 0.002, dyneema,970] + - [br2, 4.170, 0.002, dyneema,970] + - [br3, 4.140, 0.002, dyneema,970] + - [br5, 3.580, 0.002, dyneema,970] + - [br6, 13.560, 0.002, dyneema,970] + - [BRI, 2.360, 0.002, dyneema,970] + - [BRII, 2.080, 0.002, dyneema,970] + - [BR-main-1, .700, 0.002, dyneema,970] + - [M-line, 2.410, 0.002, dyneema,970] + # - [S, 1.730, 0.002, dyneema,970] # measured + # - [Power Tape, 3.330, 0.002, polyester] # measured + - [Steering Tape, 1.530, 0.002, dyneema,970] # trying 0.2m smalller + - [Power Tape, 2.900, 0.002, dyneema,970] # trying 0.2m smaller + +bridle_connections: + # --------------------------------------------------------------- + # headers: + # - name: string, line name + # - ci: integer, node id (start) + # - cj: integer, node id (end) + # - ck: integer, third node id (only for pulleys, else omitted or 0) + # --------------------------------------------------------------- + headers: [name, ci, cj, ck] + data: + # front lines + - [a6,1,25,33] #e.g. this is a pulley + - [A5,3,21] + - [A3,5,21] + - [A2,7,22] + - [A1,9,22] + - [A1,11,23] + - [A2,13,23] + - [A3,15,24] + - [A5,17,24] + - [a6,19,26,35] + - [AII,21,25] + - [AI,22,25] + - [AI,23,26] + - [AII,24,26] + - [amain,25,0] + - [amain,26,0] + # rear lines + - [a6,1,33,25] + - [br6,2,33,36] + - [br6,2,36,33] + - [br5,4,27] + - [br3,6,27] + - [br2,8,28] + - [br1,10,28] + - [br1,12,29] + - [br2,14,29] + - [br3,16,30] + - [br5,18,30] + - [a6,19,35,26] + - [br6,20,35,37] + - [br6,20,37,35] + - [BRII,27,31] + - [BRI,28,31] + - [BRI,29,32] + - [BRII,30,32] + - [BR-main-1,31,33] + - [BR-main-1,32,35] + - [M-line,33,36,34] + - [M-line,33,34,36] + - [M-line,35,34,37] + - [M-line,35,37,34] + - [Steering Tape,36,0] + - [Power Tape,34,0] + - [Steering Tape,37,0] + + + + diff --git a/data/TUDELFT_V3_LEI_KITE/literature_results/V3_CL_CD_RANS_Lebesque_2024_Rey_300e4.csv b/data/TUDELFT_V3_LEI_KITE/literature_results/V3_CL_CD_RANS_Lebesque_2024_Rey_300e4.csv deleted file mode 100644 index 5bee35d1..00000000 --- a/data/TUDELFT_V3_LEI_KITE/literature_results/V3_CL_CD_RANS_Lebesque_2024_Rey_300e4.csv +++ /dev/null @@ -1,19 +0,0 @@ -CL,CD,aoa --0.114285714,0.0744,-5 --0.050793651,0.068,-4 -0.082539683,0.0552,-2 -0.247619048,0.0512,0 -0.4,0.052,2 -0.46984127,0.0528,3 -0.542857143,0.0576,4 -0.685714286,0.0656,6 -0.80952381,0.0776,8 -0.873015873,0.0832,9 -0.93015873,0.0928,10 -1.047619048,0.1104,12 -1.155555556,0.1296,14 -1.250793651,0.1504,16 -1.13015873,0.2024,18 -1.146031746,0.2248,20 -1.146031746,0.2252,22 -1.158730159,0.2816,24 diff --git a/data/pyramid_model/polars/V3_kite_midspan_airfoil_polar.csv b/data/pyramid_model/polars/V3_kite_midspan_airfoil_polar.csv new file mode 100644 index 00000000..8e996699 --- /dev/null +++ b/data/pyramid_model/polars/V3_kite_midspan_airfoil_polar.csv @@ -0,0 +1,71 @@ +alpha,Cd,Cs,Cl,Cm +-10.0,0.1759893858334057,2.963819078393553e-21,-0.7493726713784946,0.2323775006207747 +-9.5,0.16289734924603438,2.7877286866584314e-21,-0.6924217529040287,0.2150382675337481 +-9.0,0.1504301874457461,2.6166544368792525e-21,-0.6371323632116463,0.1982607529225381 +-8.5,0.13862765245364775,2.4505707167459407e-21,-0.583498032661642,0.182046261914037 +-8.0,0.1275294962908461,2.2894519139484196e-21,-0.5315122916143107,0.16639609963513724 +-7.5,0.11717547097844788,2.133272416176612e-21,-0.4811686704299467,0.15131157121273117 +-7.0,0.10760532853756002,1.9820066111204418e-21,-0.4324606994688453,0.13679398177371113 +-6.5,0.09885882098928928,1.8356288864698326e-21,-0.38538190909130093,0.12284463644496953 +-6.0,0.09097570035474245,1.694113629914708e-21,-0.3399258296576083,0.10946484035339869 +-5.5,0.08399571865502635,1.557435229144991e-21,-0.2960859915280623,0.09665589862589102 +-5.0,0.0779586279112478,1.4255680718506053e-21,-0.2538559250629577,0.0844191163893389 +-4.5,0.07276768079432067,1.304392579507697e-21,-0.21595504346747285,0.07305505165488536 +-4.0,0.06820918462412777,1.1952100521496464e-21,-0.18295885873231385,0.06261743540439639 +-3.5,0.06414747339522936,1.0911261953022303e-21,-0.15164504939606627,0.05273733222084856 +-3.0,0.06044688110218564,9.852467144912246e-22,-0.11879129399731583,0.0430458066872185 +-2.5,0.056971741739556846,8.706773152424055e-22,-0.08117527107464828,0.03317392338648285 +-2.0,0.0535863893019032,7.405237030815495e-22,-0.0355746591666493,0.0227527469016182 +-1.5,0.050350423572556896,5.856067102929198e-22,0.026226099750827674,0.011481449300827454 +-1.0,0.04735778299115752,4.0923582258582316e-22,0.10429086281980794,-0.00026565530478757544 +-0.5,0.04452430953672641,2.232497256236004e-22,0.189614400178524,-0.011844789267901869 +0.0,0.0417658451882849,3.948710506959264e-23,0.2731914819652083,-0.0226121749411904 +0.5,0.038938158507699175,-1.5308243840478701e-22,0.3557444890017091,-0.03336699893672287 +1.0,0.036117770291757965,-3.560898065690111e-22,0.4410912179803868,-0.0442048470204237 +1.5,0.03355165087186637,-5.435970674210673e-22,0.5248695628452424,-0.05342654027574999 +2.0,0.0314867705794295,-6.896662889589436e-22,0.6027174175402769,-0.0593328997861588 +2.5,0.029737782322488943,-8.01300470612271e-22,0.6754871235581754,-0.06287604536210906 +3.0,0.028000254685969946,-9.031057734401621e-22,0.7466883077319687,-0.06610779561686102 +3.5,0.026342531516603155,-9.955490078848253e-22,0.8159447920161751,-0.06897851983807372 +4.0,0.024832956661119197,-1.07909698438847e-21,0.882880398365313,-0.0714385873134062 +4.5,0.023539873966248726,-1.1542165133933057e-21,0.9471189487339009,-0.07343836733051758 +5.0,0.022531627278722356,-1.221374405341541e-21,1.0082842650764576,-0.07492822917706685 +5.5,0.021876560445270733,-1.2810374706753849e-21,1.0660001693475016,-0.07585854214071311 +6.0,0.0216430173126245,-1.3336725198370469e-21,1.1198904835015508,-0.0761796755091154 +6.5,0.021855502747260325,-1.3836048414175573e-21,1.1730032825989054,-0.07614317006852858 +7.0,0.022476813390075807,-1.4334901652977566e-21,1.2273051287313683,-0.07604692845243605 +7.5,0.023482730749432957,-1.4812909638545697e-21,1.280797574400714,-0.0759108627193397 +8.0,0.02484903633369378,-1.52496970946492e-21,1.3314821721087169,-0.07575488492774146 +8.5,0.026551511651220286,-1.5624888745057316e-21,1.3773604743571508,-0.07559890713614321 +9.0,0.028565938210374484,-1.5918109313539293e-21,1.4164340336477907,-0.07546284140304686 +9.5,0.030868097519518387,-1.610898352386437e-21,1.4467044024824103,-0.07536659978695433 +10.0,0.033433771087014,-1.6177136099801785e-21,1.4661731333627843,-0.0753300943463675 +10.5,0.03772956880131731,-1.6057175342808367e-21,1.4791075252059553,-0.07796780684956318 +11.0,0.04483478356085069,-1.573737170673408e-21,1.4901408957026034,-0.0844740956822261 +11.5,0.054144221388925814,-1.527784314393788e-21,1.4978238255149576,-0.09273868782897009 +12.0,0.0650526883088543,-1.473870760677872e-21,1.5007068953052467,-0.100651310274409 +12.5,0.0813064038148973,-1.376249216669895e-21,1.4478125078785742,-0.10828545090079453 +13.0,0.10393510413553603,-1.227647034548664e-21,1.327791188740308,-0.11661304574760116 +13.5,0.12825887039541226,-1.0767879771019317e-21,1.1986357026030765,-0.12487149403527704 +14.0,0.1495977837191678,-9.723958071174512e-22,1.1183388141795072,-0.1322981949842703 +14.5,0.16758478702300417,-9.126318501956502e-22,1.0836834275674483,-0.13916224193214982 +15.0,0.18464791495839383,-8.633432558691364e-22,1.0549329936239267,-0.14581097523802025 +15.5,0.20029988625288483,-8.247825228239323e-22,1.0353010972003385,-0.15159916465463338 +16.0,0.2140534196340252,-7.972021497460613e-22,1.028001323148079,-0.155881579934741 +16.5,0.22575911507873533,-7.765045354525572e-22,1.0279465928930964,-0.1588574292964903 +17.0,0.23609366837079485,-7.591163461883778e-22,1.0279074596231041,-0.1612711173409803 +17.5,0.24580894194804037,-7.460764817814329e-22,1.0278839558321435,-0.1632952083953905 +18.0,0.2556567982483086,-7.38423842059632e-22,1.0278761140142585,-0.1651022667869003 +18.5,0.265699815399311,-7.344986178163224e-22,1.0281104344749106,-0.16669752709328292 +19.0,0.27558646593010794,-7.316573885898107e-22,1.0287304726554904,-0.16807297439296806 +19.5,0.28544745388056003,-7.294636373254447e-22,1.0296118437539339,-0.1693812987641203 +20.0,0.2954134832905278,-7.274808469685726e-22,1.030630162968177,-0.1707751902849041 +20.5,0.3055500999908466,-7.253401091686849e-22,1.0321158975458387,-0.17232913459444757 +21.0,0.3157783912824044,-7.232601462733436e-22,1.034270073518937,-0.17395281724452416 +21.5,0.32601237341014067,-7.216858872750047e-22,1.036774144262008,-0.17555172818226641 +22.0,0.3361660626189948,-7.210622611661238e-22,1.039309563149587,-0.1770313573548068 +22.5,0.3462258406278082,-7.210927738558214e-22,1.0418506907541978,-0.17838813341813575 +23.0,0.35623515262436534,-7.213063626837044e-22,1.044574269637424,-0.17967706251871235 +23.5,0.36619361005701967,-7.21886103787958e-22,1.0474653261573934,-0.18089150083937203 +24.0,0.3761008243741252,-7.230150733067677e-22,1.0505088866722323,-0.18202480456295017 +24.5,0.38595640702403533,-7.248763473783189e-22,1.0536899775400672,-0.18307032987228236 diff --git a/data/pyramid_model/vsm_settings.yaml b/data/pyramid_model/vsm_settings.yaml new file mode 100644 index 00000000..93ba2ca8 --- /dev/null +++ b/data/pyramid_model/vsm_settings.yaml @@ -0,0 +1,80 @@ +# ============================================================================= +# VSM Settings Configuration File +# ============================================================================= +# +# This YAML file configures the Vortex Step Method (VSM) aerodynamic solver +# for wing analysis. All simulation parameters are centralized here. +# +# FILE STRUCTURE: +# ├── condition: Flight conditions (wind speed, angles, rates) +# ├── wings: Wing geometry and discretization settings +# └── solver_settings: Numerical solver parameters and convergence criteria +# +# AERODYNAMIC MODELS: +# VSM: Vortex Step Method - Full 3D potential flow with wake modeling +# LLT: Lifting Line Theory - Classical 1D approach for high aspect ratios +# +# PANEL DISTRIBUTIONS: +# LINEAR: Uniform panel spacing along wingspan +# COSINE: Cosine clustering (more panels at tips) +# COSINE_VAN_GARREL: Van Garrel's modified cosine distribution +# SPLIT_PROVIDED: Use predefined section splits from geometry +# UNCHANGED: Preserve original geometry discretization +# +# INITIAL CIRCULATION DISTRIBUTIONS: +# ELLIPTIC: Elliptical distribution (optimal for efficiency) +# ZEROS: Start with zero circulation (cold start) +# +# SOLVER TYPES: +# LOOP: Iterative fixed-point solver +# NEWTON: Newton-Raphson nonlinear solver +# +# USAGE NOTES: +# - n_panels should be divisible by n_groups for proper load balancing +# - Higher n_panels improves accuracy but increases computation time +# - Lower relaxation_factor if convergence issues occur + +# Define the flight state for the aerodynamic analysis +condition: + wind_speed: 10.0 # [m/s] Free stream velocity magnitude + alpha: 5.0 # [°] Angle of attack (pitch angle relative to flow) + beta: 0.0 # [°] Sideslip angle (yaw angle relative to flow) + yaw_rate: 0.0 # [°/s] Yaw rate (for dynamic analysis, 0 for static) + +# Define wing geometry files and discretization parameters +wings: + - name: V3_Kite # Wing identifier for output labeling + geometry_file: data/pyramid_model/wing_geometry.yaml + n_panels: 2 # Total number of panels along wingspan + n_groups: 1 # Number of panel groups (must divide n_panels) + spanwise_panel_distribution: LINEAR # Panel spacing algorithm + spanwise_direction: [0.0, 1.0, 0.0] # Unit vector defining wingspan direction + remove_nan: true # Remove NaN values from polar data + +# Numerical method settings and convergence criteria +solver_settings: + # --- Core Aerodynamic Model --- + aerodynamic_model_type: VSM # VSM=3D vortex method, LLT=lifting line theory + solver_type: LOOP # LOOP=fixed-point iteration, NEWTON=Newton-Raphson + + # --- Physical Properties --- + density: 1.225 # [kg/m³] Air density (ISA sea level) + mu: 1.81e-5 # [N·s/m²] Dynamic viscosity (ISA sea level) + + # --- Convergence Control --- + max_iterations: 5000 # Maximum solver iterations before timeout + rtol: 1e-6 # Relative tolerance for convergence + tol_reference_error: 0.001 # Reference error tolerance + relaxation_factor: 0.01 # [0.001-0.1] Under-relaxation for stability + + # --- Numerical Stability --- + artificial_damping: false # Enable artificial damping for unstable cases + k2: 0.1 # 2nd-order damping coefficient + k4: 0.0 # 4th-order damping coefficient + core_radius_fraction: 1e-20 # Vortex core radius (fraction of chord) + + # --- Initial Conditions --- + type_initial_gamma_distribution: ELLIPTIC # Starting circulation distribution + + # --- Output Control --- + calc_only_f_and_gamma: false # true=compute only forces & circulation diff --git a/data/pyramid_model/wing_geometry.yaml b/data/pyramid_model/wing_geometry.yaml new file mode 100644 index 00000000..74e62c61 --- /dev/null +++ b/data/pyramid_model/wing_geometry.yaml @@ -0,0 +1,68 @@ +# Kite system geometry for simulation based on provided Julia code + +wing_sections: + # --------------------------------------------------------------- + # headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + # airfoil_id: 1 (since only one polar/interpolator is used) + # The kite is represented by 4 chordwise points at y = width/2, -width/2 and at y = 0. + # Chord positions from get_kite_points(s): P2 (center right), P3 (center left) + # Bridle/other points are omitted for simplicity. + # Units: meters + # --------------------------------------------------------------- + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 4.08, 4.9, 2.0, 4.08, 4.9] # Right tip chord (P2) + - [1, 0.0, -4.08, 4.9, 2.0, -4.08, 4.9] # Left tip chord (P3) + - [1, 0.0, 0.0, 8.05, 2.0, 0.0, 8.05] # Bridle attachment (P4/P5 merged, approx.) + +wing_airfoils: + # --------------------------------------------------------------- + # Only one polar, which is interpolated in code; you may later link to a CSV file. + # --------------------------------------------------------------- + alpha_range: [-180, 180, 1] # deg + reynolds: 1e6 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "polars/V3_kite_midspan_airfoil_polar.csv"}] + +bridle_nodes: + # --------------------------------------------------------------- + # Use the points from get_kite_points(s), assuming: + # - P1: Bridle point + # - P2: right tip + # - P3: left tip + # - P4/P5: at width/2, -width/2, z = bridle height + # --------------------------------------------------------------- + headers: [id, x, y, z, type] + data: + - [1, 0.0, 0.0, 0.0, knot] # Bridle origin + - [2, 0.0, 4.08, 8.05, knot] # Right tip + - [3, 0.0, -4.08, 8.05, knot] # Left tip + - [4, 0.0, 4.08, 4.9, knot] # Bridle top right + - [5, 0.0, -4.08, 4.9, knot] # Bridle top left + +bridle_lines: + # --------------------------------------------------------------- + headers: [name, rest_length, diameter, material, density] + data: + - [bridle_main, 33.4, 0.0025, dyneema, 970] + +bridle_connections: + # --------------------------------------------------------------- + # Very simplified; you can expand as needed. Connects bridle origin to tips and bridle tops. + # headers: [name, ci, cj, ck] + data: + - [bridle_main, 1, 2, 0] + - [bridle_main, 1, 3, 0] + - [bridle_main, 1, 4, 0] + - [bridle_main, 1, 5, 0] + - [bridle_top, 4, 2, 0] + - [bridle_top, 5, 3, 0] + +tether: + # Tether from bridle origin (node 1) extending for l_tether meters + length: 50.0 + diameter: 0.004 + material: dyneema + density: 724.0 + segments: 14 diff --git a/data/ram_air_kite_body.obj b/data/ram_air_kite/ram_air_kite_body.obj similarity index 100% rename from data/ram_air_kite_body.obj rename to data/ram_air_kite/ram_air_kite_body.obj diff --git a/data/ram_air_kite_foil.dat b/data/ram_air_kite/ram_air_kite_foil.dat similarity index 100% rename from data/ram_air_kite_foil.dat rename to data/ram_air_kite/ram_air_kite_foil.dat diff --git a/data/ram_air_kite_foil_cd_polar.csv b/data/ram_air_kite/ram_air_kite_foil_cd_polar.csv similarity index 100% rename from data/ram_air_kite_foil_cd_polar.csv rename to data/ram_air_kite/ram_air_kite_foil_cd_polar.csv diff --git a/data/ram_air_kite_foil_cl_polar.csv b/data/ram_air_kite/ram_air_kite_foil_cl_polar.csv similarity index 100% rename from data/ram_air_kite_foil_cl_polar.csv rename to data/ram_air_kite/ram_air_kite_foil_cl_polar.csv diff --git a/data/ram_air_kite_foil_cm_polar.csv b/data/ram_air_kite/ram_air_kite_foil_cm_polar.csv similarity index 100% rename from data/ram_air_kite_foil_cm_polar.csv rename to data/ram_air_kite/ram_air_kite_foil_cm_polar.csv diff --git a/data/vsm_settings.yaml b/data/ram_air_kite/vsm_settings.yaml similarity index 100% rename from data/vsm_settings.yaml rename to data/ram_air_kite/vsm_settings.yaml diff --git a/data/vsm_settings_dual.yaml b/data/ram_air_kite/vsm_settings_dual.yaml similarity index 100% rename from data/vsm_settings_dual.yaml rename to data/ram_air_kite/vsm_settings_dual.yaml diff --git a/examples/V3_kite.jl b/examples/V3_kite.jl new file mode 100644 index 00000000..9f50b6d4 --- /dev/null +++ b/examples/V3_kite.jl @@ -0,0 +1,90 @@ +using LinearAlgebra +using VortexStepMethod +using ControlPlots + +project_dir = dirname(dirname(pathof(VortexStepMethod))) # Go up one level from src to project root# +literature_paths = [ + joinpath(project_dir, "data", "TUDELFT_V3_KITE", "literature_results","CFD_RANS_Rey_5e5_Poland2025_alpha_sweep_beta_0_NoStruts.csv"), + joinpath(project_dir, "data", "TUDELFT_V3_KITE", "literature_results","CFD_RANS_Rey_10e5_Poland2025_alpha_sweep_beta_0.csv"), + joinpath(project_dir, "data", "TUDELFT_V3_KITE", "literature_results","Python_VSM_Rey_5e5_n36_CFD_PCHIP_polars_alpha_sweep.csv"), + joinpath(project_dir, "data", "TUDELFT_V3_KITE", "literature_results","WindTunnel_Re_5e5_Poland2025_alpha_sweep_beta_0.csv"), + ] +labels= [ + "Julia VSM 2D CFD PCHIP", + "CFD RANS Re=5e5", + "CFD RANS Re=10e5 (With Struts)", + "Python VSM 2D CFD PCHIP Re=5e5", + "Wind Tunnel Re=5e5 (With Struts)" + ] + +# Load VSM settings from YAML configuration file +settings = VSMSettings("TUDELFT_V3_KITE/vsm_settings.yaml") + +# Create wing, body_aero, and solver objects using settings +wing = Wing(settings) +body_aero = BodyAerodynamics([wing]) +solver = Solver(body_aero, settings) + +# Set flight conditions from settings +set_va!(body_aero, settings) + +# Extract values for plotting (optional - for reference) +wind_speed = settings.condition.wind_speed +angle_of_attack_deg = settings.condition.alpha +sideslip_deg = settings.condition.beta +yaw_rate = settings.condition.yaw_rate + +# Using plotting modules, to create more comprehensive plots +PLOT = true +USE_TEX = false + +# Plotting polars +PLOT && plot_polars( + [solver], + [body_aero], + labels, + literature_path_list=literature_paths, + angle_range=range(-5, 25, length=30), + angle_type="angle_of_attack", + angle_of_attack=angle_of_attack_deg, + side_slip=sideslip_deg, + v_a=wind_speed, + title="$(wing.n_panels)_panels_$(wing.spanwise_distribution)_from_yaml_settings", + data_type=".pdf", + is_save=false, + is_show=true, + use_tex=USE_TEX +) + + +# Plotting geometry +results = VortexStepMethod.solve(solver, body_aero; log=true) +PLOT && plot_geometry( + body_aero, + ""; + data_type=".svg", + save_path="", + is_save=false, + is_show=true, + view_elevation=15, + view_azimuth=-120, + use_tex=USE_TEX +) + + +# Plotting spanwise distributions +body_y_coordinates = [panel.aero_center[2] for panel in body_aero.panels] + +PLOT && plot_distribution( + [body_y_coordinates], + [results], + ["VSM"]; + title="CAD_spanwise_distributions_alpha_$(round(angle_of_attack_deg, digits=1))_delta_$(round(sideslip_deg, digits=1))_yaw_$(round(yaw_rate, digits=1))_v_a_$(round(wind_speed, digits=1))", + data_type=".pdf", + is_save=false, + is_show=true, + use_tex=USE_TEX +) + + +nothing \ No newline at end of file diff --git a/examples/bench.jl b/examples/bench.jl index 87332aec..89544278 100644 --- a/examples/bench.jl +++ b/examples/bench.jl @@ -56,7 +56,11 @@ println("Rectangular wing, solve:") @time solve(vsm_solver, body_aero, nothing) # Create wing geometry -wing = RamAirWing("data/ram_air_kite_body.obj", "data/ram_air_kite_foil.dat"; prn=false) +wing = RamAirWing( + joinpath("data", "ram_air_kite", "ram_air_kite_body.obj"), + joinpath("data", "ram_air_kite", "ram_air_kite_foil.dat"); + prn=false +) body_aero = BodyAerodynamics([wing]) # Create solvers diff --git a/examples/cleanup.jl b/examples/cleanup.jl index ce0d248d..c1d8f1cc 100644 --- a/examples/cleanup.jl +++ b/examples/cleanup.jl @@ -2,9 +2,9 @@ # delete the generated polars # it is useful if you want to benchmark the polar generation or if you have changed parameters -file1="data/ram_air_kite_foil_cl_polar.csv" -file2="data/ram_air_kite_foil_cd_polar.csv" -file3="data/ram_air_kite_foil_cm_polar.csv" +file1="data/ram_air_kite/ram_air_kite_foil_cl_polar.csv" +file2="data/ram_air_kite/ram_air_kite_foil_cd_polar.csv" +file3="data/ram_air_kite/ram_air_kite_foil_cm_polar.csv" isfile(file1) && rm(file1) isfile(file2) && rm(file2) isfile(file3) && rm(file3) diff --git a/examples/menu.jl b/examples/menu.jl index ee4ba929..4454ccee 100644 --- a/examples/menu.jl +++ b/examples/menu.jl @@ -9,7 +9,10 @@ using REPL.TerminalMenus url = "https://opensourceawe.github.io/VortexStepMethod.jl/dev" -options = ["rectangular_wing = include(\"rectangular_wing.jl\")", +options = [ + "V3_kite = include(\"V3_kite.jl\")", + "pyramid_model = include(\"pyramid_model.jl\")", + "rectangular_wing = include(\"rectangular_wing.jl\")", "ram_air_kite = include(\"ram_air_kite.jl\")", "stall_model = include(\"stall_model.jl\")", "bench = include(\"bench.jl\")", diff --git a/examples/pyramid_model.jl b/examples/pyramid_model.jl new file mode 100644 index 00000000..837e26ef --- /dev/null +++ b/examples/pyramid_model.jl @@ -0,0 +1,76 @@ +using LinearAlgebra +using VortexStepMethod +using ControlPlots + +project_dir = dirname(dirname(pathof(VortexStepMethod))) # Go up one level from src to project root + +# Load VSM vsm_settings from YAML configuration file +vsm_settings = VSMSettings("pyramid_model/vsm_settings.yaml") + +# Create wing, body_aero, and solver objects using vsm_settings +wing = Wing(vsm_settings) +body_aero = BodyAerodynamics([wing]) +solver = Solver(body_aero, vsm_settings) + +# Set flight conditions from settings +set_va!(body_aero, vsm_settings) + +# Extract values for plotting (optional - for reference) +wind_speed = vsm_settings.condition.wind_speed +angle_of_attack_deg = vsm_settings.condition.alpha +sideslip_deg = vsm_settings.condition.beta +yaw_rate = vsm_settings.condition.yaw_rate + +# Run the solver +results = VortexStepMethod.solve(solver, body_aero; log=true) + +# Using plotting modules, to create more comprehensive plots +PLOT = true +USE_TEX = false + +# Plotting polars +PLOT && plot_polars( + [solver], + [body_aero], + ["VSM Pyramid Model"], + angle_range=range(-5, 25, length=30), + angle_type="angle_of_attack", + angle_of_attack=angle_of_attack_deg, + side_slip=sideslip_deg, + v_a=wind_speed, + title="$(wing.n_panels)_panels_$(wing.spanwise_distribution)_pyramid_model", + data_type=".pdf", + is_save=false, + is_show=true, + use_tex=USE_TEX +) + +# Plotting geometry +results = VortexStepMethod.solve(solver, body_aero; log=true) +PLOT && plot_geometry( + body_aero, + ""; + data_type=".svg", + save_path="", + is_save=false, + is_show=true, + view_elevation=15, + view_azimuth=-120, + use_tex=USE_TEX +) + +# Plotting spanwise distributions +body_y_coordinates = [panel.aero_center[2] for panel in body_aero.panels] + +PLOT && plot_distribution( + [body_y_coordinates], + [results], + ["VSM"]; + title="pyramid_spanwise_distributions_alpha_$(round(angle_of_attack_deg, digits=1))_delta_$(round(sideslip_deg, digits=1))_yaw_$(round(yaw_rate, digits=1))_v_a_$(round(wind_speed, digits=1))", + data_type=".pdf", + is_save=false, + is_show=true, + use_tex=USE_TEX +) + +nothing \ No newline at end of file diff --git a/examples/ram_air_kite.jl b/examples/ram_air_kite.jl index ab30b027..f10b8d5b 100644 --- a/examples/ram_air_kite.jl +++ b/examples/ram_air_kite.jl @@ -9,7 +9,11 @@ DEFORM = false LINEARIZE = false # Create wing geometry -wing = RamAirWing("data/ram_air_kite_body.obj", "data/ram_air_kite_foil.dat"; prn=PRN) +wing = RamAirWing( + joinpath("data", "ram_air_kite", "ram_air_kite_body.obj"), + joinpath("data", "ram_air_kite", "ram_air_kite_foil.dat"); + prn=PRN +) body_aero = BodyAerodynamics([wing];) println("First init") @time VortexStepMethod.reinit!(body_aero) diff --git a/src/VortexStepMethod.jl b/src/VortexStepMethod.jl index 15d3829b..c852c48e 100644 --- a/src/VortexStepMethod.jl +++ b/src/VortexStepMethod.jl @@ -12,7 +12,7 @@ using LaTeXStrings using NonlinearSolve import NonlinearSolve: solve!, solve using Interpolations -using Interpolations: Extrapolation +import Interpolations: Extrapolation using Parameters using Serialization using Timers @@ -22,10 +22,11 @@ using Pkg using DifferentiationInterface import SciMLBase: successful_retcode import YAML +using StructMapping using Xfoil # Export public interface -export VSMSettings, WingSettings, SolverSettings, vs +export VSMSettings, WingSettings, SolverSettings export Wing, Section, RamAirWing, reinit! export BodyAerodynamics export Solver, solve, solve_base!, solve!, VSMSolution, linearize @@ -39,14 +40,14 @@ export PanelDistribution, LINEAR, COSINE, COSINE_VAN_GARREL, SPLIT_PROVIDED, UNC export InitialGammaDistribution, ELLIPTIC, ZEROS export SolverStatus, FEASIBLE, INFEASIBLE, FAILURE export SolverType, LOOP, NONLIN +export load_polar_data -export plot_geometry, plot_distribution, plot_circulation_distribution, plot_geometry, plot_polars, save_plot, show_plot, plot_polar_data +export plot_geometry, plot_distribution, plot_circulation_distribution, plot_polars, save_plot, show_plot, plot_polar_data # the following functions are defined in ext/VortexStepMethodExt.jl function plot_geometry end function plot_distribution end function plot_circulation_distribution end -function plot_geometry end function plot_polars end function save_plot end function show_plot end @@ -202,7 +203,9 @@ const AeroData = Union{ } function menu() - Main.include("examples/menu.jl") + # Load the examples menu using a portable path + ex = joinpath(dirname(pathof(@__MODULE__)), "..", "examples", "menu.jl") + Base.include(Main, normpath(ex)) end """ @@ -213,11 +216,11 @@ Copy all example scripts to the folder "examples" """ function copy_examples() PATH = "examples" - if ! isdir(PATH) + if ! isdir(PATH) mkdir(PATH) end src_path = joinpath(dirname(pathof(@__MODULE__)), "..", PATH) - copy_files("examples", readdir(src_path)) + copy_files(PATH, readdir(src_path)) end function install_examples(add_packages=true) @@ -270,6 +273,7 @@ include("settings.jl") include("wing_geometry.jl") include("polars.jl") include("ram_geometry.jl") +include("yaml_geometry.jl") include("filament.jl") include("panel.jl") include("body_aerodynamics.jl") diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 6860ac94..87e75fec 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -18,7 +18,7 @@ Main structure for calculating aerodynamic properties of bodies. Use the constru - `work_vectors`::NTuple{10, MVec3} = ntuple(_ -> zeros(MVec3), 10) - `AIC::Array{Float64, 3}` = zeros(3, P, P) - `projected_area::Float64` = 1.0: The area projected onto the xy-plane of the kite body reference frame [m²] -- `y::MVector{P, Float64}` = zeros(MVector{P, Float64}) +- `y::MVector{P, Float64}` = MVector{P,Float64}(zeros(P)) - `cache::Vector{PreallocationTools.LazyBufferCache{typeof(identity), typeof(identity)}}` = [LazyBufferCache() for _ in 1:5] """ @with_kw mutable struct BodyAerodynamics{P} @@ -26,16 +26,16 @@ Main structure for calculating aerodynamic properties of bodies. Use the constru wings::Union{Vector{Wing}, Vector{RamAirWing}} _va::MVec3 = zeros(MVec3) omega::MVec3 = zeros(MVec3) - gamma_distribution::MVector{P, Float64} = zeros(MVector{P, Float64}) - alpha_uncorrected::MVector{P, Float64} = zeros(MVector{P, Float64}) - alpha_corrected::MVector{P, Float64} = zeros(MVector{P, Float64}) - stall_angle_list::MVector{P, Float64} = zeros(MVector{P, Float64}) - alpha_array::MVector{P, Float64} = zeros(MVector{P, Float64}) - v_a_array::MVector{P, Float64} = zeros(MVector{P, Float64}) + gamma_distribution::MVector{P, Float64} = zeros(P) + alpha_uncorrected::MVector{P, Float64} = zeros(P) + alpha_corrected::MVector{P, Float64} = zeros(P) + stall_angle_list::MVector{P, Float64} = zeros(P) + alpha_array::MVector{P, Float64} = zeros(P) + v_a_array::MVector{P, Float64} = zeros(P) work_vectors::NTuple{10,MVec3} = ntuple(_ -> zeros(MVec3), 10) AIC::Array{Float64, 3} = zeros(3, P, P) projected_area::Float64 = one(Float64) - y::MVector{P, Float64} = zeros(MVector{P, Float64}) + y::MVector{P, Float64} = zeros(P) cache::Vector{PreallocationTools.LazyBufferCache{typeof(identity), typeof(identity)}} = [LazyBufferCache() for _ in 1:5] end @@ -667,3 +667,44 @@ function set_va!(body_aero::BodyAerodynamics, va_distribution::Vector{VelVector} return nothing end +""" + set_va!(body_aero::BodyAerodynamics, settings::VSMSettings) + +Set velocity array from VSM settings configuration. + +This convenience method extracts flight conditions from VSMSettings and +constructs the velocity vector in the body reference frame based on: +- Wind speed from settings.condition.wind_speed +- Angle of attack from settings.condition.alpha (converted from degrees) +- Sideslip angle from settings.condition.beta (converted from degrees) + +The velocity vector is constructed as: +- X_b (forward): wind_speed * cos(α) * cos(β) +- Y_b (right): wind_speed * sin(β) +- Z_b (down): wind_speed * sin(α) * cos(β) + +# Arguments +- `body_aero::BodyAerodynamics`: The aerodynamic body to modify +- `settings::VSMSettings`: Settings object containing flight conditions + +# Example +```julia +settings = VSMSettings("path/to/settings.yaml") +body_aero = BodyAerodynamics([wing]) +set_va!(body_aero, settings) +``` +""" +function set_va!(body_aero::BodyAerodynamics, settings::VSMSettings) + α = deg2rad(settings.condition.alpha) + β = deg2rad(settings.condition.beta) + wind_speed = settings.condition.wind_speed + + va = wind_speed * [ + cos(α)*cos(β), # X_b (forward) + sin(β), # Y_b (right) + sin(α)*cos(β) # Z_b (down) + ] + + set_va!(body_aero, va) +end + diff --git a/src/plotting.jl b/src/plotting.jl index 504e8ecd..3c602edb 100644 --- a/src/plotting.jl +++ b/src/plotting.jl @@ -349,9 +349,9 @@ function VortexStepMethod.plot_distribution(y_coordinates_list, results_list, la for (y_coordinates_i, result_i, label_i) in zip(y_coordinates_list, results_list, label_list) value = "$(round(result_i["cl"], digits=2))" if label_i == "LLT" - label = label_i * L" $~C_L$: " * value + label = label_i * L" $~C_\mathrm{L}$: " * value else - label = label_i * L" $C_L$: " * value + label = label_i * L" $C_\mathrm{L}$: " * value end axs[1, 1].plot( y_coordinates_i, @@ -359,18 +359,18 @@ function VortexStepMethod.plot_distribution(y_coordinates_list, results_list, la label=label ) end - axs[1, 1].set_title(L"$C_L$ Distribution", size=16) + axs[1, 1].set_title(L"$C_\mathrm{L}$ Distribution", size=16) axs[1, 1].set_xlabel(L"Spanwise Position $y/b$") - axs[1, 1].set_ylabel(L"Lift Coefficient $C_L$") + axs[1, 1].set_ylabel(L"Lift Coefficient $C_\mathrm{L}$") axs[1, 1].legend() # CD plot for (y_coordinates_i, result_i, label_i) in zip(y_coordinates_list, results_list, label_list) value = "$(round(result_i["cl"], digits=2))" if label_i == "LLT" - label = label_i * L" $~C_D$: " * value + label = label_i * L" $~C_\mathrm{D}$: " * value else - label = label_i * L" $C_D$: " * value + label = label_i * L" $C_\mathrm{D}$: " * value end axs[1, 2].plot( y_coordinates_i, @@ -378,9 +378,9 @@ function VortexStepMethod.plot_distribution(y_coordinates_list, results_list, la label=label ) end - axs[1, 2].set_title(L"$C_D$ Distribution", size=16) + axs[1, 2].set_title(L"$C_\mathrm{D}$ Distribution", size=16) axs[1, 2].set_xlabel(L"Spanwise Position $y/b$") - axs[1, 2].set_ylabel(L"Drag Coefficient $C_D$") + axs[1, 2].set_ylabel(L"Drag Coefficient $C_\mathrm{D}$") axs[1, 2].legend() # Gamma Distribution @@ -645,15 +645,25 @@ function VortexStepMethod.plot_polars( # Update label with Reynolds number label_list[i] = "$(label_list[i]) Re = $(round(Int64, rey*1e-5))e5" end - # Load literature data if provided if !isempty(literature_path_list) for path in literature_path_list - # Read all data first data = readdlm(path, ',') - # Skip the header row by taking data from row 2 onwards - data = data[2:end, :] - push!(polar_data_list, [data[:, 3], data[:, 1], data[:, 2], zeros(length(data[:, 1]))]) + header = lowercase.(string.(data[1, :])) + # Find column indices for alpha, CL, CD, CS (case-insensitive, allow common variants) + alpha_idx = findfirst(x -> occursin("alpha", x), header) + cl_idx = findfirst(x -> occursin("cl", x), header) + cd_idx = findfirst(x -> occursin("cd", x), header) + cs_idx = findfirst(x -> occursin("cs", x), header) + # Fallback: if CS not found, fill with zeros + cs_col = cs_idx === nothing ? zeros(size(data, 1)-1) : data[2:end, cs_idx] + # Push as [alpha, CL, CD, CS] + push!(polar_data_list, [ + data[2:end, alpha_idx], + data[2:end, cl_idx], + data[2:end, cd_idx], + cs_col + ]) end end @@ -695,10 +705,10 @@ function VortexStepMethod.plot_polars( if maximum(polar_data[2]) > 10 axs[1, 1].set_ylim([-0.5, 2]) end - title = raw"$C_L" * raw"$" * " vs $angle_type [°]" + title = raw"$C_\mathrm{L}" * raw"$" * " vs $angle_type [°]" axs[1, 1].set_title(title) axs[1, 1].set_xlabel("$angle_type [°]") - axs[1, 1].set_ylabel(L"$C_L$") + axs[1, 1].set_ylabel(L"$C_\mathrm{L}$") axs[1, 1].legend() end @@ -735,10 +745,10 @@ function VortexStepMethod.plot_polars( if maximum(polar_data[2]) > 10 axs[1, 2].set_ylim([-0.5, 2]) end - title = raw"$C_D" * raw"$" * " vs $angle_type [°]" + title = raw"$C_\mathrm{D}" * raw"$" * " vs $angle_type [°]" axs[1, 2].set_title(title) axs[1, 2].set_xlabel("$angle_type [°]") - axs[1, 2].set_ylabel(L"$C_D$") + axs[1, 2].set_ylabel(L"$C_\mathrm{D}$") axs[1, 2].legend() end @@ -776,10 +786,10 @@ function VortexStepMethod.plot_polars( if maximum(polar_data[2]) > 10 axs[2, 1].set_ylim([-0.5, 2]) end - title = raw"$C_S" * raw"$" * " vs $angle_type [°]" + title = raw"$C_\mathrm{S}" * raw"$" * " vs $angle_type [°]" axs[2, 1].set_title(title) axs[2, 1].set_xlabel("$angle_type [°]") - axs[2, 1].set_ylabel(L"$C_S$") + axs[2, 1].set_ylabel(L"$C_\mathrm{S}$") axs[2, 1].legend() end @@ -817,10 +827,10 @@ function VortexStepMethod.plot_polars( axs[2, 2].set_ylim([-0.5, 2]) axs[2, 2].set_xlim([-0.5, 2]) end - title = raw"$C_L" * raw"$" * " vs " * raw"$C_D" * raw"$" + title = raw"$C_\mathrm{L}" * raw"$" * " vs " * raw"$C_\mathrm{D}" * raw"$" axs[2, 2].set_title(title) - axs[2, 2].set_xlabel(L"$C_D$") - axs[2, 2].set_ylabel(L"$C_L$") + axs[2, 2].set_xlabel(L"$C_\mathrm{D}$") + axs[2, 2].set_ylabel(L"$C_\mathrm{L}$") axs[2, 2].legend() end diff --git a/src/polars.jl b/src/polars.jl index 902a4877..05957bc6 100644 --- a/src/polars.jl +++ b/src/polars.jl @@ -363,4 +363,3 @@ function read_aero_matrix(filepath::String) return matrix, alpha_values, delta_values end - diff --git a/src/precompile.jl b/src/precompile.jl index c6f13e39..cd9a44ab 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -1,21 +1,16 @@ @setup_workload begin # Putting some things in `@setup_workload` instead of `@compile_workload` can reduce the size of the # precompile file and potentially make loading faster. - # list = [OtherType("hello"), OtherType("world!")] - path = dirname(pathof(@__MODULE__)) - + @compile_workload begin + # Minimal precompilation to avoid segfault # all calls in this block will be precompiled, regardless of whether # they belong to your package or not (on Julia 1.8 and higher) - vss = vs(joinpath(path, "../data/vsm_settings_dual.yaml")) + # Step 1: Define wing parameters - n_panels = 20 # Number of panels - span = 20.0 # Wing span [m] + n_panels = 2 # Reduced number of panels for faster precompilation + span = 10.0 # Wing span [m] chord = 1.0 # Chord length [m] - v_a = 20.0 # Magnitude of inflow velocity [m/s] - density = 1.225 # Air density [kg/m³] - alpha_deg = 30.0 # Angle of attack [degrees] - alpha = deg2rad(alpha_deg) # Step 2: Create wing geometry with linear panel distribution wing = Wing(n_panels, spanwise_distribution=LINEAR) @@ -30,11 +25,8 @@ [chord, -span/2, 0.0], # Right tip TE INVISCID) - # Step 3: Initialize aerodynamics - body_aero::BodyAerodynamics = BodyAerodynamics([wing]) - - gamma_initial = zeros(length(body_aero.panels)) - calculate_circulation_distribution_elliptical_wing(gamma_initial, body_aero) + # Step 3: Initialize aerodynamics (simplified) + body_aero = BodyAerodynamics([wing]) nothing end diff --git a/src/settings.jl b/src/settings.jl index 65594076..fe538ed9 100644 --- a/src/settings.jl +++ b/src/settings.jl @@ -1,5 +1,13 @@ +@with_kw mutable struct ConditionSettings + wind_speed::Float64 = 10.0 # wind speed [m/s] + alpha::Float64 = 5.0 # angle of attack [°] + beta::Float64 = 0.0 # sideslip angle [°] + yaw_rate::Float64 = 0.0 # yaw rate [°/s] +end + @with_kw mutable struct WingSettings name::String = "main_wing" + geometry_file::String = "" # path to wing geometry YAML file n_panels::Int64 = 40 n_groups::Int64 = 40 spanwise_panel_distribution::PanelDistribution = LINEAR @@ -11,6 +19,7 @@ end n_panels::Int64 = 40 n_groups::Int64 = 40 aerodynamic_model_type::Model = VSM + solver_type::String = "LOOP" # type of solver density::Float64 = 1.225 # air density [kg/m³] max_iterations::Int64 = 1500 rtol::Float64 = 1e-5 # relative error [-] @@ -26,54 +35,79 @@ end end @Base.kwdef mutable struct VSMSettings + condition::ConditionSettings = ConditionSettings() wings::Vector{WingSettings} = [] solver_settings::SolverSettings = SolverSettings() end -function vs(filename) - res = VSMSettings() +function VSMSettings(filename) + # Uwe's suggested 3-line approach using StructMapping.jl (adapted) data = YAML.load_file(joinpath("data", filename)) + + # Use StructMapping for basic structure conversion + # But handle special fields manually due to enum conversion needs + vsm_settings = VSMSettings() + + # Convert condition settings using StructMapping (if present) + if haskey(data, "condition") + vsm_settings.condition = convertdict(ConditionSettings, data["condition"]) + end + + # Convert wing settings manually due to enum conversions n_panels = 0 n_groups = 0 - # add and update wing settings - for (i, wing) in pairs(data["wings"]) - push!(res.wings, WingSettings()) - res.wings[i].name = wing["name"] - res.wings[i].n_panels = wing["n_panels"] - n_panels += res.wings[i].n_panels - res.wings[i].n_groups = wing["n_groups"] - n_groups += res.wings[i].n_groups - res.wings[i].spanwise_panel_distribution = eval(Symbol(wing["spanwise_panel_distribution"])) - res.wings[i].spanwise_direction = MVec3(wing["spanwise_direction"]) - res.wings[i].remove_nan = wing["remove_nan"] + + if haskey(data, "wings") + for wing_data in data["wings"] + wing = WingSettings() + wing.name = wing_data["name"] + if haskey(wing_data, "geometry_file") + wing.geometry_file = wing_data["geometry_file"] + end + wing.n_panels = wing_data["n_panels"] + wing.n_groups = wing_data["n_groups"] + wing.spanwise_panel_distribution = eval(Symbol(wing_data["spanwise_panel_distribution"])) + wing.spanwise_direction = MVec3(wing_data["spanwise_direction"]) + wing.remove_nan = wing_data["remove_nan"] + + push!(vsm_settings.wings, wing) + n_panels += wing.n_panels + n_groups += wing.n_groups + end + end + + # Convert solver settings using StructMapping base, then override special fields + if haskey(data, "solver_settings") + solver_data = data["solver_settings"] + + # Create a copy of solver_data with string fields for enums removed + solver_data_clean = copy(solver_data) + delete!(solver_data_clean, "aerodynamic_model_type") + delete!(solver_data_clean, "type_initial_gamma_distribution") + + # Use StructMapping for the basic fields + vsm_settings.solver_settings = convertdict(SolverSettings, solver_data_clean) + + # Handle enum conversions manually + vsm_settings.solver_settings.aerodynamic_model_type = eval(Symbol(solver_data["aerodynamic_model_type"])) + vsm_settings.solver_settings.type_initial_gamma_distribution = eval(Symbol(solver_data["type_initial_gamma_distribution"])) + + # Override with calculated totals + vsm_settings.solver_settings.n_panels = n_panels + vsm_settings.solver_settings.n_groups = n_groups end - # update solver settings - solver = data["solver_settings"] - res.solver_settings.n_panels = n_panels - res.solver_settings.n_groups = n_groups - res.solver_settings.aerodynamic_model_type = eval(Symbol(solver["aerodynamic_model_type"])) - res.solver_settings.density = solver["density"] - res.solver_settings.max_iterations = solver["max_iterations"] - res.solver_settings.rtol = solver["rtol"] - res.solver_settings.tol_reference_error = solver["tol_reference_error"] - res.solver_settings.relaxation_factor = solver["relaxation_factor"] - res.solver_settings.artificial_damping = solver["artificial_damping"] - res.solver_settings.k2 = solver["k2"] - res.solver_settings.k4 = solver["k4"] - res.solver_settings.type_initial_gamma_distribution = eval(Symbol(solver["type_initial_gamma_distribution"])) - res.solver_settings.core_radius_fraction = solver["core_radius_fraction"] - res.solver_settings.mu = solver["mu"] - res.solver_settings.calc_only_f_and_gamma = solver["calc_only_f_and_gamma"] - res + + return vsm_settings end -function Base.show(io::IO, vs::VSMSettings) +function Base.show(io::IO, vsm_settings::VSMSettings) println(io, "VSMSettings:") - for (i, wing) in pairs(vs.wings) + print(io, replace(repr(vsm_settings.condition), "\n" => "\n ")) + for (i, wing) in pairs(vsm_settings.wings) if i==1 print(io, " ") end print(io, replace(repr(wing), "\n" => "\n ")) end - print(io, replace(repr(vs.solver_settings), "\n" => "\n ")) -end + print(io, replace(repr(vsm_settings.solver_settings), "\n" => "\n ")) +end \ No newline at end of file diff --git a/src/solver.jl b/src/solver.jl index 36a8b632..f3ea1085 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -47,23 +47,23 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all moment::MVec3 = zeros(MVec3) force_coeffs::MVec3 = zeros(MVec3) moment_coeffs::MVec3 = zeros(MVec3) - moment_dist::MVector{P, Float64} = zeros(MVector{P, Float64}) - moment_coeff_dist::MVector{P, Float64} = zeros(MVector{P, Float64}) - group_moment_dist::MVector{G, Float64} = zeros(MVector{G, Float64}) - group_moment_coeff_dist::MVector{G, Float64} = zeros(MVector{G, Float64}) + moment_dist::MVector{P, Float64} = zeros(P) + moment_coeff_dist::MVector{P, Float64} = zeros(P) + group_moment_dist::MVector{G, Float64} = zeros(G) + group_moment_coeff_dist::MVector{G, Float64} = zeros(G) solver_status::SolverStatus = FAILURE end # Output of the function gamma_loop! @with_kw mutable struct LoopResult{P} converged::Bool = false - gamma_new::MVector{P, Float64} = zeros(MVector{P, Float64}) - alpha_array::MVector{P, Float64} = zeros(MVector{P, Float64}) # TODO: Is this different from BodyAerodynamics.alpha_array ? - v_a_array::MVector{P, Float64} = zeros(MVector{P, Float64}) + gamma_new::MVector{P, Float64} = zeros(P) + alpha_array::MVector{P, Float64} = zeros(P) # TODO: Is this different from BodyAerodynamics.alpha_array ? + v_a_array::MVector{P, Float64} = zeros(P) end @with_kw struct BaseResult{P} - va_norm_array::MVector{P, Float64} = zeros(MVector{P, Float64}) + va_norm_array::MVector{P, Float64} = zeros(P) va_unit_array::Matrix{Float64} = zeros(P, 3) end @@ -137,6 +137,17 @@ function Solver(body_aero; kwargs...) return Solver{P,G}(; kwargs...) end +function Solver(body_aero, settings::VSMSettings) + Solver(body_aero; + aerodynamic_model_type=settings.solver_settings.aerodynamic_model_type, + density=settings.solver_settings.density, + max_iterations=settings.solver_settings.max_iterations, + rtol=settings.solver_settings.rtol, + relaxation_factor=settings.solver_settings.relaxation_factor, + core_radius_fraction=settings.solver_settings.core_radius_fraction, + ) +end + """ solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=solver.sol.gamma_distribution; log=false, reference_point=zeros(MVec3), moment_frac=0.1) diff --git a/src/wing_geometry.jl b/src/wing_geometry.jl index d7950894..506b91b4 100644 --- a/src/wing_geometry.jl +++ b/src/wing_geometry.jl @@ -1,4 +1,3 @@ - """ @with_kw mutable struct Section diff --git a/src/yaml_geometry.jl b/src/yaml_geometry.jl new file mode 100644 index 00000000..1abf3118 --- /dev/null +++ b/src/yaml_geometry.jl @@ -0,0 +1,301 @@ +# Data structures for YAML wing geometry +@with_kw struct WingAirfoilInfo + csv_file_path::String +end + +@with_kw struct WingSectionData + airfoil_id::Int64 + LE_x::Float64 + LE_y::Float64 + LE_z::Float64 + TE_x::Float64 + TE_y::Float64 + TE_z::Float64 +end + +@with_kw struct WingAirfoilData + airfoil_id::Int64 + type::String + info_dict::WingAirfoilInfo +end + +""" + load_polar_data(csv_file_path::String) -> Tuple{Union{Nothing, Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}, Vector{Float64}}}, Symbol} + +Load aerodynamic polar data from a CSV file using only `readlines`. + +The CSV file must contain a header row with columns for `alpha`, `cl`, `cd`, and `cm` (case-insensitive, order arbitrary). Each subsequent row should contain numeric values for these columns. + +# Arguments +- `csv_file_path::String`: Path to the CSV file containing polar data. + +# Returns +- A tuple `(aero_data, model_type)` where: + - `aero_data`: A tuple of vectors `(alpha, cl, cd, cm)` if the file is valid, or `nothing` if invalid or missing. + - `alpha`: Angle of attack in degrees (converted to radians internally). + - `cl`: Lift coefficient. + - `cd`: Drag coefficient. + - `cm`: Moment coefficient. + - `model_type`: `POLAR_VECTORS` if data is loaded, or `INVISCID` if not. + +# Behavior +- If the file is missing, empty, or invalid, a warning is issued and `(nothing, INVISCID)` is returned. + +# Example +```julia +# Create a YAML-based wing from configuration file +wing = Wing( + "path/to/wing_config.yaml"; + n_panels=40, + n_groups=4 +) +``` +""" +function load_polar_data(csv_file_path::String) + # Return early for empty path + if isempty(csv_file_path) + @warn "Empty CSV file path provided" + return (nothing, INVISCID) + end + + # Check if file exists + if !isfile(csv_file_path) + @warn "CSV file not found: $csv_file_path" + return (nothing, INVISCID) + end + + try + # Read all lines from the file + lines = readlines(csv_file_path) + + # Check if file is empty + if isempty(lines) + @warn "CSV file is empty: $csv_file_path" + return (nothing, INVISCID) + end + + # Parse header - make case insensitive + header_line = strip(lines[1]) + if isempty(header_line) + @warn "CSV file has empty header: $csv_file_path" + return (nothing, INVISCID) + end + + # Split header and normalize to lowercase + header_parts = map(strip ∘ lowercase, split(header_line, ',')) + + # Find column indices for required columns + required_cols = ["alpha", "cl", "cd", "cm"] + col_indices = Dict{String, Int}() + + for (i, col_name) in enumerate(header_parts) + if col_name in required_cols + col_indices[col_name] = i + end + end + + # Check if all required columns are present + missing_cols = setdiff(required_cols, keys(col_indices)) + if !isempty(missing_cols) + @warn "CSV file missing required columns: $(join(missing_cols, ", ")) in $csv_file_path" + return (nothing, INVISCID) + end + + # Parse data rows + data_vectors = Dict{String, Vector{Float64}}() + for col in required_cols + data_vectors[col] = Float64[] + end + + for line_num in 2:length(lines) + line = strip(lines[line_num]) + isempty(line) && continue # Skip empty lines + + parts = split(line, ',') + if length(parts) != length(header_parts) + @warn "Line $line_num has incorrect number of columns in $csv_file_path" + return (nothing, INVISCID) # Strict: any malformed data rejects the file + end + + try + for col in required_cols + value_str = strip(parts[col_indices[col]]) + value = parse(Float64, value_str) + push!(data_vectors[col], value) + end + catch e + @warn "Failed to parse line $line_num in $csv_file_path: $e" + return (nothing, INVISCID) # Strict: any parsing error rejects the file + end + end + + # Check if we got any valid data + if isempty(data_vectors["alpha"]) + @warn "No valid data rows found in $csv_file_path" + return (nothing, INVISCID) + end + + # Convert alpha from degrees to radians and create tuple + alpha_rad = deg2rad.(data_vectors["alpha"]) + aero_data = (alpha_rad, data_vectors["cl"], data_vectors["cd"], data_vectors["cm"]) + + return (aero_data, POLAR_VECTORS) + + catch e + @warn "Error reading CSV file $csv_file_path: $e" + return (nothing, INVISCID) + end +end + +""" + Wing(geometry_file::String; n_panels=20, n_groups=1, spanwise_distribution=LINEAR, + spanwise_direction=[0.0, 1.0, 0.0], remove_nan=true, prn=false) + +Constructs a `Wing` object from a YAML geometry file. + +# Arguments +- `geometry_file::String`: Path to a YAML file describing the wing geometry and airfoils. + +# Keyword Arguments +- `n_panels::Int`: Number of spanwise panels (default: 20). +- `n_groups::Int`: Number of grouped sections across the span (default: 1). Must divide `n_panels`. +- `spanwise_distribution`: Spanwise panel distribution type (default: `LINEAR`). +- `spanwise_direction::Vector{Float64}`: Direction of the spanwise axis (default: `[0.0, 1.0, 0.0]`). Must be the global Y axis. +- `remove_nan::Bool`: Remove NaN values from the geometry (default: `true`). +- `prn::Bool`: Print informational messages during construction (default: `false`). + +# Returns +- `Wing`: A fully constructed and initialized `Wing` object. + +# Description +This function reads a YAML configuration file to define the geometry and airfoil data for a multi-section wing. +Each section and corresponding airfoil is parsed from the YAML file, polar data is loaded, and each section is added +to the wing. The geometry logic currently assumes the spanwise direction is `[0.0, 1.0, 0.0]` (aligned with the global Y axis). + +# Errors +- Throws an `ArgumentError` if `n_panels` is not divisible by `n_groups`. +- Throws an `ArgumentError` if `spanwise_direction` is not `[0.0, 1.0, 0.0]`. + +# Example +```julia +wing = Wing("wing_geometry.yaml"; n_panels=30, n_groups=2, prn=true) +``` +""" +function Wing( + geometry_file::String; + n_panels=20, + n_groups=1, + spanwise_distribution=LINEAR, + spanwise_direction=[0.0, 1.0, 0.0], + remove_nan=true, + prn=false +) + !(n_panels % n_groups == 0) && throw(ArgumentError("Number of panels should be divisible by number of groups")) + !isapprox(spanwise_direction, [0.0, 1.0, 0.0]) && throw(ArgumentError("Spanwise direction has to be [0.0, 1.0, 0.0], not $spanwise_direction")) + + prn && @info "Reading YAML wing configuration from $geometry_file" + + # Load YAML file following Uwe's suggestion + data = YAML.load_file(geometry_file) + + # Convert YAML data to our struct format + # Convert wing sections + wing_sections_data = data["wing_sections"] + sections = WingSectionData[] + for row in wing_sections_data["data"] + section_dict = Dict(zip(wing_sections_data["headers"], row)) + push!(sections, WingSectionData( + airfoil_id = section_dict["airfoil_id"], + LE_x = section_dict["LE_x"], + LE_y = section_dict["LE_y"], + LE_z = section_dict["LE_z"], + TE_x = section_dict["TE_x"], + TE_y = section_dict["TE_y"], + TE_z = section_dict["TE_z"] + )) + end + + # Convert wing airfoils + wing_airfoils_data = data["wing_airfoils"] + airfoils = WingAirfoilData[] + for row in wing_airfoils_data["data"] + airfoil_dict = Dict(zip(wing_airfoils_data["headers"], row)) + push!(airfoils, WingAirfoilData( + airfoil_id = airfoil_dict["airfoil_id"], + type = airfoil_dict["type"], + info_dict = WingAirfoilInfo(csv_file_path = get(airfoil_dict["info_dict"], "csv_file_path", "")) + )) + end + + # Create CSV file mapping from airfoils + airfoil_csv_map = Dict{Int64, String}() + for airfoil in airfoils + if !isempty(airfoil.info_dict.csv_file_path) + airfoil_csv_map[airfoil.airfoil_id] = airfoil.info_dict.csv_file_path + end + end + + # Create Wing using the standard constructor + wing = Wing(n_panels; + n_groups=n_groups, + spanwise_distribution=spanwise_distribution, + spanwise_direction=MVec3(spanwise_direction), + remove_nan=remove_nan + ) + + # Parse sections and populate wing + for section in sections + # Get coordinates directly from struct fields + le_coord = [section.LE_x, section.LE_y, section.LE_z] + te_coord = [section.TE_x, section.TE_y, section.TE_z] + + # Load polar data and create section + csv_file_path = get(airfoil_csv_map, section.airfoil_id, "") + if !isempty(csv_file_path) && !isabspath(csv_file_path) + # NOTE: The spanwise direction is currently restricted to [0.0, 1.0, 0.0] (the global Y axis). + # This is required because downstream geometry and panel generation code assumes the spanwise axis is aligned with Y. + # If you need to support arbitrary spanwise directions, refactor the geometry logic accordingly. + csv_file_path = joinpath(dirname(geometry_file), csv_file_path) + end + aero_data, aero_model = load_polar_data(csv_file_path) + + prn && println("Section airfoil_id $(section.airfoil_id): Using $aero_model model") + + add_section!(wing, le_coord, te_coord, aero_model, aero_data) + end + + # Initialize the wing after adding all sections + reinit!(wing) + + return wing +end + +""" + Wing(settings::VSMSettings) + +Create a wing model from VSM settings configuration. + +This constructor is a convenience wrapper that extracts wing configuration +from VSMSettings and creates a Wing using the YAML geometry file path and +parameters specified in the settings. + +# Arguments +- `settings`: VSMSettings object containing wing configuration + +# Returns +A fully initialized `Wing` instance ready for aerodynamic simulation. + +# Example +```julia +# Load settings and create wing in one step +settings = VSMSettings("path/to/vsm_settings.yaml") +wing = Wing(settings) +``` +""" +function Wing(settings::VSMSettings) + Wing(settings.wings[1].geometry_file; + n_panels=settings.wings[1].n_panels, + n_groups=settings.wings[1].n_groups, + spanwise_distribution=settings.wings[1].spanwise_panel_distribution + ) +end diff --git a/test/aqua.jl b/test/Aqua.jl similarity index 96% rename from test/aqua.jl rename to test/Aqua.jl index 89ce2df0..34474582 100644 --- a/test/aqua.jl +++ b/test/Aqua.jl @@ -5,4 +5,4 @@ using Aqua stale_deps=(ignore=[:Xfoil, :Timers, :PyCall],), deps_compat=(ignore=[:PyCall],) ) - end +end diff --git a/test/README.md b/test/README.md new file mode 100644 index 00000000..188c01a5 --- /dev/null +++ b/test/README.md @@ -0,0 +1,72 @@ +# Test Data Organization + +This directory contains organized test data for the VortexStepMethod.jl test suite. + +## Running Tests + +You can run tests in different ways: +```bash +# Run all tests +julia --project=. test/runtests.jl +``` +```bash +# Run specific test files +julia --project=. test/yaml_geometry/test_yaml_geometry.jl +julia --project=. test/body_aerodynamics/test_body_aerodynamics.jl +julia --project=. test/solver/test_solver.jl +# etc. +``` +## Adding New Test Data + +When adding test data for a new source module: + +1. Create test files in the appropriate module directory under `test/` +2. Add any required data files (YAML, CSV) in the same directory +3. Use `test_data_path()` helper function to access files with proper paths +4. Follow the existing naming conventions + + +## Structure + +The test data is organized by source module being tested, following the structure of the `src/` directory: + +``` +test/ +├── body_aerodynamics/ # Tests for src/body_aerodynamics.jl +│ ├── test_body_aerodynamics.jl +│ ├── test_results.jl +│ └── test_wing.yaml # Wing geometry for body aero tests +├── yaml_geometry/ # Tests for src/yaml_geometry.jl +│ ├── test_yaml_geometry.jl +│ ├── simple_wing.yaml # Basic 2-section wing +│ ├── complex_wing.yaml # Multi-section wing +│ ├── standard_airfoil.csv # Standard polar data +│ └── alternate_airfoil.csv # Alternative airfoil data +├── solver/ # Tests for src/solver.jl +│ ├── test_solver.jl +│ ├── solver_settings.yaml # Settings for solver tests +│ ├── solver_test_polar.csv # Polar data for solver tests +│ └── solver_test_wing.yaml # Wing for solver tests +├── settings/ # Tests for src/settings.jl +│ └── test_settings.jl +├── filament/ # Tests for src/filament.jl +│ ├── test_bound_filament.jl +│ └── test_semi_infinite_filament.jl +├── panel/ # Tests for src/panel.jl +│ └── test_panel.jl +├── plotting/ # Tests for src/plotting.jl +│ └── test_plotting.jl +├── polars/ # Tests for src/polars.jl +│ └── test_polars.jl +├── ram_geometry/ # Tests for src/ram_geometry.jl +│ └── test_kite_geometry.jl +├── wake/ # Tests for src/wake.jl +│ └── test_wake.jl +├── wing_geometry/ # Tests for src/wing_geometry.jl +│ └── test_wing_geometry.jl +├── VortexStepMethod/ # Tests for main module +│ └── test_VortexStepMethod.jl +├── test_data_utils.jl # Shared utilities for test data access +├── runtests.jl # Main test runner +└── README.md # This file +``` diff --git a/test/TestSupport.jl b/test/TestSupport.jl new file mode 100644 index 00000000..4b428502 --- /dev/null +++ b/test/TestSupport.jl @@ -0,0 +1,5 @@ +module TestSupport +export suppress_warnings, test_data_path, create_temp_wing_settings, + get_standard_wing_file, get_complete_settings_file +include("test_data_utils.jl") +end \ No newline at end of file diff --git a/test/VortexStepMethod/test_VortexStepMethod.jl b/test/VortexStepMethod/test_VortexStepMethod.jl new file mode 100644 index 00000000..85175440 --- /dev/null +++ b/test/VortexStepMethod/test_VortexStepMethod.jl @@ -0,0 +1 @@ +##TODO: populate \ No newline at end of file diff --git a/test/body_aerodynamics/complete_settings.yaml b/test/body_aerodynamics/complete_settings.yaml new file mode 100644 index 00000000..a40ff608 --- /dev/null +++ b/test/body_aerodynamics/complete_settings.yaml @@ -0,0 +1,18 @@ +wings: + - name: "body_aero_test_wing" + geometry_file: "test/body_aerodynamics/test_wing.yaml" + n_panels: 4 + n_groups: 2 + spanwise_panel_distribution: COSINE + spanwise_direction: [0.0, 1.0, 0.0] + remove_nan: true + +solver_settings: + aerodynamic_model_type: VSM + density: 1.225 + type_initial_gamma_distribution: ZEROS + +condition: + alpha: 10.0 + beta: 5.0 + wind_speed: 15.0 diff --git a/test/body_aerodynamics/simple_polar.csv b/test/body_aerodynamics/simple_polar.csv new file mode 100644 index 00000000..7e043d9c --- /dev/null +++ b/test/body_aerodynamics/simple_polar.csv @@ -0,0 +1,4 @@ +alpha,cl,cd,cm +-10.0,0.1,0.02,-0.01 +0.0,1.0,0.01,0.0 +10.0,1.8,0.025,0.01 diff --git a/test/body_aerodynamics/test_body_aerodynamics.jl b/test/body_aerodynamics/test_body_aerodynamics.jl new file mode 100644 index 00000000..c022102f --- /dev/null +++ b/test/body_aerodynamics/test_body_aerodynamics.jl @@ -0,0 +1,436 @@ +using VortexStepMethod +using VortexStepMethod: calculate_cl, calculate_cd_cm, calculate_projected_area, calculate_AIC_matrices! +using LinearAlgebra +using Test +using Logging + +include("../utils.jl") + +@testset "Induction Matrix Creation" begin + # Setup + n_panels = 3 + N = n_panels + 1 # number of SECTIONS + max_chord = 1.0 + span = 2.36 + AR = span^2 / (π * span * max_chord / 4) + dist = "cos" + coord = generate_coordinates_el_wing(max_chord, span, N, dist) + + Atot = max_chord / 2 * span / 2 * π + @debug "N: $N" + @debug "size(coord): $(size(coord))" + + v_a = 20.0 + aoa = 5.7106 * π / 180 + v_a = [cos(aoa), 0.0, sin(aoa)] .* v_a + + # Create wing geometry + core_radius_fraction = 1e-20 + coord_left_to_right = flip_created_coord_in_pairs(deepcopy(coord)) + wing = Wing(n_panels; spanwise_distribution=UNCHANGED) + for idx in 1:2:size(coord_left_to_right, 1) + add_section!( + wing, + coord_left_to_right[idx,:], + coord_left_to_right[idx+1,:], + INVISCID + ) + end + + body_aero = BodyAerodynamics([wing]) + set_va!(body_aero, v_a) + + # Calculate reference matrices using thesis functions + controlpoints, rings, bladepanels, ringvec, coord_L = + create_geometry_general(coord, v_a, N, "5fil", LLT) + + # Test LLT matrices + @testset "LLT Matrices" begin + # Calculate reference matrices + MatrixU, MatrixV, MatrixW = thesis_induction_matrix_creation( + deepcopy(ringvec), + deepcopy(controlpoints), + deepcopy(rings), + deepcopy(v_a), + zeros(N-1), + nothing, # data_airf not needed + nothing, # conv_crit not needed + LLT + ) + + # Calculate new matrices + va_norm_array = fill(norm(v_a), length(coord)) + va_unit_array = repeat(reshape(v_a ./ norm(v_a), 1, 3), length(coord)) + calculate_AIC_matrices!( + body_aero, + LLT, + core_radius_fraction, + va_norm_array, + va_unit_array + ) + AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] + + # Compare matrices + @test isapprox(MatrixU, AIC_x, atol=1e-5) + @test isapprox(MatrixV, -AIC_y, atol=1e-5) + @test isapprox(MatrixW, AIC_z, atol=1e-5) + end + + # Test VSM matrices + @testset "VSM Matrices" begin + # Calculate reference matrices for VSM + controlpoints, rings, bladepanels, ringvec, coord_L = + create_geometry_general(coord, v_a, N, "5fil", VSM) + + MatrixU, MatrixV, MatrixW = thesis_induction_matrix_creation( + deepcopy(ringvec), + deepcopy(controlpoints), + deepcopy(rings), + deepcopy(v_a), + zeros(N-1), + nothing, + nothing, + VSM + ) + + # Calculate new matrices + va_norm_array = fill(norm(v_a), length(coord)) + va_unit_array = repeat(reshape(v_a ./ norm(v_a), 1, 3), length(coord)) + calculate_AIC_matrices!( + body_aero, + VSM, + core_radius_fraction, + va_norm_array, + va_unit_array + ) + AIC_x, AIC_y, AIC_z = body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] + + # Compare matrices with higher precision for VSM + @test isapprox(MatrixU, AIC_x, atol=1e-8) + @test isapprox(MatrixV, -AIC_y, atol=1e-8) + @test isapprox(MatrixW, AIC_z, atol=1e-8) + end +end + + +@testset "Wing Geometry Creation" begin + @testset "Origin Translation" begin + # Create minimal wing with three sections (2 panels) + wing = Wing(2) + add_section!(wing, [0.0, 0.0, 0.0], [1.0, 0.0, 0.0], INVISCID) + add_section!(wing, [0.0, 1.0, 0.0], [1.0, 1.0, 0.0], INVISCID) + add_section!(wing, [0.0, 2.0, 0.0], [1.0, 2.0, 0.0], INVISCID) + + # Test non-zero origin translation + origin = MVec3(1.0, 2.0, 3.0) + body_aero = BodyAerodynamics([wing]; kite_body_origin=origin) + + # Check if sections are correctly translated + @test wing.sections[3].LE_point ≈ [-1.0, -2.0, -3.0] + @test wing.sections[3].TE_point ≈ [0.0, -2.0, -3.0] + @test wing.sections[2].LE_point ≈ [-1.0, -1.0, -3.0] + @test wing.sections[2].TE_point ≈ [0.0, -1.0, -3.0] + @test wing.sections[1].LE_point ≈ [-1.0, 0.0, -3.0] + @test wing.sections[1].TE_point ≈ [0.0, 0.0, -3.0] + end + + function create_geometry(; model=VSM, wing_type=:rectangular, plotting=false, N=40) + max_chord = 1.0 + span = 17.0 + AR = span^2 / (π * span * max_chord / 4) + @debug "AR: $AR" + v_a = 20.0 + aoa = 5.7106 * π / 180 + v_a = [cos(aoa), 0.0, sin(aoa)] .* v_a + + coord = if wing_type === :rectangular + theta = range(-0.5, 0.5, length=N) + beta = range(-2, 2, length=N) + generate_coordinates_rect_wing( + fill(max_chord, N), + span, + theta, + beta, + N, + "lin" + ) + elseif wing_type === :curved + generate_coordinates_curved_wing( + max_chord, span, π/4, 5, N, "cos" + ) + elseif wing_type === :elliptical + generate_coordinates_el_wing(max_chord, span, N, "cos") + else + error("Invalid wing type") + end + + coord_left_to_right = flip_created_coord_in_pairs(deepcopy(coord)) + wing = Wing(N-1; spanwise_distribution=UNCHANGED) + for i in 1:2:size(coord_left_to_right, 1) + add_section!( + wing, + coord_left_to_right[i,:], + coord_left_to_right[i+1,:], + INVISCID + ) + end + body_aero = BodyAerodynamics([wing]) + set_va!(body_aero, v_a) + + return body_aero, coord, v_a, model + end + + for model in [VSM, LLT] + @debug "model: $model" + for wing_type in [:rectangular, :curved, :elliptical] + @debug "wing_type: $wing_type" + body_aero, coord, v_a, model = create_geometry( + model=model, wing_type=wing_type + ) + + # Generate geometry + expected_controlpoints, expected_rings, expected_bladepanels, + expected_ringvec, expected_coord_L = create_geometry_general( + coord, v_a, div(size(coord,1), 2), "5fil", model + ) + + for i in 1:length(body_aero.panels) + @debug "i: $i" + # Handle control points + index_reversed = length(body_aero.panels) - i + 1 + panel = body_aero.panels[index_reversed] + + evaluation_point = if model === VSM + panel.control_point + else # LLT + panel.aero_center + end + + @test isapprox(evaluation_point, expected_controlpoints[i]["coordinates"], atol=1e-4) + @test isapprox(panel.chord, expected_controlpoints[i]["chord"], atol=1e-4) + @test isapprox(panel.z_airf, expected_controlpoints[i]["normal"], atol=1e-4) + @test isapprox(panel.x_airf, expected_controlpoints[i]["tangential"], atol=1e-4) + @test isapprox( + hcat(panel.z_airf, panel.x_airf, panel.y_airf), + expected_controlpoints[i]["airf_coord"], + atol=1e-4 + ) + + if model === VSM + @test isapprox( + panel.aero_center, + expected_controlpoints[i]["coordinates_aoa"], + atol=1e-4 + ) + end + + # Handle rings + expected_ring_i = expected_rings[i] + expected_ring_i_list = [ + expected_ring_i[1], + expected_ring_i[2], + expected_ring_i[3], + expected_ring_i[4], + expected_ring_i[5] + ] + + filaments = panel.filaments + filament_list = [ + filaments[1], + filaments[3], + filaments[5], + filaments[2], + filaments[4] + ] + + for (j, fil) in enumerate(filament_list) + if j == 1 # bound filaments + @test isapprox(fil.x1, expected_ring_i_list[j]["x1"], atol=1e-4) + @test isapprox(fil.x2, expected_ring_i_list[j]["x2"], atol=1e-4) + elseif j ∈ (2, 4) # trailing filaments + @test isapprox(fil.x1, expected_ring_i_list[j]["x1"], atol=1e-4) + @test isapprox(fil.x2, expected_ring_i_list[j]["x2"], atol=1e-4) + else # semi-infinite filaments + @test isapprox(fil.x1, expected_ring_i_list[j]["x1"], atol=1e-4) + end + end + + # Handle bladepanels + exp_bladepanels = expected_bladepanels[i] + @test isapprox(panel.LE_point_2, exp_bladepanels["p1"], atol=1e-4) + @test isapprox(panel.LE_point_1, exp_bladepanels["p2"], atol=1e-4) + @test isapprox(panel.TE_point_1, exp_bladepanels["p3"], atol=1e-4) + @test isapprox(panel.TE_point_2, exp_bladepanels["p4"], atol=1e-4) + + # Handle ringvec + exp_ringvec = expected_ringvec[i] + r0 = panel.bound_point_1 - panel.bound_point_2 + r3 = evaluation_point - (panel.bound_point_1 + panel.bound_point_2) / 2 + @test isapprox(r0, exp_ringvec["r0"], atol=1e-4) + @test isapprox(r3, exp_ringvec["r3"], atol=1e-4) + + # Handle coord_L + @test all(isapprox.(panel.aero_center, expected_coord_L[:, i])) + end + end + end +end + +@testset "Calculate results against output results" begin + # Setup + density = 1.225 + N = 40 + max_chord = 1.0 + span = 15.709 # AR = 20 + v_a = 20.0 + AR = span^2 / (π * span * max_chord / 4) + aoa = deg2rad(5) + v_a = [cos(aoa), 0.0, sin(aoa)] .* v_a + model = VSM + + # Setup wing geometry + dist = "cos" + core_radius_fraction = 1e-20 + coord = generate_coordinates_el_wing(max_chord, span, N, dist) + coord_left_to_right = flip_created_coord_in_pairs(deepcopy(coord)) + wing = Wing(N-1; spanwise_distribution=UNCHANGED) + for idx in 1:2:length(coord_left_to_right[:, 1]) + @debug "coord_left_to_right[$idx] = $(coord_left_to_right[idx,:])" + add_section!( + wing, + coord_left_to_right[idx,:], + coord_left_to_right[idx+1,:], + INVISCID + ) + end + + body_aero = BodyAerodynamics([wing]) + set_va!(body_aero, v_a) + + # Run analysis + loop_solver = Solver(body_aero; + aerodynamic_model_type=model, + core_radius_fraction=core_radius_fraction, + solver_type=LOOP, + atol=1e-8, + rtol=1e-8 + ) + nonlin_solver = Solver(body_aero; + aerodynamic_model_type=model, + core_radius_fraction=core_radius_fraction, + solver_type=NONLIN, + atol=1e-8, + rtol=1e-8 + ) + results_NEW = solve(loop_solver, body_aero; reference_point=[0,1,0]) + # println(results_NEW) + + @test results_NEW isa Dict + + @testset "Loop and nonlin solve!" begin + loop_sol = solve!(loop_solver, body_aero; reference_point=[0,1,0]) + nonlin_sol = solve!(nonlin_solver, body_aero; reference_point=[0,1,0]) + + @test all(isapprox.(nonlin_sol.gamma_distribution, loop_sol.gamma_distribution; atol=1e-4)) + + @test loop_sol.force.x ≈ -117.96518414816444 atol=1e-4 + @test loop_sol.force.y ≈ 0.0 atol=1e-10 + @test loop_sol.force.z ≈ 1481.996390329679 atol=1e-4 rtol= 1e-4 + + @test loop_sol.moment.x ≈ -1481.996390329678 atol=1e-4 rtol= 1e-4 + @test loop_sol.moment.y ≈ 0.0 atol=1e-10 + @test loop_sol.moment.z ≈ -117.9651841481644 atol=1e-4 + + @test loop_sol.force_coeffs[1] ≈ -0.039050322560956294 atol=1e-4 # CFx + @test loop_sol.force_coeffs[2] ≈ 0.0 atol=1e-4 # CFy + @test loop_sol.force_coeffs[3] ≈ 0.49055973654418716 atol=1e-4 # CFz + @test loop_sol.force_coeffs[3] / loop_sol.force_coeffs[1] ≈ loop_sol.force[3] / loop_sol.force[1] + @test loop_sol.moment_dist[1] ≈ -0.0006683569356186426 atol=1e-8 + @test loop_sol.moment_coeff_dist[1] ≈ -2.212405554436003e-7 atol=1e-10 + @test loop_sol.moment_dist[1] / loop_sol.moment_dist[2] ≈ loop_sol.moment_coeff_dist[1] / loop_sol.moment_coeff_dist[2] + + @test loop_sol.solver_status == FEASIBLE + + @test sum(loop_sol.moment_dist) ≈ sum(loop_sol.group_moment_dist) + @test sum(nonlin_sol.moment_dist) ≈ sum(nonlin_sol.group_moment_dist) + + end + + # Calculate forces using uncorrected alpha + alpha = results_NEW["alpha_uncorrected"] + dyn_visc = 0.5 * density * norm(v_a)^2 + n_panels = length(body_aero.panels) + lift = zeros(n_panels) + drag = zeros(n_panels) + moment = zeros(n_panels) + + for (i, panel) in enumerate(body_aero.panels) + lift[i] = dyn_visc * calculate_cl(panel, alpha[i]) * panel.chord + cd_cm = calculate_cd_cm(panel, alpha[i]) + drag[i] = dyn_visc * cd_cm[1] * panel.chord + moment[i] = dyn_visc * cd_cm[2] * panel.chord^2 + # @info "lift: $lift, drag: $drag, moment: $moment" + end + Fmag = hcat(lift, drag, moment) + + # Calculate coefficients using corrected alpha + alpha = results_NEW["alpha_at_ac"] + aero_coeffs = hcat( + [alpha[i] for (i, panel) in enumerate(body_aero.panels)], + [calculate_cl(panel, alpha[i]) for (i, panel) in enumerate(body_aero.panels)], + [calculate_cd_cm(panel, alpha[i])[1] for (i, panel) in enumerate(body_aero.panels)], + [calculate_cd_cm(panel, alpha[i])[2] for (i, panel) in enumerate(body_aero.panels)] + ) + + ringvec = [Dict("r0" => panel.width * panel.y_airf) for panel in body_aero.panels] + controlpoints = [Dict("tangential" => panel.x_airf, "normal" => panel.z_airf) + for panel in body_aero.panels] + Atot = calculate_projected_area(wing) + + F_rel_ref, F_gl_ref, Ltot_ref, Dtot_ref, CL_ref, CD_ref, CS_ref = + output_results(Fmag, aero_coeffs, ringvec, v_a, controlpoints, Atot) + + # Compare results + @info "Comparing results" + @info "cl_calculated: $(results_NEW["cl"]), CL_ref: $CL_ref" + @info "cd_calculated: $(results_NEW["cd"]), CD_ref: $CD_ref" + @info "cs_calculated: $(results_NEW["cs"]), CS_ref: $CS_ref" + @info "L_calculated: $(results_NEW["lift"]), Ltot_ref: $Ltot_ref" + @info "D_calculated: $(results_NEW["drag"]), Dtot_ref: $Dtot_ref" + + # Assert results + @test isapprox(results_NEW["cl"], CL_ref, rtol=1e-4) + @test isapprox(results_NEW["cd"], CD_ref, rtol=1e-4) + @test isapprox(results_NEW["cs"], CS_ref, rtol=1e-4) + @test isapprox(results_NEW["lift"], Ltot_ref, rtol=1e-4) + @test isapprox(results_NEW["drag"], Dtot_ref, rtol=1e-4) + @test isapprox(results_NEW["Fx"], results_NEW["Mz"], rtol=1e-4) # 1 meter arm + @test isapprox(results_NEW["My"], 0.0, atol=1e-3) + @test isapprox(results_NEW["Fz"], -results_NEW["Mx"], rtol=1e-4) # 1 meter arm + + # Check array shapes + @test length(results_NEW["cl_distribution"]) == length(body_aero.panels) + @test length(results_NEW["cd_distribution"]) == length(body_aero.panels) +end + +@testset "set_va! with VSMSettings" begin + settings_file = create_temp_wing_settings("body_aerodynamics", "test_wing.yaml"; + alpha=10.0, beta=5.0, wind_speed=15.0) + try + settings = VSMSettings(settings_file) + wing = Wing(settings) + body_aero = BodyAerodynamics([wing]) + + set_va!(body_aero, settings) + + α, β, wind_speed = deg2rad(10.0), deg2rad(5.0), 15.0 + expected_va = wind_speed .* [cos(α)*cos(β), sin(β), sin(α)*cos(β)] + + for p in body_aero.panels + @test p.va ≈ expected_va atol=1e-10 + end + @test body_aero._va ≈ expected_va atol=1e-10 + finally + isfile(settings_file) && rm(settings_file; force=true) + end +end diff --git a/test/test_results.jl b/test/body_aerodynamics/test_results.jl similarity index 92% rename from test/test_results.jl rename to test/body_aerodynamics/test_results.jl index fd3470fc..0ac6d232 100644 --- a/test/test_results.jl +++ b/test/body_aerodynamics/test_results.jl @@ -4,11 +4,33 @@ using LinearAlgebra using Test using Logging -if !@isdefined ram_wing +# Helper to find the data directory for test files +function _find_ram_data_dir() + data_dir = joinpath(dirname(dirname(@__DIR__)), "data", "ram_air_kite") + if isdir(data_dir) + return data_dir + else + # Fallback for case where test is run from different working directory + return joinpath(@__DIR__, "..", "..", "data", "ram_air_kite") + end +end + +if !@isdefined ram_wing_results + data_dir = _find_ram_data_dir() body_path = joinpath(tempdir(), "ram_air_kite_body.obj") foil_path = joinpath(tempdir(), "ram_air_kite_foil.dat") - cp("data/ram_air_kite_body.obj", body_path; force=true) - cp("data/ram_air_kite_foil.dat", foil_path; force=true) + + body_src = joinpath(data_dir, "ram_air_kite_body.obj") + foil_src = joinpath(data_dir, "ram_air_kite_foil.dat") + + # Check if source files exist before copying + if isfile(body_src) && isfile(foil_src) + cp(body_src, body_path; force=true) + cp(foil_src, foil_path; force=true) + else + error("Required data files not found: $body_src or $foil_src") + end + ram_wing = RamAirWing(body_path, foil_path; alpha_range=deg2rad.(-1:1), delta_range=deg2rad.(-1:1)) end diff --git a/test/body_aerodynamics/test_wing.yaml b/test/body_aerodynamics/test_wing.yaml new file mode 100644 index 00000000..964fe9ec --- /dev/null +++ b/test/body_aerodynamics/test_wing.yaml @@ -0,0 +1,12 @@ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] + - [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "simple_polar.csv"}] diff --git a/test/data/README.md b/test/data/README.md new file mode 100644 index 00000000..e69de29b diff --git a/test/data/body_aerodynamics/complete_settings.yaml b/test/data/body_aerodynamics/complete_settings.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/body_aerodynamics/polars/simple_polar.csv b/test/data/body_aerodynamics/polars/simple_polar.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/data/body_aerodynamics/wings/test_wing.yaml b/test/data/body_aerodynamics/wings/test_wing.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/settings/basic_llt.yaml b/test/data/settings/basic_llt.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/settings/basic_llt_settings.yaml b/test/data/settings/basic_llt_settings.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/settings/basic_vsm.yaml b/test/data/settings/basic_vsm.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/settings/basic_vsm_settings.yaml b/test/data/settings/basic_vsm_settings.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/settings/complete_wing_settings.yaml b/test/data/settings/complete_wing_settings.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/solver/polars/solver_test_polar.csv b/test/data/solver/polars/solver_test_polar.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/data/solver/solver_settings.yaml b/test/data/solver/solver_settings.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/solver/wings/solver_test_wing.yaml b/test/data/solver/wings/solver_test_wing.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/wings/complex_wing.yaml b/test/data/wings/complex_wing.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/wings/polars/test_polar_1.csv b/test/data/wings/polars/test_polar_1.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/data/wings/polars/test_polar_2.csv b/test/data/wings/polars/test_polar_2.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/data/wings/simple_wing.yaml b/test/data/wings/simple_wing.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/yaml_geometry/polars/alternate_airfoil.csv b/test/data/yaml_geometry/polars/alternate_airfoil.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/data/yaml_geometry/polars/standard_airfoil.csv b/test/data/yaml_geometry/polars/standard_airfoil.csv new file mode 100644 index 00000000..e69de29b diff --git a/test/data/yaml_geometry/wings/complex_wing.yaml b/test/data/yaml_geometry/wings/complex_wing.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/data/yaml_geometry/wings/simple_wing.yaml b/test/data/yaml_geometry/wings/simple_wing.yaml new file mode 100644 index 00000000..e69de29b diff --git a/test/test_bound_filament.jl b/test/filament/test_bound_filament.jl similarity index 100% rename from test/test_bound_filament.jl rename to test/filament/test_bound_filament.jl diff --git a/test/test_semi_infinite_filament.jl b/test/filament/test_semi_infinite_filament.jl similarity index 88% rename from test/test_semi_infinite_filament.jl rename to test/filament/test_semi_infinite_filament.jl index e21ec1cd..3355a7c2 100644 --- a/test/test_semi_infinite_filament.jl +++ b/test/filament/test_semi_infinite_filament.jl @@ -1,7 +1,7 @@ -using VortexStepMethod: SemiInfiniteFilament, velocity_3D_trailing_vortex_semiinfinite! +using VortexStepMethod: SemiInfiniteFilament, velocity_3D_trailing_vortex_semiinfinite!, reinit! using LinearAlgebra using Test -using BenchmarkTools +# using BenchmarkTools function create_test_filament2() x1 = [0.0, 0.0, 0.0] @@ -41,26 +41,6 @@ end gamma = 1.0 core_radius_fraction = 0.01 work_vectors = ntuple(_ -> Vector{Float64}(undef, 3), 10) - - @testset "Allocation Tests" begin - filament = create_test_filament2() - control_point = [0.5, 0.5, 2.0] - induced_velocity = zeros(3) - - b = @benchmarkable velocity_3D_trailing_vortex_semiinfinite!( - $induced_velocity, - $filament, - $filament.direction, - $control_point, - $gamma, - $filament.vel_mag, - $work_vectors - ) - result = run(b) - @test result.allocs == 0 - @test result.memory == 0 - end - @testset "Calculate Induced Velocity" begin filament = create_test_filament2() control_point = [0.5, 0.5, 2.0] diff --git a/test/test_panel.jl b/test/panel/test_panel.jl similarity index 98% rename from test/test_panel.jl rename to test/panel/test_panel.jl index ff4a89ba..92ec27e4 100644 --- a/test/test_panel.jl +++ b/test/panel/test_panel.jl @@ -1,8 +1,7 @@ -using VortexStepMethod: Panel, Section, calculate_relative_alpha_and_relative_velocity, calculate_cl, calculate_cd_cm, reinit! +using VortexStepMethod: Panel, Section, calculate_relative_alpha_and_relative_velocity, calculate_cl, calculate_cd_cm, reinit!, INVISCID, POLAR_VECTORS, MVec3 using Interpolations: linear_interpolation, Line using LinearAlgebra using Test -using BenchmarkTools function create_panel(section1::Section, section2::Section) # Calculate panel geometry diff --git a/test/test_plotting.jl b/test/plotting/test_plotting.jl similarity index 65% rename from test/test_plotting.jl rename to test/plotting/test_plotting.jl index e3f6c7e2..385abcef 100644 --- a/test/test_plotting.jl +++ b/test/plotting/test_plotting.jl @@ -2,11 +2,33 @@ using VortexStepMethod using ControlPlots using Test +# Resolve repo data directory for ram air kite assets +const _ram_data_dir = joinpath(dirname(dirname(@__DIR__)), "data", "ram_air_kite") + +# Helper to robustly delete files on platforms with occasional file locks +safe_rm(path) = begin + if isfile(path) + try + rm(path; force=true) + catch + sleep(0.2) + try + rm(path; force=true) + catch + # last resort, ignore + end + end + end + nothing +end + if !@isdefined ram_wing body_path = joinpath(tempdir(), "ram_air_kite_body.obj") foil_path = joinpath(tempdir(), "ram_air_kite_foil.dat") - cp("data/ram_air_kite_body.obj", body_path; force=true) - cp("data/ram_air_kite_foil.dat", foil_path; force=true) + body_src = joinpath(_ram_data_dir, "ram_air_kite_body.obj") + foil_src = joinpath(_ram_data_dir, "ram_air_kite_foil.dat") + cp(body_src, body_path; force=true) + cp(foil_src, foil_path; force=true) ram_wing = RamAirWing(body_path, foil_path; alpha_range=deg2rad.(-1:1), delta_range=deg2rad.(-1:1)) end @@ -47,9 +69,10 @@ plt.ioff() res = plt.plot([1,2,3]) @test fig isa plt.PyPlot.Figure @test res isa Vector{plt.PyObject} - save_plot(fig, "/tmp", "plot") - @test isfile("/tmp/plot.pdf") - rm("/tmp/plot.pdf") + save_dir = tempdir() + save_plot(fig, save_dir, "plot") + @test isfile(joinpath(save_dir, "plot.pdf")) + safe_rm(joinpath(save_dir, "plot.pdf")) show_plot(fig) body_aero = create_body_aero() if Sys.islinux() @@ -57,18 +80,18 @@ plt.ioff() body_aero, "Rectangular_wing_geometry"; data_type=".pdf", - save_path="/tmp", + save_path=save_dir, is_save=true, is_show=false) @test fig isa plt.PyPlot.Figure - @test isfile("/tmp/Rectangular_wing_geometry_angled_view.pdf") - rm("/tmp/Rectangular_wing_geometry_angled_view.pdf") - @test isfile("/tmp/Rectangular_wing_geometry_front_view.pdf") - rm("/tmp/Rectangular_wing_geometry_front_view.pdf") - @test isfile("/tmp/Rectangular_wing_geometry_side_view.pdf") - rm("/tmp/Rectangular_wing_geometry_side_view.pdf") - @test isfile("/tmp/Rectangular_wing_geometry_top_view.pdf") - rm("/tmp/Rectangular_wing_geometry_top_view.pdf") + @test isfile(joinpath(save_dir, "Rectangular_wing_geometry_angled_view.pdf")) + safe_rm(joinpath(save_dir, "Rectangular_wing_geometry_angled_view.pdf")) + @test isfile(joinpath(save_dir, "Rectangular_wing_geometry_front_view.pdf")) + safe_rm(joinpath(save_dir, "Rectangular_wing_geometry_front_view.pdf")) + @test isfile(joinpath(save_dir, "Rectangular_wing_geometry_side_view.pdf")) + safe_rm(joinpath(save_dir, "Rectangular_wing_geometry_side_view.pdf")) + @test isfile(joinpath(save_dir, "Rectangular_wing_geometry_top_view.pdf")) + safe_rm(joinpath(save_dir, "Rectangular_wing_geometry_top_view.pdf")) # Step 5: Initialize the solvers vsm_solver = Solver(body_aero; aerodynamic_model_type=VSM) @@ -101,13 +124,13 @@ plt.ioff() v_a=v_a, title="Rectangular Wing Polars", data_type=".pdf", - save_path="/tmp", + save_path=save_dir, is_save=true, is_show=false ) @test fig isa plt.PyPlot.Figure - @test isfile("/tmp/Rectangular_Wing_Polars.pdf") - rm("/tmp/Rectangular_Wing_Polars.pdf") + @test isfile(joinpath(save_dir, "Rectangular_Wing_Polars.pdf")) + safe_rm(joinpath(save_dir, "Rectangular_Wing_Polars.pdf")) # Step 9: Test polar data plotting body_aero = BodyAerodynamics([ram_wing]) diff --git a/test/polars/test_polars.jl b/test/polars/test_polars.jl new file mode 100644 index 00000000..85175440 --- /dev/null +++ b/test/polars/test_polars.jl @@ -0,0 +1 @@ +##TODO: populate \ No newline at end of file diff --git a/test/test_kite_geometry.jl b/test/ram_geometry/test_kite_geometry.jl similarity index 100% rename from test/test_kite_geometry.jl rename to test/ram_geometry/test_kite_geometry.jl diff --git a/test/runtests.jl b/test/runtests.jl index 7f2b359f..6c6f92cd 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,36 +1,38 @@ using Test, VortexStepMethod -# TODO fix allocation tests -# and: https://github.com/JuliaArrays/FixedSizeArrays.jl/blob/d17373edf4144a672cd80a062bf24d017f01e42f/.github/workflows/UnitTests.yml +# Make paths robust (avoid cd("..")) +cd(@__DIR__) # ensure we're in test/ no matter how tests are launched +include("TestSupport.jl") +using .TestSupport -# Check if the compilation options allow maximum performance. +println("Running tests...") + +# keep your env check as-is... const build_is_production_build_env_name = "BUILD_IS_PRODUCTION_BUILD" const build_is_production_build = let v = get(ENV, build_is_production_build_env_name, "true") - if v ∉ ("false", "true") - error("unknown value for environment variable $build_is_production_build_env_name: $v") - end - if v == "true" - true - else - false - end + v == "true" || v == "false" || error("unknown value for $build_is_production_build_env_name: $v") + v == "true" end::Bool -cd("..") -println("Running tests...") - @testset verbose = true "Testing VortexStepMethod..." begin if build_is_production_build include("bench.jl") end - include("test_settings.jl") - include("test_bound_filament.jl") - include("test_panel.jl") - include("test_semi_infinite_filament.jl") - include("test_body_aerodynamics.jl") - include("test_results.jl") - include("test_kite_geometry.jl") - include("test_wing_geometry.jl") - include("test_plotting.jl") - include("aqua.jl") -end \ No newline at end of file + include("body_aerodynamics/test_body_aerodynamics.jl") + include("body_aerodynamics/test_results.jl") + include("filament/test_bound_filament.jl") + include("filament/test_semi_infinite_filament.jl") + include("panel/test_panel.jl") + include("plotting/test_plotting.jl") + include("polars/test_polars.jl") + include("ram_geometry/test_kite_geometry.jl") + include("settings/test_settings.jl") + include("solver/test_solver.jl") + include("VortexStepMethod/test_VortexStepMethod.jl") + include("wake/test_wake.jl") + include("wing_geometry/test_wing_geometry.jl") + include("yaml_geometry/test_yaml_geometry.jl") + include("Aqua.jl") +end + +nothing diff --git a/test/settings/basic_llt.yaml b/test/settings/basic_llt.yaml new file mode 100644 index 00000000..78b79edd --- /dev/null +++ b/test/settings/basic_llt.yaml @@ -0,0 +1,9 @@ +solver_settings: + aerodynamic_model_type: LLT + density: 1.225 + type_initial_gamma_distribution: UNIFORM + +condition: + alpha: 5.0 + beta: 0.0 + wind_speed: 20.0 diff --git a/test/settings/basic_vsm.yaml b/test/settings/basic_vsm.yaml new file mode 100644 index 00000000..63dee5dc --- /dev/null +++ b/test/settings/basic_vsm.yaml @@ -0,0 +1,9 @@ +solver_settings: + aerodynamic_model_type: VSM + density: 1.225 + type_initial_gamma_distribution: UNIFORM + +condition: + alpha: 10.0 + beta: 5.0 + wind_speed: 15.0 diff --git a/test/test_settings.jl b/test/settings/test_settings.jl similarity index 53% rename from test/test_settings.jl rename to test/settings/test_settings.jl index 06cde0ea..c7412894 100644 --- a/test/test_settings.jl +++ b/test/settings/test_settings.jl @@ -7,12 +7,15 @@ using VortexStepMethod using Test @testset "Test settings.jl" begin - vss = vs("vsm_settings_dual.yaml") + # Use the absolute path to test data to avoid path concatenation issues + project_root = dirname(dirname(@__DIR__)) + settings_file = joinpath(project_root, "data", "ram_air_kite", "vsm_settings_dual.yaml") + vss = VSMSettings(settings_file) @test vss isa VSMSettings @test vss.solver_settings isa SolverSettings @test vss.wings isa Vector{WingSettings} @test length(vss.wings) == 2 io = IOBuffer(repr(vss)) - @test countlines(io) == 32 + @test countlines(io) == 40 # Updated to match new output format end nothing diff --git a/test/solver/solver_settings.yaml b/test/solver/solver_settings.yaml new file mode 100644 index 00000000..689f915a --- /dev/null +++ b/test/solver/solver_settings.yaml @@ -0,0 +1,18 @@ +wings: + - name: "solver_test_wing" + geometry_file: "test/solver/solver_test_wing.yaml" + n_panels: 4 + n_groups: 2 + spanwise_panel_distribution: COSINE + spanwise_direction: [0.0, 1.0, 0.0] + remove_nan: true + +solver_settings: + aerodynamic_model_type: VSM + density: 1.225 + type_initial_gamma_distribution: UNIFORM + +condition: + alpha: 5.0 + beta: 0.0 + wind_speed: 10.0 diff --git a/test/solver/solver_test_polar.csv b/test/solver/solver_test_polar.csv new file mode 100644 index 00000000..7e043d9c --- /dev/null +++ b/test/solver/solver_test_polar.csv @@ -0,0 +1,4 @@ +alpha,cl,cd,cm +-10.0,0.1,0.02,-0.01 +0.0,1.0,0.01,0.0 +10.0,1.8,0.025,0.01 diff --git a/test/solver/solver_test_wing.yaml b/test/solver/solver_test_wing.yaml new file mode 100644 index 00000000..fb2d9328 --- /dev/null +++ b/test/solver/solver_test_wing.yaml @@ -0,0 +1,12 @@ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] + - [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "solver_test_polar.csv"}] diff --git a/test/solver/test_solver.jl b/test/solver/test_solver.jl new file mode 100644 index 00000000..1d60061a --- /dev/null +++ b/test/solver/test_solver.jl @@ -0,0 +1,32 @@ +using VortexStepMethod +using LinearAlgebra +using Test + +@testset "Solver Constructor Tests" begin + @testset "Solver Constructor with VSMSettings" begin + # Use module-specific test data files + settings_file = create_temp_wing_settings("solver", "solver_test_wing.yaml"; alpha=5.0, beta=0.0, wind_speed=10.0) + + try + # Test Solver constructor with VSMSettings + settings = VSMSettings(settings_file) + wing = Wing(settings) + body_aero = BodyAerodynamics([wing]) + solver = Solver(body_aero, settings) + + # Verify solver properties match settings + @test solver.aerodynamic_model_type == VSM + @test solver.density == 1.225 + + # Test that the solver can solve + va = [10.0, 0.0, 0.0] + set_va!(body_aero, va) + sol = solve!(solver, body_aero) + @test sol isa VSMSolution + + finally + # Cleanup + rm(settings_file; force=true) + end + end +end diff --git a/test/test_body_aerodynamics.jl b/test/test_body_aerodynamics.jl index 63154fff..e69de29b 100644 --- a/test/test_body_aerodynamics.jl +++ b/test/test_body_aerodynamics.jl @@ -1,415 +0,0 @@ -using VortexStepMethod -using VortexStepMethod: calculate_cl, calculate_cd_cm, calculate_projected_area, calculate_AIC_matrices! -using LinearAlgebra -using Test -using Logging - -include("utils.jl") - -@testset "Induction Matrix Creation" begin - # Setup - n_panels = 3 - N = n_panels + 1 # number of SECTIONS - max_chord = 1.0 - span = 2.36 - AR = span^2 / (π * span * max_chord / 4) - dist = "cos" - coord = generate_coordinates_el_wing(max_chord, span, N, dist) - - Atot = max_chord / 2 * span / 2 * π - @debug "N: $N" - @debug "size(coord): $(size(coord))" - - v_a = 20.0 - aoa = 5.7106 * π / 180 - v_a = [cos(aoa), 0.0, sin(aoa)] .* v_a - - # Create wing geometry - core_radius_fraction = 1e-20 - coord_left_to_right = flip_created_coord_in_pairs(deepcopy(coord)) - wing = Wing(n_panels; spanwise_distribution=UNCHANGED) - for idx in 1:2:size(coord_left_to_right, 1) - add_section!( - wing, - coord_left_to_right[idx,:], - coord_left_to_right[idx+1,:], - INVISCID - ) - end - - body_aero = BodyAerodynamics([wing]) - set_va!(body_aero, v_a) - - # Calculate reference matrices using thesis functions - controlpoints, rings, bladepanels, ringvec, coord_L = - create_geometry_general(coord, v_a, N, "5fil", LLT) - - # Test LLT matrices - @testset "LLT Matrices" begin - # Calculate reference matrices - MatrixU, MatrixV, MatrixW = thesis_induction_matrix_creation( - deepcopy(ringvec), - deepcopy(controlpoints), - deepcopy(rings), - deepcopy(v_a), - zeros(N-1), - nothing, # data_airf not needed - nothing, # conv_crit not needed - LLT - ) - - # Calculate new matrices - va_norm_array = fill(norm(v_a), length(coord)) - va_unit_array = repeat(reshape(v_a ./ norm(v_a), 1, 3), length(coord)) - calculate_AIC_matrices!( - body_aero, - LLT, - core_radius_fraction, - va_norm_array, - va_unit_array - ) - AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] - - # Compare matrices - @test isapprox(MatrixU, AIC_x, atol=1e-5) - @test isapprox(MatrixV, -AIC_y, atol=1e-5) - @test isapprox(MatrixW, AIC_z, atol=1e-5) - end - - # Test VSM matrices - @testset "VSM Matrices" begin - # Calculate reference matrices for VSM - controlpoints, rings, bladepanels, ringvec, coord_L = - create_geometry_general(coord, v_a, N, "5fil", VSM) - - MatrixU, MatrixV, MatrixW = thesis_induction_matrix_creation( - deepcopy(ringvec), - deepcopy(controlpoints), - deepcopy(rings), - deepcopy(v_a), - zeros(N-1), - nothing, - nothing, - VSM - ) - - # Calculate new matrices - va_norm_array = fill(norm(v_a), length(coord)) - va_unit_array = repeat(reshape(v_a ./ norm(v_a), 1, 3), length(coord)) - calculate_AIC_matrices!( - body_aero, - VSM, - core_radius_fraction, - va_norm_array, - va_unit_array - ) - AIC_x, AIC_y, AIC_z = body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] - - # Compare matrices with higher precision for VSM - @test isapprox(MatrixU, AIC_x, atol=1e-8) - @test isapprox(MatrixV, -AIC_y, atol=1e-8) - @test isapprox(MatrixW, AIC_z, atol=1e-8) - end -end - - -@testset "Wing Geometry Creation" begin - @testset "Origin Translation" begin - # Create minimal wing with three sections (2 panels) - wing = Wing(2) - add_section!(wing, [0.0, 0.0, 0.0], [1.0, 0.0, 0.0], INVISCID) - add_section!(wing, [0.0, 1.0, 0.0], [1.0, 1.0, 0.0], INVISCID) - add_section!(wing, [0.0, 2.0, 0.0], [1.0, 2.0, 0.0], INVISCID) - - # Test non-zero origin translation - origin = MVec3(1.0, 2.0, 3.0) - body_aero = BodyAerodynamics([wing]; kite_body_origin=origin) - - # Check if sections are correctly translated - @test wing.sections[3].LE_point ≈ [-1.0, -2.0, -3.0] - @test wing.sections[3].TE_point ≈ [0.0, -2.0, -3.0] - @test wing.sections[2].LE_point ≈ [-1.0, -1.0, -3.0] - @test wing.sections[2].TE_point ≈ [0.0, -1.0, -3.0] - @test wing.sections[1].LE_point ≈ [-1.0, 0.0, -3.0] - @test wing.sections[1].TE_point ≈ [0.0, 0.0, -3.0] - end - - function create_geometry(; model=VSM, wing_type=:rectangular, plotting=false, N=40) - max_chord = 1.0 - span = 17.0 - AR = span^2 / (π * span * max_chord / 4) - @debug "AR: $AR" - v_a = 20.0 - aoa = 5.7106 * π / 180 - v_a = [cos(aoa), 0.0, sin(aoa)] .* v_a - - coord = if wing_type === :rectangular - theta = range(-0.5, 0.5, length=N) - beta = range(-2, 2, length=N) - generate_coordinates_rect_wing( - fill(max_chord, N), - span, - theta, - beta, - N, - "lin" - ) - elseif wing_type === :curved - generate_coordinates_curved_wing( - max_chord, span, π/4, 5, N, "cos" - ) - elseif wing_type === :elliptical - generate_coordinates_el_wing(max_chord, span, N, "cos") - else - error("Invalid wing type") - end - - coord_left_to_right = flip_created_coord_in_pairs(deepcopy(coord)) - wing = Wing(N-1; spanwise_distribution=UNCHANGED) - for i in 1:2:size(coord_left_to_right, 1) - add_section!( - wing, - coord_left_to_right[i,:], - coord_left_to_right[i+1,:], - INVISCID - ) - end - body_aero = BodyAerodynamics([wing]) - set_va!(body_aero, v_a) - - return body_aero, coord, v_a, model - end - - for model in [VSM, LLT] - @debug "model: $model" - for wing_type in [:rectangular, :curved, :elliptical] - @debug "wing_type: $wing_type" - body_aero, coord, v_a, model = create_geometry( - model=model, wing_type=wing_type - ) - - # Generate geometry - expected_controlpoints, expected_rings, expected_bladepanels, - expected_ringvec, expected_coord_L = create_geometry_general( - coord, v_a, div(size(coord,1), 2), "5fil", model - ) - - for i in 1:length(body_aero.panels) - @debug "i: $i" - # Handle control points - index_reversed = length(body_aero.panels) - i + 1 - panel = body_aero.panels[index_reversed] - - evaluation_point = if model === VSM - panel.control_point - else # LLT - panel.aero_center - end - - @test isapprox(evaluation_point, expected_controlpoints[i]["coordinates"], atol=1e-4) - @test isapprox(panel.chord, expected_controlpoints[i]["chord"], atol=1e-4) - @test isapprox(panel.z_airf, expected_controlpoints[i]["normal"], atol=1e-4) - @test isapprox(panel.x_airf, expected_controlpoints[i]["tangential"], atol=1e-4) - @test isapprox( - hcat(panel.z_airf, panel.x_airf, panel.y_airf), - expected_controlpoints[i]["airf_coord"], - atol=1e-4 - ) - - if model === VSM - @test isapprox( - panel.aero_center, - expected_controlpoints[i]["coordinates_aoa"], - atol=1e-4 - ) - end - - # Handle rings - expected_ring_i = expected_rings[i] - expected_ring_i_list = [ - expected_ring_i[1], - expected_ring_i[2], - expected_ring_i[3], - expected_ring_i[4], - expected_ring_i[5] - ] - - filaments = panel.filaments - filament_list = [ - filaments[1], - filaments[3], - filaments[5], - filaments[2], - filaments[4] - ] - - for (j, fil) in enumerate(filament_list) - if j == 1 # bound filaments - @test isapprox(fil.x1, expected_ring_i_list[j]["x1"], atol=1e-4) - @test isapprox(fil.x2, expected_ring_i_list[j]["x2"], atol=1e-4) - elseif j ∈ (2, 4) # trailing filaments - @test isapprox(fil.x1, expected_ring_i_list[j]["x1"], atol=1e-4) - @test isapprox(fil.x2, expected_ring_i_list[j]["x2"], atol=1e-4) - else # semi-infinite filaments - @test isapprox(fil.x1, expected_ring_i_list[j]["x1"], atol=1e-4) - end - end - - # Handle bladepanels - exp_bladepanels = expected_bladepanels[i] - @test isapprox(panel.LE_point_2, exp_bladepanels["p1"], atol=1e-4) - @test isapprox(panel.LE_point_1, exp_bladepanels["p2"], atol=1e-4) - @test isapprox(panel.TE_point_1, exp_bladepanels["p3"], atol=1e-4) - @test isapprox(panel.TE_point_2, exp_bladepanels["p4"], atol=1e-4) - - # Handle ringvec - exp_ringvec = expected_ringvec[i] - r0 = panel.bound_point_1 - panel.bound_point_2 - r3 = evaluation_point - (panel.bound_point_1 + panel.bound_point_2) / 2 - @test isapprox(r0, exp_ringvec["r0"], atol=1e-4) - @test isapprox(r3, exp_ringvec["r3"], atol=1e-4) - - # Handle coord_L - @test all(isapprox.(panel.aero_center, expected_coord_L[:, i])) - end - end - end -end - -@testset "Calculate results against output results" begin - # Setup - density = 1.225 - N = 40 - max_chord = 1.0 - span = 15.709 # AR = 20 - v_a = 20.0 - AR = span^2 / (π * span * max_chord / 4) - aoa = deg2rad(5) - v_a = [cos(aoa), 0.0, sin(aoa)] .* v_a - model = VSM - - # Setup wing geometry - dist = "cos" - core_radius_fraction = 1e-20 - coord = generate_coordinates_el_wing(max_chord, span, N, dist) - coord_left_to_right = flip_created_coord_in_pairs(deepcopy(coord)) - wing = Wing(N-1; spanwise_distribution=UNCHANGED) - for idx in 1:2:length(coord_left_to_right[:, 1]) - @debug "coord_left_to_right[$idx] = $(coord_left_to_right[idx,:])" - add_section!( - wing, - coord_left_to_right[idx,:], - coord_left_to_right[idx+1,:], - INVISCID - ) - end - - body_aero = BodyAerodynamics([wing]) - set_va!(body_aero, v_a) - - # Run analysis - loop_solver = Solver(body_aero; - aerodynamic_model_type=model, - core_radius_fraction=core_radius_fraction, - solver_type=LOOP, - atol=1e-8, - rtol=1e-8 - ) - nonlin_solver = Solver(body_aero; - aerodynamic_model_type=model, - core_radius_fraction=core_radius_fraction, - solver_type=NONLIN, - atol=1e-8, - rtol=1e-8 - ) - results_NEW = solve(loop_solver, body_aero; reference_point=[0,1,0]) - # println(results_NEW) - - @test results_NEW isa Dict - - @testset "Loop and nonlin solve!" begin - loop_sol = solve!(loop_solver, body_aero; reference_point=[0,1,0]) - nonlin_sol = solve!(nonlin_solver, body_aero; reference_point=[0,1,0]) - - @test all(isapprox.(nonlin_sol.gamma_distribution, loop_sol.gamma_distribution; atol=1e-4)) - - @test loop_sol.force.x ≈ -117.96518414816444 atol=1e-4 - @test loop_sol.force.y ≈ 0.0 atol=1e-10 - @test loop_sol.force.z ≈ 1481.996390329679 atol=1e-4 rtol= 1e-4 - - @test loop_sol.moment.x ≈ -1481.996390329678 atol=1e-4 rtol= 1e-4 - @test loop_sol.moment.y ≈ 0.0 atol=1e-10 - @test loop_sol.moment.z ≈ -117.9651841481644 atol=1e-4 - - @test loop_sol.force_coeffs[1] ≈ -0.039050322560956294 atol=1e-4 # CFx - @test loop_sol.force_coeffs[2] ≈ 0.0 atol=1e-4 # CFy - @test loop_sol.force_coeffs[3] ≈ 0.49055973654418716 atol=1e-4 # CFz - @test loop_sol.force_coeffs[3] / loop_sol.force_coeffs[1] ≈ loop_sol.force[3] / loop_sol.force[1] - @test loop_sol.moment_dist[1] ≈ -0.0006683569356186426 atol=1e-8 - @test loop_sol.moment_coeff_dist[1] ≈ -2.212405554436003e-7 atol=1e-10 - @test loop_sol.moment_dist[1] / loop_sol.moment_dist[2] ≈ loop_sol.moment_coeff_dist[1] / loop_sol.moment_coeff_dist[2] - - @test loop_sol.solver_status == FEASIBLE - - @test sum(loop_sol.moment_dist) ≈ sum(loop_sol.group_moment_dist) - @test sum(nonlin_sol.moment_dist) ≈ sum(nonlin_sol.group_moment_dist) - - end - - # Calculate forces using uncorrected alpha - alpha = results_NEW["alpha_uncorrected"] - dyn_visc = 0.5 * density * norm(v_a)^2 - n_panels = length(body_aero.panels) - lift = zeros(n_panels) - drag = zeros(n_panels) - moment = zeros(n_panels) - - for (i, panel) in enumerate(body_aero.panels) - lift[i] = dyn_visc * calculate_cl(panel, alpha[i]) * panel.chord - cd_cm = calculate_cd_cm(panel, alpha[i]) - drag[i] = dyn_visc * cd_cm[1] * panel.chord - moment[i] = dyn_visc * cd_cm[2] * panel.chord^2 - # @info "lift: $lift, drag: $drag, moment: $moment" - end - Fmag = hcat(lift, drag, moment) - - # Calculate coefficients using corrected alpha - alpha = results_NEW["alpha_at_ac"] - aero_coeffs = hcat( - [alpha[i] for (i, panel) in enumerate(body_aero.panels)], - [calculate_cl(panel, alpha[i]) for (i, panel) in enumerate(body_aero.panels)], - [calculate_cd_cm(panel, alpha[i])[1] for (i, panel) in enumerate(body_aero.panels)], - [calculate_cd_cm(panel, alpha[i])[2] for (i, panel) in enumerate(body_aero.panels)] - ) - - ringvec = [Dict("r0" => panel.width * panel.y_airf) for panel in body_aero.panels] - controlpoints = [Dict("tangential" => panel.x_airf, "normal" => panel.z_airf) - for panel in body_aero.panels] - Atot = calculate_projected_area(wing) - - F_rel_ref, F_gl_ref, Ltot_ref, Dtot_ref, CL_ref, CD_ref, CS_ref = - output_results(Fmag, aero_coeffs, ringvec, v_a, controlpoints, Atot) - - # Compare results - @info "Comparing results" - @info "cl_calculated: $(results_NEW["cl"]), CL_ref: $CL_ref" - @info "cd_calculated: $(results_NEW["cd"]), CD_ref: $CD_ref" - @info "cs_calculated: $(results_NEW["cs"]), CS_ref: $CS_ref" - @info "L_calculated: $(results_NEW["lift"]), Ltot_ref: $Ltot_ref" - @info "D_calculated: $(results_NEW["drag"]), Dtot_ref: $Dtot_ref" - - # Assert results - @test isapprox(results_NEW["cl"], CL_ref, rtol=1e-4) - @test isapprox(results_NEW["cd"], CD_ref, rtol=1e-4) - @test isapprox(results_NEW["cs"], CS_ref, rtol=1e-4) - @test isapprox(results_NEW["lift"], Ltot_ref, rtol=1e-4) - @test isapprox(results_NEW["drag"], Dtot_ref, rtol=1e-4) - @test isapprox(results_NEW["Fx"], results_NEW["Mz"], rtol=1e-4) # 1 meter arm - @test isapprox(results_NEW["My"], 0.0, atol=1e-3) - @test isapprox(results_NEW["Fz"], -results_NEW["Mx"], rtol=1e-4) # 1 meter arm - - # Check array shapes - @test length(results_NEW["cl_distribution"]) == length(body_aero.panels) - @test length(results_NEW["cd_distribution"]) == length(body_aero.panels) -end - diff --git a/test/test_data_utils.jl b/test/test_data_utils.jl new file mode 100644 index 00000000..23b54c59 --- /dev/null +++ b/test/test_data_utils.jl @@ -0,0 +1,156 @@ +# Test data utilities for managing shared test configurations +# Organized by source module being tested + +using YAML +using Random: randstring +using Logging + +""" + suppress_warnings(f) + +Temporarily suppress all warnings while executing function `f`. +Useful for tests that expect and want to ignore certain warnings. + +# Example +```julia +result = suppress_warnings(() -> some_function_that_warns()) +``` +""" +function suppress_warnings(f) + old_logger = global_logger() + try + global_logger(NullLogger()) + return f() + finally + global_logger(old_logger) + end +end + +""" + test_data_path(module_name, relative_path...) + +Get the absolute path to test data files relative to the test/module_name directory. + +# Arguments +- `module_name`: Name of the source module being tested (e.g., "yaml_geometry", "body_aerodynamics", "solver") +- `relative_path...`: Path components relative to the module directory + +# Examples +```julia +wing_file = test_data_path("yaml_geometry", "wings", "simple_wing.yaml") +polar_file = test_data_path("yaml_geometry", "polars", "standard_airfoil.csv") +body_aero_wing = test_data_path("body_aerodynamics", "wings", "test_wing.yaml") +``` +""" +test_data_path(module_name, relative_path...) = joinpath(@__DIR__, module_name, relative_path...) + +""" + create_temp_wing_settings(module_name, wing_file; kwargs...) + +Create a temporary VSMSettings file that references the given wing geometry file. +Useful for tests that need to modify settings while using standard wing geometries. + +# Arguments +- `module_name`: Name of the source module being tested +- `wing_file`: Wing geometry file name (relative to test/data/module_name/wings/) +- `kwargs...`: Additional settings to override defaults + +# Returns +- Path to temporary settings file (caller should clean up) + +# Example +```julia +settings_file = create_temp_wing_settings("body_aerodynamics", "test_wing.yaml"; alpha=15.0, wind_speed=25.0) +# Use settings_file... +rm(settings_file) +``` +""" +function create_temp_wing_settings(module_name, wing_file; + name="test_wing", + n_panels=4, + n_groups=2, + spanwise_panel_distribution="COSINE", + spanwise_direction=[0.0, 1.0, 0.0], + remove_nan=true, + aerodynamic_model_type="VSM", + density=1.225, + type_initial_gamma_distribution="ZEROS", + alpha=10.0, + beta=5.0, + wind_speed=15.0, +) + wing_file_path = isabspath(wing_file) ? wing_file : test_data_path(module_name, wing_file) + wing_file_path = replace(normpath(wing_file_path), '\\' => '/') + + doc = Dict( + "wings" => [Dict( + "name" => name, + "geometry_file" => wing_file_path, + "n_panels" => n_panels, + "n_groups" => n_groups, + "spanwise_panel_distribution" => spanwise_panel_distribution, + "spanwise_direction" => spanwise_direction, + "remove_nan" => remove_nan, + )], + "solver_settings" => Dict( + "aerodynamic_model_type" => aerodynamic_model_type, + "density" => density, + "type_initial_gamma_distribution" => type_initial_gamma_distribution, + ), + "condition" => Dict( + "alpha" => alpha, + "beta" => beta, + "wind_speed" => wind_speed, + ), + ) + + temp_file = joinpath(tempdir(), "temp_wing_settings_$(randstring(8)).yaml") + open(temp_file, "w") do io + YAML.write(io, doc) + end + return temp_file +end + +""" + get_standard_wing_file(module_name) + +Get the path to the standard simple wing file for a given module. + +# Example +```julia +wing_file = get_standard_wing_file("body_aerodynamics") # Returns path to test_wing.yaml +``` +""" +function get_standard_wing_file(module_name) + if module_name == "yaml_geometry" + return test_data_path("yaml_geometry", "wings", "simple_wing.yaml") + elseif module_name == "body_aerodynamics" + return test_data_path("body_aerodynamics", "wings", "test_wing.yaml") + elseif module_name == "solver" + return test_data_path("solver", "wings", "solver_test_wing.yaml") + else + error("Unknown module: $module_name") + end +end + +""" + get_complete_settings_file(module_name) + +Get the path to a complete settings file for a given module. + +# Example +```julia +settings_file = get_complete_settings_file("body_aerodynamics") +``` +""" +function get_complete_settings_file(module_name) + if module_name == "body_aerodynamics" + return test_data_path("body_aerodynamics", "complete_settings.yaml") + elseif module_name == "solver" + return test_data_path("solver", "solver_settings.yaml") + else + # Fall back to creating a temporary file + return create_temp_wing_settings(module_name, basename(get_standard_wing_file(module_name))) + end +end + diff --git a/test/test_solver.jl b/test/test_solver.jl new file mode 100644 index 00000000..e69de29b diff --git a/test/test_yaml_geometry.jl b/test/test_yaml_geometry.jl new file mode 100644 index 00000000..e69de29b diff --git a/test/wake/test_wake.jl b/test/wake/test_wake.jl new file mode 100644 index 00000000..156e4ec9 --- /dev/null +++ b/test/wake/test_wake.jl @@ -0,0 +1,49 @@ +using Test +using LinearAlgebra +using VortexStepMethod + +# Test the actual frozen_wake! function using real objects +@testset "frozen_wake! Tests" begin + @testset "frozen_wake! basic functionality" begin + # Use existing test data that we know works + data_dir = joinpath(dirname(dirname(@__DIR__)), "data", "ram_air_kite") + body_path = joinpath(tempdir(), "ram_air_kite_body.obj") + foil_path = joinpath(tempdir(), "ram_air_kite_foil.dat") + + body_src = joinpath(data_dir, "ram_air_kite_body.obj") + foil_src = joinpath(data_dir, "ram_air_kite_foil.dat") + + # Check if source files exist before copying + if isfile(body_src) && isfile(foil_src) + cp(body_src, body_path; force=true) + cp(foil_src, foil_path; force=true) + + try + # Create wing and body aerodynamics with known good geometry + wing = RamAirWing(body_path, foil_path; n_panels=56) # Use default panels + body_aero = BodyAerodynamics([wing]) + + # Test that frozen_wake! doesn't throw errors + n_panels = length(body_aero.panels) + va_distribution = ones(n_panels, 3) # Create velocity distribution for all panels + va_distribution[:, 1] .= 15.0 # X velocity = 15.0 m/s + va_distribution[:, 2] .= 0.0 # Y velocity = 0.0 + va_distribution[:, 3] .= 0.0 # Z velocity = 0.0 + + # This should not throw an error + @test_nowarn VortexStepMethod.frozen_wake!(body_aero, va_distribution) + + # Test that the function accepts the right number of velocity vectors + @test size(va_distribution, 1) == length(body_aero.panels) + @test size(va_distribution, 2) == 3 # 3D velocity vectors + + finally + # Clean up + rm(body_path; force=true) + rm(foil_path; force=true) + end + else + @test_skip "Ram air kite test data files not found, skipping frozen_wake! test" + end + end +end diff --git a/test/test_wing_geometry.jl b/test/wing_geometry/test_wing_geometry.jl similarity index 100% rename from test/test_wing_geometry.jl rename to test/wing_geometry/test_wing_geometry.jl diff --git a/test/yaml_geometry/alternate_airfoil.csv b/test/yaml_geometry/alternate_airfoil.csv new file mode 100644 index 00000000..84b09166 --- /dev/null +++ b/test/yaml_geometry/alternate_airfoil.csv @@ -0,0 +1,7 @@ +alpha,cl,cd,cm +-10.0,0.15,0.025,-0.015 +-5.0,0.55,0.018,-0.008 +0.0,1.1,0.012,0.001 +5.0,1.6,0.018,0.008 +10.0,1.9,0.03,0.012 +15.0,1.7,0.055,0.018 diff --git a/test/yaml_geometry/complex_wing.yaml b/test/yaml_geometry/complex_wing.yaml new file mode 100644 index 00000000..ff38435d --- /dev/null +++ b/test/yaml_geometry/complex_wing.yaml @@ -0,0 +1,18 @@ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 5.0, 0.0, 2.0, 5.0, 0.5] + - [2, 0.2, 3.0, 0.2, 1.8, 3.0, 0.3] + - [2, 0.4, 1.0, 0.4, 1.6, 1.0, 0.1] + - [1, 0.5, 0.0, 0.5, 1.5, 0.0, 0.0] + - [2, 0.4, -1.0, 0.4, 1.6, -1.0, 0.1] + - [2, 0.2, -3.0, 0.2, 1.8, -3.0, 0.3] + - [1, 0.0, -5.0, 0.0, 2.0, -5.0, 0.5] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "standard_airfoil.csv"}] + - [2, polars, {csv_file_path: "alternate_airfoil.csv"}] diff --git a/test/yaml_geometry/simple_wing.yaml b/test/yaml_geometry/simple_wing.yaml new file mode 100644 index 00000000..e6c62baa --- /dev/null +++ b/test/yaml_geometry/simple_wing.yaml @@ -0,0 +1,12 @@ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] + - [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "standard_airfoil.csv"}] diff --git a/test/yaml_geometry/standard_airfoil.csv b/test/yaml_geometry/standard_airfoil.csv new file mode 100644 index 00000000..b675b096 --- /dev/null +++ b/test/yaml_geometry/standard_airfoil.csv @@ -0,0 +1,7 @@ +alpha,cl,cd,cm +-10.0,0.1,0.02,-0.01 +-5.0,0.5,0.015,-0.005 +0.0,1.0,0.01,0.0 +5.0,1.5,0.015,0.005 +10.0,1.8,0.025,0.01 +15.0,1.6,0.05,0.015 diff --git a/test/yaml_geometry/test_load_polar_data.jl b/test/yaml_geometry/test_load_polar_data.jl new file mode 100644 index 00000000..ccb487e1 --- /dev/null +++ b/test/yaml_geometry/test_load_polar_data.jl @@ -0,0 +1,126 @@ +using VortexStepMethod +using VortexStepMethod: load_polar_data +using LinearAlgebra +using Test +using YAML +using Logging + +@testset "load_polar_data Function Tests" begin + # Setup temporary files for testing + test_csv_path = joinpath(tempdir(), "test_polar.csv") + + # Clean up function + function cleanup_test_files() + isfile(test_csv_path) && rm(test_csv_path; force=true) + end + + @testset "Valid CSV File" begin + # Create a valid CSV file with polar data + csv_content = """alpha,cl,cd,cm + -10.0,0.1,0.02,-0.01 + -5.0,0.5,0.015,-0.005 + 0.0,1.0,0.01,0.0 + 5.0,1.5,0.015,0.005 + 10.0,1.8,0.025,0.01 + 15.0,1.6,0.05,0.015""" + write(test_csv_path, csv_content) + + aero_data, aero_model = load_polar_data(test_csv_path) + + @test aero_model == POLAR_VECTORS + @test aero_data isa Tuple{Vector{Float64}, Vector{Float64}, Vector{Float64}, Vector{Float64}} + @test length(aero_data) == 4 # alpha, cl, cd, cm + @test length(aero_data[1]) == 6 # 6 data points + + # Test that alpha is converted to radians + @test aero_data[1] ≈ deg2rad.([-10.0, -5.0, 0.0, 5.0, 10.0, 15.0]) + + # Test coefficient values + @test aero_data[2] ≈ [0.1, 0.5, 1.0, 1.5, 1.8, 1.6] # cl + @test aero_data[3] ≈ [0.02, 0.015, 0.01, 0.015, 0.025, 0.05] # cd + @test aero_data[4] ≈ [-0.01, -0.005, 0.0, 0.005, 0.01, 0.015] # cm + end + + @testset "Different Column Order" begin + # Test with different column ordering + csv_content = """cm,alpha,cd,cl + -0.01,-10.0,0.02,0.1 + -0.005,-5.0,0.015,0.5 + 0.0,0.0,0.01,1.0""" + write(test_csv_path, csv_content) + + aero_data, aero_model = load_polar_data(test_csv_path) + + @test aero_model == POLAR_VECTORS + @test aero_data[1] ≈ deg2rad.([-10.0, -5.0, 0.0]) # alpha + @test aero_data[2] ≈ [0.1, 0.5, 1.0] # cl + @test aero_data[3] ≈ [0.02, 0.015, 0.01] # cd + @test aero_data[4] ≈ [-0.01, -0.005, 0.0] # cm + end + + @testset "Case Insensitive Headers" begin + # Test with mixed case headers + csv_content = """ALPHA,CL,CD,CM + 0.0,1.0,0.01,0.0 + 5.0,1.5,0.015,0.005""" + write(test_csv_path, csv_content) + + aero_data, aero_model = load_polar_data(test_csv_path) + + @test aero_model == POLAR_VECTORS + @test length(aero_data[1]) == 2 + end + + @testset "Missing File" begin + nonexistent_path = joinpath(tempdir(), "nonexistent.csv") + aero_data, aero_model = suppress_warnings(() -> load_polar_data(nonexistent_path)) + + @test aero_model == INVISCID + @test aero_data === nothing + end + + @testset "Empty File Path" begin + aero_data, aero_model = suppress_warnings(() -> load_polar_data("")) + + @test aero_model == INVISCID + @test aero_data === nothing + end + + @testset "Invalid CSV Format" begin + # Missing required columns + csv_content = """alpha,cl + 0.0,1.0 + 5.0,1.5""" + write(test_csv_path, csv_content) + + aero_data, aero_model = suppress_warnings(() -> load_polar_data(test_csv_path)) + + @test aero_model == INVISCID + @test aero_data === nothing + end + + @testset "Empty CSV File" begin + write(test_csv_path, "") + + aero_data, aero_model = suppress_warnings(() -> load_polar_data(test_csv_path)) + + @test aero_model == INVISCID + @test aero_data === nothing + end + + @testset "Malformed Data" begin + # Invalid numeric data + csv_content = """alpha,cl,cd,cm + invalid,1.0,0.01,0.0 + 5.0,1.5,0.015,0.005""" + write(test_csv_path, csv_content) + + aero_data, aero_model = suppress_warnings(() -> load_polar_data(test_csv_path)) + + @test aero_model == INVISCID + @test aero_data === nothing + end + + # Cleanup after all tests + cleanup_test_files() +end diff --git a/test/yaml_geometry/test_wing_constructor.jl b/test/yaml_geometry/test_wing_constructor.jl new file mode 100644 index 00000000..b7b30a45 --- /dev/null +++ b/test/yaml_geometry/test_wing_constructor.jl @@ -0,0 +1,267 @@ +using VortexStepMethod +using VortexStepMethod: load_polar_data +using LinearAlgebra +using Test +using YAML +using Logging + +@testset "Wing Constructor Tests" begin + # Setup temporary files for testing + test_yaml_path = joinpath(tempdir(), "test_wing.yaml") + test_polar_dir = joinpath(tempdir(), "polars") + + # Clean up function + function cleanup_test_files() + test_dir = dirname(test_yaml_path) + for file in [test_yaml_path, + joinpath(test_dir, "standard_airfoil.csv"), + joinpath(test_dir, "alternate_airfoil.csv")] + isfile(file) && rm(file; force=true) + end + isdir(test_polar_dir) && rm(test_polar_dir; recursive=true, force=true) + end + + # Create polar data directory and files + mkpath(test_polar_dir) + + # Copy the actual polar files to the temp directory for tests that reference them + cp(test_data_path("yaml_geometry", "standard_airfoil.csv"), joinpath(test_polar_dir, "1.csv"); force=true) + cp(test_data_path("yaml_geometry", "alternate_airfoil.csv"), joinpath(test_polar_dir, "2.csv"); force=true) + + # Also copy them to the test directory itself for direct reference tests + test_dir = dirname(test_yaml_path) + cp(test_data_path("yaml_geometry", "standard_airfoil.csv"), joinpath(test_dir, "standard_airfoil.csv"); force=true) + cp(test_data_path("yaml_geometry", "alternate_airfoil.csv"), joinpath(test_dir, "alternate_airfoil.csv"); force=true) + + @testset "Valid YAML Wing Construction" begin + # Use the actual YAML file from the test data + cp(test_data_path("yaml_geometry", "simple_wing.yaml"), test_yaml_path; force=true) + + wing = Wing(test_yaml_path; n_panels=4, n_groups=2) + + @test wing isa Wing + @test wing.n_panels == 4 + @test wing.n_groups == 2 + @test wing.spanwise_distribution == LINEAR + @test wing.spanwise_direction ≈ [0.0, 1.0, 0.0] + @test length(wing.sections) == 2 # simple_wing has 2 sections + + # Test section coordinates (sections are sorted by spanwise position) + # simple_wing.yaml has: [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] and [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + # Sorted by y-coordinate: y=1.0, y=-1.0 + @test wing.sections[1].LE_point ≈ [0.0, 1.0, 0.0] + @test wing.sections[1].TE_point ≈ [1.0, 1.0, 0.0] + @test wing.sections[2].LE_point ≈ [0.0, -1.0, 0.0] + @test wing.sections[2].TE_point ≈ [1.0, -1.0, 0.0] + + # Test that sections have polar data + @test wing.sections[1].aero_model == POLAR_VECTORS + @test wing.sections[2].aero_model == POLAR_VECTORS + + # Test polar data is loaded + @test wing.sections[1].aero_data isa Tuple + @test length(wing.sections[1].aero_data) == 4 + @test length(wing.sections[1].aero_data[1]) >= 3 # at least 3 alpha points + end + + @testset "Wing Constructor Parameters" begin + # Use the simple_wing.yaml and test custom parameters + cp(test_data_path("yaml_geometry", "simple_wing.yaml"), test_yaml_path; force=true) + + # Test custom parameters + wing = Wing( + test_yaml_path; + n_panels=8, + n_groups=4, + spanwise_distribution=COSINE, + remove_nan=false + ) + + @test wing.n_panels == 8 + @test wing.n_groups == 4 + @test wing.spanwise_distribution == COSINE + @test !wing.remove_nan + end + + @testset "Missing Polar Files" begin + # Create YAML with non-existent polar files + yaml_content = """ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] + - [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "nonexistent.csv"}] +""" + write(test_yaml_path, yaml_content) + + wing = suppress_warnings(() -> Wing(test_yaml_path; n_panels=2)) + + # Should fall back to INVISCID model + @test wing.sections[1].aero_model == INVISCID + @test wing.sections[1].aero_data === nothing + end + + @testset "Sections Without Polar Files" begin + # Create YAML with empty polar file paths + yaml_content = """ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] + - [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: ""}] +""" + write(test_yaml_path, yaml_content) + + wing = suppress_warnings(() -> Wing(test_yaml_path; n_panels=2)) + + # Should fall back to INVISCID model + @test wing.sections[1].aero_model == INVISCID + end + + @testset "Invalid Parameters" begin + yaml_content = """ +wing_sections: + headers: [airfoil_id, LE_x, LE_y, LE_z, TE_x, TE_y, TE_z] + data: + - [1, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0] + - [1, 0.0, -1.0, 0.0, 1.0, -1.0, 0.0] + +wing_airfoils: + alpha_range: [-10, 10, 1] + reynolds: 1000000 + headers: [airfoil_id, type, info_dict] + data: + - [1, polars, {csv_file_path: "polars/1.csv"}] +""" + write(test_yaml_path, yaml_content) + + # Test invalid n_panels/n_groups combination + @test_throws ArgumentError Wing(test_yaml_path; n_panels=5, n_groups=2) + + # Test invalid spanwise direction + @test_throws ArgumentError Wing(test_yaml_path; spanwise_direction=[1.0, 0.0, 0.0]) + end + + @testset "Relative Path Resolution" begin + # Test that relative paths in CSV files are resolved relative to YAML file + subdir = joinpath(tempdir(), "subtest") + mkpath(subdir) + + # Copy the simple wing file to subdirectory + subdir_yaml_path = joinpath(subdir, "wing.yaml") + cp(test_data_path("yaml_geometry", "simple_wing.yaml"), subdir_yaml_path; force=true) + + # Copy the polar file to subdirectory too + subdir_polar_path = joinpath(subdir, "standard_airfoil.csv") + cp(test_data_path("yaml_geometry", "standard_airfoil.csv"), subdir_polar_path; force=true) + + wing = Wing(subdir_yaml_path; n_panels=2) + + # Should successfully load polar data with relative path + @test wing.sections[1].aero_model == POLAR_VECTORS + @test wing.sections[1].aero_data isa Tuple + @test wing.sections[2].aero_model == POLAR_VECTORS + @test wing.sections[2].aero_data isa Tuple + + # Cleanup + rm(subdir; recursive=true) + end + + @testset "Complex Wing Geometry" begin + # Use the actual complex_wing.yaml file + cp(test_data_path("yaml_geometry", "complex_wing.yaml"), test_yaml_path; force=true) + + wing = Wing(test_yaml_path; n_panels=12, n_groups=3) + + @test wing.n_panels == 12 + @test wing.n_groups == 3 + @test length(wing.sections) == 7 + + # Test that different airfoil_ids get different polar data + @test wing.sections[1].aero_model == POLAR_VECTORS + @test wing.sections[2].aero_model == POLAR_VECTORS + + # Verify geometric progression along wingspan + @test wing.sections[1].LE_point[2] == 5.0 # First section at y=5 + @test wing.sections[4].LE_point[2] == 0.0 # Middle section at y=0 + @test wing.sections[7].LE_point[2] == -5.0 # Last section at y=-5 + end + + @testset "VSMSettings Constructor" begin + # Test Wing constructor that takes VSMSettings + # Use the actual simple_wing.yaml file + simple_wing_file = test_data_path("yaml_geometry", "simple_wing.yaml") + + # Create VSMSettings with wing configuration + settings = VSMSettings() + settings.wings = [WingSettings( + geometry_file=simple_wing_file, + n_panels=6, + n_groups=3, + spanwise_panel_distribution=COSINE + )] + + # Test Wing constructor with VSMSettings + wing = Wing(settings) + + @test wing isa Wing + @test wing.n_panels == 6 + @test wing.n_groups == 3 + @test wing.spanwise_distribution == COSINE + @test length(wing.sections) == 2 + @test wing.sections[1].aero_model == POLAR_VECTORS + @test wing.sections[2].aero_model == POLAR_VECTORS + end + + @testset "Shared Test Data Usage" begin + # Demonstrate using module-specific test data files + simple_wing_file = test_data_path("yaml_geometry", "simple_wing.yaml") + @test isfile(simple_wing_file) + + # Test basic Wing construction with shared data + wing = Wing(simple_wing_file; n_panels=4, n_groups=2) + @test wing isa Wing + @test wing.n_panels == 4 + @test wing.n_groups == 2 + @test length(wing.sections) == 2 + + # Test complex wing construction + complex_wing_file = test_data_path("yaml_geometry", "complex_wing.yaml") + @test isfile(complex_wing_file) + + complex_wing = Wing(complex_wing_file; n_panels=12, n_groups=3) + @test complex_wing isa Wing + @test complex_wing.n_panels == 12 + @test complex_wing.n_groups == 3 + @test length(complex_wing.sections) == 7 + + # Verify polar data is loaded from shared files + @test complex_wing.sections[1].aero_model == POLAR_VECTORS + @test complex_wing.sections[1].aero_data isa Tuple + + # Test with module-specific convenience function - create a standard wing for this test + standard_wing_file = simple_wing_file # Use simple_wing as our "standard" + @test isfile(standard_wing_file) + + standard_wing = Wing(standard_wing_file; n_panels=2, n_groups=1) + @test standard_wing isa Wing + @test length(standard_wing.sections) == 2 + end + + # Cleanup after all tests + cleanup_test_files() +end diff --git a/test/yaml_geometry/test_yaml_geometry.jl b/test/yaml_geometry/test_yaml_geometry.jl new file mode 100644 index 00000000..12daa54f --- /dev/null +++ b/test/yaml_geometry/test_yaml_geometry.jl @@ -0,0 +1,7 @@ +using Test + +@testset "YAML Geometry Tests" begin + # Include specific test files for better organization + include("test_load_polar_data.jl") + include("test_wing_constructor.jl") +end