| | |
| | | /* vim: set ts=4 sts=4 sw=4 noet : */ |
| | | #include<stdlib.h> |
| | | #include<math.h> |
| | | #include<stdio.h> |
| | |
| | | ts_vertex *vtx; |
| | | ts_tape *tape=vesicle->tape; |
| | | vesicle->R_nucleus=tape->R_nucleus*tape->R_nucleus; |
| | | |
| | | vesicle->R_nucleusX=tape->R_nucleusX*tape->R_nucleusX; |
| | | vesicle->R_nucleusY=tape->R_nucleusY*tape->R_nucleusY; |
| | | vesicle->R_nucleusZ=tape->R_nucleusZ*tape->R_nucleusZ; |
| | | vesicle->clist->dmin_interspecies = tape->dmin_interspecies*tape->dmin_interspecies; |
| | | |
| | | //Initialize grafted polymers (brush): |
| | |
| | | vesicle->dmax=tape->dmax*tape->dmax; /* dmax^2 in the vesicle dmax variable */ |
| | | vesicle->bending_rigidity=tape->xk0; |
| | | vtx_set_global_values(vesicle); /* make xk0 default value for every vertex */ |
| | | ts_fprintf(stdout, "Tape setting: xk0=%e\n",tape->xk0); |
| | | // ts_fprintf(stdout, "Tape setting: xk0=%e\n",tape->xk0); |
| | | vesicle->stepsize=tape->stepsize; |
| | | vesicle->clist->ncmax[0]=tape->ncxmax; |
| | | vesicle->clist->ncmax[1]=tape->ncymax; |
| | |
| | | else { |
| | | vesicle->sphHarmonics=NULL; |
| | | } |
| | | |
| | | int rndvtx; |
| | | if(tape->number_of_vertices_with_c0>0){ |
| | | ts_fprintf(stderr,"Setting values for spontaneous curvature as defined in tape\n"); |
| | | j=0; |
| | | for(i=0;i<tape->number_of_vertices_with_c0;i++){ |
| | | rndvtx=rand() % vesicle->vlist->n; |
| | | if(fabs(vesicle->vlist->vtx[rndvtx]->c-tape->c0)<1e-15){ |
| | | j++; |
| | | i--; |
| | | if(j>10*vesicle->vlist->n){ |
| | | fatal("cannot populate vesicle with vertices with spontaneous curvature. Too many spontaneous curvature vertices?",100); |
| | | } |
| | | continue; |
| | | } |
| | | vesicle->vlist->vtx[rndvtx]->c=tape->c0; |
| | | } |
| | | mean_curvature_and_energy(vesicle); |
| | | if(fabs(tape->w)>1e-16){ //if nonzero energy |
| | | ts_fprintf(stderr,"Setting attraction between vertices with spontaneous curvature\n"); |
| | | sweep_attraction_bond_energy(vesicle); |
| | | } |
| | | } |
| | | |
| | | return TS_SUCCESS; |
| | | |
| | | } |
| | |
| | | const ts_double c2= cos(4.0*M_PI/5.0); |
| | | |
| | | /* Calculates projection lenght of an edge bond to pentagram plane */ |
| | | const ts_double xl0=A0/(2.0*sin(M_PI/5.0)); |
| | | const ts_double xl0=DEF_A0/(2.0*sin(M_PI/5.0)); |
| | | #ifdef TS_DOUBLE_DOUBLE |
| | | const ts_double z0=sqrt(pow(A0,2)-pow(xl0,2)); |
| | | const ts_double z0=sqrt(pow(DEF_A0,2)-pow(xl0,2)); |
| | | #endif |
| | | #ifdef TS_DOUBLE_FLOAT |
| | | const ts_double z0=sqrtf(powf(A0,2)-powf(xl0,2)); |
| | | const ts_double z0=sqrtf(powf(DEF_A0,2)-powf(xl0,2)); |
| | | #endif |
| | | #ifdef TS_DOUBLE_LONGDOUBLE |
| | | const ts_double z0=sqrtl(powl(A0,2)-powl(xl0,2)); |
| | | const ts_double z0=sqrtl(powl(DEF_A0,2)-powl(xl0,2)); |
| | | #endif |
| | | // const z0=sqrt(A0*A0 -xl0*xl0); /* I could use pow function but if pow is used make a check on the float type. If float then powf, if long double use powl */ |
| | | |
| | |
| | | for(i=1;i<=vlist->n;i++){ |
| | | for(j=1;j<=vlist->n;j++){ |
| | | dist2=vtx_distance_sq(vtx[i],vtx[j]); |
| | | if( (dist2>eps) && (dist2<(A0*A0+eps))){ |
| | | if( (dist2>eps) && (dist2<(DEF_A0*DEF_A0+eps))){ |
| | | //if it is close enough, but not too much close (solves problem of comparing when i==j) |
| | | vtx_add_neighbour(vtx[i],vtx[j]); |
| | | } |
| | |
| | | dist2=vtx_distance_sq(vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); |
| | | direct=vtx_direct(vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); |
| | | // TODO: check if fabs can be used with all floating point types!! |
| | | if( (fabs(dist2-A0*A0)<=eps) && (direct>0.0) && (j!=jjj) ){ |
| | | if( (fabs(dist2-DEF_A0*DEF_A0)<=eps) && (direct>0.0) && (j!=jjj) ){ |
| | | vtx_add_cneighbour(blist,tvtx[k],tvtx[vtx[i]->neigh[j-1]->idx+1]); |
| | | jjj=jj; |
| | | jj=j; |
| | |
| | | dist=vtx_distance_sq(vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); |
| | | direct=vtx_direct(vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); |
| | | // TODO: same as above |
| | | if(fabs(dist-A0*A0)<=eps && direct < 0.0 && vtx[i]->neigh[j-1]->idx+1 > i && vtx[i]->neigh[jj-1]->idx+1 >i){ |
| | | if(fabs(dist-DEF_A0*DEF_A0)<=eps && direct < 0.0 && vtx[i]->neigh[j-1]->idx+1 > i && vtx[i]->neigh[jj-1]->idx+1 >i){ |
| | | triangle_add(tlist,vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); |
| | | } |
| | | } |