int LOCATest(MFNVector u, void *d, MFErrorHandler err) { LOCANVectorData* v_data = (LOCANVectorData *)MFNVectorGetData(u,err); LOCAData* data = (LOCAData*) d; list<ParamData>::iterator it = data->paramData->begin(); for (unsigned int i=0; i<data->paramData->size(); i++) { if (v_data->u_ptr->getScalar(i) < it->minValue) return 0; if (v_data->u_ptr->getScalar(i) > it->maxValue) return 0; ++it; } if (v_data->u_ptr->getXVec()->norm(NOX::Abstract::Vector::MaxNorm) > data->solutionMax) return 0; return 1; }
double *MFNV_CStar(MFNVector thisVector, MFErrorHandler e) { static char RoutineName[]={"MFNV_CStar"}; struct MFDenseNVectorData *u; #ifdef MFNOCONFIDENCE if(thisVector==NULL) { sprintf(MFNVectorErrorMsg,"Pointer to Vector (argument 1) is NULL"); MFSetError(e,4,RoutineName,MFNVectorErrorMsg,__LINE__,__FILE__); return NULL; } if(strcmp(MFNVGetId(thisVector,e),"DENSE")) { sprintf(MFNVectorErrorMsg,"Trying to get dense arrays from non-dense Vector type \"%s\"",MFNVGetId(thisVector,e)); MFSetError(e,12,RoutineName,MFNVectorErrorMsg,__LINE__,__FILE__); return NULL; } #endif u=(struct MFDenseNVectorData*)MFNVectorGetData(thisVector,e); return u->data; }
int MFLOCAProjectToDraw(MFNVector u, double *x, void *d, MFErrorHandler err) { LOCAData* data = (LOCAData *)d; if(x==(double*)NULL) return data->grp->projectToDrawDimension(); LOCANVectorData* v_data = (LOCANVectorData *)MFNVectorGetData(u, err); data->grp->projectToDraw(*(v_data->u_ptr), x); return 0; }
double MFScaleLOCA(int n,int k,MFNVector u,MFNKMatrix Phi,void *d, MFErrorHandler err) { LOCAData* data = (LOCAData *)d; if (data->radius < 0.0) { data->radius = 0.0; data->minRadius = 0.0; data->maxRadius = 0.0; std::list<ParamData>::iterator it = data->paramData->begin(); for (int i=0; i<k; i++) { double dpidsj = 0.0; for (int j=0; j<k; j++) { MFNVector tmp = MFMColumn(Phi,j, err); LOCANVectorData* tmp2_data = (LOCANVectorData *) MFNVectorGetData(tmp, err); dpidsj += fabs(tmp2_data->u_ptr->getScalar(i)); MFFreeNVector(tmp, err); } data->radius += it->initialStepSize / dpidsj; data->minRadius += it->minStepSize / dpidsj; data->maxRadius += it->maxStepSize / dpidsj; it++; } data->radius /= (double) k; data->minRadius /= (double) k; data->maxRadius /= (double) k; } else { NOX::StatusTest::StatusType status = data->solver->getStatus(); if (status != NOX::StatusTest::Converged) { data->radius *= 0.7; if (data->radius < data->minRadius) data->globalData->locaErrorCheck->throwError( "MFScaleLOCA()", "Reached minimum radius!"); } else { double numNonlinearSteps = static_cast<double>(data->solver->getNumIterations()); double factor = (data->maxNonlinearIterations - numNonlinearSteps) / (data->maxNonlinearIterations); data->radius *= (1.0 + data->aggressiveness * factor * factor); if (data->radius > data->maxRadius) data->radius = data->maxRadius; } } data->globalData->locaUtils->out() << "radius = " << data->radius << std::endl; return data->radius; }
int MFTangentLOCA(int n,int k,MFNVector vu,MFNKMatrix mPhi,void *d, MFErrorHandler err) { LOCAData* data = (LOCAData *)d; LOCANVectorData* u0_data = (LOCANVectorData *) MFNVectorGetData(vu, err); data->grp->setX(*(u0_data->u_ptr)); data->grp->computePredictor(); const LOCA::MultiContinuation::ExtendedMultiVector& pred = data->grp->getPredictorTangent(); for (int i=0; i<k; i++) { Teuchos::RCP<LMCEV> t = Teuchos::rcp_dynamic_cast<LMCEV>(pred[i].clone()); MFNVector tmp = MFCreateLOCANVectorWithData(t,err); MFMSetColumn(mPhi, i, tmp, err); MFFreeNVector(tmp, err); } MFGramSchmidt(data->space,mPhi, err); return 1; }
int MFProjectLOCA(int n,int k,MFNVector vu0,MFNKMatrix mPhi,MFNVector vu, void *d,int *index, MFErrorHandler err) { static int stepNumber = 1; int i; *index = 1; LOCAData* data = (LOCAData *)d; for (i=0; i<k; i++) { MFNVector tmp = MFMColumn(mPhi,i, err); LOCANVectorData* tmp2_data = (LOCANVectorData *) MFNVectorGetData(tmp, err); data->grp->setPredictorTangentDirection(*(tmp2_data->u_ptr), i); MFFreeNVector(tmp, err); } LOCANVectorData* u0_data = (LOCANVectorData *) MFNVectorGetData(vu0, err); data->grp->setPrevX(*(u0_data->u_ptr)); data->grp->setX(*(u0_data->u_ptr)); for (i=0; i<k; i++) { data->grp->setStepSize(0.0, i); } if (data->globalData->locaUtils->isPrintType(NOX::Utils::StepperIteration)) { data->globalData->locaUtils->out() << "\n" << data->globalData->locaUtils->fill(72, '~') << "\n"; data->globalData->locaUtils->out() << "Start of Continuation Step " << stepNumber <<" : " << std::endl; std::list<ParamData>::iterator it = data->paramData->begin(); for (i=0; i<k; i++) { data->globalData->locaUtils->out() << "\tParameter: " << it->name << " = " << data->globalData->locaUtils->sciformat(data->grp->getContinuationParameter(i)) << std::endl; it++; } data->globalData->locaUtils->out() << data->globalData->locaUtils->fill(72, '~') << "\n" << std::endl; } data->grp->preProcessContinuationStep(LOCA::Abstract::Iterator::Successful); data->grp->computeF(); data->solver->reset(data->grp->getX()); NOX::StatusTest::StatusType status = data->solver->solve(); if (status != NOX::StatusTest::Converged) { if (data->globalData->locaUtils->isPrintType(NOX::Utils::StepperIteration)) { data->globalData->locaUtils->out() << std::endl << data->globalData->locaUtils->fill(72, '~') << std::endl; data->globalData->locaUtils->out() << "Continuation Step Number " << stepNumber << " experienced a convergence failure in\n" << "the nonlinear solver after "<< data->solver->getNumIterations() <<" Iterations\n"; data->globalData->locaUtils->out() << "Value of continuation parameters at failed step:" << std::endl; std::list<ParamData>::iterator it = data->paramData->begin(); for (i=0; i<k; i++) { data->globalData->locaUtils->out() << "\tParameter: " << it->name << " = " << data->globalData->locaUtils->sciformat(data->grp->getContinuationParameter(i)) << std::endl; it++; } data->globalData->locaUtils->out() << data->globalData->locaUtils->fill(72, '~') << std::endl; } data->grp->postProcessContinuationStep(LOCA::Abstract::Iterator::Unsuccessful); return 0; } else { LOCANVectorData* u_data = (LOCANVectorData *) MFNVectorGetData(vu, err); *(Teuchos::rcp_dynamic_cast<NOX::Abstract::Group>(data->grp)) = data->solver->getSolutionGroup(); *(u_data->u_ptr) = data->grp->getX(); /* overloaded deep copy */ data->grp->postProcessContinuationStep(LOCA::Abstract::Iterator::Successful); if (data->globalData->locaUtils->isPrintType(NOX::Utils::StepperIteration)) { data->globalData->locaUtils->out() << "\n" << data->globalData->locaUtils->fill(72, '~') << "\n"; data->globalData->locaUtils->out() << "End of Continuation Step " << stepNumber << " : " << std::endl; std::list<ParamData>::iterator it = data->paramData->begin(); for (i=0; i<k; i++) { data->globalData->locaUtils->out() << "\tParameter: " << it->name << " = " << data->globalData->locaUtils->sciformat(data->grp->getContinuationParameter(i)) << std::endl; it++; } data->globalData->locaUtils->out() << "--> Step Converged in " << data->solver->getNumIterations() <<" Nonlinear Solver Iterations!\n"; data->globalData->locaUtils->out() << data->globalData->locaUtils->fill(72, '~') << "\n" << std::endl; } ++stepNumber; return 1; } }