Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | |||
11 | #pragma once | ||
12 | |||
13 | #include <slepcsys.h> | ||
14 | #include <petsc/private/petscimpl.h> | ||
15 | |||
16 | /* SUBMANSEC = Sys */ | ||
17 | |||
18 | SLEPC_INTERN PetscBool SlepcBeganPetsc; | ||
19 | |||
20 | /* SlepcSwap - swap two variables a,b of the same type using a temporary variable t */ | ||
21 | #define SlepcSwap(a,b,t) do {t=a;a=b;b=t;} while (0) | ||
22 | |||
23 | /*MC | ||
24 | SlepcHeaderCreate - Creates a SLEPc object | ||
25 | |||
26 | Input Parameters: | ||
27 | + classid - the classid associated with this object | ||
28 | . class_name - string name of class; should be static | ||
29 | . descr - string containing short description; should be static | ||
30 | . mansec - string indicating section in manual pages; should be static | ||
31 | . comm - the MPI Communicator | ||
32 | . destroy - the destroy routine for this object | ||
33 | - view - the view routine for this object | ||
34 | |||
35 | Output Parameter: | ||
36 | . h - the newly created object | ||
37 | |||
38 | Note: | ||
39 | This is equivalent to PetscHeaderCreate but makes sure that SlepcInitialize | ||
40 | has been called. | ||
41 | |||
42 | Level: developer | ||
43 | M*/ | ||
44 | #define SlepcHeaderCreate(h,classid,class_name,descr,mansec,comm,destroy,view) \ | ||
45 | ((PetscErrorCode)((!SlepcInitializeCalled && \ | ||
46 | PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,PETSC_ERR_ORDER,PETSC_ERROR_INITIAL, \ | ||
47 | "Must call SlepcInitialize instead of PetscInitialize to use SLEPc classes")) || \ | ||
48 | PetscHeaderCreate(h,classid,class_name,descr,mansec,comm,destroy,view))) | ||
49 | |||
50 | /* context for monitors of type XXXMonitorConverged */ | ||
51 | struct _n_SlepcConvMon { | ||
52 | void *ctx; | ||
53 | PetscInt oldnconv; /* previous value of nconv */ | ||
54 | }; | ||
55 | |||
56 | /* context for structured eigenproblem matrices created via MatCreateXXX */ | ||
57 | struct _n_SlepcMatStruct { | ||
58 | PetscInt cookie; /* identify which structured matrix */ | ||
59 | PetscScalar s; /* in BSE sign of the bottom part of the vector */ | ||
60 | }; | ||
61 | typedef struct _n_SlepcMatStruct* SlepcMatStruct; | ||
62 | |||
63 | #define SLEPC_MAT_STRUCT_BSE 88101 | ||
64 | #define SLEPC_MAT_STRUCT_HAMILT 88102 | ||
65 | |||
66 | /* | ||
67 | SlepcCheckMatStruct - Check that a given Mat is a structured matrix of the wanted type. | ||
68 | |||
69 | Returns true/false in flg if it is given, otherwise yields an error if the check fails. | ||
70 | If cookie==0 it will check for any type. | ||
71 | */ | ||
72 | 448 | static inline PetscErrorCode SlepcCheckMatStruct(Mat A,PetscInt cookie,PetscBool *flg) | |
73 | { | ||
74 | 448 | PetscContainer container; | |
75 | 448 | SlepcMatStruct mctx; | |
76 | |||
77 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
448 | PetscFunctionBegin; |
78 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
448 | if (flg) *flg = PETSC_FALSE; |
79 |
4/6✓ Branch 0 taken 4 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
|
448 | PetscCall(PetscObjectQuery((PetscObject)A,"SlepcMatStruct",(PetscObject*)&container)); |
80 |
10/16✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
448 | if (flg && !container) PetscFunctionReturn(PETSC_SUCCESS); |
81 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
369 | PetscCheck(container,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"The Mat is not a structured matrix"); |
82 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
369 | if (cookie) { |
83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
369 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
84 |
1/18✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
369 | if (flg && (!mctx || mctx->cookie!=cookie)) PetscFunctionReturn(PETSC_SUCCESS); |
85 |
2/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
369 | PetscCheck(mctx && mctx->cookie==cookie,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"The type of structured matrix is different from the expected one"); |
86 | } | ||
87 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
369 | if (flg) *flg = PETSC_TRUE; |
88 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
57 | PetscFunctionReturn(PETSC_SUCCESS); |
89 | } | ||
90 | |||
91 | /* | ||
92 | SlepcPrintEigenvalueASCII - Print an eigenvalue on an ASCII viewer. | ||
93 | */ | ||
94 | 53728 | static inline PetscErrorCode SlepcPrintEigenvalueASCII(PetscViewer viewer,PetscScalar eigr,PetscScalar eigi) | |
95 | { | ||
96 | 53728 | PetscReal re,im; | |
97 | |||
98 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
53728 | PetscFunctionBegin; |
99 | #if defined(PETSC_USE_COMPLEX) | ||
100 | 27143 | re = PetscRealPart(eigr); | |
101 | 27143 | im = PetscImaginaryPart(eigr); | |
102 | 27143 | (void)eigi; | |
103 | #else | ||
104 | 26585 | re = eigr; | |
105 | 26585 | im = eigi; | |
106 | #endif | ||
107 | /* print zero instead of tiny value */ | ||
108 |
8/8✓ Branch 0 taken 25 times.
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 25 times.
✓ Branch 4 taken 25 times.
✓ Branch 5 taken 25 times.
✓ Branch 6 taken 22 times.
✓ Branch 7 taken 23 times.
|
53728 | if (PetscAbs(im) && PetscAbs(re)/PetscAbs(im)<PETSC_SMALL) re = 0.0; |
109 |
8/8✓ Branch 0 taken 30 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 25 times.
✓ Branch 3 taken 30 times.
✓ Branch 4 taken 20 times.
✓ Branch 5 taken 30 times.
✓ Branch 6 taken 27 times.
✓ Branch 7 taken 28 times.
|
53446 | if (PetscAbs(re) && PetscAbs(im)/PetscAbs(re)<PETSC_SMALL) im = 0.0; |
110 | /* print as real if imaginary part is zero */ | ||
111 |
6/8✓ Branch 0 taken 25 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 20 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
|
28946 | if (im!=(PetscReal)0.0) PetscCall(PetscViewerASCIIPrintf(viewer,"%.5f%+.5fi",(double)re,(double)im)); |
112 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
49257 | else PetscCall(PetscViewerASCIIPrintf(viewer,"%.5f",(double)re)); |
113 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
10603 | PetscFunctionReturn(PETSC_SUCCESS); |
114 | } | ||
115 | |||
116 | /* | ||
117 | SlepcViewEigenvector - Outputs an eigenvector xr,xi to a viewer. | ||
118 | In complex scalars only xr is written. | ||
119 | The name of xr,xi is set before writing, based on the label, the index, and the name of obj. | ||
120 | */ | ||
121 | 135 | static inline PetscErrorCode SlepcViewEigenvector(PetscViewer viewer,Vec xr,Vec xi,const char *label,PetscInt index,PetscObject obj) | |
122 | { | ||
123 | 135 | size_t count; | |
124 | 135 | char vname[30]; | |
125 | 135 | const char *pname; | |
126 | |||
127 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
135 | PetscFunctionBegin; |
128 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
135 | PetscCall(PetscObjectGetName(obj,&pname)); |
129 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
135 | PetscCall(PetscSNPrintfCount(vname,sizeof(vname),"%s%s",&count,label,PetscDefined(USE_COMPLEX)?"":"r")); |
130 | 135 | count--; | |
131 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
135 | PetscCall(PetscSNPrintf(vname+count,sizeof(vname)-count,"%" PetscInt_FMT "_%s",index,pname)); |
132 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
135 | PetscCall(PetscObjectSetName((PetscObject)xr,vname)); |
133 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
135 | PetscCall(VecView(xr,viewer)); |
134 | #if !defined(PETSC_USE_COMPLEX) | ||
135 | 70 | vname[count-1] = 'i'; | |
136 |
4/6✓ Branch 0 taken 3 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
70 | PetscCall(PetscObjectSetName((PetscObject)xi,vname)); |
137 |
4/6✓ Branch 0 taken 3 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
70 | PetscCall(VecView(xi,viewer)); |
138 | #else | ||
139 | 13 | (void)xi; | |
140 | #endif | ||
141 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
27 | PetscFunctionReturn(PETSC_SUCCESS); |
142 | } | ||
143 | |||
144 | /* Macros for strings with different value in real and complex */ | ||
145 | #if defined(PETSC_USE_COMPLEX) | ||
146 | #define SLEPC_STRING_HERMITIAN "hermitian" | ||
147 | #else | ||
148 | #define SLEPC_STRING_HERMITIAN "symmetric" | ||
149 | #endif | ||
150 | |||
151 | /* Private functions that are shared by several classes */ | ||
152 | SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcBasisReference_Private(PetscInt,Vec*,PetscInt*,Vec**); | ||
153 | SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcBasisDestroy_Private(PetscInt*,Vec**); | ||
154 | SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcMonitorMakeKey_Internal(const char[],PetscViewerType,PetscViewerFormat,char[]); | ||
155 | SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode PetscViewerAndFormatCreate_Internal(PetscViewer,PetscViewerFormat,void*,PetscViewerAndFormat**); | ||
156 | |||
157 | SLEPC_INTERN PetscErrorCode SlepcCitationsInitialize(void); | ||
158 | SLEPC_INTERN PetscErrorCode SlepcInitialize_DynamicLibraries(void); | ||
159 | SLEPC_INTERN PetscErrorCode SlepcInitialize_Packages(void); | ||
160 | |||
161 | /* Macro to check a sequential Mat (including GPU) */ | ||
162 | #if !defined(PETSC_USE_DEBUG) | ||
163 | #define SlepcMatCheckSeq(h) do {(void)(h);} while (0) | ||
164 | #else | ||
165 | #if defined(PETSC_HAVE_CUDA) | ||
166 | #define SlepcMatCheckSeq(h) do { PetscCheckTypeNames((h),MATSEQDENSE,MATSEQDENSECUDA); } while (0) | ||
167 | #elif defined(PETSC_HAVE_HIP) | ||
168 | #define SlepcMatCheckSeq(h) do { PetscCheckTypeNames((h),MATSEQDENSE,MATSEQDENSEHIP); } while (0) | ||
169 | #else | ||
170 | #define SlepcMatCheckSeq(h) do { PetscCheckTypeName((h),MATSEQDENSE); } while (0) | ||
171 | #endif | ||
172 | #endif | ||
173 | |||
174 | /* Definitions needed to work with GPU kernels */ | ||
175 | #if defined(PETSC_HAVE_CUPM) | ||
176 | #include <petscdevice_cupm.h> | ||
177 | |||
178 | #define X_AXIS 0 | ||
179 | #define Y_AXIS 1 | ||
180 | |||
181 | #define SLEPC_TILE_SIZE_X 32 | ||
182 | #define SLEPC_BLOCK_SIZE_X 128 | ||
183 | #define SLEPC_TILE_SIZE_Y 32 | ||
184 | #define SLEPC_BLOCK_SIZE_Y 128 | ||
185 | |||
186 | 3392 | static inline PetscErrorCode SlepcKernelSetGrid1D(PetscInt rows,dim3 *dimGrid,dim3 *dimBlock,PetscInt *dimGrid_xcount) | |
187 | { | ||
188 | 3392 | int card; | |
189 | #if defined(PETSC_HAVE_CUDA) | ||
190 | 3392 | struct cudaDeviceProp devprop; | |
191 | #elif defined(PETSC_HAVE_HIP) | ||
192 | ✗ | hipDeviceProp_t devprop; | |
193 | #endif | ||
194 | |||
195 | 3392 | PetscFunctionBegin; | |
196 | #if defined(PETSC_HAVE_CUDA) | ||
197 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3392 | PetscCallCUDA(cudaGetDevice(&card)); |
198 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3392 | PetscCallCUDA(cudaGetDeviceProperties(&devprop,card)); |
199 | #elif defined(PETSC_HAVE_HIP) | ||
200 | ✗ | PetscCallHIP(hipGetDevice(&card)); | |
201 | ✗ | PetscCallHIP(hipGetDeviceProperties(&devprop,card)); | |
202 | #endif | ||
203 | 3392 | *dimGrid_xcount = 1; | |
204 | |||
205 | /* X axis */ | ||
206 | 3392 | dimGrid->x = 1; | |
207 | 3392 | dimBlock->x = SLEPC_BLOCK_SIZE_X; | |
208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3392 | if (rows>SLEPC_BLOCK_SIZE_X) dimGrid->x = (rows+SLEPC_BLOCK_SIZE_X-1)/SLEPC_BLOCK_SIZE_X; |
209 | 3392 | else dimBlock->x = rows; | |
210 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3392 | if (dimGrid->x>(unsigned)devprop.maxGridSize[X_AXIS]) { |
211 | ✗ | *dimGrid_xcount = (dimGrid->x+(devprop.maxGridSize[X_AXIS]-1))/devprop.maxGridSize[X_AXIS]; | |
212 | ✗ | dimGrid->x = devprop.maxGridSize[X_AXIS]; | |
213 | ✗ | } | |
214 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
215 | ✗ | } | |
216 | |||
217 | 72 | static inline PetscErrorCode SlepcKernelSetGrid2DTiles(PetscInt rows,PetscInt cols,dim3 *dimGrid,dim3 *dimBlock,PetscInt *dimGrid_xcount,PetscInt *dimGrid_ycount) | |
218 | { | ||
219 | 72 | int card; | |
220 | #if defined(PETSC_HAVE_CUDA) | ||
221 | 72 | struct cudaDeviceProp devprop; | |
222 | #elif defined(PETSC_HAVE_HIP) | ||
223 | hipDeviceProp_t devprop; | ||
224 | #endif | ||
225 | |||
226 | 72 | PetscFunctionBegin; | |
227 | #if defined(PETSC_HAVE_CUDA) | ||
228 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
72 | PetscCallCUDA(cudaGetDevice(&card)); |
229 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
72 | PetscCallCUDA(cudaGetDeviceProperties(&devprop,card)); |
230 | #elif defined(PETSC_HAVE_HIP) | ||
231 | PetscCallHIP(hipGetDevice(&card)); | ||
232 | PetscCallHIP(hipGetDeviceProperties(&devprop,card)); | ||
233 | #endif | ||
234 | 72 | *dimGrid_xcount = *dimGrid_ycount = 1; | |
235 | |||
236 | /* X axis */ | ||
237 | 72 | dimGrid->x = 1; | |
238 | 72 | dimBlock->x = SLEPC_BLOCK_SIZE_X; | |
239 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
72 | if (rows>SLEPC_BLOCK_SIZE_X*SLEPC_TILE_SIZE_X) dimGrid->x = (rows+SLEPC_BLOCK_SIZE_X*SLEPC_TILE_SIZE_X-1)/(SLEPC_BLOCK_SIZE_X*SLEPC_TILE_SIZE_X); |
240 | 72 | else dimBlock->x = (rows+SLEPC_TILE_SIZE_X-1)/SLEPC_TILE_SIZE_X; | |
241 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
72 | if (dimGrid->x>(unsigned)devprop.maxGridSize[X_AXIS]) { |
242 | ✗ | *dimGrid_xcount = (dimGrid->x+(devprop.maxGridSize[X_AXIS]-1))/devprop.maxGridSize[X_AXIS]; | |
243 | ✗ | dimGrid->x = devprop.maxGridSize[X_AXIS]; | |
244 | } | ||
245 | |||
246 | /* Y axis */ | ||
247 | 72 | dimGrid->y = 1; | |
248 | 72 | dimBlock->y = SLEPC_BLOCK_SIZE_Y; | |
249 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
72 | if (cols>SLEPC_BLOCK_SIZE_Y*SLEPC_TILE_SIZE_Y) dimGrid->y = (cols+SLEPC_BLOCK_SIZE_Y*SLEPC_TILE_SIZE_Y-1)/(SLEPC_BLOCK_SIZE_Y*SLEPC_TILE_SIZE_Y); |
250 | 72 | else dimBlock->y = (cols+SLEPC_TILE_SIZE_Y-1)/SLEPC_TILE_SIZE_Y; | |
251 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
72 | if (dimGrid->y>(unsigned)devprop.maxGridSize[Y_AXIS]) { |
252 | ✗ | *dimGrid_ycount = (dimGrid->y+(devprop.maxGridSize[Y_AXIS]-1))/devprop.maxGridSize[Y_AXIS]; | |
253 | ✗ | dimGrid->y = devprop.maxGridSize[Y_AXIS]; | |
254 | } | ||
255 | PetscFunctionReturn(PETSC_SUCCESS); | ||
256 | } | ||
257 | #undef X_AXIS | ||
258 | #undef Y_AXIS | ||
259 | #endif | ||
260 |