00001 #include <string.h>
00002 #include "lhsrhs.h"
00003 #include "global.h"
00004 #include "mechprint.h"
00005 #include "gtopology.h"
00006 #include "dloadcase.h"
00007 #include "inicd.h"
00008
00009
00010
00011
00012
00013
00014
00015 lhsrhs::lhsrhs ()
00016 {
00017
00018 ndof=Ndofm;
00019
00020 nlc=Mb->nlc;
00021
00022
00023 lhs=NULL;
00024
00025 tdlhs=NULL;
00026
00027 stdlhs=NULL;
00028
00029 rhs=NULL;
00030
00031 w=NULL;
00032 }
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 lhsrhs::~lhsrhs ()
00043 {
00044 delete [] lhs;
00045 delete [] tdlhs;
00046 delete [] stdlhs;
00047 delete [] rhs;
00048 delete [] w;
00049 }
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 void lhsrhs::alloc ()
00061 {
00062 switch (Mp->tprob){
00063 case linear_statics:{
00064 lhs = new double [nlc*ndof];
00065 memset (lhs,0,(nlc*ndof)*sizeof(double));
00066 rhs = new double [nlc*ndof];
00067 memset (rhs,0,(nlc*ndof)*sizeof(double));
00068 break;
00069 }
00070 case eigen_dynamics:{
00071 lhs = new double [Mp->eigsol.nev*ndof];
00072 memset (lhs,0,(Mp->eigsol.nev*ndof)*sizeof(double));
00073
00074 switch (Mp->eigsol.teigsol){
00075 case inv_iteration:{
00076 w = new double [1];
00077 break;
00078 }
00079 case subspace_it_jacobi:{
00080 w = new double [Mp->eigsol.nev];
00081 break;
00082 }
00083 case subspace_it_gsortho:{
00084 w = new double [Mp->eigsol.nev];
00085 break;
00086 }
00087 case shifted_subspace_it_gsortho:{
00088 w = new double [Mp->eigsol.nev];
00089 break;
00090 }
00091 default:{
00092 print_err("unknown eigenvalue solver is required", __FILE__, __LINE__, __func__);
00093 }
00094 }
00095
00096 break;
00097 }
00098 case forced_dynamics:{
00099 if (Mp->tforvib==modal_analysis){
00100 lhs = new double [ndof+Mp->eigsol.nev*ndof];
00101 memset (lhs,0,(ndof+Mp->eigsol.nev*ndof)*sizeof(double));
00102
00103 switch (Mp->eigsol.teigsol){
00104 case inv_iteration:{
00105 w = new double [1];
00106 break;
00107 }
00108 case subspace_it_jacobi:{
00109 w = new double [Mp->eigsol.nev];
00110 break;
00111 }
00112 case subspace_it_gsortho:{
00113 w = new double [Mp->eigsol.nev];
00114 break;
00115 }
00116 case shifted_subspace_it_gsortho:{
00117 w = new double [Mp->eigsol.nev];
00118 break;
00119 }
00120 default:{
00121 print_err("unknown eigenvalue solver is required", __FILE__, __LINE__, __func__);
00122 }
00123 }
00124
00125 }
00126 else{
00127 lhs = new double [nlc*ndof];
00128 memset (lhs,0,(nlc*ndof)*sizeof(double));
00129 tdlhs = new double [nlc*ndof];
00130 memset (tdlhs,0,(nlc*ndof)*sizeof(double));
00131 stdlhs = new double [nlc*ndof];
00132 memset (stdlhs,0,(nlc*ndof)*sizeof(double));
00133 rhs = new double [nlc*2*ndof];
00134 memset (rhs,0,(nlc*2*ndof)*sizeof(double));
00135 }
00136 break;
00137 }
00138 case mat_nonlinear_statics:{
00139 lhs = new double [nlc*ndof];
00140 memset (lhs,0,(nlc*ndof)*sizeof(double));
00141 rhs = new double [nlc*2*ndof];
00142 memset (rhs,0,(nlc*2*ndof)*sizeof(double));
00143 break;
00144 }
00145 case geom_nonlinear_statics:{
00146 lhs = new double [nlc*ndof];
00147 memset (lhs,0,(nlc*ndof)*sizeof(double));
00148 rhs = new double [nlc*2*ndof];
00149 memset (rhs,0,(nlc*2*ndof)*sizeof(double));
00150 break;
00151 }
00152 case mech_timedependent_prob:{
00153 lhs = new double [nlc*ndof];
00154 memset (lhs,0,(nlc*ndof)*sizeof(double));
00155 rhs = new double [nlc*ndof];
00156 memset (rhs,0,(nlc*ndof)*sizeof(double));
00157 break;
00158 }
00159 case growing_mech_structure:{
00160 lhs = new double [ndof];
00161 memset (lhs,0,(ndof)*sizeof(double));
00162 rhs = new double [ndof];
00163 memset (rhs,0,(ndof)*sizeof(double));
00164 break;
00165 }
00166 case earth_pressure:{
00167 lhs = new double [nlc*ndof];
00168 memset (lhs,0,(nlc*ndof)*sizeof(double));
00169 rhs = new double [nlc*2*ndof];
00170 memset (rhs,0,(nlc*2*ndof)*sizeof(double));
00171 break;
00172 }
00173 case layered_linear_statics:{ lhs = new double [nlc*ndof];
00174 memset (lhs,0,(nlc*ndof)*sizeof(double));
00175 rhs = new double [nlc*ndof];
00176 memset (rhs,0,(nlc*ndof)*sizeof(double));
00177 break;
00178 }
00179 case lin_floating_subdomain:{
00180 lhs = new double [nlc*ndof];
00181 memset (lhs,0,(nlc*ndof)*sizeof(double));
00182 rhs = new double [nlc*ndof];
00183 memset (rhs,0,(nlc*ndof)*sizeof(double));
00184 break;
00185 }
00186 case nonlin_floating_subdomain:{
00187 lhs = new double [nlc*ndof];
00188 memset (lhs,0,(nlc*ndof)*sizeof(double));
00189 rhs = new double [2*nlc*ndof];
00190 memset (rhs,0,(2*nlc*ndof)*sizeof(double));
00191 break;
00192 }
00193 case hemivar_inequal:{
00194 lhs = new double [nlc*ndof];
00195 memset (lhs,0,(nlc*ndof)*sizeof(double));
00196 rhs = new double [nlc*ndof];
00197 memset (rhs,0,(nlc*ndof)*sizeof(double));
00198 break;
00199 }
00200 case load_balancing:{
00201 lhs = new double [nlc*ndof];
00202 memset (lhs,0,(nlc*ndof)*sizeof(double));
00203 rhs = new double [nlc*ndof];
00204 memset (rhs,0,(nlc*ndof)*sizeof(double));
00205 break;
00206 }
00207
00208 default:{
00209 print_err("unknown problem type is required", __FILE__, __LINE__, __func__);
00210 }
00211 }
00212
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 double *lhsrhs::give_lhs (long i)
00228 {
00229 return (lhs+i*ndof);
00230 }
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 double *lhsrhs::give_tdlhs (long i)
00245 {
00246 return (tdlhs+i*ndof);
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 double *lhsrhs::give_stdlhs (long i)
00262 {
00263 return (stdlhs+i*ndof);
00264 }
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 double *lhsrhs::give_rhs (long i)
00279 {
00280 return (rhs+i*ndof);
00281 }
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 void lhsrhs::initcond (XFILE *in)
00318 {
00319 long i,j,k,l,ndofn;
00320 double v;
00321
00322 if (Mp->tprob == forced_dynamics && Mb->dlc[0].tdl!=responsespectrum){
00323 for (i=0;i<Mt->nn;i++){
00324 ndofn=Mt->give_ndofn (i);
00325 xfscanf (in,"%ld",&l);
00326
00327
00328 for (j=0;j<ndofn;j++){
00329 k=Gtm->give_dof (l-1,j) - 1;
00330 xfscanf (in,"%lf",&v);
00331 if (k>-1) lhs[k]=v;
00332 }
00333
00334
00335 for (j=0;j<ndofn;j++){
00336 k=Gtm->give_dof (l-1,j) - 1;
00337 xfscanf (in,"%lf",&v);
00338 if (k>-1) tdlhs[k]=v;
00339 }
00340
00341 }
00342 }
00343 if ((Mp->tprob == mat_nonlinear_statics) && Mb->nico)
00344 {
00345 for (i=0;i<Mt->nn;i++)
00346 {
00347 ndofn=Mt->give_ndofn (i);
00348
00349 for (j=0;j<ndofn;j++)
00350 {
00351 k=Gtm->give_dof (i,j) - 1;
00352 if ((k>-1) && (Mb->ico[i].type & inidisp))
00353 lhs[k]=Mb->ico[i].val[j];
00354 }
00355 }
00356 }
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378 }
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 void lhsrhs::clean_lhs ()
00390 {
00391 long i;
00392 for (i=0;i<ndof;i++){
00393 lhs[i]=0.0;
00394 }
00395 }
00396