Calculates the net flux across the immersed boundary surface.
2547{
2548
2549
2551
2552
2554 const PetscInt channelz = simCtx->
channelz;
2555 const PetscInt fish = simCtx->
fish;
2556
2557
2558 DM da = user->
da, fda = user->
fda;
2559
2560 DMDALocalInfo info = user->
info;
2561
2562 PetscInt xs = info.xs, xe = info.xs + info.xm;
2563 PetscInt ys = info.ys, ye = info.ys + info.ym;
2564 PetscInt zs = info.zs, ze = info.zs + info.zm;
2565 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2566
2567 PetscInt i, j, k,ibi;
2568 PetscInt lxs, lys, lzs, lxe, lye, lze;
2569
2570 PetscInt gxs, gxe, gys, gye, gzs, gze;
2571
2572 gxs = info.gxs; gxe = gxs + info.gxm;
2573 gys = info.gys; gye = gys + info.gym;
2574 gzs = info.gzs; gze = gzs + info.gzm;
2575
2576 lxs = xs; lxe = xe;
2577 lys = ys; lye = ye;
2578 lzs = zs; lze = ze;
2579
2580 if (xs==0) lxs = xs+1;
2581 if (ys==0) lys = ys+1;
2582 if (zs==0) lzs = zs+1;
2583
2584 if (xe==mx) lxe = xe-1;
2585 if (ye==my) lye = ye-1;
2586 if (ze==mz) lze = ze-1;
2587
2588 PetscReal epsilon=1.e-8;
2589 PetscReal ***nvert, ibmval=1.9999;
2590
2591 struct Components {
2592 PetscReal x;
2593 PetscReal y;
2594 PetscReal z;
2595 }***ucor, ***lucor,***csi, ***eta, ***zet;
2596
2597
2598 PetscInt xend=mx-2 ,yend=my-2,zend=mz-2;
2599
2603
2604 DMDAVecGetArray(fda, user->
Ucont, &ucor);
2605 DMDAVecGetArray(fda, user->
lCsi, &csi);
2606 DMDAVecGetArray(fda, user->
lEta, &eta);
2607 DMDAVecGetArray(fda, user->
lZet, &zet);
2608 DMDAVecGetArray(da, user->
lNvert, &nvert);
2609
2610 PetscReal libm_Flux, libm_area, libm_Flux_abs=0., ibm_Flux_abs;
2611 libm_Flux = 0;
2612 libm_area = 0;
2613
2615
2616
2617 PetscReal *lIB_Flux, *lIB_area,*IB_Flux,*IB_Area;
2618 if (NumberOfBodies > 1) {
2619
2620 lIB_Flux=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2621 lIB_area=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2622 IB_Flux=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2623 IB_Area=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2624
2625
2626 for (ibi=0; ibi<NumberOfBodies; ibi++) {
2627 lIB_Flux[ibi]=0.0;
2628 lIB_area[ibi]=0.0;
2629 IB_Flux[ibi]=0.0;
2630 IB_Area[ibi]=0.0;
2631 }
2632 }
2633
2634
2635
2636
2637
2638
2640
2641 for (k=lzs; k<lze; k++) {
2642 for (j=lys; j<lye; j++) {
2643 for (i=lxs; i<lxe; i++) {
2644 if (nvert[k][j][i] < 0.1) {
2645 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
2646
2647 if (fabs(ucor[k][j][i].x)>epsilon) {
2648 libm_Flux += ucor[k][j][i].x;
2649 if (flg==3)
2650 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2651 csi[k][j][i].y * csi[k][j][i].y +
2652 csi[k][j][i].z * csi[k][j][i].z);
2653 else
2654 libm_Flux_abs += fabs(ucor[k][j][i].x);
2655
2656 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2657 csi[k][j][i].y * csi[k][j][i].y +
2658 csi[k][j][i].z * csi[k][j][i].z);
2659
2660 if (NumberOfBodies > 1) {
2661
2662 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2663 lIB_Flux[ibi] += ucor[k][j][i].x;
2664 lIB_area[ibi] += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2665 csi[k][j][i].y * csi[k][j][i].y +
2666 csi[k][j][i].z * csi[k][j][i].z);
2667 }
2668 } else
2669 ucor[k][j][i].x=0.;
2670
2671 }
2672 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2673
2674 if (fabs(ucor[k][j][i].y)>epsilon) {
2675 libm_Flux += ucor[k][j][i].y;
2676 if (flg==3)
2677 libm_Flux_abs += fabs(ucor[k][j][i].y)/sqrt(eta[k][j][i].x * eta[k][j][i].x +
2678 eta[k][j][i].y * eta[k][j][i].y +
2679 eta[k][j][i].z * eta[k][j][i].z);
2680 else
2681 libm_Flux_abs += fabs(ucor[k][j][i].y);
2682 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2683 eta[k][j][i].y * eta[k][j][i].y +
2684 eta[k][j][i].z * eta[k][j][i].z);
2685 if (NumberOfBodies > 1) {
2686
2687 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2688
2689 lIB_Flux[ibi] += ucor[k][j][i].y;
2690 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2691 eta[k][j][i].y * eta[k][j][i].y +
2692 eta[k][j][i].z * eta[k][j][i].z);
2693 }
2694 } else
2695 ucor[k][j][i].y=0.;
2696 }
2697 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2698
2699 if (fabs(ucor[k][j][i].z)>epsilon) {
2700 libm_Flux += ucor[k][j][i].z;
2701 if (flg==3)
2702 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2703 zet[k][j][i].y * zet[k][j][i].y +
2704 zet[k][j][i].z * zet[k][j][i].z);
2705 else
2706 libm_Flux_abs += fabs(ucor[k][j][i].z);
2707 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2708 zet[k][j][i].y * zet[k][j][i].y +
2709 zet[k][j][i].z * zet[k][j][i].z);
2710
2711 if (NumberOfBodies > 1) {
2712
2713 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2714 lIB_Flux[ibi] += ucor[k][j][i].z;
2715 lIB_area[ibi] += 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 }
2719 }else
2720 ucor[k][j][i].z=0.;
2721 }
2722 }
2723
2724 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2725
2726 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2727 if (fabs(ucor[k][j][i].x)>epsilon) {
2728 libm_Flux -= ucor[k][j][i].x;
2729 if (flg==3)
2730 libm_Flux_abs += fabs(ucor[k][j][i].x)/sqrt(csi[k][j][i].x * csi[k][j][i].x +
2731 csi[k][j][i].y * csi[k][j][i].y +
2732 csi[k][j][i].z * csi[k][j][i].z);
2733 else
2734 libm_Flux_abs += fabs(ucor[k][j][i].x);
2735 libm_area += 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 if (NumberOfBodies > 1) {
2739
2740 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2741 lIB_Flux[ibi] -= ucor[k][j][i].x;
2742 lIB_area[ibi] += 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 }
2746
2747 }else
2748 ucor[k][j][i].x=0.;
2749 }
2750 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2751 if (fabs(ucor[k][j][i].y)>epsilon) {
2752 libm_Flux -= ucor[k][j][i].y;
2753 if (flg==3)
2754 libm_Flux_abs += fabs(ucor[k][j][i].y)/ sqrt(eta[k][j][i].x * eta[k][j][i].x +
2755 eta[k][j][i].y * eta[k][j][i].y +
2756 eta[k][j][i].z * eta[k][j][i].z);
2757 else
2758 libm_Flux_abs += fabs(ucor[k][j][i].y);
2759 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2760 eta[k][j][i].y * eta[k][j][i].y +
2761 eta[k][j][i].z * eta[k][j][i].z);
2762 if (NumberOfBodies > 1) {
2763
2764 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2765 lIB_Flux[ibi] -= ucor[k][j][i].y;
2766 lIB_area[ibi] += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2767 eta[k][j][i].y * eta[k][j][i].y +
2768 eta[k][j][i].z * eta[k][j][i].z);
2769 }
2770 }else
2771 ucor[k][j][i].y=0.;
2772 }
2773 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2774 if (fabs(ucor[k][j][i].z)>epsilon) {
2775 libm_Flux -= ucor[k][j][i].z;
2776 if (flg==3)
2777 libm_Flux_abs += fabs(ucor[k][j][i].z)/sqrt(zet[k][j][i].x * zet[k][j][i].x +
2778 zet[k][j][i].y * zet[k][j][i].y +
2779 zet[k][j][i].z * zet[k][j][i].z);
2780 else
2781 libm_Flux_abs += fabs(ucor[k][j][i].z);
2782 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2783 zet[k][j][i].y * zet[k][j][i].y +
2784 zet[k][j][i].z * zet[k][j][i].z);
2785 if (NumberOfBodies > 1) {
2786
2787 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2788 lIB_Flux[ibi] -= ucor[k][j][i].z;
2789 lIB_area[ibi] += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2790 zet[k][j][i].y * zet[k][j][i].y +
2791 zet[k][j][i].z * zet[k][j][i].z);
2792 }
2793 }else
2794 ucor[k][j][i].z=0.;
2795 }
2796 }
2797
2798 }
2799 }
2800 }
2801
2802 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2803 MPI_Allreduce(&libm_Flux_abs, &ibm_Flux_abs,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2804 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
2805
2806 if (NumberOfBodies > 1) {
2807 MPI_Allreduce(lIB_Flux,IB_Flux,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
2808 MPI_Allreduce(lIB_area,IB_Area,NumberOfBodies,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD);
2809 }
2810
2811 PetscReal correction;
2812
2813 PetscReal *Correction;
2814 if (NumberOfBodies > 1) {
2815 Correction=(PetscReal *)calloc(NumberOfBodies,sizeof(PetscReal));
2816 for (ibi=0; ibi<NumberOfBodies; ibi++) Correction[ibi]=0.0;
2817 }
2818
2819 if (*ibm_Area > 1.e-15) {
2820 if (flg>1)
2821 correction = (*ibm_Flux + user->
FluxIntpSum)/ ibm_Flux_abs;
2822 else if (flg)
2823 correction = (*ibm_Flux + user->
FluxIntpSum) / *ibm_Area;
2824 else
2825 correction = *ibm_Flux / *ibm_Area;
2826 if (NumberOfBodies > 1)
2827 for (ibi=0; ibi<NumberOfBodies; ibi++) if (IB_Area[ibi]>1.e-15) Correction[ibi] = IB_Flux[ibi] / IB_Area[ibi];
2828 }
2829 else {
2830 correction = 0;
2831 }
2832
2833 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"IBM Uncorrected Flux: %g, Area: %g, Correction: %g\n", *ibm_Flux, *ibm_Area, correction);
2834 if (NumberOfBodies>1){
2835 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]);
2836 }
2837
2838
2839
2840
2841
2843
2844 for (k=lzs; k<lze; k++) {
2845 for (j=lys; j<lye; j++) {
2846 for (i=lxs; i<lxe; i++) {
2847 if (nvert[k][j][i] < 0.1) {
2848 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] <ibmval && i < xend) {
2849 if (fabs(ucor[k][j][i].x)>epsilon){
2850 if (flg==3)
2851 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x)/
2852 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2853 csi[k][j][i].y * csi[k][j][i].y +
2854 csi[k][j][i].z * csi[k][j][i].z);
2855 else if (flg==2)
2856 ucor[k][j][i].x -=correction*fabs(ucor[k][j][i].x);
2857 else if (NumberOfBodies > 1) {
2858 ibi=(int)((nvert[k][j][i+1]-1.0)*1001);
2859 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2860 csi[k][j][i].y * csi[k][j][i].y +
2861 csi[k][j][i].z * csi[k][j][i].z) *
2862 Correction[ibi];
2863 }
2864 else
2865 ucor[k][j][i].x -= sqrt(csi[k][j][i].x * csi[k][j][i].x +
2866 csi[k][j][i].y * csi[k][j][i].y +
2867 csi[k][j][i].z * csi[k][j][i].z) *
2868 correction;
2869 }
2870 }
2871 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
2872 if (fabs(ucor[k][j][i].y)>epsilon) {
2873 if (flg==3)
2874 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y)/
2875 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2876 eta[k][j][i].y * eta[k][j][i].y +
2877 eta[k][j][i].z * eta[k][j][i].z);
2878 else if (flg==2)
2879 ucor[k][j][i].y -=correction*fabs(ucor[k][j][i].y);
2880 else if (NumberOfBodies > 1) {
2881 ibi=(int)((nvert[k][j+1][i]-1.0)*1001);
2882 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2883 eta[k][j][i].y * eta[k][j][i].y +
2884 eta[k][j][i].z * eta[k][j][i].z) *
2885 Correction[ibi];
2886 }
2887 else
2888 ucor[k][j][i].y -= sqrt(eta[k][j][i].x * eta[k][j][i].x +
2889 eta[k][j][i].y * eta[k][j][i].y +
2890 eta[k][j][i].z * eta[k][j][i].z) *
2891 correction;
2892 }
2893 }
2894 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
2895 if (fabs(ucor[k][j][i].z)>epsilon) {
2896 if (flg==3)
2897 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z)/
2898 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2899 zet[k][j][i].y * zet[k][j][i].y +
2900 zet[k][j][i].z * zet[k][j][i].z);
2901 else if (flg==2)
2902 ucor[k][j][i].z -= correction*fabs(ucor[k][j][i].z);
2903 else if (NumberOfBodies > 1) {
2904 ibi=(int)((nvert[k+1][j][i]-1.0)*1001);
2905 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2906 zet[k][j][i].y * zet[k][j][i].y +
2907 zet[k][j][i].z * zet[k][j][i].z) *
2908 Correction[ibi];
2909 }
2910 else
2911 ucor[k][j][i].z -= sqrt(zet[k][j][i].x * zet[k][j][i].x +
2912 zet[k][j][i].y * zet[k][j][i].y +
2913 zet[k][j][i].z * zet[k][j][i].z) *
2914 correction;
2915 }
2916 }
2917 }
2918
2919 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
2920 if (nvert[k][j][i+1] < 0.1 && i < xend) {
2921 if (fabs(ucor[k][j][i].x)>epsilon) {
2922 if (flg==3)
2923 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x)/
2924 sqrt(csi[k][j][i].x * csi[k][j][i].x +
2925 csi[k][j][i].y * csi[k][j][i].y +
2926 csi[k][j][i].z * csi[k][j][i].z);
2927 else if (flg==2)
2928 ucor[k][j][i].x += correction*fabs(ucor[k][j][i].x);
2929 else if (NumberOfBodies > 1) {
2930 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2931 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2932 csi[k][j][i].y * csi[k][j][i].y +
2933 csi[k][j][i].z * csi[k][j][i].z) *
2934 Correction[ibi];
2935 }
2936 else
2937 ucor[k][j][i].x += sqrt(csi[k][j][i].x * csi[k][j][i].x +
2938 csi[k][j][i].y * csi[k][j][i].y +
2939 csi[k][j][i].z * csi[k][j][i].z) *
2940 correction;
2941 }
2942 }
2943 if (nvert[k][j+1][i] < 0.1 && j < yend) {
2944 if (fabs(ucor[k][j][i].y)>epsilon) {
2945 if (flg==3)
2946 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y)/
2947 sqrt(eta[k][j][i].x * eta[k][j][i].x +
2948 eta[k][j][i].y * eta[k][j][i].y +
2949 eta[k][j][i].z * eta[k][j][i].z);
2950 else if (flg==2)
2951 ucor[k][j][i].y +=correction*fabs(ucor[k][j][i].y);
2952 else if (NumberOfBodies > 1) {
2953 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2954 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2955 eta[k][j][i].y * eta[k][j][i].y +
2956 eta[k][j][i].z * eta[k][j][i].z) *
2957 Correction[ibi];
2958 }
2959 else
2960 ucor[k][j][i].y += sqrt(eta[k][j][i].x * eta[k][j][i].x +
2961 eta[k][j][i].y * eta[k][j][i].y +
2962 eta[k][j][i].z * eta[k][j][i].z) *
2963 correction;
2964 }
2965 }
2966 if (nvert[k+1][j][i] < 0.1 && k < zend) {
2967 if (fabs(ucor[k][j][i].z)>epsilon) {
2968 if (flg==3)
2969 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z)/
2970 sqrt(zet[k][j][i].x * zet[k][j][i].x +
2971 zet[k][j][i].y * zet[k][j][i].y +
2972 zet[k][j][i].z * zet[k][j][i].z);
2973 else if (flg==2)
2974 ucor[k][j][i].z += correction*fabs(ucor[k][j][i].z);
2975 else if (NumberOfBodies > 1) {
2976 ibi=(int)((nvert[k][j][i]-1.0)*1001);
2977 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2978 zet[k][j][i].y * zet[k][j][i].y +
2979 zet[k][j][i].z * zet[k][j][i].z) *
2980 Correction[ibi];
2981 }
2982 else
2983 ucor[k][j][i].z += sqrt(zet[k][j][i].x * zet[k][j][i].x +
2984 zet[k][j][i].y * zet[k][j][i].y +
2985 zet[k][j][i].z * zet[k][j][i].z) *
2986 correction;
2987 }
2988 }
2989 }
2990
2991 }
2992 }
2993 }
2994
2995
2996
2997
2998
3000
3001 libm_Flux = 0;
3002 libm_area = 0;
3003 for (k=lzs; k<lze; k++) {
3004 for (j=lys; j<lye; j++) {
3005 for (i=lxs; i<lxe; i++) {
3006 if (nvert[k][j][i] < 0.1) {
3007 if (nvert[k][j][i+1] > 0.1 && nvert[k][j][i+1] < ibmval && i < xend) {
3008 libm_Flux += ucor[k][j][i].x;
3009 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3010 csi[k][j][i].y * csi[k][j][i].y +
3011 csi[k][j][i].z * csi[k][j][i].z);
3012
3013 }
3014 if (nvert[k][j+1][i] > 0.1 && nvert[k][j+1][i] < ibmval && j < yend) {
3015 libm_Flux += ucor[k][j][i].y;
3016 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3017 eta[k][j][i].y * eta[k][j][i].y +
3018 eta[k][j][i].z * eta[k][j][i].z);
3019 }
3020 if (nvert[k+1][j][i] > 0.1 && nvert[k+1][j][i] < ibmval && k < zend) {
3021 libm_Flux += ucor[k][j][i].z;
3022 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3023 zet[k][j][i].y * zet[k][j][i].y +
3024 zet[k][j][i].z * zet[k][j][i].z);
3025 }
3026 }
3027
3028 if (nvert[k][j][i] > 0.1 && nvert[k][j][i] < ibmval) {
3029 if (nvert[k][j][i+1] < 0.1 && i < xend) {
3030 libm_Flux -= ucor[k][j][i].x;
3031 libm_area += sqrt(csi[k][j][i].x * csi[k][j][i].x +
3032 csi[k][j][i].y * csi[k][j][i].y +
3033 csi[k][j][i].z * csi[k][j][i].z);
3034
3035 }
3036 if (nvert[k][j+1][i] < 0.1 && j < yend) {
3037 libm_Flux -= ucor[k][j][i].y;
3038 libm_area += sqrt(eta[k][j][i].x * eta[k][j][i].x +
3039 eta[k][j][i].y * eta[k][j][i].y +
3040 eta[k][j][i].z * eta[k][j][i].z);
3041 }
3042 if (nvert[k+1][j][i] < 0.1 && k < zend) {
3043 libm_Flux -= ucor[k][j][i].z;
3044 libm_area += sqrt(zet[k][j][i].x * zet[k][j][i].x +
3045 zet[k][j][i].y * zet[k][j][i].y +
3046 zet[k][j][i].z * zet[k][j][i].z);
3047 }
3048 }
3049
3050 }
3051 }
3052 }
3053
3054 MPI_Allreduce(&libm_Flux, ibm_Flux,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3055 MPI_Allreduce(&libm_area, ibm_Area,1,MPI_DOUBLE,MPI_SUM, PETSC_COMM_WORLD);
3056
3057
3058
3060
3061
3063 if (xe==mx){
3064 i=mx-2;
3065 for (k=lzs; k<lze; k++) {
3066 for (j=lys; j<lye; j++) {
3067
3068 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;
3069
3070
3071 }
3072 }
3073 }
3074 }
3075
3077 if (ye==my){
3078 j=my-2;
3079 for (k=lzs; k<lze; k++) {
3080 for (i=lxs; i<lxe; i++) {
3081
3082 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;
3083
3084 }
3085 }
3086 }
3087 }
3088
3090 if (ze==mz){
3091 k=mz-2;
3092 for (j=lys; j<lye; j++) {
3093 for (i=lxs; i<lxe; i++) {
3094
3095 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;
3096
3097 }
3098 }
3099 }
3100 }
3101
3102
3103 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
3104 DMDAVecRestoreArray(fda, user->
lCsi, &csi);
3105 DMDAVecRestoreArray(fda, user->
lEta, &eta);
3106 DMDAVecRestoreArray(fda, user->
lZet, &zet);
3107 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3108
3109 DMGlobalToLocalBegin(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3110 DMGlobalToLocalEnd(fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3111
3112
3113
3114 DMDAVecGetArray(fda, user->
lUcont, &lucor);
3115 DMDAVecGetArray(fda, user->
Ucont, &ucor);
3116
3118 if (xs==0){
3119 i=xs;
3120 for (k=zs; k<ze; k++) {
3121 for (j=ys; j<ye; j++) {
3122 if(j>0 && k>0 && j<user->JM && k<user->KM){
3123 ucor[k][j][i].x=lucor[k][j][i-2].x;
3124 }
3125 }
3126 }
3127 }
3128 }
3130 if (ys==0){
3131 j=ys;
3132 for (k=zs; k<ze; k++) {
3133 for (i=xs; i<xe; i++) {
3134 if(i>0 && k>0 && i<user->IM && k<user->KM){
3135 ucor[k][j][i].y=lucor[k][j-2][i].y;
3136 }
3137 }
3138 }
3139 }
3140 }
3142 if (zs==0){
3143 k=zs;
3144 for (j=ys; j<ye; j++) {
3145 for (i=xs; i<xe; i++) {
3146 if(i>0 && j>0 && i<user->IM && j<user->JM){
3147 ucor[k][j][i].z=lucor[k-2][j][i].z;
3148 }
3149 }
3150 }
3151 }
3152 }
3153 DMDAVecRestoreArray(fda, user->
lUcont, &lucor);
3154 DMDAVecRestoreArray(fda, user->
Ucont, &ucor);
3155
3156
3157
3158 DMGlobalToLocalBegin(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3159 DMGlobalToLocalEnd(user->
fda, user->
Ucont, INSERT_VALUES, user->
lUcont);
3160
3161 if (NumberOfBodies > 1) {
3162 free(lIB_Flux);
3163 free(lIB_area);
3164 free(IB_Flux);
3165 free(IB_Area);
3166 free(Correction);
3167 }
3168
3170
3171 return 0;
3172}