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; }
void MFGramSchmidtReplace(MFNSpace space,MFNKMatrix A,MFNVector phi0, MFNVector phi1,MFErrorHandler e) { static char RoutineName[]={"MFGramSchmidtReplace"}; double *a; int i,j,n; int k; MFNVector u; MFNVector v; MFNVector w; double inner; int zero; double *B=NULL; int sign0,sign1; int verbose=0; /* Remove vector phi0 from the basis, and replaces it with the vector phi1 */ if(verbose){printf("%s\n",RoutineName);fflush(stdout);} n=MFNKMatrixN(A,e); k=MFNKMatrixK(A,e); B=(double*)malloc(k*k*sizeof(double)); #ifndef MFNOSAFETYNET if(B==NULL) { sprintf(MFNKMatrixErrorMsg,"Out of memory, trying to allocate %d bytes",k*k*sizeof(double)); MFSetError(e,12,RoutineName,MFNKMatrixErrorMsg,__LINE__,__FILE__); MFErrorHandlerOutOfMemory(e); return; } #endif if(verbose) { printf("Remove vector phi0 from the basis, and replace it with the vector phi1\n");fflush(stdout); printf(" phi0=0x%8.8x ",phi0);MFPrintNVector(stdout,phi0,e);printf("\n");fflush(stdout); printf(" phi1=0x%8.8x ",phi0);MFPrintNVector(stdout,phi1,e);printf("\n");fflush(stdout); } for(i=0;i<k;i++) { u=MFMColumn(A,i,e); for(j=0;j<k;j++) { v=MFMColumn(A,j,e); B[i+k*j]=MFNSpaceInner(space,u,v,e); MFFreeNVector(v,e); } MFFreeNVector(u,e); } sign0=MFAtlasDet(k,B,e)>0; u=MFMColumn(A,0,e); w=MFCloneNVector(u,e); MFFreeNVector(u,e); zero=-1; for(i=-1;i<k;i++) { if(i>-1)u=MFMColumn(A,i,e); else{u=phi0;MFRefNVector(phi0,e);} inner=MFNSpaceInner(space,u,u,e); #ifdef MFALLOWVERBOSE if(verbose){printf("u_%d\n",i);MFPrintNVector(stdout,u,e);printf("\n");fflush(stdout); printf("<u_%d,u_%d>=%lf\n",i,i,inner);fflush(stdout);} #endif if(inner>1.e-7) { inner=1./sqrt(inner); MFNSpaceScale(space,inner,u,u,e); #ifdef MFALLOWVERBOSE if(verbose){printf("normalized u_%d\n",i);MFPrintNVector(stdout,u,e);printf("\n");fflush(stdout);} #endif }else{ zero=i; #ifdef MFALLOWVERBOSE if(verbose){printf("zero vector u_%d\n",i);MFPrintNVector(stdout,u,e);printf("\n");fflush(stdout);} #endif } for(j=i+1;j<k;j++) { v=MFMColumn(A,j,e); #ifdef MFALLOWVERBOSE if(verbose){printf("v=u_%d\n",j);MFPrintNVector(stdout,v,e);printf("\n");fflush(stdout);} #endif inner=MFNSpaceInner(space,u,v,e); #ifdef MFALLOWVERBOSE if(verbose){printf("inner=<u_%d,u_%d>=%lf\n",i,j,inner);fflush(stdout);} #endif MFNSpaceScale(space,inner,u,w,e); #ifdef MFALLOWVERBOSE if(verbose){printf("w=<u_%d,u_%d>u_%d\n",j,i,i);MFPrintNVector(stdout,w,e);printf("\n");fflush(stdout);} #endif MFNVDiff(v,w,v,e); #ifdef MFALLOWVERBOSE if(verbose){printf("v-w=u_%d-<u_%d,u_%d>u_%d\n",j,j,i,i);MFPrintNVector(stdout,v,e);printf("\n");fflush(stdout);} #endif MFFreeNVector(v,e); } MFFreeNVector(u,e); #ifdef MFALLOWVERBOSE if(verbose){printf("\n");fflush(stdout);} #endif } MFFreeNVector(w,e); if(verbose){printf("done orthnormalizing, line %d, routine %s\n",__LINE__,RoutineName);fflush(stdout);} if(verbose){printf("Delete the zero column (move it to the first position) zero=%d, line %d, routine %s\n",zero,__LINE__,RoutineName);fflush(stdout);} if(zero>1) { for(i=zero;i>-1;i--) { u=MFMColumn(A,i-1,e); v=MFMColumn(A,i,e); MFMSetColumn(A,i,u,e); MFFreeNVector(u,e); MFFreeNVector(v,e); } if(verbose){printf("done removing the zero column line %d, routine %s\n",__LINE__,RoutineName);fflush(stdout);} } /* Replace the zero column with phi1 */ u=MFMColumn(A,0,e); MFFreeNVector(u,e); MFMSetColumn(A,0,phi1,e); if(verbose){printf("Gram-Schmidt on new basis line %d, routine %s\n",__LINE__,RoutineName);fflush(stdout);} MFGramSchmidt(space,A,e); if(verbose){printf("done Gram-Schmidt on new basis line %d, routine %s\n",__LINE__,RoutineName);fflush(stdout);} for(i=0;i<k;i++) { u=MFMColumn(A,i,e); for(j=0;j<k;j++) { v=MFMColumn(A,j,e); B[i+k*j]=MFNSpaceInner(space,u,v,e); MFFreeNVector(v,e); } MFFreeNVector(u,e); } sign1=MFAtlasDet(k,B,e)>0; if(verbose){printf("make Det the same line %d, routine %s\n",__LINE__,RoutineName);fflush(stdout);} if(sign0&&!sign1||sign1&&!sign0) { u=MFMColumn(A,0,e); MFNSpaceScale(space,-1.,u,u,e); MFFreeNVector(u,e); } free(B); if(verbose){printf("done %s\n",RoutineName);fflush(stdout);} return; }
void MFNKMProjectTangentForBranchSwitch(MFNSpace space, MFNKMatrix A,MFNVector phi,MFNKMatrix Phi,MFErrorHandler e) { static char RoutineName[]={"MFNKMProjectTangentForBranchSwitch"}; int i,j; int k,m; MFNVector u,w; double *p; double pmax; MFNVector pi,pj; int verbose=0; #ifdef MFALLOWVERBOSE if(verbose){printf("%s\n",RoutineName);fflush(stdout); printf(" A=");MFPrintNKMatrix(stdout,A,e);fflush(stdout); printf(" phi=");MFPrintNVector(stdout,phi,e);printf("\n");fflush(stdout);} #endif k=MFNKMatrixK(A,e); p=(double*)malloc(k*sizeof(double)); #ifndef MFNOSAFETYNET if(p==NULL) { sprintf(MFNKMatrixErrorMsg,"Out of memory, trying to allocate %d bytes",k*sizeof(double)); MFSetError(e,12,RoutineName,MFNKMatrixErrorMsg,__LINE__,__FILE__); MFErrorHandlerOutOfMemory(e); return; } #endif j=0; pmax=0.; for(i=0;i<k;i++) { u=MFMColumn(A,i,e); p[i]=MFNSpaceInner(space,phi,u,e); if(fabs(p[i])>pmax){pmax=fabs(p[i]);j=i;} MFFreeNVector(u,e); #ifdef MFALLOWVERBOSE if(verbose){printf("phi^* A_[%d]=%lf\n",i,p[i]);fflush(stdout);} #endif } #ifdef MFALLOWVERBOSE if(verbose){printf("max of phi^* A_j is for j=%d, =%lf\n",j,pmax);fflush(stdout);} #endif m=0; u=MFMColumn(Phi,m,e); w=MFCloneNVector(u,e); MFNSpaceScale(space,1.,phi,u,e); #ifdef MFALLOWVERBOSE if(verbose){printf("column 0 of Phi is phi ");MFPrintNVector(stdout,u,e);printf("\n");(stdout);} #endif if(Phi->type==DENSE)MFMSetColumn(Phi,m,u,e); MFFreeNVector(u,e); m++; pj=MFMColumn(A,j,e); for(i=0;i<k;i++) { if(i!=j) { pi=MFMColumn(A,i,e); u=MFMColumn(Phi,m,e); MFNSpaceScale(space, p[i],pj,u,e); MFNSpaceScale(space,-p[j],pi,w,e); MFNSpaceAdd(space,u,w,u,e); #ifdef MFALLOWVERBOSE if(verbose){printf("column %d of Phi is %lf A_%d - %lf A_%d ",m,p[i],j,p[j],i);MFPrintNVector(stdout,u,e);printf("\n");(stdout);} #endif if(Phi->type==DENSE)MFMSetColumn(Phi,m,u,e); m++; MFFreeNVector(u,e); MFFreeNVector(pi,e); } } MFFreeNVector(pj,e); free(p); #ifdef MFALLOWVERBOSE if(verbose){printf("Before G-S:\n");MFPrintNKMatrix(stdout,Phi,e);fflush(stdout);} #endif MFGramSchmidt(space,Phi,e); #ifdef MFALLOWVERBOSE if(verbose){printf("After G-S:\n");MFPrintNKMatrix(stdout,Phi,e);fflush(stdout); printf("done %s\n",RoutineName);fflush(stdout);} #endif return; }