1 2 #include <petscao.h> 3 #include <petsc/private/dmlabelimpl.h> 4 #include <petsc/private/dmfieldimpl.h> 5 #include <petsc/private/dmpleximpl.h> 6 #include <petsc/private/petscdsimpl.h> 7 #include <petsc/private/petscfeimpl.h> 8 #include <petsc/private/petscfvimpl.h> 9 #include <petsc/private/dmswarmimpl.h> 10 11 static PetscBool DMPackageInitialized = PETSC_FALSE; 12 /*@C 13 DMFinalizePackage - This function finalizes everything in the DM package. It is called 14 from PetscFinalize(). 15 16 Level: developer 17 18 .seealso: PetscInitialize() 19 @*/ 20 PetscErrorCode DMFinalizePackage(void) 21 { 22 PetscErrorCode ierr; 23 24 PetscFunctionBegin; 25 ierr = PetscFunctionListDestroy(&PetscPartitionerList);CHKERRQ(ierr); 26 ierr = PetscFunctionListDestroy(&DMList);CHKERRQ(ierr); 27 DMPackageInitialized = PETSC_FALSE; 28 DMRegisterAllCalled = PETSC_FALSE; 29 PetscPartitionerRegisterAllCalled = PETSC_FALSE; 30 PetscFunctionReturn(0); 31 } 32 33 #if defined(PETSC_HAVE_HYPRE) 34 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat); 35 PETSC_EXTERN PetscErrorCode MatCreate_HYPRESStruct(Mat); 36 #endif 37 38 /*@C 39 DMInitializePackage - This function initializes everything in the DM package. It is called 40 from PetscDLLibraryRegister_petscdm() when using dynamic libraries, and on the first call to AOCreate() 41 or DMDACreate() when using shared or static libraries. 42 43 Level: developer 44 45 .seealso: PetscInitialize() 46 @*/ 47 PetscErrorCode DMInitializePackage(void) 48 { 49 char logList[256]; 50 PetscBool opt,pkg; 51 PetscErrorCode ierr; 52 53 PetscFunctionBegin; 54 if (DMPackageInitialized) PetscFunctionReturn(0); 55 DMPackageInitialized = PETSC_TRUE; 56 57 /* Register Classes */ 58 ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr); 59 ierr = PetscClassIdRegister("DM Label",&DMLABEL_CLASSID);CHKERRQ(ierr); 60 ierr = PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr); 61 62 #if defined(PETSC_HAVE_HYPRE) 63 ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr); 64 ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr); 65 #endif 66 ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr); 67 68 /* Register Constructors */ 69 ierr = DMRegisterAll();CHKERRQ(ierr); 70 /* Register Events */ 71 ierr = PetscLogEventRegister("DMConvert", DM_CLASSID,&DM_Convert);CHKERRQ(ierr); 72 ierr = PetscLogEventRegister("DMGlobalToLocal", DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr); 73 ierr = PetscLogEventRegister("DMLocalToGlobal", DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr); 74 ierr = PetscLogEventRegister("DMLocatePoints", DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr); 75 ierr = PetscLogEventRegister("DMCoarsen", DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr); 76 ierr = PetscLogEventRegister("DMCreateInterp", DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr); 77 ierr = PetscLogEventRegister("DMCreateRestrict", DM_CLASSID,&DM_CreateRestriction);CHKERRQ(ierr); 78 ierr = PetscLogEventRegister("DMCreateMat", DM_CLASSID,&DM_CreateMatrix);CHKERRQ(ierr); 79 80 ierr = PetscLogEventRegister("Mesh Partition", DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr); 81 ierr = PetscLogEventRegister("Mesh Migration", DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr); 82 ierr = PetscLogEventRegister("DMPlexPartSelf", DM_CLASSID,&DMPLEX_PartSelf);CHKERRQ(ierr); 83 ierr = PetscLogEventRegister("DMPlexPartLblInv", DM_CLASSID,&DMPLEX_PartLabelInvert);CHKERRQ(ierr); 84 ierr = PetscLogEventRegister("DMPlexPartLblSF", DM_CLASSID,&DMPLEX_PartLabelCreateSF);CHKERRQ(ierr); 85 ierr = PetscLogEventRegister("DMPlexPartStrtSF", DM_CLASSID,&DMPLEX_PartStratSF);CHKERRQ(ierr); 86 ierr = PetscLogEventRegister("DMPlexPointSF", DM_CLASSID,&DMPLEX_CreatePointSF);CHKERRQ(ierr); 87 ierr = PetscLogEventRegister("DMPlexInterp", DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr); 88 ierr = PetscLogEventRegister("DMPlexDistribute", DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr); 89 ierr = PetscLogEventRegister("DMPlexDistCones", DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr); 90 ierr = PetscLogEventRegister("DMPlexDistLabels", DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr); 91 ierr = PetscLogEventRegister("DMPlexDistSF", DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr); 92 ierr = PetscLogEventRegister("DMPlexDistOvrlp", DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr); 93 ierr = PetscLogEventRegister("DMPlexDistField", DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr); 94 ierr = PetscLogEventRegister("DMPlexDistData", DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr); 95 ierr = PetscLogEventRegister("DMPlexInterpSF", DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr); 96 ierr = PetscLogEventRegister("DMPlexGToNBegin", DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr); 97 ierr = PetscLogEventRegister("DMPlexGToNEnd", DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr); 98 ierr = PetscLogEventRegister("DMPlexNToGBegin", DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr); 99 ierr = PetscLogEventRegister("DMPlexNToGEnd", DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr); 100 ierr = PetscLogEventRegister("DMPlexStratify", DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr); 101 ierr = PetscLogEventRegister("DMPlexSymmetrize", DM_CLASSID,&DMPLEX_Symmetrize);CHKERRQ(ierr); 102 ierr = PetscLogEventRegister("DMPlexPrealloc", DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr); 103 ierr = PetscLogEventRegister("DMPlexResidualFE", DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr); 104 ierr = PetscLogEventRegister("DMPlexJacobianFE", DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr); 105 ierr = PetscLogEventRegister("DMPlexInterpFE", DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr); 106 ierr = PetscLogEventRegister("DMPlexInjectorFE", DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr); 107 ierr = PetscLogEventRegister("DMPlexIntegralFEM", DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr); 108 ierr = PetscLogEventRegister("DMPlexCreateGmsh", DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr); 109 ierr = PetscLogEventRegister("DMPlexRebalance", DM_CLASSID,&DMPLEX_RebalanceSharedPoints);CHKERRQ(ierr); 110 111 ierr = PetscLogEventRegister("DMSwarmMigrate", DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr); 112 ierr = PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr); 113 ierr = PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr); 114 ierr = PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr); 115 ierr = PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr); 116 ierr = PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr); 117 ierr = PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr); 118 ierr = PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr); 119 ierr = PetscLogEventRegister("DMSwarmSort", DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr); 120 ierr = PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr); 121 122 /* Process info exclusions */ 123 ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 124 if (opt) { 125 ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr); 126 if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);} 127 } 128 129 /* Process summary exclusions */ 130 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 131 if (opt) { 132 ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr); 133 if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);} 134 } 135 136 ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr); 137 ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr); 138 ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr); 139 PetscFunctionReturn(0); 140 } 141 #include <petscfe.h> 142 143 static PetscBool PetscFEPackageInitialized = PETSC_FALSE; 144 /*@C 145 PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called 146 from PetscFinalize(). 147 148 Level: developer 149 150 .seealso: PetscInitialize() 151 @*/ 152 PetscErrorCode PetscFEFinalizePackage(void) 153 { 154 PetscErrorCode ierr; 155 156 PetscFunctionBegin; 157 ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr); 158 ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr); 159 ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr); 160 PetscFEPackageInitialized = PETSC_FALSE; 161 PetscSpaceRegisterAllCalled = PETSC_FALSE; 162 PetscDualSpaceRegisterAllCalled = PETSC_FALSE; 163 PetscFERegisterAllCalled = PETSC_FALSE; 164 PetscFunctionReturn(0); 165 } 166 167 /*@C 168 PetscFEInitializePackage - This function initializes everything in the FE package. It is called 169 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate() 170 when using static libraries. 171 172 Level: developer 173 174 .seealso: PetscInitialize() 175 @*/ 176 PetscErrorCode PetscFEInitializePackage(void) 177 { 178 char logList[256]; 179 PetscBool opt,pkg; 180 PetscErrorCode ierr; 181 182 PetscFunctionBegin; 183 if (PetscFEPackageInitialized) PetscFunctionReturn(0); 184 PetscFEPackageInitialized = PETSC_TRUE; 185 186 /* Register Classes */ 187 ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr); 188 ierr = PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr); 189 ierr = PetscClassIdRegister("FE Space", &PETSCFE_CLASSID);CHKERRQ(ierr); 190 /* Register Constructors */ 191 ierr = PetscSpaceRegisterAll();CHKERRQ(ierr); 192 ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr); 193 ierr = PetscFERegisterAll();CHKERRQ(ierr); 194 /* Register Events */ 195 /* Process info exclusions */ 196 ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 197 if (opt) { 198 ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr); 199 if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);} 200 } 201 /* Process summary exclusions */ 202 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 203 if (opt) { 204 ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr); 205 if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);} 206 } 207 /* Register package finalizer */ 208 ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr); 209 PetscFunctionReturn(0); 210 } 211 #include <petscfv.h> 212 213 static PetscBool PetscFVPackageInitialized = PETSC_FALSE; 214 /*@C 215 PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called 216 from PetscFinalize(). 217 218 Level: developer 219 220 .seealso: PetscInitialize() 221 @*/ 222 PetscErrorCode PetscFVFinalizePackage(void) 223 { 224 PetscErrorCode ierr; 225 226 PetscFunctionBegin; 227 ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr); 228 ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr); 229 PetscFVPackageInitialized = PETSC_FALSE; 230 PetscFVRegisterAllCalled = PETSC_FALSE; 231 PetscLimiterRegisterAllCalled = PETSC_FALSE; 232 PetscFunctionReturn(0); 233 } 234 235 /*@C 236 PetscFVInitializePackage - This function initializes everything in the FV package. It is called 237 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate() 238 when using static libraries. 239 240 Level: developer 241 242 .seealso: PetscInitialize() 243 @*/ 244 PetscErrorCode PetscFVInitializePackage(void) 245 { 246 char logList[256]; 247 PetscBool opt,pkg; 248 PetscErrorCode ierr; 249 250 PetscFunctionBegin; 251 if (PetscFVPackageInitialized) PetscFunctionReturn(0); 252 PetscFVPackageInitialized = PETSC_TRUE; 253 254 /* Register Classes */ 255 ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr); 256 ierr = PetscClassIdRegister("Limiter", &PETSCLIMITER_CLASSID);CHKERRQ(ierr); 257 /* Register Constructors */ 258 ierr = PetscFVRegisterAll();CHKERRQ(ierr); 259 /* Register Events */ 260 /* Process info exclusions */ 261 ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 262 if (opt) { 263 ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr); 264 if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);} 265 ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr); 266 if (pkg) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);} 267 } 268 /* Process summary exclusions */ 269 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 270 if (opt) { 271 ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr); 272 if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);} 273 ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr); 274 if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);} 275 } 276 /* Register package finalizer */ 277 ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr); 278 PetscFunctionReturn(0); 279 } 280 #include <petscds.h> 281 282 static PetscBool PetscDSPackageInitialized = PETSC_FALSE; 283 /*@C 284 PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called 285 from PetscFinalize(). 286 287 Level: developer 288 289 .seealso: PetscInitialize() 290 @*/ 291 PetscErrorCode PetscDSFinalizePackage(void) 292 { 293 PetscErrorCode ierr; 294 295 PetscFunctionBegin; 296 ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr); 297 PetscDSPackageInitialized = PETSC_FALSE; 298 PetscDSRegisterAllCalled = PETSC_FALSE; 299 PetscFunctionReturn(0); 300 } 301 302 /*@C 303 PetscDSInitializePackage - This function initializes everything in the DS package. It is called 304 from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate() 305 when using static libraries. 306 307 Level: developer 308 309 .seealso: PetscInitialize() 310 @*/ 311 PetscErrorCode PetscDSInitializePackage(void) 312 { 313 char logList[256]; 314 PetscBool opt,pkg; 315 PetscErrorCode ierr; 316 317 PetscFunctionBegin; 318 if (PetscDSPackageInitialized) PetscFunctionReturn(0); 319 PetscDSPackageInitialized = PETSC_TRUE; 320 321 /* Register Classes */ 322 ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr); 323 /* Register Constructors */ 324 ierr = PetscDSRegisterAll();CHKERRQ(ierr); 325 /* Register Events */ 326 /* Process info exclusions */ 327 ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 328 if (opt) { 329 ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr); 330 if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);} 331 } 332 /* Process summary exclusions */ 333 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 334 if (opt) { 335 ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr); 336 if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);} 337 } 338 /* Register package finalizer */ 339 ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr); 340 PetscFunctionReturn(0); 341 } 342 343 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 344 /* 345 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 346 347 This one registers all the mesh generators and partitioners that are in 348 the basic DM library. 349 350 */ 351 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void) 352 { 353 PetscErrorCode ierr; 354 355 PetscFunctionBegin; 356 ierr = AOInitializePackage();CHKERRQ(ierr); 357 ierr = DMInitializePackage();CHKERRQ(ierr); 358 ierr = PetscFEInitializePackage();CHKERRQ(ierr); 359 ierr = PetscFVInitializePackage();CHKERRQ(ierr); 360 ierr = DMFieldInitializePackage();CHKERRQ(ierr); 361 PetscFunctionReturn(0); 362 } 363 364 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 365