1 2 /* 3 Defines the abstract operations on AO (application orderings) 4 */ 5 #include <../src/vec/is/ao/aoimpl.h> /*I "petscao.h" I*/ 6 7 /* Logging support */ 8 PetscClassId AO_CLASSID; 9 PetscLogEvent AO_PetscToApplication, AO_ApplicationToPetsc; 10 11 /*@C 12 AOView - Displays an application ordering. 13 14 Collective on AO 15 16 Input Parameters: 17 + ao - the application ordering context 18 - viewer - viewer used for display 19 20 Level: intermediate 21 22 Options Database Key: 23 . -ao_view - calls AOView() at end of AOCreate() 24 25 Note: 26 The available visualization contexts include 27 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 28 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 29 output where only the first processor opens 30 the file. All other processors send their 31 data to the first processor to print. 32 33 The user can open an alternative visualization context with 34 PetscViewerASCIIOpen() - output to a specified file. 35 36 .seealso: PetscViewerASCIIOpen() 37 @*/ 38 PetscErrorCode AOView(AO ao,PetscViewer viewer) 39 { 40 PetscErrorCode ierr; 41 42 PetscFunctionBegin; 43 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 44 if (!viewer) { 45 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ao),&viewer);CHKERRQ(ierr); 46 } 47 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 48 49 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)ao,viewer);CHKERRQ(ierr); 50 ierr = (*ao->ops->view)(ao,viewer);CHKERRQ(ierr); 51 PetscFunctionReturn(0); 52 } 53 54 /*@C 55 AOViewFromOptions - View from Options 56 57 Collective on AO 58 59 Input Parameters: 60 + ao - the application ordering context 61 . obj - Optional object 62 - name - command line option 63 64 Level: intermediate 65 .seealso: AO, AOView, PetscObjectViewFromOptions(), AOCreate() 66 @*/ 67 PetscErrorCode AOViewFromOptions(AO ao,PetscObject obj,const char name[]) 68 { 69 PetscErrorCode ierr; 70 71 PetscFunctionBegin; 72 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 73 ierr = PetscObjectViewFromOptions((PetscObject)ao,obj,name);CHKERRQ(ierr); 74 PetscFunctionReturn(0); 75 } 76 77 /*@ 78 AODestroy - Destroys an application ordering. 79 80 Collective on AO 81 82 Input Parameters: 83 . ao - the application ordering context 84 85 Level: beginner 86 87 .seealso: AOCreate() 88 @*/ 89 PetscErrorCode AODestroy(AO *ao) 90 { 91 PetscErrorCode ierr; 92 93 PetscFunctionBegin; 94 if (!*ao) PetscFunctionReturn(0); 95 PetscValidHeaderSpecific((*ao),AO_CLASSID,1); 96 if (--((PetscObject)(*ao))->refct > 0) {*ao = 0; PetscFunctionReturn(0);} 97 /* if memory was published with SAWs then destroy it */ 98 ierr = PetscObjectSAWsViewOff((PetscObject)*ao);CHKERRQ(ierr); 99 ierr = ISDestroy(&(*ao)->isapp);CHKERRQ(ierr); 100 ierr = ISDestroy(&(*ao)->ispetsc);CHKERRQ(ierr); 101 /* destroy the internal part */ 102 if ((*ao)->ops->destroy) { 103 ierr = (*(*ao)->ops->destroy)(*ao);CHKERRQ(ierr); 104 } 105 ierr = PetscHeaderDestroy(ao);CHKERRQ(ierr); 106 PetscFunctionReturn(0); 107 } 108 109 110 #include <../src/vec/is/is/impls/general/general.h> 111 /* ---------------------------------------------------------------------*/ 112 113 PETSC_INTERN PetscErrorCode ISSetUp_General(IS); 114 115 /*@ 116 AOPetscToApplicationIS - Maps an index set in the PETSc ordering to 117 the application-defined ordering. 118 119 Collective on AO 120 121 Input Parameters: 122 + ao - the application ordering context 123 - is - the index set; this is replaced with its mapped values 124 125 Output Parameter: 126 . is - the mapped index set 127 128 Level: intermediate 129 130 Notes: 131 The index set cannot be of type stride or block 132 133 Any integers in ia[] that are negative are left unchanged. This 134 allows one to convert, for example, neighbor lists that use negative 135 entries to indicate nonexistent neighbors due to boundary conditions 136 etc. 137 138 .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(), 139 AOApplicationToPetscIS(),AOPetscToApplication() 140 @*/ 141 PetscErrorCode AOPetscToApplicationIS(AO ao,IS is) 142 { 143 PetscErrorCode ierr; 144 PetscInt n; 145 PetscInt *ia; 146 147 PetscFunctionBegin; 148 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 149 PetscValidHeaderSpecific(is,IS_CLASSID,2); 150 ierr = ISToGeneral(is);CHKERRQ(ierr); 151 /* we cheat because we know the is is general and that we can change the indices */ 152 ierr = ISGetIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr); 153 ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr); 154 ierr = (*ao->ops->petsctoapplication)(ao,n,ia);CHKERRQ(ierr); 155 ierr = ISRestoreIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr); 156 /* updated cached values (sorted, min, max, etc.)*/ 157 ierr = ISSetUp_General(is);CHKERRQ(ierr); 158 PetscFunctionReturn(0); 159 } 160 161 /*@ 162 AOApplicationToPetscIS - Maps an index set in the application-defined 163 ordering to the PETSc ordering. 164 165 Collective on AO 166 167 Input Parameters: 168 + ao - the application ordering context 169 - is - the index set; this is replaced with its mapped values 170 171 Output Parameter: 172 . is - the mapped index set 173 174 Level: beginner 175 176 Note: 177 The index set cannot be of type stride or block 178 179 Any integers in ia[] that are negative are left unchanged. This 180 allows one to convert, for example, neighbor lists that use negative 181 entries to indicate nonexistent neighbors due to boundary conditions, etc. 182 183 .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(), 184 AOPetscToApplicationIS(), AOApplicationToPetsc() 185 @*/ 186 PetscErrorCode AOApplicationToPetscIS(AO ao,IS is) 187 { 188 PetscErrorCode ierr; 189 PetscInt n,*ia; 190 191 PetscFunctionBegin; 192 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 193 PetscValidHeaderSpecific(is,IS_CLASSID,2); 194 ierr = ISToGeneral(is);CHKERRQ(ierr); 195 /* we cheat because we know the is is general and that we can change the indices */ 196 ierr = ISGetIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr); 197 ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr); 198 ierr = (*ao->ops->applicationtopetsc)(ao,n,ia);CHKERRQ(ierr); 199 ierr = ISRestoreIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr); 200 /* updated cached values (sorted, min, max, etc.)*/ 201 ierr = ISSetUp_General(is);CHKERRQ(ierr); 202 PetscFunctionReturn(0); 203 } 204 205 /*@ 206 AOPetscToApplication - Maps a set of integers in the PETSc ordering to 207 the application-defined ordering. 208 209 Collective on AO 210 211 Input Parameters: 212 + ao - the application ordering context 213 . n - the number of integers 214 - ia - the integers; these are replaced with their mapped value 215 216 Output Parameter: 217 . ia - the mapped integers 218 219 Level: beginner 220 221 Note: 222 Any integers in ia[] that are negative are left unchanged. This 223 allows one to convert, for example, neighbor lists that use negative 224 entries to indicate nonexistent neighbors due to boundary conditions, etc. 225 226 Integers that are out of range are mapped to -1 227 228 .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(), 229 AOPetscToApplicationIS(), AOApplicationToPetsc() 230 @*/ 231 PetscErrorCode AOPetscToApplication(AO ao,PetscInt n,PetscInt ia[]) 232 { 233 PetscErrorCode ierr; 234 235 PetscFunctionBegin; 236 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 237 if (n) PetscValidIntPointer(ia,3); 238 ierr = (*ao->ops->petsctoapplication)(ao,n,ia);CHKERRQ(ierr); 239 PetscFunctionReturn(0); 240 } 241 242 /*@ 243 AOApplicationToPetsc - Maps a set of integers in the application-defined 244 ordering to the PETSc ordering. 245 246 Collective on AO 247 248 Input Parameters: 249 + ao - the application ordering context 250 . n - the number of integers 251 - ia - the integers; these are replaced with their mapped value 252 253 Output Parameter: 254 . ia - the mapped integers 255 256 Level: beginner 257 258 Note: 259 Any integers in ia[] that are negative are left unchanged. This 260 allows one to convert, for example, neighbor lists that use negative 261 entries to indicate nonexistent neighbors due to boundary conditions, etc. 262 263 Integers that are out of range are mapped to -1 264 265 .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(), 266 AOPetscToApplicationIS(), AOApplicationToPetsc() 267 @*/ 268 PetscErrorCode AOApplicationToPetsc(AO ao,PetscInt n,PetscInt ia[]) 269 { 270 PetscErrorCode ierr; 271 272 PetscFunctionBegin; 273 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 274 if (n) PetscValidIntPointer(ia,3); 275 ierr = (*ao->ops->applicationtopetsc)(ao,n,ia);CHKERRQ(ierr); 276 PetscFunctionReturn(0); 277 } 278 279 /*@ 280 AOPetscToApplicationPermuteInt - Permutes an array of blocks of integers 281 in the PETSc ordering to the application-defined ordering. 282 283 Collective on AO 284 285 Input Parameters: 286 + ao - The application ordering context 287 . block - The block size 288 - array - The integer array 289 290 Output Parameter: 291 . array - The permuted array 292 293 Note: The length of the array should be block*N, where N is length 294 provided to the AOCreate*() method that created the AO. 295 296 The permutation takes array[i_pet] --> array[i_app], where i_app is 297 the index of 'i' in the application ordering and i_pet is the index 298 of 'i' in the petsc ordering. 299 300 Level: beginner 301 302 .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS() 303 @*/ 304 PetscErrorCode AOPetscToApplicationPermuteInt(AO ao, PetscInt block, PetscInt array[]) 305 { 306 PetscErrorCode ierr; 307 308 PetscFunctionBegin; 309 PetscValidHeaderSpecific(ao, AO_CLASSID,1); 310 PetscValidIntPointer(array,3); 311 ierr = (*ao->ops->petsctoapplicationpermuteint)(ao, block, array);CHKERRQ(ierr); 312 PetscFunctionReturn(0); 313 } 314 315 /*@ 316 AOApplicationToPetscPermuteInt - Permutes an array of blocks of integers 317 in the application-defined ordering to the PETSc ordering. 318 319 Collective on AO 320 321 Input Parameters: 322 + ao - The application ordering context 323 . block - The block size 324 - array - The integer array 325 326 Output Parameter: 327 . array - The permuted array 328 329 Note: The length of the array should be block*N, where N is length 330 provided to the AOCreate*() method that created the AO. 331 332 The permutation takes array[i_app] --> array[i_pet], where i_app is 333 the index of 'i' in the application ordering and i_pet is the index 334 of 'i' in the petsc ordering. 335 336 Level: beginner 337 338 .seealso: AOCreateBasic(), AOView(), AOPetscToApplicationIS(), AOApplicationToPetsc() 339 @*/ 340 PetscErrorCode AOApplicationToPetscPermuteInt(AO ao, PetscInt block, PetscInt array[]) 341 { 342 PetscErrorCode ierr; 343 344 PetscFunctionBegin; 345 PetscValidHeaderSpecific(ao, AO_CLASSID,1); 346 PetscValidIntPointer(array,3); 347 ierr = (*ao->ops->applicationtopetscpermuteint)(ao, block, array);CHKERRQ(ierr); 348 PetscFunctionReturn(0); 349 } 350 351 /*@ 352 AOPetscToApplicationPermuteReal - Permutes an array of blocks of reals 353 in the PETSc ordering to the application-defined ordering. 354 355 Collective on AO 356 357 Input Parameters: 358 + ao - The application ordering context 359 . block - The block size 360 - array - The integer array 361 362 Output Parameter: 363 . array - The permuted array 364 365 Note: The length of the array should be block*N, where N is length 366 provided to the AOCreate*() method that created the AO. 367 368 The permutation takes array[i_pet] --> array[i_app], where i_app is 369 the index of 'i' in the application ordering and i_pet is the index 370 of 'i' in the petsc ordering. 371 372 Level: beginner 373 374 .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS() 375 @*/ 376 PetscErrorCode AOPetscToApplicationPermuteReal(AO ao, PetscInt block, PetscReal array[]) 377 { 378 PetscErrorCode ierr; 379 380 PetscFunctionBegin; 381 PetscValidHeaderSpecific(ao, AO_CLASSID,1); 382 PetscValidIntPointer(array,3); 383 ierr = (*ao->ops->petsctoapplicationpermutereal)(ao, block, array);CHKERRQ(ierr); 384 PetscFunctionReturn(0); 385 } 386 387 /*@ 388 AOApplicationToPetscPermuteReal - Permutes an array of blocks of reals 389 in the application-defined ordering to the PETSc ordering. 390 391 Collective on AO 392 393 Input Parameters: 394 + ao - The application ordering context 395 . block - The block size 396 - array - The integer array 397 398 Output Parameter: 399 . array - The permuted array 400 401 Note: The length of the array should be block*N, where N is length 402 provided to the AOCreate*() method that created the AO. 403 404 The permutation takes array[i_app] --> array[i_pet], where i_app is 405 the index of 'i' in the application ordering and i_pet is the index 406 of 'i' in the petsc ordering. 407 408 Level: beginner 409 410 .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(), AOPetscToApplicationIS() 411 @*/ 412 PetscErrorCode AOApplicationToPetscPermuteReal(AO ao, PetscInt block, PetscReal array[]) 413 { 414 PetscErrorCode ierr; 415 416 PetscFunctionBegin; 417 PetscValidHeaderSpecific(ao, AO_CLASSID,1); 418 PetscValidIntPointer(array,3); 419 ierr = (*ao->ops->applicationtopetscpermutereal)(ao, block, array);CHKERRQ(ierr); 420 PetscFunctionReturn(0); 421 } 422 423 /*@ 424 AOSetFromOptions - Sets AO options from the options database. 425 426 Collective on AO 427 428 Input Parameter: 429 . ao - the application ordering 430 431 Level: beginner 432 433 .seealso: AOCreate(), AOSetType(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc() 434 @*/ 435 PetscErrorCode AOSetFromOptions(AO ao) 436 { 437 PetscErrorCode ierr; 438 char type[256]; 439 const char *def=AOBASIC; 440 PetscBool flg; 441 442 PetscFunctionBegin; 443 PetscValidHeaderSpecific(ao,AO_CLASSID,1); 444 445 ierr = PetscObjectOptionsBegin((PetscObject)ao);CHKERRQ(ierr); 446 ierr = PetscOptionsFList("-ao_type","AO type","AOSetType",AOList,def,type,256,&flg);CHKERRQ(ierr); 447 if (flg) { 448 ierr = AOSetType(ao,type);CHKERRQ(ierr); 449 } else if (!((PetscObject)ao)->type_name) { 450 ierr = AOSetType(ao,def);CHKERRQ(ierr); 451 } 452 ierr = PetscOptionsEnd();CHKERRQ(ierr); 453 PetscFunctionReturn(0); 454 } 455 456 /*@ 457 AOSetIS - Sets the IS associated with the application ordering. 458 459 Collective 460 461 Input Parameters: 462 + ao - the application ordering 463 . isapp - index set that defines an ordering 464 - ispetsc - index set that defines another ordering (may be NULL to use the 465 natural ordering) 466 467 Notes: 468 The index sets isapp and ispetsc are used only for creation of ao. 469 470 This routine increases the reference count of isapp and ispetsc so you may/should destroy these arguments after this call if you no longer need them 471 472 Level: beginner 473 474 .seealso: AOCreate(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc() 475 @*/ 476 PetscErrorCode AOSetIS(AO ao,IS isapp,IS ispetsc) 477 { 478 PetscErrorCode ierr; 479 480 PetscFunctionBegin; 481 if (ispetsc) { 482 PetscInt napp,npetsc; 483 ierr = ISGetLocalSize(isapp,&napp);CHKERRQ(ierr); 484 ierr = ISGetLocalSize(ispetsc,&npetsc);CHKERRQ(ierr); 485 if (napp != npetsc) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"napp %D != npetsc %D. Local IS lengths must match",napp,npetsc); 486 } 487 if (isapp) {ierr = PetscObjectReference((PetscObject)isapp);CHKERRQ(ierr);} 488 if (ispetsc) {ierr = PetscObjectReference((PetscObject)ispetsc);CHKERRQ(ierr);} 489 ierr = ISDestroy(&ao->isapp);CHKERRQ(ierr); 490 ierr = ISDestroy(&ao->ispetsc);CHKERRQ(ierr); 491 ao->isapp = isapp; 492 ao->ispetsc = ispetsc; 493 PetscFunctionReturn(0); 494 } 495 496 /*@ 497 AOCreate - Creates an application ordering. 498 499 Collective 500 501 Input Parameters: 502 . comm - MPI communicator that is to share AO 503 504 Output Parameter: 505 . ao - the new application ordering 506 507 Options Database Key: 508 + -ao_type <aotype> - create ao with particular format 509 - -ao_view - call AOView() at the conclusion of AOCreate() 510 511 Level: beginner 512 513 .seealso: AOSetIS(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc() 514 @*/ 515 PetscErrorCode AOCreate(MPI_Comm comm,AO *ao) 516 { 517 PetscErrorCode ierr; 518 AO aonew; 519 520 PetscFunctionBegin; 521 PetscValidPointer(ao,2); 522 *ao = NULL; 523 ierr = AOInitializePackage();CHKERRQ(ierr); 524 525 ierr = PetscHeaderCreate(aonew,AO_CLASSID,"AO","Application Ordering","AO",comm,AODestroy,AOView);CHKERRQ(ierr); 526 *ao = aonew; 527 PetscFunctionReturn(0); 528 } 529