//int Lattice::init(double *agrid, double* offset, int halo_size, size_t dim) { int Lattice::init(double *agrid, double* offset, int halo_size, size_t dim) { this->dim=dim; /* determine the number of local lattice nodes */ for (int d=0; d<3; d++) { this->agrid[d] = agrid[d]; this->global_grid[d] = (int)dround(box_l[d]/agrid[d]); this->offset[d]=offset[d]; this->local_index_offset[d]=(int) ceil((my_left[d]-this->offset[d])/this->agrid[d]); this->local_offset[d] = this->offset[d] + this->local_index_offset[d]*this->agrid[d]; this->grid[d] = (int) ceil ( ( my_right[d] - this->local_offset[d]-ROUND_ERROR_PREC ) / this->agrid[d]); } // sanity checks for (int dir=0;dir<3;dir++) { // check if local_box_l is compatible with lattice spacing if (fabs(local_box_l[dir]-this->grid[dir]*agrid[dir]) > ROUND_ERROR_PREC*box_l[dir]) { char *errtxt = runtime_error(256); ERROR_SPRINTF(errtxt, \ "{097 Lattice spacing agrid[%d]=%f " \ "is incompatible with local_box_l[%d]=%f " \ "(box_l[%d]=%f node_grid[%d]=%d)} ", \ dir, agrid[dir], \ dir, local_box_l[dir], \ dir, box_l[dir], \ dir, node_grid[dir]); } } this->element_size = this->dim*sizeof(double); LATTICE_TRACE(fprintf(stderr,"%d: box_l (%.3f,%.3f,%.3f) grid (%d,%d,%d) node_neighbors (%d,%d,%d,%d,%d,%d)\n",this_node,local_box_l[0],local_box_l[1],local_box_l[2],this->grid[0],this->grid[1],this->grid[2],node_neighbors[0],node_neighbors[1],node_neighbors[2],node_neighbors[3],node_neighbors[4],node_neighbors[5])); this->halo_size = halo_size; /* determine the number of total nodes including halo */ this->halo_grid[0] = this->grid[0] + 2*halo_size ; this->halo_grid[1] = this->grid[1] + 2*halo_size ; this->halo_grid[2] = this->grid[2] + 2*halo_size ; this->grid_volume = this->grid[0]*this->grid[1]*this->grid[2] ; this->halo_grid_volume = this->halo_grid[0]*this->halo_grid[1]*this->halo_grid[2] ; this->halo_grid_surface = this->halo_grid_volume - this->grid_volume ; this->halo_offset = get_linear_index(halo_size,halo_size,halo_size,this->halo_grid) ; this->interpolation_type = INTERPOLATION_LINEAR; allocate_memory(); return ES_OK; }
/** Initialize lattice. * * This function initializes the variables describing the lattice * layout. Important: The lattice data is <em>not</em> allocated here! * * \param lattice pointer to the lattice * \param agrid lattice spacing * \param tau time step for lattice dynamics */ void init_lattice(Lattice *lattice, double agrid, double tau) { int dir; /* determine the number of local lattice nodes */ lattice->grid[0] = local_box_l[0]/agrid; lattice->grid[1] = local_box_l[1]/agrid; lattice->grid[2] = local_box_l[2]/agrid; /* sanity checks */ for (dir=0;dir<3;dir++) { /* check if local_box_l is compatible with lattice spacing */ if (fabs(local_box_l[dir]-lattice->grid[dir]*agrid) > ROUND_ERROR_PREC*box_l[dir]) { char *errtxt = runtime_error(128); ERROR_SPRINTF(errtxt, "{097 Lattice spacing agrid=%f is incompatible with local_box_l[%d]=%f (box_l[%d]=%f node_grid[%d]=%d) %f} ",agrid,dir,local_box_l[dir],dir,box_l[dir],dir,node_grid[dir],local_box_l[dir]-lattice->grid[dir]*agrid); return; } } /* set the lattice spacing */ lattice->agrid = agrid ; lattice->tau = tau ; LATTICE_TRACE(fprintf(stderr,"%d: box_l (%.3f,%.3f,%.3f) grid (%d,%d,%d) node_neighbors (%d,%d,%d,%d,%d,%d)\n",this_node,local_box_l[0],local_box_l[1],local_box_l[2],lattice->grid[0],lattice->grid[1],lattice->grid[2],node_neighbors[0],node_neighbors[1],node_neighbors[2],node_neighbors[3],node_neighbors[4],node_neighbors[5])); /* determine the number of total nodes including halo */ lattice->halo_grid[0] = lattice->grid[0] + 2 ; lattice->halo_grid[1] = lattice->grid[1] + 2 ; lattice->halo_grid[2] = lattice->grid[2] + 2 ; lattice->grid_volume = lattice->grid[0]*lattice->grid[1]*lattice->grid[2] ; lattice->halo_grid_volume = lattice->halo_grid[0]*lattice->halo_grid[1]*lattice->halo_grid[2] ; lattice->halo_grid_surface = lattice->halo_grid_volume - lattice->grid_volume ; lattice->halo_offset = get_linear_index(1,1,1,lattice->halo_grid) ; }