コード例 #1
0
void get_forces(struct chain_param *chain_pm, struct monomer *monomers, Float ***velcs_df, int n_step, VSLStreamStatePtr rngstream)
{
  extern int n_proc, num_proc;
  extern int num_x;
  extern int max_x, max_y, max_z;
  extern int wall_flag;

  int mon_proc;
  int num_beads, Nbead;
  int i, j;
  int n1, n2;
  int s_type = 1;    /* spring type : 0 = FENE, 1=WLC */
  int ev_type = 1;   /* ev type: 0=HS, 1=WCA, 2=Gaussian */
  int maxsize[DIMS];
  int max_N_flag=0;
  double send_buffer[2*DIMS+1];
  char filename[80];
  FILE *stream;

  maxsize[0]=max_x;
  maxsize[1]=max_y;
  maxsize[2]=max_z;

  num_beads = chain_pm->num_beads;
  Nbead = chain_pm->num_beads / chain_pm->Nchain;

  for(j=0; j<DIMS; j++) 
    monomers[0].force[j] = monomers[0].f_ext[j];
  for(n1=1; n1<num_beads; n1++)
    for(j=0; j<DIMS; j++) 
      monomers[n1].force[j] = 0.0;

  /* Calculate spring and exc. vol. forces if # of beads > 1 */
  if(num_beads > 1) {
    spring_force(chain_pm, monomers);  /* 0 = FENE, 1=WLC */

    /*excluded volume forces */
    if(num_beads < 200)
      ev_force(monomers[0].radius, chain_pm, monomers);
    else {
      for(n1=0; n1<num_beads; n1++)
        if(monomers[n1].list[0] >= MAX_N-1) max_N_flag = 1;

      if(max_N_flag == 1)
        ev_force(monomers[0].radius, chain_pm, monomers);
      else ev_force_nlist(monomers[0].radius, chain_pm, monomers);
    }
  }

  for(n1=0; n1<num_beads; n1++)
    for(j=0; j<DIMS; j++) {
      monomers[n1].force[j] *= chain_pm->monmass;
      monomers[n1].f_int[j] = monomers[n1].force[j];
    }

  /*hydrodynamic and fluctuation forces */
  hi_force(monomers, velcs_df, chain_pm->fric, chain_pm->MD_steps, chain_pm->dt, num_beads, chain_pm->monmass, rngstream);
  
  if(wall_flag > 0)
    wall_force(chain_pm, monomers);

  /* send forces and fluid_vel back to proc 0 then broadcast from 0 */

  for(n1=0; n1< num_beads; n1++) { 
    mon_proc = (int)(monomers[n1].pos[0]/num_x);
    send_buffer[0]=n1;
    for(i=0; i<DIMS; i++) {
      send_buffer[i+1]=monomers[n1].force[i];
      send_buffer[i+DIMS+1]=monomers[n1].fluid_vel[i];
    }

    vector_copy(send_buffer, 2*DIMS+1, n_proc, mon_proc, 0);

    for(i=0; i<DIMS; i++) {
      monomers[(int)send_buffer[0]].force[i]=send_buffer[i+1];
      monomers[(int)send_buffer[0]].fluid_vel[i]=send_buffer[i+1+DIMS];
    }

  }
  sync_procs();

  for(n1=0; n1< num_beads; n1++) {
    broad_cast(monomers[n1].force, DIMS, 0);
    broad_cast(monomers[n1].fluid_vel, DIMS, 0);
  }
}
コード例 #2
0
int wall_bounceback(struct fluid_node(*state_o)[LXMAX])
{
	int i,j,xi4,xi5,xi6,xi7,xi8,xo4,xo5,xo6,xo7,xo8,yi4,yi5,yi6,yi7,yi8,yo4,yo5,yo6,yo7,yo8;
    int k,kk;
    double *p,*q,tmp,tmp1,rho;

	//******bounce back on top and bottom wall*********/
	for(i=0;i<lx;i++){

	//*****link 7*****/
    k=7;
	kk=3;
	xi7=i;
    yi7=0;
    xo7=i;
    yo7=ly-1;
    p=state_o[yi7][xi7].df;
    q=state_o[yo7][xo7].df;
    tmp=p[kk];
    p[kk]=q[k];
    q[k]=tmp;
                         //wall force for top wall for k=7
	rho=rho_a[yo7][xo7];
    tmp1=wall_force(xo7,yo7,rho,k,u_lid);
    //wall[1].wf+=xk[k]*(-tmp1-q[k]-q[k]);
    q[k]+=tmp1;
						//wall force for bottom wall for k=7
	rho=rho_a[yi7][xi7];
    tmp=wall_force(xi7,yi7,rho,kk,u_bottom);
    //wall[0].wf+=xk[kk]*(-tmp-p[kk]-p[kk]);
    p[kk]+=tmp;


    //link 8
    k=8;
	kk=4;
    xi8=i;
    yi8=0;
    xo8=(i+1)%lx;
    yo8=ly-1;
    p=state_o[yi8][xi8].df;
    q=state_o[yo8][xo8].df;
    tmp=p[kk];
    p[kk]=q[k];
    q[k]=tmp;
                        //wall force for top wall for k=8
	rho=rho_a[yo8][xo8];
    tmp1=wall_force(xo8,yo8,rho,k,u_lid);
    //wall[1].wf+=xk[k]*(-tmp1-q[k]-q[k]);
    q[k]+=tmp1;
						//wall force for bottom wall for k=8
	rho=rho_a[yi8][xi8];
    tmp=wall_force(xi8,yi8,rho,kk,u_bottom);
    //wall[0].wf+=xk[kk]*(-tmp-p[kk]-p[kk]);
    p[kk]+=tmp;

    //link 6
    k=6;
	kk=2;
    xi6=i;
    yi6=0;
    xo6=(i-1+lx)%lx;
    yo6=ly-1;
    p=state_o[yi6][xi6].df;
    q=state_o[yo6][xo6].df;
    tmp=p[kk];
    p[kk]=q[k];
    q[k]=tmp;
                      //wall force for top wall for k=6
	rho=rho_a[yo6][xo6];
    tmp1=wall_force(xo6,yo6,rho,k,u_lid);
    //wall[1].wf+=xk[k]*(-tmp1-q[k]-q[k]);
    q[k]+=tmp1;
						//wall force for bottom wall for k=6
	rho=rho_a[yi6][xi6];
    tmp=wall_force(xi6,yi6,rho,kk,u_bottom);
    //wall[0].wf+=xk[kk]*(-tmp-p[kk]-p[kk]);
    p[kk]+=tmp;
  }

//******bounce back on left and right wall*********/
	for(j=0;j<ly;j++){

	//*****link 5*****/
    k=5;
	kk=1;
	xi5=0;
    yi5=j;
    xo5=lx-1;
    yo5=j;
    // p=[j][0].df
    // q=[j][lx-1]
    p=state_o[yi5][xi5].df;
    q=state_o[yo5][xo5].df;
    tmp=p[kk];
    p[kk]=q[k];
    q[k]=tmp;
                         //wall force for right wall for k=5
	rho=rho_a[yo5][xo5];
    tmp1=wall_force(xo5,yo5,rho,k,u_right);
    //wall[1].wf+=xk[k]*(-tmp1-q[k]-q[k]);
    q[k]+=tmp1;
						//wall force for left wall for k=5
	rho=rho_a[yi5][xi5];
    tmp=wall_force(xi5,yi5,rho,kk,u_left);
    //wall[0].wf+=xk[kk]*(-tmp-p[kk]-p[kk]);
    p[kk]+=tmp;


    //link 4
    // Ahmad added this if condition because we do not want to do this twice.
    if(j!=ly-1)
    {
    k=4;
	kk=8;
    xi4=0;
    yi4=j;
    xo4=lx-1;
    yo4=(j+1)%ly;
    // p=[j][0].df[8]
    // q=[j+1][lx-1].df[4]
    p=state_o[yi4][xi4].df;
    q=state_o[yo4][xo4].df;
    tmp=p[kk];
    p[kk]=q[k];
    q[k]=tmp;
                        //wall force for right wall for k=4
	rho=rho_a[yo4][xo4];
    tmp1=wall_force(xo4,yo4,rho,k,u_right);
    //wall[1].wf+=xk[k]*(-tmp1-q[k]-q[k]);
    q[k]+=tmp1;
						//wall force for left wall for k=4
	rho=rho_a[yi4][xi4];
    tmp=wall_force(xi4,yi4,rho,kk,u_left);
    //wall[0].wf+=xk[kk]*(-tmp-p[kk]-p[kk]);
    p[kk]+=tmp;
    }

    //link 6
    // Ahmad fixed this sequential code here by adding an if condition.
    // FIXME: Someone not sleepy should check this.
    if(j!=0)
    {
    k=6;
	kk=2;
    xi6=0;
    yi6=j;
    xo6=lx-1;
    yo6=(j-1+ly)%ly;
	// p=[j][0].df[2]
	// q=[j-1][lx-1].df[6]
    p=state_o[yi6][xi6].df;
    q=state_o[yo6][xo6].df;
    tmp=p[kk];
    p[kk]=q[k];
    q[k]=tmp;
                      //wall force for right wall for k=6
	rho=rho_a[yo6][xo6];
    tmp1=wall_force(xo6,yo6,rho,k,u_right);
    //wall[1].wf+=xk[k]*(-tmp1-q[k]-q[k]);
    q[k]+=tmp1;
						//wall force for left wall for k=6
	rho=rho_a[yi6][xi6];
    tmp=wall_force(xi6,yi6,rho,kk,u_left);
    //wall[0].wf+=xk[kk]*(-tmp-p[kk]-p[kk]);
    p[kk]+=tmp;
    }
  }

	return 0;
}