void BandArpackSolver::myMv(int n, double *v, double *result) { Vector x(v, n); Vector y(result,n); y.Zero(); AnalysisModel *theAnalysisModel = theSOE->theModel; // loop over the FE_Elements FE_Element *elePtr; FE_EleIter &theEles = theAnalysisModel->getFEs(); while((elePtr = theEles()) != 0) { const Vector &b = elePtr->getM_Force(x, 1.0); y.Assemble(b, elePtr->getID(), 1.0); } // loop over the DOF_Groups DOF_Group *dofPtr; DOF_GrpIter &theDofs = theAnalysisModel->getDOFs(); Integrator *theIntegrator = 0; while ((dofPtr = theDofs()) != 0) { const Vector &a = dofPtr->getM_Force(x,1.0); y.Assemble(a,dofPtr->getID(),1.0); } }
int IncrementalIntegrator::doMv(const Vector &v, Vector &res) { int n = v.Size(); if (isDiagonal == true) { for (int i=0; i<n; i++) res[i] = diagMass[i]*v[i]; return 0; } res.Zero(); // loop over the FE_Elements FE_Element *elePtr; FE_EleIter &theEles = theAnalysisModel->getFEs(); while((elePtr = theEles()) != 0) { const Vector &b = elePtr->getM_Force(v, 1.0); res.Assemble(b, elePtr->getID(), 1.0); } // loop over the DOF_Groups DOF_Group *dofPtr; DOF_GrpIter &theDofs = theAnalysisModel->getDOFs(); while ((dofPtr = theDofs()) != 0) { const Vector &a = dofPtr->getM_Force(v, 1.0); res.Assemble(a, dofPtr->getID(), 1.0); } return 0; }
int RitzIntegrator::formB() { if (theAnalysisModel == 0 || theSOE == 0) { opserr << "WARNING RitzIntegrator::formB -"; opserr << " no AnalysisModel or EigenSOE has been set\n"; return -1; } // the loops to form and add the tangents are broken into two for // efficiency when performing parallel computations // loop through the FE_Elements getting them to form the tangent // FE_EleIter &theEles1 = theAnalysisModel->getFEs(); FE_Element *elePtr; theSOE->zeroB(); // while((elePtr = theEles1()) != 0) // elePtr->formTangent(this); // loop through the FE_Elements getting them to add the tangent int result = 0; FE_EleIter &theEles2 = theAnalysisModel->getFEs(); while((elePtr = theEles2()) != 0) { if (theSOE->addB(elePtr->getResidual(this), elePtr->getID()) < 0) { opserr << "WARNING RitzIntegrator::formB -"; opserr << " failed in addB for ID " << elePtr->getID(); result = -2; } } DOF_Group *dofPtr; DOF_GrpIter &theDofs = theAnalysisModel->getDOFs(); while((dofPtr = theDofs()) != 0) { // dofPtr->formTangent(this); if (theSOE->addB(dofPtr->getM_Force(theSOE->getX(),1.0),dofPtr->getID()) < 0) { opserr << "WARNING RitzIntegrator::formB -"; opserr << " failed in addB for ID " << dofPtr->getID(); result = -3; } } return result; }
void ArpackSolver::myMv(int n, double *v, double *result) { Vector x(v, n); Vector y(result,n); bool mDiagonal = theArpackSOE->mDiagonal; if (mDiagonal == true) { int Msize = theArpackSOE->Msize; double *M = theArpackSOE->M; /* for output DataFileStream dataStream("M.txt"); dataStream.open(); for (int i=0; i<n; i++) dataStream << M[i] << endln; dataStream.close(); */ if (n <= Msize) { for (int i=0; i<n; i++) result[i] = M[i]*v[i]; } else { opserr << "ArpackSolver::myMv() n > Msize!\n"; return; } } else { y.Zero(); AnalysisModel *theAnalysisModel = theArpackSOE->theModel; // loop over the FE_Elements FE_Element *elePtr; FE_EleIter &theEles = theAnalysisModel->getFEs(); while((elePtr = theEles()) != 0) { const Vector &b = elePtr->getM_Force(x, 1.0); y.Assemble(b, elePtr->getID(), 1.0); } // loop over the DOF_Groups DOF_Group *dofPtr; DOF_GrpIter &theDofs = theAnalysisModel->getDOFs(); while ((dofPtr = theDofs()) != 0) { const Vector &a = dofPtr->getM_Force(x,1.0); y.Assemble(a, dofPtr->getID(), 1.0); } } // if paallel we have to merge the results int processID = theArpackSOE->processID; if (processID != -1) { Channel **theChannels = theArpackSOE->theChannels; int numChannels = theArpackSOE->numChannels; if (processID != 0) { theChannels[0]->sendVector(0, 0, y); theChannels[0]->recvVector(0, 0, y); } else { Vector other(workArea, n); // recv contribution from remote & add for (int i=0; i<numChannels; i++) { theChannels[i]->recvVector(0,0,other); y += other; } // send result back for (int i=0; i<numChannels; i++) { theChannels[i]->sendVector(0,0,y); } } } }