void BilinearFormUtility::computeStiffnessMatrixForCell(FieldContainer<double> &stiffness, Teuchos::RCP<Mesh> mesh, int cellID) { Teuchos::RCP<DofOrdering> trialOrder = mesh->getElement(cellID)->elementType()->trialOrderPtr; Teuchos::RCP<DofOrdering> testOrder = mesh->getElement(cellID)->elementType()->testOrderPtr; shards::CellTopology cellTopo = *(mesh->getElement(cellID)->elementType()->cellTopoPtr); FieldContainer<double> physicalCellNodes = mesh->physicalCellNodesForCell(cellID); FieldContainer<double> cellSideParities = mesh->cellSideParitiesForCell(cellID); int numCells = 1; stiffness.resize(numCells,testOrder->totalDofs(),trialOrder->totalDofs()); computeStiffnessMatrix(stiffness,mesh->bilinearForm(),trialOrder,testOrder,cellTopo,physicalCellNodes,cellSideParities); }
void frameSolver2d::solve() { #if defined(HAVE_PETSC) linearSystemPETSc<double> *lsys = new linearSystemPETSc<double>; #elif defined(HAVE_GMM) linearSystemCSRGmm<double> *lsys = new linearSystemCSRGmm<double>; lsys->setGmres(1); lsys->setNoisy(1); #else linearSystemFull<double> *lsys = new linearSystemFull<double>; #endif if(pAssembler) delete pAssembler; pAssembler = new dofManager<double>(lsys); // fix dofs and create free ones createDofs(); // force vector std::vector<std::pair<GVertex *, std::vector<double> > >::iterator it = _nodalForces.begin(); for(; it != _nodalForces.end(); ++it) { MVertex *v = it->first->mesh_vertices[0]; const std::vector<double> &F = it->second; Dof DOFX(v->getNum(), 0); Dof DOFY(v->getNum(), 1); pAssembler->assemble(DOFX, F[0]); pAssembler->assemble(DOFY, F[1]); } // stifness matrix for(std::size_t i = 0; i < _beams.size(); i++) { fullMatrix<double> K(6, 6); computeStiffnessMatrix(i, K); _beams[i]._stiffness = K; MVertex *v0 = _beams[i]._element->getVertex(0); MVertex *v1 = _beams[i]._element->getVertex(1); Dof theta0(v0->getNum(), Dof::createTypeWithTwoInts(2, _beams[i]._rotationTags[0])); Dof theta1(v1->getNum(), Dof::createTypeWithTwoInts(2, _beams[i]._rotationTags[1])); Dof U0(v0->getNum(), 0); Dof U1(v1->getNum(), 0); Dof V0(v0->getNum(), 1); Dof V1(v1->getNum(), 1); Dof DOFS[6] = {U0, V0, theta0, U1, V1, theta1}; for(int j = 0; j < 6; j++) { for(int k = 0; k < 6; k++) { pAssembler->assemble(DOFS[j], DOFS[k], K(j, k)); } } } lsys->systemSolve(); // save the solution for(std::size_t i = 0; i < _beams.size(); i++) { MVertex *v0 = _beams[i]._element->getVertex(0); MVertex *v1 = _beams[i]._element->getVertex(1); Dof theta0(v0->getNum(), Dof::createTypeWithTwoInts(2, _beams[i]._rotationTags[0])); Dof theta1(v1->getNum(), Dof::createTypeWithTwoInts(2, _beams[i]._rotationTags[1])); Dof U0(v0->getNum(), 0); Dof U1(v1->getNum(), 0); Dof V0(v0->getNum(), 1); Dof V1(v1->getNum(), 1); Dof DOFS[6] = {U0, V0, theta0, U1, V1, theta1}; for(int j = 0; j < 6; j++) { pAssembler->getDofValue(DOFS[j], _beams[i]._displacement[j]); } } delete lsys; delete pAssembler; }