Rotation<Frenet<ThisFrame>, ThisFrame> DynamicFrame<InertialFrame, ThisFrame>::FrenetFrame( Instant const& t, DegreesOfFreedom<ThisFrame> const& degrees_of_freedom) const { Velocity<ThisFrame> const& velocity = degrees_of_freedom.velocity(); Vector<Acceleration, ThisFrame> const acceleration = GeometricAcceleration(t, degrees_of_freedom); Vector<Acceleration, ThisFrame> normal_acceleration = acceleration; velocity.template Orthogonalize<Acceleration>(&normal_acceleration); Vector<double, ThisFrame> tangent = Normalize(velocity); Vector<double, ThisFrame> normal = Normalize(normal_acceleration); Bivector<double, ThisFrame> binormal = Wedge(tangent, normal); // Maps |tangent| to {1, 0, 0}, |normal| to {0, 1, 0}, and |binormal| to // {0, 0, 1}. return Rotation<Frenet<ThisFrame>, ThisFrame>( R3x3Matrix(tangent.coordinates(), normal.coordinates(), binormal.coordinates()).Transpose()); }
Rotation<ThisFrame, Frame> BodySurfaceFrameField<Frame, ThisFrame>::FromThisFrame( Position<Frame> const& q) const { Displacement<Frame> const from_body_centre = q - body_position_; Vector<double, Frame> const zenith = Normalize(from_body_centre); double const axis_projection = InnerProduct(zenith, body_axis_); double const axis_projection² = axis_projection * axis_projection; // The unit vector |north| is directed along the polar axis. Note that λ is // positive. double const λ = 1 / Sqrt(1 - axis_projection²); auto const μ = -λ * axis_projection; Vector<double, Frame> const north = λ * body_axis_ + μ * zenith; Vector<double, Frame> const nadir = -zenith; Bivector<double, Frame> const east = Wedge(nadir, north); return Rotation<ThisFrame, Frame>(north, east, nadir); }
bool Inicializer::initConfig(FILE** infile, std::vector<Particle > &pvec) { int err,fields,tmp_type; long j,current; char * line, line2[STRLEN]; size_t line_size = (STRLEN + 1) * sizeof(char); line = (char *) malloc(line_size); //Particle chorig[MAXCHL]; double maxlength = 0.0; for(int i = 0; i < MAXT; i++){ if(maxlength < topo.ia_params[i][i].len[0]) maxlength = topo.ia_params[i][i].len[0]; } if(myGetLine(&line, &line_size, *infile) == -1){ fprintf (stderr, "ERROR: Could not read box size (Inicializer::initConfig)\n\n"); return false; } strip_comment(line); trim(line); #ifdef WEDGE double angle, innerR, outerR; Vector box; if (sscanf(line, "%le %le %le %le", &outerR, &innerR, &box.z, &angle) != 4) { if(myGetLine(&line, &line_size, infile) == -1){ fprintf (stderr, "ERROR: Could not read box size.\n\n"); return false; } aftercommand(line2,line,BOXSEP); strip_comment(line2); trim(line2); if (sscanf(line2, "%le %le %le %le", &box.z, &angle, &outerR, &innerR) != 4) { fprintf (stderr, "ERROR: Could not read box size.\n\n"); return false; } } conf->geo = Wedge(box.z, angle, outerR, innerR); //(double box.z, double angle, double outerR, double innerR) #else Vector box; if (sscanf(line, "%le %le %le", &(box.x), &(box.y), &(box.z) ) != 3) { if(myGetLine(&line, &line_size, *infile) == -1){ fprintf (stderr, "ERROR: Could not read box size2.\n\n"); return false; } aftercommand(line2,line,BOXSEP); strip_comment(line2); trim(line2); if (sscanf(line2, "%le %le %le", &(box.x), &(box.y), &(box.z) ) != 3) { fprintf (stderr, "ERROR: Could not read box size3.\n\n"); return false; } } conf->geo = Cuboid(box); #endif if (conf->geo.box.x < maxlength * 2.0 + 2.0) { printf ("WARNING: x (%f) geo.box length is less than two spherocylinders long (%f).\n\n", conf->geo.box.x, maxlength * 2.0 + 2.0); exit(1); } if (conf->geo.box.y < maxlength * 2.0 + 2.0) { printf ("WARNING: y (%f) geo.box length is less than two spherocylinders long (%f).\n\n", conf->geo.box.y, maxlength * 2.0 + 2.0); exit(1); } if (conf->geo.box.z < maxlength * 2.0 + 2.0) { printf ("WARNING: z (%f) geo.box length is less than two spherocylinders long (%f).\n\n", conf->geo.box.z, maxlength * 2.0 + 2.0); exit(1); } DEBUG_INIT("Position of the particle"); for(unsigned int i=0; i < pvec.size(); i++) { if(myGetLine(&line, &line_size, *infile) == -1){ break; } strip_comment(line); trim(line); fields = sscanf(line, "%le %le %le %le %le %le %le %le %le %d", &pvec[i].pos.x, &pvec[i].pos.y, &pvec[i].pos.z, &pvec[i].dir.x, &pvec[i].dir.y, &pvec[i].dir.z, &pvec[i].patchdir[0].x, &pvec[i].patchdir[0].y, &pvec[i].patchdir[0].z, &pvec[i].switched); pvec[i].patchdir[1].x = pvec[i].patchdir[1].y = pvec[i].patchdir[1].z =0; pvec[i].chdir[0].x = pvec[i].chdir[0].y = pvec[i].chdir[0].z =0; pvec[i].chdir[1].x = pvec[i].chdir[1].y = pvec[i].chdir[1].z =0; DEBUG_INIT("Line: %s\nNumber of Fields: %d", line, fields); if (fields == 9){ pvec[i].switched = 0; fprintf(stdout, "WARNING: Particle %u is assumed to be not switched!\n", i+1); fields++; } if (fields != 10) { fprintf (stderr, "ERROR: Could not read coordinates for particle %u.\n \ Did you specify box size at the begining?\n\n", i+1); free(line); exit (1); } /* Scale position vector to the unit cube */ #ifdef WEDGE pvec[i].pos.x /= conf->geo.box.x; pvec[i].pos.y /= conf->geo.box.y; pvec[i].pos.z /= conf->geo.box.z; conf->geo.usePBC(&pvec[i]); #else // For analysis of sheet //conf->geo.usePBC2(&pvec[i]); // range 0 - box pvec[i].pos.x /= conf->geo.box.x; pvec[i].pos.y /= conf->geo.box.y; pvec[i].pos.z /= conf->geo.box.z; // for compatibility unfortunately conf->geo.usePBC(&pvec[i]); #endif if ((topo.ia_params[pvec[i].type][pvec[i].type].geotype[0]<SP)&&( DOT(pvec[i].dir, pvec[i].dir) < ZEROTOL )) { //DEBUG_INIT("Geotype = %d < %d", conf->pvec[i].geotype,SP); fprintf (stderr, "ERROR: Null direction vector supplied for particle %u.\n\n", i+1); free(line); return false; } else { pvec[i].dir.normalise(); } if ((topo.ia_params[pvec[i].type][pvec[i].type].geotype[0]<SP)&&( DOT(pvec[i].patchdir[0], pvec[i].patchdir[0]) < ZEROTOL )) { fprintf (stderr, "ERROR: Null patch vector supplied for particle %u.\n\n", i+1); free(line); return false; } else { ortogonalise(&pvec[i].patchdir[0],&pvec[i].dir); pvec[i].patchdir[0].normalise(); } // Switch the type if(pvec[i].switched){ if(pvec[i].switchtype == 0){ fprintf(stderr, "ERROR: Particle %u switched even though it has no switchtype", i); free(line); exit(1); } tmp_type = pvec[i].type; pvec[i].type = pvec[i].switchtype; pvec[i].switchtype = tmp_type; } DEBUG_INIT("%ld:\t%lf\t%lf\t%lf", i, pvec[i].pos.x, pvec[i].pos.y, pvec[i].pos.z); }