From 142a67fe82b830e5c7816914afa62445959c87ca Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@fe.uni-lj.si> Date: Tue, 05 Nov 2013 14:04:21 +0000 Subject: [PATCH] changes in bondflip call. No need to bondflip all the bonds, but only as many bonds as there are vertices. Also, rnvec seems to be not needed for bondflip, so it is commented out --- src/sh.c | 80 ++++++++++++++++++++++++++++++++++------ 1 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/sh.c b/src/sh.c index 27b67aa..0c4b06d 100644 --- a/src/sh.c +++ b/src/sh.c @@ -9,7 +9,7 @@ ts_uint j,i; ts_spharm *sph=(ts_spharm *)malloc(sizeof(ts_spharm)); - + sph->N=0; /* lets initialize Ylm for each vertex. */ sph->Ylmi=(ts_double ***)calloc(l,sizeof(ts_double **)); for(i=0;i<l;i++){ @@ -25,6 +25,11 @@ sph->ulm[j]=(ts_double *)calloc(2*j+1,sizeof(ts_double)); } + /* lets initialize sum of Ulm2 */ + sph->sumUlm2=(ts_double **)calloc(l,sizeof(ts_double *)); + for(j=0;j<l;j++){ + sph->sumUlm2[j]=(ts_double *)calloc(2*j+1,sizeof(ts_double)); + } /* lets initialize co */ //NOTE: C is has zero based indexing. Code is imported from fortran and to comply with original indexes we actually generate one index more. Also second dimension is 2*j+2 instead of 2*j+2. elements starting with 0 are useles and should be ignored! @@ -46,6 +51,7 @@ int i,j; for(i=0;i<sph->l;i++){ if(sph->ulm[i]!=NULL) free(sph->ulm[i]); + if(sph->sumUlm2[i]!=NULL) free(sph->sumUlm2[i]); if(sph->co[i]!=NULL) free(sph->co[i]); } if(sph->co[sph->l]!=NULL) free(sph->co[sph->l]); @@ -69,7 +75,7 @@ } /* Gives you legendre polynomials. Taken from NR, p. 254 */ -ts_double plgndr(ts_int l, ts_int m, ts_float x){ +ts_double plgndr(ts_int l, ts_int m, ts_double x){ ts_double fact, pll, pmm, pmmp1, somx2; ts_int i,ll; @@ -143,7 +149,16 @@ } -/*Computes Y(l,m,theta,fi) (Miha's definition that is different from common definition for factor srqt(1/(2*pi)) */ +/** @brief: Computes Y(l,m,theta,fi) + * + * Function calculates Y^l_m for vertex with given (\theta, \fi) coordinates in + * spherical coordinate system. + * @param l is an ts_int argument. + * @param m is an ts_int argument. + * @param theta is ts_double argument. + * @param fi is a ts_double argument. + * + * (Miha's definition that is different from common definition for factor srqt(1/(2*pi)) */ ts_double shY(ts_int l,ts_int m,ts_double theta,ts_double fi){ ts_double fac1, fac2, K; int i; @@ -223,6 +238,7 @@ ts_bool preparationSh(ts_vesicle *vesicle, ts_double r0){ //TODO: before calling or during the call calculate area of each triangle! Can //be also done after vertexmove and bondflip // +//DONE: in energy calculation! // ts_uint i,j; ts_vertex **vtx=vesicle->vlist->vtx; ts_vertex *cvtx; @@ -265,7 +281,7 @@ r=sqrtl(cvtx->x*cvtx->x+cvtx->y*cvtx->y+cvtx->z*cvtx->z); #endif cvtx->relR=(r-r0)/r0; - cvtx->solAngle=cvtx->projArea/cvtx->relR * cvtx->projArea/cvtx->relR; + cvtx->solAngle=cvtx->projArea/r/r; } return TS_SUCCESS; } @@ -273,10 +289,11 @@ ts_bool calculateYlmi(ts_vesicle *vesicle){ - ts_uint i,j,k; + ts_int i,j,k; ts_spharm *sph=vesicle->sphHarmonics; ts_coord *coord=(ts_coord *)malloc(sizeof(ts_coord)); ts_double fi, theta; + ts_int m; ts_vertex *cvtx; for(k=0;k<vesicle->vlist->n;k++){ cvtx=vesicle->vlist->vtx[k]; @@ -284,13 +301,34 @@ cart2sph(coord,cvtx->x, cvtx->y, cvtx->z); fi=coord->e2; theta=coord->e3; - for(i=0; i<sph->l; i++){ + for(i=1; i<sph->l; i++){ for(j=0;j<i;j++){ - sph->Ylmi[i][j][k]=sph->co[i][j]*cos((j-i-1)*fi)*pow(-1,j-i-1)*plgndr(i,abs(j-i-1),cos(theta)); + m=j+1; +//Nastudiraj!!!!! + sph->Ylmi[i][j][k]=sph->co[i][m]*cos((m-i-1)*fi)*pow(-1,m-i-1)*plgndr(i,abs(m-i-1),cos(theta)); + if(i==2 && j==0){ + /* fprintf(stderr," **** vtx %d ****\n", k+1); + fprintf(stderr,"m-i-1 =%d\n",m-i-1); + fprintf(stderr,"fi =%e\n",fi); + fprintf(stderr,"(m-i-1)*fi =%e\n",((ts_double)(m-i-1))*fi); + fprintf(stderr,"-2*fi =%e\n",-2*fi); + fprintf(stderr,"m =%d\n",m); + + fprintf(stderr," cos(m-i-1)=%e\n",cos((m-i-1)*fi)); + fprintf(stderr," cos(-2*fi)=%e\n",cos(-2*fi)); + fprintf(stderr," sph->co[i][m]=%e\n",sph->co[i][m]); + fprintf(stderr," plgndr(i,abs(m-i-1),cos(theta))=%e\n",plgndr(i,abs(m-i-1),cos(theta))); +*/ + } } - sph->Ylmi[i][j+1][k]=sph->co[i][j+1]*plgndr(i,0,cos(theta)); - for(j=sph->l;j<2*i;j++){ - sph->Ylmi[i][j][k]=sph->co[i][j]*sin((j-i-1)*fi)*plgndr(i,j-i-1,cos(theta)); +//Nastudiraj!!!!! + j=i; + m=j+1; + sph->Ylmi[i][j][k]=sph->co[i][m]*plgndr(i,0,cos(theta)); + for(j=i+1;j<2*i+1;j++){ + m=j+1; +//Nastudiraj!!!!! + sph->Ylmi[i][j][k]=sph->co[i][m]*sin((m-i-1)*fi)*plgndr(i,m-i-1,cos(theta)); } } @@ -305,7 +343,7 @@ ts_uint i,j,k; ts_vertex *cvtx; for(i=0;i<vesicle->sphHarmonics->l;i++){ - for(j=0;j<2*i;j++) vesicle->sphHarmonics->ulm[i][j]=0.0; + for(j=0;j<2*i+1;j++) vesicle->sphHarmonics->ulm[i][j]=0.0; } //TODO: call calculateYlmi !!! @@ -314,7 +352,7 @@ for(k=0;k<vesicle->vlist->n; k++){ cvtx=vesicle->vlist->vtx[k]; for(i=0;i<vesicle->sphHarmonics->l;i++){ - for(j=0;j<2*i;j++){ + for(j=0;j<2*i+1;j++){ vesicle->sphHarmonics->ulm[i][j]+= cvtx->solAngle*cvtx->relR*vesicle->sphHarmonics->Ylmi[i][j][k]; } @@ -323,3 +361,21 @@ return TS_SUCCESS; } + + + + + +ts_bool storeUlm2(ts_vesicle *vesicle){ + +ts_spharm *sph=vesicle->sphHarmonics; +ts_int i,j; +for(i=0;i<sph->l;i++){ + for(j=0;j<2*i+1;j++){ + /* DEBUG fprintf(stderr,"sph->sumUlm2[%d][%d]=%e\n",i,j,sph->ulm[i][j]* sph->ulm[i][j]); */ + sph->sumUlm2[i][j]+=sph->ulm[i][j]* sph->ulm[i][j]; + } +} + sph->N++; +return TS_SUCCESS; +} -- Gitblit v1.9.3