Actual source code: dadestroy.c
1: #define PETSCDM_DLL
3: /*
4: Code for manipulating distributed regular arrays in parallel.
5: */
7: #include src/dm/da/daimpl.h
9: /* Logging support */
10: PetscCookie PETSCDM_DLLEXPORT DA_COOKIE = 0;
11: PetscEvent DA_GlobalToLocal = 0, DA_LocalToGlobal = 0, DA_LocalADFunction = 0;
15: /*@C
16: DADestroy - Destroys a distributed array.
18: Collective on DA
20: Input Parameter:
21: . da - the distributed array to destroy
23: Level: beginner
25: .keywords: distributed array, destroy
27: .seealso: DACreate1d(), DACreate2d(), DACreate3d()
28: @*/
29: PetscErrorCode PETSCDM_DLLEXPORT DADestroy(DA da)
30: {
32: PetscErrorCode i,cnt = 0;
37: for (i=0; i<DA_MAX_WORK_VECTORS; i++) {
38: if (da->localin[i]) {cnt++;}
39: if (da->globalin[i]) {cnt++;}
40: }
42: if (--da->refct - cnt > 0) return(0);
43: /*
44: Need this test because the da references the vectors that
45: reference the da, so destroying the da calls destroy on the
46: vectors that cause another destroy on the da
47: */
48: if (da->refct < 0) return(0);
49: da->refct = 0;
51: for (i=0; i<DA_MAX_WORK_VECTORS; i++) {
52: if (da->localout[i]) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Destroying a DA that has a local vector obtained with DAGetLocalVector()");
53: if (da->localin[i]) {VecDestroy(da->localin[i]);}
54: if (da->globalout[i]) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Destroying a DA that has a global vector obtained with DAGetGlobalVector()");
55: if (da->globalin[i]) {VecDestroy(da->globalin[i]);}
56: }
58: for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
59: if (da->adstartghostedout[i]){
60: PetscFree(da->adstartghostedout[i]);
61: }
62: if (da->adstartghostedin[i]){
63: PetscFree(da->adstartghostedin[i]);
64: }
65: if (da->adstartout[i]){
66: PetscFree(da->adstartout[i]);
67: }
68: if (da->adstartin[i]){
69: PetscFree(da->adstartin[i]);
70: }
71: }
72: for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
73: if (da->admfstartghostedout[i]){
74: PetscFree(da->admfstartghostedout[i]);
75: }
76: if (da->admfstartghostedin[i]){
77: PetscFree(da->admfstartghostedin[i]);
78: }
79: if (da->admfstartout[i]){
80: PetscFree(da->admfstartout[i]);
81: }
82: if (da->admfstartin[i]){
83: PetscFree(da->admfstartin[i]);
84: }
85: }
86: for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
87: if (da->startghostedout[i]){
88: PetscFree(da->startghostedout[i]);
89: }
90: if (da->startghostedin[i]){
91: PetscFree(da->startghostedin[i]);
92: }
93: if (da->startout[i]){
94: PetscFree(da->startout[i]);
95: }
96: if (da->startin[i]){
97: PetscFree(da->startin[i]);
98: }
99: }
101: /* if memory was published with AMS then destroy it */
102: PetscObjectDepublish(da);
104: if (da->ltog) {VecScatterDestroy(da->ltog);}
105: if (da->gtol) {VecScatterDestroy(da->gtol);}
106: if (da->ltol) {VecScatterDestroy(da->ltol);}
107: if (da->natural){
108: VecDestroy(da->natural);
109: }
110: if (da->gton) {
111: VecScatterDestroy(da->gton);
112: }
114: if (da->ao) {
115: AODestroy(da->ao);
116: }
117: ISLocalToGlobalMappingDestroy(da->ltogmap);
118: ISLocalToGlobalMappingDestroy(da->ltogmapb);
120: if (da->lx) {PetscFree(da->lx);}
121: if (da->ly) {PetscFree(da->ly);}
122: if (da->lz) {PetscFree(da->lz);}
124: for (i=0; i<da->w; i++) {
125: PetscStrfree(da->fieldname[i]);
126: }
127: PetscFree(da->fieldname);
129: if (da->localcoloring) {
130: ISColoringDestroy(da->localcoloring);
131: }
132: if (da->ghostedcoloring) {
133: ISColoringDestroy(da->ghostedcoloring);
134: }
136: if (da->coordinates) {VecDestroy(da->coordinates);}
137: if (da->ghosted_coordinates) {VecDestroy(da->ghosted_coordinates);}
138: if (da->da_coordinates && da != da->da_coordinates) {DADestroy(da->da_coordinates);}
140: if (da->dfill) {PetscFree(da->dfill);}
141: if (da->ofill) {PetscFree(da->ofill);}
142: if (da->e) {PetscFree(da->e);}
144: PetscHeaderDestroy(da);
145: return(0);
146: }
150: /*@C
151: DAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DA.
153: Not Collective
155: Input Parameter:
156: . da - the distributed array that provides the mapping
158: Output Parameter:
159: . ltog - the mapping
161: Level: intermediate
163: Notes:
164: This mapping can them be used by VecSetLocalToGlobalMapping() or
165: MatSetLocalToGlobalMapping().
167: Essentially the same data is returned in the form of an integer array
168: with the routine DAGetGlobalIndices().
170: .keywords: distributed array, destroy
172: .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(),
173: MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMappingBlck()
174: @*/
175: PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMapping(DA da,ISLocalToGlobalMapping *map)
176: {
180: *map = da->ltogmap;
181: return(0);
182: }
186: /*@C
187: DAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DA.
189: Not Collective
191: Input Parameter:
192: . da - the distributed array that provides the mapping
194: Output Parameter:
195: . ltog - the mapping
197: Level: intermediate
199: Notes:
200: This mapping can them be used by VecSetLocalToGlobalMappingBlock() or
201: MatSetLocalToGlobalMappingBlock().
203: Essentially the same data is returned in the form of an integer array
204: with the routine DAGetGlobalIndices().
206: .keywords: distributed array, destroy
208: .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(),
209: MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMapping()
210: @*/
211: PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMappingBlck(DA da,ISLocalToGlobalMapping *map)
212: {
216: *map = da->ltogmapb;
217: return(0);
218: }