コード例 #1
0
ファイル: sciddicaT.c プロジェクト: knotman90/opencal
//transition function
void sciddicaT_transition_function(struct CALModel2D* sciddicaT, int i, int j)
{
    CALbyte eliminated_cells[5]= {CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE};
    CALbyte again;
    CALint cells_count;
    CALreal average;
    CALreal m;
    CALreal u[5];
    CALint n;
    CALreal z, h;
    CALreal f;


    m = calGet2Dr(sciddicaT, Q.h, i, j) - P.epsilon;
    u[0] = calGet2Dr(sciddicaT, Q.z, i, j) + P.epsilon;
    for (n=1; n<sciddicaT->sizeof_X; n++)
    {
        z = calGetX2Dr(sciddicaT, Q.z, i, j, n);
        h = calGetX2Dr(sciddicaT, Q.h, i, j, n);
        u[n] = z + h;
    }

    //computes outflows
    do {
        again = CAL_FALSE;
        average = m;
        cells_count = 0;

        for (n=0; n<sciddicaT->sizeof_X; n++)
            if (!eliminated_cells[n]) {
                average += u[n];
                cells_count++;
            }

        if (cells_count != 0)
            average /= cells_count;

        for (n=0; n<sciddicaT->sizeof_X; n++)
            if( (average<=u[n]) && (!eliminated_cells[n]) ) {
                eliminated_cells[n]=CAL_TRUE;
                again=CAL_TRUE;
            }

    } while (again);


    for (n=1; n<sciddicaT->sizeof_X; n++)
        if (!eliminated_cells[n])
        {
            f = (average-u[n])*P.r;
            calSet2Dr (sciddicaT,Q.h,i,j,   calGetNext2Dr (sciddicaT,Q.h,i,j)   - f );
            calSetX2Dr(sciddicaT,Q.h,i,j,n, calGetNextX2Dr(sciddicaT,Q.h,i,j,n) + f );

#ifdef ACTIVE_CELLS
            //adds the cell (i, j, n) to the set of active ones
            calAddActiveCellX2D(sciddicaT, i, j, n);
#endif
        }
}
コード例 #2
0
void s3hexFlowsComputation(struct CALModel2D* s3hex, int i, int j)
{
	CALbyte eliminated_cells[7]={CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE,CAL_FALSE, CAL_FALSE, CAL_FALSE};
	CALbyte again;
	CALint cells_count;
	CALreal average;
	CALreal m;
	CALreal u[7], delta_H[7], delta_z[7];
	CALint n;
	CALreal z_0, h_0, z_n, h_n, runup_0, z_0_plus_runup_0, sum;
	CALreal f;


	if (calGet2Dr(s3hex,Q.h,i,j) <= P.adh)
		return;

	z_0 = calGet2Dr(s3hex, Q.z, i, j);
	h_0 = calGet2Dr(s3hex, Q.h, i, j);
	runup_0 = calGet2Dr(s3hex, Q.p, i, j) / h_0;
	z_0_plus_runup_0 = z_0 + runup_0;

	m = runup_0;
	u[0] = z_0;
	delta_z[0] = 0;
	delta_H[0] = 0;
	for (n=1; n<s3hex->sizeof_X; n++)
	{
		z_n = calGetX2Dr(s3hex, Q.z, i, j, n);
		h_n = calGetX2Dr(s3hex, Q.h, i, j, n);

		u[n] = z_n + h_n;
		delta_z[n] = z_0 - z_n;
		delta_H[n] = z_0_plus_runup_0 - u[n];
	}

	for (n=1; n<s3hex->sizeof_X; n++)
		eliminated_cells[n] = (delta_H[n] < P.f);
	//computes outflows
	do{
		again = CAL_FALSE;
		average = m;
		cells_count = 0;

		for (n=0; n<s3hex->sizeof_X; n++)
			if (!eliminated_cells[n]){
				average += u[n];
				cells_count++;
			}

			if (cells_count != 0)
				average /= cells_count;

			for (n=0; n<s3hex->sizeof_X; n++)
				if( (average<=u[n]) && (!eliminated_cells[n]) ){
					eliminated_cells[n]=CAL_TRUE;
					again=CAL_TRUE;
				}

	}while (again);


	sum = 0;
	for (n=0; n<s3hex->sizeof_X; n++)
		if (!eliminated_cells[n])
			sum += average - u[n];

	for (n=1; n<s3hex->sizeof_X; n++)
		if (!eliminated_cells[n])
		{
			//f = (h_0 - P.adh) * ((average-u[n])/sum) * P.r;
			f = h_0 * ((average-u[n])/sum) * P.r;
			calSet2Dr (s3hex,Q.h,i,j,   calGetNext2Dr (s3hex,Q.h,i,j)   - f );
			calSetX2Dr(s3hex,Q.h,i,j,n, calGetNextX2Dr(s3hex,Q.h,i,j,n) + f );

			calSet2Dr (s3hex,Q.p,i,j,   calGetNext2Dr (s3hex,Q.p,i,j)   - runup_0 * f );
			calSetX2Dr(s3hex,Q.p,i,j,n, calGetNextX2Dr(s3hex,Q.p,i,j,n) + (z_0_plus_runup_0 - u[n]) * f );

#ifdef ACTIVE_CELLS
			//adds the cell (i, j, n) to the set of active ones
            calAddActiveCellX2D(s3hex, i, j, n);
#endif
		}
}