PetscErrorCode DMCreateFieldDecomposition_Composite(DM dm, PetscInt *len,char ***namelist, IS **islist, DM** dmlist) { PetscInt nDM; PetscInt i; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMCreateFieldIS_Composite(dm, len, namelist, islist);CHKERRQ(ierr); if (dmlist) { ierr = DMCompositeGetNumberDM(dm, &nDM);CHKERRQ(ierr); ierr = PetscMalloc(nDM*sizeof(DM), dmlist);CHKERRQ(ierr); ierr = DMCompositeGetEntriesArray(dm, *dmlist);CHKERRQ(ierr); for (i=0; i<nDM; i++) { ierr = PetscObjectReference((PetscObject)((*dmlist)[i]));CHKERRQ(ierr); } } PetscFunctionReturn(0); }
PetscErrorCode DMCreateFieldIS_Composite(DM dm, PetscInt *numFields,char ***fieldNames, IS **fields) { PetscInt nDM; DM *dms; PetscInt i; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMCompositeGetNumberDM(dm, &nDM);CHKERRQ(ierr); if (numFields) {*numFields = nDM;} ierr = DMCompositeGetGlobalISs(dm, fields);CHKERRQ(ierr); if (fieldNames) { ierr = PetscMalloc(nDM*sizeof(DM), &dms);CHKERRQ(ierr); ierr = PetscMalloc(nDM*sizeof(const char *), fieldNames);CHKERRQ(ierr); ierr = DMCompositeGetEntriesArray(dm, dms);CHKERRQ(ierr); for (i=0; i<nDM; i++) { char buf[256]; const char *splitname; /* Split naming precedence: object name, prefix, number */ splitname = ((PetscObject) dm)->name; if (!splitname) { ierr = PetscObjectGetOptionsPrefix((PetscObject)dms[i],&splitname);CHKERRQ(ierr); if (splitname) { size_t len; ierr = PetscStrncpy(buf,splitname,sizeof(buf));CHKERRQ(ierr); buf[sizeof(buf) - 1] = 0; ierr = PetscStrlen(buf,&len);CHKERRQ(ierr); if (buf[len-1] == '_') buf[len-1] = 0; /* Remove trailing underscore if it was used */ splitname = buf; } } if (!splitname) { ierr = PetscSNPrintf(buf,sizeof(buf),"%D",i);CHKERRQ(ierr); splitname = buf; } ierr = PetscStrallocpy(splitname,&(*fieldNames)[i]);CHKERRQ(ierr); } ierr = PetscFree(dms);CHKERRQ(ierr); } PetscFunctionReturn(0); }
void PETSC_STDCALL dmcompositegetentriesarray_(DM dm,DM dms[], int *__ierr ){ *__ierr = DMCompositeGetEntriesArray( (DM)PetscToPointer((dm) ),dms); }