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 6dcf43ee8SDave May PetscErrorCode DMSwarmMigrate_Push_Basic(DM dm,PetscBool remove_sent_points); 7dcf43ee8SDave May 8dcf43ee8SDave 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; 511b1ea282SDave May swarm->vec_field_bs = bs; 52b5bcf523SDave May swarm->vec_field_nlocal = n; 53dcf43ee8SDave 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); 731b1ea282SDave May ierr = VecSetSizes(x,swarm->db->L*swarm->vec_field_bs,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); 961b1ea282SDave May ierr = VecSetSizes(x,swarm->db->L*swarm->vec_field_bs,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) { 1261b1ea282SDave May ierr = VecCreateSeqWithArray(PetscObjectComm((PetscObject)dm),bs,n*bs,array,&x);CHKERRQ(ierr); 1273454631fSDave May } else { 1281b1ea282SDave May ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)dm),bs,n*bs,PETSC_DETERMINE,array,&x);CHKERRQ(ierr); 1293454631fSDave May } 130*6864fe11SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarmSharedField_%s",fieldname); 131dcf43ee8SDave May ierr = PetscObjectSetName((PetscObject)x,name);CHKERRQ(ierr); 132b5bcf523SDave May 133b5bcf523SDave May /* Set guard */ 134dcf43ee8SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarm_VecFieldInPlace_%s",fieldname); 135dcf43ee8SDave 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__ 219dcf43ee8SDave May #define __FUNCT__ "DMSwarmGetLocalSize" 220dcf43ee8SDave May PETSC_EXTERN PetscErrorCode DMSwarmGetLocalSize(DM dm,PetscInt *nlocal) 221dcf43ee8SDave May { 222dcf43ee8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 223dcf43ee8SDave May PetscErrorCode ierr; 224dcf43ee8SDave May 225dcf43ee8SDave May if (nlocal) { 226dcf43ee8SDave May ierr = DataBucketGetSizes(swarm->db,nlocal,NULL,NULL);CHKERRQ(ierr); 227dcf43ee8SDave May } 228dcf43ee8SDave May 229dcf43ee8SDave May PetscFunctionReturn(0); 230dcf43ee8SDave May } 231dcf43ee8SDave May 232dcf43ee8SDave May #undef __FUNCT__ 233dcf43ee8SDave May #define __FUNCT__ "DMSwarmGetSize" 234dcf43ee8SDave May PETSC_EXTERN PetscErrorCode DMSwarmGetSize(DM dm,PetscInt *n) 235dcf43ee8SDave May { 236dcf43ee8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 237dcf43ee8SDave May PetscErrorCode ierr; 238dcf43ee8SDave May PetscInt nlocal,ng; 239dcf43ee8SDave May 240dcf43ee8SDave May ierr = DataBucketGetSizes(swarm->db,&nlocal,NULL,NULL);CHKERRQ(ierr); 241dcf43ee8SDave May ierr = MPI_Allreduce(&nlocal,&ng,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); 242dcf43ee8SDave May if (n) { *n = ng; } 243dcf43ee8SDave May PetscFunctionReturn(0); 244dcf43ee8SDave May } 245dcf43ee8SDave May 246dcf43ee8SDave 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 */ 28952c3ed93SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterPetscDatatypeField",fieldname,blocksize*size,NULL);CHKERRQ(ierr); 29052c3ed93SDave May { 29152c3ed93SDave May DataField gfield; 29252c3ed93SDave May 29352c3ed93SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 29452c3ed93SDave May ierr = DataFieldSetBlockSize(gfield,blocksize);CHKERRQ(ierr); 29552c3ed93SDave May } 296b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = type; 297b62e03f8SDave May 298b62e03f8SDave May PetscFunctionReturn(0); 299b62e03f8SDave May } 300b62e03f8SDave May 301b62e03f8SDave May #undef __FUNCT__ 302b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterUserStructField" 3035f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterUserStructField(DM dm,const char fieldname[],size_t size) 304b62e03f8SDave May { 3052eac95f8SDave May PetscErrorCode ierr; 306b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 307b62e03f8SDave May 3082eac95f8SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterUserStructField",fieldname,size,NULL);CHKERRQ(ierr); 309b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = PETSC_STRUCT ; 310b62e03f8SDave May 311b62e03f8SDave May PetscFunctionReturn(0); 312b62e03f8SDave May } 313b62e03f8SDave May 314b62e03f8SDave May #undef __FUNCT__ 315b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterUserDatatypeField" 316320740a0SDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterUserDatatypeField(DM dm,const char fieldname[],size_t size,PetscInt blocksize) 317b62e03f8SDave May { 318b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 3196845f8f5SDave May PetscErrorCode ierr; 320b62e03f8SDave May 321320740a0SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterUserDatatypeField",fieldname,blocksize*size,NULL);CHKERRQ(ierr); 322320740a0SDave May { 323320740a0SDave May DataField gfield; 324320740a0SDave May 325320740a0SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 326320740a0SDave May ierr = DataFieldSetBlockSize(gfield,blocksize);CHKERRQ(ierr); 327320740a0SDave May } 328b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = PETSC_DATATYPE_UNKNOWN; 329b62e03f8SDave May 330b62e03f8SDave May PetscFunctionReturn(0); 331b62e03f8SDave May } 332b62e03f8SDave May 333b62e03f8SDave May #undef __FUNCT__ 334b62e03f8SDave May #define __FUNCT__ "DMSwarmGetField" 3355f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmGetField(DM dm,const char fieldname[],PetscInt *blocksize,PetscDataType *type,void **data) 336b62e03f8SDave May { 337b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 338b62e03f8SDave May DataField gfield; 3392eac95f8SDave May PetscErrorCode ierr; 340b62e03f8SDave May 3413454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 3423454631fSDave May 3432eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 3446845f8f5SDave May ierr = DataFieldGetAccess(gfield);CHKERRQ(ierr); 3456845f8f5SDave May ierr = DataFieldGetEntries(gfield,data);CHKERRQ(ierr); 3461b1ea282SDave May if (blocksize) {*blocksize = gfield->bs; } 347b5bcf523SDave May if (type) { *type = gfield->petsc_type; } 348b62e03f8SDave May 349b62e03f8SDave May PetscFunctionReturn(0); 350b62e03f8SDave May } 351b62e03f8SDave May 352b62e03f8SDave May #undef __FUNCT__ 353b62e03f8SDave May #define __FUNCT__ "DMSwarmRestoreField" 3545f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRestoreField(DM dm,const char fieldname[],PetscInt *blocksize,PetscDataType *type,void **data) 355b62e03f8SDave May { 356b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 357b62e03f8SDave May DataField gfield; 3582eac95f8SDave May PetscErrorCode ierr; 359b62e03f8SDave May 3602eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 3616845f8f5SDave May ierr = DataFieldRestoreAccess(gfield);CHKERRQ(ierr); 362b62e03f8SDave May if (data) *data = NULL; 363b62e03f8SDave May 364b62e03f8SDave May PetscFunctionReturn(0); 365b62e03f8SDave May } 366b62e03f8SDave May 367cb1d1399SDave May #undef __FUNCT__ 368cb1d1399SDave May #define __FUNCT__ "DMSwarmAddPoint" 369cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmAddPoint(DM dm) 370cb1d1399SDave May { 371cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 372cb1d1399SDave May PetscErrorCode ierr; 373cb1d1399SDave May 3743454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 375cb1d1399SDave May ierr = DataBucketAddPoint(swarm->db);CHKERRQ(ierr); 376cb1d1399SDave May PetscFunctionReturn(0); 377cb1d1399SDave May } 378cb1d1399SDave May 379cb1d1399SDave May #undef __FUNCT__ 380cb1d1399SDave May #define __FUNCT__ "DMSwarmAddNPoints" 381cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmAddNPoints(DM dm,PetscInt npoints) 382cb1d1399SDave May { 383cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 384cb1d1399SDave May PetscErrorCode ierr; 385cb1d1399SDave May PetscInt nlocal; 386cb1d1399SDave May 387cb1d1399SDave May ierr = DataBucketGetSizes(swarm->db,&nlocal,NULL,NULL);CHKERRQ(ierr); 388cb1d1399SDave May nlocal = nlocal + npoints; 389cb1d1399SDave May ierr = DataBucketSetSizes(swarm->db,nlocal,-1);CHKERRQ(ierr); 390cb1d1399SDave May PetscFunctionReturn(0); 391cb1d1399SDave May } 392cb1d1399SDave May 393cb1d1399SDave May #undef __FUNCT__ 394cb1d1399SDave May #define __FUNCT__ "DMSwarmRemovePoint" 395cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmRemovePoint(DM dm) 396cb1d1399SDave May { 397cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 398cb1d1399SDave May PetscErrorCode ierr; 399cb1d1399SDave May 400cb1d1399SDave May ierr = DataBucketRemovePoint(swarm->db);CHKERRQ(ierr); 401cb1d1399SDave May PetscFunctionReturn(0); 402cb1d1399SDave May } 403cb1d1399SDave May 404cb1d1399SDave May #undef __FUNCT__ 405cb1d1399SDave May #define __FUNCT__ "DMSwarmRemovePointAtIndex" 406cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmRemovePointAtIndex(DM dm,PetscInt idx) 407cb1d1399SDave May { 408cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 409cb1d1399SDave May PetscErrorCode ierr; 410cb1d1399SDave May 411cb1d1399SDave May ierr = DataBucketRemovePointAtIndex(swarm->db,idx);CHKERRQ(ierr); 412cb1d1399SDave May PetscFunctionReturn(0); 413cb1d1399SDave May } 414b62e03f8SDave May 4153454631fSDave May #undef __FUNCT__ 416095059a4SDave May #define __FUNCT__ "DMSwarmMigrate_Basic" 417095059a4SDave May PetscErrorCode DMSwarmMigrate_Basic(DM dm,PetscBool remove_sent_points) 4183454631fSDave May { 419dcf43ee8SDave May PetscErrorCode ierr; 420dcf43ee8SDave May ierr = DMSwarmMigrate_Push_Basic(dm,remove_sent_points);CHKERRQ(ierr); 4213454631fSDave May PetscFunctionReturn(0); 4223454631fSDave May } 4233454631fSDave May 4243454631fSDave May #undef __FUNCT__ 425095059a4SDave May #define __FUNCT__ "DMSwarmMigrate" 426095059a4SDave May PETSC_EXTERN PetscErrorCode DMSwarmMigrate(DM dm,PetscBool remove_sent_points) 4273454631fSDave May { 4283454631fSDave May PetscErrorCode ierr; 429095059a4SDave May ierr = DMSwarmMigrate_Basic(dm,remove_sent_points);CHKERRQ(ierr); 4303454631fSDave May PetscFunctionReturn(0); 4313454631fSDave May } 4323454631fSDave May 4332712d1f2SDave May #undef __FUNCT__ 4342712d1f2SDave May #define __FUNCT__ "DMSwarmGlobalToLocalViewCreate" 4352712d1f2SDave May PETSC_EXTERN PetscErrorCode DMSwarmGlobalToLocalViewCreate(DM dm,InsertMode mode) 4362712d1f2SDave May { 4372712d1f2SDave May PetscErrorCode ierr; 4382712d1f2SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4392712d1f2SDave May PetscInt ng; 4402712d1f2SDave May 4412712d1f2SDave May if (mode != INSERT_VALUES) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only mode INSERT_VALUES is supported"); 4422712d1f2SDave May 4432712d1f2SDave May ierr = DMSwarmMigrate_GlobalToLocal_Basic(dm,&ng);CHKERRQ(ierr); 4442712d1f2SDave May swarm->view_ng = ng; 4452712d1f2SDave May 4462712d1f2SDave May PetscFunctionReturn(0); 4472712d1f2SDave May } 4482712d1f2SDave May 4492712d1f2SDave May #undef __FUNCT__ 4502712d1f2SDave May #define __FUNCT__ "DMSwarmGlobalToLocalViewDestroy" 4512712d1f2SDave May PETSC_EXTERN PetscErrorCode DMSwarmGlobalToLocalViewDestroy(DM dm,InsertMode mode) 4522712d1f2SDave May { 4532712d1f2SDave May PetscErrorCode ierr; 4542712d1f2SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4552712d1f2SDave May 4562712d1f2SDave May if (mode != INSERT_VALUES) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only mode INSERT_VALUES is supported"); 4572712d1f2SDave May 4582712d1f2SDave May ierr = DMSwarmSetLocalSizes(dm,swarm->view_ng,-1);CHKERRQ(ierr); 4592712d1f2SDave May 4602712d1f2SDave May PetscFunctionReturn(0); 4612712d1f2SDave May } 4623454631fSDave May 4633454631fSDave May #undef __FUNCT__ 4643454631fSDave May #define __FUNCT__ "DMSetup_Swarm" 4653454631fSDave May PetscErrorCode DMSetup_Swarm(DM dm) 4663454631fSDave May { 4673454631fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4683454631fSDave May PetscErrorCode ierr; 4693454631fSDave May PetscMPIInt rank; 4703454631fSDave May PetscInt p,npoints,*rankval; 4713454631fSDave May 4723454631fSDave May if (swarm->issetup) PetscFunctionReturn(0); 4733454631fSDave May 4743454631fSDave May PetscPrintf(PETSC_COMM_SELF,"Swarm setup \n"); 4753454631fSDave May swarm->issetup = PETSC_TRUE; 4763454631fSDave May 4773454631fSDave May /* check some fields were registered */ 4783454631fSDave May if (swarm->db->nfields <= 2) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"At least one field user must be registered via DMSwarmRegisterXXX()"); 4793454631fSDave May 4803454631fSDave May /* check local sizes were set */ 4813454631fSDave May if (swarm->db->L == -1) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Local sizes must be set via DMSwarmSetLocalSizes()"); 4823454631fSDave May 4833454631fSDave May /* initialize values in pid and rank placeholders */ 4843454631fSDave May /* TODO: [pid - use MPI_Scan] */ 4853454631fSDave May 4863454631fSDave May ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm),&rank);CHKERRQ(ierr); 4873454631fSDave May ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr); 4883454631fSDave May ierr = DMSwarmGetField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr); 4893454631fSDave May for (p=0; p<npoints; p++) { 4903454631fSDave May rankval[p] = (PetscInt)rank; 4913454631fSDave May } 4923454631fSDave May ierr = DMSwarmRestoreField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr); 4933454631fSDave May 4943454631fSDave May PetscFunctionReturn(0); 4953454631fSDave May } 4963454631fSDave May 497b62e03f8SDave May #undef __FUNCT__ 49857795646SDave May #define __FUNCT__ "DMDestroy_Swarm" 49957795646SDave May PetscErrorCode DMDestroy_Swarm(DM dm) 50057795646SDave May { 50157795646SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 50257795646SDave May PetscErrorCode ierr; 50357795646SDave May 50457795646SDave May PetscFunctionBegin; 5056845f8f5SDave May ierr = DataBucketDestroy(&swarm->db);CHKERRQ(ierr); 50657795646SDave May ierr = PetscFree(swarm);CHKERRQ(ierr); 50757795646SDave May PetscFunctionReturn(0); 50857795646SDave May } 50957795646SDave May 51057795646SDave May #undef __FUNCT__ 5115f50eb2eSDave May #define __FUNCT__ "DMView_Swarm" 5125f50eb2eSDave May PetscErrorCode DMView_Swarm(DM dm, PetscViewer viewer) 5135f50eb2eSDave May { 5145f50eb2eSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 5155f50eb2eSDave May PetscBool iascii,ibinary,ishdf5,isvtk; 5165f50eb2eSDave May PetscErrorCode ierr; 5175f50eb2eSDave May 5185f50eb2eSDave May PetscFunctionBegin; 5195f50eb2eSDave May PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5205f50eb2eSDave May PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 5215f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 5225f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY,&ibinary);CHKERRQ(ierr); 5235f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 5245f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 5255f50eb2eSDave May if (iascii) { 5266845f8f5SDave May ierr = DataBucketView(PetscObjectComm((PetscObject)dm),swarm->db,NULL,DATABUCKET_VIEW_STDOUT);CHKERRQ(ierr); 5275f50eb2eSDave May } else if (ibinary) { 5285f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO VTK support"); 5295f50eb2eSDave May } else if (ishdf5) { 5305f50eb2eSDave May #if defined(PETSC_HAVE_HDF5) 5315f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO HDF5 support"); 5325f50eb2eSDave May #else 5335f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"HDF5 not supported. Please reconfigure using --download-hdf5"); 5345f50eb2eSDave May #endif 5355f50eb2eSDave May } else if (isvtk) { 5365f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO VTK support"); 5375f50eb2eSDave May } 5385f50eb2eSDave May PetscFunctionReturn(0); 5395f50eb2eSDave May } 5405f50eb2eSDave May 5415f50eb2eSDave May #undef __FUNCT__ 54257795646SDave May #define __FUNCT__ "DMCreate_Swarm" 54357795646SDave May PETSC_EXTERN PetscErrorCode DMCreate_Swarm(DM dm) 54457795646SDave May { 54557795646SDave May DM_Swarm *swarm; 54657795646SDave May PetscErrorCode ierr; 54757795646SDave May 54857795646SDave May PetscFunctionBegin; 54957795646SDave May PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 55057795646SDave May ierr = PetscNewLog(dm,&swarm);CHKERRQ(ierr); 55157795646SDave May 5526845f8f5SDave May ierr = DataBucketCreate(&swarm->db);CHKERRQ(ierr); 553b5bcf523SDave May swarm->vec_field_set = PETSC_FALSE; 5543454631fSDave May swarm->issetup = PETSC_FALSE; 555b62e03f8SDave May 55657795646SDave May dm->dim = 0; 55757795646SDave May dm->data = swarm; 55857795646SDave May 5595f50eb2eSDave May dm->ops->view = DMView_Swarm; 56057795646SDave May dm->ops->load = NULL; 56157795646SDave May dm->ops->setfromoptions = NULL; 56257795646SDave May dm->ops->clone = NULL; 5633454631fSDave May dm->ops->setup = DMSetup_Swarm; 56457795646SDave May dm->ops->createdefaultsection = NULL; 56557795646SDave May dm->ops->createdefaultconstraints = NULL; 566b5bcf523SDave May dm->ops->createglobalvector = DMCreateGlobalVector_Swarm; 567b5bcf523SDave May dm->ops->createlocalvector = DMCreateLocalVector_Swarm; 56857795646SDave May dm->ops->getlocaltoglobalmapping = NULL; 56957795646SDave May dm->ops->createfieldis = NULL; 57057795646SDave May dm->ops->createcoordinatedm = NULL; 57157795646SDave May dm->ops->getcoloring = NULL; 57257795646SDave May dm->ops->creatematrix = NULL; 57357795646SDave May dm->ops->createinterpolation = NULL; 57457795646SDave May dm->ops->getaggregates = NULL; 57557795646SDave May dm->ops->getinjection = NULL; 57657795646SDave May dm->ops->refine = NULL; 57757795646SDave May dm->ops->coarsen = NULL; 57857795646SDave May dm->ops->refinehierarchy = NULL; 57957795646SDave May dm->ops->coarsenhierarchy = NULL; 58057795646SDave May dm->ops->globaltolocalbegin = NULL; 58157795646SDave May dm->ops->globaltolocalend = NULL; 58257795646SDave May dm->ops->localtoglobalbegin = NULL; 58357795646SDave May dm->ops->localtoglobalend = NULL; 58457795646SDave May dm->ops->destroy = DMDestroy_Swarm; 58557795646SDave May dm->ops->createsubdm = NULL; 58657795646SDave May dm->ops->getdimpoints = NULL; 58757795646SDave May dm->ops->locatepoints = NULL; 58857795646SDave May 58957795646SDave May PetscFunctionReturn(0); 59057795646SDave May }