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; 51b5bcf523SDave May swarm->vec_field_bs = 1;//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); 73dcf43ee8SDave 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); 96dcf43ee8SDave 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 } 130dcf43ee8SDave May PetscSNPrintf(name,PETSC_MAX_PATH_LEN-1,"DMSwarmSharedField_%s",swarm->vec_field_name); 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__ 219*b16650c8SDave May #define __FUNCT__ "DMSwarmSetCellDM" 220*b16650c8SDave May PETSC_EXTERN PetscErrorCode DMSwarmSetCellDM(DM dm,DM dmcell) 221*b16650c8SDave May { 222*b16650c8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 223*b16650c8SDave May swarm->dmcell = dmcell; 224*b16650c8SDave May PetscFunctionReturn(0); 225*b16650c8SDave May } 226*b16650c8SDave May 227*b16650c8SDave May #undef __FUNCT__ 228dcf43ee8SDave May #define __FUNCT__ "DMSwarmGetLocalSize" 229dcf43ee8SDave May PETSC_EXTERN PetscErrorCode DMSwarmGetLocalSize(DM dm,PetscInt *nlocal) 230dcf43ee8SDave May { 231dcf43ee8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 232dcf43ee8SDave May PetscErrorCode ierr; 233dcf43ee8SDave May 234dcf43ee8SDave May if (nlocal) { 235dcf43ee8SDave May ierr = DataBucketGetSizes(swarm->db,nlocal,NULL,NULL);CHKERRQ(ierr); 236dcf43ee8SDave May } 237dcf43ee8SDave May 238dcf43ee8SDave May PetscFunctionReturn(0); 239dcf43ee8SDave May } 240dcf43ee8SDave May 241dcf43ee8SDave May #undef __FUNCT__ 242dcf43ee8SDave May #define __FUNCT__ "DMSwarmGetSize" 243dcf43ee8SDave May PETSC_EXTERN PetscErrorCode DMSwarmGetSize(DM dm,PetscInt *n) 244dcf43ee8SDave May { 245dcf43ee8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 246dcf43ee8SDave May PetscErrorCode ierr; 247dcf43ee8SDave May PetscInt nlocal,ng; 248dcf43ee8SDave May 249dcf43ee8SDave May ierr = DataBucketGetSizes(swarm->db,&nlocal,NULL,NULL);CHKERRQ(ierr); 250dcf43ee8SDave May ierr = MPI_Allreduce(&nlocal,&ng,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); 251dcf43ee8SDave May if (n) { *n = ng; } 252dcf43ee8SDave May PetscFunctionReturn(0); 253dcf43ee8SDave May } 254dcf43ee8SDave May 255dcf43ee8SDave May #undef __FUNCT__ 256b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterPetscDatatypeField" 2575f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterPetscDatatypeField(DM dm,const char fieldname[],PetscInt blocksize,PetscDataType type) 258b62e03f8SDave May { 2592eac95f8SDave May PetscErrorCode ierr; 260b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 261b62e03f8SDave May size_t size; 262b62e03f8SDave May 2635f50eb2eSDave May if (!swarm->field_registration_initialized) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Must call DMSwarmInitializeFieldRegister() first"); 2645f50eb2eSDave May if (swarm->field_registration_finalized) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Cannot register additional fields after calling DMSwarmFinalizeFieldRegister() first"); 2655f50eb2eSDave May 2665f50eb2eSDave May if (type == PETSC_OBJECT) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2675f50eb2eSDave May if (type == PETSC_FUNCTION) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2685f50eb2eSDave May if (type == PETSC_STRING) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2695f50eb2eSDave May if (type == PETSC_STRUCT) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 2705f50eb2eSDave May if (type == PETSC_DATATYPE_UNKNOWN) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 271b62e03f8SDave May 272b62e03f8SDave May switch (type) { 273b62e03f8SDave May case PETSC_CHAR: 274b62e03f8SDave May size = sizeof(PetscChar); 275b62e03f8SDave May break; 276b62e03f8SDave May case PETSC_SHORT: 277b62e03f8SDave May size = sizeof(PetscShort); 278b62e03f8SDave May break; 279b62e03f8SDave May case PETSC_INT: 280b62e03f8SDave May size = sizeof(PetscInt); 281b62e03f8SDave May break; 282b62e03f8SDave May case PETSC_LONG: 283b62e03f8SDave May size = sizeof(Petsc64bitInt); 284b62e03f8SDave May break; 285b62e03f8SDave May case PETSC_FLOAT: 286b62e03f8SDave May size = sizeof(PetscFloat); 287b62e03f8SDave May break; 288b62e03f8SDave May case PETSC_DOUBLE: 289b62e03f8SDave May size = sizeof(PetscReal); 290b62e03f8SDave May break; 291b62e03f8SDave May 292b62e03f8SDave May default: 2935f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Valid for {char,short,int,long,float,double}"); 294b62e03f8SDave May break; 295b62e03f8SDave May } 296b62e03f8SDave May 297b62e03f8SDave May /* Load a specific data type into data bucket, specifying textual name and its size in bytes */ 2982eac95f8SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterPetscDatatypeField",fieldname,size,NULL);CHKERRQ(ierr); 299b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = type; 300b62e03f8SDave May 301b62e03f8SDave May PetscFunctionReturn(0); 302b62e03f8SDave May } 303b62e03f8SDave May 304b62e03f8SDave May #undef __FUNCT__ 305b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterUserStructField" 3065f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterUserStructField(DM dm,const char fieldname[],size_t size) 307b62e03f8SDave May { 3082eac95f8SDave May PetscErrorCode ierr; 309b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 310b62e03f8SDave May 3112eac95f8SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterUserStructField",fieldname,size,NULL);CHKERRQ(ierr); 312b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = PETSC_STRUCT ; 313b62e03f8SDave May 314b62e03f8SDave May PetscFunctionReturn(0); 315b62e03f8SDave May } 316b62e03f8SDave May 317b62e03f8SDave May #undef __FUNCT__ 318b62e03f8SDave May #define __FUNCT__ "DMSwarmRegisterUserDatatypeField" 3195f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRegisterUserDatatypeField(DM dm,const char fieldname[],size_t size) 320b62e03f8SDave May { 321b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 3226845f8f5SDave May PetscErrorCode ierr; 323b62e03f8SDave May 3246845f8f5SDave May ierr = DataBucketRegisterField(swarm->db,"DMSwarmRegisterUserDatatypeField",fieldname,size,NULL);CHKERRQ(ierr); 325b62e03f8SDave May swarm->db->field[swarm->db->nfields-1]->petsc_type = PETSC_DATATYPE_UNKNOWN; 326b62e03f8SDave May 327b62e03f8SDave May PetscFunctionReturn(0); 328b62e03f8SDave May } 329b62e03f8SDave May 330b62e03f8SDave May #undef __FUNCT__ 331b62e03f8SDave May #define __FUNCT__ "DMSwarmGetField" 3325f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmGetField(DM dm,const char fieldname[],PetscInt *blocksize,PetscDataType *type,void **data) 333b62e03f8SDave May { 334b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 335b62e03f8SDave May DataField gfield; 3362eac95f8SDave May PetscErrorCode ierr; 337b62e03f8SDave May 3383454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 3393454631fSDave May 3402eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 3416845f8f5SDave May ierr = DataFieldGetAccess(gfield);CHKERRQ(ierr); 3426845f8f5SDave May ierr = DataFieldGetEntries(gfield,data);CHKERRQ(ierr); 343b5bcf523SDave May if (blocksize) {} 344b5bcf523SDave May if (type) { *type = gfield->petsc_type; } 345b62e03f8SDave May 346b62e03f8SDave May PetscFunctionReturn(0); 347b62e03f8SDave May } 348b62e03f8SDave May 349b62e03f8SDave May #undef __FUNCT__ 350b62e03f8SDave May #define __FUNCT__ "DMSwarmRestoreField" 3515f50eb2eSDave May PETSC_EXTERN PetscErrorCode DMSwarmRestoreField(DM dm,const char fieldname[],PetscInt *blocksize,PetscDataType *type,void **data) 352b62e03f8SDave May { 353b62e03f8SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 354b62e03f8SDave May DataField gfield; 3552eac95f8SDave May PetscErrorCode ierr; 356b62e03f8SDave May 3572eac95f8SDave May ierr = DataBucketGetDataFieldByName(swarm->db,fieldname,&gfield);CHKERRQ(ierr); 3586845f8f5SDave May ierr = DataFieldRestoreAccess(gfield);CHKERRQ(ierr); 359b62e03f8SDave May if (data) *data = NULL; 360b62e03f8SDave May 361b62e03f8SDave May PetscFunctionReturn(0); 362b62e03f8SDave May } 363b62e03f8SDave May 364cb1d1399SDave May #undef __FUNCT__ 365cb1d1399SDave May #define __FUNCT__ "DMSwarmAddPoint" 366cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmAddPoint(DM dm) 367cb1d1399SDave May { 368cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 369cb1d1399SDave May PetscErrorCode ierr; 370cb1d1399SDave May 3713454631fSDave May if (!swarm->issetup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } 372cb1d1399SDave May ierr = DataBucketAddPoint(swarm->db);CHKERRQ(ierr); 373cb1d1399SDave May PetscFunctionReturn(0); 374cb1d1399SDave May } 375cb1d1399SDave May 376cb1d1399SDave May #undef __FUNCT__ 377cb1d1399SDave May #define __FUNCT__ "DMSwarmAddNPoints" 378cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmAddNPoints(DM dm,PetscInt npoints) 379cb1d1399SDave May { 380cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 381cb1d1399SDave May PetscErrorCode ierr; 382cb1d1399SDave May PetscInt nlocal; 383cb1d1399SDave May 384cb1d1399SDave May ierr = DataBucketGetSizes(swarm->db,&nlocal,NULL,NULL);CHKERRQ(ierr); 385cb1d1399SDave May nlocal = nlocal + npoints; 386cb1d1399SDave May ierr = DataBucketSetSizes(swarm->db,nlocal,-1);CHKERRQ(ierr); 387cb1d1399SDave May PetscFunctionReturn(0); 388cb1d1399SDave May } 389cb1d1399SDave May 390cb1d1399SDave May #undef __FUNCT__ 391cb1d1399SDave May #define __FUNCT__ "DMSwarmRemovePoint" 392cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmRemovePoint(DM dm) 393cb1d1399SDave May { 394cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 395cb1d1399SDave May PetscErrorCode ierr; 396cb1d1399SDave May 397cb1d1399SDave May ierr = DataBucketRemovePoint(swarm->db);CHKERRQ(ierr); 398cb1d1399SDave May PetscFunctionReturn(0); 399cb1d1399SDave May } 400cb1d1399SDave May 401cb1d1399SDave May #undef __FUNCT__ 402cb1d1399SDave May #define __FUNCT__ "DMSwarmRemovePointAtIndex" 403cb1d1399SDave May PETSC_EXTERN PetscErrorCode DMSwarmRemovePointAtIndex(DM dm,PetscInt idx) 404cb1d1399SDave May { 405cb1d1399SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 406cb1d1399SDave May PetscErrorCode ierr; 407cb1d1399SDave May 408cb1d1399SDave May ierr = DataBucketRemovePointAtIndex(swarm->db,idx);CHKERRQ(ierr); 409cb1d1399SDave May PetscFunctionReturn(0); 410cb1d1399SDave May } 411b62e03f8SDave May 4123454631fSDave May #undef __FUNCT__ 413095059a4SDave May #define __FUNCT__ "DMSwarmMigrate_Basic" 414095059a4SDave May PetscErrorCode DMSwarmMigrate_Basic(DM dm,PetscBool remove_sent_points) 4153454631fSDave May { 416dcf43ee8SDave May PetscErrorCode ierr; 417dcf43ee8SDave May ierr = DMSwarmMigrate_Push_Basic(dm,remove_sent_points);CHKERRQ(ierr); 4183454631fSDave May PetscFunctionReturn(0); 4193454631fSDave May } 4203454631fSDave May 4213454631fSDave May #undef __FUNCT__ 422095059a4SDave May #define __FUNCT__ "DMSwarmMigrate" 423095059a4SDave May PETSC_EXTERN PetscErrorCode DMSwarmMigrate(DM dm,PetscBool remove_sent_points) 4243454631fSDave May { 4253454631fSDave May PetscErrorCode ierr; 426095059a4SDave May ierr = DMSwarmMigrate_Basic(dm,remove_sent_points);CHKERRQ(ierr); 4273454631fSDave May PetscFunctionReturn(0); 4283454631fSDave May } 4293454631fSDave May 4302712d1f2SDave May #undef __FUNCT__ 4312712d1f2SDave May #define __FUNCT__ "DMSwarmGlobalToLocalViewCreate" 4322712d1f2SDave May PETSC_EXTERN PetscErrorCode DMSwarmGlobalToLocalViewCreate(DM dm,InsertMode mode) 4332712d1f2SDave May { 4342712d1f2SDave May PetscErrorCode ierr; 4352712d1f2SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4362712d1f2SDave May PetscInt ng; 4372712d1f2SDave May 4382712d1f2SDave May if (mode != INSERT_VALUES) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only mode INSERT_VALUES is supported"); 4392712d1f2SDave May 4402712d1f2SDave May ierr = DMSwarmMigrate_GlobalToLocal_Basic(dm,&ng);CHKERRQ(ierr); 4412712d1f2SDave May swarm->view_ng = ng; 4422712d1f2SDave May 4432712d1f2SDave May PetscFunctionReturn(0); 4442712d1f2SDave May } 4452712d1f2SDave May 4462712d1f2SDave May #undef __FUNCT__ 4472712d1f2SDave May #define __FUNCT__ "DMSwarmGlobalToLocalViewDestroy" 4482712d1f2SDave May PETSC_EXTERN PetscErrorCode DMSwarmGlobalToLocalViewDestroy(DM dm,InsertMode mode) 4492712d1f2SDave May { 4502712d1f2SDave May PetscErrorCode ierr; 4512712d1f2SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4522712d1f2SDave May 4532712d1f2SDave May if (mode != INSERT_VALUES) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Only mode INSERT_VALUES is supported"); 4542712d1f2SDave May 4552712d1f2SDave May ierr = DMSwarmSetLocalSizes(dm,swarm->view_ng,-1);CHKERRQ(ierr); 4562712d1f2SDave May 4572712d1f2SDave May PetscFunctionReturn(0); 4582712d1f2SDave May } 4593454631fSDave May 4603454631fSDave May #undef __FUNCT__ 4613454631fSDave May #define __FUNCT__ "DMSetup_Swarm" 4623454631fSDave May PetscErrorCode DMSetup_Swarm(DM dm) 4633454631fSDave May { 4643454631fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4653454631fSDave May PetscErrorCode ierr; 4663454631fSDave May PetscMPIInt rank; 4673454631fSDave May PetscInt p,npoints,*rankval; 4683454631fSDave May 4693454631fSDave May if (swarm->issetup) PetscFunctionReturn(0); 4703454631fSDave May 4713454631fSDave May PetscPrintf(PETSC_COMM_SELF,"Swarm setup \n"); 4723454631fSDave May swarm->issetup = PETSC_TRUE; 4733454631fSDave May 4743454631fSDave May /* check some fields were registered */ 4753454631fSDave May if (swarm->db->nfields <= 2) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"At least one field user must be registered via DMSwarmRegisterXXX()"); 4763454631fSDave May 4773454631fSDave May /* check local sizes were set */ 4783454631fSDave May if (swarm->db->L == -1) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Local sizes must be set via DMSwarmSetLocalSizes()"); 4793454631fSDave May 4803454631fSDave May /* initialize values in pid and rank placeholders */ 4813454631fSDave May /* TODO: [pid - use MPI_Scan] */ 4823454631fSDave May 4833454631fSDave May ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)dm),&rank);CHKERRQ(ierr); 4843454631fSDave May ierr = DataBucketGetSizes(swarm->db,&npoints,NULL,NULL);CHKERRQ(ierr); 4853454631fSDave May ierr = DMSwarmGetField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr); 4863454631fSDave May for (p=0; p<npoints; p++) { 4873454631fSDave May rankval[p] = (PetscInt)rank; 4883454631fSDave May } 4893454631fSDave May ierr = DMSwarmRestoreField(dm,"DMSwarm_rank",NULL,NULL,(void**)&rankval);CHKERRQ(ierr); 4903454631fSDave May 4913454631fSDave May PetscFunctionReturn(0); 4923454631fSDave May } 4933454631fSDave May 494b62e03f8SDave May #undef __FUNCT__ 49557795646SDave May #define __FUNCT__ "DMDestroy_Swarm" 49657795646SDave May PetscErrorCode DMDestroy_Swarm(DM dm) 49757795646SDave May { 49857795646SDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 49957795646SDave May PetscErrorCode ierr; 50057795646SDave May 50157795646SDave May PetscFunctionBegin; 5026845f8f5SDave May ierr = DataBucketDestroy(&swarm->db);CHKERRQ(ierr); 50357795646SDave May ierr = PetscFree(swarm);CHKERRQ(ierr); 50457795646SDave May PetscFunctionReturn(0); 50557795646SDave May } 50657795646SDave May 50757795646SDave May #undef __FUNCT__ 5085f50eb2eSDave May #define __FUNCT__ "DMView_Swarm" 5095f50eb2eSDave May PetscErrorCode DMView_Swarm(DM dm, PetscViewer viewer) 5105f50eb2eSDave May { 5115f50eb2eSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 5125f50eb2eSDave May PetscBool iascii,ibinary,ishdf5,isvtk; 5135f50eb2eSDave May PetscErrorCode ierr; 5145f50eb2eSDave May 5155f50eb2eSDave May PetscFunctionBegin; 5165f50eb2eSDave May PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5175f50eb2eSDave May PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 5185f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 5195f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY,&ibinary);CHKERRQ(ierr); 5205f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 5215f50eb2eSDave May ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 5225f50eb2eSDave May if (iascii) { 5236845f8f5SDave May ierr = DataBucketView(PetscObjectComm((PetscObject)dm),swarm->db,NULL,DATABUCKET_VIEW_STDOUT);CHKERRQ(ierr); 5245f50eb2eSDave May } else if (ibinary) { 5255f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO VTK support"); 5265f50eb2eSDave May } else if (ishdf5) { 5275f50eb2eSDave May #if defined(PETSC_HAVE_HDF5) 5285f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO HDF5 support"); 5295f50eb2eSDave May #else 5305f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"HDF5 not supported. Please reconfigure using --download-hdf5"); 5315f50eb2eSDave May #endif 5325f50eb2eSDave May } else if (isvtk) { 5335f50eb2eSDave May SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"NO VTK support"); 5345f50eb2eSDave May } 5355f50eb2eSDave May PetscFunctionReturn(0); 5365f50eb2eSDave May } 5375f50eb2eSDave May 5385f50eb2eSDave May #undef __FUNCT__ 53957795646SDave May #define __FUNCT__ "DMCreate_Swarm" 54057795646SDave May PETSC_EXTERN PetscErrorCode DMCreate_Swarm(DM dm) 54157795646SDave May { 54257795646SDave May DM_Swarm *swarm; 54357795646SDave May PetscErrorCode ierr; 54457795646SDave May 54557795646SDave May PetscFunctionBegin; 54657795646SDave May PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 54757795646SDave May ierr = PetscNewLog(dm,&swarm);CHKERRQ(ierr); 54857795646SDave May 5496845f8f5SDave May ierr = DataBucketCreate(&swarm->db);CHKERRQ(ierr); 550b5bcf523SDave May swarm->vec_field_set = PETSC_FALSE; 5513454631fSDave May swarm->issetup = PETSC_FALSE; 552b62e03f8SDave May 55357795646SDave May dm->dim = 0; 55457795646SDave May dm->data = swarm; 55557795646SDave May 5565f50eb2eSDave May dm->ops->view = DMView_Swarm; 55757795646SDave May dm->ops->load = NULL; 55857795646SDave May dm->ops->setfromoptions = NULL; 55957795646SDave May dm->ops->clone = NULL; 5603454631fSDave May dm->ops->setup = DMSetup_Swarm; 56157795646SDave May dm->ops->createdefaultsection = NULL; 56257795646SDave May dm->ops->createdefaultconstraints = NULL; 563b5bcf523SDave May dm->ops->createglobalvector = DMCreateGlobalVector_Swarm; 564b5bcf523SDave May dm->ops->createlocalvector = DMCreateLocalVector_Swarm; 56557795646SDave May dm->ops->getlocaltoglobalmapping = NULL; 56657795646SDave May dm->ops->createfieldis = NULL; 56757795646SDave May dm->ops->createcoordinatedm = NULL; 56857795646SDave May dm->ops->getcoloring = NULL; 56957795646SDave May dm->ops->creatematrix = NULL; 57057795646SDave May dm->ops->createinterpolation = NULL; 57157795646SDave May dm->ops->getaggregates = NULL; 57257795646SDave May dm->ops->getinjection = NULL; 57357795646SDave May dm->ops->refine = NULL; 57457795646SDave May dm->ops->coarsen = NULL; 57557795646SDave May dm->ops->refinehierarchy = NULL; 57657795646SDave May dm->ops->coarsenhierarchy = NULL; 57757795646SDave May dm->ops->globaltolocalbegin = NULL; 57857795646SDave May dm->ops->globaltolocalend = NULL; 57957795646SDave May dm->ops->localtoglobalbegin = NULL; 58057795646SDave May dm->ops->localtoglobalend = NULL; 58157795646SDave May dm->ops->destroy = DMDestroy_Swarm; 58257795646SDave May dm->ops->createsubdm = NULL; 58357795646SDave May dm->ops->getdimpoints = NULL; 58457795646SDave May dm->ops->locatepoints = NULL; 58557795646SDave May 58657795646SDave May PetscFunctionReturn(0); 58757795646SDave May }