Calculates the net flux across the immersed boundary surface.
Full API contract (arguments, ownership, side effects) is documented with the header declaration in include/poisson.h.
2365{
2366 PetscErrorCode ierr;
2367
2368
2370
2371
2373
2374
2375 DM da = user->
da, fda = user->
fda;
2376
2377 DMDALocalInfo info = user->
info;
2378
2379 PetscInt xs = info.xs, xe = info.xs + info.xm;
2380 PetscInt ys = info.ys, ye = info.ys + info.ym;
2381 PetscInt zs = info.zs, ze = info.zs + info.zm;
2382 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2383
2384 PetscInt i, j, k,ibi;
2385 PetscInt lxs, lys, lzs, lxe, lye, lze;
2386
2387 lxs = xs; lxe = xe;
2388 lys = ys; lye = ye;
2389 lzs = zs; lze = ze;
2390
2391 if (xs==0) lxs = xs+1;
2392 if (ys==0) lys = ys+1;
2393 if (zs==0) lzs = zs+1;
2394
2395 if (xe==mx) lxe = xe-1;
2396 if (ye==my) lye = ye-1;
2397 if (ze==mz) lze = ze-1;
2398
2399 PetscReal epsilon=1.e-8;
2400 PetscReal ***nvert, ibmval=1.9999;
2401
2402 struct Components {
2403 PetscReal x;
2404 PetscReal y;
2405 PetscReal z;
2406 }***ucor, ***csi, ***eta, ***zet;
2407
2408
2409 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
2410
2414
2415 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2416 DMDAVecGetArray(fda, user->
lCsi, &csi);
2417 DMDAVecGetArray(fda, user->
lEta, &eta);
2418 DMDAVecGetArray(fda, user->
lZet, &zet);
2419 DMDAVecGetArray(da, user->
lNvert, &nvert);
2420
2421 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
2422 libm_Flux = 0;
2423 libm_area = 0;
2424
2426
2427
2428 PetscReal *lIB_Flux = NULL, *lIB_area = NULL, *IB_Flux = NULL, *IB_Area = NULL;
2429 if (NumberOfBodies > 1) {
2430
2431 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2432 lIB_area=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2433 IB_Flux=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2434 IB_Area=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2435
2436
2437 for (ibi=0; ibi<NumberOfBodies; ibi++) {
2438 lIB_Flux[ibi]=0.0;
2439 lIB_area[ibi]=0.0;
2440 IB_Flux[ibi]=0.0;
2441 IB_Area[ibi]=0.0;
2442 }
2443 }
2444
2445
2446
2447
2448
2449
2451
2452 for (k=lzs; k<lze; k++) {
2453 for (j=lys; j<lye; j++) {
2454 for (i=lxs; i<lxe; i++) {
2455 if (nvert[k][j][i] < 0.1) {
2456 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2457
2458 if (fabs(ucor[k][j][i].x)>epsilon) {
2459 libm_Flux += ucor[k][j][i].x;
2460 if (flg==3)
2461 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2462 csi[k][j][i].y * csi[k][j][i].y +
2463 csi[k][j][i].z * csi[k][j][i].z);
2464 else
2465 libm_Flux_abs += fabs(ucor[k][j][i].x);
2466
2467 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2468 csi[k][j][i].y * csi[k][j][i].y +
2469 csi[k][j][i].z * csi[k][j][i].z);
2470
2471 if (NumberOfBodies > 1) {
2472
2473 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2474 lIB_Flux[ibi] += ucor[k][j][i].x;
2475 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2476 csi[k][j][i].y * csi[k][j][i].y +
2477 csi[k][j][i].z * csi[k][j][i].z);
2478 }
2479 } else
2480 ucor[k][j][i].x=0.;
2481
2482 }
2483 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2484
2485 if (fabs(ucor[k][j][i].y)>epsilon) {
2486 libm_Flux += ucor[k][j][i].y;
2487 if (flg==3)
2488 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
2489 eta[k][j][i].y * eta[k][j][i].y +
2490 eta[k][j][i].z * eta[k][j][i].z);
2491 else
2492 libm_Flux_abs += fabs(ucor[k][j][i].y);
2493 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2494 eta[k][j][i].y * eta[k][j][i].y +
2495 eta[k][j][i].z * eta[k][j][i].z);
2496 if (NumberOfBodies > 1) {
2497
2498 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2499
2500 lIB_Flux[ibi] += ucor[k][j][i].y;
2501 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2502 eta[k][j][i].y * eta[k][j][i].y +
2503 eta[k][j][i].z * eta[k][j][i].z);
2504 }
2505 } else
2506 ucor[k][j][i].y=0.;
2507 }
2508 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2509
2510 if (fabs(ucor[k][j][i].z)>epsilon) {
2511 libm_Flux += ucor[k][j][i].z;
2512 if (flg==3)
2513 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2514 zet[k][j][i].y * zet[k][j][i].y +
2515 zet[k][j][i].z * zet[k][j][i].z);
2516 else
2517 libm_Flux_abs += fabs(ucor[k][j][i].z);
2518 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2519 zet[k][j][i].y * zet[k][j][i].y +
2520 zet[k][j][i].z * zet[k][j][i].z);
2521
2522 if (NumberOfBodies > 1) {
2523
2524 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2525 lIB_Flux[ibi] += ucor[k][j][i].z;
2526 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2527 zet[k][j][i].y * zet[k][j][i].y +
2528 zet[k][j][i].z * zet[k][j][i].z);
2529 }
2530 }else
2531 ucor[k][j][i].z=0.;
2532 }
2533 }
2534
2535 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2536
2537 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2538 if (fabs(ucor[k][j][i].x)>epsilon) {
2539 libm_Flux -= ucor[k][j][i].x;
2540 if (flg==3)
2541 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2542 csi[k][j][i].y * csi[k][j][i].y +
2543 csi[k][j][i].z * csi[k][j][i].z);
2544 else
2545 libm_Flux_abs += fabs(ucor[k][j][i].x);
2546 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2547 csi[k][j][i].y * csi[k][j][i].y +
2548 csi[k][j][i].z * csi[k][j][i].z);
2549 if (NumberOfBodies > 1) {
2550
2551 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2552 lIB_Flux[ibi] -= ucor[k][j][i].x;
2553 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2554 csi[k][j][i].y * csi[k][j][i].y +
2555 csi[k][j][i].z * csi[k][j][i].z);
2556 }
2557
2558 }else
2559 ucor[k][j][i].x=0.;
2560 }
2561 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2562 if (fabs(ucor[k][j][i].y)>epsilon) {
2563 libm_Flux -= ucor[k][j][i].y;
2564 if (flg==3)
2565 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
2566 eta[k][j][i].y * eta[k][j][i].y +
2567 eta[k][j][i].z * eta[k][j][i].z);
2568 else
2569 libm_Flux_abs += fabs(ucor[k][j][i].y);
2570 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2571 eta[k][j][i].y * eta[k][j][i].y +
2572 eta[k][j][i].z * eta[k][j][i].z);
2573 if (NumberOfBodies > 1) {
2574
2575 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2576 lIB_Flux[ibi] -= ucor[k][j][i].y;
2577 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2578 eta[k][j][i].y * eta[k][j][i].y +
2579 eta[k][j][i].z * eta[k][j][i].z);
2580 }
2581 }else
2582 ucor[k][j][i].y=0.;
2583 }
2584 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2585 if (fabs(ucor[k][j][i].z)>epsilon) {
2586 libm_Flux -= ucor[k][j][i].z;
2587 if (flg==3)
2588 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2589 zet[k][j][i].y * zet[k][j][i].y +
2590 zet[k][j][i].z * zet[k][j][i].z);
2591 else
2592 libm_Flux_abs += fabs(ucor[k][j][i].z);
2593 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2594 zet[k][j][i].y * zet[k][j][i].y +
2595 zet[k][j][i].z * zet[k][j][i].z);
2596 if (NumberOfBodies > 1) {
2597
2598 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2599 lIB_Flux[ibi] -= ucor[k][j][i].z;
2600 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2601 zet[k][j][i].y * zet[k][j][i].y +
2602 zet[k][j][i].z * zet[k][j][i].z);
2603 }
2604 }else
2605 ucor[k][j][i].z=0.;
2606 }
2607 }
2608
2609 }
2610 }
2611 }
2612
2613 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2614 ierr = MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2615 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2616
2617 if (NumberOfBodies > 1) {
2618 ierr = MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2619 ierr = MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD); CHKERRMPI(ierr);
2620 }
2621
2622 PetscReal correction;
2623
2624 PetscReal *Correction = NULL;
2625 if (NumberOfBodies > 1) {
2626 Correction=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2627 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
2628 }
2629
2630 if (*ibm_Area > 1.e-15) {
2631 if (flg>1)
2632 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
2633 else if (flg)
2634 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2635 else
2636 correction = *ibm_Flux / *ibm_Area;
2637 if (NumberOfBodies > 1)
2638 for (ibi=0; ibi<NumberOfBodies; ibi++) if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
2639 }
2640 else {
2641 correction = 0;
2642 }
2643
2644 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
2645 if (NumberOfBodies>1){
2646 for (ibi=0; ibi<NumberOfBodies; ibi++)
LOG_ALLOW(
GLOBAL,
LOG_INFO,
" [Body %d] Uncorrected Flux: %g, Area: %g, Correction: %g\n", ibi, IB_Flux[ibi], IB_Area[ibi], Correction[ibi]);
2647 }
2648
2649
2650
2651
2652
2654
2655 for (k=lzs; k<lze; k++) {
2656 for (j=lys; j<lye; j++) {
2657 for (i=lxs; i<lxe; i++) {
2658 if (nvert[k][j][i] < 0.1) {
2659 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
2660 if (fabs(ucor[k][j][i].x)>epsilon){
2661 if (flg==3)
2662 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
2663 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2664 csi[k][j][i].y * csi[k][j][i].y +
2665 csi[k][j][i].z * csi[k][j][i].z);
2666 else if (flg==2)
2667 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
2668 else if (NumberOfBodies > 1) {
2669 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2670 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2671 csi[k][j][i].y * csi[k][j][i].y +
2672 csi[k][j][i].z * csi[k][j][i].z) *
2673 Correction[ibi];
2674 }
2675 else
2676 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2677 csi[k][j][i].y * csi[k][j][i].y +
2678 csi[k][j][i].z * csi[k][j][i].z) *
2679 correction;
2680 }
2681 }
2682 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2683 if (fabs(ucor[k][j][i].y)>epsilon) {
2684 if (flg==3)
2685 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
2686 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2687 eta[k][j][i].y * eta[k][j][i].y +
2688 eta[k][j][i].z * eta[k][j][i].z);
2689 else if (flg==2)
2690 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
2691 else if (NumberOfBodies > 1) {
2692 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2693 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2694 eta[k][j][i].y * eta[k][j][i].y +
2695 eta[k][j][i].z * eta[k][j][i].z) *
2696 Correction[ibi];
2697 }
2698 else
2699 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2700 eta[k][j][i].y * eta[k][j][i].y +
2701 eta[k][j][i].z * eta[k][j][i].z) *
2702 correction;
2703 }
2704 }
2705 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2706 if (fabs(ucor[k][j][i].z)>epsilon) {
2707 if (flg==3)
2708 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
2709 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2710 zet[k][j][i].y * zet[k][j][i].y +
2711 zet[k][j][i].z * zet[k][j][i].z);
2712 else if (flg==2)
2713 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
2714 else if (NumberOfBodies > 1) {
2715 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2716 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2717 zet[k][j][i].y * zet[k][j][i].y +
2718 zet[k][j][i].z * zet[k][j][i].z) *
2719 Correction[ibi];
2720 }
2721 else
2722 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2723 zet[k][j][i].y * zet[k][j][i].y +
2724 zet[k][j][i].z * zet[k][j][i].z) *
2725 correction;
2726 }
2727 }
2728 }
2729
2730 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2731 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2732 if (fabs(ucor[k][j][i].x)>epsilon) {
2733 if (flg==3)
2734 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
2735 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2736 csi[k][j][i].y * csi[k][j][i].y +
2737 csi[k][j][i].z * csi[k][j][i].z);
2738 else if (flg==2)
2739 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
2740 else if (NumberOfBodies > 1) {
2741 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2742 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2743 csi[k][j][i].y * csi[k][j][i].y +
2744 csi[k][j][i].z * csi[k][j][i].z) *
2745 Correction[ibi];
2746 }
2747 else
2748 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2749 csi[k][j][i].y * csi[k][j][i].y +
2750 csi[k][j][i].z * csi[k][j][i].z) *
2751 correction;
2752 }
2753 }
2754 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2755 if (fabs(ucor[k][j][i].y)>epsilon) {
2756 if (flg==3)
2757 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
2758 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2759 eta[k][j][i].y * eta[k][j][i].y +
2760 eta[k][j][i].z * eta[k][j][i].z);
2761 else if (flg==2)
2762 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
2763 else if (NumberOfBodies > 1) {
2764 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2765 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2766 eta[k][j][i].y * eta[k][j][i].y +
2767 eta[k][j][i].z * eta[k][j][i].z) *
2768 Correction[ibi];
2769 }
2770 else
2771 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2772 eta[k][j][i].y * eta[k][j][i].y +
2773 eta[k][j][i].z * eta[k][j][i].z) *
2774 correction;
2775 }
2776 }
2777 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2778 if (fabs(ucor[k][j][i].z)>epsilon) {
2779 if (flg==3)
2780 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
2781 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2782 zet[k][j][i].y * zet[k][j][i].y +
2783 zet[k][j][i].z * zet[k][j][i].z);
2784 else if (flg==2)
2785 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
2786 else if (NumberOfBodies > 1) {
2787 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2788 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2789 zet[k][j][i].y * zet[k][j][i].y +
2790 zet[k][j][i].z * zet[k][j][i].z) *
2791 Correction[ibi];
2792 }
2793 else
2794 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2795 zet[k][j][i].y * zet[k][j][i].y +
2796 zet[k][j][i].z * zet[k][j][i].z) *
2797 correction;
2798 }
2799 }
2800 }
2801
2802 }
2803 }
2804 }
2805
2806
2807
2808
2809
2811
2812 libm_Flux = 0;
2813 libm_area = 0;
2814 for (k=lzs; k<lze; k++) {
2815 for (j=lys; j<lye; j++) {
2816 for (i=lxs; i<lxe; i++) {
2817 if (nvert[k][j][i] < 0.1) {
2818 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2819 libm_Flux += ucor[k][j][i].x;
2820 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2821 csi[k][j][i].y * csi[k][j][i].y +
2822 csi[k][j][i].z * csi[k][j][i].z);
2823
2824 }
2825 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2826 libm_Flux += ucor[k][j][i].y;
2827 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2828 eta[k][j][i].y * eta[k][j][i].y +
2829 eta[k][j][i].z * eta[k][j][i].z);
2830 }
2831 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2832 libm_Flux += ucor[k][j][i].z;
2833 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2834 zet[k][j][i].y * zet[k][j][i].y +
2835 zet[k][j][i].z * zet[k][j][i].z);
2836 }
2837 }
2838
2839 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2840 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2841 libm_Flux -= ucor[k][j][i].x;
2842 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2843 csi[k][j][i].y * csi[k][j][i].y +
2844 csi[k][j][i].z * csi[k][j][i].z);
2845
2846 }
2847 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2848 libm_Flux -= ucor[k][j][i].y;
2849 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2850 eta[k][j][i].y * eta[k][j][i].y +
2851 eta[k][j][i].z * eta[k][j][i].z);
2852 }
2853 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2854 libm_Flux -= ucor[k][j][i].z;
2855 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2856 zet[k][j][i].y * zet[k][j][i].y +
2857 zet[k][j][i].z * zet[k][j][i].z);
2858 }
2859 }
2860
2861 }
2862 }
2863 }
2864
2865 ierr = MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2866 ierr = MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2867
2868
2869
2871
2872
2874 if (xe==mx){
2875 i=mx-2;
2876 for (k=lzs; k<lze; k++) {
2877 for (j=lys; j<lye; j++) {
2878
2879 if ((nvert[k][j][i]>ibmval && nvert[k][j][i+1]<0.1) || (nvert[k][j][i]<0.1 && nvert[k][j][i+1]>ibmval)) ucor[k][j][i].x=0.0;
2880
2881
2882 }
2883 }
2884 }
2885 }
2886
2888 if (ye==my){
2889 j=my-2;
2890 for (k=lzs; k<lze; k++) {
2891 for (i=lxs; i<lxe; i++) {
2892
2893 if ((nvert[k][j][i]>ibmval && nvert[k][j+1][i]<0.1) || (nvert[k][j][i]<0.1 && nvert[k][j+1][i]>ibmval)) ucor[k][j][i].y=0.0;
2894
2895 }
2896 }
2897 }
2898 }
2899
2901 if (ze==mz){
2902 k=mz-2;
2903 for (j=lys; j<lye; j++) {
2904 for (i=lxs; i<lxe; i++) {
2905
2906 if ((nvert[k][j][i]>ibmval && nvert[k+1][j][i]<0.1) || (nvert[k][j][i]<0.1 && nvert[k+1][j][i]>ibmval)) ucor[k][j][i].z=0.0;
2907
2908 }
2909 }
2910 }
2911 }
2912
2913
2914 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2915 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
2916 DMDAVecRestoreArray(fda, user->
lEta, &eta);
2917 DMDAVecRestoreArray(fda, user->
lZet, &zet);
2918 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
2919
2920 const char *staggered_fields[] = {"Ucont"};
2922
2923 if (NumberOfBodies > 1) {
2924 free(lIB_Flux);
2925 free(lIB_area);
2926 free(IB_Flux);
2927 free(IB_Area);
2928 free(Correction);
2929 }
2930
2932
2933 return 0;
2934}