00001 #include "smaggreg.h"
00002
00003 smaggreg::smaggreg ()
00004 {
00005
00006 nu=0;
00007
00008 na=0;
00009
00010 dimker=0;
00011
00012
00013
00014
00015
00016
00017
00018 nuagr=NULL;
00019
00020 uagr=NULL;
00021
00022
00023 lm=NULL;
00024 }
00025
00026 smaggreg::~smaggreg ()
00027 {
00028
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 void smaggreg::localization_matrices (gtopology >)
00098 {
00099 long i,j,k,l,ndofn,nid,*aux;
00100
00101
00102 if (lm!=NULL){
00103 delete [] lm;
00104 }
00105 lm = new locmatrix [na];
00106
00107
00108
00109
00110 aggreg.assemble_lnnagr ();
00111
00112
00113 aggreg.assemble_lnagr ();
00114
00115
00116
00117
00118
00119 if (nuagr!=NULL)
00120 delete [] nuagr;
00121 nuagr = new long [na];
00122
00123
00124 for (i=0;i<na;i++){
00125 nuagr[i]=0;
00126
00127 for (j=0;j<aggreg.lnnagr[i];j++){
00128 nid = aggreg.lnagr[i][j];
00129 ndofn = gt.give_ndofn (nid);
00130 for (k=0;k<ndofn;k++){
00131 l=gt.give_dof (nid,k);
00132 if (l>0)
00133 nuagr[i]++;
00134 }
00135 }
00136 }
00137
00138
00139
00140
00141 if (uagr!=NULL){
00142 for (i=0;i<na;i++){
00143 delete [] uagr[i];
00144 }
00145 delete [] uagr;
00146 }
00147
00148 uagr = new long* [na];
00149 for (i=0;i<na;i++){
00150 uagr[i] = new long [nuagr[i]];
00151 }
00152
00153
00154 for (i=0;i<na;i++){
00155 nuagr[i]=0;
00156
00157 for (j=0;j<aggreg.lnnagr[i];j++){
00158 nid = aggreg.lnagr[i][j];
00159 ndofn = gt.give_ndofn (nid);
00160 for (k=0;k<ndofn;k++){
00161 l=gt.give_dof (nid,k);
00162 if (l>0){
00163 uagr[i][nuagr[i]]=l-1;
00164 nuagr[i]++;
00165 }
00166 }
00167 }
00168 }
00169
00170
00171
00172
00173
00174 for (i=0;i<na;i++){
00175
00176
00177 lm[i].initiate_var (nuagr[i],nu);
00178 }
00179
00180
00181 aux = new long [nu];
00182 for (i=0;i<nu;i++){
00183 aux[i]=1;
00184 }
00185 for (i=0;i<na;i++){
00186
00187 lm[i].initiate_nncr (aux);
00188
00189 lm[i].addresses ();
00190
00191 lm[i].initiate_ci (uagr[i]);
00192 }
00193 delete [] aux;
00194
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204 void smaggreg::local_aggregated_matrices (gmatrix &sm)
00205 {
00206 long i;
00207
00208 gm = new gmatrix [na];
00209
00210 for (i=0;i<na;i++){
00211 lm[i].lmxmxlmt01 (sm,gm[i]);
00212 }
00213
00214 }
00215
00216
00217
00218
00219
00220
00221
00222 void smaggreg::decompose_aggreg_matrix (gmatrix &sm)
00223 {
00224 sm.decompose_matrix ();
00225 }
00226
00227
00228
00229
00230
00231
00232 void smaggreg::smoothed_prolong ()
00233 {
00234 long i,j,k,*aux,*cind;
00235 double *val;
00236
00237
00238 sp.initiate_var (na*dimker,nu);
00239
00240 aux = new long [na*dimker];
00241 aggreg.assemble_lnuagr_sp (aux);
00242
00243
00244
00245
00246 k=0;
00247 for (i=0;i<na;i++){
00248 for (j=0;j<dimker;j++){
00249 cind=new long [aux[k]];
00250 val=new double [aux[k]];
00251
00252
00253
00254
00255
00256 sp.initiate_ci (k,cind);
00257
00258 sp.initiate_lm (k,val);
00259
00260 delete [] cind;
00261 delete [] val;
00262 k++;
00263 }
00264 }
00265 }