int SPRNodalRecoveryModel :: packSharedDofManData(parallelStruct *s, ProcessCommunicator &processComm) { int result = 1, i, j, indx, eq, size; ProcessCommunicatorBuff *pcbuff = processComm.giveProcessCommunicatorBuff(); IntArray const *toSendMap = processComm.giveToSendMap(); size = toSendMap->giveSize(); for ( i = 1; i <= size; i++ ) { // toSendMap contains all shared dofmans with remote partition // one has to check, if particular shared node value is available for given region indx = s->regionNodalNumbers->at( toSendMap->at(i) ); if ( indx && s->dofManPatchCount->at(indx) ) { // pack "1" to indicate that for given shared node this is a valid contribution result &= pcbuff->write(1); eq = ( indx - 1 ) * s->regionValSize; for ( j = 1; j <= s->regionValSize; j++ ) { result &= pcbuff->write( s->dofManValues->at(eq + j) ); } } else { // ok shared node is not in active region (determined by s->regionNodalNumbers) result &= pcbuff->write(0); } } return result; }
int ParmetisLoadBalancer :: packSharedDmanPartitions(ProcessCommunicator &pc) { int myrank = domain->giveEngngModel()->giveRank(); int iproc = pc.giveRank(); int ndofman, idofman; DofManager *dofman; if ( iproc == myrank ) { return 1; // skip local partition } // query process communicator to use ProcessCommunicatorBuff *pcbuff = pc.giveProcessCommunicatorBuff(); // loop over dofManagers and pack shared dofMan data ndofman = domain->giveNumberOfDofManagers(); for ( idofman = 1; idofman <= ndofman; idofman++ ) { dofman = domain->giveDofManager(idofman); // test if iproc is in list of existing shared partitions if ( ( dofman->giveParallelMode() == DofManager_shared ) && ( dofman->givePartitionList()->findFirstIndexOf(iproc) ) ) { // send new partitions to remote representation // fprintf (stderr, "[%d] sending shared plist of %d to [%d]\n", myrank, dofman->giveGlobalNumber(), iproc); pcbuff->write( dofman->giveGlobalNumber() ); this->giveDofManPartitions(idofman)->storeYourself(*pcbuff); } } pcbuff->write((int)PARMETISLB_END_DATA); return 1; }