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); } }
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; }