@@ -347,11 +347,12 @@ bool all_passed = true;
347
347
my_GMLS.setProblemData (neighbor_lists_device, source_coords_device, target_coords_device, epsilon_device);
348
348
349
349
// create a vector of target operations
350
- std::vector<TargetOperation> lro (4 );
350
+ std::vector<TargetOperation> lro (5 );
351
351
lro[0 ] = ScalarPointEvaluation;
352
352
lro[1 ] = DivergenceOfVectorPointEvaluation;
353
353
lro[2 ] = CurlOfVectorPointEvaluation;
354
354
lro[3 ] = VectorPointEvaluation;
355
+ lro[4 ] = GradientOfVectorPointEvaluation;
355
356
356
357
// and then pass them to the GMLS class
357
358
my_GMLS.addTargets (lro);
@@ -398,6 +399,9 @@ bool all_passed = true;
398
399
399
400
auto output_gradient = gmls_evaluator.applyAlphasToDataAllComponentsAllTargetSites <double **, Kokkos::HostSpace>
400
401
(gradient_sampling_data_device, VectorPointEvaluation);
402
+
403
+ auto output_hessian = gmls_evaluator.applyAlphasToDataAllComponentsAllTargetSites <double **, Kokkos::HostSpace>
404
+ (gradient_sampling_data_device, GradientOfVectorPointEvaluation);
401
405
402
406
// retrieves polynomial coefficients instead of remapped field
403
407
auto scalar_coefficients = gmls_evaluator.applyFullPolynomialCoefficientsBasisToDataAllComponents <double **, Kokkos::HostSpace>
@@ -439,6 +443,16 @@ bool all_passed = true;
439
443
double GMLS_CurlY = (dimension>1 ) ? output_curl (i,1 ) : 0 ;
440
444
double GMLS_CurlZ = (dimension>2 ) ? output_curl (i,2 ) : 0 ;
441
445
446
+ // load hessian
447
+ double GMLS_GradXX = output_hessian (i,0 *dimension+0 );
448
+ double GMLS_GradXY = (dimension>1 ) ? output_hessian (i,0 *dimension+1 ) : 0 ;
449
+ double GMLS_GradXZ = (dimension>2 ) ? output_hessian (i,0 *dimension+2 ) : 0 ;
450
+ double GMLS_GradYX = (dimension>1 ) ? output_hessian (i,1 *dimension+0 ) : 0 ;
451
+ double GMLS_GradYY = (dimension>1 ) ? output_hessian (i,1 *dimension+1 ) : 0 ;
452
+ double GMLS_GradYZ = (dimension>2 ) ? output_hessian (i,1 *dimension+2 ) : 0 ;
453
+ double GMLS_GradZX = (dimension>2 ) ? output_hessian (i,2 *dimension+0 ) : 0 ;
454
+ double GMLS_GradZY = (dimension>2 ) ? output_hessian (i,2 *dimension+1 ) : 0 ;
455
+ double GMLS_GradZZ = (dimension>2 ) ? output_hessian (i,2 *dimension+2 ) : 0 ;
442
456
443
457
// target site i's coordinate
444
458
double xval = target_coords (i,0 );
@@ -453,6 +467,9 @@ bool all_passed = true;
453
467
454
468
double actual_Divergence;
455
469
actual_Divergence = trueLaplacian (xval, yval, zval, order, dimension);
470
+
471
+ double actual_Hessian[9 ] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }; // initialized for 3, but only filled up to dimension
472
+ trueHessian (actual_Hessian, xval, yval, zval, order, dimension);
456
473
457
474
double actual_Curl[3 ] = {0 ,0 ,0 }; // initialized for 3, but only filled up to dimension
458
475
// (and not at all for dimimension = 1)
@@ -493,6 +510,48 @@ bool all_passed = true;
493
510
all_passed = false ;
494
511
std::cout << i << " Failed Divergence by: " << std::abs (actual_Divergence - GMLS_Divergence) << std::endl;
495
512
}
513
+
514
+ // check matrix (which is the hessian)
515
+ if (std::abs (actual_Hessian[0 ] - GMLS_GradXX) > failure_tolerance) {
516
+ all_passed = false ;
517
+ std::cout << i << " Failed GradXX by: " << std::abs (actual_Hessian[0 ] - GMLS_GradXX) << std::endl;
518
+ if (dimension>1 ) {
519
+ if (std::abs (actual_Hessian[1 ] - GMLS_GradXY) > failure_tolerance) {
520
+ all_passed = false ;
521
+ std::cout << i << " Failed GradXY by: " << std::abs (actual_Hessian[1 ] - GMLS_GradXY) << std::endl;
522
+ }
523
+ if (std::abs (actual_Hessian[1 *dimension+1 ] - GMLS_GradYY) > failure_tolerance) {
524
+ all_passed = false ;
525
+ std::cout << i << " Failed GradYY by: " << std::abs (actual_Hessian[1 *dimension+1 ] - GMLS_GradYY) << std::endl;
526
+ }
527
+ if (std::abs (actual_Hessian[1 *dimension+0 ] - GMLS_GradYX) > failure_tolerance) {
528
+ all_passed = false ;
529
+ std::cout << i << " Failed GradYX by: " << std::abs (actual_Hessian[1 *dimension+0 ] - GMLS_GradYX) << std::endl;
530
+ }
531
+ }
532
+ if (dimension>2 ) {
533
+ if (std::abs (actual_Hessian[2 ] - GMLS_GradXZ) > failure_tolerance) {
534
+ all_passed = false ;
535
+ std::cout << i << " Failed GradXZ by: " << std::abs (actual_Hessian[2 ] - GMLS_GradXZ) << std::endl;
536
+ }
537
+ if (std::abs (actual_Hessian[1 *dimension+2 ] - GMLS_GradYZ) > failure_tolerance) {
538
+ all_passed = false ;
539
+ std::cout << i << " Failed GradYZ by: " << std::abs (actual_Hessian[1 *dimension+2 ] - GMLS_GradYZ) << std::endl;
540
+ }
541
+ if (std::abs (actual_Hessian[2 *dimension+0 ] - GMLS_GradZX) > failure_tolerance) {
542
+ all_passed = false ;
543
+ std::cout << i << " Failed GradZX by: " << std::abs (actual_Hessian[2 *dimension+0 ] - GMLS_GradZX) << std::endl;
544
+ }
545
+ if (std::abs (actual_Hessian[2 *dimension+1 ] - GMLS_GradZY) > failure_tolerance) {
546
+ all_passed = false ;
547
+ std::cout << i << " Failed GradZY by: " << std::abs (actual_Hessian[2 *dimension+1 ] - GMLS_GradZY) << std::endl;
548
+ }
549
+ if (std::abs (actual_Hessian[2 *dimension+2 ] - GMLS_GradZZ) > failure_tolerance) {
550
+ all_passed = false ;
551
+ std::cout << i << " Failed GradZZ by: " << std::abs (actual_Hessian[2 *dimension+2 ] - GMLS_GradZZ) << std::endl;
552
+ }
553
+ }
554
+ }
496
555
497
556
// check curl
498
557
if (order > 2 ) { // reconstructed solution not in basis unless order greater than 2 used
0 commit comments