Ejemplo n.º 1
0
void
computeP0pressure (const feSpacePtr_Type& pFESpacePtr,
                   const feSpacePtr_Type& p0FESpacePtr,
                   const feSpacePtr_Type& uFESpacePtr,
                   const vector_Type&     velAndPressure,
                   vector_Type&           P0pres,
                   Real /*time*/)
{

    int MyPID;
    MPI_Comm_rank (MPI_COMM_WORLD, &MyPID);
    UInt offset = 3 * uFESpacePtr->dof().numTotalDof();

    std::vector<int> gid0Vec (0);
    gid0Vec.reserve (p0FESpacePtr->mesh()->numVolumes() );
    std::vector<Real> val0Vec (0);
    val0Vec.reserve (p0FESpacePtr->mesh()->numVolumes() );

    for (UInt ivol = 0; ivol < pFESpacePtr->mesh()->numVolumes(); ++ivol)
    {

        pFESpacePtr->fe().update ( pFESpacePtr->mesh()->volumeList ( ivol ), UPDATE_DPHI );
        p0FESpacePtr->fe().update ( p0FESpacePtr->mesh()->volumeList ( ivol ) );

        UInt eleID = pFESpacePtr->fe().currentLocalId();

        double tmpsum = 0.;
        for (UInt iNode = 0; iNode < (UInt) pFESpacePtr->fe().nbFEDof(); iNode++)
        {
            int ig = pFESpacePtr->dof().localToGlobalMap ( eleID, iNode );
            tmpsum += velAndPressure (ig + offset);
            gid0Vec.push_back ( p0FESpacePtr->fe().currentId() );
            val0Vec.push_back ( tmpsum / (double) pFESpacePtr->fe().nbFEDof() );
        }
    }
    P0pres.setCoefficients (gid0Vec, val0Vec);
    P0pres.globalAssemble();
    MPI_Barrier (MPI_COMM_WORLD);

}