00001 #include "shrinkmat.h"
00002 #include "creep.h"
00003 #include "creep_b3.h"
00004 #include "creep_rspec.h"
00005 #include "creepb.h"
00006 #include "creep_dpl.h"
00007 #include "matrix.h"
00008 #include "vector.h"
00009 #include "elastisomat.h"
00010 #include "global.h"
00011 #include "intpoints.h"
00012 #include "vecttens.h"
00013 #include "galias.h"
00014 #include <math.h>
00015
00016
00017
00018
00019
00020
00021
00022
00023 shrinkmat::shrinkmat (void)
00024 {
00025 tshr = shr_measured;
00026 thumdef = no;
00027 }
00028
00029
00030
00031
00032
00033
00034
00035
00036 shrinkmat::~shrinkmat (void)
00037 {
00038
00039 }
00040
00041
00042
00043
00044
00045
00046
00047
00048 void shrinkmat::read (XFILE *in)
00049 {
00050 xfscanf(in, "%m", &tshrlaw_kwdset, &tshr);
00051 switch (tshr)
00052 {
00053 case shr_measured:
00054 shmeas.read(in);
00055 break;
00056 case beta_val:
00057 beta.read(in);
00058 break;
00059 default:
00060 print_err("unknown shrinkage law is required", __FILE__, __LINE__, __func__);
00061 }
00062 xfscanf(in, "%m", &answertype_kwdset, &thumdef);
00063 switch (thumdef)
00064 {
00065 case no:
00066
00067 break;
00068 case yes:
00069 humdef.read(in);
00070 break;
00071 default:
00072 print_err("invalid definition of relative humidity", __FILE__, __LINE__, __func__);
00073 }
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083 void shrinkmat::print (FILE *out)
00084 {
00085 fprintf(out, "%d\n", tshr);
00086 switch (tshr)
00087 {
00088 case shr_measured:
00089 shmeas.print(out);
00090 break;
00091 case beta_val:
00092 beta.print(out);
00093 break;
00094 default:
00095 print_err("unknown shrinkage law is required", __FILE__, __LINE__, __func__);
00096 }
00097 fprintf(out, "%d\n", thumdef);
00098 switch (thumdef)
00099 {
00100 case no:
00101
00102 break;
00103 case yes:
00104 humdef.print(out);
00105 break;
00106 default:
00107 print_err("invalid definition of relative humidity", __FILE__, __LINE__, __func__);
00108 }
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 void shrinkmat::matstiff (matrix &d,long ipp,long im, long ido)
00124 {
00125 long ncomp = Mm->ip[ipp].ncompstr;
00126 Mm->matstiff(d, ipp, im+1, ido+1+2*ncomp);
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void shrinkmat::nlstressesincr (long ipp, long im, long ido)
00142 {
00143 long i;
00144 long ncomp = Mm->ip[ipp].ncompstr;
00145 long ncompo = 1+2*ncomp;
00146 double hum, hum_prev, deps_sh, dshdh;
00147 vector sig(ncomp), eps_sh(ncomp);
00148 matrix epstens(3,3), d(ncomp, ncomp);
00149
00150
00151 Mm->computenlstressesincr (ipp, im+1, ido+ncompo);
00152
00153
00154
00155
00156
00157 if (thumdef == no)
00158 hum=Mm->givenonmechq(vol_moist_cont, ipp);
00159 else
00160 hum = humdef.getval(Mp->time);
00161
00162 hum_prev = Mm->ip[ipp].eqother[ido];
00163
00164
00165
00166
00167
00168
00169
00170 dshdh = 0.0;
00171 switch (tshr)
00172 {
00173 case shr_measured:
00174 dshdh = shmeas.getderiv(hum);
00175 break;
00176 case beta_val:
00177 dshdh = beta.getval(hum);
00178 break;
00179 default:
00180 print_err("unknown shrinkage law is required", __FILE__, __LINE__, __func__);
00181 }
00182 deps_sh = dshdh*(hum-hum_prev);
00183
00184 epstens[0][0]=deps_sh;
00185 epstens[1][1]=deps_sh;
00186 epstens[2][2]=deps_sh;
00187
00188
00189 tensor_vector (eps_sh,epstens,Mm->ip[ipp].ssst,strain);
00190
00191
00192 Mm->elmatstiff(d, ipp);
00193 mxv(d, eps_sh, sig);
00194
00195 for (i=0;i<ncomp;i++)
00196 Mm->ip[ipp].eqother[ido+1+ncomp+i] = sig[i];
00197
00198
00199 Mm->ip[ipp].other[ido] = hum;
00200
00201
00202 for (i=0;i<ncomp;i++)
00203 Mm->ip[ipp].other[ido+1+i] = Mm->ip[ipp].eqother[ido+1+i] + eps_sh[i];
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 void shrinkmat::nlstresses (long ipp, long im, long ido)
00219 {
00220 long i;
00221 long ncomp = Mm->ip[ipp].ncompstr;
00222 long ncompo;
00223 double nu;
00224 vector epsback(ncomp);
00225 vector eps_sh(ncomp);
00226
00227 if (Mm->ip[ipp].ssst == planestress)
00228 {
00229 nu = Mm->give_actual_nu(ipp);
00230 Mm->ip[ipp].strain[3] = -nu / (1.0 - nu) * (Mm->ip[ipp].strain[0]+Mm->ip[ipp].strain[1]);
00231 }
00232
00233
00234 for (i=0;i<ncomp;i++)
00235 epsback[i] = Mm->ip[ipp].strain[i];
00236
00237
00238
00239 for (i=0;i<ncomp;i++){
00240 eps_sh[i] = Mm->ip[ipp].other[ido+1+i];
00241 }
00242
00243
00244 for (i=0;i<ncomp;i++)
00245 Mm->ip[ipp].strain[i] -= eps_sh[i];
00246
00247
00248 ncompo = 1+2*ncomp;
00249
00250 Mm->computenlstresses(ipp, im+1, ido+ncompo);
00251
00252
00253 for (i=0;i<ncomp;i++)
00254 Mm->ip[ipp].strain[i] = epsback[i];
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 void shrinkmat::nonloc_nlstresses (long ipp, long im, long ido)
00270 {
00271 long i;
00272 long ncomp = Mm->ip[ipp].ncompstr;
00273 long ncompo;
00274 double nu;
00275 vector epsback(ncomp);
00276 vector eps_sh(ncomp);
00277
00278 if (Mm->ip[ipp].ssst == planestress)
00279 {
00280 nu = Mm->give_actual_nu(ipp);
00281 Mm->ip[ipp].strain[3] = -nu / (1.0 - nu) * (Mm->ip[ipp].strain[0]+Mm->ip[ipp].strain[1]);
00282 }
00283
00284
00285 for (i=0;i<ncomp;i++)
00286 epsback[i] = Mm->ip[ipp].strain[i];
00287
00288
00289
00290 for (i=0;i<ncomp;i++){
00291 eps_sh[i] = Mm->ip[ipp].other[ido+1+i];
00292 }
00293
00294
00295 for (i=0;i<ncomp;i++)
00296 Mm->ip[ipp].strain[i] -= eps_sh[i];
00297
00298
00299 ncompo = 1+2*ncomp;
00300
00301 Mm->compnonloc_nlstresses(ipp, im+1, ido+ncompo);
00302
00303
00304 for (i=0;i<ncomp;i++)
00305 Mm->ip[ipp].strain[i] = epsback[i];
00306 }
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 void shrinkmat::updateval (long ipp, long im, long ido)
00321 {
00322 long i;
00323
00324 long ncomp = Mm->ip[ipp].ncompstr;
00325
00326 Mm->ip[ipp].eqother[ido] = Mm->ip[ipp].other[ido];
00327
00328
00329 for (i=0;i<ncomp;i++)
00330 Mm->ip[ipp].eqother[ido+1+i] = Mm->ip[ipp].other[ido+1+i];
00331
00332 Mm->updateipvalmat (ipp,im+1,ido+1+2*ncomp);
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 void shrinkmat::initvalues (long lcid, long ipp, long im, long ido)
00349 {
00350 long ncomp = Mm->ip[ipp].ncompstr;
00351 double hum;
00352
00353
00354 if (thumdef == no)
00355 hum=Mm->givenonmechq(vol_moist_cont, ipp);
00356 else
00357 hum = humdef.getval(Mp->time);
00358
00359 Mm->ip[ipp].eqother[ido] = hum;
00360
00361 Mm->initvalues (lcid,ipp,im+1,ido+1+2*ncomp);
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378 void shrinkmat::givestressincr (long lcid, long ipp, long im, long ido, long fi,vector &sig)
00379 {
00380 long ncomp = Mm->ip[ipp].ncompstr;
00381 long i, j;
00382
00383
00384 Mm->givestressincr(lcid, ipp, im+1, ido+1+2*ncomp, fi, sig);
00385
00386
00387 for (i=fi,j=0; j<sig.n; i++,j++)
00388 sig[j] += Mm->ip[ipp].eqother[ido+1+ncomp+i];
00389 }
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 void shrinkmat::giveirrstrains(long ipp, long im, long ido, vector &epsirr)
00404 {
00405 long ncomp = Mm->ip[ipp].ncompstr;
00406 long i;
00407
00408
00409 Mm->giveirrstrains(ipp, im+1, ido+1+2*ncomp, epsirr);
00410
00411
00412 for (i=0;i<ncomp;i++)
00413 epsirr[i] += Mm->ip[ipp].eqother[ido+1+i];
00414 }
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427 double shrinkmat::give_actual_ft (long ipp, long im, long ido)
00428 {
00429 double ft;
00430 long ncomp = Mm->ip[ipp].ncompstr;
00431
00432 ft = Mm->give_actual_ft(ipp, im+1, ido+1+2*ncomp);
00433
00434 return ft;
00435 }
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448 double shrinkmat::give_actual_fc (long ipp, long im, long ido)
00449 {
00450 double fc;
00451 long ncomp = Mm->ip[ipp].ncompstr;
00452
00453
00454 fc = Mm->give_actual_fc(ipp, im+1, ido+1+2*ncomp);
00455
00456 return fc;
00457 }
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470 void shrinkmat::give_reqnmq(long *anmq)
00471 {
00472 if (thumdef == no)
00473 anmq[vol_moist_cont-1] = 1;
00474 }