@@ -16,15 +16,15 @@ export assemble, assembleglobal, assemblestiffness, assembleconvection, assemble
16
16
export assemblemass, assemblefunction, assemblemassfunction, assembledivergence
17
17
export assemblemassincidence, asssemblemassnodes, assemblenodes
18
18
export assembleload, assemblemassload, assemblerobin, edges, edgesindices, neighbors
19
- export solvepoisson, solveSD, solvetransport , solvedirichlet, adaptpoisson
19
+ export solvepoisson, solvetransport, solvetransportdiffusion , solvedirichlet, adaptpoisson
20
20
export gradienthat, gradientCR, gradient, interp, nedelec, nedelecmean, jumps
21
21
export submesh, detsimplex, iterable, callable, value, edgelengths, laplacian
22
22
export boundary, interior, trilength, trinormals, incidence, degrees
23
- import Grassmann: norm, column, columns, points, pointset, edges
23
+ import Grassmann: norm, column, columns
24
24
using Base. Threads
25
25
26
- import TensorFields : iterpts, iterable, callable, revrot
27
- import TensorFields : gradienthat, laplacian, gradient, assemblelocal!
26
+ import Cartan : points, pointset, edges, iterpts, iterable, callable, revrot
27
+ import Cartan : gradienthat, laplacian, gradient, assemblelocal!
28
28
29
29
trilength (rc) = value .(abs .(value (rc)))
30
30
function trinormals (t)
@@ -52,8 +52,15 @@ function assembleglobal(M,t,m::T,c::C,g::F) where {T<:AbstractVector,C<:Abstract
52
52
end
53
53
return A
54
54
end
55
+ function assembleglobal (M,X:: SimplexFrameBundle ,m:: T ,c:: C ,g:: F ) where {T<: AbstractVector ,C<: AbstractVector ,F<: AbstractVector }
56
+ np = length (points (X)); A = spzeros (np,np); t = immersion (X)
57
+ for k ∈ 1 : length (t)
58
+ assemblelocal! (A,M (c[k],g[k],Val (mdims (Manifold (X)))),m[k],value (t[k]))
59
+ end
60
+ return A
61
+ end
55
62
56
- import TensorFields : weights, degrees, assembleincidence, incidence
63
+ import Cartan : weights, degrees, assembleincidence, incidence
57
64
58
65
assemblemassincidence (t,f,m= volumes (t),l= m) = assemblemassincidence (t,iterpts (t,f),iterable (t,m),iterable (t,l))
59
66
function assemblemassincidence (t,f:: F ,m:: V ,l:: T ) where {F<: AbstractVector ,V<: AbstractVector ,T<: AbstractVector }
@@ -66,14 +73,25 @@ function assemblemassincidence(t,f::F,m::V,l::T) where {F<:AbstractVector,V<:Abs
66
73
end
67
74
return M,b
68
75
end
76
+ function assemblemassincidence (X:: SimplexFrameBundle ,f:: F ,m:: V ,l:: T ) where {F<: AbstractVector ,V<: AbstractVector ,T<: AbstractVector }
77
+ np,n,t = length (points (X)),Val (mdims (Manifold (X))),immersion (X)
78
+ M,b,v = spzeros (np,np), zeros (np), f
79
+ for k ∈ 1 : length (t)
80
+ tk = value (t[k])
81
+ assemblelocal! (M,mass (nothing ,nothing ,n),m[k],tk)
82
+ b[tk] .+ = v[tk]* l[k]
83
+ end
84
+ return M,b
85
+ end
69
86
70
87
assemblefunction (t,f,m= volumes (t),d= degrees (t,m)) = assembleincidence (t,iterpts (t,f)/ mdims (t),m)
71
88
assemblenodes (t,f,m= volumes (t),d= degrees (t,m)) = assembleincidence (t,iterpts (t,f)./ d,m)
72
89
assemblemassload (t,m= volumes (t),l= m,d= degrees (t)) = assemblemassincidence (t,inv .(d),m,l)
73
90
assemblemassfunction (t,f,m= volumes (t),l= m) = assemblemassincidence (t,iterpts (t,f)/ mdims (t),iterable (t,m),iterable (t,l))
91
+ assemblemassfunction (tf:: TensorField ,m= volumes (base (tf)),l= m) = assemblemassfunction (base (tf),fiber (tf),m,l)
74
92
assemblemassnodes (t,f,m= volumes (t),l= m,d= degrees (t)) = assemblemassincidence (t,iterpts (t,f)./ d,iterable (t,m),iterable (t,l))
75
93
76
- import TensorFields : assembleload, interp, pretni
94
+ import Cartan : assembleload, interp, pretni
77
95
78
96
# mass(a,b,::Val{N}) where N = (ones(SMatrix{N,N,Int})+I)/Int(factorial(N+1)/factorial(N-1))
79
97
mass (a,b,:: Val{N} ) where N = (x= Submanifold (N)(∇);outer (x,x)+ I)/ Int (factorial (N+ 1 )/ factorial (N- 1 ))
@@ -82,6 +100,8 @@ assemblemass(t,m=volumes(t)) = assembleglobal(mass,t,iterpts(t,m))
82
100
stiffness (c,g:: Float64 ,:: Val{2} ) = (cg = c* g^ 2 ; Chain (Chain (cg,- cg),Chain (- cg,cg)))
83
101
stiffness (c,g,:: Val{N} ) where N = Chain {Submanifold(N),1} (map .(* ,c,value (g).⋅ Ref (g)))
84
102
assemblestiffness (t,c= 1 ,m= volumes (t),g= gradienthat (t,m)) = assembleglobal (stiffness,t,m,iterable (c isa Real ? t : means (t),c),g)
103
+ assemblestiffness (t:: SimplexFrameBundle ,c= 1 ,m= volumes (t),g= gradienthat (t,m)) = assembleglobal (stiffness,t,m,iterable (c isa Real ? immersion (t) : means (t),c),g)
104
+
85
105
# iterable(means(t),c) # mapping of c.(means(t))
86
106
87
107
#= function sonicstiffness(c,g,::Val{N}) where N
@@ -133,18 +153,19 @@ function solvepoisson(t,e,c,f,κ,gD=0,gN=0)
133
153
b = assemblenodes (t,f,m)
134
154
A = assemblestiffness (t,c,m)
135
155
R,r = assemblerobin (e,κ,gD,gN)
136
- return ( A+ R)\ (b+ r)
156
+ return TensorField (t,( A+ R)\ (b+ r) )
137
157
end
138
158
139
- function solveSD (t,e,c,f,δ,κ,gD= 0 ,gN= 0 )
159
+ function solvetransportdiffusion (tf,eκ,c,δ,gD= 0 ,gN= 0 )
160
+ t,f,e,κ = base (tf),fiber (tf),base (eκ),fiber (eκ)
140
161
m = volumes (t)
141
162
g = gradienthat (t,m)
142
163
A = assemblestiffness (t,c,m,g)
143
- b = means (t ,f)
164
+ b = means (immersion (t) ,f)
144
165
C = assembleconvection (t,b,m,g)
145
166
Sd = assembleSD (t,sqrt (δ)* b,m,g)
146
167
R,r = assemblerobin (e,κ,gD,gN)
147
- return ( A+ R- C' + Sd)\ r
168
+ return TensorField (t,( A+ R- C' + Sd)\ r)
148
169
end
149
170
150
171
function solvetransport (t,e,c,ϵ= 0.1 )
@@ -153,7 +174,7 @@ function solvetransport(t,e,c,ϵ=0.1)
153
174
A = assemblestiffness (t,ϵ,m,g)
154
175
b = assembleload (t,m)
155
176
C = assembleconvection (t,c,m,g)
156
- return solvedirichlet (A+ C,b,e)
177
+ TensorField (t, solvedirichlet (A+ C,b,e) )
157
178
end
158
179
159
180
function adaptpoisson (g,p,e,t,c= 1 ,a= 0 ,f= 1 ,κ= 1e6 ,gD= 0 ,gN= 0 )
@@ -171,8 +192,12 @@ function adaptpoisson(g,p,e,t,c=1,a=0,f=1,κ=1e6,gD=0,gN=0)
171
192
return g,p,e,t
172
193
end
173
194
174
- solvedirichlet (M,b,e:: ChainBundle ) = solvedirichlet (M,b,pointset (e))
175
- solvedirichlet (M,b,e:: ChainBundle ,u) = solvedirichlet (M,b,pointset (e),u)
195
+ # solvedirichlet(M,b,e::ChainBundle) = solvedirichlet(M,b,pointset(e))
196
+ # solvedirichlet(M,b,e::ChainBundle,u) = solvedirichlet(M,b,pointset(e),u)
197
+ solvedirichlet (M,b,e:: SimplexFrameBundle ) = solvedirichlet (M,b,vertices (e))
198
+ solvedirichlet (M,b,e:: SimplexManifold ) = solvedirichlet (M,b,vertices (e))
199
+ solvedirichlet (M,b,e:: SimplexFrameBundle ,u) = solvedirichlet (M,b,vertices (e),u)
200
+ solvedirichlet (M,b,e:: SimplexManifold ,u) = solvedirichlet (M,b,vertices (e),u)
176
201
function solvedirichlet (A,b,fixed,boundary)
177
202
neq = length (b)
178
203
free,ξ = interior (fixed,neq),zeros (eltype (b),neq)
@@ -187,15 +212,15 @@ function solvedirichlet(M,b,fixed)
187
212
return ξ
188
213
end
189
214
190
- import TensorFields : interior
215
+ import Cartan : interior
191
216
192
217
solvehomogenous (e,M,b) = solvedirichlet (M,b,e)
193
218
export solvehomogenous, solveboundary
194
219
const solveboundary = solvedirichlet # deprecate
195
220
const edgelengths = volumes # deprecate
196
221
const boundary = pointset # deprecate
197
222
198
- import TensorFields : facesindices, edgesindices, neighbor, neighbors, centroidvectors
223
+ import Cartan : facesindices, edgesindices, neighbor, neighbors, centroidvectors
199
224
200
225
#=
201
226
facesindices(t,cols=columns(t)) = mdims(t) == 3 ? edgesindices(t,cols) : throw(error())
0 commit comments