1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides a general mechanism to maintain a linked list of PETSc objects. 4e5c89e4eSSatish Balay This is used to allow PETSc objects to carry a list of "composed" objects 5e5c89e4eSSatish Balay */ 6d382aafbSBarry Smith #include "petscsys.h" 7e5c89e4eSSatish Balay 82bb46157SSatish Balay struct _n_PetscOList { 9e5c89e4eSSatish Balay char name[256]; 10e5c89e4eSSatish Balay PetscObject obj; 11e5c89e4eSSatish Balay PetscOList next; 12e5c89e4eSSatish Balay }; 13e5c89e4eSSatish Balay 14e5c89e4eSSatish Balay #undef __FUNCT__ 15e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListAdd" 16*1d0fab5eSBarry Smith /*@C 17*1d0fab5eSBarry Smith PetscOListAdd - Adds a new object to an PetscOList 18e5c89e4eSSatish Balay 19*1d0fab5eSBarry Smith Input Parameters: 20*1d0fab5eSBarry Smith + fl - the object list 21*1d0fab5eSBarry Smith . name - the name to use for the object 22*1d0fab5eSBarry Smith - obj - the object to attach 23e5c89e4eSSatish Balay 24*1d0fab5eSBarry Smith Notes: Replaces item if it is already in list. Removes item if you pass in a PETSC_NULL object. 25*1d0fab5eSBarry Smith 26*1d0fab5eSBarry Smith Use PetscOListFind() or PetscOListReverseFind() to get the object back 27*1d0fab5eSBarry Smith 28*1d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListFind(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 29*1d0fab5eSBarry Smith 30*1d0fab5eSBarry Smith @*/ 31e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListAdd(PetscOList *fl,const char name[],PetscObject obj) 32e5c89e4eSSatish Balay { 33e5c89e4eSSatish Balay PetscOList olist,nlist,prev; 34e5c89e4eSSatish Balay PetscErrorCode ierr; 35e5c89e4eSSatish Balay PetscTruth match; 36e5c89e4eSSatish Balay 37e5c89e4eSSatish Balay PetscFunctionBegin; 38e5c89e4eSSatish Balay 39e5c89e4eSSatish Balay if (!obj) { /* this means remove from list if it is there */ 40e5c89e4eSSatish Balay nlist = *fl; prev = 0; 41e5c89e4eSSatish Balay while (nlist) { 42e5c89e4eSSatish Balay ierr = PetscStrcmp(name,nlist->name,&match);CHKERRQ(ierr); 43e5c89e4eSSatish Balay if (match) { /* found it already in the list */ 44e5c89e4eSSatish Balay ierr = PetscObjectDereference(nlist->obj);CHKERRQ(ierr); 45e5c89e4eSSatish Balay if (prev) prev->next = nlist->next; 46e5c89e4eSSatish Balay else if (nlist->next) { 47e5c89e4eSSatish Balay *fl = nlist->next; 48e5c89e4eSSatish Balay } else { 49e5c89e4eSSatish Balay *fl = 0; 50e5c89e4eSSatish Balay } 51e5c89e4eSSatish Balay ierr = PetscFree(nlist);CHKERRQ(ierr); 52e5c89e4eSSatish Balay PetscFunctionReturn(0); 53e5c89e4eSSatish Balay } 54e5c89e4eSSatish Balay prev = nlist; 55e5c89e4eSSatish Balay nlist = nlist->next; 56e5c89e4eSSatish Balay } 57e5c89e4eSSatish Balay PetscFunctionReturn(0); /* did not find it to remove */ 58e5c89e4eSSatish Balay } 59e5c89e4eSSatish Balay /* look for it already in list */ 60e5c89e4eSSatish Balay nlist = *fl; 61e5c89e4eSSatish Balay while (nlist) { 62e5c89e4eSSatish Balay ierr = PetscStrcmp(name,nlist->name,&match);CHKERRQ(ierr); 63e5c89e4eSSatish Balay if (match) { /* found it in the list */ 64e5c89e4eSSatish Balay ierr = PetscObjectReference(obj);CHKERRQ(ierr); 657dcf0eaaSdalcinl ierr = PetscObjectDereference(nlist->obj);CHKERRQ(ierr); 66e5c89e4eSSatish Balay nlist->obj = obj; 67e5c89e4eSSatish Balay PetscFunctionReturn(0); 68e5c89e4eSSatish Balay } 69e5c89e4eSSatish Balay nlist = nlist->next; 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay 72e5c89e4eSSatish Balay /* add it to list, because it was not already there */ 73e5c89e4eSSatish Balay 742bb46157SSatish Balay ierr = PetscNew(struct _n_PetscOList,&olist);CHKERRQ(ierr); 75e5c89e4eSSatish Balay olist->next = 0; 76e5c89e4eSSatish Balay olist->obj = obj; 77e5c89e4eSSatish Balay ierr = PetscObjectReference(obj);CHKERRQ(ierr); 78e5c89e4eSSatish Balay ierr = PetscStrcpy(olist->name,name);CHKERRQ(ierr); 79e5c89e4eSSatish Balay 80e5c89e4eSSatish Balay if (!*fl) { 81e5c89e4eSSatish Balay *fl = olist; 82e5c89e4eSSatish Balay } else { /* go to end of list */ 83e5c89e4eSSatish Balay nlist = *fl; 84e5c89e4eSSatish Balay while (nlist->next) { 85e5c89e4eSSatish Balay nlist = nlist->next; 86e5c89e4eSSatish Balay } 87e5c89e4eSSatish Balay nlist->next = olist; 88e5c89e4eSSatish Balay } 89e5c89e4eSSatish Balay PetscFunctionReturn(0); 90e5c89e4eSSatish Balay } 91e5c89e4eSSatish Balay 92e5c89e4eSSatish Balay #undef __FUNCT__ 93e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDestroy" 94*1d0fab5eSBarry Smith /*@C 95e5c89e4eSSatish Balay PetscOListDestroy - Destroy a list of objects 96e5c89e4eSSatish Balay 97e5c89e4eSSatish Balay Input Parameter: 98e5c89e4eSSatish Balay . fl - pointer to list 99*1d0fab5eSBarry Smith 100*1d0fab5eSBarry Smith .seealso: PetscOListAdd(), PetscOListFind(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 101*1d0fab5eSBarry Smith 102*1d0fab5eSBarry Smith @*/ 1039c666560SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOListDestroy(PetscOList fl) 104e5c89e4eSSatish Balay { 1059c666560SBarry Smith PetscOList tmp; 106e5c89e4eSSatish Balay PetscErrorCode ierr; 107e5c89e4eSSatish Balay 108e5c89e4eSSatish Balay PetscFunctionBegin; 1099c666560SBarry Smith while (fl) { 1109c666560SBarry Smith tmp = fl->next; 1119c666560SBarry Smith ierr = PetscObjectDereference(fl->obj);CHKERRQ(ierr); 1129c666560SBarry Smith ierr = PetscFree(fl);CHKERRQ(ierr); 1139c666560SBarry Smith fl = tmp; 114e5c89e4eSSatish Balay } 115e5c89e4eSSatish Balay PetscFunctionReturn(0); 116e5c89e4eSSatish Balay } 117e5c89e4eSSatish Balay 118e5c89e4eSSatish Balay 119e5c89e4eSSatish Balay #undef __FUNCT__ 120e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListFind" 121*1d0fab5eSBarry Smith /*@C 122e5c89e4eSSatish Balay PetscOListFind - givn a name, find the matching object 123e5c89e4eSSatish Balay 124e5c89e4eSSatish Balay Input Parameters: 125e5c89e4eSSatish Balay + fl - pointer to list 126e5c89e4eSSatish Balay - name - name string 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay Output Parameters: 129e5c89e4eSSatish Balay . ob - the PETSc object 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay Notes: 132e5c89e4eSSatish Balay The name must have been registered with the PetscOListAdd() before calling this 133e5c89e4eSSatish Balay routine. 134e5c89e4eSSatish Balay 135*1d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 136e5c89e4eSSatish Balay 137*1d0fab5eSBarry Smith @*/ 138e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListFind(PetscOList fl,const char name[],PetscObject *obj) 139e5c89e4eSSatish Balay { 140e5c89e4eSSatish Balay PetscErrorCode ierr; 141e5c89e4eSSatish Balay PetscTruth match; 142e5c89e4eSSatish Balay 143e5c89e4eSSatish Balay PetscFunctionBegin; 144e5c89e4eSSatish Balay 145e5c89e4eSSatish Balay *obj = 0; 146e5c89e4eSSatish Balay while (fl) { 147e5c89e4eSSatish Balay ierr = PetscStrcmp(name,fl->name,&match);CHKERRQ(ierr); 148e5c89e4eSSatish Balay if (match) { 149e5c89e4eSSatish Balay *obj = fl->obj; 150e5c89e4eSSatish Balay break; 151e5c89e4eSSatish Balay } 152e5c89e4eSSatish Balay fl = fl->next; 153e5c89e4eSSatish Balay } 154e5c89e4eSSatish Balay PetscFunctionReturn(0); 155e5c89e4eSSatish Balay } 156e5c89e4eSSatish Balay 157e5c89e4eSSatish Balay #undef __FUNCT__ 158e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListReverseFind" 159*1d0fab5eSBarry Smith /*@C 160e5c89e4eSSatish Balay PetscOListReverseFind - given a object, find the matching name if it exists 161e5c89e4eSSatish Balay 162e5c89e4eSSatish Balay Input Parameters: 163e5c89e4eSSatish Balay + fl - pointer to list 164e5c89e4eSSatish Balay - ob - the PETSc object 165e5c89e4eSSatish Balay 166e5c89e4eSSatish Balay Output Parameters: 167e5c89e4eSSatish Balay . name - name string 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay Notes: 170e5c89e4eSSatish Balay The name must have been registered with the PetscOListAdd() before calling this 171e5c89e4eSSatish Balay routine. 172e5c89e4eSSatish Balay 173*1d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListDuplicate(), PetscOListFind(), PetscOListDuplicate() 174e5c89e4eSSatish Balay 175*1d0fab5eSBarry Smith @*/ 176e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListReverseFind(PetscOList fl,PetscObject obj,char **name) 177e5c89e4eSSatish Balay { 178e5c89e4eSSatish Balay PetscFunctionBegin; 179e5c89e4eSSatish Balay 180e5c89e4eSSatish Balay *name = 0; 181e5c89e4eSSatish Balay while (fl) { 182e5c89e4eSSatish Balay if (fl->obj == obj) { 183e5c89e4eSSatish Balay *name = fl->name; 184e5c89e4eSSatish Balay break; 185e5c89e4eSSatish Balay } 186e5c89e4eSSatish Balay fl = fl->next; 187e5c89e4eSSatish Balay } 188e5c89e4eSSatish Balay PetscFunctionReturn(0); 189e5c89e4eSSatish Balay } 190e5c89e4eSSatish Balay 191e5c89e4eSSatish Balay #undef __FUNCT__ 192e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDuplicate" 193*1d0fab5eSBarry Smith /*@C 194e5c89e4eSSatish Balay PetscOListDuplicate - Creates a new list from a give object list. 195e5c89e4eSSatish Balay 196e5c89e4eSSatish Balay Input Parameters: 197e5c89e4eSSatish Balay . fl - pointer to list 198e5c89e4eSSatish Balay 199e5c89e4eSSatish Balay Output Parameters: 200e5c89e4eSSatish Balay . nl - the new list (should point to 0 to start, otherwise appends) 201e5c89e4eSSatish Balay 202*1d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListReverseFind(), PetscOListFind(), PetscOListDuplicate() 203e5c89e4eSSatish Balay 204*1d0fab5eSBarry Smith @*/ 205e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListDuplicate(PetscOList fl,PetscOList *nl) 206e5c89e4eSSatish Balay { 207e5c89e4eSSatish Balay PetscErrorCode ierr; 208e5c89e4eSSatish Balay 209e5c89e4eSSatish Balay PetscFunctionBegin; 210e5c89e4eSSatish Balay while (fl) { 211e5c89e4eSSatish Balay ierr = PetscOListAdd(nl,fl->name,fl->obj);CHKERRQ(ierr); 212e5c89e4eSSatish Balay fl = fl->next; 213e5c89e4eSSatish Balay } 214e5c89e4eSSatish Balay PetscFunctionReturn(0); 215e5c89e4eSSatish Balay } 216e5c89e4eSSatish Balay 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay 219e5c89e4eSSatish Balay 220e5c89e4eSSatish Balay 221