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