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();
}
Beispiel #3
0
 inline double position(int atom, int dim) const {
   return positions_(atom, dim);
 }