Esempio n. 1
0
void rmat_cauchy(int m, int n, rmulti **A, int LDA)
{
  int i,j;
  for(j=0; j<n; j++){
    for(i=0; i<m; i++){
      rset_si(MAT(A,i,j,LDA),i+j+1);
      rinv(MAT(A,i,j,LDA),MAT(A,i,j,LDA));
    }
  }
}
Esempio n. 2
0
main()
{
    int i, j;
    double a[4][4] = { {0.2368, 0.2471, 0.2568, 1.2671},
        {1.1161, 0.1254, 0.1397, 0.1490},
        {0.1582, 1.1675, 0.1768, 0.1871},
        {0.1968, 0.2071, 1.2168, 0.2271}
    };
    double b[4][4], c[4][4];

    for (i = 0; i <= 3; i++)
        for (j = 0; j <= 3; j++) {
            b[i][j] = a[i][j];
        }

    i = rinv(a, 4);

    if (i != 0) {
        printf("MAT A IS:\n");

        for (i = 0; i <= 3; i++) {
            for (j = 0; j <= 3; j++) {
                printf("%13.6e ", b[i][j]);
            }

            printf("\n");
        }

        printf("\n");
        printf("MAT A- IS:\n");

        for (i = 0; i <= 3; i++) {
            for (j = 0; j <= 3; j++) {
                printf("%13.6e ", a[i][j]);
            }

            printf("\n");
        }

        printf("\n");
        printf("MAT AA- IS:\n");
        trmul(b, a, 4, 4, 4, c);

        for (i = 0; i <= 3; i++) {
            for (j = 0; j <= 3; j++) {
                printf("%13.6e ", c[i][j]);
            }

            printf("\n");
        }
    }
}
Esempio n. 3
0
/**
 @brief ハウスホルダー・ベクトルへの変換.
 @details h[0]=0; ...; h[k-1]=0; h[k]=-s*xi; h[k+1]=x[k+1]; ...; h[n-1]=x[n-1];
 @param[in]  h 初期化済みのベクトル.サイズはn.
 @param[in]  x 初期化済みのベクトル.サイズはn.
 @param[in]  n ベクトルのサイズ.
 @param[in]  k 第k要素が基準.
 @param[out] h ハウスホルダー・ベクトル.
 */
