157795646SDave May 257795646SDave May #define PETSCDM_DLL 357795646SDave May #include <petsc/private/dmswarmimpl.h> /*I "petscdmswarm.h" I*/ 4b62e03f8SDave May #include "data_bucket.h" 557795646SDave May 6*dcf43ee8SDave May PetscErrorCode DMSwarmMigrate_Push_Basic(DM dm,PetscBool remove_sent_points); 7*dcf43ee8SDave May 8*dcf43ee8SDave May 957795646SDave May //typedef PetscErrorCode (*swarm_project)(DM,DM,Vec) DMSwarmProjectMethod; /* swarm, geometry, result */ 1057795646SDave May 1157795646SDave May //typedef enum { PROJECT_DMDA_AQ1=0, PROJECT_DMDA_P0 } DMSwarmDMDAProjectionType; 1257795646SDave May 1357795646SDave May #if 0 1457795646SDave May 1557795646SDave May /* Defines what the local space will be */ 16b62e03f8SDave May PetscErrorCode DMSwarmSetOverlap(void) 1757795646SDave May { 1857795646SDave May 19b62e03f8SDave May PetscFunctionReturn(0); 2057795646SDave May } 2157795646SDave May 2257795646SDave May 2357795646SDave May /* coordinates */ 2457795646SDave May /* 2557795646SDave May DMGetCoordinateDM returns self 2657795646SDave May DMGetCoordinates and DMGetCoordinatesLocal return same thing 2757795646SDave May Local view could be used to define overlapping information 2857795646SDave May */ 2957795646SDave May 3057795646SDave May #endif 3157795646SDave May 3257795646SDave May #undef __FUNCT__ 33b5bcf523SDave May #define __FUNCT__ "DMSwarmVectorDefineField" 34b5bcf523SDave May PETSC_EXTERN PetscErrorCode DMSwarmVectorDefineField(DM dm,const char fieldname[]) 35b5bcf523SDave May { 36b5bcf523SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 37b5bcf523SDave May PetscErrorCode ierr; 38b5bcf523SDave May PetscInt bs,n; 39b5bcf523SDave May PetscScalar *array; 40b5bcf523SDave May PetscDataType type; 41b5bcf523SDave May 423454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 436845f8f5SDave May ierr = DataBucketGetSizes(swarm->db,&n,NULL,NULL);CHKERRQ(ierr); 44b5bcf523SDave May ierr = DMSwarmGetField(dm,fieldname,&bs,&type,(void**)&array);CHKERRQ(ierr); 45b5bcf523SDave May 46b5bcf523SDave May /* Check all fields are of type PETSC_REAL or PETSC_SCALAR */ 47b5bcf523SDave May if (type != PETSC_REAL) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only valid for PETSC_REAL"); 48b5bcf523SDave May 49b5bcf523SDave May PetscSNPrintf(swarm->vec_field_name,PETSC_MAX_PATH_LEN-1,"%s",fieldname); 50b5bcf523SDave May swarm->vec_field_set = PETSC_TRUE; 51b5bcf523SDave May swarm->vec_field_bs = 1;//bs; 52b5bcf523SDave May swarm->vec_field_nlocal = n; 53*dcf43ee8SDave May ierr = DMSwarmRestoreField(dm,fieldname,&bs,&type,(void**)&array);CHKERRQ(ierr); 54b5bcf523SDave May 55b5bcf523SDave May PetscFunctionReturn(0); 56b5bcf523SDave May } 57b5bcf523SDave May 58b5bcf523SDave May /* requires DMSwarmDefineFieldVector has been called */ 59b5bcf523SDave May #undef __FUNCT__ 60b5bcf523SDave May #define __FUNCT__ "DMCreateGlobalVector_Swarm" 61b5bcf523SDave May PetscErrorCode DMCreateGlobalVector_Swarm(DM dm,Vec *vec) 62b5bcf523SDave May { 63b5bcf523SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 64b5bcf523SDave May PetscErrorCode ierr; 65b5bcf523SDave May Vec x; 66b5bcf523SDave May char name[PETSC_MAX_PATH_LEN]; 67b5bcf523SDave May 683454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 69b5bcf523SDave May if (!swarm->vec_field_set) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Must call DMSwarmVectorDefineField first"); 70b5bcf523SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarmField_%s",swarm->vec_field_name); 71b5bcf523SDave May ierr = VecCreate(PetscObjectComm((PetscObject)dm),&x);CHKERRQ(ierr); 72b5bcf523SDave May ierr = PetscObjectSetName((PetscObject)x,name);CHKERRQ(ierr); 73*dcf43ee8SDave May ierr = VecSetSizes(x,swarm->db->L,PETSC_DETERMINE);CHKERRQ(ierr); 74b5bcf523SDave May ierr = VecSetBlockSize(x,swarm->vec_field_bs);CHKERRQ(ierr); 75b5bcf523SDave May ierr = VecSetFromOptions(x);CHKERRQ(ierr); 76b5bcf523SDave May *vec = x; 77b5bcf523SDave May 78b5bcf523SDave May PetscFunctionReturn(0); 79b5bcf523SDave May } 80b5bcf523SDave May 81b5bcf523SDave May /* requires DMSwarmDefineFieldVector has been called */ 82b5bcf523SDave May #undef __FUNCT__ 83b5bcf523SDave May #define __FUNCT__ "DMCreateLocalVector_Swarm" 84b5bcf523SDave May PetscErrorCode DMCreateLocalVector_Swarm(DM dm,Vec *vec) 85b5bcf523SDave May { 86b5bcf523SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 87b5bcf523SDave May PetscErrorCode ierr; 88b5bcf523SDave May Vec x; 89b5bcf523SDave May char name[PETSC_MAX_PATH_LEN]; 90b5bcf523SDave May 913454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 92b5bcf523SDave May if (!swarm->vec_field_set) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Must call DMSwarmVectorDefineField first"); 93b5bcf523SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarmField_%s",swarm->vec_field_name); 94b5bcf523SDave May ierr = VecCreate(PETSC_COMM_SELF,&x);CHKERRQ(ierr); 95b5bcf523SDave May ierr = PetscObjectSetName((PetscObject)x,name);CHKERRQ(ierr); 96*dcf43ee8SDave May ierr = VecSetSizes(x,swarm->db->L,swarm->db->L);CHKERRQ(ierr); 97b5bcf523SDave May ierr = VecSetBlockSize(x,swarm->vec_field_bs);CHKERRQ(ierr); 98b5bcf523SDave May ierr = VecSetFromOptions(x);CHKERRQ(ierr); 99b5bcf523SDave May *vec = x; 100b5bcf523SDave May 101b5bcf523SDave May PetscFunctionReturn(0); 102b5bcf523SDave May } 103b5bcf523SDave May 104b5bcf523SDave May #undef __FUNCT__ 105b5bcf523SDave May #define __FUNCT__ "DMSwarmCreateGlobalVectorFromField" 106b5bcf523SDave May PETSC_EXTERN PetscErrorCode DMSwarmCreateGlobalVectorFromField(DM dm,const char fieldname[],Vec *vec) 107b5bcf523SDave May { 108b5bcf523SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 109b5bcf523SDave May PetscErrorCode ierr; 110b5bcf523SDave May PetscInt bs,n; 111b5bcf523SDave May PetscScalar *array; 112b5bcf523SDave May Vec x; 113b5bcf523SDave May PetscDataType type; 114b5bcf523SDave May char name[PETSC_MAX_PATH_LEN]; 1153454631fSDave May PetscMPIInt commsize; 116b5bcf523SDave May 1173454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 1186845f8f5SDave May ierr = DataBucketGetSizes(swarm->db,&n,NULL,NULL);CHKERRQ(ierr); 119b5bcf523SDave May ierr = DMSwarmGetField(dm,fieldname,&bs,&type,(void**)&array);CHKERRQ(ierr); 120b5bcf523SDave May 121b5bcf523SDave May /* Check all fields are of type PETSC_REAL or PETSC_SCALAR */ 122b5bcf523SDave May if (type != PETSC_REAL) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only valid for PETSC_REAL"); 123b5bcf523SDave May 1243454631fSDave May ierr = MPI_Comm_size(PetscObjectComm((PetscObject)dm),&commsize);CHKERRQ(ierr); 1253454631fSDave May if (commsize == 1) { 126b5bcf523SDave May ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)dm),1,n,array,&x);CHKERRQ(ierr); 1273454631fSDave May } else { 1283454631fSDave May ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)dm),1,n,PETSC_DETERMINE,array,&x);CHKERRQ(ierr); 1293454631fSDave May } 130*dcf43ee8SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarmSharedField_%s",swarm->vec_field_name); 131*dcf43ee8SDave May ierr = PetscObjectSetName((PetscObject)x,name);CHKERRQ(ierr); 132b5bcf523SDave May 133b5bcf523SDave May /* Set guard */ 134*dcf43ee8SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarm_VecFieldInPlace_%s",fieldname); 135*dcf43ee8SDave May ierr = PetscObjectComposeFunction((PetscObject)x,name,DMSwarmDestroyGlobalVectorFromField);CHKERRQ(ierr); 136b5bcf523SDave May 137b5bcf523SDave May *vec = x; 138b5bcf523SDave May PetscFunctionReturn(0); 139b5bcf523SDave May } 140b5bcf523SDave May 141b5bcf523SDave May #undef __FUNCT__ 142b5bcf523SDave May #define __FUNCT__ "DMSwarmDestroyGlobalVectorFromField" 143b5bcf523SDave May PETSC_EXTERN PetscErrorCode DMSwarmDestroyGlobalVectorFromField(DM dm,const char fieldname[],Vec *vec) 144b5bcf523SDave May { 145b5bcf523SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 146b5bcf523SDave May PetscErrorCode ierr; 147b5bcf523SDave May DataField gfield; 148b5bcf523SDave May char name[PETSC_MAX_PATH_LEN]; 149b5bcf523SDave May void (*fptr)(void); 150b5bcf523SDave May 151b5bcf523SDave May /* get data field */ 1522eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 153b5bcf523SDave May 154b5bcf523SDave May /* check vector is an inplace array */ 155b5bcf523SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarm_VecFieldInPlace_%s",fieldname); 156b5bcf523SDave May ierr = PetscObjectQueryFunction((PetscObject)(*vec),name,&fptr);CHKERRQ(ierr); 157b5bcf523SDave May if (!fptr) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Vector being destroyed was not created from DMSwarm field(%s)",fieldname); 158b5bcf523SDave May 159b5bcf523SDave May /* restore data field */ 1606845f8f5SDave May ierr = DataFieldRestoreAccess(gfield);CHKERRQ(ierr); 161b5bcf523SDave May 162b5bcf523SDave May ierr = VecDestroy(vec);CHKERRQ(ierr); 163b5bcf523SDave May 164b5bcf523SDave May PetscFunctionReturn(0); 165b5bcf523SDave May } 166b5bcf523SDave May 167b5bcf523SDave May /* 168b5bcf523SDave May PETSC_EXTERN PetscErrorCode DMSwarmCreateGlobalVectorFromFields(DM dm,const PetscInt nf,const char *fieldnames[],Vec *vec) 169b5bcf523SDave May { 170b5bcf523SDave May PetscFunctionReturn(0); 171b5bcf523SDave May } 172b5bcf523SDave May 173b5bcf523SDave May PETSC_EXTERN PetscErrorCode DMSwarmRestoreGlobalVectorFromFields(DM dm,Vec *vec) 174b5bcf523SDave May { 175b5bcf523SDave May PetscFunctionReturn(0); 176b5bcf523SDave May } 177b5bcf523SDave May */ 178b5bcf523SDave May 179b5bcf523SDave May #undef __FUNCT__ 1805f50eb2eSDave May #define __FUNCT__ "DMSwarmInitializeFieldRegister" 1815f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmInitializeFieldRegister(DM dm) 1825f50eb2eSDave May { 1835f50eb2eSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 1843454631fSDave May PetscErrorCode ierr; 1853454631fSDave May 1865f50eb2eSDave May swarm->field_registration_initialized = PETSC_TRUE; 1873454631fSDave May 1883454631fSDave May ierr = DMSwarmRegisterPetscDatatypeField(dm,"DMSwarm_pid",1,PETSC_LONG);CHKERRQ(ierr); /* unique identifer */ 1893454631fSDave May ierr = DMSwarmRegisterPetscDatatypeField(dm,"DMSwarm_rank",1,PETSC_INT);CHKERRQ(ierr); /* used for communication */ 1903454631fSDave May 1915f50eb2eSDave May PetscFunctionReturn(0); 1925f50eb2eSDave May } 1935f50eb2eSDave May 1945f50eb2eSDave May #undef __FUNCT__ 1955f50eb2eSDave May #define __FUNCT__ "DMSwarmFinalizeFieldRegister" 1965f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmFinalizeFieldRegister(DM dm) 1975f50eb2eSDave May { 1985f50eb2eSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 1996845f8f5SDave May PetscErrorCode ierr; 2006845f8f5SDave May 2015f50eb2eSDave May swarm->field_registration_finalized = PETSC_TRUE; 2026845f8f5SDave May ierr = DataBucketFinalize(swarm->db);CHKERRQ(ierr); 2035f50eb2eSDave May PetscFunctionReturn(0); 2045f50eb2eSDave May } 2055f50eb2eSDave May 2065f50eb2eSDave May #undef __FUNCT__ 2075f50eb2eSDave May #define __FUNCT__ "DMSwarmSetLocalSizes" 2085f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmSetLocalSizes(DM dm,PetscInt nlocal,PetscInt buffer) 2095f50eb2eSDave May { 2105f50eb2eSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 2116845f8f5SDave May PetscErrorCode ierr; 2125f50eb2eSDave May 2136845f8f5SDave May ierr = DataBucketSetSizes(swarm->db,nlocal,buffer);CHKERRQ(ierr); 2145f50eb2eSDave May 2155f50eb2eSDave May PetscFunctionReturn(0); 2165f50eb2eSDave May } 2175f50eb2eSDave May 2185f50eb2eSDave May #undef __FUNCT__ 219*dcf43ee8SDave May #define __FUNCT__ "DMSwarmGetLocalSize" 220*dcf43ee8SDave May PETSC_EXTERN PetscErrorCode DMSwarmGetLocalSize(DM dm,PetscInt *nlocal) 221*dcf43ee8SDave May { 222*dcf43ee8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 223*dcf43ee8SDave May PetscErrorCode ierr; 224*dcf43ee8SDave May 225*dcf43ee8SDave May if (nlocal) { 226*dcf43ee8SDave May ierr = DataBucketGetSizes(swarm->db,nlocal,NULL,NULL);CHKERRQ(ierr); 227*dcf43ee8SDave May } 228*dcf43ee8SDave May 229*dcf43ee8SDave May PetscFunctionReturn(0); 230*dcf43ee8SDave May } 231*dcf43ee8SDave May 232*dcf43ee8SDave May #undef __FUNCT__ 233*dcf43ee8SDave May #define __FUNCT__ "DMSwarmGetSize" 234*dcf43ee8SDave May PETSC_EXTERN PetscErrorCode DMSwarmGetSize(DM dm,PetscInt *n) 235*dcf43ee8SDave May { 236*dcf43ee8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 237*dcf43ee8SDave May PetscErrorCode ierr; 238*dcf43ee8SDave May PetscInt nlocal,ng; 239*dcf43ee8SDave May 240*dcf43ee8SDave May ierr = DataBucketGetSizes(swarm->db,&nlocal,NULL,NULL);CHKERRQ(ierr); 241*dcf43ee8SDave May ierr = MPI_Allreduce(&nlocal,&ng,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); 242*dcf43ee8SDave May if (n) { *n = ng; } 243*dcf43ee8SDave May PetscFunctionReturn(0); 244*dcf43ee8SDave May } 245*dcf43ee8SDave May 246*dcf43ee8SDave May #undef __FUNCT__ 247b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterPetscDatatypeField" 2485f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterPetscDatatypeField(DM dm,const char fieldname[],PetscInt blocksize,PetscDataType type) 249b62e03f8SDave May { 2502eac95f8SDave May PetscErrorCode ierr; 251b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 252b62e03f8SDave May size_t size; 253b62e03f8SDave May 2545f50eb2eSDave May if (!swarm->field_registration_initialized) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Must call DMSwarmInitializeFieldRegister() first"); 2555f50eb2eSDave May if (swarm->field_registration_finalized) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Cannot register additional fields after calling DMSwarmFinalizeFieldRegister() first"); 2565f50eb2eSDave May 2575f50eb2eSDave May if (type == PETSC_OBJECT) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2585f50eb2eSDave May if (type == PETSC_FUNCTION) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2595f50eb2eSDave May if (type == PETSC_STRING) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2605f50eb2eSDave May if (type == PETSC_STRUCT) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2615f50eb2eSDave May if (type == PETSC_DATATYPE_UNKNOWN) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 262b62e03f8SDave May 263b62e03f8SDave May switch (type) { 264b62e03f8SDave May case PETSC_CHAR: 265b62e03f8SDave May size = sizeof(PetscChar); 266b62e03f8SDave May break; 267b62e03f8SDave May case PETSC_SHORT: 268b62e03f8SDave May size = sizeof(PetscShort); 269b62e03f8SDave May break; 270b62e03f8SDave May case PETSC_INT: 271b62e03f8SDave May size = sizeof(PetscInt); 272b62e03f8SDave May break; 273b62e03f8SDave May case PETSC_LONG: 274b62e03f8SDave May size = sizeof(Petsc64bitInt); 275b62e03f8SDave May break; 276b62e03f8SDave May case PETSC_FLOAT: 277b62e03f8SDave May size = sizeof(PetscFloat); 278b62e03f8SDave May break; 279b62e03f8SDave May case PETSC_DOUBLE: 280b62e03f8SDave May size = sizeof(PetscReal); 281b62e03f8SDave May break; 282b62e03f8SDave May 283b62e03f8SDave May default: 2845f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 285b62e03f8SDave May break; 286b62e03f8SDave May } 287b62e03f8SDave May 288b62e03f8SDave May /* Load a specific data type into data bucket, specifying textual name and its size in bytes */ 2892eac95f8SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterPetscDatatypeField",fieldname,size,NULL);CHKERRQ(ierr); 290b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = type; 291b62e03f8SDave May 292b62e03f8SDave May PetscFunctionReturn(0); 293b62e03f8SDave May } 294b62e03f8SDave May 295b62e03f8SDave May #undef __FUNCT__ 296b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterUserStructField" 2975f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterUserStructField(DM dm,const char fieldname[],size_t size) 298b62e03f8SDave May { 2992eac95f8SDave May PetscErrorCode ierr; 300b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 301b62e03f8SDave May 3022eac95f8SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterUserStructField",fieldname,size,NULL);CHKERRQ(ierr); 303b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = PETSC_STRUCT ; 304b62e03f8SDave May 305b62e03f8SDave May PetscFunctionReturn(0); 306b62e03f8SDave May } 307b62e03f8SDave May 308b62e03f8SDave May #undef __FUNCT__ 309b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterUserDatatypeField" 3105f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterUserDatatypeField(DM dm,const char fieldname[],size_t size) 311b62e03f8SDave May { 312b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 3136845f8f5SDave May PetscErrorCode ierr; 314b62e03f8SDave May 3156845f8f5SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterUserDatatypeField",fieldname,size,NULL);CHKERRQ(ierr); 316b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = PETSC_DATATYPE_UNKNOWN; 317b62e03f8SDave May 318b62e03f8SDave May PetscFunctionReturn(0); 319b62e03f8SDave May } 320b62e03f8SDave May 321b62e03f8SDave May #undef __FUNCT__ 322b62e03f8SDave May #define __FUNCT__ "DMSwarmGetField" 3235f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmGetField(DM dm,const char fieldname[],PetscInt *blocksize,PetscDataType *type,void **data) 324b62e03f8SDave May { 325b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 326b62e03f8SDave May DataField gfield; 3272eac95f8SDave May PetscErrorCode ierr; 328b62e03f8SDave May 3293454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 3303454631fSDave May 3312eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 3326845f8f5SDave May ierr = DataFieldGetAccess(gfield);CHKERRQ(ierr); 3336845f8f5SDave May ierr = DataFieldGetEntries(gfield,data);CHKERRQ(ierr); 334b5bcf523SDave May if (blocksize) {} 335b5bcf523SDave May if (type) { *type = gfield->petsc_type; } 336b62e03f8SDave May 337b62e03f8SDave May PetscFunctionReturn(0); 338b62e03f8SDave May } 339b62e03f8SDave May 340b62e03f8SDave May #undef __FUNCT__ 341b62e03f8SDave May #define __FUNCT__ "DMSwarmRestoreField" 3425f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRestoreField(DM dm,const char fieldname[],PetscInt *blocksize,PetscDataType *type,void **data) 343b62e03f8SDave May { 344b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 345b62e03f8SDave May DataField gfield; 3462eac95f8SDave May PetscErrorCode ierr; 347b62e03f8SDave May 3482eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 3496845f8f5SDave May ierr = DataFieldRestoreAccess(gfield);CHKERRQ(ierr); 350b62e03f8SDave May if (data) *data = NULL; 351b62e03f8SDave May 352b62e03f8SDave May PetscFunctionReturn(0); 353b62e03f8SDave May } 354b62e03f8SDave May 355cb1d1399SDave May #undef __FUNCT__ 356cb1d1399SDave May #define __FUNCT__ "DMSwarmAddPoint" 357cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmAddPoint(DM dm) 358cb1d1399SDave May { 359cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 360cb1d1399SDave May PetscErrorCode ierr; 361cb1d1399SDave May 3623454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 363cb1d1399SDave May ierr = DataBucketAddPoint(swarm->db);CHKERRQ(ierr); 364cb1d1399SDave May PetscFunctionReturn(0); 365cb1d1399SDave May } 366cb1d1399SDave May 367cb1d1399SDave May #undef __FUNCT__ 368cb1d1399SDave May #define __FUNCT__ "DMSwarmAddNPoints" 369cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmAddNPoints(DM dm,PetscInt npoints) 370cb1d1399SDave May { 371cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 372cb1d1399SDave May PetscErrorCode ierr; 373cb1d1399SDave May PetscInt nlocal; 374cb1d1399SDave May 375cb1d1399SDave May ierr = DataBucketGetSizes(swarm->db,&nlocal,NULL,NULL);CHKERRQ(ierr); 376cb1d1399SDave May nlocal = nlocal + npoints; 377cb1d1399SDave May ierr = DataBucketSetSizes(swarm->db,nlocal,-1);CHKERRQ(ierr); 378cb1d1399SDave May PetscFunctionReturn(0); 379cb1d1399SDave May } 380cb1d1399SDave May 381cb1d1399SDave May #undef __FUNCT__ 382cb1d1399SDave May #define __FUNCT__ "DMSwarmRemovePoint" 383cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmRemovePoint(DM dm) 384cb1d1399SDave May { 385cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 386cb1d1399SDave May PetscErrorCode ierr; 387cb1d1399SDave May 388cb1d1399SDave May ierr = DataBucketRemovePoint(swarm->db);CHKERRQ(ierr); 389cb1d1399SDave May PetscFunctionReturn(0); 390cb1d1399SDave May } 391cb1d1399SDave May 392cb1d1399SDave May #undef __FUNCT__ 393cb1d1399SDave May #define __FUNCT__ "DMSwarmRemovePointAtIndex" 394cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmRemovePointAtIndex(DM dm,PetscInt idx) 395cb1d1399SDave May { 396cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 397cb1d1399SDave May PetscErrorCode ierr; 398cb1d1399SDave May 399cb1d1399SDave May ierr = DataBucketRemovePointAtIndex(swarm->db,idx);CHKERRQ(ierr); 400cb1d1399SDave May PetscFunctionReturn(0); 401cb1d1399SDave May } 402b62e03f8SDave May 4033454631fSDave May #undef __FUNCT__ 404095059a4SDave May #define __FUNCT__ "DMSwarmMigrate_Basic" 405095059a4SDave May PetscErrorCode DMSwarmMigrate_Basic(DM dm,PetscBool remove_sent_points) 4063454631fSDave May { 407*dcf43ee8SDave May PetscErrorCode ierr; 408*dcf43ee8SDave May ierr = DMSwarmMigrate_Push_Basic(dm,remove_sent_points);CHKERRQ(ierr); 4093454631fSDave May PetscFunctionReturn(0); 4103454631fSDave May } 4113454631fSDave May 4123454631fSDave May #undef __FUNCT__ 413095059a4SDave May #define __FUNCT__ "DMSwarmMigrate" 414095059a4SDave May PETSC_EXTERN PetscErrorCode DMSwarmMigrate(DM dm,PetscBool remove_sent_points) 4153454631fSDave May { 4163454631fSDave May PetscErrorCode ierr; 417095059a4SDave May ierr = DMSwarmMigrate_Basic(dm,remove_sent_points);CHKERRQ(ierr); 4183454631fSDave May PetscFunctionReturn(0); 4193454631fSDave May } 4203454631fSDave May 4213454631fSDave May 4223454631fSDave May #undef __FUNCT__ 4233454631fSDave May #define __FUNCT__ "DMSetup_Swarm" 4243454631fSDave May PetscErrorCode DMSetup_Swarm(DM dm) 4253454631fSDave May { 4263454631fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4273454631fSDave May PetscErrorCode ierr; 4283454631fSDave May PetscMPIInt rank; 4293454631fSDave May PetscInt p,npoints,*rankval; 4303454631fSDave May 4313454631fSDave May if (swarm->issetup) PetscFunctionReturn(0); 4323454631fSDave May 4333454631fSDave May PetscPrintf(PETSC_COMM_SELF,"Swarm setup \n"); 4343454631fSDave May swarm->issetup = PETSC_TRUE; 4353454631fSDave May 4363454631fSDave May /* check some fields were registered */ 4373454631fSDave May if (swarm->db->nfields <= 2) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"At least one field user must be registered via DMSwarmRegisterXXX()"); 4383454631fSDave May 4393454631fSDave May /* check local sizes were set */ 4403454631fSDave May if (swarm->db->L == -1) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Local sizes must be set via DMSwarmSetLocalSizes()"); 4413454631fSDave May 4423454631fSDave May /* initialize values in pid and rank placeholders */ 4433454631fSDave May /* TODO: [pid - use MPI_Scan] */ 4443454631fSDave May 4453454631fSDave May ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm),&rank);CHKERRQ(ierr); 4463454631fSDave May ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr); 4473454631fSDave May ierr = DMSwarmGetField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr); 4483454631fSDave May for (p=0; p<npoints; p++) { 4493454631fSDave May rankval[p] = (PetscInt)rank; 4503454631fSDave May } 4513454631fSDave May ierr = DMSwarmRestoreField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr); 4523454631fSDave May 4533454631fSDave May PetscFunctionReturn(0); 4543454631fSDave May } 4553454631fSDave May 456b62e03f8SDave May #undef __FUNCT__ 45757795646SDave May #define __FUNCT__ "DMDestroy_Swarm" 45857795646SDave May PetscErrorCode DMDestroy_Swarm(DM dm) 45957795646SDave May { 46057795646SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 46157795646SDave May PetscErrorCode ierr; 46257795646SDave May 46357795646SDave May PetscFunctionBegin; 4646845f8f5SDave May ierr = DataBucketDestroy(&swarm->db);CHKERRQ(ierr); 46557795646SDave May ierr = PetscFree(swarm);CHKERRQ(ierr); 46657795646SDave May PetscFunctionReturn(0); 46757795646SDave May } 46857795646SDave May 46957795646SDave May #undef __FUNCT__ 4705f50eb2eSDave May #define __FUNCT__ "DMView_Swarm" 4715f50eb2eSDave May PetscErrorCode DMView_Swarm(DM dm, PetscViewer viewer) 4725f50eb2eSDave May { 4735f50eb2eSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4745f50eb2eSDave May PetscBool iascii,ibinary,ishdf5,isvtk; 4755f50eb2eSDave May PetscErrorCode ierr; 4765f50eb2eSDave May 4775f50eb2eSDave May PetscFunctionBegin; 4785f50eb2eSDave May PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4795f50eb2eSDave May PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 4805f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 4815f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY,&ibinary);CHKERRQ(ierr); 4825f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 4835f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 4845f50eb2eSDave May if (iascii) { 4856845f8f5SDave May ierr = DataBucketView(PetscObjectComm((PetscObject)dm),swarm->db,NULL,DATABUCKET_VIEW_STDOUT);CHKERRQ(ierr); 4865f50eb2eSDave May } else if (ibinary) { 4875f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO VTK support"); 4885f50eb2eSDave May } else if (ishdf5) { 4895f50eb2eSDave May #if defined(PETSC_HAVE_HDF5) 4905f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO HDF5 support"); 4915f50eb2eSDave May #else 4925f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"HDF5 not supported. Please reconfigure using --download-hdf5"); 4935f50eb2eSDave May #endif 4945f50eb2eSDave May } else if (isvtk) { 4955f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO VTK support"); 4965f50eb2eSDave May } 4975f50eb2eSDave May PetscFunctionReturn(0); 4985f50eb2eSDave May } 4995f50eb2eSDave May 5005f50eb2eSDave May #undef __FUNCT__ 50157795646SDave May #define __FUNCT__ "DMCreate_Swarm" 50257795646SDave May PETSC_EXTERN PetscErrorCode DMCreate_Swarm(DM dm) 50357795646SDave May { 50457795646SDave May DM_Swarm *swarm; 50557795646SDave May PetscErrorCode ierr; 50657795646SDave May 50757795646SDave May PetscFunctionBegin; 50857795646SDave May PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 50957795646SDave May ierr = PetscNewLog(dm,&swarm);CHKERRQ(ierr); 51057795646SDave May 5116845f8f5SDave May ierr = DataBucketCreate(&swarm->db);CHKERRQ(ierr); 512b5bcf523SDave May swarm->vec_field_set = PETSC_FALSE; 5133454631fSDave May swarm->issetup = PETSC_FALSE; 514b62e03f8SDave May 51557795646SDave May dm->dim = 0; 51657795646SDave May dm->data = swarm; 51757795646SDave May 5185f50eb2eSDave May dm->ops->view = DMView_Swarm; 51957795646SDave May dm->ops->load = NULL; 52057795646SDave May dm->ops->setfromoptions = NULL; 52157795646SDave May dm->ops->clone = NULL; 5223454631fSDave May dm->ops->setup = DMSetup_Swarm; 52357795646SDave May dm->ops->createdefaultsection = NULL; 52457795646SDave May dm->ops->createdefaultconstraints = NULL; 525b5bcf523SDave May dm->ops->createglobalvector = DMCreateGlobalVector_Swarm; 526b5bcf523SDave May dm->ops->createlocalvector = DMCreateLocalVector_Swarm; 52757795646SDave May dm->ops->getlocaltoglobalmapping = NULL; 52857795646SDave May dm->ops->createfieldis = NULL; 52957795646SDave May dm->ops->createcoordinatedm = NULL; 53057795646SDave May dm->ops->getcoloring = NULL; 53157795646SDave May dm->ops->creatematrix = NULL; 53257795646SDave May dm->ops->createinterpolation = NULL; 53357795646SDave May dm->ops->getaggregates = NULL; 53457795646SDave May dm->ops->getinjection = NULL; 53557795646SDave May dm->ops->refine = NULL; 53657795646SDave May dm->ops->coarsen = NULL; 53757795646SDave May dm->ops->refinehierarchy = NULL; 53857795646SDave May dm->ops->coarsenhierarchy = NULL; 53957795646SDave May dm->ops->globaltolocalbegin = NULL; 54057795646SDave May dm->ops->globaltolocalend = NULL; 54157795646SDave May dm->ops->localtoglobalbegin = NULL; 54257795646SDave May dm->ops->localtoglobalend = NULL; 54357795646SDave May dm->ops->destroy = DMDestroy_Swarm; 54457795646SDave May dm->ops->createsubdm = NULL; 54557795646SDave May dm->ops->getdimpoints = NULL; 54657795646SDave May dm->ops->locatepoints = NULL; 54757795646SDave May 54857795646SDave May PetscFunctionReturn(0); 54957795646SDave May }