Working 2D-mpi for enhanced solver
This commit is contained in:
		@@ -39,7 +39,7 @@ $(BUILD_DIR)/%.s:  %.c
 | 
			
		||||
 | 
			
		||||
.PHONY: clean distclean tags info asm format
 | 
			
		||||
 | 
			
		||||
clean: viz
 | 
			
		||||
clean: vis
 | 
			
		||||
	$(info ===>  CLEAN)
 | 
			
		||||
	@rm -rf $(BUILD_DIR)
 | 
			
		||||
	@rm -f tags
 | 
			
		||||
@@ -48,7 +48,7 @@ distclean: clean
 | 
			
		||||
	$(info ===>  DIST CLEAN)
 | 
			
		||||
	@rm -f $(TARGET)
 | 
			
		||||
 | 
			
		||||
viz:
 | 
			
		||||
vis:
 | 
			
		||||
	$(info ===>  REMOVING VIZUALISATION FILES)	
 | 
			
		||||
	@rm -f vtk_files/particle*.vtk
 | 
			
		||||
	@rm -f vis_files/particle*.dat
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ bcRight    3			#
 | 
			
		||||
gx    0.0      # Body forces (e.g. gravity)
 | 
			
		||||
gy    0.0      #
 | 
			
		||||
 | 
			
		||||
re    16500.0	   # Reynolds number
 | 
			
		||||
re    36500.0	   # Reynolds number
 | 
			
		||||
 | 
			
		||||
u_init    1.0      # initial value for velocity in x-direction
 | 
			
		||||
v_init    0.0      # initial value for velocity in y-direction
 | 
			
		||||
@@ -48,10 +48,10 @@ gamma    0.9       # upwind differencing factor gamma
 | 
			
		||||
# Particle Tracing Data:
 | 
			
		||||
# -----------------------
 | 
			
		||||
 | 
			
		||||
numberOfParticles   60
 | 
			
		||||
startTime           100.0
 | 
			
		||||
injectTimePeriod    0.5
 | 
			
		||||
writeTimePeriod     0.2
 | 
			
		||||
numberOfParticles   200
 | 
			
		||||
startTime           0
 | 
			
		||||
injectTimePeriod    1.0
 | 
			
		||||
writeTimePeriod     0.5
 | 
			
		||||
 | 
			
		||||
x1                  0.0
 | 
			
		||||
y1                  0.5
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -25,8 +25,7 @@
 | 
			
		||||
 | 
			
		||||
