1 static char help[] = "Tests DMSwarm\n\n"; 2 3 #include <petscdm.h> 4 #include <petscdmda.h> 5 #include <petscdmswarm.h> 6 7 /* 8 Checks for variable blocksize 9 */ 10 PetscErrorCode ex2_1(void) 11 { 12 DM dms; 13 Vec x; 14 PetscMPIInt rank; 15 PetscInt p, bs, nlocal; 16 17 PetscFunctionBegin; 18 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 19 20 PetscCall(DMCreate(PETSC_COMM_WORLD, &dms)); 21 PetscCall(DMSetType(dms, DMSWARM)); 22 PetscCall(PetscObjectSetName((PetscObject)dms, "Particles")); 23 PetscCall(DMSwarmInitializeFieldRegister(dms)); 24 PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "viscosity", 1, PETSC_REAL)); 25 PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "strain", 3, PETSC_REAL)); 26 PetscCall(DMSwarmFinalizeFieldRegister(dms)); 27 PetscCall(DMSwarmSetLocalSizes(dms, 5 + rank, 4)); 28 PetscCall(DMView(dms, PETSC_VIEWER_STDOUT_WORLD)); 29 PetscCall(DMSwarmGetLocalSize(dms, &nlocal)); 30 31 { 32 PetscReal *array; 33 PetscCall(DMSwarmGetField(dms, "viscosity", &bs, NULL, (void **)&array)); 34 for (p = 0; p < nlocal; p++) array[p] = 11.1 + p * 0.1 + rank * 100.0; 35 PetscCall(DMSwarmRestoreField(dms, "viscosity", &bs, NULL, (void **)&array)); 36 } 37 38 { 39 PetscReal *array; 40 PetscCall(DMSwarmGetField(dms, "strain", &bs, NULL, (void **)&array)); 41 for (p = 0; p < nlocal; p++) { 42 array[bs * p + 0] = 2.0e-2 + p * 0.001 + rank * 1.0; 43 array[bs * p + 1] = 2.0e-2 + p * 0.002 + rank * 1.0; 44 array[bs * p + 2] = 2.0e-2 + p * 0.003 + rank * 1.0; 45 } 46 PetscCall(DMSwarmRestoreField(dms, "strain", &bs, NULL, (void **)&array)); 47 } 48 49 PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "viscosity", &x)); 50 PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD)); 51 PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "viscosity", &x)); 52 53 PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "strain", &x)); 54 PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD)); 55 PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "strain", &x)); 56 57 PetscCall(DMSwarmVectorDefineField(dms, "strain")); 58 PetscCall(DMCreateGlobalVector(dms, &x)); 59 PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD)); 60 PetscCall(VecDestroy(&x)); 61 PetscCall(DMDestroy(&dms)); 62 PetscFunctionReturn(PETSC_SUCCESS); 63 } 64 65 int main(int argc, char **argv) 66 { 67 PetscFunctionBeginUser; 68 PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 69 PetscCall(ex2_1()); 70 PetscCall(PetscFinalize()); 71 return 0; 72 } 73 74 /*TEST 75 76 test: 77 requires: !complex double 78 nsize: 3 79 filter: grep -v atomic 80 filter_output: grep -v atomic 81 82 TEST*/ 83