X-Git-Url: https://www.hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=d33de02efa776fa52dd3a10bbd5ca00d93ba7b4c;hb=15b4727e1137600f8f46af027aefd2b5c7a56420;hp=5aa6d87bb4490ad4585d9a196ec6b4d3867fc511;hpb=c0a8b254109929fba10795e644187c51742108a8;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index 5aa6d87..d33de02 100644 --- a/moldyn.c +++ b/moldyn.c @@ -460,6 +460,28 @@ int thermal_init(t_moldyn *moldyn,u8 equi_init) { return 0; } +double temperature_calc(t_moldyn *moldyn) { + + double double_ekin; + int i; + t_atom *atom; + + atom=moldyn->atom; + + for(i=0;icount;i++) + double_ekin+=atom[i].mass*v3_absolute_square(&(atom[i].v)); + + /* kinetic energy = 3/2 N k_B T */ + moldyn->t=double_ekin/(3.0*K_BOLTZMANN*moldyn->count); + + return moldyn->t; +} + +double get_temperature(t_moldyn *moldyn) { + + return moldyn->t; +} + int scale_velocity(t_moldyn *moldyn,u8 equi_init) { int i; @@ -478,10 +500,11 @@ int scale_velocity(t_moldyn *moldyn,u8 equi_init) { count=0; for(i=0;icount;i++) { if((equi_init&TRUE)||(atom[i].attr&ATOM_ATTR_HB)) { - e+=0.5*atom[i].mass*v3_absolute_square(&(atom[i].v)); + e+=atom[i].mass*v3_absolute_square(&(atom[i].v)); count+=1; } } + e*=0.5; if(count!=0) moldyn->t=e/(1.5*count*K_BOLTZMANN); else return 0; /* no atoms involved in scaling! */ @@ -515,11 +538,40 @@ int scale_velocity(t_moldyn *moldyn,u8 equi_init) { return 0; } +double pressure_calc(t_moldyn *moldyn) { + + int i; + t_atom *atom; + double p1,p2,p=0; + + for(i=0;icount;i++) { + + + } + + p1=(moldyn->count*K_BOLTZMANN*moldyn->t-ONE_THIRD*moldyn->vt1); + p1/=moldyn->volume; + + p2=(moldyn->count*K_BOLTZMANN*moldyn->t-ONE_THIRD*moldyn->vt2); + p2/=moldyn->volume; + + printf("compare pressures: %f %f\n",p1/ATM,p2/ATM); + + return moldyn->p; +} + +double get_pressure(t_moldyn *moldyn) { + + return moldyn->p; + +} + int scale_volume(t_moldyn *moldyn) { t_atom *atom; t_3dvec *dim,*vdim; - double virial,scale; + double scale,v; + t_virial virial; t_linkcell *lc; int i; @@ -528,14 +580,25 @@ int scale_volume(t_moldyn *moldyn) { vdim=&(moldyn->vis.dim); lc=&(moldyn->lc); - for(i=0;icount;i++) - virial+=v3_norm(&(atom[i].virial)); + memset(&virial,0,sizeof(t_virial)); -printf("%f\n",virial); + for(i=0;icount;i++) { + virial.xx+=atom[i].virial.xx; + virial.yy+=atom[i].virial.yy; + virial.zz+=atom[i].virial.zz; + virial.xy+=atom[i].virial.xy; + virial.xz+=atom[i].virial.xz; + virial.yz+=atom[i].virial.yz; + } + + /* just a guess so far ... */ + v=virial.xx+virial.yy+virial.zz; + +printf("%f\n",v); /* get pressure from virial */ - moldyn->p=moldyn->count*K_BOLTZMANN*moldyn->t-ONE_THIRD*virial; + moldyn->p=moldyn->count*K_BOLTZMANN*moldyn->t+ONE_THIRD*v; moldyn->p/=moldyn->volume; -printf("%f\n",moldyn->p/(ATM)); +printf("%f | %f\n",moldyn->p/(ATM),moldyn->p_ref/ATM); /* scale factor */ if(moldyn->pt_scale&P_SCALE_BERENDSEN) @@ -580,11 +643,6 @@ double get_e_kin(t_moldyn *moldyn) { return moldyn->ekin; } -double get_e_pot(t_moldyn *moldyn) { - - return moldyn->energy; -} - double update_e_kin(t_moldyn *moldyn) { return(get_e_kin(moldyn)); @@ -647,6 +705,9 @@ int link_cell_init(t_moldyn *moldyn) { lc->cells=lc->nx*lc->ny*lc->nz; lc->subcell=malloc(lc->cells*sizeof(t_list)); + if(lc->cells<27) + printf("[moldyn] FATAL: less then 27 subcells!\n"); + printf("[moldyn] initializing linked cells (%d)\n",lc->cells); for(i=0;icells;i++) @@ -873,13 +934,21 @@ int moldyn_integrate(t_moldyn *moldyn) { scale_volume(moldyn); /* check for log & visualization */ +//double ax; +//double ao; +//double av; if(e) { if(!(i%e)) +//ao=sqrt(0.1/M_SI); +//ax=((0.28-0.25)*sqrt(3)*LC_SI/2)*cos(ao*i); +//av=ao*(0.28-0.25)*sqrt(3)*LC_SI/2*sin(ao*i); + update_e_kin(moldyn); dprintf(moldyn->efd, "%f %f %f %f\n", - moldyn->time,update_e_kin(moldyn), + moldyn->time,moldyn->ekin, moldyn->energy, get_total_energy(moldyn)); +//moldyn->atom[0].r.x,ax,av*av*M_SI,0.1*ax*ax,av*av*M_SI+0.1*ax*ax); } if(m) { if(!(i%m)) { @@ -934,7 +1003,7 @@ int moldyn_integrate(t_moldyn *moldyn) { int velocity_verlet(t_moldyn *moldyn) { int i,count; - double tau,tau_square; + double tau,tau_square,h; t_3dvec delta; t_atom *atom; @@ -945,14 +1014,15 @@ int velocity_verlet(t_moldyn *moldyn) { for(i=0;ienergy=0.0; + + moldyn->vt2=0.0; /* get energy and force of every atom */ for(i=0;ixx=0.0; + virial->yy=0.0; + virial->zz=0.0; + virial->xy=0.0; + virial->xz=0.0; + virial->yz=0.0; + moldyn->vt1=0.0; /* reset site energy */ itom[i].e=0.0; @@ -1111,6 +1191,33 @@ int potential_force_calc(t_moldyn *moldyn) { #ifdef DEBUG printf("\n\n"); #endif +#ifdef VDEBUG +printf("\n\n"); +#endif + + moldyn->vt2=0.0; + for(i=0;ivt2-=v3_scalar_product(&(itom[i].r),&(itom[i].f)); + +printf("compare: vt1: %f vt2: %f\n",moldyn->vt1,moldyn->vt2); + +pressure_calc(moldyn); + + return 0; +} + +/* + * virial calculation + */ + +inline int virial_calc(t_atom *a,t_3dvec *f,t_3dvec *d) { + + a->virial.xx-=f->x*d->x; + a->virial.yy-=f->y*d->y; + a->virial.zz-=f->z*d->z; + a->virial.xy-=f->x*d->y; + a->virial.xz-=f->x*d->z; + a->virial.yz-=f->y*d->z; return 0; } @@ -1157,23 +1264,29 @@ int harmonic_oscillator(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { t_ho_params *params; t_3dvec force,distance; - double d; + double d,f; double sc,equi_dist; params=moldyn->pot2b_params; sc=params->spring_constant; equi_dist=params->equilibrium_distance; + if(air),&(ai->r)); if(bc) check_per_bound(moldyn,&distance); d=v3_norm(&distance); if(d<=moldyn->cutoff) { - /* energy is 1/2 (d-d0)^2, but we will add this twice ... */ - moldyn->energy+=(0.25*sc*(d-equi_dist)*(d-equi_dist)); + moldyn->energy+=(0.5*sc*(d-equi_dist)*(d-equi_dist)); /* f = -grad E; grad r_ij = -1 1/r_ij distance */ - v3_scale(&force,&distance,sc*(1.0-(equi_dist/d))); + f=sc*(1.0-equi_dist/d); + v3_scale(&force,&distance,f); v3_add(&(ai->f),&(ai->f),&force); + virial_calc(ai,&force,&distance); + virial_calc(aj,&force,&distance); /* f and d signe switched */ + v3_scale(&force,&distance,-f); + v3_add(&(aj->f),&(aj->f),&force); } return 0; @@ -1193,6 +1306,8 @@ int lennard_jones(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { sig6=params->sigma6; sig12=params->sigma12; + if(air),&(ai->r)); if(bc) check_per_bound(moldyn,&distance); d=v3_absolute_square(&distance); /* 1/r^2 */ @@ -1201,16 +1316,20 @@ int lennard_jones(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { h2=d*d; /* 1/r^4 */ h2*=d; /* 1/r^6 */ h1=h2*h2; /* 1/r^12 */ - /* energy is eps*..., but we will add this twice ... */ - moldyn->energy+=0.5*eps*(sig12*h1-sig6*h2); + moldyn->energy+=(eps*(sig12*h1-sig6*h2)-params->uc); h2*=d; /* 1/r^8 */ h1*=d; /* 1/r^14 */ h2*=6*sig6; h1*=12*sig12; d=+h1-h2; d*=eps; + v3_scale(&force,&distance,d); + v3_add(&(aj->f),&(aj->f),&force); v3_scale(&force,&distance,-1.0*d); /* f = - grad E */ v3_add(&(ai->f),&(ai->f),&force); + virial_calc(ai,&force,&distance); + virial_calc(aj,&force,&distance); /* f and d signe switched */ + moldyn->vt1-=v3_scalar_product(&force,&distance); } return 0; @@ -1224,7 +1343,10 @@ int lennard_jones(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { int tersoff_mult_complete_params(t_tersoff_mult_params *p) { printf("[moldyn] tersoff parameter completion\n"); + p->S2[0]=p->S[0]*p->S[0]; + p->S2[1]=p->S[1]*p->S[1]; p->Smixed=sqrt(p->S[0]*p->S[1]); + p->S2mixed=p->Smixed*p->Smixed; p->Rmixed=sqrt(p->R[0]*p->R[1]); p->Amixed=sqrt(p->A[0]*p->A[1]); p->Bmixed=sqrt(p->B[0]*p->B[1]); @@ -1285,8 +1407,8 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { t_tersoff_mult_params *params; t_tersoff_exchange *exchange; t_3dvec dist_ij,force; - double d_ij; - double A,B,R,S,lambda,mu; + double d_ij,d_ij2; + double A,B,R,S,S2,lambda,mu; double f_r,df_r; double f_c,df_c; int brand; @@ -1317,18 +1439,10 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { * */ - /* dist_ij, d_ij */ - v3_sub(&dist_ij,&(aj->r),&(ai->r)); - if(bc) check_per_bound(moldyn,&dist_ij); - d_ij=v3_norm(&dist_ij); - - /* save for use in 3bp */ - exchange->d_ij=d_ij; - exchange->dist_ij=dist_ij; - /* constants */ if(brand==ai->brand) { S=params->S[brand]; + S2=params->S2[brand]; R=params->R[brand]; A=params->A[brand]; B=params->B[brand]; @@ -1338,6 +1452,7 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { } else { S=params->Smixed; + S2=params->S2mixed; R=params->Rmixed; A=params->Amixed; B=params->Bmixed; @@ -1346,10 +1461,24 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { params->exchange.chi=params->chi; } - /* if d_ij > S => no force & potential energy contribution */ - if(d_ij>S) + /* dist_ij, d_ij */ + v3_sub(&dist_ij,&(aj->r),&(ai->r)); + if(bc) check_per_bound(moldyn,&dist_ij); + d_ij2=v3_absolute_square(&dist_ij); + + /* if d_ij2 > S2 => no force & potential energy contribution */ + if(d_ij2>S2) return 0; + /* now we will need the distance */ + //d_ij=v3_norm(&dist_ij); + d_ij=sqrt(d_ij2); + + /* save for use in 3bp */ + exchange->d_ij=d_ij; + exchange->d_ij2=d_ij2; + exchange->dist_ij=dist_ij; + /* more constants */ exchange->beta_j=&(params->beta[brand]); exchange->n_j=&(params->n[brand]); @@ -1389,7 +1518,6 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { s_r=S-R; arg=M_PI*(d_ij-R)/s_r; f_c=0.5+0.5*cos(arg); - //df_c=-0.5*sin(arg)*(M_PI/(s_r*d_ij)); /* MARK! */ df_c=0.5*sin(arg)*(M_PI/(s_r*d_ij)); /* two body contribution (ij, ji) */ v3_scale(&force,&dist_ij,-df_c*f_r-df_r*f_c); @@ -1400,6 +1528,15 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { /* add forces of 2bp (ij, ji) contribution * dVij = dVji and we sum up both: no 1/2) */ v3_add(&(ai->f),&(ai->f),&force); + + /* virial */ + ai->virial.xx-=force.x*dist_ij.x; + ai->virial.yy-=force.y*dist_ij.y; + ai->virial.zz-=force.z*dist_ij.z; + ai->virial.xy-=force.x*dist_ij.y; + ai->virial.xz-=force.x*dist_ij.z; + ai->virial.yz-=force.y*dist_ij.z; + #ifdef DEBUG if(ai==&(moldyn->atom[0])) { printf("dVij, dVji (2bp) contrib:\n"); @@ -1407,6 +1544,14 @@ if(ai==&(moldyn->atom[0])) { printf("%f | %f\n",force.y,ai->f.y); printf("%f | %f\n",force.z,ai->f.z); } +#endif +#ifdef VDEBUG +if(ai==&(moldyn->atom[0])) { + printf("dVij, dVji (2bp) contrib:\n"); + printf("%f | %f\n",force.x*dist_ij.x,ai->virial.xx); + printf("%f | %f\n",force.y*dist_ij.y,ai->virial.yy); + printf("%f | %f\n",force.z*dist_ij.z,ai->virial.zz); +} #endif /* energy 2bp contribution (ij, ji) is 0.5 f_r f_c ... */ @@ -1478,7 +1623,6 @@ int tersoff_mult_post_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { zeta=exchange->zeta_ij; if(zeta==0.0) { moldyn->debug++; /* just for debugging ... */ - db=0.0; b=chi; v3_scale(&force,dist_ij,df_a*b*f_c); } @@ -1499,6 +1643,15 @@ int tersoff_mult_post_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { /* add force */ v3_add(&(ai->f),&(ai->f),&force); + + /* virial */ + ai->virial.xx-=force.x*dist_ij->x; + ai->virial.yy-=force.y*dist_ij->y; + ai->virial.zz-=force.z*dist_ij->z; + ai->virial.xy-=force.x*dist_ij->y; + ai->virial.xz-=force.x*dist_ij->z; + ai->virial.yz-=force.y*dist_ij->z; + #ifdef DEBUG if(ai==&(moldyn->atom[0])) { printf("dVij (3bp) contrib:\n"); @@ -1506,6 +1659,14 @@ if(ai==&(moldyn->atom[0])) { printf("%f | %f\n",force.y,ai->f.y); printf("%f | %f\n",force.z,ai->f.z); } +#endif +#ifdef VDEBUG +if(ai==&(moldyn->atom[0])) { + printf("dVij (3bp) contrib:\n"); + printf("%f | %f\n",force.x*dist_ij->x,ai->virial.xx); + printf("%f | %f\n",force.y*dist_ij->y,ai->virial.yy); + printf("%f | %f\n",force.z*dist_ij->z,ai->virial.zz); +} #endif /* add energy of 3bp sum */ @@ -1535,6 +1696,16 @@ if(ai==&(moldyn->atom[0])) { /* add force */ v3_add(&(ai->f),&(ai->f),&force); + + /* virial - plus sign, as dist_ij = - dist_ji - (really??) */ +// TEST ... with a minus instead + ai->virial.xx-=force.x*dist_ij->x; + ai->virial.yy-=force.y*dist_ij->y; + ai->virial.zz-=force.z*dist_ij->z; + ai->virial.xy-=force.x*dist_ij->y; + ai->virial.xz-=force.x*dist_ij->z; + ai->virial.yz-=force.y*dist_ij->z; + #ifdef DEBUG if(ai==&(moldyn->atom[0])) { printf("dVji (3bp) contrib:\n"); @@ -1542,6 +1713,14 @@ if(ai==&(moldyn->atom[0])) { printf("%f | %f\n",force.y,ai->f.y); printf("%f | %f\n",force.z,ai->f.z); } +#endif +#ifdef VDEBUG +if(ai==&(moldyn->atom[0])) { + printf("dVji (3bp) contrib:\n"); + printf("%f | %f\n",force.x*dist_ij->x,ai->virial.xx); + printf("%f | %f\n",force.y*dist_ij->y,ai->virial.yy); + printf("%f | %f\n",force.z*dist_ij->z,ai->virial.zz); +} #endif return 0; @@ -1556,9 +1735,9 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { t_3dvec dist_ij,dist_ik,dist_jk; t_3dvec temp1,temp2; t_3dvec *dzeta; - double R,S,s_r; + double R,S,S2,s_r; double B,mu; - double d_ij,d_ik,d_jk; + double d_ij,d_ik,d_jk,d_ij2,d_ik2,d_jk2; double rr,dd; double f_c,df_c; double f_c_ik,df_c_ik,arg; @@ -1604,6 +1783,7 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { /* dist_ij, d_ij - this is < S_ij ! */ dist_ij=exchange->dist_ij; d_ij=exchange->d_ij; + d_ij2=exchange->d_ij2; /* f_c_ij, df_c_ij (same for ji) */ f_c=exchange->f_c; @@ -1618,21 +1798,26 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { /* dist_ik, d_ik */ v3_sub(&dist_ik,&(ak->r),&(ai->r)); if(bc) check_per_bound(moldyn,&dist_ik); - d_ik=v3_norm(&dist_ik); + d_ik2=v3_absolute_square(&dist_ik); /* ik constants */ brand=ai->brand; if(brand==ak->brand) { R=params->R[brand]; S=params->S[brand]; + S2=params->S2[brand]; } else { R=params->Rmixed; S=params->Smixed; + S2=params->S2mixed; } /* zeta_ij/dzeta_ij contribution only for d_ik < S */ - if(d_ikn_i); @@ -1650,8 +1835,8 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { /* d_costheta */ tmp=1.0/dd; - d_costheta1=cos_theta/(d_ij*d_ij)-tmp; - d_costheta2=cos_theta/(d_ik*d_ik)-tmp; + d_costheta1=cos_theta/d_ij2-tmp; + d_costheta2=cos_theta/d_ik2-tmp; /* some usefull values */ h_cos=(h-cos_theta); @@ -1685,7 +1870,6 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { s_r=S-R; arg=M_PI*(d_ik-R)/s_r; f_c_ik=0.5+0.5*cos(arg); - //df_c_ik=-0.5*sin(arg)*(M_PI/(s_r*d_ik)); /* MARK */ df_c_ik=0.5*sin(arg)*(M_PI/(s_r*d_ik)); /* zeta_ij */ @@ -1704,13 +1888,14 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { /* dist_jk, d_jk */ v3_sub(&dist_jk,&(ak->r),&(aj->r)); if(bc) check_per_bound(moldyn,&dist_jk); - d_jk=v3_norm(&dist_jk); + d_jk2=v3_absolute_square(&dist_jk); /* jk constants */ brand=aj->brand; if(brand==ak->brand) { R=params->R[brand]; S=params->S[brand]; + S2=params->S2[brand]; B=params->B[brand]; mu=params->mu[brand]; chi=1.0; @@ -1718,13 +1903,17 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { else { R=params->Rmixed; S=params->Smixed; + S2=params->S2mixed; B=params->Bmixed; mu=params->mu_m; chi=params->chi; } /* zeta_ji/dzeta_ji contribution only for d_jk < S_jk */ - if(d_jkn_j); @@ -1742,7 +1931,7 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { /* d_costheta */ d_costheta1=1.0/dd; - d_costheta2=cos_theta/(d_ij*d_ij); + d_costheta2=cos_theta/d_ij2; /* some usefull values */ h_cos=(h-cos_theta); @@ -1752,10 +1941,11 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { /* g(cos_theta) */ g=1.0+c2d2-frac; - /* d_costheta_ij and dg(cos_theta) - needed in any case! */ + /* d_costheta_jik and dg(cos_theta) - needed in any case! */ v3_scale(&temp1,&dist_jk,d_costheta1); v3_scale(&temp2,&dist_ij,-d_costheta2); /* ji -> ij => -1 */ - v3_add(&temp1,&temp1,&temp2); + //v3_add(&temp1,&temp1,&temp2); + v3_sub(&temp1,&temp1,&temp2); /* there is a minus! */ v3_scale(&temp1,&temp1,-2.0*frac*h_cos/d2_h_cos2); /* dg */ /* store dg in temp2 and use it for dVjk later */ @@ -1804,6 +1994,15 @@ int tersoff_mult_3bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,t_atom *ak,u8 bc) { v3_scale(&temp2,&temp2,tmp*B*exp(-mu*d_jk)*f_c_jk*0.5); v3_add(&(ai->f),&(ai->f),&temp2); /* -1 skipped in f_a calc ^ */ /* scaled with 0.5 ^ */ + + /* virial */ + ai->virial.xx-=temp2.x*dist_jk.x; + ai->virial.yy-=temp2.y*dist_jk.y; + ai->virial.zz-=temp2.z*dist_jk.z; + ai->virial.xy-=temp2.x*dist_jk.y; + ai->virial.xz-=temp2.x*dist_jk.z; + ai->virial.yz-=temp2.y*dist_jk.z; + #ifdef DEBUG if(ai==&(moldyn->atom[0])) { printf("dVjk (3bp) contrib:\n"); @@ -1811,6 +2010,14 @@ if(ai==&(moldyn->atom[0])) { printf("%f | %f\n",temp2.y,ai->f.y); printf("%f | %f\n",temp2.z,ai->f.z); } +#endif +#ifdef VDEBUG +if(ai==&(moldyn->atom[0])) { + printf("dVjk (3bp) contrib:\n"); + printf("%f | %f\n",temp2.x*dist_jk.x,ai->virial.xx); + printf("%f | %f\n",temp2.y*dist_jk.y,ai->virial.yy); + printf("%f | %f\n",temp2.z*dist_jk.z,ai->virial.zz); +} #endif }