int SPRNodalRecoveryModel :: unpackSharedDofManData(parallelStruct *s, ProcessCommunicator &processComm) { int result = 1; int i, j, eq, indx, size, flag; IntArray const *toRecvMap = processComm.giveToRecvMap(); ProcessCommunicatorBuff *pcbuff = processComm.giveProcessCommunicatorBuff(); double value; size = toRecvMap->giveSize(); for ( i = 1; i <= size; i++ ) { indx = s->regionNodalNumbers->at( toRecvMap->at(i) ); // toRecvMap contains all shared dofmans with remote partition // one has to check, if particular shared node received contribution is available for given region result &= pcbuff->read(flag); if ( flag ) { // "1" to indicates that for given shared node this is a valid contribution eq = ( indx - 1 ) * s->regionValSize; for ( j = 1; j <= s->regionValSize; j++ ) { result &= pcbuff->read(value); if ( indx ) { s->dofManValues->at(eq + j) += value; } } if ( indx ) { s->dofManPatchCount->at(indx)++; } } } return result; }
int NodalAveragingRecoveryModel :: unpackSharedDofManData(parallelStruct *s, ProcessCommunicator &processComm) { int result = 1; int size, flag, intValue; IntArray const *toRecvMap = processComm.giveToRecvMap(); ProcessCommunicatorBuff *pcbuff = processComm.giveProcessCommunicatorBuff(); double value; size = toRecvMap->giveSize(); for ( int i = 1; i <= size; i++ ) { int indx = s->regionNodalNumbers->at( toRecvMap->at(i) ); // toRecvMap contains all shared dofmans with remote partition // one has to check, if particular shared node received contribution is available for given region result &= pcbuff->read(flag); if ( flag ) { // "1" to indicates that for given shared node this is a valid contribution result &= pcbuff->read(intValue); // now check if we have a valid number if ( indx ) { s->regionDofMansConnectivity->at(indx) += intValue; } int eq = ( indx - 1 ) * s->regionValSize; for ( int j = 1; j <= s->regionValSize; j++ ) { result &= pcbuff->read(value); if ( indx ) { s->lhs->at(eq + j) += value; } } } } return result; }
int ParmetisLoadBalancer :: unpackSharedDmanPartitions(ProcessCommunicator &pc) { int myrank = domain->giveEngngModel()->giveRank(); int iproc = pc.giveRank(); int _globnum, _locnum; IntArray _partitions; if ( iproc == myrank ) { return 1; // skip local partition } // query process communicator to use ProcessCommunicatorBuff *pcbuff = pc.giveProcessCommunicatorBuff(); // init domain global2local map domain->initGlobalDofManMap(); pcbuff->read(_globnum); // unpack dofman data while ( _globnum != PARMETISLB_END_DATA ) { _partitions.restoreYourself(*pcbuff); if ( ( _locnum = domain->dofmanGlobal2Local(_globnum) ) ) { this->addSharedDofmanPartitions(_locnum, _partitions); } else { OOFEM_ERROR("internal error, unknown global dofman %d", _globnum); } /* * fprintf (stderr,"[%d] Received shared plist of %d ", myrank, _globnum); * for (int _i=1; _i<=dofManPartitions[_locnum-1].giveSize(); _i++) * fprintf (stderr,"%d ", dofManPartitions[_locnum-1].at(_i)); * fprintf (stderr,"\n"); */ pcbuff->read(_globnum); } return 1; }