bool PitchforkProblemInterface::computeJacobian(NOX::LAPACK::Matrix<double>& J, const NOX::LAPACK::Vector & x) { double h = 2.0 / static_cast<double>(n-1); J(0,0) = -2.0 + h*h*source_deriv(x(0)); J(0,1) = 2.0; J(n-1,n-1) = -2.0 + h*h*source_deriv(x(n-1)); J(n-1,n-2) = 2.0; for (int i=1; i<n-1; i++) { J(i,i-1) = 1.0; J(i,i+1) = 1.0; J(i,i) = -2.0 + h*h*source_deriv(x(i)); } return true; }
bool ChanProblemInterface::computeJacobian(NOX::LAPACK::Matrix<double>& J, const NOX::LAPACK::Vector & x) { J(0,0) = 1.0; J(n-1,n-1) = 1.0; for (int i=1; i<n-1; i++) { J(i,i-1) = (n-1)*(n-1); J(i,i+1) = J(i,i-1); J(i,i) = -2.*J(i,i-1) + source_param(alpha, scale)*source_deriv(x(i)); } return true; }
// Matrix and Residual Fills bool Pitchfork_FiniteElementProblem::evaluate(FillType f, const Epetra_Vector* soln, Epetra_Vector* tmp_rhs, Epetra_RowMatrix* tmp_matrix, double jac_coeff, double mass_coeff) { flag = f; // Set the incoming linear objects if (flag == F_ONLY) { rhs = tmp_rhs; } else if (flag == MATRIX_ONLY) { A = dynamic_cast<Epetra_CrsMatrix*> (tmp_matrix); assert(A != NULL); } else if (flag == ALL) { rhs = tmp_rhs; A = dynamic_cast<Epetra_CrsMatrix*> (tmp_matrix); assert(A != NULL); } else { std::cout << "ERROR: Pitchfork_FiniteElementProblem::fillMatrix() - FillType flag is broken" << std::endl; throw; } // Create the overlapped solution and position vectors Epetra_Vector u(*OverlapMap); Epetra_Vector x(*OverlapMap); // Export Solution to Overlap vector u.Import(*soln, *Importer, Insert); // Declare required variables int i,j,ierr; int OverlapNumMyElements = OverlapMap->NumMyElements(); int OverlapMinMyGID; if (MyPID==0) OverlapMinMyGID = StandardMap->MinMyGID(); else OverlapMinMyGID = StandardMap->MinMyGID()-1; int row, column; double jac; double xx[2]; double uu[2]; Basis basis; // Create the nodal coordinates double Length=2.0; double dx=Length/((double) NumGlobalElements-1); for (i=0; i < OverlapNumMyElements; i++) { x[i]=-1.0 + dx*((double) OverlapMinMyGID+i); } // Zero out the objects that will be filled if ((flag == MATRIX_ONLY) || (flag == ALL)) { i = A->PutScalar(0.0); assert(i == 0); } if ((flag == F_ONLY) || (flag == ALL)) { i = rhs->PutScalar(0.0); assert(i == 0); } // Loop Over # of Finite Elements on Processor for (int ne=0; ne < OverlapNumMyElements-1; ne++) { // Loop Over Gauss Points for(int gp=0; gp < 2; gp++) { // Get the solution and coordinates at the nodes xx[0]=x[ne]; xx[1]=x[ne+1]; uu[0]=u[ne]; uu[1]=u[ne+1]; // Calculate the basis function at the gauss point basis.getBasis(gp, xx, uu); // Loop over Nodes in Element for (i=0; i< 2; i++) { row=OverlapMap->GID(ne+i); //printf("Proc=%d GlobalRow=%d LocalRow=%d Owned=%d\n", // MyPID, row, ne+i,StandardMap.MyGID(row)); if (StandardMap->MyGID(row)) { if ((flag == F_ONLY) || (flag == ALL)) { (*rhs)[StandardMap->LID(OverlapMap->GID(ne+i))]+= +basis.wt*basis.dx *((-1.0/(basis.dx*basis.dx))*basis.duu* basis.dphide[i]-source_term(basis.uu)*basis.phi[i]); } } // Loop over Trial Functions if ((flag == MATRIX_ONLY) || (flag == ALL)) { for(j=0;j < 2; j++) { if (StandardMap->MyGID(row)) { column=OverlapMap->GID(ne+j); jac=jac_coeff*basis.wt*basis.dx* ((-1.0/(basis.dx*basis.dx))*basis.dphide[j]*basis.dphide[i] -source_deriv(basis.uu)*basis.phi[j]*basis.phi[i]) + mass_coeff*basis.wt*basis.dx*basis.phi[j]*basis.phi[i]; ierr=A->SumIntoGlobalValues(row, 1, &jac, &column); assert(ierr == 0); } } } } } } // Insert Boundary Conditions and modify Jacobian and function (F) // U(-1)=beta if (MyPID==0) { if ((flag == F_ONLY) || (flag == ALL)) (*rhs)[0]= (*soln)[0] - beta; if ((flag == MATRIX_ONLY) || (flag == ALL)) { column=0; jac=1.0*jac_coeff; A->ReplaceGlobalValues(0, 1, &jac, &column); column=1; jac=0.0*jac_coeff; A->ReplaceGlobalValues(0, 1, &jac, &column); } } // U(1)=beta if ( StandardMap->LID(StandardMap->MaxAllGID()) >= 0 ) { int lastDof = StandardMap->LID(StandardMap->MaxAllGID()); if ((flag == F_ONLY) || (flag == ALL)) (*rhs)[lastDof] = (*soln)[lastDof] - beta; if ((flag == MATRIX_ONLY) || (flag == ALL)) { int row = StandardMap->MaxAllGID(); column = row; jac=1.0*jac_coeff; A->ReplaceGlobalValues(row, 1, &jac, &column); column=row-1; jac=0.0*jac_coeff; A->ReplaceGlobalValues(row, 1, &jac, &column); } } // Sync up processors to be safe Comm->Barrier(); A->FillComplete(); return true; }