/** Calculate temperature of the LB fluid. * \param result Fluid temperature */ void lb_calc_fluid_temp(double *result) { int x, y, z, index; double local_rho, local_j2; double temp = 0.0; for (x=1; x<=lblattice.grid[0]; x++) { for (y=1; y<=lblattice.grid[1]; y++) { for (z=1; z<=lblattice.grid[2]; z++) { index = get_linear_index(x,y,z,lblattice.halo_grid); lb_calc_local_j(&lbfluid[index]); lb_calc_local_rho(&lbfluid[index]); local_rho = *lbfluid[index].rho; local_j2 = scalar(lbfluid[index].j,lbfluid[index].j); temp += local_j2; } } } temp *= 1./(lbpar.rho*lblattice.grid_volume*lbpar.tau*lbpar.tau*pow(lblattice.agrid,4)); MPI_Reduce(&temp, result, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); }
/** Caclulate mass of the LB fluid. * \param result Fluid mass */ void lb_calc_fluid_mass(double *result) { int x, y, z, index; double mass = 0.0; for (x=1; x<=lblattice.grid[0]; x++) { for (y=1; y<=lblattice.grid[1]; y++) { for (z=1; z<=lblattice.grid[2]; z++) { index = get_linear_index(x,y,z,lblattice.halo_grid); lb_calc_local_rho(&lbfluid[index]); mass += *lbfluid[index].rho; } } } MPI_Reduce(&mass, result, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); }
/** Caclulate mass of the LB fluid. * \param result Fluid mass */ void lb_calc_fluid_mass(double *result) { int x, y, z, index; double sum_rho=0.0, rho=0.0; for (x=1; x<=lblattice.grid[0]; x++) { for (y=1; y<=lblattice.grid[1]; y++) { for (z=1; z<=lblattice.grid[2]; z++) { index = get_linear_index(x,y,z,lblattice.halo_grid); lb_calc_local_rho(index,&rho); //fprintf(stderr,"(%d,%d,%d) %e\n",x,y,z,rho); sum_rho += rho; } } } MPI_Reduce(&sum_rho, result, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); }
/** Calculate a velocity profile for the LB fluid. */ void lb_calc_velocity_profile(double *velprof, int vcomp, int pdir, int x1, int x2) { int index, dir[3]; double local_rho, local_j; /* \todo generalize and parallelize */ dir[(pdir+1)%3] = x1; dir[(pdir+2)%3] = x2; for (dir[pdir]=1;dir[pdir]<=lblattice.grid[pdir];dir[pdir]++) { index = get_linear_index(dir[0],dir[1],dir[2],lblattice.halo_grid); lb_calc_local_j(&lbfluid[index]); lb_calc_local_rho(&lbfluid[index]); local_rho = *lbfluid[index].rho; local_j = lbfluid[index].j[vcomp]; if (local_j == 0) { velprof[dir[pdir]-1] = 0.0; } else { velprof[dir[pdir]-1] = local_j/local_rho * lblattice.agrid/lbpar.tau; } } }
/** Calculate a density profile of the fluid. */ void lb_calc_densprof(double *result, int *params) { int index, dir[3], grid[3]; int newroot=0, subrank, involved=0; double *profile; MPI_Comm slice_comm = NULL; MPI_Status status; if (this_node !=0) params = malloc(3*sizeof(int)); MPI_Bcast(params, 3, MPI_INT, 0, MPI_COMM_WORLD); int pdir = params[0]; int x1 = params[1]; int x2 = params[2]; dir[pdir] = 0; dir[(pdir+1)%3] = x1; dir[(pdir+2)%3] = x2; newroot = map_lattice_to_node(&lblattice, dir, grid); map_node_array(this_node, node_pos); if ( (grid[(pdir+1)%3] == node_pos[(pdir+1)%3]) && (grid[(pdir+2)%3] == node_pos[(pdir+2)%3]) ) { involved = 1; } MPI_Comm_split(MPI_COMM_WORLD, involved, this_node, &slice_comm); MPI_Comm_rank(slice_comm, &subrank); if (this_node == newroot) result = realloc(result,box_l[pdir]/lblattice.agrid*sizeof(double)); if (involved) { profile = malloc(lblattice.grid[pdir]*sizeof(double)); //dir[(pdir+1)%3] += 1; //dir[(pdir+2)%3] += 1; for (dir[pdir]=1;dir[pdir]<=lblattice.grid[pdir];dir[pdir]++) { index = get_linear_index(dir[0],dir[1],dir[2],lblattice.halo_grid); lb_calc_local_rho(index,&profile[dir[pdir]-1]); //profile[dir[pdir]-1] = *lbfluid[index].rho; //if (dir[pdir]==lblattice.grid[pdir]) { // int i; // fprintf(stderr,"(%d,%d,%d)\n",dir[0],dir[1],dir[2]); // fprintf(stderr,"%d\n",lbfluid[index].boundary); // for (i=0;i<lbmodel.n_veloc;i++) fprintf(stderr,"local_n[%p][%d]=%.12e\n",lbfluid[index].n,i,lbfluid[index].n[i]+lbmodel.coeff[i][0]*lbpar.rho); // fprintf(stderr,"local_rho=%e\n",*lbfluid[index].rho); //} } MPI_Gather(profile, lblattice.grid[pdir], MPI_DOUBLE, result, lblattice.grid[pdir], MPI_DOUBLE, 0, slice_comm); free(profile); } MPI_Comm_free(&slice_comm); if (newroot != 0) { if (this_node == newroot) { MPI_Send(result, lblattice.grid[pdir]*node_grid[pdir], MPI_DOUBLE, 0, REQ_DENSPROF, MPI_COMM_WORLD); free(result); } if (this_node == 0) { MPI_Recv(result, lblattice.grid[pdir]*node_grid[pdir], MPI_DOUBLE, newroot, REQ_DENSPROF, MPI_COMM_WORLD, &status); } } if (this_node != 0) free(params); }