void sciddicaTSimulationInit(struct CALModel2D* sciddicaT)
{
	CALreal z, h;
	CALint i, j;

	//initializing substates to 0
	calInitSubstate2Dr(sciddicaT, Q.f[0], 0);
	calInitSubstate2Dr(sciddicaT, Q.f[1], 0);
	calInitSubstate2Dr(sciddicaT, Q.f[2], 0);
	calInitSubstate2Dr(sciddicaT, Q.f[3], 0);

	//sciddicaT parameters setting
	P.r = P_R;
	P.epsilon = P_EPSILON;

	//sciddicaT source initialization
	for (i=0; i<sciddicaT->rows; i++)
		for (j=0; j<sciddicaT->columns; j++)
		{
			h = calGet2Dr(sciddicaT, Q.h, i, j);

			if ( h > 0.0 ) {
				z = calGet2Dr(sciddicaT, Q.z, i, j);
				calSet2Dr(sciddicaT, Q.z, i, j, z-h);
			}
		}
}
Exemple #2
0
// SciddicaT simulation init function
void sciddicaTSimulationInit(struct CALModel2D* host_CA) {
	CALreal z, h;
	CALint i, j;

	//initializing substates to 0
	calInitSubstate2Dr(host_CA, Q.f[0], 0);
	calInitSubstate2Dr(host_CA, Q.f[1], 0);
	calInitSubstate2Dr(host_CA, Q.f[2], 0);
	calInitSubstate2Dr(host_CA, Q.f[3], 0);

	//sciddicaT parameters setting
	P.r = P_R;
	P.epsilon = P_EPSILON;

	//sciddicaT source initialization
	for (i = 0; i < host_CA->rows; i++)
		for (j = 0; j < host_CA->columns; j++) {
			h = calGet2Dr(host_CA, Q.h, i, j);

			if (h > 0.0) {
				z = calGet2Dr(host_CA, Q.z, i, j);
				calSet2Dr(host_CA, Q.z, i, j, z - h);

#ifdef ACTIVE_CELLS
				//adds the cell (i, j) to the set of active ones
				calAddActiveCell2D(host_CA, i, j);
#endif
			}
		}
}
//transition function
void s3hexErosion(struct CALModel2D* s3hex, int i, int j)
{
	CALint s;
	CALreal d, p, erosion_depth;

	d = calGet2Dr(s3hex,Q.d,i,j);
	if (d > 0)
	{
		s = calGet2Di(s3hex,Q.s,i,j);
		if (s <  -1)
			calSetCurrent2Di(s3hex,Q.s,i,j,s+1);
		if (s == -1) {
			calSetCurrent2Di(s3hex,Q.s,i,j,0);
			doErosion(s3hex,i,j,d);
#ifdef ACTIVE_CELLS
			calAddActiveCell2D(s3hex,i,j);
#endif
		}

		p = calGet2Dr(s3hex,Q.p,i,j);
		if (p > P.mt) {
			erosion_depth = p * P.pef;
			if (erosion_depth > d)
				erosion_depth = d;
			doErosion(s3hex,i,j,erosion_depth);
		}
	}
}
Exemple #4
0
void sciddicaT_simulation_init(struct CALModel2D* sciddicaT)
{
    CALreal z, h;
    CALint i, j;

    //sciddicaT parameters setting
    P.r = P_R;
    P.epsilon = P_EPSILON;

    //sciddicaT source initialization
    for (i=0; i<sciddicaT->rows; i++)
        for (j=0; j<sciddicaT->columns; j++)
        {
            h = calGet2Dr(sciddicaT, Q.h, i, j);

            if ( h > 0.0 ) {
                z = calGet2Dr(sciddicaT, Q.z, i, j);
                calSetCurrent2Dr(sciddicaT, Q.z, i, j, z-h);

#ifdef ACTIVE_CELLS
                //adds the cell (i, j) to the set of active ones
                calAddActiveCell2D(sciddicaT, i, j);
#endif
            }
        }
}
Exemple #5
0
//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
        }
}
//second (and last) elementary process
void sciddicaTWidthUpdate(struct CALModel2D* sciddicaT, int i, int j)
{
	CALreal h_next;
	CALint n;

	h_next = calGet2Dr(sciddicaT, Q.h, i, j);
	for(n=1; n<sciddicaT->sizeof_X; n++)
		h_next +=  calGetX2Dr(sciddicaT, Q.f[NUMBER_OF_OUTFLOWS - n], i, j, n) - calGet2Dr(sciddicaT, Q.f[n-1], i, j);

	calSet2Dr(sciddicaT, Q.h, i, j, h_next);
}
void s3hexClearOutflows(struct CALModel2D* s3hex, int i, int j)
{
  int n;
  for (n=0; n<s3hex->sizeof_X; n++)
    {
      if (calGet2Dr(s3hex, Q.fh[n], i, j) > 0.0)
        calSet2Dr(s3hex, Q.fh[n], i, j, 0.0);
      if (calGet2Dr(s3hex, Q.fp[n], i, j) > 0.0)
        calSet2Dr(s3hex, Q.fp[n], i, j, 0.0);
    }
}
//first elementary process
void sciddicaTFlowsComputation(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;


	if (calGet2Dr(sciddicaT, Q.h, i, j) <= P.epsilon)
		return;

	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])
			calSet2Dr(sciddicaT, Q.f[n-1], i, j, 0.0);
		else
			calSet2Dr(sciddicaT, Q.f[n-1], i, j, (average-u[n])*P.r);
}
Exemple #9
0
void MakeBorder() {
	int j, i;

	//prima riga
	i = 0;
	for (j = 0; j < sciara->cols; j++)
		if (calGet2Dr(sciara->model, sciara->substates->Sz, i, j) >= 0) {
			calSetCurrent2Db(sciara->model, sciara->substates->Mb, i, j, CAL_TRUE);
			if (active)
				calAddActiveCell2D(sciara->model, i, j);
		}
	//ultima riga
	i = sciara->rows - 1;
	for (j = 0; j < sciara->cols; j++)
		if (calGet2Dr(sciara->model, sciara->substates->Sz, i, j) >= 0) {
			calSetCurrent2Db(sciara->model, sciara->substates->Mb, i, j, CAL_TRUE);
			if (active)
				calAddActiveCell2D(sciara->model, i, j);
		}
	//prima colonna
	j = 0;
	for (i = 0; i < sciara->rows; i++)
		if (calGet2Dr(sciara->model, sciara->substates->Sz, i, j) >= 0) {
			calSetCurrent2Db(sciara->model, sciara->substates->Mb, i, j, CAL_TRUE);
			if (active)
				calAddActiveCell2D(sciara->model, i, j);
		}
	//ultima colonna
	j = sciara->cols - 1;
	for (i = 0; i < sciara->rows; i++)
		if (calGet2Dr(sciara->model, sciara->substates->Sz, i, j) >= 0) {
			calSetCurrent2Db(sciara->model, sciara->substates->Mb, i, j, CAL_TRUE);
			if (active)
				calAddActiveCell2D(sciara->model, i, j);
		}
	//il resto
	for (int i = 1; i < sciara->rows - 1; i++)
		for (int j = 1; j < sciara->cols - 1; j++)
			if (calGet2Dr(sciara->model, sciara->substates->Sz, i, j) >= 0) {
				for (int k = 1; k < sciara->model->sizeof_X; k++)
					if (calGetX2Dr(sciara->model, sciara->substates->Sz, i, j, k) < 0) {
						calSetCurrent2Db(sciara->model, sciara->substates->Mb, i, j, CAL_TRUE);
						if (active)
							calAddActiveCell2D(sciara->model, i, j);
						break;
					}
			}

}
void s3hexEnergyLoss(struct CALModel2D* s3hex, int i, int j)
{
	CALreal h, runup;

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

	h = calGet2Dr(s3hex,Q.h,i,j);
	if (h > P.adh) {
		runup = calGet2Dr(s3hex,Q.p,i,j) / h - P.rl;
		if (runup < h)
			runup = h;
		calSet2Dr(s3hex,Q.p,i,j,h*runup);
	}
}
void s3hexRomoveInactiveCells(struct CALModel2D* s3hex, int i, int j)
{
#ifdef ACTIVE_CELLS
	if (calGet2Dr(s3hex,Q.h,i,j) <= P.adh)
		calRemoveActiveCell2D(s3hex,i,j);
#endif
}
void sciddicaTSimulationInit(struct CALModel2D* s3hex)
{
	int i, j;

	//s3hex parameters setting
	P.adh = P_ADH;
	P.rl = P_RL;
	P.r = P_R;
	P.f = P_F;
	P.mt = P_MT;
	P.pef = P_PEF;
//	P.ltt = P_LTT;

	//initializing debris source
	calInitSubstate2Dr(s3hex, Q.h, 0);
	calInitSubstate2Dr(s3hex, Q.p, 0);

#ifdef ACTIVE_CELLS
	for (i=0; i<s3hex->rows; i++)
		for (j=0; j<s3hex->columns; j++)
			if (calGet2Dr(s3hex,Q.h,i,j) > P.adh) {
				calAddActiveCell2D(s3hex,i,j);
	}
#endif

	//Substates and active cells update
	calUpdate2D(s3hex);
}
void sciddicaTSimulationInit(struct CALModel2D* s3hex)
{
  int i, j, n;

    //s3hex parameters setting
	P.adh = P_ADH;
	P.rl = P_RL;
	P.r = P_R;
	P.f = P_F;
	P.mt = P_MT;
	P.pef = P_PEF;
//	P.ltt = P_LTT;

	//initializing substates
	calInitSubstate2Dr(s3hex, Q.h, 0);
	calInitSubstate2Dr(s3hex, Q.p, 0);
    for (n=0; n<s3hex->sizeof_X; n++)
    {
      calInitSubstate2Dr(s3hex, Q.fh[n], 0);
      calInitSubstate2Dr(s3hex, Q.fp[n], 0);
    }


#ifdef ACTIVE_CELLS
	for (i=0; i<s3hex->rows; i++)
		for (j=0; j<s3hex->columns; j++)
			if (calGet2Dr(s3hex,Q.h,i,j) > P.adh) {
				calAddActiveCell2D(s3hex,i,j);
	}
#endif
}
Exemple #14
0
void sciddicaT_remove_inactive_cells(struct CALModel2D* sciddicaT, int i, int j)
{
#ifdef ACTIVE_CELLS
    if (calGet2Dr(sciddicaT, Q.h, i, j) <= P.epsilon)
        calRemoveActiveCell2D(sciddicaT,i,j);
#endif
}
void doErosion(struct CALModel2D* s3hex, int i, int j, CALreal	erosion_depth)
{
	CALreal z, d, h, p, runup;

	z = calGet2Dr(s3hex,Q.z,i,j);
	d = calGet2Dr(s3hex,Q.d,i,j);
	h = calGet2Dr(s3hex,Q.h,i,j);
	p = calGet2Dr(s3hex,Q.p,i,j);

	if (h > 0)
		runup =  p/h + erosion_depth;
	else
		runup = erosion_depth;

	calSetCurrent2Dr(s3hex,Q.z,i,j, (z - erosion_depth));
	calSetCurrent2Dr(s3hex,Q.d,i,j, (d - erosion_depth));
	calSet2Dr(s3hex,Q.h,i,j, (h + erosion_depth));
	calSet2Dr(s3hex,Q.p,i,j, (h + erosion_depth)*runup);
}
void s3hexWidthAndPotentialUpdate(struct CALModel2D* s3hex, int i, int j)
{
  CALreal h_next, p_next;
  CALint n, m;

	h_next = calGet2Dr(s3hex, Q.h, i, j) - calGet2Dr(s3hex, Q.fh[0], i, j);
	for(n=1; n<s3hex->sizeof_X; n++)
      {
        if (n <= 3) m = n+3; else m = n-3;
		h_next +=  calGetX2Dr(s3hex, Q.fh[m], i, j, n);
      }
	calSet2Dr(s3hex, Q.h, i, j, h_next);

    p_next = calGet2Dr(s3hex, Q.p, i, j) - calGet2Dr(s3hex, Q.fp[0], i, j);
	for(n=1; n<s3hex->sizeof_X; n++)
      {
        if (n <= 3) m = n+3; else m = n-3;
		p_next +=  calGetX2Dr(s3hex, Q.fp[m], i, j, n);
      }
	calSet2Dr(s3hex, Q.p, i, j, p_next);
}
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
		}
}