void rhouseholder_vec(int n, int k, rmulti **h, rmulti *alpha, rmulti **x)
{
  int p0,p1,prec;
  rmulti *eta=NULL,*zeta=NULL,*xi=NULL,*axk=NULL;
  // allocate
  p0=rget_prec(alpha);
  p1=rvec_get_prec_max(n,h);
  prec=MAX2(p0,p1);
  eta=rallocate_prec(prec);
  zeta=rallocate_prec(prec);
  xi=rallocate_prec(prec);
  axk=rallocate_prec(prec);
  //----------- norm
  rvec_sum_pow2(xi,n-k-1,&x[k+1]);    // xi=sum(abs(x((k+1):end)).^2);
  rmul(axk,x[k],x[k]);                // axk=|x[k]|^2
  radd(eta,axk,xi);                   // eta=|x[k]|^2+...
  rsqrt(axk,axk);                     // axk=|x[k]|
  rsqrt(eta,eta);                     // eta=sqrt(|x[k]|^2+...)
  if(req_d(eta,0)){rsub(xi,eta,axk);} // xi=eta-|x(k)|
  else{                               // xi=xi/(|x(k)|+eta)
    radd(zeta,axk,eta);
    rdiv(xi,xi,zeta);
  }
  //----------- h
  rvec_set_zeros(k,h);
  rvec_copy(n-k-1,&h[k+1],&x[k+1]);     // h((k+1):end)=x((k+1):end);
  if(ris_zero(x[k])){
    rcopy(h[k],xi); rneg(h[k],h[k]);    // h[k]=-xi
  }else{
    rdiv(zeta,xi,axk); rneg(zeta,zeta); // zeta=-xi/axk;
    rmul(h[k],x[k],zeta);               // h[k]=zeta*x[k];
  }
  //----------- alpha
  if(req_d(xi,0) || req_d(eta,0)){
    rset_d(alpha,0);
  }else{
    rmul(alpha,xi,eta);                 // alpha=1/(xi*eta)
    rinv(alpha,alpha);
  }
  // free
  eta=rfree(eta);
  zeta=rfree(zeta);
  xi=rfree(xi);
  axk=rfree(axk);
}
Esempio n. 4
0
void rinv_test()
{
    int i,j;
    double a[10][10] =
    {
        {0,0,0,1,0,0,0,0,0,0},
        {0,0,0,0,1,0,0,0,0,0},
        {0,0,0,0,0,1,0,0,0,0},
        {0,0,0,0,0,0,1,0,0,0},
        {0,0,0,0,0,0,0,1,0,0},
        {0,0,0,0,0,0,0,0,1,0},
        {0,0,0,0,0,0,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1},
        {1,2,3,4,5,6,7,8,9,10},
        {1,4,9,16,25,36,49,64,81,100}
    };

    double a_inverse[3][3] =
    {
        {1,  -2,   5},
        {0,  1,   -4},
        {0,  0,    1}
    };
    static double b[K][K],c[K][K];

    for (i=0; i<K; i++)
    {
        for (j=0; j<K; j++)
        {
            b[i][j]=a[i][j];
        }
    }

    //invertion
    i=rinv(a,K);

    if (i!=0)
    {
        printf("MAT A IS:\n");
        for (i=0; i<K; i++)
        {
            for (j=0; j<K; j++)
                printf("%3.0f ",b[i][j]);
            printf("\n");
        }
        printf("\n");

        printf("MAT A- IS:\n");
        for (i=0; i<K; i++)
        {
            printf("{");
            for (j=0; j<K; j++)
            {
                printf("%3.0f\t ",a[i][j]);
                if(j<9) printf(",");
            }
            printf("},\n");
        }
        printf("\n");

//        printf("MAT AA- IS:\n");
//        trmul(b,a,K,K,K,c);
//        for (i=0; i<K; i++)
//        {
//            for (j=0; j<K; j++)
//                printf("%3.0f ",c[i][j]);
//            printf("\n");
//        }
    }
}
Esempio n. 5
0
  ThreeBodySM::ValueType ThreeBodySM::evaluateLog(ParticleSet& P, ParticleSet::ParticleGradient_t& G, 
      ParticleSet::ParticleLaplacian_t& L) {

    LogValue=0.0;
    RealType dudr, d2udr2;

    int nc(CenterRef.getTotalNum()), nptcl(P.getTotalNum());

    //first fill the matrix AA(i,j) where j is a composite index
    for(int I=0; I<nc; I++) {
      BasisType& a(*ieBasis[CenterRef.GroupID[I]]);
      int offset(0);
      for(int nn=dist_ie->M[I]; nn<dist_ie->M[I+1]; nn++) {
        RealType sep(dist_ie->r(nn));
        RealType rinv(dist_ie->rinv(nn));
        int i(dist_ie->J[nn]);
        int offset(ieBasisOffset[I]);
        for(int k=0; k<a.size(); k++,offset++) {
          AA(i,offset)=a[k]->evaluate(sep,dudr,d2udr2);
          dudr *= rinv;
          dAA(i,offset)=dudr*dist_ie->dr(nn);
          d2AA(i,offset)=d2udr2+2.0*dudr;
        }
      }
    }

    for(int i=0; i<nptcl; i++) {
      for(int nn=dist_ee->M[i]; nn<dist_ee->M[i]; nn++) {
        int j(dist_ee->J[nn]);
        RealType sep(dist_ee->r(nn));
        RealType rinv(dist_ee->rinv(nn));
        for(int m=0; m<eeBasis.size(); m++) {
          RealType psum=0,lapmi=0,lapmj=0;
          PosType grmi,grmj;
          for(int I=0; I<nc; I++) {
            const Matrix<RealType>& cblock(*C(m,CenterRef.GroupID[I]));
            int offsetI(ieBasisOffSet[I]);
            for(int k=0; k< ieBasisSize[I],kb=offsetI; k++,kb++) {
              RealType vall=0,valk=AA(i,kb);
              for(int l=0; l<ieBasisSize[I],lb=offsetI; l++,lb++) {
                vall += cblock(k,l)*AA(j,lb);
                grmj += valk*cblock(k,l)*dAA(j,lb);
                lapmj += valk*cblock(k,l)*d2AA(j,lb);
              }//l
              psum += valk*vall;
              grmi += dAA(i,kb)*vall;
              lampi += d2AA(i,kb)*vall;
            }//k
          }//I

          RealType bm =eeBasis[m]->evaluate(sep,dudr,d2udr2);
          dudr *= rinv;
          PosType dbm=dudr*dist_ee->dr(nn);
          RealType d2bm=d2udr2+2.0*dudr;

          LogValue += bm*psum;

          G[i] += bm*grmi-dbm*psum;
          G[j] += bm*grmj+dbm*psum;
          L[i] += b2bm*psum+bm*lapi;
          L[j] += b2bm*psum+bm*lapj;

        }
      }
    }
    return LogValue;

  }