/** Create Netcdf file specified by filename and set up dimension and * variable IDs. */ int Traj_AmberNetcdf::setupTrajout(std::string const& fname, Topology* trajParm, int NframesToWrite, bool append) { if (!append) { filename_.SetFileName( fname ); // Set up title if (Title().empty()) SetTitle("Cpptraj Generated trajectory"); // Create NetCDF file. if ( NC_create( filename_.Full(), NC_AMBERTRAJ, trajParm->Natom(), HasV(), HasBox(), HasT(), true, Title() ) ) return 1; if (debug_>1) NetcdfDebug(); // Close Netcdf file. It will be reopened write. NC_close(); // Allocate memory if (Coord_!=0) delete[] Coord_; Coord_ = new float[ Ncatom3() ]; } else { // NOTE: File existence is checked for in Trajout // Call setupTrajin to set input parameters. This will also allocate // memory for coords. if (setupTrajin(fname, trajParm) == TRAJIN_ERR) return 1; if (debug_ > 0) mprintf("\tNetCDF: Appending %s starting at frame %i\n", filename_.base(), Ncframe()); } // Open file if ( NC_openWrite( filename_.Full() ) != 0 ) { mprinterr("Error: Opening Netcdf file %s for Write.\n", filename_.base()); return 1; } return 0; }
/** Create Netcdf file specified by filename and set up dimension and * variable IDs. */ int Traj_AmberNetcdf::setupTrajout(FileName const& fname, Topology* trajParm, CoordinateInfo const& cInfoIn, int NframesToWrite, bool append) { readAccess_ = false; if (!append) { CoordinateInfo cInfo = cInfoIn; // Deal with output options // For backwards compatibility always write temperature if remdtraj is true. if (outputTemp_ && !cInfo.HasTemp()) cInfo.SetTemperature(true); // Explicitly write velocity - initial frames may not have velocity info. if (outputVel_ && !cInfo.HasVel()) cInfo.SetVelocity(true); if (outputFrc_ && !cInfo.HasForce()) cInfo.SetForce(true); SetCoordInfo( cInfo ); filename_ = fname; // Set up title if (Title().empty()) SetTitle("Cpptraj Generated trajectory"); // Create NetCDF file. if (NC_create( filename_.Full(), NC_AMBERTRAJ, trajParm->Natom(), CoordInfo(), Title() )) return 1; if (debug_>1) NetcdfDebug(); // Close Netcdf file. It will be reopened write. NC_close(); // Allocate memory if (Coord_!=0) delete[] Coord_; Coord_ = new float[ Ncatom3() ]; } else { // NOTE: File existence is checked for in Trajout // Call setupTrajin to set input parameters. This will also allocate // memory for coords. if (setupTrajin(fname, trajParm) == TRAJIN_ERR) return 1; // Check output options. if (outputTemp_ && !CoordInfo().HasTemp()) mprintf("Warning: Cannot append temperature data to NetCDF file '%s'; no temperature dimension.\n", filename_.base()); if (outputVel_ && !CoordInfo().HasVel()) mprintf("Warning: Cannot append velocity data to NetCDF file '%s'; no velocity dimension.\n", filename_.base()); if (outputFrc_ && !CoordInfo().HasForce()) mprintf("Warning: Cannot append force data to NetCDF file '%s'; no force dimension.\n", filename_.base()); if (debug_ > 0) mprintf("\tNetCDF: Appending %s starting at frame %i\n", filename_.base(), Ncframe()); } // Open file if ( NC_openWrite( filename_.Full() ) != 0 ) { mprinterr("Error: Opening Netcdf file %s for Write.\n", filename_.base()); return 1; } return 0; }
/* This function creates a file for use with parallel I/O. */ int nc_create_par(const char *path, int cmode, MPI_Comm comm, MPI_Info info, int *ncidp) { #ifndef USE_PARALLEL return NC_ENOPAR; #else NC_MPI_INFO data; /* One of these two parallel IO modes must be chosen by the user, * or else pnetcdf must be in use. */ if (!(cmode & NC_MPIIO || cmode & NC_MPIPOSIX) && !(cmode & NC_PNETCDF)) return NC_EINVAL; data.comm = comm; data.info = info; return NC_create(path, cmode, 0, 0, NULL, 1, &data, ncidp); #endif /* USE_PARALLEL */ }
// Traj_NcEnsemble::setupTrajout() int Traj_NcEnsemble::setupTrajout(FileName const& fname, Topology* trajParm, CoordinateInfo const& cInfoIn, int NframesToWrite, bool append) { int err = 0; # ifdef MPI if (NoPnetcdf()) return 1; # endif readAccess_ = false; if (!append) { CoordinateInfo cInfo = cInfoIn; // TODO: File output modifications SetCoordInfo( cInfo ); # ifdef MPI ensembleStart_ = Parallel::World().Rank(); ensembleEnd_ = Parallel::World().Rank() + 1; # else ensembleStart_ = 0; ensembleEnd_ = cInfo.EnsembleSize();; # endif filename_ = fname; // Set up title if (Title().empty()) SetTitle("Cpptraj Generated trajectory"); # ifdef MPI if (Parallel::World().Master()) { // Only master creates file. # endif // Create NetCDF file. err = NC_create(filename_.Full(), NC_AMBERENSEMBLE, trajParm->Natom(), CoordInfo(), Title(), debug_); // Close Netcdf file. It will be reopened write. FIXME should NC_create leave it closed? NC_close(); # ifdef MPI } Parallel::World().MasterBcast(&err, 1, MPI_INT); # endif if (err != 0) return 1; # ifdef MPI // Synchronize netcdf info on non-master threads Sync(Parallel::World()); // DEBUG: Print info for all ranks DebugVIDs(); # endif // Allocate memory if (Coord_!=0) delete[] Coord_; Coord_ = new float[ Ncatom3() ]; } else { // NOTE: File existence is checked for in Trajout // Call setupTrajin to set input parameters. This will also allocate // memory for coords. if (setupTrajin(fname, trajParm) == TRAJIN_ERR) return 1; if (debug_ > 0) mprintf("\tNetCDF: Appending %s starting at frame %i\n", filename_.base(), Ncframe()); } // Open file # ifdef HAS_PNETCDF err = ncmpi_open(MPI_COMM_WORLD, filename_.full(), NC_WRITE, MPI_INFO_NULL, &ncid_); // TODO: Graceful error handling # else err = NC_openWrite( filename_.Full() ); # endif if ( err != 0 ) { mprinterr("Error: Opening Netcdf file %s for Write.\n", filename_.base()); return 1; } return 0; }
// Traj_AmberRestartNC::writeFrame() int Traj_AmberRestartNC::writeFrame(int set, double *X, double *V,double *box, double T) { // Set up file for this set bool V_present = (HasV() && V != 0); std::string fname; // Create filename for this set // If just writing 1 frame dont modify output filename if (singleWrite_) fname = filename_.Full(); else fname = NumberFilename(filename_.Full(), set+1); if ( NC_create( fname.c_str(), NC_AMBERRESTART, Ncatom(), V_present, HasBox(), HasT(), (time0_ >= 0), Title() ) ) return 1; // write coords start_[0] = 0; start_[1] = 0; count_[0] = Ncatom(); count_[1] = 3; if (checkNCerr(nc_put_vara_double(ncid_,coordVID_,start_,count_,X)) ) { mprinterr("Error: Netcdf restart Writing coordinates %i\n",set); return 1; } // write velocity if (V_present) { mprintf("DEBUG: Writing V, VID=%i\n",velocityVID_); if (checkNCerr(nc_put_vara_double(ncid_,velocityVID_,start_,count_,V)) ) { mprinterr("Error: Netcdf restart writing velocity %i\n",set); return 1; } } // write box if (cellLengthVID_ != -1) { count_[0] = 3; count_[1] = 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 time if (timeVID_ != -1) { restartTime_ = (time0_ + (double)set) * dt_; if (checkNCerr(nc_put_var_double(ncid_,timeVID_,&restartTime_)) ) { mprinterr("Error: Writing restart time.\n"); return 1; } } // write temperature if (TempVID_ != -1) { if (checkNCerr(nc_put_var_double(ncid_,TempVID_,&T)) ) { mprinterr("Error: Writing restart temperature.\n"); return 1; } } //nc_sync(ncid_); // Necessary? File about to close anyway... // Close file for this set closeTraj(); return 0; }