1
-
2
1
#define obbox TOKEN_PASTE(obbox_,D)
3
2
#define local_hash_data TOKEN_PASTE(findpts_local_hash_data_,D)
4
3
#define hash_data TOKEN_PASTE(findpts_hash_data_,D)
23
22
#define eval_src_pt TOKEN_PASTE(eval_src_pt_ ,D)
24
23
#define eval_out_pt TOKEN_PASTE(eval_out_pt_ ,D)
25
24
#define setup_aux TOKEN_PASTE(setup_aux_,D)
25
+ #define setup_fev_aux TOKEN_PASTE(setup_fev_aux_,D)
26
26
#define findpts_setup TOKEN_PASTE(PREFIXED_NAME(findpts_setup_),D)
27
27
#define findpts_free TOKEN_PASTE(PREFIXED_NAME(findpts_free_ ),D)
28
28
#define findpts TOKEN_PASTE(PREFIXED_NAME(findpts_ ),D)
@@ -200,6 +200,8 @@ struct findpts_data {
200
200
struct crystal cr ;
201
201
struct findpts_local_data local ;
202
202
struct hash_data hash ;
203
+ struct array savpt ;
204
+ uint fevsetup ;
203
205
};
204
206
205
207
static void setup_aux (
@@ -214,6 +216,7 @@ static void setup_aux(
214
216
npt_max , newt_tol );
215
217
hash_build (& fd -> hash ,& fd -> local .hd ,fd -> local .obb ,nel ,
216
218
global_hash_size ,& fd -> cr );
219
+ fd -> fevsetup = 0 ;
217
220
}
218
221
219
222
struct findpts_data * findpts_setup (
@@ -236,6 +239,7 @@ void findpts_free(struct findpts_data *fd)
236
239
hash_free (& fd -> hash );
237
240
findpts_local_free (& fd -> local );
238
241
crystal_free (& fd -> cr );
242
+ if (fd -> fevsetup == 1 ) array_free (& fd -> savpt );
239
243
free (fd );
240
244
}
241
245
@@ -250,6 +254,7 @@ void findpts( uint *const code_base , const unsigned code_stride ,
250
254
const double * const x_base [D ], const unsigned x_stride [D ],
251
255
const uint npt , struct findpts_data * const fd )
252
256
{
257
+ if (fd -> fevsetup == 1 ) array_free (& fd -> savpt ); fd -> fevsetup = 0 ;
253
258
const uint np = fd -> cr .comm .np , id = fd -> cr .comm .id ;
254
259
struct array hash_pt , src_pt , out_pt ;
255
260
/* look locally first */
@@ -377,16 +382,14 @@ void findpts( uint *const code_base , const unsigned code_stride ,
377
382
struct eval_src_pt { double r [D ]; uint index , proc , el ; };
378
383
struct eval_out_pt { double out ; uint index , proc ; };
379
384
380
- void findpts_eval (
381
- double * const out_base , const unsigned out_stride ,
385
+ static void setup_fev_aux (
382
386
const uint * const code_base , const unsigned code_stride ,
383
387
const uint * const proc_base , const unsigned proc_stride ,
384
388
const uint * const el_base , const unsigned el_stride ,
385
389
const double * const r_base , const unsigned r_stride ,
386
- const uint npt ,
387
- const double * const in , struct findpts_data * const fd )
390
+ const uint npt , struct findpts_data * const fd )
388
391
{
389
- struct array src , outpt ;
392
+ struct array src ;
390
393
/* copy user data, weed out unfound points, send out */
391
394
{
392
395
uint index ;
@@ -411,22 +414,59 @@ void findpts_eval(
411
414
src .n = pt - (struct eval_src_pt * )src .ptr ;
412
415
sarray_transfer (struct eval_src_pt ,& src ,proc ,1 ,& fd -> cr );
413
416
}
414
- /* evaluate points, send back */
417
+ /* setup space for source points */
415
418
{
416
419
uint n = src .n ;
420
+ uint d ;
417
421
const struct eval_src_pt * spt ;
418
- struct eval_out_pt * opt ;
422
+ struct eval_src_pt * opt ;
419
423
/* group points by element */
420
424
sarray_sort (struct eval_src_pt ,src .ptr ,n , el ,0 , & fd -> cr .data );
421
- array_init (struct eval_out_pt , & outpt ,n ), outpt .n = n ;
422
- spt = src .ptr , opt = outpt .ptr ;
423
- for (;n ;-- n ,++ spt ,++ opt ) opt -> index = spt -> index , opt -> proc = spt -> proc ;
424
- spt = src . ptr , opt = outpt . ptr ;
425
- findpts_local_eval ( & opt -> out , sizeof ( struct eval_out_pt ),
426
- & spt -> el , sizeof ( struct eval_src_pt ),
427
- spt -> r , sizeof ( struct eval_src_pt ),
428
- src . n , in , & fd -> local );
425
+ array_init (struct eval_src_pt , & fd -> savpt ,n ), fd -> savpt .n = n ;
426
+ spt = src .ptr , opt = fd -> savpt .ptr ;
427
+ for (;n ;-- n ,++ spt ,++ opt ) {
428
+ opt -> index = spt -> index ;
429
+ opt -> proc = spt -> proc ;
430
+ opt -> el = spt -> el ;
431
+ for ( d = 0 ; d < D ; ++ d ) opt -> r [ d ] = spt -> r [ d ];
432
+ }
429
433
array_free (& src );
434
+ }
435
+ }
436
+
437
+ void findpts_eval (
438
+ double * const out_base , const unsigned out_stride ,
439
+ const uint * const code_base , const unsigned code_stride ,
440
+ const uint * const proc_base , const unsigned proc_stride ,
441
+ const uint * const el_base , const unsigned el_stride ,
442
+ const double * const r_base , const unsigned r_stride ,
443
+ const uint npt ,
444
+ const double * const in , struct findpts_data * const fd )
445
+ {
446
+ if (fd -> fevsetup == 0 ) {
447
+ setup_fev_aux (code_base ,code_stride ,
448
+ proc_base ,proc_stride ,
449
+ el_base , el_stride ,
450
+ r_base , r_stride ,
451
+ npt , fd );
452
+ fd -> fevsetup = 1 ;
453
+ }
454
+ struct array outpt ;
455
+ /* evaluate points, send back */
456
+ {
457
+ uint n = fd -> savpt .n ;
458
+ struct eval_src_pt * opt ;
459
+ struct eval_out_pt * opto ;
460
+ array_init (struct eval_out_pt ,& outpt ,n ), outpt .n = n ;
461
+ opto = outpt .ptr ;
462
+ opt = fd -> savpt .ptr ;
463
+ for (;n ;-- n ,++ opto ,++ opt ) opto -> index = opt -> index ,opto -> proc = opt -> proc ;
464
+ opto = outpt .ptr ;
465
+ opt = fd -> savpt .ptr ;
466
+ findpts_local_eval (& opto -> out ,sizeof (struct eval_out_pt ),
467
+ & opt -> el ,sizeof (struct eval_src_pt ),
468
+ opt -> r ,sizeof (struct eval_src_pt ),
469
+ fd -> savpt .n , in ,& fd -> local );
430
470
sarray_transfer (struct eval_out_pt ,& outpt ,proc ,1 ,& fd -> cr );
431
471
}
432
472
/* copy results to user data */
@@ -445,6 +485,7 @@ void findpts_eval(
445
485
#undef findpts_free
446
486
#undef findpts_setup
447
487
#undef setup_aux
488
+ #undef setup_fev_aux
448
489
#undef eval_out_pt
449
490
#undef eval_src_pt
450
491
#undef out_pt
0 commit comments