Exemplo n.º 1
0
void  PREFIX cmap_restraint(int i_c, struct mtd_data_s *mtd_data) {

  int    iat, i, tot_con;
  struct sz_data *pmy_sz;
  struct cmap_inpack inpack;
  real   cmap;
  int    jj,k,j,ii,jjj,iii;
  int    tot;
  real   tmp4_r0_0,tmp4_r0_1,tmp4_r0_2;
  real   tmp2_r0,tmp3_r0, dist_r0;
  real   tmp1,tmp2,tmp3;
  real   pow_P, pow_Q, R01;
  int    P1,Q1;
  rvec   rij;


  cmap = 0.;
  pmy_sz=&my_sz_list[ic_to_sz[i_c]];
                                                         
  for (i=0;i<colvar.natoms[i_c];i++){
               iat = colvar.cvatoms[i_c][i];
               inpack.r0[i][0] = mtd_data->pos[iat][0];
               inpack.r0[i][1] = mtd_data->pos[iat][1];
               inpack.r0[i][2] = mtd_data->pos[iat][2];
  }

  cmap_running(i_c, &inpack,&pmy_sz->my_cmap_pack);

  tot_con=pmy_sz->my_cmap_pack.number+pmy_sz->my_cmap_pack.gnumber;        
  for(i=0;i<tot_con;i++) cmap += inpack.cmap[i];

  colvar.ss0[i_c] = cmap; 

// derivatives calculation
  for(i=0;i<colvar.natoms[i_c];i++) {
     colvar.myder[i_c][i][0] = 0.;
     colvar.myder[i_c][i][1] = 0.; 
     colvar.myder[i_c][i][2] = 0.;
  }

  for(j=0;j<pmy_sz->my_cmap_pack.number;j++){
   if(pmy_sz->my_cmap_pack.weight[j]!=0){
     ii=pmy_sz->my_cmap_pack.index_from1[j];
     jj=pmy_sz->my_cmap_pack.index_from2[j];

     if(colvar.cell_pbc[i_c]){
       minimal_image(inpack.r0[ii], inpack.r0[jj], &dist_r0, rij);
     } else {
       rij[0] = inpack.r0[ii][0]-inpack.r0[jj][0];
       rij[1] = inpack.r0[ii][1]-inpack.r0[jj][1];
       rij[2] = inpack.r0[ii][2]-inpack.r0[jj][2];
       dist_r0=sqrt(pow2(inpack.r0[ii][0]-inpack.r0[jj][0])+
                 pow2(inpack.r0[ii][1]-inpack.r0[jj][1])+
                 pow2(inpack.r0[ii][2]-inpack.r0[jj][2]));
     };

     R01=pmy_sz->my_cmap_pack.r0[j];
     P1=pmy_sz->my_cmap_pack.nn[j];
     Q1=pmy_sz->my_cmap_pack.nd[j];

     if(fabs(dist_r0/R01-1.0)<0.00001){
           colvar.myder[i_c][ii][0]+=rij[0]*P1*(P1-Q1)/Q1;
           colvar.myder[i_c][ii][1]+=rij[1]*P1*(P1-Q1)/Q1;
           colvar.myder[i_c][ii][2]+=rij[2]*P1*(P1-Q1)/Q1;
           colvar.myder[i_c][jj][0]-=rij[0]*P1*(P1-Q1)/Q1;
           colvar.myder[i_c][jj][1]-=rij[1]*P1*(P1-Q1)/Q1;
           colvar.myder[i_c][jj][2]-=rij[2]*P1*(P1-Q1)/Q1;
     } else {
           power(dist_r0/R01,P1,Q1,&pow_P,&pow_Q);

           tmp2_r0=(Q1*pow_Q*(1.-pow_P)-P1*pow_P*(1.-pow_Q))*R01/dist_r0*pmy_sz->my_cmap_pack.weight[j];
           tmp3_r0=R01*(1.-pow_Q)*(1.-pow_Q);

           tmp4_r0_0=rij[0]/dist_r0;
           tmp4_r0_1=rij[1]/dist_r0;
           tmp4_r0_2=rij[2]/dist_r0;

           tmp1=tmp2_r0*tmp4_r0_0/tmp3_r0;
           tmp2=tmp2_r0*tmp4_r0_1/tmp3_r0;
           tmp3=tmp2_r0*tmp4_r0_2/tmp3_r0;
           colvar.myder[i_c][ii][0]+=tmp1;
           colvar.myder[i_c][ii][1]+=tmp2;
           colvar.myder[i_c][ii][2]+=tmp3;
           colvar.myder[i_c][jj][0]-=tmp1;
           colvar.myder[i_c][jj][1]-=tmp2;
           colvar.myder[i_c][jj][2]-=tmp3;
     }
   }
  }

// group contacts

  if(pmy_sz->my_cmap_pack.logical_group){
   for(j=0;j<pmy_sz->my_cmap_pack.gnumber;j++){

    i=j+pmy_sz->my_cmap_pack.number;
    ii=pmy_sz->my_cmap_pack.index1[i];
    jj=pmy_sz->my_cmap_pack.index2[i];

    if(colvar.cell_pbc[i_c]){
      minimal_image(pmy_sz->my_cmap_pack.group.rcm[ii], pmy_sz->my_cmap_pack.group.rcm[jj], &dist_r0, rij);
    } else {
      rij[0] = pmy_sz->my_cmap_pack.group.rcm[ii][0]-pmy_sz->my_cmap_pack.group.rcm[jj][0];
      rij[1] = pmy_sz->my_cmap_pack.group.rcm[ii][1]-pmy_sz->my_cmap_pack.group.rcm[jj][1];
      rij[2] = pmy_sz->my_cmap_pack.group.rcm[ii][2]-pmy_sz->my_cmap_pack.group.rcm[jj][2];
      dist_r0=sqrt(pow2(pmy_sz->my_cmap_pack.group.rcm[ii][0]-pmy_sz->my_cmap_pack.group.rcm[jj][0])+
                   pow2(pmy_sz->my_cmap_pack.group.rcm[ii][1]-pmy_sz->my_cmap_pack.group.rcm[jj][1])+
                   pow2(pmy_sz->my_cmap_pack.group.rcm[ii][2]-pmy_sz->my_cmap_pack.group.rcm[jj][2]));
    };


   R01=pmy_sz->my_cmap_pack.r0[i];
   P1=pmy_sz->my_cmap_pack.nn[i];
   Q1=pmy_sz->my_cmap_pack.nd[i];

   if(fabs(dist_r0/R01-1.0)<0.00001){
    for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[ii];jjj++){
     iii=pmy_sz->my_cmap_pack.group.index_to_list[ii][jjj];
     colvar.myder[i_c][iii][0]+=rij[0]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]);
     colvar.myder[i_c][iii][1]+=rij[1]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]);
     colvar.myder[i_c][iii][2]+=rij[2]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]);
    }
    for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[jj];jjj++){
     iii=pmy_sz->my_cmap_pack.group.index_to_list[jj][jjj];
     colvar.myder[i_c][iii][0]-=rij[0]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]);
     colvar.myder[i_c][iii][1]-=rij[1]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]);
     colvar.myder[i_c][iii][2]-=rij[2]*P1*(P1-Q1)/Q1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]);
    }

   }else{

    power(dist_r0/R01,P1,Q1,&pow_P,&pow_Q);

    tmp2_r0=(Q1*pow_Q*(1.-pow_P)-P1*pow_P*(1.-pow_Q))*R01/dist_r0*pmy_sz->my_cmap_pack.weight[i];
    tmp3_r0=R01*(1.-pow_Q)*(1.-pow_Q);

    tmp4_r0_0=rij[0]/dist_r0;
    tmp4_r0_1=rij[1]/dist_r0;
    tmp4_r0_2=rij[2]/dist_r0;

    tmp1=tmp2_r0*tmp4_r0_0/tmp3_r0;
    tmp2=tmp2_r0*tmp4_r0_1/tmp3_r0;
    tmp3=tmp2_r0*tmp4_r0_2/tmp3_r0;

    for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[ii];jjj++){
     iii=pmy_sz->my_cmap_pack.group.index_to_list[ii][jjj];
     colvar.myder[i_c][iii][0]+=tmp1/((real) pmy_sz->my_cmap_pack.group.numatom[ii]);
     colvar.myder[i_c][iii][1]+=tmp2/((real) pmy_sz->my_cmap_pack.group.numatom[ii]);
     colvar.myder[i_c][iii][2]+=tmp3/((real) pmy_sz->my_cmap_pack.group.numatom[ii]);
    }
    for(jjj=0;jjj<pmy_sz->my_cmap_pack.group.numatom[jj];jjj++){
     iii=pmy_sz->my_cmap_pack.group.index_to_list[jj][jjj];
     colvar.myder[i_c][iii][0]-=tmp1/((real) pmy_sz->my_cmap_pack.group.numatom[jj]);
     colvar.myder[i_c][iii][1]-=tmp2/((real) pmy_sz->my_cmap_pack.group.numatom[jj]);
     colvar.myder[i_c][iii][2]-=tmp3/((real) pmy_sz->my_cmap_pack.group.numatom[jj]);
    }
   }
  }
 }


  return;
}
int pow2(int b , int n )
{
	if ( n == 0 )
		return 1;
	return pow2(b,n-1) * b;
}
Array1D<T> zero_pad(const Array1D<T>& v)
{
    int n = pow2(needed_bits(v.size()));
    
    return n==v.size() ? v : zero_pad(v, n);
}
  unsigned __stdcall   StructureTensor2DiffusionTensorThread(float **Args)  {
#else
  void StructureTensor2DiffusionTensorThread(float **Args)  {
#endif
    /* Matrices of Eigenvector calculation */
    double Ma[3][3];
    double Davec[3][3];
    double Daeig[3];
    
    /* Eigenvector and eigenvalues as scalars */
    double mu1, mu2, mu3, v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z;
    
    /* Magnitude of gradient */
    float *gradA;
    
    /* Amplitudes of diffustion tensor */
    double lambda1, lambda2, lambda3;
    double lambdac1, lambdac2, lambdac3;
    double lambdae1, lambdae2, lambdae3;
          
    /* Eps for finite values */
    const float eps=(float)1e-20;
    
    /* Loop variable */
    int i;
    
    /* Number of pixels */
    int npixels=1;

    /* The diffusion tensors and structure tensors */
    float *Jxx, *Jxy, *Jxz, *Jyy, *Jyz, *Jzz;
    float *Dxx, *Dxy, *Dxz, *Dyy, *Dyz, *Dzz;
    
    int dimsu[3];
    float *dimsu_f, *constants_f, *Nthreads_f, *ThreadID_f;
    
    /* Number of threads */
    int ThreadOffset, Nthreads;
    
    /* Constants */
    double C, m, alpha, lambda_h, lambda_e, lambda_c;

    /* Choice of eigenvalue equation */
    int eigenmode;
    
    /* Temporary variables */
    double di, epsilon, xi;
       
    Jxx=Args[0];
    Jxy=Args[1];
    Jxz=Args[2];
    Jyy=Args[3];
    Jyz=Args[4];
    Jzz=Args[5];
    Dxx=Args[6];
    Dxy=Args[7];
    Dxz=Args[8];
    Dyy=Args[9];
    Dyz=Args[10];
    Dzz=Args[11];
    gradA=Args[12];
    dimsu_f=Args[13];
    constants_f=Args[14];
    ThreadID_f=Args[15];
    Nthreads_f=Args[16];
            
    for(i=0;i<3;i++){ dimsu[i]=(int)dimsu_f[i]; }
    eigenmode=(int)constants_f[0];
    C=(double)constants_f[1]; 
    m=(double)constants_f[2]; 
    alpha=(double)constants_f[3];
    lambda_e=(double)constants_f[4];
    lambda_h=(double)constants_f[5];
    lambda_c=(double)constants_f[6];
    
    
    ThreadOffset=(int)ThreadID_f[0];
    Nthreads=(int)Nthreads_f[0];    
    
    npixels=dimsu[0]*dimsu[1]*dimsu[2];
    
    for(i=ThreadOffset; i<npixels; i=i+Nthreads) {
        /* Calculate eigenvectors and values of local Hessian */
        Ma[0][0]=(double)Jxx[i]+eps; Ma[0][1]=(double)Jxy[i]; Ma[0][2]=(double)Jxz[i];
        Ma[1][0]=(double)Jxy[i]; Ma[1][1]=(double)Jyy[i]+eps; Ma[1][2]=(double)Jyz[i];
        Ma[2][0]=(double)Jxz[i]; Ma[2][1]=(double)Jyz[i]; Ma[2][2]=(double)Jzz[i]+eps;
        eigen_decomposition(Ma, Davec, Daeig);

        /* Convert eigenvector and eigenvalue matrices back to scalar variables */
        mu1=Daeig[2]; 
        mu2=Daeig[1]; 
        mu3=Daeig[0];
        v1x=Davec[0][0]; v1y=Davec[1][0]; v1z=Davec[2][0];
        v2x=Davec[0][1]; v2y=Davec[1][1]; v2z=Davec[2][1];
        v3x=Davec[0][2]; v3y=Davec[1][2]; v3z=Davec[2][2];

        /* Scaling of diffusion tensor */
        if(eigenmode==0) /* Weickert line shaped */
        {
            di=(mu1-mu3);
            if((di<eps)&&(di>-eps)) { lambda1 = alpha; } else { lambda1 = alpha + (1.0- alpha)*exp(-C/pow(di,(2.0*m))); }
            lambda2 = alpha;
            lambda3 = alpha;
        }
        else if(eigenmode==1) /* Weickert plane shaped */
        {
            di=(mu1-mu3);
            if((di<eps)&&(di>-eps)) { lambda1 = alpha; } else { lambda1 = alpha + (1.0- alpha)*exp(-C/pow(di,(2.0*m))); }
            di=(mu2-mu3); 
            if((di<eps)&&(di>-eps)) { lambda2 = alpha; } else { lambda2 = alpha + (1.0- alpha)*exp(-C/pow(di,(2.0*m))); } 
            lambda3 = alpha;
        }
        else if (eigenmode==2) /* EED */
        {
            if(gradA[i]<eps){ lambda3 = 1; } else { lambda3 = 1 - exp(-3.31488/pow4(gradA[i]/pow2(lambda_e))); }
            lambda2 = 1;
            lambda1 = 1;
        }
        else if (eigenmode==3) /* CED */
        {
            lambda3 = alpha;
            lambda2 = alpha;
            if((mu2<eps)&&(mu2>-eps)){ lambda1=1;}
            else if ((mu3<eps)&&(mu3>-eps)) { lambda1=1; }
            else { lambda1= alpha + (1.0- alpha)*exp(-0.6931*pow2(lambda_c)/pow4(mu2/(alpha+mu3)));  }
        }
        else if (eigenmode==4) /* Hybrid Diffusion with Continous Switch */
        {
            if(gradA[i]<eps) { lambdae3 = 1; } else { lambdae3 = 1 - exp(-3.31488/pow4(gradA[i]/pow2(lambda_e))); }
            lambdae2 = 1;
            lambdae1 = 1;

            lambdac3 = alpha;
            lambdac2 = alpha;
            if((mu2<eps)&&(mu2>-eps)){ lambdac1=1;}
            else if ((mu3<eps)&&(mu3>-eps)) { lambdac1=1;}
            else { lambdac1 = alpha + (1.0- alpha)*exp(-0.6931*pow2(lambda_c)/pow4(mu2/(alpha+mu3)));  }

            xi= ( (mu1 / (alpha + mu2)) - (mu2 / (alpha + mu3) ));
            di=2.0*pow4(lambda_h);
            epsilon = exp(mu2*(pow2(lambda_h)*(xi-absd(xi))-2.0*mu3)/di);
            
            
            lambda1 = (1-epsilon) * lambdac1 + epsilon * lambdae1;
            lambda2 = (1-epsilon) * lambdac2 + epsilon * lambdae2;
            lambda3 = (1-epsilon) * lambdac3 + epsilon * lambdae3;
        }


        
          
        /* Construct the diffusion tensor */
        Dxx[i] = (float)(lambda1*v1x*v1x + lambda2*v2x*v2x + lambda3*v3x*v3x);
        Dyy[i] = (float)(lambda1*v1y*v1y + lambda2*v2y*v2y + lambda3*v3y*v3y);
        Dzz[i] = (float)(lambda1*v1z*v1z + lambda2*v2z*v2z + lambda3*v3z*v3z);
        Dxy[i] = (float)(lambda1*v1x*v1y + lambda2*v2x*v2y + lambda3*v3x*v3y);
        Dxz[i] = (float)(lambda1*v1x*v1z + lambda2*v2x*v2z + lambda3*v3x*v3z);
        Dyz[i] = (float)(lambda1*v1y*v1z + lambda2*v2y*v2z + lambda3*v3y*v3z);
    }
    
    /*  explicit end thread, helps to ensure proper recovery of resources allocated for the thread */
    #ifdef _WIN32
	_endthreadex( 0 );
    return 0;
	#else
	pthread_exit(NULL);
	#endif
}
Exemplo n.º 5
0
/* Options on options */
double OptionsOnOptions(
	int typeflag,
	double S,
	double X1,
	double X2,
	double t1, 
	double T2,
	double r,
	double b,
	double v) 
{
	double result, bv2, vst1, vsT2, I, Rho, _y1, y2, z1, z2;
	int fCall;

	assert_valid_price(S);
	assert_valid_strike(X1);
	assert_valid_strike(X2);
	assert_valid_time(t1);
	assert_valid_time(T2);
	assert_valid_interest_rate(r);
	assert_valid_cost_of_carry(b);
	assert_valid_volatility(v);

	bv2 = b + pow2(v) / 2.0;
	vst1 = v * sqrt(t1);
	vsT2 = v * sqrt(T2);

	assert(typeflag == OOO_CALL_ON_CALL || typeflag == OOO_CALL_ON_PUT || typeflag == OOO_PUT_ON_CALL || typeflag == OOO_PUT_ON_PUT);
    
	if(typeflag == OOO_CALL_ON_CALL || typeflag == OOO_PUT_ON_CALL)
        fCall = 1;
    else
        fCall = 0;
    
    I = CriticalValueOptionsOnOptions(fCall, X1, X2, T2 - t1, r, b, v);
    
    Rho = sqrt(t1 / T2);
    _y1 = (log(S / I) + bv2 * t1) / vst1;
    y2 = _y1 - vst1;
    z1 = (log(S / X1) + bv2 * T2) / vsT2;
    z2 = z1 - vsT2;

	if(typeflag == OOO_CALL_ON_CALL) {
        result 
			=  S * exp((b - r) * T2) * cbnd(z1, _y1, Rho) 
			- X1 * exp(-r * T2)      * cbnd(z2, y2, Rho) 
			- X2 * exp(-r * t1)      * cnd(y2);
    }
	else if(typeflag == OOO_PUT_ON_CALL) {
        result 
			= X1 * exp(-r * T2)      * cbnd(z2, -y2, -Rho) 
			-  S * exp((b - r) * T2) * cbnd(z1, -_y1, -Rho) 
			+ X2 * exp(-r * t1)      * cnd(-y2);
    }
	else if(typeflag == OOO_CALL_ON_PUT) {
        result 
			= X1 * exp(-r * T2)      * cbnd(-z2, -y2, Rho) 
			-  S * exp((b - r) * T2) * cbnd(-z1, -_y1, Rho) 
			- X2 * exp(-r * t1)      * cnd(-y2);
    }
	else if(typeflag == OOO_PUT_ON_PUT) {
        result 
			=  S * exp((b - r) * T2) * cbnd(-z1, _y1, -Rho) 
			- X1 * exp(-r * T2)      * cbnd(-z2, y2, -Rho) 
			+ X2 * exp(-r * t1)      * cnd(y2);
    }
	else {
		/* Abort to be on the safe side */
		abort();
	}

	assert(is_sane(result));
	return result;
}
Exemplo n.º 6
0
 double pow(double x, int n) {  
     return pow2();  
 }
Exemplo n.º 7
0
Gradient::Gradient(Grid * g){
	//cout << "Trying to create gradient with h = " << g->getH() << endl;
	this->g = g;
	double h = g->getH();
	constantTerm.resize(g->faces.size());
	constantTerm = 0;
	for(int i = g->iMin; i <= g->iMax; i++){
		for(int j = g->jMin; j <= g->jMax; j++){
			if(g->cells(i,j)->isUncovered()){
				//cout << " is uncovered." << endl;
				CellIndex cellIndex(i,j);
				TinyVector<Face*,5> faces = g->cells(i,j)->faces;
				if(g->isFaceUncovered(i,j,B)){
					FaceIndex faceIndex = faces(B)->getIndex();
					Coord centroid = faces(B)->getCentroid();
					TinyVector<double,2> n = faces(B)->getNormal();
					double x, y, r;
					x = centroid(0);
					y = centroid(1);
					r = sqrt(pow2(x) + pow2(y));
					TinyVector<double,2> gradU;
					double pi = acos(-1);
					//gradU(0) = 3*pow(x,2)*pow(y-2,2)+sin(2*(x-pow(y,2)));
					//gradU(1) = 2*pow(x,3)*(y-2) - 2*y*sin(2*(x-pow(y,2)));
					gradU(0) = 0;//-2*pi*sin(2*pi*r)*x/r;
					gradU(1) = 0;//-2*pi*sin(2*pi*r)*y/r;
					constantTerm(faceIndex) += gradU(0)*n(0) + gradU(1)*n(1);
					//cout << "\tAdding boundary condition to constant term." << endl;
				}
				if(faces(N) != 0){
					FaceIndex faceIndex = faces(N)->getIndex();
					if(faces(N)->isRegular()){
						coefficients[faceIndex][cellIndex] = -1/h;
					}
					else if(faces(N)->isIrregular()){
						if(coefficients[faceIndex].count(cellIndex) == 0){
							double alpha = g->cells(i,j)->getFace(N)->getArea();
							if(g->isFaceUncovered(i+1,j,N)){
								CellIndex ind1(i,j);
								CellIndex ind2(i,j+1);
								CellIndex ind3(i+1,j);
								CellIndex ind4(i+1,j+1);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
							else if(g->isFaceUncovered(i-1,j,N)){
								CellIndex ind1(i,j);
								CellIndex ind2(i,j+1);
								CellIndex ind3(i-1,j);
								CellIndex ind4(i-1,j+1);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
						}
					}
					//cout << "\tDid north face" << endl;
				}
				if(faces(S) != 0){
					FaceIndex faceIndex = faces(S)->getIndex();
					if(faces(S)->isRegular()){
						coefficients[faceIndex][cellIndex] = 1/h;
					}
					else if(faces(S)->isIrregular()){
						if(coefficients[faceIndex].count(cellIndex) == 0){
							double alpha = g->cells(i,j)->getFace(S)->getArea();
							if(g->isFaceUncovered(i+1,j,S)){
								CellIndex ind1(i,j-1);
								CellIndex ind2(i,j);
								CellIndex ind3(i+1,j-1);
								CellIndex ind4(i+1,j);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
							else if(g->isFaceUncovered(i-1,j,S)){
								CellIndex ind1(i,j-1);
								CellIndex ind2(i,j);
								CellIndex ind3(i-1,j-1);
								CellIndex ind4(i-1,j);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
						}
					}
					//cout << "\tDid south face" << endl;
				}
				if(faces(E) != 0){
					FaceIndex faceIndex = faces(E)->getIndex();
					CellIndex cellIndex(i,j);
					if(faces(E)->isRegular()){
						coefficients[faceIndex][cellIndex] = -1/h;
					}
					else if(faces(E)->isIrregular()){
						if(coefficients[faceIndex].count(cellIndex) == 0){
							double alpha = g->cells(i,j)->getFace(E)->getArea();
							if(g->isFaceUncovered(i,j+1,E)){
								CellIndex ind1(i,j);
								CellIndex ind2(i+1,j);
								CellIndex ind3(i,j+1);
								CellIndex ind4(i+1,j+1);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
							else if(g->isFaceUncovered(i,j-1,E)){
								CellIndex ind1(i,j);
								CellIndex ind2(i+1,j);
								CellIndex ind3(i,j-1);
								CellIndex ind4(i+1,j-1);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
						}
					}
					//cout << "\tDid east face" << endl;
				}
				if(faces(W) != 0){
					FaceIndex faceIndex = faces(W)->getIndex();
					CellIndex cellIndex(i,j);
					if(faces(W)->isRegular()){
						coefficients[faceIndex][cellIndex] = 1/h;
					}
					else if(faces(W)->isIrregular()){
						if(coefficients[faceIndex].count(cellIndex) == 0){
							double alpha = g->cells(i,j)->getFace(W)->getArea();
							if(g->isFaceUncovered(i,j+1,W)){
								CellIndex ind1(i+1,j);
								CellIndex ind2(i,j);
								CellIndex ind3(i+1,j+1);
								CellIndex ind4(i,j+1);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
							else if(g->isFaceUncovered(i,j-1,W)){
								CellIndex ind1(i+1,j);
								CellIndex ind2(i,j);
								CellIndex ind3(i+1,j-1);
								CellIndex ind4(i,j-1);
								interpolateIrregularFace(alpha,ind1,ind2,ind3,ind4,faceIndex);
							}
						}
					}
					//cout << "\tDid west face" << endl;
				}
			}
		}
	}

	//cout << "Resized" << endl;
/*
	for(int i = g->iMin; i <= g->iMax; i++){
		for(int j = g->jMin; j <= g->jMax; j++){
			cout << "i = " << i << " j = " << j << endl;
			if(g->cells(i,j)->isUncovered()){
				cout << "Uncovered" << endl;
				double c = 1;
				CellIndex index(i,j);
				TinyVector<Face*,5> faces = g->cells(i,j)->faces;
				cout << "Got faces" << endl;
				for(int k = 0; k < 5; k++){
					cout << "Testing face " << k << endl;
					if(faces(k) != 0 && faces(k)->isUncovered()){
						cout << "Face " << k << " is uncovered ";
						cout << "and has index " << faces(k)->getIndex() << endl;
						cout << coefficients(faces(k)->getIndex()).empty() << endl;
						coefficients(faces(k)->getIndex())[index] = c;
					}
				}
			}
		}
	}*/
}
Exemplo n.º 8
0
/**
 * @brief Handles input to the map overlay.
 */
int ovr_input( SDL_Event *event )
{
   unsigned int pid;
   Pilot *p;
   int mx, my;
   double x, y, r, rp;
   double d, dp;
   Planet *pnt;
   JumpPoint *jp;
   int pntid, jpid;

   /* We only want mouse events. */
   if (event->type != SDL_MOUSEBUTTONDOWN)
      return 0;

   /* Player must not be NULL. */
   if (player_isFlag(PLAYER_DESTROYED) || (player.p == NULL))
      return 0;

   /* Selection. */
   if (event->button.button == SDL_BUTTON_LEFT) {
      /* Translate from window to screen. */
      mx = event->button.x;
      my = event->button.y;
      gl_windowToScreenPos( &mx, &my, mx, my );

      /* Translate to space coords. */
      x  = ((double)mx - SCREEN_W/2.) * ovr_res;
      y  = ((double)my - SCREEN_H/2.) * ovr_res;

      /* Get nearest pilot and jump point/planet. */
      dp    = pilot_getNearestPos( player.p, &pid, x, y, 1 );
      d     = system_getClosest( cur_system, &pntid, &jpid, x, y );
      p     = pilot_get(pid);
      rp    = MAX( 1.5 * PILOT_SIZE_APROX * p->ship->gfx_space->sw / 2, 20.*ovr_res );

      if (pntid >=0) { /* Planet is closer. */
         pnt = cur_system->planets[ pntid ];
         r  = MAX( 1.5 * pnt->radius, 20. * ovr_res );
      }
      else if (jpid >= 0) {
         jp = &cur_system->jumps[ jpid ];
         r  = MAX( 1.5 * jp->radius, 20. * ovr_res );
      }
      else
         r  = 0.;

      /* Pilot is closest, or new jump point/planet is the same as the old. */
      if ((dp < pow2(rp) && player.p->target != pid) && (dp < d ||
            ((pntid >=0 && player.p->nav_planet == pntid) ||
            (jpid >=0 && player.p->nav_planet == jpid))))
         player_targetSet( pid );
      else if ((pntid >= 0) && (d < pow2(r))) /* Planet is closest. */
         player_targetPlanetSet( pntid );
      else if ((jpid >= 0) && (d < pow2(r))) /* Jump point is closest. */
         player_targetHyperspaceSet( jpid );
      else
         return 0;
      return 1;
   }
   /* Autogo. */
   else if (event->button.button == SDL_BUTTON_RIGHT) {
      if ((player.p == NULL) || pilot_isFlag( player.p, PILOT_MANUAL_CONTROL ) ||
            pilot_isFlag( player.p, PILOT_HYP_PREP ) ||
            pilot_isFlag( player.p, PILOT_HYP_BEGIN ) ||
            pilot_isFlag( player.p, PILOT_HYPERSPACE ))
         return 1;

      /* Translate from window to screen. */
      mx = event->button.x;
      my = event->button.y;
      gl_windowToScreenPos( &mx, &my, mx, my );

      /* Translate to space coords. */
      x  = ((double)mx - SCREEN_W/2.) * ovr_res;
      y  = ((double)my - SCREEN_H/2.) * ovr_res;

      /* Go to position. */
      player_autonavPos( x, y );

      return 1;
   }

   return 0;
}
Exemplo n.º 9
0
Arquivo: board.c Projeto: pegue/naev
/**
 * @fn void player_board (void)
 *
 * @brief Attempt to board the player's target.
 *
 * Creates the window on success.
 */
void player_board (void)
{  
   Pilot *p;
   unsigned int wdw;

   if (player->target==PLAYER_ID) {
      player_message("You need a target to board first!");
      return;
   }

   p = pilot_get(player->target);

   if (!pilot_isDisabled(p)) {
      player_message("You cannot board a ship that isn't disabled!");
      return;
   }
   else if (vect_dist(&player->solid->pos,&p->solid->pos) >
         p->ship->gfx_space->sw * PILOT_SIZE_APROX) {
      player_message("You are too far away to board your target.");
      return;
   }
   else if ((pow2(VX(player->solid->vel)-VX(p->solid->vel)) +
            pow2(VY(player->solid->vel)-VY(p->solid->vel))) >
         (double)pow2(MAX_HYPERSPACE_VEL)) {
      player_message("You are going too fast to board the ship.");
      return;
   }
   else if (pilot_isFlag(p,PILOT_BOARDED)) {
      player_message("Your target cannot be boarded again.");
      return;
   };

   /* pilot will be boarded */
   pilot_setFlag(p,PILOT_BOARDED); 
   player_message("Boarding ship %s.", p->name);


   /*
    * create the boarding window
    */
   wdw = window_create( "Boarding", -1, -1, BOARDING_WIDTH, BOARDING_HEIGHT );

   window_addText( wdw, 20, -30, 120, 60,
         0, "txtCargo", &gl_smallFont, &cDConsole,
         "Credits:\n"
         "Cargo:\n"
         "Fuel:\n"
         );
   window_addText( wdw, 80, -30, 120, 60,
         0, "txtData", &gl_smallFont, &cBlack, NULL );

   window_addButton( wdw, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
         "btnStealCredits", "Credits", board_stealCreds);
   window_addButton( wdw, 20+BUTTON_WIDTH+20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
         "btnStealCargo", "Cargo", board_stealCargo);
   window_addButton( wdw, 20+2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT,
         "btnStealCargo", "Fuel", board_stealFuel);

   window_addButton( wdw, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
         "btnBoardingClose", "Leave", board_exit );

   board_update(wdw);

   /*
    * run hook if needed
    */
   pilot_runHook(p, PILOT_HOOK_BOARD);
}