PetscErrorCode DataExTopologyAddNeighbour(DataEx d,const PetscMPIInt proc_id) { PetscMPIInt n,found; PetscMPIInt nproc; PetscErrorCode ierr; PetscFunctionBegin; if (d->topology_status == DEOBJECT_FINALIZED) SETERRQ(d->comm, PETSC_ERR_ARG_WRONGSTATE, "Topology has been finalized. To modify or update call DataExTopologyInitialize() first"); else if (d->topology_status != DEOBJECT_INITIALIZED) SETERRQ(d->comm, PETSC_ERR_ARG_WRONGSTATE, "Topology must be intialised. Call DataExTopologyInitialize() first"); /* error on negative entries */ if (proc_id < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Trying to set proc neighbour with a rank < 0"); /* error on ranks larger than number of procs in communicator */ ierr = MPI_Comm_size(d->comm,&nproc);CHKERRQ(ierr); if (proc_id >= nproc) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Trying to set proc neighbour with a rank >= nproc"); if (d->n_neighbour_procs == 0) {ierr = PetscMalloc1(1, &d->neighbour_procs);CHKERRQ(ierr);} /* check for proc_id */ found = 0; for (n = 0; n < d->n_neighbour_procs; n++) { if (d->neighbour_procs[n] == proc_id) { found = 1; } } if (found == 0) { /* add it to list */ ierr = PetscRealloc(sizeof(PetscMPIInt)*(d->n_neighbour_procs+1), &d->neighbour_procs);CHKERRQ(ierr); d->neighbour_procs[ d->n_neighbour_procs ] = proc_id; d->n_neighbour_procs++; } PetscFunctionReturn(0); }
PetscErrorCode DMSwarmDataBucketRegisterField( DMSwarmDataBucket db, const char registration_function[], const char field_name[], size_t atomic_size, DMSwarmDataField *_gfield) { PetscBool val; DMSwarmDataField fp; PetscErrorCode ierr; PetscFunctionBegin; /* check we haven't finalised the registration of fields */ /* if(db->finalised==PETSC_TRUE) { printf("ERROR: DMSwarmDataBucketFinalize() has been called. Cannot register more fields\n"); ERROR(); } */ /* check for repeated name */ ierr = DMSwarmDataFieldStringInList(field_name, db->nfields, (const DMSwarmDataField*) db->field, &val);CHKERRQ(ierr); if (val == PETSC_TRUE) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Field %s already exists. Cannot add same field twice",field_name); /* create new space for data */ ierr = PetscRealloc(sizeof(DMSwarmDataField)*(db->nfields+1), &db->field);CHKERRQ(ierr); /* add field */ ierr = DMSwarmDataFieldCreate(registration_function, field_name, atomic_size, db->allocated, &fp);CHKERRQ(ierr); db->field[db->nfields] = fp; db->nfields++; if (_gfield != NULL) { *_gfield = fp; } PetscFunctionReturn(0); }
PetscErrorCode DMSwarmDataFieldSetSize(DMSwarmDataField df,const PetscInt new_L) { PetscErrorCode ierr; PetscFunctionBegin; if (new_L < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Cannot set size of DMSwarmDataField to be < 0"); if (new_L == df->L) PetscFunctionReturn(0); if (new_L > df->L) { ierr = PetscRealloc(df->atomic_size * (new_L), &df->data);CHKERRQ(ierr); /* init new contents */ ierr = PetscMemzero(( ((char*)df->data)+df->L*df->atomic_size), (new_L-df->L)*df->atomic_size);CHKERRQ(ierr); } else { /* reallocate pointer list, add +1 in case new_L = 0 */ ierr = PetscRealloc(df->atomic_size * (new_L+1), &df->data);CHKERRQ(ierr); } df->L = new_L; PetscFunctionReturn(0); }