int Plasma::stepmove(){ register int i; Vector_3 force; v_2=0; v_2i=0.; vavi=vav=fav=Vector_3(0,0,0); if(!stable_ions){ for(i=0;i<ni;i++){ // ions move force=f[i]+ext_force(v[i]); v[i]+=force*dt/mass; x[i]+=v[i]*dt; v_2+=(v[i]*v[i])*mass; vav+=v[i]*mass; fav+=force; } v_2i=v_2; vavi=vav; } for(i=ni;i<n;i++){ // electrons move force=f[i]+ext_force(v[i]); v[i]+=force*dt; x[i]+=v[i]*dt; v_2+=v[i][0]*v[i][0]+v[i][1]*v[i][1]+v[i][2]*v[i][2]; vav+=v[i]; fav+=force; } v_2e=v_2-v_2i; vave=vav-vavi; if(!stable_ions){ vav/=(ne+ni*mass); // center-of-mass momentum if(one_center){ Te=(v_2e/ne-2*vav*vave/ne+vav*vav)/3.; // electron temperature Ti=(v_2i/ni-2*vav*vavi/ni+vav*vav)/3.; // ion temperature T=(v_2/n-vav*vav*(ne+ni*mass)/n)/3.; //temperature } else{ Te=(v_2e-vave*vave/ne)/(3*ne); Ti=(v_2i-vavi*vavi/(ni*mass))/(3*ni); T=(ne*Te+ni*Ti)/n; } } else{ vav/=ne; T=(v_2/ne)/3.; /// ATTENTION TO THIS !!! -- no average electron velocity counted!!! //Etot=1.5*T*ne+Epotent; Te=T; Ti=0; } Ekin=0.5*v_2; Etot=Ekin /*1.5*T*n*/+Epotent; return 0; }
void single_step(int itimestep, float &dt, int ntotal, float *hsml, float *mass, float **x, float **vx, float *u, float *rho, float *p, float *tdsdt, float **dvx, float *du, float *drho, int *itype, float **av) { int nvirt, niac = 0; int *pair_i = new int[max_interaction]; int *pair_j = new int[max_interaction]; int *ns = new int[maxn]; float *w = new float[max_interaction]; float **dwdx = new float*[dim+1]; float **indvxdt = new float*[dim+1]; float **exdvxdt = new float*[dim+1]; float **ardvxdt = new float*[dim+1]; float *avdudt = new float[maxn]; float *ahdudt = new float[maxn]; float *c = new float[maxn]; float *eta = new float[maxn]; for (int i = 0; i <= dim; i++) { dwdx[i] = new float[max_interaction]; indvxdt[i] = new float[maxn]; exdvxdt[i] = new float[maxn]; ardvxdt[i] = new float[maxn]; for (int j = 1; j < maxn; j++) { indvxdt[i][j] = (float)NULL; exdvxdt[i][j] = (float)NULL; ardvxdt[i][j] = (float)NULL;; } for (int j = 0; j < max_interaction; j++) dwdx[i][j] = (float)NULL; } for(int i=1;i<=ntotal;i++) { avdudt[i] = 0.; ahdudt[i] = 0.; for(int d=1;d<=dim;d++) { indvxdt[d][i] = 0.; ardvxdt[d][i] = 0.; exdvxdt[d][i] = 0.; } } //Positions of virtual (boundary) particles: 2D+ nvirt = 0; if (virtual_part)virt_part(itimestep, ntotal,nvirt,hsml,mass,x,vx,rho,u,p,itype); //Interaction parameters, calculating neighboring particles //and optimzing smoothing length 2D+ if (nnps==1)direct_find(itimestep, ntotal + nvirt, hsml,x,niac, pair_i,pair_j,w,dwdx,ns); //Density approximation or change rate 2D+ if (summation_density)sum_density(ntotal+nvirt,hsml,mass,niac,pair_i,pair_j,w,rho); else con_density(ntotal+nvirt,mass,niac,pair_i,pair_j,dwdx,vx,drho); //Dynamic viscosity: 2D+ if (visc)viscosity(ntotal+nvirt,itype,eta); //Internal forces: 2D+ int_force(ntotal+nvirt,mass,vx,niac,rho,eta,pair_i,pair_j,dwdx, u,itype,c,p,indvxdt,tdsdt,du); //Artificial viscosity: if (visc_artificial)art_visc(ntotal+nvirt,hsml,mass,x,vx,niac,rho,c,pair_i,pair_j,dwdx,ardvxdt, avdudt); //External forces: 2D+ if (ex_force)ext_force(ntotal+nvirt,x,niac,pair_i,pair_j,itype,exdvxdt); //ext_force(ntotal+nvirt,mass,x,niac,pair_i,pair_j,itype,hsml,exdvxdt); //Calculating the neighboring particles and undating HSML if (sle!=0)h_upgrade(dt,ntotal, mass, vx, rho, niac,pair_i, pair_j, dwdx, hsml); if (heat_artificial)art_heat(ntotal+nvirt,hsml,mass,x,vx,niac,rho,u, c,pair_i,pair_j,dwdx,ahdudt); //Calculating average velocity of each partile for avoiding penetration 2D if (average_velocity)av_vel(ntotal,mass,niac,pair_i,pair_j, w, vx, rho, av); //Convert velocity, force, and energy to f and dfdt for(int i=1;i<=ntotal;i++) { for(int d=1;d<=dim;d++) dvx[d][i] = indvxdt[d][i] + exdvxdt[d][i] + ardvxdt[d][i]; du[i] = du[i] + avdudt[i] + ahdudt[i]; } if ((itimestep % print_step)==0) { cout<<"\n**** Information for particle **** "<<moni_particle<<endl; cout << "internal a=" << indvxdt[1][moni_particle] << " artifical a=" << ardvxdt[1][moni_particle]<< "\nexternal a=" << exdvxdt[1][moni_particle]<< " total a="<<dvx[1][moni_particle]<<endl; } delete[] pair_i; delete[] pair_j; delete[] ns; delete[] w; for (int i = 0; i <= dim; i++) delete dwdx[i]; delete[] dwdx; for (int i = 0; i <= dim; i++) delete indvxdt[i]; delete[] indvxdt; for (int i = 0; i <= dim; i++) delete exdvxdt[i]; delete[] exdvxdt; for (int i = 0; i <= dim; i++) delete ardvxdt[i]; delete[] ardvxdt; delete[] avdudt; delete[] ahdudt; delete[] c; delete[] eta; }