int NodalAveragingRecoveryModel :: unpackSharedDofManData(parallelStruct *s, ProcessCommunicator &processComm) { int result = 1; int i, j, eq, indx, size, flag, intValue; 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->unpackInt(flag); if ( flag ) { // "1" to indicates that for given shared node this is a valid contribution result &= pcbuff->unpackInt(intValue); // now check if we have a valid number if ( indx ) { s->regionDofMansConnectivity->at(indx) += intValue; } eq = ( indx - 1 ) * s->regionValSize; for ( j = 1; j <= s->regionValSize; j++ ) { result &= pcbuff->unpackDouble(value); if ( indx ) { s->lhs->at(eq + j) += value; } } } } return result; }
int StructuralEngngModel :: unpackDofManagers(FloatArray *dest, ProcessCommunicator &processComm, bool prescribedEquations) { int result = 1; int i, size; int j, ndofs, eqNum; Domain *domain = this->giveDomain(1); dofManagerParallelMode dofmanmode; IntArray const *toRecvMap = processComm.giveToRecvMap(); ProcessCommunicatorBuff *pcbuff = processComm.giveProcessCommunicatorBuff(); DofManager *dman; Dof *jdof; double value; size = toRecvMap->giveSize(); for ( i = 1; i <= size; i++ ) { dman = domain->giveDofManager( toRecvMap->at(i) ); ndofs = dman->giveNumberOfDofs(); dofmanmode = dman->giveParallelMode(); for ( j = 1; j <= ndofs; j++ ) { jdof = dman->giveDof(j); if ( prescribedEquations ) { eqNum = jdof->__givePrescribedEquationNumber(); } else { eqNum = jdof->__giveEquationNumber(); } if ( jdof->isPrimaryDof() && eqNum ) { result &= pcbuff->unpackDouble(value); if ( dofmanmode == DofManager_shared ) { dest->at(eqNum) += value; } else if ( dofmanmode == DofManager_remote ) { dest->at(eqNum) = value; } else { _error("unpackReactions: unknown dof namager parallel mode"); } } } } return result; }
int StructuralEngngModel :: unpackRemoteElementData(ProcessCommunicator &processComm) { int result = 1; int i, size; IntArray const *toRecvMap = processComm.giveToRecvMap(); CommunicationBuffer *recv_buff = processComm.giveProcessCommunicatorBuff()->giveRecvBuff(); Element *element; Domain *domain = this->giveDomain(1); size = toRecvMap->giveSize(); for ( i = 1; i <= size; i++ ) { element = domain->giveElement( toRecvMap->at(i) ); if ( element->giveParallelMode() == Element_remote ) { result &= element->unpackAndUpdateUnknowns( * recv_buff, this->giveCurrentStep() ); } else { _error("unpackRemoteElementData: element is not remote"); } } return result; }