void NRSolver :: applyConstraintsToStiffness(SparseMtrx &k) { if ( this->smConstraintVersion == k.giveVersion() ) { return; } #ifdef __PETSC_MODULE PetscSparseMtrx *lhs = dynamic_cast< PetscSparseMtrx * >(&k); if ( lhs ) { Vec diag; PetscScalar *ptr; int eq; lhs->createVecGlobal(& diag); MatGetDiagonal(* lhs->giveMtrx(), diag); VecGetArray(diag, & ptr); for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { eq = prescribedEqs.at(i) - 1; MatSetValue(* ( lhs->giveMtrx() ), eq, eq, ptr [ eq ] * 1.e6, INSERT_VALUES); } MatAssemblyBegin(* lhs->giveMtrx(), MAT_FINAL_ASSEMBLY); MatAssemblyEnd(* lhs->giveMtrx(), MAT_FINAL_ASSEMBLY); VecRestoreArray(diag, & ptr); VecDestroy(& diag); if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k.giveVersion(); } return; } #endif // __PETSC_MODULE for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { k.at( prescribedEqs.at(i), prescribedEqs.at(i) ) *= 1.e6; } if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k.giveVersion(); } }
void TrustRegionSolver3::calcSmallestEigVal(double &oEigVal, FloatArray &oEigVec, PetscSparseMtrx &K) { PetscErrorCode ierr; ST st; double eig_rtol = 1.0e-3; int max_iter = 10000; int nroot = 1; if ( !epsInit ) { /* * Create eigensolver context */ #ifdef __PARALLEL_MODE MPI_Comm comm = engngModel->giveParallelComm(); #else MPI_Comm comm = PETSC_COMM_SELF; #endif ierr = EPSCreate(comm, & eps); checkPetscError(ierr); epsInit = true; } ierr = EPSSetOperators( eps, * K.giveMtrx(), NULL ); checkPetscError(ierr); ierr = EPSSetProblemType(eps, EPS_NHEP); checkPetscError(ierr); ierr = EPSGetST(eps, & st); checkPetscError(ierr); // ierr = STSetType(st, STCAYLEY); // ierr = STSetType(st, STSINVERT); ierr = STSetType(st, STSHIFT); checkPetscError(ierr); ierr = STSetMatStructure(st, SAME_NONZERO_PATTERN); checkPetscError(ierr); ierr = EPSSetTolerances(eps, ( PetscReal ) eig_rtol, max_iter); checkPetscError(ierr); ierr = EPSSetDimensions(eps, ( PetscInt ) nroot, PETSC_DECIDE, PETSC_DECIDE); checkPetscError(ierr); ierr = EPSSetWhichEigenpairs(eps, EPS_SMALLEST_REAL); checkPetscError(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Solve the eigensystem * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ EPSConvergedReason eig_reason; int eig_nconv, eig_nite; ierr = EPSSolve(eps); checkPetscError(ierr); ierr = EPSGetConvergedReason(eps, & eig_reason); checkPetscError(ierr); ierr = EPSGetIterationNumber(eps, & eig_nite); checkPetscError(ierr); // printf("SLEPcSolver::solve EPSConvergedReason: %d, number of iterations: %d\n", eig_reason, eig_nite); ierr = EPSGetConverged(eps, & eig_nconv); checkPetscError(ierr); double smallest_eig_val = 1.0e20; if ( eig_nconv > 0 ) { // printf("SLEPcSolver :: solveYourselfAt: Convergence reached for RTOL=%20.15f\n", eig_rtol); FloatArray eig_vals(nroot); PetscScalar kr; Vec Vr; K.createVecGlobal(& Vr); FloatArray Vr_loc; for ( int i = 0; i < eig_nconv && i < nroot; i++ ) { // PetscErrorCode EPSGetEigenpair(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi) ierr = EPSGetEigenpair(eps, i, & kr, PETSC_NULL, Vr, PETSC_NULL); checkPetscError(ierr); //Store the eigenvalue eig_vals(i) = kr; if(kr < smallest_eig_val) { smallest_eig_val = kr; K.scatterG2L(Vr, Vr_loc); oEigVec = Vr_loc; } } ierr = VecDestroy(& Vr); checkPetscError(ierr); } else { // OOFEM_ERROR("No converged eigenpairs.\n"); printf("Warning: No converged eigenpairs.\n"); smallest_eig_val = 1.0; } oEigVal = smallest_eig_val; }
void NRSolver :: applyConstraintsToLoadIncrement(int nite, const SparseMtrx *k, FloatArray &R, referenceLoadInputModeType rlm, TimeStep *atTime) { double factor = engngModel->giveDomain(1)->giveLoadTimeFunction(prescribedDisplacementLTF)->__at( atTime->giveTargetTime() ); if ( ( rlm == rlm_total ) && ( !atTime->isTheFirstStep() ) ) { //factor -= engngModel->giveDomain(1)->giveLoadTimeFunction(prescribedDisplacementLTF)-> // at(atTime->givePreviousStep()->giveTime()) ; factor -= engngModel->giveDomain(1)->giveLoadTimeFunction(prescribedDisplacementLTF)-> __at( atTime->giveTargetTime() - atTime->giveTimeIncrement() ); } if ( nite == 0 ) { #if 0 #ifdef __PETSC_MODULE if ( solverType == ST_Petsc ) { #ifdef __PARALLEL_MODE //Natural2LocalOrdering* n2lpm = engngModel->givePetscContext(1)->giveN2Lmap(); //IntArray* map = n2lpm->giveN2Lmap(); for ( i = 1; i <= prescribedEqs.giveSize(); i++ ) { eq = prescribedEqs.at(i); R.at(eq) = prescribedDofsValues.at(i) * factor; // local eq } return; #else // PETSC_SERIAL for ( i = 1; i <= numberOfPrescribedDofs; i++ ) { eq = prescribedEqs.at(i); R.at(eq) = prescribedDofsValues.at(i) * factor; } return; #endif } #endif #else #ifdef __PETSC_MODULE if ( solverType == ST_Petsc ) { if ( k->giveType() != SMT_PetscMtrx ) { OOFEM_ERROR("NRSolver :: applyConstraintsToStiffness: PetscSparseMtrx Expected"); } PetscSparseMtrx *lhs = ( PetscSparseMtrx * ) k; Vec diag; PetscScalar *ptr; engngModel->givePetscContext(this->domain->giveNumber())->createVecGlobal(& diag); MatGetDiagonal(* lhs->giveMtrx(), diag); VecGetArray(diag, & ptr); for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { int eq = prescribedEqs.at(i) - 1; R.at(eq + 1) = ptr [ eq ] * prescribedDofsValues.at(i) * factor; } VecRestoreArray(diag, & ptr); VecDestroy(&diag); return; } #endif #endif for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { int eq = prescribedEqs.at(i); R.at(eq) = k->at(eq, eq) * prescribedDofsValues.at(i) * factor; } } else { for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { R.at( prescribedEqs.at(i) ) = 0.0; } } }
void NRSolver :: applyConstraintsToStiffness(SparseMtrx *k) { if ( this->smConstraintVersion == k->giveVersion() ) { return; } #if 0 #ifdef __PETSC_MODULE if ( solverType == ST_Petsc ) { PetscScalar diagVal = 1.0; if ( k->giveType() != SMT_PetscMtrx ) { OOFEM_ERROR("NRSolver :: applyConstraintsToStiffness: PetscSparseMtrx Expected"); } PetscSparseMtrx *lhs = ( PetscSparseMtrx * ) k; if ( !prescribedEgsIS_defined ) { IntArray eqs; #ifdef __PARALLEL_MODE Natural2GlobalOrdering *n2lpm = engngModel->givePetscContext(1)->giveN2Gmap(); int s = prescribedEqs.giveSize(); eqs.resize(s); for ( int i = 1; i <= s; i++ ) { eqs.at(i) = n2lpm->giveNewEq( prescribedEqs.at(i) ); } ISCreateGeneral(PETSC_COMM_WORLD, s, eqs.givePointer(), & prescribedEgsIS); //ISView(prescribedEgsIS,PETSC_VIEWER_STDOUT_WORLD); #else eqs.resize(numberOfPrescribedDofs); for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { eqs.at(i) = prescribedEqs.at(i) - 1; } ISCreateGeneral(PETSC_COMM_SELF, numberOfPrescribedDofs, eqs.givePointer(), & prescribedEgsIS); //ISView(prescribedEgsIS,PETSC_VIEWER_STDOUT_SELF); #endif prescribedEgsIS_defined = true; } //MatView(*(lhs->giveMtrx()),PETSC_VIEWER_STDOUT_WORLD); MatZeroRows(* ( lhs->giveMtrx() ), prescribedEgsIS, & diagVal); //MatView(*(lhs->giveMtrx()),PETSC_VIEWER_STDOUT_WORLD); if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k->giveVersion(); } return; } #endif // __PETSC_MODULE #else #ifdef __PETSC_MODULE if ( solverType == ST_Petsc ) { if ( k->giveType() != SMT_PetscMtrx ) { OOFEM_ERROR("NRSolver :: applyConstraintsToStiffness: PetscSparseMtrx Expected"); } PetscSparseMtrx *lhs = ( PetscSparseMtrx * ) k; Vec diag; PetscScalar *ptr; int eq; PetscContext *parallel_context = engngModel->givePetscContext(this->domain->giveNumber()); parallel_context->createVecGlobal(& diag); MatGetDiagonal(* lhs->giveMtrx(), diag); VecGetArray(diag, & ptr); for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { eq = prescribedEqs.at(i) - 1; MatSetValue(* ( lhs->giveMtrx() ), eq, eq, ptr [ eq ] * 1.e6, INSERT_VALUES); } MatAssemblyBegin(* lhs->giveMtrx(), MAT_FINAL_ASSEMBLY); MatAssemblyEnd(* lhs->giveMtrx(), MAT_FINAL_ASSEMBLY); VecRestoreArray(diag, & ptr); VecDestroy(&diag); if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k->giveVersion(); } return; } #endif // __PETSC_MODULE #endif for ( int i = 1; i <= numberOfPrescribedDofs; i++ ) { k->at( prescribedEqs.at(i), prescribedEqs.at(i) ) *= 1.e6; } if ( numberOfPrescribedDofs ) { this->smConstraintVersion = k->giveVersion(); } }