// Traj_AmberNetcdf::writeReservoir() TODO: Make Frame const& int Traj_AmberNetcdf::writeReservoir(int set, Frame const& frame, double energy, int bin) { start_[0] = ncframe_; start_[1] = 0; start_[2] = 0; count_[0] = 1; count_[1] = Ncatom(); count_[2] = 3; // Coords DoubleToFloat(Coord_, frame.xAddress()); if (checkNCerr(nc_put_vara_float(ncid_,coordVID_,start_,count_,Coord_)) ) { mprinterr("Error: Netcdf writing reservoir coords %i\n",set); return 1; } // Velo if (velocityVID_ != -1) { if (frame.vAddress() == 0) { // TODO: Make it so this can NEVER happen. mprinterr("Error: Reservoir expects velocities, but no velocities in frame.\n"); return 1; } DoubleToFloat(Coord_, frame.vAddress()); if (checkNCerr(nc_put_vara_float(ncid_,velocityVID_,start_,count_,Coord_)) ) { mprinterr("Error: Netcdf writing reservoir velocities %i\n",set); return 1; } } // Eptot, bins if ( checkNCerr( nc_put_vara_double(ncid_,eptotVID_,start_,count_,&energy)) ) { mprinterr("Error: Writing eptot.\n"); return 1; } if (binsVID_ != -1) { if ( checkNCerr( nc_put_vara_int(ncid_,binsVID_,start_,count_,&bin)) ) { mprinterr("Error: Writing bins.\n"); return 1; } } // Write box if (cellLengthVID_ != -1) { count_[1] = 3; count_[2] = 0; if (checkNCerr(nc_put_vara_double(ncid_,cellLengthVID_,start_,count_,frame.bAddress())) ) { mprinterr("Error: Writing cell lengths.\n"); return 1; } if (checkNCerr(nc_put_vara_double(ncid_,cellAngleVID_,start_,count_, frame.bAddress()+3)) ) { mprinterr("Error: Writing cell angles.\n"); return 1; } } nc_sync(ncid_); // Necessary after every write?? ++ncframe_; return 0; }
int Traj_AmberNetcdf::parallelWriteFrame(int set, Frame const& frameOut) { MPI_Offset pstart_[3]; MPI_Offset pcount_[3]; pstart_[0] = set; pstart_[1] = 0; pstart_[2] = 0; pcount_[0] = 1; pcount_[1] = Ncatom(); pcount_[2] = 3; // TODO check error better DoubleToFloat(Coord_, frameOut.xAddress()); //int err = ncmpi_put_vara_float_all(ncid_, coordVID_, pstart_, pcount_, Coord_); int err = ncmpi_put_vara_float(ncid_, coordVID_, pstart_, pcount_, Coord_); if (checkPNCerr(err)) return Parallel::Abort(err); if (velocityVID_ != -1) { DoubleToFloat(Coord_, frameOut.vAddress()); //err = ncmpi_put_vara_float_all(ncid_, velocityVID_, pstart_, pcount_, Coord_); err = ncmpi_put_vara_float(ncid_, velocityVID_, pstart_, pcount_, Coord_); if (checkPNCerr(err)) return Parallel::Abort(err); } if (frcVID_ != -1) { DoubleToFloat(Coord_, frameOut.fAddress()); err = ncmpi_put_vara_float(ncid_, frcVID_, pstart_, pcount_, Coord_); if (checkPNCerr(err)) return Parallel::Abort(err); } pcount_[2] = 0; if (cellLengthVID_ != -1) { pcount_[1] = 3; //err = ncmpi_put_vara_double_all(ncid_, cellLengthVID_, pstart_, pcount_, frameOut.bAddress()); err = ncmpi_put_vara_double(ncid_, cellLengthVID_, pstart_, pcount_, frameOut.bAddress()); if (checkPNCerr(err)) return Parallel::Abort(err); //err = ncmpi_put_vara_double_all(ncid_, cellAngleVID_, pstart_, pcount_, frameOut.bAddress()+3); err = ncmpi_put_vara_double(ncid_, cellAngleVID_, pstart_, pcount_, frameOut.bAddress()+3); } if (TempVID_ != -1) { //err = ncmpi_put_vara_double_all(ncid_, TempVID_, pstart_, pcount_, frameOut.tAddress()); err = ncmpi_put_vara_double(ncid_, TempVID_, pstart_, pcount_, frameOut.tAddress()); if (checkPNCerr(err)) return Parallel::Abort(err); } if (timeVID_ != -1) { float tVal = (float)frameOut.Time(); err = ncmpi_put_vara_float(ncid_, timeVID_, pstart_, pcount_, &tVal); if (checkPNCerr(err)) return Parallel::Abort(err); } if (indicesVID_ != -1) { pcount_[1] = remd_dimension_; //err = ncmpi_put_vara_int_all(ncid_, indicesVID_, pstart_, pcount_, frameOut.iAddress()); err = ncmpi_put_vara_int(ncid_, indicesVID_, pstart_, pcount_, frameOut.iAddress()); if (checkPNCerr(err)) return Parallel::Abort(err); } return 0; }
/******************************************************************************* * ReadBBox * * Similar to ReadFloat above. * */ static BOOL ReadBBox(FILE *file, CHAR buffer[], INT bufsize, AFM *afm, BOOL *p_found) { CHAR *cp, *end_ptr; double d; if (FindLine(file, buffer, bufsize, "FontBBox") == FALSE) return FALSE; if (buffer[0] == '\0') { *p_found = FALSE; return TRUE; } errno = 0; cp = buffer + sizeof("FontBBox"); d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(afm->FontBBox.llx), d) == FALSE) goto parse_error; cp = end_ptr; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(afm->FontBBox.lly), d) == FALSE) goto parse_error; cp = end_ptr; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(afm->FontBBox.urx), d) == FALSE) goto parse_error; cp = end_ptr; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(afm->FontBBox.ury), d) == FALSE) goto parse_error; *p_found = TRUE; return TRUE; parse_error: WARN("Error parsing line '%s'\n", buffer); *p_found = FALSE; return TRUE; }
/******************************************************************************* * ReadFloat * * Finds and parses a line of the form '<key> <value>', where value is a * number. Sets *p_found to FALSE if a corresponding line cannot be found, or * it cannot be parsed; also sets *p_ret to 0.0, so calling functions can just * skip the check of *p_found if the item is not required. * */ static BOOL ReadFloat(FILE *file, CHAR buffer[], INT bufsize, LPCSTR key, FLOAT *p_ret, BOOL *p_found) { CHAR *cp, *end_ptr; double d; if (FindLine(file, buffer, bufsize, key) == FALSE) return FALSE; if (buffer[0] == '\0') /* line not found */ { *p_found = FALSE; *p_ret = 0.0; return TRUE; } cp = buffer + strlen(key); /* first char after key */ errno = 0; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(p_ret, d) == FALSE) { WARN("Error parsing line '%s'\n", buffer); *p_found = FALSE; *p_ret = 0.0; return TRUE; } *p_found = TRUE; return TRUE; }
/******************************************************************************* * * ParseB * * Fatal error: return FALSE (none defined) * * Non-fatal error: leave metrics->B.ury set to FLT_MAX * */ static BOOL ParseB(LPSTR sz, OLD_AFMMETRICS *metrics) { CHAR *cp, *end_ptr; double d; errno = 0; cp = sz + 1; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(metrics->B.llx), d) == FALSE) goto parse_error; cp = end_ptr; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(metrics->B.lly), d) == FALSE) goto parse_error; cp = end_ptr; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(metrics->B.urx), d) == FALSE) goto parse_error; cp = end_ptr; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(metrics->B.ury), d) == FALSE) goto parse_error; return TRUE; parse_error: WARN("Error parsing glyph bounding box '%s'\n", sz); return TRUE; }
TEST(DSP, FloatDoubleConversion) { float in[10] = {1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0}; double out[10]; float fout[10]; FloatToDouble(out, in, 10); for (unsigned i = 0; i < 10; ++i) { ASSERT_DOUBLE_EQ((double)in[i], out[i]); } DoubleToFloat(fout, out, 10); for (unsigned i = 0; i < 10; ++i) { ASSERT_FLOAT_EQ(in[i], fout[i]); } }
/******************************************************************************* * ParseW * * Fatal error: return FALSE (none defined) * * Non-fatal error: leave metrics->WX set to FLT_MAX * */ static BOOL ParseW(LPSTR sz, OLD_AFMMETRICS *metrics) { CHAR *cp, *end_ptr; BOOL vector = TRUE; double d; cp = sz + 1; if (*cp == '0') ++cp; if (*cp == 'X') { vector = FALSE; ++cp; } if (!isspace(*cp)) goto parse_error; errno = 0; d = strtod(cp, &end_ptr); if (end_ptr == cp || errno != 0 || DoubleToFloat(&(metrics->WX), d) == FALSE) goto parse_error; if (vector == FALSE) return TRUE; /* Make sure that Y component of vector is zero */ d = strtod(cp, &end_ptr); /* errno == 0 */ if (end_ptr == cp || errno != 0 || d != 0.0) { metrics->WX = FLT_MAX; goto parse_error; } return TRUE; parse_error: WARN("Error parsing character width '%s'\n", sz); return TRUE; }
// Traj_AmberNetcdf::writeFrame() int Traj_AmberNetcdf::writeFrame(int set, double *X, double *V, double *box, double T) { DoubleToFloat(Coord_, X); // Write coords start_[0] = ncframe_; start_[1] = 0; start_[2] = 0; count_[0] = 1; count_[1] = Ncatom(); count_[2] = 3; if (checkNCerr(nc_put_vara_float(ncid_,coordVID_,start_,count_,Coord_)) ) { mprinterr("Error: Netcdf Writing frame %i\n",set); return 1; } // Write box if (cellLengthVID_ != -1) { count_[1] = 3; count_[2] = 0; if (checkNCerr(nc_put_vara_double(ncid_,cellLengthVID_,start_,count_,box)) ) { mprinterr("Error: Writing cell lengths.\n"); return 1; } if (checkNCerr(nc_put_vara_double(ncid_,cellAngleVID_,start_,count_, box+3)) ) { mprinterr("Error: Writing cell angles.\n"); return 1; } } // Write temperature if (TempVID_!=-1) { if ( checkNCerr( nc_put_vara_double(ncid_,TempVID_,start_,count_,&T)) ) { mprinterr("Error: Writing temperature.\n"); return 1; } } nc_sync(ncid_); // Necessary after every write?? ++ncframe_; return 0; }
// Traj_NcEnsemble::writeArray() // TODO RemdValues int Traj_NcEnsemble::writeArray(int set, FramePtrArray const& Farray) { # ifdef HAS_PNETCDF MPI_Offset pstart_[4]; MPI_Offset pcount_[4]; # define start_ pstart_ # define count_ pcount_ # endif start_[0] = ncframe_; // Frame start_[2] = 0; // Atoms start_[3] = 0; // XYZ count_[0] = 1; // Frame count_[1] = 1; // Ensemble count_[3] = 3; // XYZ for (int member = ensembleStart_; member != ensembleEnd_; member++) { //rprintf("DEBUG: Writing set %i, member %i\n", set+1, member); # ifdef MPI Frame* frm = Farray[0]; # else Frame* frm = Farray[member]; # endif start_[1] = member; // Ensemble count_[2] = Ncatom(); // Atoms // Write Coords //DebugIndices(); // DEBUG DoubleToFloat(Coord_, frm->xAddress()); # ifdef HAS_PNETCDF if (ncmpi_put_vara_float_all(ncid_, coordVID_, start_, count_, Coord_)) # else if (NC::CheckErr(nc_put_vara_float(ncid_, coordVID_, start_, count_, Coord_))) # endif { mprinterr("Error: Netcdf Writing coords frame %i\n", set+1); return 1; } // Write velocity. if (velocityVID_ != -1) { DoubleToFloat(Coord_, frm->vAddress()); # ifdef HAS_PNETCDF if (ncmpi_put_vara_float_all(ncid_, velocityVID_, start_, count_, Coord_)) # else if (NC::CheckErr(nc_put_vara_float(ncid_, velocityVID_, start_, count_, Coord_)) ) # endif { mprinterr("Error: Netcdf writing velocity frame %i\n", set+1); return 1; } } // Write box if (cellLengthVID_ != -1) { count_[2] = 3; # ifdef HAS_PNETCDF if (ncmpi_put_vara_double_all(ncid_,cellLengthVID_,start_,count_,frm->bAddress())) # else if (NC::CheckErr(nc_put_vara_double(ncid_,cellLengthVID_,start_,count_,frm->bAddress())) ) # endif { mprinterr("Error: Writing cell lengths frame %i.\n", set+1); return 1; } # ifdef HAS_PNETCDF if (ncmpi_put_vara_double_all(ncid_,cellAngleVID_,start_,count_,frm->bAddress()+3)) # else if (NC::CheckErr(nc_put_vara_double(ncid_,cellAngleVID_,start_,count_,frm->bAddress()+3))) # endif { mprinterr("Error: Writing cell angles frame %i.\n", set+1); return 1; } } // Write temperature if (TempVID_!=-1) { # ifdef HAS_PNETCDF if (ncmpi_put_vara_double_all(ncid_,TempVID_,start_,count_,frm->tAddress())) # else if (NC::CheckErr(nc_put_vara_double(ncid_,TempVID_,start_,count_,frm->tAddress()))) # endif { mprinterr("Error: Writing temperature frame %i.\n", set+1); return 1; } } // Write indices if (indicesVID_ != -1) { count_[2] = remd_dimension_; # ifdef HAS_PNETCDF if (ncmpi_put_vara_int_all(ncid_,indicesVID_,start_,count_,frm->iAddress())) # else if (NC::CheckErr(nc_put_vara_int(ncid_,indicesVID_,start_,count_,frm->iAddress()))) # endif { mprinterr("Error: Writing indices frame %i.\n", set+1); return 1; } } } # ifdef HAS_PNETCDF //ncmpi_sync(ncid_); # else nc_sync(ncid_); // Necessary after every write?? # endif ++ncframe_; # ifdef HAS_PNETCDF // DEBUG # undef start_ # undef count_ # endif return 0; }
// Traj_AmberNetcdf::writeFrame() int Traj_AmberNetcdf::writeFrame(int set, Frame const& frameOut) { DoubleToFloat(Coord_, frameOut.xAddress()); // Write coords start_[0] = ncframe_; start_[1] = 0; start_[2] = 0; count_[0] = 1; count_[1] = Ncatom(); count_[2] = 3; if (checkNCerr(nc_put_vara_float(ncid_,coordVID_,start_,count_,Coord_)) ) { mprinterr("Error: Netcdf Writing coords frame %i\n", set+1); return 1; } // Write velocity. FIXME: Should check in setup if (CoordInfo().HasVel() && frameOut.HasVelocity()) { DoubleToFloat(Coord_, frameOut.vAddress()); if (checkNCerr(nc_put_vara_float(ncid_, velocityVID_, start_, count_, Coord_)) ) { mprinterr("Error: Netcdf writing velocity frame %i\n", set+1); return 1; } } // Write box if (cellLengthVID_ != -1) { count_[1] = 3; count_[2] = 0; if (checkNCerr(nc_put_vara_double(ncid_,cellLengthVID_,start_,count_,frameOut.bAddress())) ) { mprinterr("Error: Writing cell lengths frame %i.\n", set+1); return 1; } if (checkNCerr(nc_put_vara_double(ncid_,cellAngleVID_,start_,count_, frameOut.bAddress()+3)) ) { mprinterr("Error: Writing cell angles frame %i.\n", set+1); return 1; } } // Write temperature if (TempVID_!=-1) { if ( checkNCerr( nc_put_vara_double(ncid_,TempVID_,start_,count_,frameOut.tAddress())) ) { mprinterr("Error: Writing temperature frame %i.\n", set+1); return 1; } } // Write time if (timeVID_ != -1) { float tVal = (float)frameOut.Time(); if ( checkNCerr( nc_put_vara_float(ncid_,timeVID_,start_,count_,&tVal)) ) { mprinterr("Error: Writing time frame %i.\n", set+1); return 1; } } // Write indices if (indicesVID_ != -1) { count_[1] = remd_dimension_; if ( checkNCerr(nc_put_vara_int(ncid_,indicesVID_,start_,count_,frameOut.iAddress())) ) { mprinterr("Error: Writing indices frame %i.\n", set+1); return 1; } } nc_sync(ncid_); // Necessary after every write?? ++ncframe_; return 0; }