Exemple #1
0
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;
}
Exemple #2
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;
}