Skip to content

Commit ca9096f

Browse files
committed
fortran interface
1 parent b973fd3 commit ca9096f

File tree

4 files changed

+154
-0
lines changed

4 files changed

+154
-0
lines changed

FORTRAN/pevsl_f90.c

+78
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ void PEVSL_FORT(pevsl_setamv)(uintptr_t *pevslf90, void *func, void *data) {
8181
pEVSL_SetAMatvec(pevsl, (MVFunc) func, data);
8282
}
8383

84+
8485
/** @brief Fortran interface for pEVSL_SetBMatvec
8586
* @param[in] pevslf90 pevsl pointer
8687
* @param[in] func function pointer
@@ -103,6 +104,46 @@ void PEVSL_FORT(pevsl_setbsol)(uintptr_t *pevslf90, void *func, void *data) {
103104
pEVSL_SetBSol(pevsl, (SVFunc) func, data);
104105
}
105106

107+
108+
/**JS 01/20/19 for complex Hermitian Av
109+
* @brief Fortran interface for pEVSL_SetAMatvec
110+
* @param[in] pevslf90 pevsl pointer
111+
* @param[in] func function pointer
112+
* @param[in] data associated data
113+
*/
114+
void PEVSL_FORT(pevsl_setzamv)(uintptr_t *pevslf90, void *func, void *data) {
115+
116+
/* cast pointer */
117+
pevsl_Data *pevsl = (pevsl_Data *) (*pevslf90);
118+
119+
pEVSL_SetZAMatvec(pevsl, (ZMVFunc) func, data);
120+
}
121+
122+
/** @brief Fortran interface for pEVSL_SetBMatvec
123+
* @param[in] pevslf90 pevsl pointer
124+
* @param[in] func function pointer
125+
* @param[in] data associated data
126+
*/
127+
void PEVSL_FORT(pevsl_setzbmv)(uintptr_t *pevslf90, void *func, void *data) {
128+
129+
/* cast pointer */
130+
pevsl_Data *pevsl = (pevsl_Data *) (*pevslf90);
131+
132+
pEVSL_SetZBMatvec(pevsl, (ZMVFunc) func, data);
133+
}
134+
135+
/** @brief Fortran interface for SetBsol */
136+
void PEVSL_FORT(pevsl_setzbsol)(uintptr_t *pevslf90, void *func, void *data) {
137+
138+
/* cast pointer */
139+
pevsl_Data *pevsl = (pevsl_Data *) (*pevslf90);
140+
141+
pEVSL_SetZBSol(pevsl, (ZSVFunc) func, data);
142+
}
143+
144+
145+
146+
106147
/** @brief Fortran interface for SetStdEig */
107148
void PEVSL_FORT(pevsl_set_stdeig)(uintptr_t *pevslf90) {
108149

@@ -182,6 +223,8 @@ void PEVSL_FORT(pevsl_bsv)(uintptr_t *pevslf90, double *b, double *x) {
182223
}
183224

184225

226+
227+
185228
/** @brief Fortran interface for evsl_lanbounds
186229
* @param[in] pevslf90 pEVSL pointer
187230
* @param[in] mlan Krylov dimension
@@ -211,6 +254,41 @@ void PEVSL_FORT(pevsl_lanbounds)(uintptr_t *pevslf90, int *mlan, int *nsteps, do
211254
pEVSL_ParvecFree(&vinit);
212255
}
213256

257+
258+
/** JS 01/20/19
259+
* @brief Fortran interface for evsl_lanbounds
260+
* @param[in] pevslf90 pEVSL pointer
261+
* @param[in] mlan Krylov dimension
262+
* @param[in] nsteps number of steps
263+
* @param[in] tol stopping tol
264+
* @param[out] lmin lower bound
265+
* @param[out] lmax upper bound
266+
* */
267+
void PEVSL_FORT(pevsl_zlanbounds)(uintptr_t *pevslf90, int *mlan, int *nsteps, double *tol,
268+
double *lmin, double *lmax) {
269+
int N, n, nfirst;
270+
pevsl_Parvec vrinit, viinit;
271+
272+
/* cast pointer */
273+
pevsl_Data *pevsl = (pevsl_Data *) (*pevslf90);
274+
275+
N = pevsl->N;
276+
n = pevsl->n;
277+
nfirst = pevsl->nfirst;
278+
279+
/*------------------- Create parallel vector: random initial guess */
280+
pEVSL_ParvecCreate(N, n, nfirst, pevsl->comm, &vrinit);
281+
pEVSL_ParvecRand(&vrinit);
282+
pEVSL_ParvecCreate(N, n, nfirst, pevsl->comm, &viinit);
283+
pEVSL_ParvecRand(&viinit);
284+
/*------------------- Lanczos Bounds */
285+
pEVSL_ZLanTrbounds(pevsl, *mlan, *nsteps, 1e-8, &vrinit, &viinit, 1, lmin, lmax, NULL);
286+
287+
pEVSL_ParvecFree(&vrinit);
288+
pEVSL_ParvecFree(&viinit);
289+
}
290+
291+
214292
/** @brief Fortran interface for find_pol
215293
* @param[in] xintv Interval of interest
216294
* @param[in] thresh_int Interior threshold

INC/pevsl.h

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ void pEVSL_SpslicerLan(double* xi, double* yi, int n_int, int npts, double* sli)
2828
int pEVSL_LanTrbounds(pevsl_Data *pevsl, int lanm, int maxit, double tol,
2929
pevsl_Parvec *vinit, int bndtype, double *lammin,
3030
double *lammax, FILE *fstats);
31+
/* add JS 010219 complex lantrbnd */
32+
int pEVSL_ZLanTrbounds(pevsl_Data *pevsl, int lanm, int maxit, double tol,
33+
pevsl_Parvec *vrinit, pevsl_Parvec *viinit, int bndtype,
34+
double *lammin, double *lammax, FILE *fstats);
3135
/* lspolapprox.c */
3236
void pEVSL_SetupLSPolSqrt(int max_deg, double tol, double lmin, double lmax,
3337
pevsl_Parcsr *B, void **vdata);
@@ -49,6 +53,10 @@ int pEVSL_SetLTSol (pevsl_Data *pevsl_data, SVFunc func, void *data);
4953
int pEVSL_SetStdEig (pevsl_Data *pevsl_data);
5054
int pEVSL_SetGenEig (pevsl_Data *pevsl_data);
5155
int pEVSL_SetSigmaMult(pevsl_Data *pevsl_data, double mult);
56+
/* add JS 01/20/19 complex mat-vec*/
57+
int pEVSL_SetZAMatvec (pevsl_Data *pevsl_data, ZMVFunc func, void *data);
58+
int pEVSL_SetZBMatvec (pevsl_Data *pevsl_data, ZMVFunc func, void *data);
59+
int pEVSL_SetZBSol (pevsl_Data *pevsl_data, ZSVFunc func, void *data);
5260

5361
/* parcsr.c */
5462
int pEVSL_ParcsrCreate(int nrow, int ncol, int *row_starts, int *col_starts,

INC/pevsl_int.h

+9
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ void CGS_DGKS(pevsl_Data *pevsl, int k, int i_max, pevsl_Parvecs *Q, pevsl_Parve
3838

3939
void CGS_DGKS2(pevsl_Data *pevsl, int k, int i_max, pevsl_Parvecs *V, pevsl_Parvecs *Z, pevsl_Parvec *v, double *w);
4040

41+
void CGS_ZDGKS(pevsl_Data *pevsl, int k, int i_max,
42+
pevsl_Parvecs *Qr, pevsl_Parvecs *Qi,
43+
pevsl_Parvec *vr, pevsl_Parvec *vi,
44+
double *nrmv, double *wr, double *wi);
45+
46+
void CGS_ZDGKS2(pevsl_Data *pevsl, int k, int i_max,
47+
pevsl_Parvecs *Vr, pevsl_Parvecs *Vi, pevsl_Parvecs *Zr, pevsl_Parvecs *Zi,
48+
pevsl_Parvec *vr, pevsl_Parvec *vi, double *wr, double *wi);
49+
4150
/* parcsrmv.c */
4251
void pEVSL_ParcsrMatvec0(double *x, double *y, void *data);
4352

SRC/pevsl.c

+59
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ int pEVSL_SetProbSizes(pevsl_Data *pevsl_data, int N, int n, int nfirst) {
138138
return 0;
139139
}
140140

141+
142+
141143
/**
142144
* @brief Set the user-input matvec routine and the associated data for A.
143145
* Save them in pevsl_data
@@ -192,6 +194,63 @@ int pEVSL_SetBSol(pevsl_Data *pevsl_data, SVFunc func, void *data) {
192194
return 0;
193195
}
194196

197+
198+
/** JS 01/20/19 for complex Hermitian cases
199+
* @brief Set the user-input matvec routine and the associated data for A.
200+
* Save them in pevsl_data
201+
* @param[in, out] pevsl_data pEVSL data struct
202+
* @param[in] func Matrix vector function
203+
* @param[in] data data required for matvec
204+
* */
205+
int pEVSL_SetZAMatvec(pevsl_Data *pevsl_data, ZMVFunc func, void *data) {
206+
207+
if (!pevsl_data->ZAmv) {
208+
PEVSL_CALLOC(pevsl_data->ZAmv, 1, pevsl_ZMatvec);
209+
}
210+
pevsl_data->ZAmv->func = func;
211+
pevsl_data->ZAmv->data = data;
212+
213+
return 0;
214+
}
215+
216+
217+
/**
218+
* @brief Set the user-input matvec routine and the associated data for B.
219+
* Save them in pevsl_data
220+
* @param[in, out] pevsl_data pEVSL data struct
221+
* @param[in] func Matrix vector function
222+
* @param[in] data data required for matvec
223+
* */
224+
int pEVSL_SetZBMatvec(pevsl_Data *pevsl_data, ZMVFunc func, void *data) {
225+
226+
if (!pevsl_data->ZBmv) {
227+
PEVSL_CALLOC(pevsl_data->ZBmv, 1, pevsl_ZMatvec);
228+
}
229+
pevsl_data->ZBmv->func = func;
230+
pevsl_data->ZBmv->data = data;
231+
232+
return 0;
233+
}
234+
235+
236+
/**
237+
* @brief Set the solve routine and the associated data for B
238+
* @param[in, out] pevsl_data pEVSL data structure
239+
* @param[in] func Function for BSol
240+
* @param[in] data Data required for func
241+
* */
242+
int pEVSL_SetZBSol(pevsl_Data *pevsl_data, ZSVFunc func, void *data) {
243+
244+
if (!pevsl_data->ZBsol) {
245+
PEVSL_CALLOC(pevsl_data->ZBsol, 1, pevsl_ZBsol);
246+
}
247+
pevsl_data->ZBsol->func = func;
248+
pevsl_data->ZBsol->data = data;
249+
250+
return 0;
251+
}
252+
253+
195254
/**
196255
* @brief Set the solve routine and the associated data for LT
197256
* @param[in, out] pevsl_data pEVSL data structure

0 commit comments

Comments
 (0)