Skip to content

Commit ec15fde

Browse files
committed
add a function to adjust the sigma in LanDOS
1 parent 35b59c8 commit ec15fde

File tree

5 files changed

+30
-2
lines changed

5 files changed

+30
-2
lines changed

FORTRAN/pevsl_f90.c

+6
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,13 @@ void PEVSL_FORT(pevsl_landos_ecnt)(uintptr_t *pevslf90, int *nvec, int *msteps,
434434
}
435435

436436

437+
void PEVSL_FORT(pevsl_set_sigmamult)(uintptr_t *pevslf90, double *mult) {
437438

439+
/* cast pointer */
440+
pevsl_Data *pevsl = (pevsl_Data *) (*pevslf90);
441+
442+
pEVSL_SetSigmaMult(pevsl, *mult);
443+
}
438444

439445

440446

INC/pevsl.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ int pEVSL_SetBSol (pevsl_Data *pevsl_data, SVFunc func, void *data);
4848
int pEVSL_SetLTSol (pevsl_Data *pevsl_data, SVFunc func, void *data);
4949
int pEVSL_SetStdEig (pevsl_Data *pevsl_data);
5050
int pEVSL_SetGenEig (pevsl_Data *pevsl_data);
51+
int pEVSL_SetSigmaMult(pevsl_Data *pevsl_data, double mult);
5152

5253
/* parcsr.c */
5354
int pEVSL_ParcsrCreate(int nrow, int ncol, int *row_starts, int *col_starts,

INC/pevsl_struct.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,8 @@ typedef struct _pevsl_Data {
305305
hold the points of last computed results */
306306
double *eval_computed;
307307
pevsl_Parvecs *evec_computed;
308-
308+
309+
double sigma_mult; /** multiplier for sigma in LanDOS*/
309310
} pevsl_Data;
310311

311312
#endif

SRC/landos.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ int pEVSL_LanDosG(pevsl_Data *pevsl, int nvec, int msteps, int npts,
102102
const double kappa = 1.25;
103103
const int M = PEVSL_MIN(msteps, 30);
104104
const double H = (lM - lm) / (M - 1);
105-
const double sigma = H / sqrt(8 * log(kappa));
105+
const double sigma = H / sqrt(8 * log(kappa)) * pevsl->sigma_mult;
106106
const double sigma2 = 2 * sigma * sigma;
107107
/*-------------------- If gaussian small than tol ignore point. */
108108
const double tol = 1e-08;

SRC/pevsl.c

+20
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ int pEVSL_Start(MPI_Comm comm, pevsl_Data **data) {
2020
pevsl_data->Bsol = NULL;
2121
pevsl_data->LTsol = NULL;
2222

23+
pevsl_data->sigma_mult = 1.0;
24+
2325
/* Use MPI_COMM_WORLD rank as rand seed,
2426
* so each proc will have a different seed,
2527
* cf. parvec.c: pEVSL_ParvecRand */
@@ -41,6 +43,7 @@ int pEVSL_Start(MPI_Comm comm, pevsl_Data **data) {
4143
*
4244
* */
4345
int pEVSL_Finish(pevsl_Data *pevsl_data) {
46+
4447
if (pevsl_data->Amv) {
4548
PEVSL_FREE(pevsl_data->Amv);
4649
}
@@ -67,6 +70,7 @@ int pEVSL_Finish(pevsl_Data *pevsl_data) {
6770
*
6871
* */
6972
int pEVSL_SetAParcsr(pevsl_Data *pevsl_data, pevsl_Parcsr *A) {
73+
7074
/* set N */
7175
pevsl_data->N = A->ncol_global;
7276
/* set n */
@@ -88,6 +92,7 @@ int pEVSL_SetAParcsr(pevsl_Data *pevsl_data, pevsl_Parcsr *A) {
8892
*
8993
* */
9094
int pEVSL_SetBParcsr(pevsl_Data *pevsl_data, pevsl_Parcsr *B) {
95+
9196
/* set N */
9297
pevsl_data->N = B->ncol_global;
9398
/* set n */
@@ -112,6 +117,7 @@ int pEVSL_SetBParcsr(pevsl_Data *pevsl_data, pevsl_Parcsr *B) {
112117
* @warning if nfirst < 0, nfirst = PEVSL_NOT_DEFINED
113118
* */
114119
int pEVSL_SetProbSizes(pevsl_Data *pevsl_data, int N, int n, int nfirst) {
120+
115121
pevsl_data->N = N;
116122
pevsl_data->n = n;
117123
nfirst = nfirst < 0 ? PEVSL_NOT_DEFINED : nfirst;
@@ -125,6 +131,7 @@ int pEVSL_SetProbSizes(pevsl_Data *pevsl_data, int N, int n, int nfirst) {
125131
* Save them in pevsl_data
126132
* */
127133
int pEVSL_SetAMatvec(pevsl_Data *pevsl_data, MVFunc func, void *data) {
134+
128135
if (!pevsl_data->Amv) {
129136
PEVSL_CALLOC(pevsl_data->Amv, 1, pevsl_Matvec);
130137
}
@@ -140,6 +147,7 @@ int pEVSL_SetAMatvec(pevsl_Data *pevsl_data, MVFunc func, void *data) {
140147
* Save them in pevsl_data
141148
* */
142149
int pEVSL_SetBMatvec(pevsl_Data *pevsl_data, MVFunc func, void *data) {
150+
143151
if (!pevsl_data->Bmv) {
144152
PEVSL_CALLOC(pevsl_data->Bmv, 1, pevsl_Matvec);
145153
}
@@ -153,6 +161,7 @@ int pEVSL_SetBMatvec(pevsl_Data *pevsl_data, MVFunc func, void *data) {
153161
* @brief Set the solve routine and the associated data for B
154162
* */
155163
int pEVSL_SetBSol(pevsl_Data *pevsl_data, SVFunc func, void *data) {
164+
156165
if (!pevsl_data->Bsol) {
157166
PEVSL_CALLOC(pevsl_data->Bsol, 1, pevsl_Bsol);
158167
}
@@ -166,6 +175,7 @@ int pEVSL_SetBSol(pevsl_Data *pevsl_data, SVFunc func, void *data) {
166175
* @brief Set the solve routine and the associated data for LT
167176
* */
168177
int pEVSL_SetLTSol(pevsl_Data *pevsl_data, SVFunc func, void *data) {
178+
169179
if (!pevsl_data->LTsol) {
170180
PEVSL_CALLOC(pevsl_data->LTsol, 1, pevsl_Ltsol);
171181
}
@@ -180,6 +190,7 @@ int pEVSL_SetLTSol(pevsl_Data *pevsl_data, SVFunc func, void *data) {
180190
*
181191
* */
182192
int pEVSL_SetStdEig(pevsl_Data *pevsl_data) {
193+
183194
pevsl_data->ifGenEv = 0;
184195

185196
return 0;
@@ -190,8 +201,17 @@ int pEVSL_SetStdEig(pevsl_Data *pevsl_data) {
190201
*
191202
* */
192203
int pEVSL_SetGenEig(pevsl_Data *pevsl_data) {
204+
193205
pevsl_data->ifGenEv = 1;
194206

195207
return 0;
196208
}
197209

210+
211+
int pEVSL_SetSigmaMult(pevsl_Data *pevsl_data, double mult) {
212+
213+
pevsl_data->sigma_mult = mult;
214+
215+
return 0;
216+
}
217+

0 commit comments

Comments
 (0)