diff --git a/Manifest.toml b/Manifest.toml index 4375000..f30a246 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,39 +1,42 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.0" +julia_version = "1.11.1" manifest_format = "2.0" -project_hash = "7d1ba2483e6ee20f9bd06aae356903d7e540f599" +project_hash = "12bacc9f7a3024e6d7a84766247f5ca88c289b1c" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" +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.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.4" +version = "0.7.6" [[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" +version = "0.3.1" [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+1" +version = "1.1.1+0" [[deps.Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" [[deps.DiffResults]] deps = ["StaticArraysCore"] @@ -49,9 +52,9 @@ version = "1.15.1" [[deps.Distances]] deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.11" +version = "0.10.12" [deps.Distances.extensions] DistancesChainRulesCoreExt = "ChainRulesCore" @@ -95,12 +98,13 @@ version = "1.0.0" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558" +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.10.0" +version = "1.13.0" [deps.FillArrays.extensions] FillArraysPDMatsExt = "PDMats" @@ -114,18 +118,14 @@ version = "1.10.0" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.36" +version = "0.10.38" weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] ForwardDiffStaticArraysExt = "StaticArrays" -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - [[deps.IrrationalConstants]] git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" @@ -133,9 +133,9 @@ version = "0.2.2" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" +version = "1.6.1" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] @@ -145,16 +145,17 @@ 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.4.0+0" +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.6.4+0" +version = "1.7.2+0" [[deps.LibSSH2_jll]] deps = ["Artifacts", "Libdl", "MbedTLS_jll"] @@ -163,12 +164,13 @@ version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +git-tree-sha1 = "61dfdba58e585066d8bce214c5a51eaa0539f269" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.17.0+0" +version = "1.17.0+1" [[deps.LightXML]] deps = ["Libdl", "XML2_jll"] @@ -179,12 +181,13 @@ version = "0.9.1" [[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 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.27" +version = "0.3.29" [deps.LogExpFunctions.extensions] LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -198,6 +201,7 @@ version = "0.3.27" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -208,15 +212,16 @@ version = "0.5.13" [[deps.Markdown]] deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" [[deps.MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+1" +version = "2.28.6+0" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.1.10" +version = "2023.12.12" [[deps.NaNMath]] deps = ["OpenLibm_jll"] @@ -226,9 +231,9 @@ version = "1.0.2" [[deps.NearestNeighbors]] deps = ["Distances", "StaticArrays"] -git-tree-sha1 = "ded64ff6d4fdd1cb68dfcbb818c69e144a5b2e4c" +git-tree-sha1 = "8a3271d8309285f4db73b4f662b1b290c715e85e" uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" -version = "0.4.16" +version = "0.4.21" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" @@ -237,7 +242,7 @@ version = "1.2.0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+2" +version = "0.3.27+1" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] @@ -256,9 +261,15 @@ uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.6.3" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +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.10.0" +version = "1.11.0" + + [deps.Pkg.extensions] + REPLExt = "REPL" + + [deps.Pkg.weakdeps] + REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.PrecompileTools]] deps = ["Preferences"] @@ -275,14 +286,12 @@ version = "1.4.3" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "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.Reexport]] git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" @@ -295,26 +304,24 @@ version = "0.7.0" [[deps.SIMD]] deps = ["PrecompileTools"] -git-tree-sha1 = "d8911cc125da009051fb35322415641d02d9e37f" +git-tree-sha1 = "52af86e35dd1b177d051b12681e1c581f53c281b" uuid = "fdea26ae-647d-5447-a871-4b548cad5224" -version = "3.4.6" +version = "3.7.0" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.10.0" +version = "1.11.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.3.1" +version = "2.5.0" [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -324,9 +331,9 @@ version = "2.3.1" [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" +version = "1.9.8" [deps.StaticArrays.extensions] StaticArraysChainRulesCoreExt = "ChainRulesCore" @@ -337,14 +344,19 @@ version = "1.9.3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" +version = "1.4.3" [[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.10.0" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -355,7 +367,7 @@ version = "1.7.0" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.2.1+1" +version = "7.7.0+0" [[deps.TOML]] deps = ["Dates"] @@ -373,25 +385,19 @@ git-tree-sha1 = "957f256fb380cad64cae4da39e562ecfb5c3fec9" uuid = "48a634ad-e948-5137-8d70-aa71f2a747f4" version = "1.16.1" -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - [[deps.TranscodingStreams]] -git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349" +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.10.7" -weakdeps = ["Random", "Test"] - - [deps.TranscodingStreams.extensions] - TestExt = ["Test", "Random"] +version = "0.11.3" [[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.VTKBase]] git-tree-sha1 = "c2d0db3ef09f1942d08ea455a9e252594be5f3b6" @@ -400,15 +406,15 @@ version = "1.0.1" [[deps.WriteVTK]] deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams", "VTKBase"] -git-tree-sha1 = "48b9e8e9c83865e99e57f027d4edfa94e0acddae" +git-tree-sha1 = "1d8042d58334ab7947ce505709df7009da6f3375" uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" -version = "1.19.1" +version = "1.21.1" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" +git-tree-sha1 = "a2fccc6559132927d4c5dc183e3e01048c6dcbd6" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.6+0" +version = "2.13.5+0" [[deps.Zlib_jll]] deps = ["Libdl"] @@ -418,12 +424,12 @@ version = "1.2.13+1" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" +version = "5.11.0+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.52.0+1" +version = "1.59.0+0" [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] diff --git a/Project.toml b/Project.toml index 6e1eacc..2dd2c3c 100644 --- a/Project.toml +++ b/Project.toml @@ -6,10 +6,12 @@ version = "1.0.0" [deps] Ferrite = "c061ca5d-56c9-439f-9c0e-210fe06d3992" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" [compat] Ferrite = "1.0" OrderedCollections = "1" +StaticArraysCore = "1.4.3" julia = "1.10" [extras] diff --git a/docs/src/reference/cellvalues.md b/docs/src/reference/cellvalues.md index 5f62539..7464bd8 100644 --- a/docs/src/reference/cellvalues.md +++ b/docs/src/reference/cellvalues.md @@ -14,6 +14,7 @@ function_value_average function_gradient_average function_value_jump function_gradient_jump +midplane_rotation getdetJdV_average get_side_and_baseindex ``` \ No newline at end of file diff --git a/src/FerriteInterfaceElements.jl b/src/FerriteInterfaceElements.jl index db4e242..a315887 100644 --- a/src/FerriteInterfaceElements.jl +++ b/src/FerriteInterfaceElements.jl @@ -1,11 +1,10 @@ module FerriteInterfaceElements -import Ferrite -import Ferrite: AbstractCell, AbstractRefShape, AbstractCellValues, +import Ferrite: Ferrite, AbstractCell, AbstractRefShape, AbstractCellValues, RefLine, RefQuadrilateral, RefTriangle, RefPrism, RefHexahedron, Line, QuadraticLine, Triangle, QuadraticTriangle, Quadrilateral, QuadraticQuadrilateral, Tetrahedron, Hexahedron, ScalarInterpolation, VectorizedInterpolation, Lagrange, - CellValues, QuadratureRule, CellCache, Grid, ExclusiveTopology, FacetIndex, Vec, + CellValues, QuadratureRule, CellCache, Grid, ExclusiveTopology, FacetIndex, Vec, Tensor, getnbasefunctions, getngeobasefunctions, getorder, n_components, getrefshape, vertexdof_indices, edgedof_interior_indices, facedof_interior_indices, volumedof_interior_indices, vertices, facets, edges, @@ -13,28 +12,28 @@ import Ferrite: AbstractCell, AbstractRefShape, AbstractCellValues, checkbounds, checkquadpoint, function_value_init, function_gradient_init, shape_value_type, shape_gradient_type, reinit!, getnquadpoints, getdetJdV, shape_value, shape_gradient, function_value, function_gradient, - getcellset, getcells, getneighborhood + getcellset, getcells, getneighborhood, + ×, norm import OrderedCollections: OrderedSet +import StaticArraysCore: SMatrix, SVector include("cells.jl") +export InterfaceCell + include("interpolations.jl") -include("cellvalues.jl") -include("grid.jl") +export InterfaceCellInterpolation -export - InterfaceCell, - InterfaceCellInterpolation, - InterfaceCellValues, +include("cellvalues.jl") +export InterfaceCellValues, get_side_and_baseindex, - shape_value_average, - shape_gradient_average, - shape_value_jump, - shape_gradient_jump, - function_value_average, - function_gradient_average, - function_value_jump, - function_gradient_jump, - getdetJdV_average, - insert_interfaces + shape_value_average, shape_gradient_average, + shape_value_jump, shape_gradient_jump, + function_value_average, function_gradient_average, + function_value_jump, function_gradient_jump, + midplane_rotation, + getdetJdV_average + +include("grid.jl") +export insert_interfaces end diff --git a/src/cellvalues.jl b/src/cellvalues.jl index 532051b..d1b1cee 100644 --- a/src/cellvalues.jl +++ b/src/cellvalues.jl @@ -4,6 +4,8 @@ An `InterfaceCellValues` is based on two `CellValues`: one for each facet of an `InterfaceCell`. Since one can use the same `CellValues` for both sides, be default the same object is used for better performance. The keyword argument `use_same_cv` can be set to `false` to disable this behavior, if needed. +Furthermore, the rotation matrix of the midplane in the quadrature points can be computed. +To do so, set `include_R=true`. # Fields - `ip::InterfaceCellInterpolation`: interpolation on the interface @@ -12,30 +14,47 @@ The keyword argument `use_same_cv` can be set to `false` to disable this behavio - `base_indices_here::Vector{Int}`: base function indices on facet "here" - `base_indices_there::Vector{Int}`: base function indices on facet "there" - `sides_and_baseindices::Tuple`: side and base function for the base `CellValues` for each base function of the `InterfaceCellValues` +- `R::Union{AbstractVector,Nothing}`: rotation matrix of the midplane in the quadrature points """ -struct InterfaceCellValues{CV} <: AbstractCellValues +struct InterfaceCellValues{CV,TR} <: AbstractCellValues here::CV there::CV base_indices_here::Vector{Int} base_indices_there::Vector{Int} sides_and_baseindices::Tuple + R::TR # Union{AbstractVector,Nothing} Rotation matrix in quadrature points - function InterfaceCellValues(ip::IP, here::CV; use_same_cv) where {IP<:InterfaceCellInterpolation, CV<:CellValues} - sides_and_baseindices = Tuple( get_side_and_baseindex(ip, i) for i in 1:getnbasefunctions(ip) ) - base_indices_here = collect( get_interface_index(ip, :here, i) for i in 1:getnbasefunctions(ip.base) ) - base_indices_there = collect( get_interface_index(ip, :there, i) for i in 1:getnbasefunctions(ip.base) ) + function InterfaceCellValues(ip::IP, here::CV; use_same_cv::Bool, include_R::Bool) where { + sdim, shape<:AbstractRefShape{sdim}, + IP<:Union{InterfaceCellInterpolation{shape}, VectorizedInterpolation{<:Any,<:Any,<:Any,<:InterfaceCellInterpolation{shape}}}, + CV<:CellValues} + sides_and_baseindices, base_indices_here, base_indices_there = _prepare_baseindices(ip) there = use_same_cv ? here : deepcopy(here) - return new{CV}(here, there, base_indices_here, base_indices_there, sides_and_baseindices) + + if include_R + T = eltype(here.detJdV) + TR = Vector{Tensor{2, sdim, T}} + R = TR(undef, length(getnquadpoints(here))) + else + TR = Nothing + R = nothing + end + return new{CV,TR}(here, there, base_indices_here, base_indices_there, sides_and_baseindices, R) end +end - function InterfaceCellValues(ip::IP, here::CV; use_same_cv) where {IP<:VectorizedInterpolation{<:Any,<:Any,<:Any,<:InterfaceCellInterpolation}, CV<:CellValues} - sides_and_baseindices = Tuple( get_side_and_baseindex(ip, i) for i in 1:getnbasefunctions(ip) ) - ip = ip.ip - base_indices_here = collect( get_interface_index(ip, :here, i) for i in 1:getnbasefunctions(ip.base) ) - base_indices_there = collect( get_interface_index(ip, :there, i) for i in 1:getnbasefunctions(ip.base) ) - there = use_same_cv ? here : deepcopy(here) - return new{CV}(here, there, base_indices_here, base_indices_there, sides_and_baseindices) - end +function _prepare_baseindices(ip::IP) where {IP<:InterfaceCellInterpolation} + sides_and_baseindices = Tuple( get_side_and_baseindex(ip, i) for i in 1:getnbasefunctions(ip) ) + base_indices_here = collect( get_interface_index(ip, :here, i) for i in 1:getnbasefunctions(ip.base) ) + base_indices_there = collect( get_interface_index(ip, :there, i) for i in 1:getnbasefunctions(ip.base) ) + return sides_and_baseindices, base_indices_here, base_indices_there +end +function _prepare_baseindices(ip::IP) where {IP<:VectorizedInterpolation{<:Any,<:Any,<:Any,<:InterfaceCellInterpolation}} + sides_and_baseindices = Tuple( get_side_and_baseindex(ip, i) for i in 1:getnbasefunctions(ip) ) + ip = ip.ip + base_indices_here = collect( get_interface_index(ip, :here, i) for i in 1:getnbasefunctions(ip.base) ) + base_indices_there = collect( get_interface_index(ip, :there, i) for i in 1:getnbasefunctions(ip.base) ) + return sides_and_baseindices, base_indices_here, base_indices_there end InterfaceCellValues(qr::QuadratureRule, args...; kwargs...) = InterfaceCellValues(Float64, qr, args...; kwargs...) @@ -43,17 +62,17 @@ InterfaceCellValues(qr::QuadratureRule, args...; kwargs...) = InterfaceCellValue function InterfaceCellValues(::Type{T}, qr::QuadratureRule, ip::InterfaceCellInterpolation, ip_geo::VectorizedInterpolation{sdim,<:Any,<:Any,<:InterfaceCellInterpolation} = default_geometric_interpolation(ip); - use_same_cv=true, kwargs...) where {T, sdim} + use_same_cv=true, include_R=false, kwargs...) where {T, sdim} cv = CellValues(T, qr, ip.base, VectorizedInterpolation{sdim}(ip_geo.ip.base); kwargs...) - return InterfaceCellValues(ip, cv; use_same_cv=use_same_cv) + return InterfaceCellValues(ip, cv; use_same_cv=use_same_cv, include_R=include_R) end function InterfaceCellValues(::Type{T}, qr::QuadratureRule, ip::VectorizedInterpolation{vdim,<:Any,<:Any,<:InterfaceCellInterpolation}, ip_geo::VectorizedInterpolation{sdim,<:Any,<:Any,<:InterfaceCellInterpolation} = default_geometric_interpolation(ip); - use_same_cv=true, kwargs...) where {T, vdim, sdim} + use_same_cv=true, include_R=false, kwargs...) where {T, vdim, sdim} cv = CellValues(T, qr, VectorizedInterpolation{vdim}(ip.ip.base), VectorizedInterpolation{sdim}(ip_geo.ip.base); kwargs...) - return InterfaceCellValues(ip, cv; use_same_cv=use_same_cv) + return InterfaceCellValues(ip, cv; use_same_cv=use_same_cv, include_R=include_R) end function InterfaceCellValues(::Type{T}, qr::QuadratureRule, @@ -90,13 +109,39 @@ Ferrite.shape_gradient_type(cv::InterfaceCellValues) = shape_gradient_type(cv.he Ferrite.reinit!(cv::InterfaceCellValues, cc::CellCache) = reinit!(cv, cc.coords) # TODO: Needed? -function Ferrite.reinit!(cv::InterfaceCellValues, x::AbstractVector{Vec{sdim,T}}) where {sdim, T} - reinit!(cv.here, @view x[cv.base_indices_here]) - if cv.here === cv.there - reinit!(cv.there, @view x[cv.base_indices_there]) +function Ferrite.reinit!(cv::InterfaceCellValues{CV,TR}, x::AbstractVector{Vec{sdim,T}}) where {sdim, T, CV, TR} + x_here = @view x[cv.base_indices_here] + reinit!(cv.here, x_here) + + if ! (cv.here === cv.there) + x_there = @view x[cv.base_indices_there] + reinit!(cv.there, x_there) + end + + if ! isnothing(cv.R) + x_there = @view x[cv.base_indices_there] + for qp in 1:getnquadpoints(cv.here) + mapping_here = Ferrite.calculate_mapping(cv.here.geo_mapping, qp, x_here) + mapping_there = Ferrite.calculate_mapping(cv.there.geo_mapping, qp, x_there) + J_here = Ferrite.getjacobian(mapping_here) + J_there = Ferrite.getjacobian(mapping_there) + J = (J_here + J_there) / 2 + cv.R[qp] = _get_R_from_J(J) + end end return nothing end +function _get_R_from_J(J::SMatrix{2,1,T}) where T + v1 = J[:, 1] + v2 = SVector{2,T}((-v[2], v[1])) + return Tensor{2,2,T}(((v1/norm(v1))..., (v2/norm(v2))...)) +end +function _get_R_from_J(J::SMatrix{3,2,T}) where T + v1 = J[:, 1] + v3 = v1 × J[:, 2] + v2 = v3 × v1 + return Tensor{2,3,T}(((v1/norm(v1))..., (v2/norm(v2))..., (v3/norm(v3))...)) +end get_side_and_baseindex(cv::InterfaceCellValues, i::Integer) = cv.sides_and_baseindices[i] @@ -277,6 +322,15 @@ function Ferrite.function_gradient_jump(cv::InterfaceCellValues, qp::Int, u::Abs return function_gradient(cv, qp, u, false) - function_gradient(cv, qp, u, true) end +""" + midplane_rotation(cv::InterfaceCellValues, qp::Int) + +Compute the rotation matrix of the midplane in quadrature point. +""" +function midplane_rotation(cv::InterfaceCellValues, qp::Int) + return cv.R[qp] +end + function Base.show(io::IO, d::MIME"text/plain", cv::InterfaceCellValues) if cv.here === cv.there print(io, "InterfaceCellValues based on a single CellValues:\n"); show(io, d, cv.here) diff --git a/test/test_cellvalues.jl b/test/test_cellvalues.jl index 7f52e17..bc0da37 100644 --- a/test/test_cellvalues.jl +++ b/test/test_cellvalues.jl @@ -36,4 +36,18 @@ @test all(abs.(function_gradient_jump(cv, qp, u)) .≤ 1e-14) @test getdetJdV_average(cv, qp) == (getdetJdV(cv.here, qp) + getdetJdV(cv.there, qp)) / 2 end + + cv = InterfaceCellValues(qr, ip; include_R=true) + x = repeat([Vec{3}((1.0,0.0,0.0)), Vec{3}((0.0,1.0,0.0)), Vec{3}((0.0,0.0,1.0))], 2) + n = Vec{3}(( sqrt(1/3), sqrt(1/3), sqrt(1/3))) + t₁ = Vec{3}(( sqrt(1/2), 0.0, -sqrt(1/2))) + t₂ = Vec{3}((-sqrt(1/6), 2*sqrt(1/6), -sqrt(1/6))) + reinit!(cv, x) + for qp in 1:getnquadpoints(cv) + R = midplane_rotation(cv, qp) + @test tdot(R) ≈ one(R) # Fails e.g. when dx/dξ₁ not perpendicular to dx/ξ₂ + @test R⋅Vec{3}((1.0,0.0,0.0)) ≈ t₁ + @test R⋅Vec{3}((0.0,1.0,0.0)) ≈ t₂ + @test R⋅Vec{3}((0.0,0.0,1.0)) ≈ n + end end \ No newline at end of file