Actual source code: zepsf.c
slepc-3.21.1 2024-04-26
1: /*
2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: SLEPc - Scalable Library for Eigenvalue Problem Computations
4: Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
6: This file is part of SLEPc.
7: SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9: */
11: #include <petsc/private/fortranimpl.h>
12: #include <slepceps.h>
14: #if defined(PETSC_HAVE_FORTRAN_CAPS)
15: #define epsdestroy_ EPSDESTROY
16: #define epsview_ EPSVIEW
17: #define epsviewfromoptions_ EPSVIEWFROMOPTIONS
18: #define epserrorview_ EPSERRORVIEW
19: #define epsconvergedreasonview_ EPSCONVERGEDREASONVIEW
20: #define epsvaluesview_ EPSVALUESVIEW
21: #define epsvectorsview_ EPSVECTORSVIEW
22: #define epssetoptionsprefix_ EPSSETOPTIONSPREFIX
23: #define epsappendoptionsprefix_ EPSAPPENDOPTIONSPREFIX
24: #define epsgetoptionsprefix_ EPSGETOPTIONSPREFIX
25: #define epssettype_ EPSSETTYPE
26: #define epsgettype_ EPSGETTYPE
27: #define epsmonitorset_ EPSMONITORSET
28: #define epsmonitorall_ EPSMONITORALL
29: #define epsmonitorfirst_ EPSMONITORFIRST
30: #define epsmonitorconverged_ EPSMONITORCONVERGED
31: #define epsmonitorconvergedcreate_ EPSMONITORCONVERGEDCREATE
32: #define epsmonitorconvergeddestroy_ EPSMONITORCONVERGEDDESTROY
33: #define epsconvergedabsolute_ EPSCONVERGEDABSOLUTE
34: #define epsconvergedrelative_ EPSCONVERGEDRELATIVE
35: #define epsconvergednorm_ EPSCONVERGEDNORM
36: #define epssetconvergencetestfunction_ EPSSETCONVERGENCETESTFUNCTION
37: #define epssetstoppingtestfunction_ EPSSETSTOPPINGTESTFUNCTION
38: #define epsseteigenvaluecomparison_ EPSSETEIGENVALUECOMPARISON
39: #define epssetarbitraryselection_ EPSSETARBITRARYSELECTION
40: #define epsgetdimensions000_ EPSGETDIMENSIONS000
41: #define epsgetdimensions100_ EPSGETDIMENSIONS100
42: #define epsgetdimensions010_ EPSGETDIMENSIONS010
43: #define epsgetdimensions001_ EPSGETDIMENSIONS001
44: #define epsgetdimensions110_ EPSGETDIMENSIONS110
45: #define epsgetdimensions011_ EPSGETDIMENSIONS011
46: #define epsgetdimensions101_ EPSGETDIMENSIONS101
47: #define epsgeteigenpair00_ EPSGETEIGENPAIR00
48: #define epsgeteigenpair10_ EPSGETEIGENPAIR10
49: #define epsgeteigenpair01_ EPSGETEIGENPAIR01
50: #define epsgeteigenpair11_ EPSGETEIGENPAIR11
51: #define epsgeteigenvalue00_ EPSGETEIGENVALUE00
52: #define epsgeteigenvalue10_ EPSGETEIGENVALUE10
53: #define epsgeteigenvalue01_ EPSGETEIGENVALUE01
54: #define epsgettolerances00_ EPSGETTOLERANCES00
55: #define epsgettolerances10_ EPSGETTOLERANCES10
56: #define epsgettolerances01_ EPSGETTOLERANCES01
57: #define epsgetbalance000_ EPSGETBALANCE000
58: #define epsgetbalance100_ EPSGETBALANCE100
59: #define epsgetbalance010_ EPSGETBALANCE010
60: #define epsgetbalance001_ EPSGETBALANCE001
61: #define epsgetbalance110_ EPSGETBALANCE110
62: #define epsgetbalance011_ EPSGETBALANCE011
63: #define epsgetbalance101_ EPSGETBALANCE101
64: #define epssetdeflationspace0_ EPSSETDEFLATIONSPACE0
65: #define epssetdeflationspace1_ EPSSETDEFLATIONSPACE1
66: #define epssetinitialspace0_ EPSSETINITIALSPACE0
67: #define epssetinitialspace1_ EPSSETINITIALSPACE1
68: #define epssetleftinitialspace0_ EPSSETLEFTINITIALSPACE0
69: #define epssetleftinitialspace1_ EPSSETLEFTINITIALSPACE1
70: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
71: #define epsdestroy_ epsdestroy
72: #define epsview_ epsview
73: #define epsviewfromoptions_ epsviewfromoptions
74: #define epserrorview_ epserrorview
75: #define epsconvergedreasonview_ epsconvergedreasonview
76: #define epsvaluesview_ epsvaluesview
77: #define epsvectorsview_ epsvectorsview
78: #define epssetoptionsprefix_ epssetoptionsprefix
79: #define epsappendoptionsprefix_ epsappendoptionsprefix
80: #define epsgetoptionsprefix_ epsgetoptionsprefix
81: #define epssettype_ epssettype
82: #define epsgettype_ epsgettype
83: #define epsmonitorset_ epsmonitorset
84: #define epsmonitorall_ epsmonitorall
85: #define epsmonitorfirst_ epsmonitorfirst
86: #define epsmonitorconverged_ epsmonitorconverged
87: #define epsmonitorconvergedcreate_ epsmonitorconvergedcreate
88: #define epsmonitorconvergeddestroy_ epsmonitorconvergeddestroy
89: #define epsconvergedabsolute_ epsconvergedabsolute
90: #define epsconvergedrelative_ epsconvergedrelative
91: #define epsconvergednorm_ epsconvergednorm
92: #define epssetconvergencetestfunction_ epssetconvergencetestfunction
93: #define epssetstoppingtestfunction_ epssetstoppingtestfunction
94: #define epsseteigenvaluecomparison_ epsseteigenvaluecomparison
95: #define epssetarbitraryselection_ epssetarbitraryselection
96: #define epsgetdimensions000_ epsgetdimensions000
97: #define epsgetdimensions100_ epsgetdimensions100
98: #define epsgetdimensions010_ epsgetdimensions010
99: #define epsgetdimensions001_ epsgetdimensions001
100: #define epsgetdimensions110_ epsgetdimensions110
101: #define epsgetdimensions011_ epsgetdimensions011
102: #define epsgetdimensions101_ epsgetdimensions101
103: #define epsgeteigenpair00_ epsgeteigenpair00
104: #define epsgeteigenpair10_ epsgeteigenpair10
105: #define epsgeteigenpair01_ epsgeteigenpair01
106: #define epsgeteigenpair11_ epsgeteigenpair11
107: #define epsgeteigenvalue00_ epsgeteigenvalue00
108: #define epsgeteigenvalue10_ epsgeteigenvalue10
109: #define epsgeteigenvalue01_ epsgeteigenvalue01
110: #define epsgettolerances00_ epsgettolerances00
111: #define epsgettolerances10_ epsgettolerances10
112: #define epsgettolerances01_ epsgettolerances01
113: #define epsgetbalance000_ epsgetbalance000
114: #define epsgetbalance100_ epsgetbalance100
115: #define epsgetbalance010_ epsgetbalance010
116: #define epsgetbalance001_ epsgetbalance001
117: #define epsgetbalance110_ epsgetbalance110
118: #define epsgetbalance011_ epsgetbalance011
119: #define epsgetbalance101_ epsgetbalance101
120: #define epssetdeflationspace0_ epssetdeflationspace0
121: #define epssetdeflationspace1_ epssetdeflationspace1
122: #define epssetinitialspace0_ epssetinitialspace0
123: #define epssetinitialspace1_ epssetinitialspace1
124: #define epssetleftinitialspace0_ epssetleftinitialspace0
125: #define epssetleftinitialspace1_ epssetleftinitialspace1
126: #endif
128: /*
129: These are not usually called from Fortran but allow Fortran users
130: to transparently set these monitors from .F code
131: */
132: SLEPC_EXTERN void epsmonitorall_(EPS *eps,PetscInt *it,PetscInt *nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt *nest,PetscViewerAndFormat **vf,PetscErrorCode *ierr)
133: {
134: *ierr = EPSMonitorAll(*eps,*it,*nconv,eigr,eigi,errest,*nest,*vf);
135: }
137: SLEPC_EXTERN void epsmonitorfirst_(EPS *eps,PetscInt *it,PetscInt *nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt *nest,PetscViewerAndFormat **vf,PetscErrorCode *ierr)
138: {
139: *ierr = EPSMonitorFirst(*eps,*it,*nconv,eigr,eigi,errest,*nest,*vf);
140: }
142: SLEPC_EXTERN void epsmonitorconverged_(EPS *eps,PetscInt *it,PetscInt *nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt *nest,PetscViewerAndFormat **vf,PetscErrorCode *ierr)
143: {
144: *ierr = EPSMonitorConverged(*eps,*it,*nconv,eigr,eigi,errest,*nest,*vf);
145: }
147: SLEPC_EXTERN void epsmonitorconvergedcreate_(PetscViewer *vin,PetscViewerFormat *format,void *ctx,PetscViewerAndFormat **vf,PetscErrorCode *ierr)
148: {
149: PetscViewer v;
150: PetscPatchDefaultViewers_Fortran(vin,v);
151: CHKFORTRANNULLOBJECT(ctx);
152: *ierr = EPSMonitorConvergedCreate(v,*format,ctx,vf);
153: }
155: SLEPC_EXTERN void epsmonitorconvergeddestroy_(PetscViewerAndFormat **vf,PetscErrorCode *ierr)
156: {
157: *ierr = EPSMonitorConvergedDestroy(vf);
158: }
160: static struct {
161: PetscFortranCallbackId monitor;
162: PetscFortranCallbackId monitordestroy;
163: PetscFortranCallbackId convergence;
164: PetscFortranCallbackId convdestroy;
165: PetscFortranCallbackId stopping;
166: PetscFortranCallbackId stopdestroy;
167: PetscFortranCallbackId comparison;
168: PetscFortranCallbackId arbitrary;
169: } _cb;
171: /* These are not extern C because they are passed into non-extern C user level functions */
172: static PetscErrorCode ourmonitor(EPS eps,PetscInt i,PetscInt nc,PetscScalar *er,PetscScalar *ei,PetscReal *d,PetscInt l,void* ctx)
173: {
174: PetscObjectUseFortranCallback(eps,_cb.monitor,(EPS*,PetscInt*,PetscInt*,PetscScalar*,PetscScalar*,PetscReal*,PetscInt*,void*,PetscErrorCode*),(&eps,&i,&nc,er,ei,d,&l,_ctx,&ierr));
175: }
177: static PetscErrorCode ourdestroy(void** ctx)
178: {
179: EPS eps = (EPS)*ctx;
180: PetscObjectUseFortranCallback(eps,_cb.monitordestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
181: }
183: static PetscErrorCode ourconvergence(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
184: {
185: PetscObjectUseFortranCallback(eps,_cb.convergence,(EPS*,PetscScalar*,PetscScalar*,PetscReal*,PetscReal*,void*,PetscErrorCode*),(&eps,&eigr,&eigi,&res,errest,_ctx,&ierr));
186: }
188: static PetscErrorCode ourconvdestroy(void *ctx)
189: {
190: EPS eps = (EPS)ctx;
191: PetscObjectUseFortranCallback(eps,_cb.convdestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
192: }
194: static PetscErrorCode ourstopping(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
195: {
196: PetscObjectUseFortranCallback(eps,_cb.stopping,(EPS*,PetscInt*,PetscInt*,PetscInt*,PetscInt*,EPSConvergedReason*,void*,PetscErrorCode*),(&eps,&its,&max_it,&nconv,&nev,reason,_ctx,&ierr));
197: }
199: static PetscErrorCode ourstopdestroy(void *ctx)
200: {
201: EPS eps = (EPS)ctx;
202: PetscObjectUseFortranCallback(eps,_cb.stopdestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
203: }
205: static PetscErrorCode oureigenvaluecomparison(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *r,void *ctx)
206: {
207: EPS eps = (EPS)ctx;
208: PetscObjectUseFortranCallback(eps,_cb.comparison,(PetscScalar*,PetscScalar*,PetscScalar*,PetscScalar*,PetscInt*,void*,PetscErrorCode*),(&ar,&ai,&br,&bi,r,_ctx,&ierr));
209: }
211: static PetscErrorCode ourarbitraryfunc(PetscScalar er,PetscScalar ei,Vec xr,Vec xi,PetscScalar *rr,PetscScalar *ri,void *ctx)
212: {
213: EPS eps = (EPS)ctx;
214: PetscObjectUseFortranCallback(eps,_cb.arbitrary,(PetscScalar*,PetscScalar*,Vec*,Vec*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),(&er,&ei,&xr,&xi,rr,ri,_ctx,&ierr));
215: }
217: SLEPC_EXTERN void epsdestroy_(EPS *eps,PetscErrorCode *ierr)
218: {
219: PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(eps);
220: *ierr = EPSDestroy(eps); if (*ierr) return;
221: PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(eps);
222: }
224: SLEPC_EXTERN void epsview_(EPS *eps,PetscViewer *viewer,PetscErrorCode *ierr)
225: {
226: PetscViewer v;
227: PetscPatchDefaultViewers_Fortran(viewer,v);
228: *ierr = EPSView(*eps,v);
229: }
231: SLEPC_EXTERN void epsviewfromoptions_(EPS *eps,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
232: {
233: char *t;
235: FIXCHAR(type,len,t);
236: CHKFORTRANNULLOBJECT(obj);
237: *ierr = EPSViewFromOptions(*eps,obj,t);if (*ierr) return;
238: FREECHAR(type,t);
239: }
241: SLEPC_EXTERN void epsconvergedreasonview_(EPS *eps,PetscViewer *viewer,PetscErrorCode *ierr)
242: {
243: PetscViewer v;
244: PetscPatchDefaultViewers_Fortran(viewer,v);
245: *ierr = EPSConvergedReasonView(*eps,v);
246: }
248: SLEPC_EXTERN void epserrorview_(EPS *eps,EPSErrorType *etype,PetscViewer *viewer,PetscErrorCode *ierr)
249: {
250: PetscViewer v;
251: PetscPatchDefaultViewers_Fortran(viewer,v);
252: *ierr = EPSErrorView(*eps,*etype,v);
253: }
255: SLEPC_EXTERN void epsvaluesview_(EPS *eps,PetscViewer *viewer,PetscErrorCode *ierr)
256: {
257: PetscViewer v;
258: PetscPatchDefaultViewers_Fortran(viewer,v);
259: *ierr = EPSValuesView(*eps,v);
260: }
262: SLEPC_EXTERN void epsvectorsview_(EPS *eps,PetscViewer *viewer,PetscErrorCode *ierr)
263: {
264: PetscViewer v;
265: PetscPatchDefaultViewers_Fortran(viewer,v);
266: *ierr = EPSVectorsView(*eps,v);
267: }
269: SLEPC_EXTERN void epssettype_(EPS *eps,char *type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
270: {
271: char *t;
273: FIXCHAR(type,len,t);
274: *ierr = EPSSetType(*eps,t);if (*ierr) return;
275: FREECHAR(type,t);
276: }
278: SLEPC_EXTERN void epsgettype_(EPS *eps,char *name,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
279: {
280: EPSType tname;
282: *ierr = EPSGetType(*eps,&tname);if (*ierr) return;
283: *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
284: FIXRETURNCHAR(PETSC_TRUE,name,len);
285: }
287: SLEPC_EXTERN void epssetoptionsprefix_(EPS *eps,char *prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
288: {
289: char *t;
291: FIXCHAR(prefix,len,t);
292: *ierr = EPSSetOptionsPrefix(*eps,t);if (*ierr) return;
293: FREECHAR(prefix,t);
294: }
296: SLEPC_EXTERN void epsappendoptionsprefix_(EPS *eps,char *prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
297: {
298: char *t;
300: FIXCHAR(prefix,len,t);
301: *ierr = EPSAppendOptionsPrefix(*eps,t);if (*ierr) return;
302: FREECHAR(prefix,t);
303: }
305: SLEPC_EXTERN void epsgetoptionsprefix_(EPS *eps,char *prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
306: {
307: const char *tname;
309: *ierr = EPSGetOptionsPrefix(*eps,&tname); if (*ierr) return;
310: *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
311: FIXRETURNCHAR(PETSC_TRUE,prefix,len);
312: }
314: SLEPC_EXTERN void epsmonitorset_(EPS *eps,void (*monitor)(EPS*,PetscInt*,PetscInt*,PetscScalar*,PetscScalar*,PetscReal*,PetscInt*,void*,PetscErrorCode*),void *mctx,void (*monitordestroy)(void *,PetscErrorCode*),PetscErrorCode *ierr)
315: {
316: CHKFORTRANNULLOBJECT(mctx);
317: CHKFORTRANNULLFUNCTION(monitordestroy);
318: if ((PetscVoidFunction)monitor == (PetscVoidFunction)epsmonitorall_) {
319: *ierr = EPSMonitorSet(*eps,(PetscErrorCode (*)(EPS,PetscInt,PetscInt,PetscScalar*,PetscScalar*,PetscReal*,PetscInt,void*))EPSMonitorAll,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);
320: } else if ((PetscVoidFunction)monitor == (PetscVoidFunction)epsmonitorconverged_) {
321: *ierr = EPSMonitorSet(*eps,(PetscErrorCode (*)(EPS,PetscInt,PetscInt,PetscScalar*,PetscScalar*,PetscReal*,PetscInt,void*))EPSMonitorConverged,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void**))EPSMonitorConvergedDestroy);
322: } else if ((PetscVoidFunction)monitor == (PetscVoidFunction)epsmonitorfirst_) {
323: *ierr = EPSMonitorSet(*eps,(PetscErrorCode (*)(EPS,PetscInt,PetscInt,PetscScalar*,PetscScalar*,PetscReal*,PetscInt,void*))EPSMonitorFirst,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);
324: } else {
325: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)monitor,mctx); if (*ierr) return;
326: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitordestroy,(PetscVoidFunction)monitordestroy,mctx); if (*ierr) return;
327: *ierr = EPSMonitorSet(*eps,ourmonitor,*eps,ourdestroy);
328: }
329: }
331: SLEPC_EXTERN void epsconvergedabsolute_(EPS *eps,PetscScalar *eigr,PetscScalar *eigi,PetscReal *res,PetscReal *errest,void *ctx,PetscErrorCode *ierr)
332: {
333: *ierr = EPSConvergedAbsolute(*eps,*eigr,*eigi,*res,errest,ctx);
334: }
336: SLEPC_EXTERN void epsconvergedrelative_(EPS *eps,PetscScalar *eigr,PetscScalar *eigi,PetscReal *res,PetscReal *errest,void *ctx,PetscErrorCode *ierr)
337: {
338: *ierr = EPSConvergedRelative(*eps,*eigr,*eigi,*res,errest,ctx);
339: }
341: SLEPC_EXTERN void epsconvergednorm_(EPS *eps,PetscScalar *eigr,PetscScalar *eigi,PetscReal *res,PetscReal *errest,void *ctx,PetscErrorCode *ierr)
342: {
343: *ierr = EPSConvergedNorm(*eps,*eigr,*eigi,*res,errest,ctx);
344: }
346: SLEPC_EXTERN void epssetconvergencetestfunction_(EPS *eps,void (*func)(EPS*,PetscScalar*,PetscScalar*,PetscReal*,PetscReal*,void*,PetscErrorCode*),void* ctx,void (*destroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
347: {
348: CHKFORTRANNULLOBJECT(ctx);
349: CHKFORTRANNULLFUNCTION(destroy);
350: if ((PetscVoidFunction)func == (PetscVoidFunction)epsconvergedabsolute_) {
351: *ierr = EPSSetConvergenceTest(*eps,EPS_CONV_ABS);
352: } else if ((PetscVoidFunction)func == (PetscVoidFunction)epsconvergedrelative_) {
353: *ierr = EPSSetConvergenceTest(*eps,EPS_CONV_REL);
354: } else if ((PetscVoidFunction)func == (PetscVoidFunction)epsconvergednorm_) {
355: *ierr = EPSSetConvergenceTest(*eps,EPS_CONV_NORM);
356: } else {
357: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convergence,(PetscVoidFunction)func,ctx); if (*ierr) return;
358: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convdestroy,(PetscVoidFunction)destroy,ctx); if (*ierr) return;
359: *ierr = EPSSetConvergenceTestFunction(*eps,ourconvergence,*eps,ourconvdestroy);
360: }
361: }
363: SLEPC_EXTERN void epsstoppingbasic_(EPS *eps,PetscInt *its,PetscInt *max_it,PetscInt *nconv,PetscInt *nev,EPSConvergedReason *reason,void *ctx,PetscErrorCode *ierr)
364: {
365: *ierr = EPSStoppingBasic(*eps,*its,*max_it,*nconv,*nev,reason,ctx);
366: }
368: SLEPC_EXTERN void epssetstoppingtestfunction_(EPS *eps,void (*func)(EPS*,PetscInt,PetscInt,PetscInt,PetscInt,EPSConvergedReason*,void*,PetscErrorCode*),void* ctx,void (*destroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
369: {
370: CHKFORTRANNULLOBJECT(ctx);
371: CHKFORTRANNULLFUNCTION(destroy);
372: if ((PetscVoidFunction)func == (PetscVoidFunction)epsstoppingbasic_) {
373: *ierr = EPSSetStoppingTest(*eps,EPS_STOP_BASIC);
374: } else {
375: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.stopping,(PetscVoidFunction)func,ctx); if (*ierr) return;
376: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.stopdestroy,(PetscVoidFunction)destroy,ctx); if (*ierr) return;
377: *ierr = EPSSetStoppingTestFunction(*eps,ourstopping,*eps,ourstopdestroy);
378: }
379: }
381: SLEPC_EXTERN void epsseteigenvaluecomparison_(EPS *eps,void (*func)(PetscScalar*,PetscScalar*,PetscScalar*,PetscScalar*,PetscInt*,void*),void* ctx,PetscErrorCode *ierr)
382: {
383: CHKFORTRANNULLOBJECT(ctx);
384: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.comparison,(PetscVoidFunction)func,ctx); if (*ierr) return;
385: *ierr = EPSSetEigenvalueComparison(*eps,oureigenvaluecomparison,*eps);
386: }
388: SLEPC_EXTERN void epssetarbitraryselection_(EPS *eps,void (*func)(PetscScalar*,PetscScalar*,Vec*,Vec*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
389: {
390: CHKFORTRANNULLOBJECT(ctx);
391: *ierr = PetscObjectSetFortranCallback((PetscObject)*eps,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.arbitrary,(PetscVoidFunction)func,ctx); if (*ierr) return;
392: *ierr = EPSSetArbitrarySelection(*eps,ourarbitraryfunc,*eps);
393: }
395: SLEPC_EXTERN void epsgetdimensions_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
396: {
397: CHKFORTRANNULLINTEGER(nev);
398: CHKFORTRANNULLINTEGER(ncv);
399: CHKFORTRANNULLINTEGER(mpd);
400: *ierr = EPSGetDimensions(*eps,nev,ncv,mpd);
401: }
403: SLEPC_EXTERN void epsgetdimensions000_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
404: {
405: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
406: }
408: SLEPC_EXTERN void epsgetdimensions100_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
409: {
410: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
411: }
413: SLEPC_EXTERN void epsgetdimensions010_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
414: {
415: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
416: }
418: SLEPC_EXTERN void epsgetdimensions001_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
419: {
420: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
421: }
423: SLEPC_EXTERN void epsgetdimensions110_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
424: {
425: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
426: }
428: SLEPC_EXTERN void epsgetdimensions011_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
429: {
430: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
431: }
433: SLEPC_EXTERN void epsgetdimensions101_(EPS *eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd,PetscErrorCode *ierr)
434: {
435: epsgetdimensions_(eps,nev,ncv,mpd,ierr);
436: }
438: SLEPC_EXTERN void epsgeteigenpair_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,Vec *Vr,Vec *Vi,PetscErrorCode *ierr)
439: {
440: CHKFORTRANNULLSCALAR(eigr);
441: CHKFORTRANNULLSCALAR(eigi);
442: *ierr = EPSGetEigenpair(*eps,*i,eigr,eigi,*Vr,*Vi);
443: }
445: SLEPC_EXTERN void epsgeteigenpair00_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,Vec *Vr,Vec *Vi,PetscErrorCode *ierr)
446: {
447: epsgeteigenpair_(eps,i,eigr,eigi,Vr,Vi,ierr);
448: }
450: SLEPC_EXTERN void epsgeteigenpair10_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,Vec *Vr,Vec *Vi,PetscErrorCode *ierr)
451: {
452: epsgeteigenpair_(eps,i,eigr,eigi,Vr,Vi,ierr);
453: }
455: SLEPC_EXTERN void epsgeteigenpair01_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,Vec *Vr,Vec *Vi,PetscErrorCode *ierr)
456: {
457: epsgeteigenpair_(eps,i,eigr,eigi,Vr,Vi,ierr);
458: }
460: SLEPC_EXTERN void epsgeteigenpair11_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,Vec *Vr,Vec *Vi,PetscErrorCode *ierr)
461: {
462: epsgeteigenpair_(eps,i,eigr,eigi,Vr,Vi,ierr);
463: }
465: SLEPC_EXTERN void epsgeteigenvalue_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,PetscErrorCode *ierr)
466: {
467: CHKFORTRANNULLSCALAR(eigr);
468: CHKFORTRANNULLSCALAR(eigi);
469: *ierr = EPSGetEigenvalue(*eps,*i,eigr,eigi);
470: }
472: SLEPC_EXTERN void epsgeteigenvalue00_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,PetscErrorCode *ierr)
473: {
474: epsgeteigenvalue_(eps,i,eigr,eigi,ierr);
475: }
477: SLEPC_EXTERN void epsgeteigenvalue10_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,PetscErrorCode *ierr)
478: {
479: epsgeteigenvalue_(eps,i,eigr,eigi,ierr);
480: }
482: SLEPC_EXTERN void epsgeteigenvalue01_(EPS *eps,PetscInt *i,PetscScalar *eigr,PetscScalar *eigi,PetscErrorCode *ierr)
483: {
484: epsgeteigenvalue_(eps,i,eigr,eigi,ierr);
485: }
487: SLEPC_EXTERN void epsgettolerances_(EPS *eps,PetscReal *tol,PetscInt *maxits,PetscErrorCode *ierr)
488: {
489: CHKFORTRANNULLREAL(tol);
490: CHKFORTRANNULLINTEGER(maxits);
491: *ierr = EPSGetTolerances(*eps,tol,maxits);
492: }
494: SLEPC_EXTERN void epsgettolerances00_(EPS *eps,PetscReal *tol,PetscInt *maxits,PetscErrorCode *ierr)
495: {
496: epsgettolerances_(eps,tol,maxits,ierr);
497: }
499: SLEPC_EXTERN void epsgettolerances10_(EPS *eps,PetscReal *tol,PetscInt *maxits,PetscErrorCode *ierr)
500: {
501: epsgettolerances_(eps,tol,maxits,ierr);
502: }
504: SLEPC_EXTERN void epsgettolerances01_(EPS *eps,PetscReal *tol,PetscInt *maxits,PetscErrorCode *ierr)
505: {
506: epsgettolerances_(eps,tol,maxits,ierr);
507: }
509: SLEPC_EXTERN void epsgetbalance_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
510: {
511: CHKFORTRANNULLINTEGER(bal);
512: CHKFORTRANNULLINTEGER(its);
513: CHKFORTRANNULLREAL(cutoff);
514: *ierr = EPSGetBalance(*eps,bal,its,cutoff);
515: }
517: SLEPC_EXTERN void epsgetbalance000_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
518: {
519: epsgetbalance_(eps,bal,its,cutoff,ierr);
520: }
522: SLEPC_EXTERN void epsgetbalance100_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
523: {
524: epsgetbalance_(eps,bal,its,cutoff,ierr);
525: }
527: SLEPC_EXTERN void epsgetbalance010_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
528: {
529: epsgetbalance_(eps,bal,its,cutoff,ierr);
530: }
532: SLEPC_EXTERN void epsgetbalance001_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
533: {
534: epsgetbalance_(eps,bal,its,cutoff,ierr);
535: }
537: SLEPC_EXTERN void epsgetbalance110_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
538: {
539: epsgetbalance_(eps,bal,its,cutoff,ierr);
540: }
542: SLEPC_EXTERN void epsgetbalance011_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
543: {
544: epsgetbalance_(eps,bal,its,cutoff,ierr);
545: }
547: SLEPC_EXTERN void epsgetbalance101_(EPS *eps,EPSBalance *bal,PetscInt *its,PetscReal *cutoff,PetscErrorCode *ierr)
548: {
549: epsgetbalance_(eps,bal,its,cutoff,ierr);
550: }
552: SLEPC_EXTERN void epssetdeflationspace0_(EPS *eps,PetscInt *n,Vec *ds,PetscErrorCode *ierr)
553: {
554: CHKFORTRANNULLOBJECT(ds);
555: *ierr = EPSSetDeflationSpace(*eps,*n,ds);
556: }
558: SLEPC_EXTERN void epssetdeflationspace1_(EPS *eps,PetscInt *n,Vec *ds,PetscErrorCode *ierr)
559: {
560: CHKFORTRANNULLOBJECT(ds);
561: *ierr = EPSSetDeflationSpace(*eps,*n,ds);
562: }
564: SLEPC_EXTERN void epssetinitialspace0_(EPS *eps,PetscInt *n,Vec *is,PetscErrorCode *ierr)
565: {
566: CHKFORTRANNULLOBJECT(is);
567: *ierr = EPSSetInitialSpace(*eps,*n,is);
568: }
570: SLEPC_EXTERN void epssetinitialspace1_(EPS *eps,PetscInt *n,Vec *is,PetscErrorCode *ierr)
571: {
572: CHKFORTRANNULLOBJECT(is);
573: *ierr = EPSSetInitialSpace(*eps,*n,is);
574: }
576: SLEPC_EXTERN void epssetleftinitialspace0_(EPS *eps,PetscInt *n,Vec *isl,PetscErrorCode *ierr)
577: {
578: CHKFORTRANNULLOBJECT(isl);
579: *ierr = EPSSetLeftInitialSpace(*eps,*n,isl);
580: }
582: SLEPC_EXTERN void epssetleftinitialspace1_(EPS *eps,PetscInt *n,Vec *isl,PetscErrorCode *ierr)
583: {
584: CHKFORTRANNULLOBJECT(isl);
585: *ierr = EPSSetLeftInitialSpace(*eps,*n,isl);
586: }