Exemplo n.º 1
0
void correct(HashTable* NodeTable, HashTable* El_Table, double dt, MatProps* matprops_ptr,
    FluxProps *fluxprops, TimeProps *timeprops, void *EmTemp_in, double *forceint, double *forcebed,
    double *eroded, double *deposited, double *eta, double *min_dx) {
	Element *EmTemp = (Element *) EmTemp_in;
	double *dx = EmTemp->get_dx();
	double dtdx = dt / dx[0];
	double dtdy = dt / dx[1];
	double kactxy[DIMENSION];

	double tiny = GEOFLOW_TINY;
	int xp = EmTemp->get_positive_x_side();
	int yp = (xp + 1) % 4, xm = (xp + 2) % 4, ym = (xp + 3) % 4;

	int ivar, i, j, k;
	double fluxxp[NUM_STATE_VARS], fluxyp[NUM_STATE_VARS];
	double fluxxm[NUM_STATE_VARS], fluxym[NUM_STATE_VARS];

	Node* nxp = (Node*) NodeTable->lookup(EmTemp->getNode() + (xp + 4) * 2);
	for (ivar = 0; ivar < NUM_STATE_VARS; ivar++)
		fluxxp[ivar] = nxp->flux[ivar];

	Node* nyp = (Node*) NodeTable->lookup(EmTemp->getNode() + (yp + 4) * 2);
	for (ivar = 0; ivar < NUM_STATE_VARS; ivar++)
		fluxyp[ivar] = nyp->flux[ivar];

	Node* nxm = (Node*) NodeTable->lookup(EmTemp->getNode() + (xm + 4) * 2);
	for (ivar = 0; ivar < NUM_STATE_VARS; ivar++)
		fluxxm[ivar] = nxm->flux[ivar];

	Node* nym = (Node*) NodeTable->lookup(EmTemp->getNode() + (ym + 4) * 2);
	for (ivar = 0; ivar < NUM_STATE_VARS; ivar++)
		fluxym[ivar] = nym->flux[ivar];

	//if(fluxxp[0]!=0||fluxxm[0]!=0||fluxyp[0]!=0||fluxym[0]!=0)
	//printf("fluxxp=...%f, fluxxm=...%f, fluxyp = ...%f,fluxym =... %f \n",fluxxp[0],fluxxm[0],fluxyp[0],fluxym[0]);

#ifdef DO_EROSION
	int do_erosion = 1;
#else
	int do_erosion=0;
#endif

#ifdef STOPCRIT_CHANGE_SOURCE
	int IF_STOPPED=EmTemp->get_stoppedflags();
#else
	int IF_STOPPED = !(!EmTemp->get_stoppedflags());
#endif

	double *state_vars = EmTemp->get_state_vars();
	double *prev_state_vars = EmTemp->get_prev_state_vars();
	double *d_state_vars = EmTemp->get_d_state_vars();
	double *gravity = EmTemp->get_gravity();
	double *d_gravity = EmTemp->get_d_gravity();
	double *lap_phi = EmTemp->get_lap_phi();
	double *zeta = EmTemp->get_zeta();
	double *curvature = EmTemp->get_curvature();
	double bedfrict = EmTemp->get_effect_bedfrict();
	double *Influx = EmTemp->get_influx();
	double terminal_vel = matprops_ptr->v_terminal;

	double lscale = matprops_ptr->LENGTH_SCALE;
	double gscale = matprops_ptr->GRAVITY_SCALE;
	double hscale = matprops_ptr->HEIGHT_SCALE;
	double velocity_scale = sqrt(lscale * gscale);
	double momentum_scale = hscale * velocity_scale;
	double timescale = timeprops->TIME_SCALE;
	double elsrelti = .0003 / timescale; //we need this for scaling the RHS of the phase field equation

	double Vel[DIMENSION];

	if (state_vars[1] > GEOFLOW_TINY) //GEOFLOW
	    {
		for (i = 0; i < DIMENSION; i++)
			kactxy[i] = *(EmTemp->get_effect_kactxy() + i);

		Vel[0] = state_vars[2] / state_vars[1];
		Vel[1] = state_vars[3] / state_vars[1];

		// volume fractions
		//volf = state_vars[1]/state_vars[0];
	} else {
		for (i = 0; i < DIMENSION; i++) {
			kactxy[i] = matprops_ptr->epsilon;
			Vel[i] = 0.0;
		}
		//volf=1.;
		bedfrict = matprops_ptr->bedfrict[EmTemp->get_material()];
	}

	double V_avg[DIMENSION];
	V_avg[0] = Vel[0];
	V_avg[1] = Vel[1];

	double dragforce[2] = { 0., 0. };
	int iter = timeprops->iter;
	int keys1 = *(EmTemp->pass_key());
	int keys2 = *(EmTemp->pass_key() + 1);

	//if (keys1==3563192320 && keys2==0)
	//printf("hello i found you\n");
	correct_(state_vars, prev_state_vars, fluxxp, fluxyp, fluxxm, fluxym, &tiny, &dtdx, &dtdy, &dt,
	    d_state_vars, (d_state_vars + NUM_STATE_VARS), lap_phi, curvature,
	    &(matprops_ptr->intfrict), &bedfrict, gravity, kactxy, d_gravity, &(matprops_ptr->frict_tiny),
	    forceint, forcebed, dragforce, &do_erosion, eroded, Vel, &terminal_vel,
	    &(matprops_ptr->epsilon), &IF_STOPPED, Influx, eta, min_dx, &elsrelti);

	//if (state_vars[2]>100) {print_elem_data(EmTemp,matprops_ptr, fluxprops,timeprops); exit(1);}
	EmTemp->put_drag(dragforce);
	*forceint *= dx[0] * dx[1];
	*forcebed *= dx[0] * dx[1];
	*eroded *= dx[0] * dx[1];

	double ratio = 0;
	if (isnan(state_vars[0])) {
		ratio = 1;  //dabs((state_vars[0]-state_vars[1])/state_vars[1]);
		//printf("the ratio is %f\n",ratio);
	}

	if (ratio > .1)
	//*EmTemp->pass_key()==3842346279 && *(EmTemp->pass_key()+1)==2368179492) //((isnan(state_vars[0]))||(state_vars[0]<0))
	    {
		printf("the ratio is %10.5f:\n", ratio);
		double tempU[NUM_STATE_VARS];
		for (i = 0; i < NUM_STATE_VARS; i++)
			tempU[i] = prev_state_vars[i] - dtdx * (fluxxp[i] - fluxxm[i])
			    - dtdy * (fluxyp[i] - fluxym[i]);
		printf("ElemKey: %u  ,   %u\n", *EmTemp->pass_key(), *(EmTemp->pass_key() + 1));
		printf("Kactxy = %10.5e, %10.5e\n", kactxy[0], kactxy[1]);
		printf("BedFrict: %10.5e: IntFrict: %10.5e\n", bedfrict, matprops_ptr->intfrict);
		printf("DtDx=%f , DtDy=%f ,Length scale=%f , Height scale=%f , Gravity scale=%f\n", dtdx, dtdy,
		    lscale, hscale, gscale);

		printf("state_vars: ");
		for (i = 0; i < NUM_STATE_VARS; i++)
			printf("%10.5e, ", state_vars[i]);
		printf("\n");

		printf("prev_state_vars: ");
		for (i = 0; i < NUM_STATE_VARS; i++)
			printf("%10.5e, ", prev_state_vars[i]);
		printf("\n");

		printf("Ustore: ");
		for (i = 0; i < NUM_STATE_VARS; i++)
			printf("%10.5e, ", tempU[i]);
		printf("\n");

		printf("fluxes: \n");
		for (i = 0; i < NUM_STATE_VARS; i++)
			printf("fluxxp:%10.5e, fluxxm:%10.5e, fluxyp:%10.5e, fluxym:%10.5e \n ", fluxxp[i], fluxxm[i],
			    fluxyp[i], fluxym[i]);
		printf("stop from corrector\n");
		exit(1);
	}

	return;
}
Exemplo n.º 2
0
void correct(HashTable* NodeTable, HashTable* El_Table,
	     double dt, MatProps* matprops_ptr, 
	     FluxProps *fluxprops, TimeProps *timeprops,
	     void *EmTemp_in,double *forceint, double *forcebed, 
	     double *eroded, double *deposited)
{
  Element *EmTemp=(Element *) EmTemp_in;
  double *dx=EmTemp->get_dx();
  double dtdx = dt/dx[0];
  double dtdy = dt/dx[1];
  double kactxy[DIMENSION]; 

  double tiny = GEOFLOW_TINY;
  int xp=EmTemp->get_positive_x_side();
  int yp=(xp+1)%4, xm=(xp+2)%4, ym=(xp+3)%4; 

  int ivar,i, j, k;
  double fluxxp[NUM_STATE_VARS], fluxyp[NUM_STATE_VARS]; 
  double fluxxm[NUM_STATE_VARS], fluxym[NUM_STATE_VARS];

  Node* nxp = (Node*) NodeTable->lookup(EmTemp->getNode()+(xp+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxxp[ivar] = nxp->flux[ivar];
    
  Node* nyp = (Node*) NodeTable->lookup(EmTemp->getNode()+(yp+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxyp[ivar] = nyp->flux[ivar];
    
  Node* nxm = (Node*) NodeTable->lookup(EmTemp->getNode()+(xm+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxxm[ivar] = nxm->flux[ivar];
    
  Node* nym = (Node*) NodeTable->lookup(EmTemp->getNode()+(ym+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxym[ivar] = nym->flux[ivar];
    

#ifdef DO_EROSION
  int do_erosion=1;
#else
  int do_erosion=0;
#endif

#ifdef STOPCRIT_CHANGE_SOURCE
  int IF_STOPPED=EmTemp->get_stoppedflags();
#else
  int IF_STOPPED=!(!EmTemp->get_stoppedflags());
#endif

  double *state_vars=EmTemp->get_state_vars();
  double *prev_state_vars=EmTemp->get_prev_state_vars();
  double *d_state_vars=EmTemp->get_d_state_vars();
  double *gravity=EmTemp->get_gravity();
  double *d_gravity=EmTemp->get_d_gravity();
  double *zeta=EmTemp->get_zeta();
  double *curvature=EmTemp->get_curvature();
  double bedfrict=EmTemp->get_effect_bedfrict();
  double *Influx=EmTemp->get_influx();
  double solid_den=matprops_ptr->den_solid;
  double fluid_den=matprops_ptr->den_fluid;
  double terminal_vel=matprops_ptr->v_terminal;
  double navslip_coef=matprops_ptr->navslip_coef;

  double Vfluid[DIMENSION], Vsolid[DIMENSION];
  double volf;

  if ( state_vars[0] > GEOFLOW_TINY)
  {
    for (i=0; i<DIMENSION; i++)
     kactxy[i]=*(EmTemp->get_effect_kactxy()+i);

    // fluid velocities
    Vfluid[0]=state_vars[4]/state_vars[0];
    Vfluid[1]=state_vars[5]/state_vars[0];
    Vsolid[0]=state_vars[2]/state_vars[1];
    Vsolid[1]=state_vars[3]/state_vars[1];

    // volume fractions
    volf = state_vars[1]/state_vars[0];
  }
  else
  {
    for (i=0; i<DIMENSION; i++)
    {
      kactxy[i]=matprops_ptr->epsilon;
      Vfluid[i]=0.;
      Vsolid[i]=0.;
    }
    volf=1.;
    bedfrict=matprops_ptr->bedfrict[EmTemp->get_material()];
  }

  double V_avg[DIMENSION];
  V_avg[0] = Vsolid[0]*volf + Vfluid[0]*(1.-volf);
  V_avg[1] = Vsolid[1]*volf + Vfluid[1]*(1.-volf);
  EmTemp->convect_dryline(V_avg,dt); //this is necessary

  if (state_vars[0] < GEOFLOW_SHORT )
    navslip_coef *= state_vars[0];

  double dragforce[2] = {0., 0.};
  correct_(state_vars, prev_state_vars, fluxxp, fluxyp, fluxxm, fluxym,
	   &tiny, &dtdx, &dtdy, &dt, d_state_vars, (d_state_vars+NUM_STATE_VARS), 
	   &(zeta[0]), &(zeta[1]), curvature,
	   &(matprops_ptr->intfrict), &bedfrict,
	   gravity, kactxy, &(matprops_ptr->frict_tiny),
	   forceint, forcebed, dragforce, &do_erosion, eroded, Vsolid, Vfluid,
	   &solid_den, &fluid_den, &terminal_vel,
           &(matprops_ptr->epsilon), &IF_STOPPED, Influx, &navslip_coef);

  EmTemp->put_drag(dragforce);
  *forceint*=dx[0]*dx[1];
  *forcebed*=dx[0]*dx[1];
  *eroded*=dx[0]*dx[1];

   bool print_vars=false;
   for (i=0; i<NUM_STATE_VARS; i++)
     if ( isnan(state_vars[i]) )
        print_vars=true;

  if ( print_vars )
  {
    double tempU[NUM_STATE_VARS];
    for (i=0; i<NUM_STATE_VARS; i++)
      tempU[i] = prev_state_vars[i]-
                 dtdx*(fluxxp[i]-fluxxm[i])-
                 dtdy*(fluxyp[i]-fluxym[i]);
    printf("ElemKey: %u\n", *EmTemp->pass_key());
    printf("Kactxy = %10.5e, %10.5e\n", kactxy[0], kactxy[1]);
    printf("BedFrict: %10.5e: IntFrict: %10.5e\n", bedfrict, matprops_ptr->intfrict);

    printf("state_vars: \n");
    for (i=0; i<NUM_STATE_VARS; i++)
      printf("%10.5e, ", state_vars[i]);
    printf("\n");

    printf("prev_state_vars: \n");
    for (i=0; i<NUM_STATE_VARS; i++)
      printf("%10.5e, ", prev_state_vars[i]);
    printf("\n");

    printf("Ustore: \n");
    for (i=0; i<NUM_STATE_VARS; i++)
      printf("%10.5e, ", tempU[i]);
    printf("\n");
    exit(1);
  }

  if(EmTemp->get_stoppedflags()==2) 
    *deposited=state_vars[0]*dx[0]*dx[1];
  else
    *deposited=0.0;

  if(EmTemp->get_stoppedflags()) 
    *eroded=0.0;
  
  EmTemp->calc_shortspeed(1.0/dt);
  return;
}
Exemplo n.º 3
0
void correct(HashTable* NodeTable, HashTable* El_Table,
	     double dt, MatProps* matprops_ptr, 
	     FluxProps *fluxprops, TimeProps *timeprops,
	     void *EmTemp_in,double *forceint, double *forcebed, 
	     double *eroded, double *deposited,double *eta)
{
  Element *EmTemp=(Element *) EmTemp_in;
  double *dx=EmTemp->get_dx();
  double dtdx = dt/dx[0];
  double dtdy = dt/dx[1];
  double kactxy[DIMENSION]; 

  double tiny = GEOFLOW_TINY;
  int xp=EmTemp->get_positive_x_side();
  int yp=(xp+1)%4, xm=(xp+2)%4, ym=(xp+3)%4; 

  int ivar,i, j, k;
  double fluxxp[NUM_STATE_VARS], fluxyp[NUM_STATE_VARS]; 
  double fluxxm[NUM_STATE_VARS], fluxym[NUM_STATE_VARS];

  Node* nxp = (Node*) NodeTable->lookup(EmTemp->getNode()+(xp+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxxp[ivar] = nxp->flux[ivar];

  Node* nyp = (Node*) NodeTable->lookup(EmTemp->getNode()+(yp+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxyp[ivar] = nyp->flux[ivar];

  Node* nxm = (Node*) NodeTable->lookup(EmTemp->getNode()+(xm+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxxm[ivar] = nxm->flux[ivar];

  Node* nym = (Node*) NodeTable->lookup(EmTemp->getNode()+(ym+4)*2);
  for(ivar=0;ivar<NUM_STATE_VARS;ivar++) fluxym[ivar] = nym->flux[ivar];

  //if(fluxxp[0]!=0||fluxxm[0]!=0||fluxyp[0]!=0||fluxym[0]!=0)
  //printf("fluxxp=...%f, fluxxm=...%f, fluxyp = ...%f,fluxym =... %f \n",fluxxp[0],fluxxm[0],fluxyp[0],fluxym[0]);

#ifdef DO_EROSION
  int do_erosion=1;
#else
  int do_erosion=0;
#endif

#ifdef STOPCRIT_CHANGE_SOURCE
  int IF_STOPPED=EmTemp->get_stoppedflags();
#else
  int IF_STOPPED=!(!EmTemp->get_stoppedflags());
#endif

  double *state_vars=EmTemp->get_state_vars();
  double *prev_state_vars=EmTemp->get_prev_state_vars();
  double *d_state_vars=EmTemp->get_d_state_vars();
  double *gravity=EmTemp->get_gravity();
  double *d_gravity=EmTemp->get_d_gravity();
  double *lap_phi=EmTemp->get_lap_phi();
  double *zeta=EmTemp->get_zeta();
  double *curvature=EmTemp->get_curvature();
  double bedfrict=EmTemp->get_effect_bedfrict();
  double *Influx=EmTemp->get_influx();
  double solid_den=matprops_ptr->den_solid;
  double fluid_den=matprops_ptr->den_fluid;
  double terminal_vel=matprops_ptr->v_terminal;
  double navslip_coef=matprops_ptr->navslip_coef;

  double lscale=matprops_ptr->LENGTH_SCALE;
  double gscale=matprops_ptr->GRAVITY_SCALE;
  double hscale=matprops_ptr->HEIGHT_SCALE;
  double velocity_scale = sqrt(lscale *gscale);
  double momentum_scale = hscale * velocity_scale;

  double Vfluid[DIMENSION], Vsolid[DIMENSION];
  // double volf;

  if ( state_vars[0] > 0 && state_vars[1]>GEOFLOW_TINY) //GEOFLOW
    {
      for (i=0; i<DIMENSION; i++)
	kactxy[i]=*(EmTemp->get_effect_kactxy()+i);

      // fluid velocities
      Vfluid[0]=state_vars[4]/state_vars[1];
      Vfluid[1]=state_vars[5]/state_vars[1];
      Vsolid[0]=state_vars[2]/state_vars[1];
      Vsolid[1]=state_vars[3]/state_vars[1];

      // volume fractions
      //volf = state_vars[1]/state_vars[0];
    }
  else
    {
      for (i=0; i<DIMENSION; i++)
	{
	  kactxy[i]=matprops_ptr->epsilon;
	  Vfluid[i]=0.0;
	  Vsolid[i]=0.0;
	}
      //volf=1.;
      bedfrict=matprops_ptr->bedfrict[EmTemp->get_material()];
    }

  double V_avg[DIMENSION];
  V_avg[0] = Vsolid[0];//*volf + Vfluid[0]*(1.-volf);
  V_avg[1] = Vsolid[1];//*volf + Vfluid[1]*(1.-volf);
  //EmTemp->convect_dryline(V_avg,dt); //this is necessary

//  if (state_vars[0] < GEOFLOW_SHORT && state_vars[1]!=0)
//    navslip_coef *= state_vars[1];

   navslip_coef=0;//lagecy 

  double dragforce[2] = {0., 0.};
  int iter=timeprops->iter;
  int keys1=*(EmTemp->pass_key());	
  int keys2=*(EmTemp->pass_key()+1);

  double a,b,c,d;
  a=b=c=d=0;
  a= fluxxp[1]-fluxxm[1];
  b= fluxxp[0]+fluxxm[4];
  c= fluxyp[1]-fluxym[1];
  d= fluxyp[0]+fluxym[4];
//  if(a!=0||b!=0||c!=0||d!=0){
//    printf("\n");
//    printf("The element keys: K1= %d    K2=%d\n",keys1,keys2);
//    printf("the flux result in X: HLL =.... %f , ROE=....%f \n",fluxxp[1]-fluxxm[1],fluxxp[0]+fluxxm[4]); 
//    printf("HLL: fluxxp[1]=....%f    fluxxm[1]=....%f\n", fluxxp[1],fluxxm[1]);
//    printf("ROE: fluxxp[0]=....%f    fluxxm[4]=....%f\n", fluxxp[0],fluxxm[4]);
//    printf("\n"); 
//    printf("the flux result in Y: HLL =.... %f , ROE=....%f \n",fluxyp[1]-fluxym[1],fluxyp[0]+fluxym[4]);
//    printf("HLL: fluxyp[1]=....%f    fluxym[1]=....%f\n", fluxyp[1],fluxym[1]);
//    printf("ROE: fluxyp[0]=....%f    fluxym[4]=....%f\n", fluxyp[0],fluxym[4]);
//    printf(".........................................................................................\n"); 
//  }

  //if (keys1==3563192320 && keys2==0)
  //printf("hello i found you\n");
  correct_(state_vars, prev_state_vars, fluxxp, fluxyp, fluxxm, fluxym,
	   &tiny, &dtdx, &dtdy, &dt, d_state_vars, (d_state_vars+NUM_STATE_VARS), 
	   lap_phi ,&(zeta[0]), &(zeta[1]), curvature,
	   &(matprops_ptr->intfrict), &bedfrict,
	   gravity, kactxy,d_gravity ,&(matprops_ptr->frict_tiny),
	   forceint, forcebed, dragforce, &do_erosion, eroded, Vsolid, Vfluid,
	   &solid_den, &fluid_den, &terminal_vel,
	   &(matprops_ptr->epsilon), &IF_STOPPED, Influx, &navslip_coef,eta);

  //if (state_vars[2]>100) {print_elem_data(EmTemp,matprops_ptr, fluxprops,timeprops); exit(1);}
  EmTemp->put_drag(dragforce);
  *forceint*=dx[0]*dx[1];
  *forcebed*=dx[0]*dx[1];
  *eroded*=dx[0]*dx[1];

  // bool debug=false;
  // if (((*(EmTemp->get_coord()))*(matprops_ptr)->LENGTH_SCALE > 645000 ) && 
  //     ((*(EmTemp->get_coord()))*(matprops_ptr)->LENGTH_SCALE < 645100 ) &&
  //     ((*(EmTemp->get_coord()+1))*(matprops_ptr)->LENGTH_SCALE > 2164800 )&&
  //     ((*(EmTemp->get_coord()+1))*(matprops_ptr)->LENGTH_SCALE > 2164850 )&&
  //     (state_vars[0]<1))
  //   debug=true;
  // if ( debug )
  //   {
  //     double tempg[NUM_STATE_VARS];
  //     for (i=0; i<NUM_STATE_VARS; i++)
  // 	tempg[i] = prev_state_vars[i]-
  // 	  dtdx*(fluxxp[i]-fluxxm[i])-
  // 	  dtdy*(fluxyp[i]-fluxym[i]);
  //     printf("ElemKey: %u\n", *EmTemp->pass_key());
  //     printf("Kactxy = %10.5e, %10.5e\n", kactxy[0], kactxy[1]);
  //     printf("BedFrict: %10.5e: IntFrict: %10.5e\n", bedfrict, matprops_ptr->intfrict);
  //     printf("DtDx=%f , DtDy=%f ,Length scale=%f , Height scale=%f , Gravity scale=%f\n",dtdx,dtdy, lscale , hscale , gscale);

  //     printf("state_vars: \n");
  //     for (i=0; i<NUM_STATE_VARS; i++)
  // 	printf("%10.5e, ", state_vars[i]);
  //     printf("\n");

  //     printf("prev_state_vars: \n");
  //     for (i=0; i<NUM_STATE_VARS; i++)
  // 	printf("%10.5e, ", prev_state_vars[i]);
  //     printf("\n");

  //     printf("Ustore: \n");
  //     for (i=0; i<NUM_STATE_VARS; i++)
  // 	printf("%10.5e, ", tempg[i]);
  //     printf("\n");

  //     printf("fluxes: \n");
  //     for (i=0; i<NUM_STATE_VARS; i++)
  // 	printf("fluxxp:%10.5e, fluxxm:%10.5e, fluxyp:%10.5e, fluxym:%10.5e \n ", fluxxp[i],fluxxm[i],fluxyp[i],fluxym[i]);
  //     printf("\n");
  //     double one=16*2*(2*pow(prev_state_vars[0],2)-3*prev_state_vars[0]+1);
  //     double two=1e-6*(lap_phi[0]+lap_phi[1]);

  // 	// double source =16*((4*pow(prev_state_vars[0],3)-6*pow(prev_state_vars[0],2)+2*prev_state_vars[0])* (lap_phi[0]+lap_phi[1])
  // 	// 			 +(12*pow(prev_state_vars[0],2)-12*prev_state_vars[0]+2)*(pow(d_state_vars[0],2)+pow(d_state_vars[6],2))
  // 	// 			 +prev_state_vars[0]*(d_state_vars[2]+d_state_vars[8]));      
  // 	printf("source term eq0: \n");
  //     printf("source one:%10.5e, source two:%10.5e, lap_phi[0]:%10.5e, lap_phi[1]:%10.5e \n ", one,two,lap_phi[0],lap_phi[1]);

  //     // exit(1);
  //   }
  double ratio=0;
  if (isnan(state_vars[0])){
    ratio = 1;//dabs((state_vars[0]-state_vars[1])/state_vars[1]);
    //printf("the ratio is %f\n",ratio);
  }

  if ( ratio > .1) 
    //*EmTemp->pass_key()==3842346279 && *(EmTemp->pass_key()+1)==2368179492) //((isnan(state_vars[0]))||(state_vars[0]<0))
    {
      printf ("the ratio is %10.5f:\n",ratio);
      double tempU[NUM_STATE_VARS];
      for (i=0; i<NUM_STATE_VARS; i++)
	tempU[i] = prev_state_vars[i]-
	  dtdx*(fluxxp[i]-fluxxm[i])-
	  dtdy*(fluxyp[i]-fluxym[i]);
      printf("ElemKey: %u  ,   %u\n", *EmTemp->pass_key(),*(EmTemp->pass_key()+1));
      printf("Kactxy = %10.5e, %10.5e\n", kactxy[0], kactxy[1]);
      printf("BedFrict: %10.5e: IntFrict: %10.5e\n", bedfrict, matprops_ptr->intfrict);
      printf("DtDx=%f , DtDy=%f ,Length scale=%f , Height scale=%f , Gravity scale=%f\n",dtdx,dtdy, lscale , hscale , gscale);

      printf("state_vars: ");
      for (i=0; i<NUM_STATE_VARS; i++)
	printf("%10.5e, ", state_vars[i]);
      printf("\n");

      printf("prev_state_vars: ");
      for (i=0; i<NUM_STATE_VARS; i++)
	printf("%10.5e, ", prev_state_vars[i]);
      printf("\n");

      printf("Ustore: ");
      for (i=0; i<NUM_STATE_VARS; i++)
	printf("%10.5e, ", tempU[i]);
      printf("\n");

      printf("fluxes: \n");
      for (i=0; i<NUM_STATE_VARS; i++)
	printf("fluxxp:%10.5e, fluxxm:%10.5e, fluxyp:%10.5e, fluxym:%10.5e \n ", fluxxp[i],fluxxm[i],fluxyp[i],fluxym[i]);
      printf("stop from corrector\n");
      		exit(1);
    }

  if(EmTemp->get_stoppedflags()==2) 
    *deposited=state_vars[1]*dx[0]*dx[1];
  else
    *deposited=0.0;

  if(EmTemp->get_stoppedflags()) 
    *eroded=0.0;

  EmTemp->calc_shortspeed(1.0/dt);
  return;
}