void ContributionScalarPluginFunction<Driver,PluginType>::doEvaluation() { List<scalarField> values(Pstream::nProcs()); values[Pstream::myProcNo()]=values_(); List<vectorField> positions(Pstream::nProcs()); positions[Pstream::myProcNo()]=positions_(); Pstream::scatterList(values); Pstream::scatterList(positions); typedef typename PluginType::driverType PluginTypeDriverType; scalarField result( this->parentDriver().size() ); autoPtr<vectorField> myPositions( makeParentPositions( dynamicCast<PluginTypeDriverType &>( this->parentDriver() ) ).ptr() ); forAll(result,cellI) { scalar sum=0; scalar distSum=0; bool found=false; const vector &here=myPositions()[cellI]; forAll(values,valI) { const scalarField &localValues=values[valI]; const vectorField &localPos=positions[valI]; forAll(localValues,i) { const scalar dist=mag(localPos[i]-here); if(dist<SMALL) { // Avoid divison by zero result[cellI]=localValues[i]; found=true; break; } // const scalar weight=dist*dist; const scalar weight=dist; sum+=localValues[i]/weight; distSum+=1/weight; } if(found) { break; } } if(!found) { result[cellI]=sum/distSum; } }
void MoleculeGroup::WriteGro(const std::string& gro, const arma::rowvec& box, const std::string description) { std::ofstream gro_file; gro_file.open(gro.c_str()); assert(gro_file.is_open()); gro_file << description << std::endl; gro_file << group_size_ << std::endl; for (int i_atom = 0; i_atom < group_size_; i_atom++) { gro_file << boost::format("%5d%-5s%5s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f") % (index_to_molecular_index_[i_atom]+1) % molecule_name(index_to_molecular_index_[i_atom]) % atom_name(i_atom) % (indices_[i_atom]+1) % positions_(i_atom,0) % positions_(i_atom,1) % positions_(i_atom,2) % velocities_(i_atom,0) % velocities_(i_atom,1) % velocities_(i_atom,2) << std::endl; } gro_file << boost::format("%10.5f%10.5f%10.5f") % box(0) % box(1) % box(2); gro_file.close(); }
inline double position(int atom, int dim) const { return positions_(atom, dim); }