@@ -239,22 +239,17 @@ function _gradient_nd_qgrad!(
239
239
240
240
end
241
241
242
-
243
242
struct NedelecPrebasisOnSimplex{D} <: AbstractVector{Monomial}
244
243
order:: Int
245
244
function NedelecPrebasisOnSimplex {D} (order:: Integer ) where D
246
245
new {D} (Int (order))
247
246
end
248
247
end
249
248
250
- function Base. size (a:: NedelecPrebasisOnSimplex{3} )
251
- @notimplementedif a. order != 0
252
- (6 ,)
253
- end
254
-
255
- function Base. size (a:: NedelecPrebasisOnSimplex{2} )
256
- @notimplementedif a. order != 0
257
- (3 ,)
249
+ function Base. size (a:: NedelecPrebasisOnSimplex{d} ) where d
250
+ k = a. order+ 1
251
+ n = div (k* prod (i-> (k+ i),2 : d),factorial (d- 1 ))
252
+ (n,)
258
253
end
259
254
260
255
Base. getindex (a:: NedelecPrebasisOnSimplex ,i:: Integer ) = Monomial ()
@@ -264,52 +259,91 @@ num_terms(a::NedelecPrebasisOnSimplex) = length(a)
264
259
get_order (f:: NedelecPrebasisOnSimplex ) = f. order
265
260
266
261
function return_cache (
267
- f:: NedelecPrebasisOnSimplex{D} ,x:: AbstractVector{<:Point} ) where D
268
- @notimplementedif f. order != 0
262
+ f:: NedelecPrebasisOnSimplex{d} ,x:: AbstractVector{<:Point} ) where d
269
263
np = length (x)
270
264
ndofs = num_terms (f)
271
265
V = eltype (x)
272
266
a = zeros (V,(np,ndofs))
273
- CachedArray (a)
267
+ k = f. order+ 1
268
+ P = MonomialBasis {d} (VectorValue{d,Float64},k- 1 ,(e,order)-> sum (e)<= order)
269
+ cP = return_cache (P,x)
270
+ CachedArray (a), cP, P
274
271
end
275
272
276
273
function evaluate! (
277
274
cache,f:: NedelecPrebasisOnSimplex{3} ,x:: AbstractVector{<:Point} )
278
- @notimplementedif f. order != 0
275
+ ca,cP,P = cache
276
+ k = f. order+ 1
279
277
np = length (x)
280
278
ndofs = num_terms (f)
281
- setsize! (cache,(np,ndofs))
282
- a = cache. array
279
+ ndofsP = length (P)
280
+ setsize! (ca,(np,ndofs))
281
+ Px = evaluate! (cP,P,x)
282
+ a = ca. array
283
283
V = eltype (x)
284
284
T = eltype (V)
285
285
z = zero (T)
286
286
u = one (T)
287
287
for (ip,p) in enumerate (x)
288
- a[ip,1 ] = VectorValue ((u,z,z))
289
- a[ip,2 ] = VectorValue ((z,u,z))
290
- a[ip,3 ] = VectorValue ((z,z,u))
291
- a[ip,4 ] = VectorValue ((- p[2 ],p[1 ],z))
292
- a[ip,5 ] = VectorValue ((- p[3 ],z,p[1 ]))
293
- a[ip,6 ] = VectorValue ((z,- p[3 ],p[2 ]))
288
+ for j in 1 : ndofsP
289
+ a[ip,j] = Px[ip,j]
290
+ end
291
+ i = ndofsP
292
+ x1,x2,x3 = x[ip]
293
+ zp = zero (x1)
294
+ for β in 1 : k
295
+ for α in 1 : (k+ 1 - β)
296
+ i += 1
297
+ a[ip,i] = VectorValue (
298
+ - x1^ (α- 1 )* x2^ (k- α- β+ 2 )* x3^ (β- 1 ),
299
+ x1^ α* x2^ (k- α- β+ 1 )* x3^ (β- 1 ),
300
+ zp)
301
+ i += 1
302
+ a[ip,i] = VectorValue (
303
+ - x1^ (k- α- β+ 1 )* x2^ (β- 1 )* x3^ α,
304
+ zp,
305
+ x1^ (k- α- β+ 2 )* x2^ (β- 1 )* x3^ (α- 1 ))
306
+ end
307
+ end
308
+ for γ in 1 : k
309
+ i += 1
310
+ a[ip,i] = VectorValue (
311
+ zp,
312
+ - x2^ (γ- 1 )* x3^ (k- γ+ 1 ),
313
+ x2^ γ* x3^ (k- γ))
314
+ end
294
315
end
295
316
a
296
317
end
297
318
298
319
function evaluate! (
299
320
cache,f:: NedelecPrebasisOnSimplex{2} ,x:: AbstractVector{<:Point} )
300
- @notimplementedif f. order != 0
321
+ ca,cP,P = cache
322
+ k = f. order+ 1
301
323
np = length (x)
302
324
ndofs = num_terms (f)
303
- setsize! (cache,(np,ndofs))
304
- a = cache. array
325
+ ndofsP = length (P)
326
+ setsize! (ca,(np,ndofs))
327
+ a = ca. array
305
328
V = eltype (x)
306
329
T = eltype (V)
307
330
z = zero (T)
308
331
u = one (T)
332
+ Px = evaluate! (cP,P,x)
309
333
for (ip,p) in enumerate (x)
310
- a[ip,1 ] = VectorValue ((u,z))
311
- a[ip,2 ] = VectorValue ((z,u))
312
- a[ip,3 ] = VectorValue ((- p[2 ],p[1 ]))
334
+ for j in 1 : ndofsP
335
+ a[ip,j] = Px[ip,j]
336
+ end
337
+ i = ndofsP
338
+ x1,x2 = x[ip]
339
+ zp = zero (x1)
340
+ for α in 1 : k
341
+ i += 1
342
+ a[ip,i] = VectorValue (- x1^ (α- 1 )* x2^ (k- α+ 1 ),x1^ α* x2^ (k- α))
343
+ end
344
+ # a[ip,1] = VectorValue((u,z))
345
+ # a[ip,2] = VectorValue((z,u))
346
+ # a[ip,3] = VectorValue((-p[2],p[1]))
313
347
end
314
348
a
315
349
end
@@ -318,56 +352,131 @@ function return_cache(
318
352
g:: FieldGradientArray{1,<:NedelecPrebasisOnSimplex{D}} ,
319
353
x:: AbstractVector{<:Point} ) where D
320
354
f = g. fa
321
- @notimplementedif f. order != 0
322
355
np = length (x)
323
356
ndofs = num_terms (f)
324
357
xi = testitem (x)
325
358
V = eltype (x)
326
359
G = gradient_type (V,xi)
327
360
a = zeros (G,(np,ndofs))
328
- CachedArray (a)
361
+ k = f. order+ 1
362
+ mb = MonomialBasis {D} (VectorValue{D,Float64},k- 1 ,(e,order)-> sum (e)<= order)
363
+ P = Broadcasting (∇)(mb)
364
+ cP = return_cache (P,x)
365
+ CachedArray (a), cP, P
329
366
end
330
367
331
368
function evaluate! (
332
369
cache,
333
370
g:: FieldGradientArray{1,<:NedelecPrebasisOnSimplex{3}} ,
334
371
x:: AbstractVector{<:Point} )
372
+ ca,cP,P = cache
335
373
f = g. fa
336
- @notimplementedif f. order != 0
374
+ k = f. order+ 1
337
375
np = length (x)
338
376
ndofs = num_terms (f)
339
- setsize! (cache ,(np,ndofs))
340
- a = cache . array
377
+ setsize! (ca ,(np,ndofs))
378
+ a = ca . array
341
379
fill! (a,zero (eltype (a)))
380
+ ndofsP = length (P)
381
+ Px = evaluate! (cP,P,x)
342
382
V = eltype (x)
343
383
T = eltype (V)
344
384
z = zero (T)
345
385
u = one (T)
346
386
for (ip,p) in enumerate (x)
347
- a[ip,4 ] = TensorValue ((z,- u,z, u,z,z, z,z,z))
348
- a[ip,5 ] = TensorValue ((z,z,- u, z,z,z, u,z,z))
349
- a[ip,6 ] = TensorValue ((z,z,z, z,z,- u, z,u,z))
387
+ for j in 1 : ndofsP
388
+ a[ip,j] = Px[ip,j]
389
+ end
390
+ i = ndofsP
391
+ x1,x2,x3 = x[ip]
392
+ zp = zero (x1)
393
+ for β in 1 : k
394
+ for α in 1 : (k+ 1 - β)
395
+ i += 1
396
+ a[ip,i] = TensorValue (
397
+ # -x1^(α-1)*x2^(k-α-β+2)*x3^(β-1),
398
+ - (α- 1 )* _exp (x1,α- 2 )* x2^ (k- α- β+ 2 )* x3^ (β- 1 ),
399
+ - x1^ (α- 1 )* (k- α- β+ 2 )* _exp (x2,k- α- β+ 1 )* x3^ (β- 1 ),
400
+ - x1^ (α- 1 )* x2^ (k- α- β+ 2 )* (β- 1 )* _exp (x3,β- 2 ),
401
+ # x1^α*x2^(k-α-β+1)*x3^(β-1),
402
+ α* _exp (x1,α- 1 )* x2^ (k- α- β+ 1 )* x3^ (β- 1 ),
403
+ x1^ α* (k- α- β+ 1 )* _exp (x2,k- α- β)* x3^ (β- 1 ),
404
+ x1^ α* x2^ (k- α- β+ 1 )* (β- 1 )* _exp (x3,β- 2 ),
405
+ # zp,
406
+ zp,zp,zp)
407
+ i += 1
408
+ a[ip,i] = TensorValue (
409
+ # -x1^(k-α-β+1)*x2^(β-1)*x3^α,
410
+ - (k- α- β+ 1 )* _exp (x1,k- α- β)* x2^ (β- 1 )* x3^ α,
411
+ - x1^ (k- α- β+ 1 )* (β- 1 )* _exp (x2,β- 2 )* x3^ α,
412
+ - x1^ (k- α- β+ 1 )* x2^ (β- 1 )* α* _exp (x3,α- 1 ),
413
+ # zp
414
+ zp,zp,zp,
415
+ # x1^(k-α-β+2)*x2^(β-1)*x3^(α-1),
416
+ (k- α- β+ 2 )* _exp (x1,k- α- β+ 1 )* x2^ (β- 1 )* x3^ (α- 1 ),
417
+ x1^ (k- α- β+ 2 )* (β- 1 )* _exp (x2,β- 2 )* x3^ (α- 1 ),
418
+ x1^ (k- α- β+ 2 )* x2^ (β- 1 )* (α- 1 )* _exp (x3,α- 2 ))
419
+ end
420
+ end
421
+ for γ in 1 : k
422
+ i += 1
423
+ a[ip,i] = TensorValue (
424
+ # zp
425
+ zp,zp,zp,
426
+ # -x2^(γ-1)*x3^(k-γ+1),
427
+ - 0 * x2^ (γ- 1 )* x3^ (k- γ+ 1 ),
428
+ - (γ- 1 )* _exp (x2,γ- 2 )* x3^ (k- γ+ 1 ),
429
+ - x2^ (γ- 1 )* (k- γ+ 1 )* _exp (x3,k- γ),
430
+ # x2^γ*x3^(k-γ),
431
+ 0 * x2^ γ* x3^ (k- γ),
432
+ γ* _exp (x2,γ- 1 )* x3^ (k- γ),
433
+ x2^ γ* (k- γ)* _exp (x3,k- γ- 1 ))
434
+ end
435
+ # a[ip,4] = TensorValue((z,-u,z, u,z,z, z,z,z))
436
+ # a[ip,5] = TensorValue((z,z,-u, z,z,z, u,z,z))
437
+ # a[ip,6] = TensorValue((z,z,z, z,z,-u, z,u,z))
350
438
end
351
439
a
352
440
end
353
441
442
+ _exp (a,y) = y> 0 ? a^ y : one (a)
443
+
354
444
function evaluate! (
355
445
cache,
356
446
g:: FieldGradientArray{1,<:NedelecPrebasisOnSimplex{2}} ,
357
447
x:: AbstractVector{<:Point} )
358
448
f = g. fa
359
- @notimplementedif f. order != 0
449
+ ca,cP,P = cache
450
+ k = f. order+ 1
360
451
np = length (x)
361
452
ndofs = num_terms (f)
362
- setsize! (cache ,(np,ndofs))
363
- a = cache . array
453
+ setsize! (ca ,(np,ndofs))
454
+ a = ca . array
364
455
fill! (a,zero (eltype (a)))
365
456
V = eltype (x)
366
457
T = eltype (V)
367
458
z = zero (T)
368
459
u = one (T)
460
+ ndofsP = length (P)
461
+ Px = evaluate! (cP,P,x)
369
462
for (ip,p) in enumerate (x)
370
- a[ip,3 ] = TensorValue ((z,- u, u,z))
463
+ for j in 1 : ndofsP
464
+ a[ip,j] = Px[ip,j]
465
+ end
466
+ i = ndofsP
467
+ x1,x2 = x[ip]
468
+ zp = zero (x1)
469
+ for α in 1 : k
470
+ i += 1
471
+ a[ip,i] = TensorValue (
472
+ # -x1^(α-1)*x2^(k-α+1),
473
+ - (α- 1 )* _exp (x1,α- 2 )* x2^ (k- α+ 1 ),
474
+ - x1^ (α- 1 )* (k- α+ 1 )* _exp (x2,k- α),
475
+ # x1^α*x2^(k-α),
476
+ α* _exp (x1,α- 1 )* x2^ (k- α),
477
+ x1^ α* (k- α)* _exp (x2,k- α- 1 ))
478
+ end
479
+ # a[ip,3] = TensorValue((z,-u, u,z))
371
480
end
372
481
a
373
482
end
0 commit comments