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)); } } }
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"); } } }
/** @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); }
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"); // } } }
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; }