int getintersection(double pos1[3], double pos2[3],int given, int get, double value, double *answer, double box_size[3]) { /*pos1 and pos2 are two particle positions. */ /*given and get are integers from 0 to 2. 0 = x direction. 1 = y direction. 2 = z direction */ /*there is a point on the line between the two particles p1 and p2 such that r[given]=value */ /*this procedure returns the value of r[get] at that point */ double p2r[3]; int i; for (i=0;i<3;i++) { p2r[i] = drem_down((pos2[i]-pos1[i])+box_size[i]/2.0,box_size[i])-box_size[i]/2.0; } value = drem_down((value-pos1[given])+box_size[given]/2.0,box_size[given])-box_size[given]/2.0; //PTENSOR_TRACE(fprintf(stderr,"%d: getintersection: p1 is %f %f %f p2 is %f %f %f p2r is %f %f %f newvalue is %f\n",this_node,pos1[0],pos1[1],pos1[2],pos2[0],pos2[1],pos2[2],p2r[0],p2r[1],p2r[2],value);); if ((value)*(p2r[given]) < -0.0001) { ostringstream msg; msg <<"analyze stress_profile: getintersection: intersection is not between the two given particles - " << value << " is not between " << 0.0 << " and " << p2r[given] << " and box size is " << box_size[given] << ", given is " << given << "\n"; runtimeError(msg); return 0; } else if (given == get) { *answer = drem_down(value + pos1[given],box_size[given]);; } else if (0==p2r[given]) { ostringstream msg; msg <<"analyze stress_profile: getintersection: intersection is a line, not a point - value is " << value << " same as " << 0.0 << " and " << p2r[given] << "\n"; runtimeError(msg); return 0; } else { *answer = drem_down(pos1[get]+p2r[get]/p2r[given]*value,box_size[get]); } return 1; }
int getintersection(double pos1[3], double pos2[3],int given, int get, double value, double *answer, double box_size[3]) { /*pos1 and pos2 are two particle positions. */ /*given and get are integers from 0 to 2. 0 = x direction. 1 = y direction. 2 = z direction */ /*there is a point on the line between the two particles p1 and p2 such that r[given]=value */ /*this procedure returns the value of r[get] at that point */ double p2r[3]; int i; for (i=0;i<3;i++) { p2r[i] = drem_down((pos2[i]-pos1[i])+box_size[i]/2.0,box_size[i])-box_size[i]/2.0; } value = drem_down((value-pos1[given])+box_size[given]/2.0,box_size[given])-box_size[given]/2.0; //PTENSOR_TRACE(fprintf(stderr,"%d: getintersection: p1 is %f %f %f p2 is %f %f %f p2r is %f %f %f newvalue is %f\n",this_node,pos1[0],pos1[1],pos1[2],pos2[0],pos2[1],pos2[2],p2r[0],p2r[1],p2r[2],value);); if ((value)*(p2r[given]) < -0.0001) { char *errtxt = runtime_error(128 + 3*ES_INTEGER_SPACE); ERROR_SPRINTF(errtxt, "{analyze stress_profile: getintersection: intersection is not between the two given particles - %e is not between %e and %e and box size is %e, given is %d\n ",value,0.0,p2r[given],box_size[given],given); return 0; } else if (given == get) { *answer = drem_down(value + pos1[given],box_size[given]);; } else if (0==p2r[given]) { char *errtxt = runtime_error(128 + 3*ES_INTEGER_SPACE); ERROR_SPRINTF(errtxt, "{analyze stress_profile: getintersection: intersection is a line, not a point - value is %g same as %g and %g\n",value,0.0,p2r[given]); return 0; } else { *answer = drem_down(pos1[get]+p2r[get]/p2r[given]*value,box_size[get]); } return 1; }
int getlength(double pos1[3], double pos2[3], int d1, double val1, int d2, double val2, int l, double *answer) { /*p1 and p2 are two particles positions d1 and d2 are integers between 0 and 2 denoting an axis (x, y, or z) l and k are integers between 0 and 2 denoting an axis (x, y, or z) two points on the line connecting these particles are defined by r[d1]=val1 and r[d2]=val2 call these two points p3 and p4 (not program variables) this program returns the distance between p3 and p4 in the l direction */ double intersect1, intersect2; *answer = 0; if (! getintersection(pos1,pos2,d2,l,val2,&intersect1,box_l) || ! getintersection(pos1,pos2,d1,l,val1,&intersect2,box_l)) { return 0; } else { *answer = drem_down(intersect2 - intersect1 + box_l[l]/2.0, box_l[l]) - box_l[l]/2.0; return 1; } }