1 static char help[] = "Tests for DMLabel lookup\n\n"; 2 3 #include <petscdmplex.h> 4 5 typedef struct { 6 PetscInt debug; /* The debugging level */ 7 PetscInt pStart, pEnd; /* The label chart */ 8 PetscInt numStrata; /* The number of label strata */ 9 PetscReal fill; /* Percentage of label to fill */ 10 PetscInt size; /* The number of set values */ 11 } AppCtx; 12 13 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 14 { 15 PetscErrorCode ierr; 16 17 PetscFunctionBegin; 18 options->debug = 0; 19 options->pStart = 0; 20 options->pEnd = 1000; 21 options->numStrata = 5; 22 options->fill = 0.10; 23 24 ierr = PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");CHKERRQ(ierr); 25 ierr = PetscOptionsBoundedInt("-debug", "The debugging level", "ex6.c", options->debug, &options->debug, NULL,0);CHKERRQ(ierr); 26 ierr = PetscOptionsBoundedInt("-num_strata", "The number of label values", "ex6.c", options->numStrata, &options->numStrata, NULL,0);CHKERRQ(ierr); 27 ierr = PetscOptionsBoundedInt("-pend", "The label point limit", "ex6.c", options->pEnd, &options->pEnd, NULL,0);CHKERRQ(ierr); 28 ierr = PetscOptionsReal("-fill", "The percentage of label chart to set", "ex6.c", options->fill, &options->fill, NULL);CHKERRQ(ierr); 29 ierr = PetscOptionsEnd(); 30 PetscFunctionReturn(0); 31 } 32 33 PetscErrorCode TestSetup(DMLabel label, AppCtx *user) 34 { 35 PetscRandom r; 36 PetscInt n = (PetscInt) (user->fill*(user->pEnd - user->pStart)), i; 37 PetscErrorCode ierr; 38 39 PetscFunctionBegin; 40 ierr = PetscRandomCreate(PETSC_COMM_SELF, &r);CHKERRQ(ierr); 41 ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);/* -random_type <> */ 42 ierr = PetscRandomSetInterval(r, user->pStart, user->pEnd);CHKERRQ(ierr); 43 ierr = PetscRandomSetSeed(r, 123456789L);CHKERRQ(ierr); 44 ierr = PetscRandomSeed(r);CHKERRQ(ierr); 45 user->size = 0; 46 for(i = 0; i < n; ++i) { 47 PetscReal p; 48 PetscInt val; 49 50 ierr = PetscRandomGetValueReal(r, &p);CHKERRQ(ierr); 51 ierr = DMLabelGetValue(label, (PetscInt) p, &val);CHKERRQ(ierr); 52 if (val < 0) { 53 ++user->size; 54 ierr = DMLabelSetValue(label, (PetscInt) p, i % user->numStrata);CHKERRQ(ierr); 55 } 56 } 57 ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); 58 ierr = DMLabelCreateIndex(label, user->pStart, user->pEnd);CHKERRQ(ierr); 59 ierr = PetscPrintf(PETSC_COMM_SELF, "Created label with chart [%D, %D) and set %D values\n", user->pStart, user->pEnd, user->size);CHKERRQ(ierr); 60 PetscFunctionReturn(0); 61 } 62 63 PetscErrorCode TestLookup(DMLabel label, AppCtx *user) 64 { 65 const PetscInt pStart = user->pStart; 66 const PetscInt pEnd = user->pEnd; 67 PetscInt p, n = 0; 68 PetscErrorCode ierr; 69 70 PetscFunctionBegin; 71 for(p = pStart; p < pEnd; ++p) { 72 PetscInt val; 73 PetscBool has; 74 75 ierr = DMLabelGetValue(label, p, &val);CHKERRQ(ierr); 76 ierr = DMLabelHasPoint(label, p, &has);CHKERRQ(ierr); 77 if (((val >= 0) && !has) || ((val < 0) && has)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Label value %D does not match contains check %D for point %D", val, (PetscInt) has, p); 78 if (has) ++n; 79 } 80 if (n != user->size) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of label points detected %D does not match number set %D", n, user->size); 81 /* Also put in timing code */ 82 PetscFunctionReturn(0); 83 } 84 85 PetscErrorCode TestClear(DMLabel label, AppCtx *user) 86 { 87 PetscInt pStart = user->pStart, pEnd = user->pEnd, p; 88 PetscInt defaultValue; 89 PetscErrorCode ierr; 90 91 PetscFunctionBegin; 92 ierr = DMLabelGetDefaultValue(label,&defaultValue);CHKERRQ(ierr); 93 for (p = pStart; p < pEnd; p++) { 94 PetscInt val; 95 PetscBool hasPoint; 96 97 ierr = DMLabelGetValue(label,p,&val);CHKERRQ(ierr); 98 if (val != defaultValue) { 99 ierr = DMLabelClearValue(label,p,val);CHKERRQ(ierr); 100 } 101 ierr = DMLabelGetValue(label,p,&val);CHKERRQ(ierr); 102 ierr = DMLabelHasPoint(label,p,&hasPoint);CHKERRQ(ierr); 103 if (val != defaultValue) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Expected default value %D after clearing point %D, got %D",defaultValue,p,val); 104 if (hasPoint) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Label contains %D after clearing",p); 105 } 106 PetscFunctionReturn(0); 107 } 108 109 int main(int argc, char **argv) 110 { 111 DMLabel label; 112 AppCtx user; /* user-defined work context */ 113 PetscErrorCode ierr; 114 115 ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr; 116 ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr); 117 ierr = DMLabelCreate(PETSC_COMM_SELF, "Test Label", &label);CHKERRQ(ierr); 118 ierr = TestSetup(label, &user);CHKERRQ(ierr); 119 ierr = TestLookup(label, &user);CHKERRQ(ierr); 120 ierr = TestClear(label,&user);CHKERRQ(ierr); 121 ierr = DMLabelDestroy(&label);CHKERRQ(ierr); 122 ierr = PetscFinalize(); 123 return ierr; 124 } 125 126 /*TEST 127 128 test: 129 suffix: 0 130 args: -malloc_dump 131 test: 132 suffix: 1 133 args: -malloc_dump -pend 10000 134 test: 135 suffix: 2 136 args: -malloc_dump -pend 10000 -fill 0.05 137 test: 138 suffix: 3 139 args: -malloc_dump -pend 10000 -fill 0.25 140 141 TEST*/ 142