示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
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);
}
示例#5
0
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);
}
示例#6
0
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);
}
示例#7
0
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);
}
示例#8
0
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);
  }
}
示例#9
0
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;
}
示例#10
0
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);
}
示例#11
0
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");
}
示例#12
0
void
traceFileVersion()
{
    write_traceline("# NanoEngineer-1.com Simulator Trace File, Version 050310\n");
    write_traceline("#\n");
}