static double distance(double i, double j, double iCenter, double jCenter)
 | 
			
		||||
{
 | 
			
		||||
    return sqrt(pow(iCenter - i, 2)
 | 
			
		||||
                + pow(jCenter - j, 2) * 1.0);
 | 
			
		||||
    return sqrt(pow(iCenter - i, 2) + pow(jCenter - j, 2) * 1.0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void print(Solver* solver, double* grid)
 | 
			
		||||
@@ -106,7 +105,6 @@ void initSolver(Solver* solver, Parameter* params)
 | 
			
		||||
    solver->gamma    = params->gamma;
 | 
			
		||||
    solver->rho      = params->rho;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    int imax    = solver->imax;
 | 
			
		||||
    int jmax    = solver->jmax;
 | 
			
		||||
    size_t size = (imax + 2) * (jmax + 2) * sizeof(double);
 | 
			
		||||
@@ -134,75 +132,86 @@ void initSolver(Solver* solver, Parameter* params)
 | 
			
		||||
    solver->dtBound  = 0.5 * solver->re * 1.0 / invSqrSum;
 | 
			
		||||
 | 
			
		||||
    double xCenter = 0, yCenter = 0, radius = 0;
 | 
			
		||||
    double x1=0, x2=0, y1=0, y2=0;
 | 
			
		||||
    double x1 = 0, x2 = 0, y1 = 0, y2 = 0;
 | 
			
		||||
 | 
			
		||||
    int* s = solver->s;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    switch(params->shape)
 | 
			
		||||
    {
 | 
			
		||||
        case NOSHAPE:
 | 
			
		||||
            break;
 | 
			
		||||
        case RECT:
 | 
			
		||||
            x1 = params->xCenter - params->xRectLength/2;
 | 
			
		||||
            x2 = params->xCenter + params->xRectLength/2;
 | 
			
		||||
            y1 = params->yCenter - params->yRectLength/2;
 | 
			
		||||
            y2 = params->yCenter + params->yRectLength/2;
 | 
			
		||||
    switch (params->shape) {
 | 
			
		||||
    case NOSHAPE:
 | 
			
		||||
        break;
 | 
			
		||||
    case RECT:
 | 
			
		||||
        x1 = params->xCenter - params->xRectLength / 2;
 | 
			
		||||
        x2 = params->xCenter + params->xRectLength / 2;
 | 
			
		||||
        y1 = params->yCenter - params->yRectLength / 2;
 | 
			
		||||
        y2 = params->yCenter + params->yRectLength / 2;
 | 
			
		||||
 | 
			
		||||
            for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
            {
 | 
			
		||||
                for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
                {
 | 
			
		||||
                    if((x1 <= (i*dx)) && ((i*dx) <= x2) && (y1 <= (j*dy)) && ((j*dy) <= y2))
 | 
			
		||||
                    {
 | 
			
		||||
                        S(i, j) = LOCAL;
 | 
			
		||||
                    }
 | 
			
		||||
        for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
            for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
                if ((x1 <= (i * dx)) && ((i * dx) <= x2) && (y1 <= (j * dy)) &&
 | 
			
		||||
                    ((j * dy) <= y2)) {
 | 
			
		||||
                    S(i, j) = LOCAL;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        case CIRCLE:
 | 
			
		||||
            xCenter = params->xCenter;
 | 
			
		||||
            yCenter = params->yCenter;
 | 
			
		||||
            radius  = params->circleRadius;
 | 
			
		||||
        break;
 | 
			
		||||
    case CIRCLE:
 | 
			
		||||
        xCenter = params->xCenter;
 | 
			
		||||
        yCenter = params->yCenter;
 | 
			
		||||
        radius  = params->circleRadius;
 | 
			
		||||
 | 
			
		||||
            for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
            {
 | 
			
		||||
                for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
                {
 | 
			
		||||
                    if(distance((i*dx), (j*dy), xCenter, yCenter) <= radius)
 | 
			
		||||
                    {
 | 
			
		||||
                        S(i, j) = LOCAL;
 | 
			
		||||
                    }
 | 
			
		||||
        for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
            for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
                if (distance((i * dx), (j * dy), xCenter, yCenter) <= radius) {
 | 
			
		||||
                    S(i, j) = LOCAL;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            break;
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
        {
 | 
			
		||||
            // if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE && S(i-1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMRIGHT;
 | 
			
		||||
            // else if( S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE && S(i+1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMLEFT;
 | 
			
		||||
            // else if( S(i+1,j-1) == NONE && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOPRIGHT;
 | 
			
		||||
            // else if( S(i-1,j-1) == NONE && S(i,j-1) == NONE && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOPLEFT;
 | 
			
		||||
            // else if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = RIGHT;
 | 
			
		||||
            // else if( S(i,j+1) == NONE && S(i,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOM;
 | 
			
		||||
            // else if( S(i-1,j) == NONE && S(i+1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = LEFT;
 | 
			
		||||
            // else if( S(i,j-1) == NONE && S(i,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP;
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            // if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE &&
 | 
			
		||||
            // S(i-1,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMRIGHT; else if(
 | 
			
		||||
            // S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE && S(i+1,j-1) ==
 | 
			
		||||
            // LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOMLEFT; else if( S(i+1,j-1) == NONE
 | 
			
		||||
            // && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL && S(i,j) ==
 | 
			
		||||
            // LOCAL ) S(i,j) = TOPRIGHT; else if( S(i-1,j-1) == NONE && S(i,j-1) == NONE
 | 
			
		||||
            // && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) =
 | 
			
		||||
            // TOPLEFT; else if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) == LOCAL
 | 
			
		||||
            // ) S(i,j) = RIGHT; else if( S(i,j+1) == NONE && S(i,j-1) == LOCAL && S(i,j)
 | 
			
		||||
            // == LOCAL ) S(i,j) = BOTTOM; else if( S(i-1,j) == NONE && S(i+1,j) == LOCAL
 | 
			
		||||
            // && S(i,j) == LOCAL ) S(i,j) = LEFT; else if( S(i,j-1) == NONE && S(i,j+1)
 | 
			
		||||
            // == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP;
 | 
			
		||||
 | 
			
		||||
            if( S(i,j-1) == NONE && S(i,j+1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = BOTTOM; //TOP
 | 
			
		||||
            if( S(i-1,j) == NONE && S(i+1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = LEFT; //LEFT
 | 
			
		||||
            if( S(i+1,j) == NONE && S(i-1,j) == LOCAL && S(i,j) == LOCAL ) S(i,j) = RIGHT; //RIGHT
 | 
			
		||||
            if( S(i,j+1) == NONE && S(i,j-1) == LOCAL && S(i,j) == LOCAL ) S(i,j) = TOP; //BOTTOM
 | 
			
		||||
            if( S(i-1,j-1) == NONE && S(i,j-1) == NONE && S(i-1,j) == NONE && S(i+1,j+1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == LEFT || S(i,j) == BOTTOM ) ) S(i,j) = BOTTOMLEFT; //TOPLEFT
 | 
			
		||||
            if( S(i+1,j-1) == NONE && S(i,j-1) == NONE && S(i+1,j) == NONE && S(i-1,j+1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == RIGHT || S(i,j) == BOTTOM ) ) S(i,j) = BOTTOMRIGHT; //TOPRIGHT
 | 
			
		||||
            if( S(i-1,j+1) == NONE && S(i-1,j) == NONE && S(i,j+1) == NONE && S(i+1,j-1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == LEFT || S(i,j) == TOP )) S(i,j) = TOPLEFT; //BOTTOMLEFT
 | 
			
		||||
            if( S(i+1,j+1) == NONE && S(i+1,j) == NONE && S(i,j+1) == NONE && S(i-1,j-1) == LOCAL && (S(i,j) == LOCAL || S(i,j) == RIGHT || S(i,j) == TOP ) ) S(i,j) = TOPRIGHT; //BOTTOMRIGHT
 | 
			
		||||
            if (S(i, j - 1) == NONE && S(i, j + 1) == LOCAL && S(i, j) == LOCAL)
 | 
			
		||||
                S(i, j) = BOTTOM; // TOP
 | 
			
		||||
            if (S(i - 1, j) == NONE && S(i + 1, j) == LOCAL && S(i, j) == LOCAL)
 | 
			
		||||
                S(i, j) = LEFT; // LEFT
 | 
			
		||||
            if (S(i + 1, j) == NONE && S(i - 1, j) == LOCAL && S(i, j) == LOCAL)
 | 
			
		||||
                S(i, j) = RIGHT; // RIGHT
 | 
			
		||||
            if (S(i, j + 1) == NONE && S(i, j - 1) == LOCAL && S(i, j) == LOCAL)
 | 
			
		||||
                S(i, j) = TOP; // BOTTOM
 | 
			
		||||
            if (S(i - 1, j - 1) == NONE && S(i, j - 1) == NONE && S(i - 1, j) == NONE &&
 | 
			
		||||
                S(i + 1, j + 1) == LOCAL &&
 | 
			
		||||
                (S(i, j) == LOCAL || S(i, j) == LEFT || S(i, j) == BOTTOM))
 | 
			
		||||
                S(i, j) = BOTTOMLEFT; // TOPLEFT
 | 
			
		||||
            if (S(i + 1, j - 1) == NONE && S(i, j - 1) == NONE && S(i + 1, j) == NONE &&
 | 
			
		||||
                S(i - 1, j + 1) == LOCAL &&
 | 
			
		||||
                (S(i, j) == LOCAL || S(i, j) == RIGHT || S(i, j) == BOTTOM))
 | 
			
		||||
                S(i, j) = BOTTOMRIGHT; // TOPRIGHT
 | 
			
		||||
            if (S(i - 1, j + 1) == NONE && S(i - 1, j) == NONE && S(i, j + 1) == NONE &&
 | 
			
		||||
                S(i + 1, j - 1) == LOCAL &&
 | 
			
		||||
                (S(i, j) == LOCAL || S(i, j) == LEFT || S(i, j) == TOP))
 | 
			
		||||
                S(i, j) = TOPLEFT; // BOTTOMLEFT
 | 
			
		||||
            if (S(i + 1, j + 1) == NONE && S(i + 1, j) == NONE && S(i, j + 1) == NONE &&
 | 
			
		||||
                S(i - 1, j - 1) == LOCAL &&
 | 
			
		||||
                (S(i, j) == LOCAL || S(i, j) == RIGHT || S(i, j) == TOP))
 | 
			
		||||
                S(i, j) = TOPRIGHT; // BOTTOMRIGHT
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -223,12 +232,11 @@ void computeRHS(Solver* solver)
 | 
			
		||||
    double* g   = solver->g;
 | 
			
		||||
    int* s      = solver->s;
 | 
			
		||||
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
        {
 | 
			
		||||
            // if(S(i,j) == NONE) 
 | 
			
		||||
            RHS(i, j) = idt * ((F(i, j) - F(i - 1, j)) * idx + (G(i, j) - G(i, j - 1)) * idy);
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            // if(S(i,j) == NONE)
 | 
			
		||||
            RHS(i, j) = idt *
 | 
			
		||||
                        ((F(i, j) - F(i - 1, j)) * idx + (G(i, j) - G(i, j - 1)) * idy);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -276,7 +284,7 @@ void solve(Solver* solver)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        res = res / (double)(imax * jmax);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
        printf("%d Residuum: %e\n", it, res);
 | 
			
		||||
#endif
 | 
			
		||||
@@ -311,7 +319,6 @@ void solveRB(Solver* solver)
 | 
			
		||||
        res = 0.0;
 | 
			
		||||
        jsw = 1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            P(i, 0)        = P(i, 1);
 | 
			
		||||
            P(i, jmax + 1) = P(i, jmax);
 | 
			
		||||
@@ -324,23 +331,20 @@ void solveRB(Solver* solver)
 | 
			
		||||
 | 
			
		||||
        // setObjectPBoundaryCondition(solver);
 | 
			
		||||
 | 
			
		||||
        for (pass = 0; pass < 2; pass++) 
 | 
			
		||||
        {
 | 
			
		||||
        for (pass = 0; pass < 2; pass++) {
 | 
			
		||||
            isw = jsw;
 | 
			
		||||
 | 
			
		||||
            for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
            {
 | 
			
		||||
                for (int i = isw; i < imax + 1; i += 2) 
 | 
			
		||||
                {
 | 
			
		||||
            for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
                for (int i = isw; i < imax + 1; i += 2) {
 | 
			
		||||
                    // if(S(i,j) == NONE)
 | 
			
		||||
                    // {
 | 
			
		||||
                        double r = RHS(i, j) -
 | 
			
		||||
                                ((P(i + 1, j) - 2.0 * P(i, j) + P(i - 1, j)) * idx2 +
 | 
			
		||||
                                    (P(i, j + 1) - 2.0 * P(i, j) + P(i, j - 1)) * idy2);
 | 
			
		||||
                    double r = RHS(i, j) -
 | 
			
		||||
                               ((P(i + 1, j) - 2.0 * P(i, j) + P(i - 1, j)) * idx2 +
 | 
			
		||||
                                   (P(i, j + 1) - 2.0 * P(i, j) + P(i, j - 1)) * idy2);
 | 
			
		||||
 | 
			
		||||
                        P(i, j) -= (factor * r );
 | 
			
		||||
                        
 | 
			
		||||
                        res += (r * r);
 | 
			
		||||
                    P(i, j) -= (factor * r);
 | 
			
		||||
 | 
			
		||||
                    res += (r * r);
 | 
			
		||||
                    // }
 | 
			
		||||
                }
 | 
			
		||||
                isw = 3 - isw;
 | 
			
		||||
@@ -349,7 +353,7 @@ void solveRB(Solver* solver)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        res = res / (double)(imax * jmax);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
        printf("%d Residuum: %e\n", it, res);
 | 
			
		||||
#endif
 | 
			
		||||
@@ -400,7 +404,7 @@ void solveRBA(Solver* solver)
 | 
			
		||||
                }
 | 
			
		||||
                isw = 3 - isw;
 | 
			
		||||
            }
 | 
			
		||||
            jsw = 3 - jsw;
 | 
			
		||||
            jsw   = 3 - jsw;
 | 
			
		||||
            omega = (it == 0 && pass == 0 ? 1.0 / (1.0 - 0.5 * rho * rho)
 | 
			
		||||
                                          : 1.0 / (1.0 - 0.25 * rho * rho * omega));
 | 
			
		||||
        }
 | 
			
		||||
@@ -589,8 +593,7 @@ void setSpecialBoundaryCondition(Solver* solver)
 | 
			
		||||
        for (int i = 1; i < imax; i++) {
 | 
			
		||||
            U(i, jmax + 1) = 2.0 - U(i, jmax);
 | 
			
		||||
        }
 | 
			
		||||
    } 
 | 
			
		||||
    else if (strcmp(solver->problem, "canal") == 0) {
 | 
			
		||||
    } else if (strcmp(solver->problem, "canal") == 0) {
 | 
			
		||||
        double ylength = solver->ylength;
 | 
			
		||||
        double y;
 | 
			
		||||
 | 
			
		||||
@@ -598,18 +601,12 @@ void setSpecialBoundaryCondition(Solver* solver)
 | 
			
		||||
            y       = mDy * (j - 0.5);
 | 
			
		||||
            U(0, j) = y * (ylength - y) * 4.0 / (ylength * ylength);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else if (strcmp(solver->problem, "backstep") == 0) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
        {
 | 
			
		||||
            if(S(0,j) == NONE) U(0, j) = 1.0;
 | 
			
		||||
    } else if (strcmp(solver->problem, "backstep") == 0) {
 | 
			
		||||
        for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
            if (S(0, j) == NONE) U(0, j) = 1.0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else if (strcmp(solver->problem, "karman") == 0) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
        {
 | 
			
		||||
    } else if (strcmp(solver->problem, "karman") == 0) {
 | 
			
		||||
        for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
            U(0, j) = 1.0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -617,62 +614,59 @@ void setSpecialBoundaryCondition(Solver* solver)
 | 
			
		||||
 | 
			
		||||
void setObjectBoundaryCondition(Solver* solver)
 | 
			
		||||
{
 | 
			
		||||
    int imax   = solver->imax;
 | 
			
		||||
    int jmax   = solver->jmax;
 | 
			
		||||
    double* u  = solver->u;
 | 
			
		||||
    double* v  = solver->v;
 | 
			
		||||
    int* s     = solver->s;
 | 
			
		||||
    int imax  = solver->imax;
 | 
			
		||||
    int jmax  = solver->jmax;
 | 
			
		||||
    double* u = solver->u;
 | 
			
		||||
    double* v = solver->v;
 | 
			
		||||
    int* s    = solver->s;
 | 
			
		||||
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
        {
 | 
			
		||||
            switch(S(i,j))
 | 
			
		||||
            {
 | 
			
		||||
                case TOP:
 | 
			
		||||
                    U(i,j)      = -U(i,j+1);
 | 
			
		||||
                    U(i-1,j)    = -U(i-1,j+1);
 | 
			
		||||
                    V(i,j)      = 0.0;
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOM:
 | 
			
		||||
                    U(i,j)      = -U(i,j-1);
 | 
			
		||||
                    U(i-1,j)    = -U(i-1,j-1);
 | 
			
		||||
                    V(i,j)      = 0.0;
 | 
			
		||||
                    break;
 | 
			
		||||
                case LEFT:
 | 
			
		||||
                    U(i-1,j)      = 0.0;
 | 
			
		||||
                    V(i,j)      = -V(i-1,j);
 | 
			
		||||
                    V(i,j-1)    = -V(i-1,j-1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case RIGHT:
 | 
			
		||||
                    U(i,j)      = 0.0;
 | 
			
		||||
                    V(i,j)      = -V(i+1,j);
 | 
			
		||||
                    V(i,j-1)    = -V(i+1,j-1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case TOPLEFT:
 | 
			
		||||
                    U(i,j)      = -U(i,j+1);
 | 
			
		||||
                    U(i-1,j)    = 0.0;
 | 
			
		||||
                    V(i,j)      = 0.0;
 | 
			
		||||
                    V(i,j-1)    = -V(i-1,j-1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case TOPRIGHT:
 | 
			
		||||
                    U(i,j)      = 0.0;
 | 
			
		||||
                    U(i-1,j)    = -U(i-1,j+1);
 | 
			
		||||
                    V(i,j)      = 0.0;
 | 
			
		||||
                    V(i,j-1)    = -V(i+1,j-1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOMLEFT:
 | 
			
		||||
                    U(i,j)      = -U(i,j-1);
 | 
			
		||||
                    U(i-1,j)    = 0.0;
 | 
			
		||||
                    V(i,j)      = -V(i-1,j);
 | 
			
		||||
                    V(i,j-1)    = 0.0;
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOMRIGHT:
 | 
			
		||||
                    U(i,j)      = 0.0;
 | 
			
		||||
                    U(i-1,j)    = -U(i-1,j-1);
 | 
			
		||||
                    V(i,j)      = -V(i,j+1);
 | 
			
		||||
                    V(i,j-1)    = 0.0;
 | 
			
		||||
                    break;
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            switch (S(i, j)) {
 | 
			
		||||
            case TOP:
 | 
			
		||||
                U(i, j)     = -U(i, j + 1);
 | 
			
		||||
                U(i - 1, j) = -U(i - 1, j + 1);
 | 
			
		||||
                V(i, j)     = 0.0;
 | 
			
		||||
                break;
 | 
			
		||||
            case BOTTOM:
 | 
			
		||||
                U(i, j)     = -U(i, j - 1);
 | 
			
		||||
                U(i - 1, j) = -U(i - 1, j - 1);
 | 
			
		||||
                V(i, j)     = 0.0;
 | 
			
		||||
                break;
 | 
			
		||||
            case LEFT:
 | 
			
		||||
                U(i - 1, j) = 0.0;
 | 
			
		||||
                V(i, j)     = -V(i - 1, j);
 | 
			
		||||
                V(i, j - 1) = -V(i - 1, j - 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case RIGHT:
 | 
			
		||||
                U(i, j)     = 0.0;
 | 
			
		||||
                V(i, j)     = -V(i + 1, j);
 | 
			
		||||
                V(i, j - 1) = -V(i + 1, j - 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case TOPLEFT:
 | 
			
		||||
                U(i, j)     = -U(i, j + 1);
 | 
			
		||||
                U(i - 1, j) = 0.0;
 | 
			
		||||
                V(i, j)     = 0.0;
 | 
			
		||||
                V(i, j - 1) = -V(i - 1, j - 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case TOPRIGHT:
 | 
			
		||||
                U(i, j)     = 0.0;
 | 
			
		||||
                U(i - 1, j) = -U(i - 1, j + 1);
 | 
			
		||||
                V(i, j)     = 0.0;
 | 
			
		||||
                V(i, j - 1) = -V(i + 1, j - 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case BOTTOMLEFT:
 | 
			
		||||
                U(i, j)     = -U(i, j - 1);
 | 
			
		||||
                U(i - 1, j) = 0.0;
 | 
			
		||||
                V(i, j)     = -V(i - 1, j);
 | 
			
		||||
                V(i, j - 1) = 0.0;
 | 
			
		||||
                break;
 | 
			
		||||
            case BOTTOMRIGHT:
 | 
			
		||||
                U(i, j)     = 0.0;
 | 
			
		||||
                U(i - 1, j) = -U(i - 1, j - 1);
 | 
			
		||||
                V(i, j)     = -V(i, j + 1);
 | 
			
		||||
                V(i, j - 1) = 0.0;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -680,45 +674,42 @@ void setObjectBoundaryCondition(Solver* solver)
 | 
			
		||||
 | 
			
		||||
void setObjectPBoundaryCondition(Solver* solver)
 | 
			
		||||
{
 | 
			
		||||
    int imax      = solver->imax;
 | 
			
		||||
    int jmax      = solver->jmax;
 | 
			
		||||
    
 | 
			
		||||
    double* p     = solver->p;
 | 
			
		||||
    int*    s     = solver->s;
 | 
			
		||||
    
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
        {
 | 
			
		||||
            switch (S(i,j))
 | 
			
		||||
            {
 | 
			
		||||
                case TOP:
 | 
			
		||||
                    P(i,j)      = P(i,j+1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOM:
 | 
			
		||||
                    P(i,j)      = P(i,j-1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case LEFT:
 | 
			
		||||
                    P(i,j)      = P(i-1,j);
 | 
			
		||||
                    break;
 | 
			
		||||
                case RIGHT:
 | 
			
		||||
                    P(i,j)      = P(i,j+1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case TOPLEFT:
 | 
			
		||||
                    P(i,j)      = (P(i-1,j) + P(i,j+1))/2;
 | 
			
		||||
                    break;
 | 
			
		||||
                case TOPRIGHT:
 | 
			
		||||
                    P(i,j)      = (P(i+1,j) + P(i,j+1))/2;
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOMLEFT:
 | 
			
		||||
                    P(i,j)      = (P(i-1,j) + P(i,j-1))/2;
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOMRIGHT:
 | 
			
		||||
                    P(i,j)      = (P(i+1,j) + P(i,j-1))/2;
 | 
			
		||||
                    break;
 | 
			
		||||
                
 | 
			
		||||
                default:
 | 
			
		||||
                    break;
 | 
			
		||||
    int imax = solver->imax;
 | 
			
		||||
    int jmax = solver->jmax;
 | 
			
		||||
 | 
			
		||||
    double* p = solver->p;
 | 
			
		||||
    int* s    = solver->s;
 | 
			
		||||
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            switch (S(i, j)) {
 | 
			
		||||
            case TOP:
 | 
			
		||||
                P(i, j) = P(i, j + 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case BOTTOM:
 | 
			
		||||
                P(i, j) = P(i, j - 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case LEFT:
 | 
			
		||||
                P(i, j) = P(i - 1, j);
 | 
			
		||||
                break;
 | 
			
		||||
            case RIGHT:
 | 
			
		||||
                P(i, j) = P(i, j + 1);
 | 
			
		||||
                break;
 | 
			
		||||
            case TOPLEFT:
 | 
			
		||||
                P(i, j) = (P(i - 1, j) + P(i, j + 1)) / 2;
 | 
			
		||||
                break;
 | 
			
		||||
            case TOPRIGHT:
 | 
			
		||||
                P(i, j) = (P(i + 1, j) + P(i, j + 1)) / 2;
 | 
			
		||||
                break;
 | 
			
		||||
            case BOTTOMLEFT:
 | 
			
		||||
                P(i, j) = (P(i - 1, j) + P(i, j - 1)) / 2;
 | 
			
		||||
                break;
 | 
			
		||||
            case BOTTOMRIGHT:
 | 
			
		||||
                P(i, j) = (P(i + 1, j) + P(i, j - 1)) / 2;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -743,12 +734,9 @@ void computeFG(Solver* solver)
 | 
			
		||||
    double du2dx, dv2dy, duvdx, duvdy;
 | 
			
		||||
    double du2dx2, du2dy2, dv2dx2, dv2dy2;
 | 
			
		||||
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
        {
 | 
			
		||||
            if(S(i,j) == NONE) 
 | 
			
		||||
            {
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            if (S(i, j) == NONE) {
 | 
			
		||||
                du2dx = inverseDx * 0.25 *
 | 
			
		||||
                            ((U(i, j) + U(i + 1, j)) * (U(i, j) + U(i + 1, j)) -
 | 
			
		||||
                                (U(i, j) + U(i - 1, j)) * (U(i, j) + U(i - 1, j))) +
 | 
			
		||||
@@ -758,19 +746,24 @@ void computeFG(Solver* solver)
 | 
			
		||||
 | 
			
		||||
                duvdy = inverseDy * 0.25 *
 | 
			
		||||
                            ((V(i, j) + V(i + 1, j)) * (U(i, j) + U(i, j + 1)) -
 | 
			
		||||
                                (V(i, j - 1) + V(i + 1, j - 1)) * (U(i, j) + U(i, j - 1))) +
 | 
			
		||||
                                (V(i, j - 1) + V(i + 1, j - 1)) *
 | 
			
		||||
                                    (U(i, j) + U(i, j - 1))) +
 | 
			
		||||
                        gamma * inverseDy * 0.25 *
 | 
			
		||||
                            (fabs(V(i, j) + V(i + 1, j)) * (U(i, j) - U(i, j + 1)) +
 | 
			
		||||
                                fabs(V(i, j - 1) + V(i + 1, j - 1)) *
 | 
			
		||||
                                    (U(i, j) - U(i, j - 1)));
 | 
			
		||||
 | 
			
		||||
                du2dx2  = inverseDx * inverseDx * (U(i + 1, j) - 2.0 * U(i, j) + U(i - 1, j));
 | 
			
		||||
                du2dy2  = inverseDy * inverseDy * (U(i, j + 1) - 2.0 * U(i, j) + U(i, j - 1));
 | 
			
		||||
                F(i, j) = U(i, j) + dt * (inverseRe * (du2dx2 + du2dy2) - du2dx - duvdy + gx);
 | 
			
		||||
                du2dx2 = inverseDx * inverseDx *
 | 
			
		||||
                         (U(i + 1, j) - 2.0 * U(i, j) + U(i - 1, j));
 | 
			
		||||
                du2dy2 = inverseDy * inverseDy *
 | 
			
		||||
                         (U(i, j + 1) - 2.0 * U(i, j) + U(i, j - 1));
 | 
			
		||||
                F(i, j) = U(i, j) +
 | 
			
		||||
                          dt * (inverseRe * (du2dx2 + du2dy2) - du2dx - duvdy + gx);
 | 
			
		||||
 | 
			
		||||
                duvdx = inverseDx * 0.25 *
 | 
			
		||||
                            ((U(i, j) + U(i, j + 1)) * (V(i, j) + V(i + 1, j)) -
 | 
			
		||||
                                (U(i - 1, j) + U(i - 1, j + 1)) * (V(i, j) + V(i - 1, j))) +
 | 
			
		||||
                                (U(i - 1, j) + U(i - 1, j + 1)) *
 | 
			
		||||
                                    (V(i, j) + V(i - 1, j))) +
 | 
			
		||||
                        gamma * inverseDx * 0.25 *
 | 
			
		||||
                            (fabs(U(i, j) + U(i, j + 1)) * (V(i, j) - V(i + 1, j)) +
 | 
			
		||||
                                fabs(U(i - 1, j) + U(i - 1, j + 1)) *
 | 
			
		||||
@@ -783,42 +776,42 @@ void computeFG(Solver* solver)
 | 
			
		||||
                            (fabs(V(i, j) + V(i, j + 1)) * (V(i, j) - V(i, j + 1)) +
 | 
			
		||||
                                fabs(V(i, j) + V(i, j - 1)) * (V(i, j) - V(i, j - 1)));
 | 
			
		||||
 | 
			
		||||
                dv2dx2  = inverseDx * inverseDx * (V(i + 1, j) - 2.0 * V(i, j) + V(i - 1, j));
 | 
			
		||||
                dv2dy2  = inverseDy * inverseDy * (V(i, j + 1) - 2.0 * V(i, j) + V(i, j - 1));
 | 
			
		||||
                G(i, j) = V(i, j) + dt * (inverseRe * (dv2dx2 + dv2dy2) - duvdx - dv2dy + gy);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                switch(S(i,j))
 | 
			
		||||
                {
 | 
			
		||||
                    case TOP:
 | 
			
		||||
                        G(i,j)      = V(i,j);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case BOTTOM:
 | 
			
		||||
                        G(i,j-1)    = V(i,j-1);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case LEFT:
 | 
			
		||||
                        F(i-1,j)    = U(i-1,j);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case RIGHT:
 | 
			
		||||
                        F(i,j)      = U(i,j);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case TOPLEFT:
 | 
			
		||||
                        F(i-1,j)    = U(i-1,j);
 | 
			
		||||
                        G(i,j)      = V(i,j);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case TOPRIGHT:
 | 
			
		||||
                        F(i,j)      = U(i,j);
 | 
			
		||||
                        G(i,j)      = V(i,j);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case BOTTOMLEFT:
 | 
			
		||||
                        F(i-1,j)    = U(i-1,j);
 | 
			
		||||
                        G(i,j-1)    = V(i,j-1);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case BOTTOMRIGHT:
 | 
			
		||||
                        F(i,j)      = U(i,j);
 | 
			
		||||
                        G(i,j-1)    = V(i,j-1);
 | 
			
		||||
                        break;
 | 
			
		||||
                dv2dx2 = inverseDx * inverseDx *
 | 
			
		||||
                         (V(i + 1, j) - 2.0 * V(i, j) + V(i - 1, j));
 | 
			
		||||
                dv2dy2 = inverseDy * inverseDy *
 | 
			
		||||
                         (V(i, j + 1) - 2.0 * V(i, j) + V(i, j - 1));
 | 
			
		||||
                G(i, j) = V(i, j) +
 | 
			
		||||
                          dt * (inverseRe * (dv2dx2 + dv2dy2) - duvdx - dv2dy + gy);
 | 
			
		||||
            } else {
 | 
			
		||||
                switch (S(i, j)) {
 | 
			
		||||
                case TOP:
 | 
			
		||||
                    G(i, j) = V(i, j);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOM:
 | 
			
		||||
                    G(i, j - 1) = V(i, j - 1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case LEFT:
 | 
			
		||||
                    F(i - 1, j) = U(i - 1, j);
 | 
			
		||||
                    break;
 | 
			
		||||
                case RIGHT:
 | 
			
		||||
                    F(i, j) = U(i, j);
 | 
			
		||||
                    break;
 | 
			
		||||
                case TOPLEFT:
 | 
			
		||||
                    F(i - 1, j) = U(i - 1, j);
 | 
			
		||||
                    G(i, j)     = V(i, j);
 | 
			
		||||
                    break;
 | 
			
		||||
                case TOPRIGHT:
 | 
			
		||||
                    F(i, j) = U(i, j);
 | 
			
		||||
                    G(i, j) = V(i, j);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOMLEFT:
 | 
			
		||||
                    F(i - 1, j) = U(i - 1, j);
 | 
			
		||||
                    G(i, j - 1) = V(i, j - 1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BOTTOMRIGHT:
 | 
			
		||||
                    F(i, j)     = U(i, j);
 | 
			
		||||
                    G(i, j - 1) = V(i, j - 1);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -834,7 +827,7 @@ void computeFG(Solver* solver)
 | 
			
		||||
    for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
        G(i, 0)    = V(i, 0);
 | 
			
		||||
        G(i, jmax) = V(i, jmax);
 | 
			
		||||
    } 
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void adaptUV(Solver* solver)
 | 
			
		||||
@@ -852,10 +845,8 @@ void adaptUV(Solver* solver)
 | 
			
		||||
 | 
			
		||||
    double val = 0;
 | 
			
		||||
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) 
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) 
 | 
			
		||||
        {
 | 
			
		||||
    for (int j = 1; j < jmax + 1; j++) {
 | 
			
		||||
        for (int i = 1; i < imax + 1; i++) {
 | 
			
		||||
            U(i, j) = F(i, j) - (P(i + 1, j) - P(i, j)) * factorX;
 | 
			
		||||
            V(i, j) = G(i, j) - (P(i, j + 1) - P(i, j)) * factorY;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
set terminal png size 3600,768 enhanced font ,28
 | 
			
		||||
set output 'velocity.png'
 | 
			
		||||
set xrange[0:30]
 | 
			
		||||
set yrange[0:4]
 | 
			
		||||
set xrange[0:7]
 | 
			
		||||
set yrange[0:1.5]
 | 
			
		||||
set size ratio -1
 | 
			
		||||
set datafile separator whitespace
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 188 KiB  | 
@@ -1,8 +1,10 @@
 | 
			
		||||
unset border; unset tics; unset key;
 | 
			
		||||
set term gif animate delay 50
 | 
			
		||||
set term gif animate delay 10
 | 
			
		||||
set output "trace.gif"
 | 
			
		||||
set xrange [0:7]
 | 
			
		||||
set yrange [0:1.5]
 | 
			
		||||
set size ratio -1
 | 
			
		||||
 | 
			
		||||
set object 1 rect from 0.0,0.0 to 1.0,0.5 lw 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 732 KiB After Width: | Height: | Size: 453 KiB  | 
		Reference in New Issue
	
	Block a user