quatd vec4d_to_quat(vec4d v) { return quatd_make(vec_x(v), vec_y(v), vec_z(v), vec_w(v)); }
// PETSc 3.3.0+ PetscErrorCode dampedCheck(SNESLineSearch /* linesearch */, Vec x, Vec y, Vec w, PetscBool * /*changed_y*/, PetscBool * changed_w, void *lsctx) #endif { // From SNESLineSearchSetPostCheck docs: // + x - old solution vector // . y - search direction vector // . w - new solution vector w = x-y // . changed_y - indicates that the line search changed y // . changed_w - indicates that the line search changed w int ierr = 0; Real damping = 1.0; FEProblem & problem = *static_cast<FEProblem *>(lsctx); TransientNonlinearImplicitSystem & system = problem.getNonlinearSystem().sys(); // The whole deal here is that we need ghosted versions of vectors y and w (they are parallel, but not ghosted). // So to do that I'm going to duplicate current_local_solution (which has the ghosting we want). // Then stuff values into the duplicates // Then "close()" the vectors which updates their ghosted vaulues. { // cls is a PetscVector wrapper around the Vec in current_local_solution PetscVector<Number> cls(static_cast<PetscVector<Number> *>(system.current_local_solution.get())->vec(), problem.comm()); // Create new NumericVectors with the right ghosting - note: these will be destroyed // when this function exits, so nobody better hold pointers to them any more! UniquePtr<NumericVector<Number> > ghosted_y_aptr( cls.zero_clone() ); UniquePtr<NumericVector<Number> > ghosted_w_aptr( cls.zero_clone() ); // Create PetscVector wrappers around the Vecs. PetscVector<Number> ghosted_y( static_cast<PetscVector<Number> *>(ghosted_y_aptr.get())->vec(), problem.comm()); PetscVector<Number> ghosted_w( static_cast<PetscVector<Number> *>(ghosted_w_aptr.get())->vec(), problem.comm()); ierr = VecCopy(y, ghosted_y.vec()); CHKERRABORT(problem.comm().get(),ierr); ierr = VecCopy(w, ghosted_w.vec()); CHKERRABORT(problem.comm().get(),ierr); ghosted_y.close(); ghosted_w.close(); damping = problem.computeDamping(ghosted_w, ghosted_y); if (damping < 1.0) { //recalculate w=-damping*y + x ierr = VecWAXPY(w, -damping, y, x); CHKERRABORT(problem.comm().get(),ierr); *changed_w = PETSC_TRUE; } if (problem.shouldUpdateSolution()) { //Update the ghosted copy of w if (*changed_w == PETSC_TRUE) { ierr = VecCopy(w, ghosted_w.vec()); CHKERRABORT(problem.comm().get(),ierr); ghosted_w.close(); } //Create vector to directly modify w PetscVector<Number> vec_w(w, problem.comm()); bool updatedSolution = problem.updateSolution(vec_w, ghosted_w); if (updatedSolution) *changed_w = PETSC_TRUE; } } return ierr; }
quatf vec4f_to_quat(vec4f v) { return quatf_make(vec_x(v), vec_y(v), vec_z(v), vec_w(v)); }