Calculates the net flux across the immersed boundary surface.
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}