コード例 #1
0
ファイル: MFLOCA.C プロジェクト: gitter-badger/quinoa
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;
}
コード例 #2
0
ファイル: MFNKMatrix.c プロジェクト: pratikmallya/Multifario
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;
 }
コード例 #3
0
ファイル: MFNKMatrix.c プロジェクト: pratikmallya/Multifario
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;
 }