void traceJigHeader(struct part *part) { struct jig *j; int i; int ncol; __p = __line; __p += sprintf(__p, "# Time "); for (i=0; i<part->num_jigs; i++) { j = part->jigs[i]; j->data=0.0; j->data2=0.0; vsetc(j->xdata,0.0); switch (j->type) { case Ground: __p += sprintf(__p, "Anchor "); break; case Thermometer: __p += sprintf(__p, "T.meter "); break; case DihedralMeter: __p += sprintf(__p, "Dihedral "); break; case AngleMeter: __p += sprintf(__p, "Angle "); break; case RadiusMeter: __p += sprintf(__p, "Distance "); break; case Thermostat: __p += sprintf(__p, "T.stat "); break; case LinearMotor: __p += sprintf(__p, "Lmotor "); break; case RotaryMotor: __p += sprintf(__p, "speed torque "); } } sprintf(__p, "\n"); write_traceline(__line); __p = __line; __p += sprintf(__p, "# picosec "); for (i=0; i<part->num_jigs; i++) { j = part->jigs[i]; ncol = countOutputColumns(j); if (ncol > 0) { __p += sprintf(__p, " %-15.15s", j->name); while (ncol-- > 1) // 16 spaces __p += sprintf(__p, " %-15.15s", " "); } } if (PrintPotentialEnergy) { __p += sprintf(__p, " %-15.15s", "P.Energy"); __p += sprintf(__p, " %-15.15s", "K.Energy"); __p += sprintf(__p, " %-15.15s", "T.Energy"); } sprintf(__p, "\n"); write_traceline(__line); __p = __line; sprintf(__p, "#\n"); write_traceline(__line); }
static void trace_makeVirtualAtom(struct patternMatch *match, struct atom *a) { char buf[1024]; char buf1[64]; sprintf(buf, "# Pattern makeVirtualAtom: [%d] %s %d %d ", match->sequenceNumber, trace_atomID(a), a->virtualConstructionAtoms, a->virtualFunction); strcat(buf, trace_atomID(a->creationParameters.v.virtual1)); strcat(buf, " "); strcat(buf, trace_atomID(a->creationParameters.v.virtual2)); strcat(buf, " "); strcat(buf, trace_atomID(a->creationParameters.v.virtual3)); strcat(buf, " "); strcat(buf, trace_atomID(a->creationParameters.v.virtual4)); sprintf(buf1, " %f %f %f\n", a->creationParameters.v.virtualA, a->creationParameters.v.virtualB, a->creationParameters.v.virtualC); strcat(buf, buf1); write_traceline(buf); }
static void trace_makeVanDerWaals(struct patternMatch *match, struct atom *a1, struct atom *a2) { char buf[1024]; sprintf(buf, "# Pattern makeVanDerWaals: [%d] %s ", match->sequenceNumber, trace_atomID(a1)); strcat(buf, trace_atomID(a2)); strcat(buf, "\n"); write_traceline(buf); }
static void trace_setStretchType(struct patternMatch *match, struct stretch *s) { char buf[1024]; char buf1[64]; sprintf(buf, "# Pattern setStretchType: [%d] %s ", match->sequenceNumber, trace_atomID(s->a1)); strcat(buf, trace_atomID(s->a2)); sprintf(buf1, " %f %f\n", s->stretchType->ks, s->stretchType->r0); strcat(buf, buf1); write_traceline(buf); }
void done(const char *format, ...) { va_list args; __p = __line; __p += sprintf(__p, "# Done: "); va_start(args, format); __p += vsprintf(__p, format, args); va_end(args); sprintf(__p, "\n"); write_traceline(__line); }
void traceJigData(struct part *part, struct xyz *positions) { double x; int i; struct jig *j; __p = __line; __p += sprintf(__p, "%10.4f ", Iteration * Dt / PICOSEC); for (i=0; i<part->num_jigs; i++) { j = part->jigs[i]; switch (j->type) { case DihedralMeter: case AngleMeter: __p += sprintf(__p, " %15.5f", j->data); break; case Ground: x=vlen(j->xdata)/1e4; __p += sprintf(__p, " %15.2f", x / j->data); j->data=0.0; vsetc(j->xdata, 0.0); break; case RadiusMeter: case LinearMotor: // convert from picometers to angstroms __p += sprintf(__p, " %15.4f", 0.01 * j->data); j->data = 0.0; break; case Thermometer: case Thermostat: __p += sprintf(__p, " %15.2f", j->data); j->data = 0.0; break; case RotaryMotor: __p += sprintf(__p, " %15.3f %15.3f", j->data, j->data2); j->data = 0.0; j->data2 = 0.0; break; } } if (PrintPotentialEnergy) { double potential_energy = calculatePotential(part, positions); double kinetic_energy = calculateKinetic(part); __p += sprintf(__p, " %15.6f", potential_energy); __p += sprintf(__p, " %15.6f", kinetic_energy); __p += sprintf(__p, " %15.6f", potential_energy + kinetic_energy); } sprintf(__p, "\n"); // each snapshot is one line write_traceline(__line); }
static void trace_makeBond(struct patternMatch *match, struct bond *b) { char buf[1024]; char buf1[64]; struct bondStretch *stretchType; sprintf(buf, "# Pattern makeBond: [%d] %s ", match->sequenceNumber, trace_atomID(b->a1)); strcat(buf, trace_atomID(b->a2)); stretchType = getBondStretch(b->a1->type->protons, b->a2->type->protons, b->order); sprintf(buf1, " %f %f\n", stretchType->ks, stretchType->r0); strcat(buf, buf1); write_traceline(buf); }
void printError(const char *file, int line, int error_type, int doPerror, const char *format, ...) { va_list args; char *errorType; int toStderr = 0; switch (error_type) { case TYPE_ERROR: errorType = "Error"; toStderr = 1; break; case TYPE_WARNING: errorType = "Warning"; break; default: errorType = "Info"; break; } __p = __line; __p += sprintf(__p, "# %s: ", errorType); va_start(args, format); __p += vsprintf(__p, format, args); va_end(args); if (doPerror) { sprintf(__p, ": %s\n", strerror(errno)); } else { sprintf(__p, "\n"); } write_traceline(__line); if (toStderr) { fprintf(stderr, "%s", __line); } }
static int readBondTableOverlay(char *filename) { char buf[4096]; char *token; int lineNumber = 0; int err; int protons; int group; int period; char *parentSymbol; char *symbol; char *name; double mass; double rvdW; double evdW; int nBonds; double rCovalent; double charge; int isVirtual; double ks; double r0; double de; double beta; double inflectionR; double x1; double y1; double x2; double y2; int quality; int quadratic; double ktheta; double theta0; double cutoffRadiusStart; double cutoffRadiusEnd; double value; double angleUnits = 1.0; // default to radians FILE *f = fopen(filename, "r"); if (f == NULL) { // silent about not finding file return 0; } write_traceline("# reading parameter file: %s\n", filename); while (fgets(buf, 4096, f)) { lineNumber++; token = strtok(buf, " \n"); if (token) { if (!strncmp(token, "#", 1) ) { continue; } else if (!strcmp(token, "units")) { err = 0; name = strtok(NULL, " \n"); if (!strcmp(name, "degrees")) { angleUnits = Pi / 180.0; } else if (!strcmp(name, "radians")) { angleUnits = 1.0; } else { fprintf(stderr, "unknown unit at file %s line %d\n", filename, lineNumber); } if (err || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } } else if (!strcmp(token, "element")) { err = 0; protons = tokenizeInt(&err); group = tokenizeInt(&err); period = tokenizeInt(&err); parentSymbol = strtok(NULL, " \n"); symbol = strtok(NULL, " \n"); name = strtok(NULL, " \n"); mass = tokenizeDouble(&err); rvdW = tokenizeDouble(&err); evdW = tokenizeDouble(&err); nBonds = tokenizeInt(&err); rCovalent = tokenizeDouble(&err); charge = tokenizeDouble(&err); isVirtual = tokenizeInt(&err); if (err || symbol == NULL || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } else { setElement(protons, group, period, parentSymbol, symbol, name, mass, rvdW, evdW, nBonds, rCovalent, charge, isVirtual); DPRINT13(D_READER, "setElement: %d %d %d %s %s %s %f %f %f %d %f %f %d\n", protons, group, period, parentSymbol, symbol, name, mass, rvdW, evdW, nBonds, rCovalent, charge, isVirtual); } } else if (!strcmp(token, "stretch")) { err = 0; ks = tokenizeDouble(&err); r0 = tokenizeDouble(&err); de = tokenizeDouble(&err); beta = tokenizeDouble(&err); inflectionR = tokenizeDouble(&err); quality = tokenizeInt(&err); quadratic = tokenizeInt(&err); name = strtok(NULL, " \n"); if (err || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } else { addInitialBondStretch(ks, r0, de, beta, inflectionR, quality, quadratic, name); DPRINT8(D_READER, "addBondStretch: %f %f %f %f %f %d %d %s\n", ks, r0, de, beta, inflectionR, quality, quadratic, name); } } else if (!strcmp(token, "bend")) { err = 0; ktheta = tokenizeDouble(&err); theta0 = tokenizeDouble(&err) * angleUnits; quality = tokenizeInt(&err); name = strtok(NULL, " \n"); if (err || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } else { addInitialBendData(ktheta, theta0, quality, name); DPRINT4(D_READER, "addBendData: %f %f %d %s\n", ktheta, theta0, quality, name); } } else if (!strcmp(token, "vdw")) { err = 0; rvdW = tokenizeDouble(&err); evdW = tokenizeDouble(&err); cutoffRadiusStart = tokenizeDouble(&err); cutoffRadiusEnd = tokenizeDouble(&err); name = strtok(NULL, " \n"); if (err || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } else { addVanDerWaalsInteraction(name, rvdW, evdW, cutoffRadiusStart, cutoffRadiusEnd); DPRINT5(D_READER, "addVanDerWaalsInteraction: %f %f %f %f %s\n", rvdW, evdW, cutoffRadiusStart, cutoffRadiusEnd, name); } } else if (!strcmp(token, "pattern")) { err = 0; name = strtok(NULL, " \n"); value = tokenizeDouble(&err); if (err || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } else { addPatternParameter(name, value, angleUnits, NULL); DPRINT2(D_READER, "addPatternParameter: %s %f\n", name, value); } } else if (!strcmp(token, "strut")) { err = 0; name = strtok(NULL, " \n"); ks = tokenizeDouble(&err); r0 = tokenizeDouble(&err); x1 = tokenizeDouble(&err); y1 = tokenizeDouble(&err); x2 = tokenizeDouble(&err); y2 = tokenizeDouble(&err); if (err || name == NULL) { fprintf(stderr, "format error at file %s line %d\n", filename, lineNumber); } else { addStrutDefinition(name, ks, r0, x1, y1, x2, y2); DPRINT7(D_READER, "addStrutDefinition: %s %f %f %f %f %f %f\n", name, ks, r0, x1, y1, x2, y2); } //} else { //fprintf(stderr, "unrecognized line type at file %s line %d: %s\n", filename, lineNumber, token); } } } fclose(f); return 1; }
void dynamicsMovie(struct part *part) { struct xyz *averagePositions = (struct xyz *)allocate(sizeof(struct xyz) * part->num_atoms); struct xyz *oldPositions = (struct xyz *)allocate(sizeof(struct xyz) * part->num_atoms); struct xyz *newPositions = (struct xyz *)allocate(sizeof(struct xyz) * part->num_atoms); struct xyz *positions = (struct xyz *)allocate(sizeof(struct xyz) * part->num_atoms); struct xyz *force = (struct xyz *)allocate(sizeof(struct xyz) * part->num_atoms); struct xyz *tmp; int i; #ifndef WIN32 int timefailure = 0; struct timeval start; struct timeval end; double elapsedSeconds; char timebuffer[256]; #endif setThermalVelocities(part, Temperature); for (i = 0; i < part->num_atoms; i++) { vset(positions[i], part->positions[i]); vsub2(oldPositions[i], positions[i], part->velocities[i]); } #ifndef WIN32 // we should probably use times() to get user and system time // instead of wall time, but the clock ticks conversions appear to // be system dependant. if (gettimeofday(&start, NULL)) { timefailure = errno; errno = 0; } #endif if (TimeReversal) { dynamicsMovieRun(part, averagePositions, &oldPositions, &newPositions, &positions, force, 0, NumFrames/2); tmp = newPositions; newPositions = positions; positions = tmp; dynamicsMovieRun(part, averagePositions, &oldPositions, &newPositions, &positions, force, NumFrames/2, NumFrames); } else { dynamicsMovieRun(part, averagePositions, &oldPositions, &newPositions, &positions, force, 0, NumFrames); } #ifndef WIN32 if (gettimeofday(&end, NULL)) { timefailure = errno; } if (timefailure) { errno = timefailure; perror("gettimeofday"); errno = 0; } else { end.tv_sec -= start.tv_sec; end.tv_usec -= start.tv_usec; if (end.tv_usec < 0) { end.tv_sec--; end.tv_usec += 1000000; } elapsedSeconds = (double)end.tv_sec + (double)end.tv_usec / 1e6; write_traceline("# Duration: %s, %f sec/frame, %f sec/iteration\n", formatSeconds(elapsedSeconds, timebuffer), elapsedSeconds / (double)i, elapsedSeconds / (double)(i * IterPerFrame)); } #endif writeOutputTrailer(OutputFile, part, NumFrames); free(averagePositions); free(oldPositions); free(newPositions); free(positions); free(force); }
void traceHeader(struct part *part) { int i, ncols; struct jig *j; struct tm *ptr; time_t tm; tm = time(NULL); ptr = localtime(&tm); if (CommandLine != NULL && CommandLine[0] != '\0') { write_traceline("# Command Line: %s\n", CommandLine); } printGlobals(); // asctime provides '\n' so we needn't add one write_traceline("# Date and Time: %s", asctime(ptr)); if (InputFileName != NULL && InputFileName[0] != '\0') { write_traceline("# Input File: %s\n", InputFileName); } if (GromacsOutputBaseName != NULL && GromacsOutputBaseName[0] != '\0') { write_traceline("# Gromacs Output Base Name: %s\n", GromacsOutputBaseName); } if (OutputFileName != NULL && OutputFileName[0] != '\0') { write_traceline("# Output File: %s\n", OutputFileName); } if (TraceFileName != NULL && TraceFileName[0] != '\0') { write_traceline("# Trace File: %s\n", TraceFileName); } if (IDKey != NULL && IDKey[0] != '\0') { write_traceline("# IDKey: %s\n", IDKey); } if (ToMinimize) { write_traceline("#\n"); write_traceline("# Run type: Energy Minimization.\n"); write_traceline("#\n"); write_traceline("# iteration RMS force (pN) maximum force (pN)\n"); write_traceline("#\n"); return; } write_traceline("# \n"); write_traceline("# Run type: Dynamics.\n"); write_traceline("# \n"); write_traceline("# Number of Frames: %d\n", NumFrames); write_traceline("# Steps per Frame: %d\n", IterPerFrame); write_traceline("# Temperature: %.1f\n", Temperature); if (part == NULL) { write_traceline("# Warning: no part supplied.\n"); return; } write_traceline("# Number of Atoms: %d\n", part->num_atoms); write_traceline("# \n"); for (i=0; i<part->num_jigs; i++) { j = part->jigs[i]; switch (j->type) { case Thermostat: write_traceline("# %s Temperature setting: %f K\n", j->name, j->j.thermostat.temperature); break; case LinearMotor: write_traceline("# %s Force: %f pN\n", j->name, j->j.lmotor.force); write_traceline("# %s Stiffness: %f N/m\n", j->name, j->j.lmotor.stiffness); break; case RotaryMotor: write_traceline("# %s Zero Speed Torque: %f nN-nm\n", j->name, j->j.rmotor.stall / 1e6); write_traceline("# %s Zero Torque Speed: %f Ghz\n", j->name, j->j.rmotor.speed / (2.0e9 * Pi)); write_traceline("# %s Initial Speed: %f Ghz\n", j->name, j->j.rmotor.omega / (2.0e9 * Pi)); write_traceline("# %s Damping coefficient: %f\n", j->name, j->j.rmotor.damping_enabled ? j->j.rmotor.dampingCoefficient : 0.0); break; default: break; } } write_traceline("#\n"); ncols = 0; if (PrintPotentialEnergy) { ncols += 3; } for (i=0; i<part->num_jigs; i++) { ncols += countOutputColumns(part->jigs[i]); } // Column count does not include the time column. Cad uses this // to configure plotting interface. write_traceline("# %d columns:\n", ncols); for (i=0; i<part->num_jigs; i++) { j = part->jigs[i]; switch (j->type) { case DihedralMeter: write_traceline("# %s: dihedral (degrees)\n", j->name); break; case AngleMeter: write_traceline("# %s: angle (degrees)\n", j->name); break; case RadiusMeter: write_traceline("# %s: distance (angstroms)\n", j->name); break; case Ground: write_traceline("# %s: torque (nn-nm)\n", j->name); break; case Thermometer: write_traceline("# %s: temperature (K)\n", j->name); break; case Thermostat: write_traceline("# %s: energy added (zJ)\n", j->name); break; case LinearMotor: write_traceline("# %s: displacement (angstroms)\n", j->name); break; case RotaryMotor: write_traceline("# %s: speed (GHz)\n", j->name); write_traceline("# %s: torque (nn-nm)\n", j->name); break; } } if (PrintPotentialEnergy) { write_traceline("# Structure: potential energy (attojoules)\n"); write_traceline("# Structure: kinetic energy (attojoules)\n"); write_traceline("# Structure: total energy (attojoules)\n"); } write_traceline("#\n"); }
void traceFileVersion() { write_traceline("# NanoEngineer-1.com Simulator Trace File, Version 050310\n"); write_traceline("#\n"); }