diff --git a/.github/workflows/make_docs.yaml b/.github/workflows/make_docs.yaml index 4d7e548f0..ead928dd2 100644 --- a/.github/workflows/make_docs.yaml +++ b/.github/workflows/make_docs.yaml @@ -9,7 +9,9 @@ on: jobs: build: runs-on: ubuntu-latest - + env: + JULIA_PKG_SERVER: "" + steps: - name: Checkout repository uses: actions/checkout@v4 @@ -19,12 +21,25 @@ jobs: with: version: '1.11' - - name: Instantiate Julia environment - run: julia --project=. -e 'using Pkg; Pkg.instantiate()' - - name: Download BLAS run: sudo apt install -y libopenblas-dev + + - name: Instantiate Julia environment + run: julia --project=. -e 'using Pkg; Pkg.resolve(); Pkg.instantiate()' + + - name: Resolve & Instantiate (fresh registries) + run: | + rm -f Manifest.toml + rm -rf ~/.julia/registries + julia --project=. -e ' + using Pkg; + Pkg.Registry.add(Pkg.RegistrySpec(url="https://github.com/JuliaRegistries/General.git")); + Pkg.Registry.update(); + Pkg.resolve(); + Pkg.instantiate(); + Pkg.precompile(); + - name: Build package run: julia --project=. -e 'using Pkg; Pkg.build()' - name: Run tests - run: julia --project=. -e 'using Pkg; Pkg.test()' \ No newline at end of file + run: julia --project=. -e 'using Pkg; Pkg.test()' diff --git a/.gitignore b/.gitignore index 449170808..305a68677 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,8 @@ *.dylib .vscode *.o -*.DS_Store \ No newline at end of file +*.DS_Store +notebooks/spline_examples.ipynb +.gitattributes +*.dll +Manifest.toml \ No newline at end of file diff --git a/Manifest.toml b/Manifest.toml deleted file mode 100644 index 605e30f25..000000000 --- a/Manifest.toml +++ /dev/null @@ -1,1099 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.11.4" -manifest_format = "2.0" -project_hash = "2b632f32b6dba8cd904f69606d9687f48d776f3b" - -[[deps.AliasTables]] -deps = ["PtrArrays", "Random"] -git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" -uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" -version = "1.1.3" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" - -[[deps.BitFlags]] -git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" -uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.9" - -[[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.9+0" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.8" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.29.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.12.1" -weakdeps = ["StyledStrings"] - - [deps.ColorTypes.extensions] - StyledStringsExt = "StyledStrings" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.11.0" - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - - [deps.ColorVectorSpace.weakdeps] - SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.13.1" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "3a3dfb30697e96a440e4149c8c51bf32f818c0f3" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.17.0" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.5.0" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[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 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.22" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" - -[[deps.Dbus_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" -uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" -version = "1.16.2+0" - -[[deps.DelimitedFiles]] -deps = ["Mmap"] -git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" -version = "1.9.1" - -[[deps.DocStringExtensions]] -git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.5" - -[[deps.Downloads]] -deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" - -[[deps.EpollShim_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" -uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" -version = "0.0.20230411+1" - -[[deps.ExceptionUnwrapping]] -deps = ["Test"] -git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" -uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.11" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.6.5+0" - -[[deps.FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.2" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.4+1" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -version = "1.11.0" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.5" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.16.0+0" - -[[deps.Format]] -git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" -uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" -version = "1.3.7" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.4+0" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.17+0" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] -git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.4.0+2" - -[[deps.GR]] -deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] -git-tree-sha1 = "1828eb7275491981fa5f1752a5e126e8f26f8741" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.73.17" - -[[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "27299071cc29e409488ada41ec7643e0ab19091f" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.73.17+0" - -[[deps.GettextRuntime_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] -git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" -uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" -version = "0.22.4+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "35fbd0cefb04a516104b8e183ce0df11b70a3f1a" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.84.3+0" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.15+0" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "ed5e9c58612c4e081aecdb6e1a479e18462e041e" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.17" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] -git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "8.5.1+0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.4" - -[[deps.JLFzf]] -deps = ["REPL", "Random", "fzf_jll"] -git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" -uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" -version = "0.1.11" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.0" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.1+0" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.2+0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "18.1.8+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.3+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.4.0" - -[[deps.Latexify]] -deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] -git-tree-sha1 = "4f34eaabe49ecb3fb0d58d6015e32fd31a733199" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.16.8" - - [deps.Latexify.extensions] - DataFramesExt = "DataFrames" - SparseArraysExt = "SparseArrays" - SymEngineExt = "SymEngine" - TectonicExt = "tectonic_jll" - - [deps.Latexify.weakdeps] - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" - tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.6.0+0" - -[[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -version = "1.11.0" - -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.7.2+0" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.4.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.7.1+1" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.18.0+0" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.0+0" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.1+0" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.0+0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.11.0" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.29" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" - -[[deps.LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.1.0" - -[[deps.MacroTools]] -git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.16" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] -git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.9" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.6+0" - -[[deps.Measures]] -git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.2" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.12.12" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.1.3" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.27+1" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+4" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.5.0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "87510f7292a2b21aeff97912b0898f9553cc5c2c" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.1+0" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.3+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.1" - -[[deps.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" - -[[deps.Pango_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "275a9a6d85dc86c24d03d1837a0010226a96f540" -uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.56.3+0" - -[[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.3" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.44.2+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.11.0" -weakdeps = ["REPL"] - - [deps.Pkg.extensions] - REPLExt = "REPL" - -[[deps.PlotThemes]] -deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.3.0" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.3" - -[[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] -git-tree-sha1 = "0c084960aa1edc9609c52052ca9cf6d2199b1c4b" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.40.15" - - [deps.Plots.extensions] - FileIOExt = "FileIO" - GeometryBasicsExt = "GeometryBasics" - IJuliaExt = "IJulia" - ImageInTerminalExt = "ImageInTerminal" - UnitfulExt = "Unitful" - - [deps.Plots.weakdeps] - FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" - GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" - IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" - ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.1" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" - -[[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" -uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" - -[[deps.Qt6Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] -git-tree-sha1 = "eb38d376097f47316fe089fc62cb7c6d85383a52" -uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" -version = "6.8.2+1" - -[[deps.Qt6Declarative_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] -git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10" -uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" -version = "6.8.2+1" - -[[deps.Qt6ShaderTools_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] -git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf" -uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" -version = "6.8.2+1" - -[[deps.Qt6Wayland_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] -git-tree-sha1 = "e1d5e16d0f65762396f9ca4644a5f4ddab8d452b" -uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" -version = "6.8.2+1" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" -version = "1.11.0" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] -git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.6.12" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.3.0" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -version = "1.11.0" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.2.0" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" -version = "1.11.0" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.11.0" - -[[deps.StableRNGs]] -deps = ["Random"] -git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" -uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.3" - -[[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" -weakdeps = ["SparseArrays"] - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.1" - -[[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.5" - -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.7.0+0" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -version = "1.11.0" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.11.3" - -[[deps.URIs]] -git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.6.1" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unitful]] -deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.23.1" - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - ForwardDiffExt = "ForwardDiff" - InverseFunctionsUnitfulExt = "InverseFunctions" - PrintfExt = "Printf" - - [deps.Unitful.weakdeps] - ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.UnitfulLatexify]] -deps = ["LaTeXStrings", "Latexify", "Unitful"] -git-tree-sha1 = "af305cc62419f9bd61b6644d19170a4d258c7967" -uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" -version = "1.7.0" - -[[deps.Unzip]] -git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" -uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" -version = "0.2.0" - -[[deps.Vulkan_Loader_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] -git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" -uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" -version = "1.3.243+0" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"] -git-tree-sha1 = "53ab3e9c94f4343c68d5905565be63002e13ec8c" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.23.1+1" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.6+1" - -[[deps.XZ_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" -uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.1+0" - -[[deps.Xorg_libICE_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" -uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" -version = "1.1.2+0" - -[[deps.Xorg_libSM_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] -git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" -uuid = "c834827a-8449-5923-a945-d239c165b7dd" -version = "1.2.6+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+0" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.13+0" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.4+0" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.6+0" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+0" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "9caba99d38404b285db8801d5c45ef4f4f425a6d" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "6.0.1+0" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.8.3+0" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] -git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.6+0" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.5+0" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.12+0" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] -git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.17.1+0" - -[[deps.Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.3+0" - -[[deps.Xorg_xcb_util_cursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] -git-tree-sha1 = "c5bf2dad6a03dfef57ea0a170a1fe493601603f2" -uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" -version = "0.1.5+0" - -[[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.1+0" - -[[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] -git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.1+0" - -[[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.1+0" - -[[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.10+0" - -[[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.2+0" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.7+0" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.44.0+0" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.6.0+0" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.7+1" - -[[deps.eudev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" -uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" -version = "3.2.14+0" - -[[deps.fzf_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" -uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" -version = "0.61.1+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.11.0+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.2+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.11.0+0" - -[[deps.libdecor_jll]] -deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] -git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" -uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" -version = "0.2.2+0" - -[[deps.libevdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" -uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" -version = "1.13.4+0" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.3+0" - -[[deps.libinput_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] -git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" -uuid = "36db933b-70db-51c0-b978-0f229ee0e533" -version = "1.28.1+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "cd155272a3738da6db765745b89e466fa64d0830" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.49+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+2" - -[[deps.mtdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" -uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" -version = "1.1.7+0" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.59.0+0" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+2" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.9.2+0" diff --git a/Project.toml b/Project.toml index f055b343a..91174c065 100644 --- a/Project.toml +++ b/Project.toml @@ -4,11 +4,19 @@ authors = ["Matthew Pharr ", "Rithik Banerjee [T M**2] -1.36721084E+00 + 1.03921169E+00 R OF MAGAXE --> [M] 3.11763506E+00 + -9.99273915E-07 Z OF MAGAXE --> [M] -2.99782174E-06 + -5.04402802E-06 Z0 --> [M] -1.51320841E-05 + 3.00000000E+00 R0 [M] USED FOR CONVERTING TO MKSA + 1.00000000E+00 B0 [T] USED FOR CONVERTING TO MKSA + 1.00000000E+00 SIGN OF B0 IN EXPERIMENT (CHEASE ASSUMES 1.0) + 1.53755753E+00 TOTAL CURRENT --> [A] 3.67064822E+06 + 1.00000000E+00 SIGN OF IP IN EXPERIMENT (CHEASE ASSUMES 1.0) + 1.69999553E+00 b/a + 1.05000000E+00 Q_ZERO, USING SIGNS OF IP AND B0, WOULD GIVE: 1.05000000E+00 + 4.43373475E+00 Q_EDGE, USING SIGNS OF IP AND B0, WOULD GIVE: 4.43373475E+00 + 1.51426490E-01 POLOIDAL BETA + 2.34029713E-02 BETA_EXP=

*2*MU0/B0**2 + 7.25523874E-01 LI + 3.46308209E-02 PRESSURE ON AXIS --> [Pa] 2.75583316E+04 --> [10**19 M**-3 KEV]: 1.72024542E+01 + 1.63188124E-02 BETA + 2.18184292E-02 BETA* (SQRT()) + 5.58550793E-02 BETA-AXIS=2p0/(T0/Rmag)^2; with Rmag->Rgeo(LCFS): 5.17194368E-02 + -1.51912315E-01 PSI-AXIS --> [T M**2] -1.36721084E+00 + -9.54493226E-01 2*PI*PSI-AXIS --> -8.59043904E+00 + -1.51912315E-01 IP_SIGN*PSI-AXIS --> [T M**2] -1.36721084E+00 + -9.54493226E-01 IP_SIGN*2*PI*PSI-AXIS --> -8.59043904E+00 + 1.99999525E+00 ASPECT RATIO ; a/R= 5.00001188E-01 + 7.64779790E+00 VOLUME -> 2.06490543E+02 + 1.29389993E+00 AREA -> 1.16450994E+01 + 2.53018281E+01 SURFACE -> 2.27716453E+02 + 4.34432012E+00 LENGTH -> 1.30329604E+01 + 5.00003104E-01 RMIN -> RMIN [m] 1.50000931E+00 + 1.49999983E+00 RMAX -> RMAX [m] 4.49999950E+00 + -8.49976057E-01 ZMIN -> ZMIN [m] -2.54992817E+00 + 8.49976009E-01 ZMAX -> ZMAX [m] 2.54992803E+00 + 1.00000147E+00 RGEOM -> RGEOM [m] 3.00000440E+00 + 4.99998364E-01 MINOR RADIUS -> A [m] 1.49999509E+00 diff --git a/notebooks/equil_chease_binary_test.ipynb b/notebooks/equil_chease_binary_test.ipynb new file mode 100644 index 000000000..75a6ac2a7 --- /dev/null +++ b/notebooks/equil_chease_binary_test.ipynb @@ -0,0 +1,2779 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "1b50e9cb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m project at `~/Documents/GitHub/JPEC`\n" + ] + }, + { + "data": { + "text/plain": [ + "Plots.GRBackend()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Test inverse.jl using the chease binary file IN1\n", + "\n", + "using Revise\n", + "using Pkg\n", + "#Pkg.update()\n", + "Pkg.activate(\"..\")\n", + "Pkg.instantiate()\n", + "using JPEC, Plots\n", + "gr()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "94c3d4e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting equilibrium reconstruction...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Forcing hamada coordinate jacobian exponents: power_*\n", + "└ @ JPEC.Equilibrium /Users/bursche/Documents/GitHub/JPEC/src/Equilibrium/EquilibriumTypes.jl:48\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Equilibrium file: Chease_Binary_example/INP1\n", + "--> Reading CHEASE file: Chease_Binary_example/INP1\n", + "--> Finished reading CHEASE equilibrium.\n", + " Magnetic axis at (ro=1.0109845985096224, zo=-7.831457903343921e-10), psio=0.09569384798874522\n", + "--- Starting Inverse Equilibrium Processing ---\n", + "--- Equilibrium Setup Complete ---\n", + "Equilibrium reconstruction complete.\n" + ] + } + ], + "source": [ + "println(\"Starting equilibrium reconstruction...\")\n", + "plasma_eq = JPEC.Equilibrium.setup_equilibrium(\"Chease_Binary_example/equil.toml\")\n", + "println(\"Equilibrium reconstruction complete.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c0c6ffc5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Generating data for 2D color plots ---\n", + "Evaluating the 'rzphi' mapping spline...\n", + "Evaluation complete.\n", + "Calculated R and Z grids.\n", + "--- Plotting heatmap for R(ψ,θ) ---\n", + "--- Plotting heatmap for Z(ψ,θ) ---\n", + "\n", + "2D color plots for R and Z have been saved.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOx9eXgVRfZ29U0gBBKWhEU0gAgosgsq6MCwioijMoDouMyHiMC464wLi4gLRvghoo6KCq6ACwquuADiLiK4QERxVFZlS1gSkCTk3v7+aG531e2361T1vTcb/T73gc7pU6dOb/XWOVXVbZimyQIECBAgQICjFaGKdiBAgAABAgSoSAREGKCC8fnnn48dO/bdd9+taEcSgMcff3zs2LG///67LRkzZsxtt91WgS7J8dJLL/3rX/86ePBgUmvZt29fbm7u3/72t4EDB95+++1bt26NUZgxY8bEiROT6kOAABIERBhACcccc4xhGIZhvP766+69b775prW3UaNGupZ/+umnJ5988ttvv02Em54466yzDA4NGjRo37799ddf726U48EHH3zw5JNP7tmzx5Y8/fTTL730UgKrkGDcuHH8MdatW7dNmzZXXnnlDz/8APV37do1bty4/fv316lTJ3lebdmypWvXrhMmTNi4cWNBQcH06dO7dOmycuVKXqdp06b33XffokWLkudGgAASBEQYQAOGYTz77LNu+bPPPmsYhj+bxx133IABA1q2bBmXZ2ro3LnzgAEDBgwYcNJJJ23atOmRRx7p0qXLjz/+mLwa+/Tpc+aZZybPvhtt2rSxjrFTp067d+9++umnu3XrtmLFCrfm5MmTi4qK7rzzzuQ5Y5rmxRdfvGnTpnnz5v3www9r1qxZvnz5oUOHhg4dWlRUZKtdfPHFbdu2ve222w4fPpw8ZwIE8IQZIIACmjRpwhjr2bNnamrqjh07+F35+flpaWm9evVijDVs2LCiPJRjwIABjLHFixfbku3bt5966qmMsQsuuCBRtQwZMoQxtnbt2kQZ1MLYsWMZYzNmzLAl+/fv/9vf/sYY69ixY4xyfn5+rVq1+vXrl1SX3nzzTcbYsGHDeOGECRMYY/fffz8vnD59OmNs4cKFSfUnQACIICIMoIGRI0eWlZW9+OKLvPCFF14oKSkZOXIkLLJ58+ZFixY9/PDDDz/88LvvvltSUhKjkJ+fv2bNmh07dsTI9+3bt3DhwpkzZz722GNff/212/KaNWvy8vIYYwcOHLA0ly9frn4sxxxzzN13380Yc0dLe/fuXbJkyezZs2fOnPnKK68UFBRAC4cPH3777bdnzpz5zDPPbNu2Dep88803lpMWdu/evWbNmp07d8ao/fTTT2vWrCkrK+OF69atmz9//owZM+bMmbNkyZLCwkL1o7NQt27dGTNmWKZ2797N73r66aeLi4svu+wyXrhmzZp169ZZ20VFRWvWrNm8ebP15++//75mzRo+66uCl19+mTH2j3/8gxdedNFFjLGYjPGll16akpIye/ZsLfsBAiQGFc3EAaoGrIhwx44dTZo0iQkvunTpkp2dvX37duaKCE855ZSY+61p06YrVqzgdebMmcMYmzp1aoywbt26fMFevXr98ccftkIkEmGMnXDCCe+99152dral889//tPLf3dEaJqm1einpKSEw2FbePXVV6empvJV165d++GHH44x+Msvv7Rr187WSU1NnTVrljsiTElJad68uf3no48+ysSgzcIZZ5zBGNu5c6f1Z1FR0bnnnhtz6lJTU3/99VevAzRRRGia5p9//mkVjyl72mmnWReUFxqG0axZM2v7o48+YoyNHj3a+nP8+PGMsXnz5kkccMPKeP/++++8MBwOp6enG4ZRVFTEy7t162YYxq5du7SqCBAgfgQRYQANpKam/uMf/1i3bt13331nSb799tvvvvvu8ssvr1mzplu/rKxs2rRpH3744YYNG1auXDlhwoSCgoIhQ4ZYrOmFhQsXjh492jCM2bNn//zzzytXrrzgggs+/fTTgQMHFhcX85p79uwZMWLEsGHD3njjjc8++ywmviHxzTffMMaOP/74UMh5EAoKCq6//volS5b88MMP33333aOPPpqZmXnDDTe8//77ts6hQ4fOPffc9evXjx49eu3atRs3bpw+ffrtt9/+1VdfaTnghalTp77zzjvnnXfep59+umXLlry8vNdee2348OE+TFnHmJaWdtxxx9nCoqKib7/9tmXLllb/JkkoKSnZvHlzrVq1jjnmGF4eCoVatWplmuYvv/zCy7t3726a5ieffJI8lwIEgEilVQIE4DBq1KhZs2Y999xzXbp0YYxZc2f+3//7f1B57dq1/J/du3evX7/+rbfe+txzz91+++2wSDgcvuWWWyzLVoDFGHvttdd69uy5cuXKuXPnXnPNNbbyvn37rrnmmv/+97+6R3H48OEVK1ZYPliBlI2YlF3nzp1POeWUM8888+GHHz777LMt4dNPP71hw4bBgwc/9dRTluSmm25ijN188826nkB8+OGHhmHMmzfPDovbt28/dOhQLSPhcHj16tXW0Y0cOTItLc3etXr16rKyso4dOybEWy8UFhZGIpFwOHz66afH7LIyrnv37uWFnTp1YoytXLly2LBhSXUsQIAYBBFhAD107NixS5cuL7zwQmlpaWlp6YsvvmhJFItfcMEFjLFVq1Z5KXzzzTebN28++eSTLU0LKSkpt956K2PMPcNea5Xe5ZdfnpWVlZWVlZ6efvbZZxcVFU2aNOk///mPvNQZZ5zRuHFj3mdrDcm///1vXm3MmDGZmZnqzkhQv3590zRj1hgo4o477rCOsXbt2j169Pjf//531VVXPfTQQ7yONSLrY62LFqwpoOFw+DcXrMi+tLSU17f8cY8WBwiQbAREGEAbI0eOLCgoWLJkydtvv7179+4rr7zSS/P333+/7rrrOnXqlJ2dbS1uO+mkkxhj+fn5XkXWr1/PGDvllFNi1mN069aNMRazJC4zM7NZs2bqnrdq1apbt24dO3a08oT169cfOHBgTEV//vlnbm5u9+7djz322FAoZLm9a9euPXv2mNH3EVpOdu7cmS9Yp06dE088Ud0ZCUaNGsUYGzRo0F//+td77rnniy++CIfDimVzcnK6devWuXPnFi1aWF4NHDiQDwdZNBSrV69eQrz1Qu3atRlj2dnZe1ywxkQzMjJ4/fr16zPpvREgQJIQpEYDaOOyyy677bbbnnvuuXA4XKNGjUsuuQSqbdq0qXv37rt37+7Ro8eoUaMaNGiQkpJSVFQ0depUSbN+4MABxljjxo1j5JaEX3zGGGvYsKGW51OmTLHTrfPmzbviiiuGDBmyfv16e6js8OHD/fr1++qrr9q0aTN8+PCGDRtaFDJjxoz8/PxIJJKSkmI5mZKSkpWVFWM/UTHWRRddVLt27enTp3/xxReffvrp5MmTmzRpcvfdd48ZM4YsO3bsWDtU/fDDDy+44IJLLrnkpJNO4hOhFgMl+4UydevWrVOnTn5+fnFxca1atfhd1st3mjZtygutS59seg4QwI2ACANoIzs7e/DgwW+//bZpmn/729+8Wv/p06fv2rVr2rRpVlbTwvfffz916lSJcSu7uGvXrhi5teQgppX0vYqfMXbZZZetW7du+vTpN9988/z58y3hq6+++tVXX51//vmL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6endu3cfPnx4y5Yt//SnPxUUFJR8kiUDv99/zTXXtG/f/vbbb69du/ayZcucLMePH1+pUqVJkyaVZHolDL/f37dv3w4dOgTOxooVK8Jttm7d2qBBg8svv3z48OEXXnhhfn5+yedZMigqKurTp0+nTp1GjBhRq1atzz77LMTA7/cPGjSoTZs2999/f5cuXbp3716OfykaApQNIty3b1+VKlX27dtnmuaXX35Zu3bt06dPh9h07tx5xowZpmnm5+c3bNhw5cqVMUi0RHDmzJm6deuuXbvWNM3MzMyqVav+9ttvITY7d+4MbOTn56enpy9cuLCksywprFq1KiMj4+TJk6Zpvv766x07doRm33//fceOHfv06VO+iXDlypUNGzYMcNvMmTM7d+4cbtO+fftnnnmmxFOLAZYtW9akSZNTp06Zpjl16tSuXbuGGOzatcvn8x05csQ0zTNnztSuXXvNmjUxSFQj1igb9cOlS5d27NixQYMGjLFu3bolJCR89dVXvEFWVtY333wzePBgxlhiYmLfvn0XL14cm1yjj6+//trn81166aWMsfT09M6dOy9ZsiTExnq+TGJiYo0aNc6ePVvSWZYUFi9efPXVVwcWRw8aNOi77747ePBgiM25c+dGjRo1bdo062FG5RWBsxGYpD148OBvvvkmKyuLN9i2bdtPP/105513fvnll5s2bTLL9Vy5xYsXX3PNNVWrVmWMDR48eP369fyDPhhjSUlJlStXPnXqFGPs7Nmz586dC3k3gEYFQdl4MW9mZmaABQNIT0/PzMzkDQ4cOJCYmGg9VCUjI+PHH38s0RRLEJmZmRkZGdZgRkZGxoEDB5yM33vvvby8vKuuuqqksitpZGZmnn/++YHtmjVrVqtWLTMzM+SBRC+88EL37t07duwYiwRLFJmZmW3atAlsp6SkVK1aNTMzkx9T37VrV82aNfv06dOkSZOtW7empqYuXbq0vN4fZGZmWk8qrlu3bnx8fGZmJk91devWfeutt/r06dO2bdstW7Y899xz1tnTqFAoG0RYVFTED2JXqlTp3LlzAoO4uLgQg/IE+YPdsGHDPffcs2DBgig9SKk0oKioiJ8YFf7d2L59+9y5c7/99tsSTy0GIM/GmTNnsrKy3njjjWuuuaawsPDCCy/8z3/+c9ttt5V4piWBkLMR/kspKCh4+eWXL7nkkr59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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOxdd3wU1do+s0kIgYQSSmjSg0oniICighSBC1dEwO5VQEGxI4qAooI0EQv3U9R7aQIqooAgIkVAuYKKgvTeQieBEAgJIdn5/hh35szuM6fMzKbO89sfbN55T5my5znPe8ooqqoSDx48ePDgobjCl98V8ODBgwcPHvITHhF6yB/MnTt3wIABO3bscD3n999/f8CAAadPn3Y9ZxtIT08fMGDAhAkTuJ5HjhwZMGDAtGnT8qBWtnHu3LnBgwcvWrQo3AWtWrXq4Ycfvv322++7776FCxcGHd22bdugQYM2bdoU7mp4KC5QPRQ/aC1IhQoVsrKyrHyaNm1KCFm6dKnDsr799tuPP/44PT09yP7EE08QQpYvX+4w/1B069aNELJ7926Gzw8//ED/CkqWLFmtWrVevXqtXLnS3cqcPHmSEHLTTTfplr1793788ce///57kKd2U/r27etuBRi44YYbuO3DmTNn6CTPPPNMVFTU/v37w1qxESNGEELKlSvXtm3bChUqEEL69+/v9/t1h+zs7Lp1695444200YMH24h0nVk9FHy0bNmyefPmW7ZsWbZs2V133RXq8Pvvv2/durVKlSp33HGHw7KmTJmydu3aLl26xMXF0fZrr722ffv2WjOXXyhXrpxGBjk5Ofv27Vu0aNHixYsnTZr04osvulVEdHR0+/btmzRpolt+/fXXQYMGvfrqq0E8FBcX1759+8aNG7tVNBc33nhjuXLl4KE9e/YkJyeXKlWqZMmSunHfvn0fffTRww8/XK9evfDVavHixePGjbvllluWLFlStmzZjIyMvn37Tp8+PSkpaciQIZpPVFTUiBEjBg4c+OWXX957773hq4yH4oL8ZmIP+YP33nuPEHLnnXfCo08++SQhZPjw4c4Lat++PSHk0KFDzrMShLgivPnmm3VLTk7Oa6+9RgiJioo6evRo+Kr32WefEUJeffXV8BXhEHv37i1XrpyiKJ9//jlt13jot99+C2vpjRo1UhRl7969uuXMmTMlSpRISEi4cuWKbszIyIiLi2vevHlYK+OhmMBThMUUDz744Msvv/zdd9+dOnWqSpUq9KHs7Owvv/ySEPKvf/1LN549e3b16tXHjx8vXbp027ZtmzVrRidJS0s7cOBAQkJCjRo1Dh8+/OOPP6ampvbq1Ss9Pf3ixYuEkG3btqWmphJCfD5fixYtCCHJyclnzpxJTEwsU6YMnVVGRsbatWsPHDigKEqtWrVuvfVWWrX4/f7Nmzfv2rXr1KlTZcqUueGGG5KSkly5IBEREa+//vrcuXMPHDiwcuXK/v37a/YLFy6sWrXqyJEj0dHRLVu2bN26taIoQWkPHTq0adOmY8eORUdHV61atW3btvolzcnJ+euvv2JjY6+99lpCyL59+w4fPkwIOXny5B9//KH51KlTJz4+/vLly7t27YqPj69Tpw6deVZW1o8//rhv3z5FURo1anTrrbdGRUXRDjt37szMzNQoYcWKFXv27ImNje3cuXPt2rVtXIeLFy/eddddaWlpw4cPp8XW5cuX586dm5iY2KpVK914/PjxU6dOafUnhOzevTsjI6NZs2aRkZG5ublbtmyJiYlp2LCheOnbtm3bsWNHq1atEhMTdWOlSpU6duz4/fffr1mzRg9RlCpV6q677po9e/amTZtEYrwePLCQ30zsId/Qp08fQsiUKVOC7BoL6mopNzd31KhR0dHR9GPTs2fPCxcu6Em++eYbQsgLL7wwYsQIn+/vGVgff/xx6PNWqlQpLQkcI/zPf/4TFCwtUaKE7rNhw4bKlSsHZdihQ4egcSx7ilBD9+7dCSETJkzQ/vzss8+Cgodt2rSh9WJubu7TTz8dRI2Konz77beaQ9AYYZcuXUKvydy5c1WLMcIff/yxRo0atHODBg3++OMP2kfrlGzevLlRo0a6W1RU1Icffsi4AhB+v197Krp06ZKTk0MfWrBgASHk+eefp42vvPIKIWTOnDnan23btiWEpKSkqKqalpZGCGnSpIlUBT766CNCyDPPPBNkf/XVVwkho0ePpo3agzp06FCpIjx4CIU3a7T44tFHHyWETJ8+Pcg+c+ZM/Sgh5MUXXxw7dmxiYuL8+fN37ty5bt26u+66a8mSJffdd19QwgULFnz00Ufjxo1bs2bN999/37p165UrV2rN9Jw5c1auXLly5cqlS5da1WfatGkDBw70+/1TpkzZvn37jh07Fi9e3K9fv6ysLM0hNTW1RYsWs2bN2rhx4969e1esWNG9e/c1a9bQytUhDh06RAjR9M3SpUsffvjhnJycqVOn7tmz57fffuvbt+/GjRs7deqUkZGh+X/xxRdTp05NSkpatmzZkSNHdu/evXz58sGDB5coUQLmP2HChOHDhxNCHnjggZUB3H777dB5+/bt3bt3P3ny5OjRo3fs2LF169Znn3127969nTp1Sk5ODnLu3bt37dq1v/vuu02bNo0fP15RlGeffXbfvn1Sp//6668vWLAgMTHxyy+/jIiIoA+tW7eOENKmTRupDGWxd+9eQkiQJiaENGjQgBCye/du2qhV5qeffgprlTwUC+Q3E3vIN+Tm5l5zzTWEEFphHD9+PCIionTp0prg++uvvxRFqV+//sWLF+m0Wtu9bt067U9NERJCVqxYEVSK1RhhkCJMTU2NjY0tUaLEpk2bxE8hJyfnpptuIoTs2bNHN9pWhP/+978JIREREfv37/f7/ddddx0hZN68ebqD3+/XTuftt9/WLAMGDCCErF+/3qqg0FmjVmOEoYqwZ8+eJEQGPf7444SQgQMH6hatq9GjRw96CuULL7xA11MEixYt8vl8cXFx27dvDz3aunVrQsjOnTtpo+uKUItI16lTp6UZWqT0jjvuCPIvX758REQEPXbowYMNeIqw+MLn8z344IMkIAE1zJ49Ozc3t2/fvtrQndbGPf/887GxsXRajcaWLVtGG5OSkjp37myvMt9+++2lS5fuvvvuli1biqeKiIjo0aMHIeT333+3UeiBAwcGDRo0aNCghx56qFmzZk899RQhZOjQofXq1du5c+fu3bvr1Klzzz336P6Korz88suEEJ34y5cvTwjZsGGDjdLZyMzMXL58eUxMzHPPPUfbtQosXLhQNe8J9eKLL9IRWi0GqwlcEezevfvhhx9WVXX69Ol0iFWHxuiVKlWSPA85ZGdnE0LOnDlz0IxTp07pR2lUrFgxNzf37NmzYa2VhyIPb7JMscajjz46YcKEuXPnvv3229oo4KxZswgVF928eTMh5H//+9/Ro0fphFrDpM370AEbUEH89ddfhJDmzZuz3dasWfPBBx/s2LHj2LFjmZmZuj0lJcVGoadOnfrkk0+079HR0TfddNOTTz75wAMPEEK0lf7NmzfXhzw1aDyt7wPw4IMPvv/++8OGDfvss8+6devWoUOH9u3bB42n2sPevXuvXr2amJgYNEhZt27d+Pj41NTU06dP07OctMk4OhISEkjgNnFx/vz5nj17pqenv/nmm9oYIfQhhATNbHIdpUuXJoR88MEH+mQlDcuWLfvHP/4R1BsjgY5Iampq9erVw1oxD0UbHhEWayQmJrZr1+7nn39eunTp3XffvWHDBk0G3XLLLZqDFuD67rvvgviAEKJFpWhLxYoVbdckPT2dEFK1alWGz+zZsx955JFSpUp17dq1T58+ZcuWJYRs2LBh8eLFOTk5Ngpt3br1999/TwiJiIgIauIvXbpECAmdm1OxYsWIiIhLly6pqqooSrNmzX755ZfXX3991apVW7dunThxYmxs7PPPPz9q1CirYUJBWFWAEJKQkHDu3Ln09HSaCEuVKkX7aPdLFdhJ2O/3P/jgg/v377/zzjtHjRpl5RYbG3vx4sWMjAyH58WGdkbHjh0Lsh8/fpygx0ObkxxuevZQ5OERYXHHo48++vPPP8+cOfPuu+/WYqQDBgzQg2xaH3zx4sW33XYbN6vQdQXi0HTPiRMnrBz8fv/LL78cHR29ceNGetX56NGjFy9ebK/QyMhITVKEQlv+f+bMmSD72bNnc3NztWV2muWGG25YunRpRkbG//73vxUrVkyfPn3MmDE5OTnjxo2zVyt2BUhA52n9AOd4+eWXly1bdt11182ePZtxBytVqnTy5Mnz58/TV0zrCemzmWhoej0yUq6F0XYeOHjwYJB9//79hJDQ3QY0nRrugK2HIg9vjLC4o1+/fnFxccuXLz906ND8+fN9Pt9DDz2kH9XW/P3yyy+289cWvXEVm1aQvrQuFKdPnz516lSTJk2CWsM///zTdt0Y0ErZvHlzbm4ubdcGI0ODwKVLl+7SpcvkyZO1SYzaYgMIwQvSoEGDEiVKHDx48Ny5c7R9375958+fr1SpEhSLsvj666/feeed8uXLL1myhK2rNIrSZnXq0OoARyI16pKtZMeOHUuUKLFs2bKg67NkyRJCSNA+R2lpaWfOnKlXr54WUPXgwTY8IizuKF26dN++fXNycu677760tLTOnTvXrFlTP/rII48oivLBBx+EarXc3NzLly9z869WrRpBwa4g/POf/yxbtuyiRYs2btwIHbRI7IkTJ65evaobf/311++++45bBxu4/vrrGzdufPjw4S+++EI3+v3+iRMnEkL69u2rWbQAJo2qVasqinLlyhWrnLXRrND1D0EoWbJkjx49srKytD2AdIwfP54Q0qdPHyf6W8OWLVsefvhhRVHmzp1bv359trMWEvj1119pozaHdv78+aHX4d1339VTadi4ceMnn3yyfv16RinlypW75557zp49+9VXX+nG1atX79q1q2PHjtoiCh2//vqr3+8XiVV48MCGFxr1QB599NHp06drbZw+TUZD06ZNX3nllXHjxrVq1erFF19MSkoqX768tpHKrFmzZsyY0bFjR3bmrVq1mjVr1pAhQx566KH4+PjIyMigeRAaypQp88EHHzzyyCNdunQZPnx4586dtc2d58+ff++99/bu3btkyZJt27Zdv379fffdN3To0PLly69du/bVV1+tU6dOaCTNFUyZMqVr166PP/74qVOn7rjjjtTU1ClTpvz8888NGzbU1jAQQvr06RMZGdm3b9/ExMSKFSseOnRo/Pjxqqr269fPKttGjRrFxMQsWLCgcuXK9erVi4yMvP322yEPjRs37ocffnjrrbeys7P79et39erVGTNmzJgxo2LFitoCcyfIzc3t1avX5cuXa9WqtWjRIqsXSjzxxBPaDKZu3bpFRkauXbt29OjR+tEmTZo88MADc+fO1ebcaoHKefPmLVmyZOXKlXXq1Bk8eLDuvGDBgnfeeefJJ59s164do2JvvfXW8uXLBw4cmJKScsstt2zZsmXo0KGlS5eeMmVKkOfatWsJIf/4xz9sXgIPHnTk59oNDwUG2pq5+Pj4zMzM0KNTp04N3R07KSlJX1Wm7ywTmvbKlSsDBgzQp3Kwd5aZO3euNt1RR2xs7OrVq7Wje/fupQlDUZQhQ4ZMnTqVEDJ58mQ9Eyc7ywRBoyu6PrfffvuJEyd0h8cffzxoGCwiIuKxxx7TX+sRuo5QVdWvvvqqVq1aehLGzjL/+9//gjiyadOm27Zto320dYT0Rj+qqmqzcO+66y6rU6Pn3DKgrdPQcOedd/p8vqCNWLOzsydNmhQ01BodHT1w4MDTp0/TntqaS33XHgb+/PNPWvzVqFFj7dq1QT5+v7927dpVq1bNzs7mZujBAxuK6r2h3gMhZ86cuXTpUkxMjNW8zczMzA0bNmijQVWqVGnatKm2GF9DRkbG6dOny5Yty3ibhFaEoijaviFnz55NS0urXr160HTHrKysX3755cCBA1FRUdWrV2/Xrl1MTIx+NDs7WztasmTJdu3a1apVKz09PSUlpUKFCvrkkRMnTmRkZNSuXTtoT86g0zl5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AauOLLzW1U0U8oeh8EGVV4TETxiP/blz54YNG7Z+/frmzZsvWLBgyJAhBw4coGefREVFffrpp5ru2rRpU+vWrfv06VOrVi179RcBJsKNGzfWrl07fKXmDTi3rqj8niSW5nvIQxSTx88WCtyDWuzuRr6e8JIlS66//vrmzZsTQu66665Bgwb99ttvbdq00R3i4uL06GOLFi1iYmJOnz4dViLEgldnwdOnT2/bti18xXvw4MGDh4IOVZH+WOPo0aN169bVvkdERNSsWfPIkSNWzp999llCQkLQVtWuAytCVVUnTZo0efLklJSU6tWrHzt2jBAyZMgQVVU//PDDsFbIHuwsg8f5FJS+qltnJAPXzr2o9a8drWELQkF5wJygIN5fh0va2dkUbEjsrmHr9FRVfkG9ql69euWrr76ijfHx8dreZJcvXy5RooRuj4mJuXz5Msxn48aNw4YNW7hwoexadllgInzrrbfefPPNJ554Ij4+/tNPP9WMnTt3/te//vXee+/R51BQwFln7Kj1cbjmSvzXmHc/Qom1vHndcOfLRaBQ8G6WMzid3pVX55kf11P4XudH5SzKFP49Otp6IahM6QX1ubkkJycniAjr1KmjEWGVKlW2bt2q21NTU6tUqRKayebNm3v16jVr1izmanJ3AIgwJyfnnXfeGTt27EsvvbRu3TqdCJOSktLT048dO6ar2gIONv/J0FsY1qTzqcgdBnKxnuwq5X1bIVBioMJhqFz4z9etpzeMcPPRdX/ZrRScdYBcqorNLrtExMJW/n4iO1nGp5KYmJj58+fDoy1bthwzZkxOTk5kZOSpU6cOHz6sjRfS2Lp1a7du3T744IOgCaVhAiDCM2fOpKWl/eMf/wiya5tfp6amFmQihE+SRYfOGb1hJrPznNkqVAU298Cb6OGewnYE3h0MJ0PkGQcUveaeys9Zb4+/AQUb+RIocqk3icmvQGtcHe3atatXr95jjz32wAMPTJ48uV+/flWrViWEvPXWW/v27Zs5c+bZs2c7derUqlWrtLS0Tz75hBDSuXNnuCuLWwBEGBsbqyjK2bNng+w7d+4khFhtn+3BgwcPHooeVKKoqvQYIdth6dKl48ePf//999u2bfvSSy9pxmbNmmkxUlVV+/fvTwg5ePCgdigjI0O63jIARFimTJm2bduOHTu2devWSqDnkJGRMWLEiEaN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oaFdunT56quvUlJSCCFfffVV9+7dCSE33HDDrFmzSkpKatSo8csvv+Tm5nbs2BFWERISct999/nDeQkJCQkJhzD70FLFhAvOy3KOUaNGHTly5KGHHnr33Xfdbve6desIIQsXLly0aJH6tcbVq1c/8MADs2fPPnbs2Kuvvvrzzz83bNiQENKzZ8/ExMQhQ4bMmzeve/fu8+bN84d7EhISEhISKvxFhCUlJQsWLNi/f//VV1/997//PTo6mhCyb9++ffv23X///arMxo0bV65cGRsbO27cuKuuukotzMvLe/HFF48ePdq1a9cHHnjAwdoJCQkJCQkJPvxFhBISEhISEpUClWlfVAkJCQkJCZ8j9Mknnwy2D6LYsWPHl19+GRoaqo4meuPYsWOffPJJdnZ28+bN6c1LqyR++OGH9evXX758WVuOSaO4uHjr1q3bt2+/cOFC06ZNq/bCkrKysk2bNm3fvj02NjYuLs5M7MqVK1u2bAkNDa3aU0nLysq++OKLHTt21KlTx+xMCwoKNmzYsHv37tLS0sTExCr8eJSWln7++ec7duyIi4szuxrbt2//6quvzp4926xZsyp8KSRYUCoJJk6c2LJly7FjxyYkJCxYsMBb4PPPP69bt+7o0aOvv/76/v37u93uwDsZMLz++usJCQljx45t1arVo48+6i2QlJTUs2fPkSNHXn311X/+85+Li4sD72Rg4Ha7BwwY0KlTp/vvv79evXobN240k5w+fXpYWNjs2bMD6V6A4Xa7+/fvf/3116tX4/PPP/eWOXDgQKNGjfr06TNy5MhrrrmmoKAg8H4GBmVlZf369UtNTR09enTdunW//PJLDwG32z1kyJD27ds/+uijXbt27dmzZxV+UyQYqBxEeOLEicjIyBMnTiiKsn379nr16hUWFnrIdOnSZeHChYqiFBQUNG7ceNOmTUFwNCAoKiqKj4/funWroihZWVlRUVG///67h8yRI0fUHwUFBUlJSatWrQq0l4HC5s2bk5OTL126pCjKm2++2blzZyj2/fffd+7cuV+/flWbCDdt2tS4cWOV2xYtWtSlSxdvmU6dOj377LMBdy0I2LhxY7NmzS5fvqwoyoIFC7p37+4h8Ouvv4aEhOTk5CiKUlRUVK9eva+++ioIjkoEG5Ujf7hhw4bOnTs3atSIENKjR4+IiIhvvvmGFsjOzt6zZ8/QoUMJIdHR0f3791+7dm1wfPU/du/eHRIS0qtXL0JIUlJSly5d1q9f7yGj7S8THR1du3btK1euBNrLQGHt2rV/+ctf1MXRQ4YM2bt376lTpzxkSktLx44d+9prr2mbGVVVqFdDnaQ9dOjQPXv2ZGdn0wIZGRk///zzgw8+uH379n379ilVeq7c2rVrBwwYEBUVRQgZOnTozp076Y0+CCExMTE1atS4fPkyIeTKlSulpaUe3waQqCaoHB/mzcrKUllQRVJSUlZWFi1w8uTJ6OhobVOV5OTkH3/8MaAuBhBZWVnJycnaYEZycvLJkyfNhD/88MP8/Pybb745UN4FGllZWa1bt1Z/16lTp2bNmllZWR4bEs2ZM6dnz56dO3cOhoMBRVZWVvv27dXfcXFxUVFRWVlZ9Jj6r7/+WqdOnX79+jVr1uzAgQMJCQkbNmyoqv2DrKwsbafi+Pj48PDwrKwsmuri4+Pffffdfv36dejQ4aeffnruuee0qydRrVA5iLCsrIwexA4LCystLWUIhIaGeghUJYif7K5du8aPH79ixQo/baRUEVBWVkZPjPJ+Ng4dOvT2229/++23AXctCOBejaKiouzs7P/+978DBgwoKSm55ppr3nnnnVGjRgXc00DA42p4vynFxcXz58+/4YYb+vfv36RJk5dffvmOO+6QQWE1ROUgwsTERDoXmp2d7fHx+oSEhIKCgoKCAjVFlp2dXYV31E1MTDxz5oz2Z3Z2NvxAx3fffXfbbbctWbIkLS0tgN4FGvTVKCwszMvL83g2XnzxxdjY2Mcee4wQ8uOPP+bk5NSsWfOhhx4Kgq/+B301Ll++nJ+f73E11D/VR6JGjRo9evSowrkT+mrk5eUVFhZ6XI21a9eeOnXq66/nSD2OAAAOo0lEQVS/drlcQ4cO/e677955551HHnkkGM5KBBOVY4wwLS1t165d+fn5hJBDhw5lZ2d36dKFlL/qhJDk5OSUlJTPP/+cEOJ2uzdt2uSxzXdVQufOnc+fP3/w4EFCyKVLl3bu3KmebHFx8YULF1SZ77///pZbblm0aFH//v2D6av/0bt3702bNrndbkLIF1980bJlS/UbC5cuXVLHfkaPHv3YY4+lp6enp6fXr1//qquuuvbaa4PstN9AX43PP/88JSUlOTmZEJKfn69ejY4dO9arV+/IkSOq/C+//FKFP0nRu3fvL774Qrsabdq0UbPE+fn5hYWFpDxGVAUIIVeuXJFbWVVTBHu2jigGDx78pz/9af78+e3bt580aZJaOHny5FtvvVX9vWTJksTExOeff37o0KEdOnS4cuVK8Jz1OyZPnty2bdt58+alpaXdfvvtauHixYuvvvpqRVHcbnf9+vVbt249phzr168Pqr9+hJrfGzJkyAsvvJCUlPTWW2+p5bfffvs///lPD+EBAwZU7VmjV65c6dChw9ChQ1944YXExMQlS5ao5bfeeuvkyZPV37Nnz27Tps3LL7/8wAMPNGnS5Pz588Hz178oLi5u27btsGHDnn/++YSEhGXLlqnl/fv3nzZtmqIo+fn5rVq1uv32219//fWRI0fGx8efPHkyqC5LBAeVZou1kpKSt99++5dffklNTR08eLA6SPbtt99euHChb9++qsyWLVs2bdrUoEGDkSNHVuFRMUKIoiirVq3au3dvq1atRowYoU52+OWXX/bv33/HHXcoiuLxjbHU1NTrrrsuSM76HXl5eYsXLz5z5syNN97Yp08ftfCLL76IjY1VMwcaNm7cmJiYWIUjQkLIxYsXlyxZcubMmfT0dC0v8sUXX9SpU0dLoW/cuHHbtm2JiYn33HNP1d5e4MKFC0uWLMnJyenbt682RvDZZ5/Vr1//+uuvJ4Tk5+e///77x44dS0pKGj58eP369YPqr0RwUGmIUEJCQkJCwh+oHGOEEhISEhISfoIkQgkJCQmJag1JhBISEhIS1RqSCCUkJCQkqjUkEUpISEhIVGtIIpSQkJCQqNaQRCghgXH06NGlS5eqW5AQQj755JMdO3b4vJYPPvhg27ZtPjR44cKFpUuXeuxK74HMzMyPP/7YdhVut/ujjz46ffq0bQsSEhUKkgglgoMRI0a0bNnyb3/7G124efPmli1benxjK1jYsWPHyJEjc3Nz1T+nTJmyaNEin9cybdq0ZcuWwUPHjx9vWY6rr746PT198uTJ58+fZxvMzMwcOXLk/v37GTJjx45dt26dbZ9DQkJWrFgh9+SUqDKQRCgRHJw6dero0aMLFiz4/vvvtcKCgoKjR49qQViFwt///nf1g5cBQ0lJydGjR1NSUsaMGfPXv/41Pj5+zpw5PXr0YF+fhg0bzpgx4+qrrzYT2LJly8aNG6dOnerEt2nTpn344YfV5JseElUekgglgoYWLVo0bNjwySefZIu53e7s7Oy8vDwzAUVRTp8+7UEPeXl5Fy9epEvOnTtn9r2qs2fPcr9dPHbs2IEDB7JlPGyaRW+FhYXZ2dmCmzqlpaVNmjRpypQp77///lNPPZWRkUEHc6op+rzi4+OnTZvWqlUrM4OvvPJKWlpa8+bNhU8FoH379p06dVqwYIETIxISFQSSCCWChujo6GnTpq1evXrnzp1mMq+88kpycnJCQkJsbGxqauquXbu0Q3fffXe/fv3ee++9Ro0aJSYmPvPMM5s3b65bt+6GDRvS09NjY2Pr1KkzcODA/Pz8nTt3tmnTpn79+jExMdOmTdMs/PrrrzfffHN0dHSDBg2io6M7duy4efNmM0969+49YcIE9XezZs3qeqGsrEw9umjRoiZNmjRo0KBevXrt2rXbsmWLZqSkpOThhx+Oi4tLSEho3Ljx6tWrLV2xm266iRBy6NAhQsiXX37ZoUOH6OjohISEyMjI7t27qw4cOnQoMTHxyy+/hBZyc3PXrFkzePBgrWTgwIHqnyUlJXXr1n399dcJIRs2bKhbt25GRgbDmSFDhixfvrxihu8SEpYgiVAimHjggQdatmw5efJkeHTBggV/+9vf+vfvv3fv3s8++6y4uDg9Pf2XX35RjxYUFOzbt2/atGmzZs3auXPn0KFDS0pKcnNzx4wZ06dPnz179rz22mufffbZ/fffP3LkyMmTJ3/77bfjxo2bOXPmxo0bVQvnz59v06bNp59+evDgwc8//7xevXq33nrriRMnoDNnz57VvnK1ZMmSD8uxZMmS0NDQOnXqqN+AfeGFFx588MG77rpr7969u3btSklJ6d+//4EDB1TFSZMmLVy4cPr06T/99NO8efP+9re/0Z+W5OL3338nhDRs2DAvL2/QoEEpKSnffvvt4cOHN23a1K1bNzXELCkpOX36dFFREbSwbdu20tLSG264QSu5dOnSpUuX1N+5ubmq4pUrV3JzczVqh7jhhhsKCwvpromERGVFEL98IVGdkZ6e3r59e0VR1KkiGzduVBRlzZo1hJAvv/xSURS3252QkNCjRw9N5fjx4+Hh4WPGjFH/vO2221wu1549ezQBleEef/xxrWTQoEGEkE8++UT9s7S0NDExcdy4cdCl/Pz8qKiol19+Wf3z7bffJoRkZWWpf7Zt23bEiBEeKmVlZYMGDapdu/YPP/ygKMrFixdr1ar10EMPaQLFxcXNmjUbO3asoii5ubkRERHqbxWrVq0ihGhn5AH1q4H//ve/z58/f+rUqbVr1zZr1iw8PPzXX39VB+d27tzpraV+aHft2rXQ5jPPPEMIycvL00p69+7dt29fRVHU5PC8efMURVFD1Z9++gkaUXHy5ElNXkKiUqNyfKFeogrj//7v/55//vlJkyZpn9NScfr06dOnT0+ZMkUrady4cffu3b/++mutpEmTJtqnhTSo+UMVKSkpLpdLsxwaGtqqVSs65svJyVm+fPnRo0fVqCg8PFz7aK0IHn/88bVr165fv75Dhw6EkJ07d166dKlRo0abNm3SZJo1a/bTTz8RQg4ePFhcXDxkyBDt0K233qp+QouBp59++umnn1Z/N2rUaMWKFS1atIiLi6tdu/aYMWPGjRt36623in9c9+zZszVq1IiJiRE/RxWFhYXh4eH0d2vr1atHCLEU0UpIVExIIpQIMkJCQmbMmDFw4MCVK1dGRUVp5cePHyeEJCYm0sLJyckqqahQPzjugbi4OO13REREZGQkbTY8PFybF7N58+Zbb701MTExLS0tLi4uNDQ0LCyMMSvHA2+++ebcuXNff/319PR0tSQ7O5sQ8txzz3l86Lxp06aEEHVtX0JCglYeGhraoEEDdi2jR48ePnx4ZGRk8+bNk5KS1C9xxsXFrV+/fsqUKRMmTBg/fnz79u2nTp06fPhwrs9hYWFlZWVut1tN5IogLi7uvvvuy8nJ+e677xYsWKB91U+doRMeHi5oR0KiwkISoUTwccstt6SlpamjfVphzZo1CSFnz56lJc+cOUN/SFa8NYf4z3/+07Zt2x07dmhhmfhKwY0bNz744IPTpk0bO3asVqh+DnrVqlU33nijt4rKeTk5OVqJoijnzp1jV9SqVSuNaGn06NFj69atubm5W7dufemll+66667GjRv36NGDba1hw4Zut/vChQt169ZVS6Kjo7WxTw0FBQWEEPWyXLlyZdy4cSkpKRs3blRnnKoy6onAvoiEROWCnCwjUSHwzDPP/PLLL4sXL9ZKWrduXadOHXqpwLlz53bu3NmtWzdfVfrbb79de+21Ggvu3LlTWz7Pxs8//zx8+PDBgwdrSUsVN9xwQ40aNVasWAG12rRpExoaqk3VIYRs2bLFbFaLIOLi4m6//faVK1cqirJ7926ufOfOnQkh6jiiipSUlIMHD2rzZVTs2rWrRo0ajRo1IoRERESkpKQQQpKSkugFIT/88AMhpEuXLk78l5CoCJBEKFEh0LNnzwEDBnz66adaSVhY2KOPPrp+/fpnnnkmJyfn8OHDw4cPLy4ufvTRR31VaceOHVevXr1r167i4uKvv/565MiR0dHRXK2LFy/+5S9/SUxMnD59+m+//Xa0HISQhg0bTpw48Y033pg2bdqxY8cKCwsPHz78yiuvqAQfHx9/1113vfLKK++9915BQcG333770EMPRUZG2vB827Zt06dP//HHH4uKivLy8tQ1D506deIqduvWrVatWvRecXfddVd+fv6dd965Z88eQsjp06fnz5+/cOHCe++9V70aajLWGzt37qxfv37Hjh1t+C8hUaEgU6MSFQX/+c9/NmzY4Ha7tZKpU6fm5+fPmDHjiSeeIIQkJiauXLlSpLkXxJw5c2677TZ1LUHNmjXnzZs3b948rtbZs2fV6Tbt2rWjy0tLS0NDQ5999tlatWrNmTNn5syZannTpk1nz56t/l6wYEFubu7dd99NCImMjHz++edFavRGWFjYW2+9pcWjderUmTt3bu/evbmKUVFRd91113vvvafNQkpNTf3ss88mTZrUq1cvQsisWbMaNGgwZcqUSZMmMewoivLhhx+OHDnSYzRUQqIywqWIbW8hIREs5OfnHzx4MCoqqm3btj5vdsvKyn799ddLly61bt3aIxxUFMXtdms1ut1ul8tlFh55oKSk5ODBg0VFRcnJycnJyR5Hf/vtt5ycnKuvvrp27dpOnM/Kyjp58mTNmjVbtmwZERFBnxTjQh04cOCaa67ZsWNH165d6fKTJ08mJyc/8cQTTz31FPc0v/zyy/79+2dkZDjcoUZCoiJAEqGERLXDgw8+eOzYsQ0bNtCFJSUl4eHh8+bNE9lNu3fv3qmpqXPmzPGbjxISgYNMjUpIVDvMnTv31KlTttXdbvdbb72VlJTkQ5ckJIIIGRFKSEgQQojb7X7zzTdvuOEGdXMACYnqA0mEEhISEhLVGnL5hISEhIREtYYkQgkJCQmJag1JhBISEhIS1Rr/D9ATAkW1yw85AAAAAElFTkSuQmCC", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# --- Final Code to Generate 2D Color Plots of R(ψ,θ) and Z(ψ,θ) ---\n", + "println(\"\\n--- Generating data for 2D color plots ---\")\n", + "# 1. Define the grid in flux coordinates (ψ_norm, θ_new)\n", + "# This part is identical to the previous steps.\n", + "equil_control = plasma_eq.config.control\n", + "psi_norm_grid = collect(range(equil_control.psilow, equil_control.psihigh, length=equil_control.mpsi + 1))\n", + "theta_new_grid = collect(range(0.0, 1.0, length=equil_control.mtheta + 1))\n", + "# 2. Evaluate the `rzphi` spline to get the R and Z values.\n", + "println(\"Evaluating the 'rzphi' mapping spline...\")\n", + "fs_grid = JPEC.Spl.bicube_eval(plasma_eq.rzphi, psi_norm_grid, theta_new_grid)\n", + "println(\"Evaluation complete.\")\n", + "# 3. Transform the spline output to physical (R, Z) coordinates.\n", + "# This calculates R_grid[i,j] = R(ψ[i], θ[j]) and Z_grid[i,j] = Z(ψ[i], θ[j])\n", + "rfac_sq = fs_grid[:, :, 1]\n", + "eta_term = fs_grid[:, :, 2]\n", + "theta_new_mesh = ones(length(psi_norm_grid)) * theta_new_grid'\n", + "eta_grid = 2.0 * pi .* (theta_new_mesh .+ eta_term)\n", + "rfac_grid = sqrt.(max.(0.0, rfac_sq))\n", + "R_grid = plasma_eq.ro .+ rfac_grid .* cos.(eta_grid)\n", + "Z_grid = plasma_eq.zo .+ rfac_grid .* sin.(eta_grid)\n", + "println(\"Calculated R and Z grids.\")\n", + "# 4. Create the 2D color plot for R(ψ,θ)\n", + "println(\"--- Plotting heatmap for R(ψ,θ) ---\")\n", + "p_r_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " R_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Major Radius R(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"R [m]\"\n", + ")\n", + "display(p_r_heatmap)\n", + "# 5. Create the 2D color plot for Z(ψ,θ)\n", + "println(\"--- Plotting heatmap for Z(ψ,θ) ---\")\n", + "p_z_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " Z_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Vertical Position Z(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"Z [m]\"\n", + ")\n", + "display(p_z_heatmap)\n", + "println(\"\\n2D color plots for R and Z have been saved.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9859d659", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Plotting Psi and Theta Contours in R-Z Space ---\n", + "Flux surface contour plot saved as 'flux_surfaces_RZ.png'\n" + ] + } + ], + "source": [ + "# --- Code to Plot Psi and Theta Contours in R-Z Space ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting Psi and Theta Contours in R-Z Space ---\")\n", + "\n", + "# 1. Select a number of contours to display for clarity\n", + "num_psi_contours = 11 # e.g., from ψ_norm = 0.0 to 1.0 in steps of 0.1\n", + "num_theta_contours = 13 # e.g., every 30 degrees\n", + "\n", + "# 2. Initialize the plot\n", + "# aspect_ratio=:equal is crucial for tokamak plots to look physically correct.\n", + "p_flux_surfaces = plot(\n", + " title=\"Flux Coordinate System Contours in (R, Z)\",\n", + " xlabel=\"R [m]\",\n", + " ylabel=\"Z [m]\",\n", + " aspect_ratio=:equal,\n", + " legend=:outertopright\n", + ")\n", + "\n", + "# 3. Plot contours of constant ψ (flux surfaces) in blue\n", + "# We loop through the ROWS of the R_grid and Z_grid matrices.\n", + "psi_indices = round.(Int, range(1, stop=size(R_grid, 1), length=num_psi_contours))\n", + "\n", + "for i in psi_indices\n", + " # Each row corresponds to a single psi value\n", + " # We must add the last point to the start to close the loop for a smooth plot\n", + " R_surface = [R_grid[i, :]; R_grid[i, 1]]\n", + " Z_surface = [Z_grid[i, :]; Z_grid[i, 1]]\n", + " plot!(p_flux_surfaces, R_surface, Z_surface, label=\"\", color=:blue, linewidth=1.5)\n", + "end\n", + "\n", + "# 4. Plot contours of constant θ (angle contours) in red\n", + "# We loop through the COLUMNS of the R_grid and Z_grid matrices.\n", + "theta_indices = round.(Int, range(1, stop=size(R_grid, 2), length=num_theta_contours))\n", + "\n", + "for j in theta_indices\n", + " # Each column corresponds to a single theta value\n", + " plot!(p_flux_surfaces, R_grid[:, j], Z_grid[:, j], label=\"\", color=:red, linewidth=1)\n", + "end\n", + "\n", + "# 5. Add a legend manually (a common trick in Plots.jl)\n", + "plot!(p_flux_surfaces, [], [], color=:blue, label=\"Constant ψ\")\n", + "plot!(p_flux_surfaces, [], [], color=:red, label=\"Constant θ\")\n", + "\n", + "# 6. Display and save the final plot\n", + "display(p_flux_surfaces)\n", + "println(\"Flux surface contour plot saved as 'flux_surfaces_RZ.png'\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2c625a4a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Plotting 1D Profiles from 'sq' Spline ---\n", + "Evaluating 'sq' spline on a dense grid...\n", + "Evaluation complete.\n", + "1D profile plots saved successfully.\n" + ] + }, + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdZ1wU59oG8PuZmaV3EUFRpGPBgmIPdhHFBrHFGGNJ1MQWjcbk9eSknFhycsyJmuaJJUZjL9i7QhQbdkFQkCYgSpMOO+X9sAkSbKgsC+z1/8TMPjt77/pzr33KzDBFUQgAAEBfcbouAAAAQJcEXRcAAPolLi4uJCQkISGhpKQkICBg6NChH3zwQWlp6ffff69pkJ6e/sknn7Rq1WrmzJm6LRX0BHqEoEcuXbrEyjEyMnJwcBg4cGBISIiuS9O9wsLC8h+OSqWqX79+jx49fvnlF1mWq+pVTp065e3tPWfOnF9++WXr1q3Xr18nog0bNqxbt66sTU5OzurVqw8dOlRVLwrwbOgRgt4xMTHp0qULEUmSdOfOnf379+/fv/+jjz5avHixrkurEfr06aP5Izk5OTQ0NDQ0dP/+/du2beO4Kvjd/O9//7uoqGjLli3Dhw8v29mtW7eSkpJXPzjAy2FYLAP649KlS+3atfPw8IiJidHsURRl+fLlM2fOZIxdvXrV29tbtxXqUGFhoampKRHJsswY0+zcu3fvsGHDRFHctm1bcHDwq7+Kl5dXXFxcSUnJM2I1JibGy8srICBg//79r/6KAM+FHiHoNcbYjBkzNmzYcP78+QMHDnh7excUFERHR1tbW7u4uNy7d+/w4cPp6ekBAQEtW7bUPOXevXvHjh1LS0uzsLDo1q1b8+bNKxxTkqTw8PC4uLiMjAxbW1tnZ+fOnTsbGBiUNSgqKgoLC0tISCgqKqpXr17z5s3btm1bFgzXr19Xq9U+Pj7lj5mXl3fr1i1bW1snJyfNnsTExIyMDA8PDzMzs7Nnz168eFGSpOnTp2uOoyjKhQsXLl68WFhY6OTk1LdvX0tLy5f4fAIDA994441169bt27cvODhYkqQrV64YGxs3b9784cOHBw8evHv3rq+vr5+fn6b9nTt3wsLC7t+/36BBgx49epRVS0RxcXE5OTkPHjwQBOHy5cuanT4+Poyxa9euybLcpk2b59Zz5cqV8+fP5+bmNmrUqF+/fvXq1XuJNwVQkQKgNy5evEhEHh4eFfa/9dZbRPThhx8qinL+/HkiGj58+LJly8rS67vvvlMURa1Wz549W6VSlf8fNGrUqIKCgrJD3b59+/FobNSoUVmDY8eO2dnZVWgQGBhY1qBJkyYqlapChSdPniSiCRMmlO2ZMGECEW3btq1nz55lxyktLVUU5ebNm+3atSt/fCsrq40bNz77wykoKNA0lmW5/P6FCxeWVZibm0tE3t7eISEhZck6depURVFKSkrefffd8v08nuenT5+uVqs1xxk8ePDj3z/FxcWKotSvX9/MzKzsFaOjo4koICCgfBmJiYllcathamr6448/PvtNAVQGeoQAdOfOHSKysbEp23P27Nl9+/Z99NFHfn5+HMdpvvQnT568evXqdu3aLViwwMvLKy0tbcmSJZs2bSKijRs3ap44ceLEqKio2bNnjx07tl69eg8ePLh27drevXs1jxYXF48cOTIvL+/bb7/19/c3MzO7e/fuuXPnEhMTX67y2bNnW1tbr169WjPkyBi7e/eun59fdnb2zJkzhw8fbmNjc+bMmfnz548ZM8be3r5Hjx6v/uGkpaW98cYb48eP9/f3t7KyUqvVRPTee++tWrXK29t7yZIlnp6ekZGRc+fOXb58uaIoy5cvJ6Ivvvhi+vTpw4cPLyoqKvtAKvyqeJqsrKzu3bsnJiZOnDhx7Nix9vb2Fy9e/Oijj6ZOnVq/fv0qGbMFvabrJAaoPk/sEWqSjIjOnz+v/NUjJKLVq1eXb/bHH38Qkbe3t6YToyFJkq+vLxFdunRJUZTS0lKO47y9vZ9WgObgb7311jOKfKEeoZ2d3cOHD8u3fOONN4jov//9b/mdZ8+e5Tiuc+fOz3jdJ/YIz549a2RkRES//fab8lePkIjmzZtX/rmaxZ8WFhb3798v25mcnGxsbMxx3O3bt8t22tnZmZiYVHjp5/YINedRfPLJJ+WfFR0dbWBg4O7uXqELC/Ci0CMEvZOenj558mQiKi4ujoqKioiIIKIJEyZoIk3DwcFBM15a5rfffiOiefPmGRoalu3kOG7KlCkXLlw4cOBA27ZtBUEwNTVNSUlJSkpq0qTJ4y9tZWVFRDdu3MjPzzczM3v19zJ16lQLC4uyzaKiou3bt1tZWU2fPr18s44dO/r4+Jw9ezYrK6t83+6JpkyZQkRqtTouLu7UqVOyLPv5+Y0aNaqsAWNs3rx55Z+yc+dOIpo4cWL9+vXLdjo6Oo4dO3blypU7d+6cO3fuS79HRVE2bNggCML8+fPL7/f09Ozdu/eBAwdu377t4eHx0scHQBCC3nn48OHKlSs1f6tUqvbt27/zzjuTJk0q38bT05Pn+fJ7NOs7jh8/fuPGjfL7NaOaCQkJRMQYGz9+/LJlyzw9Pf39/Xv16tW3b99mzZqVNXZzc/Pz8wsLC3NychowYEDPnj39/f0bNWr00u+lwnxkZGRkSUmJra3tJ598UqFlXl6eoihJSUnPDcKyD4fjOE9PzzfffHP27NmC8Oi7okGDBhVWqURFRRFR27ZtKxxKM1UZGRn5Am/pMUlJSRkZGdbW1l999VWFh+7du0dECQkJCEJ4FQhC0Duurq4XLlwgIsaYpov2OFtb2wp7cnJyiGjnzp1lpxaUsba2LlsksnTpUhcXl5UrV4aEhGjO02/RosXy5cs1S1oYY/v27fvyyy9///339evXr1+/njHWq1ev77//3tPT8yXeS4U6NUU+ePCgLMwq1FlaWvrcY2ZmZmreo5WV1eNv9vEXJaL8/HwienwRkGZPXl7ec1/0GTRvKi8v72lvShTFVzk+AIIQ9A7P89bW1s9u83gAaEYyjx8//ni/p8LBZ86cOXPmzMTExOPHj+/YsWPfvn0DBgy4cuWKJurMzMyWLFmyePHiqKioY8eOrV+//tixY/369YuKitKcxsdxnGbSq3wNZRN4z2Zubk5EPj4+Z86cqUz7J7K2tn5i/pV5/FHN66anp1fYr9lTfvD2JWgO7uTkFBsb+yrHAXgaXGINoFI0+RceHl7J9k5OTuPHj9+zZ8+0adOKi4v37dtX/lHGWIsWLWbMmHHu3Llu3bolJSVpOqlEZG9vL0lSZmZm+faascfnatGihYGBwZUrVyoZnFVFc5KlZi1SeZo39YqXKXBycrK2tr5z545mIBSgyiEIASpl/PjxRPTNN99kZGRUeEgUxeLiYiIqLS19fOzRwcGBiDSXENOccVj+UcaYvb19WQMicnZ2JqLyF1XJz8/XnIHwXGZmZsOHDy8uLv7iiy8ef1QzgKkNwcHBjLE1a9aU7xQmJiZu2LCB5/mgoKBXOTjP8+PGjVMURbNqtMKj2ntToD8wNApQKd26dZs2bdqKFSvat28/Z86ctm3bmpmZxcfHnz9//tdff929e3f79u3v3r3bqVOnt956y8/Pz8XFRVGUU6dOLV68WKVSDR06lIgOHDjw8ccfv/322+3atWvatGlBQUFISMiOHTscHBy6deumeaFRo0Zt3Lhx5syZBQUFrVq1io2NXbRokeYchsr45ptvQkNDv/7669jY2DfeeMPNzS03N1dzw4f09PTK92hfiKen59SpU3/44YeePXt+9dVXHh4eUVFR8+fPLy4unjNnTtOmTV/x+J999tnBgwfXrFmTkpIyYcIET0/PgoICzXViL1++rDndAuDl6e7MDYDq9rQry5RXdmWZxx+SZXnJkiUVrlXGGOvQoUNCQoKiKKmpqY6OjhX+i9nb2+/atUtzhBMnTjy+aLNFixaXL18u/0Jz5swpPw83dOhQTQfx8fMIjx079nidycnJAwYMqPAqFhYWc+bMecYbf9qVZcoru7LM4w+p1epZs2aVX1yqUqnmz58vSVL5Zi93HqGiKA8ePBgxYkSFK5SamJiU/0wAXg4uug16pKSkJCUlRaVSNW7c+NltTE1NGzRo8MQGBQUFZ86ciY+P53newcGhdevWDRs2LN8gNjY2KioqPT3d2NjYxcWlffv25S80Ksvy9evXY2NjNacEuLm5tW3b9vHlJzExMadPn1YUpW3btj4+PsXFxampqebm5mUn6j148CAvL8/BwcHY2PiJdSYkJJw7dy47O9vKyqpx48bt27cvfwbk4xRFiY+PJyIXF5entZFlOSEhwcDA4PG810hLSwsLC8vOzraxsenevfvjn2FiYqIsy5rh3zLx8fGyLLu6umo21Wp1QkKCqalphQ+WiFJTU8PDwzMyMszNzTVvysTE5BlvCqAyEIQAAKDXsFgGAAD0GoIQAAD0GoIQAAD0GoIQAAD0GoIQAAD0GoIQAAD0GoIQAAD0GoIQAAD0GoIQAAD0GoIQAAD0Wl0Lwn379kVERFSysSzLWi0GysPF/KqT5lLCuq5Cj+DLpDpV+add14Lw0KFDlb83dzXfvFTPFRYW4sui2oiiWHaDQ6gG+DKpTlX+ade1IAQAAHghCEIAANBrCEIAANBrCEIAANBrCEIAANBrCEIAANBrCEIAANBr+huEVzKV5nsMJ5+SEvJw3jEAgP7S3yDMU9O9YrYyWvbYKk4+JaUWIg4BAPSR/gbha/bsQv+St9w5hWhltOy+RfzkgpSr1nVZAABQvfQ3CInI1Vz5tTsfGSwMd+aKRFp0Vfbaqt4QK6NvCACgP/Q6CDU8LNmW3vzZIUJnO5ZWSG+elHrtE28/RBoCAOgFBOGfOtRnpwcLq/14O2M6maa03ikuuSqLuEY0AEBdhyB8hBGN9+Buvq5624MrFmn+BanzbjEyG11DAIC6DEFYkY0hrfHjDwUITmYsIkNpt0tcclWWkIYAAHUUgvDJ+jZi14KFd724UonmX5B67BPv4HRDAIC6CEH4VBYq+rkbf6C/0MiUnbqntN4hrorBnCEAQF2DIHwOf0d2PUgY5crlq2nSH1LQUSmjWNc1AQBA1UEQPp+1IW3syf/ek7cyoJ0Jcqsd6iMpGCYFAKgjEISVNdqVuxokdHdgaYXkf0Cce04qxUApAEDthyB8AU3M2LEBwlfteYGjb67LXXeLcbnoGgIA1G4IwhfDM/qkDfdHoOBsziIyFJ+d4qY4dAwBAGoxBOHL6GjHLg8TRrhwuWoafUKafEoqEnVdEwAAvBQE4UuyNKDNvfifu/HGAq2MljvtFmNweVIAgFoIQfhK3vXizg4WPC3ZtSzFd5f4O4ZJAQBqGwThq2plwy4MFUa7cnlqGnNCmnJKKpZ0XRMAAFQagrAKmKvo9578T914I55+jpa77BZjsZoUAKCWQBBWmcle3Nkhgrslu5yptN8l7kjAMCkAQC2AIKxKrW1YxFBhuDP3sJRePyrNOSepkYYAADUbgrCKWahoS2/+v514gaOl1+Ve+8W0Ql3XBAAAT4cg1IqZLbnQQMHRlJ26p/jsVIfdw5QhAEANhSDUls527NIwoXdDdq+Ieu8Xv72BQVIAgJoIQahF9Y3oUIAwvzUnyTT7rDTquJSv1nVNAADwdwhC7eIZLfLld/TlLVS0+Y7cebd4GxegAQCoSRCE1WGoE3d+qNDcit3IVnxDxN2JGCYFAKgpEITVxNOSnRvy55kVQ49I/7goyegZAgDUAAjC6mOmos29+a878Byjf12WAw+L2SW6rgkAQO8hCKsVI5rbijsUINga0YFkpUOIeCMbHUMAAF1CEOpA74bs4lChnS2LzVU67xa33MGUIQCAziAIdaOJGTs1SBjnzuWradRxaf4FSULPEABAFxCEOmPE09ru/LLOvMDRkqvywENiFqYMAQCqHYJQx6a34I4ECHbGdOgupgwBAHQAQah73R1YxFChnS2Ly1U67xa3xWPKEACg+iAIa4TGpuyPQGGsG5evphHHpAUROMsQAKCaIAhrCmOB1vXgv+3E8xx9dUUefFh8WKrrmgAA9ACCsGaZ1ZI71F+wNaJ9yUrHEDEGFyYFANAyBGGN06shOz9EaG3DYh4qHUPEvUnIQgAALUIQ1kTO5uz0YGGEC/ewlIYcERdewYwhAIC2IAhrKFOBNvXiF/ryRPR/EdLIY1KBqOuaAADqIgRhzcWIPm7N7e4nWBrQ1ni5624xIQ89QwCAKoYgrOkGNmbnhgieluxqluIbIp5MQxYCAFQlLQbhw4cPL168mJGR8Yw2eXl5BQUFFXamp6dfvHgxPz+//E5Zlm/cuBETE1P1hdZ4mnsZDmzMMoqp3wHxhyiccQ8AUGW0FYQhISGurq4zZ8709PRcvXr14w2+++47JycnCwuL999/v/z+ZcuWNW/efMaMGS4uLkePHtXszMrK8vX1HT169MCBA/v3719SoncX5bQ0oN39hPmtOVGm98OlyaekUqQhAEBV0EoQiqL4/vvvr1q16tSpUwcOHJg1a1Zubm6FNl26dNm9e/eHH35Yfuf9+/fnz58fGhp6+vTppUuXvv/++4qiENHSpUsdHR2vXbsWFRWVmZm5bt06bZRdw3GMFvnyG3ryxgKtjJb77BfvF+m6JgCA2k8rQXj69Gm1Wj1o0CAi6tChg7Oz8/79+yu08fX1bd26tUqlKr9z165dPj4+LVu2JKIRI0akpqZeuXKFiDZv3jxhwgTGmIGBwdixY7ds2aKNsmuF0a7cH4GCoyn7457SIUS8kokpQwCAV6KVIExKSmratCnH/XlwZ2fnpKSkSj7R2dlZ87eBgYGjo2NSUpKiKMnJyS4uLpr9Li4uzzhaQUFBTEzM0b+EhoZq+pR1STtbdmGo0KUBS8xXuu3BRboBAF6JoI2DFhYWGhoalm0aGxs/viKmkk/Mz88XRbG0tLRsv5GR0TOOdvfu3fj4+KioKM2mIAju7u4WFhZPbFxQUMAYq0xhNY0Z0W4/mhUhrI/nRxyTPmpR8om3VMPfSWFhoSRJZT+PQKvUarUkSaKIk0+rSe39MqmNXujTNjIyEoTnJJ1WgrBBgwZZWVllm5mZmfb29pV8YkJCQvknOjg4qFQqGxubsgM++2ienp6BgYHTp0+vzMspimJmZlaZljWQGdFvvandDfnDc9LiSOFWgcGv3Xkz1fOfqCuMMWNjYwRh9dAEoZGRka4L0Re1+suk1qnyT1sr30o+Pj63b9/WnDhRWlp6/vz59u3bV+aJ7du3P3v2rCzLRJSUlJSent6qVSvN/tOnT2vanD592tfXVxtl10azWnL7+wvWhrQjQe66R4zHGfcAAC9IK0HYpEmTwYMHv/3220ePHp04cWKrVq000fXrr7/26dNH0+b69esrV668fPnyrVu3Vq5cee7cOSLq1auXnZ3dlClTjh49On78+DfffNPW1paIZs2atWjRom3btq1evfrXX3997733tFF2LdWvETs/RGhuxa5lKb67xOOpyEIAgBegrXGqtWvX+vj4fPfdd/b29rt27dLsdHNz8/f31/z98OHDO3futG7d2s/P786dO5qRT8bYoUOHTExMvvvuu549e65YsULTuH///qtWrdq0adPRo0f37Nnj7e2tpbJrKTcLFj5YGNiYZZZQ/4PijzexfAYAoLJYHVtUOWPGDHd390rOEebl5Zmbm2u7pGojK/RJhLTkqkxEU5pxyzrzqpo0H1dQUIA5wmqDOcJqVse+TGq4Kv+08a1Ud3CMFvvy63vwRjz9dFPud0DMKNZ1TQAANR6CsK4Z48aFBgoNTdjJNKVDiHgju071+AEAqhyCsA7qUJ9dGMr71mfxeUqX3eLuREwZAgA8FYKwbmpowkIHCm+4cnlqGnZUwj3uAQCeBkFYZxkLtL4nv+ive9y/cUIqwmVGAAAegyCsyxjR/Nbc3n6CpQFtipO77BGT8tEzBAD4GwRh3RfQmJ0eJLhasCuZSqfd4tn7yEIAgEcQhHqhhTU7N0To1ZClFVLPfeK621g+AwDwJwShvqhnSIf6C+8354olGhcqzTsvSegZAgAgCPWKwNGKLvxP3XgVR/++Jg8+LD4s1XVNAAC6hiDUO5O9uCMBgq0R7U9WOu8Wbz9ExxAA9BqCUB91d2CXhgk+tuxmjtJxt3gkBVkIAPoLQainGpuy0IHCsKZcdgkFHBQ1l+oGANBDCEL9Zaai7X34xb68rND8C9I7f0ilSEMA0D8IQr3GiD5qzW3sxZsI9EuM3Hu/eL9I1zUBAFQvBCHQSBcuLFBwNGWn7ikdQsQrmZgyBAA9giAEIqJ2tuzCUKFLA5aYr3TbI26LxyApAOgLBCH8yd6Yjg8QxntwBSKNOCb98yJOuAcAvYAghEcMeVrtxy/txHOMvrgsv35UKsANKwCgrkMQQkUftOT2+QtWBrQjQe66W0zEDSsAoE5DEMIT+Duyc0MET0t2NUvx3SWG3UMWAkCdhSCEJ/OwZOeGCAGN2YNi6rtfXBmN5TMAUDchCOGpLA1oTz9hbiuuVKbJp6Rp4ZKINASAOgdBCM/CM/q6A7+uB2/E0/dRcr8DYkaxrmsCAKhSCEJ4vrFu3MmBQkMTdiJN6RAiXs/ClCEA1B0IQqiUjnbswlC+ox2Lz1O67BF3JGCQFADqCAQhVFZDE3ZyoDDWjctX0+tHpS8uy+gYAkAdgCCEF2DE07oe/L878hyjf16Uhh/DGfcAUOshCOGFfejN7fUXrAxoe7zcZbcYn4eeIQDUYghCeBn9Hdm5IYKXFbuWpXQIEU+kIQsBoLZCEMJL8rBkZwcLAxqzjGLqd0BcEYXlMwBQKyEI4eVZGtDufsJHrTlJpunhuMc9ANRKCEJ4JTyjxb78hp5/3uO+1z7xHu5xDwC1CoIQqsBoV+6PQKGJGTudrvjuEiMyMGUIALUGghCqho8tuzBEeM2e3S1QXtsjro/FICkA1A4IQqgydsZ0bIAwpRlXLNHYk9KccxJucg8ANR+CEKqSiqMfu/I/deMNOFp6XQ44KGaV6LomAIBnQhBC1ZvsxZ0YKNgb05EUpUOIeCMbHUMAqLkQhKAVXRqwC0OF9rYsLlfpvFvciYt0A0BNhSAEbXE0ZWGBwptuXL6ago9K/7rO4yrdAFADIQhBi4wF+q0H/5+OPMdo8Q0+6Jicq9Z1TQAAf4cgBK2b7c0d7C/YGCh7kpSOIWLMQ3QMAaAGQRBCdejTiIX6q1vZsOgcpWOIuDcJWQgANQWCEKqJsxmdGcSNdeMeltLgw+L8CxKmDAGgJkAQQvUx4unXHvwiX55jtOSq/PoxKQ9ThgCgawhCqFaMaH5rbq+/YG1IOxPkTiHiLUwZAoBOIQhBB/o7svNDhJbWLCpH6Rgi7ktGFgKAziAIQTfcLNiZwUKwM5dTSoMPi/+6jBlDANANBCHojJmKtvbmF/ryRPSPi1LwUUwZAoAOIAhBlxjRx625vf0wZQgAOoMgBN0LaMzODxG8bVhUjtIhRNyThAuTAkD1QRBCjaCZMhzhwj0spSGHpX9exFmGAFBNEIRQU5gKtKkXv6QDzzH64rI8+LCYU6rrmgBADwjaO7QoipGRkdbW1k2aNHlam7i4uKKioubNm3McR0SSJOXm5pZvYGJiYmhoqFar8/Pzy3aamZmpVCrtVQ66wojmteLa1mOjj4v7khXfXeLOvnxLa6brugCgLtNWjzAuLs7T03PixIkdO3acMmWKolQc5xJFMSgoqFevXm+88UabNm3u379PRAkJCa7l2NjY7Nixg4gOHjxoZ2dXtv/kyZNaKhtqgr6NWMRQoW09FpurdAoRN9/BlCEAaJG2gnDBggWDBg2KiIiIjIzcu3dvaGhohQZbt26NiYmJjo6+du1aixYtFi9eTESurq5Zf9m3b5+ZmVlgYKCmfceOHcse6tu3r5bKhhqiqTk7PUh4y50rEGnUcWnOOUlEGgKAdmglCNVq9Y4dOyZNmkRENjY2QUFBmzdvrtBm8+bNY8aMMTY2JqJJkyY93mD16tUjR440Nzcv25OSklJUVKSNgqEGMhbo1+78ii68iqOl1+W+B8T7+McHAC3QShDeu3evtLTUxcVFs+ni4pKcnFyhTVJSkrOzc1mDtLS00tJHSyMKCgq2bNkyceLEsj0RERHdunWrV6/e0KFDs7KynvbShYWFMTExR/8SHh7++Kgs1CLvN+dODBQcTOhkmtJ+l3j+Af41AaCKaWWxTEFBAREZGhpqNo2MjMovddEoLCw0MjIqa6AoSmFhoYGBgWbPli1bHBwcOnXqpNns1q1bZmamqalpTk5OUFDQ3LlzV61a9cSXTkpKSkhIiIqK0mzyPL927VoLC4snNn68KtCewsJCURQ1q6JeSCsTCuvLxoWrwh9wfnvFr9uqx7tK2qiwLlGr1ZIkqdW4VE81wZdJdXqhT9vIyOi5iyu1EoT29vZElJ2dbWtrS0RZWVmaPeU1aNCgrGOXmZlpbGxsZWVV9ujq1asnTZrE2J/LBa2trTV/WFlZzZo164MPPnjaS3t5eQ0aNGj69OmVLLX80CtoFcdxxsbGLxGERGRuTicH0YfnpGWR8swI1dVcw++78kZ8lddYd2iCsOy3JlQDfJlUp6r9tLUyNGplZeXm5nb69GnN5unTp9u3b1+hTbt27cLDwzV/h4eHt2vXruyhW7dunTt37s0333ziwVNTU8tyEfSHiqPvOvPre/AmAq2+JXfdIybkYZgUAKrAox7hunXrNMtbKiMyMtLd3f0ZDWbOnDl37lwjI6Pr16+fPXt27dq1RBQbG9u9e/ebN29aWFhMmTLF19e3U6dO9vb2n3322fLly8ueu2rVqoEDB5bvRC5dutTc3NzJySkqKuqLL7745ptvXuhNQp0xxo3ztmHBR6VLGUr7XeL6nkJ/R5xlCACv5FEQSpLUsGHDCRMmPPc5n3322XNXoLz//vsGBgYrVqyoV6/eyZMn69evT0Tm5uZBQUGa4VoPD48DBw6sWLGisLBw6dKlwcHBZc81MjKaO3du+aO5u7tv3759+/btjRo12rhxo7+//wu9SahLWt4AepMAACAASURBVNmwC0OFsSfFvUnKwEPiZz78grYcwhAAXhori7Q1a9asWbMmLCzsuc/hef7mzZseHh5aru1lzJgxw93dvZJzhHl5eRjWrzYFBQUvPUf4OIXoX5flzy5JskIDG7PfegjWhlVy4DoCc4TVDF8m1anKP+1HPcKuXbtq+m3PtXLlyscXvwBUJ0b0j7ZcRzs25oS4L1lpv0vc1odvWw89QwB4YY9+nnt4eJRdxuXZJk6c+LQTEgCqU79G7OJQwbc+u5OndN0jrrmFy88AwAvD3Segdmtixv4IFCZ7cUUiTQiTJv0hFeMkQwB4EX8Lwj179ri4uAQGBmouBHPmzJlhw4bpqDCAyjLk6adu/NruvLFAq2LkLrvFOzizAgAq7W9BOGXKlNmzZ7dp06Znz56JiYm6qgngJYxz584MFtws2OVMpf0ucW8SshAAKuXRYpmcnBxbW9tp06YRUfPmzXv37r1w4ULdFQbwwlrbsAtDhbdDpZBEefBhcX5r7sv2PI8FNADwTI96hBYWFvn5+ZqzKd54441//OMfU6dO1V1hAC/DyoB29uW/7sDzHC26KvfdL6bjnhUA8EyPeoQcxw0bNiw2NlZzyZhx48YVFxenpqbqrjaAl8GI5rbiOtqxUcfFE2mKz05xUy/+NXt0DAHgyf42R2hra5uSklK2OXny5M8//7zaSwKoAn727NIwVXcHllqo9NovfnNdxpwhADzR34Lwxx9/PHPmjK5KAaha9sZ0NED4qDUnyTT3nDTsiJRT+vxnAYC+wXmEUJcJHC325UP68daGFJIot9spXspAzxAA/gZBCHXfoCbcxaFCe9s/L0Dz001cgAYAHql4Y97IyMgdO3Y84wlBQUHarAdAK5zN2alBwuxz0g9R8tTT0h/3lJ+78WbPuW01AOiFikG4YcOGDRs2POMJz70BE0DNZMjT9134bg3Y5FPS73HypUxla2++pTVWkwLou4pB+NZbbw0fPlwnpQBUg9GunI8tG35Mup6ldAwRv+/Cv+2BCQIAvVYxCL28vCp5DwqAWsrTkp0bLEwLl1bfkseHSSfTlO+78qYV/ysAgL7Ab2HQR8YCrfLjf+3Omwj06225wy4xKgdj/gB6CkEI+ustd+78EKG5FYvKUTrsEtfdxmpSAH30tyCcPn16165ddVUKQPVrYc3ODxXecucKRBoXKo0PkwpFXdcEANXrbxMjH374oa7qANAVU4F+7c73dGDvh0trb8nn7ytbevMtsJoUQG886hGuX7++f//+lXmOlZVVbGys1koC0IG3PbjzQ4QW1iwqR+kQIq6KwTApgL541CNUq9X5+fmFhYXPfU5eXp4s42sC6poW1uz8EGF6uLT6ljzpD+l4qvJTN94cJ90D1HV/Gxo9ffq0qamprkoB0DkTgVb58T0asvdOS7/HyRcylM29+Lb1MEwKUJc9CsLOnTsvX768kk+zs7PTTj0AujfWjetQn408Jl3NUjrvFr/pyE9rjvXVAHXWoyD08vLy8vLSYSkANYenJTs7RJhzTvohSp4eLh1PVVa9xlsb6rosANAC/M4FeDIjnr7vwm/rzVsZ0M4Eue1OMTwdJ90D1EEIQoBnCXbmLg8TOtmxxHyl+z5x0VUZt7oHqGMQhADP0dSchQUK81pxskKfXJD8D4ppz19bDQC1BoIQ4PlUHC3pwB/oLzQwpqMpSpud6v3J6BgC1BEIQoDK6teIXQ1S9W3E7hdR4CFx9lmpFOfTAtR+z7n3THFx8bFjx9LS0iwsLDp37ty4cePqKQugZmpgTAf7C99clxdESN/ekEPvKRt78h6WONEQoBZ7Vo8wOjray8trxYoVZ8+e3b59e9euXVesWFFtlQHUTByjea24U4MEVwt2KUNpt0tccwsdQ4Ba7Fk9wn/96187duzw8fHRbBYVFfXs2XPKlCmCgHuYgr7rUJ9dHia8d1paHytPCJMO3lV+7sZbGei6LAB4cc/qEebl5TVr1qxs09jYuHHjxgUFBdqvCqAWMFfRbz34dT14cxVtuSO33SmexomGALXQs/p2gYGBgwcPfu+99xo1apSXl3f48OHc3FxLS8tqKw6g5hvrxnW2Y2NOSOcfKD32iQva8AvacjwmDQFqj2cF4TvvvGNmZrZmzZrk5GQrK6vu3btv2rSp2ioDqC3cLNipQcI/L0pLrsmfXZKOpMjre/BNzRGGALXDc2b7Ro8ePXr0aM3farW6MjdpAtBDKo4W+vJ9Hbm3Tkqn05U2O8UfuvJvuOL0JIBa4AX+o547d65evXqpqanaqwagVuvpwK4GCcHO3MNSGnNCevOk9LBU1zUBwPM8uUfo6en54MGDCjtzcnKICJ1CgGewMaRtvflfYtisM9KGWPl0urK+B9+1AYZJAWquJwfh2LFj8/PzyzZLS0uvX79+9OjRH374wc3NrbpqA6itJnlyfvZszAkpIkPpvlf8uA33aVtehYFSgBrpyUG4YMGCx3cuWbLkq6++mjhxooEBzpYCeA4PSxY+WPjnRenra/K/LsuH7yrre/DuuAYNQM3zAr9Rx4wZk5KScuPGDe1VA1CXaFbQnBgoNDVn5x8obXeK/4vGNWgAapwXCELN7KCNjY3WigGog16zZ1eGCWPduAKR3j0lDT4s3S/SdU0AUE5lgzA9PX3evHkTJkxo2rSpNusBqIMsDWhdD35TL97akPYkyd471HuS0DUEqCmeHISenp425VhYWNjb24eEhOzcubNs52+//VbNtQLUaiNduKtBQu+G7H4RDT4sTT4l5at1XRMAVHLV6BN5eXlpoR6AuqyxKTscIHwXKX9yQVoZLR9PVX7tznfByRUAOvUCq0YB4NVxjD5oyfVrxN48KV3JVPz2ivNacZ+14w1wcgWAjuA/H4AOtLBm54YI81tzRLToqtwpRIzMxp0rAHQDQQigGwYcLfLlQwMFF3N2OVNpv0v8z3VZRhoCVDsEIYAudW3ArgYJ73pxJRJ9eE7quU+Mz0MYAlQrBCGAjpmp6Odu/F5/wcGEwu4prXeI/4tGzxCg+iAIAWqEAY3Z9WDVCBcuT03vnpIGHhJTC5GGANWhYhAmJCRo7juhKEpERIQuSgLQU/UMaXMvfmNP3saQDiQrLbeLG2Jx3j2A1lUMwt27d3/++edEtHXr1q+//vpVDp2fn3/p0qWHDx8+rYEsyzdu3EhMTCy/J7ucoqJHl6JSFOXmzZtxcXGvUhJAzTfKlbsRrBrYmGWX0JsnpeCjuCQbgHZVDML333//woULUVFRX3311b///e+XPu6+ffuaNm36/vvvu7i4rFu37vEGqamp3t7eY8aM6dq169ixY2VZJqIHDx7Y2Ni4/mXZsmWaxtnZ2R07dgwKCurTp09gYGBpKe52CnWZgwnt9RdW+fEWKtqRILfcrt4Wj64hgLY8CsLS0tKjR4+eOHFi0KBBffr08fT0vH379tGjR9PT01/0oKIoTpkyZeXKlWfOnNm7d+/06dPz8vIqtPnyyy/bt29/9erVmzdvappp9qtUqqy/fPTRR5qd3377rZ2dXVRUVHR0dFpaGq7uBvpgggd3PVjo24g9KKbhx6TRJ6SMYl3XBFAXPQrC4uLirVu3bt269dKlS+np6cnJyZrN5OTkFz1oeHh4aWnp0KFDiahz585OTk779++v0Gbz5s3vvvsuEZmbm48aNWrz5s1lD2VnZ+fm5pZvvGnTpkmTJjHGDA0N33rrrfKNAeqwJmbsUIDwY1feTEWb4uSW29U7EtA1BKhijy6xZmFh8fPPPxPRuHHjVq9evWzZsmXLlhkaGr7EQZOSkpo2bcpxf6asi4tL+YlAIsrNzc3OznZxcdFsurq6hoaGav6WZblVq1bZ2dktWrRYu3Zts2bNFEVJTk4u3zgpKelpL11UVBQTE3P06FHNprGxcZcuXRjDtRyhtmJEU5px/o5sYph0Ik0JPiqNclWWd+ZtjXRdGUBdUfFao6dOnUpMTBw3btydO3f+85//fPLJJy9x0IKCgvIJamxsXOES3gUFBURkZPTnf2UjIyNNA2tr67t379rb25eWls6aNWvUqFFXr14VRbGkpOTxxk+UmJiYkJAQFRWl2eQ47tdff7WwsHhi4+deWByqUGFhoSiKZT+P4IXYEu3yo19u859eEzbFycdSpKU+6iGNn9o7VKvVkiSp1bi9RTXBl0l1eqFP28jISKVSPbtNxSBMT0/XrJH58MMPly9f/qL1aTRo0CA7O7tsMzMz87XXXivfoH79+hzHZWVlWVtbE1FWVpa9vT0RGRgYlP3x6aefOjg4ZGZm1qtXz8bGJisrS/PcssZP5OXlNWjQoOnTp1eyVHNz8xd8c/CSOI4zNjZGEL6K2T40zF2Z9Id0PJXGhhsMd+ZWdOHtjJ/QUhOEZT8foRrgy6Q6Ve2nXfFbKTg42NfXV/MyL9cdJKI2bdrcunVLE11qtfrChQvt27cv30AQhNatW4eHh2s2w8PD27VrV+EgqampgiCYmpoSkY+Pz5kzZ57RGEBPOJuzowOEH7ry5iraGi+33K7eFIdZQ4BX8uTbML2ipk2bBgYGTpgw4YMPPli7dm3z5s07dOhARL/99tuGDRsOHjxIRDNnzlywYIGtrW1iYuK+ffuuXr1KRDt37kxKSvL09MzIyPjqq6/Gjx+v+Uk7a9ast99+28XFJTc3d82aNWFhYdooG6BWYERTm3EBjuydU9LRFGX0CWnzHeWHrryDia4rA6idtBKERLR27dpFixYtXLiwefPmISEhmp1Nmzbt3r275u9x48YpivLDDz+Ym5sfPnzYycmJiJycnA4ePHjgwAFra+s5c+a8/fbbmsYDBgz48ccf16xZY2BgsGvXrtatW2upbIDaoqk5Oxwg/BItzz0v7UqUQ+/JSzvyb3tg5BnghTFFqVPXM5wxY4a7u3sl5wjz8vIwrF9tCgoKMEeoDXcLlCmnpH3JChH5O7Kfu/FOZgxzhNUMXybVqco/bXwrAdRujqZsr7+wvgdfz5AO3VVabhdXROG+hgAvAEEIUBeMceOiXleNcOHy1TQ9XOp1kKKfepVfAPibikG4atWqFi1aGBgYODo6Tpo0CSfHANQWdsa0uRe/qy/f0ISF36dO+/kvL8ulWFIK8Dx/C8I9e/ZMmjTpwYMH/fr1s7KyWrVq1eTJk3VVGQC8hCFOXOTrwkQPKpXo04tSu53i2fsYJwV4lr8F4dq1a11dXWNiYvbu3Xv9+vVp06Zt2bKl/L2QAKDmszKgHzvTwb6yuyW7ka103SPOPCPl4SIzAE/xtyCMi4sbPXq05movjLHJkyeLoljhMqEAUCv4NVCuDhM+bs3xjJZFyi23i3uT0DUEeIK/BWFOTo6NjU3Zpq2tLRGVXdsMAGoXY4EW+vIRQ4UO9VlSvjLosDjimJRWqOuyAGoYrBoFqONa2bDwwcJ/O/FmKtoaLzffpv45GudXADxSMQj/7//+z+YvXl5eRNS/f3+bcnRRJAC8Ep7RzJZc1OvCoCZcTilNOSW9tleMzEYYAhBVuMTawIEDHzx4oKtSAECrGpuy3f34bfFs5hk5PF1pu1Oc24pb0IY31taVFgFqh7/9D/j+++91VQcAVI/Xnbm+jbhPIqSfbsoLr8ib7ygruvD9HXHzatBfmCME0DuWBvR9Fz58kNDahsXlKgEHxZHHpdRCjJSCnkIQAuipjnYsYqjw7468qUBb7sjNtorLImUJaQj6B0EIoL8Ejj705qJeF4Y4cblqmnlG6hAinn+AMAT9giAE0HdNzNiuvvzufnxTc3YpQ+m8W5xySsou0XVZANUFQQgARESDmnCRwcL81hzP6Odo2XOreu0tnG0IegFBCAB/MhFokS9/NUjo4cAeFNP4MOm1PeK1LKQh1HEIQgD4m2ZW7PhAYX0P3t6YTqcr7XaJM89ID0t1XRaA1iAIAaAiRjTGjYserprVkiOiZZGy51b1utsYKYW6CUEIAE9maUDfduIvDhVes2fpRTQuVHptj3glE2kIdQ2CEACepZUNCw0U1v01Utp+l/h+uJSFNaVQhyAIAeA5GNFYNy5mhGq2N8cx+iFK9tii/vEmzr6HOgJBCACVYqGi/3TkrwYJvRuyzBJ677TUfpd46h7CEGo9BCEAvIBmVuzoAGFbb97JjF3JVPz2imNOSHcLEIdQiyEIAeCFBTtzN18XPvPhjQX6PU722ir+67JcJOq6LICXgiAEgJdhLNA/fbio14XhzlyBSP+4KDXfLm6Nl3VdF8ALQxACwMtzMmNbevMnBwpt6rGEPGXEMan7XvFSBkZKoTZBEALAq+ruwCKGCiu78XbGFHZP8Q0RJ4ZJ94p0XRZA5SAIAaAK8Ize8eJuDVd96M0JjFbfkt23qL+6golDqAUQhABQZSwN6N8d+cjXhaFOXL6aFkRIXtvE3+NwbTao0RCEAFDF3CzYzr78iYFC23osKV8Zc0LqFIIzDqHmQhACgFb0cGARQ4U1fnwjU3b+gfLaXjH4qHT7IeIQahwEIQBoC8fobQ/u1nDh83a8qUA7EuQW28WZZ6SMYl1XBlAOghAAtMtEoE/bcrdHqCZ5crJCyyJlty3qJVexjgZqCgQhAFQHBxP632v85WFCQGP2sJTmX5A8t4prb8lYSAM6hyAEgOrjbcP2+wtHAoS29VhygTI+TGq7UzyQjDAEXUIQAkB169OIRQwVfuvBO5mxa1nKgENiz33i+QeIQ9ANBCEA6ADH6E03Lma48J+OfD1DOpmmdAoRhx+TYrCsFKodghAAdMaQp9neXOxI1cetOWOBtsXLLbeL756SUnBfJ6hGCEIA0DErA1roy98eIUz24hjR/6Jl963ivPNSZomuKwP9gCAEgBqhoQn7qRsfGSyMdOGKRfr3Ndl1s/qLy3KeWteVQV2HIASAGsTdkm3qxV8cJvR3ZA9L6Z8XJdfN6m9vyMWSriuDugtBCAA1Ttt67EB/ITRQ6NqAPSim2Wclty3iTzflUtz3F7QAQQgANZSfPTs1SNjnL/jYspQCZeppyXOruOaWLCIOoUohCAGgRhvQmEUMFbb15ltYs4Q8ZUKY1Hy7uCEWl6SBKoMgBICajhEFO3PXgoT1PXgPS3b7ofLmSanldnFTHOIQqgCCEABqB47RGDcuMlhY48e7mLObOcroE1KrHeKWO4hDeCUIQgCoTQSO3vbgoocL/3uNb2rOIrOVkcelVjvQO4SXhyAEgNpHxdEkTy5muLCy259xOPqE1HK7uCFWlhCH8IIQhABQWxlw9I4Xd2u48L/XeGdzdjNHefOk1GybuPaWrMbKUqg0BCEA1G5lvcPVfrybBbv9UBkfJnluFVdGyyU4DR8qAUEIAHWBiqPxHtzN14V1PfhmViw+T5l8SnLdIv73hlwg6ro4qNkQhABQdwgcjXXjbgQLW3vzbeqxlALlg7OS8yb1V1fknFJdFwc1lRaDUJKkyMjItLS0Z7RJSkqKjo5WlL/NbqempkZGRhYXF5ftUavV2eWo1bgKLwA8FcfodWfu0jBhTz+hkx17UEwLIiSnjeqPL0j3inRdHNQ82grC+Pj4Zs2ajRkzpk2bNtOmTXu8gSiKI0eO7NKlS1BQULt27TIyMogoISHBw8PDx8dn1KhRDRs23LBhg6bxwYMH7ezsXP9y8uRJLZUNAHUGIwpsws4MFo4NEPo0YrlqWnxVdt6knnpaisvF0lJ4RFtBuGDBAn9//ytXrkRFRe3YsSMsLKxCg+3bt1+/fj0mJiYqKsrNzW3x4sVEZGho+Msvv9y7d+/69etr1qyZOHFifn6+pn3Hjh2z/tK3b18tlQ0AdU+vhuxIgHB+iBDUlCuV6aebsudWcdRx6XIm4hCItBSEarV6+/bt7777LhHVq1cvODh48+bNFdps2rRpzJgxpqamRPTuu+9u2rSJiBwcHPz8/DQNevbsWVJSoukpamRkZJSWYpgfAF6Gb322vQ8fGSxM8OB4RpvvyD47xX4HxKMpiEN9p5UgvHfvXklJiaurq2bTxcUlMTGxQpvExEQXF5eyBqmpqRVCbvXq1a1atXJyctJsRkREtGnTxsrK6vXXX8/JyXnaSxcXFycnJ1/8y5UrVypMQAKAPvOyYqv8+DsjhQ+9OQsVHUlR+h4Q2+4UN8Ti1EP9JWjjoAUFBURkaGio2TQxMcnLy3u8jZGRkeZvY2NjRVEKCwsNDAw0e06cOPHVV18dPnyYMUZEXbt2vX//voWFRWZmZlBQ0Lx581auXPnEl46Pj4+Ojj5y5EjZS2/ZssXCwuKJjcvGXaEaFBYWiqLIcVioXB3UarUkSVhW9jQWRJ82p5nubHUs/+Nt/komvXlSmn9emuIhjneVzIUX/vWML5Pq9EKftpGRkUqlenYbrQRhgwYNiCg7O9vW1paIMjMz7e3tH2+TnZ2t+TsrK8vIyMjS0lKzeerUqZEjR27durVt27aaPTY2Npo/6tWrN2fOnA8++OBpL92sWbPBgwdPnz69kqWam5tX9l3Bq+E4ztjYGEFYPTRBWPZbE57InOjTDvRRO9oQJ//nmhyVoyy4InwdKUz05Ka34JzN2YsdDV8m1ahqP22tfCtZW1u7uLicOXNGs3nmzJl27dpVaOPj41PWIDw83MfHR9P5O3v27LBhw9auXdujR48nHjwtLc3KykobZQOAHjLkaYIHd+N1Yb+/0Lshy1XTtzdk9y3i8GPS6XRMrOgFrfQIiWjGjBnz5s0zMTG5cePG6dOnV61aRUSxsbG9e/e+fv26hYXF1KlTO3To0LVrV3t7+88//3zp0qVEFB8fHxAQ0Lt377t372oGPwcPHmxvb//dd99ZWlo6OTndvHnz008/XbhwoZbKBgD9xIgCGrOAxsKVTOXbG/KmOHlbvLwtXvatz2a04Ea4cAYYy6i7tBiEgiB888031tbWx44ds7OzIyIzM7OAgADNcK2np+eePXuWL19eVFS0aNGiESNGEJFardb8cfHiRc1xevXqRURNmzbdsmXL/fv37e3t165dGxgYqKWyAUDPtanHfu3OL/blf7wp/XRTvvBAGXtSmndemtqMf9eLa2Cs6/pAC1gdW1Q5Y8YMd3f3Ss4R5uXlYVi/2hQUFGCOsNpgjrBKFEu0IVZeFilfy1KIyJCnEc7ctBZch/oVpw/xZVKdqvzTxrcSAMCTGfE00ZO7GiQcHygMa8qJMv0WK3cMETuGiL/F4tYWdQeCEADgOXo6sB19+NgRwtxWnI0hnX+gvHVSarxR/ckFKSm/Tg2q6ScEIQBApTQ1Z1934O+OVq3y431s2YNiWnRVdtksDj0iHb3HywjEWgtBCADwAowFmuDBXRwqhA8W3nTjBI5CEuWgUJX7FnHJVTkdd7eohRCEAAAvo7Md+60HnzxatdiXdzJV7uQp8y9ITTaqRx6XjqXWrVWIdR2CEADg5dU3oo9ac1cHluz3FwY7cZJCW+7IffaLHlvEJVdl3P6wVkAQAgC8Ko5RQGMW0pdPGCV83o5vYsZic//sIAYdlfYmKRJ6iDUYghAAoMo4mrJP23LxI4V9/kJQU46IdibIgw6LTTaKn1yQbj9EHtZECEIAgCrGMRrQmG3vwyePVi3pwHtastRCZdFV2XOr6LdXXH1LzsN9QWoSBCEAgLY0MKZ5rbjo4cIfgcIED85MRX/cUyaGSQ4b1ONCpeOpCk66qAkQhAAAWtfNnq3y41PfUK3x4/3sWaFI627LvfeLzpvF/4uQonOQh7qEIAQAqCZmKnrbgwsNFGJHCv/04VzMWVK+svCK3Gyb6LtL/O8NrDLVDQQhAEB1czFnn/nwsSOFsEDhHS/OyoAiMpQPzkqOv6v9D4jrbsu5mESsRtq6DRMAADwbI3rNnr1mzy/rzO9LktfHKgfuyodTlMMpktEpaWATbrQLG9CYM8b3tJbhAwYA0DEjnoKduWBnyi7ht8XLv8fJYfeU7fHy9ngyV0lDnLgRLqxfI86Q13WhdRSCEACgprA2pHe8uHe8uJQCZUu8silOPv9AWR8rr48lKwNpiBP3ujPXtxFDIlYtBCEAQI3TyJR90JJ90JK7k6dsvqNsuSNfyVR+vS3/elu2NKDAJlxQUxbgiFHTqoFPEQCg5nIxZx+3Zh+35m49VLbFK9vi5cuZyoZYeUMsmQhSQGNumBMb2ISzMtB1obUZghAAoBbwsGSftGGftOHicpXtCcr2ePnCgz/nEVWc1MOBDXHiBjVhTcyYriutfRCEAAC1iasFm9eKzWvF3S1QdiUquxLk0HvKkRTlSIo0LZza1mODmrBBTlw7W4ZIrCQEIQBAreRoyqY1Z9Oac1kltC9Z3p2oHLwrX85ULmcqX1yW7Y1pQGNuQGPW15GzUOm61poNQQgAULvZGNJYN26sG5VI/Mk0ZU+SvDdJScxXVt+SV98iFSd1a8ACGnP+jqyVDXqJT4AgBACoIwx58ndk/o78ii50PUvZl6wcSJbD7ysn0pQTadK889TQhPVzZP6NWJ9GnK2RrsutMRCEAAB1kLcN87Zh81tzOaV0JEU+dFc5eFdJKVDW3lLW3iKOSW3qsT4NWe9GXLcGzES/o0C/3z0AQF1nZUDDnbnhzkRE17OUQynKkbvyH+nKpQzlUoby9TXZkKdOdqxXQ66XA+tgxwz07xLUCEIAAH2h6SZ+6M0VS3TqnnI0VT6WolzKVELTlNA06Z9EpgJ1bcB6NOS62zPf+kylH6GIIAQA0DtGPPVpxPo04smXskso9J58PFU5kapEZiuaq37TX6HY3YHr7sA61OlQRBACAOg1a0Ma6sQNdSIiul9Eoffk0DTlZJoS9fdQ7NKA9XDgejZkvrZMqFuhiCAEAIA/2Rk/mlCsEIqac/aJyEJFPRpy/RqxgMbMxbwunI+BIAQAgCcoH4oPiik0TT6ZphxPVW7mKLsT5d2JREReVmyoEwt25trb1uJERBACAMBz1Dei1525152Jlojf+AAAHKdJREFUiFIKlCMpysG7yuEUOTpHWZyjLL4qu1uyce7cW+6ssWntS8S6NdALAABa1siUve3BberFP3hTdXygMK0519CE3X6oLIiQXDaLI49LZ+8ruq7xxSAIAQDgZfCMejqw5V34pNHCgf7CSBeOI9pyR+68W/Q/IF7NqjVxiCAEAIBXwjPq78g29eLjRwkft+asDelwiuKzU5wYJuWU6rq4SkAQAgBA1Whowhb68rEjVLO9ORVHq2/J3tvFIyk1vWuIIAQAgKpkY0j/6cjfCBa6NGB3CxT/A+L/RUg1OQwRhAAAUPXcLFhYoLDYl+c5WnhFHnlMKhJ1XdNTIAgBAEAreEYfteb2+wuWBrQ1Xu5zQMxV67qmJ0EQAgCAFvVtxMIHC03NWXi6MvCQmF/zshBBCAAA2tXcip0YwDcxY6fuKYMOi4U1bIwUQQgAAFrX1JwdH8A3MmUn05RxoTVr7QyCEAAAqoOrBTsSwFsZ0LZ4+Z8XJV2X8wiCEAAAqkkzK7aplyBw9K/L8qY4Wdfl/AlBCAAA1cffkf2nI68QTfpDisyuEUOkCEIAAKhWM1pw49y5ApFGHJMKasDCGQQhAABUt++78s2tWFSO8s4fup8sRBACAEB1MxVoax/eVKCNcfLaWzqeLEQQAgCADjS3Yj905YloWrgUlaPLyUIEIQAA6MZb7o8mC3V4lj2CEAAAdOb7rnwzKxaZrUwL19lkIYIQAAB0xlSgzb14E4HW3JJ/iNLNZCGCEAAAdMnbhq3rzjOiWWel0DQdTBYiCAEAQMeCnbk53pxappHHxYS86s5CLQZhYWFhZGRkXl7e0xooihITE5Oamlph/8OHDyMjI4uLiyvsv337dlJSUtUXCgAAura4A9+vEUsvon4HpfSian1pbQXhwYMHnZycxo0b17Rp099///3xBvfu3WvTpk1QUJCPj8+ECRNk+c+h4ZUrVzo7O2ueGBYWptn58OHDrl27DhgwoGvXrsOGDVOra979rAAA4BXwjLb1EdrZstsPlb4HxOyS6ntprQShJEmTJ0/+4YcfIiIiQkJC3nvvvfz8/AptvvzyS29v78jIyFu3boWGhu7fv5+IMjIyPvjgg2PHjkVERCxcuHDKlCmKohDRt99+a2lpGRMTc/v27YSEhPXr12ujbAAA0CFzFR3oL3hasutZiv9B8X519Qu1EoTh4eFFRUXBwcFE1K1bt8aNG2tyrrxNmzZNmTKFiCwsLEaNGrVp0yYi2rVrV6tWrdq2bUtEY8aMSUpKunbtGhFt3LjxnXfe4TjOyMho3LhxmsYAAFDH1DeiQwG8izm78EDpske8/bA65gu1EoSJiYnOzs4c9+fBXVxcEhMTyzfIzc3NyspydXXVbLq6umom/xITE93c3DQ7DQ0NHR0dExMTFUVJSkp6vPETFRcXJycnX/zL1atXq/zdAQCA9jiZsfDBQntbFperdN4tVsPdmgRtHLSgoMDQ0LBs08TEpMKSmYKCAiIyMjIqa5Cbm/u0J4qiWFJSUr7xMxbgxMfHR0dHHzlypKzxli1bLCwsntj48QFb0J7CwkJRFMt+HoFWqdVqSZIwm15t8GVStUyI9nRn488IB1P50SekDbfUn7dWu5v/2Tt8oU/byMhIpVI9u41WgtDOzi47O7tsMysry97evnyD+vXrcxyXnZ1tbW1NRJmZmZoGdnZ25fuOmieqVCpra+uyA2ZmZjZo0OBpL92sWbPBgwdPnz69kqWam5tX+m3BK+E4ztjYGEFYPTRBWPbzEaoBvkyqljnR/gH0S7Q897y0N4Xbm2LYpQELcORMBDJR+LH1TUyrLr608q3Upk2bW7duaaJLrVZfuHDBx8enfANBELy9vcPDwzWbZ86c0TTw8fE5d+6cZoFMSkpKWlqat7e3Zv+ZM2cqNAYAgDqMEb3jxd0IFiZ5cuYqCk9X/nFRmnNOmnpe9ePNqhwv1UqP0NnZOSAgYNKkSXPmzFm7dq2Hh0enTp2IaMOGDRs3bty7dy8RzZgx4x//+Ie9vX1iYuKePXuuXLlCRH369LG0tJw1a9aIESMWLlw4cuRIOzs7TeNJkyZ5eHjk5uauWbPmxIkT2igbAABqGkdT9r/X+O868zsT5P9v717DmrjSAACfcLNeSEISTAIBQe5FuVRZUKuAKLJWRYoKouVWC6vVlnWxtGJFq6j1Clrb3dauBR5hWVYtGIVQCiJsVawIKCwNELmTIBAIkRBIMvvjtPPkCRcjRSjkvL9mTs7MfJkM83Fmzsx5LMQG5OB5/8AW8/FMXq8kEQIAkpOTP/vss4MHD9rY2GRlZcFCFovl6uoKp8PDw+Vy+ZkzZ+bMmZOdnW1ubg4A0NLS4nA4hw8fjouLc3V1jY2NhZXXr1+fmJh48eJFPT29jIwM2K0UQRAE0RCzdMA2y18vYfb2yvTnEMZx5QR4HXLa+OCDD6ysrNS8R9jb24su60+Y58+fo3uEEwbdI5xg6GQykcZ9b2v0WSk3Nxd/ow3yqpWUlHR0dEx2FJqioaGhsrJysqPQFH19fYWFhZMdhQbJyckZ3xVqdCJ8//3329vbJzsKTZGYmFhUVDTZUWiKzMzMpKSkyY5CUzx58uTQoUOTHYUG2bZt2/g+GqTRiRCZYNPsOvwfGdrVCKI+lAgRBEEQjYYSIYIgCKLRpluv0bVr1/J4PBMTE3UqFxUVubq66unpveqoEABARUUFg8GAD4Yir1pjY2N/f7+1tfVkB6IRRCJRdXX1n/70p8kORFPk5+d7enoSCGo9QeHn57dr167R60y3RPjgwYPm5mY1e9Y+ffoUPr+ITIDW1lYKhYI69E8MkUg0MDBAo9EmOxCNIJfLW1paTE1NJzsQTfFSp25zc3N8zIaRTLdEiCAIgiAvBd0jRBAEQTQaSoQIgiCIRkOJEEEQBNFoKBEiCIIgGu1VjT7xRzAwMMDhcLq7u1etWsVkMoetc//+/aqqKkdHR+UxDkUiEYfDUSgUPj4+JBJpouKd8kpLS8vLy+3t7YftRy6RSIqKivh8voWFxbJly2Bhf39/cXExXsfS0tLMzGxiop3q/ve//927d2/+/Pnu7u5DP62pqVEe49rT01NbWxtOl5SUVFZWqhzzyOh6enpycnIIBIKPjw+RSFT5lMfj8Xg85RIPDw8dHZ0nT57w+XxYoqOj4+HhMTHRTnU9PT0VFRU0Gs3Ozm7YClKpNCcnp7e3d/Xq1crjtNfU1Pz3v/81MTFZuXKlmg9X/Aqbpvr7+11dXZcvXx4aGkqlUh8+fDi0zsGDB+fNmxcZGclisU6dOgUL+Xy+mZmZr6+vv78/i8Vqbm6e2MCnqpMnTxobG0dGRs6bNy8uLk7lU7lcrq+v7+HhERoaOn/+/PXr18tkMgzDGhsbtbW1V/0mNTV1EkKfglJSUgwNDSMjI+3s7Hbs2DG0QnR0tJmZGb5jJRIJLI+Li8OP+ZMnT05s1FNVc3Mzi8V6++23fX19zczM+Hy+SoXk5GR8V9vZ2RkYGAwMDGAYtnXrVhsbG1i+cePGyYh96omKitLT0yORSO+9996wFfr6+t544w0PD4/g4GAqlVpeXg7Lr127RqVS33vvPQcHh4CAgJfa6LRNhCkpKU5OToODgxiGffbZZxs2bFCp8OzZs5kzZ3K5XAzDysrK9PX1RSIRhmGffvqpv78/rLN9+/Z9+/ZNbOBTUk9Pj76+fllZGYZhNTU1M2fOfPbsmXIFhUJRW1sLp7u7u8lkcl5eHoZhjY2Ns2fPnviApzSZTGZqaspmszEM6+jo0NfXr6qqUqkTHR29f/9+lULlY768vHzOnDk9PT0TE/OUtm/fvqCgIDi9adOmAwcOjFJ527Ztu3fvhtNbt269cOHCK49vemlqapJIJH/7299GSoTffvuti4sL/E86NjZ28+bNGIYpFApbW9u0tDQMw3p6emg0WklJifobnbb3CNlstq+vr46ODgBg06ZN2dnZcrlcucIPP/xgY2NjZWUFAHB0dKTT6bdv3wYA3Lhxw9/fH9bx9/dns9kTHfoUVFhYSKfTHR0dAQCWlpa2trY//PCDcgUCgYA/00oikWbNmjUwMABnFQpFQUFBUVGRWCye4LCnqIqKCqFQ6OPjAwCgUqnu7u43b94cWq2trS07O7uqqgovycvLs7a2hse8g4MDk8mExzwyOjabjZ8TNm3aNMo5oaen5/r16+Hh4XhJQ0NDdnZ2XV3dK49yumCxWKO/doPNZvv5+cFL/fjPUVtbW1tb6+vrCwAgEone3t4vdeqetomwpaXF2NgYThsbGw8ODqqMuNTS0sJisfBZY2PjlpaWoQvCQmR0I+3MYV26dGnWrFn4/RJDQ8Nz58799a9/nT9/fkFBwasOdRpoaWlhMBj4Pb9h97a2tnZ1dfVXX33l4eHx1ltvSaVS8JI/E4JT/5xw5coVS0tLZ2dnOKunp1dSUvLFF18sXrw4JCQEQ28vGQ8qP4dEIunq6mptbaVSqTNnzsTLX+rYnradZeRyOT4YOjxlyGQylQrKd1N1dHRgBZUFVZZChjXSzhwqPz9///79N2/ehIessbFxfX09XPb06dPh4eFPnz6dmJinLpW9PexRGh8fDw/73t5eV1fXr776KioqSv2fCVGmvN9GPyf885//jIiIwGe//fZb+CsIBAJnZ+eMjIwtW7a86minvWHP7er8UYxi2rYImUwm3gQUCARaWloMBmOkCrCOkZHR0AVhITK6kXamiuLi4sDAwIyMDBcXF1iipaWFH75bt26tr68XCoUTEPCUxmQy4S1YOCsQCIZ2isbbi/r6+uvWrXv06BFQ+2dCVMAdDqdH2WmPHz+urKwMCgrCS/BfgU6nr1y5Ev4KyO+kcorW1dWl0WgMBqOrqwtPfsP+UYxi2iZCDw+P3NxcOJ2bm7ts2TJdXV0AgEgk6u/vBwCsWLGirKyso6MDANDc3FxTUwP79Ht6eioviHo8q2Pp0qW1tbVNTU0AgM7OzkePHq1YsQIA0N/fLxKJYJ179+75+fklJSUN290fAFBaWkokEslk8oSFPUUtXLiQQCA8ePAAACCVSgsLCz09PQEAAwMD3d3dQ+uXlpbC8ViWL19eXl4Oz+nNzc1cLhd/jgUZhfLJhMPh4OcE5TMvAOCbb77x8/MzMDAYugaZTFZeXo7eyj1mCoWis7MT/vPn4eHB4XBgeW5urru7u5aWlrW1taGhIbznLZPJ4PAUL7GB39vF54+qu7vb1NT03XffPXHihIGBQXZ2Nix3cXFJTEyE08HBwa6urgkJCc7Ozu+//z4s5HK5ZDI5JibmwIEDJBKpsrJycr7AVLNr1y5nZ+eEhAQ3Nzd4OwTDsISEBBcXFwzDxGIxiURycHCI+E1+fj6GYefPnw8LC/v888/37t1LIpHOnz8/iV9hComPj7e0tDx79qy3t7eXlxcszMjIMDIygtOrV6/ev3//iRMn1qxZY2xs3NbWBstDQkLgMf/GG2/s2rVrcqKfaiorK0kkUmxs7Mcff0wmk2G3WwzDZsyYUVBQAKelUimNRoN9oaHBwcElS5YcPHjw+PHjy5Yts7Oz6+3tnfjgp5ycnJyIiAgHBwdbW9uIiIjvv/8ew7D6+noAQGtrK4ZhnZ2dxsbGERERx44dI5PJP/74I1zw/PnzpqamZ8+eXb9+vZubm1wuV3+j03n0ifb29qSkJJFItGHDBvxaXGZmpqWlpb29PQBALpdfuXKlqqrKyclpy5Yt+HXnuro6+EBbYGAgGtFNTQqFIj09vby8/PXXX9+2bRu8KFRZWQm7ckml0qSkJOX6y5Yts7e3b2xsZLPZTU1NBgYGXl5eixYtmqTwp56srKy7d++amZmFhITAXnZPnz69e/cuvDSXm5tbUlIikUjMzMwCAwPxgcnwY97R0TEgIAA/5pHRcbncf/3rXwQCISgoCO//fPnyZR8fH3gJTiAQ3LhxIzw8HN+lGIZlZmaWl5fLZDIrK6uAgIAZM2ZM2heYOsrLy+/fv4/POjs7u7i4iMXitLS07du3w74FfD4/OTlZLBb7+voqnzRycnLu3LljbGwcGho6e/Zs9Tc6nRMhgiAIgrwQ+n8QQRAE0WgoESIIgiAaDSVCBEEQRKOhRIggCIJoNJQIEQRBEI2GEiGCIAii0VAiRJA/ory8PPxtJl1dXUlJSW1tbeO7ifb29q+//np8V1taWpqWljZ6nZ9++unhw4dj3kRjY2NmZuaYF0eQoVAiRDROR0eHhYWFhYXFjz/+qFz+4YcfLlmyZLKiUnH69Onjx4/D6YaGhtDQ0MePH4/vJng8XmRkJJfLHfbTCxcuWPzG0dFx48aNycnJL3zsOCMjY+fOnaNUaGlp8fb27unpGXPYRCIxNDQ0KytrzGtAEBXTdvQJBBmJXC7n8XgAgJiYmAcPHuBv/W5vb29oaJjU0IZnZGR05MgROI7ghBEKhTwe75NPPiGRSH19fTdu3AgJCfnll1/i4+NHWcrb25tKpY5S4dChQ05OTitXrhxzYGQy+S9/+UtMTMy6devQm3GQcYEOI0RDLV269OHDh1evXh29Wn9/P5/Ph+P5DUsqlfL5fOVhnzEMa29vx0ceBgDIZLLOzs5hFx8YGMBHNhgJnU4/cOCAubn56NWU18nn8yUSybCfdnZ24m9Cf6GdO3fGxMQcPnz4/v37CxYsOHfunPI3ffbsmUrbztPTMzo6eqS1dXd3p6amhoWFqbn1kYSHh1dXV6s06BFkzFAiRDTUunXr3N3dY2NjRxq3TCgUbtu2jUwmM5lMMpkcEhKCn/SfP39OoVAuXLgQGRlJIpGYTGZ1dfXOnTvd3NyysrJMTU3pdDqFQklISMAw7NixY1QqlUajmZiY3LlzB1//lStXHB0dX3vttblz586ZM2fz5s1wLJShnjx5wmQyCwsLAQAcDocyxI4dO2DN7u7u8PBwAwMDJpNJJBI3bdqknIC5XK6bmxuNRiORSF5eXs3NzervLl1dXS8vL4lE0tjYiGHYoUOHyGTy3LlzyWQymUzGm4nHjx+3tbUdaSXp6ekSicTPzw/OtrW1USgUeE8xLS2NQqHAPRAWFjbSECWQlZXVggULVN5eiyBjhi6NIprr6NGjy5cv/+677/BEglMoFBs2bHj06NH58+eXLFlSVFQUHR3d3Nycl5dHIBAwDBMKhUePHl2yZElmZqaOjg6Dwejr66uurv7kk08SExNZLFZCQsLevXsrKyt5PN61a9d0dXWjoqK2bt3K4/Hgy5f5fP6OHTsWL15MJpNLSko++uijd955Jzs7e2icg4ODeKt00aJF//73v/GP7t69e/DgQTqdDqv5+Pg0NTX9/e9/X7Ro0S+//BIVFbVhw4bi4mICgfD8+XMfHx+ZTJaVlWVmZpaWljb6zbyhGhoatLS05s6dm5qaevTo0XPnzq1evVoul1dVVeGNWpFIxOfzR1pDQUGBtbU1hULBd7JQKITfSyqVCoVCeA/y+fPnL2yzurm53bx586XiR5ARjd/oGQgyNcAz9bFjxzAMW7t2rZGRUV9fH4ZhgYGBTCYT1snLywMAXLx4EV/qzJkzAIDbt29jGNbb2wsAsLe3Vx7qJTg4GABQVlYGZ3t6enR1dRkMhlgshiWwF+idO3eGjQq2b+CgaxiGrVmzxsPDA06XlpYCADgcjsoiPB6PTqd7enpKpVIMw1JSUgAAxcXFeIX8/Hx8i5cuXVLZur+/P/6Nhjp8+DAA4PHjx11dXTU1NSdPniQQCCtWrMAwLCoqav78+cMu9fHHH5NIpGE/wjDMzs5u/fr1+Cxskl6+fBnDsMuXLwMA2tvbMQzbvHmzk5PTSCuBTp8+jddHkN8JXRpFNNqJEyf4fP6XX36pUl5WVgYACAgIwEsCAwMBAMrXNn19fVU6azAYDEdHRzhNJBIZDMabb76JDwcDh/SCwxdDDx8+jI+P3717d2Rk5Pfffw8AqKurUzNyOL4YlUq9du2anp4eAIDD4RCJRIlEkvcbqVSqpaX15MkTAMCjR48MDQ2XL1+OrwEmwtEtXLiQQqFYWVl99NFHXl5eqampAABnZ2cejxcYGMhms8VisZoBAwCePXuGNwdfytCtwC45+EjlCPJ7oEujiEZbuHBhQEBAfHx8eHi4cnljY+OMGTOUO0AyGAwtLS3lW27wgqQyldHJ9fT0lEtgusI70XzwwQcXL1709PS0trY2MDCAVwjVfK5gcHDw7bff7ujouHfvHplMhoUCgaCvr2/Lli3KNUkkklAoBAC0tLQwGAzlj4yMjF64odTUVENDQxqNZm5uTiKRYOH27dvb29u//PLL9PT0GTNmeHt7nz59Wp2RO3V0dJT72rzQ9evXExISTExM+vv7W1pa8vPz4XB0AIDBwUEAgK6urvprQ5CRoESIaLr4+PirV6+eO3dOuXD27NlSqVQkEhGJRFjS0dGhUCjwZAAAwJ+7GAOBQHDhwoVTp07hfSxv3bqlfu+P3bt3//TTTwUFBfPmzcMLSSSSoaFha2vrsIvQ6XTl8U6Bes2pN99808TERKVQS0srOjo6Ojqay+VyOJxjx479+c9/rq2tfeEOodPpyh2CYFu5r69PpZpYLMYznEQiSUlJIRAIwcHBHA5n48aNsByuZ+j/IggyBujSKKLpzM3Nw8PDz549q9zLw9XVFQCg3B2DzWYDAMbrifv6+noAgPLg2rdu3VJz2SNHjly6dOnKlSswSJy7u3tbW1tRUdGwSy1YsIDP55eXl+MlOTk5Lxu2Cmtr6z179sTGxvJ4PIFA8ML6Li4uFRUV+CyZTDY0NPz555+V6/T395eVleHPiixcuBDmVyMjI+XmeEVFhY2NjfL/JQgyZigRIgj49NNPMQy7ffs2XrJ27Vp7e/u9e/fm5ub29vbeunUrJibGyclp9erV47JFa2vrmTNnwuzb3d2dmJgIb7+90I0bN+Li4vbs2ePo6Mj7DWzbhYWF2djYBAUFXb16taurSygU3r9/PyoqCt53DAoKotFo8A01vb29//jHP174DOVITp48mZKS0tTUpFAo6urq/vOf/7BYLHUaZ6tWrWptbVV+a0FwcHBycvKJEydaWloAAKWlpe+8845AIIiIiIAVhm1lYhh29+7dVatWjS1+BFGBEiGCACMjoz179iiX6Orq3rx508LCYs2aNUQi8a233rK3t2ez2dra2uOyRQMDg2+++aawsJDJZBoYGHz99ddffPGFOguWlpZiGJaYmGih5MMPPwQAzJ49Oz8/39nZecuWLVQqlUKhLF269Oeff4b31SgUSlZWVmdnp4ODA5FIPHXqFOwHOwa9vb07d+40NTXV1ta2tLQUCoXXr19X50Lxxo0bDQ0N09PT8ZLjx48fOXIkISHhwIEDAAAfHx8ej8dms728vEZZz7179xoaGlRu6yLImBGwF708EEE0WUNDg0AgYDAYpqam475ysVhcU1Mza9Ysa2trlUSiUCgAAHivVLlcrn4O7urqqq2tnTVrlomJicrFQ5lMVlFRoaen9/rrr/+e95MNDg7W1dWJRCImk8lisfDgf+2MPvKa4+Li0tPTKysrlb8OhmFnzpzZt29fVVWVnZ3dC7f+7rvv8ni8goKCMcePIMpQIkQQZOKIxWIbG5vPP/98+/btyuXfffddWFhYe3u7oaHh6Guor6+3tbUtLi5evHjxq4wU0SCo1yiCIBNnzpw58J0DY14DhULhcrmvooGOaCzUIkQQZPJxudzbt28HBwe/9tprkx0LonFQIkQQBEE0Guo1iiAIgmg0lAgRBEEQjYYSIYIgCKLR/g/MnPQfKi1DrAAAAABJRU5ErkJggg==", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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3jVr1hw+fNjn8/Xu3Xvo0KEMw3z++ecHDhywWCw5OTnTp0/XaDQpKSmbNm1iGGbo0KF33313enr6r7/+WlBQMG3atOjo6KSkpKtXr/7zn//k6vz9998zMzOHDRsW0to+ffokJydzj61W65o1a44dOyYWix955JFHHnkk0J7//Oc/f/zxh1wuf+qppyIjI3fu3OlyuaZNm5aYmDh27Fifz/fZZ5/98ccfjRo1GjduXHR0NPc5REVF/fnnn4cOHZo/f37r1q3VavXu3bvvu+++WvncaxqCsH4IGSF3GbJ9RJuQp9w+d56tgEvHPHtBob2Y60oWOIrMLktFGSlgBHpZWKTSEC7Xc+kYoQg3yMPD5bpIZYRcJKuTtwVQFyweSrnm99ftQfvECAz/+99oxYoVH3744axZs3JycoYMGdK8efOQIDx9+rTH42ndunSic4sWLRYuXPjGG2+0b99eKCwdImCxWFJTUx9++GGfzzdnzpxr165NmTKlZcuWWq02MTExKSlJLBZ//PHHn3/++YwZM9xu99NPP7169eq2bdvGxcX5/f6kpCStVhsbG/vYY48NGjRIqVQS0Ztvvjl27NiybyE7O/vy5ctEpFarjUZjbm7u448/brVaX331VbPZPHToUJZlBwwYIBKJxowZ43Q6z54927x585iYGLvdnpSUFBERQUQjRozIzs6eOHHi/v37k5KSUlNTw8LCfv311127do0aNerRRx8Vi8VE1LNnz61btyII4QZJhJJ4TWy8JrbsUy6fO99WUOQozrcX5tsKCx3F+faCQntxoaOo2FHCTfkot065SBapjAiX67hoNMjDDQo916fUy8KwegDcWt495lvwZx3nID3TjP26z/8McJs/f/6KFSv69u1LRFeuXDl58mTIS86ePdu0adPA5rp1615//fW7775bKpUOHDhw7ty5sbGxOp1uwYIFLpcrLy9vypQpH3zwwZQpU3r27BkdHZ2cnPzUU0/5fL4333zzyJEjLVu2JCK327106dLvvvuuQ4cOAoHgqaee4irv2rXrunXrRo0adfbs2dTU1EGDBpV9CxMnTpTJZET02GOPzZ8//5133nE4HHl5eS+99NLatWuHDh26Z8+e1NTUixcvSqXSwKvatGljNpu5A6Wnp3///feZmZkGg+HRRx89fvz4F1988eqrrxJRnz593nnnncCrmjZt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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# --- Code to Plot 1D Profiles from the 'sq' Spline ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting 1D Profiles from 'sq' Spline ---\")\n", + "\n", + "# 1. To get smooth curves, we'll evaluate the spline on a dense grid,\n", + "# not just on its internal knot points.\n", + "psi_eval_grid = range(0.0, 1.0, length=200)\n", + "\n", + "# 2. Evaluate the 'sq' spline across this dense grid.\n", + "# Calling spline_eval with a vector input is efficient and returns a matrix\n", + "# where each column corresponds to one of the splined quantities.\n", + "println(\"Evaluating 'sq' spline on a dense grid...\")\n", + "evaluated_profiles = JPEC.Spl.spline_eval(plasma_eq.sq, collect(psi_eval_grid), 0)\n", + "println(\"Evaluation complete.\")\n", + "\n", + "# 3. Extract each profile into its own variable for clarity.\n", + "# Based on the direct_run implementation:\n", + "# Column 1: F = R*Bt (Toroidal Field Function)\n", + "# Column 2: P*μ₀ (Scaled Pressure)\n", + "# Column 3: Toroidal Flux function (related to dV/dψ_pol)\n", + "# Column 4: q (Safety Factor)\n", + "F_profile = evaluated_profiles[:, 1]\n", + "P_profile = evaluated_profiles[:, 2]\n", + "Flux_profile = evaluated_profiles[:, 3]\n", + "q_profile = evaluated_profiles[:, 4]\n", + "\n", + "# 4. Create and display the plots\n", + "\n", + "# Plot 1: Safety Factor (q)\n", + "p_q = plot(\n", + " psi_eval_grid,\n", + " q_profile,\n", + " title=\"Safety Factor Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"q\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_q)\n", + "\n", + "# Plot 2: Scaled Pressure (P*μ₀)\n", + "p_p = plot(\n", + " psi_eval_grid,\n", + " P_profile,\n", + " title=\"Pressure Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"P * μ₀ [T²]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_p)\n", + "\n", + "\n", + "# Plot 3: Toroidal Field Function (F)\n", + "p_f = plot(\n", + " psi_eval_grid,\n", + " F_profile,\n", + " title=\"Toroidal Field Function\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"F = R * B_t [T*m]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_f)\n", + "\n", + "# Plot 4: Combined plot for comparison\n", + "p_all_profiles = plot(\n", + " title=\"1D Equilibrium Profiles\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " legend=:best\n", + ")\n", + "plot!(p_all_profiles, psi_eval_grid, q_profile, label=\"q (Safety Factor)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, P_profile, label=\"P*μ₀ (Pressure)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, F_profile, label=\"F (Toroidal Field Fn.)\", linewidth=2)\n", + "# We can also plot the 3rd quantity, though it's less commonly viewed.\n", + "# plot!(p_all_profiles, psi_eval_grid, Flux_profile, label=\"Toroidal Flux Fn.\", linewidth=2)\n", + "display(p_all_profiles)\n", + "\n", + "\n", + "println(\"1D profile plots saved successfully.\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.11.6", + "language": "julia", + "name": "julia-1.11" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/equil_gfile_example.ipynb b/notebooks/equil_gfile_example.ipynb new file mode 100644 index 000000000..0421bb360 --- /dev/null +++ b/notebooks/equil_gfile_example.ipynb @@ -0,0 +1,267 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "814db625", + "metadata": {}, + "outputs": [], + "source": [ + "using Pkg\n", + "Pkg.activate(\"..\")\n", + "Pkg.resolve()\n", + "Pkg.instantiate()\n", + "using JPEC, Plots\n", + "gr() " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94c3d4e9", + "metadata": {}, + "outputs": [], + "source": [ + "# 1. Define the input parameters for the equilibrium solver.\n", + "# - eq_filename: The name of the g-file we just created.\n", + "# - eq_type: \"efit\" for a standard g-file.\n", + "# - jac_type: \"boozer\" or \"hamada\" for the output coordinates.\n", + "# - mpsi, mtheta: Resolution of the output grid.\n", + "\"\"\"\n", + " equil_control = JPEC.Equilibrium.EquilControl(;\n", + " eq_filename=\"beta_1.00\", # eq_filename\n", + " eq_type=\"efit\", # eq_type\n", + " jac_type=\"boozer\", # jac_type\n", + " grid_type=\"ldp\",\n", + " psilow=0.01, # psilow\n", + " psihigh=0.994) # psihigh\n", + "\"\"\"\n", + "#equil_config = JPEC.Equilibrium.EquilConfig(equil_control,JPEC.Equilibrium.EquilOutput())\n", + "# 2. Run the main equilibrium setup function.\n", + "# This will read the file, solve the direct problem, and return the final object.\n", + "println(\"Starting equilibrium reconstruction...\")\n", + "\n", + "\n", + "#plasma_eq = JPEC.Equilibrium.setup_equilibrium(equil_config)\n", + "plasma_eq = JPEC.Equilibrium.setup_equilibrium(\"./DIIID_example/equil.toml\")\n", + "println(\"Equilibrium reconstruction complete.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f61a9987", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Final Code to Generate 2D Color Plots of R(ψ,θ) and Z(ψ,θ) ---\n", + "println(\"\\n--- Generating data for 2D color plots ---\")\n", + "# 1. Define the grid in flux coordinates (ψ_norm, θ_new)\n", + "# This part is identical to the previous steps.\n", + "equil_control = plasma_eq.config.control\n", + "psi_norm_grid = collect(range(equil_control.psilow, equil_control.psihigh, length=equil_control.mpsi + 1))\n", + "theta_new_grid = collect(range(0.0, 1.0, length=equil_control.mtheta + 1))\n", + "# 2. Evaluate the `rzphi` spline to get the R and Z values.\n", + "println(\"Evaluating the 'rzphi' mapping spline...\")\n", + "fs_grid = JPEC.Spl.bicube_eval(plasma_eq.rzphi, psi_norm_grid, theta_new_grid)\n", + "println(\"Evaluation complete.\")\n", + "# 3. Transform the spline output to physical (R, Z) coordinates.\n", + "# This calculates R_grid[i,j] = R(ψ[i], θ[j]) and Z_grid[i,j] = Z(ψ[i], θ[j])\n", + "rfac_sq = fs_grid[:, :, 1]\n", + "eta_term = fs_grid[:, :, 2]\n", + "theta_new_mesh = ones(length(psi_norm_grid)) * theta_new_grid'\n", + "eta_grid = 2.0 * pi .* (theta_new_mesh .+ eta_term)\n", + "rfac_grid = sqrt.(max.(0.0, rfac_sq))\n", + "R_grid = plasma_eq.ro .+ rfac_grid .* cos.(eta_grid)\n", + "Z_grid = plasma_eq.zo .+ rfac_grid .* sin.(eta_grid)\n", + "println(\"Calculated R and Z grids.\")\n", + "# 4. Create the 2D color plot for R(ψ,θ)\n", + "println(\"--- Plotting heatmap for R(ψ,θ) ---\")\n", + "p_r_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " R_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Major Radius R(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"R [m]\"\n", + ")\n", + "display(p_r_heatmap)\n", + "# 5. Create the 2D color plot for Z(ψ,θ)\n", + "println(\"--- Plotting heatmap for Z(ψ,θ) ---\")\n", + "p_z_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " Z_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Vertical Position Z(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"Z [m]\"\n", + ")\n", + "display(p_z_heatmap)\n", + "println(\"\\n2D color plots for R and Z have been saved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cf8a3c1", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Code to Plot Psi and Theta Contours in R-Z Space ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting Psi and Theta Contours in R-Z Space ---\")\n", + "\n", + "# 1. Select a number of contours to display for clarity\n", + "num_psi_contours = 11 # e.g., from ψ_norm = 0.0 to 1.0 in steps of 0.1\n", + "num_theta_contours = 13 # e.g., every 30 degrees\n", + "\n", + "# 2. Initialize the plot\n", + "# aspect_ratio=:equal is crucial for tokamak plots to look physically correct.\n", + "p_flux_surfaces = plot(\n", + " title=\"Flux Coordinate System Contours in (R, Z)\",\n", + " xlabel=\"R [m]\",\n", + " ylabel=\"Z [m]\",\n", + " aspect_ratio=:equal,\n", + " legend=:outertopright\n", + ")\n", + "\n", + "# 3. Plot contours of constant ψ (flux surfaces) in blue\n", + "# We loop through the ROWS of the R_grid and Z_grid matrices.\n", + "psi_indices = round.(Int, range(1, stop=size(R_grid, 1), length=num_psi_contours))\n", + "\n", + "for i in psi_indices\n", + " # Each row corresponds to a single psi value\n", + " # We must add the last point to the start to close the loop for a smooth plot\n", + " R_surface = [R_grid[i, :]; R_grid[i, 1]]\n", + " Z_surface = [Z_grid[i, :]; Z_grid[i, 1]]\n", + " plot!(p_flux_surfaces, R_surface, Z_surface, label=\"\", color=:blue, linewidth=1.5)\n", + "end\n", + "\n", + "# 4. Plot contours of constant θ (angle contours) in red\n", + "# We loop through the COLUMNS of the R_grid and Z_grid matrices.\n", + "theta_indices = round.(Int, range(1, stop=size(R_grid, 2), length=num_theta_contours))\n", + "\n", + "for j in theta_indices\n", + " # Each column corresponds to a single theta value\n", + " plot!(p_flux_surfaces, R_grid[:, j], Z_grid[:, j], label=\"\", color=:red, linewidth=1)\n", + "end\n", + "\n", + "# 5. Add a legend manually (a common trick in Plots.jl)\n", + "plot!(p_flux_surfaces, [], [], color=:blue, label=\"Constant ψ\")\n", + "plot!(p_flux_surfaces, [], [], color=:red, label=\"Constant θ\")\n", + "\n", + "# 6. Display and save the final plot\n", + "display(p_flux_surfaces)\n", + "println(\"Flux surface contour plot saved as 'flux_surfaces_RZ.png'\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97a529f4", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Code to Plot 1D Profiles from the 'sq' Spline ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting 1D Profiles from 'sq' Spline ---\")\n", + "\n", + "# 1. To get smooth curves, we'll evaluate the spline on a dense grid,\n", + "# not just on its internal knot points.\n", + "psi_eval_grid = range(0.0, 1.0, length=200)\n", + "\n", + "# 2. Evaluate the 'sq' spline across this dense grid.\n", + "# Calling spline_eval with a vector input is efficient and returns a matrix\n", + "# where each column corresponds to one of the splined quantities.\n", + "println(\"Evaluating 'sq' spline on a dense grid...\")\n", + "evaluated_profiles = JPEC.Spl.spline_eval(plasma_eq.sq, collect(psi_eval_grid), 0)\n", + "println(\"Evaluation complete.\")\n", + "\n", + "# 3. Extract each profile into its own variable for clarity.\n", + "# Based on the direct_run implementation:\n", + "# Column 1: F = R*Bt (Toroidal Field Function)\n", + "# Column 2: P*μ₀ (Scaled Pressure)\n", + "# Column 3: Toroidal Flux function (related to dV/dψ_pol)\n", + "# Column 4: q (Safety Factor)\n", + "F_profile = evaluated_profiles[:, 1]\n", + "P_profile = evaluated_profiles[:, 2]\n", + "Flux_profile = evaluated_profiles[:, 3]\n", + "q_profile = evaluated_profiles[:, 4]\n", + "\n", + "# 4. Create and display the plots\n", + "\n", + "# Plot 1: Safety Factor (q)\n", + "p_q = plot(\n", + " psi_eval_grid,\n", + " q_profile,\n", + " title=\"Safety Factor Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"q\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_q)\n", + "\n", + "# Plot 2: Scaled Pressure (P*μ₀)\n", + "p_p = plot(\n", + " psi_eval_grid,\n", + " P_profile,\n", + " title=\"Pressure Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"P * μ₀ [T²]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_p)\n", + "\n", + "\n", + "# Plot 3: Toroidal Field Function (F)\n", + "p_f = plot(\n", + " psi_eval_grid,\n", + " F_profile,\n", + " title=\"Toroidal Field Function\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"F = R * B_t [T*m]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_f)\n", + "\n", + "# Plot 4: Combined plot for comparison\n", + "p_all_profiles = plot(\n", + " title=\"1D Equilibrium Profiles\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " legend=:best\n", + ")\n", + "plot!(p_all_profiles, psi_eval_grid, q_profile, label=\"q (Safety Factor)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, P_profile, label=\"P*μ₀ (Pressure)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, F_profile, label=\"F (Toroidal Field Fn.)\", linewidth=2)\n", + "# We can also plot the 3rd quantity, though it's less commonly viewed.\n", + "# plot!(p_all_profiles, psi_eval_grid, Flux_profile, label=\"Toroidal Flux Fn.\", linewidth=2)\n", + "display(p_all_profiles)\n", + "\n", + "\n", + "println(\"1D profile plots saved successfully.\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.11.6", + "language": "julia", + "name": "julia-1.11" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/equil_lar_example.ipynb b/notebooks/equil_lar_example.ipynb new file mode 100644 index 000000000..8277a1db7 --- /dev/null +++ b/notebooks/equil_lar_example.ipynb @@ -0,0 +1,5059 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "bc77cb03", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m project at `~/Desktop/JPEC`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/Desktop/JPEC/Project.toml`\n", + "\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/Desktop/JPEC/Manifest.toml`\n" + ] + } + ], + "source": [ + "using Pkg\n", + "Pkg.activate(\"..\")\n", + "Pkg.resolve() \n", + "Pkg.instantiate()\n", + "using DifferentialEquations,JPEC, Plots, DelimitedFiles" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8fb8cfd4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Forcing hamada coordinate jacobian exponents: power_*\n", + "└ @ JPEC.Equilibrium /Users/iseonjae/Desktop/JPEC/src/Equilibrium/EquilibriumTypes.jl:48\n" + ] + }, + { + "data": { + "text/plain": [ + "JPEC.Equilibrium.LargeAspectRatioConfig(10.0, 1.0, 0.001, 1.5, 2.0, 1.0, \"default\", 128, 128, false)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "equil_input = JPEC.Equilibrium.EquilConfig(; control=JPEC.Equilibrium.EquilControl(eq_type=\"lar\", eq_filename=\"lar.toml\"), output=JPEC.Equilibrium.EquilOutput())\n", + "lar_input = JPEC.Equilibrium.LargeAspectRatioConfig(; lar_r0=10, lar_a=1, beta0=0.001, q0=1.5, p_pres=2, p_sig=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d7836d02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Equilibrium file: lar.toml\n", + "--- Starting Inverse Equilibrium Processing ---\n", + "--- Equilibrium Setup Complete ---\n" + ] + }, + { + "data": { + "text/plain": [ + "JPEC.Equilibrium.PlasmaEquilibrium(JPEC.Equilibrium.EquilConfig(JPEC.Equilibrium.EquilControl(\"lar\", \"lar.toml\", \"hamada\", 0, 0, 0, \"ldp\", 0.01, 0.994, 128, 256, 0, 1.0e-7, false, false, true), JPEC.Equilibrium.EquilOutput(false, false, false, false, true, false, false, false)), JPEC.SplinesMod.RealSplineType(Ptr{Nothing} @0x0000000334f82500, [0.01, 0.010148181201467524, 0.010592635547055184, 0.011333095314084414, 0.012369114477279132, 0.013700068977434681, 0.015325157097327761, 0.017243399944640907, 0.019453642041610618, 0.021954552021043953 … 0.9820454479789561, 0.9845463579583893, 0.986756600055359, 0.9886748429026722, 0.9902999310225652, 0.9916308855227208, 0.9926669046859157, 0.9934073644529449, 0.9938518187985325, 0.994], [62.830366651502736 0.0004930704809030368 137.73806992066977 1.5104834926070352; 62.83034482525349 0.0004929677989738323 137.75220208788392 1.510639573383075; … ; 62.75886344741364 3.618352407563644e-8 271.26740766931823 3.0182438420917856; 62.758856325965404 3.4464087829602605e-8 271.29503075885367 3.018560875805857], 128, 4, 3, Matrix{Float64}(undef, 0, 0), [-0.14731386505900446 -0.000692948859997336 95.36686588086923 1.0532640152454746; -0.1472747625846012 -0.0006929479742368182 95.3748419349502 1.0533565111240768; … ; -0.047999268475538634 -1.1744237997935529e-5 186.40496167840752 2.139392264737093; -0.04820592251326161 -1.1462959309164222e-5 186.42318891539253 2.139603999742036]), JPEC.SplinesMod.BicubicSplineType(Ptr{Nothing} @0x0000000146f5fa00, [0.01, 0.010148181201467524, 0.010592635547055184, 0.011333095314084414, 0.012369114477279132, 0.013700068977434681, 0.015325157097327761, 0.017243399944640907, 0.019453642041610618, 0.021954552021043953 … 0.9820454479789561, 0.9845463579583893, 0.986756600055359, 0.9886748429026722, 0.9902999310225652, 0.9916308855227208, 0.9926669046859157, 0.9934073644529449, 0.9938518187985325, 0.994], [0.0, 0.00390625, 0.0078125, 0.01171875, 0.015625, 0.01953125, 0.0234375, 0.02734375, 0.03125, 0.03515625 … 0.96484375, 0.96875, 0.97265625, 0.9765625, 0.98046875, 0.984375, 0.98828125, 0.9921875, 0.99609375, 1.0], [0.006938588679652538 0.006938593227461729 … 0.006938593227461731 0.006938588679652538; 0.007041651885258585 0.0070416565363404125 … 0.007041656536340414 0.007041651885258585; … ; 0.9443138060739236 0.9443278432066816 … 0.9443278432066818 0.9443138060739236; 0.9445016821170662 0.9445157241982964 … 0.9445157241982967 0.9445016821170662;;; 0.0 2.5677628510667383e-17 … -1.1927703963578846e-17 0.0; 0.0 2.6756906461462007e-17 … -1.3337261012416624e-17 0.0; … ; 0.0 6.581117317722034e-19 … -2.7698868789211455e-18 0.0; 0.0 6.649592427791657e-19 … -2.7723192312761107e-18 0.0;;; 7.012880905489775 7.012870475560937 … 7.012870475560913 7.012880905489775; 7.0138485785701965 7.013838074480476 … 7.0138380744804545 7.0138485785701965; … ; 13.910221196367392 13.91022564416296 … 13.910225644163289 13.910221196367392; 13.911655818002695 13.911660272038215 … 13.91166027203854 13.911655818002695;;; 0.06897492585427768 0.06897516612612026 … 0.06897516612612002 0.06897492585427768; 0.06897601054296564 0.06897625261637984 … 0.06897625261637963 0.06897601054296564; … ; 0.11555309658765076 0.11555914652113271 … 0.11555914652113544 0.11555309658765076; 0.11556297780805631 0.11556902882876643 … 0.1155690288287691 0.11556297780805631], 128, 256, 4, 3, 2, [0.6954947343941501 0.6954954285732484 … 0.6954954285732405 0.6954947343941501; 0.6955482025555789 0.695548902241391 … 0.6955489022413934 0.6955482025555789; … ; 1.2678214657152787 1.267854857194524 … 1.267854857195262 1.2678214657152787; 1.2679380558341506 1.2679714538086273 … 1.2679714538069078 1.2679380558341506;;; 0.0 9.334834878351573e-15 … -1.1068954903862439e-14 0.0; 0.0 5.2996591755934056e-15 … -8.011597753735152e-15 0.0; … ; 0.0 4.2551145865267143e-17 … -1.5812178019005876e-17 0.0; 0.0 4.9883103323269766e-17 … -1.7019698592270845e-17 0.0;;; 6.536078314803149 6.535576047731411 … 6.535576047758809 6.536078314803149; 6.524643571346274 6.52414487505542 … 6.524144875061055 6.524643571346274; … ; 9.680791988567279 9.680834175876338 … 9.680834175842993 9.680791988567279; 9.68226070079595 9.68230273404447 … 9.682302734033783 9.68226070079595;;; 0.0071712390724503194 0.007183441184150041 … 0.007183441184531958 0.0071712390724503194; 0.007467994838512551 0.007480108759755595 … 0.0074801087597788215 0.007467994838512551; … ; 0.06667837966415305 0.0666857169536459 … 0.06668571695311361 0.06667837966415305; 0.06668817997225673 0.06669551698054477 … 0.06669551698029252 0.06668817997225673], [-3.193826666081801e-16 2.328245293758734e-6 … -2.3282452938134696e-6 -3.193826666081801e-16; -3.67227604978155e-16 2.3811155993148323e-6 … -2.38111559917819e-6 -3.67227604978155e-16; … ; -4.300148200483041e-14 0.00718634382180675 … -0.007186343821805272 -4.300148200483041e-14; -4.4650625789325695e-14 0.007188877212233721 … -0.007188877212225647 -4.4650625789325695e-14;;; 5.835294820408541e-15 5.509077591305376e-15 … 3.063846728156003e-17 5.835294820408541e-15; 6.2532971677229686e-15 5.560065240369238e-15 … 2.1906670867766967e-16 6.2532971677229686e-15; … ; 5.86498230783537e-16 -1.2913191573370145e-16 … 4.158419256120447e-16 5.86498230783537e-16; 5.884009497253667e-16 -1.2928717917101587e-16 … 4.155132483440011e-16 5.884009497253667e-16;;; 4.4073679890862154e-12 -0.005340046084755155 … 0.0053400460855429505 4.4073679890862154e-12; 4.025552749938506e-12 -0.005378016160434077 … 0.005378016160702767 4.025552749938506e-12; … ; -6.576393552990001e-11 0.002263232503943686 … -0.002263232493272723 -6.576393552990001e-11; -6.515123177642615e-11 0.0022664239681151406 … -0.0022664239571665084 -6.515123177642615e-11;;; 4.346927006716739e-14 0.00012301159346171726 … -0.00012301159345440594 4.346927006716739e-14; 3.8909748180960637e-14 0.0001239339431367036 … -0.00012393394313247046 3.8909748180960637e-14; … ; -5.471447947491548e-13 0.003097442982605891 … -0.0030974429825169647 -5.471447947491548e-13; -5.337812078916777e-13 0.00309799963213423 … -0.0030979996320454678 -5.337812078916777e-13], [-6.300882280491871e-13 0.00035538417659215207 … -0.0003553841747464938 -6.300882280491871e-13; 1.7119841801172915e-15 0.00035820333171992114 … -0.00035820333098227856 1.7119841801172915e-15; … ; -2.891031996545471e-11 0.017094903467280983 … -0.017094903433074415 -2.891031996545471e-11; 6.25060248206861e-12 0.01709822839445707 … -0.01709822833950947 6.25060248206861e-12;;; 3.4267123591616697e-12 5.897044388925244e-13 … 1.3735566772011405e-12 3.4267123591616697e-12; 2.2361402862857364e-12 1.0462247727121241e-13 … 1.173861699310166e-12 2.2361402862857364e-12; … ; 1.2292929612001605e-14 -2.2501384717475626e-15 … -2.0985472331346018e-15 1.2292929612001605e-14; 1.3390095060543347e-14 1.5897631961586492e-16 … -2.3380046906491225e-15 1.3390095060543347e-14;;; -4.718380191376093e-9 -0.2571587174285247 … 0.25715871202832863 -4.718380191376093e-9; -3.795682310862517e-10 -0.2553305268648302 … 0.25533052532057066 -3.795682310862517e-10; … ; 5.625406811621609e-9 0.02157701270833104 … -0.02157701150993985 5.625406811621609e-9; 2.6390067856650346e-9 0.021498138608911782 … -0.02149813607484205 2.6390067856650346e-9;;; -5.401473306952126e-11 0.00624710878449798 … -0.006247108818224999 -5.401473306952126e-11; -6.8965317843110646e-12 0.006201957801200513 … -0.006201957808480949 -6.8965317843110646e-12; … ; 8.359296139264457e-11 0.0037566159673477 … -0.003756615968136163 8.359296139264457e-11; 9.688518871672649e-11 0.003756472131085431 … -0.003756472132637856 9.688518871672649e-11]), JPEC.SplinesMod.BicubicSplineType(Ptr{Nothing} @0x000000014193a200, [0.01, 0.010148181201467524, 0.010592635547055184, 0.011333095314084414, 0.012369114477279132, 0.013700068977434681, 0.015325157097327761, 0.017243399944640907, 0.019453642041610618, 0.021954552021043953 … 0.9820454479789561, 0.9845463579583893, 0.986756600055359, 0.9886748429026722, 0.9902999310225652, 0.9916308855227208, 0.9926669046859157, 0.9934073644529449, 0.9938518187985325, 0.994], [0.0, 0.00390625, 0.0078125, 0.01171875, 0.015625, 0.01953125, 0.0234375, 0.02734375, 0.03125, 0.03515625 … 0.96484375, 0.96875, 0.97265625, 0.9765625, 0.98046875, 0.984375, 0.98828125, 0.9921875, 0.99609375, 1.0], [105.93004448085078 105.7501575088919 … 105.7501575032695 105.93004448085078; 102.473684977207 102.30777981776615 … 102.30777981744798 102.473684977207; … ; 132.90523012411455 132.89161970867588 … 132.89161970973666 132.90523012411455; 132.8989174702985 132.8853105696544 … 132.88531056941204 132.8989174702985;;; 78.3764899601505 78.4591816776845 … 78.547522254588 78.3764899601505; 80.30213922110674 80.38020122003587 … 80.47133920988671 80.30213922110674; … ; 18.764126275060654 18.76725184116197 … 18.762768819679223 18.764126275060654; 18.768299609418662 18.771427970278975 … 18.766938106078666 18.768299609418662;;; 75.34395801693474 75.42924592521595 … 75.51417636367466 75.34395801693474; 77.33038836097519 77.41147755717445 … 77.49925094768128 77.33038836097519; … ; 12.178598884549736 12.180573080087937 … 12.177666107848951 12.178598884549736; 12.179459734830571 12.18143563426502 … 12.17852466299627 12.179459734830571], 128, 256, 3, 3, 2, [-24757.908905187494 -24656.360739299067 … -24656.36069223063 -24757.908905187494; -21924.940878085046 -21837.61157610019 … -21837.611551441547 -21924.940878085046; … ; -44.65024358279807 -44.62619382246543 … -44.62619891586703 -44.65024358279807; -40.548044051573015 -40.524655259046995 … -40.52466776894835 -40.548044051573015;;; 13673.933741116523 13641.855583998684 … 13661.417337822419 13673.933741116523; 12332.042617306246 12301.617943806292 … 12319.828430984207 12332.042617306246; … ; 28.688963683392977 28.70793118625941 … 28.66155399608249 28.688963683392977; 27.637495393621066 27.656248588279595 … 27.610269950805332 27.637495393621066;;; 14020.75202835233 13991.7092572984 … 14011.502384952963 14020.75202835233; 12803.56299932101 12775.922610629252 … 12794.514093353528 12803.56299932101; … ; 5.996491054719773 6.008035095341211 … 5.980951157089631 5.996491054719773; 5.622037794562402 5.6334911849030505 … 5.60660035156593 5.622037794562402], [1.0287828284087177e-6 -91.93964310115277 … 91.93964330402214 1.0287828284087177e-6; 1.0520172584923177e-8 -84.80035165223694 … 84.80035185450836 1.0520172584923177e-8; … ; -2.1811730258984122e-7 -6.967665347258812 … 6.967665405046322 -2.1811730258984122e-7; -3.640000804476055e-8 -6.965866554121913 … 6.9658668858482145 -3.640000804476055e-8;;; -11.290410925710432 53.601709627812156 … -76.28562898686226 -11.290410925710432; -11.6488541703579 51.59036241386783 … -74.98892193787809 -11.6488541703579; … ; 0.5765391666271729 1.0209541744401973 … 0.11584965779921784 0.5765391666271729; 0.5774162119056441 1.0215068562096792 … 0.11704400200510043 0.5774162119056441;;; -10.85374143134201 54.49949644400591 … -76.3111074549293 -10.85374143134201; -11.21794757910115 52.7143599750691 … -75.25253356790638 -11.21794757910115; … ; 0.37385451994137303 0.6351445713698732 … 0.10199202840558813 0.37385451994137303; 0.3743668903767284 0.6355041288547455 … 0.10265424403753573 0.3743668903767284], [-0.009157133854431631 51849.43734955244 … -51849.43686948356 -0.009157133854431631; -0.004613527962930872 44593.74395663733 … -44593.74444040202 -0.004613527962930872; … ; 0.0006599789597498705 12.30923406975967 … -12.307962167445814 0.0006599789597498705; 0.0017935109299109372 11.968757765909686 … -11.966324424503227 0.0017935109299109372;;; -2506.4850808880656 -13913.22723165909 … 8915.740618631857 -2506.4850808880656; -2333.415798091967 -13239.87806859238 … 8587.887108300292 -2333.415798091967; … ; 5.944319884722879 3.7589686476368414 … 8.081433864137582 5.944319884722879; 5.893117718025266 3.7005337007537804 … 8.038589020707503 5.893117718025266;;; -2535.6441901933185 -12331.51578765995 … 7272.970509706038 -2535.6441901933185; -2381.7476608100037 -11767.497888266276 … 7016.22979927064 -2381.7476608100037; … ; 3.470118270288042 2.4372066288249883 … 4.48278486821487 3.470118270288042; 3.4453284927935712 2.4157284144240734 … 4.455117614807405 3.4453284927935712]), 10.0, 0.0, 0.23099310376308363)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plasma_eq= JPEC.Equilibrium.setup_equilibrium(equil_input, lar_input)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "88a7f2d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Generating data for 2D color plots ---\n", + "Evaluating the 'rzphi' mapping spline...\n", + "Evaluation complete.\n", + "Calculated R and Z grids.\n", + "--- Plotting heatmap for R(ψ,θ) ---\n", + "--- Plotting heatmap for Z(ψ,θ) ---\n", + "\n", + "2D color plots for R and Z have been saved.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOxdaXgVRdauvkkIgYQlYd8XA8gWVgEHhh0xDppBRAFRQAXcl/lEAUVUEEFAxgUZBURFXBBQh00WEWEUkIBABILIFmISSCALgSQkt78fbbqrb79dVd19bxbo9+F5uKk+59Tpvn3r7XPqVLUkyzJx4cKFCxcurld4StsBFy5cuHDhojThEqGLUsb//ve/CRMmbNiwobQd8QPee++9CRMmJCcnqy3jx49/7rnnStElNj7//POHH344Nzc3oL1kZmbOmjXrH//4x6BBg55//vmkpCQfgblz506dOjWgPrhwwYBLhC6EUKdOHUmSJEn6+uuvjUe//fZb5WjNmjWtWj569Oj777+/f/9+f7hpioEDB0oUqlev3qZNmyeeeMI4KDvBpk2b3n///QsXLqgtS5cu/fzzz/3YBQMTJ06kz7FKlSrR0dEPPPDAb7/9BuXPnTs3ceLErKysypUrB86rM2fOdOrUacqUKSdPnszIyJgzZ06HDh127dpFy9StW/e1115bvXp14Nxw4YIBlwhdWIAkScuWLTO2L1u2TJIkezbr168/YMCApk2bOvJMDDExMQMGDBgwYEDLli1PnTr19ttvd+jQ4ciRI4HrsU+fPjfffHPg7BsRHR2tnGP79u3Pnz+/dOnSzp07b9u2zSg5bdq0nJycl156KXDOyLJ8zz33nDp1avny5b/99lt8fPzWrVuvXLkydOjQnJwcVeyee+5p1arVc889d/Xq1cA548KFKWQXLgRQu3ZtQkjPnj2Dg4NTU1PpQ+np6aGhob169SKE1KhRo7Q8ZGPAgAGEkDVr1qgtKSkpXbp0IYTccccd/uolLi6OEHLw4EF/GbSECRMmEELmzp2rtmRlZf3jH/8ghLRr185HOD09vWLFiv369QuoS99++y0h5M4776Qbp0yZQgh5/fXX6cY5c+YQQlauXBlQf1y4gHAjQhcWMGbMmMLCws8++4xu/OSTT/Lz88eMGQNVTp8+vXr16rfeeuutt97asGFDfn6+j0B6enp8fHxqaqpPe2Zm5sqVK+fPn79w4cJffvnFaDk+Pj4hIYEQcunSJUVy69at4udSp06dV155hRBijJYuXry4fv36RYsWzZ8//8svv8zIyIAWrl69unbt2vnz53/44Ydnz56FMvv27VOcVHD+/Pn4+Pi0tDQfsaNHj8bHxxcWFtKNhw4d+vTTT+fOnbt48eL169dnZ2eLn52CKlWqzJ07VzF1/vx5+tDSpUvz8vLuvfdeujE+Pv7QoUPK55ycnPj4+NOnTyt/Jicnx8fH01lfEXzxxReEkBEjRtCNd999NyHEJ2M8atSooKCgRYsWWbLvwoV/UNpM7KJ8QIkIU1NTa9eu7RNedOjQISoqKiUlhRgiwo4dO/rcb3Xr1t22bRsts3jxYkLIzJkzfRqrVKlCK/bq1evPP/9UBbxeLyGkWbNmGzdujIqKUmTuu+8+M/+NEaEsy8qgHxQUVFRUpDY+8sgjwcHBdNeVKlV66623fAweP368devWqkxwcPCCBQuMEWFQUFCjRo3UP999912iD9oU9OjRgxCSlpam/JmTk3Pbbbf5XLrg4OA//vjD7ARlFBHKsnz58mVF3Ue3a9euyhdKN0qS1LBhQ+XzDz/8QAh58MEHlT8nT55MCFm+fDnDASOUjHdycjLdWFRUFBYWJklSTk4O3d65c2dJks6dO2epCxcunMONCF1YQHBw8IgRIw4dOvTrr78qLfv37//1119Hjx5doUIFo3xhYeHs2bO///77xMTEXbt2TZkyJSMjIy4uTmFNM6xcufLBBx+UJGnRokXHjh3btWvXHXfcsWPHjkGDBuXl5dGSFy5cGD58+J133vnNN9/s3LnTJ77hYt++fYSQJk2aeDzaDyEjI+OJJ55Yv379b7/99uuvv7777rsRERFPPvnkd999p8pcuXLltttuO3z48IMPPnjw4MGTJ0/OmTPn+eef3717tyUHzDBz5sx169YNGTJkx44dZ86cSUhIWLVq1bBhw2yYUs4xNDS0fv36amNOTs7+/fubNm2qPN8ECPn5+adPn65YsWKdOnXodo/H07x5c1mWjx8/Trd369ZNluUff/wxcC65cAERzBdx4YLCuHHjFixY8NFHH3Xo0IEQotTO3H///VD44MGD9J/dunWrVq3apEmTPvroo+effx6qFBUVPfvss4plJcAihKxatapnz567du1asmTJo48+qgpnZmY++uij77zzjtWzuHr16rZt2xQflEBKhU/KLiYmpmPHjjfffPNbb711yy23KI1Lly5NTEyMjY394IMPlJann36aEPLMM89Y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LS25qsA091hYWLh3794tW7Zs3br1559/JoT06dOnf//+IkYzMzMlSVL4nBASERFx4cIFM+GPP/546tSp6p/vvfdeu3btZFl+8803Bw8efPToUaWg1gdXrly5cuUKsZCsdeHChQsXOuTl5VWsWJEjZH2OkP22ivr169evXx8e6t27t8/WMGr9p8fj6dy5c+fOnY1aQUFBt912mzUP9cBEeO+99/73v/+9dOlSx44d+/fvP3ny5J49e1aqVEnQaM2aNWVZzs7OVpZDXrx4ka6LpfHjjz+mpKQMHTpUbVGvwowZMz799NOdO3fefvvtRsWwsDBxfyCspH7E11SUOZQTAhtzTQAAIABJREFUNwMN/2ekLFxY9zsIPMr2NS67CVE+CxIieyXZa219unxtvKF+y5YteXl5EydOvOuuu3r06GF1l9GoqKjatWvv27evX79+hJD9+/ffeOONUHLp0qUjR46ElOb1egsLCwULYakFdnbuOf99acJFXaV6n9jtPJC/Z9Yiw7IPdUuEsg1h/0r1REqwGKvk4cwnx2dk69raiQjt9FOKwET41Vdfbdq0aevWre+//36FChV69eql1I526NBBZOsaSZIeeuihl156qXnz5gkJCevXr1d2jTtz5sy4ceO++eYbJWt66dKlVatWbdu2TVU8ffr0jz/+qJSM/vvf/yaE9OzZ06wXmUhwyTwlwHETSNq60cQ7EjcU0N+wyWY0To2KtdmDqMMBH/uYHThNM/gPgdlrS1CqrARAJUeEzOfvssPHZceTsgZMhD179uzZs+crr7ySk5Ozfft2pXb0ueeei4yMTE9PF7H7wgsvXLp0aeDAgdWqVVuxYkXTpk2NMr/88ktcXJw6KUoI8Xg8X3755YwZM4KCgjp16rR169aqVaua9iFzwwjR5RMWSjSdBS52xginBMPeYsYWLLjkaEwMsJ+lmi/l2wrAFyfeuR0l5vUsqYc8kz65sHwzoBXLAUGZeLqymmkrb5TLWaiXk5NzoRiyLJtVARkRGhr65ptvvvnmm3Rjo0aNtmzZov7Zt2/fvn370gINGzZkrKB34cKFCxclDVmSLaZGrW7SXerARLh27drvvvtu69atSpFrq1at4uLi+vfvr+5zWhYgo8cOuPBTL4YELMyd+Oux19bzvp9CMYf7n3Cvp0V7VtX8PyHnr8qpMuQStOMn//w1F2Bn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Fz1PwRFcNhG1oO6w94Coi8/8scZZK/3DjiCL4wEducTum/OIwFHyo6To6Vj4tsWfG3iNXADn7bhkr3OdActEKBFPRETEBT22b9/O6CU6Ovq3335TPufl5R0/fjw6OpoWqFevXqVKlVSZhIQERaB+/fopKSnt27d/+OGHJ06cWFBQsHTp0ueff3737t3i5wiIMCsr6+rVqwUFBT7tBQUFSigqSVKtWrW8XtO9CXbt2pWZmTly5EhCyIABA2rXrr1+/Xoo6bMe4+uvv27dunX37t0JIePGjTt+/HhCQoL4yVgD/ctydJ/Y6dOOTgn4Jwi/uVRS51YGr6EOJgO1RXU74zrfJYeW7J+OgBaSFNYW53jHfkItbqO/4PDu8j9ycnJOnDhx8eLF3NzcEydOKLRyyy23FBQULFmyRHkzfIsWLWJiYgghq1atmjdvHiGkYsWKI0aMmDlz5pUrV3766adNmzYpi+gjIiLy8/OLior27Nnz1VdfVa1adceOHVu2bElOThZ3CRBh7dq169evP23aNDVQI4Skp6e/9tprnTp1IoTk5+crk39mRk+ePNm8eXN1hi86OvrkyZNGsalTp0ZFRTVq1Gjx4sWqYosWLZTPFStWbNCgAVRUwGDiawl+Hd1KCIF1qYyccFkZVUoTVq5B6V4vh73bY9zSvT/81rtMiJdIVv8xDG7dunX48OE//PDD+fPnhw8froz/ISEhq1ateuutt6pXr75hw4YVK1YowikpKeqawjlz5hQWFtauXXvUqFEffPBBkyZNCCHvv//+qlWrioqKjh071r1796NHj+7du3fv3r1Dhw4VP0dQLOPxeN5555277rqrcePGffr0qVGjRkpKytatW5UTIIRs27atYcOGN910k5nRnJycsLAw9c/KlStnZ2f7yEyePPk///lPaGjo5s2b4+LioqOje/fubVTMysqCXVy5ciU/P59UEj9TFy5cuHChQ15eXsWKFdky3AXyUIVxNC4uLi4uztjevXv3AwcO+DQ+9thj6ufq1avD1YFmBsWBi2Xi4uJ27do1ePDg33//fc2aNWfPnh05cuSvv/7arVs3QsjgwYOPHTvGqP+pVatWZmam+ufFixdr167tI9OyZUtlAcbAgQPj4uI2btwoqKggLCyMpsxrGGBXGxOBsoPAulRGTpj7xVwHsHINSvd6OewdqfNNlu79IdQ7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LVu2LNqvb5W4eSCJUCLfUKpUqTFjxqxatSoxMdFMZtq0aVWqVImOjg4PD2/duvWOHTv0XQ899FC3bt0WLVpUtWrVmJiYt99++/vvvy9fvvz69evj4+PDw8PLlSvXo0ePy5cvJyYmNmzYsGLFimXKlNE+u6PhyJEjd911V6lSpSpVqlSqVKnmzZt///33Zp7ExcW98MIL2naNGjXKe0H7BgghZObMmdWrV69UqVKFChUaN268ZcsW3Uh2dvYzzzwTERERHR1drVq1VatWWTpj3bt3J4QcOnSIEPLdd981bdq0VKlS0dHRJUqU6NChg+bAoUOHYmJivvvuO2ghPT199erV2vu4NfTo0UP7mZ2dXb58ee0LjuvXry9fvvzBgwcZzvTp02fJkiUFM3yXkLAESYQS+YmhQ4fWrl371VdfhXunT5/+3HPP3XPPPb/88svGjRszMzPj4+P/+ecfbe/Vq1f37NkzZsyY999/PzExsW/fvtnZ2enp6cOGDbvjjjt27dr16aefbty48Yknnnj00UdfffXV3bt3Dx8+fMKECRs2bNAsXLhwoWHDht98881ff/21adOmChUq9OzZ89SpU9CZtLS0ixcvatvz5s1bmod58+YFBweXK1dO++jHhx9++NRTTw0cOPCXX37ZsWNHvXr17rnnnj///FNTHDly5IwZM9544439+/dPmTLlueee0z8iKIITJ04QQqKiojIyMnr37l2vXr3du3f//fffmzdvbteunRZiZmdnnz179saNG9DCjz/+mJOT0759e73kypUr2oerCCHp6emaYlZWVnp6uk7tEO3bt79+/TrdNZGQKKxQJSTyA/Hx8U2aNFFVVZsqsmHDBlVVV69eTQj57rvvVFV1uVzR0dEdO3bUVU6ePFm8ePFhw4ZpP3v16qUoyq5du3QBjeFeeeUVvUT7KsXXX3+t/czJyYmJiRk+fDh06fLlyyVLltS+VK6q6oIFCwghycnJ2s9GjRoNGjTIQyU3N7d3795ly5b9448/VFW9dOlS6dKln376aV0gMzOzRo0aTz75pKqq6enpoaGh2raGlStXEkL0I/LA4cOHCSGvv/76hQsXzpw5s2bNmho1ahQvXvzIkSPa4FxiYqK3lva94jVr1kCbb7/9NiEkIyNDL4mLi+vatauqqlpyeMqUKaqqaqHq/v37oRENp0+f1uUlJAo1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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOxdeZxO9ff/3BlmjJmxzpCtsTSSPRJCtqiUyNaGn9CqkjbZUshSUt/0Dd+EbJUUIskSIoRKUcYeYx0zjGEYszz398dt7vO5z33fz3LvfWbhvl9e9cy553zOufe5z+d9z/ksV1FVlXjw4MGDBw/XK0LyOwAPHjx48OAhP+ERoYf8wYIFCwYMGPDXX3+53vJ//vOfAQMGnDlzxvWWbSAtLW3AgAETJ07kah49enTAgAHTp0/Pg6hs49y5c08//fTSpUuD7Wjt2rV9+/Zt167dI488smTJkoCju3fvfuqpp3bu3BnsMDxcL1A9XH/QepCyZctmZGRY6dSvX58QsmLFCoe+vv322xkzZqSlpQXIn3nmGULIqlWrHLZvxr333ksISUhIYOj88MMP9K+gWLFiFStW7Nq165o1a9wN5tSpU4SQO+64Q5fs379/xowZO3bsCNDUvpSePXu6GwADt912G7d/SEpKok1eeOGFokWLHjx4MKiBDR8+nBBSqlSp5s2bly1blhDSv39/n8+nK2RmZlavXv3222+nhR482EYR15nVQ8FH48aNGzZsuGvXrpUrVz744INmhR07dvz555833HDD3Xff7dDXlClTNmzY0LFjx+joaFp+8803t2nTRuvm8gulSpXSyCA7O/vAgQNLly5dtmzZO++888orr7jlIjw8vE2bNvXq1dMlv/zyy1NPPTVq1KgAHoqOjm7Tpk3dunXdcs3F7bffXqpUKXho3759iYmJxYsXL1asmC48cODAtGnT+vbtW6NGjeBFtWzZsvHjx7dq1Wr58uUlS5ZMT0/v2bPnrFmzGjVqNGjQIE2naNGiw4cPHzhw4Jdffvnwww8HLxgP1wvym4k95A8++OADQkiXLl3g0WeffZYQ8vrrrzt31KZNG0LIkSNHnDclCPGMsEWLFrokOzv7jTfeIIQULVr02LFjwQtv3rx5hJBRo0YFz4VD7N+/v1SpUoqifP7557Rc46Ht27cH1XudOnUURdm/f78uSUpKCgsLK1++/NWrV3Vhenp6dHR0w4YNgxqMh+sEXkZ4naJ3795Dhw797rvvTp8+fcMNN9CHMjMzv/zyS0LI//3f/+nCs2fPrlu37sSJE5GRkc2bN2/QoAFtkpqaeujQofLly1euXPmff/758ccfU1JSunbtmpaWdvHiRULI7t27U1JSCCEhISG33norISQxMTEpKSk+Pr5EiRJ0U+np6Rs2bDh06JCiKHFxcXfeeSedtfh8vt9//33v3r2nT58uUaLEbbfd1qhRI1cuSGho6JtvvrlgwYJDhw6tWbOmf//+mvzChQtr1649evRoeHh448aNmzZtqihKgO2RI0d27tx5/Pjx8PDwChUqNG/eXL+k2dnZf/zxR1RU1M0330wIOXDgwD///EMIOXXq1K+//qrpVKtWrUyZMpcvX967d2+ZMmWqVatGN56RkfHjjz8eOHBAUZQ6derceeedRYsWpRX+/vvvK1euaJSwevXqffv2RUVFdejQoWrVqjauw8WLFx988MHU1NTXX3+dTrYuX768YMGC+Pj4Jk2a6MITJ06cPn1ai58QkpCQkJ6e3qBBgyJFiuTk5OzatSsiIqJ27dri3nfv3v3XX381adIkPj5eF8bGxrZv3/77779fv369XqIoXrz4gw8+OHfu3J07d4rUeD14YCG/mdhDvqFHjx6EkClTpgTINRbUs6WcnJyRI0eGh4fTt03nzp0vXLigm3zzzTeEkJdeemn48OEhIf/OwJoxY4b5fitevLhmAscIZ86cGVAsDQsL03W2bt1arly5gAbbtm0bMI5lLyPU0KlTJ0LIxIkTtT/nzZsXUDxs1qwZnS/m5OQ8//zzAdSoKMq3336rKQSMEXbs2NF8TRYsWKBajBH++OOPlStXppVr1qz566+/0jraQ8nvv/9ep04dXa1o0aIff/wx4wpA+Hw+7a7o2LFjdnY2fWjx4sWEkCFDhtDCYcOGEULmz5+v/dm8eXNCSHJysqqqqamphJB69epJBTBt2jRCyAsvvBAgHzVqFCFk9OjRtFC7UV9++WUpFx48mOHNGr1+8fjjjxNCZs2aFSCfM2eOfpQQ8sorr4wbNy4+Pn7RokV///33xo0bH3zwweXLlz/yyCMBhosXL542bdr48ePXr1///fffN23adM2aNVo3PX/+/DVr1qxZs2bFihVW8UyfPn3gwIE+n2/KlCl79uz566+/li1b1qtXr4yMDE0hJSXl1ltv/eyzz7Zt27Z///7Vq1d36tRp/fr1dObqEEeOHCGEaPnNihUr+vbtm52dPXXq1H379m3fvr1n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VKm8aLZEiRJr1qzJi5bzCHlChNddd93evXsPHz5cuXLlCxcubNq06a233uINYmJiWrZs+dVXX6WkpDDGvvrqq+uvv54x1qZNmzfeeCMrKysuLu7XX39NS0tr1qwZ7CIYDD7wwAN54byCgoKCgk80adIk2i64QECTXojoCgMHDtyzZ88jjzzy/vvvh0KhpUuXMsamTJkyderUzZs3M8YWLVo0aNCgcePG7du37//+7/927Nihz+LbtWuXnJzcs2fPCRMmXH/99RMmTMgL9xQUFBQUFHTkFRFmZWVNmjRp69at9erVe+KJJ4oVK8YY27Jly5YtWx566CHdZsWKFR9//HGpUqWGDBly1VVX6YXp6en//ve/9+7d26pVq0GDBkntnVBQUFBQUPCKvCJCBQUFBQWFAoGC9FxUBQUFBQWFsCPm5ZdfjrYPCrJITU399NNP9+zZU7NmTWPzCY9t27Z98cUXf/zxR3JyckJCQuQ9jDC+/fbbL7/8Mi4urmLFigKzr7766uLFi+XLl4+YY1FBVlbWypUr169fX65cuZIlS0Kb9PT0pUuXfvfdd6FQ6IrfU5Genv7pp59u3769WrVqRYoUsRtkZmZ+/vnn69evz87OvuKvhoIAShEWGOzevbtRo0bLli175513WrVqdfbs2VwGjz76aK9evVauXDlx4sS6detu3749Kn5GDE888cTAgQM3bdrUqVOn6dOnO5m99957nTt3fvvttyPpW+Rx+fLlzp07jx07ds2aNU2bNl27dq3d5ocffqhXr96UKVNWr1593333Rd7JSOLYsWNXX331Bx98MG/evCZNmhw+fDiXQVpaWtOmTSdMmLB169YePXo888wzUfFTIV9AUygguO+++5588klN00KhUPv27d9+++1cBr/99lsoFNI/P/DAA/369Yu0ixHE3r17ixYteuTIEU3TVq9eXalSpczMTLvZkSNHGjZs2K9fv6FDh0bcx4hi4cKFKSkp+kX417/+deONN+YyyM7Orlev3n/+859oeBcFjBw5slevXvrnvn37Dh8+PJfBrFmzGjdurP9ktmzZEhcXd/HixUh7qZA/oBRhgcGSJUt69uzJGAsEAj169FiyZEkug9q1axvbhJOTky9duhRpFyOIZcuWtWnTJikpiTHWvn377Ozs7777zm726KOPjh07tkyZMhF3MNJYsmRJt27d4uPjGWO9evVatWrVhQsXeIMtW7YcO3ZswIABX3/99bZt26LkZuSwZMmSXr166Z979uxp/72UK1fu4sWL2dnZjLHz58+XKlUKphsUCgMK9It5CxEyMzNPnTpVtWpV/c8qVaocOnTIyfjIkSPTp0//73//GynvooBDhw4ZVyMQCFSuXNl+QebOnXvp0qUePXp89dVXkfYv4jh06FDjxo31z/qLPA8fPsy/CvS3334rUaJEhw4drrrqqm3bttWrV2/hwoX8e0CvMBw6dKhKlSr6Z/h7ue222zZt2nTdddfVrVt3165dn3zyyRV8NRTEUF98wcDly5c17vG4MTExly9fhpZnzpzp3r37Aw88cNNNN0XQwUgjOzubf0pWbGxsrgty8uTJF154YfLkyRF3LTrIzs42xvFgMBgIBHJdkIyMjAMHDrz11ltz58794Ycftm3b9sknn0TD0wiBv0Pg7+W3336bM2dOr169evfuXadOHT1oHHE3FfIFlCIsGEhMTCxZsmRqaqr+KNtjx47ps/5cOHfu3G233daiRYvXX3894j5GFMnJyT/99JPxp/2CzJw5MzY2dsyYMYyxtWvXapo2ZsyYF198MdKORgrJycnHjx/XP6empoZCoVwXpHLlyjExMe3atWOMFS1atFWrVtu3b7/rrrui4GtEkJycnJqaqn+Gv5eJEyf+5S9/GTVqFGOse/fuZcuW3bJly7XXXhtpRxXyAZQiLDDo0KHDypUr9c+ff/55hw4dGGOapp08eVLPc1y4cKFbt276gogr/pnCHTp0WLt27fnz5xlj27dvT09P14ewCxcunDt3jjF2++23jx49ulOnTp06dapWrVrVqlVbt24dZafzEh06dPj88891TfP55583b95c30GRnp5mQ5XoAAANpElEQVSekZHBGGvVqlXRokV///133f7XX3+9sp9ZD38vjLFTp05lZWUxxmJiYow8+uXLl0OhkHqOVaGFerJMgcG6detuueWWZ5999vjx4/Pmzdu6dWtSUlJ6enqpUqV27NjRsGHDwYMHv//++3379tVDZDVq1BgxYkS0vc5DdO3a9fz58926dZs2bVqPHj3Gjh3LGHvmmWf2798/f/583vKJJ564fPnypEmTouRpJHDhwoWmTZu2atWqadOmb7755uTJk3v06MEY++tf/9q5c2f9TnjxxRcXL148aNCgjRs3bty4ccuWLVfwWyl++eWXVq1aDRkyJCYmZuLEievXr9dfzlWiRIlPPvnkpptu+vHHH9u2bTto0KCrrrpq3rx5ly9f/uqrrxQXFk4oIixI2LZt24IFC4oWLdq/f399IUBWVtasWbPuuuuu0qVLf/755/v27TOMK1SocOedd0bN17zHpUuXZs+evXfv3pYtWxpnunHjxnPnzt144428pR4a1aOCVzBOnTo1c+bMtLS0W265pW3btnrh0qVLq1SpYrzFZfHixRs2bKhevXq/fv2KFy8ePWcjgT179nz44Yeapt1zzz3G04xnz57dqVMn/efzxx9/fPzxx2lpaSkpKX369NHX3CoUQigiVFBQUFAo1FA5QgUFBQWFQg1FhAoKCgoKhRqKCBUUFBQUCjUUESooKCgoFGooIlRQUFBQKNRQRKigoKCgUKihiFBBAWPv3r2zZ8/WH8vCGPv000/hS/584qOPPvrmm2/C2ODp06dnz54teCY7Y+zgwYMLFy703EUoFPrkk0+OHj3quQUFhXwFRYQK0cGAAQPq1Knz+OOP84WrVq2qU6fO+vXro+UVj7Vr195///1paWn6nyNGjJg6dWrYexk1atScOXPgof3799fJQb169Tp16vTcc8+dOnVK3ODBgwfvv//+rVu3CmwefvjhpUuXevY5GAzOnz//ySef9NyCgkK+giJChejgyJEje/funTRpEv9uvPPnz+/du9cQYfkKTzzxhPF+u8ggKytr7969KSkpgwcPvu+++ypUqPDmm2+2bdtWfH0qVao0duzYevXqORmsXr16xYoVI0eO9OPbqFGj5s2bB98BqaBQ4KCIUCFqqF27dqVKlV5++WWxWSgUOnbsWHp6upOBpmlHjx7NRQ/p6elnzpzhS06ePOn07qrU1FTyPcYPP/xw165dxTa52nRSbxkZGceOHZN8qFP79u2HDx8+YsSIDz/8cPTo0bt27eLFnN4Uf14VKlQYNWoU/ybCXJg4cWL79u1r1aolfSoAjRs3bt68+ZX9+FaFwgNFhApRQ7FixUaNGrVo0aJ169Y52UycOLFKlSpJSUmlSpVq0aLFhg0bjEP33nvvTTfd9MEHH1StWjU5OfmVV15ZtWpV2bJlly9f3qlTp1KlSpUuXbpr165nz55dt25dgwYNypcvX6JECf21Ozp+++23m2++uVixYhUrVixWrFizZs1WrVrl5EmHDh2GDRumf65Zs2ZZG/R3gDDGpk6dWr169YoVK5YrV65Ro0arV682GsnKynr00UfLlCmTlJRUrVq1RYsWubpiXbp0YYzt3r2bMfbll182adKkWLFiSUlJRYoUuf7663UHdu/enZyc/OWXX8IW0tLSFi9erD+PW0fXrl31P7OyssqWLau/wXH58uVly5bdtWuXwJmePXvOnTs3f8p3BQVXUESoEE0MGjSoTp06zz33HDw6adKkxx9//NZbb/3+++9XrlyZmZnZqVOnX3/9VT96/vz5LVu2jBo16o033li3bl2vXr2ysrLS0tIGDx7csWPHTZs2vfPOOytXrnzooYfuv//+55577rvvvhsyZMirr766YsUKvYVTp041aNDgs88+27lz5+eff16uXLlu3bodOHAAOpOamnr69Gn986xZs+blYNasWTExMaVLl9Zf+vGvf/1r6NChffv2/f777zds2JCSknLrrbf+/PPPesXhw4dPmTLlpZde2r59+4QJEx5//HHjJYIy+OOPPxhjlSpVSk9Pv/POO1NSUr777rtffvnlf//7X+vWrXWJmZWVdfTo0YsXL8IWvvnmm8uXL7dp08YoOXfunP7iKsZYWlqaXvHSpUtpaWkGtUO0adMmIyODn5ooKBRUaAoK0UCnTp0aN26saZq+VGTFihWapi1evJgx9uWXX2qaFgqFkpKS2rZta1TZv39/fHz84MGD9T+7d+8eCAQ2bdpkGOgM9+yzzxol+lspPv30U/3Py5cvJycnDxkyBLp09uzZokWL6m8q1zTtvffeY4wdOnRI/7Nhw4YDBgzIVSU7O/vOO+8sWbLkjz/+qGnamTNnihcv/sgjjxgGmZmZNWvWfPjhhzVNS0tLS0hI0D/rWLBgAWPMOKNc2LNnD2PsxRdfPHXq1JEjR5YsWVKzZs34+PjffvtNT86tW7fOXkt/X/GSJUtgm6+88gpjLD093Sjp0KFD586dNU3Tg8MTJkzQNE2Xqtu3b4eN6Dh8+LBhr6BQoKHeUK8QZdxzzz3//Oc/hw8f3rlzZ7786NGjR48e5V+pWK1ateuvv/7rr782SqpXr96iRYtcDerxQx0pKSmBQMBoOSYmpm7durzmO3HixNy5c/fu3aurovj4eJ1+JPHss88uWbJk2bJlTZo0YYytW7fu3LlzVatW/d///mfY1KxZc/v27YyxnTt3ZmZm9uzZ0zjUrVu3uLg4cRdjxowZM2aM/rlq1arz58+vXbt2mTJlSpYsOXjw4CFDhnTr1k3+FbupqalxcXElSpSQP0cdGRkZ8fHx/Ov6ypUrxxhzpWgVFPInFBEqRBnBYHDs2LFdu3b9+OOPixYtapTv37+fMZacnMwbV6lSRScVHZUqVbI3WKZMGeNzQkJCkSJF+Gbj4+ONdTGrVq3q1q1bcnJy+/bty5QpExMTExsbK1iVkwvTp08fP3785MmTO3XqpJccO3aMMfaPf/wj1/tda9SowRjT9/YlJSUZ5TExMRUrVhT38uCDD/bp06dIkSK1atWqXLlyIBDQz3HZsmUjRowYNmzYY4891rhx45EjR/bp04f0OTY2Njs7OxQK6YFcGZQpU+aBBx44ceLE5s2bJ02a1L59e71cX6Gj3uGncAVAEaFC9HH77be3b99ez/YZhfrL01NTU3nL48ePly5d2vhTfjSHeP311xs2bLh27VpDlsnvFFyxYsXQoUNHjRr18MMPG4WlSpVijC1YsCDXm4F16Jx34sQJo0TTtJMnT4o7qlu3rkG0PNq2bbtmzZq0tLQ1a9a8/fbbffv2rVatmvE+XidUqlQpFAqdPn26bNmyekmxYsWM3KeB8+fPM8b0y3Lp0qUhQ4akpKSsWLFCX3Gq2+gnAuciCgoFC2qxjEK+wCuvvPLrr7/OnDnTKKlfv37p0qX5rQInT55ct25d69atw9Xp77//3rRpU4MF161bZ2yfF2PHjh19+vTp0aOHEbTU0aZNm7i4uPnz58NaDRo0iImJMZbqMMZWr17ttKpFEmXKlLnjjjs+/vhjTdM2btxI2l933XWMMT2PqCMlJWXnzp3GehkdGzZsiIuLq1q1KmMsISEhJSWFMVa5cmV+Q8iPP/7IGGvZsqUf/xUU8gMUESrkC7Rr1+6222777LPPjJLY2Ninnnpq2bJlr7zyyokTJ3755Zc+ffpkZmY+9dRT4eq0WbNmixYt2rBhQ2Zm5tdff33//fcXK1aMrHXmzJlbbrklOTn5pZde+v333/fmgDFWqVKlp59+etq0aaNGjdq3b19GRsYvv/wyceJEneArVKjQt2/fiRMnfvDBB+fPn//uu+8eeeSRIkWKePD8m2++eemll3766aeLFy+mp6frex6aN29OVmzdunXx4sX5Z8X17dv37Nmzd99996ZNmxhjR48efeutt6ZMmdK/f3/9aujBWDvWrVtXvnz5Zs2aefBfQSFfQYVGFfILXn/99eXLl4dCIaNk5MiRZ8+eHTt27AsvvMAYS05O/vjjj2WGe0m8+eab3bt31/cSJCYmTpgwYcKECWSt1NRUfblNo0aN+PLLly/HxMS89tprxYsXf/PNN1999VW9vEaNGuPGjdM/T5o0KS0t7d5772WMFSlS5J///KdMj3bExsbOmDHD0KOlS5ceP358hw4dyIpFixbt27fvBx98YKxCatGixcqVK4cPH37DDTcwxt54442KFSuOGDFi+PDhgnY0TZs3b97999+fKxuqoFAQEdDkHm+hoBAtnD17dufOnUWLFm3YsGHYh93s7Ozffvvt3Llz9evXzyUHNU0LhUJGj6FQKBAIOMmjXMjKytq5c+fFixerVKlSpUqVXEd///33EydO1KtXr2TJkn6cP3To0OHDhxMTE+vUqZOQkMCflOBC/fzzz1dfffXatWtbtWrFlx8+fLhKlSovvPDC6NGjydP88ssvb7311l27dvl8Qo2CQn6AIkIFhUKHoUOH7tu3b/ny5XxhVlZWfHz8hAkTZJ6m3aFDhxYtWrz55pt55qOCQuSgQqMKCoUO48ePP3LkiOfqoVBoxowZlStXDqNLCgpRhFKECgoKjDEWCoWmT5/epk0b/eEACgqFB4oIFRQUFBQKNdT2CQUFBQWFQg1FhAoKCgoKhRqKCBUUFBQUCjX+HxHVoqhRCdZjAAAAAElFTkSuQmCC", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# --- Final Code to Generate 2D Color Plots of R(ψ,θ) and Z(ψ,θ) ---\n", + "println(\"\\n--- Generating data for 2D color plots ---\")\n", + "# 1. Define the grid in flux coordinates (ψ_norm, θ_new)\n", + "# This part is identical to the previous steps.\n", + "equil_control = plasma_eq.config.control\n", + "psi_norm_grid = collect(range(equil_control.psilow, equil_control.psihigh, length=equil_control.mpsi + 1))\n", + "theta_new_grid = collect(range(0.0, 1.0, length=equil_control.mtheta + 1))\n", + "# 2. Evaluate the `rzphi` spline to get the R and Z values.\n", + "println(\"Evaluating the 'rzphi' mapping spline...\")\n", + "fs_grid = JPEC.Spl.bicube_eval(plasma_eq.rzphi, psi_norm_grid, theta_new_grid)\n", + "println(\"Evaluation complete.\")\n", + "# 3. Transform the spline output to physical (R, Z) coordinates.\n", + "# This calculates R_grid[i,j] = R(ψ[i], θ[j]) and Z_grid[i,j] = Z(ψ[i], θ[j])\n", + "rfac_sq = fs_grid[:, :, 1]\n", + "eta_term = fs_grid[:, :, 2]\n", + "theta_new_mesh = ones(length(psi_norm_grid)) * theta_new_grid'\n", + "eta_grid = 2.0 * pi .* (theta_new_mesh .+ eta_term)\n", + "rfac_grid = sqrt.(max.(0.0, rfac_sq))\n", + "R_grid = plasma_eq.ro .+ rfac_grid .* cos.(eta_grid)\n", + "Z_grid = plasma_eq.zo .+ rfac_grid .* sin.(eta_grid)\n", + "println(\"Calculated R and Z grids.\")\n", + "# 4. Create the 2D color plot for R(ψ,θ)\n", + "println(\"--- Plotting heatmap for R(ψ,θ) ---\")\n", + "p_r_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " R_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Major Radius R(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"R [m]\"\n", + ")\n", + "display(p_r_heatmap)\n", + "# 5. Create the 2D color plot for Z(ψ,θ)\n", + "println(\"--- Plotting heatmap for Z(ψ,θ) ---\")\n", + "p_z_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " Z_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Vertical Position Z(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"Z [m]\"\n", + ")\n", + "display(p_z_heatmap)\n", + "println(\"\\n2D color plots for R and Z have been saved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "22c45ff5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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/JgQQu0kcrlcIBBQp/SN+18GfY65iRAAAIAw8xohAAAADYkQAAAYDYkQAAAYDYkQAAAYDYkQAAAYDYkQAAAYjYlzjUK/1NLSQj2sTQixtbX18PDQnelUU319fVJSEtXesWOHj4/PC7zpsmXLbty4QQiZNm0aKrUCmCkcEUI/sXv37rB/UBN/jx079im1F6RSaWFhob+/f1xc3BMrkvdGZGRkXFxcZWWlbsFkADAXSITQr1RVVXV0dNTV1W3duvXKlSvx8fFP7z9t2rTk5GQXF5cXe7u33347OTnZlGsmAMAz4dQo9CvURJEcDsfX1/fSpUuHDh26f/9+72salJeXW1paBgcHnz59+q+//vL19Z0+fbqlpeXDhw+PHz8uFovHjBkTHh6u118BAAwMiRD6LaoKR0dHR+8TYUpKCiHExsamoqLC2dn59u3bsbGxWVlZkyZNUqlUCoVCJBJt3br1o48+0mPcAGBYODUK/VN7e/uxY8c8PDyet3bghQsXQkJCRCJRXV3d+vXrf/7550mTJmVnZwsEAqFQ+M4776xatUqzOi4AmDskQuhXPv744/j4+EmTJvn6+iqVyh9++MHa+vlOe7i5ua1bt46qhLBw4UJCSFBQ0MyZMwkhVlZWH3zwwf379+k6vQDQDyARQr/i5OTk5ORkZ2cnk8mCgoJGjx79vK+gWcqKy+Xa2NiMHDmS/qmbmxshpLW1ta8CBgCjwzVC6FcyMzOpc6ElJSUTJkz44osv+Hz+c72CVpVECwsLqpIivUgIQfEygP4ER4TQP7322mtLlizZtm1bVVWVsWMBAJOGRAj9Vmpqqr29fUZGhrEDAQCThkQI/ZaLi8vixYt//fXXsrIyY8cCAKYL1wihnwgICJg9e7a9vb3myk8//VQgEJSXl4eFhfXmRSZMmGBlZaW5Ji4uLjAwkF7kcrmzZ88eNGhQn8QMAKbAApf9gZmqqqpCQkJSU1NHjRo1derUF5tu9OzZs2KxeOnSpTNmzNi1a1efBwkABoAjQmAoe3v70NDQ/Pz8/Pz8kJCQF0uEhw4dunr16pAhQ573sX0AMB04IgQAAEbDzTIAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBoSIQAAMBo/wXXs9ozZeNsmQAAAABJRU5ErkJggg==", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Plotting Psi and Theta Contours in R-Z Space ---\n", + "Flux surface contour plot saved as 'flux_surfaces_RZ.png'\n" + ] + } + ], + "source": [ + "# --- Code to Plot Psi and Theta Contours in R-Z Space ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting Psi and Theta Contours in R-Z Space ---\")\n", + "\n", + "# 1. Select a number of contours to display for clarity\n", + "num_psi_contours = 11 # e.g., from ψ_norm = 0.0 to 1.0 in steps of 0.1\n", + "num_theta_contours = 13 # e.g., every 30 degrees\n", + "\n", + "# 2. Initialize the plot\n", + "# aspect_ratio=:equal is crucial for tokamak plots to look physically correct.\n", + "p_flux_surfaces = plot(\n", + " title=\"Flux Coordinate System Contours in (R, Z)\",\n", + " xlabel=\"R [m]\",\n", + " ylabel=\"Z [m]\",\n", + " aspect_ratio=:equal,\n", + " legend=:outertopright\n", + ")\n", + "\n", + "# 3. Plot contours of constant ψ (flux surfaces) in blue\n", + "# We loop through the ROWS of the R_grid and Z_grid matrices.\n", + "psi_indices = round.(Int, range(1, stop=size(R_grid, 1), length=num_psi_contours))\n", + "\n", + "for i in psi_indices\n", + " # Each row corresponds to a single psi value\n", + " # We must add the last point to the start to close the loop for a smooth plot\n", + " R_surface = [R_grid[i, :]; R_grid[i, 1]]\n", + " Z_surface = [Z_grid[i, :]; Z_grid[i, 1]]\n", + " plot!(p_flux_surfaces, R_surface, Z_surface, label=\"\", color=:blue, linewidth=1.5)\n", + "end\n", + "\n", + "# 4. Plot contours of constant θ (angle contours) in red\n", + "# We loop through the COLUMNS of the R_grid and Z_grid matrices.\n", + "theta_indices = round.(Int, range(1, stop=size(R_grid, 2), length=num_theta_contours))\n", + "\n", + "for j in theta_indices\n", + " # Each column corresponds to a single theta value\n", + " plot!(p_flux_surfaces, R_grid[:, j], Z_grid[:, j], label=\"\", color=:red, linewidth=1)\n", + "end\n", + "\n", + "# 5. Add a legend manually (a common trick in Plots.jl)\n", + "plot!(p_flux_surfaces, [], [], color=:blue, label=\"Constant ψ\")\n", + "plot!(p_flux_surfaces, [], [], color=:red, label=\"Constant θ\")\n", + "\n", + "# 6. Display and save the final plot\n", + "display(p_flux_surfaces)\n", + "println(\"Flux surface contour plot saved as 'flux_surfaces_RZ.png'\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "87de5490", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdZ0AU194G8HNmhl6kSG92UVHB2FFERbAgWGO7MYlpJtc0U0w00eSNJU2jUXO9SdTEbuygUQHFSlMRLICKCCLSu7TdKe+Hyd0QbIDsLrDP79PucGb2P+PKw5k5Z4ZKkkQAAAB0FaPtAgAAALSJ03YBAKC7Ll68GBERkZmZyfP8K6+80q1bt/fee69jx44LFy6UG8THx69fv37MmDFTpkzRbqnQiqFHCDpq69attBYTExNXV9fp06dHR0druzTti4uLq31wDA0NHRwcAgMDQ0NDm/BTfvvtt/79+3/66adbtmzZs2dPRkZGVVXVpk2ban/KnTt3Nm3aFBcX14SfC1AHeoSg02xtbXv16kUIUSgUN27c2L179549ezZt2vTiiy9quzTtMzExGTRoECFEEIS0tLQjR44cOXJk4cKFy5Yta5LtL126VF9fPzo62svLS15SUlLi6+vbo0ePJtk+QD0hCEGnDRkyZN++ffJrhUIxf/789evXv/POOxMnTjQ3N9dubVrn5uYWHh4uv5YkafXq1fPnz//6669nzZrVvXv3Z9y4QqFIT0/v3r27KgUJIRYWFpGRkc+4ZYCGQhAC/EVfX3/VqlU7duwoLi4+e/bsuHHjCgsL09PTHRwcHB0db926dfr06ZKSkpkzZzo6Osqr3L59++zZs3l5eXZ2dsOHD3d1da2zzerq6jNnzqSnp1dUVLRt27Zbt259+vRhmL8vSRQVFZ0/fz4jI0MURRsbmz59+nTt2lX+kSAICQkJxsbG3bp1q73N/Pz8u3fvOjs729nZyUtSUlIqKip69+5NCDlx4kRKSoqVldULL7wg/1SpVJ45cyYpKUkQhM6dO48cOdLQ0LChB4dS+v7772/fvv3SpUtHjx7t3r17RUWF/EHt27fPzs4ODw/Pzc0dN26cKiMTExNjYmLKy8udnJxGjRrVtm1b1dauXbuWk5MjCIIoipcuXSKEGBgYeHh48DyfmJhoamqqOgiPIwhCVFTUlStXampqOnToMGrUKBMTk4buFMBfJACdtGXLFkLIpEmT6ix/7rnnCCGbNm2SJGnz5s2EkMWLF7/99tuUUvm/TEREhCRJpaWlzz//vGohIYTjuAULFgiCoNrU6dOn7e3t6/yPCwgIUDXYtGmTsbFxnQYLFiyQf1pWVkYI8fT0rFPhunXrCCErV65ULRkwYAAh5Ny5c6rI7Ny5s/yjkydPtm/fvvb2XVxczp079+SDExsbSwjp3r17neUzZ85UVShfTJ0+ffrq1av19PTkja9bt06SpMLCwtGjR9f+UGNj41WrVqm206FDhzp73alTJ0mScnNzCSEDBw5Utdy7dy8h5KOPPqpdRlxcXJ0/Dmxtbf/8888n7xTA46BHCPA3QRAyMjIIIdbW1qqFv/32W1VV1ffff//cc889ePCgffv2PM+PHTv2/Pnz48aNe/fdd11dXVNTUxctWvTNN9+Ympp+9tlnhBClUjlt2rSioqLvv/9+zJgxZmZmWVlZcXFxqamp8mZv3779+uuvW1pa/vzzz/369TMwMLh79+6JEycafUp25syZ7u7uixcvdnNzy8rKIoTExMSMHj1aX19/+fLlo0aN0tPTO378+BdffDF27NiEhIQ6AVkfd+7cIYRYWVmplpw/fz4kJGThwoVDhgyhlFpaWgqCEBQUdP78+VGjRi1evNje3j4qKurDDz+cP3++kZHR3LlzCSFbtmzJycmZMmVK165d5Vx/+A+Cx0lOTh4xYgTP84sWLRo/fryJicmpU6cWLVo0ceLE2NhYuVsM0DDaTmIA7Xi4RyiK4pIlSwghRkZGBQUF0v96hJTSmJiY2utu2LCBPNSbLCkpsbOzMzExKS4uliQpISGBEDJ9+vTHFSBv/Jtvvnlcg4b2CPv378/zfO2Wnp6elNLjx4/XXrhp0yZCyKuvvvq4z5Ue0yPcvn27/Evj0qVL0v96hISQ33//vXaz3bt3E0K6detWU1OjWnj69GlCiJWVVUVFhbwkLy9Prrn2uvXpEfr5+RFCduzYUXtFeaBpcHDwE3YK4HHQIwSddvny5TfeeIMQUl5efvny5ZSUFELI0qVLa/cIfX195aRR2bp1KyFE7vmptGnTZtasWatWrTpz5kxQUJCFhQUh5Pr162VlZY/s5MkNLl68qFQqVacWn8UHH3zAsqzq7dWrVxMSEgYOHOjv71+72Ysvvvj2228fPXr0qRvMzs6WD051dfW1a9fi4+MJIa+99lqfPn1UbZycnGbNmlV7rf3798vF6Ovrqxb6+PgMHjw4Kirq1KlTY8eObdwOyiVFRER07NhxxowZtZcHBga6urqGh4fzPM9x+LUGDYNvDOi0O3fu/Pzzz/JrY2NjX1/f999/PygoqHabh0dIXr58mVK6Y8cOufejcuXKFUJIeno6IcTV1dXPzy8iIsLNzW3s2LEjRozw9/d3cXFRNR45cqSrq+uePXuio6MDAwN9fX39/f0tLS0bvS91Zh1cvnyZEFJVVfXJJ5/UaWloaJiVlaVQKGpn1cOKi4tVB0dPT69fv36vv/76K6+8UruNu7t77fQlhCQlJRFCao8FlfXt2zcqKiopKelZglDeKYZhHt4pSZIqKyvz8vJUQ5kA6glBCDotMDBQPkfKcZyZmdkj29Qe7kgIUSgUlZWVlNKNGzc+3NjS0lIURUIIpfTgwYPLli3btm3bjh07duzYQQgZNmzY+vXr5cQyMzOLjo7+/PPPDx48uGHDhg0bNnAc9/zzz//www+2traN2BcbG5vab4uLiwkhN27cuHv37iPrrK6ufnIQdu3aVT7/SSmV+68Pq3NwCCEPHjwghDy8C/IY1/Ly8ifvxZOVlJQQQu7evatK6NosLS1ramqeZfugmxCEoNP09fUb2gnT19c3MDAQBOHevXtPHuJhYmKyfPnyZcuWJScnnzx5cvv27adPn/b3909OTpZPljo6Om7cuPG///3vpUuXTp48uWnTph07dty7d0++oibPspBjtbaKior61Cnn+qxZs3799dcG7aAKy7JPPTi1x83W/tzc3FxnZ+fay7Ozswkhzzg7U954QEDAoUOHnmU7ALXhFmsADebl5cXzfD3v+0Up7d69+7x586KiokaMGHH//v06d3HjOG7AgAGffvppYmKio6PjmTNn8vPzCSEmJiZmZmby+JHakpOT61kkIUTzd4zz8PAghMizA2u7cOGC6qeNJu9UbGysIAjPsh2A2hCEAA328ssvE0IWL16sUCjq/KiiokLuw1VWVtbpzFFKHRwcCCHy6Tv5FGJtxsbG8hlI1fm99u3b5+bmyqNUZGlpaXUuTD6Op6enp6dnUlKSfO63joc/vanId8f+4Ycfap+lPHnyZGxsrI2NzbBhw55l487OzqNGjcrNzf3hhx8e/qn6dgpaN5waBWiwOXPm7N27Nzw8fNCgQfPmzfPw8JAkKT09PTIycufOndnZ2UZGRidOnHj33Xdffvnlfv36tWvXrrKy8vDhw7t27bKxsfH19SWErFy5MjQ0dPbs2R4eHi4uLnl5eZs3b05KSho0aJDqpOL06dOvXLkyZcqUZcuWubq6Xr58+auvvnJ2dr5169ZTi6SU/vrrrz4+PnPmzImJiRkzZky7du3y8vJu3ry5e/fu9u3by/M3mlxwcPDw4cMjIyNHjx69cOFCR0fHc+fOyU+T+OabbxpxU5s6fvrppwEDBnz88cdXr16dMGFCp06dCgsLU1NT9+7dq6+vHxIS0hQ7ATpG2/M3ALTjcXeWqU2OiiVLljz8o6qqqnfeecfAwKD2/yaO4/z8/BQKhSRJ586dqz0HQ+bu7n7hwgV5C7/88svDlxh9fX2zsrJUn1JdXT1hwgTVTyml77333tq1a8mj5hHm5uY+XGd8fHzfvn3rfIqtre369eufsOOPu7NMbao7yzz8o9LS0smTJ9f+RHNz8w0bNtRu0+h5hJIk3bhxw8fHp85OWVlZLV269AkFAzwOlfCEetBJDx48yMvLMzExUd2x82Hl5eX5+fmWlpaPGzNSVFQUFRUlj5pxcnLy8vKqfdcVURSvXbuWmpqan59vYWHRqVMnLy+v2jcaVSgU8fHx6enppaWldnZ27u7u7u7uD39KXFxcQkKCoaGht7d3x44dy8rKCgoKrK2t27RpIzfIysqqqalxc3OrM5NB5fr16/Hx8RUVFTY2Nm5ubnXud/qwmpqarKwsfX39OgNeHm5jamr6uDGuqamp0dHRFRUVTk5Ow4YNqzNMRr6Jj4GBgZOTU+2FaWlpRkZGqs+tqKi4f/++lZXVw39V3Lx58+LFi2VlZdbW1i4uLn379sUMQmgcBCEAAOg0DJYBAACdhiAEAACdhiAEAACdhiAEAACdhiAEAACdhiAEAACdhiAEAACdhiAEAACdhiAEAACdhiAEAACdpitBuGLFioefmPNI8j1Y1V0PkEc9chbUAd9njcFXWjOa/DjrShCuWbOmuLi4Pi15nq9nZMIzqueT1uEZVVdX4zG2moGvtGY0+XHWlSAEAAB4JAQhAADoNAQhAADoNDU+x7KgoOD48eMGBgZjxowxMTF5uIFSqTx+/HhBQcHw4cPd3NxUyzMyMiIjI21sbAICAlRP2hRFMSIiIisra8iQIZ07d5YXXr9+PTs7W37Nsuzw4cPVtzsAANAqqevBvLdu3fL29vb39y8qKrpz505MTIzqadoyQRD8/Pyqq6s9PDz279+/f//+YcOGEUIiIyMnT548efLka9euGRsbh4WFyQ/dnjx5clpa2oABA/bu3fvrr79OmDCBEDJ79uy4uDgXFxdCiJGRUUhIyOPqsbe3T0xMfMKzyFWUSqUoigYGBs94BOCpysvLzczMtF1F61dVVaWvr/+4h9dDE8JXWjOa/jhL6vHKK6/MmzdPkiRRFP38/FauXFmnwaFDhzp16lRdXS1J0o8//ujj4yMvHzJkyI8//ihJUnV1dadOnUJDQyVJioqKsrW1LSsrkyRp586d3bt3lxu/8MILq1evrk89dnZ2OTk59WmpUCjkqkDd5H9QULfKykqe57VdhU7AV1ozmvw4q+sa4ZEjRyZPnkwIoZROmjTp8OHDDzcIDAyUO16TJ08+c+ZMWVlZaWnpuXPnpkyZQggxMDAIDAyUVzxy5Ii/v7/8J0BwcPDNmzfT0tLk7aSnpx8+fPjGjRtq2hEAAGjd1HKNUKlU5uXlOTk5yW+dnJzu379fp01WVpavr6/82t7enmXZ+/fvS5LEsqzqBKajo+PZs2flxqqtGRkZWVlZZWVldejQQV9fPyEh4fbt2+fPnw8ICNi2bRvDPDraq6ur16xZY2pqKr/t3r37uHHjHtlyeqSUXUV2DVc6GDX6AEC9KJVKpVKp7SpaP6VSSSnFXG8NwFdaMxp0nFmWfVwuqKglCEVRlCSJUqqqg+f5h9uoiqOUMgwjt6GUPryiIAiqhbWX//e//5WvfBQUFHh6eu7cuXPWrFmPK6mkpEQ1Uz4vL+9xU4zvVtCLhczQI+TgCKFbm0c2gaYhCAImemsAjrPG4FBrRoOO81NTkKgpCA0MDKysrPLy8jp16kQIyc3NdXR0rNPG3t4+Ly9Pfl1YWKhUKh0dHSVJ4nm+qKjI2tq69ooODg6qxjzPFxYWystV1//btm07cuTIhISExwWhsbHxkiVL6jNYJnSUctIJKTqfjgxjD47ifOzpU1eBxlEqlYaGhtquovWTJAmDZTQDX2nNaPLjrK5rhMOHDz9+/Lj8+vjx46qJDXl5eXJnTm4gSRIhJCwsrHfv3lZWVtbW1r169ZJXlCQpLCxMXnH48OEnTpyQVzx58qSdnZ0csSqCICQkJNSeg9Fo1gbk6ChpcnumuIb4H+V3p+GEEgBAa6aueYQff/yxn58fIaS4uPjUqVOrV68mhFRWVtrZ2SUkJPTu3Xvq1KnLly+fPn16nz59Vq5c+dNPP8krLlq0aN68eZmZmfHx8QqFQh444+/vb29vP3HixGHDhq1Zs2bRokUsy0qS1L9//4CAAENDw2PHjimVypdeeqlJijdkyR8j2PmxZM01cWakcK+CfNATdx4AAGid1PX7vV+/flFRUSzLOjk5xcfHOzg4EEIMDAw2btzo6upKCDE0NIyOjvb29q6oqDh48KAceISQ559//sCBAxUVFd7e3ufPn5eHlTIMc+LEibFjx5aUlPz2229z584lhFBKFy9ebGhoqFAo3nzzzcuXL6vGwjw7hpLVA9mVA1hCyIexwrvRgog7+AMAtEbqmlDf3DR6Qv0faeLs00KNQCa1Y7b5skZqvBWPzsHsY83AhHqNwVdaM5r8OOOM31M834EJG8NZGpD96aLfUb6wRtsFAQBAk0IQPp2PPT0/nnMzpVG50uAQPq1cJ/rQAAA6AkFYL90saHQQ52VNb5ZKg0L4C/nIQgCAVgJBWF8OxuR0IBfgTPOqyPAj/JFMZCEAQGuAIGwAMz0S6s+91IWp4MmEcP6XFEwxBABo8RCEDaPHkE0+7GIvhhfJ6+eEzy8J6BgCALRoCMIGo4R8+Ry72YfVY8jSy+KLpwQFeoYAAC0WgrCRXurC/BnAmeuRranimGN8qULbBQEAQKMgCBvPz4lGjuMcjMnJ+5LPYT6rAmdJAQBaHgThM+nTlkaN57pZ0CtF0qAQ4VoxshAAoIVBED6rdmb03HhuiD3NrJCGhvKnspGFAAAtCYKwCVgZkPAx3JT2TImCjD7G77yNwTMAAC0GgrBpGLLkj5Hskj5MjUBmRQpfxOMp1QAALQOCsMlQQr7ow64eyFJKvowXXz0r8OgZAgA0ewjCJvauB/PHCNaQJRtviFNOCJW8tgsCAIAnQhA2vcntmYixnLUBOZQhjviTz6/WdkEAAPB4CEK18Laj54O49mY0Nk8aHMKnlmEoKQBAM4UgVJeubWh0ENe3LU0tkwaH8DF5yEIAgOYIQahGdkbkVCA3zoXmV5ORf/KHMjB4BgCg2UEQqpcJRw6O4l5zZyp5MjlCWJ+ELAQAaF4QhGrHMeTnIezSvqwokXlRwsdxeHITAEAzgiDUkEWezO++rD5DvrsizowUajDhHgCgeUAQas4LnZg/R3Nt9Mmu2+LoY3wJntwEANAMIAg1aqQjPRPIOZnQU9nSkFD+7gOcJQUA0DIEoab1sqLRQayHJb1eLA0KERIKkYUAANqEINQCFxMaFcSNdqb3K6Whh/k/M5GFAABagyDUDjM9csif+1cn5oGSBIfz/03BtAoAAO1AEGqNPkO2+LILPRleJG+eE76Ix7QKAAAtQBBqEyVkWV92wxCWZciX8eIrZwQleoYAAJqFINS+N9yZg6M4E45svikGHufLldouCABAlyAIm4VxLvRUIGdnRMKyJJ/D/P1KnCUFANAQBGFz0bctjQ7iurahCYXSoBDhejGyEABAExCEzUh7MxoVxA2xp3cfSENC+chsZCEAgNohCJsXKwMSPoab2p4pUZDRR/ntqRg8AwCgXgjCZseQJbtGsPN7MgqRvHBKWJGILAQAUCMEYXPEULJyALtmEEspWXhBePO8wCMNAQDUA0HYfL3Tg9k7kjXiyIZkcUI4/wDTKgAA1ABB2KxNbMecGMu1NSRHMiXfI3xOlbYLAgBodRCEzd0gWxo1nutoTi8VSIND+JQSDCUFAGhKCMIWoHMbGh3EDbSld8ol71D+bA6yEACgySAIWwYbQ3JyLDexHVNUQ/yP8n+kYfAMAEDTQBC2GEYc2TOSfbsHUy2QGZHC91eRhQAATQBB2JKwlPw4iF05gCWEfBQrzIsS8OgmAIBnhCBseeb3ZHaNYA1Zsj5JnBQhVPLaLggAoCVDELZIU9szEWM5awMSkiH6HuFzMa0CAKCxEIQtlbcdjQriOpjRC/nSIEyrAABoLARhC9alDY0O4vrb/DWt4hymVQAANByCsGWzNSKR47ggN6aohozCtAoAgIZDELZ4xhzZ78fO645pFQAAjYEgbA1YStYOZr/HtAoAgIZTYxCKolhYWMjzTxrdX1JSUlVVd8ijUqksLCyUpLq/y0tLSysqKpq4ylbkg39Oq6jAtAoAgHpQVxBGR0e3b9/e09PT2dn56NGjDzcoKSnx8/Pr3Lmzg4PDJ598olq+d+9eR0fH3r17d+nSJSEhQV5YVVU1ceLEDh06ODk5zZ07VxT/cfbv559/trKy2rNnj5r2pQWpPa1iOKZVAADUg1qCUJKkl1566bPPPsvMzNy4cePs2bOrq6vrtFm6dKmJiUlubu6NGze2bdt28uRJQkhZWdmcOXP27t177969N99885VXXpEb//jjj4WFhTk5OXfv3j116lTtzLt79+769ettbGwUCoU69qXFkadVdDTHtAoAgHpRSxDGxsbm5+e//PLLhJBx48ZZWVk93Cnctm3bu+++yzCMnZ3dzJkzt27dSgg5cOBAly5dhg0bRgiZO3ducnJyUlISIWTr1q3//ve/9fT0zM3N58yZs23bNtV23njjjWXLlpmYmKhjR1qoLv98WsUZTKsAAHg8tQRhWlpax44dOY6T33bt2jUtLa12g4qKitzc3K5du8pvu3TpcufOHXlF1UJjY2MXFxd5xTt37qiW197a5s2bbWxsAgMDn1qSKIoZGRlp/1NUVNQE+9mM1Xlaxa7bGEoKAPBonDo2WlZWZmxsrHprampaUlJSu0FpaSkhRNVG1eCRKyoUisrKyocbZ2dnr1ix4ty5c/UsacqUKSzLym+HDBnyn//855EtlUqlKIpKpbJ++9qs/TaAOBhwP91gZ0YKN4sU87s1r/EzFRUVlFJtV9H6VVVV6evrq778oD74SmtGg46zoaGhqlf2OGoJQhsbm9rJV1xcbGdnV7tB27ZtKaWlpaWWlpaEkJKSEltbW3nFe/fu1V7R1tZWX1/fwsJCzs7ajT/77LP+/fufPn1aXhgXF9etW7c+ffo8siQLC4sLFy7UKeOR5CA0MDBo6F43T+uHks6W4gexwpJENqtGb/1glms2U2YkSTI1NdV2Fa0fy7IIQs3AV1ozmvw4q+WXooeHx82bN8vLywkhoijGx8f37NmzdgN9ff2uXbtevHhRfnvhwgW5Qc+ePS9duiQvzMvLu3fvXo8ePeQNPty4c+fOCoViz549e/bsKS4ujo2NjY+PV8futHTveTB7RrJGHPk5RQwK5x+0hr4uAEDTkdRjxIgRr732Wmpq6sKFC3v06CGKoiRJ+/fvnz17ttxgzZo1PXr0uHr1akhIiLm5eVJSkiRJSqXSzc1t6dKlqamps2bNmjBhgtx4x44d7dq1u3jx4smTJ62srM6fP1/n47y8vLZt2/aEeuzs7HJycupTuUKhqK6ubuj+Nn/RuaLNVgX5ReG1X5lVIWq7HEmSpLKyMm2XoBMqKyt5ntd2FToBX2nNaPLjrJZTo4SQHTt2fPjhh8HBwe7u7qGhofL5XCMjIysrK7nBvHnzysrK/vWvf5mbm2/fvr1bt26EEI7jjh07tmDBgp07dw4YMODHH3+UG8+YMSMvL+/111/X19dft27d4MGD63zcqFGj3Nzc1LQvrcNAWxodxI07LlwulAYeEo4EsD2tcDEDAIBQ6aEbuLRK9vb2iYmJOniNsI6iGjIhnD+bI7XRJ3tHcn5O2szC8vJyMzMzLRagIzBYRmPwldaMJj/OzWbgBGiElQEJH8NN78iUKsjY4/zmm5hWAQC6DkGocwxYsmM4u6A3oxTJnDPCkku4QTcA6DQEoS6ihHzdj90whOUY8n+XxRdPCQr0DAFAVyEIddcb7kzIKM5Mj2xNFUcf5Utwr1YA0EkIQp02xoWeCeQcjWlktuQdwqeX4ywpAOgcBKGu87SmMcFsTyuaVCINDOHj8pGFAKBbEIRAXEzo2UBulBPNrSLDj/CHMnDBEAB0CIIQCCGkjT45EsDN6cJU8mRyhPDjdWQhAOgKBCH8RY8hG33YZX1ZUSLvRgvvxwgizpICgA5AEMI/LPRktg1nDViy+po4OUKobF4PbgIAaHoIQqhrZkcmbAxnZUAOZoi+R/icKm0XBACgTghCeAQfexobzHVpQy/kS30P8olFOEkKAK0WghAerZM5PTeeG2RLsyok38P8yfvIQgBonRCE8Fg2huTEWG5Ke6ZEQcYc43/DHboBoDVCEMKTGHFk9wj2o16MQiQvnxEW4w7dANDqIAjhKRhKvu3/1x26v7osvnBKqBG0XRMAQNNBEEK9qO7QvT1V9D/KF9VouyAAgCaCIIT6GuNCz47nnE3omRxpcAh/uwxnSQGgNUAQQgP0tqIxQaynNb1RKg0M4aNykYUA0OIhCKFhnEzo2UBunAstqCYj/+R3p2EoKQC0bAhCaDBTPXLIn/t3d6ZaIDNOCl8nIgsBoAVDEEJjsJSsG8yuGshSSj69ILx6VlAiDQGgZUIQQuO978Hs82ONObLxhjj2OF+i0HZBAAANhyCEZzLBjYkK4pxNaESW1P8Qf6sUw2cAoIVBEMKzkoeSelnTW6XSoBD+XA6yEABaEgQhNAEnE3oqkPN3ooU1xP8Yv+8OLhgCQIuBIISmYa5HjgRwr7szVTx5/qTw3RVkIQC0DAhCaDIcQ/47hP22P0sI+ThOeOOcwCMNAaDZQxBCE/uoF/PHCNaIIz+niGOP86UYSgoAzRuCEJre5PbMqXGcvREJz5K8Q/n0cgyfAYDmC0EIatHfhl6cwHla0+vFUt+DGEoKAM0XghDUxcmEnhr391DSPRhKCgDNEoIQ1KiNPjkSwL3hzlTxZNoJ3JUUAJojBCGoF8eQDUPY7wf8dVfSV87grqQA0LwgCEETPujJ7PNjTTiy6aYYcJQvxgPuAaDZQBCChkxwY04Hcg7GJDJbGoQH3ANAs4EgBM15ri2NC+Z6W/3vAff5+PoBgPbhNxFolLMJPTeeC3SlBdUk+LT+1lRcMAQALUMQgqaZ6ihWmeAAACAASURBVJGDo7h3PZgagbx4Svj8koCTpACgRQhC0AKWktUD2ZV9lCxDll4WZ5wUqgVt1wQAugpBCFrzWmfhsD9nrkd2p4nDj/C5VdouCAB0EoIQtCnAmZ4P4tqZ0Zg8aWAIf60YZ0kBQNMQhKBlHpY0NogbZEvTyyXvEP74PWQhAGgUghC0z9aInBzHTe/IlClJYBi/PglDSQFAcxCE0CwYsmTHcHZJH0YQybwo4e0oPNQXADQEQQjNBSXkiz7stuGsIUvWJYnjw/gypbZrAgAdgCCE5mVmR+bEWM7WiBy7Jw0O4e/gob4AoGYIQmh2BtvRmCCuhyW9XiwNDOGjcpGFAKBGfwfhli1b9Ovt1q1bWiwaWr32ZjQqiBvtTPOqyIg/+W24ExsAqA2neiUIgqOj45w5c566zhdffCFJ+CMd1MtcjxwO4N6LFtYlibNPCSkl0ld9WartqgCg9eFqv3F1dV28ePFT1/nyyy/VVg/A31hK1g5mu1nQd2OEZQnijVLy+zDWmHv6igAA9ff3qVFvb++PP/64Puv8/PPP9vb2T24jSdIPP/zg4+MTFBR09uzZR7aJjIwMDAwcNmzY2rVrVV3M6urqRYsWeXt7z5gxIzk5WdU4Li5u0qRJQ4cO/frrrwXhrxtTrl69evz48d7e3tOnT4+Ojq5P8dDivNWdORLAWeiTvXfEYYf5+5U4GwEATUpSj7Vr13bt2vXcuXObN282NzdPT0+v0+DWrVtmZmZbtmw5e/Zsp06dfvnlF3n522+/7evrGxcXt3TpUkdHx6qqKkmScnNz27Rps379+ujoaE9Pz+XLl8uN161bd+TIkdjY2G+//dbExCQ1NfVx9djZ2eXk5NSncoVCUV1d3Zh9hgYqKyurf+OkYrHjbiX5ReG8QxlfIKqvqtansrKS53ltV6ETGvSVhkZr8uOsriDs0qXLnj175NfTpk37/PPP6zT46KOPXnjhBfn1jh07evXqJUlSeXm5qanplStX5OWenp7btm2TJOnbb78dPXq0vDAsLMzJyUkQhDob7NGjx65dux5XD4KwGWrotzm/SvIJVZJfFCabFfvv1P0CwOMgCDUGQagZTX6c/zF9IjQ0tEOHDoGBgZmZmYSQ6OjoiRMnNqKXWVVVdfPmzYEDB8pvBw4cePny5TptEhISaje4du0az/Nyl65nz551VqzTOCsrKz8/X36bn5+flpa2ffv2kpKSoUOHNqJaaCnaGpITY7m3ujMVPJkcIXwRjwcZAkAT+MfAg7lz53766ac5OTnDhw8/ceJEozeam5tLCLG0tJTfWllZyUtqy8vLs7CwUDUQRTEvLy83N1e1lrz87t27cuP+/fvLC83MzPT09HJzc+3s7Aghq1at2r59e35+/ooVKxwdHR9XUmlpqZ+fH8f9tb/9+/f//vvvH9lSqVSKoqhQKBq+39AwDx48aMRaX/ckbgbcwgTuy3jxWgH/Uz+FEYbPPFFVVZW+vj7LstoupPVr3FcaGqpBx9nQ0FBPT+/Jbf7+FVJSUtK2bdt58+YRQrp37z5y5Mjly5c3rkpzc3NCSGVlpYmJCSGkoqKiTZs2ddqYmZlVVlbKrysqKuS1zM3NVQtrr1i7sUKhUCqV8kcQQlasWLFixYr09HQfHx8XF5fJkyc/siRTU9NVq1ZZWVnJb52cnMzMzB7ZUg5CAwODxuw5NNDj/hWe7OPnSDcbcVaksO8uk11jdMCPszVq8tJaD47jEIQa07ivNDRU0x7nv0+NmpubP3jwQJIkQsjMmTM///zzN998s3EbtbS0NDMzu337tvz29u3bbm5uddq4ubmlpaXJr1NTU9u2bWtqaurm5lZSUlJYWKha0dXV9eHG+vr6Dg4OtbfWrl27kSNHxsTEPK4klmV79er13P88ddQrNHPjXZnz4zk3UxqVK/U/xF8twllSAGikv4OQYZiJEyempqbKb1988cXly5f36tWrERullM6YMeOnn34ihBQWFu7evXvGjBmEkNLS0hUrVsj9vxkzZuzcubO4uJgQ8p///GfmzJmEEEdHRx8fnw0bNhBCbty4cerUqWnTpsmNDx48eP/+fbnx5MmTDQwMKisrb9y4IX9iRkZGREREnz59Gn8koKXpaUXjgrnBdjTjgeQdyodk4O4zANAotUfOrFixIjIyskkG4WRnZ/fp06dDhw7W1tbvvPOOKIqSJN25c4cQcv/+fUmSRFGcO3du27Zt27dv379//7y8PHnFK1eutG/f3t3d3dLScvXq1aoNfvrpp5aWlp07d/bw8JAnYxQUFDg5OTk6Onbu3NnMzGzBggXypzwSRo02Q00y9Kual/4VyZNfFMyviq8TMJT0ETBqVGMwalQzmvw4U6nWzdLc3Nzk8TJNlbKZmZkmJiaqK3MPKywsrKqqcnZ2rr1QEITMzExra+s6Z4FLSkrKyspcXFwo/ftOW9nZ2TzP29vbP/lyqL29fWJiojy+5slwjVBjysvLm+pE/5pr4vxYQZTI9I7MpqEshs/UhsEyGtOEX2l4giY/zur9heHi4vLkBtbW1g8vZFm2Xbt2Dy+3sLBQDTRVqXOxEHTTux5M5zZ0xkl+120xo1zaP4qzx/AZAKgfPIYJWomxLvTMeM7VlEbnSQMP8YkYPgMA9VO3R3j9+vX9+/c/YYVJkyapsx6AxuttReOCuYnhfHSeNCSU3+rLTnDDn3oA8BR1rxHKE9ifQGqZD2DCNcJmSE0XVGoE8tpZYWuqyFCytC/7SW9Gxx/ehGuEGoNrhJqh9muEs2fPnjp1ahN+AICGGbBkiy/bw5IuvCgsvCBcK5I2+rCGSAEAeIy6Qeju7h4YGKiVUgCa0ILeTA9LOjOS33FbTC2TDoxiHY11vGcIAI+GKyjQagW60qggroMZjcuX+h8SLha0yLP6AKBuCEJozTwsaWww5+tAsyokn8P8rtu4+wwA1PWPIHz77be9vb21VQqAOrQ1JGFjuDfcmSqezIwUPrsoiOgZAkAt/7hG+OGHH2qrDgD10WPIhiGshxV9P0ZYliBeLyZbfVnTpzyYBQB0xd89wm3bto0ePbo+61hYWKjuzQ3QUszrzhwN4KwMyMEMcXAof6ccHUMAIKR2j1CpVD548KD24wAfp7y8XBRxrQVaHj8nGhfMBYcLV4ukfgf5P0ZyIxwxlBRA1/3j1Oj58+flR+kCtFYdzWl0EPfCKeFQhhhwjF85gH2nB4aMAei0v4Nw0KBBa9euredqtra26qkHQO3M9Mh+P/bTC+TbK+K70UJKibRmEKuHNATQVX8Hobu7u7u7uxZLAdAYhpJv+rO9rOirZ4X/JIvJJdKekVxbQ22XBQDagD+DQXfN6sScCeScTOipbKn/If4KHlgBoJMQhKDT+tnQuGB2gC29Uy55h/L77mAUGIDOQRCCrnM0pqfHcS93YR4oydQTwicXMOMeQLcgCAGIAUs2+bD/HcJyDPkmUQwK40sV2q4JADQFQQjwl9fdmSMBnJUBOZIpDQnlb5ehYwigE+o+hqmO6urqEydOZGdnm5ubDxo0yMXFRTNlAWjFKCcaG8wFhwnXiqX+h/jdIzg/J8y4B2jlntQjTElJcXd3X7duXUxMzL59+7y9vdetW6exygC0opM5jQnmgtyYohoy5jj/wzUMnwFo5Z7UI1y6dOn+/fv79Okjv62qqho+fPjcuXM57in9SIAWzUyPHPBjl8STZZfF+THC5QLp56F4xj1Aq/WkHmF5eXm3bt1Ub42MjFxcXCoqKtRfFYCWMZR89Ry7ZyRrqke2poo+h/l7FbhkCNA6PalvFxgYGBQU9NZbbzk5OZWXl4eFhZWVlbVp00ZjxQFo1+T2TJc2dEK4cCFf6nuQ3zuSG2KPS4YArc2TgvC1114zNTXdvHlzZmamhYXFsGHDdu3apbHKAJqDnlb0wgRu+kk+PEsa+Se/ZhA7txvGWgO0KlSS6nvCR6lUVlZWttAeob29fWJiop2d3VNbKpVKURQNDAw0UJWOKy8vNzMz03YV9SJIZEGcsPKqSAh53Z1ZO5jVbzlpWFVVpa+vz7K4yKl2Legr3aI1+XFuwP/m2NhYa2vr+/fvN+HHA7QILCXfD2C3+bJGHPk5RRx+hM9++oM7AaBlePSp0a5du+bn59dZWFJSQgipz5N7AVqlWZ2YbhZ0YoQQlSv1Pcjv82MH2uKSIUCL9+ggfOGFFx48eKB6q1Aorl69GhER8dNPP3Xq1ElTtQE0O33a0osTuKkn+NPZku8Rft1g9tWuLeckKQA8SgOuEX7zzTdr165NS0vT19dXa03qgGuEzVDLvaDCi+SDWOHH6yIhZG43Zs2gZn3JENcINablfqVbFm1eI5w1a1ZWVta1a9ea8OMBWiKOIWsGsb8PYw1ZsiFZHIFLhgAtWQOCUL46aGVlpbZiAFqS2Z2Zs+M5V1N6Plfqe5CPzsOMe4AWqb5BmJub+/HHH8+ZM6ddu3bqrAegJenbll6cwPk60PuV0vAj/M8puDEpQMvz6CDs2rWrVS3m5ub29vaHDh06cOCAauHWrVs1XCtAM2RjSMLHcO95MDUCeeOc8Po5oUbQdk0A0BD1GjX6SO7u7mqoB6Dl4Rjyw0C2b1v6+jnhlxQxsVDa58c6m2BmBUDL0IBRoy0aRo02Q61viF1CoTQxQkgvl2yNyB8juGEOzSILMWpUY1rfV7p50uaoUQB4Mk9renEC5+9E86qI31F+NZ5lCNASIAgBmpK1AflzNPdJb0YQyfsxwsxIoZLXdk0A8EQIQoAmxlKyoh+714810yM7b4uDQvjbZTpxAQKghUIQAqjFpHZMbDDnbkGvFEl9D/JHMpGFAM0UghBAXbpZ0LhgblI7pkRBgsL4L+IFEWkI0PzUDcL09HT5uROSJF28eFEbJQG0HmZ6ZK8f+3U/lhLyZbwYGMYX1Wi7JgD4p7pBGBIS8uWXXxJC9uzZ8+2332qjJIBWhRKyoDdzfAxnY0iOZkp9D/LxBegYAjQjdYPw3//+94ULF5KSkpYtW/bdd99ppSaA1mekI704getnQ++US96h/OabmFkB0Fz8HYQKhSIiIiIyMnL8+PF+fn5du3a9detWREREbm6uFusDaDVcTenZQO4Nd6ZaIHPOCG/gZmwAzcPft1irrq7es2cPISQ/Pz83NzczM1N+a2FhUZ8bsgDAUxmwZMMQdqAtfStK+DlFvFwo7R3Jupo2ixvQAOisR9xi7cUXXxwxYsSPP/4YFRXVau40hlusNUO6fD+qy4XSlAghrVxqa0i2D+f8ndSYhbjFmsbo8ldak9R+i7Vz585lZGS8+OKLgYGBK1eubMJPAgAVL2t6cQI3zoUWVJMxx/gv40XMrADQlrpBmJubK4+R+fDDD7VRD4CusDQgoQHc/z3HUkK+iBfGHecLMbMCQBvw9Im6cGpUY3AeSRaWJc2K5AuqiZsp3TOS7WfTxKdJcWpUY/CV1owmP86Pfh5hk8jPz9+zZ49SqQwODn7kc+15nt+3b19GRsagQYOGDh2qWn7nzp1Dhw4ZGBhMnTq1bdu28kJJkkJCQlJSUry8vPz9/eWFZWVl4eHhaWlpjo6OEyZMMDExUd/uAKiJvxONn8g9f0KIyZOGHuZXD2TndsMtnwA0R13/3/Ly8ry8vOLi4tLS0vr06XP9+vWH20ybNu2HH3548ODBrFmz1q5dKy+8cuWKl5dXenp6TEyMl5eXfJsbQsibb775+eefV1ZWzps3b/HixfJCHx+fzZs3FxQU/P777927d8dMD2ihXEzo6UBuXnemRiBvnhdeOCVU4JkVABojqceXX345YcIE+fVHH300e/bsOg0uX77cpk2bsrIySZLOnj1ra2tbXV0tSdKsWbMWLFggtwkKClq6dKkkSRkZGYaGhtnZ2ZIkJScnm5iYFBcXS5KUn58vtxRFsX///itXrnxcPXZ2djk5OfWpXKFQyJWAusn/+lDbzlTB9DcF+UXRY68yuVhskm1WVlbyPN8km4Inw1daM5r8OKurRxgWFhYYGCi/DgwMDAsLq9MgPDzcx8dHPs/r7e2tVCoTEhIIIcePH6+9Ynh4OCHk5MmTXl5e9vb2hBB3d3dHR8fz588TQlQnTimlRkZGDIMTStCyTe/IxAVz3S3o9WKp/yF+123cgAZA7dR1jfD+/ftybhFCHBwc8vLylEqlnp5e7QYODg7ya0qpnZ3d/fv3FQpFYWFh7RXv379fpzEhxN7eXl6ucvTo0evXr//xxx+Pq6eysvLLL79UXUTs2bPntGnTHtlSHizT0P2FRqipqdHX19d2Fc1OByNyZjSZF8vsukNmRAqn7/PfPCcZPMNIl5qaGkmSMFhGA/CV1owGHWc9Pb2n9pHq/njjxo09evTQ19d3dnZ+9dVXHzx40JgyCaH07/Go8gtK6eMayG3o/9ReUV7rkY1Vby9evPjSSy/t2LHD1tb2sfvJMBa14MsKzZmpHvltiPjjAMmAJRtu0JFhTEYj/yMCwNP9o0cYGhr66quv2tjY+Pv7p6enb9y4saqqavv27Y3YrqOjY05Ojvw6Ozvb1taW4/7xWQ4ODmfOnJFfi6KYm5vr6Oiop6dnbW2dk5PTuXNneUW5I+jg4JCdna1aNycnx9HRUX6dmJg4fvz4X375ZdSoUU+ox9DQ8N13363P9AmGYTB9QjMUCgWO8xO83ZMMdpCmnhAuFkiD/mR+H8YFujZmZoUoipg+oRn4SmtGkx/nf/QIf/vtt44dO964cePw4cNXr16dN2/eH3/8UVVV1Yjt+vv7h4aGyq9DQ0MDAgLk17du3SovLyeEBAQEnDlzpqysjBBy7tw5AwMDT09PefnDK/r5+SUkJMinQ5OSknJycry9vQkhKSkp48aN++GHH4KCghq1+wDN2nNt6aUJXJAbU1RDgsL4BXECj9P2AE3tH6ccPT09x48f/9VXX8lvr1271rNnz+TkZHd394ZuNz8//7nnnhs6dKiFhcWuXbvOnj3bvXt3QoiLi8uqVaumTp1KCJk2bVpaWtqoUaO2bNmycOHCt956S/5QHx+fmTNnFhUVRUVFXbx4UR4RM2/evFOnTgUHB+/evXv27NnyDAp3d/fKysqBAwfKH+rv7//qq68+sh5MqG+GMPu4niRCVl0VP70gKEUyxJ7uHM46mzSga4gJ9RqDr7RmqHdCfUlJiZWVleqtnEBFRUWN2K6NjU1CQsL+/fsVCkViYqKzs7O8fNOmTR4eHvLrnTt3hoaG3r59e+/evaow8/DwSExMDAkJMTQ0XL9+vaWlpbx87dq1x44dS05O/vXXX319feWF33//fe0Oa8eOHRtRKkAzRwn5oCczyJZOPymcy5H6HOC3+HKjnfHMCoCm8Y8eYbt27d599933339ffpuTk+Pg4HD+/PnBgwdrqbwmgx5hM4Q/nxuqoJrMPs0fzZQYSj7pzXzZh+XqMWMIPUKNwVdaM5r8ONcNwry8PENDQ/mtKIqlpaVmZma1x7k0roOodQjCZgi/NRpBIuTrRHHxJYEXiY893TmCdTR+StcQQagx+EprhnpPjY4bN051SzMAaIYoIZ/2Zgbb0pmRwpkcyesAv2UYF4DTpADPAE+fqAs9Qo3Bn8/PIq+KvHCKD8t6+mlS9Ag1Bl9pzVD7g3kBoEWwNSJHR3PL+rIMJcsTxOF/8vcqdOKPWoAmhyAEaKkYShZ6MifHcs4m9FyO5HWAP5KJLARoMAQhQMs21J5ensiNdaEF1WT8cf7DWEGJSfcADYEgBGjx2hqSwwHct/1ZjiErr4pDQvk75egaAtQXghCgNaCEfNSLORPItTOjcfmS1wF+7x10DAHqBUEI0HoMtKXxE7hJ7ZhSBZl6QnjzvFCFJ90DPA2CEKBVsTQg+/zY9YNZQ5ZsSBYHhPDJpdquCaB5QxACtEJvdWdig7luFvRqkTT0GPfrDVwyBHgsBCFA69TLil6YwL3chankydwoadpJoVSh7ZoAmiUEIUCrZcKRTT7sZm/BXI/8kSZ6HuCj89A1BKgLQQjQyk1rJ10Iov1taHq55HOYX5YgCkhDgFoQhACtX0dzem48t6A3I0rks4uCH+7HBlALghBAJ+gx5Ot+7PHRnIMxOZUt9d7P70/HREMAQhCEADrFz4kmTtIb50KLasjkCOGNc0IlJhqCzkMQAugWG0MSGsCtGcQasuTnFLHvQT6hEKdJQachCAF0DiXknR5MbDDXw5Iml0gDQ/hVV0WEIegsBCGAjuplRS8Ec//uzigE8kGsEHCUv1+JNARdhCAE0F1GHFk3mA3x52yNSHiW1Hs/fzADI2hA5yAIAXRdoCtNnKQ32pkWVJOJ4cLr54QKjKABXYIgBABib0T+HM39OIg1ZMkvKWKfA3xcPk6Tgq5AEAIAIYRQQt7uwVyYwPW2ojdLpSGh/FeXRR4nSkEHIAgB4G8eljQ2mPuwJyNIZPElwecwn1qGriG0cghCAPgHA5Z8N4ANH8O5mNDoPMnrAP/rDXQMoTVDEALAI4xwpFcmczM6Mg+U5LWzQnC4kFel7ZoA1ANBCACPZqFPdgxndw5nLQ1ISIbYc7/yECZXQGuEIASAJ5nekbkyiRvpSPOqyIRwYc4ZoUyp7ZoAmhSCEACewtmEho/lVg9kjTiy+abYez9/OhsjaKD1QBACwNNRQt71YC5N4Pq2penl0og/+Q9jhWpB22UBNAUEIQDUVzcLGhXELenDMJSsvCr2PchfKkDXEFo8BCEANIAeQ77ow0YHcd0s6PViaWAIv+SSoMQYGmjJEIQA0GB929L4idz8nowokf+7LA4M4a8Vo2sILRWCEAAaw5AlKwewkeO4DmY0vkDqe5D/OlEUkIbQAiEIAaDxfOxp4iTuzW6MQiCfXhC8Q/mUEoQhtDAIQgB4JqZ65CdvNmwM52pKY/MkrwP891fRNYSWBEEIAE3Az4lency90pWpEchHscJQdA2h5UAQAkDTMNcjvw5l/xzNOf/vbt3fXUHXEFoABCEANKXRzvTaZG5OF6ZaIB/HCd6hfBK6htC8IQgBoIm10ScbfdijozkXExqbJ/U5wC9PwDN+oflCEAKAWox2ptemcK+5MwqBLLooDAjhE4vQNYTmCEEIAOpirkd+HsKGjeHam9H4AqnfQX7xJaEGdyiFZgZBCADq5edEr0zi3u7BCBL56rLY5wAfnYeuITQjCEIAUDtTPfLjIPZMIOduQZNKpCGh/HsxQgWv7bIACCEIQgDQGG87enkit9CTYSlZc0302Mcfv4euIWgfghAANMeQJcv6snHB3HNtaXq5NPoYP/uUUFCt7bJAtyEIAUDTPK1pTBD33QDWmCNbU8Vue5XbUjG7ArQGQQgAWsAx5MOezJVJ3EhHWlBNXjgljD7Gp5XjTCloAYIQALSmozkNH8v9Noy1NiDH70k99/HfXsHUe9A09QZhenp6ZmbmExoUFRWlpKQIwj8mFkmSdPPmzby8vDqNS0tLU1JSFApF0xcKAFpCCXmxM5M8Ve9fnZhKniyIE/oe5GMxvwI0SF1BWFFR4efn5+vr6+3tHRgYWF39iKvhS5cu7dSp0/PPP9+5c+ekpCR5YVZWVq9evYKDgz08PP79739L0l//H9avX9++ffvp06d36NAhNjZWXvj777/37NmT47jJkyeraUcAQANsDMlWXzZsDNfRnCYWSYND+XlRQin+6AWNUFcQrl+/XqlUpqampqam5ufnb9q0qU6DlJSU7777Lj4+/sqVK7Nnz54/f768fMmSJf37909OTk5JSQkJCTl58iQhJCcn5+OPPz5z5kxCQsInn3zy1ltvyY27du36008/ffTRR2raCwDQpFFO9Ook7tPeDEvJ+iSx217lrts4Twpqp64g3Llz52uvvcZxnL6+/pw5c3bt2lWnwa5duwICAtq1a0cImTt3bnh4eEFBgSRJu3btmjt3LiHEysrq+eef37lzJyFk7969/fv39/DwIIS8/PLL169fv3HjBiFk4MCBQ4cONTU1VdNeAICGGXFkeT/28kRuiD3NriQzIoWAo3xqGc6UghqpKwjT09M7deokv+7UqVNGRsYTGtjb2xsZGWVmZhYUFFRUVKiWd+zY8e7du4SQjIwM1UITExN7e/uHN/hkgiBcuXLl0v/ImwWA5qmHJT0TyP0ylLUyIGFZUs99/P9dFnGTUlATTk3braioMDQ0lF8bGxuXlZU93MDAwED11tjYuLy8vLy8nBDy8IqPbNygeh48eDB//nw9PT357YABA7777rtHtlQqlaIoKpXKBm0fGqGiooJSqu0qWr+qqip9fX2WZbVdSINNdyJ+Y+lnCdyOO8ySS8KWm/zK5/iR9s33ZCm+0prRoONsaGjIcU9JOnUFoZ2dXXFxsfy6qKjI3t7+CQ0kSSopKbGzs5ObFRcXGxkZ1V7R1tb21q1bqnWLiors7OwaVE+bNm0iIiLqs5YchLVzF9REkiSc1tYAlmVbaBASQkxNybaR5PUc6a3zwvViMuGU3tT2zKqBjLNJc8wbfKU1o8mPs7pOjXp5ecXExMivo6Oj+/TpU6eBp6enqsHFixfNzMzatWtnbGzctWvX6Oho1YpeXl7y1lQjRe/cuVNaWtq9e3c1VQ4AzY2PPb08kfu2P2uqR/bcEbvt5b+9Iiqbb88QWhj2iy++UMd227Zt+8EHH/To0SM5Ofmzzz5bvXq1i4sLIaRbt24DBgxwcnLq0qXL//3f/ymVSpZl58+fP3ny5ICAAEIIpXT58uW9e/cOCwvbsGHDr7/+am5u3qlTp3Xr1t2/f9/U1PSjjz4aMmTItGnTCCEpKSn79+8/ffp0RkYGpbSqqsrV1fWR9Xz//fdvvvlmff6IEEVRkqSndqXh2SkUCvS8NYDneZZlGaZl3z2DpcTbjs7uzNyrIAmFUkSWtPeO5G5BO5g1o64hvtKa0eTHWV2/7keNGvWf//xn3bp1DMP83nP+BQAAIABJREFU9ttvgwcPlpf7+Pi0adOGEGJqanry5MmlS5eGhYWNGzfu448/lhu89dZboih++eWXlpaWx44dc3Z2JoRwHBcREbFkyZJPP/108ODBn332mdy4oKDg0qVLdnZ2dnZ2ly5dwkkJgNbN2YT+MZKNyGLmRQnJJZLfn/zU9szKgYxLszxTCi0FVc1Yb93s7e0TExNxjbBZKS8vNzMz03YVrV/LHSzzBAqRrLoqLr0sVPDEhCMLPdkPejIG2t5FfKU1o8mPc8s+WwIAukmfIZ/0ZlKmctM6MBU8WXRR6LGPD8nAZUNoDAQhALRUziZ01wg2chzX04reLpOCw4WAo3xyiU6c5YImhCAEgJbN14HGT+DWDv5r9n3v/fx7MUJxjbbLgpYDQQgALR7HkHndmZvP683txogSWXNN7LJHuSFZFNA5hHpAEAJAK2FtQP7jzV6ayA13oAXV5M3zgtcBPiILYQhPgSAEgFaltxU9OY7b58d2MKNXi6RRR/nxYfyNUsQhPBaCEABaoUntmKQp3Nf9WHM9cviu1HMf/060UIgLh/AoCEIAaJ0MWLKgN3Preb033BmJkLXXxU67ld9dwVMsoC4EIQC0ZrZGZMMQNmEiN9qZlijIx3GC+15+120Rp0pBBUEIAK1fD0t6dDR3fAzXy4qml0szIoUBh/jT2UhDIARBCAC6w9+Jxk/kNvqwTib0Qr7ke4QPPM5fK0Yc6joEIQDoEJaSOV2Ym1O5pX1Zcz1yJFPy3M/POSNkViAOdReCEAB0jjFHFnkyqdP03unBsJRsvil2+YP/MBbDSnUUghAAdJSNIVkziE2Zys3syChEsvKq2HG3cull8YFS25WBZiEIAUCntTej24ezlyZwY1xoqYJ8fkno+IdyzTXMstAhCEIAAOJpTf8M4E6N4wbb0bwq8l6M0GUP/0uKyOPJTjoAQQgA8JdhDvT8eC7Un+ttRe8+kF4/J3Tby29Nxc27WzkEIQDAPwS60viJ3O4RrLsFTS2TZp8SPPbxO2+LmITfWiEIAQDqYih5vgNzbTL3+zC2ozlNKZFmRgo99/G70xCHrRCCEADg0VhKZndmUqZwvw5l25nRpBJp+kmh137EYWuDIAQAeBKOIa90ZW5O5X4ewrYzo9eLpeknBY99/HZcO2wtEIQAAE+nx5DX3P+Ow+QS6V+nhG57+c03RSVGlrZwCEIAgPpSxeEmH7aTOb1VKs05I3T+g1+fJFbx2i4OGgtBCADQMHoMebkLkzKV2z6c7WFJMx5I86KE9ruVPyRzZbgrTQuEIAQAaAyWkpkdmSuTuP1+bN+2NLeKLLnCue5ULrwg5FZpuzhoCAQhAEDjMZRMbMdcmMAdH8P52IqlCrIiUWy3Szn3nHCrFGNpWgYEIQBAE/B3ooeHK2KCuEntGIVI/psiuu/lJ0UIUbmIw+YOQQgA0GQG2NJ9fmzyFO41d0afIQfSRe9QflAIv/cO5lo0XwhCAIAm1qUN/XkImz5db5EnY21AYvKkqSeEzn/wP1wTSxXaLg4egiAEAFALOyOytC+bMUNv/WC2Sxt6p1yaHyO47FS+E43Lh80LghAAQI1MOPJWdyZ5Chfqz410pOVKsva66L6XH3ucP5op4VZtzQGCEABA7RhKAl1pxFjuyiTu1a6MAUuOZkpjj/Pue/kfroklOF+qVQhCAADN6WlFfxnKZs7Q+7of62ZKb5VK82MEpx3KV88KlwrQPdQOBCEAgKZZG5AFvZnb07hDo1h/J1rFk403xL4H+f6H+I03xArcrU2zEIQAANrBUhLkxhwfw92Yys3vyVgZkAv50qtnBcftyjfPo4OoOQhCAAAt69yGrhzAZs3U2+rLDrGnZUqyIVnse5D3OsCvSxKLa7RdX2uHIAQAaBYMWfKvTszZQC5pCve+B2NtQBIKpbejBMcdyhmRwvF7EqbkqwmCEACgeelmQVcNZLNm6u0ewQY4U4VIdt0WRx/j3XbxC+KEa8XIwyaGIAQAaI4MWPJ8B+bYaC5jOre0L9ulDc2qkL69Ivbcx3sd4FddFe9XIhGbBoIQAKBZczahizyZG1O58+O5N9wZSwOSUCh9ECu47OT9/uR/vYGLiM8KQQgA0DIMtqMbhrDZM/X2+7GT2zP6DDlxX3rtrGC/XRl4nN9yCzcybSRO2wUAAEADGLBkYjtmYjtSqmD3p4u7bosn7ktHMqUjmYIBK/g7MVPa0/GujKWBtgttORCEAAAtUht98nIX5uUuTF4V2Zcu/pEmns2RQu+KoXeJHiMMd6CT2jNBroyDsbYLbfaoJOnE5VZ7e/vExEQ7O7untlQqlaIoGhjgrym1Ky8vNzMz03YVrV9VVZW+vj7LstoupPXT+lc6t4ocSBf33hFP50i8SAghDCX9bWiQGxPoQntaUS3W1oSa/DgjCOtCEGqM1n9r6AgEocY0n690UQ0JyRAPZUhhWWLl/27Y1s6MjnWh41yY4Q7UqCWfDWzy49ySDwYAADyKlQF5qQvzUhdSybPhWWLoXenIXTG9XPopSfopSTTiyDB7GuDM+DvT7hatpJv4LBCEAACtljFHgt2YYDciSuylAulIpvhnpnSpQDp2Tzp2TyCEOJtQPyc60pGOcKSOxjoaiv/f3p0HNHHlDwD/Dkc4IiEBQggKcnksgoKIiheoIKCCCBQPQEEraqmu1ba4HqsuulrXq7Xa/mx18b7qjQceILjiUUFUQCMIIkQhIUA4EiDH/P5429kUQkQrUMz7/DV5+c7kZXjMNzPz3jycCDEMwz5+OgR4sglPtu7awSBshKtlypQy8hpfWdZAJj0nk54DAPQzJXy4hDeX8OZqV1LEiRDDMEy7sA0h0kkn0glI0M2tIm+8Jm+8Vqa/IXlikicm/+8ZAIAjgxjFIUZyiBEc4i9MQuejTos4EWIYhmkpAsDVjHA1I5a46MiVkFVJ3nxDppcrb5eTL2rJF7Xk/gIAACYNhlsSQ9mEJ1vHk01wjLq63h8aToQYhmEY6OnAMEtimCWRMEhHQcLjKvI/5eTtCvJ2BVnWgO4pkgBKALDtQQw2J9wtCDczcDMnbHt0+7PFjnrEmlgsnjdvXr9+/Xx9fR88eKA25rvvvhs0aJC7u/uePXuowtLS0vDw8D59+kydOrW4uJgqT0pK8vDwGDhw4JYtW6hCoVAYHR3dt2/fiRMn5uXlddB3wTAM0yq6BLibE4sG6Bwbp1s6Q69sht4pX92vBur4cAkTfXhVT54tUa7JUky5puh9TG52UOadLI/PVOzOV6a9ISukXV37d9dRZ4R//etfxWJxSkrKlStXAgMDX758SafTVQPOnDmzefPmc+fOyeXyKVOm2Nvb+/n5AUBERMSwYcO2bdu2e/fu0NDQhw8fAsCtW7e+/PLLM2fOmJqahoSEWFtbz5w5EwDmzp3LYrGuXbt27NixSZMmFRYW6unhc1wMw7APqSedCKUToXYAAEoSCmrJ7EryoYh8KCJzRGRlI2SUkxnl/xuSzqRBPybRh0H0MSUcTcCBQdibEFZ/4guqHTKgvqamxsrKKjc318nJCQA8PT3j4+NjYmJUY/z9/f39/ZcuXQoAiYmJOTk5p06dysnJGTVqVGVlpaGhoVwu53A4ycnJXl5ekZGRtra2GzduBIAff/zxyJEjGRkZpaWljo6OfD6fzWYDgKOj4/bt24ODg9VWCQ+o/xP684w+/rjhAfWdRjub9BsJ5FaTj6vIpzVkXjXJE5NqZ8Mw1IXePYhedOhFJ3rRgWNE9KKDpRHBNgQrY4Kh/w6f2D0G1BcWFhoaGqIsCAAeHh65ubktYvLy8lasWIGWhwwZcujQIVQ4YMAAQ0NDANDT0xs0aFBubq6Xl1dubu7UqVOpYLTi06dPbWxsUBakPqWtRIhhGIZ1BK4xcI0Jv57/u1MokAJPTBbWkgVi8kUdFNWSJfWksBF4YpInBgA1Z1/6OmBuAEwDgkWDHvrApBEMGhjogok+0HSArkcAAF0faDoAAI2NuqF9yF70D3ZvskMSoVAoNDU1pV6yWCw+n986hslkomUmkykQCNSuSJWrBldXV8tksraC1aquru7Xrx9B/HfHTZgw4eeff1Ybic4Im5vxdCYdrr6+vquroBXwGWGnwU0aMQJwo4MbHYD7v0KpgihpgNdSndcSKJMQgkbijZSobAJBI1HZCHVyolwK5VIqR2q+VKmfVtF8YES7jtKGhob6+m853+yQRMhkMhsaGqiXtbW1ZmZmLWJMTU2pRlNXV8disdSuSJWrBvfo0UNfX791sLW1tYYq3bp1izp9NDQ0NDJSf8UaXxrtTFp4Hanz6enp4UTYaXCTbosJgCWzzXeblVDVBNVNZHUT1MmgVkaKm6FJAfUyaFKCRE4CQL0MZEoAAJlM9qmzgYnJBztKd0gitLOzq6mpEQgElpaWAMDj8YKCglrEODg48Hi8kSNHogAHBwcAsLe3LygoUCqVOjo6APD8+XNUjoLRiqrBpaWlEonE2NgYBU+cOLGtKhEEYWpqitIqhmEY9qdC0wErI7Ayoq52arrsWVcnMTEx/ICf3iHDJ7hc7rhx47Zv3w4Av/766927d6dNmwYAz549W716NYqJjo7evXu3RCKpq6vbs2dPdHQ0AIwePZpOpx84cAAATpw4IZfLx48fDwCzZs3au3dvdXV1U1PT999/j4KdnZ2dnZ137doFAKmpqS9evAgJCemIr4NhGIZ9zMiOUVBQ4ObmxmazLSwsDh06hAqvX7/u5OSElpubm6Ojo01NTU1NTePi4uRyOSq/ffu2nZ0dh8OxsbFJS0tDhQqF4vPPPzc1NWUymdOmTZNKpaj80aNH/fv3t7S05HA4586d01AfDodTXl7enprzeLyHDx+++zfG3tmJEye6ugpaITMzs6SkpKtr8fGTSqWaj0LYh3Lx4sW6uroPuMGOnY+wrq6OTqej65xqNTY2EgTR+oZcTU0N1TuG0tTUpFQqW9/bE4vFDAaD6gijVvuHT2zatKmyslJ12D7WEaRSqbm5uUQi6eqKfPxiY2NHjhz56aefdnVFPnI5OTmzZ89+9OhRV1fk4zdy5MhNmzaNHj36Q22wY4efv/W+MRop0VrrLAgAbXVgUe07+sd16C8DDOsSuFVjmAYd9Yg1DMMwDOsWcCLEMAzDtFrH3iP886DT6UOGDKHRaG+NLCkpaW5u7tOnTyfUSpsplcr09PSxY8d2dUU+fvn5+UwmU8MoW+yDqK+vz83NHT58eFdX5OP34MEDJycntXfQWps6depnn32mOUZbEuGJEydaD+pXSywWKxSKdgZjf0RxcbG9vX1X1+LjJxAI6HR6i6feYx+cUqksLS3t3bt3V1fk41daWsrlcts5xYK9vb2jo6PmGG1JhBiGYRimFr5HiGEYhmk1nAgxDMMwrYYTIYZhGKbVcCLEMAzDtFrHPlnmzykvL+/+/ftOTk5tPaFHJBKlpKQYGhoGBASgqS2Qu3fvPn361M3Nzd3dvbMq2401NTWlpKSIxWJfX18ul9s6oLS09N69ewqFYtiwYXZ2dqjw5cuXhYWFVMyoUaPaevwQRtHcMh8+fCgSidCykZERmvIFAJRKZWpqallZ2ahRo6hptDENamtrr1y5QpJkQEBA6wdatWi6ADBmzBgajZaXl/fmzRtUoquri4cMvVVjY+Pjx4+VSmVbY1FIkkxPTy8uLvby8urfvz9VLhQKr127ZmRkFBAQ0NZEe+p9wOeWdgv//ve/LS0t58+f369fv4ULF7YOKCgosLS0nDFjhr+/v7Ozc01NDSpfuXKlnZ3dggULevbsuX379s6tdfcjlUqHDh06evTomJgYc3Pz7OzsFgEnT540NzcPDQ2dPn26iYlJUlISKt+wYUOvXr18fyMQCDq97t0Mapnz589vq2UGBga6uLig/RkVFUWVf/LJJwMHDpw3b565uTl+WvRblZeX9+7de8qUKWFhYTY2Nnw+v0XA0aNHqXY7YMAABoOBpgeIiYnp27cvKp80aVJX1L07OXToEI1GMzc3d3V1bSsmNjbW2dl5/vz5bDb7yJEjqPDZs2cWFhaRkZF+fn6urq61tbXt/1DtSoQymcza2jolJYUkSTS4qqCgoEXMp59+Gh8fT5KkUqkcP3781q1bSZIsLy83NDR88eIFSZJZWVloVuFOr353cuDAAXd3d5lMRpLk2rVrQ0JCWgS8fv26oaEBLR88eJDL5aLlDRs2LFiwoDOr2q1VVFS8tWUGBgZSM8BQ7t69y2azxWIxSZJHjhwZMGBA51S4+1q1alV4eDhajoyM/PrrrzUEx8bGxsXFoeWYmBh0GMHaQygU1tTUHD9+vK1EmJuby2AwKisrSZK8cOGCnZ2dQqEgSXL27NlLliwhSVKpVHp7e+/cubP9H6pd9wizs7MlEomvry8AsNns0aNHX7x4sUVMcnJyWFgYABAEERYWlpycDABXr151cXFBEwIPHjzYzMwsIyOj06vfnSQnJ4eEhKARr+Hh4ZcuXVIqlaoBXC6XuuzM5XJlMhn1VmVl5eXLlx8/fkziQa5v086WWVhYeOXKlZcvX1IlycnJEyZMYDAYABASEsLj8YqKijqr1t3ShQsX0JEBAKgjg1r19fW//PLLnDlzqJJXr15dvny5oKCgw2vZ/VlYWGieRyE5OdnHx8fc3BwAAgIChELhkydP4PeH7tDQUA1/oNa0KxHy+Xwul0tNC9WzZ08+n68aIJfLBQJBr169WgTw+XyqUO2KWAt8Pr9nz55ouWfPns3NzUKhUG2kUqncsGHD3Llz0UsdHZ2SkpIffvghMDDQ29u7rq6uk2rcPZWVlb21ZRoaGqanp3/77beDBg1avHgxKlRt0kZGRiwWCzdpzVo0aQ2769ixY7a2tsOGDUMv9fX1s7Kydu3aNWzYsJkzZ7b4RYi9K9Wmq6enx+Fw+Hx+Y2OjSCRqfehuJ+3qLKNQKFSnLdTV1ZXL5aoBSqWSJEkqhgposaKenl6LFbEWFAoF9YNDV1cXANTuMZIkFy1aJJPJ1qxZg0q++uqr5cuXA4BUKh07duzmzZsTExM7q9bdT3ta5smTJ9GfoKSkxN3dPSgoyM/PDzfpd6W6x1ofOlTt27eP+mEHAD/88APa/0KhcPDgwUeOHImKiuro2n7E1DZdhUIBAO38A7WmXWeEXC5X9bykoqKiRW9GGo1mZmZGxVRUVKBHFXO5XIFAoLoifoSxZqp7rKKiQldXV+2syF9++eWDBw+Sk5OpLl7okAEARkZGU6dOzcnJ6ZwKd1PW1tZvbZnULu3du7eXl9fDhw/h938guVwuEolwk9ZM9eih4QjA4/GysrJUUx21/9lstp+fH9r/2HtTbbokSQoEAmtrazqdzmAw2vMHUku7EqGbm5tMJsvOzgYAqVR669Yt1JW5ubm5pqYGxfj4+KSkpKDlq1ev+vj4AIC3t3dWVlZVVRUAlJSUFBcXjxgxoku+QnfRYjeOGjUK3S8Ui8WNjY2ofOXKlampqZcvX27rlkB2draNjU3nVLibGjNmjNqWKZVKW19VbmxszM/Pt7W1BQAfH58bN26gX81paWkcDgePoNBs7NixV69eRcvUkQEAqqurVe9w//TTT0FBQWw2u/UWFApFTk4O2v/Yu6qurm5ubgYAHx+f9PT0pqYmALh3756enp6rqyu0cehurz/axae7WbduXb9+/bZv3+7r6xsQEIAKjx492rt3b7R87949BoOxbt26JUuWsNnssrIyVD5z5kwvL68dO3a4ubktXry4SyrfjVRXV9vY2MydO3fTpk0sFguNviJJ0sPD47vvviNJ8ujRowAQFhYW9xuJREKSZEhISEJCwubNm0NCQszNzVF/SEwDtS1z7dq1fn5+JEkKhUJvb+81a9b885//9PDw8PT0bGxsJElSoVAMHTo0ODh427Zttra2u3bt6srv0B08f/6cyWQuX7585cqVTCYzPz8flZuYmKCO6CRJymQyKyurS5cuqa44fPjw1atXb9y4ccyYMX379qVGZGFqPX/+PC4uztfX18zMLC4ujhoRxOFwTp8+jZbHjh3r7++/bds2JyenTZs2ocLbt28zGIzExMRFixZxOJw3b960/0O1cfaJs2fP3rt3z97efvbs2QYGBgBQVFR0//796dOno4AnT56cOnXKwMAgKiqKOiORy+WHDx9++vSpu7t7RESE6kVqTK2KiooDBw7U1tYGBwd7enqiwrNnz/bp02fAgAF5eXm3b99WjY+JiaHRaBkZGbdv366rq7O1tY2IiMDzYb2V2paZnZ1dUVERGBgol8vPnj2bm5urVCr/8pe/hIeH6+vroxXr6+uTkpJev37t4+MzYcKELv0S3cOLFy/QqLUZM2ZQU5bu37/f19cX9aMRCoVnz56dM2cOdTkUAM6fP5+TkyOTyZycnCIiIt5toLf2efPmzYULF6iXPXv2nDRpEgAcPnx41KhRaJYrqVSalJRUWlo6YsSIyZMnU8GPHj06ffq0kZFRdHQ01bOpPbQxEWIYhmEYRbvuEWIYhmFYCzgRYhiGYVoNJ0IMwzBMq+FEiGEYhmk1nAgxDMMwrYYTIYZhGKbVcCLEsD+7X3755f79+2i5qKho//79Eonkw34Ej8fbs2cP9dCfDwI9NkhzzB+ckyE3NzctLe29V8cwBCdCTKvduXPH0dGxT58+qlMUAcDEiRNnzZrVRZVq6Ysvvjhw4ABazszMjImJqa6u/rAf8Z///Gf+/Pn19fVq3120aJHjb4YMGTJt2jTqYWMa7NixY/369RoC7ty5M3XqVGqA/3sgSdLf3z8/P/+9t4BhgBMhpuWkUmlRUVFhYSE1/QVSVlb25s2brqqVBm5ubomJiWgewU4jEAj4fD56Ep6fn9/9+/f9/f0PHz6sea2oqKi4uDgNAcuWLYuJibGzs3vvirm6uvr7+69evfq9t4BhgBMhhgHAiBEjDh8+nJubqzlMIpGUl5drmN4FBaiWoBku0RwxSFNTE/WE9xakUqlIJNJcBxcXl1WrVpmYmGgOU91meXk5elpxCyRJVlRUSKXS9mzHwMAgISEhISFh48aNv/76K4vF2rp1a4tNtTihjIiImD17dlsbzMnJuXPnTkxMTDu/SFtiY2PPnTtXUlLyB7eDaTOcCDEMlixZYmVltWrVqrYCXrx4geZz53K5FhYWy5cvp9JhVlaWmZnZqVOngoODTUxM0MReY8eOjY2N3blzJ5vN5nA4XC733LlzTU1NCxcuZDAYLBbLzc3t+fPn1PY3btzo4OBgbGxsYWFhZma2ePFi9HD91k6dOsXlclG63bFjh1krW7ZsQZHFxcXBwcGoziwWa9GiRarbTE9P79u3r5WVlYmJSWRkZENDQ/t3l4WFhYeHB4/HA4DGxsZ58+YZGxujTXG5XPQ4dQCIiYmZMmVKWxvZt2+ftbU1NXttWlqamZkZmqJozZo1ffv2ReVeXl7z58/XUJlJkybp6+sfOXKk/fXHsBa0a2JeDFPL0NBwxYoV8fHxmZmZrSfYEovF48aNk8vlx48fd3R0PHXq1IYNGxoaGnbu3AkAcrm8uro6Pj4+LCzsxo0btbW1AFBXV3f58mUej3f8+HE6nZ6QkBAVFRUUFESj0VJTU6urqxcsWDBv3rz09HT0ESKRaM2aNS4uLjQa7dq1aytWrKDRaFRKU4XO8NApZkhIiIuLC/XWsWPH9u7di6ZhEwqFY8aMYbFYp0+fdnR0zMzMXLZsmVQq/fnnnwGguLh48uTJ/fv3T09P79Gjx9atW99p9mOSJF+9eoUmmPzHP/5x8uTJpKSkwYMHSySSrKwsGo2GwqqqqjSc4Kampg4fPpx6eL1MJquurkY/L6RSqVgsRuW1tbWak7SBgYG7u3taWtrf/va39n8FDPudDzR1BoZ1Szdu3ACA8+fPNzc3Ozk5jR49GpW7urr6+vqi5W+//RYAbt68Sa01Z84cPT09NM/L3bt3ASAiIkJ1sx4eHqampiKRCL1EfT69vLyUSiUq2b59OwBQAS189dVXXC6XetmrV6/4+Hi0fPDgQQCgZgejZGRkGBgYxMXFoZfLly+n0+l8Pp8K2Llzp66urkAgIEnyiy++MDAweP36NXpLqVQ6OzsDgFAoVFufiIgIExOTqqqqqqqqvLy8hQsXAsDChQtJkvTz8wsKClK7VlBQ0IgRI9S+JZPJdHR0li9fTpWgmeTu37+Pvr6lpSUqd3Z2joyMVLsRSmxsLBWPYe8BnxFiGACAvr7+unXrIiMjr1y5EhAQoPpWTk6OlZWVt7c3VTJt2rR9+/ZlZmaGhoaikuDg4BYb9PT0pOaQQhf6JkyYQJ0AoZLS0lIq5tq1a5mZmeXl5UqlksfjlZeXNzQ00On09lT+xYsXYWFh48aN27VrFypJSUlxdHTMz8+nelTSaDSFQvH06VM2m52Tk+Pl5YWu4gIAQRChoaGa+17W1dVRVdXV1Y2KivrXv/4FAG5ubjt27IiPj4+IiPDy8qJOBzWrrKxUKpXvMccWSZISiaTFbjE3NxeJRAqFQnXyIwxrP5wIMey/ZsyYsWXLloSEhBaT87169YrKGQia6kz1up+VlVWLrbFYLGoZpQcmk9miBPVhUSgUEydOzMjImDBhgq2tLZ1O79GjB0mStbW17UmEIpFo4sSJvXr1OnHihJ7ef/+jBQKBUCiMiIhoUaXKykoAKCsr8/DwUH2rxRdszdjY+Ny5cyjSwcGBmlRv7dq1SqXy4MGDu3fvZjAYYWFh33zzjdr52VWhIRMauh21tn79+gcPHtDpdJFIxGQyjx07Rr2Fzi91dHCPB+w94USIYf9FEERiYuLkyZNPnDihWk6n01U7tgCAQCAAAFNTU9V13/tzMzIyrl69eunSpcDAQFSyefPmixcvtmfd5ubm8PDw+vr669ev9+jRgypnMBj9+/e/fv262rU4HA7KiBT0jTT46w0IAAADuklEQVTQ09Pz9fVtXW5sbLxly5bNmzc/fvz4woULmzZtEggEycnJmrfGYrH09fVVf0mglN/6QQH19fXUQEMmk5mUlAQAgwcPLigooKbGFYlEHA4Hz5WNvTf8GwrD/mfSpEk+Pj5///vfZTIZVTh8+PCysrJHjx5RJcnJyQRBUD0e/6Di4mIAUD1Fu3TpUntWJEly7ty5WVlZFy9etLGxUX3L29v77t27paWlald0cXG5d++e6iiOK1euvE/Vf6Ojo+Pm5rZ69ero6Gh00/St8R4eHk+ePKFK0LXiBw8eqIbx+fyysjJ7e3v0cuDAgWjB2tpaNYk+evRo6NChf6T+mJbDiRDDfmf9+vUFBQXPnj2jSubMmcNisaKjo7Ozs2tqavbu3btr165p06b17t37g3zioEGDCIJYv359bW1teXn5smXLsrKy2rPiN998c+jQoY0bNzIYjKLfoIfOJCQk0Gi0oKCgtLS0+vr6ioqK1NTU2bNnkyQJAJ999lljY2N0dHRJSYlIJFqxYoVqTnonS5cuPX/+POrImpOTc+PGjSFDhrRnRTQwn7o6ymazAwICEhMT9+7dW1VVpVAo0tPTP/nkEyMjo6ioKA3bqampyc/PV3u2imHthBMhhv3OyJEjJ0+erFrC4XAuX74sk8k8PDxYLFZcXFxoaOhPP/30oT7Rw8Nj3bp1P/74o6mpKZfLffjw4bp169qzYnZ2NgB8/vnnjiq+//57ALCzs7t586aRkdG4ceNMTEysrKwCAwOp65+urq6HDh26deuWnZ2dhYXFzZs33/vhLHw+Pzw8nMvl6unpubu729jYoBEabzV37ty6ujrUWRQ5duzYrFmzli5dunfvXpFINH78eGNj41u3bjk4OGjYzsmTJ2k02vTp09+v/hgGAAT6hYhh2FvxeDyxWGxvb//WziDvoaqqqqioiM1mtz7RVCqVBEGge2AkSSqVyvZ3j+Tz+Xw+38TExM7Ojurhgkgkkry8PCaTSd1sez8NDQ0lJSUSicTGxgYNLqSqDQAa+rCEh4fL5fKzZ8+qFsrl8gULFpw5c6aoqEj1Lmxbhg0bNnToUDSmE8PeD06EGIZ1jaKiogEDBmRkZHh6eqqWf/311/v376+oqHjrFi5fvjxt2rSCggLVBIxh7wr3GsUwrGs4ODgUFha2c6ykWkOHDn3+/DnOgtgfhBMhhmFdBo3IbCEsLMzV1bU9q5ubm3/oGmHaCF8axTAMw7Qa7jWKYRiGaTWcCDEMwzCthhMhhmEYptX+Hy7m5jm0T58EAAAAAElFTkSuQmCC", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdd0AT5+MG8DcBAmFDUBmyRUAoDlyItuCeuFetFksddbVfq1Vb68RVbeu2zirVn7Z1VWlFRa17FRUcTAVlCAhCCEkg635/XL3GMAwQCHrP56/kzXt3bwi5J+/de+9xKIoiAAAAbMXVdwMAAAD0CUEIoJXk5OSIiIh9+/YxJSdPnoyIiLh27RpT8sMPP0RERBQUFNBPZTLZlClTlixZUuuNPnr0KCIiYv/+/bVew9tFpVIdP3588eLFU6ZMmTJlilgsvn79ekRExMmTJ5k6UVFRERERiYmJemwnvGsoAF0oKyvbt2/frFmzunTpYmpqSgiZPXt2xWpJSUnq/34WFhaOjo4dO3b87LPPzpw5o1QqtdnWjBkzjKpgbm6u63f2r/PnzxNCIiIimJKlS5cSQvbu3cuU9OzZkxDy+PFj+qlYLCaEtGrVqtYbPX36NCFk6tSptV6Drixbtkz9gzM3N/fw8Jg4ceLDhw91uJWxY8fS67exsbGxsSksLKR/eSxZsoSpM2nSJEJIbGysDrcLLGdY/1ELrFBQUPDxxx/Tj01MTKqvbGxs3K1bN/qxWCxOTEy8devWtm3b2rVrFxUV5efnV/3iCoVCLpd7eno6OztrvMTj8WrV/DezsbEJCQnx8fGppk6bNm0UCgWfz9fVRm1tbUNCQry9vXW1wjpycXFp2bIlIaSsrOzBgwc///zzwYMHT548Sf8CqKPU1NSDBw+2bt36/Pnztra2dKG9vX1ISIi7u3vd1w9QFQQh6IaZmdnSpUsDAwMDAwP37t27YMGCairb2dmdPXuWeUpR1JUrV+bPn3/t2rXQ0NDr1697enq+cYtTpkyZO3euDpqunTZt2ly4cKH6OmvXrtXtRtu3b//GjTakESNGfP/99/RjkUgUHh5+9OjRyZMnp6Wlcbl1Pc+SnJxMCOnVqxeTgoSQ3r179+7du45rBqgeghB0w9raetGiRbVblsPhdOvW7e+//+7Tp8+FCxf+97//nThxQlcNy87OjomJKSkp8fLy6t27N4fDSUhIMDc3Z7pZz549e/HihZeXl6WlpfqCd+/eNTAwCAgIoJ+WlpYmJyfb2dm5urpWta3U1NSSkpL33nuvYse0sLDw1KlTeXl5rq6u/fr1MzMzU3/1/v37MpksMDCwvLz8zJkzjx8/dnZ2Hj58uEgkSklJadKkiYuLC10zLS1NKBT6+fmpd7sVCkV8fLyZmRnTYc3Pz8/MzHR2dm7atGlCQsKVK1cIIe+//76/vz9d4eXLl6dOncrNzW3RokX//v2NjIxq+HclFhYW27ZtO3bsWHp6emJiop+fX05OzvPnz93c3AQCQXx8/PXr16VSaUREBP2HlcvlFy9efPToEUVRLVu27N69u7GxMb2q8vLyBw8e3L17lxBSXFwcFxdHCGnatKmzs/PLly/T09MdHR0dHByqb09paWlsbGxGRoaBgUGbNm26du3K4XA06iQkJNy/f//58+fW1taOjo5du3bV+NCBpfR9bBbeQatWrSLVniN0cnKqdMEHDx5wOBwOh/P06dNq1j916lRCyHfffffGlmzevJnZ2xJCvLy86FN93bp101jbmTNnNJY1MzOzt7dnntblHOHhw4fVk8/JyenGjRvq23JzcyOE3Llzh0nZrl27UpWdIxwwYAAhJDExUX3xwsJCQkiHDh2Ykh9//JEQ8v3330+cOJHZLofDWbRoEUVRhw4dUm9PYGBgUVFR9X9J+hxhxc9UIBAQQs6fP09R1OLFiwkhP/3004gRI5iVp6WlURR169atFi1aqO95XFxcLl68SK8kJSWl4q5pxowZFEVpeY5w586dNjY26ou3b98+IyODqSASieg/nTpDQ8MnT55U/8aBDTBqFBoRPz8/Hx8fiqIuXbpU97WdPHly5syZ5ubmUVFRz549o/fFH330Ud3XXCPPnz+fMGHC559/npycnJyc/PXXX+fk5PTv3z83N1ej5pAhQwIDA3///fdr167p5Kjvxo0bz50798svv9y5c2fPnj3W1tbLli1bv379xIkTv/zyy2vXrsXGxgYFBcXFxdVuaGtxcfHLly8JIXQc0lauXBkXF7d169arV6/+/vvv1tbWT58+7d279+PHj7/88suEhIQHDx4sXLgwKyurb9++jx49IoQ4OTmdPXt23rx5hJBx48adPXv27NmzM2bM0LIZu3btmjRpkqmp6a5duxISEm7dujVjxoy4uLh+/fpJpVK6TmRk5J9//hkWFnb58uVnz549ePDgyJEjw4cPr8W7hncPDo1C49KqVavExMSnT5++sebmzZuPHj2qUdirVy9m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fffo0aNvv/22pKTk5cuXf//995o1a2qxWoqiFi5cyPQvjx49GhoaOmnSJHd39x49ely9elWnb6KWBgwYkJiYyFwZ8rZDjxAAoJa8vLx69uxJCHnx4sVvv/02f/78wYMHz5kzJz4+vnnz5l988QUhZOPGjQMGDPD09CSEXL58OS8vb8SIEdWs89KlS3w+v1WrVkxJx44dAwMDe/XqdfXq1T/++MPPz++HH34YOnTo5s2bW7Vq9eWXX8bHx//888+FhYWhoaETJ07kcDgqleqnn366evUqRVFt2rT56quvCCHHjh07duxYeXm5l5fXvHnzLCwsli5dOnPmTHqk64kTJ8zMzHr06HHv3r07d+4IBIJff/113LhxAwYMOHny5MmTJymKGjNmDHPK88MPP9yxY8fbMq129RCEAPD2UZYUlT26SSpMwlJ/DO1djT38qnq1sLCQz+eLRKLo6GgbGxsnJ6d//vknPj6+Y8eOe/fu9ff3p4Pw9u3bDx48qD4IT58+3a1bt2q2UlJSsnr16lu3bk2dOrVp06bXrl0bM2ZMZGSks7PzihUrMjIyli1btn379oMHD0ZGRnI4nBs3bhBCLl++PGfOnC1btlhYWNy5c6esrMzCwmLDhg3jx4+ng/DcuXO2trY9evR49OjRvHnz+vXrN378eFdX1w0bNkRFRS1btkyhUEyZMmXz5s19+/YlhHTr1u3jjz+uy5+08UAQAsDbR/jHDknchQbdJIfjuOI3rulrV7CdP39eJpOlpaUdOnTol19+KS4u7t+/v6Oj4/r165csWVLNYcykpKRVq1ZZWFh07tz5o48+0niJvrcRY9++fadOnbp582ZiYuIvv/xCCJHL5Vu2bKHDtX///osXL6Znwfby8goICFi2bNmTJ09atmzZqVMnExMTem3p6elOTk6dO3e2trauOD+4Bj6f//PPPxsYGKhUqi5duty8edPb25sQIpVKt27dSgehu7v7kydPZDLZOzBkBkEIAG8f825hHOMGnXDD0LYZl1/JFJIcDicoKGjevHleXl6EEGdnZ6FQGBoaam5u3qdPn6rWtmbNmmXLlrm6uvbo0UMjCMvLyyveXYHH440ZM2bfvn22trbPnj0zMTGhU5AQ8ujRo/T09G3btjGVhULhjBkzxo0bZ29v37179ylTpvTp02fYsGHHjx9v3rx5UFDQRx99NGHChGoutGjZsiU9DU1WVlZJSQlzQ6WysjJmLKuJiQlFUWVlZQhCAAA94Ln58tz0P6dj9+7dZ8+erVFoZWWlcTEDc7s6qVRKP8jMzKSvjjc1NZVIJOoXINrb27948UJ98Y8//pi54QNN/b5Utra2y5Yt07iDvJWV1ZUrV54/f37kyJHhw4fHxcV5e3sfPXpUKBSePHlywYIFloVlZykAACAASURBVJaWQ4cO5fF4zL0ehUIhMy0OM4O2ra0th8M5e/Zsxdln8vLyLCwsqr/u/m2BUaMAAPXr9OnThBCpVHry5MmysjJCSPPmzenbR2ikICGkS5cud+7c0X7lo0ePXrNmDT0lt0qlopd98OCBTCZzcHCYNGkSPWt2ampqSUmJlZXVuHHjfHx86Am1vb29Y2NjCSHp6enR0dEVV25ubt6vX79FixbRWV5WVvbw4UP6pbt37751F85XBUEIAFAb5ubm9F333ujx48eenp5eXl6hoaGHDx/++eef58yZ8/XXX8+cObPibdyHDx9+7do15m4P1tbWGvcl5nK56rc3mj17dnBwsK+vr7+/f/Pmzbds2UII+e2335ydnVu3bu3h4TF06NBOnTrdvHmzZcuW/v7+7u7uFhYW9HZXrFgRGRnp6ekZERExfPhwenpnHo+nfh+hPXv25Obmuri4+Pv7t2jR4u+//6bL//jjD93eg16PMOk2VAeTbjcGmHS7MU+6/Ubt2rVbt25dly5dDA0NDQ0NS0tL33i7ulmzZvn6+n722Wc12tDLly+tra2Z/xOVSlVUVGRlZaWeoy9fvjQzM1M/B0lRVFFRkcZc4RUpFAqRSMQcIM3Jyenevfu9e/e0/ClQd/U66TZ7v1oAAA3GxMSEDiRtbtq6ePFi5rSi9mxtbdV/LXG5XIFAoNGbtLW11RiJw+Fw3piChBBDQ0P104RpaWlbt25tsBSsbxgsAwBQjxYuXOjj41OjRQQCwcyZM+upPTqhcYHH2w49QgCA+iKRSAYOHOjo6KirFcpksvz8/IrleXl5JSUlVS2lVCpzc3PfuHKlUvn8+fNqKpSUlFS6lSdPntD3uK87etRPA0OPEACgNubNm3f79m3m6fr16wMCAtQryGSyTp06xcTEbN68+ebNmxqLh4WF0XOw1UhcXNzEiROTkpI0ymfNmtWjR4/JkydXutSTJ0+CgoLokaKM8vLyfv36MU8tLS1//PHHtm3bVhNFy5cv5/F4K1as0Chv2bJlbm6uxl0Vhw8fXlRUxDz9888/tRn2MWrUqEWLFjXw3OIIQgCA2rh3716rVq1GjRpFP3V1ddWosGvXri5dujg5OY0bN46OnOXLlzdr1oyOq9p1E/39/XU1aEipVF64cOHQoUMODg6EECMjI0dHx7/++ksnKyeEXL58+Ztvvmnbti39VMvr7r/66qtFixadP39eV83QBoIQAKCWPDw8qjlbtnPnzvXr1xNC/P396ZImTZo4OzvTi1y/fn3VqlXFxcW9evWaMmUKh8MpLCxctmzZmDFjNm7c+N5773399dd//vnnwYMHFQrF8OHDR44cSQgpKCg4depU+/btCSEvX75cvnx5WlraoEGDmI1mZmZu3br14cOHFhYWY8eO1bjQvqIOHTp4eHjQjwsLC48dO9alSxdCiEql2r59+/nz583NzSdPnlzxksHr169v2bJFoVD873//q2rlAQEB6n+frKyszZs3DxgwYOPGjUZGRnPmzGnXrp3GIt27dx8/fnxqaio9U0/DQBACwNsnX1JwMyeuIbfYzKxJRwfNvXZmZuatW7cIIcbGxq1bt1Z/KT8//9GjR506dap0bf/88w+dB87OznPnzn369OmqVatEItG2bdseP378xRdfWFtbHzlyZNasWdu2bePxeNOnTy8uLp40aVJubu6BAwe+/fZbiqL69u3bqVOnRYsWHTp06MyZM/R9IZ4/f+7t7T106NC8vLwZM2aYmZmFhoZW874SEhLoQ6b29vZKpXLnzp1r164lhHz22We5ublfffVVfn7+iBEj/vrrL/U3mJKSMmDAgA0bNnh6ei5evFhVxeznSUlJZmZmhBBbW9sWLVoUFhZu2rTp2bNns2bNun79+oABA9LT0zWGnnK53KCgoLNnzyIIAQCq89PdvecyLjXkFjmEc2LEfkvj165gO378OH3yz9HR8fDhw+ovpaSkNGvWrKoLDDZu3DhlyhR6ltHt27cHBwdHRkYSQuRy+bZt25ydnQkhX3zxxdKlS8PCwggha9asWbRo0aRJk5g13Lhx4/nz5+vXrzcwMGjfvv2JEyfo8o4dO7Zr1y4rK8vAwGDw4MHHjx+vPgiXL19OX1AxZswYpmeZnZ194MCB/Px8etablJSU3bt3b9y4kVlqx44dH3744fjx4wkhq1ev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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Plotting 1D Profiles from 'sq' Spline ---\n", + "Evaluating 'sq' spline on a dense grid...\n", + "Evaluation complete.\n", + "1D profile plots saved successfully.\n" + ] + } + ], + "source": [ + "# --- Code to Plot 1D Profiles from the 'sq' Spline ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting 1D Profiles from 'sq' Spline ---\")\n", + "\n", + "# 1. To get smooth curves, we'll evaluate the spline on a dense grid,\n", + "# not just on its internal knot points.\n", + "psi_eval_grid = range(0.0, 1.0, length=200)\n", + "\n", + "# 2. Evaluate the 'sq' spline across this dense grid.\n", + "# Calling spline_eval with a vector input is efficient and returns a matrix\n", + "# where each column corresponds to one of the splined quantities.\n", + "println(\"Evaluating 'sq' spline on a dense grid...\")\n", + "evaluated_profiles = JPEC.Spl.spline_eval(plasma_eq.sq, collect(psi_eval_grid), 0)\n", + "println(\"Evaluation complete.\")\n", + "\n", + "# 3. Extract each profile into its own variable for clarity.\n", + "# Based on the direct_run implementation:\n", + "# Column 1: F = R*Bt (Toroidal Field Function)\n", + "# Column 2: P*μ₀ (Scaled Pressure)\n", + "# Column 3: Toroidal Flux function (related to dV/dψ_pol)\n", + "# Column 4: q (Safety Factor)\n", + "F_profile = evaluated_profiles[:, 1]\n", + "P_profile = evaluated_profiles[:, 2]\n", + "Flux_profile = evaluated_profiles[:, 3]\n", + "q_profile = evaluated_profiles[:, 4]\n", + "\n", + "# 4. Create and display the plots\n", + "\n", + "# Plot 1: Safety Factor (q)\n", + "p_q = plot(\n", + " psi_eval_grid,\n", + " q_profile,\n", + " title=\"Safety Factor Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"q\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_q)\n", + "\n", + "# Plot 2: Scaled Pressure (P*μ₀)\n", + "p_p = plot(\n", + " psi_eval_grid,\n", + " P_profile,\n", + " title=\"Pressure Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"P * μ₀ [T²]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_p)\n", + "\n", + "\n", + "# Plot 3: Toroidal Field Function (F)\n", + "p_f = plot(\n", + " psi_eval_grid,\n", + " F_profile,\n", + " title=\"Toroidal Field Function\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"F = R * B_t [T*m]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_f)\n", + "\n", + "# Plot 4: Combined plot for comparison\n", + "p_all_profiles = plot(\n", + " title=\"1D Equilibrium Profiles\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " legend=:best\n", + ")\n", + "plot!(p_all_profiles, psi_eval_grid, q_profile, label=\"q (Safety Factor)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, P_profile, label=\"P*μ₀ (Pressure)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, F_profile, label=\"F (Toroidal Field Fn.)\", linewidth=2)\n", + "# We can also plot the 3rd quantity, though it's less commonly viewed.\n", + "# plot!(p_all_profiles, psi_eval_grid, Flux_profile, label=\"Toroidal Flux Fn.\", linewidth=2)\n", + "display(p_all_profiles)\n", + "\n", + "\n", + "println(\"1D profile plots saved successfully.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0735e75a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.11.6", + "language": "julia", + "name": "julia-1.11" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/equil_soloviev_example.ipynb b/notebooks/equil_soloviev_example.ipynb new file mode 100644 index 000000000..762008545 --- /dev/null +++ b/notebooks/equil_soloviev_example.ipynb @@ -0,0 +1,316 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "710e987d", + "metadata": {}, + "outputs": [], + "source": [ + "using Pkg\n", + "Pkg.activate(\"..\")\n", + "Pkg.resolve()\n", + "Pkg.instantiate()\n", + "using JPEC, Plots\n", + "# test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb106129", + "metadata": {}, + "outputs": [], + "source": [ + "### Set equil input parameters\n", + "equil_in = JPEC.Equilibrium.EquilConfig(control=JPEC.Equilibrium.EquilControl(\n", + " eq_filename=\"sol_test\", # eq_filename\n", + " eq_type=\"sol\", # eq_type\n", + " jac_type=\"hamada\", # jac_type\n", + " mpsi=100, # mpsi (number of radial grid points)\n", + " mtheta=128), # mtheta (number of poloidal grid points)\n", + " output=JPEC.Equilibrium.EquilOutput()) \n", + "\n", + "### Set Soloviev input parameters\n", + "sol_inputs = JPEC.Equilibrium.SolevevConfig(;\n", + " mr=65, # number of radial grid zones\n", + " mz=65, # number of axial grid zones\n", + " ma=64, # number of flux grid zones\n", + " e=1.0, # elongation\n", + " a=1.0, # minor radius\n", + " r0=3.0, # major radius\n", + " q0=1.26, # safety factor at the o-point\n", + " p0fac=1.0, # scale on-axis pressure (P-> P+P0*p0fac. beta changes. Phi,q constant)\n", + " b0fac=1.0, # scale toroidal field at constant beta (s*Phi,s*f,s^2*P. bt changes. Shape,beta constant)\n", + " f0fac=1.0 # scale toroidal field at constant pressure (s*f. beta,q changes. Phi,p,bp constant)\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9843a0d1", + "metadata": {}, + "outputs": [], + "source": [ + "### Set up Soloviev equilibrium and generate input splines\n", + "\n", + "directrun_inputs = JPEC.Equilibrium.sol_run(\n", + " equil_in,\n", + " sol_inputs\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b37e0a5c", + "metadata": {}, + "outputs": [], + "source": [ + "plot(\n", + " directrun_inputs.sq_in.xs,\n", + " directrun_inputs.sq_in.fs[:,2],\n", + " label=raw\"pfac * (p0fac - $\\psi_N$)\",\n", + " xlabel=raw\"$\\psi_N$\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6488baff", + "metadata": {}, + "outputs": [], + "source": [ + "### Execute direct_run() and solve equilibrium\n", + "\n", + "plasma_eq = JPEC.Equilibrium.equilibrium_solver(directrun_inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "179089da", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Final Code to Generate 2D Color Plots of R(ψ,θ) and Z(ψ,θ) ---\n", + "println(\"\\n--- Generating data for 2D color plots ---\")\n", + "# 1. Define the grid in flux coordinates (ψ_norm, θ_new)\n", + "# This part is identical to the previous steps.\n", + "equil_control = plasma_eq.config.control\n", + "psi_norm_grid = collect(range(equil_control.psilow, equil_control.psihigh, length=equil_control.mpsi + 1))\n", + "theta_new_grid = collect(range(0.0, 1.0, length=equil_control.mtheta + 1))\n", + "# 2. Evaluate the `rzphi` spline to get the R and Z values.\n", + "println(\"Evaluating the 'rzphi' mapping spline...\")\n", + "fs_grid = JPEC.Spl.bicube_eval(plasma_eq.rzphi, psi_norm_grid, theta_new_grid)\n", + "println(\"Evaluation complete.\")\n", + "# 3. Transform the spline output to physical (R, Z) coordinates.\n", + "# This calculates R_grid[i,j] = R(ψ[i], θ[j]) and Z_grid[i,j] = Z(ψ[i], θ[j])\n", + "rfac_sq = fs_grid[:, :, 1]\n", + "eta_term = fs_grid[:, :, 2]\n", + "theta_new_mesh = ones(length(psi_norm_grid)) * theta_new_grid'\n", + "eta_grid = 2.0 * pi .* (theta_new_mesh .+ eta_term)\n", + "rfac_grid = sqrt.(max.(0.0, rfac_sq))\n", + "R_grid = plasma_eq.ro .+ rfac_grid .* cos.(eta_grid)\n", + "Z_grid = plasma_eq.zo .+ rfac_grid .* sin.(eta_grid)\n", + "println(\"Calculated R and Z grids.\")\n", + "# 4. Create the 2D color plot for R(ψ,θ)\n", + "println(\"--- Plotting heatmap for R(ψ,θ) ---\")\n", + "p_r_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " R_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Major Radius R(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"R [m]\"\n", + ")\n", + "display(p_r_heatmap)\n", + "# 5. Create the 2D color plot for Z(ψ,θ)\n", + "println(\"--- Plotting heatmap for Z(ψ,θ) ---\")\n", + "p_z_heatmap = heatmap(\n", + " psi_norm_grid,\n", + " theta_new_grid,\n", + " Z_grid', # Note the transpose ' to match axis dimensions\n", + " title=\"Vertical Position Z(ψ, θ)\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"Poloidal Angle (θ_new)\",\n", + " colorbar_title=\"Z [m]\"\n", + ")\n", + "display(p_z_heatmap)\n", + "println(\"\\n2D color plots for R and Z have been saved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5f09972", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Code to Plot Psi and Theta Contours in R-Z Space ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting Psi and Theta Contours in R-Z Space ---\")\n", + "\n", + "# 1. Select a number of contours to display for clarity\n", + "num_psi_contours = 11 # e.g., from ψ_norm = 0.0 to 1.0 in steps of 0.1\n", + "num_theta_contours = 13 # e.g., every 30 degrees\n", + "\n", + "# 2. Initialize the plot\n", + "# aspect_ratio=:equal is crucial for tokamak plots to look physically correct.\n", + "p_flux_surfaces = plot(\n", + " title=\"Flux Coordinate System Contours in (R, Z)\",\n", + " xlabel=\"R [m]\",\n", + " ylabel=\"Z [m]\",\n", + " aspect_ratio=:equal,\n", + " legend=:outertopright\n", + ")\n", + "\n", + "# 3. Plot contours of constant ψ (flux surfaces) in blue\n", + "# We loop through the ROWS of the R_grid and Z_grid matrices.\n", + "psi_indices = round.(Int, range(1, stop=size(R_grid, 1), length=num_psi_contours))\n", + "\n", + "for i in psi_indices\n", + " # Each row corresponds to a single psi value\n", + " # We must add the last point to the start to close the loop for a smooth plot\n", + " R_surface = [R_grid[i, :]; R_grid[i, 1]]\n", + " Z_surface = [Z_grid[i, :]; Z_grid[i, 1]]\n", + " plot!(p_flux_surfaces, R_surface, Z_surface, label=\"\", color=:blue, linewidth=1.5)\n", + "end\n", + "\n", + "# 4. Plot contours of constant θ (angle contours) in red\n", + "# We loop through the COLUMNS of the R_grid and Z_grid matrices.\n", + "theta_indices = round.(Int, range(1, stop=size(R_grid, 2), length=num_theta_contours))\n", + "\n", + "for j in theta_indices\n", + " # Each column corresponds to a single theta value\n", + " plot!(p_flux_surfaces, R_grid[:, j], Z_grid[:, j], label=\"\", color=:red, linewidth=1)\n", + "end\n", + "\n", + "# 5. Add a legend manually (a common trick in Plots.jl)\n", + "plot!(p_flux_surfaces, [], [], color=:blue, label=\"Constant ψ\")\n", + "plot!(p_flux_surfaces, [], [], color=:red, label=\"Constant θ\")\n", + "\n", + "# 6. Display and save the final plot\n", + "display(p_flux_surfaces)\n", + "println(\"Flux surface contour plot saved as 'flux_surfaces_RZ.png'\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f07cd2f9", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Code to Plot 1D Profiles from the 'sq' Spline ---\n", + "# This code block goes at the end of your existing script.\n", + "\n", + "println(\"\\n--- Plotting 1D Profiles from 'sq' Spline ---\")\n", + "\n", + "# 1. To get smooth curves, we'll evaluate the spline on a dense grid,\n", + "# not just on its internal knot points.\n", + "psi_eval_grid = range(0.0, 1.0, length=200)\n", + "\n", + "# 2. Evaluate the 'sq' spline across this dense grid.\n", + "# Calling spline_eval with a vector input is efficient and returns a matrix\n", + "# where each column corresponds to one of the splined quantities.\n", + "println(\"Evaluating 'sq' spline on a dense grid...\")\n", + "evaluated_profiles = JPEC.Spl.spline_eval(plasma_eq.sq, collect(psi_eval_grid), 0)\n", + "println(\"Evaluation complete.\")\n", + "\n", + "# 3. Extract each profile into its own variable for clarity.\n", + "# Based on the direct_run implementation:\n", + "# Column 1: F = R*Bt (Toroidal Field Function)\n", + "# Column 2: P*μ₀ (Scaled Pressure)\n", + "# Column 3: Toroidal Flux function (related to dV/dψ_pol)\n", + "# Column 4: q (Safety Factor)\n", + "F_profile = evaluated_profiles[:, 1]\n", + "P_profile = evaluated_profiles[:, 2]\n", + "Flux_profile = evaluated_profiles[:, 3]\n", + "q_profile = evaluated_profiles[:, 4]\n", + "\n", + "# 4. Create and display the plots\n", + "\n", + "# Plot 1: Safety Factor (q)\n", + "p_q = plot(\n", + " psi_eval_grid,\n", + " q_profile,\n", + " title=\"Safety Factor Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"q\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_q)\n", + "\n", + "# Plot 2: Scaled Pressure (P*μ₀)\n", + "p_p = plot(\n", + " psi_eval_grid,\n", + " P_profile,\n", + " title=\"Pressure Profile\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"P * μ₀ [T²]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_p)\n", + "\n", + "\n", + "# Plot 3: Toroidal Field Function (F)\n", + "p_f = plot(\n", + " psi_eval_grid,\n", + " F_profile,\n", + " title=\"Toroidal Field Function\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " ylabel=\"F = R * B_t [T*m]\",\n", + " legend=false,\n", + " linewidth=2\n", + ")\n", + "display(p_f)\n", + "\n", + "# Plot 4: Combined plot for comparison\n", + "p_all_profiles = plot(\n", + " title=\"1D Equilibrium Profiles\",\n", + " xlabel=\"Normalized Psi (ψₙ)\",\n", + " legend=:best\n", + ")\n", + "plot!(p_all_profiles, psi_eval_grid, q_profile, label=\"q (Safety Factor)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, P_profile, label=\"P*μ₀ (Pressure)\", linewidth=2)\n", + "plot!(p_all_profiles, psi_eval_grid, F_profile, label=\"F (Toroidal Field Fn.)\", linewidth=2)\n", + "# We can also plot the 3rd quantity, though it's less commonly viewed.\n", + "# plot!(p_all_profiles, psi_eval_grid, Flux_profile, label=\"Toroidal Flux Fn.\", linewidth=2)\n", + "display(p_all_profiles)\n", + "\n", + "\n", + "println(\"1D profile plots saved successfully.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42602d76", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.11.6", + "language": "julia", + "name": "julia-1.11" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/equildev.ipynb b/notebooks/equildev.ipynb deleted file mode 100644 index e2ffa92d4..000000000 --- a/notebooks/equildev.ipynb +++ /dev/null @@ -1,451 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "710e987d", - "metadata": {}, - "outputs": [], - "source": [ - "using JPEC, Plots" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "95f32fa1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "equil_setup (generic function with 1 method)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "struct equil_settings\n", - " grid_type::String\n", - " mpsi::Int\n", - " psilow::Float64\n", - " psihigh::Float64\n", - "end\n", - "\n", - "mutable struct equil_bdata\n", - " psi::Float64\n", - " psir::Float64\n", - " psiz::Float64\n", - " psirz::Float64\n", - " psirr::Float64\n", - " psizz::Float64\n", - " f::Float64\n", - " f1::Float64\n", - " p::Float64\n", - " p1::Float64\n", - " br::Float64\n", - " bz::Float64\n", - " brr::Float64\n", - " brz::Float64\n", - " bzr::Float64\n", - " bzz::Float64\n", - "end\n", - "\n", - "function bfield_eval(bdata::equil_bdata, psi_in::JPEC.SplinesMod.BicubicSplineType, sq_in::JPEC.SplinesMod.CubicSplineType, r::Float64, z::Float64, psio::Float64)\n", - " # Equivalent of direct_mod.direct_get_bfield from fortran version\n", - " f, fr, fz, frr, frz, fzz = JPEC.SplinesMod.bicube_eval(psi_in, r, z, 2)\n", - " bdata.psi = f[1]\n", - " fq, fq1 = JPEC.SplinesMod.cube_eval(sq_in, 1-bdata.psi / psio, 1)\n", - " bdata.f, bdata.f1 = fq[1], fq1[1]\n", - " bdata.p, bdata.p1 = fq[2], fq1[2]\n", - " bdata.psir, bdata.psiz = fr[1], fz[1]\n", - " bdata.br, bdata.bz = bdata.psiz/r, -bdata.psir/r\n", - " bdata.psirr, bdata.psizz = frr[1], fzz[1]\n", - " bdata.psirz = frz[1]\n", - " bdata.brr = (bdata.psirz - bdata.br) / r\n", - " bdata.brz = bdata.psizz / r\n", - " bdata.bzr = -(bdata.psirr + bdata.bz) / r\n", - " bdata.bzz = -bdata.psirz / r\n", - " return bdata\n", - "end\n", - "\n", - "function equil_setup(eqsett::equil_settings, sq_in:: JPEC.SplinesMod.CubicSplineType, psi_in::JPEC.SplinesMod.BicubicSplineType)\n", - " # WIP direct_mod.direct_run\n", - " if eqsett.grid_type == \"ldp\"\n", - " psixs = collect(range(0, 1, eqsett.mpsi))\n", - " psi = eqsett.psilow .+ (eqsett.psihigh - eqsett.psilow) .* sin.(psixs .* π / 2).^2\n", - " end\n", - " return psi\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "788c2e66", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "equilibrium of shape: 40x43 and radially resolved: 50\n" - ] - } - ], - "source": [ - "kappa = 1.8 # elongation\n", - "a = 1.0 # minor radius\n", - "r0 = 3.5 # major radius\n", - "q0 = 1.25 # safety factor at r0\n", - "p0fac = 1.0 # >= 1\n", - "b0fac = 1.0\n", - "f0fac = 1.0\n", - "\n", - "mr = 40\n", - "mz = 43\n", - "ma = 50\n", - "\n", - "r = zeros(mr)\n", - "z = zeros(mz)\n", - "rg = zeros(mr,mz)\n", - "zg = zeros(mr,mz)\n", - "\n", - "# psi_in = bicube(mr, mz, 1)\n", - "# sq_in = spline(ma,4)\n", - "\n", - "println(\"equilibrium of shape: \", mr, \"x\", mz, \" and radially resolved: \", ma)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "6fcf34f4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.7" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ro, zo = 0., 0.\n", - "f0 = r0*b0fac\n", - "psio = kappa * f0 * a^2 / (2 * q0 * r0)\n", - "psifac = psio / (a*r0)^2\n", - "efac = 1/kappa^2\n", - "pfac = 2*psio^2*(kappa^2+1)/(a*r0*kappa)^2\n", - "rmin = r0-1.5*a\n", - "rmax = r0+1.5*a\n", - "zmin = -1.5*kappa*a\n", - "zmax = -zmin" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "513f2c97", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "GPECsplines.BicubicSpline(Ptr{Nothing} @0x000000013295ac00, [2.0, 2.076923076923077, 2.1538461538461537, 2.230769230769231, 2.3076923076923075, 2.3846153846153846, 2.4615384615384617, 2.5384615384615383, 2.6153846153846154, 2.6923076923076925 … 4.3076923076923075, 4.384615384615385, 4.461538461538462, 4.538461538461538, 4.615384615384615, 4.6923076923076925, 4.769230769230769, 4.846153846153846, 4.923076923076923, 5.0], [-2.7, -2.5714285714285716, -2.442857142857143, -2.3142857142857145, -2.1857142857142855, -2.057142857142857, -1.9285714285714286, -1.8, -1.6714285714285715, -1.542857142857143 … 1.542857142857143, 1.6714285714285715, 1.8, 1.9285714285714286, 2.057142857142857, 2.1857142857142855, 2.3142857142857145, 2.442857142857143, 2.5714285714285716, 2.7], [-0.8090816326530612 -0.759902124114952 … -0.759902124114952 -0.8090816326530612; -0.775965745354197 -0.7229304469454965 … -0.7229304469454965 -0.775965745354197; … ; -4.596404005319085 -4.298416923999418 … -4.298416923999418 -4.596404005319085; -4.974795918367347 -4.667423990004164 … -4.667423990004164 -4.974795918367347;;;], 39, 42, 1, 0, 0, 3, 3)" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#linspace(0,1,mr)\n", - "rhos = collect(range(0, stop=1, length=ma))\n", - "psis = rhos .^2\n", - "sqfs = zeros(ma, 4)\n", - "sqfs[:, 1] .= f0*f0fac\n", - "sqfs[:, 2] .= pfac * (p0fac .- rhos)\n", - "sqfs[:, 3] .= 0\n", - "sqfs[:, 4] .= rhos\n", - "\n", - "psifs = zeros(mr, mz, 1)\n", - "\n", - "sq_in = GPECsplines.spline_setup(psis, sqfs, 3)\n", - "rs = collect(range(rmin, stop=rmax, length=mr))\n", - "zs = collect(range(zmin, stop=zmax, length=mz))\n", - "for i in 1:mr\n", - " for j in 1:mz\n", - " psifs[i, j, 1] = psio - psifac * (efac * (rs[i] * zs[j])^2 + (rs[i]^2-r0^2)^2/4)\n", - " end\n", - "end\n", - "\n", - "psi_in = GPECsplines.bicube_setup(rs, zs, psifs, 3, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "e86e3f7f", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Make a contour plot of the bicubic spline\n", - "xs_fine = collect(range(rmin, stop=rmax, length=110))\n", - "ys_fine = collect(range(zmin, stop=zmax, length=100))\n", - "fs_fine = GPECsplines.bicube_eval(psi_in, xs_fine, ys_fine)\n", - "# plot the bicubic spline\n", - "p1 = contourf(xs_fine, ys_fine, fs_fine[:, :, 1]', label=\"psi\", legend=:topright)\n", - "title!(\"Psi, solov'ev equilibrium\")\n", - "xlabel!(\"R\")\n", - "ylabel!(\"Z\")\n", - "# equal axis scales\n", - "plot(p1, aspect_ratio=:equal)\n", - "xlims!(rmin, rmax)\n", - "ylims!(zmin, zmax)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f8b12103", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Julia 1.11.4", - "language": "julia", - "name": "julia-1.11" - }, - "language_info": { - "file_extension": ".jl", - "mimetype": "application/julia", - "name": "julia", - "version": "1.11.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/spline_examples2.ipynb b/notebooks/spline_examples2.ipynb new file mode 100644 index 000000000..a51b3899b --- /dev/null +++ b/notebooks/spline_examples2.ipynb @@ -0,0 +1,626 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "814db625", + "metadata": {}, + "outputs": [], + "source": [ + "using Pkg\n", + "Pkg.activate(\"..\")\n", + "Pkg.resolve()\n", + "Pkg.instantiate() # Usually only need to run this once\n", + "using Plots, Printf\n", + "using JPEC.SplinesMod" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6892132a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "#=\n", + "======================================================================\n", + "1. VALIDATION FOR 1D CUBIC SPLINE (Real)\n", + "======================================================================\n", + "=#\n", + "println(\"\\n--- Testing 1D Spline Derivatives and Integration ---\")\n", + "\n", + "# --- 1.1 Data Generation ---\n", + "# Using 20 nodes to create a periodic spline for sin(x) and cos(x)\n", + "xs_nodes = collect(range(0.0, stop=2*pi, length=20))\n", + "y1_nodes = sin.(xs_nodes)\n", + "y2_nodes = cos.(xs_nodes)\n", + "fs_nodes_matrix = hcat(y1_nodes, y2_nodes)\n", + "\n", + "# --- 1.2 Spline Setup (bctype=3 for periodic)---\n", + "spline_real = spline_setup(xs_nodes, fs_nodes_matrix; bctype=3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d38581c", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# --- 1.3 Evaluation on a Fine Grid ---\n", + "xs_fine = collect(range(0.0, stop=2*pi, length=200))\n", + "\n", + "\n", + "# Evaluate the spline and its derivatives up to the 3rd order\n", + "f_s, f1_s, f2_s, f3_s = spline_eval(spline_real, xs_fine, 3)\n", + "\n", + "\n", + "# --- 1.4 Perform Integration ---\n", + "# This modifies the spline_real object in-place, adding the .fsi field\n", + "SplinesMod.spline_integrate!(spline_real)\n", + "\n", + "# The result of integration is stored at the original node points.\n", + "# spline_real.fsi now contains the cumulative integral values.\n", + "integral_s = spline_real.fsi\n", + "\n", + "# --- 1.5 Analytical (True) Values ---\n", + "# True values for the function and its derivatives on the fine grid\n", + "true_f = hcat(sin.(xs_fine), cos.(xs_fine))\n", + "true_f1 = hcat(cos.(xs_fine), -sin.(xs_fine))\n", + "true_f2 = hcat(-sin.(xs_fine), -cos.(xs_fine))\n", + "true_f3 = hcat(-cos.(xs_fine), sin.(xs_fine))\n", + "\n", + "# True values for the integral on the original coarse grid (xs_nodes)\n", + "# Integral of sin(x) from 0 to t is -cos(t) - (-cos(0)) = 1 - cos(t)\n", + "# Integral of cos(x) from 0 to t is sin(t) - sin(0) = sin(t)\n", + "true_integral = hcat(1.0 .- cos.(xs_nodes), sin.(xs_nodes))\n", + "\n", + "print(\"evaluation complete\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a90e8828", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# --- 1.6 Plotting (Focusing on the first function, sin(x)) ---\n", + "\n", + "# Plot for Function Value f(x)\n", + "function generate_spline_plot(\n", + " x_vals, \n", + " spline_data, \n", + " analytic_data;\n", + " title, \n", + " spline_label, \n", + " analytic_label,\n", + " error_scale=1.0,\n", + " legend_pos=:best,\n", + " x_nodes=nothing,\n", + " y_nodes=nothing,\n", + " nodes_label=\"Original Nodes\",\n", + " kwargs...\n", + ")\n", + " \n", + " p = plot(x_vals, spline_data, label=spline_label, title=title, legend=legend_pos; kwargs...)\n", + " \n", + " plot!(p, x_vals, analytic_data, ls=:dash, label=analytic_label)\n", + " scaler_str = isinteger(error_scale) ? string(Int(error_scale)) : string(error_scale)\n", + " error_label = error_scale == 1.0 ? \"Error\" : \"Error x\" * scaler_str\n", + " plot!(p, x_vals, spline_data .- analytic_data, ls=:dot, label=error_label, color=:red)\n", + " \n", + " if x_nodes !== nothing && y_nodes !== nothing\n", + " scatter!(p, x_nodes, y_nodes, label=nodes_label, markersize=3, markerstrokewidth=0)\n", + " end\n", + " \n", + " return p\n", + "end\n", + "\n", + "# --- 1.6 Generate and Display all plots ---\n", + "\n", + "println(\"--- Generating 1D Spline Validation Plots ---\")\n", + "\n", + "plot_configs_real = [\n", + " # f(x) \n", + " (\n", + " spline_data = f_s[:, 1], analytic_data = true_f[:, 1], x_vals = xs_fine,\n", + " title = \"Function: sin(x)\", spline_label = \"Spline f(x)\", analytic_label = \"True f(x)\",\n", + " error_scale = 1000.0, legend_pos = :bottomleft,\n", + " x_nodes = xs_nodes, y_nodes = y1_nodes\n", + " ),\n", + " # f'(x) \n", + " (\n", + " spline_data = f1_s[:, 1], analytic_data = true_f1[:, 1], x_vals = xs_fine,\n", + " title = \"1st Deriv: cos(x)\", spline_label = \"Spline f'(x)\", analytic_label = \"True f'(x)\",\n", + " error_scale = 100.0, legend_pos = :bottomleft\n", + " ),\n", + " # f''(x)\n", + " (\n", + " spline_data = f2_s[:, 1], analytic_data = true_f2[:, 1], x_vals = xs_fine,\n", + " title = \"2nd Deriv: -sin(x)\", spline_label = \"Spline f''(x)\", analytic_label = \"True f''(x)\",\n", + " error_scale = 1.0, legend_pos = :bottomleft\n", + " ),\n", + " # f'''(x)\n", + " (\n", + " spline_data = f3_s[:, 1], analytic_data = true_f3[:, 1], x_vals = xs_fine,\n", + " title = \"3rd Deriv: -cos(x)\", spline_label = \"Spline f'''(x)\", analytic_label = \"True f'''(x)\",\n", + " error_scale = 1.0, legend_pos = :bottomleft\n", + " ),\n", + " # integral \n", + " (\n", + " spline_data = integral_s[:, 1], analytic_data = true_integral[:, 1], x_vals = xs_nodes,\n", + " title = \"Integral: 1-cos(x)\", spline_label = \"Spline Integral\", analytic_label = \"True Integral\",\n", + " error_scale = 1000.0, legend_pos = :topleft,\n", + " style = (markershape=:circle, markersize=3)\n", + " )\n", + "]\n", + "\n", + "\n", + "plot_list_real = []\n", + "println(\"--- Generating 1D Spline Validation Plots ---\")\n", + "\n", + "for config in plot_configs_real\n", + " \n", + " p = generate_spline_plot(\n", + " config.x_vals,\n", + " config.spline_data,\n", + " config.analytic_data;\n", + " title = config.title,\n", + " spline_label = config.spline_label,\n", + " analytic_label = config.analytic_label,\n", + " error_scale = config.error_scale,\n", + " legend_pos = config.legend_pos,\n", + " \n", + " x_nodes = get(config, :x_nodes, nothing),\n", + " y_nodes = get(config, :y_nodes, nothing),\n", + " \n", + " (haskey(config, :style) ? config.style : ())...\n", + " )\n", + " push!(plot_list_real, p)\n", + "end\n", + "\n", + "\n", + "display(plot(plot_list_real..., layout=(3, 2), size=(1200, 1000), margin=5Plots.mm))\n", + "\n", + "\n", + "\n", + "println(\"\\nAll 1D validation plots generated.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94c3d4e9", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "#=\n", + "======================================================================\n", + "2. VALIDATION FOR 1D CUBIC SPLINE (Complex)\n", + "======================================================================\n", + "=#\n", + "println(\"\\n--- Testing 1D Complex Spline Derivatives and Integration ---\")\n", + "\n", + "# --- 2.1 Data Generation ---\n", + "xs_nodes = collect(range(0.0, stop=2*pi, length=40))\n", + "fs_complex_nodes = exp.(im .* xs_nodes)\n", + "\n", + "# --- 2.2 Spline Setup (bctype=3 for periodic) ---\n", + "spline_complex = spline_setup(xs_nodes, fs_complex_nodes; bctype = 3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9178555a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# --- 2.3 Evaluation on a Fine Grid ---\n", + "xs_fine = collect(range(0.0, stop=2*pi, length=200))\n", + "f_cs, f1_cs, f2_cs, f3_cs = spline_eval(spline_complex, xs_fine, 3)\n", + "\n", + "# --- 2.4 Perform Integration ---\n", + "# This modifies the spline_complex object in-place, adding the .fsi field\n", + "SplinesMod.spline_integrate!(spline_complex)\n", + "integral_cs = spline_complex.fsi\n", + "\n", + "# --- 2.5 Analytical (True) Values ---\n", + "true_f_c = exp.(im .* xs_fine)\n", + "true_f1_c = im .* exp.(im .* xs_fine)\n", + "true_f2_c = -1 .* exp.(im .* xs_fine)\n", + "true_f3_c = -im .* exp.(im .* xs_fine)\n", + "\n", + "# True values for the integral on the original node grid\n", + "# Integral of exp(ix) from 0 to t is i*(1 - exp(ix))\n", + "true_integral_c = im .* (1.0 .- exp.(im .* xs_nodes))\n", + "\n", + "print(\"evaluation complete\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "587b6ed1", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# --- 2.6 Plotting ---\n", + "function generate_complex_spline_plot(\n", + " x_vals, \n", + " spline_c, \n", + " analytic_c; \n", + " part, \n", + " title, \n", + " kwargs...\n", + " )\n", + " func = (part == :real) ? real : imag\n", + " \n", + " spline_data = func(spline_c)\n", + " analytic_data = func(analytic_c)\n", + " \n", + " p = plot(x_vals, spline_data, label=\"Spline\", title=title; kwargs...)\n", + " \n", + " plot!(p, x_vals, analytic_data, ls=:dash, label=\"True\")\n", + " plot!(p, x_vals, spline_data .- analytic_data, ls=:dot, label=\"Error\", color=:red)\n", + " \n", + " return p\n", + "end\n", + "\n", + "\n", + "\n", + "plot_configs = [\n", + " (label=\"f(x)\", data_s=f_cs, data_t=true_f_c, formula=\"e^ix\", re_res=\"cos(x)\", im_res=\"sin(x)\", x_vals=xs_fine),\n", + " (label=\"f'(x)\", data_s=f1_cs, data_t=true_f1_c, formula=\"ie^ix\", re_res=\"-sin(x)\", im_res=\"cos(x)\", x_vals=xs_fine),\n", + " (label=\"f''(x)\", data_s=f2_cs, data_t=true_f2_c, formula=\"-e^ix\", re_res=\"-cos(x)\", im_res=\"-sin(x)\", x_vals=xs_fine),\n", + " (label=\"f'''(x)\",data_s=f3_cs, data_t=true_f3_c, formula=\"-ie^ix\", re_res=\"sin(x)\", im_res=\"-cos(x)\", x_vals=xs_fine),\n", + " (label=\"∫f dt\", data_s=integral_cs, data_t=true_integral_c, formula=\"i(1-e^ix)\", re_res=\"sin(x)\", im_res=\"1-cos(x)\", x_vals=xs_nodes, style=(markershape=:circle, markersize=2)),\n", + "]\n", + "\n", + "plot_list = []\n", + "println(\"--- Generating Complex Spline Validation Plots ---\")\n", + "\n", + "\n", + "for config in plot_configs\n", + " for part_info in ((part=:real, name=\"Re\", res=config.re_res), \n", + " (part=:imag, name=\"Im\", res=config.im_res))\n", + " \n", + " title = \"$(config.label) = $(part_info.name)($(config.formula)) = $(part_info.res)\"\n", + " \n", + " plot_style = haskey(config, :style) ? config.style : (legend=:bottomleft,)\n", + "\n", + " p = generate_complex_spline_plot(\n", + " config.x_vals, \n", + " config.data_s, \n", + " config.data_t;\n", + " part=part_info.part,\n", + " title=title,\n", + " plot_style... \n", + " )\n", + " push!(plot_list, p)\n", + " end\n", + "end\n", + "\n", + "display(plot(plot_list..., layout=(5, 2), size=(1000, 1500),\n", + " plot_title=\"Complex Spline: f(x) = e^(ix), Derivatives, and Integral\",\n", + " margin=4Plots.mm))\n", + "\n", + "println(\"\\nAll complex validation plots generated.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97a529f4", + "metadata": {}, + "outputs": [], + "source": [ + "#=\n", + "======================================================================\n", + "3. VALIDATION FOR 2D BICUBIC SPLINE\n", + "======================================================================\n", + "=#\n", + "println(\"\\n--- Testing 2D Bicubic Spline Derivatives ---\")\n", + "\n", + "# --- 3.1 Data Generation (for fitting) ---\n", + "nx_nodes, ny_nodes = 20, 20\n", + "x_nodes = collect(range(0.0, stop=2*pi, length=nx_nodes))\n", + "y_nodes = collect(range(0.0, stop=2*pi, length=ny_nodes))\n", + "\n", + "f_nodes = zeros(nx_nodes, ny_nodes, 1) # n_qty = 1 for this test\n", + "for j in 1:ny_nodes, i in 1:nx_nodes\n", + " f_nodes[i, j, 1] = sin(x_nodes[i]) * cos(y_nodes[j])\n", + "end\n", + "\n", + "# --- 3.2 Spline Setup (bctype=2 for periodic in both dimensions) ---\n", + "bcspline = bicube_setup(x_nodes, y_nodes, f_nodes, bctypex=2, bctypey= 2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1cd773be", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# --- 3.3 Evaluation ---\n", + "nx_fine, ny_fine = 50, 50\n", + "x_fine = collect(range(0.0, stop=2*pi, length=nx_fine))\n", + "y_fine = collect(range(0.0, stop=2*pi, length=ny_fine))\n", + "\n", + "# Get derivatives up to 2nd order\n", + "f_s, fx_s, fy_s, fxx_s, fxy_s, fyy_s = bicube_eval(bcspline, x_fine, y_fine, 2)\n", + "\n", + "\n", + "# --- 3.4 Analytical (True) Functions ---\n", + "f_analytic(x, y) = sin(x) * cos(y)\n", + "fx_analytic(x, y) = cos(x) * cos(y)\n", + "fy_analytic(x, y) = -sin(x) * sin(y)\n", + "fxx_analytic(x, y) = -sin(x) * cos(y)\n", + "fyy_analytic(x, y) = -sin(x) * cos(y)\n", + "fxy_analytic(x, y) = -cos(x) * sin(y)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c70289a", + "metadata": {}, + "outputs": [], + "source": [ + "# --- 3.5 Plotting Helper Function ---\n", + "function generate_bicube_plots(name, spline_data, analytic_func, x_grid, y_grid)\n", + " \n", + " analytical_data = [analytic_func(x, y) for x in x_grid, y in y_grid]\n", + " spline_slice = spline_data[:, :, 1]\n", + " error_data = spline_slice - analytical_data\n", + " max_abs_error = maximum(abs, error_data)\n", + " \n", + " p1 = heatmap(x_grid, y_grid, spline_slice', title=\"Spline: $name\", c=:viridis)\n", + " p2 = heatmap(x_grid, y_grid, analytical_data', title=\"Analytical: $name\", c=:viridis)\n", + " p3 = heatmap(x_grid, y_grid, error_data', title=\"Error (Max Abs: $(@sprintf(\"%.2e\", max_abs_error)))\", c=:bwr)\n", + "\n", + " return plot(p1, p2, p3, layout=(1, 3), size=(1000, 300), aspect_ratio=:equal)\n", + "end\n", + "\n", + "# --- 3.6 Generate and Display all plots ---\n", + "display(generate_bicube_plots(\"f\", f_s, f_analytic, x_fine, y_fine))\n", + "display(generate_bicube_plots(\"fx\", fx_s, fx_analytic, x_fine, y_fine))\n", + "display(generate_bicube_plots(\"fy\", fy_s, fy_analytic, x_fine, y_fine))\n", + "display(generate_bicube_plots(\"fxx\", fxx_s, fxx_analytic, x_fine, y_fine)) \n", + "display(generate_bicube_plots(\"fyy\", fyy_s, fyy_analytic, x_fine, y_fine)) \n", + "display(generate_bicube_plots(\"fxy\", fxy_s, fxy_analytic, x_fine, y_fine))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131e2883", + "metadata": {}, + "outputs": [], + "source": [ + "#=\n", + "======================================================================\n", + "4. VALIDATION FOR 2D FOURIER SPLINE (CUBIC-X, FOURIER-Y)\n", + "======================================================================\n", + "=#\n", + "# Assuming FourierSpline is where the module is located\n", + "# For standalone testing, you might need:\n", + "# include(\"FourierSpline.jl\")\n", + "# using .FourierSpline\n", + "\n", + "println(\"\\n--- Testing 2D Fourier-Spline Derivatives ---\")\n", + "\n", + "\n", + "\n", + "# --- 4.1 Data Generation (for fitting) ---\n", + "# For fit_method=2 (FFT), my_nodes must be a power of 2.\n", + "# We use mx+1 points for x and my+1 points for y.\n", + "# The grid is [0, mx] and [0, my].\n", + "mx_nodes, my_nodes = 32, 32 # my_nodes must be a power of 2 for FFT test\n", + "x_nodes = collect(range(0.0, stop=3.0, length=mx_nodes + 1))\n", + "# y is periodic from 0 to 2pi. The last point y_nodes[my+1] should equal the first y_nodes[1] + 2pi\n", + "y_nodes = collect(range(0.0, stop=2*pi, length=my_nodes + 1))\n", + "\n", + "f_nodes = zeros(mx_nodes + 1, my_nodes + 1, 1) # n_qty = 1\n", + "for j in 1:(my_nodes + 1), i in 1:(mx_nodes + 1)\n", + " f_nodes[i, j, 1] = x_nodes[i]^2 * cos(2 * y_nodes[j])\n", + "end\n", + "\n", + "# --- 4.2 Spline Setup ---\n", + "# Use bctype=1 (natural) for x-direction as it's not periodic.\n", + "# The y-direction is inherently periodic.\n", + "# mband determines how many Fourier modes are used. A higher number gives more accuracy.\n", + "mband_val = 10\n", + "\n", + "# Test both fit methods\n", + "println(\"\\n--- Setting up with fit_method=1 (Integral) ---\")\n", + "fspline_m1 = fspline_setup(x_nodes, y_nodes, f_nodes, mband_val, bctype=4, fit_method=1,fit_flag=true)\n", + "\n", + "println(\"\\n--- Setting up with fit_method=2 (FFT) ---\")\n", + "# This requires my_nodes to be a power of 2.\n", + "fspline_m2 = fspline_setup(x_nodes, y_nodes, f_nodes, mband_val, bctype=2, fit_method=2,fit_flag=true)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "343bbb04", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# --- 4.3 Evaluation ---\n", + "# We will evaluate using the FFT-fitted spline (method 2) as it's generally faster if applicable.\n", + "# You can switch to fspline_m1 to compare.\n", + "chosen_fspline = fspline_m1\n", + "\n", + "nx_fine, ny_fine = 60, 60\n", + "x_fine = collect(range(0.0, stop=3.0, length=nx_fine))\n", + "y_fine = collect(range(0.0, stop=2*pi, length=ny_fine))\n", + "\n", + "# Get derivatives up to 2nd order\n", + "f_s, fx_s, fy_s, fxx_s, fxy_s, fyy_s = fspline_eval(chosen_fspline, x_fine, y_fine, Int(2))\n", + "\n", + "\n", + "# --- 4.4 Analytical (True) Functions (Periodic in y) ---\n", + "f_analytic(x, y) = x^2 * cos(2*y)\n", + "fx_analytic(x, y) = 2*x * cos(2*y)\n", + "fy_analytic(x, y) = -2 * x^2 * sin(2*y)\n", + "fxx_analytic(x, y) = 2 * cos(2*y)\n", + "fyy_analytic(x, y) = -4 * x^2 * cos(2*y)\n", + "fxy_analytic(x, y) = -4 * x * sin(2*y)\n", + "\n", + "print(\"evaluation complete\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "234f912c", + "metadata": {}, + "outputs": [], + "source": [ + "function generate_fspline_plot(name, spline_data, analytic_func, x_grid, y_grid)\n", + "\n", + " \n", + " # 1. Generate the analytical data on the fine grid\n", + " analytical_data = [analytic_func(x, y) for x in x_grid, y in y_grid]\n", + " \n", + " # 2. Extract the 2D slice from the 3D spline output array (n_qty=1)\n", + " spline_slice = spline_data[:, :, 1]\n", + " \n", + " # 3. Calculate the error between the spline and analytical data\n", + " error_data = spline_slice - analytical_data\n", + " max_abs_error = maximum(abs, error_data)\n", + " \n", + " # 4. Create three separate heatmaps for comparison\n", + " # Note: We transpose the data (') because Plots.jl heatmap expects (y, x) data layout\n", + " p1 = heatmap(x_grid, y_grid, spline_slice', \n", + " title=\"Spline: $name\", c=:viridis, aspect_ratio=:equal)\n", + " \n", + " p2 = heatmap(x_grid, y_grid, analytical_data', \n", + " title=\"Analytical: $name\", c=:viridis, aspect_ratio=:equal)\n", + " \n", + " p3 = heatmap(x_grid, y_grid, error_data', \n", + " title=\"Error (Max Abs: $(@sprintf(\"%.2e\", max_abs_error)))\", c=:bwr, aspect_ratio=:equal)\n", + "\n", + " # 5. Combine the three heatmaps into a single plot object with a 1x3 layout\n", + " return plot(p1, p2, p3, layout=(1, 3), size=(800, 400), margin=4Plots.mm)\n", + "end\n", + "\n", + "\n", + "# --- 4.5 Generate all plots ---\n", + "# This section calls the helper function for the main function and each derivative,\n", + "# displaying each result as a separate row of plots.\n", + "\n", + "display(generate_fspline_plot(\"f\", f_s, f_analytic, x_fine, y_fine))\n", + "display(generate_fspline_plot(\"fx\", fx_s, fx_analytic, x_fine, y_fine))\n", + "display(generate_fspline_plot(\"fy\", fy_s, fy_analytic, x_fine, y_fine))\n", + "display(generate_fspline_plot(\"fxx\", fxx_s, fxx_analytic, x_fine, y_fine))\n", + "display(generate_fspline_plot(\"fyy\", fyy_s, fyy_analytic, x_fine, y_fine))\n", + "display(generate_fspline_plot(\"fxy\", fxy_s, fxy_analytic, x_fine, y_fine))\n", + "\n", + "println(\"\\nAll Fourier Spline validation plots generated.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85209e3a-6a08-40e8-874e-85258736419b", + "metadata": {}, + "outputs": [], + "source": [ + "# --- Block 5: Validation of Fourier Coefficients ---\n", + "\n", + "println(\"\\n--- Validating Fourier Coefficients c_m(x) ---\")\n", + "\n", + "# Evaluate the spline of coefficients on the fine x-grid\n", + "# The result is a matrix of size (nx_fine, cs_nqty)\n", + "coeffs_spline_fine = spline_eval(chosen_fspline.cs, x_fine)\n", + "\n", + "# Define the analytical functions for the first few coefficients\n", + "c0_analytic(x) = 0.0 + 0.0im\n", + "c1_analytic(x) = 0.0 + 0.0im\n", + "c2_analytic(x) = (x^2 / 2.0) + 0.0im # This is the only non-zero one\n", + "c3_analytic(x) = 0.0 + 0.0im\n", + "c4_analytic(x) = 0.0 + 0.0im\n", + "\n", + "analytic_funcs = [c0_analytic, c1_analytic, c2_analytic, c3_analytic, c4_analytic]\n", + "\n", + "# Create a list to hold the plot objects\n", + "coefficient_plots = []\n", + "\n", + "\n", + "num_modes_to_plot = min(5, chosen_fspline.cs.nqty)\n", + "\n", + "for m_idx in 1:num_modes_to_plot\n", + " m = m_idx - 1 # Current mode number (m=0, 1, 2, ...)\n", + " \n", + " # Extract the data for the m-th mode from the spline evaluation result\n", + " spline_c_m = coeffs_spline_fine[:, m_idx]\n", + " \n", + " # Generate the analytical data for the m-th mode\n", + " analytic_c_m = [analytic_funcs[m_idx](x) for x in x_fine]\n", + " \n", + " # Plot the real part\n", + " p_real = generate_complex_spline_plot(\n", + " x_fine,\n", + " spline_c_m,\n", + " analytic_c_m,\n", + " part=:real,\n", + " title=\"Re(c_$m(x))\"\n", + " )\n", + " \n", + " # Plot the imaginary part\n", + " p_imag = generate_complex_spline_plot(\n", + " x_fine,\n", + " spline_c_m,\n", + " analytic_c_m,\n", + " part=:imag,\n", + " title=\"Im(c_$m(x))\"\n", + " )\n", + " \n", + " # Add the pair of plots to our list\n", + " push!(coefficient_plots, p_real)\n", + " push!(coefficient_plots, p_imag)\n", + "end\n", + "\n", + "# Combine all coefficient plots into a single figure with a readable layout\n", + "# The layout will be (num_modes_to_plot x 2 columns)\n", + "coeff_plot_layout = (num_modes_to_plot, 2)\n", + "final_coeff_plot = plot(coefficient_plots..., layout=coeff_plot_layout, size=(800, 250 * num_modes_to_plot))\n", + "\n", + "# Display the final combined plot\n", + "display(final_coeff_plot)\n", + "\n", + "println(\"\\nFourier coefficient validation plots generated.\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.11.6", + "language": "julia", + "name": "julia-1.11" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/Equilibrium/AnalyticEquilibrium.jl b/src/Equilibrium/AnalyticEquilibrium.jl new file mode 100644 index 000000000..a8caaad46 --- /dev/null +++ b/src/Equilibrium/AnalyticEquilibrium.jl @@ -0,0 +1,325 @@ +#= +Analytic equilibrium functions that prepare all the necessary equilibrium +input information for a direct or inverse equilibrium construction +=# + +""" + lar_init_conditions(rmin, sigma_type, params) + +Initializes the starting radius and state vector for solving the LAR ODE system. +Also evaluates the initial derivative using the analytic model. + +## Arguments: +- `rmin`: Normalized starting radius (as a fraction of `lar_a`). +- `lar_input`: A `LargeAspectRatioConfig` object containing equilibrium parameters. + +## Returns: +- `r`: Physical radius corresponding to `rmin * lar_a`. +- `y`: Initial state vector of length 5. +""" +function lar_init_conditions(rmin::Float64, lar_input::LargeAspectRatioConfig) + lar_a = lar_input.lar_a + lar_r0 = lar_input.lar_r0 + q0 = lar_input.q0 + + r = rmin * lar_a + y = zeros(5) + + y[1] = r^2 / (lar_r0 * q0) + y[2] = 1.0 + y[3] = y[1] * lar_r0 / 2 + + dy = zeros(5) + lar_der(dy, r, y, lar_input) + + y[5] = dy[5] * r / 4 + + q = r^2 * y[2] / (lar_r0 * y[1]) + y[4] = (q / r)^2 * y[5] / 2 + + return r, y +end + +""" + lar_der(dy, r, y, lar_input) + +Evaluates the spatial derivatives of the LAR (Large Aspect Ratio) equilibrium ODE system +at a given radius `r`, using the current state vector `y` and equilibrium parameters. + +## Arguments: +- `dy`: A preallocated vector where the computed derivatives will be stored (in-place). +- `r`: The radial position at which the derivative is evaluated. +- `y`: The current state vector. +- `lar_input`: A `LargeAspectRatioConfig` object containing equilibrium shaping parameters. + +## Returns: +- 0. The result is stored in-place in `dy`. +""" + +function lar_der(dy::Vector{Float64}, r::Float64, y::Vector{Float64}, lar_input::LargeAspectRatioConfig) + lar_a = lar_input.lar_a + lar_r0 = lar_input.lar_r0 + + q0 = lar_input.q0 + + beta0 = lar_input.beta0 + p00 = beta0 / 2.0 + p_pres = lar_input.p_pres + p_sig = lar_input.p_sig + + sigma_type = lar_input.sigma_type + x = r / lar_a + xfac = 1 - x^2 + pp = -2 * p_pres * p00 * x * xfac^(p_pres - 1) # p' + sigma0 = 2.0 / (q0 * lar_r0) + + sigma = if sigma_type == "wesson" + sigma0 * xfac^p_sig + else + sigma0 / (1 + x^(2 * p_sig))^(1 + 1 / p_sig) + end + + bsq = (y[1] / max(r, eps()))^2 + y[2]^2 # B² + q = r^2 * y[2] / (lar_r0 * max(y[1], eps())) + + dy[1] = -pp/bsq*y[1] + sigma*y[2]*r + dy[2] = -pp/bsq*y[2] - sigma*y[1]/max(r, eps()) + dy[3] = y[1] * lar_r0 / max(r, eps()) + dy[4] = ((q / max(r, eps()))^2) * y[5] / max(r, eps()) + dy[5] = y[2] * (r / max(q, eps()))^2 * (r / lar_r0) * (1 - 2 * (lar_r0 * q / max(y[2], eps()))^2 * pp) + + return 0 +end + +""" + lar_run(lar_input) + +Solves the LAR (Large Aspect Ratio) plasma equilibrium ODE system using analytic profiles +defined by `lar_input`, and returns the full solution table including derived quantities. + +## Arguments: +- `lar_input`: A `LargeAspectRatioConfig` object containing profile and geometric parameters. + +## Returns: + - working on it not yet implemented +""" + +function lar_run(equil_input::EquilConfig, lar_input::LargeAspectRatioConfig) + rmin = 1e-4 + lar_a = lar_input.lar_a + lar_r0 = lar_input.lar_r0 + q0 = lar_input.q0 + beta0 = lar_input.beta0 + sigma_type = lar_input.sigma_type + + p00 = beta0 / 2.0 + lar_input.p_pres = max(lar_input.p_pres, 1.001) + + sigma0 = 2.0 / (q0 * lar_r0) + + ma = lar_input.ma + mtau = lar_input.mtau + + function dydr(du, u, p, r) + lar_input = p + lar_der(du, r, u, lar_input) + end + + r0, y0 = lar_init_conditions(rmin, lar_input) + tspan = (r0, lar_a) + p = lar_input + + prob = ODEProblem(dydr, y0, tspan, p) + sol = solve(prob, Rosenbrock23(autodiff=AutoFiniteDiff()); reltol=1e-6, abstol=1e-8, maxiters=10000) + + r_arr = sol.t + y_mat = hcat(sol.u...)' + steps = length(r_arr) + + temp = zeros(steps, 9) + for i in 1:steps + r = r_arr[i] + y = y_mat[i, :] + x = r / lar_a + xfac = 1 - x^2 + pval = p00 * xfac^lar_input.p_pres + sigma = (sigma_type == "wesson") ? + sigma0 * xfac^lar_input.p_sig : + sigma0 / (1 + x^(2 * lar_input.p_sig))^(1 + 1 / lar_input.p_sig) + q = r^2 * y[2] / (lar_r0 * y[1]) + temp[i, :] = [r; y; pval; sigma; q] + end + + xs_r = temp[:, 1] + fs_r = temp[:, 2:9] + spl = Spl.spline_setup(xs_r, fs_r, bctype=4) + + dr = lar_a / (ma + 1) + r = 0.0 + psio = temp[end, 4] # ψ_edge + + sq_xs = zeros(ma + 1) + sq_fs = zeros(ma + 1, 3) + r_nodes = zeros(ma + 1) + + for ia in 1:(ma + 1) + r += dr + r_nodes[ia] = r + f, f1 = Spl.spline_eval(spl, r,1) + ψ = f[3] + Bphi = f[2] + pval = f[6] + qval = f[8] + dψdr = f1[3] + r2 = -(f[4] * r / f[8]) / dψdr + sq_xs[ia] = ψ / psio + sq_fs[ia, 1] = lar_r0 * Bphi + sq_fs[ia, 2] = pval + sq_fs[ia, 3] = qval + end + + sq_in = Spl.spline_setup(sq_xs, sq_fs, bctype=4) + + rzphi_y_nodes = range(0.0, 2π, length=mtau + 1) + rzphi_fs_nodes = zeros(ma + 1, mtau + 1, 2) + + for ia in 1:(ma + 1) + r = r_nodes[ia] + f, f1 = Spl.spline_eval(spl, r, 1) + y4 = f[4] + q = f[8] + dψdr = f1[3] + r2 = -(y4 * r / q) / dψdr + if lar_input.zeroth + r2 = 0.0 + end + + for itau in 1:(mtau + 1) + θ = 2π * (itau - 1) / mtau + cosθ, sinθ = cos(θ), sin(θ) + rfac = r + r2 * cosθ + rzphi_fs_nodes[ia, itau, 1] = lar_r0 + rfac * cosθ + rzphi_fs_nodes[ia, itau, 2] = rfac * sinθ + end + end + + rz_in = Spl.bicube_setup(r_nodes, collect(rzphi_y_nodes), rzphi_fs_nodes, bctypex=4, bctypey=2) + + return InverseRunInput(equil_input, sq_in, rz_in, lar_r0, 0.0, psio) + +end + + +""" +This is a Julia version of the Fortran code in sol.f, implementing Soloviev's analytical equilibrium. + +## Arguments: +- `mr`: Number of radial grid zones +- `mz`: Number of axial grid zones +- `ma`: Number of flux grid zones +- `e`: Elongation +- `a`: Minor radius +- `r0`: Major radius +- `q0`: Safety factor at the o-point +- `p0fac`: Scales on axis pressure (s*P. beta changes. Phi,q constant) +- `b0fac`: Scales on toroidal field (s*Phi,s*f,s^2*P. bt changes. Shape,beta constant) +- `f0fac`: Scales on toroidal field (s*f. bt,q changes. Phi,p,bp constant) + +## Returns: +- `plasma_eq`: PlasmaEquilibrium object +""" +function sol_run( + equil_inputs::EquilConfig, + sol_inputs::SolevevConfig + ) + + mr = sol_inputs.mr + mz = sol_inputs.mz + ma = sol_inputs.ma + e = sol_inputs.e + a = sol_inputs.a + r0 = sol_inputs.r0 + q0 = sol_inputs.q0 + p0fac = sol_inputs.p0fac + b0fac = sol_inputs.b0fac + f0fac = sol_inputs.f0fac + + # Validate inputs + if p0fac < 1.0 + @warn "Forcing p0fac ≥ 1 (no negative pressure)" + p0fac = 1.0 + end + + # Grid setup + r = range(0.0, stop=a, length=mr) + z = range(-a*e, stop=a*e, length=mz) + rg = [ri for ri in r, _ in z] + zg = [zi for _ in r, zi in z] + + #----------------------------------------------------------------------- + # allocate arrays + #----------------------------------------------------------------------- + sq_in = zeros(Float64, ma, 4) + psi_in = zeros(Float64, mr, mz) + sqfs = zeros(ma, 4) + psifs = zeros(mr, mz, 1) + + r = zeros(Float64, mr) + z = zeros(Float64, mz) + rg = zeros(Float64, mr, mz) # 2D grid arrays + zg = zeros(Float64, mr, mz) + #----------------------------------------------------------------------- + # compute scalar data (EXTERNAL DEPENDENCIES - global variables) + #----------------------------------------------------------------------- + ro = 0 # EXTERNAL: global variable ro? + zo = 0 # EXTERNAL: global variable zo? + f0 = r0 * b0fac + psio = e * f0 * a * a / (2 * q0 * r0) + psifac = psio / (a * r0)^2 + efac = 1 / (e * e) + pfac = 2 * psio^2 * (e * e + 1) / (a * r0 * e)^2 + rmin = r0 - 1.5 * a + rmax = r0 + 1.5 * a + zmax = 1.5 * e * a + zmin = -zmax + #----------------------------------------------------------------------- + # compute 1D data + #----------------------------------------------------------------------- + psis = [(ia / (ma + 1))^2 for ia in 1:ma] # changed from ...ia in 1:(ma+1)] + sqfs[:, 1] .= f0 * f0fac + sqfs[:, 2] = pfac .* (1 * p0fac .- psis) + sqfs[:, 3] .= 0.0 + + sq_in = Spl.spline_setup(psis, sqfs; bctype=3) + sq_in = Spl.spline_setup(psis, sqfs; bctype=3) + #----------------------------------------------------------------------- + # compute 2D data + #----------------------------------------------------------------------- + for ir in 1:(mr) + r[ir] = rmin + (ir-1) * (rmax - rmin) / mr + end + + for iz in 1:(mz) + z[iz] = zmin + (iz-1) * (zmax - zmin) / mz + end + + for iz in 1:(mz) + for ir in 1:(mr) + # rg[ir, iz] = r[ir] + # zg[ir, iz] = z[iz] + psifs[ir, iz, 1] = psio - psifac * (efac * (r[ir] * z[iz])^2 + (r[ir]^2 - r0^2)^2 / 4) + end + end + + psi_in = Spl.bicube_setup(r, z, psifs; bctypex=3, bctypey=3) + #----------------------------------------------------------------------- + # process equilibrium + #----------------------------------------------------------------------- + println("Generating Soloviev equilibrium inputs with:") + println(" mr=$mr, mz=$mz, ma=$ma") + println(" e=$e, a=$a, r0=$r0") + println(" q0=$q0, p0fac=$p0fac, b0fac=$b0fac, f0fac=$f0fac") + + return DirectRunInput(equil_inputs, sq_in, psi_in, rmin, rmax, zmin, zmax, psio) + +end diff --git a/src/Equilibrium/DirectEquilibrium.jl b/src/Equilibrium/DirectEquilibrium.jl new file mode 100644 index 000000000..24f774595 --- /dev/null +++ b/src/Equilibrium/DirectEquilibrium.jl @@ -0,0 +1,629 @@ +#= +This file contains the logic for the "direct" equilibrium reconstruction method. +It takes parsed data and splines from the IO module and calculates the final flux-coordinate +representation of the plasma equilibrium. +=# + + +# --- Internal Helper Structs --- +""" + DirectBField + +Internal mutable struct to hold B-field components and their derivatives at a point. +It is used as a temporary workspace to avoid allocations in tight loops. +""" +mutable struct DirectBField + psi::Float64 + psir::Float64 # d(psi)/dr + psiz::Float64 # d(psi)/dz + psirz::Float64 # d2(psi)/drdz + psirr::Float64 # d2(psi)/drdr + psizz::Float64 # d2(psi)/dzdz + f::Float64 # F = R*Bt + f1::Float64 # dF/d(psi_norm) + p::Float64 # mu0*Pressure + p1::Float64 # dP/d(psi_norm) + br::Float64 # Br + bz::Float64 # Bz + brr::Float64 # d(Br)/dr + brz::Float64 # d(Br)/dz + bzr::Float64 # d(Bz)/dr + bzz::Float64 # d(Bz)/dz + + DirectBField() = new(zeros(Float64, 16)...) +end + +""" + FieldLineDerivParams + +A struct to hold constant parameters for the ODE integration, making them +easily accessible within the derivative function `direct_fl_der!`. +""" +struct FieldLineDerivParams + ro::Float64 + zo::Float64 + psi_in::Spl.BicubicSplineType + sq_in::Spl.CubicSplineType + psio::Float64 + power_bp::Int + power_b::Int + power_r::Int +end + + +""" + direct_get_bfield!(bf_out, r, z, psi_in, sq_in, psio; derivs=0) + +Calculates the magnetic field and its derivatives at a given (R,Z) point. +The results are stored in-place in the `bf_out` object. + +## Arguments: +- `bf_out`: A mutable `DirectBField` struct to store the results. +- `r`: The R-coordinate [m]. +- `z`: The Z-coordinate [m]. +- `psi_in`: The 2D bicubic spline for poloidal flux `ψ(R,Z)`. +- `sq_in`: The 1D cubic spline for profiles `F(ψ_norm)` and `P(ψ_norm)`. +- `psio`: The total flux difference `|ψ_axis - ψ_boundary|`. + +## Keyword Arguments: +- `derivs`: An integer specifying the derivative level to compute. + - `0`: Calculates `ψ`, `F`, and `P`. + - `1`: Also calculates 1st derivatives of `ψ` and `B` field components. + - `2`: Also calculates 2nd derivatives of `ψ` and 1st derivatives of `B`. + +## Returns: +- `nothing`. The `bf_out` object is modified in-place. +""" +function direct_get_bfield!( + bf_out::DirectBField, + r::Float64, + z::Float64, + psi_in::Spl.BicubicSplineType, + sq_in::Spl.CubicSplineType, + psio::Float64; + derivs::Int=0 +) + # 1. Evaluate 2D spline for psi(r,z) and its derivatives + if derivs == 0 + f_psi = Spl.bicube_eval(psi_in, r, z, 0) + bf_out.psi = f_psi[1] + elseif derivs == 1 + f_psi, fx_psi, fy_psi = Spl.bicube_eval(psi_in, r, z, 1) + bf_out.psi = f_psi[1] + bf_out.psir = fx_psi[1] + bf_out.psiz = fy_psi[1] + else # derivs >= 2 + f_psi, fx_psi, fy_psi, fxx_psi, fxy_psi, fyy_psi = Spl.bicube_eval(psi_in, r, z, 2) + bf_out.psi = f_psi[1] + bf_out.psir = fx_psi[1] + bf_out.psiz = fy_psi[1] + bf_out.psirr = fxx_psi[1] + bf_out.psirz = fxy_psi[1] + bf_out.psizz = fyy_psi[1] + end + + # 2. Evaluate 1D splines for F(psi_norm) and P(psi_norm) + # psi_norm = 0 at axis, 1 at boundary. + psi_norm = (psio > 1e-12) ? (1.0 - bf_out.psi / psio) : 0.0 + psi_norm = clamp(psi_norm, 0.0, 1.0) + + f_sq, f1_sq = Spl.spline_eval(sq_in, psi_norm, 1) + bf_out.f = f_sq[1] # F = R*Bt + bf_out.f1 = f1_sq[1] # dF/d(psi_norm) + bf_out.p = f_sq[2] # mu0*Pressure + bf_out.p1 = f1_sq[2] # dP/d(psi_norm) + + (derivs < 1) && return + + # 3. Evaluate magnetic field components (derivs >= 1) + bf_out.br = bf_out.psiz / r # Br = (1/R) * ∂ψ/∂Z + bf_out.bz = -bf_out.psir / r # Bz = -(1/R) * ∂ψ/∂R + + (derivs < 2) && return + + # 4. Evaluate derivatives of B-field components (derivs >= 2) + bf_out.brr = (bf_out.psirz - bf_out.br) / r #d(Br)/dr + bf_out.brz = bf_out.psizz / r #d(Br)/dz + bf_out.bzr = -(bf_out.psirr + bf_out.bz) / r #d(Bz)/dr + bf_out.bzz = -bf_out.psirz / r # d(Bz)/dz + + return +end + + +""" + direct_position(psi_in, sq_in, psio, ro_guess, zo_guess, rmin, rmax) + +Finds the key geometric locations of the equilibrium: the magnetic axis (O-point) +and the inboard/outboard separatrix crossings on the midplane. + +## Arguments: +- `psi_in`: The 2D `ψ(R,Z)` spline. +- `sq_in`: The 1D profile spline. +- `psio`: Initial flux difference. +- `ro_guess`, `zo_guess`: Initial guess for the magnetic axis location [m]. +- `rmin`, `rmax`: Radial bounds of the computational domain [m]. + +## Returns: +- `ro`: R-coordinate of the magnetic axis [m]. +- `zo`: Z-coordinate of the magnetic axis [m]. +- `rs1`: R-coordinate of the inboard separatrix crossing [m]. +- `rs2`: R-coordinate of the outboard separatrix crossing [m]. +- `psi_in_new` : returns psi_in renormalized by * psio/psi(ro,zo) +""" +function direct_position( + psi_in::Spl.BicubicSplineType, + sq_in::Spl.CubicSplineType, + psio::Float64, + ro_guess::Float64, + zo_guess::Float64, + rmin::Float64, + rmax::Float64 +) + bf_temp = DirectBField() + r, z = ro_guess, zo_guess + max_newton_iter = 200 + + # 1. Find the magnetic axis (O-point) using Newton-Raphson + println("Finding magnetic axis...") + # (Initial coarse search for r if guess is 0.0) + # find o point coarse guess by finding point psi extrema by Bz. + if r ≈ 0.0 + r_mid, z_mid = (rmax + rmin) / 2.0, zo_guess + dr_scan = (rmax - rmin) / 20.0 + r = r_mid + for _ in 1:20 + direct_get_bfield!(bf_temp, r, z_mid, psi_in, sq_in, psio, derivs=1) + if bf_temp.bz >= 0.0; break; end + r += dr_scan + end + z = z_mid + end + + for iter in 1:20 + direct_get_bfield!(bf_temp, r, z, psi_in, sq_in, psio, derivs=2) + det = bf_temp.brr * bf_temp.bzz - bf_temp.brz * bf_temp.bzr + if abs(det) < 1e-20; error("Jacobian matrix is singular near ($r, $z)."); end + # Δx = -J^-1 F + dr = (bf_temp.brz * bf_temp.bz - bf_temp.bzz * bf_temp.br) / det + dz = (bf_temp.bzr * bf_temp.br - bf_temp.brr * bf_temp.bz) / det + r += dr; z += dz + @printf " Iter %2d: R = %.6f, Z = %.6f, |ΔR|=%.2e, |ΔZ|=%.2e\n" iter r z abs(dr) abs(dz) + if abs(dr) <= 1e-12 * abs(r) && abs(dz) <= 1e-12 * abs(r) + println("Magnetic axis found at R=$(r), Z=$(z).") + break + end + (iter == 20) && @warn "O-point search did not converge." + end + ro, zo = r, z + + # 2. Psi Renormalization + # renormalize psi_in by psi_in * psio/psi(ro,zo) + # Redefined to avoid direct modification of the psi_rz structure. + # However, if it is determined that redefining psi_rz will not cause major problems, + # modification may be permitted. + direct_get_bfield!(bf_temp, ro, zo, psi_in, sq_in, psio, derivs=0) + psi_at_axis = bf_temp.psi + fac = psio/psi_at_axis + new_psi_fs = psi_in.fs * fac + x_coords = Vector(psi_in.xs) + y_coords = Vector(psi_in.ys) + psi_in_new = Spl.bicube_setup(x_coords, y_coords, new_psi_fs, bctypex=4, bctypey=4) + + if abs(psi_at_axis - psio) / psio > 1e-3 + @warn "Psi at located axis (O-point) differs from expected psio. " * + "Psi(axis)=$(psi_at_axis), psio=$(psio). Proceeding without re-fitting." + end + + # 3. Find inboard (rs1) and outboard (rs2) separatrix positions + # Helper function for robust Newton-Raphson search with restarts + function find_separatrix_crossing(start_r, end_r, label) + println("Finding $label separatrix crossing...") + local r_sol::Float64 + found = false + for ird in 0:5 # 6 restart attempts + r_sep = (start_r * (3.0 - 0.5 * ird) + end_r) / (4.0 - 0.5 * ird) + @printf " Restart attempt %d/6 with initial R = %.6f\n" (ird + 1) r_sep + for _ in 1:max_newton_iter + + direct_get_bfield!(bf_temp, r_sep, zo, psi_in_new, sq_in, psio, derivs=1) + if abs(bf_temp.psir) < 1e-14; @warn "d(psi)/dr is near zero."; break; end + dr = -bf_temp.psi / bf_temp.psir + r_sep += dr + if abs(dr) <= 1e-12 * abs(r_sep); r_sol = r_sep; found = true; break; end + end + if found; break; end + end + !found && error("Could not find $label separatrix after all attempts.") + println("$label separatrix found at R=$(r_sol).") + return r_sol + end + + rs1 = find_separatrix_crossing(ro, rmin, "inboard") + rs2 = find_separatrix_crossing(ro, rmax, "outboard") + + # 4. Return the new spline + return ro, zo, rs1, rs2, psi_in_new +end + + +""" + direct_fl_int(ipsi, psifac, raw_profile, ro, zo, rs2) + +Performs the field-line integration for a single flux surface. + +## Arguments: +- `ipsi`: The index of the current flux surface. +- `psifac`: The normalized psi value for the surface (ψ_norm). +- `raw_profile`: The `DirectRunInput` object containing splines and parameters. +- `ro`, `zo`: Coordinates of the magnetic axis [m]. +- `rs2`: R-coordinate of the outboard separatrix [m]. + +## Returns: +- `y_out`: A matrix containing the integrated quantities vs. the geometric angle `η`. +- `bf_start`: A `DirectBField` object with values at the integration start point. +""" +function direct_fl_int( + ipsi::Int, + psifac::Float64, + raw_profile::DirectRunInput, + ro::Float64, + zo::Float64, + rs2::Float64 +) + # 1. Find the starting point on the flux surface (outboard midplane) + psi0_target = raw_profile.psio * (1.0 - psifac) + r_start = ro + sqrt(psifac) * (rs2 - ro) + z_start = zo + + bf_start = DirectBField() + for _ in 1:10 # Refine starting R using Newton's method + direct_get_bfield!(bf_start, r_start, z_start, raw_profile.psi_in, raw_profile.sq_in, raw_profile.psio, derivs=1) + dr = (psi0_target - bf_start.psi) / bf_start.psir + r_start += dr + if abs(dr) <= 1e-12 * r_start; break; end + end + direct_get_bfield!(bf_start, r_start, z_start, raw_profile.psi_in, raw_profile.sq_in, raw_profile.psio, derivs=2) + psi0_actual = bf_start.psi + + # 2. Set up and solve the ODE for field line following + u0 = zeros(Float64, 4) + #[1]:∫(dl/Bp) + #[2]: rfac (radial distance from magnetic axis) + #[3]: ∫(dl/(R²Bp)) + #[4]: ∫(jac*dl/Bp) + u0[2] = sqrt((r_start - ro)^2 + (z_start - zo)^2) # Initial rfac + tspan = (0.0, 2.0 * pi) + + equil_input = raw_profile.config.control + + params = FieldLineDerivParams(ro, zo, raw_profile.psi_in, raw_profile.sq_in, raw_profile.psio, + equil_input.power_bp, equil_input.power_b, equil_input.power_r) + + # Use a callback to refine the solution at each step to stay on the flux surface + saved_values = Vector{Vector{Float64}}() + function refine_and_save_affect!(integrator) + rfac_refined = direct_refine(integrator.u[2], integrator.t, psi0_actual, params) + integrator.u[2] = rfac_refined + push!(saved_values, [integrator.t; integrator.u]) + end + callback = DiscreteCallback((u,t,i) -> true, refine_and_save_affect!, save_positions=(false,false)) + + # Add the initial state + push!(saved_values, [0.0; u0]) + + prob = ODEProblem(direct_fl_der!, u0, tspan, params) + sol = solve(prob, Tsit5(), callback=callback, reltol=1e-6, abstol=1e-8, dt=2*pi/200, adaptive=true) + + if sol.retcode != :Success && sol.retcode != :Terminated + error("ODE integration failed for ipsi=$ipsi with code: $(sol.retcode)") + end + + # 3. Finalize output + y_out = hcat(saved_values...)' # Convert vector of vectors to a matrix + return y_out, bf_start +end + + +""" + direct_fl_der!(dy, y, params, eta) + +The derivative function for the field-line integration ODE. This is passed to +the `DifferentialEquations.jl` solver. + +## Arguments: +- `dy`: The derivative vector (output, modified in-place). +- `y`: The state vector `[∫(dl/Bp), rfac, ∫(dl/(R²Bp)), ∫(jac*dl/Bp)]`. +- `params`: A `FieldLineDerivParams` struct with all necessary parameters. +- `eta`: The independent variable (geometric angle `η`). +""" +function direct_fl_der!(dy, y, params::FieldLineDerivParams, eta) + cos_eta, sin_eta = cos(eta), sin(eta) + r = params.ro + y[2] * cos_eta + z = params.zo + y[2] * sin_eta + + bf_temp = DirectBField() + direct_get_bfield!(bf_temp, r, z, params.psi_in, params.sq_in, params.psio, derivs=1) + + bp_sq = bf_temp.br^2 + bf_temp.bz^2 + bp = bp_sq > 1e-28 ? sqrt(bp_sq) : 1e-14 + bt = bf_temp.f / r + b_sq = bp_sq + bt^2 + b = sqrt(b_sq) + jacfac = (bp^params.power_bp) * (b^params.power_b) / (r^params.power_r) + + # Denominator for d(l_pol)/d(eta) = rfac |B_pol|/denominator + denominator = bf_temp.bz * cos_eta - bf_temp.br * sin_eta + if abs(denominator) < 1e-14 + fill!(dy, 1e20) # Return large derivatives for solver to handle stiffness + @warn "Denominator in direct_fl_der! near zero at eta=$eta." + return + end + + # dy/d(eta) + dy[1] = y[2] / denominator # d/dη [∫(dl/Bp)] = 1/|B_P| dl/d(eta) = rfac/denominator + dy[2] = dy[1] * (bf_temp.br * cos_eta + bf_temp.bz * sin_eta) + # d(rfac)/d(eta) = rfac/denom *( Br cos(eta) + Bz sin(eta) ) + dy[3] = dy[1] / (r^2) # d/dη [∫(dl/(R²Bp))] + dy[4] = dy[1] * jacfac # d/dη [∫(jac*dl/Bp)] + return +end + + +""" + direct_refine(rfac, eta, psi0, params) + +Refines the radial distance `rfac` at a given angle `eta` to ensure the +point lies exactly on the target flux surface `psi0`. + +## Arguments: +- `rfac`: The current guess for the radial distance from the magnetic axis. +- `eta`: The geometric poloidal angle. +- `psi0`: The target `ψ` value for the flux surface. +- `params`: A `FieldLineDerivParams` struct. + +## Returns: +- The refined `rfac` value. +""" +function direct_refine(rfac::Float64, eta::Float64, psi0::Float64, params::FieldLineDerivParams; max_iter::Int=10)::Float64 + cos_eta, sin_eta = cos(eta), sin(eta) + bf_temp = DirectBField() + + for _ in 1:max_iter + r_current = params.ro + rfac * cos_eta + z_current = params.zo + rfac * sin_eta + direct_get_bfield!(bf_temp, r_current, z_current, params.psi_in, params.sq_in, params.psio, derivs=1) + dpsi = bf_temp.psi - psi0 + + # Newton's method derivative: d(psi)/d(rfac) + dpsi_drfac = bf_temp.psir * cos_eta + bf_temp.psiz * sin_eta + if abs(dpsi_drfac) < 1e-14 + @warn "Refinement failed at eta=$eta: d(psi)/d(rfac) is zero." + return rfac # Return current best guess + end + + drfac = -dpsi / dpsi_drfac + rfac += drfac + + if abs(dpsi) <= 1e-12 || abs(drfac) <= 1e-12 * abs(rfac) + return rfac # Converged + end + end + + @warn "direct_refine did not converge after $max_iter iterations at eta=$eta." + return rfac +end + + +""" + equilibrium_solver(raw_profile) + +The main driver for the direct equilibrium reconstruction. It orchestrates the entire +process from finding the magnetic axis to integrating along field lines and +constructing the final coordinate and physics quantity splines. + +## Arguments: +- `raw_profile`: A `DirectRunInput` object containing the initial splines (`psi_in`, `sq_in`) + and run parameters (`equil_input`). + +## Returns: +- A `PlasmaEquilibrium` object containing the final, processed equilibrium data, + including the profile spline (`sq`), the coordinate mapping spline (`rzphi`), and + the physics quantity spline (`eqfun`). +""" +function equilibrium_solver(raw_profile::DirectRunInput) + println("--- Starting Direct Equilibrium Processing ---") + + # 1. Unpack initial data + equil_params = raw_profile.config.control + sq_in = raw_profile.sq_in + psi_in = raw_profile.psi_in + psio = raw_profile.psio + mtheta = equil_params.mtheta + + # 2. Setup the new output radial grid (`ψ_norm`) + mpsi = equil_params.mpsi + psilow = equil_params.psilow + psihigh = equil_params.psihigh + + sq_x_nodes = zeros(Float64, mpsi + 1) + if equil_params.grid_type == "ldp" + for i in 0:mpsi + x_param = Float64(i) / mpsi + sq_x_nodes[i+1] = psilow + (psihigh - psilow) * sin(x_param * pi / 2.0)^2 + end + else + error("Unsupported grid_type: $(equil_params.grid_type)") + end + # need to add more grid type + + #2pi*F, mu0P, dvdpsi, q + sq_fs_nodes = zeros(Float64, mpsi + 1, 4) + + ro_guess = (raw_profile.rmin + raw_profile.rmax) / 2.0 + zo_guess = (raw_profile.zmin + raw_profile.zmax) / 2.0 + + + + # 3. Find key geometric positions and perform normalization + ro, zo, rs1, rs2, psi_in_norm = direct_position(psi_in, sq_in, psio, + ro_guess, zo_guess, # initial guess + raw_profile.rmin, raw_profile.rmax) + + + + normalized_profile = DirectRunInput( + raw_profile.config, + raw_profile.sq_in, + psi_in_norm, + raw_profile.rmin, + raw_profile.rmax, + raw_profile.zmin, + raw_profile.zmax, + raw_profile.psio + ) + + # 4. Main integration loop over flux surfaces + local rzphi::Spl.BicubicSplineType + local eqfun::Spl.BicubicSplineType + local rzphi_fs_nodes + + println("Starting loop over flux surfaces...") + # Loop from edge inwards (index mpsi+1 down to 1) + for ipsi in (mpsi+1):-1:1 + psi_norm_surf = sq_x_nodes[ipsi] + @printf "--> Processing surface ipsi = %d / %d (ψ_norm = %.4f)\n" (ipsi-1) mpsi psi_norm_surf + + # a. Integrate along the field line for this surface + y_out, bf_start = direct_fl_int(ipsi, psi_norm_surf, normalized_profile, ro, zo, rs2) + #y_out + #[1]: eta + #[2]:∫(dl/Bp) + #[3]: rfac (radial distance from magnetic axis) + #[4]: ∫(dl/(R²Bp)) + #[5]: ∫(jac*dl/Bp) + + # b. Process integration results into a temporary periodic spline `ff(θ_new)` + theta_new_nodes = y_out[:, 5] ./ y_out[end, 5] #SFL angle θ_new + ff_fs_nodes = hcat( + y_out[:, 3].^2, # 1: rfac² + y_out[:, 1] / (2*pi) .- theta_new_nodes, # 2: η/(2π) - θ_new + bf_start.f * (y_out[:, 4] .- theta_new_nodes .* y_out[end, 4]), # 3: Toroidal stream function term (term for calculate q) + y_out[:, 2] ./ y_out[end, 2] .- theta_new_nodes # 4: Jacobian-related term + ) + ff = Spl.spline_setup(theta_new_nodes, ff_fs_nodes, bctype="periodic") + + # c. On first iteration, allocate the main output data array + if ipsi == (mpsi+1) + rzphi_fs_nodes = zeros(Float64, mpsi + 1, mtheta + 1, 4) + end + + # d. Interpolate `ff` onto the uniform `theta` grid for `rzphi` + rzphi_y_nodes = range(0.0, 1.0, length=mtheta + 1) + for itheta in 1:(mtheta + 1) + theta_val = rzphi_y_nodes[itheta] + f, f1 = Spl.spline_eval(ff, theta_val, 1) + + rzphi_fs_nodes[ipsi, itheta, 1:3] = f[1:3] + jac_term = (1.0 + f1[4]) * y_out[end, 2] * (2*pi) * psio + rzphi_fs_nodes[ipsi, itheta, 4] = jac_term + end + + # e. Store surface-averaged quantities for the `sq` spline + sq_fs_nodes[ipsi, 1] = bf_start.f * (2pi) # 2pi*F + sq_fs_nodes[ipsi, 2] = bf_start.p + sq_fs_nodes[ipsi, 3] = y_out[end, 5] * (2pi) *psio # dV/d(psi) + sq_fs_nodes[ipsi, 4] = y_out[end, 4] * bf_start.f / (2pi) # q-profile + end + println("...Loop over flux surfaces finished.") + + # 5. Finalize splines and perform q-profile revision if needed + sq = Spl.spline_setup(sq_x_nodes, sq_fs_nodes, bctype=4) + + if equil_params.newq0 != 0.0 + println("Revising q-profile for newq0 = $(equil_params.newq0)...") + f = Spl.spline_eval(sq, 0.0, 0) + # q0_old = q(psi=0) = f[4] at x=0 + # f0_old = f[1] at x=0 + q0_old = f[4] + f0_old = f[1] + + f0_fac_sq = f0_old^2 * ((equil_params.newq0 / q0_old)^2 - 1.0) + + for i in 1:(mpsi+1) + f_current_sq = sq_fs_nodes[i, 1]^2 + ffac = sqrt(max(0.0, 1.0 + f0_fac_sq / f_current_sq)) * sign(equil_params.newq0/q0_old) + sq_fs_nodes[i, 1] *= ffac # F + sq_fs_nodes[i, 4] *= ffac # q + rzphi_fs_nodes[i, :, 3] .*= ffac # Toroidal stream function + end + # Re-create the spline with the revised data + sq = Spl.spline_setup(sq_x_nodes, sq_fs_nodes, bctype=4) + println("...q-profile revision complete.") + end + + # Create the final geometric spline `rzphi`. Periodic in theta (y-dimension) + rzphi_y_nodes = range(0.0, 1.0, length=mtheta + 1) + rzphi = Spl.bicube_setup(sq_x_nodes, collect(rzphi_y_nodes), rzphi_fs_nodes, bctypex=4, bctypey=2) + println("Final geometric spline 'rzphi' is fitted.") + + # 6. Calculate final physics quantities (B-field, metric components, etc.) + println("Calculating final physics quantities (B, g_ij)...") + eqfun_fs_nodes = zeros(Float64, mpsi + 1, mtheta + 1, 3) + v = zeros(Float64, 2, 3) + + for ipsi in 1:(mpsi+1), itheta in 1:(mtheta+1) + psi_norm = sq_x_nodes[ipsi] + theta_new = rzphi_y_nodes[itheta] + + f = Spl.spline_eval(sq, psi_norm, 0) + q = f[4] + f_val = f[1] + + f, fx, fy = Spl.bicube_eval(rzphi, psi_norm, theta_new, 1) + rfac_sq = max(0.0, f[1]) + rfac = sqrt(rfac_sq) + eta = 2.0 * pi * (theta_new + f[2]) + r_coord = ro + rfac * cos(eta) + jacfac = f[4] + + + v[1,1] = (rfac > 0) ? fx[1] / (2.0 * rfac) : 0.0 # 1/(2rfac) * d(rfac)/d(psi_norm) + v[1,2] = fx[2] * 2.0 * pi * rfac # 2pi*rfac * d(eta)/d(psi_norm) + v[1,3] = fx[3] * r_coord # r_coord * d(phi_s)/d(psi_norm) + v[2,1] = (rfac > 0) ? fy[1] / (2.0 * rfac) : 0.0 # 1/(2rfac) d(rfac)/d(theta_new) + v[2,2] = (1.0 + fy[2]) * 2.0 * pi * rfac # 2pi*rfac * d(eta)/d(theta_new) + v[2,3] = fy[3] * r_coord # r_coord * d(phi_s)/d(theta_new) + v33 = 2.0 * pi * r_coord # 2pi * r_coord + + + w11 = (1.0 + fy[2]) * (2.0*pi)^2 * rfac * r_coord / jacfac + w12 = (jacfac*rfac != 0) ? -fy[1] * pi * r_coord / (rfac * jacfac) : 0.0 + delpsi_norm = sqrt(w11^2 + w12^2) + + b_sq = ((psio *2pi *delpsi_norm)^2 + (f_val/(2pi*r_coord))^2) + eqfun_fs_nodes[ipsi, itheta, 1] = b_sq # B_total + + denom = jacfac * b_sq + if abs(denom) > 1e-20 + # 2. Gyrokinetic coefficient C1 + numerator_2 = dot(v[1,:], v[2,:]) + q * v33 * v[1,3] + eqfun_fs_nodes[ipsi, itheta, 2] = numerator_2 / denom + + # 3. Gyrokinetic coefficient C2 + numerator_3 = v[2,3] * v33 + q * v33^2 + eqfun_fs_nodes[ipsi, itheta, 3] = numerator_3 / denom + else + eqfun_fs_nodes[ipsi, itheta, 2] = 0.0 + eqfun_fs_nodes[ipsi, itheta, 3] = 0.0 + end + end + println("...done.") + + eqfun = Spl.bicube_setup(sq_x_nodes, collect(rzphi_y_nodes), eqfun_fs_nodes, bctypex=4, bctypey=2) + + println("--- Direct Equilibrium Processing Finished ---") + + return PlasmaEquilibrium(raw_profile.config, sq, rzphi, eqfun, ro, zo, psio) +end + diff --git a/src/Equilibrium/Equilibrium.jl b/src/Equilibrium/Equilibrium.jl new file mode 100644 index 000000000..d4e875581 --- /dev/null +++ b/src/Equilibrium/Equilibrium.jl @@ -0,0 +1,98 @@ +# src/Equilibrium/Equilibrium.jl +module Equilibrium + +# --- Module-level Dependencies --- +import ..Spl + +using Printf, DifferentialEquations, LinearAlgebra +using TOML + + +# --- Internal Module Structure --- +include("EquilibriumTypes.jl") +include("ReadEquilibrium.jl") +include("DirectEquilibrium.jl") +include("InverseEquilibrium.jl") +include("AnalyticEquilibrium.jl") + +# --- Expose types and functions to the user --- + +export setup_equilibrium, EquilConfig,EquilControl, EquilOutput, PlasmaEquilibrium + +# --- Constants --- +const mu0 = 4.0 * pi * 1e-7 + + +""" + setup_equilibrium(equil_input::EquilInput) + +The main public API for the `Equilibrium` module. It orchestrates the entire +process of reading an equilibrium file, running the appropriate solver, and +returning the final processed `PlasmaEquilibrium` object. + +## Arguments: +- `equil_input`: An `EquilInput` object containing all necessary setup parameters. +## Returns: +- A `PlasmaEquilibrium` object containing the final result. +""" +function setup_equilibrium(path::String = "equil.toml") + return setup_equilibrium( EquilConfig(path)) +end +function setup_equilibrium(eq_config::EquilConfig, additional_input=nothing) + + @printf "Equilibrium file: %s\n" eq_config.control.eq_filename + + eq_type = eq_config.control.eq_type + # Parse file and prepare initial data structures and splines + if eq_type == "efit" + eq_input = read_efit(eq_config) + elseif eq_type == "chease2" + eq_input = read_chease2(eq_config) + elseif eq_type == "chease" + eq_input = read_chease(eq_config) + elseif eq_type == "lar" + + if additional_input === nothing + additional_input = LargeAspectRatioConfig(eq_config.control.eq_filename) + end + + eq_input = lar_run(eq_config, additional_input) + elseif eq_type == "sol" + + if additional_input === nothing + additional_input = SolevevConfig(eq_config.control.eq_filename) + end + + eq_input = sol_run(eq_config, additional_input) + elseif eq_type == "inverse_testing" + # Example 1D spline setup + xs = collect(0.0:0.1:1.0) + fs = sin.(2π .* xs) # vector of Float64 + spline_ex = Spl.spline_setup(xs, fs) + #println(spline_ex) + # Example 2D bicubic spline setup + xs = 0.0:0.1:1.0 + ys = 0.0:0.2:1.0 + fs = [sin(2π*x)*cos(2π*y) for x in xs, y in ys, _ in 1:1] + bicube_ex = Spl.bicube_setup(collect(xs), collect(ys), fs) + #println(bicube_ex) + eq_input = InverseRunInput( + eq_config, + spline_ex, #sq_in + bicube_ex, #rz_in + 0.0, #ro + 0.0, #zo + 1.0 #psio + ) + else + error("Equilibrium type $(equil_in.eq_type) is not implemented") + end + + # Run the appropriate solver (direct or inverse) to get a PlasmaEquilibrium struct + plasma_equilibrium = equilibrium_solver(eq_input) + + println("--- Equilibrium Setup Complete ---") + return plasma_equilibrium +end + +end # module Equilibrium diff --git a/src/Equilibrium/EquilibriumTypes.jl b/src/Equilibrium/EquilibriumTypes.jl new file mode 100644 index 000000000..5bf4d7650 --- /dev/null +++ b/src/Equilibrium/EquilibriumTypes.jl @@ -0,0 +1,339 @@ +#= +This file is the one stop shop for all the fundemental structures used in + creating equilibrium descriptions for the DCON ODE to use. +=# + +using Base: @kwdef + +# --- Helper function --- + + +function symbolize_keys(dict::Dict{String, Any}) + return Dict(Symbol(k) => v for (k, v) in dict) +end + + +# --- Main Structures for the Equilibrium Code --- + + +@kwdef mutable struct EquilControl + eq_type::String = "efit" + eq_filename::String = "mypath" + + jac_type::String = "hamada" + power_bp::Int = 0 + power_b::Int = 0 + power_r::Int = 0 + + grid_type::String = "ldp" + psilow::Float64 = 1e-2 + psihigh::Float64 = 0.994 + mpsi::Int = 128 + mtheta::Int = 256 + + newq0::Int = 0 + etol::Float64 = 1e-7 + use_classic_splines::Bool = false + + input_only::Bool = false + use_galgrid::Bool = true + + """ + Modified internal constructor that enforces self consistency within the inputs + """ + function EquilControl(eq_type, eq_filename, jac_type, power_bp, power_b, power_r, + grid_type, psilow, psihigh, mpsi, mtheta, newq0, etol, use_classic_splines, + input_only,use_galgrid) + if jac_type == "hamada" + @info "Forcing hamada coordinate jacobian exponents: power_*" + power_b=0 + power_bp=0 + power_r=0 + elseif jac_type == "pest" + @info "Forcing pest coordinate jacobian exponents: power_*" + power_b=0 + power_bp=0 + power_r=2 + elseif jac_type == "equal_arc" + @info "Forcing equal_arc coordinate jacobian exponents: power_*" + power_b=0 + power_bp=1 + power_r=0 + elseif jac_type == "boozer" + @info "Forcing boozer coordinate jacobian exponents: power_*" + power_b=2 + power_bp=0 + power_r=0 + elseif jac_type == "park" + @info "Forcing park coordinate jacobian exponents: power_*" + power_b=1 + power_bp=0 + power_r=0 + elseif jac_type == "other" + @info "Using manual jacobian exponents: power b, bp, r = $(power_b), $(power_bp), $(power_r)" + elseif jac_type != "other" + error("Cannot recognize jac_type = $(jac_type)") + end + return new(eq_type, eq_filename, jac_type, power_bp, power_b, power_r, + grid_type, psilow, psihigh, mpsi, mtheta, newq0, etol, use_classic_splines, + input_only,use_galgrid) + end +end + +@kwdef mutable struct EquilOutput + gse_flag::Bool = false + out_eq_1d::Bool = false + bin_eq_1d::Bool = false + out_eq_2d::Bool = false + bin_eq_2d::Bool = true + out_2d::Bool = false + bin_2d::Bool = false + dump_flag::Bool = false +end + + +""" + EquilConfig(...) + +A container struct that bundles all necessary configuration settings originally specified in the equil + fortran namelsits. +""" +@kwdef mutable struct EquilConfig + control::EquilControl = EquilControl() + output::EquilOutput = EquilOutput() +end +# + +""" +Constructor that allows users to form a EquilConfig struct from dictionaries + for convinience when most of the defaults are fine. +""" +function EquilConfig(control::Dict, output::Dict) + construct = EquilControl(;control...) + outstruct = EquilOutput(;output...) + return EquilConfig(control=construct, output=outstruct) +end + +""" +Outer constructor for EquilConfig that enables a toml file + interface for specifying the configuration settings +""" +# if this also have default, then conflicts with @kwdef mutable struct EquilConfig. +function EquilConfig(path::String) + raw = TOML.parsefile(path) + + # Extract EQUIL_CONTROL with default fallback + control_data = get(raw, "EQUIL_CONTROL", Dict()) + output_data = get(raw, "EQUIL_OUTPUT", Dict()) + + # Check for required fields in control_data + required_keys = ("eq_filename", "eq_type") + missingkeys = filter(k -> !haskey(control_data, k), required_keys) + + if !isempty(missingkeys) + error("Missing required key(s) in [EQUIL_CONTROL]: $(join(missing, ", "))") + end + + # Construct validated structs + control = EquilControl(; symbolize_keys(control_data)...) + if !isabspath(control.eq_filename) + control.eq_filename = normpath(joinpath(dirname(path), control.eq_filename)) + end + output = EquilOutput(; symbolize_keys(output_data)...) + + return EquilConfig(control=control, output=output) +end + + + +""" + LargeAspectRatioConfig(...) + +A mutable struct holding parameters for the Large Aspect Ratio (LAR) plasma equilibrium model. + +## Fields: + +- `lar_r0`: The major radius of the plasma [m]. +- `lar_a`: The minor radius of the plasma [m]. +- `beta0`: The beta value on axis (normalized pressure). +- `q0`: The safety factor on axis. +- `p_pres`: The exponent for the pressure profile, defined as `p00 * (1 - (r / a)^2)^p_pres`. +- `p_sig`: The exponent that determines the shape of the current-related function profile. +- `sigma_type`: The type of sigma profile, can be "default" or "wesson". If "wesson", the sigma profile is defined as `sigma0 * (1 - (r / a)^2)^p_sig`. +- `mtau`: The number of grid points in the poloidal direction. +- `ma`: The number of grid points in the radial direction. +- `zeroth`: If set to true, it neglects the Shafranov shift +""" + +@kwdef mutable struct LargeAspectRatioConfig + lar_r0::Float64 = 10.0 # Major radius of the plasma + lar_a::Float64 = 1.0 # Minor radius of the plasma + + beta0::Float64 = 1e-3 # beta on axis + q0::Float64 = 1.5 # q (safety factor) on axis + + p_pres::Float64 = 2.0 # p00 * (1-(r/a)**2)**p_pres + p_sig::Float64 = 1.0 # The exponent that determines the shape of the current-related function profile + + sigma_type::String = "default" # can be 'default' or 'wesson'. If 'wesson', switch sigma profile to sigma0*(1-(r/a)**2)**p_sig + + mtau::Int = 128 # the number of grid points in the poloidal direction + ma::Int = 128 # the number of grid points in the radial direction + + zeroth ::Bool = false # If set to true, it neglects the Shafranov shift, creating an ideal concentric circular cross-section. +end + +""" +Outer constructor for LargeAspectRatioConfig that enables a toml file + interface for specifying the configuration settings +""" +function LargeAspectRatioConfig(path::String) + raw = TOML.parsefile(path) + input_data = get(raw, "LAR_INPUT", Dict()) + return LargeAspectRatioConfig(; symbolize_keys(input_data)...) +end + + + +""" + SolevevConfig(...) + +A mutable struct holding parameters for the Solev'ev (SOL) plasma equilibrium model. + +## Fields: + +- `mr`: number of radial grid zones +- `mz`: number of axial grid zones +- `ma`: number of flux grid zones +- `e`: elongation +- `a`: minor radius +- `r0`: major radius +- `q0`: safety factor at the o-point +- `p0fac`: scale on-axis pressure (P-> P+P0*p0fac. beta changes. Phi,q constant) +- `b0fac`: scale toroidal field at constant beta (s*Phi,s*f,s^2*P. bt changes. Shape,beta constant) +- `f0fac`: scale toroidal field at constant pressure (s*f. beta,q changes. Phi,p,bp constant) +""" + +@kwdef mutable struct SolevevConfig + mr::Int = 128 # number of radial grid zones + mz::Int = 128 # number of axial grid zones + ma::Int = 128 # number of flux grid zones + e::Float64 = 1.6 # elongation + a::Float64 = 0.33 # minor radius + r0::Float64 = 1.0 # major radius + q0::Float64 = 1.9 # safety factor at the o-point + p0fac::Float64 = 1 # scale on-axis pressure (P-> P+P0*p0fac. beta changes. Phi,q constant) + b0fac::Float64 = 1 # scale toroidal field at constant beta (s*Phi,s*f,s^2*P. bt changes. Shape,beta constant) + f0fac::Float64 = 1 # scale toroidal field at constant pressure (s*f. beta,q changes. Phi,p,bp constant) +end + +""" +Outer constructor for LarConfig that enables a toml file + interface for specifying the configuration settings +""" +function SolevevConfig(path::String) # if we use @kwdef, it generates SolevevConfig() so it conflicts with this line. + raw = TOML.parsefile(path) + input_data = get(raw, "SOL_INPUT", Dict()) + return SolevevConfig(; symbolize_keys(input_data)...) +end + + +""" + DirectRunInput(...) + +A container struct that bundles all necessary inputs for the `direct_run` function. +It is created by the `_read_efit` function after parsing the raw equilibrium file +and preparing the initial splines. + +## Fields: +- `equil_input`: The original `EquilInput` object. +- `sq_in` + # x value: psin + # Quantity 1: F = R*Bt [m T] + # Quantity 2: mu0 * Pressure (non-negative) [nt^2 / m^2 * mu0 = T^2] + # Quantity 3: q-profile + # Quantity 4: sqrt(psi_norm) +- `psi_in`: + # x, y value: R, Z [m] + # z value : poloidal flux adjusted to be zero at the boundary [Weber/radian] + # 1. ψ(R,Z) = ψ_boundary - ψ(R,Z) + # 2. if ψ = ψ * sign(ψ(centerR,centerZ)) +- `rmin`: Minimum R-coordinate of the computational grid [m]. +- `rmax`: Maximum R-coordinate of the computational grid [m]. +- `zmin`: Minimum Z-coordinate of the computational grid [m]. +- `zmax`: Maximum Z-coordinate of the computational grid [m]. +- `psio`: The total flux difference `abs(ψ_axis - ψ_boundary)` [Weber / radian]. +""" +mutable struct DirectRunInput + config::EquilConfig + sq_in::Any # 1D profile spline (CubicSplineType) + psi_in::Any # 2D flux spline (BicubicSplineType) + rmin::Float64 + rmax::Float64 + zmin::Float64 + zmax::Float64 + psio::Float64 +end + +""" + InverseRunInput(...) + +A container struct for inputs to the `inverse_run` function. + +## Fields: +- `equil_input`: The original `EquilInput` object. +""" +mutable struct InverseRunInput + config::EquilConfig + + sq_in::Any # 1D spline input profile (e.g. F*Bt, Pressure, q) + rz_in::Any # 2D bicubic spline input for (R,Z) geometry + + ro::Float64 # R axis location + zo::Float64 # Z axis location + psio::Float64 # Total flux difference |psi_axis - psi_boundary| +end + + +""" + PlasmaEquilibrium(...) + +The final, self-contained result of the equilibrium reconstruction. This object +provides a complete representation of the processed plasma equilibrium in flux coordinates. + +## Fields: +- `equil_input`: The original `EquilInput` object used for the reconstruction. +- `sq`: The final 1D profile spline (`RealSplineType`). + # x value: normalized psi + # Quantity 1: Toroidal Field Function * 2π, `F * 2π` (where `F = R * B_toroidal`) + # Quantity 2: Pressure * μ₀, `P * μ₀`. + # Quantity 3: dVdpsi + # Quantity 4: q +- `rzphi`: The final 2D flux-coordinate mapping spline (`BicubicSplineType`). + # x value: normlized psi + # y value: SFL poloidal angle [0,1] + # Quantity 1: r_coord² = (R - ro)² + (Z - zo)² + # Quantity 2: Offset between the geometric poloidal angle (η) and the new angle (θ_new) + `η / (2π) - θ_new + # Quantity 3: ν in ϕ=2πζ+ν(ψ,θ) + # Quantity 4: Jacobian. +- `eqfun`: A 2D spline storing local physics and geometric quantities that vary across the flux surfaces. + # These are pre-calculated for efficient use in subsequent stability and transport codes. + # x value: Normalized poloidal flux, ψ_norm ∈ [0, 1]. + # y value: SFL poloidal angle, θ_new ∈ [0, 1]. + # Quantity 1: Total magnetic field strength, B [T] + # Quantity 2: (e₁⋅e₂ + q⋅e₃⋅e₁) / (J⋅B²). + # Quantity 3: (e₂⋅e₃ + q⋅e₃⋅e₃) / (J⋅B²). +- `ro`: R-coordinate of the magnetic axis [m]. +- `zo`: Z-coordinate of the magnetic axis [m]. +- `psio`: Total flux difference `|Ψ_axis - Ψ_boundary|` [Weber / radian]. +""" +mutable struct PlasmaEquilibrium + config::EquilConfig + sq::Any # Final 1D profile spline + rzphi::Any # Final 2D coordinate mapping spline + eqfun::Any + ro::Float64 + zo::Float64 + psio::Float64 +end diff --git a/src/Equilibrium/InverseEquilibrium.jl b/src/Equilibrium/InverseEquilibrium.jl new file mode 100644 index 000000000..13dcae5b7 --- /dev/null +++ b/src/Equilibrium/InverseEquilibrium.jl @@ -0,0 +1,263 @@ +""" +Converts inverse equilibrium to straight-fieldline coordinates. Based on inverse.f +Of the entries we need to return: PlasmaEquilibrium(equil_params, sq_out, rzphi_out, eqfun_out, ro, zo, psio), +we only need to generate: sq_out, rzphi_out, eqfun_out. This is because we pass in InverseRunInput(equil_in, +sq_in, rz_in, ro, zo, psio). + +""" + +""" + inverse_extrap(xx::Matrix{Float64}, ff::Matrix{Float64}, x::Float64) -> Vector{Float64} + +Performs component-wise Lagrange extrapolation for a vector-valued function. + +## Arguments: +- `xx`: A (m × n) matrix where each row contains the x-values for each component. +- `ff`: A (m × n) matrix where each row contains function values at the corresponding `xx`. +- `x`: A scalar Float64 value at which to extrapolate. + +## Returns: +- A vector of length n representing the extrapolated function values at `x`. +""" +function inverse_extrap(xx::Matrix{Float64}, ff::Matrix{Float64}, x::Float64)::Vector{Float64} + m, n = size(ff) # m = number of data points, n = number of components + f = zeros(Float64, n) # Output vector + + for i in 1:m + term = copy(ff[i, :]) # Start with f_i (vector) + for j in 1:m + if j == i + continue + end + term .= term .* ((x .- xx[j, :]) ./ (xx[i, :] .- xx[j, :])) + end + f .+= term # Accumulate to output + end + + return f +end + + + +function equilibrium_solver(input::InverseRunInput) + println("--- Starting Inverse Equilibrium Processing ---") + # Extract input parameters + + config = input.config + rz_in = input.rz_in + sq_in = input.sq_in + ro = input.ro + zo = input.zo + psio = input.psio + + grid_type = config.control.grid_type + mpsi = config.control.mpsi + mtheta = config.control.mtheta + psilow = config.control.psilow + psihigh = config.control.psihigh + newq0 = config.control.newq0 + + me = 3 + interp = false + diagnose_rz_in = false + diagnose_rzphi = false + + # c----------------------------------------------------------------------- + # c allocate and define local arrays. + # c----------------------------------------------------------------------- + # sq_in._fs[:, 3] .= sqrt.(sq_in._xs) + rz_in._xs = sq_in._xs + rz_in._ys = collect(0:rz_in.my) ./ rz_in.my + + mx = rz_in.mx + my = rz_in.my + + x = rz_in.fs[:, :, 1] .- ro + y = rz_in.fs[:, :, 2] .- zo + r2 = x.^2 .+ y.^2 + + twopi = 2 * pi + + deta = zeros(Float64, mx+1, my+1) + for ipsi in 0:mx, itheta in 0:my + if r2[ipsi+1, itheta+1] == 0.0 + deta[ipsi+1, itheta+1] = 0.0 + else + deta[ipsi+1, itheta+1] = atan(y[ipsi+1, itheta+1], x[ipsi+1, itheta+1]) / twopi + end + end + + # c----------------------------------------------------------------------- + # c transform input coordinates from cartesian to polar. + # c----------------------------------------------------------------------- + for ipsi in 0:mx + for itheta in 1:my + Δ = deta[ipsi+1, itheta+1] - deta[ipsi+1, itheta] + if Δ > 0.5 + deta[ipsi+1, itheta+1] -= 1 + elseif Δ < -0.5 + deta[ipsi+1, itheta+1] += 1 + end + end + for itheta in 0:my + if r2[ipsi+1, itheta+1] > 0 + deta[ipsi+1, itheta+1] -= rz_in.ys[itheta+1] + end + end + end + + deta[1, :] = inverse_extrap(r2[2:me+1, :], deta[2:me+1, :], 0.0) + + rz_in_fs = zeros(Float64, mx+1, my+1, 3) + rz_in_fs[:, :, 1] = r2 + rz_in_fs[:, :, 2] = deta + + rz_in_xs = copy(rz_in._xs) + rz_in_ys = copy(rz_in._ys) + + new_rz_in = Spl.bicube_setup(rz_in_xs, rz_in_ys, rz_in_fs, bctypex="extrap", bctypey="periodic") + + # c----------------------------------------------------------------------- + # c set up radial grid (only "ldp" implemented) + # c----------------------------------------------------------------------- + if grid_type == "ldp" + sq_xs = psilow .+ (psihigh - psilow) .* (sin.(range(0.0, 1.0; length=mpsi+1) .* (π/2))).^2 + sq_fs = zeros(Float64, mpsi+1, 4) + else + error("Only 'ldp' grid_type is implemented for now.") + end + + local rzphi::Spl.BicubicSplineType + local eqfun::Spl.BicubicSplineType + + # c----------------------------------------------------------------------- + # c prepare new bicube type for coordinates. + # c----------------------------------------------------------------------- + if mtheta == 0 + mtheta = rz_in.my + end + + # (/" r2 "," deta "," dphi "," jac "/) + rzphi_fs = zeros(Float64, mpsi+1, mtheta+1, 4) + rzphi_xs = copy(sq_xs) + rzphi_ys = collect(0:mtheta) ./ mtheta + + # (/" b0 "," "," " /) + eqfun_fs = zeros(Float64, mpsi+1, mtheta+1, 3) + eqfun_xs = copy(sq_xs) + eqfun_ys = collect(0:mtheta) ./ mtheta + + spl_xs = zeros(Float64, mtheta+1) + spl_fs = zeros(Float64, mtheta+1, 5) + + + for ipsi in 0:mpsi + psifac = rzphi_xs[ipsi+1] + f_sq_in = Spl.spline_eval(sq_in, psifac, 0) + spl_xs .= rzphi_ys + for itheta in 0:mtheta + theta = rzphi_ys[itheta+1] + f_rz_in, fx_rz_in, fy_rz_in = Spl.bicube_eval(new_rz_in, psifac, theta, 1) + f_sq_in = Spl.spline_eval(sq_in, psifac, 0) + + if f_rz_in[1] < 0 + error("Invalid extrapolation near axis, rerun with larger value of psilow") + end + + rfac = sqrt(f_rz_in[1]) + r = ro + rfac * cos(twopi * (theta + f_rz_in[2])) + jacfac = fx_rz_in[1] * (1 + fy_rz_in[2]) - fy_rz_in[1] * fx_rz_in[2] + w11 = (1 + fy_rz_in[2]) * twopi^ 2 * rfac / jacfac + w12 = -fy_rz_in[1] * pi / (rfac * jacfac) + bp = psio * sqrt(w11*w11 + w12*w12) / r + bt = f_sq_in[1] / r + b = sqrt(bp*bp + bt*bt) + + spl_fs[itheta+1, 1] = f_rz_in[1] + spl_fs[itheta+1, 2] = f_rz_in[2] + spl_fs[itheta+1, 3] = r * jacfac + spl_fs[itheta+1, 4] = spl_fs[itheta+1, 3] / (r * r) + spl_fs[itheta+1, 5] = spl_fs[itheta+1, 3] * bp^config.control.power_bp * b^config.control.power_b / r^config.control.power_r + + end + # c----------------------------------------------------------------------- + # c fit to cubic splines and integrate. + # c----------------------------------------------------------------------- + + spl = Spl.spline_setup(spl_xs, spl_fs; bctype="periodic") + Spl.spline_integrate!(spl) + + spl_xs = spl.fsi[:, 5] ./ spl.fsi[mtheta+1, 5] + spl_fs[:, 2] .+= rzphi_ys .- spl_xs + spl_fs[:, 4] = (spl_fs[:, 3] ./ spl.fsi[mtheta+1, 3]) ./ (spl_fs[:, 5] ./ spl.fsi[mtheta+1, 5]) * spl.fsi[mtheta+1, 3] * twopi * pi + spl_fs[:, 3] = f_sq_in[1] * pi / psio * (spl.fsi[:, 4] - spl.fsi[mtheta+1, 4] .* spl_xs) + + for itheta in 0:mtheta + theta = rzphi_ys[itheta+1] + fs = Spl.spline_eval(spl, theta, 0) + rzphi_fs[ipsi+1, itheta+1, :] = fs[1:4] + end + + sq_fs[ipsi+1, 1] = f_sq_in[1] * twopi + sq_fs[ipsi+1, 2] = f_sq_in[2] + sq_fs[ipsi+1, 3] = spl.fsi[mtheta+1, 3] * twopi * pi # dV/d(psi) + sq_fs[ipsi+1, 4] = spl.fsi[mtheta+1, 4] * sq_fs[ipsi+1, 1] / (2 * twopi * psio) # q-profile + end + + sq = Spl.spline_setup(sq_xs, sq_fs; bctype="extrap") + + f_sq, f1_sq = Spl.spline_eval(sq, sq_xs, 1) + q0 = f_sq[1, 4] - f1_sq[1,4] * sq.xs[1] + if newq0 == -1 + newq0 = -q0 + end + + if newq0 != 0 + f0 = f_sq[1, 2] - f1_sq[1,2] * sq_xs[1] + f0fac = f0^2 * ((newq0 / q0)^2 - 1) + q0 = newq0 + for ipsi in 0:mpsi + ffac = sqrt(1 + f0fac / f_sq[ipsi+1, 1]^2) * sign(newq0) + sq_fs[ipsi+1, 1] *= ffac + sq_fs[ipsi+1, 4] *= ffac + rzphi_fs[ipsi+1, :, 3] *= ffac + end + sq = Spl.spline_setup(sq_xs, sq_fs; bctype="extrap") + end + qa = f_sq[mpsi+1, 4] + f1_sq[mpsi+1, 4] * (1 - sq_xs[mpsi+1]) + rzphi = Spl.bicube_setup(rzphi_xs, rzphi_ys, rzphi_fs, bctypex="extrap", bctypey="periodic") + + for ipsi in 0:mpsi + f_sq= Spl.spline_eval(sq, sq_xs[ipsi+1]) + q = f_sq[4] + for itheta in 0:mtheta + f_rzphi,fx_rzphi, fy_rzphi = Spl.bicube_eval(rzphi, sq_xs[ipsi+1], rzphi_ys[itheta+1], 1) + rfac = sqrt(f_rzphi[1]) + eta = twopi * (itheta / mtheta + f_rzphi[2]) + r = ro + rfac * cos(eta) + jacfac = fx_rzphi[4] + + v = zeros(Float64, 3, 3) + v[1, 1] = fx_rzphi[1] / (2 * rfac) + v[1, 2] = fx_rzphi[2] * twopi * rfac + v[1, 3] = fx_rzphi[3] * r + v[2, 1] = fy_rzphi[1] / (2 * rfac) + v[2, 2] = (1 + fy_rzphi[2]) * twopi * rfac + v[2, 3] = fy_rzphi[3] * r + v[3, 3] = twopi * r + + w11 = (1 + fy_rzphi[2]) * twopi^2 * rfac * r / jacfac + w12 = -fy_rzphi[1] * pi * r / (rfac * jacfac) + + delpsi = sqrt(w11^2 + w12^2) + eqfun_fs[ipsi+1, itheta+1, 1] = sqrt(((twopi * psio * delpsi)^2 + f_sq[1]^2) / (twopi * r)^2) + eqfun_fs[ipsi+1, itheta+1, 2] = (sum(v[1, :] .* v[2, :]) + f_sq[4] * v[3, 3] * v[1, 3]) / (jacfac * eqfun_fs[ipsi+1, itheta+1, 1]^2) + eqfun_fs[ipsi+1, itheta+1, 3] = (v[2, 3] * v[3, 3] + f_sq[4] * v[3, 3]^2) / (jacfac * eqfun_fs[ipsi+1, itheta+1, 1]^2) + end + end + eqfun = Spl.bicube_setup(eqfun_xs, eqfun_ys, eqfun_fs, bctypex="extrap", bctypey="periodic") + + return PlasmaEquilibrium( + input.config, sq, rzphi, eqfun, ro, zo, psio + ) +end \ No newline at end of file diff --git a/src/Equilibrium/ReadEquilibrium.jl b/src/Equilibrium/ReadEquilibrium.jl new file mode 100644 index 000000000..3fecbdaa6 --- /dev/null +++ b/src/Equilibrium/ReadEquilibrium.jl @@ -0,0 +1,410 @@ +#= +This file contains functions for reading equilibrium files from diferent codes + that use different formating and collecting the inputs required to form + a complete PlasmaEquilibrium using either direct or inverse construction +=# + + +""" +_read_1d_gfile_format(lines_block, num_values) + +Internal helper function to parse Fortran-style fixed-width numerical blocks +from a vector of strings. + +## Arguments: +- `lines_block`: A `Vector{String}` containing the lines to parse. +- `num_values`: The total number of `Float64` values to read from the block. +## Returns: +- A `Vector{Float64}` containing the parsed values. +""" +function _read_1d_gfile_format(lines_block::Vector{String}, num_values::Int) + data_str = join(lines_block) + field_width = 16 + parsed_values = Float64[] + num_read = 0 + + # Ensure the string length is a multiple of the field width for safe processing + safe_len = (length(data_str) ÷ field_width) * field_width + for i in 1:field_width:safe_len + num_read >= num_values && break + val_str = strip(data_str[i : i + field_width - 1]) + if !isempty(val_str) + try + push!(parsed_values, parse(Float64, val_str)) + num_read += 1 + catch e + @warn "Parsing error for substring: '$val_str'. Error: $e. Skipping." + end + end + end + + if num_read < num_values + @warn "Expected $num_values values, but only read $num_read." + end + return parsed_values +end + +""" + _read_efit(equil_in) + +Parses an EFIT g-file, creates initial 1D and 2D splines, and bundles +them into a `DirectRunInput` object. + +## Arguments: +- `equil_in`: The `EquilInput` object containing the filename and parameters. +## Returns: +- A `DirectRunInput` object ready for the direct solver. +""" +function read_efit(config::EquilConfig) + println("--> Processing EFIT g-file: $(config.control.eq_filename)") + lines = readlines(config.control.eq_filename) + + # --- Parse Header --- + header1_parts = split(lines[1]) + nw = parse(Int, header1_parts[end-1]) + nh = parse(Int, header1_parts[end]) + println("--> Parsed from header: nw=$nw, nh=$nh") + + header_vals = _read_1d_gfile_format(lines[2:5], 20) + rdim, zdim, rcentr, rleft, zmid = header_vals[1:5] + rmaxis, zmaxis, simag, sibry = header_vals[6:9] + + # --- Parse Data Blocks --- + current_line_idx = 6 + function parse_block(num_pts) + num_lines = ceil(Int, num_pts / 5) + block = lines[current_line_idx : current_line_idx + num_lines - 1] + data = _read_1d_gfile_format(block, num_pts) + current_line_idx += num_lines + return data + end + + fpol_data = parse_block(nw) + pres_data = parse_block(nw) + ffprime_data = parse_block(nw) + pprime_data = parse_block(nw) + psi_flat_vec = parse_block(nw * nh) + qprof_data = parse_block(nw) + + psi_rz = reshape(psi_flat_vec, nw, nh) + println("--> All main data blocks parsed successfully.") + + # --- Create 1D Profile Spline (sq_in) --- + println("--> Creating 1D profile splines...") + psi_norm_grid = range(0.0, 1.0, length=nw) + sq_fs_nodes = hcat( + abs.(fpol_data), + max.(pres_data .* mu0, 0.0), + qprof_data, + sqrt.(psi_norm_grid) + ) + # According to Spline_document.txt, bctype=4 is Not-a-Knot + sq_in = Spl.spline_setup(collect(psi_norm_grid), sq_fs_nodes, bctype=4) + println("--> 1D Spline fitting complete.") + + # --- Process and Normalize 2D Psi Data --- + psio_signed = sibry - simag + psi_proc = (sibry .- psi_rz) + psio = abs(psio_signed) + # Ensure psi at the magnetic axis is positive relative to the boundary + if psio_signed < 0.0 + psi_proc .*= -1.0 + end + + # --- Create 2D Psi Spline (psi_in) --- + println("--> Creating 2D psi spline...") + r_grid = range(rleft, rleft + rdim, length=nw) + z_grid = range(zmid - zdim / 2, zmid + zdim / 2, length=nh) + rmin, rmax = extrema(r_grid) + zmin, zmax = extrema(z_grid) + + psi_proc_3d = reshape(psi_proc, (nw, nh, 1)) + psi_in = Spl.bicube_setup(collect(r_grid), collect(z_grid), psi_proc_3d, bctypex=4, bctypey=4) + println("--> 2D Spline fitting complete.") + + # --- Bundle everything for the solver --- + return DirectRunInput(config, sq_in, psi_in, rmin, rmax, zmin, zmax, psio) +end + +""" + _read_chease2(equil_in) + +Parses a chease2 file, creates initial 1D and 2D splines, finds magnetic axis, and bundles +them into a `InverseRunInput` object. + +## Arguments: +- `equil_in`: The `EquilInput` object containing the filename and parameters. +## Returns: +- A `InverseRunInput` object ready for the inverse solver. +""" + +function read_chease2(config::EquilConfig) + println("--> Reading CHEASE file: $(config.control.eq_filename)") + lines = readlines(config.control.eq_filename) + + # --- Parse Header (FORMAT 10: 3I5) --- + header_parts = split(lines[1]) + ntnova = parse(Int, header_parts[1]) + npsi1 = parse(Int, header_parts[2]) + nsym = parse(Int, header_parts[3]) + + # --- Parse axx (FORMAT 20: 1E22.15) --- + axx = parse(Float64, split(lines[2])[1]) + + # --- Pre-allocate Arrays --- + zcpr = zeros(npsi1 - 1) + zcppr = zeros(npsi1) + zq = zeros(npsi1) + zdq = zeros(npsi1) + ztmf = zeros(npsi1) + ztp = zeros(npsi1) + zfb = zeros(npsi1) + zfbp = zeros(npsi1) + zpsi = zeros(npsi1) + zpsim = zeros(npsi1 - 1) + + zrcp = zeros(ntnova + 3, npsi1) + zzcp = zeros(ntnova + 3, npsi1) + zjacm = zeros(ntnova + 3, npsi1) + zjac = zeros(ntnova + 3, npsi1) + + # --- Helper to parse 5E22.15 data per line --- + function parse_floats(lines_range) + data = Float64[] + for line in lines[lines_range] + for i in 0:4 + s = strip(line[22*i+1:min(end, 22*(i+1))]) + if !isempty(s) + push!(data, parse(Float64, s)) + end + end + end + return data + end + + # --- Compute line offsets --- + line_idx = 3 # Start after header (line 1) and axx (line 2) + + function load_vector!(vec) + count = length(vec) + lines_needed = cld(count, 5) + vec .= parse_floats(line_idx : line_idx + lines_needed - 1) + line_idx += lines_needed + end + + function load_matrix!(mat) + count = size(mat, 1) * size(mat, 2) + lines_needed = cld(count, 5) + data = parse_floats(line_idx : line_idx + lines_needed - 1) + line_idx += lines_needed + # Fill column-major (Fortran-style) + for j in 1:size(mat, 2) + for i in 1:size(mat, 1) + mat[i, j] = data[(j-1)*size(mat,1) + i] + end + end + end + + # --- Read Vectors --- + load_vector!(zcpr) + load_vector!(zcppr) + load_vector!(zq) + load_vector!(zdq) + load_vector!(ztmf) + load_vector!(ztp) + load_vector!(zfb) + load_vector!(zfbp) + load_vector!(zpsi) + load_vector!(zpsim) + + # --- Read Matrices --- + load_matrix!(zrcp) + load_matrix!(zzcp) + load_matrix!(zjacm) + load_matrix!(zjac) + + println("--> Parsed from header: ntnova = $ntnova, npsi1 = $npsi1, nsym = $nsym") + + # Number of spline intervals + ma = npsi1 - 1 + # Total ψ range for normalization + psio = zpsi[end] - zpsi[1] + # Normalize ψ to [0, 1] + xs = (zpsi .- zpsi[1]) ./ psio + # Construct fs matrix: (npsi1 rows, 4 columns) + fs = zeros(npsi1, 4) + fs[:, 1] .= zq .* zfb + fs[:, 2] .= zcppr + fs[:, 3] .= zq + # Fit spline with extrapolation boundary condition (bctype = 3) + sq_in = Spl.spline_setup(xs, fs; bctype=3) + # --- Integrate pressure --- + Spl.spline_integrate!(sq_in) # Integrate in-place, sq_in.fsi filled + # Make a writable copy of the fs array + fs_copy = copy(sq_in.fs) + # Normalize pressure integral column (2nd column) + fs_copy[:, 2] .= (sq_in.fsi[:, 2] .- sq_in.fsi[ma, 2]) .* psio + # Refit spline using the modified fs_copy + sq_in = Spl.spline_setup(sq_in._xs, fs_copy; bctype=3) + + # --- Copy 2D geometry arrays --- + mtau = ntnova+1 + ro = zrcp[1, 1] + zo = zzcp[1, 1] + ys = range(0, 2π, length=mtau) |> collect + # Allocate and fill fs array (radial × poloidal × 2 quantities) + fs = zeros(length(xs), length(ys), 2) + fs[:, :, 1] .= transpose(zrcp[1:ntnova+1, :]) + fs[:, :, 2] .= transpose(zzcp[1:ntnova+1, :]) + + + # Setup bicubic spline with periodic boundary conditions (bctype=2) + rz_in = Spl.bicube_setup(xs, ys, fs; bctypex=2, bctypey=2) + println("--> Finished reading CHEASE equilibrium.") + println(" Magnetic axis at (ro=$ro, zo=$zo), psio=$psio") + return InverseRunInput(config,sq_in,rz_in,ro,zo,psio) +end + +""" + _read_chease(equil_config) + +Parses a binary CHEASE file, creates initial 1D and 2D splines, and bundles +them into a `InverseRunInput` object. + +## Arguments: +- `equil_config`: The `EquilConfig` object containing the filename and parameters. +## Returns: +- A `InverseRunInput` object ready for the inverse solver. +""" + +function read_chease(config::EquilConfig) + println("--> Reading CHEASE file: $(config.control.eq_filename)") + diagnostics = false # Set to true to enable detailed print output + open(config.control.eq_filename, "r") do io + # Read first 3 integers + seekstart(io) + read(io, UInt32) # skip record length at start + ntnova = read(io, Int32) + npsi1 = read(io, Int32) + nsym = read(io, Int32) + read(io, UInt32) # skip record length at end + + if diagnostics + println("Header:") + println(" ntnova = $ntnova Type=$(typeof(ntnova)) Bytes=$(sizeof(ntnova))") + println(" npsi1 = $npsi1 Type=$(typeof(npsi1)) Bytes=$(sizeof(npsi1))") + println(" nsym = $nsym Type=$(typeof(nsym)) Bytes=$(sizeof(nsym))") + end + + # Read next 5 Float64 values (axx) + read(io, UInt32) # skip record length at start + axx = [read(io, Float64) for _ in 1:5] + if diagnostics + println("\naxx array (expected 5 Float64 values):") + for (i, val) in enumerate(axx) + println(" axx[$i] = $val Type=$(typeof(val)) Bytes=$(sizeof(val))") + end + end + read(io, UInt32) # skip record length at end + + # --- Helper function --- + function print_summary(name, arr) + n = length(arr) + first5 = arr[1:min(5, n)] + last5 = arr[max(1, n-4):end] + println("$name first 5: ", first5) + println("$name last 5: ", last5) + end + + # --- Pre-allocate Arrays --- + zcpr = zeros(npsi1 - 1) + zcppr = zeros(npsi1) + zq = zeros(npsi1) + zdq = zeros(npsi1) + ztmf = zeros(npsi1) + ztp = zeros(npsi1) + zfb = zeros(npsi1) + zfbp = zeros(npsi1) + zpsi = zeros(npsi1) + zpsim = zeros(npsi1 - 1) + + # --- Read 1D arrays from file --- + for (name, arr) in zip( + ("zcpr","zcppr","zq","zdq","ztmf","ztp","zfb","zfbp","zpsi","zpsim"), + (zcpr, zcppr, zq, zdq, ztmf, ztp, zfb, zfbp, zpsi, zpsim) + ) + read(io, UInt32) # skip record length at start + read!(io, arr) + read(io, UInt32) # skip record length at end + if diagnostics print_summary(name, arr); end + end + + # --- Prepare spline & geometry --- + ma = npsi1 - 1 + psio = zpsi[npsi1] - zpsi[1] + xs = (zpsi .- zpsi[1]) ./ psio + + fs = zeros(npsi1, 4) + fs[:, 1] .= ztmf + fs[:, 2] .= zcppr + fs[:, 3] .= zq + + sq_in = Spl.spline_setup(xs, fs; bctype=3) + Spl.spline_integrate!(sq_in) + fs_copy = copy(sq_in.fs) + fs_copy[:, 2] .= (sq_in.fsi[:, 2] .- sq_in.fsi[ma, 2]) .* psio + sq_in = Spl.spline_setup(sq_in._xs, fs_copy; bctype=3) + + # --- Setup parameters --- + mtau = ntnova + + # Allocate fs array (radial × poloidal × 2) + fs = zeros(npsi1, mtau, 2) + + # Allocate buffer (Fortran: ALLOCATE(buffer(ntnova+3, npsi1))) + buffer = zeros(Float64, ntnova+3, npsi1) + + # --- First read (R data) --- + read(io, UInt32) # skip record length at start + read!(io, buffer) # READ(in_unit) buffer + read(io, UInt32) # skip record length at end + ro = buffer[1, 1] # ro = buffer(1,1) + if diagnostics println("ro = $ro"); end + + # Fill with r-coordinates + fs[:, :, 1] .= transpose(buffer[1:ntnova, :]) + + # --- Second read (Z data) --- + read(io, UInt32) # skip record length at start + read!(io, buffer) # READ(in_unit) buffer + read(io, UInt32) # skip record length at end + zo = buffer[1, 1] # zo = buffer(1,1) + if diagnostics println("zo = $zo"); end + + # Fill with z-coordinates + fs[:, :, 2] .= transpose(buffer[1:ntnova, :]) + + # Construct ys grid (0..2π, length = mtau) + ys = range(0, 2π, length=mtau) |> collect + + # Setup bicubic spline with periodic boundary conditions + rz_in = Spl.bicube_setup(xs, ys, fs; bctypex=2, bctypey=2) + + if diagnostics + # --- Print first 5 and last 5 entries of each slice --- + for k in 1:2 + flat = vec(fs[:, :, k]) # flatten to 1D + n = length(flat) + println("Slice $k:") + println(" First 5 entries: ", flat[1:5]) + println(" Last 5 entries: ", flat[n-4:n]) + end + end + + + println("--> Finished reading CHEASE equilibrium.") + println(" Magnetic axis at (ro=$ro, zo=$zo), psio=$psio") + + return InverseRunInput(config, sq_in, rz_in, ro, zo, psio) + end +end \ No newline at end of file diff --git a/src/JPEC.jl b/src/JPEC.jl index 953b2f3d2..f207027a1 100644 --- a/src/JPEC.jl +++ b/src/JPEC.jl @@ -1,9 +1,13 @@ +# JPEC.jl module JPEC include(joinpath(@__DIR__, "..", "deps", "build.jl")) include("Splines/Splines.jl") -using .SplinesMod +import .SplinesMod as Spl +export SplinesMod, Spl +include("Equilibrium/Equilibrium.jl") +export Equilibrium -end \ No newline at end of file +end # module JPEC \ No newline at end of file diff --git a/src/Splines/BicubicSpline.jl b/src/Splines/BicubicSpline.jl index 314676984..369875035 100644 --- a/src/Splines/BicubicSpline.jl +++ b/src/Splines/BicubicSpline.jl @@ -1,33 +1,50 @@ -module BicubicSpline - -const libdir = joinpath(@__DIR__, "..", "..", "deps") -const libspline = joinpath(libdir, "libspline") - -export bicube_setup, bicube_eval - mutable struct BicubicSplineType handle::Ptr{Cvoid} - xs::Vector{Float64} - ys::Vector{Float64} - fs::Array{Float64, 3} # 3D array for bicubic spline values + _xs::Vector{Float64} + _ys::Vector{Float64} + _fs::Array{Float64, 3} # 3D array for bicubic spline values mx::Int64 my::Int64 nqty::Int64 - ix::Int32 # Index of x position in the spline - iy::Int32 # Index of y position in the spline bctypex::Int32 # Boundary condition type for x bctypey::Int32 # Boundary condition type for y + + _fsx::Array{Float64, 3} + _fsy::Array{Float64, 3} + _fsxy::Array{Float64, 3} + end -function _MakeBicubicSpline(mx::Int64, my::Int64, nqty::Int64) +@expose_fields BicubicSplineType xs ys fs fsx fsy fsxy + + +function _destroy_bicubic_spline(bicube::BicubicSplineType) + if bicube.handle != C_NULL + ccall((:bicube_c_destroy, libspline), Cvoid, (Ptr{Cvoid},), bicube.handle) + Core.setfield!(bicube, :handle, C_NULL) + end +end + +function _MakeBicubicSpline(mx::Int64, my::Int64, nqty::Int64, bctypex::Int32, bctypey::Int32) h = Ref{Ptr{Cvoid}}() ccall((:bicube_c_create, libspline), Cvoid, (Int64, Int64, Int64, Ref{Ptr{Cvoid}}), mx, my, nqty, h) - return BicubicSplineType(h[], Vector{Float64}(undef, mx), Vector{Float64}(undef, my), - Array{Float64,3}(undef, mx, my, nqty), mx, my, nqty, 0, 0, 0, 0) + + fsx = Array{Float64, 3}(undef, 0,0,0) + fsy = Array{Float64, 3}(undef, 0,0,0) + fsxy = Array{Float64, 3}(undef, 0,0,0) + + + + + return BicubicSplineType(h[], Vector{Float64}(undef, 0), Vector{Float64}(undef, 0), + Array{Float64,3}(undef, 0, 0, 0), mx, my, nqty, bctypex, bctypey, + fsx,fsy, fsxy) end + + function _bicube_setup(xs::Vector{Float64}, ys::Vector{Float64}, fs::Array{Float64, 3}, bctypex::Int32, bctypey::Int32) # xs -> Float64 (mx) # ys -> Float64 (my) @@ -38,40 +55,57 @@ function _bicube_setup(xs::Vector{Float64}, ys::Vector{Float64}, fs::Array{Float mx = length(xs)-1 my = length(ys)-1 nqty = size(fs, 3) - bicube = _MakeBicubicSpline(mx, my, nqty) - bicube.xs = xs - bicube.ys = ys - bicube.fs = fs - bicube.bctypex = Int32(bctypex) - bicube.bctypey = Int32(bctypey) + bicube = _MakeBicubicSpline(mx, my, nqty, Int32(bctypex), Int32(bctypey)) + bicube._xs = xs + bicube._ys = ys + bicube._fs = fs + + bicube._fsx = Array{Float64, 3}(undef, mx+1, my+1, nqty) + bicube._fsy = Array{Float64, 3}(undef, mx+1, my+1, nqty) + bicube._fsxy = Array{Float64, 3}(undef, mx+1, my+1, nqty) + ccall((:bicube_c_setup, libspline), Cvoid, (Ptr{Cvoid}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), bicube.handle, xs, ys, fs) ccall((:bicube_c_fit, libspline), Cvoid, - (Ptr{Cvoid}, Int32, Int32), bicube.handle, bctypex, bctypey) + (Ptr{Cvoid}, Int32, Int32, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + bicube.handle, bicube.bctypex, bicube.bctypey, bicube._fsx, bicube._fsy, bicube._fsxy) + + + + return bicube end -function bicube_setup(xs, ys, fs, bctypex::Int=1, bctypey::Int=1) +function bicube_setup(xs, ys, fs; bctypex::Union{String, Int}="not-a-knot", + bctypey::Union{String, Int}="not-a-knot") """ # bicube_setup(xs, ys, fs, bctypex=0, bctypey=0) ## Arguments: - `xs`: A vector of Float64 values representing the x-coordinates. - `ys`: A vector of Float64 values representing the y-coordinates. - `fs`: A 3D array of Float64 values representing the function values at the (x,y) coordinates. - - `bctypex`: An integer specifying the boundary condition type for x (default is 0). - - `bctypey`: An integer specifying the boundary condition type for y (default is 0). + ## Keyword Arguments: + - `bctypex`: An integer specifying the boundary condition type for x (Default is 4, not a knot) + - `bctypey`: An integer specifying the boundary condition type for y (Default is 4, not a knot) ## Returns: - A `BicubicSpline` object containing the spline handle, x-coordinates, y-coordinates, function values, number of x-coordinates, number of y-coordinates, number of quantities, and boundary condition types. """ + + local bctype_code_x::Int = parse_bctype(bctypex) + local bctype_code_y::Int = parse_bctype(bctypey) + if !isa(xs, Vector{Float64}) || !isa(ys, Vector{Float64}) || !isa(fs, Array{Float64, 3}) error("xs must be a vector of Float64, ys must be a vector of Float64, and fs must be a 3D array of Float64") end - bicube = _bicube_setup(xs, ys, fs, Int32(bctypex), Int32(bctypey)) + bicube = _bicube_setup(xs, ys, fs, Int32(bctype_code_x), Int32(bctype_code_y)) + + finalizer(_destroy_bicubic_spline, bicube) + return bicube end @@ -87,16 +121,16 @@ function _bicube_eval(bicube::BicubicSplineType, x::Float64, y::Float64, derivs: fyy = Vector{Float64}(undef, bicube.nqty) if derivs == 0 ccall((:bicube_c_eval, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Int32, Int32), - bicube.handle, x, y, f, bicube.ix, bicube.iy) + (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}), + bicube.handle, x, y, f) elseif derivs == 1 ccall((:bicube_c_eval_deriv, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Int32, Int32), - bicube.handle, x, y, f, fx, fy, bicube.ix, bicube.iy) + (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + bicube.handle, x, y, f, fx, fy) elseif derivs == 2 ccall((:bicube_c_eval_deriv2, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Int32, Int32), - bicube.handle, x, y, f, fx, fy, fxx, fxy, fyy, bicube.ix, bicube.iy) + (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + bicube.handle, x, y, f, fx, fy, fxx, fxy, fyy) else error("Invalid number of derivatives requested: $derivs. Must be 0, 1, or 2.") end @@ -111,6 +145,7 @@ function _bicube_eval(bicube::BicubicSplineType, x::Float64, y::Float64, derivs: end end + function _bicube_eval(bicube::BicubicSplineType, xs::Vector{Float64}, ys::Vector{Float64}, derivs::Int=0) # xs -> Float64 (any length) # ys -> Float64 (any length) @@ -180,6 +215,7 @@ function _bicube_eval(bicube::BicubicSplineType, xs::Vector{Float64}, ys::Vector end end + function bicube_eval(bicube::BicubicSplineType, x, y, derivs::Int=0) """ # bicube_eval(bicube, x, y) @@ -193,6 +229,4 @@ function bicube_eval(bicube::BicubicSplineType, x, y, derivs::Int=0) the respective (x,y) coordinates in `x` and `y`. """ return _bicube_eval(bicube, x, y, derivs) -end - -end # module BicubicSpline \ No newline at end of file +end \ No newline at end of file diff --git a/src/Splines/CubicSpline.jl b/src/Splines/CubicSpline.jl index dc5436bb7..0912e767a 100644 --- a/src/Splines/CubicSpline.jl +++ b/src/Splines/CubicSpline.jl @@ -1,46 +1,79 @@ -module CubicSpline - -const libdir = joinpath(@__DIR__, "..", "..", "deps") -const libspline = joinpath(libdir, "libspline") - -export spline_setup, spline_eval - abstract type CubicSplineType end mutable struct RealSplineType <: CubicSplineType handle::Ptr{Cvoid} - xs::Vector{Float64} - fs::Matrix{Float64} + _xs::Vector{Float64} + _fs::Matrix{Float64} mx::Int64 nqty::Int64 - ix::Int32 # Index of x position in the spline bctype::Int32 # Boundary condition type + + _fsi::Matrix{Float64} # To store integrals at gridpoint + _fs1::Matrix{Float64} # To store 1-deriv at gridpoint + end mutable struct ComplexSplineType <: CubicSplineType handle::Ptr{Cvoid} - xs::Vector{Float64} - fs::Matrix{ComplexF64} + _xs::Vector{Float64} + _fs::Matrix{ComplexF64} mx::Int64 nqty::Int64 - ix::Int32 # Index of x position in the spline bctype::Int32 # Boundary condition type + + _fsi::Matrix{ComplexF64} # To store integrals at gridpoint + _fs1::Matrix{ComplexF64} # To store 1-deriv at gridpoint + end -function _MakeSpline(mx::Int64, nqty::Int64) +@expose_fields RealSplineType xs fs fsi fs1 +@expose_fields ComplexSplineType xs fs fsi fs1 + + +function _destroy_spline(spline::CubicSplineType) + if spline.handle != C_NULL + ccall((:spline_c_destroy, libspline), Cvoid, (Ptr{Cvoid},), spline.handle) + Core.setfield!(spline, :handle, C_NULL) + end +end + +function _destroy_spline(spline::ComplexSplineType) + if spline.handle != C_NULL + ccall((:cspline_c_destroy, libspline), Cvoid, (Ptr{Cvoid},), spline.handle) + Core.setfield!(spline, :handle, C_NULL) + end +end + + +function _MakeSpline(mx::Int64, nqty::Int64, bctype::Int32) h = Ref{Ptr{Cvoid}}() ccall((:spline_c_create, libspline), Cvoid, (Int64, Int64, Ref{Ptr{Cvoid}}), mx, nqty, h) - return RealSplineType(h[], Vector{Float64}(undef, mx), Matrix{Float64}(undef, mx, nqty), mx, nqty, 0, 0) + + + fsi = Matrix{Float64}(undef, 0, 0) + fs1 = Matrix{Float64}(undef, 0, 0) + + return RealSplineType(h[], Vector{Float64}(undef, 0), Matrix{Float64}(undef, 0, 0) + , mx, nqty, bctype, fsi, fs1) end -function _MakeCSpline(mx::Int64, nqty::Int64) +function _MakeCSpline(mx::Int64, nqty::Int64, bctype::Int32) h = Ref{Ptr{Cvoid}}() ccall((:cspline_c_create, libspline), Cvoid, (Int64, Int64, Ref{Ptr{Cvoid}}), mx, nqty, h) - return ComplexSplineType(h[], Vector{Float64}(undef, mx), Matrix{ComplexF64}(undef, mx, nqty), mx, nqty, 0, 0) + + fsi = Matrix{ComplexF64}(undef, 0, 0) + fs1 = Matrix{ComplexF64}(undef, 0, 0) + + return ComplexSplineType(h[], Vector{Float64}(undef, 0), Matrix{ComplexF64}(undef, 0, 0), + mx, nqty, bctype, fsi, fs1) end + + + + function _spline_setup(xs::Vector{Float64}, fs::Vector{Float64}, bctype::Int32) # xs -> Float64 (mx) # fs -> Float64 (mx, nqty) @@ -49,19 +82,21 @@ function _spline_setup(xs::Vector{Float64}, fs::Vector{Float64}, bctype::Int32) end mx = length(xs)-1 nqty = 1 # Default to 1 quantity if not specified - spline = _MakeSpline(mx, nqty) - spline.xs = xs + spline = _MakeSpline(mx, nqty, Int32(bctype)) + spline._xs = xs # Convert fs to a matrix with one column - fs_matrix = reshape(fs, mx, nqty) - spline.fs = fs_matrix - spline.bctype = Int32(bctype) + fs_matrix = reshape(fs, mx+1, nqty) #considering definition, we need mx+1 + spline._fs = fs_matrix + spline._fs1 = Matrix{Float64}(undef, mx+1, nqty) ccall((:spline_c_setup, libspline), Cvoid, (Ptr{Cvoid}, Ptr{Float64}, Ptr{Float64}), spline.handle, xs, fs_matrix) - ccall((:spline_c_fit, libspline), Cvoid, - (Ptr{Cvoid}, Int32), spline.handle, bctype) + ccall((:spline_c_fit, libspline), Cvoid, + (Ptr{Cvoid}, Int32, Ptr{Float64}), spline.handle, spline.bctype, spline._fs1) + + return spline end @@ -73,42 +108,41 @@ function _spline_setup(xs::Vector{Float64}, fs::Matrix{Float64}, bctype::Int32) end mx = length(xs)-1 nqty = size(fs, 2) - spline = _MakeSpline(mx, nqty) - spline.xs = xs - spline.fs = fs - spline.bctype = Int32(bctype) + spline = _MakeSpline(mx, nqty, Int32(bctype)) + spline._xs = xs + spline._fs = fs + spline._fs1 = Matrix{Float64}(undef, mx+1, nqty) ccall((:spline_c_setup, libspline), Cvoid, (Ptr{Cvoid}, Ptr{Float64}, Ptr{Float64}), spline.handle, xs, fs) - ccall((:spline_c_fit, libspline), Cvoid, - (Ptr{Cvoid}, Int32), spline.handle, bctype) + ccall((:spline_c_fit, libspline), Cvoid, + (Ptr{Cvoid}, Int32, Ptr{Float64}), spline.handle, spline.bctype, spline._fs1) return spline end function _spline_setup(xs::Vector{Float64}, fs::Vector{ComplexF64}, bctype::Int32) # xs -> Float64 (mx) # fs -> ComplexF64 (mx, nqty) - print("hi") if length(xs) != length(fs) error("Length of xs must match length of fs") end mx = length(xs)-1 nqty = 1 # Default to 1 quantity if not specified - spline = _MakeCSpline(mx, nqty) - spline.xs = xs + spline = _MakeCSpline(mx, nqty, Int32(bctype)) + spline._xs = xs # Convert fs to a matrix with one column - fs_matrix = reshape(fs, mx, nqty) - spline.fs = fs_matrix - spline.bctype = Int32(bctype) + fs_matrix = reshape(fs, mx+1, nqty) + spline._fs = fs_matrix + spline._fs1 = Matrix{ComplexF64}(undef, mx+1, nqty) ccall((:cspline_c_setup, libspline), Cvoid, (Ptr{Cvoid}, Ptr{Float64}, Ptr{ComplexF64}), spline.handle, xs, fs_matrix) ccall((:cspline_c_fit, libspline), Cvoid, - (Ptr{Cvoid}, Int32), spline.handle, bctype) + (Ptr{Cvoid}, Int32, Ptr{ComplexF64}), spline.handle, spline.bctype, spline._fs1) return spline end @@ -120,31 +154,32 @@ function _spline_setup(xs::Vector{Float64}, fs::Matrix{ComplexF64}, bctype::Int3 end mx = length(xs)-1 nqty = size(fs, 2) - spline = _MakeCSpline(mx, nqty) - spline.xs = xs - spline.fs = fs - spline.bctype = Int32(bctype) + spline = _MakeCSpline(mx, nqty, Int32(bctype)) + spline._xs = xs + spline._fs = fs + spline._fs1 = Matrix{ComplexF64}(undef, mx+1, nqty) + ccall((:cspline_c_setup, libspline), Cvoid, (Ptr{Cvoid}, Ptr{Float64}, Ptr{ComplexF64}), spline.handle, xs, fs) - ccall((:cspline_c_fit, libspline), Cvoid, - (Ptr{Cvoid}, Int32), spline.handle, bctype) + (Ptr{Cvoid}, Int32, Ptr{ComplexF64}), spline.handle, spline.bctype, spline._fs1) return spline end -function spline_setup(xs, fs, bctype::Int=1) +function spline_setup(xs, fs; bctype::Union{String, Int}="not-a-knot") """ - # spline_setup(xs, fs, bctype=0) + # spline_setup(xs, fs, bctype="not-a-knot") ## Arguments: - `xs`: A vector of Float64 values representing the x-coordinates. - `fs`: A vector or matrix of Float64/ComplexF64 values representing the function values at the x-coordinates. - - `bctype`: An integer specifying the boundary condition type (default is 0): + ## Keyword Arguments: + - `bctype`: Boundary condition type for the cubic spline in `x`. - 1: Natural spline (default) - 2: Periodic spline - 3: Extrapolated spline - - 4: not-a-knot spline + - 4: "Not-a-knot" spline ## Returns: - A `Spline` object containing the spline handle, x-coordinates, function values, number of x-coordinates, number of quantities, and index of x position in the spline. @@ -155,8 +190,18 @@ function spline_setup(xs, fs, bctype::Int=1) if !isa(fs, Vector{Float64}) && !isa(fs, Matrix{Float64}) && !isa(fs, Vector{ComplexF64}) && !isa(fs, Matrix{ComplexF64}) error("fs must be a vector or matrix of Float64 or ComplexF64") end - spline = _spline_setup(xs, fs, Int32(bctype)) - return spline + + local bctype_code::Int = parse_bctype(bctype) + + if isa(fs, Matrix{ComplexF64}) && bctype_code == 1 + error("Complex spline doesn't have natural spline. (bctype = 1/natural)") + end + + spline = _spline_setup(xs, fs, Int32(bctype_code)) + + finalizer(_destroy_spline, spline) + + return spline end @@ -167,23 +212,23 @@ function _spline_eval(spline::RealSplineType, x::Float64, derivs::Int=0) f = Vector{Float64}(undef, spline.nqty) ccall((:spline_c_eval, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{Float64}, Int32), - spline.handle, x, f, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{Float64}), + spline.handle, x, f) return f elseif derivs == 1 f = Vector{Float64}(undef, spline.nqty) f1 = Vector{Float64}(undef, spline.nqty) ccall((:spline_c_eval_deriv, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{Float64}, Ptr{Float64}, Int32), - spline.handle, x, f, f1, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{Float64}, Ptr{Float64}), + spline.handle, x, f, f1) return f, f1 elseif derivs == 2 f = Vector{Float64}(undef, spline.nqty) f1 = Vector{Float64}(undef, spline.nqty) f2 = Vector{Float64}(undef, spline.nqty) ccall((:spline_c_eval_deriv2, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Int32), - spline.handle, x, f, f1, f2, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + spline.handle, x, f, f1, f2) return f, f1, f2 elseif derivs == 3 f = Vector{Float64}(undef, spline.nqty) @@ -191,8 +236,8 @@ function _spline_eval(spline::RealSplineType, x::Float64, derivs::Int=0) f2 = Vector{Float64}(undef, spline.nqty) f3 = Vector{Float64}(undef, spline.nqty) ccall((:spline_c_eval_deriv3, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Int32), - spline.handle, x, f, f1, f2, f3, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + spline.handle, x, f, f1, f2, f3) return f, f1, f2, f3 else error("Invalid number of derivatives requested: $derivs. Must be 0, 1, 2, or 3.") @@ -202,7 +247,6 @@ end function _spline_eval(spline::RealSplineType, xs::Vector{Float64}, derivs::Int=0) # xs -> Float64 (any length) # Returns a matrix of Float64 (length(xs), nqty) - n = length(xs) fs = Matrix{Float64}(undef, n, spline.nqty) f = Vector{Float64}(undef, spline.nqty) @@ -254,6 +298,7 @@ function _spline_eval(spline::RealSplineType, xs::Vector{Float64}, derivs::Int=0 end end + function _spline_eval(spline::ComplexSplineType, x::Float64, derivs::Int=0) # x -> Float64 # Returns a vector of ComplexF64 (nqty) @@ -263,23 +308,23 @@ function _spline_eval(spline::ComplexSplineType, x::Float64, derivs::Int=0) if derivs == 0 f = Vector{ComplexF64}(undef, spline.nqty) ccall((:cspline_c_eval, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Int32), - spline.handle, x, f, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{ComplexF64}), + spline.handle, x, f) return f elseif derivs == 1 f = Vector{ComplexF64}(undef, spline.nqty) f1 = Vector{ComplexF64}(undef, spline.nqty) ccall((:cspline_c_eval_deriv, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Ptr{ComplexF64}, Int32), - spline.handle, x, f, f1, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Ptr{ComplexF64}), + spline.handle, x, f, f1) return f, f1 elseif derivs == 2 f = Vector{ComplexF64}(undef, spline.nqty) f1 = Vector{ComplexF64}(undef, spline.nqty) f2 = Vector{ComplexF64}(undef, spline.nqty) ccall((:cspline_c_eval_deriv2, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Ptr{ComplexF64}, Ptr{ComplexF64}, Int32), - spline.handle, x, f, f1, f2, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Ptr{ComplexF64}, Ptr{ComplexF64}), + spline.handle, x, f, f1, f2) return f, f1, f2 elseif derivs == 3 f = Vector{ComplexF64}(undef, spline.nqty) @@ -287,8 +332,8 @@ function _spline_eval(spline::ComplexSplineType, x::Float64, derivs::Int=0) f2 = Vector{ComplexF64}(undef, spline.nqty) f3 = Vector{ComplexF64}(undef, spline.nqty) ccall((:cspline_c_eval_deriv3, libspline), Cvoid, - (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Ptr{ComplexF64}, Ptr{ComplexF64}, Ptr{ComplexF64}, Int32), - spline.handle, x, f, f1, f2, f3, spline.ix) + (Ptr{Cvoid}, Float64, Ptr{ComplexF64}, Ptr{ComplexF64}, Ptr{ComplexF64}, Ptr{ComplexF64}), + spline.handle, x, f, f1, f2, f3) return f, f1, f2, f3 else error("Invalid number of derivatives requested: $derivs. Must be 0, 1, 2, or 3.") @@ -349,6 +394,14 @@ function _spline_eval(spline::ComplexSplineType, xs::Vector{Float64}, derivs::In end end + + + +#internal version + + + + function spline_eval(spline::CubicSplineType, x, derivs::Int=0) """ # spline_eval(spline, x) @@ -364,4 +417,40 @@ function spline_eval(spline::CubicSplineType, x, derivs::Int=0) return _spline_eval(spline, x, derivs) end + + +function _spline_integrate!(spline::RealSplineType) + spline._fsi = Matrix{Float64}(undef, spline.mx + 1, spline.nqty) + + ccall((:spline_c_int, libspline), Cvoid, + (Ptr{Cvoid}, Ptr{Float64}), + spline.handle, spline._fsi) + + return +end + +function _spline_integrate!(spline::ComplexSplineType) + spline._fsi = Matrix{ComplexF64}(undef, spline.mx + 1, spline.nqty) + + + ccall((:cspline_c_int, libspline), Cvoid, + (Ptr{Cvoid}, Ptr{ComplexF64}), + spline.handle, spline._fsi) + + return end + +function spline_integrate!(spline::CubicSplineType) + """ + spline_integrate!(spline) + + ## Arguments: + - `spline`: A mutable `Spline` object". + + ## Returns: + - Nothing. Updates `spline._fsi` in place so that + `spline._fsi[i, :]` equals `∫_{xs[1]}^{xs[i]} f(x) dx` for each component. + """ + + _spline_integrate!(spline) +end \ No newline at end of file diff --git a/src/Splines/FourierSpline.jl b/src/Splines/FourierSpline.jl new file mode 100644 index 000000000..d92046510 --- /dev/null +++ b/src/Splines/FourierSpline.jl @@ -0,0 +1,299 @@ +mutable struct FourierSplineType + handle::Ptr{Cvoid} + _xs::Vector{Float64} + _ys::Vector{Float64} + _fs::Array{Float64, 3} + mx::Int64 + my::Int64 + mband::Int64 + nqty::Int64 + bctype::Int32 + fit_method::Int32 + cs::ComplexSplineType + + +end + +@expose_fields FourierSplineType xs ys fs + + +function _destroy_fspline(fourier::FourierSplineType) + if fourier.handle != C_NULL + ccall((:fspline_c_destroy, libspline), Cvoid, (Ptr{Cvoid},), fourier.handle) + Core.setfield!(fourier, :handle, C_NULL) + end +end + +function _MakeFourierSpline(mx::Int, my::Int, mband::Int, nqty::Int, bctype::Int32, fit_method::Int32) + h = Ref{Ptr{Cvoid}}() + ccall((:fspline_c_create, libspline), Cvoid, + (Int64, Int64, Int64, Int64, Ref{Ptr{Cvoid}}), + mx, my, mband, nqty, h) + + handle = h[] + if handle == C_NULL + error("Failed to create fspline handle in Fortran library.") + end + + # Return a partially initialized struct with empty data arrays + return FourierSplineType(handle, + Vector{Float64}(undef, 0), + Vector{Float64}(undef, 0), + Array{Float64, 3}(undef, 0, 0, 0), + mx, my, mband, nqty, bctype, fit_method,nothing) +end + +function _fspline_setup(xs::Vector{Float64}, ys::Vector{Float64}, fs::Array{Float64, 3} + , mband::Int, bctype::Int32, fit_method::Int32, fit_flag::Bool) + + + mx = length(xs) - 1 + my = length(ys) - 1 + nqty = size(fs, 3) + + h = Ref{Ptr{Cvoid}}() + ccall((:fspline_c_create, libspline), Cvoid, + (Int64, Int64, Int64, Int64, Ref{Ptr{Cvoid}}), + mx, my, mband, nqty, h) + + handle = h[] + + + + + + + ccall((:fspline_c_setup, libspline), Cvoid, + (Ptr{Cvoid}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + handle, xs, ys, fs) + if fit_method == 1 + ccall((:fspline_c_fit_1, libspline), Cvoid, + (Ptr{Cvoid}, Int32, Bool), + handle, bctype, fit_flag) + elseif fit_method == 2 + ccall((:fspline_c_fit_2, libspline), Cvoid, + (Ptr{Cvoid}, Int32, Bool), + handle, bctype, fit_flag) + else + error("Internal error: Invalid fit_method passed to _fspline_setup.") + end + + # 1. Get the handle to the embedded cspline object + + cs_handle_ref = Ref{Ptr{Cvoid}}() + + + ccall((:fspline_c_get_cspline_handle, libspline), Cvoid, + (Ptr{Cvoid}, Ref{Ptr{Cvoid}}), + handle, cs_handle_ref) + cs_handle = cs_handle_ref[] + + # 2. Get the dimensions and data for the cspline + cs_mx = mx + cs_nqty = (mband + 1) * nqty + cs_fs = Matrix{ComplexF64}(undef, cs_mx + 1, cs_nqty) + + ccall((:fspline_c_get_cspline_fs, libspline), Cvoid, + (Ptr{Cvoid}, Ptr{ComplexF64}), + handle, cs_fs) + + + unmanaged_cspline = ComplexSplineType(cs_handle, xs, cs_fs, cs_mx, cs_nqty) + + # 4. Assign it to the parent object + fourier = FourierSplineType(handle, + xs, + ys, + fs, + mx, my, mband, nqty, bctype, fit_method,unmanaged_cspline) + + + return fourier +end + +function fspline_setup(xs::Vector{Float64}, ys::Vector{Float64}, fs::Array{Float64, 3} + , mband::Int; bctype::Union{String, Int}="not-a-knot", fit_method::Int=1, fit_flag::Bool=true) + """ + # fspline_setup(xs, ys, fs, mband; bctype="not-a-knot", fit_method=1) + + Creates and fits a function of two variables, f(x, y), to a cubic spline + in the x-direction and a Fourier series in the y-direction. The y-direction + is assumed to be periodic. + + ## Arguments: + - `xs`: Vector of x-coordinates (length `mx`+1). + - `ys`: Vector of y-coordinates (length `my`+1, periodic direction). + - `fs`: 3D array of function values with dimensions (`mx`+1, `my`+1, `nqty`). + - `mband`: Number of Fourier modes (harmonics) to keep, from 0 to `mband`. + + ## Keyword Arguments: + - `bctype`: Boundary condition type for the cubic spline in `x`. + - 1: Natural spline (default) + - 2: Periodic spline + - 3: Extrapolated spline + - 4: "Not-a-knot" spline + - `fit_method`: Algorithm for computing Fourier coefficients. + - 1: Integration method (for non-uniform `y` grids). + - 2: Fast Fourier Transform (FFT) method (requires `length(ys)-1` to be a power of 2). + + ## Returns: + - A `FourierSplineType` object ready for evaluation. + """ + if length(xs) != size(fs, 1) || length(ys) != size(fs, 2) + error("Grid vector dimensions must match `fs` array dimensions.") + end + + if fit_method == 2 + my = length(ys) - 1 + if !ispow2(my) + error("For `fit_method=2` (FFT), `length(ys)-1` (is $my) must be a power of 2.") + end + if 2 * mband > my - 1 + error("For `fit_method=2` (FFT), `2*mband` must not be greater than `(length(ys)-1) - 1`. Got 2*$(mband) > $(my-1).") + end + elseif fit_method != 1 + error("Invalid `fit_method`. Choose 1 or 2.") + end + + local bctype_code::Int = parse_bctype(bctype) + + if bctype_code == 1 + error("Fourier spline doesn't have natural spline. (bctype = 1/natural)") + end + # Call the internal setup function that creates and fits the spline + fourier = _fspline_setup(xs, ys, fs, mband, Int32(bctype_code), Int32(fit_method),fit_flag) + + # Add a finalizer to ensure the Fortran object is deallocated when the Julia object is garbage collected. + finalizer(_destroy_fspline, fourier) + + return fourier +end + +function _fspline_eval(spl::FourierSplineType, x::Float64, y::Float64, derivs::Int=0) + if derivs == 0 + f = Vector{Float64}(undef, spl.nqty) + ccall((:fspline_c_eval, libspline), Cvoid, + # (handle, x, y, f_out) + (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}), + spl.handle, x, y, f) + return f + + elseif derivs == 1 + f = Vector{Float64}(undef, spl.nqty) + fx = Vector{Float64}(undef, spl.nqty) + fy = Vector{Float64}(undef, spl.nqty) + ccall((:fspline_c_eval_deriv, libspline), Cvoid, + # (handle, x, y, f_out, fx_out, fy_out) + (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + spl.handle, x, y, f, fx, fy) + return f, fx, fy + + elseif derivs == 2 + f = Vector{Float64}(undef, spl.nqty) + fx = Vector{Float64}(undef, spl.nqty) + fy = Vector{Float64}(undef, spl.nqty) + fxx = Vector{Float64}(undef, spl.nqty) + fxy = Vector{Float64}(undef, spl.nqty) + fyy = Vector{Float64}(undef, spl.nqty) + ccall((:fspline_c_eval_deriv2, libspline), Cvoid, + # (handle, x, y, f_out, fx_out, fy_out, fxx_out, fxy_out, fyy_out) + (Ptr{Cvoid}, Float64, Float64, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), + spl.handle, x, y, f, fx, fy, fxx, fxy, fyy) + return f, fx, fy, fxx, fxy, fyy + + else + error("Invalid number of derivatives requested: $derivs. Must be 0, 1, or 2.") + end +end + + +function _fspline_eval(fspline::FourierSplineType, xs::Vector{Float64}, ys::Vector{Float64}, derivs::Int=0) + # xs -> Float64 (any length) + # ys -> Float64 (any length) + # Returns a matrix of Float64 (length(xs), length(ys), nqty) + + n = length(xs) + m = length(ys) + fs = Array{Float64}(undef, n, m, fspline.nqty) + f = Vector{Float64}(undef, fspline.nqty) + if derivs > 0 + fsx = Array{Float64}(undef, n, m, fspline.nqty) + fsy = Array{Float64}(undef, n, m, fspline.nqty) + fx = Vector{Float64}(undef, fspline.nqty) + fy = Vector{Float64}(undef, fspline.nqty) + end + if derivs > 1 + fsxx = Array{Float64}(undef, n, m, fspline.nqty) + fsxy = Array{Float64}(undef, n, m, fspline.nqty) + fsyy = Array{Float64}(undef, n, m, fspline.nqty) + fxx = Vector{Float64}(undef, fspline.nqty) + fxy = Vector{Float64}(undef, fspline.nqty) + fyy = Vector{Float64}(undef, fspline.nqty) + end + for i in 1:n + for j in 1:m + if derivs == 0 + f = _fspline_eval(fspline, xs[i], ys[j], 0) + fs[i, j, :] = f + elseif derivs == 1 + f, fx, fy = _fspline_eval(fspline, xs[i], ys[j], 1) + fs[i, j, :] = f + fsx[i, j, :] = fx + fsy[i, j, :] = fy + elseif derivs == 2 + f, fx, fy, fxx, fxy, fyy = _fspline_eval(fspline, xs[i], ys[j], 2) + fs[i, j, :] = f + fsx[i, j, :] = fx + fsy[i, j, :] = fy + fsxx[i, j, :] = fxx + fsxy[i, j, :] = fxy + fsyy[i, j, :] = fyy + else + error("Invalid number of derivatives requested: $derivs. Must be 0, 1, or 2.") + end + end + end + if derivs == 0 + return fs + elseif derivs == 1 + return fs, fsx, fsy + elseif derivs == 2 + return fs, fsx, fsy, fsxx, fsxy, fsyy + else + error("Invalid number of derivatives requested: $derivs. Must be 0, 1, or 2.") + end +end + +function fspline_eval(fourier::FourierSplineType, x, y, derivs::Int=0) + """ + # fspline_eval(spl, x, y; derivs=0) + + Evaluates a fitted Fourier-Spline at given coordinates. + + ## Arguments: + - `spl`: A `FourierSplineType` object from `fspline_setup`. + - `x`: A `Float64` or a `Vector{Float64}` of x-coordinates. + - `y`: A `Float64` or a `Vector{Float64}` of y-coordinates. + + ## Returns: + - If `x`, `y` are scalars: A tuple containing the function value(s) and any requested derivatives. If nqty=1, the results are scalars, otherwise they are vectors. + - If `x`, `y` are vectors: A tuple of 3D arrays for the function values and derivatives on the grid defined by `x` and `y`. + """ + if derivs < 0 || derivs > 2 + error("Keyword `derivs` must be 0, 1, or 2.") + end + + + results = _fspline_eval(fourier, x, y, derivs) + + + if fourier.nqty == 1 && isa(x, Real) && isa(y, Real) + if isa(results, Tuple) + return map(vec -> vec[1], results) + else + return results[1] + end + end + + return results +end diff --git a/src/Splines/Helper.jl b/src/Splines/Helper.jl new file mode 100644 index 000000000..19c1163b8 --- /dev/null +++ b/src/Splines/Helper.jl @@ -0,0 +1,110 @@ +const BCTYPE_MAP = Dict( + "natural" => 1, # unstable + "periodic" => 2, + "extrap" => 3, + "not-a-knot" => 4, + "notaknot" => 4 +) + +""" + parse_bctype(bctype) + +Internal helper to parse a boundary condition into a validated integer code. + +## Arguments: +- `bctype`: The boundary condition as a `String` or `Int`. Valid options are: + - `"natural"` or `1` + - `"periodic"` or `2` + - `"extrap"` or `3` + - `"not-a-knot"` or `4` + +## Returns: +- A validated `Int` code (1-4). +""" +function parse_bctype(bctype::String) + normalized_bctype = replace(lowercase(bctype), r"[-_\s]" => "") + if haskey(BCTYPE_MAP, normalized_bctype) + return BCTYPE_MAP[normalized_bctype] + else + error("Invalid string for `bctype`: '$bctype'. Valid options are: $(keys(BCTYPE_MAP))") + end +end + +function parse_bctype(bctype::Int) + # If it's already an integer, validate it. + if bctype in values(BCTYPE_MAP) + return bctype + else + error("Invalid integer for `bctype`: $bctype. Valid options are: $(collect(values(BCTYPE_MAP)))") + end +end + +#==============================================================================# +# Read-Only Interface Utilities +#==============================================================================# + +""" + ReadOnlyArray{T,N,A} + +A thin wrapper that provides a read-only view. +""" +struct ReadOnlyArray{T,N,A<:AbstractArray{T,N}} <: AbstractArray{T,N} + data::A +end + +Base.size(A::ReadOnlyArray) = size(A.data) +Base.getindex(A::ReadOnlyArray, I...) = @inbounds A.data[I...] +Base.setindex!(::ReadOnlyArray, args...) = + throw(ArgumentError("Cannot modify a read-only array.")) + + + """ + @expose_fields TypeName field1 field2 ... + + Create a *read-only public interface* for a struct while still allowing + internal code to mutate the underlying buffers. + + For every symbol `field` you list (e.g. `fs`, `fs1`), + + * an **internal** field named `:_field` (e.g. `:_fs`, `:_fs1`) is assumed to + exist in `TypeName`; + * the macro generates the following methods: + """ + +macro expose_fields(typ, fields...) + # 1) Create a list of internal field names (Symbol) + internal_syms = map(f -> Symbol("_" * string(f)), fields) + # 2) Convert to a tuple literal AST (planted here as a QuoteNode) + internal_tuple = Expr(:tuple, map(x->QuoteNode(x), internal_syms)...) + + quote + ######## getproperty ######## + function Base.getproperty(s::$(esc(typ)), fld::Symbol) + $( + foldr( + (f, rest) -> :( + if fld === $(QuoteNode(f)) + return ReadOnlyArray(getfield(s, $(QuoteNode(Symbol("_", f))))) + else + $rest + end + ), + fields, + init = :(return getfield(s, fld)) + ) + ) + end + + ######## setproperty! ######## + function Base.setproperty!(s::$(esc(typ)), fld::Symbol, val) + # (where internal_tuple is of the form (: _fs1, :_fs2, ...)) + if fld in $(internal_tuple) + return setfield!(s, fld, val) + end + throw(ArgumentError( + "Cannot modify property ':$fld'. " * + "$(string($(esc(typ)))) fields are read-only." + )) + end + end +end \ No newline at end of file diff --git a/src/Splines/Splines.jl b/src/Splines/Splines.jl index 6827b2580..77561852a 100644 --- a/src/Splines/Splines.jl +++ b/src/Splines/Splines.jl @@ -1,12 +1,16 @@ module SplinesMod +const libdir = joinpath(@__DIR__, "..", "..", "deps") +const libspline = joinpath(libdir, "libspline") + +include("Helper.jl") + include("CubicSpline.jl") include("BicubicSpline.jl") +include("FourierSpline.jl") -using .CubicSpline: spline_setup, spline_eval, CubicSplineType, RealSplineType, ComplexSplineType -using .BicubicSpline: bicube_setup, bicube_eval, BicubicSplineType - -export spline_setup, spline_eval, CubicSplineType, RealSplineType, ComplexSplineType +export spline_setup, spline_eval,spline_integrate!, CubicSplineType, RealSplineType, ComplexSplineType export bicube_setup, bicube_eval, BicubicSplineType +export fspline_setup, fspline_eval, FourierSplineType end \ No newline at end of file diff --git a/src/Splines/fortran/Makefile b/src/Splines/fortran/Makefile deleted file mode 100644 index 6d899c202..000000000 --- a/src/Splines/fortran/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -# === CONFIGURABLE === -FC ?= gfortran # You can override this: `make FC=ifort` -FFLAGS ?= -fPIC -LDFLAGS ?= -shared -LIBS ?= -framework Accelerate -RECURSFLAG ?= -frecursive -LIBSUFFIX ?= .dylib - -OUTLIB = libspline$(LIBSUFFIX) - -F90 = $(FC) $(FFLAGS) $(RECURSFLAG) - -.f.o: - $(F90) -c $< -o $@ - - -OBJS = \ - defs.o \ - spline.o \ - cspline.o \ - bicube.o \ - spline_c_api.o - -# targets - -all : $(OUTLIB) - -$(OUTLIB): $(OBJS) - $(FC) $(LDFLAGS) -o $@ $^ $(LIBS) - mv $(OUTLIB) ../../../deps/ - -clean: - rm -f *.o *.mod *.original *.dylib - -# dependencies - -spline.o: defs.o -cspline.o: defs.o spline.o -bicube.o: defs.o spline.o -spline_c_api.o: defs.o spline.o cspline.o bicube.o diff --git a/src/Splines/fortran/bicube.f b/src/Splines/fortran/bicube.f index 91b7e38b7..376fb2ee6 100644 --- a/src/Splines/fortran/bicube.f +++ b/src/Splines/fortran/bicube.f @@ -31,28 +31,28 @@ c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - MODULE bicube_mod - USE spline_mod - IMPLICIT NONE + module bicube_mod + use spline_mod + implicit none - TYPE :: bicube_type - INTEGER :: mx,my,nqty,ix,iy - REAL(r8), DIMENSION(:,:), ALLOCATABLE :: xext,yext,fext - REAL(r8), DIMENSION(2) :: x0,y0 - REAL(r8), DIMENSION(:), ALLOCATABLE :: xs,ys - REAL(r8), DIMENSION(:,:), ALLOCATABLE :: xpower,ypower - REAL(r8), DIMENSION(:,:,:), ALLOCATABLE :: fs,fsx,fsy,fsxy - REAL(r8), DIMENSION(:), ALLOCATABLE :: f,fx,fy,fxx,fxy,fyy - REAL(r8), DIMENSION(:,:,:,:,:), ALLOCATABLE :: cmats - REAL(r8), DIMENSION(:,:,:,:,:), ALLOCATABLE :: gs,gsx,gsy,gsxy, + type :: bicube_type + integer :: mx,my,nqty,ix,iy + real(r8), dimension(:,:), allocatable :: xext,yext,fext + real(r8), dimension(2) :: x0,y0 + real(r8), dimension(:), allocatable :: xs,ys + real(r8), dimension(:,:), allocatable :: xpower,ypower + real(r8), dimension(:,:,:), allocatable :: fs,fsx,fsy,fsxy + real(r8), dimension(:), allocatable :: f,fx,fy,fxx,fxy,fyy + real(r8), dimension(:,:,:,:,:), allocatable :: cmats + real(r8), dimension(:,:,:,:,:), allocatable :: gs,gsx,gsy,gsxy, $ gsxx,gsyy - CHARACTER(6) :: xtitle,ytitle - CHARACTER(6), DIMENSION(:), ALLOCATABLE :: title - CHARACTER(6) :: name - LOGICAL, DIMENSION(2) :: periodic - END TYPE bicube_type + character(6) :: xtitle,ytitle + character(6), dimension(:), allocatable :: title + character(6) :: name + logical, dimension(2) :: periodic + end type bicube_type - CONTAINS + contains c----------------------------------------------------------------------- c subprogram 1. bicube_alloc. c allocates space for bicube_type. @@ -60,10 +60,10 @@ MODULE bicube_mod c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_alloc(bcs,mx,my,nqty) + subroutine bicube_alloc(bcs,mx,my,nqty) - INTEGER, INTENT(IN) :: mx,my,nqty - TYPE(bicube_type), INTENT(OUT) :: bcs + integer, intent(in) :: mx,my,nqty + type(bicube_type), intent(out) :: bcs c----------------------------------------------------------------------- c set scalars. c----------------------------------------------------------------------- @@ -72,25 +72,25 @@ SUBROUTINE bicube_alloc(bcs,mx,my,nqty) bcs%ix=0 bcs%iy=0 bcs%nqty=nqty - bcs%periodic=.FALSE. + bcs%periodic=.false. c----------------------------------------------------------------------- c allocate space. c----------------------------------------------------------------------- - ALLOCATE(bcs%xs(0:mx)) - ALLOCATE(bcs%ys(0:my)) - ALLOCATE(bcs%fs(0:mx,0:my,nqty)) - ALLOCATE(bcs%fsx(0:mx,0:my,nqty)) - ALLOCATE(bcs%fsy(0:mx,0:my,nqty)) - ALLOCATE(bcs%fsxy(0:mx,0:my,nqty)) - ALLOCATE(bcs%title(nqty)) - ALLOCATE(bcs%f(nqty)) - ALLOCATE(bcs%fx(nqty)) - ALLOCATE(bcs%fy(nqty)) - ALLOCATE(bcs%fxx(nqty)) - ALLOCATE(bcs%fxy(nqty)) - ALLOCATE(bcs%fyy(nqty)) - ALLOCATE(bcs%xpower(2,nqty),bcs%ypower(2,nqty)) - ALLOCATE(bcs%xext(2,nqty),bcs%yext(2,nqty),bcs%fext(2,nqty)) + allocate(bcs%xs(0:mx)) + allocate(bcs%ys(0:my)) + allocate(bcs%fs(0:mx,0:my,nqty)) + allocate(bcs%fsx(0:mx,0:my,nqty)) + allocate(bcs%fsy(0:mx,0:my,nqty)) + allocate(bcs%fsxy(0:mx,0:my,nqty)) + allocate(bcs%title(nqty)) + allocate(bcs%f(nqty)) + allocate(bcs%fx(nqty)) + allocate(bcs%fy(nqty)) + allocate(bcs%fxx(nqty)) + allocate(bcs%fxy(nqty)) + allocate(bcs%fyy(nqty)) + allocate(bcs%xpower(2,nqty),bcs%ypower(2,nqty)) + allocate(bcs%xext(2,nqty),bcs%yext(2,nqty),bcs%fext(2,nqty)) bcs%xpower=0 bcs%ypower=0 bcs%x0=0 @@ -98,8 +98,8 @@ SUBROUTINE bicube_alloc(bcs,mx,my,nqty) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_alloc + return + end subroutine bicube_alloc c----------------------------------------------------------------------- c subprogram 2. bicube_dealloc. c deallocates space for bicube_type. @@ -107,39 +107,39 @@ END SUBROUTINE bicube_alloc c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_dealloc(bcs) + subroutine bicube_dealloc(bcs) - TYPE(bicube_type), INTENT(INOUT) :: bcs + type(bicube_type), intent(inout) :: bcs c----------------------------------------------------------------------- c allocate space. c----------------------------------------------------------------------- - DEALLOCATE(bcs%xs) - DEALLOCATE(bcs%ys) - DEALLOCATE(bcs%fs) - DEALLOCATE(bcs%fsx) - DEALLOCATE(bcs%fsy) - DEALLOCATE(bcs%fsxy) - DEALLOCATE(bcs%title) - DEALLOCATE(bcs%f) - DEALLOCATE(bcs%fx) - DEALLOCATE(bcs%fy) - DEALLOCATE(bcs%fxx) - DEALLOCATE(bcs%fxy) - DEALLOCATE(bcs%fyy) - DEALLOCATE(bcs%xpower,bcs%ypower) - DEALLOCATE(bcs%xext,bcs%yext,bcs%fext) - IF(ALLOCATED(bcs%cmats))DEALLOCATE(bcs%cmats) - IF(ALLOCATED(bcs%gs))DEALLOCATE(bcs%gs) - IF(ALLOCATED(bcs%gsx))DEALLOCATE(bcs%gsx) - IF(ALLOCATED(bcs%gsy))DEALLOCATE(bcs%gsy) - IF(ALLOCATED(bcs%gsxx))DEALLOCATE(bcs%gsxx) - IF(ALLOCATED(bcs%gsxy))DEALLOCATE(bcs%gsxy) - IF(ALLOCATED(bcs%gsyy))DEALLOCATE(bcs%gsyy) + deallocate(bcs%xs) + deallocate(bcs%ys) + deallocate(bcs%fs) + deallocate(bcs%fsx) + deallocate(bcs%fsy) + deallocate(bcs%fsxy) + deallocate(bcs%title) + deallocate(bcs%f) + deallocate(bcs%fx) + deallocate(bcs%fy) + deallocate(bcs%fxx) + deallocate(bcs%fxy) + deallocate(bcs%fyy) + deallocate(bcs%xpower,bcs%ypower) + deallocate(bcs%xext,bcs%yext,bcs%fext) + if(allocated(bcs%cmats))deallocate(bcs%cmats) + if(allocated(bcs%gs))deallocate(bcs%gs) + if(allocated(bcs%gsx))deallocate(bcs%gsx) + if(allocated(bcs%gsy))deallocate(bcs%gsy) + if(allocated(bcs%gsxx))deallocate(bcs%gsxx) + if(allocated(bcs%gsxy))deallocate(bcs%gsxy) + if(allocated(bcs%gsyy))deallocate(bcs%gsyy) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_dealloc + return + end subroutine bicube_dealloc c----------------------------------------------------------------------- c subprogram 3. bicube_fit. c fits functions to bicubic splines. @@ -147,17 +147,17 @@ END SUBROUTINE bicube_dealloc c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_fit(bcs,endmode1,endmode2) + subroutine bicube_fit(bcs,endmode1,endmode2) - TYPE(bicube_type), INTENT(INOUT), TARGET :: bcs - CHARACTER(*), INTENT(IN) :: endmode1,endmode2 + type(bicube_type), intent(inout), TARGET :: bcs + integer, intent(in) :: endmode1,endmode2 - INTEGER :: iqty,iside,ix,iy - REAL(r8), DIMENSION(0:bcs%mx) :: xfac - REAL(r8), DIMENSION(0:bcs%my) :: yfac - TYPE(spline_type) :: spl + integer :: iqty,iside,ix,iy + real(r8), dimension(0:bcs%mx) :: xfac + real(r8), dimension(0:bcs%my) :: yfac + type(spline_type) :: spl - REAL(r8), DIMENSION(:,:,:), POINTER :: fs,fsx,fsy,fsxy + real(r8), dimension(:,:,:), POinTER :: fs,fsx,fsy,fsxy c----------------------------------------------------------------------- c set pointers. c----------------------------------------------------------------------- @@ -168,72 +168,72 @@ SUBROUTINE bicube_fit(bcs,endmode1,endmode2) c----------------------------------------------------------------------- c extract x powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,bcs%nqty - IF(bcs%xpower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,bcs%nqty + if(bcs%xpower(iside,iqty) /= 0)then xfac=1/ABS(bcs%xs-bcs%x0(iside))**bcs%xpower(iside,iqty) - DO iy=0,bcs%my + do iy=0,bcs%my bcs%fs(:,iy,iqty)=bcs%fs(:,iy,iqty)*xfac - ENDDO - ENDIF - ENDDO - ENDDO + enddo + endif + enddo + enddo c----------------------------------------------------------------------- c extract y powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,bcs%nqty - IF(bcs%ypower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,bcs%nqty + if(bcs%ypower(iside,iqty) /= 0)then yfac=1/ABS(bcs%ys-bcs%y0(iside))**bcs%ypower(iside,iqty) - DO ix=0,bcs%mx + do ix=0,bcs%mx bcs%fs(ix,:,iqty)=bcs%fs(ix,:,iqty)*yfac - ENDDO - ENDIF - ENDDO - ENDDO + enddo + endif + enddo + enddo c----------------------------------------------------------------------- c set periodicity. c----------------------------------------------------------------------- - bcs%periodic=(/endmode1 == "periodic",endmode2 == "periodic"/) - IF(bcs%periodic(1))bcs%fs(bcs%mx,:,:)=bcs%fs(0,:,:) - IF(bcs%periodic(2))bcs%fs(:,bcs%my,:)=bcs%fs(:,0,:) + bcs%periodic=(/endmode1 == 2,endmode2 == 2/) !2=periodic + if(bcs%periodic(1))bcs%fs(bcs%mx,:,:)=bcs%fs(0,:,:) + if(bcs%periodic(2))bcs%fs(:,bcs%my,:)=bcs%fs(:,0,:) c----------------------------------------------------------------------- c evaluate y derivatives. c----------------------------------------------------------------------- - CALL spline_alloc(spl,bcs%my,bcs%mx+1) + call spline_alloc(spl,bcs%my,bcs%mx+1) spl%xs=bcs%ys - DO iqty=1,bcs%nqty + do iqty=1,bcs%nqty spl%fs=TRANSPOSE(bcs%fs(:,:,iqty)) - CALL spline_fit(spl,endmode2) + call spline_fit(spl,endmode2) bcs%fsy(:,:,iqty)=TRANSPOSE(spl%fs1) - ENDDO - CALL spline_dealloc(spl) + enddo + call spline_dealloc(spl) c----------------------------------------------------------------------- c evaluate x derivatives. c----------------------------------------------------------------------- spl%mx=bcs%mx spl%nqty=bcs%my+1 - CALL spline_alloc(spl,bcs%mx,bcs%my+1) + call spline_alloc(spl,bcs%mx,bcs%my+1) spl%xs=bcs%xs - DO iqty=1,bcs%nqty + do iqty=1,bcs%nqty spl%fs=bcs%fs(:,:,iqty) - CALL spline_fit(spl,endmode1) + call spline_fit(spl,endmode1) bcs%fsx(:,:,iqty)=spl%fs1 - ENDDO + enddo c----------------------------------------------------------------------- c evaluate mixed derivatives. c----------------------------------------------------------------------- - DO iqty=1,bcs%nqty + do iqty=1,bcs%nqty spl%fs=bcs%fsy(:,:,iqty) - CALL spline_fit(spl,endmode1) + call spline_fit(spl,endmode1) bcs%fsxy(:,:,iqty)=spl%fs1 - ENDDO - CALL spline_dealloc(spl) + enddo + call spline_dealloc(spl) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_fit + return + end subroutine bicube_fit c----------------------------------------------------------------------- c subprogram 4. bicube_lsfit. c least-square fit to cubic splines of piecewise-constant functions. @@ -241,21 +241,21 @@ END SUBROUTINE bicube_fit c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_lsfit(bcs) + subroutine bicube_lsfit(bcs) - TYPE(bicube_type), INTENT(INOUT) :: bcs + type(bicube_type), intent(inout) :: bcs - LOGICAL, PARAMETER :: diagnose=.FALSE. - INTEGER :: ix,iy,nx,ny,mx,my,nrhs,n,info,i,j,k,l,kd,ldab - INTEGER, DIMENSION(4*(bcs%mx+1)*(bcs%my+1)) :: ipiv - REAL(r8), PARAMETER :: + logical, PARAMETER :: diagnose=.false. + integer :: ix,iy,nx,ny,mx,my,nrhs,n,info,i,j,k,l,kd,ldab + integer, dimension(4*(bcs%mx+1)*(bcs%my+1)) :: ipiv + real(r8), PARAMETER :: $ a0=13/35._r8,a1=9/70._r8,b0=11/210._r8,b1=13/420._r8 - REAL(r8), DIMENSION(0:bcs%mx+1) :: dx - REAL(r8), DIMENSION(0:bcs%my+1) :: dy - REAL(r8), DIMENSION(4,0:bcs%mx,0:bcs%my,bcs%nqty) :: rhs - REAL(r8), DIMENSION(0:bcs%mx+1,0:bcs%my+1,bcs%nqty) :: g - REAL(r8), DIMENSION(4,4,-1:1,-1:1,0:bcs%mx,0:bcs%my) :: amat - REAL(r8), DIMENSION(:,:), ALLOCATABLE :: ab + real(r8), dimension(0:bcs%mx+1) :: dx + real(r8), dimension(0:bcs%my+1) :: dy + real(r8), dimension(4,0:bcs%mx,0:bcs%my,bcs%nqty) :: rhs + real(r8), dimension(0:bcs%mx+1,0:bcs%my+1,bcs%nqty) :: g + real(r8), dimension(4,4,-1:1,-1:1,0:bcs%mx,0:bcs%my) :: amat + real(r8), dimension(:,:), allocatable :: ab c----------------------------------------------------------------------- c define sizes. c----------------------------------------------------------------------- @@ -279,7 +279,7 @@ SUBROUTINE bicube_lsfit(bcs) c----------------------------------------------------------------------- c least squares fit, function values. c----------------------------------------------------------------------- - DO iy=0,ny + do iy=0,ny amat(1,1,0,0,0:nx,iy)=a0**2 $ *(dx(0:nx)+dx(1:nx+1))*(dy(iy)+dy(iy+1)) amat(1,1,-1,0,0:nx,iy)=a0*a1*dx(0:nx)*(dy(iy)+dy(iy+1)) @@ -290,11 +290,11 @@ SUBROUTINE bicube_lsfit(bcs) amat(1,1,-1,+1,0:nx,iy)=a1**2*dx(0:nx)*dy(iy+1) amat(1,1,+1,-1,0:nx,iy)=a1**2*dx(1:nx+1)*dy(iy) amat(1,1,+1,+1,0:nx,iy)=a1**2*dx(1:nx+1)*dy(iy+1) - ENDDO + enddo c----------------------------------------------------------------------- c least squares fit, x derivatiives. c----------------------------------------------------------------------- - DO iy=0,ny + do iy=0,ny amat(1,2,0,0,0:nx,iy)=a0*b0 $ *(dx(1:nx+1)**2-dx(0:nx)**2)*(dy(iy)+dy(iy+1)) amat(1,2,-1,0,0:nx,iy)=+a0*b1*(dy(iy)+dy(iy+1))*dx(0:nx)**2 @@ -303,11 +303,11 @@ SUBROUTINE bicube_lsfit(bcs) amat(1,2,+1,-1,0:nx,iy)=-a1*b1*dx(1:nx+1)**2*dy(iy) amat(1,2,-1,+1,0:nx,iy)=+a1*b1*dx(0:nx)**2*dy(iy+1) amat(1,2,+1,+1,0:nx,iy)=-a1*b1*dx(1:nx+1)**2*dy(iy+1) - ENDDO + enddo c----------------------------------------------------------------------- c least squares fit, y derivatiives. c----------------------------------------------------------------------- - DO ix=0,nx + do ix=0,nx amat(1,3,0,0,ix,0:ny)=a0*b0 $ *(dy(1:ny+1)**2-dy(0:ny)**2)*(dx(ix)+dx(ix+1)) amat(1,3,-1,0,ix,0:ny)=+a0*b1*(dx(ix)+dx(ix+1))*dy(0:ny)**2 @@ -316,11 +316,11 @@ SUBROUTINE bicube_lsfit(bcs) amat(1,3,+1,-1,ix,0:ny)=-a1*b1*dy(1:ny+1)**2*dx(ix) amat(1,3,-1,+1,ix,0:ny)=+a1*b1*dy(0:ny)**2*dx(ix+1) amat(1,3,+1,+1,ix,0:ny)=-a1*b1*dy(1:ny+1)**2*dx(ix+1) - ENDDO + enddo c----------------------------------------------------------------------- c least squares fit, mixed derivatives. c----------------------------------------------------------------------- - DO iy=0,ny + do iy=0,ny amat(1,4,0,0,0:nx,iy)=b0**2 $ *(dx(0:nx)**2-dx(1:nx+1)**2)*(dy(iy)**2-dy(iy+1)**2) amat(1,4,-1,0,0:nx,iy)=+b0*b1*dx(0:nx)**2 @@ -335,80 +335,80 @@ SUBROUTINE bicube_lsfit(bcs) amat(1,4,-1,+1,0:nx,iy)=-b1**2*dx(0:nx)**2*dy(iy+1)**2 amat(1,4,+1,-1,0:nx,iy)=-b1**2*dx(1:nx+1)**2*dy(iy)**2 amat(1,4,+1,+1,0:nx,iy)=b1**2*dx(1:nx+1)**2*dy(iy+1)**2 - ENDDO + enddo c----------------------------------------------------------------------- c least squares fit, rhs. c----------------------------------------------------------------------- - DO iy=0,ny - DO ix=0,nx + do iy=0,ny + do ix=0,nx rhs(1,ix,iy,:) $ =(dx(ix)*g(ix,iy,:)+dx(ix+1)*g(ix+1,iy,:))*dy(iy) $ +(dx(ix)*g(ix,iy+1,:)+dx(ix+1)*g(ix+1,iy+1,:))*dy(iy+1) - ENDDO - ENDDO + enddo + enddo rhs=rhs/4 c----------------------------------------------------------------------- c continuity of second x-derivatives. c----------------------------------------------------------------------- - DO ix=1,nx-1 + do ix=1,nx-1 amat(2,1,-1,0,ix,0:ny)=3/dx(ix)**2 amat(2,1,0,0,ix,0:ny)=3/dx(ix+1)**2-3/dx(ix)**2 amat(2,1,1,0,ix,0:ny)=-3/dx(ix+1)**2 amat(2,2,-1,0,ix,0:ny)=1/dx(ix) amat(2,2,0,0,ix,0:ny)=2/dx(ix)+2/dx(ix+1) amat(2,2,1,0,ix,0:ny)=1/dx(ix+1) - ENDDO + enddo amat(2,2,0,0,0:nx:nx,0:ny)=1 c----------------------------------------------------------------------- c continuity of second y-derivatives. c----------------------------------------------------------------------- - DO iy=1,ny-1 + do iy=1,ny-1 amat(3,1,0,-1,0:nx,iy)=3/dy(iy)**2 amat(3,1,0,0,0:nx,iy)=3/dy(iy+1)**2-3/dy(iy)**2 amat(3,1,0,1,0:nx,iy)=-3/dy(iy+1)**2 amat(3,3,0,-1,0:nx,iy)=1/dy(iy) amat(3,3,0,0,0:nx,iy)=2/dy(iy)+2/dy(iy+1) amat(3,3,0,1,0:nx,iy)=1/dy(iy+1) - ENDDO + enddo amat(3,3,0,0,0:nx,0:ny:ny)=1 c----------------------------------------------------------------------- c continuity of mixed second derivatives. c----------------------------------------------------------------------- - DO ix=1,nx-1 + do ix=1,nx-1 amat(4,3,-1,0,ix,0:ny)=3/dx(ix)**2 amat(4,3,0,0,ix,0:ny)=3/dx(ix+1)**2-3/dx(ix)**2 amat(4,3,1,0,ix,0:ny)=-3/dx(ix+1)**2 amat(4,4,-1,0,ix,0:ny)=1/dx(ix) amat(4,4,0,0,ix,0:ny)=2/dx(ix)+2/dx(ix+1) amat(4,4,1,0,ix,0:ny)=1/dx(ix+1) - ENDDO + enddo amat(4,4,0,0,0:nx:nx,0:ny)=1 c----------------------------------------------------------------------- c transfer matrix to lapack band storage. c----------------------------------------------------------------------- - ALLOCATE(ab(ldab,n)) + allocate(ab(ldab,n)) ab=0 - DO ix=0,nx - DO mx=MAX(-ix,-1),MIN(nx-ix,1) - DO iy=0,ny - DO my=MAX(-iy,-1),MIN(ny-iy,1) - DO k=1,4 - DO l=1,4 + do ix=0,nx + do mx=MAX(-ix,-1),Min(nx-ix,1) + do iy=0,ny + do my=MAX(-iy,-1),Min(ny-iy,1) + do k=1,4 + do l=1,4 i=4*(iy*(nx+1)+ix)+k j=4*((iy+my)*(nx+1)+ix+mx)+l ab(2*kd+1+i-j,j)=amat(k,l,mx,my,ix,iy) - ENDDO - ENDDO - ENDDO - ENDDO - ENDDO - ENDDO + enddo + enddo + enddo + enddo + enddo + enddo c----------------------------------------------------------------------- c factor and solve. c----------------------------------------------------------------------- - CALL dgbtrf(n,n,kd,kd,ab,ldab,ipiv,info) - CALL dgbtrs('N',n,kd,kd,nrhs,ab,ldab,ipiv,rhs,n,info) - DEALLOCATE(ab) + call dgbtrf(n,n,kd,kd,ab,ldab,ipiv,info) + call dgbtrs('N',n,kd,kd,nrhs,ab,ldab,ipiv,rhs,n,info) + deallocate(ab) c----------------------------------------------------------------------- c compute output. c----------------------------------------------------------------------- @@ -419,8 +419,8 @@ SUBROUTINE bicube_lsfit(bcs) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_lsfit + return + end subroutine bicube_lsfit c----------------------------------------------------------------------- c subprogram 5. bicube_eval. c evaluates bicubic spline function. @@ -428,29 +428,29 @@ END SUBROUTINE bicube_lsfit c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_eval(bcs,x,y,mode) + subroutine bicube_eval(bcs,x,y,mode) - TYPE(bicube_type), INTENT(INOUT) :: bcs - REAL(r8), INTENT(IN) :: x,y - INTEGER, INTENT(IN) :: mode + type(bicube_type), intent(inout) :: bcs + real(r8), intent(in) :: x,y + integer, intent(in) :: mode - INTEGER :: i,iqty,iside - REAL(r8) :: dx,dy,xx,yy,g,gx,gy,gxx,gyy,gxy,xfac,yfac - REAL(r8), DIMENSION (4,4,bcs%nqty) :: c + integer :: i,iqty,iside + real(r8) :: dx,dy,xx,yy,g,gx,gy,gxx,gyy,gxy,xfac,yfac + real(r8), dimension (4,4,bcs%nqty) :: c c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- - IF(bcs%mx==0 .OR. bcs%my==0)THEN - WRITE(*, *) 'ERROR: Bicubic spline entitled "',bcs%title,'"' - IF(bcs%mx==0)THEN - WRITE(*, *) 'has 0 elements specified for x axis ' + if(bcs%mx==0 .OR. bcs%my==0)then + write(*, *) 'ERROR: Bicubic spline entitled "',bcs%title,'"' + if(bcs%mx==0)then + write(*, *) 'has 0 elements specified for x axis ' $ //TRIM(bcs%xtitle) - ELSE - WRITE(*, *) 'has 0 elements specified for y axis ' + else + write(*, *) 'has 0 elements specified for y axis ' $ //TRIM(bcs%ytitle) - ENDIF - STOP - ENDIF + endif + stop + endif bcs%ix=max(bcs%ix,0) bcs%ix=min(bcs%ix,bcs%mx-1) bcs%iy=max(bcs%iy,0) @@ -460,83 +460,83 @@ SUBROUTINE bicube_eval(bcs,x,y,mode) c----------------------------------------------------------------------- c normalize x interval for periodic splines. c----------------------------------------------------------------------- - IF(bcs%periodic(1))THEN - DO - IF(xx < bcs%xs(bcs%mx))EXIT + if(bcs%periodic(1))then + do + if(xx < bcs%xs(bcs%mx))EXIT xx=xx-bcs%xs(bcs%mx) - ENDDO - DO - IF(xx >= bcs%xs(0))EXIT + enddo + do + if(xx >= bcs%xs(0))EXIT xx=xx+bcs%xs(bcs%mx) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c find x interval. c----------------------------------------------------------------------- - DO - IF(bcs%ix <= 0)EXIT - IF(xx >= bcs%xs(bcs%ix))EXIT + do + if(bcs%ix <= 0)EXIT + if(xx >= bcs%xs(bcs%ix))EXIT bcs%ix=bcs%ix-1 - ENDDO - DO - IF(bcs%ix >= bcs%mx-1)EXIT - IF(xx < bcs%xs(bcs%ix+1))EXIT + enddo + do + if(bcs%ix >= bcs%mx-1)EXIT + if(xx < bcs%xs(bcs%ix+1))EXIT bcs%ix=bcs%ix+1 - ENDDO + enddo c----------------------------------------------------------------------- c normalize y interval for periodic splines. c----------------------------------------------------------------------- - IF(bcs%periodic(2))THEN - DO - IF(yy < bcs%ys(bcs%my))EXIT + if(bcs%periodic(2))then + do + if(yy < bcs%ys(bcs%my))EXIT yy=yy-bcs%ys(bcs%my) - ENDDO - DO - IF(yy >= bcs%ys(0))EXIT + enddo + do + if(yy >= bcs%ys(0))EXIT yy=yy+bcs%ys(bcs%my) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c find y interval. c----------------------------------------------------------------------- - DO - IF(bcs%iy <= 0)EXIT - IF(yy >= bcs%ys(bcs%iy))EXIT + do + if(bcs%iy <= 0)EXIT + if(yy >= bcs%ys(bcs%iy))EXIT bcs%iy=bcs%iy-1 - ENDDO - DO - IF(bcs%iy >= bcs%my-1)EXIT - IF(yy < bcs%ys(bcs%iy+1))EXIT + enddo + do + if(bcs%iy >= bcs%my-1)EXIT + if(yy < bcs%ys(bcs%iy+1))EXIT bcs%iy=bcs%iy+1 - ENDDO + enddo c----------------------------------------------------------------------- c find offsets and compute local coefficients. c----------------------------------------------------------------------- dx=xx-bcs%xs(bcs%ix) dy=yy-bcs%ys(bcs%iy) - IF(ALLOCATED(bcs%cmats))THEN + if(allocated(bcs%cmats))then c=bcs%cmats(:,:,bcs%ix+1,bcs%iy+1,:) - ELSE + else c=bicube_getco(bcs) - ENDIF + endif c----------------------------------------------------------------------- c evaluate f. c----------------------------------------------------------------------- bcs%f=0 - DO i=4,1,-1 + do i=4,1,-1 bcs%f=bcs%f*dx $ +((c(i,4,:)*dy $ +c(i,3,:))*dy $ +c(i,2,:))*dy $ +c(i,1,:) - ENDDO + enddo c----------------------------------------------------------------------- c evaluate first derivatives of f c----------------------------------------------------------------------- - IF(mode > 0)THEN + if(mode > 0)then bcs%fx=0 bcs%fy=0 - DO i=4,1,-1 + do i=4,1,-1 bcs%fy=bcs%fy*dx $ +(c(i,4,:)*3*dy $ +c(i,3,:)*2)*dy @@ -545,103 +545,103 @@ SUBROUTINE bicube_eval(bcs,x,y,mode) $ +(c(4,i,:)*3*dx $ +c(3,i,:)*2)*dx $ +c(2,i,:) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c evaluate second derivatives of f c----------------------------------------------------------------------- - IF(mode > 1)THEN + if(mode > 1)then bcs%fxx=0 bcs%fyy=0 bcs%fxy=0 - DO i=4,1,-1 + do i=4,1,-1 bcs%fyy=bcs%fyy*dx $ +(c(i,4,:)*3*dy $ +c(i,3,:))*2 bcs%fxx=bcs%fxx*dy $ +(c(4,i,:)*3*dx $ +c(3,i,:))*2 - ENDDO - DO i=4,2,-1 + enddo + do i=4,2,-1 bcs%fxy=bcs%fxy*dx $ +((c(i,4,:)*3*dy $ +c(i,3,:)*2)*dy $ +c(i,2,:))*(i-1) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c restore x powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=x-bcs%x0(iside) - DO iqty=1,bcs%nqty - IF(bcs%xpower(iside,iqty) == 0)CYCLE + do iqty=1,bcs%nqty + if(bcs%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**bcs%xpower(iside,iqty) g=bcs%f(iqty)*xfac - IF(mode > 0)THEN + if(mode > 0)then gx=(bcs%fx(iqty)+bcs%f(iqty) $ *bcs%xpower(iside,iqty)/dx)*xfac gy=bcs%fy(iqty)*xfac - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then gxx=(bcs%fxx(iqty)+bcs%xpower(iside,iqty)/dx $ *(2*bcs%fx(iqty)+(bcs%xpower(iside,iqty)-1) $ *bcs%f(iqty)/dx))*xfac gxy=(bcs%fxy(iqty)+bcs%fy(iqty) $ *bcs%xpower(iside,iqty)/dx)*xfac gyy=bcs%fyy(iqty)*xfac - ENDIF + endif bcs%f(iqty)=g - IF(mode > 0)THEN + if(mode > 0)then bcs%fx(iqty)=gx bcs%fy(iqty)=gy - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then bcs%fxx(iqty)=gxx bcs%fxy(iqty)=gxy bcs%fyy(iqty)=gyy - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c restore y powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dy=y-bcs%y0(iside) - DO iqty=1,bcs%nqty - IF(bcs%ypower(iside,iqty) == 0)CYCLE + do iqty=1,bcs%nqty + if(bcs%ypower(iside,iqty) == 0)cycle yfac=ABS(dy)**bcs%ypower(iside,iqty) g=bcs%f(iqty)*yfac - IF(mode > 0)THEN + if(mode > 0)then gx=bcs%fx(iqty)*yfac gy=(bcs%fy(iqty)+bcs%f(iqty) $ *bcs%ypower(iside,iqty)/dy)*yfac - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then gxx=bcs%fxx(iqty)*yfac gxy=(bcs%fxy(iqty)+bcs%fy(iqty) $ *bcs%ypower(iside,iqty)/dy)*yfac gyy=(bcs%fyy(iqty)+bcs%ypower(iside,iqty)/dy $ *(2*bcs%fy(iqty)+(bcs%ypower(iside,iqty)-1) $ *bcs%f(iqty)/dy))*yfac - ENDIF + endif bcs%f(iqty)=g - IF(mode > 0)THEN + if(mode > 0)then bcs%fx(iqty)=gx bcs%fy(iqty)=gy - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then bcs%fxx(iqty)=gxx bcs%fxy(iqty)=gxy bcs%fyy(iqty)=gyy - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_eval + return + end subroutine bicube_eval c----------------------------------------------------------------------- c subprogram 5a. bicube_eval_external. c evaluates bicubic spline function with external arrays (parallel). @@ -649,111 +649,111 @@ END SUBROUTINE bicube_eval c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_eval_external(bcs, x, y, mode, - $ b_ix, b_iy, b_f, b_fx, b_fy, b_fxx, b_fxy, b_fyy) + subroutine bicube_eval_external(bcs, x, y, mode, + $ b_f, b_fx, b_fy, b_fxx, b_fxy, b_fyy) - TYPE(bicube_type), INTENT(IN) :: bcs - REAL(r8), INTENT(IN) :: x,y - INTEGER, INTENT(IN) :: mode + type(bicube_type), intent(in) :: bcs + real(r8), intent(in) :: x,y + integer, intent(in) :: mode - INTEGER :: i,iqty,iside - REAL(r8) :: dx,dy,xx,yy,g,gx,gy,gxx,gxy,gyy,xfac,yfac - REAL(r8), DIMENSION (4,4,bcs%nqty) :: c + integer :: i,iqty,iside + integer :: ix, iy, i_low, i_high, i_mid + real(r8) :: dx,dy,xx,yy,g,gx,gy,gxx,gxy,gyy,xfac,yfac + real(r8), dimension (4,4,bcs%nqty) :: c - INTEGER, INTENT(INOUT) :: b_ix,b_iy - REAL(r8), DIMENSION(:), INTENT(INOUT) :: b_f,b_fx,b_fy - REAL(r8), DIMENSION(:), INTENT(INOUT) :: b_fxx,b_fxy,b_fyy -c----------------------------------------------------------------------- -c error-check for mode number--external array is limited. -c----------------------------------------------------------------------- - IF (mode > 1) THEN - CALL program_stop("Set bicube_eval_external mode <=1 !") - ENDIF + real(r8), dimension(:), intent(inout) :: b_f + real(r8), dimension(:), intent(inout), optional :: b_fx,b_fy + real(r8), dimension(:), intent(inout), optional :: b_fxx, + $ b_fxy,b_fyy c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- - b_ix=max(b_ix,0) - b_ix=min(b_ix,bcs%mx-1) - b_iy=max(b_iy,0) - b_iy=min(b_iy,bcs%my-1) xx=x yy=y c----------------------------------------------------------------------- c normalize x interval for periodic splines. c----------------------------------------------------------------------- - IF(bcs%periodic(1))THEN - DO - IF(xx < bcs%xs(bcs%mx))EXIT + if(bcs%periodic(1))then + do + if(xx < bcs%xs(bcs%mx))EXIT xx=xx-bcs%xs(bcs%mx) - ENDDO - DO - IF(xx >= bcs%xs(0))EXIT + enddo + do + if(xx >= bcs%xs(0))EXIT xx=xx+bcs%xs(bcs%mx) - ENDDO - ENDIF -c----------------------------------------------------------------------- -c find x interval. -c----------------------------------------------------------------------- - DO - IF(b_ix <= 0)EXIT - IF(xx >= bcs%xs(b_ix))EXIT - b_ix=b_ix-1 - ENDDO - DO - IF(b_ix >= bcs%mx-1)EXIT - IF(xx < bcs%xs(b_ix+1))EXIT - b_ix=b_ix+1 - ENDDO + enddo + endif +c----------------------------------------------------------------------- +c find x interval using Binary search +c----------------------------------------------------------------------- + i_low = 0 + i_high = bcs%mx - 1 + do while (i_low <= i_high) + i_mid = i_low + (i_high - i_low) / 2 + if (xx < bcs%xs(i_mid)) then + i_high = i_mid - 1 + else if (xx >= bcs%xs(i_mid + 1)) then + i_low = i_mid + 1 + else + ix = i_mid + exit + endif + end do + if (i_low > i_high) ix = min(max(i_low - 1, 0), bcs%mx - 1) c----------------------------------------------------------------------- c normalize y interval for periodic splines. c----------------------------------------------------------------------- - IF(bcs%periodic(2))THEN - DO - IF(yy < bcs%ys(bcs%my))EXIT + if(bcs%periodic(2))then + do + if(yy < bcs%ys(bcs%my))EXIT yy=yy-bcs%ys(bcs%my) - ENDDO - DO - IF(yy >= bcs%ys(0))EXIT + enddo + do + if(yy >= bcs%ys(0))EXIT yy=yy+bcs%ys(bcs%my) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c find y interval. c----------------------------------------------------------------------- - DO - IF(b_iy <= 0)EXIT - IF(yy >= bcs%ys(b_iy))EXIT - b_iy=b_iy-1 - ENDDO - DO - IF(b_iy >= bcs%my-1)EXIT - IF(yy < bcs%ys(b_iy+1))EXIT - b_iy=b_iy+1 - ENDDO + i_low = 0 + i_high = bcs%my - 1 + do while (i_low <= i_high) + i_mid = i_low + (i_high - i_low) / 2 + if (yy < bcs%ys(i_mid)) then + i_high = i_mid - 1 + else if (yy >= bcs%ys(i_mid + 1)) then + i_low = i_mid + 1 + else + iy = i_mid + exit + endif + end do + if (i_low > i_high) iy = min(max(i_low - 1, 0), bcs%my - 1) c----------------------------------------------------------------------- c find offsets and compute local coefficients. c----------------------------------------------------------------------- - dx=xx-bcs%xs(b_ix) - dy=yy-bcs%ys(b_iy) - call bicube_getco_external_sub(bcs,b_ix,b_iy,c) + dx=xx-bcs%xs(ix) + dy=yy-bcs%ys(iy) + call bicube_getco_external_sub(bcs,ix,iy,c) c----------------------------------------------------------------------- c evaluate f. c----------------------------------------------------------------------- b_f=0 - DO i=4,1,-1 + do i=4,1,-1 b_f=b_f*dx $ +((c(i,4,:)*dy $ +c(i,3,:))*dy $ +c(i,2,:))*dy $ +c(i,1,:) - ENDDO + enddo c----------------------------------------------------------------------- c evaluate first derivatives of f c----------------------------------------------------------------------- - IF(mode > 0)THEN + if(mode > 0)then b_fx=0 b_fy=0 - DO i=4,1,-1 + do i=4,1,-1 b_fy=b_fy*dx $ +(c(i,4,:)*3*dy $ +c(i,3,:)*2)*dy @@ -762,103 +762,103 @@ SUBROUTINE bicube_eval_external(bcs, x, y, mode, $ +(c(4,i,:)*3*dx $ +c(3,i,:)*2)*dx $ +c(2,i,:) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c evaluate second derivatives of f c----------------------------------------------------------------------- - IF(mode > 1)THEN + if(mode > 1)then b_fxx=0 b_fyy=0 b_fxy=0 - DO i=4,1,-1 + do i=4,1,-1 b_fyy=b_fyy*dx $ +(c(i,4,:)*3*dy $ +c(i,3,:))*2 b_fxx=b_fxx*dy $ +(c(4,i,:)*3*dx $ +c(3,i,:))*2 - ENDDO - DO i=4,2,-1 + enddo + do i=4,2,-1 b_fxy=b_fxy*dx $ +((c(i,4,:)*3*dy $ +c(i,3,:)*2)*dy $ +c(i,2,:))*(i-1) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c restore x powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=x-bcs%x0(iside) - DO iqty=1,bcs%nqty - IF(bcs%xpower(iside,iqty) == 0)CYCLE + do iqty=1,bcs%nqty + if(bcs%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**bcs%xpower(iside,iqty) g=b_f(iqty)*xfac - IF(mode > 0)THEN + if(mode > 0)then gx=(b_fx(iqty)+b_f(iqty) $ *bcs%xpower(iside,iqty)/dx)*xfac gy=b_fy(iqty)*xfac - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then gxx=(b_fxx(iqty)+bcs%xpower(iside,iqty)/dx $ *(2*bcs%fx(iqty)+(bcs%xpower(iside,iqty)-1) $ *b_f(iqty)/dx))*xfac gxy=(b_fxy(iqty)+bcs%fy(iqty) $ *bcs%xpower(iside,iqty)/dx)*xfac gyy=b_fyy(iqty)*xfac - ENDIF + endif b_f(iqty)=g - IF(mode > 0)THEN + if(mode > 0)then b_fx(iqty)=gx b_fy(iqty)=gy - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then b_fxx(iqty)=gxx b_fxy(iqty)=gxy b_fyy(iqty)=gyy - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c restore y powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dy=y-bcs%y0(iside) - DO iqty=1,bcs%nqty - IF(bcs%ypower(iside,iqty) == 0)CYCLE + do iqty=1,bcs%nqty + if(bcs%ypower(iside,iqty) == 0)cycle yfac=ABS(dy)**bcs%ypower(iside,iqty) g=b_f(iqty)*yfac - IF(mode > 0)THEN + if(mode > 0)then gx=b_fx(iqty)*yfac gy=(b_fy(iqty)+b_f(iqty) $ *bcs%ypower(iside,iqty)/dy)*yfac - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then gxx=b_fxx(iqty)*yfac gxy=(b_fxy(iqty)+b_fy(iqty) $ *bcs%ypower(iside,iqty)/dy)*yfac gyy=(b_fyy(iqty)+bcs%ypower(iside,iqty)/dy $ *(2*bcs%fy(iqty)+(bcs%ypower(iside,iqty)-1) $ *b_f(iqty)/dy))*yfac - ENDIF + endif b_f(iqty)=g - IF(mode > 0)THEN + if(mode > 0)then b_fx(iqty)=gx b_fy(iqty)=gy - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then b_fxx(iqty)=gxx b_fxy(iqty)=gxy b_fyy(iqty)=gyy - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_eval_external + return + end subroutine bicube_eval_external c----------------------------------------------------------------------- c subprogram 6. bicube_getco. c computes coefficient matrices. @@ -868,13 +868,13 @@ END SUBROUTINE bicube_eval_external c----------------------------------------------------------------------- FUNCTION bicube_getco(bcs) RESULT(cmat) - TYPE(bicube_type), INTENT(IN) :: bcs - REAL(r8), DIMENSION(4,4,bcs%nqty) :: cmat + type(bicube_type), intent(in) :: bcs + real(r8), dimension(4,4,bcs%nqty) :: cmat - REAL(r8) :: hxfac,hxfac2,hxfac3 - REAL(r8) :: hyfac,hyfac2,hyfac3 - REAL(r8), DIMENSION(3:4,4) :: gxmat,gymat - REAL(r8), DIMENSION(4,4,bcs%nqty) :: temp + real(r8) :: hxfac,hxfac2,hxfac3 + real(r8) :: hyfac,hyfac2,hyfac3 + real(r8), dimension(3:4,4) :: gxmat,gymat + real(r8), dimension(4,4,bcs%nqty) :: temp c----------------------------------------------------------------------- c compute gxmat. c----------------------------------------------------------------------- @@ -953,8 +953,8 @@ FUNCTION bicube_getco(bcs) RESULT(cmat) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END FUNCTION bicube_getco + return + end FUNCTION bicube_getco c----------------------------------------------------------------------- c subprogram 6a. bicube_getco_external. c computes coefficient matrices for external arrays. @@ -964,14 +964,14 @@ END FUNCTION bicube_getco c----------------------------------------------------------------------- FUNCTION bicube_getco_external(bcs,b_ix,b_iy) RESULT(cmat) - TYPE(bicube_type), INTENT(IN) :: bcs - INTEGER, INTENT(IN) :: b_ix, b_iy - REAL(r8), DIMENSION(4,4,bcs%nqty) :: cmat + type(bicube_type), intent(in) :: bcs + integer, intent(in) :: b_ix, b_iy + real(r8), dimension(4,4,bcs%nqty) :: cmat - REAL(r8) :: hxfac,hxfac2,hxfac3 - REAL(r8) :: hyfac,hyfac2,hyfac3 - REAL(r8), DIMENSION(3:4,4) :: gxmat,gymat - REAL(r8), DIMENSION(4,4,bcs%nqty) :: temp + real(r8) :: hxfac,hxfac2,hxfac3 + real(r8) :: hyfac,hyfac2,hyfac3 + real(r8), dimension(3:4,4) :: gxmat,gymat + real(r8), dimension(4,4,bcs%nqty) :: temp c----------------------------------------------------------------------- c compute gxmat. c----------------------------------------------------------------------- @@ -1050,8 +1050,8 @@ FUNCTION bicube_getco_external(bcs,b_ix,b_iy) RESULT(cmat) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END FUNCTION bicube_getco_external + return + end FUNCTION bicube_getco_external c----------------------------------------------------------------------- c subprogram 6b. bicube_getco_external_sub. c computes coefficient matrices for external arrays. @@ -1060,16 +1060,16 @@ END FUNCTION bicube_getco_external c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_getco_external_sub(bcs,b_ix,b_iy, cmat) + subroutine bicube_getco_external_sub(bcs,b_ix,b_iy, cmat) - TYPE(bicube_type), INTENT(IN) :: bcs - INTEGER, INTENT(IN) :: b_ix, b_iy - REAL(r8), DIMENSION(4,4,bcs%nqty), INTENT(OUT) :: cmat + type(bicube_type), intent(in) :: bcs + integer, intent(in) :: b_ix, b_iy + real(r8), dimension(4,4,bcs%nqty), intent(out) :: cmat - REAL(r8) :: hxfac,hxfac2,hxfac3 - REAL(r8) :: hyfac,hyfac2,hyfac3 - REAL(r8), DIMENSION(3:4,4) :: gxmat,gymat - REAL(r8), DIMENSION(4,4,bcs%nqty) :: temp + real(r8) :: hxfac,hxfac2,hxfac3 + real(r8) :: hyfac,hyfac2,hyfac3 + real(r8), dimension(3:4,4) :: gxmat,gymat + real(r8), dimension(4,4,bcs%nqty) :: temp c----------------------------------------------------------------------- c compute gxmat. c----------------------------------------------------------------------- @@ -1148,8 +1148,8 @@ SUBROUTINE bicube_getco_external_sub(bcs,b_ix,b_iy, cmat) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_getco_external_sub + return + end subroutine bicube_getco_external_sub c----------------------------------------------------------------------- c subprogram 7. bicube_all_eval. c evaluates bicubic splines in all intervals. @@ -1157,110 +1157,110 @@ END SUBROUTINE bicube_getco_external_sub c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_all_eval(bcs,dx,dy,f,fx,fy,fxx,fyy,fxy,mode) + subroutine bicube_all_eval(bcs,dx,dy,f,fx,fy,fxx,fyy,fxy,mode) - TYPE(bicube_type), INTENT(INOUT) :: bcs - REAL(r8), INTENT(IN) :: dx,dy - REAL(r8), INTENT(OUT), DIMENSION(bcs%mx,bcs%my,bcs%nqty) :: + type(bicube_type), intent(inout) :: bcs + real(r8), intent(in) :: dx,dy + real(r8), intent(out), dimension(bcs%mx,bcs%my,bcs%nqty) :: $ f,fx,fy,fxx,fyy,fxy - INTEGER, INTENT(IN) :: mode + integer, intent(in) :: mode - INTEGER :: i,ix,iy,iqty,iside - REAL(r8), DIMENSION(bcs%mx) :: dxv - REAL(r8), DIMENSION(bcs%my) :: dyv + integer :: i,ix,iy,iqty,iside + real(r8), dimension(bcs%mx) :: dxv + real(r8), dimension(bcs%my) :: dyv - REAL(R8), DIMENSION(bcs%mx) :: dxx,xfac - REAL(R8), DIMENSION(bcs%my) :: dyy,yfac - REAL(R8), DIMENSION(bcs%mx,bcs%my) :: g,gx,gy,gxx,gxy,gyy + real(R8), dimension(bcs%mx) :: dxx,xfac + real(R8), dimension(bcs%my) :: dyy,yfac + real(R8), dimension(bcs%mx,bcs%my) :: g,gx,gy,gxx,gxy,gyy c----------------------------------------------------------------------- c compute local displacements and coefficients. c----------------------------------------------------------------------- dxv=(bcs%xs(1:bcs%mx)-bcs%xs(0:bcs%mx-1))*dx dyv=(bcs%ys(1:bcs%my)-bcs%ys(0:bcs%my-1))*dy - CALL bicube_all_getco(bcs) + call bicube_all_getco(bcs) c----------------------------------------------------------------------- c evaluate f. c----------------------------------------------------------------------- f=0 - DO i=4,1,-1 - IF(i /= 4)THEN - DO ix=1,bcs%mx + do i=4,1,-1 + if(i /= 4)then + do ix=1,bcs%mx f(ix,:,:)=f(ix,:,:)*dxv(ix) - ENDDO - ENDIF - DO iy=1,bcs%my + enddo + endif + do iy=1,bcs%my f(:,iy,:)=f(:,iy,:) $ +((bcs%cmats(i,4,:,iy,:)*dyv(iy) $ +bcs%cmats(i,3,:,iy,:))*dyv(iy) $ +bcs%cmats(i,2,:,iy,:))*dy $ +bcs%cmats(i,1,:,iy,:) - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c evaluate fx. c----------------------------------------------------------------------- - IF(mode > 0)THEN + if(mode > 0)then fx=0 - DO i=4,1,-1 - IF(i /= 4)THEN - DO iy=1,bcs%my + do i=4,1,-1 + if(i /= 4)then + do iy=1,bcs%my fx(:,iy,:)=fx(:,iy,:)*dyv(iy) - ENDDO - ENDIF - DO ix=1,bcs%mx + enddo + endif + do ix=1,bcs%mx fx(ix,:,:)=fx(ix,:,:) $ +(bcs%cmats(4,i,ix,:,:)*3*dxv(ix) $ +bcs%cmats(3,i,ix,:,:)*2)*dxv(ix) $ +bcs%cmats(2,i,ix,:,:) - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c evaluate fy. c----------------------------------------------------------------------- fy=0 - DO i=4,1,-1 - IF(i /= 4)THEN - DO ix=1,bcs%mx + do i=4,1,-1 + if(i /= 4)then + do ix=1,bcs%mx fy(ix,:,:)=fy(ix,:,:)*dxv(ix) - ENDDO - ENDIF - DO iy=1,bcs%my + enddo + endif + do iy=1,bcs%my fy(:,iy,:)=fy(:,iy,:) $ +(bcs%cmats(i,4,:,iy,:)*3*dyv(iy) $ +bcs%cmats(i,3,:,iy,:)*2)*dyv(iy) $ +bcs%cmats(i,2,:,iy,:) - ENDDO - ENDDO - ENDIF + enddo + enddo + endif c----------------------------------------------------------------------- c evaluate fxx. c----------------------------------------------------------------------- - IF(mode > 1)THEN + if(mode > 1)then fxx=0 - DO i=4,1,-1 - IF(i /= 4)THEN - DO iy=1,bcs%my + do i=4,1,-1 + if(i /= 4)then + do iy=1,bcs%my fxx(:,iy,:)=fxx(:,iy,:)*dyv(iy) - ENDDO - ENDIF - DO ix=1,bcs%mx + enddo + endif + do ix=1,bcs%mx fxx(ix,:,:)=fxx(ix,:,:) $ +(bcs%cmats(4,i,ix,:,:)*3*dxv(ix) $ +bcs%cmats(3,i,ix,:,:))*2 - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c evaluate fyy and fxy c----------------------------------------------------------------------- fyy=0 - DO i=4,1,-1 - IF(i /= 4)THEN - DO ix=1,bcs%mx + do i=4,1,-1 + if(i /= 4)then + do ix=1,bcs%mx fyy(ix,:,:)=fyy(ix,:,:)*dxv(ix) fxy(ix,:,:)=fxy(ix,:,:)*dxv(ix) - ENDDO - ENDIF - DO iy=1,bcs%my + enddo + endif + do iy=1,bcs%my fyy(:,iy,:)=fyy(:,iy,:) $ +(bcs%cmats(i,4,:,iy,:)*3*dyv(iy) $ +bcs%cmats(i,3,:,iy,:))*2 @@ -1268,86 +1268,86 @@ SUBROUTINE bicube_all_eval(bcs,dx,dy,f,fx,fy,fxx,fyy,fxy,mode) $ +((bcs%cmats(i,4,:,iy,:)*3*dyv(iy) $ +bcs%cmats(i,3,:,iy,:)*2)*dyv(iy) $ +bcs%cmats(i,2,:,iy,:))*(i-1) - ENDDO - ENDDO - ENDIF + enddo + enddo + endif c----------------------------------------------------------------------- c restore x powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dxx=(bcs%xs(0:bcs%mx-1)+dxv(1:bcs%mx))-bcs%x0(iside) - DO iqty=1,bcs%nqty - IF(bcs%xpower(iside,iqty) == 0)CYCLE + do iqty=1,bcs%nqty + if(bcs%xpower(iside,iqty) == 0)cycle xfac=dxx**bcs%xpower(iside,iqty) - DO iy=1,bcs%my + do iy=1,bcs%my g(:,iy)=f(:,iy,iqty)*xfac - IF(mode > 0)THEN + if(mode > 0)then gx(:,iy)=(fx(:,iy,iqty)+f(:,iy,iqty) $ *bcs%xpower(iside,iqty)/dxx)*xfac gy(:,iy)=fy(:,iy,iqty)*xfac - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then gxy(:,iy)=(fxy(:,iy,iqty)+fy(:,iy,iqty) $ *bcs%xpower(iside,iqty)/dxx)*xfac gxx(:,iy)=(fxx(:,iy,iqty)+bcs%xpower(iside,iqty)/dxx $ *(2*fx(:,iy,iqty)+(bcs%xpower(iside,iqty)-1) $ *f(:,iy,iqty)/dxx))*xfac gyy(:,iy)=fyy(:,iy,iqty)*xfac - ENDIF + endif f(:,iy,iqty)=g(:,iy) - IF(mode > 0)THEN + if(mode > 0)then fx(:,iy,iqty)=gx(:,iy) fy(:,iy,iqty)=gy(:,iy) - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then fxx(:,iy,iqty)=gxx(:,iy) fxy(:,iy,iqty)=gxy(:,iy) fyy(:,iy,iqty)=gyy(:,iy) - ENDIF - ENDDO - ENDDO - ENDDO + endif + enddo + enddo + enddo c----------------------------------------------------------------------- c restore y powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dyy=(bcs%ys(0:bcs%my-1)+dyv(1:bcs%my))-bcs%y0(iside) - DO iqty=1,bcs%nqty - IF(bcs%ypower(iside,iqty) == 0)CYCLE + do iqty=1,bcs%nqty + if(bcs%ypower(iside,iqty) == 0)cycle yfac=dyy**bcs%ypower(iside,iqty) - DO ix=1,bcs%mx + do ix=1,bcs%mx g(ix,:)=f(ix,:,iqty)*yfac - IF(mode > 0)THEN + if(mode > 0)then gy(ix,:)=(fy(ix,:,iqty)+f(ix,:,iqty) $ *bcs%ypower(iside,iqty)/dyy)*yfac gx(ix,:)=fx(ix,:,iqty)*yfac - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then gxx(ix,:)=fxx(ix,:,iqty)*yfac gxy(ix,:)=(fxy(ix,:,iqty)+fx(ix,:,iqty) $ *bcs%ypower(iside,iqty)/dyy)*yfac gyy(ix,:)=(fyy(ix,:,iqty)+bcs%ypower(iside,iqty)/dyy $ *(2*fy(ix,:,iqty)+(bcs%ypower(iside,iqty)-1) $ *f(ix,:,iqty)/dyy))*yfac - ENDIF + endif f(ix,:,iqty)=g(ix,:) - IF(mode > 0)THEN + if(mode > 0)then fx(ix,:,iqty)=gx(ix,:) fy(ix,:,iqty)=gy(ix,:) - ENDIF - IF(mode > 1)THEN + endif + if(mode > 1)then fxx(ix,:,iqty)=gxx(ix,:) fxy(ix,:,iqty)=gxy(ix,:) fyy(ix,:,iqty)=gyy(ix,:) - ENDIF - ENDDO - ENDDO - ENDDO + endif + enddo + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_all_eval + return + end subroutine bicube_all_eval c----------------------------------------------------------------------- c subprogram 8. bicube_all_getco. c computes coefficient matrices in all intervals. @@ -1355,24 +1355,24 @@ END SUBROUTINE bicube_all_eval c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_all_getco(bcs) + subroutine bicube_all_getco(bcs) - TYPE(bicube_type), INTENT(INOUT) :: bcs + type(bicube_type), intent(inout) :: bcs - INTEGER :: ix,iy - REAL(r8), DIMENSION(bcs%mx) :: hxfac,hxfac2,hxfac3 - REAL(r8), DIMENSION(bcs%my) :: hyfac,hyfac2,hyfac3 - REAL(r8), DIMENSION(3:4,4,bcs%mx) :: gxmat - REAL(r8), DIMENSION(3:4,4,bcs%my) :: gymat - REAL(r8), DIMENSION(4,4,bcs%mx,bcs%my,bcs%nqty) :: temp + integer :: ix,iy + real(r8), dimension(bcs%mx) :: hxfac,hxfac2,hxfac3 + real(r8), dimension(bcs%my) :: hyfac,hyfac2,hyfac3 + real(r8), dimension(3:4,4,bcs%mx) :: gxmat + real(r8), dimension(3:4,4,bcs%my) :: gymat + real(r8), dimension(4,4,bcs%mx,bcs%my,bcs%nqty) :: temp c----------------------------------------------------------------------- c allocate space. c----------------------------------------------------------------------- - IF(ALLOCATED(bcs%cmats))THEN - RETURN - ELSE - ALLOCATE(bcs%cmats(4,4,bcs%mx,bcs%my,bcs%nqty)) - ENDIF + if(allocated(bcs%cmats))then + return + else + allocate(bcs%cmats(4,4,bcs%mx,bcs%my,bcs%nqty)) + endif c----------------------------------------------------------------------- c compute gxmat. c----------------------------------------------------------------------- @@ -1424,7 +1424,7 @@ SUBROUTINE bicube_all_getco(bcs) c multiply by gymat^T. c----------------------------------------------------------------------- temp(:,1:2,:,:,:)=bcs%cmats(:,1:2,:,:,:) - DO iy=1,bcs%my + do iy=1,bcs%my temp(:,3,:,iy,:) $ =bcs%cmats(:,1,:,iy,:)*gymat(3,1,iy) $ +bcs%cmats(:,2,:,iy,:)*gymat(3,2,iy) @@ -1435,12 +1435,12 @@ SUBROUTINE bicube_all_getco(bcs) $ +bcs%cmats(:,2,:,iy,:)*gymat(4,2,iy) $ +bcs%cmats(:,3,:,iy,:)*gymat(4,3,iy) $ +bcs%cmats(:,4,:,iy,:)*gymat(4,4,iy) - ENDDO + enddo c----------------------------------------------------------------------- c multiply by gxmat. c----------------------------------------------------------------------- bcs%cmats(1:2,:,:,:,:)=temp(1:2,:,:,:,:) - DO ix=1,bcs%mx + do ix=1,bcs%mx bcs%cmats(3,:,ix,:,:) $ =gxmat(3,1,ix)*temp(1,:,ix,:,:) $ +gxmat(3,2,ix)*temp(2,:,ix,:,:) @@ -1451,12 +1451,12 @@ SUBROUTINE bicube_all_getco(bcs) $ +gxmat(4,2,ix)*temp(2,:,ix,:,:) $ +gxmat(4,3,ix)*temp(3,:,ix,:,:) $ +gxmat(4,4,ix)*temp(4,:,ix,:,:) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_all_getco + return + end subroutine bicube_all_getco c----------------------------------------------------------------------- c subprogram 9. bicube_write_xy. c produces ascii and binary output for bicubic spline fits. @@ -1464,97 +1464,97 @@ END SUBROUTINE bicube_all_getco c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_write_xy(bcs,out,bin,iua,iub,interp) + subroutine bicube_write_xy(bcs,out,bin,iua,iub,interp) - TYPE(bicube_type), INTENT(INOUT) :: bcs - LOGICAL, INTENT(IN) :: out,bin - INTEGER, INTENT(IN) :: iua,iub - LOGICAL, INTENT(IN) :: interp + type(bicube_type), intent(inout) :: bcs + logical, intent(in) :: out,bin + integer, intent(in) :: iua,iub + logical, intent(in) :: interp - INTEGER :: ix,iy,jx,jy,iqty - REAL(r8) :: x,y,dx,dy + integer :: ix,iy,jx,jy,iqty + real(r8) :: x,y,dx,dy - CHARACTER(80) :: format1,format2 + character(80) :: format1,format2 c----------------------------------------------------------------------- c write formats. c----------------------------------------------------------------------- - 10 FORMAT(1x,"iy = ",i3,", ",a6," = ",1p,e11.3) - 20 FORMAT(1x,"iy = ",i3,", jy = ",i1,", ",a6," = ",1p,e11.3) - 30 FORMAT('(/3x,"ix",4x,a,1x,',i3.3,'(4x,a6,1x)/)') - 40 FORMAT('(i5,1p,e11.3,',i3.3,'e11.3)') + 10 format(1x,"iy = ",i3,", ",a6," = ",1p,e11.3) + 20 format(1x,"iy = ",i3,", jy = ",i1,", ",a6," = ",1p,e11.3) + 30 format('(/3x,"ix",4x,a,1x,',i3.3,'(4x,a6,1x)/)') + 40 format('(i5,1p,e11.3,',i3.3,'e11.3)') c----------------------------------------------------------------------- c abort. c----------------------------------------------------------------------- - IF(.NOT. (out. OR. bin))RETURN + if(.not. (out. OR. bin))return c----------------------------------------------------------------------- c create format statements. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(format1,30)bcs%nqty - WRITE(format2,40)bcs%nqty - ENDIF + if(out)then + write(format1,30)bcs%nqty + write(format2,40)bcs%nqty + endif c----------------------------------------------------------------------- c write input data. c----------------------------------------------------------------------- - IF(out)WRITE(iua,'(1x,a/)')"input data" - DO iy=0,bcs%my + if(out)write(iua,'(1x,a/)')"input data" + do iy=0,bcs%my y=bcs%ys(iy) - IF(out)then - WRITE(iua,10)iy,bcs%ytitle,bcs%ys(iy) - WRITE(iua,format1)bcs%xtitle, + if(out)then + write(iua,10)iy,bcs%ytitle,bcs%ys(iy) + write(iua,format1)bcs%xtitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - ENDIF - DO ix=0,bcs%mx + endif + do ix=0,bcs%mx x=bcs%xs(ix) - CALL bicube_eval(bcs,x,y,0) - IF(out)WRITE(iua,format2)ix,x,bcs%f - IF(bin)WRITE(iub)REAL(x,4),REAL(bcs%f,4) - ENDDO - IF(out)WRITE(iua,format1)bcs%xtitle, + call bicube_eval(bcs,x,y,0) + if(out)write(iua,format2)ix,x,bcs%f + if(bin)write(iub)real(x,4),real(bcs%f,4) + enddo + if(out)write(iua,format1)bcs%xtitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - IF(bin)WRITE(iub) - ENDDO + if(bin)write(iub) + enddo c----------------------------------------------------------------------- c begin loops over y for interpolated data. c----------------------------------------------------------------------- - IF(interp)THEN - IF(out)WRITE(iua,'(1x,a/)')"interpolated data" - DO iy=0,bcs%my-1 + if(interp)then + if(out)write(iua,'(1x,a/)')"interpolated data" + do iy=0,bcs%my-1 dy=(bcs%ys(iy+1)-bcs%ys(iy))/4 - DO jy=0,4 + do jy=0,4 y=bcs%ys(iy)+dy*jy - IF(out)then - WRITE(iua,20)iy,jy,bcs%ytitle,y - WRITE(iua,format1)bcs%xtitle, + if(out)then + write(iua,20)iy,jy,bcs%ytitle,y + write(iua,format1)bcs%xtitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - ENDIF + endif c----------------------------------------------------------------------- c begin loops over x for interpolated data. c----------------------------------------------------------------------- - DO ix=0,bcs%mx-1 + do ix=0,bcs%mx-1 dx=(bcs%xs(ix+1)-bcs%xs(ix))/4 - DO jx=0,4 + do jx=0,4 x=bcs%xs(ix)+dx*jx - CALL bicube_eval(bcs,x,y,0) - IF(out)WRITE(iua,format2)ix,x,bcs%f - IF(bin)WRITE(iub)REAL(x,4),REAL(bcs%f,4) - ENDDO - IF(out)WRITE(iua,'()') - ENDDO + call bicube_eval(bcs,x,y,0) + if(out)write(iua,format2)ix,x,bcs%f + if(bin)write(iub)real(x,4),real(bcs%f,4) + enddo + if(out)write(iua,'()') + enddo c----------------------------------------------------------------------- c complete loops over y. c----------------------------------------------------------------------- - IF(out)WRITE(iua,format1)bcs%xtitle, + if(out)write(iua,format1)bcs%xtitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - IF(bin)WRITE(iub) - ENDDO - ENDDO - ENDIF + if(bin)write(iub) + enddo + enddo + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_write_xy + return + end subroutine bicube_write_xy c----------------------------------------------------------------------- c subprogram 10. bicube_write_yx. c produces ascii and binary output for bicubic spline fits. @@ -1562,97 +1562,97 @@ END SUBROUTINE bicube_write_xy c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_write_yx(bcs,out,bin,iua,iub,interp) + subroutine bicube_write_yx(bcs,out,bin,iua,iub,interp) - TYPE(bicube_type), INTENT(INOUT) :: bcs - LOGICAL, INTENT(IN) :: out,bin - INTEGER, INTENT(IN) :: iua,iub - LOGICAL, INTENT(IN) :: interp + type(bicube_type), intent(inout) :: bcs + logical, intent(in) :: out,bin + integer, intent(in) :: iua,iub + logical, intent(in) :: interp - INTEGER :: ix,iy,jx,jy,iqty - REAL(r8) :: x,y,dx,dy + integer :: ix,iy,jx,jy,iqty + real(r8) :: x,y,dx,dy - CHARACTER(80) :: format1,format2 + character(80) :: format1,format2 c----------------------------------------------------------------------- c write formats. c----------------------------------------------------------------------- - 10 FORMAT(1x,"ix = ",i3,", ",a6," = ",1p,e11.3) - 20 FORMAT(1x,"ix = ",i3,", jx = ",i1,", ",a6," = ",1p,e11.3) - 30 FORMAT('(/4x,"iy",4x,a6,1x,',i3.3,'(4x,a6,1x)/)') - 40 FORMAT('(i6,1p,e11.3,',i3.3,'e11.3)') + 10 format(1x,"ix = ",i3,", ",a6," = ",1p,e11.3) + 20 format(1x,"ix = ",i3,", jx = ",i1,", ",a6," = ",1p,e11.3) + 30 format('(/4x,"iy",4x,a6,1x,',i3.3,'(4x,a6,1x)/)') + 40 format('(i6,1p,e11.3,',i3.3,'e11.3)') c----------------------------------------------------------------------- c abort. c----------------------------------------------------------------------- - IF(.NOT. (out. OR. bin))RETURN + if(.not. (out. OR. bin))return c----------------------------------------------------------------------- c create format statements. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(format1,30)bcs%nqty - WRITE(format2,40)bcs%nqty - WRITE(iua,'(1x,a/)')"input data" - ENDIF + if(out)then + write(format1,30)bcs%nqty + write(format2,40)bcs%nqty + write(iua,'(1x,a/)')"input data" + endif c----------------------------------------------------------------------- c write input data. c----------------------------------------------------------------------- - DO ix=0,bcs%mx + do ix=0,bcs%mx x=bcs%xs(ix) - IF(out)then - WRITE(iua,10)ix,bcs%xtitle,bcs%xs(ix) - WRITE(iua,format1)bcs%ytitle, + if(out)then + write(iua,10)ix,bcs%xtitle,bcs%xs(ix) + write(iua,format1)bcs%ytitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - ENDIF - DO iy=0,bcs%my + endif + do iy=0,bcs%my y=bcs%ys(iy) - CALL bicube_eval(bcs,x,y,0) - IF(out)WRITE(iua,format2)iy,y,bcs%f - IF(bin)WRITE(iub)REAL(y,4),REAL(bcs%f,4) - ENDDO - IF(out)WRITE(iua,format1)bcs%ytitle, + call bicube_eval(bcs,x,y,0) + if(out)write(iua,format2)iy,y,bcs%f + if(bin)write(iub)real(y,4),real(bcs%f,4) + enddo + if(out)write(iua,format1)bcs%ytitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - IF(bin)WRITE(iub) - ENDDO + if(bin)write(iub) + enddo c----------------------------------------------------------------------- c begin loops over x for interpolated data. c----------------------------------------------------------------------- - IF(interp)THEN - IF(out)WRITE(iua,'(1x,a/)')"interpolated data" - DO ix=0,bcs%mx-1 + if(interp)then + if(out)write(iua,'(1x,a/)')"interpolated data" + do ix=0,bcs%mx-1 dx=(bcs%xs(ix+1)-bcs%xs(ix))/4 - DO jx=0,4 + do jx=0,4 x=bcs%xs(ix)+dx*jx - IF(out)then - WRITE(iua,20)ix,jx,bcs%xtitle,x - WRITE(iua,format1)bcs%ytitle, + if(out)then + write(iua,20)ix,jx,bcs%xtitle,x + write(iua,format1)bcs%ytitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - ENDIF + endif c----------------------------------------------------------------------- c begin loops over y for interpolated data. c----------------------------------------------------------------------- - DO iy=0,bcs%my-1 + do iy=0,bcs%my-1 dy=(bcs%ys(iy+1)-bcs%ys(iy))/4 - DO jy=0,4 + do jy=0,4 y=bcs%ys(iy)+dy*jy - CALL bicube_eval(bcs,x,y,0) - IF(out)WRITE(iua,format2)iy,y,bcs%f - IF(bin)WRITE(iub)REAL(y,4),REAL(bcs%f,4) - ENDDO - IF(out)WRITE(iua,'()') - ENDDO + call bicube_eval(bcs,x,y,0) + if(out)write(iua,format2)iy,y,bcs%f + if(bin)write(iub)real(y,4),real(bcs%f,4) + enddo + if(out)write(iua,'()') + enddo c----------------------------------------------------------------------- c complete loops over x. c----------------------------------------------------------------------- - IF(out)WRITE(iua,format1)bcs%ytitle, + if(out)write(iua,format1)bcs%ytitle, $ (bcs%title(iqty),iqty=1,bcs%nqty) - IF(bin)WRITE(iub) - ENDDO - ENDDO - ENDIF + if(bin)write(iub) + enddo + enddo + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_write_yx + return + end subroutine bicube_write_yx c----------------------------------------------------------------------- c subprogram 11. bicube_write_arrays. c produces ascii and binary output for bicubic spline fits. @@ -1660,64 +1660,64 @@ END SUBROUTINE bicube_write_yx c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_write_arrays(bcs,out,iua,iqty) + subroutine bicube_write_arrays(bcs,out,iua,iqty) - TYPE(bicube_type), INTENT(INOUT) :: bcs - LOGICAL, INTENT(IN) :: out - INTEGER, INTENT(IN) :: iua,iqty + type(bicube_type), intent(inout) :: bcs + logical, intent(in) :: out + integer, intent(in) :: iua,iqty - CHARACTER(80) :: format1,format2 - INTEGER :: ix,iy,my + character(80) :: format1,format2 + integer :: ix,iy,my c----------------------------------------------------------------------- c formats. c----------------------------------------------------------------------- - 10 FORMAT('(/2x,"ix/iy",',i3.3,'(3x,i3.3,5x)/)') - 20 FORMAT('(i5,1p,',i3.3,'e11.3)') + 10 format('(/2x,"ix/iy",',i3.3,'(3x,i3.3,5x)/)') + 20 format('(i5,1p,',i3.3,'e11.3)') c----------------------------------------------------------------------- c abort. c----------------------------------------------------------------------- - IF(.NOT. out)RETURN - my=MIN(bcs%my,32) - WRITE(iua,'(a,i2/)')"iqty = ",iqty + if(.not. out)return + my=Min(bcs%my,32) + write(iua,'(a,i2/)')"iqty = ",iqty c----------------------------------------------------------------------- c write fs. c----------------------------------------------------------------------- - WRITE(format1,10)my+1 - WRITE(format2,20)my+1 - WRITE(iua,"(a)")"fs:" - WRITE(iua,format1)(iy,iy=0,my) - WRITE(iua,format2)(ix,(bcs%fs(ix,iy,iqty),iy=0,my), + write(format1,10)my+1 + write(format2,20)my+1 + write(iua,"(a)")"fs:" + write(iua,format1)(iy,iy=0,my) + write(iua,format2)(ix,(bcs%fs(ix,iy,iqty),iy=0,my), $ ix=0,bcs%mx) - WRITE(iua,format1)(iy,iy=0,my) + write(iua,format1)(iy,iy=0,my) c----------------------------------------------------------------------- c write fsx. c----------------------------------------------------------------------- - WRITE(iua,"(a)")"fsx:" - WRITE(iua,format1)(iy,iy=0,my) - WRITE(iua,format2)(ix,(bcs%fsx(ix,iy,iqty),iy=0,my), + write(iua,"(a)")"fsx:" + write(iua,format1)(iy,iy=0,my) + write(iua,format2)(ix,(bcs%fsx(ix,iy,iqty),iy=0,my), $ ix=0,bcs%mx) - WRITE(iua,format1)(iy,iy=0,my) + write(iua,format1)(iy,iy=0,my) c----------------------------------------------------------------------- c write fsy. c----------------------------------------------------------------------- - WRITE(iua,"(a)")"fsy:" - WRITE(iua,format1)(iy,iy=0,my) - WRITE(iua,format2)(ix,(bcs%fsy(ix,iy,iqty),iy=0,my), + write(iua,"(a)")"fsy:" + write(iua,format1)(iy,iy=0,my) + write(iua,format2)(ix,(bcs%fsy(ix,iy,iqty),iy=0,my), $ ix=0,bcs%mx) - WRITE(iua,format1)(iy,iy=0,my) + write(iua,format1)(iy,iy=0,my) c----------------------------------------------------------------------- c write fsxy. c----------------------------------------------------------------------- - WRITE(iua,"(a)")"fsxy:" - WRITE(iua,format1)(iy,iy=0,my) - WRITE(iua,format2)(ix,(bcs%fsxy(ix,iy,iqty),iy=0,my), + write(iua,"(a)")"fsxy:" + write(iua,format1)(iy,iy=0,my) + write(iua,format2)(ix,(bcs%fsxy(ix,iy,iqty),iy=0,my), $ ix=0,bcs%mx) - WRITE(iua,format1)(iy,iy=0,my) + write(iua,format1)(iy,iy=0,my) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_write_arrays + return + end subroutine bicube_write_arrays c----------------------------------------------------------------------- c subprogram 12. bicube_copy. c copies one bicube type to another. @@ -1725,15 +1725,15 @@ END SUBROUTINE bicube_write_arrays c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_copy(bcs1,bcs2) + subroutine bicube_copy(bcs1,bcs2) - TYPE(bicube_type), INTENT(IN) :: bcs1 - TYPE(bicube_type), INTENT(INOUT) :: bcs2 + type(bicube_type), intent(in) :: bcs1 + type(bicube_type), intent(inout) :: bcs2 c----------------------------------------------------------------------- c computations. c----------------------------------------------------------------------- - IF(ALLOCATED(bcs2%xs))CALL bicube_dealloc(bcs2) - CALL bicube_alloc(bcs2,bcs1%mx,bcs1%my,bcs1%nqty) + if(allocated(bcs2%xs))call bicube_dealloc(bcs2) + call bicube_alloc(bcs2,bcs1%mx,bcs1%my,bcs1%nqty) bcs2%xs=bcs1%xs bcs2%ys=bcs1%ys bcs2%fs=bcs1%fs @@ -1755,8 +1755,8 @@ SUBROUTINE bicube_copy(bcs1,bcs2) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_copy + return + end subroutine bicube_copy c----------------------------------------------------------------------- c subprogram 13. bicube_extrema. c finds extrema. @@ -1764,17 +1764,17 @@ END SUBROUTINE bicube_copy c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bicube_extrema(bcs) + subroutine bicube_extrema(bcs) - TYPE(bicube_type), INTENT(INOUT) :: bcs + type(bicube_type), intent(inout) :: bcs - CHARACTER(80) :: message - INTEGER :: iext,iqty,it - INTEGER, PARAMETER :: itmax=20 - INTEGER, DIMENSION(2,2) :: jext - REAL(r8), PARAMETER :: eps=1e-10 - REAL(r8) :: x,y,dx,dy,lx,ly,lf,f,df,adet - REAL(r8), DIMENSION(2,2) :: amat,ainv + character(80) :: message + integer :: iext,iqty,it + integer, PARAMETER :: itmax=20 + integer, dimension(2,2) :: jext + real(r8), PARAMETER :: eps=1e-10 + real(r8) :: x,y,dx,dy,lx,ly,lf,f,df,adet + real(r8), dimension(2,2) :: amat,ainv c----------------------------------------------------------------------- c compute lengths. c----------------------------------------------------------------------- @@ -1783,8 +1783,8 @@ SUBROUTINE bicube_extrema(bcs) c----------------------------------------------------------------------- c start loops over iqty. c----------------------------------------------------------------------- - DO iqty=1,bcs%nqty - jext(:,1)=MINLOC(bcs%fs(:,:,iqty))-1 + do iqty=1,bcs%nqty + jext(:,1)=MinLOC(bcs%fs(:,:,iqty))-1 jext(:,2)=MAXLOC(bcs%fs(:,:,iqty))-1 bcs%fext(1,iqty)=bcs%fs(jext(1,1),jext(2,1),iqty) bcs%fext(2,iqty)=bcs%fs(jext(1,2),jext(2,2),iqty) @@ -1792,7 +1792,7 @@ SUBROUTINE bicube_extrema(bcs) c----------------------------------------------------------------------- c start loops over extrema. c----------------------------------------------------------------------- - DO iext=1,2 + do iext=1,2 x=bcs%xs(jext(1,iext)) y=bcs%ys(jext(2,iext)) f=HUGE(f) @@ -1802,10 +1802,10 @@ SUBROUTINE bicube_extrema(bcs) c----------------------------------------------------------------------- c locate extema by newton iteration. c----------------------------------------------------------------------- - DO - CALL bicube_eval(bcs,x,y,2) + do + call bicube_eval(bcs,x,y,2) df=bcs%f(iqty)-f - IF(ABS(dx) < eps*lx .OR. ABS(dy) < eps*ly + if(ABS(dx) < eps*lx .OR. ABS(dy) < eps*ly $ .OR. ABS(df) < eps*lf .OR. it >= itmax)EXIT it=it+1 f=bcs%f(iqty) @@ -1823,27 +1823,27 @@ SUBROUTINE bicube_extrema(bcs) dy=-ainv(2,1)*bcs%fx(iqty)-ainv(2,2)*bcs%fy(iqty) x=x+dx y=y+dy - ENDDO + enddo c----------------------------------------------------------------------- c abort on failure. c----------------------------------------------------------------------- - IF(it >= itmax)THEN - WRITE(message,'(a,i3,a)') + if(it >= itmax)then + write(message,'(a,i3,a)') $ "bicube_extrema: convergence failure for iqty = ", $ iqty,"." - CALL program_stop(message) - ENDIF + call program_stop(message) + endif c----------------------------------------------------------------------- c finish loops over iext and iqty. c----------------------------------------------------------------------- bcs%xext(iext,iqty)=x bcs%yext(iext,iqty)=y bcs%fext(iext,iqty)=bcs%f(iqty) - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bicube_extrema - END MODULE bicube_mod + return + end subroutine bicube_extrema + end module bicube_mod diff --git a/src/Splines/fortran/cspline.f b/src/Splines/fortran/cspline.f index df1f1767b..33f994270 100644 --- a/src/Splines/fortran/cspline.f +++ b/src/Splines/fortran/cspline.f @@ -35,24 +35,24 @@ c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - MODULE cspline_mod - USE spline_mod - IMPLICIT NONE + module cspline_mod + use spline_mod + implicit none - TYPE :: cspline_type - INTEGER :: mx,nqty,ix - REAL(r8), DIMENSION(:), POINTER :: xs - REAL(r8), DIMENSION(2) :: x0 - REAL(r8), DIMENSION(:,:), POINTER :: xpower - COMPLEX(r8), DIMENSION(:), POINTER :: f,f1,f2,f3 - COMPLEX(r8), DIMENSION(:,:), POINTER :: fs,fs1,fsi - CHARACTER(6), DIMENSION(:), POINTER :: title - CHARACTER(6) :: name - LOGICAL :: periodic - LOGICAL :: allocated=.FALSE. - END TYPE cspline_type + type :: cspline_type + integer :: mx,nqty,ix + real(r8), dimension(:), POinTER :: xs + real(r8), dimension(2) :: x0 + real(r8), dimension(:,:), POinTER :: xpower + complex(r8), dimension(:), POinTER :: f,f1,f2,f3 + complex(r8), dimension(:,:), POinTER :: fs,fs1,fsi + character(6), dimension(:), POinTER :: title + character(6) :: name + logical :: periodic + logical :: allocated=.false. + end type cspline_type - CONTAINS + contains c----------------------------------------------------------------------- c subprogram 1. cspline_alloc. c allocates space for cspline_type. @@ -60,17 +60,17 @@ MODULE cspline_mod c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_alloc(spl,mx,nqty) + subroutine cspline_alloc(spl,mx,nqty) - INTEGER, INTENT(IN) :: mx,nqty - TYPE(cspline_type), INTENT(INOUT) :: spl + integer, intent(in) :: mx,nqty + type(cspline_type), intent(inout) :: spl c----------------------------------------------------------------------- c safety check. c----------------------------------------------------------------------- - IF(spl%allocated)THEN - CALL program_stop("cspline_alloc: already allocated") - ENDIF + if(spl%allocated)then + call program_stop("cspline_alloc: already allocated") + endif c----------------------------------------------------------------------- c set scalars. @@ -78,28 +78,28 @@ SUBROUTINE cspline_alloc(spl,mx,nqty) spl%mx=mx spl%nqty=nqty spl%ix=0 - spl%periodic=.FALSE. + spl%periodic=.false. c----------------------------------------------------------------------- c allocate space. c----------------------------------------------------------------------- - ALLOCATE(spl%xs(0:mx)) - ALLOCATE(spl%f(nqty)) - ALLOCATE(spl%f1(nqty)) - ALLOCATE(spl%f2(nqty)) - ALLOCATE(spl%f3(nqty)) - ALLOCATE(spl%title(0:nqty)) - ALLOCATE(spl%fs(0:mx,nqty)) - ALLOCATE(spl%fs1(0:mx,nqty)) - ALLOCATE(spl%xpower(2,nqty)) + allocate(spl%xs(0:mx)) + allocate(spl%f(nqty)) + allocate(spl%f1(nqty)) + allocate(spl%f2(nqty)) + allocate(spl%f3(nqty)) + allocate(spl%title(0:nqty)) + allocate(spl%fs(0:mx,nqty)) + allocate(spl%fs1(0:mx,nqty)) + allocate(spl%xpower(2,nqty)) spl%xpower=0 spl%x0=0 - NULLIFY(spl%fsi) - spl%allocated=.TRUE. + NULLifY(spl%fsi) + spl%allocated=.true. c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_alloc + return + end subroutine cspline_alloc c----------------------------------------------------------------------- c subprogram 2. cspline_dealloc. c deallocates space for cspline_type. @@ -107,37 +107,37 @@ END SUBROUTINE cspline_alloc c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_dealloc(spl) + subroutine cspline_dealloc(spl) - TYPE(cspline_type), INTENT(INOUT) :: spl + type(cspline_type), intent(inout) :: spl c----------------------------------------------------------------------- c safety check. c----------------------------------------------------------------------- - IF(.NOT.spl%allocated)THEN - CALL program_stop("cspline_dealloc: not allocated") - ENDIF + if(.not.spl%allocated)then + call program_stop("cspline_dealloc: not allocated") + endif c----------------------------------------------------------------------- c deallocate space. c----------------------------------------------------------------------- - DEALLOCATE(spl%xs) - DEALLOCATE(spl%f) - DEALLOCATE(spl%f1) - DEALLOCATE(spl%f2) - DEALLOCATE(spl%f3) - DEALLOCATE(spl%title) - DEALLOCATE(spl%fs) - DEALLOCATE(spl%fs1) - DEALLOCATE(spl%xpower) - IF(ASSOCIATED(spl%fsi))DEALLOCATE(spl%fsi) - spl%allocated=.FALSE. + deallocate(spl%xs) + deallocate(spl%f) + deallocate(spl%f1) + deallocate(spl%f2) + deallocate(spl%f3) + deallocate(spl%title) + deallocate(spl%fs) + deallocate(spl%fs1) + deallocate(spl%xpower) + if(ASSOCIATED(spl%fsi))deallocate(spl%fsi) + spl%allocated=.false. c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_dealloc + return + end subroutine cspline_dealloc c----------------------------------------------------------------------- c subprogram 3. cspline_fit. c router between Glasser and classic spline fits. @@ -145,25 +145,26 @@ END SUBROUTINE cspline_dealloc c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_fit(spl,endmode) + subroutine cspline_fit(spl,endmode) - TYPE(cspline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode + type(cspline_type), intent(inout) :: spl + integer, intent(in) :: endmode c----------------------------------------------------------------------- c switch between csplines. c----------------------------------------------------------------------- - IF (use_classic_splines .AND. - $ (endmode.EQ."extrap".OR.endmode.EQ."natural"))THEN - CALL cspline_fit_classic(spl,endmode) - ELSE - CALL cspline_fit_ahg(spl,endmode) - ENDIF +c - use_classic_splines is always False +c if (use_classic_splines .and. +c $ (endmode == 3 .OR. endmode == 1))then ! 3 = Extrapolate, 1= natural +c call cspline_fit_classic(spl,endmode) +c else + call cspline_fit_ahg(spl,endmode) +c endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_fit + return + end subroutine cspline_fit c----------------------------------------------------------------------- c subprogram 4. cspline_fit_classic. c classical spline solution as in spline.f, but now with complex r @@ -173,62 +174,62 @@ END SUBROUTINE cspline_fit c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_fit_classic(spl,endmode) - TYPE(cspline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode - REAL(r8), DIMENSION(:),ALLOCATABLE :: d,l,u,h - COMPLEX(r8), DIMENSION(:,:),ALLOCATABLE :: r - REAL(r8), DIMENSION(0:spl%mx) :: xfac + subroutine cspline_fit_classic(spl,endmode) + type(cspline_type), intent(inout) :: spl + integer, intent(in) :: endmode + real(r8), dimension(:),allocatable :: d,l,u,h + complex(r8), dimension(:,:),allocatable :: r + real(r8), dimension(0:spl%mx) :: xfac - INTEGER :: iside,iqty,i - COMPLEX(r8),DIMENSION(spl%nqty) :: bs,cs,ds + integer :: iside,iqty,i + complex(r8),dimension(spl%nqty) :: bs,cs,ds c----------------------------------------------------------------------- c extract powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) /= 0)then xfac=1/ABS(spl%xs-spl%x0(iside))**spl%xpower(iside,iqty) spl%fs(:,iqty)=spl%fs(:,iqty)*xfac - ENDIF - ENDDO - ENDDO - ALLOCATE (d(0:spl%mx),l(spl%mx),u(spl%mx),r(0:spl%mx,spl%nqty)) - ALLOCATE (h(0:spl%mx-1)) + endif + enddo + enddo + allocate (d(0:spl%mx),l(spl%mx),u(spl%mx),r(0:spl%mx,spl%nqty)) + allocate (h(0:spl%mx-1)) c----------------------------------------------------------------------- c compute tridiagnol matrix for natural B.C. c----------------------------------------------------------------------- - DO i=0,spl%mx-1 + do i=0,spl%mx-1 h(i)=spl%xs(i+1)-spl%xs(i) - ENDDO + enddo d(0)=1 - DO i=1,spl%mx-1 + do i=1,spl%mx-1 d(i)=2*(h(i-1)+h(i)) - ENDDO + enddo d(spl%mx)=1 - DO i=1,spl%mx-1 + do i=1,spl%mx-1 l(i)=h(i-1) - ENDDO + enddo l(spl%mx)=0 u(1)=0 - DO i=2,spl%mx + do i=2,spl%mx u(i)=h(i-1) - ENDDO + enddo r(0,:)=0 - DO i=1,spl%mx-1 + do i=1,spl%mx-1 r(i,:)=( (spl%fs(i+1,:)-spl%fs(i,:))/h(i) $ -(spl%fs(i,:)-spl%fs(i-1,:))/h(i-1) )*six - ENDDO + enddo r(spl%mx,:)=0 - IF (endmode=="extrap") THEN - CALL cspline_get_yp(spl%xs(0:3),spl%fs(0:3,:), + if (endmode==3) then ! 3 = Extrapolated + call cspline_get_yp(spl%xs(0:3),spl%fs(0:3,:), $ spl%xs(0),r(0,:),spl%nqty) - CALL cspline_get_yp(spl%xs(spl%mx-3:spl%mx), + call cspline_get_yp(spl%xs(spl%mx-3:spl%mx), $ spl%fs(spl%mx-3:spl%mx,:),spl%xs(spl%mx), $ r(spl%mx,:),spl%nqty) d(0)=2*h(0) @@ -239,19 +240,19 @@ SUBROUTINE cspline_fit_classic(spl,endmode) r(spl%mx,:)=( r(spl%mx,:) $ -(spl%fs(spl%mx,:)-spl%fs(spl%mx-1,:))/h(spl%mx-1) )*six - ENDIF + endif c----------------------------------------------------------------------- c solve and contrruct spline. c----------------------------------------------------------------------- - CALL cspline_thomas(l,d,u,r,spl%mx+1,spl%nqty) + call cspline_thomas(l,d,u,r,spl%mx+1,spl%nqty) - DO i=0, spl%mx-1 + do i=0, spl%mx-1 bs=(spl%fs(i+1,:)-spl%fs(i,:))/h(i) $ - half*h(i)*r(i,:) $ - h(i)*(r(i+1,:)-r(i,:))/six spl%fs1(i,:)=bs - ENDDO + enddo ds=(r(spl%mx,:)-r(spl%mx-1,:))/(h(spl%mx-1)*six) cs=r(spl%mx-1,:)*half i=spl%mx-1 @@ -260,12 +261,12 @@ SUBROUTINE cspline_fit_classic(spl,endmode) $ - h(i)*(r(i+1,:)-r(i,:))/six i=spl%mx spl%fs1(i,:)=bs+h(i-1)*(cs*2+h(i-1)*ds*3) - DEALLOCATE (d,l,u,r,h) + deallocate (d,l,u,r,h) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_fit_classic + return + end subroutine cspline_fit_classic c----------------------------------------------------------------------- c subprogram 5. cspline_fit_ahg. c fits complex functions to cubic splines. @@ -273,47 +274,47 @@ END SUBROUTINE cspline_fit_classic c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_fit_ahg(spl,endmode) + subroutine cspline_fit_ahg(spl,endmode) - TYPE(cspline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode + type(cspline_type), intent(inout) :: spl + integer, intent(in) :: endmode - INTEGER :: iqty,iside - REAL(r8), DIMENSION(-1:1,0:spl%mx) :: a - REAL(r8), DIMENSION(spl%mx) :: b - REAL(r8), DIMENSION(4) :: cl,cr - REAL(r8), DIMENSION(0:spl%mx) :: xfac + integer :: iqty,iside + real(r8), dimension(-1:1,0:spl%mx) :: a + real(r8), dimension(spl%mx) :: b + real(r8), dimension(4) :: cl,cr + real(r8), dimension(0:spl%mx) :: xfac c----------------------------------------------------------------------- c extract powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) /= 0)then xfac=1/ABS(spl%xs-spl%x0(iside))**spl%xpower(iside,iqty) spl%fs(:,iqty)=spl%fs(:,iqty)*xfac - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c set up grid matrix. c----------------------------------------------------------------------- - CALL cspline_fac(spl,a,b,cl,cr,endmode) + call cspline_fac(spl,a,b,cl,cr,endmode) c----------------------------------------------------------------------- c compute first derivatives, interior. c----------------------------------------------------------------------- - DO iqty=1,spl%nqty + do iqty=1,spl%nqty spl%fs1(1:spl%mx-1,iqty)= $ 3*((spl%fs(2:spl%mx,iqty)-spl%fs(1:spl%mx-1,iqty)) $ *b(2:spl%mx) $ +(spl%fs(1:spl%mx-1,iqty)-spl%fs(0:spl%mx-2,iqty)) $ *b(1:spl%mx-1)) - ENDDO + enddo c----------------------------------------------------------------------- c extrapolation boundary conditions. c----------------------------------------------------------------------- - SELECT CASE(endmode) - CASE("extrap") - DO iqty=1,spl%nqty + select case(endmode) + case(3) ! 3 = Extrapolate + do iqty=1,spl%nqty spl%fs1(0,iqty)=SUM(cl(1:4)*spl%fs(0:3,iqty)) spl%fs1(spl%mx,iqty)=SUM(cr(1:4) $ *spl%fs(spl%mx:spl%mx-3:-1,iqty)) @@ -322,18 +323,18 @@ SUBROUTINE cspline_fit_ahg(spl,endmode) spl%fs1(spl%mx-1,iqty)= $ spl%fs1(spl%mx-1,iqty)-spl%fs1(spl%mx,iqty) $ /(spl%xs(spl%mx)-spl%xs(spl%mx-1)) - ENDDO - CALL cspline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) + enddo + call cspline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) c----------------------------------------------------------------------- c not-a-knot boundary conditions. c----------------------------------------------------------------------- - CASE("not-a-knot") + case(4) ! 4 = not-a-knot spl%fs1(1,:)=spl%fs1(1,:)-(2*spl%fs(1,:) $ -spl%fs(0,:)-spl%fs(2,:))*2*b(1) spl%fs1(spl%mx-1,:)=spl%fs1(spl%mx-1,:) $ +(2*spl%fs(spl%mx-1,:)-spl%fs(spl%mx,:) $ -spl%fs(spl%mx-2,:))*2*b(spl%mx) - CALL cspline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) + call cspline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) spl%fs1(0,:)=(2*(2*spl%fs(1,:)-spl%fs(0,:)-spl%fs(2,:)) $ +(spl%fs1(1,:)+spl%fs1(2,:))*(spl%xs(2)-spl%xs(1)) $ -spl%fs1(1,:)*(spl%xs(1)-spl%xs(0)))/(spl%xs(1)-spl%xs(0)) @@ -348,23 +349,23 @@ SUBROUTINE cspline_fit_ahg(spl,endmode) c----------------------------------------------------------------------- c periodic boundary conditions. c----------------------------------------------------------------------- - CASE("periodic") - spl%periodic=.TRUE. + case(2) ! 2 = Periodic + spl%periodic=.true. spl%fs1(0,:)=3*((spl%fs(1,:)-spl%fs(0,:))*b(1) $ +(spl%fs(0,:)-spl%fs(spl%mx-1,:))*b(spl%mx)) - CALL cspline_morrison(a(:,0:spl%mx-1),spl%fs1(0:spl%mx-1,:)) + call cspline_morrison(a(:,0:spl%mx-1),spl%fs1(0:spl%mx-1,:)) spl%fs1(spl%mx,:)=spl%fs1(0,:) c----------------------------------------------------------------------- c unrecognized boundary condition. c----------------------------------------------------------------------- - CASE DEFAULT - CALL program_stop("Cannot recognize endmode = "//TRIM(endmode)) - END SELECT + case default + call program_stop("Cannot recognize endmode") + end select c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_fit_ahg + return + end subroutine cspline_fit_ahg c----------------------------------------------------------------------- c subprogram 6. cspline_fac. c sets up matrix for cubic spline fitting. @@ -372,29 +373,29 @@ END SUBROUTINE cspline_fit_ahg c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_fac(spl,a,b,cl,cr,endmode) + subroutine cspline_fac(spl,a,b,cl,cr,endmode) - TYPE(cspline_type), INTENT(IN) :: spl - REAL(r8), DIMENSION(-1:1,0:spl%mx), INTENT(OUT) :: a - REAL(r8), DIMENSION(spl%mx), INTENT(OUT) :: b - REAL(r8), DIMENSION(4), INTENT(OUT) :: cl,cr - CHARACTER(*), INTENT(IN) :: endmode + type(cspline_type), intent(in) :: spl + real(r8), dimension(-1:1,0:spl%mx), intent(out) :: a + real(r8), dimension(spl%mx), intent(out) :: b + real(r8), dimension(4), intent(out) :: cl,cr + integer, intent(in) :: endmode - INTEGER :: j + integer :: j c----------------------------------------------------------------------- c compute interior matrix. c----------------------------------------------------------------------- b=1/(spl%xs(1:spl%mx)-spl%xs(0:spl%mx-1)) - DO j=1,spl%mx-1 + do j=1,spl%mx-1 a(-1,j)=b(j) a(0,j)=2*(b(j)+b(j+1)) a(1,j)=b(j+1) - ENDDO + enddo c----------------------------------------------------------------------- c extrapolation boundary conditions. c----------------------------------------------------------------------- - SELECT CASE(endmode) - CASE("extrap") + select case(endmode) + case(3) ! 3 = Extrapolate b=b*b cl(1)=(spl%xs(0)*(3*spl%xs(0) $ -2*(spl%xs(1)+spl%xs(2)+spl%xs(3))) @@ -434,11 +435,11 @@ SUBROUTINE cspline_fac(spl,a,b,cl,cr,endmode) $ /((spl%xs(spl%mx-3)-spl%xs(spl%mx)) $ *(spl%xs(spl%mx-3)-spl%xs(spl%mx-1)) $ *(spl%xs(spl%mx-3)-spl%xs(spl%mx-2))) - CALL cspline_triluf(a(:,1:spl%mx-1)) + call cspline_triluf(a(:,1:spl%mx-1)) c----------------------------------------------------------------------- c not-a-knot boundary conditions. c----------------------------------------------------------------------- - CASE("not-a-knot") + case(4) ! 4 = not-a-knot b=b*b a(0,1)=a(0,1)+(spl%xs(2)+spl%xs(0)-2*spl%xs(1))*b(1) a(1,1)=a(1,1)+(spl%xs(2)-spl%xs(1))*b(1) @@ -447,27 +448,27 @@ SUBROUTINE cspline_fac(spl,a,b,cl,cr,endmode) $ -spl%xs(spl%mx))*b(spl%mx) a(-1,spl%mx-1)=a(-1,spl%mx-1) $ +(spl%xs(spl%mx-1)-spl%xs(spl%mx-2))*b(spl%mx) - CALL cspline_triluf(a(:,1:spl%mx-1)) + call cspline_triluf(a(:,1:spl%mx-1)) c----------------------------------------------------------------------- c periodic boundary conditions. c----------------------------------------------------------------------- - CASE("periodic") + case(2) ! 2 = Periodic a(0,0:spl%mx:spl%mx)=2*(b(spl%mx)+b(1)) a(1,0)=b(1) a(-1,0)=b(spl%mx) b=b*b - CALL cspline_sherman(a(:,0:spl%mx-1)) + call cspline_sherman(a(:,0:spl%mx-1)) c----------------------------------------------------------------------- c unrecognized boundary condition. c----------------------------------------------------------------------- - CASE DEFAULT - CALL program_stop("Cannot recognize endmode = "//TRIM(endmode)) - END SELECT + case default + call program_stop("Cannot recognize endmode") + end select c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_fac + return + end subroutine cspline_fac c----------------------------------------------------------------------- c subprogram 7. cspline_eval. c evaluates complex cubic spline function. @@ -475,47 +476,47 @@ END SUBROUTINE cspline_fac c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_eval(spl,x,mode) + subroutine cspline_eval(spl,x,mode) - TYPE(cspline_type), INTENT(INOUT) :: spl - REAL(r8), INTENT(IN) :: x - INTEGER, INTENT(IN) :: mode + type(cspline_type), intent(inout) :: spl + real(r8), intent(in) :: x + integer, intent(in) :: mode - INTEGER :: iqty,iside - REAL(r8) :: xx,d,z,z1,xfac,dx - COMPLEX(r8) :: g,g1,g2,g3 + integer :: iqty,iside + real(r8) :: xx,d,z,z1,xfac,dx + complex(r8) :: g,g1,g2,g3 c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- xx=x spl%ix=MAX(spl%ix,0) - spl%ix=MIN(spl%ix,spl%mx-1) + spl%ix=Min(spl%ix,spl%mx-1) c----------------------------------------------------------------------- c normalize interval for periodic splines. c----------------------------------------------------------------------- - IF(spl%periodic)THEN - DO - IF(xx < spl%xs(spl%mx))EXIT + if(spl%periodic)then + do + if(xx < spl%xs(spl%mx))EXIT xx=xx-spl%xs(spl%mx) - ENDDO - DO - IF(xx >= spl%xs(0))EXIT + enddo + do + if(xx >= spl%xs(0))EXIT xx=xx+spl%xs(spl%mx) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c find cubic spline interval. c----------------------------------------------------------------------- - DO - IF(spl%ix <= 0)EXIT - IF(xx >= spl%xs(spl%ix))EXIT + do + if(spl%ix <= 0)EXIT + if(xx >= spl%xs(spl%ix))EXIT spl%ix=spl%ix-1 - ENDDO - DO - IF(spl%ix >= spl%mx-1)EXIT - IF(xx < spl%xs(spl%ix+1))EXIT + enddo + do + if(spl%ix >= spl%mx-1)EXIT + if(xx < spl%xs(spl%ix+1))EXIT spl%ix=spl%ix+1 - ENDDO + enddo c----------------------------------------------------------------------- c evaluate offset and related quantities. c----------------------------------------------------------------------- @@ -532,59 +533,59 @@ SUBROUTINE cspline_eval(spl,x,mode) c----------------------------------------------------------------------- c evaluate first derivatives. c----------------------------------------------------------------------- - IF(mode > 0)THEN + if(mode > 0)then spl%f1=6*(spl%fs(spl%ix+1,:) $ -spl%fs(spl%ix,:))*z*z1/d $ +spl%fs1(spl%ix,:)*z1*(3*z1-2) $ +spl%fs1(spl%ix+1,:)*z*(3*z-2) - ENDIF + endif c----------------------------------------------------------------------- c evaluate second derivatives. c----------------------------------------------------------------------- - IF(mode > 1)THEN + if(mode > 1)then spl%f2=(6*(spl%fs(spl%ix+1,:) $ -spl%fs(spl%ix,:))*(z1-z)/d $ -spl%fs1(spl%ix,:)*(6*z1-2) $ +spl%fs1(spl%ix+1,:)*(6*z-2))/d - ENDIF + endif c----------------------------------------------------------------------- c evaluate third derivatives. c----------------------------------------------------------------------- - IF(mode > 2)THEN + if(mode > 2)then spl%f3=(12*(spl%fs(spl%ix,:) $ -spl%fs(spl%ix+1,:))/d $ +6*(spl%fs1(spl%ix,:) $ +spl%fs1(spl%ix+1,:)))/(d*d) - ENDIF + endif c----------------------------------------------------------------------- c restore powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=x-spl%x0(iside) - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) == 0)CYCLE + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**spl%xpower(iside,iqty) g=spl%f(iqty)*xfac - IF(mode > 0)g1=(spl%f1(iqty)+spl%f(iqty) + if(mode > 0)g1=(spl%f1(iqty)+spl%f(iqty) $ *spl%xpower(iside,iqty)/dx)*xfac - IF(mode > 1)g2=(spl%f2(iqty)+spl%xpower(iside,iqty)/dx + if(mode > 1)g2=(spl%f2(iqty)+spl%xpower(iside,iqty)/dx $ *(2*spl%f1(iqty)+(spl%xpower(iside,iqty)-1) $ *spl%f(iqty)/dx))*xfac - IF(mode > 2)g3=(spl%f3(iqty)+spl%xpower(iside,iqty)/dx + if(mode > 2)g3=(spl%f3(iqty)+spl%xpower(iside,iqty)/dx $ *(3*spl%f2(iqty)+(spl%xpower(iside,iqty)-1)/dx $ *(3*spl%f1(iqty)+(spl%xpower(iside,iqty)-2)/dx $ *spl%f(iqty))))*xfac spl%f(iqty)=g - IF(mode > 0)spl%f1(iqty)=g1 - IF(mode > 1)spl%f2(iqty)=g2 - IF(mode > 2)spl%f3(iqty)=g3 - ENDDO - ENDDO + if(mode > 0)spl%f1(iqty)=g1 + if(mode > 1)spl%f2(iqty)=g2 + if(mode > 2)spl%f3(iqty)=g3 + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_eval + return + end subroutine cspline_eval c----------------------------------------------------------------------- c subprogram 8. cspline_eval_external. c evaluates complex cubic splines with external arrays (parallel). @@ -592,20 +593,20 @@ END SUBROUTINE cspline_eval c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_eval_external(spl,x,s_ix,s_f,s_f1,s_f2,s_f3) + subroutine cspline_eval_external(spl,x,s_f,s_f1,s_f2,s_f3) - TYPE(cspline_type), INTENT(IN) :: spl - REAL(r8), INTENT(IN) :: x + type(cspline_type), intent(in) :: spl + real(r8), intent(in) :: x - INTEGER :: iqty,iside - REAL(r8) :: xx,d,z,z1,dx - COMPLEX(r8) :: g,g1,g2,g3 + integer :: iqty,iside + integer :: ix, i_low, i_high, i_mid + real(r8) :: xx,d,z,z1,dx + complex(r8) :: g,g1,g2,g3 - INTEGER, INTENT(INOUT) :: s_ix - COMPLEX(r8), DIMENSION(:), INTENT(INOUT) :: s_f - COMPLEX(r8), DIMENSION(:),OPTIONAL,INTENT(OUT) :: s_f1,s_f2,s_f3 + complex(r8), dimension(:), intent(inout) :: s_f + complex(r8), dimension(:),optional,intent(out) :: s_f1,s_f2,s_f3 - REAL(r8) :: xpow,xfac + real(r8) :: xpow,xfac c----------------------------------------------------------------------- c zero out external array. c----------------------------------------------------------------------- @@ -614,104 +615,112 @@ SUBROUTINE cspline_eval_external(spl,x,s_ix,s_f,s_f1,s_f2,s_f3) c preliminary computations. c----------------------------------------------------------------------- xx=x - s_ix=MAX(s_ix,0) - s_ix=MIN(s_ix,spl%mx-1) c----------------------------------------------------------------------- c normalize interval for periodic splines. c----------------------------------------------------------------------- - IF(spl%periodic)THEN - DO - IF(xx < spl%xs(spl%mx))EXIT + if(spl%periodic)then + do + if(xx < spl%xs(spl%mx))EXIT xx=xx-spl%xs(spl%mx) - ENDDO - DO - IF(xx >= spl%xs(0))EXIT + enddo + do + if(xx >= spl%xs(0))EXIT xx=xx+spl%xs(spl%mx) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- -c find cubic spline interval. +c find cubic spline interval using Binary Search c----------------------------------------------------------------------- - DO - IF(s_ix <= 0)EXIT - IF(xx >= spl%xs(s_ix))EXIT - s_ix=s_ix-1 - ENDDO - DO - IF(s_ix >= spl%mx-1)EXIT - IF(xx < spl%xs(s_ix+1))EXIT - s_ix=s_ix+1 - ENDDO + i_low = 0 + i_high = spl%mx - 1 + + do while (i_low <= i_high) + i_mid = i_low + (i_high - i_low) / 2 + if (xx < spl%xs(i_mid)) then + i_high = i_mid - 1 + else if (xx >= spl%xs(i_mid + 1)) then + i_low = i_mid + 1 + else + ! We found the interval: xs(i_mid) <= xx < xs(i_mid+1) + ix = i_mid + exit + endif + enddo + + ! If the search fails, treat it as a boundary value. + if (i_low > i_high) then + ix = min(max(i_low - 1, 0), spl%mx - 1) + endif c----------------------------------------------------------------------- c evaluate offset and related quantities. c----------------------------------------------------------------------- - d=spl%xs(s_ix+1)-spl%xs(s_ix) - z=(xx-spl%xs(s_ix))/d + d=spl%xs(ix+1)-spl%xs(ix) + z=(xx-spl%xs(ix))/d z1=1-z c----------------------------------------------------------------------- c evaluate functions. c----------------------------------------------------------------------- - s_f=spl%fs(s_ix,:)*z1*z1*(3-2*z1) - $ +spl%fs(s_ix+1,:)*z*z*(3-2*z) - $ +d*z*z1*(spl%fs1(s_ix,:)*z1 - $ -spl%fs1(s_ix+1,:)*z) + s_f=spl%fs(ix,:)*z1*z1*(3-2*z1) + $ +spl%fs(ix+1,:)*z*z*(3-2*z) + $ +d*z*z1*(spl%fs1(ix,:)*z1 + $ -spl%fs1(ix+1,:)*z) c----------------------------------------------------------------------- c evaluate first derivatives. c----------------------------------------------------------------------- - IF(PRESENT(s_f1))THEN - s_f1=6*(spl%fs(s_ix+1,:) - $ -spl%fs(s_ix,:))*z*z1/d - $ +spl%fs1(s_ix,:)*z1*(3*z1-2) - $ +spl%fs1(s_ix+1,:)*z*(3*z-2) - ENDIF + if(present(s_f1))then + s_f1=6*(spl%fs(ix+1,:) + $ -spl%fs(ix,:))*z*z1/d + $ +spl%fs1(ix,:)*z1*(3*z1-2) + $ +spl%fs1(ix+1,:)*z*(3*z-2) + endif c----------------------------------------------------------------------- c evaluate second derivatives. c----------------------------------------------------------------------- - IF(PRESENT(s_f2))THEN - s_f2=(6*(spl%fs(s_ix+1,:) - $ -spl%fs(s_ix,:))*(z1-z)/d - $ -spl%fs1(s_ix,:)*(6*z1-2) - $ +spl%fs1(s_ix+1,:)*(6*z-2))/d - ENDIF + if(present(s_f2))then + s_f2=(6*(spl%fs(ix+1,:) + $ -spl%fs(ix,:))*(z1-z)/d + $ -spl%fs1(ix,:)*(6*z1-2) + $ +spl%fs1(ix+1,:)*(6*z-2))/d + endif c----------------------------------------------------------------------- c evaluate third derivatives. c----------------------------------------------------------------------- - IF(PRESENT(s_f3))THEN - s_f3=(12*(spl%fs(s_ix,:) - $ -spl%fs(s_ix+1,:))/d - $ +6*(spl%fs1(s_ix,:) - $ +spl%fs1(s_ix+1,:)))/(d*d) - ENDIF + if(present(s_f3))then + s_f3=(12*(spl%fs(ix,:) + $ -spl%fs(ix+1,:))/d + $ +6*(spl%fs1(ix,:) + $ +spl%fs1(ix+1,:)))/(d*d) + endif c----------------------------------------------------------------------- c restore powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=ABS(x-spl%x0(iside)) - DO iqty=1,spl%nqty + do iqty=1,spl%nqty xpow = spl%xpower(iside,iqty) - IF(xpow == 0)CYCLE + if(xpow == 0)cycle xfac=dx**xpow g=s_f(iqty)*xfac - IF(PRESENT(s_f1))g1=(s_f1(iqty)+s_f(iqty) + if(present(s_f1))g1=(s_f1(iqty)+s_f(iqty) $ *spl%xpower(iside,iqty)/dx)*xfac - IF(PRESENT(s_f2))g2=(s_f2(iqty)+spl%xpower(iside,iqty)/dx + if(present(s_f2))g2=(s_f2(iqty)+spl%xpower(iside,iqty)/dx $ *(2*s_f1(iqty)+(spl%xpower(iside,iqty)-1) $ *s_f(iqty)/dx))*xfac - IF(PRESENT(s_f3))g3=(s_f3(iqty)+spl%xpower(iside,iqty)/dx + if(present(s_f3))g3=(s_f3(iqty)+spl%xpower(iside,iqty)/dx $ *(3*s_f2(iqty)+(spl%xpower(iside,iqty)-1)/dx $ *(3*s_f1(iqty)+(spl%xpower(iside,iqty)-2)/dx $ *s_f(iqty))))*xfac s_f(iqty)=g - IF(PRESENT(s_f1))s_f1(iqty)=g1 - IF(PRESENT(s_f2))s_f2(iqty)=g2 - IF(PRESENT(s_f3))s_f3(iqty)=g3 - ENDDO - ENDDO + if(present(s_f1))s_f1(iqty)=g1 + if(present(s_f2))s_f2(iqty)=g2 + if(present(s_f3))s_f3(iqty)=g3 + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_eval_external + return + end subroutine cspline_eval_external c----------------------------------------------------------------------- c subprogram 9. cspline_all_eval. c evaluates cubic spline function. @@ -719,18 +728,18 @@ END SUBROUTINE cspline_eval_external c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_all_eval(spl,z,f,f1,f2,f3,mode) + subroutine cspline_all_eval(spl,z,f,f1,f2,f3,mode) - TYPE(cspline_type), INTENT(INOUT) :: spl - REAL(r8), INTENT(IN) :: z - COMPLEX(r8), DIMENSION(spl%mx,spl%nqty), INTENT(OUT) :: + type(cspline_type), intent(inout) :: spl + real(r8), intent(in) :: z + complex(r8), dimension(spl%mx,spl%nqty), intent(out) :: $ f,f1,f2,f3 - INTEGER, INTENT(IN) :: mode + integer, intent(in) :: mode - INTEGER :: iqty,nqty,n,iside - REAL(r8) :: z1 - REAL(r8), DIMENSION(spl%mx) :: d,xfac,dx - COMPLEX(r8), DIMENSION(spl%mx) :: g,g1,g2,g3 + integer :: iqty,nqty,n,iside + real(r8) :: z1 + real(r8), dimension(spl%mx) :: d,xfac,dx + complex(r8), dimension(spl%mx) :: g,g1,g2,g3 c----------------------------------------------------------------------- c evaluate offset and related quantities. c----------------------------------------------------------------------- @@ -741,70 +750,70 @@ SUBROUTINE cspline_all_eval(spl,z,f,f1,f2,f3,mode) c----------------------------------------------------------------------- c evaluate functions. c----------------------------------------------------------------------- - DO iqty=1,nqty + do iqty=1,nqty f(:,iqty)=spl%fs(0:n-1,iqty)*z1*z1*(3-2*z1) $ +spl%fs(1:n,iqty)*z*z*(3-2*z) $ +d*z*z1*(spl%fs1(0:n-1,iqty)*z1-spl%fs1(1:n,iqty)*z) - ENDDO + enddo c----------------------------------------------------------------------- c evaluate first derivatives. c----------------------------------------------------------------------- - IF(mode > 0)THEN - DO iqty=1,nqty + if(mode > 0)then + do iqty=1,nqty f1(:,iqty)=6*(spl%fs(1:n,iqty)-spl%fs(0:n-1,iqty))*z*z1/d $ +spl%fs1(0:n-1,iqty)*z1*(3*z1-2) $ +spl%fs1(1:n,iqty)*z*(3*z-2) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c evaluate second derivatives. c----------------------------------------------------------------------- - IF(mode > 1)THEN - DO iqty=1,nqty + if(mode > 1)then + do iqty=1,nqty f2(:,iqty)=(6*(spl%fs(1:n,iqty)-spl%fs(0:n-1,iqty))*(z1-z)/d $ -spl%fs1(0:n-1,iqty)*(6*z1-2) $ +spl%fs1(1:n,iqty)*(6*z-2))/d - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c evaluate third derivatives. c----------------------------------------------------------------------- - IF(mode > 2)THEN - DO iqty=1,nqty + if(mode > 2)then + do iqty=1,nqty f3(:,iqty)=(12*(spl%fs(0:n-1,iqty)-spl%fs(1:n,iqty))/d $ +6*(spl%fs1(0:n-1,iqty)+spl%fs1(1:n,iqty)))/(d*d) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c restore powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=(spl%xs(0:spl%mx-1)+z*d(1:spl%mx))-spl%x0(iside) - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) == 0)CYCLE + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**spl%xpower(iside,iqty) g=f(:,iqty)*xfac - IF(mode > 0)g1=(f1(:,iqty) + if(mode > 0)g1=(f1(:,iqty) $ +f(:,iqty)*spl%xpower(iside,iqty)/dx)*xfac - IF(mode > 1)g2=(f2(:,iqty)+spl%xpower(iside,iqty)/dx + if(mode > 1)g2=(f2(:,iqty)+spl%xpower(iside,iqty)/dx $ *(2*f1(:,iqty)+(spl%xpower(iside,iqty)-1) $ *f(:,iqty)/dx))*xfac $ - IF(mode > 2)g3=(f3(:,iqty)+spl%xpower(iside,iqty)/dx + if(mode > 2)g3=(f3(:,iqty)+spl%xpower(iside,iqty)/dx $ *(3*f2(:,iqty)+(spl%xpower(iside,iqty)-1)/dx $ *(3*f1(:,iqty)+(spl%xpower(iside,iqty)-2)/dx $ *f(:,iqty))))*xfac f(:,iqty)=g - IF(mode > 0)f1(:,iqty)=g1 - IF(mode > 1)f2(:,iqty)=g2 - IF(mode > 2)f3(:,iqty)=g3 - ENDDO - ENDDO + if(mode > 0)f1(:,iqty)=g1 + if(mode > 1)f2(:,iqty)=g2 + if(mode > 2)f3(:,iqty)=g3 + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_all_eval + return + end subroutine cspline_all_eval c----------------------------------------------------------------------- c subprogram 10. cspline_write. c produces ascii and binary output. @@ -812,88 +821,88 @@ END SUBROUTINE cspline_all_eval c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_write(spl,out,bin,iua,iub,interp) + subroutine cspline_write(spl,out,bin,iua,iub,interp) - TYPE(cspline_type), INTENT(INOUT) :: spl - LOGICAL, INTENT(IN) :: out,bin - INTEGER, INTENT(IN) :: iua,iub - LOGICAL, INTENT(IN) :: interp + type(cspline_type), intent(inout) :: spl + logical, intent(in) :: out,bin + integer, intent(in) :: iua,iub + logical, intent(in) :: interp - CHARACTER(80) :: format1,format2 - INTEGER :: i,j - REAL(r8) :: x,dx + character(80) :: format1,format2 + integer :: i,j + real(r8) :: x,dx c----------------------------------------------------------------------- c formats. c----------------------------------------------------------------------- - 10 FORMAT('(/4x,"i",4x,a6,1x,',i2.2,'(2x,"re ",a6,2x,"im ",a6)/)') - 20 FORMAT('(i5,1p,',i2.2,'e11.3)') -! 30 FORMAT('(/4x,"i",2x,"j",',i2.2,'(4x,a6,1x)/)') + 10 format('(/4x,"i",4x,a6,1x,',i2.2,'(2x,"re ",a6,2x,"im ",a6)/)') + 20 format('(i5,1p,',i2.2,'e11.3)') +! 30 format('(/4x,"i",2x,"j",',i2.2,'(4x,a6,1x)/)') c----------------------------------------------------------------------- c abort. c----------------------------------------------------------------------- - IF(.NOT.out.AND..NOT.bin)RETURN + if(.not.out.and..not.bin)return c----------------------------------------------------------------------- c print ascii tables of node values and derivatives. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(format1,10)spl%nqty - WRITE(format2,20)2*spl%nqty+1 - WRITE(iua,'(/1x,a)')'node values:' - WRITE(iua,format1)spl%title(0), + if(out)then + write(format1,10)spl%nqty + write(format2,20)2*spl%nqty+1 + write(iua,'(/1x,a)')'node values:' + write(iua,format1)spl%title(0), $ (spl%title(i),spl%title(i),i=1,spl%nqty) - ENDIF - DO i=0,spl%mx - CALL cspline_eval(spl,spl%xs(i),0) - IF(out)WRITE(iua,format2)spl%xs(i),spl%f - IF(bin)WRITE(iub)REAL(spl%xs(i),4), - $ REAL(spl%f,4),REAL(AIMAG(spl%f),4) - ENDDO - IF(out)WRITE(iua,format1)spl%title(0), + endif + do i=0,spl%mx + call cspline_eval(spl,spl%xs(i),0) + if(out)write(iua,format2)spl%xs(i),spl%f + if(bin)write(iub)real(spl%xs(i),4), + $ real(spl%f,4),real(AIMAG(spl%f),4) + enddo + if(out)write(iua,format1)spl%title(0), $ (spl%title(i),spl%title(i),i=1,spl%nqty) - IF(bin)WRITE(iub) - IF(.NOT. interp)RETURN + if(bin)write(iub) + if(.not. interp)return c----------------------------------------------------------------------- c print header for interpolated values. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(iua,'(/1x,a)')'interpolated values:' - WRITE(iua,format1)spl%title(0), + if(out)then + write(iua,'(/1x,a)')'interpolated values:' + write(iua,format1)spl%title(0), $ (spl%title(i),spl%title(i),i=1,spl%nqty) - ENDIF + endif c----------------------------------------------------------------------- c print interpolated values. c----------------------------------------------------------------------- - DO i=0,spl%mx-1 + do i=0,spl%mx-1 dx=(spl%xs(i+1)-spl%xs(i))/4 - DO j=0,4 + do j=0,4 x=spl%xs(i)+j*dx - CALL cspline_eval(spl,x,0) - IF(out)WRITE(iua,format2)i,x,spl%f - IF(bin)WRITE(iub)REAL(x,4), - $ REAL(spl%f,4),REAL(AIMAG(spl%f),4) - ENDDO - ENDDO + call cspline_eval(spl,x,0) + if(out)write(iua,format2)i,x,spl%f + if(bin)write(iub)real(x,4), + $ real(spl%f,4),real(AIMAG(spl%f),4) + enddo + enddo c----------------------------------------------------------------------- c print final interpolated values. c----------------------------------------------------------------------- x=spl%xs(spl%mx) - CALL cspline_eval(spl,x,0) - IF(out)THEN - WRITE(iua,format2)i,x,spl%f - WRITE(iua,format1)spl%title(0), + call cspline_eval(spl,x,0) + if(out)then + write(iua,format2)i,x,spl%f + write(iua,format1)spl%title(0), $ (spl%title(i),spl%title(i),i=1,spl%nqty) - ENDIF - IF(bin)THEN - WRITE(iub)REAL(x,4), - $ REAL(spl%f,4),REAL(AIMAG(spl%f),4) - WRITE(iub) - CALL bin_close(bin_unit) - ENDIF + endif + if(bin)then + write(iub)real(x,4), + $ real(spl%f,4),real(AIMAG(spl%f),4) + write(iub) + call bin_close(bin_unit) + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_write + return + end subroutine cspline_write c----------------------------------------------------------------------- c subprogram 11. cspline_write_log c produces ascii and binary output of logs. @@ -901,149 +910,149 @@ END SUBROUTINE cspline_write c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_write_log(spl,out,bin,iua,iub,interp,stride, + subroutine cspline_write_log(spl,out,bin,iua,iub,interp,stride, $ xend) - TYPE(cspline_type), INTENT(INOUT) :: spl - LOGICAL, INTENT(IN) :: out,bin - INTEGER, INTENT(IN) :: iua,iub - INTEGER, INTENT(IN) :: stride - LOGICAL, INTENT(IN) :: interp - REAL(r8), DIMENSION(2) :: xend + type(cspline_type), intent(inout) :: spl + logical, intent(in) :: out,bin + integer, intent(in) :: iua,iub + integer, intent(in) :: stride + logical, intent(in) :: interp + real(r8), dimension(2) :: xend - CHARACTER(50) :: format1,format2 - INTEGER :: iqty,ix,j,offset - REAL(r8), PARAMETER :: epsilon=-20*alog10 - REAL(r8) :: x,dx - REAL(r8), DIMENSION(2) :: xlog - COMPLEX(r8), DIMENSION(spl%nqty/stride) :: flog + character(50) :: format1,format2 + integer :: iqty,ix,j,offset + real(r8), PARAMETER :: epsilon=-20*alog10 + real(r8) :: x,dx + real(r8), dimension(2) :: xlog + complex(r8), dimension(spl%nqty/stride) :: flog c----------------------------------------------------------------------- c formats. c----------------------------------------------------------------------- - 10 FORMAT('(/4x,"i",4x,a6,1x,',i2.2,'(2x,"re ",a6,2x,"im ",a6)/)') - 20 FORMAT('(i5,1p,',i2.2,'e11.3)') + 10 format('(/4x,"i",4x,a6,1x,',i2.2,'(2x,"re ",a6,2x,"im ",a6)/)') + 20 format('(i5,1p,',i2.2,'e11.3)') c----------------------------------------------------------------------- c abort. c----------------------------------------------------------------------- - IF(.NOT. out .AND. .NOT. bin)RETURN - IF(MOD(spl%nqty,stride) /= 0)THEN - WRITE(*,'(2(a,i3))')"Cspline_write_log: nqty = ",spl%nqty, + if(.not. out .and. .not. bin)return + if(MOD(spl%nqty,stride) /= 0)then + write(*,'(2(a,i3))')"Cspline_write_log: nqty = ",spl%nqty, $ " is not an integral multiple of stride = ",stride - STOP - ENDIF + stop + endif c----------------------------------------------------------------------- c write title and start loop over offsets. c----------------------------------------------------------------------- - IF(OUT)WRITE(iua,'(1x,a)') + if(out)write(iua,'(1x,a)') $ "Output from cspline_write_log for "//TRIM(spl%name)//":" - DO offset=1,stride + do offset=1,stride c----------------------------------------------------------------------- c print ascii table of node values. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(format1,10)spl%nqty/stride - WRITE(format2,20)2*spl%nqty/stride+1 - WRITE(iua,'(/1x,a,i3,a)') + if(out)then + write(format1,10)spl%nqty/stride + write(format2,20)2*spl%nqty/stride+1 + write(iua,'(/1x,a,i3,a)') $ "input values for offset = ",offset-1,":" - WRITE(iua,format1)spl%title(0),(spl%title(iqty), + write(iua,format1)spl%title(0),(spl%title(iqty), $ spl%title(iqty),iqty=offset,spl%nqty,stride) - DO ix=0,spl%mx - CALL cspline_eval(spl,spl%xs(ix),0) - WRITE(iua,format2)ix,spl%xs(ix), + do ix=0,spl%mx + call cspline_eval(spl,spl%xs(ix),0) + write(iua,format2)ix,spl%xs(ix), $ spl%f(offset:spl%nqty:stride) - ENDDO - WRITE(iua,format1)spl%title(0),(spl%title(iqty), + enddo + write(iua,format1)spl%title(0),(spl%title(iqty), $ spl%title(iqty),iqty=offset,spl%nqty,stride) - ENDIF + endif c----------------------------------------------------------------------- c compute logs. c----------------------------------------------------------------------- - IF(bin)THEN - DO ix=0,spl%mx + if(bin)then + do ix=0,spl%mx xlog=LOG10(ABS(spl%xs(ix)-xend)) - CALL cspline_eval(spl,spl%xs(ix),0) + call cspline_eval(spl,spl%xs(ix),0) WHERE(spl%f(offset:spl%nqty:stride) /= 0) flog=LOG(spl%f(offset:spl%nqty:stride)) - ELSEWHERE + elseWHERE flog=epsilon - ENDWHERE + endWHERE c----------------------------------------------------------------------- c print binary table of node values. c----------------------------------------------------------------------- - WRITE(iub)REAL(spl%xs(ix),4),REAL(xlog,4), - $ (REAL(REAL(flog(iqty))/alog10,4), - $ REAL(AIMAG(flog(iqty))*rtod,4), + write(iub)real(spl%xs(ix),4),real(xlog,4), + $ (real(real(flog(iqty))/alog10,4), + $ real(AIMAG(flog(iqty))*rtod,4), $ iqty=1,SIZE(flog)) - ENDDO - WRITE(iub) - ENDIF + enddo + write(iub) + endif c----------------------------------------------------------------------- c print header for interpolated values. c----------------------------------------------------------------------- - IF(interp)THEN - IF(out)THEN - WRITE(iua,'(/1x,a,i3)') + if(interp)then + if(out)then + write(iua,'(/1x,a,i3)') $ "interpolated values for offset = ",offset,":" - WRITE(iua,format1)spl%title(0), + write(iua,format1)spl%title(0), $ (spl%title(iqty),spl%title(iqty), $ iqty=offset,spl%nqty,stride) - ENDIF + endif c----------------------------------------------------------------------- c print interpolated values. c----------------------------------------------------------------------- - DO ix=0,spl%mx-1 + do ix=0,spl%mx-1 dx=(spl%xs(ix+1)-spl%xs(ix))/4 - DO j=0,3 + do j=0,3 x=spl%xs(ix)+j*dx xlog=LOG10(ABS(x-xend)) - CALL cspline_eval(spl,x,0) - IF(out)WRITE(iua,format2)ix,x,(spl%f(iqty), + call cspline_eval(spl,x,0) + if(out)write(iua,format2)ix,x,(spl%f(iqty), $ iqty=offset,spl%nqty,stride) - IF(bin)THEN + if(bin)then WHERE(spl%f(offset:spl%nqty:stride) /= 0) flog=LOG(spl%f(offset:spl%nqty:stride)) - ELSEWHERE + elseWHERE flog=epsilon - ENDWHERE - WRITE(iub)REAL(x,4),REAL(xlog,4), - $ (REAL(DREAL(flog(iqty))/alog10,4), - $ REAL(AIMAG(flog(iqty))*rtod,4), + endWHERE + write(iub)real(x,4),real(xlog,4), + $ (real(Dreal(flog(iqty))/alog10,4), + $ real(AIMAG(flog(iqty))*rtod,4), $ iqty=1,SIZE(flog)) - ENDIF - ENDDO - IF(out)WRITE(iua,'(1x)') - ENDDO + endif + enddo + if(out)write(iua,'(1x)') + enddo c----------------------------------------------------------------------- c print final interpolated values. c----------------------------------------------------------------------- x=spl%xs(spl%mx) xlog=LOG10(ABS(x-xend)) - CALL cspline_eval(spl,x,0) - IF(out)THEN - WRITE(iua,format2)ix,x,(spl%f(iqty), + call cspline_eval(spl,x,0) + if(out)then + write(iua,format2)ix,x,(spl%f(iqty), $ iqty=offset,spl%nqty,stride) - WRITE(iua,format1)spl%title(0),(spl%title(iqty), + write(iua,format1)spl%title(0),(spl%title(iqty), $ spl%title(iqty),iqty=offset,spl%nqty,stride) - ENDIF - IF(bin)THEN + endif + if(bin)then WHERE(spl%f(offset:spl%nqty:stride) /= 0) flog=LOG(spl%f(offset:spl%nqty:stride)) - ELSEWHERE + elseWHERE flog=epsilon - ENDWHERE - WRITE(iub)REAL(x,4),REAL(xlog,4), - $ (REAL(DREAL(flog(iqty))/alog10,4), - $ REAL(AIMAG(flog(iqty))*rtod,4), + endWHERE + write(iub)real(x,4),real(xlog,4), + $ (real(Dreal(flog(iqty))/alog10,4), + $ real(AIMAG(flog(iqty))*rtod,4), $ iqty=1,SIZE(flog)) - WRITE(iub) - ENDIF - ENDIF - ENDDO + write(iub) + endif + endif + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_write_log + return + end subroutine cspline_write_log c----------------------------------------------------------------------- c subprogram 12. cspline_int. c integrates complex cubic splines. @@ -1051,54 +1060,54 @@ END SUBROUTINE cspline_write_log c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_int(spl) + subroutine cspline_int(spl) - TYPE(cspline_type), INTENT(INOUT) :: spl + type(cspline_type), intent(inout) :: spl - INTEGER :: ix,iqty,ig - REAL(r8), DIMENSION(spl%mx) :: dx - COMPLEX(r8), DIMENSION(spl%mx,spl%nqty) :: term,f,f1,f2,f3 + integer :: ix,iqty,ig + real(r8), dimension(spl%mx) :: dx + complex(r8), dimension(spl%mx,spl%nqty) :: term,f,f1,f2,f3 - INTEGER, PARAMETER :: mg=4 - REAL(r8), DIMENSION(mg) :: xg=(1+(/-0.861136311594053_r8, + integer, PARAMETER :: mg=4 + real(r8), dimension(mg) :: xg=(1+(/-0.861136311594053_r8, $ -0.339981043584856_r8,0.339981043584856_r8, $ 0.861136311594053_r8/))/2 - REAL(r8), DIMENSION(mg) :: wg=(/0.347854845137454_r8, + real(r8), dimension(mg) :: wg=(/0.347854845137454_r8, $ 0.652145154862546_r8,0.652145154862546_r8, $ 0.347854845137454_r8/)/2 c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- - IF(.NOT.ASSOCIATED(spl%fsi))ALLOCATE(spl%fsi(0:spl%mx,spl%nqty)) + if(.not.ASSOCIATED(spl%fsi))allocate(spl%fsi(0:spl%mx,spl%nqty)) dx=spl%xs(1:spl%mx)-spl%xs(0:spl%mx-1) term=0 c----------------------------------------------------------------------- c compute integrals over intervals. c----------------------------------------------------------------------- - DO iqty=1,spl%nqty - IF(spl%xpower(1,iqty) == 0 .AND. spl%xpower(2,iqty) == 0)THEN + do iqty=1,spl%nqty + if(spl%xpower(1,iqty) == 0 .and. spl%xpower(2,iqty) == 0)then term(:,iqty)=dx/12 $ *(6*(spl%fs(0:spl%mx-1,iqty)+spl%fs(1:spl%mx,iqty)) $ +dx*(spl%fs1(0:spl%mx-1,iqty)-spl%fs1(1:spl%mx,iqty))) - ELSE - DO ig=1,mg - CALL cspline_all_eval(spl,xg(ig),f,f1,f2,f3,0) + else + do ig=1,mg + call cspline_all_eval(spl,xg(ig),f,f1,f2,f3,0) term(:,iqty)=term(:,iqty)+dx*wg(ig)*f(:,iqty) - ENDDO - ENDIF - ENDDO + enddo + endif + enddo c----------------------------------------------------------------------- c accumulate over intervals. c----------------------------------------------------------------------- spl%fsi(0,:)=0 - DO ix=1,spl%mx + do ix=1,spl%mx spl%fsi(ix,:)=spl%fsi(ix-1,:)+term(ix,:) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_int + return + end subroutine cspline_int c----------------------------------------------------------------------- c subprogram 13. cspline_triluf. c performs tridiagonal LU factorization. @@ -1106,40 +1115,40 @@ END SUBROUTINE cspline_int c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_triluf(a) + subroutine cspline_triluf(a) - REAL(r8), DIMENSION(-1:,:), INTENT(INOUT) :: a + real(r8), dimension(-1:,:), intent(inout) :: a - INTEGER :: i,j,k,jmin,jmax,n + integer :: i,j,k,jmin,jmax,n c----------------------------------------------------------------------- c begin loop over rows and define limits. c----------------------------------------------------------------------- n=SIZE(a,2) - DO i=1,n + do i=1,n jmin=MAX(1-i,-1) - jmax=MIN(n-i,1) + jmax=Min(n-i,1) c----------------------------------------------------------------------- c compute lower elements. c----------------------------------------------------------------------- - DO j=jmin,-1 - DO k=MAX(jmin,j-1),j-1 + do j=jmin,-1 + do k=MAX(jmin,j-1),j-1 a(j,i)=a(j,i)-a(k,i)*a(j-k,i+k) - ENDDO + enddo a(j,i)=a(j,i)*a(0,i+j) - ENDDO + enddo c----------------------------------------------------------------------- c compute diagonal element c----------------------------------------------------------------------- - DO k=MAX(jmin,-1),-1 + do k=MAX(jmin,-1),-1 a(0,i)=a(0,i)-a(k,i)*a(-k,i+k) - ENDDO + enddo a(0,i)=1/a(0,i) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_triluf + return + end subroutine cspline_triluf c----------------------------------------------------------------------- c subprogram 14. cspline_trilus. c performs tridiagonal LU solution. @@ -1147,35 +1156,35 @@ END SUBROUTINE cspline_triluf c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_trilus(a,x) + subroutine cspline_trilus(a,x) - REAL(r8), DIMENSION(-1:,:), INTENT(IN) :: a - COMPLEX(r8), DIMENSION(:,:), INTENT(INOUT) :: x + real(r8), dimension(-1:,:), intent(in) :: a + complex(r8), dimension(:,:), intent(inout) :: x - INTEGER :: i,j,n + integer :: i,j,n c----------------------------------------------------------------------- c down sweep. c----------------------------------------------------------------------- n=SIZE(a,2) - DO i=1,n - DO j=MAX(1-i,-1),-1 + do i=1,n + do j=MAX(1-i,-1),-1 x(i,:)=x(i,:)-a(j,i)*x(i+j,:) - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c up sweep. c----------------------------------------------------------------------- - DO i=n,1,-1 - DO j=1,MIN(n-i,1) + do i=n,1,-1 + do j=1,Min(n-i,1) x(i,:)=x(i,:)-a(j,i)*x(i+j,:) - ENDDO + enddo x(i,:)=x(i,:)*a(0,i) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_trilus + return + end subroutine cspline_trilus c----------------------------------------------------------------------- c subprogram 15. cspline_sherman. c uses Sherman-Morrison formula to factor periodic matrix. @@ -1183,27 +1192,28 @@ END SUBROUTINE cspline_trilus c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_sherman(a) + subroutine cspline_sherman(a) - REAL(r8), DIMENSION(-1:,:), INTENT(INOUT) :: a + real(r8), dimension(-1:,:), intent(inout) :: a - INTEGER :: j,n - COMPLEX(r8), DIMENSION(SIZE(a,2),1) :: u + integer :: j,n + complex(r8), dimension(SIZE(a,2),1) :: u c----------------------------------------------------------------------- c prepare matrices. c----------------------------------------------------------------------- n=SIZE(a,2) a(0,1)=a(0,1)-a(-1,1) a(0,n)=a(0,n)-a(-1,1) - u=RESHAPE((/one,(zero,j=2,n-1),one/),SHAPE(u)) - CALL cspline_triluf(a) - CALL cspline_trilus(a,u) - a(-1,1)=REAL(a(-1,1)/(1+a(-1,1)*(u(1,1)+u(n,1))),r8) + u=RESHAPE((/(1.0_r8, 0.0_r8),((0.0_r8, 0.0_r8),j=2,n-1) + $ ,(1.0_r8, 0.0_r8)/),SHAPE(u)) + call cspline_triluf(a) + call cspline_trilus(a,u) + a(-1,1)=real(a(-1,1)/(1+a(-1,1)*(u(1,1)+u(n,1))),r8) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_sherman + return + end subroutine cspline_sherman c----------------------------------------------------------------------- c subprogram 16. cspline_morrison. c uses Sherman-Morrison formula to solve periodic matrix. @@ -1211,27 +1221,27 @@ END SUBROUTINE cspline_sherman c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_morrison(a,x) + subroutine cspline_morrison(a,x) - REAL(r8), DIMENSION(-1:,:), INTENT(IN) :: a - COMPLEX(r8), DIMENSION(:,:), INTENT(INOUT) :: x + real(r8), dimension(-1:,:), intent(in) :: a + complex(r8), dimension(:,:), intent(inout) :: x - INTEGER :: n - COMPLEX(r8), DIMENSION(SIZE(x,1),SIZE(x,2)) :: y + integer :: n + complex(r8), dimension(SIZE(x,1),SIZE(x,2)) :: y c----------------------------------------------------------------------- c solve for x. c----------------------------------------------------------------------- n=SIZE(a,2) y=x - CALL cspline_trilus(a,y) + call cspline_trilus(a,y) x(1,:)=x(1,:)-a(-1,1)*(y(1,:)+y(n,:)) x(n,:)=x(n,:)-a(-1,1)*(y(1,:)+y(n,:)) - CALL cspline_trilus(a,x) + call cspline_trilus(a,x) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_morrison + return + end subroutine cspline_morrison c----------------------------------------------------------------------- c subprogram 17. cspline_thomas. c thomas method to solve tri-diagnol (complex) matrix @@ -1239,13 +1249,13 @@ END SUBROUTINE cspline_morrison c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_thomas(l,d,u,b,n,m) + subroutine cspline_thomas(l,d,u,b,n,m) - INTEGER, INTENT(IN):: n,m - REAL(r8), DIMENSION(n), INTENT(INOUT):: d - REAL(r8), DIMENSION(n-1), INTENT(INOUT):: l,u - COMPLEX(r8), DIMENSION(n,m), INTENT(INOUT):: b - INTEGER:: i + integer, intent(in):: n,m + real(r8), dimension(n), intent(inout):: d + real(r8), dimension(n-1), intent(inout):: l,u + complex(r8), dimension(n,m), intent(inout):: b + integer:: i c----------------------------------------------------------------------- c calculate tri-diagno matrix c l=[A(1,2),A(2,3),...,A(n-1,n)]; @@ -1253,21 +1263,21 @@ SUBROUTINE cspline_thomas(l,d,u,b,n,m) c u=[A(2,1),A(3,2),...,A(n,n-1)]; c b is n row m column matrix c----------------------------------------------------------------------- - DO i = 2, n + do i = 2, n l(i-1) = l(i-1)/d(i-1) d(i) = d(i) - u(i-1) * l(i-1) b(i,:) = b(i,:) - b(i-1,:) * l(i-1) - ENDDO + enddo b(n,:) = b(n,:) / d(n); - DO i = n-1, 1, -1 + do i = n-1, 1, -1 b(i,:) = (b(i,:) - u(i) * b(i+1,:)) / d(i); - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_thomas + return + end subroutine cspline_thomas c----------------------------------------------------------------------- c subprogram 18. cspline_get_yp. c get yi' with four points for spline boundary condtion. @@ -1275,17 +1285,17 @@ END SUBROUTINE cspline_thomas c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_get_yp(x,y,xi,yip,nqty) - INTEGER, INTENT(IN) :: nqty - INTEGER :: n,nrhs,lda,info,ldb,i - INTEGER, DIMENSION(4) :: ipiv - REAL(r8) :: dx - REAL(r8), INTENT(IN) :: xi - COMPLEX(r8), DIMENSION(nqty),INTENT(OUT) :: yip - REAL(r8), DIMENSION(4), INTENT(IN) :: x - COMPLEX(r8), DIMENSION(4,nqty), INTENT(IN) :: y - COMPLEX(r8), DIMENSION(4,nqty) :: b - COMPLEX(r8), DIMENSION(4,4) :: a + subroutine cspline_get_yp(x,y,xi,yip,nqty) + integer, intent(in) :: nqty + integer :: n,nrhs,lda,info,ldb,i + integer, dimension(4) :: ipiv + real(r8) :: dx + real(r8), intent(in) :: xi + complex(r8), dimension(nqty),intent(out) :: yip + real(r8), dimension(4), intent(in) :: x + complex(r8), dimension(4,nqty), intent(in) :: y + complex(r8), dimension(4,nqty) :: b + complex(r8), dimension(4,4) :: a n=4 nrhs=nqty lda=N @@ -1295,22 +1305,22 @@ SUBROUTINE cspline_get_yp(x,y,xi,yip,nqty) a(1,4)=1 b(1,:)=y(1,:) - DO i=2,n + do i=2,n dx=x(i)-x(1) a(i,1)=dx*dx*dx a(i,2)=dx*dx a(i,3)=dx a(i,4)=1 b(i,:)=y(i,:) - ENDDO - CALL zgesv(n,nrhs,a,lda,ipiv,b,ldb,info) + enddo + call zgesv(n,nrhs,a,lda,ipiv,b,ldb,info) dx=xi-x(1) yip=(3*b(1,:)*dx+2*b(2,:))*dx+b(3,:) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_get_yp + return + end subroutine cspline_get_yp c----------------------------------------------------------------------- c subprogram 14. cspline_copy. c copies one cspline_type to another. @@ -1318,15 +1328,15 @@ END SUBROUTINE cspline_get_yp c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE cspline_copy(spl1,spl2) + subroutine cspline_copy(spl1,spl2) - TYPE(cspline_type), INTENT(IN) :: spl1 - TYPE(cspline_type), INTENT(INOUT) :: spl2 + type(cspline_type), intent(in) :: spl1 + type(cspline_type), intent(inout) :: spl2 c----------------------------------------------------------------------- c computations. c----------------------------------------------------------------------- - IF(ASSOCIATED(spl2%xs))CALL cspline_dealloc(spl2) - CALL cspline_alloc(spl2,spl1%mx,spl1%nqty) + if(ASSOCIATED(spl2%xs))call cspline_dealloc(spl2) + call cspline_alloc(spl2,spl1%mx,spl1%nqty) spl2%xs=spl1%xs spl2%fs=spl1%fs spl2%fs1=spl1%fs1 @@ -1338,6 +1348,6 @@ SUBROUTINE cspline_copy(spl1,spl2) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE cspline_copy - END MODULE cspline_mod + return + end subroutine cspline_copy + end module cspline_mod diff --git a/src/Splines/fortran/defs.f b/src/Splines/fortran/defs.f index 968acc5f2..a64b3a9c9 100644 --- a/src/Splines/fortran/defs.f +++ b/src/Splines/fortran/defs.f @@ -28,6 +28,8 @@ module defs_mod real(r8), parameter :: six = 6.0_r8 integer, parameter :: bin_unit = 10 integer, parameter :: out_unit = 11 + + complex(r8), PARAMETER :: ifac=(0,1) contains c----------------------------------------------------------------------- @@ -37,78 +39,78 @@ module defs_mod c----------------------------------------------------------------------- c delcarations. c----------------------------------------------------------------------- - SUBROUTINE timer(mode,unit,op_cpuseconds,op_wallseconds) + subroutine timer(mode,unit,op_cpuseconds,op_wallseconds) - INTEGER, INTENT(IN) :: mode,unit - REAL(r4), INTENT(OUT), OPTIONAL :: op_cpuseconds,op_wallseconds + integer, intent(in) :: mode,unit + real(r4), intent(out), optional :: op_cpuseconds,op_wallseconds - INTEGER(i8), SAVE :: count_rate, wall_start - REAL(r4), SAVE :: start - REAL(r4) :: seconds - INTEGER(i8) :: hrs,mins,secs, wall_seconds, count_max + integer(i8), save :: count_rate, wall_start + real(r4), save :: start + real(r4) :: seconds + integer(i8) :: hrs,mins,secs, wall_seconds, count_max c----------------------------------------------------------------------- c format statements. c----------------------------------------------------------------------- - 10 FORMAT(1x,a,1p,e10.3,a) + 10 format(1x,a,1p,e10.3,a) c----------------------------------------------------------------------- c computations. c----------------------------------------------------------------------- - IF(mode == 0)THEN - CALL CPU_TIME(start) - CALL SYSTEM_CLOCK(wall_start) - ELSE + if(mode == 0)then + call CPU_TIME(start) + call SYSTEM_CLOCK(wall_start) + else ! report cpu time - CALL CPU_time(seconds) + call CPU_time(seconds) seconds=seconds-start secs = int(seconds) hrs = secs/(60*60) mins = (secs-hrs*60*60)/60 secs = secs-hrs*60*60-mins*60 - IF(PRESENT(op_cpuseconds))THEN + if(present(op_cpuseconds))then ! simply provide the time to the caller op_cpuseconds = seconds - ELSE + else ! write the time to terminal and file - IF(hrs>0)THEN - WRITE(*,'(1x,a,i3,a,i2,a,i2,a)') "Total cpu time = ", + if(hrs>0)then + write(*,'(1x,a,i3,a,i2,a,i2,a)') "Total cpu time = ", $ hrs," hours, ",mins," minutes, ",secs," seconds" - ELSEIF(mins>0)THEN - WRITE(*,'(1x,a,i2,a,i2,a)') "Total cpu time = ", + elseif(mins>0)then + write(*,'(1x,a,i2,a,i2,a)') "Total cpu time = ", $ mins," minutes, ",secs," seconds" - ELSEIF(secs>0)THEN - WRITE(*,'(1x,a,i2,a)') "Total cpu time = ",secs, + elseif(secs>0)then + write(*,'(1x,a,i2,a)') "Total cpu time = ",secs, $ " seconds" - ENDIF - WRITE(unit,10) "Total cpu time = ",seconds," seconds" - ENDIF + endif + write(unit,10) "Total cpu time = ",seconds," seconds" + endif ! report wall time - CALL SYSTEM_CLOCK(wall_seconds, count_rate, count_max) - seconds=REAL(wall_seconds-wall_start, r4)/REAL(count_rate, r4) + call SYSTEM_CLOCK(wall_seconds, count_rate, count_max) + seconds=real(wall_seconds-wall_start, r4)/real(count_rate, r4) secs = int(seconds) hrs = secs/(60*60) mins = (secs-hrs*60*60)/60 secs = secs-hrs*60*60-mins*60 - IF(PRESENT(op_wallseconds))THEN + if(present(op_wallseconds))then op_wallseconds = seconds - ELSE - IF(hrs>0)THEN - WRITE(*,'(1x,a,i3,a,i2,a,i2,a)') "Total wall time = ", + else + if(hrs>0)then + write(*,'(1x,a,i3,a,i2,a,i2,a)') "Total wall time = ", $ hrs," hours, ",mins," minutes, ",secs," seconds" - ELSEIF(mins>0)THEN - WRITE(*,'(1x,a,i2,a,i2,a)') "Total wall time = ", + elseif(mins>0)then + write(*,'(1x,a,i2,a,i2,a)') "Total wall time = ", $ mins," minutes, ",secs," seconds" - ELSEIF(secs>0)THEN - WRITE(*,'(1x,a,i2,a)') "Total wall time = ",secs, + elseif(secs>0)then + write(*,'(1x,a,i2,a)') "Total wall time = ",secs, $ " seconds" - ENDIF - WRITE(unit,10) "Total wall time = ",seconds," seconds" - ENDIF - ENDIF + endif + write(unit,10) "Total wall time = ",seconds," seconds" + endif + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE timer + return + end subroutine timer c----------------------------------------------------------------------- c subprogram 2. bin_open. c opens a binary input or output file. @@ -116,32 +118,32 @@ END SUBROUTINE timer c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bin_open(unit,name,stat,pos,convert_type) + subroutine bin_open(unit,name,stat,pos,convert_type) - CHARACTER(*), INTENT(IN) :: name,stat,pos,convert_type - INTEGER, INTENT(IN) :: unit + character(*), intent(in) :: name,stat,pos,convert_type + integer, intent(in) :: unit c----------------------------------------------------------------------- c open file. c----------------------------------------------------------------------- - SELECT CASE(convert_type) - CASE("none") - OPEN(UNIT=unit,FILE=name,STATUS=stat,POSITION=pos, - $ FORM="UNFORMATTED") - CASE("big") - OPEN(UNIT=unit,FILE=name,STATUS=stat,POSITION=pos, - $ FORM="UNFORMATTED",CONVERT="BIG_ENDIAN") - CASE("little") - OPEN(UNIT=unit,FILE=name,STATUS=stat,POSITION=pos, - $ FORM="UNFORMATTED",CONVERT="LITTLE_ENDIAN") - CASE DEFAULT - CALL program_stop + select case(convert_type) + case("none") + open(UNIT=unit,FILE=name,STATUS=stat,POSITION=pos, + $ FORM="UNformatTED") + case("big") + open(UNIT=unit,FILE=name,STATUS=stat,POSITION=pos, + $ FORM="UNformatTED",CONVERT="BIG_endIAN") + case("little") + open(UNIT=unit,FILE=name,STATUS=stat,POSITION=pos, + $ FORM="UNformatTED",CONVERT="LITTLE_endIAN") + case default + call program_stop $ ("Cannot recognize convert_type = "//TRIM(convert_type)) - END SELECT + end select c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bin_open + return + end subroutine bin_open c----------------------------------------------------------------------- c subprogram 3. bin_close. c close a binary input or output file. @@ -149,18 +151,18 @@ END SUBROUTINE bin_open c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bin_close(unit) + subroutine bin_close(unit) - INTEGER, INTENT(IN) :: unit + integer, intent(in) :: unit c----------------------------------------------------------------------- c work. c----------------------------------------------------------------------- - CLOSE(UNIT=unit) + close(UNIT=unit) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bin_close + return + end subroutine bin_close c----------------------------------------------------------------------- c subprogram 4. ascii_open. c opens a ascii input or output file. @@ -168,19 +170,19 @@ END SUBROUTINE bin_close c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE ascii_open(unit,name,stat) + subroutine ascii_open(unit,name,stat) - CHARACTER(*), INTENT(IN) :: name,stat - INTEGER, INTENT(IN) :: unit + character(*), intent(in) :: name,stat + integer, intent(in) :: unit c----------------------------------------------------------------------- c open file. c----------------------------------------------------------------------- - OPEN(UNIT=unit,FILE=name,STATUS=stat) + open(UNIT=unit,FILE=name,STATUS=stat) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE ascii_open + return + end subroutine ascii_open c----------------------------------------------------------------------- c subprogram 5. ascii_close. c close a ascii input or output file. @@ -188,18 +190,18 @@ END SUBROUTINE ascii_open c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE ascii_close(unit) + subroutine ascii_close(unit) - INTEGER, INTENT(IN) :: unit + integer, intent(in) :: unit c----------------------------------------------------------------------- c work. c----------------------------------------------------------------------- - CLOSE(UNIT=unit) + close(UNIT=unit) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE ascii_close + return + end subroutine ascii_close c----------------------------------------------------------------------- c subprogram 6. program_stop. c terminates program with message, calls timer, closes output file. @@ -207,19 +209,19 @@ END SUBROUTINE ascii_close c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE program_stop(message) + subroutine program_stop(message) - CHARACTER(*), INTENT(IN) :: message + character(*), intent(in) :: message c----------------------------------------------------------------------- c write completion message. c----------------------------------------------------------------------- - CALL timer(1,out_unit) - CALL ascii_close(out_unit) - WRITE(*,'(1x,2a)') 'PROGRAM STOP => ', TRIM(message) + call timer(1,out_unit) + call ascii_close(out_unit) + write(*,'(1x,2a)') 'PROGRAM stop => ', TRIM(message) c----------------------------------------------------------------------- c write completion message. c----------------------------------------------------------------------- - STOP - END SUBROUTINE program_stop + stop + end subroutine program_stop end module defs_mod \ No newline at end of file diff --git a/src/Splines/fortran/fft.f b/src/Splines/fortran/fft.f new file mode 100644 index 000000000..f22464059 --- /dev/null +++ b/src/Splines/fortran/fft.f @@ -0,0 +1,165 @@ +c----------------------------------------------------------------------- +c file fft.f. +c fast fourier transform routines. +c Numerical Recipes in Fortran, Second Edition, p. 501, four1. +c Fortran 90 complex arithmetic version by Alan H. Glasser. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c code organization. +c----------------------------------------------------------------------- +c 0. fft_mod. +c 1. fft_run. +c 2. fft_write. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c subprogram 0. fft_mod. +c module declarations. +c----------------------------------------------------------------------- + module fft_mod + use defs_mod + implicit none + + contains +c----------------------------------------------------------------------- +c subprogram 1. fft_run. +c performs fast fourier transform. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + FUNCTION fft_run(f,sign) RESULT(g) + + complex(r8), dimension(:,:), intent(in) :: f + complex(r8), dimension(SIZE(f,1),SIZE(f,2)) :: g + integer, intent(in) :: sign + + integer :: i,istep,j,m,mmax,n + complex(r8) :: w,wp + complex(r8), dimension(SIZE(f,2)) :: temp +c----------------------------------------------------------------------- +c preliminary computations. +c----------------------------------------------------------------------- + n=SIZE(f,1) + select case(sign) + case(-1) + g=f/n + case(1) + g=f + case default + write(*,'(a,i2,a)')"sign = ",sign," is illegal, must be +/- 1" + stop + end select +c----------------------------------------------------------------------- +c bit reversal. +c----------------------------------------------------------------------- + j=1 + do i=1,n + if(j > i)then + temp(:)=g(j,:) + g(j,:)=g(i,:) + g(i,:)=temp + endif + m=n/2 + do + if(m < 1 .OR. j <= m)EXIT + j=j-m + m=m/2 + enddo + j=j+m + enddo +c----------------------------------------------------------------------- +c Danielson-Lanczos loop. +c----------------------------------------------------------------------- + mmax=1 + do + if(n <= mmax)EXIT + istep=2*mmax + wp=EXP(pi*ifac/(sign*mmax)) + w=1 + do m=1,mmax + do i=m,n,istep + j=i+mmax + temp=w*g(j,:) + g(j,:)=g(i,:)-temp + g(i,:)=g(i,:)+temp + enddo + w=w*wp + enddo + mmax=istep + enddo +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end FUNCTION fft_run +c----------------------------------------------------------------------- +c subprogram 2. fft_write. +c ascii and binary output of fast fourier transform. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fft_write(t,f,g,h,out,bin,out_unit,bin_unit) + + real(r8), dimension(:), intent(in) :: t + complex(r8), dimension(:,:), intent(in) :: f,g,h + logical :: out,bin + integer :: out_unit,bin_unit + + integer :: i,k,n + real(r8) :: dt,tperiod,dfreq,freqmax + + integer, dimension(SIZE(t)) :: m + real(r8), dimension(SIZE(t)) :: freq + complex(r8), dimension(SIZE(g,1),SIZE(g,2)) :: gg +c----------------------------------------------------------------------- +c format statements. +c----------------------------------------------------------------------- + 10 format(/6x,"n",7x,"dt",6x,"tperiod",5x,"dfreq",5x,"freqmax" + $ //i8,1p,4e11.3/) + 20 format(/7x,"i",6x,"m",7x,"t",9x,"freq",7x,"re f",7x,"im f",7x, + $ "re g",7x,"im g",7x,"re h",7x,"im h"/) + 30 format(2i8,1p,8e11.3) +c----------------------------------------------------------------------- +c compute scalars. +c----------------------------------------------------------------------- + n=SIZE(t) + dt=t(2)-t(1) + tperiod=n*dt + dfreq=1/(n*dt) + freqmax=dfreq*n/2 +c----------------------------------------------------------------------- +c compute auxiliary arrays. +c----------------------------------------------------------------------- + m(1:n/2-1)=(/(i,i=1-n/2,-1)/) + m(n/2:n)=(/(i,i=0,n/2)/) + freq=m*dfreq + gg(1:n/2-1,:)=g(n/2+2:n,:) + gg(n/2:n,:)=g(1:n/2+1,:) +c----------------------------------------------------------------------- +c diagnose fft. +c----------------------------------------------------------------------- + write(out_unit,10)n,dt,tperiod,dfreq,freqmax + do k=1,SIZE(f,2) + if(out)then + write(out_unit,'(/a,i3)')"k = ",k + write(out_unit,20) + endif + do i=1,n + if(out)write(out_unit,30)i-1,m(i),t(i),freq(i), + $ f(i,k),gg(i,k),h(i,k) + if(bin)write(bin_unit) + $ real(i-1,4),real(m(i),4),real(t(i),4),real(freq(i),4), + $ real(real(f(i,k)),4),real(AIMAG(f(i,k)),4), + $ real(real(gg(i,k)),4),real(AIMAG(gg(i,k)),4), + $ real(real(h(i,k)),4),real(AIMAG(h(i,k)),4) + enddo + if(out)write(out_unit,20) + if(bin)write(bin_unit) + enddo +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fft_write + end module fft_mod \ No newline at end of file diff --git a/src/Splines/fortran/fspline.f b/src/Splines/fortran/fspline.f new file mode 100644 index 000000000..6dd78865a --- /dev/null +++ b/src/Splines/fortran/fspline.f @@ -0,0 +1,876 @@ +c----------------------------------------------------------------------- +c file fspline.f. +c fits functions to cubic spline in x and Fourier series in y. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c code organization. +c----------------------------------------------------------------------- +c 0. fspline_mod. +c 1. fspline_alloc. +c 2. fspline_dealloc. +c 3. fspline_fit_1. +c 4. fspline_fit_2. +c 5. fspline_eval. +c 6. fspline_eval_external +c 7. fspline_all_eval. +c 8. fspline_write_xy. +c 9. fspline_write_yx. +c 10. fspline_copy. +c----------------------------------------------------------------------- +c subprogram 0. fspline_type definition. +c defines fspline_type. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + module fspline_mod + use defs_mod + use spline_mod + use cspline_mod + use fft_mod + implicit none + + type :: fspline_type + integer :: mx,my,mband,nqty + real(r8), dimension(:), POinTER :: xs,ys + real(r8), dimension(:,:,:), POinTER :: fs + type(cspline_type) :: cs + real(r8), dimension(:), POinTER :: f,fx,fy,fxx,fxy,fyy + character(6) :: xtitle,ytitle + character(6), dimension(:), POinTER :: title + character(6) :: name + end type fspline_type + + contains +c----------------------------------------------------------------------- +c subprogram 1. fspline_alloc. +c allocates space for fspline_type. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_alloc(fst,mx,my,mband,nqty) + + integer, intent(in) :: mx,my,mband,nqty + type(fspline_type), intent(out) :: fst +c----------------------------------------------------------------------- +c allocate space. +c----------------------------------------------------------------------- + fst%mx=mx + fst%my=my + fst%mband=mband + fst%nqty=nqty + allocate(fst%xs(0:mx)) + allocate(fst%ys(0:my)) + allocate(fst%fs(0:mx,0:my,nqty)) + allocate(fst%title(nqty)) + allocate(fst%f(nqty)) + allocate(fst%fx(nqty)) + allocate(fst%fy(nqty)) + allocate(fst%fxx(nqty)) + allocate(fst%fxy(nqty)) + allocate(fst%fyy(nqty)) + call cspline_alloc(fst%cs,mx,(mband+1)*nqty) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_alloc +c----------------------------------------------------------------------- +c subprogram 2. fspline_dealloc. +c deallocates space for fspline_type. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_dealloc(fst) + + type(fspline_type), intent(inout) :: fst +c----------------------------------------------------------------------- +c allocate space. +c----------------------------------------------------------------------- + deallocate(fst%xs) + deallocate(fst%ys) + deallocate(fst%fs) + deallocate(fst%title) + deallocate(fst%f) + deallocate(fst%fx) + deallocate(fst%fy) + deallocate(fst%fxx) + deallocate(fst%fxy) + deallocate(fst%fyy) + call cspline_dealloc(fst%cs) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_dealloc +c----------------------------------------------------------------------- +c subprogram 3. fspline_fit_1. +c fits functions to fsplines by integrating periodic splines. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_fit_1(fst,endmode,fit_flag) + + type(fspline_type), intent(inout) :: fst + integer, intent(in) :: endmode + logical, intent(in) :: fit_flag + + integer :: m,ix,iq,mx,my,mband,nqty,j + real(r8), PARAMETER :: eps=1e-3 + real(r8), allocatable, dimension(:) :: delta,d4fac,delta4 + real(r8), allocatable, dimension(:,:,:) :: fs,fsy + complex(r8), allocatable, dimension(:) :: expfac0,expfac + complex(r8), allocatable, dimension(:) :: dexpfac0,dexpfac + complex(r8), allocatable, dimension(:) :: alpha1,alpha2, + $ beta1,beta2 + complex(r8), allocatable, dimension(:,:,:) :: coef + type(spline_type) :: spl +c----------------------------------------------------------------------- +c allocate. +c----------------------------------------------------------------------- + allocate (delta(fst%my),d4fac(fst%my),delta4(fst%my)) + allocate (fs(0:fst%mx,0:fst%my,fst%nqty), + $ fsy(0:fst%mx,0:fst%my,fst%nqty)) + allocate (expfac0(0:fst%my),expfac(0:fst%my)) + allocate (dexpfac0(fst%my),dexpfac(fst%my)) + allocate (alpha1(fst%my),alpha2(fst%my), + $ beta1(fst%my),beta2(fst%my)) + allocate (coef(0:fst%mx,0:fst%mband,fst%nqty)) +c----------------------------------------------------------------------- +c copy sizes and zero Fourier coefficients. +c----------------------------------------------------------------------- + mx=fst%mx + my=fst%my + mband=fst%mband + nqty=fst%nqty + coef=0 +c----------------------------------------------------------------------- +c prepare principal periodic functions. +c----------------------------------------------------------------------- + delta=fst%ys(1:my)-fst%ys(0:my-1) + delta4=delta**4 + d4fac=1/delta4 + do ix=0,my + expfac0(ix)=EXP(-ifac*fst%ys(ix)) + enddo + dexpfac0=expfac0(0:my-1)/expfac0(1:my) + expfac=1 + dexpfac=1 +c----------------------------------------------------------------------- +c compute y derivatives. +c----------------------------------------------------------------------- + call spline_alloc(spl,my,mx+1) + spl%xs=fst%ys + do iq=1,nqty + spl%fs=TRANSPOSE(fst%fs(:,:,iq)) + call spline_fit(spl,2) + fsy(:,:,iq)=TRANSPOSE(spl%fs1) + enddo + fs=fst%fs + call spline_dealloc(spl) +c----------------------------------------------------------------------- +c compute alpha's and beta's. +c----------------------------------------------------------------------- + do m=0,mband + WHERE(ABS(m*delta) > eps) + alpha1=(dexpfac*(12._r8-ifac*m*delta*(6._r8+(m*delta)**2)) + $ -6._r8*(2._r8+ifac*m*delta))*d4fac/m**4 + beta1=(dexpfac*(6._r8-m*delta*(4*ifac+m*delta)) + $ -2._r8*(3._r8+ifac*m*delta))*d4fac/m**4 + elseWHERE + alpha1=.5_r8+7._r8*ifac*m*delta/20._r8-2._r8* + $ (m*delta)**2/15._r8 + beta1=1._r8/12._r8+ifac*m*delta/20._r8-(m*delta)**2/60._r8 + endWHERE + alpha1=alpha1*delta/twopi + beta1=beta1*delta**2/twopi + alpha2=CONJG(alpha1)*expfac(0:my-1) + beta2=CONJG(beta1)*expfac(0:my-1) + alpha1=alpha1*expfac(1:my) + beta1=beta1*expfac(1:my) +c----------------------------------------------------------------------- +c compute Fourier coefficients. +c----------------------------------------------------------------------- + do iq=1,nqty + do ix=0,mx + coef(ix,m,iq)=coef(ix,m,iq)+SUM( + $ alpha1*fs(ix,0:my-1,iq)+alpha2*fs(ix,1:my,iq) + $ +beta1*fsy(ix,0:my-1,iq)-beta2*fsy(ix,1:my,iq)) + enddo + enddo + +c----------------------------------------------------------------------- +c advance to next Fourier component. +c----------------------------------------------------------------------- + expfac=expfac*expfac0 + dexpfac=dexpfac*dexpfac0 + enddo +c----------------------------------------------------------------------- +c fit Fourier coefficients to cubic splines as functions of x. +c----------------------------------------------------------------------- + fst%cs%xs=fst%xs +c fst%cs%fs=RESHAPE(coef,(/mx+1,(mband+1)*nqty/)) +c following line is replace of RESHAPE. + j = 0 + do iq = 1, nqty + do m = 0, mband + j = j + 1 + fst%cs%fs(:, j) = coef(:, m, iq) + enddo + enddo + if(fit_flag)call cspline_fit(fst%cs,endmode) + fst%cs%name=fst%name + fst%cs%title(0)=" x " + j=0 + do iq=1,nqty + do m=0,mband + j=j+1 + write(fst%cs%title(j),'("cs",i1,"_",i2.2)')iq,m + enddo + enddo +c----------------------------------------------------------------------- +c deallocate. +c----------------------------------------------------------------------- + deallocate (delta,d4fac,delta4) + deallocate (fs,fsy) + deallocate (expfac0,expfac) + deallocate (dexpfac0,dexpfac) + deallocate (alpha1,alpha2,beta1,beta2) + deallocate (coef) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_fit_1 +c----------------------------------------------------------------------- +c subprogram 4. fspline_fit_2. +c fits functions to fsplines using Fast Fourier Transform. +c----------------------------------------------------------------------- + subroutine fspline_fit_2(fst,endmode,fit_flag) + + type(fspline_type), intent(inout) :: fst + integer, intent(in) :: endmode + logical, intent(in) :: fit_flag + + character(64) :: message + integer :: iqty,j,m,mband,mx,my,nqty,p2 + complex(r8), allocatable, dimension(:,:,:) :: f,g + + complex(r8), allocatable, dimension(:,:) :: temp_in, temp_out + integer :: ix, k +c----------------------------------------------------------------------- +c allocate. +c----------------------------------------------------------------------- + allocate (f(0:fst%my-1,0:fst%mx,fst%nqty), + $ g(0:fst%my-1,0:fst%mx,fst%nqty)) +c----------------------------------------------------------------------- +c abort if my is not a power of 2. +c----------------------------------------------------------------------- + p2=1 + my=fst%my + do + my=my/2 + if(my == 0)EXIT + p2=p2*2 + enddo + if(fst%my /= p2)then + write(message,'(a,i3,a)') + $ "fft_fit_2: my = ",fst%my," is not a power of 2" + call program_stop(message) + endif +c----------------------------------------------------------------------- +c abort if 2*mband > my-1. +c----------------------------------------------------------------------- + if(2*fst%mband > fst%my-1)then + write(message,'(a,i3,a,i3)') + $ "fft_fit_2: 2*mband = ",2*fst%mband," > my-1 = ",fst%my-1 + call program_stop(message) + endif +c----------------------------------------------------------------------- +c copy sizes and zero Fourier coefficients. +c----------------------------------------------------------------------- + mx=fst%mx + my=fst%my + mband=fst%mband + nqty=fst%nqty +c----------------------------------------------------------------------- +c set up for Fast Fourier Transform. +c----------------------------------------------------------------------- + + + do iqty=1,nqty + f(:,:,iqty)=TRANSPOSE(fst%fs(:,0:my-1,iqty)) + enddo + +c RESHAPE made unknown ERROR so replaced. +c 323 ~ 345 line ( from allocate (temp_in ...) to deallocate(temp_in, )) +c is replace of +c g=RESHAPE(fft_run(RESHAPE(f,(/my,(mx+1)*nqty/)),-1), +c $ (/my,mx+1,nqty/)) + + allocate (temp_in(my, (mx+1)*nqty)) + k = 0 + do iqty = 1, nqty + do ix = 0, mx + k = k + 1 + temp_in(:, k) = f(:, ix, iqty) + end do + end do + + allocate (temp_out(my, (mx+1)*nqty)) + + temp_out = fft_run(temp_in, -1) + + + k = 0 + do iqty = 1, nqty + do ix = 0, mx + k = k + 1 + g(:, ix, iqty) = temp_out(:, k) + end do + end do + + deallocate(temp_in, temp_out) +c----------------------------------------------------------------------- +c copy Fourier coefficients from g to the cspline structure +c----------------------------------------------------------------------- + j=1 + do iqty=1,nqty + do m=0,mband + fst%cs%fs(:,j)=g(m,:,iqty) + j=j+1 + enddo + enddo +c----------------------------------------------------------------------- +c fit Fourier coefficients to cubic splines as functions of x. +c----------------------------------------------------------------------- + fst%cs%xs=fst%xs + if(fit_flag)call cspline_fit(fst%cs,endmode) + fst%cs%name=fst%name + fst%cs%title(0)=" x " + j=0 + do iqty=1,nqty + do m=0,mband + j=j+1 + write(fst%cs%title(j),'("cs",i1,"_",i2.2)')iqty,m + enddo + enddo +c----------------------------------------------------------------------- +c dellocate. +c----------------------------------------------------------------------- + deallocate (f,g) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_fit_2 +c----------------------------------------------------------------------- +c subprogram 5. fspline_eval. +c evaluates fspline function. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_eval(fst,x,y,mode) + + type(fspline_type), intent(inout) :: fst + real(r8), intent(in) :: x,y + integer, intent(in) :: mode + + integer :: m + complex(r8) :: expfac,expfac0 + complex(r8), dimension(fst%nqty) :: term,termx,termxx + complex(r8), dimension(0:fst%mband,fst%nqty) :: c,cx,cxx +c----------------------------------------------------------------------- +c evaluate cubic splines and m = 0 terms for functions. +c----------------------------------------------------------------------- + call cspline_eval(fst%cs,x,mode) + c=RESHAPE(fst%cs%f,(/fst%mband+1,fst%nqty/)) + fst%f=c(0,:) +c----------------------------------------------------------------------- +c evaluate m = 0 terms for first derivatives. +c----------------------------------------------------------------------- + if(mode > 0)then + cx=RESHAPE(fst%cs%f1,(/fst%mband+1,fst%nqty/)) + fst%fx=cx(0,:) + fst%fy=0 + endif +c----------------------------------------------------------------------- +c evaluate m = 0 terms for second derivatives. +c----------------------------------------------------------------------- + if(mode > 1)then + cxx=RESHAPE(fst%cs%f2,(/fst%mband+1,fst%nqty/)) + fst%fxx=cxx(0,:) + fst%fyy=0 + fst%fxy=0 + endif +c----------------------------------------------------------------------- +c evaluate m > 1 for functions. +c----------------------------------------------------------------------- + expfac0=EXP(ifac*y) + expfac=2 + do m=1,fst%mband + expfac=expfac*expfac0 + term=c(m,:)*expfac + fst%f=fst%f+term + if(mode < 1)cycle +c----------------------------------------------------------------------- +c evaluate m > 1 for first derivatives. +c----------------------------------------------------------------------- + termx=cx(m,:)*expfac + fst%fx=fst%fx+termx + fst%fy=fst%fy+term*ifac*m + if(mode < 2)cycle +c----------------------------------------------------------------------- +c evaluate m > 1 for second derivatives. +c----------------------------------------------------------------------- + termxx=cxx(m,:)*expfac + fst%fxx=fst%fxx+termxx + fst%fxy=fst%fxy+termx*ifac*m + fst%fyy=fst%fyy-term*m*m + enddo +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_eval +c----------------------------------------------------------------------- +c subprogram 7. fspline_eval_external. +c evaluates fspline function (parallel), preserving original logic. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_eval_external(fst, x, y, mode, f_f, + $ f_fx, f_fy, f_fxx, f_fxy, f_fyy) + + type(fspline_type), intent(in) :: fst + real(r8), intent(in) :: x, y + integer, intent(in) :: mode + + integer :: m + complex(r8) :: expfac, expfac0 + complex(r8), dimension(fst%nqty) :: term, termx, termxx + complex(r8), dimension(0:fst%mband, fst%nqty) :: c, cx, cxx + + ! Local arrays + complex(r8), dimension(fst%cs%nqty) :: cs_f, cs_f1, cs_f2 + + ! Output arrays + real(r8), dimension(fst%nqty), intent(out) :: f_f + real(r8), dimension(fst%nqty), intent(out), optional :: f_fx, + $ f_fy + real(r8), dimension(fst%nqty), intent(out), optional :: f_fxx, + $ f_fxy, f_fyy + +c----------------------------------------------------------------------- +c zero out output arrays +c----------------------------------------------------------------------- + f_f = 0.0_r8 + if (present(f_fx)) f_fx = 0.0_r8 + if (present(f_fy)) f_fy = 0.0_r8 + if (present(f_fxx)) f_fxx = 0.0_r8 + if (present(f_fxy)) f_fxy = 0.0_r8 + if (present(f_fyy)) f_fyy = 0.0_r8 + +c----------------------------------------------------------------------- +c evaluate cubic splines +c----------------------------------------------------------------------- + select case(mode) + case (0) + call cspline_eval_external(fst%cs, x, + $ cs_f) + case (1) + call cspline_eval_external(fst%cs, x, + $ cs_f, cs_f1) + case (2) + call cspline_eval_external(fst%cs, x, cs_f, + $ cs_f1, cs_f2) + end select + +c----------------------------------------------------------------------- +c evaluate m = 0 terms for functions. +c----------------------------------------------------------------------- + c = RESHAPE(cs_f, (/fst%mband + 1, fst%nqty/)) + f_f = real(c(0, :)) + +c----------------------------------------------------------------------- +c evaluate m = 0 terms for first derivatives. +c----------------------------------------------------------------------- + if (mode > 0) then + cx = RESHAPE(cs_f1, (/fst%mband + 1, fst%nqty/)) + f_fx = real(cx(0, :)) + f_fy = 0.0_r8 + endif + +c----------------------------------------------------------------------- +c evaluate m = 0 terms for second derivatives. +c----------------------------------------------------------------------- + if (mode > 1) then + cxx = RESHAPE(cs_f2, (/fst%mband + 1, fst%nqty/)) + f_fxx = real(cxx(0, :)) + f_fyy = 0.0_r8 + f_fxy = 0.0_r8 + endif +c----------------------------------------------------------------------- +c evaluate m > 1 for functions +c----------------------------------------------------------------------- + expfac0 = EXP(ifac * y) + expfac = 2.0_r8 + do m = 1, fst%mband + expfac = expfac * expfac0 + term = c(m, :) * expfac + + f_f = f_f + real(term) + if (mode < 1) cycle +c----------------------------------------------------------------------- +c evaluate m > 1 for first derivatives. +c----------------------------------------------------------------------- + termx = cx(m, :) * expfac + f_fx = f_fx + real(termx) + f_fy = f_fy + real(term * ifac * m) + if (mode < 2) cycle +c----------------------------------------------------------------------- +c evaluate m > 1 for second derivatives. +c----------------------------------------------------------------------- + termxx = cxx(m, :) * expfac + f_fxx = f_fxx + real(termxx) + f_fxy = f_fxy + real(termx * ifac * m) + f_fyy = f_fyy - real(term) * m * m + enddo +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_eval_external +c----------------------------------------------------------------------- +c subprogram 6. fspline_all_eval. +c evaluates fsplines in all intervals. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_all_eval(fst,dx,dy,f,fx,fy,fxx,fyy,fxy,mode) + + type(fspline_type), intent(inout) :: fst + real(r8), intent(in) :: dx,dy + real(r8), intent(out), dimension(fst%mx,fst%my,fst%nqty) :: + $ f,fx,fy,fxx,fyy,fxy + integer, intent(in) :: mode + + integer :: m,iy + real(r8), dimension(fst%my) :: y + complex(r8), dimension(fst%my) :: expfac,expfac0 + complex(r8), allocatable, dimension(:,:) :: f0,f1,f2,f3 + complex(r8), allocatable, dimension(:,:,:) :: + $ term,termx,termxx + complex(r8), allocatable, dimension(:,:,:) :: c,cx,cxx +c----------------------------------------------------------------------- +c allocate. +c----------------------------------------------------------------------- + allocate (f0(fst%my,fst%nqty*(fst%mx+1)), + $ f1(fst%my,fst%nqty*(fst%mx+1)), + $ f2(fst%my,fst%nqty*(fst%mx+1)), + $ f3(fst%my,fst%nqty*(fst%mx+1))) + allocate (term(fst%mx,fst%my,fst%nqty), + $ termx(fst%mx,fst%my,fst%nqty), + $ termxx(fst%mx,fst%my,fst%nqty)) + allocate (c(fst%mx,0:fst%mband,fst%nqty), + $ cx(fst%mx,0:fst%mband,fst%nqty), + $ cxx(fst%mx,0:fst%mband,fst%nqty)) +c----------------------------------------------------------------------- +c evaluate cubic splines and m = 0 terms for functions. +c----------------------------------------------------------------------- + call cspline_all_eval(fst%cs,dx,f0,f1,f2,f3,mode) + c=RESHAPE(f0,(/fst%mx,fst%mband+1,fst%nqty/)) + do iy=1,fst%my + f(:,iy,:)=c(:,0,:) + enddo +c----------------------------------------------------------------------- +c evaluate m = 0 terms for first derivatives. +c----------------------------------------------------------------------- + if(mode > 0)then + cx=RESHAPE(f1,(/fst%mx,fst%mband+1,fst%nqty/)) + do iy=1,fst%my + fx(:,iy,:)=cx(:,0,:) + enddo + fy=0 + endif +c----------------------------------------------------------------------- +c evaluate m = 0 terms for second derivatives. +c----------------------------------------------------------------------- + if(mode > 1)then + cxx=RESHAPE(f2,(/fst%mx,fst%mband+1,fst%nqty/)) + do iy=1,fst%my + fxx(:,iy,:)=cxx(:,0,:) + enddo + fxy=0 + fyy=0 + endif +c----------------------------------------------------------------------- +c evaluate m > 0 terms for functions. +c----------------------------------------------------------------------- + y=fst%ys(0:fst%my-1)+dy*(fst%ys(1:fst%my)-fst%ys(0:fst%my-1)) + expfac0=EXP(ifac*y) + expfac=2 + do m=1,fst%mband + expfac=expfac*expfac0 + do iy=1,fst%my + term(:,iy,:)=c(:,m,:)*expfac(iy) + enddo + f=f+term + if(mode < 1)cycle +c----------------------------------------------------------------------- +c evaluate m > 0 terms for first derivatives. +c----------------------------------------------------------------------- + do iy=1,fst%my + termx(:,iy,:)=cx(:,m,:)*expfac(iy) + enddo + fx=fx+termx + fy=fy+term*ifac*m + if(mode < 2)cycle +c----------------------------------------------------------------------- +c evaluate m > 0 terms for second derivatives. +c----------------------------------------------------------------------- + do iy=1,fst%my + termxx(:,iy,:)=cxx(:,m,:)*expfac(iy) + enddo + fxx=fxx+termxx + fxy=fxy+termx*ifac*m + fyy=fyy-term*m*m + enddo +c----------------------------------------------------------------------- +c deallcoate. +c----------------------------------------------------------------------- + deallocate (f0,f1,f2,f3) + deallocate (term,termx,termxx) + deallocate (c,cx,cxx) + +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_all_eval +c----------------------------------------------------------------------- +c subprogram 8. fspline_write_xy. +c produces ascii and binary output for fspline fits. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_write_xy(fst,out,bin,interpolate,filename) + + type(fspline_type), intent(inout) :: fst + logical, intent(in) :: out,bin,interpolate + character(*) :: filename + + integer :: ix,iy,jx,jy,iqty + real(r8) :: x,y,dx,dy + + character(80) :: format2,format1 +c----------------------------------------------------------------------- +c write formats. +c----------------------------------------------------------------------- + 10 format(/1x,'ix = ',i3,', x = ',1p,e11.3) + 20 format(/1x,'ix = ',i3,', jx = ',i1,', x = ',1p,e11.3) + 30 format('(/4x,"iy",6x,"y",4x,',i1,'(6x,"f",i1,3x)/)') + 40 format('(i6,1p,e11.3,',i3.3,'e11.3)') +c----------------------------------------------------------------------- +c open binary output file. +c----------------------------------------------------------------------- + if(.not. (out. OR. bin))return + if(bin)call bin_open(bin_unit,TRIM(filename), + $ "UNKNOWN","REWinD","none") +c----------------------------------------------------------------------- +c write input data. +c----------------------------------------------------------------------- + if(out)then + write(out_unit,'(1x,a)')"input data" + write(format1,30)fst%nqty + write(format2,40)fst%nqty + endif + do iy=0,fst%my + y=fst%ys(iy) + if(out)then + write(out_unit,10)iy,fst%ys(iy) + write(out_unit,format1)(iqty,iqty=1,fst%nqty) + endif + do ix=0,fst%mx + x=fst%xs(ix) + fst%f=fst%fs(ix,iy,:) + if(out)write(out_unit,format2)ix,x,fst%f + if(bin)write(bin_unit)real(x,4),real(fst%f,4) + enddo + if(out)write(out_unit,format1)(iqty,iqty=1,fst%nqty) + if(bin)write(bin_unit) + enddo +c----------------------------------------------------------------------- +c begin loops over y for interpolated data. +c----------------------------------------------------------------------- + if(interpolate)then + if(out)write(out_unit,'(1x,a)')"interpolated data" + do iy=0,fst%my-1 + dy=(fst%ys(iy+1)-fst%ys(iy))/4 + do jy=0,4 + y=fst%ys(iy)+dy*jy + if(out)then + write(out_unit,20)iy,jy,y + write(out_unit,format1)(iqty,iqty=1,fst%nqty) + endif +c----------------------------------------------------------------------- +c begin loops over x for interpolated data. +c----------------------------------------------------------------------- + do ix=0,fst%mx-1 + dx=(fst%xs(ix+1)-fst%xs(ix))/4 + do jx=0,4 + x=fst%xs(ix)+dx*jx + call fspline_eval(fst,x,y,0) + if(out)write(out_unit,format2)ix,x,fst%f + if(bin)write(bin_unit)real(x,4),real(fst%f,4) + enddo + if(out)write(out_unit,'()') + enddo +c----------------------------------------------------------------------- +c complete loops over y. +c----------------------------------------------------------------------- + if(out)write(out_unit,format1)(iqty,iqty=1,fst%nqty) + if(bin)write(bin_unit) + enddo + enddo + endif +c----------------------------------------------------------------------- +c close binary output file. +c----------------------------------------------------------------------- + if(bin)call bin_close(bin_unit) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_write_xy +c----------------------------------------------------------------------- +c subprogram 9. fspline_write_yx. +c produces ascii and binary output for fspline fits. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_write_yx(fst,out,bin,interpolate,filename) + + type(fspline_type), intent(inout) :: fst + logical, intent(in) :: out,bin,interpolate + character(*) :: filename + + integer :: ix,iy,jx,jy,iqty + real(r8) :: x,y,dx,dy + + character(80) :: format2,format1 +c----------------------------------------------------------------------- +c write formats. +c----------------------------------------------------------------------- + 10 format(/1x,'ix = ',i3,', x = ',1p,e11.3) + 20 format(/1x,'ix = ',i3,', jx = ',i1,', x = ',1p,e11.3) + 30 format('(/4x,"iy",6x,"y",4x,',i1,'(6x,"f",i1,3x)/)') + 40 format('(i6,1p,e11.3,',i3.3,'e11.3)') +c----------------------------------------------------------------------- +c open binary output file. +c----------------------------------------------------------------------- + if(.not. (out. OR. bin))return + if(bin)call bin_open(bin_unit,TRIM(filename), + $ "UNKNOWN","REWinD","none") +c----------------------------------------------------------------------- +c write input data. +c----------------------------------------------------------------------- + if(out)then + write(out_unit,'(1x,a)')"input data" + write(format1,30)fst%nqty + write(format2,40)fst%nqty + endif + do ix=0,fst%mx + x=fst%xs(ix) + if(out)then + write(out_unit,10)ix,fst%xs(ix) + write(out_unit,format1)(iqty,iqty=1,fst%nqty) + endif + do iy=0,fst%my + y=fst%ys(iy) + fst%f=fst%fs(ix,iy,:) + if(out)write(out_unit,format2)iy,y,fst%f + if(bin)write(bin_unit)real(y,4),real(fst%f,4) + enddo + if(out)write(out_unit,format1)(iqty,iqty=1,fst%nqty) + if(bin)write(bin_unit) + enddo +c----------------------------------------------------------------------- +c begin loops over x for interpolated data. +c----------------------------------------------------------------------- + if(interpolate)then + if(out)write(out_unit,'(1x,a)')"interpolated data" + do ix=0,fst%mx-1 + dx=(fst%xs(ix+1)-fst%xs(ix))/4 + do jx=0,4 + x=fst%xs(ix)+dx*jx + if(out)then + write(out_unit,20)ix,jx,x + write(out_unit,format1)(iqty,iqty=1,fst%nqty) + endif +c----------------------------------------------------------------------- +c begin loops over y for interpolated data. +c----------------------------------------------------------------------- + do iy=0,fst%my-1 + dy=(fst%ys(iy+1)-fst%ys(iy))/4 + do jy=0,4 + y=fst%ys(iy)+dy*jy + call fspline_eval(fst,x,y,0) + if(out)write(out_unit,format2)iy,y,fst%f + if(bin)write(bin_unit)real(y,4),real(fst%f,4) + enddo + if(out)write(out_unit,'()') + enddo +c----------------------------------------------------------------------- +c complete loops over x. +c----------------------------------------------------------------------- + if(out)write(out_unit,format1)(iqty,iqty=1,fst%nqty) + if(bin)write(bin_unit) + enddo + enddo + endif +c----------------------------------------------------------------------- +c close binary output file. +c----------------------------------------------------------------------- + if(bin)call bin_close(bin_unit) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_write_yx +c----------------------------------------------------------------------- +c subprogram 10. fspline_copy. +c copies one fspline type to another. +c----------------------------------------------------------------------- +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + subroutine fspline_copy(fst1,fst2) + + type(fspline_type), intent(in) :: fst1 + type(fspline_type), intent(inout) :: fst2 +c----------------------------------------------------------------------- +c computations. +c----------------------------------------------------------------------- + if(ASSOCIATED(fst2%xs))call fspline_dealloc(fst2) + call fspline_alloc(fst2,fst1%mx,fst1%my,fst1%mband,fst1%nqty) + call cspline_copy(fst1%cs,fst2%cs) + fst2%xs=fst1%xs + fst2%ys=fst1%ys + fst2%fs=fst1%fs + fst2%name=fst1%name + fst2%title=fst1%title +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_copy + end module fspline_mod \ No newline at end of file diff --git a/src/Splines/fortran/makefile b/src/Splines/fortran/makefile index 6d899c202..e2d1e5c4b 100644 --- a/src/Splines/fortran/makefile +++ b/src/Splines/fortran/makefile @@ -37,4 +37,4 @@ clean: spline.o: defs.o cspline.o: defs.o spline.o bicube.o: defs.o spline.o -spline_c_api.o: defs.o spline.o cspline.o bicube.o +spline_c_api.o: defs.o spline.o cspline.o bicube.o \ No newline at end of file diff --git a/src/Splines/fortran/spline.f b/src/Splines/fortran/spline.f index ea42470e3..405b363e8 100644 --- a/src/Splines/fortran/spline.f +++ b/src/Splines/fortran/spline.f @@ -40,22 +40,22 @@ c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - MODULE spline_mod - USE defs_mod - IMPLICIT NONE - - LOGICAL :: use_classic_splines = .FALSE. - TYPE :: spline_type - INTEGER :: mx,nqty,ix - REAL(r8), DIMENSION(:), ALLOCATABLE :: xs,f,f1,f2,f3 - REAL(r8), DIMENSION(:,:), ALLOCATABLE :: fs,fs1,fsi,xpower - REAL(r8), DIMENSION(2) :: x0 - CHARACTER(6), DIMENSION(:), ALLOCATABLE :: title - CHARACTER(6) :: name - LOGICAL :: periodic=.FALSE., allocated=.FALSE. - END TYPE spline_type - - CONTAINS + module spline_mod + use defs_mod + implicit none + + logical :: use_classic_splines = .false. + type :: spline_type + integer :: mx,nqty,ix + real(r8), dimension(:), allocatable :: xs,f,f1,f2,f3 + real(r8), dimension(:,:), allocatable :: fs,fs1,fsi,xpower + real(r8), dimension(2) :: x0 + character(6), dimension(:), allocatable :: title + character(6) :: name + logical :: periodic=.false., allocated=.false. + end type spline_type + + contains c----------------------------------------------------------------------- c subprogram 1. spline_alloc. c allocates space for spline_type. @@ -63,16 +63,16 @@ MODULE spline_mod c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_alloc(spl,mx,nqty) + subroutine spline_alloc(spl,mx,nqty) - INTEGER, INTENT(IN) :: mx,nqty - TYPE(spline_type), INTENT(INOUT) :: spl - ! IF(spl%allocated) CALL spline_dealloc(spl) + integer, intent(in) :: mx,nqty + type(spline_type), intent(inout) :: spl + ! if(spl%allocated) call spline_dealloc(spl) c----------------------------------------------------------------------- c safety check. c----------------------------------------------------------------------- - IF(spl%allocated) - $ CALL program_stop("spline_alloc: spline already allocated") + if(spl%allocated) + $ call program_stop("spline_alloc: spline already allocated") c----------------------------------------------------------------------- c set scalars. @@ -80,27 +80,27 @@ SUBROUTINE spline_alloc(spl,mx,nqty) spl%mx=mx spl%nqty=nqty spl%ix=0 - spl%periodic=.FALSE. + spl%periodic=.false. c----------------------------------------------------------------------- c allocate space. c----------------------------------------------------------------------- - ALLOCATE(spl%xs(0:mx)) - ALLOCATE(spl%f(nqty)) - ALLOCATE(spl%f1(nqty)) - ALLOCATE(spl%f2(nqty)) - ALLOCATE(spl%f3(nqty)) - ALLOCATE(spl%title(0:nqty)) - ALLOCATE(spl%fs(0:mx,nqty)) - ALLOCATE(spl%fs1(0:mx,nqty)) - ALLOCATE(spl%xpower(2,nqty)) + allocate(spl%xs(0:mx)) + allocate(spl%f(nqty)) + allocate(spl%f1(nqty)) + allocate(spl%f2(nqty)) + allocate(spl%f3(nqty)) + allocate(spl%title(0:nqty)) + allocate(spl%fs(0:mx,nqty)) + allocate(spl%fs1(0:mx,nqty)) + allocate(spl%xpower(2,nqty)) spl%xpower=0 spl%x0=0 - spl%allocated=.TRUE. + spl%allocated=.true. c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_alloc + return + end subroutine spline_alloc c----------------------------------------------------------------------- c subprogram 2. spline_dealloc. c deallocates space for spline_type. @@ -108,33 +108,33 @@ END SUBROUTINE spline_alloc c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_dealloc(spl) + subroutine spline_dealloc(spl) - TYPE(spline_type), INTENT(INOUT) :: spl + type(spline_type), intent(inout) :: spl c----------------------------------------------------------------------- c safety check. c----------------------------------------------------------------------- - IF(.NOT.spl%allocated) - $ CALL program_stop("spline_dealloc: spline not allocated") + if(.not.spl%allocated) + $ call program_stop("spline_dealloc: spline not allocated") c----------------------------------------------------------------------- c deallocate space. c----------------------------------------------------------------------- - DEALLOCATE(spl%xs) - DEALLOCATE(spl%f) - DEALLOCATE(spl%f1) - DEALLOCATE(spl%f2) - DEALLOCATE(spl%f3) - DEALLOCATE(spl%title) - DEALLOCATE(spl%fs) - DEALLOCATE(spl%fs1) - DEALLOCATE(spl%xpower) - IF(ALLOCATED(spl%fsi))DEALLOCATE(spl%fsi) - spl%allocated=.FALSE. + deallocate(spl%xs) + deallocate(spl%f) + deallocate(spl%f1) + deallocate(spl%f2) + deallocate(spl%f3) + deallocate(spl%title) + deallocate(spl%fs) + deallocate(spl%fs1) + deallocate(spl%xpower) + if(allocated(spl%fsi))deallocate(spl%fsi) + spl%allocated=.false. c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_dealloc + return + end subroutine spline_dealloc c----------------------------------------------------------------------- c subprogram 3. spline_fit. c switch between cubic splines. @@ -142,24 +142,24 @@ END SUBROUTINE spline_dealloc c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_fit(spl,endmode) + subroutine spline_fit(spl,endmode) - TYPE(spline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode + type(spline_type), intent(inout) :: spl + integer, intent(in) :: endmode c----------------------------------------------------------------------- c switch between two spline_fit. c----------------------------------------------------------------------- - IF (use_classic_splines .AND. - $ (endmode.EQ."extrap".OR.endmode.EQ."natural"))THEN - CALL spline_fit_classic(spl,endmode) - ELSE - CALL spline_fit_ahg(spl,endmode) - ENDIF + if (use_classic_splines .and. + $ (endmode == 3 .OR. endmode == 1))then ! 3 = Extrapolate, 1 = Natural + call spline_fit_classic(spl,endmode) + else + call spline_fit_ahg(spl,endmode) + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_fit + return + end subroutine spline_fit c----------------------------------------------------------------------- c subprogram 4. spline_fit_ahg. c fits real functions to cubic splines. @@ -167,47 +167,47 @@ END SUBROUTINE spline_fit c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_fit_ahg(spl,endmode) + subroutine spline_fit_ahg(spl,endmode) - TYPE(spline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode + type(spline_type), intent(inout) :: spl + integer, intent(in) :: endmode - INTEGER :: iqty,iside - REAL(r8), DIMENSION(-1:1,0:spl%mx) :: a - REAL(r8), DIMENSION(spl%mx) :: b - REAL(r8), DIMENSION(4) :: cl,cr - REAL(r8), DIMENSION(0:spl%mx) :: xfac + integer :: iqty,iside + real(r8), dimension(-1:1,0:spl%mx) :: a + real(r8), dimension(spl%mx) :: b + real(r8), dimension(4) :: cl,cr + real(r8), dimension(0:spl%mx) :: xfac c----------------------------------------------------------------------- c extract powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) /= 0)then xfac=1/ABS(spl%xs-spl%x0(iside))**spl%xpower(iside,iqty) spl%fs(:,iqty)=spl%fs(:,iqty)*xfac - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c set up grid matrix. c----------------------------------------------------------------------- - CALL spline_fac(spl,a,b,cl,cr,endmode) + call spline_fac(spl,a,b,cl,cr,endmode) c----------------------------------------------------------------------- c compute first derivatives, interior. c----------------------------------------------------------------------- - DO iqty=1,spl%nqty + do iqty=1,spl%nqty spl%fs1(1:spl%mx-1,iqty)= $ 3*((spl%fs(2:spl%mx,iqty)-spl%fs(1:spl%mx-1,iqty)) $ *b(2:spl%mx) $ +(spl%fs(1:spl%mx-1,iqty)-spl%fs(0:spl%mx-2,iqty)) $ *b(1:spl%mx-1)) - ENDDO + enddo c----------------------------------------------------------------------- c extrapolation boundary conditions. c----------------------------------------------------------------------- - SELECT CASE(endmode) - CASE("extrap") - DO iqty=1,spl%nqty + select case(endmode) + case(3) ! 3 = Extrapolate + do iqty=1,spl%nqty spl%fs1(0,iqty)=SUM(cl(1:4)*spl%fs(0:3,iqty)) spl%fs1(spl%mx,iqty)=SUM(cr(1:4) $ *spl%fs(spl%mx:spl%mx-3:-1,iqty)) @@ -216,18 +216,18 @@ SUBROUTINE spline_fit_ahg(spl,endmode) spl%fs1(spl%mx-1,iqty)= $ spl%fs1(spl%mx-1,iqty)-spl%fs1(spl%mx,iqty) $ /(spl%xs(spl%mx)-spl%xs(spl%mx-1)) - ENDDO - CALL spline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) + enddo + call spline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) c----------------------------------------------------------------------- c not-a-knot boundary conditions. c----------------------------------------------------------------------- - CASE("not-a-knot") + case(4) ! 4 = not-a-knot spl%fs1(1,:)=spl%fs1(1,:)-(2*spl%fs(1,:) $ -spl%fs(0,:)-spl%fs(2,:))*2*b(1) spl%fs1(spl%mx-1,:)=spl%fs1(spl%mx-1,:) $ +(2*spl%fs(spl%mx-1,:)-spl%fs(spl%mx,:) $ -spl%fs(spl%mx-2,:))*2*b(spl%mx) - CALL spline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) + call spline_trilus(a(:,1:spl%mx-1),spl%fs1(1:spl%mx-1,:)) spl%fs1(0,:)=(2*(2*spl%fs(1,:)-spl%fs(0,:)-spl%fs(2,:)) $ +(spl%fs1(1,:)+spl%fs1(2,:))*(spl%xs(2)-spl%xs(1)) $ -spl%fs1(1,:)*(spl%xs(1)-spl%xs(0)))/(spl%xs(1)-spl%xs(0)) @@ -242,23 +242,23 @@ SUBROUTINE spline_fit_ahg(spl,endmode) c----------------------------------------------------------------------- c periodic boudary conditions. c----------------------------------------------------------------------- - CASE("periodic") - spl%periodic=.TRUE. + case(2) ! 2 = Periodic + spl%periodic=.true. spl%fs1(0,:)=3*((spl%fs(1,:)-spl%fs(0,:))*b(1) $ +(spl%fs(0,:)-spl%fs(spl%mx-1,:))*b(spl%mx)) - CALL spline_morrison(a(:,0:spl%mx-1),spl%fs1(0:spl%mx-1,:)) + call spline_morrison(a(:,0:spl%mx-1),spl%fs1(0:spl%mx-1,:)) spl%fs1(spl%mx,:)=spl%fs1(0,:) c----------------------------------------------------------------------- c unrecognized boundary condition. c----------------------------------------------------------------------- - CASE DEFAULT - CALL program_stop("Cannot recognize endmode = "//TRIM(endmode)) - END SELECT + case default + call program_stop("Cannot recognize endmode") + end select c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_fit_ahg + return + end subroutine spline_fit_ahg c----------------------------------------------------------------------- c subprogram 5. spline_fit_classic. c classical way to solve spline coefficients @@ -268,62 +268,62 @@ END SUBROUTINE spline_fit_ahg c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_fit_classic(spl,endmode) - TYPE(spline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode - REAL(r8), DIMENSION(:),ALLOCATABLE :: d,l,u,h - REAL(r8), DIMENSION(:,:),ALLOCATABLE :: r - REAL(r8), DIMENSION(0:spl%mx) :: xfac + subroutine spline_fit_classic(spl,endmode) + type(spline_type), intent(inout) :: spl + integer, intent(in) :: endmode + real(r8), dimension(:),allocatable :: d,l,u,h + real(r8), dimension(:,:),allocatable :: r + real(r8), dimension(0:spl%mx) :: xfac - INTEGER :: iside,iqty,i - REAL(r8),DIMENSION(spl%nqty) :: bs,cs,ds + integer :: iside,iqty,i + real(r8),dimension(spl%nqty) :: bs,cs,ds c----------------------------------------------------------------------- c extract powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) /= 0)then xfac=1/ABS(spl%xs-spl%x0(iside))**spl%xpower(iside,iqty) spl%fs(:,iqty)=spl%fs(:,iqty)*xfac - ENDIF - ENDDO - ENDDO - ALLOCATE (d(0:spl%mx),l(spl%mx),u(spl%mx),r(0:spl%mx,spl%nqty)) - ALLOCATE (h(0:spl%mx-1)) + endif + enddo + enddo + allocate (d(0:spl%mx),l(spl%mx),u(spl%mx),r(0:spl%mx,spl%nqty)) + allocate (h(0:spl%mx-1)) c----------------------------------------------------------------------- c compute tridiagnol matrix for natural B.C. c----------------------------------------------------------------------- - DO i=0,spl%mx-1 + do i=0,spl%mx-1 h(i)=spl%xs(i+1)-spl%xs(i) - ENDDO + enddo d(0)=1 - DO i=1,spl%mx-1 + do i=1,spl%mx-1 d(i)=2*(h(i-1)+h(i)) - ENDDO + enddo d(spl%mx)=1 - DO i=1,spl%mx-1 + do i=1,spl%mx-1 l(i)=h(i-1) - ENDDO + enddo l(spl%mx)=0 u(1)=0 - DO i=2,spl%mx + do i=2,spl%mx u(i)=h(i-1) - ENDDO + enddo r(0,:)=0 - DO i=1,spl%mx-1 + do i=1,spl%mx-1 r(i,:)=( (spl%fs(i+1,:)-spl%fs(i,:))/h(i) $ -(spl%fs(i,:)-spl%fs(i-1,:))/h(i-1) )*6 - ENDDO + enddo r(spl%mx,:)=0 - IF (endmode=="extrap") THEN - CALL spline_get_yp(spl%xs(0:3),spl%fs(0:3,:), + if (endmode==3) then ! 3 = Extrapolate + call spline_get_yp(spl%xs(0:3),spl%fs(0:3,:), $ spl%xs(0),r(0,:),spl%nqty) - CALL spline_get_yp(spl%xs(spl%mx-3:spl%mx), + call spline_get_yp(spl%xs(spl%mx-3:spl%mx), $ spl%fs(spl%mx-3:spl%mx,:),spl%xs(spl%mx), $ r(spl%mx,:),spl%nqty) d(0)=2*h(0) @@ -334,19 +334,19 @@ SUBROUTINE spline_fit_classic(spl,endmode) r(spl%mx,:)=( r(spl%mx,:) $ -(spl%fs(spl%mx,:)-spl%fs(spl%mx-1,:))/h(spl%mx-1) )*6 - ENDIF + endif c----------------------------------------------------------------------- c solve and contrruct spline. c----------------------------------------------------------------------- - CALL spline_thomas(l,d,u,r,spl%mx+1,spl%nqty) + call spline_thomas(l,d,u,r,spl%mx+1,spl%nqty) - DO i=0, spl%mx-1 + do i=0, spl%mx-1 bs=(spl%fs(i+1,:)-spl%fs(i,:))/h(i) $ - 0.5*h(i)*r(i,:) $ - h(i)*(r(i+1,:)-r(i,:))/6 spl%fs1(i,:)=bs - ENDDO + enddo ds=(r(spl%mx,:)-r(spl%mx-1,:))/(h(spl%mx-1)*6) cs=r(spl%mx-1,:)*0.5 i=spl%mx-1 @@ -355,12 +355,12 @@ SUBROUTINE spline_fit_classic(spl,endmode) $ - h(i)*(r(i+1,:)-r(i,:))/6 i=spl%mx spl%fs1(i,:)=bs+h(i-1)*(cs*2+h(i-1)*ds*3) - DEALLOCATE (d,l,u,r,h) + deallocate (d,l,u,r,h) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_fit_classic + return + end subroutine spline_fit_classic c----------------------------------------------------------------------- c subprogram 6. spline_fit_ha. c fits real functions to highly accurate cubic splines @@ -370,31 +370,31 @@ END SUBROUTINE spline_fit_classic c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_fit_ha(spl,endmode) - TYPE(spline_type), INTENT(INOUT) :: spl - CHARACTER(*), INTENT(IN) :: endmode - - INTEGER ::icount,icoef,imx,iqty,istart,jstart,info,iside - INTEGER :: ndim,nqty,kl,ku,ldab,nvar - INTEGER, DIMENSION(:), ALLOCATABLE :: ipiv - INTEGER, DIMENSION(:,:), ALLOCATABLE :: imap - REAL(r8) :: x0,x1,x2,dx - REAL(r8), DIMENSION(0:spl%mx) :: xfac - REAL(r8), DIMENSION(:,:), ALLOCATABLE :: rhs,locrhs,fs,locrhs0, + subroutine spline_fit_ha(spl,endmode) + type(spline_type), intent(inout) :: spl + integer, intent(in) :: endmode + + integer ::icount,icoef,imx,iqty,istart,jstart,info,iside + integer :: ndim,nqty,kl,ku,ldab,nvar + integer, dimension(:), allocatable :: ipiv + integer, dimension(:,:), allocatable :: imap + real(r8) :: x0,x1,x2,dx + real(r8), dimension(0:spl%mx) :: xfac + real(r8), dimension(:,:), allocatable :: rhs,locrhs,fs,locrhs0, $ locrhs1,tmpmat - REAL(r8), DIMENSION(:,:),ALLOCATABLE :: mat,locmat,locmat0,locmat1 - REAL(r8), DIMENSION(:,:,:),ALLOCATABLE :: coef + real(r8), dimension(:,:),allocatable :: mat,locmat,locmat0,locmat1 + real(r8), dimension(:,:,:),allocatable :: coef c----------------------------------------------------------------------- c extract powers. c----------------------------------------------------------------------- - DO iside=1,2 - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) /= 0)THEN + do iside=1,2 + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) /= 0)then xfac=1/ABS(spl%xs-spl%x0(iside))**spl%xpower(iside,iqty) spl%fs(:,iqty)=spl%fs(:,iqty)*xfac - ENDIF - ENDDO - ENDDO + endif + enddo + enddo c----------------------------------------------------------------------- c contruct grid and related matrix block. c five unknow variables at each interval a,b,c,e,f @@ -403,30 +403,30 @@ SUBROUTINE spline_fit_ha(spl,endmode) c----------------------------------------------------------------------- nqty=spl%nqty nvar=5 - ALLOCATE (coef(nvar,0:spl%mx-1,nqty),imap(nvar,0:spl%mx-1)) - ALLOCATE (fs(0:spl%mx,nqty)) + allocate (coef(nvar,0:spl%mx-1,nqty),imap(nvar,0:spl%mx-1)) + allocate (fs(0:spl%mx,nqty)) icount=1 - DO imx=0, spl%mx-1 - DO icoef=1,nvar + do imx=0, spl%mx-1 + do icoef=1,nvar imap(icoef,imx)=icount icount=icount+1 - ENDDO - ENDDO + enddo + enddo ndim=icount-1 kl=nvar*3 ku=kl ldab=2*kl+ku+1 - ALLOCATE(mat(ldab,ndim),rhs(ndim,nqty),ipiv(ndim)) + allocate(mat(ldab,ndim),rhs(ndim,nqty),ipiv(ndim)) mat=0 rhs=0 fs=spl%fs(:,:) c----------------------------------------------------------------------- c contruct local matrix in each interval. c----------------------------------------------------------------------- - ALLOCATE(locmat(nvar,nvar*3),locmat0(nvar,nvar*3), + allocate(locmat(nvar,nvar*3),locmat0(nvar,nvar*3), & locmat1(nvar,nvar*2),tmpmat(nvar,nvar*2)) - ALLOCATE(locrhs(nvar,nqty),locrhs0(nvar,nqty),locrhs1(nvar,nqty)) - DO imx=1,spl%mx-2 + allocate(locrhs(nvar,nqty),locrhs0(nvar,nqty),locrhs1(nvar,nqty)) + do imx=1,spl%mx-2 x0=spl%xs(imx-1) x1=spl%xs(imx) x2=spl%xs(imx+1) @@ -469,9 +469,9 @@ SUBROUTINE spline_fit_ha(spl,endmode) c----------------------------------------------------------------------- istart=imap(1,imx) jstart=imap(1,imx-1) - CALL spline_fill_matrix(mat,locmat,istart,jstart,kl,ku) + call spline_fill_matrix(mat,locmat,istart,jstart,kl,ku) rhs(istart:istart+nvar-1,:)=locrhs - ENDDO + enddo c----------------------------------------------------------------------- c boundary condition c----------------------------------------------------------------------- @@ -509,11 +509,11 @@ SUBROUTINE spline_fit_ha(spl,endmode) locmat1(5,5)=1 locmat1(5,nvar+5)=-1 - SELECT CASE(endmode) + select case(endmode) c----------------------------------------------------------------------- c not-a-knot boundary conditions. c----------------------------------------------------------------------- - CASE("not-a-knot") + case(4) ! 4 = not-a-knot locmat0(1,nvar+1)=6 locmat0(1,2*nvar+1)=-6 locmat0(5,nvar+5)=1 @@ -528,9 +528,9 @@ SUBROUTINE spline_fit_ha(spl,endmode) c extrap boudary conditions, use first and last four points to c calculate y'(0) and y'(1). c----------------------------------------------------------------------- - CASE("extrap") + case(3) ! 3 = Extrapolate locmat0(1,nvar+3)=1 - CALL spline_get_yp(spl%xs(0:3),spl%fs(0:3,:), + call spline_get_yp(spl%xs(0:3),spl%fs(0:3,:), $ spl%xs(0),locrhs0(1,:),nqty) locmat0(5,nvar+5)=1 @@ -540,7 +540,7 @@ SUBROUTINE spline_fit_ha(spl,endmode) locmat1(3,nvar+1)=3*dx*dx locmat1(3,nvar+2)=2*dx locmat1(3,nvar+3)=1 - CALL spline_get_yp(spl%xs(spl%mx-3:spl%mx), + call spline_get_yp(spl%xs(spl%mx-3:spl%mx), $ spl%fs(spl%mx-3:spl%mx,:),spl%xs(spl%mx),locrhs1(3,:),nqty) locmat1(4,nvar+4)=1 @@ -548,7 +548,7 @@ SUBROUTINE spline_fit_ha(spl,endmode) c----------------------------------------------------------------------- c natural boudary conditions. c----------------------------------------------------------------------- - CASE("natural") + case(1) ! 1 = Natural locmat0(1,nvar+2)=2 locmat0(5,nvar+5)=1 @@ -563,20 +563,20 @@ SUBROUTINE spline_fit_ha(spl,endmode) c----------------------------------------------------------------------- c periodic boudary conditions. c----------------------------------------------------------------------- - CASE("periodic") + case(2) ! 2 = Periodic c----------------------------------------------------------------------- c s'0(x0)=s'm-1(xm). c----------------------------------------------------------------------- - DO iqty=1,nqty - IF (ABS(spl%fs(0,iqty)-spl%fs(spl%mx,iqty)) > 1E-15) THEN - WRITE(*,*) + do iqty=1,nqty + if (ABS(spl%fs(0,iqty)-spl%fs(spl%mx,iqty)) > 1E-15) then + write(*,*) $ "Warning: first and last points are different. - $ IQTY= ",IQTY,", averaged value is used."// - $ TRIM(endmode) + $ IQTY= ",IQTY,", averaged value is used." +c ,endmode spl%fs(0,iqty)=(spl%fs(0,iqty)+spl%fs(spl%mx,iqty))*0.5 spl%fs(spl%mx,iqty)=spl%fs(0,iqty) - ENDIF - ENDDO + endif + enddo locmat0(1,nvar+3)=1 locmat0(1,nvar+4)=-1 @@ -594,21 +594,21 @@ SUBROUTINE spline_fit_ha(spl,endmode) locmat0(5,nvar+2)=2 locmat0(5,nvar+5)=-1 - spl%periodic=.TRUE. + spl%periodic=.true. c----------------------------------------------------------------------- c unrecognized boundary condition. c----------------------------------------------------------------------- - CASE DEFAULT - CALL program_stop - $ ("Cannot recognize endmode = "//TRIM(endmode)) - END SELECT + case default + call program_stop + $ ("Cannot recognize endmode") + end select c----------------------------------------------------------------------- c fill global matrix at x0 c----------------------------------------------------------------------- istart=imap(1,0) jstart=imap(1,0) tmpmat=locmat0(:,nvar+1:3*nvar) - CALL spline_fill_matrix(mat,tmpmat,istart,jstart,kl,ku) + call spline_fill_matrix(mat,tmpmat,istart,jstart,kl,ku) rhs(istart:istart+nvar-1,:)=locrhs0 c----------------------------------------------------------------------- c fill global matrix at xm @@ -616,44 +616,44 @@ SUBROUTINE spline_fit_ha(spl,endmode) istart=imap(1,spl%mx-1) jstart=imap(1,spl%mx-2) tmpmat=locmat1(:,1:2*nvar) - CALL spline_fill_matrix(mat,tmpmat,istart,jstart,kl,ku) + call spline_fill_matrix(mat,tmpmat,istart,jstart,kl,ku) rhs(istart:istart+nvar-1,:)=locrhs1 c----------------------------------------------------------------------- c solve global matrix c----------------------------------------------------------------------- - CALL dgbtrf(ndim,ndim,kl,ku,mat,ldab,ipiv,info) - IF (info .NE. 0) THEN - CALL program_stop + call dgbtrf(ndim,ndim,kl,ku,mat,ldab,ipiv,info) + if (info .NE. 0) then + call program_stop $ ("Error: LU factorization of spline matrix info ne 0") - ENDIF - CALL dgbtrs("N",ndim,kl,ku,nqty,mat,ldab,ipiv,rhs,ndim,info ) - IF (info .NE. 0) THEN - CALL program_stop + endif + call dgbtrs("N",ndim,kl,ku,nqty,mat,ldab,ipiv,rhs,ndim,info ) + if (info .NE. 0) then + call program_stop $ ("Error: solve spline matrix info ne 0") - ENDIF + endif c----------------------------------------------------------------------- c get spl%fs1. c----------------------------------------------------------------------- - DO imx=0, spl%mx-1 - DO icoef=1,nvar + do imx=0, spl%mx-1 + do icoef=1,nvar coef(icoef,imx,:)=rhs(imap(icoef,imx),:) - ENDDO + enddo spl%fs1(imx,:)=coef(3,imx,:) - ENDDO + enddo dx=spl%xs(imx)-spl%xs(imx-1) spl%fs1(imx,:)=coef(3,imx-1,:) $ +dx*(coef(2,imx-1,:)*2+dx*coef(1,imx-1,:)*3) - DEALLOCATE (coef,imap) - DEALLOCATE (fs) - DEALLOCATE(mat,rhs,ipiv) - DEALLOCATE(locmat,locmat0,locmat1,tmpmat) - DEALLOCATE(locrhs,locrhs0,locrhs1) + deallocate (coef,imap) + deallocate (fs) + deallocate(mat,rhs,ipiv) + deallocate(locmat,locmat0,locmat1,tmpmat) + deallocate(locrhs,locrhs0,locrhs1) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_fit_ha + return + end subroutine spline_fit_ha c----------------------------------------------------------------------- c subprogram 7. spline_fac. c sets up matrix for cubic spline fitting. @@ -661,29 +661,29 @@ END SUBROUTINE spline_fit_ha c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_fac(spl,a,b,cl,cr,endmode) + subroutine spline_fac(spl,a,b,cl,cr,endmode) - TYPE(spline_type), INTENT(IN) :: spl - REAL(r8), DIMENSION(-1:1,0:spl%mx), INTENT(OUT) :: a - REAL(r8), DIMENSION(spl%mx), INTENT(OUT) :: b - REAL(r8), DIMENSION(4), INTENT(OUT) :: cl,cr - CHARACTER(*), INTENT(IN) :: endmode + type(spline_type), intent(in) :: spl + real(r8), dimension(-1:1,0:spl%mx), intent(out) :: a + real(r8), dimension(spl%mx), intent(out) :: b + real(r8), dimension(4), intent(out) :: cl,cr + integer, intent(in) :: endmode - INTEGER :: j + integer :: j c----------------------------------------------------------------------- c compute interior matrix. c----------------------------------------------------------------------- b=1/(spl%xs(1:spl%mx)-spl%xs(0:spl%mx-1)) - DO j=1,spl%mx-1 + do j=1,spl%mx-1 a(-1,j)=b(j) a(0,j)=2*(b(j)+b(j+1)) a(1,j)=b(j+1) - ENDDO + enddo c----------------------------------------------------------------------- c extrapolation boundary conditions. c----------------------------------------------------------------------- - SELECT CASE(endmode) - CASE("extrap") + select case(endmode) + case(3) ! 3 = Extrapolate b=b*b cl(1)=(spl%xs(0)*(3*spl%xs(0) $ -2*(spl%xs(1)+spl%xs(2)+spl%xs(3))) @@ -723,11 +723,11 @@ SUBROUTINE spline_fac(spl,a,b,cl,cr,endmode) $ /((spl%xs(spl%mx-3)-spl%xs(spl%mx)) $ *(spl%xs(spl%mx-3)-spl%xs(spl%mx-1)) $ *(spl%xs(spl%mx-3)-spl%xs(spl%mx-2))) - CALL spline_triluf(a(:,1:spl%mx-1)) + call spline_triluf(a(:,1:spl%mx-1)) c----------------------------------------------------------------------- c not-a-knot boundary conditions. c----------------------------------------------------------------------- - CASE("not-a-knot") + case(4) ! 4 = not-a-knot b=b*b a(0,1)=a(0,1)+(spl%xs(2)+spl%xs(0)-2*spl%xs(1))*b(1) a(1,1)=a(1,1)+(spl%xs(2)-spl%xs(1))*b(1) @@ -736,27 +736,27 @@ SUBROUTINE spline_fac(spl,a,b,cl,cr,endmode) $ -spl%xs(spl%mx))*b(spl%mx) a(-1,spl%mx-1)=a(-1,spl%mx-1) $ +(spl%xs(spl%mx-1)-spl%xs(spl%mx-2))*b(spl%mx) - CALL spline_triluf(a(:,1:spl%mx-1)) + call spline_triluf(a(:,1:spl%mx-1)) c----------------------------------------------------------------------- c periodic boundary conditions. c----------------------------------------------------------------------- - CASE("periodic") + case(2) ! 2 = Periodic a(0,0:spl%mx:spl%mx)=2*(b(spl%mx)+b(1)) a(1,0)=b(1) a(-1,0)=b(spl%mx) b=b*b - CALL spline_sherman(a(:,0:spl%mx-1)) + call spline_sherman(a(:,0:spl%mx-1)) c----------------------------------------------------------------------- c unrecognized boundary condition. c----------------------------------------------------------------------- - CASE DEFAULT - CALL program_stop("Cannot recognize endmode = "//TRIM(endmode)) - END SELECT + case default + call program_stop("Cannot recognize endmode") + end select c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_fac + return + end subroutine spline_fac c----------------------------------------------------------------------- c subprogram 8. spline_eval. c evaluates real cubic spline function. @@ -764,45 +764,45 @@ END SUBROUTINE spline_fac c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_eval(spl,x,mode) + subroutine spline_eval(spl,x,mode) - TYPE(spline_type), INTENT(INOUT) :: spl - REAL(r8), INTENT(IN) :: x - INTEGER, INTENT(IN) :: mode + type(spline_type), intent(inout) :: spl + real(r8), intent(in) :: x + integer, intent(in) :: mode - INTEGER :: iqty,iside - REAL(r8) :: xx,d,z,z1,xfac,dx - REAL(r8) :: g,g1,g2,g3 + integer :: iqty,iside + real(r8) :: xx,d,z,z1,xfac,dx + real(r8) :: g,g1,g2,g3 c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- xx=x spl%ix=MAX(spl%ix,0) - spl%ix=MIN(spl%ix,spl%mx-1) + spl%ix=Min(spl%ix,spl%mx-1) c----------------------------------------------------------------------- c normalize interval for periodic splines. c----------------------------------------------------------------------- - IF(spl%periodic)THEN - DO - IF(xx < spl%xs(spl%mx))EXIT + if(spl%periodic)then + do + if(xx < spl%xs(spl%mx))EXIT xx=xx-spl%xs(spl%mx) - ENDDO - DO - IF(xx >= spl%xs(0))EXIT + enddo + do + if(xx >= spl%xs(0))EXIT xx=xx+spl%xs(spl%mx) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c find cubic spline interval. c----------------------------------------------------------------------- - DO - IF(xx >= spl%xs(spl%ix).OR.spl%ix <= 0)EXIT + do + if(xx >= spl%xs(spl%ix).OR.spl%ix <= 0)EXIT spl%ix=spl%ix-1 - ENDDO - DO - IF(xx < spl%xs(spl%ix+1).OR.spl%ix >= spl%mx-1)EXIT + enddo + do + if(xx < spl%xs(spl%ix+1).OR.spl%ix >= spl%mx-1)EXIT spl%ix=spl%ix+1 - ENDDO + enddo c----------------------------------------------------------------------- c evaluate offset and related quantities. c----------------------------------------------------------------------- @@ -819,59 +819,59 @@ SUBROUTINE spline_eval(spl,x,mode) c----------------------------------------------------------------------- c evaluate first derivatives. c----------------------------------------------------------------------- - IF(mode > 0)THEN + if(mode > 0)then spl%f1=6*(spl%fs(spl%ix+1,1:spl%nqty) $ -spl%fs(spl%ix,1:spl%nqty))*z*z1/d $ +spl%fs1(spl%ix,1:spl%nqty)*z1*(3*z1-2) $ +spl%fs1(spl%ix+1,1:spl%nqty)*z*(3*z-2) - ENDIF + endif c----------------------------------------------------------------------- c evaluate second derivatives. c----------------------------------------------------------------------- - IF(mode > 1)THEN + if(mode > 1)then spl%f2=(6*(spl%fs(spl%ix+1,1:spl%nqty) $ -spl%fs(spl%ix,1:spl%nqty))*(z1-z)/d $ -spl%fs1(spl%ix,1:spl%nqty)*(6*z1-2) $ +spl%fs1(spl%ix+1,1:spl%nqty)*(6*z-2))/d - ENDIF + endif c----------------------------------------------------------------------- c evaluate third derivatives. c----------------------------------------------------------------------- - IF(mode > 2)THEN + if(mode > 2)then spl%f3=(12*(spl%fs(spl%ix,1:spl%nqty) $ -spl%fs(spl%ix+1,1:spl%nqty))/d $ +6*(spl%fs1(spl%ix,1:spl%nqty) $ +spl%fs1(spl%ix+1,1:spl%nqty)))/(d*d) - ENDIF + endif c----------------------------------------------------------------------- c restore powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=x-spl%x0(iside) - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) == 0)CYCLE + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**spl%xpower(iside,iqty) g=spl%f(iqty)*xfac - IF(mode > 0)g1=(spl%f1(iqty)+spl%f(iqty) + if(mode > 0)g1=(spl%f1(iqty)+spl%f(iqty) $ *spl%xpower(iside,iqty)/dx)*xfac - IF(mode > 1)g2=(spl%f2(iqty)+spl%xpower(iside,iqty)/dx + if(mode > 1)g2=(spl%f2(iqty)+spl%xpower(iside,iqty)/dx $ *(2*spl%f1(iqty)+(spl%xpower(iside,iqty)-1) $ *spl%f(iqty)/dx))*xfac - IF(mode > 2)g3=(spl%f3(iqty)+spl%xpower(iside,iqty)/dx + if(mode > 2)g3=(spl%f3(iqty)+spl%xpower(iside,iqty)/dx $ *(3*spl%f2(iqty)+(spl%xpower(iside,iqty)-1)/dx $ *(3*spl%f1(iqty)+(spl%xpower(iside,iqty)-2)/dx $ *spl%f(iqty))))*xfac spl%f(iqty)=g - IF(mode > 0)spl%f1(iqty)=g1 - IF(mode > 1)spl%f2(iqty)=g2 - IF(mode > 2)spl%f3(iqty)=g3 - ENDDO - ENDDO + if(mode > 0)spl%f1(iqty)=g1 + if(mode > 1)spl%f2(iqty)=g2 + if(mode > 2)spl%f3(iqty)=g3 + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_eval + return + end subroutine spline_eval c----------------------------------------------------------------------- c subprogram 9. spline_eval_external c evaluates real cubic spline with external arrays (parallel). @@ -879,117 +879,130 @@ END SUBROUTINE spline_eval c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_eval_external(spl,x,s_ix,s_f,s_f1,s_f2,s_f3) + subroutine spline_eval_external(spl,x,s_f,s_f1,s_f2,s_f3) - TYPE(spline_type), INTENT(IN) :: spl - REAL(r8), INTENT(IN) :: x + type(spline_type), intent(in) :: spl + real(r8), intent(in) :: x - INTEGER :: iqty,iside - REAL(r8) :: xx,d,z,z1,xfac,dx - REAL(r8) :: g,g1,g2,g3 + integer :: iqty,iside + integer :: ix, i_low, i_high, i_mid + real(r8) :: xx,d,z,z1,xfac,dx + real(r8) :: g,g1,g2,g3 + + + real(r8), dimension(:), intent(out) :: s_f + real(r8), dimension(:), optional, intent(out) :: s_f1,s_f2,s_f3 - INTEGER, INTENT(INOUT) :: s_ix - REAL(r8), DIMENSION(:), INTENT(OUT) :: s_f - REAL(r8), DIMENSION(:), OPTIONAL, INTENT(OUT) :: s_f1,s_f2,s_f3 c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- xx=x - s_ix=MAX(s_ix,0) - s_ix=MIN(s_ix,spl%mx-1) c----------------------------------------------------------------------- c normalize interval for periodic splines. c----------------------------------------------------------------------- - IF(spl%periodic)THEN - DO - IF(xx < spl%xs(spl%mx))EXIT + if(spl%periodic)then + do + if(xx < spl%xs(spl%mx))EXIT xx=xx-spl%xs(spl%mx) - ENDDO - DO - IF(xx >= spl%xs(0))EXIT + enddo + do + if(xx >= spl%xs(0))EXIT xx=xx+spl%xs(spl%mx) - ENDDO - ENDIF + enddo + endif + c----------------------------------------------------------------------- -c find cubic spline interval. +c find cubic spline interval using Binary Search c----------------------------------------------------------------------- - DO - IF(xx >= spl%xs(s_ix).OR.s_ix <= 0)EXIT - s_ix=s_ix-1 - ENDDO - DO - IF(xx < spl%xs(s_ix+1).OR.s_ix >= spl%mx-1)EXIT - s_ix=s_ix+1 - ENDDO + i_low = 0 + i_high = spl%mx - 1 + + do while (i_low <= i_high) + i_mid = i_low + (i_high - i_low) / 2 + if (xx < spl%xs(i_mid)) then + i_high = i_mid - 1 + else if (xx >= spl%xs(i_mid + 1)) then + i_low = i_mid + 1 + else + ! We found the interval: xs(i_mid) <= xx < xs(i_mid+1) + ix = i_mid + exit + endif + enddo + + ! If the search fails, treat it as a boundary value. + if (i_low > i_high) then + ix = min(max(i_low - 1, 0), spl%mx - 1) + endif c----------------------------------------------------------------------- c evaluate offset and related quantities. c----------------------------------------------------------------------- - d=spl%xs(s_ix+1)-spl%xs(s_ix) - z=(xx-spl%xs(s_ix))/d + d=spl%xs(ix+1)-spl%xs(ix) + z=(xx-spl%xs(ix))/d z1=1-z c----------------------------------------------------------------------- c evaluate functions. c----------------------------------------------------------------------- - s_f=spl%fs(s_ix,1:spl%nqty)*z1*z1*(3-2*z1) - $ +spl%fs(s_ix+1,1:spl%nqty)*z*z*(3-2*z) - $ +d*z*z1*(spl%fs1(s_ix,1:spl%nqty)*z1 - $ -spl%fs1(s_ix+1,1:spl%nqty)*z) + s_f=spl%fs(ix,1:spl%nqty)*z1*z1*(3-2*z1) + $ +spl%fs(ix+1,1:spl%nqty)*z*z*(3-2*z) + $ +d*z*z1*(spl%fs1(ix,1:spl%nqty)*z1 + $ -spl%fs1(ix+1,1:spl%nqty)*z) c----------------------------------------------------------------------- c evaluate first derivatives. c----------------------------------------------------------------------- - IF(PRESENT(s_f1))THEN - s_f1=6*(spl%fs(s_ix+1,1:spl%nqty) - $ -spl%fs(s_ix,1:spl%nqty))*z*z1/d - $ +spl%fs1(s_ix,1:spl%nqty)*z1*(3*z1-2) - $ +spl%fs1(s_ix+1,1:spl%nqty)*z*(3*z-2) - ENDIF + if(present(s_f1))then + s_f1=6*(spl%fs(ix+1,1:spl%nqty) + $ -spl%fs(ix,1:spl%nqty))*z*z1/d + $ +spl%fs1(ix,1:spl%nqty)*z1*(3*z1-2) + $ +spl%fs1(ix+1,1:spl%nqty)*z*(3*z-2) + endif c----------------------------------------------------------------------- c evaluate second derivatives. c----------------------------------------------------------------------- - IF(PRESENT(s_f2))THEN - s_f2=(6*(spl%fs(s_ix+1,1:spl%nqty) - $ -spl%fs(s_ix,1:spl%nqty))*(z1-z)/d - $ -spl%fs1(s_ix,1:spl%nqty)*(6*z1-2) - $ +spl%fs1(s_ix+1,1:spl%nqty)*(6*z-2))/d - ENDIF + if(present(s_f2))then + s_f2=(6*(spl%fs(ix+1,1:spl%nqty) + $ -spl%fs(ix,1:spl%nqty))*(z1-z)/d + $ -spl%fs1(ix,1:spl%nqty)*(6*z1-2) + $ +spl%fs1(ix+1,1:spl%nqty)*(6*z-2))/d + endif c----------------------------------------------------------------------- c evaluate third derivatives. c----------------------------------------------------------------------- - IF(PRESENT(s_f3))THEN - s_f3=(12*(spl%fs(s_ix,1:spl%nqty) - $ -spl%fs(s_ix+1,1:spl%nqty))/d - $ +6*(spl%fs1(s_ix,1:spl%nqty) - $ +spl%fs1(s_ix+1,1:spl%nqty)))/(d*d) - ENDIF + if(present(s_f3))then + s_f3=(12*(spl%fs(ix,1:spl%nqty) + $ -spl%fs(ix+1,1:spl%nqty))/d + $ +6*(spl%fs1(ix,1:spl%nqty) + $ +spl%fs1(ix+1,1:spl%nqty)))/(d*d) + endif c----------------------------------------------------------------------- c restore powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=x-spl%x0(iside) - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) == 0)CYCLE + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**spl%xpower(iside,iqty) g=s_f(iqty)*xfac - IF(PRESENT(s_f1))g1=(s_f1(iqty)+s_f(iqty) + if(present(s_f1))g1=(s_f1(iqty)+s_f(iqty) $ *spl%xpower(iside,iqty)/dx)*xfac - IF(PRESENT(s_f2))g2=(s_f2(iqty)+spl%xpower(iside,iqty)/dx + if(present(s_f2))g2=(s_f2(iqty)+spl%xpower(iside,iqty)/dx $ *(2*s_f1(iqty)+(spl%xpower(iside,iqty)-1) $ *s_f(iqty)/dx))*xfac - IF(PRESENT(s_f3))g3=(s_f3(iqty)+spl%xpower(iside,iqty)/dx + if(present(s_f3))g3=(s_f3(iqty)+spl%xpower(iside,iqty)/dx $ *(3*s_f2(iqty)+(spl%xpower(iside,iqty)-1)/dx $ *(3*s_f1(iqty)+(spl%xpower(iside,iqty)-2)/dx $ *s_f(iqty))))*xfac s_f(iqty)=g - IF(PRESENT(s_f1))s_f1(iqty)=g1 - IF(PRESENT(s_f2))s_f2(iqty)=g2 - IF(PRESENT(s_f3))s_f3(iqty)=g3 - ENDDO - ENDDO + if(present(s_f1))s_f1(iqty)=g1 + if(present(s_f2))s_f2(iqty)=g2 + if(present(s_f3))s_f3(iqty)=g3 + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_eval_external + return + end subroutine spline_eval_external c----------------------------------------------------------------------- c subprogram 10. spline_all_eval. c evaluates cubic spline function. @@ -997,17 +1010,17 @@ END SUBROUTINE spline_eval_external c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_all_eval(spl,z,f,f1,f2,f3,mode) + subroutine spline_all_eval(spl,z,f,f1,f2,f3,mode) - TYPE(spline_type), INTENT(INOUT) :: spl - REAL(r8), INTENT(IN) :: z - REAL(r8), DIMENSION(spl%mx,spl%nqty), INTENT(OUT) :: f,f1,f2,f3 - INTEGER, INTENT(IN) :: mode + type(spline_type), intent(inout) :: spl + real(r8), intent(in) :: z + real(r8), dimension(spl%mx,spl%nqty), intent(out) :: f,f1,f2,f3 + integer, intent(in) :: mode - INTEGER :: iqty,nqty,n,iside - REAL(r8) :: z1 - REAL(r8), DIMENSION(spl%mx) :: d,xfac,dx - REAL(r8), DIMENSION(spl%mx) :: g,g1,g2,g3 + integer :: iqty,nqty,n,iside + real(r8) :: z1 + real(r8), dimension(spl%mx) :: d,xfac,dx + real(r8), dimension(spl%mx) :: g,g1,g2,g3 c----------------------------------------------------------------------- c evaluate offset and related quantities. c----------------------------------------------------------------------- @@ -1018,70 +1031,70 @@ SUBROUTINE spline_all_eval(spl,z,f,f1,f2,f3,mode) c----------------------------------------------------------------------- c evaluate functions. c----------------------------------------------------------------------- - DO iqty=1,nqty + do iqty=1,nqty f(:,iqty)=spl%fs(0:n-1,iqty)*z1*z1*(3-2*z1) $ +spl%fs(1:n,iqty)*z*z*(3-2*z) $ +d*z*z1*(spl%fs1(0:n-1,iqty)*z1-spl%fs1(1:n,iqty)*z) - ENDDO + enddo c----------------------------------------------------------------------- c evaluate first derivatives. c----------------------------------------------------------------------- - IF(mode > 0)THEN - DO iqty=1,nqty + if(mode > 0)then + do iqty=1,nqty f1(:,iqty)=6*(spl%fs(1:n,iqty)-spl%fs(0:n-1,iqty))*z*z1/d $ +spl%fs1(0:n-1,iqty)*z1*(3*z1-2) $ +spl%fs1(1:n,iqty)*z*(3*z-2) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c evaluate second derivatives. c----------------------------------------------------------------------- - IF(mode > 1)THEN - DO iqty=1,nqty + if(mode > 1)then + do iqty=1,nqty f2(:,iqty)=(6*(spl%fs(1:n,iqty)-spl%fs(0:n-1,iqty))*(z1-z)/d $ -spl%fs1(0:n-1,iqty)*(6*z1-2) $ +spl%fs1(1:n,iqty)*(6*z-2))/d - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c evaluate third derivatives. c----------------------------------------------------------------------- - IF(mode > 2)THEN - DO iqty=1,nqty + if(mode > 2)then + do iqty=1,nqty f3(:,iqty)=(12*(spl%fs(0:n-1,iqty)-spl%fs(1:n,iqty))/d $ +6*(spl%fs1(0:n-1,iqty)+spl%fs1(1:n,iqty)))/(d*d) - ENDDO - ENDIF + enddo + endif c----------------------------------------------------------------------- c restore powers. c----------------------------------------------------------------------- - DO iside=1,2 + do iside=1,2 dx=(spl%xs(0:spl%mx-1)+z*d(1:spl%mx))-spl%x0(iside) - DO iqty=1,spl%nqty - IF(spl%xpower(iside,iqty) == 0)CYCLE + do iqty=1,spl%nqty + if(spl%xpower(iside,iqty) == 0)cycle xfac=ABS(dx)**spl%xpower(iside,iqty) g=f(:,iqty)*xfac - IF(mode > 0)g1=(f1(:,iqty) + if(mode > 0)g1=(f1(:,iqty) $ +f(:,iqty)*spl%xpower(iside,iqty)/dx)*xfac - IF(mode > 1)g2=(f2(:,iqty)+spl%xpower(iside,iqty)/dx + if(mode > 1)g2=(f2(:,iqty)+spl%xpower(iside,iqty)/dx $ *(2*f1(:,iqty)+(spl%xpower(iside,iqty)-1) $ *f(:,iqty)/dx))*xfac $ - IF(mode > 2)g3=(f3(:,iqty)+spl%xpower(iside,iqty)/dx + if(mode > 2)g3=(f3(:,iqty)+spl%xpower(iside,iqty)/dx $ *(3*f2(:,iqty)+(spl%xpower(iside,iqty)-1)/dx $ *(3*f1(:,iqty)+(spl%xpower(iside,iqty)-2)/dx $ *f(:,iqty))))*xfac f(:,iqty)=g - IF(mode > 0)f1(:,iqty)=g1 - IF(mode > 1)f2(:,iqty)=g2 - IF(mode > 2)f3(:,iqty)=g3 - ENDDO - ENDDO + if(mode > 0)f1(:,iqty)=g1 + if(mode > 1)f2(:,iqty)=g2 + if(mode > 2)f3(:,iqty)=g3 + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_all_eval + return + end subroutine spline_all_eval c----------------------------------------------------------------------- c subprogram 11. spline_write1. c produces ascii and binary output for real cubic spline fits. @@ -1089,81 +1102,81 @@ END SUBROUTINE spline_all_eval c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_write1(spl,out,bin,iua,iub,interp) + subroutine spline_write1(spl,out,bin,iua,iub,interp) - TYPE(spline_type), INTENT(INOUT) :: spl - LOGICAL, INTENT(IN) :: out,bin - INTEGER, INTENT(IN) :: iua,iub - LOGICAL, INTENT(IN) :: interp + type(spline_type), intent(inout) :: spl + logical, intent(in) :: out,bin + integer, intent(in) :: iua,iub + logical, intent(in) :: interp - CHARACTER(30) :: format1,format2 - INTEGER :: i,j - REAL(r8) :: x,dx + character(30) :: format1,format2 + integer :: i,j + real(r8) :: x,dx c----------------------------------------------------------------------- c formats. c----------------------------------------------------------------------- - 10 FORMAT('(/3x,"ix",',i2.2,'(4x,a6,1x)/)') - 20 FORMAT('(i5,1p,',i2.2,'e11.3)') -! 30 FORMAT('(/3x,"ix",2x,"j",',i2.2,'(4x,a6,1x)/)') + 10 format('(/3x,"ix",',i2.2,'(4x,a6,1x)/)') + 20 format('(i5,1p,',i2.2,'e11.3)') +! 30 format('(/3x,"ix",2x,"j",',i2.2,'(4x,a6,1x)/)') c----------------------------------------------------------------------- c abort. c----------------------------------------------------------------------- - IF(.NOT.out.AND..NOT.bin)RETURN + if(.not.out.and..not.bin)return c----------------------------------------------------------------------- c print node values. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(format1,10)spl%nqty+1 - WRITE(format2,20)spl%nqty+1 - WRITE(iua,'(/1x,a)')'node values:' - WRITE(iua,format1)spl%title(0:spl%nqty) - ENDIF - DO i=0,spl%mx - CALL spline_eval(spl,spl%xs(i),0) - IF(out)WRITE(iua,format2)i,spl%xs(i),spl%f - IF(bin)WRITE(iub)REAL(spl%xs(i),4),REAL(spl%f,4) - ENDDO - IF(out)WRITE(iua,format1)spl%title(0:spl%nqty) - IF(bin)WRITE(iub) - IF(.NOT. interp)RETURN + if(out)then + write(format1,10)spl%nqty+1 + write(format2,20)spl%nqty+1 + write(iua,'(/1x,a)')'node values:' + write(iua,format1)spl%title(0:spl%nqty) + endif + do i=0,spl%mx + call spline_eval(spl,spl%xs(i),0) + if(out)write(iua,format2)i,spl%xs(i),spl%f + if(bin)write(iub)real(spl%xs(i),4),real(spl%f,4) + enddo + if(out)write(iua,format1)spl%title(0:spl%nqty) + if(bin)write(iub) + if(.not. interp)return c----------------------------------------------------------------------- c print header for interpolated values. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(iua,'(/1x,a)')'interpolated values:' - WRITE(iua,format1)spl%title(0:spl%nqty) - ENDIF + if(out)then + write(iua,'(/1x,a)')'interpolated values:' + write(iua,format1)spl%title(0:spl%nqty) + endif c----------------------------------------------------------------------- c print interpolated values. c----------------------------------------------------------------------- - DO i=0,spl%mx-1 + do i=0,spl%mx-1 dx=(spl%xs(i+1)-spl%xs(i))/4 - DO j=0,4 + do j=0,4 x=spl%xs(i)+j*dx - CALL spline_eval(spl,x,0) - IF(out)WRITE(iua,format2)i,x,spl%f - IF(bin)WRITE(iub)REAL(x,4),REAL(spl%f,4) - ENDDO - ENDDO + call spline_eval(spl,x,0) + if(out)write(iua,format2)i,x,spl%f + if(bin)write(iub)real(x,4),real(spl%f,4) + enddo + enddo c----------------------------------------------------------------------- c print final interpolated values. c----------------------------------------------------------------------- x=spl%xs(spl%mx) - CALL spline_eval(spl,x,0) - IF(out)THEN - WRITE(iua,format2)i,x,spl%f - WRITE(iua,format1)spl%title - ENDIF - IF(bin)THEN - WRITE(iub)REAL(x,4),REAL(spl%f,4) - WRITE(iub) - CALL bin_close(bin_unit) - ENDIF + call spline_eval(spl,x,0) + if(out)then + write(iua,format2)i,x,spl%f + write(iua,format1)spl%title + endif + if(bin)then + write(iub)real(x,4),real(spl%f,4) + write(iub) + call bin_close(bin_unit) + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_write1 + return + end subroutine spline_write1 c----------------------------------------------------------------------- c subprogram 12. spline_write2. c produces ascii and binary output for real cubic spline fits. @@ -1171,87 +1184,87 @@ END SUBROUTINE spline_write1 c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_write2(spl,out,bin,iua,iub,interp) + subroutine spline_write2(spl,out,bin,iua,iub,interp) - TYPE(spline_type), INTENT(INOUT) :: spl - LOGICAL, INTENT(IN) :: out,bin - INTEGER, INTENT(IN) :: iua,iub - LOGICAL, INTENT(IN) :: interp + type(spline_type), intent(inout) :: spl + logical, intent(in) :: out,bin + integer, intent(in) :: iua,iub + logical, intent(in) :: interp - CHARACTER(30) :: format1,format2 - INTEGER :: i,j,iz - REAL(r8) :: x,dx,z - REAL(r8), DIMENSION(spl%mx,spl%nqty) :: f, f1,f2,f3 - REAL(r8), DIMENSION(0:4*spl%mx,spl%nqty) :: g + character(30) :: format1,format2 + integer :: i,j,iz + real(r8) :: x,dx,z + real(r8), dimension(spl%mx,spl%nqty) :: f, f1,f2,f3 + real(r8), dimension(0:4*spl%mx,spl%nqty) :: g c----------------------------------------------------------------------- c formats. c----------------------------------------------------------------------- - 10 FORMAT('(/4x,"i",',i2.2,'(4x,a6,1x)/)') - 20 FORMAT('(i5,1p,',i2.2,'e11.3)') -! 30 FORMAT('(/4x,"i",2x,"j",',i2.2,'(4x,a6,1x)/)') + 10 format('(/4x,"i",',i2.2,'(4x,a6,1x)/)') + 20 format('(i5,1p,',i2.2,'e11.3)') +! 30 format('(/4x,"i",2x,"j",',i2.2,'(4x,a6,1x)/)') c----------------------------------------------------------------------- c compute values. c----------------------------------------------------------------------- z=0 - DO iz=0,3 - CALL spline_all_eval(spl,z,f,f1,f2,f3,0) + do iz=0,3 + call spline_all_eval(spl,z,f,f1,f2,f3,0) g(iz:4*spl%mx-1:4,:)=f z=z+.25_r8 - ENDDO - CALL spline_eval(spl,spl%xs(spl%mx),0) + enddo + call spline_eval(spl,spl%xs(spl%mx),0) g(4*spl%mx,:)=spl%f c----------------------------------------------------------------------- c print node values. c----------------------------------------------------------------------- - IF(.NOT.out.AND..NOT.bin)RETURN - IF(out)THEN - WRITE(format1,10)spl%nqty+1 - WRITE(format2,20)spl%nqty+1 - WRITE(iua,'(/1x,a)')'node values:' - WRITE(iua,format1)spl%title(0:spl%nqty) - ENDIF - DO i=0,spl%mx - IF(out)WRITE(iua,format2)i,spl%xs(i),g(4*i,:) - IF(bin)WRITE(iub)REAL(spl%xs(i),4),REAL(g(4*i,:),4) - ENDDO - IF(out)WRITE(iua,format1)spl%title(0:spl%nqty) - IF(bin)WRITE(iub) + if(.not.out.and..not.bin)return + if(out)then + write(format1,10)spl%nqty+1 + write(format2,20)spl%nqty+1 + write(iua,'(/1x,a)')'node values:' + write(iua,format1)spl%title(0:spl%nqty) + endif + do i=0,spl%mx + if(out)write(iua,format2)i,spl%xs(i),g(4*i,:) + if(bin)write(iub)real(spl%xs(i),4),real(g(4*i,:),4) + enddo + if(out)write(iua,format1)spl%title(0:spl%nqty) + if(bin)write(iub) c----------------------------------------------------------------------- c print header for interpolated values. c----------------------------------------------------------------------- - IF(.NOT. interp)RETURN - IF(out)THEN - WRITE(iua,'(/1x,a)')'interpolated values:' - WRITE(iua,format1)spl%title(0:spl%nqty) - ENDIF + if(.not. interp)return + if(out)then + write(iua,'(/1x,a)')'interpolated values:' + write(iua,format1)spl%title(0:spl%nqty) + endif c----------------------------------------------------------------------- c print interpolated values. c----------------------------------------------------------------------- - DO i=0,spl%mx-1 + do i=0,spl%mx-1 dx=(spl%xs(i+1)-spl%xs(i))/4 - DO j=0,4 + do j=0,4 x=spl%xs(i)+j*dx - IF(out)WRITE(iua,format2)i,x,g(4*i+j,:) - IF(bin)WRITE(iub)REAL(x,4),REAL(g(4*i+j,:),4) - ENDDO - IF(out)WRITE(iua,'(1x)') - ENDDO + if(out)write(iua,format2)i,x,g(4*i+j,:) + if(bin)write(iub)real(x,4),real(g(4*i+j,:),4) + enddo + if(out)write(iua,'(1x)') + enddo c----------------------------------------------------------------------- c print final interpolated values. c----------------------------------------------------------------------- - IF(out)THEN - WRITE(iua,format2)i,x,g(spl%mx*4,:) - WRITE(iua,format1)spl%title(0:spl%nqty) - ENDIF - IF(bin)THEN - WRITE(iub)REAL(x,4),REAL(g(spl%mx*4,:),4) - WRITE(iub) - ENDIF + if(out)then + write(iua,format2)i,x,g(spl%mx*4,:) + write(iua,format1)spl%title(0:spl%nqty) + endif + if(bin)then + write(iub)real(x,4),real(g(spl%mx*4,:),4) + write(iub) + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_write2 + return + end subroutine spline_write2 c----------------------------------------------------------------------- c subprogram 13. spline_int. c integrates real cubic splines. @@ -1259,54 +1272,54 @@ END SUBROUTINE spline_write2 c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_int(spl) + subroutine spline_int(spl) - TYPE(spline_type), INTENT(INOUT) :: spl + type(spline_type), intent(inout) :: spl - INTEGER :: ix,iqty,ig - REAL(r8), DIMENSION(spl%mx) :: dx - REAL(r8), DIMENSION(spl%mx,spl%nqty) :: term,f,f1,f2,f3 + integer :: ix,iqty,ig + real(r8), dimension(spl%mx) :: dx + real(r8), dimension(spl%mx,spl%nqty) :: term,f,f1,f2,f3 - INTEGER, PARAMETER :: mg=4 - REAL(r8), DIMENSION(mg) :: xg=(1+(/-0.861136311594053_r8, + integer, PARAMETER :: mg=4 + real(r8), dimension(mg) :: xg=(1+(/-0.861136311594053_r8, $ -0.339981043584856_r8,0.339981043584856_r8, $ 0.861136311594053_r8/))/2 - REAL(r8), DIMENSION(mg) :: wg=(/0.347854845137454_r8, + real(r8), dimension(mg) :: wg=(/0.347854845137454_r8, $ 0.652145154862546_r8,0.652145154862546_r8, $ 0.347854845137454_r8/)/2 c----------------------------------------------------------------------- c preliminary computations. c----------------------------------------------------------------------- - IF(.NOT.ALLOCATED(spl%fsi))ALLOCATE(spl%fsi(0:spl%mx,spl%nqty)) + if(.not.allocated(spl%fsi))allocate(spl%fsi(0:spl%mx,spl%nqty)) dx=spl%xs(1:spl%mx)-spl%xs(0:spl%mx-1) term=0 c----------------------------------------------------------------------- c compute integrals over intervals. c----------------------------------------------------------------------- - DO iqty=1,spl%nqty - IF(spl%xpower(1,iqty) == 0 .AND. spl%xpower(2,iqty) == 0)THEN + do iqty=1,spl%nqty + if(spl%xpower(1,iqty) == 0 .and. spl%xpower(2,iqty) == 0)then term(:,iqty)=dx/12 $ *(6*(spl%fs(0:spl%mx-1,iqty)+spl%fs(1:spl%mx,iqty)) $ +dx*(spl%fs1(0:spl%mx-1,iqty)-spl%fs1(1:spl%mx,iqty))) - ELSE - DO ig=1,mg - CALL spline_all_eval(spl,xg(ig),f,f1,f2,f3,0) + else + do ig=1,mg + call spline_all_eval(spl,xg(ig),f,f1,f2,f3,0) term(:,iqty)=term(:,iqty)+dx*wg(ig)*f(:,iqty) - ENDDO - ENDIF - ENDDO + enddo + endif + enddo c----------------------------------------------------------------------- c accumulate over intervals. c----------------------------------------------------------------------- spl%fsi(0,:)=0 - DO ix=1,spl%mx + do ix=1,spl%mx spl%fsi(ix,:)=spl%fsi(ix-1,:)+term(ix,:) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_int + return + end subroutine spline_int c----------------------------------------------------------------------- c subprogram 14. spline_triluf. c performs tridiagonal LU factorization. @@ -1314,40 +1327,40 @@ END SUBROUTINE spline_int c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_triluf(a) + subroutine spline_triluf(a) - REAL(r8), DIMENSION(-1:,:), INTENT(INOUT) :: a + real(r8), dimension(-1:,:), intent(inout) :: a - INTEGER :: i,j,k,jmin,jmax,n + integer :: i,j,k,jmin,jmax,n c----------------------------------------------------------------------- c begin loop over rows and define limits. c----------------------------------------------------------------------- n=SIZE(a,2) - DO i=1,n + do i=1,n jmin=MAX(1-i,-1) - jmax=MIN(n-i,1) + jmax=Min(n-i,1) c----------------------------------------------------------------------- c compute lower elements. c----------------------------------------------------------------------- - DO j=jmin,-1 - DO k=MAX(jmin,j-1),j-1 + do j=jmin,-1 + do k=MAX(jmin,j-1),j-1 a(j,i)=a(j,i)-a(k,i)*a(j-k,i+k) - ENDDO + enddo a(j,i)=a(j,i)*a(0,i+j) - ENDDO + enddo c----------------------------------------------------------------------- c compute diagonal element c----------------------------------------------------------------------- - DO k=MAX(jmin,-1),-1 + do k=MAX(jmin,-1),-1 a(0,i)=a(0,i)-a(k,i)*a(-k,i+k) - ENDDO + enddo a(0,i)=1/a(0,i) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_triluf + return + end subroutine spline_triluf c----------------------------------------------------------------------- c subprogram 15. spline_trilus. c performs tridiagonal LU solution. @@ -1355,35 +1368,35 @@ END SUBROUTINE spline_triluf c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_trilus(a,x) + subroutine spline_trilus(a,x) - REAL(r8), DIMENSION(-1:,:), INTENT(IN) :: a - REAL(r8), DIMENSION(:,:), INTENT(INOUT) :: x + real(r8), dimension(-1:,:), intent(in) :: a + real(r8), dimension(:,:), intent(inout) :: x - INTEGER :: i,j,n + integer :: i,j,n c----------------------------------------------------------------------- c down sweep. c----------------------------------------------------------------------- n=SIZE(a,2) - DO i=1,n - DO j=MAX(1-i,-1),-1 + do i=1,n + do j=MAX(1-i,-1),-1 x(i,:)=x(i,:)-a(j,i)*x(i+j,:) - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c up sweep. c----------------------------------------------------------------------- - DO i=n,1,-1 - DO j=1,MIN(n-i,1) + do i=n,1,-1 + do j=1,Min(n-i,1) x(i,:)=x(i,:)-a(j,i)*x(i+j,:) - ENDDO + enddo x(i,:)=x(i,:)*a(0,i) - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_trilus + return + end subroutine spline_trilus c----------------------------------------------------------------------- c subprogram 16. spline_sherman. c uses Sherman-Morrison formula to factor periodic matrix. @@ -1391,12 +1404,12 @@ END SUBROUTINE spline_trilus c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_sherman(a) + subroutine spline_sherman(a) - REAL(r8), DIMENSION(-1:,:), INTENT(INOUT) :: a + real(r8), dimension(-1:,:), intent(inout) :: a - INTEGER :: j,n - REAL(r8), DIMENSION(SIZE(a,2),1) :: u + integer :: j,n + real(r8), dimension(SIZE(a,2),1) :: u c----------------------------------------------------------------------- c prepare matrices. c----------------------------------------------------------------------- @@ -1404,14 +1417,14 @@ SUBROUTINE spline_sherman(a) a(0,1)=a(0,1)-a(-1,1) a(0,n)=a(0,n)-a(-1,1) u=RESHAPE((/one,(zero,j=2,n-1),one/),SHAPE(u)) - CALL spline_triluf(a) - CALL spline_trilus(a,u) + call spline_triluf(a) + call spline_trilus(a,u) a(-1,1)=a(-1,1)/(1+a(-1,1)*(u(1,1)+u(n,1))) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_sherman + return + end subroutine spline_sherman c----------------------------------------------------------------------- c subprogram 17. spline_morrison. c uses Sherman-Morrison formula to solve periodic matrix. @@ -1419,27 +1432,27 @@ END SUBROUTINE spline_sherman c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_morrison(a,x) + subroutine spline_morrison(a,x) - REAL(r8), DIMENSION(-1:,:), INTENT(IN) :: a - REAL(r8), DIMENSION(:,:), INTENT(INOUT) :: x + real(r8), dimension(-1:,:), intent(in) :: a + real(r8), dimension(:,:), intent(inout) :: x - INTEGER :: n - REAL(r8), DIMENSION(SIZE(x,1),SIZE(x,2)) :: y + integer :: n + real(r8), dimension(SIZE(x,1),SIZE(x,2)) :: y c----------------------------------------------------------------------- c solve for x. c----------------------------------------------------------------------- n=SIZE(a,2) y=x - CALL spline_trilus(a,y) + call spline_trilus(a,y) x(1,:)=x(1,:)-a(-1,1)*(y(1,:)+y(n,:)) x(n,:)=x(n,:)-a(-1,1)*(y(1,:)+y(n,:)) - CALL spline_trilus(a,x) + call spline_trilus(a,x) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_morrison + return + end subroutine spline_morrison c----------------------------------------------------------------------- c subprogram 18. spline_copy. c copies one spline_type to another. @@ -1447,15 +1460,15 @@ END SUBROUTINE spline_morrison c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_copy(spl1,spl2) + subroutine spline_copy(spl1,spl2) - TYPE(spline_type), INTENT(IN) :: spl1 - TYPE(spline_type), INTENT(INOUT) :: spl2 + type(spline_type), intent(in) :: spl1 + type(spline_type), intent(inout) :: spl2 c----------------------------------------------------------------------- c computations. c----------------------------------------------------------------------- - IF(ALLOCATED(spl2%xs))CALL spline_dealloc(spl2) - CALL spline_alloc(spl2,spl1%mx,spl1%nqty) + if(allocated(spl2%xs))call spline_dealloc(spl2) + call spline_alloc(spl2,spl1%mx,spl1%nqty) spl2%xs=spl1%xs spl2%fs=spl1%fs spl2%fs1=spl1%fs1 @@ -1467,8 +1480,8 @@ SUBROUTINE spline_copy(spl1,spl2) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_copy + return + end subroutine spline_copy c----------------------------------------------------------------------- c subprogram 19. spline_fill_matrix. c fill local matrix into global matrix. @@ -1476,28 +1489,28 @@ END SUBROUTINE spline_copy c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_fill_matrix(mat,locmat,istart,jstart,kl,ku) - INTEGER :: istart,jstart,itot,jtot,i,j,kl,ku,m,n,offset - REAL(r8), DIMENSION(:,:), ALLOCATABLE,INTENT(INOUT) :: mat - REAL(r8), DIMENSION(:,:), ALLOCATABLE,INTENT(IN) :: locmat + subroutine spline_fill_matrix(mat,locmat,istart,jstart,kl,ku) + integer :: istart,jstart,itot,jtot,i,j,kl,ku,m,n,offset + real(r8), dimension(:,:), allocatable,intent(inout) :: mat + real(r8), dimension(:,:), allocatable,intent(in) :: locmat c----------------------------------------------------------------------- c fill matrix. c----------------------------------------------------------------------- itot=SIZE(locmat,1) jtot=SIZE(locmat,2) offset=kl+ku+1 - DO m=1, itot + do m=1, itot i=m+istart-1 - DO n=1, jtot + do n=1, jtot j=n+jstart-1 mat(offset+i-j,j)=mat(offset+i-j,j)+locmat(m,n) - ENDDO - ENDDO + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_fill_matrix + return + end subroutine spline_fill_matrix c----------------------------------------------------------------------- c subprogram 20. spline_get_yp. c get yi' with four points for spline boundary condtion . @@ -1505,17 +1518,17 @@ END SUBROUTINE spline_fill_matrix c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_get_yp(x,y,xi,yip,nqty) - INTEGER, INTENT(IN) :: nqty - INTEGER :: n,nrhs,lda,info,ldb,i - INTEGER, DIMENSION(4) :: ipiv - REAL(r8) :: dx - REAL(r8), INTENT(IN) :: xi - REAL(r8), DIMENSION(nqty),INTENT(OUT) :: yip - REAL(r8), DIMENSION(4), INTENT(IN) :: x - REAL(r8), DIMENSION(4,nqty), INTENT(IN) :: y - REAL(r8), DIMENSION(4,nqty) :: b - REAL(r8), DIMENSION(4,4) :: a + subroutine spline_get_yp(x,y,xi,yip,nqty) + integer, intent(in) :: nqty + integer :: n,nrhs,lda,info,ldb,i + integer, dimension(4) :: ipiv + real(r8) :: dx + real(r8), intent(in) :: xi + real(r8), dimension(nqty),intent(out) :: yip + real(r8), dimension(4), intent(in) :: x + real(r8), dimension(4,nqty), intent(in) :: y + real(r8), dimension(4,nqty) :: b + real(r8), dimension(4,4) :: a n=4 nrhs=nqty lda=N @@ -1525,22 +1538,22 @@ SUBROUTINE spline_get_yp(x,y,xi,yip,nqty) a(1,4)=1 b(1,:)=y(1,:) - DO i=2,n + do i=2,n dx=x(i)-x(1) a(i,1)=dx*dx*dx a(i,2)=dx*dx a(i,3)=dx a(i,4)=1 b(i,:)=y(i,:) - ENDDO - CALL dgesv(n,nrhs,a,lda,ipiv,b,ldb,info) + enddo + call dgesv(n,nrhs,a,lda,ipiv,b,ldb,info) dx=xi-x(1) yip=(3*b(1,:)*dx+2*b(2,:))*dx+b(3,:) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_get_yp + return + end subroutine spline_get_yp c----------------------------------------------------------------------- c subprogram 21. spline_thomas. c thomas method to solve tri-diagnol matrix. @@ -1548,13 +1561,13 @@ END SUBROUTINE spline_get_yp c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_thomas(l,d,u,b,n,m) + subroutine spline_thomas(l,d,u,b,n,m) - INTEGER, INTENT(IN):: n,m - REAL(r8), DIMENSION(n), INTENT(INOUT):: d - REAL(r8), DIMENSION(n-1), INTENT(INOUT):: l,u - REAL(r8), DIMENSION(n,m), INTENT(INOUT):: b - INTEGER:: i + integer, intent(in):: n,m + real(r8), dimension(n), intent(inout):: d + real(r8), dimension(n-1), intent(inout):: l,u + real(r8), dimension(n,m), intent(inout):: b + integer:: i c----------------------------------------------------------------------- c calculate tri-diagno matrix c l=[A(1,2),A(2,3),...,A(n-1,n)]; @@ -1562,21 +1575,21 @@ SUBROUTINE spline_thomas(l,d,u,b,n,m) c u=[A(2,1),A(3,2),...,A(n,n-1)]; c b is n row m column matrix c----------------------------------------------------------------------- - DO i = 2, n + do i = 2, n l(i-1) = l(i-1)/d(i-1) d(i) = d(i) - u(i-1) * l(i-1) b(i,:) = b(i,:) - b(i-1,:) * l(i-1) - ENDDO + enddo b(n,:) = b(n,:) / d(n); - DO i = n-1, 1, -1 + do i = n-1, 1, -1 b(i,:) = (b(i,:) - u(i) * b(i+1,:)) / d(i); - ENDDO + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_thomas + return + end subroutine spline_thomas c----------------------------------------------------------------------- c subprogram 22. spline_roots. c Calculate all the roots of a cubic spline. @@ -1589,41 +1602,41 @@ END SUBROUTINE spline_thomas c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_roots(spl, iqty, nroots, roots,op_extrap,op_eps) + subroutine spline_roots(spl, iqty, nroots, roots,op_extrap,op_eps) - TYPE(spline_type), INTENT(INOUT) :: spl - INTEGER, INTENT(IN):: iqty - INTEGER, INTENT(OUT) :: nroots - REAL(r8), DIMENSION(*), INTENT(OUT):: roots - !^^^^ should be DIMENSION(1:spl%mx*3) ^^^^ - LOGICAL, INTENT(IN), OPTIONAL :: op_extrap - REAL(r8), INTENT(IN), OPTIONAL :: op_eps + type(spline_type), intent(inout) :: spl + integer, intent(in):: iqty + integer, intent(out) :: nroots + real(r8), dimension(*), intent(out):: roots + !^^^^ should be dimension(1:spl%mx*3) ^^^^ + logical, intent(in), optional :: op_extrap + real(r8), intent(in), optional :: op_eps - LOGICAL, PARAMETER :: debug = .FALSE. + logical, PARAMETER :: debug = .false. - LOGICAL :: extrap - INTEGER:: ix, jroot, lx, nzvalid - REAL(r8):: f_0, f1_0, f_1, f1_1, + logical :: extrap + integer:: ix, jroot, lx, nzvalid + real(r8):: f_0, f1_0, f_1, f1_1, $ c3, c2, c1, c0, a, b, c, q, r, m, s, t, theta, $ z1, z2, z3, x1, x2, x3, last1, last2, last3, $ dx, eps, tol - INTEGER, DIMENSION(:), ALLOCATABLE :: index - REAL(r8), DIMENSION(:), ALLOCATABLE :: tmproots + integer, dimension(:), allocatable :: index + real(r8), dimension(:), allocatable :: tmproots ! allow optional accuracy manipulation repeated solutions ! within eps*stepsize are rejected - IF(PRESENT(op_eps))THEN + if(present(op_eps))then eps = op_eps - ELSE + else eps = 1e-6 - ENDIF + endif ! allow optional extrapolation beyond ends of the spline - IF(PRESENT(op_extrap))THEN + if(present(op_extrap))then extrap = op_extrap - ELSE - extrap = .FALSE. - ENDIF + else + extrap = .false. + endif roots(1:spl%mx*3) = spl%xs(0) - HUGE(last1) last1 = spl%xs(0) - HUGE(last1) @@ -1632,7 +1645,7 @@ SUBROUTINE spline_roots(spl, iqty, nroots, roots,op_extrap,op_eps) lx = spl%mx-1 jroot = 0 ! find the analytic roots of a cubic polynomial between each knot - DO ix=0, lx + do ix=0, lx nzvalid = 0 ! step size and associated tolerance for repeated roots dx=spl%xs(ix+1)-spl%xs(ix) @@ -1657,31 +1670,31 @@ SUBROUTINE spline_roots(spl, iqty, nroots, roots,op_extrap,op_eps) c1 = dx*f1_0 c0 = f_0 ! we have to watch out for secret reductions! - IF(c3==0)THEN - IF(debug) PRINT *, " >> Spline quadratic @",spl%xs(ix) + if(c3==0)then + if(debug) PRinT *, " >> Spline quadratic @",spl%xs(ix) a = c2 b = c1 c = c0 - IF(b**2 - 4.0*a*c >= 0)THEN + if(b**2 - 4.0*a*c >= 0)then z1 = (-b + sqrt(b**2 - 4.0*a*c)) / (2.0 * a) z2 = (-b - sqrt(b**2 - 4.0*a*c)) / (2.0 * a) nzvalid = 2 - ELSEIF(a==0)THEN - IF(debug) PRINT *, " >> Spline linear @",spl%xs(ix) + elseif(a==0)then + if(debug) PRinT *, " >> Spline linear @",spl%xs(ix) z1 = -c / b z2 = -huge(z2) nzvalid = 1 - ELSEIF(a==0 .and. b==0 .and. c==0)THEN - IF(debug) PRINT *, " >> Spline all 0 @",spl%xs(ix) + elseif(a==0 .and. b==0 .and. c==0)then + if(debug) PRinT *, " >> Spline all 0 @",spl%xs(ix) z1 = 0 nzvalid = 1 - ELSE + else z1 = -huge(z1) z2 = -huge(z2) nzvalid = 0 - ENDIF + endif z3 = -huge(z3) - ELSE + else ! truely a cubic case ! since we want f = 0 we can normalize out the c3 ! so 0 = z^3 + a z^2 + b z + c @@ -1692,22 +1705,22 @@ SUBROUTINE spline_roots(spl, iqty, nroots, roots,op_extrap,op_eps) q = (a * a - 3.0 * b) / 9.0 r = (2.0 * a * a * a - 9.0 * a * b + 27.0 * c) / 54.0 m = r**2 - q**3 ! discrimenent - IF(m > 0)THEN ! one real root + if(m > 0)then ! one real root s = -sign(1.0_r8, r) * (abs(r) + sqrt(m))**(1.0/3.0) t = q / s z1 = s + t - (a / 3.0) z2 = -huge(z2) z3 = -huge(z3) nzvalid = 1 - ELSE ! three real roots (watch out for repeates) + else ! three real roots (watch out for repeates) theta = acos(r / sqrt(q**3)) z1 = -2*sqrt(q)*cos(theta/3.0) - a/3.0 z2 = -2*sqrt(q)*cos((theta+twopi)/3.0) - a/3.0 z3 = -2*sqrt(q)*cos((theta-twopi)/3.0) - a/3.0 nzvalid = 3 - IF(abs(z2-z3) f zero crossing between",spl%xs(ix),spl%xs(ix+1) - PRINT *," >> f_0, f_1 =",f_0,f_1 - PRINT *," >> nzvalid =",nzvalid - PRINT *," >> z1, z2, z3 = ",z1,z2,z3 - PRINT *," >> c3,c2,c1,c0 =",c3,c2,c1,c0 - ENDIF - IF(nzvalid>0 .AND. (z1>-eps .OR. (ix==0 .AND. extrap)))THEN - IF(z1<=1+eps .OR. (ix==lx .AND. extrap)) THEN - IF(debug) PRINT '(a12,es17.8e3,a4,es17.8e3,a15,'// + if(debug .and. (f_0*f_1 <= 0))then + PRinT *," > f zero crossing between",spl%xs(ix),spl%xs(ix+1) + PRinT *," >> f_0, f_1 =",f_0,f_1 + PRinT *," >> nzvalid =",nzvalid + PRinT *," >> z1, z2, z3 = ",z1,z2,z3 + PRinT *," >> c3,c2,c1,c0 =",c3,c2,c1,c0 + endif + if(nzvalid>0 .and. (z1>-eps .OR. (ix==0 .and. extrap)))then + if(z1<=1+eps .OR. (ix==lx .and. extrap)) then + if(debug) PRinT '(a12,es17.8e3,a4,es17.8e3,a15,'// $ 'I3,a1,I3,a11,es13.4e3,a1,es13.4)', $ " > Found z1",z1,", x1",x1," between knots ",ix,",", $ ix+1," where x =",spl%xs(ix),",",spl%xs(ix+1) ! refine solution numerically ! (analytics vs reality of interp) - CALL spline_refine_root(spl,iqty,x1) + call spline_refine_root(spl,iqty,x1) ! avoid repeated left/right solutions at a f=0 knot - IF(abs(last1-x1)>tol .AND. abs(last2-x1)>tol .AND. - $ abs(last3-x1)>tol) THEN + if(abs(last1-x1)>tol .and. abs(last2-x1)>tol .and. + $ abs(last3-x1)>tol) then jroot = jroot + 1 roots(jroot) = x1 - ENDIF - ENDIF - ENDIF - IF(nzvalid>1 .AND. (z2>-eps .OR. (ix==0 .AND. extrap)))THEN - IF(z2<=1+eps .OR. (ix==lx .AND. extrap)) THEN - IF(debug) PRINT '(a12,es17.8e3,a4,es17.8e3,a15,'// + endif + endif + endif + if(nzvalid>1 .and. (z2>-eps .OR. (ix==0 .and. extrap)))then + if(z2<=1+eps .OR. (ix==lx .and. extrap)) then + if(debug) PRinT '(a12,es17.8e3,a4,es17.8e3,a15,'// $ 'I3,a1,I3,a11,es13.4e3,a1,es13.4)', $ " > Found z2",z2,", x2",x2," between knots ",ix, $ ",",ix+1," where x =",spl%xs(ix),",",spl%xs(ix+1) ! refine solution numerically ! (analytics vs reality of interp) - CALL spline_refine_root(spl,iqty,x2) + call spline_refine_root(spl,iqty,x2) ! avoid double roots or repeats right at a knot location - IF(abs(last1-x2)>tol .AND. abs(last2-x2)>tol .AND. - $ abs(last3-x2)>tol .AND. abs(x1-x2)>tol) THEN + if(abs(last1-x2)>tol .and. abs(last2-x2)>tol .and. + $ abs(last3-x2)>tol .and. abs(x1-x2)>tol) then jroot = jroot + 1 roots(jroot) = x2 - ENDIF - ENDIF - ENDIF - IF(nzvalid>2 .AND. (z3>-eps .OR. (ix==0 .AND. extrap)))THEN - IF(z3<=1+eps .OR. (ix==lx .AND. extrap)) THEN - IF(debug) PRINT '(a12,es17.8e3,a4,es17.8e3,a15,'// + endif + endif + endif + if(nzvalid>2 .and. (z3>-eps .OR. (ix==0 .and. extrap)))then + if(z3<=1+eps .OR. (ix==lx .and. extrap)) then + if(debug) PRinT '(a12,es17.8e3,a4,es17.8e3,a15,'// $ 'I3,a1,I3,a11,es13.4e3,a1,es13.4)', $ " > Found z3",z3,", x3",x3," between knots ",ix, $ ",",ix+1," where x =",spl%xs(ix),",",spl%xs(ix+1) ! refine solution numerically ! (analytics vs reality of interp) - CALL spline_refine_root(spl,iqty,x3) + call spline_refine_root(spl,iqty,x3) ! avoid double roots or repeats right at a knot location - IF(abs(last1-x3)>tol .AND. abs(last2-x3)>tol .AND. - $ abs(last3-x3)>tol .AND. abs(x1-x3)>tol .AND. - $ abs(x2-x3)>tol) THEN + if(abs(last1-x3)>tol .and. abs(last2-x3)>tol .and. + $ abs(last3-x3)>tol .and. abs(x1-x3)>tol .and. + $ abs(x2-x3)>tol) then jroot = jroot + 1 roots(jroot) = x3 - ENDIF - ENDIF - ENDIF + endif + endif + endif last1 = roots(max(1,jroot)) last2 = roots(max(1,jroot-1)) last3 = roots(max(1,jroot-2)) - ENDDO + enddo nroots = jroot ! sort the roots lowest to highest - ALLOCATE(index(nroots), tmproots(nroots)) + allocate(index(nroots), tmproots(nroots)) index=(/(ix,ix=1,nroots)/) tmproots(1:nroots) = roots(1:nroots) - CALL bubble_sort(tmproots,index,1,nroots) - DO ix=1,nroots + call bubble_sort(tmproots,index,1,nroots) + do ix=1,nroots tmproots(ix) = roots(index(nroots + 1 - ix)) - ENDDO + enddo roots(1:nroots) = tmproots(1:nroots) - IF(nroots>0 .AND. debug) - $ PRINT *," > Sorted roots are",roots(1:nroots) - DEALLOCATE(index, tmproots) + if(nroots>0 .and. debug) + $ PRinT *," > Sorted roots are",roots(1:nroots) + deallocate(index, tmproots) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_roots + return + end subroutine spline_roots c----------------------------------------------------------------------- c subprogram 23. spline_refine_root. @@ -1806,54 +1819,54 @@ END SUBROUTINE spline_roots c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE spline_refine_root(spl, iqty, x, op_tol) + subroutine spline_refine_root(spl, iqty, x, op_tol) - TYPE(spline_type), INTENT(INOUT) :: spl - INTEGER, INTENT(IN):: iqty - REAL(r8), INTENT(INOUT) :: x - REAL(r8), INTENT(IN), OPTIONAL :: op_tol + type(spline_type), intent(inout) :: spl + integer, intent(in):: iqty + real(r8), intent(inout) :: x + real(r8), intent(in), optional :: op_tol ! declare variables - INTEGER :: it - INTEGER, PARAMETER :: itmax=500 - REAL(r8) :: tol=1e-12 - REAL(r8) :: dx,lx,lf,f,df + integer :: it + integer, PARAMETER :: itmax=500 + real(r8) :: tol=1e-12 + real(r8) :: dx,lx,lf,f,df ! set optional tolerance tol = 1e-12 - IF(PRESENT(op_tol)) tol = op_tol + if(present(op_tol)) tol = op_tol ! if its exact, we don't need to do anything - CALL spline_eval(spl,x,1) - IF(spl%f(iqty) == 0) RETURN + call spline_eval(spl,x,1) + if(spl%f(iqty) == 0) return ! otherwise, we'll iterate lx=spl%xs(spl%ix+1)-spl%xs(spl%ix) ! note ix set in above eval lf = maxval(spl%fs(:,iqty))-minval(spl%fs(:,iqty)) dx=lx f=huge(f) it=0 - DO - CALL spline_eval(spl,x,1) + do + call spline_eval(spl,x,1) df=spl%f(iqty)-f - !IF(abs(dx) < tol*lx .OR. abs(df) < tol*lf .OR. it >= itmax)EXIT - IF(abs(dx) <= abs(tol*lx) .OR. it >= itmax)EXIT + !if(abs(dx) < tol*lx .OR. abs(df) < tol*lf .OR. it >= itmax)EXIT + if(abs(dx) <= abs(tol*lx) .OR. it >= itmax)EXIT it=it+1 f=spl%f(iqty) dx=-spl%f(iqty)/spl%f1(iqty) x=x+dx - ENDDO + enddo ! abort on failure. - IF(it >= itmax)THEN - WRITE(*,*) - WRITE(*,*) "!! WARNING: root refining convergence failure" - WRITE(*,*) " -> estimated root ",x, + if(it >= itmax)then + write(*,*) + write(*,*) "!! WARNinG: root refining convergence failure" + write(*,*) " -> estimated root ",x, $ " has error/tol ",abs(dx)/(tol*lx),abs(df)/(tol*lf) - WRITE(*,*) - ENDIF + write(*,*) + endif c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE spline_refine_root + return + end subroutine spline_refine_root c----------------------------------------------------------------------- c subprogram 24. bubble_sort. c performs a bubble sort in decreasing order of value. @@ -1861,33 +1874,33 @@ END SUBROUTINE spline_refine_root c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- - SUBROUTINE bubble_sort(key,index,mmin,mmax) + subroutine bubble_sort(key,index,mmin,mmax) - REAL(r8), DIMENSION(:), INTENT(IN) :: key - INTEGER, DIMENSION(:), INTENT(INOUT) :: index - INTEGER :: mmin,mmax + real(r8), dimension(:), intent(in) :: key + integer, dimension(:), intent(inout) :: index + integer :: mmin,mmax - LOGICAL :: switch - INTEGER :: i,temp + logical :: switch + integer :: i,temp c----------------------------------------------------------------------- c computations. c----------------------------------------------------------------------- - switch= .TRUE. - DO while(switch) - switch= .FALSE. - DO i=mmin,mmax-1 - IF(key(index(i)) < key(index(i+1)))THEN + switch= .true. + do while(switch) + switch= .false. + do i=mmin,mmax-1 + if(key(index(i)) < key(index(i+1)))then temp=index(i) index(i)=index(i+1) index(i+1)=temp - switch= .TRUE. - ENDIF - ENDDO - ENDDO + switch= .true. + endif + enddo + enddo c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- - RETURN - END SUBROUTINE bubble_sort + return + end subroutine bubble_sort c----------------------------------------------------------------------- - END MODULE spline_mod + end module spline_mod diff --git a/src/Splines/fortran/spline_c_api.f b/src/Splines/fortran/spline_c_api.f index 5bc1eade3..430024962 100644 --- a/src/Splines/fortran/spline_c_api.f +++ b/src/Splines/fortran/spline_c_api.f @@ -14,21 +14,31 @@ c 6. spline_c_eval_deriv c 7. spline_c_eval_deriv2 c 8. spline_c_eval_deriv3 -c 9. cspline_c_create -c 10. cspline_c_destroy -c 11. cspline_c_setup -c 12. cspline_c_fit -c 13. cspline_c_eval -c 14. cspline_c_eval_deriv -c 15. cspline_c_eval_deriv2 -c 16. cspline_c_eval_deriv3 -c 17. bicube_c_create -c 18. bicube_c_destroy -c 19. bicube_c_setup -c 20. bicube_c_fit -c 21. bicube_c_eval -c 22. bicube_c_eval_deriv -c 23. bicube_c_eval_deriv2 +c 9. spline_c_int +c 10. cspline_c_create +c 11. cspline_c_destroy +c 12. cspline_c_setup +c 13. cspline_c_fit +c 14. cspline_c_eval +c 15. cspline_c_eval_deriv +c 16. cspline_c_eval_deriv2 +c 17. cspline_c_eval_deriv3 +c 18. cspline_c_int +c 19. bicube_c_create +c 20. bicube_c_destroy +c 21. bicube_c_setup +c 22. bicube_c_fit +c 23. bicube_c_eval +c 24. bicube_c_eval_deriv +c 25. bicube_c_eval_deriv2 +c 26. fspline_c_create +c 27. fspline_c_destroy +c 28. fspline_c_setup +c 29. fspline_c_fit_1 +c 30. fspline_c_fit_2 +c 31. fspline_c_eval +c 32. fspline_c_eval_deriv +c 33. fspline_c_eval_deriv2 c----------------------------------------------------------------------- c subprogram 0. spline_c_api_mod c module declarations. @@ -38,6 +48,7 @@ module spline_c_api_mod use spline_mod use cspline_mod use bicube_mod + use fspline_mod implicit none c----------------------------------------------------------------------- c declarations. @@ -159,15 +170,17 @@ end subroutine spline_c_setup c subprogram 4. spline_c_fit c fits the spline to the data. c----------------------------------------------------------------------- - subroutine spline_c_fit(handle, endmode) bind(C) + subroutine spline_c_fit(handle, endmode, fs1_out) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle integer(c_int), value :: endmode - type(spline_type), pointer :: spl + type(c_ptr), value :: fs1_out - character(10) :: endmode_str + type(spline_type), pointer :: spl + real(c_double), pointer :: fs1_out_fort(:,:) + integer :: mx, nqty c----------------------------------------------------------------------- c work. c----------------------------------------------------------------------- @@ -178,21 +191,23 @@ subroutine spline_c_fit(handle, endmode) bind(C) return end if - select case(endmode) - case(1) - endmode_str = "natural" - case(2) - endmode_str = "periodic" - case(3) - endmode_str = "extrap" - case(4) - endmode_str = "not-a-knot" - end select + + call spline_fit(spl, endmode) + + + mx = spl%mx + nqty = spl%nqty + + call c_f_pointer(fs1_out, fs1_out_fort, [mx+1, nqty]) + + fs1_out_fort = spl%fs1 + if (debug) then - print *, "spline_c_fit: fitting spline with endmode = " - $ // TRIM(endmode_str) + print '(A,*(I0,1X))', "fs1_out_fort dims :", + $ size(fs1_out_fort,1), size(fs1_out_fort,2) + print '(A,*(I0,1X))', "spl%fs1 dims :", + $ size(spl%fs1,1), size(spl%fs1,2) end if - call spline_fit(spl, TRIM(endmode_str)) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- @@ -202,16 +217,15 @@ end subroutine spline_c_fit c subprogram 5. spline_c_eval c evaluates the spline at a given point. c----------------------------------------------------------------------- - subroutine spline_c_eval(handle, x, f, ix_op) bind(C) + subroutine spline_c_eval(handle, x, f) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline + real(c_double), pointer :: fi(:) type(spline_type), pointer :: spl c----------------------------------------------------------------------- @@ -226,17 +240,8 @@ subroutine spline_c_eval(handle, x, f, ix_op) bind(C) call c_f_pointer(f, fi, [spl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - call spline_eval_external(spl, x, ix, fi) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [spl%nqty]) + call spline_eval_external(spl, x, fi) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- @@ -246,16 +251,14 @@ end subroutine spline_c_eval c subprogram 6. spline_c_eval_deriv c evaluates the spline and its first derivative at a given point. c----------------------------------------------------------------------- - subroutine spline_c_eval_deriv(handle, x, f, f1, ix_op) bind(C) + subroutine spline_c_eval_deriv(handle, x, f, f1) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f, f1 - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline real(c_double), pointer :: fi(:), f1i(:) type(spline_type), pointer :: spl c----------------------------------------------------------------------- @@ -271,40 +274,26 @@ subroutine spline_c_eval_deriv(handle, x, f, f1, ix_op) bind(C) call c_f_pointer(f, fi, [spl%nqty]) call c_f_pointer(f1, f1i, [spl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - - call spline_eval_external(spl, x, ix, fi, f1i) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [spl%nqty]) - call c_f_pointer(f1, f1i, [spl%nqty]) - + call spline_eval_external(spl, x, fi, f1i) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return end subroutine spline_c_eval_deriv c----------------------------------------------------------------------- -c subprogram 7. spline_c_eval_deriv_2 +c subprogram 7. spline_c_eval_deriv2 c evaluates the spline and its first and\ c second derivatives at a given point. c----------------------------------------------------------------------- - subroutine spline_c_eval_deriv_2(handle, x, f, f1, - $ f2, ix_op) bind(C) + subroutine spline_c_eval_deriv2(handle, x, f, f1, + $ f2) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f, f1, f2 - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline real(c_double), pointer :: fi(:), f1i(:), f2i(:) type(spline_type), pointer :: spl c----------------------------------------------------------------------- @@ -321,40 +310,27 @@ subroutine spline_c_eval_deriv_2(handle, x, f, f1, call c_f_pointer(f1, f1i, [spl%nqty]) call c_f_pointer(f2, f2i, [spl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - - call spline_eval_external(spl, x, ix, fi, f1i, f2i) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [spl%nqty]) - call c_f_pointer(f1, f1i, [spl%nqty]) - call c_f_pointer(f2, f2i, [spl%nqty]) + call spline_eval_external(spl, x, fi, f1i, f2i) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return - end subroutine spline_c_eval_deriv_2 + end subroutine spline_c_eval_deriv2 c----------------------------------------------------------------------- -c subprogram 8. spline_c_eval_deriv_3 +c subprogram 8. spline_c_eval_deriv3 c evaluates the spline and its first derivative at a given point. c----------------------------------------------------------------------- - subroutine spline_c_eval_deriv_3(handle, x, f, f1, - $ f2, f3, ix_op) bind(C) + subroutine spline_c_eval_deriv3(handle, x, f, f1, + $ f2, f3) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f, f1, f2, f3 - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline + real(c_double), pointer :: fi(:), f1i(:), f2i(:), f3i(:) type(spline_type), pointer :: spl c----------------------------------------------------------------------- @@ -372,27 +348,50 @@ subroutine spline_c_eval_deriv_3(handle, x, f, f1, call c_f_pointer(f2, f2i, [spl%nqty]) call c_f_pointer(f3, f3i, [spl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - call spline_eval_external(spl, x, ix, fi, f1i, f2i, f3i) + call spline_eval_external(spl, x, fi, f1i, f2i, f3i) + c----------------------------------------------------------------------- -c copy results back to the C pointer. +c terminate. c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [spl%nqty]) - call c_f_pointer(f1, f1i, [spl%nqty]) - call c_f_pointer(f2, f2i, [spl%nqty]) - call c_f_pointer(f3, f3i, [spl%nqty]) + return + end subroutine spline_c_eval_deriv3 +c----------------------------------------------------------------------- +c subprogram 9. spline_c_int +c integrates the spline and returns the results. +c----------------------------------------------------------------------- + subroutine spline_c_int(handle, fsi_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + type(c_ptr), value :: fsi_out + type(spline_type), pointer :: spl + real(c_double), pointer :: fsi_out_fort(:,:) + integer :: mx, nqty, i, j +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, spl) + if (.not. associated(spl)) then + print *, "spline_c_int: handle is not associated." + return + end if + + call spline_int(spl) + + mx = spl%mx + nqty = spl%nqty + + call c_f_pointer(fsi_out, fsi_out_fort, [mx+1, nqty]) + + fsi_out_fort = spl%fsi c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return - end subroutine spline_c_eval_deriv_3 - + end subroutine spline_c_int c----------------------------------------------------------------------- c Complex Cubic Spline API @@ -401,7 +400,7 @@ end subroutine spline_c_eval_deriv_3 c----------------------------------------------------------------------- -c subprogram 9. cspline_c_create +c subprogram 10. cspline_c_create c allocates a spline object c----------------------------------------------------------------------- subroutine cspline_c_create(mx, nqty, handle) bind(C) @@ -421,7 +420,7 @@ subroutine cspline_c_create(mx, nqty, handle) bind(C) return end subroutine cspline_c_create c----------------------------------------------------------------------- -c subprogram 10. cspline_c_destroy +c subprogram 11. cspline_c_destroy c deallocates a spline object c----------------------------------------------------------------------- subroutine cspline_c_destroy(handle) bind(C) @@ -445,7 +444,7 @@ subroutine cspline_c_destroy(handle) bind(C) return end subroutine cspline_c_destroy c----------------------------------------------------------------------- -c subprogram 11. cspline_c_setup +c subprogram 12. cspline_c_setup c sets up the spline object with data. c----------------------------------------------------------------------- subroutine cspline_c_setup(handle, xs, fs) bind(C) @@ -495,21 +494,24 @@ subroutine cspline_c_setup(handle, xs, fs) bind(C) return end subroutine cspline_c_setup c----------------------------------------------------------------------- -c subprogram 12. spline_c_fit +c subprogram 13. cspline_c_fit c fits the spline to the data. c----------------------------------------------------------------------- - subroutine cspline_c_fit(handle, endmode) bind(C) + subroutine cspline_c_fit(handle, endmode,fs1_out) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle integer(c_int), value :: endmode - type(cspline_type), pointer :: cspl + type(c_ptr), value :: fs1_out - character(10) :: endmode_str + type(cspline_type), pointer :: cspl + complex(c_double), pointer :: fs1_out_fort(:,:) + integer :: mx, nqty c----------------------------------------------------------------------- c work. c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, cspl) if (.not. associated(cspl)) then print *, "cspline_c_fit: handle is not associated " @@ -517,40 +519,31 @@ subroutine cspline_c_fit(handle, endmode) bind(C) return end if - select case(endmode) - case(1) - endmode_str = "natural" - case(2) - endmode_str = "periodic" - case(3) - endmode_str = "extrap" - case(4) - endmode_str = "not-a-knot" - end select - if (debug) then - print *, "cspline_c_fit: fitting spline with endmode = " - $ // TRIM(endmode_str) - end if - call cspline_fit(cspl, TRIM(endmode_str)) + call cspline_fit(cspl, endmode) + + mx = cspl%mx + nqty = cspl%nqty + + call c_f_pointer(fs1_out, fs1_out_fort, [mx+1, nqty]) + + fs1_out_fort = cspl%fs1 c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return end subroutine cspline_c_fit c----------------------------------------------------------------------- -c subprogram 13. cspline_c_eval +c subprogram 14. cspline_c_eval c evaluates the spline at a given point. c----------------------------------------------------------------------- - subroutine cspline_c_eval(handle, x, f, ix_op) bind(C) + subroutine cspline_c_eval(handle, x, f) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline complex(c_double), pointer :: fi(:) type(cspline_type), pointer :: cspl c----------------------------------------------------------------------- @@ -565,36 +558,24 @@ subroutine cspline_c_eval(handle, x, f, ix_op) bind(C) call c_f_pointer(f, fi, [cspl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - - call cspline_eval_external(cspl, x, ix, fi) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [cspl%nqty]) + call cspline_eval_external(cspl, x, fi) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return end subroutine cspline_c_eval c----------------------------------------------------------------------- -c subprogram 14. cspline_c_eval_deriv +c subprogram 15. cspline_c_eval_deriv c evaluates the spline and its first derivative at a given point. c----------------------------------------------------------------------- - subroutine cspline_c_eval_deriv(handle, x, f, f1, ix_op) bind(C) + subroutine cspline_c_eval_deriv(handle, x, f, f1) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f, f1 - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline complex(c_double), pointer :: fi(:), f1i(:) type(cspline_type), pointer :: cspl c----------------------------------------------------------------------- @@ -610,40 +591,28 @@ subroutine cspline_c_eval_deriv(handle, x, f, f1, ix_op) bind(C) call c_f_pointer(f, fi, [cspl%nqty]) call c_f_pointer(f1, f1i, [cspl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - - call cspline_eval_external(cspl, x, ix, fi, f1i) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [cspl%nqty]) - call c_f_pointer(f1, f1i, [cspl%nqty]) + + call cspline_eval_external(cspl, x, fi, f1i) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return end subroutine cspline_c_eval_deriv c----------------------------------------------------------------------- -c subprogram 15. cspline_c_eval_deriv_2 +c subprogram 16. cspline_c_eval_deriv2 c evaluates the spline and its first and\ c second derivatives at a given point. c----------------------------------------------------------------------- - subroutine cspline_c_eval_deriv_2(handle, x, f, f1, - $ f2, ix_op) bind(C) + subroutine cspline_c_eval_deriv2(handle, x, f, f1, + $ f2) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f, f1, f2 - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline complex(c_double), pointer :: fi(:), f1i(:), f2i(:) type(cspline_type), pointer :: cspl c----------------------------------------------------------------------- @@ -660,40 +629,26 @@ subroutine cspline_c_eval_deriv_2(handle, x, f, f1, call c_f_pointer(f1, f1i, [cspl%nqty]) call c_f_pointer(f2, f2i, [cspl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - - call cspline_eval_external(cspl, x, ix, fi, f1i, f2i) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [cspl%nqty]) - call c_f_pointer(f1, f1i, [cspl%nqty]) - call c_f_pointer(f2, f2i, [cspl%nqty]) + call cspline_eval_external(cspl, x, fi, f1i, f2i) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return - end subroutine cspline_c_eval_deriv_2 + end subroutine cspline_c_eval_deriv2 c----------------------------------------------------------------------- -c subprogram 16. cspline_c_eval_deriv_3 +c subprogram 17. cspline_c_eval_deriv3 c evaluates the spline and its first derivative at a given point. c----------------------------------------------------------------------- - subroutine cspline_c_eval_deriv_3(handle, x, f, f1, - $ f2, f3, ix_op) bind(C) + subroutine cspline_c_eval_deriv3(handle, x, f, f1, + $ f2, f3) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x type(c_ptr), value :: f, f1, f2, f3 - integer(c_int), intent(in), optional :: ix_op - integer(i4) :: ix ! index of x position in the spline complex(c_double), pointer :: fi(:), f1i(:), f2i(:), f3i(:) type(cspline_type), pointer :: cspl c----------------------------------------------------------------------- @@ -711,26 +666,50 @@ subroutine cspline_c_eval_deriv_3(handle, x, f, f1, call c_f_pointer(f2, f2i, [cspl%nqty]) call c_f_pointer(f3, f3i, [cspl%nqty]) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if + call cspline_eval_external(cspl, x, fi, f1i, f2i, f3i) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine cspline_c_eval_deriv3 +c----------------------------------------------------------------------- +c subprogram 18. cspline_c_int +c integrates the complex spline and returns the results. +c----------------------------------------------------------------------- + subroutine cspline_c_int(handle, fsi_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + use iso_c_binding, only: c_ptr, c_f_pointer, c_double_complex + type(spline_handle), value :: handle + type(c_ptr), value :: fsi_out - call cspline_eval_external(cspl, x, ix, fi, f1i, f2i, f3i) + type(cspline_type), pointer :: cspl + complex(c_double_complex), pointer :: fsi_out_fort(:,:) + integer :: mx, nqty, i, j c----------------------------------------------------------------------- -c copy results back to the C pointer. +c work. c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [cspl%nqty]) - call c_f_pointer(f1, f1i, [cspl%nqty]) - call c_f_pointer(f2, f2i, [cspl%nqty]) - call c_f_pointer(f3, f3i, [cspl%nqty]) + call c_f_pointer(handle%obj, cspl) + if (.not. associated(cspl)) then + print *, "cspline_c_int: handle is not associated." + return + end if + call cspline_int(cspl) + + mx = cspl%mx + nqty = cspl%nqty + + call c_f_pointer(fsi_out, fsi_out_fort, [mx+1, nqty]) + + fsi_out_fort = cspl%fsi c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return - end subroutine cspline_c_eval_deriv_3 + end subroutine cspline_c_int + c----------------------------------------------------------------------- c Bicubic Spline API @@ -738,7 +717,7 @@ end subroutine cspline_c_eval_deriv_3 c----------------------------------------------------------------------- c----------------------------------------------------------------------- -c subprogram 17. bicube_c_create +c subprogram 19. bicube_c_create c allocates a bicubic spline object c----------------------------------------------------------------------- subroutine bicube_c_create(mx, my, nqty, handle) bind(C) @@ -758,7 +737,7 @@ subroutine bicube_c_create(mx, my, nqty, handle) bind(C) return end subroutine bicube_c_create c----------------------------------------------------------------------- -c subprogram 18. bicube_c_destroy +c subprogram 20. bicube_c_destroy c deallocates a bicubic spline object c----------------------------------------------------------------------- subroutine bicube_c_destroy(handle) bind(C) @@ -782,7 +761,7 @@ subroutine bicube_c_destroy(handle) bind(C) return end subroutine bicube_c_destroy c----------------------------------------------------------------------- -c subprogram 19. bicube_c_setup +c subprogram 21. bicube_c_setup c sets up the bicubic spline object with data. c----------------------------------------------------------------------- subroutine bicube_c_setup(handle, xs, ys, fs) bind(C) @@ -840,18 +819,23 @@ subroutine bicube_c_setup(handle, xs, ys, fs) bind(C) return end subroutine bicube_c_setup c----------------------------------------------------------------------- -c subprogram 20. bicube_c_fit +c subprogram 22. bicube_c_fit c fits the bicubic spline to the data. c----------------------------------------------------------------------- - subroutine bicube_c_fit(handle, endmode1, endmode2) bind(C) + subroutine bicube_c_fit(handle, endmode1, endmode2 + $ , fsx, fsy, fsxy) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle integer(c_int), value :: endmode1, endmode2 - type(bicube_type), pointer :: bicube + type(c_ptr), value :: fsx,fsy,fsxy - character(10) :: endmode1_str, endmode2_str + type(bicube_type), pointer :: bicube + real(c_double), pointer :: fsx_f(:,:,:) + real(c_double), pointer :: fsy_f(:,:,:) + real(c_double), pointer :: fsxy_f(:,:,:) + integer(i8) :: mx, my, nqty c----------------------------------------------------------------------- c work. c----------------------------------------------------------------------- @@ -862,53 +846,46 @@ subroutine bicube_c_fit(handle, endmode1, endmode2) bind(C) return end if - select case(endmode1) - case(1) - endmode1_str = "natural" - case(2) - endmode1_str = "periodic" - case(3) - endmode1_str = "extrap" - case(4) - endmode1_str = "not-a-knot" - end select - select case(endmode2) - case(1) - endmode2_str = "natural" - case(2) - endmode2_str = "periodic" - case(3) - endmode2_str = "extrap" - case(4) - endmode2_str = "not-a-knot" - end select + call bicube_fit(bicube, endmode1, endmode2) + + mx = bicube%mx + my = bicube%my + nqty = bicube%nqty + call c_f_pointer(fsx, fsx_f, [mx+1, my+1, nqty]) + call c_f_pointer(fsy, fsy_f, [mx+1, my+1, nqty]) + call c_f_pointer(fsxy, fsxy_f, [mx+1, my+1, nqty]) if (debug) then - print *, "bicube_c_fit: fitting spline with endmode1 = " - $ // TRIM(endmode1_str) // " and endmode2 = " - $ // TRIM(endmode2_str) + print *, "Pointer shapes" + print *, "shape(fsx_f) =", shape(fsx_f) + print *, "shape(fsy_f) =", shape(fsy_f) + print *, "shape(fsxy_f) =", shape(fsxy_f) + + print *, "== Field shapes in bicube type ==" + print *, "shape(bicube%fsx) =", shape(bicube%fsx) + print *, "shape(bicube%fsy) =", shape(bicube%fsy) + print *, "shape(bicube%fsxy) =", shape(bicube%fsxy) end if - call bicube_fit(bicube, TRIM(endmode1_str), TRIM(endmode2_str)) + fsx_f = bicube%fsx + fsy_f = bicube%fsy + fsxy_f = bicube%fsxy c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return end subroutine bicube_c_fit c----------------------------------------------------------------------- -c subprogram 21. bicube_c_eval +c subprogram 23. bicube_c_eval c evaluates the bicubic spline at a given point. c----------------------------------------------------------------------- - subroutine bicube_c_eval(handle, x, y, f, ix_op, iy_op) bind(C) + subroutine bicube_c_eval(handle, x, y, f) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x, y type(c_ptr), value :: f - integer(c_int), intent(in), optional :: ix_op, iy_op - integer(i4) :: ix ! index of x position in the spline - integer(i4) :: iy ! index of y position in the spline real(c_double), pointer :: fi(:) real(r8), pointer :: fix(:), fiy(:), fxy(:), fxx(:), fyy(:) type(bicube_type), pointer :: bicube @@ -922,49 +899,28 @@ subroutine bicube_c_eval(handle, x, y, f, ix_op, iy_op) bind(C) return end if - call c_f_pointer(f, fi, [bicube%nqty]) - allocate(fix(bicube%nqty), fiy(bicube%nqty)) - allocate(fxy(bicube%nqty), fxx(bicube%nqty), fyy(bicube%nqty)) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if + call c_f_pointer(f, fi, [bicube%nqty]) - if (present(iy_op)) then - iy = iy_op - else - iy = 0 - end if + call bicube_eval_external(bicube, x, y, 0, fi) - call bicube_eval_external(bicube, x, y, 0, ix, iy, fi, fix, fiy, - $ fxy, fxx, fyy) - deallocate(fix, fiy) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [bicube%nqty]) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return end subroutine bicube_c_eval c----------------------------------------------------------------------- -c subprogram 22. bicube_c_eval_deriv +c subprogram 24. bicube_c_eval_deriv c evaluates the bicube and its first derivative at a given point. c----------------------------------------------------------------------- subroutine bicube_c_eval_deriv(handle, x, y, - $ f, f1x, f1y, ix_op, iy_op) bind(C) + $ f, f1x, f1y) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x, y type(c_ptr), value :: f, f1x, f1y - integer(c_int), intent(in), optional :: ix_op, iy_op - integer(i4) :: ix ! index of x position in the spline - integer(i4) :: iy ! index of y position in the spline real(c_double), pointer :: fi(:), f1xi(:), f1yi(:) real(r8), pointer :: fxy(:), fxx(:), fyy(:) type(bicube_type), pointer :: bicube @@ -983,27 +939,8 @@ subroutine bicube_c_eval_deriv(handle, x, y, call c_f_pointer(f1y, f1yi, [bicube%nqty]) allocate(fxy(bicube%nqty), fxx(bicube%nqty), fyy(bicube%nqty)) - if (present(ix_op)) then - ix = ix_op - else - ix = 0 - end if - - if (present(iy_op)) then - iy = iy_op - else - iy = 0 - end if - call bicube_eval_external(bicube, x, y, 1, ix, iy, fi, f1xi, f1yi, - $ fxy, fxx, fyy) - deallocate(fxy, fxx, fyy) -c----------------------------------------------------------------------- -c copy results back to the C pointer. -c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [bicube%nqty]) - call c_f_pointer(f1x, f1xi, [bicube%nqty]) - call c_f_pointer(f1y, f1yi, [bicube%nqty]) + call bicube_eval_external(bicube, x, y, 1, fi, f1xi, f1yi) c----------------------------------------------------------------------- c terminate. @@ -1011,21 +948,18 @@ subroutine bicube_c_eval_deriv(handle, x, y, return end subroutine bicube_c_eval_deriv c----------------------------------------------------------------------- -c subprogram 23. bicube_c_eval_deriv2 +c subprogram 25. bicube_c_eval_deriv2 c evaluates the bicube and its derivatives at a given point. c----------------------------------------------------------------------- subroutine bicube_c_eval_deriv2(handle, x, y, f, f1x, f1y, - $ f2xx, f2xy, f2yy, ix_op, iy_op) bind(C) + $ f2xx, f2xy, f2yy) bind(C) c----------------------------------------------------------------------- c declarations. c----------------------------------------------------------------------- type(spline_handle), value :: handle real(c_double), value :: x, y type(c_ptr), value :: f, f1x, f1y, f2xx, f2xy, f2yy - integer(c_int), intent(in), optional :: ix_op, iy_op - integer(i4) :: ix ! index of x position in the spline - integer(i4) :: iy ! index of y position in the spline real(c_double), pointer :: fi(:), f1xi(:), f1yi(:) real(c_double), pointer :: f2xxi(:), f2xyi(:), f2yyi(:) type(bicube_type), pointer :: bicube @@ -1046,35 +980,344 @@ subroutine bicube_c_eval_deriv2(handle, x, y, f, f1x, f1y, call c_f_pointer(f2xy, f2xyi, [bicube%nqty]) call c_f_pointer(f2yy, f2yyi, [bicube%nqty]) - if (present(ix_op)) then - ix = ix_op + + call bicube_eval_external(bicube, x, y, 2, fi, f1xi, f1yi, + $ f2xxi, f2xyi, f2yyi) + +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine bicube_c_eval_deriv2 + + + +c----------------------------------------------------------------------- +c Fourier Spline API +c This section includes the C API for fspline.f. +c----------------------------------------------------------------------- + +c----------------------------------------------------------------------- +c subprogram 26. fspline_c_create +c allocates a fourier spline object +c----------------------------------------------------------------------- + subroutine fspline_c_create(mx, my, mband, nqty, handle) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + integer(c_int), value :: mx, my, mband, nqty + type(spline_handle), intent(out) :: handle + type(fspline_type), pointer :: fst + + allocate(fst) + call fspline_alloc(fst, mx, my, mband, nqty) + handle%obj = c_loc(fst) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_create + +c----------------------------------------------------------------------- +c subprogram 27. fspline_c_destroy +c deallocates a fourier spline object +c----------------------------------------------------------------------- + subroutine fspline_c_destroy(handle) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + type(fspline_type), pointer :: fst + + call c_f_pointer(handle%obj, fst) + if (associated(fst)) then + call fspline_dealloc(fst) + deallocate(fst) else - ix = 0 + print *, "fspline_c_destroy: handle is not associated " + $ // "with a valid fourier spline object." end if +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_destroy - if (present(iy_op)) then - iy = iy_op - else - iy = 0 +c----------------------------------------------------------------------- +c subprogram 28. fspline_c_setup +c sets up the fourier spline object with data. +c----------------------------------------------------------------------- + subroutine fspline_c_setup(handle, xs, ys, fs) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + type(c_ptr), value :: xs, ys, fs + + type(fspline_type), pointer :: fst + real(c_double), pointer :: x_c(:), y_c(:) + real(c_double), pointer :: f_c(:, :, :) + integer :: mx, my, nqty +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_setup: handle is not associated." + return end if - call bicube_eval_external(bicube, x, y, 2, ix, iy, fi, f1xi, f1yi, - $ f2xxi, f2xyi, f2yyi) + mx = fst%mx + my = fst%my + nqty = fst%nqty + + call c_f_pointer(xs, x_c, [mx+1]) + call c_f_pointer(ys, y_c, [my+1]) + call c_f_pointer(fs, f_c, [mx+1, my+1, nqty]) + + ! notE: The data is COPIED from the C pointers to the Fortran + ! allocated arrays. This is the safe and correct way to handle memory, + ! preventing crashes on deallocation. + fst%xs(0:mx) = x_c(1:mx+1) + fst%ys(0:my) = y_c(1:my+1) + fst%fs(0:mx, 0:my, 1:nqty) = f_c(1:mx+1, 1:my+1, 1:nqty) +c------------------------------------------------------------------------ +c terminate. +c------------------------------------------------------------------------ + return + end subroutine fspline_c_setup + c----------------------------------------------------------------------- -c copy results back to the C pointer. +c subprogram 29. fspline_c_fit_1 +c fits the fourier spline using method 1. c----------------------------------------------------------------------- - call c_f_pointer(f, fi, [bicube%nqty]) - call c_f_pointer(f1x, f1xi, [bicube%nqty]) - call c_f_pointer(f1y, f1yi, [bicube%nqty]) - call c_f_pointer(f2xx, f2xxi, [bicube%nqty]) - call c_f_pointer(f2xy, f2xyi, [bicube%nqty]) - call c_f_pointer(f2yy, f2yyi, [bicube%nqty]) + subroutine fspline_c_fit_1(handle, endmode, fit_flag_c) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + integer(c_int), value :: endmode + logical(c_bool), value :: fit_flag_c + type(fspline_type), pointer :: fst + logical :: fit_flag +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_fit_1: handle is not associated." + return + end if + + fit_flag = fit_flag_c + call fspline_fit_1(fst, endmode, fit_flag) c----------------------------------------------------------------------- c terminate. c----------------------------------------------------------------------- return - end subroutine bicube_c_eval_deriv2 + end subroutine fspline_c_fit_1 + +c----------------------------------------------------------------------- +c subprogram 30. fspline_c_fit_2 +c fits the fourier spline using method 2 (FFT). +c----------------------------------------------------------------------- + subroutine fspline_c_fit_2(handle, endmode, fit_flag_c) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + integer(c_int), value :: endmode + logical(c_bool), value :: fit_flag_c + type(fspline_type), pointer :: fst + logical :: fit_flag +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_fit_2: handle is not associated." + return + end if + + fit_flag = fit_flag_c + call fspline_fit_2(fst, endmode, fit_flag) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_fit_2 +c----------------------------------------------------------------------- +c subprogram 31. fspline_c_eval +c evaluates the fourier spline at a given point. +c----------------------------------------------------------------------- + subroutine fspline_c_eval(handle, x, y, f_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + real(c_double), value :: x, y + type(c_ptr), value :: f_out + + + real(c_double), pointer :: f_f(:) + type(fspline_type), pointer :: fst +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_eval: handle is not associated." + return + end if + + call c_f_pointer(f_out, f_f, [fst%nqty]) + + + call fspline_eval_external(fst, x, y, 0, f_f) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_eval + +c----------------------------------------------------------------------- +c subprogram 32. fspline_c_eval_deriv +c evaluates the fourier spline and its first derivatives. +c----------------------------------------------------------------------- + subroutine fspline_c_eval_deriv(handle, x, y, f_out, + $ fx_out, fy_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + real(c_double), value :: x, y + type(c_ptr), value :: f_out, fx_out, fy_out + + type(fspline_type), pointer :: fst + real(c_double), pointer :: f_f(:), f_fx(:), f_fy(:) +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_eval_deriv: handle is not associated." + return + end if + + call c_f_pointer(f_out, f_f, [fst%nqty]) + call c_f_pointer(fx_out, f_fx, [fst%nqty]) + call c_f_pointer(fy_out, f_fy, [fst%nqty]) + + + call fspline_eval_external(fst, x, y, 1, f_f, f_fx, f_fy) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_eval_deriv + +c----------------------------------------------------------------------- +c subprogram 33. fspline_c_eval_deriv2 +c evaluates the fourier spline and its second derivatives. +c----------------------------------------------------------------------- + subroutine fspline_c_eval_deriv2(handle, x, y, f_out, + $ fx_out, fy_out, fxx_out, fxy_out, fyy_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value :: handle + real(c_double), value :: x, y + type(c_ptr), value :: f_out, fx_out, fy_out + type(c_ptr), value :: fxx_out, fxy_out, fyy_out + + integer(i4) :: s_ix + real(c_double), pointer :: f_f(:), f_fx(:), f_fy(:) + real(c_double), pointer :: f_fxx(:), f_fxy(:), f_fyy(:) + type(fspline_type), pointer :: fst +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_eval_deriv2: handle is not associated." + return + end if + + call c_f_pointer(f_out, f_f, [fst%nqty]) + call c_f_pointer(fx_out, f_fx, [fst%nqty]) + call c_f_pointer(fy_out, f_fy, [fst%nqty]) + call c_f_pointer(fxx_out, f_fxx, [fst%nqty]) + call c_f_pointer(fxy_out, f_fxy, [fst%nqty]) + call c_f_pointer(fyy_out, f_fyy, [fst%nqty]) + + call fspline_eval_external(fst, x, y, 2, f_f, f_fx, f_fy, + $ f_fxx, f_fxy, f_fyy) +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_eval_deriv2 +c----------------------------------------------------------------------- +c subprogram 34. fspline_c_get_cspline_handle +c gets a handle to the internal cspline object. +c----------------------------------------------------------------------- + subroutine fspline_c_get_cspline_handle(handle, + $ cs_handle_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value, intent(in) :: handle + type(spline_handle), intent(out) :: cs_handle_out + + type(fspline_type), pointer :: fst +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + + call c_f_pointer(handle%obj, fst) + + ! Return the C address of the cspline_type component + cs_handle_out%obj = c_loc(fst%cs) + +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_get_cspline_handle +c----------------------------------------------------------------------- +c subprogram 35. fspline_c_get_cspline_fs +c gets a copy of the fourier coefficients (fs from cspline). +c----------------------------------------------------------------------- + subroutine fspline_c_get_cspline_fs(handle, fs_out) bind(C) +c----------------------------------------------------------------------- +c declarations. +c----------------------------------------------------------------------- + type(spline_handle), value, intent(in) :: handle + type(c_ptr), value, intent(in) :: fs_out + + type(fspline_type), pointer :: fst + complex(c_double_complex), pointer :: fs_out_fort(:,:) + integer :: cs_mx, cs_nqty +c----------------------------------------------------------------------- +c work. +c----------------------------------------------------------------------- + call c_f_pointer(handle%obj, fst) + if (.not. associated(fst)) then + print *, "fspline_c_get_cspline_fs: invalid handle." + return + end if + + cs_mx = fst%cs%mx + cs_nqty = fst%cs%nqty + call c_f_pointer(fs_out, fs_out_fort, [cs_mx+1, cs_nqty]) + + fs_out_fort = fst%cs%fs +c----------------------------------------------------------------------- +c terminate. +c----------------------------------------------------------------------- + return + end subroutine fspline_c_get_cspline_fs c----------------------------------------------------------------------- end module spline_c_api_mod