00001 #include <string.h>
00002 #include "global.h"
00003 #include "eigvalsol.h"
00004
00005 eigvalsol::eigvalsol (void)
00006 {
00007
00008 teigsol = no_eigsolver;
00009
00010 neigv=0;
00011
00012 nev=0;
00013
00014 nies=0;
00015
00016 anies=0;
00017
00018 erres=0.0;
00019
00020 aerres=0.0;
00021
00022 nijmr=0;
00023
00024 njacthr=0;
00025
00026 jacthr=NULL;
00027
00028 shift=0.0;
00029 }
00030
00031 eigvalsol::~eigvalsol (void)
00032 {
00033 }
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 void eigvalsol::read (XFILE *in)
00044 {
00045 long i;
00046
00047 xfscanf (in,"%k%m","type_of_eig_solver",&eigensolver_kwdset,(int*)&teigsol);
00048
00049 switch (teigsol){
00050 case inv_iteration:{
00051 if (Mespr==1) fprintf (stdout,"\n eigenvalue problem will be solved by inverse iteration method");
00052
00053
00054 nev=1; neigv=1;
00055
00056 xfscanf (in,"%ld %lf",&nies,&erres);
00057 break;
00058 }
00059 case subspace_it_jacobi:{
00060 if (Mespr==1){
00061 fprintf (stdout,"\n eigenvalue problem will be solved by subspace");
00062 fprintf (stdout,"\n iteration method with Jacobi method of rotations");
00063 }
00064
00065
00066
00067
00068
00069 xfscanf (in,"%ld %ld %ld %lf",&neigv,&nev,&nies,&erres);
00070 if (neigv>nev){
00071 print_err("wrong number of vectors is used in subspace iteration method",__FILE__,__LINE__,__func__);
00072 }
00073 xfscanf (in,"%ld %ld",&nijmr,&njacthr);
00074 jacthr = new double [njacthr];
00075 for (i=0;i<njacthr;i++){
00076 xfscanf (in,"%lf",jacthr+i);
00077 }
00078
00079 break;
00080 }
00081 case subspace_it_gsortho:{
00082 if (Mespr==1){
00083 fprintf (stdout,"\n eigenvalue problem will be solved by subspace");
00084 fprintf (stdout,"\n iteration method with Gram-Schmidt orthonormalization technique");
00085 }
00086
00087
00088
00089
00090
00091 xfscanf (in,"%ld %ld %ld %le",&neigv,&nev,&nies,&erres);
00092 if (neigv>nev){
00093 print_err("wrong number of vectors is used in subspace iteration method",__FILE__,__LINE__,__func__);
00094 print_err("nev must be greater or equal to neigv",__FILE__,__LINE__,__func__);
00095 }
00096
00097 break;
00098 }
00099 case shifted_subspace_it_gsortho:{
00100 if (Mespr==1){
00101 fprintf (stdout,"\n eigenvalue problem will be solved by subspace");
00102 fprintf (stdout,"\n iteration method with Gram-Schmidt orthonormalization technique");
00103 }
00104
00105
00106
00107
00108
00109
00110 xfscanf (in,"%ld %ld %ld %le %le",&neigv,&nev,&nies,&erres,&shift);
00111 if (neigv>nev){
00112 print_err("wrong number of vectors is used in subspace iteration method",__FILE__,__LINE__,__func__);
00113 print_err("nev must be greater or equal to neigv",__FILE__,__LINE__,__func__);
00114 }
00115 break;
00116 }
00117 default:{
00118 print_err("wrong type of eigenvalue problem solver is required",__FILE__,__LINE__,__func__);
00119 }
00120 }
00121
00122 }
00123
00124
00125
00126
00127
00128
00129
00130
00131 void eigvalsol::print (FILE *out)
00132 {
00133 long i;
00134
00135 fprintf (out,"%d\n",(int)teigsol);
00136
00137 switch (teigsol){
00138 case inv_iteration:{
00139 fprintf (out, "%ld %e", nies, erres);
00140 break;
00141 }
00142 case subspace_it_jacobi:{
00143 fprintf (out, "%ld %ld %ld %e", neigv, nev, nies, erres);
00144 fprintf (out," %ld %ld\n",nijmr,njacthr);
00145 for (i=0;i<njacthr;i++){
00146 fprintf (out," %e",jacthr[i]);
00147 }
00148 break;
00149 }
00150 case subspace_it_gsortho:{
00151 fprintf (out, "%ld %ld %ld %e", neigv, nev, nies, erres);
00152 break;
00153 }
00154 case shifted_subspace_it_gsortho:{
00155 fprintf (out, "%ld %ld %ld %e %e", neigv, nev, nies, erres, shift);
00156 break;
00157 } default:{
00158 print_err("wrong type of eigenvalue problem solver is required",__FILE__,__LINE__,__func__);
00159 }
00160 }
00161
00162 fprintf (out,"\n");
00163
00164 }
00165